forked from enlightenment/efl
Fix ethumb file URI generation.
It's now escaping invalid chars to its hex representation. SVN revision: 41345
This commit is contained in:
parent
6103d8db01
commit
0e694f4e18
|
@ -693,6 +693,20 @@ ethumb_file_get(const Ethumb *e, const char **path, const char **key)
|
||||||
if (key) *key = e->src_key;
|
if (key) *key = e->src_key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char ACCEPTABLE_URI_CHARS[96] = {
|
||||||
|
/* ! " # $ % & ' ( ) * + , - . / */
|
||||||
|
0x00,0x3F,0x20,0x20,0x28,0x00,0x2C,0x3F,0x3F,0x3F,0x3F,0x2A,0x28,0x3F,0x3F,0x1C,
|
||||||
|
/* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */
|
||||||
|
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x38,0x20,0x20,0x2C,0x20,0x20,
|
||||||
|
/* @ A B C D E F G H I J K L M N O */
|
||||||
|
0x38,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
|
||||||
|
/* P Q R S T U V W X Y Z [ \ ] ^ _ */
|
||||||
|
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x20,0x20,0x20,0x20,0x3F,
|
||||||
|
/* ` a b c d e f g h i j k l m n o */
|
||||||
|
0x20,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
|
||||||
|
/* p q r s t u v w x y z { | } ~ DEL */
|
||||||
|
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x20,0x20,0x20,0x3F,0x20
|
||||||
|
};
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
_ethumb_generate_hash(const char *file)
|
_ethumb_generate_hash(const char *file)
|
||||||
|
@ -703,10 +717,33 @@ _ethumb_generate_hash(const char *file)
|
||||||
unsigned char hash[MD5_HASHBYTES];
|
unsigned char hash[MD5_HASHBYTES];
|
||||||
static const char hex[] = "0123456789abcdef";
|
static const char hex[] = "0123456789abcdef";
|
||||||
|
|
||||||
char uri[PATH_MAX];
|
char *uri;
|
||||||
|
char *t;
|
||||||
|
const char *c;
|
||||||
|
|
||||||
|
#define _check_uri_char(c) \
|
||||||
|
((c) >= 32 && (c) < 128 && (ACCEPTABLE_URI_CHARS[(c) - 32] & 0x08))
|
||||||
|
|
||||||
EINA_SAFETY_ON_NULL_RETURN_VAL(file, NULL);
|
EINA_SAFETY_ON_NULL_RETURN_VAL(file, NULL);
|
||||||
snprintf (uri, sizeof(uri), "file://%s", file);
|
|
||||||
|
uri = alloca(3 * strlen(file) + 9);
|
||||||
|
strncpy(uri, "file://", sizeof(uri));
|
||||||
|
t = uri + 7;
|
||||||
|
|
||||||
|
for (c = file; *c != '\0'; c++)
|
||||||
|
{
|
||||||
|
if (!_check_uri_char(*c))
|
||||||
|
{
|
||||||
|
*t++ = '%';
|
||||||
|
*t++ = hex[*c >> 4];
|
||||||
|
*t++ = hex[*c & 15];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*t++ = *c;
|
||||||
|
}
|
||||||
|
*t = '\0';
|
||||||
|
|
||||||
|
#undef _check_uri_char
|
||||||
|
|
||||||
MD5Init (&ctx);
|
MD5Init (&ctx);
|
||||||
MD5Update (&ctx, (unsigned char const*)uri, (unsigned)strlen (uri));
|
MD5Update (&ctx, (unsigned char const*)uri, (unsigned)strlen (uri));
|
||||||
|
|
Loading…
Reference in New Issue