Selaa lähdekoodia

rounding up session management, minor fixes
(cherry picked from commit 2103d82fe250852d933a736277c6a7c5b5545fdf)

Stasik0 10 vuotta sitten
vanhempi
commit
cb03d4fa8a

+ 1 - 0
src/server/ua_securechannel_manager.c

@@ -122,6 +122,7 @@ UA_StatusCode UA_SecureChannelManager_close(UA_SecureChannelManager *cm, UA_UInt
                 UA_Connection_detachSecureChannel(c);
                 c->close(c);
             }
+            entry->channel.session = UA_NULL;
             UA_SecureChannel_deleteMembers(&entry->channel);
             LIST_REMOVE(entry, pointers);
             UA_free(entry);

+ 3 - 0
src/server/ua_server_binary.c

@@ -133,6 +133,9 @@ static void init_response_header(const UA_RequestHeader *p, UA_ResponseHeader *r
         if(!clientChannel->session || !UA_NodeId_equal(&clientChannel->session->authenticationToken,\
                 &p.requestHeader.authenticationToken))                  \
             r.responseHeader.serviceResult = UA_STATUSCODE_BADSESSIONIDINVALID;     \
+        else if(clientChannel->session->channel != clientChannel){      \
+            r.responseHeader.serviceResult = UA_STATUSCODE_BADSECURECHANNELIDINVALID; \
+        }                                                               \
         else if(clientChannel->session->activated == UA_FALSE){         \
             UA_SessionManager_removeSession(&server->sessionManager, &clientChannel->session->sessionId); \
             r.responseHeader.serviceResult = UA_STATUSCODE_BADSESSIONNOTACTIVATED; \

+ 14 - 0
src/server/ua_services_session.c

@@ -61,6 +61,12 @@ void Service_ActivateSession(UA_Server *server,UA_SecureChannel *channel,
         return;
 	}
 
+	if(foundSession->validTill < UA_DateTime_now()){
+        response->responseHeader.serviceResult = UA_STATUSCODE_BADSESSIONIDINVALID;
+        //TODO: maybe delete session? or wait for a recurring cleanup?
+        return;
+	}
+
     UA_UserIdentityToken token;
     UA_UserIdentityToken_init(&token);
     size_t offset = 0;
@@ -82,6 +88,10 @@ void Service_ActivateSession(UA_Server *server,UA_SecureChannel *channel,
         //success - activate
         channel->session = foundSession;
         channel->session->activated = UA_TRUE;
+        //TODO: not sure if we have to do this, tests seem to work
+        //if(foundSession->channel) //in case session is being rebound
+        //    foundSession->channel->session = UA_NULL;
+        foundSession->channel=channel;
         RETURN;
     //username logins
     }else if(server->config.Login_enableUsernamePassword && UA_String_equalchars(&token.policyId, USERNAME_POLICY)){
@@ -105,6 +115,10 @@ void Service_ActivateSession(UA_Server *server,UA_SecureChannel *channel,
                 //success - activate
                 channel->session = foundSession;
                 channel->session->activated = UA_TRUE;
+                //TODO: not sure if we have to do this, tests seem to work
+                //if(foundSession->channel) //in case session is being rebound
+                //    foundSession->channel->session = UA_NULL;
+                foundSession->channel=channel;
                 RETURN;
             }
         }

+ 2 - 2
src/server/ua_session_manager.c

@@ -24,8 +24,8 @@ void UA_SessionManager_deleteMembers(UA_SessionManager *sessionManager) {
         current = next;
         next = LIST_NEXT(current, pointers);
         LIST_REMOVE(current, pointers);
-        if(current->session.channel)
-            current->session.channel->session = UA_NULL; // the channel is no longer attached to a session
+        //if(current->session.channel)
+        //    current->session.channel->session = UA_NULL; // the channel is no longer attached to a session
         UA_Session_deleteMembers(&current->session);
         UA_free(current);
     }

+ 2 - 2
src/ua_session.c

@@ -71,7 +71,7 @@ UA_StatusCode UA_Session_setExpirationDate(UA_Session *session) {
     if(!session)
         return UA_STATUSCODE_BADINTERNALERROR;
 
-    session->validTill = UA_DateTime_now() + session->timeout * 100000; //timeout in ms
+    session->validTill = UA_DateTime_now() + session->timeout * 10000; //timeout in ms
     return UA_STATUSCODE_GOOD;
 }
 
@@ -79,7 +79,7 @@ UA_StatusCode UA_Session_getPendingLifetime(UA_Session *session, UA_Double *pend
     if(!session)
         return UA_STATUSCODE_BADINTERNALERROR;
 
-    *pendingLifetime_ms = (session->validTill - UA_DateTime_now())/10000000; //difference in ms
+    *pendingLifetime_ms = (session->validTill - UA_DateTime_now())/10000; //difference in ms
     return UA_STATUSCODE_GOOD;
 }