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:
|
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
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue