summaryrefslogtreecommitdiffabout
path: root/lib
authorMichael Krelin <hacker@klever.net>2008-02-15 23:21:05 (UTC)
committer Michael Krelin <hacker@klever.net>2008-02-15 23:21:05 (UTC)
commitccdfc6eacec435a59d773127762ad0b6bce07149 (patch) (unidiff)
tree0a653ff550db04a65f6bbda418725c6c966d294f /lib
parent2048be862b8619ddec90163af05e6472bf5175e4 (diff)
downloadlibopkele-ccdfc6eacec435a59d773127762ad0b6bce07149.zip
libopkele-ccdfc6eacec435a59d773127762ad0b6bce07149.tar.gz
libopkele-ccdfc6eacec435a59d773127762ad0b6bce07149.tar.bz2
small fix to openid message find_ns method
it foolishly failed in presence of ns field and absence of namespace in question. Signed-off-by: Michael Krelin <hacker@klever.net>
Diffstat (limited to 'lib') (more/less context) (ignore whitespace changes)
-rw-r--r--lib/openid_message.cc6
1 files changed, 4 insertions, 2 deletions
diff --git a/lib/openid_message.cc b/lib/openid_message.cc
index 588bd62..75e59b3 100644
--- a/lib/openid_message.cc
+++ b/lib/openid_message.cc
@@ -120,150 +120,152 @@ namespace opkele {
120 if(co==string::npos) 120 if(co==string::npos)
121 break; 121 break;
122#ifndef POSTELS_LAW 122#ifndef POSTELS_LAW
123 string::size_type nl = kv.find('\n',co+1); 123 string::size_type nl = kv.find('\n',co+1);
124 if(nl==string::npos) 124 if(nl==string::npos)
125 throw bad_input(OPKELE_CP_ "malformed input"); 125 throw bad_input(OPKELE_CP_ "malformed input");
126 if(nl>co) 126 if(nl>co)
127 insert(value_type(kv.substr(p,co-p),kv.substr(co+1,nl-co-1))); 127 insert(value_type(kv.substr(p,co-p),kv.substr(co+1,nl-co-1)));
128 p = nl+1; 128 p = nl+1;
129#else /* POSTELS_LAW */ 129#else /* POSTELS_LAW */
130 string::size_type lb = kv.find_first_of("\r\n",co+1); 130 string::size_type lb = kv.find_first_of("\r\n",co+1);
131 if(lb==string::npos) { 131 if(lb==string::npos) {
132 set_field(kv.substr(p,co-p),kv.substr(co+1)); 132 set_field(kv.substr(p,co-p),kv.substr(co+1));
133 break; 133 break;
134 } 134 }
135 if(lb>co) 135 if(lb>co)
136 set_field(kv.substr(p,co-p),kv.substr(co+1,lb-co-1)); 136 set_field(kv.substr(p,co-p),kv.substr(co+1,lb-co-1));
137 string::size_type nolb = kv.find_first_not_of("\r\n",lb); 137 string::size_type nolb = kv.find_first_not_of("\r\n",lb);
138 if(nolb==string::npos) 138 if(nolb==string::npos)
139 break; 139 break;
140 p = nolb; 140 p = nolb;
141#endif /* POSTELS_LAW */ 141#endif /* POSTELS_LAW */
142 } 142 }
143 } 143 }
144 144
145 struct __om_kv_outputter : public unary_function<const string&,void> { 145 struct __om_kv_outputter : public unary_function<const string&,void> {
146 public: 146 public:
147 const basic_openid_message& om; 147 const basic_openid_message& om;
148 ostream& os; 148 ostream& os;
149 149
150 __om_kv_outputter(const basic_openid_message& m,ostream& s) 150 __om_kv_outputter(const basic_openid_message& m,ostream& s)
151 : om(m), os(s) { } 151 : om(m), os(s) { }
152 152
153 result_type operator()(argument_type f) { 153 result_type operator()(argument_type f) {
154 os << f << ':' << om.get_field(f) << '\n'; 154 os << f << ':' << om.get_field(f) << '\n';
155 } 155 }
156 }; 156 };
157 157
158 void basic_openid_message::to_keyvalues(ostream& o) const { 158 void basic_openid_message::to_keyvalues(ostream& o) const {
159 for_each(fields_begin(),fields_end(),__om_kv_outputter(*this,o)); 159 for_each(fields_begin(),fields_end(),__om_kv_outputter(*this,o));
160 } 160 }
161 161
162 struct __om_html_outputter : public unary_function<const string&,void> { 162 struct __om_html_outputter : public unary_function<const string&,void> {
163 public: 163 public:
164 const basic_openid_message& om; 164 const basic_openid_message& om;
165 ostream& os; 165 ostream& os;
166 const char *pfx; 166 const char *pfx;
167 167
168 __om_html_outputter(const basic_openid_message& m,ostream& s,const char *p=0) 168 __om_html_outputter(const basic_openid_message& m,ostream& s,const char *p=0)
169 : om(m), os(s), pfx(p) { } 169 : om(m), os(s), pfx(p) { }
170 170
171 result_type operator()(argument_type f) { 171 result_type operator()(argument_type f) {
172 os << 172 os <<
173 "<input type=\"hidden\"" 173 "<input type=\"hidden\""
174 " name=\""; 174 " name=\"";
175 if(pfx) 175 if(pfx)
176 os << util::attr_escape(pfx); 176 os << util::attr_escape(pfx);
177 os << util::attr_escape(f) << "\"" 177 os << util::attr_escape(f) << "\""
178 " value=\"" << util::attr_escape(om.get_field(f)) << "\" />"; 178 " value=\"" << util::attr_escape(om.get_field(f)) << "\" />";
179 } 179 }
180 }; 180 };
181 181
182 void basic_openid_message::to_htmlhiddens(ostream& o,const char* pfx) const { 182 void basic_openid_message::to_htmlhiddens(ostream& o,const char* pfx) const {
183 for_each(fields_begin(),fields_end(),__om_html_outputter(*this,o,pfx)); 183 for_each(fields_begin(),fields_end(),__om_html_outputter(*this,o,pfx));
184 } 184 }
185 185
186 void basic_openid_message::add_to_signed(const string& fields) { 186 void basic_openid_message::add_to_signed(const string& fields) {
187 string::size_type fnc = fields.find_first_not_of(","); 187 string::size_type fnc = fields.find_first_not_of(",");
188 if(fnc==string::npos) 188 if(fnc==string::npos)
189 throw bad_input(OPKELE_CP_ "Trying to add nothing in particular to the list of signed fields"); 189 throw bad_input(OPKELE_CP_ "Trying to add nothing in particular to the list of signed fields");
190 string signeds; 190 string signeds;
191 try { 191 try {
192 signeds = get_field("signed"); 192 signeds = get_field("signed");
193 string::size_type lnc = signeds.find_last_not_of(","); 193 string::size_type lnc = signeds.find_last_not_of(",");
194 if(lnc==string::npos) 194 if(lnc==string::npos)
195 signeds.assign(fields,fnc,fields.size()-fnc); 195 signeds.assign(fields,fnc,fields.size()-fnc);
196 else{ 196 else{
197 string::size_type ss = signeds.size(); 197 string::size_type ss = signeds.size();
198 if(lnc==(ss-1)) { 198 if(lnc==(ss-1)) {
199 signeds+= ','; 199 signeds+= ',';
200 signeds.append(fields,fnc,fields.size()-fnc); 200 signeds.append(fields,fnc,fields.size()-fnc);
201 }else{ 201 }else{
202 if(lnc<(ss-2)) 202 if(lnc<(ss-2))
203 signeds.replace(lnc+2,ss-lnc-2, 203 signeds.replace(lnc+2,ss-lnc-2,
204 fields,fnc,fields.size()-fnc); 204 fields,fnc,fields.size()-fnc);
205 else 205 else
206 signeds.append(fields,fnc,fields.size()-fnc); 206 signeds.append(fields,fnc,fields.size()-fnc);
207 } 207 }
208 } 208 }
209 }catch(failed_lookup&) { 209 }catch(failed_lookup&) {
210 signeds.assign(fields,fnc,fields.size()-fnc); 210 signeds.assign(fields,fnc,fields.size()-fnc);
211 } 211 }
212 set_field("signed",signeds); 212 set_field("signed",signeds);
213 } 213 }
214 214
215 string basic_openid_message::find_ns(const string& uri,const char *pfx) const { 215 string basic_openid_message::find_ns(const string& uri,const char *pfx) const {
216 if(has_field("ns")) 216 try {
217 return get_ns(uri); 217 return get_ns(uri);
218 return pfx; 218 }catch(failed_lookup&) {
219 return pfx;
220 }
219 } 221 }
220 string basic_openid_message::allocate_ns(const string& uri,const char *pfx) { 222 string basic_openid_message::allocate_ns(const string& uri,const char *pfx) {
221 if(!has_field("ns")) 223 if(!has_field("ns"))
222 return pfx; 224 return pfx;
223 if(has_ns(uri)) 225 if(has_ns(uri))
224 throw bad_input(OPKELE_CP_ "OpenID message already contains namespace"); 226 throw bad_input(OPKELE_CP_ "OpenID message already contains namespace");
225 string rv = pfx; 227 string rv = pfx;
226 if(has_field("ns."+rv)) { 228 if(has_field("ns."+rv)) {
227 string::reference c=rv[rv.length()]; 229 string::reference c=rv[rv.length()];
228 for(c='a';c<='z' && has_field("ns."+rv);++c); 230 for(c='a';c<='z' && has_field("ns."+rv);++c);
229 if(c=='z') 231 if(c=='z')
230 throw exception(OPKELE_CP_ "Failed to allocate namespace"); 232 throw exception(OPKELE_CP_ "Failed to allocate namespace");
231 } 233 }
232 set_field("ns."+rv,uri); 234 set_field("ns."+rv,uri);
233 return rv; 235 return rv;
234 } 236 }
235 237
236 void openid_message_t::copy_to(basic_openid_message& x) const { 238 void openid_message_t::copy_to(basic_openid_message& x) const {
237 x.reset_fields(); 239 x.reset_fields();
238 for(const_iterator i=begin();i!=end();++i) 240 for(const_iterator i=begin();i!=end();++i)
239 x.set_field(i->first,i->second); 241 x.set_field(i->first,i->second);
240 } 242 }
241 243
242 bool openid_message_t::has_field(const string& n) const { 244 bool openid_message_t::has_field(const string& n) const {
243 return find(n)!=end(); 245 return find(n)!=end();
244 } 246 }
245 const string& openid_message_t::get_field(const string& n) const { 247 const string& openid_message_t::get_field(const string& n) const {
246 const_iterator i=find(n); 248 const_iterator i=find(n);
247 if(i==end()) 249 if(i==end())
248 throw failed_lookup(OPKELE_CP_ n+": no such field"); 250 throw failed_lookup(OPKELE_CP_ n+": no such field");
249 return i->second; 251 return i->second;
250 } 252 }
251 253
252 openid_message_t::fields_iterator openid_message_t::fields_begin() const { 254 openid_message_t::fields_iterator openid_message_t::fields_begin() const {
253 return util::map_keys_iterator<const_iterator,string,const string&,const string*>(begin(),end()); 255 return util::map_keys_iterator<const_iterator,string,const string&,const string*>(begin(),end());
254 } 256 }
255 openid_message_t::fields_iterator openid_message_t::fields_end() const { 257 openid_message_t::fields_iterator openid_message_t::fields_end() const {
256 return util::map_keys_iterator<const_iterator,string,const string&,const string*>(end(),end()); 258 return util::map_keys_iterator<const_iterator,string,const string&,const string*>(end(),end());
257 } 259 }
258 260
259 void openid_message_t::reset_fields() { 261 void openid_message_t::reset_fields() {
260 clear(); 262 clear();
261 } 263 }
262 void openid_message_t::set_field(const string& n,const string& v) { 264 void openid_message_t::set_field(const string& n,const string& v) {
263 (*this)[n]=v; 265 (*this)[n]=v;
264 } 266 }
265 void openid_message_t::reset_field(const string& n) { 267 void openid_message_t::reset_field(const string& n) {
266 erase(n); 268 erase(n);
267 } 269 }
268 270
269} 271}