FEATURE: Allow provider to set email verification state (#17)
This commit is contained in:
parent
725717339e
commit
ef5b3ee1ff
|
@ -12,6 +12,7 @@ en:
|
||||||
oauth2_json_username_path: 'Path in the OAuth2 User JSON to the username. eg: user.username'
|
oauth2_json_username_path: 'Path in the OAuth2 User JSON to the username. eg: user.username'
|
||||||
oauth2_json_name_path: "Path in the OAuth2 User JSON to the user's full: user.name.full"
|
oauth2_json_name_path: "Path in the OAuth2 User JSON to the user's full: user.name.full"
|
||||||
oauth2_json_email_path: "Path in the OAuth2 User JSON to the user's email: user.email.primary"
|
oauth2_json_email_path: "Path in the OAuth2 User JSON to the user's email: user.email.primary"
|
||||||
|
oauth2_json_email_verified_path: "Path in the OAuth2 User JSON to the user's email verification state: user.email.verified"
|
||||||
oauth2_json_avatar_path: "Path in the Oauth2 User JSON to the user's avatar: user.avatar_url"
|
oauth2_json_avatar_path: "Path in the Oauth2 User JSON to the user's avatar: user.avatar_url"
|
||||||
oauth2_email_verified: "Check this if the OAuth2 site has verified the email"
|
oauth2_email_verified: "Check this if the OAuth2 site has verified the email"
|
||||||
oauth2_overrides_email: "Override the Discourse email with the remote email on every login"
|
oauth2_overrides_email: "Override the Discourse email with the remote email on every login"
|
||||||
|
|
|
@ -23,6 +23,7 @@ login:
|
||||||
oauth2_json_username_path: ''
|
oauth2_json_username_path: ''
|
||||||
oauth2_json_name_path: ''
|
oauth2_json_name_path: ''
|
||||||
oauth2_json_email_path: ''
|
oauth2_json_email_path: ''
|
||||||
|
oauth2_json_email_verified_path: ''
|
||||||
oauth2_json_avatar_path: ''
|
oauth2_json_avatar_path: ''
|
||||||
oauth2_email_verified: false
|
oauth2_email_verified: false
|
||||||
oauth2_overrides_email: false
|
oauth2_overrides_email: false
|
||||||
|
|
|
@ -104,6 +104,7 @@ class OAuth2BasicAuthenticator < ::Auth::OAuth2Authenticator
|
||||||
json_walk(result, user_json, :username)
|
json_walk(result, user_json, :username)
|
||||||
json_walk(result, user_json, :name)
|
json_walk(result, user_json, :name)
|
||||||
json_walk(result, user_json, :email)
|
json_walk(result, user_json, :email)
|
||||||
|
json_walk(result, user_json, :email_verified)
|
||||||
json_walk(result, user_json, :avatar)
|
json_walk(result, user_json, :avatar)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -120,14 +121,14 @@ class OAuth2BasicAuthenticator < ::Auth::OAuth2Authenticator
|
||||||
result.name = user_details[:name]
|
result.name = user_details[:name]
|
||||||
result.username = user_details[:username]
|
result.username = user_details[:username]
|
||||||
result.email = user_details[:email]
|
result.email = user_details[:email]
|
||||||
result.email_valid = result.email.present? && SiteSetting.oauth2_email_verified?
|
result.email_valid = result.email.present? && (user_details[:email_verified] || SiteSetting.oauth2_email_verified?)
|
||||||
avatar_url = user_details[:avatar]
|
avatar_url = user_details[:avatar]
|
||||||
|
|
||||||
current_info = ::PluginStore.get("oauth2_basic", "oauth2_basic_user_#{user_details[:user_id]}")
|
current_info = ::PluginStore.get("oauth2_basic", "oauth2_basic_user_#{user_details[:user_id]}")
|
||||||
if current_info
|
if current_info
|
||||||
result.user = User.where(id: current_info[:user_id]).first
|
result.user = User.where(id: current_info[:user_id]).first
|
||||||
result.user&.update!(email: result.email) if SiteSetting.oauth2_overrides_email && result.email
|
result.user&.update!(email: result.email) if SiteSetting.oauth2_overrides_email && result.email
|
||||||
elsif SiteSetting.oauth2_email_verified?
|
elsif result.email_valid
|
||||||
result.user = User.find_by_email(result.email)
|
result.user = User.find_by_email(result.email)
|
||||||
if result.user && user_details[:user_id]
|
if result.user && user_details[:user_id]
|
||||||
::PluginStore.set("oauth2_basic", "oauth2_basic_user_#{user_details[:user_id]}", user_id: result.user.id)
|
::PluginStore.set("oauth2_basic", "oauth2_basic_user_#{user_details[:user_id]}", user_id: result.user.id)
|
||||||
|
|
|
@ -71,6 +71,25 @@ describe OAuth2BasicAuthenticator do
|
||||||
expect(result.user.email).to eq("newemail@example.com")
|
expect(result.user.email).to eq("newemail@example.com")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'validates user email if provider has verified' do
|
||||||
|
SiteSetting.oauth2_email_verified = false
|
||||||
|
|
||||||
|
# Check it's working
|
||||||
|
authenticator.stubs(:fetch_user_details).returns(email: user.email, email_verified: true)
|
||||||
|
result = authenticator.after_authenticate(auth)
|
||||||
|
expect(result.email_valid).to eq(true)
|
||||||
|
|
||||||
|
authenticator.stubs(:fetch_user_details).returns(email: user.email, email_verified: nil)
|
||||||
|
result = authenticator.after_authenticate(auth)
|
||||||
|
expect(result.email_valid).to eq(false)
|
||||||
|
|
||||||
|
# Check it doesn't interfere with the site setting
|
||||||
|
SiteSetting.oauth2_email_verified = true
|
||||||
|
authenticator.stubs(:fetch_user_details).returns(email: user.email, email_verified: false)
|
||||||
|
result = authenticator.after_authenticate(auth)
|
||||||
|
expect(result.email_valid).to eq(true)
|
||||||
|
end
|
||||||
|
|
||||||
context 'avatar downloading' do
|
context 'avatar downloading' do
|
||||||
before { SiteSetting.queue_jobs = true }
|
before { SiteSetting.queue_jobs = true }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue