summaryrefslogtreecommitdiffabout
path: root/lib
Side-by-side diff
Diffstat (limited to 'lib') (more/less context) (show whitespace changes)
-rw-r--r--lib/basic_op.cc35
-rw-r--r--lib/util.cc30
2 files changed, 33 insertions, 32 deletions
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,5 +1,4 @@
#include <time.h>
#include <cassert>
-#include <algorithm>
#include <openssl/sha.h>
#include <openssl/hmac.h>
@@ -11,6 +10,4 @@
namespace opkele {
- using std::pair;
- using std::mismatch;
void basic_op::reset_vars() {
@@ -322,34 +319,8 @@ namespace opkele {
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
@@ -6,4 +6,5 @@
#include <string>
#include <stack>
+#include <algorithm>
#include <openssl/bio.h>
#include <openssl/evp.h>
@@ -352,4 +353,33 @@ namespace opkele {
}
+ 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