示例#1
0
def zone_notifications_settings(dns_zone_id, item):
    provider = Provider()
    zones = provider.dns_zones()
    notifications = provider.notifications()

    if not zones.can_access(dns_zone_id, current_user.id):
        flash('Access Denied', 'error')
        return redirect(url_for('dns.index'))

    zone = zones.get(dns_zone_id)
    if not zone:
        flash('Zone not found', 'error')
        return redirect(url_for('dns.index'))

    notification_provider = notifications.providers.get(item)
    if not notification_provider:
        flash('Invalid notification provider', 'error')
        return redirect(url_for('dns.index'))
    elif not notification_provider.enabled:
        flash('Notification provider is not enabled', 'error')
        return redirect(url_for('dns.index'))
    elif not notification_provider.has_settings:
        flash('Notification provider has no settings', 'error')
        return redirect(url_for('dns.index'))

    return render_template(
        'dns/zones/view.html',
        zone=zone,
        tab='notifications',
        section='{0}_settings'.format(item),
        has_enabled_providers=notifications.providers.has_enabled(),
        subscription=zone.notifications.get(item)
    )
示例#2
0
def zone_notifications_settings_save(dns_zone_id, item):
    provider = Provider()
    zones = provider.dns_zones()
    notifications = provider.notifications()

    if not zones.can_access(dns_zone_id, current_user.id):
        flash('Access Denied', 'error')
        return redirect(url_for('dns.index'))

    zone = zones.get(dns_zone_id)
    if not zone:
        flash('Zone not found', 'error')
        return redirect(url_for('dns.index'))

    notification_provider = notifications.providers.get(item)
    if not notification_provider:
        flash('Invalid notification provider', 'error')
        return redirect(url_for('dns.index'))
    elif not notification_provider.enabled:
        flash('Notification provider is not enabled', 'error')
        return redirect(url_for('dns.index'))
    elif not notification_provider.has_settings:
        flash('Notification provider has no settings', 'error')
        return redirect(url_for('dns.index'))

    if item == 'email':
        recipients = request.form.getlist('recipients[]')
        valid_recipients = []
        email_regex = re.compile(r"[^@]+@[^@]+\.[^@]+")
        for recipient in recipients:
            recipient = recipient.strip().lower()
            if len(recipient) > 0 and email_regex.match(recipient):
                valid_recipients.append(recipient)

        # Remove duplicates.
        valid_recipients = list(dict.fromkeys(valid_recipients))

        subscription = zone.notifications.get(item)
        if subscription:
            subscription.data = valid_recipients
            subscription.save()
    elif item == 'slack':
        slack_webhook_url = request.form['slack_webhook_url'].strip()

        subscription = zone.notifications.get(item)
        if subscription:
            subscription.data = slack_webhook_url
            subscription.save()
    elif item == 'teams':
        teams_webhook_url = request.form['teams_webhook_url'].strip()

        subscription = zone.notifications.get(item)
        if subscription:
            subscription.data = teams_webhook_url
            subscription.save()

    flash('Notification settings saved.')
    return redirect(url_for('dns.zone_notifications_settings', dns_zone_id=dns_zone_id, item=item))
示例#3
0
    def providers(self):
        provider = Provider()
        notifications = provider.notifications()

        results = []
        for name, prov in notifications.providers.all().items():
            type = NotificationType()
            type.id = prov.type_id
            type.name = name
            type.enabled = prov.enabled

            results.append(type)

        return self.send_valid_response(results)
