Author: orudyy
Date: Wed Dec 12 17:41:39 2012
New Revision: 1420870

URL: http://svn.apache.org/viewvc?rev=1420870&view=rev
Log:
QPID-4390: Changes related to KeyStore and TrusStore configured objects:  hide 
password attribute add description attribute, update tests, update model 
relationships

Modified:
    
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/KeyStore.java
    
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java
    
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/TrustStore.java
    
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractKeyStoreAdapter.java
    
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/KeyStoreAdapter.java
    
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/TrustStoreAdapter.java
    
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/AmqpPortAdapter.java
    
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/KeyStoreRecovererTest.java
    
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/TrustStoreRecovererTest.java

Modified: 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/KeyStore.java
URL: 
http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/KeyStore.java?rev=1420870&r1=1420869&r2=1420870&view=diff
==============================================================================
--- 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/KeyStore.java
 (original)
+++ 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/KeyStore.java
 Wed Dec 12 17:41:39 2012
@@ -40,6 +40,7 @@ public interface KeyStore extends TrustS
                               TIME_TO_LIVE,
                               CREATED,
                               UPDATED,
+                              DESCRIPTION,
                               PATH,
                               PASSWORD,
                               TYPE,

Modified: 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java
URL: 
http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java?rev=1420870&r1=1420869&r2=1420870&view=diff
==============================================================================
--- 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java
 (original)
+++ 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java
 Wed Dec 12 17:41:39 2012
@@ -48,6 +48,8 @@ public class Model
         addRelationship(Broker.class, Port.class);
         addRelationship(Broker.class, AuthenticationProvider.class);
         addRelationship(Broker.class, GroupProvider.class);
+        addRelationship(Broker.class, TrustStore.class);
+        addRelationship(Broker.class, KeyStore.class);
 
         addRelationship(VirtualHost.class, Exchange.class);
         addRelationship(VirtualHost.class, Queue.class);

Modified: 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/TrustStore.java
URL: 
http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/TrustStore.java?rev=1420870&r1=1420869&r2=1420870&view=diff
==============================================================================
--- 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/TrustStore.java
 (original)
+++ 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/TrustStore.java
 Wed Dec 12 17:41:39 2012
@@ -34,6 +34,7 @@ public interface TrustStore extends Conf
     String TIME_TO_LIVE = "timeToLive";
     String CREATED = "created";
     String UPDATED = "updated";
+    String DESCRIPTION = "description";
 
     String PATH = "path";
     String PASSWORD = "password";
@@ -51,9 +52,14 @@ public interface TrustStore extends Conf
                               TIME_TO_LIVE,
                               CREATED,
                               UPDATED,
+                              DESCRIPTION,
                               PATH,
                               PASSWORD,
                               TYPE,
                               KEY_MANAGER_FACTORY_ALGORITHM
                               ));
+
+    public String getPassword();
+
+    public void setPassword(String password);
 }

Modified: 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractKeyStoreAdapter.java
URL: 
http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractKeyStoreAdapter.java?rev=1420870&r1=1420869&r2=1420870&view=diff
==============================================================================
--- 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractKeyStoreAdapter.java
 (original)
+++ 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractKeyStoreAdapter.java
 Wed Dec 12 17:41:39 2012
@@ -34,25 +34,24 @@ import org.apache.qpid.server.model.KeyS
 import org.apache.qpid.server.model.LifetimePolicy;
 import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.Statistics;
