Skip to content

Encrypt/Decrypt Mailbox urls #198

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 25 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
bb5fba8
FIX - Django settings fix to unicode
lologf Jan 16, 2019
c706e48
Merge pull request #1 from invisiblebits/STC-668__create-tickets-from…
lologf Jan 16, 2019
724e804
FIX - Fix default charset
lologf Jan 16, 2019
fe1367c
Merge pull request #2 from invisiblebits/STC-668__create-ticket-from-…
lologf Jan 16, 2019
b797216
Update models.py
lologf Jan 17, 2019
6ba66ed
Merge pull request #3 from invisiblebits/FIX_unicode_subject_message
lologf Jan 17, 2019
3f22f48
Update models.py
lologf Jan 18, 2019
b390b28
Update models.py
lologf Jan 18, 2019
fd586e8
Merge pull request #4 from invisiblebits/FIX_remove-single-quotes-in-…
lologf Jan 18, 2019
72582ab
Update admin.py
lologf Apr 9, 2019
11a05a8
Encrypt, decrypt and padding in model methods
lologf Apr 9, 2019
850f86a
Pycryto added in requirements
lologf Apr 9, 2019
e073a8c
Remove URI from list_display
lologf Apr 9, 2019
cd1e4de
Help text in uri form
lologf Apr 9, 2019
6f23c59
Decrypt URI in _protocol_info() method
lologf Apr 9, 2019
66f1254
Merge pull request #5 from invisiblebits/encrypt-uri
lologf Apr 9, 2019
934c799
Update setup.py
lologf Apr 9, 2019
0d5f395
Fix decrypt_uri() and _protocol_info() methods
lologf Apr 12, 2019
6c6b23c
Update models.py
lologf May 24, 2019
edc27af
Merge pull request #6 from invisiblebits/lologf-patch-raw-unicode
lologf May 24, 2019
e713b5c
Update models.py
lologf May 24, 2019
6136dea
Update models.py
lologf May 24, 2019
204d67a
Update models.py
lologf May 24, 2019
625e166
Update __init__.py
lologf Jun 25, 2019
be3163e
Remove fix UTF-8
lologf Oct 31, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion django_mailbox/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
__version__ = '4.7.1'
__version__ = '4.7.2'

default_app_config = 'django_mailbox.apps.MailBoxConfig'
25 changes: 24 additions & 1 deletion django_mailbox/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import logging

from django import forms
from django.conf import settings
from django.contrib import admin
from django.utils.translation import ugettext_lazy as _
Expand Down Expand Up @@ -39,18 +40,40 @@ def resend_message_received_signal(message_admin, request, queryset):
_('Re-send message received signal')
)

class MailboxForm(forms.ModelForm):
uri = forms.CharField(widget=forms.PasswordInput,
help_text="For security, the URI will not be shown and will "
"be encrypted in database "
"<br />"
"Example: imap+ssl://myusername:mypassword@someserver <br />"
"<br />"
"Internet transports include 'imap' and 'pop3'; "
"common local file transports include 'maildir', 'mbox', "
"and less commonly 'babyl', 'mh', and 'mmdf'. <br />"
"<br />"
"Be sure to urlencode your username and password should they "
"contain illegal characters (like @, :, etc)."
)

class Meta:
model = Mailbox
fields = ('name', 'uri', 'from_email', 'active',)

class MailboxAdmin(admin.ModelAdmin):
form = MailboxForm
list_display = (
'name',
'uri',
'from_email',
'active',
'last_polling',
)
readonly_fields = ['last_polling', ]
actions = [get_new_mail]

def save_model(self, request, obj, form, change):
if request:
obj.uri = obj.encrypt_uri()
obj.save()

class MessageAttachmentAdmin(admin.ModelAdmin):
raw_id_fields = ('message', )
Expand Down
33 changes: 32 additions & 1 deletion django_mailbox/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import sys
import uuid
from tempfile import NamedTemporaryFile
from Crypto.Cipher import AES

import six
from six.moves.urllib.parse import parse_qs, unquote, urlparse
Expand Down Expand Up @@ -113,9 +114,39 @@ class Mailbox(models.Model):
objects = models.Manager()
active_mailboxes = ActiveMailboxManager()

def pad(self, key):
length = 32 - (len(key) % 32)
return key + chr(length).encode('utf-8') * length

def unpad(self, key):
return key[0:-ord(key[-1])]

def encrypt_uri(self):
secret_key = self.pad(django_settings.SECRET_KEY)
self.uri = unicode(self.pad(self.uri)).encode('utf-8')

cipher = AES.new(secret_key)
self.uri = cipher.encrypt(self.uri)
self.uri = base64.b64encode(self.uri)

return self.uri

def decrypt_uri(self):
secret_key = self.pad(django_settings.SECRET_KEY)
uri = self.uri
uri = self.pad(uri)
uri = base64.b64decode(uri)

cipher = AES.new(secret_key)
uri = cipher.decrypt(uri)

return self.unpad(uri)

@property
def _protocol_info(self):
return urlparse(self.uri)
uri = self.uri
uri = self.decrypt_uri()
return urlparse(uri)

@property
def _query_string(self):
Expand Down
4 changes: 2 additions & 2 deletions django_mailbox/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ def get_settings():
),
'default_charset': getattr(
settings,
'DJANGO_MAILBOX_default_charset',
'iso8859-1',
'DJANGO_MAILBOX_DEFAULT_CHARSET',
'utf8',
)
}

Expand Down
1 change: 1 addition & 0 deletions rtd_requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
django>=1.9,<1.10
six
pycrypto==2.6.1
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
packages=find_packages(),
include_package_data=True,
install_requires=[
'six>=1.6.1'
'six>=1.6.1',
'pycrypto==2.6.1'
]
)