ua_session.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include <time.h>
  2. #include <stdlib.h>
  3. #include "ua_session.h"
  4. #include "ua_util.h"
  5. #include "ua_statuscodes.h"
  6. UA_Session anonymousSession = {
  7. .clientDescription = {.applicationUri = {-1, UA_NULL},
  8. .productUri = {-1, UA_NULL},
  9. .applicationName = {.locale = {-1, UA_NULL}, .text = {-1, UA_NULL}},
  10. .applicationType = UA_APPLICATIONTYPE_CLIENT,
  11. .gatewayServerUri = {-1, UA_NULL},
  12. .discoveryProfileUri = {-1, UA_NULL},
  13. .discoveryUrlsSize = -1,
  14. .discoveryUrls = UA_NULL},
  15. .sessionName = {sizeof("Anonymous Session")-1, (UA_Byte*)"Anonymous Session"},
  16. .authenticationToken = {.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC, .identifier.numeric = 0}, // is never used, as this session is not stored in the sessionmanager
  17. .sessionId = {.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC, .identifier.numeric = 0},
  18. .maxRequestMessageSize = UA_UINT32_MAX,
  19. .maxResponseMessageSize = UA_UINT32_MAX,
  20. .timeout = UA_INT64_MAX,
  21. .validTill = UA_INT64_MAX,
  22. .channel = UA_NULL};
  23. UA_Session adminSession = {
  24. .clientDescription = {.applicationUri = {-1, UA_NULL},
  25. .productUri = {-1, UA_NULL},
  26. .applicationName = {.locale = {-1, UA_NULL}, .text = {-1, UA_NULL}},
  27. .applicationType = UA_APPLICATIONTYPE_CLIENT,
  28. .gatewayServerUri = {-1, UA_NULL},
  29. .discoveryProfileUri = {-1, UA_NULL},
  30. .discoveryUrlsSize = -1,
  31. .discoveryUrls = UA_NULL},
  32. .sessionName = {sizeof("Administrator Session")-1, (UA_Byte*)"Administrator Session"},
  33. .authenticationToken = {.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC, .identifier.numeric = 1}, // is never used, as this session is not stored in the sessionmanager
  34. .sessionId = {.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC, .identifier.numeric = 1},
  35. .maxRequestMessageSize = UA_UINT32_MAX,
  36. .maxResponseMessageSize = UA_UINT32_MAX,
  37. .timeout = UA_INT64_MAX,
  38. .validTill = UA_INT64_MAX,
  39. .channel = UA_NULL};
  40. UA_Int32 UA_Session_new(UA_Session **session) {
  41. if(!(*session = UA_alloc(sizeof(UA_Session))))
  42. return UA_STATUSCODE_BADOUTOFMEMORY;
  43. UA_Session_init(*session);
  44. return UA_SUCCESS;
  45. }
  46. /* mock up function to generate tokens for authentication */
  47. UA_Int32 UA_Session_generateToken(UA_NodeId *newToken) {
  48. //Random token generation
  49. UA_Int32 retval = UA_SUCCESS;
  50. srand(time(NULL));
  51. UA_Int32 i = 0;
  52. UA_Int32 r = 0;
  53. //retval |= UA_NodeId_new(newToken);
  54. newToken->namespaceIndex = 0; // where else?
  55. newToken->identifierType = UA_NODEIDTYPE_GUID;
  56. newToken->identifier.guid.data1 = rand();
  57. r = rand();
  58. newToken->identifier.guid.data2 = (UA_UInt16)((r>>16) );
  59. r = rand();
  60. /* UA_Int32 r1 = (r>>16); */
  61. /* UA_Int32 r2 = r1 & 0xFFFF; */
  62. /* r2 = r2 * 1; */
  63. newToken->identifier.guid.data3 = (UA_UInt16)((r>>16) );
  64. for(i = 0;i < 8;i++) {
  65. r = rand();
  66. newToken->identifier.guid.data4[i] = (UA_Byte)((r>>28) );
  67. }
  68. return retval;
  69. }
  70. void UA_Session_init(UA_Session *session) {
  71. if(!session) return;
  72. UA_ApplicationDescription_init(&session->clientDescription);
  73. UA_NodeId_init(&session->authenticationToken);
  74. UA_NodeId_init(&session->sessionId);
  75. UA_String_init(&session->sessionName);
  76. session->maxRequestMessageSize = 0;
  77. session->maxResponseMessageSize = 0;
  78. session->timeout = 0;
  79. UA_DateTime_init(&session->validTill);
  80. session->channel = UA_NULL;
  81. }
  82. void UA_Session_deleteMembers(UA_Session *session) {
  83. UA_ApplicationDescription_deleteMembers(&session->clientDescription);
  84. UA_NodeId_deleteMembers(&session->authenticationToken);
  85. UA_NodeId_deleteMembers(&session->sessionId);
  86. UA_String_deleteMembers(&session->sessionName);
  87. session->channel = UA_NULL;
  88. }
  89. void UA_Session_delete(UA_Session *session) {
  90. UA_Session_deleteMembers(session);
  91. UA_free(session);
  92. }
  93. UA_Boolean UA_Session_compare(UA_Session *session1, UA_Session *session2) {
  94. if(session1 && session2 &&
  95. UA_NodeId_equal(&session1->sessionId, &session2->sessionId) == UA_EQUAL)
  96. return UA_TRUE;
  97. return UA_FALSE;
  98. }
  99. UA_Int32 UA_Session_setExpirationDate(UA_Session *session) {
  100. if(!session)
  101. return UA_ERROR;
  102. session->validTill = UA_DateTime_now() + session->timeout * 100000; //timeout in ms
  103. return UA_SUCCESS;
  104. }
  105. UA_Int32 UA_Session_getPendingLifetime(UA_Session *session, UA_Double *pendingLifetime_ms) {
  106. if(!session)
  107. return UA_ERROR;
  108. *pendingLifetime_ms = (session->validTill - UA_DateTime_now())/10000000; //difference in ms
  109. return UA_SUCCESS;
  110. }