Ejemplo n.º 1
0
    def create_receiver_with_contexts(self, store):
        c = self.localization_set(self.dummyContext, models.Context, 'en')
        r = self.localization_set(self.dummyReceiver_1, models.Receiver, 'en')

        receiver_user = models.User(self.dummyReceiverUser_1)
        receiver_user.last_login = self.dummyReceiverUser_1['last_login']
        receiver_user.password_change_date = self.dummyReceiverUser_1['password_change_date']
        # Avoid receivers with the same username!
        receiver_user.username = u'xxx'
        store.add(receiver_user)

        receiver = models.Receiver(r)
        receiver.user = receiver_user
        receiver.gpg_key_status = u'disabled'
        receiver.mail_address = u'*****@*****.**'

        context1 = models.Context(c)

        context1.submission_timetolive = context1.tip_timetolive = 1000
        context1.description = context1.name = \
            context1.submission_disclaimer = \
            context1.submission_introduction = {'en': 'Valar Morghulis'}

        context2 = models.Context(c)

        context2.submission_timetolive = context2.tip_timetolive = 1000
        context2.description = context2.name =\
            context2.submission_disclaimer = \
            context2.submission_introduction = {'en': 'Valar Dohaeris'}

        receiver.contexts.add(context1)
        receiver.contexts.add(context2)
        store.add(receiver)
        return receiver.id
Ejemplo n.º 2
0
def db_create_context(store, request, language):
    """
    Creates a new context from the request of a client.

    We associate to the context the list of receivers and if the receiver is
    not valid we raise a ReceiverIdNotFound exception.

    Args:
        (dict) the request containing the keys to set on the model.

    Returns:
        (dict) representing the configured context
    """
    receivers = request.get('receivers', [])
    steps = request.get('steps', [])

    fill_localized_keys(request, models.Context.localized_strings, language)

    context = models.Context(request)

    # Integrity checks related on name (need to exists, need to be unique)
    # are performed only using the default language at the moment (XXX)
    try:
        context_name = request['name'][language]
    except Exception as excep:
        raise errors.InvalidInputFormat("language %s do not provide name: %s" %
                                        (language, excep))
    if len(context_name) < 1:
        log.err("Invalid request: name is an empty string")
        raise errors.InvalidInputFormat(
            "Context name is missing (1 char required)")

    if request['select_all_receivers']:
        if request['maximum_selectable_receivers']:
            log.debug(
                "Resetting maximum_selectable_receivers (%d) because 'select_all_receivers' is True"
                % request['maximum_selectable_receivers'])
        request['maximum_selectable_receivers'] = 0

    # tip_timetolive to be converted in seconds since hours and days
    context.tip_timetolive = acquire_context_timetolive(
        int(request['tip_timetolive']))

    c = store.add(context)

    for receiver_id in receivers:
        receiver = models.Receiver.get(store, receiver_id)
        if not receiver:
            log.err("Creation error: unexistent context can't be associated")
            raise errors.ReceiverIdNotFound
        c.receivers.add(receiver)

    if steps:
        db_create_steps(store, c.id, steps, language)
    else:
        db_setup_default_steps(store, c.id)

    log.debug("Created context %s (using %s)" % (context_name, language))

    return admin_serialize_context(store, context, language)
Ejemplo n.º 3
0
    def context_add(self, store):
        c = self.localization_set(self.dummyContext, models.Context, 'en')
        context = models.Context(c)

        context.submission_timetolive = context.tip_timetolive = 1000
        context.description = context.name = \
            context.submission_disclaimer = \
            context.submission_introduction = {'en': 'Localized723'}
        store.add(context)
        return context.id
