1
#include<qapplication.h>
3
#include<qserversocket.h>
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";
37
char 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";
61
class Session : public QObject
65
Session(const QString &host, const QString &defRealm, ByteStream *bs) : QObject(0)
70
tls->setCertificate(*cert, *privkey);
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)));
81
printf("[%d]: deleted\n", id);
86
printf("[%d]: New session!\n", id);
94
void cs_connectionClosed()
96
printf("[%d]: Connection closed by peer\n", id);
102
printf("[%d]: Error\n", id);
112
class ServerTest : public QServerSocket
116
enum { Idle, Handshaking, Active, Closing };
118
ServerTest(const QString &_host, int _port) : QServerSocket(_port), host(_host), port(_port)
120
cert = new QCA::Cert;
121
privkey = new QCA::RSAKey;
123
cert->fromPEM(pemdata_cert);
124
privkey->fromPEM(pemdata_privkey);
126
list.setAutoDelete(true);
136
int r = gethostname(buf, sizeof(buf)-1);
138
printf("Error getting hostname!\n");
139
QTimer::singleShot(0, this, SIGNAL(quit()));
142
QString myhostname = buf;
148
if(cert->isNull() || privkey->isNull()) {
149
printf("Error loading cert and/or private key!\n");
150
QTimer::singleShot(0, this, SIGNAL(quit()));
154
printf("Error binding to port %d!\n", port);
155
QTimer::singleShot(0, this, SIGNAL(quit()));
158
printf("Listening on %s:%d ...\n", host.latin1(), port);
161
void newConnection(int s)
163
BSocket *bs = new BSocket;
165
Session *sess = new Session(host, realm, bs);
167
connect(sess, SIGNAL(done()), SLOT(sess_done()));
177
Session *sess = (Session *)sender();
178
list.removeRef(sess);
184
QPtrList<Session> list;
189
int main(int argc, char **argv)
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;
195
if(!QCA::isSupported(QCA::CAP_TLS)) {
196
printf("TLS not supported!\n");
200
if(!QCA::isSupported(QCA::CAP_SASL)) {
201
printf("SASL not supported!\n");
207
ServerTest *s = new ServerTest(host, port);
208
QObject::connect(s, SIGNAL(quit()), &app, SLOT(quit()));
214
QCA::unloadAllPlugins();