summaryrefslogtreecommitdiffabout
path: root/lib/params.cc
authorMichael Krelin <hacker@klever.net>2005-07-19 13:08:32 (UTC)
committer Michael Krelin <hacker@klever.net>2005-07-19 13:08:32 (UTC)
commit4c82851dd5d5644a89d4f269079bf901f763ee33 (patch) (unidiff)
treeb64c8b3c9a1be88e2a9c3f762272e0b4509ba7d9 /lib/params.cc
parent907343b0c973eb295bec8795902a6d49744e9174 (diff)
downloadlibopkele-4c82851dd5d5644a89d4f269079bf901f763ee33.zip
libopkele-4c82851dd5d5644a89d4f269079bf901f763ee33.tar.gz
libopkele-4c82851dd5d5644a89d4f269079bf901f763ee33.tar.bz2
initial commit of libopkele - OpenID support library
Diffstat (limited to 'lib/params.cc') (more/less context) (ignore whitespace changes)
-rw-r--r--lib/params.cc96
1 files changed, 96 insertions, 0 deletions
diff --git a/lib/params.cc b/lib/params.cc
new file mode 100644
index 0000000..14f1a53
--- a/dev/null
+++ b/lib/params.cc
@@ -0,0 +1,96 @@
1#include <opkele/types.h>
2#include <opkele/exception.h>
3#include <opkele/util.h>
4#include <openssl/sha.h>
5#include <openssl/hmac.h>
6#include <mimetic/mimetic.h>
7
8namespace opkele {
9 using namespace std;
10
11 bool params_t::has_param(const string& n) const {
12 return find(n)!=end();
13 }
14 const string& params_t::get_param(const string& n) const {
15 const_iterator i = find(n);
16 if(i==end())
17 throw failed_lookup(OPKELE_CP_ n+": no such parameter");
18 return i->second;
19 }
20 string& params_t::get_param(const string& n) {
21 iterator i = find(n);
22 if(i==end())
23 throw failed_lookup(OPKELE_CP_ n+": no such parameter");
24 return i->second;
25 }
26
27 void params_t::parse_keyvalues(const string& kv) {
28 clear();
29 string::size_type p = 0;
30 while(true) {
31 string::size_type co = kv.find(':',p);
32 if(co==string::npos)
33 break;
34 string::size_type nl = kv.find('\n',co+1);
35 if(nl==string::npos)
36 throw bad_input(OPKELE_CP_ "malformed input");
37 insert(value_type(kv.substr(p,co-p),kv.substr(co+1,nl-co-1)));
38 p = nl+1;
39 }
40 }
41
42 void params_t::sign(secret_t secret,string& sig,const string& slist,const char *prefix) const {
43 string kv;
44 string::size_type p = 0;
45 while(true) {
46 string::size_type co = slist.find(',',p);
47 string f = (co==string::npos)?slist.substr(p):slist.substr(p,co-p);
48 kv += f;
49 kv += ':';
50 if(prefix) f.insert(0,prefix);
51 kv += get_param(f);
52 kv += '\n';
53 if(co==string::npos)
54 break;
55 p = co+1;
56 }
57 unsigned int md_len = 0;
58 unsigned char *md = HMAC(
59 EVP_sha1(),
60 &(secret.front()),secret.size(),
61 (const unsigned char *)kv.data(),kv.length(),
62 0,&md_len);
63 mimetic::Base64::Encoder b(0);
64 sig.erase();
65 mimetic::encode(
66 md,md+md_len, b,
67 back_insert_iterator<string>(sig) );
68 }
69
70 string params_t::append_query(const string& url,const char *prefix) const {
71 string rv = url;
72 bool p = true;
73 if(rv.find('?')==string::npos) {
74 rv += '?';
75 p = false;
76 }
77 for(const_iterator i=begin();i!=end();++i) {
78 if(p)
79 rv += '&';
80 else
81 p = true;
82 rv += prefix;
83 rv += i->first;
84 rv += '=';
85 rv += util::url_encode(i->second);
86 }
87 return rv;
88 }
89
90 ostream& operator << (ostream& o,const params_t& p) {
91 for(params_t::const_iterator i=p.begin();i!=p.end();++i)
92 o << i->first << ':' << i->second << '\n';
93 return o;
94 }
95
96}