|
@@ -38,6 +38,11 @@ void Service_CreateSession(UA_Server *server, UA_SecureChannel *channel,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef RETURN
|
|
|
|
+#undef RETURN
|
|
|
|
+#endif
|
|
|
|
+#define RETURN UA_UserIdentityToken_deleteMembers(&token); \
|
|
|
|
+ UA_UserNameIdentityToken_deleteMembers(&username_token)
|
|
void Service_ActivateSession(UA_Server *server,UA_SecureChannel *channel,
|
|
void Service_ActivateSession(UA_Server *server,UA_SecureChannel *channel,
|
|
const UA_ActivateSessionRequest *request,
|
|
const UA_ActivateSessionRequest *request,
|
|
UA_ActivateSessionResponse *response) {
|
|
UA_ActivateSessionResponse *response) {
|
|
@@ -47,11 +52,75 @@ void Service_ActivateSession(UA_Server *server,UA_SecureChannel *channel,
|
|
(const UA_NodeId*)&request->requestHeader.authenticationToken,
|
|
(const UA_NodeId*)&request->requestHeader.authenticationToken,
|
|
&foundSession);
|
|
&foundSession);
|
|
|
|
|
|
- if(foundSession == UA_NULL)
|
|
|
|
|
|
+ if(foundSession == UA_NULL){
|
|
|
|
+ response->responseHeader.serviceResult = UA_STATUSCODE_BADIDENTITYTOKENINVALID;
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ UA_UserIdentityToken token;
|
|
|
|
+ UA_UserIdentityToken_init(&token);
|
|
|
|
+ size_t offset = 0;
|
|
|
|
+ UA_UserIdentityToken_decodeBinary(&request->userIdentityToken.body, &offset, &token);
|
|
|
|
+
|
|
|
|
+ UA_UserNameIdentityToken username_token;
|
|
|
|
+ UA_UserNameIdentityToken_init(&username_token);
|
|
|
|
+
|
|
|
|
+ //check policies
|
|
|
|
+
|
|
|
|
+ if(token.policyId.data == UA_NULL){ //user identity token is NULL
|
|
response->responseHeader.serviceResult = UA_STATUSCODE_BADIDENTITYTOKENINVALID;
|
|
response->responseHeader.serviceResult = UA_STATUSCODE_BADIDENTITYTOKENINVALID;
|
|
- else
|
|
|
|
- channel->session = foundSession;
|
|
|
|
|
|
+ //todo cleanup session
|
|
|
|
+ RETURN;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //anonymous logins
|
|
|
|
+ if(!server->config.Login_enableAnonymous && UA_String_equalchars(&token.policyId, ANONYMOUS_POLICY)){
|
|
|
|
+ response->responseHeader.serviceResult = UA_STATUSCODE_BADIDENTITYTOKENINVALID;
|
|
|
|
+ UA_UserIdentityToken_deleteMembers(&token);
|
|
|
|
+ //todo cleanup session
|
|
|
|
+ RETURN;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //username logins
|
|
|
|
+ if(UA_String_equalchars(&token.policyId, USERNAME_POLICY)){
|
|
|
|
+ if(!server->config.Login_enableUsernamePassword){
|
|
|
|
+ response->responseHeader.serviceResult = UA_STATUSCODE_BADIDENTITYTOKENINVALID;
|
|
|
|
+ //todo cleanup session
|
|
|
|
+ RETURN;
|
|
|
|
+ }
|
|
|
|
+ offset = 0;
|
|
|
|
+ UA_UserNameIdentityToken_decodeBinary(&request->userIdentityToken.body, &offset, &username_token);
|
|
|
|
+ if(username_token.encryptionAlgorithm.data != UA_NULL){
|
|
|
|
+ //we only support encryption
|
|
|
|
+ response->responseHeader.serviceResult = UA_STATUSCODE_BADIDENTITYTOKENINVALID;
|
|
|
|
+ //todo cleanup session
|
|
|
|
+ RETURN;
|
|
|
|
+ }
|
|
|
|
+ UA_Boolean matched = UA_FALSE;
|
|
|
|
+ for(UA_UInt32 i=0;i<server->config.Login_loginsCount;++i){
|
|
|
|
+ if(UA_String_equalchars(&username_token.userName, server->config.Login_usernames[i])
|
|
|
|
+ && UA_String_equalchars(&username_token.password, server->config.Login_passwords[i])){
|
|
|
|
+ matched = UA_TRUE;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if(!matched){
|
|
|
|
+ //no username/pass matched
|
|
|
|
+ response->responseHeader.serviceResult = UA_STATUSCODE_BADIDENTITYTOKENINVALID;
|
|
|
|
+ //todo cleanup session
|
|
|
|
+ RETURN;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //success - bind session to the channel
|
|
|
|
+ channel->session = foundSession;
|
|
|
|
+
|
|
|
|
+ RETURN;
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
+#undef RETURN
|
|
|
|
|
|
void Service_CloseSession(UA_Server *server, UA_Session *session, const UA_CloseSessionRequest *request,
|
|
void Service_CloseSession(UA_Server *server, UA_Session *session, const UA_CloseSessionRequest *request,
|
|
UA_CloseSessionResponse *response) {
|
|
UA_CloseSessionResponse *response) {
|