tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

metadata.py (2673B)


      1 # This Source Code Form is subject to the terms of the Mozilla Public
      2 # License, v. 2.0. If a copy of the MPL was not distributed with this
      3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
      4 """Manages a metadata file."""
      5 
      6 import datetime
      7 import json
      8 import os
      9 from collections.abc import MutableMapping
     10 
     11 from condprof.util import logger
     12 
     13 METADATA_NAME = "condprofile.json"
     14 
     15 
     16 class Metadata(MutableMapping):
     17    """dict-like class that holds metadata for a profile."""
     18 
     19    def __init__(self, profile_dir):
     20        self.metadata_file = os.path.join(profile_dir, METADATA_NAME)
     21        logger.info("Reading existing metadata at %s" % self.metadata_file)
     22        if not os.path.exists(self.metadata_file):
     23            logger.info("Could not find the metadata file in that profile")
     24            self._data = {}
     25        else:
     26            with open(self.metadata_file) as f:
     27                self._data = json.loads(f.read())
     28 
     29    def __getitem__(self, key):
     30        return self._data[self.__keytransform__(key)]
     31 
     32    def __setitem__(self, key, value):
     33        self._data[self.__keytransform__(key)] = value
     34 
     35    def __delitem__(self, key):
     36        del self._data[self.__keytransform__(key)]
     37 
     38    def __iter__(self):
     39        return iter(self._data)
     40 
     41    def __len__(self):
     42        return len(self._data)
     43 
     44    def __keytransform__(self, key):
     45        return key
     46 
     47    def _days2age(self, days):
     48        if days < 7:
     49            return "days"
     50        if days < 30:
     51            return "weeks"
     52        if days < 30 * 6:
     53            return "months"
     54        return "old"  # :)
     55 
     56    def _delta(self, created, updated):
     57        created = created[:26]
     58        updated = updated[:26]
     59        # tz..
     60        format = "%Y-%m-%d %H:%M:%S.%f"
     61        created = datetime.datetime.strptime(created, format)
     62        updated = datetime.datetime.strptime(updated, format)
     63        delta = created - updated
     64        return delta.days
     65 
     66    def write(self, **extras):
     67        # writing metadata
     68        logger.info("Creating metadata...")
     69        self._data.update(**extras)
     70        ts = str(datetime.datetime.now())
     71        if "created" not in self._data:
     72            self._data["created"] = ts
     73        self._data["updated"] = ts
     74        # XXX need android arch version here
     75        days = self._delta(self._data["created"], self._data["updated"])
     76        self._data["days"] = days
     77        self._data["age"] = self._days2age(days)
     78        # adding info about the firefox version
     79        # XXX build ID ??
     80        # XXX android ??
     81        logger.info("Saving metadata file in %s" % self.metadata_file)
     82        with open(self.metadata_file, "w") as f:
     83            f.write(json.dumps(self._data))