diff options
| author | Bob Jamison <ishmalius@gmail.com> | 2006-05-22 19:33:16 +0000 |
|---|---|---|
| committer | ishmal <ishmal@users.sourceforge.net> | 2006-05-22 19:33:16 +0000 |
| commit | 58039818564bd64740ad6b5d519eff31c68fa05f (patch) | |
| tree | bbfe38d8da3819b2a2baf50cbd69b4ca0b723979 /src/pedro/pedroxmpp.cpp | |
| parent | fix problems with gcc4 (by joncruz) (diff) | |
| download | inkscape-58039818564bd64740ad6b5d519eff31c68fa05f.tar.gz inkscape-58039818564bd64740ad6b5d519eff31c68fa05f.zip | |
Improve code for password change and registration cancel
(bzr r958)
Diffstat (limited to 'src/pedro/pedroxmpp.cpp')
| -rw-r--r-- | src/pedro/pedroxmpp.cpp | 209 |
1 files changed, 88 insertions, 121 deletions
diff --git a/src/pedro/pedroxmpp.cpp b/src/pedro/pedroxmpp.cpp index 4847ebfd8..b531441f0 100644 --- a/src/pedro/pedroxmpp.cpp +++ b/src/pedro/pedroxmpp.cpp @@ -3289,12 +3289,12 @@ bool XmppClient::inBandRegistrationNew() { Element *errElem = list[0]; DOMString code = errElem->getAttribute("code"); - DOMString errMsg = "Registration error. "; + DOMString errMsg = "Registration error: "; if (code == "409") { errMsg.append("conflict with existing user name"); } - if (code == "406") + else if (code == "406") { errMsg.append("some registration information was not provided"); } @@ -3317,88 +3317,79 @@ bool XmppClient::inBandRegistrationNew() /** * Perform JEP-077 In-Band Registration */ -bool XmppClient::inBandRegistrationModify() +bool XmppClient::inBandRegistrationChangePassword(const DOMString &newpassword) { Parser parser; + //# Let's try it form-style to allow the common old/new password thing char *fmt = - "<iq type='get' id='reg1'>" - "<query xmlns='jabber:iq:register'/>" - "</iq>\n\n"; - if (!write(fmt)) + "<iq type='set' from='%s' to='%s' id='change1'>" + " <query xmlns='jabber:iq:register'>" + " <x xmlns='jabber:x:data' type='form'>" + " <field type='hidden' var='FORM_TYPE'>" + " <value>jabber:iq:register:changepassword</value>" + " </field>" + " <field type='text-single' var='username'>" + " <value>%s</value>" + " </field>" + " <field type='text-private' var='old_password'>" + " <value>%s</value>" + " </field>" + " <field type='text-private' var='password'>" + " <value>%s</value>" + " </field>" + " </x>" + " </query>" + "</iq>\n\n"; + + if (!write(fmt, jid.c_str(), host.c_str(), + username.c_str(), password.c_str(), newpassword.c_str())) return false; DOMString recbuf = readStanza(); - status("RECV reg: %s", recbuf.c_str()); + status("RECV chpass: %s", recbuf.c_str()); Element *elem = parser.parse(recbuf); //elem->print(); - //# does the entity send the "instructions" tag? - std::vector<Element *> fields = elem->findElements("field"); - std::vector<DOMString> fnames; - for (unsigned int i=0; i<fields.size() ; i++) + std::vector<Element *> list = elem->findElements("error"); + if (list.size()==0) { - DOMString fname = fields[i]->getAttribute("var"); - if (fname == "FORM_TYPE") - continue; - fnames.push_back(fname); - status("field name:%s", fname.c_str()); + XmppEvent evt(XmppEvent::EVENT_REGISTRATION_CHANGE_PASS); + evt.setTo(username); + evt.setFrom(host); + dispatchXmppEvent(evt); + delete elem; + return true; } - delete elem; - if (fnames.size() == 0) + Element *errElem = list[0]; + DOMString errMsg = "Password change error: "; + if (errElem->findElements("bad-request").size()>0) { - error("server did not offer registration"); - return false; + errMsg.append("password change does not contain complete information"); } - - - fmt = - "<iq type='set' id='reg2'>" - "<query xmlns='jabber:iq:register'>" - "<username>%s</username>" - "<password>%s</password>" - "<email/><name/>" - "</query>" - "</iq>\n\n"; - if (!write(fmt, toXml(username).c_str(), - toXml(password).c_str() )) - return false; - - - recbuf = readStanza(); - status("RECV reg: %s", recbuf.c_str()); - elem = parser.parse(recbuf); - //elem->print(); - - std::vector<Element *> list = elem->findElements("error"); - if (list.size()>0) + else if (errElem->findElements("not-authorized").size()>0) { - Element *errElem = list[0]; - DOMString code = errElem->getAttribute("code"); - DOMString errMsg = "Registration error. "; - if (code == "409") - { - errMsg.append("conflict with existing user name"); - } - if (code == "406") - { - errMsg.append("some registration information was not provided"); - } - error((char *)errMsg.c_str()); - delete elem; - return false; + errMsg.append("server does not consider the channel safe " + "enough to enable a password change"); + } + else if (errElem->findElements("not-allowed").size()>0) + { + errMsg.append("server does not allow password changes"); + } + else if (errElem->findElements("unexpected-request").size()>0) + { + errMsg.append( + "IQ set does not contain a 'from' address because " + "the entity is not registered with the server"); } delete elem; - XmppEvent evt(XmppEvent::EVENT_REGISTRATION_MODIFY); - evt.setTo(username); - evt.setFrom(host); - dispatchXmppEvent(evt); + error((char *)errMsg.c_str()); - return true; + return false; } @@ -3410,83 +3401,59 @@ bool XmppClient::inBandRegistrationCancel() Parser parser; char *fmt = - "<iq type='get' id='reg1'>" - "<query xmlns='jabber:iq:register'/>" - "</iq>\n\n"; - if (!write(fmt)) + "<iq type='set' from='%s' id='unreg1'>" + "<query xmlns='jabber:iq:register'><remove/></query>" + "</iq>\n\n"; + if (!write(fmt, jid.c_str())) return false; DOMString recbuf = readStanza(); - status("RECV reg: %s", recbuf.c_str()); + status("RECV unreg: %s", recbuf.c_str()); Element *elem = parser.parse(recbuf); //elem->print(); - //# does the entity send the "instructions" tag? - std::vector<Element *> fields = elem->findElements("field"); - std::vector<DOMString> fnames; - for (unsigned int i=0; i<fields.size() ; i++) + std::vector<Element *> list = elem->findElements("error"); + if (list.size()==0) { - DOMString fname = fields[i]->getAttribute("var"); - if (fname == "FORM_TYPE") - continue; - fnames.push_back(fname); - status("field name:%s", fname.c_str()); + XmppEvent evt(XmppEvent::EVENT_REGISTRATION_CANCEL); + evt.setTo(username); + evt.setFrom(host); + dispatchXmppEvent(evt); + delete elem; + return true; } - delete elem; - if (fnames.size() == 0) + Element *errElem = list[0]; + DOMString errMsg = "Registration cancel error: "; + if (errElem->findElements("bad-request").size()>0) { - error("server did not offer registration"); - return false; + errMsg.append("The <remove/> element was not the only child element of the <query/> element."); } - - - fmt = - "<iq type='set' id='reg2'>" - "<query xmlns='jabber:iq:register'>" - "<username>%s</username>" - "<password>%s</password>" - "<email/><name/>" - "</query>" - "</iq>\n\n"; - if (!write(fmt, toXml(username).c_str(), - toXml(password).c_str() )) - return false; - - - recbuf = readStanza(); - status("RECV reg: %s", recbuf.c_str()); - elem = parser.parse(recbuf); - //elem->print(); - - std::vector<Element *> list = elem->findElements("error"); - if (list.size()>0) + else if (errElem->findElements("forbidden").size()>0) { - Element *errElem = list[0]; - DOMString code = errElem->getAttribute("code"); - DOMString errMsg = "Registration error. "; - if (code == "409") - { - errMsg.append("conflict with existing user name"); - } - if (code == "406") - { - errMsg.append("some registration information was not provided"); - } - error((char *)errMsg.c_str()); - delete elem; - return false; + errMsg.append("sender does not have sufficient permissions to cancel the registration"); + } + else if (errElem->findElements("not-allowed").size()>0) + { + errMsg.append("not allowed to cancel registrations in-band"); + } + else if (errElem->findElements("registration-required").size()>0) + { + errMsg.append("not previously registered"); + } + else if (errElem->findElements("unexpected-request").size()>0) + { + errMsg.append( + "IQ set does not contain a 'from' address because " + "the entity is not registered with the server"); } delete elem; - XmppEvent evt(XmppEvent::EVENT_REGISTRATION_CANCEL); - evt.setTo(username); - evt.setFrom(host); - dispatchXmppEvent(evt); + error((char *)errMsg.c_str()); - return true; + return false; } |
