uri: added function uri_safe_local()
This commit is contained in:
		
							
								
								
									
										30
									
								
								src/uri.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								src/uri.c
									
									
									
									
									
								
							| @@ -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) | |||||||
| 	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) | ||||||
| { | { | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								src/uri.h
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								src/uri.h
									
									
									
									
									
								
							| @@ -35,6 +35,18 @@ G_GNUC_PURE | |||||||
| const char * | 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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann