Changed discord account handling. Now requests email and password and grabs UID via API.

UID is stored in authserviceinfo model and used as required.
This commit is contained in:
Adarnof 2015-12-02 01:02:13 +00:00
parent ec1b17df25
commit 8442ec1f55
9 changed files with 127 additions and 34 deletions

View File

@ -81,9 +81,8 @@ class AuthServicesInfoManager:
authserviceinfo.save(update_fields=['is_blue'])
@staticmethod
def update_user_discord_info(username, password, user):
def update_user_discord_info(user_id, user):
if User.objects.filter(username=user.username).exists():
authserviceinfo = AuthServicesInfoManager.__get_or_create(user)
authserviceinfo.discord_username = username
authserviceinfo.discord_password = password
authserviceinfo.save(update_fields=['discord_username', 'discord_password'])
authserviceinfo.discord_uid = user_id
authserviceinfo.save(update_fields=['discord_uid'])

View File

@ -13,8 +13,7 @@ class AuthServicesInfo(models.Model):
mumble_password = models.CharField(max_length=254, default="")
teamspeak3_uid = models.CharField(max_length=254, default="")
teamspeak3_perm_key = models.CharField(max_length=254, default="")
discord_username = models.CharField(max_length=254, default="")
discord_password = models.CharField(max_length=254, default="")
discord_uid = models.CharField(max_length=254, default="")
main_char_id = models.CharField(max_length=64, default="")
is_blue = models.BooleanField(default=False)
user = models.ForeignKey(User)

View File

@ -116,7 +116,7 @@ def update_discord_groups(user):
if len(groups) == 0:
groups.append('empty')
DiscordManager.update_groups(authserviceinfo.discord_username, groups)
DiscordManager.update_groups(authserviceinfo.discord_uid, groups)
def create_syncgroup_for_user(user, groupname, servicename):
synccache = SyncGroupCache()
@ -196,7 +196,7 @@ def remove_from_databases(user, groups, syncgroups):
update_ipboard_groups(user)
if authserviceinfo.teamspeak3_uid and authserviceinfo.teamspeak3_uid != "":
update_teamspeak3_groups(user)
if authserviceinfo.discord_username and authserviceinfo.discord_username != "":
if authserviceinfo.discord_uid and authserviceinfo.discord_uid != "":
update_discord_groups(user)

View File

@ -24,3 +24,7 @@ class FleetFormatterForm(forms.Form):
reimbursable = forms.ChoiceField(label='Reimbursable?*', choices=[('Yes', 'Yes'), ('No', 'No')], required=True)
important = forms.ChoiceField(label='Important?*', choices=[('Yes', 'Yes'), ('No', 'No')], required=True)
comments = forms.CharField(widget=forms.Textarea, required=False)
class DiscordForm(forms.Form):
email = forms.CharField(label="Email Address", required=True)
password = forms.CharField(label="Password", required=True)

View File

