1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
#
# Copyright (c) 2014 ThoughtWorks, Inc.
#
# Pixelated is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Pixelated 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with Pixelated. If not, see <http://www.gnu.org/licenses/>.
from pixelated.adapter.mail_service import MailService
from pixelated.adapter.mail import InputMail
from pixelated.adapter.mail_sender import MailSender
from pixelated.adapter.mailboxes import Mailboxes
from pixelated.adapter.soledad_querier import SoledadQuerier
from pixelated.adapter.search import SearchEngine
from pixelated.adapter.draft_service import DraftService
from pixelated.adapter.mailbox_indexer_listener import MailboxIndexerListener
import pixelated.bitmask_libraries.session as LeapSession
from pixelated.bitmask_libraries.leap_srp import LeapAuthException
from requests.exceptions import ConnectionError
from pixelated.controllers import *
from pixelated.adapter.tag_service import TagService
import os
import sys
from leap.common.events import (
register,
events_pb2 as proto
)
def init_index_and_remove_dupes(querier, search_engine, mail_service):
def wrapper(*args, **kwargs):
querier.remove_duplicates()
search_engine.index_mails(mails=mail_service.all_mails(),
callback=querier.mark_all_as_not_recent)
return wrapper
def update_info_sync_and_index_partial(sync_info_controller, search_engine, mail_service):
def wrapper(soledad_sync_status):
sync_info_controller.set_sync_info(soledad_sync_status)
search_engine.index_mails(mails=mail_service.all_mails())
return wrapper
def _setup_routes(app, home_controller, mails_controller, tags_controller, features_controller, sync_info_controller):
# home
app.add_url_rule('/', methods=['GET'], view_func=home_controller.home)
# mails
app.add_url_rule('/mails', methods=['GET'], view_func=mails_controller.mails)
app.add_url_rule('/mail/<mail_id>/read', methods=['POST'], view_func=mails_controller.mark_mail_as_read)
app.add_url_rule('/mail/<mail_id>/unread', methods=['POST'], view_func=mails_controller.mark_mail_as_unread)
app.add_url_rule('/mails/unread', methods=['POST'], view_func=mails_controller.mark_many_mail_unread)
app.add_url_rule('/mails/read', methods=['POST'], view_func=mails_controller.mark_many_mail_read)
app.add_url_rule('/mail/<mail_id>', methods=['GET'], view_func=mails_controller.mail)
app.add_url_rule('/mail/<mail_id>', methods=['DELETE'], view_func=mails_controller.delete_mail)
app.add_url_rule('/mails', methods=['DELETE'], view_func=mails_controller.delete_mails)
app.add_url_rule('/mails', methods=['POST'], view_func=mails_controller.send_mail)
app.add_url_rule('/mail/<mail_id>/tags', methods=['POST'], view_func=mails_controller.mail_tags)
app.add_url_rule('/mails', methods=['PUT'], view_func=mails_controller.update_draft)
# tags
app.add_url_rule('/tags', methods=['GET'], view_func=tags_controller.tags)
# features
app.add_url_rule('/features', methods=['GET'], view_func=features_controller.features)
# sync info
app.add_url_rule('/sync_info', methods=['GET'], view_func=sync_info_controller.sync_info)
def init_leap_session(app):
try:
leap_session = LeapSession.open(app.config['LEAP_USERNAME'],
app.config['LEAP_PASSWORD'],
app.config['LEAP_SERVER_NAME'])
except ConnectionError, error:
print("Can't connect to the requested provider")
sys.exit(1)
except LeapAuthException:
print("Couldn't authenticate with the credentials provided")
sys.exit(1)
return leap_session
def create_app(app, debug_enabled):
with app.app_context():
leap_session = init_leap_session(app)
tag_service = TagService()
search_engine = SearchEngine()
pixelated_mail_sender = MailSender(leap_session.account_email())
soledad_querier = SoledadQuerier(soledad=leap_session.account._soledad)
pixelated_mailboxes = Mailboxes(leap_session.account, soledad_querier)
draft_service = DraftService(pixelated_mailboxes)
mail_service = MailService(pixelated_mailboxes, pixelated_mail_sender, tag_service, soledad_querier)
MailboxIndexerListener.SEARCH_ENGINE = search_engine
InputMail.FROM_EMAIL_ADDRESS = leap_session.account_email()
home_controller = HomeController()
features_controller = FeaturesController()
mails_controller = MailsController(mail_service=mail_service,
draft_service=draft_service,
search_engine=search_engine)
tags_controller = TagsController(search_engine=search_engine)
sync_info_controller = SyncInfoController()
register(signal=proto.SOLEDAD_SYNC_RECEIVE_STATUS,
callback=update_info_sync_and_index_partial(sync_info_controller=sync_info_controller,
search_engine=search_engine,
mail_service=mail_service))
register(signal=proto.SOLEDAD_DONE_DATA_SYNC,
callback=init_index_and_remove_dupes(querier=soledad_querier,
search_engine=search_engine,
mail_service=mail_service))
_setup_routes(app, home_controller, mails_controller, tags_controller, features_controller,
sync_info_controller)
app.run(host=app.config['HOST'], debug=debug_enabled,
port=app.config['PORT'], use_reloader=False)
def get_static_folder():
static_folder = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "..", "..", "web-ui", "app"))
# this is a workaround for packaging
if not os.path.exists(static_folder):
static_folder = os.path.abspath(
os.path.join(os.path.abspath(__file__), "..", "..", "..", "..", "web-ui", "app"))
if not os.path.exists(static_folder):
static_folder = os.path.join('/', 'usr', 'share', 'pixelated-user-agent')
return static_folder
|