1
0
mirror of https://github.com/dkmstr/openuds.git synced 2025-03-11 00:58:39 +03:00

* Adding logs to users & authenticators

This commit is contained in:
Adolfo Gómez 2013-02-01 09:41:38 +00:00
parent a740207b8e
commit 0a6f18f1cc
7 changed files with 126 additions and 51 deletions

View File

@ -36,13 +36,17 @@ Provides useful functions for authenticating, used by web interface.
from functools import wraps
from django.http import HttpResponseRedirect
from uds.core.util.Config import GlobalConfig
from uds.core.util import log
from uds.core import auths
from uds.core.managers.CryptoManager import CryptoManager
from uds.core.util.State import State
from uds.models import User
import logging
logger = logging.getLogger(__name__)
authLogger = logging.getLogger('authLog')
USER_KEY = 'uk'
PASS_KEY = 'pk'
@ -221,3 +225,29 @@ def webLogout(request, exit_url = None):
# Try to delete session
return HttpResponseRedirect(request.build_absolute_uri(exit_url))
def authLogLogin(request, authenticator, userName, java, os, logStr = ''):
'''
Logs authentication
'''
if logStr == '':
logStr = 'Logged in'
javaStr = java and 'Java' or 'No Java'
authLogger.info('|'.join([authenticator.name, userName, javaStr, os['OS'], logStr, request.META['HTTP_USER_AGENT']]))
level = (logStr == 'Logged in') and log.INFO or log.ERROR
log.doLog(authenticator, level, 'user {0} has {1} from {2} {3} java and os is {4}'.format(userName, logStr,
request.ip, java and 'has' or 'has NOT', os['OS']), log.WEB)
try:
user = authenticator.users.get(name=userName)
log.doLog(user, level, '{0} from {1} {2} java and os is {3}'.format(logStr,
request.ip, java and 'has' or 'has NOT', os['OS']), log.WEB)
except:
pass
def authLogLogout(request):
log.doLog(request.user.manager, log.INFO, 'user {0} has logged out from {1}'.format(request.user.name, request.ip), log.WEB)
log.doLog(request.user, log.INFO, 'has logged out from {0}'.format(request.ip), log.WEB)

View File

