diff options
author | CSDUMMI <31551856+CSDUMMI@users.noreply.github.com> | 2023-08-03 16:43:15 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-03 16:43:15 +0200 |
commit | 120f5802c011fa62eb417d5434c54f33506f6a69 (patch) | |
tree | f15602564512d3e65f29e37c41bbc2caa7c54c78 /app | |
parent | a5768d3ea699bcc4e8e3cd542bcb1382e2683e33 (diff) |
Add direct link to the Single-Sign On provider if there is only one sign up method available (#26083)
Diffstat (limited to 'app')
7 files changed, 81 insertions, 32 deletions
diff --git a/app/controllers/concerns/web_app_controller_concern.rb b/app/controllers/concerns/web_app_controller_concern.rb index 6cd32a377c6..3a40ea38236 100644 --- a/app/controllers/concerns/web_app_controller_concern.rb +++ b/app/controllers/concerns/web_app_controller_concern.rb @@ -11,7 +11,7 @@ module WebAppControllerConcern end def skip_csrf_meta_tags? - current_user.nil? + !(ENV['OMNIAUTH_ONLY'] == 'true' && Devise.omniauth_providers.length == 1) && current_user.nil? end def set_app_body_class diff --git a/app/javascript/mastodon/features/interaction_modal/index.jsx b/app/javascript/mastodon/features/interaction_modal/index.jsx index 6b6768ac322..a8b86b7212e 100644 --- a/app/javascript/mastodon/features/interaction_modal/index.jsx +++ b/app/javascript/mastodon/features/interaction_modal/index.jsx @@ -13,7 +13,7 @@ import { openModal, closeModal } from 'mastodon/actions/modal'; import api from 'mastodon/api'; import Button from 'mastodon/components/button'; import { Icon } from 'mastodon/components/icon'; -import { registrationsOpen } from 'mastodon/initial_state'; +import { registrationsOpen, sso_redirect } from 'mastodon/initial_state'; const messages = defineMessages({ loginPrompt: { id: 'interaction_modal.login.prompt', defaultMessage: 'Domain of your home server, e.g. mastodon.social' }, @@ -331,18 +331,36 @@ class InteractionModal extends React.PureComponent { } let signupButton; + let signUpOrSignInButton; - if (registrationsOpen) { - signupButton = ( - <a href='/auth/sign_up' className='link-button'> - <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' /> + if (sso_redirect) { + signUpOrSignInButton = ( + <a href={sso_redirect} data-method='post' className='button button--block button-tertiary'> + <FormattedMessage id='sign_in_banner.sso_redirect' defaultMessage='Login or Register' /> </a> - ); + ) } else { - signupButton = ( - <button className='link-button' onClick={this.handleSignupClick}> - <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' /> - </button> + if(registrationsOpen) { + signupButton = ( + <a href='/auth/sign_up' className='link-button'> + <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' /> + </a> + ); + } else { + signupButton = ( + <button className='button button--block button-tertiary' onClick={this.handleSignupClick}> + <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' /> + </button> + ); + } + + signUpOrSignInButton = ( + <> + <a href='/auth/sign_in' className='button button--block'> + <FormattedMessage id='sign_in_banner.sign_in' defaultMessage='Login' /> + </a> + {signupButton} + </> ); } @@ -353,6 +371,13 @@ class InteractionModal extends React.PureComponent { <p>{actionDescription} <strong><FormattedMessage id='interaction_modal.sign_in' defaultMessage='You are not logged in to this server. Where is your account hosted?' /></strong></p> </div> + <div className='interaction-modal__choices'> + <div className='interaction-modal__choices__choice'> + <h3><FormattedMessage id='interaction_modal.on_this_server' defaultMessage='On this server' /></h3> + {signUpOrSignInButton} + </div> + </div> + <IntlLoginForm resourceUrl={url} /> <p className='hint'><FormattedMessage id='interaction_modal.sign_in_hint' defaultMessage="Tip: That's the website where you signed up. If you don't remember, look for the welcome e-mail in your inbox. You can also enter your full username! (e.g. @Mastodon@mastodon.social)" /></p> diff --git a/app/javascript/mastodon/features/ui/components/header.jsx b/app/javascript/mastodon/features/ui/components/header.jsx index 3d249e8d4f1..68484b59ab0 100644 --- a/app/javascript/mastodon/features/ui/components/header.jsx +++ b/app/javascript/mastodon/features/ui/components/header.jsx @@ -12,7 +12,7 @@ import { fetchServer } from 'mastodon/actions/server'; import { Avatar } from 'mastodon/components/avatar'; import { Icon } from 'mastodon/components/icon'; import { WordmarkLogo, SymbolLogo } from 'mastodon/components/logo'; -import { registrationsOpen, me } from 'mastodon/initial_state'; +import { registrationsOpen, me, sso_redirect } from 'mastodon/initial_state'; const Account = connect(state => ({ account: state.getIn(['accounts', me]), @@ -73,28 +73,35 @@ class Header extends PureComponent { </> ); } else { - let signupButton; - if (registrationsOpen) { - signupButton = ( - <a href={signupUrl} className='button'> - <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' /> - </a> - ); + if (sso_redirect) { + content = ( + <a href={sso_redirect} data-method='post' className='button button--block button-tertiary'><FormattedMessage id='sign_in_banner.sso_redirect' defaultMessage='Login or Register' /></a> + ) } else { - signupButton = ( - <button className='button' onClick={openClosedRegistrationsModal}> - <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' /> - </button> + let signupButton; + + if (registrationsOpen) { + signupButton = ( + <a href={signupUrl} className='button'> + <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' /> + </a> + ); + } else { + signupButton = ( + <button className='button' onClick={openClosedRegistrationsModal}> + <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' /> + </button> + ); + } + + content = ( + <> + {signupButton} + <a href='/auth/sign_in' className='button button-tertiary'><FormattedMessage id='sign_in_banner.sign_in' defaultMessage='Login' /></a> + </> ); } - - content = ( - <> - {signupButton} - <a href='/auth/sign_in' className='button button-tertiary'><FormattedMessage id='sign_in_banner.sign_in' defaultMessage='Login' /></a> - </> - ); } return ( diff --git a/app/javascript/mastodon/features/ui/components/sign_in_banner.jsx b/app/javascript/mastodon/features/ui/components/sign_in_banner.jsx index e44b797692e..db85c6cbfbf 100644 --- a/app/javascript/mastodon/features/ui/components/sign_in_banner.jsx +++ b/app/javascript/mastodon/features/ui/components/sign_in_banner.jsx @@ -4,7 +4,7 @@ import { FormattedMessage } from 'react-intl'; import { openModal } from 'mastodon/actions/modal'; -import { registrationsOpen } from 'mastodon/initial_state'; +import { registrationsOpen, sso_redirect } from 'mastodon/initial_state'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; const SignInBanner = () => { @@ -17,7 +17,16 @@ const SignInBanner = () => { let signupButton; - const signupUrl = useAppSelector((state) => state.getIn(['server', 'server', 'registrations', 'url'], null) || '/auth/sign_up'); + const signupUrl = useAppSelector((state) => state.getIn(['server', 'server', 'registrations', 'url'], null) || '/auth/sign_up'); + + if (sso_redirect) { + return ( + <div className='sign-in-banner'> + <p><FormattedMessage id='sign_in_banner.text' defaultMessage='Login to follow profiles or hashtags, favorite, share and reply to posts. You can also interact from your account on a different server.' /></p> + <a href={sso_redirect} data-method='post' className='button button--block button-tertiary'><FormattedMessage id='sign_in_banner.sso_redirect' defaultMessage='Login or Register' /></a> + </div> + ) + } if (registrationsOpen) { signupButton = ( diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js index 1ada5bfb939..85792a4ea45 100644 --- a/app/javascript/mastodon/initial_state.js +++ b/app/javascript/mastodon/initial_state.js @@ -80,6 +80,7 @@ * @property {boolean} use_blurhash * @property {boolean=} use_pending_items * @property {string} version + * @property {string} sso_redirect */ /** @@ -141,5 +142,6 @@ export const version = getMeta('version'); export const languages = initialState?.languages; // @ts-expect-error export const statusPageUrl = getMeta('status_page_url'); +export const sso_redirect = getMeta('sso_redirect'); export default initialState; diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 1457db329be..2c901f3bd64 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -598,6 +598,7 @@ "server_banner.server_stats": "Server stats:", "sign_in_banner.create_account": "Create account", "sign_in_banner.sign_in": "Login", + "sign_in_banner.sso_redirect": "Login or Register", "sign_in_banner.text": "Login to follow profiles or hashtags, favorite, share and reply to posts. You can also interact from your account on a different server.", "status.admin_account": "Open moderation interface for @{name}", "status.admin_domain": "Open moderation interface for {domain}", diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index bda06ef1f11..9660c941d02 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -32,6 +32,7 @@ class InitialStateSerializer < ActiveModel::Serializer single_user_mode: Rails.configuration.x.single_user_mode, trends_as_landing_page: Setting.trends_as_landing_page, status_page_url: Setting.status_page_url, + sso_redirect: sso_redirect, } if object.current_account @@ -108,4 +109,8 @@ class InitialStateSerializer < ActiveModel::Serializer def instance_presenter @instance_presenter ||= InstancePresenter.new end + + def sso_redirect + "/auth/auth/#{Devise.omniauth_providers[0]}" if ENV['OMNIAUTH_ONLY'] == 'true' && Devise.omniauth_providers.length == 1 + end end |