|
1 | 1 | # -*- coding: UTF-8
|
| 2 | +from nacl.encoding import Base64Encoder |
| 3 | + |
2 | 4 | from globaleaks import models
|
3 | 5 | from globaleaks.db.appdata import load_appdata, db_load_defaults
|
| 6 | +from globaleaks.handlers.admin.context import db_create_context |
| 7 | +from globaleaks.handlers.admin.node import db_update_enabled_languages |
| 8 | +from globaleaks.handlers.admin.user import db_create_user |
4 | 9 | from globaleaks.handlers.base import BaseHandler
|
5 |
| -from globaleaks.handlers.wizard import db_wizard |
6 |
| -from globaleaks.models import config, serializers |
| 10 | +from globaleaks.models import config, profiles, serializers |
7 | 11 | from globaleaks.models.config import db_get_configs, \
|
8 | 12 | db_get_config_variable, db_set_config_variable
|
9 | 13 | from globaleaks.orm import db_del, db_get, transact, tw
|
10 | 14 | from globaleaks.rest import errors, requests
|
| 15 | +from globaleaks.utils.crypto import GCE |
| 16 | +from globaleaks.utils.log import log |
| 17 | +from globaleaks.utils.sock import isIPAddress |
11 | 18 | from globaleaks.utils.tls import gen_selfsigned_certificate
|
12 | 19 |
|
13 | 20 |
|
@@ -109,6 +116,133 @@ def get(session, tid):
|
109 | 116 | return serializers.serialize_tenant(session, db_get(session, models.Tenant, models.Tenant.id == tid))
|
110 | 117 |
|
111 | 118 |
|
| 119 | +def db_wizard(session, tid, hostname, request): |
| 120 | + """ |
| 121 | + Transaction for the handling of wizard request |
| 122 | +
|
| 123 | + :param session: An ORM session |
| 124 | + :param tid: A tenant ID |
| 125 | + :param hostname: The hostname to be configured |
| 126 | + :param request: A user request |
| 127 | + """ |
| 128 | + admin_password = receiver_password = '' |
| 129 | + |
| 130 | + language = request['node_language'] |
| 131 | + |
| 132 | + root_tenant_node = config.ConfigFactory(session, 1) |
| 133 | + |
| 134 | + if tid == 1: |
| 135 | + node = root_tenant_node |
| 136 | + encryption = True |
| 137 | + escrow = request['admin_escrow'] |
| 138 | + else: |
| 139 | + node = config.ConfigFactory(session, tid) |
| 140 | + encryption = root_tenant_node.get_val('encryption') |
| 141 | + escrow = root_tenant_node.get_val('crypto_escrow_pub_key') != '' |
| 142 | + |
| 143 | + if node.get_val('wizard_done'): |
| 144 | + log.err("DANGER: Wizard already initialized!", tid=tid) |
| 145 | + raise errors.ForbiddenOperation |
| 146 | + |
| 147 | + db_update_enabled_languages(session, tid, [language], language) |
| 148 | + |
| 149 | + node.set_val('encryption', encryption) |
| 150 | + |
| 151 | + node.set_val('name', request['node_name']) |
| 152 | + node.set_val('default_language', language) |
| 153 | + node.set_val('wizard_done', True) |
| 154 | + node.set_val('enable_developers_exception_notification', request['enable_developers_exception_notification']) |
| 155 | + |
| 156 | + if tid == 1 and not isIPAddress(hostname): |
| 157 | + node.set_val('hostname', hostname) |
| 158 | + |
| 159 | + profiles.load_profile(session, tid, request['profile']) |
| 160 | + |
| 161 | + if encryption and escrow: |
| 162 | + crypto_escrow_prv_key, crypto_escrow_pub_key = GCE.generate_keypair() |
| 163 | + |
| 164 | + node.set_val('crypto_escrow_pub_key', crypto_escrow_pub_key) |
| 165 | + |
| 166 | + if tid != 1 and root_tenant_node.get_val('crypto_escrow_pub_key'): |
| 167 | + node.set_val('crypto_escrow_prv_key', Base64Encoder.encode(GCE.asymmetric_encrypt(root_tenant_node.get_val('crypto_escrow_pub_key'), crypto_escrow_prv_key))) |
| 168 | + |
| 169 | + if not request['skip_admin_account_creation']: |
| 170 | + admin_desc = models.User().dict(language) |
| 171 | + admin_desc['username'] = request['admin_username'] |
| 172 | + admin_desc['name'] = request['admin_name'] |
| 173 | + admin_desc['password'] = request['admin_password'] |
| 174 | + admin_desc['mail_address'] = request['admin_mail_address'] |
| 175 | + admin_desc['language'] = language |
| 176 | + admin_desc['role'] = 'admin' |
| 177 | + admin_desc['pgp_key_remove'] = False |
| 178 | + admin_user = db_create_user(session, tid, None, admin_desc, language) |
| 179 | + admin_user.password_change_needed = (tid != 1) |
| 180 | + |
| 181 | + if encryption and escrow: |
| 182 | + node.set_val('crypto_escrow_pub_key', crypto_escrow_pub_key) |
| 183 | + admin_user.crypto_escrow_prv_key = Base64Encoder.encode(GCE.asymmetric_encrypt(admin_user.crypto_pub_key, crypto_escrow_prv_key)) |
| 184 | + |
| 185 | + if not request['skip_recipient_account_creation']: |
| 186 | + receiver_desc = models.User().dict(language) |
| 187 | + receiver_desc['username'] = request['receiver_username'] |
| 188 | + receiver_desc['password'] = request['receiver_password'] |
| 189 | + receiver_desc['name'] = request['receiver_name'] |
| 190 | + receiver_desc['mail_address'] = request['receiver_mail_address'] |
| 191 | + receiver_desc['language'] = language |
| 192 | + receiver_desc['role'] = 'receiver' |
| 193 | + receiver_desc['pgp_key_remove'] = False |
| 194 | + receiver_user = db_create_user(session, tid, None, receiver_desc, language) |
| 195 | + receiver_user.password_change_needed = (tid != 1) |
| 196 | + |
| 197 | + context_desc = models.Context().dict(language) |
| 198 | + context_desc['name'] = 'Default' |
| 199 | + context_desc['status'] = 'enabled' |
| 200 | + |
| 201 | + if not request['skip_recipient_account_creation']: |
| 202 | + context_desc['receivers'] = [receiver_user.id] |
| 203 | + |
| 204 | + context = db_create_context(session, tid, None, context_desc, language) |
| 205 | + |
| 206 | + # Root tenants initialization terminates here |
| 207 | + |
| 208 | + if tid == 1: |
| 209 | + return |
| 210 | + |
| 211 | + # Secondary tenants initialization starts here |
| 212 | + subdomain = node.get_val('subdomain') |
| 213 | + rootdomain = root_tenant_node.get_val('rootdomain') |
| 214 | + if subdomain and rootdomain: |
| 215 | + node.set_val('hostname', subdomain + "." + rootdomain) |
| 216 | + |
| 217 | + mode = node.get_val('mode') |
| 218 | + |
| 219 | + if mode != 'default': |
| 220 | + node.set_val('tor', False) |
| 221 | + |
| 222 | + if mode in ['wbpa']: |
| 223 | + node.set_val('simplified_login', True) |
| 224 | + |
| 225 | + for varname in ['anonymize_outgoing_connections', |
| 226 | + 'password_change_period', |
| 227 | + 'default_questionnaire']: |
| 228 | + node.set_val(varname, root_tenant_node.get_val(varname)) |
| 229 | + |
| 230 | + context.questionnaire_id = root_tenant_node.get_val('default_questionnaire') |
| 231 | + |
| 232 | + # Set data retention policy to 12 months |
| 233 | + context.tip_timetolive = 365 |
| 234 | + |
| 235 | + if not request['skip_recipient_account_creation']: |
| 236 | + receiver_user.can_edit_general_settings = True |
| 237 | + |
| 238 | + # Set the recipient name equal to the node name |
| 239 | + receiver_user.name = receiver_user.public_name = request['node_name'] |
| 240 | + |
| 241 | +@transact |
| 242 | +def wizard(session, tid, hostname, request): |
| 243 | + return db_wizard(session, tid, hostname, request) |
| 244 | + |
| 245 | + |
112 | 246 | @transact
|
113 | 247 | def update(session, tid, request):
|
114 | 248 | root_tenant_config = config.ConfigFactory(session, 1)
|
|
0 commit comments