diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index 634ddfcd..b7866743 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -21,8 +21,8 @@ mysql com.mysql.jdbc.Driver jdbc:mysql://127.0.0.1:3306/alliance_mumble - allianceauth - dfcbdfc6dfc6dfc3dfcbdfc4dfc9dfcfdfcbdfdfdfdedfc2 + alliancemumble + dfcbdfc6dfc6dfc3dfcbdfc4dfc9dfcfdfc7dfdfdfc7dfc8dfc6dfcf diff --git a/README.md b/README.md index fccbb328..6f375f85 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ allianceauth Alliance service auth to help large scale alliances manage services. Built for "The 99 Percent" open for anyone to use -Requirments: +Requirements: # Django Stuff # django 1.6.1 @@ -21,7 +21,7 @@ Requirments: python-dnspython # Needed Apps - rabbitmq + celeryd bcrypt Services Interaction: @@ -34,24 +34,18 @@ Services Interaction: Startup Instructions: - python syncdb - python manage.py celeryd --verbosity=2 --loglevel=DEBUG - python manage.py celerybeat --verbosity=2 --loglevel=DEBUG - python manage.py runserver + ./bootstrap.sh (Sudo if needed) + ./startup.sh + ./shutdown.sh + Special Permissions In Admin: + auth | user | alliance_member ( Added auto by auth when a member is verified ) auth | user | group_management ( Access to add members to groups within the alliance ) auth | user | human_resources ( Corp only access to view applications ) auth | user | jabber_broadcast ( Access to broadcast a message over jabber to specific groups or all) - - -Note: - - In order to create permissions automatically you there is a "bootstrap_permissions" function in the - __init__.py of the groupmanagement folder. Comment out before running syncdb, after add it back. - This is there because i currently have no idea how to do this any other way. - + auth | user | blue_memeber ( Auto Added to people who register has a blue when adding api key) -Eve alliance auth for the 99 percent +Brought to you by The 99 Percent skunkworks. \ No newline at end of file diff --git a/alliance_auth/settings.py b/alliance_auth/settings.py index 5a1a3240..678ababa 100644 --- a/alliance_auth/settings.py +++ b/alliance_auth/settings.py @@ -13,11 +13,9 @@ import os import djcelery - djcelery.setup_loader() BASE_DIR = os.path.dirname(os.path.dirname(__file__)) - # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/ @@ -103,8 +101,8 @@ DATABASES = { 'mumble': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'alliance_mumble', - 'USER': 'allianceauth', - 'PASSWORD': 'allianceauth', + 'USER': 'alliancemumble', + 'PASSWORD': 'alliancemumble', 'HOST': '127.0.0.1', 'PORT': '3306', } @@ -148,22 +146,26 @@ USE_L10N = True USE_TZ = True - # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.6/howto/static-files/ - STATIC_URL = '/static/' DEFAULT_ALLIANCE_GROUP = 'AllianceMember' +DEFAULT_BLUE_GROUP = 'BlueMember' # ALLIANCE INFO ALLIANCE_ID = '99001336' ALLIANCE_NAME = 'Somealliance' +# Needed to update standings +ALLIANCE_EXEC_CORP_ID = '' +ALLIANCE_EXEC_CORP_VCODE = '' +ALLIANCE_BLUE_STANDING = 5.0 + # Forum URL FORUM_URL = "http://someaddress.com" -# Jabber Prosody Info +# Jabber information JABBER_URL = "someaddress.com" JABBER_PORT = 5223 JABBER_SERVER = "someadddress.com" diff --git a/alliance_auth/urls.py b/alliance_auth/urls.py index df55ebff..58e59e7e 100644 --- a/alliance_auth/urls.py +++ b/alliance_auth/urls.py @@ -92,8 +92,12 @@ urlpatterns = patterns('', name='auth_reset_jabber_password'), # Mumble service contraol + url(r'^activate_blue_mumble/$', 'services.views.activate_blue_mumble', + name='auth_activate_blue_mumble'), url(r'^activate_mumble/$', 'services.views.activate_mumble', name='auth_activate_mumble'), url(r'^deactivate_mumble/$', 'services.views.deactivate_mumble', name='auth_deactivate_mumble'), + url(r'^deactivate_blue_mumble/$', 'services.views.deactivate_blue_mumble', + name='auth_deactivate_blue_mumble'), url(r'^reset_mumble_password/$', 'services.views.reset_mumble_password', name='auth_reset_mumble_password'), diff --git a/authentication/managers.py b/authentication/managers.py index 420048b9..0e63b6f6 100644 --- a/authentication/managers.py +++ b/authentication/managers.py @@ -56,3 +56,11 @@ class AuthServicesInfoManager: authserviceinfo.mumble_username = username authserviceinfo.mumble_password = password authserviceinfo.save(update_fields=['mumble_username', 'mumble_password']) + + @staticmethod + def update_is_blue(is_blue, user): + if User.objects.filter(username=user.username).exists(): + authserviceinfo = AuthServicesInfoManager.__get_or_create(user) + authserviceinfo.is_blue = is_blue + authserviceinfo.save(update_fields=['is_blue']) + diff --git a/authentication/models.py b/authentication/models.py index c6fc4e02..12d25074 100644 --- a/authentication/models.py +++ b/authentication/models.py @@ -10,7 +10,7 @@ class AuthServicesInfo(models.Model): mumble_username = models.CharField(max_length=254, default="") mumble_password = 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) def __str__(self): diff --git a/celerytask/tasks.py b/celerytask/tasks.py index 9a1dded7..2fa2ae94 100644 --- a/celerytask/tasks.py +++ b/celerytask/tasks.py @@ -66,9 +66,6 @@ def add_to_databases(user, groups, syncgroups): for group in groups: syncgroup = syncgroups.filter(groupname=group.name) if not syncgroup: - # gotta create group - # create syncgroup - # create service groups synccache = SyncGroupCache() synccache.groupname = group.name synccache.user = user @@ -155,7 +152,8 @@ def run_api_refresh(): if main_alliance_id == settings.ALLIANCE_ID: pass else: - deactivate_services(user) + if not authserviceinfo.is_blue: + deactivate_services(user) else: # nuke it deactivate_services(user) @@ -166,17 +164,16 @@ def run_api_refresh(): # Run Every 2 hours @periodic_task(run_every=crontab(minute=0, hour="*/2")) def run_alliance_corp_update(): + # I am not proud of this block of code if EveApiManager.check_if_api_server_online(): # Updated alliance info alliance_info = EveApiManager.get_alliance_information(settings.ALLIANCE_ID) + # Populate alliance info if not EveManager.check_if_alliance_exists_by_id(settings.ALLIANCE_ID): EveManager.create_alliance_info(settings.ALLIANCE_ID, alliance_info['name'], alliance_info['ticker'], - alliance_info['executor_id'], alliance_info['member_count']) - - EveManager.update_alliance_info(settings.ALLIANCE_ID, alliance_info['executor_id'], - alliance_info['member_count']) + alliance_info['executor_id'], alliance_info['member_count'], False) alliance = EveManager.get_alliance_info_by_id(settings.ALLIANCE_ID) @@ -185,13 +182,101 @@ def run_alliance_corp_update(): corpinfo = EveApiManager.get_corporation_information(alliance_corp) if not EveManager.check_if_corporation_exists_by_id(corpinfo['id']): EveManager.create_corporation_info(corpinfo['id'], corpinfo['name'], corpinfo['ticker'], - corpinfo['members']['current'], alliance) + corpinfo['members']['current'], False, alliance) - # Update all the corps - for all_corp_info in EveManager.get_all_corporation_info(): - corpinfo = EveApiManager.get_corporation_information(all_corp_info.corporation_id) - if corpinfo['alliance']['id'] == int(settings.ALLIANCE_ID): - EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], alliance) + # Create the corps in the standings + alliance_standings = EveApiManager.get_alliance_standings() + if alliance_standings: + for standing_id in EveApiManager.get_alliance_standings()['alliance']: + if int(alliance_standings['alliance'][standing_id]['standing']) >= settings.ALLIANCE_BLUE_STANDING: + if EveApiManager.check_if_id_is_character(standing_id): + pass + elif EveApiManager.check_if_id_is_corp(standing_id): + corpinfo = EveApiManager.get_corporation_information(standing_id) + if not EveManager.check_if_corporation_exists_by_id(standing_id): + EveManager.create_corporation_info(corpinfo['id'], corpinfo['name'], corpinfo['ticker'], + corpinfo['members']['current'], True, None) + else: + # Alliance id create corps + blue_alliance_info = EveApiManager.get_alliance_information(standing_id) + + if not EveManager.check_if_alliance_exists_by_id(standing_id): + EveManager.create_alliance_info(standing_id, blue_alliance_info['name'], + blue_alliance_info['ticker'], + blue_alliance_info['executor_id'], + blue_alliance_info['member_count'], True) + + blue_alliance = EveManager.get_alliance_info_by_id(standing_id) + + for blue_alliance_corp in blue_alliance_info['member_corps']: + blue_info = EveApiManager.get_corporation_information(blue_alliance_corp) + if not EveManager.check_if_corporation_exists_by_id(blue_info['id']): + EveManager.create_corporation_info(blue_info['id'], blue_info['name'], + blue_info['ticker'], + blue_info['members']['current'], True, blue_alliance) + + # Update all allinace info's + for all_alliance_info in EveManager.get_all_alliance_info(): + all_alliance_api_info = EveApiManager.get_alliance_information(all_alliance_info.alliance_id) + if all_alliance_info.alliance_id == settings.ALLIANCE_ID: + EveManager.update_alliance_info(all_alliance_api_info['id'], all_alliance_api_info['executor_id'], + all_alliance_api_info['member_count'], False) else: - # No longer in the alliance nuke it - all_corp_info.delete() + if int(alliance_standings['alliance'][int(all_alliance_info.alliance_id)][ + 'standing']) >= settings.ALLIANCE_BLUE_STANDING: + EveManager.update_alliance_info(all_alliance_api_info['id'], all_alliance_api_info['executor_id'], + all_alliance_api_info['member_count'], True) + else: + EveManager.update_alliance_info(all_alliance_api_info['id'], all_alliance_api_info['executor_id'], + all_alliance_api_info['member_count'], False) + + # Update corp infos + for all_corp_info in EveManager.get_all_corporation_info(): + alliance = None + corpinfo = EveApiManager.get_corporation_information(all_corp_info.corporation_id) + if corpinfo['alliance']['id'] is not None: + alliance = EveManager.get_alliance_info_by_id(corpinfo['alliance']['id']) + + if alliance is not None: + if all_corp_info.alliance.alliance_id == settings.ALLIANCE_ID: + EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], alliance, False) + else: + if int(alliance.alliance_id) in alliance_standings['alliance']: + if int(alliance_standings['alliance'][int(alliance.alliance_id)][ + 'standing']) >= settings.ALLIANCE_BLUE_STANDING: + EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], alliance, + True) + else: + EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], alliance, + False) + else: + EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], alliance, + False) + else: + if int(all_corp_info.corporation_id) in alliance_standings['alliance']: + if int(alliance_standings['alliance'][int(all_corp_info.corporation_id)][ + 'standing']) >= settings.ALLIANCE_BLUE_STANDING: + EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], None, True) + else: + EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], None, False) + else: + EveManager.update_corporation_info(corpinfo['id'], corpinfo['members']['current'], None, False) + + # Nuke the none believers + # Check the corps + for all_corp_info in EveManager.get_all_corporation_info(): + if all_corp_info.alliance is not None: + if all_corp_info.alliance.alliance_id != settings.ALLIANCE_ID: + if not all_corp_info.is_blue: + all_corp_info.delete() + else: + if not all_corp_info.is_blue: + all_corp_info.delete() + + # Check the alliances + for all_alliance_info in EveManager.get_all_alliance_info(): + if all_alliance_info.alliance_id != settings.ALLIANCE_ID: + if not all_alliance_info.is_blue: + all_alliance_info.delete() + + diff --git a/eveonline/forms.py b/eveonline/forms.py index 6949c1a8..44b1138e 100644 --- a/eveonline/forms.py +++ b/eveonline/forms.py @@ -7,17 +7,25 @@ from eveonline.managers import EveManager class UpdateKeyForm(forms.Form): api_id = forms.CharField(max_length=254, required=True, label="Key ID") api_key = forms.CharField(max_length=254, required=True, label="Verification Code") + is_blue = forms.BooleanField(label="Blue to alliance", required=False) def clean(self): if EveManager.check_if_api_key_pair_exist(self.cleaned_data['api_id']): raise forms.ValidationError(u'API key already exist') - if not EveApiManager.check_api_is_type_account(self.cleaned_data['api_id'], - self.cleaned_data['api_key']): - raise forms.ValidationError(u'API not of type account') + check_blue = False + try: + check_blue = self.cleaned_data['is_blue'] + except: + pass - if not EveApiManager.check_api_is_full(self.cleaned_data['api_id'], - self.cleaned_data['api_key']): - raise forms.ValidationError(u'API supplied is not a full api key') + if not check_blue: + if not EveApiManager.check_api_is_type_account(self.cleaned_data['api_id'], + self.cleaned_data['api_key']): + raise forms.ValidationError(u'API not of type account') + + if not EveApiManager.check_api_is_full(self.cleaned_data['api_id'], + self.cleaned_data['api_key']): + raise forms.ValidationError(u'API supplied is not a full api key') return self.cleaned_data \ No newline at end of file diff --git a/eveonline/managers.py b/eveonline/managers.py index d62fd0da..270ee7d5 100644 --- a/eveonline/managers.py +++ b/eveonline/managers.py @@ -68,7 +68,7 @@ class EveManager: @staticmethod def create_alliance_info(alliance_id, alliance_name, alliance_ticker, alliance_executor_corp_id, - alliance_member_count): + alliance_member_count, is_blue): if not EveManager.check_if_alliance_exists_by_id(alliance_id): alliance_info = EveAllianceInfo() alliance_info.alliance_id = alliance_id @@ -76,33 +76,38 @@ class EveManager: alliance_info.alliance_ticker = alliance_ticker alliance_info.executor_corp_id = alliance_executor_corp_id alliance_info.member_count = alliance_member_count + alliance_info.is_blue = is_blue alliance_info.save() @staticmethod - def update_alliance_info(alliance_id, alliance_executor_corp_id, alliance_member_count): + def update_alliance_info(alliance_id, alliance_executor_corp_id, alliance_member_count, is_blue): if EveManager.check_if_alliance_exists_by_id(alliance_id): alliance_info = EveAllianceInfo.objects.get(alliance_id=alliance_id) alliance_info.executor_corp_id = alliance_executor_corp_id alliance_info.member_count = alliance_member_count + alliance_info.is_blue = is_blue alliance_info.save() @staticmethod - def create_corporation_info(corp_id, corp_name, corp_ticker, corp_member_count, alliance): + def create_corporation_info(corp_id, corp_name, corp_ticker, corp_member_count, is_blue, alliance): if not EveManager.check_if_corporation_exists_by_id(corp_id): corp_info = EveCorporationInfo() corp_info.corporation_id = corp_id corp_info.corporation_name = corp_name corp_info.corporation_ticker = corp_ticker corp_info.member_count = corp_member_count - corp_info.alliance = alliance + corp_info.is_blue = is_blue + if alliance: + corp_info.alliance = alliance corp_info.save() @staticmethod - def update_corporation_info(corp_id, corp_member_count, alliance): + def update_corporation_info(corp_id, corp_member_count, alliance, is_blue): if EveManager.check_if_corporation_exists_by_id(corp_id): - corp_info = EveCorporationInfo.objects.get(corporation_id = corp_id) + corp_info = EveCorporationInfo.objects.get(corporation_id=corp_id) corp_info.member_count = corp_member_count corp_info.alliance = alliance + corp_info.is_blue = is_blue corp_info.save() @staticmethod @@ -194,7 +199,10 @@ class EveManager: else: return None - @staticmethod def get_all_corporation_info(): - return EveCorporationInfo.objects.all() \ No newline at end of file + return EveCorporationInfo.objects.all() + + @staticmethod + def get_all_alliance_info(): + return EveAllianceInfo.objects.all() \ No newline at end of file diff --git a/eveonline/models.py b/eveonline/models.py index bd1078d0..564b91ef 100644 --- a/eveonline/models.py +++ b/eveonline/models.py @@ -31,6 +31,7 @@ class EveAllianceInfo(models.Model): alliance_name = models.CharField(max_length=254) alliance_ticker = models.CharField(max_length=254) executor_corp_id = models.CharField(max_length=254) + is_blue = models.BooleanField(default=False) member_count = models.IntegerField() def __str__(self): @@ -42,8 +43,8 @@ class EveCorporationInfo(models.Model): corporation_name = models.CharField(max_length=254) corporation_ticker = models.CharField(max_length=254) member_count = models.IntegerField() - - alliance = models.ForeignKey(EveAllianceInfo) + is_blue = models.BooleanField(default=False) + alliance = models.ForeignKey(EveAllianceInfo, blank=True, null=True) def __str__(self): return self.corporation_name \ No newline at end of file diff --git a/eveonline/views.py b/eveonline/views.py index 201ec6af..4a7b0410 100644 --- a/eveonline/views.py +++ b/eveonline/views.py @@ -17,6 +17,21 @@ from util.common_task import deactivate_services from util.common_task import generate_corp_group_name +def disable_alliance_member(user, char_id): + remove_member_permission(user, 'alliance_member') + remove_user_from_group(user, settings.DEFAULT_ALLIANCE_GROUP) + remove_user_from_group(user, + generate_corp_group_name( + EveManager.get_character_by_id(char_id).corporation_name)) + deactivate_services(user) + + +def disable_blue_member(user): + remove_member_permission(user, 'blue_member') + remove_user_from_group(user, settings.DEFAULT_BLUE_GROUP) + deactivate_services(user) + + @login_required def add_api_key(request): if request.method == 'POST': @@ -57,7 +72,10 @@ def api_key_removal(request, api_id): if character.character_id == authinfo.main_char_id: if character.api_id == api_id: # TODO: Remove servies also - AuthServicesInfoManager.update_main_char_Id("", request.user) + if authinfo.is_blue: + disable_blue_member(request.user) + else: + disable_alliance_member(request.user, authinfo.main_char_id) EveManager.delete_api_key_pair(api_id, request.user.id) EveManager.delete_characters_by_api_id(api_id, request.user.id) @@ -78,20 +96,26 @@ def main_character_change(request, char_id): previousmainid = AuthServicesInfoManager.get_auth_service_info(request.user).main_char_id AuthServicesInfoManager.update_main_char_Id(char_id, request.user) # Check if character is in the alliance + character_info = EveManager.get_character_by_id(char_id) + corporation_info = EveManager.get_corporation_info_by_id(character_info.corporation_id) + if EveManager.get_charater_alliance_id_by_id(char_id) == settings.ALLIANCE_ID: add_member_permission(request.user, 'alliance_member') add_user_to_group(request.user, settings.DEFAULT_ALLIANCE_GROUP) add_user_to_group(request.user, generate_corp_group_name(EveManager.get_character_by_id(char_id).corporation_name)) + + elif corporation_info.is_blue: + add_member_permission(request.user, 'blue_member') + add_user_to_group(request.user, settings.DEFAULT_BLUE_GROUP) + else: # TODO: disable serivces if check_if_user_has_permission(request.user, 'alliance_member'): - remove_member_permission(request.user, 'alliance_member') - remove_user_from_group(request.user, settings.DEFAULT_ALLIANCE_GROUP) - remove_user_from_group(request.user, - generate_corp_group_name( - EveManager.get_character_by_id(previousmainid).corporation_name)) - deactivate_services(request.user) + disable_alliance_member(request.user, previousmainid) + + if check_if_user_has_permission(request.user, 'blue_member'): + disable_blue_member(request.user) return HttpResponseRedirect("/characters") return HttpResponseRedirect("/characters") diff --git a/groupmanagement/__init__.py b/groupmanagement/__init__.py index 631dfacb..e69de29b 100644 --- a/groupmanagement/__init__.py +++ b/groupmanagement/__init__.py @@ -1,3 +0,0 @@ -from util import bootstrap_permissions - -bootstrap_permissions() \ No newline at end of file diff --git a/hrapplications/forms.py b/hrapplications/forms.py index fc54c7fa..15cac565 100644 --- a/hrapplications/forms.py +++ b/hrapplications/forms.py @@ -1,4 +1,5 @@ from django import forms +from django.conf import settings from eveonline.models import EveCorporationInfo @@ -6,7 +7,9 @@ from eveonline.models import EveCorporationInfo class HRApplicationForm(forms.Form): allchoices = [] for corp in EveCorporationInfo.objects.all(): - allchoices.append((str(corp.corporation_id), str(corp.corporation_name))) + if corp.alliance is not None: + if corp.alliance.alliance_id == settings.ALLIANCE_ID: + allchoices.append((str(corp.corporation_id), str(corp.corporation_name))) character_name = forms.CharField(max_length=254, required=True, label="Main Character Name") full_api_id = forms.CharField(max_length=254, required=True, label="API ID") diff --git a/services/managers/eve_api_manager.py b/services/managers/eve_api_manager.py index bfce3aa7..5a77aaec 100644 --- a/services/managers/eve_api_manager.py +++ b/services/managers/eve_api_manager.py @@ -2,6 +2,8 @@ import evelink.api import evelink.char import evelink.eve +from django.conf import settings + class EveApiManager(): def __init__(self): @@ -105,7 +107,7 @@ class EveApiManager(): try: api = evelink.api.API(api_key=(api_id, api_key)) account = evelink.account.Account(api=api) - info = account.status() + info = account.key_info() return True except evelink.api.APIError as error: return False @@ -122,4 +124,58 @@ class EveApiManager(): except evelink.api.APIError as error: return False + return False + + @staticmethod + def check_if_id_is_corp(corp_id): + try: + api = evelink.api.API() + corp = evelink.corp.Corp(api=api) + corpinfo = corp.corporation_sheet(corp_id=int(corp_id)) + results = corpinfo[0] + return True + except evelink.api.APIError as error: + return False + + return False + + @staticmethod + def get_alliance_standings(): + if settings.ALLIANCE_EXEC_CORP_ID != "": + try: + api = evelink.api.API(api_key=(settings.ALLIANCE_EXEC_CORP_ID, settings.ALLIANCE_EXEC_CORP_VCODE)) + corp = evelink.corp.Corp(api=api) + corpinfo = corp.contacts() + results = corpinfo[0] + return results + except evelink.api.APIError as error: + pass + + return {} + + @staticmethod + def check_if_id_is_alliance(alliance_id): + try: + api = evelink.api.API() + eve = evelink.eve.EVE(api=api) + alliance = eve.alliances() + results = alliance[0][int(alliance_id)] + if results: + return True + except evelink.api.APIError as error: + return False + + return False + + @staticmethod + def check_if_id_is_character(character_id): + try: + api = evelink.api.API() + eve = evelink.eve.EVE(api=api) + results = eve.character_info_from_id(character_id) + if results: + return True + except evelink.api.APIError as error: + return False + return False \ No newline at end of file diff --git a/services/managers/mumble_manager.py b/services/managers/mumble_manager.py index 3159bf55..2e88b766 100644 --- a/services/managers/mumble_manager.py +++ b/services/managers/mumble_manager.py @@ -56,6 +56,10 @@ class MumbleManager: def __generate_username(username, corp_ticker): return "[" + corp_ticker + "]" + username + @staticmethod + def __generate_username_blue(username, corp_ticker): + return "[BLUE][" + corp_ticker + "]" + username + @staticmethod def _gen_pwhash(password): return hashlib.sha1(password).hexdigest() @@ -133,6 +137,26 @@ class MumbleManager: return "", "" + @staticmethod + def create_blue_user(corp_ticker, username): + dbcursor = connections['mumble'].cursor() + username_clean = MumbleManager.__generate_username_blue(MumbleManager.__santatize_username(username), + corp_ticker) + password = MumbleManager.__generate_random_pass() + pwhash = MumbleManager._gen_pwhash(password) + + try: + dbcursor.execute(MumbleManager.SQL_SELECT_USER_MAX_ID) + user_id = dbcursor.fetchone()[0] + + dbcursor.execute(MumbleManager.SQL_CREATE_USER, + [settings.MUMBLE_SERVER_ID, user_id, username_clean, pwhash]) + + return username_clean, password + except: + + return "", "" + @staticmethod def check_user_exist(username): dbcursor = connections['mumble'].cursor() diff --git a/services/views.py b/services/views.py index d574ad97..a008eb5a 100644 --- a/services/views.py +++ b/services/views.py @@ -157,6 +157,20 @@ def activate_mumble(request): return HttpResponseRedirect("/dashboard") +@login_required +@permission_required('auth.blue_member') +def activate_blue_mumble(request): + authinfo = AuthServicesInfoManager.get_auth_service_info(request.user) + character = EveManager.get_character_by_id(authinfo.main_char_id) + result = MumbleManager.create_blue_user(character.corporation_ticker, character.character_name) + # if its empty we failed + if result[0] is not "": + AuthServicesInfoManager.update_user_mumble_info(result[0], result[1], request.user) + update_mumble_groups(request.user) + return HttpResponseRedirect("/services/") + return HttpResponseRedirect("/dashboard") + + @login_required @permission_required('auth.alliance_member') def deactivate_mumble(request): @@ -169,6 +183,18 @@ def deactivate_mumble(request): return HttpResponseRedirect("/") +@login_required +@permission_required('auth.blue_member') +def deactivate_blue_mumble(request): + authinfo = AuthServicesInfoManager.get_auth_service_info(request.user) + result = MumbleManager.delete_user(authinfo.mumble_username) + # if false we failed + if result: + AuthServicesInfoManager.update_user_mumble_info("", "", request.user) + return HttpResponseRedirect("/services/") + return HttpResponseRedirect("/") + + @login_required @permission_required('auth.alliance_member') def reset_mumble_password(request): @@ -178,4 +204,16 @@ def reset_mumble_password(request): if result != "": AuthServicesInfoManager.update_user_mumble_info(authinfo.mumble_username, result, request.user) return HttpResponseRedirect("/services/") - return HttpResponseRedirect("/") \ No newline at end of file + return HttpResponseRedirect("/") + + +@login_required +@permission_required('auth.blue_member') +def reset_mumble_password(request): + authinfo = AuthServicesInfoManager.get_auth_service_info(request.user) + result = MumbleManager.update_user_password(authinfo.mumble_username) + # if blank we failed + if result != "": + AuthServicesInfoManager.update_user_mumble_info(authinfo.mumble_username, result, request.user) + return HttpResponseRedirect("/services/") + return HttpResponseRedirect("/") diff --git a/templates/registered/addapikey.html b/templates/registered/addapikey.html index c5af7158..8661466d 100644 --- a/templates/registered/addapikey.html +++ b/templates/registered/addapikey.html @@ -17,10 +17,28 @@

