From c5dfd60d174a9841e64e4097cecab5aea5c422d0 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Sat, 12 Apr 2014 12:26:17 -0400
Subject: [PATCH] Documentation

---
 src/main/java/com/gitblit/transport/ssh/SshKey.java |  100 +++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 78 insertions(+), 22 deletions(-)

diff --git a/src/main/java/com/gitblit/transport/ssh/SshKey.java b/src/main/java/com/gitblit/transport/ssh/SshKey.java
index cac6c41..6a20d7d 100644
--- a/src/main/java/com/gitblit/transport/ssh/SshKey.java
+++ b/src/main/java/com/gitblit/transport/ssh/SshKey.java
@@ -2,12 +2,15 @@
 
 import java.io.Serializable;
 import java.security.PublicKey;
+import java.util.Arrays;
+import java.util.List;
 
 import org.apache.commons.codec.binary.Base64;
 import org.apache.sshd.common.SshException;
 import org.apache.sshd.common.util.Buffer;
 import org.eclipse.jgit.lib.Constants;
 
+import com.gitblit.Constants.AccessPermission;
 import com.gitblit.utils.StringUtils;
 
 /**
@@ -28,13 +31,19 @@
 
 	private String fingerprint;
 
+	private String toString;
+
+	private AccessPermission permission;
+
 	public SshKey(String data) {
 		this.rawData = data;
+		this.permission = AccessPermission.PUSH;
 	}
 
 	public SshKey(PublicKey key) {
 		this.publicKey = key;
 		this.comment = "";
+		this.permission = AccessPermission.PUSH;
 	}
 
 	public PublicKey getPublicKey() {
@@ -71,6 +80,49 @@
 
 	public void setComment(String comment) {
 		this.comment = comment;
+		if (rawData != null) {
+			rawData = null;
+		}
+	}
+
+	/**
+	 * Returns true if this key may be used to clone or fetch.
+	 *
+	 * @return true if this key can be used to clone or fetch
+	 */
+	public boolean canClone() {
+		return permission.atLeast(AccessPermission.CLONE);
+	}
+
+	/**
+	 * Returns true if this key may be used to push changes.
+	 *
+	 * @return true if this key can be used to push changes
+	 */
+	public boolean canPush() {
+		return permission.atLeast(AccessPermission.PUSH);
+	}
+
+	/**
+	 * Returns the access permission for the key.
+	 *
+	 * @return the access permission for the key
+	 */
+	public AccessPermission getPermission() {
+		return permission;
+	}
+
+	/**
+	 * Control the access permission assigned to this key.
+	 *
+	 * @param value
+	 */
+	public void setPermission(AccessPermission value) throws IllegalArgumentException {
+		List<AccessPermission> permitted = Arrays.asList(AccessPermission.SSHPERMISSIONS);
+		if (!permitted.contains(value)) {
+			throw new IllegalArgumentException("Illegal SSH public key permission specified: " + value);
+		}
+		this.permission = value;
 	}
 
 	public String getRawData() {
@@ -96,12 +148,6 @@
 	public String getFingerprint() {
 		if (fingerprint == null) {
 			StringBuilder sb = new StringBuilder();
-			// TODO append the keysize
-			int keySize = 0;
-			if (keySize > 0) {
-				sb.append(keySize).append(' ');
-			}
-
 			// append the key hash as colon-separated pairs
 			String hash;
 			if (rawData != null) {
@@ -109,26 +155,13 @@
 				final byte [] bin = Base64.decodeBase64(Constants.encodeASCII(parts[1]));
 				hash = StringUtils.getMD5(bin);
 			} else {
-				// TODO get hash from publickey
-				hash = "todo";
+				// TODO calculate the correct hash from a PublicKey instance
+				hash = StringUtils.getMD5(getPublicKey().getEncoded());
 			}
 			for (int i = 0; i < hash.length(); i += 2) {
 				sb.append(hash.charAt(i)).append(hash.charAt(i + 1)).append(':');
 			}
 			sb.setLength(sb.length() - 1);
-
-			// append the comment
-			String c = getComment();
-			if (!StringUtils.isEmpty(c)) {
-				sb.append(' ');
-				sb.append(c);
-			}
-
-			// append the algorithm
-			String alg = getAlgorithm();
-			if (!StringUtils.isEmpty(alg)) {
-				sb.append(" (").append(alg).append(")");
-			}
 			fingerprint = sb.toString();
 		}
 		return fingerprint;
@@ -151,6 +184,29 @@
 
 	@Override
 	public String toString() {
-		return getFingerprint();
+		if (toString == null) {
+			StringBuilder sb = new StringBuilder();
+			// TODO append the keysize
+			int keySize = 0;
+			if (keySize > 0) {
+				sb.append(keySize).append(' ');
+			}
+			// append fingerprint
+			sb.append(' ');
+			sb.append(getFingerprint());
+			// append the comment
+			String c = getComment();
+			if (!StringUtils.isEmpty(c)) {
+				sb.append(' ');
+				sb.append(c);
+			}
+			// append algorithm
+			String alg = getAlgorithm();
+			if (!StringUtils.isEmpty(alg)) {
+				sb.append(" (").append(alg).append(")");
+			}
+			toString = sb.toString();
+		}
+		return toString;
 	}
 }

--
Gitblit v1.9.1