Add a request signature implementation in Java. This should evolve to both a Java...
authorpastith <devnull@localhost>
Mon, 1 Jun 2009 13:22:47 +0000 (13:22 +0000)
committerpastith <devnull@localhost>
Mon, 1 Jun 2009 13:22:47 +0000 (13:22 +0000)
gss/test/gr/ebs/gss/client/TestClient.java [new file with mode: 0644]

diff --git a/gss/test/gr/ebs/gss/client/TestClient.java b/gss/test/gr/ebs/gss/client/TestClient.java
new file mode 100644 (file)
index 0000000..3b5cf32
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2009 Electronic Business Systems Ltd.
+ *
+ * This file is part of GSS.
+ *
+ * GSS is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GSS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GSS.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package gr.ebs.gss.client;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.util.DateUtil;
+
+
+/**
+ * @author past
+ *
+ */
+public class TestClient {
+
+       public static void main(String[] args) {
+               String user = "ebstest@grnet-hq.admin.grnet.gr";
+               String token="PcxaZ/4oIqCqIvCYgsUcKr1hAFcsW40G3kcWJSRPJV5GjzoNuo8RsA==";
+               String host = "pithos.grnet.gr";
+               String restPath = "/pithos/rest";
+               String path = "/" + user + "/files/";
+               String now = DateUtil.formatDate(new Date());
+               String signature = sign("GET", now, path, token);
+               HttpClient client = new HttpClient();
+               HostConfiguration hostconfig = new HostConfiguration();
+               hostconfig.setHost(host);
+               HttpMethod method = new GetMethod(restPath + path);
+               Collection<Header> headers = new ArrayList<Header>();
+               Header auth = new Header("Authorization", user + " " + signature);
+               headers.add(auth);
+               Header date = new Header("X-GSS-Date", now);
+               headers.add(date);
+               System.out.println(headers.toString());
+               hostconfig.getParams().setParameter("http.default-headers", headers);
+               try {
+                       // Execute the method.
+                       int statusCode = client.executeMethod(hostconfig, method);
+
+                       if (statusCode != HttpStatus.SC_OK)
+                               System.err.println("Method failed: " + method.getStatusLine());
+
+                       // Read the response body.
+                       byte[] responseBody = method.getResponseBody();
+
+                       // Deal with the response.
+                       // Use caution: ensure correct character encoding and is not binary data
+                       System.out.println(new String(responseBody));
+               } catch (HttpException e) {
+                       System.err.println("Fatal protocol violation: " + e.getMessage());
+                       e.printStackTrace();
+               } catch (IOException e) {
+                       System.err.println("Fatal transport error: " + e.getMessage());
+                       e.printStackTrace();
+               } finally {
+                       // Release the connection.
+                       method.releaseConnection();
+               }
+       }
+
+       public static String sign(String httpMethod, String timestamp,
+                               String path, String token) {
+               String input = httpMethod + timestamp + path;
+               String signed = null;
+
+               try {
+                       System.err.println("Token:" + token);
+                       // Get an HMAC-SHA1 key from the authentication token.
+                       System.err.println("Input: " + input);
+                       SecretKeySpec signingKey = new SecretKeySpec(Base64.decodeBase64(token.getBytes()), "HmacSHA1");
+
+                       // Get an HMAC-SHA1 Mac instance and initialize with the signing key.
+                       Mac hmac = Mac.getInstance("HmacSHA1");
+                       hmac.init(signingKey);
+
+                       // Compute the HMAC on the input data bytes.
+                       byte[] rawMac = hmac.doFinal(input.getBytes());
+
+                       // Do base 64 encoding.
+                       signed = new String(Base64.encodeBase64(rawMac), "US-ASCII");
+
+               } catch (InvalidKeyException ikex) {
+                       System.err.println("Fatal key exception: " + ikex.getMessage());
+                       ikex.printStackTrace();
+               } catch (UnsupportedEncodingException ueex) {
+                       System.err.println("Fatal encoding exception: "
+                                               + ueex.getMessage());
+               } catch (NoSuchAlgorithmException nsaex) {
+                       System.err.println("Fatal algorithm exception: "
+                                               + nsaex.getMessage());
+                       nsaex.printStackTrace();
+               }
+
+               if (signed == null)
+                       System.exit(-1);
+               System.err.println("Signed: " + signed);
+               return signed;
+       }
+}