From 3bab48000c4e61104b30ac379806cad3e1376ea6 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Wed, 25 Jan 2017 15:54:40 +0100 Subject: common: Add path encoding functions This adds p11_path_{encode,decode}(), following the escaping rule described in: https://dbus.freedesktop.org/doc/dbus-specification.html#addresses Although they are merely a wrapper around p11_url_{decode,encode}(), having dedicated functions hides the implementation details. --- common/path.c | 33 +++++++++++++++++++++++++++++++++ common/path.h | 4 ++++ common/test-path.c | 22 ++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/common/path.c b/common/path.c index 8b8b66c..5cf0e1a 100644 --- a/common/path.c +++ b/common/path.c @@ -38,9 +38,11 @@ #include "config.h" +#include "buffer.h" #include "debug.h" #include "message.h" #include "path.h" +#include "url.h" #include #include @@ -325,3 +327,34 @@ p11_path_canon (char *name) name[i] = '_'; } } + +char * +p11_path_encode (const char *path) +{ + static const char *VALID = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_/\\"; + p11_buffer buf; + char *result; + + return_val_if_fail (path != NULL, NULL); + + if (!p11_buffer_init_null (&buf, strlen (path))) + return_val_if_reached (NULL); + + p11_url_encode ((unsigned char *)path, + (unsigned char *)path + strlen (path), + VALID, + &buf); + return_val_if_fail (p11_buffer_ok (&buf), NULL); + + result = p11_buffer_steal (&buf, NULL); + p11_buffer_uninit (&buf); + + return result; +} + +char * +p11_path_decode (const char *path) +{ + return (char *) p11_url_decode (path, path + strlen (path), "", NULL); +} diff --git a/common/path.h b/common/path.h index 0b19a5d..243c14f 100644 --- a/common/path.h +++ b/common/path.h @@ -66,4 +66,8 @@ bool p11_path_prefix (const char *string, void p11_path_canon (char *name); +char * p11_path_encode (const char *path); + +char * p11_path_decode (const char *path); + #endif /* P11_PATH_H__ */ diff --git a/common/test-path.c b/common/test-path.c index 1394e0f..c77acf2 100644 --- a/common/test-path.c +++ b/common/test-path.c @@ -200,6 +200,26 @@ test_canon (void) free (test); } +static void +test_encode (void) +{ + char *test; + + test = p11_path_encode ("2309haonutb;/AOE@#$O "); + assert_str_eq (test, "2309haonutb%3b/AOE%40%23%24O%20"); + free (test); +} + +static void +test_decode (void) +{ + char *test; + + test = p11_path_decode ("2309haonutb%3b/AOE%40%23%24O%20"); + assert_str_eq (test, "2309haonutb;/AOE@#$O "); + free (test); +} + int main (int argc, char *argv[]) @@ -211,6 +231,8 @@ main (int argc, p11_test (test_parent, "/path/parent"); p11_test (test_prefix, "/path/prefix"); p11_test (test_canon, "/path/canon"); + p11_test (test_encode, "/path/encode"); + p11_test (test_decode, "/path/decode"); return p11_test_run (argc, argv); } -- cgit v1.1