Encrypt communication with plugins
[accounts-sso:signon.git] / src / remotepluginprocess / remotepluginprocess.h
1 /*
2  * This file is part of signon
3  *
4  * Copyright (C) 2009-2010 Nokia Corporation.
5  *
6  * Contact: Alberto Mardegan <alberto.mardegan@nokia.com>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public License
10  * version 2.1 as published by the Free Software Foundation.
11  *
12  * This library is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20  * 02110-1301 USA
21  */
22
23 #ifndef REMOTEPLUGINPROCESS_H
24 #define REMOTEPLUGINPROCESS_H
25
26 #include <QCoreApplication>
27 #include <QString>
28 #include <QStringList>
29 #include <QDataStream>
30 #include <QByteArray>
31 #include <QVariant>
32 #include <QMap>
33 #include <QIODevice>
34 #include <QFile>
35 #include <QDir>
36 #include <QLibrary>
37 #include <QSocketNotifier>
38 #include <QThread>
39
40 #include "SignOn/uisessiondata.h"
41 #include "SignOn/authpluginif.h"
42 #include "SignOn/encrypteddevice.h"
43
44 extern "C" {
45 #include <sys/types.h>
46 #include <sys/socket.h>
47 #include <signal.h>
48 }
49
50 #ifndef SIGNON_PLUGINS_DIR
51       #define SIGNON_PLUGINS_DIR "/usr/lib/signon"
52 #endif
53
54 #ifndef SIGNON_PLUGIN_PREFIX
55     #define SIGNON_PLUGIN_PREFIX "lib"
56 #endif
57
58 #ifndef SIGNON_PLUGIN_SUFFIX
59     #define SIGNON_PLUGIN_SUFFIX "plugin.so"
60 #endif
61
62 using namespace SignOn;
63
64 namespace SignOn {
65     class BlobIOHandler;
66 };
67
68 namespace RemotePluginProcessNS {
69
70 /*!
71  * @class CancelEventThread
72  * Thread to enable cancel functionality.
73  */
74  class CancelEventThread : public QThread
75 {
76     Q_OBJECT
77
78     public:
79         CancelEventThread(AuthPluginInterface *plugin, EncryptedDevice *encryptedInDevice);
80         ~CancelEventThread();
81
82         void run();
83
84     public Q_SLOTS:
85         void cancel();
86
87     private:
88         AuthPluginInterface *m_plugin;
89         QSocketNotifier *m_cancelNotifier;
90         EncryptedDevice *m_encryptedInDevice;
91 };
92
93 /*!
94  * @class RemotePluginProcess
95  * Class to execute plugin process.
96  */
97 class RemotePluginProcess : public QObject
98 {
99     Q_OBJECT
100
101     public:
102         RemotePluginProcess(QObject *parent);
103         ~RemotePluginProcess();
104
105         static RemotePluginProcess* createRemotePluginProcess(QString &type, QObject *parent);
106
107         bool loadPlugin(QString &type);
108         bool setupDataStreams();
109         bool setupProxySettings();
110
111     public Q_SLOTS:
112         void startTask();
113         void sessionDataReceived(const QVariantMap &sessionDataMap);
114
115     private:
116         AuthPluginInterface *m_plugin;
117
118         QFile m_infile;
119         QFile m_outfile;
120
121         QSocketNotifier *m_readnotifier;
122         QSocketNotifier *m_errnotifier;
123         EncryptedDevice *m_encryptedInDevice;
124         EncryptedDevice *m_encryptedOutDevice;
125
126         BlobIOHandler *m_blobIOHandler;
127
128         //Requiered for async session data reading
129         quint32 m_currentOperation;
130         QString m_currentMechanism;
131
132     private:
133         QString getPluginName(const QString &type);
134         void type();
135         void mechanism();
136         void mechanisms();
137
138         void process();
139         void userActionFinished();
140         void refresh();
141
142         void enableCancelThread();
143         void disableCancelThread();
144
145     private Q_SLOTS:
146         void result(const SignOn::SessionData &data);
147         void store(const SignOn::SessionData &data);
148         void error(const SignOn::Error &err);
149         void userActionRequired(const SignOn::UiSessionData &data);
150         void refreshed(const SignOn::UiSessionData &data);
151         void statusChanged(const AuthPluginState state, const QString &message);
152         void blobIOError();
153
154     Q_SIGNALS :
155         void processStopped();
156 };
157
158 } //namespace RemotePluginProcessNS
159
160 #endif /* REMOTEPLUGINPROCESS_H */