Feather, a free Monero desktop wallet
Co-Authored-By: tobtoht <thotbot@protonmail.com>
3
.dockerignore
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
*
|
||||||
|
!contrib/Qt5.15_LinuxPatch.json
|
||||||
|
!utils/pubkeys/*
|
160
.drone.yml
Normal file
|
@ -0,0 +1,160 @@
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: linux-release
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: feather:linux
|
||||||
|
volumes:
|
||||||
|
- name: ccache_linux_release
|
||||||
|
path: /root/.ccache
|
||||||
|
- name: files_linux_release
|
||||||
|
path: /files
|
||||||
|
commands:
|
||||||
|
- git config --global url."http://gitea:3000/tor/".insteadOf https://git.torproject.org/
|
||||||
|
- git config --global url."http://gitea:3000/".insteadOf https://github.com/
|
||||||
|
- git submodule update --init --depth 50 contrib/tor
|
||||||
|
- git submodule update --init --depth 50 contrib/torsocks
|
||||||
|
- git submodule update --init --depth 120 monero
|
||||||
|
- git submodule update --init --depth 120 --recursive monero
|
||||||
|
- make -j8 release-static
|
||||||
|
environment:
|
||||||
|
OPENSSL_ROOT_DIR: /usr/local/openssl/
|
||||||
|
CMAKEFLAGS_EXTRA: -DFETCH_DEPS=Off
|
||||||
|
- name: deploy
|
||||||
|
image: feather:linux
|
||||||
|
volumes:
|
||||||
|
- name: ccache_linux_release
|
||||||
|
path: /root/.ccache
|
||||||
|
- name: files_linux_release
|
||||||
|
path: /files
|
||||||
|
commands:
|
||||||
|
- export FN="feather-`git rev-parse --short HEAD`.zip"
|
||||||
|
- export TARGET_DIR="/files/$DRONE_SOURCE_BRANCH"
|
||||||
|
- mkdir -p "$TARGET_DIR"
|
||||||
|
- echo "writing to $TARGET_DIR/$FN"
|
||||||
|
- strip -s build/bin/feather
|
||||||
|
- zip -j "$TARGET_DIR/$FN" build/feather.log build/bin/feather
|
||||||
|
- echo "[*] written to https://build.featherwallet.org/files/linux-release/$DRONE_SOURCE_BRANCH/$FN"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- name: ccache_linux_release
|
||||||
|
host:
|
||||||
|
path: /var/drone/ccache_linux_release/
|
||||||
|
- name: files_linux_release
|
||||||
|
host:
|
||||||
|
path: /mnt/storage1/feather_files/files/linux-release/
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: linux-release-appimage
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: feather:appimage
|
||||||
|
commands:
|
||||||
|
- export FN="feather-`git rev-parse --short HEAD`.zip"
|
||||||
|
- export BRANCH="$DRONE_SOURCE_BRANCH"
|
||||||
|
- bash ./contrib/build-appimage.sh
|
||||||
|
- name: deploy
|
||||||
|
image: feather:appimage
|
||||||
|
volumes:
|
||||||
|
- name: files_linux_appimage
|
||||||
|
path: /files
|
||||||
|
commands:
|
||||||
|
- export FN="feather-`git rev-parse --short HEAD`.AppImage"
|
||||||
|
- export TARGET_DIR="/files/$DRONE_SOURCE_BRANCH"
|
||||||
|
- mkdir -p "$TARGET_DIR"
|
||||||
|
- echo "writing to $TARGET_DIR/$FN"
|
||||||
|
- mv "Feather-1.0-x86_64.AppImage" "$TARGET_DIR/$FN"
|
||||||
|
- echo "[*] written to https://build.featherwallet.org/files/linux-release-appimage/$DRONE_SOURCE_BRANCH/$FN"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- name: files_linux_appimage
|
||||||
|
host:
|
||||||
|
path: /mnt/storage1/feather_files/files/linux-release-appimage/
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: windows-mxe-release
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: feather:win
|
||||||
|
volumes:
|
||||||
|
- name: ccache_win_release
|
||||||
|
path: /root/.ccache
|
||||||
|
- name: files_win_release
|
||||||
|
path: /files
|
||||||
|
commands:
|
||||||
|
- git config --global url."http://gitea:3000/tor/".insteadOf https://git.torproject.org/
|
||||||
|
- git config --global url."http://gitea:3000/".insteadOf https://github.com/
|
||||||
|
- git submodule update --init --depth 50 contrib/tor
|
||||||
|
- git submodule update --init --depth 50 contrib/torsocks
|
||||||
|
- git submodule update --init --depth 120 monero
|
||||||
|
- git submodule update --init --depth 120 --recursive monero
|
||||||
|
- PATH=/mxe/usr/bin/:$PATH make -j8 windows-mxe-release
|
||||||
|
environment:
|
||||||
|
CMAKEFLAGS_EXTRA: -DFETCH_DEPS=Off
|
||||||
|
- name: deploy
|
||||||
|
image: feather:win
|
||||||
|
volumes:
|
||||||
|
- name: ccache_win_release
|
||||||
|
path: /root/.ccache
|
||||||
|
- name: files_win_release
|
||||||
|
path: /files
|
||||||
|
commands:
|
||||||
|
- export FN="feather-`git rev-parse --short HEAD`.zip"
|
||||||
|
- export TARGET_DIR="/files/$DRONE_SOURCE_BRANCH"
|
||||||
|
- mkdir -p "$TARGET_DIR"
|
||||||
|
- echo "writing to $TARGET_DIR/$FN"
|
||||||
|
- zip -j "$TARGET_DIR/$FN" build/feather.log build/bin/feather.exe
|
||||||
|
- echo "[*] written to https://build.featherwallet.org/files/windows-mxe-release/$DRONE_SOURCE_BRANCH/$FN"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- name: ccache_win_release
|
||||||
|
host:
|
||||||
|
path: /var/drone/ccache_win_release/
|
||||||
|
- name: files_win_release
|
||||||
|
host:
|
||||||
|
path: /mnt/storage1/feather_files/files/windows-mxe-release/
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: mac-release
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: feather:mac
|
||||||
|
volumes:
|
||||||
|
- name: files_mac_release
|
||||||
|
path: /files
|
||||||
|
commands:
|
||||||
|
- mkdir -p build
|
||||||
|
- scp -P22 utils/build_macos.sh administrator@steve.jobs.xmr.pm:build_macos.sh
|
||||||
|
- ssh administrator@steve.jobs.xmr.pm "chmod +x build_macos.sh && PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin ~/build_macos.sh $DRONE_COMMIT_SHA"
|
||||||
|
- scp -P22 administrator@steve.jobs.xmr.pm:feather.zip build/feather.zip
|
||||||
|
- name: deploy
|
||||||
|
image: feather:mac
|
||||||
|
volumes:
|
||||||
|
- name: files_mac_release
|
||||||
|
path: /files
|
||||||
|
commands:
|
||||||
|
- export FN="feather-`git rev-parse --short HEAD`.zip"
|
||||||
|
- export TARGET_DIR="/files/$DRONE_SOURCE_BRANCH"
|
||||||
|
- mkdir -p "$TARGET_DIR"
|
||||||
|
- echo "writing to $TARGET_DIR/$FN"
|
||||||
|
- mv build/feather.zip "$TARGET_DIR/$FN"
|
||||||
|
- echo "[*] written to https://build.featherwallet.org/files/mac-release/$DRONE_SOURCE_BRANCH/$FN"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- name: files_mac_release
|
||||||
|
host:
|
||||||
|
path: /mnt/storage1/feather_files/files/mac-release/
|
15
.gitignore
vendored
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
.DS_Store
|
||||||
|
lib/*
|
||||||
|
cmake-build-debug/*
|
||||||
|
.idea
|
||||||
|
*.user
|
||||||
|
*.stash
|
||||||
|
build/*
|
||||||
|
CMakeCache.txt
|
||||||
|
CMakeFiles
|
||||||
|
cmake_install.cmake
|
||||||
|
feather_autogen/
|
||||||
|
feather.cbp
|
||||||
|
src/tor/*
|
||||||
|
!src/tor/.gitkeep
|
||||||
|
src/config-feather.h
|
9
.gitmodules
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[submodule "monero"]
|
||||||
|
path = monero
|
||||||
|
url = https://git.wownero.com/feather/monero.git
|
||||||
|
[submodule "contrib/torsocks"]
|
||||||
|
path = contrib/torsocks
|
||||||
|
url = https://git.torproject.org/torsocks.git
|
||||||
|
[submodule "contrib/tor"]
|
||||||
|
path = contrib/tor
|
||||||
|
url = https://git.torproject.org/tor.git
|
101
BUILDING.md
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
# Buildbot builds
|
||||||
|
|
||||||
|
The docker build bins can be found here: https://build.featherwallet.org/files/
|
||||||
|
|
||||||
|
## Docker static builds
|
||||||
|
|
||||||
|
Static builds via Docker are done in 3 steps:
|
||||||
|
|
||||||
|
1. Cloning this repository (+submodules)
|
||||||
|
2. Creating a base Docker image
|
||||||
|
3. Using the base image to compile a build
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
The docker image for Windows static compiles uses Ubuntu 18.04 and installs [mxe](https://mxe.cc) from [our git](https://git.wownero.com/feather/mxe/src/branch/feather-patch),
|
||||||
|
which comes with: OpenSSL 1.1.1g, Qt 5.15.0 (OpenGL via mesa). For more information, check the Dockerfile: `Dockerfile_windows`.
|
||||||
|
|
||||||
|
#### 1. Clone
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone --recursive https://git.wownero.com/feather/feather.git
|
||||||
|
cd feather
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. Base image
|
||||||
|
|
||||||
|
Warning: Building the MXE base image takes up to a hour, so go watch a movie.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker build -f Dockerfile_windows --tag feather:win --build-arg THREADS=8 .
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: You only need to build the base image once.
|
||||||
|
|
||||||
|
#### 3. Build
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run --rm -it -v /tmp/ccache:/root/.ccache -v /root/feather:/feather -w /feather feather:win /bin/bash -c 'PATH=/mxe/usr/bin/:$PATH make windows-mxe-release -j8'
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace `PATH_TO_FEATHER` with the absolute path to Feather locally.
|
||||||
|
|
||||||
|
The resulting binary can be found in `build/bin/feather.exe`.
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
The docker image for Linux static compiles uses Ubuntu 18.04 and compiles the required libraries statically so that
|
||||||
|
the resulting Feather binary is static. It comes with OpenSSL 1.1.1g, Qt 5.15.0 (OpenGL disabled). For more information,
|
||||||
|
check the Dockerfile: `Dockerfile`.
|
||||||
|
|
||||||
|
#### 1. Clone
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone --recursive https://git.wownero.com/feather/feather.git
|
||||||
|
cd feather
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. Base image
|
||||||
|
|
||||||
|
Warning: Building the base image takes a while, go prepare some dinner.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker build --tag feather:linux --build-arg THREADS=8 .
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: You only need to build the base image once.
|
||||||
|
|
||||||
|
#### 3. Build
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run --env OPENSSL_ROOT_DIR=/usr/local/openssl/ --rm -it -v /tmp/ccache:/root/.ccache -v PATH_TO_FEATHER:/feather -w /feather feather:linux sh -c 'make release-static -j8'
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace `PATH_TO_FEATHER` with the absolute path to Feather locally.
|
||||||
|
|
||||||
|
The resulting binary can be found in `build/bin/feather`.
|
||||||
|
|
||||||
|
## macOS
|
||||||
|
|
||||||
|
For MacOS it's easiest to leverage [brew](https://brew.sh) to install the required dependencies.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
HOMEBREW_OPTFLAGS="-march=core2" HOMEBREW_OPTIMIZATION_LEVEL="O0" \
|
||||||
|
brew install boost zmq openssl libpgm miniupnpc libsodium expat libunwind-headers protobuf libgcrypt qrencode ccache cmake pkgconfig git
|
||||||
|
```
|
||||||
|
|
||||||
|
Clone the repository.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone --recursive https://git.wownero.com/feather/feather.git
|
||||||
|
```
|
||||||
|
|
||||||
|
Get the latest LTS from here: https://www.qt.io/offline-installers and install.
|
||||||
|
|
||||||
|
Build Feather.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
CMAKE_PREFIX_PATH=~/Qt5.15.1/5.15.1/clang_64 make mac-release
|
||||||
|
```
|
||||||
|
|
||||||
|
The resulting Mac OS application can be found `build/bin/feather.app`.
|
349
CMakeLists.txt
Normal file
|
@ -0,0 +1,349 @@
|
||||||
|
cmake_minimum_required(VERSION 3.13)
|
||||||
|
project(feather)
|
||||||
|
|
||||||
|
message(STATUS "Initiating compile using CMake ${CMAKE_VERSION}")
|
||||||
|
|
||||||
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||||
|
set(VERSION_MAJOR "0")
|
||||||
|
set(VERSION_MINOR "1")
|
||||||
|
set(VERSION_REVISION "0")
|
||||||
|
set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}")
|
||||||
|
|
||||||
|
option(FETCH_DEPS "Download dependencies if they are not found" ON)
|
||||||
|
option(XMRTO "Include Xmr.To module" ON)
|
||||||
|
option(BUILD_TOR "Build Tor" OFF)
|
||||||
|
option(STATIC "Link libraries statically, requires static Qt")
|
||||||
|
option(USE_DEVICE_TREZOR "Trezor support compilation" OFF)
|
||||||
|
option(DONATE_BEG "Prompt donation window every once in a while" ON)
|
||||||
|
list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/cmake")
|
||||||
|
include(CheckCCompilerFlag)
|
||||||
|
include(CheckCXXCompilerFlag)
|
||||||
|
include(CheckLinkerFlag)
|
||||||
|
include(FetchContent)
|
||||||
|
include(FindCcache)
|
||||||
|
include(CheckIncludeFile)
|
||||||
|
include(CheckSymbolExists)
|
||||||
|
|
||||||
|
if(DEBUG)
|
||||||
|
set(CMAKE_VERBOSE_MAKEFILE ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(MONERO_HEAD "a1404e92cb439ba0f120e7c4a579ed0b9a0372a4")
|
||||||
|
set(BUILD_GUI_DEPS ON)
|
||||||
|
set(ARCH "x86-64")
|
||||||
|
set(BUILD_64 ON)
|
||||||
|
set(INSTALL_VENDORED_LIBUNBOUND ${STATIC})
|
||||||
|
set(USE_SINGLE_BUILDDIR ON)
|
||||||
|
|
||||||
|
check_include_file(sys/prctl.h HAVE_SYS_PRCTL_H)
|
||||||
|
check_symbol_exists(prctl "sys/prctl.h" HAVE_PRCTL)
|
||||||
|
|
||||||
|
if(STATIC)
|
||||||
|
message(STATUS "Initiating static build, turning on manual submodules")
|
||||||
|
set(MANUAL_SUBMODULES 1)
|
||||||
|
|
||||||
|
# monero-project/unbound:monero has a fix for static builds, however, it's not merged in Monero yet, because
|
||||||
|
# it breaks their buildbot, since that still uses openssl 1.1.0 and we use openssl 1.1.1g. We need to
|
||||||
|
# manually set the unbound submodule the right commit that has the fix.
|
||||||
|
# This only works with -DMANUAL_SUBMODULES=1
|
||||||
|
message(STATUS "applying unbound static build fix contrib/unbound_static.patch")
|
||||||
|
execute_process(COMMAND bash -c "git -C ${CMAKE_SOURCE_DIR}/monero/external/unbound apply ${CMAKE_SOURCE_DIR}/contrib/unbound_static.patch")
|
||||||
|
|
||||||
|
set(Boost_USE_STATIC_LIBS ON)
|
||||||
|
set(Boost_USE_STATIC_RUNTIME ON)
|
||||||
|
add_definitions(-DMONERO_GUI_STATIC)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
function (add_c_flag_if_supported flag var)
|
||||||
|
string(REPLACE "-" "_" supported ${flag}_c)
|
||||||
|
check_c_compiler_flag(${flag} ${supported})
|
||||||
|
if(${${supported}})
|
||||||
|
set(${var} "${${var}} ${flag}" PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function (add_cxx_flag_if_supported flag var)
|
||||||
|
string(REPLACE "-" "_" supported ${flag}_cxx)
|
||||||
|
check_cxx_compiler_flag(${flag} ${supported})
|
||||||
|
if(${${supported}})
|
||||||
|
set(${var} "${${var}} ${flag}" PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function (add_linker_flag_if_supported flag var)
|
||||||
|
string(REPLACE "-" "_" supported ${flag}_ld)
|
||||||
|
string(REPLACE "," "_" supported ${flag}_ld)
|
||||||
|
check_linker_flag(${flag} ${supported})
|
||||||
|
if(${${supported}})
|
||||||
|
set(${var} "${${var}} ${flag}" PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
find_package(Git)
|
||||||
|
if(GIT_FOUND)
|
||||||
|
execute_process(COMMAND git rev-parse "HEAD" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/monero OUTPUT_VARIABLE _MONERO_HEAD OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
if(NOT _MONERO_HEAD STREQUAL MONERO_HEAD)
|
||||||
|
message(FATAL_ERROR "[submodule] Monero HEAD was at ${_MONERO_HEAD} but should be at ${MONERO_HEAD}")
|
||||||
|
else()
|
||||||
|
message(STATUS "[submodule] Monero HEAD @ ${MONERO_HEAD}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_subdirectory(monero)
|
||||||
|
set_property(TARGET wallet_merged PROPERTY FOLDER "monero")
|
||||||
|
get_directory_property(ARCH_WIDTH DIRECTORY "monero" DEFINITION ARCH_WIDTH)
|
||||||
|
get_directory_property(UNBOUND_LIBRARY DIRECTORY "monero" DEFINITION UNBOUND_LIBRARY)
|
||||||
|
|
||||||
|
include(CMakePackageConfigHelpers)
|
||||||
|
include(VersionMonero)
|
||||||
|
include(VersionFeather)
|
||||||
|
|
||||||
|
include_directories(${EASYLOGGING_INCLUDE})
|
||||||
|
link_directories(${EASYLOGGING_LIBRARY_DIRS})
|
||||||
|
|
||||||
|
# OpenSSL
|
||||||
|
if(APPLE AND NOT OPENSSL_ROOT_DIR)
|
||||||
|
execute_process(COMMAND brew --prefix openssl OUTPUT_VARIABLE OPENSSL_ROOT_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
endif()
|
||||||
|
find_package(OpenSSL REQUIRED)
|
||||||
|
message(STATUS "OpenSSL: Version ${OPENSSL_VERSION}")
|
||||||
|
message(STATUS "OpenSSL: include dir at ${OPENSSL_INCLUDE_DIR}")
|
||||||
|
message(STATUS "OpenSSL: libraries at ${OPENSSL_LIBRARIES} ${OPENSSL_SSL_LIBRARIES}")
|
||||||
|
|
||||||
|
# Sodium
|
||||||
|
find_library(SODIUM_LIBRARY sodium)
|
||||||
|
message(STATUS "libsodium: libraries at ${SODIUM_LIBRARY}")
|
||||||
|
|
||||||
|
# HIDApi
|
||||||
|
set(HIDAPI_FOUND OFF)
|
||||||
|
|
||||||
|
# QrEncode
|
||||||
|
find_package(QREncode REQUIRED)
|
||||||
|
|
||||||
|
# Tevador 14 word Monero seed
|
||||||
|
find_package(monero-seed CONFIG)
|
||||||
|
if(NOT monero-seed_FOUND)
|
||||||
|
if(FETCH_DEPS)
|
||||||
|
FetchContent_Declare(monero-seed
|
||||||
|
GIT_REPOSITORY https://git.wownero.com/feather/monero-seed.git)
|
||||||
|
FetchContent_GetProperties(monero-seed)
|
||||||
|
if(NOT monero-seed_POPULATED)
|
||||||
|
message(STATUS "Fetching monero-seed")
|
||||||
|
FetchContent_Populate(monero-seed)
|
||||||
|
add_subdirectory(${monero-seed_SOURCE_DIR} ${monero-seed_BINARY_DIR})
|
||||||
|
endif()
|
||||||
|
add_library(monero-seed::monero-seed ALIAS monero-seed)
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "monero-seed was not installed and fetching deps is disabled")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Boost
|
||||||
|
if(DEBUG)
|
||||||
|
set(Boost_DEBUG ON)
|
||||||
|
endif()
|
||||||
|
if(APPLE AND NOT BOOST_ROOT)
|
||||||
|
execute_process(COMMAND brew --prefix boost OUTPUT_VARIABLE BOOST_ROOT OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
endif()
|
||||||
|
find_package(Boost 1.58 REQUIRED COMPONENTS
|
||||||
|
system
|
||||||
|
filesystem
|
||||||
|
thread
|
||||||
|
date_time
|
||||||
|
chrono
|
||||||
|
regex
|
||||||
|
serialization
|
||||||
|
program_options
|
||||||
|
locale)
|
||||||
|
|
||||||
|
if(UNIX AND NOT APPLE)
|
||||||
|
find_package(X11 REQUIRED)
|
||||||
|
message(STATUS "X11_FOUND = ${X11_FOUND}")
|
||||||
|
message(STATUS "X11_INCLUDE_DIR = ${X11_INCLUDE_DIR}")
|
||||||
|
message(STATUS "X11_LIBRARIES = ${X11_LIBRARIES}")
|
||||||
|
include_directories(${X11_INCLUDE_DIR})
|
||||||
|
link_directories(${X11_LIBRARIES})
|
||||||
|
if(STATIC)
|
||||||
|
find_library(XCB_LIBRARY xcb)
|
||||||
|
message(STATUS "Found xcb library: ${XCB_LIBRARY}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Tor/torsocks
|
||||||
|
set(TOR_TAG "tor-0.4.3.5")
|
||||||
|
set(TOR_DIR "${CMAKE_SOURCE_DIR}/contrib/tor")
|
||||||
|
if(UNIX AND NOT APPLE)
|
||||||
|
set(TOR_LIB "libtorsocks.so")
|
||||||
|
elseif(APPLE)
|
||||||
|
set(TOR_LIB "libtorsocks.dylib")
|
||||||
|
endif()
|
||||||
|
if("$ENV{DRONE}" STREQUAL "true" AND STATIC AND BUILD_TOR)
|
||||||
|
message(STATUS "We are inside a static compile with Drone CI")
|
||||||
|
if(MINGW)
|
||||||
|
execute_process(COMMAND bash -c "cp /mxe/usr/x86_64-w64-mingw32.static/bin/tor.exe ${CMAKE_SOURCE_DIR}/src/tor/tor.exe")
|
||||||
|
elseif(UNIX AND NOT APPLE)
|
||||||
|
execute_process(COMMAND bash -c "cp /usr/local/tor/bin/tor ${CMAKE_SOURCE_DIR}/src/tor/tor")
|
||||||
|
execute_process(COMMAND bash -c "cp /usr/local/torsocks/lib/torsocks/* ${CMAKE_SOURCE_DIR}/src/tor/")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
if(BUILD_TOR)
|
||||||
|
if(UNIX OR APPLE)
|
||||||
|
execute_process(COMMAND bash -c "ls -al src/tor/${TOR_LIB} 2>/dev/null" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE TOR_FOUND OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
if(TOR_FOUND)
|
||||||
|
message(STATUS "${TOR_LIB} found, skipping Tor build")
|
||||||
|
else()
|
||||||
|
message(STATUS "${TOR_LIB} not found, building Tor")
|
||||||
|
execute_process(COMMAND bash -c "bash build_tor.sh ${TOR_TAG} ${CMAKE_SOURCE_DIR} 'ON'" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/contrib)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(STATUS "Skipping Tor build because -DBUILD_TOR=OFF")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MINGW)
|
||||||
|
string(REGEX MATCH "^[^/]:/[^/]*" msys2_install_path "${CMAKE_C_COMPILER}")
|
||||||
|
message(STATUS "MSYS location: ${msys2_install_path}")
|
||||||
|
set(CMAKE_INCLUDE_PATH "${msys2_install_path}/mingw${ARCH_WIDTH}/include")
|
||||||
|
# This is necessary because otherwise CMake will make Boost libraries -lfoo
|
||||||
|
# rather than a full path. Unfortunately, this makes the shared libraries get
|
||||||
|
# linked due to a bug in CMake which misses putting -static flags around the
|
||||||
|
# -lfoo arguments.
|
||||||
|
set(DEFLIB ${msys2_install_path}/mingw${ARCH_WIDTH}/lib)
|
||||||
|
list(REMOVE_ITEM CMAKE_C_IMPLICIT_LINK_DIRECTORIES ${DEFLIB})
|
||||||
|
list(REMOVE_ITEM CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES ${DEFLIB})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "Using Boost include dir at ${Boost_INCLUDE_DIRS}")
|
||||||
|
message(STATUS "Using Boost libraries at ${Boost_LIBRARIES}")
|
||||||
|
|
||||||
|
include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
|
||||||
|
if(MINGW)
|
||||||
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wa,-mbig-obj")
|
||||||
|
set(EXTRA_LIBRARIES mswsock;ws2_32;iphlpapi;crypt32;bcrypt)
|
||||||
|
if(DEPENDS)
|
||||||
|
set(ICU_LIBRARIES icuio icui18n icuuc icudata icutu iconv)
|
||||||
|
else()
|
||||||
|
set(ICU_LIBRARIES icuio icuin icuuc icudt icutu iconv)
|
||||||
|
endif()
|
||||||
|
elseif(APPLE)
|
||||||
|
set(EXTRA_LIBRARIES "-framework AppKit")
|
||||||
|
elseif(OPENBSD)
|
||||||
|
set(EXTRA_LIBRARIES "")
|
||||||
|
elseif(FREEBSD)
|
||||||
|
set(EXTRA_LIBRARIES execinfo)
|
||||||
|
elseif(DRAGONFLY)
|
||||||
|
find_library(COMPAT compat)
|
||||||
|
set(EXTRA_LIBRARIES execinfo ${COMPAT})
|
||||||
|
elseif(CMAKE_SYSTEM_NAME MATCHES "(SunOS|Solaris)")
|
||||||
|
set(EXTRA_LIBRARIES socket nsl resolv)
|
||||||
|
elseif(NOT MSVC AND NOT DEPENDS)
|
||||||
|
find_library(RT rt)
|
||||||
|
set(EXTRA_LIBRARIES ${RT})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
list(APPEND EXTRA_LIBRARIES ${CMAKE_DL_LIBS})
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
include_directories(SYSTEM /usr/include/malloc)
|
||||||
|
if(POLICY CMP0042)
|
||||||
|
cmake_policy(SET CMP0042 NEW)
|
||||||
|
endif()
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64 -fvisibility=default -std=c++11")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=default -DGTEST_HAS_TR1_TUPLE=0")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (APPLE AND NOT IOS)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64 -fvisibility=default -std=c++11")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=default -DGTEST_HAS_TR1_TUPLE=0")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# warnings
|
||||||
|
# @TODO: enable these 2 for migration to Qt 6
|
||||||
|
#add_c_flag_if_supported(-Werror C_SECURITY_FLAGS)
|
||||||
|
#add_cxx_flag_if_supported(-Werror CXX_SECURITY_FLAGS)
|
||||||
|
add_c_flag_if_supported(-Wformat C_SECURITY_FLAGS)
|
||||||
|
add_cxx_flag_if_supported(-Wformat CXX_SECURITY_FLAGS)
|
||||||
|
add_c_flag_if_supported(-Wformat-security C_SECURITY_FLAGS)
|
||||||
|
add_cxx_flag_if_supported(-Wformat-security CXX_SECURITY_FLAGS)
|
||||||
|
|
||||||
|
# -fstack-protector
|
||||||
|
if (NOT OPENBSD AND NOT (WIN32 AND (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS 9.1)))
|
||||||
|
add_c_flag_if_supported(-fstack-protector C_SECURITY_FLAGS)
|
||||||
|
add_cxx_flag_if_supported(-fstack-protector CXX_SECURITY_FLAGS)
|
||||||
|
add_c_flag_if_supported(-fstack-protector-strong C_SECURITY_FLAGS)
|
||||||
|
add_cxx_flag_if_supported(-fstack-protector-strong CXX_SECURITY_FLAGS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# New in GCC 8.2
|
||||||
|
if (NOT OPENBSD AND NOT (WIN32 AND (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS 9.1)))
|
||||||
|
add_c_flag_if_supported(-fcf-protection=full C_SECURITY_FLAGS)
|
||||||
|
add_cxx_flag_if_supported(-fcf-protection=full CXX_SECURITY_FLAGS)
|
||||||
|
endif()
|
||||||
|
if (NOT WIN32 AND NOT OPENBSD)
|
||||||
|
add_c_flag_if_supported(-fstack-clash-protection C_SECURITY_FLAGS)
|
||||||
|
add_cxx_flag_if_supported(-fstack-clash-protection CXX_SECURITY_FLAGS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Removed in GCC 9.1 (or before ?), but still accepted, so spams the output
|
||||||
|
if (NOT (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 9.1))
|
||||||
|
add_c_flag_if_supported(-mmitigate-rop C_SECURITY_FLAGS)
|
||||||
|
add_cxx_flag_if_supported(-mmitigate-rop CXX_SECURITY_FLAGS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# linker
|
||||||
|
if (APPLE)
|
||||||
|
add_linker_flag_if_supported(-Wl,-bind_at_load LD_SECURITY_FLAGS)
|
||||||
|
add_linker_flag_if_supported(-Wl,-dead_strip LD_SECURITY_FLAGS)
|
||||||
|
add_linker_flag_if_supported(-Wl,-dead_strip_dylibs LD_SECURITY_FLAGS)
|
||||||
|
endif()
|
||||||
|
if (NOT APPLE AND NOT (WIN32 AND CMAKE_C_COMPILER_ID STREQUAL "GNU"))
|
||||||
|
# Windows binaries die on startup with PIE when compiled with GCC
|
||||||
|
add_linker_flag_if_supported(-pie LD_SECURITY_FLAGS)
|
||||||
|
endif()
|
||||||
|
add_linker_flag_if_supported(-Wl,-z,relro LD_SECURITY_FLAGS)
|
||||||
|
add_linker_flag_if_supported(-Wl,-z,now LD_SECURITY_FLAGS)
|
||||||
|
add_linker_flag_if_supported(-Wl,-z,noexecstack noexecstack_SUPPORTED)
|
||||||
|
if (noexecstack_SUPPORTED)
|
||||||
|
set(LD_SECURITY_FLAGS "${LD_SECURITY_FLAGS} -Wl,-z,noexecstack")
|
||||||
|
endif()
|
||||||
|
add_linker_flag_if_supported(-Wl,-z,noexecheap noexecheap_SUPPORTED)
|
||||||
|
if (noexecheap_SUPPORTED)
|
||||||
|
set(LD_SECURITY_FLAGS "${LD_SECURITY_FLAGS} -Wl,-z,noexecheap")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# some windows linker bits
|
||||||
|
if (WIN32)
|
||||||
|
add_linker_flag_if_supported(-Wl,--dynamicbase LD_SECURITY_FLAGS)
|
||||||
|
add_linker_flag_if_supported(-Wl,--nxcompat LD_SECURITY_FLAGS)
|
||||||
|
add_linker_flag_if_supported(-Wl,--high-entropy-va LD_SECURITY_FLAGS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(STATIC)
|
||||||
|
add_linker_flag_if_supported(-static-libgcc STATIC_FLAGS)
|
||||||
|
add_linker_flag_if_supported(-static-libstdc++ STATIC_FLAGS)
|
||||||
|
if(MINGW)
|
||||||
|
add_linker_flag_if_supported(-static STATIC_FLAGS)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# With GCC 6.1.1 the compiled binary malfunctions due to aliasing. Until that
|
||||||
|
# is fixed in the code (Issue #847), force compiler to be conservative.
|
||||||
|
add_c_flag_if_supported(-fno-strict-aliasing C_SECURITY_FLAGS)
|
||||||
|
add_cxx_flag_if_supported(-fno-strict-aliasing CXX_SECURITY_FLAGS)
|
||||||
|
|
||||||
|
add_c_flag_if_supported(-fPIC C_SECURITY_FLAGS)
|
||||||
|
add_cxx_flag_if_supported(-fPIC CXX_SECURITY_FLAGS)
|
||||||
|
|
||||||
|
message(STATUS "Using C security hardening flags: ${C_SECURITY_FLAGS}")
|
||||||
|
message(STATUS "Using C++ security hardening flags: ${CXX_SECURITY_FLAGS}")
|
||||||
|
message(STATUS "Using linker security hardening flags: ${LD_SECURITY_FLAGS}")
|
||||||
|
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11 ${C_SECURITY_FLAGS}")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ${CXX_SECURITY_FLAGS}")
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LD_SECURITY_FLAGS} ${STATIC_FLAGS}")
|
||||||
|
|
||||||
|
add_subdirectory(src)
|
307
Dockerfile
Normal file
|
@ -0,0 +1,307 @@
|
||||||
|
FROM ubuntu:18.04
|
||||||
|
|
||||||
|
ARG THREADS=1
|
||||||
|
|
||||||
|
RUN apt clean && apt update
|
||||||
|
RUN apt install -y gnupg
|
||||||
|
|
||||||
|
COPY utils/pubkeys/kitware.asc /kitware.asc
|
||||||
|
RUN cat /kitware.asc | gpg --dearmor - | tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null
|
||||||
|
RUN apt install -y automake git pkg-config python wget python3.6-distutils software-properties-common
|
||||||
|
RUN apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main' && apt update
|
||||||
|
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV TZ=Europe/Amsterdam
|
||||||
|
RUN apt install -y build-essential nano vim aptitude ccache libusb-1.0-0-dev tzdata
|
||||||
|
|
||||||
|
RUN apt install -y xutils-dev && \
|
||||||
|
git clone -b xorgproto-2020.1 --depth 1 https://gitlab.freedesktop.org/xorg/proto/xorgproto && \
|
||||||
|
cd xorgproto && \
|
||||||
|
git reset --hard c62e8203402cafafa5ba0357b6d1c019156c9f36 && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b xcb-proto-1.13 --depth 1 https://gitlab.freedesktop.org/xorg/proto/xcbproto && \
|
||||||
|
cd xcbproto && \
|
||||||
|
git reset --hard 94228cde97d9aecfda04a8e699d462ba2b89e3a0 && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN apt install -y libtool-bin && \
|
||||||
|
git clone -b libXau-1.0.9 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxau && \
|
||||||
|
cd libxau && \
|
||||||
|
git reset --hard d9443b2c57b512cfb250b35707378654d86c7dea && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN apt install -y libpthread-stubs0-dev && \
|
||||||
|
git clone -b 1.13.1 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb && \
|
||||||
|
cd libxcb && \
|
||||||
|
git reset --hard 8287ebd7b752c33b0cabc4982606fe4831106f7e && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b 0.4.0 --depth 1 --recursive https://gitlab.freedesktop.org/xorg/lib/libxcb-util.git && \
|
||||||
|
cd libxcb-util && \
|
||||||
|
git reset --hard acf790d7752f36e450d476ad79807d4012ec863b && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b xtrans-1.3.5 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxtrans.git && \
|
||||||
|
cd libxtrans && \
|
||||||
|
git reset --hard 7cbad9fe2e61cd9d5caeaf361826a6f4bd320f03 && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b 0.4.0 --depth 1 --recursive https://gitlab.freedesktop.org/xorg/lib/libxcb-image.git && \
|
||||||
|
cd libxcb-image && \
|
||||||
|
git reset --hard d882052fb2ce439c6483fce944ba8f16f7294639 && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b 0.4.0 --depth 1 --recursive https://gitlab.freedesktop.org/xorg/lib/libxcb-keysyms.git && \
|
||||||
|
cd libxcb-keysyms && \
|
||||||
|
git reset --hard 0e51ee5570a6a80bdf98770b975dfe8a57f4eeb1 && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b 0.3.9 --depth 1 --recursive https://gitlab.freedesktop.org/xorg/lib/libxcb-render-util.git && \
|
||||||
|
cd libxcb-render-util && \
|
||||||
|
git reset --hard 0317caf63de532fd7a0493ed6afa871a67253747 && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b 0.4.1 --depth 1 --recursive https://gitlab.freedesktop.org/xorg/lib/libxcb-wm.git && \
|
||||||
|
cd libxcb-wm && \
|
||||||
|
git reset --hard 24eb17df2e1245885e72c9d4bbb0a0f69f0700f2 && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b libX11-1.6.9 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libx11 && \
|
||||||
|
cd libx11 && \
|
||||||
|
git reset --hard db7cca17ad7807e92a928da9d4c68a00f4836da2 && \
|
||||||
|
ACLOCAL='aclocal -I /usr/local/share/aclocal/' CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b libXext-1.3.4 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxext && \
|
||||||
|
cd libxext && \
|
||||||
|
git reset --hard ebb167f34a3514783966775fb12573c4ed209625 && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN apt install -y libpthread-stubs0-dev && \
|
||||||
|
git clone -b libXinerama-1.1.4 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxinerama.git && \
|
||||||
|
cd libxinerama && \
|
||||||
|
git reset --hard c3ab2361f13154921df2992f9eacc1ea1b3f946b && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b v1.2.11 --depth 1 https://github.com/madler/zlib && \
|
||||||
|
cd zlib && \
|
||||||
|
git reset --hard cacf7f1d4e3d44d871b605da3b647f07d718623f && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --static --prefix=/usr/local/zlib && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b VER-2-10-2 --depth 1 https://git.sv.nongnu.org/r/freetype/freetype2.git && \
|
||||||
|
cd freetype2 && \
|
||||||
|
git reset --hard 132f19b779828b194b3fede187cee719785db4d8 && \
|
||||||
|
./autogen.sh && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static --with-zlib=no && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b R_2_2_9 --depth 1 https://github.com/libexpat/libexpat && \
|
||||||
|
cd libexpat/expat && \
|
||||||
|
git reset --hard a7bc26b69768f7fb24f0c7976fae24b157b85b13 && \
|
||||||
|
./buildconf.sh && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN apt install -y autopoint gettext gperf libpng-dev && \
|
||||||
|
git clone -b 2.13.92 --depth 1 https://gitlab.freedesktop.org/fontconfig/fontconfig && \
|
||||||
|
cd fontconfig && \
|
||||||
|
git reset --hard b1df1101a643ae16cdfa1d83b939de2497b1bf27 && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static --sysconfdir=/etc --localstatedir=/var && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b release-64-2 --depth 1 https://github.com/unicode-org/icu && \
|
||||||
|
cd icu/icu4c/source && \
|
||||||
|
git reset --hard e2d85306162d3a0691b070b4f0a73e4012433444 && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static --disable-tests --disable-samples && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN apt install -y wget && \
|
||||||
|
wget https://dl.bintray.com/boostorg/release/1.73.0/source/boost_1_73_0.tar.gz && \
|
||||||
|
echo "9995e192e68528793755692917f9eb6422f3052a53c5e13ba278a228af6c7acf boost_1_73_0.tar.gz" > hashsum.txt && \
|
||||||
|
sha256sum -c hashsum.txt && \
|
||||||
|
tar -xvzf boost_1_73_0.tar.gz && \
|
||||||
|
cd boost_1_73_0 && \
|
||||||
|
./bootstrap.sh && \
|
||||||
|
./b2 --with-atomic --with-system --with-filesystem --with-thread --with-date_time --with-chrono --with-regex --with-serialization --with-program_options --with-locale variant=release link=static runtime-link=static cflags='-fPIC' cxxflags='-fPIC' install -a --prefix=/usr
|
||||||
|
|
||||||
|
RUN wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz && \
|
||||||
|
echo "ddb04774f1e32f0c49751e21b67216ac87852ceb056b75209af2443400636d46 openssl-1.1.1g.tar.gz" > hashsum.txt && \
|
||||||
|
sha256sum -c hashsum.txt && \
|
||||||
|
tar -xzf openssl-1.1.1g.tar.gz && \
|
||||||
|
cd openssl-1.1.1g && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./config no-asm no-shared no-zlib-dynamic --prefix=/usr/local/openssl && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN wget https://download.qt.io/archive/qt/5.15/5.15.0/single/qt-everywhere-src-5.15.0.tar.xz && \
|
||||||
|
echo "22b63d7a7a45183865cc4141124f12b673e7a17b1fe2b91e433f6547c5d548c3 qt-everywhere-src-5.15.0.tar.xz" > hashsum.txt && \
|
||||||
|
sha256sum -c hashsum.txt && \
|
||||||
|
tar -xf qt-everywhere-src-5.15.0.tar.xz
|
||||||
|
|
||||||
|
COPY contrib/Qt5.15_LinuxPatch.json /qt-everywhere-src-5.15.0/qtbase/src/gui/configure.json
|
||||||
|
RUN apt install -y libgl1-mesa-dev libglib2.0-dev libxkbcommon-dev libxkbcommon-x11-dev
|
||||||
|
|
||||||
|
RUN cd /qt-everywhere-src-5.15.0 && \
|
||||||
|
sed -ri s/\(Libs:.*\)/\\1\ -lexpat/ /usr/local/lib/pkgconfig/fontconfig.pc && \
|
||||||
|
sed -ri s/\(Libs:.*\)/\\1\ -lz/ /usr/local/lib/pkgconfig/freetype2.pc && \
|
||||||
|
sed -ri s/\(Libs:.*\)/\\1\ -lXau/ /usr/local/lib/pkgconfig/xcb.pc && \
|
||||||
|
OPENSSL_LIBS="-lssl -lcrypto -lpthread -ldl" \
|
||||||
|
./configure --prefix=/usr -platform linux-g++-64 -opensource -confirm-license -release -static -no-avx \
|
||||||
|
-no-opengl -qpa xcb -openssl-linked -I /usr/local/openssl/include -L /usr/local/openssl/lib -system-freetype -fontconfig -glib \
|
||||||
|
-no-dbus -no-sql-sqlite -no-use-gold-linker -no-kms \
|
||||||
|
-qt-harfbuzz -qt-libjpeg -qt-libpng -qt-pcre -qt-zlib \
|
||||||
|
-skip qt3d -skip qtandroidextras -skip qtcanvas3d -skip qtcharts -skip qtconnectivity -skip qtdatavis3d \
|
||||||
|
-skip qtdoc -skip qtquickcontrols -skip qtquickcontrols2 -skip qtspeech -skip qtgamepad \
|
||||||
|
-skip qtlocation -skip qtmacextras -skip qtnetworkauth -skip qtpurchasing -optimize-size \
|
||||||
|
-skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qttools \
|
||||||
|
-skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebview \
|
||||||
|
-skip qtwinextras -skip qtx11extras -skip gamepad -skip serialbus -skip location -skip webengine \
|
||||||
|
-skip qtdeclarative -skip qtmultimedia \
|
||||||
|
-no-feature-cups -no-feature-ftp -no-feature-pdf -no-feature-animation \
|
||||||
|
-nomake examples -nomake tests -nomake tools
|
||||||
|
|
||||||
|
RUN cd /qt-everywhere-src-5.15.0 && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN cd qt-everywhere-src-5.15.0/qttools/src/linguist/lrelease && \
|
||||||
|
qmake && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN apt install -y libudev-dev && \
|
||||||
|
git clone -b v1.0.23 --depth 1 https://github.com/libusb/libusb && \
|
||||||
|
cd libusb && \
|
||||||
|
git reset --hard e782eeb2514266f6738e242cdcb18e3ae1ed06fa && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./autogen.sh --disable-shared --enable-static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b hidapi-0.9.0 --depth 1 https://github.com/libusb/hidapi && \
|
||||||
|
cd hidapi && \
|
||||||
|
git reset --hard 7da5cc91fc0d2dbe4df4f08cd31f6ca1a262418f && \
|
||||||
|
./bootstrap && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN apt install -y libsodium-dev && \
|
||||||
|
git clone -b v4.3.2 --depth 1 https://github.com/zeromq/libzmq && \
|
||||||
|
cd libzmq && \
|
||||||
|
git reset --hard a84ffa12b2eb3569ced199660bac5ad128bff1f0 && \
|
||||||
|
./autogen.sh && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static --disable-libunwind --with-libsodium && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b libgpg-error-1.38 --depth 1 git://git.gnupg.org/libgpg-error.git && \
|
||||||
|
cd libgpg-error && \
|
||||||
|
git reset --hard 71d278824c5fe61865f7927a2ed1aa3115f9e439 && \
|
||||||
|
./autogen.sh && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static --disable-doc --disable-tests && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b libgcrypt-1.8.5 --depth 1 git://git.gnupg.org/libgcrypt.git && \
|
||||||
|
cd libgcrypt && \
|
||||||
|
git reset --hard 56606331bc2a80536db9fc11ad53695126007298 && \
|
||||||
|
./autogen.sh && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --disable-shared --enable-static --disable-doc && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b v3.10.0 --depth 1 https://github.com/protocolbuffers/protobuf && \
|
||||||
|
cd protobuf && \
|
||||||
|
git reset --hard 6d4e7fd7966c989e38024a8ea693db83758944f1 && \
|
||||||
|
./autogen.sh && \
|
||||||
|
CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --enable-static --disable-shared && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN apt install -y zip cmake && git clone -b v4.0.2 --depth 1 https://github.com/fukuchi/libqrencode.git && \
|
||||||
|
cd libqrencode && \
|
||||||
|
git reset --hard 59ee597f913fcfda7a010a6e106fbee2595f68e4 && \
|
||||||
|
cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=/usr . && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN apt install -y libmbedtls-dev && git clone -b release-2.1.12-stable --depth 1 https://github.com/libevent/libevent.git && \
|
||||||
|
cd libevent && \
|
||||||
|
mkdir build && cd build && \
|
||||||
|
cmake -DEVENT_LIBRARY_STATIC=ON -DOPENSSL_ROOT_DIR=/usr/local/openssl -DCMAKE_INSTALL_PREFIX=/usr/local/libevent .. && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone -b tor-0.4.3.5 --depth 1 https://git.torproject.org/tor.git && \
|
||||||
|
cd tor && \
|
||||||
|
bash autogen.sh && \
|
||||||
|
LDFLAGS="-L/usr/local/openssl/lib/" LIBS="-lssl -lcrypto -lpthread -ldl" CPPFLAGS="-I/usr/local/openssl/include/" ./configure \
|
||||||
|
--enable-static-zlib \
|
||||||
|
--enable-static-openssl \
|
||||||
|
--enable-static-libevent \
|
||||||
|
--disable-system-torrc \
|
||||||
|
--with-libevent-dir=/usr/local/libevent \
|
||||||
|
--with-openssl-dir=/usr/local/openssl/ \
|
||||||
|
--with-zlib-dir=/usr/local/zlib \
|
||||||
|
--disable-system-torrc \
|
||||||
|
--disable-tool-name-check \
|
||||||
|
--disable-systemd \
|
||||||
|
--disable-lzma \
|
||||||
|
--disable-unittests \
|
||||||
|
--disable-zstd \
|
||||||
|
--disable-seccomp \
|
||||||
|
--disable-asciidoc \
|
||||||
|
--disable-manpage \
|
||||||
|
--disable-html-manual \
|
||||||
|
--disable-system-torrc \
|
||||||
|
--prefix=/usr/local/tor && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone https://git.torproject.org/torsocks.git && \
|
||||||
|
cd torsocks && \
|
||||||
|
bash autogen.sh && \
|
||||||
|
./configure --prefix=/usr/local/torsocks && \
|
||||||
|
make -j$THREADS && \
|
||||||
|
make -j$THREADS install
|
||||||
|
|
||||||
|
RUN git clone https://git.wownero.com/feather/monero-seed.git && \
|
||||||
|
cd monero-seed && \
|
||||||
|
cmake -DCMAKE_BUILD_TYPE=Release -Bbuild && \
|
||||||
|
make -Cbuild -j$THREADS && \
|
||||||
|
make -Cbuild install
|
18
Dockerfile_appimage
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
RUN apt clean && apt update
|
||||||
|
RUN apt install -y golang git build-essential wget curl ngrep unzip file squashfs-tools desktop-file-utils patchelf libxkbcommon-x11-dev
|
||||||
|
|
||||||
|
RUN go get github.com/probonopd/go-appimage/src/appimagetool
|
||||||
|
RUN go build -trimpath -ldflags="-s -w" github.com/probonopd/go-appimage/src/appimagetool
|
||||||
|
RUN chmod +x appimagetool
|
||||||
|
|
||||||
|
RUN cd /usr/bin && \
|
||||||
|
wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh -O uploadtool && \
|
||||||
|
chmod +x uploadtool
|
||||||
|
|
||||||
|
RUN cd / && \
|
||||||
|
wget -c https://github.com/AppImage/AppImageKit/releases/download/continuous/runtime-x86_64 && \
|
||||||
|
chmod +x runtime-x86_64
|
13
Dockerfile_macos
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# this image is used internally for the buildbot
|
||||||
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
RUN apt clean && apt update
|
||||||
|
RUN apt install -y git build-essential wget curl ngrep unzip file ssh zip
|
||||||
|
|
||||||
|
RUN cat /dev/zero | ssh-keygen -q -N ""
|
||||||
|
|
||||||
|
RUN cat ~/.ssh/id_rsa.pub
|
||||||
|
|
||||||
|
RUN printf "Host *\n StrictHostKeyChecking no" > ~/.ssh/config
|
74
Dockerfile_windows
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
FROM ubuntu:18.04
|
||||||
|
|
||||||
|
ARG THREADS=1
|
||||||
|
|
||||||
|
RUN apt clean && apt update
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV TZ=Europe/Amsterdam
|
||||||
|
|
||||||
|
RUN apt install -y \
|
||||||
|
autoconf \
|
||||||
|
automake \
|
||||||
|
autopoint \
|
||||||
|
aptitude \
|
||||||
|
bash \
|
||||||
|
build-essential \
|
||||||
|
bison \
|
||||||
|
bzip2 \
|
||||||
|
ccache \
|
||||||
|
flex \
|
||||||
|
g++ \
|
||||||
|
g++-multilib \
|
||||||
|
gettext \
|
||||||
|
git \
|
||||||
|
gperf \
|
||||||
|
intltool \
|
||||||
|
libc6-dev-i386 \
|
||||||
|
libgdk-pixbuf2.0-dev \
|
||||||
|
libltdl-dev \
|
||||||
|
libssl-dev \
|
||||||
|
libtool-bin \
|
||||||
|
libxml-parser-perl \
|
||||||
|
lzip \
|
||||||
|
nano \
|
||||||
|
make \
|
||||||
|
openssl \
|
||||||
|
p7zip-full \
|
||||||
|
patch \
|
||||||
|
perl \
|
||||||
|
python \
|
||||||
|
python-mako \
|
||||||
|
ruby \
|
||||||
|
sed \
|
||||||
|
scons \
|
||||||
|
software-properties-common \
|
||||||
|
unzip \
|
||||||
|
tzdata \
|
||||||
|
vim \
|
||||||
|
wget \
|
||||||
|
xz-utils
|
||||||
|
|
||||||
|
RUN git clone -b feather-patch --depth 1 https://git.wownero.com/feather/mxe.git && \
|
||||||
|
cd mxe && \
|
||||||
|
make -j$THREADS MXE_TARGETS='x86_64-w64-mingw32.static' gcc libqrencode pkgconf libgpg_error libgcrypt cmake libsodium lzma readline libzmq boost qtbase qtsvg qtwebsockets qtimageformats
|
||||||
|
|
||||||
|
# plugins
|
||||||
|
RUN cd mxe && make -j$THREADS MXE_PLUGIN_DIRS='/mxe/plugins/apps/' MXE_TARGETS='x86_64-w64-mingw32.static' tor
|
||||||
|
|
||||||
|
# fix env.
|
||||||
|
RUN echo "export PATH=\"/mxe/usr/bin/:\$PATH\"" >> "/root/.bashrc"
|
||||||
|
RUN ln -s /mxe/usr/bin/x86_64-w64-mingw32.static-cmake /usr/local/bin/cmake
|
||||||
|
RUN ln -s /mxe/usr/bin/x86_64-w64-mingw32.static-windres /usr/local/bin/windres
|
||||||
|
RUN ln -s /mxe/usr/x86_64-w64-mingw32.static/lib/libsicudt.a /mxe/usr/x86_64-w64-mingw32.static/lib/libicudt.a
|
||||||
|
RUN ln -s /mxe/usr/x86_64-w64-mingw32.static/lib/libsicuio.a /mxe/usr/x86_64-w64-mingw32.static/lib/libicuio.a
|
||||||
|
RUN ln -s /mxe/usr/x86_64-w64-mingw32.static/lib/libsicutu.a /mxe/usr/x86_64-w64-mingw32.static/lib/libicutu.a
|
||||||
|
RUN ln -s /mxe/usr/x86_64-w64-mingw32.static/lib/libsicuuc.a /mxe/usr/x86_64-w64-mingw32.static/lib/libicuuc.a
|
||||||
|
RUN ln -s /mxe/usr/x86_64-w64-mingw32.static/lib/libsicuin.a /mxe/usr/x86_64-w64-mingw32.static/lib/libicuin.a
|
||||||
|
|
||||||
|
ENV PATH="/mxe/usr/bin/:$PATH"
|
||||||
|
|
||||||
|
RUN git clone https://git.wownero.com/feather/monero-seed.git && \
|
||||||
|
cd monero-seed && \
|
||||||
|
cmake -DCMAKE_BUILD_TYPE=Release -Bbuild && \
|
||||||
|
make -Cbuild -j$THREADS && \
|
||||||
|
make -Cbuild install
|
104
HACKING.md
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
# Documentation for developers
|
||||||
|
|
||||||
|
Feather is developed primarily on Linux. It uses Qt 5.15.* and chances are that your
|
||||||
|
distro's package manager has a lower version. It is therefore recommended that you install
|
||||||
|
Qt manually using the online installer, which can be found here: https://www.qt.io/download
|
||||||
|
(under open-source).
|
||||||
|
|
||||||
|
## Jetbrains Clion
|
||||||
|
|
||||||
|
Feather was developed using JetBrains Clion since it integrates nicely
|
||||||
|
with CMake and comes with a built-in debugger. To pass CMake flags to CLion,
|
||||||
|
go to `File->Settings->Build->CMake`, set Build Type to `Debug` and set your
|
||||||
|
preferred CMake options/definitions.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
### Ubuntu/Debian
|
||||||
|
|
||||||
|
```bash
|
||||||
|
apt install -y git cmake libqrencode-dev build-essential cmake libboost-all-dev \
|
||||||
|
miniupnpc libunbound-dev graphviz doxygen libunwind8-dev pkg-config libssl-dev \
|
||||||
|
libzmq3-dev libsodium-dev libhidapi-dev libnorm-dev libusb-1.0-0-dev libpgm-dev \
|
||||||
|
libprotobuf-dev protobuf-compiler libgcrypt20-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
## Mac OS
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew install boost zmq openssl libpgm miniupnpc libsodium expat libunwind-headers \
|
||||||
|
protobuf libgcrypt qrencode ccache cmake pkgconfig git
|
||||||
|
```
|
||||||
|
|
||||||
|
## CMake
|
||||||
|
|
||||||
|
After installing Qt you might have a folder called `/home/$user/Qt/`. You need to pass this to CMake
|
||||||
|
via the `CMAKE_PREFIX_PATH` definition. For me this is:
|
||||||
|
|
||||||
|
```
|
||||||
|
-DCMAKE_PREFIX_PATH=/home/dsc/QtNew/5.15.0/gcc_64
|
||||||
|
```
|
||||||
|
|
||||||
|
There are some Monero/Feather related options/definitions that you may pass:
|
||||||
|
|
||||||
|
- `-DXMRTO=OFF` - disable Xmr.To feature
|
||||||
|
- `-DBUILD_TOR=OFF` - disable embedded Tor
|
||||||
|
- `-DDONATE_BEG=OFF` - disable the dreaded donate requests
|
||||||
|
|
||||||
|
And:
|
||||||
|
|
||||||
|
```
|
||||||
|
-DMANUAL_SUBMODULES=1
|
||||||
|
-DUSE_DEVICE_TREZOR=OFF
|
||||||
|
-DUSE_SINGLE_BUILDDIR=ON
|
||||||
|
-DDEV_MODE=ON
|
||||||
|
```
|
||||||
|
|
||||||
|
If you have OpenSSL installed in a custom location, try:
|
||||||
|
|
||||||
|
```
|
||||||
|
-DOPENSSL_INCLUDE_DIR=/usr/local/lib/openssl-1.1.1g/include
|
||||||
|
-DOPENSSL_SSL_LIBRARY=/usr/local/lib/openssl-1.1.1g/libssl.so.1.1
|
||||||
|
-DOPENSSL_CRYPTO_LIBRARY=/usr/local/lib/openssl-1.1.1g/libcrypto.so.1.1
|
||||||
|
```
|
||||||
|
|
||||||
|
I prefer also enabling verbose makefiles, which may be useful in some situations.
|
||||||
|
|
||||||
|
```
|
||||||
|
-DCMAKE_VERBOSE_MAKEFILE=ON
|
||||||
|
```
|
||||||
|
|
||||||
|
Enable debugging symbols:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
-DCMAKE_BUILD_TYPE=Debug
|
||||||
|
```
|
||||||
|
|
||||||
|
## Feather
|
||||||
|
|
||||||
|
It's best to install Tor locally as a service and start Feather with `--use-local-tor`, this
|
||||||
|
prevents the child process from starting up and saves time.
|
||||||
|
|
||||||
|
#### Ubuntu/Debian
|
||||||
|
|
||||||
|
```bash
|
||||||
|
apt install -y tor
|
||||||
|
sudo service tor start
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Mac OS
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew install tor
|
||||||
|
brew services start tor
|
||||||
|
```
|
||||||
|
|
||||||
|
To skip the wizards and open a wallet directly use `--wallet-file`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./feather --use-local-tor --wallet-file /home/user/Monero/wallets/bla.keys
|
||||||
|
```
|
||||||
|
|
||||||
|
It is recommended that you use `--stagenet` for development. Testnet is also possible,
|
||||||
|
but you'll have to provide Feather a testnet node of your own.
|
||||||
|
|
28
LICENSE
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
Copyright (c) 2020, The Monero Project
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
3. Neither the name of the copyright holder nor the names of its contributors
|
||||||
|
may be used to endorse or promote products derived from this software without
|
||||||
|
specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
70
Makefile
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
# Copyright (c) 2014-2021, The Monero Project
|
||||||
|
#
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
# permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
# conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
# of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
# materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||||
|
# used to endorse or promote products derived from this software without specific
|
||||||
|
# prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||||
|
|
||||||
|
CMAKEFLAGS = \
|
||||||
|
-DARCH=x86_64 \
|
||||||
|
-DBUILD_64=On \
|
||||||
|
-DBUILD_TESTS=Off \
|
||||||
|
-DXMRTO=ON \
|
||||||
|
-DCMAKE_CXX_STANDARD=11 \
|
||||||
|
-DCMAKE_VERBOSE_MAKEFILE=On \
|
||||||
|
-DINSTALL_VENDORED_LIBUNBOUND=Off \
|
||||||
|
-DMANUAL_SUBMODULES=1 \
|
||||||
|
-DSTATIC=On \
|
||||||
|
-DUSE_DEVICE_TREZOR=Off \
|
||||||
|
$(CMAKEFLAGS_EXTRA)
|
||||||
|
|
||||||
|
release-static: CMAKEFLAGS += -DBUILD_TAG="linux-x64"
|
||||||
|
release-static: CMAKEFLAGS += -DBUILD_TOR=On
|
||||||
|
release-static: CMAKEFLAGS += -DCMAKE_BUILD_TYPE=Release
|
||||||
|
release-static:
|
||||||
|
cmake -Bbuild $(CMAKEFLAGS)
|
||||||
|
$(MAKE) -Cbuild
|
||||||
|
|
||||||
|
windows-mxe-release: CMAKEFLAGS += -DBUILD_TAG="win-x64"
|
||||||
|
windows-mxe-release: CMAKEFLAGS += -DBUILD_TOR=On
|
||||||
|
windows-mxe-release: CMAKEFLAGS += -DCMAKE_BUILD_TYPE=Release
|
||||||
|
windows-mxe-release:
|
||||||
|
cmake -Bbuild $(CMAKEFLAGS)
|
||||||
|
$(MAKE) -Cbuild
|
||||||
|
|
||||||
|
windows-mxe-debug: CMAKEFLAGS += -DBUILD_TAG="win-x64"
|
||||||
|
windows-mxe-debug: CMAKEFLAGS += -DBUILD_TOR=Off
|
||||||
|
windows-mxe-debug: CMAKEFLAGS += -DCMAKE_BUILD_TYPE=Debug
|
||||||
|
windows-mxe-debug:
|
||||||
|
cmake -Bbuild $(CMAKEFLAGS)
|
||||||
|
$(MAKE) -Cbuild
|
||||||
|
|
||||||
|
mac-release: CMAKEFLAGS += -DSTATIC=Off
|
||||||
|
mac-release: CMAKEFLAGS += -DBUILD_TAG="mac-x64"
|
||||||
|
mac-release: CMAKEFLAGS += -DBUILD_TOR=Off
|
||||||
|
mac-release: CMAKEFLAGS += -DCMAKE_BUILD_TYPE=Release
|
||||||
|
mac-release:
|
||||||
|
cmake -Bbuild $(CMAKEFLAGS)
|
||||||
|
$(MAKE) -Cbuild
|
||||||
|
$(MAKE) -Cbuild deploy
|
35
README.md
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
# Feather - a free Monero desktop wallet
|
||||||
|
|
||||||
|
[![Build Status](https://build.featherwallet.org/api/badges/feather/feather/status.svg)](https://build.featherwallet.org/feather/feather)
|
||||||
|
|
||||||
|
Feather is a free, open-source Monero client for Mac OS and Linux platforms written in C++ with the Qt framework. It is created and maintained by [dsc](dsc@xmr.pm) and [tobtoht](thotbot@protonmail.com).
|
||||||
|
|
||||||
|
## Development resources
|
||||||
|
* Web: [featherwallet.org](https://featherwallet.org)
|
||||||
|
* Git: [git.wownero.com/feather/feather](https://git.wownero.com/feather/feather)
|
||||||
|
* IRC: `#feather` on OFTC
|
||||||
|
* Development builds: [build.featherwallet.org/files](https://build.featherwallet.org/files/)
|
||||||
|
|
||||||
|
Copyright (c) 2020-2021 The Monero Project.
|
||||||
|
|
||||||
|
## Compiling Feather from source
|
||||||
|
|
||||||
|
Feather uses Monero, as such it requires the same dependencies as outlined in [Monero's README](https://github.com/monero-project/monero#compiling-monero-from-source). Additionally, Feather uses:
|
||||||
|
|
||||||
|
- Qt 5.15.0
|
||||||
|
- libqrencode
|
||||||
|
- openpgp
|
||||||
|
|
||||||
|
See [BUILDING.md](https://git.wownero.com/feather/feather/src/branch/master/BUILDING.md) for information on how to compile a build.
|
||||||
|
|
||||||
|
## Supporting the project
|
||||||
|
|
||||||
|
Feather is a 100% community-sponsored endeavor. If you want to join our efforts, the easiest thing you can do is support the project financially.
|
||||||
|
|
||||||
|
`47ntfT2Z5384zku39pTM6hGcnLnvpRYW2Azm87GiAAH2bcTidtq278TL6HmwyL8yjMeERqGEBs3cqC8vvHPJd1cWQrGC65f`
|
||||||
|
|
||||||
|
## Developers
|
||||||
|
|
||||||
|
See [HACKING.md](https://git.wownero.com/feather/feather/src/branch/master/HACKING.md) for useful development resources.
|
||||||
|
|
||||||
|
It is HIGHLY recommended that you join the `#feather` IRC channel on OFTC if you are hacking on Feather. Due to the nature of this open source software project, joining this channel and idling is the best way to stay updated on best practices and new developments.
|
16
SECURITY.md
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
Please do not open an issue to report security issues.
|
||||||
|
|
||||||
|
To report a vulnerability send an email to dev@featherwallet.org
|
||||||
|
|
||||||
|
The following keys may be used to communicate sensitive information to developers:
|
||||||
|
|
||||||
|
| Name | Fingerprint |
|
||||||
|
|------|-------------|
|
||||||
|
| dsc | 1BFD 40F9 B0E2 B40D C8C7 FD4A 521F 1E79 91AA 42DC |
|
||||||
|
| tobtoht | C5AB E5C0 E50F A2B3 F14A B92D 1CAD D27F 41F4 5C3C |
|
||||||
|
|
||||||
|
Public keys can be found in `utils/pubkeys`.
|
50
cmake/32-bit-toolchain.cmake
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
# Copyright (c) 2014-2019, The Monero Project
|
||||||
|
#
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
# permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
# conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
# of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
# materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||||
|
# used to endorse or promote products derived from this software without specific
|
||||||
|
# prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
if (NOT CMAKE_HOST_WIN32)
|
||||||
|
set (CMAKE_SYSTEM_NAME Windows)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set (GCC_PREFIX i686-w64-mingw32)
|
||||||
|
set (CMAKE_C_COMPILER ${GCC_PREFIX}-gcc)
|
||||||
|
set (CMAKE_CXX_COMPILER ${GCC_PREFIX}-g++)
|
||||||
|
set (CMAKE_AR ar CACHE FILEPATH "" FORCE)
|
||||||
|
set (CMAKE_NM nm CACHE FILEPATH "" FORCE)
|
||||||
|
set (CMAKE_LINKER ld CACHE FILEPATH "" FORCE)
|
||||||
|
#set (CMAKE_RANLIB ${GCC_PREFIX}-gcc-ranlib CACHE FILEPATH "" FORCE)
|
||||||
|
set (CMAKE_RC_COMPILER windres)
|
||||||
|
|
||||||
|
set (CMAKE_FIND_ROOT_PATH "${MSYS2_FOLDER}/mingw32")
|
||||||
|
|
||||||
|
# Ensure cmake doesn't find things in the wrong places
|
||||||
|
set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # Find programs on host
|
||||||
|
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # Find libs in target
|
||||||
|
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # Find includes in target
|
||||||
|
|
||||||
|
set (MINGW_FLAG "-m32")
|
||||||
|
set (USE_LTO_DEFAULT false)
|
50
cmake/64-bit-toolchain.cmake
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
# Copyright (c) 2014-2019, The Monero Project
|
||||||
|
#
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
# permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
# conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
# of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
# materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||||
|
# used to endorse or promote products derived from this software without specific
|
||||||
|
# prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
if (NOT CMAKE_HOST_WIN32)
|
||||||
|
set (CMAKE_SYSTEM_NAME Windows)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set (GCC_PREFIX x86_64-w64-mingw32)
|
||||||
|
set (CMAKE_C_COMPILER ${GCC_PREFIX}-gcc)
|
||||||
|
set (CMAKE_CXX_COMPILER ${GCC_PREFIX}-g++)
|
||||||
|
set (CMAKE_AR ar CACHE FILEPATH "" FORCE)
|
||||||
|
set (CMAKE_NM nm CACHE FILEPATH "" FORCE)
|
||||||
|
set (CMAKE_LINKER ld CACHE FILEPATH "" FORCE)
|
||||||
|
#set (CMAKE_RANLIB ${GCC_PREFIX}-gcc-ranlib CACHE FILEPATH "" FORCE)
|
||||||
|
set (CMAKE_RC_COMPILER windres)
|
||||||
|
|
||||||
|
set (CMAKE_FIND_ROOT_PATH "${MSYS2_FOLDER}/mingw64")
|
||||||
|
|
||||||
|
# Ensure cmake doesn't find things in the wrong places
|
||||||
|
set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # Find programs on host
|
||||||
|
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # Find libs in target
|
||||||
|
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # Find includes in target
|
||||||
|
|
||||||
|
set (MINGW_FLAG "-m64")
|
||||||
|
set (USE_LTO_DEFAULT false)
|
14
cmake/CheckLinkerFlag.c
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#ifdef __CLASSIC_C__
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int ac;
|
||||||
|
char* av[];
|
||||||
|
#else
|
||||||
|
int main(int ac, char* av[])
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
if (ac > 1000) {
|
||||||
|
return *av[0];
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
47
cmake/CheckLinkerFlag.cmake
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
include(CheckCCompilerFlag)
|
||||||
|
|
||||||
|
macro(CHECK_LINKER_FLAG flag VARIABLE)
|
||||||
|
if(NOT DEFINED "${VARIABLE}")
|
||||||
|
if(NOT CMAKE_REQUIRED_QUIET)
|
||||||
|
message(STATUS "Looking for ${flag} linker flag")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(_cle_source ${CMAKE_SOURCE_DIR}/cmake/CheckLinkerFlag.c)
|
||||||
|
|
||||||
|
set(saved_CMAKE_C_FLAGS ${CMAKE_C_FLAGS})
|
||||||
|
set(CMAKE_C_FLAGS "${flag}")
|
||||||
|
try_compile(${VARIABLE}
|
||||||
|
${CMAKE_BINARY_DIR}
|
||||||
|
${_cle_source}
|
||||||
|
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} ${flag}
|
||||||
|
CMAKE_FLAGS
|
||||||
|
OUTPUT_VARIABLE OUTPUT)
|
||||||
|
unset(_cle_source)
|
||||||
|
set(CMAKE_C_FLAGS ${saved_CMAKE_C_FLAGS})
|
||||||
|
unset(saved_CMAKE_C_FLAGS)
|
||||||
|
|
||||||
|
if ("${OUTPUT}" MATCHES "warning.*ignored")
|
||||||
|
set(${VARIABLE} 0)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(${VARIABLE})
|
||||||
|
if(NOT CMAKE_REQUIRED_QUIET)
|
||||||
|
message(STATUS "Looking for ${flag} linker flag - found")
|
||||||
|
endif()
|
||||||
|
set(${VARIABLE} 1 CACHE INTERNAL "Have linker flag ${flag}")
|
||||||
|
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
|
||||||
|
"Determining if the ${flag} linker flag is supported "
|
||||||
|
"passed with the following output:\n"
|
||||||
|
"${OUTPUT}\n\n")
|
||||||
|
else()
|
||||||
|
if(NOT CMAKE_REQUIRED_QUIET)
|
||||||
|
message(STATUS "Looking for ${flag} linker flag - not found")
|
||||||
|
endif()
|
||||||
|
set(${VARIABLE} "" CACHE INTERNAL "Have linker flag ${flag}")
|
||||||
|
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
|
||||||
|
"Determining if the ${flag} linker flag is supported "
|
||||||
|
"failed with the following output:\n"
|
||||||
|
"${OUTPUT}\n\n")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endmacro()
|
5
cmake/CheckTrezor.cmake
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
OPTION(USE_DEVICE_TREZOR "Trezor support compilation" OFF)
|
||||||
|
OPTION(USE_DEVICE_TREZOR_LIBUSB "Trezor LibUSB compilation" OFF)
|
||||||
|
OPTION(USE_DEVICE_TREZOR_UDP_RELEASE "Trezor UdpTransport in release mode" OFF)
|
||||||
|
OPTION(USE_DEVICE_TREZOR_DEBUG "Trezor Debugging enabled" OFF)
|
||||||
|
OPTION(TREZOR_DEBUG "Main trezor debugging switch" OFF)
|
28
cmake/Deploy.cmake
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
if(APPLE OR (WIN32 AND NOT STATIC))
|
||||||
|
add_custom_target(deploy)
|
||||||
|
get_target_property(_qmake_executable Qt5::qmake IMPORTED_LOCATION)
|
||||||
|
get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)
|
||||||
|
|
||||||
|
if(APPLE AND NOT IOS)
|
||||||
|
find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS "${_qt_bin_dir}")
|
||||||
|
add_custom_command(TARGET deploy
|
||||||
|
POST_BUILD
|
||||||
|
COMMAND "${MACDEPLOYQT_EXECUTABLE}" "$<TARGET_FILE_DIR:feather>/../.." -always-overwrite
|
||||||
|
COMMENT "Running macdeployqt..."
|
||||||
|
)
|
||||||
|
|
||||||
|
# workaround for a Qt bug that requires manually adding libqsvg.dylib to bundle
|
||||||
|
find_file(_qt_svg_dylib "libqsvg.dylib" PATHS "${CMAKE_PREFIX_PATH}/plugins/imageformats" NO_DEFAULT_PATH)
|
||||||
|
if(_qt_svg_dylib)
|
||||||
|
add_custom_command(TARGET deploy
|
||||||
|
POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy ${_qt_svg_dylib} $<TARGET_FILE_DIR:feather>/../PlugIns/imageformats/
|
||||||
|
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtGui.framework/Versions/5/QtGui" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $<TARGET_FILE_DIR:feather>/../PlugIns/imageformats/libqsvg.dylib
|
||||||
|
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtWidgets.framework/Versions/5/QtWidgets" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $<TARGET_FILE_DIR:feather>/../PlugIns/imageformats/libqsvg.dylib
|
||||||
|
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtSvg.framework/Versions/5/QtSvg" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $<TARGET_FILE_DIR:feather>/../PlugIns/imageformats/libqsvg.dylib
|
||||||
|
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtCore.framework/Versions/5/QtCore" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $<TARGET_FILE_DIR:feather>/../PlugIns/imageformats/libqsvg.dylib
|
||||||
|
COMMENT "Copying libqsvg.dylib, running install_name_tool"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
1803
cmake/Doxyfile.in
Normal file
14
cmake/Doxygen.extra.css.in
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/* increase vertical space */
|
||||||
|
#titlearea, #nav-path {
|
||||||
|
display: none;
|
||||||
|
height: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* uncomment these lines for some extra vertical space */
|
||||||
|
|
||||||
|
/*
|
||||||
|
.tablist li {
|
||||||
|
line-height: 26px;
|
||||||
|
}
|
||||||
|
*/
|
98
cmake/FindBacktrace.cmake
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||||
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||||
|
|
||||||
|
#.rst:
|
||||||
|
# FindBacktrace
|
||||||
|
# -------------
|
||||||
|
#
|
||||||
|
# Find provider for backtrace(3).
|
||||||
|
#
|
||||||
|
# Checks if OS supports backtrace(3) via either libc or custom library.
|
||||||
|
# This module defines the following variables:
|
||||||
|
#
|
||||||
|
# ``Backtrace_HEADER``
|
||||||
|
# The header file needed for backtrace(3). Cached.
|
||||||
|
# Could be forcibly set by user.
|
||||||
|
# ``Backtrace_INCLUDE_DIRS``
|
||||||
|
# The include directories needed to use backtrace(3) header.
|
||||||
|
# ``Backtrace_LIBRARIES``
|
||||||
|
# The libraries (linker flags) needed to use backtrace(3), if any.
|
||||||
|
# ``Backtrace_FOUND``
|
||||||
|
# Is set if and only if backtrace(3) support detected.
|
||||||
|
#
|
||||||
|
# The following cache variables are also available to set or use:
|
||||||
|
#
|
||||||
|
# ``Backtrace_LIBRARY``
|
||||||
|
# The external library providing backtrace, if any.
|
||||||
|
# ``Backtrace_INCLUDE_DIR``
|
||||||
|
# The directory holding the backtrace(3) header.
|
||||||
|
#
|
||||||
|
# Typical usage is to generate of header file using configure_file() with the
|
||||||
|
# contents like the following::
|
||||||
|
#
|
||||||
|
# #cmakedefine01 Backtrace_FOUND
|
||||||
|
# #if Backtrace_FOUND
|
||||||
|
# # include <${Backtrace_HEADER}>
|
||||||
|
# #endif
|
||||||
|
#
|
||||||
|
# And then reference that generated header file in actual source.
|
||||||
|
|
||||||
|
include(CMakePushCheckState)
|
||||||
|
include(CheckSymbolExists)
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|
||||||
|
# List of variables to be provided to find_package_handle_standard_args()
|
||||||
|
set(_Backtrace_STD_ARGS Backtrace_INCLUDE_DIR)
|
||||||
|
|
||||||
|
if(Backtrace_HEADER)
|
||||||
|
set(_Backtrace_HEADER_TRY "${Backtrace_HEADER}")
|
||||||
|
else(Backtrace_HEADER)
|
||||||
|
set(_Backtrace_HEADER_TRY "execinfo.h")
|
||||||
|
endif(Backtrace_HEADER)
|
||||||
|
|
||||||
|
find_path(Backtrace_INCLUDE_DIR "${_Backtrace_HEADER_TRY}")
|
||||||
|
set(Backtrace_INCLUDE_DIRS ${Backtrace_INCLUDE_DIR})
|
||||||
|
|
||||||
|
if (NOT DEFINED Backtrace_LIBRARY)
|
||||||
|
# First, check if we already have backtrace(), e.g., in libc
|
||||||
|
cmake_push_check_state(RESET)
|
||||||
|
set(CMAKE_REQUIRED_INCLUDES ${Backtrace_INCLUDE_DIRS})
|
||||||
|
set(CMAKE_REQUIRED_QUIET ${Backtrace_FIND_QUIETLY})
|
||||||
|
check_symbol_exists("backtrace" "${_Backtrace_HEADER_TRY}" _Backtrace_SYM_FOUND)
|
||||||
|
cmake_pop_check_state()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(_Backtrace_SYM_FOUND)
|
||||||
|
# Avoid repeating the message() call below each time CMake is run.
|
||||||
|
if(NOT Backtrace_FIND_QUIETLY AND NOT DEFINED Backtrace_LIBRARY)
|
||||||
|
message(STATUS "backtrace facility detected in default set of libraries")
|
||||||
|
endif()
|
||||||
|
set(Backtrace_LIBRARY "" CACHE FILEPATH "Library providing backtrace(3), empty for default set of libraries")
|
||||||
|
else()
|
||||||
|
# Check for external library, for non-glibc systems
|
||||||
|
if(Backtrace_INCLUDE_DIR)
|
||||||
|
# OpenBSD has libbacktrace renamed to libexecinfo
|
||||||
|
find_library(Backtrace_LIBRARY "execinfo")
|
||||||
|
elseif() # respect user wishes
|
||||||
|
set(_Backtrace_HEADER_TRY "backtrace.h")
|
||||||
|
find_path(Backtrace_INCLUDE_DIR ${_Backtrace_HEADER_TRY})
|
||||||
|
find_library(Backtrace_LIBRARY "backtrace")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Prepend list with library path as it's more common practice
|
||||||
|
set(_Backtrace_STD_ARGS Backtrace_LIBRARY ${_Backtrace_STD_ARGS})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "Backtrace_LIBRARY: ${Backtrace_LIBRARY}")
|
||||||
|
if(Backtrace_LIBRARY STREQUAL "NOTFOUND")
|
||||||
|
set(Backtrace_LIBRARY "")
|
||||||
|
endif()
|
||||||
|
if(Backtrace_LIBRARY STREQUAL "Backtrace_LIBRARY-NOTFOUND")
|
||||||
|
set(Backtrace_LIBRARY "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(Backtrace_LIBRARIES ${Backtrace_LIBRARY})
|
||||||
|
set(Backtrace_HEADER "${_Backtrace_HEADER_TRY}" CACHE STRING "Header providing backtrace(3) facility")
|
||||||
|
|
||||||
|
find_package_handle_standard_args(Backtrace FOUND_VAR Backtrace_FOUND REQUIRED_VARS ${_Backtrace_STD_ARGS})
|
||||||
|
mark_as_advanced(Backtrace_HEADER Backtrace_INCLUDE_DIR Backtrace_LIBRARY)
|
25
cmake/FindBerkeleyDB.cmake
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
# - Try to find Berkeley DB
|
||||||
|
# Once done this will define
|
||||||
|
#
|
||||||
|
# BERKELEY_DB_FOUND - system has Berkeley DB
|
||||||
|
# BERKELEY_DB_INCLUDE_DIR - the Berkeley DB include directory
|
||||||
|
# BERKELEY_DB_LIBRARIES - Link these to use Berkeley DB
|
||||||
|
# BERKELEY_DB_DEFINITIONS - Compiler switches required for using Berkeley DB
|
||||||
|
|
||||||
|
# Copyright (c) 2006, Alexander Dymo, <adymo@kdevelop.org>
|
||||||
|
#
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||||
|
|
||||||
|
find_path(BERKELEY_DB_INCLUDE_DIR db_cxx.h
|
||||||
|
/usr/include/db4
|
||||||
|
/usr/local/include/db4
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(BERKELEY_DB_LIBRARIES NAMES db_cxx )
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(Berkeley "Could not find Berkeley DB >= 4.1" BERKELEY_DB_INCLUDE_DIR BERKELEY_DB_LIBRARIES)
|
||||||
|
# show the BERKELEY_DB_INCLUDE_DIR and BERKELEY_DB_LIBRARIES variables only in the advanced view
|
||||||
|
mark_as_advanced(BERKELEY_DB_INCLUDE_DIR BERKELEY_DB_LIBRARIES )
|
||||||
|
|
56
cmake/FindCcache.cmake
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
# Copyright (c) 2014-2020, The Monero Project
|
||||||
|
#
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
# permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
# conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
# of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
# materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||||
|
# used to endorse or promote products derived from this software without specific
|
||||||
|
# prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
# - Try to find readline include dirs and libraries
|
||||||
|
#
|
||||||
|
# Automatically finds ccache build accelerator, if it's found in PATH.
|
||||||
|
#
|
||||||
|
# Usage of this module as follows:
|
||||||
|
#
|
||||||
|
# project(monero)
|
||||||
|
# include(FindCcache) # Include AFTER the project() macro to be able to reach the CMAKE_CXX_COMPILER variable
|
||||||
|
#
|
||||||
|
# Properties modified by this module:
|
||||||
|
#
|
||||||
|
# GLOBAL PROPERTY RULE_LAUNCH_COMPILE set to ccache, when ccache found
|
||||||
|
# GLOBAL PROPERTY RULE_LAUNCH_LINK set to ccache, when ccache found
|
||||||
|
|
||||||
|
find_program(CCACHE_FOUND ccache)
|
||||||
|
if (CCACHE_FOUND)
|
||||||
|
set(TEMP_CPP_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test-program.cpp")
|
||||||
|
file(WRITE "${TEMP_CPP_FILE}" "int main() { return 0; }")
|
||||||
|
execute_process(COMMAND "${CCACHE_FOUND}" "${CMAKE_CXX_COMPILER}" "${TEMP_CPP_FILE}" RESULT_VARIABLE RET)
|
||||||
|
if (${RET} EQUAL 0)
|
||||||
|
message("found usable ccache: ${CCACHE_FOUND}")
|
||||||
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_FOUND}")
|
||||||
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CCACHE_FOUND}")
|
||||||
|
else()
|
||||||
|
message("found ccache ${CCACHE_FOUND}, but is UNUSABLE! Return code: ${RET}")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message("ccache NOT found!")
|
||||||
|
endif()
|
70
cmake/FindGCrypt.cmake
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
# - Try to find GCrypt
|
||||||
|
# Once done this will define
|
||||||
|
#
|
||||||
|
# GCRYPT_FOUND - system has GCrypt
|
||||||
|
# GCRYPT_INCLUDE_DIRS - the GCrypt include directory
|
||||||
|
# GCRYPT_LIBRARIES - Link these to use GCrypt
|
||||||
|
# GCRYPT_DEFINITIONS - Compiler switches required for using GCrypt
|
||||||
|
#
|
||||||
|
#=============================================================================
|
||||||
|
# Copyright (c) 2009-2011 Andreas Schneider <asn@cryptomilk.org>
|
||||||
|
#
|
||||||
|
# Distributed under the OSI-approved BSD License (the "License");
|
||||||
|
# see accompanying file Copyright.txt for details.
|
||||||
|
#
|
||||||
|
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||||
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
# See the License for more information.
|
||||||
|
#=============================================================================
|
||||||
|
#
|
||||||
|
|
||||||
|
if (GCRYPT_LIBRARIES AND GCRYPT_INCLUDE_DIRS)
|
||||||
|
# in cache already
|
||||||
|
# set(GCRYPT_FOUND TRUE)
|
||||||
|
else (GCRYPT_LIBRARIES AND GCRYPT_INCLUDE_DIRS)
|
||||||
|
|
||||||
|
set(_GCRYPT_ROOT_PATHS
|
||||||
|
"$ENV{PROGRAMFILES}/libgcrypt"
|
||||||
|
)
|
||||||
|
|
||||||
|
find_path(GCRYPT_ROOT_DIR
|
||||||
|
NAMES
|
||||||
|
include/gcrypt.h
|
||||||
|
PATHS
|
||||||
|
${_GCRYPT_ROOT_PATHS}
|
||||||
|
)
|
||||||
|
mark_as_advanced(ZLIB_ROOT_DIR)
|
||||||
|
|
||||||
|
find_path(GCRYPT_INCLUDE_DIR
|
||||||
|
NAMES
|
||||||
|
gcrypt.h
|
||||||
|
PATHS
|
||||||
|
/usr/local/include
|
||||||
|
/opt/local/include
|
||||||
|
/sw/include
|
||||||
|
/usr/lib/sfw/include
|
||||||
|
${GCRYPT_ROOT_DIR}/include
|
||||||
|
)
|
||||||
|
set(GCRYPT_INCLUDE_DIRS ${GCRYPT_INCLUDE_DIR})
|
||||||
|
|
||||||
|
find_library(GCRYPT_LIBRARY
|
||||||
|
NAMES
|
||||||
|
gcrypt
|
||||||
|
gcrypt11
|
||||||
|
libgcrypt-11
|
||||||
|
PATHS
|
||||||
|
/opt/local/lib
|
||||||
|
/sw/lib
|
||||||
|
/usr/sfw/lib/64
|
||||||
|
/usr/sfw/lib
|
||||||
|
${GCRYPT_ROOT_DIR}/lib
|
||||||
|
)
|
||||||
|
set(GCRYPT_LIBRARIES ${GCRYPT_LIBRARY})
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(GCrypt DEFAULT_MSG GCRYPT_LIBRARIES GCRYPT_INCLUDE_DIRS)
|
||||||
|
|
||||||
|
# show the GCRYPT_INCLUDE_DIRS and GCRYPT_LIBRARIES variables only in the advanced view
|
||||||
|
mark_as_advanced(GCRYPT_INCLUDE_DIRS GCRYPT_LIBRARIES)
|
||||||
|
|
||||||
|
endif (GCRYPT_LIBRARIES AND GCRYPT_INCLUDE_DIRS)
|
0
cmake/FindHIDAPI.cmake
Normal file
41
cmake/FindLibunwind.cmake
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
# - Try to find libunwind
|
||||||
|
# Once done this will define
|
||||||
|
#
|
||||||
|
# LIBUNWIND_FOUND - system has libunwind
|
||||||
|
# LIBUNWIND_INCLUDE_DIR - the libunwind include directory
|
||||||
|
# LIBUNWIND_LIBRARIES - Link these to use libunwind
|
||||||
|
# LIBUNWIND_DEFINITIONS - Compiler switches required for using libunwind
|
||||||
|
|
||||||
|
# Copyright (c) 2006, Alexander Dymo, <adymo@kdevelop.org>
|
||||||
|
#
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||||
|
|
||||||
|
find_path(LIBUNWIND_INCLUDE_DIR libunwind.h
|
||||||
|
/usr/include
|
||||||
|
/usr/local/include
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(LIBUNWIND_LIBRARIES NAMES unwind )
|
||||||
|
if(NOT LIBUNWIND_LIBRARIES STREQUAL "LIBUNWIND_LIBRARIES-NOTFOUND")
|
||||||
|
if (CMAKE_COMPILER_IS_GNUCC)
|
||||||
|
set(LIBUNWIND_LIBRARIES "gcc_eh;${LIBUNWIND_LIBRARIES}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# some versions of libunwind need liblzma, and we don't use pkg-config
|
||||||
|
# so we just look whether liblzma is installed, and add it if it is.
|
||||||
|
# It might not be actually needed, but doesn't hurt if it is not.
|
||||||
|
# We don't need any headers, just the lib, as it's privately needed.
|
||||||
|
message(STATUS "looking for liblzma")
|
||||||
|
find_library(LIBLZMA_LIBRARIES lzma )
|
||||||
|
if(NOT LIBLZMA_LIBRARIES STREQUAL "LIBLZMA_LIBRARIES-NOTFOUND")
|
||||||
|
message(STATUS "liblzma found")
|
||||||
|
set(LIBUNWIND_LIBRARIES "${LIBUNWIND_LIBRARIES};${LIBLZMA_LIBRARIES}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(Libunwind "Could not find libunwind" LIBUNWIND_INCLUDE_DIR LIBUNWIND_LIBRARIES)
|
||||||
|
# show the LIBUNWIND_INCLUDE_DIR and LIBUNWIND_LIBRARIES variables only in the advanced view
|
||||||
|
mark_as_advanced(LIBUNWIND_INCLUDE_DIR LIBUNWIND_LIBRARIES )
|
||||||
|
|
59
cmake/FindMiniupnpc.cmake
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
# --------------------------------- FindMiniupnpc Start ---------------------------------
|
||||||
|
# Locate miniupnp library
|
||||||
|
# This module defines
|
||||||
|
# MINIUPNP_FOUND, if false, do not try to link to miniupnp
|
||||||
|
# MINIUPNP_LIBRARY, the miniupnp variant
|
||||||
|
# MINIUPNP_INCLUDE_DIR, where to find miniupnpc.h and family)
|
||||||
|
# MINIUPNPC_VERSION_1_7_OR_HIGHER, set if we detect the version of miniupnpc is 1.7 or higher
|
||||||
|
#
|
||||||
|
# Note that the expected include convention is
|
||||||
|
# #include "miniupnpc.h"
|
||||||
|
# and not
|
||||||
|
# #include <miniupnpc/miniupnpc.h>
|
||||||
|
# This is because, the miniupnpc location is not standardized and may exist
|
||||||
|
# in locations other than miniupnpc/
|
||||||
|
|
||||||
|
if (MINIUPNP_INCLUDE_DIR AND MINIUPNP_LIBRARY)
|
||||||
|
# Already in cache, be silent
|
||||||
|
set(MINIUPNP_FIND_QUIETLY TRUE)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
find_path(MINIUPNP_INCLUDE_DIR miniupnpc.h
|
||||||
|
HINTS $ENV{MINIUPNP_INCLUDE_DIR}
|
||||||
|
PATH_SUFFIXES miniupnpc
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(MINIUPNP_LIBRARY miniupnpc
|
||||||
|
HINTS $ENV{MINIUPNP_LIBRARY}
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(MINIUPNP_STATIC_LIBRARY libminiupnpc.a
|
||||||
|
HINTS $ENV{MINIUPNP_STATIC_LIBRARY}
|
||||||
|
)
|
||||||
|
|
||||||
|
set(MINIUPNP_INCLUDE_DIRS ${MINIUPNP_INCLUDE_DIR})
|
||||||
|
set(MINIUPNP_LIBRARIES ${MINIUPNP_LIBRARY})
|
||||||
|
set(MINIUPNP_STATIC_LIBRARIES ${MINIUPNP_STATIC_LIBRARY})
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(
|
||||||
|
MiniUPnPc DEFAULT_MSG
|
||||||
|
MINIUPNP_INCLUDE_DIR
|
||||||
|
MINIUPNP_LIBRARY
|
||||||
|
)
|
||||||
|
|
||||||
|
IF(MINIUPNPC_FOUND)
|
||||||
|
file(STRINGS "${MINIUPNP_INCLUDE_DIR}/miniupnpc.h" MINIUPNPC_API_VERSION_STR REGEX "^#define[\t ]+MINIUPNPC_API_VERSION[\t ]+[0-9]+")
|
||||||
|
if(MINIUPNPC_API_VERSION_STR MATCHES "^#define[\t ]+MINIUPNPC_API_VERSION[\t ]+([0-9]+)")
|
||||||
|
set(MINIUPNPC_API_VERSION "${CMAKE_MATCH_1}")
|
||||||
|
if (${MINIUPNPC_API_VERSION} GREATER "10" OR ${MINIUPNPC_API_VERSION} EQUAL "10")
|
||||||
|
message(STATUS "Found miniupnpc API version " ${MINIUPNPC_API_VERSION})
|
||||||
|
set(MINIUPNP_FOUND true)
|
||||||
|
set(MINIUPNPC_VERSION_1_7_OR_HIGHER true)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
mark_as_advanced(MINIUPNP_INCLUDE_DIR MINIUPNP_LIBRARY MINIUPNP_STATIC_LIBRARY)
|
||||||
|
# --------------------------------- FindMiniupnpc End ---------------------------------
|
7
cmake/FindQREncode.cmake
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
find_path(QRENCODE_INCLUDE_DIR qrencode.h)
|
||||||
|
find_library(QRENCODE_LIBRARY qrencode)
|
||||||
|
|
||||||
|
mark_as_advanced(QRENCODE_LIBRARY QRENCODE_INCLUDE_DIR)
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(QREncode DEFAULT_MSG QRENCODE_LIBRARY QRENCODE_INCLUDE_DIR)
|
91
cmake/FindReadline.cmake
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
# - Try to find readline include dirs and libraries
|
||||||
|
#
|
||||||
|
# Usage of this module as follows:
|
||||||
|
#
|
||||||
|
# find_package(Readline)
|
||||||
|
#
|
||||||
|
# Variables used by this module, they can change the default behaviour and need
|
||||||
|
# to be set before calling find_package:
|
||||||
|
#
|
||||||
|
# Readline_ROOT_DIR Set this variable to the root installation of
|
||||||
|
# readline if the module has problems finding the
|
||||||
|
# proper installation path.
|
||||||
|
#
|
||||||
|
# Variables defined by this module:
|
||||||
|
#
|
||||||
|
# READLINE_FOUND System has readline, include and lib dirs found
|
||||||
|
# GNU_READLINE_FOUND Version of readline found is GNU readline, not libedit!
|
||||||
|
# LIBEDIT_FOUND Version of readline found is libedit, not GNU readline!
|
||||||
|
# Readline_INCLUDE_DIR The readline include directories.
|
||||||
|
# Readline_LIBRARY The readline library.
|
||||||
|
# GNU_READLINE_LIBRARY The GNU readline library or empty string.
|
||||||
|
# LIBEDIT_LIBRARY The libedit library or empty string.
|
||||||
|
|
||||||
|
find_path(Readline_ROOT_DIR
|
||||||
|
NAMES include/readline/readline.h
|
||||||
|
PATHS /usr/local/opt/readline/ /opt/local/ /usr/local/ /usr/
|
||||||
|
NO_DEFAULT_PATH
|
||||||
|
)
|
||||||
|
|
||||||
|
find_path(Readline_INCLUDE_DIR
|
||||||
|
NAMES readline/readline.h
|
||||||
|
PATHS ${Readline_ROOT_DIR}/include
|
||||||
|
NO_DEFAULT_PATH
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(Readline_LIBRARY
|
||||||
|
NAMES readline
|
||||||
|
PATHS ${Readline_ROOT_DIR}/lib
|
||||||
|
NO_DEFAULT_PATH
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(Termcap_LIBRARY
|
||||||
|
NAMES tinfo termcap ncursesw ncurses cursesw curses
|
||||||
|
)
|
||||||
|
|
||||||
|
if(Readline_INCLUDE_DIR AND Readline_LIBRARY)
|
||||||
|
set(READLINE_FOUND TRUE)
|
||||||
|
else(Readline_INCLUDE_DIR AND Readline_LIBRARY)
|
||||||
|
FIND_LIBRARY(Readline_LIBRARY NAMES readline PATHS Readline_ROOT_DIR)
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Readline DEFAULT_MSG Readline_INCLUDE_DIR Readline_LIBRARY )
|
||||||
|
MARK_AS_ADVANCED(Readline_INCLUDE_DIR Readline_LIBRARY)
|
||||||
|
endif(Readline_INCLUDE_DIR AND Readline_LIBRARY)
|
||||||
|
|
||||||
|
mark_as_advanced(
|
||||||
|
Readline_ROOT_DIR
|
||||||
|
Readline_INCLUDE_DIR
|
||||||
|
Readline_LIBRARY
|
||||||
|
)
|
||||||
|
|
||||||
|
set(CMAKE_REQUIRED_INCLUDES ${Readline_INCLUDE_DIR})
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES ${Readline_LIBRARY})
|
||||||
|
|
||||||
|
include(CheckFunctionExists)
|
||||||
|
check_function_exists(rl_copy_text HAVE_COPY_TEXT)
|
||||||
|
check_function_exists(rl_filename_completion_function HAVE_COMPLETION_FUNCTION)
|
||||||
|
|
||||||
|
if(NOT HAVE_COMPLETION_FUNCTION)
|
||||||
|
if (Readline_LIBRARY)
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES ${Readline_LIBRARY} ${Termcap_LIBRARY})
|
||||||
|
endif(Readline_LIBRARY)
|
||||||
|
check_function_exists(rl_copy_text HAVE_COPY_TEXT_TC)
|
||||||
|
check_function_exists(rl_filename_completion_function HAVE_COMPLETION_FUNCTION_TC)
|
||||||
|
set(HAVE_COMPLETION_FUNCTION ${HAVE_COMPLETION_FUNCTION_TC})
|
||||||
|
set(HAVE_COPY_TEXT ${HAVE_COPY_TEXT_TC})
|
||||||
|
if(HAVE_COMPLETION_FUNCTION)
|
||||||
|
set(Readline_LIBRARY ${Readline_LIBRARY} ${Termcap_LIBRARY})
|
||||||
|
endif(HAVE_COMPLETION_FUNCTION)
|
||||||
|
endif(NOT HAVE_COMPLETION_FUNCTION)
|
||||||
|
|
||||||
|
set(LIBEDIT_LIBRARY "")
|
||||||
|
set(GNU_READLINE_LIBRARY "")
|
||||||
|
|
||||||
|
if(HAVE_COMPLETION_FUNCTION AND HAVE_COPY_TEXT)
|
||||||
|
set(GNU_READLINE_FOUND TRUE)
|
||||||
|
set(GNU_READLINE_LIBRARY ${Readline_LIBRARY})
|
||||||
|
elseif(READLINE_FOUND AND NOT HAVE_COPY_TEXT)
|
||||||
|
set(LIBEDIT_FOUND TRUE)
|
||||||
|
set(LIBEDIT_LIBRARY ${Readline_LIBRARY})
|
||||||
|
endif(HAVE_COMPLETION_FUNCTION AND HAVE_COPY_TEXT)
|
||||||
|
|
291
cmake/FindSodium.cmake
Normal file
|
@ -0,0 +1,291 @@
|
||||||
|
# Written in 2016 by Henrik Steffen Gaßmann <henrik@gassmann.onl>
|
||||||
|
#
|
||||||
|
# To the extent possible under law, the author(s) have dedicated all copyright
|
||||||
|
# and related and neighboring rights to this software to the public domain
|
||||||
|
# worldwide. This software is distributed without any warranty.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the CC0 Public Domain Dedication along with
|
||||||
|
# this software. If not, see
|
||||||
|
#
|
||||||
|
# http://creativecommons.org/publicdomain/zero/1.0/
|
||||||
|
#
|
||||||
|
# ##############################################################################
|
||||||
|
# Tries to find the local libsodium installation.
|
||||||
|
#
|
||||||
|
# On Windows the sodium_DIR environment variable is used as a default hint which
|
||||||
|
# can be overridden by setting the corresponding cmake variable.
|
||||||
|
#
|
||||||
|
# Once done the following variables will be defined:
|
||||||
|
#
|
||||||
|
# sodium_FOUND sodium_INCLUDE_DIR sodium_LIBRARY_DEBUG sodium_LIBRARY_RELEASE
|
||||||
|
# sodium_VERSION_STRING
|
||||||
|
#
|
||||||
|
# Furthermore an imported "sodium" target is created.
|
||||||
|
#
|
||||||
|
|
||||||
|
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
||||||
|
set(_GCC_COMPATIBLE 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# static library option
|
||||||
|
if(NOT DEFINED sodium_USE_STATIC_LIBS)
|
||||||
|
option(sodium_USE_STATIC_LIBS "enable to statically link against sodium" OFF)
|
||||||
|
endif()
|
||||||
|
if(NOT (sodium_USE_STATIC_LIBS EQUAL sodium_USE_STATIC_LIBS_LAST))
|
||||||
|
unset(sodium_LIBRARY CACHE)
|
||||||
|
unset(sodium_LIBRARY_DEBUG CACHE)
|
||||||
|
unset(sodium_LIBRARY_RELEASE CACHE)
|
||||||
|
unset(sodium_DLL_DEBUG CACHE)
|
||||||
|
unset(sodium_DLL_RELEASE CACHE)
|
||||||
|
set(sodium_USE_STATIC_LIBS_LAST
|
||||||
|
${sodium_USE_STATIC_LIBS}
|
||||||
|
CACHE INTERNAL "internal change tracking variable")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ##############################################################################
|
||||||
|
# UNIX
|
||||||
|
if(UNIX)
|
||||||
|
# import pkg-config
|
||||||
|
find_package(PkgConfig QUIET)
|
||||||
|
if(PKG_CONFIG_FOUND)
|
||||||
|
pkg_check_modules(sodium_PKG QUIET libsodium)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(sodium_USE_STATIC_LIBS)
|
||||||
|
if(sodium_PKG_STATIC_LIBRARIES)
|
||||||
|
foreach(_libname ${sodium_PKG_STATIC_LIBRARIES})
|
||||||
|
if(NOT _libname MATCHES "^lib.*\\.a$") # ignore strings already ending
|
||||||
|
# with .a
|
||||||
|
list(INSERT sodium_PKG_STATIC_LIBRARIES 0 "lib${_libname}.a")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
list(REMOVE_DUPLICATES sodium_PKG_STATIC_LIBRARIES)
|
||||||
|
else()
|
||||||
|
# if pkgconfig for libsodium doesn't provide static lib info, then
|
||||||
|
# override PKG_STATIC here..
|
||||||
|
set(sodium_PKG_STATIC_LIBRARIES libsodium.a)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(XPREFIX sodium_PKG_STATIC)
|
||||||
|
else()
|
||||||
|
if(sodium_PKG_LIBRARIES STREQUAL "")
|
||||||
|
set(sodium_PKG_LIBRARIES sodium)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(XPREFIX sodium_PKG)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_path(sodium_INCLUDE_DIR sodium.h HINTS ${${XPREFIX}_INCLUDE_DIRS})
|
||||||
|
find_library(sodium_LIBRARY_DEBUG
|
||||||
|
NAMES ${${XPREFIX}_LIBRARIES}
|
||||||
|
HINTS ${${XPREFIX}_LIBRARY_DIRS})
|
||||||
|
find_library(sodium_LIBRARY_RELEASE
|
||||||
|
NAMES ${${XPREFIX}_LIBRARIES}
|
||||||
|
HINTS ${${XPREFIX}_LIBRARY_DIRS})
|
||||||
|
|
||||||
|
# ############################################################################
|
||||||
|
# Windows
|
||||||
|
elseif(WIN32)
|
||||||
|
set(sodium_DIR "$ENV{sodium_DIR}" CACHE FILEPATH "sodium install directory")
|
||||||
|
mark_as_advanced(sodium_DIR)
|
||||||
|
|
||||||
|
find_path(sodium_INCLUDE_DIR sodium.h
|
||||||
|
HINTS ${sodium_DIR}
|
||||||
|
PATH_SUFFIXES include)
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
# detect target architecture
|
||||||
|
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/arch.c" [=[
|
||||||
|
#if defined _M_IX86
|
||||||
|
#error ARCH_VALUE x86_32
|
||||||
|
#elif defined _M_X64
|
||||||
|
#error ARCH_VALUE x86_64
|
||||||
|
#endif
|
||||||
|
#error ARCH_VALUE unknown
|
||||||
|
]=])
|
||||||
|
try_compile(_UNUSED_VAR "${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/arch.c"
|
||||||
|
OUTPUT_VARIABLE _COMPILATION_LOG)
|
||||||
|
string(REGEX
|
||||||
|
REPLACE ".*ARCH_VALUE ([a-zA-Z0-9_]+).*"
|
||||||
|
"\\1"
|
||||||
|
_TARGET_ARCH
|
||||||
|
"${_COMPILATION_LOG}")
|
||||||
|
|
||||||
|
# construct library path
|
||||||
|
if(_TARGET_ARCH STREQUAL "x86_32")
|
||||||
|
string(APPEND _PLATFORM_PATH "Win32")
|
||||||
|
elseif(_TARGET_ARCH STREQUAL "x86_64")
|
||||||
|
string(APPEND _PLATFORM_PATH "x64")
|
||||||
|
else()
|
||||||
|
message(
|
||||||
|
FATAL_ERROR
|
||||||
|
"the ${_TARGET_ARCH} architecture is not supported by Findsodium.cmake."
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
string(APPEND _PLATFORM_PATH "/$$CONFIG$$")
|
||||||
|
|
||||||
|
if(MSVC_VERSION LESS 1900)
|
||||||
|
math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 60")
|
||||||
|
else()
|
||||||
|
math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 50")
|
||||||
|
endif()
|
||||||
|
string(APPEND _PLATFORM_PATH "/v${_VS_VERSION}")
|
||||||
|
|
||||||
|
if(sodium_USE_STATIC_LIBS)
|
||||||
|
string(APPEND _PLATFORM_PATH "/static")
|
||||||
|
else()
|
||||||
|
string(APPEND _PLATFORM_PATH "/dynamic")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(REPLACE "$$CONFIG$$"
|
||||||
|
"Debug"
|
||||||
|
_DEBUG_PATH_SUFFIX
|
||||||
|
"${_PLATFORM_PATH}")
|
||||||
|
string(REPLACE "$$CONFIG$$"
|
||||||
|
"Release"
|
||||||
|
_RELEASE_PATH_SUFFIX
|
||||||
|
"${_PLATFORM_PATH}")
|
||||||
|
|
||||||
|
find_library(sodium_LIBRARY_DEBUG libsodium.lib
|
||||||
|
HINTS ${sodium_DIR}
|
||||||
|
PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX})
|
||||||
|
find_library(sodium_LIBRARY_RELEASE libsodium.lib
|
||||||
|
HINTS ${sodium_DIR}
|
||||||
|
PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX})
|
||||||
|
if(NOT sodium_USE_STATIC_LIBS)
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES_BCK ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll")
|
||||||
|
find_library(sodium_DLL_DEBUG libsodium
|
||||||
|
HINTS ${sodium_DIR}
|
||||||
|
PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX})
|
||||||
|
find_library(sodium_DLL_RELEASE libsodium
|
||||||
|
HINTS ${sodium_DIR}
|
||||||
|
PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX})
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_BCK})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
elseif(_GCC_COMPATIBLE)
|
||||||
|
if(sodium_USE_STATIC_LIBS)
|
||||||
|
find_library(sodium_LIBRARY_DEBUG libsodium.a
|
||||||
|
HINTS ${sodium_DIR}
|
||||||
|
PATH_SUFFIXES lib)
|
||||||
|
find_library(sodium_LIBRARY_RELEASE libsodium.a
|
||||||
|
HINTS ${sodium_DIR}
|
||||||
|
PATH_SUFFIXES lib)
|
||||||
|
else()
|
||||||
|
find_library(sodium_LIBRARY_DEBUG libsodium.dll.a
|
||||||
|
HINTS ${sodium_DIR}
|
||||||
|
PATH_SUFFIXES lib)
|
||||||
|
find_library(sodium_LIBRARY_RELEASE libsodium.dll.a
|
||||||
|
HINTS ${sodium_DIR}
|
||||||
|
PATH_SUFFIXES lib)
|
||||||
|
|
||||||
|
file(GLOB _DLL
|
||||||
|
LIST_DIRECTORIES false
|
||||||
|
RELATIVE "${sodium_DIR}/bin"
|
||||||
|
"${sodium_DIR}/bin/libsodium*.dll")
|
||||||
|
find_library(sodium_DLL_DEBUG ${_DLL} libsodium
|
||||||
|
HINTS ${sodium_DIR}
|
||||||
|
PATH_SUFFIXES bin)
|
||||||
|
find_library(sodium_DLL_RELEASE ${_DLL} libsodium
|
||||||
|
HINTS ${sodium_DIR}
|
||||||
|
PATH_SUFFIXES bin)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "this platform is not supported by FindSodium.cmake")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ############################################################################
|
||||||
|
# unsupported
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "this platform is not supported by FindSodium.cmake")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ##############################################################################
|
||||||
|
# common stuff
|
||||||
|
|
||||||
|
# extract sodium version
|
||||||
|
if(sodium_INCLUDE_DIR)
|
||||||
|
set(_VERSION_HEADER "${sodium_INCLUDE_DIR}/sodium/version.h")
|
||||||
|
if(EXISTS "${_VERSION_HEADER}")
|
||||||
|
file(READ "${_VERSION_HEADER}" _VERSION_HEADER_CONTENT)
|
||||||
|
string(REGEX
|
||||||
|
REPLACE ".*define[ \t]+SODIUM_VERSION_STRING[^\"]+\"([^\"]+)\".*"
|
||||||
|
"\\1"
|
||||||
|
sodium_VERSION_STRING
|
||||||
|
"${_VERSION_HEADER_CONTENT}")
|
||||||
|
set(sodium_VERSION_STRING "${sodium_VERSION_STRING}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# communicate results
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(sodium
|
||||||
|
REQUIRED_VARS
|
||||||
|
sodium_LIBRARY_RELEASE
|
||||||
|
sodium_LIBRARY_DEBUG
|
||||||
|
sodium_INCLUDE_DIR
|
||||||
|
VERSION_VAR
|
||||||
|
sodium_VERSION_STRING)
|
||||||
|
|
||||||
|
# mark file paths as advanced
|
||||||
|
mark_as_advanced(sodium_INCLUDE_DIR)
|
||||||
|
mark_as_advanced(sodium_LIBRARY_DEBUG)
|
||||||
|
mark_as_advanced(sodium_LIBRARY_RELEASE)
|
||||||
|
if(WIN32)
|
||||||
|
mark_as_advanced(sodium_DLL_DEBUG)
|
||||||
|
mark_as_advanced(sodium_DLL_RELEASE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# create imported target
|
||||||
|
if(sodium_USE_STATIC_LIBS)
|
||||||
|
set(_LIB_TYPE STATIC)
|
||||||
|
else()
|
||||||
|
set(_LIB_TYPE SHARED)
|
||||||
|
endif()
|
||||||
|
add_library(sodium ${_LIB_TYPE} IMPORTED)
|
||||||
|
|
||||||
|
set_target_properties(sodium
|
||||||
|
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
|
||||||
|
"${sodium_INCLUDE_DIR}"
|
||||||
|
IMPORTED_LINK_INTERFACE_LANGUAGES
|
||||||
|
"C")
|
||||||
|
|
||||||
|
if(sodium_USE_STATIC_LIBS)
|
||||||
|
set_target_properties(sodium
|
||||||
|
PROPERTIES INTERFACE_COMPILE_DEFINITIONS
|
||||||
|
"SODIUM_STATIC"
|
||||||
|
IMPORTED_LOCATION
|
||||||
|
"${sodium_LIBRARY_RELEASE}"
|
||||||
|
IMPORTED_LOCATION_DEBUG
|
||||||
|
"${sodium_LIBRARY_DEBUG}")
|
||||||
|
else()
|
||||||
|
if(UNIX)
|
||||||
|
set_target_properties(sodium
|
||||||
|
PROPERTIES IMPORTED_LOCATION
|
||||||
|
"${sodium_LIBRARY_RELEASE}"
|
||||||
|
IMPORTED_LOCATION_DEBUG
|
||||||
|
"${sodium_LIBRARY_DEBUG}")
|
||||||
|
elseif(WIN32)
|
||||||
|
set_target_properties(sodium
|
||||||
|
PROPERTIES IMPORTED_IMPLIB
|
||||||
|
"${sodium_LIBRARY_RELEASE}"
|
||||||
|
IMPORTED_IMPLIB_DEBUG
|
||||||
|
"${sodium_LIBRARY_DEBUG}")
|
||||||
|
if(NOT (sodium_DLL_DEBUG MATCHES ".*-NOTFOUND"))
|
||||||
|
set_target_properties(sodium
|
||||||
|
PROPERTIES IMPORTED_LOCATION_DEBUG
|
||||||
|
"${sodium_DLL_DEBUG}")
|
||||||
|
endif()
|
||||||
|
if(NOT (sodium_DLL_RELEASE MATCHES ".*-NOTFOUND"))
|
||||||
|
set_target_properties(sodium
|
||||||
|
PROPERTIES IMPORTED_LOCATION_RELWITHDEBINFO
|
||||||
|
"${sodium_DLL_RELEASE}"
|
||||||
|
IMPORTED_LOCATION_MINSIZEREL
|
||||||
|
"${sodium_DLL_RELEASE}"
|
||||||
|
IMPORTED_LOCATION_RELEASE
|
||||||
|
"${sodium_DLL_RELEASE}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
40
cmake/FindUnbound.cmake
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
# Copyright (c) 2014-2019, The Monero Project
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
# permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
# conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
# of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
# materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||||
|
# used to endorse or promote products derived from this software without specific
|
||||||
|
# prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
MESSAGE(STATUS "Looking for libunbound")
|
||||||
|
|
||||||
|
FIND_PATH(UNBOUND_INCLUDE_DIR
|
||||||
|
NAMES unbound.h
|
||||||
|
PATH_SUFFIXES include/ include/unbound/
|
||||||
|
PATHS "${PROJECT_SOURCE_DIR}"
|
||||||
|
${UNBOUND_ROOT}
|
||||||
|
$ENV{UNBOUND_ROOT}
|
||||||
|
/usr/local/
|
||||||
|
/usr/
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(UNBOUND_LIBRARIES unbound)
|
22
cmake/FindZBar0.cmake
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
# from http://code.google.com/p/low-cost-vision-2012/source/browse/CMakeModules/FindZBar0.cmake?name=2-helium-1&r=d61f248bd5565b3c086bf4769a04bfd98f7079df
|
||||||
|
# - Try to find ZBar
|
||||||
|
# This will define
|
||||||
|
#
|
||||||
|
# ZBAR_FOUND -
|
||||||
|
# ZBAR_LIBRARY_DIR -
|
||||||
|
# ZBAR_INCLUDE_DIR -
|
||||||
|
# ZBAR_LIBRARIES -
|
||||||
|
#
|
||||||
|
|
||||||
|
find_package(PkgConfig)
|
||||||
|
pkg_check_modules(PC_ZBAR QUIET zbar)
|
||||||
|
set(ZBAR_DEFINITIONS ${PC_ZBAR_CFLAGS_OTHER})
|
||||||
|
find_library(ZBAR_LIBRARIES NAMES zbar
|
||||||
|
HINTS ${PC_ZBAR_LIBDIR} ${PC_ZBAR_LIBRARY_DIRS} )
|
||||||
|
find_path(ZBAR_INCLUDE_DIR Decoder.h
|
||||||
|
HINTS ${PC_ZBAR_INCLUDEDIR} ${PC_ZBAR_INCLUDE_DIRS}
|
||||||
|
PATH_SUFFIXES zbar )
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(ZBAR DEFAULT_MSG ZBAR_LIBRARIES ZBAR_INCLUDE_DIR)
|
||||||
|
message(STATUS "Found zbar libraries ${ZBAR_LIBRARIES}")
|
||||||
|
|
65
cmake/GenVersion.cmake
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
# Copyright (c) 2014-2019, The Monero Project
|
||||||
|
#
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
# permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
# conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
# of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
# materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||||
|
# used to endorse or promote products derived from this software without specific
|
||||||
|
# prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
# Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
|
||||||
|
# Check what commit we're on
|
||||||
|
execute_process(COMMAND "${GIT}" rev-parse --short=9 HEAD RESULT_VARIABLE RET OUTPUT_VARIABLE COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
if(RET)
|
||||||
|
# Something went wrong, set the version tag to -unknown
|
||||||
|
|
||||||
|
message(WARNING "Cannot determine current commit. Make sure that you are building either from a Git working tree or from a source archive.")
|
||||||
|
set(VERSIONTAG "unknown")
|
||||||
|
set(VERSION_IS_RELEASE "false")
|
||||||
|
configure_file("monero/src/version.cpp.in" "${TO}")
|
||||||
|
else()
|
||||||
|
string(SUBSTRING ${COMMIT} 0 9 COMMIT)
|
||||||
|
message(STATUS "You are currently on commit ${COMMIT}")
|
||||||
|
|
||||||
|
# Get all the tags
|
||||||
|
execute_process(COMMAND "${GIT}" rev-list --tags --max-count=1 --abbrev-commit RESULT_VARIABLE RET OUTPUT_VARIABLE TAGGEDCOMMIT OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
|
||||||
|
if(NOT TAGGEDCOMMIT)
|
||||||
|
message(WARNING "Cannot determine most recent tag. Make sure that you are building either from a Git working tree or from a source archive.")
|
||||||
|
set(VERSIONTAG "${COMMIT}")
|
||||||
|
set(VERSION_IS_RELEASE "false")
|
||||||
|
else()
|
||||||
|
message(STATUS "The most recent tag was at ${TAGGEDCOMMIT}")
|
||||||
|
|
||||||
|
# Check if we're building that tagged commit or a different one
|
||||||
|
if(COMMIT STREQUAL TAGGEDCOMMIT)
|
||||||
|
message(STATUS "You are building a tagged release")
|
||||||
|
set(VERSIONTAG "release")
|
||||||
|
set(VERSION_IS_RELEASE "true")
|
||||||
|
else()
|
||||||
|
message(STATUS "You are ahead of or behind a tagged release")
|
||||||
|
set(VERSIONTAG "${COMMIT}")
|
||||||
|
set(VERSION_IS_RELEASE "false")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
configure_file("monero/src/version.cpp.in" "${TO}")
|
||||||
|
endif()
|
53
cmake/Version.cmake
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
# Copyright (c) 2014-2017, The Monero Project
|
||||||
|
#
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
# permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
# conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
# of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
# materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||||
|
# used to endorse or promote products derived from this software without specific
|
||||||
|
# prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
function (write_static_version_header hash)
|
||||||
|
set(VERSIONTAG "${hash}")
|
||||||
|
configure_file("${CMAKE_SOURCE_DIR}/monero/src/version.cpp.in" "${CMAKE_BINARY_DIR}/version.cpp")
|
||||||
|
endfunction ()
|
||||||
|
|
||||||
|
find_package(Git QUIET)
|
||||||
|
if ("$Format:$" STREQUAL "")
|
||||||
|
# We're in a tarball; use hard-coded variables.
|
||||||
|
write_static_version_header("release")
|
||||||
|
elseif (GIT_FOUND OR Git_FOUND)
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT "${CMAKE_BINARY_DIR}/version.cpp"
|
||||||
|
COMMAND "${CMAKE_COMMAND}"
|
||||||
|
"-D" "GIT=${GIT_EXECUTABLE}"
|
||||||
|
"-D" "TO=${CMAKE_BINARY_DIR}/version.cpp"
|
||||||
|
"-P" "cmake/GenVersion.cmake"
|
||||||
|
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
|
||||||
|
|
||||||
|
else()
|
||||||
|
message(STATUS "WARNING: Git was not found!")
|
||||||
|
write_static_version_header("unknown")
|
||||||
|
endif ()
|
||||||
|
add_custom_target(genversion ALL
|
||||||
|
DEPENDS "${CMAKE_BINARY_DIR}/version.cpp")
|
||||||
|
|
39
cmake/VersionFeather.cmake
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
# SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
# Copyright (c) 2020, The Monero Project.
|
||||||
|
|
||||||
|
find_package(Git QUIET)
|
||||||
|
|
||||||
|
# Check what commit we're on
|
||||||
|
execute_process(COMMAND "${GIT_EXECUTABLE}" rev-parse --short=9 HEAD RESULT_VARIABLE RET OUTPUT_VARIABLE COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
|
||||||
|
if(RET)
|
||||||
|
# Something went wrong, set the version tag to -unknown
|
||||||
|
|
||||||
|
message(WARNING "Cannot determine current commit. Make sure that you are building either from a Git working tree or from a source archive.")
|
||||||
|
set(FEATHER_BRANCH "unknown")
|
||||||
|
configure_file("cmake/config-feather.h.cmake" "${CMAKE_CURRENT_SOURCE_DIR}/src/config-feather.h")
|
||||||
|
else()
|
||||||
|
string(SUBSTRING ${COMMIT} 0 9 COMMIT)
|
||||||
|
message(STATUS "You are currently on commit ${COMMIT}")
|
||||||
|
|
||||||
|
# Get all the tags
|
||||||
|
execute_process(COMMAND "${GIT}" rev-list --tags --max-count=1 --abbrev-commit RESULT_VARIABLE RET OUTPUT_VARIABLE TAGGEDCOMMIT OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
|
||||||
|
if(NOT TAGGEDCOMMIT)
|
||||||
|
message(STATUS "Cannot determine most recent tag. Make sure that you are building either from a Git working tree or from a source archive.")
|
||||||
|
set(FEATHER_BRANCH "${COMMIT}")
|
||||||
|
else()
|
||||||
|
message(STATUS "The most recent tag was at ${TAGGEDCOMMIT}")
|
||||||
|
|
||||||
|
# Check if we're building that tagged commit or a different one
|
||||||
|
if(COMMIT STREQUAL TAGGEDCOMMIT)
|
||||||
|
message(STATUS "You are building a tagged release")
|
||||||
|
set(FEATHER_BRANCH "release")
|
||||||
|
else()
|
||||||
|
message(STATUS "You are ahead of or behind a tagged release")
|
||||||
|
set(FEATHER_BRANCH "${COMMIT}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
configure_file("cmake/config-feather.h.cmake" "${CMAKE_CURRENT_SOURCE_DIR}/src/config-feather.h")
|
||||||
|
endif()
|
49
cmake/VersionMonero.cmake
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
# SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
# Copyright (c) 2020, The Monero Project.
|
||||||
|
|
||||||
|
find_package(Git QUIET)
|
||||||
|
# Check what commit we're on
|
||||||
|
execute_process(COMMAND "${GIT_EXECUTABLE}" rev-parse --short=9 HEAD RESULT_VARIABLE RET OUTPUT_VARIABLE COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/monero)
|
||||||
|
|
||||||
|
if(RET)
|
||||||
|
# Something went wrong, set the version tag to -unknown
|
||||||
|
|
||||||
|
message(WARNING "Cannot determine current commit. Make sure that you are building either from a Git working tree or from a source archive.")
|
||||||
|
set(MONERO_BRANCH "unknown")
|
||||||
|
else()
|
||||||
|
string(SUBSTRING ${COMMIT} 0 9 COMMIT)
|
||||||
|
message(STATUS "You are currently on commit ${COMMIT}")
|
||||||
|
|
||||||
|
# Get all the tags
|
||||||
|
execute_process(COMMAND "${GIT}" rev-list --tags --max-count=1 --abbrev-commit RESULT_VARIABLE RET OUTPUT_VARIABLE TAGGEDCOMMIT OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
|
||||||
|
if(NOT TAGGEDCOMMIT)
|
||||||
|
message(STATUS "Cannot determine most recent tag. Make sure that you are building either from a Git working tree or from a source archive.")
|
||||||
|
set(MONERO_BRANCH "${COMMIT}")
|
||||||
|
else()
|
||||||
|
message(STATUS "The most recent tag was at ${TAGGEDCOMMIT}")
|
||||||
|
|
||||||
|
# Check if we're building that tagged commit or a different one
|
||||||
|
if(COMMIT STREQUAL TAGGEDCOMMIT)
|
||||||
|
message(STATUS "You are building a tagged release")
|
||||||
|
set(MONERO_BRANCH "release")
|
||||||
|
else()
|
||||||
|
message(STATUS "You are ahead of or behind a tagged release")
|
||||||
|
set(MONERO_BRANCH "${COMMIT}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Check latest tagged release
|
||||||
|
execute_process(COMMAND "${GIT_EXECUTABLE}" describe --abbrev=0 RESULT_VARIABLE RET OUTPUT_VARIABLE TAG OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/monero)
|
||||||
|
|
||||||
|
if(RET)
|
||||||
|
message(WARNING "Cannot determine most recent tag. Make sure that you are building either from a Git working tree or from a source archive.")
|
||||||
|
set(MONERO_VERSION "unknown")
|
||||||
|
else ()
|
||||||
|
set(MONERO_VERSION "${TAG}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
configure_file("cmake/config-feather.h.cmake" "${CMAKE_CURRENT_SOURCE_DIR}/src/config-feather.h")
|
10
cmake/config-feather.h.cmake
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#ifndef FEATHER_VERSION_H
|
||||||
|
#define FEATHER_VERSION_H
|
||||||
|
|
||||||
|
#define FEATHER_VERSION "@VERSION@"
|
||||||
|
#define FEATHER_BRANCH "@FEATHER_BRANCH@"
|
||||||
|
|
||||||
|
#define MONERO_VERSION "@MONERO_VERSION@"
|
||||||
|
#define MONERO_BRANCH "@MONERO_BRANCH@"
|
||||||
|
|
||||||
|
#endif //FEATHER_VERSION_H
|
43
cmake/test-protobuf.cpp
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
// Copyright (c) 2014-2019, The Monero Project
|
||||||
|
//
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
// permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
// conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
// of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
// materials provided with the distribution.
|
||||||
|
//
|
||||||
|
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||||
|
// used to endorse or promote products derived from this software without specific
|
||||||
|
// prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||||
|
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include <google/protobuf/message.h>
|
||||||
|
#include <google/protobuf/unknown_field_set.h>
|
||||||
|
#include "test-protobuf.pb.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
google::protobuf::UnknownFieldSet ufs;
|
||||||
|
ufs.ClearAndFreeMemory();
|
||||||
|
|
||||||
|
Success sc;
|
||||||
|
sc.set_message("test");
|
||||||
|
sc.SerializeToOstream(&std::cerr);
|
||||||
|
return 0;
|
||||||
|
}
|
7
cmake/test-protobuf.proto
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
syntax = "proto2";
|
||||||
|
|
||||||
|
import "google/protobuf/descriptor.proto";
|
||||||
|
|
||||||
|
message Success {
|
||||||
|
optional string message = 1;
|
||||||
|
}
|
34
cmake/test-static-assert.c
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
// Copyright (c) 2014-2019, The Monero Project
|
||||||
|
//
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
// permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
// conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
// of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
// materials provided with the distribution.
|
||||||
|
//
|
||||||
|
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||||
|
// used to endorse or promote products derived from this software without specific
|
||||||
|
// prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||||
|
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
static_assert(1, "FAIL");
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
return 0;
|
||||||
|
}
|
34
cmake/test-static-assert.cpp
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
// Copyright (c) 2014-2019, The Monero Project
|
||||||
|
//
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
// permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
// conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
// of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
// materials provided with the distribution.
|
||||||
|
//
|
||||||
|
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||||
|
// used to endorse or promote products derived from this software without specific
|
||||||
|
// prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||||
|
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
static_assert(1, "FAIL");
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
return 0;
|
||||||
|
}
|
2015
contrib/Qt5.15_LinuxPatch.json
Normal file
40
contrib/build-appimage.sh
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
function verify_hash() {
|
||||||
|
local file=$1 expected_hash=$2
|
||||||
|
actual_hash=$(sha256sum $file | awk '{print $1}')
|
||||||
|
if [ "$actual_hash" == "$expected_hash" ]; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "$file $actual_hash (unexpected hash)" >&2
|
||||||
|
rm "$file"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function download_if_not_exist() {
|
||||||
|
local file_name=$1 url=$2
|
||||||
|
if [ ! -e $file_name ] ; then
|
||||||
|
wget -q -O $file_name "$url"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
APPDIR="$PWD/feather.AppDir"
|
||||||
|
mkdir -p "$APPDIR"
|
||||||
|
mkdir -p "$APPDIR/usr/share/applications/"
|
||||||
|
mkdir -p "$APPDIR/usr/bin"
|
||||||
|
|
||||||
|
echo "Downloading dependencies"
|
||||||
|
|
||||||
|
download_if_not_exist "feather.zip" "https://build.featherwallet.org/files/linux-release/$BRANCH/$FN"
|
||||||
|
unzip -q feather.zip
|
||||||
|
|
||||||
|
cp "$PWD/src/assets/feather.desktop" "$APPDIR/usr/share/applications/feather.desktop"
|
||||||
|
cp "$PWD/src/assets/images/appicons/64x64.png" "$APPDIR/feather.png"
|
||||||
|
cp "$PWD/feather" "$APPDIR/usr/bin/feather"
|
||||||
|
|
||||||
|
/appimagetool deploy "$APPDIR/usr/share/applications/feather.desktop"
|
||||||
|
VERSION=1.0 /appimagetool ./feather.AppDir
|
||||||
|
|
126
contrib/build_tor.sh
Executable file
|
@ -0,0 +1,126 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# this file is used by feather's CMake
|
||||||
|
# arguments: ./build.tor $TAG $ROOT_FEATHER_DIR
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
ERR_WIN="This script does not work on Windows"
|
||||||
|
if [[ "$OSTYPE" == "msys" ]]; then
|
||||||
|
echo "$ERR_WIN"
|
||||||
|
exit 1
|
||||||
|
elif [[ "$OSTYPE" == "win32" ]]; then
|
||||||
|
echo "$ERR_WIN"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
TOR_TAG="$1"
|
||||||
|
ROOT_DIR="$2"
|
||||||
|
STATIC="$3"
|
||||||
|
TOR_DIR="$ROOT_DIR/contrib/tor"
|
||||||
|
TORSOCKS_DIR="$ROOT_DIR/contrib/torsocks"
|
||||||
|
TARGET_DIR="$ROOT_DIR/src/tor"
|
||||||
|
|
||||||
|
CPU_CORE_COUNT="$(nproc)"
|
||||||
|
|
||||||
|
#
|
||||||
|
### tor
|
||||||
|
#
|
||||||
|
|
||||||
|
pushd "$TOR_DIR"
|
||||||
|
|
||||||
|
rm -rf "$TOR_DIR/build"
|
||||||
|
mkdir -p "$TOR_DIR/build"
|
||||||
|
|
||||||
|
# configure
|
||||||
|
git -C "$TOR_DIR" fetch
|
||||||
|
git -C "$TOR_DIR" checkout tor-0.4.3.5
|
||||||
|
bash "$TOR_DIR/autogen.sh"
|
||||||
|
|
||||||
|
if [[ "$STATIC" = "ON" ]]; then
|
||||||
|
# static assumes that openssl has been compiled with:
|
||||||
|
# CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./config no-asm no-shared no-zlib-dynamic --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
|
||||||
|
# and libevent with:
|
||||||
|
# cmake -DEVENT_LIBRARY_STATIC=ON -DOPENSSL_ROOT_DIR=/usr/local/openssl -DCMAKE_INSTALL_PREFIX=/usr/local/libevent
|
||||||
|
# and zlib with:
|
||||||
|
# CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --static --prefix=/usr/local/zlib
|
||||||
|
|
||||||
|
LDFLAGS="-L/usr/local/openssl/lib/" LIBS="-lssl -lcrypto -lpthread -ldl" CPPFLAGS="-I/usr/local/openssl/include/" ./configure \
|
||||||
|
--enable-static-zlib \
|
||||||
|
--enable-static-openssl \
|
||||||
|
--enable-static-libevent \
|
||||||
|
--disable-system-torrc \
|
||||||
|
--with-libevent-dir=/usr/local/libevent \
|
||||||
|
--with-openssl-dir=/usr/local/openssl/ \
|
||||||
|
--with-zlib-dir=/usr/local/zlib \
|
||||||
|
--disable-system-torrc \
|
||||||
|
--disable-tool-name-check \
|
||||||
|
--disable-systemd \
|
||||||
|
--disable-lzma \
|
||||||
|
--disable-unittests \
|
||||||
|
--disable-zstd \
|
||||||
|
--disable-seccomp \
|
||||||
|
--disable-asciidoc \
|
||||||
|
--disable-manpage \
|
||||||
|
--disable-html-manual \
|
||||||
|
--disable-system-torrc \
|
||||||
|
--prefix="$TOR_DIR/build"
|
||||||
|
else
|
||||||
|
bash "$TOR_DIR/configure" \
|
||||||
|
--disable-tool-name-check \
|
||||||
|
--disable-systemd \
|
||||||
|
--disable-lzma \
|
||||||
|
--disable-unittests \
|
||||||
|
--disable-zstd \
|
||||||
|
--disable-asciidoc \
|
||||||
|
--disable-manpage \
|
||||||
|
--disable-html-manual \
|
||||||
|
--prefix="$TOR_DIR/build"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# build
|
||||||
|
make -j "$CPU_CORE_COUNT"
|
||||||
|
make install -j "$CPU_CORE_COUNT"
|
||||||
|
|
||||||
|
# copy to lib/tor
|
||||||
|
cp "$TOR_DIR/build/bin/tor" "$TARGET_DIR"
|
||||||
|
cp "$TOR_DIR/build/etc/tor/torrc.sample"* "$TARGET_DIR"
|
||||||
|
|
||||||
|
#
|
||||||
|
### torsocks
|
||||||
|
#
|
||||||
|
|
||||||
|
pushd "$TORSOCKS_DIR"
|
||||||
|
mkdir -p "$TORSOCKS_DIR/build"
|
||||||
|
|
||||||
|
# configure
|
||||||
|
bash "$TORSOCKS_DIR/autogen.sh"
|
||||||
|
bash "$TORSOCKS_DIR/configure" --prefix="$TORSOCKS_DIR/build"
|
||||||
|
|
||||||
|
# build
|
||||||
|
make -j "$CPU_CORE_COUNT"
|
||||||
|
make install -j "$CPU_CORE_COUNT"
|
||||||
|
|
||||||
|
# copy to lib/torsocks
|
||||||
|
cp "$TORSOCKS_DIR/build/lib/torsocks/"* "$TARGET_DIR"
|
||||||
|
cp "$TORSOCKS_DIR/build/bin/"* "$TARGET_DIR"
|
||||||
|
cp "$TORSOCKS_DIR/build/etc/tor/"* "$TARGET_DIR"
|
||||||
|
|
||||||
|
#
|
||||||
|
### verify installation
|
||||||
|
#
|
||||||
|
|
||||||
|
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
||||||
|
for fn in "$TARGET_DIR/libtorsocks.so" "$TARGET_DIR/tor"; do
|
||||||
|
if [[ ! -f "$fn" ]]; then
|
||||||
|
echo "[*] Failed to install tor or torsocks: no such file $fn"
|
||||||
|
exit 1
|
||||||
|
fi; done
|
||||||
|
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
||||||
|
for fn in "$TARGET_DIR/libtorsocks.dylib" "$TARGET_DIR/tor"; do
|
||||||
|
if [[ ! -f "$fn" ]]; then
|
||||||
|
echo "[*] Failed to install tor or torsocks: no such file $fn"
|
||||||
|
exit 1
|
||||||
|
fi; done
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[*] Compiled tor/torsocks into $TARGET_DIR"
|
1
contrib/tor
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit e68770719ef4d3d3b83398715b1e10391ab6a1b4
|
1
contrib/torsocks
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 4c00ec8773fd63fa48ef49e1ccf2adac598427be
|
53
contrib/torsocks_macos.patch
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
From fc5eafeb2886605d4de1546846f06a12a18c87ef Mon Sep 17 00:00:00 2001
|
||||||
|
From: "J.W" <jakwings@gmail.com>
|
||||||
|
Date: Mon, 22 Apr 2019 05:19:32 +0100
|
||||||
|
Subject: [PATCH 1/2] Fix macros for accept4(2)
|
||||||
|
|
||||||
|
Both accept(2) and accept4(2) exist on linux but accept4(2) does not
|
||||||
|
exist on macos 10.11.6 (and maybe other distros).
|
||||||
|
---
|
||||||
|
src/lib/torsocks.c | 9 ++++++++-
|
||||||
|
src/lib/torsocks.h | 4 +++-
|
||||||
|
2 files changed, 11 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/lib/torsocks.c b/src/lib/torsocks.c
|
||||||
|
index 16f2da0..9527513 100644
|
||||||
|
--- a/src/lib/torsocks.c
|
||||||
|
+++ b/src/lib/torsocks.c
|
||||||
|
@@ -234,9 +234,16 @@ static void init_libc_symbols(void)
|
||||||
|
tsocks_libc_socket = dlsym(libc_ptr, LIBC_SOCKET_NAME_STR);
|
||||||
|
tsocks_libc_syscall = dlsym(libc_ptr, LIBC_SYSCALL_NAME_STR);
|
||||||
|
tsocks_libc_execve = dlsym(libc_ptr, LIBC_EXECVE_NAME_STR);
|
||||||
|
+ tsocks_libc_accept = dlsym(libc_ptr, LIBC_ACCEPT_NAME_STR);
|
||||||
|
+#if (defined(__linux__))
|
||||||
|
tsocks_libc_accept4 = dlsym(libc_ptr, LIBC_ACCEPT4_NAME_STR);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
if (!tsocks_libc_connect || !tsocks_libc_close || !tsocks_libc_socket ||
|
||||||
|
- !tsocks_libc_syscall || !tsocks_libc_execve || ! tsocks_libc_accept4) {
|
||||||
|
+#if (defined(__linux__))
|
||||||
|
+ !tsocks_libc_accept4 ||
|
||||||
|
+#endif
|
||||||
|
+ !tsocks_libc_syscall || !tsocks_libc_execve || ! tsocks_libc_accept) {
|
||||||
|
ERR("Unable to lookup symbols in " LIBC_NAME "(%s)", dlerror());
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
diff --git a/src/lib/torsocks.h b/src/lib/torsocks.h
|
||||||
|
index 33da526..bf9109d 100644
|
||||||
|
--- a/src/lib/torsocks.h
|
||||||
|
+++ b/src/lib/torsocks.h
|
||||||
|
@@ -30,8 +30,10 @@
|
||||||
|
* libc call outside of torsocks can be used. These are declared for each
|
||||||
|
* symbol torsocks hijacked.
|
||||||
|
*/
|
||||||
|
+#define TSOCKS_LIBC_FUNC(name) \
|
||||||
|
+ tsocks_libc_##name
|
||||||
|
#define TSOCKS_LIBC_DECL(name, type, sig) \
|
||||||
|
- type (*tsocks_libc_##name)(sig);
|
||||||
|
+ type (*TSOCKS_LIBC_FUNC(name))(sig);
|
||||||
|
#define TSOCKS_DECL(name, type, sig) \
|
||||||
|
extern type tsocks_##name(sig);
|
||||||
|
|
||||||
|
--
|
||||||
|
2.21.0
|
||||||
|
|
18
contrib/unbound_static.patch
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
diff --git a/configure_checks.cmake b/configure_checks.cmake
|
||||||
|
index c31b3f33..50b3305d 100644
|
||||||
|
--- a/configure_checks.cmake
|
||||||
|
+++ b/configure_checks.cmake
|
||||||
|
@@ -202,10 +202,10 @@ check_symbol_exists(NID_X9_62_prime256v1 "openssl/evp.h" HAVE_DECL_NID_X9_62_PRI
|
||||||
|
check_symbol_exists(sk_SSL_COMP_pop_free "openssl/ssl.h" HAVE_DECL_SK_SSL_COMP_POP_FREE)
|
||||||
|
check_symbol_exists(SSL_COMP_get_compression_methods "openssl/ssl.h" HAVE_DECL_SSL_COMP_GET_COMPRESSION_METHODS)
|
||||||
|
|
||||||
|
-check_function_exists(EVP_MD_CTX_new HAVE_EVP_MD_CTX_NEW)
|
||||||
|
+set(HAVE_EVP_MD_CTX_NEW 1)
|
||||||
|
check_function_exists(EVP_sha1 HAVE_EVP_SHA1)
|
||||||
|
-check_function_exists(EVP_sha256 HAVE_EVP_SHA256)
|
||||||
|
-check_function_exists(EVP_sha512 HAVE_EVP_SHA512)
|
||||||
|
+set(HAVE_EVP_SHA256 1)
|
||||||
|
+set(HAVE_EVP_SHA512 1)
|
||||||
|
check_function_exists(FIPS_mode HAVE_FIPS_MODE)
|
||||||
|
check_function_exists(HMAC_Update HAVE_HMAC_UPDATE)
|
||||||
|
check_function_exists(OPENSSL_config HAVE_OPENSSL_CONFIG)
|
1
monero
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit a1404e92cb439ba0f120e7c4a579ed0b9a0372a4
|
216
src/CMakeLists.txt
Normal file
|
@ -0,0 +1,216 @@
|
||||||
|
set(CMAKE_AUTOMOC ON)
|
||||||
|
set(CMAKE_AUTORCC ON)
|
||||||
|
set(CMAKE_AUTOUIC ON)
|
||||||
|
|
||||||
|
# pthread
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
|
find_package(Qt5 REQUIRED COMPONENTS Core Widgets Gui Network Svg Xml WebSockets)
|
||||||
|
|
||||||
|
add_subdirectory(libwalletqt)
|
||||||
|
add_subdirectory(model)
|
||||||
|
add_subdirectory(utils)
|
||||||
|
add_subdirectory(openpgp)
|
||||||
|
|
||||||
|
qt5_add_resources(RESOURCES assets.qrc)
|
||||||
|
|
||||||
|
# Compile source files (.h/.cpp)
|
||||||
|
file(GLOB SOURCE_FILES
|
||||||
|
"*.h"
|
||||||
|
"*.cpp"
|
||||||
|
"utils/*.h"
|
||||||
|
"utils/*.cpp"
|
||||||
|
"libwalletqt/*.h"
|
||||||
|
"libwalletqt/*.cpp"
|
||||||
|
"daemon/*.h"
|
||||||
|
"daemon/*.cpp"
|
||||||
|
"model/*.h"
|
||||||
|
"model/*.cpp"
|
||||||
|
"qt/*.h"
|
||||||
|
"qt/*.cpp"
|
||||||
|
"ui/qdarkstyle/style.qrc"
|
||||||
|
"ui/BreezeStyleSheets/breeze.qrc"
|
||||||
|
"widgets/*.h"
|
||||||
|
"widgets/*.cpp"
|
||||||
|
"wizard/*.h"
|
||||||
|
"wizard/*.cpp"
|
||||||
|
"wallet/*.h"
|
||||||
|
"wallet/*.cpp"
|
||||||
|
"qrcode/*.h"
|
||||||
|
"qrcode/*.cpp"
|
||||||
|
"dialog/*.h"
|
||||||
|
"dialog/*.cpp"
|
||||||
|
)
|
||||||
|
|
||||||
|
if(APPLE AND BUILD_TOR)
|
||||||
|
set(ASSETS_OS "assets_macos_tor.qrc")
|
||||||
|
elseif(UNIX AND NOT APPLE AND BUILD_TOR)
|
||||||
|
set(ASSETS_OS "assets_linux_tor.qrc")
|
||||||
|
elseif(MINGW AND BUILD_TOR)
|
||||||
|
set(ASSETS_OS "assets_windows_tor.qrc")
|
||||||
|
else()
|
||||||
|
message(STATUS "Building without embedded Tor")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(EXECUTABLE_FLAG)
|
||||||
|
if(MINGW)
|
||||||
|
set(EXECUTABLE_FLAG WIN32)
|
||||||
|
|
||||||
|
set(ICON ${PROJECT_SOURCE_DIR}/src/assets/images/appicons/appicon.ico)
|
||||||
|
set(ICON_RC ${CMAKE_CURRENT_BINARY_DIR}/icon.rc)
|
||||||
|
set(ICON_RES ${CMAKE_CURRENT_BINARY_DIR}/icon.o)
|
||||||
|
file(WRITE ${ICON_RC} "IDI_ICON1 ICON DISCARDABLE \"${ICON}\"")
|
||||||
|
add_custom_command(OUTPUT ${ICON_RES} COMMAND windres ${ICON_RC} ${ICON_RES} MAIN_DEPENDENCY ${ICON_RC})
|
||||||
|
list(APPEND RESOURCES ${ICON_RES})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# mac os bundle
|
||||||
|
if(APPLE)
|
||||||
|
set(ICON ${PROJECT_SOURCE_DIR}/src/assets/images/appicons/appicon.icns)
|
||||||
|
set_source_files_properties(${ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
|
||||||
|
list(APPEND RESOURCES ${ICON})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_executable(feather ${EXECUTABLE_FLAG} main.cpp
|
||||||
|
${SOURCE_FILES}
|
||||||
|
${RESOURCES}
|
||||||
|
${ASSETS_OS}
|
||||||
|
)
|
||||||
|
|
||||||
|
# mac os bundle
|
||||||
|
set_target_properties(feather PROPERTIES
|
||||||
|
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
|
||||||
|
MACOSX_BUNDLE TRUE
|
||||||
|
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/utils/Info.plist"
|
||||||
|
)
|
||||||
|
|
||||||
|
set_property(TARGET feather PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
|
||||||
|
|
||||||
|
target_include_directories(feather PUBLIC ${OPENGL_INCLUDE_DIR})
|
||||||
|
target_include_directories(feather PUBLIC ${Qt5Gui_PRIVATE_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
file(GLOB_RECURSE SRC_SOURCES *.cpp)
|
||||||
|
file(GLOB_RECURSE SRC_HEADERS *.h)
|
||||||
|
|
||||||
|
target_include_directories(feather PUBLIC
|
||||||
|
${CMAKE_BINARY_DIR}/src/feather_autogen/include
|
||||||
|
${CMAKE_SOURCE_DIR}/monero/include
|
||||||
|
${CMAKE_SOURCE_DIR}/monero/src
|
||||||
|
${CMAKE_SOURCE_DIR}/monero/external/easylogging++
|
||||||
|
${CMAKE_SOURCE_DIR}/monero/contrib/epee/include
|
||||||
|
${CMAKE_SOURCE_DIR}/src
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/daemon
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/libwalletqt
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/model
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/utils
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/tor
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/qrcode
|
||||||
|
${X11_INCLUDE_DIR}
|
||||||
|
${Boost_INCLUDE_DIRS}
|
||||||
|
${OPENSSL_INCLUDE_DIR}
|
||||||
|
${Qt5Core_INCLUDE_DIRS}
|
||||||
|
${Qt5Widgets_INCLUDE_DIRS}
|
||||||
|
${Qt5Gui_INCLUDE_DIRS}
|
||||||
|
${Qt5Network_INCLUDE_DIRS}
|
||||||
|
${Qt5Svg_INCLUDE_DIRS}
|
||||||
|
${Qt5Xml_INCLUDE_DIRS}
|
||||||
|
${Qt5WebSockets_INCLUDE_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
|
if(DONATE_BEG)
|
||||||
|
target_compile_definitions(feather PRIVATE DONATE_BEG=1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(BUILD_TOR)
|
||||||
|
target_compile_definitions(feather PRIVATE BUILD_TOR=1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(XMRTO)
|
||||||
|
target_compile_definitions(feather PRIVATE XMRTO=1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(HAVE_SYS_PRCTL_H)
|
||||||
|
target_compile_definitions(feather PRIVATE HAVE_SYS_PRCTL_H=1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
|
target_compile_definitions(feather PRIVATE QT_NO_DEBUG=1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_compile_definitions(feather
|
||||||
|
PUBLIC
|
||||||
|
${Qt5Core_DEFINITIONS}
|
||||||
|
${Qt5Widgets_DEFINITIONS}
|
||||||
|
${Qt5Gui_DEFINITIONS}
|
||||||
|
${Qt5Network_DEFINITIONS}
|
||||||
|
${Qt5Svg_DEFINITIONS}
|
||||||
|
${Qt5Xml_DEFINITIONS}
|
||||||
|
${Qt5WebSockets_DEFINITIONS}
|
||||||
|
)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")
|
||||||
|
|
||||||
|
if(UNIX AND NOT APPLE)
|
||||||
|
# https://stackoverflow.com/questions/57766620/cmake-add-library-doesnt-initialize-static-global-variable
|
||||||
|
# so that contrib/monero-seed/src/gf_elem.cpp properly initializes. A better solution is welcome.
|
||||||
|
target_link_libraries(feather -Wl,--whole-archive monero-seed::monero-seed -Wl,--no-whole-archive)
|
||||||
|
else()
|
||||||
|
target_link_libraries(feather monero-seed::monero-seed)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_link_libraries(feather
|
||||||
|
wallet_merged
|
||||||
|
${LMDB_LIBRARY}
|
||||||
|
epee
|
||||||
|
${UNBOUND_LIBRARY}
|
||||||
|
${SODIUM_LIBRARY}
|
||||||
|
easylogging
|
||||||
|
blockchain_db
|
||||||
|
randomx
|
||||||
|
hardforks
|
||||||
|
${Boost_LIBRARIES}
|
||||||
|
${OPENSSL_LIBRARIES}
|
||||||
|
${CMAKE_DL_LIBS}
|
||||||
|
${EXTRA_LIBRARIES}
|
||||||
|
Qt5::Core
|
||||||
|
Qt5::Widgets
|
||||||
|
Qt5::Gui
|
||||||
|
Qt5::Network
|
||||||
|
Qt5::Svg
|
||||||
|
Qt5::Xml
|
||||||
|
Qt5::WebSockets
|
||||||
|
${ICU_LIBRARIES}
|
||||||
|
openpgp
|
||||||
|
Threads::Threads
|
||||||
|
${QRENCODE_LIBRARY}
|
||||||
|
)
|
||||||
|
|
||||||
|
if(NOT APPLE)
|
||||||
|
target_link_libraries(feather
|
||||||
|
Qt5::QSvgIconPlugin
|
||||||
|
Qt5::QSvgPlugin
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(STATIC)
|
||||||
|
target_link_libraries(feather
|
||||||
|
Qt5::QSvgIconPlugin
|
||||||
|
Qt5::QSvgPlugin)
|
||||||
|
if(UNIX AND NOT APPLE)
|
||||||
|
target_link_libraries(feather
|
||||||
|
Qt5::QXcbIntegrationPlugin)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(X11_FOUND)
|
||||||
|
target_link_libraries(feather ${X11_LIBRARIES})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
include(Deploy)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
install(TARGETS feather
|
||||||
|
DESTINATION ${CMAKE_INSTALL_PREFIX}
|
||||||
|
)
|
768
src/appcontext.cpp
Normal file
|
@ -0,0 +1,768 @@
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
// Copyright (c) 2020, The Monero Project.
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
#include <QMessageBox>
|
||||||
|
#include <QClipboard>
|
||||||
|
#include <QDesktopWidget>
|
||||||
|
|
||||||
|
#include "appcontext.h"
|
||||||
|
#include "utils/tails.h"
|
||||||
|
#include "utils/whonix.h"
|
||||||
|
#include "utils/utils.h"
|
||||||
|
#include "utils/prices.h"
|
||||||
|
#include "utils/networktype.h"
|
||||||
|
#include "utils/wsclient.h"
|
||||||
|
|
||||||
|
// libwalletqt
|
||||||
|
#include "libwalletqt/WalletManager.h"
|
||||||
|
#include "libwalletqt/Wallet.h"
|
||||||
|
#include "libwalletqt/TransactionHistory.h"
|
||||||
|
#include "libwalletqt/SubaddressAccount.h"
|
||||||
|
#include "libwalletqt/Subaddress.h"
|
||||||
|
#include "libwalletqt/Coins.h"
|
||||||
|
#include "model/TransactionHistoryModel.h"
|
||||||
|
#include "model/SubaddressAccountModel.h"
|
||||||
|
#include "model/SubaddressModel.h"
|
||||||
|
#include "utils/keysfiles.h"
|
||||||
|
#include "utils/networktype.h"
|
||||||
|
#include "utils/config.h"
|
||||||
|
|
||||||
|
|
||||||
|
Prices *AppContext::prices = nullptr;
|
||||||
|
WalletKeysFilesModel *AppContext::wallets = nullptr;
|
||||||
|
TxFiatHistory *AppContext::txFiatHistory = nullptr;
|
||||||
|
double AppContext::balance = 0;
|
||||||
|
QMap<QString, QString> AppContext::txDescriptionCache;
|
||||||
|
|
||||||
|
AppContext::AppContext(QCommandLineParser *cmdargs) {
|
||||||
|
this->network = new QNetworkAccessManager();
|
||||||
|
this->networkClearnet = new QNetworkAccessManager();
|
||||||
|
this->cmdargs = cmdargs;
|
||||||
|
|
||||||
|
#if defined(Q_OS_MAC)
|
||||||
|
this->isTorSocks = qgetenv("DYLD_INSERT_LIBRARIES").indexOf("libtorsocks") >= 0;
|
||||||
|
#elif defined(Q_OS_LINUX)
|
||||||
|
this->isTorSocks = qgetenv("LD_PRELOAD").indexOf("libtorsocks") >= 0;
|
||||||
|
#elif defined(Q_OS_WIN)
|
||||||
|
this->isTorSocks = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
this->isTails = TailsOS::detect();
|
||||||
|
this->isWhonix = WhonixOS::detect();
|
||||||
|
|
||||||
|
//Paths
|
||||||
|
this->configRoot = QDir::homePath();
|
||||||
|
if (isTails) { // #if defined(PORTABLE)
|
||||||
|
QString portablePath = []{
|
||||||
|
QString appImagePath = qgetenv("APPIMAGE");
|
||||||
|
if (appImagePath.isEmpty()) {
|
||||||
|
qDebug() << "Not an appimage, using currentPath()";
|
||||||
|
return QDir::currentPath() + "/.feather";
|
||||||
|
}
|
||||||
|
|
||||||
|
QFileInfo appImageDir(appImagePath);
|
||||||
|
return appImageDir.absoluteDir().path() + "/.feather";
|
||||||
|
}();
|
||||||
|
|
||||||
|
|
||||||
|
if (QDir().mkpath(portablePath)) {
|
||||||
|
this->configRoot = portablePath;
|
||||||
|
} else {
|
||||||
|
qCritical() << "Unable to create portable directory: " << portablePath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this->accountName = Utils::getUnixAccountName();
|
||||||
|
this->homeDir = QDir::homePath();
|
||||||
|
|
||||||
|
#if defined(Q_OS_LINUX) or defined(Q_OS_MAC)
|
||||||
|
this->defaultWalletDir = QString("%1/Monero/wallets").arg(this->configRoot);
|
||||||
|
this->defaultWalletDirRoot = QString("%1/Monero").arg(this->configRoot);
|
||||||
|
#elif defined(Q_OS_WIN)
|
||||||
|
// @TODO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Create ~/Monero/wallets if it does not exist yet
|
||||||
|
if (!QDir().mkpath(defaultWalletDir))
|
||||||
|
qCritical() << "Unable to create dir: " << defaultWalletDir;
|
||||||
|
|
||||||
|
this->configDirectory = QString("%1/.config/feather/").arg(this->configRoot);
|
||||||
|
#if defined(Q_OS_UNIX)
|
||||||
|
if(!this->configDirectory.endsWith('/'))
|
||||||
|
this->configDirectory = QString("%1/").arg(this->configDirectory);
|
||||||
|
#endif
|
||||||
|
this->sorry();
|
||||||
|
|
||||||
|
// Config
|
||||||
|
createConfigDirectory(this->configDirectory);
|
||||||
|
|
||||||
|
if(this->cmdargs->isSet("stagenet"))
|
||||||
|
this->networkType = NetworkType::STAGENET;
|
||||||
|
else if(this->cmdargs->isSet("testnet"))
|
||||||
|
this->networkType = NetworkType::TESTNET;
|
||||||
|
else
|
||||||
|
this->networkType = NetworkType::MAINNET;
|
||||||
|
|
||||||
|
// auto nodeSourceUInt = config()->get(Config::nodeSource).toUInt();
|
||||||
|
// AppContext::nodeSource = static_cast<NodeSource>(nodeSourceUInt);
|
||||||
|
this->nodes = new Nodes(this, this->networkClearnet);
|
||||||
|
connect(this, &AppContext::nodeSourceChanged, this->nodes, &Nodes::onNodeSourceChanged);
|
||||||
|
connect(this, &AppContext::setCustomNodes, this->nodes, &Nodes::setCustomNodes);
|
||||||
|
connect(this, &AppContext::walletClosing, this->nodes, &Nodes::onWalletClosing);
|
||||||
|
|
||||||
|
// Tor & socks proxy
|
||||||
|
this->ws = new WSClient(this, m_wsUrl);
|
||||||
|
connect(this->ws, &WSClient::WSMessage, this, &AppContext::onWSMessage);
|
||||||
|
|
||||||
|
// timers
|
||||||
|
m_storeTimer->setSingleShot(true);
|
||||||
|
connect(this->m_storeTimer, &QTimer::timeout, [this](){
|
||||||
|
if (!this->currentWallet)
|
||||||
|
return;
|
||||||
|
qDebug() << "Storing wallet";
|
||||||
|
this->currentWallet->store();
|
||||||
|
});
|
||||||
|
|
||||||
|
// restore height lookup
|
||||||
|
this->initRestoreHeights();
|
||||||
|
|
||||||
|
// price history lookup
|
||||||
|
auto genesis_timestamp = this->restoreHeights[NetworkType::Type::MAINNET]->data.firstKey();
|
||||||
|
AppContext::txFiatHistory = new TxFiatHistory(genesis_timestamp, this->configDirectory);
|
||||||
|
connect(this->ws, &WSClient::connectionEstablished, AppContext::txFiatHistory, &TxFiatHistory::onUpdateDatabase);
|
||||||
|
connect(AppContext::txFiatHistory, &TxFiatHistory::requestYear, [=](unsigned int year){
|
||||||
|
QByteArray data = QString(R"({"cmd": "txFiatHistory", "data": {"year": %1}})").arg(year).toUtf8();
|
||||||
|
this->ws->sendMsg(data);
|
||||||
|
});
|
||||||
|
connect(AppContext::txFiatHistory, &TxFiatHistory::requestYearMonth, [=](unsigned int year, unsigned int month) {
|
||||||
|
QByteArray data = QString(R"({"cmd": "txFiatHistory", "data": {"year": %1, "month": %2}})").arg(year).arg(month).toUtf8();
|
||||||
|
this->ws->sendMsg(data);
|
||||||
|
});
|
||||||
|
|
||||||
|
// fiat/crypto lookup
|
||||||
|
AppContext::prices = new Prices();
|
||||||
|
|
||||||
|
// xmr.to
|
||||||
|
#if defined(XMRTO)
|
||||||
|
this->XMRTo = new XmrTo(this);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
this->walletManager = WalletManager::instance();
|
||||||
|
QString logPath = QString("%1/daemon.log").arg(configDirectory);
|
||||||
|
Monero::Utils::onStartup();
|
||||||
|
Monero::Wallet::init("", "feather", logPath.toStdString(), true);
|
||||||
|
|
||||||
|
bool logLevelFromEnv;
|
||||||
|
int logLevel = qEnvironmentVariableIntValue("MONERO_LOG_LEVEL", &logLevelFromEnv);
|
||||||
|
if(this->cmdargs->isSet("quiet"))
|
||||||
|
this->walletManager->setLogLevel(-1);
|
||||||
|
else if (logLevelFromEnv && logLevel >= 0 && logLevel <= Monero::WalletManagerFactory::LogLevel_Max)
|
||||||
|
Monero::WalletManagerFactory::setLogLevel(logLevel);
|
||||||
|
|
||||||
|
connect(this, &AppContext::createTransactionError, this, &AppContext::onCreateTransactionError);
|
||||||
|
|
||||||
|
// libwallet connects
|
||||||
|
connect(this->walletManager, &WalletManager::walletOpened, this, &AppContext::onWalletOpened);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::initTor() {
|
||||||
|
this->tor = new Tor(this);
|
||||||
|
this->tor->start();
|
||||||
|
|
||||||
|
if (!(isTails || isWhonix)) {
|
||||||
|
auto networkProxy = new QNetworkProxy(QNetworkProxy::Socks5Proxy, Tor::torHost, Tor::torPort);
|
||||||
|
this->network->setProxy(*networkProxy);
|
||||||
|
if (m_wsUrl.host().endsWith(".onion"))
|
||||||
|
this->ws->webSocket.setProxy(*networkProxy);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::initWS() {
|
||||||
|
this->ws->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onCancelTransaction(PendingTransaction *tx, const QString &address) {
|
||||||
|
// tx cancelled by user
|
||||||
|
double amount = tx->amount() / AppContext::cdiv;
|
||||||
|
emit createTransactionCancelled(address, amount);
|
||||||
|
this->currentWallet->disposeTransaction(tx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onSweepOutput(const QString &keyImage, QString address, bool churn, int outputs) const {
|
||||||
|
if(this->currentWallet == nullptr){
|
||||||
|
qCritical() << "Cannot create transaction; no wallet loaded";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (churn) {
|
||||||
|
address = this->currentWallet->address(0, 0); // primary address
|
||||||
|
}
|
||||||
|
|
||||||
|
qCritical() << "Creating transaction";
|
||||||
|
this->currentWallet->createTransactionSingleAsync(keyImage, address, outputs, this->tx_priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onCreateTransaction(XmrToOrder *order) {
|
||||||
|
// tx creation via xmr.to
|
||||||
|
const QString description = QString("XmrTo order %1").arg(order->uuid);
|
||||||
|
this->onCreateTransaction(order->receiving_subaddress, order->incoming_amount_total, description, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onCreateTransaction(const QString &address, const double amount, const QString &description, bool all) {
|
||||||
|
// tx creation
|
||||||
|
this->tmpTxDescription = description;
|
||||||
|
|
||||||
|
if(this->currentWallet == nullptr) {
|
||||||
|
emit createTransactionError("Cannot create transaction; no wallet loaded");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!all && amount <= 0) {
|
||||||
|
emit createTransactionError("Cannot send nothing");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto balance = this->currentWallet->balance() / AppContext::cdiv;
|
||||||
|
auto unlocked_balance = this->currentWallet->unlockedBalance() / AppContext::cdiv;
|
||||||
|
if(!all && amount > unlocked_balance) {
|
||||||
|
emit createTransactionError("Not enough money to spend");
|
||||||
|
return;
|
||||||
|
} else if(unlocked_balance == 0) {
|
||||||
|
emit createTransactionError("No money to spend");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto amount_num = static_cast<quint64>(amount * AppContext::cdiv);
|
||||||
|
qDebug() << "creating tx";
|
||||||
|
if(all || amount == balance)
|
||||||
|
this->currentWallet->createTransactionAllAsync(address, "", this->tx_mixin, this->tx_priority);
|
||||||
|
else
|
||||||
|
this->currentWallet->createTransactionAsync(address, "", amount_num, this->tx_mixin, this->tx_priority);
|
||||||
|
|
||||||
|
emit initiateTransaction();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onCreateTransactionError(const QString &msg) {
|
||||||
|
this->tmpTxDescription = "";
|
||||||
|
emit endTransaction();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::walletClose(bool emitClosedSignal) {
|
||||||
|
this->nodes->stopTimer();
|
||||||
|
if(this->currentWallet == nullptr) return;
|
||||||
|
emit walletClosing();
|
||||||
|
//ctx->currentWallet->store(); @TODO: uncomment to store on wallet close
|
||||||
|
this->currentWallet->disconnect();
|
||||||
|
this->walletManager->closeWallet();
|
||||||
|
if(this->currentWallet != nullptr)
|
||||||
|
this->currentWallet = nullptr;
|
||||||
|
if(emitClosedSignal)
|
||||||
|
emit walletClosed();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onOpenWallet(const QString &path, const QString &password){
|
||||||
|
if(this->currentWallet != nullptr){
|
||||||
|
emit walletOpenedError("There is an active wallet opened.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!Utils::fileExists(path)) {
|
||||||
|
emit walletOpenedError(QString("Wallet not found: %1").arg(path));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
config()->set(Config::firstRun, false);
|
||||||
|
|
||||||
|
this->walletPath = path;
|
||||||
|
this->walletManager->openWalletAsync(path, password, this->networkType, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onPreferredFiatCurrencyChanged(const QString &symbol) {
|
||||||
|
if(this->currentWallet) {
|
||||||
|
auto *model = this->currentWallet->transactionHistoryModel();
|
||||||
|
if(model != nullptr) {
|
||||||
|
model->preferredFiatSign = AppContext::prices->fiat[symbol];
|
||||||
|
model->preferredFiatSymbol = symbol;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onWalletOpened(Wallet *wallet) {
|
||||||
|
auto state = wallet->status();
|
||||||
|
if (state != Wallet::Status_Ok) {
|
||||||
|
auto errMsg = wallet->errorString();
|
||||||
|
if(errMsg == QString("basic_string::_M_replace_aux") || errMsg == QString("std::bad_alloc")) {
|
||||||
|
qCritical() << errMsg;
|
||||||
|
this->walletManager->clearWalletCache(this->walletPath);
|
||||||
|
errMsg = QString("%1\n\nAttempted to clean wallet cache. Please restart Feather.").arg(errMsg);
|
||||||
|
this->walletClose(false);
|
||||||
|
emit walletOpenedError(errMsg);
|
||||||
|
} else if(errMsg.contains("wallet cannot be opened as")) {
|
||||||
|
this->walletClose(false);
|
||||||
|
emit walletOpenedError(errMsg);
|
||||||
|
} else if(errMsg.contains("is opened by another wallet program")) {
|
||||||
|
this->walletClose(false);
|
||||||
|
emit walletOpenedError(errMsg);
|
||||||
|
} else {
|
||||||
|
this->walletClose(false);
|
||||||
|
emit walletOpenPasswordNeeded(this->walletPassword.isEmpty());
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->currentWallet = wallet;
|
||||||
|
this->walletPath = this->currentWallet->path() + ".keys";
|
||||||
|
config()->set(Config::walletPath, this->walletPath);
|
||||||
|
|
||||||
|
connect(this->currentWallet, &Wallet::moneySpent, this, &AppContext::onMoneySpent);
|
||||||
|
connect(this->currentWallet, &Wallet::moneyReceived, this, &AppContext::onMoneyReceived);
|
||||||
|
connect(this->currentWallet, &Wallet::unconfirmedMoneyReceived, this, &AppContext::onUnconfirmedMoneyReceived);
|
||||||
|
connect(this->currentWallet, &Wallet::newBlock, this, &AppContext::onWalletNewBlock);
|
||||||
|
connect(this->currentWallet, &Wallet::updated, this, &AppContext::onWalletUpdate);
|
||||||
|
connect(this->currentWallet, &Wallet::refreshed, this, &AppContext::onWalletRefreshed);
|
||||||
|
connect(this->currentWallet, &Wallet::transactionCommitted, this, &AppContext::onTransactionCommitted);
|
||||||
|
connect(this->currentWallet, &Wallet::heightRefreshed, this, &AppContext::onHeightRefreshed);
|
||||||
|
connect(this->currentWallet, &Wallet::transactionCreated, this, &AppContext::onTransactionCreated);
|
||||||
|
connect(this->currentWallet, &Wallet::connectionStatusChanged, this, &AppContext::onConnectionStatusChanged);
|
||||||
|
|
||||||
|
this->nodes->connectToNode();
|
||||||
|
|
||||||
|
emit walletOpened();
|
||||||
|
this->updateBalance();
|
||||||
|
|
||||||
|
#ifdef DONATE_BEG
|
||||||
|
this->donateBeg();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// force trigger preferredFiat signal for history model
|
||||||
|
this->onPreferredFiatCurrencyChanged(config()->get(Config::preferredFiatCurrency).toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onWSMessage(const QJsonObject &msg) {
|
||||||
|
QString cmd = msg.value("cmd").toString();
|
||||||
|
|
||||||
|
if(cmd == "blockheights") {
|
||||||
|
auto heights = msg.value("data").toObject();
|
||||||
|
auto mainnet = heights.value("mainnet").toInt();
|
||||||
|
auto stagenet = heights.value("stagenet").toInt();
|
||||||
|
auto changed = false;
|
||||||
|
|
||||||
|
if(!this->heights.contains("mainnet")) {
|
||||||
|
this->heights["mainnet"] = (unsigned int) mainnet;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (mainnet > this->heights["mainnet"]) {
|
||||||
|
this->heights["mainnet"] = (unsigned int) mainnet;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!this->heights.contains("stagenet")) {
|
||||||
|
this->heights["stagenet"] = (unsigned int) stagenet;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (stagenet > this->heights["stagenet"]) {
|
||||||
|
this->heights["stagenet"] = (unsigned int) stagenet;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(changed)
|
||||||
|
emit blockHeightWSUpdated(this->heights);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(cmd == "nodes") {
|
||||||
|
this->onWSNodes(msg.value("data").toArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(cmd == "crypto_rates") {
|
||||||
|
QJsonArray crypto_rates = msg.value("data").toArray();
|
||||||
|
AppContext::prices->cryptoPricesReceived(crypto_rates);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(cmd == "fiat_rates") {
|
||||||
|
QJsonObject fiat_rates = msg.value("data").toObject();
|
||||||
|
AppContext::prices->fiatPricesReceived(fiat_rates);
|
||||||
|
}
|
||||||
|
#if defined(XMRTO)
|
||||||
|
else if(cmd == "xmrto_rates") {
|
||||||
|
auto xmr_rates = msg.value("data").toObject();
|
||||||
|
this->XMRTo->onRatesReceived(xmr_rates);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else if(cmd == "reddit") {
|
||||||
|
QJsonArray reddit_data = msg.value("data").toArray();
|
||||||
|
this->onWSReddit(reddit_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(cmd == "ccs") {
|
||||||
|
auto ccs_data = msg.value("data").toArray();
|
||||||
|
this->onWSCCS(ccs_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(cmd == "txFiatHistory") {
|
||||||
|
auto txFiatHistory_data = msg.value("data").toObject();
|
||||||
|
AppContext::txFiatHistory->onWSData(txFiatHistory_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onWSNodes(const QJsonArray &nodes) {
|
||||||
|
QList<QSharedPointer<FeatherNode>> l;
|
||||||
|
for (auto &&entry: nodes) {
|
||||||
|
auto obj = entry.toObject();
|
||||||
|
auto nettype = obj.value("nettype");
|
||||||
|
auto type = obj.value("type");
|
||||||
|
|
||||||
|
// filter remote node network types
|
||||||
|
if(nettype == "mainnet" && this->networkType != NetworkType::MAINNET)
|
||||||
|
continue;
|
||||||
|
if(nettype == "stagenet" && this->networkType != NetworkType::STAGENET)
|
||||||
|
continue;
|
||||||
|
if(nettype == "testnet" && this->networkType != NetworkType::TESTNET)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(type == "clearnet" && (this->isTails || this->isWhonix || this->isTorSocks))
|
||||||
|
continue;
|
||||||
|
if(type == "tor" && (!(this->isTails || this->isWhonix || this->isTorSocks)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
auto node = new FeatherNode(
|
||||||
|
obj.value("address").toString(),
|
||||||
|
(unsigned int)obj.value("height").toInt(),
|
||||||
|
obj.value("online").toBool());
|
||||||
|
QSharedPointer<FeatherNode> r = QSharedPointer<FeatherNode>(node);
|
||||||
|
l.append(r);
|
||||||
|
}
|
||||||
|
this->nodes->onWSNodesReceived(l);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onWSReddit(const QJsonArray& reddit_data) {
|
||||||
|
QList<QSharedPointer<RedditPost>> l;
|
||||||
|
|
||||||
|
for (auto &&entry: reddit_data) {
|
||||||
|
auto obj = entry.toObject();
|
||||||
|
auto redditPost = new RedditPost(
|
||||||
|
obj.value("title").toString(),
|
||||||
|
obj.value("author").toString(),
|
||||||
|
obj.value("url").toString(),
|
||||||
|
obj.value("comments").toInt());
|
||||||
|
QSharedPointer<RedditPost> r = QSharedPointer<RedditPost>(redditPost);
|
||||||
|
l.append(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
emit redditUpdated(l);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onWSCCS(const QJsonArray &ccs_data) {
|
||||||
|
QList<QSharedPointer<CCSEntry>> l;
|
||||||
|
|
||||||
|
|
||||||
|
QStringList fonts = {"state", "address", "author", "date",
|
||||||
|
"title", "target_amount", "raised_amount",
|
||||||
|
"percentage_funded", "contributions"};
|
||||||
|
|
||||||
|
for (auto &&entry: ccs_data) {
|
||||||
|
auto obj = entry.toObject();
|
||||||
|
auto c = QSharedPointer<CCSEntry>(new CCSEntry());
|
||||||
|
|
||||||
|
if (obj.value("state").toString() != "FUNDING-REQUIRED")
|
||||||
|
continue;
|
||||||
|
|
||||||
|
c->state = obj.value("state").toString();
|
||||||
|
c->address = obj.value("address").toString();
|
||||||
|
c->author = obj.value("author").toString();
|
||||||
|
c->date = obj.value("date").toString();
|
||||||
|
c->title = obj.value("title").toString();
|
||||||
|
c->url = obj.value("url").toString();
|
||||||
|
c->target_amount = obj.value("target_amount").toDouble();
|
||||||
|
c->raised_amount = obj.value("raised_amount").toDouble();
|
||||||
|
c->percentage_funded = obj.value("percentage_funded").toDouble();
|
||||||
|
c->contributions = obj.value("contributions").toInt();
|
||||||
|
l.append(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(l.count() == 0)
|
||||||
|
emit ccsEmpty();
|
||||||
|
|
||||||
|
emit ccsUpdated(l);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::createConfigDirectory(const QString &dir) {
|
||||||
|
if(!Utils::dirExists(dir)) {
|
||||||
|
qDebug() << QString("Creating directory: %1").arg(dir);
|
||||||
|
if(!QDir().mkpath(dir))
|
||||||
|
throw std::runtime_error("Could not create directory " + dir.toStdString());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString config_dir_tor = QString("%1%2").arg(dir).arg("tor");
|
||||||
|
if(!Utils::dirExists(config_dir_tor)) {
|
||||||
|
qDebug() << QString("Creating directory: %1").arg(config_dir_tor);
|
||||||
|
if (!QDir().mkpath(config_dir_tor))
|
||||||
|
throw std::runtime_error("Could not create directory " + config_dir_tor.toStdString());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString config_dir_tordata = QString("%1%2").arg(dir).arg("tor/data");
|
||||||
|
if(!Utils::dirExists(config_dir_tordata)) {
|
||||||
|
qDebug() << QString("Creating directory: %1").arg(config_dir_tordata);
|
||||||
|
if (!QDir().mkpath(config_dir_tordata))
|
||||||
|
throw std::runtime_error("Could not create directory " + config_dir_tordata.toStdString());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString config_dir_torsocks = QString("%1%2").arg(dir).arg("torsocks");
|
||||||
|
if(!Utils::dirExists(config_dir_torsocks)) {
|
||||||
|
qDebug() << QString("Creating directory: %1").arg(config_dir_torsocks);
|
||||||
|
if (!QDir().mkpath(config_dir_torsocks))
|
||||||
|
throw std::runtime_error("Could not create directory " + config_dir_torsocks.toStdString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::createWallet(FeatherSeed seed, const QString &path, const QString &password) {
|
||||||
|
if(Utils::fileExists(path)) {
|
||||||
|
auto err = QString("Failed to write wallet to path: \"%1\"; file already exists.").arg(path);
|
||||||
|
qCritical() << err;
|
||||||
|
emit walletCreatedError(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->currentWallet = seed.writeWallet(this->walletManager, this->networkType, path, password, this->kdfRounds);
|
||||||
|
if(this->currentWallet == nullptr) {
|
||||||
|
emit walletCreatedError("Failed to write wallet");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->currentWallet->setPassword(password);
|
||||||
|
this->currentWallet->store();
|
||||||
|
this->walletPassword = password;
|
||||||
|
emit walletCreated(this->currentWallet);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::initRestoreHeights() {
|
||||||
|
restoreHeights[NetworkType::TESTNET] = new RestoreHeightLookup(NetworkType::TESTNET);
|
||||||
|
restoreHeights[NetworkType::STAGENET] = RestoreHeightLookup::fromFile(":/assets/restore_heights_monero_stagenet.txt", NetworkType::STAGENET);
|
||||||
|
restoreHeights[NetworkType::MAINNET] = RestoreHeightLookup::fromFile(":/assets/restore_heights_monero_mainnet.txt", NetworkType::MAINNET);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onSetRestoreHeight(unsigned int height){
|
||||||
|
auto seed = this->currentWallet->getCacheAttribute("feather.seed");
|
||||||
|
if(!seed.isEmpty()) {
|
||||||
|
const auto msg = "This wallet has a 14 word mnemonic seed which has the restore height embedded.";
|
||||||
|
emit setRestoreHeightError(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->currentWallet->setWalletCreationHeight(height);
|
||||||
|
this->currentWallet->setPassword(this->walletPassword); // trigger .keys write
|
||||||
|
|
||||||
|
// nuke wallet cache
|
||||||
|
const auto fn = this->currentWallet->path();
|
||||||
|
this->walletManager->clearWalletCache(fn);
|
||||||
|
|
||||||
|
emit customRestoreHeightSet(height);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onOpenAliasResolve(const QString &openAlias) {
|
||||||
|
// @TODO: calling this freezes for about 1-2 seconds :/
|
||||||
|
const auto result = this->walletManager->resolveOpenAlias(openAlias);
|
||||||
|
const auto spl = result.split("|");
|
||||||
|
auto msg = QString("");
|
||||||
|
if(spl.count() != 2) {
|
||||||
|
msg = "Internal error";
|
||||||
|
emit openAliasResolveError(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto &status = spl.at(0);
|
||||||
|
const auto &address = spl.at(1);
|
||||||
|
const auto valid = this->walletManager->addressValid(address, this->networkType);
|
||||||
|
if(status == "false"){
|
||||||
|
if(valid){
|
||||||
|
msg = "Address found, but the DNSSEC signatures could not be verified, so this address may be spoofed";
|
||||||
|
emit openAliasResolveError(msg);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
msg = "No valid address found at this OpenAlias address, but the DNSSEC signatures could not be verified, so this may be spoofed";
|
||||||
|
emit openAliasResolveError(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if(status != "true") {
|
||||||
|
msg = "Internal error";
|
||||||
|
emit openAliasResolveError(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(valid){
|
||||||
|
emit openAliasResolved(address, openAlias);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
msg = QString("Address validation error.");
|
||||||
|
if(!address.isEmpty())
|
||||||
|
msg += QString(" Perhaps it is of the wrong network type."
|
||||||
|
"\n\nOpenAlias: %1\nAddress: %2").arg(openAlias).arg(address);
|
||||||
|
emit openAliasResolveError(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::donateBeg() {
|
||||||
|
if(this->networkType != NetworkType::Type::MAINNET)
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto donationCounter = config()->get(Config::donateBeg).toInt();
|
||||||
|
if(donationCounter == -1)
|
||||||
|
return; // previously donated
|
||||||
|
|
||||||
|
donationCounter += 1;
|
||||||
|
if (donationCounter % m_donationBoundary == 0)
|
||||||
|
emit donationNag();
|
||||||
|
config()->set(Config::donateBeg, donationCounter);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::sorry() {
|
||||||
|
auto msg = "Unable to start Feather, error code 0xd34db33f. If this problem "
|
||||||
|
"persists, please contact Technical Support.";
|
||||||
|
QStringList paths = {"C:\\ProgramData\\ryo", this->homeDir + "/.ryo"};
|
||||||
|
for(const QString &ryo: paths)
|
||||||
|
if(Utils::dirExists(ryo))
|
||||||
|
throw std::runtime_error(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
AppContext::~AppContext() {
|
||||||
|
this->walletClose(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ############################################## LIBWALLET QT #########################################################
|
||||||
|
|
||||||
|
void AppContext::onMoneySpent(const QString &txId, quint64 amount) {
|
||||||
|
auto amount_num = amount / AppContext::cdiv;
|
||||||
|
qDebug() << Q_FUNC_INFO << txId << " " << QString::number(amount_num);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onMoneyReceived(const QString &txId, quint64 amount) {
|
||||||
|
// Incoming tx included in a block.
|
||||||
|
auto amount_num = amount / AppContext::cdiv;
|
||||||
|
qDebug() << Q_FUNC_INFO << txId << " " << QString::number(amount_num);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onUnconfirmedMoneyReceived(const QString &txId, quint64 amount) {
|
||||||
|
// Incoming transaction in pool
|
||||||
|
auto amount_num = amount / AppContext::cdiv;
|
||||||
|
qDebug() << Q_FUNC_INFO << txId << " " << QString::number(amount_num);
|
||||||
|
|
||||||
|
if(this->currentWallet->synchronized()) {
|
||||||
|
auto notify = QString("%1 XMR (pending)").arg(amount_num);
|
||||||
|
Utils::desktopNotify("Payment received", notify, 5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onWalletUpdate() {
|
||||||
|
if (this->currentWallet->synchronized()) {
|
||||||
|
this->refreshModels();
|
||||||
|
}
|
||||||
|
|
||||||
|
this->updateBalance();
|
||||||
|
this->storeWallet();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onWalletRefreshed() {
|
||||||
|
if (!this->refreshed) {
|
||||||
|
refreshModels();
|
||||||
|
this->refreshed = true;
|
||||||
|
this->storeWallet();
|
||||||
|
}
|
||||||
|
|
||||||
|
this->currentWallet->refreshHeightAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onWalletNewBlock(quint64 blockheight, quint64 targetHeight) {
|
||||||
|
this->syncStatusUpdated(blockheight, targetHeight);
|
||||||
|
|
||||||
|
if (this->currentWallet->synchronized()) {
|
||||||
|
this->currentWallet->coins()->refreshUnlocked();
|
||||||
|
this->currentWallet->history()->refresh(this->currentWallet->currentSubaddressAccount());
|
||||||
|
// Todo: only refresh tx confirmations
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onHeightRefreshed(quint64 walletHeight, quint64 daemonHeight, quint64 targetHeight) {
|
||||||
|
qDebug() << Q_FUNC_INFO << walletHeight << daemonHeight << targetHeight;
|
||||||
|
|
||||||
|
if (!this->currentWallet->connected())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (daemonHeight < targetHeight) {
|
||||||
|
emit blockchainSync(daemonHeight, targetHeight);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this->syncStatusUpdated(walletHeight, daemonHeight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onTransactionCreated(PendingTransaction *tx, const QString &address, const QString &paymentId, quint32 mixin) {
|
||||||
|
if(address == this->featherDonationAddress)
|
||||||
|
this->featherDonationSending = true;
|
||||||
|
|
||||||
|
// tx created, but not sent yet. ask user to verify first.
|
||||||
|
emit createTransactionSuccess(tx, address, mixin);
|
||||||
|
emit endTransaction();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onTransactionCommitted(bool status, PendingTransaction *tx, const QStringList& txid){
|
||||||
|
this->currentWallet->history()->refresh(this->currentWallet->currentSubaddressAccount());
|
||||||
|
this->currentWallet->coins()->refresh(this->currentWallet->currentSubaddressAccount());
|
||||||
|
this->storeWallet();
|
||||||
|
emit transactionCommitted(status, tx, txid);
|
||||||
|
|
||||||
|
// this tx was a donation to Feather, stop our nagging
|
||||||
|
if(this->featherDonationSending) {
|
||||||
|
this->featherDonationSending = false;
|
||||||
|
config()->set(Config::donateBeg, -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::onConnectionStatusChanged(int status) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::storeWallet() {
|
||||||
|
if (m_storeTimer->isActive())
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_storeTimer->start(60000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::updateBalance() {
|
||||||
|
if(!this->currentWallet)
|
||||||
|
throw std::runtime_error("this should not happen, ever");
|
||||||
|
|
||||||
|
AppContext::balance = this->currentWallet->balance() / AppContext::cdiv;
|
||||||
|
auto balance_str = QString::number(balance);
|
||||||
|
|
||||||
|
double unlocked = this->currentWallet->unlockedBalance() / AppContext::cdiv;
|
||||||
|
auto unlocked_str = QString::number(unlocked);
|
||||||
|
|
||||||
|
emit balanceUpdated(balance, unlocked, balance_str, unlocked_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::syncStatusUpdated(quint64 height, quint64 target) {
|
||||||
|
if (height < (target - 1)) {
|
||||||
|
emit refreshSync(height, target);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this->updateBalance();
|
||||||
|
emit synchronized();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppContext::refreshModels() {
|
||||||
|
if (!this->currentWallet)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this->currentWallet->history()->refresh(this->currentWallet->currentSubaddressAccount());
|
||||||
|
this->currentWallet->subaddress()->refresh(this->currentWallet->currentSubaddressAccount());
|
||||||
|
this->currentWallet->coins()->refresh(this->currentWallet->currentSubaddressAccount());
|
||||||
|
// Todo: set timer for refreshes
|
||||||
|
}
|
172
src/appcontext.h
Normal file
|
@ -0,0 +1,172 @@
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
// Copyright (c) 2020, The Monero Project.
|
||||||
|
|
||||||
|
#ifndef FEATHER_APPCONTEXT_H
|
||||||
|
#define FEATHER_APPCONTEXT_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QProcess>
|
||||||
|
#include <QNetworkAccessManager>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
#include "utils/tails.h"
|
||||||
|
#include "utils/prices.h"
|
||||||
|
#include "utils/networking.h"
|
||||||
|
#include "utils/tor.h"
|
||||||
|
#include "utils/xmrto.h"
|
||||||
|
#include "utils/wsclient.h"
|
||||||
|
#include "utils/txfiathistory.h"
|
||||||
|
#include "widgets/RedditPost.h"
|
||||||
|
#include "widgets/CCSEntry.h"
|
||||||
|
#include "utils/seeds.h"
|
||||||
|
#include "utils/nodes.h"
|
||||||
|
|
||||||
|
#include "libwalletqt/WalletManager.h"
|
||||||
|
#include "utils/keysfiles.h"
|
||||||
|
#include "PendingTransaction.h"
|
||||||
|
|
||||||
|
#define SUBADDRESS_LOOKAHEAD_MINOR 200
|
||||||
|
|
||||||
|
|
||||||
|
class AppContext : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit AppContext(QCommandLineParser *cmdargs);
|
||||||
|
~AppContext();
|
||||||
|
bool isTails = false;
|
||||||
|
bool isWhonix = false;
|
||||||
|
bool isDebug = false;
|
||||||
|
const QString featherDonationAddress = "47ntfT2Z5384zku39pTM6hGcnLnvpRYW2Azm87GiAAH2bcTidtq278TL6HmwyL8yjMeERqGEBs3cqC8vvHPJd1cWQrGC65f";
|
||||||
|
const int featherDonationAmount = 50; // euro
|
||||||
|
bool featherDonationSending = false;
|
||||||
|
|
||||||
|
QCommandLineParser *cmdargs;
|
||||||
|
|
||||||
|
QString coinName = "monero";
|
||||||
|
bool isTorSocks = false;
|
||||||
|
QString homeDir;
|
||||||
|
QString accountName;
|
||||||
|
QString configRoot;
|
||||||
|
QString configDirectory;
|
||||||
|
QString defaultWalletDir;
|
||||||
|
QString defaultWalletDirRoot;
|
||||||
|
QString tmpTxDescription;
|
||||||
|
|
||||||
|
QString walletPath;
|
||||||
|
QString walletPassword = "";
|
||||||
|
NetworkType::Type networkType;
|
||||||
|
|
||||||
|
QString applicationPath;
|
||||||
|
|
||||||
|
static void createConfigDirectory(const QString &dir) ;
|
||||||
|
|
||||||
|
QMap<QString, unsigned int> heights;
|
||||||
|
QMap<NetworkType::Type, RestoreHeightLookup*> restoreHeights;
|
||||||
|
const unsigned int kdfRounds = 1;
|
||||||
|
PendingTransaction::Priority tx_priority = PendingTransaction::Priority::Priority_Low;
|
||||||
|
quint32 tx_mixin = static_cast<const quint32 &>(10);
|
||||||
|
static constexpr const double cdiv = 1e12;
|
||||||
|
|
||||||
|
QNetworkAccessManager *network;
|
||||||
|
QNetworkAccessManager *networkClearnet;
|
||||||
|
QNetworkProxy *networkProxy;
|
||||||
|
|
||||||
|
Tor *tor;
|
||||||
|
WSClient *ws;
|
||||||
|
XmrTo *XMRTo;
|
||||||
|
Nodes *nodes;
|
||||||
|
static Prices *prices;
|
||||||
|
static WalletKeysFilesModel *wallets;
|
||||||
|
static double balance;
|
||||||
|
static QMap<QString, QString> txDescriptionCache;
|
||||||
|
static TxFiatHistory *txFiatHistory;
|
||||||
|
|
||||||
|
// libwalletqt
|
||||||
|
unsigned int blockHeight = 0;
|
||||||
|
bool refreshed = false;
|
||||||
|
WalletManager *walletManager;
|
||||||
|
Wallet *currentWallet = nullptr;
|
||||||
|
void createWallet(FeatherSeed seed, const QString &path, const QString &password);
|
||||||
|
void syncStatusUpdated(quint64 height, quint64 target);
|
||||||
|
void updateBalance();
|
||||||
|
void initTor();
|
||||||
|
void initRestoreHeights();
|
||||||
|
void initWS();
|
||||||
|
void donateBeg();
|
||||||
|
void walletClose(bool emitClosedSignal = true);
|
||||||
|
void storeWallet();
|
||||||
|
void refreshModels();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void onOpenWallet(const QString& path, const QString &password);
|
||||||
|
void onCreateTransaction(const QString &address, const double amount, const QString &description, bool all);
|
||||||
|
void onCreateTransaction(XmrToOrder *order);
|
||||||
|
void onCancelTransaction(PendingTransaction *tx, const QString &address);
|
||||||
|
void onSweepOutput(const QString &keyImage, QString address, bool churn, int outputs) const;
|
||||||
|
void onCreateTransactionError(const QString &msg);
|
||||||
|
void onOpenAliasResolve(const QString &openAlias);
|
||||||
|
void onSetRestoreHeight(unsigned int height);
|
||||||
|
void onPreferredFiatCurrencyChanged(const QString &symbol);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onWSNodes(const QJsonArray &nodes);
|
||||||
|
void onWSMessage(const QJsonObject& msg);
|
||||||
|
void onWSCCS(const QJsonArray &ccs_data);
|
||||||
|
void onWSReddit(const QJsonArray& reddit_data);
|
||||||
|
|
||||||
|
void onMoneySpent(const QString &txId, quint64 amount);
|
||||||
|
void onMoneyReceived(const QString &txId, quint64 amount);
|
||||||
|
void onUnconfirmedMoneyReceived(const QString &txId, quint64 amount);
|
||||||
|
void onWalletUpdate();
|
||||||
|
void onWalletRefreshed();
|
||||||
|
void onWalletOpened(Wallet *wallet);
|
||||||
|
void onWalletNewBlock(quint64 blockheight, quint64 targetHeight);
|
||||||
|
void onHeightRefreshed(quint64 walletHeight, quint64 daemonHeight, quint64 targetHeight);
|
||||||
|
void onTransactionCreated(PendingTransaction *tx, const QString &address, const QString &paymentId, quint32 mixin);
|
||||||
|
void onTransactionCommitted(bool status, PendingTransaction *t, const QStringList& txid);
|
||||||
|
void onConnectionStatusChanged(int status);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void balanceUpdated(double balance, double unlocked, QString balance_str, QString unlocked_str);
|
||||||
|
void blockchainSync(int height, int target);
|
||||||
|
void refreshSync(int height, int target);
|
||||||
|
void synchronized();
|
||||||
|
void blockHeightWSUpdated(QMap<QString, unsigned int> heights);
|
||||||
|
void walletSynchronized();
|
||||||
|
void walletOpened();
|
||||||
|
void walletClosed();
|
||||||
|
void walletCreatedError(const QString &msg);
|
||||||
|
void walletCreated(Wallet *wallet);
|
||||||
|
void walletOpenedError(QString msg);
|
||||||
|
void walletOpenPasswordNeeded(bool invalidPassword);
|
||||||
|
void transactionCommitted(bool status, PendingTransaction *tx, const QStringList& txid);
|
||||||
|
void createTransactionError(QString message);
|
||||||
|
void createTransactionCancelled(QString address, double amount);
|
||||||
|
void createTransactionSuccess(PendingTransaction *tx, const QString &address, const quint32 &mixin);
|
||||||
|
void redditUpdated(QList<QSharedPointer<RedditPost>> &posts);
|
||||||
|
void nodesUpdated(QList<QSharedPointer<FeatherNode>> &nodes);
|
||||||
|
void ccsUpdated(QList<QSharedPointer<CCSEntry>> &entries);
|
||||||
|
void nodeSourceChanged(NodeSource nodeSource);
|
||||||
|
void setCustomNodes(QList<FeatherNode> nodes);
|
||||||
|
void ccsEmpty();
|
||||||
|
void openAliasResolveError(const QString &msg);
|
||||||
|
void openAliasResolved(const QString &address, const QString &openAlias);
|
||||||
|
void setRestoreHeightError(const QString &msg);
|
||||||
|
void customRestoreHeightSet(unsigned int height);
|
||||||
|
void closeApplication();
|
||||||
|
void donationNag();
|
||||||
|
void initiateTransaction();
|
||||||
|
void endTransaction();
|
||||||
|
void walletClosing();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void sorry();
|
||||||
|
const unsigned int m_donationBoundary = 15;
|
||||||
|
UtilsNetworking *m_utilsNetworkingNodes;
|
||||||
|
QTimer *m_storeTimer = new QTimer(this);
|
||||||
|
QUrl m_wsUrl = QUrl(QStringLiteral("ws://6wku2m4zrv6j666crlo7lzofv6ud6enzllyhou3ijeigpukymi37caad.onion/ws"));
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //FEATHER_APPCONTEXT_H
|
100
src/assets.qrc
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
<!DOCTYPE RCC><RCC version="1.0">
|
||||||
|
<qresource prefix="/">
|
||||||
|
<file>assets/about.txt</file>
|
||||||
|
<file>assets/ack.txt</file>
|
||||||
|
<file>assets/contributors.txt</file>
|
||||||
|
<file>assets/feather.desktop</file>
|
||||||
|
<file>assets/images/appicons/32x32.png</file>
|
||||||
|
<file>assets/images/appicons/48x48.png</file>
|
||||||
|
<file>assets/images/appicons/64x64.png</file>
|
||||||
|
<file>assets/images/appicons/96x96.png</file>
|
||||||
|
<file>assets/images/appicons/128x128.png</file>
|
||||||
|
<file>assets/images/appicons/256x256.png</file>
|
||||||
|
<file>assets/images/arrow.svg</file>
|
||||||
|
<file>assets/images/bitcoin.png</file>
|
||||||
|
<file>assets/images/camera_dark.png</file>
|
||||||
|
<file>assets/images/camera_white.png</file>
|
||||||
|
<file>assets/images/clock1.png</file>
|
||||||
|
<file>assets/images/clock2.png</file>
|
||||||
|
<file>assets/images/clock3.png</file>
|
||||||
|
<file>assets/images/clock4.png</file>
|
||||||
|
<file>assets/images/clock5.png</file>
|
||||||
|
<file>assets/images/coins.png</file>
|
||||||
|
<file>assets/images/coldcard.png</file>
|
||||||
|
<file>assets/images/coldcard_unpaired.png</file>
|
||||||
|
<file>assets/images/confirmed.png</file>
|
||||||
|
<file>assets/images/confirmed.svg</file>
|
||||||
|
<file>assets/images/connect.svg</file>
|
||||||
|
<file>assets/images/copy.png</file>
|
||||||
|
<file>assets/images/cutexmrfox.png</file>
|
||||||
|
<file>assets/images/edit.png</file>
|
||||||
|
<file>assets/images/exchange.png</file>
|
||||||
|
<file>assets/images/expired.png</file>
|
||||||
|
<file>assets/images/eye1.png</file>
|
||||||
|
<file>assets/images/feather.png</file>
|
||||||
|
<file>assets/images/file.png</file>
|
||||||
|
<file>assets/images/ghost.png</file>
|
||||||
|
<file>assets/images/history.png</file>
|
||||||
|
<file>assets/images/info.png</file>
|
||||||
|
<file>assets/images/key.png</file>
|
||||||
|
<file>assets/images/ledger.png</file>
|
||||||
|
<file>assets/images/ledger_unpaired.png</file>
|
||||||
|
<file>assets/images/lightning.png</file>
|
||||||
|
<file>assets/images/lock.png</file>
|
||||||
|
<file>assets/images/lock.svg</file>
|
||||||
|
<file>assets/images/microphone.png</file>
|
||||||
|
<file>assets/images/network.png</file>
|
||||||
|
<file>assets/images/offline_tx.png</file>
|
||||||
|
<file>assets/images/person.svg</file>
|
||||||
|
<file>assets/images/photos/1.png</file>
|
||||||
|
<file>assets/images/preferences.png</file>
|
||||||
|
<file>assets/images/preferences.svg</file>
|
||||||
|
<file>assets/images/qrcode.png</file>
|
||||||
|
<file>assets/images/qrcode_white.png</file>
|
||||||
|
<file>assets/images/revealer_c.png</file>
|
||||||
|
<file>assets/images/revealer.png</file>
|
||||||
|
<file>assets/images/seal.png</file>
|
||||||
|
<file>assets/images/seed.png</file>
|
||||||
|
<file>assets/images/speaker.png</file>
|
||||||
|
<file>assets/images/status_connected_fork.png</file>
|
||||||
|
<file>assets/images/status_connected.png</file>
|
||||||
|
<file>assets/images/status_connected_proxy_fork.png</file>
|
||||||
|
<file>assets/images/status_connected_proxy.png</file>
|
||||||
|
<file>assets/images/status_connected_proxy.svg</file>
|
||||||
|
<file>assets/images/status_connected.svg</file>
|
||||||
|
<file>assets/images/status_disconnected.png</file>
|
||||||
|
<file>assets/images/status_disconnected.svg</file>
|
||||||
|
<file>assets/images/status_lagging_fork.png</file>
|
||||||
|
<file>assets/images/status_lagging.png</file>
|
||||||
|
<file>assets/images/status_lagging.svg</file>
|
||||||
|
<file>assets/images/status_waiting.png</file>
|
||||||
|
<file>assets/images/status_waiting.svg</file>
|
||||||
|
<file>assets/images/tab_addresses.png</file>
|
||||||
|
<file>assets/images/tab_coins.png</file>
|
||||||
|
<file>assets/images/tab_console.png</file>
|
||||||
|
<file>assets/images/tab_contacts.png</file>
|
||||||
|
<file>assets/images/tab_history.png</file>
|
||||||
|
<file>assets/images/tab_home.png</file>
|
||||||
|
<file>assets/images/tab_party.png</file>
|
||||||
|
<file>assets/images/tab_receive.png</file>
|
||||||
|
<file>assets/images/tab_send.png</file>
|
||||||
|
<file>assets/images/terminal.png</file>
|
||||||
|
<file>assets/images/tor_logo_disabled.png</file>
|
||||||
|
<file>assets/images/tor_logo.png</file>
|
||||||
|
<file>assets/images/trezor.png</file>
|
||||||
|
<file>assets/images/trezor_unpaired.png</file>
|
||||||
|
<file>assets/images/unconfirmed.png</file>
|
||||||
|
<file>assets/images/unlock.png</file>
|
||||||
|
<file>assets/images/unlock.svg</file>
|
||||||
|
<file>assets/images/unpaid.png</file>
|
||||||
|
<file>assets/images/update.png</file>
|
||||||
|
<file>assets/images/warning.png</file>
|
||||||
|
<file>assets/images/xmrto_big.png</file>
|
||||||
|
<file>assets/images/xmrto.png</file>
|
||||||
|
<file>assets/images/zoom.png</file>
|
||||||
|
<file>assets/mnemonic_25_english.txt</file>
|
||||||
|
<file>assets/restore_heights_monero_mainnet.txt</file>
|
||||||
|
<file>assets/restore_heights_monero_stagenet.txt</file>
|
||||||
|
<file>assets/user_agents.txt</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
33
src/assets/about.txt
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
Feather <feather_version> (<feather_git_head>)
|
||||||
|
|
||||||
|
https://featherwallet.org
|
||||||
|
|
||||||
|
Created by dsc <dsc@xmr.pm>, tobtoht <thotbot@protonmail.com>, and contributors.
|
||||||
|
|
||||||
|
Copyright (c) 2020-<current_year>, The Monero Project
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||||
|
used to endorse or promote products derived from this software without specific
|
||||||
|
prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||||
|
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
10
src/assets/ack.txt
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
Feather uses monero-seed written by Tevador, for 14 word mnemonic seeds.
|
||||||
|
|
||||||
|
Initial CMake support for the Monero GUI was coded by TheCharlatan/xiphon.
|
||||||
|
|
||||||
|
The wallet UI is heavily inspired by Electrum. We would like to recognize Thomas Voegtlin for his pioneering work on Bitcoin.
|
||||||
|
|
||||||
|
Huge thanks to nioc, fluffypony, wowario, thrmo for help during development.
|
||||||
|
|
||||||
|
Some more shoutouts for people for hosting nodes and/or having good ideas:
|
||||||
|
dnale0r, dEBRUYNE, binaryFate, lza_menace, jwinterm, kico, wowario
|
5
src/assets/contributors.txt
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
dsc <dsc@xmr.pm>
|
||||||
|
tobtoht <thotbot@protonmail.com>
|
||||||
|
selsta <selsta@sent.at>
|
||||||
|
Diego Salazar <rehrar@tuta.io>
|
||||||
|
Matt Smith <matt@offtopica.uk>
|
14
src/assets/feather.desktop
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
[Desktop Entry]
|
||||||
|
Comment=Lightweight Monero Wallet
|
||||||
|
Exec=feather
|
||||||
|
GenericName[en_US]=Monero Wallet
|
||||||
|
GenericName=Monero Wallet
|
||||||
|
Icon=feather
|
||||||
|
Name[en_US]=Feather
|
||||||
|
Name=Feather
|
||||||
|
Categories=Finance;Network;
|
||||||
|
StartupNotify=false
|
||||||
|
StartupWMClass=feather
|
||||||
|
Terminal=false
|
||||||
|
Type=Application
|
||||||
|
MimeType=x-scheme-handler/monero;
|
BIN
src/assets/images/appicons/128x128.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
src/assets/images/appicons/256x256.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
src/assets/images/appicons/32x32.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
src/assets/images/appicons/48x48.png
Normal file
After Width: | Height: | Size: 6.4 KiB |
BIN
src/assets/images/appicons/64x64.png
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
src/assets/images/appicons/64x64.png~
Executable file
After Width: | Height: | Size: 3.4 KiB |
BIN
src/assets/images/appicons/96x96.png
Normal file
After Width: | Height: | Size: 9.2 KiB |
BIN
src/assets/images/appicons/appicon.icns
Executable file
BIN
src/assets/images/appicons/appicon.ico
Normal file
After Width: | Height: | Size: 103 KiB |
BIN
src/assets/images/appicons/monero.png
Executable file
After Width: | Height: | Size: 6.8 KiB |
BIN
src/assets/images/appicons/monero_grey.png
Executable file
After Width: | Height: | Size: 3.9 KiB |
70
src/assets/images/arrow.svg
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="25"
|
||||||
|
height="14.33"
|
||||||
|
id="svg5719"
|
||||||
|
sodipodi:version="0.32"
|
||||||
|
inkscape:version="0.46"
|
||||||
|
version="1.0"
|
||||||
|
sodipodi:docname="U+2192.svg"
|
||||||
|
inkscape:output_extension="org.inkscape.output.svg.inkscape">
|
||||||
|
<defs
|
||||||
|
id="defs5721">
|
||||||
|
<inkscape:perspective
|
||||||
|
sodipodi:type="inkscape:persp3d"
|
||||||
|
inkscape:vp_x="0 : 526.18109 : 1"
|
||||||
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
|
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||||
|
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||||
|
id="perspective5727" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
gridtolerance="10000"
|
||||||
|
guidetolerance="10"
|
||||||
|
objecttolerance="10"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="7.7"
|
||||||
|
inkscape:cx="-6.9480519"
|
||||||
|
inkscape:cy="0"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:window-width="941"
|
||||||
|
inkscape:window-height="669"
|
||||||
|
inkscape:window-x="340"
|
||||||
|
inkscape:window-y="267" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5724">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(-129.2839,-764.01857)">
|
||||||
|
<path
|
||||||
|
style="font-size:39.50617218px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Unicode MS;-inkscape-font-specification:Arial Unicode MS"
|
||||||
|
d="M 153.63455,771.63163 C 150.59872,772.74111 148.22736,774.53943 146.5205,777.02659 L 145.22205,777.02659 C 145.80725,775.28315 146.7887,773.63722 148.16642,772.08883 L 129.93325,772.08883 L 129.93325,770.2966 L 148.16642,770.2966 C 146.7887,768.74822 145.80725,767.0962 145.22205,765.34054 L 146.5205,765.34054 C 148.22736,767.82772 150.59872,769.62605 153.63455,770.73551 L 153.63455,771.63163 z"
|
||||||
|
id="text6007" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.7 KiB |
BIN
src/assets/images/bitcoin.png
Normal file
After Width: | Height: | Size: 8.7 KiB |
BIN
src/assets/images/camera_dark.png
Normal file
After Width: | Height: | Size: 687 B |
BIN
src/assets/images/camera_white.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
src/assets/images/clock1.png
Normal file
After Width: | Height: | Size: 7.4 KiB |
BIN
src/assets/images/clock2.png
Normal file
After Width: | Height: | Size: 8.3 KiB |
BIN
src/assets/images/clock3.png
Normal file
After Width: | Height: | Size: 7.1 KiB |
BIN
src/assets/images/clock4.png
Normal file
After Width: | Height: | Size: 7.3 KiB |
BIN
src/assets/images/clock5.png
Normal file
After Width: | Height: | Size: 9.8 KiB |
BIN
src/assets/images/coins.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/assets/images/coldcard.png
Normal file
After Width: | Height: | Size: 528 B |
BIN
src/assets/images/coldcard_unpaired.png
Normal file
After Width: | Height: | Size: 788 B |
BIN
src/assets/images/confirmed.png
Normal file
After Width: | Height: | Size: 53 KiB |
44
src/assets/images/confirmed.svg
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<!-- https://commons.wikimedia.org/wiki/File:CrystalClearActionApply.svg -->
|
||||||
|
<svg width="512" height="512" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="linearGradient3930">
|
||||||
|
<stop style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
|
||||||
|
<stop style="stop-color:#b3d187;stop-opacity:1" offset="0.53316939"/>
|
||||||
|
<stop style="stop-color:#28f400;stop-opacity:1" offset="1"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3904">
|
||||||
|
<stop style="stop-color:#4df60b;stop-opacity:1" offset="0"/>
|
||||||
|
<stop style="stop-color:#008000;stop-opacity:1" offset="1"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3878">
|
||||||
|
<stop style="stop-color:#79ef39;stop-opacity:1" offset="0"/>
|
||||||
|
<stop style="stop-color:#e9ffe3;stop-opacity:1" offset="1"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3044">
|
||||||
|
<stop style="stop-color:#f9ffd1;stop-opacity:1" offset="0"/>
|
||||||
|
<stop style="stop-color:#84e246;stop-opacity:1" offset="0.25998953"/>
|
||||||
|
<stop style="stop-color:#008000;stop-opacity:1" offset="1"/>
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient cx="60.764378" cy="104.22466" r="63.17857" fx="60.764378" fy="104.22466" id="radialGradient3838" xlink:href="#linearGradient3044" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.85744972,-0.78795737,0.89944031,0.97876469,-84.596269,34.939755)"/>
|
||||||
|
<radialGradient cx="145" cy="29" r="230" id="radialGradient3838-0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.66070117,-0.56004574,0.69392651,0.81864398,-39.045089,37.984063)">
|
||||||
|
<stop style="stop-color:#FFFFFF;stop-opacity:1" offset="0"/>
|
||||||
|
<stop style="stop-color:#FFFFFF;stop-opacity:1" offset="0.20"/>
|
||||||
|
<stop style="stop-color:#8BE456;stop-opacity:1" offset="0.51"/>
|
||||||
|
<stop style="stop-color:#8BE456;stop-opacity:1" offset="0.74"/>
|
||||||
|
<stop style="stop-color:#8BE456;stop-opacity:1" offset="1"/>
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient cx="48.356026" cy="122.04626" r="63.17857" fx="48.356026" fy="122.04626" id="radialGradient3838-4" xlink:href="#linearGradient3904" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.97494521,-0.22244513,0.1978519,0.86715661,-18.612993,12.209071)"/>
|
||||||
|
<radialGradient cx="57.965954" cy="109.5996" r="63.17857" fx="57.965954" fy="109.5996" id="radialGradient3838-5" xlink:href="#linearGradient3930" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.77328328,-0.70601122,0.71173774,0.77955545,-64.080277,49.199946)"/>
|
||||||
|
</defs>
|
||||||
|
<g>
|
||||||
|
<path d="M 24.642857,32.642859 1.4285714,54.07143 51.071429,97.285716 126.78571,31.57143 l -22.5,-20 -52.142853,47.142858 z" id="path2997-1" style="fill:url(#radialGradient3838);fill-opacity:1;stroke:none"/>
|
||||||
|
<path d="M 1.4285714,54.428573 51.071429,97.64286 126.78571,31.928573 126.86922,40.559647 51.78571,108.71429 1.77525,63.026751 z" id="path2997-7" style="color:#000000;fill:url(#radialGradient3838-4);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/>
|
||||||
|
<path d="m 24.285714,39.785715 27.5,25.000001 52.142856,-46.428569 15.71429,14.64285 c 0,0 -14.28571,12.857149 -28.928573,25.714289 -14.642854,12.85714 -54.642859,15 -80.7142871,-5.71429 C 20.357143,43.714286 24.285714,39.785715 24.285714,39.785715 z" id="path3042" style="color:#000000;fill:url(#radialGradient3838-0);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/>
|
||||||
|
<path d="M 1.4285714,54.07143 51.071429,97.285716 126.78571,31.57143 51.071424,101.21429 z" id="path2997" style="color:#000000;fill:url(#radialGradient3838-5);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.1 KiB |
71
src/assets/images/connect.svg
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path d="M297.448,279.808c-5.533-5.532-14.505-5.532-20.038,0.001l-31.873,31.873l-45.219-45.219l31.873-31.874
|
||||||
|
c5.534-5.534,5.534-14.506,0-20.039c-5.533-5.534-14.506-5.534-20.039,0l-31.873,31.874l-25.485-25.485
|
||||||
|
c-5.533-5.534-14.506-5.534-20.039,0l-56.36,56.36c-39.275,39.274-41.73,101.64-7.364,143.801
|
||||||
|
c-0.46,0.358-0.909,0.738-1.332,1.161l-65.548,65.55c-5.534,5.533-5.534,14.506,0,20.039c2.767,2.767,6.393,4.15,10.019,4.15
|
||||||
|
c3.626,0,7.253-1.384,10.019-4.15l65.549-65.549c0.423-0.423,0.803-0.872,1.161-1.332c19.675,16.037,43.75,24.055,67.825,24.055
|
||||||
|
c27.515,0,55.029-10.473,75.976-31.42l56.36-56.36c5.534-5.533,5.534-14.506,0-20.039l-25.485-25.485l31.873-31.873
|
||||||
|
C302.982,294.314,302.982,285.341,297.448,279.808z M214.661,413.565c-30.845,30.843-81.029,30.843-111.874,0l-4.352-4.352
|
||||||
|
c-30.844-30.844-30.844-81.03,0-111.874l46.34-46.34l116.227,116.226L214.661,413.565z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path d="M507.849,24.19c5.534-5.533,5.534-14.505,0-20.039c-5.532-5.534-14.505-5.534-20.039,0l-65.549,65.548
|
||||||
|
c-0.423,0.422-0.801,0.87-1.159,1.33c-19.112-15.613-42.816-24.104-67.827-24.104c-28.7,0-55.682,11.177-75.976,31.471
|
||||||
|
l-56.36,56.36c-5.534,5.534-5.534,14.505,0,20.039L357.206,291.06c2.657,2.658,6.261,4.15,10.019,4.15
|
||||||
|
c3.758,0,7.363-1.493,10.019-4.15l56.36-56.36c20.294-20.294,31.47-47.276,31.47-75.975c0-25.011-8.49-48.715-24.104-67.827
|
||||||
|
c0.459-0.358,0.907-0.737,1.33-1.159L507.849,24.19z M413.565,214.662l-46.34,46.341L250.998,144.775l46.34-46.341
|
||||||
|
c14.942-14.941,34.807-23.17,55.937-23.17c21.131,0,40.996,8.229,55.937,23.17l4.352,4.352
|
||||||
|
c14.941,14.941,23.17,34.807,23.17,55.937C436.735,179.855,428.506,199.72,413.565,214.662z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path d="M374.062,196.728l-58.79-58.791c-5.533-5.534-14.506-5.534-20.039,0c-5.534,5.534-5.534,14.505,0,20.039l58.791,58.791
|
||||||
|
c2.767,2.767,6.393,4.15,10.019,4.15c3.626,0,7.253-1.383,10.019-4.15C379.596,211.233,379.596,202.262,374.062,196.728z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path d="M218.149,352.641l-58.791-58.791c-5.533-5.533-14.506-5.533-20.039,0c-5.533,5.534-5.533,14.506,0.001,20.039
|
||||||
|
l58.791,58.791c2.767,2.767,6.393,4.15,10.019,4.15c3.626,0,7.253-1.384,10.019-4.15
|
||||||
|
C223.683,367.146,223.683,358.173,218.149,352.641z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.7 KiB |
BIN
src/assets/images/copy.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
src/assets/images/cutexmrfox.png
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
src/assets/images/edit.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
src/assets/images/exchange.png
Normal file
After Width: | Height: | Size: 841 B |
BIN
src/assets/images/expired.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
src/assets/images/eye1.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
src/assets/images/feather.png
Normal file
After Width: | Height: | Size: 74 KiB |
BIN
src/assets/images/file.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
src/assets/images/ghost.png
Normal file
After Width: | Height: | Size: 127 KiB |
BIN
src/assets/images/history.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
src/assets/images/info.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
src/assets/images/key.png
Normal file
After Width: | Height: | Size: 5.3 KiB |
BIN
src/assets/images/ledger.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
src/assets/images/ledger_unpaired.png
Normal file
After Width: | Height: | Size: 2.1 KiB |