示例#4
0
    def update(self, user_id, type_name, zone_id=None, domain=None):
        provider = Provider()
        zones = provider.dns_zones()
        notifications = provider.notifications()
        logs = provider.dns_logs()

        zone = zones.get(zone_id,
                         user_id) if zone_id is not None else zones.find(
                             domain, user_id=user_id)
        if not zone:
            return self.send_not_found_response()

        type = notifications.types.get(name=type_name)
        if not type:
            return self.send_error_response(
                5006, 'Invalid type: {0}'.format(type_name), '')

        notification_provider = notifications.providers.get(type_name)
        if not notification_provider:
            return self.send_error_response(
                5006, 'Internal Error: Invalid provider', '')
        elif not notification_provider.enabled:
            return self.send_error_response(
                5009, 'Notification provider is disabled', '')

        subscription = zone.notifications.get(type.name)
        if not subscription:
            return self.send_error_response(
                5007, 'Invalid notification subscription', '')

        data = self.get_json([])
        if not data:
            return self.send_error_response(5008, 'No data sent', '')

        if 'enabled' in data:
            subscription.enabled = True if data['enabled'] else False

            # We need to set the last query log id as well.
            subscription.last_query_log_id = logs.get_last_log_id(zone.id)

        if 'data' in data:
            if type.name == 'email':
                subscription.data = self.__get_valid_emails(data['data'])
            else:
                subscription.data = data['data'].strip()

        subscription.save()

        return self.get(user_id, type_name, zone_id=zone.id)
示例#5
0
def webpush_register():
    provider = Provider()
    notifications = provider.notifications()

    response = {'success': True, 'message': ''}

    user_endpoint = request.form['user_endpoint'].strip()
    user_key = request.form['user_key'].strip()
    user_authsecret = request.form['user_authsecret'].strip()

    if len(user_endpoint) == 0 or len(user_key) == 0 or len(user_authsecret) == 0:
        response['sucess'] = False,
        response['message'] = 'Data is empty'
        return json.dumps(response)

    subscription = notifications.webpush.register(current_user.id, user_endpoint, user_key, user_authsecret)
    if not subscription:
        response['sucess'] = False,
        response['message'] = 'Could not register your web push subscription'

    return json.dumps(response)
示例#6
0
def zone_notifications(dns_zone_id):
    provider = Provider()
    zones = provider.dns_zones()
    notifications = provider.notifications()

    if not zones.can_access(dns_zone_id, current_user.id):
        flash('Access Denied', 'error')
        return redirect(url_for('home.index'))

    zone = zones.get(dns_zone_id)
    if not zone:
        flash('Zone not found', 'error')
        return redirect(url_for('home.index'))

    return render_template(
        'dns/zones/view.html',
        zone=zone,
        section='notifications',
        tab='notifications',
        has_enabled_providers=notifications.providers.has_enabled(),
        providers=notifications.providers.get_enabled()
    )
示例#7
0
def zone_notifications_save(dns_zone_id):
    provider = Provider()
    zones = provider.dns_zones()
    logs = provider.dns_logs()
    notifications = provider.notifications()

    if not zones.can_access(dns_zone_id, current_user.id):
        flash('Access Denied', 'error')
        return redirect(url_for('home.index'))

    zone = zones.get(dns_zone_id)
    if not zone:
        flash('Zone not found', 'error')
        return redirect(url_for('home.index'))

    max_id = logs.get_last_log_id(zone.id)
    for type in ['email', 'webpush', 'slack', 'teams']:
        enabled = True if int(request.form.get(type, 0)) == 1 else False
        notifications.save_zone_subscription(zone.id, type, enabled=enabled, last_query_log_id=max_id)

    flash('Notification preferences saved', 'success')
    return redirect(url_for('dns.zone_notifications', dns_zone_id=dns_zone_id))
示例#8
0
    def get(self, user_id, type_name, zone_id=None, domain=None):
        provider = Provider()
        zones = provider.dns_zones()
        notifications = provider.notifications()

        zone = zones.get(zone_id,
                         user_id) if zone_id is not None else zones.find(
                             domain, user_id=user_id)
        if not zone:
            return self.send_not_found_response()

        type = notifications.types.get(name=type_name)
        if not type:
            return self.send_error_response(
                5006, 'Invalid type: {0}'.format(type_name), '')

        subscription = zone.notifications.get(type.name)
        if not subscription:
            return self.send_error_response(
                5007, 'Invalid notification subscription', '')

        item = self.__load_subscription(type.name, subscription)
        return self.send_valid_response(item)