+import org.apache.qpid.server.model.TrustStore;
 import org.apache.qpid.server.util.MapValueConverter;
 
 public abstract class AbstractKeyStoreAdapter extends AbstractAdapter
 {
-    protected final String _name;
-    protected final String _path;
-    protected final String _password;
-    protected final String _type;
-    protected final String _keyManagerFactoryAlgorithm;
+    private String _name;
+    private String _password;
 
-    protected AbstractKeyStoreAdapter(UUID id, Broker broker, Map<String, 
Object> attributes, String defaultName)
+    protected AbstractKeyStoreAdapter(UUID id, Broker broker, Map<String, 
Object> attributes)
     {
         super(id);
         addParent(Broker.class, broker);
-        _name = MapValueConverter.getStringAttribute(KeyStore.NAME, 
attributes, defaultName);
-        _path = MapValueConverter.getStringAttribute(KeyStore.PATH, 
attributes);
-        _password = MapValueConverter.getStringAttribute(KeyStore.PASSWORD, 
attributes);
-        _type =  MapValueConverter.getStringAttribute(KeyStore.TYPE, 
attributes, java.security.KeyStore.getDefaultType());
-        _keyManagerFactoryAlgorithm = 
MapValueConverter.getStringAttribute(KeyStore.KEY_MANAGER_FACTORY_ALGORITHM, 
attributes, KeyManagerFactory.getDefaultAlgorithm());
+        _name = MapValueConverter.getStringAttribute(TrustStore.NAME, 
attributes);
+        _password = MapValueConverter.getStringAttribute(TrustStore.PASSWORD, 
attributes);
+        setMandatoryAttribute(TrustStore.PATH, attributes);
+        setOptionalAttribute(TrustStore.TYPE, attributes, 
java.security.KeyStore.getDefaultType());
+        setOptionalAttribute(TrustStore.KEY_MANAGER_FACTORY_ALGORITHM, 
attributes, KeyManagerFactory.getDefaultAlgorithm());
+        setOptionalAttribute(TrustStore.DESCRIPTION, attributes, null);
     }
 
     @Override
@@ -135,7 +134,7 @@ public abstract class AbstractKeyStoreAd
         {
             return getId();
         }
-        else if(KeyStore.NAME.equals(name))
+        if(KeyStore.NAME.equals(name))
         {
             return getName();
         }
@@ -163,21 +162,9 @@ public abstract class AbstractKeyStoreAd
         {
 
         }
-        else if(KeyStore.PATH.equals(name))
-        {
-            return _path;
-        }
         else if(KeyStore.PASSWORD.equals(name))
         {
-            return _password;
-        }
-        else if(KeyStore.TYPE.equals(name))
-        {
-            return _type;
-        }
-        else if(KeyStore.KEY_MANAGER_FACTORY_ALGORITHM.equals(name))
-        {
-            return _keyManagerFactoryAlgorithm;
+            return null; // for security reasons we don't expose the password
         }
         return super.getAttribute(name);
     }
@@ -187,4 +174,24 @@ public abstract class AbstractKeyStoreAd
     {
         return false;
     }
+
+    public String getPassword()
+    {
+        return _password;
+    }
+
+    public void setPassword(String password)
+    {
+        _password = password;
+    }
+
+    protected void setMandatoryAttribute(String name, Map<String, Object> 
attributes)
+    {
+        setAttribute(name, null, MapValueConverter.getStringAttribute(name, 
attributes));
+    }
+
+    protected void setOptionalAttribute(String name, Map<String, Object> 
attributes, String defaultValue)
+    {
+        setAttribute(name, null, MapValueConverter.getStringAttribute(name, 
attributes, defaultValue));
+    }
 }

Modified: 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/KeyStoreAdapter.java
URL: 
http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/KeyStoreAdapter.java?rev=1420870&r1=1420869&r2=1420870&view=diff
==============================================================================
--- 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/KeyStoreAdapter.java
 (original)
+++ 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/KeyStoreAdapter.java
 Wed Dec 12 17:41:39 2012
@@ -26,26 +26,14 @@ import java.util.UUID;
 
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.KeyStore;
-import org.apache.qpid.server.util.MapValueConverter;
 
 public class KeyStoreAdapter extends AbstractKeyStoreAdapter implements 
