summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: afaaa88)
raw | patch | inline | side by side (parent: afaaa88)
author | ishmal <ishmal@users.sourceforge.net> | |
Mon, 22 May 2006 18:10:03 +0000 (18:10 +0000) | ||
committer | ishmal <ishmal@users.sourceforge.net> | |
Mon, 22 May 2006 18:10:03 +0000 (18:10 +0000) |
src/pedro/pedroxmpp.cpp | patch | blob | history |
index 4011df1add8b2de4836c3080ceb44aaaee379370..f12a75093f675bfe714e826cfefae8f15131296d 100644 (file)
--- a/src/pedro/pedroxmpp.cpp
+++ b/src/pedro/pedroxmpp.cpp
* Authors:
* Bob Jamison
*
- * Copyright (C) 2005 Bob Jamison
+ * Copyright (C) 2005-2006 Bob Jamison
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
#include <pthread.h>
-#endif
+#endif /* UNIX */
+
#ifdef HAVE_SSL
#include <openssl/ssl.h>
namespace Pedro
{
-//########################################################################
-//########################################################################
-//### U T I L I T Y
-//########################################################################
-//########################################################################
+
+
+//########################################################################
//########################################################################
//# B A S E 6 4
//########################################################################
+//########################################################################
+
//#################
//# ENCODER
+
+
+
+
+//########################################################################
+//########################################################################
+//### S H A 1 H A S H I N G
//########################################################################
-//# S H A 1
//########################################################################
+/**
+ *
+ */
class Sha1
{
public:
+
+//########################################################################
+//########################################################################
+//### M D 5 H A S H I N G
//########################################################################
-//# M D 5
//########################################################################
+/**
+ *
+ */
class Md5
{
public:
+
+
+
//########################################################################
//########################################################################
//### T H R E A D
//########################################################################
-//########################################################################
-//### T H R E A D
-//########################################################################
/**
* This is the interface for a delegate class which can
#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
//########################################################################
//########################################################################
//### S O C K E T
-
-
+/**
+ * A socket wrapper that provides cross-platform capability, plus SSL
+ */
class TcpSocket
{
public:
}
-//########################################################################
-//########################################################################
-//### X M P P
-//########################################################################
-//########################################################################
+
+
+
+
+
+
+
+
+
+
+//########################################################################
//########################################################################
//# X M P P E V E N T
//########################################################################
+//########################################################################
XmppEvent::XmppEvent(int type)
userList = val;
}
+
+
+
+
+
+
+
+
+//########################################################################
//########################################################################
//# X M P P E V E N T T A R G E T
//########################################################################
+//########################################################################
+
//###########################
//# CONSTRUCTORS
//# M E S S A G E S
//###########################
+/**
+ * Print a printf()-like formatted error message
+ */
void XmppEventTarget::error(char *fmt, ...)
{
va_list args;
va_start(args,fmt);
vsnprintf(targetWriteBuf, targetWriteBufLen, fmt, args);
va_end(args) ;
- printf("Error:%s\n", targetWriteBuf);
+ fprintf(stderr, "Error:%s\n", targetWriteBuf);
XmppEvent evt(XmppEvent::EVENT_ERROR);
evt.setData(targetWriteBuf);
dispatchXmppEvent(evt);
}
+
+
+/**
+ * Print a printf()-like formatted trace message
+ */
void XmppEventTarget::status(char *fmt, ...)
{
va_list args;
}
+
+
+
+//########################################################################
//########################################################################
//# X M P P S T R E A M
//########################################################################
+//########################################################################
+
/**
*
+//########################################################################
//########################################################################
//# X M P P C L I E N T
//########################################################################
+//########################################################################
+
class ReceiverThread : public Runnable
{
public:
};
-//###########################
+
+
+
+//########################################################################
//# CONSTRUCTORS
-//###########################
+//########################################################################
XmppClient::XmppClient()
{
groupChatsClear();
}
-//##############################################
+
+
+
+
+
+//########################################################################
//# UTILILY
-//##############################################
+//########################################################################
/**
*
}
+
DOMString XmppClient::toXml(const DOMString &str)
{
return Parser::encode(str);
}
+
+
static DOMString trim(const DOMString &str)
{
unsigned int i;
return str.substr(start, end);
}
-//##############################################
+
+
+
+
+//########################################################################
//# VARIABLES (ones that need special handling)
-//##############################################
+//########################################################################
+
/**
*
*/
}
}
-//##############################################
-//# CONNECTION
-//##############################################
-//#######################
+
+
+
+
+
+
+//########################################################################
//# RECEIVING
-//#######################
+//########################################################################
+
+
DOMString XmppClient::readStanza()
{
int openCount = 0;
return true;
}
-//#######################
+
+
+
+//########################################################################
//# SENDING
-//#######################
+//########################################################################
+
bool XmppClient::write(char *fmt, ...)
{
return true;
}
-//#######################
-//# CONNECT
-//#######################
-bool XmppClient::checkConnect()
+
+
+
+
+//########################################################################
+//# R E G I S T R A T I O N
+//########################################################################
+
+/**
+ * Perform JEP-077 In-Band Registration
+ */
+bool XmppClient::inBandRegistration()
{
- if (!connected)
+ Parser parser;
+
+ char *fmt =
+ "<iq type='get' id='reg1'>"
+ "<query xmlns='jabber:iq:register'/>"
+ "</iq>\n\n";
+ if (!write(fmt))
+ return false;
+
+ DOMString recbuf = readStanza();
+ status("RECV reg: %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++)
{
- XmppEvent evt(XmppEvent::EVENT_ERROR);
- evt.setData("Attempted operation while disconnected");
- dispatchXmppEvent(evt);
+ DOMString fname = fields[i]->getAttribute("var");
+ if (fname == "FORM_TYPE")
+ continue;
+ fnames.push_back(fname);
+ status("field name:%s", fname.c_str());
+ }
+
+ delete elem;
+
+ if (fnames.size() == 0)
+ {
+ error("server did not offer registration");
return false;
}
+
+
+ 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)
+ {
+ 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;
+ }
+
+ delete elem;
+
+ XmppEvent evt(XmppEvent::EVENT_REGISTRATION_NEW);
+ evt.setTo(username);
+ evt.setFrom(host);
+ dispatchXmppEvent(evt);
+
return true;
}
+
+
+
+
+//########################################################################
+//# A U T H E N T I C A T E
+//########################################################################
+
bool XmppClient::iqAuthenticate(const DOMString &streamId)
{
Parser parser;
}
-static bool
-saslParse(const DOMString &s, std::map<DOMString, DOMString> &vals)
+/**
+ * Parse a sasl challenge to retrieve all of its key=value pairs
+ */
+static bool saslParse(const DOMString &s,
+ std::map<DOMString, DOMString> &vals)
{
vals.clear();
-
-
+/**
+ * Attempt suthentication using the MD5 SASL mechanism
+ */
bool XmppClient::saslMd5Authenticate()
{
Parser parser;
char *fmt =
"<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' "
- "mechanism='DIGEST-MD5'/>\n";
+ "mechanism='DIGEST-MD5'/>\n";
if (!write(fmt))
return false;
return false;
}
DOMString challenge = Base64Decoder::decodeToString(b64challenge);
- status("challenge:'%s'", challenge.c_str());
+ status("md5 challenge:'%s'", challenge.c_str());
std::map<DOMString, DOMString> attrs;
if (!saslParse(challenge, attrs))
}
challenge = Base64Decoder::decodeToString(b64challenge);
- status("challenge: '%s'", challenge.c_str());
+ status("md5 challenge: '%s'", challenge.c_str());
if (!saslParse(challenge, attrs))
{
return success;
}
+
+
+/**
+ * Attempt to authentication using the SASL PLAIN mechanism. This
+ * is used most commonly my Google Talk.
+ */
bool XmppClient::saslPlainAuthenticate()
{
Parser parser;
+/**
+ * Handshake with SASL, and use one of its offered mechanisms to
+ * authenticate.
+ */
bool XmppClient::saslAuthenticate()
{
Parser parser;
}
-/**
- * Perform JEP-077 In-Band Registration
- */
-bool XmppClient::inBandRegistration()
-{
- Parser parser;
-
- char *fmt =
- "<iq type='get' id='reg1'>"
- "<query xmlns='jabber:iq:register'/>"
- "</iq>\n\n";
- if (!write(fmt))
- return false;
- DOMString recbuf = readStanza();
- status("RECV reg: %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++)
- {
- DOMString fname = fields[i]->getAttribute("var");
- if (fname == "FORM_TYPE")
- continue;
- fnames.push_back(fname);
- status("field name:%s", fname.c_str());
- }
- delete elem;
-
- if (fnames.size() == 0)
- {
- error("server did not offer registration");
- return false;
- }
-
-
- 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;
+//########################################################################
+//# CONNECT
+//########################################################################
- 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)
+/**
+ * Check if we are connected, and fail with an error if we are not
+ */
+bool XmppClient::checkConnect()
+{
+ if (!connected)
{
- 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;
+ XmppEvent evt(XmppEvent::EVENT_ERROR);
+ evt.setData("Attempted operation while disconnected");
+ dispatchXmppEvent(evt);
return false;
}
-
- delete elem;
-
- XmppEvent evt(XmppEvent::EVENT_REGISTRATION_NEW);
- evt.setTo(username);
- evt.setFrom(host);
- dispatchXmppEvent(evt);
-
return true;
}
+
+/**
+ * Create an XMPP session with a server. This
+ * is basically the transport layer of XMPP.
+ */
bool XmppClient::createSession()
{
return true;
}
+
+
+/**
+ * Public call to connect
+ */
bool XmppClient::connect()
{
if (!createSession())
}
+/**
+ * Public call to connect
+ */
bool XmppClient::connect(DOMString hostArg, int portArg,
DOMString usernameArg,
DOMString passwordArg,
return ret;
}
+
+
+/**
+ * Public call to disconnect
+ */
bool XmppClient::disconnect()
{
if (connected)
-//#######################
+
+
+//########################################################################
//# ROSTER
-//#######################
+//########################################################################
+/**
+ * Add an XMPP id to your roster
+ */
bool XmppClient::rosterAdd(const DOMString &rosterGroup,
const DOMString &otherJid,
const DOMString &name)
return true;
}
+
+
+/**
+ * Delete an XMPP id from your roster.
+ */
bool XmppClient::rosterDelete(const DOMString &otherJid)
{
if (!checkConnect())
}
+/**
+ * Comparison method for sort() call below
+ */
static bool xmppRosterCompare(const XmppUser& p1, const XmppUser& p2)
{
DOMString s1 = p1.group;
return false;
}
+
+
+/**
+ * Sort and return the roster that has just been reported by
+ * an XmppEvent::EVENT_ROSTER event.
+ */
std::vector<XmppUser> XmppClient::getRoster()
{
std::vector<XmppUser> ros = roster;
return ros;
}
+
+/**
+ *
+ */
void XmppClient::rosterShow(const DOMString &jid, const DOMString &show)
{
DOMString theShow = show;
}
}
-//#######################
+
+
+
+
+
+//########################################################################
//# CHAT (individual)
-//#######################
+//########################################################################
+/**
+ * Send a message to an xmpp jid
+ */
bool XmppClient::message(const DOMString &user, const DOMString &subj,
const DOMString &msg)
{
+/**
+ *
+ */
bool XmppClient::message(const DOMString &user, const DOMString &msg)
{
return message(user, "", msg);
+/**
+ *
+ */
bool XmppClient::presence(const DOMString &presence)
{
if (!checkConnect())
return true;
}
-//#######################
+
+
+
+
+
+//########################################################################
//# GROUP CHAT
-//#######################
+//########################################################################
+/**
+ *
+ */
bool XmppClient::groupChatCreate(const DOMString &groupJid)
{
std::vector<XmppGroupChat *>::iterator iter;
return true;
}
+
+
/**
*
*/
}
}
+
+
/**
*
*/
return false;
}
+
+
/**
*
*/
}
+
+
/**
*
*/
}
}
+
+
/**
*
*/
}
}
+
+
+
/**
*
*/
}
}
+
+
+/**
+ * Comparison method for the sort() below
+ */
static bool xmppUserCompare(const XmppUser& p1, const XmppUser& p2)
{
DOMString s1 = p1.nick;
}
+
+/**
+ * Return the user list for the named group
+ */
std::vector<XmppUser> XmppClient::groupChatGetUserList(
const DOMString &groupJid)
{
return dummy;
}
+
+
+
+/**
+ * Try to join a group
+ */
bool XmppClient::groupChatJoin(const DOMString &groupJid,
const DOMString &nick,
const DOMString &pass)
}
+
+
+/**
+ * Leave a group
+ */
bool XmppClient::groupChatLeave(const DOMString &groupJid,
const DOMString &nick)
{
}
+
+
+/**
+ * Send a message to a group
+ */
bool XmppClient::groupChatMessage(const DOMString &groupJid,
const DOMString &msg)
{
return true;
}
+
+
+
+/**
+ * Send a message to an individual in a group
+ */
bool XmppClient::groupChatPrivateMessage(const DOMString &groupJid,
const DOMString &toNick,
const DOMString &msg)
return true;
}
+
+
+
+/**
+ * Change your presence within a group
+ */
bool XmppClient::groupChatPresence(const DOMString &groupJid,
const DOMString &myNick,
const DOMString &presence)
-//#######################
+
+
+//########################################################################
//# S T R E A M S
-//#######################
+//########################################################################
/**
-//#######################
+
+
+//########################################################################
//# FILE TRANSFERS
-//#######################
+//########################################################################
/**
+
+
+
} //namespace Pedro
//########################################################################
//# E N D O F F I L E