source: psi/trunk/iris/example/server/server.cpp

Last change on this file was 2, checked in by dmik, 19 years ago

Imported original Psi 0.10 sources from Affinix

File size: 5.4 KB
Line 
1#include<qapplication.h>
2#include<qsocket.h>
3#include<qserversocket.h>
4#include<qvaluelist.h>
5#include<qtimer.h>
6#include<qca.h>
7#include<stdlib.h>
8#include<time.h>
9#include"bsocket.h"
10#include"xmpp.h"
11
12#include<unistd.h>
13
14char pemdata_cert[] =
15 "-----BEGIN CERTIFICATE-----\n"
16 "MIIDbjCCAtegAwIBAgIBADANBgkqhkiG9w0BAQQFADCBhzELMAkGA1UEBhMCVVMx\n"
17 "EzARBgNVBAgTCkNhbGlmb3JuaWExDzANBgNVBAcTBklydmluZTEYMBYGA1UEChMP\n"
18 "RXhhbXBsZSBDb21wYW55MRQwEgYDVQQDEwtleGFtcGxlLmNvbTEiMCAGCSqGSIb3\n"
19 "DQEJARYTZXhhbXBsZUBleGFtcGxlLmNvbTAeFw0wMzA3MjQwNzMwMDBaFw0wMzA4\n"
20 "MjMwNzMwMDBaMIGHMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEP\n"
21 "MA0GA1UEBxMGSXJ2aW5lMRgwFgYDVQQKEw9FeGFtcGxlIENvbXBhbnkxFDASBgNV\n"
22 "BAMTC2V4YW1wbGUuY29tMSIwIAYJKoZIhvcNAQkBFhNleGFtcGxlQGV4YW1wbGUu\n"
23 "Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCobzCF268K2sRp473gvBTT\n"
24 "4AgSL1kjeF8N57vxS1P8zWrWMXNs4LuH0NRZmKTajeboy0br8xw+smIy3AbaKAwW\n"
25 "WZToesxebu3m9VeA8dqWyOaUMjoxAcgVYesgVaMpjRe7fcWdJnX1wJoVVPuIcO8m\n"
26 "a+AAPByfTORbzpSTmXAQAwIDAQABo4HnMIHkMB0GA1UdDgQWBBTvFierzLmmYMq0\n"
27 "cB/+5rK1bNR56zCBtAYDVR0jBIGsMIGpgBTvFierzLmmYMq0cB/+5rK1bNR566GB\n"
28 "jaSBijCBhzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExDzANBgNV\n"
29 "BAcTBklydmluZTEYMBYGA1UEChMPRXhhbXBsZSBDb21wYW55MRQwEgYDVQQDEwtl\n"
30 "eGFtcGxlLmNvbTEiMCAGCSqGSIb3DQEJARYTZXhhbXBsZUBleGFtcGxlLmNvbYIB\n"
31 "ADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4GBAGqGhXf7xNOnYNtFO7gz\n"
32 "K6RdZGHFI5q1DAEz4hhNBC9uElh32XGX4wN7giz3zLC8v9icL/W4ff/K5NDfv3Gf\n"
33 "gQe/+Wo9Be3H3ul6uwPPFnx4+PIOF2a5TW99H9smyxWdNjnFtcUte4al3RszcMWG\n"
34 "x3iqsWosGtj6F+ridmKoqKLu\n"
35 "-----END CERTIFICATE-----\n";
36
37char pemdata_privkey[] =
38 "-----BEGIN RSA PRIVATE KEY-----\n"
39 "MIICXAIBAAKBgQCobzCF268K2sRp473gvBTT4AgSL1kjeF8N57vxS1P8zWrWMXNs\n"
40 "4LuH0NRZmKTajeboy0br8xw+smIy3AbaKAwWWZToesxebu3m9VeA8dqWyOaUMjox\n"
41 "AcgVYesgVaMpjRe7fcWdJnX1wJoVVPuIcO8ma+AAPByfTORbzpSTmXAQAwIDAQAB\n"
42 "AoGAP83u+aYghuIcaWhmM03MLf69z/WztKYSi/fu0BcS977w67bL3MC9CVPoPRB/\n"
43 "0nLSt/jZIuRzHKUCYfXLerSU7v0oXDTy6GPzWMh/oXIrpF0tYNbwWF7LSq2O2gGZ\n"
44 "XtA9MSmUNNJaKzQQeXjqdVFOY8A0Pho+k2KByBiCi+ChkcECQQDRUuyX0+PKJtA2\n"
45 "M36BOTFpy61BAv+JRlXUnHuevOfQWl6NR6YGygqCyH1sWtP1sa9S4wWys3DFH+5A\n"
46 "DkuAqk7zAkEAzf4eUH2hp5CIMsXH+WpIzKj09oY1it2CAKjVq4rUELf8iXvmGoFl\n"
47 "000spua4MjHNUYm7LR0QaKesKrMyGZUesQJAL8aLdYPJI+SD9Tr/jqLtIkZ4frQe\n"
48 "eshw4pvsoyheiHF3zyshO791crAr4EVCx3sMlxB1xnmqLXPCPyCEHxO//QJBAIBY\n"
49 "IYkjDZJ6ofGIe1UyXJNvfdkPu9J+ut4wU5jjEcgs6mK62J6RGuFxhy2iOQfFMdjo\n"
50 "yL+OCUg7mDCun7uCxrECQAtSvnLOFMjO5qExRjFtwi+b1rcSekd3Osk/izyRFSzg\n"
51 "Or+AL56/EKfiogNnFipgaXIbb/xj785Cob6v96XoW1I=\n"
52 "-----END RSA PRIVATE KEY-----\n";
53
54QCA::Cert *cert;
55QCA::RSAKey *privkey;
56
57using namespace XMPP;
58
59int id_num = 0;
60
61class Session : public QObject
62{
63 Q_OBJECT
64public:
65 Session(const QString &host, const QString &defRealm, ByteStream *bs) : QObject(0)
66 {
67 id = id_num++;
68
69 tls = new QCA::TLS;
70 tls->setCertificate(*cert, *privkey);
71
72 cs = new ClientStream(host, defRealm, bs, tls);
73 connect(cs, SIGNAL(connectionClosed()), SLOT(cs_connectionClosed()));
74 connect(cs, SIGNAL(error(int)), SLOT(cs_error(int)));
75 }
76
77 ~Session()
78 {
79 delete cs;
80 delete tls;
81 printf("[%d]: deleted\n", id);
82 }
83
84 void start()
85 {
86 printf("[%d]: New session!\n", id);
87 cs->accept();
88 }
89
90signals:
91 void done();
92
93private slots:
94 void cs_connectionClosed()
95 {
96 printf("[%d]: Connection closed by peer\n", id);
97 done();
98 }
99
100 void cs_error(int)
101 {
102 printf("[%d]: Error\n", id);
103 done();
104 }
105
106private:
107 int id;
108 ClientStream *cs;
109 QCA::TLS *tls;
110};
111
112class ServerTest : public QServerSocket
113{
114 Q_OBJECT
115public:
116 enum { Idle, Handshaking, Active, Closing };
117
118 ServerTest(const QString &_host, int _port) : QServerSocket(_port), host(_host), port(_port)
119 {
120 cert = new QCA::Cert;
121 privkey = new QCA::RSAKey;
122
123 cert->fromPEM(pemdata_cert);
124 privkey->fromPEM(pemdata_privkey);
125
126 list.setAutoDelete(true);
127 }
128
129 ~ServerTest()
130 {
131 }
132
133 void start()
134 {
135 char buf[256];
136 int r = gethostname(buf, sizeof(buf)-1);
137 if(r == -1) {
138 printf("Error getting hostname!\n");
139 QTimer::singleShot(0, this, SIGNAL(quit()));
140 return;
141 }
142 QString myhostname = buf;
143
144 realm = myhostname;
145 if(host.isEmpty())
146 host = myhostname;
147
148 if(cert->isNull() || privkey->isNull()) {
149 printf("Error loading cert and/or private key!\n");
150 QTimer::singleShot(0, this, SIGNAL(quit()));
151 return;
152 }
153 if(!ok()) {
154 printf("Error binding to port %d!\n", port);
155 QTimer::singleShot(0, this, SIGNAL(quit()));
156 return;
157 }
158 printf("Listening on %s:%d ...\n", host.latin1(), port);
159 }
160
161 void newConnection(int s)
162 {
163 BSocket *bs = new BSocket;
164 bs->setSocket(s);
165 Session *sess = new Session(host, realm, bs);
166 list.append(sess);
167 connect(sess, SIGNAL(done()), SLOT(sess_done()));
168 sess->start();
169 }
170
171signals:
172 void quit();
173
174private slots:
175 void sess_done()
176 {
177 Session *sess = (Session *)sender();
178 list.removeRef(sess);
179 }
180
181private:
182 QString host, realm;
183 int port;
184 QPtrList<Session> list;
185};
186
187#include"server.moc"
188
189int main(int argc, char **argv)
190{
191 QApplication app(argc, argv, false);
192 QString host = argc > 1 ? QString(argv[1]) : QString();
193 int port = argc > 2 ? QString(argv[2]).toInt() : 5222;
194
195 if(!QCA::isSupported(QCA::CAP_TLS)) {
196 printf("TLS not supported!\n");
197 return 1;
198 }
199
200 if(!QCA::isSupported(QCA::CAP_SASL)) {
201 printf("SASL not supported!\n");
202 return 1;
203 }
204
205 srand(time(NULL));
206
207 ServerTest *s = new ServerTest(host, port);
208 QObject::connect(s, SIGNAL(quit()), &app, SLOT(quit()));
209 s->start();
210 app.exec();
211 delete s;
212
213 // clean up
214 QCA::unloadAllPlugins();
215
216 return 0;
217}
Note: See TracBrowser for help on using the repository browser.