Commits

Sebastian Sdorra  committed e12a719

added api to disabled proxy setting for specified hosts

  • Participants
  • Parent commits b305912
  • Branches issue-281

Comments (0)

Files changed (3)

File scm-core/src/main/java/sonia/scm/config/ScmConfiguration.java

 
 //~--- non-JDK imports --------------------------------------------------------
 
+import com.google.common.collect.Sets;
 import com.google.inject.Singleton;
 
 import org.slf4j.Logger;
 @XmlRootElement(name = "scm-config")
 @XmlAccessorType(XmlAccessType.FIELD)
 public class ScmConfiguration
-        implements ListenerSupport<ConfigChangedListener<ScmConfiguration>>
+  implements ListenerSupport<ConfigChangedListener<ScmConfiguration>>
 {
 
   /** Default JavaScript date format */
    */
   @Override
   public void addListeners(
-          Collection<ConfigChangedListener<ScmConfiguration>> listeners)
+    Collection<ConfigChangedListener<ScmConfiguration>> listeners)
   {
     listeners.addAll(listeners);
   }
   }
 
   /**
+   * Returns a set of glob patterns for urls which should excluded from
+   * proxy settings.
+   *
+   *
+   * @return set of glob patterns
+   * @since 1.23
+   */
+  public Set<String> getProxyExcludes()
+  {
+    if (proxyExcludes == null)
+    {
+      proxyExcludes = Sets.newHashSet();
+    }
+
+    return proxyExcludes;
+  }
+
+  /**
    * Method description
    *
    *
   }
 
   /**
+   * Set glob patterns for urls which are should be excluded from proxy
+   * settings.
+   *
+   *
+   * @param proxyExcludes glob patterns
+   * @since 1.23
+   */
+  public void setProxyExcludes(Set<String> proxyExcludes)
+  {
+    this.proxyExcludes = proxyExcludes;
+  }
+
+  /**
    * Method description
    *
    *
   @XmlElement(name = "plugin-url")
   private String pluginUrl = DEFAULT_PLUGINURL;
 
+  /** glob patterns for urls which are excluded from proxy */
+  @XmlElement(name = "admin-groups")
+  @XmlJavaTypeAdapter(XmlSetStringAdapter.class)
+  private Set<String> proxyExcludes;
+
   /** Field description */
   private String proxyPassword;
 

File scm-core/src/main/java/sonia/scm/net/Proxies.java

+/**
+ * Copyright (c) 2010, Sebastian Sdorra All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer. 2. Redistributions in
+ * binary form must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution. 3. Neither the name of SCM-Manager;
+ * nor the names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+
+
+
+package sonia.scm.net;
+
+//~--- non-JDK imports --------------------------------------------------------
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import sonia.scm.config.ScmConfiguration;
+import sonia.scm.util.GlobUtil;
+
+//~--- JDK imports ------------------------------------------------------------
+
+import java.net.URL;
+
+/**
+ * Util class for proxy settings.
+ *
+ * @author Sebastian Sdorra
+ * @since 1.23
+ */
+public class Proxies
+{
+
+  /**
+   * the logger for Proxies
+   */
+  private static final Logger logger = LoggerFactory.getLogger(Proxies.class);
+
+  //~--- get methods ----------------------------------------------------------
+
+  /**
+   * Returns true if proxy settings should be used to access the given url.
+   *
+   *
+   * @param configuration scm-manager main configuration
+   * @param url url to check
+   *
+   * @return true if proxy settings should be used
+   */
+  public static boolean isEnabled(ScmConfiguration configuration, String url)
+  {
+    boolean result = false;
+
+    if (configuration.isEnableProxy())
+    {
+      result = true;
+
+      int index = url.indexOf("://");
+
+      if (index > 0)
+      {
+        url = url.substring(index + 3);
+      }
+
+      index = url.indexOf("/");
+
+      if (index > 0)
+      {
+        url = url.substring(0, index);
+      }
+
+      for (String exclude : configuration.getProxyExcludes())
+      {
+        if (GlobUtil.matches(exclude, url))
+        {
+          logger.debug(
+            "disable proxy settings for url {}, because exclude {} matches",
+            url, exclude);
+          result = false;
+
+          break;
+        }
+      }
+    }
+    else
+    {
+      logger.trace("proxy settings are disabled");
+    }
+
+    return result;
+  }
+
+  /**
+   * Returns true if proxy settings should be used to access the given url.
+   *
+   *
+   * @param configuration scm-manager main configuration
+   * @param url url to check
+   *
+   * @return true if proxy settings should be used
+   */
+  public static boolean isEnabled(ScmConfiguration configuration, URL url)
+  {
+    return isEnabled(configuration, url.getHost());
+  }
+}