Ejemplo n.º 4
0
    def create_context_with_receivers(self, store):
        u1 = self.localization_set(self.dummyReceiverUser_1, models.User, 'en')
        receiver_user1 = models.User(u1)
        receiver_user1.last_login = self.dummyReceiverUser_1['last_login']
        receiver_user1.password_change_date = self.dummyReceiverUser_1[
            'password_change_date']

        u2 = self.localization_set(self.dummyReceiverUser_2, models.User, 'en')
        receiver_user2 = models.User(u2)
        receiver_user2.last_login = self.dummyReceiverUser_2['last_login']
        receiver_user2.password_change_date = self.dummyReceiverUser_2[
            'password_change_date']

        store.add(receiver_user1)
        store.add(receiver_user2)

        c = self.localization_set(self.dummyContext, models.Context, 'en')
        context = models.Context(c)

        context.tip_timetolive = 1000
        context.description = context.name = \
            context.submission_disclaimer = \
            context.submission_introduction = {'en': 'Localized76w'}

        r1 = self.localization_set(self.dummyReceiver_1, models.Receiver, 'en')
        r2 = self.localization_set(self.dummyReceiver_2, models.Receiver, 'en')
        receiver1 = models.Receiver(r1)
        receiver2 = models.Receiver(r2)

        receiver1.user = receiver_user1
        receiver2.user = receiver_user2

        receiver1.user.pgp_key_status = u'disabled'
        receiver1.user.pgp_key_expiration = "1970-01-01 00:00:00.000000"
        receiver1.user.pgp_key_fingerprint = ""
        receiver1.user.pgp_key_info = ""
        receiver1.user.pgp_key_public = ""

        receiver2.user.pgp_key_status = u'disabled'
        receiver2.user.pgp_key_expiration = "1970-01-01 00:00:00.000000"
        receiver2.user.pgp_key_fingerprint = ""
        receiver2.user.pgp_key_info = ""
        receiver2.user.pgp_key_public = ""

        receiver1.mail_address = '*****@*****.**'
        receiver2.mail_address = '*****@*****.**'

        context.receivers.add(receiver1)
        context.receivers.add(receiver2)

        store.add(context)

        return context.id
Ejemplo n.º 5
0
    def create_receiver_with_contexts(self, store):
        c = self.localization_set(self.dummyContext, models.Context, 'en')
        r = self.localization_set(self.dummyReceiver_1, models.Receiver, 'en')

        u = self.localization_set(self.dummyReceiverUser_1, models.User, 'en')
        receiver_user = models.User(u)
        receiver_user.last_login = self.dummyReceiverUser_1['last_login']
        receiver_user.password_change_date = self.dummyReceiverUser_1[
            'password_change_date']
        # Avoid receivers with the same username!
        receiver_user.username = u'xxx'
        store.add(receiver_user)

        receiver = models.Receiver(r)
        receiver.user = receiver_user
        receiver.user.pgp_key_status = u'disabled'
        receiver.user.pgp_key_expiration = "1970-01-01 00:00:00.000000"
        receiver.user.pgp_key_fingerprint = ""
        receiver.user.pgp_key_info = ""
        receiver.user.pgp_key_public = ""
        receiver.mail_address = u'*****@*****.**'

        context1 = models.Context(c)
        context1.questionnaire_id = db_get_default_questionnaire_id(store)
        context1.tip_timetolive = 1000
        context1.description = context1.name = \
            context1.submission_disclaimer = \
            context1.submission_introduction = {'en': 'Valar Morghulis'}

        context2 = models.Context(c)
        context2.questionnaire_id = db_get_default_questionnaire_id(store)
        context2.tip_timetolive = 1000
        context2.description = context2.name = \
            context2.submission_disclaimer = \
            context2.submission_introduction = {'en': 'Valar Dohaeris'}

        receiver.contexts.add(context1)
        receiver.contexts.add(context2)
        store.add(receiver)
        return receiver.id
