]> source.dussan.org Git - tigervnc.git/commitdiff
Move getUserPasswd()/showMsgBox() to CConnection
authorKang Lin <kl222@126.com>
Tue, 30 Jul 2024 04:53:52 +0000 (12:53 +0800)
committerPierre Ossman <ossman@cendio.se>
Fri, 30 Aug 2024 10:24:17 +0000 (12:24 +0200)
Problems with the original code: A process can only establish one connection.
After modification, multiple connections can be supported.

21 files changed:
common/rfb/CConnection.h
common/rfb/CSecurity.h
common/rfb/CSecurityDH.cxx
common/rfb/CSecurityMSLogonII.cxx
common/rfb/CSecurityPlain.cxx
common/rfb/CSecurityRSAAES.cxx
common/rfb/CSecurityRSAAES.h
common/rfb/CSecurityTLS.cxx
common/rfb/CSecurityTLS.h
common/rfb/CSecurityVncAuth.cxx
common/rfb/SecurityClient.cxx
common/rfb/UserMsgBox.h [deleted file]
common/rfb/UserPasswdGetter.h [deleted file]
tests/perf/decperf.cxx
tests/perf/encperf.cxx
vncviewer/CConn.cxx
vncviewer/CConn.h
vncviewer/UserDialog.cxx
vncviewer/UserDialog.h
vncviewer/vncviewer.cxx
vncviewer/vncviewer.h

index b30a997be314c6c5be0316c19fb9b344e9579905..3f277d7163b566c607dbb065d88e52fdfe786483 100644 (file)
@@ -36,6 +36,18 @@ namespace rfb {
   class CMsgWriter;
   class CSecurity;
 
+  enum MsgBoxFlags{
+      M_OK = 0,
+      M_OKCANCEL = 1,
+      M_YESNO = 4,
+      M_ICONERROR = 0x10,
+      M_ICONQUESTION = 0x20,
+      M_ICONWARNING = 0x30,
+      M_ICONINFORMATION = 0x40,
+      M_DEFBUTTON1 = 0,
+      M_DEFBUTTON2 = 0x100
+  };
+
   class CConnection : public CMsgHandler {
   public:
 
@@ -111,7 +123,7 @@ namespace rfb {
     void serverCutText(const char* str) override;
 
     void handleClipboardCaps(uint32_t flags,
-                                     const uint32_t* lengths) override;
+                             const uint32_t* lengths) override;
     void handleClipboardRequest(uint32_t flags) override;
     void handleClipboardPeek() override;
     void handleClipboardNotify(uint32_t flags) override;
@@ -121,6 +133,17 @@ namespace rfb {
 
     // Methods to be overridden in a derived class
 
+    // getUserPasswd() gets the username and password.  This might
+    // involve a dialog, getpass(), etc.  The user buffer pointer can be
+    // null, in which case no user name will be retrieved.
+    virtual void getUserPasswd(bool secure, std::string* user,
+                               std::string* password) = 0;
+
+    // showMsgBox() displays a message box with the specified style and
+    // contents.  The return value is true if the user clicked OK/Yes.
+    virtual bool showMsgBox(MsgBoxFlags flags, const char *title,
+                            const char *text) = 0;
+
     // authSuccess() is called when authentication has succeeded.
     virtual void authSuccess();
 
index 549db7940789733eca38e3122fd12df7b71852e8..be74a1fd476e2ad2a9cf8445e4e08df5422b967c 100644 (file)
@@ -38,9 +38,6 @@
 #ifndef __RFB_CSECURITY_H__
 #define __RFB_CSECURITY_H__
 
-#include <rfb/UserPasswdGetter.h>
-#include <rfb/UserMsgBox.h>
-
 namespace rfb {
   class CConnection;
   class CSecurity {
@@ -51,13 +48,6 @@ namespace rfb {
     virtual int getType() const = 0;
     virtual bool isSecure() const { return false; }
 
-    /*
-     * Use variable directly instead of dumb get/set methods.
-     * It MUST be set by viewer.
-     */
-    static UserPasswdGetter *upg;
-    static UserMsgBox *msg;
-
   protected:
     CConnection* cc;
   };
index f3b085c720189d6dcebdd61f0dce3555f058595d..6eafbd9ca5aaba270f629bc61f36ac893e62cc8a 100644 (file)
@@ -108,7 +108,7 @@ void CSecurityDH::writeCredentials()
   std::string password;
   rdr::RandomStream rs;
 
-  (CSecurity::upg)->getUserPasswd(isSecure(), &username, &password);
+  cc->getUserPasswd(isSecure(), &username, &password);
 
   std::vector<uint8_t> bBytes(keyLength);
   if (!rs.hasData(keyLength))
index dc81751858ea40b7c2def90ada013bec281c46b6..f8ff36c1557517dcfd049b7cf3047b4b785c260b 100644 (file)
@@ -97,7 +97,7 @@ void CSecurityMSLogonII::writeCredentials()
   std::string password;
   rdr::RandomStream rs;
 
-  (CSecurity::upg)->getUserPasswd(isSecure(), &username, &password);
+  cc->getUserPasswd(isSecure(), &username, &password);
 
   std::vector<uint8_t> bBytes(8);
   if (!rs.hasData(8))
index d9599f9ca20c41785441db09749c722a2673d20f..1cbf62e1713f83507db8a2ab4c54db874184a693 100644 (file)
@@ -23,7 +23,6 @@
 
 #include <rfb/CConnection.h>
 #include <rfb/CSecurityPlain.h>
-#include <rfb/UserPasswdGetter.h>
 
 #include <rdr/OutStream.h>
 
@@ -36,7 +35,7 @@ bool CSecurityPlain::processMsg()
   std::string username;
   std::string password;
 
-  (CSecurity::upg)->getUserPasswd(cc->isSecure(), &username, &password);
+  cc->getUserPasswd(cc->isSecure(), &username, &password);
 
   // Return the response to the server
   os->writeU32(username.size());
index a78739acad788897faec042494097e129a8e149d..cc031fe3cadddc80ad9d3347985a9731e5c36c50 100644 (file)
@@ -38,7 +38,6 @@
 #include <rfb/CConnection.h>
 #include <rfb/LogWriter.h>
 #include <rfb/Exception.h>
-#include <rfb/UserMsgBox.h>
 #include <rfb/util.h>
 #include <rdr/AESInStream.h>
 #include <rdr/AESOutStream.h>
@@ -215,7 +214,7 @@ void CSecurityRSAAES::verifyServer()
     "Fingerprint: %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\n"
     "Please verify that the information is correct and press \"Yes\". "
     "Otherwise press \"No\"", f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7]);
-  if (!msg->showMsgBox(UserMsgBox::M_YESNO, title, text.c_str()))
+  if (!cc->showMsgBox(MsgBoxFlags::M_YESNO, title, text.c_str()))
     throw Exception("server key mismatch");
 }
 
@@ -438,9 +437,9 @@ void CSecurityRSAAES::writeCredentials()
   std::string password;
 
   if (subtype == secTypeRA2UserPass)
-    (CSecurity::upg)->getUserPasswd(isSecure(), &username, &password);
+    cc->getUserPasswd(isSecure(), &username, &password);
   else
-    (CSecurity::upg)->getUserPasswd(isSecure(), nullptr, &password);
+    cc->getUserPasswd(isSecure(), nullptr, &password);
 
   if (subtype == secTypeRA2UserPass) {
     if (username.size() > 255)
index 29bfd5750629fee74398c983e4bc3cdec93bc7da..35b0513bb2b8c7a26366fea60965a57230601e79 100644 (file)
 #include <nettle/rsa.h>
 #include <rfb/CSecurity.h>
 #include <rfb/Security.h>
-#include <rfb/UserMsgBox.h>
 #include <rdr/InStream.h>
 #include <rdr/OutStream.h>
 #include <rdr/RandomStream.h>
 
 namespace rfb {
-  class UserMsgBox;
   class CSecurityRSAAES : public CSecurity {
   public:
     CSecurityRSAAES(CConnection* cc, uint32_t secType,
index 2a7a117948390430c9711d97e22ed348969f7f5b..eff215ab003c11e8748e7a0752ed7bf431b85d1c 100644 (file)
@@ -38,7 +38,6 @@
 #include <rfb/CConnection.h>
 #include <rfb/LogWriter.h>
 #include <rfb/Exception.h>
-#include <rfb/UserMsgBox.h>
 #include <rfb/util.h>
 #include <rdr/TLSException.h>
 #include <rdr/TLSInStream.h>
@@ -442,7 +441,7 @@ void CSecurityTLS::checkSession()
                     "Do you want to make an exception for this "
                     "server?", info.data);
 
-      if (!msg->showMsgBox(UserMsgBox::M_YESNO,
+      if (!cc->showMsgBox(MsgBoxFlags::M_YESNO,
                            "Unknown certificate issuer",
                            text.c_str()))
         throw AuthCancelledException();
@@ -462,8 +461,7 @@ void CSecurityTLS::checkSession()
                     "\n"
                     "Do you want to make an exception for this "
                     "server?", info.data);
-
-      if (!msg->showMsgBox(UserMsgBox::M_YESNO,
+      if (!cc->showMsgBox(MsgBoxFlags::M_YESNO,
                            "Certificate is not yet valid",
                            text.c_str()))
         throw AuthCancelledException();
@@ -482,7 +480,7 @@ void CSecurityTLS::checkSession()
                     "Do you want to make an exception for this "
                     "server?", info.data);
 
-      if (!msg->showMsgBox(UserMsgBox::M_YESNO,
+      if (!cc->showMsgBox(MsgBoxFlags::M_YESNO,
                            "Expired certificate",
                            text.c_str()))
         throw AuthCancelledException();
@@ -501,7 +499,7 @@ void CSecurityTLS::checkSession()
                     "Do you want to make an exception for this "
                     "server?", info.data);
 
-      if (!msg->showMsgBox(UserMsgBox::M_YESNO,
+      if (!cc->showMsgBox(MsgBoxFlags::M_YESNO,
                            "Insecure certificate algorithm",
                            text.c_str()))
         throw AuthCancelledException();
@@ -526,7 +524,7 @@ void CSecurityTLS::checkSession()
                     "Do you want to make an exception for this "
                     "server?", client->getServerName(), info.data);
 
-      if (!msg->showMsgBox(UserMsgBox::M_YESNO,
+      if (!cc->showMsgBox(MsgBoxFlags::M_YESNO,
                            "Certificate hostname mismatch",
                            text.c_str()))
         throw AuthCancelledException();
@@ -552,7 +550,7 @@ void CSecurityTLS::checkSession()
                     "Do you want to make an exception for this "
                     "server?", info.data);
 
-      if (!msg->showMsgBox(UserMsgBox::M_YESNO,
+      if (!cc->showMsgBox(MsgBoxFlags::M_YESNO,
                            "Unexpected server certificate",
                            text.c_str()))
         throw AuthCancelledException();
@@ -575,7 +573,7 @@ void CSecurityTLS::checkSession()
                     "Do you want to make an exception for this "
                     "server?", info.data);
 
-      if (!msg->showMsgBox(UserMsgBox::M_YESNO,
+      if (!cc->showMsgBox(MsgBoxFlags::M_YESNO,
                            "Unexpected server certificate",
                            text.c_str()))
         throw AuthCancelledException();
@@ -596,7 +594,7 @@ void CSecurityTLS::checkSession()
                     "Do you want to make an exception for this "
                     "server?", info.data);
 
-      if (!msg->showMsgBox(UserMsgBox::M_YESNO,
+      if (!cc->showMsgBox(MsgBoxFlags::M_YESNO,
                            "Unexpected server certificate",
                            text.c_str()))
         throw AuthCancelledException();
@@ -617,7 +615,7 @@ void CSecurityTLS::checkSession()
                     "Do you want to make an exception for this "
                     "server?", info.data);
 
-      if (!msg->showMsgBox(UserMsgBox::M_YESNO,
+      if (!cc->showMsgBox(MsgBoxFlags::M_YESNO,
                            "Unexpected server certificate",
                            text.c_str()))
         throw AuthCancelledException();
@@ -644,7 +642,7 @@ void CSecurityTLS::checkSession()
                     "Do you want to make an exception for this "
                     "server?", client->getServerName(), info.data);
 
-      if (!msg->showMsgBox(UserMsgBox::M_YESNO,
+      if (!cc->showMsgBox(MsgBoxFlags::M_YESNO,
                            "Unexpected server certificate",
                            text.c_str()))
         throw AuthCancelledException();
index 8688b742c8140e1ef3fc313cc677a4ecda89ce05..848ef9bb8c7586942505bcfdad87571a76054e06 100644 (file)
@@ -28,7 +28,6 @@
 
 #include <rfb/CSecurity.h>
 #include <rfb/Security.h>
-#include <rfb/UserMsgBox.h>
 #include <rdr/InStream.h>
 #include <rdr/OutStream.h>
 #include <gnutls/gnutls.h>
index e5f842baacd34e5e3b67450b6ab6177b8fb8f4d1..2fd83fe936df5acd492b66ed70f8b291a711676f 100644 (file)
@@ -54,7 +54,7 @@ bool CSecurityVncAuth::processMsg()
   uint8_t challenge[vncAuthChallengeSize];
   is->readBytes(challenge, vncAuthChallengeSize);
   std::string passwd;
-  (CSecurity::upg)->getUserPasswd(cc->isSecure(), nullptr, &passwd);
+  cc->getUserPasswd(cc->isSecure(), nullptr, &passwd);
 
   // Calculate the correct response
   uint8_t key[8];
index d1507eb5c3afd506d4579e819d620ba1440b6a91..9cd3b90475b5d969cf635014d63e447558898300 100644 (file)
 
 using namespace rfb;
 
-UserPasswdGetter *CSecurity::upg = nullptr;
-#if defined(HAVE_GNUTLS) || defined(HAVE_NETTLE)
-UserMsgBox *CSecurity::msg = nullptr;
-#endif
-
 StringParameter SecurityClient::secTypes
 ("SecurityTypes",
  "Specify which security scheme to use (None, VncAuth, Plain"
@@ -66,11 +61,6 @@ ConfViewer);
 
 CSecurity* SecurityClient::GetCSecurity(CConnection* cc, uint32_t secType)
 {
-  assert (CSecurity::upg != nullptr); /* (upg == nullptr) means bug in the viewer */
-#if defined(HAVE_GNUTLS) || defined(HAVE_NETTLE)
-  assert (CSecurity::msg != nullptr);
-#endif
-
   if (!IsSupported(secType))
     goto bail;
 
diff --git a/common/rfb/UserMsgBox.h b/common/rfb/UserMsgBox.h
deleted file mode 100644 (file)
index 392950d..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
- * Copyright (C) 2010 TigerVNC Team
- *
- * 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.
- */
-#ifndef __RFB_USERMSGBOX_H__
-#define __RFB_USERMSGBOX_H__
-
-namespace rfb {
-  class UserMsgBox {
-  public:
-    enum MsgBoxFlags{
-      M_OK = 0,
-      M_OKCANCEL = 1,
-      M_YESNO = 4,
-      M_ICONERROR = 0x10,
-      M_ICONQUESTION = 0x20,
-      M_ICONWARNING = 0x30,
-      M_ICONINFORMATION = 0x40,
-      M_DEFBUTTON1 = 0,
-      M_DEFBUTTON2 = 0x100
-    };
-    /* TODO Implement as function with variable arguments */
-    virtual bool showMsgBox(int flags,const char* title, const char* text)=0;
-  };
-}
-
-#endif
diff --git a/common/rfb/UserPasswdGetter.h b/common/rfb/UserPasswdGetter.h
deleted file mode 100644 (file)
index db7df39..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Copyright (C) 2002-2005 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.
- */
-#ifndef __RFB_USERPASSWDGETTER_H__
-#define __RFB_USERPASSWDGETTER_H__
-
-#include <string>
-
-namespace rfb {
-  class UserPasswdGetter {
-  public:
-    // getUserPasswd gets the username and password.  This might involve a
-    // dialog, getpass(), etc.  The user buffer pointer can be null, in which
-    // case no user name will be retrieved.
-    virtual void getUserPasswd(bool secure, std::string* user,
-                               std::string* password)=0;
-
-    virtual ~UserPasswdGetter() {}
-  };
-}
-
-#endif
index ef53a6866309a43cd6d27092619e3e6b2f490688..fb2390be2c36f54ff8bbbcd67ad693196e1e383b 100644 (file)
@@ -75,6 +75,8 @@ public:
   void setColourMapEntries(int, int, uint16_t*) override;
   void bell() override;
   void serverCutText(const char*) override;
+  virtual void getUserPasswd(bool secure, std::string *user, std::string *password) override;
+  virtual bool showMsgBox(rfb::MsgBoxFlags flags, const char *title, const char *text) override;
 
 public:
   double cpuTime;
@@ -82,6 +84,7 @@ public:
 protected:
   rdr::FileInStream *in;
   DummyOutStream *out;
+
 };
 
 DummyOutStream::DummyOutStream()
@@ -174,6 +177,15 @@ void CConn::serverCutText(const char*)
 {
 }
 
+void CConn::getUserPasswd(bool, std::string *, std::string *)
+{
+}
+
+bool CConn::showMsgBox(rfb::MsgBoxFlags, const char *, const char *)
+{
+    return true;
+}
+
 struct stats
 {
   double decodeTime;
index ac8e9d47adef6376507d70c25acdc4384c8226b1..c6e2d3b7a113ab11b90951cc52dd9927b3638f56 100644 (file)
@@ -108,6 +108,8 @@ public:
   void setColourMapEntries(int, int, uint16_t*) override;
   void bell() override;
   void serverCutText(const char*) override;
+  virtual void getUserPasswd(bool secure, std::string *user, std::string *password) override;
+  virtual bool showMsgBox(rfb::MsgBoxFlags flags, const char *title, const char *text) override;
 
 public:
   double decodeTime;
@@ -279,6 +281,15 @@ void CConn::serverCutText(const char*)
 {
 }
 
+void CConn::getUserPasswd(bool, std::string *, std::string *)
+{
+}
+
+bool CConn::showMsgBox(rfb::MsgBoxFlags, const char *, const char *)
+{
+    return true;
+}
+
 Manager::Manager(class rfb::SConnection *conn_) :
   EncodeManager(conn_)
 {
index e1c7596203932aa34ffb5e47c1740f975328f2fc..81bea534c1f7a489d54bbe16c40f5d988474a626 100644 (file)
@@ -275,7 +275,7 @@ void CConn::socketEvent(FL_SOCKET fd, void *data)
     vlog.info("%s", e.str());
     disconnect();
   } catch (rfb::AuthFailureException& e) {
-    reset_password_data();
+    cc->resetPassword();
     vlog.error(_("Authentication failed: %s"), e.str());
     abort_connection(_("Failed to authenticate with the server. Reason "
                        "given by the server:\n\n%s"), e.str());
@@ -292,8 +292,25 @@ void CConn::socketEvent(FL_SOCKET fd, void *data)
   recursing = false;
 }
 
+void CConn::resetPassword()
+{
+    dlg.resetPassword();
+}
+
 ////////////////////// CConnection callback methods //////////////////////
 
+bool CConn::showMsgBox(MsgBoxFlags flags, const char *title,
+                       const char *text)
+{
+    return dlg.showMsgBox(flags, title, text);
+}
+
+void CConn::getUserPasswd(bool secure, std::string *user,
+                          std::string *password)
+{
+    dlg.getUserPasswd(secure, user, password);
+}
+
 // initDone() is called when the serverInit message has been received.  At
 // this point we create the desktop window and display it.  We also tell the
 // server the pixel format and encodings to use and request the first update.
index fcaf49f6e923b6fbca97c96acf18e880a29dba10..1e71be94c2465a2a1ef73f3e8c59ad64a18ef418 100644 (file)
@@ -24,6 +24,7 @@
 
 #include <rfb/CConnection.h>
 #include <rdr/FdInStream.h>
+#include "UserDialog.h"
 
 namespace network { class Socket; }
 
@@ -44,7 +45,16 @@ public:
   // Callback when socket is ready (or broken)
   static void socketEvent(FL_SOCKET fd, void *data);
 
+  // Forget any saved password
+  void resetPassword();
+
   // CConnection callback methods
+
+  bool showMsgBox(rfb::MsgBoxFlags flags, const char *title,
+                  const char *text) override;
+  void getUserPasswd(bool secure, std::string *user,
+                     std::string *password) override;
+
   void initDone() override;
 
   void setDesktopSize(int w, int h) override;
@@ -105,6 +115,8 @@ private:
   struct timeval updateStartTime;
   size_t updateStartPos;
   unsigned long long bpsEstimate;
+
+  UserDialog dlg;
 };
 
 #endif
index a376785768acf27208ace437eece212915f7ddcf..901503c6dd842c21e7adb61f85dad8914b2f45ea 100644 (file)
@@ -248,7 +248,7 @@ void UserDialog::getUserPasswd(bool secure_, std::string* user,
     throw rfb::AuthCancelledException();
 }
 
-bool UserDialog::showMsgBox(int flags, const char* title, const char* text)
+bool UserDialog::showMsgBox(MsgBoxFlags flags, const char* title, const char* text)
 {
   char buffer[1024];
 
index aa50127e74ca2414186800a76dbacb2046293110..c16923c12886910739cd5b7ee49c3278934e52f1 100644 (file)
 #ifndef __USERDIALOG_H__
 #define __USERDIALOG_H__
 
-#include <rfb/UserPasswdGetter.h>
-#include <rfb/UserMsgBox.h>
+#include <rfb/CConnection.h>
 
-class UserDialog : public rfb::UserPasswdGetter,
-                   public rfb::UserMsgBox
+class UserDialog
 {
 public:
   UserDialog();
@@ -32,15 +30,14 @@ public:
   // UserPasswdGetter callbacks
 
   void getUserPasswd(bool secure, std::string* user,
-                     std::string* password) override;
+                     std::string* password);
 
   // UserMsgBox callbacks
-
-  bool showMsgBox(int flags, const char* title, const char* text) override;
+  bool showMsgBox(rfb::MsgBoxFlags flags, const char* title, const char* text);
 
   void resetPassword();
 
- private:
+private:
   std::string savedUsername;
   std::string savedPassword;
 };
index 24099e12e18b1b861984f405adb2cc0a68381e17..ab95c0c62afa853aaf8327130e10f970004348cc 100644 (file)
@@ -93,8 +93,6 @@ static bool exitMainloop = false;
 static char *exitError = nullptr;
 static bool fatalError = false;
 
-static UserDialog dlg;
-
 static const char *about_text()
 {
   static char buffer[1024];
@@ -171,11 +169,6 @@ bool should_disconnect()
   return exitMainloop;
 }
 
-void reset_password_data()
-{
-  dlg.resetPassword();
-}
-
 void about_vncviewer()
 {
   fl_message_title(_("About TigerVNC Viewer"));
@@ -776,11 +769,6 @@ int main(int argc, char** argv)
 
   create_base_dirs();
 
-  CSecurity::upg = &dlg;
-#if defined(HAVE_GNUTLS) || defined(HAVE_NETTLE)
-  CSecurity::msg = &dlg;
-#endif
-
   Socket *sock = nullptr;
 
 #ifndef WIN32
index c864805cd7b3e42c4496d44415ddaaf205a37281..f39a57761897099df19d3af74bf5ca2955c79951 100644 (file)
@@ -33,7 +33,6 @@ void abort_connection_with_unexpected_error(const rdr::Exception &);
 
 void disconnect();
 bool should_disconnect();
-void reset_password_data();
 
 void about_vncviewer();