1pif-to-kdbx/onepif/OnepifEntryProperty.py

97 lines
3.5 KiB
Python

import sys
from datetime import datetime
class OnepifEntryProperty():
def __init__(self, name, raw_value):
self.name = name # internal name
self.title = name # user visible name
self.raw = raw_value
self.set_value(raw_value)
self.section = None
self.type = ""
self.web_field_name = None # designation
self.is_web_field = False # has web_field_name
self.is_protected = False
def __repr__(self):
return "<OnepifEntryProperty \"{}\" ({}) = {}>".format(self.name, self.title, repr(self.raw))
def set_value(self, new_value):
if new_value == "\x10":
self.value = ""
else:
self.value = str(new_value)
@classmethod
def from_sectionfield(cls, field_dict: dict, sect_title: str = None):
key = field_dict["t"]
if not key:
key = field_dict["n"]
p = cls(key, field_dict)
if sect_title:
p.section = sect_title
p.title = "{}: {}".format(sect_title, field_dict["t"].title())
p.name = "{}_{}".format(sect_title.lower(), field_dict["t"].lower())
kind = field_dict["k"]
if kind in ["string", "email", "phone", "URL", "menu", "cctype"]:
p.set_value(field_dict["v"])
elif kind == "concealed":
p.set_value(field_dict["v"])
p.is_protected = True
elif kind == "date":
p.set_value(datetime.fromtimestamp(field_dict["v"]).strftime("%Y-%m-%d"))
elif kind == "monthYear":
month = field_dict["v"] % 100
month_name = datetime.strptime(str(month), "%m").strftime("%b")
year = field_dict["v"] // 100
p.set_value("{} {}".format(month_name, year))
elif kind == "address":
addr = field_dict["v"]
result = ""
if addr["street"]:
result += addr["street"] + "\n"
if addr["city"]:
result += addr["city"] + "\n"
if addr["zip"]:
result += addr["zip"] + "\n"
if addr["state"]:
result += addr["state"] + "\n"
if addr["region"]:
result += addr["region"] + "\n"
if addr["country"]:
result += addr["country"].upper()
p.set_value(result.strip())
elif kind == "reference":
print("WARNING: Links between items are not supported (-> {}).".format(field_dict["t"]), file=sys.stderr)
p.set_value(field_dict["t"])
else:
raise Exception("Unknown data kind in section fields: {}".format(kind))
return p
@classmethod
def from_webfield(cls, field_dict: dict):
if field_dict["type"] in ["C", "R"]:
# Skip unsupported fields
print("WARNING: Ignoring checkbox/radiobuttons value in entry.".format(), file=sys.stderr)
return None
if "value" not in field_dict or not field_dict["value"]:
# Skip fields without data
return None
if "designation" in field_dict and field_dict["designation"]:
key = field_dict["designation"]
else:
key = field_dict["name"]
p = cls(key, field_dict)
p.is_web_field = True
if "id" in field_dict:
p.web_field_name = field_dict["id"]
p.set_value(field_dict["value"])
if field_dict["type"] not in ["T", "P", "E"]:
raise Exception("Unknown field type discovered: {}".format(field_dict["type"]))
return p