Ejemplo n.º 6
0
def wizard(store, request, language):
    models.db_delete(store, l10n.EnabledLanguage, l10n.EnabledLanguage.name != language)

    node = config.NodeFactory(store)

    if node.get_val(u'wizard_done'):
        log.err("DANGER: Wizard already initialized!")
        raise errors.ForbiddenOperation

    node._query_group()

    node.set_val(u'name', request['node_name'])
    node.set_val(u'default_language', language)
    node.set_val(u'wizard_done', True)

    node_l10n = l10n.NodeL10NFactory(store)

    node_l10n.set_val(u'header_title_homepage', language, request['node_name'])

    profiles.load_profile(store, request['profile'])

    receiver_desc = models.User().dict(language)
    receiver_desc['username'] = u'recipient'
    receiver_desc['name'] = receiver_desc['public_name'] = request['receiver_name']
    receiver_desc['mail_address'] = request['receiver_mail_address']
    receiver_desc['language'] = language
    receiver_desc['role'] =u'receiver'
    receiver_desc['deletable'] = True
    receiver_desc['pgp_key_remove'] = False

    _, receiver = db_create_receiver_user(store, receiver_desc, language)

    context_desc = models.Context().dict(language)
    context_desc['name'] = u'Default'
    context_desc['receivers'] = [receiver.id]

    context = db_create_context(store, context_desc, language)

    admin_desc = models.User().dict(language)
    admin_desc['username'] = u'admin'
    admin_desc['password'] = request['admin_password']
    admin_desc['name'] = admin_desc['public_name'] = request['admin_name']
    admin_desc['mail_address'] = request['admin_mail_address']
    admin_desc['language'] = language
    admin_desc['role'] =u'admin'
    admin_desc['deletable'] = False
    admin_desc['pgp_key_remove'] = False
    admin_desc['password_change_needed'] = False

    db_create_admin_user(store, admin_desc, language)

    db_refresh_memory_variables(store)
Ejemplo n.º 7
0
def db_create_context(store, request, language):
    request = fill_context_request(request, language)

    if request['questionnaire_id'] == '':
        request['questionnaire_id'] = db_get_default_questionnaire_id(store)

    context = models.Context(request)

    store.add(context)

    db_associate_context_receivers(store, context, request['receivers'])

    return context
Ejemplo n.º 8
0
def db_create_context(store, request, language):
    request = fill_context_request(request, language)

    context = models.Context(request)

    store.add(context)

    if request['reset_questionnaire']:
        db_setup_default_questionnaire(store, context)
    else:
        db_create_steps(store, context, request['steps'], language)

    db_associate_context_receivers(store, context, request['receivers'])

    return context
Ejemplo n.º 9
0
def db_create_context(store, request, language):
    request = fill_context_request(request, language)

    if request['questionnaire_id'] == '':
        request['questionnaire_id'] = db_get_default_questionnaire_id(store)

    if not request['allow_recipients_selection']:
        request['select_all_receivers'] = True

    context = models.Context(request)

    store.add(context)

    db_associate_context_receivers(store, context, request['receivers'])

    return context
Ejemplo n.º 10
0
    def create_context_with_receivers(self, store):
        u1 = self.localization_set(self.dummyReceiverUser_1, models.User, 'en')
        receiver_user1 = models.User(u1)
        receiver_user1.password = self.dummyReceiverUser_1['password']
        receiver_user1.salt = self.dummyReceiverUser_1['salt']

        u2 = self.localization_set(self.dummyReceiverUser_2, models.User, 'en')
        receiver_user2 = models.User(u2)
        receiver_user2.password = self.dummyReceiverUser_2['password']
        receiver_user2.salt = self.dummyReceiverUser_2['salt']

        store.add(receiver_user1)
        store.add(receiver_user2)

        c = self.localization_set(self.dummyContext, models.Context, 'en')
        context = models.Context(c)
        context.questionnaire_id = db_get_default_questionnaire_id(store)
        context.tip_timetolive = 1000
        context.description = context.name = \
            context.submission_disclaimer = \
            context.submission_introduction = {'en': 'Localized76w'}

        r1 = self.localization_set(self.dummyReceiver_1, models.Receiver, 'en')
        r2 = self.localization_set(self.dummyReceiver_2, models.Receiver, 'en')
        receiver1 = models.Receiver(r1)
        receiver2 = models.Receiver(r2)

        receiver1.user = receiver_user1
        receiver2.user = receiver_user2

        receiver1.user.pgp_key_expiration = "1970-01-01 00:00:00.000000"
        receiver1.user.pgp_key_fingerprint = ""
        receiver1.user.pgp_key_public = ""

        receiver2.user.pgp_key_expiration = "1970-01-01 00:00:00.000000"
        receiver2.user.pgp_key_fingerprint = ""
        receiver2.user.pgp_key_public = ""

        receiver1.mail_address = '*****@*****.**'
        receiver2.mail_address = '*****@*****.**'

        context.receivers.add(receiver1)
        context.receivers.add(receiver2)

        store.add(context)

        return context.id
