From 95209e6f473c029745167d9fc39c2db076af1c40 Mon Sep 17 00:00:00 2001
From: Julian Rother <julianr@fsmpi.rwth-aachen.de>
Date: Mon, 5 Oct 2020 12:57:17 +0200
Subject: [PATCH] fixed linter errors

---
 uffd/mfa/models.py      | 41 ++++++++++++++++++++++-------------------
 uffd/mfa/views.py       | 25 +++++++++++++------------
 uffd/template_helper.py | 13 +++++++------
 3 files changed, 42 insertions(+), 37 deletions(-)

diff --git a/uffd/mfa/models.py b/uffd/mfa/models.py
index d27b5f81..fd8870ff 100644
--- a/uffd/mfa/models.py
+++ b/uffd/mfa/models.py
@@ -1,10 +1,18 @@
 import enum
 import datetime
-import secrets, time, struct, hmac, hashlib, base64, urllib.parse
+import secrets
+# imports for totp
+import time
+import struct
+import hmac
+import hashlib
+import base64
+import urllib.parse
+# imports for recovery codes
 import crypt
 
 from flask import request, current_app
-from sqlalchemy import Column, Integer, Enum, Boolean, String, DateTime, Text
+from sqlalchemy import Column, Integer, Enum, String, DateTime, Text
 
 from uffd.database import db
 from uffd.user.models import User
@@ -29,15 +37,15 @@ class MFAMethod(db.Model):
 	def __init__(self, user, name=None):
 		self.user = user
 		self.name = name
-		self.created = datetime.datetime.now();
+		self.created = datetime.datetime.now()
 
 	@property
 	def user(self):
 		return User.from_ldap_dn(self.dn)
-	
+
 	@user.setter
-	def user(self, u):
-		self.dn = u.dn
+	def user(self, new_user):
+		self.dn = new_user.dn
 
 class RecoveryCodeMethod(MFAMethod):
 	code_salt = Column('recovery_salt', String(64))
@@ -54,18 +62,14 @@ class RecoveryCodeMethod(MFAMethod):
 
 	def verify(self, code):
 		code = code.replace(' ', '').lower()
-		if crypt.crypt(code, self.code_hash) == self.code_hash:
-			return True
-		else:
-			return False
+		return crypt.crypt(code, self.code_hash) == self.code_hash
 
 def _hotp(counter, key, digits=6):
 	'''Generates HMAC-based one-time password according to RFC4226
-	
+
 	:param counter: Positive integer smaller than 2**64
 	:param key: Bytes object of arbitrary length (should be at least 160 bits)
-	:param digits: Length of resulting value (integer between 1 and 9, minimum
-	               of 6 is recommended)
+	:param digits: Length of resulting value (integer between 1 and 9, minimum of 6 is recommended)
 
 	:returns: String object representing human-readable HOTP value'''
 	msg = struct.pack('>Q', counter)
@@ -89,8 +93,8 @@ class TOTPMethod(MFAMethod):
 
 	@property
 	def raw_key(self):
-		s = self.key + '='*(8 - (len(self.key) % 8))
-		return base64.b32decode(s.encode())
+		tmp = self.key + '='*(8 - (len(self.key) % 8))
+		return base64.b32decode(tmp.encode())
 
 	@property
 	def issuer(self):
@@ -135,10 +139,9 @@ class WebauthnMethod(MFAMethod):
 
 	@property
 	def cred(self):
-		from fido2.ctap2 import AttestedCredentialData
+		from fido2.ctap2 import AttestedCredentialData #pylint: disable=import-outside-toplevel
 		return AttestedCredentialData(base64.b64decode(self._cred))
 
 	@cred.setter
-	def cred(self, d):
-		self._cred = base64.b64encode(bytes(d))
-
+	def cred(self, newcred):
+		self._cred = base64.b64encode(bytes(newcred))
diff --git a/uffd/mfa/views.py b/uffd/mfa/views.py
index 447623aa..62b0f4d0 100644
--- a/uffd/mfa/views.py
+++ b/uffd/mfa/views.py
@@ -1,10 +1,11 @@
-from flask import Blueprint, render_template, session, request, redirect, url_for, flash, current_app, abort
-import urllib.parse
 from warnings import warn
