mirror of
https://github.com/debauchee/barrier.git
synced 2024-11-27 00:42:30 +03:00
Merge pull request #26 from debauchee/nosyntool
Drop syntool. In the process some platform-dependent locations have changed. Some users may need to recreate config files or copy the from the old location(s).
This commit is contained in:
commit
0b5ca57b9c
@ -16,7 +16,6 @@
|
||||
|
||||
add_subdirectory(barrierc)
|
||||
add_subdirectory(barriers)
|
||||
add_subdirectory(syntool)
|
||||
|
||||
if (WIN32)
|
||||
add_subdirectory(barrierd)
|
||||
|
@ -1,27 +0,0 @@
|
||||
# barrier -- mouse and keyboard sharing utility
|
||||
# Copyright (C) 2014-2016 Symless Ltd.
|
||||
#
|
||||
# This package is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# found in the file LICENSE that should have accompanied this file.
|
||||
#
|
||||
# This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
file(GLOB headers "*.h")
|
||||
file(GLOB sources "*.cpp")
|
||||
|
||||
add_executable(syntool ${sources})
|
||||
target_link_libraries(syntool
|
||||
synlib arch base client common io ipc mt net platform server ${libs} ${OPENSSL_LIBS})
|
||||
|
||||
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||
install (TARGETS syntool DESTINATION ${BARRIER_BUNDLE_BINARY_DIR})
|
||||
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||
install (TARGETS syntool DESTINATION bin)
|
||||
endif()
|
@ -1,31 +0,0 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2014-2016 Symless Ltd.
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "barrier/ToolApp.h"
|
||||
#include "arch/Arch.h"
|
||||
|
||||
int
|
||||
main(int argc, char** argv)
|
||||
{
|
||||
#if SYSAPI_WIN32
|
||||
// record window instance for tray icon, etc
|
||||
ArchMiscWindows::setInstanceWin32(GetModuleHandle(NULL));
|
||||
#endif
|
||||
|
||||
ToolApp app;
|
||||
return app.run(argc, argv);
|
||||
}
|
@ -45,6 +45,8 @@ if (HAVE_X11)
|
||||
target_link_libraries (barrier X11)
|
||||
endif()
|
||||
|
||||
target_link_libraries (barrier common)
|
||||
|
||||
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||
install (TARGETS barrier DESTINATION ${BARRIER_BUNDLE_BINARY_DIR})
|
||||
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||
|
@ -1,96 +0,0 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2015-2016 Symless Ltd.
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "CoreInterface.h"
|
||||
|
||||
#include "CommandProcess.h"
|
||||
#include "QUtility.h"
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QProcess>
|
||||
#include <QtGlobal>
|
||||
#include <QDir>
|
||||
#include <stdexcept>
|
||||
|
||||
static const char kCoreBinary[] = "syntool";
|
||||
|
||||
#ifdef Q_WS_WIN
|
||||
static const char kSerialKeyFilename[] = "Barrier.subkey";
|
||||
#else
|
||||
static const char kSerialKeyFilename[] = ".barrier.subkey";
|
||||
#endif
|
||||
|
||||
CoreInterface::CoreInterface()
|
||||
{
|
||||
}
|
||||
|
||||
QString CoreInterface::getProfileDir()
|
||||
{
|
||||
QStringList args("--get-profile-dir");
|
||||
return run(args);
|
||||
}
|
||||
|
||||
QString CoreInterface::getInstalledDir()
|
||||
{
|
||||
QStringList args("--get-installed-dir");
|
||||
return run(args);
|
||||
}
|
||||
|
||||
QString CoreInterface::getArch()
|
||||
{
|
||||
QStringList args("--get-arch");
|
||||
return run(args);
|
||||
}
|
||||
|
||||
QString CoreInterface::getSerialKeyFilePath()
|
||||
{
|
||||
QString filename = getProfileDir() + QDir::separator() + kSerialKeyFilename;
|
||||
return filename;
|
||||
}
|
||||
|
||||
QString CoreInterface::notifyUpdate (QString const& fromVersion,
|
||||
QString const& toVersion,
|
||||
QString const& serialKey) {
|
||||
QStringList args("--notify-update");
|
||||
QString input(fromVersion + ":" + toVersion + ":" + serialKey);
|
||||
input.append("\n");
|
||||
return run(args, input);
|
||||
}
|
||||
|
||||
QString CoreInterface::notifyActivation(const QString& identity)
|
||||
{
|
||||
QStringList args("--notify-activation");
|
||||
|
||||
QString input(identity + ":" + hash(getFirstMacAddress()));
|
||||
QString os= getOSInformation();
|
||||
if (!os.isEmpty()) {
|
||||
input.append(":").append(os);
|
||||
}
|
||||
input.append("\n");
|
||||
|
||||
return run(args, input);
|
||||
}
|
||||
|
||||
QString CoreInterface::run(const QStringList& args, const QString& input)
|
||||
{
|
||||
QString program(
|
||||
QCoreApplication::applicationDirPath()
|
||||
+ "/" + kCoreBinary);
|
||||
|
||||
CommandProcess commandProcess(program, args, input);
|
||||
return commandProcess.run();
|
||||
}
|
@ -1,36 +0,0 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2015-2016 Symless Ltd.
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QString>
|
||||
|
||||
class CoreInterface
|
||||
{
|
||||
public:
|
||||
CoreInterface();
|
||||
|
||||
QString getProfileDir();
|
||||
QString getInstalledDir();
|
||||
QString getArch();
|
||||
QString getSerialKeyFilePath();
|
||||
QString notifyActivation(const QString& identity);
|
||||
QString notifyUpdate (QString const& fromVersion,
|
||||
QString const& toVersion,
|
||||
QString const& serialKey);
|
||||
QString run(const QStringList& args, const QString& input = "");
|
||||
};
|
@ -17,7 +17,7 @@
|
||||
|
||||
#include "Fingerprint.h"
|
||||
|
||||
#include "CoreInterface.h"
|
||||
#include "common/DataDirectories.h"
|
||||
|
||||
#include <QDir>
|
||||
#include <QTextStream>
|
||||
@ -125,8 +125,7 @@ void Fingerprint::persistDirectory()
|
||||
|
||||
QString Fingerprint::directoryPath()
|
||||
{
|
||||
CoreInterface coreInterface;
|
||||
QString profileDir = coreInterface.getProfileDir();
|
||||
auto profileDir = QString::fromStdString(DataDirectories::profile());
|
||||
|
||||
return QString("%1/%2")
|
||||
.arg(profileDir)
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "ProcessorArch.h"
|
||||
#include "SslCertificate.h"
|
||||
#include "ShutdownCh.h"
|
||||
#include "common/DataDirectories.h"
|
||||
|
||||
#include <QtCore>
|
||||
#include <QtGui>
|
||||
@ -500,7 +501,7 @@ void MainWindow::startBarrier()
|
||||
// launched the process (e.g. when launched with elevation). setting the
|
||||
// profile dir on launch ensures it uses the same profile dir is used
|
||||
// no matter how its relaunched.
|
||||
args << "--profile-dir" << getProfileRootForArg();
|
||||
args << "--profile-dir" << QString::fromStdString("\"" + DataDirectories::profile() + "\"");
|
||||
#endif
|
||||
|
||||
if ((barrierType() == barrierClient && !clientArgs(args, app))
|
||||
@ -1249,21 +1250,6 @@ void MainWindow::bonjourInstallFinished()
|
||||
m_pCheckBoxAutoConfig->setChecked(true);
|
||||
}
|
||||
|
||||
QString MainWindow::getProfileRootForArg()
|
||||
{
|
||||
CoreInterface coreInterface;
|
||||
QString dir = coreInterface.getProfileDir();
|
||||
|
||||
// HACK: strip our app name since we're returning the root dir.
|
||||
#if defined(Q_OS_WIN)
|
||||
dir.replace("\\Barrier", "");
|
||||
#else
|
||||
dir.replace("/.barrier", "");
|
||||
#endif
|
||||
|
||||
return QString("\"%1\"").arg(dir);
|
||||
}
|
||||
|
||||
void MainWindow::windowStateChanged()
|
||||
{
|
||||
if (windowState() == Qt::WindowMinimized && appConfig().getMinimizeToTray())
|
||||
|
@ -166,7 +166,6 @@ public slots:
|
||||
bool isBonjourRunning();
|
||||
void downloadBonjour();
|
||||
void promptAutoConfig();
|
||||
QString getProfileRootForArg();
|
||||
void checkConnected(const QString& line);
|
||||
void checkFingerprint(const QString& line);
|
||||
void restartBarrier();
|
||||
|
@ -18,7 +18,6 @@
|
||||
|
||||
#include "SettingsDialog.h"
|
||||
|
||||
#include "CoreInterface.h"
|
||||
#include "BarrierLocale.h"
|
||||
#include "QBarrierApplication.h"
|
||||
#include "QUtility.h"
|
||||
|
@ -23,7 +23,6 @@
|
||||
#include <QDialog>
|
||||
#include "ui_SettingsDialogBase.h"
|
||||
#include "BarrierLocale.h"
|
||||
#include "CoreInterface.h"
|
||||
|
||||
class AppConfig;
|
||||
|
||||
@ -43,7 +42,6 @@ class SettingsDialog : public QDialog, public Ui::SettingsDialogBase
|
||||
private:
|
||||
AppConfig& m_appConfig;
|
||||
BarrierLocale m_Locale;
|
||||
CoreInterface m_CoreInterface;
|
||||
|
||||
private slots:
|
||||
void on_m_pComboLanguage_currentIndexChanged(int index);
|
||||
|
@ -17,7 +17,6 @@
|
||||
|
||||
#include "SetupWizard.h"
|
||||
#include "MainWindow.h"
|
||||
#include "WebClient.h"
|
||||
#include "QBarrierApplication.h"
|
||||
#include "QUtility.h"
|
||||
|
||||
|
@ -16,8 +16,8 @@
|
||||
*/
|
||||
|
||||
#include "SslCertificate.h"
|
||||
|
||||
#include "Fingerprint.h"
|
||||
#include "common/DataDirectories.h"
|
||||
|
||||
#include <QProcess>
|
||||
#include <QDir>
|
||||
@ -37,7 +37,7 @@ static const char kConfigFile[] = "barrier.conf";
|
||||
SslCertificate::SslCertificate(QObject *parent) :
|
||||
QObject(parent)
|
||||
{
|
||||
m_ProfileDir = m_CoreInterface.getProfileDir();
|
||||
m_ProfileDir = QString::fromStdString(DataDirectories::profile());
|
||||
if (m_ProfileDir.isEmpty()) {
|
||||
emit error(tr("Failed to get profile directory."));
|
||||
}
|
||||
|
@ -17,8 +17,6 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreInterface.h"
|
||||
|
||||
#include <QObject>
|
||||
|
||||
class SslCertificate : public QObject
|
||||
@ -43,5 +41,4 @@ private:
|
||||
private:
|
||||
QString m_ProfileDir;
|
||||
QString m_ToolOutput;
|
||||
CoreInterface m_CoreInterface;
|
||||
};
|
||||
|
@ -1,83 +0,0 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2015-2016 Symless Ltd.
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "WebClient.h"
|
||||
|
||||
#include "QUtility.h"
|
||||
|
||||
#include <QProcess>
|
||||
#include <QMessageBox>
|
||||
#include <QCoreApplication>
|
||||
#include <stdexcept>
|
||||
|
||||
bool
|
||||
WebClient::getEdition (int& edition, QString& errorOut) {
|
||||
QString responseJson = request();
|
||||
|
||||
/* TODO: This is horrible and should be ripped out as soon as we move
|
||||
* to Qt 5. See issue #5630
|
||||
*/
|
||||
|
||||
QRegExp resultRegex(".*\"result\".*:.*(true|false).*");
|
||||
if (resultRegex.exactMatch (responseJson)) {
|
||||
QString boolString = resultRegex.cap(1);
|
||||
if (boolString == "true") {
|
||||
QRegExp editionRegex(".*\"edition\".*:.*\"([^\"]+)\".*");
|
||||
if (editionRegex.exactMatch(responseJson)) {
|
||||
QString e = editionRegex.cap(1);
|
||||
edition = e.toInt();
|
||||
return true;
|
||||
} else {
|
||||
throw std::runtime_error ("Unrecognised server response.");
|
||||
}
|
||||
} else {
|
||||
errorOut = tr("Login failed. Invalid email address or password.");
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
QRegExp errorRegex(".*\"error\".*:.*\"([^\"]+)\".*");
|
||||
if (errorRegex.exactMatch (responseJson)) {
|
||||
errorOut = errorRegex.cap(1).replace("\\n", "\n");
|
||||
return false;
|
||||
} else {
|
||||
throw std::runtime_error ("Unrecognised server response.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
WebClient::setEmail (QString email, QString& errorOut) {
|
||||
if (email.isEmpty()) {
|
||||
errorOut = tr("Your email address cannot be left blank.");
|
||||
return false;
|
||||
}
|
||||
m_Email = email;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
WebClient::setPassword (QString password, QString&) {
|
||||
m_Password = password;
|
||||
return true;
|
||||
}
|
||||
|
||||
QString
|
||||
WebClient::request() {
|
||||
QStringList args("--login-auth");
|
||||
QString credentials (m_Email + ":" + hash(m_Password) + "\n");
|
||||
return m_CoreInterface.run (args, credentials);
|
||||
}
|
@ -1,49 +0,0 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2015-2016 Symless Ltd.
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef WEBCLIENT_H
|
||||
#define WEBCLIENT_H
|
||||
|
||||
#include <QString>
|
||||
#include <QObject>
|
||||
|
||||
#include "CoreInterface.h"
|
||||
|
||||
class QMessageBox;
|
||||
class QWidget;
|
||||
class QStringList;
|
||||
|
||||
class WebClient : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
bool getEdition (int& edition, QString& errorOut);
|
||||
bool setEmail (QString email, QString& errorOut);
|
||||
bool setPassword (QString password, QString& errorOut);
|
||||
signals:
|
||||
void error(QString e);
|
||||
|
||||
private:
|
||||
QString request();
|
||||
|
||||
QString m_Email;
|
||||
QString m_Password;
|
||||
CoreInterface m_CoreInterface;
|
||||
};
|
||||
|
||||
#endif // WEBCLIENT_H
|
@ -40,7 +40,6 @@
|
||||
#if SYSAPI_WIN32
|
||||
# include "arch/win32/ArchConsoleWindows.h"
|
||||
# include "arch/win32/ArchDaemonWindows.h"
|
||||
# include "arch/win32/ArchFileWindows.h"
|
||||
# include "arch/win32/ArchLogWindows.h"
|
||||
# include "arch/win32/ArchMiscWindows.h"
|
||||
# include "arch/win32/ArchMultithreadWindows.h"
|
||||
@ -54,7 +53,6 @@
|
||||
#elif SYSAPI_UNIX
|
||||
# include "arch/unix/ArchConsoleUnix.h"
|
||||
# include "arch/unix/ArchDaemonUnix.h"
|
||||
# include "arch/unix/ArchFileUnix.h"
|
||||
# include "arch/unix/ArchLogUnix.h"
|
||||
# if HAVE_PTHREAD
|
||||
# include "arch/unix/ArchMultithreadPosix.h"
|
||||
@ -86,7 +84,6 @@ typically at the beginning of \c main().
|
||||
*/
|
||||
class Arch : public ARCH_CONSOLE,
|
||||
public ARCH_DAEMON,
|
||||
public ARCH_FILE,
|
||||
public ARCH_LOG,
|
||||
public ARCH_MULTITHREAD,
|
||||
public ARCH_NETWORK,
|
||||
|
@ -1,105 +0,0 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2012-2016 Symless Ltd.
|
||||
* Copyright (C) 2002 Chris Schoeneman
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "common/IInterface.h"
|
||||
#include "common/stdstring.h"
|
||||
#include "base/String.h"
|
||||
|
||||
//! Interface for architecture dependent file system operations
|
||||
/*!
|
||||
This interface defines the file system operations required by
|
||||
barrier. Each architecture must implement this interface.
|
||||
*/
|
||||
class IArchFile : public IInterface {
|
||||
public:
|
||||
//! @name manipulators
|
||||
//@{
|
||||
|
||||
//! Extract base name
|
||||
/*!
|
||||
Find the base name in the given \c pathname.
|
||||
*/
|
||||
virtual const char* getBasename(const char* pathname) = 0;
|
||||
|
||||
//! Get user's home directory
|
||||
/*!
|
||||
Returns the user's home directory. Returns the empty string if
|
||||
this cannot be determined.
|
||||
*/
|
||||
virtual std::string getUserDirectory() = 0;
|
||||
|
||||
//! Get system directory
|
||||
/*!
|
||||
Returns the ussystem configuration file directory.
|
||||
*/
|
||||
virtual std::string getSystemDirectory() = 0;
|
||||
|
||||
//! Get installed directory
|
||||
/*!
|
||||
Returns the directory in which Barrier is installed.
|
||||
*/
|
||||
virtual std::string getInstalledDirectory() = 0;
|
||||
|
||||
//! Get log directory
|
||||
/*!
|
||||
Returns the log file directory.
|
||||
*/
|
||||
virtual std::string getLogDirectory() = 0;
|
||||
|
||||
//! Get plugins directory
|
||||
/*!
|
||||
Returns the plugin files directory. If no plugin directory is set,
|
||||
this will return the plugin folder within the user's profile.
|
||||
*/
|
||||
virtual std::string getPluginDirectory() = 0;
|
||||
|
||||
//! Get user's profile directory
|
||||
/*!
|
||||
Returns the user's profile directory. If no profile directory is set,
|
||||
this will return the user's profile according to the operating system,
|
||||
which will depend on which user launched the program.
|
||||
*/
|
||||
virtual std::string getProfileDirectory() = 0;
|
||||
|
||||
//! Concatenate path components
|
||||
/*!
|
||||
Concatenate pathname components with a directory separator
|
||||
between them. This should not check if the resulting path
|
||||
is longer than allowed by the system; we'll rely on the
|
||||
system calls to tell us that.
|
||||
*/
|
||||
virtual std::string concatPath(
|
||||
const std::string& prefix,
|
||||
const std::string& suffix) = 0;
|
||||
|
||||
//@}
|
||||
//! Set the user's profile directory
|
||||
/*
|
||||
Returns the user's profile directory.
|
||||
*/
|
||||
virtual void setProfileDirectory(const String& s) = 0;
|
||||
|
||||
//@}
|
||||
//! Set the user's plugin directory
|
||||
/*
|
||||
Returns the user's plugin directory.
|
||||
*/
|
||||
virtual void setPluginDirectory(const String& s) = 0;
|
||||
};
|
@ -1,163 +0,0 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2012-2016 Symless Ltd.
|
||||
* Copyright (C) 2002 Chris Schoeneman
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "arch/unix/ArchFileUnix.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <pwd.h>
|
||||
#include <sys/types.h>
|
||||
#include <cstring>
|
||||
|
||||
//
|
||||
// ArchFileUnix
|
||||
//
|
||||
|
||||
ArchFileUnix::ArchFileUnix()
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
|
||||
ArchFileUnix::~ArchFileUnix()
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
|
||||
const char*
|
||||
ArchFileUnix::getBasename(const char* pathname)
|
||||
{
|
||||
if (pathname == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char* basename = strrchr(pathname, '/');
|
||||
if (basename != NULL) {
|
||||
return basename + 1;
|
||||
}
|
||||
else {
|
||||
return pathname;
|
||||
}
|
||||
}
|
||||
|
||||
std::string
|
||||
ArchFileUnix::getUserDirectory()
|
||||
{
|
||||
char* buffer = NULL;
|
||||
std::string dir;
|
||||
#if HAVE_GETPWUID_R
|
||||
struct passwd pwent;
|
||||
struct passwd* pwentp;
|
||||
#if defined(_SC_GETPW_R_SIZE_MAX)
|
||||
long size = sysconf(_SC_GETPW_R_SIZE_MAX);
|
||||
if (size == -1) {
|
||||
size = BUFSIZ;
|
||||
}
|
||||
#else
|
||||
long size = BUFSIZ;
|
||||
#endif
|
||||
buffer = new char[size];
|
||||
getpwuid_r(getuid(), &pwent, buffer, size, &pwentp);
|
||||
#else
|
||||
struct passwd* pwentp = getpwuid(getuid());
|
||||
#endif
|
||||
if (pwentp != NULL && pwentp->pw_dir != NULL) {
|
||||
dir = pwentp->pw_dir;
|
||||
}
|
||||
delete[] buffer;
|
||||
return dir;
|
||||
}
|
||||
|
||||
std::string
|
||||
ArchFileUnix::getSystemDirectory()
|
||||
{
|
||||
return "/etc";
|
||||
}
|
||||
|
||||
std::string
|
||||
ArchFileUnix::getInstalledDirectory()
|
||||
{
|
||||
#if WINAPI_XWINDOWS
|
||||
return "/usr/bin";
|
||||
#else
|
||||
return "/Applications/Barrier.app/Contents/MacOS";
|
||||
#endif
|
||||
}
|
||||
|
||||
std::string
|
||||
ArchFileUnix::getLogDirectory()
|
||||
{
|
||||
return "/var/log";
|
||||
}
|
||||
|
||||
std::string
|
||||
ArchFileUnix::getPluginDirectory()
|
||||
{
|
||||
if (!m_pluginDirectory.empty()) {
|
||||
return m_pluginDirectory;
|
||||
}
|
||||
|
||||
#if WINAPI_XWINDOWS
|
||||
return getProfileDirectory().append("/plugins");
|
||||
#else
|
||||
return getProfileDirectory().append("/Plugins");
|
||||
#endif
|
||||
}
|
||||
|
||||
std::string
|
||||
ArchFileUnix::getProfileDirectory()
|
||||
{
|
||||
String dir;
|
||||
if (!m_profileDirectory.empty()) {
|
||||
dir = m_profileDirectory;
|
||||
}
|
||||
else {
|
||||
#if WINAPI_XWINDOWS
|
||||
dir = getUserDirectory().append("/.barrier");
|
||||
#else
|
||||
dir = getUserDirectory().append("/Library/Application Support/Barrier");
|
||||
#endif
|
||||
}
|
||||
return dir;
|
||||
|
||||
}
|
||||
|
||||
std::string
|
||||
ArchFileUnix::concatPath(const std::string& prefix,
|
||||
const std::string& suffix)
|
||||
{
|
||||
std::string path;
|
||||
path.reserve(prefix.size() + 1 + suffix.size());
|
||||
path += prefix;
|
||||
if (path.size() == 0 || path[path.size() - 1] != '/') {
|
||||
path += '/';
|
||||
}
|
||||
path += suffix;
|
||||
return path;
|
||||
}
|
||||
|
||||
void
|
||||
ArchFileUnix::setProfileDirectory(const String& s)
|
||||
{
|
||||
m_profileDirectory = s;
|
||||
}
|
||||
|
||||
void
|
||||
ArchFileUnix::setPluginDirectory(const String& s)
|
||||
{
|
||||
m_pluginDirectory = s;
|
||||
}
|
@ -1,47 +0,0 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2012-2016 Symless Ltd.
|
||||
* Copyright (C) 2002 Chris Schoeneman
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "arch/IArchFile.h"
|
||||
|
||||
#define ARCH_FILE ArchFileUnix
|
||||
|
||||
//! Unix implementation of IArchFile
|
||||
class ArchFileUnix : public IArchFile {
|
||||
public:
|
||||
ArchFileUnix();
|
||||
virtual ~ArchFileUnix();
|
||||
|
||||
// IArchFile overrides
|
||||
virtual const char* getBasename(const char* pathname);
|
||||
virtual std::string getUserDirectory();
|
||||
virtual std::string getSystemDirectory();
|
||||
virtual std::string getInstalledDirectory();
|
||||
virtual std::string getLogDirectory();
|
||||
virtual std::string getPluginDirectory();
|
||||
virtual std::string getProfileDirectory();
|
||||
virtual std::string concatPath(const std::string& prefix,
|
||||
const std::string& suffix);
|
||||
virtual void setProfileDirectory(const String& s);
|
||||
virtual void setPluginDirectory(const String& s);
|
||||
|
||||
private:
|
||||
String m_profileDirectory;
|
||||
String m_pluginDirectory;
|
||||
};
|
@ -1,203 +0,0 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2012-2016 Symless Ltd.
|
||||
* Copyright (C) 2002 Chris Schoeneman
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "arch/win32/ArchFileWindows.h"
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <Windows.h>
|
||||
#include <shlobj.h>
|
||||
#include <tchar.h>
|
||||
#include <string.h>
|
||||
|
||||
//
|
||||
// ArchFileWindows
|
||||
//
|
||||
|
||||
ArchFileWindows::ArchFileWindows()
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
|
||||
ArchFileWindows::~ArchFileWindows()
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
|
||||
const char*
|
||||
ArchFileWindows::getBasename(const char* pathname)
|
||||
{
|
||||
if (pathname == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// check for last slash
|
||||
const char* basename = strrchr(pathname, '/');
|
||||
if (basename != NULL) {
|
||||
++basename;
|
||||
}
|
||||
else {
|
||||
basename = pathname;
|
||||
}
|
||||
|
||||
// check for last backslash
|
||||
const char* basename2 = strrchr(pathname, '\\');
|
||||
if (basename2 != NULL && basename2 > basename) {
|
||||
basename = basename2 + 1;
|
||||
}
|
||||
|
||||
return basename;
|
||||
}
|
||||
|
||||
std::string
|
||||
ArchFileWindows::getUserDirectory()
|
||||
{
|
||||
// try %HOMEPATH%
|
||||
TCHAR dir[MAX_PATH];
|
||||
DWORD size = sizeof(dir) / sizeof(TCHAR);
|
||||
DWORD result = GetEnvironmentVariable(_T("HOMEPATH"), dir, size);
|
||||
if (result != 0 && result <= size) {
|
||||
// sanity check -- if dir doesn't appear to start with a
|
||||
// drive letter and isn't a UNC name then don't use it
|
||||
// FIXME -- allow UNC names
|
||||
if (dir[0] != '\0' && (dir[1] == ':' ||
|
||||
((dir[0] == '\\' || dir[0] == '/') &&
|
||||
(dir[1] == '\\' || dir[1] == '/')))) {
|
||||
return dir;
|
||||
}
|
||||
}
|
||||
|
||||
// get the location of the personal files. that's as close to
|
||||
// a home directory as we're likely to find.
|
||||
ITEMIDLIST* idl;
|
||||
if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_PERSONAL, &idl))) {
|
||||
TCHAR* path = NULL;
|
||||
if (SHGetPathFromIDList(idl, dir)) {
|
||||
DWORD attr = GetFileAttributes(dir);
|
||||
if (attr != 0xffffffff && (attr & FILE_ATTRIBUTE_DIRECTORY) != 0)
|
||||
path = dir;
|
||||
}
|
||||
|
||||
IMalloc* shalloc;
|
||||
if (SUCCEEDED(SHGetMalloc(&shalloc))) {
|
||||
shalloc->Free(idl);
|
||||
shalloc->Release();
|
||||
}
|
||||
|
||||
if (path != NULL) {
|
||||
return path;
|
||||
}
|
||||
}
|
||||
|
||||
// use root of C drive as a default
|
||||
return "C:";
|
||||
}
|
||||
|
||||
std::string
|
||||
ArchFileWindows::getSystemDirectory()
|
||||
{
|
||||
// get windows directory
|
||||
char dir[MAX_PATH];
|
||||
if (GetWindowsDirectory(dir, sizeof(dir)) != 0) {
|
||||
return dir;
|
||||
}
|
||||
else {
|
||||
// can't get it. use C:\ as a default.
|
||||
return "C:";
|
||||
}
|
||||
}
|
||||
|
||||
std::string
|
||||
ArchFileWindows::getInstalledDirectory()
|
||||
{
|
||||
char fileNameBuffer[MAX_PATH];
|
||||
GetModuleFileName(NULL, fileNameBuffer, MAX_PATH);
|
||||
std::string fileName(fileNameBuffer);
|
||||
size_t lastSlash = fileName.find_last_of("\\");
|
||||
fileName = fileName.substr(0, lastSlash);
|
||||
|
||||
return fileName;
|
||||
}
|
||||
|
||||
std::string
|
||||
ArchFileWindows::getLogDirectory()
|
||||
{
|
||||
return getInstalledDirectory();
|
||||
}
|
||||
|
||||
std::string
|
||||
ArchFileWindows::getPluginDirectory()
|
||||
{
|
||||
if (!m_pluginDirectory.empty()) {
|
||||
return m_pluginDirectory;
|
||||
}
|
||||
|
||||
std::string dir = getProfileDirectory();
|
||||
dir.append("\\Plugins");
|
||||
return dir;
|
||||
}
|
||||
|
||||
std::string
|
||||
ArchFileWindows::getProfileDirectory()
|
||||
{
|
||||
String dir;
|
||||
if (!m_profileDirectory.empty()) {
|
||||
dir = m_profileDirectory;
|
||||
}
|
||||
else {
|
||||
TCHAR result[MAX_PATH];
|
||||
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, result))) {
|
||||
dir = result;
|
||||
}
|
||||
else {
|
||||
dir = getUserDirectory();
|
||||
}
|
||||
}
|
||||
|
||||
// HACK: append program name, this seems wrong.
|
||||
dir.append("\\Barrier");
|
||||
|
||||
return dir;
|
||||
}
|
||||
|
||||
std::string
|
||||
ArchFileWindows::concatPath(const std::string& prefix,
|
||||
const std::string& suffix)
|
||||
{
|
||||
std::string path;
|
||||
path.reserve(prefix.size() + 1 + suffix.size());
|
||||
path += prefix;
|
||||
if (path.size() == 0 ||
|
||||
(path[path.size() - 1] != '\\' &&
|
||||
path[path.size() - 1] != '/')) {
|
||||
path += '\\';
|
||||
}
|
||||
path += suffix;
|
||||
return path;
|
||||
}
|
||||
|
||||
void
|
||||
ArchFileWindows::setProfileDirectory(const String& s)
|
||||
{
|
||||
m_profileDirectory = s;
|
||||
}
|
||||
|
||||
void
|
||||
ArchFileWindows::setPluginDirectory(const String& s)
|
||||
{
|
||||
m_pluginDirectory = s;
|
||||
}
|
@ -1,47 +0,0 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2012-2016 Symless Ltd.
|
||||
* Copyright (C) 2002 Chris Schoeneman
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "arch/IArchFile.h"
|
||||
|
||||
#define ARCH_FILE ArchFileWindows
|
||||
|
||||
//! Win32 implementation of IArchFile
|
||||
class ArchFileWindows : public IArchFile {
|
||||
public:
|
||||
ArchFileWindows();
|
||||
virtual ~ArchFileWindows();
|
||||
|
||||
// IArchFile overrides
|
||||
virtual const char* getBasename(const char* pathname);
|
||||
virtual std::string getUserDirectory();
|
||||
virtual std::string getSystemDirectory();
|
||||
virtual std::string getInstalledDirectory();
|
||||
virtual std::string getLogDirectory();
|
||||
virtual std::string getPluginDirectory();
|
||||
virtual std::string getProfileDirectory();
|
||||
virtual std::string concatPath(const std::string& prefix,
|
||||
const std::string& suffix);
|
||||
virtual void setProfileDirectory(const String& s);
|
||||
virtual void setPluginDirectory(const String& s);
|
||||
|
||||
private:
|
||||
String m_profileDirectory;
|
||||
String m_pluginDirectory;
|
||||
};
|
@ -21,9 +21,7 @@
|
||||
#include "base/Log.h"
|
||||
#include "common/Version.h"
|
||||
#include "barrier/protocol_types.h"
|
||||
#include "arch/Arch.h"
|
||||
#include "base/XBase.h"
|
||||
#include "arch/XArch.h"
|
||||
#include "base/log_outputters.h"
|
||||
#include "barrier/XBarrier.h"
|
||||
#include "barrier/ArgsBase.h"
|
||||
@ -32,9 +30,9 @@
|
||||
#include "ipc/IpcMessage.h"
|
||||
#include "ipc/Ipc.h"
|
||||
#include "base/EventQueue.h"
|
||||
#include "common/DataDirectories.h"
|
||||
|
||||
#if SYSAPI_WIN32
|
||||
#include "arch/win32/ArchMiscWindows.h"
|
||||
#include "base/IEventQueue.h"
|
||||
#include "base/TMethodJob.h"
|
||||
#endif
|
||||
@ -175,8 +173,7 @@ App::initApp(int argc, const char** argv)
|
||||
// parse command line
|
||||
parseArgs(argc, argv);
|
||||
|
||||
ARCH->setProfileDirectory(argsBase().m_profileDirectory);
|
||||
ARCH->setPluginDirectory(argsBase().m_pluginDirectory);
|
||||
DataDirectories::profile(argsBase().m_profileDirectory);
|
||||
|
||||
// set log filter
|
||||
if (!CLOG->setFilter(argsBase().m_logFilter)) {
|
||||
|
@ -21,10 +21,10 @@
|
||||
#include "barrier/App.h"
|
||||
#include "barrier/ServerArgs.h"
|
||||
#include "barrier/ClientArgs.h"
|
||||
#include "barrier/ToolArgs.h"
|
||||
#include "barrier/ArgsBase.h"
|
||||
#include "base/Log.h"
|
||||
#include "base/String.h"
|
||||
#include "common/PathUtilities.h"
|
||||
|
||||
#ifdef WINAPI_MSWINDOWS
|
||||
#include <VersionHelpers.h>
|
||||
@ -171,46 +171,6 @@ ArgParser::parsePlatformArg(ArgsBase& argsBase, const int& argc, const char* con
|
||||
#endif
|
||||
}
|
||||
|
||||
bool
|
||||
ArgParser::parseToolArgs(ToolArgs& args, int argc, const char* const* argv)
|
||||
{
|
||||
for (int i = 1; i < argc; ++i) {
|
||||
if (isArg(i, argc, argv, NULL, "--get-active-desktop", 0)) {
|
||||
args.m_printActiveDesktopName = true;
|
||||
return true;
|
||||
}
|
||||
else if (isArg(i, argc, argv, NULL, "--login-auth", 0)) {
|
||||
args.m_loginAuthenticate = true;
|
||||
return true;
|
||||
}
|
||||
else if (isArg(i, argc, argv, NULL, "--get-installed-dir", 0)) {
|
||||
args.m_getInstalledDir = true;
|
||||
return true;
|
||||
}
|
||||
else if (isArg(i, argc, argv, NULL, "--get-profile-dir", 0)) {
|
||||
args.m_getProfileDir = true;
|
||||
return true;
|
||||
}
|
||||
else if (isArg(i, argc, argv, NULL, "--get-arch", 0)) {
|
||||
args.m_getArch = true;
|
||||
return true;
|
||||
}
|
||||
else if (isArg(i, argc, argv, NULL, "--notify-activation", 0)) {
|
||||
args.m_notifyActivation = true;
|
||||
return true;
|
||||
}
|
||||
else if (isArg(i, argc, argv, NULL, "--notify-update", 0)) {
|
||||
args.m_notifyUpdate = true;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
ArgParser::parseGenericArgs(int argc, const char* const* argv, int& i)
|
||||
{
|
||||
@ -496,7 +456,7 @@ void
|
||||
ArgParser::updateCommonArgs(const char* const* argv)
|
||||
{
|
||||
argsBase().m_name = ARCH->getHostName();
|
||||
argsBase().m_pname = ARCH->getBasename(argv[0]);
|
||||
argsBase().m_pname = PathUtilities::basename(argv[0]).c_str();
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -22,7 +22,6 @@
|
||||
|
||||
class ServerArgs;
|
||||
class ClientArgs;
|
||||
class ToolArgs;
|
||||
class ArgsBase;
|
||||
class App;
|
||||
|
||||
@ -34,7 +33,6 @@ public:
|
||||
bool parseServerArgs(ServerArgs& args, int argc, const char* const* argv);
|
||||
bool parseClientArgs(ClientArgs& args, int argc, const char* const* argv);
|
||||
bool parsePlatformArg(ArgsBase& argsBase, const int& argc, const char* const* argv, int& i);
|
||||
bool parseToolArgs(ToolArgs& args, int argc, const char* const* argv);
|
||||
bool parseGenericArgs(int argc, const char* const* argv, int& i);
|
||||
bool parseDeprecatedArgs(int argc, const char* const* argv, int& i);
|
||||
void setArgsBase(ArgsBase& argsBase) { m_argsBase = &argsBase; }
|
||||
|
@ -40,10 +40,7 @@
|
||||
#include "base/TMethodJob.h"
|
||||
#include "base/Log.h"
|
||||
#include "common/Version.h"
|
||||
|
||||
#if SYSAPI_WIN32
|
||||
#include "arch/win32/ArchMiscWindows.h"
|
||||
#endif
|
||||
#include "common/PathUtilities.h"
|
||||
|
||||
#if WINAPI_MSWINDOWS
|
||||
#include "platform/MSWindowsScreen.h"
|
||||
@ -519,7 +516,7 @@ ClientApp::runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc
|
||||
{
|
||||
// general initialization
|
||||
m_serverAddress = new NetworkAddress;
|
||||
args().m_pname = ARCH->getBasename(argv[0]);
|
||||
args().m_pname = PathUtilities::basename(argv[0]).c_str();
|
||||
|
||||
// install caller's output filter
|
||||
if (outputter != NULL) {
|
||||
|
@ -39,6 +39,8 @@
|
||||
#include "base/Log.h"
|
||||
#include "base/TMethodEventJob.h"
|
||||
#include "common/Version.h"
|
||||
#include "common/DataDirectories.h"
|
||||
#include "common/PathUtilities.h"
|
||||
|
||||
#if SYSAPI_WIN32
|
||||
#include "arch/win32/ArchMiscWindows.h"
|
||||
@ -142,8 +144,8 @@ ServerApp::help()
|
||||
<< std::endl
|
||||
<< "If no configuration file pathname is provided then the first of the" << std::endl
|
||||
<< "following to load successfully sets the configuration:" << std::endl
|
||||
<< " $HOME/" << USR_CONFIG_NAME << std::endl
|
||||
<< " " << ARCH->concatPath(ARCH->getSystemDirectory(), SYS_CONFIG_NAME) << std::endl;
|
||||
<< " " << PathUtilities::concat(DataDirectories::profile(), SYS_CONFIG_NAME) << std::endl
|
||||
<< " " << PathUtilities::concat(DataDirectories::systemconfig(), SYS_CONFIG_NAME) << std::endl;
|
||||
|
||||
LOG((CLOG_PRINT "%s", buffer.str().c_str()));
|
||||
}
|
||||
@ -180,11 +182,10 @@ ServerApp::loadConfig()
|
||||
|
||||
// load the default configuration if no explicit file given
|
||||
else {
|
||||
// get the user's home directory
|
||||
String path = ARCH->getUserDirectory();
|
||||
String path = DataDirectories::profile();
|
||||
if (!path.empty()) {
|
||||
// complete path
|
||||
path = ARCH->concatPath(path, USR_CONFIG_NAME);
|
||||
path = PathUtilities::concat(path, USR_CONFIG_NAME);
|
||||
|
||||
// now try loading the user's configuration
|
||||
if (loadConfig(path)) {
|
||||
@ -194,9 +195,9 @@ ServerApp::loadConfig()
|
||||
}
|
||||
if (!loaded) {
|
||||
// try the system-wide config file
|
||||
path = ARCH->getSystemDirectory();
|
||||
path = DataDirectories::systemconfig();
|
||||
if (!path.empty()) {
|
||||
path = ARCH->concatPath(path, SYS_CONFIG_NAME);
|
||||
path = PathUtilities::concat(path, SYS_CONFIG_NAME);
|
||||
if (loadConfig(path)) {
|
||||
loaded = true;
|
||||
args().m_configFile = path;
|
||||
@ -779,7 +780,7 @@ ServerApp::runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc
|
||||
// general initialization
|
||||
m_barrierAddress = new NetworkAddress;
|
||||
args().m_config = new Config(m_events);
|
||||
args().m_pname = ARCH->getBasename(argv[0]);
|
||||
args().m_pname = PathUtilities::basename(argv[0]).c_str();
|
||||
|
||||
// install caller's output filter
|
||||
if (outputter != NULL) {
|
||||
|
@ -1,205 +0,0 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2014-2016 Symless Ltd.
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "barrier/ToolApp.h"
|
||||
|
||||
#include "barrier/ArgParser.h"
|
||||
#include "arch/Arch.h"
|
||||
#include "base/Log.h"
|
||||
#include "base/String.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
|
||||
#if SYSAPI_WIN32
|
||||
#include "platform/MSWindowsSession.h"
|
||||
#endif
|
||||
|
||||
#define JSON_URL "https://symless.com/account/json/"
|
||||
|
||||
enum {
|
||||
kErrorOk,
|
||||
kErrorArgs,
|
||||
kErrorException,
|
||||
kErrorUnknown
|
||||
};
|
||||
|
||||
UInt32
|
||||
ToolApp::run(int argc, char** argv)
|
||||
{
|
||||
if (argc <= 1) {
|
||||
std::cerr << "no args" << std::endl;
|
||||
return kErrorArgs;
|
||||
}
|
||||
|
||||
try {
|
||||
ArgParser argParser(this);
|
||||
bool result = argParser.parseToolArgs(m_args, argc, argv);
|
||||
|
||||
if (!result) {
|
||||
m_bye(kExitArgs);
|
||||
}
|
||||
|
||||
if (m_args.m_printActiveDesktopName) {
|
||||
#if SYSAPI_WIN32
|
||||
MSWindowsSession session;
|
||||
String name = session.getActiveDesktopName();
|
||||
if (name.empty()) {
|
||||
LOG((CLOG_CRIT "failed to get active desktop name"));
|
||||
return kExitFailed;
|
||||
}
|
||||
else {
|
||||
String output = barrier::string::sprintf("activeDesktop:%s", name.c_str());
|
||||
LOG((CLOG_INFO "%s", output.c_str()));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else if (m_args.m_loginAuthenticate) {
|
||||
loginAuth();
|
||||
}
|
||||
else if (m_args.m_getInstalledDir) {
|
||||
std::cout << ARCH->getInstalledDirectory() << std::endl;
|
||||
}
|
||||
else if (m_args.m_getProfileDir) {
|
||||
std::cout << ARCH->getProfileDirectory() << std::endl;
|
||||
}
|
||||
else if (m_args.m_getArch) {
|
||||
std::cout << ARCH->getPlatformName() << std::endl;
|
||||
}
|
||||
else if (m_args.m_notifyUpdate) {
|
||||
notifyUpdate();
|
||||
}
|
||||
else if (m_args.m_notifyActivation) {
|
||||
notifyActivation();
|
||||
}
|
||||
else {
|
||||
throw XBarrier("Nothing to do");
|
||||
}
|
||||
}
|
||||
catch (std::exception& e) {
|
||||
LOG((CLOG_CRIT "An error occurred: %s\n", e.what()));
|
||||
return kExitFailed;
|
||||
}
|
||||
catch (...) {
|
||||
LOG((CLOG_CRIT "An unknown error occurred.\n"));
|
||||
return kExitFailed;
|
||||
}
|
||||
|
||||
#if WINAPI_XWINDOWS
|
||||
// HACK: avoid sigsegv on linux
|
||||
m_bye(kErrorOk);
|
||||
#endif
|
||||
|
||||
return kErrorOk;
|
||||
}
|
||||
|
||||
void
|
||||
ToolApp::help()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
ToolApp::loginAuth()
|
||||
{
|
||||
String credentials;
|
||||
std::cin >> credentials;
|
||||
|
||||
std::vector<String> parts = barrier::string::splitString(credentials, ':');
|
||||
size_t count = parts.size();
|
||||
|
||||
if (count == 2 ) {
|
||||
String email = parts[0];
|
||||
String password = parts[1];
|
||||
|
||||
std::stringstream ss;
|
||||
ss << JSON_URL << "auth/";
|
||||
ss << "?email=" << ARCH->internet().urlEncode(email);
|
||||
ss << "&password=" << password;
|
||||
|
||||
std::cout << ARCH->internet().get(ss.str()) << std::endl;
|
||||
}
|
||||
else {
|
||||
throw XBarrier("Invalid credentials.");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ToolApp::notifyUpdate()
|
||||
{
|
||||
String data;
|
||||
std::cin >> data;
|
||||
|
||||
std::vector<String> parts = barrier::string::splitString(data, ':');
|
||||
size_t count = parts.size();
|
||||
|
||||
if (count == 3) {
|
||||
std::stringstream ss;
|
||||
ss << JSON_URL << "notify/update";
|
||||
ss << "?from=" << parts[0];
|
||||
ss << "&to=" << parts[1];
|
||||
|
||||
std::cout << ARCH->internet().get(ss.str()) << std::endl;
|
||||
}
|
||||
else {
|
||||
throw XBarrier("Invalid update data.");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ToolApp::notifyActivation()
|
||||
{
|
||||
String info;
|
||||
std::cin >> info;
|
||||
|
||||
std::vector<String> parts = barrier::string::splitString(info, ':');
|
||||
size_t count = parts.size();
|
||||
|
||||
if (count == 3 || count == 4) {
|
||||
String action = parts[0];
|
||||
String identity = parts[1];
|
||||
String macHash = parts[2];
|
||||
String os;
|
||||
|
||||
if (count == 4) {
|
||||
os = parts[3];
|
||||
}
|
||||
else {
|
||||
os = ARCH->getOSName();
|
||||
}
|
||||
|
||||
std::stringstream ss;
|
||||
ss << JSON_URL << "notify/";
|
||||
ss << "?action=" << action;
|
||||
ss << "&identity=" << ARCH->internet().urlEncode(identity);
|
||||
ss << "&mac=" << ARCH->internet().urlEncode(macHash);
|
||||
ss << "&os=" << ARCH->internet().urlEncode(ARCH->getOSName());
|
||||
ss << "&arch=" << ARCH->internet().urlEncode(ARCH->getPlatformName());
|
||||
|
||||
try {
|
||||
std::cout << ARCH->internet().get(ss.str()) << std::endl;
|
||||
}
|
||||
catch (std::exception& e) {
|
||||
LOG((CLOG_NOTE "An error occurred during notification: %s\n", e.what()));
|
||||
}
|
||||
catch (...) {
|
||||
LOG((CLOG_NOTE "An unknown error occurred during notification.\n"));
|
||||
}
|
||||
}
|
||||
else {
|
||||
LOG((CLOG_NOTE "notification failed"));
|
||||
}
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2014-2016 Symless Ltd.
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "barrier/App.h"
|
||||
#include "barrier/ToolArgs.h"
|
||||
#include "common/basic_types.h"
|
||||
|
||||
class ToolApp : public MinimalApp
|
||||
{
|
||||
public:
|
||||
UInt32 run(int argc, char** argv);
|
||||
void help();
|
||||
|
||||
private:
|
||||
void loginAuth();
|
||||
void notifyActivation();
|
||||
void notifyUpdate();
|
||||
|
||||
private:
|
||||
ToolArgs m_args;
|
||||
};
|
@ -1,29 +0,0 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2014-2016 Symless Ltd.
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "barrier/ToolArgs.h"
|
||||
|
||||
ToolArgs::ToolArgs() :
|
||||
m_printActiveDesktopName(false),
|
||||
m_loginAuthenticate(false),
|
||||
m_getInstalledDir(false),
|
||||
m_getProfileDir(false),
|
||||
m_getArch(false),
|
||||
m_notifyActivation(false),
|
||||
m_notifyUpdate(false)
|
||||
{
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2014-2016 Symless Ltd.
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "base/String.h"
|
||||
|
||||
class ToolArgs {
|
||||
public:
|
||||
ToolArgs();
|
||||
|
||||
public:
|
||||
bool m_printActiveDesktopName;
|
||||
bool m_loginAuthenticate;
|
||||
bool m_getInstalledDir;
|
||||
bool m_getProfileDir;
|
||||
bool m_getArch;
|
||||
bool m_notifyActivation;
|
||||
bool m_notifyUpdate;
|
||||
};
|
@ -33,6 +33,7 @@
|
||||
#include "base/EventQueue.h"
|
||||
#include "base/log_outputters.h"
|
||||
#include "base/Log.h"
|
||||
#include "common/DataDirectories.h"
|
||||
|
||||
#include "arch/win32/ArchMiscWindows.h"
|
||||
#include "arch/win32/XArchWindows.h"
|
||||
@ -41,6 +42,7 @@
|
||||
#include "platform/MSWindowsDebugOutputter.h"
|
||||
#include "platform/MSWindowsWatchdog.h"
|
||||
#include "platform/MSWindowsEventQueueBuffer.h"
|
||||
#include "platform/MSWindowsUtil.h"
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <Windows.h>
|
||||
@ -130,8 +132,10 @@ DaemonApp::run(int argc, char** argv)
|
||||
}
|
||||
|
||||
if (foreground) {
|
||||
// run process in foreground instead of daemonizing.
|
||||
// useful for debugging.
|
||||
// add a console to catch Ctrl+C and run process in foreground
|
||||
// instead of daemonizing. useful for debugging.
|
||||
if (IsDebuggerPresent())
|
||||
AllocConsole();
|
||||
mainLoop(false);
|
||||
}
|
||||
else {
|
||||
@ -239,14 +243,10 @@ DaemonApp::foregroundError(const char* message)
|
||||
std::string
|
||||
DaemonApp::logFilename()
|
||||
{
|
||||
string logFilename;
|
||||
logFilename = ARCH->setting("LogFilename");
|
||||
if (logFilename.empty()) {
|
||||
logFilename = ARCH->getLogDirectory();
|
||||
logFilename.append("/");
|
||||
logFilename.append(LOG_FILENAME);
|
||||
}
|
||||
|
||||
string logFilename = ARCH->setting("LogFilename");
|
||||
if (logFilename.empty())
|
||||
logFilename = DataDirectories::global() + "\\" + LOG_FILENAME;
|
||||
MSWindowsUtil::createDirectory(logFilename, true);
|
||||
return logFilename;
|
||||
}
|
||||
|
||||
|
@ -17,8 +17,24 @@
|
||||
file(GLOB headers "*.h")
|
||||
file(GLOB sources "*.cpp")
|
||||
|
||||
if (WIN32)
|
||||
file(GLOB arch_headers "win32/*.h")
|
||||
file(GLOB arch_sources "win32/*.cpp")
|
||||
elseif (UNIX)
|
||||
file(GLOB arch_headers "unix/*.h")
|
||||
file(GLOB arch_sources "unix/*.cpp")
|
||||
endif()
|
||||
|
||||
list(APPEND headers ${arch_headers})
|
||||
list(APPEND sources ${arch_sources})
|
||||
|
||||
if (BARRIER_ADD_HEADERS)
|
||||
list(APPEND sources ${headers})
|
||||
endif()
|
||||
|
||||
add_library(common STATIC ${sources})
|
||||
|
||||
if (HAVE_GETPWUID_R)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_GETPWUID_R=1")
|
||||
endif()
|
||||
|
||||
|
41
src/lib/common/DataDirectories.h
Normal file
41
src/lib/common/DataDirectories.h
Normal file
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2018 Debauchee Open Source Group
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
class DataDirectories
|
||||
{
|
||||
public:
|
||||
static const std::string& profile();
|
||||
static const std::string& profile(const std::string& path);
|
||||
|
||||
static const std::string& global();
|
||||
static const std::string& global(const std::string& path);
|
||||
|
||||
static const std::string& systemconfig();
|
||||
static const std::string& systemconfig(const std::string& path);
|
||||
|
||||
private:
|
||||
// static class
|
||||
DataDirectories() {}
|
||||
|
||||
static std::string _profile;
|
||||
static std::string _global;
|
||||
static std::string _systemconfig;
|
||||
};
|
23
src/lib/common/DataDirectories_static.cpp
Normal file
23
src/lib/common/DataDirectories_static.cpp
Normal file
@ -0,0 +1,23 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2018 Debauchee Open Source Group
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "DataDirectories.h"
|
||||
|
||||
// static member
|
||||
std::string DataDirectories::_profile;
|
||||
std::string DataDirectories::_global;
|
||||
std::string DataDirectories::_systemconfig;
|
75
src/lib/common/PathUtilities.cpp
Normal file
75
src/lib/common/PathUtilities.cpp
Normal file
@ -0,0 +1,75 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2018 Debauchee Open Source Group
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
These functions cover the vast majority of cases for different paths across
|
||||
windows and unixes. They are not, however, fullproof and probably don't cover
|
||||
fringe cases very well. The library below might be used as an alternative if
|
||||
these implementations prove to be insufficient. As the library's readme states
|
||||
it is simply a temporary band-aid until std::filesystem is integrated (C++17
|
||||
has it in std::experimental) and this class should also be treated as such.
|
||||
|
||||
https://github.com/wjakob/filesystem/
|
||||
|
||||
*/
|
||||
|
||||
#include "PathUtilities.h"
|
||||
|
||||
// keep the default platform delimiter as the first in the list
|
||||
#ifdef _WIN32
|
||||
static const char *Delimiters = "\\/";
|
||||
#else
|
||||
static const char *Delimiters = "/";
|
||||
#endif
|
||||
|
||||
static const char DefaultDelimiter = Delimiters[0];
|
||||
|
||||
std::string PathUtilities::basename(const std::string& path)
|
||||
{
|
||||
return path.substr(path.find_last_of(Delimiters) + 1);
|
||||
}
|
||||
|
||||
std::string PathUtilities::concat(const std::string& left, const std::string& right)
|
||||
{
|
||||
// although npos is usually (-1) we can't count on that so handle it explicitly
|
||||
auto leftEnd = left.find_last_not_of(Delimiters);
|
||||
if (leftEnd == std::string::npos)
|
||||
leftEnd = 0;
|
||||
else
|
||||
++leftEnd;
|
||||
auto rightStart = right.find_first_not_of(Delimiters, 0);
|
||||
if (rightStart == std::string::npos) {
|
||||
// both left/right are empty
|
||||
if (left.size() == 0 && right.size() == 0)
|
||||
return "";
|
||||
// right is full of delims, left is okay
|
||||
if (leftEnd > 0)
|
||||
return left.substr(0, leftEnd);
|
||||
// both left/right useless but at least one has delims
|
||||
return std::string(1, DefaultDelimiter);
|
||||
}
|
||||
if (leftEnd == 0) {
|
||||
// right is okay and not prefixed with delims, left is empty
|
||||
if (left.size() == 0 && rightStart == 0)
|
||||
return right.substr(rightStart);
|
||||
// (right is okay and prefixed with delims) OR left is full of delims
|
||||
return DefaultDelimiter + right.substr(rightStart);
|
||||
}
|
||||
// concatenation using both left and right
|
||||
return left.substr(0, leftEnd) + DefaultDelimiter + right.substr(rightStart);
|
||||
}
|
31
src/lib/common/PathUtilities.h
Normal file
31
src/lib/common/PathUtilities.h
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2018 Debauchee Open Source Group
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
class PathUtilities
|
||||
{
|
||||
public:
|
||||
static std::string basename(const std::string& path);
|
||||
static std::string concat(const std::string& left, const std::string& right);
|
||||
|
||||
private:
|
||||
// static class
|
||||
PathUtilities() {}
|
||||
};
|
101
src/lib/common/unix/DataDirectories.cpp
Normal file
101
src/lib/common/unix/DataDirectories.cpp
Normal file
@ -0,0 +1,101 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2018 Debauchee Open Source Group
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "../DataDirectories.h"
|
||||
|
||||
#include <unistd.h> // sysconf
|
||||
#include <sys/types.h> // getpwuid(_r)
|
||||
#include <pwd.h> // getpwuid(_r)
|
||||
|
||||
#ifdef WINAPI_XWINDOWS
|
||||
const std::string ProfileSubdir = "/.barrier";
|
||||
#else // macos
|
||||
const std::string ProfileSubdir = "/Library/Application Support/Barrier";
|
||||
#endif
|
||||
|
||||
static std::string pw_dir(struct passwd* pwentp)
|
||||
{
|
||||
if (pwentp != NULL && pwentp->pw_dir != NULL)
|
||||
return pwentp->pw_dir;
|
||||
return "";
|
||||
}
|
||||
|
||||
#ifdef HAVE_GETPWUID_R
|
||||
|
||||
static std::string unix_home()
|
||||
{
|
||||
long size = -1;
|
||||
#if defined(_SC_GETPW_R_SIZE_MAX)
|
||||
size = sysconf(_SC_GETPW_R_SIZE_MAX);
|
||||
#endif
|
||||
if (size == -1)
|
||||
size = BUFSIZ;
|
||||
|
||||
struct passwd pwent;
|
||||
struct passwd* pwentp;
|
||||
std::string buffer(size, 0);
|
||||
getpwuid_r(getuid(), &pwent, &buffer[0], size, &pwentp);
|
||||
return pw_dir(pwentp);
|
||||
}
|
||||
|
||||
#else // not HAVE_GETPWUID_R
|
||||
|
||||
static std::string unix_home()
|
||||
{
|
||||
return pw_dir(getpwuid(getuid()));
|
||||
}
|
||||
|
||||
#endif // HAVE_GETPWUID_R
|
||||
|
||||
const std::string& DataDirectories::profile()
|
||||
{
|
||||
if (_profile.empty())
|
||||
_profile = unix_home() + ProfileSubdir;
|
||||
return _profile;
|
||||
}
|
||||
const std::string& DataDirectories::profile(const std::string& path)
|
||||
{
|
||||
_profile = path;
|
||||
return _profile;
|
||||
}
|
||||
|
||||
const std::string& DataDirectories::global()
|
||||
{
|
||||
if (_global.empty())
|
||||
// TODO: where on a unix system should public/global shared data go?
|
||||
// as of march 2018 global() is not used for unix
|
||||
_global = "/tmp";
|
||||
return _global;
|
||||
}
|
||||
const std::string& DataDirectories::global(const std::string& path)
|
||||
{
|
||||
_global = path;
|
||||
return _global;
|
||||
}
|
||||
|
||||
const std::string& DataDirectories::systemconfig()
|
||||
{
|
||||
if (_systemconfig.empty())
|
||||
_systemconfig = "/etc";
|
||||
return _systemconfig;
|
||||
}
|
||||
|
||||
const std::string& DataDirectories::systemconfig(const std::string& path)
|
||||
{
|
||||
_systemconfig = path;
|
||||
return _systemconfig;
|
||||
}
|
81
src/lib/common/win32/DataDirectories.cpp
Normal file
81
src/lib/common/win32/DataDirectories.cpp
Normal file
@ -0,0 +1,81 @@
|
||||
/*
|
||||
* barrier -- mouse and keyboard sharing utility
|
||||
* Copyright (C) 2018 Debauchee Open Source Group
|
||||
*
|
||||
* This package is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* found in the file LICENSE that should have accompanied this file.
|
||||
*
|
||||
* This package 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 program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "../DataDirectories.h"
|
||||
|
||||
#include <Shlobj.h>
|
||||
|
||||
std::string unicode_to_mb(const WCHAR* utfStr)
|
||||
{
|
||||
int utfLength = lstrlenW(utfStr);
|
||||
int mbLength = WideCharToMultiByte(CP_UTF8, 0, utfStr, utfLength, NULL, 0, NULL, NULL);
|
||||
std::string mbStr(mbLength, 0);
|
||||
WideCharToMultiByte(CP_UTF8, 0, utfStr, utfLength, &mbStr[0], mbLength, NULL, NULL);
|
||||
return mbStr;
|
||||
}
|
||||
|
||||
std::string known_folder_path(const KNOWNFOLDERID& id)
|
||||
{
|
||||
std::string path;
|
||||
WCHAR* buffer;
|
||||
HRESULT result = SHGetKnownFolderPath(id, 0, NULL, &buffer);
|
||||
if (result == S_OK) {
|
||||
path = unicode_to_mb(buffer);
|
||||
CoTaskMemFree(buffer);
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
const std::string& DataDirectories::profile()
|
||||
{
|
||||
if (_profile.empty())
|
||||
_profile = known_folder_path(FOLDERID_LocalAppData) + "\\Barrier";
|
||||
return _profile;
|
||||
}
|
||||
const std::string& DataDirectories::profile(const std::string& path)
|
||||
{
|
||||
_profile = path;
|
||||
return _profile;
|
||||
}
|
||||
|
||||
const std::string& DataDirectories::global()
|
||||
{
|
||||
if (_global.empty())
|
||||
_global = known_folder_path(FOLDERID_ProgramData) + "\\Barrier";
|
||||
return _global;
|
||||
}
|
||||
const std::string& DataDirectories::global(const std::string& path)
|
||||
{
|
||||
_global = path;
|
||||
return _global;
|
||||
}
|
||||
|
||||
const std::string& DataDirectories::systemconfig()
|
||||
{
|
||||
// systemconfig() is a special case in that it will track the current value
|
||||
// of global() unless and until it is explictly set otherwise
|
||||
// previously it would default to the windows folder which was horrible!
|
||||
if (_systemconfig.empty())
|
||||
return global();
|
||||
return _systemconfig;
|
||||
}
|
||||
|
||||
const std::string& DataDirectories::systemconfig(const std::string& path)
|
||||
{
|
||||
_systemconfig = path;
|
||||
return _systemconfig;
|
||||
}
|
@ -22,6 +22,7 @@
|
||||
#include "net/SocketMultiplexer.h"
|
||||
#include "net/TSocketMultiplexerMethodJob.h"
|
||||
#include "arch/XArch.h"
|
||||
#include "common/DataDirectories.h"
|
||||
|
||||
static const char s_certificateDir[] = { "SSL" };
|
||||
static const char s_certificateFilename[] = { "Barrier.pem" };
|
||||
@ -54,7 +55,7 @@ SecureListenSocket::accept()
|
||||
}
|
||||
|
||||
String certificateFilename = barrier::string::sprintf("%s/%s/%s",
|
||||
ARCH->getProfileDirectory().c_str(),
|
||||
DataDirectories::profile().c_str(),
|
||||
s_certificateDir,
|
||||
s_certificateFilename);
|
||||
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "mt/Lock.h"
|
||||
#include "arch/XArch.h"
|
||||
#include "base/Log.h"
|
||||
#include "common/DataDirectories.h"
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
#include <openssl/err.h>
|
||||
@ -699,7 +700,7 @@ SecureSocket::verifyCertFingerprint()
|
||||
String trustedServersFilename;
|
||||
trustedServersFilename = barrier::string::sprintf(
|
||||
"%s/%s/%s",
|
||||
ARCH->getProfileDirectory().c_str(),
|
||||
DataDirectories::profile().c_str(),
|
||||
kFingerprintDirName,
|
||||
kFingerprintTrustedServersFilename);
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include "platform/ImmuneKeysReader.h"
|
||||
#include "barrier/protocol_types.h"
|
||||
#include "barrier/XScreen.h"
|
||||
#include "common/DataDirectories.h"
|
||||
#include "base/Log.h"
|
||||
|
||||
//
|
||||
@ -52,7 +53,7 @@ static BYTE g_keyState[256] = { 0 };
|
||||
static bool g_fakeServerInput = false;
|
||||
static std::vector<DWORD> g_immuneKeys;
|
||||
|
||||
static const std::string ImmuneKeysPath = ArchFileWindows().getProfileDirectory() + "\\ImmuneKeys.txt";
|
||||
static const std::string ImmuneKeysPath = DataDirectories::profile() + "\\ImmuneKeys.txt";
|
||||
|
||||
static std::vector<DWORD> immune_keys_list()
|
||||
{
|
||||
|
@ -62,3 +62,23 @@ MSWindowsUtil::getErrorString(HINSTANCE hinstance, DWORD error, DWORD id)
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
This is a quick and dirty iterative CreateDirectory() wrapper that does zero
|
||||
error checking. A much better cross-platform option exists in C++17 via
|
||||
std::filesystem. If/when the project is updated to use 17 this function should
|
||||
absolutley be replaced!
|
||||
|
||||
*/
|
||||
|
||||
void
|
||||
MSWindowsUtil::createDirectory(const std::string& path, bool stripLast)
|
||||
{
|
||||
// create parent directories
|
||||
for (auto pos = path.find_first_of('\\'); pos != std::string::npos; pos = path.find_first_of('\\', pos + 1))
|
||||
CreateDirectory(path.substr(0, pos).c_str(), NULL);
|
||||
if (!stripLast)
|
||||
// create innermost directory
|
||||
CreateDirectory(path.c_str(), NULL);
|
||||
}
|
||||
|
@ -37,4 +37,11 @@ public:
|
||||
found return the string for \p id, replacing ${1} with \p error.
|
||||
*/
|
||||
static String getErrorString(HINSTANCE, DWORD error, DWORD id);
|
||||
|
||||
//! Create directory
|
||||
/*!
|
||||
Create directory \p recursively optionally stripping the last component
|
||||
(presumably the filename) if \p is set.
|
||||
*/
|
||||
static void createDirectory(const std::string& path, bool stripLast = false);
|
||||
};
|
||||
|
@ -44,7 +44,20 @@ enum {
|
||||
|
||||
typedef VOID (WINAPI *SendSas)(BOOL asUser);
|
||||
|
||||
const char g_activeDesktop[] = {"activeDesktop:"};
|
||||
std::string activeDesktopName()
|
||||
{
|
||||
const std::size_t BufferLength = 1024;
|
||||
std::string name;
|
||||
HDESK desk = OpenInputDesktop(0, FALSE, GENERIC_READ);
|
||||
if (desk != NULL) {
|
||||
TCHAR buffer[BufferLength];
|
||||
if (GetUserObjectInformation(desk, UOI_NAME, buffer, BufferLength - 1, NULL) == TRUE)
|
||||
name = buffer;
|
||||
CloseDesktop(desk);
|
||||
}
|
||||
LOG((CLOG_DEBUG "found desktop name: %.64s", name.c_str()));
|
||||
return name;
|
||||
}
|
||||
|
||||
MSWindowsWatchdog::MSWindowsWatchdog(
|
||||
bool daemonized,
|
||||
@ -64,22 +77,8 @@ MSWindowsWatchdog::MSWindowsWatchdog(
|
||||
m_processRunning(false),
|
||||
m_fileLogOutputter(NULL),
|
||||
m_autoElevated(false),
|
||||
m_ready(false),
|
||||
m_daemonized(daemonized)
|
||||
{
|
||||
m_mutex = ARCH->newMutex();
|
||||
m_condVar = ARCH->newCondVar();
|
||||
}
|
||||
|
||||
MSWindowsWatchdog::~MSWindowsWatchdog()
|
||||
{
|
||||
if (m_condVar != NULL) {
|
||||
ARCH->closeCondVar(m_condVar);
|
||||
}
|
||||
|
||||
if (m_mutex != NULL) {
|
||||
ARCH->closeMutex(m_mutex);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@ -288,12 +287,9 @@ MSWindowsWatchdog::startProcess()
|
||||
if (!m_daemonized) {
|
||||
createRet = doStartProcessAsSelf(m_command);
|
||||
} else {
|
||||
SECURITY_ATTRIBUTES sa;
|
||||
ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
|
||||
m_autoElevated = activeDesktopName() != "Default";
|
||||
|
||||
getActiveDesktop(&sa);
|
||||
|
||||
ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
|
||||
SECURITY_ATTRIBUTES sa{ 0 };
|
||||
HANDLE userToken = getUserToken(&sa);
|
||||
m_elevateProcess = m_autoElevated ? m_autoElevated : m_elevateProcess;
|
||||
m_autoElevated = false;
|
||||
@ -444,11 +440,7 @@ MSWindowsWatchdog::outputLoop(void*)
|
||||
}
|
||||
else {
|
||||
buffer[bytesRead] = '\0';
|
||||
|
||||
testOutput(buffer);
|
||||
|
||||
m_ipcLogOutputter.write(kINFO, buffer);
|
||||
|
||||
if (m_fileLogOutputter != NULL) {
|
||||
m_fileLogOutputter->write(kINFO, buffer);
|
||||
}
|
||||
@ -549,63 +541,3 @@ MSWindowsWatchdog::shutdownExistingProcesses()
|
||||
CloseHandle(snapshot);
|
||||
m_processRunning = false;
|
||||
}
|
||||
|
||||
void
|
||||
MSWindowsWatchdog::getActiveDesktop(LPSECURITY_ATTRIBUTES security)
|
||||
{
|
||||
String installedDir = ARCH->getInstalledDirectory();
|
||||
if (!installedDir.empty()) {
|
||||
String syntoolCommand;
|
||||
syntoolCommand.append("\"").append(installedDir).append("\\").append("syntool").append("\"");
|
||||
syntoolCommand.append(" --get-active-desktop");
|
||||
|
||||
m_session.updateActiveSession();
|
||||
bool elevateProcess = m_elevateProcess;
|
||||
m_elevateProcess = true;
|
||||
HANDLE userToken = getUserToken(security);
|
||||
m_elevateProcess = elevateProcess;
|
||||
|
||||
BOOL createRet = doStartProcessAsUser(syntoolCommand, userToken, security);
|
||||
|
||||
if (!createRet) {
|
||||
DWORD rc = GetLastError();
|
||||
RevertToSelf();
|
||||
}
|
||||
else {
|
||||
LOG((CLOG_DEBUG "launched syntool to check active desktop"));
|
||||
}
|
||||
|
||||
ARCH->lockMutex(m_mutex);
|
||||
int waitTime = 0;
|
||||
while (!m_ready) {
|
||||
if (waitTime >= MAXIMUM_WAIT_TIME) {
|
||||
break;
|
||||
}
|
||||
|
||||
ARCH->waitCondVar(m_condVar, m_mutex, 1.0);
|
||||
waitTime++;
|
||||
}
|
||||
m_ready = false;
|
||||
ARCH->unlockMutex(m_mutex);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MSWindowsWatchdog::testOutput(String buffer)
|
||||
{
|
||||
// HACK: check standard output seems hacky.
|
||||
size_t i = buffer.find(g_activeDesktop);
|
||||
if (i != String::npos) {
|
||||
size_t s = sizeof(g_activeDesktop);
|
||||
String defaultDesktop("Default");
|
||||
String sub = buffer.substr(i + s - 1, defaultDesktop.size());
|
||||
if (sub != defaultDesktop) {
|
||||
m_autoElevated = true;
|
||||
}
|
||||
|
||||
ARCH->lockMutex(m_mutex);
|
||||
m_ready = true;
|
||||
ARCH->broadcastCondVar(m_condVar);
|
||||
ARCH->unlockMutex(m_mutex);
|
||||
}
|
||||
}
|
||||
|
@ -39,7 +39,6 @@ public:
|
||||
bool autoDetectCommand,
|
||||
IpcServer& ipcServer,
|
||||
IpcLogOutputter& ipcLogOutputter);
|
||||
virtual ~MSWindowsWatchdog();
|
||||
|
||||
void startAsync();
|
||||
std::string getCommand() const;
|
||||
@ -58,9 +57,6 @@ private:
|
||||
void startProcess();
|
||||
BOOL doStartProcessAsUser(String& command, HANDLE userToken, LPSECURITY_ATTRIBUTES sa);
|
||||
BOOL doStartProcessAsSelf(String& command);
|
||||
void sendSas();
|
||||
void getActiveDesktop(LPSECURITY_ATTRIBUTES security);
|
||||
void testOutput(String buffer);
|
||||
|
||||
private:
|
||||
Thread* m_thread;
|
||||
@ -80,9 +76,6 @@ private:
|
||||
bool m_processRunning;
|
||||
FileLogOutputter* m_fileLogOutputter;
|
||||
bool m_autoElevated;
|
||||
ArchMutex m_mutex;
|
||||
ArchCond m_condVar;
|
||||
bool m_ready;
|
||||
bool m_daemonized;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user