| rev | line source | 
| bsw/jbe@1309 | 1 local member_id = param.get("member_id", atom.integer) | 
| bsw/jbe@1309 | 2 local system_application_id = param.get("system_application_id", atom.integer) | 
| bsw/jbe@1309 | 3 local domain = param.get("domain") | 
| bsw/jbe@1309 | 4 local session_id = param.get("session_id", atom.integer) | 
| bsw/jbe@1309 | 5 local redirect_uri = param.get("redirect_uri") | 
| bsw/jbe@1309 | 6 local redirect_uri_explicit = param.get("redirect_uri_explicit", atom.boolean) | 
| bsw/jbe@1309 | 7 local scopes = param.get("scopes", "table") | 
| bsw/jbe@1309 | 8 local state = param.get("state") | 
| bsw/jbe@1309 | 9 local response_type = param.get("response_type") | 
| bsw/jbe@1309 | 10 | 
| bsw/jbe@1309 | 11 if response_type == "code" then | 
| bsw/jbe@1309 | 12 | 
| bsw/jbe@1309 | 13   local token = Token:create_authorization( | 
| bsw/jbe@1309 | 14     member_id, | 
| bsw/jbe@1309 | 15     system_application_id, | 
| bsw/jbe@1309 | 16     domain, | 
| bsw/jbe@1309 | 17     session_id, | 
| bsw/jbe@1309 | 18     redirect_uri, | 
| bsw/jbe@1309 | 19     redirect_uri_explicit, | 
| bsw/jbe@1309 | 20     scopes, | 
| bsw/jbe@1309 | 21     state | 
| bsw/jbe@1309 | 22   ) | 
| bsw/jbe@1309 | 23 | 
| bsw/jbe@1309 | 24   request.redirect{ | 
| bsw/jbe@1309 | 25     external = redirect_uri, | 
| bsw/jbe@1309 | 26     params = { code = token.token, state = state } | 
| bsw/jbe@1309 | 27   } | 
| bsw/jbe@1309 | 28 | 
| bsw/jbe@1309 | 29 | 
| bsw/jbe@1309 | 30 elseif response_type == "token" then | 
| bsw/jbe@1309 | 31 | 
| bsw/jbe@1309 | 32   local expiry = db:query({ "SELECT now() + (? || 'sec')::interval AS access", config.oauth2.access_token_lifetime }, "object").access | 
| bsw/jbe@1309 | 33 | 
| bsw/jbe@1309 | 34   local anchor_params = { | 
| bsw/jbe@1309 | 35     state = state, | 
| bsw/jbe@1309 | 36     expires_in = config.oauth2.access_token_lifetime, | 
| bsw/jbe@1309 | 37     token_type = "bearer" | 
| bsw/jbe@1309 | 38   } | 
| bsw/jbe@1309 | 39 | 
| bsw/jbe@1309 | 40   for i = 0, #scopes do | 
| bsw/jbe@1309 | 41     if scopes[i] then | 
| bsw/jbe@1309 | 42       local access_token = Token:new() | 
| bsw/jbe@1309 | 43       access_token.token_type = "access" | 
| bsw/jbe@1309 | 44       access_token.member_id = member_id | 
| bsw/jbe@1309 | 45       access_token.system_application_id = system_application_id | 
| bsw/jbe@1309 | 46       access_token.domain = domain | 
| bsw/jbe@1309 | 47       access_token.session_id = session_id | 
| bsw/jbe@1309 | 48       access_token.expiry = expiry | 
| bsw/jbe@1309 | 49       access_token.scope = scopes[i] | 
| bsw/jbe@1309 | 50       access_token:save() | 
| bsw/jbe@1309 | 51       local index = i == 0 and "" or i | 
| bsw/jbe@1309 | 52       anchor_params["access_token" .. index] = access_token.token | 
| bsw/jbe@1309 | 53     end | 
| bsw/jbe@1309 | 54   end | 
| bsw/jbe@1309 | 55 | 
| bsw/jbe@1309 | 56   local anchor_params_list = {} | 
| bsw/jbe@1309 | 57   for k, v in pairs(anchor_params) do | 
| bsw/jbe@1309 | 58     anchor_params_list[#anchor_params_list+1] = k .. "=" .. encode.url_part(v) | 
| bsw/jbe@1309 | 59   end | 
| bsw/jbe@1309 | 60   local anchor = table.concat(anchor_params_list, "&") | 
| bsw/jbe@1309 | 61 | 
| bsw/jbe@1309 | 62   request.redirect{ | 
| bsw/jbe@1309 | 63     external = redirect_uri .. "#" .. anchor | 
| bsw/jbe@1309 | 64   } | 
| bsw/jbe@1309 | 65 | 
| bsw/jbe@1309 | 66 else | 
| bsw/jbe@1309 | 67 | 
| bsw/jbe@1309 | 68   error("Internal error, should not happen") | 
| bsw/jbe@1309 | 69 | 
| bsw/jbe@1309 | 70 end |