Martin Prikryl 13 years ago
parent
commit
f028255b5b

+ 1 - 1
Console.rc

@@ -16,7 +16,7 @@ FILETYPE 0x1
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "winscp.com\0"
             VALUE "ProductName", "WinSCP\0"
-            VALUE "ProductVersion", "4.3.8.0\0"
+            VALUE "ProductVersion", "4.3.9.0\0"
             VALUE "ReleaseType", "stable\0"
             VALUE "WWW", "http://winscp.net/\0"
         }

+ 1 - 1
DragExt.rc

@@ -16,7 +16,7 @@ FILETYPE 0x2
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "dragext.dll\0"
             VALUE "ProductName", "WinSCP\0"
-            VALUE "ProductVersion", "4.3.8.0\0"
+            VALUE "ProductVersion", "4.3.9.0\0"
             VALUE "ReleaseType", "stable\0"
             VALUE "WWW", "http://winscp.net/\0"
         }

+ 1 - 1
DragExt64.rc

@@ -16,7 +16,7 @@ FILETYPE 0x2
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "dragext64.dll\0"
             VALUE "ProductName", "WinSCP\0"
-            VALUE "ProductVersion", "4.3.8.0\0"
+            VALUE "ProductVersion", "4.3.9.0\0"
             VALUE "ReleaseType", "stable\0"
             VALUE "WWW", "http://winscp.net/\0"
         }

+ 4 - 4
WinSCP.rc

@@ -1,6 +1,6 @@
 1 VERSIONINFO
-FILEVERSION 4,3,8,1771
-PRODUCTVERSION 4,3,8,1771
+FILEVERSION 4,3,9,1817
+PRODUCTVERSION 4,3,9,1817
 FILEOS 0x4
 FILETYPE 0x1
 {
@@ -10,13 +10,13 @@ FILETYPE 0x1
         {
             VALUE "CompanyName", "Martin Prikryl\0"
             VALUE "FileDescription", "WinSCP: SFTP, FTP and SCP client\0"
-            VALUE "FileVersion", "4.3.8.1771\0"
+            VALUE "FileVersion", "4.3.9.1817\0"
             VALUE "InternalName", "winscp\0"
             VALUE "LegalCopyright", "(c) 2000-2012 Martin Prikryl\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "winscp.exe\0"
             VALUE "ProductName", "WinSCP\0"
-            VALUE "ProductVersion", "4.3.8.0\0"
+            VALUE "ProductVersion", "4.3.9.0\0"
             VALUE "ReleaseType", "stable\0"
             VALUE "WWW", "http://winscp.net/\0"
         }

+ 5 - 1
core/Script.cpp

@@ -1542,7 +1542,11 @@ void __fastcall TManagementScript::TerminalPromptUser(TTerminal * Terminal,
   TPromptKind Kind, AnsiString Name, AnsiString Instructions, TStrings * Prompts,
   TStrings * Results, bool & Result, void * Arg)
 {
-  if ((!Terminal->StoredCredentialsTried || !IsAuthenticationPrompt(Kind)) &&
+  // When authentication using stored password fails,
+  // do not ask user for another password.
+  if ((!Terminal->StoredCredentialsTried ||
+       !IsAuthenticationPrompt(Kind) ||
+       (Prompts->Count == 0)) && // allow instructions-only prompts
       (OnTerminalPromptUser != NULL))
   {
     OnTerminalPromptUser(Terminal, Kind, Name, Instructions, Prompts, Results, Result, Arg);

+ 4 - 4
core/SessionData.cpp

@@ -156,7 +156,7 @@ void __fastcall TSessionData::Default()
 
   // FTP
   FtpPasvMode = true;
-  FtpForcePasvIp = false;
+  FtpForcePasvIp = asAuto;
   FtpAccount = "";
   FtpPingInterval = 30;
   FtpPingType = ptDummyCommand;
@@ -526,7 +526,7 @@ void __fastcall TSessionData::Load(THierarchicalStorage * Storage)
 
     // Ftp prefix
     FtpPasvMode = Storage->ReadBool("FtpPasvMode", FtpPasvMode);
-    FtpForcePasvIp = Storage->ReadBool("FtpForcePasvIp", FtpForcePasvIp);
+    FtpForcePasvIp = TAutoSwitch(Storage->ReadInteger(L"FtpForcePasvIp2", FtpForcePasvIp));
     FtpAccount = Storage->ReadString("FtpAccount", FtpAccount);
     FtpPingInterval = Storage->ReadInteger("FtpPingInterval", FtpPingInterval);
     FtpPingType = static_cast<TPingType>(Storage->ReadInteger("FtpPingType", FtpPingType));
@@ -785,7 +785,7 @@ void __fastcall TSessionData::Save(THierarchicalStorage * Storage,
       WRITE_DATA(Integer, TunnelLocalPortNumber);
 
       WRITE_DATA(Bool, FtpPasvMode);
-      WRITE_DATA(Bool, FtpForcePasvIp);
+      WRITE_DATA_EX(Integer, "FtpForcePasvIp2", FtpForcePasvIp, );
       WRITE_DATA(String, FtpAccount);
       WRITE_DATA(Integer, FtpPingInterval);
       WRITE_DATA(Integer, FtpPingType);
@@ -2020,7 +2020,7 @@ void __fastcall TSessionData::SetFtpPasvMode(bool value)
   SET_SESSION_PROPERTY(FtpPasvMode);
 }
 //---------------------------------------------------------------------
-void __fastcall TSessionData::SetFtpForcePasvIp(bool value)
+void __fastcall TSessionData::SetFtpForcePasvIp(TAutoSwitch value)
 {
   SET_SESSION_PROPERTY(FtpForcePasvIp);
 }

+ 3 - 3
core/SessionData.h

@@ -138,7 +138,7 @@ private:
   int FTunnelLocalPortNumber;
   AnsiString FTunnelPortFwd;
   bool FFtpPasvMode;
-  bool FFtpForcePasvIp;
+  TAutoSwitch FFtpForcePasvIp;
   AnsiString FFtpAccount;
   int FFtpPingInterval;
   TPingType FFtpPingType;
@@ -272,7 +272,7 @@ private:
   void __fastcall SetTunnelLocalPortNumber(int value);
   bool __fastcall GetTunnelAutoassignLocalPortNumber();
   void __fastcall SetFtpPasvMode(bool value);
-  void __fastcall SetFtpForcePasvIp(bool value);
+  void __fastcall SetFtpForcePasvIp(TAutoSwitch value);
   void __fastcall SetFtpAccount(AnsiString value);
   void __fastcall SetFtpPingInterval(int value);
   void __fastcall SetFtpPingType(TPingType value);
@@ -418,7 +418,7 @@ public:
   __property int TunnelLocalPortNumber = { read = FTunnelLocalPortNumber, write = SetTunnelLocalPortNumber };
   __property AnsiString TunnelPortFwd = { read = FTunnelPortFwd, write = SetTunnelPortFwd };
   __property bool FtpPasvMode = { read = FFtpPasvMode, write = SetFtpPasvMode };
-  __property bool FtpForcePasvIp = { read = FFtpForcePasvIp, write = SetFtpForcePasvIp };
+  __property TAutoSwitch FtpForcePasvIp = { read = FFtpForcePasvIp, write = SetFtpForcePasvIp };
   __property AnsiString FtpAccount = { read = FFtpAccount, write = SetFtpAccount };
   __property int FtpPingInterval  = { read=FFtpPingInterval, write=SetFtpPingInterval };
   __property TDateTime FtpPingIntervalDT  = { read=GetFtpPingIntervalDT };

+ 2 - 2
core/SessionInfo.cpp

@@ -971,6 +971,7 @@ void __fastcall TSessionLog::DoAddStartupInfo(TSessionData * Data)
         ADF("Local command: %s", (Data->ProxyLocalCommand));
       }
     }
+    char const * BugFlags = "+-A";
     if (Data->UsesSsh)
     {
       ADF("SSH protocol version: %s; Compression: %s",
@@ -988,7 +989,6 @@ void __fastcall TSessionLog::DoAddStartupInfo(TSessionData * Data)
       ADF("Ciphers: %s; Ssh2DES: %s",
         (Data->CipherList, BooleanToEngStr(Data->Ssh2DES)));
       AnsiString Bugs;
-      char const * BugFlags = "A+-";
       for (int Index = 0; Index < BUG_COUNT; Index++)
       {
         Bugs += AnsiString(BugFlags[Data->Bug[(TSshBug)Index]])+(Index<BUG_COUNT-1?",":"");
@@ -1037,7 +1037,7 @@ void __fastcall TSessionLog::DoAddStartupInfo(TSessionData * Data)
       }
       ADF("FTP: FTPS: %s; Passive: %s [Force IP: %s]",
         (Ftps, BooleanToEngStr(Data->FtpPasvMode),
-         BooleanToEngStr(Data->FtpForcePasvIp)));
+         BugFlags[Data->FtpForcePasvIp]));
     }
     ADF("Local directory: %s, Remote directory: %s, Update: %s, Cache: %s",
       ((Data->LocalDirectory.IsEmpty() ? AnsiString("default") : Data->LocalDirectory),

+ 13 - 0
core/Terminal.cpp

@@ -2298,6 +2298,19 @@ void __fastcall TTerminal::CustomReadDirectory(TRemoteFileList * FileList)
   assert(FileList);
   assert(FFileSystem);
   FFileSystem->ReadDirectory(FileList);
+
+  if (Configuration->ActualLogProtocol >= 1)
+  {
+    for (int Index = 0; Index < FileList->Count; Index++)
+    {
+      TRemoteFile * File = FileList->Files[Index];
+      LogEvent(FORMAT("%s;%s;%s;%s;%s;%s;%s;%d",
+        (File->FileName, File->Type, IntToStr(File->Size), File->UserModificationStr,
+         File->Owner.LogText, File->Group.LogText, File->Rights->Text,
+         File->Attr)));
+    }
+  }
+
   ReactOnCommand(fsListDirectory);
 }
 //---------------------------------------------------------------------------

+ 2 - 0
filezilla/AsyncSocketEx.h

@@ -327,6 +327,8 @@ protected:
 	// Pending callbacks
 	std::list<t_callbackMsg> m_pendingCallbacks;
 #endif // NOLAYERS
+
+	virtual void LogSocketMessage(int nMessageType, LPCTSTR pMsgFormat) {};
 };
 
 #ifndef NOLAYERS

+ 9 - 1
filezilla/AsyncSocketExLayer.cpp

@@ -1002,4 +1002,12 @@ bool CAsyncSocketExLayer::TryNextProtocol()
 		return FALSE;
 	else
 		return TRUE;
-}
+}
+
+void CAsyncSocketExLayer::LogSocketMessage(int nMessageType, LPCTSTR pMsgFormat)
+{ 
+	if (m_pPrevLayer)
+		m_pPrevLayer->LogSocketMessage(nMessageType, pMsgFormat);
+	else
+		m_pOwnerSocket->LogSocketMessage(nMessageType, pMsgFormat);
+}

