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