You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

mod_auth_token.lua 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. -- Token authentication
  2. -- Copyright (C) 2015 Atlassian
  3. local formdecode = require "util.http".formdecode;
  4. local generate_uuid = require "util.uuid".generate;
  5. local new_sasl = require "util.sasl".new;
  6. local sasl = require "util.sasl";
  7. local token_util = module:require "token/util".new(module);
  8. local sessions = prosody.full_sessions;
  9. -- no token configuration
  10. if token_util == nil then
  11. return;
  12. end
  13. -- define auth provider
  14. local provider = {};
  15. local host = module.host;
  16. -- Extract 'token' param from URL when session is created
  17. function init_session(event)
  18. local session, request = event.session, event.request;
  19. local query = request.url.query;
  20. if query ~= nil then
  21. local params = formdecode(query);
  22. session.auth_token = query and params.token or nil;
  23. -- previd is used together with https://modules.prosody.im/mod_smacks.html
  24. -- the param is used to find resumed session and re-use anonymous(random) user id
  25. -- (see get_username_from_token)
  26. session.previd = query and params.previd or nil;
  27. -- The room name and optional prefix from the bosh query
  28. session.jitsi_bosh_query_room = params.room;
  29. session.jitsi_bosh_query_prefix = params.prefix or "";
  30. end
  31. end
  32. module:hook_global("bosh-session", init_session);
  33. module:hook_global("websocket-session", init_session);
  34. function provider.test_password(username, password)
  35. return nil, "Password based auth not supported";
  36. end
  37. function provider.get_password(username)
  38. return nil;
  39. end
  40. function provider.set_password(username, password)
  41. return nil, "Set password not supported";
  42. end
  43. function provider.user_exists(username)
  44. return nil;
  45. end
  46. function provider.create_user(username, password)
  47. return nil;
  48. end
  49. function provider.delete_user(username)
  50. return nil;
  51. end
  52. function provider.get_sasl_handler(session)
  53. local function get_username_from_token(self, message)
  54. local res, error, reason = token_util:process_and_verify_token(session);
  55. if (res == false) then
  56. log("warn",
  57. "Error verifying token err:%s, reason:%s", error, reason);
  58. return res, error, reason;
  59. end
  60. local customUsername
  61. = prosody.events.fire_event("pre-jitsi-authentication", session);
  62. if (customUsername) then
  63. self.username = customUsername;
  64. elseif (session.previd ~= nil) then
  65. for _, session1 in pairs(sessions) do
  66. if (session1.resumption_token == session.previd) then
  67. self.username = session1.username;
  68. break;
  69. end
  70. end
  71. else
  72. self.username = message;
  73. end
  74. return res;
  75. end
  76. return new_sasl(host, { anonymous = get_username_from_token });
  77. end
  78. module:provides("auth", provider);
  79. local function anonymous(self, message)
  80. local username = generate_uuid();
  81. -- This calls the handler created in 'provider.get_sasl_handler(session)'
  82. local result, err, msg = self.profile.anonymous(self, username, self.realm);
  83. if result == true then
  84. if (self.username == nil) then
  85. self.username = username;
  86. end
  87. return "success";
  88. else
  89. return "failure", err, msg;
  90. end
  91. end
  92. sasl.registerMechanism("ANONYMOUS", {"anonymous"}, anonymous);