From 8a9246114c979cf8f417c7538d54612790815dfd Mon Sep 17 00:00:00 2001 From: Jan Losinski Date: Thu, 22 Mar 2018 01:00:55 +0100 Subject: [PATCH] Warn if token refresh fails Signed-off-by: Jan Losinski --- wallabag_kindle_consumer/config.py | 3 ++- wallabag_kindle_consumer/consumer.py | 2 +- wallabag_kindle_consumer/models.py | 3 ++- wallabag_kindle_consumer/refresher.py | 12 ++++++++---- wallabag_kindle_consumer/sender.py | 26 ++++++++++++++++++++++++++ 5 files changed, 39 insertions(+), 7 deletions(-) diff --git a/wallabag_kindle_consumer/config.py b/wallabag_kindle_consumer/config.py index bd78064..9857290 100644 --- a/wallabag_kindle_consumer/config.py +++ b/wallabag_kindle_consumer/config.py @@ -1,11 +1,12 @@ class Config: - def __init__(self, wallabag_host, db_uri, client_id, client_secret, tag='kindle', refresh_grace=120, + def __init__(self, wallabag_host, db_uri, client_id, client_secret, domain, tag='kindle', refresh_grace=120, consume_interval=30, interface_host="127.0.0.1", interface_port=8080): self.wallabag_host = wallabag_host self.db_uri = db_uri self.client_id = client_id self.client_secret = client_secret + self.domain = domain self.tag = tag self.refresh_grace = refresh_grace self.consume_interval = consume_interval diff --git a/wallabag_kindle_consumer/consumer.py b/wallabag_kindle_consumer/consumer.py index b105aea..2e7c5d7 100644 --- a/wallabag_kindle_consumer/consumer.py +++ b/wallabag_kindle_consumer/consumer.py @@ -35,7 +35,7 @@ class Consumer: while self.running: with self.sessionmaker as session: logger.info("Start consume run") - fetches = [self.fetch_jobs(user) for user in session.query(User).all()] + fetches = [self.fetch_jobs(user) for user in session.query(User).filter(User.active == True).all()] await asyncio.gather(*fetches) session.commit() diff --git a/wallabag_kindle_consumer/models.py b/wallabag_kindle_consumer/models.py index eb7889f..4e31b22 100644 --- a/wallabag_kindle_consumer/models.py +++ b/wallabag_kindle_consumer/models.py @@ -1,4 +1,4 @@ -from sqlalchemy import Integer, String, DateTime, Column, ForeignKey, Enum +from sqlalchemy import Integer, String, DateTime, Column, ForeignKey, Enum, Boolean from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, relationship @@ -17,6 +17,7 @@ class User(Base): last_check = Column(DateTime) email = Column(String) kindle_mail = Column(String) + active = Column(Boolean, default=True) jobs = relationship('Job', backref='user') diff --git a/wallabag_kindle_consumer/refresher.py b/wallabag_kindle_consumer/refresher.py index 811c7db..3185c3c 100644 --- a/wallabag_kindle_consumer/refresher.py +++ b/wallabag_kindle_consumer/refresher.py @@ -10,13 +10,15 @@ logger = Logger(__name__) class Refresher: - def __init__(self, config, wallabag): + def __init__(self, config, wallabag, sender): self.sessionmaker = context_session(config) self.wallabag = wallabag self.grace = config.refresh_grace + self.sender = sender + self.config = config def _wait_time(self, session): - next = session.query(func.min(User.token_valid).label("min")).first() + next = session.query(func.min(User.token_valid).label("min")).filter(User.active == True).first() if next is None or next.min is None: return 3 delta = next.min - datetime.utcnow() @@ -33,7 +35,7 @@ class Refresher: ts = datetime.utcnow() + timedelta(seconds=self.grace) refreshes = [self._refresh_user(user) for user - in session.query(User).filter(User.token_valid < ts).all()] + in session.query(User).filter(User.active == True).filter(User.token_valid < ts).all()] await asyncio.gather(*refreshes) session.commit() @@ -41,4 +43,6 @@ class Refresher: async def _refresh_user(self, user): logger.info("Refresh token for {}", user.name) - await self.wallabag.refresh_token(user) + if not await self.wallabag.refresh_token(user): + await self.sender.send_warning(user, self.config) + user.active = False diff --git a/wallabag_kindle_consumer/sender.py b/wallabag_kindle_consumer/sender.py index 2167457..5f348db 100644 --- a/wallabag_kindle_consumer/sender.py +++ b/wallabag_kindle_consumer/sender.py @@ -2,6 +2,7 @@ import smtplib from email.encoders import encode_base64 from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText from email.utils import formatdate @@ -37,3 +38,28 @@ class Sender: async def send_mail(self, job, data): return self.loop.run_in_executor(None, self._send_mail, job, data) + + def _send_warning(self, user, config): + msg = MIMEMultipart() + msg['Subject'] = "Wallabag-Kindle-Consumer Notice" + msg['From'] = self.from_addr + msg['To'] = user.email + msg['Date'] = formatdate(localtime=True) + + txt = MIMEText(("the Wallabag-Kindle-Consumer for your Wallabag " + "account on {wallabag} was not able to refresh " + "the access token. Please go to {url}/update and log " + "in again to retrieve a new api token.").format(wallabag=config.wallabag_host, + url=config.domain)) + + msg.attach(txt) + + smtp = smtplib.SMTP(host=self.host, port=self.port) + smtp.starttls() + if self.user is not None: + smtp.login(self.user, self.passwd) + smtp.sendmail(self.from_addr, user.email, msg.as_string()) + smtp.quit() + + async def send_warning(self, user, config): + return self.loop.run_in_executor(None, self._send_warning, user, config)