+ 2 - 0
filezilla/AsyncSocketExLayer.h

@@ -140,6 +140,8 @@ protected:
 	// Iterate through protocols
 	bool TryNextProtocol();
 
+	void LogSocketMessage(int nMessageType, LPCTSTR pMsgFormat);
+
 private:
 	//Layer state can't be set directly from derived classes
 	void SetLayerState(int nLayerState);

+ 60 - 207
filezilla/AsyncSslSocketLayer.cpp

@@ -271,161 +271,6 @@ protected:
 #define CCRITICALSECTIONWRAPPERINCLUDED
 #endif
 
-/////////////////////////////////////////////////////////////////////////////
-
-static long ssl_sessions_general_age = 0;
-
-/*
- * Check if there's a session ID for the given connection in the cache, and if
- * there's one suitable, it is provided. Returns true when entry matched.
- */
-static bool ssl_getsessionid(const char *host_name, long remote_port,
-	ssl_session_info_t *ssl_sessions,
-	size_t max_ssl_sessions,
-	void **ssl_sessionid)
-{
-	if (!ssl_sessions)
-	{
-		return false;
-	}
-	ssl_session_info_t *check = NULL;
-	size_t i = 0;
-	bool match = false;
-
-	*ssl_sessionid = NULL;
-
-	for (i = 0; i < max_ssl_sessions; i++)
-	{
-		check = &ssl_sessions[i];
-		if (!check->sessionid)
-		  /* not session ID means blank entry */
-		  continue;
-		if (host_name && check->name && (0 == strcmp(host_name, check->name)) &&
-		   (remote_port == check->remote_port))
-		{
-			/* yes, we have a session ID! */
-			ssl_sessions_general_age++;          /* increase general age */
-			check->age = ssl_sessions_general_age; /* set this as used in this age */
-			*ssl_sessionid = check->sessionid;
-			match = true;
-			break;
-		}
-	}
-
-	return match;
-}
-
-/*
- * Kill a single session ID entry in the cache.
- */
-static void ssl_kill_session(
-		ssl_session_info_t *ssl_sessions,
-		size_t max_ssl_sessions,
-		ssl_session_info_t *session)
-{
-	if (!ssl_sessions)
-	{
-		return;
-	}
-	if (session->sessionid)
-	{
-		/* defensive check */
-
-		/* free the ID the SSL-layer specific way */
-		SSL_SESSION_free((SSL_SESSION *)session->sessionid);
-
-		session->sessionid = NULL;
-		session->age = 0; /* fresh */
-
-		free(session->name);
-		session->name = NULL;
-	}
-}
-
-/*
- * Delete the given session ID from the cache.
- */
-static void ssl_delsessionid(const char *host_name, long remote_port, 
-	ssl_session_info_t *ssl_sessions,
-	size_t max_ssl_sessions,
-	void *ssl_sessionid)
-{
-	if (!ssl_sessions)
-	{
-		return;
-	}
-	size_t i;
-	for (i = 0; i < max_ssl_sessions; i++)
-	{
-		ssl_session_info_t *check = &ssl_sessions[i];
-		if (check->sessionid == ssl_sessionid)
-		{
-			ssl_kill_session(ssl_sessions, max_ssl_sessions, check);
-			break;
-		}
-	}
-}
-
-/*
- * Store session id in the session cache. The ID passed on to this function
- * must already have been extracted and allocated the proper way for the SSL
- * layer. SSL_session_free() will be called to free/kill the session ID
- * later on.
- */
-static bool ssl_addsessionid(const char *host_name, long remote_port,
-	ssl_session_info_t *ssl_sessions,
-	size_t max_ssl_sessions,
-	void *ssl_sessionid)
-{
-	if (!ssl_sessions)
-	{
-		return false;
-	}
-	size_t i = 0;
-	ssl_session_info_t *store = &ssl_sessions[0];
-	long oldest_age = ssl_sessions[0].age; /* zero if unused */
-	char *clone_host = NULL;
-
-	/* Even though session ID re-use might be disabled, that only disables USING
-	   IT. We still store it here in case the re-using is again enabled for an
-	   upcoming transfer */
-
-	clone_host = strdup(host_name);
-	if (!clone_host)
-		return false; /* bail out */
-
-	/* Now we should add the session ID and the host name to the cache, (remove
-	   the oldest if necessary) */
-
-	/* find an empty slot for us, or find the oldest */
-	for (i = 1; (i < max_ssl_sessions) && ssl_sessions[i].sessionid; i++)
-	{
-		if (ssl_sessions[i].age < oldest_age)
-		{
-			oldest_age = ssl_sessions[i].age;
-			store = &ssl_sessions[i];
-		}
-	}
-	if (i == max_ssl_sessions)
-	{
-		/* cache is full, we must "kill" the oldest entry! */
-		ssl_kill_session(ssl_sessions, max_ssl_sessions, store);
-	}
-	else
-		store = &ssl_sessions[i]; /* use this slot */
-
-	/* now init the session struct wisely */
-	store->sessionid = ssl_sessionid;
-	store->age = ssl_sessions_general_age;    /* set current age */
-	if (store->name)
-		/* free it if there's one already present */
-		free(store->name);
-	store->name = clone_host;               /* clone host name */
-	store->remote_port = remote_port; /* port number */
-
-	return true;
-}
-
 /////////////////////////////////////////////////////////////////////////////
 // CAsyncSslSocketLayer
 CCriticalSectionWrapper CAsyncSslSocketLayer::m_sCriticalSection;
@@ -468,10 +313,9 @@ CAsyncSslSocketLayer::CAsyncSslSocketLayer()
 
 	m_onCloseCalled = false;
 	m_pKeyPassword = 0;
-	m_HostAddress = NULL;
-	m_nHostPort = 0;
-	m_SslSessions = NULL;
-	m_MaxSslSessions = 0;
+	m_Main = NULL;
+	m_sessionid = NULL;
+	m_sessionreuse = true;
 }
 
 CAsyncSslSocketLayer::~CAsyncSslSocketLayer()
