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) )
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))
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)
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)
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)
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() )
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))
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)