GD P SEC LOGINUSER

Материал из GedeminWiki
Перейти к: навигация, поиск
/*--------------------------------------------------------

   gd_p_sec_loginuser

   На вход передаются: имя пользователя и пароль
   (пока не в зашифрованном виде). Эти значения пользователь вводит
   при входе в систему.

   На выходе:
     result = 1          -- все нормально
     result = 2          -- все нормально, сменить пароль
     result = -1001      -- нет такой подсистемы
     result = -1002      -- подсистема заблокирована
     result = -1003      -- пользователя нет
     result = -1004      -- пароль неверен
     result = -1005      -- пользователь заблокирован или истек срок
     result = -1006      -- вход в не рабочее время
     result = -1007      -- пользователь не имеет прав на вход в подсистему
     result = -1008      -- все группы пользователя для входа в подсистему заблокированы

     Если все нормально, то userkey, ibname, ibpassw -- ключ пользователя,
     имя пользователя Interbase и пароль Interbase соответственно.
     Иначе, значения переменных неопределены.

   ВНИМАНИЕ! Мы поменяли смысл ДБверсионИД -- теперь это
   уникальный идентификатор базы данных (значение соответствующего
   генератора).

 ----------------------------------------------------------*/

 CREATE PROCEDURE gd_p_sec_loginuser (username VARCHAR(20), passw VARCHAR(20), subsystem INTEGER)
   RETURNS (
     result        INTEGER,
     userkey       INTEGER,
     contactkey    INTEGER,
     ibname        VARCHAR(20),
     ibpassword    VARCHAR(20),
     ingroup       INTEGER,
     session       INTEGER,
     subsystemname VARCHAR(60),
     groupname     VARCHAR(2048),
     dbversion     VARCHAR(20),
     dbreleasedate DATE,
     dbversionid   INTEGER,
     dbversioncomment VARCHAR(254),
     auditlevel    INTEGER,
     auditcache    INTEGER,
     auditmaxdays  INTEGER,
     allowuseraudit SMALLINT
   )
 AS
   DECLARE VARIABLE PNE INTEGER;
   DECLARE VARIABLE MCH INTEGER;
   DECLARE VARIABLE WS TIME;
   DECLARE VARIABLE WE TIME;
   DECLARE VARIABLE ED DATE;
   DECLARE VARIABLE UDISABLED INTEGER;
   DECLARE VARIABLE UPASSW VARCHAR(20);
 BEGIN
   UDISABLED = NULL;

   SELECT id, disabled, passw, workstart, workend, expdate, passwneverexp,
     contactkey, ibname, ibpassword, ingroup, mustchange, allowaudit
   FROM gd_user
   WHERE UPPER(name) = UPPER(:username)
   INTO :userkey, :UDISABLED, :UPASSW, :WS, :WE, :ED, :PNE,
     :contactkey, :ibname, :ibpassword, :ingroup, :MCH, :AllowUserAudit;

   IF (:userkey IS NULL) THEN
   BEGIN
     result = -1003;
     EXIT;
   END

   IF (:UDISABLED <> 0) THEN
   BEGIN
     result = -1005;
     EXIT;
   END

   IF ((CURRENT_DATE >= :ED) AND (:PNE = 0)) THEN
   BEGIN
     result = -1005;
     EXIT;
   END

   IF (
     (NOT :WS IS NULL) AND
     (NOT :WE IS NULL) AND
     ((CURRENT_TIME < :WS) OR (CURRENT_TIME > :WE))
   ) THEN
   BEGIN
     result = -1006;
     EXIT;
   END

   IF (:UPASSW <> :passw) THEN
   BEGIN
     result = -1004;
     EXIT;
   END

   IF (:contactkey IS NULL) THEN
     contactkey = -1;

   EXECUTE PROCEDURE gd_p_sec_getgroupsforuser(:userkey)
     RETURNING_VALUES :groupname;

   result = IIF(:MCH = 0, 1, 2);

   /* унiкальны нумар сэсii */
   session = GEN_ID(gd_g_session_id, 1);

   /* бягучы нумар вэрс__ базы _ дата выхаду */
   SELECT FIRST 1 versionstring, releasedate, /*id,*/ comment
   FROM fin_versioninfo
   ORDER BY id DESC
   INTO :dbversion, :dbreleasedate, /*:dbversionid,*/ :dbversioncomment;
 
   dbversionid = GEN_ID(gd_g_dbid, 0);
 END
Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты