Das Notes Forum

Lotus Notes / Domino Sonstiges => Java und .NET mit Notes/Domino => Thema gestartet von: Scorp am 26.09.03 - 10:02:00

Titel: Durch die Firewall
Beitrag von: Scorp am 26.09.03 - 10:02:00
Hi!

Ich will mit einem Javaagenten, auf Internet seiten zugreifen.
Das Problem ist aber das ich nicht weis wie ich an unserer Firewall vorbeikomme, mit welchen routinen kann man den Proxyserver ansteuern?
Titel: Re:Durch die Firewall
Beitrag von: Axel Janssen temp am 26.09.03 - 10:50:28
Bei den Klassen aus java.net.*:
Code
System.setProperty( "proxySet", "true" );
System.setProperty( "http.proxyHost", "xxx" );
System.setProperty( "http.proxyPort", "xxx" );


System.setProperty("http.proxyUser", "xxx");
System.setProperty("http.proxyPassword", "xxx"); 

@see http://www.javaworld.com/javatips/jw-javatip42_p.html

Titel: Re:Durch die Firewall
Beitrag von: Scorp am 26.09.03 - 11:07:56
Cool Danke!

Werds gleich mal testen!
Java ist nämlich nicht grad meine Stärke.
Titel: Re:Durch die Firewall
Beitrag von: Scorp am 26.09.03 - 11:49:09
kann jemand mir sagen was diese Fehlermeldungen zu sagen haben? Ich kannte mal ne Website da standen die erklärungen zu Fehlermeldungen, keine Ahnung wo ich die jetzt hab.

java.io.FileNotFoundException: http://www.gmx.de
   at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:595)
   at java.net.URL.openStream(URL.java:825)
   at JavaAgent.NotesMain(JavaAgent.java:39)
   at lotus.domino.AgentBase.runNotes(Unknown Source)
   at lotus.domino.NotesThread.run(NotesThread.java:208)

Wenn ihr den Source Code dazu benötigt kann ich den auch reinposten.
Titel: Re:Durch die Firewall
Beitrag von: Semeaphoros am 26.09.03 - 12:57:32
Hint: Also, wenn Du keine Fehlermeldungen generierst, brauchst Du den Link auch nicht mehr zu finden   *smile*
Titel: Re:Durch die Firewall
Beitrag von: Axel Janssen temp am 26.09.03 - 13:11:04

Wenn ihr den Source Code dazu benötigt kann ich den auch reinposten.
ja bitte.

Titel: Re:Durch die Firewall
Beitrag von: Scorp am 26.09.03 - 13:25:35
hier der komplette SourceCode:

import lotus.domino.*;
import java.util.Vector;
import java.net.*;
import java.io.*;


public class JavaAgent extends AgentBase {

    public void NotesMain() {

     try {
       Session session = getSession();
       AgentContext agentContext = session.getAgentContext();

       // (Your code goes here)
       Database db = agentContext.getCurrentDatabase();
       Agent agent = agentContext.getCurrentAgent();
       // Get document used for passing data
       Document doc =  db.getDocumentByID(agent.getParameterDocID());

   Vector items = doc.getItems();
   
   Item item = (Item)items.elementAt(0);
     String s = item.getName();
   item.remove();
   String fkt = "";

                System.out.println("Prüfe: "+s);
              try {
            System.setProperty( "proxySet", "true" );
            System.setProperty( "http.proxyHost", "xxx" );
            System.setProperty( "http.proxyPort", "xxx" );

            System.setProperty("http.proxyUser", "xxx");
            System.setProperty("http.proxyPassword", "xxx");
 
                   URL url = new URL(s);
                    InputStream in = url.openStream();
                    in.close();
 
                   System.out.println("URL ist da: "+s);
                    fkt = "Yes";
   
                  }
              catch (MalformedURLException e) //URL nicht da
                 {
                     System.out.println("URL not found: " + s);
                     fkt = "No";
                            }
              catch (UnknownHostException e)
                 {
                     System.out.println("Unknown Host: " + s);
   
                     }
             catch (SocketException e)
                 {
                     System.out.println("SocketConnectiont: " + s);
          ////
                     }
              catch (Exception e)
                  {
                    e.printStackTrace();
                    }
       
    RichTextItem rtitem = doc.createRichTextItem(fkt);

   doc.save();
       } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

Titel: Re:Durch die Firewall
Beitrag von: Axel_Janssen am 28.09.03 - 12:44:48
Hi Scorp,

mein posting vom Freitag ist keine Lösung. :-\

Durch die Firewall mit HttpUrlConnection zu kommen ist leider kein wirklich triviales Problem. Es gibt in google einige Lösungen (suche +HttpUrlConnection +Firewall). Ich habe zur Zeit leider wenig Zeit, werde aber auch nach einer Lösungsimplementierung suchen.

Wenn du selbst nach Lösungen suchst, nehme den code aus dem Artikel im Attachment. In deinem code sind ein paar sonstige Fehler drin. Die FileNotFoundException ist aber ein klarer Hinweis darauf, dass dein HttpGetRequest nicht durch die Firewall kommt. Dies ist ein Textausschnitt eines älteren Sun Tutorials, das ich leider nicht mehr auf der Sun Seite finden kann.  

Gruß Axel
Titel: Re:Durch die Firewall
Beitrag von: Scorp am 29.09.03 - 08:13:00
Okay, danke aber erstmal, mal schaun ob ich was rausfinden kann.
 :)
Titel: Re:Durch die Firewall
Beitrag von: Axel Janssen temp am 29.09.03 - 18:21:30
ich gebe diesem Weg große Chancen:
Zitat
[question]
I am trying to work with a java.net.HttpURLConnection object on a http:// url. The JVM runs behind a firewall. I do get a response code of 200 (OK), but only 'sometimes'. Most of the times I get a "HTTP/1.1 407 Proxy Authorization Required" message.

Also, if I use a https:// url, I get the same 407 message.

Can anyone explain this inconsistency? Please help.

-Nikhil
[/question]
[answer]
Van Glass: In order to do proxy authentication you must send the Proxy username and password base64 encoded within the Proxy-Authorization header.

JSCAPE - Java Networking Components www.jscape.com
[answer]
Titel: Re:Durch die Firewall
Beitrag von: Axel Janssen temp am 29.09.03 - 18:30:19
Der andere Weg wird  hier beschrieben:
http://www.developer.com/java/other/article.php/1551421
Titel: Re:Durch die Firewall
Beitrag von: Axel Janssen temp am 29.09.03 - 19:29:17
Benoits Marchals Artikel oben brachte die Lösung... und eine gute theoretische Erklärung.

Zitat
Increasingly, companies require employees to log in to the proxy before accessing the Internet. Login is used to better monitor Internet usage; for example, to monitor what sites are visited.
... und wie oben angemerkt, erwarten die meisten Proxies Username, Password Base64 encoded. Vermutlich funktioniert deshalb die Lösung vom Freitag mit dem username und password property nicht (wird nicht base64 encoded)

Die zweite Lösung funktioniert problemlos.
Bei der ersten Lösung stellt sich zumindest in Domino6 die Notes-Java-Agent-Security in den Weg.
Ich habs nicht ausprobiert, aber hier ist wohl die Lösung, um dieses Problem auszuschalten.
diskussion auf notes.net (http://www-10.lotus.com/ldd/nd6forum.nsf/55c38d716d632d9b8525689b005ba1c0/4fef6974711aece385256d950053c4a2?OpenDocument&Highlight=0,java.policy)

wie gesagt: Agent2 läuft hier problemlos. Wäre nett, wenn das andere hinter Firmenfirewalls auch mal ausprobieren könnten:

DEIN_NAME, DEIN_PASSWORT, DEIN_PROXY mit eigenen Werten ersetzen.

lsg 1: scheitert an Policy, die verändert werden kann.
Code
import lotus.domino.*;

import java.io.*;
import java.net.*;
import java.util.*;

public class JavaAgent extends AgentBase {

   public void NotesMain() {

      try {
         Session session = getSession();
         AgentContext agentContext = session.getAgentContext();

         // (my code walks here)
String url = "http://www.marchal.com/",
       proxy = "DEIN_PROXY",
       port = "8080",
       username = "DEIN_NAME",
       password = "DEIN_PASSWORT";
Authenticator.setDefault(new SimpleAuthenticator(
                        username,password));
URL server = new URL(url);
Properties systemProperties = System.getProperties();
systemProperties.setProperty("http.proxyHost",proxy);
systemProperties.setProperty("http.proxyPort",port);
HttpURLConnection connection = (
    HttpURLConnection)server.openConnection();
connection.connect();
InputStream in = connection.getInputStream();

BufferedReader inReader = new BufferedReader(new InputStreamReader(in));
        String inputLine;

        while ((inputLine = inReader.readLine()) != null) 
            System.out.println(inputLine);
      
         // (my code stops here) 

      } catch(Exception e) {
         e.printStackTrace();
      }
   }
   
   
      
}

class SimpleAuthenticator
   extends Authenticator
{
   private String username,
                  password;
                     
   public SimpleAuthenticator(String username,String password)
   {
      this.username = username;
      this.password = password;
   }
   
   protected PasswordAuthentication getPasswordAuthentication()
   {
      return new PasswordAuthentication(
             username,password.toCharArray());
   }
}


lsg2 funktioniert:
Code
import lotus.domino.*;
import java.io.*;
import java.net.*;
public class JavaAgent extends AgentBase {

   public void NotesMain() {

      try {
         Session session = getSession();
         AgentContext agentContext = session.getAgentContext();

int port = 8080;
String url = "http://www.marchal.com/",
       proxy = "DEIN_PROXY",
       
       authentication = "DEIN_NAME!!!:DEIN_PASSWORT";
URL server = new URL(url);
Socket socket = new Socket(proxy,port);
Writer writer = new OutputStreamWriter(socket.getOutputStream(),
                                       "US-ASCII");
writer.write("GET " + server.toExternalForm() + " HTTP/1.0\r\n");
writer.write("Host: " + server.getHost() + "\r\n");
writer.write("Proxy-Authorization: Basic "
             + new sun.misc.BASE64Encoder().encode(
               authentication.getBytes())
             + "\r\n\r\n");
writer.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(
                            socket.getInputStream(),"US-ASCII"));
String line = reader.readLine();
if(line != null && line.startsWith("HTTP/"))
{
   int sp = line.indexOf(' ');
   String status = line.substring(sp + 1,sp + 4);
   if(status.equals("200"))
   {
 while ((line = reader.readLine()) != null) {
            System.out.println(line);      }
   }
   else
      throw new FileNotFoundException("Host reports error " +
                                       status);
}
else
   throw new IOException("Bad protocol");
reader.close();
writer.close();
socket.close();

      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}

Titel: Re:Durch die Firewall
Beitrag von: Scorp am 30.09.03 - 07:26:58
GEIL!!!!! :D

Vielen Dank an alle die mir in meinen 3 Postings hier im "JAVA für Anfänger" geholfen haben!
Vor allem an "Axel_Janssen" der nicht (öffenltich  ;) ) die Nerven wegen meinen Fragen verloren hat.
Also habe jetzt den 2-ten Code ausprobiert und er arbeitet tadellos.
Titel: Re:Durch die Firewall
Beitrag von: Scorp am 21.10.03 - 09:59:51
Hi nochmal nen hoffentlich kleines Problem, habe jetzt die Lösung 2 in mein Programm eingebaut, funktioniert auch weitgehend sehr gut.

Doch ein Problem hab ich noch, er (der Agent) erkennt z.B. "http://www.alpa.ch/alpa/" als nicht vorhanden (404), sie existiert aber
auch "http://www.adobe.de/products/acrobat/readstep.html"
kann er nicht aufrufen, gibt es dafür einen speziellen  Grund und wenn ja kann man dieses Problem umgehen?
Titel: Re:Durch die Firewall
Beitrag von: Semeaphoros am 21.10.03 - 10:19:52
<OT>
Mensch, da kriegt ja das Portemonnaie gleich ein Loch, wenn man die Site schon nur anschaut .... :-))
</OT>
Titel: Re:Durch die Firewall
Beitrag von: Scorp am 21.10.03 - 10:35:12
:-)
Stimmt wohl!
Ich will sie ja auch nur auf vorhandensein testen, nichts kaufen. ;-)
Titel: Re:Durch die Firewall
Beitrag von: Semeaphoros am 21.10.03 - 11:03:50
Aha, deshalb willst Du das per Programm machen anstatt sie selber anzuschauen ..... harte Security-Policy, aber effizient ......  ;D
Titel: Re:Durch die Firewall
Beitrag von: Axel Janssen temp am 21.10.03 - 11:30:47
kümmere mich am wochenende drum, weil ich wg. wichtigen Präsentationstermin nächsten Mittwoch mein Zeitmanagement straffen muß.  
Titel: Re:Durch die Firewall
Beitrag von: Axel_Janssen am 26.10.03 - 14:14:38
Komisch beide Urls funktionieren ohne firewall mit diesem Java-Standalone Programm.

