1
0
mirror of https://gitlab.com/fdroid/fdroidserver.git synced 2024-10-05 18:50:09 +02:00

update: use KnownApks dates to check system clock on offline machines

KnownApks provides a reliable source of a relatively recent date.
This commit is contained in:
Hans-Christoph Steiner 2017-11-29 11:21:34 +01:00
parent 1219f07d3b
commit d46d9574b4
2 changed files with 21 additions and 14 deletions

View File

@ -40,7 +40,7 @@ import json
import xml.etree.ElementTree as XMLElementTree import xml.etree.ElementTree as XMLElementTree
from binascii import hexlify from binascii import hexlify
from datetime import datetime from datetime import datetime, timedelta
from distutils.version import LooseVersion from distutils.version import LooseVersion
from queue import Queue from queue import Queue
from zipfile import ZipFile from zipfile import ZipFile
@ -1716,6 +1716,23 @@ def natural_key(s):
return [int(sp) if sp.isdigit() else sp for sp in re.split(r'(\d+)', s)] return [int(sp) if sp.isdigit() else sp for sp in re.split(r'(\d+)', s)]
def check_system_clock(dt_obj, path):
"""Check if system clock is updated based on provided date
If an APK has files newer than the system time, suggest updating
the system clock. This is useful for offline systems, used for
signing, which do not have another source of clock sync info. It
has to be more than 24 hours newer because ZIP/APK files do not
store timezone info
"""
checkdt = dt_obj - timedelta(1)
if datetime.today() < checkdt:
logging.warning(_('System clock is older than date in {path}!').format(path=path)
+ '\n' + _('Set clock to that time using:') + '\n'
+ 'sudo date -s "' + str(dt_obj) + '"')
class KnownApks: class KnownApks:
"""permanent store of existing APKs with the date they were added """permanent store of existing APKs with the date they were added
@ -1744,6 +1761,7 @@ class KnownApks:
date = datetime.strptime(t[-1], '%Y-%m-%d') date = datetime.strptime(t[-1], '%Y-%m-%d')
filename = line[0:line.rfind(appid) - 1] filename = line[0:line.rfind(appid) - 1]
self.apks[filename] = (appid, date) self.apks[filename] = (appid, date)
check_system_clock(date, self.path)
self.changed = False self.changed = False
def writeifchanged(self): def writeifchanged(self):

View File

@ -29,7 +29,7 @@ import zipfile
import hashlib import hashlib
import pickle import pickle
import time import time
from datetime import datetime, timedelta from datetime import datetime
from argparse import ArgumentParser from argparse import ArgumentParser
import collections import collections
@ -1297,22 +1297,11 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal
apkzip = zipfile.ZipFile(apkfile, 'r') apkzip = zipfile.ZipFile(apkfile, 'r')
# if an APK has files newer than the system time, suggest updating
# the system clock. This is useful for offline systems, used for
# signing, which do not have another source of clock sync info. It
# has to be more than 24 hours newer because ZIP/APK files do not
# store timezone info
manifest = apkzip.getinfo('AndroidManifest.xml') manifest = apkzip.getinfo('AndroidManifest.xml')
if manifest.date_time[1] == 0: # month can't be zero if manifest.date_time[1] == 0: # month can't be zero
logging.debug(_('AndroidManifest.xml has no date')) logging.debug(_('AndroidManifest.xml has no date'))
else: else:
dt_obj = datetime(*manifest.date_time) common.check_system_clock(datetime(*manifest.date_time), apkfilename)
checkdt = dt_obj - timedelta(1)
if datetime.today() < checkdt:
logging.warning('System clock is older than manifest in: '
+ apkfilename
+ '\nSet clock to that time using:\n'
+ 'sudo date -s "' + str(dt_obj) + '"')
# extract icons from APK zip file # extract icons from APK zip file
iconfilename = "%s.%s.png" % (apk['packageName'], apk['versionCode']) iconfilename = "%s.%s.png" % (apk['packageName'], apk['versionCode'])