Java nanoHTTP multiple directory listing

matzedonier

Cadet 1st Year
Registriert
Feb. 2011
Beiträge
8
So Hallo Leute,

bin hier gerade über nen schönen Thread über nano HTTP gestoßen und bin ziemlich begeistert gewesen auf den ersten Blick.
Jetzt hab ich gleich was mit gecodet und funktioniert vom Prinzip auch super.

Aber jetzt stehe ich vor einem Problem, ich will eine kleine Anwendung schreiben mit der ich "daten" freigeben kann. Sprich Ich starte das Programm und der Benutzer wählt aus
C:\Eigene Dateien und D:\Sicherung, diese Directorys will ich dann über den nanoHTTPD freigeben/listen.

mit einem Single Directory funktioniert das wunderbar,über die integrierte Funktion von NanoHTTP.
Jetzt habe ich mir gedacht ok, machste einfach ne dynamisch generierte HTML Page wo dir den Inhalt der Dirs anzeigt.
So sieht mein provisorischer Code aus, keine Ahnung ob der jetzt lauffähig ist, nicht getest weil mir beim Programmieren mein Problem eingefallen ist:
Code:
public class HTTPServer extends NanoHTTPD
{
	public HTTPServer() throws IOException
	{
		super(8080);
	}

	public Response serve( String uri, String method, Properties header, Properties parms, Properties files )
	{
		System.out.println( method + " '" + uri + "' " );
		
		
		String msg = "<html><body><h1>FileList of <username></h1>\n";
		msg += "<table border=0>";
		File ListDir;
		
		if( parms.getProperty("subDir") == null)
		{ 
			ListDir = new File("D:\\");
		}
		else
		{
			ListDir = new File(parms.getProperty("subDir"));
		}
		File[] FileList = ListDir.listFiles();
		for(int i = 0; i < FileList.length ; i++)
		{
	    	try
	    	{
	    		if(!FileList[i].isHidden() && FileList[i].canRead() && FileList[i].exists())
	
		    		if(FileList[i].isDirectory())
		    		{
			    			msg += "<tr><td><a href=" + FileList[i].getAbsolutePath() + ">+" + FileList[i].getCanonicalPath() + "</a>";
				    }
		    		else
		    		{	
		    			msg += "<tr><td><a href=" + FileList[i].getAbsolutePath() + ">" + FileList[i].getCanonicalPath() + "</a>";
		    		}
	    	}
	    	catch(IOException e)
	    	{
	    		e.printStackTrace();
	    	}
    	}
		return new NanoHTTPD.Response( HTTP_OK, MIME_HTML, msg );
	}

}

Das würde mir jetzt so wie ich mir das vorstelle eine FileListe zusammenbauen vom hardcoded directory "D:\". Allerdings und jetzt kommt der knackpunkt, nur weil da der Dateipfad steht hab ich ja noch lang kein Access auf die Datei über den HTTP Server.

Vielleicht hat einer von euch schon was mit nanoHTTP gemacht, und könnte mir helfen.


grüße

xasz (mein nick war schon reserviert, deshalb mein alter: matzedonier)
 
Wenn der Client ein GET-Request schickt, dann musst du die passenden HTTP-Header und den Dateiinhalt zurückschicken. Der Client (=Browser) zeigt dann einen Dateidownload an.
Also vom Prinzp her habe ich es verstanden, leider habe ich es nicht hinbekommen umzusetzten, es ist vielleicht ein bisschen viel verlangt, aber hättest du mir eventuell ein kleines CodeBeispiel, das wäre echt super.

gruß xasz
 
Code:
HTTP/1.0 200 OK
Date: Fri, 31 Dec 1999 23:59:59 GMT
Content-Type: text/plainl
Content-Length: 1354

Dateiinhalt
So könnte zB die Antwort eines Servers aussehen. Content-Type legt fest, welche Art Datei übertragen wird, damit der Browser richtig auf eine Datei reagieren kann.
Beachte, dass vor dem Dateiinhalt unbedingt eine Leerzeile kommen muss.

In deinem Code oben müsste diese Antwort in msg gespeichert werden und MIME_HTML entsprechend geändert werden.
 
Mit der Antwort vom Server ist mir soweit klar, mein Problem ist ( vielleicht denk ich auch wieder zu kompliziert), dass ich net weis wie der "link" zur Datei aussehen soll.

Nehmen wir an ich geh mit dem Browser auf den Server und bekomme die Directory List.

Wobei ja jetzt zum Beispiel ein Link der Datei so aussähe
HTML:
<a href ="D:\testdatei.htm">testdatei.htm</a>
.

Da ja die Dateiliste von mir aber garnicht über die HTTP-Server Directory List ausgegen wurde,
sonstn im Prinzip von meinem Code nur ein "Textdokument" erstellt wurde, weiß der HTTP-Server nichts von der Datei und kann diese mit diesen obigen Link natürlich auch nicht finden.

gruß xasz

edit: Es hilft vielleicht zum Problem verständis noch bei.

Wenn ich einen Webroot-Ordner hätte, wie z.b. /var/www/ oder so und dort liegt eine Datei namens datei.txt, dann kann ich diese ja einfach wieder <a href="serveradresse/datei.txt"> laden, allerdings liegen meine ordner nicht in einem webroot-ordner, sondern der eine ordner z.B: auf D:\Daten und der andere auf E:\Daten.
 
Zuletzt bearbeitet:
Mir ist schon klar das Java überall Dateien lesen kann...

Aber ich habe ja als Client der auf den Server connectet gar keine Rechte.

Wenn ich in den Link D:\daten eingebe, und der Ordner befindet sich nicht im www-root verzeichnis, wird der client dort niemals zugreifen dürfen.

Das wäre ja eine rießige Sicherheitslücke, wenn ich als abrufender Client einfach irgendein Pfad übergeben darf, und die Datei bekomme, dann könnte ich ja Systemresourcen angeben oder sonstiges.

edit:

So als Beispiel: es ist ja auch nicht möglich, nehmen wir an ein Windows Server mit IIS:
link auf http://serverurl/C:\file.wichtig. Das erlaubt ja der http serve rnicht und genau das ist grad mein Problem.
 
Zuletzt bearbeitet:
Natürlich erlaubt der HTTP-Server derartige Links, wenn du es einprogrammierst.
Hier würde der Browser ein "GET http://serverurl/C:%5Cfile.wichtig" an den Server schicken. Dein HTTP-Server muss nur noch das "GET http://serverurl/" aus dem String streichen und schon hast du doch den absoluten Pfad. Auf den kann der Server doch dann zugreifen und das Verzeichnis bzw. die Datei auslesen.

Ich verstehe echt nicht, wo das Problem sein soll.


Natürlich ist das eine Sicherheitslücke, wenn du keine Sicherungsmaßnahmen wie Passwortabfragen etc. einbaust.
 
Zurück
Oben