Generate and use TZ-aware datetime objects

pgpy has been using TZ-naive datetime objects, despite all OpenPGP
wire-format dates being essentially UTC.

Better to represent the datetime objects explicitly as UTC.

Closes: #401
This commit is contained in:
Daniel Kahn Gillmor
2022-04-29 15:46:31 -04:00
parent 473d3651e2
commit c880d72902
5 changed files with 21 additions and 20 deletions

View File

@@ -8,7 +8,7 @@ import hashlib
import os
import re
from datetime import datetime
from datetime import datetime, timezone
import six
@@ -767,7 +767,7 @@ class PubKeyV4(PubKey):
@created.register(int)
def created_int(self, val):
self.created = datetime.utcfromtimestamp(val)
self.created = datetime.fromtimestamp(val, timezone.utc)
@created.register(bytes)
@created.register(bytearray)
@@ -846,7 +846,7 @@ class PubKeyV4(PubKey):
def __init__(self):
super(PubKeyV4, self).__init__()
self.created = datetime.utcnow()
self.created = datetime.now(timezone.utc)
self.pkalg = 0
self.keymaterial = None
@@ -1187,7 +1187,7 @@ class LiteralData(Packet):
@mtime.register(int)
def mtime_int(self, val):
self.mtime = datetime.utcfromtimestamp(val)
self.mtime = datetime.fromtimestamp(val, timezone.utc)
@mtime.register(bytes)
@mtime.register(bytearray)
@@ -1208,7 +1208,7 @@ class LiteralData(Packet):
super(LiteralData, self).__init__()
self.format = 'b'
self.filename = ''
self.mtime = datetime.utcnow()
self.mtime = datetime.now(timezone.utc)
self._contents = bytearray()
def __bytearray__(self):

View File

@@ -7,6 +7,7 @@ import calendar
from datetime import datetime
from datetime import timedelta
from datetime import timezone
import six
@@ -233,7 +234,7 @@ class CreationTime(Signature):
@created.register(int)
def created_int(self, val):
self.created = datetime.utcfromtimestamp(val)
self.created = datetime.fromtimestamp(val, timezone.utc)
@created.register(bytearray)
def created_bytearray(self, val):
@@ -241,7 +242,7 @@ class CreationTime(Signature):
def __init__(self):
super(CreationTime, self).__init__()
self.created = datetime.utcnow()
self.created = datetime.now(timezone.utc)
def __bytearray__(self):
_bytes = super(CreationTime, self).__bytearray__()

View File

@@ -20,7 +20,7 @@ import weakref
import six
from datetime import datetime
from datetime import datetime, timezone
from cryptography.hazmat.primitives import hashes
@@ -179,7 +179,7 @@ class PGPSignature(Armorable, ParentRef, PGPObject):
"""
expires_at = self.expires_at
if expires_at is not None and expires_at != self.created:
return expires_at < datetime.utcnow()
return expires_at < datetime.now(timezone.utc)
return False
@@ -321,7 +321,7 @@ class PGPSignature(Armorable, ParentRef, PGPObject):
sig = PGPSignature()
if created is None:
created=datetime.utcnow()
created=datetime.now(timezone.utc)
sigpkt = SignatureV4()
sigpkt.header.tag = 2
sigpkt.header.version = 4
@@ -717,7 +717,7 @@ class PGPUID(ParentRef):
return
mostrecent = None
attestations = []
now = datetime.utcnow()
now = datetime.now(timezone.utc)
fpr = self.parent.fingerprint
keyid = self.parent.fingerprint.keyid
for sig in self._signatures:
@@ -1119,7 +1119,7 @@ class PGPMessage(Armorable, PGPObject):
charset = kwargs.pop('encoding', None)
filename = ''
mtime = datetime.utcnow()
mtime = datetime.now(timezeone.utc)
msg = PGPMessage()
@@ -1133,7 +1133,7 @@ class PGPMessage(Armorable, PGPObject):
if file and os.path.isfile(message):
filename = message
message = bytearray(os.path.getsize(filename))
mtime = datetime.utcfromtimestamp(os.path.getmtime(filename))
mtime = datetime.fromtimestamp(os.path.getmtime(filename), timezone.utc)
with open(filename, 'rb') as mf:
mf.readinto(message)
@@ -1415,7 +1415,7 @@ class PGPKey(Armorable, ParentRef, PGPObject):
"""``True`` if this key is expired, otherwise ``False``"""
expires = self.expires_at
if expires is not None:
return expires <= datetime.utcnow()
return expires <= datetime.now(timezone.utc)
return False

View File

@@ -4,7 +4,7 @@ import pytest
import glob
import os
from datetime import datetime
from datetime import datetime, timezone
from pgpy.constants import HashAlgorithm
from pgpy.constants import PubKeyAlgorithm
@@ -187,7 +187,7 @@ block_attrs = {
b'\x55\x5d'),
('cipherprefs', []),
('compprefs', []),
('created', datetime.utcfromtimestamp(1402615373)),
('created', datetime.fromtimestamp(1402615373, timezone.utc)),
('embedded', False),
('exportable', True),
('features', set()),

View File

@@ -14,7 +14,7 @@ import itertools
import os
import time
import warnings
from datetime import datetime, timedelta
from datetime import datetime, timedelta, timezone
from pgpy import PGPKey
from pgpy import PGPMessage
@@ -325,7 +325,7 @@ class TestPGPKey_Management(object):
key = self.keys[pkspec]
uid = PGPUID.new('T. Keyerson', 'Secondary UID', 'testkey@localhost.local')
expiration = datetime.utcnow() + timedelta(days=2)
expiration = datetime.now(timezone.utc) + timedelta(days=2)
# add all of the sbpackets that only work on self-certifications
with warnings.catch_warnings():
@@ -697,7 +697,7 @@ class TestPGPKey_Actions(object):
# assert sig.sig.signer_uid == "{:s}".format(sec.userids[0])
assert next(iter(sig._signature.subpackets['SignersUserID'])).userid == "{:s}".format(targette_sec.userids[0])
# if not sig.is_expired:
# time.sleep((sig.expires_at - datetime.utcnow()).total_seconds())
# time.sleep((sig.expires_at - datetime.now(timezone.utc)).total_seconds())
assert sig.is_expired is False
self.sigs['string'] = sig
@@ -738,7 +738,7 @@ class TestPGPKey_Actions(object):
def test_sign_ctmessage(self, targette_sec, targette_pub, ctmessage):
# test signing a cleartext message
expire_at = datetime.utcnow() + timedelta(days=1)
expire_at = datetime.now(timezone.utc) + timedelta(days=1)
sig = targette_sec.sign(ctmessage, expires=expire_at)