hadoop-common-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From omal...@apache.org
Subject svn commit: r1077224 - in /hadoop/common/branches/branch-0.20-security-patches: .eclipse.templates/ ivy/ src/core/org/apache/hadoop/security/token/ src/test/org/apache/hadoop/security/token/
Date Fri, 04 Mar 2011 03:53:30 GMT
Author: omalley
Date: Fri Mar  4 03:53:30 2011
New Revision: 1077224

URL: http://svn.apache.org/viewvc?rev=1077224&view=rev
Log:
commit 435327a92271b6d1a530b13c6f650b548391580e
Author: Owen O'Malley <omalley@apache.org>
Date:   Thu Feb 25 10:14:22 2010 -0800

    HADOOP-6579. Add a mechanism for encoding and decoding Tokens in to
    url-safe strings. Also change commons-codec library to 1.4. (omalley)
    
    +++ b/YAHOO-CHANGES.txt
    +    HADOOP-6579. Add a mechanism for encoding and decoding Tokens in to
    +    url-safe strings. (omalley)
    +

Modified:
    hadoop/common/branches/branch-0.20-security-patches/.eclipse.templates/.classpath
    hadoop/common/branches/branch-0.20-security-patches/ivy/hadoop-core-pom-template.xml
    hadoop/common/branches/branch-0.20-security-patches/ivy/hadoop-core.pom
    hadoop/common/branches/branch-0.20-security-patches/ivy/libraries.properties
    hadoop/common/branches/branch-0.20-security-patches/src/core/org/apache/hadoop/security/token/Token.java
    hadoop/common/branches/branch-0.20-security-patches/src/test/org/apache/hadoop/security/token/TestToken.java

Modified: hadoop/common/branches/branch-0.20-security-patches/.eclipse.templates/.classpath
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-patches/.eclipse.templates/.classpath?rev=1077224&r1=1077223&r2=1077224&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.20-security-patches/.eclipse.templates/.classpath (original)
+++ hadoop/common/branches/branch-0.20-security-patches/.eclipse.templates/.classpath Fri
Mar  4 03:53:30 2011
@@ -18,7 +18,7 @@
 	<classpathentry kind="lib" path="lib/kfs-0.2.2.jar"/>
   	<classpathentry kind="lib" path="lib/jsp-2.1/jsp-2.1.jar"/>
   	<classpathentry kind="lib" path="lib/jsp-2.1/jsp-api-2.1.jar"/>
-	<classpathentry kind="lib" path="build/ivy/lib/Hadoop/common/commons-codec-1.3.jar"/>
+	<classpathentry kind="lib" path="build/ivy/lib/Hadoop/common/commons-codec-1.4.jar"/>
 	<classpathentry kind="lib" path="build/ivy/lib/Hadoop/common/commons-httpclient-3.0.1.jar"/>
 	<classpathentry kind="lib" path="build/ivy/lib/Hadoop/common/commons-el-1.0.jar"/>
 	<classpathentry kind="lib" path="build/ivy/lib/Hadoop/common/jasper-compiler-5.5.12.jar"/>

Modified: hadoop/common/branches/branch-0.20-security-patches/ivy/hadoop-core-pom-template.xml
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-patches/ivy/hadoop-core-pom-template.xml?rev=1077224&r1=1077223&r2=1077224&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.20-security-patches/ivy/hadoop-core-pom-template.xml (original)
+++ hadoop/common/branches/branch-0.20-security-patches/ivy/hadoop-core-pom-template.xml Fri
Mar  4 03:53:30 2011
@@ -41,7 +41,7 @@
     <dependency>
       <groupId>commons-codec</groupId>
       <artifactId>commons-codec</artifactId>
-      <version>1.3</version>
+      <version>1.4</version>
     </dependency>
     <dependency>
       <groupId>commons-net</groupId>

Modified: hadoop/common/branches/branch-0.20-security-patches/ivy/hadoop-core.pom
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-patches/ivy/hadoop-core.pom?rev=1077224&r1=1077223&r2=1077224&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.20-security-patches/ivy/hadoop-core.pom (original)
+++ hadoop/common/branches/branch-0.20-security-patches/ivy/hadoop-core.pom Fri Mar  4 03:53:30
2011
@@ -132,7 +132,7 @@
     <dependency>
       <groupId>commons-codec</groupId>
       <artifactId>commons-codec</artifactId>
