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/',