Warn if token refresh fails

Signed-off-by: Jan Losinski <losinski@wh2.tu-dresden.de>
This commit is contained in:
Jan Losinski 2018-03-22 01:00:55 +01:00
parent 9f516f69ae
commit 8a9246114c
5 changed files with 39 additions and 7 deletions

View File

@ -1,11 +1,12 @@
class Config: 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): consume_interval=30, interface_host="127.0.0.1", interface_port=8080):
self.wallabag_host = wallabag_host self.wallabag_host = wallabag_host
self.db_uri = db_uri self.db_uri = db_uri
self.client_id = client_id self.client_id = client_id
self.client_secret = client_secret self.client_secret = client_secret
self.domain = domain
self.tag = tag self.tag = tag
self.refresh_grace = refresh_grace self.refresh_grace = refresh_grace
self.consume_interval = consume_interval self.consume_interval = consume_interval

View File

@ -35,7 +35,7 @@ class Consumer:
while self.running: while self.running:
with self.sessionmaker as session: with self.sessionmaker as session:
logger.info("Start consume run") 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) await asyncio.gather(*fetches)
session.commit() session.commit()

View File

@ -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 import create_engine
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy.orm import sessionmaker, relationship
@ -17,6 +17,7 @@ class User(Base):
last_check = Column(DateTime) last_check = Column(DateTime)
email = Column(String) email = Column(String)
kindle_mail = Column(String) kindle_mail = Column(String)
active = Column(Boolean, default=True)
jobs = relationship('Job', backref='user') jobs = relationship('Job', backref='user')

View File

@ -10,13 +10,15 @@ logger = Logger(__name__)
class Refresher: class Refresher:
def __init__(self, config, wallabag): def __init__(self, config, wallabag, sender):
self.sessionmaker = context_session(config) self.sessionmaker = context_session(config)
self.wallabag = wallabag self.wallabag = wallabag
self.grace = config.refresh_grace self.grace = config.refresh_grace
self.sender = sender
self.config = config
def _wait_time(self, session): 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: if next is None or next.min is None:
return 3 return 3
delta = next.min - datetime.utcnow() delta = next.min - datetime.utcnow()
@ -33,7 +35,7 @@ class Refresher:
ts = datetime.utcnow() + timedelta(seconds=self.grace) ts = datetime.utcnow() + timedelta(seconds=self.grace)
refreshes = [self._refresh_user(user) for user 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) await asyncio.gather(*refreshes)
session.commit() session.commit()
@ -41,4 +43,6 @@ class Refresher:
async def _refresh_user(self, user): async def _refresh_user(self, user):
logger.info("Refresh token for {}", user.name) 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

View File

@ -2,6 +2,7 @@ import smtplib
from email.encoders import encode_base64 from email.encoders import encode_base64
from email.mime.application import MIMEApplication from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formatdate from email.utils import formatdate
@ -37,3 +38,28 @@ class Sender:
async def send_mail(self, job, data): async def send_mail(self, job, data):
return self.loop.run_in_executor(None, self._send_mail, 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)