author | Michael Krelin <hacker@klever.net> | 2008-02-02 21:10:12 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2008-02-02 21:10:12 (UTC) |
commit | 3658759966cbadb7b50457d446f3436b6f7987da (patch) (side-by-side diff) | |
tree | b215da5b5212b60aa1ec965df28070b4bff587bc | |
parent | a8f733c88d87abe422ecaa405df385bad562e60f (diff) | |
download | libopkele-3658759966cbadb7b50457d446f3436b6f7987da.zip libopkele-3658759966cbadb7b50457d446f3436b6f7987da.tar.gz libopkele-3658759966cbadb7b50457d446f3436b6f7987da.tar.bz2 |
moved uri matching into separate procedure
Signed-off-by: Michael Krelin <hacker@klever.net>
-rw-r--r-- | include/opkele/util.h | 8 | ||||
-rw-r--r-- | lib/basic_op.cc | 35 | ||||
-rw-r--r-- | lib/util.cc | 30 |
3 files changed, 41 insertions, 32 deletions
diff --git a/include/opkele/util.h b/include/opkele/util.h index 719f951..bc1a0ea 100644 --- a/include/opkele/util.h +++ b/include/opkele/util.h @@ -144,8 +144,16 @@ namespace opkele { * @throw bad_input in case of malformed URI */ string rfc_3986_normalize_uri(const string& uri); + /** + * Match URI against realm + * @param uri URI to match + * @param realm realm to match against + * @return true if URI matches realm + */ + bool uri_matches_realm(const string& uri,const string& realm); + string& strip_uri_fragment_part(string& uri); string abi_demangle(const char* mn); diff --git a/lib/basic_op.cc b/lib/basic_op.cc index f7573aa..11ffb48 100644 --- a/lib/basic_op.cc +++ b/lib/basic_op.cc @@ -1,7 +1,6 @@ #include <time.h> #include <cassert> -#include <algorithm> #include <openssl/sha.h> #include <openssl/hmac.h> #include <opkele/data.h> #include <opkele/basic_op.h> @@ -9,10 +8,8 @@ #include <opkele/util.h> #include <opkele/uris.h> namespace opkele { - using std::pair; - using std::mismatch; void basic_op::reset_vars() { assoc.reset(); return_to.clear(); realm.clear(); @@ -320,37 +317,11 @@ namespace opkele { return oum; } void basic_op::verify_return_to() { - string nrealm = opkele::util::rfc_3986_normalize_uri(realm); - if(nrealm.find('#')!=string::npos) + if(realm.find('#')!=string::npos) throw opkele::bad_realm(OPKELE_CP_ "authentication realm contains URI fragment"); - string nrt = opkele::util::rfc_3986_normalize_uri(return_to); - string::size_type pr = nrealm.find("://"); - string::size_type prt = nrt.find("://"); - assert(!(pr==string::npos || prt==string::npos)); - pr += sizeof("://")-1; - prt += sizeof("://")-1; - if(!strncmp(nrealm.c_str()+pr,"*.",2)) { - pr = nrealm.find('.',pr); - prt = nrt.find('.',prt); - assert(pr!=string::npos); - if(prt==string::npos) - throw bad_return_to( - OPKELE_CP_ "return_to URL doesn't match realm"); - // TODO: check for overgeneralized realm - } - string::size_type lr = nrealm.length(); - string::size_type lrt = nrt.length(); - if( (lrt-prt) < (lr-pr) ) - throw bad_return_to( - OPKELE_CP_ "return_to URL doesn't match realm"); - pair<const char*,const char*> mp = mismatch( - nrealm.c_str()+pr,nrealm.c_str()+lr, - nrt.c_str()+prt); - if( (*(mp.first-1))!='/' - && !strchr("/?#",*mp.second) ) - throw bad_return_to( - OPKELE_CP_ "return_to URL doesn't match realm"); + if(!util::uri_matches_realm(return_to,realm)) + throw bad_return_to(OPKELE_CP_ "return_to URL doesn't match realm"); } } diff --git a/lib/util.cc b/lib/util.cc index b7bc437..b85a377 100644 --- a/lib/util.cc +++ b/lib/util.cc @@ -4,8 +4,9 @@ #include <cstring> #include <vector> #include <string> #include <stack> +#include <algorithm> #include <openssl/bio.h> #include <openssl/evp.h> #include <openssl/hmac.h> #include <curl/curl.h> @@ -350,8 +351,37 @@ namespace opkele { } return u; } + bool uri_matches_realm(const string& uri,const string& realm) { + string nrealm = opkele::util::rfc_3986_normalize_uri(realm); + string nu = opkele::util::rfc_3986_normalize_uri(uri); + string::size_type pr = nrealm.find("://"); + string::size_type pu = nu.find("://"); + assert(!(pr==string::npos || pu==string::npos)); + pr += sizeof("://")-1; + pu += sizeof("://")-1; + if(!strncmp(nrealm.c_str()+pr,"*.",2)) { + pr = nrealm.find('.',pr); + pu = nu.find('.',pu); + assert(pr!=string::npos); + if(pu==string::npos) + return false; + // TODO: check for overgeneralized realm + } + string::size_type lr = nrealm.length(); + string::size_type lu = nu.length(); + if( (lu-pu) < (lr-pr) ) + return false; + pair<const char*,const char*> mp = mismatch( + nrealm.c_str()+pr,nrealm.c_str()+lr, + nu.c_str()+pu); + if( (*(mp.first-1))!='/' + && !strchr("/?#",*mp.second) ) + return false; + return true; + } + string abi_demangle(const char *mn) { #ifndef HAVE_DEMANGLE return mn; #else /* !HAVE_DEMANGLE */ |