blob: a38029a5d51c71fcd43aca9670c8319a5738ca1c [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>
28#include <rfb/SSecurityFactoryStandard.h>
29#include <rfb/SSecurityVncAuth.h>
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000030#include <rfb/util.h>
31
Adam Tkac1d15e2d2010-04-23 14:06:38 +000032using namespace rdr;
33using namespace rfb;
34using namespace std;
35
36static LogWriter vlog("Security");
37
38Security::Security(void)
39{
40 char *secTypesStr = SSecurityFactoryStandard::sec_types.getData();
41
42 enabledSecTypes = parseSecTypes(secTypesStr);
43
44 delete secTypesStr;
45}
46
47void Security::EnableSecType(U8 secType)
48{
49 list<U8>::iterator i;
50
51 for (i = enabledSecTypes.begin(); i != enabledSecTypes.end(); i++)
52 if (*i == secType)
53 return;
54
55 enabledSecTypes.push_back(secType);
56}
57
58bool Security::IsSupported(U8 secType)
59{
60 list<U8>::iterator i;
61
62 for (i = enabledSecTypes.begin(); i != enabledSecTypes.end(); i++)
63 if (*i == secType)
64 return true;
65
66 return false;
67}
68
69SSecurity* Security::GetSSecurity(U8 secType)
70{
71 if (!IsSupported(secType))
72 goto bail;
73
74 switch (secType) {
75 case secTypeNone: return new SSecurityNone();
76 case secTypeVncAuth: return new SSecurityVncAuth();
77 default:
78 vlog.error("Undefined security type %d, aborting");
79 abort();
80 }
81
82bail:
83 throw Exception("Security type not supported");
84}
85
Adam Tkac94d88c12010-04-23 13:59:52 +000086rdr::U8 rfb::secTypeNum(const char* name)
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000087{
88 if (strcasecmp(name, "None") == 0) return secTypeNone;
89 if (strcasecmp(name, "VncAuth") == 0) return secTypeVncAuth;
90 if (strcasecmp(name, "Tight") == 0) return secTypeTight;
91 if (strcasecmp(name, "RA2") == 0) return secTypeRA2;
92 if (strcasecmp(name, "RA2ne") == 0) return secTypeRA2ne;
93 if (strcasecmp(name, "SSPI") == 0) return secTypeSSPI;
94 if (strcasecmp(name, "SSPIne") == 0) return secTypeSSPIne;
95 return secTypeInvalid;
96}
97
Adam Tkac94d88c12010-04-23 13:59:52 +000098const char* rfb::secTypeName(rdr::U8 num)
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000099{
100 switch (num) {
101 case secTypeNone: return "None";
102 case secTypeVncAuth: return "VncAuth";
103 case secTypeTight: return "Tight";
104 case secTypeRA2: return "RA2";
105 case secTypeRA2ne: return "RA2ne";
106 case secTypeSSPI: return "SSPI";
107 case secTypeSSPIne: return "SSPIne";
108 default: return "[unknown secType]";
109 }
110}
111
Adam Tkac94d88c12010-04-23 13:59:52 +0000112std::list<rdr::U8> rfb::parseSecTypes(const char* types_)
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +0000113{
Adam Tkac94d88c12010-04-23 13:59:52 +0000114 std::list<rdr::U8> result;
Adam Tkacd36b6262009-09-04 10:57:20 +0000115 CharArray types(strDup(types_)), type;
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +0000116 while (types.buf) {
117 strSplit(types.buf, ',', &type.buf, &types.buf);
Adam Tkac94d88c12010-04-23 13:59:52 +0000118 rdr::U8 typeNum = secTypeNum(type.buf);
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +0000119 if (typeNum != secTypeInvalid)
120 result.push_back(typeNum);
121 }
122 return result;
123}