Subversion Repositories DevTools

Rev

Rev 3926 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<%
'=============================================================
'//
'//                  Access Control
'//
'=============================================================
%>
<%
'--------------- Global Constants ----------------
Const enumSESSION_TIMEOUT = 200      ' Minutes
Const enumSESSION_LAST_REQUEST = "AM_SESSION_LAST_REQUEST"
Const enumLOGIN_TOKEN_SESSION = "AM_LOGIN_TOKEN"
Const enumUSER_ID_SESSION = "AM_USER_ID"
Const enumUSER_DETAILS_SESSION = "AM_USER_DETAILS"
Const enumUSER_APPLICATIONS_SESSION = "AM_USER_APPLICATIONS"
Const enumUSER_STATIC_PERMISSIONS = "AM_USER_STATIC_PERMISSIONS"
Const enumUSER_DATA_PERMISSIONS = "AM_USER_DATA_PERMISSIONS"
Const enumUSER_TEMP_VARIABLE = "AM_USER_TEMP_VARIABLE"
Const enumACCESS_MANAGER_EVENT_LOGON_SUCCESS  = 1
Const enumACCESS_MANAGER_EVENT_LOGON_FAIL       = -1
Const enumACCESS_MANAGER_EVENT_LOGOFF         = 0
Const enumACCESS_MANAGER_EVENT_SESSION_EXPIRE = 2
'-------------------------------------------------