@@ -1179,10 +1023,7 @@ BOOL CAsyncSslSocketLayer::Connect(LPCTSTR lpszHostAddress, UINT nHostPort)
 }
 
 int CAsyncSslSocketLayer::InitSSLConnection(bool clientMode,
-	CString &ServerName,
-	int Port,
-	ssl_session_info_t *ssl_sessions,
-	size_t max_ssl_sessions,
+	CAsyncSslSocketLayer* main, bool sessionreuse,
 	void* pSslContext /*=0*/)
 {
 	if (m_bUseSSL)
@@ -1269,17 +1110,25 @@ int CAsyncSslSocketLayer::InitSSLConnection(bool clientMode,
 	void *ssl_sessionid = NULL;
 	{
 		USES_CONVERSION;
-		m_HostAddress = strdup(T2CA(ServerName));
-		m_nHostPort = Port;
-		m_SslSessions = ssl_sessions;
-		m_MaxSslSessions = max_ssl_sessions;
+		m_Main = main;
+		m_sessionreuse = sessionreuse;
 	}
-	if (ssl_getsessionid(m_HostAddress, m_nHostPort,
-						 m_SslSessions,
-						 m_MaxSslSessions,
-						 &ssl_sessionid))
+	if ((m_Main != NULL) && m_sessionreuse)
 	{
-		pSSL_set_session(m_ssl, (SSL_SESSION *)ssl_sessionid);
+		if (m_Main->m_sessionid != NULL)
+		{
+			if (!pSSL_set_session(m_ssl, m_Main->m_sessionid))
+			{
+				LogSocketMessage(FZ_LOG_INFO, _T("SSL_set_session failed"));
+				return SSL_FAILURE_INITSSL;
+			}
+			LogSocketMessage(FZ_LOG_INFO, _T("Trying reuse main SSL session ID"));
+		}
+		else
+		{
+			LogSocketMessage(FZ_LOG_INFO, _T("Main SSL session ID was not reused previously, not trying again"));
+			pSSL_set_session(m_ssl, NULL);
+		}
 	}
 	else
 	{
@@ -1381,12 +1230,6 @@ void CAsyncSslSocketLayer::ResetSslSession()
 	delete [] m_pKeyPassword;
 	m_pKeyPassword = 0;
 
-	delete [] m_HostAddress;
-	m_HostAddress = 0;
-	m_nHostPort = 0;
-	m_SslSessions = NULL;
-	m_MaxSslSessions = 0;
-
 	m_ssl = 0;
 	t_SslLayerList *cur = m_pSslLayerList;
 	if (!cur)
@@ -1414,6 +1257,14 @@ void CAsyncSslSocketLayer::ResetSslSession()
 			}
 			cur = cur->pNext;
 		}
+
+	if (m_sessionid != NULL)
+	{
+		SSL_SESSION_free(m_sessionid);
+		m_sessionid = NULL;
+	}
+	m_sessionreuse = true;
+
 	m_sCriticalSection.Unlock();
 }
 
@@ -1565,37 +1416,39 @@ void CAsyncSslSocketLayer::apps_ssl_info_callback(const SSL *s, int where, int r
 	if (w & SSL_ST_CONNECT)
 	{
 		str = "SSL_connect";
-		SSL_SESSION *our_ssl_sessionid = SSL_get1_session(pLayer->m_ssl);
-		void *old_ssl_sessionid = NULL;
-		bool incache = ssl_getsessionid(
-							pLayer->m_HostAddress, pLayer->m_nHostPort,
-							pLayer->m_SslSessions,
-							pLayer->m_MaxSslSessions,
-							&old_ssl_sessionid);
-		if (incache)
-		{
-			if (old_ssl_sessionid != our_ssl_sessionid)
+		if (pLayer->m_sessionreuse)
+		{
+			SSL_SESSION * sessionid = SSL_get1_session(pLayer->m_ssl);
+			if (pLayer->m_sessionid != sessionid)
 			{
-				ssl_delsessionid(
-					pLayer->m_HostAddress, pLayer->m_nHostPort,
-					pLayer->m_SslSessions,
-					pLayer->m_MaxSslSessions,
-					old_ssl_sessionid);
-				incache = false;
+				if (pLayer->m_sessionid == NULL)
+				{
+					if (SSL_session_reused(pLayer->m_ssl))
+					{
+						pLayer->LogSocketMessage(FZ_LOG_INFO, _T("Session ID reused"));
+					}
+					else
+					{
+						if ((pLayer->m_Main != NULL) && (pLayer->m_Main->m_sessionid != NULL))
+						{
+							pLayer->LogSocketMessage(FZ_LOG_INFO, _T("Main SSL session ID not reused, will not try again"));
+							SSL_SESSION_free(pLayer->m_Main->m_sessionid);
+							pLayer->m_Main->m_sessionid = NULL;
+						}
+					}
+					pLayer->LogSocketMessage(FZ_LOG_DEBUG, _T("Saving session ID"));
+				}
+				else
+				{
+					SSL_SESSION_free(pLayer->m_sessionid);
+					pLayer->LogSocketMessage(FZ_LOG_INFO, _T("Session ID changed"));
+				}
+				pLayer->m_sessionid = sessionid;
+			}
+			else
+			{
+				SSL_SESSION_free(sessionid);
 			}
-		}
-		if (!incache && pLayer->m_SslSessions)
-		{
-			ssl_addsessionid(
-				pLayer->m_HostAddress,
-				pLayer->m_nHostPort,
-				pLayer->m_SslSessions,
-				pLayer->m_MaxSslSessions,
-				our_ssl_sessionid);
-		}
-		else
-		{
-			SSL_SESSION_free(our_ssl_sessionid);
 		}
 	}
 	else if (w & SSL_ST_ACCEPT)

+ 5 - 8
filezilla/AsyncSslSocketLayer.h

@@ -147,10 +147,8 @@ public:
 
 	bool IsUsingSSL();
 	int InitSSLConnection(bool clientMode, 
-		CString &ServerName,
-		int Port,
-		ssl_session_info_t *m_SslSessions,
-		size_t m_MaxSslSessions,
+		CAsyncSslSocketLayer* main,
+		bool sessionreuse,
 		void* pContext = 0);
 
 	static bool CreateSslCertificate(LPCTSTR filename, int bits, unsigned char* country, unsigned char* state,
@@ -225,6 +223,9 @@ private:
 	SSL_CTX* m_ssl_ctx;	// SSL context
 	static std::map<SSL_CTX *, int> m_contextRefCount;
 	SSL* m_ssl;			// current session handle
+	SSL_SESSION * m_sessionid;
+	bool m_sessionreuse;
+	CAsyncSslSocketLayer * m_Main;
 
 	//Data channels for encrypted/unencrypted data
 	BIO* m_nbio;	//Network side, sends/received encrypted data
@@ -247,10 +248,6 @@ private:
 	bool m_onCloseCalled;
 
 	char* m_pKeyPassword;
-	const char *m_HostAddress;
-	UINT m_nHostPort;
-	ssl_session_info_t *m_SslSessions;
-	size_t m_MaxSslSessions;
 };
 
 #define SSL_INFO 0

+ 6 - 1
filezilla/ControlSocket.cpp

@@ -509,4 +509,9 @@ CString CControlSocket::ConvertDomainName(CString domain)
 	CString result = A2T(output);
 	free(output);
 	return result;
-}
+}
+
+void CControlSocket::LogSocketMessage(int nMessageType, LPCTSTR pMsgFormat)
+{
+	LogMessage(nMessageType, pMsgFormat);
+}

+ 2 - 0
filezilla/ControlSocket.h

@@ -149,6 +149,8 @@ protected:
 #endif
 	//End Speed limit
 	
+	virtual void LogSocketMessage(int nMessageType, LPCTSTR pMsgFormat);
+	
 public:
 	struct t_operation
 	{

+ 2 - 2
filezilla/FileZillaIntf.cpp

@@ -102,7 +102,7 @@ bool __fastcall TFileZillaIntf::Cancel()
 bool __fastcall TFileZillaIntf::Connect(const char * Host, int Port, const char * User,
   const char * Pass, const char * Account, bool FwByPass,
   const char * Path, int ServerType, int Pasv, int TimeZoneOffset, int UTF8,
-  bool bForcePasvIp)
+  int iForcePasvIp)
 {
   ASSERT(FFileZillaApi != NULL);
   ASSERT((ServerType & FZ_SERVERTYPE_HIGHMASK) == FZ_SERVERTYPE_FTP);
@@ -120,7 +120,7 @@ bool __fastcall TFileZillaIntf::Connect(const char * Host, int Port, const char
   Server.nPasv = Pasv;
   Server.nTimeZoneOffset = TimeZoneOffset;
   Server.nUTF8 = UTF8;
-  Server.bForcePasvIp = bForcePasvIp;
+  Server.iForcePasvIp = iForcePasvIp;
 
   *FServer = Server;
 

+ 1 - 1
filezilla/FileZillaIntf.h

@@ -144,7 +144,7 @@ public:
   bool __fastcall Connect(const char * Host, int Port, const char * User,
     const char * Pass, const char * Account, bool FwByPass,
     const char * Path, int ServerType, int Pasv, int TimeZoneOffset, int UTF8,
-    bool bForcePasvIp);
+    int iForcePasvIp);
   bool __fastcall Close();
 
   bool __fastcall List();

+ 54 - 43
filezilla/FtpControlSocket.cpp

@@ -43,8 +43,6 @@
 static char THIS_FILE[] = __FILE__;
 #endif
 
-const size_t CFtpControlSocket::m_MaxSslSessions = 10;
- 
 class CFtpControlSocket::CFileTransferData : public CFtpControlSocket::t_operation::COpData
 {
 public:
@@ -179,9 +177,6 @@ CFtpControlSocket::CFtpControlSocket(CMainThread *pMainThread) : CControlSocket(
 
 	m_mayBeMvsFilesystem = false;
 	m_mayBeBS2000Filesystem = false;
-
-	m_Port = 0;
-	m_SslSessions = NULL;
 }
 
 CFtpControlSocket::~CFtpControlSocket()
@@ -199,12 +194,6 @@ CFtpControlSocket::~CFtpControlSocket()
 		delete m_pDataFile;
 		m_pDataFile=0;
 	}
-	if (m_SslSessions)
-	{
-		free(m_SslSessions);
-		m_SslSessions = NULL;
-	}
- 
 }
 
 /////////////////////////////////////////////////////////////////////////////