Ejemplo n.º 11
0
def db_wizard(session, state, tid, request, client_using_tor, language):
    node = config.ConfigFactory(session, tid, 'node')

    if node.get_val(u'wizard_done'):
        log.err("DANGER: Wizard already initialized!", tid=tid)
        raise errors.ForbiddenOperation

    db_update_enabled_languages(session, tid, [language], language)

    tenant = models.db_get(session, models.Tenant, models.Tenant.id == tid)
    tenant.label = request['node_name']

    node.set_val(u'name', request['node_name'])
    node.set_val(u'default_language', language)
    node.set_val(u'wizard_done', True)
    node.set_val(u'enable_developers_exception_notification',
                 request['enable_developers_exception_notification'])

    # Guess Tor configuration from thee media used on first configuration and
    # if the user is using Tor preserve node anonymity and perform outgoing connections via Tor
    node.set_val(u'reachable_via_web', not client_using_tor)
    node.set_val(u'allow_unencrypted', not client_using_tor)
    node.set_val(u'anonymize_outgoing_connections', client_using_tor)
    node.set_val(u'disable_encryption_warnings', not client_using_tor)

    node_l10n = config.NodeL10NFactory(session, tid)
    node_l10n.set_val(u'header_title_homepage', language, request['node_name'])

    profiles.load_profile(session, tid, request['profile'])

    receiver_desc = models.User().dict(language)
    receiver_desc['name'] = request['receiver_name']
    receiver_desc['username'] = u'recipient'
    receiver_desc['name'] = request['receiver_name']
    receiver_desc['mail_address'] = request['receiver_mail_address']
    receiver_desc['language'] = language
    receiver_desc['role'] = u'receiver'
    receiver_desc['deletable'] = True
    receiver_desc['pgp_key_remove'] = False

    _, receiver = db_create_receiver_user(session, state, tid, receiver_desc,
                                          language)

    context_desc = models.Context().dict(language)
    context_desc['name'] = u'Default'
    context_desc['receivers'] = [receiver.id]

    db_create_context(session, state, tid, context_desc, language)

    admin_desc = models.User().dict(language)
    admin_desc['name'] = request['admin_name']
    admin_desc['username'] = u'admin'
    admin_desc['password'] = request['admin_password']
    admin_desc['name'] = request['admin_name']
    admin_desc['mail_address'] = request['admin_mail_address']
    admin_desc['language'] = language
    admin_desc['role'] = u'admin'
    admin_desc['deletable'] = False
    admin_desc['pgp_key_remove'] = False
    admin_desc['password_change_needed'] = False

    db_create_user(session, state, tid, admin_desc, language)

    db_refresh_memory_variables(session, [tid])