@ -30,6 +30,7 @@
@author: Adolfo Gómez, dkmaster at dkmon dot com
'''
from uds.models import UserService
from uds.models import DeployedServicePublication
from uds.models import DeployedService
@ -39,9 +40,10 @@ from uds.models import User
from uds.models import Group
from uds.models import Authenticator
from uds.models import Log
from uds.core.util import log
from uds.core.util.Config import GlobalConfig
import logging
logger = logging.getLogger(__name__)
@ -50,16 +52,16 @@ OT_USERSERVICE, OT_PUBLICATION, OT_DEPLOYED_SERVICE, OT_SERVICE, OT_PROVIDER, OT
# Dict for translations
transDict = {
UserService : OT_USERSERVICE,
DeployedServicePublication : OT_PUBLICATION,
DeployedService : OT_DEPLOYED_SERVICE,
Service : OT_SERVICE,
Provider : OT_PROVIDER,
User : OT_USER,
Group : OT_GROUP,
Authenticator : OT_AUTHENTICATOR
}
UserService : OT_USERSERVICE,
DeployedServicePublication : OT_PUBLICATION,
DeployedService : OT_DEPLOYED_SERVICE,
Service : OT_SERVICE,
Provider : OT_PROVIDER,
User : OT_USER,
Group : OT_GROUP,
Authenticator : OT_AUTHENTICATOR
}
class LogManager(object):
'''
Manager for logging (at database) events
@ -80,6 +82,7 @@ class LogManager(object):
Logs a message associated to owner
'''
from uds.models import getSqlDatetime
from uds.models import Log
qs = Log.objects.filter(owner_id = owner_id, owner_type = owner_type)
# First, ensure we do not have more than requested logs, and we can put one more log item
@ -94,6 +97,8 @@ class LogManager(object):
'''
Get all logs associated with an user service, ordered by date
'''
from uds.models import Log
qs = Log.objects.filter(owner_id = owner_id, owner_type = owner_type)
return [{'date': x.created, 'level': x.level, 'source': x.source, 'message': x.data} for x in reversed(qs.order_by('-created')[:limit])]
@ -101,17 +106,18 @@ class LogManager(object):
'''
Clears all logs related to user service
'''
from uds.models import Log
Log.objects.filter(owner_id = owner_id, owner_type = owner_type).delete()
def doLog(self, wichObject, level, message, source = log.UNKNOWN):
def doLog(self, wichObject, level, message, source):
'''
Do the logging for the requested object.
If the object provided do not accepts associated loggin, it simply ignores the request
'''
if type(level) is not int:
level = log.logLevelFromStr(level)
@ -122,7 +128,7 @@ class LogManager(object):
logger.debug('Requested doLog for a type of object not covered: {0}'.format(wichObject))
def getLogs(self, wichObject, limit = GlobalConfig.MAX_LOGS_PER_ELEMENT.getInt()):
def getLogs(self, wichObject, limit):
'''
Get the logs associated with "wichObject", limiting to "limit" (default is GlobalConfig.MAX_LOGS_PER_ELEMENT)
'''

View File

@ -39,9 +39,9 @@ useLogger = logging.getLogger('useLog')
OTHER,DEBUG,INFO,WARN,ERROR,FATAL = (10000*(x+1) for x in xrange(6))
# Logging sources
INTERNAL,ACTOR,TRANSPORT, OSMANAGER, UNKNOWN, WEB = ('internal', 'actor', 'transport', 'osmanager', 'unknown', 'web')
INTERNAL, ACTOR, TRANSPORT, OSMANAGER, UNKNOWN, WEB = ('internal', 'actor', 'transport', 'osmanager', 'unknown', 'web')
OTHERSTR,DEBUGSTR,INFOSTR,WARNSTR,ERRORSTR,FATALSTR = ('OTHER', 'DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL')
OTHERSTR, DEBUGSTR, INFOSTR, WARNSTR, ERRORSTR, FATALSTR = ('OTHER', 'DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL')
# Names for defined log levels
__nameLevels = {
@ -68,4 +68,28 @@ def logStrFromLevel(level):
def useLog(type_, serviceUniqueId, serviceIp, username):
useLogger.info('|'.join([type_, serviceUniqueId, serviceIp, username]))
def doLog(wichObject, level, message, source = UNKNOWN):
from uds.core.managers import logManager
logManager().doLog(wichObject, level, message, source)
def getLogs(wichObject, limit = None):
'''
Get the logs associated with "wichObject", limiting to "limit" (default is GlobalConfig.MAX_LOGS_PER_ELEMENT)
'''
from uds.core.managers import logManager
from uds.core.util.Config import GlobalConfig
if limit is None:
limit = GlobalConfig.MAX_LOGS_PER_ELEMENT.getInt()
return logManager().getLogs(wichObject, limit)
def clearLogs(wichObject):
'''
Clears the logs associated with the object using the logManager
'''
from uds.core.managers import logManager
return logManager().clearLogs(wichObject)

View File

@ -40,7 +40,6 @@ from uds.core.util.State import State
from uds.core.util import log
from uds.core.services.Exceptions import InvalidServiceException
from datetime import datetime, timedelta
from uds.core.managers import logManager
import logging
@ -149,7 +148,7 @@ class Provider(models.Model):
s.env().clearRelatedData()
# Clears related logs
logManager().clearLogs(toDelete)
log.clearLogs(toDelete)
logger.debug('Before delete service provider '.format(toDelete))
@ -239,7 +238,7 @@ class Service(models.Model):
s.env().clearRelatedData()
# Clears related logs
logManager().clearLogs(toDelete)
log.clearLogs(toDelete)
logger.debug('Before delete service '.format(toDelete))
@ -624,7 +623,7 @@ class Authenticator(models.Model):
s.env().clearRelatedData()
# Clears related logs
logManager().clearLogs(toDelete)
log.clearLogs(toDelete)
logger.debug('Before delete auth '.format(toDelete))
@ -731,7 +730,7 @@ class User(models.Model):
toDelete.getManager().removeUser(toDelete.name)
# Remove related logs
logManager().clearLogs(toDelete)
log.clearLogs(toDelete)
# Removes all user services assigned to this user (unassign it and mark for removal)
for us in toDelete.userServices.all():
@ -788,7 +787,7 @@ class Group(models.Model):
toDelete.getManager().removeGroup(toDelete.name)
# Clears related logs
logManager().clearLogs(toDelete)
log.clearLogs(toDelete)
logger.debug('Deleted group {0}'.format(toDelete))
@ -1029,7 +1028,7 @@ class DeployedService(models.Model):
toDelete.getEnvironment().clearRelatedData()
# Clears related logs
logManager().clearLogs(toDelete)
log.clearLogs(toDelete)
logger.debug('Deleting Deployed Service {0}'.format(toDelete))
@ -1166,7 +1165,7 @@ class DeployedServicePublication(models.Model):
# It's handled as "publish", and as so, it can be a multi-step process
# Clears related logs
logManager().clearLogs(toDelete)
log.clearLogs(toDelete)
logger.debug('Deleted publication {0}'.format(toDelete))
@ -1521,7 +1520,7 @@ class UserService(models.Model):
toDelete.getEnvironment().clearRelatedData()
# Clear related logs to this user service
logManager().clearLogs(toDelete)
log.clearLogs(toDelete)
# TODO: Check if this invokation goes here
#toDelete.getInstance()

View File

@ -88,13 +88,12 @@ class WindowsOsManager(osmanagers.OSManager):
def doLog(self, service, data, origin = log.OSMANAGER):
# Stores a log associated with this service
from uds.core.managers import logManager
try:
msg, level = data.split('\t')
logManager().doLog(service, level, msg, origin)
log.doLog(service, level, msg, origin)
except:
logManager().doLog(service, log.ERROR, "do not understand {0}".format(data), origin)
log.doLog(service, log.ERROR, "do not understand {0}".format(data), origin)
def process(self,service,msg, data):

View File

@ -37,7 +37,7 @@ from django.shortcuts import render_to_response
from django.template import RequestContext
from django.utils.translation import ugettext as _
from django.core.urlresolvers import reverse
from uds.core.auths.auth import getIp, webLogin, webLogout, webLoginRequired, authenticate, webPassword, authenticateViaCallback
from uds.core.auths.auth import getIp, webLogin, webLogout, webLoginRequired, authenticate, webPassword, authenticateViaCallback, authLogLogin, authLogLogout
from uds.models import Authenticator, DeployedService, Transport, UserService, Network
from uds.web.forms.LoginForm import LoginForm
from uds.core.managers.UserServiceManager import UserServiceManager
@ -46,24 +46,22 @@ from uds.core.managers.DownloadsManager import DownloadsManager
from uds.core.util.Config import GlobalConfig
from uds.core.util.Cache import Cache
from uds.core.util import OsDetector
from uds.core.util import log
from transformers import transformId, scrambleId
import errors
import logging
import random
import string
logger = logging.getLogger(__name__)
authLogger = logging.getLogger('__authLog')
def __authLog(request, authenticator, userName, java, os, log):
'''
Logs authentication
'''
javaStr = java and 'Java' or 'No Java'
authLogger.info('|'.join([authenticator.name, userName, javaStr, os['OS'], log, request.META['HTTP_USER_AGENT']]))
def login(request):
#request.session.set_expiry(GlobalConfig.USER_SESSION_LENGTH.getInt())
#request.session.set_expiry(GlobalConfig.USER_SESSION_LENGTH.getInt())
getIp(request)
if request.method == 'POST':
if request.COOKIES.has_key('uds') is False:
return errors.errorView(request, errors.COOKIES_NEEDED) # We need cookies to keep session data
@ -81,7 +79,7 @@ def login(request):
tries = 0
if tries >= GlobalConfig.MAX_LOGIN_TRIES.getInt():
form.add_form_error('Too many authentication errors. User temporarily blocked.')
__authLog(request, authenticator, userName, java, os, 'Temporarily blocked')
authLogLogin(request, authenticator, userName, java, os, 'Temporarily blocked')
else:
user = authenticate(userName, form.cleaned_data['password'], authenticator )
@ -90,7 +88,7 @@ def login(request):
tries += 1
cache.put(cacheKey, tries, GlobalConfig.LOGIN_BLOCK.getInt())
form.add_form_error('Invalid credentials')
__authLog(request, authenticator, userName, java, os, 'Invalid credentials')
authLogLogin(request, authenticator, userName, java, os, 'Invalid credentials')
else:
cache.remove(cacheKey) # Valid login, remove cached tries
response = HttpResponseRedirect(reverse('uds.web.views.index'))
@ -99,7 +97,7 @@ def login(request):
request.session['java'] = java
request.session['OS'] = os
logger.debug('Navigator supports java? {0}'.format(java))
__authLog(request, authenticator, user.name, java, os, 'Logged in')
authLogLogin(request, authenticator, user.name, java, os)
return response
else:
form = LoginForm()
@ -125,6 +123,7 @@ def customAuth(request, idAuth):
@webLoginRequired
def logout(request):
authLogLogout(request)
return webLogout(request, request.user.logout())
@webLoginRequired
@ -265,11 +264,8 @@ def sernotify(request, idUserService, notification):
message = request.GET.get('message', None)
level = request.GET.get('level', None)
if message is not None and level is not None:
from uds.core.util import log
from uds.core.managers import logManager
us = UserService.objects.get(pk=idUserService)
logManager().doLog(us, level, message, log.TRANSPORT)
log.doLog(us, level, message, log.TRANSPORT)
else:
return HttpResponse('Invalid request!', 'text/plain')
except Exception as e:
@ -313,7 +309,7 @@ def authCallback(request, authName):
os = OsDetector.getOsFromUA(request.META['HTTP_USER_AGENT'])
if user is None:
__authLog(request, authenticator, '{0}'.format(params), False, os, 'Invalid at auth callback')
authLogLogin(request, authenticator, '{0}'.format(params), False, os, 'Invalid at auth callback')
raise auths.Exceptions.InvalidUserException()
# Redirect to main page through java detection process, so UDS know the availability of java
@ -371,7 +367,7 @@ def authJava(request, idAuth, hasJava):
try:
authenticator = Authenticator.objects.get(pk=idAuth)
os = request.session['OS']
__authLog(request, authenticator, request.user.name, request.session['java'], os, 'Logged in')
authLogLogin(request, authenticator, request.user.name, request.session['java'], os)
return HttpResponseRedirect(reverse('uds.web.views.index'))
except Exception as e:

View File

@ -34,8 +34,11 @@
from django.utils.translation import ugettext as _
from ..auths.AdminAuth import needs_credentials
from ..util.Exceptions import FindException
from uds.core.managers import logManager
from uds.core.util import log
from uds.models import UserService
from uds.models import User
from uds.models import Authenticator
import logging
@ -43,13 +46,31 @@ logger = logging.getLogger(__name__)
@needs_credentials
def getUserServiceLogs(credentials, id):
logger.debug('getUserServiceLogs called')
try:
us = UserService.objects.get(pk=id)
return logManager().getLogs(us)
except Exception:
return log.getLogs(us)
except:
raise FindException(_('Service does not exists'))
@needs_credentials
def getUserLogs(credentials, id):
try:
user = User.objects.get(pk=id)
return log.getLogs(user)
except:
raise FindException('User does not exists')
@needs_credentials
def getAuthLogs(credentials, id):
try:
auth = Authenticator.objects.get(pk=id)
return log.getLogs(auth)
except:
raise FindException('Authenticator does not exists')
# Registers XML RPC Methods
def registerLogFunctions(dispatcher):
dispatcher.register_function(getUserServiceLogs, 'getUserServiceLogs')
dispatcher.register_function(getUserLogs, 'getUserLogs')
dispatcher.register_function(getAuthLogs, 'getAuthLogs')