@@ -407,17 +407,20 @@ class Journalist(db.Model):
407407 last_name = Column (String (255 ), nullable = True )
408408 pw_salt = Column (LargeBinary (32 ), nullable = True ) # type: Column[Optional[bytes]]
409409 pw_hash = Column (LargeBinary (256 ), nullable = True ) # type: Column[Optional[bytes]]
410- is_admin = Column (Boolean )
410+ is_admin = Column (Boolean ) # type: Column[Optional[bool]]
411411 session_nonce = Column (Integer , nullable = False , default = 0 )
412412
413413 otp_secret = Column (String (16 ), default = pyotp .random_base32 )
414- is_totp = Column (Boolean , default = True )
415- hotp_counter = Column (Integer , default = 0 )
414+ is_totp = Column (Boolean , default = True ) # type: Column[Optional[bool]]
415+ hotp_counter = Column (Integer , default = 0 ) # type: Column[Optional[int]]
416416 last_token = Column (String (6 ))
417417
418- created_on = Column (DateTime , default = datetime .datetime .utcnow )
419- last_access = Column (DateTime )
420- passphrase_hash = Column (String (256 ))
418+ created_on = Column (
419+ DateTime ,
420+ default = datetime .datetime .utcnow
421+ ) # type: Column[Optional[datetime.datetime]]
422+ last_access = Column (DateTime ) # type: Column[Optional[datetime.datetime]]
423+ passphrase_hash = Column (String (256 )) # type: Column[Optional[str]]
421424 login_attempts = relationship (
422425 "JournalistLoginAttempt" ,
423426 backref = "journalist"
@@ -634,6 +637,8 @@ def verify_token(self, token: 'Optional[str]') -> bool:
634637 # window is 1:30s.
635638 return self .totp .verify (token , valid_window = 1 )
636639 else :
640+ if not self .hotp_counter :
641+ self .hotp_counter = 0
637642 for counter_val in range (
638643 self .hotp_counter ,
639644 self .hotp_counter + 20 ):
@@ -739,9 +744,9 @@ def to_json(self, all_info: bool = True) -> Dict[str, Any]:
739744
740745 if all_info is True :
741746 json_user ['is_admin' ] = self .is_admin
742- try :
747+ if self . last_access :
743748 json_user ['last_login' ] = self .last_access .isoformat () + 'Z'
744- except AttributeError :
749+ else :
745750 json_user ['last_login' ] = None
746751
747752 return json_user
@@ -796,7 +801,10 @@ class JournalistLoginAttempt(db.Model):
796801 passwords or two-factor tokens."""
797802 __tablename__ = "journalist_login_attempt"
798803 id = Column (Integer , primary_key = True )
799- timestamp = Column (DateTime , default = datetime .datetime .utcnow )
804+ timestamp = Column (
805+ DateTime ,
806+ default = datetime .datetime .utcnow
807+ ) # type: Column[Optional[datetime.datetime]]
800808 journalist_id = Column (Integer , ForeignKey ('journalists.id' ))
801809
802810 def __init__ (self , journalist : Journalist ) -> None :
0 commit comments