summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorAdam Tkac <atkac@redhat.com>2010-04-23 14:06:38 +0000
committerAdam Tkac <atkac@redhat.com>2010-04-23 14:06:38 +0000
commit1d15e2d60a171a43c83e51a1343727701ac34f4b (patch)
tree01eebc9a1baf00ade1c7fe2495c16cd3abc08113 /common
parentb6eb3990a15e32e7d506ef713da51ca0305ef4a9 (diff)
downloadtigervnc-1d15e2d60a171a43c83e51a1343727701ac34f4b.tar.gz
tigervnc-1d15e2d60a171a43c83e51a1343727701ac34f4b.zip
[Development] Implement Security class. This class will be used to create
CSecurity/SSecurity objects for authentication purposes. git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4038 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'common')
-rw-r--r--common/rfb/Makefile.am8
-rw-r--r--common/rfb/Security.cxx61
-rw-r--r--common/rfb/Security.h29
3 files changed, 93 insertions, 5 deletions
diff --git a/common/rfb/Makefile.am b/common/rfb/Makefile.am
index 93189b99..a3b134fc 100644
--- a/common/rfb/Makefile.am
+++ b/common/rfb/Makefile.am
@@ -13,9 +13,9 @@ HDRS = Blacklist.h CapsContainer.h CapsList.h CConnection.h \
PixelFormat.h PixelFormat.inl Pixel.h RawDecoder.h RawEncoder.h \
Rect.h Region.h rreDecode.h RREDecoder.h rreEncode.h RREEncoder.h \
ScaledPixelBuffer.h ScaleFilters.h SConnection.h ScreenSet.h \
- screenTypes.h SDesktop.h Security.h ServerCore.h SMsgHandler.h \
+ screenTypes.h SDesktop.h ServerCore.h SMsgHandler.h \
SMsgReader.h SMsgReaderV3.h SMsgWriter.h SMsgWriterV3.h \
- SSecurityFactoryStandard.h SSecurity.h SSecurityNone.h \
+ Security.h SSecurityFactoryStandard.h SSecurityNone.h \
SSecurityVncAuth.h Threading.h tightDecode.h TightDecoder.h \
tightEncode.h TightEncoder.h TightPalette.h Timer.h \
TransImageGetter.h transInitTempl.h transTempl.h TrueColourMap.h \
@@ -34,12 +34,12 @@ librfb_la_SOURCES = $(HDRS) Blacklist.cxx CConnection.cxx CMsgHandler.cxx \
RREEncoder.cxx RREDecoder.cxx RawDecoder.cxx RawEncoder.cxx \
Region.cxx SConnection.cxx SMsgHandler.cxx \
SMsgReader.cxx SMsgReaderV3.cxx SMsgWriter.cxx SMsgWriterV3.cxx \
- ServerCore.cxx SSecurityFactoryStandard.cxx SSecurityVncAuth.cxx \
+ ServerCore.cxx Security.cxx SSecurityFactoryStandard.cxx SSecurityVncAuth.cxx \
ScaledPixelBuffer.cxx ScaleFilters.cxx Timer.cxx TightDecoder.cxx \
TightEncoder.cxx TightPalette.cxx TransImageGetter.cxx \
UpdateTracker.cxx VNCSConnectionST.cxx \
VNCServerST.cxx ZRLEEncoder.cxx ZRLEDecoder.cxx encodings.cxx \
- Security.cxx util.cxx
+ util.cxx
librfb_la_CPPFLAGS = -I$(top_srcdir)/common -I$(top_srcdir)/win
librfb_la_LIBADD =
diff --git a/common/rfb/Security.cxx b/common/rfb/Security.cxx
index d6a9cac7..a38029a5 100644
--- a/common/rfb/Security.cxx
+++ b/common/rfb/Security.cxx
@@ -15,13 +15,74 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/
+#include <assert.h>
+#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#define strcasecmp _stricmp
#endif
+#include <rdr/Exception.h>
+#include <rfb/LogWriter.h>
#include <rfb/Security.h>
+#include <rfb/SSecurityNone.h>
+#include <rfb/SSecurityFactoryStandard.h>
+#include <rfb/SSecurityVncAuth.h>
#include <rfb/util.h>
+using namespace rdr;
+using namespace rfb;
+using namespace std;
+
+static LogWriter vlog("Security");
+
+Security::Security(void)
+{
+ char *secTypesStr = SSecurityFactoryStandard::sec_types.getData();
+
+ enabledSecTypes = parseSecTypes(secTypesStr);
+
+ delete secTypesStr;
+}
+
+void Security::EnableSecType(U8 secType)
+{
+ list<U8>::iterator i;
+
+ for (i = enabledSecTypes.begin(); i != enabledSecTypes.end(); i++)
+ if (*i == secType)
+ return;
+
+ enabledSecTypes.push_back(secType);
+}
+
+bool Security::IsSupported(U8 secType)
+{
+ list<U8>::iterator i;
+
+ for (i = enabledSecTypes.begin(); i != enabledSecTypes.end(); i++)
+ if (*i == secType)
+ return true;
+
+ return false;
+}
+
+SSecurity* Security::GetSSecurity(U8 secType)
+{
+ if (!IsSupported(secType))
+ goto bail;
+
+ switch (secType) {
+ case secTypeNone: return new SSecurityNone();
+ case secTypeVncAuth: return new SSecurityVncAuth();
+ default:
+ vlog.error("Undefined security type %d, aborting");
+ abort();
+ }
+
+bail:
+ throw Exception("Security type not supported");
+}
+
rdr::U8 rfb::secTypeNum(const char* name)
{
if (strcasecmp(name, "None") == 0) return secTypeNone;
diff --git a/common/rfb/Security.h b/common/rfb/Security.h
index 9ccfb56b..cb499110 100644
--- a/common/rfb/Security.h
+++ b/common/rfb/Security.h
@@ -23,6 +23,9 @@
#define __RFB_SECTYPES_H__
#include <rdr/types.h>
+#include <rfb/Configuration.h>
+#include <rfb/SSecurity.h>
+
#include <list>
namespace rfb {
@@ -34,7 +37,7 @@ namespace rfb {
const rdr::U8 secTypeRA2ne = 6;
const rdr::U8 secTypeSSPI = 7;
- const rdr::U8 secTypeSSPIne = 8;
+ const rdr::U8 secTypeSSPIne = 8;
const rdr::U8 secTypeTight = 16;
const rdr::U8 secTypeUltra = 17;
@@ -46,6 +49,30 @@ namespace rfb {
const rdr::U32 secResultFailed = 1;
const rdr::U32 secResultTooMany = 2; // deprecated
+ class Security {
+ public:
+ /* Create Security instance */
+ Security(void);
+
+ /* Enable/Disable certain security type */
+ void EnableSecType(rdr::U8 secType);
+ void DisableSecType(rdr::U8 secType) { enabledSecTypes.remove(secType); }
+
+ /* Check if certain type is supported */
+ bool IsSupported(rdr::U8 secType);
+
+ /* Get list of enabled security types */
+ const std::list<rdr::U8>& GetEnabledSecTypes(void)
+ { return enabledSecTypes; }
+
+ /* Create server side SSecurity class instance */
+ SSecurity* GetSSecurity(rdr::U8 secType);
+
+ static StringParameter secTypes;
+ private:
+ std::list<rdr::U8> enabledSecTypes;
+ };
+
const char* secTypeName(rdr::U8 num);
rdr::U8 secTypeNum(const char* name);
std::list<rdr::U8> parseSecTypes(const char* types);