@@ -272,24 +261,11 @@ bool CFtpControlSocket::InitConnect()
 		return false;
 	}
 
-	if (m_SslSessions)
-	{
-		ShowStatus(_T("Internal error: m_SslSessions not zero in Connect"), 1);
-		DoClose(FZ_REPLY_CRITICALERROR);
-		return false;
-	}
-
 #ifndef MPEXT_NO_SSL
 	if (m_CurrentServer.nServerType & FZ_SERVERTYPE_LAYER_SSL_IMPLICIT ||
 		m_CurrentServer.nServerType & FZ_SERVERTYPE_LAYER_SSL_EXPLICIT ||
 		m_CurrentServer.nServerType & FZ_SERVERTYPE_LAYER_TLS_EXPLICIT)
 	{
-		int nSslSessionReuse = COptions::GetOptionVal(OPTION_MPEXT_SSLSESSIONREUSE);
-		if (nSslSessionReuse)
-		{
-			m_SslSessions = (ssl_session_info_t *)calloc(CFtpControlSocket::m_MaxSslSessions, sizeof(ssl_session_info_t));
-		}
-
 		m_pSslLayer = new CAsyncSslSocketLayer;
 		AddLayer(m_pSslLayer);
 		TCHAR buffer[1000];
@@ -424,8 +400,7 @@ void CFtpControlSocket::Connect(t_server &server)
 			DoClose(FZ_REPLY_CRITICALERROR);
 			return;
 		}
-		int res = m_pSslLayer->InitSSLConnection(true, m_ServerName, m_Port,
-			m_SslSessions, m_MaxSslSessions);
+		int res = m_pSslLayer->InitSSLConnection(true, NULL, COptions::GetOptionVal(OPTION_MPEXT_SSLSESSIONREUSE));
 #ifndef MPEXT_NO_SSLDLL
 		if (res == SSL_FAILURE_LOADDLLS)
 			ShowStatus(IDS_ERRORMSG_CANTLOADSSLDLLS, 1);
@@ -488,7 +463,6 @@ void CFtpControlSocket::Connect(t_server &server)
 		}
 	}
 	m_ServerName = logontype?fwhost:hostname;
-	m_Port = port;
 	m_LastRecvTime = m_LastSendTime = CTime::GetCurrentTime();
 }
 
@@ -552,8 +526,7 @@ void CFtpControlSocket::LogOnToServer(BOOL bSkipReply /*=FALSE*/)
 				DoClose(FZ_REPLY_CRITICALERROR);
 				return;
 			}
-			int res = m_pSslLayer->InitSSLConnection(true, m_ServerName, m_Port,
-				m_SslSessions, m_MaxSslSessions);
+			int res = m_pSslLayer->InitSSLConnection(true, NULL, COptions::GetOptionVal(OPTION_MPEXT_SSLSESSIONREUSE));
 #ifndef MPEXT_NO_SSLDLL
 			if (res == SSL_FAILURE_LOADDLLS)
 				ShowStatus(IDS_ERRORMSG_CANTLOADSSLDLLS, 1);
@@ -1296,9 +1269,6 @@ void CFtpControlSocket::DoClose(int nError /*=0*/)
 	m_mayBeMvsFilesystem = false;
 	m_mayBeBS2000Filesystem = false;
  
-	free(m_SslSessions);
-	m_SslSessions = NULL;
-
 	CControlSocket::Close();
 }
 
@@ -5921,24 +5891,65 @@ bool CFtpControlSocket::IsMisleadingListResponse()
 }
 
 #ifdef MPEXT
-bool CFtpControlSocket::CheckForcePasvIp(CString & host)
+bool CFtpControlSocket::IsRoutableAddress(const CString & host)
 {
-	bool result = true;
-	if (m_CurrentServer.bForcePasvIp)
+	USES_CONVERSION;
+
+	if (host.Left(3) == _T("127") ||
+	    host.Left(3) == _T("10.") ||
+	    host.Left(7) == _T("192.168") ||
+	    host.Left(7) == _T("169.254"))
 	{
-		unsigned int tmpPort;
-		CString ahost;
-		if (!GetPeerName(ahost, tmpPort))
+		return false;
+	}
+	else if (host.Left(3) == _T("172"))
+	{
+		CString middle = host.Mid(4);
+		int pos = host.Find(_T("."));
+		long part = atol(T2CA(host.Left(pos)));
+		if ((part >= 16) && (part <= 31))
 		{
-			LogMessage(__FILE__, __LINE__, this, FZ_LOG_WARNING, _T("GetPeerName failed"));
-			result = false;
+			return false;
 		}
-		else if (ahost != host)
+	}
+	return true;
+}
+
+bool CFtpControlSocket::CheckForcePasvIp(CString & host)
+{
+	bool result = true;
+	unsigned int tmpPort;
+	CString ahost;
+	if (!GetPeerName(ahost, tmpPort))
+	{
+		LogMessage(__FILE__, __LINE__, this, FZ_LOG_WARNING, _T("GetPeerName failed"));
+		result = false;
+	}
+	else
+	{
+		switch (m_CurrentServer.iForcePasvIp)
 		{
-			LogMessage(__FILE__, __LINE__, this, FZ_LOG_WARNING, _T("Using host address %s instead of the one suggested by the server: %s"), ahost, host);
-			host = ahost;
+			case 0:
+				if (ahost != host)
+				{
+					LogMessage(__FILE__, __LINE__, this, FZ_LOG_WARNING, _T("Using host address %s instead of the one suggested by the server: %s"), ahost, host);
+					host = ahost;
+				}
+				break;
+
+			case 1:
+				// noop
+				break;
+
+			default:
+				if (!IsRoutableAddress(host) && IsRoutableAddress(ahost))
+				{
+					LogMessage(__FILE__, __LINE__, this, FZ_LOG_WARNING, _T("Server sent passive reply with unroutable address %s, using host address instead."), host, ahost);
+				}
+				break;
 		}
 	}
+
 	return result;
 }
 #endif

+ 1 - 4
filezilla/FtpControlSocket.h

@@ -77,9 +77,6 @@ public:
 #ifndef MPEXT_NO_SSL
 	BOOL m_bDidRejectCertificate;
 #endif
-	static const size_t m_MaxSslSessions; /* SSL session id cache size */
-	ssl_session_info_t *m_SslSessions; /* SSL session id cache */
-	
 	// Some servers are broken. Instead of an empty listing, some MVS servers
 	// for example they return something "550 no members found"
 	// Other servers return "550 No files found."
@@ -129,6 +126,7 @@ protected:
 	bool InitConnect();
 
 #ifdef MPEXT
+	bool IsRoutableAddress(const CString & host);
 	bool CheckForcePasvIp(CString & host);
 #endif
 
@@ -138,7 +136,6 @@ protected:
 	CTime m_LastSendTime;
 	
 	CString m_ServerName;
-	int m_Port;
 	std::list<CStringA> m_RecvBuffer;
 	CTime m_LastRecvTime;
 	class CListData;

+ 2 - 2
filezilla/FzApiStructures.cpp

@@ -51,7 +51,7 @@ const bool operator == (const t_server &a,const t_server &b)
 	if (a.nUTF8 != b.nUTF8)
 		return false;
 #ifdef MPEXT
-	if (a.bForcePasvIp != b.bForcePasvIp)
+	if (a.iForcePasvIp != b.iForcePasvIp)
 		return false;
 #endif
 	return true;
@@ -83,7 +83,7 @@ bool t_server::operator<(const t_server &op) const
 	if (nUTF8 < op.nUTF8)
 		return true;
 #ifdef MPEXT
-	if (bForcePasvIp < op.bForcePasvIp)
+	if (iForcePasvIp < op.iForcePasvIp)
 		return true;
 #endif
 

+ 1 - 10
filezilla/FzApiStructures.h

@@ -40,7 +40,7 @@ public:
 	int nTimeZoneOffset;
 	int nUTF8;
 #ifdef MPEXT
-	BOOL bForcePasvIp;
+	BOOL iForcePasvIp;
 #endif
 	bool operator<(const t_server &op) const; //Needed by STL map
 };
@@ -62,13 +62,4 @@ typedef struct
     int nUserData;
 } t_transferfile;
 
-/* information stored about one single SSL session */
-typedef struct
-{
-    char *name;       /* host name for which this ID was used */
-    void *sessionid;  /* as returned from the SSL layer */
-    long age;         /* just a number, the higher the more recent */
-    unsigned short remote_port; /* remote port to connect to */
-} ssl_session_info_t;
-
 #endif

+ 8 - 5
filezilla/TransferSocket.cpp

@@ -444,8 +444,7 @@ void CTransferSocket::OnAccept(int nErrorCode)
 		if (m_pSslLayer)
 		{
 			AddLayer(m_pSslLayer);
-			int res = m_pSslLayer->InitSSLConnection(true, m_pOwner->m_ServerName, m_pOwner->m_Port,
-				m_pOwner->m_SslSessions, m_pOwner->m_MaxSslSessions);
+			int res = m_pSslLayer->InitSSLConnection(true, m_pOwner->m_pSslLayer, COptions::GetOptionVal(OPTION_MPEXT_SSLSESSIONREUSE));
 #ifndef MPEXT_NO_SSLDLL
 			if (res == SSL_FAILURE_LOADDLLS)
 				m_pOwner->ShowStatus(IDS_ERRORMSG_CANTLOADSSLDLLS, 1);
@@ -526,8 +525,7 @@ void CTransferSocket::OnConnect(int nErrorCode)
 		if (m_pSslLayer)
 		{
 			AddLayer(m_pSslLayer);
-			int res = m_pSslLayer->InitSSLConnection(true, m_pOwner->m_ServerName, m_pOwner->m_Port,
-				m_pOwner->m_SslSessions, m_pOwner->m_MaxSslSessions);
+			int res = m_pSslLayer->InitSSLConnection(true, m_pOwner->m_pSslLayer, COptions::GetOptionVal(OPTION_MPEXT_SSLSESSIONREUSE));
 #ifndef MPEXT_NO_SSLDLL
 			if (res == SSL_FAILURE_LOADDLLS)
 				m_pOwner->ShowStatus(IDS_ERRORMSG_CANTLOADSSLDLLS, 1);
@@ -1482,4 +1480,9 @@ int CTransferSocket::ReadDataFromFile(char *buffer, int len)
 		return -1;
 	}
 	END_CATCH_ALL;
-}
+}
+
+void CTransferSocket::LogSocketMessage(int nMessageType, LPCTSTR pMsgFormat)
+{
+	LogMessage(nMessageType, pMsgFormat);
+}

+ 1 - 0
filezilla/TransferSocket.h

@@ -98,6 +98,7 @@ protected:
 	
 	virtual int OnLayerCallback(std::list<t_callbackMsg>& callbacks);
 	int ReadDataFromFile(char *buffer, int len);
+	virtual void LogSocketMessage(int nMessageType, LPCTSTR pMsgFormat);
 
 	CFtpControlSocket *m_pOwner;
 	CAsyncProxySocketLayer* m_pProxyLayer;

+ 2 - 2
forms/Login.cpp

@@ -438,7 +438,7 @@ void __fastcall TLoginDialog::LoadSession(TSessionData * aSessionData)
     // FTP tab
     PostLoginCommandsMemo->Lines->Text = aSessionData->PostLoginCommands;
     ComboAutoSwitchLoad(FtpListAllCombo, aSessionData->FtpListAll);
-    FtpForcePasvIpCheck->Checked = aSessionData->FtpForcePasvIp;
+    CheckBoxAutoSwitchLoad(FtpForcePasvIpCheck, aSessionData->FtpForcePasvIp);
 
     // Authentication tab
     SshNoUserAuthCheck->Checked = aSessionData->SshNoUserAuth;
@@ -784,7 +784,7 @@ void __fastcall TLoginDialog::SaveSession(TSessionData * aSessionData)
   // FTP tab
   aSessionData->PostLoginCommands = PostLoginCommandsMemo->Lines->Text;
   aSessionData->FtpListAll = ComboAutoSwitchSave(FtpListAllCombo);
-  aSessionData->FtpForcePasvIp = FtpForcePasvIpCheck->Checked;
+  aSessionData->FtpForcePasvIp = CheckBoxAutoSwitchSave(FtpForcePasvIpCheck);
 
   // Proxy tab
   aSessionData->ProxyMethod = GetProxyMethod();

+ 1 - 0
forms/Login.dfm

@@ -1179,6 +1179,7 @@ object LoginDialog: TLoginDialog
             Top = 125
             Width = 317
             Height = 17
+            AllowGrayed = True
             Caption = '&Force IP address for passive mode connections'
             TabOrder = 2
             OnClick = DataChange

+ 0 - 341
openssl/log