File scm-core/src/test/java/sonia/scm/net/ProxiesTest.java

+/**
+ * Copyright (c) 2010, Sebastian Sdorra All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer. 2. Redistributions in
+ * binary form must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution. 3. Neither the name of SCM-Manager;
+ * nor the names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+
+
+
+package sonia.scm.net;
+
+//~--- non-JDK imports --------------------------------------------------------
+
+import com.google.common.collect.Sets;
+
+import org.junit.Test;
+
+import sonia.scm.config.ScmConfiguration;
+
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author Sebastian Sdorra
+ */
+public class ProxiesTest
+{
+
+  /**
+   * Method description
+   *
+   */
+  @Test
+  public void testDisabledWithoutExcludes()
+  {
+    ScmConfiguration config = createConfiguration(false);
+
+    assertFalse(Proxies.isEnabled(config, "localhost"));
+    assertFalse(Proxies.isEnabled(config, "download.scm-manager.org"));
+    assertFalse(Proxies.isEnabled(config, "http://127.0.0.1"));
+    assertFalse(Proxies.isEnabled(config, "http://127.0.0.1/test/ka"));
+  }
+
+  /**
+   * Method description
+   *
+   */
+  @Test
+  public void testEnabledWithoutExcludes()
+  {
+    ScmConfiguration config = createConfiguration(true);
+
+    assertTrue(Proxies.isEnabled(config, "localhost"));
+    assertTrue(Proxies.isEnabled(config, "download.scm-manager.org"));
+    assertTrue(Proxies.isEnabled(config, "http://127.0.0.1"));
+    assertTrue(Proxies.isEnabled(config, "http://127.0.0.1/test/ka"));
+  }
+
+  /**
+   * Method description
+   *
+   */
+  @Test
+  public void testWithExcludes()
+  {
+    ScmConfiguration config = createConfiguration(true, "127.0.0.1",
+                                "localhost");
+
+    assertFalse(Proxies.isEnabled(config, "localhost"));
+    assertTrue(Proxies.isEnabled(config, "download.scm-manager.org"));
+    assertFalse(Proxies.isEnabled(config, "http://127.0.0.1"));
+    assertFalse(Proxies.isEnabled(config, "http://127.0.0.1/test/ka"));
+  }
+
+  /**
+   * Method description
+   *
+   */
+  @Test
+  public void testWithGlobExcludes()
+  {
+    ScmConfiguration config = createConfiguration(true, "127.*", "*host");
+
+    assertFalse(Proxies.isEnabled(config, "localhost"));
+    assertTrue(Proxies.isEnabled(config, "download.scm-manager.org"));
+    assertFalse(Proxies.isEnabled(config, "http://127.0.0.1"));
+    assertFalse(Proxies.isEnabled(config, "http://127.0.0.1/test/ka"));
+  }
+
+  /**
+   * Method description
+   *
+   *
+   * @param enabled
+   * @param excludes
+   *
+   * @return
+   */
+  private ScmConfiguration createConfiguration(boolean enabled,
+    String... excludes)
+  {
+    ScmConfiguration configuration = new ScmConfiguration();
+
+    configuration.setEnableProxy(enabled);
+    configuration.setProxyExcludes(Sets.newHashSet(excludes));
+
+    return configuration;
+  }
+}