src/gui/embedded/qtransportauth_qws.h
changeset 0 1918ee327afb
child 4 3b1da2848fc7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gui/embedded/qtransportauth_qws.h	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,281 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTRANSPORTAUTH_QWS_H
+#define QTRANSPORTAUTH_QWS_H
+
+#include <QtCore/qglobal.h>
+
+#if !defined(QT_NO_SXE) || defined(SXE_INSTALLER)
+
+#include <QtCore/qobject.h>
+#include <QtCore/qhash.h>
+#include <QtCore/qstring.h>
+#include <QtCore/qbuffer.h>
+#include <QtCore/qpointer.h>
+
+#include <sys/types.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Gui)
+
+class QAuthDevice;
+class QWSClient;
+class QIODevice;
+class QTransportAuthPrivate;
+class QMutex;
+
+class Q_GUI_EXPORT QTransportAuth : public QObject
+{
+    Q_OBJECT
+public:
+    static QTransportAuth *getInstance();
+
+    enum Result {
+        // Error codes
+        Pending = 0x00,
+        TooSmall = 0x01,
+        CacheMiss = 0x02,
+        NoMagic = 0x03,
+        NoSuchKey = 0x04,
+        FailMatch = 0x05,
+        OutOfDate = 0x06,
+        // reserved for expansion
+        Success = 0x1e,
+        ErrMask = 0x1f,
+
+        // Verification codes
+        Allow = 0x20,
+        Deny = 0x40,
+        Ask = 0x60,
+        // reserved
+        StatusMask = 0xe0
+    };
+
+    enum Properties {
+        Trusted = 0x01,
+        Connection = 0x02,
+        UnixStreamSock = 0x04,
+        SharedMemory = 0x08,
+        MessageQueue = 0x10,
+        UDP = 0x20,
+        TCP = 0x40,
+        UserDefined = 0x80,
+        TransportType = 0xfc
+    };
+
+    struct Data
+    {
+        Data() { processId = -1; }
+        Data( unsigned char p, int d )
+            : properties( p )
+            , descriptor( d )
+            , processId( -1 )
+        {
+            if (( properties & TransportType ) == TCP ||
+                ( properties & TransportType ) == UnixStreamSock )
+                properties |= Connection;
+        }
+
+        unsigned char properties;
+        unsigned char progId;
+        unsigned char status;
+        unsigned int descriptor;   // socket fd or shmget key
+        pid_t processId;
+
+        bool trusted() const;
+        void setTrusted( bool );
+        bool connection() const;
+        void setConnection( bool );
+    };
+
+    static const char *errorString( const QTransportAuth::Data & );
+
+    QTransportAuth::Data *connectTransport( unsigned char, int );
+
+    QAuthDevice *authBuf( QTransportAuth::Data *, QIODevice * );
+    QAuthDevice *recvBuf( QTransportAuth::Data *, QIODevice * );
+    QIODevice *passThroughByClient( QWSClient * ) const;
+
+    void setKeyFilePath( const QString & );
+    QString keyFilePath() const;
+    const unsigned char *getClientKey( unsigned char progId );
+    void invalidateClientKeyCache();
+    QMutex *getKeyFileMutex();
+    void setLogFilePath( const QString & );
+    QString logFilePath() const;
+    void setPackageRegistry( QObject *registry );
+    bool isDiscoveryMode() const;
+    void setProcessKey( const char * );
+    void setProcessKey( const char *, const char * );
+    void registerPolicyReceiver( QObject * );
+    void unregisterPolicyReceiver( QObject * );
+
+    bool authToMessage( QTransportAuth::Data &d, char *hdr, const char *msg, int msgLen );
+    bool authFromMessage( QTransportAuth::Data &d, const char *msg, int msgLen );
+
+    bool authorizeRequest( QTransportAuth::Data &d, const QString &request );
+
+Q_SIGNALS:
+    void policyCheck( QTransportAuth::Data &, const QString & );
+    void authViolation( QTransportAuth::Data & );
+private Q_SLOTS:
+    void bufferDestroyed( QObject * );
+
+private:
+    // users should never construct their own
+    QTransportAuth();
+    ~QTransportAuth();
+
+    friend class QAuthDevice;
+    Q_DECLARE_PRIVATE(QTransportAuth)
+};
+
+class Q_GUI_EXPORT RequestAnalyzer
+{
+public:
+    RequestAnalyzer();
+    virtual ~RequestAnalyzer();
+    QString operator()( QByteArray *data ) { return analyze( data ); }
+    bool requireMoreData() const { return moreData; }
+    qint64 bytesAnalyzed() const { return dataSize; }
+protected:
+    virtual QString analyze( QByteArray * );
+    bool moreData;
+    qint64 dataSize;
+};
+
+/*!
+  \internal
+  \class QAuthDevice
+
+  \brief Pass-through QIODevice sub-class for authentication.
+
+   Use this class to forward on or receive forwarded data over a real
+   device for authentication.
+*/
+class Q_GUI_EXPORT QAuthDevice : public QIODevice
+{
+    Q_OBJECT
+public:
+    enum AuthDirection {
+        Receive,
+        Send
+    };
+    QAuthDevice( QIODevice *, QTransportAuth::Data *, AuthDirection );
+    ~QAuthDevice();
+    void setTarget( QIODevice *t ) { m_target = t; }
+    QIODevice *target() const { return m_target; }
+    void setClient( QObject* );
+    QObject *client() const;
+    void setRequestAnalyzer( RequestAnalyzer * );
+    bool isSequential() const;
+    bool atEnd() const;
+    qint64 bytesAvailable() const;
+    qint64 bytesToWrite() const;
+    bool seek( qint64 );
+    QByteArray & buffer();
+
+protected:
+    qint64 readData( char *, qint64 );
+    qint64 writeData(const char *, qint64 );
+private Q_SLOTS:
+    void recvReadyRead();
+    void targetBytesWritten( qint64 );
+private:
+    bool authorizeMessage();
+
+    QTransportAuth::Data *d;
+    AuthDirection way;
+    QIODevice *m_target;
+    QObject *m_client;
+    QByteArray msgQueue;
+    qint64 m_bytesAvailable;
+    qint64 m_skipWritten;
+
+    RequestAnalyzer *analyzer;
+};
+
+inline bool QAuthDevice::isSequential() const
+{
+    return true;
+}
+
+inline bool QAuthDevice::seek( qint64 )
+{
+    return false;
+}
+
+inline bool QAuthDevice::atEnd() const
+{
+    return msgQueue.isEmpty();
+}
+
+inline qint64 QAuthDevice::bytesAvailable() const
+{
+    if ( way == Receive )
+        return m_bytesAvailable;
+    else
+        return ( m_target ? m_target->bytesAvailable() : 0 );
+}
+
+inline qint64 QAuthDevice::bytesToWrite() const
+{
+    return msgQueue.size();
+}
+
+inline QByteArray &QAuthDevice::buffer()
+{
+    return msgQueue;
+}
+
+
+
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QT_NO_SXE
+#endif // QTRANSPORTAUTH_QWS_H