PSKManagement.py
changeset 2339 48b4eba13064
child 2340 decf52efb7f7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PSKManagement.py	Tue Nov 20 11:32:42 2018 +0100
@@ -0,0 +1,81 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+import os
+import time
+import json
+
+COL_ID,COL_URI,COL_DESC,COL_LAST = range(4)
+
+def _pskpath(project_path):
+    return os.path.join(project_path, 'psk')
+
+def _mgtpath(project_path):
+    return os.path.join(_pskpath(project_path), 'management.json')
+
+def _default():
+    return ['', # default description
+            None, # last known URI
+            None]  # last connection date
+
+def _LoadData(project_path):
+    if os.path.isdir(_pskpath(project_path)):
+        _path = _mgtpath(project_path)
+        # load known keys metadata
+        # {ID:(Desc, LastKnownURI, LastConnect)}
+        return json.loads(open(_path).read()) \
+               if os.path.exists(_path) else {}
+    return {}
+
+def GetData(project_path):
+    # [(ID, Desc, LastKnownURI, LastConnect)
+    data = []
+    loaded_data = _LoadData(project_path)
+    # go through all secret files available an build data
+    # out of data recoverd from json and list of secret.
+    # this implicitly filters IDs out of metadata who's
+    # secret is missing
+    psk_files = os.listdir(_pskpath(project_path))
+    for filename in psk_files:
+       if filename.endswith('.secret'):
+           ID = filename[:-7]  # strip filename extension
+           meta = loaded_data.get(ID,_default())                  
+           data.append([ID]+meta)
+    return data
+
+
+def DeleteID(project_path, ID):
+    secret_path = os.path.join(_pskpath(project_path), ID+'.secret')
+    os.remove(secret_path)
+
+def _StoreData(project_path, data):
+    pskpath = _pskpath(project_path)
+    if not os.path.isdir(pskpath):
+        os.mkdir(pskpath)
+    with open(_mgtpath(project_path), 'w') as f:
+        f.write(json.dumps(data))
+
+def SaveData(project_path, data):
+    to_store = {row[0]:row[1:] for row in data}
+    _StoreData(project_path, to_store)
+
+def UpdateID(project_path, ID, secret, URI):
+    pskpath = _pskpath(project_path)
+    if not os.path.exists(pskpath):
+        os.mkdir(pskpath)
+
+    secpath = os.path.join(pskpath, ID+'.secret')
+    with open(secpath, 'w') as f:
+        f.write(ID+":"+secret)
+
+    data = _LoadData(project_path)
+    dataForID = [ID] + (data.get(ID, _default()) if data else _default())
+    dataForID[COL_URI] = URI
+    # FIXME : could store time instead os a string and use DVC model's cmp 
+    # then date display could be smarter, etc - sortable sting hack for now
+    dataForID[COL_LAST] = time.strftime('%y/%M/%d-%H:%M:%S')
+    data[ID] = dataForID[1:]
+    _StoreData(project_path, data)