Very basic authentication Support für den Audioplayer

geeki
Neugieriger
Neugieriger
Beiträge: 11
Registriert: Donnerstag 31. März 2005, 12:10

Very basic authentication Support für den Audioplayer

Beitrag von geeki »

Hi, :)

das ist mein erster kleiner aktiver Beitrag zur Entwicklung von tuxbox. Daher verzeit bitte, falls das hier nicht die richtig Anlaufstelle ist...

Mir ist heute aufgefallen, dass der Audioplayer für das icy Protokoll (bzw. netfile.cpp) keinerlei Authentifizierung unterstützt, wie man es aber leider z.B. für die Premium-Kanäle von sky.fm braucht.

Daher hier ein kleiner dummer Patch, der zumindest extrem rudimentären Support für username:passwort login bereitstellt (wie man es eben z.B. für sky.fm braucht).
Damit man username:passwort wirklich komfortabel angeben könnte, bräuchte man noch eine base64-Encoding-Funktion. Aber ich für meinen Teil kann damit leben, dies vorher z.B. mit
# echo -n "username:password" | base64
selbst umzuwandeln.

Patch: http://f-seidel.de/linux/downloads/add_ ... lity.patch

Gruß,
Frank
Houdini
Developer
Beiträge: 2183
Registriert: Mittwoch 10. Dezember 2003, 07:59

Beitrag von Houdini »

Schau mal ob das dich weiterbringt:

Code: Alles auswählen

Index: netfile.cpp
===================================================================
RCS file: /cvs/tuxbox/apps/tuxbox/neutrino/src/driver/netfile.cpp,v
retrieving revision 1.28
diff -u -r1.28 netfile.cpp
--- netfile.cpp	5 Jun 2006 23:36:21 -0000	1.28
+++ netfile.cpp	12 Apr 2007 20:59:53 -0000
@@ -56,11 +56,15 @@
 | shoutcast example:                                                           |
 |                                                                              |
 |	fd = fopen("icy://find.me:666/funky/station/", "r");                   |
+|       or                                                                     |
+|       fd = fopen("icy://dXNlcjpwYXNzd29yZA==@find.me:666/station", "r");     |
 |	                                                                       |
 |	This is a low level mechanism that can be used for all                 |
 |	shoutcast servers, but it mainly is intended to be used for            |
 |	private radio stations which are not listed in the official            |
 |	shoutcast directory. The stream is opened read-only.                   |
+|       The second format contains a base64 encoded string before '@'          |
+|       of username:passwort to be sent for basic authentication.              |
 |	                                                                       |
 | file access modes, selectable by the fopen 'access type':                    |
 |	                                                                       |
@@ -94,6 +98,8 @@
 \******************************************************************************/
 #include "netfile.h"
 #include "global.h"
+
+#include "resolv.h"
 /*
 TODO:
 	- ICECAST support
@@ -381,9 +387,24 @@
 		    send(url->fd, str, strlen(str), 0);
 		  }
 
-		  sprintf(str, "User-Agent: %s\r\n\r\n", "RealPlayer/4.0");
-		  dprintf(stderr, "> %s", str);
-		  send(url->fd, str, strlen(str), 0);
+		sprintf(str, "User-Agent: %s\r\n", "RealPlayer/4.0");
+		dprintf(stderr, "> %s", str);
+		send(url->fd, str, strlen(str), 0);
+
+		if (url->logindata[0])
+		{
+			char coded_data[2048];
+			if(b64_ntop((const u_char*)url->logindata, strlen(url->logindata), coded_data, sizeof(coded_data)) < 0)
+				sprintf(str, "Authorization: Basic %s\r\n", url->logindata);
+			else
+				sprintf(str, "Authorization: Basic %s\r\n", coded_data);
+			dprintf(stderr, "> %s", str);
+			send(url->fd, str, strlen(str), 0);
+		}
+
+		sprintf(str, "\r\n"); /* end of headers to send */
+		dprintf(stderr, "> %s", str);
+		send(url->fd, str, strlen(str), 0);
 
 		  if( (meta_int = parse_response(url, &id3, &tmp)) < 0)
 		    return -1;
