/******************************************************************************* * Copyright (c) 2015 Red Hat. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat - Initial Contribution *******************************************************************************/ package org.eclipse.linuxtools.internal.docker.core; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.eclipse.core.runtime.IPath; import org.eclipse.equinox.security.storage.ISecurePreferences; import org.eclipse.equinox.security.storage.SecurePreferencesFactory; import org.eclipse.equinox.security.storage.StorageException; import org.eclipse.linuxtools.docker.core.Activator; import org.eclipse.linuxtools.docker.core.IDockerConnection; import org.eclipse.linuxtools.docker.core.IDockerConnectionStorageManager; import org.eclipse.linuxtools.docker.core.Messages; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** * Default implementation of the {@link IDockerConnectionStorageManager}. */ public class DefaultDockerConnectionStorageManager implements IDockerConnectionStorageManager { public final static String CONNECTIONS_FILE_NAME = "dockerconnections.xml"; //$NON-NLS-1$ @Override public List<IDockerConnection> loadConnections() { final List<IDockerConnection> connections = new ArrayList<>(); final IPath stateLocation = Activator.getDefault().getStateLocation(); final File connectionFile = stateLocation.append(CONNECTIONS_FILE_NAME) .toFile(); final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); if (connectionFile.exists()) { Document d = db.parse(connectionFile); Element e = d.getDocumentElement(); // Get the stored configuration data NodeList connectionNodes = e.getElementsByTagName("connection"); // $NON-NLS-1$ for (int x = 0; x < connectionNodes.getLength(); ++x) { Node n = connectionNodes.item(x); NamedNodeMap attrs = n.getAttributes(); Node nameNode = attrs.getNamedItem("name"); //$NON-NLS-1$ Node uriNode = attrs.getNamedItem("uri"); //$NON-NLS-1$ Node usernameNode = attrs.getNamedItem("username"); //$NON-NLS-1$ Node certNode = attrs.getNamedItem("cert"); //$NON-NLS-1$ if (uriNode != null) { String uri = uriNode.getNodeValue(); String name = nameNode.getNodeValue(); if (usernameNode != null) { String username = usernameNode.getNodeValue(); String key = DockerConnection.getPreferencesKey(uri, username); ISecurePreferences root = SecurePreferencesFactory .getDefault(); ISecurePreferences node = root.node(key); @SuppressWarnings("unused") String password; try { password = node.get("password", null); //$NON-NLS-1$ } catch (StorageException e1) { e1.printStackTrace(); } } final DockerConnection.Builder builder = new DockerConnection.Builder() .name(name); if (uri.startsWith("unix:")) { //$NON-NLS-1$ final DockerConnection connection = builder .unixSocketConnection( new UnixSocketConnectionSettings(uri)); connections.add(connection); } else { final String pathToCertificates = certNode != null ? certNode.getNodeValue() : null; final DockerConnection connection = builder .tcpConnection(new TCPConnectionSettings( uri, pathToCertificates)); connections.add(connection); } } } } } catch (ParserConfigurationException | SAXException | IOException e) { Activator.log(e); } return connections; } @Override public void saveConnections(List<IDockerConnection> connections) { final IPath stateLocation = Activator.getDefault().getStateLocation(); final File connectionFile = stateLocation.append(CONNECTIONS_FILE_NAME) .toFile(); try { if (!connectionFile.exists()) { connectionFile.createNewFile(); } try (final PrintWriter p = new PrintWriter( new BufferedWriter(new FileWriter(connectionFile)))) { p.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); //$NON-NLS-1$ p.println("<connections>"); // $NON-NLS-1$ for (IDockerConnection d : connections) { String name = d.getName(); if (name.equals(Messages.Unnamed)) { name = ""; } p.print("<connection name=\"" + name + //$NON-NLS-1$ "\" uri=\"" + d.getUri()); //$NON-NLS-1$ if (d.getUsername() != null) { p.print("\" username=\"" + d.getUsername()); //$NON-NLS-1$ } if (d.getTcpCertPath() != null) { p.print("\" cert=\"" + d.getTcpCertPath()); //$NON-NLS-1$ } p.println("\"/>"); //$NON-NLS-1$ } p.println("</connections>"); //$NON-NLS-1$ } } catch (Exception e) { Activator.log(e); } } }