Ejemplo n.º 12
0
def db_wizard(session, tid, hostname, request):
    """
    Transaction for the handling of wizard request

    :param session: An ORM session
    :param tid: A tenant ID
    :param request: A user request
    """
    language = request['node_language']

    node = config.ConfigFactory(session, tid)

    if tid == 1:
        root_tenant_node = node
        encryption = True
    else:
        root_tenant_node = node
        encryption = root_tenant_node.get_val('encryption')

    if node.get_val('wizard_done'):
        log.err("DANGER: Wizard already initialized!", tid=tid)
        raise errors.ForbiddenOperation

    db_update_enabled_languages(session, tid, [language], language)

    node.set_val('encryption', encryption)
    node.set_val('name', request['node_name'])
    node.set_val('default_language', language)
    node.set_val('wizard_done', True)
    node.set_val('enable_developers_exception_notification',
                 request['enable_developers_exception_notification'])
    node.set_val('hostname', hostname)

    node_l10n = config.ConfigL10NFactory(session, tid)
    node_l10n.set_val('header_title_homepage', language, request['node_name'])

    profiles.load_profile(session, tid, request['profile'])

    if encryption:
        crypto_escrow_prv_key, crypto_escrow_pub_key = GCE.generate_keypair()
        node.set_val('crypto_escrow_pub_key', crypto_escrow_pub_key)

    admin_desc = models.User().dict(language)
    admin_desc['username'] = request['admin_username']
    admin_desc['name'] = request['admin_name']
    admin_desc['password'] = request['admin_password']
    admin_desc['name'] = request['admin_name']
    admin_desc['mail_address'] = request['admin_mail_address']
    admin_desc['language'] = language
    admin_desc['role'] = 'admin'
    admin_desc['pgp_key_remove'] = False

    admin_user = db_create_user(session, tid, admin_desc, language)
    admin_user.password = GCE.hash_password(request['admin_password'],
                                            admin_user.salt)
    admin_user.password_change_needed = False
    admin_user.password_change_date = datetime_now()

    if encryption:
        db_gen_user_keys(session, tid, admin_user, request['admin_password'])
        admin_user.crypto_escrow_prv_key = Base64Encoder.encode(
            GCE.asymmetric_encrypt(admin_user.crypto_pub_key,
                                   crypto_escrow_prv_key))

    receiver_user = None
    if not request['skip_recipient_account_creation']:
        receiver_desc = models.User().dict(language)
        receiver_desc['username'] = request['receiver_username']
        receiver_desc['name'] = request['receiver_name']
        receiver_desc['password'] = request['receiver_password']
        receiver_desc['mail_address'] = request['receiver_mail_address']
        receiver_desc['language'] = language
        receiver_desc['role'] = 'receiver'
        receiver_desc['pgp_key_remove'] = False
        receiver_desc['send_account_activation_link'] = receiver_desc[
            'password'] == ''
        receiver_user = db_create_user(session, tid, receiver_desc, language)

        if receiver_desc['password']:
            receiver_user.password = GCE.hash_password(
                receiver_desc['password'], receiver_user.salt)

            if encryption:
                db_gen_user_keys(session, tid, receiver_user,
                                 receiver_desc['password'])

    context_desc = models.Context().dict(language)
    context_desc['name'] = 'Default'
    context_desc['status'] = 'enabled'

    context_desc['receivers'] = [receiver_user.id] if receiver_user else []

    context = db_create_context(session, tid, context_desc, language)

    # Root tenants initialization terminates here

    if tid == 1:
        db_refresh_memory_variables(session, [tid])
        return

    # Secondary tenants initialization starts here

    tenant = models.db_get(session, models.Tenant, models.Tenant.id == tid)
    tenant.label = request['node_name']

    mode = node.get_val('mode')

    if mode not in ['default', 'demo']:
        node.set_val(
            'hostname',
            tenant.subdomain + '.' + root_tenant_node.get_val('rootdomain'))

        for varname in [
                'reachable_via_web', 'enable_receipt_hint',
                'disable_privacy_badge', 'simplified_login',
                'can_delete_submission', 'can_postpone_expiration',
                'anonymize_outgoing_connections', 'frame_ancestors',
                'password_change_period', 'default_questionnaire',
                'enable_password_reset'
        ]:
            node.set_val(varname, root_tenant_node.get_val(varname))

        context.questionnaire_id = root_tenant_node.get_val(
            'default_questionnaire')

        # Set data retention policy to 18 months
        context.tip_timetolive = 540

        # Delete the admin user
        request['admin_password'] = ''
        session.delete(admin_user)

        if receiver_user is not None:
            # Enable the recipient user to configure platform general settings
            receiver_user.can_edit_general_settings = True

            # Set the recipient name equal to the node name
            receiver_user.name = receiver_user.public_name = request[
                'node_name']

    # Apply the specific fixes related to whistleblowing.it projects
    if mode == 'whistleblowing.it':
        node.set_val('simplified_login', True)
        node.set_val('tor', False)

    db_refresh_memory_variables(session, [tid])