@ -117,8 +117,8 @@ class DiscordAPIManager:
return r.json()
@staticmethod
def accept_invite(invite_id):
custom_headers = {'accept': 'application/json'}
def accept_invite(invite_id, token):
custom_headers = {'accept': 'application/json', 'authorization': token}
path = DISCORD_URL + "/invite/" + str(invite_id)
r = requests.post(path, headers=custom_headers)
r.raise_for_status()
@ -259,6 +259,14 @@ class DiscordAPIManager:
r.raise_for_status
return r.json()
@staticmethod
def check_if_user_banned(server_id, user_id):
bans = DiscordAPIManager.get_bans(server_id)
for b in bans:
if b['user']['id'] == str(user_id):
return True
return False
class DiscordManager:
def __init__(self):
pass
@ -273,7 +281,7 @@ class DiscordManager:
return os.urandom(8).encode('hex')
@staticmethod
def add_user(username, email):
def old_add_user(username, email):
try:
username_clean = DiscordManager.__sanatize_username(username)
invite_code = DiscordAPIManager.create_invite(settings.DISCORD_SERVER_ID)['code']
@ -286,7 +294,7 @@ class DiscordManager:
return "", ""
@staticmethod
def delete_user(username, email, password):
def old_delete_user(username, email, password):
try:
user_id = DiscordAPIManager.get_user_id(settings.DISCORD_SERVER_ID, username)
DiscordAPIManager.kick_user(settings.DISCORD_SERVER_ID, user_id)
@ -298,8 +306,7 @@ class DiscordManager:
return False
@staticmethod
def update_groups(username, groups):
user_id = DiscordAPIManager.get_user_id(settings.DISCORD_SERVER_ID, username)
def update_groups(user_id, groups):
group_ids = []
for g in groups:
try:
@ -317,18 +324,16 @@ class DiscordManager:
return named_group['id']
@staticmethod
def lock_user(username):
def lock_user(user_id):
try:
user_id = DiscordAPIManager.get_user_id(username)
DiscordAPIManager.ban_user(settings.DISCORD_SERVER_ID, user_id)
return True
except:
return False
@staticmethod
def unlock_user(username):
def unlock_user(user_id):
try:
user_id = DiscordAPIManager.get_user_id(username)
DiscordAPIManager.unban_user(settings.DISCORD_SERVER_ID, user_id)
return True
except:
@ -342,3 +347,33 @@ class DiscordManager:
return new_password
except:
return current_password
@staticmethod
def get_user_id(email, password):
try:
profile = DiscordAPIManager.get_user_profile(email, password)
return profile['user']['id']
except:
return ""
@staticmethod
def add_user(email, password):
try:
profile = DiscordAPIManager.get_user_profile(email, password)
user_id = profile['id']
if DiscordAPIManager.check_if_user_banned(settings.DISCORD_SERVER_ID, user_id):
DiscordAPIManager.unban_user(settings.DISCORD_SERVER_ID, user_id)
invite_code = DiscordAPIManager.create_invite(settings.DISCORD_SERVER_ID)['code']
token = DiscordAPIManager.get_token_by_user(email, password)
DiscordAPIManager.accept_invite(invite_code, token)
return user_id
except:
return ""
@staticmethod
def delete_user(user_id):
try:
DiscordAPIManager.ban_user(settings.DISCORD_SERVER_ID, user_id)
return True
except:
return False

View File

@ -24,6 +24,7 @@ from celerytask.tasks import update_teamspeak3_groups
from celerytask.tasks import update_discord_groups
from forms import JabberBroadcastForm
from forms import FleetFormatterForm
from forms import DiscordForm
from util import check_if_user_has_permission
import threading
@ -322,7 +323,7 @@ context_instance=RequestContext(request))
@login_required
@user_passes_test(service_blue_alliance_test)
def activate_discord(request):
def old_activate_discord(request):
authinfo = AuthServicesInfoManager.get_auth_service_info(request.user)
character = EveManager.get_character_by_id(authinfo.main_char_id)
info = DiscordManager.add_user(character.character_name, request.user.email)
@ -337,10 +338,10 @@ def activate_discord(request):
@user_passes_test(service_blue_alliance_test)
def deactivate_discord(request):
authinfo = AuthServicesInfoManager.get_auth_service_info(request.user)
result = DiscordManager.delete_user(authinfo.discord_username, request.user.email, authinfo.discord_password)
result = DiscordManager.delete_user(authinfo.discord_uid)
remove_all_syncgroups_for_service(request.user, "discord")
if result:
AuthServicesInfoManager.update_user_discord_info("", "", request.user)
AuthServicesInfoManager.update_user_discord_info("",request.user)
return HttpResponseRedirect("/services/")
return HttpResponseRedirect("/dashboard")
@ -348,9 +349,31 @@ def deactivate_discord(request):
@user_passes_test(service_blue_alliance_test)
def reset_discord(request):
authinfo = AuthServicesInfoManager.get_auth_service_info(request.user)
result = DiscordManager.update_user_password(request.user.email, authinfo.discord_password)
result = DiscordManager.delete_user(authinfo.discord_uid)
if result:
AuthServicesInfoManager.update_user_discord_info(authinfo.discord_username, result, request.user)
update_discord_groups(request.user)
return HttpResponseRedirect("/services/")
AuthServicesInfoManager.update_user_discord_info("",request.user)
return HttpResponseRedirect("/activate_discord/")
return HttpResponseRedirect("/services/")
@login_required
@user_passes_test(service_blue_alliance_test)
def activate_discord(request):
success = False
if request.method == 'POST':
form = DiscordForm(request.POST)
if form.is_valid():
email = form.cleaned_data['email']
password = form.cleaned_data['password']
try:
user_id = DiscordManager.add_user(email, password)
AuthServicesInfoManager.update_user_discord_info(user_id, request.user)
update_discord_groups(request.user)
success = True
return HttpResponseRedirect("/services/")
except:
pass
else:
form = DiscordForm()
context = {'form': form, 'success': success}
return render_to_response('registered/discord.html', context, context_instance=RequestContext(request))