-      <version>1.3</version>
+      <version>1.4</version>
       <scope>optional</scope>
     </dependency>
 

Modified: hadoop/common/branches/branch-0.20-security-patches/ivy/libraries.properties
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-patches/ivy/libraries.properties?rev=1077224&r1=1077223&r2=1077224&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.20-security-patches/ivy/libraries.properties (original)
+++ hadoop/common/branches/branch-0.20-security-patches/ivy/libraries.properties Fri Mar 
4 03:53:30 2011
@@ -25,7 +25,7 @@ aspectj.version=1.6.5
 checkstyle.version=4.2
 
 commons-cli.version=1.2
-commons-codec.version=1.3
+commons-codec.version=1.4
 commons-collections.version=3.1
 commons-httpclient.version=3.0.1
 commons-lang.version=2.4

Modified: hadoop/common/branches/branch-0.20-security-patches/src/core/org/apache/hadoop/security/token/Token.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-patches/src/core/org/apache/hadoop/security/token/Token.java?rev=1077224&r1=1077223&r2=1077224&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.20-security-patches/src/core/org/apache/hadoop/security/token/Token.java
(original)
+++ hadoop/common/branches/branch-0.20-security-patches/src/core/org/apache/hadoop/security/token/Token.java
Fri Mar  4 03:53:30 2011
@@ -21,9 +21,15 @@ package org.apache.hadoop.security.token
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
+import java.util.Arrays;
 
+import org.apache.commons.codec.binary.Base64;
+
+import org.apache.hadoop.io.DataInputBuffer;
+import org.apache.hadoop.io.DataOutputBuffer;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.io.Writable;
+import org.apache.hadoop.io.WritableComparator;
 import org.apache.hadoop.io.WritableUtils;
 
 /**
@@ -47,7 +53,21 @@ public class Token<T extends TokenIdenti
     kind = id.getKind();
     service = new Text();
   }
-  
+ 
+  /**
+   * Construct a token from the components.
+   * @param identifier the token identifier
+   * @param password the token's password
+   * @param kind the kind of token
+   * @param service the service for this token
+   */
+  public Token(byte[] identifier, byte[] password, Text kind, Text service) {
+    this.identifier = identifier;
+    this.password = password;
+    this.kind = kind;
+    this.service = service;
+  }
+
   /**
    * Default constructor
    */
@@ -123,4 +143,103 @@ public class Token<T extends TokenIdenti
     kind.write(out);
     service.write(out);
   }
