Statistics
| Branch: | Tag: | Revision:

root / snf-webproject / synnefo / webproject / middleware / cleanse.py @ ae8f26fc

History | View | Annotate | Download (3.7 kB)

1 f12085fa Stratos Psomadakis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 f12085fa Stratos Psomadakis
#
3 f12085fa Stratos Psomadakis
# Redistribution and use in source and binary forms, with or
4 f12085fa Stratos Psomadakis
# without modification, are permitted provided that the following
5 f12085fa Stratos Psomadakis
# conditions are met:
6 f12085fa Stratos Psomadakis
#
7 f12085fa Stratos Psomadakis
#   1. Redistributions of source code must retain the above
8 f12085fa Stratos Psomadakis
#      copyright notice, this list of conditions and the following
9 f12085fa Stratos Psomadakis
#      disclaimer.
10 f12085fa Stratos Psomadakis
#
11 f12085fa Stratos Psomadakis
#   2. Redistributions in binary form must reproduce the above
12 f12085fa Stratos Psomadakis
#      copyright notice, this list of conditions and the following
13 f12085fa Stratos Psomadakis
#      disclaimer in the documentation and/or other materials
14 f12085fa Stratos Psomadakis
#      provided with the distribution.
15 f12085fa Stratos Psomadakis
#
16 f12085fa Stratos Psomadakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 f12085fa Stratos Psomadakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 f12085fa Stratos Psomadakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 f12085fa Stratos Psomadakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 f12085fa Stratos Psomadakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 f12085fa Stratos Psomadakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 f12085fa Stratos Psomadakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 f12085fa Stratos Psomadakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 f12085fa Stratos Psomadakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 f12085fa Stratos Psomadakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 f12085fa Stratos Psomadakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 f12085fa Stratos Psomadakis
# POSSIBILITY OF SUCH DAMAGE.
28 f12085fa Stratos Psomadakis
#
29 f12085fa Stratos Psomadakis
# The views and conclusions contained in the software and
30 f12085fa Stratos Psomadakis
# documentation are those of the authors and should not be
31 f12085fa Stratos Psomadakis
# interpreted as representing official policies, either expressed
32 f12085fa Stratos Psomadakis
# or implied, of GRNET S.A.
33 f12085fa Stratos Psomadakis
34 f12085fa Stratos Psomadakis
from django.conf import settings
35 f12085fa Stratos Psomadakis
from django.core.exceptions import MiddlewareNotUsed
36 f12085fa Stratos Psomadakis
37 f12085fa Stratos Psomadakis
from django.core import mail
38 f12085fa Stratos Psomadakis
39 8ae38ff8 Stratos Psomadakis
HIDDEN_ALL = settings.HIDDEN_COOKIES + settings.HIDDEN_HEADERS
40 8ae38ff8 Stratos Psomadakis
41 74d988b0 Christos Stavrakakis
42 01d00723 Ilias Tsitsimpis
def mail_admins_safe(subject, message, fail_silently=False,
43 01d00723 Ilias Tsitsimpis
                     connection=None, html_message=None):
44 f12085fa Stratos Psomadakis
    '''
45 f12085fa Stratos Psomadakis
    Wrapper function to cleanse email body from sensitive content before
46 f12085fa Stratos Psomadakis
    sending it
47 f12085fa Stratos Psomadakis
    '''
48 8ae38ff8 Stratos Psomadakis
    new_msg = ""
49 8ae38ff8 Stratos Psomadakis
50 8ae38ff8 Stratos Psomadakis
    if len(message) > settings.MAIL_MAX_LEN:
51 8ae38ff8 Stratos Psomadakis
        new_msg += "Mail size over limit (truncated)\n\n"
52 8ae38ff8 Stratos Psomadakis
        message = message[:settings.MAIL_MAX_LEN]
53 8ae38ff8 Stratos Psomadakis
54 8ae38ff8 Stratos Psomadakis
    for line in message.splitlines():
