#6288 drop items that still had CURL reliance

# Conflicts:
#	src/lib/arch/unix/ArchInternetUnix.cpp
#	src/lib/synergy/ToolApp.cpp
This commit is contained in:
Steve Williams 2018-04-23 08:28:16 +01:00
parent e170bd87a8
commit 87e1912842
7 changed files with 0 additions and 652 deletions

View File

@ -65,7 +65,6 @@
# include "arch/unix/ArchSystemUnix.h"
# include "arch/unix/ArchTaskBarXWindows.h"
# include "arch/unix/ArchTimeUnix.h"
# include "arch/unix/ArchInternetUnix.h"
#endif
/*!
@ -120,11 +119,9 @@ public:
static void setInstance(Arch* s) { s_instance = s; }
ARCH_INTERNET& internet() const { return (ARCH_INTERNET&)m_internet; }
private:
static Arch* s_instance;
ARCH_INTERNET m_internet;
};
//! Convenience object to lock/unlock an arch mutex

View File

@ -1,126 +0,0 @@
/*
* synergy -- 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 "arch/unix/ArchInternetUnix.h"
#include "arch/XArch.h"
#include "common/Version.h"
#include "base/Log.h"
#include <sstream>
#include <curl/curl.h>
class CurlFacade {
public:
CurlFacade();
~CurlFacade();
String get(const String& url);
String urlEncode(const String& url);
private:
CURL* m_curl;
};
//
// ArchInternetUnix
//
String
ArchInternetUnix::get(const String& url)
{
CurlFacade curl;
return curl.get(url);
}
String
ArchInternetUnix::urlEncode(const String& url)
{
CurlFacade curl;
return curl.urlEncode(url);
}
//
// CurlFacade
//
static size_t
curlWriteCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
((std::string*)userp)->append((char*)contents, size * nmemb);
return size * nmemb;
}
CurlFacade::CurlFacade() :
m_curl(NULL)
{
CURLcode init = curl_global_init(CURL_GLOBAL_ALL);
if (init != CURLE_OK) {
throw XArch("CURL global init failed.");
}
m_curl = curl_easy_init();
if (m_curl == NULL) {
throw XArch("CURL easy init failed.");
}
}
CurlFacade::~CurlFacade()
{
if (m_curl != NULL) {
curl_easy_cleanup(m_curl);
}
curl_global_cleanup();
}
String
CurlFacade::get(const String& url)
{
curl_easy_setopt(m_curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, curlWriteCallback);
std::stringstream userAgent;
userAgent << "Synergy ";
userAgent << kVersion;
curl_easy_setopt(m_curl, CURLOPT_USERAGENT, userAgent.str().c_str());
std::string result;
curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &result);
CURLcode code = curl_easy_perform(m_curl);
if (code != CURLE_OK) {
LOG((CLOG_ERR "curl perform error: %s", curl_easy_strerror(code)));
throw XArch("CURL perform failed.");
}
return result;
}
String
CurlFacade::urlEncode(const String& url)
{
char* resultCStr = curl_easy_escape(m_curl, url.c_str(), 0);
if (resultCStr == NULL) {
throw XArch("CURL escape failed.");
}
std::string result(resultCStr);
curl_free(resultCStr);
return result;
}

View File

@ -1,28 +0,0 @@
/*
* synergy -- 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
#define ARCH_INTERNET ArchInternetUnix
#include "base/String.h"
class ArchInternetUnix {
public:
String get(const String& url);
String urlEncode(const String& url);
};

View File

@ -1,224 +0,0 @@
/*
* synergy -- 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 "arch/win32/ArchInternetWindows.h"
#include "arch/win32/XArchWindows.h"
#include "arch/Arch.h"
#include "common/Version.h"
#include <sstream>
#include <Wininet.h>
#include <Shlwapi.h>
struct WinINetUrl {
String m_scheme;
String m_host;
String m_path;
INTERNET_PORT m_port;
DWORD m_flags;
};
class WinINetRequest {
public:
WinINetRequest(const String& url);
~WinINetRequest();
String send();
void openSession();
void connect();
void openRequest();
private:
HINTERNET m_session;
HINTERNET m_connect;
HINTERNET m_request;
WinINetUrl m_url;
bool m_used;
};
//
// ArchInternetWindows
//
String
ArchInternetWindows::get(const String& url)
{
WinINetRequest request(url);
return request.send();
}
String
ArchInternetWindows::urlEncode(const String& url)
{
TCHAR buffer[1024];
DWORD bufferSize = sizeof(buffer);
if (UrlEscape(url.c_str(), buffer, &bufferSize, URL_ESCAPE_UNSAFE) != S_OK) {
throw XArch(new XArchEvalWindows());
}
String result(buffer);
// the win32 url encoding funcitons are pretty useless (to us) and only
// escape "unsafe" chars, but not + or =, so we need to replace these
// manually (and probably many other chars).
synergy::string::findReplaceAll(result, "+", "%2B");
synergy::string::findReplaceAll(result, "=", "%3D");
return result;
}
//
// WinINetRequest
//
static WinINetUrl parseUrl(const String& url);
WinINetRequest::WinINetRequest(const String& url) :
m_session(NULL),
m_connect(NULL),
m_request(NULL),
m_used(false),
m_url(parseUrl(url))
{
}
WinINetRequest::~WinINetRequest()
{
if (m_request != NULL) {
InternetCloseHandle(m_request);
}
if (m_connect != NULL) {
InternetCloseHandle(m_connect);
}
if (m_session != NULL) {
InternetCloseHandle(m_session);
}
}
String
WinINetRequest::send()
{
if (m_used) {
throw XArch("class is one time use.");
}
m_used = true;
openSession();
connect();
openRequest();
String headers("Content-Type: text/html");
if (!HttpSendRequest(m_request, headers.c_str(), (DWORD)headers.length(), NULL, NULL)) {
throw XArch(new XArchEvalWindows());
}
std::stringstream result;
CHAR buffer[1025];
DWORD read = 0;
while (InternetReadFile(m_request, buffer, sizeof(buffer) - 1, &read) && (read != 0)) {
buffer[read] = 0;
result << buffer;
read = 0;
}
return result.str();
}
void
WinINetRequest::openSession()
{
std::stringstream userAgent;
userAgent << "Synergy ";
userAgent << kVersion;
m_session = InternetOpen(
userAgent.str().c_str(),
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
NULL);
if (m_session == NULL) {
throw XArch(new XArchEvalWindows());
}
}
void
WinINetRequest::connect()
{
m_connect = InternetConnect(
m_session,
m_url.m_host.c_str(),
m_url.m_port,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
NULL,
NULL);
if (m_connect == NULL) {
throw XArch(new XArchEvalWindows());
}
}
void
WinINetRequest::openRequest()
{
m_request = HttpOpenRequest(
m_connect,
"GET",
m_url.m_path.c_str(),
HTTP_VERSION,
NULL,
NULL,
m_url.m_flags,
NULL);
if (m_request == NULL) {
throw XArch(new XArchEvalWindows());
}
}
// nb: i tried to use InternetCrackUrl here, but couldn't quite get that to
// work. here's some (less robust) code to split the url into components.
// this works fine with simple urls, but doesn't consider the full url spec.
static WinINetUrl
parseUrl(const String& url)
{
WinINetUrl parsed;
size_t schemeEnd = url.find("://");
size_t hostEnd = url.find('/', schemeEnd + 3);
parsed.m_scheme = url.substr(0, schemeEnd);
parsed.m_host = url.substr(schemeEnd + 3, hostEnd - (schemeEnd + 3));
parsed.m_path = url.substr(hostEnd);
parsed.m_port = INTERNET_DEFAULT_HTTP_PORT;
parsed.m_flags = 0;
if (parsed.m_scheme.find("https") != String::npos) {
parsed.m_port = INTERNET_DEFAULT_HTTPS_PORT;
parsed.m_flags = INTERNET_FLAG_SECURE;
}
return parsed;
}

View File

@ -1,28 +0,0 @@
/*
* synergy -- 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
#define ARCH_INTERNET ArchInternetWindows
#include "base/String.h"
class ArchInternetWindows {
public:
String get(const String& url);
String urlEncode(const String& url);
};

View File

@ -1,206 +0,0 @@
/*
* synergy -- 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 "synergy/ToolApp.h"
#include "synergy/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 = synergy::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 XSynergy("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 = synergy::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 XSynergy("Invalid credentials.");
}
}
void
ToolApp::notifyUpdate()
{
String data;
std::cin >> data;
std::vector<String> parts = synergy::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];
ss << "&serial=" << parts[2];
std::cout << ARCH->internet().get(ss.str()) << std::endl;
}
else {
throw XSynergy("Invalid update data.");
}
}
void
ToolApp::notifyActivation()
{
String info;
std::cin >> info;
std::vector<String> parts = synergy::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"));
}
}

View File

@ -1,37 +0,0 @@
/*
* synergy -- 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 "arch/Arch.h"
#include "test/global/gtest.h"
#define TEST_URL "https://symless.com/tests/?testString"
//#define TEST_URL "http://localhost/synergy/tests/?testString"
TEST(ArchInternetTests, get)
{
ARCH_INTERNET internet;
String result = internet.get(TEST_URL);
ASSERT_EQ("Hello world!", result);
}
TEST(ArchInternetTests, urlEncode)
{
ARCH_INTERNET internet;
String result = internet.urlEncode("hello=+&world");
ASSERT_EQ("hello%3D%2B%26world", result);
}