blob: adc21c99a8def8e7999fe29be5a6908e36f7d9da [file] [log] [blame]
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +00001/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
2 *
3 * This is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This software is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
16 * USA.
17 */
Adam Tkac1d15e2d2010-04-23 14:06:38 +000018#include <assert.h>
19#include <stdlib.h>
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000020#include <string.h>
21#ifdef _WIN32
22#define strcasecmp _stricmp
23#endif
Adam Tkac1d15e2d2010-04-23 14:06:38 +000024#include <rdr/Exception.h>
25#include <rfb/LogWriter.h>
Adam Tkacb6eb3992010-04-23 14:05:00 +000026#include <rfb/Security.h>
Adam Tkac1d15e2d2010-04-23 14:06:38 +000027#include <rfb/SSecurityNone.h>
Adam Tkac1d15e2d2010-04-23 14:06:38 +000028#include <rfb/SSecurityVncAuth.h>
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000029#include <rfb/util.h>
30
Adam Tkac1d15e2d2010-04-23 14:06:38 +000031using namespace rdr;
32using namespace rfb;
33using namespace std;
34
35static LogWriter vlog("Security");
36
Adam Tkaca6578bf2010-04-23 14:07:41 +000037StringParameter Security::secTypes
38("SecurityTypes",
39 "Specify which security scheme to use (None, VncAuth)",
40 "VncAuth");
41
Adam Tkac1d15e2d2010-04-23 14:06:38 +000042Security::Security(void)
43{
Adam Tkaca6578bf2010-04-23 14:07:41 +000044 char *secTypesStr = secTypes.getData();
Adam Tkac1d15e2d2010-04-23 14:06:38 +000045
46 enabledSecTypes = parseSecTypes(secTypesStr);
47
48 delete secTypesStr;
49}
50
51void Security::EnableSecType(U8 secType)
52{
53 list<U8>::iterator i;
54
55 for (i = enabledSecTypes.begin(); i != enabledSecTypes.end(); i++)
56 if (*i == secType)
57 return;
58
59 enabledSecTypes.push_back(secType);
60}
61
62bool Security::IsSupported(U8 secType)
63{
64 list<U8>::iterator i;
65
66 for (i = enabledSecTypes.begin(); i != enabledSecTypes.end(); i++)
67 if (*i == secType)
68 return true;
69
70 return false;
71}
72
73SSecurity* Security::GetSSecurity(U8 secType)
74{
75 if (!IsSupported(secType))
76 goto bail;
77
78 switch (secType) {
79 case secTypeNone: return new SSecurityNone();
80 case secTypeVncAuth: return new SSecurityVncAuth();
81 default:
82 vlog.error("Undefined security type %d, aborting");
83 abort();
84 }
85
86bail:
87 throw Exception("Security type not supported");
88}
89
Adam Tkac94d88c12010-04-23 13:59:52 +000090rdr::U8 rfb::secTypeNum(const char* name)
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000091{
92 if (strcasecmp(name, "None") == 0) return secTypeNone;
93 if (strcasecmp(name, "VncAuth") == 0) return secTypeVncAuth;
94 if (strcasecmp(name, "Tight") == 0) return secTypeTight;
95 if (strcasecmp(name, "RA2") == 0) return secTypeRA2;
96 if (strcasecmp(name, "RA2ne") == 0) return secTypeRA2ne;
97 if (strcasecmp(name, "SSPI") == 0) return secTypeSSPI;
98 if (strcasecmp(name, "SSPIne") == 0) return secTypeSSPIne;
99 return secTypeInvalid;
100}
101
Adam Tkac94d88c12010-04-23 13:59:52 +0000102const char* rfb::secTypeName(rdr::U8 num)
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +0000103{
104 switch (num) {
105 case secTypeNone: return "None";
106 case secTypeVncAuth: return "VncAuth";
107 case secTypeTight: return "Tight";
108 case secTypeRA2: return "RA2";
109 case secTypeRA2ne: return "RA2ne";
110 case secTypeSSPI: return "SSPI";
111 case secTypeSSPIne: return "SSPIne";
112 default: return "[unknown secType]";
113 }
114}
115
Adam Tkac94d88c12010-04-23 13:59:52 +0000116std::list<rdr::U8> rfb::parseSecTypes(const char* types_)
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +0000117{
Adam Tkac94d88c12010-04-23 13:59:52 +0000118 std::list<rdr::U8> result;
Adam Tkacd36b6262009-09-04 10:57:20 +0000119 CharArray types(strDup(types_)), type;
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +0000120 while (types.buf) {
121 strSplit(types.buf, ',', &type.buf, &types.buf);
Adam Tkac94d88c12010-04-23 13:59:52 +0000122 rdr::U8 typeNum = secTypeNum(type.buf);
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +0000123 if (typeNum != secTypeInvalid)
124 result.push_back(typeNum);
125 }
126 return result;
127}