Ejemplo n.º 13
0
def db_wizard(session, tid, request, client_using_tor, language):
    language = request['node_language']

    node = config.ConfigFactory(session, tid)

    if tid != 1:
        root_tenant_node = config.ConfigFactory(session, 1)
    else:
        root_tenant_node = node

    if node.get_val(u'wizard_done'):
        log.err("DANGER: Wizard already initialized!", tid=tid)
        raise errors.ForbiddenOperation

    db_update_enabled_languages(session, tid, [language], language)

    node.set_val(u'name', request['node_name'])
    node.set_val(u'default_language', language)
    node.set_val(u'wizard_done', True)
    node.set_val(u'enable_developers_exception_notification',
                 request['enable_developers_exception_notification'])

    # Guess Tor configuration from thee media used on first configuration and
    # if the user is using Tor preserve node anonymity and perform outgoing connections via Tor
    node.set_val(u'reachable_via_web', not client_using_tor)
    node.set_val(u'allow_unencrypted', not client_using_tor)
    node.set_val(u'anonymize_outgoing_connections', client_using_tor)

    node_l10n = config.ConfigL10NFactory(session, tid)
    node_l10n.set_val(u'header_title_homepage', language, request['node_name'])

    profiles.load_profile(session, tid, request['profile'])

    admin_desc = models.User().dict(language)
    admin_desc['name'] = request['admin_name']
    admin_desc['username'] = u'admin'
    admin_desc['password'] = request['admin_password']
    admin_desc['name'] = request['admin_name']
    admin_desc['mail_address'] = request['admin_mail_address']
    admin_desc['language'] = language
    admin_desc['role'] = u'admin'
    admin_desc['deletable'] = False
    admin_desc['pgp_key_remove'] = False

    admin_user = db_create_user(session, tid, admin_desc, language)
    admin_user.password_change_needed = False
    admin_user.password_change_date = datetime_now()

    receiver_desc = models.User().dict(language)
    receiver_desc['name'] = request['receiver_name']
    receiver_desc['username'] = u'recipient'
    receiver_desc['password'] = request['receiver_password']
    receiver_desc['name'] = request['receiver_name']
    receiver_desc['mail_address'] = request['receiver_mail_address']
    receiver_desc['language'] = language
    receiver_desc['role'] = u'receiver'
    receiver_desc['deletable'] = True
    receiver_desc['pgp_key_remove'] = False

    receiver_user = db_create_user(session, tid, receiver_desc, language)

    context_desc = models.Context().dict(language)
    context_desc['status'] = 1
    context_desc['name'] = u'Default'
    context_desc['receivers'] = [receiver_user.id]

    context = db_create_context(session, tid, context_desc, language)

    # Root tenants initialization terminates here

    if tid == 1:
        db_refresh_memory_variables(session, [tid])
        return

    # Secondary tenants initialization starts here

    tenant = models.db_get(session, models.Tenant, models.Tenant.id == tid)
    tenant.label = request['node_name']

    mode = node.get_val(u'mode')

    if mode != u'default':
        node.set_val(
            u'hostname',
            tenant.subdomain + '.' + root_tenant_node.get_val(u'rootdomain'))

        for varname in [
                'reachable_via_web', 'disable_key_code_hint',
                'disable_privacy_badge', 'disable_donation_panel',
                'simplified_login', 'can_delete_submission',
                'can_postpone_expiration', 'enable_user_pgp_key_upload',
                'allow_unencrypted', 'anonymize_outgoing_connections',
                'allow_iframes_inclusion', 'password_change_period',
                'default_questionnaire'
        ]:
            node.set_val(varname, root_tenant_node.get_val(varname))

        context.questionnaire_id = root_tenant_node.get_val(
            u'default_questionnaire')

    # Apply the general settings to apply on all mode != default
    if mode != u'default':
        # Enable the recipient user to configure platform general settings
        receiver_user.can_edit_general_settings = True

        # Set data retention policy to 18 months
        context.tip_timetolive = 540

    # Apply the specific fixes related to whistleblowing.it projects
    if mode == u'whistleblowing.it':
        node.set_val(u'simplified_login', True)
        node.set_val(u'tor', False)

        # Enable recipients to load files to the whistleblower
        context.enable_rc_to_wb_files = True

        # Set the recipient name equal to the node name
        receiver_user.name = request['node_name']

        # Delete the admin user
        session.delete(admin_user)

    db_refresh_memory_variables(session, [tid])
