XenForo integration initial version (#459)

* XenForo integration beta

* Removing debug loggers
This commit is contained in:
Meletis Flevarakis
2016-06-12 00:22:58 +03:00
committed by Adarnof
parent 842080f3de
commit e6b08fca88
10 changed files with 313 additions and 0 deletions

View File

@@ -0,0 +1,137 @@
import os
import requests
import json
from django.conf import settings
import logging
logger = logging.getLogger(__name__)
class XenForoManager:
def __init__(self):
if not settings.XENFORO_ENDPOINT:
logger.debug("Could not find XenForo endpoint")
if not settings.XENFORO_APIKEY:
logger.debug("XenForo API Key not found")
pass
@staticmethod
def __sanitize_username(username):
sanitized = username.replace(" ", "_")
return sanitized
@staticmethod
def __generate_password():
return os.urandom(8).encode('hex')
@staticmethod
def exec_http_request(http_params):
default_params = {
'hash': settings.XENFORO_APIKEY
}
http_params.update(default_params)
r = requests.get(settings.XENFORO_ENDPOINT, params=http_params)
return r
@staticmethod
def add_user(username, email):
sanitized = XenForoManager.__sanitize_username(username)
password = XenForoManager.__generate_password();
data = {
'action': 'register',
'username': sanitized,
'password': password,
'email': email,
'group': settings.XENFORO_DEFAULT_GROUP,
'visible': '1',
'user_state': 'valid'
}
r = XenForoManager.exec_http_request(data)
# check if the user already exist but was disabled
if r.status_code != 200:
if json.loads(r.text)['error'] == 7:
data = XenForoManager.reactivate_user(sanitized)
return data
response = {
'response': {
'message': r.text,
'status_code': r.status_code
}
}
data.update(response)
return data
@staticmethod
def reset_password(username):
password = XenForoManager.__generate_password();
data = {
'action': 'editUser',
'user': username,
'password': password
}
r = XenForoManager.exec_http_request(data)
response = {
'response': {
'message': r.text,
'status_code': r.status_code
}
}
data.update(response)
return data
@staticmethod
def disable_user(username):
data = {
'action': 'editUser',
'user': username,
'remove_groups': settings.XENFORO_DEFAULT_GROUP
}
r = XenForoManager.exec_http_request(data)
return r
@staticmethod
def reactivate_user(username):
data = {
'action': 'editUser',
'user': username,
'add_groups': settings.XENFORO_DEFAULT_GROUP,
'password': XenForoManager.__generate_password()
}
r = XenForoManager.exec_http_request(data)
response = {
'response': {
'message': r.text,
'status_code': r.status_code
},
'username': username
}
data.update(response)
return data
@staticmethod
def update_user_password(username, raw_password):
data = {
'action': 'editUser',
'user': username,
'password': raw_password
}
r = XenForoManager.exec_http_request(data)
response = {
'response': {
'message': r.text,
'status_code': r.status_code
},
'username': username
}
data.update(response)
return data

View File

@@ -12,6 +12,7 @@ from managers.openfire_manager import OpenfireManager
from managers.phpbb3_manager import Phpbb3Manager
from managers.mumble_manager import MumbleManager
from managers.ipboard_manager import IPBoardManager
from managers.xenforo_manager import XenForoManager
from managers.teamspeak3_manager import Teamspeak3Manager
from managers.discord_manager import DiscordManager
from managers.discourse_manager import DiscourseManager
@@ -178,6 +179,79 @@ def reset_forum_password(request):
logger.error("Unsuccessful attempt to reset forum password for user %s" % request.user)
return HttpResponseRedirect("/dashboard")
@login_required
@user_passes_test(service_blue_alliance_test)
def activate_xenforo_forum(request):
logger.debug("activate_xenforo_forum called by user %s" % request.user)
authinfo = AuthServicesInfoManager.get_auth_service_info(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'], result['password'], request.user)
return HttpResponseRedirect("/services/")
logger.error("Unsuccesful attempt to activate xenforo for user %s" % request.user)
return HttpResponseRedirect("/dashboard")
@login_required
@user_passes_test(service_blue_alliance_test)
def deactivate_xenforo_forum(request):
logger.debug("deactivate_xenforo_forum called by user %s" % request.user)
authinfo = AuthServicesInfoManager.get_auth_service_info(request.user)
result = XenForoManager.disable_user(authinfo.xenforo_username)
if result.status_code == 200:
AuthServicesInfoManager.update_user_xenforo_info("", "", request.user)
logger.info("Succesfully deactivated XenForo for user %s" % request.user)
return HttpResponseRedirect("/services/")
return HttpResponseRedirect("/dashboard")
@login_required
@user_passes_test(service_blue_alliance_test)
def reset_xenforo_password(request):
logger.debug("reset_xenforo_password called by user %s" % request.user)
authinfo = AuthServicesInfoManager.get_auth_service_info(request.user)
character = EveManager.get_character_by_id(authinfo.main_char_id)
result = XenForoManager.reset_password(authinfo.xenforo_username)
# Based on XenAPI's response codes
if result['response']['status_code'] == 200:
AuthServicesInfoManager.update_user_xenforo_info(authinfo.xenforo_username, result['password'], request.user)
logger.info("Succesfully reset XenForo password for user %s" % request.user)
return HttpResponseRedirect("/services/")
logger.error("Unsuccessful attempt to reset XenForo password for user %s" % request.user)
return HttpResponseRedirect("/dashboard")
@login_required
@user_passes_test(service_blue_alliance_test)
def set_xenforo_password(request):
logger.debug("set_xenforo_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 = AuthServicesInfoManager.get_auth_service_info(request.user)
result = XenForoManager.update_user_password(authinfo.xenforo_username, password)
if result['response']['status_code'] == 200:
AuthServicesInfoManager.update_user_xenforo_info(authinfo.xenforo_username, result['password'], request.user)
logger.info("Succesfully reset XenForo password for user %s" % request.user)
return HttpResponseRedirect("/services/")
else:
logger.error("Failed to install custom XenForo password for user %s" % request.user)
error = "Failed to install custom password."
else:
error = "Invalid password provided"
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_to_response('registered/service_password.html', context, context_instance=RequestContext(request))
@login_required
@user_passes_test(service_blue_alliance_test)