Compare commits
97 Commits
libssh-0.9
...
libssh-0.8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
efdd567a1b | ||
|
|
cff8f7c0b5 | ||
|
|
fe4a4b1b79 | ||
|
|
8caf653e97 | ||
|
|
88c4d532ab | ||
|
|
e69d063252 | ||
|
|
a35218da74 | ||
|
|
4d8e2cdc8b | ||
|
|
3d0f2977bf | ||
|
|
230929a4b2 | ||
|
|
c847216ca4 | ||
|
|
cacd2fa999 | ||
|
|
0b688e4829 | ||
|
|
27cf0ea06b | ||
|
|
e473108e1b | ||
|
|
c74cc9a606 | ||
|
|
619e60cf0e | ||
|
|
37b3657481 | ||
|
|
c1211a4e1a | ||
|
|
95d34b5937 | ||
|
|
6dc3f666c5 | ||
|
|
8e4491a532 | ||
|
|
492095b2a7 | ||
|
|
d516642980 | ||
|
|
193845ecdd | ||
|
|
598d04d5d9 | ||
|
|
06c5dd9c84 | ||
|
|
6632659907 | ||
|
|
86bf835d50 | ||
|
|
c9d0362a6b | ||
|
|
d2989f28db | ||
|
|
0bab6013d0 | ||
|
|
361d93586c | ||
|
|
0db13661b4 | ||
|
|
c866592d7d | ||
|
|
eb90325bed | ||
|
|
c878545977 | ||
|
|
741021513b | ||
|
|
97e8aba080 | ||
|
|
802d46d040 | ||
|
|
96718df15e | ||
|
|
89bd779e78 | ||
|
|
b5af3e74d7 | ||
|
|
2d3932d988 | ||
|
|
d0c1583ad2 | ||
|
|
59ff4064ba | ||
|
|
00a68c985f | ||
|
|
e862ea556c | ||
|
|
a4704cba0b | ||
|
|
455b3a7865 | ||
|
|
fabaab1540 | ||
|
|
8ac49ff181 | ||
|
|
cdf55a18d2 | ||
|
|
d158ca7101 | ||
|
|
664b7ebfa1 | ||
|
|
163c488e30 | ||
|
|
4b5bfa7a9d | ||
|
|
decbadda45 | ||
|
|
f00d780c16 | ||
|
|
1daa2e4609 | ||
|
|
d84bc3ad8e | ||
|
|
a9350e3205 | ||
|
|
95e3a7e7a3 | ||
|
|
e4cecee7d3 | ||
|
|
8b867b41d3 | ||
|
|
c6bd2fe734 | ||
|
|
d7e52b99bd | ||
|
|
a640d9472a | ||
|
|
b15103ef4e | ||
|
|
95071cd1fe | ||
|
|
18a888f9fb | ||
|
|
bbfc41948a | ||
|
|
c29a8cc084 | ||
|
|
54e7af83e6 | ||
|
|
3483d6327d | ||
|
|
5869345899 | ||
|
|
0cad2778b4 | ||
|
|
24de1fbde8 | ||
|
|
131728a680 | ||
|
|
e949e135b6 | ||
|
|
1510b63d20 | ||
|
|
0db4d9bd46 | ||
|
|
1e17e084bf | ||
|
|
a2c14c5ec5 | ||
|
|
b99849c831 | ||
|
|
c7d4286ca1 | ||
|
|
434e2b7212 | ||
|
|
acf0f0fa6e | ||
|
|
220e6b66e8 | ||
|
|
c4d4731ddf | ||
|
|
139ccaa78c | ||
|
|
c42410b560 | ||
|
|
120f11812d | ||
|
|
500486d501 | ||
|
|
6708debd4c | ||
|
|
852a8b4875 | ||
|
|
9c6b4ecb48 |
@@ -28,6 +28,25 @@ fedora/openssl_1.1.x/x86-64:
|
|||||||
script:
|
script:
|
||||||
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Debug
|
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Debug
|
||||||
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
|
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON .. &&
|
||||||
|
make -j$(nproc) && ctest --output-on-failure
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
|
fedora/openssl_1.1.x/x86-64/release:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD
|
||||||
|
script:
|
||||||
|
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Release
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON .. &&
|
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON .. &&
|
||||||
make -j$(nproc) && ctest --output-on-failure
|
make -j$(nproc) && ctest --output-on-failure
|
||||||
tags:
|
tags:
|
||||||
@@ -105,6 +124,7 @@ freebsd/x86-64:
|
|||||||
script:
|
script:
|
||||||
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Debug
|
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Debug
|
||||||
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
-DUNIT_TESTING=ON .. &&
|
-DUNIT_TESTING=ON .. &&
|
||||||
make && ctest --output-on-failure
|
make && ctest --output-on-failure
|
||||||
tags:
|
tags:
|
||||||
@@ -144,6 +164,7 @@ fedora/mbedtls/x86-64:
|
|||||||
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Debug
|
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Debug
|
||||||
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON
|
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
-DWITH_MBEDTLS=ON .. &&
|
-DWITH_MBEDTLS=ON .. &&
|
||||||
make -j$(nproc) && ctest --output-on-failure
|
make -j$(nproc) && ctest --output-on-failure
|
||||||
tags:
|
tags:
|
||||||
@@ -162,6 +183,7 @@ tumbleweed/openssl_1.1.x/x86-64:
|
|||||||
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Debug
|
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Debug
|
||||||
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
-DKRB5_CONFIG=/usr/lib/mit/bin/krb5-config
|
-DKRB5_CONFIG=/usr/lib/mit/bin/krb5-config
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON .. &&
|
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON .. &&
|
||||||
make -j$(nproc) && ctest --output-on-failure
|
make -j$(nproc) && ctest --output-on-failure
|
||||||
tags:
|
tags:
|
||||||
@@ -174,11 +196,45 @@ tumbleweed/openssl_1.1.x/x86-64:
|
|||||||
paths:
|
paths:
|
||||||
- obj/
|
- obj/
|
||||||
|
|
||||||
|
tumbleweed/openssl_1.1.x/x86-64/release:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
|
||||||
|
script:
|
||||||
|
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Release
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DKRB5_CONFIG=/usr/lib/mit/bin/krb5-config
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
|
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON .. &&
|
||||||
|
make -j$(nproc) && ctest --output-on-failure
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
|
tumbleweed/docs:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
|
||||||
|
script:
|
||||||
|
- mkdir -p obj && cd obj && cmake .. && make docs
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
tumbleweed/openssl_1.1.x/x86:
|
tumbleweed/openssl_1.1.x/x86:
|
||||||
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
|
||||||
script:
|
script:
|
||||||
- mkdir -p obj && cd obj && cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-cross-m32.cmake
|
- mkdir -p obj && cd obj && cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-cross-m32.cmake
|
||||||
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
-DUNIT_TESTING=ON .. &&
|
-DUNIT_TESTING=ON .. &&
|
||||||
make -j$(nproc) && ctest --output-on-failure
|
make -j$(nproc) && ctest --output-on-failure
|
||||||
tags:
|
tags:
|
||||||
@@ -238,6 +294,7 @@ mingw64:
|
|||||||
- export DISPLAY=:1
|
- export DISPLAY=:1
|
||||||
- mkdir -p obj && cd obj && mingw64-cmake -DCMAKE_BUILD_TYPE=Debug
|
- mkdir -p obj && cd obj && mingw64-cmake -DCMAKE_BUILD_TYPE=Debug
|
||||||
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
-DUNIT_TESTING=ON .. &&
|
-DUNIT_TESTING=ON .. &&
|
||||||
make -j$(nproc)
|
make -j$(nproc)
|
||||||
- export WINEPATH=/usr/x86_64-w64-mingw32/sys-root/mingw/bin
|
- export WINEPATH=/usr/x86_64-w64-mingw32/sys-root/mingw/bin
|
||||||
@@ -261,6 +318,7 @@ mingw32:
|
|||||||
- export DISPLAY=:1
|
- export DISPLAY=:1
|
||||||
- mkdir -p obj && cd obj && mingw32-cmake -DCMAKE_BUILD_TYPE=Debug
|
- mkdir -p obj && cd obj && mingw32-cmake -DCMAKE_BUILD_TYPE=Debug
|
||||||
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
-DUNIT_TESTING=ON .. &&
|
-DUNIT_TESTING=ON .. &&
|
||||||
make -j$(nproc)
|
make -j$(nproc)
|
||||||
- export WINEPATH=/usr/i686-w64-mingw32/sys-root/mingw/bin
|
- export WINEPATH=/usr/i686-w64-mingw32/sys-root/mingw/bin
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
cmake_minimum_required(VERSION 3.2.0)
|
cmake_minimum_required(VERSION 3.3.0)
|
||||||
cmake_policy(SET CMP0048 NEW)
|
cmake_policy(SET CMP0048 NEW)
|
||||||
|
|
||||||
project(libssh VERSION 0.8.0 LANGUAGES C)
|
project(libssh VERSION 0.8.2 LANGUAGES C)
|
||||||
|
|
||||||
# global needed variable
|
# global needed variable
|
||||||
set(APPLICATION_NAME ${PROJECT_NAME})
|
set(APPLICATION_NAME ${PROJECT_NAME})
|
||||||
@@ -13,7 +13,7 @@ set(APPLICATION_NAME ${PROJECT_NAME})
|
|||||||
# Increment AGE. Set REVISION to 0
|
# Increment AGE. Set REVISION to 0
|
||||||
# If the source code was changed, but there were no interface changes:
|
# If the source code was changed, but there were no interface changes:
|
||||||
# Increment REVISION.
|
# Increment REVISION.
|
||||||
set(LIBRARY_VERSION "4.5.0")
|
set(LIBRARY_VERSION "4.6.0")
|
||||||
set(LIBRARY_SOVERSION "4")
|
set(LIBRARY_SOVERSION "4")
|
||||||
|
|
||||||
# where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked
|
# where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked
|
||||||
@@ -24,11 +24,12 @@ set(CMAKE_MODULE_PATH
|
|||||||
# add definitions
|
# add definitions
|
||||||
include(DefineCMakeDefaults)
|
include(DefineCMakeDefaults)
|
||||||
include(DefinePlatformDefaults)
|
include(DefinePlatformDefaults)
|
||||||
include(DefineCompilerFlags)
|
|
||||||
include(DefineInstallationPaths)
|
include(DefineInstallationPaths)
|
||||||
include(DefineOptions.cmake)
|
include(DefineOptions.cmake)
|
||||||
include(CPackConfig.cmake)
|
include(CPackConfig.cmake)
|
||||||
|
|
||||||
|
include(CompilerChecks.cmake)
|
||||||
|
|
||||||
# disallow in-source build
|
# disallow in-source build
|
||||||
include(MacroEnsureOutOfSourceBuild)
|
include(MacroEnsureOutOfSourceBuild)
|
||||||
macro_ensure_out_of_source_build("${PROJECT_NAME} requires an out of source build. Please create a separate build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there.")
|
macro_ensure_out_of_source_build("${PROJECT_NAME} requires an out of source build. Please create a separate build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there.")
|
||||||
@@ -83,7 +84,7 @@ endif (BSD OR SOLARIS OR OSX)
|
|||||||
|
|
||||||
# Disable symbol versioning in non UNIX platforms
|
# Disable symbol versioning in non UNIX platforms
|
||||||
if (UNIX)
|
if (UNIX)
|
||||||
find_package(ABIMap)
|
find_package(ABIMap 0.3.1)
|
||||||
else (UNIX)
|
else (UNIX)
|
||||||
set(WITH_SYMBOL_VERSIONING OFF)
|
set(WITH_SYMBOL_VERSIONING OFF)
|
||||||
endif (UNIX)
|
endif (UNIX)
|
||||||
@@ -158,13 +159,13 @@ if (WITH_SYMBOL_VERSIONING AND ABIMAP_FOUND)
|
|||||||
message(STATUS "Library version bumped to ${LIBRARY_VERSION}: Updating ABI")
|
message(STATUS "Library version bumped to ${LIBRARY_VERSION}: Updating ABI")
|
||||||
|
|
||||||
# Get the list of header files
|
# Get the list of header files
|
||||||
get_file_list("${PROJECT_NAME}_header_list"
|
get_file_list(${PROJECT_NAME}_header_list
|
||||||
DIRECTORIES "${CMAKE_SOURCE_DIR}/include/libssh"
|
DIRECTORIES "${CMAKE_SOURCE_DIR}/include/libssh"
|
||||||
FILES_PATTERNS "*.h")
|
FILES_PATTERNS "*.h")
|
||||||
|
|
||||||
# Extract the symbols marked as "LIBSSH_API" from the header files
|
# Extract the symbols marked as "LIBSSH_API" from the header files
|
||||||
extract_symbols(${PROJECT_NAME}.symbols
|
extract_symbols(${PROJECT_NAME}.symbols
|
||||||
HEADERS_LIST_FILE "${PROJECT_NAME}_header_list"
|
HEADERS_LIST ${PROJECT_NAME}_header_list
|
||||||
FILTER_PATTERN "LIBSSH_API"
|
FILTER_PATTERN "LIBSSH_API"
|
||||||
COPY_TO "${CMAKE_SOURCE_DIR}/src/ABI/${PROJECT_NAME}-${LIBRARY_VERSION}.symbols")
|
COPY_TO "${CMAKE_SOURCE_DIR}/src/ABI/${PROJECT_NAME}-${LIBRARY_VERSION}.symbols")
|
||||||
|
|
||||||
@@ -180,7 +181,7 @@ if (WITH_SYMBOL_VERSIONING AND ABIMAP_FOUND)
|
|||||||
|
|
||||||
# Generate the symbol version map file
|
# Generate the symbol version map file
|
||||||
generate_map_file(${_SYMBOL_TARGET}
|
generate_map_file(${_SYMBOL_TARGET}
|
||||||
SYMBOLS "${PROJECT_NAME}.symbols"
|
SYMBOLS ${PROJECT_NAME}.symbols
|
||||||
RELEASE_NAME_VERSION ${PROJECT_NAME}_${LIBRARY_VERSION}
|
RELEASE_NAME_VERSION ${PROJECT_NAME}_${LIBRARY_VERSION}
|
||||||
CURRENT_MAP ${MAP_PATH}
|
CURRENT_MAP ${MAP_PATH}
|
||||||
COPY_TO ${MAP_PATH}
|
COPY_TO ${MAP_PATH}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
|
|||||||
|
|
||||||
# SOURCE GENERATOR
|
# SOURCE GENERATOR
|
||||||
set(CPACK_SOURCE_GENERATOR "TXZ")
|
set(CPACK_SOURCE_GENERATOR "TXZ")
|
||||||
set(CPACK_SOURCE_IGNORE_FILES "~$;[.]swp$;/[.]git/;.gitignore;build;obj*;tags;cscope.*")
|
set(CPACK_SOURCE_IGNORE_FILES "~$;[.]swp$;/[.]git/;.gitignore;/build*;/obj*;tags;cscope.*")
|
||||||
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
|
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
|
||||||
|
|
||||||
### NSIS INSTALLER
|
### NSIS INSTALLER
|
||||||
|
|||||||
16
ChangeLog
@@ -1,6 +1,22 @@
|
|||||||
ChangeLog
|
ChangeLog
|
||||||
==========
|
==========
|
||||||
|
|
||||||
|
version 0.8.2 (released 2018-08-30)
|
||||||
|
* Added sha256 fingerprints for pubkeys
|
||||||
|
* Improved compiler flag detection
|
||||||
|
* Fixed race condition in reading sftp messages
|
||||||
|
* Fixed doxygen generation and added modern style
|
||||||
|
* Fixed library initialization on Windows
|
||||||
|
* Fixed __bounded__ attribute detection
|
||||||
|
* Fixed a bug in the options parser
|
||||||
|
* Fixed documentation for new knwon_hosts API
|
||||||
|
|
||||||
|
version 0.8.1 (released 2018-08-13)
|
||||||
|
* Fixed version number in the header
|
||||||
|
* Fixed version number in pkg-config and cmake config
|
||||||
|
* Fixed library initialization
|
||||||
|
* Fixed attribute detection
|
||||||
|
|
||||||
version 0.8.0 (released 2018-08-10)
|
version 0.8.0 (released 2018-08-10)
|
||||||
* Removed support for deprecated SSHv1 protocol
|
* Removed support for deprecated SSHv1 protocol
|
||||||
* Added new connector API for clients
|
* Added new connector API for clients
|
||||||
|
|||||||
93
CompilerChecks.cmake
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
include(AddCCompilerFlag)
|
||||||
|
include(CheckCCompilerFlagSSP)
|
||||||
|
|
||||||
|
if (UNIX)
|
||||||
|
#
|
||||||
|
# Check for -Werror turned on if possible
|
||||||
|
#
|
||||||
|
# This will prevent that compiler flags are detected incorrectly.
|
||||||
|
#
|
||||||
|
check_c_compiler_flag("-Werror" REQUIRED_FLAGS_WERROR)
|
||||||
|
if (REQUIRED_FLAGS_WERROR)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-Werror")
|
||||||
|
|
||||||
|
if (PICKY_DEVELOPER)
|
||||||
|
list(APPEND SUPPORTED_COMPILER_FLAGS "-Werror")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_c_compiler_flag("-std=gnu99" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-pedantic" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-pedantic-errors" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wall" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wshadow" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wmissing-prototypes" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wcast-align" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
#add_c_compiler_flag("-Wcast-qual" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=address" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wstrict-prototypes" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=strict-prototypes" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wwrite-strings" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=write-strings" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror-implicit-function-declaration" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wpointer-arith" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=pointer-arith" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wdeclaration-after-statement" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=declaration-after-statement" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wreturn-type" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=return-type" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wuninitialized" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=uninitialized" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wimplicit-fallthrough" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=strict-overflow" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wstrict-overflow=2" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wno-format-zero-length" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
|
||||||
|
check_c_compiler_flag("-Wformat" REQUIRED_FLAGS_WFORMAT)
|
||||||
|
if (REQUIRED_FLAGS_WFORMAT)
|
||||||
|
list(APPEND SUPPORTED_COMPILER_FLAGS "-Wformat")
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Wformat")
|
||||||
|
endif()
|
||||||
|
add_c_compiler_flag("-Wformat-security" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=format-security" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
|
||||||
|
# Allow zero for a variadic macro argument
|
||||||
|
add_c_compiler_flag("-Wno-gnu-zero-variadic-macro-arguments" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
|
||||||
|
add_c_compiler_flag("-fno-common" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
|
||||||
|
if (CMAKE_BUILD_TYPE)
|
||||||
|
string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
|
||||||
|
if (CMAKE_BUILD_TYPE_LOWER MATCHES (release|relwithdebinfo|minsizerel))
|
||||||
|
add_c_compiler_flag("-Wp,-D_FORTIFY_SOURCE=2" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
check_c_compiler_flag_ssp("-fstack-protector" WITH_STACK_PROTECTOR)
|
||||||
|
if (WITH_STACK_PROTECTOR)
|
||||||
|
list(APPEND SUPPORTED_COMPILER_FLAGS "-fstack-protector")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (PICKY_DEVELOPER)
|
||||||
|
add_c_compiler_flag("-Wno-error=deprecated-declarations" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wno-error=tautological-compare" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Unset CMAKE_REQUIRED_FLAGS
|
||||||
|
unset(CMAKE_REQUIRED_FLAGS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (MSVC)
|
||||||
|
add_c_compiler_flag("/D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("/D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("/D _CRT_NONSTDC_NO_WARNINGS=1" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("/D _CRT_SECURE_NO_WARNINGS=1" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# This removes this annoying warning
|
||||||
|
# "warning: 'BN_CTX_free' is deprecated: first deprecated in OS X 10.7 [-Wdeprecated-declarations]"
|
||||||
|
if (OSX)
|
||||||
|
add_c_compiler_flag("-Wno-deprecated-declarations" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(DEFAULT_C_COMPILE_FLAGS ${SUPPORTED_COMPILER_FLAGS} CACHE INTERNAL "Default C Compiler Flags" FORCE)
|
||||||
@@ -7,8 +7,8 @@ include(CheckTypeSize)
|
|||||||
include(CheckCXXSourceCompiles)
|
include(CheckCXXSourceCompiles)
|
||||||
include(TestBigEndian)
|
include(TestBigEndian)
|
||||||
|
|
||||||
set(PACKAGE ${APPLICATION_NAME})
|
set(PACKAGE ${PROJECT_NAME})
|
||||||
set(VERSION ${APPLICATION_VERSION})
|
set(VERSION ${PROJECT_VERSION})
|
||||||
set(DATADIR ${DATA_INSTALL_DIR})
|
set(DATADIR ${DATA_INSTALL_DIR})
|
||||||
set(LIBDIR ${LIB_INSTALL_DIR})
|
set(LIBDIR ${LIB_INSTALL_DIR})
|
||||||
set(PLUGINDIR "${PLUGIN_INSTALL_DIR}-${LIBRARY_SOVERSION}")
|
set(PLUGINDIR "${PLUGIN_INSTALL_DIR}-${LIBRARY_SOVERSION}")
|
||||||
@@ -150,6 +150,7 @@ endif (NOT WITH_MBEDTLS)
|
|||||||
|
|
||||||
check_function_exists(isblank HAVE_ISBLANK)
|
check_function_exists(isblank HAVE_ISBLANK)
|
||||||
check_function_exists(strncpy HAVE_STRNCPY)
|
check_function_exists(strncpy HAVE_STRNCPY)
|
||||||
|
check_function_exists(strndup HAVE_STRNDUP)
|
||||||
check_function_exists(strtoull HAVE_STRTOULL)
|
check_function_exists(strtoull HAVE_STRTOULL)
|
||||||
check_function_exists(explicit_bzero HAVE_EXPLICIT_BZERO)
|
check_function_exists(explicit_bzero HAVE_EXPLICIT_BZERO)
|
||||||
check_function_exists(memset_s HAVE_MEMSET_S)
|
check_function_exists(memset_s HAVE_MEMSET_S)
|
||||||
@@ -267,25 +268,50 @@ int main(void) {
|
|||||||
return 0;
|
return 0;
|
||||||
}" HAVE_MSC_THREAD_LOCAL_STORAGE)
|
}" HAVE_MSC_THREAD_LOCAL_STORAGE)
|
||||||
|
|
||||||
|
###########################################################
|
||||||
|
# For detecting attributes we need to treat warnings as
|
||||||
|
# errors
|
||||||
|
if (UNIX)
|
||||||
|
check_c_compiler_flag("-Werror" REQUIRED_FLAGS_WERROR)
|
||||||
|
if (REQUIRED_FLAGS_WERROR)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-Werror")
|
||||||
|
endif()
|
||||||
|
endif (UNIX)
|
||||||
|
|
||||||
|
check_c_source_compiles("
|
||||||
|
void test_constructor_attribute(void) __attribute__ ((constructor));
|
||||||
|
|
||||||
|
void test_constructor_attribute(void)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
return 0;
|
||||||
|
}" HAVE_CONSTRUCTOR_ATTRIBUTE)
|
||||||
|
|
||||||
|
check_c_source_compiles("
|
||||||
|
void test_destructor_attribute(void) __attribute__ ((destructor));
|
||||||
|
|
||||||
|
void test_destructor_attribute(void)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
return 0;
|
||||||
|
}" HAVE_DESTRUCTOR_ATTRIBUTE)
|
||||||
|
|
||||||
check_c_source_compiles("
|
check_c_source_compiles("
|
||||||
#define FALL_THROUGH __attribute__((fallthrough))
|
#define FALL_THROUGH __attribute__((fallthrough))
|
||||||
|
|
||||||
enum direction_e {
|
|
||||||
UP = 0,
|
|
||||||
DOWN,
|
|
||||||
};
|
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
enum direction_e key = UP;
|
int i = 2;
|
||||||
int i = 10;
|
|
||||||
int j = 0;
|
|
||||||
|
|
||||||
switch (key) {
|
switch (i) {
|
||||||
case UP:
|
case 0:
|
||||||
i = 5;
|
|
||||||
FALL_THROUGH;
|
FALL_THROUGH;
|
||||||
case DOWN:
|
case 1:
|
||||||
j = i * 2;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -332,11 +358,31 @@ int main(void) {
|
|||||||
return 0;
|
return 0;
|
||||||
}" HAVE_COMPILER__FUNCTION__)
|
}" HAVE_COMPILER__FUNCTION__)
|
||||||
|
|
||||||
|
|
||||||
check_c_source_compiles("
|
check_c_source_compiles("
|
||||||
void chacha_keysetup(struct chacha_ctx *x, const u_char *k, u_int kbits)
|
#define ARRAY_LEN 16
|
||||||
__attribute__((__bounded__(__minbytes__, 2, CHACHA_MINKEYLEN)));
|
void test_attr(const unsigned char *k)
|
||||||
int main(void) { return 0; }" HAVE_GCC_BOUNDED_ATTRIBUTE)
|
__attribute__((__bounded__(__minbytes__, 2, 16)));
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
return 0;
|
||||||
|
}" HAVE_GCC_BOUNDED_ATTRIBUTE)
|
||||||
|
|
||||||
|
# Stop treating warnings as errors
|
||||||
|
unset(CMAKE_REQUIRED_FLAGS)
|
||||||
|
|
||||||
|
# Check for version script support
|
||||||
|
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map" "VERS_1 {
|
||||||
|
global: sym;
|
||||||
|
};
|
||||||
|
VERS_2 {
|
||||||
|
global: sym;
|
||||||
|
} VERS_1;
|
||||||
|
")
|
||||||
|
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--version-script=\"${CMAKE_CURRENT_BINARY_DIR}/conftest.map\"")
|
||||||
|
check_c_source_compiles("int main(void) { return 0; }" HAVE_LD_VERSION_SCRIPT)
|
||||||
|
unset(CMAKE_REQUIRED_FLAGS)
|
||||||
|
file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
|
||||||
|
|
||||||
if (WITH_DEBUG_CRYPTO)
|
if (WITH_DEBUG_CRYPTO)
|
||||||
set(DEBUG_CRYPTO 1)
|
set(DEBUG_CRYPTO 1)
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ option(WITH_NACL "Build with libnacl (curve25519)" ON)
|
|||||||
option(WITH_SYMBOL_VERSIONING "Build with symbol versioning" ON)
|
option(WITH_SYMBOL_VERSIONING "Build with symbol versioning" ON)
|
||||||
option(WITH_ABI_BREAK "Allow ABI break" OFF)
|
option(WITH_ABI_BREAK "Allow ABI break" OFF)
|
||||||
option(FUZZ_TESTING "Build with fuzzer for the server" OFF)
|
option(FUZZ_TESTING "Build with fuzzer for the server" OFF)
|
||||||
|
option(PICKY_DEVELOPER "Build with picky developer flags" OFF)
|
||||||
|
|
||||||
if (WITH_ZLIB)
|
if (WITH_ZLIB)
|
||||||
set(WITH_LIBZ ON)
|
set(WITH_LIBZ ON)
|
||||||
else (WITH_ZLIB)
|
else (WITH_ZLIB)
|
||||||
@@ -29,8 +31,12 @@ if(WITH_BENCHMARKS)
|
|||||||
set(UNIT_TESTING ON)
|
set(UNIT_TESTING ON)
|
||||||
endif(WITH_BENCHMARKS)
|
endif(WITH_BENCHMARKS)
|
||||||
|
|
||||||
|
if (WITH_STATIC_LIB)
|
||||||
|
set(BUILD_STATIC_LIB ON)
|
||||||
|
endif (WITH_STATIC_LIB)
|
||||||
|
|
||||||
if (UNIT_TESTING)
|
if (UNIT_TESTING)
|
||||||
set(WITH_STATIC_LIB ON)
|
set(BUILD_STATIC_LIB ON)
|
||||||
endif (UNIT_TESTING)
|
endif (UNIT_TESTING)
|
||||||
|
|
||||||
if (WITH_NACL)
|
if (WITH_NACL)
|
||||||
|
|||||||
21
cmake/Modules/AddCCompilerFlag.cmake
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#
|
||||||
|
# add_c_compiler_flag("-Werror" SUPPORTED_CFLAGS)
|
||||||
|
#
|
||||||
|
# Copyright (c) 2018 Andreas Schneider <asn@cryptomilk.org>
|
||||||
|
#
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||||
|
|
||||||
|
include(CheckCCompilerFlag)
|
||||||
|
|
||||||
|
macro(add_c_compiler_flag _COMPILER_FLAG _OUTPUT_VARIABLE)
|
||||||
|
string(TOUPPER ${_COMPILER_FLAG} _COMPILER_FLAG_NAME)
|
||||||
|
string(REGEX REPLACE "^-" "" _COMPILER_FLAG_NAME "${_COMPILER_FLAG_NAME}")
|
||||||
|
string(REGEX REPLACE "(-|=|\ )" "_" _COMPILER_FLAG_NAME "${_COMPILER_FLAG_NAME}")
|
||||||
|
|
||||||
|
check_c_compiler_flag("${_COMPILER_FLAG}" WITH_${_COMPILER_FLAG_NAME}_FLAG)
|
||||||
|
if (WITH_${_COMPILER_FLAG_NAME}_FLAG)
|
||||||
|
#string(APPEND ${_OUTPUT_VARIABLE} "${_COMPILER_FLAG} ")
|
||||||
|
list(APPEND ${_OUTPUT_VARIABLE} ${_COMPILER_FLAG})
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
@@ -15,12 +15,15 @@
|
|||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||||
|
|
||||||
|
# Requires cmake 3.10
|
||||||
|
#include_guard(GLOBAL)
|
||||||
include(CheckCSourceCompiles)
|
include(CheckCSourceCompiles)
|
||||||
|
|
||||||
function(CHECK_C_COMPILER_FLAG_SSP _FLAG _RESULT)
|
macro(CHECK_C_COMPILER_FLAG_SSP _FLAG _RESULT)
|
||||||
set(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}")
|
set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
|
||||||
set(CMAKE_REQUIRED_DEFINITIONS "${_FLAG}")
|
set(CMAKE_REQUIRED_FLAGS "${_FLAG}")
|
||||||
|
|
||||||
check_c_source_compiles("int main(int argc, char **argv) { char buffer[256]; return buffer[argc]=0;}" ${_RESULT})
|
check_c_source_compiles("int main(int argc, char **argv) { char buffer[256]; return buffer[argc]=0;}" ${_RESULT})
|
||||||
set(CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}")
|
|
||||||
endfunction(CHECK_C_COMPILER_FLAG_SSP)
|
set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
|
||||||
|
endmacro(CHECK_C_COMPILER_FLAG_SSP)
|
||||||
|
|||||||
@@ -1,84 +0,0 @@
|
|||||||
# define system dependent compiler flags
|
|
||||||
|
|
||||||
include(CheckCCompilerFlag)
|
|
||||||
include(CheckCCompilerFlagSSP)
|
|
||||||
|
|
||||||
if (UNIX AND NOT WIN32)
|
|
||||||
#
|
|
||||||
# Define GNUCC compiler flags
|
|
||||||
#
|
|
||||||
if (${CMAKE_C_COMPILER_ID} MATCHES "(GNU|Clang)")
|
|
||||||
|
|
||||||
# add -Wconversion ?
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -pedantic -pedantic-errors")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wshadow -Wmissing-prototypes -Wdeclaration-after-statement")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused -Wfloat-equal -Wpointer-arith -Wwrite-strings -Wformat-security")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute")
|
|
||||||
|
|
||||||
# with -fPIC
|
|
||||||
check_c_compiler_flag("-fPIC" WITH_FPIC)
|
|
||||||
if (WITH_FPIC)
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
|
|
||||||
endif (WITH_FPIC)
|
|
||||||
|
|
||||||
check_c_compiler_flag_ssp("-fstack-protector" WITH_STACK_PROTECTOR)
|
|
||||||
if (WITH_STACK_PROTECTOR)
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector")
|
|
||||||
endif (WITH_STACK_PROTECTOR)
|
|
||||||
|
|
||||||
if (CMAKE_BUILD_TYPE)
|
|
||||||
string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
|
|
||||||
if (CMAKE_BUILD_TYPE_LOWER MATCHES (release|relwithdebinfo|minsizerel))
|
|
||||||
check_c_compiler_flag("-Wp,-D_FORTIFY_SOURCE=2" WITH_FORTIFY_SOURCE)
|
|
||||||
if (WITH_FORTIFY_SOURCE)
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wp,-D_FORTIFY_SOURCE=2")
|
|
||||||
endif (WITH_FORTIFY_SOURCE)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif (${CMAKE_C_COMPILER_ID} MATCHES "(GNU|Clang)")
|
|
||||||
|
|
||||||
#
|
|
||||||
# Check for large filesystem support
|
|
||||||
#
|
|
||||||
if (CMAKE_SIZEOF_VOID_P MATCHES "8")
|
|
||||||
# with large file support
|
|
||||||
execute_process(
|
|
||||||
COMMAND
|
|
||||||
getconf LFS64_CFLAGS
|
|
||||||
OUTPUT_VARIABLE
|
|
||||||
_lfs_CFLAGS
|
|
||||||
ERROR_QUIET
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
else (CMAKE_SIZEOF_VOID_P MATCHES "8")
|
|
||||||
# with large file support
|
|
||||||
execute_process(
|
|
||||||
COMMAND
|
|
||||||
getconf LFS_CFLAGS
|
|
||||||
OUTPUT_VARIABLE
|
|
||||||
_lfs_CFLAGS
|
|
||||||
ERROR_QUIET
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
endif (CMAKE_SIZEOF_VOID_P MATCHES "8")
|
|
||||||
if (_lfs_CFLAGS)
|
|
||||||
string(REGEX REPLACE "[\r\n]" " " "${_lfs_CFLAGS}" "${${_lfs_CFLAGS}}")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_lfs_CFLAGS}")
|
|
||||||
endif (_lfs_CFLAGS)
|
|
||||||
|
|
||||||
endif (UNIX AND NOT WIN32)
|
|
||||||
|
|
||||||
if (MSVC)
|
|
||||||
# Use secure functions by defaualt and suppress warnings about
|
|
||||||
#"deprecated" functions
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_NONSTDC_NO_WARNINGS=1 /D _CRT_SECURE_NO_WARNINGS=1")
|
|
||||||
endif (MSVC)
|
|
||||||
|
|
||||||
# This removes this annoying warning
|
|
||||||
# "warning: 'BN_CTX_free' is deprecated: first deprecated in OS X 10.7 [-Wdeprecated-declarations]"
|
|
||||||
if (OSX)
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
|
|
||||||
endif (OSX)
|
|
||||||
|
|
||||||
@@ -85,4 +85,8 @@ endforeach()
|
|||||||
|
|
||||||
list(REMOVE_DUPLICATES symbols)
|
list(REMOVE_DUPLICATES symbols)
|
||||||
|
|
||||||
file(WRITE ${OUTPUT_PATH} "${symbols}")
|
list(SORT symbols)
|
||||||
|
|
||||||
|
string(REPLACE ";" "\n" symbols_list "${symbols}")
|
||||||
|
|
||||||
|
file(WRITE ${OUTPUT_PATH} "${symbols_list}")
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
#
|
#
|
||||||
# generate_map_file(target_name
|
# generate_map_file(target_name
|
||||||
# RELEASE_NAME_VERSION release_name
|
# RELEASE_NAME_VERSION release_name
|
||||||
# SYMBOLS symbols_file
|
# SYMBOLS symbols_target
|
||||||
# [CURRENT_MAP cur_map]
|
# [CURRENT_MAP cur_map]
|
||||||
# [FINAL]
|
# [FINAL]
|
||||||
# [BREAK_ABI]
|
# [BREAK_ABI]
|
||||||
@@ -55,8 +55,9 @@
|
|||||||
# added to the symbols in the format ``lib_name_1_2_3``.
|
# added to the symbols in the format ``lib_name_1_2_3``.
|
||||||
#
|
#
|
||||||
# ``SYMBOLS``:
|
# ``SYMBOLS``:
|
||||||
# Required, expects a file containing the list of symbols to be added to the
|
# Required, expects a target with the property ``LIST_FILE`` containing a path
|
||||||
# symbol version script.
|
# to a file containing the list of symbols to be added to the symbol version
|
||||||
|
# script.
|
||||||
#
|
#
|
||||||
# ``CURRENT_MAP``:
|
# ``CURRENT_MAP``:
|
||||||
# Optional. If given, the new set of symbols will be checked against the
|
# Optional. If given, the new set of symbols will be checked against the
|
||||||
@@ -87,9 +88,15 @@
|
|||||||
# find_package(ABIMap)
|
# find_package(ABIMap)
|
||||||
# generate_map_file("lib.map"
|
# generate_map_file("lib.map"
|
||||||
# RELEASE_NAME_VERSION "lib_1_0_0"
|
# RELEASE_NAME_VERSION "lib_1_0_0"
|
||||||
# SYMBOLS "symbol1;symbol2"
|
# SYMBOLS symbols
|
||||||
# )
|
# )
|
||||||
#
|
#
|
||||||
|
# Where the target ``symbols`` has its property ``LIST_FILE`` set to the path to
|
||||||
|
# a file containing::
|
||||||
|
#
|
||||||
|
# ``symbol1``
|
||||||
|
# ``symbol2``
|
||||||
|
#
|
||||||
# This example would result in the symbol version script to be created in
|
# This example would result in the symbol version script to be created in
|
||||||
# ``${CMAKE_CURRENT_BINARY_DIR}/lib.map`` containing the provided symbols.
|
# ``${CMAKE_CURRENT_BINARY_DIR}/lib.map`` containing the provided symbols.
|
||||||
#
|
#
|
||||||
@@ -102,8 +109,8 @@
|
|||||||
# )
|
# )
|
||||||
#
|
#
|
||||||
# ``target_name``:
|
# ``target_name``:
|
||||||
# Required, expects the name of the target to be created. A file named after
|
# Required, expects the name of the target to be created. A file named as
|
||||||
# the string given in ``target_name`` will be created in
|
# ``${target_name}.list`` will be created in
|
||||||
# ``${CMAKE_CURRENT_BINARY_DIR}`` to receive the list of files found.
|
# ``${CMAKE_CURRENT_BINARY_DIR}`` to receive the list of files found.
|
||||||
#
|
#
|
||||||
# ``DIRECTORIES``:
|
# ``DIRECTORIES``:
|
||||||
@@ -112,7 +119,7 @@
|
|||||||
#
|
#
|
||||||
# ``FILES_PATTERN``:
|
# ``FILES_PATTERN``:
|
||||||
# Required, expects a list of matching expressions to find the files to be
|
# Required, expects a list of matching expressions to find the files to be
|
||||||
# considered.
|
# considered in the directories.
|
||||||
#
|
#
|
||||||
# ``COPY_TO``:
|
# ``COPY_TO``:
|
||||||
# Optional, expects a string containing the path to where the file containing
|
# Optional, expects a string containing the path to where the file containing
|
||||||
@@ -120,7 +127,9 @@
|
|||||||
#
|
#
|
||||||
# This command searches the directories provided in ``DIRECTORIES`` for files
|
# This command searches the directories provided in ``DIRECTORIES`` for files
|
||||||
# matching any of the patterns provided in ``FILES_PATTERNS``. The obtained list
|
# matching any of the patterns provided in ``FILES_PATTERNS``. The obtained list
|
||||||
# is written to the path specified by ``output``.
|
# is written to the path specified by ``output``. A target named ``target_name``
|
||||||
|
# will be created and its property ``LIST_FILE`` will be set to contain
|
||||||
|
# ``${CMAKE_CURRENT_BINARY_DIR}/${target_name}.list``
|
||||||
#
|
#
|
||||||
# Example:
|
# Example:
|
||||||
#
|
#
|
||||||
@@ -140,10 +149,13 @@
|
|||||||
#
|
#
|
||||||
# ``h1.h;h2.h``
|
# ``h1.h;h2.h``
|
||||||
#
|
#
|
||||||
|
# And the target ``target`` will have its property ``LIST_FILE`` set to contain
|
||||||
|
# ``${CMAKE_CURRENT_BINARY_DIR}/target.list``
|
||||||
|
#
|
||||||
# ::
|
# ::
|
||||||
#
|
#
|
||||||
# extract_symbols(target_name
|
# extract_symbols(target_name
|
||||||
# HEADERS_LIST_FILE headers_list
|
# HEADERS_LIST headers_list_target
|
||||||
# [FILTER_PATTERN pattern]
|
# [FILTER_PATTERN pattern]
|
||||||
# [COPY_TO output]
|
# [COPY_TO output]
|
||||||
# )
|
# )
|
||||||
@@ -153,9 +165,9 @@
|
|||||||
# the string given in ``target_name`` will be created in
|
# the string given in ``target_name`` will be created in
|
||||||
# ``${CMAKE_CURRENT_BINARY_DIR}`` to receive the list of symbols.
|
# ``${CMAKE_CURRENT_BINARY_DIR}`` to receive the list of symbols.
|
||||||
#
|
#
|
||||||
# ``HEADERS_LIST_FILE``:
|
# ``HEADERS_LIST``:
|
||||||
# Required, expects a path to a file containing the list of header files to be
|
# Required, expects a target with the property ``LIST_FILE`` set, containing a
|
||||||
# parsed.
|
# file path. Such file must contain a list of files paths.
|
||||||
#
|
#
|
||||||
# ``FILTER_PATTERN``:
|
# ``FILTER_PATTERN``:
|
||||||
# Optional, expects a string. Only the lines containing the filter pattern
|
# Optional, expects a string. Only the lines containing the filter pattern
|
||||||
@@ -170,7 +182,9 @@
|
|||||||
# is provided, then only the lines containing the string given in ``pattern``
|
# is provided, then only the lines containing the string given in ``pattern``
|
||||||
# will be considered. It is recommended to provide a ``FILTER_PATTERN`` to mark
|
# will be considered. It is recommended to provide a ``FILTER_PATTERN`` to mark
|
||||||
# the lines containing exported function declaration, since this function is
|
# the lines containing exported function declaration, since this function is
|
||||||
# experimental and can return wrong symbols when parsing the header files.
|
# experimental and can return wrong symbols when parsing the header files. A
|
||||||
|
# target named ``target_name`` will be created with the property ``LIST_FILE``
|
||||||
|
# set to contain ``${CMAKE_CURRENT_BINARY_DIR}/${target_name}.list``.
|
||||||
#
|
#
|
||||||
# Example:
|
# Example:
|
||||||
#
|
#
|
||||||
@@ -178,11 +192,12 @@
|
|||||||
#
|
#
|
||||||
# find_package(ABIMap)
|
# find_package(ABIMap)
|
||||||
# extract_symbols("lib.symbols"
|
# extract_symbols("lib.symbols"
|
||||||
# HEADERS_LIST_FILE "headers_list"
|
# HEADERS_LIST "headers_target"
|
||||||
# FILTER_PATTERN "API_FUNCTION"
|
# FILTER_PATTERN "API_FUNCTION"
|
||||||
# )
|
# )
|
||||||
#
|
#
|
||||||
# Where headers_list contains::
|
# Where ``LIST_FILE`` property in ``headers_target`` points to a file
|
||||||
|
# containing::
|
||||||
#
|
#
|
||||||
# header1.h;header2.h
|
# header1.h;header2.h
|
||||||
#
|
#
|
||||||
@@ -196,25 +211,52 @@
|
|||||||
#
|
#
|
||||||
# int private_func2(int b);
|
# int private_func2(int b);
|
||||||
#
|
#
|
||||||
# Will result in a file ``lib.symbols`` in ``${CMAKE_CURRENT_BINARY_DIR}`` containing::
|
# Will result in a file ``lib.symbols.list`` in ``${CMAKE_CURRENT_BINARY_DIR}``
|
||||||
|
# containing::
|
||||||
#
|
#
|
||||||
# ``exported_func1;exported_func2``
|
# ``exported_func1``
|
||||||
|
# ``exported_func2``
|
||||||
#
|
#
|
||||||
|
|
||||||
# Search for python which is required
|
# Search for python which is required
|
||||||
find_package(PythonInterp REQUIRED)
|
if (ABIMap_FIND_REQURIED)
|
||||||
|
find_package(PythonInterp REQUIRED)
|
||||||
|
else()
|
||||||
|
find_package(PythonInterp)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Search for abimap tool used to generate the map files
|
|
||||||
find_program(ABIMAP_EXECUTABLE NAMES abimap DOC "path to the abimap executable")
|
|
||||||
mark_as_advanced(ABIMAP_EXECUTABLE)
|
|
||||||
|
|
||||||
if (NOT ABIMAP_EXECUTABLE AND UNIX)
|
if (PYTHONINTERP_FOUND)
|
||||||
message(STATUS "Could not find `abimap` in PATH."
|
# Search for abimap tool used to generate the map files
|
||||||
" It can be found in PyPI as `abimap`"
|
find_program(ABIMAP_EXECUTABLE NAMES abimap DOC "path to the abimap executable")
|
||||||
" (try `pip install abimap`)")
|
mark_as_advanced(ABIMAP_EXECUTABLE)
|
||||||
else ()
|
|
||||||
set(ABIMAP_FOUND TRUE)
|
if (NOT ABIMAP_EXECUTABLE AND UNIX)
|
||||||
endif ()
|
message(STATUS "Could not find `abimap` in PATH."
|
||||||
|
" It can be found in PyPI as `abimap`"
|
||||||
|
" (try `pip install abimap`)")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (ABIMAP_EXECUTABLE)
|
||||||
|
# Get the abimap version
|
||||||
|
execute_process(COMMAND ${ABIMAP_EXECUTABLE} version
|
||||||
|
OUTPUT_VARIABLE ABIMAP_VERSION_STRING
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
|
||||||
|
# If the version string starts with abimap-, strip it
|
||||||
|
if ("abimap" STRLESS_EQUAL ${ABIMAP_VERSION_STRING})
|
||||||
|
string(REGEX REPLACE "abimap-" "" ABIMAP_VERSION_STRING "${ABIMAP_VERSION_STRING}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(ABIMap
|
||||||
|
REQUIRED_VARS ABIMAP_EXECUTABLE
|
||||||
|
VERSION_VAR ABIMAP_VERSION_STRING)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
if (ABIMAP_FOUND)
|
||||||
|
|
||||||
# Define helper scripts
|
# Define helper scripts
|
||||||
set(_EXTRACT_SYMBOLS_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/ExtractSymbols.cmake)
|
set(_EXTRACT_SYMBOLS_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/ExtractSymbols.cmake)
|
||||||
@@ -224,42 +266,41 @@ set(_GET_FILES_LIST_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/GetFilesList.cmake)
|
|||||||
function(get_file_list _TARGET_NAME)
|
function(get_file_list _TARGET_NAME)
|
||||||
|
|
||||||
set(one_value_arguments
|
set(one_value_arguments
|
||||||
COPY_TO
|
COPY_TO
|
||||||
)
|
)
|
||||||
|
|
||||||
set(multi_value_arguments
|
set(multi_value_arguments
|
||||||
DIRECTORIES
|
DIRECTORIES
|
||||||
FILES_PATTERNS
|
FILES_PATTERNS
|
||||||
)
|
)
|
||||||
|
|
||||||
cmake_parse_arguments(_get_files_list
|
cmake_parse_arguments(_get_files_list
|
||||||
""
|
""
|
||||||
"${one_value_arguments}"
|
"${one_value_arguments}"
|
||||||
"${multi_value_arguments}"
|
"${multi_value_arguments}"
|
||||||
${ARGN}
|
${ARGN}
|
||||||
)
|
)
|
||||||
|
|
||||||
# The DIRS argument is required
|
# The DIRS argument is required
|
||||||
if (NOT DEFINED _get_files_list_DIRECTORIES)
|
if (NOT DEFINED _get_files_list_DIRECTORIES)
|
||||||
message(FATAL_ERROR "No directories paths provided. Provide a list of"
|
message(FATAL_ERROR "No directories paths provided. Provide a list of"
|
||||||
" directories paths containing header files."
|
" directories paths containing header files.")
|
||||||
)
|
endif()
|
||||||
endif()
|
|
||||||
|
|
||||||
# The FILES_PATTERNS argument is required
|
# The FILES_PATTERNS argument is required
|
||||||
if (NOT DEFINED _get_files_list_FILES_PATTERNS)
|
if (NOT DEFINED _get_files_list_FILES_PATTERNS)
|
||||||
message(FATAL_ERROR "No matching expressions provided. Provide a list"
|
message(FATAL_ERROR "No matching expressions provided. Provide a list"
|
||||||
" of matching patterns for the header files."
|
" of matching patterns for the header files.")
|
||||||
)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
get_filename_component(_get_files_list_OUTPUT_PATH
|
set(_FILES_LIST_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/${_TARGET_NAME}.list)
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/${_TARGET_NAME}"
|
|
||||||
ABSOLUTE
|
|
||||||
)
|
|
||||||
|
|
||||||
add_custom_command(
|
get_filename_component(_get_files_list_OUTPUT_PATH
|
||||||
OUTPUT ${_TARGET_NAME}
|
"${_FILES_LIST_OUTPUT_PATH}"
|
||||||
|
ABSOLUTE)
|
||||||
|
|
||||||
|
add_custom_target(
|
||||||
|
${_TARGET_NAME}_int ALL
|
||||||
COMMAND ${CMAKE_COMMAND}
|
COMMAND ${CMAKE_COMMAND}
|
||||||
-DOUTPUT_PATH="${_get_files_list_OUTPUT_PATH}"
|
-DOUTPUT_PATH="${_get_files_list_OUTPUT_PATH}"
|
||||||
-DDIRECTORIES="${_get_files_list_DIRECTORIES}"
|
-DDIRECTORIES="${_get_files_list_DIRECTORIES}"
|
||||||
@@ -271,59 +312,90 @@ function(get_file_list _TARGET_NAME)
|
|||||||
|
|
||||||
if (DEFINED _get_files_list_COPY_TO)
|
if (DEFINED _get_files_list_COPY_TO)
|
||||||
# Copy the generated file back to the COPY_TO
|
# Copy the generated file back to the COPY_TO
|
||||||
add_custom_target(copy_headers_list_${TARGET_NAME} ALL
|
add_custom_target(${_TARGET_NAME} ALL
|
||||||
COMMAND
|
COMMAND
|
||||||
${CMAKE_COMMAND} -E copy_if_different ${_TARGET_NAME} ${_get_files_list_COPY_TO}
|
${CMAKE_COMMAND} -E copy_if_different
|
||||||
DEPENDS "${_TARGET_NAME}"
|
${_FILES_LIST_OUTPUT_PATH} ${_get_files_list_COPY_TO}
|
||||||
|
DEPENDS ${_TARGET_NAME}_int
|
||||||
COMMENT "Copying ${_TARGET_NAME} to ${_get_files_list_COPY_TO}"
|
COMMENT "Copying ${_TARGET_NAME} to ${_get_files_list_COPY_TO}"
|
||||||
)
|
)
|
||||||
|
else()
|
||||||
|
add_custom_target(${_TARGET_NAME} ALL
|
||||||
|
DEPENDS ${_TARGET_NAME}_int
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set_target_properties(${_TARGET_NAME}
|
||||||
|
PROPERTIES LIST_FILE ${_FILES_LIST_OUTPUT_PATH}
|
||||||
|
)
|
||||||
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(extract_symbols _TARGET_NAME)
|
function(extract_symbols _TARGET_NAME)
|
||||||
|
|
||||||
set(one_value_arguments
|
set(one_value_arguments
|
||||||
FILTER_PATTERN
|
FILTER_PATTERN
|
||||||
HEADERS_LIST_FILE
|
HEADERS_LIST
|
||||||
COPY_TO
|
COPY_TO
|
||||||
)
|
)
|
||||||
|
|
||||||
set(multi_value_arguments
|
set(multi_value_arguments
|
||||||
)
|
)
|
||||||
|
|
||||||
cmake_parse_arguments(_extract_symbols
|
cmake_parse_arguments(_extract_symbols
|
||||||
""
|
""
|
||||||
"${one_value_arguments}"
|
"${one_value_arguments}"
|
||||||
"${multi_value_arguments}"
|
"${multi_value_arguments}"
|
||||||
${ARGN}
|
${ARGN}
|
||||||
)
|
)
|
||||||
|
|
||||||
# The HEADERS_LIST_FILE argument is required
|
# The HEADERS_LIST_FILE argument is required
|
||||||
if (NOT DEFINED _extract_symbols_HEADERS_LIST_FILE)
|
if (NOT DEFINED _extract_symbols_HEADERS_LIST)
|
||||||
message(FATAL_ERROR "No header files given. Provide a list of header"
|
message(FATAL_ERROR "No target provided in HEADERS_LIST. Provide a"
|
||||||
" files containing exported symbols."
|
" target with the property LIST_FILE set as the"
|
||||||
|
" path to the file containing the list of headers.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
get_filename_component(_SYMBOLS_OUTPUT_PATH
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/${_TARGET_NAME}.list"
|
||||||
|
ABSOLUTE
|
||||||
|
)
|
||||||
|
|
||||||
|
get_target_property(_HEADERS_LIST_FILE
|
||||||
|
${_extract_symbols_HEADERS_LIST}
|
||||||
|
LIST_FILE
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_target(
|
||||||
|
${_TARGET_NAME}_int ALL
|
||||||
|
COMMAND ${CMAKE_COMMAND}
|
||||||
|
-DOUTPUT_PATH="${_SYMBOLS_OUTPUT_PATH}"
|
||||||
|
-DHEADERS_LIST_FILE="${_HEADERS_LIST_FILE}"
|
||||||
|
-DFILTER_PATTERN=${_extract_symbols_FILTER_PATTERN}
|
||||||
|
-P ${_EXTRACT_SYMBOLS_SCRIPT}
|
||||||
|
DEPENDS ${_extract_symbols_HEADERS_LIST}
|
||||||
|
COMMENT "Extracting symbols from headers"
|
||||||
|
)
|
||||||
|
|
||||||
|
if (DEFINED _extract_symbols_COPY_TO)
|
||||||
|
# Copy the generated file back to the COPY_TO
|
||||||
|
add_custom_target(${_TARGET_NAME} ALL
|
||||||
|
COMMAND
|
||||||
|
${CMAKE_COMMAND} -E copy_if_different
|
||||||
|
${_SYMBOLS_OUTPUT_PATH} ${_extract_symbols_COPY_TO}
|
||||||
|
DEPENDS ${_TARGET_NAME}_int
|
||||||
|
COMMENT "Copying ${_TARGET_NAME} to ${_extract_symbols_COPY_TO}"
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
add_custom_target(${_TARGET_NAME} ALL
|
||||||
|
DEPENDS ${_TARGET_NAME}_int
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
get_filename_component(_extract_symbols_OUTPUT_PATH
|
set_target_properties(${_TARGET_NAME}
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/${_TARGET_NAME}"
|
PROPERTIES LIST_FILE ${_SYMBOLS_OUTPUT_PATH}
|
||||||
ABSOLUTE
|
|
||||||
)
|
)
|
||||||
|
|
||||||
add_custom_target(${_TARGET_NAME}
|
|
||||||
COMMAND ${CMAKE_COMMAND}
|
|
||||||
-DOUTPUT_PATH="${_extract_symbols_OUTPUT_PATH}"
|
|
||||||
-DHEADERS_LIST_FILE="${_extract_symbols_HEADERS_LIST_FILE}"
|
|
||||||
-DFILTER_PATTERN=${_extract_symbols_FILTER_PATTERN}
|
|
||||||
-P ${_EXTRACT_SYMBOLS_SCRIPT}
|
|
||||||
DEPENDS ${_extract_symbols_HEADERS_LIST_FILE}
|
|
||||||
COMMENT "Extracting symbols from headers")
|
|
||||||
|
|
||||||
if (DEFINED _extract_symbols_COPY_TO)
|
|
||||||
file(READ "${CMAKE_CURRENT_BINARY_DIR}/${_TARGET_NAME}" SYMBOL_CONTENT)
|
|
||||||
string(REPLACE ";" "\n" SYMBOL_CONTENT_NEW "${SYMBOL_CONTENT}")
|
|
||||||
file(WRITE "${_extract_symbols_COPY_TO}" "${SYMBOL_CONTENT_NEW}")
|
|
||||||
endif()
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(generate_map_file _TARGET_NAME)
|
function(generate_map_file _TARGET_NAME)
|
||||||
@@ -344,36 +416,42 @@ function(generate_map_file _TARGET_NAME)
|
|||||||
)
|
)
|
||||||
|
|
||||||
cmake_parse_arguments(_generate_map_file
|
cmake_parse_arguments(_generate_map_file
|
||||||
"${options}"
|
"${options}"
|
||||||
"${one_value_arguments}"
|
"${one_value_arguments}"
|
||||||
"${multi_value_arguments}"
|
"${multi_value_arguments}"
|
||||||
${ARGN}
|
${ARGN}
|
||||||
)
|
)
|
||||||
|
|
||||||
if (NOT DEFINED _generate_map_file_SYMBOLS)
|
if (NOT DEFINED _generate_map_file_SYMBOLS)
|
||||||
message(FATAL_ERROR "No symbols file provided."
|
message(FATAL_ERROR "No target provided in SYMBOLS. Provide a target"
|
||||||
)
|
" with the property LIST_FILE set as the path to"
|
||||||
|
" the file containing the list of symbols.")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT DEFINED _generate_map_file_RELEASE_NAME_VERSION)
|
if (NOT DEFINED _generate_map_file_RELEASE_NAME_VERSION)
|
||||||
message(FATAL_ERROR "Release name and version not provided."
|
message(FATAL_ERROR "Release name and version not provided."
|
||||||
" (e.g. libname_1_0_0"
|
" (e.g. libname_1_0_0)")
|
||||||
)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Set generated map file path
|
|
||||||
get_filename_component(_generate_map_file_OUTPUT_PATH
|
get_target_property(_SYMBOLS_FILE
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/${_TARGET_NAME}"
|
${_generate_map_file_SYMBOLS}
|
||||||
ABSOLUTE
|
LIST_FILE
|
||||||
)
|
)
|
||||||
|
|
||||||
add_custom_command(
|
# Set generated map file path
|
||||||
OUTPUT ${_TARGET_NAME}
|
get_filename_component(_MAP_OUTPUT_PATH
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/${_TARGET_NAME}"
|
||||||
|
ABSOLUTE
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_target(
|
||||||
|
${_TARGET_NAME}_int ALL
|
||||||
COMMAND ${CMAKE_COMMAND}
|
COMMAND ${CMAKE_COMMAND}
|
||||||
-DABIMAP_EXECUTABLE=${ABIMAP_EXECUTABLE}
|
-DABIMAP_EXECUTABLE=${ABIMAP_EXECUTABLE}
|
||||||
-DSYMBOLS="${_generate_map_file_SYMBOLS}"
|
-DSYMBOLS="${_SYMBOLS_FILE}"
|
||||||
-DCURRENT_MAP=${_generate_map_file_CURRENT_MAP}
|
-DCURRENT_MAP=${_generate_map_file_CURRENT_MAP}
|
||||||
-DOUTPUT_PATH="${_generate_map_file_OUTPUT_PATH}"
|
-DOUTPUT_PATH="${_MAP_OUTPUT_PATH}"
|
||||||
-DFINAL=${_generate_map_file_FINAL}
|
-DFINAL=${_generate_map_file_FINAL}
|
||||||
-DBREAK_ABI=${_generate_map_file_BREAK_ABI}
|
-DBREAK_ABI=${_generate_map_file_BREAK_ABI}
|
||||||
-DRELEASE_NAME_VERSION=${_generate_map_file_RELEASE_NAME_VERSION}
|
-DRELEASE_NAME_VERSION=${_generate_map_file_RELEASE_NAME_VERSION}
|
||||||
@@ -382,13 +460,27 @@ function(generate_map_file _TARGET_NAME)
|
|||||||
COMMENT "Generating the map ${_TARGET_NAME}"
|
COMMENT "Generating the map ${_TARGET_NAME}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Add a custom command setting the map as OUTPUT to allow it to be added as
|
||||||
|
# a generated source
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${_MAP_OUTPUT_PATH}
|
||||||
|
DEPENDS ${_TARGET_NAME}
|
||||||
|
)
|
||||||
|
|
||||||
if (DEFINED _generate_map_file_COPY_TO)
|
if (DEFINED _generate_map_file_COPY_TO)
|
||||||
# Copy the generated map back to the COPY_TO
|
# Copy the generated map back to the COPY_TO
|
||||||
add_custom_target(copy_map_${_TARGET_NAME} ALL
|
add_custom_target(${_TARGET_NAME} ALL
|
||||||
COMMAND
|
COMMAND
|
||||||
${CMAKE_COMMAND} -E copy_if_different ${_TARGET_NAME} ${_generate_map_file_COPY_TO}
|
${CMAKE_COMMAND} -E copy_if_different ${_MAP_OUTPUT_PATH}
|
||||||
DEPENDS "${_TARGET_NAME}"
|
${_generate_map_file_COPY_TO}
|
||||||
COMMENT "Copying ${_TARGET_NAME} to ${_generate_map_file_COPY_TO}"
|
DEPENDS ${_TARGET_NAME}_int
|
||||||
|
COMMENT "Copying ${_MAP_OUTPUT_PATH} to ${_generate_map_file_COPY_TO}"
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
add_custom_target(${_TARGET_NAME} ALL
|
||||||
|
DEPENDS ${_TARGET_NAME}_int
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
endif (ABIMAP_FOUND)
|
||||||
|
|||||||
@@ -21,17 +21,16 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
set(_NSIS_ROOT_HINTS
|
set(_x86 "(x86)")
|
||||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\NSIS;Default]")
|
|
||||||
|
|
||||||
set(_NSIS_ROOT_PATHS
|
set(_NSIS_ROOT_PATHS
|
||||||
$ENV{PROGRAMFILES}/NSIS)
|
"$ENV{ProgramFiles}/NSIS"
|
||||||
|
"$ENV{ProgramFiles${_x86}}/NSIS"
|
||||||
|
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\NSIS;Default]")
|
||||||
|
|
||||||
find_path(NSIS_ROOT_PATH
|
find_path(NSIS_ROOT_PATH
|
||||||
NAMES
|
NAMES
|
||||||
Include/Library.nsh
|
Include/Library.nsh
|
||||||
HINTS
|
|
||||||
${_NSIS_ROOT_HINTS}
|
|
||||||
PATHS
|
PATHS
|
||||||
${_NSIS_ROOT_PATHS}
|
${_NSIS_ROOT_PATHS}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,140 +0,0 @@
|
|||||||
# - Run Doxygen
|
|
||||||
#
|
|
||||||
# Adds a doxygen target that runs doxygen to generate the html
|
|
||||||
# and optionally the LaTeX API documentation.
|
|
||||||
# The doxygen target is added to the doc target as a dependency.
|
|
||||||
# i.e.: the API documentation is built with:
|
|
||||||
# make doc
|
|
||||||
#
|
|
||||||
# USAGE: GLOBAL INSTALL
|
|
||||||
#
|
|
||||||
# Install it with:
|
|
||||||
# cmake ./ && sudo make install
|
|
||||||
# Add the following to the CMakeLists.txt of your project:
|
|
||||||
# include(UseDoxygen OPTIONAL)
|
|
||||||
# Optionally copy Doxyfile.in in the directory of CMakeLists.txt and edit it.
|
|
||||||
#
|
|
||||||
# USAGE: INCLUDE IN PROJECT
|
|
||||||
#
|
|
||||||
# set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
|
|
||||||
# include(UseDoxygen)
|
|
||||||
# Add the Doxyfile.in and UseDoxygen.cmake files to the projects source directory.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# CONFIGURATION
|
|
||||||
#
|
|
||||||
# To configure Doxygen you can edit Doxyfile.in and set some variables in cmake.
|
|
||||||
# Variables you may define are:
|
|
||||||
# DOXYFILE_SOURCE_DIR - Path where the Doxygen input files are.
|
|
||||||
# Defaults to the current source directory.
|
|
||||||
# DOXYFILE_EXTRA_SOURCES - Additional source diretories/files for Doxygen to scan.
|
|
||||||
# The Paths should be in double quotes and separated by space. e.g.:
|
|
||||||
# "${CMAKE_CURRENT_BINARY_DIR}/foo.c" "${CMAKE_CURRENT_BINARY_DIR}/bar/"
|
|
||||||
#
|
|
||||||
# DOXYFILE_OUTPUT_DIR - Path where the Doxygen output is stored.
|
|
||||||
# Defaults to "${CMAKE_CURRENT_BINARY_DIR}/doc".
|
|
||||||
#
|
|
||||||
# DOXYFILE_LATEX - ON/OFF; Set to "ON" if you want the LaTeX documentation
|
|
||||||
# to be built.
|
|
||||||
# DOXYFILE_LATEX_DIR - Directory relative to DOXYFILE_OUTPUT_DIR where
|
|
||||||
# the Doxygen LaTeX output is stored. Defaults to "latex".
|
|
||||||
#
|
|
||||||
# DOXYFILE_HTML_DIR - Directory relative to DOXYFILE_OUTPUT_DIR where
|
|
||||||
# the Doxygen html output is stored. Defaults to "html".
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Copyright (c) 2009, 2010, 2011 Tobias Rautenkranz <tobias@rautenkranz.ch>
|
|
||||||
#
|
|
||||||
# Redistribution and use is allowed according to the terms of the New
|
|
||||||
# BSD license.
|
|
||||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
|
||||||
#
|
|
||||||
|
|
||||||
macro(usedoxygen_set_default name value type docstring)
|
|
||||||
if(NOT DEFINED "${name}")
|
|
||||||
set("${name}" "${value}" CACHE "${type}" "${docstring}")
|
|
||||||
endif()
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
find_package(Doxygen)
|
|
||||||
|
|
||||||
if(DOXYGEN_FOUND)
|
|
||||||
find_file(DOXYFILE_IN "Doxyfile.in"
|
|
||||||
PATHS "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_ROOT}/Modules/"
|
|
||||||
NO_DEFAULT_PATH
|
|
||||||
DOC "Path to the doxygen configuration template file")
|
|
||||||
set(DOXYFILE "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile")
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
find_package_handle_standard_args(DOXYFILE_IN DEFAULT_MSG "DOXYFILE_IN")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(DOXYGEN_FOUND AND DOXYFILE_IN_FOUND)
|
|
||||||
usedoxygen_set_default(DOXYFILE_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/doc"
|
|
||||||
PATH "Doxygen output directory")
|
|
||||||
usedoxygen_set_default(DOXYFILE_HTML_DIR "html"
|
|
||||||
STRING "Doxygen HTML output directory")
|
|
||||||
usedoxygen_set_default(DOXYFILE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}"
|
|
||||||
PATH "Input files source directory")
|
|
||||||
usedoxygen_set_default(DOXYFILE_EXTRA_SOURCE_DIRS ""
|
|
||||||
STRING "Additional source files/directories separated by space")
|
|
||||||
set(DOXYFILE_SOURCE_DIRS "\"${DOXYFILE_SOURCE_DIR}\" ${DOXYFILE_EXTRA_SOURCES}")
|
|
||||||
|
|
||||||
usedoxygen_set_default(DOXYFILE_LATEX YES BOOL "Generate LaTeX API documentation" OFF)
|
|
||||||
usedoxygen_set_default(DOXYFILE_LATEX_DIR "latex" STRING "LaTex output directory")
|
|
||||||
|
|
||||||
mark_as_advanced(DOXYFILE_OUTPUT_DIR DOXYFILE_HTML_DIR DOXYFILE_LATEX_DIR
|
|
||||||
DOXYFILE_SOURCE_DIR DOXYFILE_EXTRA_SOURCE_DIRS DOXYFILE_IN)
|
|
||||||
|
|
||||||
|
|
||||||
set_property(DIRECTORY
|
|
||||||
APPEND PROPERTY
|
|
||||||
ADDITIONAL_MAKE_CLEAN_FILES
|
|
||||||
"${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_HTML_DIR}")
|
|
||||||
|
|
||||||
add_custom_target(doxygen
|
|
||||||
COMMAND "${DOXYGEN_EXECUTABLE}"
|
|
||||||
"${DOXYFILE}"
|
|
||||||
COMMENT "Writing documentation to ${DOXYFILE_OUTPUT_DIR}..."
|
|
||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
|
|
||||||
|
|
||||||
set(DOXYFILE_DOT "NO")
|
|
||||||
if(DOXYGEN_DOT_EXECUTABLE)
|
|
||||||
set(DOXYFILE_DOT "YES")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
## LaTeX
|
|
||||||
set(DOXYFILE_PDFLATEX "NO")
|
|
||||||
|
|
||||||
set_property(DIRECTORY APPEND PROPERTY
|
|
||||||
ADDITIONAL_MAKE_CLEAN_FILES
|
|
||||||
"${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_LATEX_DIR}")
|
|
||||||
|
|
||||||
if(DOXYFILE_LATEX STREQUAL "ON")
|
|
||||||
set(DOXYFILE_GENERATE_LATEX "YES")
|
|
||||||
find_package(LATEX)
|
|
||||||
find_program(DOXYFILE_MAKE make)
|
|
||||||
mark_as_advanced(DOXYFILE_MAKE)
|
|
||||||
if(LATEX_COMPILER AND MAKEINDEX_COMPILER AND DOXYFILE_MAKE)
|
|
||||||
if(PDFLATEX_COMPILER)
|
|
||||||
set(DOXYFILE_PDFLATEX "YES")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_custom_command(TARGET doxygen
|
|
||||||
POST_BUILD
|
|
||||||
COMMAND "${DOXYFILE_MAKE}"
|
|
||||||
COMMENT "Running LaTeX for Doxygen documentation in ${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_LATEX_DIR}..."
|
|
||||||
WORKING_DIRECTORY "${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_LATEX_DIR}")
|
|
||||||
else()
|
|
||||||
set(DOXYGEN_LATEX "NO")
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
set(DOXYFILE_GENERATE_LATEX "NO")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
configure_file("${DOXYFILE_IN}" "${DOXYFILE}" @ONLY)
|
|
||||||
|
|
||||||
add_custom_target(doc)
|
|
||||||
add_dependencies(doc doxygen)
|
|
||||||
endif()
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
/* Name of package */
|
/* Name of package */
|
||||||
#cmakedefine PACKAGE "${APPLICATION_NAME}"
|
#cmakedefine PACKAGE "${PROJECT_NAME}"
|
||||||
|
|
||||||
/* Version number of package */
|
/* Version number of package */
|
||||||
#cmakedefine VERSION "${APPLICATION_VERSION}"
|
#cmakedefine VERSION "${PROJECT_VERSION}"
|
||||||
|
|
||||||
#cmakedefine LOCALEDIR "${LOCALE_INSTALL_DIR}"
|
#cmakedefine LOCALEDIR "${LOCALE_INSTALL_DIR}"
|
||||||
#cmakedefine DATADIR "${DATADIR}"
|
#cmakedefine DATADIR "${DATADIR}"
|
||||||
@@ -130,6 +130,9 @@
|
|||||||
/* Define to 1 if you have the `strncpy' function. */
|
/* Define to 1 if you have the `strncpy' function. */
|
||||||
#cmakedefine HAVE_STRNCPY 1
|
#cmakedefine HAVE_STRNCPY 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `strndup' function. */
|
||||||
|
#cmakedefine HAVE_STRNDUP 1
|
||||||
|
|
||||||
/* Define to 1 if you have the `cfmakeraw' function. */
|
/* Define to 1 if you have the `cfmakeraw' function. */
|
||||||
#cmakedefine HAVE_CFMAKERAW 1
|
#cmakedefine HAVE_CFMAKERAW 1
|
||||||
|
|
||||||
@@ -193,6 +196,9 @@
|
|||||||
|
|
||||||
#cmakedefine HAVE_FALLTHROUGH_ATTRIBUTE 1
|
#cmakedefine HAVE_FALLTHROUGH_ATTRIBUTE 1
|
||||||
|
|
||||||
|
#cmakedefine HAVE_CONSTRUCTOR_ATTRIBUTE 1
|
||||||
|
#cmakedefine HAVE_DESTRUCTOR_ATTRIBUTE 1
|
||||||
|
|
||||||
#cmakedefine HAVE_GCC_VOLATILE_MEMORY_PROTECTION 1
|
#cmakedefine HAVE_GCC_VOLATILE_MEMORY_PROTECTION 1
|
||||||
#cmakedefine HAVE_GCC_NARG_MACRO 1
|
#cmakedefine HAVE_GCC_NARG_MACRO 1
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,46 @@
|
|||||||
#
|
#
|
||||||
# Build the documentation
|
# Build the documentation
|
||||||
#
|
#
|
||||||
include(UseDoxygen OPTIONAL)
|
if (${CMAKE_VERSION} VERSION_GREATER "3.8.99")
|
||||||
|
|
||||||
|
find_package(Doxygen)
|
||||||
|
|
||||||
|
if (DOXYGEN_FOUND)
|
||||||
|
set(DOXYGEN_PROJECT_NAME ${PROJECT_NAME})
|
||||||
|
set(DOXYGEN_PROJECT_NUMBER ${PROJECT_VERSION})
|
||||||
|
set(DOXYGEN_PROJECT_BRIEF "The SSH library")
|
||||||
|
|
||||||
|
set(DOXYGEN_TAB_SIZE 4)
|
||||||
|
set(DOXYGEN_OPTIMIZE_OUTPUT_FOR_C YES)
|
||||||
|
set(DOXYGEN_MARKDOWN_SUPPORT YES)
|
||||||
|
|
||||||
|
set(DOXYGEN_PREDEFINED DOXYGEN
|
||||||
|
PRINTF_ATTRIBUTE(x,y))
|
||||||
|
|
||||||
|
set(DOXYGEN_EXCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/that_style)
|
||||||
|
set(DOXYGEN_HTML_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/that_style/header.html)
|
||||||
|
set(DOXYGEN_HTML_EXTRA_STYLESHEET ${CMAKE_CURRENT_SOURCE_DIR}/that_style/that_style.css)
|
||||||
|
set(DOXYGEN_HTML_EXTRA_FILES ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/nav_edge_left.svg
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/nav_edge_right.svg
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/nav_edge_inter.svg
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/sync_off.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/sync_on.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/splitbar_handle.svg
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/doc.svg
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/mag_glass.svg
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/folderclosed.svg
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/folderopen.svg
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/js/striped_bg.js)
|
||||||
|
|
||||||
|
# This updates the Doxyfile if we do changes here
|
||||||
|
set(_doxyfile_template "${CMAKE_BINARY_DIR}/CMakeDoxyfile.in")
|
||||||
|
set(_target_doxyfile "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile.docs")
|
||||||
|
configure_file("${_doxyfile_template}" "${_target_doxyfile}")
|
||||||
|
|
||||||
|
doxygen_add_docs(docs
|
||||||
|
${CMAKE_SOURCE_DIR}/include/libssh
|
||||||
|
${CMAKE_SOURCE_DIR}/src
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
endif() # DOXYGEN_FOUND
|
||||||
|
|
||||||
|
endif() # CMAKE_VERSION
|
||||||
|
|||||||
1917
doc/Doxyfile.in
@@ -24,7 +24,7 @@ The libssh library provides:
|
|||||||
- <strong>Ciphers</strong>: <i>aes256-ctr, aes192-ctr, aes128-ctr</i>, aes256-cbc (rijndael-cbc@lysator.liu.se), aes192-cbc, aes128-cbc, 3des-cbc, blowfish-cbc, none
|
- <strong>Ciphers</strong>: <i>aes256-ctr, aes192-ctr, aes128-ctr</i>, aes256-cbc (rijndael-cbc@lysator.liu.se), aes192-cbc, aes128-cbc, 3des-cbc, blowfish-cbc, none
|
||||||
- <strong>Compression Schemes</strong>: zlib, <i>zlib@openssh.com</i>, none
|
- <strong>Compression Schemes</strong>: zlib, <i>zlib@openssh.com</i>, none
|
||||||
- <strong>MAC hashes</strong>: hmac-sha1, hmac-sha2-256, hmac-sha2-384, hmac-sha2-512, hmac-md5, none
|
- <strong>MAC hashes</strong>: hmac-sha1, hmac-sha2-256, hmac-sha2-384, hmac-sha2-512, hmac-md5, none
|
||||||
- <strong>Authentication</strong>: none, password, public-key, hostbased, keyboard-interactive, <i>gssapi-with-mic</i>
|
- <strong>Authentication</strong>: none, password, public-key, keyboard-interactive, <i>gssapi-with-mic</i>
|
||||||
- <strong>Channels</strong>: shell, exec (incl. SCP wrapper), direct-tcpip, subsystem, <i>auth-agent-req@openssh.com</i>
|
- <strong>Channels</strong>: shell, exec (incl. SCP wrapper), direct-tcpip, subsystem, <i>auth-agent-req@openssh.com</i>
|
||||||
- <strong>Global Requests</strong>: tcpip-forward, forwarded-tcpip
|
- <strong>Global Requests</strong>: tcpip-forward, forwarded-tcpip
|
||||||
- <strong>Channel Requests</strong>: x11, pty, <i>exit-status, signal, exit-signal, keepalive@openssh.com, auth-agent-req@openssh.com</i>
|
- <strong>Channel Requests</strong>: x11, pty, <i>exit-status, signal, exit-signal, keepalive@openssh.com, auth-agent-req@openssh.com</i>
|
||||||
|
|||||||
21
doc/that_style/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2017 Jan-Lukas Wynen
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
22
doc/that_style/README.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# that style
|
||||||
|
A plain, more modern HTML style for Doxygen
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
- Doxygen (tested with version 1.8.13)
|
||||||
|
- *optional*: a sass/scss compiler if you want to modify the style
|
||||||
|
|
||||||
|
## Simple usage
|
||||||
|
Tell Doxygen about the files for that style as shown in [doxyfile.conf](doxyfile.conf). You might need to adjust the
|
||||||
|
paths depending on where you installed that style.
|
||||||
|
When you run Doxygen, all files are copied into to generated HTML folder. So you don't need to keep the originals around
|
||||||
|
unless you want to re-generate the documentation.
|
||||||
|
|
||||||
|
## Advanced
|
||||||
|
that style uses a custom javascript to hack some nice stripes into some tables. It has to be loaded from HTML. Hence you need
|
||||||
|
to use the provided custom header. Since its default content may change when Doxygen is updated, there might be syntax error in
|
||||||
|
the generated HTML. If this is the case, you can remove the custom header (adjust your doxyfile.conf). This has no
|
||||||
|
disadvantages other than removing the stripes.
|
||||||
|
|
||||||
|
[that_style.css](that_style.css) was generated from the scss files in the folder [sass](sass). If you want to change the style,
|
||||||
|
use those files in order to have better control. For instance, you can easily change most colors by modifying the variables
|
||||||
|
in the beginning of [that_style.scss](sass/that_style.scss).
|
||||||
56
doc/that_style/header.html
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
<!-- HTML header for doxygen 1.8.13-->
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
|
<meta name="generator" content="Doxygen $doxygenversion"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
|
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
|
||||||
|
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
|
||||||
|
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<script type="text/javascript" src="$relpath^jquery.js"></script>
|
||||||
|
<script type="text/javascript" src="$relpath^dynsections.js"></script>
|
||||||
|
$treeview
|
||||||
|
$search
|
||||||
|
$mathjax
|
||||||
|
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
||||||
|
<script src="$relpath^striped_bg.js"></script>
|
||||||
|
$extrastylesheet
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||||||
|
|
||||||
|
<!--BEGIN TITLEAREA-->
|
||||||
|
<div id="titlearea">
|
||||||
|
<table cellspacing="0" cellpadding="0">
|
||||||
|
<tbody>
|
||||||
|
<tr style="height: 56px;">
|
||||||
|
<!--BEGIN PROJECT_LOGO-->
|
||||||
|
<td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
|
||||||
|
<!--END PROJECT_LOGO-->
|
||||||
|
<!--BEGIN PROJECT_NAME-->
|
||||||
|
<td id="projectalign" style="padding-left: 0.5em;">
|
||||||
|
<div id="projectname">$projectname
|
||||||
|
<!--BEGIN PROJECT_NUMBER--> <span id="projectnumber">$projectnumber</span><!--END PROJECT_NUMBER-->
|
||||||
|
</div>
|
||||||
|
<!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
|
||||||
|
</td>
|
||||||
|
<!--END PROJECT_NAME-->
|
||||||
|
<!--BEGIN !PROJECT_NAME-->
|
||||||
|
<!--BEGIN PROJECT_BRIEF-->
|
||||||
|
<td style="padding-left: 0.5em;">
|
||||||
|
<div id="projectbrief">$projectbrief</div>
|
||||||
|
</td>
|
||||||
|
<!--END PROJECT_BRIEF-->
|
||||||
|
<!--END !PROJECT_NAME-->
|
||||||
|
<!--BEGIN DISABLE_INDEX-->
|
||||||
|
<!--BEGIN SEARCHENGINE-->
|
||||||
|
<td>$searchbox</td>
|
||||||
|
<!--END SEARCHENGINE-->
|
||||||
|
<!--END DISABLE_INDEX-->
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--END TITLEAREA-->
|
||||||
|
<!-- end header part -->
|
||||||
97
doc/that_style/img/doc.svg
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
<?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="24"
|
||||||
|
height="22"
|
||||||
|
viewBox="0 0 6.3499999 5.8208335"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
sodipodi:docname="doc.svg"
|
||||||
|
inkscape:version="0.92.1 r">
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="32"
|
||||||
|
inkscape:cx="11.139212"
|
||||||
|
inkscape:cy="14.811193"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1357"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-291.17915)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#4d4d4d;stroke-width:0.26458329;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="M 3.315043,291.8406 H 1.4552083 v 4.49792 h 3.1749999 v -3.10055 z"
|
||||||
|
id="path5095"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 3.1837239,291.84114 v 1.71186 h 1.4472656 v -0.31418 H 3.4473958 v -1.39768 z"
|
||||||
|
id="path5128"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect5132"
|
||||||
|
width="2.1166668"
|
||||||
|
height="0.26458332"
|
||||||
|
x="1.8520833"
|
||||||
|
y="293.82498" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect5136"
|
||||||
|
width="1.0583334"
|
||||||
|
height="0.26458332"
|
||||||
|
x="1.8520832"
|
||||||
|
y="294.35416" />
|
||||||
|
<rect
|
||||||
|
y="294.88333"
|
||||||
|
x="1.8520832"
|
||||||
|
height="0.26458332"
|
||||||
|
width="1.8520833"
|
||||||
|
id="rect5138"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4543"
|
||||||
|
width="1.5875"
|
||||||
|
height="0.26458332"
|
||||||
|
x="1.8520832"
|
||||||
|
y="295.41248" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 6.5 KiB |
77
doc/that_style/img/folderclosed.svg
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
<?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="24"
|
||||||
|
height="22"
|
||||||
|
viewBox="0 0 6.3499998 5.8208335"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="0.92.1 r"
|
||||||
|
sodipodi:docname="folderclosed.svg"
|
||||||
|
inkscape:export-filename="/home/jl/Prog/doxygen_style/folderclosed.png"
|
||||||
|
inkscape:export-xdpi="96"
|
||||||
|
inkscape:export-ydpi="96">
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="51.113139"
|
||||||
|
inkscape:cx="7.7057751"
|
||||||
|
inkscape:cy="12.584171"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:snap-global="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1357"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:measure-start="0,0"
|
||||||
|
inkscape:measure-end="0,0" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-291.17915)">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 0.52916667,292.2374 -0.26458334,0.52925 v 3.43958 H 4.7625001 v -3.43958 H 2.38125 L 2.1166667,292.2374 Z"
|
||||||
|
id="rect4498"
|
||||||
|
sodipodi:nodetypes="cccccccc" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.66145831;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="M 2.9104167,292.76665 2.38125,293.56034 H 0.26458333 v 0.26464 H 2.38125 l 0.5291667,-0.79375 h 1.8520834 v -0.26458 z"
|
||||||
|
id="rect4500"
|
||||||
|
sodipodi:nodetypes="ccccccccc" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.4 KiB |
83
doc/that_style/img/folderopen.svg
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<?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="24"
|
||||||
|
height="22"
|
||||||
|
viewBox="0 0 6.3499998 5.8208335"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="0.92.1 r"
|
||||||
|
sodipodi:docname="folderopen.svg"
|
||||||
|
inkscape:export-filename="/home/jl/Prog/doxygen_style/folderopen.png"
|
||||||
|
inkscape:export-xdpi="96"
|
||||||
|
inkscape:export-ydpi="96">
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="43.725861"
|
||||||
|
inkscape:cx="8.2043861"
|
||||||
|
inkscape:cy="13.464183"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:snap-global="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1357"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:measure-start="0,0"
|
||||||
|
inkscape:measure-end="0,0" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-291.17915)">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.66145831;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 0.52916667,292.23748 -0.26458334,0.52917 v 3.43958 H 4.762461 l 7.8e-5,-3.43958 H 2.38125 l -0.2645833,-0.52917 z"
|
||||||
|
id="path5228"
|
||||||
|
sodipodi:nodetypes="cccccccc" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path5279"
|
||||||
|
d="M 1.0583333,293.5604 H 5.55625 L 4.7625,296.20603 H 0.26458333 Z"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.66145831;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="ccccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path5234"
|
||||||
|
d="M 1.0583333,294.35415 H 3.175 l 0.5291667,-0.52917 H 5.55625 L 4.7625,296.20603 H 0.26458333 Z"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.66145831;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.1 KiB |
73
doc/that_style/img/mag_glass.svg
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<?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="22"
|
||||||
|
height="22"
|
||||||
|
viewBox="0 0 5.8208332 5.8208335"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="0.92.1 r"
|
||||||
|
sodipodi:docname="mag_glass.svg">
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="32"
|
||||||
|
inkscape:cx="8.961936"
|
||||||
|
inkscape:cy="10.205344"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:snap-bbox="false"
|
||||||
|
inkscape:bbox-nodes="true"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1357"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:snap-global="false" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-291.17915)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="M 6.9101562 2.4082031 C 3.1105656 2.4082031 -5.9211895e-16 5.5081643 0 9.3027344 C 0 13.097342 3.1105656 16.197266 6.9101562 16.197266 C 8.2869348 16.197266 9.5698699 15.787508 10.650391 15.087891 L 15.162109 19.587891 L 16.636719 18.115234 L 12.214844 13.707031 C 13.214837 12.510659 13.818359 10.974238 13.818359 9.3027344 C 13.818359 5.5081643 10.709747 2.4082031 6.9101562 2.4082031 z M 6.9101562 4.9101562 C 9.3624717 4.9101562 11.324219 6.8631249 11.324219 9.3027344 C 11.324219 11.742382 9.3624717 13.695312 6.9101562 13.695312 C 4.4578408 13.695312 2.5019531 11.742382 2.5019531 9.3027344 C 2.5019531 6.8631249 4.4578408 4.9101562 6.9101562 4.9101562 z "
|
||||||
|
transform="matrix(0.26458333,0,0,0.26458333,0,291.17915)"
|
||||||
|
id="rect4524" />
|
||||||
|
<path
|
||||||
|
transform="matrix(0.99422295,0,0,0.68955299,-0.83134947,91.755588)"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.63466448;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
inkscape:transform-center-y="0.25905895"
|
||||||
|
d="m 5.6074138,294.49889 -1.0836583,-1.87695 2.1673165,0 z"
|
||||||
|
id="path4491" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.8 KiB |
73
doc/that_style/img/nav_edge_inter.svg
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<?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="10.53333"
|
||||||
|
height="32"
|
||||||
|
viewBox="0 0 9.8749964 30"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.92.1 r"
|
||||||
|
sodipodi:docname="nav_edge_inter.svg">
|
||||||
|
<defs
|
||||||
|
id="defs4" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="32"
|
||||||
|
inkscape:cx="8.6823304"
|
||||||
|
inkscape:cy="16.225639"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-paths="false"
|
||||||
|
inkscape:bbox-nodes="true"
|
||||||
|
inkscape:snap-bbox-edge-midpoints="true"
|
||||||
|
inkscape:object-nodes="true"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1357"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1" />
|
||||||
|
<metadata
|
||||||
|
id="metadata7">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-1022.3622)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 0,1022.3622 v 15 15 l 8,-15 z"
|
||||||
|
id="path4143"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9375px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 1.2910156,1022.3496 -0.82421872,0.4473 7.87890622,14.5527 -7.87890622,14.5527 0.82421872,0.4473 8.1210938,-15 z"
|
||||||
|
id="path5240"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.8 KiB |
73
doc/that_style/img/nav_edge_left.svg
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<?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="8.5333338"
|
||||||
|
height="32"
|
||||||
|
viewBox="0 0 8.0000001 30"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.92.1 r"
|
||||||
|
sodipodi:docname="nav_edge_left.svg">
|
||||||
|
<defs
|
||||||
|
id="defs4" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="32"
|
||||||
|
inkscape:cx="5.3721385"
|
||||||
|
inkscape:cy="14.16429"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-paths="false"
|
||||||
|
inkscape:bbox-nodes="false"
|
||||||
|
inkscape:snap-bbox-edge-midpoints="false"
|
||||||
|
inkscape:object-nodes="true"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1357"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1" />
|
||||||
|
<metadata
|
||||||
|
id="metadata7">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-1022.3622)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="M 0 0 L 0 32 L 8.5332031 16 L 0 0 z "
|
||||||
|
transform="matrix(0.93749998,0,0,0.93749998,0,1022.3622)"
|
||||||
|
id="rect4586" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 0,1022.3622 v 15 15 l 8,-15 z"
|
||||||
|
id="path4143"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.1 KiB |
73
doc/that_style/img/nav_edge_right.svg
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<?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="8"
|
||||||
|
height="30"
|
||||||
|
viewBox="0 0 8.0000001 30"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="nav_edge.svg">
|
||||||
|
<defs
|
||||||
|
id="defs4" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="32"
|
||||||
|
inkscape:cx="5.3721385"
|
||||||
|
inkscape:cy="14.16429"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-paths="false"
|
||||||
|
inkscape:bbox-nodes="false"
|
||||||
|
inkscape:snap-bbox-edge-midpoints="false"
|
||||||
|
inkscape:object-nodes="true"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1357"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1" />
|
||||||
|
<metadata
|
||||||
|
id="metadata7">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-1022.3622)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 0,1022.3622 0,15 0,15 8,-15 -8,-15 z"
|
||||||
|
id="path4143"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 1e-8,1022.3622 7.99999999,15 0,-15 -8,0 z m 7.99999999,15 -8,15 8,0 0,-15 z"
|
||||||
|
id="rect4136"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.1 KiB |
120
doc/that_style/img/splitbar_handle.svg
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
<?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="6"
|
||||||
|
height="9"
|
||||||
|
viewBox="0 0 1.5875 2.3812501"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="0.92.1 r"
|
||||||
|
sodipodi:docname="splitbar_handle.svg">
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="32"
|
||||||
|
inkscape:cx="8.7681488"
|
||||||
|
inkscape:cy="-2.7929517"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
showguides="false"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1357"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid4487" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-294.61873)">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4485"
|
||||||
|
width="0.26458335"
|
||||||
|
height="0.26458332"
|
||||||
|
x="0.26458332"
|
||||||
|
y="294.8833" />
|
||||||
|
<rect
|
||||||
|
y="294.8833"
|
||||||
|
x="1.0583333"
|
||||||
|
height="0.26458332"
|
||||||
|
width="0.26458335"
|
||||||
|
id="rect4489"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<rect
|
||||||
|
y="295.41248"
|
||||||
|
x="0.26458329"
|
||||||
|
height="0.26458332"
|
||||||
|
width="0.26458335"
|
||||||
|
id="rect4491"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4493"
|
||||||
|
width="0.26458335"
|
||||||
|
height="0.26458332"
|
||||||
|
x="1.0583333"
|
||||||
|
y="295.41248" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4495"
|
||||||
|
width="0.26458335"
|
||||||
|
height="0.26458332"
|
||||||
|
x="0.26458332"
|
||||||
|
y="295.94165" />
|
||||||
|
<rect
|
||||||
|
y="295.94165"
|
||||||
|
x="1.0583333"
|
||||||
|
height="0.26458332"
|
||||||
|
width="0.26458335"
|
||||||
|
id="rect4497"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<rect
|
||||||
|
y="296.47079"
|
||||||
|
x="0.26458329"
|
||||||
|
height="0.26458332"
|
||||||
|
width="0.26458335"
|
||||||
|
id="rect4499"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4501"
|
||||||
|
width="0.26458335"
|
||||||
|
height="0.26458332"
|
||||||
|
x="1.0583333"
|
||||||
|
y="296.47079" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 7.1 KiB |
BIN
doc/that_style/img/sync_off.png
Normal file
|
After Width: | Height: | Size: 483 B |
BIN
doc/that_style/img/sync_on.png
Normal file
|
After Width: | Height: | Size: 488 B |
32
doc/that_style/js/striped_bg.js
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
// Adds extra CSS classes "even" and "odd" to .memberdecls to allow
|
||||||
|
// striped backgrounds.
|
||||||
|
function MemberDeclsStriper () {
|
||||||
|
var counter = 0;
|
||||||
|
|
||||||
|
this.stripe = function() {
|
||||||
|
$(".memberdecls tbody").children().each(function(i) {
|
||||||
|
|
||||||
|
// reset counter at every heading -> always start with even
|
||||||
|
if ($(this).is(".heading")) {
|
||||||
|
counter = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add extra classes
|
||||||
|
if (counter % 2 == 1) {
|
||||||
|
$(this).addClass("odd");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$(this).addClass("even");
|
||||||
|
}
|
||||||
|
|
||||||
|
// advance counter at every separator
|
||||||
|
// this is the only way to reliably detect which table rows belong together
|
||||||
|
if ($(this).is('[class^="separator"]')) {
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// execute the function
|
||||||
|
$(document).ready(new MemberDeclsStriper().stripe);
|
||||||
69
doc/that_style/sass/_fragment_base.scss
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
Basic styling for fragments shared by all themes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.fragment {
|
||||||
|
padding: 0;
|
||||||
|
margin: 4px 8px 4px 2px;
|
||||||
|
color: #bebebe;
|
||||||
|
background-color: #323232;
|
||||||
|
border: 3px solid #e8e8e8;
|
||||||
|
border-radius: 2px;
|
||||||
|
overflow-y: hidden;
|
||||||
|
overflow-x: auto;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
div.line {
|
||||||
|
font-family: monospace, fixed;
|
||||||
|
font-size: 13px;
|
||||||
|
min-height: 13px;
|
||||||
|
line-height: 1.0;
|
||||||
|
text-indent: -53px;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 1px 0 1px 53px;
|
||||||
|
white-space: pre;
|
||||||
|
|
||||||
|
@include transition-property(background-color);
|
||||||
|
@include transition-duration(0s);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #1a1a1a;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
// insert linefeed
|
||||||
|
content:"\000A";
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
span.lineno {
|
||||||
|
padding-right: 4px;
|
||||||
|
text-align: right;
|
||||||
|
color: black;
|
||||||
|
height: 100px;
|
||||||
|
white-space: pre;
|
||||||
|
border-right: 3px solid #1d7567;
|
||||||
|
background-color: #a0a0a0;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.lineno a, span.lineno a:visited {
|
||||||
|
background-color: inherit;
|
||||||
|
color: #1e595a;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.lineno a:hover {
|
||||||
|
background-color: #C8C8C8;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lineno {
|
||||||
|
-webkit-touch-callout: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-khtml-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
80
doc/that_style/sass/_fragment_color.scss
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
// colours of code view
|
||||||
|
|
||||||
|
div.fragment {
|
||||||
|
color: #bebebe;
|
||||||
|
background-color: #323232;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.fragment::before {
|
||||||
|
background-color: #1a1a1a;
|
||||||
|
border-right: 1px solid #3e3e3e;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.line:hover {
|
||||||
|
background-color: #1a1a1a;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.lineno {
|
||||||
|
color: #969696;
|
||||||
|
background-color: #1a1a1a;
|
||||||
|
border-right: 1px solid #3e3e3e;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.lineno a, span.lineno a:visited {
|
||||||
|
background-color: inherit;
|
||||||
|
color: #dcdcdc;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.lineno a:hover {
|
||||||
|
background-color: #323232;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// syntax highlighting
|
||||||
|
|
||||||
|
a.code, a.code:visited {
|
||||||
|
color: #6cc7eb;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.codeRef, a.codeRef:visited {
|
||||||
|
color: #3d95e6;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.keyword {
|
||||||
|
color: #98f77a;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.keywordtype {
|
||||||
|
color: #ffa0a0;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.keywordflow {
|
||||||
|
color: #98f77a;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.comment {
|
||||||
|
// color: #dadbb1;
|
||||||
|
color: #999;
|
||||||
|
font-style: oblique;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.preprocessor {
|
||||||
|
color: #cd5c57;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.stringliteral {
|
||||||
|
color: #64b041;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.charliteral {
|
||||||
|
color: #64b041;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote {
|
||||||
|
background-color: #F7F8FB;
|
||||||
|
border-left: 2px solid #9CAFD4;
|
||||||
|
margin: 0 24px 0 4px;
|
||||||
|
padding: 0 12px 0 16px;
|
||||||
|
}
|
||||||
70
doc/that_style/sass/_menu_bar.scss
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* The main menu at the top
|
||||||
|
*/
|
||||||
|
|
||||||
|
#main-menu {
|
||||||
|
background-image: none;
|
||||||
|
background: $background-color-dark;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sm-dox {
|
||||||
|
// :not(:last-child) -> do not style search box
|
||||||
|
&> li:not(:last-child) > a {
|
||||||
|
background-image: none;
|
||||||
|
text-shadow: none;
|
||||||
|
color: white;
|
||||||
|
font-weight: normal;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
font-size: 11pt;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
&> li:not(:last-child) > a:hover,
|
||||||
|
&> li:not(:last-child) > a.highlighted {
|
||||||
|
background-color: $primary-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
a span.sub-arrow {
|
||||||
|
// this sets the color of the arrow
|
||||||
|
border-color: white transparent transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
// sub menus
|
||||||
|
border: none;
|
||||||
|
@include border-radius(0 !important);
|
||||||
|
padding: 0;
|
||||||
|
background: $background-color-dark;
|
||||||
|
@include box-shadow(0 0 4px rgba(0,0,0,0.35), 0 0 8px rgba(0,0,0,0.2));
|
||||||
|
|
||||||
|
a {
|
||||||
|
background: inherit;
|
||||||
|
color: white;
|
||||||
|
font-weight: normal;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
font-size: 11pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
background: $primary-color;
|
||||||
|
color: white;
|
||||||
|
font-weight: normal;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
font-size: 11pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.highlighted {
|
||||||
|
background: $primary-color;
|
||||||
|
color: white;
|
||||||
|
font-weight: normal;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
font-size: 11pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
a span.sub-arrow {
|
||||||
|
/* this sets the color of the arrow */
|
||||||
|
border-color: white transparent transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
33
doc/that_style/sass/_mixins.scss
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
@mixin box-shadow($args...) {
|
||||||
|
-moz-box-shadow: $args;
|
||||||
|
-webkit-box-shadow: $args;
|
||||||
|
-o-box-shadow: $args;
|
||||||
|
box-shadow: $args;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin border-radius($args...) {
|
||||||
|
-moz-border-radius: $args;
|
||||||
|
-webkit-border-radius: $args;
|
||||||
|
border-radius: $args;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin transition($args...) {
|
||||||
|
-webkit-transition: $args;
|
||||||
|
-moz-transition: $args;
|
||||||
|
-o-transition: $args;
|
||||||
|
transition: $args;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin transition-property($arg) {
|
||||||
|
-webkit-transition: $arg;
|
||||||
|
-moz-transition: $arg;
|
||||||
|
-o-transition: $arg;
|
||||||
|
transition: $arg;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin transition-duration($arg) {
|
||||||
|
-webkit-duration: $arg;
|
||||||
|
-moz-duration: $arg;
|
||||||
|
-o-duration: $arg;
|
||||||
|
duration: $arg;
|
||||||
|
}
|
||||||
72
doc/that_style/sass/_nav_tree.scss
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* The tree view on the left
|
||||||
|
*/
|
||||||
|
|
||||||
|
.arrow {
|
||||||
|
color:black;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 80%;
|
||||||
|
display: inline-block;
|
||||||
|
width: 16px;
|
||||||
|
height: 22px;
|
||||||
|
margin-left: 4px;
|
||||||
|
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-khtml-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#selected .arrow {
|
||||||
|
color: white;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #d2d2d2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav-tree {
|
||||||
|
background-image: none;
|
||||||
|
background-color: white;
|
||||||
|
|
||||||
|
.item {
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #d2d2d2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.selected {
|
||||||
|
background-image: none;
|
||||||
|
background-color: $primary-color;
|
||||||
|
color: white;
|
||||||
|
text-shadow: none;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-image: none;
|
||||||
|
background-color: $primary-color;
|
||||||
|
color: white;
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-resizable-e {
|
||||||
|
background: #808080 url("splitbar_handle.svg") no-repeat center;
|
||||||
|
border-right: solid 1px #c0c0c0;
|
||||||
|
border-left: solid 1px black;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #606060;
|
||||||
|
}
|
||||||
|
}
|
||||||
121
doc/that_style/sass/_navpath.scss
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
/*
|
||||||
|
* The line at the bottom
|
||||||
|
*/
|
||||||
|
|
||||||
|
.navpath {
|
||||||
|
ul {
|
||||||
|
font-size: 11px;
|
||||||
|
background-image: none;
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
color: black;
|
||||||
|
border: none;
|
||||||
|
border-top: 1px solid #808080;
|
||||||
|
overflow: hidden;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* intermediate navelems */
|
||||||
|
li:not(:first-child) {
|
||||||
|
list-style-type: none;
|
||||||
|
float: left;
|
||||||
|
padding-left: 18px;
|
||||||
|
padding-right: 10px;
|
||||||
|
color: black;
|
||||||
|
background-color: white;
|
||||||
|
background-image: url('nav_edge_inter.svg');
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: left -1px;
|
||||||
|
background-size: auto 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* first navelem */
|
||||||
|
li:first-child {
|
||||||
|
list-style-type: none;
|
||||||
|
float: left;
|
||||||
|
padding-left: 15px;
|
||||||
|
padding-right: 10px;
|
||||||
|
color: black;
|
||||||
|
background-color: white;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* last navelem */
|
||||||
|
li:nth-last-child(2) {
|
||||||
|
list-style-type: none;
|
||||||
|
float: left;
|
||||||
|
padding-left:10px;
|
||||||
|
padding-right:15px;
|
||||||
|
color: white;
|
||||||
|
background-color: $primary-color;
|
||||||
|
background-image: url('nav_edge_right.svg');
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: right -1px;
|
||||||
|
background-size: auto 100%;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
li:nth-last-child(2):not(:first-child) {
|
||||||
|
list-style-type: none;
|
||||||
|
float: left;
|
||||||
|
padding-left:15px;
|
||||||
|
padding-right:15px;
|
||||||
|
color: white;
|
||||||
|
background-color: $primary-color;
|
||||||
|
background-image: url('nav_edge_left.svg'), url('nav_edge_right.svg');
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: -1px -1px, right -1px;
|
||||||
|
background-size: auto 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
li.navelem a, .navpath li.navelem b {
|
||||||
|
height:32px;
|
||||||
|
display:block;
|
||||||
|
text-decoration: none;
|
||||||
|
outline: none;
|
||||||
|
color: inherit;
|
||||||
|
font-family: Roboto,sans-serif;
|
||||||
|
text-shadow: none;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
li.navelem a:hover {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
// the "doxygen" logo at the right
|
||||||
|
li.footer {
|
||||||
|
list-style-type: none;
|
||||||
|
float: right;
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: 10px;
|
||||||
|
background-color: #d5d5d5;
|
||||||
|
background-image: none;
|
||||||
|
color: black;
|
||||||
|
font-size: 8pt;
|
||||||
|
|
||||||
|
// show the edge image
|
||||||
|
&:before {
|
||||||
|
content: "";
|
||||||
|
width: 13px;
|
||||||
|
height: 30px;
|
||||||
|
display: inline-block;
|
||||||
|
float: left;
|
||||||
|
background-image: url("nav_edge_right.svg");
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: right 0;
|
||||||
|
background-size: auto 100%;
|
||||||
|
|
||||||
|
/* flip the element horizontally */
|
||||||
|
-moz-transform: scaleX(-1);
|
||||||
|
-o-transform: scaleX(-1);
|
||||||
|
-webkit-transform: scaleX(-1);
|
||||||
|
transform: scaleX(-1);
|
||||||
|
filter: FlipH;
|
||||||
|
-ms-filter: "FlipH";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
89
doc/that_style/sass/_search.scss
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* The search box
|
||||||
|
*/
|
||||||
|
|
||||||
|
.sm-dox > li:last-child {
|
||||||
|
margin-right: 10pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
#MSearchBox {
|
||||||
|
border: 2px inset black;
|
||||||
|
display: table;
|
||||||
|
width: 350px;
|
||||||
|
height: 26px;
|
||||||
|
background: white;
|
||||||
|
margin-top: 5px;
|
||||||
|
|
||||||
|
.left {
|
||||||
|
background-image: none;
|
||||||
|
display: table-cell;
|
||||||
|
width: 100%;
|
||||||
|
height: inherit;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// don't need this element
|
||||||
|
.right {
|
||||||
|
background-image: none;
|
||||||
|
width: 0;
|
||||||
|
display: none;
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// override for when there is no main menu
|
||||||
|
nav > #MSearchBox {
|
||||||
|
border: 2px solid #666666;
|
||||||
|
margin: 5px 10pt 0 0;
|
||||||
|
height: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#MSearchSelect, .left #MSearchSelect {
|
||||||
|
left: 0;
|
||||||
|
background-image: url("mag_glass.svg");
|
||||||
|
width: 22px;
|
||||||
|
height: 22px;
|
||||||
|
padding: 22px 22px 0 0 ;
|
||||||
|
margin: 0 4px 0 4px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
#MSearchField {
|
||||||
|
background-image: none;
|
||||||
|
display: table-cell;
|
||||||
|
margin: 0;
|
||||||
|
// leave room for #MSearchSelect and a bit more for the border
|
||||||
|
margin-left: 30px;
|
||||||
|
width: calc(100% - 34px);
|
||||||
|
height: 22px;
|
||||||
|
font: 11pt sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
#MSearchSelectWindow {
|
||||||
|
background-color: $background-color-dark;
|
||||||
|
padding: 0;
|
||||||
|
border: solid 1px black;
|
||||||
|
@include border-radius(0);
|
||||||
|
@include box-shadow(0 0 4px rgba(0,0,0,0.35), 0 0 8px rgba(0,0,0,0.2));
|
||||||
|
}
|
||||||
|
|
||||||
|
a.SelectItem {
|
||||||
|
color: white;
|
||||||
|
padding: 3px 4px;
|
||||||
|
font: 10pt sans-serif;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: $primary-color;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus, &:active {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#MSearchResultsWindow {
|
||||||
|
background-color: white;
|
||||||
|
@include box-shadow(0 0 4px rgba(0,0,0,0.35), 0 0 8px rgba(0,0,0,0.2));
|
||||||
|
}
|
||||||
1240
doc/that_style/sass/that_style.scss
Normal file
1436
doc/that_style/that_style.css
Normal file
@@ -3,64 +3,50 @@
|
|||||||
@section threads_with_libssh How to use libssh with threads
|
@section threads_with_libssh How to use libssh with threads
|
||||||
|
|
||||||
libssh may be used in multithreaded applications, but under several conditions :
|
libssh may be used in multithreaded applications, but under several conditions :
|
||||||
- Threading must be initialized during the initialization of libssh. This
|
- Your system must support libpthread or, in Windows environment,
|
||||||
initialization must be done outside of any threading context.
|
CriticalSection based mutex control.
|
||||||
- If pthreads is being used by your application (or your framework's backend),
|
- Since version 0.8.0, threads initialization is called automatically in the
|
||||||
you must link with libssh_threads dynamic library and initialize
|
library constructor if libssh is dynamically linked. This means it is no
|
||||||
threading with the ssh_threads_pthreads threading object.
|
longer necessary to call ssh_init()/ssh_finalize().
|
||||||
- If an other threading library is being used by your application, you must
|
- If libssh is statically linked, threading must be initialized by calling
|
||||||
implement all the methods of the ssh_threads_callbacks_struct structure
|
ssh_init() before using any of libssh provided functions. This initialization
|
||||||
and initialize libssh with it.
|
must be done outside of any threading context. Don't forget to call
|
||||||
|
ssh_finalize() to avoid memory leak
|
||||||
- At all times, you may use different sessions inside threads, make parallel
|
- At all times, you may use different sessions inside threads, make parallel
|
||||||
connections, read/write on different sessions and so on. You *cannot* use a
|
connections, read/write on different sessions and so on. You *cannot* use a
|
||||||
single session (or channels for a single session) in several threads at the same
|
single session (or channels for a single session) in several threads at the same
|
||||||
time. This will most likely lead to internal state corruption. This limitation is
|
time. This will most likely lead to internal state corruption. This limitation is
|
||||||
being worked out and will maybe disappear later.
|
being worked out and will maybe disappear later.
|
||||||
|
|
||||||
@subsection threads_init Initialization of threads
|
@subsection threads_init Initialization of threads
|
||||||
|
|
||||||
To initialize threading, you must first select the threading model you want to
|
Since version 0.8.0, it is no longer necessary to call ssh_init()/ssh_finalize()
|
||||||
use, using ssh_threads_set_callbacks(), then call ssh_init().
|
if libssh is dynamically linked.
|
||||||
|
|
||||||
@code
|
If libssh is statically linked, call ssh_init() before using any of libssh
|
||||||
#include <libssh/callbacks.h>
|
provided functions.
|
||||||
...
|
|
||||||
ssh_threads_set_callbacks(ssh_threads_get_noop());
|
|
||||||
ssh_init();
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
ssh_threads_noop is the threading structure that does nothing. It's the
|
|
||||||
threading callbacks being used by default when you're not using threading.
|
|
||||||
|
|
||||||
@subsection threads_pthread Using libpthread with libssh
|
@subsection threads_pthread Using libpthread with libssh
|
||||||
|
|
||||||
If your application is using libpthread, you may simply use the libpthread
|
Since version 0.8.0, libpthread is the default threads library used by libssh.
|
||||||
threading backend:
|
|
||||||
|
|
||||||
@code
|
To use libpthread, simply link it to you application.
|
||||||
#include <libssh/callbacks.h>
|
|
||||||
...
|
|
||||||
ssh_threads_set_callbacks(ssh_threads_get_pthread());
|
|
||||||
ssh_init();
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
However, you must be sure to link with the library ssh_threads. If
|
|
||||||
you're using gcc, you must use the commandline
|
|
||||||
@code
|
|
||||||
gcc -o output input.c -lssh -lssh_threads
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
If you are using libssh statically linked, don't forget to call ssh_init()
|
||||||
|
before using any of libssh provided functions (and ssh_finalize() in the end).
|
||||||
|
|
||||||
@subsection threads_other Using another threading library
|
@subsection threads_other Using another threading library
|
||||||
|
|
||||||
You must find your way in the ssh_threads_callbacks_struct structure. You must
|
Since version 0.8.0, libssh does not support custom threading libraries.
|
||||||
implement the following methods :
|
The change makes sense since the newer versions for libcrypto (OpenSSL) and
|
||||||
- mutex_lock
|
libgcrypt don't support custom threading libraries.
|
||||||
- mutex_unlock
|
|
||||||
- mutex_init
|
The default used threading library is libpthread.
|
||||||
- mutex_destroy
|
Alternatively, in Windows environment, CriticalSection based mutex control can
|
||||||
- thread_id
|
be used.
|
||||||
|
|
||||||
|
If your system does not support libpthread nor CriticalSection based mutex
|
||||||
|
control, unfortunately, you cannot use libssh in multithreaded scenarios.
|
||||||
|
|
||||||
libgcrypt 1.6 and bigger backend does not support custom callback. Using anything else than pthreads (ssh_threads_get_pthread()) here will fail.
|
|
||||||
Good luck !
|
Good luck !
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -17,46 +17,57 @@ endif()
|
|||||||
|
|
||||||
if (UNIX AND NOT WIN32)
|
if (UNIX AND NOT WIN32)
|
||||||
add_executable(libssh_scp libssh_scp.c ${examples_SRCS})
|
add_executable(libssh_scp libssh_scp.c ${examples_SRCS})
|
||||||
|
target_compile_options(libssh_scp PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(libssh_scp ${LIBSSH_SHARED_LIBRARY})
|
target_link_libraries(libssh_scp ${LIBSSH_SHARED_LIBRARY})
|
||||||
|
|
||||||
add_executable(scp_download scp_download.c ${examples_SRCS})
|
add_executable(scp_download scp_download.c ${examples_SRCS})
|
||||||
|
target_compile_options(scp_download PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(scp_download ${LIBSSH_SHARED_LIBRARY})
|
target_link_libraries(scp_download ${LIBSSH_SHARED_LIBRARY})
|
||||||
|
|
||||||
add_executable(sshnetcat sshnetcat.c ${examples_SRCS})
|
add_executable(sshnetcat sshnetcat.c ${examples_SRCS})
|
||||||
|
target_compile_options(sshnetcat PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(sshnetcat ${LIBSSH_SHARED_LIBRARY})
|
target_link_libraries(sshnetcat ${LIBSSH_SHARED_LIBRARY})
|
||||||
|
|
||||||
if (WITH_SFTP)
|
if (WITH_SFTP)
|
||||||
add_executable(samplesftp samplesftp.c ${examples_SRCS})
|
add_executable(samplesftp samplesftp.c ${examples_SRCS})
|
||||||
|
target_compile_options(samplesftp PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(samplesftp ${LIBSSH_SHARED_LIBRARY})
|
target_link_libraries(samplesftp ${LIBSSH_SHARED_LIBRARY})
|
||||||
endif (WITH_SFTP)
|
endif (WITH_SFTP)
|
||||||
|
|
||||||
add_executable(ssh-client ssh_client.c ${examples_SRCS})
|
add_executable(ssh-client ssh_client.c ${examples_SRCS})
|
||||||
|
target_compile_options(ssh-client PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(ssh-client ${LIBSSH_SHARED_LIBRARY})
|
target_link_libraries(ssh-client ${LIBSSH_SHARED_LIBRARY})
|
||||||
|
|
||||||
if (WITH_SERVER AND (ARGP_LIBRARY OR HAVE_ARGP_H))
|
if (WITH_SERVER AND (ARGP_LIBRARY OR HAVE_ARGP_H))
|
||||||
if (HAVE_LIBUTIL)
|
if (HAVE_LIBUTIL)
|
||||||
add_executable(ssh_server_fork ssh_server_fork.c)
|
add_executable(ssh_server_fork ssh_server_fork.c)
|
||||||
|
target_compile_options(ssh_server_fork PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(ssh_server_fork ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARY} util)
|
target_link_libraries(ssh_server_fork ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARY} util)
|
||||||
endif (HAVE_LIBUTIL)
|
endif (HAVE_LIBUTIL)
|
||||||
|
|
||||||
if (WITH_GSSAPI AND GSSAPI_FOUND)
|
if (WITH_GSSAPI AND GSSAPI_FOUND)
|
||||||
add_executable(samplesshd-cb samplesshd-cb.c)
|
add_executable(samplesshd-cb samplesshd-cb.c)
|
||||||
|
target_compile_options(samplesshd-cb PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(samplesshd-cb ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARY})
|
target_link_libraries(samplesshd-cb ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARY})
|
||||||
|
|
||||||
add_executable(proxy proxy.c)
|
add_executable(proxy proxy.c)
|
||||||
|
target_compile_options(proxy PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(proxy ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARY})
|
target_link_libraries(proxy ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARY})
|
||||||
endif (WITH_GSSAPI AND GSSAPI_FOUND)
|
endif (WITH_GSSAPI AND GSSAPI_FOUND)
|
||||||
|
|
||||||
add_executable(samplesshd-kbdint samplesshd-kbdint.c)
|
add_executable(samplesshd-kbdint samplesshd-kbdint.c)
|
||||||
|
target_compile_options(samplesshd-kbdint PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(samplesshd-kbdint ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARY})
|
target_link_libraries(samplesshd-kbdint ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARY})
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
endif (UNIX AND NOT WIN32)
|
endif (UNIX AND NOT WIN32)
|
||||||
|
|
||||||
add_executable(exec exec.c ${examples_SRCS})
|
add_executable(exec exec.c ${examples_SRCS})
|
||||||
|
target_compile_options(exec PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(exec ${LIBSSH_SHARED_LIBRARY})
|
target_link_libraries(exec ${LIBSSH_SHARED_LIBRARY})
|
||||||
|
|
||||||
add_executable(senddata senddata.c ${examples_SRCS})
|
add_executable(senddata senddata.c ${examples_SRCS})
|
||||||
|
target_compile_options(senddata PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(senddata ${LIBSSH_SHARED_LIBRARY})
|
target_link_libraries(senddata ${LIBSSH_SHARED_LIBRARY})
|
||||||
|
|
||||||
add_executable(libsshpp libsshpp.cpp)
|
add_executable(libsshpp libsshpp.cpp)
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ clients must be made or how a client should react.
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
int verify_knownhost(ssh_session session){
|
int verify_knownhost(ssh_session session){
|
||||||
char *hexa;
|
|
||||||
enum ssh_known_hosts_e state;
|
enum ssh_known_hosts_e state;
|
||||||
char buf[10];
|
char buf[10];
|
||||||
unsigned char *hash = NULL;
|
unsigned char *hash = NULL;
|
||||||
@@ -47,7 +46,7 @@ int verify_knownhost(ssh_session session){
|
|||||||
}
|
}
|
||||||
|
|
||||||
rc = ssh_get_publickey_hash(srv_pubkey,
|
rc = ssh_get_publickey_hash(srv_pubkey,
|
||||||
SSH_PUBLICKEY_HASH_SHA1,
|
SSH_PUBLICKEY_HASH_SHA256,
|
||||||
&hash,
|
&hash,
|
||||||
&hlen);
|
&hlen);
|
||||||
ssh_key_free(srv_pubkey);
|
ssh_key_free(srv_pubkey);
|
||||||
@@ -62,7 +61,7 @@ int verify_knownhost(ssh_session session){
|
|||||||
break; /* ok */
|
break; /* ok */
|
||||||
case SSH_KNOWN_HOSTS_CHANGED:
|
case SSH_KNOWN_HOSTS_CHANGED:
|
||||||
fprintf(stderr,"Host key for server changed : server's one is now :\n");
|
fprintf(stderr,"Host key for server changed : server's one is now :\n");
|
||||||
ssh_print_hexa("Public key hash",hash, hlen);
|
ssh_print_hash(SSH_PUBLICKEY_HASH_SHA256, hash, hlen);
|
||||||
ssh_clean_pubkey_hash(&hash);
|
ssh_clean_pubkey_hash(&hash);
|
||||||
fprintf(stderr,"For security reason, connection will be stopped\n");
|
fprintf(stderr,"For security reason, connection will be stopped\n");
|
||||||
return -1;
|
return -1;
|
||||||
@@ -78,10 +77,10 @@ int verify_knownhost(ssh_session session){
|
|||||||
/* fallback to SSH_SERVER_NOT_KNOWN behavior */
|
/* fallback to SSH_SERVER_NOT_KNOWN behavior */
|
||||||
FALL_THROUGH;
|
FALL_THROUGH;
|
||||||
case SSH_SERVER_NOT_KNOWN:
|
case SSH_SERVER_NOT_KNOWN:
|
||||||
hexa = ssh_get_hexa(hash, hlen);
|
fprintf(stderr,
|
||||||
fprintf(stderr,"The server is unknown. Do you trust the host key ?\n");
|
"The server is unknown. Do you trust the host key (yes/no)?\n");
|
||||||
fprintf(stderr, "Public key hash: %s\n", hexa);
|
ssh_print_hash(SSH_PUBLICKEY_HASH_SHA256, hash, hlen);
|
||||||
ssh_string_free_char(hexa);
|
|
||||||
if (fgets(buf, sizeof(buf), stdin) == NULL) {
|
if (fgets(buf, sizeof(buf), stdin) == NULL) {
|
||||||
ssh_clean_pubkey_hash(&hash);
|
ssh_clean_pubkey_hash(&hash);
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
@@ -43,7 +43,8 @@ const char *port="22";
|
|||||||
char *pcap_file=NULL;
|
char *pcap_file=NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void usage(){
|
static void usage(void)
|
||||||
|
{
|
||||||
fprintf(stderr,"Usage : sshnetcat [user@]host forwarded_host forwarded_port\n");
|
fprintf(stderr,"Usage : sshnetcat [user@]host forwarded_host forwarded_port\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -101,8 +101,7 @@ int ssh_mbedcry_is_bit_set(bignum num, size_t pos);
|
|||||||
mbedtls_mpi_size(num))
|
mbedtls_mpi_size(num))
|
||||||
#define bignum_cmp(num1, num2) mbedtls_mpi_cmp_mpi(num1, num2)
|
#define bignum_cmp(num1, num2) mbedtls_mpi_cmp_mpi(num1, num2)
|
||||||
|
|
||||||
mbedtls_entropy_context ssh_mbedtls_entropy;
|
mbedtls_ctr_drbg_context *ssh_get_mbedtls_ctr_drbg_context(void);
|
||||||
mbedtls_ctr_drbg_context ssh_mbedtls_ctr_drbg;
|
|
||||||
|
|
||||||
int ssh_mbedtls_random(void *where, int len, int strong);
|
int ssh_mbedtls_random(void *where, int len, int strong);
|
||||||
|
|
||||||
|
|||||||
@@ -78,8 +78,8 @@
|
|||||||
|
|
||||||
/* libssh version */
|
/* libssh version */
|
||||||
#define LIBSSH_VERSION_MAJOR 0
|
#define LIBSSH_VERSION_MAJOR 0
|
||||||
#define LIBSSH_VERSION_MINOR 7
|
#define LIBSSH_VERSION_MINOR 8
|
||||||
#define LIBSSH_VERSION_MICRO 90
|
#define LIBSSH_VERSION_MICRO 2
|
||||||
|
|
||||||
#define LIBSSH_VERSION_INT SSH_VERSION_INT(LIBSSH_VERSION_MAJOR, \
|
#define LIBSSH_VERSION_INT SSH_VERSION_INT(LIBSSH_VERSION_MAJOR, \
|
||||||
LIBSSH_VERSION_MINOR, \
|
LIBSSH_VERSION_MINOR, \
|
||||||
@@ -239,11 +239,39 @@ enum ssh_server_known_e {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum ssh_known_hosts_e {
|
enum ssh_known_hosts_e {
|
||||||
|
/**
|
||||||
|
* There had been an error checking the host.
|
||||||
|
*/
|
||||||
SSH_KNOWN_HOSTS_ERROR = -2,
|
SSH_KNOWN_HOSTS_ERROR = -2,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The known host file does not exist. The host is thus unknown. File will
|
||||||
|
* be created if host key is accepted.
|
||||||
|
*/
|
||||||
SSH_KNOWN_HOSTS_NOT_FOUND = -1,
|
SSH_KNOWN_HOSTS_NOT_FOUND = -1,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The server is unknown. User should confirm the public key hash is
|
||||||
|
* correct.
|
||||||
|
*/
|
||||||
SSH_KNOWN_HOSTS_UNKNOWN = 0,
|
SSH_KNOWN_HOSTS_UNKNOWN = 0,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The server is known and has not changed.
|
||||||
|
*/
|
||||||
SSH_KNOWN_HOSTS_OK,
|
SSH_KNOWN_HOSTS_OK,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The server key has changed. Either you are under attack or the
|
||||||
|
* administrator changed the key. You HAVE to warn the user about a
|
||||||
|
* possible attack.
|
||||||
|
*/
|
||||||
SSH_KNOWN_HOSTS_CHANGED,
|
SSH_KNOWN_HOSTS_CHANGED,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The server gave use a key of a type while we had an other type recorded.
|
||||||
|
* It is a possible attack.
|
||||||
|
*/
|
||||||
SSH_KNOWN_HOSTS_OTHER,
|
SSH_KNOWN_HOSTS_OTHER,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -500,7 +528,8 @@ LIBSSH_API int ssh_get_server_publickey(ssh_session session, ssh_key *key);
|
|||||||
|
|
||||||
enum ssh_publickey_hash_type {
|
enum ssh_publickey_hash_type {
|
||||||
SSH_PUBLICKEY_HASH_SHA1,
|
SSH_PUBLICKEY_HASH_SHA1,
|
||||||
SSH_PUBLICKEY_HASH_MD5
|
SSH_PUBLICKEY_HASH_MD5,
|
||||||
|
SSH_PUBLICKEY_HASH_SHA256
|
||||||
};
|
};
|
||||||
LIBSSH_API int ssh_get_publickey_hash(const ssh_key key,
|
LIBSSH_API int ssh_get_publickey_hash(const ssh_key key,
|
||||||
enum ssh_publickey_hash_type type,
|
enum ssh_publickey_hash_type type,
|
||||||
@@ -652,6 +681,7 @@ LIBSSH_API int ssh_pki_export_pubkey_file(const ssh_key key,
|
|||||||
|
|
||||||
LIBSSH_API const char *ssh_pki_key_ecdsa_name(const ssh_key key);
|
LIBSSH_API const char *ssh_pki_key_ecdsa_name(const ssh_key key);
|
||||||
|
|
||||||
|
LIBSSH_API void ssh_print_hash(enum ssh_publickey_hash_type type, unsigned char *hash, size_t len);
|
||||||
LIBSSH_API void ssh_print_hexa(const char *descr, const unsigned char *what, size_t len);
|
LIBSSH_API void ssh_print_hexa(const char *descr, const unsigned char *what, size_t len);
|
||||||
LIBSSH_API int ssh_send_ignore (ssh_session session, const char *data);
|
LIBSSH_API int ssh_send_ignore (ssh_session session, const char *data);
|
||||||
LIBSSH_API int ssh_send_debug (ssh_session session, const char *message, int always_display);
|
LIBSSH_API int ssh_send_debug (ssh_session session, const char *message, int always_display);
|
||||||
|
|||||||
@@ -195,11 +195,20 @@ public:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @brief Authenticate through the "keyboard-interactive" method.
|
/**
|
||||||
* @param[in] The username to authenticate. You can specify NULL if ssh_option_set_username() has been used. You cannot try two different logins in a row.
|
* @brief Authenticate through the "keyboard-interactive" method.
|
||||||
* @param[in] Undocumented. Set it to NULL.
|
*
|
||||||
|
* @param[in] username The username to authenticate. You can specify NULL if
|
||||||
|
* ssh_option_set_username() has been used. You cannot
|
||||||
|
* try two different logins in a row.
|
||||||
|
*
|
||||||
|
* @param[in] submethods Undocumented. Set it to NULL.
|
||||||
|
*
|
||||||
* @throws SshException on error
|
* @throws SshException on error
|
||||||
* @returns SSH_AUTH_SUCCESS, SSH_AUTH_PARTIAL, SSH_AUTH_DENIED, SSH_AUTH_ERROR, SSH_AUTH_INFO, SSH_AUTH_AGAIN
|
*
|
||||||
|
* @returns SSH_AUTH_SUCCESS, SSH_AUTH_PARTIAL, SSH_AUTH_DENIED,
|
||||||
|
* SSH_AUTH_ERROR, SSH_AUTH_INFO, SSH_AUTH_AGAIN
|
||||||
|
*
|
||||||
* @see ssh_userauth_kbdint
|
* @see ssh_userauth_kbdint
|
||||||
*/
|
*/
|
||||||
int userauthKbdint(const char* username, const char* submethods){
|
int userauthKbdint(const char* username, const char* submethods){
|
||||||
@@ -216,15 +225,25 @@ public:
|
|||||||
return ssh_userauth_kbdint_getnprompts(c_session);
|
return ssh_userauth_kbdint_getnprompts(c_session);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @brief Set the answer for a question from a message block..
|
/**
|
||||||
* @param[in] index The number of the ith prompt.
|
* @brief Set the answer for a question from a message block.
|
||||||
* @param[in] The answer to give to the server. The answer MUST be encoded UTF-8. It is up to the server how to interpret the value and validate it. However, if you read the answer in some other encoding, you MUST convert it to UTF-8.
|
*
|
||||||
|
* @param[in] index The index number of the prompt.
|
||||||
|
* @param[in] answer The answer to give to the server. The answer MUST be
|
||||||
|
* encoded UTF-8. It is up to the server how to interpret
|
||||||
|
* the value and validate it. However, if you read the
|
||||||
|
* answer in some other encoding, you MUST convert it to
|
||||||
|
* UTF-8.
|
||||||
|
*
|
||||||
* @throws SshException on error
|
* @throws SshException on error
|
||||||
|
*
|
||||||
* @returns 0 on success, < 0 on error
|
* @returns 0 on success, < 0 on error
|
||||||
|
*
|
||||||
* @see ssh_userauth_kbdint_setanswer
|
* @see ssh_userauth_kbdint_setanswer
|
||||||
*/
|
*/
|
||||||
int userauthKbdintSetAnswer(unsigned int i, const char* answer){
|
int userauthKbdintSetAnswer(unsigned int index, const char *answer)
|
||||||
int ret=ssh_userauth_kbdint_setanswer(c_session, i, answer);
|
{
|
||||||
|
int ret = ssh_userauth_kbdint_setanswer(c_session, index, answer);
|
||||||
ssh_throw(ret);
|
ssh_throw(ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -438,9 +457,9 @@ private:
|
|||||||
class Channel {
|
class Channel {
|
||||||
friend class Session;
|
friend class Session;
|
||||||
public:
|
public:
|
||||||
Channel(Session &session){
|
Channel(Session &ssh_session){
|
||||||
channel=ssh_channel_new(session.getCSession());
|
channel = ssh_channel_new(ssh_session.getCSession());
|
||||||
this->session=&session;
|
this->session = &ssh_session;
|
||||||
}
|
}
|
||||||
~Channel(){
|
~Channel(){
|
||||||
ssh_channel_free(channel);
|
ssh_channel_free(channel);
|
||||||
@@ -641,9 +660,9 @@ protected:
|
|||||||
ssh_channel channel;
|
ssh_channel channel;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Channel (Session &session, ssh_channel c_channel){
|
Channel (Session &ssh_session, ssh_channel c_channel){
|
||||||
this->channel=c_channel;
|
this->channel=c_channel;
|
||||||
this->session=&session;
|
this->session = &ssh_session;
|
||||||
}
|
}
|
||||||
/* No copy and no = operator */
|
/* No copy and no = operator */
|
||||||
Channel(const Channel &);
|
Channel(const Channel &);
|
||||||
|
|||||||
@@ -44,6 +44,10 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif /* !defined(HAVE_STRTOULL) */
|
#endif /* !defined(HAVE_STRTOULL) */
|
||||||
|
|
||||||
|
#if !defined(HAVE_STRNDUP)
|
||||||
|
char *strndup(const char *s, size_t n);
|
||||||
|
#endif /* ! HAVE_STRNDUP */
|
||||||
|
|
||||||
#ifdef HAVE_BYTESWAP_H
|
#ifdef HAVE_BYTESWAP_H
|
||||||
#include <byteswap.h>
|
#include <byteswap.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -232,6 +236,7 @@ void _ssh_set_error_oom(void *error, const char *function);
|
|||||||
_ssh_set_error_invalid(error, __func__)
|
_ssh_set_error_invalid(error, __func__)
|
||||||
void _ssh_set_error_invalid(void *error, const char *function);
|
void _ssh_set_error_invalid(void *error, const char *function);
|
||||||
|
|
||||||
|
void ssh_reset_error(void *error);
|
||||||
|
|
||||||
/* server.c */
|
/* server.c */
|
||||||
#ifdef WITH_SERVER
|
#ifdef WITH_SERVER
|
||||||
|
|||||||
@@ -128,11 +128,16 @@ struct ssh_session_struct {
|
|||||||
enum ssh_session_state_e session_state;
|
enum ssh_session_state_e session_state;
|
||||||
int packet_state;
|
int packet_state;
|
||||||
enum ssh_dh_state_e dh_handshake_state;
|
enum ssh_dh_state_e dh_handshake_state;
|
||||||
enum ssh_auth_service_state_e auth_service_state;
|
|
||||||
enum ssh_auth_state_e auth_state;
|
|
||||||
enum ssh_channel_request_state_e global_req_state;
|
enum ssh_channel_request_state_e global_req_state;
|
||||||
struct ssh_agent_state_struct *agent_state;
|
struct ssh_agent_state_struct *agent_state;
|
||||||
struct ssh_auth_auto_state_struct *auth_auto_state;
|
|
||||||
|
struct {
|
||||||
|
struct ssh_auth_auto_state_struct *auto_state;
|
||||||
|
enum ssh_auth_service_state_e service_state;
|
||||||
|
enum ssh_auth_state_e state;
|
||||||
|
uint32_t supported_methods;
|
||||||
|
uint32_t current_method;
|
||||||
|
} auth;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RFC 4253, 7.1: if the first_kex_packet_follows flag was set in
|
* RFC 4253, 7.1: if the first_kex_packet_follows flag was set in
|
||||||
@@ -167,8 +172,8 @@ struct ssh_session_struct {
|
|||||||
/* The type of host key wanted by client */
|
/* The type of host key wanted by client */
|
||||||
enum ssh_keytypes_e hostkey;
|
enum ssh_keytypes_e hostkey;
|
||||||
} srv;
|
} srv;
|
||||||
|
|
||||||
/* auths accepted by server */
|
/* auths accepted by server */
|
||||||
int auth_methods;
|
|
||||||
struct ssh_list *ssh_message_list; /* list of delayed SSH messages */
|
struct ssh_list *ssh_message_list; /* list of delayed SSH messages */
|
||||||
int (*ssh_message_callback)( struct ssh_session_struct *session, ssh_message msg, void *userdata);
|
int (*ssh_message_callback)( struct ssh_session_struct *session, ssh_message msg, void *userdata);
|
||||||
void *ssh_message_callback_data;
|
void *ssh_message_callback_data;
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#define SSH_MUTEX pthread_mutex_t
|
#define SSH_MUTEX pthread_mutex_t
|
||||||
|
|
||||||
#if defined _GNU_SOURCE
|
#if defined(PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP)
|
||||||
#define SSH_MUTEX_STATIC_INIT PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
|
#define SSH_MUTEX_STATIC_INIT PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
|
||||||
#else
|
#else
|
||||||
#define SSH_MUTEX_STATIC_INIT PTHREAD_MUTEX_INITIALIZER
|
#define SSH_MUTEX_STATIC_INIT PTHREAD_MUTEX_INITIALIZER
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
set(PACKAGE_VERSION @APPLICATION_VERSION@)
|
set(PACKAGE_VERSION @PROJECT_VERSION@)
|
||||||
|
|
||||||
# Check whether the requested PACKAGE_FIND_VERSION is compatible
|
# Check whether the requested PACKAGE_FIND_VERSION is compatible
|
||||||
if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}")
|
if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}")
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
Name: ${APPLICATION_NAME}
|
Name: ${PROJECT_NAME}
|
||||||
Description: The SSH Library
|
Description: The SSH Library
|
||||||
Version: ${APPLICATION_VERSION}
|
Version: ${PROJECT_VERSION}
|
||||||
Libs: -L${LIB_INSTALL_DIR} -lssh
|
Libs: -L${LIB_INSTALL_DIR} -lssh
|
||||||
Cflags: -I${INCLUDE_INSTALL_DIR}
|
Cflags: -I${INCLUDE_INSTALL_DIR}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
Name: ${APPLICATION_NAME}_threads
|
|
||||||
Description: The SSH Library Thread Extension
|
|
||||||
Version: ${APPLICATION_VERSION}
|
|
||||||
Libs: -L${LIB_INSTALL_DIR} -lssh_threads
|
|
||||||
Cflags: -I${INCLUDE_INSTALL_DIR}
|
|
||||||
|
|
||||||
@@ -1 +1 @@
|
|||||||
4.5.0
|
4.6.0
|
||||||
0
src/ABI/libssh-4.5.1.symbols
Normal file
412
src/ABI/libssh-4.6.0.symbols
Normal file
@@ -0,0 +1,412 @@
|
|||||||
|
_ssh_log
|
||||||
|
buffer_free
|
||||||
|
buffer_get
|
||||||
|
buffer_get_len
|
||||||
|
buffer_new
|
||||||
|
channel_accept_x11
|
||||||
|
channel_change_pty_size
|
||||||
|
channel_close
|
||||||
|
channel_forward_accept
|
||||||
|
channel_forward_cancel
|
||||||
|
channel_forward_listen
|
||||||
|
channel_free
|
||||||
|
channel_get_exit_status
|
||||||
|
channel_get_session
|
||||||
|
channel_is_closed
|
||||||
|
channel_is_eof
|
||||||
|
channel_is_open
|
||||||
|
channel_new
|
||||||
|
channel_open_forward
|
||||||
|
channel_open_session
|
||||||
|
channel_poll
|
||||||
|
channel_read
|
||||||
|
channel_read_buffer
|
||||||
|
channel_read_nonblocking
|
||||||
|
channel_request_env
|
||||||
|
channel_request_exec
|
||||||
|
channel_request_pty
|
||||||
|
channel_request_pty_size
|
||||||
|
channel_request_send_signal
|
||||||
|
channel_request_sftp
|
||||||
|
channel_request_shell
|
||||||
|
channel_request_subsystem
|
||||||
|
channel_request_x11
|
||||||
|
channel_select
|
||||||
|
channel_send_eof
|
||||||
|
channel_set_blocking
|
||||||
|
channel_write
|
||||||
|
channel_write_stderr
|
||||||
|
privatekey_free
|
||||||
|
privatekey_from_file
|
||||||
|
publickey_free
|
||||||
|
publickey_from_file
|
||||||
|
publickey_from_privatekey
|
||||||
|
publickey_to_string
|
||||||
|
sftp_async_read
|
||||||
|
sftp_async_read_begin
|
||||||
|
sftp_attributes_free
|
||||||
|
sftp_canonicalize_path
|
||||||
|
sftp_chmod
|
||||||
|
sftp_chown
|
||||||
|
sftp_client_message_free
|
||||||
|
sftp_client_message_get_data
|
||||||
|
sftp_client_message_get_filename
|
||||||
|
sftp_client_message_get_flags
|
||||||
|
sftp_client_message_get_type
|
||||||
|
sftp_client_message_set_filename
|
||||||
|
sftp_close
|
||||||
|
sftp_closedir
|
||||||
|
sftp_dir_eof
|
||||||
|
sftp_extension_supported
|
||||||
|
sftp_extensions_get_count
|
||||||
|
sftp_extensions_get_data
|
||||||
|
sftp_extensions_get_name
|
||||||
|
sftp_file_set_blocking
|
||||||
|
sftp_file_set_nonblocking
|
||||||
|
sftp_free
|
||||||
|
sftp_fstat
|
||||||
|
sftp_fstatvfs
|
||||||
|
sftp_fsync
|
||||||
|
sftp_get_client_message
|
||||||
|
sftp_get_error
|
||||||
|
sftp_handle
|
||||||
|
sftp_handle_alloc
|
||||||
|
sftp_handle_remove
|
||||||
|
sftp_init
|
||||||
|
sftp_lstat
|
||||||
|
sftp_mkdir
|
||||||
|
sftp_new
|
||||||
|
sftp_new_channel
|
||||||
|
sftp_open
|
||||||
|
sftp_opendir
|
||||||
|
sftp_read
|
||||||
|
sftp_readdir
|
||||||
|
sftp_readlink
|
||||||
|
sftp_rename
|
||||||
|
sftp_reply_attr
|
||||||
|
sftp_reply_data
|
||||||
|
sftp_reply_handle
|
||||||
|
sftp_reply_name
|
||||||
|
sftp_reply_names
|
||||||
|
sftp_reply_names_add
|
||||||
|
sftp_reply_status
|
||||||
|
sftp_rewind
|
||||||
|
sftp_rmdir
|
||||||
|
sftp_seek
|
||||||
|
sftp_seek64
|
||||||
|
sftp_send_client_message
|
||||||
|
sftp_server_init
|
||||||
|
sftp_server_new
|
||||||
|
sftp_server_version
|
||||||
|
sftp_setstat
|
||||||
|
sftp_stat
|
||||||
|
sftp_statvfs
|
||||||
|
sftp_statvfs_free
|
||||||
|
sftp_symlink
|
||||||
|
sftp_tell
|
||||||
|
sftp_tell64
|
||||||
|
sftp_unlink
|
||||||
|
sftp_utimes
|
||||||
|
sftp_write
|
||||||
|
ssh_accept
|
||||||
|
ssh_add_channel_callbacks
|
||||||
|
ssh_auth_list
|
||||||
|
ssh_basename
|
||||||
|
ssh_bind_accept
|
||||||
|
ssh_bind_accept_fd
|
||||||
|
ssh_bind_fd_toaccept
|
||||||
|
ssh_bind_free
|
||||||
|
ssh_bind_get_fd
|
||||||
|
ssh_bind_listen
|
||||||
|
ssh_bind_new
|
||||||
|
ssh_bind_options_set
|
||||||
|
ssh_bind_set_blocking
|
||||||
|
ssh_bind_set_callbacks
|
||||||
|
ssh_bind_set_fd
|
||||||
|
ssh_blocking_flush
|
||||||
|
ssh_buffer_add_data
|
||||||
|
ssh_buffer_free
|
||||||
|
ssh_buffer_get
|
||||||
|
ssh_buffer_get_data
|
||||||
|
ssh_buffer_get_len
|
||||||
|
ssh_buffer_new
|
||||||
|
ssh_buffer_reinit
|
||||||
|
ssh_channel_accept_forward
|
||||||
|
ssh_channel_accept_x11
|
||||||
|
ssh_channel_cancel_forward
|
||||||
|
ssh_channel_change_pty_size
|
||||||
|
ssh_channel_close
|
||||||
|
ssh_channel_free
|
||||||
|
ssh_channel_get_exit_status
|
||||||
|
ssh_channel_get_session
|
||||||
|
ssh_channel_is_closed
|
||||||
|
ssh_channel_is_eof
|
||||||
|
ssh_channel_is_open
|
||||||
|
ssh_channel_listen_forward
|
||||||
|
ssh_channel_new
|
||||||
|
ssh_channel_open_auth_agent
|
||||||
|
ssh_channel_open_forward
|
||||||
|
ssh_channel_open_reverse_forward
|
||||||
|
ssh_channel_open_session
|
||||||
|
ssh_channel_open_x11
|
||||||
|
ssh_channel_poll
|
||||||
|
ssh_channel_poll_timeout
|
||||||
|
ssh_channel_read
|
||||||
|
ssh_channel_read_nonblocking
|
||||||
|
ssh_channel_read_timeout
|
||||||
|
ssh_channel_request_auth_agent
|
||||||
|
ssh_channel_request_env
|
||||||
|
ssh_channel_request_exec
|
||||||
|
ssh_channel_request_pty
|
||||||
|
ssh_channel_request_pty_size
|
||||||
|
ssh_channel_request_send_break
|
||||||
|
ssh_channel_request_send_exit_signal
|
||||||
|
ssh_channel_request_send_exit_status
|
||||||
|
ssh_channel_request_send_signal
|
||||||
|
ssh_channel_request_sftp
|
||||||
|
ssh_channel_request_shell
|
||||||
|
ssh_channel_request_subsystem
|
||||||
|
ssh_channel_request_x11
|
||||||
|
ssh_channel_select
|
||||||
|
ssh_channel_send_eof
|
||||||
|
ssh_channel_set_blocking
|
||||||
|
ssh_channel_set_counter
|
||||||
|
ssh_channel_window_size
|
||||||
|
ssh_channel_write
|
||||||
|
ssh_channel_write_stderr
|
||||||
|
ssh_clean_pubkey_hash
|
||||||
|
ssh_connect
|
||||||
|
ssh_connector_free
|
||||||
|
ssh_connector_new
|
||||||
|
ssh_connector_set_in_channel
|
||||||
|
ssh_connector_set_in_fd
|
||||||
|
ssh_connector_set_out_channel
|
||||||
|
ssh_connector_set_out_fd
|
||||||
|
ssh_copyright
|
||||||
|
ssh_dirname
|
||||||
|
ssh_disconnect
|
||||||
|
ssh_dump_knownhost
|
||||||
|
ssh_event_add_connector
|
||||||
|
ssh_event_add_fd
|
||||||
|
ssh_event_add_session
|
||||||
|
ssh_event_dopoll
|
||||||
|
ssh_event_free
|
||||||
|
ssh_event_new
|
||||||
|
ssh_event_remove_connector
|
||||||
|
ssh_event_remove_fd
|
||||||
|
ssh_event_remove_session
|
||||||
|
ssh_execute_message_callbacks
|
||||||
|
ssh_finalize
|
||||||
|
ssh_forward_accept
|
||||||
|
ssh_forward_cancel
|
||||||
|
ssh_forward_listen
|
||||||
|
ssh_free
|
||||||
|
ssh_get_cipher_in
|
||||||
|
ssh_get_cipher_out
|
||||||
|
ssh_get_clientbanner
|
||||||
|
ssh_get_disconnect_message
|
||||||
|
ssh_get_error
|
||||||
|
ssh_get_error_code
|
||||||
|
ssh_get_fd
|
||||||
|
ssh_get_hexa
|
||||||
|
ssh_get_hmac_in
|
||||||
|
ssh_get_hmac_out
|
||||||
|
ssh_get_issue_banner
|
||||||
|
ssh_get_kex_algo
|
||||||
|
ssh_get_log_callback
|
||||||
|
ssh_get_log_level
|
||||||
|
ssh_get_log_userdata
|
||||||
|
ssh_get_openssh_version
|
||||||
|
ssh_get_poll_flags
|
||||||
|
ssh_get_pubkey
|
||||||
|
ssh_get_pubkey_hash
|
||||||
|
ssh_get_publickey
|
||||||
|
ssh_get_publickey_hash
|
||||||
|
ssh_get_random
|
||||||
|
ssh_get_server_publickey
|
||||||
|
ssh_get_serverbanner
|
||||||
|
ssh_get_status
|
||||||
|
ssh_get_version
|
||||||
|
ssh_getpass
|
||||||
|
ssh_gssapi_get_creds
|
||||||
|
ssh_gssapi_set_creds
|
||||||
|
ssh_handle_key_exchange
|
||||||
|
ssh_init
|
||||||
|
ssh_is_blocking
|
||||||
|
ssh_is_connected
|
||||||
|
ssh_is_server_known
|
||||||
|
ssh_key_cmp
|
||||||
|
ssh_key_free
|
||||||
|
ssh_key_is_private
|
||||||
|
ssh_key_is_public
|
||||||
|
ssh_key_new
|
||||||
|
ssh_key_type
|
||||||
|
ssh_key_type_from_name
|
||||||
|
ssh_key_type_to_char
|
||||||
|
ssh_known_hosts_parse_line
|
||||||
|
ssh_knownhosts_entry_free
|
||||||
|
ssh_log
|
||||||
|
ssh_message_auth_interactive_request
|
||||||
|
ssh_message_auth_kbdint_is_response
|
||||||
|
ssh_message_auth_password
|
||||||
|
ssh_message_auth_pubkey
|
||||||
|
ssh_message_auth_publickey
|
||||||
|
ssh_message_auth_publickey_state
|
||||||
|
ssh_message_auth_reply_pk_ok
|
||||||
|
ssh_message_auth_reply_pk_ok_simple
|
||||||
|
ssh_message_auth_reply_success
|
||||||
|
ssh_message_auth_set_methods
|
||||||
|
ssh_message_auth_user
|
||||||
|
ssh_message_channel_request_channel
|
||||||
|
ssh_message_channel_request_command
|
||||||
|
ssh_message_channel_request_env_name
|
||||||
|
ssh_message_channel_request_env_value
|
||||||
|
ssh_message_channel_request_open_destination
|
||||||
|
ssh_message_channel_request_open_destination_port
|
||||||
|
ssh_message_channel_request_open_originator
|
||||||
|
ssh_message_channel_request_open_originator_port
|
||||||
|
ssh_message_channel_request_open_reply_accept
|
||||||
|
ssh_message_channel_request_pty_height
|
||||||
|
ssh_message_channel_request_pty_pxheight
|
||||||
|
ssh_message_channel_request_pty_pxwidth
|
||||||
|
ssh_message_channel_request_pty_term
|
||||||
|
ssh_message_channel_request_pty_width
|
||||||
|
ssh_message_channel_request_reply_success
|
||||||
|
ssh_message_channel_request_subsystem
|
||||||
|
ssh_message_channel_request_x11_auth_cookie
|
||||||
|
ssh_message_channel_request_x11_auth_protocol
|
||||||
|
ssh_message_channel_request_x11_screen_number
|
||||||
|
ssh_message_channel_request_x11_single_connection
|
||||||
|
ssh_message_free
|
||||||
|
ssh_message_get
|
||||||
|
ssh_message_global_request_address
|
||||||
|
ssh_message_global_request_port
|
||||||
|
ssh_message_global_request_reply_success
|
||||||
|
ssh_message_reply_default
|
||||||
|
ssh_message_retrieve
|
||||||
|
ssh_message_service_reply_success
|
||||||
|
ssh_message_service_service
|
||||||
|
ssh_message_subtype
|
||||||
|
ssh_message_type
|
||||||
|
ssh_mkdir
|
||||||
|
ssh_new
|
||||||
|
ssh_options_copy
|
||||||
|
ssh_options_get
|
||||||
|
ssh_options_get_port
|
||||||
|
ssh_options_getopt
|
||||||
|
ssh_options_parse_config
|
||||||
|
ssh_options_set
|
||||||
|
ssh_pcap_file_close
|
||||||
|
ssh_pcap_file_free
|
||||||
|
ssh_pcap_file_new
|
||||||
|
ssh_pcap_file_open
|
||||||
|
ssh_pki_copy_cert_to_privkey
|
||||||
|
ssh_pki_export_privkey_file
|
||||||
|
ssh_pki_export_privkey_to_pubkey
|
||||||
|
ssh_pki_export_pubkey_base64
|
||||||
|
ssh_pki_export_pubkey_file
|
||||||
|
ssh_pki_generate
|
||||||
|
ssh_pki_import_cert_base64
|
||||||
|
ssh_pki_import_cert_file
|
||||||
|
ssh_pki_import_privkey_base64
|
||||||
|
ssh_pki_import_privkey_file
|
||||||
|
ssh_pki_import_pubkey_base64
|
||||||
|
ssh_pki_import_pubkey_file
|
||||||
|
ssh_pki_key_ecdsa_name
|
||||||
|
ssh_print_hash
|
||||||
|
ssh_print_hexa
|
||||||
|
ssh_privatekey_type
|
||||||
|
ssh_publickey_to_file
|
||||||
|
ssh_remove_channel_callbacks
|
||||||
|
ssh_scp_accept_request
|
||||||
|
ssh_scp_close
|
||||||
|
ssh_scp_deny_request
|
||||||
|
ssh_scp_free
|
||||||
|
ssh_scp_init
|
||||||
|
ssh_scp_leave_directory
|
||||||
|
ssh_scp_new
|
||||||
|
ssh_scp_pull_request
|
||||||
|
ssh_scp_push_directory
|
||||||
|
ssh_scp_push_file
|
||||||
|
ssh_scp_push_file64
|
||||||
|
ssh_scp_read
|
||||||
|
ssh_scp_request_get_filename
|
||||||
|
ssh_scp_request_get_permissions
|
||||||
|
ssh_scp_request_get_size
|
||||||
|
ssh_scp_request_get_size64
|
||||||
|
ssh_scp_request_get_warning
|
||||||
|
ssh_scp_write
|
||||||
|
ssh_select
|
||||||
|
ssh_send_debug
|
||||||
|
ssh_send_ignore
|
||||||
|
ssh_send_keepalive
|
||||||
|
ssh_server_init_kex
|
||||||
|
ssh_service_request
|
||||||
|
ssh_session_export_known_hosts_entry
|
||||||
|
ssh_session_has_known_hosts_entry
|
||||||
|
ssh_session_is_known_server
|
||||||
|
ssh_session_update_known_hosts
|
||||||
|
ssh_set_agent_channel
|
||||||
|
ssh_set_agent_socket
|
||||||
|
ssh_set_auth_methods
|
||||||
|
ssh_set_blocking
|
||||||
|
ssh_set_callbacks
|
||||||
|
ssh_set_channel_callbacks
|
||||||
|
ssh_set_counters
|
||||||
|
ssh_set_fd_except
|
||||||
|
ssh_set_fd_toread
|
||||||
|
ssh_set_fd_towrite
|
||||||
|
ssh_set_log_callback
|
||||||
|
ssh_set_log_level
|
||||||
|
ssh_set_log_userdata
|
||||||
|
ssh_set_message_callback
|
||||||
|
ssh_set_pcap_file
|
||||||
|
ssh_set_server_callbacks
|
||||||
|
ssh_silent_disconnect
|
||||||
|
ssh_string_burn
|
||||||
|
ssh_string_copy
|
||||||
|
ssh_string_data
|
||||||
|
ssh_string_fill
|
||||||
|
ssh_string_free
|
||||||
|
ssh_string_free_char
|
||||||
|
ssh_string_from_char
|
||||||
|
ssh_string_get_char
|
||||||
|
ssh_string_len
|
||||||
|
ssh_string_new
|
||||||
|
ssh_string_to_char
|
||||||
|
ssh_threads_get_noop
|
||||||
|
ssh_threads_get_pthread
|
||||||
|
ssh_threads_set_callbacks
|
||||||
|
ssh_try_publickey_from_file
|
||||||
|
ssh_userauth_agent
|
||||||
|
ssh_userauth_agent_pubkey
|
||||||
|
ssh_userauth_autopubkey
|
||||||
|
ssh_userauth_gssapi
|
||||||
|
ssh_userauth_kbdint
|
||||||
|
ssh_userauth_kbdint_getanswer
|
||||||
|
ssh_userauth_kbdint_getinstruction
|
||||||
|
ssh_userauth_kbdint_getname
|
||||||
|
ssh_userauth_kbdint_getnanswers
|
||||||
|
ssh_userauth_kbdint_getnprompts
|
||||||
|
ssh_userauth_kbdint_getprompt
|
||||||
|
ssh_userauth_kbdint_setanswer
|
||||||
|
ssh_userauth_list
|
||||||
|
ssh_userauth_none
|
||||||
|
ssh_userauth_offer_pubkey
|
||||||
|
ssh_userauth_password
|
||||||
|
ssh_userauth_privatekey_file
|
||||||
|
ssh_userauth_pubkey
|
||||||
|
ssh_userauth_publickey
|
||||||
|
ssh_userauth_publickey_auto
|
||||||
|
ssh_userauth_try_publickey
|
||||||
|
ssh_version
|
||||||
|
ssh_write_knownhost
|
||||||
|
string_burn
|
||||||
|
string_copy
|
||||||
|
string_data
|
||||||
|
string_fill
|
||||||
|
string_free
|
||||||
|
string_from_char
|
||||||
|
string_len
|
||||||
|
string_new
|
||||||
|
string_to_char
|
||||||
@@ -106,12 +106,12 @@ set(LIBSSH_SHARED_LIBRARY
|
|||||||
CACHE INTERNAL "libssh shared library"
|
CACHE INTERNAL "libssh shared library"
|
||||||
)
|
)
|
||||||
|
|
||||||
if (WITH_STATIC_LIB)
|
if (BUILD_STATIC_LIB)
|
||||||
set(LIBSSH_STATIC_LIBRARY
|
set(LIBSSH_STATIC_LIBRARY
|
||||||
ssh_static
|
ssh_static
|
||||||
CACHE INTERNAL "libssh static library"
|
CACHE INTERNAL "libssh static library"
|
||||||
)
|
)
|
||||||
endif (WITH_STATIC_LIB)
|
endif (BUILD_STATIC_LIB)
|
||||||
|
|
||||||
set(libssh_SRCS
|
set(libssh_SRCS
|
||||||
agent.c
|
agent.c
|
||||||
@@ -266,15 +266,15 @@ include_directories(
|
|||||||
# Set the path to the default map file
|
# Set the path to the default map file
|
||||||
set(MAP_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.map")
|
set(MAP_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.map")
|
||||||
|
|
||||||
if (WITH_SYMBOL_VERSIONING AND ABIMAP_FOUND)
|
if (WITH_SYMBOL_VERSIONING AND HAVE_LD_VERSION_SCRIPT AND ABIMAP_FOUND)
|
||||||
# Get the list of header files
|
# Get the list of header files
|
||||||
get_file_list("dev_header_list"
|
get_file_list(dev_header_list
|
||||||
DIRECTORIES "${LIBSSH_PUBLIC_INCLUDE_DIRS}/libssh"
|
DIRECTORIES "${LIBSSH_PUBLIC_INCLUDE_DIRS}/libssh"
|
||||||
FILES_PATTERNS "*.h")
|
FILES_PATTERNS "*.h")
|
||||||
|
|
||||||
# Extract the symbols marked as "LIBSSH_API" from the header files
|
# Extract the symbols marked as "LIBSSH_API" from the header files
|
||||||
extract_symbols("${PROJECT_NAME}_dev.symbols"
|
extract_symbols("${PROJECT_NAME}_dev.symbols"
|
||||||
HEADERS_LIST_FILE "dev_header_list"
|
HEADERS_LIST dev_header_list
|
||||||
FILTER_PATTERN "LIBSSH_API")
|
FILTER_PATTERN "LIBSSH_API")
|
||||||
|
|
||||||
if (WITH_ABI_BREAK)
|
if (WITH_ABI_BREAK)
|
||||||
@@ -292,13 +292,14 @@ if (WITH_SYMBOL_VERSIONING AND ABIMAP_FOUND)
|
|||||||
${libssh_SRCS}
|
${libssh_SRCS}
|
||||||
${PROJECT_NAME}_dev.map
|
${PROJECT_NAME}_dev.map
|
||||||
)
|
)
|
||||||
endif (WITH_SYMBOL_VERSIONING AND ABIMAP_FOUND)
|
endif (WITH_SYMBOL_VERSIONING AND HAVE_LD_VERSION_SCRIPT AND ABIMAP_FOUND)
|
||||||
|
|
||||||
add_library(${LIBSSH_SHARED_LIBRARY} SHARED ${libssh_SRCS})
|
add_library(${LIBSSH_SHARED_LIBRARY} SHARED ${libssh_SRCS})
|
||||||
|
target_compile_options(${LIBSSH_SHARED_LIBRARY} PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
target_link_libraries(${LIBSSH_SHARED_LIBRARY} ${LIBSSH_LINK_LIBRARIES})
|
target_link_libraries(${LIBSSH_SHARED_LIBRARY} ${LIBSSH_LINK_LIBRARIES})
|
||||||
|
|
||||||
if (WITH_SYMBOL_VERSIONING)
|
if (WITH_SYMBOL_VERSIONING AND HAVE_LD_VERSION_SCRIPT)
|
||||||
if (ABIMAP_FOUND)
|
if (ABIMAP_FOUND)
|
||||||
# Change path to devel map file
|
# Change path to devel map file
|
||||||
set(MAP_PATH "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_dev.map")
|
set(MAP_PATH "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_dev.map")
|
||||||
@@ -307,7 +308,7 @@ if (WITH_SYMBOL_VERSIONING)
|
|||||||
set_target_properties(${LIBSSH_SHARED_LIBRARY}
|
set_target_properties(${LIBSSH_SHARED_LIBRARY}
|
||||||
PROPERTIES LINK_FLAGS
|
PROPERTIES LINK_FLAGS
|
||||||
"-Wl,--version-script,\"${MAP_PATH}\"")
|
"-Wl,--version-script,\"${MAP_PATH}\"")
|
||||||
endif (WITH_SYMBOL_VERSIONING)
|
endif (WITH_SYMBOL_VERSIONING AND HAVE_LD_VERSION_SCRIPT)
|
||||||
|
|
||||||
set_target_properties(
|
set_target_properties(
|
||||||
${LIBSSH_SHARED_LIBRARY}
|
${LIBSSH_SHARED_LIBRARY}
|
||||||
@@ -340,8 +341,9 @@ install(
|
|||||||
COMPONENT libraries
|
COMPONENT libraries
|
||||||
)
|
)
|
||||||
|
|
||||||
if (WITH_STATIC_LIB)
|
if (BUILD_STATIC_LIB)
|
||||||
add_library(${LIBSSH_STATIC_LIBRARY} STATIC ${libssh_SRCS})
|
add_library(${LIBSSH_STATIC_LIBRARY} STATIC ${libssh_SRCS})
|
||||||
|
target_compile_options(${LIBSSH_STATIC_LIBRARY} PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
set(OUTPUT_SUFFIX static)
|
set(OUTPUT_SUFFIX static)
|
||||||
@@ -370,14 +372,14 @@ if (WITH_STATIC_LIB)
|
|||||||
)
|
)
|
||||||
endif (WIN32)
|
endif (WIN32)
|
||||||
|
|
||||||
install(
|
if (WITH_STATIC_LIB)
|
||||||
TARGETS
|
install(TARGETS
|
||||||
${LIBSSH_STATIC_LIBRARY}
|
${LIBSSH_STATIC_LIBRARY}
|
||||||
DESTINATION
|
DESTINATION
|
||||||
${LIB_INSTALL_DIR}/${OUTPUT_SUFFIX}
|
${LIB_INSTALL_DIR}/${OUTPUT_SUFFIX}
|
||||||
COMPONENT
|
COMPONENT
|
||||||
libraries
|
libraries)
|
||||||
)
|
endif (WITH_STATIC_LIB)
|
||||||
endif (WITH_STATIC_LIB)
|
endif (BUILD_STATIC_LIB)
|
||||||
|
|
||||||
message(STATUS "Threads_FOUND=${Threads_FOUND}")
|
message(STATUS "Threads_FOUND=${Threads_FOUND}")
|
||||||
|
|||||||
@@ -331,7 +331,7 @@ int ssh_agent_get_ident_count(struct ssh_session_struct *session) {
|
|||||||
ssh_buffer request = NULL;
|
ssh_buffer request = NULL;
|
||||||
ssh_buffer reply = NULL;
|
ssh_buffer reply = NULL;
|
||||||
unsigned int type = 0;
|
unsigned int type = 0;
|
||||||
uint8_t buf[4] = {0};
|
uint32_t buf[1] = {0};
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* send message to the agent requesting the list of identities */
|
/* send message to the agent requesting the list of identities */
|
||||||
|
|||||||
144
src/auth.c
@@ -79,7 +79,7 @@ static int ssh_userauth_request_service(ssh_session session) {
|
|||||||
|
|
||||||
static int ssh_auth_response_termination(void *user) {
|
static int ssh_auth_response_termination(void *user) {
|
||||||
ssh_session session = (ssh_session)user;
|
ssh_session session = (ssh_session)user;
|
||||||
switch (session->auth_state) {
|
switch (session->auth.state) {
|
||||||
case SSH_AUTH_STATE_NONE:
|
case SSH_AUTH_STATE_NONE:
|
||||||
case SSH_AUTH_STATE_KBDINT_SENT:
|
case SSH_AUTH_STATE_KBDINT_SENT:
|
||||||
case SSH_AUTH_STATE_GSSAPI_REQUEST_SENT:
|
case SSH_AUTH_STATE_GSSAPI_REQUEST_SENT:
|
||||||
@@ -91,6 +91,36 @@ static int ssh_auth_response_termination(void *user) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *ssh_auth_get_current_method(ssh_session session)
|
||||||
|
{
|
||||||
|
const char *method = "unknown";
|
||||||
|
|
||||||
|
switch (session->auth.current_method) {
|
||||||
|
case SSH_AUTH_METHOD_NONE:
|
||||||
|
method = "none";
|
||||||
|
break;
|
||||||
|
case SSH_AUTH_METHOD_PASSWORD:
|
||||||
|
method = "password";
|
||||||
|
break;
|
||||||
|
case SSH_AUTH_METHOD_PUBLICKEY:
|
||||||
|
method = "publickey";
|
||||||
|
break;
|
||||||
|
case SSH_AUTH_METHOD_HOSTBASED:
|
||||||
|
method = "hostbased";
|
||||||
|
break;
|
||||||
|
case SSH_AUTH_METHOD_INTERACTIVE:
|
||||||
|
method = "keyboard interactive";
|
||||||
|
break;
|
||||||
|
case SSH_AUTH_METHOD_GSSAPI_MIC:
|
||||||
|
method = "gssapi";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return method;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
* @brief Wait for a response of an authentication function.
|
* @brief Wait for a response of an authentication function.
|
||||||
@@ -116,7 +146,7 @@ static int ssh_userauth_get_response(ssh_session session) {
|
|||||||
return SSH_AUTH_AGAIN;
|
return SSH_AUTH_AGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(session->auth_state) {
|
switch(session->auth.state) {
|
||||||
case SSH_AUTH_STATE_ERROR:
|
case SSH_AUTH_STATE_ERROR:
|
||||||
rc = SSH_AUTH_ERROR;
|
rc = SSH_AUTH_ERROR;
|
||||||
break;
|
break;
|
||||||
@@ -181,6 +211,7 @@ SSH_PACKET_CALLBACK(ssh_packet_userauth_banner) {
|
|||||||
* This handles the complete or partial authentication failure.
|
* This handles the complete or partial authentication failure.
|
||||||
*/
|
*/
|
||||||
SSH_PACKET_CALLBACK(ssh_packet_userauth_failure) {
|
SSH_PACKET_CALLBACK(ssh_packet_userauth_failure) {
|
||||||
|
const char *current_method = ssh_auth_get_current_method(session);
|
||||||
char *auth_methods = NULL;
|
char *auth_methods = NULL;
|
||||||
uint8_t partial = 0;
|
uint8_t partial = 0;
|
||||||
int rc;
|
int rc;
|
||||||
@@ -191,43 +222,46 @@ SSH_PACKET_CALLBACK(ssh_packet_userauth_failure) {
|
|||||||
if (rc != SSH_OK) {
|
if (rc != SSH_OK) {
|
||||||
ssh_set_error(session, SSH_FATAL,
|
ssh_set_error(session, SSH_FATAL,
|
||||||
"Invalid SSH_MSG_USERAUTH_FAILURE message");
|
"Invalid SSH_MSG_USERAUTH_FAILURE message");
|
||||||
session->auth_state=SSH_AUTH_STATE_ERROR;
|
session->auth.state = SSH_AUTH_STATE_ERROR;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (partial) {
|
if (partial) {
|
||||||
session->auth_state=SSH_AUTH_STATE_PARTIAL;
|
session->auth.state = SSH_AUTH_STATE_PARTIAL;
|
||||||
SSH_LOG(SSH_LOG_INFO,
|
SSH_LOG(SSH_LOG_INFO,
|
||||||
"Partial success. Authentication that can continue: %s",
|
"Partial success for '%s'. Authentication that can continue: %s",
|
||||||
|
current_method,
|
||||||
auth_methods);
|
auth_methods);
|
||||||
} else {
|
} else {
|
||||||
session->auth_state=SSH_AUTH_STATE_FAILED;
|
session->auth.state = SSH_AUTH_STATE_FAILED;
|
||||||
SSH_LOG(SSH_LOG_INFO,
|
|
||||||
"Access denied. Authentication that can continue: %s",
|
|
||||||
auth_methods);
|
|
||||||
ssh_set_error(session, SSH_REQUEST_DENIED,
|
ssh_set_error(session, SSH_REQUEST_DENIED,
|
||||||
"Access denied. Authentication that can continue: %s",
|
"Access denied for '%s'. Authentication that can continue: %s",
|
||||||
auth_methods);
|
current_method,
|
||||||
|
auth_methods);
|
||||||
|
SSH_LOG(SSH_LOG_INFO,
|
||||||
|
"%s",
|
||||||
|
ssh_get_error(session));
|
||||||
|
|
||||||
}
|
}
|
||||||
session->auth_methods = 0;
|
session->auth.supported_methods = 0;
|
||||||
if (strstr(auth_methods, "password") != NULL) {
|
if (strstr(auth_methods, "password") != NULL) {
|
||||||
session->auth_methods |= SSH_AUTH_METHOD_PASSWORD;
|
session->auth.supported_methods |= SSH_AUTH_METHOD_PASSWORD;
|
||||||
}
|
}
|
||||||
if (strstr(auth_methods, "keyboard-interactive") != NULL) {
|
if (strstr(auth_methods, "keyboard-interactive") != NULL) {
|
||||||
session->auth_methods |= SSH_AUTH_METHOD_INTERACTIVE;
|
session->auth.supported_methods |= SSH_AUTH_METHOD_INTERACTIVE;
|
||||||
}
|
}
|
||||||
if (strstr(auth_methods, "publickey") != NULL) {
|
if (strstr(auth_methods, "publickey") != NULL) {
|
||||||
session->auth_methods |= SSH_AUTH_METHOD_PUBLICKEY;
|
session->auth.supported_methods |= SSH_AUTH_METHOD_PUBLICKEY;
|
||||||
}
|
}
|
||||||
if (strstr(auth_methods, "hostbased") != NULL) {
|
if (strstr(auth_methods, "hostbased") != NULL) {
|
||||||
session->auth_methods |= SSH_AUTH_METHOD_HOSTBASED;
|
session->auth.supported_methods |= SSH_AUTH_METHOD_HOSTBASED;
|
||||||
}
|
}
|
||||||
if (strstr(auth_methods, "gssapi-with-mic") != NULL) {
|
if (strstr(auth_methods, "gssapi-with-mic") != NULL) {
|
||||||
session->auth_methods |= SSH_AUTH_METHOD_GSSAPI_MIC;
|
session->auth.supported_methods |= SSH_AUTH_METHOD_GSSAPI_MIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
session->auth.current_method = SSH_AUTH_METHOD_UNKNOWN;
|
||||||
SAFE_FREE(auth_methods);
|
SAFE_FREE(auth_methods);
|
||||||
|
|
||||||
return SSH_PACKET_USED;
|
return SSH_PACKET_USED;
|
||||||
@@ -248,7 +282,7 @@ SSH_PACKET_CALLBACK(ssh_packet_userauth_success) {
|
|||||||
SSH_LOG(SSH_LOG_DEBUG, "Authentication successful");
|
SSH_LOG(SSH_LOG_DEBUG, "Authentication successful");
|
||||||
SSH_LOG(SSH_LOG_TRACE, "Received SSH_USERAUTH_SUCCESS");
|
SSH_LOG(SSH_LOG_TRACE, "Received SSH_USERAUTH_SUCCESS");
|
||||||
|
|
||||||
session->auth_state = SSH_AUTH_STATE_SUCCESS;
|
session->auth.state = SSH_AUTH_STATE_SUCCESS;
|
||||||
session->session_state = SSH_SESSION_STATE_AUTHENTICATED;
|
session->session_state = SSH_SESSION_STATE_AUTHENTICATED;
|
||||||
session->flags |= SSH_SESSION_FLAG_AUTHENTICATED;
|
session->flags |= SSH_SESSION_FLAG_AUTHENTICATED;
|
||||||
|
|
||||||
@@ -261,6 +295,9 @@ SSH_PACKET_CALLBACK(ssh_packet_userauth_success) {
|
|||||||
session->current_crypto->do_compress_in = 1;
|
session->current_crypto->do_compress_in = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Reset errors by previous authentication methods. */
|
||||||
|
ssh_reset_error(session);
|
||||||
|
session->auth.current_method = SSH_AUTH_METHOD_UNKNOWN;
|
||||||
return SSH_PACKET_USED;
|
return SSH_PACKET_USED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,17 +314,17 @@ SSH_PACKET_CALLBACK(ssh_packet_userauth_pk_ok) {
|
|||||||
|
|
||||||
SSH_LOG(SSH_LOG_TRACE, "Received SSH_USERAUTH_PK_OK/INFO_REQUEST/GSSAPI_RESPONSE");
|
SSH_LOG(SSH_LOG_TRACE, "Received SSH_USERAUTH_PK_OK/INFO_REQUEST/GSSAPI_RESPONSE");
|
||||||
|
|
||||||
if (session->auth_state==SSH_AUTH_STATE_KBDINT_SENT) {
|
if (session->auth.state == SSH_AUTH_STATE_KBDINT_SENT) {
|
||||||
/* Assuming we are in keyboard-interactive context */
|
/* Assuming we are in keyboard-interactive context */
|
||||||
SSH_LOG(SSH_LOG_TRACE,
|
SSH_LOG(SSH_LOG_TRACE,
|
||||||
"keyboard-interactive context, assuming SSH_USERAUTH_INFO_REQUEST");
|
"keyboard-interactive context, assuming SSH_USERAUTH_INFO_REQUEST");
|
||||||
rc = ssh_packet_userauth_info_request(session,type,packet,user);
|
rc = ssh_packet_userauth_info_request(session,type,packet,user);
|
||||||
#ifdef WITH_GSSAPI
|
#ifdef WITH_GSSAPI
|
||||||
} else if (session->auth_state == SSH_AUTH_STATE_GSSAPI_REQUEST_SENT) {
|
} else if (session->auth.state == SSH_AUTH_STATE_GSSAPI_REQUEST_SENT) {
|
||||||
rc = ssh_packet_userauth_gssapi_response(session, type, packet, user);
|
rc = ssh_packet_userauth_gssapi_response(session, type, packet, user);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
session->auth_state = SSH_AUTH_STATE_PK_OK;
|
session->auth.state = SSH_AUTH_STATE_PK_OK;
|
||||||
SSH_LOG(SSH_LOG_TRACE, "Assuming SSH_USERAUTH_PK_OK");
|
SSH_LOG(SSH_LOG_TRACE, "Assuming SSH_USERAUTH_PK_OK");
|
||||||
rc = SSH_PACKET_USED;
|
rc = SSH_PACKET_USED;
|
||||||
}
|
}
|
||||||
@@ -323,7 +360,7 @@ int ssh_userauth_list(ssh_session session, const char *username)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return session->auth_methods;
|
return session->auth.supported_methods;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -378,7 +415,8 @@ int ssh_userauth_none(ssh_session session, const char *username) {
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
session->auth_state = SSH_AUTH_STATE_NONE;
|
session->auth.current_method = SSH_AUTH_METHOD_NONE;
|
||||||
|
session->auth.state = SSH_AUTH_STATE_NONE;
|
||||||
session->pending_call_state = SSH_PENDING_CALL_AUTH_NONE;
|
session->pending_call_state = SSH_PENDING_CALL_AUTH_NONE;
|
||||||
rc = ssh_packet_send(session);
|
rc = ssh_packet_send(session);
|
||||||
if (rc == SSH_ERROR) {
|
if (rc == SSH_ERROR) {
|
||||||
@@ -485,7 +523,8 @@ int ssh_userauth_try_publickey(ssh_session session,
|
|||||||
|
|
||||||
ssh_string_free(pubkey_s);
|
ssh_string_free(pubkey_s);
|
||||||
|
|
||||||
session->auth_state = SSH_AUTH_STATE_NONE;
|
session->auth.current_method = SSH_AUTH_METHOD_PUBLICKEY;
|
||||||
|
session->auth.state = SSH_AUTH_STATE_NONE;
|
||||||
session->pending_call_state = SSH_PENDING_CALL_AUTH_OFFER_PUBKEY;
|
session->pending_call_state = SSH_PENDING_CALL_AUTH_OFFER_PUBKEY;
|
||||||
rc = ssh_packet_send(session);
|
rc = ssh_packet_send(session);
|
||||||
if (rc == SSH_ERROR) {
|
if (rc == SSH_ERROR) {
|
||||||
@@ -605,7 +644,8 @@ int ssh_userauth_publickey(ssh_session session,
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
session->auth_state = SSH_AUTH_STATE_NONE;
|
session->auth.current_method = SSH_AUTH_METHOD_PUBLICKEY;
|
||||||
|
session->auth.state = SSH_AUTH_STATE_NONE;
|
||||||
session->pending_call_state = SSH_PENDING_CALL_AUTH_PUBKEY;
|
session->pending_call_state = SSH_PENDING_CALL_AUTH_PUBKEY;
|
||||||
rc = ssh_packet_send(session);
|
rc = ssh_packet_send(session);
|
||||||
if (rc == SSH_ERROR) {
|
if (rc == SSH_ERROR) {
|
||||||
@@ -690,7 +730,8 @@ static int ssh_userauth_agent_publickey(ssh_session session,
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
session->auth_state = SSH_AUTH_STATE_NONE;
|
session->auth.current_method = SSH_AUTH_METHOD_PUBLICKEY;
|
||||||
|
session->auth.state = SSH_AUTH_STATE_NONE;
|
||||||
session->pending_call_state = SSH_PENDING_CALL_AUTH_AGENT;
|
session->pending_call_state = SSH_PENDING_CALL_AUTH_AGENT;
|
||||||
rc = ssh_packet_send(session);
|
rc = ssh_packet_send(session);
|
||||||
if (rc == SSH_ERROR) {
|
if (rc == SSH_ERROR) {
|
||||||
@@ -905,23 +946,22 @@ int ssh_userauth_publickey_auto(ssh_session session,
|
|||||||
return SSH_AUTH_ERROR;
|
return SSH_AUTH_ERROR;
|
||||||
}
|
}
|
||||||
if (! (session->opts.flags & SSH_OPT_FLAG_PUBKEY_AUTH)) {
|
if (! (session->opts.flags & SSH_OPT_FLAG_PUBKEY_AUTH)) {
|
||||||
session->auth_methods &= ~SSH_AUTH_METHOD_PUBLICKEY;
|
session->auth.supported_methods &= ~SSH_AUTH_METHOD_PUBLICKEY;
|
||||||
return SSH_AUTH_DENIED;
|
return SSH_AUTH_DENIED;
|
||||||
}
|
}
|
||||||
if (session->common.callbacks) {
|
if (session->common.callbacks) {
|
||||||
auth_fn = session->common.callbacks->auth_function;
|
auth_fn = session->common.callbacks->auth_function;
|
||||||
auth_data = session->common.callbacks->userdata;
|
auth_data = session->common.callbacks->userdata;
|
||||||
}
|
}
|
||||||
if (!session->auth_auto_state) {
|
if (!session->auth.auto_state) {
|
||||||
session->auth_auto_state =
|
session->auth.auto_state =
|
||||||
malloc(sizeof(struct ssh_auth_auto_state_struct));
|
calloc(1, sizeof(struct ssh_auth_auto_state_struct));
|
||||||
if (!session->auth_auto_state) {
|
if (!session->auth.auto_state) {
|
||||||
ssh_set_error_oom(session);
|
ssh_set_error_oom(session);
|
||||||
return SSH_AUTH_ERROR;
|
return SSH_AUTH_ERROR;
|
||||||
}
|
}
|
||||||
ZERO_STRUCTP(session->auth_auto_state);
|
|
||||||
}
|
}
|
||||||
state = session->auth_auto_state;
|
state = session->auth.auto_state;
|
||||||
if (state->state == SSH_AUTH_AUTO_STATE_NONE) {
|
if (state->state == SSH_AUTH_AUTO_STATE_NONE) {
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
/* Try authentication with ssh-agent first */
|
/* Try authentication with ssh-agent first */
|
||||||
@@ -954,7 +994,7 @@ int ssh_userauth_publickey_auto(ssh_session session,
|
|||||||
SSH_FATAL,
|
SSH_FATAL,
|
||||||
"Failed to import public key: %s",
|
"Failed to import public key: %s",
|
||||||
pubkey_file);
|
pubkey_file);
|
||||||
SAFE_FREE(session->auth_auto_state);
|
SAFE_FREE(session->auth.auto_state);
|
||||||
return SSH_AUTH_ERROR;
|
return SSH_AUTH_ERROR;
|
||||||
} else if (rc == SSH_EOF) {
|
} else if (rc == SSH_EOF) {
|
||||||
/* Read the private key and save the public key to file */
|
/* Read the private key and save the public key to file */
|
||||||
@@ -982,7 +1022,7 @@ int ssh_userauth_publickey_auto(ssh_session session,
|
|||||||
rc = ssh_pki_export_privkey_to_pubkey(state->privkey, &state->pubkey);
|
rc = ssh_pki_export_privkey_to_pubkey(state->privkey, &state->pubkey);
|
||||||
if (rc == SSH_ERROR) {
|
if (rc == SSH_ERROR) {
|
||||||
ssh_key_free(state->privkey);
|
ssh_key_free(state->privkey);
|
||||||
SAFE_FREE(session->auth_auto_state);
|
SAFE_FREE(session->auth.auto_state);
|
||||||
return SSH_AUTH_ERROR;
|
return SSH_AUTH_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1003,7 +1043,7 @@ int ssh_userauth_publickey_auto(ssh_session session,
|
|||||||
privkey_file);
|
privkey_file);
|
||||||
ssh_key_free(state->privkey);
|
ssh_key_free(state->privkey);
|
||||||
ssh_key_free(state->pubkey);
|
ssh_key_free(state->pubkey);
|
||||||
SAFE_FREE(session->auth_auto_state);
|
SAFE_FREE(session->auth.auto_state);
|
||||||
return rc;
|
return rc;
|
||||||
} else if (rc == SSH_AUTH_AGAIN) {
|
} else if (rc == SSH_AUTH_AGAIN) {
|
||||||
return rc;
|
return rc;
|
||||||
@@ -1056,7 +1096,7 @@ int ssh_userauth_publickey_auto(ssh_session session,
|
|||||||
if (rc != SSH_AUTH_AGAIN && rc != SSH_AUTH_DENIED) {
|
if (rc != SSH_AUTH_AGAIN && rc != SSH_AUTH_DENIED) {
|
||||||
ssh_key_free(state->privkey);
|
ssh_key_free(state->privkey);
|
||||||
ssh_key_free(state->pubkey);
|
ssh_key_free(state->pubkey);
|
||||||
SAFE_FREE(session->auth_auto_state);
|
SAFE_FREE(session->auth.auto_state);
|
||||||
if (rc == SSH_AUTH_SUCCESS) {
|
if (rc == SSH_AUTH_SUCCESS) {
|
||||||
SSH_LOG(SSH_LOG_INFO,
|
SSH_LOG(SSH_LOG_INFO,
|
||||||
"Successfully authenticated using %s",
|
"Successfully authenticated using %s",
|
||||||
@@ -1077,7 +1117,7 @@ int ssh_userauth_publickey_auto(ssh_session session,
|
|||||||
}
|
}
|
||||||
SSH_LOG(SSH_LOG_INFO,
|
SSH_LOG(SSH_LOG_INFO,
|
||||||
"Tried every public key, none matched");
|
"Tried every public key, none matched");
|
||||||
SAFE_FREE(session->auth_auto_state);
|
SAFE_FREE(session->auth.auto_state);
|
||||||
return SSH_AUTH_DENIED;
|
return SSH_AUTH_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1121,7 +1161,7 @@ int ssh_userauth_password(ssh_session session,
|
|||||||
switch(session->pending_call_state) {
|
switch(session->pending_call_state) {
|
||||||
case SSH_PENDING_CALL_NONE:
|
case SSH_PENDING_CALL_NONE:
|
||||||
break;
|
break;
|
||||||
case SSH_PENDING_CALL_AUTH_OFFER_PUBKEY:
|
case SSH_PENDING_CALL_AUTH_PASSWORD:
|
||||||
goto pending;
|
goto pending;
|
||||||
default:
|
default:
|
||||||
ssh_set_error(session,
|
ssh_set_error(session,
|
||||||
@@ -1151,8 +1191,9 @@ int ssh_userauth_password(ssh_session session,
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
session->auth_state = SSH_AUTH_STATE_NONE;
|
session->auth.current_method = SSH_AUTH_METHOD_PASSWORD;
|
||||||
session->pending_call_state = SSH_PENDING_CALL_AUTH_OFFER_PUBKEY;
|
session->auth.state = SSH_AUTH_STATE_NONE;
|
||||||
|
session->pending_call_state = SSH_PENDING_CALL_AUTH_PASSWORD;
|
||||||
rc = ssh_packet_send(session);
|
rc = ssh_packet_send(session);
|
||||||
if (rc == SSH_ERROR) {
|
if (rc == SSH_ERROR) {
|
||||||
return SSH_AUTH_ERROR;
|
return SSH_AUTH_ERROR;
|
||||||
@@ -1228,7 +1269,9 @@ void ssh_kbdint_free(ssh_kbdint kbd) {
|
|||||||
n = kbd->nprompts;
|
n = kbd->nprompts;
|
||||||
if (kbd->prompts) {
|
if (kbd->prompts) {
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
explicit_bzero(kbd->prompts[i], strlen(kbd->prompts[i]));
|
if (kbd->prompts[i] != NULL) {
|
||||||
|
explicit_bzero(kbd->prompts[i], strlen(kbd->prompts[i]));
|
||||||
|
}
|
||||||
SAFE_FREE(kbd->prompts[i]);
|
SAFE_FREE(kbd->prompts[i]);
|
||||||
}
|
}
|
||||||
SAFE_FREE(kbd->prompts);
|
SAFE_FREE(kbd->prompts);
|
||||||
@@ -1237,7 +1280,9 @@ void ssh_kbdint_free(ssh_kbdint kbd) {
|
|||||||
n = kbd->nanswers;
|
n = kbd->nanswers;
|
||||||
if (kbd->answers) {
|
if (kbd->answers) {
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
explicit_bzero(kbd->answers[i], strlen(kbd->answers[i]));
|
if (kbd->answers[i] != NULL) {
|
||||||
|
explicit_bzero(kbd->answers[i], strlen(kbd->answers[i]));
|
||||||
|
}
|
||||||
SAFE_FREE(kbd->answers[i]);
|
SAFE_FREE(kbd->answers[i]);
|
||||||
}
|
}
|
||||||
SAFE_FREE(kbd->answers);
|
SAFE_FREE(kbd->answers);
|
||||||
@@ -1319,7 +1364,7 @@ static int ssh_userauth_kbdint_init(ssh_session session,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
session->auth_state = SSH_AUTH_STATE_KBDINT_SENT;
|
session->auth.state = SSH_AUTH_STATE_KBDINT_SENT;
|
||||||
session->pending_call_state = SSH_PENDING_CALL_AUTH_KBDINT_INIT;
|
session->pending_call_state = SSH_PENDING_CALL_AUTH_KBDINT_INIT;
|
||||||
|
|
||||||
SSH_LOG(SSH_LOG_DEBUG,
|
SSH_LOG(SSH_LOG_DEBUG,
|
||||||
@@ -1378,7 +1423,8 @@ static int ssh_userauth_kbdint_send(ssh_session session)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
session->auth_state = SSH_AUTH_STATE_KBDINT_SENT;
|
session->auth.current_method = SSH_AUTH_METHOD_INTERACTIVE;
|
||||||
|
session->auth.state = SSH_AUTH_STATE_KBDINT_SENT;
|
||||||
session->pending_call_state = SSH_PENDING_CALL_AUTH_KBDINT_SEND;
|
session->pending_call_state = SSH_PENDING_CALL_AUTH_KBDINT_SEND;
|
||||||
ssh_kbdint_free(session->kbdint);
|
ssh_kbdint_free(session->kbdint);
|
||||||
session->kbdint = NULL;
|
session->kbdint = NULL;
|
||||||
@@ -1491,7 +1537,7 @@ SSH_PACKET_CALLBACK(ssh_packet_userauth_info_request) {
|
|||||||
return SSH_PACKET_USED;
|
return SSH_PACKET_USED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
session->auth_state=SSH_AUTH_STATE_INFO;
|
session->auth.state=SSH_AUTH_STATE_INFO;
|
||||||
|
|
||||||
return SSH_PACKET_USED;
|
return SSH_PACKET_USED;
|
||||||
}
|
}
|
||||||
@@ -1791,12 +1837,14 @@ int ssh_userauth_gssapi(ssh_session session) {
|
|||||||
return SSH_AUTH_ERROR;
|
return SSH_AUTH_ERROR;
|
||||||
}
|
}
|
||||||
SSH_LOG(SSH_LOG_PROTOCOL, "Authenticating with gssapi-with-mic");
|
SSH_LOG(SSH_LOG_PROTOCOL, "Authenticating with gssapi-with-mic");
|
||||||
session->auth_state = SSH_AUTH_STATE_NONE;
|
|
||||||
|
session->auth.current_method = SSH_AUTH_METHOD_GSSAPI_MIC;
|
||||||
|
session->auth.state = SSH_AUTH_STATE_NONE;
|
||||||
session->pending_call_state = SSH_PENDING_CALL_AUTH_GSSAPI_MIC;
|
session->pending_call_state = SSH_PENDING_CALL_AUTH_GSSAPI_MIC;
|
||||||
rc = ssh_gssapi_auth_mic(session);
|
rc = ssh_gssapi_auth_mic(session);
|
||||||
|
|
||||||
if (rc == SSH_AUTH_ERROR || rc == SSH_AUTH_DENIED) {
|
if (rc == SSH_AUTH_ERROR || rc == SSH_AUTH_DENIED) {
|
||||||
session->auth_state = SSH_AUTH_STATE_NONE;
|
session->auth.state = SSH_AUTH_STATE_NONE;
|
||||||
session->pending_call_state = SSH_PENDING_CALL_NONE;
|
session->pending_call_state = SSH_PENDING_CALL_NONE;
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2661,7 +2661,7 @@ int ssh_channel_read_timeout(ssh_channel channel,
|
|||||||
void *dest,
|
void *dest,
|
||||||
uint32_t count,
|
uint32_t count,
|
||||||
int is_stderr,
|
int is_stderr,
|
||||||
int timeout)
|
int timeout_ms)
|
||||||
{
|
{
|
||||||
ssh_session session;
|
ssh_session session;
|
||||||
ssh_buffer stdbuf;
|
ssh_buffer stdbuf;
|
||||||
@@ -2711,12 +2711,12 @@ int ssh_channel_read_timeout(ssh_channel channel,
|
|||||||
ctx.buffer = stdbuf;
|
ctx.buffer = stdbuf;
|
||||||
ctx.count = 1;
|
ctx.count = 1;
|
||||||
|
|
||||||
if (timeout < 0) {
|
if (timeout_ms < 0) {
|
||||||
timeout = SSH_TIMEOUT_DEFAULT;
|
timeout_ms = SSH_TIMEOUT_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = ssh_handle_packets_termination(session,
|
rc = ssh_handle_packets_termination(session,
|
||||||
timeout,
|
timeout_ms,
|
||||||
ssh_channel_read_termination,
|
ssh_channel_read_termination,
|
||||||
&ctx);
|
&ctx);
|
||||||
if (rc == SSH_ERROR){
|
if (rc == SSH_ERROR){
|
||||||
|
|||||||
10
src/client.c
@@ -295,7 +295,7 @@ static int dh_handshake(ssh_session session) {
|
|||||||
static int ssh_service_request_termination(void *s){
|
static int ssh_service_request_termination(void *s){
|
||||||
ssh_session session = (ssh_session)s;
|
ssh_session session = (ssh_session)s;
|
||||||
if(session->session_state == SSH_SESSION_STATE_ERROR ||
|
if(session->session_state == SSH_SESSION_STATE_ERROR ||
|
||||||
session->auth_service_state != SSH_AUTH_SERVICE_SENT)
|
session->auth.service_state != SSH_AUTH_SERVICE_SENT)
|
||||||
return 1;
|
return 1;
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
@@ -319,7 +319,7 @@ static int ssh_service_request_termination(void *s){
|
|||||||
int ssh_service_request(ssh_session session, const char *service) {
|
int ssh_service_request(ssh_session session, const char *service) {
|
||||||
int rc=SSH_ERROR;
|
int rc=SSH_ERROR;
|
||||||
|
|
||||||
if(session->auth_service_state != SSH_AUTH_SERVICE_NONE)
|
if(session->auth.service_state != SSH_AUTH_SERVICE_NONE)
|
||||||
goto pending;
|
goto pending;
|
||||||
|
|
||||||
rc = ssh_buffer_pack(session->out_buffer,
|
rc = ssh_buffer_pack(session->out_buffer,
|
||||||
@@ -330,7 +330,7 @@ int ssh_service_request(ssh_session session, const char *service) {
|
|||||||
ssh_set_error_oom(session);
|
ssh_set_error_oom(session);
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
session->auth_service_state=SSH_AUTH_SERVICE_SENT;
|
session->auth.service_state = SSH_AUTH_SERVICE_SENT;
|
||||||
if (ssh_packet_send(session) == SSH_ERROR) {
|
if (ssh_packet_send(session) == SSH_ERROR) {
|
||||||
ssh_set_error(session, SSH_FATAL,
|
ssh_set_error(session, SSH_FATAL,
|
||||||
"Sending SSH2_MSG_SERVICE_REQUEST failed.");
|
"Sending SSH2_MSG_SERVICE_REQUEST failed.");
|
||||||
@@ -345,7 +345,7 @@ pending:
|
|||||||
if (rc == SSH_ERROR) {
|
if (rc == SSH_ERROR) {
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
switch(session->auth_service_state){
|
switch(session->auth.service_state) {
|
||||||
case SSH_AUTH_SERVICE_DENIED:
|
case SSH_AUTH_SERVICE_DENIED:
|
||||||
ssh_set_error(session,SSH_FATAL,"ssh_auth_service request denied");
|
ssh_set_error(session,SSH_FATAL,"ssh_auth_service request denied");
|
||||||
break;
|
break;
|
||||||
@@ -700,7 +700,7 @@ error:
|
|||||||
if (session->out_hashbuf) {
|
if (session->out_hashbuf) {
|
||||||
ssh_buffer_reinit(session->out_hashbuf);
|
ssh_buffer_reinit(session->out_hashbuf);
|
||||||
}
|
}
|
||||||
session->auth_methods = 0;
|
session->auth.supported_methods = 0;
|
||||||
SAFE_FREE(session->serverbanner);
|
SAFE_FREE(session->serverbanner);
|
||||||
SAFE_FREE(session->clientbanner);
|
SAFE_FREE(session->clientbanner);
|
||||||
|
|
||||||
|
|||||||
@@ -383,7 +383,8 @@ static int ssh_config_parse_line(ssh_session session, const char *line,
|
|||||||
}
|
}
|
||||||
|
|
||||||
opcode = ssh_config_get_opcode(keyword);
|
opcode = ssh_config_get_opcode(keyword);
|
||||||
if (*parsing == 1 && opcode != SOC_HOST && opcode != SOC_UNSUPPORTED && opcode != SOC_INCLUDE) {
|
if (*parsing == 1 && opcode != SOC_HOST && opcode != SOC_INCLUDE &&
|
||||||
|
opcode > SOC_UNSUPPORTED) { /* Ignore all unknown types here */
|
||||||
if (seen[opcode] != 0) {
|
if (seen[opcode] != 0) {
|
||||||
SAFE_FREE(x);
|
SAFE_FREE(x);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
103
src/dh.c
@@ -1142,6 +1142,29 @@ int ssh_get_publickey_hash(const ssh_key key,
|
|||||||
*hlen = SHA_DIGEST_LEN;
|
*hlen = SHA_DIGEST_LEN;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SSH_PUBLICKEY_HASH_SHA256:
|
||||||
|
{
|
||||||
|
SHA256CTX ctx;
|
||||||
|
|
||||||
|
h = malloc(SHA256_DIGEST_LEN);
|
||||||
|
if (h == NULL) {
|
||||||
|
rc = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx = sha256_init();
|
||||||
|
if (ctx == NULL) {
|
||||||
|
free(h);
|
||||||
|
rc = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
sha256_update(ctx, ssh_string_data(blob), ssh_string_len(blob));
|
||||||
|
sha256_final(h, ctx);
|
||||||
|
|
||||||
|
*hlen = SHA256_DIGEST_LEN;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case SSH_PUBLICKEY_HASH_MD5:
|
case SSH_PUBLICKEY_HASH_MD5:
|
||||||
{
|
{
|
||||||
MD5CTX ctx;
|
MD5CTX ctx;
|
||||||
@@ -1177,6 +1200,38 @@ out:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*
|
||||||
|
* @brief Convert a buffer into an unpadded base64 string.
|
||||||
|
* The caller has to free the memory.
|
||||||
|
*
|
||||||
|
* @param hash What should be converted to a base64 string.
|
||||||
|
*
|
||||||
|
* @param len Length of the buffer to convert.
|
||||||
|
*
|
||||||
|
* @return The base64 string or NULL on error.
|
||||||
|
*
|
||||||
|
* @see ssh_string_free_char()
|
||||||
|
*/
|
||||||
|
static char *ssh_get_b64_unpadded(const unsigned char *hash, size_t len)
|
||||||
|
{
|
||||||
|
char *b64_padded = NULL;
|
||||||
|
char *b64_unpadded = NULL;
|
||||||
|
size_t k;
|
||||||
|
|
||||||
|
b64_padded = (char *)bin_to_base64(hash, (int)len);
|
||||||
|
if (b64_padded == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
for (k = strlen(b64_padded); k != 0 && b64_padded[k-1] == '='; k--);
|
||||||
|
|
||||||
|
b64_unpadded = strndup(b64_padded, k);
|
||||||
|
SAFE_FREE(b64_padded);
|
||||||
|
|
||||||
|
return b64_unpadded;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Convert a buffer into a colon separated hex string.
|
* @brief Convert a buffer into a colon separated hex string.
|
||||||
* The caller has to free the memory.
|
* The caller has to free the memory.
|
||||||
@@ -1214,6 +1269,54 @@ char *ssh_get_hexa(const unsigned char *what, size_t len) {
|
|||||||
return hexa;
|
return hexa;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Print a hash as a human-readable hex- or base64-string.
|
||||||
|
*
|
||||||
|
* This function prints hex strings if the given hash is a md5 sum.
|
||||||
|
* But prints unpadded base64 strings for sha sums.
|
||||||
|
* Either way, the output is prepended by the hash-type.
|
||||||
|
*
|
||||||
|
* @param type Which sort of hash is given.
|
||||||
|
*
|
||||||
|
* @param hash What should be converted to a base64 string.
|
||||||
|
*
|
||||||
|
* @param len Length of the buffer to convert.
|
||||||
|
*/
|
||||||
|
void ssh_print_hash(enum ssh_publickey_hash_type type,
|
||||||
|
unsigned char *hash,
|
||||||
|
size_t len) {
|
||||||
|
const char *prefix = "UNKNOWN";
|
||||||
|
char *fingerprint = NULL;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case SSH_PUBLICKEY_HASH_SHA1:
|
||||||
|
case SSH_PUBLICKEY_HASH_SHA256:
|
||||||
|
fingerprint = ssh_get_b64_unpadded(hash, len);
|
||||||
|
break;
|
||||||
|
case SSH_PUBLICKEY_HASH_MD5:
|
||||||
|
fingerprint = ssh_get_hexa(hash, len);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (fingerprint == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case SSH_PUBLICKEY_HASH_MD5:
|
||||||
|
prefix = "MD5";
|
||||||
|
break;
|
||||||
|
case SSH_PUBLICKEY_HASH_SHA1:
|
||||||
|
prefix = "SHA1";
|
||||||
|
break;
|
||||||
|
case SSH_PUBLICKEY_HASH_SHA256:
|
||||||
|
prefix = "SHA256";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fprintf(stderr, "%s:%s\n", prefix, fingerprint);
|
||||||
|
|
||||||
|
SAFE_FREE(fingerprint);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Print a buffer as colon separated hex string.
|
* @brief Print a buffer as colon separated hex string.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -79,9 +79,11 @@ int ssh_client_ecdh_init(ssh_session session)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = mbedtls_ecp_gen_keypair(&grp, &session->next_crypto->ecdh_privkey->d,
|
rc = mbedtls_ecp_gen_keypair(&grp,
|
||||||
&session->next_crypto->ecdh_privkey->Q, mbedtls_ctr_drbg_random,
|
&session->next_crypto->ecdh_privkey->d,
|
||||||
&ssh_mbedtls_ctr_drbg);
|
&session->next_crypto->ecdh_privkey->Q,
|
||||||
|
mbedtls_ctr_drbg_random,
|
||||||
|
ssh_get_mbedtls_ctr_drbg_context());
|
||||||
|
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
rc = SSH_ERROR;
|
rc = SSH_ERROR;
|
||||||
@@ -157,9 +159,12 @@ int ecdh_build_k(ssh_session session)
|
|||||||
|
|
||||||
mbedtls_mpi_init(session->next_crypto->k);
|
mbedtls_mpi_init(session->next_crypto->k);
|
||||||
|
|
||||||
rc = mbedtls_ecdh_compute_shared(&grp, session->next_crypto->k, &pubkey,
|
rc = mbedtls_ecdh_compute_shared(&grp,
|
||||||
&session->next_crypto->ecdh_privkey->d, mbedtls_ctr_drbg_random,
|
session->next_crypto->k,
|
||||||
&ssh_mbedtls_ctr_drbg);
|
&pubkey,
|
||||||
|
&session->next_crypto->ecdh_privkey->d,
|
||||||
|
mbedtls_ctr_drbg_random,
|
||||||
|
ssh_get_mbedtls_ctr_drbg_context());
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
rc = SSH_ERROR;
|
rc = SSH_ERROR;
|
||||||
goto out;
|
goto out;
|
||||||
@@ -213,9 +218,11 @@ int ssh_server_ecdh_init(ssh_session session, ssh_buffer packet)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = mbedtls_ecp_gen_keypair(&grp, &session->next_crypto->ecdh_privkey->d,
|
rc = mbedtls_ecp_gen_keypair(&grp,
|
||||||
&session->next_crypto->ecdh_privkey->Q, mbedtls_ctr_drbg_random,
|
&session->next_crypto->ecdh_privkey->d,
|
||||||
&ssh_mbedtls_ctr_drbg);
|
&session->next_crypto->ecdh_privkey->Q,
|
||||||
|
mbedtls_ctr_drbg_random,
|
||||||
|
ssh_get_mbedtls_ctr_drbg_context());
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
rc = SSH_ERROR;
|
rc = SSH_ERROR;
|
||||||
goto out;
|
goto out;
|
||||||
|
|||||||
15
src/error.c
@@ -103,6 +103,21 @@ void _ssh_set_error_invalid(void *error, const char *function)
|
|||||||
"Invalid argument in %s", function);
|
"Invalid argument in %s", function);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*
|
||||||
|
* @brief Reset the error code and message
|
||||||
|
*
|
||||||
|
* @param error The place to reset the error.
|
||||||
|
*/
|
||||||
|
void ssh_reset_error(void *error)
|
||||||
|
{
|
||||||
|
struct ssh_common_struct *err = error;
|
||||||
|
|
||||||
|
ZERO_STRUCT(err->error.error_buffer);
|
||||||
|
err->error.error_code = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Retrieve the error text message from the last error.
|
* @brief Retrieve the error text message from the last error.
|
||||||
*
|
*
|
||||||
|
|||||||
22
src/gssapi.c
@@ -188,13 +188,13 @@ int ssh_gssapi_handle_userauth(ssh_session session, const char *user, uint32_t n
|
|||||||
gss_buffer_desc name_buf;
|
gss_buffer_desc name_buf;
|
||||||
gss_name_t server_name; /* local server fqdn */
|
gss_name_t server_name; /* local server fqdn */
|
||||||
OM_uint32 maj_stat, min_stat;
|
OM_uint32 maj_stat, min_stat;
|
||||||
unsigned int i;
|
size_t i;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
gss_OID_set supported; /* oids supported by server */
|
gss_OID_set supported; /* oids supported by server */
|
||||||
gss_OID_set both_supported; /* oids supported by both client and server */
|
gss_OID_set both_supported; /* oids supported by both client and server */
|
||||||
gss_OID_set selected; /* oid selected for authentication */
|
gss_OID_set selected; /* oid selected for authentication */
|
||||||
int present=0;
|
int present=0;
|
||||||
int oid_count=0;
|
size_t oid_count=0;
|
||||||
struct gss_OID_desc_struct oid;
|
struct gss_OID_desc_struct oid;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
@@ -218,7 +218,7 @@ int ssh_gssapi_handle_userauth(ssh_session session, const char *user, uint32_t n
|
|||||||
maj_stat = gss_indicate_mechs(&min_stat, &supported);
|
maj_stat = gss_indicate_mechs(&min_stat, &supported);
|
||||||
for (i=0; i < supported->count; ++i){
|
for (i=0; i < supported->count; ++i){
|
||||||
ptr = ssh_get_hexa(supported->elements[i].elements, supported->elements[i].length);
|
ptr = ssh_get_hexa(supported->elements[i].elements, supported->elements[i].length);
|
||||||
SSH_LOG(SSH_LOG_DEBUG, "Supported mech %d: %s", i, ptr);
|
SSH_LOG(SSH_LOG_DEBUG, "Supported mech %zu: %s", i, ptr);
|
||||||
free(ptr);
|
free(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -291,7 +291,7 @@ int ssh_gssapi_handle_userauth(ssh_session session, const char *user, uint32_t n
|
|||||||
oid.length = len - 2;
|
oid.length = len - 2;
|
||||||
gss_test_oid_set_member(&min_stat,&oid,selected,&present);
|
gss_test_oid_set_member(&min_stat,&oid,selected,&present);
|
||||||
if(present){
|
if(present){
|
||||||
SSH_LOG(SSH_LOG_PACKET, "Selected oid %d", i);
|
SSH_LOG(SSH_LOG_PACKET, "Selected oid %zu", i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -598,7 +598,7 @@ static int ssh_gssapi_send_auth_mic(ssh_session session, ssh_string *oid_set, in
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
session->auth_state = SSH_AUTH_STATE_GSSAPI_REQUEST_SENT;
|
session->auth.state = SSH_AUTH_STATE_GSSAPI_REQUEST_SENT;
|
||||||
return ssh_packet_send(session);
|
return ssh_packet_send(session);
|
||||||
fail:
|
fail:
|
||||||
ssh_buffer_reinit(session->out_buffer);
|
ssh_buffer_reinit(session->out_buffer);
|
||||||
@@ -797,7 +797,7 @@ SSH_PACKET_CALLBACK(ssh_packet_userauth_gssapi_response){
|
|||||||
(void)user;
|
(void)user;
|
||||||
|
|
||||||
SSH_LOG(SSH_LOG_PACKET, "Received SSH_USERAUTH_GSSAPI_RESPONSE");
|
SSH_LOG(SSH_LOG_PACKET, "Received SSH_USERAUTH_GSSAPI_RESPONSE");
|
||||||
if (session->auth_state != SSH_AUTH_STATE_GSSAPI_REQUEST_SENT){
|
if (session->auth.state != SSH_AUTH_STATE_GSSAPI_REQUEST_SENT){
|
||||||
ssh_set_error(session, SSH_FATAL, "Invalid state in ssh_packet_userauth_gssapi_response");
|
ssh_set_error(session, SSH_FATAL, "Invalid state in ssh_packet_userauth_gssapi_response");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@@ -845,12 +845,12 @@ SSH_PACKET_CALLBACK(ssh_packet_userauth_gssapi_response){
|
|||||||
output_token.length,
|
output_token.length,
|
||||||
(size_t)output_token.length, output_token.value);
|
(size_t)output_token.length, output_token.value);
|
||||||
ssh_packet_send(session);
|
ssh_packet_send(session);
|
||||||
session->auth_state = SSH_AUTH_STATE_GSSAPI_TOKEN;
|
session->auth.state = SSH_AUTH_STATE_GSSAPI_TOKEN;
|
||||||
}
|
}
|
||||||
return SSH_PACKET_USED;
|
return SSH_PACKET_USED;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
session->auth_state = SSH_AUTH_STATE_ERROR;
|
session->auth.state = SSH_AUTH_STATE_ERROR;
|
||||||
ssh_gssapi_free(session);
|
ssh_gssapi_free(session);
|
||||||
session->gssapi = NULL;
|
session->gssapi = NULL;
|
||||||
return SSH_PACKET_USED;
|
return SSH_PACKET_USED;
|
||||||
@@ -907,7 +907,7 @@ SSH_PACKET_CALLBACK(ssh_packet_userauth_gssapi_token_client){
|
|||||||
(void)type;
|
(void)type;
|
||||||
|
|
||||||
SSH_LOG(SSH_LOG_PACKET,"Received SSH_MSG_USERAUTH_GSSAPI_TOKEN");
|
SSH_LOG(SSH_LOG_PACKET,"Received SSH_MSG_USERAUTH_GSSAPI_TOKEN");
|
||||||
if (!session->gssapi || session->auth_state != SSH_AUTH_STATE_GSSAPI_TOKEN) {
|
if (!session->gssapi || session->auth.state != SSH_AUTH_STATE_GSSAPI_TOKEN) {
|
||||||
ssh_set_error(session, SSH_FATAL,
|
ssh_set_error(session, SSH_FATAL,
|
||||||
"Received SSH_MSG_USERAUTH_GSSAPI_TOKEN in invalid state");
|
"Received SSH_MSG_USERAUTH_GSSAPI_TOKEN in invalid state");
|
||||||
goto error;
|
goto error;
|
||||||
@@ -960,14 +960,14 @@ SSH_PACKET_CALLBACK(ssh_packet_userauth_gssapi_token_client){
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (maj_stat == GSS_S_COMPLETE) {
|
if (maj_stat == GSS_S_COMPLETE) {
|
||||||
session->auth_state = SSH_AUTH_STATE_NONE;
|
session->auth.state = SSH_AUTH_STATE_NONE;
|
||||||
ssh_gssapi_send_mic(session);
|
ssh_gssapi_send_mic(session);
|
||||||
}
|
}
|
||||||
|
|
||||||
return SSH_PACKET_USED;
|
return SSH_PACKET_USED;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
session->auth_state = SSH_AUTH_STATE_ERROR;
|
session->auth.state = SSH_AUTH_STATE_ERROR;
|
||||||
ssh_gssapi_free(session);
|
ssh_gssapi_free(session);
|
||||||
session->gssapi = NULL;
|
session->gssapi = NULL;
|
||||||
return SSH_PACKET_USED;
|
return SSH_PACKET_USED;
|
||||||
|
|||||||
80
src/init.c
@@ -32,8 +32,17 @@
|
|||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_CONSTRUCTOR_ATTRIBUTE
|
||||||
#define CONSTRUCTOR_ATTRIBUTE __attribute__((constructor))
|
#define CONSTRUCTOR_ATTRIBUTE __attribute__((constructor))
|
||||||
|
#else
|
||||||
|
#define CONSTRUCTOR_ATTRIBUTE
|
||||||
|
#endif /* HAVE_CONSTRUCTOR_ATTRIBUTE */
|
||||||
|
|
||||||
|
#ifdef HAVE_DESTRUCTOR_ATTRIBUTE
|
||||||
#define DESTRUCTOR_ATTRIBUTE __attribute__((destructor))
|
#define DESTRUCTOR_ATTRIBUTE __attribute__((destructor))
|
||||||
|
#else
|
||||||
|
#define DESTRUCTOR_ATTRIBUTE
|
||||||
|
#endif /* HAVE_DESTRUCTOR_ATTRIBUTE */
|
||||||
|
|
||||||
/* Declare static mutex */
|
/* Declare static mutex */
|
||||||
static SSH_MUTEX ssh_init_mutex = SSH_MUTEX_STATIC_INIT;
|
static SSH_MUTEX ssh_init_mutex = SSH_MUTEX_STATIC_INIT;
|
||||||
@@ -144,29 +153,29 @@ static int _ssh_finalize(unsigned destructor) {
|
|||||||
|
|
||||||
if (!destructor) {
|
if (!destructor) {
|
||||||
ssh_mutex_lock(&ssh_init_mutex);
|
ssh_mutex_lock(&ssh_init_mutex);
|
||||||
}
|
|
||||||
|
|
||||||
if (_ssh_initialized == 1) {
|
if (_ssh_initialized > 1) {
|
||||||
_ssh_initialized = 0;
|
_ssh_initialized--;
|
||||||
|
|
||||||
if (_ssh_init_ret < 0) {
|
|
||||||
goto _ret;
|
goto _ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssh_dh_finalize();
|
if (_ssh_initialized == 1) {
|
||||||
ssh_crypto_finalize();
|
if (_ssh_init_ret < 0) {
|
||||||
ssh_socket_cleanup();
|
goto _ret;
|
||||||
/* It is important to finalize threading after CRYPTO because
|
}
|
||||||
* it still depends on it */
|
|
||||||
ssh_threads_finalize();
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (_ssh_initialized > 0) {
|
|
||||||
_ssh_initialized--;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If the counter reaches zero or it is the destructor calling, finalize */
|
||||||
|
ssh_dh_finalize();
|
||||||
|
ssh_crypto_finalize();
|
||||||
|
ssh_socket_cleanup();
|
||||||
|
/* It is important to finalize threading after CRYPTO because
|
||||||
|
* it still depends on it */
|
||||||
|
ssh_threads_finalize();
|
||||||
|
|
||||||
|
_ssh_initialized = 0;
|
||||||
|
|
||||||
_ret:
|
_ret:
|
||||||
if (!destructor) {
|
if (!destructor) {
|
||||||
ssh_mutex_unlock(&ssh_init_mutex);
|
ssh_mutex_unlock(&ssh_init_mutex);
|
||||||
@@ -191,14 +200,6 @@ void libssh_destructor(void)
|
|||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
fprintf(stderr, "Error in libssh_destructor()\n");
|
fprintf(stderr, "Error in libssh_destructor()\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Detect if ssh_init() was called without matching ssh_finalize() */
|
|
||||||
if (_ssh_initialized > 0) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"Warning: ssh still initialized; probably ssh_init() "
|
|
||||||
"was called more than once (init count: %d)\n",
|
|
||||||
_ssh_initialized);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -221,4 +222,35 @@ int ssh_finalize(void) {
|
|||||||
return _ssh_finalize(0);
|
return _ssh_finalize(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
/* Library constructor and destructor */
|
||||||
|
BOOL WINAPI DllMain(HINSTANCE hinstDLL,
|
||||||
|
DWORD fdwReason,
|
||||||
|
LPVOID lpvReserved)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
switch(fdwReason) {
|
||||||
|
case DLL_PROCESS_ATTACH:
|
||||||
|
rc = _ssh_init(1);
|
||||||
|
if (rc != 0) {
|
||||||
|
fprintf(stderr, "DllMain: ssh_init failed!");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DLL_PROCESS_DETACH:
|
||||||
|
_ssh_finalize(1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|||||||
@@ -149,8 +149,8 @@ static const char *ssh_kex_descriptions[] = {
|
|||||||
/* tokenize will return a token of strings delimited by ",". the first element has to be freed */
|
/* tokenize will return a token of strings delimited by ",". the first element has to be freed */
|
||||||
static char **tokenize(const char *chain){
|
static char **tokenize(const char *chain){
|
||||||
char **tokens;
|
char **tokens;
|
||||||
int n=1;
|
size_t n=1;
|
||||||
int i=0;
|
size_t i=0;
|
||||||
char *tmp;
|
char *tmp;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
|
||||||
@@ -187,8 +187,8 @@ static char **tokenize(const char *chain){
|
|||||||
/* TODO FIXME rewrite me! */
|
/* TODO FIXME rewrite me! */
|
||||||
char **ssh_space_tokenize(const char *chain){
|
char **ssh_space_tokenize(const char *chain){
|
||||||
char **tokens;
|
char **tokens;
|
||||||
int n=1;
|
size_t n=1;
|
||||||
int i=0;
|
size_t i=0;
|
||||||
char *tmp;
|
char *tmp;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
|
||||||
|
|||||||
@@ -154,6 +154,8 @@ static char **ssh_get_knownhost_line(FILE **file, const char *filename,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @internal
|
||||||
|
*
|
||||||
* @brief Check the public key in the known host line matches the public key of
|
* @brief Check the public key in the known host line matches the public key of
|
||||||
* the currently connected server.
|
* the currently connected server.
|
||||||
*
|
*
|
||||||
@@ -206,6 +208,7 @@ static int check_public_key(ssh_session session, char **tokens) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @internal
|
||||||
* @brief Check if a hostname matches a openssh-style hashed known host.
|
* @brief Check if a hostname matches a openssh-style hashed known host.
|
||||||
*
|
*
|
||||||
* @param[in] host The host to check.
|
* @param[in] host The host to check.
|
||||||
@@ -441,14 +444,8 @@ int ssh_is_server_known(ssh_session session) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Output the current server as a known host line.
|
* @deprecated Please use ssh_session_export_known_hosts_entry()
|
||||||
*
|
* @brief This function is deprecated.
|
||||||
* This could be placed in a known hosts file after user confirmation.
|
|
||||||
* The return value should be passed to free() after the caller is done with it.
|
|
||||||
*
|
|
||||||
* @param[in] session The ssh session to use.
|
|
||||||
*
|
|
||||||
* @return string on success, NULL on error.
|
|
||||||
*/
|
*/
|
||||||
char * ssh_dump_knownhost(ssh_session session) {
|
char * ssh_dump_knownhost(ssh_session session) {
|
||||||
ssh_key server_pubkey = NULL;
|
ssh_key server_pubkey = NULL;
|
||||||
@@ -516,14 +513,8 @@ char * ssh_dump_knownhost(ssh_session session) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Write the current server as known in the known hosts file.
|
* @deprecated Please use ssh_session_update_known_hosts()
|
||||||
*
|
* @brief This function is deprecated
|
||||||
* This will create the known hosts file if it does not exist. You generaly use
|
|
||||||
* it when ssh_is_server_known() answered SSH_SERVER_NOT_KNOWN.
|
|
||||||
*
|
|
||||||
* @param[in] session The ssh session to use.
|
|
||||||
*
|
|
||||||
* @return SSH_OK on success, SSH_ERROR on error.
|
|
||||||
*/
|
*/
|
||||||
int ssh_write_knownhost(ssh_session session) {
|
int ssh_write_knownhost(ssh_session session) {
|
||||||
FILE *file;
|
FILE *file;
|
||||||
|
|||||||
@@ -43,6 +43,12 @@
|
|||||||
#include "libssh/dh.h"
|
#include "libssh/dh.h"
|
||||||
#include "libssh/knownhosts.h"
|
#include "libssh/knownhosts.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup libssh_session
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
static int hash_hostname(const char *name,
|
static int hash_hostname(const char *name,
|
||||||
unsigned char *salt,
|
unsigned char *salt,
|
||||||
unsigned int salt_size,
|
unsigned int salt_size,
|
||||||
@@ -523,7 +529,7 @@ out:
|
|||||||
*
|
*
|
||||||
* @param[in] session The session with with the values set to check.
|
* @param[in] session The session with with the values set to check.
|
||||||
*
|
*
|
||||||
* @return A @ssh_known_hosts_e return value.
|
* @return A ssh_known_hosts_e return value.
|
||||||
*/
|
*/
|
||||||
enum ssh_known_hosts_e ssh_session_has_known_hosts_entry(ssh_session session)
|
enum ssh_known_hosts_e ssh_session_has_known_hosts_entry(ssh_session session)
|
||||||
{
|
{
|
||||||
@@ -878,9 +884,11 @@ ssh_session_get_known_hosts_entry(ssh_session session,
|
|||||||
* SSH_KNOWN_HOSTS_NOT_FOUND: The known host file does not exist. The
|
* SSH_KNOWN_HOSTS_NOT_FOUND: The known host file does not exist. The
|
||||||
* host is thus unknown. File will be
|
* host is thus unknown. File will be
|
||||||
* created if host key is accepted.\n
|
* created if host key is accepted.\n
|
||||||
* SSH_KNOWN_HOSTS_ERROR: There had been an eror checking the host.
|
* SSH_KNOWN_HOSTS_ERROR: There had been an error checking the host.
|
||||||
*/
|
*/
|
||||||
enum ssh_known_hosts_e ssh_session_is_known_server(ssh_session session)
|
enum ssh_known_hosts_e ssh_session_is_known_server(ssh_session session)
|
||||||
{
|
{
|
||||||
return ssh_session_get_known_hosts_entry(session, NULL);
|
return ssh_session_get_known_hosts_entry(session, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|||||||
@@ -30,6 +30,9 @@
|
|||||||
#ifdef HAVE_LIBMBEDCRYPTO
|
#ifdef HAVE_LIBMBEDCRYPTO
|
||||||
#include <mbedtls/md.h>
|
#include <mbedtls/md.h>
|
||||||
|
|
||||||
|
static mbedtls_entropy_context ssh_mbedtls_entropy;
|
||||||
|
static mbedtls_ctr_drbg_context ssh_mbedtls_ctr_drbg;
|
||||||
|
|
||||||
struct ssh_mac_ctx_struct {
|
struct ssh_mac_ctx_struct {
|
||||||
enum ssh_mac_e mac_type;
|
enum ssh_mac_e mac_type;
|
||||||
mbedtls_md_context_t ctx;
|
mbedtls_md_context_t ctx;
|
||||||
@@ -999,6 +1002,11 @@ int ssh_mbedtls_random(void *where, int len, int strong)
|
|||||||
return !rc;
|
return !rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mbedtls_ctr_drbg_context *ssh_get_mbedtls_ctr_drbg_context(void)
|
||||||
|
{
|
||||||
|
return &ssh_mbedtls_ctr_drbg;
|
||||||
|
}
|
||||||
|
|
||||||
void ssh_crypto_finalize(void)
|
void ssh_crypto_finalize(void)
|
||||||
{
|
{
|
||||||
if (!libmbedcrypto_initialized) {
|
if (!libmbedcrypto_initialized) {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# This map file was created with abimap-0.3.0
|
# This map file was updated with abimap-0.3.1
|
||||||
|
|
||||||
LIBSSH_4_5_0 # Released
|
LIBSSH_4_5_0 # Released
|
||||||
{
|
{
|
||||||
@@ -418,3 +418,9 @@ LIBSSH_4_5_0 # Released
|
|||||||
*;
|
*;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
LIBSSH_4_6_0 # Released
|
||||||
|
{
|
||||||
|
global:
|
||||||
|
ssh_print_hash;
|
||||||
|
} LIBSSH_4_5_0;
|
||||||
|
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ static void ssh_log_stderr(int verbosity,
|
|||||||
const char *function,
|
const char *function,
|
||||||
const char *buffer)
|
const char *buffer)
|
||||||
{
|
{
|
||||||
char date[64] = {0};
|
char date[128] = {0};
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = current_timestring(1, date, sizeof(date));
|
rc = current_timestring(1, date, sizeof(date));
|
||||||
|
|||||||
@@ -81,8 +81,10 @@ int ssh_mbedcry_rand(bignum rnd, int bits, int top, int bottom)
|
|||||||
}
|
}
|
||||||
|
|
||||||
len = bits / 8 + 1;
|
len = bits / 8 + 1;
|
||||||
rc = mbedtls_mpi_fill_random(rnd, len, mbedtls_ctr_drbg_random,
|
rc = mbedtls_mpi_fill_random(rnd,
|
||||||
&ssh_mbedtls_ctr_drbg);
|
len,
|
||||||
|
mbedtls_ctr_drbg_random,
|
||||||
|
ssh_get_mbedtls_ctr_drbg_context());
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
26
src/misc.c
@@ -778,7 +778,10 @@ char *ssh_path_expand_escape(ssh_session session, const char *s) {
|
|||||||
if (session->opts.port < 65536) {
|
if (session->opts.port < 65536) {
|
||||||
char tmp[6];
|
char tmp[6];
|
||||||
|
|
||||||
snprintf(tmp, sizeof(tmp), "%u", session->opts.port);
|
snprintf(tmp,
|
||||||
|
sizeof(tmp),
|
||||||
|
"%u",
|
||||||
|
session->opts.port > 0 ? session->opts.port : 22);
|
||||||
x = strdup(tmp);
|
x = strdup(tmp);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1082,4 +1085,25 @@ void explicit_bzero(void *s, size_t n)
|
|||||||
}
|
}
|
||||||
#endif /* !HAVE_EXPLICIT_BZERO */
|
#endif /* !HAVE_EXPLICIT_BZERO */
|
||||||
|
|
||||||
|
#if !defined(HAVE_STRNDUP)
|
||||||
|
char *strndup(const char *s, size_t n)
|
||||||
|
{
|
||||||
|
char *x = NULL;
|
||||||
|
|
||||||
|
if (n + 1 < n) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
x = malloc(n + 1);
|
||||||
|
if (x == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(x, s, n);
|
||||||
|
x[n] = '\0';
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
#endif /* ! HAVE_STRNDUP */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|||||||
279
src/options.c
@@ -1070,164 +1070,169 @@ int ssh_options_get(ssh_session session, enum ssh_options_e type, char** value)
|
|||||||
*
|
*
|
||||||
* @see ssh_session_new()
|
* @see ssh_session_new()
|
||||||
*/
|
*/
|
||||||
int ssh_options_getopt(ssh_session session, int *argcptr, char **argv) {
|
int ssh_options_getopt(ssh_session session, int *argcptr, char **argv)
|
||||||
char *user = NULL;
|
{
|
||||||
char *cipher = NULL;
|
|
||||||
char *identity = NULL;
|
|
||||||
char *port = NULL;
|
|
||||||
char **save = NULL;
|
|
||||||
char **tmp = NULL;
|
|
||||||
int i = 0;
|
|
||||||
int argc = *argcptr;
|
|
||||||
int debuglevel = 0;
|
|
||||||
int usersa = 0;
|
|
||||||
int usedss = 0;
|
|
||||||
int compress = 0;
|
|
||||||
int cont = 1;
|
|
||||||
int current = 0;
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
(void)session;
|
||||||
|
(void)argcptr;
|
||||||
|
(void)argv;
|
||||||
/* Not supported with a Microsoft compiler */
|
/* Not supported with a Microsoft compiler */
|
||||||
return -1;
|
return -1;
|
||||||
#else
|
#else
|
||||||
int saveoptind = optind; /* need to save 'em */
|
char *user = NULL;
|
||||||
int saveopterr = opterr;
|
char *cipher = NULL;
|
||||||
|
char *identity = NULL;
|
||||||
|
char *port = NULL;
|
||||||
|
char **save = NULL;
|
||||||
|
char **tmp = NULL;
|
||||||
|
size_t i = 0;
|
||||||
|
int argc = *argcptr;
|
||||||
|
int debuglevel = 0;
|
||||||
|
int usersa = 0;
|
||||||
|
int usedss = 0;
|
||||||
|
int compress = 0;
|
||||||
|
int cont = 1;
|
||||||
|
size_t current = 0;
|
||||||
|
int saveoptind = optind; /* need to save 'em */
|
||||||
|
int saveopterr = opterr;
|
||||||
|
int opt;
|
||||||
|
|
||||||
opterr = 0; /* shut up getopt */
|
opterr = 0; /* shut up getopt */
|
||||||
while(cont && ((i = getopt(argc, argv, "c:i:Cl:p:vb:rd12")) != -1)) {
|
while((opt = getopt(argc, argv, "c:i:Cl:p:vb:rd12")) != -1) {
|
||||||
switch(i) {
|
switch(opt) {
|
||||||
case 'l':
|
case 'l':
|
||||||
user = optarg;
|
user = optarg;
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
port = optarg;
|
port = optarg;
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
debuglevel++;
|
debuglevel++;
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
usersa++;
|
usersa++;
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
usedss++;
|
usedss++;
|
||||||
break;
|
break;
|
||||||
case 'c':
|
case 'c':
|
||||||
cipher = optarg;
|
cipher = optarg;
|
||||||
break;
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
identity = optarg;
|
identity = optarg;
|
||||||
break;
|
break;
|
||||||
case 'C':
|
case 'C':
|
||||||
compress++;
|
compress++;
|
||||||
break;
|
break;
|
||||||
case '2':
|
case '2':
|
||||||
break;
|
break;
|
||||||
case '1':
|
case '1':
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
char opt[3]="- ";
|
char optv[3] = "- ";
|
||||||
opt[1] = optopt;
|
optv[1] = optopt;
|
||||||
tmp = realloc(save, (current + 1) * sizeof(char*));
|
tmp = realloc(save, (current + 1) * sizeof(char*));
|
||||||
if (tmp == NULL) {
|
if (tmp == NULL) {
|
||||||
|
SAFE_FREE(save);
|
||||||
|
ssh_set_error_oom(session);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
save = tmp;
|
||||||
|
save[current] = strdup(optv);
|
||||||
|
if (save[current] == NULL) {
|
||||||
|
SAFE_FREE(save);
|
||||||
|
ssh_set_error_oom(session);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
current++;
|
||||||
|
if (optarg) {
|
||||||
|
save[current++] = argv[optind + 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} /* switch */
|
||||||
|
} /* while */
|
||||||
|
opterr = saveopterr;
|
||||||
|
tmp = realloc(save, (current + (argc - optind)) * sizeof(char*));
|
||||||
|
if (tmp == NULL) {
|
||||||
|
SAFE_FREE(save);
|
||||||
|
ssh_set_error_oom(session);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
save = tmp;
|
||||||
|
while (optind < argc) {
|
||||||
|
tmp = realloc(save, (current + 1) * sizeof(char*));
|
||||||
|
if (tmp == NULL) {
|
||||||
SAFE_FREE(save);
|
SAFE_FREE(save);
|
||||||
ssh_set_error_oom(session);
|
ssh_set_error_oom(session);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
save = tmp;
|
|
||||||
save[current] = strdup(opt);
|
|
||||||
if (save[current] == NULL) {
|
|
||||||
SAFE_FREE(save);
|
|
||||||
ssh_set_error_oom(session);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
current++;
|
|
||||||
if (optarg) {
|
|
||||||
save[current++] = argv[optind + 1];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} /* switch */
|
save = tmp;
|
||||||
} /* while */
|
save[current] = argv[optind];
|
||||||
opterr = saveopterr;
|
current++;
|
||||||
tmp = realloc(save, (current + (argc - optind)) * sizeof(char*));
|
optind++;
|
||||||
if (tmp == NULL) {
|
}
|
||||||
|
|
||||||
|
if (usersa && usedss) {
|
||||||
|
ssh_set_error(session, SSH_FATAL, "Either RSA or DSS must be chosen");
|
||||||
|
cont = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssh_set_log_level(debuglevel);
|
||||||
|
|
||||||
|
optind = saveoptind;
|
||||||
|
|
||||||
|
if(!cont) {
|
||||||
|
SAFE_FREE(save);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* first recopy the save vector into the original's */
|
||||||
|
for (i = 0; i < current; i++) {
|
||||||
|
/* don't erase argv[0] */
|
||||||
|
argv[ i + 1] = save[i];
|
||||||
|
}
|
||||||
|
argv[current + 1] = NULL;
|
||||||
|
*argcptr = current + 1;
|
||||||
SAFE_FREE(save);
|
SAFE_FREE(save);
|
||||||
ssh_set_error_oom(session);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
save = tmp;
|
|
||||||
while (optind < argc) {
|
|
||||||
tmp = realloc(save, (current + 1) * sizeof(char*));
|
|
||||||
if (tmp == NULL) {
|
|
||||||
SAFE_FREE(save);
|
|
||||||
ssh_set_error_oom(session);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
save = tmp;
|
|
||||||
save[current] = argv[optind];
|
|
||||||
current++;
|
|
||||||
optind++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (usersa && usedss) {
|
/* set a new option struct */
|
||||||
ssh_set_error(session, SSH_FATAL, "Either RSA or DSS must be chosen");
|
if (compress) {
|
||||||
cont = 0;
|
if (ssh_options_set(session, SSH_OPTIONS_COMPRESSION, "yes") < 0) {
|
||||||
}
|
cont = 0;
|
||||||
|
}
|
||||||
ssh_set_log_level(debuglevel);
|
|
||||||
|
|
||||||
optind = saveoptind;
|
|
||||||
|
|
||||||
if(!cont) {
|
|
||||||
SAFE_FREE(save);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* first recopy the save vector into the original's */
|
|
||||||
for (i = 0; i < current; i++) {
|
|
||||||
/* don't erase argv[0] */
|
|
||||||
argv[ i + 1] = save[i];
|
|
||||||
}
|
|
||||||
argv[current + 1] = NULL;
|
|
||||||
*argcptr = current + 1;
|
|
||||||
SAFE_FREE(save);
|
|
||||||
|
|
||||||
/* set a new option struct */
|
|
||||||
if (compress) {
|
|
||||||
if (ssh_options_set(session, SSH_OPTIONS_COMPRESSION, "yes") < 0) {
|
|
||||||
cont = 0;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (cont && cipher) {
|
if (cont && cipher) {
|
||||||
if (ssh_options_set(session, SSH_OPTIONS_CIPHERS_C_S, cipher) < 0) {
|
if (ssh_options_set(session, SSH_OPTIONS_CIPHERS_C_S, cipher) < 0) {
|
||||||
cont = 0;
|
cont = 0;
|
||||||
|
}
|
||||||
|
if (cont && ssh_options_set(session, SSH_OPTIONS_CIPHERS_S_C, cipher) < 0) {
|
||||||
|
cont = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (cont && ssh_options_set(session, SSH_OPTIONS_CIPHERS_S_C, cipher) < 0) {
|
|
||||||
cont = 0;
|
if (cont && user) {
|
||||||
|
if (ssh_options_set(session, SSH_OPTIONS_USER, user) < 0) {
|
||||||
|
cont = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (cont && user) {
|
if (cont && identity) {
|
||||||
if (ssh_options_set(session, SSH_OPTIONS_USER, user) < 0) {
|
if (ssh_options_set(session, SSH_OPTIONS_IDENTITY, identity) < 0) {
|
||||||
cont = 0;
|
cont = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (cont && identity) {
|
if (port != NULL) {
|
||||||
if (ssh_options_set(session, SSH_OPTIONS_IDENTITY, identity) < 0) {
|
ssh_options_set(session, SSH_OPTIONS_PORT_STR, port);
|
||||||
cont = 0;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (port != NULL) {
|
if (!cont) {
|
||||||
ssh_options_set(session, SSH_OPTIONS_PORT_STR, port);
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cont) {
|
return SSH_OK;
|
||||||
return SSH_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
return SSH_OK;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -264,7 +264,7 @@ SSH_PACKET_CALLBACK(ssh_packet_service_accept){
|
|||||||
(void)type;
|
(void)type;
|
||||||
(void)user;
|
(void)user;
|
||||||
|
|
||||||
session->auth_service_state=SSH_AUTH_SERVICE_ACCEPTED;
|
session->auth.service_state = SSH_AUTH_SERVICE_ACCEPTED;
|
||||||
SSH_LOG(SSH_LOG_PACKET,
|
SSH_LOG(SSH_LOG_PACKET,
|
||||||
"Received SSH_MSG_SERVICE_ACCEPT");
|
"Received SSH_MSG_SERVICE_ACCEPT");
|
||||||
|
|
||||||
|
|||||||
@@ -398,8 +398,11 @@ int pki_key_generate_rsa(ssh_key key, int parameter)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mbedtls_pk_can_do(key->rsa, MBEDTLS_PK_RSA)) {
|
if (mbedtls_pk_can_do(key->rsa, MBEDTLS_PK_RSA)) {
|
||||||
rc = mbedtls_rsa_gen_key(mbedtls_pk_rsa(*key->rsa), mbedtls_ctr_drbg_random,
|
rc = mbedtls_rsa_gen_key(mbedtls_pk_rsa(*key->rsa),
|
||||||
&ssh_mbedtls_ctr_drbg, parameter, 65537);
|
mbedtls_ctr_drbg_random,
|
||||||
|
ssh_get_mbedtls_ctr_drbg_context(),
|
||||||
|
parameter,
|
||||||
|
65537);
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
mbedtls_pk_free(key->rsa);
|
mbedtls_pk_free(key->rsa);
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
@@ -980,8 +983,14 @@ static ssh_string rsa_do_sign(const unsigned char *digest, int dlen,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ok = mbedtls_pk_sign(privkey, MBEDTLS_MD_SHA1, digest, dlen, sig, &slen,
|
ok = mbedtls_pk_sign(privkey,
|
||||||
mbedtls_ctr_drbg_random, &ssh_mbedtls_ctr_drbg);
|
MBEDTLS_MD_SHA1,
|
||||||
|
digest,
|
||||||
|
dlen,
|
||||||
|
sig,
|
||||||
|
&slen,
|
||||||
|
mbedtls_ctr_drbg_random,
|
||||||
|
ssh_get_mbedtls_ctr_drbg_context());
|
||||||
|
|
||||||
if (ok != 0) {
|
if (ok != 0) {
|
||||||
SAFE_FREE(sig);
|
SAFE_FREE(sig);
|
||||||
@@ -1036,9 +1045,14 @@ ssh_signature pki_do_sign(const ssh_key privkey, const unsigned char *hash,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = mbedtls_ecdsa_sign(&privkey->ecdsa->grp, sig->ecdsa_sig.r,
|
rc = mbedtls_ecdsa_sign(&privkey->ecdsa->grp,
|
||||||
sig->ecdsa_sig.s, &privkey->ecdsa->d, hash, hlen,
|
sig->ecdsa_sig.r,
|
||||||
mbedtls_ctr_drbg_random, &ssh_mbedtls_ctr_drbg);
|
sig->ecdsa_sig.s,
|
||||||
|
&privkey->ecdsa->d,
|
||||||
|
hash,
|
||||||
|
hlen,
|
||||||
|
mbedtls_ctr_drbg_random,
|
||||||
|
ssh_get_mbedtls_ctr_drbg_context());
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
ssh_signature_free(sig);
|
ssh_signature_free(sig);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1094,9 +1108,14 @@ ssh_signature pki_do_sign_sessionid(const ssh_key key, const unsigned char
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = mbedtls_ecdsa_sign(&key->ecdsa->grp, sig->ecdsa_sig.r,
|
rc = mbedtls_ecdsa_sign(&key->ecdsa->grp,
|
||||||
sig->ecdsa_sig.s, &key->ecdsa->d, hash, hlen,
|
sig->ecdsa_sig.r,
|
||||||
mbedtls_ctr_drbg_random, &ssh_mbedtls_ctr_drbg);
|
sig->ecdsa_sig.s,
|
||||||
|
&key->ecdsa->d,
|
||||||
|
hash,
|
||||||
|
hlen,
|
||||||
|
mbedtls_ctr_drbg_random,
|
||||||
|
ssh_get_mbedtls_ctr_drbg_context());
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
ssh_signature_free(sig);
|
ssh_signature_free(sig);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1247,8 +1266,10 @@ int pki_key_generate_ecdsa(ssh_key key, int parameter)
|
|||||||
|
|
||||||
mbedtls_ecdsa_init(key->ecdsa);
|
mbedtls_ecdsa_init(key->ecdsa);
|
||||||
|
|
||||||
ok = mbedtls_ecdsa_genkey(key->ecdsa, pki_key_ecdsa_nid_to_mbed_gid(nid),
|
ok = mbedtls_ecdsa_genkey(key->ecdsa,
|
||||||
mbedtls_ctr_drbg_random, &ssh_mbedtls_ctr_drbg);
|
pki_key_ecdsa_nid_to_mbed_gid(nid),
|
||||||
|
mbedtls_ctr_drbg_random,
|
||||||
|
ssh_get_mbedtls_ctr_drbg_context());
|
||||||
|
|
||||||
if (ok != 0) {
|
if (ok != 0) {
|
||||||
mbedtls_ecdsa_free(key->ecdsa);
|
mbedtls_ecdsa_free(key->ecdsa);
|
||||||
|
|||||||
18
src/server.c
@@ -574,7 +574,7 @@ static int ssh_server_kex_termination(void *s){
|
|||||||
|
|
||||||
void ssh_set_auth_methods(ssh_session session, int auth_methods){
|
void ssh_set_auth_methods(ssh_session session, int auth_methods){
|
||||||
/* accept only methods in range */
|
/* accept only methods in range */
|
||||||
session->auth_methods = auth_methods & 0x3f;
|
session->auth.supported_methods = auth_methods & 0x3f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do the banner and key exchange */
|
/* Do the banner and key exchange */
|
||||||
@@ -625,26 +625,26 @@ int ssh_auth_reply_default(ssh_session session,int partial) {
|
|||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
|
|
||||||
|
|
||||||
if (session->auth_methods == 0) {
|
if (session->auth.supported_methods == 0) {
|
||||||
session->auth_methods = SSH_AUTH_METHOD_PUBLICKEY | SSH_AUTH_METHOD_PASSWORD;
|
session->auth.supported_methods = SSH_AUTH_METHOD_PUBLICKEY | SSH_AUTH_METHOD_PASSWORD;
|
||||||
}
|
}
|
||||||
if (session->auth_methods & SSH_AUTH_METHOD_PUBLICKEY) {
|
if (session->auth.supported_methods & SSH_AUTH_METHOD_PUBLICKEY) {
|
||||||
strncat(methods_c, "publickey,",
|
strncat(methods_c, "publickey,",
|
||||||
sizeof(methods_c) - strlen(methods_c) - 1);
|
sizeof(methods_c) - strlen(methods_c) - 1);
|
||||||
}
|
}
|
||||||
if (session->auth_methods & SSH_AUTH_METHOD_GSSAPI_MIC){
|
if (session->auth.supported_methods & SSH_AUTH_METHOD_GSSAPI_MIC){
|
||||||
strncat(methods_c,"gssapi-with-mic,",
|
strncat(methods_c,"gssapi-with-mic,",
|
||||||
sizeof(methods_c) - strlen(methods_c) - 1);
|
sizeof(methods_c) - strlen(methods_c) - 1);
|
||||||
}
|
}
|
||||||
if (session->auth_methods & SSH_AUTH_METHOD_INTERACTIVE) {
|
if (session->auth.supported_methods & SSH_AUTH_METHOD_INTERACTIVE) {
|
||||||
strncat(methods_c, "keyboard-interactive,",
|
strncat(methods_c, "keyboard-interactive,",
|
||||||
sizeof(methods_c) - strlen(methods_c) - 1);
|
sizeof(methods_c) - strlen(methods_c) - 1);
|
||||||
}
|
}
|
||||||
if (session->auth_methods & SSH_AUTH_METHOD_PASSWORD) {
|
if (session->auth.supported_methods & SSH_AUTH_METHOD_PASSWORD) {
|
||||||
strncat(methods_c, "password,",
|
strncat(methods_c, "password,",
|
||||||
sizeof(methods_c) - strlen(methods_c) - 1);
|
sizeof(methods_c) - strlen(methods_c) - 1);
|
||||||
}
|
}
|
||||||
if (session->auth_methods & SSH_AUTH_METHOD_HOSTBASED) {
|
if (session->auth.supported_methods & SSH_AUTH_METHOD_HOSTBASED) {
|
||||||
strncat(methods_c, "hostbased,",
|
strncat(methods_c, "hostbased,",
|
||||||
sizeof(methods_c) - strlen(methods_c) - 1);
|
sizeof(methods_c) - strlen(methods_c) - 1);
|
||||||
}
|
}
|
||||||
@@ -887,7 +887,7 @@ int ssh_message_auth_set_methods(ssh_message msg, int methods) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
msg->session->auth_methods = methods;
|
msg->session->auth.supported_methods = methods;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,11 +60,10 @@ ssh_session ssh_new(void) {
|
|||||||
char *id = NULL;
|
char *id = NULL;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
session = malloc(sizeof (struct ssh_session_struct));
|
session = calloc(1, sizeof (struct ssh_session_struct));
|
||||||
if (session == NULL) {
|
if (session == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
ZERO_STRUCTP(session);
|
|
||||||
|
|
||||||
session->next_crypto = crypto_new();
|
session->next_crypto = crypto_new();
|
||||||
if (session->next_crypto == NULL) {
|
if (session->next_crypto == NULL) {
|
||||||
@@ -87,7 +86,7 @@ ssh_session ssh_new(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
session->alive = 0;
|
session->alive = 0;
|
||||||
session->auth_methods = 0;
|
session->auth.supported_methods = 0;
|
||||||
ssh_set_blocking(session, 1);
|
ssh_set_blocking(session, 1);
|
||||||
session->maxchannel = FIRST_CHANNEL;
|
session->maxchannel = FIRST_CHANNEL;
|
||||||
|
|
||||||
@@ -268,7 +267,7 @@ void ssh_free(ssh_session session) {
|
|||||||
#endif
|
#endif
|
||||||
session->agent_state = NULL;
|
session->agent_state = NULL;
|
||||||
|
|
||||||
SAFE_FREE(session->auth_auto_state);
|
SAFE_FREE(session->auth.auto_state);
|
||||||
SAFE_FREE(session->serverbanner);
|
SAFE_FREE(session->serverbanner);
|
||||||
SAFE_FREE(session->clientbanner);
|
SAFE_FREE(session->clientbanner);
|
||||||
SAFE_FREE(session->banner);
|
SAFE_FREE(session->banner);
|
||||||
|
|||||||
45
src/sftp.c
@@ -303,7 +303,7 @@ sftp_packet sftp_packet_read(sftp_session sftp) {
|
|||||||
sftp_packet packet = NULL;
|
sftp_packet packet = NULL;
|
||||||
uint32_t tmp;
|
uint32_t tmp;
|
||||||
size_t size;
|
size_t size;
|
||||||
int r, s;
|
int r, s, is_eof;
|
||||||
|
|
||||||
packet = calloc(1, sizeof(struct sftp_packet_struct));
|
packet = calloc(1, sizeof(struct sftp_packet_struct));
|
||||||
if (packet == NULL) {
|
if (packet == NULL) {
|
||||||
@@ -330,8 +330,6 @@ sftp_packet sftp_packet_read(sftp_session sftp) {
|
|||||||
if (s < 0) {
|
if (s < 0) {
|
||||||
goto error;
|
goto error;
|
||||||
} else if (s == 0) {
|
} else if (s == 0) {
|
||||||
int is_eof;
|
|
||||||
|
|
||||||
is_eof = ssh_channel_is_eof(sftp->channel);
|
is_eof = ssh_channel_is_eof(sftp->channel);
|
||||||
if (is_eof) {
|
if (is_eof) {
|
||||||
goto error;
|
goto error;
|
||||||
@@ -346,11 +344,17 @@ sftp_packet sftp_packet_read(sftp_session sftp) {
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
r=ssh_channel_read(sftp->channel, buffer, 1, 0);
|
do {
|
||||||
if (r <= 0) {
|
r = ssh_channel_read(sftp->channel, buffer, 1, 0);
|
||||||
/* TODO: check if there are cases where an error needs to be set here */
|
if (r < 0) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
} else if (s == 0) {
|
||||||
|
is_eof = ssh_channel_is_eof(sftp->channel);
|
||||||
|
if (is_eof) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (r < 1);
|
||||||
ssh_buffer_add_data(packet->payload, buffer, r);
|
ssh_buffer_add_data(packet->payload, buffer, r);
|
||||||
ssh_buffer_get_u8(packet->payload, &packet->type);
|
ssh_buffer_get_u8(packet->payload, &packet->type);
|
||||||
|
|
||||||
@@ -369,11 +373,16 @@ sftp_packet sftp_packet_read(sftp_session sftp) {
|
|||||||
r=ssh_channel_read(sftp->channel,buffer,
|
r=ssh_channel_read(sftp->channel,buffer,
|
||||||
sizeof(buffer)>size ? size:sizeof(buffer),0);
|
sizeof(buffer)>size ? size:sizeof(buffer),0);
|
||||||
|
|
||||||
if(r <= 0) {
|
if (r < 0) {
|
||||||
/* TODO: check if there are cases where an error needs to be set here */
|
/* TODO: check if there are cases where an error needs to be set here */
|
||||||
goto error;
|
goto error;
|
||||||
}
|
} else if (r == 0) {
|
||||||
if (ssh_buffer_add_data(packet->payload, buffer, r) == SSH_ERROR) {
|
/* Retry the reading unless the remote was closed */
|
||||||
|
is_eof = ssh_channel_is_eof(sftp->channel);
|
||||||
|
if (is_eof) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
} else if (ssh_buffer_add_data(packet->payload, buffer, r) == SSH_ERROR) {
|
||||||
ssh_set_error_oom(sftp->session);
|
ssh_set_error_oom(sftp->session);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@@ -699,7 +708,7 @@ static int sftp_enqueue(sftp_session sftp, sftp_message msg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SSH_LOG(SSH_LOG_PACKET,
|
SSH_LOG(SSH_LOG_PACKET,
|
||||||
"Queued msg type %d id %d",
|
"Queued msg id %d type %d",
|
||||||
msg->id, msg->packet_type);
|
msg->id, msg->packet_type);
|
||||||
|
|
||||||
if(sftp->queue == NULL) {
|
if(sftp->queue == NULL) {
|
||||||
@@ -1137,7 +1146,6 @@ static char *sftp_parse_longname(const char *longname,
|
|||||||
enum sftp_longname_field_e longname_field) {
|
enum sftp_longname_field_e longname_field) {
|
||||||
const char *p, *q;
|
const char *p, *q;
|
||||||
size_t len, field = 0;
|
size_t len, field = 0;
|
||||||
char *x;
|
|
||||||
|
|
||||||
p = longname;
|
p = longname;
|
||||||
/* Find the beginning of the field which is specified by sftp_longanme_field_e. */
|
/* Find the beginning of the field which is specified by sftp_longanme_field_e. */
|
||||||
@@ -1158,16 +1166,9 @@ static char *sftp_parse_longname(const char *longname,
|
|||||||
q++;
|
q++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* There is no strndup on windows */
|
len = q - p;
|
||||||
len = q - p + 1;
|
|
||||||
x = calloc(1, len);
|
|
||||||
if (x == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(x, len, "%s", p);
|
return strndup(p, len);
|
||||||
|
|
||||||
return x;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* sftp version 0-3 code. It is different from the v4 */
|
/* sftp version 0-3 code. It is different from the v4 */
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ endif (WITH_SFTP)
|
|||||||
|
|
||||||
foreach(_CLI_TEST ${LIBSSH_CLIENT_TESTS})
|
foreach(_CLI_TEST ${LIBSSH_CLIENT_TESTS})
|
||||||
add_cmocka_test(${_CLI_TEST} ${_CLI_TEST}.c ${TORTURE_LIBRARY})
|
add_cmocka_test(${_CLI_TEST} ${_CLI_TEST}.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(${_CLI_TEST} PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
if (OSX)
|
if (OSX)
|
||||||
set_property(
|
set_property(
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include "session.c"
|
#include "session.c"
|
||||||
#include "known_hosts.c"
|
#include "known_hosts.c"
|
||||||
@@ -60,10 +61,13 @@ static int session_setup(void **state)
|
|||||||
struct torture_state *s = *state;
|
struct torture_state *s = *state;
|
||||||
int verbosity = torture_libssh_verbosity();
|
int verbosity = torture_libssh_verbosity();
|
||||||
struct passwd *pwd;
|
struct passwd *pwd;
|
||||||
|
int rc;
|
||||||
|
|
||||||
pwd = getpwnam("bob");
|
pwd = getpwnam("bob");
|
||||||
assert_non_null(pwd);
|
assert_non_null(pwd);
|
||||||
setuid(pwd->pw_uid);
|
|
||||||
|
rc = setuid(pwd->pw_uid);
|
||||||
|
assert_return_code(rc, errno);
|
||||||
|
|
||||||
s->ssh.session = ssh_new();
|
s->ssh.session = ssh_new();
|
||||||
assert_non_null(s->ssh.session);
|
assert_non_null(s->ssh.session);
|
||||||
|
|||||||
@@ -57,7 +57,9 @@ static int session_setup(void **state)
|
|||||||
|
|
||||||
pwd = getpwnam("bob");
|
pwd = getpwnam("bob");
|
||||||
assert_non_null(pwd);
|
assert_non_null(pwd);
|
||||||
setuid(pwd->pw_uid);
|
|
||||||
|
rc = setuid(pwd->pw_uid);
|
||||||
|
assert_return_code(rc, errno);
|
||||||
|
|
||||||
s->ssh.session = ssh_new();
|
s->ssh.session = ssh_new();
|
||||||
assert_non_null(s->ssh.session);
|
assert_non_null(s->ssh.session);
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
static int sshd_setup(void **state)
|
static int sshd_setup(void **state)
|
||||||
{
|
{
|
||||||
@@ -27,10 +28,13 @@ static int session_setup(void **state)
|
|||||||
struct torture_state *s = *state;
|
struct torture_state *s = *state;
|
||||||
int verbosity = torture_libssh_verbosity();
|
int verbosity = torture_libssh_verbosity();
|
||||||
struct passwd *pwd;
|
struct passwd *pwd;
|
||||||
|
int rc;
|
||||||
|
|
||||||
pwd = getpwnam("bob");
|
pwd = getpwnam("bob");
|
||||||
assert_non_null(pwd);
|
assert_non_null(pwd);
|
||||||
setuid(pwd->pw_uid);
|
|
||||||
|
rc = setuid(pwd->pw_uid);
|
||||||
|
assert_return_code(rc, errno);
|
||||||
|
|
||||||
s->ssh.session = ssh_new();
|
s->ssh.session = ssh_new();
|
||||||
assert_non_null(s->ssh.session);
|
assert_non_null(s->ssh.session);
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
static int sshd_setup(void **state)
|
static int sshd_setup(void **state)
|
||||||
{
|
{
|
||||||
@@ -46,10 +47,13 @@ static int session_setup(void **state)
|
|||||||
{
|
{
|
||||||
struct torture_state *s = *state;
|
struct torture_state *s = *state;
|
||||||
struct passwd *pwd;
|
struct passwd *pwd;
|
||||||
|
int rc;
|
||||||
|
|
||||||
pwd = getpwnam("bob");
|
pwd = getpwnam("bob");
|
||||||
assert_non_null(pwd);
|
assert_non_null(pwd);
|
||||||
setuid(pwd->pw_uid);
|
|
||||||
|
rc = setuid(pwd->pw_uid);
|
||||||
|
assert_return_code(rc, errno);
|
||||||
|
|
||||||
s->ssh.session = torture_ssh_session(TORTURE_SSH_SERVER,
|
s->ssh.session = torture_ssh_session(TORTURE_SSH_SERVER,
|
||||||
NULL,
|
NULL,
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#define BUFLEN 4096
|
#define BUFLEN 4096
|
||||||
static char buffer[BUFLEN];
|
static char buffer[BUFLEN];
|
||||||
@@ -51,10 +52,13 @@ static int session_setup(void **state)
|
|||||||
{
|
{
|
||||||
struct torture_state *s = *state;
|
struct torture_state *s = *state;
|
||||||
struct passwd *pwd;
|
struct passwd *pwd;
|
||||||
|
int rc;
|
||||||
|
|
||||||
pwd = getpwnam("bob");
|
pwd = getpwnam("bob");
|
||||||
assert_non_null(pwd);
|
assert_non_null(pwd);
|
||||||
setuid(pwd->pw_uid);
|
|
||||||
|
rc = setuid(pwd->pw_uid);
|
||||||
|
assert_return_code(rc, errno);
|
||||||
|
|
||||||
s->ssh.session = torture_ssh_session(TORTURE_SSH_SERVER,
|
s->ssh.session = torture_ssh_session(TORTURE_SSH_SERVER,
|
||||||
NULL,
|
NULL,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
static int sshd_setup(void **state)
|
static int sshd_setup(void **state)
|
||||||
{
|
{
|
||||||
@@ -25,10 +26,13 @@ static int session_setup(void **state)
|
|||||||
{
|
{
|
||||||
struct torture_state *s = *state;
|
struct torture_state *s = *state;
|
||||||
struct passwd *pwd;
|
struct passwd *pwd;
|
||||||
|
int rc;
|
||||||
|
|
||||||
pwd = getpwnam("bob");
|
pwd = getpwnam("bob");
|
||||||
assert_non_null(pwd);
|
assert_non_null(pwd);
|
||||||
setuid(pwd->pw_uid);
|
|
||||||
|
rc = setuid(pwd->pw_uid);
|
||||||
|
assert_return_code(rc, errno);
|
||||||
|
|
||||||
s->ssh.session = torture_ssh_session(TORTURE_SSH_SERVER,
|
s->ssh.session = torture_ssh_session(TORTURE_SSH_SERVER,
|
||||||
NULL,
|
NULL,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#define MAX_XFER_BUF_SIZE 16384
|
#define MAX_XFER_BUF_SIZE 16384
|
||||||
|
|
||||||
@@ -27,10 +28,13 @@ static int session_setup(void **state)
|
|||||||
{
|
{
|
||||||
struct torture_state *s = *state;
|
struct torture_state *s = *state;
|
||||||
struct passwd *pwd;
|
struct passwd *pwd;
|
||||||
|
int rc;
|
||||||
|
|
||||||
pwd = getpwnam("bob");
|
pwd = getpwnam("bob");
|
||||||
assert_non_null(pwd);
|
assert_non_null(pwd);
|
||||||
setuid(pwd->pw_uid);
|
|
||||||
|
rc = setuid(pwd->pw_uid);
|
||||||
|
assert_return_code(rc, errno);
|
||||||
|
|
||||||
s->ssh.session = torture_ssh_session(TORTURE_SSH_SERVER,
|
s->ssh.session = torture_ssh_session(TORTURE_SSH_SERVER,
|
||||||
NULL,
|
NULL,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#define MAX_XFER_BUF_SIZE 16384
|
#define MAX_XFER_BUF_SIZE 16384
|
||||||
|
|
||||||
@@ -27,10 +28,13 @@ static int session_setup(void **state)
|
|||||||
{
|
{
|
||||||
struct torture_state *s = *state;
|
struct torture_state *s = *state;
|
||||||
struct passwd *pwd;
|
struct passwd *pwd;
|
||||||
|
int rc;
|
||||||
|
|
||||||
pwd = getpwnam("bob");
|
pwd = getpwnam("bob");
|
||||||
assert_non_null(pwd);
|
assert_non_null(pwd);
|
||||||
setuid(pwd->pw_uid);
|
|
||||||
|
rc = setuid(pwd->pw_uid);
|
||||||
|
assert_return_code(rc, errno);
|
||||||
|
|
||||||
s->ssh.session = torture_ssh_session(TORTURE_SSH_SERVER,
|
s->ssh.session = torture_ssh_session(TORTURE_SSH_SERVER,
|
||||||
NULL,
|
NULL,
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ set(pkd_libs
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_executable(pkd_hello ${pkd_hello_src})
|
add_executable(pkd_hello ${pkd_hello_src})
|
||||||
|
target_compile_options(pkd_hello PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(pkd_hello ${pkd_libs})
|
target_link_libraries(pkd_hello ${pkd_libs})
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -72,7 +72,8 @@ static void pkd_sighandler(int signum) {
|
|||||||
(void) signum;
|
(void) signum;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pkd_init_libssh() {
|
static int pkd_init_libssh(void)
|
||||||
|
{
|
||||||
int rc = ssh_threads_set_callbacks(ssh_threads_get_pthread());
|
int rc = ssh_threads_set_callbacks(ssh_threads_get_pthread());
|
||||||
return (rc == SSH_OK) ? 0 : 1;
|
return (rc == SSH_OK) ? 0 : 1;
|
||||||
}
|
}
|
||||||
@@ -115,7 +116,8 @@ out:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pkd_accept_fd() {
|
static int pkd_accept_fd(void)
|
||||||
|
{
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
socklen_t len = sizeof(addr);
|
socklen_t len = sizeof(addr);
|
||||||
|
|||||||
@@ -711,8 +711,8 @@ static int pkd_run_tests(void) {
|
|||||||
(pkd_dargs.opts.testmatch == NULL)) {
|
(pkd_dargs.opts.testmatch == NULL)) {
|
||||||
rc = _cmocka_run_group_tests("all tests", all_tests, tindex, NULL, NULL);
|
rc = _cmocka_run_group_tests("all tests", all_tests, tindex, NULL, NULL);
|
||||||
} else {
|
} else {
|
||||||
int i = 0;
|
size_t i = 0;
|
||||||
int num_found = 0;
|
size_t num_found = 0;
|
||||||
const char *testname = pkd_dargs.opts.testname;
|
const char *testname = pkd_dargs.opts.testname;
|
||||||
const char *testmatch = pkd_dargs.opts.testmatch;
|
const char *testmatch = pkd_dargs.opts.testmatch;
|
||||||
|
|
||||||
|
|||||||
@@ -3,49 +3,89 @@ project(unittests C)
|
|||||||
include_directories(${OPENSSL_INCLUDE_DIR})
|
include_directories(${OPENSSL_INCLUDE_DIR})
|
||||||
|
|
||||||
add_cmocka_test(torture_buffer torture_buffer.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_buffer torture_buffer.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_buffer PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
add_cmocka_test(torture_callbacks torture_callbacks.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_callbacks torture_callbacks.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_callbacks PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
add_cmocka_test(torture_crypto torture_crypto.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_crypto torture_crypto.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_crypto PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
add_cmocka_test(torture_init torture_init.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_init torture_init.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_init PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
add_cmocka_test(torture_list torture_list.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_list torture_list.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_list PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
add_cmocka_test(torture_misc torture_misc.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_misc torture_misc.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_misc PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
add_cmocka_test(torture_config torture_config.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_config torture_config.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_config PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
add_cmocka_test(torture_options torture_options.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_options torture_options.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_options PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
add_cmocka_test(torture_isipaddr torture_isipaddr.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_isipaddr torture_isipaddr.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_isipaddr PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
add_cmocka_test(torture_knownhosts_parsing torture_knownhosts_parsing.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_knownhosts_parsing torture_knownhosts_parsing.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_knownhosts_parsing PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
|
add_cmocka_test(torture_hashes torture_hashes.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_hashes PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
if (CMAKE_USE_PTHREADS_INIT)
|
if (CMAKE_USE_PTHREADS_INIT)
|
||||||
add_cmocka_test(torture_rand torture_rand.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_rand torture_rand.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_rand PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(torture_rand Threads::Threads)
|
target_link_libraries(torture_rand Threads::Threads)
|
||||||
|
|
||||||
add_cmocka_test(torture_threads_init torture_threads_init.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_threads_init torture_threads_init.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_threads_init PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(torture_threads_init Threads::Threads)
|
target_link_libraries(torture_threads_init Threads::Threads)
|
||||||
|
|
||||||
add_cmocka_test(torture_threads_buffer torture_threads_buffer.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_threads_buffer torture_threads_buffer.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_threads_buffer PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(torture_threads_buffer Threads::Threads)
|
target_link_libraries(torture_threads_buffer Threads::Threads)
|
||||||
|
|
||||||
add_cmocka_test(torture_threads_crypto torture_threads_crypto.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_threads_crypto torture_threads_crypto.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_threads_crypto PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(torture_threads_crypto Threads::Threads)
|
target_link_libraries(torture_threads_crypto Threads::Threads)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (UNIX AND NOT WIN32)
|
if (UNIX AND NOT WIN32)
|
||||||
# this uses a socketpair
|
# this uses a socketpair
|
||||||
add_cmocka_test(torture_packet torture_packet.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_packet torture_packet.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_packet PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
# requires ssh-keygen
|
# requires ssh-keygen
|
||||||
add_cmocka_test(torture_keyfiles torture_keyfiles.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_keyfiles torture_keyfiles.c ${TORTURE_LIBRARY})
|
||||||
|
|
||||||
add_cmocka_test(torture_pki torture_pki.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_pki torture_pki.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_pki PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
add_cmocka_test(torture_pki_rsa torture_pki_rsa.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_pki_rsa torture_pki_rsa.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_pki_rsa PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
add_cmocka_test(torture_pki_ed25519 torture_pki_ed25519.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_pki_ed25519 torture_pki_ed25519.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_pki_ed25519 PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
|
||||||
if (HAVE_DSA)
|
if (HAVE_DSA)
|
||||||
add_cmocka_test(torture_pki_dsa torture_pki_dsa.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_pki_dsa torture_pki_dsa.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_pki_dsa PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
endif()
|
endif()
|
||||||
if (HAVE_ECC)
|
if (HAVE_ECC)
|
||||||
add_cmocka_test(torture_pki_ecdsa torture_pki_ecdsa.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_pki_ecdsa torture_pki_ecdsa.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_pki_ecdsa PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# requires /dev/null
|
# requires /dev/null
|
||||||
add_cmocka_test(torture_channel torture_channel.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_channel torture_channel.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_channel PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
# requires pthread
|
# requires pthread
|
||||||
if (CMAKE_USE_PTHREADS_INIT)
|
if (CMAKE_USE_PTHREADS_INIT)
|
||||||
add_cmocka_test(torture_threads_pki_rsa torture_threads_pki_rsa.c ${TORTURE_LIBRARY})
|
add_cmocka_test(torture_threads_pki_rsa torture_threads_pki_rsa.c ${TORTURE_LIBRARY})
|
||||||
|
target_compile_options(torture_threads_pki_rsa PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(torture_threads_pki_rsa Threads::Threads)
|
target_link_libraries(torture_threads_pki_rsa Threads::Threads)
|
||||||
|
|
||||||
# Not working correctly
|
# Not working correctly
|
||||||
|
|||||||
@@ -12,13 +12,15 @@
|
|||||||
|
|
||||||
static void torture_channel_select(void **state)
|
static void torture_channel_select(void **state)
|
||||||
{
|
{
|
||||||
fd_set readfds = {0};
|
fd_set readfds;
|
||||||
int fd;
|
int fd;
|
||||||
int rc;
|
int rc;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
(void)state; /* unused */
|
(void)state; /* unused */
|
||||||
|
|
||||||
|
ZERO_STRUCT(readfds);
|
||||||
|
|
||||||
fd = open("/dev/null", 0);
|
fd = open("/dev/null", 0);
|
||||||
assert_true(fd > 2);
|
assert_true(fd > 2);
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ extern LIBSSH_THREAD int ssh_log_level;
|
|||||||
#define LIBSSH_TESTCONFIG6 "libssh_testconfig6.tmp"
|
#define LIBSSH_TESTCONFIG6 "libssh_testconfig6.tmp"
|
||||||
#define LIBSSH_TESTCONFIG7 "libssh_testconfig7.tmp"
|
#define LIBSSH_TESTCONFIG7 "libssh_testconfig7.tmp"
|
||||||
#define LIBSSH_TESTCONFIG8 "libssh_testconfig8.tmp"
|
#define LIBSSH_TESTCONFIG8 "libssh_testconfig8.tmp"
|
||||||
|
#define LIBSSH_TESTCONFIG9 "libssh_testconfig9.tmp"
|
||||||
#define LIBSSH_TESTCONFIGGLOB "libssh_testc*[36].tmp"
|
#define LIBSSH_TESTCONFIGGLOB "libssh_testc*[36].tmp"
|
||||||
|
|
||||||
#define USERNAME "testuser"
|
#define USERNAME "testuser"
|
||||||
@@ -90,6 +91,17 @@ static int setup_config_files(void **state)
|
|||||||
"Host nopubkey\n"
|
"Host nopubkey\n"
|
||||||
"\tPubkeyAuthentication no\n");
|
"\tPubkeyAuthentication no\n");
|
||||||
|
|
||||||
|
/* unsupported options and corner cases */
|
||||||
|
torture_write_file(LIBSSH_TESTCONFIG9,
|
||||||
|
"\n" /* empty line */
|
||||||
|
"# comment line\n"
|
||||||
|
" # comment line not starting with hash\n"
|
||||||
|
"UnknownConfigurationOption yes\n"
|
||||||
|
"GSSAPIKexAlgorithms yes\n"
|
||||||
|
"ControlMaster auto\n" /* SOC_NA */
|
||||||
|
"VisualHostkey yes\n" /* SOC_UNSUPPORTED */
|
||||||
|
"");
|
||||||
|
|
||||||
session = ssh_new();
|
session = ssh_new();
|
||||||
*state = session;
|
*state = session;
|
||||||
|
|
||||||
@@ -106,6 +118,7 @@ static int teardown(void **state)
|
|||||||
unlink(LIBSSH_TESTCONFIG6);
|
unlink(LIBSSH_TESTCONFIG6);
|
||||||
unlink(LIBSSH_TESTCONFIG7);
|
unlink(LIBSSH_TESTCONFIG7);
|
||||||
unlink(LIBSSH_TESTCONFIG8);
|
unlink(LIBSSH_TESTCONFIG8);
|
||||||
|
unlink(LIBSSH_TESTCONFIG9);
|
||||||
|
|
||||||
ssh_free(*state);
|
ssh_free(*state);
|
||||||
|
|
||||||
@@ -269,6 +282,21 @@ static void torture_config_auth_methods(void **state) {
|
|||||||
assert_true(session->opts.flags & SSH_OPT_FLAG_PUBKEY_AUTH);
|
assert_true(session->opts.flags & SSH_OPT_FLAG_PUBKEY_AUTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Verify the configuration parser does not choke on unknown
|
||||||
|
* or unsupported configuration options
|
||||||
|
*/
|
||||||
|
static void torture_config_unknown(void **state) {
|
||||||
|
ssh_session session = *state;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
/* test corner cases */
|
||||||
|
ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG9);
|
||||||
|
assert_true(ret == 0);
|
||||||
|
ret = ssh_config_parse_file(session, "/etc/ssh/ssh_config");
|
||||||
|
assert_true(ret == 0);
|
||||||
|
}
|
||||||
|
|
||||||
int torture_run_tests(void) {
|
int torture_run_tests(void) {
|
||||||
int rc;
|
int rc;
|
||||||
struct CMUnitTest tests[] = {
|
struct CMUnitTest tests[] = {
|
||||||
@@ -287,6 +315,9 @@ int torture_run_tests(void) {
|
|||||||
cmocka_unit_test_setup_teardown(torture_config_auth_methods,
|
cmocka_unit_test_setup_teardown(torture_config_auth_methods,
|
||||||
setup_config_files,
|
setup_config_files,
|
||||||
teardown),
|
teardown),
|
||||||
|
cmocka_unit_test_setup_teardown(torture_config_unknown,
|
||||||
|
setup_config_files,
|
||||||
|
teardown),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
118
tests/unittests/torture_hashes.c
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#define LIBSSH_STATIC
|
||||||
|
|
||||||
|
#include "torture.h"
|
||||||
|
#include "torture_key.h"
|
||||||
|
#include "legacy.c"
|
||||||
|
#include "dh.c"
|
||||||
|
|
||||||
|
static int setup_rsa_key(void **state)
|
||||||
|
{
|
||||||
|
int rc=0;
|
||||||
|
enum ssh_keytypes_e type;
|
||||||
|
char *b64_key, *p;
|
||||||
|
ssh_key key;
|
||||||
|
|
||||||
|
const char *q;
|
||||||
|
|
||||||
|
b64_key = strdup(torture_get_testkey_pub(SSH_KEYTYPE_RSA, 0));
|
||||||
|
assert_true(b64_key != NULL);
|
||||||
|
|
||||||
|
q = p = b64_key;
|
||||||
|
while (*p != ' ') p++;
|
||||||
|
*p = '\0';
|
||||||
|
|
||||||
|
type = ssh_key_type_from_name(q);
|
||||||
|
assert_true(type == SSH_KEYTYPE_RSA);
|
||||||
|
|
||||||
|
q = ++p;
|
||||||
|
while (*p != ' ') p++;
|
||||||
|
*p = '\0';
|
||||||
|
|
||||||
|
rc = ssh_pki_import_pubkey_base64(q, type, &key);
|
||||||
|
assert_true(rc == 0);
|
||||||
|
|
||||||
|
free(b64_key);
|
||||||
|
*state = key;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int teardown(void **state)
|
||||||
|
{
|
||||||
|
ssh_key_free(*state);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void torture_md5_hash(void **state)
|
||||||
|
{
|
||||||
|
ssh_key pubkey = *state;
|
||||||
|
unsigned char *hash = NULL;
|
||||||
|
char *hexa = NULL;
|
||||||
|
size_t hlen;
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
rc = ssh_get_publickey_hash(pubkey, SSH_PUBLICKEY_HASH_MD5, &hash, &hlen);
|
||||||
|
assert_true(rc == 0);
|
||||||
|
|
||||||
|
hexa = ssh_get_hexa(hash, hlen);
|
||||||
|
assert_string_equal(hexa,
|
||||||
|
"50:15:a0:9b:92:bf:33:1c:01:c5:8c:fe:18:fa:ce:78");
|
||||||
|
|
||||||
|
ssh_string_free_char(hexa);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void torture_sha1_hash(void **state)
|
||||||
|
{
|
||||||
|
ssh_key pubkey = *state;
|
||||||
|
unsigned char *hash = NULL;
|
||||||
|
char *sha1 = NULL;
|
||||||
|
int rc = 0;
|
||||||
|
size_t hlen;
|
||||||
|
|
||||||
|
rc = ssh_get_publickey_hash(pubkey, SSH_PUBLICKEY_HASH_SHA1, &hash, &hlen);
|
||||||
|
assert_true(rc == 0);
|
||||||
|
|
||||||
|
sha1 = ssh_get_b64_unpadded(hash, hlen);
|
||||||
|
assert_string_equal(sha1, "6wP+houujQmxLBiFugTcoeoODCM");
|
||||||
|
|
||||||
|
ssh_string_free_char(sha1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void torture_sha256_hash(void **state)
|
||||||
|
{
|
||||||
|
ssh_key pubkey = *state;
|
||||||
|
unsigned char *hash = NULL;
|
||||||
|
char *sha256 = NULL;
|
||||||
|
int rc = 0;
|
||||||
|
size_t hlen;
|
||||||
|
|
||||||
|
rc = ssh_get_publickey_hash(pubkey, SSH_PUBLICKEY_HASH_SHA256, &hash, &hlen);
|
||||||
|
assert_true(rc == 0);
|
||||||
|
|
||||||
|
sha256 = ssh_get_b64_unpadded(hash, hlen);
|
||||||
|
assert_string_equal(sha256, "jXstVLLe84fSDo1kEYGn6iumnPCSorhaiWxnJz8VTII");
|
||||||
|
|
||||||
|
ssh_string_free_char(sha256);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int torture_run_tests(void) {
|
||||||
|
int rc;
|
||||||
|
struct CMUnitTest tests[] = {
|
||||||
|
cmocka_unit_test_setup_teardown(torture_md5_hash,
|
||||||
|
setup_rsa_key,
|
||||||
|
teardown),
|
||||||
|
cmocka_unit_test_setup_teardown(torture_sha1_hash,
|
||||||
|
setup_rsa_key,
|
||||||
|
teardown),
|
||||||
|
cmocka_unit_test_setup_teardown(torture_sha256_hash,
|
||||||
|
setup_rsa_key,
|
||||||
|
teardown),
|
||||||
|
};
|
||||||
|
|
||||||
|
torture_filter_tests(tests);
|
||||||
|
rc = cmocka_run_group_tests(tests, NULL, NULL);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
@@ -131,57 +131,73 @@ static void torture_packet(const char *cipher,
|
|||||||
ssh_free(session);
|
ssh_free(session);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void torture_packet_aes128_ctr() {
|
static void torture_packet_aes128_ctr(void **state)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
|
(void)state; /* unused */
|
||||||
for (i=1;i<256;++i){
|
for (i=1;i<256;++i){
|
||||||
torture_packet("aes128-ctr","hmac-sha1",i);
|
torture_packet("aes128-ctr","hmac-sha1",i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void torture_packet_aes192_ctr(){
|
static void torture_packet_aes192_ctr(void **state)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
|
(void)state; /* unused */
|
||||||
for (i=1;i<256;++i){
|
for (i=1;i<256;++i){
|
||||||
torture_packet("aes192-ctr","hmac-sha1",i);
|
torture_packet("aes192-ctr","hmac-sha1",i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void torture_packet_aes256_ctr(){
|
static void torture_packet_aes256_ctr(void **state)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
|
(void)state; /* unused */
|
||||||
for (i=1;i<256;++i){
|
for (i=1;i<256;++i){
|
||||||
torture_packet("aes256-ctr","hmac-sha1",i);
|
torture_packet("aes256-ctr","hmac-sha1",i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void torture_packet_aes128_cbc() {
|
static void torture_packet_aes128_cbc(void **state)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
|
(void)state; /* unused */
|
||||||
for (i=1;i<256;++i){
|
for (i=1;i<256;++i){
|
||||||
torture_packet("aes128-cbc","hmac-sha1",i);
|
torture_packet("aes128-cbc","hmac-sha1",i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void torture_packet_aes192_cbc(){
|
static void torture_packet_aes192_cbc(void **state)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
|
(void)state; /* unused */
|
||||||
for (i=1;i<256;++i){
|
for (i=1;i<256;++i){
|
||||||
torture_packet("aes192-cbc","hmac-sha1",i);
|
torture_packet("aes192-cbc","hmac-sha1",i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void torture_packet_aes256_cbc(){
|
static void torture_packet_aes256_cbc(void **state)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
|
(void)state; /* unused */
|
||||||
for (i=1;i<256;++i){
|
for (i=1;i<256;++i){
|
||||||
torture_packet("aes256-cbc","hmac-sha1",i);
|
torture_packet("aes256-cbc","hmac-sha1",i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void torture_packet_3des_cbc(){
|
static void torture_packet_3des_cbc(void **state)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
|
(void)state; /* unused */
|
||||||
for (i=1;i<256;++i){
|
for (i=1;i<256;++i){
|
||||||
torture_packet("3des-cbc","hmac-sha1",i);
|
torture_packet("3des-cbc","hmac-sha1",i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void torture_packet_chacha20(){
|
static void torture_packet_chacha20(void **state)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
|
(void)state; /* unused */
|
||||||
for (i=1;i<256;++i){
|
for (i=1;i<256;++i){
|
||||||
torture_packet("chacha20-poly1305@openssh.com","none",i);
|
torture_packet("chacha20-poly1305@openssh.com","none",i);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ static int teardown_dsa_key(void **state)
|
|||||||
static void torture_pki_dsa_import_privkey_base64(void **state)
|
static void torture_pki_dsa_import_privkey_base64(void **state)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
ssh_key key;
|
ssh_key key = NULL;
|
||||||
const char *passphrase = torture_get_testkey_passphrase();
|
const char *passphrase = torture_get_testkey_passphrase();
|
||||||
|
|
||||||
(void) state; /* unused */
|
(void) state; /* unused */
|
||||||
@@ -70,8 +70,8 @@ static void torture_pki_dsa_import_privkey_base64(void **state)
|
|||||||
#ifdef HAVE_LIBCRYPTO
|
#ifdef HAVE_LIBCRYPTO
|
||||||
static void torture_pki_dsa_write_privkey(void **state)
|
static void torture_pki_dsa_write_privkey(void **state)
|
||||||
{
|
{
|
||||||
ssh_key origkey;
|
ssh_key origkey = NULL;
|
||||||
ssh_key privkey;
|
ssh_key privkey = NULL;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
(void) state; /* unused */
|
(void) state; /* unused */
|
||||||
@@ -220,8 +220,8 @@ static void torture_pki_dsa_import_privkey_base64_passphrase(void **state)
|
|||||||
static void torture_pki_dsa_publickey_from_privatekey(void **state)
|
static void torture_pki_dsa_publickey_from_privatekey(void **state)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
ssh_key key;
|
ssh_key key = NULL;
|
||||||
ssh_key pubkey;
|
ssh_key pubkey = NULL;
|
||||||
const char *passphrase = NULL;
|
const char *passphrase = NULL;
|
||||||
|
|
||||||
(void) state; /* unused */
|
(void) state; /* unused */
|
||||||
@@ -246,7 +246,7 @@ static void torture_pki_dsa_publickey_from_privatekey(void **state)
|
|||||||
static void torture_pki_dsa_import_cert_file(void **state)
|
static void torture_pki_dsa_import_cert_file(void **state)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
ssh_key cert;
|
ssh_key cert = NULL;
|
||||||
enum ssh_keytypes_e type;
|
enum ssh_keytypes_e type;
|
||||||
|
|
||||||
(void) state; /* unused */
|
(void) state; /* unused */
|
||||||
@@ -266,9 +266,9 @@ static void torture_pki_dsa_import_cert_file(void **state)
|
|||||||
static void torture_pki_dsa_publickey_base64(void **state)
|
static void torture_pki_dsa_publickey_base64(void **state)
|
||||||
{
|
{
|
||||||
enum ssh_keytypes_e type;
|
enum ssh_keytypes_e type;
|
||||||
char *b64_key, *key_buf, *p;
|
char *b64_key = NULL, *key_buf = NULL, *p = NULL;
|
||||||
const char *str;
|
const char *str = NULL;
|
||||||
ssh_key key;
|
ssh_key key = NULL;
|
||||||
size_t keylen;
|
size_t keylen;
|
||||||
size_t i;
|
size_t i;
|
||||||
int rc;
|
int rc;
|
||||||
@@ -317,8 +317,8 @@ static void torture_pki_dsa_publickey_base64(void **state)
|
|||||||
static void torture_pki_dsa_generate_pubkey_from_privkey(void **state)
|
static void torture_pki_dsa_generate_pubkey_from_privkey(void **state)
|
||||||
{
|
{
|
||||||
char pubkey_generated[4096] = {0};
|
char pubkey_generated[4096] = {0};
|
||||||
ssh_key privkey;
|
ssh_key privkey = NULL;
|
||||||
ssh_key pubkey;
|
ssh_key pubkey = NULL;
|
||||||
int len;
|
int len;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
@@ -357,11 +357,11 @@ static void torture_pki_dsa_generate_pubkey_from_privkey(void **state)
|
|||||||
static void torture_pki_dsa_duplicate_key(void **state)
|
static void torture_pki_dsa_duplicate_key(void **state)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
char *b64_key;
|
char *b64_key = NULL;
|
||||||
char *b64_key_gen;
|
char *b64_key_gen = NULL;
|
||||||
ssh_key pubkey;
|
ssh_key pubkey = NULL;
|
||||||
ssh_key privkey;
|
ssh_key privkey = NULL;
|
||||||
ssh_key privkey_dup;
|
ssh_key privkey_dup = NULL;
|
||||||
|
|
||||||
(void) state;
|
(void) state;
|
||||||
|
|
||||||
@@ -403,8 +403,8 @@ static void torture_pki_dsa_duplicate_key(void **state)
|
|||||||
static void torture_pki_dsa_generate_key(void **state)
|
static void torture_pki_dsa_generate_key(void **state)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
ssh_key key;
|
ssh_key key = NULL;
|
||||||
ssh_signature sign;
|
ssh_signature sign = NULL;
|
||||||
ssh_session session=ssh_new();
|
ssh_session session=ssh_new();
|
||||||
(void) state;
|
(void) state;
|
||||||
|
|
||||||
|
|||||||