Commit efe8a04c authored by Warren Dukes's avatar Warren Dukes

validate url's before adding to playlist

git-svn-id: https://svn.musicpd.org/mpd/trunk@1289 09075e82-0dd4-0310-85a5-a0d7c8717e4f
parent bef55ff3
1) play streams 1) play streams
a) put some sort of error reporting for streaming/inputStream! a) put some sort of error reporting for streaming/inputStream!
2) http stuff 2) ACK error codes
a) ensure URL's are all ASCII, and properly %'d! check rfc's
for legal characters
3) ACK error codes 3) cleanup main()
4) cleanup main() 4) handle '\n' in filenames
5) handle '\n' in filenames 5) compute average replaygain to use for non-replaygain songs
6) compute average replaygain to use for non-replaygain songs 6) change default port to 6600
7) change default port to 6600
Post-1.0 Post-1.0
......
...@@ -256,13 +256,19 @@ void decodeStart(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) { ...@@ -256,13 +256,19 @@ void decodeStart(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) {
int ret; int ret;
InputStream inStream; InputStream inStream;
InputPlugin * plugin; InputPlugin * plugin;
char path[MAXPATHLEN+1]; char * path;
if(isRemoteUrl(pc->utf8url)) { if(isRemoteUrl(pc->utf8url)) {
strncpy(path, pc->utf8url, MAXPATHLEN); path = utf8StrToLatin1Dup(pc->utf8url);
} }
else strncpy(path, rmp2amp(utf8ToFsCharset(pc->utf8url)), MAXPATHLEN); else path = strdup(rmp2amp(utf8ToFsCharset(pc->utf8url)));
path[MAXPATHLEN] = '\0';
if(!path) {
dc->error = DECODE_ERROR_FILE;
dc->state = DECODE_STATE_STOP;
dc->start = 0;
return;
}
dc->metadataSet = 0; dc->metadataSet = 0;
memset(dc->metadata, 0, DECODE_METADATA_LENGTH); memset(dc->metadata, 0, DECODE_METADATA_LENGTH);
...@@ -275,9 +281,9 @@ void decodeStart(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) { ...@@ -275,9 +281,9 @@ void decodeStart(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) {
if(openInputStream(&inStream, path) < 0) { if(openInputStream(&inStream, path) < 0) {
dc->error = DECODE_ERROR_FILE; dc->error = DECODE_ERROR_FILE;
dc->start = 0;
dc->stop = 0;
dc->state = DECODE_STATE_STOP; dc->state = DECODE_STATE_STOP;
dc->start = 0;
free(path);
return; return;
} }
...@@ -291,6 +297,7 @@ void decodeStart(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) { ...@@ -291,6 +297,7 @@ void decodeStart(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) {
if(dc->stop) { if(dc->stop) {
dc->state = DECODE_STATE_STOP; dc->state = DECODE_STATE_STOP;
dc->stop = 0; dc->stop = 0;
free(path);
return; return;
} }
...@@ -345,6 +352,8 @@ void decodeStart(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) { ...@@ -345,6 +352,8 @@ void decodeStart(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) {
dc->stop = 0; dc->stop = 0;
dc->state = DECODE_STATE_STOP; dc->state = DECODE_STATE_STOP;
} }
free(path);
} }
int decoderInit(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) { int decoderInit(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) {
......
...@@ -48,6 +48,8 @@ struct _InputStream { ...@@ -48,6 +48,8 @@ struct _InputStream {
char * metaTitle; char * metaTitle;
}; };
int isUrlSaneForInputStream(char * url);
/* if an error occurs for these 3 functions, then -1 is returned and errno /* if an error occurs for these 3 functions, then -1 is returned and errno
for the input stream is set */ for the input stream is set */
int openInputStream(InputStream * inStream, char * url); int openInputStream(InputStream * inStream, char * url);
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "path.h" #include "path.h"
#include "myfprintf.h" #include "myfprintf.h"
#include "log.h" #include "log.h"
#include "utf8.h"
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
...@@ -41,17 +42,68 @@ char * dupAndStripPlaylistSuffix(char * file) { ...@@ -41,17 +42,68 @@ char * dupAndStripPlaylistSuffix(char * file) {
return ret; return ret;
} }
int isRemoteUrl(char * url) { static char * remoteUrlPrefixes[] =
char * prefixes[] = { {
"http://", "http://",
NULL NULL
}; };
int isValidRemoteUtf8Url(char * utf8url) {
int ret = 0;
char * lat1 = utf8StrToLatin1Dup(utf8url);
char * temp;
if(!lat1) return 0;
switch(isRemoteUrl(lat1)) {
case 1:
ret = 1;
temp = lat1;
while(*temp) {
if((*temp >= 'a' && *temp <= 'z') ||
(*temp >= 'A' && *temp <= 'z') ||
(*temp >= '0' && *temp <= '9') ||
*temp == '$' ||
*temp == '-' ||
*temp == '.' ||
*temp == '+' ||
*temp == '!' ||
*temp == '*' ||
*temp == '\'' ||
*temp == '(' ||
*temp == ')' ||
*temp == ',' ||
*temp == '%' ||
*temp == '/' ||
*temp == ':' ||
*temp == '?' ||
*temp == ';' ||
*temp == '&' ||
*temp == '=')
{
}
else {
ret = 1;
break;
}
temp++;
}
break;
}
free(lat1);
return ret;
}
char ** urlPrefixes = prefixes; int isRemoteUrl(char * url) {
int count = 0;
char ** urlPrefixes = remoteUrlPrefixes;
while(*urlPrefixes) { while(*urlPrefixes) {
count++;
if(strncmp(*urlPrefixes,url,strlen(*urlPrefixes)) == 0) { if(strncmp(*urlPrefixes,url,strlen(*urlPrefixes)) == 0) {
return 1; return count;
} }
urlPrefixes++; urlPrefixes++;
} }
......
...@@ -30,6 +30,8 @@ int lsPlaylists(FILE * fp, char * utf8path); ...@@ -30,6 +30,8 @@ int lsPlaylists(FILE * fp, char * utf8path);
char * getSuffix(char * utf8file); char * getSuffix(char * utf8file);
int isValidRemoteUtf8Url(char * utf8url);
int isRemoteUrl(char * url); int isRemoteUrl(char * url);
int isFile(char * utf8file, time_t * mtime); int isFile(char * utf8file, time_t * mtime);
......
...@@ -471,10 +471,13 @@ int addToPlaylist(FILE * fp, char * url) { ...@@ -471,10 +471,13 @@ int addToPlaylist(FILE * fp, char * url) {
if((song = getSongFromDB(url))) { if((song = getSongFromDB(url))) {
} }
else if(isRemoteUrl(url) && (song = newSong(url,SONG_TYPE_URL))) { else if(isValidRemoteUtf8Url(url) &&
(song = newSong(url,SONG_TYPE_URL)))
{
} }
else { else {
myfprintf(fp,"%s \"%s\" is not in the music db\n", myfprintf(fp,"%s \"%s\" is not in the music db or is"
"not a valid url\n",
COMMAND_RESPOND_ERROR,url); COMMAND_RESPOND_ERROR,url);
return -1; return -1;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment