BryanDavis has uploaded a new change for review.
https://gerrit.wikimedia.org/r/316026
Change subject: Check request ip for account creation blocks on Wikitech
......................................................................
Check request ip for account creation blocks on Wikitech
Add a check for nocreate blocks tied to the remote ip on all account
creation steps.
Bug: T147024
Change-Id: I2a04b4d201d3e68f70f9f9dd88ab251fcb504ef4
---
M striker/mediawiki.py
M striker/register/utils.py
M striker/register/views.py
3 files changed, 65 insertions(+), 13 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/labs/striker
refs/changes/26/316026/1
diff --git a/striker/mediawiki.py b/striker/mediawiki.py
index 2cd3992..a306ad9 100644
--- a/striker/mediawiki.py
+++ b/striker/mediawiki.py
@@ -82,7 +82,15 @@
result = self.site.api(
'query', formatversion=2,
meta='allmessages',
- ammessages=message, amargs='|'.join(params), amlang=lang,
+ ammessages=message, amargs='|'.join(params), amlang=lang
)
# TODO: error handling
return result['query']['allmessages'][0]['content']
+
+ def query_blocks_ip(self, ip):
+ result = self.site.api(
+ 'query', formatversion=2,
+ list='blocks',
+ bkip=ip
+ )
+ return result['query']['blocks']
diff --git a/striker/register/utils.py b/striker/register/utils.py
index 3f2b21c..4c3aa27 100644
--- a/striker/register/utils.py
+++ b/striker/register/utils.py
@@ -94,3 +94,15 @@
logger.exception('Failed to get expanded message for %s', user)
ret['error'] = user['cancreateerror'][0]['message']
return ret
+
+
+def check_ip_blocked_from_create(ip):
+ """Check to see if an ip address is banned from creating accounts.
+
+ Returns a block reason or False if not blocked.
+ """
+ res = mwapi.query_blocks_ip(ip)
+ for block in res:
+ if block['nocreate']:
+ return block['reason']
+ return False
diff --git a/striker/register/views.py b/striker/register/views.py
index 09a930b..85012e8 100644
--- a/striker/register/views.py
+++ b/striker/register/views.py
@@ -34,8 +34,6 @@
from formtools.wizard.views import NamedUrlSessionWizardView
from striker.labsauth.models import LabsUser
-from striker.labsauth.utils import add_ldap_user
-from striker.labsauth.utils import oauth_from_session
from striker.register import forms
from striker.register import utils
@@ -44,10 +42,11 @@
def oauth_required(f):
+ """Decorator to ensure that OAuth data is present in session."""
@functools.wraps(f)
def decorated(*args, **kwargs):
req = args[0]
- oauth = oauth_from_session(req.session)
+ oauth = utils.oauth_from_session(req.session)
if oauth['username'] is None:
messages.error(
req, _('Please login with your Wikimedia unified account'))
@@ -56,18 +55,49 @@
return decorated
+def anon_required(f):
+ """Decorator to ensure that user is not logged in."""
+ @functools.wraps(f)
+ def decorated(*args, **kwargs):
+ req = args[0]
+ if not req.user.is_anonymous():
+ messages.error(
+ req, _('Logged in users can not create new accounts.'))
+ return shortcuts.redirect(urlresolvers.reverse('index'))
+ return f(*args, **kwargs)
+ return decorated
+
+
+def check_ip(f):
+ """Decorator to ensure that remote ip is not blocked."""
+ @functools.wraps(f)
+ def decorated(*args, **kwargs):
+ req = args[0]
+ block = utils.check_ip_blocked_from_create(req.META['REMOTE_ADDR'])
+ if block is not False:
+ messages.error(
+ req,
+ _(
+ 'Your IP address has been blocked from creating accounts. '
+ 'The reason given was: "%(reason)s"'
+ ) % {'reason': block})
+ return shortcuts.redirect(urlresolvers.reverse('index'))
+ return f(*args, **kwargs)
+ return decorated
+
+
+@anon_required
+@check_ip
def index(req):
ctx = {}
- if not req.user.is_anonymous():
- messages.error(
- req, _('Logged in users can not create new accounts.'))
- return shortcuts.redirect(urlresolvers.reverse('index'))
return shortcuts.render(req, 'register/index.html', ctx)
+@anon_required
+@check_ip
@oauth_required
def oauth(req):
- oauth = oauth_from_session(req.session)
+ oauth = utils.oauth_from_session(req.session)
if not utils.sul_available(oauth['username']):
messages.error(
req, _('Wikimedia unified account is already in use.'))
@@ -120,6 +150,8 @@
('confirm', forms.Confirm),
]
+ @method_decorator(anon_required)
+ @method_decorator(check_ip)
@method_decorator(oauth_required)
def dispatch(self, *args, **kwargs):
return super(AccountWizard, self).dispatch(*args, **kwargs)
@@ -128,7 +160,7 @@
return ['register/%s.html' % self.steps.current]
def get_form_initial(self, step):
- oauth = oauth_from_session(self.request.session)
+ oauth = utils.oauth_from_session(self.request.session)
if step == 'ldap':
# Suggest SUL username as LDAP username
return {
@@ -161,7 +193,7 @@
def get_context_data(self, form, **kwargs):
context = super(AccountWizard, self).get_context_data(
form=form, **kwargs)
- oauth = oauth_from_session(self.request.session)
+ oauth = utils.oauth_from_session(self.request.session)
if self.steps.current == 'confirm':
context.update({
'forms': self._get_all_forms(),
@@ -172,8 +204,8 @@
return context
def done(self, form_list, form_dict, **kwargs):
- oauth = oauth_from_session(self.request.session)
- ldap_user = add_ldap_user(
+ oauth = utils.oauth_from_session(self.request.session)
+ ldap_user = utils.add_ldap_user(
form_dict['ldap'].cleaned_data['username'],
form_dict['shell'].cleaned_data['shellname'],
form_dict['password'].cleaned_data['passwd'],
--
To view, visit https://gerrit.wikimedia.org/r/316026
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I2a04b4d201d3e68f70f9f9dd88ab251fcb504ef4
Gerrit-PatchSet: 1
Gerrit-Project: labs/striker
Gerrit-Branch: master
Gerrit-Owner: BryanDavis <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits