Initial revision
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/rfb/SSecurityFactoryStandard.cxx b/rfb/SSecurityFactoryStandard.cxx
new file mode 100644
index 0000000..e3a40aa
--- /dev/null
+++ b/rfb/SSecurityFactoryStandard.cxx
@@ -0,0 +1,101 @@
+/* Copyright (C) 2002-2004 RealVNC Ltd. All Rights Reserved.
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+//
+// SSecurityFactoryStandard
+//
+
+#include <rfb/secTypes.h>
+#include <rfb/SSecurityNone.h>
+#include <rfb/Configuration.h>
+#include <rfb/LogWriter.h>
+#include <rfb/Exception.h>
+#include <rfb/SSecurityFactoryStandard.h>
+
+using namespace rfb;
+
+static LogWriter vlog("SSecurityFactoryStandard");
+
+VncAuthPasswdParameter* SSecurityFactoryStandard::vncAuthPasswd = 0;
+
+
+SSecurity* SSecurityFactoryStandard::getSSecurity(int secType, bool noAuth) {
+ switch (secType) {
+ case secTypeNone: return new SSecurityNone();
+ case secTypeVncAuth:
+ if (!vncAuthPasswd)
+ throw rdr::Exception("No VncAuthPasswdParameter defined!");
+ return new SSecurityVncAuth(vncAuthPasswd);
+ default:
+ throw Exception("Unsupported secType?");
+ }
+}
+
+VncAuthPasswdParameter::VncAuthPasswdParameter() {
+ if (SSecurityFactoryStandard::vncAuthPasswd)
+ throw rdr::Exception("duplicate VncAuthPasswdParameter!");
+ SSecurityFactoryStandard::vncAuthPasswd = this;
+}
+
+
+VncAuthPasswdConfigParameter::VncAuthPasswdConfigParameter()
+: passwdParam("Password",
+ "Obfuscated binary encoding of the password which clients must supply to "
+ "access the server", 0, 0) {
+}
+
+char* VncAuthPasswdConfigParameter::getVncAuthPasswd() {
+ CharArray obfuscated;
+ int len;
+ passwdParam.getData((void**)&obfuscated.buf, &len);
+ printf("vnc password len=%d\n", len); // ***
+ if (len == 8) {
+ CharArray password(9);
+ memcpy(password.buf, obfuscated.buf, 8);
+ vncAuthUnobfuscatePasswd(password.buf);
+ return password.takeBuf();
+ }
+ return 0;
+}
+
+
+VncAuthPasswdFileParameter::VncAuthPasswdFileParameter()
+ : param("PasswordFile", "Password file for VNC authentication", "") {
+}
+
+char* VncAuthPasswdFileParameter::getVncAuthPasswd() {
+ CharArray fname(param.getData());
+ if (!fname.buf[0]) {
+ vlog.error("passwordFile parameter not set");
+ return 0;
+ }
+ FILE* fp = fopen(fname.buf, "r");
+ if (!fp) {
+ vlog.error("opening password file '%s' failed",fname.buf);
+ return 0;
+ }
+ CharArray passwd(9);
+ int len = fread(passwd.buf, 1, 9, fp);
+ fclose(fp);
+ if (len != 8) {
+ vlog.error("password file '%s' is the wrong length",fname.buf);
+ return 0;
+ }
+ vncAuthUnobfuscatePasswd(passwd.buf);
+ return passwd.takeBuf();
+}
+