+
+  /**
+   * Generate a string with the url-quoted base64 encoded serialized form
+   * of the Writable.
+   * @param obj the object to serialize
+   * @return the encoded string
+   * @throws IOException
+   */
+  private static String encodeWritable(Writable obj) throws IOException {
+    DataOutputBuffer buf = new DataOutputBuffer();
+    obj.write(buf);
+    Base64 encoder = new Base64(0, null, true);
+    byte[] raw = new byte[buf.getLength()];
+    System.arraycopy(buf.getData(), 0, raw, 0, buf.getLength());
+    return encoder.encodeToString(raw);
+  }
+  
+  /**
+   * Modify the writable to the value from the newValue
+   * @param obj the object to read into
+   * @param newValue the string with the url-safe base64 encoded bytes
+   * @throws IOException
+   */
+  private static void decodeWritable(Writable obj, 
+                                     String newValue) throws IOException {
+    Base64 decoder = new Base64(0, null, true);
+    DataInputBuffer buf = new DataInputBuffer();
+    byte[] decoded = decoder.decode(newValue);
+    buf.reset(decoded, decoded.length);
+    obj.readFields(buf);
+  }
+
+  /**
+   * Encode this token as a url safe string
+   * @return the encoded string
+   * @throws IOException
+   */
+  public String encodeToUrlString() throws IOException {
+    return encodeWritable(this);
+  }
+  
+  /**
+   * Decode the given url safe string into this token.
+   * @param newValue the encoded string
+   * @throws IOException
+   */
+  public void decodeFromUrlString(String newValue) throws IOException {
+    decodeWritable(this, newValue);
+  }
+  
+  @SuppressWarnings("unchecked")
+  @Override
+  public boolean equals(Object right) {
+    if (this == right) {
+      return true;
+    } else if (right == null || getClass() != right.getClass()) {
+      return false;
+    } else {
+      Token<T> r = (Token<T>) right;
+      return Arrays.equals(identifier, r.identifier) &&
+             Arrays.equals(password, r.password) &&
+             kind.equals(r.kind) &&
+             service.equals(r.service);
+    }
+  }
+  
+  @Override
+  public int hashCode() {
+    return WritableComparator.hashBytes(identifier, identifier.length);
+  }
+  
+  private static void addBinaryBuffer(StringBuilder buffer, byte[] bytes) {
+    for (int idx = 0; idx < bytes.length; idx++) {
+      // if not the first, put a blank separator in
+      if (idx != 0) {
+        buffer.append(' ');
+      }
+      String num = Integer.toHexString(0xff & bytes[idx]);
+      // if it is only one digit, add a leading 0.
+      if (num.length() < 2) {
+        buffer.append('0');
+      }
+      buffer.append(num);
+    }
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder buffer = new StringBuilder();
+    buffer.append("Ident: ");
+    addBinaryBuffer(buffer, identifier);
+    buffer.append(", Pass: ");
+    addBinaryBuffer(buffer, password);
+    buffer.append(", Kind: ");
+    buffer.append(kind.toString());
+    buffer.append(", Service: ");
+    buffer.append(service.toString());
+    return buffer.toString();
+  }
 }

Modified: hadoop/common/branches/branch-0.20-security-patches/src/test/org/apache/hadoop/security/token/TestToken.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-patches/src/test/org/apache/hadoop/security/token/TestToken.java?rev=1077224&r1=1077223&r2=1077224&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.20-security-patches/src/test/org/apache/hadoop/security/token/TestToken.java
(original)
+++ hadoop/common/branches/branch-0.20-security-patches/src/test/org/apache/hadoop/security/token/TestToken.java
Fri Mar  4 03:53:30 2011
@@ -22,6 +22,7 @@ import java.io.*;
 import java.util.Arrays;
 
 import org.apache.hadoop.io.*;
+import org.apache.hadoop.security.token.delegation.AbstractDelegationTokenIdentifier;
 
 import junit.framework.TestCase;
 
@@ -58,4 +59,40 @@ public class TestToken extends TestCase 
     destToken.readFields(in);
     assertTrue(checkEqual(sourceToken, destToken));
   }
+  
+  private static void checkUrlSafe(String str) throws Exception {
+    int len = str.length();
+    for(int i=0; i < len; ++i) {
+      char ch = str.charAt(i);
+      if (ch == '-') continue;
+      if (ch == '_') continue;
+      if (ch >= '0' && ch <= '9') continue;
+      if (ch >= 'A' && ch <= 'Z') continue;
+      if (ch >= 'a' && ch <= 'z') continue;
+      fail("Encoded string " + str + 
+           " has invalid character at position " + i);
+    }
+  }
+
+  public static void testEncodeWritable() throws Exception {
+    String[] values = new String[]{"", "a", "bb", "ccc", "dddd", "eeeee",
+        "ffffff", "ggggggg", "hhhhhhhh", "iiiiiiiii",
+        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLM" +
+             "NOPQRSTUVWXYZ01234567890!@#$%^&*()-=_+[]{}|;':,./<>?"};
+    Token<AbstractDelegationTokenIdentifier> orig;
+    Token<AbstractDelegationTokenIdentifier> copy = 
+      new Token<AbstractDelegationTokenIdentifier>();
+    // ensure that for each string the input and output values match
+    for(int i=0; i< values.length; ++i) {
+      String val = values[i];
+      System.out.println("Input = " + val);
+      orig = new Token<AbstractDelegationTokenIdentifier>(val.getBytes(),
+          val.getBytes(), new Text(val), new Text(val));
+      String encode = orig.encodeToUrlString();
+      copy.decodeFromUrlString(encode);
+      assertEquals(orig, copy);
+      checkUrlSafe(encode);
+    }
+  }
+
 }



Mime
View raw message