55 8ae38ff8 Stratos Psomadakis
        # Lines of interest in the mail are in the form of
56 8ae38ff8 Stratos Psomadakis
        # key:value.
57 8ae38ff8 Stratos Psomadakis
        try:
58 8ae38ff8 Stratos Psomadakis
            (key, value) = line.split(':', 1)
59 8ae38ff8 Stratos Psomadakis
        except ValueError:
60 8ae38ff8 Stratos Psomadakis
            new_msg += line + '\n'
61 8ae38ff8 Stratos Psomadakis
            continue
62 8ae38ff8 Stratos Psomadakis
63 8ae38ff8 Stratos Psomadakis
        new_msg += key + ':'
64 8ae38ff8 Stratos Psomadakis
65 8ae38ff8 Stratos Psomadakis
        # Special case when the first header / cookie printed
66 8ae38ff8 Stratos Psomadakis
        # (prefixed by 'META:{' or 'COOKIES:{') needs to be hidden.
67 8ae38ff8 Stratos Psomadakis
        if value.startswith('{'):
68 8ae38ff8 Stratos Psomadakis
            try:
69 8ae38ff8 Stratos Psomadakis
                (newkey, newval) = value.split(':', 1)
70 8ae38ff8 Stratos Psomadakis
            except ValueError:
71 8ae38ff8 Stratos Psomadakis
                new_msg += value + '\n'
72 8ae38ff8 Stratos Psomadakis
                continue
73 f12085fa Stratos Psomadakis
74 8ae38ff8 Stratos Psomadakis
            new_msg += newkey + ':'
75 8ae38ff8 Stratos Psomadakis
            key = newkey.lstrip('{')
76 8ae38ff8 Stratos Psomadakis
            value = newval
77 f12085fa Stratos Psomadakis
78 8ae38ff8 Stratos Psomadakis
        if key.strip(" '") not in HIDDEN_ALL:
79 8ae38ff8 Stratos Psomadakis
            new_msg += value + '\n'
80 8ae38ff8 Stratos Psomadakis
            continue
81 8ae38ff8 Stratos Psomadakis
82 8ae38ff8 Stratos Psomadakis
        # Append value[-1] to the clensed string, so that commas / closing
83 8ae38ff8 Stratos Psomadakis
        # brackets are printed correctly.
84 8ae38ff8 Stratos Psomadakis
        # (it will 'eat up' the closing bracket if the header is the last one
85 8ae38ff8 Stratos Psomadakis
        # printed)
86 8ae38ff8 Stratos Psomadakis
        new_msg += ' ' + '*'*8 + value[-1] + '\n'
87 8ae38ff8 Stratos Psomadakis
88 8ae38ff8 Stratos Psomadakis
    return mail.mail_admins_plain(subject, new_msg, fail_silently, connection)
89 f12085fa Stratos Psomadakis
90 74d988b0 Christos Stavrakakis
91 f12085fa Stratos Psomadakis
class CleanseSettingsMiddleware(object):
92 8ae38ff8 Stratos Psomadakis
    '''
93 8ae38ff8 Stratos Psomadakis
    Prevent django from printing sensitive information (paswords, tokens
94 8ae38ff8 Stratos Psomadakis
    etc), when handling server errors (for both DEBUG and no-DEBUG
95 8ae38ff8 Stratos Psomadakis
    deployments.
96 8ae38ff8 Stratos Psomadakis
    '''
97 f12085fa Stratos Psomadakis
    def __init__(self):
98 86b446dd Kostas Papadimitriou
        if not hasattr(mail, 'mail_admins_plain'):
99 86b446dd Kostas Papadimitriou
            mail.mail_admins_plain = mail.mail_admins
100 86b446dd Kostas Papadimitriou
            mail.mail_admins = mail_admins_safe
101 f12085fa Stratos Psomadakis
102 f12085fa Stratos Psomadakis
        raise MiddlewareNotUsed('cleanse settings')