mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
More work about #57. User password is no more stored inside the session! To finish, I just need a good way to handle http server reboots (and so python code reloading).
This commit is contained in:
+7
-1
@@ -1,5 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from django.contrib.auth import authenticate, login
|
||||
from django.contrib.auth import authenticate, login, logout
|
||||
from django.http import HttpResponse, HttpResponseRedirect
|
||||
from django.shortcuts import render_to_response
|
||||
from django.core.urlresolvers import reverse
|
||||
@@ -35,3 +35,9 @@ def dologin(request):
|
||||
return render_to_response("registration/login.html", {
|
||||
"form" : form, "error" : error, "next" : next
|
||||
})
|
||||
|
||||
def dologout(request):
|
||||
events.raiseEvent("UserLogout", request=request)
|
||||
logout(request)
|
||||
|
||||
return HttpResponseRedirect(reverse(dologin))
|
||||
|
||||
@@ -126,13 +126,12 @@ class ConnectionsManager(type):
|
||||
key = None
|
||||
if kwargs.has_key("user"):
|
||||
key = kwargs["user"]
|
||||
elif len(args):
|
||||
key = args[0].user.username
|
||||
if key is None:
|
||||
else:
|
||||
return None
|
||||
if not cls.instances.has_key(key):
|
||||
cls.instances[key] = None
|
||||
if cls.instances[key] is None:
|
||||
if cls.instances[key] is None or cls.instances[key].invalid:
|
||||
# I hope python's garbage collector will detect this correclty
|
||||
cls.instances[key] = \
|
||||
super(ConnectionsManager, cls).__call__(*args, **kwargs)
|
||||
return cls.instances[key]
|
||||
@@ -140,15 +139,14 @@ class ConnectionsManager(type):
|
||||
class IMAPconnector(object):
|
||||
__metaclass__ = ConnectionsManager
|
||||
|
||||
def __init__(self, request=None, user=None, password=None):
|
||||
def __init__(self, user=None, password=None):
|
||||
print "IMAP constructor"
|
||||
|
||||
self.criterions = []
|
||||
self.address = parameters.get("webmail", "IMAP_SERVER")
|
||||
self.port = int(parameters.get("webmail", "IMAP_PORT"))
|
||||
if request:
|
||||
status, msg = self.login(request.user.username,
|
||||
request.session["password"])
|
||||
else:
|
||||
status, msg = self.login(user, password)
|
||||
self.invalid = False
|
||||
status, msg = self.login(user, password)
|
||||
if not status:
|
||||
raise Exception(msg)
|
||||
|
||||
@@ -169,6 +167,11 @@ class IMAPconnector(object):
|
||||
|
||||
return True, None
|
||||
|
||||
def logout(self):
|
||||
self.m.close()
|
||||
self.m.logout()
|
||||
self.invalid = True
|
||||
|
||||
def _encodefolder(self, folder):
|
||||
if not folder:
|
||||
return "INBOX"
|
||||
@@ -314,8 +317,8 @@ class ImapListing(EmailListing):
|
||||
defcallback = "wm_updatelisting"
|
||||
reset_wm_url = False
|
||||
|
||||
def __init__(self, user, password, **kwargs):
|
||||
self.mbc = IMAPconnector(user=user, password=password)
|
||||
def __init__(self, user, **kwargs):
|
||||
self.mbc = IMAPconnector(user=user)
|
||||
if kwargs.has_key("pattern"):
|
||||
self.parse_search_parameters(kwargs["criteria"],
|
||||
kwargs["pattern"])
|
||||
|
||||
@@ -7,6 +7,7 @@ from mailng.lib import events, parameters
|
||||
def init():
|
||||
events.register("UserMenuDisplay", menu)
|
||||
events.register("UserLogin", userlogin)
|
||||
events.register("UserLogout", userlogout)
|
||||
parameters.register("webmail", "IMAP_SERVER", "string", "127.0.0.1",
|
||||
help=_("Address of your IMAP server"))
|
||||
parameters.register("webmail", "IMAP_SECURED", "list_yesno", "no",
|
||||
@@ -51,4 +52,13 @@ def menu(**kwargs):
|
||||
]
|
||||
|
||||
def userlogin(**kwargs):
|
||||
kwargs["request"].session["password"] = kwargs["password"]
|
||||
from imap_listing import IMAPconnector
|
||||
|
||||
m = IMAPconnector(user=kwargs["request"].user.username,
|
||||
password=kwargs["password"])
|
||||
|
||||
def userlogout(**kwargs):
|
||||
from imap_listing import IMAPconnector
|
||||
|
||||
m = IMAPconnector(user=kwargs["request"].user.username)
|
||||
m.logout()
|
||||
|
||||
+20
-19
@@ -47,7 +47,7 @@ def folder(request, name, updatenav=True):
|
||||
optparams["criteria"] = request.session["criteria"]
|
||||
else:
|
||||
optparams["reset"] = True
|
||||
lst = ImapListing(request.user.username, request.session["password"],
|
||||
lst = ImapListing(request.user.username,
|
||||
baseurl=name, folder=name, order=order, **optparams)
|
||||
|
||||
page = lst.paginator.getpage(request.session["page"])
|
||||
@@ -67,18 +67,19 @@ def folder(request, name, updatenav=True):
|
||||
@login_required
|
||||
@is_not_localadmin()
|
||||
def index(request):
|
||||
try:
|
||||
navp = request.session.has_key("navparams") \
|
||||
and request.session["navparams"] or {}
|
||||
lst = ImapListing(request.user.username, request.session["password"],
|
||||
baseurl="INBOX", navparams=navp, folder="INBOX",
|
||||
empty=True)
|
||||
except Exception, exp:
|
||||
return _render_error(request, {"error" : exp})
|
||||
#try:
|
||||
navp = request.session.has_key("navparams") \
|
||||
and request.session["navparams"] or {}
|
||||
lst = ImapListing(request.user.username,
|
||||
baseurl="INBOX", navparams=navp, folder="INBOX",
|
||||
empty=True)
|
||||
#except Exception, exp:
|
||||
# return _render_error(request, user_context={"error" : exp})
|
||||
return lst.render(request)
|
||||
|
||||
def fetchmail(request, folder, mail_id, all=False):
|
||||
res = IMAPconnector(request).fetch(start=mail_id, folder=folder, all=all)
|
||||
res = IMAPconnector(user=request.user.username).fetch(start=mail_id,
|
||||
folder=folder, all=all)
|
||||
if len(res):
|
||||
return res[0]
|
||||
return None
|
||||
@@ -101,7 +102,7 @@ def viewmail(request, folder, mail_id=None):
|
||||
def getmailcontent(request, folder, mail_id):
|
||||
msg = fetchmail(request, folder, mail_id, True)
|
||||
if "class" in msg.keys() and msg["class"] == "unseen":
|
||||
IMAPconnector(request).msg_read(folder, mail_id)
|
||||
IMAPconnector(user=request.user.username).msg_read(folder, mail_id)
|
||||
email = ImapEmail(msg, mode="html", links="1")
|
||||
try:
|
||||
pageid = request.session["page"]
|
||||
@@ -140,14 +141,14 @@ def move(request):
|
||||
for arg in ["msgset", "to"]:
|
||||
if not request.GET.has_key(arg):
|
||||
return
|
||||
mbc = IMAPconnector(request)
|
||||
mbc = IMAPconnector(user=request.user.username)
|
||||
mbc.move(request.GET["msgset"], request.session["folder"], request.GET["to"])
|
||||
return folder(request, request.session["folder"], False)
|
||||
|
||||
@login_required
|
||||
@is_not_localadmin()
|
||||
def delete(request, fdname, mail_id):
|
||||
mbc = IMAPconnector(request)
|
||||
mbc = IMAPconnector(user=request.user.username)
|
||||
mbc.move(mail_id, fdname, "Trash")
|
||||
return folder(request, fdname, False)
|
||||
|
||||
@@ -156,7 +157,7 @@ def delete(request, fdname, mail_id):
|
||||
def mark(request, name):
|
||||
if not request.GET.has_key("status") or not request.GET.has_key("ids"):
|
||||
return
|
||||
mbc = IMAPconnector(request)
|
||||
mbc = IMAPconnector(user=request.user.username)
|
||||
try:
|
||||
getattr(mbc, "msg_%s" % request.GET["status"])(name, request.GET["ids"])
|
||||
except AttributeError:
|
||||
@@ -167,14 +168,14 @@ def mark(request, name):
|
||||
@is_not_localadmin()
|
||||
def empty(request, name):
|
||||
if name == "Trash":
|
||||
mbc = IMAPconnector(request)
|
||||
mbc = IMAPconnector(user=request.user.username)
|
||||
mbc.empty(name)
|
||||
return folder(request, name, False)
|
||||
|
||||
@login_required
|
||||
@is_not_localadmin()
|
||||
def compact(request, name):
|
||||
mbc = IMAPconnector(request)
|
||||
mbc = IMAPconnector(user=request.user.username)
|
||||
mbc.compact(name)
|
||||
return folder(request, name, False)
|
||||
|
||||
@@ -221,7 +222,7 @@ def send_mail(request, withctx=False, origmsg=None):
|
||||
s.login(request.user.username, request.session["password"])
|
||||
s.sendmail(msg['From'], rcpts, msg.as_string())
|
||||
s.quit()
|
||||
IMAPconnector(request).push_mail("Sent", msg)
|
||||
IMAPconnector(user=request.user.username).push_mail("Sent", msg)
|
||||
ctx = getctx("ok", url=__get_current_url(request))
|
||||
else:
|
||||
ctx = getctx("ko", level=2, listing=render_to_string("webmail/compose.html",
|
||||
@@ -247,7 +248,7 @@ def reply(request, folder, mail_id):
|
||||
if request.method == "POST":
|
||||
ctx, r = send_mail(request, True, origmsg=msg)
|
||||
if ctx["status"] == "ok":
|
||||
IMAPconnector(request).msg_answered(folder, mail_id)
|
||||
IMAPconnector(user=request.user.usernam).msg_answered(folder, mail_id)
|
||||
return r
|
||||
email = ImapEmail(msg, True)
|
||||
lines = email.body.split('\n')
|
||||
@@ -289,7 +290,7 @@ def forward(request, folder, mail_id):
|
||||
if request.method == "POST":
|
||||
ctx, response = send_mail(request, True)
|
||||
if ctx["status"] == "ok":
|
||||
IMAPconnector(request).msgforwarded(folder, mail_id)
|
||||
IMAPconnector(user=request.user.username).msgforwarded(folder, mail_id)
|
||||
return response
|
||||
|
||||
msg = fetchmail(request, folder, mail_id, True)
|
||||
|
||||
+1
-1
@@ -19,7 +19,7 @@ def _render(request, tpl, user_context):
|
||||
return render_to_response(tpl, user_context,
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
def _render_error(request, errortpl, user_context):
|
||||
def _render_error(request, errortpl="error", user_context={}):
|
||||
return render_to_response("common/%s.html" % errortpl, user_context,
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
|
||||
+2
-1
@@ -15,7 +15,8 @@ events = ["CreateDomain",
|
||||
"UserMenuDisplay",
|
||||
"AdminMenuDisplay",
|
||||
|
||||
"UserLogin"]
|
||||
"UserLogin",
|
||||
"UserLogout"]
|
||||
|
||||
callbacks = {}
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
</li>
|
||||
|
||||
<li>
|
||||
{% url django.contrib.auth.views.logout_then_login as logout_url %}
|
||||
{% url mailng.auth.views.dologout as logout_url %}
|
||||
<a href="{{ logout_url }}">
|
||||
<img src="/static/pics/logout.png" border="0" />{% trans "Logout" %}</a>
|
||||
</li>
|
||||
|
||||
@@ -22,7 +22,7 @@ urlpatterns = patterns('',
|
||||
(r'^mailng/admin/', include('mailng.admin.urls')),
|
||||
(r'^mailng/userprefs/', include('mailng.userprefs.urls')),
|
||||
(r'^accounts/login/$', 'mailng.auth.views.dologin'),
|
||||
(r'^accounts/logout/$', 'django.contrib.auth.views.logout_then_login'),
|
||||
(r'^accounts/logout/$', 'mailng.auth.views.dologout'),
|
||||
(r'^jsi18n/$', 'django.views.i18n.javascript_catalog',
|
||||
{'packages': ('mailng',),}),
|
||||
|
||||
|
||||
Reference in New Issue
Block a user