Warn if token refresh fails
Signed-off-by: Jan Losinski <losinski@wh2.tu-dresden.de>
This commit is contained in:
parent
9f516f69ae
commit
8a9246114c
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue