mirror of
https://github.com/hrfee/jellyfin-accounts.git
synced 2024-11-15 02:40:10 +00:00
Harvey Tindall
17aca69583
Originally i switched this to 'created' because of a Windows issue someone was having, but I believe it was something else i'd done that fixed it. Using 'created' also meant multiple password resets for a user wouldn't be registered, as jellyfin would just overwrite the existing file. Hopefully this doesn't break anything.
66 lines
2.3 KiB
Python
Executable File
66 lines
2.3 KiB
Python
Executable File
import time
|
|
import json
|
|
import platform
|
|
from watchdog.observers import Observer
|
|
from watchdog.events import FileSystemEventHandler
|
|
from jellyfin_accounts.email import Mailgun, Smtp
|
|
from jellyfin_accounts.web_api import jf
|
|
from __main__ import config
|
|
from __main__ import email_log as log
|
|
|
|
|
|
class Watcher:
|
|
def __init__(self, dir):
|
|
self.observer = Observer()
|
|
self.dir = str(dir)
|
|
|
|
def run(self):
|
|
event_handler = Handler()
|
|
self.observer.schedule(event_handler, self.dir, recursive=True)
|
|
try:
|
|
self.observer.start()
|
|
except NotADirectoryError:
|
|
log.error(f'Directory {self.dir} does not exist')
|
|
try:
|
|
while True:
|
|
time.sleep(5)
|
|
except:
|
|
self.observer.stop()
|
|
log.info('Watchdog stopped')
|
|
|
|
|
|
class Handler(FileSystemEventHandler):
|
|
@staticmethod
|
|
def on_any_event(event):
|
|
if event.is_directory:
|
|
return None
|
|
elif (event.event_type == 'modified' and
|
|
'passwordreset' in event.src_path):
|
|
log.debug(f'Password reset file: {event.src_path}')
|
|
time.sleep(1)
|
|
with open(event.src_path, 'r') as f:
|
|
reset = json.load(f)
|
|
log.info(f'New password reset for {reset["UserName"]}')
|
|
try:
|
|
with open(config['files']['emails'], 'r') as f:
|
|
emails = json.load(f)
|
|
id = jf.getUsers(reset['UserName'], public=False)['Id']
|
|
address = emails[id]
|
|
method = config['email']['method']
|
|
if method == 'mailgun':
|
|
email = Mailgun(address)
|
|
elif method == 'smtp':
|
|
email = Smtp(address)
|
|
if email.construct_reset(reset):
|
|
email.send()
|
|
except (FileNotFoundError,
|
|
json.decoder.JSONDecodeError,
|
|
IndexError) as e:
|
|
err = f'{address}: Failed: ' + type(e).__name__
|
|
log.error(err)
|
|
|
|
def start():
|
|
log.info(f'Monitoring {config["password_resets"]["watch_directory"]}')
|
|
w = Watcher(config['password_resets']['watch_directory'])
|
|
w.run()
|