@Override public String getValue() { return base64RandomUuid(); }
@NotNull static String ensureElementContent(String elementPath, Element parentElement, @NotNull String value) { Element result = getElement(elementPath, parentElement, false); if (result == null) { result = createHierarchically(elementPath, parentElement); result.setTextContent(value); } return result.getTextContent(); }
public DomGroupWrapper(Element element, DomDatabaseWrapper database, boolean newGroup) { this.database = database; this.element = element; if (newGroup) { ensureElements(this.element, mandatoryGroupElements); } }
private void ensureProperty(String name){ Element property = DomHelper.getElement(String.format(DomHelper.PROPERTY_ELEMENT_FORMAT, name), element, false); if (property == null) { Element container = DomHelper.newElement("String", element); DomHelper.setElementContent("Key", container, name); DomHelper.getElement("Value", container, true); } }
@Override public byte[] getBinaryProperty(String name) { Element property = DomHelper.getElement(String.format(DomHelper.BINARY_PROPERTY_ELEMENT_FORMAT, name), element, false); if (property == null) { return null; } return DomHelper.getBinaryElementContent(DomHelper.VALUE_ELEMENT_NAME, property); }
@Override public String getProperty(String name) { Element property = DomHelper.getElement(String.format(DomHelper.PROPERTY_ELEMENT_FORMAT, name), element, false); if (property == null) { return null; } return DomHelper.getElementContent(DomHelper.VALUE_ELEMENT_NAME, property); }
@Override public void setBinaryProperty(String name, byte[] value) { Element property = DomHelper.getElement(String.format(DomHelper.BINARY_PROPERTY_ELEMENT_FORMAT, name), element, false); if (property == null) { property = DomHelper.newElement("Binary", element); DomHelper.setElementContent("Key", property, name); } DomHelper.setBinaryElementContent(DomHelper.VALUE_ELEMENT_NAME, property, value); DomHelper.touchElement(DomHelper.LAST_MODIFICATION_TIME_ELEMENT_NAME, element); database.setDirty(true); }
@Override public String getDescription() { return DomHelper.getElementContent("DatabaseDescription", dbMeta); }
@Override public DomGroupWrapper getRecycleBin() { String UUIDcontent = getElementContent(RECYCLE_BIN_UUID_ELEMENT_NAME, dbMeta); if (UUIDcontent != null){ final UUID uuid = Helpers.uuidFromBase64(UUIDcontent); if (uuid.getLeastSignificantBits() != 0 && uuid.getMostSignificantBits() != 0) { for (DomGroupWrapper g: getRootGroup().getGroups()) { if (g.getUuid().equals(uuid)) { return g; } } // the recycle bin seems to have been lost, better create another one } // uuid was 0 i.e. there isn't one } // no recycle bin group set up if (!isRecycleBinEnabled()) { return null; } DomGroupWrapper g = newGroup(); g.setName("Recycle Bin"); getRootGroup().addGroup(g); ensureElementContent(RECYCLE_BIN_UUID_ELEMENT_NAME, dbMeta, base64FromUuid(g.getUuid())); touchElement(RECYCLE_BIN_CHANGED_ELEMENT_NAME, dbMeta); return g; }
@Override public List<String> getBinaryPropertyNames() { ArrayList<String> result = new ArrayList<>(); List<Element> list = DomHelper.getElements("Binary", element); for (Element listElement: list) { result.add(DomHelper.getElementContent("Key", listElement)); } return result; }
public boolean shouldProtect(String name) { Element protectionElement = DomHelper.getElement("MemoryProtection/Protect" + name, dbMeta, false); if (protectionElement == null) { return false; } return Boolean.valueOf(protectionElement.getTextContent()); }
@Override public SerializableDatabase load(InputStream inputStream) throws IOException { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); doc = dBuilder.parse(inputStream); // we need to decrypt all protected fields // TODO we assume they are all strings, which is wrong NodeList protectedContent = (NodeList) DomHelper.xpath.evaluate("//*[@Protected='True']", doc, XPathConstants.NODESET); for (int i = 0; i < protectedContent.getLength(); i++){ Element element = ((Element) protectedContent.item(i)); String base64 = DomHelper.getElementContent(".", element); // Android compatibility byte[] encrypted = Base64.decodeBase64(base64.getBytes()); String decrypted = new String(encryption.decrypt(encrypted), "UTF-8"); DomHelper.setElementContent(".", element, decrypted); element.removeAttribute("Protected"); } return this; } catch (ParserConfigurationException e) { throw new IllegalStateException("Instantiating Document Builder", e); } catch (SAXException e) { throw new IllegalStateException("Parsing exception", e); } catch (XPathExpressionException e) { throw new IllegalStateException("XPath Exception", e); } }
@Override public void setIcon(DomIconWrapper icon) { DomHelper.getElement(DomHelper.ICON_ELEMENT_NAME, element, true).setTextContent(String.valueOf(icon.getIndex())); DomHelper.touchElement(DomHelper.LAST_MODIFICATION_TIME_ELEMENT_NAME, element); database.setDirty(true); }
@Override public int getGroupsCount() { List<Element> elements = getElements(GROUP_ELEMENT_NAME, this.element); return elements.size(); }
@Override public int getEntriesCount() { return getElementsCount(ENTRY_ELEMENT_NAME, this.element); }
static void ensureElements (Element element, Map<String, ValueCreator> childElements) { for (Map.Entry<String, ValueCreator> entry: childElements.entrySet()) { ensureElementContent(entry.getKey(), element, entry.getValue().getValue()); } }
@Nullable @Contract("_,_,true -> !null") static Element getElement(String elementPath, Element parentElement, boolean create) { try { Element result = (Element) xpath.evaluate(elementPath, parentElement, XPathConstants.NODE); if (result == null && create) { result = createHierarchically(elementPath, parentElement); } return result; } catch (XPathExpressionException e) { throw new IllegalStateException(e); } }
@Override public void setProperty(String name, String value) { Element property = DomHelper.getElement(String.format(DomHelper.PROPERTY_ELEMENT_FORMAT, name), element, false); if (property == null) { property = DomHelper.newElement("String", element); DomHelper.setElementContent("Key", property, name); } DomHelper.setElementContent(DomHelper.VALUE_ELEMENT_NAME, property, value); DomHelper.touchElement(DomHelper.LAST_MODIFICATION_TIME_ELEMENT_NAME, element); database.setDirty(true); }
@Override public String getName() { return getElementContent(NAME_ELEMENT_NAME, element); }
@Override public List<String> getPropertyNames() { ArrayList<String> result = new ArrayList<>(); List<Element> list = DomHelper.getElements("String", element); for (Element listElement: list) { result.add(DomHelper.getElementContent("Key", listElement)); } return result; }