mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2024-11-10 01:10:32 +00:00
commit
f995595202
4
.gitignore
vendored
4
.gitignore
vendored
@ -5,6 +5,10 @@ router.keys
|
||||
i2p
|
||||
libi2pd.so
|
||||
netDb
|
||||
/i2pd
|
||||
/libi2pd.a
|
||||
/libi2pdclient.a
|
||||
|
||||
|
||||
# Autotools
|
||||
autom4te.cache
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "FS.h"
|
||||
#include "Log.h"
|
||||
#include "Identity.h"
|
||||
#include "util.h"
|
||||
#include "ClientContext.h"
|
||||
|
||||
namespace i2p
|
||||
@ -292,7 +293,7 @@ namespace client
|
||||
template<typename Section, typename Type>
|
||||
std::string ClientContext::GetI2CPOption (const Section& section, const std::string& name, const Type& value) const
|
||||
{
|
||||
return section.second.get (boost::property_tree::ptree::path_type (name, '/'), std::to_string (value));
|
||||
return section.second.get (boost::property_tree::ptree::path_type (name, '/'), std::to_string (value));
|
||||
}
|
||||
|
||||
template<typename Section>
|
||||
|
34
Daemon.h
34
Daemon.h
@ -1,14 +1,9 @@
|
||||
#ifndef DAEMON_H__
|
||||
#define DAEMON_H__
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
#ifdef _WIN32
|
||||
#define Daemon i2p::util::DaemonWin32::Instance()
|
||||
#else
|
||||
#define Daemon i2p::util::DaemonLinux::Instance()
|
||||
#endif
|
||||
|
||||
namespace i2p
|
||||
{
|
||||
namespace util
|
||||
@ -36,7 +31,29 @@ namespace i2p
|
||||
Daemon_Singleton_Private &d;
|
||||
};
|
||||
|
||||
#ifdef _WIN32
|
||||
#if defined(QT_GUI_LIB) // check if QT
|
||||
#define Daemon i2p::util::DaemonQT::Instance()
|
||||
class DaemonQTImpl;
|
||||
class DaemonQT: public i2p::util::Daemon_Singleton
|
||||
{
|
||||
public:
|
||||
|
||||
static DaemonQT& Instance()
|
||||
{
|
||||
static DaemonQT instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
bool init(int argc, char* argv[]);
|
||||
void run ();
|
||||
|
||||
private:
|
||||
|
||||
std::shared_ptr<DaemonQTImpl> m_Impl;
|
||||
};
|
||||
|
||||
#elif defined(_WIN32)
|
||||
#define Daemon i2p::util::DaemonWin32::Instance()
|
||||
class DaemonWin32 : public Daemon_Singleton
|
||||
{
|
||||
public:
|
||||
@ -52,7 +69,8 @@ namespace i2p
|
||||
void run ();
|
||||
};
|
||||
#else
|
||||
class DaemonLinux : public Daemon_Singleton
|
||||
#define Daemon i2p::util::DaemonLinux::Instance()
|
||||
class DaemonLinux : public Daemon_Singleton
|
||||
{
|
||||
public:
|
||||
static DaemonLinux& Instance()
|
||||
|
@ -74,7 +74,7 @@ namespace i2p
|
||||
}
|
||||
|
||||
// point std{in,out,err} descriptors to /dev/null
|
||||
stdin = freopen("/dev/null", "r", stdin);
|
||||
stdin = freopen("/dev/null", "r", stdin);
|
||||
stdout = freopen("/dev/null", "w", stdout);
|
||||
stderr = freopen("/dev/null", "w", stderr);
|
||||
}
|
||||
|
3
FS.cpp
3
FS.cpp
@ -54,6 +54,9 @@ namespace fs {
|
||||
dataDir = (home != NULL && strlen(home) > 0) ? home : "";
|
||||
dataDir += "/Library/Application Support/" + appName;
|
||||
return;
|
||||
#elif defined(ANDROID)
|
||||
dataDir = "/sdcard/" + appName; // TODO: might not work for some devices
|
||||
return;
|
||||
#else /* other unix */
|
||||
char *home = getenv("HOME");
|
||||
if (isService) {
|
||||
|
3
HTTP.cpp
3
HTTP.cpp
@ -6,6 +6,7 @@
|
||||
* See full license text in LICENSE file at top of project tree
|
||||
*/
|
||||
|
||||
#include "util.h"
|
||||
#include "HTTP.h"
|
||||
#include <algorithm>
|
||||
#include <ctime>
|
||||
@ -338,7 +339,7 @@ namespace http {
|
||||
if (status == "OK" && code != 200)
|
||||
status = HTTPCodeToStatus(code); // update
|
||||
if (body.length() > 0 && headers.count("Content-Length") == 0)
|
||||
add_header("Content-Length", std::to_string(body.length()).c_str());
|
||||
add_header("Content-Length", std::to_string(body.length()).c_str());
|
||||
/* build response */
|
||||
std::stringstream ss;
|
||||
ss << version << " " << code << " " << status << CRLF;
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "ClientContext.h"
|
||||
#include "HTTPServer.h"
|
||||
#include "Daemon.h"
|
||||
#include "util.h"
|
||||
|
||||
// For image and info
|
||||
#include "version.h"
|
||||
@ -230,8 +231,8 @@ namespace http {
|
||||
clientTunnelCount += i2p::tunnel::tunnels.CountInboundTunnels();
|
||||
size_t transitTunnelCount = i2p::tunnel::tunnels.CountTransitTunnels();
|
||||
|
||||
s << "<b>Client Tunnels:</b> " << std::to_string(clientTunnelCount) << " ";
|
||||
s << "<b>Transit Tunnels:</b> " << std::to_string(transitTunnelCount) << "<br>\r\n";
|
||||
s << "<b>Client Tunnels:</b> " << std::to_string(clientTunnelCount) << " ";
|
||||
s << "<b>Transit Tunnels:</b> " << std::to_string(transitTunnelCount) << "<br>\r\n";
|
||||
}
|
||||
|
||||
void ShowJumpServices (std::stringstream& s, const std::string& address)
|
||||
@ -364,7 +365,7 @@ namespace http {
|
||||
s << " <a href=\"/?cmd=" << HTTP_COMMAND_STOP_ACCEPTING_TUNNELS << "\">Stop accepting tunnels</a><br>\r\n";
|
||||
else
|
||||
s << " <a href=\"/?cmd=" << HTTP_COMMAND_START_ACCEPTING_TUNNELS << "\">Start accepting tunnels</a><br>\r\n";
|
||||
#ifndef WIN32
|
||||
#if (!defined(WIN32) && !defined(QT_GUI_LIB))
|
||||
if (Daemon.gracefullShutdownInterval) {
|
||||
s << " <a href=\"/?cmd=" << HTTP_COMMAND_SHUTDOWN_CANCEL << "\">Cancel gracefull shutdown (";
|
||||
s << Daemon.gracefullShutdownInterval;
|
||||
@ -611,7 +612,7 @@ namespace http {
|
||||
HandleCommand (req, res, s);
|
||||
} else {
|
||||
ShowStatus (s);
|
||||
res.add_header("Refresh", "5");
|
||||
//res.add_header("Refresh", "5");
|
||||
}
|
||||
ShowPageTail (s);
|
||||
|
||||
@ -677,12 +678,12 @@ namespace http {
|
||||
i2p::context.SetAcceptsTunnels (false);
|
||||
else if (cmd == HTTP_COMMAND_SHUTDOWN_START) {
|
||||
i2p::context.SetAcceptsTunnels (false);
|
||||
#ifndef WIN32
|
||||
#if (!defined(WIN32) && !defined(QT_GUI_LIB))
|
||||
Daemon.gracefullShutdownInterval = 10*60;
|
||||
#endif
|
||||
} else if (cmd == HTTP_COMMAND_SHUTDOWN_CANCEL) {
|
||||
i2p::context.SetAcceptsTunnels (true);
|
||||
#ifndef WIN32
|
||||
#if (!defined(WIN32) && !defined(QT_GUI_LIB))
|
||||
Daemon.gracefullShutdownInterval = 0;
|
||||
#endif
|
||||
} else if (cmd == HTTP_COMMAND_SHUTDOWN_NOW) {
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "Timestamp.h"
|
||||
#include "Transports.h"
|
||||
#include "version.h"
|
||||
#include "util.h"
|
||||
#include "I2PControl.h"
|
||||
|
||||
namespace i2p
|
||||
@ -315,7 +316,7 @@ namespace client
|
||||
}
|
||||
InsertParam (results, "API", api);
|
||||
results << ",";
|
||||
std::string token = std::to_string(i2p::util::GetSecondsSinceEpoch ());
|
||||
std::string token = std::to_string(i2p::util::GetSecondsSinceEpoch ());
|
||||
m_Tokens.insert (token);
|
||||
InsertParam (results, "Token", token);
|
||||
}
|
||||
|
62
README.md
62
README.md
@ -1,13 +1,43 @@
|
||||
i2pd
|
||||
====
|
||||
|
||||
Independent C++ implementation of I2P router
|
||||
i2pd is a full-featured C++ implementation of
|
||||
[I2P](https://geti2p.net/en/about/intro) client.
|
||||
|
||||
License
|
||||
-------
|
||||
I2P (Invisible Internet Project) is anonymous network which works on top of
|
||||
public Internet. Privacy and anonymity are achieved by strong encryption and
|
||||
bouncing your traffic through thousands of I2P nodes all around the world.
|
||||
|
||||
This project is licensed under the BSD 3-clause license, which can be found in the file
|
||||
LICENSE in the root of the project source code.
|
||||
We are building network which helps people to communicate and share information
|
||||
without restrictions.
|
||||
|
||||
* [Website](http://i2pd.website)
|
||||
* [Documentation](https://i2pd.readthedocs.io/en/latest/)
|
||||
* [Wiki](https://github.com/PurpleI2P/i2pd/wiki)
|
||||
* [Tickets/Issues](https://github.com/PurpleI2P/i2pd/issues)
|
||||
* [Twitter](https://twitter.com/i2porignal)
|
||||
|
||||
Installing
|
||||
----------
|
||||
|
||||
The easiest way to install i2pd is by using
|
||||
[precompiled binaries](https://github.com/PurpleI2P/i2pd/releases/latest).
|
||||
See [documentation](https://i2pd.readthedocs.io/en/latest/) for how to build
|
||||
i2pd from source on your OS.
|
||||
|
||||
**Supported systems:**
|
||||
|
||||
* Linux x86/x64 - [![Build Status](https://travis-ci.org/PurpleI2P/i2pd.svg?branch=openssl)](https://travis-ci.org/PurpleI2P/i2pd)
|
||||
* Windows - [![Build status](https://ci.appveyor.com/api/projects/status/1908qe4p48ff1x23?svg=true)](https://ci.appveyor.com/project/PurpleI2P/i2pd)
|
||||
* Mac OS X
|
||||
* FreeBSD
|
||||
* Android *(coming soon)*
|
||||
|
||||
Using i2pd
|
||||
----------
|
||||
|
||||
See [documentation](https://i2pd.readthedocs.io/en/latest/) and
|
||||
[example config file](https://github.com/PurpleI2P/i2pd/blob/openssl/docs/i2pd.conf).
|
||||
|
||||
Donations
|
||||
---------
|
||||
@ -17,22 +47,8 @@ LTC: LKQirrYrDeTuAPnpYq5y7LVKtywfkkHi59
|
||||
ANC: AQJYweYYUqM1nVfLqfoSMpUMfzxvS4Xd7z
|
||||
DOGE: DNXLQKziRPAsD9H3DFNjk4fLQrdaSX893Y
|
||||
|
||||
Documentation:
|
||||
--------------
|
||||
http://i2pd.readthedocs.org
|
||||
License
|
||||
-------
|
||||
|
||||
Supported OS
|
||||
------------
|
||||
|
||||
* Linux x86/x64 - [![Build Status](https://travis-ci.org/PurpleI2P/i2pd.svg?branch=openssl)](https://travis-ci.org/PurpleI2P/i2pd)
|
||||
* Windows - [![Build status](https://ci.appveyor.com/api/projects/status/1908qe4p48ff1x23?svg=true)](https://ci.appveyor.com/project/PurpleI2P/i2pd)
|
||||
* Mac OS X
|
||||
* FreeBSD
|
||||
|
||||
More documentation
|
||||
------------------
|
||||
|
||||
* [Building from source / unix](docs/build_notes_unix.md)
|
||||
* [Building from source / windows](docs/build_notes_windows.md)
|
||||
* [Configuring your i2pd](docs/configuration.md)
|
||||
* [Github wiki](https://github.com/PurpleI2P/i2pd/wiki/)
|
||||
This project is licensed under the BSD 3-clause license, which can be found in the file
|
||||
LICENSE in the root of the project source code.
|
||||
|
@ -16,7 +16,6 @@
|
||||
#include "NetDb.h"
|
||||
#include "util.h"
|
||||
|
||||
|
||||
namespace i2p
|
||||
{
|
||||
namespace data
|
||||
@ -373,7 +372,7 @@ namespace data
|
||||
boost::asio::io_service service;
|
||||
boost::system::error_code ecode;
|
||||
auto it = boost::asio::ip::tcp::resolver(service).resolve (
|
||||
boost::asio::ip::tcp::resolver::query (u.host_, std::to_string (u.port_)), ecode);
|
||||
boost::asio::ip::tcp::resolver::query (u.host_, std::to_string (u.port_)), ecode);
|
||||
if (!ecode)
|
||||
{
|
||||
boost::asio::ssl::context ctx(service, boost::asio::ssl::context::sslv23);
|
||||
|
@ -56,7 +56,7 @@ namespace i2p
|
||||
routerInfo.AddNTCPAddress (host.c_str(), port);
|
||||
routerInfo.SetCaps (i2p::data::RouterInfo::eReachable |
|
||||
i2p::data::RouterInfo::eSSUTesting | i2p::data::RouterInfo::eSSUIntroducer); // LR, BC
|
||||
routerInfo.SetProperty ("netId", std::to_string (I2PD_NET_ID));
|
||||
routerInfo.SetProperty ("netId", std::to_string (I2PD_NET_ID));
|
||||
routerInfo.SetProperty ("router.version", I2P_VERSION);
|
||||
routerInfo.CreateBuffer (m_Keys);
|
||||
m_RouterInfo.SetRouterIdentity (GetIdentity ());
|
||||
|
10
build/.gitignore
vendored
Normal file
10
build/.gitignore
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
# Various generated files
|
||||
/CMakeFiles/
|
||||
/i2pd
|
||||
/libi2pd.a
|
||||
/libi2pdclient.a
|
||||
/cmake_install.cmake
|
||||
/CMakeCache.txt
|
||||
/CPackConfig.cmake
|
||||
/CPackSourceConfig.cmake
|
||||
/install_manifest.txt
|
@ -1,20 +1,27 @@
|
||||
i2pd
|
||||
====
|
||||
|
||||
`Website <http://i2pd.website>`_ |
|
||||
`Github <https://github.com/PurpleI2P/i2pd>`_ |
|
||||
`Issues <https://github.com/PurpleI2P/i2pd/issues>`_
|
||||
i2pd is a full-featured C++ implementation of
|
||||
`I2P <https://geti2p.net/en/about/intro>`_ client.
|
||||
|
||||
i2pd is C++ implementation of `I2P <https://geti2p.net/en/about/intro>`_.
|
||||
* `Website <http://i2pd.website>`_
|
||||
* `GitHub <https://github.com/PurpleI2P/i2pd>`_
|
||||
* `Wiki <https://github.com/PurpleI2P/i2pd/wiki>`_
|
||||
* `Tickets/Issues <https://github.com/PurpleI2P/i2pd/issues>`_
|
||||
* `Twitter <https://twitter.com/i2porignal>`_
|
||||
|
||||
Supports:
|
||||
---------
|
||||
|
||||
* Complete I2P router functionality
|
||||
* Floodfill
|
||||
* HTTP and SOCKS proxy
|
||||
* I2P client and server tunnels
|
||||
* SAM and BOB interfaces
|
||||
Installing
|
||||
----------
|
||||
|
||||
The easiest way to install i2pd is by using
|
||||
`precompiled binaries <https://github.com/PurpleI2P/i2pd/releases/latest>`_.
|
||||
See documentation for how to build i2pd from source on your OS.
|
||||
|
||||
Using i2pd
|
||||
----------
|
||||
|
||||
See documentation and
|
||||
`example config file <https://github.com/PurpleI2P/i2pd/blob/openssl/docs/i2pd.conf>`_.
|
||||
|
||||
Contents:
|
||||
---------
|
||||
@ -28,3 +35,4 @@ Contents:
|
||||
configuration
|
||||
family
|
||||
|
||||
|
||||
|
2
qt/.gitignore
vendored
Normal file
2
qt/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
/build-i2pd_qt-Android_armeabi_v7a_GCC_4_9_Qt_5_6_0-Debug/
|
||||
/build-i2pd_qt-Desktop_Qt_5_6_0_GCC_64bit-Debug/
|
64
qt/i2pd_qt/DaemonQT.cpp
Normal file
64
qt/i2pd_qt/DaemonQT.cpp
Normal file
@ -0,0 +1,64 @@
|
||||
#include <memory>
|
||||
#include "mainwindow.h"
|
||||
#include <QApplication>
|
||||
#include <stdlib.h>
|
||||
#include "../../Daemon.h"
|
||||
|
||||
namespace i2p
|
||||
{
|
||||
namespace util
|
||||
{
|
||||
class DaemonQTImpl: public std::enable_shared_from_this<DaemonQTImpl>
|
||||
{
|
||||
public:
|
||||
|
||||
DaemonQTImpl (int argc, char* argv[]):
|
||||
m_App (argc, argv)
|
||||
{
|
||||
}
|
||||
|
||||
void Run ()
|
||||
{
|
||||
MainWindow w;
|
||||
w.show ();
|
||||
m_App.exec();
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
void StartDaemon ()
|
||||
{
|
||||
Daemon.start ();
|
||||
}
|
||||
|
||||
void StopDaemon ()
|
||||
{
|
||||
Daemon.stop ();
|
||||
}
|
||||
|
||||
bool IsRunning () const
|
||||
{
|
||||
return Daemon.running;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
QApplication m_App;
|
||||
};
|
||||
|
||||
bool DaemonQT::init(int argc, char* argv[])
|
||||
{
|
||||
m_Impl = std::make_shared<DaemonQTImpl> (argc, argv);
|
||||
return Daemon_Singleton::init(argc, argv);
|
||||
}
|
||||
|
||||
void DaemonQT::run ()
|
||||
{
|
||||
if (m_Impl)
|
||||
{
|
||||
m_Impl->Run ();
|
||||
m_Impl = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
60
qt/i2pd_qt/android/AndroidManifest.xml
Normal file
60
qt/i2pd_qt/android/AndroidManifest.xml
Normal file
@ -0,0 +1,60 @@
|
||||
<?xml version="1.0"?>
|
||||
<manifest package="org.purplei2p.i2pd" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="2.8.0" android:versionCode="1" android:installLocation="auto">
|
||||
<application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="-- %%INSERT_APP_NAME%% --">
|
||||
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="-- %%INSERT_APP_NAME%% --" android:screenOrientation="unspecified" android:launchMode="singleTop">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
<meta-data android:name="android.app.lib_name" android:value="-- %%INSERT_APP_LIB_NAME%% --"/>
|
||||
<meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
|
||||
<meta-data android:name="android.app.repository" android:value="default"/>
|
||||
<meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
|
||||
<meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
|
||||
<!-- Deploy Qt libs as part of package -->
|
||||
<meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
|
||||
<meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
|
||||
<meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
|
||||
<!-- Run with local libs -->
|
||||
<meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
|
||||
<meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
|
||||
<meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --"/>
|
||||
<meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
|
||||
<meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
|
||||
<!-- Messages maps -->
|
||||
<meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
|
||||
<meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
|
||||
<meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
|
||||
<!-- Messages maps -->
|
||||
|
||||
<!-- Splash screen -->
|
||||
<!--
|
||||
<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/>
|
||||
-->
|
||||
<!-- Splash screen -->
|
||||
|
||||
<!-- Background running -->
|
||||
<!-- Warning: changing this value to true may cause unexpected crashes if the
|
||||
application still try to draw after
|
||||
"applicationStateChanged(Qt::ApplicationSuspended)"
|
||||
signal is sent! -->
|
||||
<meta-data android:name="android.app.background_running" android:value="false"/>
|
||||
<!-- Background running -->
|
||||
|
||||
<!-- auto screen scale factor -->
|
||||
<meta-data android:name="android.app.auto_screen_scale_factor" android:value="false"/>
|
||||
<!-- auto screen scale factor -->
|
||||
</activity>
|
||||
</application>
|
||||
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19"/>
|
||||
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
|
||||
|
||||
<!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
|
||||
Remove the comment if you do not require these default permissions. -->
|
||||
<!-- %%INSERT_PERMISSIONS -->
|
||||
|
||||
<!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.
|
||||
Remove the comment if you do not require these default features. -->
|
||||
<!-- %%INSERT_FEATURES -->
|
||||
|
||||
</manifest>
|
59
qt/i2pd_qt/docs/patch_openssl_so_libs.html
Normal file
59
qt/i2pd_qt/docs/patch_openssl_so_libs.html
Normal file
@ -0,0 +1,59 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="ru" class=" ya-page_js_yes"><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
|
||||
<h1 id="blog_title" style="font-size:14pt; font-weight:normal; margin:0px">
|
||||
OpenSSL под Android в Qt
|
||||
|
||||
</h1> <div class="smallfont shade"> <span class="shade">Запись от <a href="http://www.cyberforum.ru/blogs/748276/">Wyn</a> размещена 18.01.2016 в 18:22</span> </div> <script type="text/javascript" src="./patch_openssl_so_libs_files/blog_ajax_tag.js"></script> <div class="smallfont" id="blogtagcontainer_4086"> <span class="shade">Метки</span> <span id="blogtaglist_4086"><a href="http://www.cyberforum.ru/blog.php?tag=android&u=748276">android</a>, <a href="http://www.cyberforum.ru/blog.php?tag=openssl&u=748276">openssl</a>, <a href="http://www.cyberforum.ru/blog.php?tag=qt&u=748276">qt</a></span> </div> <div style="clear:both; margin-top:4px"></div> <hr size="1" style="color:#AAAAAA; background-color:#AAAAAA; margin-bottom:10px"> <div id="blog_message" style="margin-bottom:10px"><!-- google_ad_section_start --><!-- google_ad_section_start -->Мини-руководство по тому, как быстро скомпилировать OpenSSL для Android и связать его с проектом Qt.<br>
|
||||
Для Linux.<br> <br>
|
||||
Вначале действия полностью идентичны <a rel="nofollow" href="https://wiki.openssl.org/index.php/Android" target="_blank" title="https://wiki.openssl.org/index.php/Android">"расово-верному" руководству по компилянию OpenSSL для Android</a>:<br>
|
||||
Качаем исходники openssl нужной версии с их сайта, качаем setenv-android.sh(все ссылки на закачку выше по ссылке).<br>
|
||||
Ложим их в одну папку. Запускаем консоль, переходим в ней в эту самую папку.<br>
|
||||
Далее:<br> <div style="margin: 5px 10px 5px 30px"><table class="bash"><thead><tr><td colspan="2" class="head">Bash<a href="http://www.cyberforum.ru/#" style="float: right; color: rgb(96, 96, 96); font-weight: normal;">Выделить код</a></td></tr></thead><tbody><tr class="li1"><td><div id="52254522" style="overflow: auto; width: 805px; height: 73px"><table><tbody><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
|
||||
2
|
||||
3
|
||||
</pre></td><td class="de1"><pre class="de1">$ <span class="kw2">rm</span> <span class="re5">-rf</span> openssl-1.0.1g<span class="sy0">/</span> <span class="co0"># удаляем исходники(вместо версии 1.0.1g - подставляем свою), если они уже были распакованы</span>
|
||||
$ <span class="kw2">tar</span> xzf openssl-1.0.1g.tar.gz <span class="co0"># распаковываем исходники в подпапку</span>
|
||||
$ <span class="kw2">chmod</span> a+x setenv-android.sh <span class="co0"># разрешаем setenv-android.sh исполняться</span></pre></td></tr></tbody></table></div></td></tr></tbody></table></div>Редактируем setenv-android.sh, настраивая там _ANDROID_EABI, _ANDROID_ARCH, _ANDROID_API на нужные значения.<br>
|
||||
Дальше возвращаемся в консоль:<br> <div style="margin: 5px 10px 5px 30px"><table class="bash"><thead><tr><td colspan="2" class="head">Bash<a href="http://www.cyberforum.ru/#" style="float: right; color: rgb(96, 96, 96); font-weight: normal;">Выделить код</a></td></tr></thead><tbody><tr class="li1"><td><div id="701353202" style="overflow: auto; width: 805px; height: 201px"><table><tbody><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
10
|
||||
11
|
||||
</pre></td><td class="de1"><pre class="de1">$ <span class="kw3">export</span> <span class="re2">ANDROID_NDK_ROOT</span>=путь_до_ANDROID_NDK <span class="co0"># указываем путь до Android NDK для setenv-android.sh</span>
|
||||
$ . .<span class="sy0">/</span>setenv-android.sh <span class="co0"># запускаем скрипт, чтобы он нам в окружение проставил необходимые далее переменные</span>
|
||||
$ <span class="kw3">cd</span> openssl-1.0.1g<span class="sy0">/</span>
|
||||
$ <span class="kw2">perl</span> <span class="re5">-pi</span> <span class="re5">-e</span> <span class="st_h">'s/install: all install_docs install_sw/install: install_docs install_sw/g'</span> Makefile.org
|
||||
<span class="co0"># конфигурируем</span>
|
||||
$ .<span class="sy0">/</span>config shared no-ssl2 no-ssl3 no-comp no-hw no-engine <span class="re5">--openssldir</span>=<span class="sy0">/</span>usr<span class="sy0">/</span>local<span class="sy0">/</span>ssl<span class="sy0">/</span><span class="re1">$ANDROID_API</span>
|
||||
<span class="co0"># собираем</span>
|
||||
$ <span class="kw2">make</span> depend
|
||||
$ <span class="kw2">make</span> all
|
||||
<span class="co0"># устанавливаем</span>
|
||||
$ <span class="kw2">sudo</span> <span class="re5">-E</span> <span class="kw2">make</span> <span class="kw2">install</span> <span class="re2">CC</span>=<span class="re1">$ANDROID_TOOLCHAIN</span><span class="sy0">/</span>arm-linux-androideabi-gcc <span class="re2">RANLIB</span>=<span class="re1">$ANDROID_TOOLCHAIN</span><span class="sy0">/</span>arm-linux-androideabi-ranlib</pre></td></tr></tbody></table></div></td></tr></tbody></table></div>И тут начинается интересное. Андроид не принимает versioned shared object (это *.so.x и подобные). Казалось бы 2016 год, космические корабли уже давно бороздят просторы Большого театра, но вот те на. <br> <br>
|
||||
Однако, есть обходной приём - нужно заменить *.so.x.x.x на *_x_x_x.so. Простым переименованием файлов данную проблему здесь, разумеется, не решить. Нужно лезть внутрь и переименовывать soname и внутренние ссылки на другие versioned shared object. В интернете есть много способов по подобному переименованию. Большинство из них обещают райскую жизнь с rpl, забывая упомянуть, что утилита уже давно отпета и закопана на большинстве дистрибутивов. Или хитро-хитро редактируют makefile, что в итоге на место левой руки собирается правая нога. В целом множество путей из разряда "как потратить много времени на полную фигню". <br> <br>
|
||||
В итоге предлагаю решить данную проблему методом топора:<br>
|
||||
Качаем hex-редактор, если ещё нет(в моём случае таковым оказался Okteta). Запускаем его из под рута(kdesu okteta), открываем в нём файлы openssldir/lib/libcrypto.so.1.0.0. Заменяем(ctrl+r) в нём символы ".so.1.0.0" на char "_1_0_0.so". Проделываем тоже самое с libssl.so.1.0.0. Всё, теперь осталось только переименовать сами файлы(в libcrypto_1_0_0.so и libssl_1_0_0.so) и поправить ссылки libssl.so и libcrypto.so, чтобы они вели на них.<br> <br>
|
||||
Чтобы подключить и использовать данную библиотеку в проекте нужно добавить в .pro:<br> <div style="margin: 5px 10px 5px 30px"><table class="bash"><thead><tr><td colspan="2" class="head">Bash<a href="http://www.cyberforum.ru/#" style="float: right; color: rgb(96, 96, 96); font-weight: normal;">Выделить код</a></td></tr></thead><tbody><tr class="li1"><td><div id="304166412" style="overflow: auto; width: 805px; height: 105px"><table><tbody><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
</pre></td><td class="de1"><pre class="de1">android: <span class="br0">{</span>
|
||||
INCLUDEPATH += <span class="sy0">/</span>usr<span class="sy0">/</span>local<span class="sy0">/</span>ssl<span class="sy0">/</span>android-<span class="nu0">21</span><span class="sy0">/</span>include
|
||||
LIBS += -L<span class="sy0">/</span>usr<span class="sy0">/</span>local<span class="sy0">/</span>ssl<span class="sy0">/</span>android-<span class="nu0">21</span><span class="sy0">/</span>lib
|
||||
<span class="br0">}</span>
|
||||
LIBS += <span class="re5">-lcrypto</span></pre></td></tr></tbody></table></div></td></tr></tbody></table></div>А затем в настройках проекта, в Buld/Build Steps/Bulild Android Apk добавить libcrypto_1_0_0.so и libssl_1_0_0.so в список Additional Libraries.<br> <br>
|
||||
На этом всё.
|
||||
|
||||
<br>
|
||||
<p><small>Original: http://www.cyberforum.ru/blogs/748276/blog4086.html</small></p>
|
||||
|
||||
</body></html>
|
192
qt/i2pd_qt/i2pd_qt.pro
Normal file
192
qt/i2pd_qt/i2pd_qt.pro
Normal file
@ -0,0 +1,192 @@
|
||||
#-------------------------------------------------
|
||||
#
|
||||
# Project created by QtCreator 2016-06-14T04:53:04
|
||||
#
|
||||
#-------------------------------------------------
|
||||
|
||||
QT += core gui
|
||||
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
|
||||
TARGET = i2pd_qt
|
||||
TEMPLATE = app
|
||||
QMAKE_CXXFLAGS *= -std=c++11
|
||||
|
||||
# git clone https://github.com/PurpleI2P/Boost-for-Android-Prebuilt.git
|
||||
# git clone https://github.com/PurpleI2P/OpenSSL-for-Android-Prebuilt
|
||||
# git clone https://github.com/PuerpleI2P/android-ifaddrs.git
|
||||
# change to your own
|
||||
BOOST_PATH = /mnt/media/android/Boost-for-Android-Prebuilt
|
||||
OPENSSL_PATH = /mnt/media/android/OpenSSL-for-Android-Prebuilt
|
||||
IFADDRS_PATH = /mnt/media/android/android-ifaddrs
|
||||
|
||||
SOURCES += DaemonQT.cpp\
|
||||
mainwindow.cpp \
|
||||
../../HTTPServer.cpp ../../I2PControl.cpp ../../UPnP.cpp ../../Daemon.cpp ../../Config.cpp \
|
||||
../../AddressBook.cpp \
|
||||
../../api.cpp \
|
||||
../../Base.cpp \
|
||||
../../BOB.cpp \
|
||||
../../ClientContext.cpp \
|
||||
../../Crypto.cpp \
|
||||
../../Datagram.cpp \
|
||||
../../Destination.cpp \
|
||||
../../Family.cpp \
|
||||
../../FS.cpp \
|
||||
../../Garlic.cpp \
|
||||
../../HTTP.cpp \
|
||||
../../HTTPProxy.cpp \
|
||||
../../I2CP.cpp \
|
||||
../../I2NPProtocol.cpp \
|
||||
../../I2PEndian.cpp \
|
||||
../../I2PService.cpp \
|
||||
../../I2PTunnel.cpp \
|
||||
../../Identity.cpp \
|
||||
../../LeaseSet.cpp \
|
||||
../../Log.cpp \
|
||||
../../NetDb.cpp \
|
||||
../../NetDbRequests.cpp \
|
||||
../../NTCPSession.cpp \
|
||||
../../Profiling.cpp \
|
||||
../../Reseed.cpp \
|
||||
../../RouterContext.cpp \
|
||||
../../RouterInfo.cpp \
|
||||
../../SAM.cpp \
|
||||
../../Signature.cpp \
|
||||
../../SOCKS.cpp \
|
||||
../../SSU.cpp \
|
||||
../../SSUData.cpp \
|
||||
../../SSUSession.cpp \
|
||||
../../Streaming.cpp \
|
||||
../../TransitTunnel.cpp \
|
||||
../../Transports.cpp \
|
||||
../../Tunnel.cpp \
|
||||
../../TunnelEndpoint.cpp \
|
||||
../../TunnelGateway.cpp \
|
||||
../../TunnelPool.cpp \
|
||||
../../util.cpp \
|
||||
../../i2pd.cpp \
|
||||
$$IFADDRS_PATH/ifaddrs.c
|
||||
|
||||
HEADERS += mainwindow.h \
|
||||
../../HTTPServer.h ../../I2PControl.h ../../UPnP.h ../../Daemon.h ../../Config.h \
|
||||
../../AddressBook.h \
|
||||
../../api.h \
|
||||
../../Base.h \
|
||||
../../BOB.h \
|
||||
../../ClientContext.h \
|
||||
../../Crypto.h \
|
||||
../../Datagram.h \
|
||||
../../Destination.h \
|
||||
../../Family.h \
|
||||
../../FS.h \
|
||||
../../Garlic.h \
|
||||
../../HTTP.h \
|
||||
../../HTTPProxy.h \
|
||||
../../I2CP.h \
|
||||
../../I2NPProtocol.h \
|
||||
../../I2PEndian.h \
|
||||
../../I2PService.h \
|
||||
../../I2PTunnel.h \
|
||||
../../Identity.h \
|
||||
../../LeaseSet.h \
|
||||
../../LittleBigEndian.h \
|
||||
../../Log.h \
|
||||
../../NetDb.h \
|
||||
../../NetDbRequests.h \
|
||||
../../NTCPSession.h \
|
||||
../../Profiling.h \
|
||||
../../Queue.h \
|
||||
../../Reseed.h \
|
||||
../../RouterContext.h \
|
||||
../../RouterInfo.h \
|
||||
../../SAM.h \
|
||||
../../Signature.h \
|
||||
../../SOCKS.h \
|
||||
../../SSU.h \
|
||||
../../SSUData.h \
|
||||
../../SSUSession.h \
|
||||
../../Streaming.h \
|
||||
../../Timestamp.h \
|
||||
../../TransitTunnel.h \
|
||||
../../Transports.h \
|
||||
../../TransportSession.h \
|
||||
../../Tunnel.h \
|
||||
../../TunnelBase.h \
|
||||
../../TunnelConfig.h \
|
||||
../../TunnelEndpoint.h \
|
||||
../../TunnelGateway.h \
|
||||
../../TunnelPool.h \
|
||||
../../util.h \
|
||||
../../version.h \
|
||||
$$IFADDRS_PATH/ifaddrs.h
|
||||
|
||||
FORMS += mainwindow.ui
|
||||
|
||||
CONFIG += mobility
|
||||
|
||||
MOBILITY =
|
||||
|
||||
LIBS += -lz
|
||||
|
||||
android {
|
||||
message("Using Android settings")
|
||||
DEFINES += ANDROID=1
|
||||
INCLUDEPATH += $$BOOST_PATH/boost_1_53_0/include \
|
||||
$$OPENSSL_PATH/openssl-1.0.2/include \
|
||||
$$IFADDRS_PATH
|
||||
equals(ANDROID_TARGET_ARCH, armeabi-v7a){
|
||||
# http://stackoverflow.com/a/30235934/529442
|
||||
LIBS += -L$$BOOST_PATH/boost_1_53_0/armeabi-v7a/lib \
|
||||
#/home/anon5/git/OpenSSL-for-Android-Prebuilt/openssl-1.0.2/armeabi-v7a/lib/libcrypto.a \
|
||||
#/home/anon5/git/OpenSSL-for-Android-Prebuilt/openssl-1.0.2/armeabi-v7a/lib/libssl.a \
|
||||
-lboost_system-gcc-mt-1_53 \
|
||||
-lboost_date_time-gcc-mt-1_53 \
|
||||
-lboost_filesystem-gcc-mt-1_53 \
|
||||
-lboost_program_options-gcc-mt-1_53 \
|
||||
-L$$OPENSSL_PATH/openssl-1.0.2/armeabi-v7a/lib/ -lcrypto -lssl
|
||||
|
||||
PRE_TARGETDEPS += $$OPENSSL_PATH/openssl-1.0.2/armeabi-v7a/lib/libcrypto.a \
|
||||
$$OPENSSL_PATH/openssl-1.0.2/armeabi-v7a/lib/libssl.a
|
||||
|
||||
DEPENDPATH += $$OPENSSL_PATH/openssl-1.0.2/include
|
||||
|
||||
ANDROID_EXTRA_LIBS += $$OPENSSL_PATH/openssl-1.0.2/armeabi-v7a/lib/libcrypto_1_0_0.so \
|
||||
$$OPENSSL_PATH/openssl-1.0.2/armeabi-v7a/lib/libssl_1_0_0.so
|
||||
}
|
||||
equals(ANDROID_TARGET_ARCH, x86){
|
||||
# http://stackoverflow.com/a/30235934/529442
|
||||
LIBS += -L$$BOOST_PATH/boost_1_53_0/x86/lib \
|
||||
#/home/anon5/git/OpenSSL-for-Android-Prebuilt/openssl-1.0.2/armeabi-v7a/lib/libcrypto.a \
|
||||
#/home/anon5/git/OpenSSL-for-Android-Prebuilt/openssl-1.0.2/armeabi-v7a/lib/libssl.a \
|
||||
-lboost_system-gcc-mt-1_53 \
|
||||
-lboost_date_time-gcc-mt-1_53 \
|
||||
-lboost_filesystem-gcc-mt-1_53 \
|
||||
-lboost_program_options-gcc-mt-1_53 \
|
||||
-L$$OPENSSL_PATH/openssl-1.0.2/x86/lib/ -lcrypto -lssl
|
||||
|
||||
PRE_TARGETDEPS += $$OPENSSL_PATH/openssl-1.0.2/x86/lib/libcrypto.a \
|
||||
$$OPENSSL_PATH/openssl-1.0.2/x86/lib/libssl.a
|
||||
|
||||
DEPENDPATH += $$OPENSSL_PATH/openssl-1.0.2/include
|
||||
|
||||
ANDROID_EXTRA_LIBS += $$OPENSSL_PATH/openssl-1.0.2/x86/lib/libcrypto_1_0_0.so \
|
||||
$$OPENSSL_PATH/openssl-1.0.2/x86/lib/libssl_1_0_0.so
|
||||
}
|
||||
}
|
||||
|
||||
linux:!android {
|
||||
message("Using Linux settings")
|
||||
LIBS += -lcrypto -lssl -lboost_system -lboost_date_time -lboost_filesystem -lboost_program_options -lpthread
|
||||
}
|
||||
|
||||
|
||||
unix:!macx:
|
||||
|
||||
DISTFILES += \
|
||||
android/AndroidManifest.xml
|
||||
|
||||
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
|
||||
|
||||
|
||||
|
14
qt/i2pd_qt/mainwindow.cpp
Normal file
14
qt/i2pd_qt/mainwindow.cpp
Normal file
@ -0,0 +1,14 @@
|
||||
#include "mainwindow.h"
|
||||
#include "ui_mainwindow.h"
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
ui(new Ui::MainWindow)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
delete ui;
|
||||
}
|
22
qt/i2pd_qt/mainwindow.h
Normal file
22
qt/i2pd_qt/mainwindow.h
Normal file
@ -0,0 +1,22 @@
|
||||
#ifndef MAINWINDOW_H
|
||||
#define MAINWINDOW_H
|
||||
|
||||
#include <QMainWindow>
|
||||
|
||||
namespace Ui {
|
||||
class MainWindow;
|
||||
}
|
||||
|
||||
class MainWindow : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MainWindow(QWidget *parent = 0);
|
||||
~MainWindow();
|
||||
|
||||
private:
|
||||
Ui::MainWindow *ui;
|
||||
};
|
||||
|
||||
#endif // MAINWINDOW_H
|
21
qt/i2pd_qt/mainwindow.ui
Normal file
21
qt/i2pd_qt/mainwindow.ui
Normal file
@ -0,0 +1,21 @@
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow" >
|
||||
<property name="geometry" >
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>800</width>
|
||||
<height>480</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle" >
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralWidget" />
|
||||
</widget>
|
||||
<layoutDefault spacing="6" margin="11" />
|
||||
<pixmapfunction></pixmapfunction>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
Loading…
Reference in New Issue
Block a user