KeyStore
 {
-    private final String _certificateAlias;
 
     public KeyStoreAdapter(UUID id, Broker broker, Map<String, Object> 
attributes)
     {
-        super(id, broker, attributes, KeyStore.class.getSimpleName());
-        _certificateAlias = 
MapValueConverter.getStringAttribute(CERTIFICATE_ALIAS, attributes, null);
-    }
-
-    @Override
-    public Object getAttribute(String name)
-    {
-        if(CERTIFICATE_ALIAS.equals(name))
-        {
-            return _certificateAlias;
-        }
-        return super.getAttribute(name);
+        super(id, broker, attributes);
+        setOptionalAttribute(CERTIFICATE_ALIAS, attributes, null);
     }
 
     @Override

Modified: 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/TrustStoreAdapter.java
URL: 
http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/TrustStoreAdapter.java?rev=1420870&r1=1420869&r2=1420870&view=diff
==============================================================================
--- 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/TrustStoreAdapter.java
 (original)
+++ 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/TrustStoreAdapter.java
 Wed Dec 12 17:41:39 2012
@@ -31,7 +31,7 @@ public class TrustStoreAdapter extends A
 {
     public TrustStoreAdapter(UUID id, Broker broker, Map<String, Object> 
attributes)
     {
-        super(id, broker, attributes, TrustStore.class.getSimpleName());
+        super(id, broker, attributes);
     }
 
     @Override

Modified: 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/AmqpPortAdapter.java
URL: 
http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/AmqpPortAdapter.java?rev=1420870&r1=1420869&r2=1420870&view=diff
==============================================================================
--- 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/AmqpPortAdapter.java
 (original)
+++ 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/AmqpPortAdapter.java
 Wed Dec 12 17:41:39 2012
@@ -117,9 +117,9 @@ public class AmqpPortAdapter extends Por
         // TODO: use correct key store and trust store for a port
         // XXX: temporarily using first keystore and trustore
         KeyStore keyStore = brokerKeyStores.iterator().next();
-        TrustStore trustTore = brokerTrustStores.isEmpty() ? null : 
brokerTrustStores.iterator().next();
+        TrustStore trustStore = brokerTrustStores.isEmpty() ? null : 
brokerTrustStores.iterator().next();
         String keystorePath = (String)keyStore.getAttribute(KeyStore.PATH);
-        String keystorePassword = 
(String)keyStore.getAttribute(KeyStore.PASSWORD);
+        String keystorePassword = keyStore.getPassword();
         String keystoreType = (String)keyStore.getAttribute(KeyStore.TYPE);
         String keyManagerFactoryAlgorithm = 
(String)keyStore.getAttribute(KeyStore.KEY_MANAGER_FACTORY_ALGORITHM);
         String certAlias = 
(String)keyStore.getAttribute(KeyStore.CERTIFICATE_ALIAS);
@@ -127,12 +127,12 @@ public class AmqpPortAdapter extends Por
         final SSLContext sslContext;
         try
         {
-            if(trustTore != null)
+            if(trustStore != null)
             {
-                String trustStorePassword = 
(String)trustTore.getAttribute(TrustStore.PASSWORD);
-                String trustStoreType = 
(String)trustTore.getAttribute(TrustStore.TYPE);
-                String trustManagerFactoryAlgorithm = 
(String)trustTore.getAttribute(TrustStore.KEY_MANAGER_FACTORY_ALGORITHM);
-                String trustStorePath = 
(String)trustTore.getAttribute(TrustStore.PATH);
+                String trustStorePassword = trustStore.getPassword();
+                String trustStoreType = 
(String)trustStore.getAttribute(TrustStore.TYPE);
+                String trustManagerFactoryAlgorithm = 
(String)trustStore.getAttribute(TrustStore.KEY_MANAGER_FACTORY_ALGORITHM);
+                String trustStorePath = 
(String)trustStore.getAttribute(TrustStore.PATH);
 
                 sslContext = 
SSLContextFactory.buildClientContext(trustStorePath,
                         trustStorePassword,

Modified: 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/KeyStoreRecovererTest.java
URL: 
http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/KeyStoreRecovererTest.java?rev=1420870&r1=1420869&r2=1420870&view=diff
==============================================================================
--- 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/KeyStoreRecovererTest.java
 (original)
+++ 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/KeyStoreRecovererTest.java
 Wed Dec 12 17:41:39 2012
@@ -38,13 +38,7 @@ public class KeyStoreRecovererTest exten
 
     public void testCreateWithAllAttributesProvided()
     {
-        Map<String, Object> attributes = new HashMap<String, Object>();
-        attributes.put(KeyStore.NAME, getName());
-        attributes.put(KeyStore.PATH, "/path/to/KeyStore");
-        attributes.put(KeyStore.PASSWORD, "my-secret-password");
-        attributes.put(KeyStore.TYPE, "NON-JKS");
-        attributes.put(KeyStore.KEY_MANAGER_FACTORY_ALGORITHM, "NON-STANDARD");
-        attributes.put(KeyStore.CERTIFICATE_ALIAS, "my-cert-alias");
+        Map<String, Object> attributes = getKeyStoreAttributes();
 
         UUID id = UUID.randomUUID();
         Broker broker = mock(Broker.class);
@@ -57,7 +51,10 @@ public class KeyStoreRecovererTest exten
         KeyStore KeyStore = recovever.create(null, entry, broker);
         assertNotNull("Key store configured object is not created", KeyStore);
         assertEquals(id, KeyStore.getId());
+        assertEquals("my-secret-password", KeyStore.getPassword());
 
+        // password attribute  should not be provided
+        attributes.put(KeyStore.PASSWORD, null);
         for (Map.Entry<String, Object> attribute : attributes.entrySet())
         {
             Object attributeValue = KeyStore.getAttribute(attribute.getKey());
@@ -65,27 +62,45 @@ public class KeyStoreRecovererTest exten
         }
     }
 
-    public void testCreateWithMissedRequiredAttributes()
+    private Map<String, Object> getKeyStoreAttributes()
     {
         Map<String, Object> attributes = new HashMap<String, Object>();
+        attributes.put(KeyStore.NAME, getName());
         attributes.put(KeyStore.PATH, "/path/to/KeyStore");
+        attributes.put(KeyStore.PASSWORD, "my-secret-password");
+        attributes.put(KeyStore.TYPE, "NON-JKS");
+        attributes.put(KeyStore.KEY_MANAGER_FACTORY_ALGORITHM, "NON-STANDARD");
+        attributes.put(KeyStore.CERTIFICATE_ALIAS, "my-cert-alias");
+        attributes.put(KeyStore.DESCRIPTION, "description");
+        return attributes;
+    }
+
+    public void testCreateWithMissedRequiredAttributes()
+    {
+        Map<String, Object> attributes = getKeyStoreAttributes();
 
         UUID id = UUID.randomUUID();
         Broker broker = mock(Broker.class);
         ConfigurationEntry entry = mock(ConfigurationEntry.class);
-        when(entry.getAttributes()).thenReturn(attributes);
         when(entry.getId()).thenReturn(id);
 
         KeyStoreRecoverer recovever = new KeyStoreRecoverer();
 
-        try
-        {
-            recovever.create(null, entry, broker);
-            fail("Cannot create key store without a path");
-        }
-        catch(IllegalArgumentException e)
+        String[] mandatoryProperties = {KeyStore.NAME, KeyStore.PATH, 
KeyStore.PASSWORD};
+        for (int i = 0; i < mandatoryProperties.length; i++)
         {
-            // pass
+            Map<String, Object> properties =  new HashMap<String, 
Object>(attributes);
+            properties.remove(mandatoryProperties[i]);
+            when(entry.getAttributes()).thenReturn(properties);
+            try
+            {
+                recovever.create(null, entry, broker);
+                fail("Cannot create key store without a " + 
mandatoryProperties[i]);
+            }
+            catch(IllegalArgumentException e)
+            {
+                // pass
+            }
         }
     }
 

Modified: 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/TrustStoreRecovererTest.java
URL: 
http://svn.apache.org/viewvc/qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/TrustStoreRecovererTest.java?rev=1420870&r1=1420869&r2=1420870&view=diff
==============================================================================
--- 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/TrustStoreRecovererTest.java
 (original)
+++ 
qpid/branches/java-broker-config-qpid-4390/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/TrustStoreRecovererTest.java
 Wed Dec 12 17:41:39 2012
@@ -36,12 +36,7 @@ public class TrustStoreRecovererTest ext
 {
     public void testCreateWithAllAttributesProvided()
     {
-        Map<String, Object> attributes = new HashMap<String, Object>();
-        attributes.put(TrustStore.NAME, getName());
-        attributes.put(TrustStore.PATH, "/path/to/truststore");
-        attributes.put(TrustStore.PASSWORD, "my-secret-password");
-        attributes.put(TrustStore.TYPE, "NON-JKS");
-        attributes.put(TrustStore.KEY_MANAGER_FACTORY_ALGORITHM, 
"NON-STANDARD");
+        Map<String, Object> attributes = getTrustStoreAttributes();
 
         UUID id = UUID.randomUUID();
         Broker broker = mock(Broker.class);
@@ -54,7 +49,10 @@ public class TrustStoreRecovererTest ext
         TrustStore trustStore = recovever.create(null, entry, broker);
         assertNotNull("Trust store configured object is not created", 
trustStore);
         assertEquals(id, trustStore.getId());
+        assertEquals("my-secret-password", trustStore.getPassword());
 
+        // password attribute  should not be provided
+        attributes.put(TrustStore.PASSWORD, null);
         for (Map.Entry<String, Object> attribute : attributes.entrySet())
         {
             Object attributeValue = 
trustStore.getAttribute(attribute.getKey());
@@ -62,10 +60,21 @@ public class TrustStoreRecovererTest ext
         }
     }
 
-    public void testCreateWithMissedRequiredAttributes()
+    private Map<String, Object> getTrustStoreAttributes()
     {
         Map<String, Object> attributes = new HashMap<String, Object>();
+        attributes.put(TrustStore.NAME, getName());
         attributes.put(TrustStore.PATH, "/path/to/truststore");
+        attributes.put(TrustStore.PASSWORD, "my-secret-password");
+        attributes.put(TrustStore.TYPE, "NON-JKS");
+        attributes.put(TrustStore.KEY_MANAGER_FACTORY_ALGORITHM, 
"NON-STANDARD");
+        attributes.put(TrustStore.DESCRIPTION, "Description");
+        return attributes;
+    }
+
+    public void testCreateWithMissedRequiredAttributes()
+    {
+        Map<String, Object> attributes = getTrustStoreAttributes();
 
         UUID id = UUID.randomUUID();
         Broker broker = mock(Broker.class);
@@ -75,14 +84,21 @@ public class TrustStoreRecovererTest ext
 
         TrustStoreRecoverer recovever = new TrustStoreRecoverer();
 
-        try
-        {
-            recovever.create(null, entry, broker);
-            fail("Cannot create trustore without a path");
-        }
-        catch(IllegalArgumentException e)
+        String[] mandatoryProperties = {TrustStore.NAME, TrustStore.PATH, 
TrustStore.PASSWORD};
+        for (int i = 0; i < mandatoryProperties.length; i++)
         {
-            // pass
+            Map<String, Object> properties =  new HashMap<String, 
Object>(attributes);
+            properties.remove(mandatoryProperties[i]);
+            when(entry.getAttributes()).thenReturn(properties);
+            try
+            {
+                recovever.create(null, entry, broker);
+                fail("Cannot create key store without a " + 
mandatoryProperties[i]);
+            }
+            catch(IllegalArgumentException e)
+            {
+                // pass
+            }
         }
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to