diff --git a/.travis.yml b/.travis.yml index 89b21dd..2615725 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,8 @@ language: python -python: "3.6" +python: "3.7" -dist: trusty +dist: xenial sudo: required matrix: diff --git a/README.md b/README.md index ffcbeca..c8c7bdc 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # NyaaV2 [![Build Status](https://travis-ci.org/nyaadevs/nyaa.svg?branch=master)](https://travis-ci.org/nyaadevs/nyaa) ## Setting up for development -This project uses Python 3.6. There are features used that do not exist in 3.5, so make sure to use Python 3.6. +This project uses Python 3.7. There are features used that do not exist in 3.6, so make sure to use Python 3.7. This guide also assumes you 1) are using Linux and 2) are somewhat capable with the commandline. It's not impossible to run Nyaa on Windows, but this guide doesn't focus on that. @@ -16,13 +16,13 @@ The `tests` folder contains tests for the the `nyaa` module and the webserver. T - Run `./dev.py test` while in the repository directory. ### Setting up Pyenv -pyenv eases the use of different Python versions, and as not all Linux distros offer 3.6 packages, it's right up our alley. +pyenv eases the use of different Python versions, and as not all Linux distros offer 3.7 packages, it's right up our alley. - Install dependencies https://github.com/pyenv/pyenv/wiki/Common-build-problems - Install `pyenv` https://github.com/pyenv/pyenv/blob/master/README.md#installation - Install `pyenv-virtualenv` https://github.com/pyenv/pyenv-virtualenv/blob/master/README.md -- Install Python 3.6.1 with `pyenv` and create a virtualenv for the project: - - `pyenv install 3.6.1` - - `pyenv virtualenv 3.6.1 nyaa` +- Install Python 3.7.2 with `pyenv` and create a virtualenv for the project: + - `pyenv install 3.7.2` + - `pyenv virtualenv 3.7.2 nyaa` - `pyenv activate nyaa` - Install dependencies with `pip install -r requirements.txt` - Copy `config.example.py` into `config.py` diff --git a/nyaa/bencode.py b/nyaa/bencode.py index 6cdd14c..1866dd1 100644 --- a/nyaa/bencode.py +++ b/nyaa/bencode.py @@ -67,7 +67,7 @@ def _bencode_decode(file_object, decode_keys_as_utf8=True): elif c == _B_END: try: return int(int_bytes.decode('utf8')) - except Exception as e: + except Exception: raise create_ex('Unable to parse int') # not a digit OR '-' in the middle of the int @@ -109,7 +109,7 @@ def _bencode_decode(file_object, decode_keys_as_utf8=True): raise create_ex('Unexpected input while reading string length: ' + repr(c)) try: str_len = int(str_len_bytes.decode()) - except Exception as e: + except Exception: raise create_ex('Unable to parse bytestring length') bytestring = file_object.read(str_len) diff --git a/nyaa/forms.py b/nyaa/forms.py index 09c3926..356fc40 100644 --- a/nyaa/forms.py +++ b/nyaa/forms.py @@ -11,8 +11,9 @@ from wtforms import (BooleanField, HiddenField, PasswordField, SelectField, Stri SubmitField, TextAreaField) from wtforms.validators import (DataRequired, Email, EqualTo, Length, Optional, Regexp, StopValidation, ValidationError) +from wtforms.widgets import HTMLString # For DisabledSelectField from wtforms.widgets import Select as SelectWidget # For DisabledSelectField -from wtforms.widgets import HTMLString, html_params # For DisabledSelectField +from wtforms.widgets import html_params import dns.exception import dns.resolver @@ -78,7 +79,7 @@ def register_email_blacklist_validator(form, field): validation_exception = StopValidation('Blacklisted email provider') for item in email_blacklist: - if isinstance(item, re._pattern_type): + if isinstance(item, re.Pattern): if item.search(email): raise validation_exception elif isinstance(item, str): diff --git a/nyaa/views/__init__.py b/nyaa/views/__init__.py index 32f745b..ef3f3c4 100644 --- a/nyaa/views/__init__.py +++ b/nyaa/views/__init__.py @@ -29,7 +29,7 @@ def _maintenance_mode_hook(): flask.flash(flask.Markup(message), 'danger') try: target_url = flask.url_for(endpoint) - except: + except Exception: # Non-GET-able endpoint, try referrer or default to home page target_url = flask.request.referrer or flask.url_for('main.home') return flask.redirect(target_url) diff --git a/nyaa/views/account.py b/nyaa/views/account.py index 15c0619..b6a4a9e 100644 --- a/nyaa/views/account.py +++ b/nyaa/views/account.py @@ -26,6 +26,9 @@ def login(): return flask.redirect(flask.url_for('account.login')) username = form.username.data.strip() + if not username.isascii(): + flask.flash('Invalid characters in username.', 'danger') + return flask.redirect(flask.url_for('account.login')) password = form.password.data user = models.User.by_username(username) @@ -151,7 +154,7 @@ def password_reset(payload=None): s = get_serializer() try: request_timestamp, pw_hash, user_id = s.loads(payload) - except: + except Exception: return flask.abort(404) user = models.User.by_id(user_id) diff --git a/requirements.txt b/requirements.txt index 5dddb06..d8a7420 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,57 +1,53 @@ -alembic==0.9.2 +alembic==1.0.11 appdirs==1.4.3 -argon2-cffi==16.3.0 -autopep8==1.3.1 +argon2-cffi==19.1.0 +autopep8==1.4.4 blinker==1.4 -cffi==1.10.0 -click==6.7 -dominate==2.3.1 -dnspython==1.15.0 -elasticsearch==5.3.0 -elasticsearch-dsl==5.2.0 -flake8==3.3.0 -flake8-isort==2.2.1 -Flask==0.12.2 +cffi==1.12.3 +click==7.0 +dnspython==1.16.0 +elasticsearch==7.0.2 +elasticsearch-dsl==7.0.0 +flake8==3.7.8 +flake8-isort==2.7.0 +Flask==1.1.1 Flask-Assets==0.12 Flask-DebugToolbar==0.10.1 -Flask-Migrate==2.0.3 -flask-paginate==0.4.5 -Flask-Script==2.0.5 -Flask-SQLAlchemy==2.2 +Flask-Migrate==2.5.2 +flask-paginate==0.5.3 +Flask-Script==2.0.6 +Flask-SQLAlchemy==2.4.0 Flask-WTF==0.14.2 -gevent==1.3.7 +gevent==1.4.0 greenlet==0.4.15 -isort==4.2.15 -itsdangerous==0.24 -Jinja2==2.9.6 -libsass==0.12.3 -Mako==1.0.6 -MarkupSafe==1.0 -mysql-replication==0.13 -mysqlclient==1.3.10 +isort==4.3.21 +itsdangerous==1.1.0 +Jinja2==2.10.1 +Mako==1.1.0 +MarkupSafe==1.1.1 +mysql-replication==0.19 +mysqlclient==1.4.3 orderedset==2.0.1 -packaging==16.8 +packaging==19.1 passlib==1.7.1 progressbar33==2.4 -py==1.4.34 -pycodestyle==2.3.1 -pycparser==2.17 -PyMySQL==0.7.11 -pyparsing==2.2.0 -pytest==3.1.1 -python-dateutil==2.6.0 -python-editor==1.0.3 -python-utils==2.1.0 -requests==2.18.4 -six==1.10.0 -SQLAlchemy==1.1.10 -SQLAlchemy-FullText-Search==0.2.3 -SQLAlchemy-Utils==0.32.14 -statsd==3.2.1 -urllib3==1.21.1 -uWSGI==2.0.15 -visitor==0.1.3 +py==1.8.0 +pycodestyle==2.5.0 +pycparser==2.19 +PyMySQL==0.9.3 +pyparsing==2.4.2 +pytest==5.0.1 +python-dateutil==2.8.0 +python-editor==1.0.4 +python-utils==2.3.0 +requests==2.22.0 +SQLAlchemy==1.3.6 +SQLAlchemy-FullText-Search==0.2.5 +SQLAlchemy-Utils==0.34.1 +statsd==3.3.0 +urllib3==1.25.3 +uWSGI==2.0.18 webassets==0.12.1 -Werkzeug==0.12.2 -WTForms==2.1 -Flask-Caching==1.4.0 +Werkzeug==0.15.5 +WTForms==2.2.1 +Flask-Caching==1.7.2