| rev | line source | 
| bsw/jbe@1309 | 1 Token = mondelefant.new_class() | 
| bsw/jbe@1309 | 2 Token.table = 'token' | 
| bsw/jbe@1309 | 3 | 
| bsw/jbe@1309 | 4 Token:add_reference{ | 
| bsw/jbe@1309 | 5   mode          = '1m', | 
| bsw/jbe@1309 | 6   to            = "TokenScope", | 
| bsw/jbe@1309 | 7   this_key      = 'id', | 
| bsw/jbe@1309 | 8   that_key      = 'token_id', | 
| bsw/jbe@1309 | 9   ref           = 'token_scopes', | 
| bsw/jbe@1309 | 10   back_ref      = 'token', | 
| bsw/jbe@1309 | 11   default_order = 'token_scope.index' | 
| bsw/jbe@1309 | 12 } | 
| bsw/jbe@1309 | 13 | 
| bsw/jbe@1309 | 14 Token:add_reference{ | 
| bsw/jbe@1309 | 15   mode          = 'm1', | 
| bsw/jbe@1309 | 16   to            = "Member", | 
| bsw/jbe@1309 | 17   this_key      = 'member_id', | 
| bsw/jbe@1309 | 18   that_key      = 'id', | 
| bsw/jbe@1309 | 19   ref           = 'member', | 
| bsw/jbe@1309 | 20 } | 
| bsw/jbe@1309 | 21 | 
| bsw/jbe@1309 | 22 Token:add_reference{ | 
| bsw/jbe@1309 | 23   mode          = 'm1', | 
| bsw/jbe@1309 | 24   to            = "Session", | 
| bsw/jbe@1309 | 25   this_key      = 'session_id', | 
| bsw/jbe@1309 | 26   that_key      = 'id', | 
| bsw/jbe@1309 | 27   ref           = 'session', | 
| bsw/jbe@1309 | 28 } | 
| bsw/jbe@1309 | 29 | 
| bsw/jbe@1309 | 30 Token:add_reference{ | 
| bsw/jbe@1309 | 31   mode          = 'm1', | 
| bsw/jbe@1309 | 32   to            = "SystemApplication", | 
| bsw/jbe@1309 | 33   this_key      = 'system_application_id', | 
| bsw/jbe@1309 | 34   that_key      = 'id', | 
| bsw/jbe@1309 | 35   ref           = 'system_application', | 
| bsw/jbe@1309 | 36 } | 
| bsw/jbe@1309 | 37 | 
| bsw/jbe@1309 | 38 function Token:new() | 
| bsw/jbe@1309 | 39   local token = self.prototype.new(self) | 
| bsw/jbe@1309 | 40   token.token = multirand.string(16, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") | 
| bsw/jbe@1309 | 41   return token | 
| bsw/jbe@1309 | 42 end | 
| bsw/jbe@1309 | 43 | 
| bsw/jbe@1309 | 44 function Token:create_authorization(member_id, system_application_id, domain, session_id, redirect_uri, redirect_uri_explicit, scopes, state) | 
| bsw/jbe@1309 | 45 | 
| bsw/jbe@1309 | 46   local detached = false | 
| bsw/jbe@1309 | 47   for i = 0, #scopes do | 
| bsw/jbe@1309 | 48     if scopes[i] then | 
| bsw/jbe@1309 | 49       for s in string.gmatch(scopes[i], "[^ ]+") do | 
| bsw/jbe@1309 | 50         if s == "detached" then | 
| bsw/jbe@1309 | 51           detached = true | 
| bsw/jbe@1309 | 52         end | 
| bsw/jbe@1309 | 53       end | 
| bsw/jbe@1309 | 54     end | 
| bsw/jbe@1309 | 55   end | 
| bsw/jbe@1309 | 56 | 
| bsw/jbe@1309 | 57   local requested_scopes = {} | 
| bsw/jbe@1309 | 58 | 
| bsw/jbe@1309 | 59   for i = 0, #scopes do | 
| bsw/jbe@1309 | 60     if scopes[i] then | 
| bsw/jbe@1309 | 61       for scope in string.gmatch(scopes[i], "[^ ]+") do | 
| bsw/jbe@1309 | 62         requested_scopes[scope] = true | 
| bsw/jbe@1309 | 63       end | 
| bsw/jbe@1309 | 64     end | 
| bsw/jbe@1309 | 65   end | 
| bsw/jbe@1309 | 66 | 
| bsw/jbe@1309 | 67   local requested_scopes_list = {} | 
| bsw/jbe@1309 | 68 | 
| bsw/jbe@1309 | 69   for k, v in pairs(requested_scopes) do | 
| bsw/jbe@1309 | 70     requested_scopes_list[#requested_scopes_list+1] = k | 
| bsw/jbe@1309 | 71   end | 
| bsw/jbe@1309 | 72 | 
| bsw/jbe@1309 | 73   local requested_scopes_string = table.concat(requested_scopes_list, " ") | 
| bsw/jbe@1309 | 74 | 
| bsw/jbe@1309 | 75   local expiry = db:query({"SELECT now() + (? || 'sec')::interval AS expiry", config.oauth2.authorization_code_lifetime }, "object").expiry | 
| bsw/jbe@1309 | 76 | 
| bsw/jbe@1309 | 77   local token = Token:new() | 
| bsw/jbe@1309 | 78   token.token_type = "authorization" | 
| bsw/jbe@1309 | 79   token.member_id = member_id | 
| bsw/jbe@1309 | 80   token.system_application_id = system_application_id | 
| bsw/jbe@1309 | 81   token.domain = domain | 
| bsw/jbe@1309 | 82   if not detached then | 
| bsw/jbe@1309 | 83     token.session_id = session_id | 
| bsw/jbe@1309 | 84   end | 
| bsw/jbe@1309 | 85   token.redirect_uri = redirect_uri | 
| bsw/jbe@1309 | 86   token.redirect_uri_explicit = redirect_uri_explicit | 
| bsw/jbe@1309 | 87   token.expiry = expiry | 
| bsw/jbe@1309 | 88   token.scope = requested_scopes_string | 
| bsw/jbe@1309 | 89 | 
| bsw/jbe@1309 | 90   token:save() | 
| bsw/jbe@1309 | 91 | 
| bsw/jbe@1309 | 92   for i = 0, #scopes do | 
| bsw/jbe@1309 | 93     if scopes[i] then | 
| bsw/jbe@1309 | 94       local token_scope = TokenScope:new() | 
| bsw/jbe@1309 | 95       token_scope.token_id = token.id | 
| bsw/jbe@1309 | 96       token_scope.index = i | 
| bsw/jbe@1309 | 97       token_scope.scope = scopes[i] | 
| bsw/jbe@1309 | 98       token_scope:save() | 
| bsw/jbe@1309 | 99     end | 
| bsw/jbe@1309 | 100   end | 
| bsw/jbe@1309 | 101 | 
| bsw/jbe@1309 | 102 | 
| bsw/jbe@1309 | 103   return token, target_uri | 
| bsw/jbe@1309 | 104 end | 
| bsw/jbe@1309 | 105 | 
| bsw/jbe@1309 | 106 function Token:by_token_type_and_token(token_type, token) | 
| bsw/jbe@1309 | 107   local selector = Token:new_selector() | 
| bsw/jbe@1309 | 108   selector:add_where{ "token_type = ?", token_type } | 
| bsw/jbe@1309 | 109   selector:add_where{ "token = ?", token } | 
| bsw/jbe@1309 | 110   selector:add_where{ "expiry > now()" } | 
| bsw/jbe@1309 | 111   selector:optional_object_mode() | 
| bsw/jbe@1309 | 112   if token_type == "authorization_code" then | 
| bsw/jbe@1309 | 113     selector:for_update() | 
| bsw/jbe@1309 | 114   end | 
| bsw/jbe@1309 | 115   if token_type == "access_token" then | 
| bsw/jbe@1309 | 116     selector:add_field("FLOOR(EXTRACT(EPOCH FROM expiry - now()))", "expiry_in") | 
| bsw/jbe@1309 | 117   end | 
| bsw/jbe@1309 | 118   return selector:exec() | 
| bsw/jbe@1309 | 119 end | 
| bsw/jbe@1309 | 120 | 
| bsw/jbe@1309 | 121 function Token:refresh_token_by_token_selector(token) | 
| bsw/jbe@1309 | 122   local selector = Token:new_selector() | 
| bsw/jbe@1309 | 123   selector:add_where{ "token_type = ?", "refresh" } | 
| bsw/jbe@1309 | 124   selector:add_where{ "member_id = ?", token.member_id } | 
| bsw/jbe@1309 | 125   if token.system_application_id then | 
| bsw/jbe@1309 | 126     selector:add_where{ "system_application_id = ?", token.system_application_id } | 
| bsw/jbe@1309 | 127   else | 
| bsw/jbe@1309 | 128     selector:add_where{ "domain = ?", token.domain } | 
| bsw/jbe@1309 | 129   end | 
| bsw/jbe@1309 | 130   return selector | 
| bsw/jbe@1309 | 131 end | 
| bsw/jbe@1309 | 132 | 
| bsw/jbe@1309 | 133 function Token:fresh_refresh_token_by_token(token) | 
| bsw/jbe@1309 | 134   local selector = Token:refresh_token_by_token_selector(token) | 
| bsw/jbe@1309 | 135   selector:add_where{ "created + ('?' || ' sec')::interval > now()", config.oauth2.refresh_pause } | 
| bsw/jbe@1309 | 136   selector:add_where{ "regexp_split_to_array(scope, E'\\\\s+') <@ regexp_split_to_array(?, E'\\\\s+')", token.scope } | 
| bsw/jbe@1309 | 137   selector:add_where{ "regexp_split_to_array(scope, E'\\\\s+') @> regexp_split_to_array(?, E'\\\\s+')", token.scope } | 
| bsw/jbe@1309 | 138   return selector:exec() | 
| bsw/jbe@1309 | 139 end | 
| bsw/jbe@1309 | 140 | 
| bsw/jbe@1309 | 141 function Token:old_refresh_token_by_token(token, scopes) | 
| bsw/jbe@1309 | 142   local selector = Token:refresh_token_by_token_selector(token) | 
| bsw/jbe@1309 | 143   selector:add_where{ "id < ?", token.id } | 
| bsw/jbe@1309 | 144   selector:add_where{ "created + ('?' || ' sec')::interval <= now()", config.oauth2.refresh_grace_period } | 
| bsw/jbe@1309 | 145   selector:add_where{ "regexp_split_to_array(scope, E'\\\\s+') && regexp_split_to_array(?, E'\\\\s+')", scopes } | 
| bsw/jbe@1309 | 146   return selector:exec() | 
| bsw/jbe@1309 | 147 end |