Ejemplo n.º 14
0
def db_create_context(store, request, language):
    """
    Creates a new context from the request of a client.

    We associate to the context the list of receivers and if the receiver is
    not valid we raise a ReceiverIdNotFound exception.

    Args:
        (dict) the request containing the keys to set on the model.

    Returns:
        (dict) representing the configured context
    """
    receivers = request.get('receivers', [])
    steps = request.get('steps', [])

    fill_localized_keys(request, models.Context.localized_strings, language)

    context = models.Context(request)

    # Integrity checks related on name (need to exists, need to be unique)
    # are performed only using the default language at the moment (XXX)
    try:
        context_name = request['name'][language]
    except Exception as excep:
        raise errors.InvalidInputFormat("language %s do not provide name: %s" %
                                       (language, excep) )
    if len(context_name) < 1:
        log.err("Invalid request: name is an empty string")
        raise errors.InvalidInputFormat("Context name is missing (1 char required)")

    if request['select_all_receivers']:
        if request['maximum_selectable_receivers']:
            log.debug("Resetting maximum_selectable_receivers (%d) because 'select_all_receivers' is True" %
                      request['maximum_selectable_receivers'])
        request['maximum_selectable_receivers'] = 0

    # tip_timetolive and submission_timetolive need to be converted in seconds since hours and days
    (context.submission_timetolive, context.tip_timetolive) = acquire_context_timetolive(request)

    c = store.add(context)

    for receiver_id in receivers:
        receiver = models.Receiver.get(store, receiver_id)
        if not receiver:
            log.err("Creation error: unexistent context can't be associated")
            raise errors.ReceiverIdNotFound
        c.receivers.add(receiver)

    if steps:
        db_create_step(store, context.id, steps, language)
    else:
        appdata = store.find(models.ApplicationData).one()
        steps = copy.deepcopy(appdata.fields)
        n_s = 1
        for step in steps:
            for f_child in step['children']:
                if not field_is_present(store, f_child):
                    f_child['is_template'] = False
        for step in steps:
            f_children = copy.deepcopy(step['children'])
            del step['children']
            s = models.db_forge_obj(store, models.Step, step)
            for f_child in f_children:
                o_children = copy.deepcopy(f_child['options'])
                del f_child['options']
                # FIXME currently default updata do not handle fieldgroups
                # all this block must be redesigned in order to be called recursively
                del f_child['children']
                f = models.db_forge_obj(store, models.Field, f_child)
                n_o = 1
                for o_child in o_children:
                    o = models.db_forge_obj(store, models.FieldOption, o_child)
                    o.field_id = f.id
                    o.number = n_o
                    f.options.add(o)
                    n_o += 1
                f.step_id = s.id
                s.children.add(f)
            s.context_id = context.id
            s.number = n_s
            context.steps.add(s)
            n_s += 1

    log.debug("Created context %s (using %s)" % (context_name, language) )

    return admin_serialize_context(store, context, language)