rev |
line source |
bsw/jbe@1309
|
1 DynamicApplicationScope = mondelefant.new_class()
|
bsw/jbe@1309
|
2 DynamicApplicationScope.table = 'dynamic_application_scope'
|
bsw/jbe@1309
|
3 DynamicApplicationScope.primary_key = { "redirect_uri", "flow", "scope" }
|
bsw/jbe@1309
|
4
|
bsw/jbe@1309
|
5 function DynamicApplicationScope:by_redirect_uri_and_flow(redirect_uri, flow)
|
bsw/jbe@1309
|
6 local dynamic_application_scopes = self:new_selector()
|
bsw/jbe@1309
|
7 :add_where{ "redirect_uri = ?", redirect_uri }
|
bsw/jbe@1309
|
8 :add_where{ "flow = ?", flow }
|
bsw/jbe@1309
|
9 :add_where("expiry >= now()")
|
bsw/jbe@1309
|
10 :exec()
|
bsw/jbe@1309
|
11 return dynamic_application_scopes
|
bsw/jbe@1309
|
12 end
|
bsw/jbe@1309
|
13
|
bsw/jbe@1309
|
14 function DynamicApplicationScope:check_scopes(domain, redirect_uri, requested_flow, requested_scopes)
|
bsw/jbe@1309
|
15 local function check_scopes(permitted_scopes)
|
bsw/jbe@1309
|
16 local missing_scope = false
|
bsw/jbe@1309
|
17 for scope in pairs(requested_scopes) do
|
bsw/jbe@1309
|
18 if not permitted_scopes[scope] then
|
bsw/jbe@1309
|
19 missing_scope = true
|
bsw/jbe@1309
|
20 end
|
bsw/jbe@1309
|
21 end
|
bsw/jbe@1309
|
22 return missing_scope
|
bsw/jbe@1309
|
23 end
|
bsw/jbe@1309
|
24
|
bsw/jbe@1309
|
25 local registered = false
|
bsw/jbe@1309
|
26 local missing_scope = false
|
bsw/jbe@1309
|
27
|
bsw/jbe@1309
|
28 local dynamic_application_scopes = DynamicApplicationScope:by_redirect_uri_and_flow(redirect_uri, requested_flow)
|
bsw/jbe@1309
|
29
|
bsw/jbe@1309
|
30 if #dynamic_application_scopes > 0 then
|
bsw/jbe@1309
|
31 registered = true
|
bsw/jbe@1309
|
32 local permitted_scopes = {}
|
bsw/jbe@1309
|
33 for i, dynamic_application_scope in ipairs(dynamic_application_scopes) do
|
bsw/jbe@1309
|
34 permitted_scopes[dynamic_application_scope.scope] = true
|
bsw/jbe@1309
|
35 end
|
bsw/jbe@1309
|
36 missing_scope = check_scopes(permitted_scopes)
|
bsw/jbe@1309
|
37 end
|
bsw/jbe@1309
|
38
|
bsw/jbe@1309
|
39 if not registered or missing_scope then
|
bsw/jbe@1309
|
40 local output, err, status = config.oauth2.host_func("_liquidfeedback_client." .. domain)
|
bsw/jbe@1309
|
41 if output == nil then
|
bsw/jbe@1309
|
42 error("Cannot execute host_func command")
|
bsw/jbe@1309
|
43 end
|
bsw/jbe@1309
|
44 if status == 0 then
|
bsw/jbe@1309
|
45 for line in string.gmatch(output, "[^\r\n]+") do
|
bsw/jbe@1309
|
46 local flow, result = string.match(line, '"dynamic client v1" "([^"]+)" (.+)$')
|
bsw/jbe@1309
|
47 if flow == requested_flow then
|
bsw/jbe@1309
|
48 registered = true
|
bsw/jbe@1309
|
49 local permitted_scopes = {}
|
bsw/jbe@1309
|
50 local wildcard = false
|
bsw/jbe@1309
|
51 for entry in string.gmatch(result, '"([^"]+)"') do
|
bsw/jbe@1309
|
52 if entry == "*" then
|
bsw/jbe@1309
|
53 wildcard = true
|
bsw/jbe@1309
|
54 break
|
bsw/jbe@1309
|
55 end
|
bsw/jbe@1309
|
56 permitted_scopes[entry] = true
|
bsw/jbe@1309
|
57 end
|
bsw/jbe@1309
|
58 if not wildcard then
|
bsw/jbe@1309
|
59 missing_scope = check_scopes(permitted_scopes)
|
bsw/jbe@1309
|
60 end
|
bsw/jbe@1309
|
61 end
|
bsw/jbe@1309
|
62 end
|
bsw/jbe@1309
|
63 end
|
bsw/jbe@1309
|
64 end
|
bsw/jbe@1309
|
65
|
bsw/jbe@1309
|
66 if not registered then
|
bsw/jbe@1309
|
67 return "not_registered"
|
bsw/jbe@1309
|
68 elseif missing_scope then
|
bsw/jbe@1309
|
69 return "missing_scope"
|
bsw/jbe@1309
|
70 else
|
bsw/jbe@1309
|
71 return "ok"
|
bsw/jbe@1309
|
72 end
|
bsw/jbe@1309
|
73 end
|