[OpenWrt-Devel] [JPP-Devel] Fwd: SVN: [6214] core/trunk

edgar.soldin at web.de edgar.soldin at web.de
Mon Jan 6 07:55:45 EST 2020


On 06.01.2020 12:37, Michaël Michaud wrote:
> Hi Ede,
>
> I did a quick try and it seems to work fine.
> Seems that the change you did is rather big. I'll try to go deeper into your change to try to understand.

go ahead :)

> What about the SO remark (https://stackoverflow.com/questions/1884230/httpurlconnection-doesnt-follow-redirect-from-http-to-https)
> Did you decide to follow the link anyway without warning ?

as current browsers follow redirects regardless as well, i assume that it's established and expected behaviour.

> Indeed, I did not understand what the problem is exactly, and it's OK for me to go on. Just want to know your idea about the SO warning.

personally feel that warning on every redirect is overengineering. securitywise it might make sense to warn on leaving the host or switching from https though. alas i'm lacking the time to implement it.

..ede

> Michaël
>
> Le 04/01/2020 à 20:00, edgar.soldin at web.de a écrit :
>> Mike,
>>
>> could you please check the fix and close the ticket if it works as expected?.. thanks ede
>>
>>
>> -------- Forwarded Message --------
>> Subject: [JPP-Devel] SVN: [6214] core/trunk
>> Date: Sat, 04 Jan 2020 18:58:23 +0000
>> From: jump-pilot-svn--- via Jump-pilot-devel <jump-pilot-devel at lists.sourceforge.net>
>> Reply-To: OpenJump develop and use <jump-pilot-devel at lists.sourceforge.net>
>> To: jump-pilot-devel at lists.sourceforge.net
>> CC: jump-pilot-svn at lists.sourceforge.net
>>
>> Revision: 6214
>>            http://sourceforge.net/p/jump-pilot/code/6214
>> Author:   edso
>> Date:     2020-01-04 18:58:23 +0000 (Sat, 04 Jan 2020)
>> Log Message:
>> -----------
>> bugfix #489 "Veneto Region (Italy) WMS service does not work on OpenJump"
>> wms now follows http redirections by default
>> also
>> some better error handling/reporting
>> Edit WMS resets connection now on manual url editing
>>
>> Modified Paths:
>> --------------
>>      core/trunk/ChangeLog
>>      core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/wms/EditWMSQueryPanel.java
>>      core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/wms/MapLayerPanel.java
>>      core/trunk/src/com/vividsolutions/wms/AbstractWMSRequest.java
>>      core/trunk/src/com/vividsolutions/wms/BasicRequest.java
>>      core/trunk/src/com/vividsolutions/wms/FeatureInfoRequest.java
>>      core/trunk/src/com/vividsolutions/wms/MapRequest.java
>>      core/trunk/src/com/vividsolutions/wms/WMService.java
>>      core/trunk/src/org/openjump/util/URLConnectionProvider.java
>>
>> Modified: core/trunk/ChangeLog
>> ===================================================================
>> --- core/trunk/ChangeLog    2020-01-01 09:21:44 UTC (rev 6213)
>> +++ core/trunk/ChangeLog    2020-01-04 18:58:23 UTC (rev 6214)
>> @@ -3,6 +3,10 @@
>>   # 2. make sure that lines break at 80 chars for constricted display situations
>>   #<-------------------------------- 80 chars ---------------------------------->#
>>
>> +2020-01-04 ede
>> +  * bugfix #489 "Veneto Region (Italy) WMS service does not work on OpenJump"
>> +    wms now follows http redirections by default
>> +
>>   2020-01-01 mmichaud <m.michael.michaud at orange.fr>
>>     * Clean and improve ExtractLayersByAttribute
>>     * Implements FR #262 : copy info to clipboard (patch from Rashad)
>>
>> Modified: core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/wms/EditWMSQueryPanel.java
>> ===================================================================
>> --- core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/wms/EditWMSQueryPanel.java    2020-01-01 09:21:44 UTC (rev 6213)
>> +++ core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/wms/EditWMSQueryPanel.java    2020-01-04 18:58:23 UTC (rev 6214)
>> @@ -57,6 +57,7 @@
>>   import javax.swing.border.Border;
>>   import javax.swing.event.DocumentEvent;
>>   import javax.swing.event.DocumentListener;
>> +import javax.swing.text.JTextComponent;
>>
>>   import org.apache.commons.lang3.ArrayUtils;
>>   import org.openjump.core.ui.plugin.wms.AddWmsLayerWizard;
>> @@ -63,6 +64,7 @@
>>   import org.openjump.util.UriUtil;
>>
>>   import com.vividsolutions.jump.I18N;
>> +import com.vividsolutions.jump.workbench.JUMPWorkbench;
>>   import com.vividsolutions.jump.workbench.model.WMSLayer;
>>   import com.vividsolutions.jump.workbench.plugin.EnableCheck;
>>   import com.vividsolutions.jump.workbench.ui.InputChangedListener;
>> @@ -303,7 +305,6 @@
>>         private void reset(DocumentEvent e) {
>>           System.out.println(e);
>>           resetConnection();
>> -        ;
>>         }
>>       };
>>
>> @@ -329,13 +330,19 @@
>>       SwingUtilities.invokeLater(new Runnable() {
>>         public void run() {
>>           for (final Component c : cs) {
>> -          // System.out.println(c);
>> +          //System.out.println(c);
>>             if (c instanceof AbstractButton)
>>               ((AbstractButton) c).addActionListener(ali);
>>             else if (c instanceof JTextField)
>>               ((JTextField) c).getDocument().addDocumentListener(doli);
>> -          else if (c instanceof JComboBox)
>> +          else if (c instanceof JComboBox) {
>>               ((JComboBox) c).addActionListener(ali);
>> +            // also reset if url is edited manually
>> +            Component editor = ((JComboBox) c).getEditor().getEditorComponent();
>> +            if ( editor instanceof JTextComponent) {
>> +              ((JTextComponent)editor).getDocument().addDocumentListener(doli);
>> +            }
>> +          }
>>           }
>>         }
>>       });
>> @@ -357,9 +364,10 @@
>>     protected void reinitializeService() {
>>       String url = urlPanel.getUrl();
>>       url = UriUtil
>> -        .urlAddCredentials(url, urlPanel.getUser(), urlPanel.getPass());
>> +        .urlAddCredentials(url, urlPanel.getUser(), urlPanel.getPass()).trim();
>>
>> -    url = WMService.legalize(url);
>> +// [ed] url is now legalized b4 every request
>> +// url = WMService.legalize(url);
>>       // [UT] 20.04.2005
>>       WMService service = new WMService(url, URLWizardPanel.wmsVersion);
>>
>> @@ -369,8 +377,8 @@
>>         mapLayerPanel.init(service, layer.getLayerNames());
>>         connectButton.setEnabled(false);
>>       } catch (Exception e) {
>> -      e.printStackTrace();
>>         mapLayerPanel.reset();
>> +      JUMPWorkbench.getInstance().getFrame().handleThrowable(e);
>>       } finally {
>>         refreshParamCombos();
>>       }
>>
>> Modified: core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/wms/MapLayerPanel.java
>> ===================================================================
>> --- core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/wms/MapLayerPanel.java    2020-01-01 09:21:44 UTC (rev 6213)
>> +++ core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/wms/MapLayerPanel.java    2020-01-04 18:58:23 UTC (rev 6214)
>> @@ -339,7 +339,7 @@
>>       }
>>
>>       public void reset() {
>> -      this.service = null;
>> +      //this.service = null;
>>         ((TreeAddRemoveList) addRemovePanel.getLeftList()).setModel(new TreeAddRemoveListModel(new DefaultTreeModel(null)));
>>         addRemovePanel.getRightList().getModel().setItems(new ArrayList());
>>         addRemovePanel.updateEnabled();
>>
>> Modified: core/trunk/src/com/vividsolutions/wms/AbstractWMSRequest.java
>> ===================================================================
>> --- core/trunk/src/com/vividsolutions/wms/AbstractWMSRequest.java    2020-01-01 09:21:44 UTC (rev 6213)
>> +++ core/trunk/src/com/vividsolutions/wms/AbstractWMSRequest.java    2020-01-04 18:58:23 UTC (rev 6214)
>> @@ -70,14 +70,9 @@
>>      */
>>     protected HttpURLConnection prepareConnection() throws IOException {
>>       URL requestUrl = getURL();
>> -    con = (HttpURLConnection) URLConnectionProvider.getJUMP_URLConnectionProvider().getConnection(requestUrl);
>> -    con = (HttpURLConnection) requestUrl.openConnection();
>> +    // by default we follow redirections
>> +    con = (HttpURLConnection) URLConnectionProvider.getJUMP_URLConnectionProvider().getHttpConnection(requestUrl, true);
>>
>> -    con.setConnectTimeout(Integer.parseInt(
>> -        ProxySettingsOptionsPanel.getInstance().getSetting(ProxySettingsOptionsPanel.OPEN_TIMEOUT_KEY).toString()));
>> -    con.setReadTimeout(Integer.parseInt(
>> -        ProxySettingsOptionsPanel.getInstance().getSetting(ProxySettingsOptionsPanel.OPEN_TIMEOUT_KEY).toString()));
>> -
>>       // add this service's auth info
>>       String userInfo = requestUrl.getUserInfo();
>>       if (userInfo != null) {
>> @@ -102,6 +97,7 @@
>>     public HttpURLConnection getConnection() throws IOException {
>>       if (con == null)
>>         con = prepareConnection();
>> +
>>       return con;
>>     }
>>
>> @@ -148,27 +144,32 @@
>>      */
>>     public String getText() throws IOException {
>>       HttpURLConnection con = getConnection();
>> -    return readConnection(con, 0, false);
>> +    boolean httpOk = con.getResponseCode() == HttpURLConnection.HTTP_OK;
>> +    if (!httpOk)
>> +      readToError(con);
>> +
>> +    return readConnection(con, 0);
>>     }
>>
>>     protected String readToError(HttpURLConnection con) throws IOException {
>> -    return readConnection(con, 1024, true);
>> +    String url = con.getURL().toExternalForm();
>> +    String headers = con.getHeaderFields().toString();
>> +    String result = readConnection(con, 1024);
>> +    throw new WMSException( "Request url: " + url +
>> +        "\nResponse code: " + con.getResponseCode() + "\nHeaders:\n" + headers + "\nResponse body:\n" + result);
>>     }
>>
>> -  protected String readConnection(HttpURLConnection con, long limit,
>> -      boolean throwError) throws IOException {
>> +  protected String readConnection(HttpURLConnection con, long limit) throws IOException {
>>       boolean httpOk = con.getResponseCode() == HttpURLConnection.HTTP_OK;
>>       // get correct stream
>>       InputStream in = httpOk ? con.getInputStream() : con.getErrorStream();
>> -    // limit max chars
>> -    BoundedInputStream bin = new BoundedInputStream(in, limit > 0 ? limit : -1);
>>
>> -    String result = IOUtils.toString(bin);
>> -    FileUtil.close(bin);
>> -
>> -    if (throwError) {
>> -      throw new WMSException("Response code: " + con.getResponseCode()
>> -          + "\nResponse body:\n" + result);
>> +    String result = "";
>> +    if (in!=null) {
>> +      // limit max chars
>> +      BoundedInputStream bin = new BoundedInputStream(in, limit > 0 ? limit : -1);
>> +      result = IOUtils.toString(bin);
>> +      FileUtil.close(bin);
>>       }
>>
>>       return result;
>>
>> Modified: core/trunk/src/com/vividsolutions/wms/BasicRequest.java
>> ===================================================================
>> --- core/trunk/src/com/vividsolutions/wms/BasicRequest.java    2020-01-01 09:21:44 UTC (rev 6213)
>> +++ core/trunk/src/com/vividsolutions/wms/BasicRequest.java    2020-01-04 18:58:23 UTC (rev 6214)
>> @@ -22,4 +22,5 @@
>>     public URL getURL() throws MalformedURLException {
>>       return url;
>>     }
>> +
>>   }
>>
>> Modified: core/trunk/src/com/vividsolutions/wms/FeatureInfoRequest.java
>> ===================================================================
>> --- core/trunk/src/com/vividsolutions/wms/FeatureInfoRequest.java    2020-01-01 09:21:44 UTC (rev 6213)
>> +++ core/trunk/src/com/vividsolutions/wms/FeatureInfoRequest.java    2020-01-04 18:58:23 UTC (rev 6214)
>> @@ -46,14 +46,14 @@
>>
>>     @Override
>>     public URL getURL() throws MalformedURLException {
>> -    String featInfoUrl = service.getCapabilities().getFeatureInfoURL();
>> +    String featInfoUrl = WMService.legalize(service.getCapabilities().getFeatureInfoURL());
>>
>> -    if (featInfoUrl.contains("?")) {
>> -      if (!featInfoUrl.endsWith("?"))
>> -        featInfoUrl += "&";
>> -    } else {
>> -      featInfoUrl += "?";
>> -    }
>> +//    if (featInfoUrl.contains("?")) {
>> +//      if (!featInfoUrl.endsWith("?"))
>> +//        featInfoUrl += "&";
>> +//    } else {
>> +//      featInfoUrl += "?";
>> +//    }
>>
>>       if (WMService.WMS_1_0_0.equals(version)) {
>>         featInfoUrl += "REQUEST=feature_info&WMTVER=1.0.0";
>>
>> Modified: core/trunk/src/com/vividsolutions/wms/MapRequest.java
>> ===================================================================
>> --- core/trunk/src/com/vividsolutions/wms/MapRequest.java    2020-01-01 09:21:44 UTC (rev 6213)
>> +++ core/trunk/src/com/vividsolutions/wms/MapRequest.java    2020-01-04 18:58:23 UTC (rev 6214)
>> @@ -244,7 +244,8 @@
>>           } else if ( WMService.WMS_1_3_0.equals( version ) ){
>>               ver = "REQUEST=GetMap&SERVICE=WMS&VERSION=1.3.0";
>>           }
>> -        urlBuf.append( service.getCapabilities().getGetMapURL() + ver + "&WIDTH=" + imgWidth + "&HEIGHT=" + imgHeight );
>> +        urlBuf.append(WMService.legalize(service.getCapabilities().getGetMapURL()) + ver + "&WIDTH=" + imgWidth + "&HEIGHT="
>> +            + imgHeight);
>>           try {
>>               urlBuf.append( "&LAYERS=" + encode(listToString( layerNames ), "UTF-8") );
>>           } catch (UnsupportedEncodingException e1) {
>>
>> Modified: core/trunk/src/com/vividsolutions/wms/WMService.java
>> ===================================================================
>> --- core/trunk/src/com/vividsolutions/wms/WMService.java    2020-01-01 09:21:44 UTC (rev 6213)
>> +++ core/trunk/src/com/vividsolutions/wms/WMService.java    2020-01-04 18:58:23 UTC (rev 6214)
>> @@ -50,10 +50,10 @@
>>   import javax.net.ssl.*;
>>   import javax.swing.JOptionPane;
>>
>> +import org.apache.commons.io.IOUtils;
>>   import org.openjump.util.UriUtil;
>>
>>   import com.vividsolutions.jump.I18N;
>> -import com.vividsolutions.jump.workbench.ui.ErrorDialog;
>>
>>   /**
>>    * Represents a remote WMS Service.
>> @@ -143,13 +143,13 @@
>>       }
>>
>>       try {
>> -      String requestUrlString = this.serverUrl + req;
>> +      String requestUrlString = WMService.legalize(this.serverUrl.toString()) + req;
>>         URL requestUrl = new URL(requestUrlString);
>>
>>         URLConnection con = new BasicRequest(this, requestUrl).getConnection();
>>
>> -      // Parser p = new Parser();
>> -      cap = parser.parseCapabilities(this, con.getInputStream());
>> +      String out = new BasicRequest(this, requestUrl).getText();
>> +      cap = parser.parseCapabilities(this, IOUtils.toInputStream(out) );
>>         String url1 = cap.getService().getServerUrl();
>>         String url2 = cap.getGetMapURL();
>>
>>
>> Modified: core/trunk/src/org/openjump/util/URLConnectionProvider.java
>> ===================================================================
>> --- core/trunk/src/org/openjump/util/URLConnectionProvider.java    2020-01-01 09:21:44 UTC (rev 6213)
>> +++ core/trunk/src/org/openjump/util/URLConnectionProvider.java    2020-01-04 18:58:23 UTC (rev 6214)
>> @@ -3,7 +3,9 @@
>>   import com.vividsolutions.jump.I18N;
>>   import com.vividsolutions.jump.util.Blackboard;
>>   import com.vividsolutions.jump.workbench.JUMPWorkbench;
>> +import com.vividsolutions.jump.workbench.Logger;
>>   import com.vividsolutions.jump.workbench.plugin.PlugInContext;
>> +import com.vividsolutions.jump.workbench.ui.network.ProxySettingsOptionsPanel;
>>   import com.vividsolutions.jump.workbench.ui.plugin.PersistentBlackboardPlugIn;
>>
>>   import javax.net.ssl.HttpsURLConnection;
>> @@ -12,8 +14,10 @@
>>   import javax.net.ssl.X509TrustManager;
>>   import javax.swing.*;
>>   import java.io.IOException;
>> +import java.net.HttpURLConnection;
>>   import java.net.URL;
>>   import java.net.URLConnection;
>> +import java.net.URLDecoder;
>>   import java.security.KeyManagementException;
>>   import java.security.NoSuchAlgorithmException;
>>   import java.security.cert.X509Certificate;
>> @@ -49,13 +53,63 @@
>>       this.authorizedURL = (Set<String>)this.blackboard.get(KEY, new HashSet<String>());
>>     }
>>
>> +  public HttpURLConnection getHttpConnection(URL url, boolean followRedirects) throws IOException {
>> +    HttpURLConnection connection = (HttpURLConnection) getHttpConnection(url);
>> +
>> +    // we handle redirects ourselfs
>> +    connection.setInstanceFollowRedirects(false);
>> +
>> +    URL prev = null, next = connection.getURL();
>> +    while (followRedirects && !next.equals(prev) ) {
>> +      connection = getHttpConnection(next);
>> +      // we handle redirects ourselfs
>> +      connection.setInstanceFollowRedirects(false);
>> +
>> +      switch (connection.getResponseCode())
>> +      {
>> +         case HttpURLConnection.HTTP_MOVED_PERM:
>> +         case HttpURLConnection.HTTP_MOVED_TEMP:
>> +            String location = connection.getHeaderField("Location");
>> +            location = URLDecoder.decode(location, "UTF-8");
>> +            prev = connection.getURL();
>> +            next = new URL(prev, location);  // compute relative URLs
>> +            Logger.warn("Follow http redirect to: "+next);
>> +            continue;
>> +      }
>> +      break;
>> +    }
>> +
>> +    return connection;
>> +  }
>> +
>> +  /**
>> +   * @deprecated use getHttpConnection(url,followRedirects) instead
>> +   * @param url
>> +   * @return
>> +   * @throws IOException
>> +   */
>> +  @Deprecated
>>     public URLConnection getConnection(URL url) throws IOException {
>> +    return getHttpConnection(url, true);
>> +  }
>> +
>> +  public HttpURLConnection getHttpConnection(URL url) throws IOException {
>>       String protocol = url.getProtocol();
>> -    if (!protocol.equals("https")) return url.openConnection();
>> -    URLConnection connection;
>> +//    if (!protocol.equals("https")) return url.openConnection();
>> +
>> +    if (!protocol.matches("^(?i:https?)$"))
>> +      throw new IOException("Please provide an http(s):// url.");
>> +
>> +    HttpURLConnection connection = (HttpURLConnection)url.openConnection();
>> +
>> +    // apply timeouts from settings
>> +    connection.setConnectTimeout(Integer.parseInt(
>> +        ProxySettingsOptionsPanel.getInstance().getSetting(ProxySettingsOptionsPanel.OPEN_TIMEOUT_KEY).toString()));
>> +    connection.setReadTimeout(Integer.parseInt(
>> +        ProxySettingsOptionsPanel.getInstance().getSetting(ProxySettingsOptionsPanel.READ_TIMEOUT_KEY).toString()));
>> +
>>       try {
>> -      setTrustOption(false, null);
>> -      connection = url.openConnection();
>> +      setTrustOption(false, url);
>>         connection.connect(); // try to connect
>>         return connection;    // can connect
>>       } catch(IOException|KeyManagementException|NoSuchAlgorithmException e) {
>> @@ -63,7 +117,7 @@
>>         if (authorizedURL.contains(baseURL) || acceptConnection(url)) {
>>           try {
>>             setTrustOption(true, url);
>> -          connection = url.openConnection();
>> +          connection = (HttpURLConnection) url.openConnection();
>>             authorizedURL.add(baseURL);
>>             //setTrustOption(false, null);
>>             return connection;
>> @@ -96,15 +150,22 @@
>>     };
>>     private Set<URL> trustedURLs = new HashSet<>();
>>
>> -  private void setTrustOption(boolean trust, URL url)
>> -          throws KeyManagementException, NoSuchAlgorithmException {
>> +  /**
>> +   *
>> +   * @param trust
>> +   * @param url
>> +   * @throws KeyManagementException
>> +   * @throws NoSuchAlgorithmException
>> +   */
>> +  private void setTrustOption(boolean trust, URL url) throws KeyManagementException, NoSuchAlgorithmException {
>>       SSLContext sc = SSLContext.getInstance("SSL");
>> +    String host = url != null ? url.getHost() : "";
>>       if (trust || (url != null && trustedURLs.contains(url))) {
>> -      System.out.println("Set the trust manager to not check certificates");
>> -      sc.init(null, new TrustManager[]{trm}, null);
>> +      Logger.info("Certificate verification for trusted host '" + host + "' is disabled'");
>> +      sc.init(null, new TrustManager[] { trm }, null);
>>         trustedURLs.add(url);
>>       } else {
>> -      System.out.println("Set the trust manager to check certificates");
>> +      Logger.info("Using the system trust manager to verify certificate for host '"+host+"'.");
>>         sc.init(null, null, null);
>>       }
>>       HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
>>
>>
>>
>> _______________________________________________
>> Jump-pilot-devel mailing list
>> Jump-pilot-devel at lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel
>>
>>
>> _______________________________________________
>> Jump-pilot-devel mailing list
>> Jump-pilot-devel at lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel


_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list