예제 #1
0
def request_permissions(ownername, projectname):
    copr = get_copr(ownername, projectname)
    roles = flask.request.get_json()
    if not isinstance(roles, dict):
        raise BadRequest("invalid 'roles' dict format, expected: "
                         "{'admin': True, 'builder': False}")
    if not roles:
        raise BadRequest("no permission requested")

    permission_dict = {}
    with db_session_scope():
        for permission, request_bool in roles.items():
            change = CoprPermissionsLogic.request_permission(
                copr, flask.g.user, permission, request_bool)
            if change:
                permission_dict['old_' + permission] = change[0]
                permission_dict['new_' + permission] = change[1]

    if permission_dict:
        msg = PermissionRequestMessage(copr, flask.g.user, permission_dict)
        for address in copr.admin_mails:
            if flask.current_app.config.get("SEND_EMAILS", False):
                send_mail([address], msg)

    return flask.jsonify({'updated': bool(permission_dict)})
예제 #2
0
    def notify(self, user, chroots):
        msg = OutdatedChrootMessage(chroots)
        send_mail([user.mail], msg)

        # If `send_mail` didn't raise any exception,
        # we consider the email to be sent correctly
        for chroot in chroots:
            chroot.delete_notify = datetime.datetime.now()
예제 #3
0
def process_legal_flag(copr):
    form = forms.CoprLegalFlagForm()
    legal_flag = models.LegalFlag(raise_message=form.comment.data,
                                  raised_on=int(time.time()),
                                  copr=copr,
                                  reporter=flask.g.user)
    db.session.add(legal_flag)
    db.session.commit()

    send_to = app.config["SEND_LEGAL_TO"] or ["root@localhost"]
    msg = LegalFlagMessage(copr, flask.g.user, form.comment.data)
    send_mail(send_to, msg)

    flask.flash("Admin has been noticed about your report"
                " and will investigate the project shortly.")
    return flask.redirect(url_for_copr_details(copr))
예제 #4
0
def copr_permissions_applier_change(copr):
    permission = coprs_logic.CoprPermissionsLogic.get(copr,
                                                      flask.g.user).first()
    applier_permissions_form = \
        forms.PermissionsApplierFormFactory.create_form_cls(permission)()

    if copr.user == flask.g.user:
        flask.flash("Owner cannot request permissions for his own project.",
                    "error")
    elif applier_permissions_form.validate_on_submit():
        # we rely on these to be 0 or 1 from form. TODO: abstract from that
        if permission is not None:
            old_builder = permission.copr_builder
            old_admin = permission.copr_admin
        else:
            old_builder = 0
            old_admin = 0
        new_builder = applier_permissions_form.copr_builder.data
        new_admin = applier_permissions_form.copr_admin.data
        coprs_logic.CoprPermissionsLogic.update_permissions_by_applier(
            flask.g.user, copr, permission, new_builder, new_admin)
        db.session.commit()
        flask.flash(
            "Successfully updated permissions for project '{0}'.".format(
                copr.name))

        # sending emails
        if flask.current_app.config.get("SEND_EMAILS", False):
            for mail in copr.admin_mails:
                permission_dict = {
                    "old_builder": old_builder,
                    "old_admin": old_admin,
                    "new_builder": new_builder,
                    "new_admin": new_admin
                }
                msg = PermissionRequestMessage(copr, flask.g.user,
                                               permission_dict)
                send_mail(
                    mail,
                    msg,
                )

    return flask.redirect(helpers.copr_url("coprs_ns.copr_detail", copr))
예제 #5
0
def copr_update_permissions(copr):
    permissions = copr.copr_permissions
    permissions_form = forms.PermissionsFormFactory.create_form_cls(
        permissions)()

    if permissions_form.validate_on_submit():
        # we don't change owner (yet)
        try:
            # if admin is changing his permissions, his must be changed last
            # so that we don't get InsufficientRightsException
            permissions.sort(
                key=lambda x: -1 if x.user_id == flask.g.user.id else 1)
            for perm in permissions:
                old_builder = perm.copr_builder
                old_admin = perm.copr_admin
                new_builder = permissions_form["copr_builder_{0}".format(
                    perm.user_id)].data
                new_admin = permissions_form["copr_admin_{0}".format(
                    perm.user_id)].data
                coprs_logic.CoprPermissionsLogic.update_permissions(
                    flask.g.user, copr, perm, new_builder, new_admin)
                if flask.current_app.config.get("SEND_EMAILS", False) and \
                        (old_builder is not new_builder or old_admin is not new_admin):
                    permission_dict = {
                        "old_builder": old_builder,
                        "old_admin": old_admin,
                        "new_builder": new_builder,
                        "new_admin": new_admin
                    }
                    msg = PermissionChangeMessage(copr, permission_dict)
                    send_mail(perm.user.mail, msg)
        # for now, we don't check for actions here, as permissions operation
        # don't collide with any actions
        except exceptions.InsufficientRightsException as e:
            db.session.rollback()
            flask.flash(str(e), "error")
        else:
            db.session.commit()
            flask.flash("Project permissions were updated successfully.",
                        "success")

    return flask.redirect(url_for_copr_details(copr))
예제 #6
0
def set_permissions(copr):
    permissions = flask.request.get_json()
    if not isinstance(permissions, dict):
        raise BadRequest(
            "request is not a dictionary, expected format: "
            "{'username': {'admin': 'nothing', 'builder': 'request'} ...}")

    if not permissions:
        raise BadRequest("no permission change requested")

    updated = {}
    messages = []
    with db_session_scope():
        for username, perm_set in permissions.items():
            user = models.User.query.filter_by(username=username).first()
            if not user:
                raise BadRequest(
                    "user '{0}' doesn't exist in database".format(username))

            permission_dict = {}
            for perm, state in perm_set.items():
                change = CoprPermissionsLogic.set_permissions(
                    flask.g.user, copr, user, perm, state)
                if change:
                    updated[username] = True
                    permission_dict['old_' + perm] = change[0]
                    permission_dict['new_' + perm] = change[1]

            if permission_dict:
                msg = PermissionChangeMessage(copr, permission_dict)
                messages.append({'address': user.mail, 'message': msg})

    # send emails only if transaction succeeded
    for task in messages:
        if flask.current_app.config.get("SEND_EMAILS", False):
            send_mail([task['address']], task['message'])

    return flask.jsonify({'updated': list(updated.keys())})
예제 #7
0
 def notify(self, user, chroots):
     msg = OutdatedChrootMessage(chroots)
     send_mail(user.mail, msg)