View File

@ -0,0 +1,33 @@
{% extends "public/base.html" %}
{% load bootstrap %}
{% load staticfiles %}
{% block title %}Alliance Auth{% endblock %}
{% block page_title %}Jabber Broadcast{% endblock page_title %}
{% block extra_css %}{% endblock extra_css %}
{% block content %}
<div class="col-lg-12">
<h1 class="page-header text-center">Discord Connection</h1>
<div class="container-fluid">
<div class="col-md-4 col-md-offset-4">
<div class="row">
{% if success %}
<div class="alert alert-success" role="alert">Account Linked</div>
{% endif %}
<p>Enter your discord account credentials below. These are not stored: they are needed to determine your user ID and make you join the server.</p>
<form class="form-signin" role="form" action="" method="POST"
onsubmit="submitbutton.disabled = true; return true;">
{% csrf_token %}
{{ form|bootstrap }}
<br/>
<button class="btn btn-lg btn-primary btn-block" name="submitbutton" type="submit">Connect</button>
</form>
</div>
</div>
</div>
</div>
{% endblock content %}

View File

@ -117,11 +117,11 @@
{% if ENABLE_BLUE_DISCORD %}
<tr>
<td class="text-center">Discord</td>
<td class="text-center">{{ authinfo.discord_username }}</td>
<td class="text-center">{{ authinfo.discord_password }}</td>
<td class="text-center">{{ authinfo.discord_uid }}</td>
<td class="text-center"></td>
<td class="text-center"><a href="https://discordapp.com/channels/{{ DISCORD_SERVER_ID }}/{{ DISCORD_SERVER_ID}}">https://discordapp.com</a></td>
<td class="text-center">
{% ifequal authinfo.discord_username "" %}
{% ifequal authinfo.discord_uid "" %}
<a href="{% url 'auth_activate_discord' %}">
<button type="button" class="btn btn-warning"><span
class="glyphicon glyphicon-ok"></span></button>
@ -288,11 +288,11 @@
{% if ENABLE_AUTH_DISCORD %}
<tr>
<td class="text-center">Discord</td>
<td class="text-center">{{ authinfo.discord_username }}</td>
<td class="text-center">{{ authinfo.discord_password }}</td>
<td class="text-center">{{ authinfo.discord_uid }}</td>
<td class="text-center"></td>
<td class="text-center"><a href="https://discordapp.com/channels/{{ DISCORD_SERVER_ID }}/{{ DISCORD_SERVER_ID}}">https://discordapp.com</a></td>
<td class="text-center">
{% ifequal authinfo.discord_username "" %}
{% ifequal authinfo.discord_uid "" %}
<a href="{% url 'auth_activate_discord' %}">
<button type="button" class="btn btn-warning"><span
class="glyphicon glyphicon-ok"></span></button>

View File

@ -42,9 +42,9 @@ def deactivate_services(user):
if authinfo.teamspeak3_uid and authinfo.teamspeak3_uid != "":
Teamspeak3Manager.delete_user(authinfo.teamspeak3_uid)
AuthServicesInfoManager.update_user_teamspeak3_info("", "", user)
if authinfo.discord_username and authinfo.discord_username != "":
DiscordManager.lock_user(authinfo.discord_username)
AuthServicesInfoManager.update_user_discord_info("", "", user)
if authinfo.discord_uid and authinfo.discord_uid != "":
DiscordManager.delete_user(authinfo.discord_uid)
AuthServicesInfoManager.update_user_discord_info("", user)
def generate_corp_group_name(corpname):