mirror of
https://github.com/hrfee/jellyfin-accounts.git
synced 2025-12-22 10:11:13 +00:00
Add pw reset support; add logging
This commit is contained in:
@@ -3,7 +3,9 @@ from jellyfin_accounts.jf_api import Jellyfin
|
||||
import json
|
||||
import datetime
|
||||
import secrets
|
||||
import time
|
||||
from __main__ import config, app, g
|
||||
from __main__ import web_log as log
|
||||
from jellyfin_accounts.login import auth
|
||||
|
||||
def resp(success=True, code=500):
|
||||
@@ -28,6 +30,8 @@ def checkInvite(code, delete=False):
|
||||
expiry = datetime.datetime.strptime(i['valid_till'],
|
||||
'%Y-%m-%dT%H:%M:%S.%f')
|
||||
if current_time >= expiry:
|
||||
log.debug(('Housekeeping: Deleting old invite ' +
|
||||
invites['invites'][index]['code']))
|
||||
del invites['invites'][index]
|
||||
else:
|
||||
if i['code'] == code:
|
||||
@@ -45,13 +49,26 @@ jf = Jellyfin(config['jellyfin']['server'],
|
||||
config['jellyfin']['device'],
|
||||
config['jellyfin']['device_id'])
|
||||
|
||||
jf.authenticate(config['jellyfin']['username'],
|
||||
config['jellyfin']['password'])
|
||||
attempts = 0
|
||||
while attempts != 3:
|
||||
try:
|
||||
jf.authenticate(config['jellyfin']['username'],
|
||||
config['jellyfin']['password'])
|
||||
log.info(('Successfully authenticated with ' +
|
||||
config['jellyfin']['server']))
|
||||
break
|
||||
except jellyfin_accounts.jf_api.AuthenticationError:
|
||||
attempts += 1
|
||||
log.error(('Failed to authenticate with ' +
|
||||
config['jellyfin']['server'] +
|
||||
'. Retrying...'))
|
||||
time.sleep(5)
|
||||
|
||||
|
||||
@app.route('/newUser', methods=['GET', 'POST'])
|
||||
def newUser():
|
||||
data = request.get_json()
|
||||
log.debug('Attempted newUser')
|
||||
if checkInvite(data['code'], delete=True):
|
||||
user = jf.newUser(data['username'], data['password'])
|
||||
if user.status_code == 200:
|
||||
@@ -60,8 +77,9 @@ def newUser():
|
||||
default_policy = json.load(f)
|
||||
jf.setPolicy(user.json()['Id'], default_policy)
|
||||
except:
|
||||
log.debug('setPolicy failed')
|
||||
pass
|
||||
if config['ui']['emails_enabled'] == 'true':
|
||||
if config.getboolean('email', 'enabled'):
|
||||
try:
|
||||
with open(config['files']['emails'], 'r') as f:
|
||||
emails = json.load(f)
|
||||
@@ -70,10 +88,14 @@ def newUser():
|
||||
emails[data['username']] = data['email']
|
||||
with open(config['files']['emails'], 'w') as f:
|
||||
f.write(json.dumps(emails, indent=4))
|
||||
log.debug('Email address stored')
|
||||
log.info('New User created.')
|
||||
return resp()
|
||||
else:
|
||||
log.error(f'New user creation failed: {user.status_code}')
|
||||
return resp(False)
|
||||
else:
|
||||
log.debug('Attempted newUser unauthorized')
|
||||
return resp(False, code=401)
|
||||
|
||||
|
||||
@@ -85,6 +107,7 @@ def generateInvite():
|
||||
delta = datetime.timedelta(hours=int(data['hours']),
|
||||
minutes=int(data['minutes']))
|
||||
invite = {'code': secrets.token_urlsafe(16)}
|
||||
log.debug(f'Creating new invite: {invite["code"]}')
|
||||
invite['valid_till'] = (current_time +
|
||||
delta).strftime('%Y-%m-%dT%H:%M:%S.%f')
|
||||
try:
|
||||
@@ -95,12 +118,14 @@ def generateInvite():
|
||||
invites['invites'].append(invite)
|
||||
with open(config['files']['invites'], 'w') as f:
|
||||
f.write(json.dumps(invites, indent=4, default=str))
|
||||
log.info(f'New invite created: {invite["code"]}')
|
||||
return resp()
|
||||
|
||||
|
||||
@app.route('/getInvites', methods=['GET'])
|
||||
@auth.login_required
|
||||
def getInvites():
|
||||
log.debug('Invites requested')
|
||||
current_time = datetime.datetime.now()
|
||||
try:
|
||||
with open(config['files']['invites'], 'r') as f:
|
||||
@@ -109,8 +134,10 @@ def getInvites():
|
||||
invites = {'invites': []}
|
||||
response = {'invites': []}
|
||||
for index, i in enumerate(invites['invites']):
|
||||
expiry = datetime.datetime.strptime(i['valid_till'], '%Y-%m-%dT%H:%M:%S.%f')
|
||||
expiry = datetime.datetime.strptime(i['valid_till'], '%Y-%m-%dT%H:%M:%S.%f')
|
||||
if current_time >= expiry:
|
||||
log.debug(('Housekeeping: Deleting old invite ' +
|
||||
invites['invites'][index]['code']))
|
||||
del invites['invites'][index]
|
||||
else:
|
||||
valid_for = expiry - current_time
|
||||
@@ -137,6 +164,7 @@ def deleteInvite():
|
||||
del invites['invites'][index]
|
||||
with open(config['files']['invites'], 'w') as f:
|
||||
f.write(json.dumps(invites, indent=4, default=str))
|
||||
log.info(f'Invite deleted: {code}')
|
||||
return resp()
|
||||
|
||||
|
||||
@@ -144,6 +172,7 @@ def deleteInvite():
|
||||
@auth.login_required
|
||||
def get_token():
|
||||
token = g.user.generate_token()
|
||||
log.debug('Token generated')
|
||||
return jsonify({'token': token.decode('ascii')})
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user