import datetime import logging from django.contrib import messages from django.contrib.auth.decorators import login_required, permission_required from django.contrib.auth.models import Group from django.shortcuts import redirect, render from django.utils.translation import gettext_lazy as _ from allianceauth.services.forms import ServicePasswordForm from .forms import JabberBroadcastForm from .manager import OpenfireManager, PingBotException from .models import OpenfireUser from .tasks import OpenfireTasks logger = logging.getLogger(__name__) ACCESS_PERM = 'openfire.access_openfire' @login_required @permission_required(ACCESS_PERM) def activate_jabber(request): logger.debug(f"activate_jabber called by user {request.user}") character = request.user.profile.main_character logger.debug(f"Adding Jabber user for user {request.user} with main character {character}") info = OpenfireManager.add_user(OpenfireTasks.get_username(request.user)) # If our username is blank means we already had a user if info[0] != "": OpenfireUser.objects.update_or_create(user=request.user, defaults={'username': info[0]}) logger.debug(f"Updated authserviceinfo for user {request.user} with Jabber credentials. Updating groups.") OpenfireTasks.update_groups.delay(request.user.pk) logger.info(f"Successfully activated Jabber for user {request.user}") messages.success(request, _('Activated Jabber account.')) credentials = { 'username': info[0], 'password': info[1], } return render(request, 'services/service_credentials.html', context={'credentials': credentials, 'service': 'Jabber'}) else: logger.error(f"Unsuccessful attempt to activate Jabber for user {request.user}") messages.error(request, _('An error occurred while processing your Jabber account.')) return redirect("services:services") @login_required @permission_required(ACCESS_PERM) def deactivate_jabber(request): logger.debug(f"deactivate_jabber called by user {request.user}") if OpenfireTasks.has_account(request.user) and OpenfireTasks.delete_user(request.user): logger.info(f"Successfully deactivated Jabber for user {request.user}") messages.success(request, 'Deactivated Jabber account.') else: logger.error(f"Unsuccessful attempt to deactivate Jabber for user {request.user}") messages.error(request, _('An error occurred while processing your Jabber account.')) return redirect("services:services") @login_required @permission_required(ACCESS_PERM) def reset_jabber_password(request): logger.debug(f"reset_jabber_password called by user {request.user}") if OpenfireTasks.has_account(request.user): result = OpenfireManager.update_user_pass(request.user.openfire.username) # If our username is blank means we failed if result != "": logger.info(f"Successfully reset Jabber password for user {request.user}") messages.success(request, _('Reset Jabber password.')) credentials = { 'username': request.user.openfire.username, 'password': result, } return render(request, 'services/service_credentials.html', context={'credentials': credentials, 'service': 'Jabber'}) logger.error(f"Unsuccessful attempt to reset Jabber for user {request.user}") messages.error(request, _('An error occurred while processing your Jabber account.')) return redirect("services:services") @login_required @permission_required('auth.jabber_broadcast') def jabber_broadcast_view(request): logger.debug(f"jabber_broadcast_view called by user {request.user}") allchoices = [] if request.user.has_perm('auth.jabber_broadcast_all'): allchoices.append(('all', 'all')) for g in Group.objects.all(): allchoices.append((str(g.name), str(g.name))) else: for g in request.user.groups.all(): allchoices.append((str(g.name), str(g.name))) if request.method == 'POST': form = JabberBroadcastForm(request.POST) form.fields['group'].choices = allchoices logger.debug(f"Received POST request containing form, valid: {form.is_valid()}") if form.is_valid(): main_char = request.user.profile.main_character logger.debug(f"Processing Jabber broadcast for user {request.user} with main character {main_char}") try: if main_char is not None: message_to_send = form.cleaned_data['message'] + "\n##### SENT BY: " + "[" + main_char.corporation_ticker + "]" + \ main_char.character_name + " TO: " + \ form.cleaned_data['group'] + " WHEN: " + datetime.datetime.utcnow().strftime( "%Y-%m-%d %H:%M:%S") + " #####\n##### Replies are NOT monitored #####\n" group_to_send = form.cleaned_data['group'] else: message_to_send = form.cleaned_data['message'] + "\n##### SENT BY: " + "No character but can send pings?" + " TO: " + \ form.cleaned_data['group'] + " WHEN: " + datetime.datetime.utcnow().strftime( "%Y-%m-%d %H:%M:%S") + " #####\n##### Replies are NOT monitored #####\n" group_to_send = form.cleaned_data['group'] OpenfireManager.send_broadcast_message(group_to_send, message_to_send) messages.success(request, _(f'Sent Jabber broadcast to {group_to_send}')) logger.info(f"Sent Jabber broadcast on behalf of user {request.user}") except PingBotException as e: messages.error(request, e) else: form = JabberBroadcastForm() form.fields['group'].choices = allchoices logger.debug("Generated broadcast form for user {} containing {} groups".format( request.user, len(form.fields['group'].choices))) context = {'form': form} return render(request, 'services/openfire/broadcast.html', context=context) @login_required @permission_required(ACCESS_PERM) def set_jabber_password(request): logger.debug(f"set_jabber_password called by user {request.user}") if request.method == 'POST': logger.debug("Received POST request with form.") form = ServicePasswordForm(request.POST) logger.debug(f"Form is valid: {form.is_valid()}") if form.is_valid() and OpenfireTasks.has_account(request.user): password = form.cleaned_data['password'] logger.debug(f"Form contains password of length {len(password)}") result = OpenfireManager.update_user_pass(request.user.openfire.username, password=password) if result != "": logger.info(f"Successfully set Jabber password for user {request.user}") messages.success(request, _('Set jabber password.')) else: logger.error(f"Failed to install custom Jabber password for user {request.user}") messages.error(request, _('An error occurred while processing your Jabber account.')) return redirect("services:services") else: logger.debug("Request is not type POST - providing empty form.") form = ServicePasswordForm() logger.debug(f"Rendering form for user {request.user}") context = {'form': form, 'service': 'Jabber'} return render(request, 'services/service_password.html', context=context)