@@ -1,341 +0,0 @@
-Configuring for BC-32
-    no-ec_nistp_64_gcc_128 [default]  OPENSSL_NO_EC_NISTP_64_GCC_128 (skip dir)
-    no-gmp          [default]  OPENSSL_NO_GMP (skip dir)
-    no-jpake        [experimental] OPENSSL_NO_JPAKE (skip dir)
-    no-krb5         [krb5-flavor not specified] OPENSSL_NO_KRB5
-    no-md2          [default]  OPENSSL_NO_MD2 (skip dir)
-    no-rc5          [default]  OPENSSL_NO_RC5 (skip dir)
-    no-rfc3779      [default]  OPENSSL_NO_RFC3779 (skip dir)
-    no-sctp         [default]  OPENSSL_NO_SCTP (skip dir)
-    no-shared       [default] 
-    no-store        [experimental] OPENSSL_NO_STORE (skip dir)
-    no-zlib         [default] 
-    no-zlib-dynamic [default] 
-IsMK1MF=1
-CC            =bcc32
-CFLAG         =-DOPENSSL_THREADS  -DDSO_WIN32 
-EX_LIBS       =
-CPUID_OBJ     =mem_clr.o
-BN_ASM        =bn_asm.o
-DES_ENC       =des_enc.o fcrypt_b.o
-AES_ENC       =aes_core.o aes_cbc.o
-BF_ENC        =bf_enc.o
-CAST_ENC      =c_enc.o
-RC4_ENC       =rc4_enc.o rc4_skey.o
-RC5_ENC       =rc5_enc.o
-MD5_OBJ_ASM   =
-SHA1_OBJ_ASM  =
-RMD160_OBJ_ASM=
-CMLL_ENC      =camellia.o cmll_misc.o cmll_cbc.o
-MODES_OBJ     =
-ENGINES_OBJ   =
-PROCESSOR     =
-RANLIB        =true
-ARFLAGS       =
-PERL          =perl
-THIRTY_TWO_BIT mode
-DES_PTR used
-BN_LLONG mode
-RC4_INDEX mode
-RC4_CHUNK is undefined
-
-Configured for BC-32.
-Generating x86 assember
-Bignum
-DES
-"crypt(3)"
-Blowfish
-CAST5
-RC4
-MD5
-SHA1
-RIPEMD160
-RC5\32
-
-B:\opensslc\openssl-1.0.1c>call D:\Martin\Projekty\WinSCP2\misc\openssl\cleanup.bat 
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\asn1\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bf\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bio\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\buffer\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\camellia\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\cast\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\cmac\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\cms\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\comp\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\conf\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\des\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\des\makefile.bc
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\dh\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\dsa\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\dso\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\ec\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\ecdh\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\ecdsa\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\engine\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\err\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\evp\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\hmac\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\idea\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\jpake\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\krb5\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\lhash\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\md2\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\md4\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\md5\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\mdc2\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\modes\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\objects\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\ocsp\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pem\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pkcs12\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pkcs7\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pqueue\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rand\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc2\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc4\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc5\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\ripemd\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rsa\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\seed\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\srp\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\stack\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\store\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\ts\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\txt_db\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\ui\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\whrlpool\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\x509\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\x509v3\Makefile
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\README
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bf\README
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bf\asm\readme
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\README
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\cast\asm\readme
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\conf\README
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\des\README
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\des\asm\readme
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\dsa\README
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\dso\README
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\engine\README
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\perlasm\readme
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\ripemd\README
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\README
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\store\README
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\threads\README
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bf\VERSION
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\des\VERSION
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\idea\version
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc2\version
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bf\INSTALL
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\des\INSTALL
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\todo
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\des\t\test
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\dh\example
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\dh\generate
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\alphacpuid.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pariscid.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\ppccpuid.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\x86cpuid.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\x86_64cpuid.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\asm\aes-586.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\asm\aes-armv4.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\asm\aes-mips.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\asm\aes-parisc.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\asm\aes-ppc.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\asm\aes-s390x.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\asm\aes-sparcv9.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\asm\aes-x86_64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\asm\aesni-sha1-x86_64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\asm\aesni-x86.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\asm\aesni-x86_64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\asm\bsaes-x86_64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\asm\vpaes-x86.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\asm\vpaes-x86_64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\asn1\charmap.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bf\asm\bf-586.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bf\asm\bf-686.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\bn_prime.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\alpha-mont.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\armv4-gf2m.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\armv4-mont.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\bn-586.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\co-586.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\ia64-mont.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\mips-mont.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\mips.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\mips3-mont.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\modexp512-x86_64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\parisc-mont.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\ppc-mont.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\ppc.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\ppc64-mont.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\s390x-gf2m.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\s390x-mont.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\sparcv9-mont.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\sparcv9a-mont.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\via-mont.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\x86-gf2m.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\x86-mont.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\x86.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\x86_64-gf2m.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\x86_64-mont.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\x86_64-mont5.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\x86\add.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\x86\comba.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\x86\div.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\x86\mul.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\x86\mul_add.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\x86\sqr.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\x86\sub.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\camellia\asm\cmll-x86.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\camellia\asm\cmll-x86_64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\cast\asm\cast-586.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\conf\keysets.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\des\asm\crypt586.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\des\asm\des-586.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\des\asm\desboth.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\lhash\num.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\md5\asm\md5-586.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\md5\asm\md5-x86_64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\modes\asm\ghash-alpha.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\modes\asm\ghash-armv4.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\modes\asm\ghash-ia64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\modes\asm\ghash-parisc.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\modes\asm\ghash-s390x.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\modes\asm\ghash-sparcv9.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\modes\asm\ghash-x86.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\modes\asm\ghash-x86_64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\objects\objects.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\objects\objxref.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\objects\obj_dat.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\perlasm\cbc.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\perlasm\ppc-xlate.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\perlasm\x86asm.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\perlasm\x86gas.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\perlasm\x86masm.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\perlasm\x86nasm.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\perlasm\x86_64-xlate.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc4\asm\rc4-586.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc4\asm\rc4-ia64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc4\asm\rc4-md5-x86_64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc4\asm\rc4-parisc.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc4\asm\rc4-s390x.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc4\asm\rc4-x86_64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc5\asm\rc5-586.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\ripemd\asm\rmd-586.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha1-586.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha1-alpha.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha1-armv4-large.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha1-ia64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha1-mips.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha1-parisc.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha1-ppc.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha1-s390x.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha1-sparcv9.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha1-sparcv9a.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha1-thumb.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha1-x86_64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha256-586.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha256-armv4.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha512-586.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha512-armv4.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha512-ia64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha512-mips.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha512-parisc.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha512-ppc.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha512-s390x.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha512-sparcv9.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\asm\sha512-x86_64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\whrlpool\asm\wp-mmx.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\whrlpool\asm\wp-x86_64.pl
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\bn.mul
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\dh\dh1024.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\dh\dh192.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\dh\dh2048.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\dh\dh4096.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\dh\dh512.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pkcs7\des.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pkcs7\es1.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pkcs7\info.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pkcs7\infokey.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pkcs7\server.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pkcs7\t\3des.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pkcs7\t\3dess.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pkcs7\t\c.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pkcs7\t\msie-e.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pkcs7\t\msie-enc-01.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pkcs7\t\msie-enc-02.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pkcs7\t\msie-s-a-e.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pkcs7\t\s.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pkcs7\t\server.pem
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\err\openssl.ec
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\des\times\586-100.lnx
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\ia64cpuid.S
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\aes\asm\aes-ia64.S
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\ia64.S
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\md5\asm\md5-ia64.S
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\x86_64-gcc.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\mips3.s
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\pa-risc2.s
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\pa-risc2W.s
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sparccpuid.S
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sparcv9cap.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\sparcv8.S
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\sparcv8plus.S
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\des\times\sparc.gcc
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\des\times\usparc.cc
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\LPdir_vms.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\vms_rms.h
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\vms-helper.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\asm\vms.mar
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\dso\dso_vms.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rand\rand_vms.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\threads\pthreads-vms.com
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bf\bfspeed.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\bnspeed.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\expspeed.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\des\speed.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc2\rc2speed.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc4\rc4speed.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc5\rc5speed.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\o_dir_test.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bf\bftest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\bntest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\divtest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\bn\exptest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\cast\casttest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\conf\test.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\des\destest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\dh\dhtest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\dsa\dsatest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\ec\ectest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\ecdh\ecdhtest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\ecdsa\ecdsatest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\engine\enginetest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\evp\evp_test.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\hmac\hmactest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\idea\ideatest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\jpake\jpaketest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\lhash\lh_test.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\md2\md2test.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\md4\md4test.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\md5\md5test.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\mdc2\mdc2test.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\pqueue\pq_test.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rand\randtest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc2\rc2test.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc4\rc4test.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rc5\rc5test.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\ripemd\rmdtest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\rsa\rsa_test.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\sha1test.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\sha\shatest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\srp\srptest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\threads\mttest.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\whrlpool\wp_test.c
-OdstranŘně soubor - B:\opensslc\openssl-1.0.1c\crypto\x509v3\tabtest.c
-ZkopĄrovan� soubory:         1

+ 330 - 2
release/winscpsetup.iss

@@ -6,6 +6,7 @@
 #define WebRoot "http://winscp.net/"
 #define WebForum WebRoot+"forum/"
 #define WebDocumentation WebRoot+"eng/docs/"
+#define WebReport WebRoot+"install.php"
 #define WebPuTTY "http://www.chiark.greenend.org.uk/~sgtatham/putty/"
 #define Year 2012
 #define EnglishLang "English"
@@ -41,6 +42,16 @@
 #include "..\opencandy\OCSetupHlp.iss"
 #endif
 