@@ -1756,6 +1777,7 @@
 
 /**************************** utility functions ******************************/
 void parseURL_url(URL& url) {
+  char buffer[2048];
 
   /* now lets see what we have ... */
 
@@ -1767,6 +1789,7 @@
     strcpy(url.file, url.url);
     url.host[0] = 0;
     url.port = 0;
+    url.logindata[0] = 0;
   }
   else
   {
@@ -1800,6 +1823,17 @@
     ptr = strchr(url.host, '/');
     if(ptr) *ptr = 0;
 
+    if ((ptr = strchr(url.host, '@')))
+    {
+      *ptr = 0;
+      strcpy(url.logindata, url.host);
+      strcpy(buffer, ptr + 1);
+      strcpy(url.host, buffer);
+    }
+    else
+      url.logindata[0] = 0;
+
+
     ptr = strrchr(url.host, ':');
 
     if(ptr)
Index: netfile.h
===================================================================
RCS file: /cvs/tuxbox/apps/tuxbox/neutrino/src/driver/netfile.h,v
retrieving revision 1.9
diff -u -r1.9 netfile.h
--- netfile.h	16 May 2005 00:15:18 -0000	1.9
+++ netfile.h	12 Apr 2007 20:59:53 -0000
@@ -102,6 +102,7 @@
   char entity[2048];	/* data to send on POST requests */
   int 	fd;		/* filedescriptor of the file*/
   FILE	*stream;	/* streamdescriptor */
+  char  logindata[2048];/* login data (username:password) */
 } URL;
 
 typedef struct
und dass noch (upnp/xml wieder rausnehmen)

Code: Alles auswählen

Index: Makefile.am
===================================================================
RCS file: /cvs/tuxbox/apps/tuxbox/neutrino/src/Makefile.am,v
retrieving revision 1.33
diff -u -r1.33 Makefile.am
--- Makefile.am	5 Mar 2007 07:03:39 -0000	1.33
+++ Makefile.am	12 Apr 2007 20:55:29 -0000
@@ -10,6 +10,7 @@
 	@CONFIGFILE_CFLAGS@ \
 	@NET_CFLAGS@ \
 	@ZAPIT_CFLAGS@ \
+	@UPNPCLIENT_CFLAGS@ \
 	@TUXTXT_CFLAGS@
 
 bin_PROGRAMS = neutrino
@@ -49,6 +50,9 @@
 	@MPEGTOOLS_LIBS@ \
 	@VORBISIDEC_LIBS@ \
 	@TUXTXT_LIBS@ \
+	@XMLTREE_LIBS@ \
+	@UPNPCLIENT_LIBS@ \
+	-lresolv \
 	-ljpeg \
 	-lpthread \
 	@XML_LIBS@
geeki
Neugieriger
Neugieriger
Beiträge: 11
Registriert: Donnerstag 31. März 2005, 12:10

Beitrag von geeki »

Hallo Houdini,

erstmal vielen Dank für Deine Antwort :D
Ja, das dürfte es auf alle Fälle lösen. Leider hat mich meine Suche nach einer base64 encoding Funktion (mit grep) natürlich nicht auf b64_ntop aus libresolv gestoßen...
so kam es, dass ich gerade eben - leider noch bevor ich Dein Posting hier gesehen habe - selbst noch eine primitve base64_encode Funktion direkt mit eingebaut habe.

Die hätte den winzigen Vorteil, dass sie keine neue Abhängigkeit nachzieht.. andererseits ist in meiner base64_encode-Funktion bestimmt n böser Bug (oder gleich mehrere :wink: ).. da mir die Lizenz vom base64-code auf sourceforge etwas komisch vorkam, hab ich es nach der Anleitung auf wikipedia selbst nachprogrammiert... ist hier (mit sky.fm) getestet und funktioniert, aber natürlich ist es sauberer auf schon vorhandenen und relativ bugfreien Code zurückzugreifen.

Trotzdem der Vollständigkeit halber: http://f-seidel.de/linux/downloads/add_ ... y_v2.patch

Viele Grüße,
Frank
geeki
Neugieriger
Neugieriger
Beiträge: 11
Registriert: Donnerstag 31. März 2005, 12:10

Beitrag von geeki »

Wäre die eine oder andere Version es vielleicht wert, dass sie ins cvs aufgenommen werden kann?

Ich könnte das jetzt zwar schon selber machen, bin mir aber nicht völlig sicher, weilche der beiden letzten Versionen die von den meisten bevorzugte sein wird?

Gruß,
Frank

P.S.: Houdini? ist das ok, das hier zu diskutieren oder besser auf der cvs Mailingliste?
Houdini
Developer
Beiträge: 2183
Registriert: Mittwoch 10. Dezember 2003, 07:59

Beitrag von Houdini »

Sowas sollte genau hier diskutiert werden.

Ich habe meine Version nicht getestet, sie kompiliert abe zumindest.
Check das ein was du für richtig hältst (wenns funktioniert) :-)
geeki
Neugieriger
Neugieriger
Beiträge: 11
Registriert: Donnerstag 31. März 2005, 12:10

Beitrag von geeki »

Ok, code ist (mit zwei kleinen Korrekturen) commited :)
Jetzt fehlt nurnoch eine entsprechende Ergänzung der Audioplayer-Wikipage. Aber damit warte ich mal lieber, bis der Code auch zumindest über ein Snapshot-Image verfügbar ist, bevor es hier im Board noch enttäuschte User-Beschwerden gibt ;-)

Gruß,
Frank