rev |
line source |
bsw@1703
|
1 local provider = param.get("provider")
|
bsw@1703
|
2 local provider_config = config.oauth2_providers[provider]
|
bsw@1703
|
3 if not provider_config then
|
bsw@1703
|
4 return
|
bsw@1703
|
5 end
|
bsw@1703
|
6
|
bsw@1703
|
7
|
bsw@1703
|
8 local error = param.get("error")
|
bsw@1703
|
9
|
bsw@1703
|
10 if error then
|
bsw@1703
|
11 ui.heading{ content = "OAuth error" }
|
bsw@1703
|
12 ui.container{ content = error }
|
bsw@1703
|
13 return
|
bsw@1703
|
14 end
|
bsw@1703
|
15
|
bsw@1703
|
16 local state = param.get("state")
|
bsw@1703
|
17
|
bsw@1703
|
18 if state ~= app.session:additional_secret_for("oauth") then
|
bsw@1703
|
19 ui.heading{ content = "OAuth error" }
|
bsw@1703
|
20 ui.container{ content = "state invalid" }
|
bsw@1703
|
21 return
|
bsw@1703
|
22 end
|
bsw@1703
|
23
|
bsw@1703
|
24 local code = param.get("code")
|
bsw@1703
|
25
|
bsw@1703
|
26 local params = {
|
bsw@1703
|
27 code = code,
|
bsw@1703
|
28 client_id = provider_config.client_id,
|
bsw@1703
|
29 client_secret = provider_config.client_secret,
|
bsw@1703
|
30 redirect_uri = request.get_absolute_baseurl() .. "oauth2_client/callback.html?provider=" .. provider,
|
bsw@1703
|
31 grant_type = "authorization_code"
|
bsw@1703
|
32 }
|
bsw@1703
|
33
|
bsw@1703
|
34 local params_list = {}
|
bsw@1703
|
35 for key, val in pairs(params) do
|
bsw@1703
|
36 table.insert(params_list, encode.url_part(key) .. "=" .. encode.url_part(val))
|
bsw@1703
|
37 end
|
bsw@1703
|
38
|
bsw@1703
|
39 local r = table.concat(params_list, "&")
|
bsw@1703
|
40
|
bsw@1703
|
41 local output, err, status = extos.pfilter(nil, "curl", "-X", "POST", "-d", r, provider_config.token_url)
|
bsw@1703
|
42
|
bsw@1703
|
43 local result = json.import(output)
|
bsw@1703
|
44
|
bsw@1703
|
45 local url = provider_config.id_url .. "?access_token=" .. encode.url_part(result.access_token)
|
bsw@1703
|
46
|
bsw@1703
|
47 local output, err, status = extos.pfilter(nil, "curl", url)
|
bsw@1703
|
48
|
bsw@1703
|
49 local id_result = json.import(output)
|
bsw@1703
|
50
|
bsw@1703
|
51 local id = id_result[provider_config.id_field]
|
bsw@1703
|
52 local email = id_result[provider_config.email_field]
|
bsw@1703
|
53
|
bsw@1703
|
54 if id then
|
bsw@1703
|
55 local member = Member:new_selector()
|
bsw@1703
|
56 :add_where{ "authority = ?", "oauth2_" .. provider }
|
bsw@1703
|
57 :add_where{ "authority_uid = ?", id }
|
bsw@1703
|
58 :optional_object_mode()
|
bsw@1703
|
59 :exec()
|
bsw@1703
|
60
|
bsw@1703
|
61 if not member then
|
bsw@1703
|
62 member = Member:new()
|
bsw@1703
|
63 member.authority = "oauth2_" .. provider
|
bsw@1703
|
64 member.authority_uid = id
|
bsw@1703
|
65 member.notify_email = email
|
bsw@1703
|
66 member.name = "Member " .. id
|
bsw@1703
|
67 member.identification = "Member " .. id
|
bsw@1703
|
68 member.activated = "now"
|
bsw@1703
|
69 member:save()
|
bsw@1703
|
70 for i, unit_id in ipairs(provider_config.unit_ids) do
|
bsw@1703
|
71 local privilege = Privilege:new()
|
bsw@1703
|
72 privilege.member_id = member.id
|
bsw@1703
|
73 privilege.unit_id = unit_id
|
bsw@1703
|
74 privilege.initiative_right = true
|
bsw@1703
|
75 privilege.voting_right = true
|
bsw@1703
|
76 privilege:save()
|
bsw@1703
|
77 end
|
bsw@1703
|
78 end
|
bsw@1703
|
79 member.last_login = "now"
|
bsw@1703
|
80 member.last_activity = "now"
|
bsw@1703
|
81 member.active = true
|
bsw@1703
|
82 member:save()
|
bsw@1703
|
83 app.session.member = member
|
bsw@1703
|
84 app.session:save()
|
bsw@1703
|
85 request.redirect{ external = request.get_absolute_baseurl() }
|
bsw@1703
|
86
|
bsw@1703
|
87 end
|
bsw@1703
|
88
|