| 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 
 |