+#ifdef Chrome
+#define ChromeLogoFile "chromelogo.bmp"
+#define ChromeAdFile "chromead.bmp"
+#define ChromeGcApiDllFile "gcapi_dll.dll"
+#define ChromeCheckerFile "chromech.exe"
+#define ChromeInstallerFile "GoogleChromeInstaller.exe"
+#define ChromeBrandCode "LHNE"
+#include "..\chrome\texts.iss"
+#endif
+
 [Setup]
 AppId={#AppId}
 AppName=WinSCP
@@ -57,7 +68,11 @@ VersionInfoCopyright=(c) 2000-{#Year} Martin Prikryl
 DefaultDirName={pf}\WinSCP
 DefaultGroupName=WinSCP
 AllowNoIcons=yes
+#ifdef Chrome
+LicenseFile=licence.setup-chrome
+#else
 LicenseFile=licence.setup{#OutputSuffix}
+#endif
 UninstallDisplayIcon={app}\WinSCP.exe
 OutputDir={#OutputDir}
 DisableStartupPrompt=yes
@@ -71,6 +86,9 @@ UsePreviousLanguage=yes
 #ifdef Sign
 SignTool=sign $f "WinSCP Installer" http://winscp.net/eng/docs/installation
 #endif
+#ifdef Chrome
+RestartIfNeededByRun=no
+#endif
 
 ; Some features of ISCC requires path relative to script,
 ; some path relative to CWD
@@ -229,6 +247,19 @@ Filename: "{app}\WinSCP.exe"; Parameters: "/RegisterAsUrlHandler"; \
   StatusMsg: {cm:RegisteringAsUrlHandler}; Tasks: urlhandler
 Filename: "{app}\WinSCP.exe"; Parameters: "/AddSearchPath"; \
   StatusMsg: {cm:AddingSearchPath}; Tasks: searchpath
+#ifdef Chrome
+Filename: "{tmp}\{#ChromeInstallerFile}"; \
+  Parameters: "/brandcode:{#ChromeBrandCode} /default:true"; \
+  StatusMsg: {cm:ChromeInstalling}; \
+  Check: IsChromeSelected and IsChromeDefaultSelected
+Filename: "{tmp}\{#ChromeInstallerFile}"; \
+  Parameters: "/brandcode:{#ChromeBrandCode}"; \
+  StatusMsg: {cm:ChromeInstalling}; \
+  Check: IsChromeSelected and (not IsChromeDefaultSelected)
+Filename: "{tmp}\{#ChromeCheckerFile}"; Parameters: "fake"; \
+  Description: "{cm:ChromeLaunch}"; \
+  Flags: nowait postinstall skipifsilent runhidden; Check: IsChromeSelected
+#endif
 
 [UninstallDelete]
 ; These additional files are created by application
@@ -271,6 +302,14 @@ Source: "{#PuttySourceDir}\puttygen.exe"; DestDir: "{app}\PuTTY"; \
 Source: "{#OC_OCSETUPHLP_FILE_PATH}"; \
   Flags: dontcopy ignoreversion deleteafterinstall 
 #endif
+#ifdef Chrome
+Source: "..\chrome\{#ChromeLogoFile}"; Flags: dontcopy
+Source: "..\chrome\{#ChromeAdFile}"; Flags: dontcopy
+Source: "..\chrome\{#ChromeGcApiDllFile}"; Flags: dontcopy
+Source: "..\chrome\{#ChromeCheckerFile}"; Flags: dontcopy
+Source: "..\chrome\{#ChromeInstallerFile}"; DestDir: "{tmp}"; \
+  Flags: deleteafterinstall; Check: IsChromeSelected
+#endif
 
 [Registry]
 Root: HKCU; Subkey: "{#ParentRegistryKey}"; Flags: uninsdeletekeyifempty
@@ -365,6 +404,9 @@ Filename: "{app}\WinSCP.exe"; Parameters: "/RemoveSearchPath"; \
 const
   wpSetupType = 100;
   wpInterface = 101;
+#ifdef Chrome
+  wpChrome =    102;
+#endif
 
 var
   TypicalTypeButton: TRadioButton;
@@ -376,6 +418,22 @@ var
   AreUpdatesEnabled: Boolean;
   Upgrade: Boolean;
   MissingTranslations: string;
+  InstallationDone: Boolean;
+  LicenseAccepted: Boolean;
+#ifdef Chrome
+  ChromeLogoImage: TBitmapImage;
+  ChromeLogoImageOffset: Integer;
+  ChromeAdImage: TBitmapImage;
+  ChromeCheckbox: TCheckbox;
+  ChromeDefaultCheckbox: TCheckbox;
+  ChromeLastPolicyText: TLabel;
+  ChromeAllowed: Boolean;
+#endif
+
+procedure ShowMessage(Text: string);
+begin
+  MsgBox(Text, mbInformation, MB_OK);
+end;
 
 function IsLang(Lang: string): Boolean;
 begin
@@ -500,6 +558,104 @@ begin
   end;
 end;
 
+#ifdef Chrome
+
+procedure LoadEmbededBitmap(Image: TBitmapImage; Name: string);
+begin
+  ExtractTemporaryFile(Name);
+  Image.Bitmap.LoadFromFile(ExpandConstant('{tmp}\' + Name));
+  Image.AutoSize := True;
+end;
+
+procedure ChromeCheckboxClick(Sender: TObject);
+begin
+  ChromeDefaultCheckbox.Enabled := ChromeCheckbox.Checked;
+end;
+
+procedure AddChromePolicyText(S: string; OnLinkClick: TNotifyEvent);
+var
+  Caption: TLabel;
+  I: Integer;
+begin
+  S := ExpandConstant(S);
+
+  if s <> '' then
+  begin
+    Caption := TLabel.Create(ChromeDefaultCheckbox.Parent);
+    if ChromeLastPolicyText <> nil then
+    begin
+      Caption.Top := ChromeLastPolicyText.Top;
+      Caption.Left := ChromeLastPolicyText.Left + ChromeLastPolicyText.Width;
+    end
+      else
+    begin
+      Caption.Top :=
+        ChromeDefaultCheckbox.Top + ChromeDefaultCheckbox.Height + ScaleY(4);
+    end;
+    Caption.Caption := S;
+    Caption.Parent := ChromeDefaultCheckbox.Parent;
+    Caption.Font.Name := 'Arial';
+    Caption.Font.Size := Caption.Font.Size - 1;
+    Caption.Tag := 1;
+
+    if OnLinkClick <> nil then
+    begin
+      Caption.Font.Style := Caption.Font.Style + [fsUnderline];
+      Caption.Font.Color := clBlue;
+      Caption.Cursor := crHand;
+      Caption.OnClick := OnLinkClick;
+    end;
+
+    if Caption.Left + Caption.Width > Caption.Parent.Width then
+    begin
+      Caption.Left := 0;
+      Caption.Top := Caption.Top + Caption.Height;
+      ChromeAdImage.Top := ChromeAdImage.Top - 1;
+      ChromeCheckbox.Top := ChromeCheckbox.Top - 3;
+      ChromeDefaultCheckbox.Top := ChromeDefaultCheckbox.Top - 4;
+
+      for I := 0 to Caption.Parent.ControlCount - 1 do
+      begin
+        if Caption.Parent.Controls[I].Tag = 1 then
+          Caption.Parent.Controls[I].Top := Caption.Parent.Controls[I].Top - 5;
+      end;
+
+      if Copy(Caption.Caption, 1, 1) = ' ' then
+        Caption.Caption := Copy(Caption.Caption, 2, Length(Caption.Caption) - 1);
+    end;
+
+    ChromeLastPolicyText := Caption;
+  end;
+end;
+
+procedure OpenPolicy(S: string);
+begin
+  S := FmtMessage(S, [ExpandConstant('{cm:LanguageISOCode}')]);
+  OpenBrowser(S);
+end;
+
+procedure ChromeTermsOfUseClick(Sender: TObject);
+begin
+  OpenPolicy('http://www.google.com/chrome/intl/%1/eula_text.html');
+end;
+
+procedure ChromePrivacyPolicyClick(Sender: TObject);
+begin
+  OpenPolicy('http://www.google.com/chrome/intl/%1/privacy.html');
+end;
+
+function IsChromeSelected: Boolean;
+begin
+  Result := ChromeAllowed and ChromeCheckbox.Checked;
+end;
+
+function IsChromeDefaultSelected: Boolean;
+begin
+  Result := ChromeAllowed and ChromeDefaultCheckbox.Checked;
+end;
+
+#endif
+
 procedure InitializeWizard;
 var
   DefaultLang: Boolean;
@@ -514,7 +670,14 @@ var
 #ifdef OpenCandy
   OpenCandyNewPageID: Integer;
 #endif
+#ifdef Chrome
+  ChromePage: TWizardPage;
+  ResultCode: Integer;
+#endif
 begin
+  InstallationDone := False;
+  LicenseAccepted := False;
+
   DefaultLang := (ActiveLanguage = '{#DefaultLang}');
 
   Upgrade :=
@@ -526,6 +689,7 @@ begin
   WizardForm.KeyPreview := True;
   WizardForm.OnKeyDown := @FormKeyDown;
 
+#ifndef Chrome
   // allow installation without requiring user to accept licence
   WizardForm.LicenseAcceptedRadio.Checked := True;
   WizardForm.LicenseAcceptedRadio.Visible := False;
@@ -536,6 +700,7 @@ begin
     WizardForm.LicenseNotAcceptedRadio.Top +
     WizardForm.LicenseNotAcceptedRadio.Height -
     WizardForm.LicenseMemo.Top - 5;
+#endif
 
   // hide installation types combo
   WizardForm.TypesCombo.Visible := False;
@@ -744,6 +909,79 @@ begin
   OpenCandyNewPageID := OpenCandyInsertLoadingPage(wpSelectTasks, ' ', ' ', 'Loading...', 'Arial', 100);
   OpenCandyInsertOfferPage(OpenCandyNewPageID);
 #endif
+
+#ifdef Chrome
+  ExtractTemporaryFile('{#ChromeGcApiDllFile}');
+  ExtractTemporaryFile('{#ChromeCheckerFile}');
+
+  ChromeAllowed :=
+    (not WizardSilent) and
+    ExecAsOriginalUser(ExpandConstant('{tmp}\{#ChromeCheckerFile}'), 'checkstandard', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) and
+    (ResultCode = 0) and
+    Exec(ExpandConstant('{tmp}\{#ChromeCheckerFile}'), 'checkelevated', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) and
+    (ResultCode = 0);
+
+  if ChromeAllowed then
+  begin
+    ChromePage := CreateCustomPage(wpInterface,
+      ExpandConstant('{cm:ChromeTitle}'),
+      ExpandConstant('{cm:ChromePrompt}'));
+
+    Caption := TLabel.Create(ChromePage);
+    Caption.WordWrap := True;
+    Caption.Caption :=
+      '- ' + ExpandConstant('{cm:ChromePoint1}') + #13#10 +
+      '- ' + ExpandConstant('{cm:ChromePoint2}') + #13#10 +
+      '- ' + ExpandConstant('{cm:ChromePoint3}');
+    Caption.Width := ChromePage.SurfaceWidth;
+    Caption.Parent := ChromePage.Surface;
+
+    ChromeAdImage := TBitmapImage.Create(ChromePage);
+    ChromeAdImage.Top := Caption.Top + Caption.Height + ScaleY(6);
+    ChromeAdImage.Parent := ChromePage.Surface;
+    LoadEmbededBitmap(ChromeAdImage, '{#ChromeAdFile}');
+
+    ChromeCheckbox := TCheckbox.Create(ChromePage);
+    ChromeCheckbox.Top := ChromeAdImage.Top + ChromeAdImage.Height + ScaleY(6);
+    ChromeCheckbox.Left := ScaleX(4);
+    ChromeCheckbox.Width :=
+      ChromePage.SurfaceWidth - ChromeCheckbox.Left;
+    ChromeCheckbox.Caption := ExpandConstant('{cm:ChromeCheck}');
+    ChromeCheckbox.Checked := True;
+    ChromeCheckbox.Parent := ChromePage.Surface;
+    ChromeCheckbox.OnClick := @ChromeCheckboxClick;
+
+    ChromeDefaultCheckbox := TCheckbox.Create(ChromePage);
+    ChromeDefaultCheckbox.Top :=
+      ChromeCheckbox.Top + ChromeCheckbox.Height + ScaleY(4);
+    ChromeDefaultCheckbox.Left := ScaleX(4);
+    ChromeDefaultCheckbox.Width :=
+      ChromePage.SurfaceWidth - ChromeDefaultCheckbox.Left;
+    ChromeDefaultCheckbox.Caption := ExpandConstant('{cm:ChromeDefaultCheck}');
+    ChromeDefaultCheckbox.Checked := True;
+    ChromeDefaultCheckbox.Parent := ChromePage.Surface;
+
+    ChromeLastPolicyText := nil;
+    AddChromePolicyText('{cm:ChromeDisclaimerPrefix}', nil);
+    AddChromePolicyText('{cm:ChromeDisclaimerTermsOfUse}', @ChromeTermsOfUseClick);
+    AddChromePolicyText('{cm:ChromeDisclaimerInfix}', nil);
+    AddChromePolicyText('{cm:ChromeDisclaimerPrivacyPolicy}', @ChromePrivacyPolicyClick);
+    AddChromePolicyText('{cm:ChromeDisclaimerPostfix}', nil);
+
+    // override the windows scheme to make sure it matches chrome logo background
+    WizardForm.MainPanel.Color := clWhite;
+
+    ChromeLogoImage := TBitmapImage.Create(WizardForm.MainPanel);
+    ChromeLogoImage.Top := WizardForm.PageNameLabel.Top;
+    ChromeLogoImage.Left := ScaleX(8);
+    ChromeLogoImage.Parent := WizardForm.MainPanel;
+    LoadEmbededBitmap(ChromeLogoImage, '{#ChromeLogoFile}');
+    ChromeLogoImage.Visible := False;
+    ChromeLogoImageOffset :=
+      (ChromeLogoImage.Left + ChromeLogoImage.Width + ScaleX(8)) -
+      WizardForm.PageNameLabel.Left;
+  end;
+#endif
 end;
 
 procedure RegisterPreviousData(PreviousDataKey: Integer);
@@ -767,6 +1005,34 @@ begin
     AdditionalOptionsCaption.Visible := not TypicalTypeButton.Checked;
     AdvancedTabsCheckbox.Visible := not TypicalTypeButton.Checked;
   end;
+
+  if CurPageID = wpSetupType then
+  begin
+    LicenseAccepted := True;
+  end;
+
+#ifdef Chrome
+  if ChromeAllowed then
+  begin
+    if CurPageID = wpChrome then
+    begin
+      WizardForm.PageNameLabel.Width := WizardForm.PageNameLabel.Width - ChromeLogoImageOffset;
+      WizardForm.PageNameLabel.Left := WizardForm.PageNameLabel.Left + ChromeLogoImageOffset;
+      WizardForm.PageDescriptionLabel.Width := WizardForm.PageDescriptionLabel.Width - ChromeLogoImageOffset;
+      WizardForm.PageDescriptionLabel.Left := WizardForm.PageDescriptionLabel.Left + ChromeLogoImageOffset;
+      ChromeLogoImage.Visible := True;
+    end
+      else
+    if ChromeLogoImage.Visible then
+    begin
+      ChromeLogoImage.Visible := False;
+      WizardForm.PageNameLabel.Left := WizardForm.PageNameLabel.Left - ChromeLogoImageOffset;
+      WizardForm.PageNameLabel.Width := WizardForm.PageNameLabel.Width + ChromeLogoImageOffset;
+      WizardForm.PageDescriptionLabel.Left := WizardForm.PageDescriptionLabel.Left - ChromeLogoImageOffset;
+      WizardForm.PageDescriptionLabel.Width := WizardForm.PageDescriptionLabel.Width + ChromeLogoImageOffset;
+    end;
+  end;
+#endif
 end;
 
 #ifdef OpenCandy
@@ -783,13 +1049,69 @@ begin
 end;
 #endif
 
-#ifdef OpenCandy
+function AskedRestart: Boolean;
+begin
+  Result := WizardForm.YesRadio.Visible;
+end;
+
 procedure DeinitializeSetup;
+var
+  WinHttpReq: Variant;
+  ReportUrl: string;
+  ReportData: string;
+#ifdef Chrome
+  ResultCode: Integer;
+  ChromeLaunched: Boolean;
+#endif
 begin
+#ifdef OpenCandy
   OpenCandyDeinitializeSetup();
-end;
 #endif
 
+  // cannot send report, unless user already accepted license
+  // (with privacy policy)
+  if LicenseAccepted then
+  begin
+    ReportData := Format('installed=%d&silent=%d&lang=%s&', [Integer(InstallationDone), Integer(WizardSilent), ActiveLanguage]);
+
+#ifdef Chrome
+    ChromeLaunched := False;
+
+    if ChromeAllowed and (not AskedRestart) and IsChromeSelected and
+       (WizardForm.RunList.Items.Count >= 2) and // sanity check
+       WizardForm.RunList.Checked[1] then
+    begin
+      Log('Launching Chrome');
+      ChromeLaunched :=
+        ExecAsOriginalUser(ExpandConstant('{tmp}\{#ChromeCheckerFile}'), 'launch', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) and
+        (ResultCode = 0);
+
+      if not ChromeLaunched then
+      begin
+        MsgBox(ExpandConstant('{cm:ChromeInstallationFailed}'), mbError, MB_OK);
+      end;
+    end;
+
+    ReportData := ReportData +
+      Format('chromeoffered=%d&chromeaccepted=%d&chromelaunched=%d&', [Integer(ChromeAllowed), Integer(IsChromeSelected), Integer(ChromeLaunched)]);
+#endif
+
+    try
+      ReportUrl := ExpandConstant('{#WebReport}?') + ReportData;
+
+      Log('Sending installation report: ' + ReportUrl);
+
+      WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
+      WinHttpReq.Open('GET', ReportUrl, False);
+      WinHttpReq.Send('');
+
+      Log('Installation report send result: ' + WinHttpReq.Status + ' ' + WinHttpReq.StatusText);
+    except
+      Log('Error sending installation report: ' + GetExceptionMessage);
+    end;
+  end;
+end;
+
 procedure CurStepChanged(CurStep: TSetupStep);
 begin
   if CurStep = ssPostInstall then
@@ -805,6 +1127,12 @@ begin
 #ifdef OpenCandy
   OpenCandyCurStepChanged(CurStep);
 #endif
+
+  if CurStep = ssDone then
+  begin
+    Log('Installation done');
+    InstallationDone := True;
+  end;
 end;
 
 function ShouldSkipPage(PageID: Integer): Boolean;

+ 5 - 0
windows/EditorManager.cpp

@@ -235,6 +235,11 @@ void __fastcall TEditorManager::Check()
 
       if (Index >= 0)
       {
+        // let the editor finish writting to the file
+        // (first to avoid uploading particually saved file, second
+        // because the timestamp may change more than once during saving)
+        Sleep(GUIConfiguration->KeepUpToDateChangeDelay);
+
         TFileData * FileData = &FFiles[Index];
         FindNextChangeNotification(FileData->Monitor);
 

+ 29 - 0
windows/VCLCommon.cpp

@@ -608,6 +608,35 @@ TAutoSwitch __fastcall ComboAutoSwitchSave(TComboBox * ComboBox)
   return (TAutoSwitch)(2 - ComboBox->ItemIndex);
 }
 //---------------------------------------------------------------------------
+void __fastcall CheckBoxAutoSwitchLoad(TCheckBox * CheckBox, TAutoSwitch Value)
+{
+  switch (Value)
+  {
+    case asOn:
+      CheckBox->State = cbChecked;
+      break;
+    case asOff:
+      CheckBox->State = cbUnchecked;
+      break;
+    default:
+      CheckBox->State = cbGrayed;
+      break;
+  }
+}
+//---------------------------------------------------------------------------
+TAutoSwitch __fastcall CheckBoxAutoSwitchSave(TCheckBox * CheckBox)
+{
+  switch (CheckBox->State)
+  {
+    case cbChecked:
+      return asOn;
+    case cbUnchecked:
+      return asOff;
+    default:
+      return asAuto;
+  }
+}
+//---------------------------------------------------------------------------
 // Windows algorithm is as follows (tested on W2k):
 // right:
 //   is_delimiter(current)

+ 2 - 0
windows/VCLCommon.h

@@ -36,6 +36,8 @@ void __fastcall ListViewCheckAll(TListView * ListView,
 void __fastcall ComboAutoSwitchInitialize(TComboBox * ComboBox);
 void __fastcall ComboAutoSwitchLoad(TComboBox * ComboBox, TAutoSwitch Value);
 TAutoSwitch __fastcall ComboAutoSwitchSave(TComboBox * ComboBox);
+void __fastcall CheckBoxAutoSwitchLoad(TCheckBox * CheckBox, TAutoSwitch Value);
+TAutoSwitch __fastcall CheckBoxAutoSwitchSave(TCheckBox * CheckBox);
 void __fastcall InstallPathWordBreakProc(TWinControl * Control);
 void __fastcall RepaintStatusBar(TCustomStatusBar * StatusBar);
 void __fastcall SetVerticalControlsOrder(TControl ** ControlsOrder, int Count);