[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
diff --git a/common/rfb/Makefile.am b/common/rfb/Makefile.am
index 93189b9..a3b134f 100644
--- a/common/rfb/Makefile.am
+++ b/common/rfb/Makefile.am
@@ -13,9 +13,9 @@
 	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 @@
 	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 d6a9cac..a38029a 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 9ccfb56..cb49911 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 @@
   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 @@
   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);