diff --git a/README.md b/README.md index bdb0e6c..5579bd0 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,6 @@ Depends on If you will use Email Token method, then you have to provide template named `mfa_email_token_template.html` that will content the format of the email with parameter named `user` and `otp`. 1. To match the look and feel of your project, MFA includes `base.html` but it needs blocks named `head` & `content` to added its content to it. 1. Somewhere in your app, add a link to 'mfa_home' -```Security ``` +```
  • Security
  • ``` For Example, See https://github.com/mkalioby/AutoDeploy/commit/5f1d94b1804e0aa33c79e9e8530ce849d9eb78cc in AutDeploy Project diff --git a/mfa/Common.py b/mfa/Common.py new file mode 100644 index 0000000..c2f36f7 --- /dev/null +++ b/mfa/Common.py @@ -0,0 +1,8 @@ +from django.conf import settings +from django.core.mail import EmailMessage + +def send(to,subject,body): + From = "%s <%s>" % (settings.EMAIL_FROM, settings.EMAIL_HOST_USER) + email = EmailMessage(subject,body,From,to) + email.content_subtype = "html" + return email.send(False) \ No newline at end of file diff --git a/mfa/Email.py b/mfa/Email.py index 778b25b..c5d9694 100644 --- a/mfa/Email.py +++ b/mfa/Email.py @@ -5,19 +5,13 @@ from random import randint from .models import * from django.template.context import RequestContext from .views import login - +from .Common import send def sendEmail(request,username,secret): from django.contrib.auth import get_user_model User = get_user_model() user=User.objects.get(username=username) - print secret res=render_to_response("mfa_email_token_template.html",{"request":request,"user":user,'otp':secret}) - from django.conf import settings - from django.core.mail import EmailMessage - From = "%s <%s>" % (settings.EMAIL_FROM, settings.EMAIL_HOST_USER) - email = EmailMessage("OTP",res.content,From,[user.email] ) - email.content_subtype = "html" - return email.send(False) + return send([user.email],"OTP", res.content) def start(request): context = csrf(request) diff --git a/mfa/TrustedDevice.py b/mfa/TrustedDevice.py index 6c1b570..0b0866d 100644 --- a/mfa/TrustedDevice.py +++ b/mfa/TrustedDevice.py @@ -105,8 +105,8 @@ def start(request): def send_email(request): body=render(request,"TrustedDevices/email.html",{}).content - from Registry_app.Common import send - if send(request.user.email,"Add Trusted Device Link",body,delay=False): + from .Common import send + if send([request.user.email],"Add Trusted Device Link",body): res="Sent Successfully" else: res="Error occured, please try again later." diff --git a/mfa/U2F.py b/mfa/U2F.py index 3ffb845..0100d1a 100644 --- a/mfa/U2F.py +++ b/mfa/U2F.py @@ -41,14 +41,14 @@ def validate(request,username): import datetime, random data = simplejson.loads(request.POST["response"]) - print "Checking Errors" + res= check_errors(request,data) if res!=True: return res - print "Checking Challenge" + challenge = request.session.pop('_u2f_challenge_') device, c, t = complete_authentication(challenge, data, [settings.U2F_APPID]) - print device + key=User_Keys.objects.get(username=username,properties__shas="$.device.publicKey=%s"%device["publicKey"]) key.last_used=timezone.now() key.save() diff --git a/mfa/__init__.py b/mfa/__init__.py index 6a75453..44c64ba 100644 --- a/mfa/__init__.py +++ b/mfa/__init__.py @@ -1 +1 @@ -import urls \ No newline at end of file +from . import urls \ No newline at end of file diff --git a/mfa/helpers.py b/mfa/helpers.py index f9e0c09..a61c769 100644 --- a/mfa/helpers.py +++ b/mfa/helpers.py @@ -1,8 +1,6 @@ import pyotp from .models import * -import TrustedDevice -import U2F, FIDO2 -import totp +from . import TrustedDevice, U2F, FIDO2, totp import simplejson from django.shortcuts import HttpResponse from mfa.views import verify,goto diff --git a/mfa/models.py b/mfa/models.py index 69508d0..81e4372 100644 --- a/mfa/models.py +++ b/mfa/models.py @@ -2,8 +2,7 @@ from django.db import models from jsonfield import JSONField from jose import jwt from django.conf import settings -from jsonLookup import hasLookup,shasLookup -JSONField.register_lookup(hasLookup) +from jsonLookup import shasLookup JSONField.register_lookup(shasLookup) class User_Keys(models.Model): diff --git a/mfa/views.py b/mfa/views.py index 00c4452..67d6f7d 100644 --- a/mfa/views.py +++ b/mfa/views.py @@ -5,7 +5,7 @@ from django.core.urlresolvers import reverse from django.template.context_processors import csrf from django.template.context import RequestContext from django.conf import settings -import TrustedDevice +from . import TrustedDevice from user_agents import parse def index(request): keys=[] @@ -24,7 +24,7 @@ def verify(request,username): #request.session["base_password"] = password keys=User_Keys.objects.filter(username=username,enabled=1) methods=list(set([k.key_type for k in keys])) - print methods + if "Trusted Device" in methods and not request.session.get("checked_trusted_device",False): if TrustedDevice.verify(request): return login(request) diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..2a9acf1 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[bdist_wheel] +universal = 1 diff --git a/setup.py b/setup.py index f3f2b59..4c2aefd 100644 --- a/setup.py +++ b/setup.py @@ -4,8 +4,11 @@ from setuptools import find_packages, setup setup( name='django-mfa2', - version='0.9.0', + version='0.9.2', description='Allows user to add 2FA to their accounts', + long_description=open("README.md").read(), + long_description_content_type="text/markdown", + author='Mohamed El-Kalioby', author_email = 'mkalioby@mkalioby.com', url = 'https://github.com/mkalioby/django-mfa2/',