Class AccessControl
   Private moOraSession
   Private moOraDatabase
   Private mobjStaticControl
   Private mobjRowPermissions
   Private mobjTablePermissions
   Private sSEPARATOR
   Private mbIsApplicationRunning

   Public Property Let objOraDatabase ( ByRef oOraDatabase )
      Set moOraDatabase = oOraDatabase
   End Property

   Public Property Let objOraSession ( ByRef oOraSession )
      Set moOraSession = oOraSession
   End Property

   Public Property Get UserLogedIn ()
      UserLogedIn = FALSE

      ' Check for Session Token
      If (Session(enumLOGIN_TOKEN_SESSION) <> "") AND NOT IsNull(Session(enumLOGIN_TOKEN_SESSION)) Then
         UserLogedIn = TRUE
      End If

   End Property

   Public Property Get UserId ()
      UserId = Session(enumUSER_ID_SESSION)
   End Property

   Public Property Get UserName ()
      UserName = Extract( "user_name", Session(enumUSER_DETAILS_SESSION) )
   End Property

   Public Property Get FullName ()
      FullName = Extract( "full_name", Session(enumUSER_DETAILS_SESSION) )
   End Property

   Public Property Get UserEmail ()
      UserEmail = Extract( "user_email", Session(enumUSER_DETAILS_SESSION) )
   End Property

   Public Property Get LastVisit ()
      LastVisit = Extract( "last_visit", Session(enumUSER_DETAILS_SESSION) )
   End Property

   Public Property Get Domain ()
      Domain = Extract( "domain", Session(enumUSER_DETAILS_SESSION) )
   End Property

   Public Property Get IsApplicationRunning()
      If IsNull(mbIsApplicationRunning) Then
         Call GetApplicationRunningLevel ()

      End If

      IsApplicationRunning = mbIsApplicationRunning
   End Property

   Public Property Get isDevSystem()
      isDevSystem = FALSE
      If OraDatabase.DatabaseName = "RELMANU1" Then isDevSystem = TRUE
   End Property

   '-----------------------------------------------------------------------------------------------------------------
   Public Function UserApplication ( nAppId )
      UserApplication = FALSE

      If InStr( sSEPARATOR & Session(enumUSER_APPLICATIONS_SESSION) & sSEPARATOR,  sSEPARATOR & nAppId & sSEPARATOR)  Then
         UserApplication = TRUE
      End If

   End Function
   '-----------------------------------------------------------------------------------------------------------------
   Public Function BeginRegion ( sControlObjName )
      Response.write "<table width='100%'  border='0' cellspacing='0' cellpadding='1'>"
      Response.write "  <tr>"
      Response.write "    <td bgcolor='#FF0000'>&nbsp;<a href='#' class='body_linkw'><b>"& sControlObjName &"</b></a>&nbsp;</td>"
      Response.write "  </tr>"
      Response.write "  <tr>"
      Response.write "    <td bgcolor='#FF0000'>"
      Response.write "      <table width='100%'  border='0' cellspacing='0' cellpadding='0'>"
      Response.write "           <tr><td bgcolor='#FFFFFF'>"
   End Function
   '-----------------------------------------------------------------------------------------------------------------
   Public Function EndRegion ( sControlObjName )
      Response.write "    </td></tr></table>"
      Response.write " </td></tr>"
      Response.write "</table>"
   End Function
   '-----------------------------------------------------------------------------------------------------------------
   Private Function Extract( sField, sString )
      Dim tempArr, tempSTR

      tempArr = Split( sString, sSEPARATOR )
      tempSTR = Join( Filter( tempArr, sField &"=" ) )   ' Append "=" to field name to get e.g. "user_name="

      Extract = Right( tempSTR, Len(tempSTR) - Len( sField &"=" ))   ' Strip the fieled name from value

   End Function
   '-----------------------------------------------------------------------------------------------------------------
   Private Function GetDataPermission ( sTableName, nRowId, nPermissionType )
      Dim cPermissionValue

      '--- Get Row Permission ---
      cPermissionValue = mobjRowPermissions.Item ( Cstr( sTableName &"_"& nRowId &"_"& nPermissionType ) )


      'Response.write " VALUE="& cPermissionValue &" for "& sTableName &" "& nRowId &" "& nPermissionType &", "


      If IsNull( cPermissionValue )  OR  ( cPermissionValue = "" ) Then

         '--- Get Default Table Permission ---
         cPermissionValue = mobjTablePermissions.Item ( Cstr( sTableName &"_"& nPermissionType ) )

         '--- Raise Exception if Table Default is not found ---
         'If IsNull( cPermissionValue )  OR  ( cPermissionValue = "" ) Then
         '   Err.Raise 8, "Default Table Permission is Not Found.", "sTableName="& sTableName &", nPermissionType="& nPermissionType
         '   Exit Function
         'End If


         'Response.write " VALUE="& cPermissionValue &" for "& sTableName &" "& nRowId &" "& nPermissionType &", "

      End If


      '--- Return TRUE / FALSE ---
      GetDataPermission = FALSE
      If cPermissionValue = enumDB_YES Then
         GetDataPermission = TRUE
      End If

   End Function
   '-----------------------------------------------------------------------------------------------------------------
   Public Function IsDataVisible ( sTableName, nRowId, sControlObjName )
      IsDataVisible = FALSE

      If IsVisible ( sControlObjName ) Then
         IsDataVisible = GetDataPermission ( sTableName, nRowId, enumDB_PERMISSION_TYPE_VISIBLE )
      End If

   End Function
   '-----------------------------------------------------------------------------------------------------------------
   Public Function IsDataActive ( sTableName, nRowId, sControlObjName )
      IsDataActive = FALSE

      If IsActive ( sControlObjName ) Then
         IsDataActive = TRUE
      Else
         IsDataActive = GetDataPermission ( sTableName, nRowId, enumDB_PERMISSION_TYPE_ACTIVE )
      End If

   End Function
   '-----------------------------------------------------------------------------------------------------------------
   Public Function IsActive ( sControlObjName )
      If ( mobjStaticControl.Item (Cstr( sControlObjName &"_"&  enumDB_PERMISSION_TYPE_ACTIVE )) = enumDB_YES )   OR   ( IsNull(sControlObjName) )Then
         IsActive = TRUE
      Else
         IsActive = FALSE
      End If

   End Function
   '-----------------------------------------------------------------------------------------------------------------
   Public Function IsVisible ( sControlObjName )
      If mobjStaticControl.Item (Cstr( sControlObjName &"_"& enumDB_PERMISSION_TYPE_VISIBLE )) = enumDB_YES Then
         IsVisible = TRUE
      Else
         IsVisible = FALSE
      End If
   End Function
   '-----------------------------------------------------------------------------------------------------------------
   ' This function is used for HTML conponents that support attribute "disabled". i.e. Button, dropdown, etc.
   Public Function IsComponentDisabled ( sControlObjName )
      If IsVisible ( sControlObjName ) Then
         IsComponentDisabled = ""
      Else
         IsComponentDisabled = " disabled "
      End If
   End Function
   '-----------------------------------------------------------------------------------------------------------------
   Public Sub LoadDataPermissions ( aRows )
      Dim numOfRows, rowNum
      Dim InxTableName, InxRefColumnVal, InxPermissionType, InxPermission

      InxTableName      = 0
      InxRefColumnVal      = 1
      InxPermissionType   = 2
      InxPermission      = 3

      numOfRows = UBound( aRows, 2 )

      For rowNum = 0 To numOfRows


         If aRows( InxRefColumnVal, rowNum ) = 0 Then
            '--- Set Table Default Permission (i.e. "0" wildcard for "all records") ---
            mobjTablePermissions.Item ( aRows( InxTableName, rowNum ) &"_"& aRows( InxPermissionType, rowNum ) ) = aRows( InxPermission, rowNum )

         Else
            '--- Set Row Permission ---
            mobjRowPermissions.Item ( aRows( InxTableName, rowNum ) &"_"& aRows( InxRefColumnVal, rowNum ) &"_"& aRows( InxPermissionType, rowNum ) ) = aRows( InxPermission, rowNum )

         End If


      Next

      'Response.write "mobjRowPermissions.Keys="& Join ( mobjRowPermissions.Keys, ", ") &"<br>"
      'Response.write "mobjRowPermissions.Items="& Join ( mobjRowPermissions.Items, ", ") &"<br>"
      'Response.write "mobjTablePermissions.Keys="& Join ( mobjTablePermissions.Keys, ", ") &"<br>"
      'Response.write "mobjTablePermissions.Items="& Join ( mobjTablePermissions.Items, ", ") &"<br>"
   End Sub
   '-----------------------------------------------------------------------------------------------------------------
   Public Sub LoadDataPermissionVariations ( aRows )
      Dim numOfRows, rowNum
      Dim InxTableName, InxRefColumnVal, InxPermissionType, InxPermission

      InxTableName      = 0
      InxRefColumnVal      = 1
      InxPermissionType   = 2
      InxPermission      = 3

      numOfRows = UBound( aRows, 2 )

      For rowNum = 0 To numOfRows
         If mobjRowPermissions.Exists ( aRows( InxTableName, rowNum ) &"_"& enumDB_ALL_DATA &"_"& aRows( InxPermissionType, rowNum ) )Then
            mobjRowPermissions.Remove ( aRows( InxTableName, rowNum ) &"_"& enumDB_ALL_DATA &"_"& aRows( InxPermissionType, rowNum ) )
         End If

         mobjRowPermissions.Item ( aRows( InxTableName, rowNum ) &"_"& aRows( InxRefColumnVal, rowNum ) &"_"& aRows( InxPermissionType, rowNum ) ) = CStr( aRows( InxPermission, rowNum ) )

         If aRows( InxPermission, rowNum ) = enumDB_NO Then
            mobjTablePermissions.Item ( aRows( InxTableName, rowNum ) &"_"& aRows( InxPermissionType, rowNum ) ) =  enumDB_YES
         Else
            mobjTablePermissions.Item ( aRows( InxTableName, rowNum ) &"_"& aRows( InxPermissionType, rowNum ) ) =  enumDB_NO

         End If


      Next
      'Response.write "mobjRowPermissions.Keys="& Join ( mobjRowPermissions.Keys, ", ")
   End Sub
   '-----------------------------------------------------------------------------------------------------------------
   Public Sub LoadStaticPermissions ( aRows )
      Dim numOfRows, rowNum
      Dim InxObjName, InxPermissionType, InxPermission

      InxObjName          = 0
      InxPermissionType   = 1
      InxPermission      = 2

      numOfRows = UBound( aRows, 2 )

      For rowNum = 0 To numOfRows

         'Response.write " "& aRows( InxObjName, rowNum ) &"_"&  aRows( InxPermissionType, rowNum ) &"="& CStr( aRows( InxPermission, rowNum ) ) &"<br>"
         'Response.write "--"& mobjStaticControl.Count &"<br>"

         mobjStaticControl.Add ( aRows( InxObjName, rowNum ) &"_"&  aRows( InxPermissionType, rowNum ) ), CStr( aRows( InxPermission, rowNum ) )

      Next


   End Sub
   '-----------------------------------------------------------------------------------------------------------------
   Private Function AutoLogonUser ( sUserId )
      Dim rsQry, query, is_Online
      AutoLogonUser = FALSE

      '-- Kill Any pervious User Permissions stored in session --
      Session.Contents.Remove(enumUSER_STATIC_PERMISSIONS)
      Session.Contents.Remove(enumUSER_DATA_PERMISSIONS)

      '--- Get if user is loged on from DB ---
      moOraDatabase.Parameters.Add "USER_ID",  sUserId, ORAPARM_INPUT, ORATYPE_NUMBER

      query = "SELECT usr.IS_ONLINE  FROM USERS usr  WHERE usr.USER_ID = :USER_ID"
      Set rsQry = moOraDatabase.DbCreateDynaset( query , ORADYN_DEFAULT )

      If (NOT rsQry.BOF) AND (NOT rsQry.EOF) Then
         is_Online = rsQry("is_online")
      End If

      moOraDatabase.Parameters.Remove "USER_ID"
      rsQry.Close
      Set rsQry = Nothing


      '--- Check if User is still Loged on ---
      If is_Online = "Y" Then
         Call SessionsAndCookieSetup ( sUserId )

      End If


   End Function
   '-----------------------------------------------------------------------------------------------------------------
   Public Sub LogonUser ( sUserName, sUserPassword )
      Dim rsQry, query, sMessage
      sMessage = NULL

      '-- Kill Any pervious User Permissions stored in session --
      Session.Contents.Remove(enumUSER_STATIC_PERMISSIONS)
      Session.Contents.Remove(enumUSER_DATA_PERMISSIONS)

      moOraDatabase.Parameters.Add "USER_NAME",      sUserName,       ORAPARM_INPUT, ORATYPE_VARCHAR2

      query = "SELECT usr.*  FROM USERS usr  WHERE usr.USER_NAME = :USER_NAME"
      Set rsQry = moOraDatabase.DbCreateDynaset( query , ORADYN_DEFAULT )

      moOraDatabase.Parameters.Remove "USER_NAME"

      '--- Try Authenticating ---
      If (NOT rsQry.BOF) AND (NOT rsQry.EOF) Then
         ' User Found !

         If rsQry("is_disabled") = enumDB_YES  Then
            ' User Disabled !
            sMessage = "Account <b>"& sUserName &"</b> is Disabled!"

            '-- Login Trail --
            Call LoginTrail ( enumACCESS_MANAGER_EVENT_LOGON_FAIL, sUserName, sMessage )

            '-- Raise Exception --
            Err.Raise 8, sMessage, ""

         Else

            ' Proceed with authentication
            If Authenticated( sUserName, sUserPassword, rsQry("user_password"), rsQry("domain") ) Then
               ' Login OK.
               Call SessionsAndCookieSetup ( rsQry("user_id") )

               ' Tag user login
               Call TagLogon ( rsQry )

            End If


         End If

      Else
         ' User Not Found !
         sMessage = "Account <b>"& sUserName &"</b> Not Found!"

         '-- Login Trail --
         Call LoginTrail ( enumACCESS_MANAGER_EVENT_LOGON_FAIL, sUserName, sMessage )

         '-- Raise Exception --
         Err.Raise 8, sMessage, "Make sure your Username is correct <br>OR <br>Please go back and register if you are new user. "

      End If
      '--------------------------




      rsQry.Close()
      Set rsQry = Nothing
   End Sub
   '-----------------------------------------------------------------------------------------------------------------
   Public Function RequiresPasswordUpdate ( sUserName )
      Dim rsQry, query, sMessage
      sMessage = NULL

      moOraDatabase.Parameters.Add "USER_NAME",      sUserName,       ORAPARM_INPUT, ORATYPE_VARCHAR2

      query = "SELECT usr.*  FROM USERS usr  WHERE usr.USER_NAME = :USER_NAME"
      Set rsQry = moOraDatabase.DbCreateDynaset( query , ORADYN_DEFAULT )


      '--- Try Authenticating ---
      RequiresPasswordUpdate = FALSE
      If (NOT rsQry.BOF) AND (NOT rsQry.EOF) Then
         If IsNull(rsQry("user_password")) AND IsNull(rsQry("domain")) Then
            RequiresPasswordUpdate = TRUE
         End If

      End If
      '--------------------------


      moOraDatabase.Parameters.Remove "USER_NAME"

      rsQry.Close()
      Set rsQry = Nothing
   End Function
   '-----------------------------------------------------------------------------------------------------------------
   Public Sub LogoffUser ()
      '-- Login Trail --
      Call LoginTrail ( enumACCESS_MANAGER_EVENT_LOGOFF, UserName, NULL )

      '-- Kill User Session --
      Session.Abandon

   End Sub
   '-----------------------------------------------------------------------------------------------------------------
   Private Sub SessionsAndCookieSetup ( nUserId )
      ' Store User details in session
      Call SetUserEnvironment ( nUserId )

      ' Aquire Login Token for Single Application
      Session(enumLOGIN_TOKEN_SESSION) = Session.SessionID

      Session.Timeout = enumSESSION_TIMEOUT
   End Sub
   '-----------------------------------------------------------------------------------------------------------------
   Private Function Authenticated ( ByRef sUserName, ByRef sUserPassword, sDBUserPassword, sDBdomain )
      Dim objLoginAuth, return, sMessage
      sMessage = NULL

      Authenticated = FALSE

      ' Hook for testing access control features
      ' Any login allowed to the Test Database
      '
      If isDevSystem() Then
        Authenticated = TRUE

        '-- Login Trail --
        Call LoginTrail ( enumACCESS_MANAGER_EVENT_LOGON_SUCCESS, sUserName, NULL )

      ElseIf NOT IsNull(sDBdomain) Then
         ' DOMAIN auth.

         Set objLoginAuth = Server.CreateObject("LoginAdmin.ImpersonateUser")

         return = -1
         return = objLoginAuth.AuthenticateUser ( sUserName, sUserPassword, sDBdomain )

         ' From MSDN System Error Codes
         ' 0 - The operation completed successfully.
         ' 1326 - Logon failure: unknown user name or bad password.
         ' 1385 - Logon failure: the user has not been granted the requested logon type at this computer.
         ' 1909 - The referenced account is currently locked out and may not be used to log on.

         Select Case return
            Case 0, 1385
               'Login ok
               Authenticated = TRUE

               '-- Login Trail --
               Call LoginTrail ( enumACCESS_MANAGER_EVENT_LOGON_SUCCESS, sUserName, NULL )

            Case 1909
               sMessage = "Account <b>"& sUserName &"</b> at "& sDBdomain &" domain is currently locked!"

               '-- Login Trail --
               Call LoginTrail ( enumACCESS_MANAGER_EVENT_LOGON_FAIL, sUserName, sMessage )

               '-- Raise Exception --
               Err.Raise 8, sMessage, ""


            Case Else
               sMessage = "Password is incorrect for <b>"& sUserName &"</b> at "& sDBdomain &" domain!"

               '-- Login Trail --
               Call LoginTrail ( enumACCESS_MANAGER_EVENT_LOGON_FAIL, sUserName, sMessage )

               '-- Raise Exception --
               Err.Raise 8, sMessage, sDBdomain &" domain returns system error code "& return

         End Select

         Set objLoginAuth = Nothing

      Else
         ' LOCAL auth.
         If IsLocaPasswordCorrect ( sUserName, sUserPassword ) Then
            'Login ok
            Authenticated = TRUE

            '-- Login Trail --
            Call LoginTrail ( enumACCESS_MANAGER_EVENT_LOGON_SUCCESS, sUserName, NULL )

         Else
            sMessage = "Password is incorrect for <b>"& sUserName &"</b>!"

            '-- Login Trail --
            Call LoginTrail ( enumACCESS_MANAGER_EVENT_LOGON_FAIL, sUserName, sMessage )

            '-- Raise Exception --
            Err.Raise 8, sMessage, "Please try again and make sure you do not have Caps Lock on."

         End If

      End If



   End Function
   '-----------------------------------------------------------------------------------------------------------------
   Private Function IsLocaPasswordCorrect ( sUserName, sPassword )

      moOraDatabase.Parameters.Add "USER_NAME",   sUserName,    ORAPARM_INPUT, ORATYPE_VARCHAR2
      moOraDatabase.Parameters.Add "PASSWORD",    sPassword,    ORAPARM_INPUT, ORATYPE_VARCHAR2
      moOraDatabase.Parameters.Add "RETURN_CODE",   0,       ORAPARM_OUTPUT, ORATYPE_NUMBER

      moOraDatabase.ExecuteSQL _
      "BEGIN   :RETURN_CODE := PK_SECURITY.IS_LOCAL_PASSWORD_CORRECT ( :USER_NAME, :PASSWORD );   END;"

      If CInt(OraDatabase.Parameters("RETURN_CODE").Value) = 1 Then
         IsLocaPasswordCorrect = TRUE
      Else
         IsLocaPasswordCorrect = FALSE
      End If

      moOraDatabase.Parameters.Remove "USER_NAME"
      moOraDatabase.Parameters.Remove "PASSWORD"
      moOraDatabase.Parameters.Remove "RETURN_CODE"

   End Function
   '-----------------------------------------------------------------------------------------------------------------
   Public Sub SetPassword ( sUserName, sPasswordA, sPasswordB )
      If (sUserName = "")  OR  (sPasswordA = "")  OR  (sPasswordB = "") Then
         Err.Raise 8, "Username and both Passwords are required !", ""
         Exit Sub
      End If


      moOraDatabase.Parameters.Add "USER_NAME",   sUserName,       ORAPARM_INPUT, ORATYPE_VARCHAR2
      moOraDatabase.Parameters.Add "PASSWORDA",   sPasswordA,    ORAPARM_INPUT, ORATYPE_VARCHAR2
      moOraDatabase.Parameters.Add "PASSWORDB",   sPasswordB,    ORAPARM_INPUT, ORATYPE_VARCHAR2
      moOraDatabase.Parameters.Add "RETURN_CODE",   0,       ORAPARM_OUTPUT, ORATYPE_NUMBER

      objEH.TryORA ( moOraSession )
      On Error Resume Next

      moOraDatabase.ExecuteSQL _
      "BEGIN   :RETURN_CODE := PK_SECURITY.SET_PASSWORD ( :USER_NAME, :PASSWORDA, :PASSWORDB );   END;"

      objEH.CatchORA ( moOraSession )

      If CInt(OraDatabase.Parameters("RETURN_CODE").Value) = -1 Then
         Err.Raise 8, "Passwords do not match !", "Make sure that you type correctly both passwords."
      End If


      moOraDatabase.Parameters.Remove "USER_NAME"
      moOraDatabase.Parameters.Remove "PASSWORDA"
      moOraDatabase.Parameters.Remove "PASSWORDB"
      moOraDatabase.Parameters.Remove "RETURN_CODE"

   End Sub
   '-----------------------------------------------------------------------------------------------------------------
   Private Sub LoginTrail ( nEvent, sUserName, sMessage )

      moOraDatabase.Parameters.Add "EVENT_ENUM",         nEvent,       ORAPARM_INPUT, ORATYPE_NUMBER
      moOraDatabase.Parameters.Add "LOGIN_USER_NAME",   sUserName,       ORAPARM_INPUT, ORATYPE_VARCHAR2
      moOraDatabase.Parameters.Add "CLIENT_IP",         Request.ServerVariables("REMOTE_ADDR"),       ORAPARM_INPUT, ORATYPE_VARCHAR2
      moOraDatabase.Parameters.Add "APPLICATION_ID",      APPLICATION_ID,       ORAPARM_INPUT, ORATYPE_NUMBER
      moOraDatabase.Parameters.Add "LOGIN_COMMENTS",      sMessage,       ORAPARM_INPUT, ORATYPE_VARCHAR2

      objEH.TryORA ( moOraSession )
      On Error Resume Next

      moOraDatabase.ExecuteSQL _
      "BEGIN   pk_AMUtils.Log_Access ( :EVENT_ENUM, :LOGIN_USER_NAME, :CLIENT_IP, :APPLICATION_ID, :LOGIN_COMMENTS );   END;"

      objEH.CatchORA ( moOraSession )

      moOraDatabase.Parameters.Remove "EVENT_ENUM"
      moOraDatabase.Parameters.Remove "LOGIN_USER_NAME"
      moOraDatabase.Parameters.Remove "CLIENT_IP"
      moOraDatabase.Parameters.Remove "APPLICATION_ID"
      moOraDatabase.Parameters.Remove "LOGIN_COMMENTS"

   End Sub
   '-----------------------------------------------------------------------------------------------------------------
   Private Sub TagLogon ( oRsQry )
      oRsQry.Edit()

      oRsQry("is_online").Value = "Y"
      oRsQry("online_at").Value = Request.ServerVariables("REMOTE_ADDR")

      oRsQry.Update()
   End Sub
   '-----------------------------------------------------------------------------------------------------------------
   Private Sub SetUserEnvironment ( nUser_id )
      Dim rsUser, query, tempSTR

      moOraDatabase.Parameters.Add "USER_ID", nUser_id, ORAPARM_INPUT, ORATYPE_NUMBER



      '---- Get User Details ----
      query = "SELECT usr.*  FROM USERS usr  WHERE usr.USER_ID = :USER_ID"
      Set rsUser = moOraDatabase.DbCreateDynaset( query , ORADYN_DEFAULT )

      If (NOT rsUser.BOF) AND (NOT rsUser.EOF) Then
         Session(enumUSER_ID_SESSION) = rsUser("user_id")

         Session(enumUSER_DETAILS_SESSION) = _
            "user_name="& rsUser("user_name") & sSEPARATOR &_
            "full_name="& rsUser("full_name") & sSEPARATOR &_
            "user_email="& rsUser("user_email") & sSEPARATOR &_
            "last_visit="& rsUser("last_visit") & sSEPARATOR &_
            "domain="& rsUser("domain")

      End If



      '---- Get User Applications ----
      query = "SELECT ua.APP_ID  FROM USER_APPLICATIONS ua  WHERE ua.USER_ID = :USER_ID"
      Set rsUser = moOraDatabase.DbCreateDynaset( query , ORADYN_DEFAULT )
      tempSTR = ""
      While (NOT rsUser.BOF) AND (NOT rsUser.EOF)
         tempSTR = tempSTR & sSEPARATOR & rsUser("app_id")
         rsUser.MoveNext()
      WEnd

      If tempSTR <> "" Then
         Session(enumUSER_APPLICATIONS_SESSION) = Right( tempSTR, Len(tempSTR) - Len(sSEPARATOR) )   'Remove first separator
      Else
         Session(enumUSER_APPLICATIONS_SESSION) = 0
      End If



      moOraDatabase.Parameters.Remove "USER_ID"

      rsUser.Close()
      Set rsUser = Nothing
   End Sub
   '-----------------------------------------------------------------------------------------------------------------
   Private Sub GetApplicationRunningLevel ( )
      Dim rsQry, query


      '--- Get if user is loged on from DB ---
      moOraDatabase.Parameters.Add "APP_ID",  APPLICATION_ID, ORAPARM_INPUT, ORATYPE_NUMBER

      query = _
      " SELECT app.APP_ID,"&_
      "        app.APPLICATION_NAME,"&_
      "        app.IS_RUNNING"&_
      "   FROM APPLICATIONS app"&_
      "  WHERE app.APP_ID = :APP_ID"
      Set rsQry = moOraDatabase.DbCreateDynaset( query , ORADYN_DEFAULT )

      If (NOT rsQry.BOF) AND (NOT rsQry.EOF) Then
         mbIsApplicationRunning = FALSE
         If rsQry("is_running") = enumDB_YES Then
            mbIsApplicationRunning = TRUE
         End If
      End If

      moOraDatabase.Parameters.Remove "APP_ID"
      rsQry.Close
      Set rsQry = Nothing

   End Sub
   '-----------------------------------------------------------------------------------------------------------------
   Private Sub Class_Initialize()
      '// Perform action on creation of object. e.g. Set myObj = New ThisClassName
      Set mobjStaticControl = CreateObject("Scripting.Dictionary")
      Set mobjTablePermissions = CreateObject("Scripting.Dictionary")
      Set mobjRowPermissions = CreateObject("Scripting.Dictionary")
      mbIsApplicationRunning = NULL   ' The state of application

      sSEPARATOR = "||"

   End Sub
   '-----------------------------------------------------------------------------------------------------------------
   Private Sub Class_Terminate()
      '// Perform action on object disposal. e.g. Set myObj = Nothing
      Set mobjStaticControl = Nothing
      Set mobjRowPermissions = Nothing
      Set mobjTablePermissions = Nothing

   End Sub
   '-----------------------------------------------------------------------------------------------------------------
End Class
%>