Commit af964e89 authored by Max Kellermann's avatar Max Kellermann

uri: added function uri_safe_local()

parent 554b2b0e
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <glib.h> #include <glib.h>
#include <assert.h>
#include <string.h> #include <string.h>
bool uri_has_scheme(const char *uri) bool uri_has_scheme(const char *uri)
...@@ -45,6 +46,35 @@ uri_get_suffix(const char *uri) ...@@ -45,6 +46,35 @@ uri_get_suffix(const char *uri)
return suffix; return suffix;
} }
static const char *
verify_uri_segment(const char *p)
{
const char *q;
if (*p == 0 || *p == '/' || *p == '.')
return NULL;
q = strchr(p + 1, '/');
return q != NULL ? q : "";
}
bool
uri_safe_local(const char *uri)
{
while (true) {
uri = verify_uri_segment(uri);
if (uri == NULL)
return false;
if (*uri == 0)
return true;
assert(*uri == '/');
++uri;
}
}
char * char *
uri_remove_auth(const char *uri) uri_remove_auth(const char *uri)
{ {
......
...@@ -36,6 +36,18 @@ const char * ...@@ -36,6 +36,18 @@ const char *
uri_get_suffix(const char *uri); uri_get_suffix(const char *uri);
/** /**
* Returns true if this is a safe "local" URI:
*
* - non-empty
* - does not begin or end with a slash
* - no double slashes
* - no path component begins with a dot
*/
G_GNUC_PURE
bool
uri_safe_local(const char *uri);
/**
* Removes HTTP username and password from the URI. This may be * Removes HTTP username and password from the URI. This may be
* useful for displaying an URI without disclosing secrets. Returns * useful for displaying an URI without disclosing secrets. Returns
* NULL if nothing needs to be removed, or if the URI is not * NULL if nothing needs to be removed, or if the URI is not
......
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