Code
/* UrlTest.java
* Created on 26.10.2003
*/

import java.net.*;
import java.io.*;

/**
* Add one sentence class summary here.
* Add class description here.
*
* @author Axel
* @version 1.0, 26.10.2003
*/
public class UrlTest {

   /**
    * 
    */
   public UrlTest() {
      super();
      // TODO Auto-generated constructor stub
   }

   public static void main(String[] args) {
      
      try {
      
      URL yahoo = new URL("http://www.adobe.de/products/acrobat/readstep.html");
      BufferedReader in =
         new BufferedReader(new InputStreamReader(yahoo.openStream()));

      String inputLine;

      while ((inputLine = in.readLine()) != null)
         System.out.println(inputLine);

      in.close();
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

Werds Montag hinter der Firmenfirewall mit dem Agent ausprobieren.

Ein Grund kann sein, dass der Server Zugriff aus Java nicht zulässt (Etwa um den Zugriff von Robots und Webspidern auszuschliessen).
Im http-Request header steht nämlich Java-Agent. Einen Grund für solche Einstellungen bei den genannten Hosts kann ich mir nicht vorstellen.
Titel: Re:Durch die Firewall
Beitrag von: Scorp am 27.10.03 - 07:10:59
Hmm, komisch! Aber danke erstmal für die mühen.