summaryrefslogtreecommitdiffabout
path: root/lib/openid_message.cc
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/openid_message.cc
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/openid_message.cc') (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
@@ -168,99 +168,101 @@ namespace opkele {
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);