validate url's before adding to playlist
git-svn-id: https://svn.musicpd.org/mpd/trunk@1289 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
14
TODO
14
TODO
@@ -1,19 +1,15 @@
|
|||||||
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
|
||||||
|
21
src/decode.c
21
src/decode.c
@@ -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) {
|
|||||||
|
|
||||||
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) {
|
|||||||
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) {
|
|||||||
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 {
|
|||||||
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);
|
||||||
|
66
src/ls.c
66
src/ls.c
@@ -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) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int isRemoteUrl(char * url) {
|
static char * remoteUrlPrefixes[] =
|
||||||
char * prefixes[] = {
|
{
|
||||||
"http://",
|
"http://",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
char ** urlPrefixes = prefixes;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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++;
|
||||||
}
|
}
|
||||||
|
2
src/ls.h
2
src/ls.h
@@ -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) {
|
|||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user