From 340c1c44bad78992ec49746d3776c3cff1a96fbd Mon Sep 17 00:00:00 2001
From: Maxim Epishchev <epishev@garant.ru>
Date: Wed, 3 Feb 2016 14:34:44 +0300
Subject: Limit size "key" field in BitBucket POST API

Refactoring method ApiClient::computeAPIKey() to check maximum size of computed key.
Now field size contolled by special constant ApiClient::MAX_KEY_SIZE_BB_API.

This changes will resolve, in my opinion, issue with continuously rebuilding: method ApiClient::hasBuildStatus() fail and PR's are always trigger new builds.
---
 .../bitbucket/ApiClient.java                       | 32 ++++++++++++++++++++--
 1 file changed, 30 insertions(+), 2 deletions(-)

(limited to 'src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java')

diff --git a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java
index 509dfaf..047bf5a 100644
--- a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java
+++ b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java
@@ -16,6 +16,11 @@ import java.util.logging.Logger;
 
 import jenkins.model.Jenkins;
 import hudson.ProxyConfiguration;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import org.apache.commons.codec.binary.Hex;
 import org.apache.commons.httpclient.methods.PutMethod;
 import org.apache.commons.httpclient.util.EncodingUtil;
 
@@ -26,13 +31,15 @@ public class ApiClient {
     private static final Logger logger = Logger.getLogger(ApiClient.class.getName());
     private static final String V1_API_BASE_URL = "https://bitbucket.org/api/1.0/repositories/";
     private static final String V2_API_BASE_URL = "https://bitbucket.org/api/2.0/repositories/";
-    private static final String COMPUTED_KEY_FORMAT = "%s-%s";
+    private static final String COMPUTED_KEY_FORMAT = "%s-%s";    
     private String owner;
     private String repositoryName;
     private Credentials credentials;
     private String key;
     private String name;
     private HttpClientFactory factory;
+    
+    public static final byte MAX_KEY_SIZE_BB_API = 40;
 
     public static class HttpClientFactory {    
         public static final HttpClientFactory INSTANCE = new HttpClientFactory(); 
@@ -107,8 +114,29 @@ public class ApiClient {
       return this.name;
     }
     
+    private static MessageDigest SHA1 = null;
+    
+    /**
+     * Retrun 
+     * @param keyExPart
+     * @return key parameter for call BitBucket API 
+     */
     private String computeAPIKey(String keyExPart) {
-      return String.format(COMPUTED_KEY_FORMAT, this.key, keyExPart);
+      String computedKey = String.format(COMPUTED_KEY_FORMAT, this.key, keyExPart);
+      
+      if (computedKey.length() > MAX_KEY_SIZE_BB_API) {
+        try { 
+          if (SHA1 == null) SHA1 = MessageDigest.getInstance("SHA1"); 
+          return new String(Hex.encodeHex(SHA1.digest(computedKey.getBytes("UTF-8"))));
+        } catch(NoSuchAlgorithmException e) { 
+          logger.log(Level.WARNING, "Failed to create hash provider", e);
+          e.printStackTrace();
+        } catch (UnsupportedEncodingException e) {
+          logger.log(Level.WARNING, "Failed to create hash provider", e);
+          e.printStackTrace();
+        }
+      }      
+      return (computedKey.length() <= MAX_KEY_SIZE_BB_API) ?  computedKey : computedKey.substring(0, MAX_KEY_SIZE_BB_API);
     }
     
     public String buildStatusKey(String bsKey) {
-- 
cgit v1.2.3