+import urllib.parse
+
+from flask import Blueprint, render_template, session, request, redirect, url_for, flash, current_app, abort
 
 from uffd.database import db
 from uffd.mfa.models import MFAMethod, TOTPMethod, WebauthnMethod, RecoveryCodeMethod
-from uffd.session.views import get_current_user, login_required, is_valid_session
+from uffd.session.views import get_current_user, login_required
 from uffd.ldap import uid_to_dn
 from uffd.user.models import User
 from uffd.csrf import csrf_protect
@@ -91,7 +92,7 @@ def setup_totp_finish():
 @bp.route('/setup/totp/<int:id>/delete')
 @login_required()
 @csrf_protect(blueprint=bp)
-def delete_totp(id):
+def delete_totp(id): #pylint: disable=redefined-builtin
 	user = get_current_user()
 	method = TOTPMethod.query.filter_by(dn=user.dn, id=id).first_or_404()
 	db.session.delete(method)
@@ -106,14 +107,14 @@ try:
 	from fido2.server import Fido2Server, RelyingParty
 	from fido2.ctap2 import AttestationObject, AuthenticatorData
 	from fido2 import cbor
-	webauthn_supported = True
-except ImportError as e:
-	warn('2FA WebAuthn support disabled because import of the fido2 module failed (%s)'%e)
-	webauthn_supported = False
+	WEBAUTHN_SUPPORTED = True
+except ImportError as err:
+	warn('2FA WebAuthn support disabled because import of the fido2 module failed (%s)'%err)
+	WEBAUTHN_SUPPORTED = False
 
-bp.add_app_template_global(webauthn_supported, name='webauthn_supported')
+bp.add_app_template_global(WEBAUTHN_SUPPORTED, name='webauthn_supported')
 
-if webauthn_supported:
+if WEBAUTHN_SUPPORTED:
 	def get_webauthn_server():
 		return Fido2Server(RelyingParty(current_app.config.get('MFA_RP_ID', urllib.parse.urlsplit(request.url).hostname), current_app.config['MFA_RP_NAME']))
 
@@ -195,7 +196,7 @@ if webauthn_supported:
 @bp.route('/setup/webauthn/<int:id>/delete')
 @login_required()
 @csrf_protect(blueprint=bp)
-def delete_webauthn(id):
+def delete_webauthn(id): #pylint: disable=redefined-builtin
 	user = get_current_user()
 	method = WebauthnMethod.query.filter_by(dn=user.dn, id=id).first_or_404()
 	db.session.delete(method)
@@ -234,7 +235,7 @@ def auth_finish():
 			if len(recovery_methods) <= 1:
 				flash('You have exhausted your recovery codes. Please generate new ones now!')
 				return redirect(url_for('mfa.setup'))
-			elif len(recovery_methods) <= 5:
+			if len(recovery_methods) <= 5:
 				flash('You only have a few recovery codes remaining. Make sure to generate new ones before they run out.')
 				return redirect(url_for('mfa.setup'))
 			return redirect(request.values.get('ref', url_for('index')))
diff --git a/uffd/template_helper.py b/uffd/template_helper.py
index ebd06596..998bafaa 100644
--- a/uffd/template_helper.py
+++ b/uffd/template_helper.py
@@ -1,20 +1,21 @@
-from flask import Markup
-
-import qrcode, qrcode.image.svg
-
 import random
 import subprocess
 import base64
 from datetime import timedelta, datetime
 import io
 
+from flask import Markup
+
+import qrcode
+import qrcode.image.svg
+
 def register_template_helper(app):
 	# debian ships jinja2 without this test...
 	def equalto(a, b):
 		return a == b
 
 	@app.template_filter()
-	def qrcode_svg(content, **attrs):
+	def qrcode_svg(content, **attrs): #pylint: disable=unused-variable
 		img = qrcode.make(content, image_factory=qrcode.image.svg.SvgPathImage, border=0)
 		svg = img.get_image()
 		for key, value, in attrs.items():
@@ -24,7 +25,7 @@ def register_template_helper(app):
 		return Markup(buf.getvalue().decode())
 
 	@app.template_filter()
-	def datauri(data, mimetype='text/plain'):
+	def datauri(data, mimetype='text/plain'): #pylint: disable=unused-variable
 		return Markup('data:%s;base64,%s'%(mimetype, base64.b64encode(data.encode()).decode()))
 
 	@app.url_defaults
-- 
GitLab