Skip to content

Commit 0661d15

Browse files
Custom login from extension
1 parent 20e5b8e commit 0661d15

File tree

1 file changed

+49
-14
lines changed

1 file changed

+49
-14
lines changed

ckanext/password_policy/views.py

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
1-
from ckan.views.user import RegisterView, EditView, PerformResetView
1+
from ckan.views.user import RegisterView, EditView, PerformResetView, rotate_token, next_page_or_default
22
# from ckan.lib.repoze_plugins.friendly_form import FriendlyFormPlugin
33
import ckan.logic as logic
44
import ckan.plugins as plugins
55
import ckan.lib.base as base
6+
import ckan.lib.authenticator as authenticator
67
from flask import Blueprint
78
import ckan.model as model
89
import ckan.plugins.toolkit as tk
9-
from ckan.common import _, config, g, request
1010
import ckan.lib.helpers as h
1111
import ckanext.password_policy.helpers as helper
1212
# from webob import Request
1313
# from webob.exc import HTTPFound, HTTPUnauthorized
14+
from typing import Any, Optional, Union
1415
from six import text_type
1516
from six.moves.urllib.parse import urlencode
17+
from ckan.common import (
18+
_, config, g, current_user, login_user, logout_user,
19+
session, config, g, request, repr_untrusted
20+
)
21+
from ckan.types import Context, Schema, Response
1622
# try:
1723
# from webob.multidict import MultiDict
1824
# except ImportError:
@@ -218,23 +224,52 @@ def _get_repoze_handler(handler_name):
218224
handler_name)
219225

220226

221-
def custom_login():
222-
# Do any plugin login stuff
227+
def custom_login() -> Union[Response, str]:
223228
for item in plugins.PluginImplementations(plugins.IAuthenticator):
224229
response = item.login()
225230
if response:
226231
return response
227232

228-
extra_vars = {}
229-
if g.user:
230-
return base.render(u'user/logout_first.html', extra_vars)
231-
232-
came_from = request.params.get(u'came_from')
233-
if not came_from:
234-
came_from = h.url_for(u'user.logged_in')
235-
g.login_handler = h.url_for(
236-
_get_repoze_handler(u'login_handler_path'), came_from=came_from)
237-
return base.render(u'user/login.html', extra_vars)
233+
print("================================")
234+
print("custom login")
235+
print("================================")
236+
extra_vars: dict[str, Any] = {}
237+
238+
if current_user.is_authenticated:
239+
return base.render("user/logout_first.html", extra_vars)
240+
241+
if request.method == "POST":
242+
username_or_email = request.form.get("login")
243+
password = request.form.get("password")
244+
_remember = request.form.get("remember")
245+
246+
identity = {
247+
u"login": username_or_email,
248+
u"password": password
249+
}
250+
251+
user_obj = authenticator.ckan_authenticator(identity)
252+
if user_obj:
253+
next = request.args.get('next', request.args.get('came_from'))
254+
if _remember:
255+
from datetime import timedelta
256+
duration_time = timedelta(milliseconds=int(_remember))
257+
login_user(user_obj, remember=True, duration=duration_time)
258+
rotate_token()
259+
return next_page_or_default(next)
260+
else:
261+
login_user(user_obj)
262+
rotate_token()
263+
return next_page_or_default(next)
264+
else:
265+
if config.get('ckan.recaptcha.privatekey'):
266+
err = _(u"Login failed. Bad username or password or CAPTCHA.")
267+
else:
268+
err = _(u"Login failed. Bad username or password.")
269+
h.flash_error(err)
270+
return base.render("user/login.html", extra_vars)
271+
272+
return base.render("user/login.html", extra_vars)
238273

239274

240275
def logged_in():

0 commit comments

Comments
 (0)