Full API Key is required for auth services

- Create - a full API key + +

+ Create + a full API key

+ +

+ NOTE: If you are part of the alliance do not check "Blue" this is for people who are blue to the + alliance + but are not in it. Blue access is limited. +

+ +

Do not change the accessmask or deselect options or it will not work +

+ +

+ Create + a blue key +

+
{% csrf_token %} {{ form|bootstrap }} diff --git a/templates/registered/services.html b/templates/registered/services.html index 2c1f045f..e0d2fcff 100644 --- a/templates/registered/services.html +++ b/templates/registered/services.html @@ -9,7 +9,40 @@ {% block content %}

Available Services

- {% if perms.auth.alliance_member %} + {% if perms.auth.blue_member %} + + + + + + + + + + + + + + + +
ServiceUsernamePasswordDomainAction
Mumble{{ authinfo.mumble_username }}{{ authinfo.mumble_password }}{{ MUMBLE_URL }} + {% ifequal authinfo.mumble_username "" %} + + + + {% else %} + + + + + + + {% endifequal %} +
+ {% elif perms.auth.alliance_member %} diff --git a/util/__init__.py b/util/__init__.py index 5e001527..8d5057d9 100644 --- a/util/__init__.py +++ b/util/__init__.py @@ -1,35 +1,40 @@ from django.contrib.contenttypes.models import ContentType from django.contrib.auth.models import User +from django.contrib.auth.models import Group from django.contrib.auth.models import Permission +from django.conf import settings def bootstrap_permissions(): ct = ContentType.objects.get_for_model(User) + Permission.objects.get_or_create(codename="alliance_member", content_type=ct, name="alliance_member") Permission.objects.get_or_create(codename="group_management", content_type=ct, name="group_management") Permission.objects.get_or_create(codename="jabber_broadcast", content_type=ct, name="jabber_broadcast") Permission.objects.get_or_create(codename="human_resources", content_type=ct, name="human_resources") + Permission.objects.get_or_create(codename="blue_member", content_type=ct, name="blue_member") + Group.objects.get_or_create(name=settings.DEFAULT_ALLIANCE_GROUP) + Group.objects.get_or_create(name=settings.DEFAULT_BLUE_GROUP) def add_member_permission(user, permission): ct = ContentType.objects.get_for_model(User) stored_permission, created = Permission.objects.get_or_create(codename=permission, content_type=ct, name=permission) - - if User.objects.filter(username=user.username).exists(): - user = User.objects.get(username=user.username) - user.user_permissions.add(stored_permission) - user.save() + user = User.objects.get(username=user.username) + user.user_permissions.add(stored_permission) + user.save() def remove_member_permission(user, permission): ct = ContentType.objects.get_for_model(User) stored_permission, created = Permission.objects.get_or_create(codename=permission, content_type=ct, name=permission) - if User.objects.filter(username=user.username).exists(): - user = User.objects.get(username=user.username) - if user.has_perm(permission): - user.user_permissions.remove(stored_permission) - user.save() + + user = User.objects.get(username=user.username) + + if user.has_perm('auth.' + permission): + user.user_permissions.remove(stored_permission) + user.save() def check_if_user_has_permission(user, permission):
Service