Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dc21e4d24b | ||
|
|
9a51667546 |
@@ -770,18 +770,45 @@ typedef enum ParseResult
|
|||||||
HTTP_GATEWAY_TIMEOUT = 504,
|
HTTP_GATEWAY_TIMEOUT = 504,
|
||||||
} ParseResult;
|
} ParseResult;
|
||||||
|
|
||||||
static SwkbdCallbackResult fat32filter(void *user, const char **ppMessage, const char *text, size_t textlen)
|
// unescapes URL-encoded string non-destructively
|
||||||
|
static char * unescape(const char * url)
|
||||||
{
|
{
|
||||||
(void)textlen;
|
char * unescaped = malloc(strlen(url) + 1);
|
||||||
(void)user;
|
// source shamelessly ripped from https://stackoverflow.com/a/14530993/4073959
|
||||||
*ppMessage = "Input must not contain:\n><\"?;:/\\+,.|[=]";
|
char a;
|
||||||
if(strpbrk(text, "><\"?;:/\\+,.|[=]"))
|
char b;
|
||||||
|
while (*url)
|
||||||
{
|
{
|
||||||
DEBUG("illegal filename: %s\n", text);
|
if ((*url == '%') &&
|
||||||
return SWKBD_CALLBACK_CONTINUE;
|
((a = url[1]) && (b = url[2])) &&
|
||||||
|
(isxdigit(a) && isxdigit(b))) {
|
||||||
|
if (a >= 'a')
|
||||||
|
a -= 'a' - 'A';
|
||||||
|
if (a >= 'A')
|
||||||
|
a -= ('A' - 10);
|
||||||
|
else
|
||||||
|
a -= '0';
|
||||||
|
if (b >= 'a')
|
||||||
|
b -= 'a' - 'A';
|
||||||
|
if (b >= 'A')
|
||||||
|
b -= ('A' - 10);
|
||||||
|
else
|
||||||
|
b -= '0';
|
||||||
|
*unescaped++ = 16 * a + b;
|
||||||
|
url += 3;
|
||||||
|
}
|
||||||
|
else if (*url == '+')
|
||||||
|
{
|
||||||
|
*unescaped++ = ' ';
|
||||||
|
url++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*unescaped++ = *url++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
*unescaped++ = '\0';
|
||||||
return SWKBD_CALLBACK_OK;
|
return unescaped;
|
||||||
}
|
}
|
||||||
|
|
||||||
// the good paths for this function return SUCCESS, ABORTED, or REDIRECT;
|
// the good paths for this function return SUCCESS, ABORTED, or REDIRECT;
|
||||||
@@ -1105,6 +1132,15 @@ no_error:;
|
|||||||
*buf = new_buf;
|
*buf = new_buf;
|
||||||
|
|
||||||
DEBUG("size: %lu\n", *size);
|
DEBUG("size: %lu\n", *size);
|
||||||
if (filename) { DEBUG("filename: %s\n", *filename); }
|
if (filename) {
|
||||||
|
if (*filename == NULL)
|
||||||
|
{
|
||||||
|
// Content-Disposition extraction failed somehow
|
||||||
|
char * tmp = unescape(url);
|
||||||
|
*filename = strdup(basename(tmp));
|
||||||
|
free(tmp);
|
||||||
|
}
|
||||||
|
DEBUG("filename: %s\n", *filename);
|
||||||
|
}
|
||||||
return MAKERESULT(RL_SUCCESS, RS_SUCCESS, RM_APPLICATION, RD_SUCCESS);
|
return MAKERESULT(RL_SUCCESS, RS_SUCCESS, RM_APPLICATION, RD_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user