Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F117884412
module_footer.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
4 KB
Referenced Files
None
Subscribers
None
module_footer.py
View Options
# -*- coding: utf-8 -*-
# Copyright 2010-2013 Kolab Systems AG (http://www.kolabsys.com)
#
# Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen a kolabsys.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import
os
import
tempfile
import
time
from
email
import
message_from_file
import
modules
import
pykolab
from
pykolab.translate
import
_
log
=
pykolab
.
getLogger
(
'pykolab.wallace'
)
conf
=
pykolab
.
getConf
()
mybasepath
=
'/var/spool/pykolab/wallace/footer/'
def
__init__
():
modules
.
register
(
'footer'
,
execute
,
description
=
description
())
def
description
():
return
"""Append a footer to messages."""
def
execute
(
*
args
,
**
kw
):
if
not
os
.
path
.
isdir
(
mybasepath
):
os
.
makedirs
(
mybasepath
)
for
stage
in
[
'incoming'
,
'ACCEPT'
]:
if
not
os
.
path
.
isdir
(
os
.
path
.
join
(
mybasepath
,
stage
)):
os
.
makedirs
(
os
.
path
.
join
(
mybasepath
,
stage
))
# TODO: Test for correct call.
filepath
=
args
[
0
]
if
kw
.
has_key
(
'stage'
):
log
.
debug
(
_
(
"Issuing callback after processing to stage
%s
"
)
%
(
kw
[
'stage'
]),
level
=
8
)
log
.
debug
(
_
(
"Testing cb_action_
%s
()"
)
%
(
kw
[
'stage'
]),
level
=
8
)
if
hasattr
(
modules
,
'cb_action_
%s
'
%
(
kw
[
'stage'
])):
log
.
debug
(
_
(
"Attempting to execute cb_action_
%s
()"
)
%
(
kw
[
'stage'
]),
level
=
8
)
exec
(
'modules.cb_action_
%s
(
%r
,
%r
)'
%
(
kw
[
'stage'
],
'optout'
,
filepath
))
return
log
.
debug
(
_
(
"Executing module footer for
%r
,
%r
"
)
%
(
args
,
kw
),
level
=
8
)
new_filepath
=
os
.
path
.
join
(
'/var/spool/pykolab/wallace/footer/incoming'
,
os
.
path
.
basename
(
filepath
))
os
.
rename
(
filepath
,
new_filepath
)
filepath
=
new_filepath
# parse message
message
=
message_from_file
(
open
(
filepath
,
'r'
))
# Possible footer answers are limited to ACCEPT only
answers
=
[
'ACCEPT'
]
footer
=
{}
footer_html_file
=
conf
.
get
(
'wallace'
,
'footer_html'
)
footer_text_file
=
conf
.
get
(
'wallace'
,
'footer_text'
)
if
not
os
.
path
.
isfile
(
footer_text_file
)
and
not
os
.
path
.
isfile
(
footer_html_file
):
log
.
warning
(
_
(
"No contents configured for footer module"
))
exec
(
'modules.cb_action_
%s
(
%r
,
%r
)'
%
(
'ACCEPT'
,
'footer'
,
filepath
))
return
if
os
.
path
.
isfile
(
footer_text_file
):
footer
[
'plain'
]
=
open
(
footer_text_file
,
'r'
)
.
read
()
if
not
os
.
path
.
isfile
(
footer_html_file
):
footer
[
'html'
]
=
'<p>'
+
footer
[
'plain'
]
+
'</p>'
else
:
footer
[
'html'
]
=
open
(
footer_html_file
,
'r'
)
.
read
()
if
footer
[
'html'
]
==
""
:
footer
[
'html'
]
=
'<p>'
+
footer
[
'plain'
]
+
'</p>'
if
footer
[
'plain'
]
==
""
and
footer
[
'html'
]
==
"<p></p>"
:
exec
(
'modules.cb_action_
%s
(
%r
,
%r
)'
%
(
'ACCEPT'
,
'footer'
,
filepath
))
return
footer_added
=
False
try
:
_footer_added
=
message
.
get
(
"X-Wallace-Footer"
)
except
:
pass
if
_footer_added
==
"YES"
:
exec
(
'modules.cb_action_
%s
(
%r
,
%r
)'
%
(
'ACCEPT'
,
'footer'
,
filepath
))
return
for
part
in
message
.
walk
():
disposition
=
None
try
:
content_type
=
part
.
get_content_type
()
except
:
continue
try
:
disposition
=
part
.
get
(
"Content-Disposition"
)
except
:
pass
log
.
debug
(
"Walking message part:
%s
; disposition =
%r
"
%
(
content_type
,
disposition
),
level
=
8
)
if
not
disposition
==
None
:
continue
if
content_type
==
"text/plain"
:
content
=
part
.
get_payload
()
content
+=
"
\n\n
--
\n
%s
"
%
(
footer
[
'plain'
])
part
.
set_payload
(
content
)
footer_added
=
True
log
.
debug
(
"Text footer attached."
,
level
=
6
)
elif
content_type
==
"text/html"
:
content
=
part
.
get_payload
()
append
=
"
\n
<!-- footer appended by Wallace -->
\n
"
+
footer
[
'html'
]
if
"</body>"
in
content
:
part
.
set_payload
(
content
.
replace
(
"</body>"
,
append
+
"</body>"
))
else
:
part
.
set_payload
(
"<html><body>"
+
content
+
append
+
"</body></html>"
)
footer_added
=
True
log
.
debug
(
"HTML footer attached."
,
level
=
6
)
if
footer_added
:
log
.
debug
(
"Footer attached."
)
message
.
add_header
(
"X-Wallace-Footer"
,
"YES"
)
(
fp
,
new_filepath
)
=
tempfile
.
mkstemp
(
dir
=
"/var/spool/pykolab/wallace/footer/ACCEPT"
)
os
.
write
(
fp
,
message
.
as_string
())
os
.
close
(
fp
)
os
.
unlink
(
filepath
)
exec
(
'modules.cb_action_
%s
(
%r
,
%r
)'
%
(
'ACCEPT'
,
'footer'
,
new_filepath
))
File Metadata
Details
Attached
Mime Type
text/x-script.python
Expires
Mon, Apr 6, 1:26 AM (2 d, 23 h ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
f9/ad/fa5b1d20793d66670a53cdd446ba
Default Alt Text
module_footer.py (4 KB)
Attached To
Mode
rP pykolab
Attached
Detach File
Event Timeline