import re from datetime import datetime from xml.dom import minidom from operator import itemgetter from django.contrib.auth import login, logout, authenticate from django.contrib.auth.models import User from django.http import HttpResponse from django.core.urlresolvers import reverse from django.shortcuts import get_object_or_404 from django.conf import settings from piston.handler import BaseHandler from piston.utils import rc, throttle from api.models import AuthAPIKey, AuthAPILog from eve_proxy.models import CachedDocument from eve_proxy.exceptions import * from eve_api.models import EVEAccount, EVEPlayerCharacter from sso.models import ServiceAccount, Service from hr.app_defines import * from hr.models import Blacklist class UserHandler(BaseHandler): allowed_methods = ('GET') def read(self, request): if 'userid' in request.GET: try: u = User.objects.get(id=request.GET['userid']) except (User.DoesNotExist, ValueError): return {'auth': 'missing', 'missing': 'userid'} elif 'user' in request.GET: try: u = User.objects.get(username=request.GET['user']) except User.DoesNotExist: return {'auth': 'missing', 'missing': 'username'} elif 'serviceuid' in request.GET: try: u = ServiceAccount.objects.get(service_uid=request.GET['serviceuid']).user except ServiceAccount.DoesNotExist: return {'auth': 'missing', 'missing': 'ServiceAccount'} elif 'apiuserid' in request.GET: try: u = EVEAccount.objects.get(api_user_id=request.GET['apiuserid']).user except EVEAccount.DoesNotExist: return {'auth': 'missing', 'missing': 'apiuserid'} chars = [] for a in u.eveaccount_set.all(): chars.extend(a.characters.all()) d = {'id': u.id, 'username': u.username, 'email': u.email, 'serviceaccounts': u.serviceaccount_set.all(), 'characters': chars, 'groups': u.groups.all(), 'staff': u.is_staff, 'superuser': u.is_superuser, 'redditaccounts': u.redditaccount_set.filter(validated=True) } return d class LoginHandler(BaseHandler): allowed_methods = ('GET') def read(self, request): u = None if request.GET.get('user', None): try: u = User.objects.get(username=request.GET['user']) except User.DoesNotExist: return {'auth': 'missing', 'missing': 'Username'} if u: if request.GET.get('pass', None) and u.is_active and request.GET['pass'] == u.get_profile().api_service_password: pchar = u.get_profile().primary_character if pchar: pchardict = {'id': pchar.id, 'name': pchar.name} else: pchardict = None return {'auth': 'ok', 'id': u.id, 'username': u.username, 'email': u.email, 'groups': u.groups.all().values('id', 'name'), 'staff': u.is_staff, 'superuser': u.is_superuser, 'primarycharacter': pchardict} else: return {'auth': 'failed'} return {'auth': 'missing', 'missing': 'all'} class EveAPIHandler(BaseHandler): allowed_methods = ('GET') exclude = ('api_key') def read(self, request): s = None if request.GET.get('id', None): s = get_object_or_404(EVEAccount, pk=id) elif request.GET.get('userid', None): s = EVEAccount.objects.filter(user=request.GET['userid']) elif request.GET.get('corpid', None): s = EVEAccount.objects.filter(characters__corporation__id=request.GET['corpid']) elif request.GET.get('allianceid', None): s = EVEAccount.objects.filter(characters__corporation__alliance__id=request.GET['allianceid']) if s: return {'keys': s.values('api_user_id', 'user_id', 'api_status', 'api_last_updated')} return {'keys': []} class EveAPIProxyHandler(BaseHandler): allowed_methods = ('GET') def read(self, request): url_path = request.META['PATH_INFO'].replace(reverse('api-eveapiproxy'), "/") params = {} for key, value in request.GET.items(): params[key.lower()] = value if 'userid' in params: obj = get_object_or_404(EVEAccount, pk=params['userid']) params['apikey'] = obj.api_key try: cached_doc = CachedDocument.objects.api_query(url_path, params, service=request.api_key.name) except DocumentRetrievalError, exc: return HttpResponse(exc, status=500) else: return HttpResponse(cached_doc.body) class OpTimerHandler(BaseHandler): allowed_methods = ('GET') def read(self, request, id=None): obj = get_object_or_404(EVEAccount, pk=settings.FULL_API_USER_ID) if gargoyle.is_active('eve-cak'): params = {'keyid': obj.pk, 'vcode': obj.api_key, 'characterID': settings.FULL_API_CHARACTER_ID} else: params = {'userID': obj.pk, 'apiKey': obj.api_key, 'characterID': settings.FULL_API_CHARACTER_ID} error_doc = {'ops': [{'startsIn': -1, 'eventID': 0, 'ownerName': '', 'eventDate': '', 'eventTitle': '