liquid_feedback_frontend

diff model/member.lua @ 1071:58f48a8a202a

Imported and merged LDAP patch
author bsw
date Fri Jul 18 21:42:59 2014 +0200 (2014-07-18)
parents 701a5cf6b067
children aefef1556d55
line diff
     1.1 --- a/model/member.lua	Thu Jul 17 23:38:35 2014 +0200
     1.2 +++ b/model/member.lua	Fri Jul 18 21:42:59 2014 +0200
     1.3 @@ -273,6 +273,17 @@
     1.4    self.get_db_conn().query("LOCK TABLE " .. self:get_qualified_table() .. " IN ROW SHARE MODE")
     1.5  end
     1.6  
     1.7 +
     1.8 +function Member:get_all_by_authority(authority)
     1.9 +  
    1.10 +  local members = Member:new_selector()
    1.11 +    :add_where{ "authority = ?", authority }
    1.12 +    :add_field("authority_data->'uid' as authority_data_uid")
    1.13 +    :exec()
    1.14 +    
    1.15 +  return members
    1.16 +end
    1.17 +
    1.18  function Member.object:set_password(password)
    1.19    trace.disable()
    1.20    
    1.21 @@ -372,17 +383,144 @@
    1.22  end
    1.23  
    1.24  function Member:by_login_and_password(login, password)
    1.25 -  local selector = self:new_selector()
    1.26 -  selector:add_field({ "now() > COALESCE(last_delegation_check, activated) + ?::interval", config.check_delegations_interval_hard }, "needs_delegation_check_hard")
    1.27 -  selector:add_where{'"login" = ?', login }
    1.28 -  selector:add_where('NOT "locked"')
    1.29 -  selector:optional_object_mode()
    1.30 -  local member = selector:exec()
    1.31 -  if member and member:check_password(password) then
    1.32 -    return member
    1.33 -  else
    1.34 -    return nil
    1.35 + 
    1.36 +  local function prepare_login_selector()
    1.37 +    local selector = self:new_selector()
    1.38 +    selector:add_field({ "now() > COALESCE(last_delegation_check, activated) + ?::interval", config.check_delegations_interval_hard }, "needs_delegation_check_hard")
    1.39 +    selector:add_where('NOT "locked"')
    1.40 +    selector:optional_object_mode()
    1.41 +    return selector
    1.42 +  end
    1.43 +  
    1.44 +  local function do_local_login()
    1.45 +    local selector = prepare_login_selector()
    1.46 +    selector:add_where{'"login" = ?', login }
    1.47 +    local member = selector:exec()
    1.48 +    if member and member:check_password(password) then
    1.49 +      return member
    1.50 +    else
    1.51 +      return nil
    1.52 +    end
    1.53    end
    1.54 +  
    1.55 +  if config.ldap.member then
    1.56 +
    1.57 +    -- Let's check the users credentials against the LDAP      
    1.58 +    local ldap_entry, ldap_err = ldap.check_credentials(login, password)
    1.59 +
    1.60 +    -- Is the user already registered as member?
    1.61 +    local uid
    1.62 +    local selector = prepare_login_selector()
    1.63 +
    1.64 +    -- Get login name from LDAP entry
    1.65 +    if ldap_entry then
    1.66 +      uid = config.ldap.member.uid_map(ldap_entry)
    1.67 +      selector:add_where{'"authority" = ? AND "authority_data"->\'uid\' = ?', "ldap", uid }
    1.68 +
    1.69 +    -- or build it from the login
    1.70 +    else
    1.71 +      login = config.ldap.member.login_normalizer(login)
    1.72 +      selector:add_where{'"authority" = ? AND "authority_data"->\'login\' = ?', "ldap", login }
    1.73 +    end
    1.74 +    
    1.75 +    local member = selector:exec()
    1.76 +    -- The member is already registered
    1.77 +    if member then
    1.78 +
    1.79 +      -- The credentials entered by the user are invalid
    1.80 +      if ldap_err == "invalid_credentials" then
    1.81 +        
    1.82 +        -- Check if the user tried a cached password (which is invalid now)
    1.83 +        if config.ldap.member.cache_passwords and member:check_password(password) then
    1.84 +          member.password = nil
    1.85 +          member:save()
    1.86 +        end
    1.87 +        
    1.88 +        -- Try a regular login
    1.89 +        return do_local_login()
    1.90 +
    1.91 +      end
    1.92 +      
    1.93 +      -- The credentials were accepted by the LDAP server and no error occured
    1.94 +      if ldap_entry and not ldap_err then
    1.95 +        
    1.96 +        -- Cache the password (if feature enabled)
    1.97 +        if config.ldap.member.cache_passwords and not member:check_password(password) then
    1.98 +          member:set_password(password)
    1.99 +        end
   1.100 +
   1.101 +        -- update the member attributes and privileges from LDAP
   1.102 +        local ldap_conn, ldap_err, err, err2 = ldap.update_member_attr(member, nil, uid)
   1.103 +        if not err then
   1.104 +          local err = member:try_save()
   1.105 +          if err then
   1.106 +            return nil, "member_save_error", err
   1.107 +          end
   1.108 +          local succes, err, err2 = ldap.update_member_privileges(member, ldap_entry)
   1.109 +          if err then
   1.110 +            return nil, "update_member_privileges_error", err, err2
   1.111 +          end
   1.112 +          return member
   1.113 +        end
   1.114 +
   1.115 +      end
   1.116 +
   1.117 +      -- Some kind of LDAP error happened, if cached password are enabled,
   1.118 +      -- check user credentials against the cache
   1.119 +      if config.ldap.member.cache_passwords and member:check_password(password) then
   1.120 +
   1.121 +        -- return the successfully logged in member
   1.122 +        return member
   1.123 +
   1.124 +      end
   1.125 +      
   1.126 +    -- The member is not registered
   1.127 +    elseif config.ldap.member.registration and ldap_entry and not ldap_err then
   1.128 +      -- Automatic registration ("auto")
   1.129 +      if config.ldap.member.registration == "auto" then
   1.130 +        member = Member:new()
   1.131 +        member.authority = "ldap"
   1.132 +        local ldap_login
   1.133 +        if config.ldap.member.cache_passwords then 
   1.134 +          if config.ldap.member.login_normalizer then
   1.135 +            ldap_login = config.ldap.member.login_normalizer(login)
   1.136 +          else
   1.137 +            ldap_login = login
   1.138 +          end
   1.139 +        end
   1.140 +        -- TODO change this when SQL layers supports hstore
   1.141 +        member.authority_data = encode.pg_hstore{
   1.142 +          uid = uid,
   1.143 +          login = ldap_login
   1.144 +        }
   1.145 +        member.activated = "now"
   1.146 +        member.last_activity = "now"
   1.147 +        if config.ldap.member.cache_passwords then
   1.148 +          member:set_password(password)
   1.149 +        end
   1.150 +        local ldap_conn, ldap_err, err, err2 = ldap.update_member_attr(member, nil, uid)
   1.151 +        if not err then
   1.152 +          local err = member:try_save()
   1.153 +          if err then
   1.154 +            return nil, "member_save_error", err
   1.155 +          end
   1.156 +          local success, err, err2 = ldap.update_member_privileges(member, ldap_entry)
   1.157 +          if err then
   1.158 +            return nil, "update_member_privileges_error", err, err2
   1.159 +          end
   1.160 +          return member
   1.161 +        end
   1.162 +
   1.163 +      -- No automatic registration
   1.164 +      else
   1.165 +        return nil, "ldap_credentials_valid_but_no_member", uid
   1.166 +      end
   1.167 +    end
   1.168 +    
   1.169 +  end
   1.170 +
   1.171 +  return do_local_login()
   1.172 +  
   1.173  end
   1.174  
   1.175  function Member:by_login(login)

Impressum / About Us