mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-08-20 05:13:21 -07:00
Log PlexPy logins to database
This commit is contained in:
parent
27716d080f
commit
8ed7688277
8 changed files with 1018 additions and 7 deletions
|
@ -473,6 +473,12 @@ def dbcheck():
|
|||
'deleted_section INTEGER DEFAULT 0, UNIQUE(server_id, section_id))'
|
||||
)
|
||||
|
||||
# user_login table :: This table keeps record of the PlexPy guest logins
|
||||
c_db.execute(
|
||||
'CREATE TABLE IF NOT EXISTS user_login (id INTEGER PRIMARY KEY AUTOINCREMENT, '
|
||||
'timestamp INTEGER, user_id INTEGER, user TEXT, user_group TEXT, ip_address TEXT, host TEXT, user_agent TEXT)'
|
||||
)
|
||||
|
||||
# Upgrade sessions table from earlier versions
|
||||
try:
|
||||
c_db.execute('SELECT started FROM sessions')
|
||||
|
|
|
@ -13,6 +13,9 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with PlexPy. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import httpagentparser
|
||||
import time
|
||||
|
||||
import plexpy
|
||||
import common
|
||||
import database
|
||||
|
@ -670,4 +673,88 @@ class Users(object):
|
|||
|
||||
filters_list[k] = filters
|
||||
|
||||
return filters_list
|
||||
return filters_list
|
||||
|
||||
def set_user_login(self, user_id=None, user=None, user_group=None, ip_address=None, host=None, user_agent=None):
|
||||
|
||||
if user_id is None or str(user_id).isdigit():
|
||||
monitor_db = database.MonitorDatabase()
|
||||
|
||||
keys = {'timestamp': int(time.time()),
|
||||
'user_id': user_id}
|
||||
|
||||
values = {'user': user,
|
||||
'user_group': user_group,
|
||||
'ip_address': ip_address,
|
||||
'host': host,
|
||||
'user_agent': user_agent}
|
||||
|
||||
try:
|
||||
monitor_db.upsert(table_name='user_login', key_dict=keys, value_dict=values)
|
||||
except Exception as e:
|
||||
logger.warn(u"PlexPy Users :: Unable to execute database query for set_login_log: %s." % e)
|
||||
|
||||
def get_datatables_user_login(self, user_id=None, kwargs=None):
|
||||
default_return = {'recordsFiltered': 0,
|
||||
'recordsTotal': 0,
|
||||
'draw': 0,
|
||||
'data': 'null',
|
||||
'error': 'Unable to execute database query.'}
|
||||
|
||||
if not session.allow_session_user(user_id):
|
||||
return default_return
|
||||
|
||||
data_tables = datatables.DataTables()
|
||||
|
||||
custom_where = [['user_id', user_id]]
|
||||
|
||||
columns = ['user_login.user_id',
|
||||
'user_login.user',
|
||||
'user_login.user_group',
|
||||
'user_login.ip_address',
|
||||
'user_login.host',
|
||||
'user_login.user_agent',
|
||||
'user_login.timestamp',
|
||||
'users.friendly_name'
|
||||
]
|
||||
|
||||
try:
|
||||
query = data_tables.ssp_query(table_name='user_login',
|
||||
columns=columns,
|
||||
custom_where=custom_where,
|
||||
group_by=[],
|
||||
join_types=['LEFT OUTER JOIN'],
|
||||
join_tables=['users'],
|
||||
join_evals=[['user_login.user_id', 'users.user_id']],
|
||||
kwargs=kwargs)
|
||||
except Exception as e:
|
||||
logger.warn(u"PlexPy Users :: Unable to execute database query for get_datatables_user_login: %s." % e)
|
||||
return default_return
|
||||
|
||||
results = query['result']
|
||||
|
||||
rows = []
|
||||
for item in results:
|
||||
(os, browser) = httpagentparser.simple_detect(item['user_agent'])
|
||||
|
||||
row = {'user_id': item['user_id'],
|
||||
'user': item['user'],
|
||||
'user_group': item['user_group'],
|
||||
'ip_address': item['ip_address'],
|
||||
'host': item['host'],
|
||||
'user_agent': item['user_agent'],
|
||||
'os': os,
|
||||
'browser': browser,
|
||||
'timestamp': item['timestamp'],
|
||||
'friendly_name': item['friendly_name']
|
||||
}
|
||||
|
||||
rows.append(row)
|
||||
|
||||
dict = {'recordsFiltered': query['filteredCount'],
|
||||
'recordsTotal': query['totalCount'],
|
||||
'data': session.friendly_name_to_username(rows),
|
||||
'draw': query['draw']
|
||||
}
|
||||
|
||||
return dict
|
|
@ -178,13 +178,26 @@ def all_of(*conditions):
|
|||
|
||||
class AuthController(object):
|
||||
|
||||
def on_login(self, username):
|
||||
def on_login(self, user_id, username, user_group):
|
||||
"""Called on successful login"""
|
||||
logger.debug(u"User '%s' logged into PlexPy." % username)
|
||||
|
||||
# Save login to the database
|
||||
ip_address = cherrypy.request.headers.get('X-Forwarded-For', cherrypy.request.headers.get('Remote-Addr'))
|
||||
host = cherrypy.request.headers.get('Origin')
|
||||
user_agent = cherrypy.request.headers.get('User-Agent')
|
||||
|
||||
Users().set_user_login(user_id=user_id,
|
||||
user=username,
|
||||
user_group=user_group,
|
||||
ip_address=ip_address,
|
||||
host=host,
|
||||
user_agent=user_agent)
|
||||
|
||||
logger.debug(u"%s user '%s' logged into PlexPy." % (user_group.capitalize(), username))
|
||||
|
||||
def on_logout(self, username):
|
||||
def on_logout(self, username, user_group):
|
||||
"""Called on logout"""
|
||||
logger.debug(u"User '%s' logged out of PlexPy." % username)
|
||||
logger.debug(u"%s User '%s' logged out of PlexPy." % (user_group.capitalize(), username))
|
||||
|
||||
def get_loginform(self, username="", msg=""):
|
||||
from plexpy.webserve import serve_template
|
||||
|
@ -224,7 +237,7 @@ class AuthController(object):
|
|||
'user_group': user_group,
|
||||
'expiry': expiry}
|
||||
|
||||
self.on_login(username)
|
||||
self.on_login(user_id, username, user_group)
|
||||
raise cherrypy.HTTPRedirect(plexpy.HTTP_ROOT)
|
||||
|
||||
elif admin_login == '1':
|
||||
|
@ -244,5 +257,5 @@ class AuthController(object):
|
|||
|
||||
if _session and _session['user']:
|
||||
cherrypy.request.login = None
|
||||
self.on_logout(_session['user'])
|
||||
self.on_logout(_session['user'], _session['user_group'])
|
||||
raise cherrypy.HTTPRedirect("login")
|
|
@ -1165,6 +1165,27 @@ class WebInterface(object):
|
|||
|
||||
return history
|
||||
|
||||
@cherrypy.expose
|
||||
@cherrypy.tools.json_out()
|
||||
@requireAuth()
|
||||
def get_user_logins(self, user_id=None, **kwargs):
|
||||
""" Get the data on PlexPy user login table. """
|
||||
# Check if datatables json_data was received.
|
||||
# If not, then build the minimal amount of json data for a query
|
||||
if not kwargs.get('json_data'):
|
||||
# TODO: Find some one way to automatically get the columns
|
||||
dt_columns = [("time", True, False),
|
||||
("ip_address", True, True),
|
||||
("host", True, True),
|
||||
("os", True, True),
|
||||
("browser", True, True)]
|
||||
kwargs['json_data'] = build_datatables_json(kwargs, dt_columns, "time")
|
||||
|
||||
user_data = users.Users()
|
||||
history = user_data.get_datatables_user_login(user_id=user_id, kwargs=kwargs)
|
||||
|
||||
return history
|
||||
|
||||
@cherrypy.expose
|
||||
@cherrypy.tools.json_out()
|
||||
@requireAuth(member_of("admin"))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue