Снова о паролях
Джон Торренс (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))