mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-12 14:00:17 +02:00
Alter user field to OneToOneField Migration to enforce uniqueness pre-change Migration to ensure all users have an AuthServicesInfo Receiver to automatically create one upon user creation Replace AuthServicesInfo.get_or_create with get Prevent deletion of AuthServicesInfo from admin site Remove add and delete permissions from model. Get character names in chunks on corpstats update to prevent HTTP400 when requesting >350(ish) names Include corpstats docs. Update settings docs.
1210 lines
56 KiB
Python
Executable File
1210 lines
56 KiB
Python
Executable File
from __future__ import unicode_literals
|
|
from django.shortcuts import render, redirect
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.contrib.auth.decorators import permission_required
|
|
from django.contrib.auth.decorators import user_passes_test
|
|
from django.contrib.auth.models import Group
|
|
from django.conf import settings
|
|
from django.contrib import messages
|
|
from eveonline.models import EveCharacter
|
|
from eveonline.models import EveAllianceInfo
|
|
from authentication.models import AuthServicesInfo
|
|
from services.managers.openfire_manager import OpenfireManager
|
|
from services.managers.phpbb3_manager import Phpbb3Manager
|
|
from services.managers.mumble_manager import MumbleManager
|
|
from services.managers.ipboard_manager import IPBoardManager
|
|
from services.managers.xenforo_manager import XenForoManager
|
|
from services.managers.teamspeak3_manager import Teamspeak3Manager
|
|
from services.managers.discord_manager import DiscordOAuthManager
|
|
from services.managers.discourse_manager import DiscourseManager
|
|
from services.managers.ips4_manager import Ips4Manager
|
|
from services.managers.smf_manager import smfManager
|
|
from services.managers.market_manager import marketManager
|
|
from authentication.managers import AuthServicesInfoManager
|
|
from eveonline.managers import EveManager
|
|
from services.tasks import update_jabber_groups
|
|
from services.tasks import update_mumble_groups
|
|
from services.tasks import update_forum_groups
|
|
from services.tasks import update_ipboard_groups
|
|
from services.tasks import update_smf_groups
|
|
from services.tasks import update_teamspeak3_groups
|
|
from services.tasks import update_discord_groups
|
|
from services.tasks import update_discord_nickname
|
|
from services.tasks import update_discourse_groups
|
|
from services.forms import JabberBroadcastForm
|
|
from services.forms import FleetFormatterForm
|
|
from services.forms import ServicePasswordForm
|
|
from services.forms import TeamspeakJoinForm
|
|
from authentication.decorators import members_and_blues
|
|
from authentication.states import MEMBER_STATE, BLUE_STATE, NONE_STATE
|
|
|
|
import base64
|
|
import hmac
|
|
import hashlib
|
|
try:
|
|
from urllib import unquote, urlencode
|
|
except ImportError: #py3
|
|
from urllib.parse import unquote, urlencode
|
|
try:
|
|
from urlparse import parse_qs
|
|
except ImportError: #py3
|
|
from urllib.parse import parse_qs
|
|
|
|
import datetime
|
|
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@login_required
|
|
def fleet_formatter_view(request):
|
|
logger.debug("fleet_formatter_view called by user %s" % request.user)
|
|
generated = ""
|
|
if request.method == 'POST':
|
|
form = FleetFormatterForm(request.POST)
|
|
logger.debug("Received POST request containing form, valid: %s" % form.is_valid())
|
|
if form.is_valid():
|
|
generated = "Fleet Name: " + form.cleaned_data['fleet_name'] + "\n"
|
|
generated = generated + "FC: " + form.cleaned_data['fleet_commander'] + "\n"
|
|
generated = generated + "Comms: " + form.cleaned_data['fleet_comms'] + "\n"
|
|
generated = generated + "Fleet Type: " + form.cleaned_data['fleet_type'] + " || " + form.cleaned_data[
|
|
'ship_priorities'] + "\n"
|
|
generated = generated + "Form Up: " + form.cleaned_data['formup_location'] + " @ " + form.cleaned_data[
|
|
'formup_time'] + "\n"
|
|
generated = generated + "Duration: " + form.cleaned_data['expected_duration'] + "\n"
|
|
generated = generated + "Reimbursable: " + form.cleaned_data['reimbursable'] + "\n"
|
|
generated = generated + "Important: " + form.cleaned_data['important'] + "\n"
|
|
if form.cleaned_data['comments'] != "":
|
|
generated = generated + "Why: " + form.cleaned_data['comments'] + "\n"
|
|
logger.info("Formatted fleet broadcast for user %s" % request.user)
|
|
else:
|
|
form = FleetFormatterForm()
|
|
logger.debug("Returning empty form to user %s" % request.user)
|
|
|
|
context = {'form': form, 'generated': generated}
|
|
|
|
return render(request, 'registered/fleetformattertool.html', context=context)
|
|
|
|
|
|
@login_required
|
|
@permission_required('auth.jabber_broadcast')
|
|
def jabber_broadcast_view(request):
|
|
logger.debug("jabber_broadcast_view called by user %s" % 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("Received POST request containing form, valid: %s" % form.is_valid())
|
|
if form.is_valid():
|
|
user_info = AuthServicesInfo.objects.get(user=request.user)
|
|
main_char = EveCharacter.objects.get(character_id=user_info.main_char_id)
|
|
logger.debug("Processing jabber broadcast for user %s with main character %s" % (user_info, main_char))
|
|
if user_info.main_char_id != "":
|
|
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']
|
|
|
|
OpenfireManager.send_broadcast_threaded(group_to_send, message_to_send, )
|
|
|
|
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_threaded(group_to_send, message_to_send, )
|
|
|
|
messages.success(request, 'Sent jabber broadcast to %s' % group_to_send)
|
|
logger.info("Sent jabber broadcast on behalf of user %s" % request.user)
|
|
else:
|
|
form = JabberBroadcastForm()
|
|
form.fields['group'].choices = allchoices
|
|
logger.debug("Generated broadcast form for user %s containing %s groups" % (
|
|
request.user, len(form.fields['group'].choices)))
|
|
|
|
context = {'form': form}
|
|
return render(request, 'registered/jabberbroadcast.html', context=context)
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def services_view(request):
|
|
logger.debug("services_view called by user %s" % request.user)
|
|
auth = AuthServicesInfo.objects.get(user=request.user)
|
|
char = None
|
|
if auth.main_char_id:
|
|
try:
|
|
char = EveCharacter.objects.get(character_id=auth.main_char_id)
|
|
except EveCharacter.DoesNotExist:
|
|
messages.warning(request, "There's a problem with your main character. Please select a new one.")
|
|
|
|
services = [
|
|
'FORUM',
|
|
'JABBER',
|
|
'MUMBLE',
|
|
'IPBOARD',
|
|
'TEAMSPEAK3',
|
|
'DISCORD',
|
|
'DISCOURSE',
|
|
'IPS4',
|
|
'SMF',
|
|
'MARKET',
|
|
'XENFORO',
|
|
]
|
|
|
|
context = {
|
|
'authinfo': auth,
|
|
'char': char,
|
|
}
|
|
|
|
for s in services:
|
|
context['SHOW_' + s] = (getattr(settings, 'ENABLE_AUTH_' + s) and (
|
|
auth.state == MEMBER_STATE or request.user.is_superuser)) or (getattr(settings, 'ENABLE_BLUE_' + s) and (
|
|
auth.state == BLUE_STATE or request.user.is_superuser))
|
|
|
|
return render(request, 'registered/services.html', context=context)
|
|
|
|
|
|
def superuser_test(user):
|
|
return user.is_superuser
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def activate_forum(request):
|
|
logger.debug("activate_forum called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
# Valid now we get the main characters
|
|
character = EveManager.get_character_by_id(authinfo.main_char_id)
|
|
logger.debug("Adding phpbb user for user %s with main character %s" % (request.user, character))
|
|
result = Phpbb3Manager.add_user(character.character_name, request.user.email, ['REGISTERED'], authinfo.main_char_id)
|
|
# if empty we failed
|
|
if result[0] != "":
|
|
AuthServicesInfoManager.update_user_forum_info(result[0], request.user)
|
|
logger.debug("Updated authserviceinfo for user %s with forum credentials. Updating groups." % request.user)
|
|
update_forum_groups.delay(request.user.pk)
|
|
logger.info("Successfully activated forum for user %s" % request.user)
|
|
messages.success(request, 'Activated forum account.')
|
|
credentials = {
|
|
'username': result[0],
|
|
'password': result[1],
|
|
}
|
|
return render(request, 'registered/service_credentials.html',
|
|
context={'credentials': credentials, 'service': 'Forum'})
|
|
else:
|
|
logger.error("Unsuccessful attempt to activate forum for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your forum account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def deactivate_forum(request):
|
|
logger.debug("deactivate_forum called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = Phpbb3Manager.disable_user(authinfo.forum_username)
|
|
# false we failed
|
|
if result:
|
|
AuthServicesInfoManager.update_user_forum_info("", request.user)
|
|
logger.info("Successfully deactivated forum for user %s" % request.user)
|
|
messages.success(request, 'Deactivated forum account.')
|
|
else:
|
|
logger.error("Unsuccessful attempt to activate forum for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your forum account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def reset_forum_password(request):
|
|
logger.debug("reset_forum_password called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = Phpbb3Manager.update_user_password(authinfo.forum_username, authinfo.main_char_id)
|
|
# false we failed
|
|
if result != "":
|
|
logger.info("Successfully reset forum password for user %s" % request.user)
|
|
messages.success(request, 'Reset forum password.')
|
|
credentials = {
|
|
'username': authinfo.forum_username,
|
|
'password': result,
|
|
}
|
|
return render(request, 'registered/service_credentials.html',
|
|
context={'credentials': credentials, 'service': 'Forum'})
|
|
else:
|
|
logger.error("Unsuccessful attempt to reset forum password for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your forum account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def activate_xenforo_forum(request):
|
|
logger.debug("activate_xenforo_forum called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
character = EveManager.get_character_by_id(authinfo.main_char_id)
|
|
logger.debug("Adding XenForo user for user %s with main character %s" % (request.user, character))
|
|
result = XenForoManager.add_user(character.character_name, request.user.email)
|
|
# Based on XenAPI's response codes
|
|
if result['response']['status_code'] == 200:
|
|
logger.info("Updated authserviceinfo for user %s with XenForo credentials. Updating groups." % request.user)
|
|
AuthServicesInfoManager.update_user_xenforo_info(result['username'], request.user)
|
|
messages.success(request, 'Activated XenForo account.')
|
|
credentials = {
|
|
'username': result['username'],
|
|
'password': result['password'],
|
|
}
|
|
return render(request, 'registered/service_credentials.html',
|
|
context={'credentials': credentials, 'service': 'XenForo'})
|
|
|
|
else:
|
|
logger.error("UnSuccessful attempt to activate xenforo for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your XenForo account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def deactivate_xenforo_forum(request):
|
|
logger.debug("deactivate_xenforo_forum called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = XenForoManager.disable_user(authinfo.xenforo_username)
|
|
if result.status_code == 200:
|
|
AuthServicesInfoManager.update_user_xenforo_info("", request.user)
|
|
logger.info("Successfully deactivated XenForo for user %s" % request.user)
|
|
messages.success(request, 'Deactivated XenForo account.')
|
|
else:
|
|
messages.error(request, 'An error occurred while processing your XenForo account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def reset_xenforo_password(request):
|
|
logger.debug("reset_xenforo_password called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = XenForoManager.reset_password(authinfo.xenforo_username)
|
|
# Based on XenAPI's response codes
|
|
if result['response']['status_code'] == 200:
|
|
logger.info("Successfully reset XenForo password for user %s" % request.user)
|
|
messages.success(request, 'Reset XenForo account password.')
|
|
credentials = {
|
|
'username': authinfo.xenforo_username,
|
|
'password': result['password'],
|
|
}
|
|
return render(request, 'registered/service_credentials.html',
|
|
context={'credentials': credentials, 'service': 'XenForo'})
|
|
else:
|
|
logger.error("Unsuccessful attempt to reset XenForo password for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your XenForo account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def set_xenforo_password(request):
|
|
logger.debug("set_xenforo_password called by user %s" % request.user)
|
|
if request.method == 'POST':
|
|
logger.debug("Received POST request with form.")
|
|
form = ServicePasswordForm(request.POST)
|
|
logger.debug("Form is valid: %s" % form.is_valid())
|
|
if form.is_valid():
|
|
password = form.cleaned_data['password']
|
|
logger.debug("Form contains password of length %s" % len(password))
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = XenForoManager.update_user_password(authinfo.xenforo_username, password)
|
|
if result['response']['status_code'] == 200:
|
|
logger.info("Successfully reset XenForo password for user %s" % request.user)
|
|
messages.success(request, 'Changed XenForo password.')
|
|
else:
|
|
logger.error("Failed to install custom XenForo password for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your XenForo account.')
|
|
return redirect('auth_services')
|
|
else:
|
|
logger.debug("Request is not type POST - providing empty form.")
|
|
form = ServicePasswordForm()
|
|
|
|
logger.debug("Rendering form for user %s" % request.user)
|
|
context = {'form': form, 'service': 'Forum'}
|
|
return render(request, 'registered/service_password.html', context=context)
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def activate_ipboard_forum(request):
|
|
logger.debug("activate_ipboard_forum called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
# Valid now we get the main characters
|
|
character = EveManager.get_character_by_id(authinfo.main_char_id)
|
|
logger.debug("Adding ipboard user for user %s with main character %s" % (request.user, character))
|
|
result = IPBoardManager.add_user(character.character_name, request.user.email)
|
|
if result[0] != "":
|
|
AuthServicesInfoManager.update_user_ipboard_info(result[0], request.user)
|
|
logger.debug("Updated authserviceinfo for user %s with ipboard credentials. Updating groups." % request.user)
|
|
update_ipboard_groups.delay(request.user.pk)
|
|
logger.info("Successfully activated ipboard for user %s" % request.user)
|
|
messages.success(request, 'Activated IPBoard account.')
|
|
credentials = {
|
|
'username': result[0],
|
|
'password': result[1],
|
|
}
|
|
return render(request, 'registered/service_credentials.html',
|
|
context={'credentials': credentials, 'service': 'IPBoard'})
|
|
else:
|
|
logger.error("UnSuccessful attempt to activate ipboard for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your IPBoard account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def deactivate_ipboard_forum(request):
|
|
logger.debug("deactivate_ipboard_forum called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = IPBoardManager.disable_user(authinfo.ipboard_username)
|
|
# false we failed
|
|
if result:
|
|
AuthServicesInfoManager.update_user_ipboard_info("", request.user)
|
|
logger.info("Successfully deactivated ipboard for user %s" % request.user)
|
|
messages.success(request, 'Deactivated IPBoard account.')
|
|
else:
|
|
logger.error("Unsuccessful attempt to deactviate ipboard for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your IPBoard account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def reset_ipboard_password(request):
|
|
logger.debug("reset_ipboard_password called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = IPBoardManager.update_user_password(authinfo.ipboard_username, request.user.email)
|
|
if result != "":
|
|
logger.info("Successfully reset ipboard password for user %s" % request.user)
|
|
messages.success(request, 'Reset IPBoard password.')
|
|
credentials = {
|
|
'username': authinfo.ipboard_username,
|
|
'password': result,
|
|
}
|
|
return render(request, 'registered/service_credentials.html',
|
|
context={'credentials': credentials, 'service': 'IPBoard'})
|
|
else:
|
|
logger.error("UnSuccessful attempt to reset ipboard password for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your IPBoard account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def activate_jabber(request):
|
|
logger.debug("activate_jabber called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
character = EveManager.get_character_by_id(authinfo.main_char_id)
|
|
logger.debug("Adding jabber user for user %s with main character %s" % (request.user, character))
|
|
info = OpenfireManager.add_user(character.character_name)
|
|
# If our username is blank means we already had a user
|
|
if info[0] is not "":
|
|
AuthServicesInfoManager.update_user_jabber_info(info[0], request.user)
|
|
logger.debug("Updated authserviceinfo for user %s with jabber credentials. Updating groups." % request.user)
|
|
update_jabber_groups.delay(request.user.pk)
|
|
logger.info("Successfully activated jabber for user %s" % request.user)
|
|
messages.success(request, 'Activated jabber account.')
|
|
credentials = {
|
|
'username': info[0],
|
|
'password': info[1],
|
|
}
|
|
return render(request, 'registered/service_credentials.html',
|
|
context={'credentials': credentials, 'service': 'Jabber'})
|
|
else:
|
|
logger.error("UnSuccessful attempt to activate jabber for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your jabber account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def deactivate_jabber(request):
|
|
logger.debug("deactivate_jabber called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = OpenfireManager.delete_user(authinfo.jabber_username)
|
|
# If our username is blank means we failed
|
|
if result:
|
|
AuthServicesInfoManager.update_user_jabber_info("", request.user)
|
|
logger.info("Successfully deactivated jabber for user %s" % request.user)
|
|
messages.success(request, 'Deactivated jabber account.')
|
|
else:
|
|
logger.error("UnSuccessful attempt to deactivate jabber for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your jabber account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def reset_jabber_password(request):
|
|
logger.debug("reset_jabber_password called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = OpenfireManager.update_user_pass(authinfo.jabber_username)
|
|
# If our username is blank means we failed
|
|
if result != "":
|
|
AuthServicesInfoManager.update_user_jabber_info(authinfo.jabber_username, request.user)
|
|
logger.info("Successfully reset jabber password for user %s" % request.user)
|
|
messages.success(request, 'Reset jabber password.')
|
|
credentials = {
|
|
'username': authinfo.jabber_username,
|
|
'password': result,
|
|
}
|
|
return render(request, 'registered/service_credentials.html',
|
|
context={'credentials': credentials, 'service': 'Jabber'})
|
|
else:
|
|
logger.error("Unsuccessful attempt to reset jabber for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your jabber account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def activate_mumble(request):
|
|
logger.debug("activate_mumble called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
character = EveManager.get_character_by_id(authinfo.main_char_id)
|
|
ticker = character.corporation_ticker
|
|
|
|
if authinfo.state == BLUE_STATE:
|
|
logger.debug("Adding mumble user for blue user %s with main character %s" % (request.user, character))
|
|
# Blue members should have alliance ticker (if in alliance)
|
|
if EveAllianceInfo.objects.filter(alliance_id=character.alliance_id).exists():
|
|
alliance = EveAllianceInfo.objects.filter(alliance_id=character.alliance_id)[0]
|
|
ticker = alliance.alliance_ticker
|
|
result = MumbleManager.create_blue_user(ticker, character.character_name)
|
|
else:
|
|
logger.debug("Adding mumble user for user %s with main character %s" % (request.user, character))
|
|
result = MumbleManager.create_user(ticker, character.character_name)
|
|
# if its empty we failed
|
|
if result[0] is not "":
|
|
AuthServicesInfoManager.update_user_mumble_info(result[0], request.user)
|
|
logger.debug("Updated authserviceinfo for user %s with mumble credentials. Updating groups." % request.user)
|
|
update_mumble_groups.delay(request.user.pk)
|
|
logger.info("Successfully activated mumble for user %s" % request.user)
|
|
messages.success(request, 'Activated Mumble account.')
|
|
credentials = {
|
|
'username': result[0],
|
|
'password': result[1],
|
|
}
|
|
return render(request, 'registered/service_credentials.html',
|
|
context={'credentials': credentials, 'service': 'Mumble'})
|
|
else:
|
|
logger.error("Unsuccessful attempt to activate mumble for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your Mumble account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def deactivate_mumble(request):
|
|
logger.debug("deactivate_mumble called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
# if we successfully remove the user or the user is already removed
|
|
if MumbleManager.delete_user(authinfo.mumble_username) or not MumbleManager.user_exists(authinfo.mumble_username):
|
|
AuthServicesInfoManager.update_user_mumble_info("", request.user)
|
|
logger.info("Successfully deactivated mumble for user %s" % request.user)
|
|
messages.success(request, 'Deactivated Mumble account.')
|
|
else:
|
|
logger.error("Unsuccessful attempt to deactivate mumble for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your Mumble account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def reset_mumble_password(request):
|
|
logger.debug("reset_mumble_password called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = MumbleManager.update_user_password(authinfo.mumble_username)
|
|
|
|
# if blank we failed
|
|
if result != "":
|
|
logger.info("Successfully reset mumble password for user %s" % request.user)
|
|
messages.success(request, 'Reset Mumble password.')
|
|
credentials = {
|
|
'username': authinfo.mumble_username,
|
|
'password': result,
|
|
}
|
|
return render(request, 'registered/service_credentials.html',
|
|
context={'credentials': credentials, 'service': 'Mumble'})
|
|
else:
|
|
logger.error("UnSuccessful attempt to reset mumble password for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your Mumble account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def activate_teamspeak3(request):
|
|
logger.debug("activate_teamspeak3 called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
character = EveManager.get_character_by_id(authinfo.main_char_id)
|
|
ticker = character.corporation_ticker
|
|
|
|
if authinfo.state == BLUE_STATE:
|
|
logger.debug("Adding TS3 user for blue user %s with main character %s" % (request.user, character))
|
|
# Blue members should have alliance ticker (if in alliance)
|
|
if EveAllianceInfo.objects.filter(alliance_id=character.alliance_id).exists():
|
|
alliance = EveAllianceInfo.objects.filter(alliance_id=character.alliance_id)[0]
|
|
ticker = alliance.alliance_ticker
|
|
result = Teamspeak3Manager.add_blue_user(character.character_name, ticker)
|
|
else:
|
|
logger.debug("Adding TS3 user for user %s with main character %s" % (request.user, character))
|
|
result = Teamspeak3Manager.add_user(character.character_name, ticker)
|
|
|
|
# if its empty we failed
|
|
if result[0] is not "":
|
|
AuthServicesInfoManager.update_user_teamspeak3_info(result[0], result[1], request.user)
|
|
logger.debug("Updated authserviceinfo for user %s with TS3 credentials. Updating groups." % request.user)
|
|
logger.info("Successfully activated TS3 for user %s" % request.user)
|
|
messages.success(request, 'Activated TeamSpeak3 account.')
|
|
return redirect("auth_verify_teamspeak3")
|
|
logger.error("Unsuccessful attempt to activate TS3 for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your TeamSpeak3 account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def verify_teamspeak3(request):
|
|
logger.debug("verify_teamspeak3 called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
if not authinfo.teamspeak3_uid:
|
|
logger.warn("Unable to validate user %s teamspeak: no teamspeak data" % request.user)
|
|
return redirect("auth_services")
|
|
if request.method == "POST":
|
|
form = TeamspeakJoinForm(request.POST)
|
|
if form.is_valid():
|
|
update_teamspeak3_groups.delay(request.user.pk)
|
|
logger.debug("Validated user %s joined TS server" % request.user)
|
|
return redirect("auth_services")
|
|
else:
|
|
form = TeamspeakJoinForm({'username': authinfo.teamspeak3_uid})
|
|
context = {
|
|
'form': form,
|
|
'authinfo': authinfo,
|
|
}
|
|
return render(request, 'registered/teamspeakjoin.html', context=context)
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def deactivate_teamspeak3(request):
|
|
logger.debug("deactivate_teamspeak3 called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = Teamspeak3Manager.delete_user(authinfo.teamspeak3_uid)
|
|
|
|
# if false we failed
|
|
if result:
|
|
AuthServicesInfoManager.update_user_teamspeak3_info("", "", request.user)
|
|
logger.info("Successfully deactivated TS3 for user %s" % request.user)
|
|
messages.success(request, 'Deactivated TeamSpeak3 account.')
|
|
else:
|
|
logger.error("Unsuccessful attempt to deactivate TS3 for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your TeamSpeak3 account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def reset_teamspeak3_perm(request):
|
|
logger.debug("reset_teamspeak3_perm called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
character = EveManager.get_character_by_id(authinfo.main_char_id)
|
|
logger.debug("Deleting TS3 user for user %s" % request.user)
|
|
Teamspeak3Manager.delete_user(authinfo.teamspeak3_uid)
|
|
|
|
if authinfo.state == BLUE_STATE:
|
|
logger.debug(
|
|
"Generating new permission key for blue user %s with main character %s" % (request.user, character))
|
|
result = Teamspeak3Manager.generate_new_blue_permissionkey(authinfo.teamspeak3_uid, character.character_name,
|
|
character.corporation_ticker)
|
|
else:
|
|
logger.debug("Generating new permission key for user %s with main character %s" % (request.user, character))
|
|
result = Teamspeak3Manager.generate_new_permissionkey(authinfo.teamspeak3_uid, character.character_name,
|
|
character.corporation_ticker)
|
|
|
|
# if blank we failed
|
|
if result != "":
|
|
AuthServicesInfoManager.update_user_teamspeak3_info(result[0], result[1], request.user)
|
|
logger.debug("Updated authserviceinfo for user %s with TS3 credentials. Updating groups." % request.user)
|
|
update_teamspeak3_groups.delay(request.user.pk)
|
|
logger.info("Successfully reset TS3 permission key for user %s" % request.user)
|
|
messages.success(request, 'Reset TeamSpeak3 permission key.')
|
|
else:
|
|
logger.error("Unsuccessful attempt to reset TS3 permission key for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your TeamSpeak3 account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def deactivate_discord(request):
|
|
logger.debug("deactivate_discord called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = DiscordOAuthManager.delete_user(authinfo.discord_uid)
|
|
if result:
|
|
AuthServicesInfoManager.update_user_discord_info("", request.user)
|
|
logger.info("Successfully deactivated discord for user %s" % request.user)
|
|
messages.success(request, 'Deactivated Discord account.')
|
|
else:
|
|
logger.error("UnSuccessful attempt to deactivate discord for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your Discord account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def reset_discord(request):
|
|
logger.debug("reset_discord called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = DiscordOAuthManager.delete_user(authinfo.discord_uid)
|
|
if result:
|
|
AuthServicesInfoManager.update_user_discord_info("", request.user)
|
|
logger.info("Successfully deleted discord user for user %s - forwarding to discord activation." % request.user)
|
|
return redirect("auth_activate_discord")
|
|
logger.error("Unsuccessful attempt to reset discord for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your Discord account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def activate_discord(request):
|
|
logger.debug("activate_discord called by user %s" % request.user)
|
|
return redirect(DiscordOAuthManager.generate_oauth_redirect_url())
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def discord_callback(request):
|
|
logger.debug("Received Discord callback for activation of user %s" % request.user)
|
|
code = request.GET.get('code', None)
|
|
if not code:
|
|
logger.warn("Did not receive OAuth code from callback of user %s" % request.user)
|
|
return redirect("auth_services")
|
|
user_id = DiscordOAuthManager.add_user(code)
|
|
if user_id:
|
|
AuthServicesInfoManager.update_user_discord_info(user_id, request.user)
|
|
if settings.DISCORD_SYNC_NAMES:
|
|
update_discord_nickname.delay(request.user.pk)
|
|
update_discord_groups.delay(request.user.pk)
|
|
logger.info("Successfully activated Discord for user %s" % request.user)
|
|
messages.success(request, 'Activated Discord account.')
|
|
else:
|
|
logger.error("Failed to activate Discord for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your Discord account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@user_passes_test(superuser_test)
|
|
def discord_add_bot(request):
|
|
return redirect(DiscordOAuthManager.generate_bot_add_url())
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def set_forum_password(request):
|
|
logger.debug("set_forum_password called by user %s" % request.user)
|
|
if request.method == 'POST':
|
|
logger.debug("Received POST request with form.")
|
|
form = ServicePasswordForm(request.POST)
|
|
logger.debug("Form is valid: %s" % form.is_valid())
|
|
if form.is_valid():
|
|
password = form.cleaned_data['password']
|
|
logger.debug("Form contains password of length %s" % len(password))
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = Phpbb3Manager.update_user_password(authinfo.forum_username, authinfo.main_char_id,
|
|
password=password)
|
|
if result != "":
|
|
logger.info("Successfully set forum password for user %s" % request.user)
|
|
messages.success(request, 'Set forum password.')
|
|
else:
|
|
logger.error("Failed to install custom forum password for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your forum account.')
|
|
return redirect("auth_services")
|
|
else:
|
|
logger.debug("Request is not type POST - providing empty form.")
|
|
form = ServicePasswordForm()
|
|
|
|
logger.debug("Rendering form for user %s" % request.user)
|
|
context = {'form': form, 'service': 'Forum'}
|
|
return render(request, 'registered/service_password.html', context=context)
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def set_mumble_password(request):
|
|
logger.debug("set_mumble_password called by user %s" % request.user)
|
|
if request.method == 'POST':
|
|
logger.debug("Received POST request with form.")
|
|
form = ServicePasswordForm(request.POST)
|
|
logger.debug("Form is valid: %s" % form.is_valid())
|
|
if form.is_valid():
|
|
password = form.cleaned_data['password']
|
|
logger.debug("Form contains password of length %s" % len(password))
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = MumbleManager.update_user_password(authinfo.mumble_username, password=password)
|
|
if result != "":
|
|
logger.info("Successfully reset forum password for user %s" % request.user)
|
|
messages.success(request, 'Set Mumble password.')
|
|
else:
|
|
logger.error("Failed to install custom mumble password for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your Mumble account.')
|
|
return redirect("auth_services")
|
|
else:
|
|
logger.debug("Request is not type POST - providing empty form.")
|
|
form = ServicePasswordForm()
|
|
|
|
logger.debug("Rendering form for user %s" % request.user)
|
|
context = {'form': form, 'service': 'Mumble'}
|
|
return render(request, 'registered/service_password.html', context=context)
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def set_jabber_password(request):
|
|
logger.debug("set_jabber_password called by user %s" % request.user)
|
|
if request.method == 'POST':
|
|
logger.debug("Received POST request with form.")
|
|
form = ServicePasswordForm(request.POST)
|
|
logger.debug("Form is valid: %s" % form.is_valid())
|
|
if form.is_valid():
|
|
password = form.cleaned_data['password']
|
|
logger.debug("Form contains password of length %s" % len(password))
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = OpenfireManager.update_user_pass(authinfo.jabber_username, password=password)
|
|
if result != "":
|
|
logger.info("Successfully set jabber password for user %s" % request.user)
|
|
messages.success(request, 'Set jabber password.')
|
|
else:
|
|
logger.error("Failed to install custom jabber password for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your jabber account.')
|
|
return redirect("auth_services")
|
|
else:
|
|
logger.debug("Request is not type POST - providing empty form.")
|
|
form = ServicePasswordForm()
|
|
|
|
logger.debug("Rendering form for user %s" % request.user)
|
|
context = {'form': form, 'service': 'Jabber'}
|
|
return render(request, 'registered/service_password.html', context=context)
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def set_ipboard_password(request):
|
|
logger.debug("set_ipboard_password called by user %s" % request.user)
|
|
error = None
|
|
if request.method == 'POST':
|
|
logger.debug("Received POST request with form.")
|
|
form = ServicePasswordForm(request.POST)
|
|
logger.debug("Form is valid: %s" % form.is_valid())
|
|
if form.is_valid():
|
|
password = form.cleaned_data['password']
|
|
logger.debug("Form contains password of length %s" % len(password))
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = IPBoardManager.update_user_password(authinfo.ipboard_username, request.user.email,
|
|
plain_password=password)
|
|
if result != "":
|
|
logger.info("Successfully set IPBoard password for user %s" % request.user)
|
|
messages.success(request, 'Set IPBoard password.')
|
|
else:
|
|
logger.error("Failed to install custom ipboard password for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your IPBoard account.')
|
|
return redirect("auth_services")
|
|
else:
|
|
logger.debug("Request is not type POST - providing empty form.")
|
|
form = ServicePasswordForm()
|
|
|
|
logger.debug("Rendering form for user %s" % request.user)
|
|
context = {'form': form, 'service': 'IPBoard', 'error': error}
|
|
return render(request, 'registered/service_password.html', context=context)
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def activate_ips4(request):
|
|
logger.debug("activate_ips4 called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
# Valid now we get the main characters
|
|
character = EveManager.get_character_by_id(authinfo.main_char_id)
|
|
logger.debug("Adding IPS4 user for user %s with main character %s" % (request.user, character))
|
|
result = Ips4Manager.add_user(character.character_name, request.user.email)
|
|
# if empty we failed
|
|
if result[0] != "":
|
|
AuthServicesInfoManager.update_user_ips4_info(result[0], result[2], request.user)
|
|
logger.debug("Updated authserviceinfo for user %s with IPS4 credentials." % request.user)
|
|
# update_ips4_groups.delay(request.user.pk)
|
|
logger.info("Successfully activated IPS4 for user %s" % request.user)
|
|
messages.success(request, 'Activated IPSuite4 account.')
|
|
credentials = {
|
|
'username': result[0],
|
|
'password': result[1],
|
|
}
|
|
return render(request, 'registered/service_credentials.html',
|
|
context={'credentials': credentials, 'service': 'IPSuite4'})
|
|
else:
|
|
logger.error("UnSuccessful attempt to activate IPS4 for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your IPSuite4 account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def reset_ips4_password(request):
|
|
logger.debug("reset_ips4_password called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = Ips4Manager.update_user_password(authinfo.ips4_username)
|
|
# false we failed
|
|
if result != "":
|
|
logger.info("Successfully reset IPS4 password for user %s" % request.user)
|
|
messages.success(request, 'Reset IPSuite4 password.')
|
|
credentials = {
|
|
'username': authinfo.ips4_username,
|
|
'password': result,
|
|
}
|
|
return render(request, 'registered/service_credentials.html',
|
|
context={'credentials': credentials, 'service': 'IPSuite4'})
|
|
else:
|
|
logger.error("Unsuccessful attempt to reset IPS4 password for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your IPSuite4 account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def set_ips4_password(request):
|
|
logger.debug("set_ips4_password called by user %s" % request.user)
|
|
if request.method == 'POST':
|
|
logger.debug("Received POST request with form.")
|
|
form = ServicePasswordForm(request.POST)
|
|
logger.debug("Form is valid: %s" % form.is_valid())
|
|
if form.is_valid():
|
|
password = form.cleaned_data['password']
|
|
logger.debug("Form contains password of length %s" % len(password))
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = Ips4Manager.update_custom_password(authinfo.ips4_username, plain_password=password)
|
|
if result != "":
|
|
logger.info("Successfully set IPS4 password for user %s" % request.user)
|
|
messages.success(request, 'Set IPSuite4 password.')
|
|
else:
|
|
logger.error("Failed to install custom IPS4 password for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your IPSuite4 account.')
|
|
return redirect('auth_services')
|
|
else:
|
|
logger.debug("Request is not type POST - providing empty form.")
|
|
form = ServicePasswordForm()
|
|
|
|
logger.debug("Rendering form for user %s" % request.user)
|
|
context = {'form': form, 'service': 'IPS4'}
|
|
return render(request, 'registered/service_password.html', context=context)
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def deactivate_ips4(request):
|
|
logger.debug("deactivate_ips4 called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = Ips4Manager.delete_user(authinfo.ips4_id)
|
|
if result != "":
|
|
AuthServicesInfoManager.update_user_ips4_info("", "", request.user)
|
|
logger.info("Successfully deactivated IPS4 for user %s" % request.user)
|
|
messages.success(request, 'Deactivated IPSuite4 account.')
|
|
else:
|
|
logger.error("UnSuccessful attempt to deactivate IPS4 for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your IPSuite4 account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def activate_smf(request):
|
|
logger.debug("activate_smf called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
# Valid now we get the main characters
|
|
character = EveManager.get_character_by_id(authinfo.main_char_id)
|
|
logger.debug("Adding smf user for user %s with main character %s" % (request.user, character))
|
|
result = smfManager.add_user(character.character_name, request.user.email, ['Member'], authinfo.main_char_id)
|
|
# if empty we failed
|
|
if result[0] != "":
|
|
AuthServicesInfoManager.update_user_smf_info(result[0], request.user)
|
|
logger.debug("Updated authserviceinfo for user %s with smf credentials. Updating groups." % request.user)
|
|
update_smf_groups.delay(request.user.pk)
|
|
logger.info("Successfully activated smf for user %s" % request.user)
|
|
messages.success(request, 'Activated SMF account.')
|
|
credentials = {
|
|
'username': result[0],
|
|
'password': result[1],
|
|
}
|
|
return render(request, 'registered/service_credentials.html',
|
|
context={'credentials': credentials, 'service': 'SMF'})
|
|
else:
|
|
logger.error("UnSuccessful attempt to activate smf for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your SMF account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def deactivate_smf(request):
|
|
logger.debug("deactivate_smf called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = smfManager.disable_user(authinfo.smf_username)
|
|
# false we failed
|
|
if result:
|
|
AuthServicesInfoManager.update_user_smf_info("", request.user)
|
|
logger.info("Successfully deactivated smf for user %s" % request.user)
|
|
messages.success(request, 'Deactivated SMF account.')
|
|
else:
|
|
logger.error("UnSuccessful attempt to activate smf for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your SMF account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def reset_smf_password(request):
|
|
logger.debug("reset_smf_password called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = smfManager.update_user_password(authinfo.smf_username, authinfo.main_char_id)
|
|
# false we failed
|
|
if result != "":
|
|
logger.info("Successfully reset smf password for user %s" % request.user)
|
|
messages.success(request, 'Reset SMF password.')
|
|
credentials = {
|
|
'username': authinfo.smf_username,
|
|
'password': result,
|
|
}
|
|
return render(request, 'registered/service_credentials.html',
|
|
context={'credentials': credentials, 'service': 'SMF'})
|
|
else:
|
|
logger.error("Unsuccessful attempt to reset smf password for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your SMF account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def set_smf_password(request):
|
|
logger.debug("set_smf_password called by user %s" % request.user)
|
|
if request.method == 'POST':
|
|
logger.debug("Received POST request with form.")
|
|
form = ServicePasswordForm(request.POST)
|
|
logger.debug("Form is valid: %s" % form.is_valid())
|
|
if form.is_valid():
|
|
password = form.cleaned_data['password']
|
|
logger.debug("Form contains password of length %s" % len(password))
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = smfManager.update_user_password(authinfo.smf_username, authinfo.main_char_id, password=password)
|
|
if result != "":
|
|
logger.info("Successfully set smf password for user %s" % request.user)
|
|
messages.success(request, 'Set SMF password.')
|
|
else:
|
|
logger.error("Failed to install custom smf password for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your SMF account.')
|
|
return redirect("auth_services")
|
|
else:
|
|
logger.debug("Request is not type POST - providing empty form.")
|
|
form = ServicePasswordForm()
|
|
|
|
logger.debug("Rendering form for user %s" % request.user)
|
|
context = {'form': form, 'service': 'SMF'}
|
|
return render(request, 'registered/service_password.html', context=context)
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def activate_market(request):
|
|
logger.debug("activate_market called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
# Valid now we get the main characters
|
|
character = EveManager.get_character_by_id(authinfo.main_char_id)
|
|
logger.debug("Adding market user for user %s with main character %s" % (request.user, character))
|
|
result = marketManager.add_user(character.character_name, request.user.email, authinfo.main_char_id,
|
|
character.character_name)
|
|
# if empty we failed
|
|
if result[0] != "":
|
|
AuthServicesInfoManager.update_user_market_info(result[0], request.user)
|
|
logger.debug("Updated authserviceinfo for user %s with market credentials." % request.user)
|
|
logger.info("Successfully activated market for user %s" % request.user)
|
|
messages.success(request, 'Activated Alliance Market account.')
|
|
credentials = {
|
|
'username': result[0],
|
|
'password': result[1],
|
|
}
|
|
return render(request, 'registered/service_credentials.html',
|
|
context={'credentials': credentials, 'service': 'Alliance Market'})
|
|
else:
|
|
logger.error("UnSuccessful attempt to activate market for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your Alliance Market account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def deactivate_market(request):
|
|
logger.debug("deactivate_market called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = marketManager.disable_user(authinfo.market_username)
|
|
# false we failed
|
|
if result:
|
|
AuthServicesInfoManager.update_user_market_info("", request.user)
|
|
logger.info("Successfully deactivated market for user %s" % request.user)
|
|
messages.success(request, 'Deactivated Alliance Market account.')
|
|
else:
|
|
logger.error("UnSuccessful attempt to activate market for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your Alliance Market account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def reset_market_password(request):
|
|
logger.debug("reset_market_password called by user %s" % request.user)
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = marketManager.update_user_password(authinfo.market_username)
|
|
# false we failed
|
|
if result != "":
|
|
logger.info("Successfully reset market password for user %s" % request.user)
|
|
messages.success(request, 'Reset Alliance Market password.')
|
|
credentials = {
|
|
'username': authinfo.market_username,
|
|
'password': result,
|
|
}
|
|
return render(request, 'registered/service_credentials.html',
|
|
context={'credentials': credentials, 'service': 'Alliance Market'})
|
|
else:
|
|
logger.error("Unsuccessful attempt to reset market password for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your Alliance Market account.')
|
|
return redirect("auth_services")
|
|
|
|
|
|
@login_required
|
|
@members_and_blues()
|
|
def set_market_password(request):
|
|
logger.debug("set_market_password called by user %s" % request.user)
|
|
if request.method == 'POST':
|
|
logger.debug("Received POST request with form.")
|
|
form = ServicePasswordForm(request.POST)
|
|
logger.debug("Form is valid: %s" % form.is_valid())
|
|
if form.is_valid():
|
|
password = form.cleaned_data['password']
|
|
logger.debug("Form contains password of length %s" % len(password))
|
|
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
|
result = marketManager.update_custom_password(authinfo.market_username, password)
|
|
if result != "":
|
|
logger.info("Successfully reset market password for user %s" % request.user)
|
|
messages.success(request, 'Set Alliance Market password.')
|
|
else:
|
|
logger.error("Failed to install custom market password for user %s" % request.user)
|
|
messages.error(request, 'An error occurred while processing your Alliance Market account.')
|
|
return redirect("auth_services")
|
|
else:
|
|
logger.debug("Request is not type POST - providing empty form.")
|
|
form = ServicePasswordForm()
|
|
|
|
logger.debug("Rendering form for user %s" % request.user)
|
|
context = {'form': form, 'service': 'Market'}
|
|
return render(request, 'registered/service_password.html', context=context)
|
|
|
|
|
|
@login_required
|
|
def discourse_sso(request):
|
|
|
|
## Check if user has access
|
|
|
|
auth = AuthServicesInfo.objects.get(user=request.user)
|
|
if not request.user.is_superuser:
|
|
if not settings.ENABLE_AUTH_DISCOURSE and auth.state == MEMBER_STATE:
|
|
messages.error(request, 'Members are not authorized to access Discourse.')
|
|
return redirect('auth_dashboard')
|
|
elif not settings.ENABLE_BLUE_DISCOURSE and auth.state == BLUE_STATE:
|
|
messages.error(request, 'Blues are not authorized to access Discourse.')
|
|
return redirect('auth_dashboard')
|
|
elif auth.state == NONE_STATE:
|
|
messages.error(request, 'You are not authorized to access Discourse.')
|
|
return redirect('auth_dashboard')
|
|
|
|
if not auth.main_char_id:
|
|
messages.error(request, "You must have a main character set to access Discourse.")
|
|
return redirect('auth_characters')
|
|
try:
|
|
main_char = EveCharacter.objects.get(character_id=auth.main_char_id)
|
|
except EveCharacter.DoesNotExist:
|
|
messages.error(request, "Your main character is missing a database model. Please select a new one.")
|
|
return redirect('auth_characters')
|
|
|
|
payload = request.GET.get('sso')
|
|
signature = request.GET.get('sig')
|
|
|
|
if None in [payload, signature]:
|
|
messages.error(request, 'No SSO payload or signature. Please contact support if this problem persists.')
|
|
return redirect('auth_dashboard')
|
|
|
|
## Validate the payload
|
|
|
|
try:
|
|
payload = unquote(payload).encode('utf-8')
|
|
decoded = base64.decodestring(payload).decode('utf-8')
|
|
assert 'nonce' in decoded
|
|
assert len(payload) > 0
|
|
except AssertionError:
|
|
messages.error(request, 'Invalid payload. Please contact support if this problem persists.')
|
|
return redirect('auth_dashboard')
|
|
|
|
key = str(settings.DISCOURSE_SSO_SECRET).encode('utf-8')
|
|
h = hmac.new(key, payload, digestmod=hashlib.sha256)
|
|
this_signature = h.hexdigest()
|
|
|
|
if this_signature != signature:
|
|
messages.error(request, 'Invalid payload. Please contact support if this problem persists.')
|
|
return redirect('auth_dashboard')
|
|
|
|
## Build the return payload
|
|
|
|
username = DiscourseManager._sanitize_username(main_char.character_name)
|
|
|
|
qs = parse_qs(decoded)
|
|
params = {
|
|
'nonce': qs['nonce'][0],
|
|
'email': request.user.email,
|
|
'external_id': request.user.pk,
|
|
'username': username,
|
|
'name': username,
|
|
}
|
|
|
|
if auth.main_char_id:
|
|
params['avatar_url'] = 'https://image.eveonline.com/Character/%s_256.jpg' % auth.main_char_id
|
|
|
|
return_payload = base64.encodestring(urlencode(params).encode('utf-8'))
|
|
h = hmac.new(key, return_payload, digestmod=hashlib.sha256)
|
|
query_string = urlencode({'sso': return_payload, 'sig': h.hexdigest()})
|
|
|
|
## Record activation and queue group sync
|
|
|
|
if not auth.discourse_enabled:
|
|
auth.discourse_enabled = True
|
|
auth.save()
|
|
update_discourse_groups.apply_async(args=[request.user.pk], countdown=30) # wait 30s for new user creation on Discourse
|
|
|
|
## Redirect back to Discourse
|
|
|
|
url = '%s/session/sso_login' % settings.DISCOURSE_URL
|
|
return redirect('%s?%s' % (url, query_string))
|