mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	refactor: De-duplicate login button code in portico templates.
This commit is contained in:
		
				
					committed by
					
						
						Tim Abbott
					
				
			
			
				
	
			
			
			
						parent
						
							0e401c4f18
						
					
				
				
					commit
					3610aaece3
				
			@@ -635,7 +635,7 @@ button.login-google-button {
 | 
				
			|||||||
    transform: translateX(15px) translateY(13px);
 | 
					    transform: translateX(15px) translateY(13px);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.azure-wrapper::before {
 | 
					.azuread-wrapper::before {
 | 
				
			||||||
    content: "\f17a";
 | 
					    content: "\f17a";
 | 
				
			||||||
    position: absolute;
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -143,27 +143,16 @@
 | 
				
			|||||||
                            </div>
 | 
					                            </div>
 | 
				
			||||||
                            {% endif %}
 | 
					                            {% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            {% if github_auth_enabled %}
 | 
					                            {% for backend in social_backends %}
 | 
				
			||||||
                            <div class="login-social">
 | 
					                            <div class="login-social">
 | 
				
			||||||
                                <form id='social_login_form' class="form-inline github-wrapper" action="{{ url('login-social', args=('github',)) }}" method="get">
 | 
					                                <form id='social_login_form' class="form-inline {{ backend.name }}-wrapper" action="{{ backend.login_url }}" method="get">
 | 
				
			||||||
                                    <input type="hidden" name="next" value="{{ next }}">
 | 
					                                    <input type="hidden" name="next" value="{{ next }}">
 | 
				
			||||||
                                    <button class="login-social-button">
 | 
					                                    <button class="login-social-button">
 | 
				
			||||||
                                        {{ _('Log in with %(identity_provider)s', identity_provider="GitHub") }}
 | 
					                                        {{ _('Log in with %(identity_provider)s', identity_provider=backend.display_name) }}
 | 
				
			||||||
                                    </button>
 | 
					                                    </button>
 | 
				
			||||||
                                </form>
 | 
					                                </form>
 | 
				
			||||||
                            </div>
 | 
					                            </div>
 | 
				
			||||||
                            {% endif %}
 | 
					                            {% endfor %}
 | 
				
			||||||
 | 
					 | 
				
			||||||
                            {% if azuread_auth_enabled %}
 | 
					 | 
				
			||||||
                            <div class="login-social">
 | 
					 | 
				
			||||||
                                <form id='azure_login_form' class="form-inline azure-wrapper" action="{{ url('login-social', args=('azuread-oauth2',)) }}" method="get">
 | 
					 | 
				
			||||||
                                    <input type="hidden" name="next" value="{{ next }}">
 | 
					 | 
				
			||||||
                                    <button class="login-social-button">
 | 
					 | 
				
			||||||
                                        {{ _('Log in with %(identity_provider)s', identity_provider="Azure AD") }}
 | 
					 | 
				
			||||||
                                    </button>
 | 
					 | 
				
			||||||
                                </form>
 | 
					 | 
				
			||||||
                            </div>
 | 
					 | 
				
			||||||
                            {% endif %}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            <div class="actions">
 | 
					                            <div class="actions">
 | 
				
			||||||
                                {% if email_auth_enabled %}
 | 
					                                {% if email_auth_enabled %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@
 | 
				
			|||||||
from typing import Any, Dict, Optional
 | 
					from typing import Any, Dict, Optional
 | 
				
			||||||
from django.http import HttpRequest
 | 
					from django.http import HttpRequest
 | 
				
			||||||
from django.conf import settings
 | 
					from django.conf import settings
 | 
				
			||||||
 | 
					from django.urls import reverse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from zerver.models import UserProfile, get_realm, Realm
 | 
					from zerver.models import UserProfile, get_realm, Realm
 | 
				
			||||||
from zproject.backends import (
 | 
					from zproject.backends import (
 | 
				
			||||||
@@ -10,6 +11,7 @@ from zproject.backends import (
 | 
				
			|||||||
    require_email_format_usernames,
 | 
					    require_email_format_usernames,
 | 
				
			||||||
    auth_enabled_helper,
 | 
					    auth_enabled_helper,
 | 
				
			||||||
    AUTH_BACKEND_NAME_MAP,
 | 
					    AUTH_BACKEND_NAME_MAP,
 | 
				
			||||||
 | 
					    SOCIAL_AUTH_BACKENDS,
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
from zerver.lib.bugdown import convert as bugdown_convert
 | 
					from zerver.lib.bugdown import convert as bugdown_convert
 | 
				
			||||||
from zerver.lib.send_email import FromAddress
 | 
					from zerver.lib.send_email import FromAddress
 | 
				
			||||||
@@ -147,4 +149,17 @@ def zulip_default_context(request: HttpRequest) -> Dict[str, Any]:
 | 
				
			|||||||
        name_lower = auth_backend_name.lower()
 | 
					        name_lower = auth_backend_name.lower()
 | 
				
			||||||
        key = "%s_auth_enabled" % (name_lower,)
 | 
					        key = "%s_auth_enabled" % (name_lower,)
 | 
				
			||||||
        context[key] = auth_enabled_helper([auth_backend_name], realm)
 | 
					        context[key] = auth_enabled_helper([auth_backend_name], realm)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    social_backends = []
 | 
				
			||||||
 | 
					    for backend in SOCIAL_AUTH_BACKENDS:
 | 
				
			||||||
 | 
					        if not auth_enabled_helper([backend.auth_backend_name], realm):
 | 
				
			||||||
 | 
					            continue
 | 
				
			||||||
 | 
					        social_backends.append({
 | 
				
			||||||
 | 
					            'name': backend.name,
 | 
				
			||||||
 | 
					            'display_name': backend.auth_backend_name,
 | 
				
			||||||
 | 
					            'login_url': reverse('login-social', args=(backend.name,)),
 | 
				
			||||||
 | 
					            'sort_order': backend.sort_order,
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					    context['social_backends'] = sorted(social_backends, key=lambda x: x['sort_order'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return context
 | 
					    return context
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -650,6 +650,8 @@ def social_auth_finish(backend: Any,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class SocialAuthMixin(ZulipAuthMixin):
 | 
					class SocialAuthMixin(ZulipAuthMixin):
 | 
				
			||||||
    auth_backend_name = "undeclared"
 | 
					    auth_backend_name = "undeclared"
 | 
				
			||||||
 | 
					    # Used to determine how to order buttons on login form
 | 
				
			||||||
 | 
					    sort_order = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def auth_complete(self, *args: Any, **kwargs: Any) -> Optional[HttpResponse]:
 | 
					    def auth_complete(self, *args: Any, **kwargs: Any) -> Optional[HttpResponse]:
 | 
				
			||||||
        """This is a small wrapper around the core `auth_complete` method of
 | 
					        """This is a small wrapper around the core `auth_complete` method of
 | 
				
			||||||
@@ -676,6 +678,7 @@ class SocialAuthMixin(ZulipAuthMixin):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class GitHubAuthBackend(SocialAuthMixin, GithubOAuth2):
 | 
					class GitHubAuthBackend(SocialAuthMixin, GithubOAuth2):
 | 
				
			||||||
    auth_backend_name = "GitHub"
 | 
					    auth_backend_name = "GitHub"
 | 
				
			||||||
 | 
					    sort_order = 50
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_verified_emails(self, *args: Any, **kwargs: Any) -> List[str]:
 | 
					    def get_verified_emails(self, *args: Any, **kwargs: Any) -> List[str]:
 | 
				
			||||||
        access_token = kwargs["response"]["access_token"]
 | 
					        access_token = kwargs["response"]["access_token"]
 | 
				
			||||||
@@ -727,6 +730,7 @@ class GitHubAuthBackend(SocialAuthMixin, GithubOAuth2):
 | 
				
			|||||||
        raise AssertionError("Invalid configuration")
 | 
					        raise AssertionError("Invalid configuration")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AzureADAuthBackend(SocialAuthMixin, AzureADOAuth2):
 | 
					class AzureADAuthBackend(SocialAuthMixin, AzureADOAuth2):
 | 
				
			||||||
 | 
					    sort_order = 100
 | 
				
			||||||
    auth_backend_name = "AzureAD"
 | 
					    auth_backend_name = "AzureAD"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AUTH_BACKEND_NAME_MAP = {
 | 
					AUTH_BACKEND_NAME_MAP = {
 | 
				
			||||||
@@ -737,9 +741,11 @@ AUTH_BACKEND_NAME_MAP = {
 | 
				
			|||||||
    'RemoteUser': ZulipRemoteUserBackend,
 | 
					    'RemoteUser': ZulipRemoteUserBackend,
 | 
				
			||||||
}  # type: Dict[str, Any]
 | 
					}  # type: Dict[str, Any]
 | 
				
			||||||
OAUTH_BACKEND_NAMES = ["Google"]  # type: List[str]
 | 
					OAUTH_BACKEND_NAMES = ["Google"]  # type: List[str]
 | 
				
			||||||
 | 
					SOCIAL_AUTH_BACKENDS = []  # type: List[BaseOAuth2]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Authomatically add all of our social auth backends to relevant data structures.
 | 
					# Authomatically add all of our social auth backends to relevant data structures.
 | 
				
			||||||
for social_auth_subclass in SocialAuthMixin.__subclasses__():
 | 
					for social_auth_subclass in SocialAuthMixin.__subclasses__():
 | 
				
			||||||
    AUTH_BACKEND_NAME_MAP[social_auth_subclass.auth_backend_name] = social_auth_subclass
 | 
					    AUTH_BACKEND_NAME_MAP[social_auth_subclass.auth_backend_name] = social_auth_subclass
 | 
				
			||||||
    if issubclass(social_auth_subclass, BaseOAuth2):
 | 
					    if issubclass(social_auth_subclass, BaseOAuth2):
 | 
				
			||||||
        OAUTH_BACKEND_NAMES.append(social_auth_subclass.auth_backend_name)
 | 
					        OAUTH_BACKEND_NAMES.append(social_auth_subclass.auth_backend_name)
 | 
				
			||||||
 | 
					        SOCIAL_AUTH_BACKENDS.append(social_auth_subclass)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user