Source code for magpie.ui.login.views

from magpie.api import schemas as schemas
from magpie.definitions.pyramid_definitions import (
    NO_PERMISSION_REQUIRED,
    view_config,
    forget,
    Response,
    HTTPOk,
    HTTPFound,
    HTTPUnauthorized,
    HTTPInternalServerError,
    HTTPException,
)
from magpie.ui.utils import check_response, request_api
from magpie.ui.home import add_template_data
from magpie.utils import get_magpie_url, get_json
import requests


[docs]class LoginViews(object): def __init__(self, request): self.request = request self.magpie_url = get_magpie_url(request.registry)
[docs] def request_providers_json(self): resp = request_api(self.request, schemas.ProvidersAPI.path, "GET") check_response(resp) return get_json(resp)["providers"]
@view_config(route_name="login", renderer="templates/login.mako", permission=NO_PERMISSION_REQUIRED)
[docs] def login(self): external_providers = self.request_providers_json()["external"] return_data = { u"external_providers": external_providers, u"user_name_external": self.request.POST.get("user_name", u""), u"user_name_internal": self.request.POST.get("user_name", u""), u"invalid_credentials": False, u"error": False, } try: if "submit" in self.request.POST: data = {} for key in self.request.POST: data[key] = self.request.POST.get(key) return_data[u"provider_name"] = data.get("provider_name", "").lower() is_external = return_data[u"provider_name"] in [p.lower() for p in external_providers] if is_external: return_data[u"user_name_internal"] = u"" else: return_data[u"user_name_external"] = u"" # keep using the external requests for external providers if is_external: signin_url = "{}{}".format(self.magpie_url, schemas.SigninAPI.path) response = requests.post(signin_url, data=data, allow_redirects=True) # use sub request for internal to avoid retry connection errors else: response = request_api(self.request, schemas.SigninAPI.path, "POST", data=data) if response.status_code in (HTTPOk.code, HTTPFound.code): if is_external: pyr_res = Response(body=response.content, headers=response.headers) for cookie in response.cookies: pyr_res.set_cookie(name=cookie.name, value=cookie.value, overwrite=True) return HTTPFound(response.url, headers=pyr_res.headers) return HTTPFound(location=self.request.route_url("home"), headers=response.headers) elif response.status_code == HTTPUnauthorized.code: return_data[u"invalid_credentials"] = True else: return_data[u"error"] = True except HTTPException as e: if e.status_code == HTTPUnauthorized.code: return_data[u"invalid_credentials"] = True else: return_data[u"error"] = True except Exception as e: return HTTPInternalServerError(detail=repr(e)) return add_template_data(self.request, data=return_data)
@view_config(route_name="logout", renderer="templates/login.mako", permission=NO_PERMISSION_REQUIRED)
[docs] def logout(self): # Flush cookies and return to home request_api(self.request, schemas.SignoutAPI.path, "GET") return HTTPFound(location=self.request.route_url("home"), headers=forget(self.request))