Снова о паролях

Джон Торренс (John Torrance)

Программа принимает пароль и сравнивает его с тем паролем, который был передан в качестве параметра. В зависимости от правильности ввода возвращает .T. или .F.. Необязательные параметры контролируют число неудачных попыток и время ожидания ввода пароля. Если верный пароль не передан в качестве параметра, процедура возвращает .T..

_PassWord - пароль, с которым сравнивается ввод пользователя. Не различает строчных и прописных букв.

_NumTries - число попыток ввода пароля. По умолчанию принимается 1.

_TimeOut - время ожидания ввода пароля. Если пользователь не нажмет клавишу в течение указанного промежутка времени (хотя бы он находился в середине ввода пароля), то что введено на данный момент рассматривается как введенный пароль. По умолчанию программа ожидает неограниченное время. Параметр необязательный.

PROCEDURE password
PARAMETER _password, _numtries, _timeout
PRIVATE m.password, m.retval, I
m.retval = .T.
m.talkstat = SET("TALK")
SET TALK OFF
IF !EMPTY( _password )   
*
* устанавливаем значения умолчания 
* для числа попыток (1) и времени ожидания (0)
   IF EMPTY( _numtries )
      _numtries = 1
   ENDIF
   IF EMPTY( _timeout )
      _timeout = 0
   ENDIF   
*
*  Определяем и активизируем окно
   DEFINE WINDOW lw_pass  AT 0,0  SIZE 4.5,100;
         FONT "MS Sans Serif", 8 ;
         NOFLOAT NOCLOSE NOMINIMIZE ;
         SYSTEM  COLOR RGB(,,,192,192,192)
   MOVE WINDOW lw_pass CENTER
   ACTIVATE WINDOW lw_pass   
*
* Инициализируем счетчик попыток 
* и устанавливаем величину возврата как .F.
   i = 0
   m.retval = .F.   
*
* Крутим цикл до тех пор, пока 
* пользователь не введет верный пароль
* или пока не будет исчерпано число попыток
   DO WHILE !m.retval .AND. i < _numtries      
*
* Выводим приглашение и получаем 
* введенное слово
      @ 1.385,4.4 SAY "Please enter password:";
          FONT "MS Sans Serif", 12  STYLE "BT"
      m.password = passenter( _timeout )      
*
*  Проверяем пароль на правильность
      DO CASE
         CASE TRIM(m.password) == TRIM;
          (UPPER(LEFT(_password+SPACE(32),32)))
            m.retval = .T.
         *-- Это позволяет пользователю выйти
         * (с возвратом .F.), если он
         * нажал ВВОД при пустом пароле
         CASE EMPTY( m.password )
            i = _numtries - 1
         OTHERWISE
            SET BELL TO 220,18
            WAIT WINDOW ;
              NOWAIT " Invalid Password "
            ?? CHR(7)
            SET BELL TO
      ENDCASE
      i = i + 1
   ENDDO
   RELEASE WINDOW lw_pass
ENDIF
SET TALK &talkstat
SET BELL TO
WAIT CLEAR
RETURN m.retval

* Процедура принимает пароль 
* от пользователя без отображения 
* вводимых символов на экране
PROCEDURE passenter
PARAMETER _timeout
PRIVATE _x, _retvalcurset = SET("CURSOR")

SET CURSOR OFF
_x = 0_retval = ''
_falsepass = SPACE(32)
@ 1.8,43.5 GET _falsepass  SIZE 1,32.5 ;
   DEFAULT " " ;
   FONT "FoxFont", 9  ;
   COLOR ,RGB(,,,255,255,255)
CLEAR GETS
DO WHILE _x <> 13
   _x = INKEY( _timeout )
   DO CASE
      CASE _x = 127 .OR. _x = 19
             && Backspace или стрелка влево
         IF LEN( _retval ) > 0
            _retval = LEFT;
              ( _retval, LEN( _retval ) - 1 )
         ELSE
            SET BELL TO 440,2
            ?? CHR(7)
            SET BELL TO
         ENDIF
      CASE _x = 0
         _x = 13
      CASE _x = 13
      OTHERWISE
         _retval = _retval + CHR( _x )
   ENDCASE
   _falsepass = LEFT(REPLICATE('', LEN;
    (TRIM(_retval)))+SPACE(32), 32)
   @ 1.8,43.5 GET _falsepass  ;
     SIZE 1,32.5 DEFAULT " " ;
     FONT "FoxFont", 9  ;
     COLOR ,RGB(,,,255,255,255)
   CLEAR GETS
ENDDO
SET CURSOR &curset
RETURN UPPER(TRIM(_retval))
Hosted by uCoz