Merge remote-tracking branch 'origin/master' into jerry-sandbox
This commit is contained in:
commit
14046db32a
|
@ -491,7 +491,21 @@ Double click on a screen to edit its settings.</string>
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QCheckBox" name="m_pCheckBoxIgnoreAutoConfigClient">
|
||||
<property name="text">
|
||||
<string>Ignore auto config clients</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QCheckBox" name="m_pCheckBoxEnableDragAndDrop">
|
||||
<property name="text">
|
||||
<string>Enable drag and drop file transfers</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<spacer>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
|
@ -504,13 +518,6 @@ Double click on a screen to edit its settings.</string>
|
|||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QCheckBox" name="m_pCheckBoxIgnoreAutoConfigClient">
|
||||
<property name="text">
|
||||
<string>Ignore auto config clients</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
|
|
@ -546,7 +546,9 @@ void MainWindow::startSynergy()
|
|||
|
||||
#ifndef Q_OS_LINUX
|
||||
|
||||
args << "--enable-drag-drop";
|
||||
if (m_ServerConfig.enableDragAndDrop()) {
|
||||
args << "--enable-drag-drop";
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -115,7 +115,14 @@ void PluginManager::copyPlugins()
|
|||
QFile newFile(newName);
|
||||
if(newFile.exists()) {
|
||||
// If it does, delete it. TODO: Check to see if same and leave
|
||||
newFile.remove();
|
||||
bool result = newFile.remove();
|
||||
if( !result ) {
|
||||
emit error(
|
||||
tr( "Unable to delete plugin:\n%1\n"
|
||||
"Please stop synergy and run the wizard again.")
|
||||
.arg(newName));
|
||||
return;
|
||||
}
|
||||
}
|
||||
// make a copy of the plugin in the new location
|
||||
#if defined(Q_OS_WIN)
|
||||
|
@ -125,10 +132,12 @@ void PluginManager::copyPlugins()
|
|||
#endif
|
||||
if ( !result ) {
|
||||
emit error(
|
||||
tr("Failed to copy plugin '%1' to: %2\n%3")
|
||||
tr("Failed to copy plugin '%1' to: %2\n%3\n"
|
||||
"Please stop synergy and run the wizard again.")
|
||||
.arg(m_FileSysPluginList.at(i))
|
||||
.arg(newName)
|
||||
.arg(file.errorString()));
|
||||
return;
|
||||
}
|
||||
else {
|
||||
emit info(
|
||||
|
|
|
@ -50,6 +50,7 @@ ServerConfig::ServerConfig(QSettings* settings, int numColumns, int numRows ,
|
|||
m_NumRows(numRows),
|
||||
m_ServerName(serverName),
|
||||
m_IgnoreAutoConfigClient(false),
|
||||
m_EnableDragAndDrop(false),
|
||||
m_pMainWindow(mainWindow)
|
||||
{
|
||||
Q_ASSERT(m_pSettings);
|
||||
|
@ -114,6 +115,7 @@ void ServerConfig::saveSettings()
|
|||
settings().setValue("switchDoubleTap", switchDoubleTap());
|
||||
settings().setValue("switchCornerSize", switchCornerSize());
|
||||
settings().setValue("ignoreAutoConfigClient", ignoreAutoConfigClient());
|
||||
settings().setValue("enableDragAndDrop", enableDragAndDrop());
|
||||
|
||||
writeSettings(settings(), switchCorners(), "switchCorner");
|
||||
|
||||
|
@ -157,6 +159,7 @@ void ServerConfig::loadSettings()
|
|||
setSwitchDoubleTap(settings().value("switchDoubleTap", 250).toInt());
|
||||
setSwitchCornerSize(settings().value("switchCornerSize").toInt());
|
||||
setIgnoreAutoConfigClient(settings().value("ignoreAutoConfigClient").toBool());
|
||||
setEnableDragAndDrop(settings().value("enableDragAndDrop", true).toBool());
|
||||
|
||||
readSettings(settings(), switchCorners(), "switchCorner", false, NumSwitchCorners);
|
||||
|
||||
|
|
|
@ -61,6 +61,7 @@ class ServerConfig : public BaseConfig
|
|||
const QList<bool>& switchCorners() const { return m_SwitchCorners; }
|
||||
const HotkeyList& hotkeys() const { return m_Hotkeys; }
|
||||
bool ignoreAutoConfigClient() const { return m_IgnoreAutoConfigClient; }
|
||||
bool enableDragAndDrop() const { return m_EnableDragAndDrop; }
|
||||
|
||||
void saveSettings();
|
||||
void loadSettings();
|
||||
|
@ -88,6 +89,7 @@ class ServerConfig : public BaseConfig
|
|||
void setSwitchCorner(int c, bool on) { m_SwitchCorners[c] = on; }
|
||||
void setSwitchCornerSize(int val) { m_SwitchCornerSize = val; }
|
||||
void setIgnoreAutoConfigClient(bool on) { m_IgnoreAutoConfigClient = on; }
|
||||
void setEnableDragAndDrop(bool on) { m_EnableDragAndDrop = on; }
|
||||
QList<bool>& switchCorners() { return m_SwitchCorners; }
|
||||
HotkeyList& hotkeys() { return m_Hotkeys; }
|
||||
|
||||
|
@ -119,6 +121,7 @@ class ServerConfig : public BaseConfig
|
|||
HotkeyList m_Hotkeys;
|
||||
QString m_ServerName;
|
||||
bool m_IgnoreAutoConfigClient;
|
||||
bool m_EnableDragAndDrop;
|
||||
MainWindow* m_pMainWindow;
|
||||
};
|
||||
|
||||
|
|
|
@ -56,6 +56,8 @@ ServerConfigDialog::ServerConfigDialog(QWidget* parent, ServerConfig& config, co
|
|||
|
||||
m_pCheckBoxIgnoreAutoConfigClient->setChecked(serverConfig().ignoreAutoConfigClient());
|
||||
|
||||
m_pCheckBoxEnableDragAndDrop->setChecked(serverConfig().enableDragAndDrop());
|
||||
|
||||
foreach(const Hotkey& hotkey, serverConfig().hotkeys())
|
||||
m_pListHotkeys->addItem(hotkey.text());
|
||||
|
||||
|
@ -97,6 +99,7 @@ void ServerConfigDialog::accept()
|
|||
serverConfig().setSwitchCorner(BaseConfig::BottomRight, m_pCheckBoxCornerBottomRight->isChecked());
|
||||
serverConfig().setSwitchCornerSize(m_pSpinBoxSwitchCornerSize->value());
|
||||
serverConfig().setIgnoreAutoConfigClient(m_pCheckBoxIgnoreAutoConfigClient->isChecked());
|
||||
serverConfig().setEnableDragAndDrop(m_pCheckBoxEnableDragAndDrop->isChecked());
|
||||
|
||||
// now that the dialog has been accepted, copy the new server config to the original one,
|
||||
// which is a reference to the one in MainWindow.
|
||||
|
|
|
@ -56,4 +56,11 @@ public:
|
|||
*/
|
||||
virtual void setting(const std::string& valueName, const std::string& valueString) const = 0;
|
||||
//@}
|
||||
|
||||
//! Get the pathnames of the libraries used by Synergy
|
||||
/*
|
||||
Returns a string containing the full path names of all loaded libraries at the point it is called.
|
||||
*/
|
||||
virtual std::string getLibsUsed(void) const = 0;
|
||||
//@}
|
||||
};
|
||||
|
|
|
@ -74,3 +74,9 @@ void
|
|||
ArchSystemUnix::setting(const std::string&, const std::string&) const
|
||||
{
|
||||
}
|
||||
|
||||
std::string
|
||||
ArchSystemUnix::getLibsUsed(void) const
|
||||
{
|
||||
return "not implmented.\nuse lsof on shell";
|
||||
}
|
||||
|
|
|
@ -33,4 +33,6 @@ public:
|
|||
virtual std::string getPlatformName() const;
|
||||
virtual std::string setting(const std::string&) const;
|
||||
virtual void setting(const std::string&, const std::string&) const;
|
||||
virtual std::string getLibsUsed(void) const;
|
||||
|
||||
};
|
||||
|
|
|
@ -23,6 +23,9 @@
|
|||
#include "tchar.h"
|
||||
#include <string>
|
||||
|
||||
#include <windows.h>
|
||||
#include <psapi.h>
|
||||
|
||||
static const char* s_settingsKeyNames[] = {
|
||||
_T("SOFTWARE"),
|
||||
_T("Synergy"),
|
||||
|
@ -152,3 +155,39 @@ ArchSystemWindows::isWOW64() const
|
|||
#endif
|
||||
return false;
|
||||
}
|
||||
#pragma comment(lib, "psapi")
|
||||
|
||||
std::string
|
||||
ArchSystemWindows::getLibsUsed(void) const
|
||||
{
|
||||
HMODULE hMods[1024];
|
||||
HANDLE hProcess;
|
||||
DWORD cbNeeded;
|
||||
unsigned int i;
|
||||
char hex[16];
|
||||
|
||||
DWORD pid = GetCurrentProcessId();
|
||||
|
||||
std::string msg = "pid:" + std::to_string((_ULonglong)pid) + "\n";
|
||||
|
||||
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
|
||||
|
||||
if (NULL == hProcess) {
|
||||
return msg;
|
||||
}
|
||||
|
||||
if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded)) {
|
||||
for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) {
|
||||
TCHAR szModName[MAX_PATH];
|
||||
if (GetModuleFileNameEx(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR))) {
|
||||
sprintf(hex,"(0x%08X)",hMods[i]);
|
||||
msg += szModName;
|
||||
msg.append(hex);
|
||||
msg.append("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CloseHandle(hProcess);
|
||||
return msg;
|
||||
}
|
||||
|
|
|
@ -33,6 +33,7 @@ public:
|
|||
virtual std::string getPlatformName() const;
|
||||
virtual std::string setting(const std::string& valueName) const;
|
||||
virtual void setting(const std::string& valueName, const std::string& valueString) const;
|
||||
virtual std::string getLibsUsed(void) const;
|
||||
|
||||
bool isWOW64() const;
|
||||
};
|
||||
|
|
|
@ -273,6 +273,7 @@ Client::leave()
|
|||
|
||||
if (m_sendClipboardThread != NULL) {
|
||||
StreamChunker::interruptClipboard();
|
||||
m_sendClipboardThread->wait();
|
||||
m_sendClipboardThread = NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -243,6 +243,7 @@ SocketMultiplexer::serviceThread(void*)
|
|||
for (SocketJobMap::iterator i = m_socketJobMap.begin();
|
||||
i != m_socketJobMap.end();) {
|
||||
if (*(i->second) == NULL) {
|
||||
m_socketJobs.erase(i->second);
|
||||
m_socketJobMap.erase(i++);
|
||||
m_update = true;
|
||||
}
|
||||
|
|
|
@ -42,6 +42,10 @@ enum {
|
|||
kMaxRetryCount = 100000
|
||||
};
|
||||
|
||||
enum {
|
||||
kMsgSize = 128
|
||||
};
|
||||
|
||||
static const char kFingerprintDirName[] = "SSL/Fingerprints";
|
||||
//static const char kFingerprintLocalFilename[] = "Local.txt";
|
||||
static const char kFingerprintTrustedServersFilename[] = "TrustedServers.txt";
|
||||
|
@ -240,6 +244,10 @@ SecureSocket::initContext(bool server)
|
|||
// load all error messages
|
||||
SSL_load_error_strings();
|
||||
|
||||
if (CLOG->getFilter() >= kINFO) {
|
||||
showSecureLibInfo();
|
||||
}
|
||||
|
||||
// SSLv23_method uses TLSv1, with the ability to fall back to SSLv3
|
||||
if (server) {
|
||||
method = SSLv23_server_method();
|
||||
|
@ -298,14 +306,10 @@ SecureSocket::secureAccept(int socket)
|
|||
if (retry == 0) {
|
||||
m_secureReady = true;
|
||||
LOG((CLOG_INFO "accepted secure socket"));
|
||||
const SSL_CIPHER* cipher = SSL_get_current_cipher(m_ssl->m_ssl);
|
||||
if(cipher != NULL) {
|
||||
char * cipherVersion = SSL_CIPHER_description(cipher, NULL, 0);
|
||||
if(cipherVersion != NULL) {
|
||||
LOG((CLOG_INFO "%s", cipherVersion));
|
||||
OPENSSL_free(cipherVersion);
|
||||
}
|
||||
if (CLOG->getFilter() >= kDEBUG1) {
|
||||
showSecureCipherInfo();
|
||||
}
|
||||
showSecureConnectInfo();
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -363,14 +367,10 @@ SecureSocket::secureConnect(int socket)
|
|||
return -1; // Fingerprint failed, error
|
||||
}
|
||||
LOG((CLOG_DEBUG2 "connected secure socket"));
|
||||
const SSL_CIPHER* cipher = SSL_get_current_cipher(m_ssl->m_ssl);
|
||||
if(cipher != NULL) {
|
||||
char * cipherVersion = SSL_CIPHER_description(cipher, NULL, 0);
|
||||
if(cipherVersion != NULL) {
|
||||
LOG((CLOG_INFO "%s", cipherVersion));
|
||||
OPENSSL_free(cipherVersion);
|
||||
}
|
||||
if (CLOG->getFilter() >= kDEBUG1) {
|
||||
showSecureCipherInfo();
|
||||
}
|
||||
showSecureConnectInfo();
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -627,3 +627,72 @@ SecureSocket::serviceAccept(ISocketMultiplexerJob* job,
|
|||
// If status < 0, error happened
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
showCipherStackDesc(STACK_OF(SSL_CIPHER) * stack) {
|
||||
char msg[kMsgSize];
|
||||
int i = 0;
|
||||
for ( ; i < sk_SSL_CIPHER_num(stack) ; i++) {
|
||||
const SSL_CIPHER * cipher = sk_SSL_CIPHER_value(stack,i);
|
||||
|
||||
SSL_CIPHER_description(cipher, msg, kMsgSize);
|
||||
|
||||
// Why does SSL put a newline in the description?
|
||||
int pos = (int)strlen(msg) - 1;
|
||||
if (msg[pos] == '\n') {
|
||||
msg[pos] = '\0';
|
||||
}
|
||||
|
||||
LOG((CLOG_DEBUG1 "%s",msg));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
SecureSocket::showSecureCipherInfo()
|
||||
{
|
||||
STACK_OF(SSL_CIPHER) * sStack = SSL_get_ciphers(m_ssl->m_ssl);
|
||||
|
||||
if (sStack == NULL) {
|
||||
LOG((CLOG_DEBUG1 "local cipher list not available"));
|
||||
}
|
||||
else {
|
||||
LOG((CLOG_DEBUG1 "available local ciphers:"));
|
||||
showCipherStackDesc(sStack);
|
||||
}
|
||||
|
||||
// m_ssl->m_ssl->session->ciphers is not forward compatable, In future release
|
||||
// of OpenSSL, it's not visible, need to use SSL_get_client_ciphers() instead
|
||||
STACK_OF(SSL_CIPHER) * cStack = m_ssl->m_ssl->session->ciphers;
|
||||
if (cStack == NULL) {
|
||||
LOG((CLOG_DEBUG1 "remote cipher list not available"));
|
||||
}
|
||||
else {
|
||||
LOG((CLOG_DEBUG1 "available remote ciphers:"));
|
||||
showCipherStackDesc(cStack);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
SecureSocket::showSecureLibInfo()
|
||||
{
|
||||
LOG((CLOG_INFO "%s",SSLeay_version(SSLEAY_VERSION)));
|
||||
LOG((CLOG_DEBUG1 "openSSL : %s",SSLeay_version(SSLEAY_CFLAGS)));
|
||||
LOG((CLOG_DEBUG1 "openSSL : %s",SSLeay_version(SSLEAY_BUILT_ON)));
|
||||
LOG((CLOG_DEBUG1 "openSSL : %s",SSLeay_version(SSLEAY_PLATFORM)));
|
||||
LOG((CLOG_DEBUG1 "%s",SSLeay_version(SSLEAY_DIR)));
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
SecureSocket::showSecureConnectInfo()
|
||||
{
|
||||
const SSL_CIPHER* cipher = SSL_get_current_cipher(m_ssl->m_ssl);
|
||||
|
||||
if (cipher != NULL) {
|
||||
char msg[kMsgSize];
|
||||
SSL_CIPHER_description(cipher, msg, kMsgSize);
|
||||
LOG((CLOG_INFO "%s", msg));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -79,6 +79,10 @@ private:
|
|||
serviceAccept(ISocketMultiplexerJob*,
|
||||
bool, bool, bool);
|
||||
|
||||
void showSecureConnectInfo();
|
||||
void showSecureLibInfo();
|
||||
void showSecureCipherInfo();
|
||||
|
||||
private:
|
||||
Ssl* m_ssl;
|
||||
bool m_secureReady;
|
||||
|
|
|
@ -23,6 +23,9 @@
|
|||
#include "base/Log.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
#include <iterator>
|
||||
|
||||
const char * kSynergyVers = VERSION;
|
||||
SecureSocket* g_secureSocket = NULL;
|
||||
|
@ -30,8 +33,21 @@ SecureListenSocket* g_secureListenSocket = NULL;
|
|||
Arch* g_arch = NULL;
|
||||
Log* g_log = NULL;
|
||||
|
||||
extern "C" {
|
||||
std::string
|
||||
helperGetLibsUsed(void)
|
||||
{
|
||||
std::stringstream libs(ARCH->getLibsUsed());
|
||||
std::string msg;
|
||||
std::string pid;
|
||||
std::getline(libs,pid);
|
||||
|
||||
while( std::getline(libs,msg) ) {
|
||||
LOG(( CLOG_DEBUG "libs:%s",msg.c_str()));
|
||||
}
|
||||
return pid;
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
void
|
||||
init(void* log, void* arch)
|
||||
{
|
||||
|
@ -42,6 +58,8 @@ init(void* log, void* arch)
|
|||
if (g_arch == NULL) {
|
||||
Arch::setInstance(reinterpret_cast<Arch*>(arch));
|
||||
}
|
||||
|
||||
LOG(( CLOG_DEBUG "library use: %s",helperGetLibsUsed().c_str()));
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -106,4 +124,4 @@ cleanup()
|
|||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -509,6 +509,8 @@ Server::switchScreen(BaseClientProxy* dst,
|
|||
// clipboard data could be corrupted on the other side
|
||||
if (m_sendClipboardThread != NULL) {
|
||||
StreamChunker::interruptClipboard();
|
||||
m_sendClipboardThread->wait();
|
||||
m_sendClipboardThread = NULL;
|
||||
}
|
||||
|
||||
// send the clipboard data to new active screen
|
||||
|
|
|
@ -112,13 +112,13 @@
|
|||
<fire:FirewallException Id="GuiFirewallException" Name="$(var.Name)" Scope="any" IgnoreFailure="yes" />
|
||||
</File>
|
||||
|
||||
<File Source="$(var.QtPath)\libgcc_s_dw2-1.dll" CompanionFile="GuiProgram" />
|
||||
<File Source="$(var.QtPath)\mingwm10.dll" CompanionFile="GuiProgram" />
|
||||
<File Source="$(var.QtPath)\QtCore4.dll" CompanionFile="GuiProgram" />
|
||||
<File Source="$(var.QtPath)\QtGui4.dll" CompanionFile="GuiProgram" />
|
||||
<File Source="$(var.QtPath)\QtNetwork4.dll" CompanionFile="GuiProgram" />
|
||||
<File Source="$(var.QtPath)\libgcc_s_dw2-1.dll" />
|
||||
<File Source="$(var.QtPath)\mingwm10.dll" />
|
||||
<File Source="$(var.QtPath)\QtCore4.dll" />
|
||||
<File Source="$(var.QtPath)\QtGui4.dll" />
|
||||
<File Source="$(var.QtPath)\QtNetwork4.dll" />
|
||||
|
||||
<File Source="$(var.ExtPath)\bonjour\x64\dnssd.dll" CompanionFile="GuiProgram" />
|
||||
<File Source="$(var.ExtPath)\bonjour\x64\dnssd.dll" />
|
||||
|
||||
</Component>
|
||||
|
||||
|
|
|
@ -100,6 +100,10 @@ TEST(IpcLogOutputterTests, write_underBufferMaxSize_allLinesAreSent)
|
|||
outputter.sendBuffer();
|
||||
}
|
||||
|
||||
// HACK: temporarily disable this intermittently failing unit test.
|
||||
// when the build machine is under heavy load, a race condition
|
||||
// usually happens.
|
||||
#if 0
|
||||
TEST(IpcLogOutputterTests, write_overBufferRateLimit_lastLineTruncated)
|
||||
{
|
||||
MockIpcServer mockServer;
|
||||
|
@ -129,6 +133,7 @@ TEST(IpcLogOutputterTests, write_overBufferRateLimit_lastLineTruncated)
|
|||
outputter.write(kNOTIFY, "mock 6");
|
||||
outputter.sendBuffer();
|
||||
}
|
||||
#endif
|
||||
|
||||
TEST(IpcLogOutputterTests, write_underBufferRateLimit_allLinesAreSent)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue