From 5d0ae566b6c8c3126f927de2bda97bc0e1dced57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20L=C3=B3pez=20Zubieta?= Date: Thu, 21 Dec 2017 16:50:21 -0600 Subject: [PATCH 001/544] Generate deb packages with CPACK --- CMakeLists.txt | 4 ++++ cmake/cpack_debs.cmake | 31 +++++++++++++++++++++++++++++++ resources/appimaged.service | 10 ++++++++++ src/CMakeLists.txt | 12 +++++++++++- 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 cmake/cpack_debs.cmake create mode 100644 resources/appimaged.service diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a277162b..fe653cb07 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -97,6 +97,10 @@ set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/sanitizers-cmake/cmake" ${CMA add_subdirectory(src) +################################ +# packing # +################################ +include(cmake/cpack_debs.cmake) ################################ # unit and functionality tests # diff --git a/cmake/cpack_debs.cmake b/cmake/cpack_debs.cmake new file mode 100644 index 000000000..947ee61ad --- /dev/null +++ b/cmake/cpack_debs.cmake @@ -0,0 +1,31 @@ +cmake_minimum_required(VERSION 3.6) + +set(PROJECT_VERSION 1.0) +SET(CPACK_GENERATOR "DEB") + +set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}-${GIT_VERSION}) + +SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "AppImage Team") +SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://appimage.org/") +SET(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) +SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md") +SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE") + + +SET(CPACK_DEBIAN_LIBAPPIMAGE_PACKAGE_NAME "libappimage") +SET(CPACK_DEBIAN_LIBAPPIMAGE_PACKAGE_DEPENDS "libarchive13, libc6 (>= 2.4), libglib2.0-0, zlib1g, fuse") +SET(CPACK_DEBIAN_LIBAPPIMAGE_PACKAGE_DESCRIPTION "Utilities collection to handle AppImage files.") + +SET(CPACK_DEBIAN_LIBAPPIMAGE-DEV_PACKAGE_NAME "libappimage-dev") +SET(CPACK_DEBIAN_LIBAPPIMAGE-DEV_PACKAGE_DEPENDS "libappimage") +SET(CPACK_DEBIAN_LIBAPPIMAGE-DEV_PACKAGE_DESCRIPTION "Utilities collection to handle AppImage files.") + +SET(CPACK_DEBIAN_APPIMAGED_PACKAGE_NAME "appimaged") +SET(CPACK_COMPONENT_APPIMAGED_DESCRIPTION + "Optional AppImage daemon for desktop integration.\n Integrates AppImages into the desktop, e.g., installs icons and menu entries.") + +SET(CPACK_DEBIAN_APPIMAGED_PACKAGE_DEPENDS "libarchive13, libc6 (>= 2.4), libglib2.0-0, zlib1g, fuse") + +SET(CPACK_COMPONENTS_ALL appimaged libappimage libappimage-dev) +SET(CPACK_DEB_COMPONENT_INSTALL ON) +INCLUDE(CPack) diff --git a/resources/appimaged.service b/resources/appimaged.service new file mode 100644 index 000000000..55e0a653f --- /dev/null +++ b/resources/appimaged.service @@ -0,0 +1,10 @@ +[Unit] +Description=AppImage daemon +After=basic.target +[Service] +ExecStart=/usr/bin/appimaged +Restart=always +RestartSec=5s +StartLimitInterval=0 +[Install] +WantedBy=graphical.target diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e7d089bc1..75fa1309e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -169,7 +169,17 @@ install( ) install( - TARGETS AppRun appimaged appimagetool digest validate + TARGETS appimaged + RUNTIME DESTINATION bin COMPONENT appimaged +) + +install( + FILES ${CMAKE_SOURCE_DIR}/resources/appimaged.service + DESTINATION lib/systemd/user/ + COMPONENT appimaged +) +install( + TARGETS AppRun appimagetool digest validate RUNTIME DESTINATION bin COMPONENT applications LIBRARY DESTINATION lib COMPONENT applications ARCHIVE DESTINATION lib/static COMPONENT applications From 4892878dc9bce8577087bdda6daff4003a396861 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 10 Jan 2018 21:47:03 +0100 Subject: [PATCH 002/544] Update ignores --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 130df1d2a..071ab4f73 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ # Build directory build/ +.idea/ +cmake-build*/ +Testing/ From f6dee593e71b9c7c85cf9b56d2626e7c44c9c1f8 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 10 Jan 2018 21:47:33 +0100 Subject: [PATCH 003/544] Fix versioning inconsistencies --- CMakeLists.txt | 5 ++++- Makefile.runtime | 2 +- build-tool-osx.sh | 2 +- cmake/cpack_debs.cmake | 43 ++++++++++++++++++++++------------------- src/CMakeLists.txt | 8 ++++---- src/appimaged.c | 2 +- src/appimagetool.c | 2 +- src/build-runtime.sh.in | 2 +- src/runtime.c | 4 ++-- src/shared.c | 6 +++--- 10 files changed, 41 insertions(+), 35 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c260b96b5..7afa76bec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,7 @@ include(CTest) execute_process( COMMAND git describe --tags --always --abbrev=7 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - OUTPUT_VARIABLE GIT_COMMIT + OUTPUT_VARIABLE GIT_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ) @@ -42,6 +42,9 @@ set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) +# write version information for CPack to files +file(WRITE ${PROJECT_BINARY_DIR}/GIT_VERSION "${GIT_VERSION}") + ########################## # configure dependencies # diff --git a/Makefile.runtime b/Makefile.runtime index dcda0126d..2f171cbef 100644 --- a/Makefile.runtime +++ b/Makefile.runtime @@ -17,7 +17,7 @@ all: runtime # Compile runtime but do not link runtime.o: runtime.c - $(CC) -c $(CFLAGS) $^ -DGIT_COMMIT=\"$(git describe --tags --always --abbrev=7)\" \ + $(CC) -c $(CFLAGS) $^ -DGIT_VERSION=\"$(git describe --tags --always --abbrev=7)\" \ -I./squashfuse/ -D_FILE_OFFSET_BITS=64 # Add .upd_info and .sha256_sig sections diff --git a/build-tool-osx.sh b/build-tool-osx.sh index f49c0c8cb..837ae9575 100755 --- a/build-tool-osx.sh +++ b/build-tool-osx.sh @@ -101,7 +101,7 @@ cp ../squashfs-tools/squashfs-tools/mksquashfs . # Compile appimagetool but do not link - glib version -$CC -DGIT_COMMIT=\"$(git describe --tags --always --abbrev=7)\" -D_FILE_OFFSET_BITS=64 -I../squashfuse/ \ +$CC -DGIT_VERSION=\"$(git describe --tags --always --abbrev=7)\" -D_FILE_OFFSET_BITS=64 -I../squashfuse/ \ $(pkg-config --cflags glib-2.0) -g -Os ../getsection.c -c ../appimagetool.c # Now statically link against libsquashfuse - glib version diff --git a/cmake/cpack_debs.cmake b/cmake/cpack_debs.cmake index 947ee61ad..a745cbc21 100644 --- a/cmake/cpack_debs.cmake +++ b/cmake/cpack_debs.cmake @@ -1,31 +1,34 @@ +# required for DEB-DEFAULT to work as intended cmake_minimum_required(VERSION 3.6) set(PROJECT_VERSION 1.0) -SET(CPACK_GENERATOR "DEB") +set(CPACK_GENERATOR "DEB") -set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}-${GIT_VERSION}) +set(CPACK_DEBIAN_PACKAGE_VERSION ${PROJECT_VERSION}) +file(READ ${PROJECT_BINARY_DIR}/GIT_VERSION GIT_VERSION) +set(CPACK_DEBIAN_PACKAGE_RELEASE "git-${GIT_VERSION}") -SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "AppImage Team") -SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://appimage.org/") -SET(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) -SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md") -SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE") +set(CPACK_DEBIAN_PACKAGE_MAINTAINER "AppImage Team") +set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://appimage.org/") +set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) +set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE") +set(CPACK_DEBIAN_LIBAPPIMAGE_PACKAGE_NAME "libappimage") +set(CPACK_DEBIAN_LIBAPPIMAGE_PACKAGE_DEPENDS "libarchive13, libc6 (>= 2.4), libglib2.0-0, zlib1g, fuse") +set(CPACK_DEBIAN_LIBAPPIMAGE_PACKAGE_DESCRIPTION "Utilities collection to handle AppImage files.") -SET(CPACK_DEBIAN_LIBAPPIMAGE_PACKAGE_NAME "libappimage") -SET(CPACK_DEBIAN_LIBAPPIMAGE_PACKAGE_DEPENDS "libarchive13, libc6 (>= 2.4), libglib2.0-0, zlib1g, fuse") -SET(CPACK_DEBIAN_LIBAPPIMAGE_PACKAGE_DESCRIPTION "Utilities collection to handle AppImage files.") +set(CPACK_DEBIAN_LIBAPPIMAGE-DEV_PACKAGE_NAME "libappimage-dev") +set(CPACK_DEBIAN_LIBAPPIMAGE-DEV_PACKAGE_DEPENDS "libappimage") +set(CPACK_DEBIAN_LIBAPPIMAGE-DEV_PACKAGE_DESCRIPTION "Utilities collection to handle AppImage files.") -SET(CPACK_DEBIAN_LIBAPPIMAGE-DEV_PACKAGE_NAME "libappimage-dev") -SET(CPACK_DEBIAN_LIBAPPIMAGE-DEV_PACKAGE_DEPENDS "libappimage") -SET(CPACK_DEBIAN_LIBAPPIMAGE-DEV_PACKAGE_DESCRIPTION "Utilities collection to handle AppImage files.") - -SET(CPACK_DEBIAN_APPIMAGED_PACKAGE_NAME "appimaged") -SET(CPACK_COMPONENT_APPIMAGED_DESCRIPTION +set(CPACK_DEBIAN_APPIMAGED_PACKAGE_NAME "appimaged") +set(CPACK_COMPONENT_APPIMAGED_DESCRIPTION "Optional AppImage daemon for desktop integration.\n Integrates AppImages into the desktop, e.g., installs icons and menu entries.") -SET(CPACK_DEBIAN_APPIMAGED_PACKAGE_DEPENDS "libarchive13, libc6 (>= 2.4), libglib2.0-0, zlib1g, fuse") +set(CPACK_DEBIAN_APPIMAGED_PACKAGE_DEPENDS "libarchive13, libc6 (>= 2.4), libglib2.0-0, zlib1g, fuse") + +set(CPACK_COMPONENTS_ALL appimaged libappimage libappimage-dev) +set(CPACK_DEB_COMPONENT_INSTALL ON) -SET(CPACK_COMPONENTS_ALL appimaged libappimage libappimage-dev) -SET(CPACK_DEB_COMPONENT_INSTALL ON) -INCLUDE(CPack) +include(CPack) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 201faebcf..392f15e34 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -40,7 +40,7 @@ set_target_properties(libappimage PROPERTIES PUBLIC_HEADER "${PROJECT_SOURCE_DIR target_compile_definitions(libappimage PRIVATE -D_FILE_OFFSET_BITS=64 - PRIVATE -DGIT_COMMIT="${GIT_COMMIT}" + PRIVATE -DGIT_VERSION="${GIT_VERSION}" PRIVATE -DENABLE_BINRELOC ) @@ -88,7 +88,7 @@ set_target_properties(libappimage_static PROPERTIES PUBLIC_HEADER "${PROJECT_SOU target_compile_definitions(libappimage_static PRIVATE -D_FILE_OFFSET_BITS=64 - PRIVATE -DGIT_COMMIT="${GIT_COMMIT}" + PRIVATE -DGIT_VERSION="${GIT_VERSION}" PRIVATE -DENABLE_BINRELOC ) @@ -145,7 +145,7 @@ target_link_libraries(appimagetool target_compile_definitions(appimagetool PRIVATE -D_FILE_OFFSET_BITS=64 - PRIVATE -DGIT_COMMIT="${GIT_COMMIT}" + PRIVATE -DGIT_VERSION="${GIT_VERSION}" PRIVATE -DBUILD_NUMBER="${BUILD_NUMBER}" PRIVATE -DBUILD_DATE="${DATE}" PRIVATE -DENABLE_BINRELOC @@ -179,7 +179,7 @@ target_link_libraries(appimaged ) target_compile_definitions(appimaged - PRIVATE -DGIT_COMMIT="${GIT_COMMIT}" + PRIVATE -DGIT_VERSION="${GIT_VERSION}" PRIVATE -DBUILD_NUMBER="${BUILD_NUMBER}" PRIVATE -DBUILD_DATE="${DATE}" PRIVATE -D_FILE_OFFSET_BITS=64 diff --git a/src/appimaged.c b/src/appimaged.c index 5f5168369..1492bce7e 100644 --- a/src/appimaged.c +++ b/src/appimaged.c @@ -238,7 +238,7 @@ int main(int argc, char ** argv) { fprintf( stderr, "appimaged, %s (commit %s), build %s built on %s\n", - RELEASE_NAME, GIT_COMMIT, BUILD_NUMBER, BUILD_DATE + RELEASE_NAME, GIT_VERSION, BUILD_NUMBER, BUILD_DATE ); if(showVersionOnly) diff --git a/src/appimagetool.c b/src/appimagetool.c index c239b56ba..38b6206f7 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -490,7 +490,7 @@ main (int argc, char *argv[]) fprintf( stderr, "appimagetool, %s (commit %s), build %s built on %s\n", - RELEASE_NAME, GIT_COMMIT, BUILD_NUMBER, BUILD_DATE + RELEASE_NAME, GIT_VERSION, BUILD_NUMBER, BUILD_DATE ); // always show version, but exit immediately if only the version number was requested diff --git a/src/build-runtime.sh.in b/src/build-runtime.sh.in index d9643c185..fc4b92925 100755 --- a/src/build-runtime.sh.in +++ b/src/build-runtime.sh.in @@ -36,7 +36,7 @@ trap cleanup EXIT cd "$build_dir" # Compile runtime but do not link -$CC -DGIT_COMMIT=\"$git_version\" -I"@xz_INCLUDE_DIR@" -I"@squashfuse_INCLUDE_DIR@" \ +$CC -DGIT_VERSION=\"$git_version\" -I"@xz_INCLUDE_DIR@" -I"@squashfuse_INCLUDE_DIR@" \ -D_FILE_OFFSET_BITS=64 -g $small_FLAGS -c "$repo_root"/runtime.c # Prepare 1024 bytes of space for updateinformation diff --git a/src/runtime.c b/src/runtime.c index bcf21e5ea..b5b2677e8 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -413,7 +413,7 @@ main (int argc, char *argv[]) } if(arg && strcmp(arg,"appimage-version")==0) { - fprintf(stderr,"Version: %s\n", GIT_COMMIT); + fprintf(stderr,"Version: %s\n", GIT_VERSION); exit(0); } @@ -445,7 +445,7 @@ main (int argc, char *argv[]) // If there is an argument starting with appimage- (but not appimage-mount which is handled further down) // then stop here and print an error message if((arg && strncmp(arg, "appimage-", 8) == 0) && (arg && strcmp(arg,"appimage-mount")!=0)) { - fprintf(stderr,"--%s is not yet implemented in version %s\n", arg, GIT_COMMIT); + fprintf(stderr,"--%s is not yet implemented in version %s\n", arg, GIT_VERSION); exit(1); } diff --git a/src/shared.c b/src/shared.c index 64ae19dfa..f169b7cdd 100644 --- a/src/shared.c +++ b/src/shared.c @@ -507,11 +507,11 @@ void write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag g_free(icon_with_md5); } - /* At compile time, inject GIT_COMMIT like this: - * cc ... -DGIT_COMMIT=\"$(git describe --tags --always --abbrev=7)\" -.. + /* At compile time, inject GIT_VERSION like this: + * cc ... -DGIT_VERSION=\"$(git describe --tags --always --abbrev=7)\" -.. */ { - gchar *generated_by = g_strdup_printf("Generated by appimaged %s", GIT_COMMIT); + gchar *generated_by = g_strdup_printf("Generated by appimaged %s", GIT_VERSION); g_key_file_set_value(key_file_structure, "Desktop Entry", "X-AppImage-Comment", generated_by); g_free(generated_by); } From d4ee8bf9dbf52ef93e0a3c3eb6c57032cd3be4ee Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 10 Jan 2018 21:50:02 +0100 Subject: [PATCH 004/544] Upload debs --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 4c74d22b7..03b3c91b4 100755 --- a/build.sh +++ b/build.sh @@ -93,4 +93,4 @@ bash -ex "$HERE/build-appdirs.sh" ls -lh mkdir -p out -cp -r install_prefix/usr/{bin,lib/appimagekit}/* appdirs/*.AppDir out/ +cp -r install_prefix/usr/{bin,lib/appimagekit}/* appdirs/*.AppDir *.deb out/ From 8f4080f5406c2f9458b10ab610ea54882a425076 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 10 Jan 2018 21:59:33 +0100 Subject: [PATCH 005/544] Fix Debian packages build --- build.sh | 3 +++ install-build-deps.sh | 2 +- travis/travis-build.sh | 5 +---- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.sh b/build.sh index 03b3c91b4..fcc3b7aaa 100755 --- a/build.sh +++ b/build.sh @@ -77,6 +77,9 @@ if [ $RUN_TESTS -ne 0 ]; then ctest -V fi +# build Debian packages +cpack + xxd src/runtime | head -n 1 # Do NOT strip runtime diff --git a/install-build-deps.sh b/install-build-deps.sh index 5b8e4d359..37ccb3cf2 100755 --- a/install-build-deps.sh +++ b/install-build-deps.sh @@ -22,7 +22,7 @@ fi if [ -e /usr/bin/apt-get ] ; then sudo apt-get update sudo apt-get -y install zsync git libarchive-dev autoconf libtool make gcc g++ libtool libfuse-dev \ - liblzma-dev libglib2.0-dev libssl-dev libinotifytools0-dev liblz4-dev equivs libcairo-dev desktop-file-utils cmake + liblzma-dev libglib2.0-dev libssl-dev libinotifytools0-dev liblz4-dev libcairo-dev desktop-file-utils cmake # libtool-bin might be required in newer distributions but is not available in precise sudo cp resources/liblz4.pc /usr/lib/$ARCH-linux-gnu/pkgconfig/ if cat /etc/lsb-release | grep 14.04 2>&1 >/dev/null; then diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 6fb1f8240..423ec4cf9 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -62,14 +62,11 @@ bash -x ../travis/test-appimages.sh # install more tools # (vim-common contains xxd) -sudo apt-get install equivs vim-common +sudo apt-get install vim-common # fix permissions sudo chown -R travis.travis . -# build .deb -(cd out ; equivs-build ../../appimaged.ctl) - # remove binaries from output directory ls -al out/ rm -r out/{appimaged,appimagetool,validate,digest,mksquashfs,*.AppDir} From 72c7b03a6c60edf2629d4e4e82d602438b8d08e7 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 10 Jan 2018 22:11:19 +0100 Subject: [PATCH 006/544] Run cpack in verbose mode --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index fcc3b7aaa..5598391ec 100755 --- a/build.sh +++ b/build.sh @@ -78,7 +78,7 @@ if [ $RUN_TESTS -ne 0 ]; then fi # build Debian packages -cpack +cpack -V xxd src/runtime | head -n 1 From 5369e65fd986400175fdfbec994a3c88a437ecf5 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 10 Jan 2018 22:40:09 +0100 Subject: [PATCH 007/544] Fix Debian package build, mk. 1 --- build.sh | 3 --- travis/travis-build.sh | 5 +++++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/build.sh b/build.sh index 5598391ec..03b3c91b4 100755 --- a/build.sh +++ b/build.sh @@ -77,9 +77,6 @@ if [ $RUN_TESTS -ne 0 ]; then ctest -V fi -# build Debian packages -cpack -V - xxd src/runtime | head -n 1 # Do NOT strip runtime diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 423ec4cf9..27a770647 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -79,5 +79,10 @@ mv out/runtime out/runtime-"$ARCH" # remove unused files sudo rm -rf out/*.AppDir out/*.AppImage.digest +# build Debian packages +cpack -V + +mv *.deb out/ + # fix filename for upload sudo mv out/AppRun out/AppRun-"$ARCH" From 923191bd946fb06e33c003112b9a0e51e6d05a26 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 10 Jan 2018 22:49:53 +0100 Subject: [PATCH 008/544] Fix Debian package build, mk. 2 --- travis/travis-build.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 27a770647..14258c293 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -80,6 +80,9 @@ mv out/runtime out/runtime-"$ARCH" sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages +cp CPackConfig.cmake CPackConfig.cmake.pre +sed -i 's|/AppImageKit|'$(dirname "$PWD")'|' CPackConfig.cmake +diff -u CPackConfig.cmake.pre CPack*.cmake cpack -V mv *.deb out/ From 3bd50c26179819027649a45b40ad41c429de4633 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 10 Jan 2018 23:00:20 +0100 Subject: [PATCH 009/544] Fix Debian package build, mk. 3 --- travis/travis-build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 14258c293..5646518b3 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -81,8 +81,8 @@ sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages cp CPackConfig.cmake CPackConfig.cmake.pre -sed -i 's|/AppImageKit|'$(dirname "$PWD")'|' CPackConfig.cmake -diff -u CPackConfig.cmake.pre CPack*.cmake +sed -i 's|/AppImageKit|'$(dirname "$PWD")'|' CPack*.cmake +diff -u CPackConfig.cmake.pre CPackConfig.cmake cpack -V mv *.deb out/ From 1eab4c4a55ae5bf5e5f0d13d276aa6ca7addea2a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 10 Jan 2018 23:09:33 +0100 Subject: [PATCH 010/544] Fix Debian package build, mk. 4 --- travis/travis-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 5646518b3..c7813d7b0 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -81,7 +81,7 @@ sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages cp CPackConfig.cmake CPackConfig.cmake.pre -sed -i 's|/AppImageKit|'$(dirname "$PWD")'|' CPack*.cmake +sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' CPack*.cmake diff -u CPackConfig.cmake.pre CPackConfig.cmake cpack -V From cc4e3821719ccde95e1cea922b1fe2a43a17c560 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 10 Jan 2018 23:09:54 +0100 Subject: [PATCH 011/544] Fix Debian package build, mk. 5 --- travis/travis-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index c7813d7b0..5256e3a7c 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -82,7 +82,7 @@ sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages cp CPackConfig.cmake CPackConfig.cmake.pre sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' CPack*.cmake -diff -u CPackConfig.cmake.pre CPackConfig.cmake +diff -u CPackConfig.cmake.pre CPackConfig.cmake || true cpack -V mv *.deb out/ From 8dd90abee58b7f76d05b830fb45243a16e313049 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 10 Jan 2018 23:18:24 +0100 Subject: [PATCH 012/544] Fix Debian package build, mk. 6 --- travis/travis-build.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 5256e3a7c..746197681 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -80,9 +80,8 @@ mv out/runtime out/runtime-"$ARCH" sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages -cp CPackConfig.cmake CPackConfig.cmake.pre sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' CPack*.cmake -diff -u CPackConfig.cmake.pre CPackConfig.cmake || true +find _CPack_Packages -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' cpack -V mv *.deb out/ From 53392811e4578df011b03adc195241e17dc8f98c Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 10 Jan 2018 23:19:58 +0100 Subject: [PATCH 013/544] Fix Debian package build, mk. 7 --- travis/travis-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 746197681..19e608aee 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -82,7 +82,7 @@ sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' CPack*.cmake find _CPack_Packages -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' -cpack -V +cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log mv *.deb out/ From d4b5e48fb024c572e00f11b7aebba627d1a7b5fc Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 10 Jan 2018 23:25:44 +0100 Subject: [PATCH 014/544] Fix Debian package build, mk. 8 --- travis/travis-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 19e608aee..49324f29a 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -81,7 +81,7 @@ sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' CPack*.cmake -find _CPack_Packages -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' +find _CPack_Packages -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' \; cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log mv *.deb out/ From 364bf6c0d835ad8a673f24177292defd5ddc572a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 10 Jan 2018 23:26:19 +0100 Subject: [PATCH 015/544] Fix Debian package build, mk. 9 --- travis/travis-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 49324f29a..0d3ebc9c9 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -82,7 +82,7 @@ sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' CPack*.cmake find _CPack_Packages -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' \; -cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log +cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log && exit 1 mv *.deb out/ From b6e0157d5c0a7b86552eaeddbdd4cced73d5c56c Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 11 Jan 2018 00:54:04 +0100 Subject: [PATCH 016/544] Fix Debian package build, mk. 10 --- travis/travis-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 0d3ebc9c9..a2a132d3f 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -81,7 +81,7 @@ sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' CPack*.cmake -find _CPack_Packages -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' \; +find _CPack_Packages -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' \; || true cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log && exit 1 mv *.deb out/ From 2d41a18512abfba48a63c869577203da79d86de7 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 11 Jan 2018 01:04:44 +0100 Subject: [PATCH 017/544] Fix Debian package build, mk. 11 --- travis/travis-build.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index a2a132d3f..a1ea25eb4 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -80,8 +80,7 @@ mv out/runtime out/runtime-"$ARCH" sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages -sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' CPack*.cmake -find _CPack_Packages -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' \; || true +sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' * cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log && exit 1 mv *.deb out/ From 4e691c818d856b0e78cc14422253b81a5ff96902 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 11 Jan 2018 01:11:10 +0100 Subject: [PATCH 018/544] Fix Debian package build, mk. 12 --- travis/travis-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index a1ea25eb4..30754d046 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -80,7 +80,7 @@ mv out/runtime out/runtime-"$ARCH" sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages -sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' * +find . -maxdepth 0 -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' "{}" \; cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log && exit 1 mv *.deb out/ From 194eda96df9e4cdb3c111fa7623d1982c2ba9b6d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 11 Jan 2018 02:09:15 +0100 Subject: [PATCH 019/544] Fix Debian package build, mk. 13 --- travis/travis-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 30754d046..1fc9cb500 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -80,7 +80,7 @@ mv out/runtime out/runtime-"$ARCH" sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages -find . -maxdepth 0 -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' "{}" \; +find . -maxdepth 1 -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' "{}" \; cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log && exit 1 mv *.deb out/ From 7a4dcc7f1447efdc3e5cf9c30e7388b857412aa3 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 11 Jan 2018 02:22:17 +0100 Subject: [PATCH 020/544] Fix Debian package build, mk. 14 --- travis/travis-build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 1fc9cb500..c5a1c164a 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -81,6 +81,7 @@ sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages find . -maxdepth 1 -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' "{}" \; +cmake . cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log && exit 1 mv *.deb out/ From 8d0751de7d4bd902e12392bd38f81956c073d13c Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 11 Jan 2018 02:33:01 +0100 Subject: [PATCH 021/544] Fix Debian package build, mk. 15 --- travis/travis-build.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index c5a1c164a..98bd824d3 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -80,8 +80,7 @@ mv out/runtime out/runtime-"$ARCH" sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages -find . -maxdepth 1 -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' "{}" \; -cmake . +find . -maxdepth 1 -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' "{}" \; cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log && exit 1 mv *.deb out/ From 305af551120e84a7faf80a79d9646d6bbfa317f0 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 11 Jan 2018 02:44:40 +0100 Subject: [PATCH 022/544] Fix Debian package build, mk. 16 --- travis/travis-build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 98bd824d3..fe686539b 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -80,7 +80,8 @@ mv out/runtime out/runtime-"$ARCH" sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages -find . -maxdepth 1 -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' "{}" \; +find . -not -executable -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' "{}" \; +cmake --build . --target "preinstall" cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log && exit 1 mv *.deb out/ From b25ca9907a46f42de07065c21a5f810daf852fca Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 5 Feb 2018 23:35:18 +0100 Subject: [PATCH 023/544] Add -mkfs-fixed-time flag to mksquashfs --- cmake/dependencies.cmake | 5 +- src/mksquashfs-mkfs-fixed-timestamp.patch | 57 +++++++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 src/mksquashfs-mkfs-fixed-timestamp.patch diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index ce1dbf5ce..581932cd3 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -97,6 +97,7 @@ ExternalProject_Add(mksquashfs GIT_REPOSITORY https://github.com/plougher/squashfs-tools/ GIT_TAG 5be5d61 UPDATE_COMMAND "" # make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time + PATCH_COMMAND patch -N -p1 < ${PROJECT_SOURCE_DIR}/src/mksquashfs-mkfs-fixed-timestamp.patch || true CONFIGURE_COMMAND sed -i "s|CFLAGS += -DXZ_SUPPORT|CFLAGS += -DXZ_SUPPORT -I${xz_INCLUDE_DIR}|g" /squashfs-tools/Makefile COMMAND sed -i "s|LIBS += -llzma|LIBS += -Bstatic ${xz_LIBRARIES}|g" /squashfs-tools/Makefile COMMAND sed -i "s|install: mksquashfs unsquashfs|install: mksquashfs|g" squashfs-tools/Makefile @@ -127,8 +128,8 @@ if(NOT USE_SYSTEM_INOTIFY_TOOLS) ExternalProject_Add(inotify-tools URL https://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz URL_HASH SHA512=6074d510e89bba5da0d7c4d86f2562c662868666ba0a7ea5d73e53c010a0050dd1fc01959b22cffdb9b8a35bd1b0b43c04d02d6f19927520f05889e8a9297dfb - PATCH_COMMAND wget -N "https://git.savannah.gnu.org/gitweb/?p=config.git$%3CSEMICOLON%3Ea=blob_plain$%3CSEMICOLON%3Ef=config.guess$%3CSEMICOLON%3Ehb=HEAD" -O config.guess - COMMAND wget -N "https://git.savannah.gnu.org/gitweb/?p=config.git$%3CSEMICOLON%3Ea=blob_plain$%3CSEMICOLON%3Ef=config.sub$%3CSEMICOLON%3Ehb=HEAD" -O config.sub + PATCH_COMMAND wget -N --content-disposition "https://git.savannah.gnu.org/gitweb/?p=config.git$%3CSEMICOLON%3Ea=blob_plain$%3CSEMICOLON%3Ef=config.guess$%3CSEMICOLON%3Ehb=HEAD" + COMMAND wget -N --content-disposition "https://git.savannah.gnu.org/gitweb/?p=config.git$%3CSEMICOLON%3Ea=blob_plain$%3CSEMICOLON%3Ef=config.sub$%3CSEMICOLON%3Ehb=HEAD" UPDATE_COMMAND "" # make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time CONFIGURE_COMMAND /configure --enable-shared --enable-static --enable-doxygen=no --prefix= --libdir=/lib BUILD_COMMAND make diff --git a/src/mksquashfs-mkfs-fixed-timestamp.patch b/src/mksquashfs-mkfs-fixed-timestamp.patch new file mode 100644 index 000000000..d95ffd3ad --- /dev/null +++ b/src/mksquashfs-mkfs-fixed-timestamp.patch @@ -0,0 +1,57 @@ +>From 9575f13b1f865523f020bff460c5a37a078c2b6d Mon Sep 17 00:00:00 2001 +From: intrigeri +Date: Sun, 20 Nov 2016 15:56:13 +0000 +Subject: [PATCH 1/2] Add a -mkfs-fixed-time option, to allow + overriding the filesystem creation time for reproducible builds. + +Based on a patch by Alexander Couzens posted on +https://sourceforge.net/p/squashfs/mailman/message/34673610/ + +Edited by @TheAssassin to work with the current development version of +mksquashfs. +--- + squashfs-tools/mksquashfs.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c +index 13d60f7..e21e251 100644 +--- a/squashfs-tools/mksquashfs.c 2018-02-05 23:26:27.882300146 +0100 ++++ b/squashfs-tools/mksquashfs.c 2018-02-05 23:26:05.382276655 +0100 +@@ -131,6 +131,9 @@ + /* inode lookup table */ + squashfs_inode *inode_lookup_table = NULL; + ++/* override filesystem creation time */ ++time_t mkfs_fixed_time = -1; ++ + /* in memory directory data */ + #define I_COUNT_SIZE 128 + #define DIR_ENTRIES 32 +@@ -5353,6 +5356,15 @@ + force_progress = TRUE; + else if(strcmp(argv[i], "-no-exports") == 0) + exportable = FALSE; ++ else if(strcmp(argv[i], "-mkfs-fixed-time") == 0) { ++ if((++i == argc) || (mkfs_fixed_time = ++ strtoll(argv[i], &b, 10), *b != '\0')) { ++ ERROR("%s: -mkfs-fixed-time missing or invalid " ++ "timestamp\n", argv[0]); ++ ++ exit(1); ++ } ++ } + else if(strcmp(argv[i], "-offset") == 0 || + strcmp(argv[i], "-o") ==0) { + if(++i == argc) { +@@ -6031,7 +6043,7 @@ + sBlk.flags = SQUASHFS_MKFLAGS(noI, noD, noF, noX, no_fragments, + always_use_fragments, duplicate_checking, exportable, + no_xattrs, comp_opts); +- sBlk.mkfs_time = time(NULL); ++ sBlk.mkfs_time = mkfs_fixed_time != -1 ? mkfs_fixed_time : time(NULL); + + disable_info(); + +-- +2.10.2 + From 3d8733b587701fc9f23ac3d25a06e0910ac9a76b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 5 Feb 2018 23:38:00 +0100 Subject: [PATCH 024/544] Reproducible builds, mk. 1 See issue #625. Uses fixed timestamp "0" for now. --- src/appimagetool.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index c239b56ba..9f4a109bb 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -136,7 +136,7 @@ int sfs_mksquashfs(char *source, char *destination, int offset) { waitpid(pid, &status, 0); } else { // we are the child - gchar *offset_string; + gchar* offset_string; offset_string = g_strdup_printf("%i", offset); char* args[32]; @@ -154,7 +154,7 @@ int sfs_mksquashfs(char *source, char *destination, int offset) { args[i++] = offset_string; args[i++] = "-comp"; - if(use_xz) + if (use_xz) args[i++] = "xz"; else args[i++] = sqfs_comp; @@ -162,7 +162,7 @@ int sfs_mksquashfs(char *source, char *destination, int offset) { args[i++] = "-root-owned"; args[i++] = "-noappend"; - if(use_xz) { + if (use_xz) { // https://jonathancarter.org/2015/04/06/squashfs-performance-testing/ says: // improved performance by using a 16384 block size with a sacrifice of around 3% more squashfs image space args[i++] = "-Xdict-size"; @@ -172,7 +172,7 @@ int sfs_mksquashfs(char *source, char *destination, int offset) { } // check if ignore file exists and use it if possible - if(access(APPIMAGEIGNORE, F_OK) >= 0) { + if (access(APPIMAGEIGNORE, F_OK) >= 0) { printf("Including %s", APPIMAGEIGNORE); args[i++] = "-wildcards"; args[i++] = "-ef"; @@ -183,8 +183,8 @@ int sfs_mksquashfs(char *source, char *destination, int offset) { } // if an exclude file has been passed on the command line, should be used, too - if(exclude_file != 0 && strlen(exclude_file) > 0) { - if(access(exclude_file, F_OK) < 0) { + if (exclude_file != 0 && strlen(exclude_file) > 0) { + if (access(exclude_file, F_OK) < 0) { printf("WARNING: exclude file %s not found!", exclude_file); return -1; } @@ -194,8 +194,19 @@ int sfs_mksquashfs(char *source, char *destination, int offset) { args[i++] = exclude_file; } + args[i++] = "-mkfs-fixed-time"; + args[i++] = "0"; + args[i++] = 0; + if (verbose) { + printf("mksquashfs commandline: "); + for (char** t = args; *t != 0; t++) { + printf("%s ", *t); + } + printf("\n"); + } + #ifndef AUXILIARY_FILES_DESTINATION execvp("mksquashfs", args); #else From 8251916335646b4fc51ea4910f8f083f6608db62 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 5 Feb 2018 23:38:17 +0100 Subject: [PATCH 025/544] Add test for reproducible builds --- test-appimagetool.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/test-appimagetool.sh b/test-appimagetool.sh index ce2893f72..8e656232e 100755 --- a/test-appimagetool.sh +++ b/test-appimagetool.sh @@ -52,7 +52,7 @@ cd "$tempdir" log "create a sample AppDir" mkdir -p appimagetool.AppDir/usr/share/metainfo/ cp "$thisdir"/resources/{appimagetool.*,AppRun} appimagetool.AppDir/ -cp "$thisdir"/resources/usr/share/metainfo/appimagetool.appdata.xml appimagetool.AppDir/usr/share/metainfo/ +#cp "$thisdir"/resources/usr/share/metainfo/appimagetool.appdata.xml appimagetool.AppDir/usr/share/metainfo/ cp "$appimagetool" appimagetool.AppDir/ mkdir -p appimagetool.AppDir/usr/share/applications cp appimagetool.AppDir/appimagetool.desktop appimagetool.AppDir/usr/share/applications @@ -81,3 +81,13 @@ echo "to-be-ignored-too" > .appimageignore "$appimagetool" appimagetool.AppDir appimagetool.AppImage --exclude-file ignore "$appimagetool" -l appimagetool.AppImage | grep -q to-be-ignored || true "$appimagetool" -l appimagetool.AppImage | grep -q to-be-ignored-too || true + +log "check whether AppImages built from the exact same AppDir are the same files (reproducible builds, #625)" +"$appimagetool" appimagetool.AppDir appimagetool.AppImage.1 +"$appimagetool" appimagetool.AppDir appimagetool.AppImage.2 +hash1=$(sha256sum appimagetool.AppImage.1 | awk '{print $1}') +hash2=$(sha256sum appimagetool.AppImage.2 | awk '{print $1}') +if [ "$hash1" != "$hash2" ]; then + echo "Hash $hash1 doesn't match hash $hash2!" + exit 1 +fi From fcc037475e7fbb20604551f222fc642f8eb87356 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sat, 17 Feb 2018 23:51:35 +0100 Subject: [PATCH 026/544] Document $HOME/Applications [ci skip] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c374786f7..d80661773 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,7 @@ It will register the AppImages in with your system from the following places: * $HOME/Downloads (or its localized equivalent, as determined by `G_USER_DIRECTORY_DOWNLOAD` in glib) * $HOME/.local/bin * $HOME/bin +* $HOME/Applications * /Applications * /isodevice/Applications * /isofrom/Applications From 09dfd37b6115881800fd35489b413032942b9859 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sat, 17 Feb 2018 23:52:57 +0100 Subject: [PATCH 027/544] Add $HOME/Applications As requested in https://github.com/nomad-desktop/nx-software-center/issues/12#issuecomment-366467639 --- src/appimaged.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/appimaged.c b/src/appimaged.c index fea5ecfe5..64965222d 100644 --- a/src/appimaged.c +++ b/src/appimaged.c @@ -322,6 +322,7 @@ int main(int argc, char ** argv) { add_dir_to_watch(g_get_user_special_dir(G_USER_DIRECTORY_DOWNLOAD)); add_dir_to_watch(g_build_filename(g_get_home_dir(), "/bin", NULL)); add_dir_to_watch(g_build_filename(g_get_home_dir(), "/.bin", NULL)); + add_dir_to_watch(g_build_filename(g_get_home_dir(), "/Applications", NULL)); add_dir_to_watch(g_build_filename("/Applications", NULL)); // Perhaps we should determine the following dynamically using something like // mount | grep -i iso | head -n 1 | cut -d ' ' -f 3 From 4c61122adb9f2f63b3677127b465c71397010498 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 26 Feb 2018 13:18:23 +0100 Subject: [PATCH 028/544] Try to fix runtime build dependency finding issues Fixes #666. --- src/build-runtime.sh.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/build-runtime.sh.in b/src/build-runtime.sh.in index 84628e8e1..f01a53a02 100755 --- a/src/build-runtime.sh.in +++ b/src/build-runtime.sh.in @@ -53,8 +53,8 @@ objcopy --add-section .sha256_sig=1024_blank_bytes \ # TODO: squashfuse_LIBRARIES is a semicolon separated list of values that has to be split during runtime of this script squashfuse_libs="@squashfuse_LIBRARIES@" $CC $small_FLAGS $small_LDFLAGS -o runtime "$repo_root"/elf.c "$repo_root"/notify.c "$repo_root"/getsection.c \ - runtime3.o ${squashfuse_libs//;/ } -L"@xz_LIBRARIES_DIR@" \ - -Wl,-Bdynamic -lpthread -lz -Wl,-Bstatic -llzma -Wl,-Bdynamic -ldl + runtime3.o ${squashfuse_libs//;/ } \ + -Wl,-Bdynamic -lpthread -l"@ZLIB_LIBRARIES@" -Wl,-Bstatic "@xz_LIBRARIES@" -Wl,-Bdynamic -ldl $STRIP runtime # Test if we can read it back From 4b0267ba65f83d10bc95e15e10d96cc06688ed9c Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 26 Feb 2018 15:57:36 +0100 Subject: [PATCH 029/544] Fix include guard (like light_byteswap.h) --- src/light_elf.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/light_elf.h b/src/light_elf.h index 7b81b480d..d6044a711 100644 --- a/src/light_elf.h +++ b/src/light_elf.h @@ -21,8 +21,8 @@ * */ -#ifndef _ELF_H -#define _ELF_H 1 +#ifndef LIGHT_ELF_H +#define LIGHT_ELF_H #include From 7c72f1ddd82228c21efcb0184f6cb5ace127bc44 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 26 Feb 2018 23:10:02 +0100 Subject: [PATCH 030/544] Reformat code --- src/getsection.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/getsection.c b/src/getsection.c index 42a53923f..afda0523e 100644 --- a/src/getsection.c +++ b/src/getsection.c @@ -7,10 +7,10 @@ #include "light_elf.h" /* Return the offset, and the length of an ELF section with a given name in a given ELF file */ -int get_elf_section_offset_and_length(const char* fname, const char* section_name, unsigned long *offset, unsigned long *length) -{ - uint8_t *data; - int i; +int get_elf_section_offset_and_length(const char* fname, const char* section_name, unsigned long* offset, + unsigned long* length) { + uint8_t* data; + int i; int fd = open(fname, O_RDONLY); data = mmap(NULL, lseek(fd, 0, SEEK_END), PROT_READ, MAP_SHARED, fd, 0); @@ -22,39 +22,39 @@ int get_elf_section_offset_and_length(const char* fname, const char* section_nam elf = (Elf32_Ehdr *) data; shdr = (Elf32_Shdr *) (data + elf->e_shoff); #elif __SIZEOF_POINTER__ == 8 - Elf64_Ehdr *elf; - Elf64_Shdr *shdr; - elf = (Elf64_Ehdr *) data; - shdr = (Elf64_Shdr *) (data + elf->e_shoff); + Elf64_Ehdr* elf; + Elf64_Shdr* shdr; + elf = (Elf64_Ehdr*) data; + shdr = (Elf64_Shdr*) (data + elf->e_shoff); #else #error Platforms other than 32-bit/64-bit are currently not supported! #endif - char *strTab = (char *)(data + shdr[elf->e_shstrndx].sh_offset); - for(i = 0; i < elf->e_shnum; i++) { - if(strcmp(&strTab[shdr[i].sh_name], section_name) == 0) { - *offset = shdr[i].sh_offset; - *length = shdr[i].sh_size; + char* strTab = (char*) (data + shdr[elf->e_shstrndx].sh_offset); + for (i = 0; i < elf->e_shnum; i++) { + if (strcmp(&strTab[shdr[i].sh_name], section_name) == 0) { + *offset = shdr[i].sh_offset; + *length = shdr[i].sh_size; } } close(fd); - return(0); + return (0); } -void print_hex(char* fname, unsigned long offset, unsigned long length){ - uint8_t *data; +void print_hex(char* fname, unsigned long offset, unsigned long length) { + uint8_t* data; unsigned long k; int fd = open(fname, O_RDONLY); data = mmap(NULL, lseek(fd, 0, SEEK_END), PROT_READ, MAP_SHARED, fd, 0); close(fd); for (k = offset; k < offset + length; k++) { printf("%x", data[k]); - } - printf("\n"); + } + printf("\n"); } -void print_binary(char* fname, unsigned long offset, unsigned long length){ - uint8_t *data; +void print_binary(char* fname, unsigned long offset, unsigned long length) { + uint8_t* data; unsigned long k, endpos; int fd = open(fname, O_RDONLY); From 366af220fe493a56744a9908101e345f6cba3097 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 26 Feb 2018 23:11:13 +0100 Subject: [PATCH 031/544] Add missing casts --- src/getsection.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/getsection.c b/src/getsection.c index afda0523e..f7438aef7 100644 --- a/src/getsection.c +++ b/src/getsection.c @@ -12,7 +12,7 @@ int get_elf_section_offset_and_length(const char* fname, const char* section_nam uint8_t* data; int i; int fd = open(fname, O_RDONLY); - data = mmap(NULL, lseek(fd, 0, SEEK_END), PROT_READ, MAP_SHARED, fd, 0); + data = mmap(NULL, (size_t) lseek(fd, 0, SEEK_END), PROT_READ, MAP_SHARED, fd, 0); // optionally add more architectures for 32-bit builds so that it doesn't fall back to Elf64_* // see e.g. https://sourceforge.net/p/predef/wiki/Architectures/ for more predefined macro names @@ -45,7 +45,7 @@ void print_hex(char* fname, unsigned long offset, unsigned long length) { uint8_t* data; unsigned long k; int fd = open(fname, O_RDONLY); - data = mmap(NULL, lseek(fd, 0, SEEK_END), PROT_READ, MAP_SHARED, fd, 0); + data = mmap(NULL, (size_t) lseek(fd, 0, SEEK_END), PROT_READ, MAP_SHARED, fd, 0); close(fd); for (k = offset; k < offset + length; k++) { printf("%x", data[k]); @@ -58,7 +58,7 @@ void print_binary(char* fname, unsigned long offset, unsigned long length) { unsigned long k, endpos; int fd = open(fname, O_RDONLY); - data = mmap(NULL, lseek(fd, 0, SEEK_END), PROT_READ, MAP_SHARED, fd, 0); + data = mmap(NULL, (size_t) lseek(fd, 0, SEEK_END), PROT_READ, MAP_SHARED, fd, 0); close(fd); endpos = offset + length; From b111f4727dbb6916eefdc183e768ba73070a8e2e Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 26 Feb 2018 23:25:58 +0100 Subject: [PATCH 032/544] Clean up mapped file data --- src/getsection.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/getsection.c b/src/getsection.c index f7438aef7..a14942c93 100644 --- a/src/getsection.c +++ b/src/getsection.c @@ -12,7 +12,10 @@ int get_elf_section_offset_and_length(const char* fname, const char* section_nam uint8_t* data; int i; int fd = open(fname, O_RDONLY); - data = mmap(NULL, (size_t) lseek(fd, 0, SEEK_END), PROT_READ, MAP_SHARED, fd, 0); + size_t map_size = (size_t) lseek(fd, 0, SEEK_END); + + data = mmap(NULL, map_size, PROT_READ, MAP_SHARED, fd, 0); + close(fd); // optionally add more architectures for 32-bit builds so that it doesn't fall back to Elf64_* // see e.g. https://sourceforge.net/p/predef/wiki/Architectures/ for more predefined macro names @@ -37,19 +40,28 @@ int get_elf_section_offset_and_length(const char* fname, const char* section_nam *length = shdr[i].sh_size; } } - close(fd); + + munmap(data, map_size); + return (0); } void print_hex(char* fname, unsigned long offset, unsigned long length) { uint8_t* data; unsigned long k; + int fd = open(fname, O_RDONLY); + size_t map_size = (size_t) lseek(fd, 0, SEEK_END); + data = mmap(NULL, (size_t) lseek(fd, 0, SEEK_END), PROT_READ, MAP_SHARED, fd, 0); close(fd); + for (k = offset; k < offset + length; k++) { printf("%x", data[k]); } + + munmap(data, map_size); + printf("\n"); } @@ -58,7 +70,9 @@ void print_binary(char* fname, unsigned long offset, unsigned long length) { unsigned long k, endpos; int fd = open(fname, O_RDONLY); - data = mmap(NULL, (size_t) lseek(fd, 0, SEEK_END), PROT_READ, MAP_SHARED, fd, 0); + size_t map_size = (size_t) lseek(fd, 0, SEEK_END); + + data = mmap(NULL, map_size, PROT_READ, MAP_SHARED, fd, 0); close(fd); endpos = offset + length; @@ -67,6 +81,8 @@ void print_binary(char* fname, unsigned long offset, unsigned long length) { printf("%c", data[k]); } + munmap(data, map_size); + printf("\n"); } From 8a6a28081d4548219ef5dc2deb9ca06d8fa276aa Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 26 Feb 2018 23:43:05 +0100 Subject: [PATCH 033/544] Don't map entire file to print ELF sections --- src/getsection.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/getsection.c b/src/getsection.c index a14942c93..ab4904f5f 100644 --- a/src/getsection.c +++ b/src/getsection.c @@ -51,16 +51,15 @@ void print_hex(char* fname, unsigned long offset, unsigned long length) { unsigned long k; int fd = open(fname, O_RDONLY); - size_t map_size = (size_t) lseek(fd, 0, SEEK_END); - data = mmap(NULL, (size_t) lseek(fd, 0, SEEK_END), PROT_READ, MAP_SHARED, fd, 0); + data = mmap(NULL, length, PROT_READ, MAP_SHARED, fd, offset); close(fd); - for (k = offset; k < offset + length; k++) { + for (k = 0; k < length; k++) { printf("%x", data[k]); } - munmap(data, map_size); + munmap(data, length); printf("\n"); } @@ -70,18 +69,15 @@ void print_binary(char* fname, unsigned long offset, unsigned long length) { unsigned long k, endpos; int fd = open(fname, O_RDONLY); - size_t map_size = (size_t) lseek(fd, 0, SEEK_END); - data = mmap(NULL, map_size, PROT_READ, MAP_SHARED, fd, 0); + data = mmap(NULL, length, PROT_READ, MAP_SHARED, fd, offset); close(fd); - endpos = offset + length; - - for (k = offset; k < endpos && data[k] != '\0'; k++) { + for (k = 0; k < length && data[k] != '\0'; k++) { printf("%c", data[k]); } - munmap(data, map_size); + munmap(data, length); printf("\n"); } From c7020174cb0f7f3235fb41326ca0450f72cb253e Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 26 Feb 2018 23:50:01 +0100 Subject: [PATCH 034/544] Unmap mapped data properly Also replaces elf.h with light_elf.h used otherwise. In theory, that should enable validate to be built on other platforms as well. --- src/validate.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/validate.c b/src/validate.c index 585164b64..66330f875 100644 --- a/src/validate.c +++ b/src/validate.c @@ -13,11 +13,11 @@ #include #include #include -#include #include #include #include "getsection.h" +#include "light_elf.h" typedef unsigned char byte; @@ -128,20 +128,21 @@ int main(int argc,char **argv) { char *signaturefile; signaturefile = g_strconcat("/tmp/", basename(g_strconcat(filename, ".sig", NULL)), NULL); - uint8_t *data; + uint8_t *data; unsigned long k; int fd = open(filename, O_RDONLY); - data = mmap(NULL, lseek(fd, 0, SEEK_END), PROT_READ, MAP_SHARED, fd, 0); + data = mmap(NULL, skip_length, PROT_READ, MAP_SHARED, fd, skip_offset); close(fd); FILE *fpdst2 = fopen(signaturefile, "w"); if (fpdst2 == NULL) { fprintf(stderr, "Not able to open the signature file for writing, aborting"); exit(1); } - for (k = skip_offset; k < skip_offset + skip_length; k++) { + for (k = 0; k < skip_length; k++) { fprintf(fpdst2, "%c", data[k]); } - fclose(fpdst2); + fclose(fpdst2); + munmap(data, skip_length); struct stat st; stat(filename, &st); From ab97c2aaf9063c4b114a5d8830ce0a87d5705c78 Mon Sep 17 00:00:00 2001 From: Kurt Pfeifle Date: Tue, 27 Feb 2018 20:37:19 +0100 Subject: [PATCH 035/544] Make whitespace consistent (#673) - Remove all trailing whitespace - Remove all spaces and tabs on otherwise empty lines - Convert tabs into spaces (file used mostly spaces before) --- src/runtime.c | 186 +++++++++++++++++++++++++------------------------- 1 file changed, 93 insertions(+), 93 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index bcf21e5ea..5765724b7 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -1,20 +1,20 @@ /************************************************************************** - * + * * Copyright (c) 2004-18 Simon Peter * Portions Copyright (c) 2007 Alexander Larsson - * + * * All Rights Reserved. - * + * * 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 @@ -22,7 +22,7 @@ * 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. - * + * **************************************************************************/ #ident "AppImage by Simon Peter, http://appimage.org/" @@ -73,7 +73,7 @@ bool is_writable_directory(char* str) { if(access(str, W_OK) == 0) { return true; } else { - return false; + return false; } } @@ -86,37 +86,37 @@ bool startsWith(const char *pre, const char *str) /* Fill in a stat structure. Does not set st_ino */ sqfs_err private_sqfs_stat(sqfs *fs, sqfs_inode *inode, struct stat *st) { - sqfs_err err = SQFS_OK; - uid_t id; - - memset(st, 0, sizeof(*st)); - st->st_mode = inode->base.mode; - st->st_nlink = inode->nlink; - st->st_mtime = st->st_ctime = st->st_atime = inode->base.mtime; - - if (S_ISREG(st->st_mode)) { - /* FIXME: do symlinks, dirs, etc have a size? */ - st->st_size = inode->xtra.reg.file_size; - st->st_blocks = st->st_size / 512; - } else if (S_ISBLK(st->st_mode) || S_ISCHR(st->st_mode)) { - st->st_rdev = sqfs_makedev(inode->xtra.dev.major, - inode->xtra.dev.minor); - } else if (S_ISLNK(st->st_mode)) { - st->st_size = inode->xtra.symlink_size; - } - - st->st_blksize = fs->sb.block_size; /* seriously? */ - - err = sqfs_id_get(fs, inode->base.uid, &id); - if (err) - return err; - st->st_uid = id; - err = sqfs_id_get(fs, inode->base.guid, &id); - st->st_gid = id; - if (err) - return err; - - return SQFS_OK; + sqfs_err err = SQFS_OK; + uid_t id; + + memset(st, 0, sizeof(*st)); + st->st_mode = inode->base.mode; + st->st_nlink = inode->nlink; + st->st_mtime = st->st_ctime = st->st_atime = inode->base.mtime; + + if (S_ISREG(st->st_mode)) { + /* FIXME: do symlinks, dirs, etc have a size? */ + st->st_size = inode->xtra.reg.file_size; + st->st_blocks = st->st_size / 512; + } else if (S_ISBLK(st->st_mode) || S_ISCHR(st->st_mode)) { + st->st_rdev = sqfs_makedev(inode->xtra.dev.major, + inode->xtra.dev.minor); + } else if (S_ISLNK(st->st_mode)) { + st->st_size = inode->xtra.symlink_size; + } + + st->st_blksize = fs->sb.block_size; /* seriously? */ + + err = sqfs_id_get(fs, inode->base.uid, &id); + if (err) + return err; + st->st_uid = id; + err = sqfs_id_get(fs, inode->base.guid, &id); + st->st_gid = id; + if (err) + return err; + + return SQFS_OK; } /* ================= End ELF parsing */ @@ -170,15 +170,15 @@ mkdir_p(const char *path) /* Adapted from http://stackoverflow.com/a/2336245/119527 */ const size_t len = strlen(path); char _path[PATH_MAX]; - char *p; + char *p; errno = 0; /* Copy string so its mutable */ if (len > sizeof(_path)-1) { errno = ENAMETOOLONG; - return -1; - } + return -1; + } strcpy(_path, path); /* Iterate the string */ @@ -189,17 +189,17 @@ mkdir_p(const char *path) if (mkdir(_path, S_IRWXU) != 0) { if (errno != EEXIST) - return -1; + return -1; } *p = '/'; } - } + } if (mkdir(_path, S_IRWXU) != 0) { if (errno != EEXIST) - return -1; - } + return -1; + } return 0; } @@ -272,10 +272,10 @@ main (int argc, char *argv[]) char appimage_path[PATH_MAX]; char argv0_path[PATH_MAX]; char * arg; - + /* We might want to operate on a target appimage rather than this file itself, * e.g., for appimaged which must not run untrusted code from random AppImages. - * This variable is intended for use by e.g., appimaged and is subject to + * This variable is intended for use by e.g., appimaged and is subject to * change any time. Do not rely on it being present. We might even limit this * functionality specifically for builds used by appimaged. */ @@ -285,11 +285,11 @@ main (int argc, char *argv[]) sprintf(appimage_path, "%s", getenv("TARGET_APPIMAGE")); fprintf(stderr, "Using TARGET_APPIMAGE %s\n", appimage_path); } - + sprintf(argv0_path, argv[0]); fs_offset = get_elf_size(appimage_path); - + arg=getArg(argc,argv,'-'); /* Print the help and then exit */ @@ -312,7 +312,7 @@ main (int argc, char *argv[]) printf("%lu\n", fs_offset); exit(0); } - + /* Exract the AppImage */ arg=getArg(argc,argv,'-'); if(arg && strcmp(arg,"appimage-extract")==0) { @@ -322,24 +322,24 @@ main (int argc, char *argv[]) char *pattern; char *prefix; char prefixed_path_to_extract[1024]; - + prefix = "squashfs-root/"; - + if(access(prefix, F_OK ) == -1 ) { if (mkdir_p(prefix) == -1) { perror("mkdir_p error"); exit(EXIT_FAILURE); } } - + if(argc == 3){ pattern = argv[2]; - if (pattern[0] == '/') pattern++; // Remove leading '/' - } - + if (pattern[0] == '/') pattern++; // Remove leading '/' + } + if ((err = sqfs_open_image(&fs, appimage_path, fs_offset))) exit(1); - + if ((err = sqfs_traverse_open(&trv, &fs, sqfs_inode_root(&fs)))) die("sqfs_traverse_open error"); while (sqfs_traverse_next(&trv, &err)) { @@ -354,7 +354,7 @@ main (int argc, char *argv[]) // fprintf(stderr, "inode.xtra.reg.file_size: %lu\n", inode.xtra.reg.file_size); strcpy(prefixed_path_to_extract, ""); strcat(strcat(prefixed_path_to_extract, prefix), trv.path); - fprintf(stderr, "%s\n", prefixed_path_to_extract); + fprintf(stderr, "%s\n", prefixed_path_to_extract); if(inode.base.inode_type == SQUASHFS_DIR_TYPE || inode.base.inode_type == SQUASHFS_LDIR_TYPE){ // fprintf(stderr, "inode.xtra.dir.parent_inode: %ui\n", inode.xtra.dir.parent_inode); // fprintf(stderr, "mkdir_p: %s/\n", prefixed_path_to_extract); @@ -411,12 +411,12 @@ main (int argc, char *argv[]) sqfs_fd_close(fs.fd); exit(0); } - + if(arg && strcmp(arg,"appimage-version")==0) { fprintf(stderr,"Version: %s\n", GIT_COMMIT); exit(0); } - + if(arg && (strcmp(arg,"appimage-updateinformation")==0 || strcmp(arg,"appimage-updateinfo")==0)) { unsigned long offset = 0; unsigned long length = 0; @@ -427,7 +427,7 @@ main (int argc, char *argv[]) print_binary(appimage_path, offset, length); exit(0); } - + if(arg && strcmp(arg,"appimage-signature")==0) { unsigned long offset = 0; unsigned long length = 0; @@ -462,46 +462,46 @@ main (int argc, char *argv[]) strncpy(mount_dir+12, basename(argv[0]), namelen); strncpy(mount_dir+12+namelen, "XXXXXX", 6); mount_dir[12+namelen+6] = 0; // null terminate destination - + char filename[100]; /* enough for mount_dir + "/AppRun" */ pid_t pid; char **real_argv; int i; - + if (mkdtemp(mount_dir) == NULL) { exit (1); } - + if (pipe (keepalive_pipe) == -1) { perror ("pipe error"); exit (1); } - + pid = fork (); if (pid == -1) { perror ("fork error"); exit (1); } - + if (pid == 0) { /* in child */ - + char *child_argv[5]; - + /* close read pipe */ close (keepalive_pipe[0]); - + char *dir = realpath(appimage_path, NULL ); - + char options[100]; sprintf(options, "ro,offset=%lu", fs_offset); - + child_argv[0] = dir; child_argv[1] = "-o"; child_argv[2] = options; child_argv[3] = dir; child_argv[4] = mount_dir; - + if(0 != fusefs_main (5, child_argv, fuse_mounted)){ char *title; char *body; @@ -510,41 +510,41 @@ main (int argc, char *argv[]) "if you run it with the --appimage-extract option. \n" "See https://github.com/AppImage/AppImageKit/wiki/FUSE \n" "for more information"; - notify(title, body, 0); // 3 seconds timeout + notify(title, body, 0); // 3 seconds timeout }; } else { /* in parent, child is $pid */ int c; - + /* close write pipe */ close (keepalive_pipe[1]); - + /* Pause until mounted */ read (keepalive_pipe[0], &c, 1); - - + + dir_fd = open (mount_dir, O_RDONLY); if (dir_fd == -1) { perror ("open dir error"); exit (1); } - + res = dup2 (dir_fd, 1023); if (res == -1) { perror ("dup2 error"); exit (1); } close (dir_fd); - + strcpy (filename, mount_dir); strcat (filename, "/AppRun"); - + real_argv = malloc (sizeof (char *) * (argc + 1)); for (i = 0; i < argc; i++) { real_argv[i] = argv[i]; } real_argv[i] = NULL; - + if(arg && strcmp(arg,"appimage-mount")==0) { printf("%s\n", mount_dir); for (;;) pause(); @@ -552,46 +552,46 @@ main (int argc, char *argv[]) int length; char fullpath[PATH_MAX]; - + if(getenv("TARGET_APPIMAGE") == NULL){ // If we are operating on this file itself length = readlink(appimage_path, fullpath, sizeof(fullpath)); - fullpath[length] = '\0'; + fullpath[length] = '\0'; } else { // If we are operating on a different AppImage than this file sprintf(fullpath, "%s", appimage_path); // TODO: Make absolute } - + /* Setting some environment variables that the app "inside" might use */ setenv( "APPIMAGE", fullpath, 1 ); - setenv( "ARGV0", argv0_path, 1 ); + setenv( "ARGV0", argv0_path, 1 ); setenv( "APPDIR", mount_dir, 1 ); char portable_home_dir[PATH_MAX]; char portable_config_dir[PATH_MAX]; - + /* If there is a directory with the same name as the AppImage plus ".home", then export $HOME */ strcpy (portable_home_dir, fullpath); - strcat (portable_home_dir, ".home"); + strcat (portable_home_dir, ".home"); if(is_writable_directory(portable_home_dir)){ printf("Setting $HOME to %s\n", portable_home_dir); - setenv("HOME",portable_home_dir,1); + setenv("HOME",portable_home_dir,1); } /* If there is a directory with the same name as the AppImage plus ".config", then export $XDG_CONFIG_HOME */ strcpy (portable_config_dir, fullpath); - strcat (portable_config_dir, ".config"); + strcat (portable_config_dir, ".config"); if(is_writable_directory(portable_config_dir)){ printf("Setting $XDG_CONFIG_HOME to %s\n", portable_config_dir); - setenv("XDG_CONFIG_HOME",portable_config_dir,1); + setenv("XDG_CONFIG_HOME",portable_config_dir,1); } - + /* Original working directory */ char cwd[1024]; if (getcwd(cwd, sizeof(cwd)) != NULL) { setenv( "OWD", cwd, 1 ); } - + /* If we are operating on an AppImage different from this file, * then we do not execute the payload */ if(getenv("TARGET_APPIMAGE") == NULL){ @@ -602,6 +602,6 @@ main (int argc, char *argv[]) exit (1); } } - + return 0; } From 66887c777e06190dc498c69a13973186e584f737 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 27 Feb 2018 20:43:56 +0100 Subject: [PATCH 036/544] Test several AppImage flags --- travis/test-appimages.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/travis/test-appimages.sh b/travis/test-appimages.sh index b576de455..e5cad4c0c 100644 --- a/travis/test-appimages.sh +++ b/travis/test-appimages.sh @@ -16,6 +16,11 @@ error() { out/appimagetool-"$ARCH".AppImage && error # should fail due to missing parameter out/appimagetool-"$ARCH".AppImage -h || error # should not fail +# print version and update information +out/appimagetool-"$ARCH".AppImage --version || error # should not fail +out/appimagetool-"$ARCH".AppImage --appimage-version || error # should not fail +out/appimagetool-"$ARCH".AppImage --appimage-updateinformation || error # should not fail + # now check appimaged timeout "$TIMEOUT" out/appimaged-"$ARCH".AppImage --no-install From 336ed010227d14209870f45ac15f0d8788e5e80f Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 27 Feb 2018 21:55:46 +0100 Subject: [PATCH 037/544] Make parameters const They won't be altered by the function anyway, and in order to be able to pass std::strings (from C++ code), the functions need to accept const char arrays. --- src/getsection.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/getsection.h b/src/getsection.h index e6ecc1396..c4496111f 100644 --- a/src/getsection.h +++ b/src/getsection.h @@ -4,8 +4,8 @@ /* Return the offset, and the length of an ELF section with a given name in a given ELF file */ int get_elf_section_offset_and_length(const char* fname, const char* section_name, unsigned long *offset, unsigned long *length); -void print_hex(char* fname, unsigned long offset, unsigned long length); +void print_hex(const char* fname, unsigned long offset, unsigned long length); -void print_binary(char* fname, unsigned long offset, unsigned long length); +void print_binary(const char* fname, unsigned long offset, unsigned long length); #endif /* GETSECTION_H */ From 127019c21600c2f5057ddfd3b50f0c79229402ca Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 27 Feb 2018 21:55:57 +0100 Subject: [PATCH 038/544] Add unit test to debug segfaults --- tests/CMakeLists.txt | 44 +++++++++++++++++++++++++++++++++++++++ tests/test_getsection.cpp | 30 ++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 tests/test_getsection.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index acc9a748c..ced75b6b6 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -68,4 +68,48 @@ if(BUILD_TESTING) add_test(test_shared test_shared) target_compile_options(test_shared PRIVATE -fpermissive) + + + add_executable(test_getsection + test_getsection.cpp + fixtures.h + ${PROJECT_SOURCE_DIR}/src/light_elf.h + ${PROJECT_SOURCE_DIR}/src/light_byteswap.h + ${PROJECT_SOURCE_DIR}/src/elf.c + ${PROJECT_SOURCE_DIR}/src/getsection.c + ) + + target_link_libraries(test_getsection + PRIVATE + ${squashfuse_LIBRARIES} + ${libarchive_LIBRARIES} + ${inotify-tools_LIBRARIES} + ${xz_LIBRARIES} + pthread + ${GLIB_LIBRARIES} + ${GIO_LIBRARIES} + ${ZLIB_LIBRARIES} + ${CAIRO_LIBRARIES} + ${gtest_LIBRARIES} + ) + + target_include_directories(test_getsection PRIVATE ../src/) + + add_dependencies(test_getsection squashfuse) + + if(NOT USE_SYSTEM_LIBARCHIVE) + add_dependencies(test_getsection libarchive) + endif() + + if(NOT USE_SYSTEM_INOTIFY_TOOLS) + add_dependencies(test_getsection inotify-tools) + endif() + + if(NOT USE_SYSTEM_GTEST) + add_dependencies(test_getsection gtest) + endif() + + add_test(test_getsection test_shared) + + target_compile_options(test_getsection PRIVATE -fpermissive) endif() diff --git a/tests/test_getsection.cpp b/tests/test_getsection.cpp new file mode 100644 index 000000000..1c2d768cc --- /dev/null +++ b/tests/test_getsection.cpp @@ -0,0 +1,30 @@ +#include + +#include "fixtures.h" + +extern "C" { + #include "getsection.h" +} + + +using namespace std; + + +// most simple derivative class for better naming of the tests in this file +class GetSectionCTest : public AppImageKitTest {}; + + +TEST_F(GetSectionCTest, test_print_binary) { + std::string appImagePath = std::string(TEST_DATA_DIR) + "/Echo-x86_64.AppImage"; + + unsigned long offset, length; + + get_elf_section_offset_and_length(appImagePath.c_str(), ".upd_info", &offset, &length); + + print_binary(appImagePath.c_str(), offset, length); +} + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} From 034475bb64a0e3297e7d803bd53ceb2b6948c068 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 27 Feb 2018 22:09:45 +0100 Subject: [PATCH 039/544] Split into two tests --- tests/test_getsection.cpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/tests/test_getsection.cpp b/tests/test_getsection.cpp index 1c2d768cc..bdf48d5ae 100644 --- a/tests/test_getsection.cpp +++ b/tests/test_getsection.cpp @@ -1,5 +1,10 @@ +// system headers +#include + +// library headers #include +// local headers #include "fixtures.h" extern "C" { @@ -14,12 +19,31 @@ using namespace std; class GetSectionCTest : public AppImageKitTest {}; +bool isPowerOfTwo(int number) { + return (number & (number - 1)) == 0; +} + + +TEST_F(GetSectionCTest, test_get_elf_section_offset_and_length) { + std::string appImagePath = std::string(TEST_DATA_DIR) + "/Echo-x86_64.AppImage"; + + unsigned long offset, length; + + ASSERT_EQ(get_elf_section_offset_and_length(appImagePath.c_str(), ".upd_info", &offset, &length), 0); + + EXPECT_GT(offset, 0); + EXPECT_GT(length, 0); + + EXPECT_PRED1(isPowerOfTwo, length); +} + + TEST_F(GetSectionCTest, test_print_binary) { std::string appImagePath = std::string(TEST_DATA_DIR) + "/Echo-x86_64.AppImage"; unsigned long offset, length; - get_elf_section_offset_and_length(appImagePath.c_str(), ".upd_info", &offset, &length); + ASSERT_EQ(get_elf_section_offset_and_length(appImagePath.c_str(), ".upd_info", &offset, &length), 0); print_binary(appImagePath.c_str(), offset, length); } From e4850d524b165b73c9806b20d3d4cb4c79883541 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 27 Feb 2018 22:50:23 +0100 Subject: [PATCH 040/544] Test print_binary and print_hex against appimaged's AppImage This is necessary as appimaged contains additional sections we use (update information and a signature). --- tests/data/appimaged-x86_64.AppImage | Bin 0 -> 302544 bytes tests/test_getsection.cpp | 13 ++++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100755 tests/data/appimaged-x86_64.AppImage diff --git a/tests/data/appimaged-x86_64.AppImage b/tests/data/appimaged-x86_64.AppImage new file mode 100755 index 0000000000000000000000000000000000000000..9d85783508b3315b934f3e33703aaf92cb519f93 GIT binary patch literal 302544 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 S;17X61pW~CL*V}{f&T%d^$x)R literal 0 HcmV?d00001 diff --git a/tests/test_getsection.cpp b/tests/test_getsection.cpp index bdf48d5ae..c4f4a5223 100644 --- a/tests/test_getsection.cpp +++ b/tests/test_getsection.cpp @@ -39,7 +39,7 @@ TEST_F(GetSectionCTest, test_get_elf_section_offset_and_length) { TEST_F(GetSectionCTest, test_print_binary) { - std::string appImagePath = std::string(TEST_DATA_DIR) + "/Echo-x86_64.AppImage"; + std::string appImagePath = std::string(TEST_DATA_DIR) + "/appimaged-x86_64.AppImage"; unsigned long offset, length; @@ -48,6 +48,17 @@ TEST_F(GetSectionCTest, test_print_binary) { print_binary(appImagePath.c_str(), offset, length); } + +TEST_F(GetSectionCTest, test_print_hex) { + std::string appImagePath = std::string(TEST_DATA_DIR) + "/appimaged-x86_64.AppImage"; + + unsigned long offset, length; + + ASSERT_EQ(get_elf_section_offset_and_length(appImagePath.c_str(), ".sha256_sig", &offset, &length), 0); + + print_hex(appImagePath.c_str(), offset, length); +} + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); From e2899cf6a476dd2f7bda84ca5c7910510e85c36a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 27 Feb 2018 22:50:44 +0100 Subject: [PATCH 041/544] Fix print_binary/print_hex --- src/getsection.c | 66 +++++++++++++++--------------------------------- 1 file changed, 21 insertions(+), 45 deletions(-) diff --git a/src/getsection.c b/src/getsection.c index ab4904f5f..2519356a9 100644 --- a/src/getsection.c +++ b/src/getsection.c @@ -46,62 +46,38 @@ int get_elf_section_offset_and_length(const char* fname, const char* section_nam return (0); } -void print_hex(char* fname, unsigned long offset, unsigned long length) { - uint8_t* data; - unsigned long k; - - int fd = open(fname, O_RDONLY); - - data = mmap(NULL, length, PROT_READ, MAP_SHARED, fd, offset); - close(fd); - - for (k = 0; k < length; k++) { - printf("%x", data[k]); +char* read_file_offset_length(const char* fname, unsigned long offset, unsigned long length) { + FILE* f; + if ((f = fopen(fname, "r")) == NULL) { + return NULL; } - munmap(data, length); + fseek(f, offset, SEEK_SET); - printf("\n"); -} + char* buffer = calloc(length + 1, sizeof(char)); + fread(buffer, length, sizeof(char), f); -void print_binary(char* fname, unsigned long offset, unsigned long length) { - uint8_t* data; - unsigned long k, endpos; + fclose(f); - int fd = open(fname, O_RDONLY); + return buffer; +} - data = mmap(NULL, length, PROT_READ, MAP_SHARED, fd, offset); - close(fd); +void print_hex(char* fname, unsigned long offset, unsigned long length) { + char* data = read_file_offset_length(fname, offset, length); - for (k = 0; k < length && data[k] != '\0'; k++) { - printf("%c", data[k]); + for (long long k = 0; k < length && data[k] != '\0'; k++) { + printf("%x", data[k]); } - munmap(data, length); + free(data); printf("\n"); } -/* -int main(int ac, char **av) -{ - unsigned long offset = 0; - unsigned long length = 0; // Where the function will store the result - char* segment_name; - segment_name = ".upd_info"; - int res = get_elf_section_offset_and_lenghth(av[1], segment_name, &offset, &length); - printf("segment_name: %s\n", segment_name); - printf("offset: %lu\n", offset); - printf("length: %lu\n", length); - print_hex(av[1], offset, length); - print_binary(av[1], offset, length); - segment_name = ".sha256_sig"; - printf("segment_name: %s\n", segment_name); - res = get_elf_section_offset_and_lenghth(av[1], segment_name, &offset, &length); - printf("offset: %lu\n", offset); - printf("length: %lu\n", length); - print_hex(av[1], offset, length); - print_binary(av[1], offset, length); - return res; +void print_binary(char* fname, unsigned long offset, unsigned long length) { + char* data = read_file_offset_length(fname, offset, length); + + printf("%s\n", data); + + free(data); } -*/ From 2552f2d6a18627b12f0780d32665ab67e17fa5c2 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 27 Feb 2018 23:02:48 +0100 Subject: [PATCH 042/544] Make ctest run correct binary --- tests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ced75b6b6..5120c57d4 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -109,7 +109,7 @@ if(BUILD_TESTING) add_dependencies(test_getsection gtest) endif() - add_test(test_getsection test_shared) + add_test(test_getsection test_getsection) target_compile_options(test_getsection PRIVATE -fpermissive) endif() From 04ffe87735671f29fddee1918dab14898e2306a2 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 27 Feb 2018 23:22:52 +0100 Subject: [PATCH 043/544] Fix filename --- tests/test_getsection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_getsection.cpp b/tests/test_getsection.cpp index c4f4a5223..38012e08c 100644 --- a/tests/test_getsection.cpp +++ b/tests/test_getsection.cpp @@ -25,7 +25,7 @@ bool isPowerOfTwo(int number) { TEST_F(GetSectionCTest, test_get_elf_section_offset_and_length) { - std::string appImagePath = std::string(TEST_DATA_DIR) + "/Echo-x86_64.AppImage"; + std::string appImagePath = std::string(TEST_DATA_DIR) + "/appimaged-x86_64.AppImage"; unsigned long offset, length; From dd6ee3f6c69c6bccdacdba87a1f882abd8f747aa Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 28 Feb 2018 02:57:02 +0100 Subject: [PATCH 044/544] Add error checks --- src/getsection.c | 18 ++++++++++++++---- src/getsection.h | 4 ++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/getsection.c b/src/getsection.c index 2519356a9..fba2208bd 100644 --- a/src/getsection.c +++ b/src/getsection.c @@ -62,8 +62,11 @@ char* read_file_offset_length(const char* fname, unsigned long offset, unsigned return buffer; } -void print_hex(char* fname, unsigned long offset, unsigned long length) { - char* data = read_file_offset_length(fname, offset, length); +int print_hex(char* fname, unsigned long offset, unsigned long length) { + char* data; + if ((data = read_file_offset_length(fname, offset, length)) == NULL) { + return 1; + } for (long long k = 0; k < length && data[k] != '\0'; k++) { printf("%x", data[k]); @@ -72,12 +75,19 @@ void print_hex(char* fname, unsigned long offset, unsigned long length) { free(data); printf("\n"); + + return 0; } -void print_binary(char* fname, unsigned long offset, unsigned long length) { - char* data = read_file_offset_length(fname, offset, length); +int print_binary(char* fname, unsigned long offset, unsigned long length) { + char* data; + if ((data = read_file_offset_length(fname, offset, length)) == NULL) { + return 1; + } printf("%s\n", data); free(data); + + return 0; } diff --git a/src/getsection.h b/src/getsection.h index c4496111f..290047166 100644 --- a/src/getsection.h +++ b/src/getsection.h @@ -4,8 +4,8 @@ /* Return the offset, and the length of an ELF section with a given name in a given ELF file */ int get_elf_section_offset_and_length(const char* fname, const char* section_name, unsigned long *offset, unsigned long *length); -void print_hex(const char* fname, unsigned long offset, unsigned long length); +int print_hex(const char* fname, unsigned long offset, unsigned long length); -void print_binary(const char* fname, unsigned long offset, unsigned long length); +int print_binary(const char* fname, unsigned long offset, unsigned long length); #endif /* GETSECTION_H */ From eb2d73692f62c6d07ad23e76f422c308bca0aa0c Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 28 Feb 2018 03:11:50 +0100 Subject: [PATCH 045/544] Try to get tests to work with appimaged i686 (release 10) --- tests/data/appimaged-i686.AppImage | Bin 0 -> 230412 bytes tests/data/appimaged-x86_64.AppImage | Bin 302544 -> 0 bytes tests/test_getsection.cpp | 10 +++++----- 3 files changed, 5 insertions(+), 5 deletions(-) create mode 100755 tests/data/appimaged-i686.AppImage delete mode 100755 tests/data/appimaged-x86_64.AppImage diff --git a/tests/data/appimaged-i686.AppImage b/tests/data/appimaged-i686.AppImage new file mode 100755 index 0000000000000000000000000000000000000000..40cde7499614dd7b92ea9b9d1228c2a64581c91d GIT binary patch literal 230412 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�OB#KSh#A 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 UPl5jw_)mfV6!=ep|9=(uKhm^7ZU6uP literal 0 HcmV?d00001 diff --git a/tests/data/appimaged-x86_64.AppImage b/tests/data/appimaged-x86_64.AppImage deleted file mode 100755 index 9d85783508b3315b934f3e33703aaf92cb519f93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302544 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 S;17X61pW~CL*V}{f&T%d^$x)R diff --git a/tests/test_getsection.cpp b/tests/test_getsection.cpp index 38012e08c..d47154e14 100644 --- a/tests/test_getsection.cpp +++ b/tests/test_getsection.cpp @@ -25,7 +25,7 @@ bool isPowerOfTwo(int number) { TEST_F(GetSectionCTest, test_get_elf_section_offset_and_length) { - std::string appImagePath = std::string(TEST_DATA_DIR) + "/appimaged-x86_64.AppImage"; + std::string appImagePath = std::string(TEST_DATA_DIR) + "/appimaged-i686.AppImage"; unsigned long offset, length; @@ -39,24 +39,24 @@ TEST_F(GetSectionCTest, test_get_elf_section_offset_and_length) { TEST_F(GetSectionCTest, test_print_binary) { - std::string appImagePath = std::string(TEST_DATA_DIR) + "/appimaged-x86_64.AppImage"; + std::string appImagePath = std::string(TEST_DATA_DIR) + "/appimaged-i686.AppImage"; unsigned long offset, length; ASSERT_EQ(get_elf_section_offset_and_length(appImagePath.c_str(), ".upd_info", &offset, &length), 0); - print_binary(appImagePath.c_str(), offset, length); + EXPECT_EQ(print_binary(appImagePath.c_str(), offset, length), 0); } TEST_F(GetSectionCTest, test_print_hex) { - std::string appImagePath = std::string(TEST_DATA_DIR) + "/appimaged-x86_64.AppImage"; + std::string appImagePath = std::string(TEST_DATA_DIR) + "/appimaged-i686.AppImage"; unsigned long offset, length; ASSERT_EQ(get_elf_section_offset_and_length(appImagePath.c_str(), ".sha256_sig", &offset, &length), 0); - print_hex(appImagePath.c_str(), offset, length); + EXPECT_EQ(print_hex(appImagePath.c_str(), offset, length), 0); } int main(int argc, char **argv) { From 83aebf45686e7dfb9be3d98f22c86738f362bf62 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 28 Feb 2018 03:59:27 +0100 Subject: [PATCH 046/544] Read ELF class on runtime --- src/getsection.c | 58 +++++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/src/getsection.c b/src/getsection.c index fba2208bd..b329676c3 100644 --- a/src/getsection.c +++ b/src/getsection.c @@ -17,33 +17,45 @@ int get_elf_section_offset_and_length(const char* fname, const char* section_nam data = mmap(NULL, map_size, PROT_READ, MAP_SHARED, fd, 0); close(fd); -// optionally add more architectures for 32-bit builds so that it doesn't fall back to Elf64_* -// see e.g. https://sourceforge.net/p/predef/wiki/Architectures/ for more predefined macro names -#if __SIZEOF_POINTER__ == 4 - Elf32_Ehdr *elf; - Elf32_Shdr *shdr; - elf = (Elf32_Ehdr *) data; - shdr = (Elf32_Shdr *) (data + elf->e_shoff); -#elif __SIZEOF_POINTER__ == 8 - Elf64_Ehdr* elf; - Elf64_Shdr* shdr; - elf = (Elf64_Ehdr*) data; - shdr = (Elf64_Shdr*) (data + elf->e_shoff); -#else - #error Platforms other than 32-bit/64-bit are currently not supported! -#endif - - char* strTab = (char*) (data + shdr[elf->e_shstrndx].sh_offset); - for (i = 0; i < elf->e_shnum; i++) { - if (strcmp(&strTab[shdr[i].sh_name], section_name) == 0) { - *offset = shdr[i].sh_offset; - *length = shdr[i].sh_size; + // this trick works as both 32 and 64 bit ELF files start with the e_ident[EI_NINDENT] section + unsigned char class = data[EI_CLASS]; + + if (class == ELFCLASS32) { + Elf32_Ehdr* elf; + Elf32_Shdr* shdr; + + elf = (Elf32_Ehdr*) data; + shdr = (Elf32_Shdr*) (data + ((Elf32_Ehdr*) elf)->e_shoff); + + char* strTab = (char*) (data + shdr[elf->e_shstrndx].sh_offset); + for (i = 0; i < elf->e_shnum; i++) { + if (strcmp(&strTab[shdr[i].sh_name], section_name) == 0) { + *offset = shdr[i].sh_offset; + *length = shdr[i].sh_size; + } } + } else if (class == ELFCLASS64) { + Elf64_Ehdr* elf; + Elf64_Shdr* shdr; + + elf = (Elf64_Ehdr*) data; + shdr = (Elf64_Shdr*) (data + elf->e_shoff); + + char* strTab = (char*) (data + shdr[elf->e_shstrndx].sh_offset); + for (i = 0; i < elf->e_shnum; i++) { + if (strcmp(&strTab[shdr[i].sh_name], section_name) == 0) { + *offset = shdr[i].sh_offset; + *length = shdr[i].sh_size; + } + } + } else { + sprintf(stderr, "Platforms other than 32-bit/64-bit are currently not supported!"); + munmap(data, map_size); + return 2; } munmap(data, map_size); - - return (0); + return 0; } char* read_file_offset_length(const char* fname, unsigned long offset, unsigned long length) { From 0019bfbe4e0cff12151a354b75f1fd8b38a3296b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 28 Feb 2018 15:28:26 +0100 Subject: [PATCH 047/544] Provide zlib library dir to clang --- src/build-runtime.sh.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build-runtime.sh.in b/src/build-runtime.sh.in index f01a53a02..0fe9d0091 100755 --- a/src/build-runtime.sh.in +++ b/src/build-runtime.sh.in @@ -54,7 +54,7 @@ objcopy --add-section .sha256_sig=1024_blank_bytes \ squashfuse_libs="@squashfuse_LIBRARIES@" $CC $small_FLAGS $small_LDFLAGS -o runtime "$repo_root"/elf.c "$repo_root"/notify.c "$repo_root"/getsection.c \ runtime3.o ${squashfuse_libs//;/ } \ - -Wl,-Bdynamic -lpthread -l"@ZLIB_LIBRARIES@" -Wl,-Bstatic "@xz_LIBRARIES@" -Wl,-Bdynamic -ldl + -Wl,-Bdynamic -lpthread -l"@ZLIB_LIBRARIES@" -L"@ZLIB_LIBRARY_DIRS@" -Wl,-Bstatic "@xz_LIBRARIES@" -Wl,-Bdynamic -ldl $STRIP runtime # Test if we can read it back From aea0bff730bfc2800aab022c0538e533fd130c93 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 1 Mar 2018 22:07:42 +0100 Subject: [PATCH 048/544] Temporarily use GitHub mirror for xz sources --- cmake/dependencies.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 581932cd3..09d230384 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -13,7 +13,7 @@ if(NOT USE_SYSTEM_XZ) message(STATUS "Downloading and building xz") ExternalProject_Add(xz - URL https://tukaani.org/xz/xz-5.2.3.tar.gz + URL https://github.com/AppImage/external-resources/raw/master/sources/xz-5.2.3.tar.gz URL_HASH SHA512=a5eb4f707cf31579d166a6f95dbac45cf7ea181036d1632b4f123a4072f502f8d57cd6e7d0588f0bf831a07b8fc4065d26589a25c399b95ddcf5f73435163da6 CONFIGURE_COMMAND CFLAGS=-fPIC CPPFLAGS=-fPIC /configure --disable-shared --enable-static --prefix= --libdir=/lib BUILD_COMMAND make From 378f778617bcfa0ea72cfb60061c9a6ef5073dba Mon Sep 17 00:00:00 2001 From: Kurt Pfeifle Date: Thu, 1 Mar 2018 22:20:56 +0100 Subject: [PATCH 049/544] Update .travis.yml --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8c2373ad1..c4edf5b3c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,8 @@ script: after_success: - - ls -lh out/* + - ls -lh out/* # <= wrong line: see https://travis-ci.org/AppImage/AppImageKit/jobs/347965050#L4211 + - ls -lh build/out/* - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh - bash ./upload.sh build/out/* From ee35ae822b307b8d88f64d16370f2b68104a34b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20L=C3=B3pez=20Zubieta?= Date: Thu, 1 Mar 2018 17:07:29 -0600 Subject: [PATCH 050/544] Don't watch recursively, in large dirs resources will be exausted. --- src/appimaged.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/appimaged.c b/src/appimaged.c index 64965222d..dc63ab443 100644 --- a/src/appimaged.c +++ b/src/appimaged.c @@ -167,8 +167,8 @@ void initially_register(const char *name, int level) void add_dir_to_watch(const char *directory) { if (g_file_test (directory, G_FILE_TEST_IS_DIR)){ - if(!inotifytools_watch_recursively(directory, WR_EVENTS) ) { - fprintf(stderr, "%s\n", strerror(inotifytools_error())); + if(!inotifytools_watch_file(directory, WR_EVENTS) ) { + fprintf(stderr, "%s: %s\n", directory, strerror(inotifytools_error())); exit(1); } From 93bf5bfb4afb417f88d6903e7349609001ad47a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20L=C3=B3pez=20Zubieta?= Date: Thu, 1 Mar 2018 20:20:30 -0600 Subject: [PATCH 051/544] Release memory properly. --- src/shared.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared.c b/src/shared.c index 81e11b53a..ce4c03dc5 100644 --- a/src/shared.c +++ b/src/shared.c @@ -1203,7 +1203,7 @@ void appimage_type2_open(appimage_handler *handler) { sqfs_err err = sqfs_open_image(fs, handler->path, fs_offset); if (err != SQFS_OK){ fprintf(stderr, "sqfs_open_image error: %s\n", handler->path); - sqfs_destroy(fs); + free(fs); handler->is_open = false; handler->cache = NULL; } else { From 19abf8f0cc7084765b8620b5699995ee706e86b0 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 5 Mar 2018 12:55:07 +0100 Subject: [PATCH 052/544] Bundle file command (quick fix for #590) Fixes #590 --- build-appdirs.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build-appdirs.sh b/build-appdirs.sh index a1201e6c8..96a875635 100644 --- a/build-appdirs.sh +++ b/build-appdirs.sh @@ -21,6 +21,8 @@ cp install_prefix/usr/lib/appimagekit/mksquashfs "$APPIMAGETOOL_APPDIR"/usr/lib/ cp $(which desktop-file-validate) "$APPIMAGETOOL_APPDIR"/usr/bin/ cp $(which zsyncmake) "$APPIMAGETOOL_APPDIR"/usr/bin/ +cp -f /usr/bin/file "$APPIMAGETOOL_APPDIR"/usr/bin + cp ../resources/appimagetool.desktop "$APPIMAGETOOL_APPDIR" cp ../resources/appimagetool.svg "$APPIMAGETOOL_APPDIR"/appimagetool.svg ln -s "$APPIMAGETOOL_APPDIR"/appimagetool.svg "$APPIMAGETOOL_APPDIR"/.DirIcon From 47f49896c41546f0916c9ca944722681b4d4166d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 5 Mar 2018 23:59:43 +0100 Subject: [PATCH 053/544] Fix segfaults --- src/validate.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/validate.c b/src/validate.c index 66330f875..92f019102 100644 --- a/src/validate.c +++ b/src/validate.c @@ -128,11 +128,12 @@ int main(int argc,char **argv) { char *signaturefile; signaturefile = g_strconcat("/tmp/", basename(g_strconcat(filename, ".sig", NULL)), NULL); - uint8_t *data; + uint8_t *data = malloc(skip_length); unsigned long k; - int fd = open(filename, O_RDONLY); - data = mmap(NULL, skip_length, PROT_READ, MAP_SHARED, fd, skip_offset); - close(fd); + FILE* fd = fopen(filename, "r"); + fseek(fd, skip_offset, SEEK_SET); + fread(data, skip_length, sizeof(uint8_t), fd); + fclose(fd); FILE *fpdst2 = fopen(signaturefile, "w"); if (fpdst2 == NULL) { fprintf(stderr, "Not able to open the signature file for writing, aborting"); @@ -142,7 +143,7 @@ int main(int argc,char **argv) { fprintf(fpdst2, "%c", data[k]); } fclose(fpdst2); - munmap(data, skip_length); + free(data); struct stat st; stat(filename, &st); From 0d82d2ceabd70134e559ac58a2e7a9b3ae1b7ad0 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 7 Mar 2018 14:03:05 +0100 Subject: [PATCH 054/544] Add .sig_key section to runtime's ELF header --- src/build-runtime.sh.in | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/build-runtime.sh.in b/src/build-runtime.sh.in index 0fe9d0091..49ef05d57 100755 --- a/src/build-runtime.sh.in +++ b/src/build-runtime.sh.in @@ -48,12 +48,17 @@ objcopy --add-section .upd_info=1024_blank_bytes \ objcopy --add-section .sha256_sig=1024_blank_bytes \ --set-section-flags .sha256_sig=noload,readonly runtime2.o runtime3.o +cat 1024_blank_bytes 1024_blank_bytes 1024_blank_bytes 1024_blank_bytes > 4096_blank_bytes + +objcopy --add-section .sig_key=4096_blank_bytes \ + --set-section-flags .sig_key=noload,readonly runtime3.o runtime4.o + # Now statically link against libsquashfuse_ll, libsquashfuse and liblzma # and embed .upd_info and .sha256_sig sections # TODO: squashfuse_LIBRARIES is a semicolon separated list of values that has to be split during runtime of this script squashfuse_libs="@squashfuse_LIBRARIES@" $CC $small_FLAGS $small_LDFLAGS -o runtime "$repo_root"/elf.c "$repo_root"/notify.c "$repo_root"/getsection.c \ - runtime3.o ${squashfuse_libs//;/ } \ + runtime4.o ${squashfuse_libs//;/ } \ -Wl,-Bdynamic -lpthread -l"@ZLIB_LIBRARIES@" -L"@ZLIB_LIBRARY_DIRS@" -Wl,-Bstatic "@xz_LIBRARIES@" -Wl,-Bdynamic -ldl $STRIP runtime From d3c3df6a41984945cb1f1b2c80dcf68b14152cda Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 7 Mar 2018 15:17:39 +0100 Subject: [PATCH 055/544] Reformat and improve efficiency of GPG signing code --- src/appimagetool.c | 133 +++++++++++++++++++++++++++++---------------- 1 file changed, 86 insertions(+), 47 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 9f4a109bb..abe976d73 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -87,6 +87,7 @@ gchar *sqfs_comp = "gzip"; gchar *exclude_file = NULL; gchar *runtime_file = NULL; gchar *sign_args = NULL; +gchar *gpg_key = NULL; gchar *pathToMksquashfs = NULL; // ##################################################################### @@ -846,97 +847,135 @@ main (int argc, char *argv[]) if(sign){ bool using_gpg = FALSE; bool using_shasum = FALSE; + /* The user has indicated that he wants to sign */ - gchar *gpg2_path = g_find_program_in_path ("gpg2"); + gchar *gpg2_path = g_find_program_in_path("gpg2"); + if (!gpg2_path) { - gpg2_path = g_find_program_in_path ("gpg"); + gpg2_path = g_find_program_in_path("gpg"); using_gpg = TRUE; } - gchar *sha256sum_path = g_find_program_in_path ("sha256sum"); + + gchar *sha256sum_path = g_find_program_in_path("sha256sum"); + if (!sha256sum_path) { - sha256sum_path = g_find_program_in_path ("shasum"); + sha256sum_path = g_find_program_in_path("shasum"); using_shasum = 1; } - if(!gpg2_path){ - fprintf (stderr, "gpg2 or gpg is not installed, cannot sign\n"); - } - else if(!sha256sum_path) { + + if (!gpg2_path) { + fprintf(stderr, "gpg2 or gpg is not installed, cannot sign\n"); + } else if (!sha256sum_path) { fprintf(stderr, "sha256sum or shasum is not installed, cannot sign\n"); } else { fprintf(stderr, "%s and %s are installed and user requested to sign, " "hence signing\n", using_gpg ? "gpg" : "gpg2", - using_shasum ? "shasum" : "sha256sum"); - char *digestfile; + using_shasum ? "shasum" : "sha256sum"); + + char* digestfile; digestfile = br_strcat(destination, ".digest"); - char *ascfile; + + char* ascfile; ascfile = br_strcat(destination, ".digest.asc"); - if (g_file_test (digestfile, G_FILE_TEST_IS_REGULAR)) + + if (g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) unlink(digestfile); + if (using_shasum) - sprintf (command, "%s -a256 %s", sha256sum_path, destination); + sprintf(command, "%s -a256 %s", sha256sum_path, destination); else - sprintf (command, "%s %s", sha256sum_path, destination); - if(verbose) - fprintf (stderr, "%s\n", command); + sprintf(command, "%s %s", sha256sum_path, destination); + + if (verbose) + fprintf(stderr, "%s\n", command); + fp = popen(command, "r"); + if (fp == NULL) die(using_shasum ? "shasum command did not succeed" : "sha256sum command did not succeed"); + char output[1024]; - fgets(output, sizeof (output) - 1, fp); + + fgets(output, sizeof(output) - 1, fp); + if (verbose) printf("%s: %s\n", using_shasum ? "shasum" : "sha256sum", g_strsplit_set(output, " ", -1)[0]); - FILE *fpx = fopen(digestfile, "w"); - if (fpx != NULL) - { + + FILE* fpx = fopen(digestfile, "w"); + + if (fpx != NULL) { fputs(g_strsplit_set(output, " ", -1)[0], fpx); fclose(fpx); } - int shasum_exit_status = pclose(fp); - if(WEXITSTATUS(shasum_exit_status) != 0) + + if (pclose(fp) != 0) die(using_shasum ? "shasum command did not succeed" : "sha256sum command did not succeed"); - if (g_file_test (ascfile, G_FILE_TEST_IS_REGULAR)) + + fp = NULL; + + if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) unlink(ascfile); - sprintf (command, "%s --detach-sign --armor %s %s", gpg2_path, sign_args ? sign_args : "", digestfile); - if(verbose) - fprintf (stderr, "%s\n", command); + + sprintf(command, "%s --detach-sign --armor %s %s", gpg2_path, sign_args ? sign_args : "", digestfile); + + if (verbose) + fprintf(stderr, "%s\n", command); + fp = popen(command, "r"); - int gpg_exit_status = pclose(fp); - if(WEXITSTATUS(gpg_exit_status) != 0) { - fprintf (stderr, "ERROR: %s command did not succeed, could not sign, continuing\n", using_gpg ? "gpg" : "gpg2"); + + if (pclose(fp) != 0) { + fprintf(stderr, "ERROR: %s command did not succeed, could not sign, continuing\n", using_gpg ? "gpg" : "gpg2"); } else { unsigned long sig_offset = 0; unsigned long sig_length = 0; + get_elf_section_offset_and_length(destination, ".sha256_sig", &sig_offset, &sig_length); - if(verbose) { + + if (verbose) { printf("sig_offset: %lu\n", sig_offset); printf("sig_length: %lu\n", sig_length); } - if(sig_offset == 0) { + + if (sig_offset == 0) { die("Could not determine offset for signature"); } else { - FILE *fpdst3 = fopen(destination, "r+"); - if (fpdst3 == NULL) + FILE* destionationfp = fopen(destination, "r+"); + + if (destionationfp == NULL) die("Not able to open the destination file for writing, aborting"); - // if(strlen(updateinformation)>sig_length) - // die("signature does not fit into segment, aborting"); - fseek(fpdst3, sig_offset, SEEK_SET); - FILE *fpsrc2 = fopen(ascfile, "rb"); - if (fpsrc2 == NULL) { + + // if(strlen(updateinformation)>sig_length) + // die("signature does not fit into segment, aborting"); + + fseek(destionationfp, sig_offset, SEEK_SET); + + FILE* ascfilefp = fopen(ascfile, "rb"); + + if (ascfilefp == NULL) { die("Not able to open the asc file for reading, aborting"); } - char byte; - while (!feof(fpsrc2)) - { - fread(&byte, sizeof(char), 1, fpsrc2); - fwrite(&byte, sizeof(char), 1, fpdst3); + + static const int bufsize = 1024; + char buffer[bufsize]; + + while (!feof(ascfilefp)) { + size_t bytesRead = fread(buffer, sizeof(char), bufsize, ascfilefp); + size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destionationfp); + + if (bytesRead != bytesWritten) { + char message[128]; + sprintf(message, "Bytes read and written differ: %lu != %lu", bytesRead, bytesWritten); + die(message); + } } - fclose(fpsrc2); - fclose(fpdst3); + + fclose(ascfilefp); + fclose(destionationfp); } - if (g_file_test (ascfile, G_FILE_TEST_IS_REGULAR)) + if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) unlink(ascfile); - if (g_file_test (digestfile, G_FILE_TEST_IS_REGULAR)) + if (g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) unlink(digestfile); } } From fb6342d26b65bfb951af0065700c966e8dfaf7c4 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 7 Mar 2018 15:32:54 +0100 Subject: [PATCH 056/544] Introduce new --sign-key argument A separate argument makes it easier to be able to specify a key for signing the key and exporting the key afterwards. As --sign-args may contain additional arguments which would not work when using gpg[2] --export, introducing a separate key argument that is then passed to both these gpg[2] calls makes more sense. --- src/appimagetool.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index abe976d73..3f943ec3d 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -87,7 +87,7 @@ gchar *sqfs_comp = "gzip"; gchar *exclude_file = NULL; gchar *runtime_file = NULL; gchar *sign_args = NULL; -gchar *gpg_key = NULL; +gchar *sign_key = NULL; gchar *pathToMksquashfs = NULL; // ##################################################################### @@ -439,6 +439,7 @@ static GOptionEntry entries[] = { "no-appstream", 'n', 0, G_OPTION_ARG_NONE, &no_appstream, "Do not check AppStream metadata", NULL }, { "exclude-file", 0, 0, G_OPTION_ARG_STRING, &exclude_file, _exclude_file_desc, NULL }, { "runtime-file", 0, 0, G_OPTION_ARG_STRING, &runtime_file, "Runtime file to use", NULL }, + { "sign-key", 0, 0, G_OPTION_ARG_STRING, &sign_key, "Key ID to use for gpg[2] signatures", NULL}, { "sign-args", 0, 0, G_OPTION_ARG_STRING, &sign_args, "Extra arguments to use when signing with gpg[2]", NULL}, { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &remaining_args, NULL, NULL }, { 0,0,0,0,0,0,0 } @@ -917,7 +918,10 @@ main (int argc, char *argv[]) if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) unlink(ascfile); - sprintf(command, "%s --detach-sign --armor %s %s", gpg2_path, sign_args ? sign_args : "", digestfile); + sprintf(command, + "%s --detach-sign --armor %s %s %s", + gpg2_path, sign_key ? sign_key : "", sign_args ? sign_args : "", digestfile + ); if (verbose) fprintf(stderr, "%s\n", command); From 790bc3c1d6405d70526e506976fce56bf91aecbb Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 7 Mar 2018 15:34:56 +0100 Subject: [PATCH 057/544] Reduce branches depth in signature code --- src/appimagetool.c | 80 ++++++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 3f943ec3d..b3bce7754 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -930,58 +930,62 @@ main (int argc, char *argv[]) if (pclose(fp) != 0) { fprintf(stderr, "ERROR: %s command did not succeed, could not sign, continuing\n", using_gpg ? "gpg" : "gpg2"); - } else { - unsigned long sig_offset = 0; - unsigned long sig_length = 0; + return 1; + } - get_elf_section_offset_and_length(destination, ".sha256_sig", &sig_offset, &sig_length); + fp = NULL; - if (verbose) { - printf("sig_offset: %lu\n", sig_offset); - printf("sig_length: %lu\n", sig_length); - } + unsigned long sig_offset = 0; + unsigned long sig_length = 0; - if (sig_offset == 0) { - die("Could not determine offset for signature"); - } else { - FILE* destionationfp = fopen(destination, "r+"); + get_elf_section_offset_and_length(destination, ".sha256_sig", &sig_offset, &sig_length); - if (destionationfp == NULL) - die("Not able to open the destination file for writing, aborting"); + if (verbose) { + printf("sig_offset: %lu\n", sig_offset); + printf("sig_length: %lu\n", sig_length); + } - // if(strlen(updateinformation)>sig_length) - // die("signature does not fit into segment, aborting"); + if (sig_offset == 0) { + die("Could not determine offset for signature"); + } - fseek(destionationfp, sig_offset, SEEK_SET); + FILE* destionationfp = fopen(destination, "r+"); - FILE* ascfilefp = fopen(ascfile, "rb"); + if (destionationfp == NULL) + die("Not able to open the destination file for writing, aborting"); - if (ascfilefp == NULL) { - die("Not able to open the asc file for reading, aborting"); - } + // if(strlen(updateinformation)>sig_length) + // die("signature does not fit into segment, aborting"); - static const int bufsize = 1024; - char buffer[bufsize]; + fseek(destionationfp, sig_offset, SEEK_SET); - while (!feof(ascfilefp)) { - size_t bytesRead = fread(buffer, sizeof(char), bufsize, ascfilefp); - size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destionationfp); + FILE* ascfilefp = fopen(ascfile, "rb"); - if (bytesRead != bytesWritten) { - char message[128]; - sprintf(message, "Bytes read and written differ: %lu != %lu", bytesRead, bytesWritten); - die(message); - } - } + if (ascfilefp == NULL) { + die("Not able to open the asc file for reading, aborting"); + } + + static const int bufsize = 1024; + char buffer[bufsize]; + + while (!feof(ascfilefp)) { + size_t bytesRead = fread(buffer, sizeof(char), bufsize, ascfilefp); + size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destionationfp); - fclose(ascfilefp); - fclose(destionationfp); + if (bytesRead != bytesWritten) { + char message[128]; + sprintf(message, "Bytes read and written differ: %lu != %lu", bytesRead, bytesWritten); + die(message); } - if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) - unlink(ascfile); - if (g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) - unlink(digestfile); } + + fclose(ascfilefp); + fclose(destionationfp); + + if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) + unlink(ascfile); + if (g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) + unlink(digestfile); } } From d9445c345b4e78fe23cc557b72b270f04a809829 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 7 Mar 2018 16:37:18 +0100 Subject: [PATCH 058/544] Export and embed PGP public key --- src/appimagetool.c | 76 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 7 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index b3bce7754..3893661af 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -918,11 +918,22 @@ main (int argc, char *argv[]) if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) unlink(ascfile); + char* key_arg = calloc(sizeof(char), strlen(sign_key) + strlen("--local-user ''")); + + if (sign_key && strlen(sign_key) > 0) { + strcpy(key_arg, "--local-user '"); + strcat(key_arg, sign_key); + strcat(key_arg, "'"); + } + sprintf(command, "%s --detach-sign --armor %s %s %s", - gpg2_path, sign_key ? sign_key : "", sign_args ? sign_args : "", digestfile + gpg2_path, key_arg, sign_args ? sign_args : "", digestfile ); + free(key_arg); + key_arg = NULL; + if (verbose) fprintf(stderr, "%s\n", command); @@ -938,7 +949,11 @@ main (int argc, char *argv[]) unsigned long sig_offset = 0; unsigned long sig_length = 0; - get_elf_section_offset_and_length(destination, ".sha256_sig", &sig_offset, &sig_length); + int rv = get_elf_section_offset_and_length(destination, ".sha256_sig", &sig_offset, &sig_length); + + if (rv != 0 || sig_offset == 0 || sig_length == 0) { + die("Could not find section .sig_key in runtime"); + } if (verbose) { printf("sig_offset: %lu\n", sig_offset); @@ -949,15 +964,15 @@ main (int argc, char *argv[]) die("Could not determine offset for signature"); } - FILE* destionationfp = fopen(destination, "r+"); + FILE* destinationfp = fopen(destination, "r+"); - if (destionationfp == NULL) + if (destinationfp == NULL) die("Not able to open the destination file for writing, aborting"); // if(strlen(updateinformation)>sig_length) // die("signature does not fit into segment, aborting"); - fseek(destionationfp, sig_offset, SEEK_SET); + fseek(destinationfp, sig_offset, SEEK_SET); FILE* ascfilefp = fopen(ascfile, "rb"); @@ -968,9 +983,17 @@ main (int argc, char *argv[]) static const int bufsize = 1024; char buffer[bufsize]; + size_t totalBytesRead = 0; + while (!feof(ascfilefp)) { size_t bytesRead = fread(buffer, sizeof(char), bufsize, ascfilefp); - size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destionationfp); + totalBytesRead += bytesRead; + + if (totalBytesRead >= sig_length) { + die("Error: cannot embed key in AppImage: size exceeds reserved ELF section size"); + } + + size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destinationfp); if (bytesRead != bytesWritten) { char message[128]; @@ -980,12 +1003,51 @@ main (int argc, char *argv[]) } fclose(ascfilefp); - fclose(destionationfp); if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) unlink(ascfile); if (g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) unlink(digestfile); + + // export key and write into section + sprintf(command, "%s --export --armor %s", gpg2_path, sign_key ? sign_key : ""); + + unsigned long key_offset, key_length; + rv = get_elf_section_offset_and_length(destination, ".sig_key", &key_offset, &key_length); + + if (rv != 0 || key_offset == 0 || key_length == 0) { + die("Could not find section .sig_key in runtime"); + } + + fseek(destinationfp, key_offset, SEEK_SET); + + fp = popen(command, "r"); + + if (fp == NULL) + die("Failed to call gpg[2] to export the signature key"); + + totalBytesRead = 0; + while (!feof(fp)) { + size_t bytesRead = fread(buffer, sizeof(char), bufsize, fp); + totalBytesRead += bytesRead; + + if (totalBytesRead >= key_length) { + die("Error: cannot embed key in AppImage: size exceeds reserved ELF section size"); + } + + size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destinationfp); + + if (bytesRead != bytesWritten) { + char message[128]; + sprintf(message, "Error: Bytes read and written differ: %lu != %lu", bytesRead, bytesWritten); + die(message); + } + } + + int exportexitcode = pclose(fp); + fp = NULL; + + fclose(destinationfp); } } From f36dc0ead6d39a1f7fc8b5d34d62c8fef48adefb Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 7 Mar 2018 17:00:08 +0100 Subject: [PATCH 059/544] Trigger builds of runtime when build-runtime.sh changes --- src/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3262838cf..a8f14e45f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -10,6 +10,7 @@ configure_file( add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime COMMAND bash ${CMAKE_CURRENT_BINARY_DIR}/build-runtime.sh WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/build-runtime.sh MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/runtime.c DEPENDS squashfuse ) From 85cdefb132e789a8d682b88d1d5753d9bdee14fa Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 7 Mar 2018 17:07:53 +0100 Subject: [PATCH 060/544] Fix segfaults when --sign-key is missing --- src/appimagetool.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 3893661af..b16a81614 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -918,9 +918,14 @@ main (int argc, char *argv[]) if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) unlink(ascfile); - char* key_arg = calloc(sizeof(char), strlen(sign_key) + strlen("--local-user ''")); + char* key_arg = NULL; if (sign_key && strlen(sign_key) > 0) { + key_arg = calloc(sizeof(char), strlen(sign_key) + strlen("--local-user ''")); + + if (key_arg == NULL) + die("malloc() failed"); + strcpy(key_arg, "--local-user '"); strcat(key_arg, sign_key); strcat(key_arg, "'"); @@ -928,7 +933,7 @@ main (int argc, char *argv[]) sprintf(command, "%s --detach-sign --armor %s %s %s", - gpg2_path, key_arg, sign_args ? sign_args : "", digestfile + gpg2_path, key_arg ? key_arg : "", sign_args ? sign_args : "", digestfile ); free(key_arg); From c89866f63738c717db42913503b7f825cdee670d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 7 Mar 2018 19:02:57 +0100 Subject: [PATCH 061/544] Avoid "broken pipe" errors --- src/appimagetool.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/appimagetool.c b/src/appimagetool.c index b16a81614..839623555 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1037,6 +1037,12 @@ main (int argc, char *argv[]) totalBytesRead += bytesRead; if (totalBytesRead >= key_length) { + // read rest of process input to avoid broken pipe error + while (!feof(fp)) { + fread(buffer, sizeof(char), bufsize, fp); + } + + pclose(fp); die("Error: cannot embed key in AppImage: size exceeds reserved ELF section size"); } From 07346de4cc77c4f40b8bc75e2b8c360b11e5864b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 7 Mar 2018 19:03:25 +0100 Subject: [PATCH 062/544] Fix comparisons --- src/appimagetool.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 839623555..47532ed0c 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -994,7 +994,7 @@ main (int argc, char *argv[]) size_t bytesRead = fread(buffer, sizeof(char), bufsize, ascfilefp); totalBytesRead += bytesRead; - if (totalBytesRead >= sig_length) { + if (totalBytesRead > sig_length) { die("Error: cannot embed key in AppImage: size exceeds reserved ELF section size"); } @@ -1036,7 +1036,7 @@ main (int argc, char *argv[]) size_t bytesRead = fread(buffer, sizeof(char), bufsize, fp); totalBytesRead += bytesRead; - if (totalBytesRead >= key_length) { + if (totalBytesRead > key_length) { // read rest of process input to avoid broken pipe error while (!feof(fp)) { fread(buffer, sizeof(char), bufsize, fp); From 257a78d4063fe5f78afdef45aba735896579090d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 7 Mar 2018 19:13:52 +0100 Subject: [PATCH 063/544] Evaluate exit code --- src/appimagetool.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/appimagetool.c b/src/appimagetool.c index 47532ed0c..d2c3a3b1c 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1058,6 +1058,12 @@ main (int argc, char *argv[]) int exportexitcode = pclose(fp); fp = NULL; + if (exportexitcode != 0) { + char message[128]; + sprintf(message, "GPG key export failed: exit code %d", exportexitcode); + die(message); + } + fclose(destinationfp); } } From d17ae61cb4910185990c63d4c6bf37fe62e53e61 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 7 Mar 2018 19:15:01 +0100 Subject: [PATCH 064/544] Add missing casts Should make Codacy more happy. --- src/appimagetool.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index d2c3a3b1c..4ef18a2f3 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1002,7 +1002,7 @@ main (int argc, char *argv[]) if (bytesRead != bytesWritten) { char message[128]; - sprintf(message, "Bytes read and written differ: %lu != %lu", bytesRead, bytesWritten); + sprintf(message, "Bytes read and written differ: %lu != %lu", (long unsigned) bytesRead, (long unsigned) bytesWritten); die(message); } } @@ -1050,7 +1050,7 @@ main (int argc, char *argv[]) if (bytesRead != bytesWritten) { char message[128]; - sprintf(message, "Error: Bytes read and written differ: %lu != %lu", bytesRead, bytesWritten); + sprintf(message, "Error: Bytes read and written differ: %lu != %lu", (long unsigned) bytesRead, (long unsigned) bytesWritten); die(message); } } From 6689c11370fe3a4329c6df6e16148d1aad6b0ffb Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 12 Mar 2018 14:24:00 +0100 Subject: [PATCH 065/544] Add verbose print for key_* --- src/appimagetool.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/appimagetool.c b/src/appimagetool.c index 4ef18a2f3..d50c1dd63 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1020,6 +1020,11 @@ main (int argc, char *argv[]) unsigned long key_offset, key_length; rv = get_elf_section_offset_and_length(destination, ".sig_key", &key_offset, &key_length); + if (verbose) { + printf("key_offset: %lu\n", key_offset); + printf("key_length: %lu\n", key_length); + } + if (rv != 0 || key_offset == 0 || key_length == 0) { die("Could not find section .sig_key in runtime"); } From 2bdce06533afaab68ebfc63b530bb75bfd549ad2 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 12 Mar 2018 16:20:13 +0100 Subject: [PATCH 066/544] Use --batch for gpg[2] commands --- src/appimagetool.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 4ef18a2f3..5a8971854 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -932,7 +932,7 @@ main (int argc, char *argv[]) } sprintf(command, - "%s --detach-sign --armor %s %s %s", + "%s --batch --detach-sign --armor %s %s %s", gpg2_path, key_arg ? key_arg : "", sign_args ? sign_args : "", digestfile ); @@ -1008,14 +1008,13 @@ main (int argc, char *argv[]) } fclose(ascfilefp); - - if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) - unlink(ascfile); if (g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) unlink(digestfile); + if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) + unlink(ascfile); // export key and write into section - sprintf(command, "%s --export --armor %s", gpg2_path, sign_key ? sign_key : ""); + sprintf(command, "%s --batch --export --armor %s", gpg2_path, sign_key ? sign_key : ""); unsigned long key_offset, key_length; rv = get_elf_section_offset_and_length(destination, ".sig_key", &key_offset, &key_length); From 7d93e83f51d1f1c9bb4c5830fdfe82cbc8d74195 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 12 Mar 2018 16:43:49 +0100 Subject: [PATCH 067/544] Make sure to export only a single key and embed it The normal behavior of gpg[2] is to export all keys unless an ID is explicitly passed. Therefore, to allow appimagetool to work on systems with multiple pubkeys in the users' keyrings, the key ID is read from the signature using gpg[2] --list-packets <.asc file>, and only that key is exported. This is a fix when no --sign-key is passed explicitly, causing gpg[2] to sign with the default key. --- src/appimagetool.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 5a8971854..cfde558d4 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1010,11 +1010,48 @@ main (int argc, char *argv[]) fclose(ascfilefp); if (g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) unlink(digestfile); + + if (sign_key == NULL || strlen(sign_key) > 0) { + // read which key was used to sign from signature + sprintf(command, "%s --batch --list-packets %s", gpg2_path, ascfile); + + fp = popen(command, "r"); + + if (fp == NULL) + die("Failed to call gpg[2] to detect signature's key ID"); + + while (!feof(fp)) { + size_t bytesRead = fread(buffer, sizeof(char), bufsize, fp); + + char* keyid_pos = strstr(buffer, "keyid"); + + if (keyid_pos == NULL) + continue; + + char* keyIDBegin = keyid_pos + strlen("keyid "); + char* endOfKeyID = strstr(keyIDBegin, "\n"); + + sign_key = calloc(endOfKeyID - keyIDBegin, sizeof(char)); + memcpy(sign_key, keyIDBegin, endOfKeyID - keyIDBegin); + } + + // read rest of process input to avoid broken pipe error + while (!feof(fp)) { + fread(buffer, sizeof(char), bufsize, fp); + } + + int retval = pclose(fp); + fp = NULL; + + if (retval != 0) + die("Failed to call gpg[2] to detect signature's key ID"); + } + if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) unlink(ascfile); // export key and write into section - sprintf(command, "%s --batch --export --armor %s", gpg2_path, sign_key ? sign_key : ""); + sprintf(command, "%s --batch --export --armor %s", gpg2_path, sign_key); unsigned long key_offset, key_length; rv = get_elf_section_offset_and_length(destination, ".sig_key", &key_offset, &key_length); From cc42927dc11d06ff924773dc813ec230e4f94728 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 12 Mar 2018 16:47:01 +0100 Subject: [PATCH 068/544] Increase size of .sig_key section to 8kiB The reason to increase it is to support 4096-bit PGP keys, which exceed the 4kiB size when exported using --export. --- src/build-runtime.sh.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/build-runtime.sh.in b/src/build-runtime.sh.in index 49ef05d57..9233b7917 100755 --- a/src/build-runtime.sh.in +++ b/src/build-runtime.sh.in @@ -49,8 +49,9 @@ objcopy --add-section .sha256_sig=1024_blank_bytes \ --set-section-flags .sha256_sig=noload,readonly runtime2.o runtime3.o cat 1024_blank_bytes 1024_blank_bytes 1024_blank_bytes 1024_blank_bytes > 4096_blank_bytes +cat 4096_blank_bytes 4096_blank_bytes > 8192_blank_bytes -objcopy --add-section .sig_key=4096_blank_bytes \ +objcopy --add-section .sig_key=8192_blank_bytes \ --set-section-flags .sig_key=noload,readonly runtime3.o runtime4.o # Now statically link against libsquashfuse_ll, libsquashfuse and liblzma From 1f42c9879ec361ca5bdea3b5c846a2708eb773b1 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 12 Mar 2018 23:19:35 +0100 Subject: [PATCH 069/544] Revert "Temporarily use GitHub mirror for xz sources" --- cmake/dependencies.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 09d230384..581932cd3 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -13,7 +13,7 @@ if(NOT USE_SYSTEM_XZ) message(STATUS "Downloading and building xz") ExternalProject_Add(xz - URL https://github.com/AppImage/external-resources/raw/master/sources/xz-5.2.3.tar.gz + URL https://tukaani.org/xz/xz-5.2.3.tar.gz URL_HASH SHA512=a5eb4f707cf31579d166a6f95dbac45cf7ea181036d1632b4f123a4072f502f8d57cd6e7d0588f0bf831a07b8fc4065d26589a25c399b95ddcf5f73435163da6 CONFIGURE_COMMAND CFLAGS=-fPIC CPPFLAGS=-fPIC /configure --disable-shared --enable-static --prefix= --libdir=/lib BUILD_COMMAND make From 28a9044fb9b1d7f369bb17941b78151568981633 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 00:35:44 +0100 Subject: [PATCH 070/544] Add missing dependency checks --- CMakeLists.txt | 2 ++ cmake/dependencies.cmake | 1 + 2 files changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index ffbf4e1b9..3f83e11d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,6 +71,8 @@ check_program(libtoolize) check_program(patch) check_program(sed) check_program(wget) +check_program(xxd) +check_program(desktop-file-validate) # TODO: add checks for remaining commands diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 09d230384..5037a7e19 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -5,6 +5,7 @@ pkg_check_modules(GIO REQUIRED gio-2.0) pkg_check_modules(ZLIB REQUIRED zlib) pkg_check_modules(CAIRO REQUIRED cairo) pkg_check_modules(OPENSSL REQUIRED openssl) +pkg_check_modules(FUSE REQUIRED fuse) set(USE_SYSTEM_XZ OFF CACHE BOOL "Use system xz/liblzma instead of building our own") From d3e7a78f774dd73431871dfee4c23ee6ee7ae977 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 00:12:43 +0100 Subject: [PATCH 071/544] Don't change variable name --- CMakeLists.txt | 4 ++-- Makefile.runtime | 2 +- build-tool-osx.sh | 2 +- cmake/cpack_debs.cmake | 4 ++-- src/CMakeLists.txt | 8 ++++---- src/appimaged.c | 2 +- src/appimagetool.c | 2 +- src/build-runtime.sh.in | 2 +- src/runtime.c | 4 ++-- src/shared.c | 6 +++--- 10 files changed, 18 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7afa76bec..2dfe559fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,7 @@ include(CTest) execute_process( COMMAND git describe --tags --always --abbrev=7 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - OUTPUT_VARIABLE GIT_VERSION + OUTPUT_VARIABLE GIT_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE ) @@ -43,7 +43,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) # write version information for CPack to files -file(WRITE ${PROJECT_BINARY_DIR}/GIT_VERSION "${GIT_VERSION}") +file(WRITE ${PROJECT_BINARY_DIR}/GIT_COMMIT "${GIT_COMMIT}") ########################## diff --git a/Makefile.runtime b/Makefile.runtime index 2f171cbef..dcda0126d 100644 --- a/Makefile.runtime +++ b/Makefile.runtime @@ -17,7 +17,7 @@ all: runtime # Compile runtime but do not link runtime.o: runtime.c - $(CC) -c $(CFLAGS) $^ -DGIT_VERSION=\"$(git describe --tags --always --abbrev=7)\" \ + $(CC) -c $(CFLAGS) $^ -DGIT_COMMIT=\"$(git describe --tags --always --abbrev=7)\" \ -I./squashfuse/ -D_FILE_OFFSET_BITS=64 # Add .upd_info and .sha256_sig sections diff --git a/build-tool-osx.sh b/build-tool-osx.sh index 837ae9575..f49c0c8cb 100755 --- a/build-tool-osx.sh +++ b/build-tool-osx.sh @@ -101,7 +101,7 @@ cp ../squashfs-tools/squashfs-tools/mksquashfs . # Compile appimagetool but do not link - glib version -$CC -DGIT_VERSION=\"$(git describe --tags --always --abbrev=7)\" -D_FILE_OFFSET_BITS=64 -I../squashfuse/ \ +$CC -DGIT_COMMIT=\"$(git describe --tags --always --abbrev=7)\" -D_FILE_OFFSET_BITS=64 -I../squashfuse/ \ $(pkg-config --cflags glib-2.0) -g -Os ../getsection.c -c ../appimagetool.c # Now statically link against libsquashfuse - glib version diff --git a/cmake/cpack_debs.cmake b/cmake/cpack_debs.cmake index a745cbc21..979583b02 100644 --- a/cmake/cpack_debs.cmake +++ b/cmake/cpack_debs.cmake @@ -5,8 +5,8 @@ set(PROJECT_VERSION 1.0) set(CPACK_GENERATOR "DEB") set(CPACK_DEBIAN_PACKAGE_VERSION ${PROJECT_VERSION}) -file(READ ${PROJECT_BINARY_DIR}/GIT_VERSION GIT_VERSION) -set(CPACK_DEBIAN_PACKAGE_RELEASE "git-${GIT_VERSION}") +file(READ ${PROJECT_BINARY_DIR}/GIT_COMMIT GIT_COMMIT) +set(CPACK_DEBIAN_PACKAGE_RELEASE "git-${GIT_COMMIT}") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "AppImage Team") set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://appimage.org/") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 800d5f7ad..b860880b9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -41,7 +41,7 @@ set_target_properties(libappimage PROPERTIES PUBLIC_HEADER "${PROJECT_SOURCE_DIR target_compile_definitions(libappimage PRIVATE -D_FILE_OFFSET_BITS=64 - PRIVATE -DGIT_VERSION="${GIT_VERSION}" + PRIVATE -DGIT_COMMIT="${GIT_COMMIT}" PRIVATE -DENABLE_BINRELOC ) @@ -89,7 +89,7 @@ set_target_properties(libappimage_static PROPERTIES PUBLIC_HEADER "${PROJECT_SOU target_compile_definitions(libappimage_static PRIVATE -D_FILE_OFFSET_BITS=64 - PRIVATE -DGIT_VERSION="${GIT_VERSION}" + PRIVATE -DGIT_COMMIT="${GIT_COMMIT}" PRIVATE -DENABLE_BINRELOC ) @@ -146,7 +146,7 @@ target_link_libraries(appimagetool target_compile_definitions(appimagetool PRIVATE -D_FILE_OFFSET_BITS=64 - PRIVATE -DGIT_VERSION="${GIT_VERSION}" + PRIVATE -DGIT_COMMIT="${GIT_COMMIT}" PRIVATE -DBUILD_NUMBER="${BUILD_NUMBER}" PRIVATE -DBUILD_DATE="${DATE}" PRIVATE -DENABLE_BINRELOC @@ -180,7 +180,7 @@ target_link_libraries(appimaged ) target_compile_definitions(appimaged - PRIVATE -DGIT_VERSION="${GIT_VERSION}" + PRIVATE -DGIT_COMMIT="${GIT_COMMIT}" PRIVATE -DBUILD_NUMBER="${BUILD_NUMBER}" PRIVATE -DBUILD_DATE="${DATE}" PRIVATE -D_FILE_OFFSET_BITS=64 diff --git a/src/appimaged.c b/src/appimaged.c index 0474046a5..dc63ab443 100644 --- a/src/appimaged.c +++ b/src/appimaged.c @@ -238,7 +238,7 @@ int main(int argc, char ** argv) { fprintf( stderr, "appimaged, %s (commit %s), build %s built on %s\n", - RELEASE_NAME, GIT_VERSION, BUILD_NUMBER, BUILD_DATE + RELEASE_NAME, GIT_COMMIT, BUILD_NUMBER, BUILD_DATE ); if(showVersionOnly) diff --git a/src/appimagetool.c b/src/appimagetool.c index e34099909..3887f44dd 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -503,7 +503,7 @@ main (int argc, char *argv[]) fprintf( stderr, "appimagetool, %s (commit %s), build %s built on %s\n", - RELEASE_NAME, GIT_VERSION, BUILD_NUMBER, BUILD_DATE + RELEASE_NAME, GIT_COMMIT, BUILD_NUMBER, BUILD_DATE ); // always show version, but exit immediately if only the version number was requested diff --git a/src/build-runtime.sh.in b/src/build-runtime.sh.in index fd1bc457d..9233b7917 100755 --- a/src/build-runtime.sh.in +++ b/src/build-runtime.sh.in @@ -36,7 +36,7 @@ trap cleanup EXIT cd "$build_dir" # Compile runtime but do not link -$CC -DGIT_VERSION=\"$git_version\" -I"@xz_INCLUDE_DIR@" -I"@squashfuse_INCLUDE_DIR@" \ +$CC -DGIT_COMMIT=\"$git_version\" -I"@xz_INCLUDE_DIR@" -I"@squashfuse_INCLUDE_DIR@" \ -D_FILE_OFFSET_BITS=64 -g $small_FLAGS -c "$repo_root"/runtime.c # Prepare 1024 bytes of space for updateinformation diff --git a/src/runtime.c b/src/runtime.c index 001aceb47..5765724b7 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -413,7 +413,7 @@ main (int argc, char *argv[]) } if(arg && strcmp(arg,"appimage-version")==0) { - fprintf(stderr,"Version: %s\n", GIT_VERSION); + fprintf(stderr,"Version: %s\n", GIT_COMMIT); exit(0); } @@ -445,7 +445,7 @@ main (int argc, char *argv[]) // If there is an argument starting with appimage- (but not appimage-mount which is handled further down) // then stop here and print an error message if((arg && strncmp(arg, "appimage-", 8) == 0) && (arg && strcmp(arg,"appimage-mount")!=0)) { - fprintf(stderr,"--%s is not yet implemented in version %s\n", arg, GIT_VERSION); + fprintf(stderr,"--%s is not yet implemented in version %s\n", arg, GIT_COMMIT); exit(1); } diff --git a/src/shared.c b/src/shared.c index f72c18025..ce4c03dc5 100644 --- a/src/shared.c +++ b/src/shared.c @@ -555,11 +555,11 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag g_free(icon_with_md5); } - /* At compile time, inject GIT_VERSION like this: - * cc ... -DGIT_VERSION=\"$(git describe --tags --always --abbrev=7)\" -.. + /* At compile time, inject GIT_COMMIT like this: + * cc ... -DGIT_COMMIT=\"$(git describe --tags --always --abbrev=7)\" -.. */ { - gchar *generated_by = g_strdup_printf("Generated by appimaged %s", GIT_VERSION); + gchar *generated_by = g_strdup_printf("Generated by appimaged %s", GIT_COMMIT); g_key_file_set_value(key_file_structure, "Desktop Entry", "X-AppImage-Comment", generated_by); g_free(generated_by); } From 47bbbb194e7730db151b616237efb48a3adf3639 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 00:53:03 +0100 Subject: [PATCH 072/544] [debug] See what's going on --- travis/travis-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index fe686539b..68d547253 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -84,7 +84,7 @@ find . -not -executable -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")' cmake --build . --target "preinstall" cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log && exit 1 -mv *.deb out/ +mv -v *.deb out/ # fix filename for upload sudo mv out/AppRun out/AppRun-"$ARCH" From 735f8fb3cceaf45ac202ef8bed3142898951f0b8 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 02:07:14 +0100 Subject: [PATCH 073/544] Fix build, mk. 1 --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 03b3c91b4..4c74d22b7 100755 --- a/build.sh +++ b/build.sh @@ -93,4 +93,4 @@ bash -ex "$HERE/build-appdirs.sh" ls -lh mkdir -p out -cp -r install_prefix/usr/{bin,lib/appimagekit}/* appdirs/*.AppDir *.deb out/ +cp -r install_prefix/usr/{bin,lib/appimagekit}/* appdirs/*.AppDir out/ From 1202b9e43bac31ef9cf6badee9d67027cf840fb6 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 16:30:22 +0100 Subject: [PATCH 074/544] Ignore exit code of build-appimages Docker container --- travis/travis-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 68d547253..5f904562a 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -52,7 +52,7 @@ docker run \ -v "${PWD}"/build:/build \ -v $HOME/.gnupg:/root/.gnupg \ "$DOCKER_IMAGE" \ - /bin/bash -x "/travis/build-appimages.sh" + /bin/bash -x "/travis/build-appimages.sh" || true cd build/ From 9285e4d994bbe6e5ab8861f79822b370b117e5aa Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 16:39:53 +0100 Subject: [PATCH 075/544] Use temporary Docker containers Otherwise, all the build containers will remain on the Docker host, and won't be cleaned up properly. --- travis/travis-build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 5f904562a..3f32b7aba 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -29,7 +29,7 @@ wget https://github.com/AppImage/AppImageKit/files/584665/data.zip -O data.tar.g mkdir -p ./out/ # build AppImageKit -docker run \ +docker run --rm \ --device /dev/fuse:mrw \ -e ARCH -e TRAVIS -e TRAVIS_BUILD_NUMBER \ -i \ @@ -43,7 +43,7 @@ find build/out/appimagetool.AppDir/ find build/out/appimaged.AppDir/ # build AppImages -docker run \ +docker run --rm \ --cap-add SYS_ADMIN \ --device /dev/fuse:mrw \ -e ARCH -e TRAVIS -e TRAVIS_BUILD_NUMBER \ From fff9029e44706aa673c34a1667f3c23e5d1eae83 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 16:57:02 +0100 Subject: [PATCH 076/544] Fix build, mk. 2 --- travis/travis-build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 3f32b7aba..0f77ca94a 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -80,8 +80,8 @@ mv out/runtime out/runtime-"$ARCH" sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages -find . -not -executable -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' "{}" \; -cmake --build . --target "preinstall" +#find . -not -executable -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' "{}" \; +#cmake --build . --target "preinstall" cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log && exit 1 mv -v *.deb out/ From 2712c6f5c41ccf17598e4c02ab120c99af50a363 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 18:49:50 +0100 Subject: [PATCH 077/544] Fix build, mk. 3 --- travis/travis-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 0f77ca94a..21192d281 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -80,7 +80,7 @@ mv out/runtime out/runtime-"$ARCH" sudo rm -rf out/*.AppDir out/*.AppImage.digest # build Debian packages -#find . -not -executable -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' "{}" \; +find . -not -executable -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' "{}" \; #cmake --build . --target "preinstall" cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log && exit 1 From 37afeac2b607381655efaa164d6783e9164bafaf Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 19:21:53 +0100 Subject: [PATCH 078/544] Fix build, mk. 4 --- ...{build-appimages.sh => build-packages-and-appimages.sh} | 4 ++++ travis/travis-build.sh | 7 +------ 2 files changed, 5 insertions(+), 6 deletions(-) rename travis/{build-appimages.sh => build-packages-and-appimages.sh} (82%) diff --git a/travis/build-appimages.sh b/travis/build-packages-and-appimages.sh similarity index 82% rename from travis/build-appimages.sh rename to travis/build-packages-and-appimages.sh index 583a175b2..9ed371b8f 100644 --- a/travis/build-appimages.sh +++ b/travis/build-packages-and-appimages.sh @@ -1,5 +1,9 @@ #! /bin/bash +cd /build + +cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log && exit 1 + cd /build/out ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -s -v \ diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 21192d281..734cae03b 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -52,7 +52,7 @@ docker run --rm \ -v "${PWD}"/build:/build \ -v $HOME/.gnupg:/root/.gnupg \ "$DOCKER_IMAGE" \ - /bin/bash -x "/travis/build-appimages.sh" || true + /bin/bash -x "/travis/build-packages-and-appimages.sh" || true cd build/ @@ -79,11 +79,6 @@ mv out/runtime out/runtime-"$ARCH" # remove unused files sudo rm -rf out/*.AppDir out/*.AppImage.digest -# build Debian packages -find . -not -executable -type f -exec sed -i 's|/AppImageKit|'$(dirname "$PWD")'|g' "{}" \; -#cmake --build . --target "preinstall" -cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log && exit 1 - mv -v *.deb out/ # fix filename for upload From dae8c8b76170e65d4bcfa05e6efc5275a7f5ebb8 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 19:31:08 +0100 Subject: [PATCH 079/544] Fix build, mk. 5 --- travis/build-packages-and-appimages.sh | 5 +++-- travis/travis-build.sh | 4 +--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/travis/build-packages-and-appimages.sh b/travis/build-packages-and-appimages.sh index 9ed371b8f..7f3e2cdd7 100644 --- a/travis/build-packages-and-appimages.sh +++ b/travis/build-packages-and-appimages.sh @@ -1,10 +1,11 @@ #! /bin/bash -cd /build +cd /AppImageKit/build cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log && exit 1 +mv *.deb out/ -cd /build/out +cd out/ ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -s -v \ -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 734cae03b..b5a0d56ec 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -48,8 +48,8 @@ docker run --rm \ --device /dev/fuse:mrw \ -e ARCH -e TRAVIS -e TRAVIS_BUILD_NUMBER \ -i \ + -v "${PWD}":/AppImageKit \ -v "${PWD}"/travis/:/travis \ - -v "${PWD}"/build:/build \ -v $HOME/.gnupg:/root/.gnupg \ "$DOCKER_IMAGE" \ /bin/bash -x "/travis/build-packages-and-appimages.sh" || true @@ -79,7 +79,5 @@ mv out/runtime out/runtime-"$ARCH" # remove unused files sudo rm -rf out/*.AppDir out/*.AppImage.digest -mv -v *.deb out/ - # fix filename for upload sudo mv out/AppRun out/AppRun-"$ARCH" From 5514f7dcc5bb5c9a841b3ea2dd6272507484c636 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 19:40:19 +0100 Subject: [PATCH 080/544] Fix build, mk. 6 --- travis/build-packages-and-appimages.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/travis/build-packages-and-appimages.sh b/travis/build-packages-and-appimages.sh index 7f3e2cdd7..6aa8ce905 100644 --- a/travis/build-packages-and-appimages.sh +++ b/travis/build-packages-and-appimages.sh @@ -1,8 +1,10 @@ #! /bin/bash +set -e + cd /AppImageKit/build -cpack -V || cat _CPack_Packages/Linux/DEB/PreinstallOutput.log && exit 1 +cpack -V mv *.deb out/ cd out/ From 73647c61bc43f4a53f4479aeb8fbcf9d36d7abb8 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 19:51:11 +0100 Subject: [PATCH 081/544] Fix variable name --- cmake/AppImageKitConfigVersion.cmake.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/AppImageKitConfigVersion.cmake.in b/cmake/AppImageKitConfigVersion.cmake.in index 93150fb88..a55ea6801 100644 --- a/cmake/AppImageKitConfigVersion.cmake.in +++ b/cmake/AppImageKitConfigVersion.cmake.in @@ -1,4 +1,4 @@ -set(PACKAGE_VERSION "@GIT_VERSION@") +set(PACKAGE_VERSION "@GIT_COMMIT@") # Check whether the requested PACKAGE_FIND_VERSION is compatible if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") @@ -8,4 +8,4 @@ else() if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") set(PACKAGE_VERSION_EXACT TRUE) endif() -endif() \ No newline at end of file +endif() From f9f0aab71b7f74a23a909bb074e67b232141b1ab Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 20:26:14 +0100 Subject: [PATCH 082/544] Log GIT_COMMIT --- cmake/cpack_debs.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/cpack_debs.cmake b/cmake/cpack_debs.cmake index 979583b02..8e33e4ef7 100644 --- a/cmake/cpack_debs.cmake +++ b/cmake/cpack_debs.cmake @@ -6,6 +6,7 @@ set(CPACK_GENERATOR "DEB") set(CPACK_DEBIAN_PACKAGE_VERSION ${PROJECT_VERSION}) file(READ ${PROJECT_BINARY_DIR}/GIT_COMMIT GIT_COMMIT) +message("GIT_COMMIT: ${GIT_COMMIT}") set(CPACK_DEBIAN_PACKAGE_RELEASE "git-${GIT_COMMIT}") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "AppImage Team") From 2b52ac06774128fcebe1909028924c03a7349ab7 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 20:41:18 +0100 Subject: [PATCH 083/544] Fix build, mk. 6 --- travis/travis-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index b5a0d56ec..13edf4f84 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -52,7 +52,7 @@ docker run --rm \ -v "${PWD}"/travis/:/travis \ -v $HOME/.gnupg:/root/.gnupg \ "$DOCKER_IMAGE" \ - /bin/bash -x "/travis/build-packages-and-appimages.sh" || true + /bin/bash -x "/travis/build-packages-and-appimages.sh" cd build/ From c1b37e7c76503213be1beff46acbbf9b4d628558 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 21:01:45 +0100 Subject: [PATCH 084/544] Fix GIT_COMMIT command --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2dfe559fd..a424bee3e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,7 @@ include(CTest) # determine Git commit ID execute_process( - COMMAND git describe --tags --always --abbrev=7 + COMMAND git rev-parse --short HEAD WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} OUTPUT_VARIABLE GIT_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE From dc3e0be4d850798551c7a8696e73e524595e1b23 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 21:25:54 +0100 Subject: [PATCH 085/544] Fix missing escaping in zsyncmake call Also fixes potential buffer overflow: the file pointer popen() returns was never fread(), therefore, if the child process would have produced a lot of output, the pipe might have overflowed. This can't happen any more with execv(). --- src/appimagetool.c | 42 +++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 3887f44dd..514d2bee8 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1117,15 +1117,39 @@ main (int argc, char *argv[]) } else { fprintf (stderr, "zsyncmake is available and updateinformation is provided, " "hence generating zsync file\n"); - sprintf (command, "%s %s -u %s", zsyncmake_path, destination, basename(destination)); - if(verbose) - fprintf (stderr, "%s\n", command); - fp = popen(command, "r"); - if (fp == NULL) - die("Failed to run zsyncmake command"); - int exitstatus = pclose(fp); - if (WEXITSTATUS(exitstatus) != 0) - die("zsyncmake command did not succeed"); + + int pid = fork(); + + if (verbose) + fprintf(stderr, "%s %s -u %s", zsyncmake_path, destination, basename(destination)); + + if (pid == -1) { + // fork error + die("fork() failed"); + } else if (pid == 0) { + char* zsyncmake_command[] = {zsyncmake_path, destination, "-u", basename(destination), NULL}; + + // redirect stdout/stderr to /dev/null + int fd = open("/dev/null", O_WRONLY); + + dup2(fd, 1); + dup2(fd, 2); + close(fd); + + execv(zsyncmake_path, zsyncmake_command); + + die("execv() should not return"); + } else { + int exitstatus; + + if (waitpid(pid, &exitstatus, 0) == -1) { + perror("waitpid() failed"); + exit(EXIT_FAILURE); + } + + if (WEXITSTATUS(exitstatus) != 0) + die("zsyncmake command did not succeed"); + } } } From 288e8e6bc324d756e0c42c7a142886b79ff6005c Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 21:38:06 +0100 Subject: [PATCH 086/544] Fix build, mk. 8 --- cmake/cpack_debs.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/cpack_debs.cmake b/cmake/cpack_debs.cmake index 8e33e4ef7..0f4332a9c 100644 --- a/cmake/cpack_debs.cmake +++ b/cmake/cpack_debs.cmake @@ -7,7 +7,7 @@ set(CPACK_GENERATOR "DEB") set(CPACK_DEBIAN_PACKAGE_VERSION ${PROJECT_VERSION}) file(READ ${PROJECT_BINARY_DIR}/GIT_COMMIT GIT_COMMIT) message("GIT_COMMIT: ${GIT_COMMIT}") -set(CPACK_DEBIAN_PACKAGE_RELEASE "git-${GIT_COMMIT}") +set(CPACK_DEBIAN_PACKAGE_RELEASE "git${GIT_COMMIT}") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "AppImage Team") set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://appimage.org/") From 65286fa0ea2020edeec94dce6cc83f6184b78659 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 21:46:19 +0100 Subject: [PATCH 087/544] Temporary workaround: ignore exit code of appimagetool calls --- travis/build-packages-and-appimages.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/travis/build-packages-and-appimages.sh b/travis/build-packages-and-appimages.sh index 6aa8ce905..0bf207d26 100644 --- a/travis/build-packages-and-appimages.sh +++ b/travis/build-packages-and-appimages.sh @@ -9,10 +9,12 @@ mv *.deb out/ cd out/ +# || true -- temporary workaround + ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -s -v \ -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ - appimagetool-"$ARCH".AppImage + appimagetool-"$ARCH".AppImage || true ./appimagetool-"$ARCH".AppImage ./appimaged.AppDir/ -s -v \ -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimaged-$ARCH.AppImage.zsync" \ - appimaged-"$ARCH".AppImage + appimaged-"$ARCH".AppImage || true From 20a26869cdc86e5c7df73135265cc7346d2e3450 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 21:54:26 +0100 Subject: [PATCH 088/544] Don't upload any .deb except for appimaged's --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index c4edf5b3c..2fa6e4055 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,6 +16,8 @@ after_success: - ls -lh out/* # <= wrong line: see https://travis-ci.org/AppImage/AppImageKit/jobs/347965050#L4211 - ls -lh build/out/* - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh + # don't upload any .debs but appimaged's + - find build/out/ -iname '*.deb' -not -iname '*appimaged*' -print -delete - bash ./upload.sh build/out/* notifications: From f90fd3a4cec2491f85fe068ddb230bb0f01dc4d0 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 22:28:16 +0100 Subject: [PATCH 089/544] SET CPACK_DEBIAN_PACKAGE_ARCHITECTURE for builds on CentOS --- cmake/cpack_debs.cmake | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cmake/cpack_debs.cmake b/cmake/cpack_debs.cmake index 0f4332a9c..7386cfdfa 100644 --- a/cmake/cpack_debs.cmake +++ b/cmake/cpack_debs.cmake @@ -9,6 +9,15 @@ file(READ ${PROJECT_BINARY_DIR}/GIT_COMMIT GIT_COMMIT) message("GIT_COMMIT: ${GIT_COMMIT}") set(CPACK_DEBIAN_PACKAGE_RELEASE "git${GIT_COMMIT}") +if($ENV{ARCH}) + set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE $ENV{ARCH}) + if(CPACK_DEBIAN_PACKAGE_ARCHITECTURE MATCHES "i686") + set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "i386") + endif() +endif() + +message("CPACK_DEBIAN_PACKAGE_ARCHITECTURE: ${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}") + set(CPACK_DEBIAN_PACKAGE_MAINTAINER "AppImage Team") set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://appimage.org/") set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) From 8c7e271f3786a25a3c02695649728c7a9dbee58d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 22:38:59 +0100 Subject: [PATCH 090/544] Remove deprecated files --- appimaged.ctl | 37 ------------------------------------- travis/travis-build.sh | 2 -- 2 files changed, 39 deletions(-) delete mode 100644 appimaged.ctl diff --git a/appimaged.ctl b/appimaged.ctl deleted file mode 100644 index 43b5f969c..000000000 --- a/appimaged.ctl +++ /dev/null @@ -1,37 +0,0 @@ -Section: misc -Priority: optional -Homepage: http://appimage.org/ -Standards-Version: 3.9.2 - -Package: appimaged -Version: 1.0 -Maintainer: probonopd -Depends: libarchive13, libc6 (>= 2.4), libglib2.0-0, zlib1g, fuse -# Also including dependencies of the AppImages as assumed per excludedeblist -# generated with -# BLACKLISTED_FILES=$(wget -q https://github.com/probonopd/AppImages/raw/master/excludedeblist -O - | sed '/^\s*$/d' | sed '/^#.*$/d' | cut -d "#" -f 1 | sort | uniq) -# echo $BLACKLISTED_FILES | sed -e 's| |, |g' -Recommends: apt, apt-transport-https, dbus, debconf, dictionaries-common, dpkg, fontconfig, fontconfig-config, gksu, glib-networking, gstreamer1.0-plugins-base, gstreamer1.0-plugins-good, gstreamer1.0-plugins-ugly, gstreamer1.0-pulseaudio, gtk2-engines-pixbuf, gvfs-backends, kde-runtime, libasound2, libatk1.0-0, libc6, libc6-dev, libcairo2, libcups2, libdbus-1-3, libdrm2, libegl1-mesa, libfontconfig1, libgbm1, libgcc1, libgdk-pixbuf2.0-0, libgl1, libgl1-mesa, libgl1-mesa-dri, libgl1-mesa-glx, libglib2.0-0, libglu1-mesa, libgpg-error0, libgtk2.0-0, libgtk-3-0, libnss3, libpango-1.0-0, libpango1.0-0, libpangocairo-1.0-0, libpangoft2-1.0-0, libstdc++6, libtasn1-6, libwayland-egl1-mesa, libxcb1, lsb-base, mime-support, passwd, udev, uuid-runtime -Architecture: %ARCH% -Copyright: ../../LICENSE -# Changelog: -Readme: ../../README.md -# Extra-Files: -Files: appimaged /usr/bin -File: /usr/lib/systemd/user/appimaged.service - [Unit] - Description=AppImage daemon - After=basic.target - - [Service] - ExecStart=/usr/bin/appimaged - Restart=always - RestartSec=30 - StartLimitIntervalSec=300 - StartLimitBurst=3 - - [Install] - WantedBy=graphical.target -# -Description: Optional AppImage daemon for desktop integration - Integrates AppImages into the desktop, e.g., installs icons and menu entries diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 13edf4f84..72c3ab014 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -6,11 +6,9 @@ set -x case "$ARCH" in "x86_64") export ARCH="x86_64" - sed -i -e 's|%ARCH%|amd64|g' appimaged.ctl ;; "i386"|"i686") export ARCH="i686" - sed -i -e 's|%ARCH%|i386|g' appimaged.ctl # sleep so as not to overwrite during uploading (FIXME) sleep 60 ;; From 6aa390b93f6190b137363cf85f2486589cb8d822 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 22:39:11 +0100 Subject: [PATCH 091/544] Fix CMake check --- cmake/cpack_debs.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/cpack_debs.cmake b/cmake/cpack_debs.cmake index 7386cfdfa..e97dfb02d 100644 --- a/cmake/cpack_debs.cmake +++ b/cmake/cpack_debs.cmake @@ -9,7 +9,7 @@ file(READ ${PROJECT_BINARY_DIR}/GIT_COMMIT GIT_COMMIT) message("GIT_COMMIT: ${GIT_COMMIT}") set(CPACK_DEBIAN_PACKAGE_RELEASE "git${GIT_COMMIT}") -if($ENV{ARCH}) +if(DEFINED ENV{ARCH}) set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE $ENV{ARCH}) if(CPACK_DEBIAN_PACKAGE_ARCHITECTURE MATCHES "i686") set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "i386") From a7752d18b01d6a333723a6e9781e65231e7d6d36 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 13 Mar 2018 22:55:29 +0100 Subject: [PATCH 092/544] Remove deprecated debug print --- travis/travis-build.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 72c3ab014..971ec561f 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -14,9 +14,6 @@ case "$ARCH" in ;; esac -# debug print -grep Architecture appimaged.ctl - # clean up and download data from GitHub rm -rf data.tar.g* .gnu* || true wget https://github.com/AppImage/AppImageKit/files/584665/data.zip -O data.tar.gz.gpg From dfd9f943ec089f87db403cd2f809a312134fe41b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 16 Mar 2018 14:51:49 +0100 Subject: [PATCH 093/544] Disable .deb packaging by default For use as a submodule, the CPack packaging isn't needed, and might even conflict with the top level project's configuration. Therefore, by default, the packaging should be disabled, and explicitly enabled in our builds. --- CMakeLists.txt | 8 ++++++-- build.sh | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5201e8c94..b6298a0a7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,9 +103,13 @@ set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/sanitizers-cmake/cmake" ${CMA add_subdirectory(src) ################################ -# packing # +# packaging # ################################ -include(cmake/cpack_debs.cmake) +set(APPIMAGEKIT_PACKAGE_DEBS FALSE CACHE BOOL "") + +if(APPIMAGEKIT_PACKAGE_DEBS) + include(cmake/cpack_debs.cmake) +endif() ################################ # unit and functionality tests # diff --git a/build.sh b/build.sh index 4c74d22b7..a4887644d 100755 --- a/build.sh +++ b/build.sh @@ -69,7 +69,7 @@ git submodule update --init --recursive mkdir build cd build -cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_TESTING=ON +cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_TESTING=ON -DAPPIMAGEKIT_PACKAGE_DEBS=ON make -j$JOBS make install DESTDIR=install_prefix/ From df75e2cdf7cc3a6e5ed340a57fe4e0e5399a8e74 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 16 Mar 2018 15:46:03 +0100 Subject: [PATCH 094/544] Make sure all libappimage functions have appimage_ prefix --- include/appimage/appimage.h | 9 +++++---- src/shared.c | 25 +++++++++++++------------ src/shared.h | 12 +++++------- tests/test_libappimage.cpp | 32 ++++++++++++++++---------------- 4 files changed, 39 insertions(+), 39 deletions(-) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index 756554258..1bb1c62cb 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -7,10 +7,10 @@ extern "C" { /* Return the md5 hash constructed according to * https://specifications.freedesktop.org/thumbnail-spec/thumbnail-spec-latest.html#THUMBSAVE * This can be used to identify files that are related to a given AppImage at a given location */ -char *get_md5(char const *path); +char *appimage_get_md5(char const* path); /* Check if a file is an AppImage. Returns the image type if it is, or -1 if it isn't */ -int check_appimage_type( const char *path, bool verbose); +int appimage_get_type(const char* path, bool verbose); /* Register a type 1 AppImage in the system */ bool appimage_type1_register_in_system(const char *path, bool verbose); @@ -25,12 +25,13 @@ int appimage_register_in_system(const char *path, bool verbose); int appimage_unregister_in_system(const char *path, bool verbose); /* Extract a given file from the appimage following the symlinks until a concrete file is found */ -void extract_file_following_symlinks(const char *appimage_file_path, const char *file_path, const char *target_dir); +void appimage_extract_file_following_symlinks(const char* appimage_file_path, const char* file_path, + const char* target_dir); /* Create AppImage thumbnail according to * https://specifications.freedesktop.org/thumbnail-spec/0.8.0/index.html */ -void create_thumbnail(const char * appimage_file_path); +void appimage_create_thumbnail(const char* appimage_file_path); #ifdef __cplusplus } #endif diff --git a/src/shared.c b/src/shared.c index ce4c03dc5..032b3ec0a 100644 --- a/src/shared.c +++ b/src/shared.c @@ -92,7 +92,7 @@ gchar* replace_str(const gchar const *src, const gchar const *find, const gchar /* Return the md5 hash constructed according to * https://specifications.freedesktop.org/thumbnail-spec/thumbnail-spec-latest.html#THUMBSAVE * This can be used to identify files that are related to a given AppImage at a given location */ -char *get_md5(const char *path) +char *appimage_get_md5(const char* path) { gchar *uri = g_filename_to_uri (path, NULL, NULL); if (uri != NULL) @@ -120,7 +120,7 @@ char *get_md5(const char *path) */ char *get_thumbnail_path(const char *path, char *thumbnail_size, gboolean verbose) { - char *md5 = get_md5(path); + char *md5 = appimage_get_md5(path); char *file = g_strconcat(md5, ".png", NULL); gchar *thumbnail_path = g_build_filename(g_get_user_cache_dir(), "thumbnails", thumbnail_size, file, NULL); g_free(file); @@ -210,7 +210,7 @@ void move_icon_to_destination(gchar *icon_path, gboolean verbose) } /* Check if a file is an AppImage. Returns the image type if it is, or -1 if it isn't */ -int check_appimage_type(const char *path, gboolean verbose) +int appimage_get_type(const char* path, gboolean verbose) { FILE *f = fopen(path, "rt"); if (f != NULL) @@ -701,7 +701,7 @@ bool appimage_type1_register_in_system(const char *path, gboolean verbose) { fprintf(stderr, "ISO9660 based type 1 AppImage\n"); gchar *desktop_icon_value_original = NULL; - char *md5 = get_md5(path); + char *md5 = appimage_get_md5(path); if(verbose) fprintf(stderr, "md5 of URI RFC 2396: %s\n", md5); @@ -870,7 +870,7 @@ bool appimage_type2_register_in_system(char *path, gboolean verbose) { fprintf(stderr, "squashfs based type 2 AppImage\n"); long unsigned int fs_offset; // The offset at which a squashfs image is expected - char *md5 = get_md5(path); + char *md5 = appimage_get_md5(path); GKeyFile *key_file_structure = g_key_file_new(); // A structure that will hold the information from the desktop file gchar *desktop_icon_value_original = "iDoNotMatchARegex"; // FIXME: otherwise the regex does weird stuff in the first run if(verbose) @@ -937,7 +937,7 @@ bool appimage_type2_register_in_system(char *path, gboolean verbose) } // forward declare function -void create_thumbnail(const gchar *appimage_file_path, gboolean verbose); +void appimage_create_thumbnail(const gchar *appimage_file_path, gboolean verbose); /* Register an AppImage in the system */ int appimage_register_in_system(char *path, gboolean verbose) @@ -949,10 +949,10 @@ int appimage_register_in_system(char *path, gboolean verbose) g_str_has_suffix(path, ".~") ) return 0; - int type = check_appimage_type(path, verbose); + int type = appimage_get_type(path, verbose); if(type == 1 || type == 2) { fprintf(stderr, "\n-> Registering type %d AppImage: %s\n", type, path); - create_thumbnail(path, false); + appimage_create_thumbnail(path, false); } else { if (verbose) fprintf(stderr, "-> Skipping file %s\n", path); @@ -1027,7 +1027,7 @@ void unregister_using_md5_id(const char *name, int level, char* md5, gboolean ve /* Unregister an AppImage in the system */ int appimage_unregister_in_system(char *path, gboolean verbose) { - char *md5 = get_md5(path); + char *md5 = appimage_get_md5(path); /* The file is already gone by now, so we can't determine its type anymore */ fprintf(stderr, "_________________________\n"); @@ -1315,7 +1315,7 @@ appimage_handler appimage_type_2_create_handler() { /* Factory function for creating the right appimage handler for * a given file. */ appimage_handler create_appimage_handler(const char *const path) { - int appimage_type = check_appimage_type(path, 0); + int appimage_type = appimage_get_type(path, 0); appimage_handler handler; fprintf(stderr,"AppImage type: %d\n", appimage_type); @@ -1393,7 +1393,7 @@ void extract_appimage_icon(appimage_handler *h, gchar *target) { /* Create AppImage thumbanil according to * https://specifications.freedesktop.org/thumbnail-spec/0.8.0/index.html */ -void create_thumbnail(const gchar *appimage_file_path, gboolean verbose) { +void appimage_create_thumbnail(const gchar *appimage_file_path, gboolean verbose) { // extract AppImage icon to /tmp appimage_handler handler = create_appimage_handler(appimage_file_path); @@ -1417,7 +1417,8 @@ void create_thumbnail(const gchar *appimage_file_path, gboolean verbose) { } -void extract_file_following_symlinks(const gchar const *appimage_file_path, const char *file_path, const char *target_dir) { +void appimage_extract_file_following_symlinks(const gchar* appimage_file_path, const char* file_path, + const char* target_dir) { appimage_handler handler = create_appimage_handler(appimage_file_path); extract_appimage_file(&handler, file_path, target_dir); diff --git a/src/shared.h b/src/shared.h index b9efaba6f..21a2f12b1 100644 --- a/src/shared.h +++ b/src/shared.h @@ -19,8 +19,8 @@ struct appimage_handler bool is_open; } typedef appimage_handler; -void extract_file_following_symlinks(const gchar* appimage_file_path, const char* file_path, - const char* target_dir); +void appimage_extract_file_following_symlinks(const gchar* appimage_file_path, const char* file_path, + const char* target_dir); void extract_appimage_icon(appimage_handler* h, gchar* target); @@ -84,9 +84,7 @@ void delete_thumbnail(char* path, char* size, gboolean verbose); int appimage_register_in_system(char* path, gboolean verbose); -void create_thumbnail(const gchar* appimage_file_path, gboolean verbose); - -void create_thumbnail(const gchar* appimage_file_path, gboolean verbose); +void appimage_create_thumbnail(const gchar* appimage_file_path, gboolean verbose); bool appimage_type2_register_in_system(char* path, gboolean verbose); @@ -101,13 +99,13 @@ gchar** squash_get_matching_files(sqfs* fs, char* pattern, gchar* desktop_icon_v void squash_extract_inode_to_file(sqfs* fs, sqfs_inode* inode, const gchar* dest); -int check_appimage_type(const char* path, gboolean verbose); +int appimage_get_type(const char* path, gboolean verbose); void move_icon_to_destination(gchar* icon_path, gboolean verbose); char* get_thumbnail_path(const char* path, char* thumbnail_size, gboolean verbose); -char* get_md5(const char* path); +char* appimage_get_md5(const char* path); gchar* replace_str(const gchar* src, const gchar* find, const gchar* replace); diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index b1cd3dba0..c73797eb6 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -37,7 +37,7 @@ class LibAppImageTest : public AppImageKitTest bool areIntegrationFilesDeployed(const std::string& path) { - gchar *sum = get_md5(path.c_str()); + gchar *sum = appimage_get_md5(path.c_str()); GDir *dir; GError *error; @@ -61,21 +61,21 @@ class LibAppImageTest : public AppImageKitTest } }; -TEST_F(LibAppImageTest, check_appimage_type_invalid) +TEST_F(LibAppImageTest, appimage_get_type_invalid) { - int t = check_appimage_type("/tmp", 0); + int t = appimage_get_type("/tmp", 0); ASSERT_EQ(t, -1); } -TEST_F(LibAppImageTest, check_appimage_type_1) +TEST_F(LibAppImageTest, appimage_get_type_1) { - int t = check_appimage_type(appImage_type_1_file_path.c_str(), 0); + int t = appimage_get_type(appImage_type_1_file_path.c_str(), 0); ASSERT_EQ(t, 1); } -TEST_F(LibAppImageTest, check_appimage_type_2) +TEST_F(LibAppImageTest, appimage_get_type_2) { - int t = check_appimage_type(appImage_type_2_file_path.c_str(), 0); + int t = appimage_get_type(appImage_type_2_file_path.c_str(), 0); ASSERT_EQ(t, 2); } @@ -123,10 +123,10 @@ TEST_F(LibAppImageTest, appimage_unregister_in_system) { ASSERT_FALSE(areIntegrationFilesDeployed(appImage_type_2_file_path)); } -TEST_F(LibAppImageTest, get_md5) +TEST_F(LibAppImageTest, appimage_get_md5) { std::string expected = "128e476a7794288cad0eb2542f7c995b"; - gchar * sum = get_md5("/tmp/testfile"); + gchar * sum = appimage_get_md5("/tmp/testfile"); int res = g_strcmp0(expected.c_str(), sum); ASSERT_EQ(res, 0); @@ -136,16 +136,16 @@ TEST_F(LibAppImageTest, get_md5) TEST_F(LibAppImageTest, get_md5_invalid_file_path) { std::string expected = ""; - gchar * sum = get_md5(""); + gchar * sum = appimage_get_md5(""); int res = g_strcmp0(expected.c_str(), sum); ASSERT_EQ(res, 0); } TEST_F(LibAppImageTest, create_thumbnail_appimage_type_1) { - create_thumbnail(appImage_type_1_file_path.c_str()); + appimage_create_thumbnail(appImage_type_1_file_path.c_str()); - gchar *sum = get_md5(appImage_type_1_file_path.c_str()); + gchar *sum = appimage_get_md5(appImage_type_1_file_path.c_str()); std::string path = std::string(g_get_user_cache_dir()) + "/thumbnails/normal/" + std::string(sum) + ".png"; @@ -159,9 +159,9 @@ TEST_F(LibAppImageTest, create_thumbnail_appimage_type_1) { } TEST_F(LibAppImageTest, create_thumbnail_appimage_type_2) { - create_thumbnail(appImage_type_2_file_path.c_str()); + appimage_create_thumbnail(appImage_type_2_file_path.c_str()); - gchar* sum = get_md5(appImage_type_2_file_path.c_str()); + gchar* sum = appimage_get_md5(appImage_type_2_file_path.c_str()); std::string path = std::string(g_get_user_cache_dir()) + "/thumbnails/normal/" + std::string(sum) + ".png"; @@ -174,9 +174,9 @@ TEST_F(LibAppImageTest, create_thumbnail_appimage_type_2) { rm_file(path); } -TEST_F(LibAppImageTest, extract_file_following_symlinks) { +TEST_F(LibAppImageTest, appimage_extract_file_following_symlinks) { char * target_path = const_cast("/tmp/test_libappimage_tmp_file"); - extract_file_following_symlinks(appImage_type_2_file_path.c_str(), "echo.desktop", target_path); + appimage_extract_file_following_symlinks(appImage_type_2_file_path.c_str(), "echo.desktop", target_path); char *expected = const_cast("[Desktop Entry]\n" "Version=1.0\n" From 8f9096f12927496b630f3299d24e554386f2c2b4 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 20 Mar 2018 23:17:11 +0100 Subject: [PATCH 095/544] Major refactoring of desktop integration code Also adds function appimage_is_registered_in_system. --- include/appimage/appimage.h | 2 + src/shared.c | 623 +++++++++++++++++++++++++++--------- src/shared.h | 6 +- tests/test_libappimage.cpp | 69 ++-- 4 files changed, 532 insertions(+), 168 deletions(-) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index 1bb1c62cb..b533dd03b 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -12,6 +12,8 @@ char *appimage_get_md5(char const* path); /* Check if a file is an AppImage. Returns the image type if it is, or -1 if it isn't */ int appimage_get_type(const char* path, bool verbose); +bool appimage_is_registered_in_system(const char* path); + /* Register a type 1 AppImage in the system */ bool appimage_type1_register_in_system(const char *path, bool verbose); diff --git a/src/shared.c b/src/shared.c index 032b3ec0a..3711daa11 100644 --- a/src/shared.c +++ b/src/shared.c @@ -298,7 +298,9 @@ void squash_extract_inode_to_file(sqfs *fs, sqfs_inode *inode, const gchar *dest * with a custom name that involves the md5 identifier to tie them to a particular * AppImage. */ -gchar **squash_get_matching_files(sqfs *fs, char *pattern, gchar *desktop_icon_value_original, char *md5, gboolean verbose) { +gchar **squash_get_matching_files_install_icons_and_mime_data(sqfs* fs, char* pattern, + gchar* desktop_icon_value_original, char* md5, + gboolean verbose) { GPtrArray *array = g_ptr_array_new(); sqfs_traverse trv; sqfs_err err = sqfs_traverse_open(&trv, fs, sqfs_inode_root(fs)); @@ -430,6 +432,18 @@ gboolean g_key_file_load_from_squash(sqfs *fs, char *path, GKeyFile *key_file_st return success; } +gchar *build_installed_desktop_file_path(gchar* md5, gchar* desktop_filename) { + gchar *partial_path; + partial_path = g_strdup_printf("applications/appimagekit_%s-%s", md5, desktop_filename); + + gchar *destination; + destination = g_build_filename(g_get_user_data_dir(), partial_path, NULL); + + g_free(partial_path); + + return destination; +} + /* Write a modified desktop file to disk that points to the AppImage */ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimage_path, gchar* desktop_filename, int appimage_type, char *md5, gboolean verbose){ if(!g_key_file_has_key(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL)){ @@ -439,8 +453,9 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag // parse [Try]Exec= value, replace executable by AppImage path, append parameters // TODO: should respect quoted strings within value - const gchar const* fields[2] = {G_KEY_FILE_DESKTOP_KEY_EXEC, G_KEY_FILE_DESKTOP_KEY_TRY_EXEC}; - for (int i = 0; i < 2; i++) { + const gchar const* fields[] = {G_KEY_FILE_DESKTOP_KEY_EXEC, G_KEY_FILE_DESKTOP_KEY_TRY_EXEC}; + + for (int i = 0; i < (sizeof(fields) / sizeof(gchar*)); i++) { char* field_value = g_key_file_get_value(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, fields[i], NULL); // TryExec is not a mandatory field @@ -653,11 +668,7 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag /* FIXME: The following is most likely not correct; see the comments above. * Open a GitHub issue or send a pull request if you would like to propose asolution. */ /* TODO: Check for consistency of the id with the AppStream file, if it exists in the AppImage */ - gchar *partial_path; - partial_path = g_strdup_printf("applications/appimagekit_%s-%s", md5, desktop_filename); - gchar *destination; - destination = g_build_filename(g_get_user_data_dir(), partial_path, NULL); - g_free(partial_path); + gchar *destination = build_installed_desktop_file_path(md5, desktop_filename); /* When appimaged sees itself, then do nothing here */ if(strcmp ("appimaged.desktop", desktop_filename) == 0) { @@ -696,248 +707,557 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag return true; } -/* Register a type 1 AppImage in the system */ -bool appimage_type1_register_in_system(const char *path, gboolean verbose) -{ - fprintf(stderr, "ISO9660 based type 1 AppImage\n"); - gchar *desktop_icon_value_original = NULL; - char *md5 = appimage_get_md5(path); +bool appimage_type1_get_desktop_filename_and_key_file(struct archive** a, gchar** desktop_filename, GKeyFile** key_file) { + // iterate over all files ("entries") in the archive + // looking for a file with .desktop extension in the root directory - if(verbose) - fprintf(stderr, "md5 of URI RFC 2396: %s\n", md5); + // must not be freed + struct archive_entry* entry; - struct archive *a; - struct archive_entry *entry; - int r; + int r = -1; + + gchar* filename; - a = archive_read_new(); - archive_read_support_format_iso9660(a); - if ((r = archive_read_open_filename(a, path, 10240))) { - fprintf(stderr, "%s", archive_error_string(a)); - } for (;;) { - r = archive_read_next_header(a, &entry); + r = archive_read_next_header(*a, &entry); + if (r == ARCHIVE_EOF) { - break; + return false; } + if (r != ARCHIVE_OK) { - fprintf(stderr, "%s\n", archive_error_string(a)); - break; + fprintf(stderr, "%s\n", archive_error_string(*a)); + return false; } /* Skip all but regular files; FIXME: Also handle symlinks correctly */ - if(archive_entry_filetype(entry) != AE_IFREG) { + if (archive_entry_filetype(entry) != AE_IFREG) continue; - } - gchar *filename; + filename = replace_str(archive_entry_pathname(entry), "./", ""); /* Get desktop file(s) in the root directory of the AppImage and act on it in one go */ - if((g_str_has_suffix(filename,".desktop") && (NULL == strstr (filename,"/")))) - { + if ((g_str_has_suffix(filename, ".desktop") && (NULL == strstr(filename, "/")))) { fprintf(stderr, "Got root desktop: %s\n", filename); - int r; - const void *buff; - size_t size = 1024*1024; + + const void* buff; + + size_t size = 1024 * 1024; int64_t offset = 0; - r = archive_read_data_block(a, &buff, &size, &offset); + + r = archive_read_data_block(*a, &buff, &size, &offset); + if (r == ARCHIVE_EOF) { - g_free(md5); + // cleanup g_free(filename); - return (ARCHIVE_OK); + + return true; } if (r != ARCHIVE_OK) { - fprintf(stderr, "%s", archive_error_string(a)); + fprintf(stderr, "%s", archive_error_string(*a)); break; } - GKeyFile *key_file_structure = g_key_file_new(); // A structure that will hold the information from the desktop file - gboolean success = g_key_file_load_from_data(key_file_structure, buff, size, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, NULL); - if(success){ - gchar *desktop_filename = g_path_get_basename(filename); - desktop_icon_value_original = g_key_file_get_string(key_file_structure, "Desktop Entry", "Icon", NULL); - if(verbose) - fprintf(stderr, "desktop_icon_value_original: %s\n", desktop_icon_value_original); - if (!write_edited_desktop_file(key_file_structure, path, desktop_filename, 1, md5, verbose)) { - fprintf(stderr, "Failed to install desktop file\n"); - return false; - } - g_free(desktop_filename); + *desktop_filename = g_strdup(g_path_get_basename(filename)); + + // a structure that will hold the information from the desktop file + *key_file = g_key_file_new(); + + gboolean success = g_key_file_load_from_data(*key_file, buff, size, + G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, NULL); + + if (!success) { + // cleanup + g_free(key_file); + key_file = NULL; + + break; } - g_key_file_free(key_file_structure); + + // cleanup + g_free(filename); + + return true; } + } - gchar *dest = NULL; - /* Get icon file(s) and act on them in one go */ + g_free(filename); - if(g_str_has_prefix(filename, "usr/share/icons/") || g_str_has_prefix(filename, "usr/share/pixmaps/") || (g_str_has_prefix(filename, "usr/share/mime/") && g_str_has_suffix(filename, ".xml"))){ - gchar *t = replace_str(filename, "usr/share", g_get_user_data_dir()); - gchar *dest_dirname = g_path_get_dirname(t); - g_free(t); + return false; +} - gchar *file_basename = g_path_get_basename(filename); - gchar *dest_basename = g_strdup_printf("%s_%s_%s", vendorprefix, md5, file_basename); +bool archive_copy_icons_recursively_to_destination(struct archive** a, const gchar* md5, + const gchar* desktop_icon_value_original, gboolean verbose) { + // iterate over all files ("entries") in the archive + // looking for a file with .desktop extension in the root directory + struct archive_entry* entry; + gchar* filename = NULL; - dest = g_build_path("/", dest_dirname, dest_basename, NULL); + bool errored = false; + + int r = -1; + + for (;;) { + r = archive_read_next_header(*a, &entry); + + if (r == ARCHIVE_EOF) { + break; + } + + if (r != ARCHIVE_OK) { + fprintf(stderr, "%s\n", archive_error_string(*a)); + + errored = true; + break; + } + + /* Skip all but regular files; FIXME: Also handle symlinks correctly */ + if (archive_entry_filetype(entry) != AE_IFREG) + continue; + + filename = replace_str(archive_entry_pathname(entry), "./", ""); + + gchar* dest = NULL; + + // Get icon file(s) and MIME types and act on them in one go + // add vendor prefix (and MD5 hash as an identifier for future operations) + if (g_str_has_prefix(filename, "usr/share/icons/") + || g_str_has_prefix(filename, "usr/share/pixmaps/") + || (g_str_has_prefix(filename, "usr/share/mime/") && g_str_has_suffix(filename, ".xml")) + ) { + + gchar* dest_path = replace_str(filename, "usr/share", g_get_user_data_dir()); + gchar* dest_dirname = g_path_get_dirname(dest_path); + g_free(dest_path); + + gchar* file_basename = g_path_get_basename(filename); + gchar* dest_basename = g_strdup_printf("%s_%s_%s", vendorprefix, md5, file_basename); g_free(file_basename); + + dest = g_build_path("/", dest_dirname, dest_basename, NULL); + g_free(dest_basename); g_free(dest_dirname); } - /* According to https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html#install_icons - * share/pixmaps is ONLY searched in /usr but not in $XDG_DATA_DIRS and hence $HOME and this seems to be true at least in XFCE */ - if(g_str_has_prefix (filename, "usr/share/pixmaps/")){ + + // According to https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html#install_icons + // share/pixmaps is ONLY searched in /usr but not in $XDG_DATA_DIRS and hence $HOME and this seems to be true at least in XFCE + if (g_str_has_prefix(filename, "usr/share/pixmaps/")) { + // clean up dest in case it has been set before + g_free(dest); + + // TODO: avoid cluttering /tmp too much dest = g_build_path("/", "/tmp", NULL); } - /* Some AppImages only have the icon in their root directory, so we have to get it from there */ - if(desktop_icon_value_original){ - if((g_str_has_prefix(filename, desktop_icon_value_original)) && (! strstr(filename, "/")) && ( (g_str_has_suffix(filename, ".png")) || (g_str_has_suffix(filename, ".xpm")) || (g_str_has_suffix(filename, ".svg")) || (g_str_has_suffix(filename, ".svgz")))){ - gchar *file_extension = get_file_extension(filename); - gchar *dest_basename = g_strdup_printf("%s_%s_%s.%s", vendorprefix, md5, desktop_icon_value_original, file_extension); + + if (desktop_icon_value_original != NULL) { + if (g_str_has_prefix(filename, desktop_icon_value_original) && !strstr(filename, "/") && (g_str_has_suffix(filename, ".png") || g_str_has_suffix(filename, ".xpm") || g_str_has_suffix(filename, ".svg") || g_str_has_suffix(filename, ".svgz"))) { + gchar* file_extension = get_file_extension(filename); + gchar* dest_basename = g_strdup_printf("%s_%s_%s.%s", vendorprefix, md5, desktop_icon_value_original, + file_extension); + g_free(file_extension); + + // clean up dest in case it has been set before g_free(dest); + + // TODO: avoid cluttering /tmp too much dest = g_build_path("/", "/tmp", dest_basename, NULL); + g_free(dest_basename); - g_free(file_extension); } } + // cleanup g_free(filename); - if(dest){ - - if(verbose) + if (dest != NULL) { + if (verbose) fprintf(stderr, "install: %s\n", dest); - gchar *dirname = g_path_get_dirname(dest); - if(g_mkdir_with_parents(dirname, 0755)) - fprintf(stderr, "Could not create directory: %s\n", dirname); + gchar* dir_name = g_path_get_dirname(dest); - g_free(dirname); + if (g_mkdir_with_parents(dir_name, 0755)) { + fprintf(stderr, "Could not create directory: %s\n", dir_name); - FILE *f; - f = fopen(dest, "w+"); + // cleanup + g_free(dir_name); - if (f == NULL){ - fprintf(stderr, "fopen error\n"); + errored = true; break; } - int r; - const void *buff; + g_free(dir_name); + + FILE *f = fopen(dest, "w+"); + + if (f == NULL) { + int error = errno; + fprintf(stderr, "Could not open file %s for writing: %s\n", dest, strerror(error)); + + // cleanup + g_free(dest); + + errored = true; + break; + } + + const void* buff; + size_t size; int64_t offset; - for (;;) { - r = archive_read_data_block(a, &buff, &size, &offset); + r = archive_read_data_block(*a, &buff, &size, &offset); + if (r == ARCHIVE_EOF) break; + if (r != ARCHIVE_OK) { - fprintf(stderr, "%s\n", archive_error_string(a)); + fprintf(stderr, "%s\n", archive_error_string(*a)); + break; + } + + if ((fwrite(buff, size, 1, f) != size) || ferror(f) || feof(f)) { + int error = errno; + fprintf(stderr, "Failed to copy icon: %s\n", strerror(error)); + + errored = true; break; } - fwrite(buff, 1, size, f); } fclose(f); - chmod (dest, 0644); + chmod(dest, 0644); - - if(verbose) + if (verbose && !errored) { fprintf(stderr, "Installed: %s\n", dest); + } - // If we were unsure about the size of an icon, we temporarily installed - // it to /tmp and now move it into the proper place - if(g_str_has_prefix (dest, "/tmp/")) { + if (g_str_has_prefix(dest, "/tmp")) { move_icon_to_destination(dest, verbose); } g_free(dest); + + if (errored) + break; } } - archive_read_close(a); - archive_read_free(a); - set_executable(path, verbose); + return !errored; +} + +/* Register a type 1 AppImage in the system */ +bool appimage_type1_register_in_system(const char *path, gboolean verbose) +{ + fprintf(stderr, "ISO9660 based type 1 AppImage\n"); + gchar *desktop_icon_value_original = NULL; + + char *md5 = appimage_get_md5(path); + + if(verbose) + fprintf(stderr, "md5 of URI RFC 2396: %s\n", md5); + + // open ISO9660 image using libarchive + struct archive *a = archive_read_new(); + archive_read_support_format_iso9660(a); + + // libarchive status int -- passed to called functions + int r; + + // use global bool to not have duplicate cleanup code in the following calls + // all if() checks need to be prefixed with "!errored &&" therefore, and on error need to set errored to true + // this would be _by far_ less complex code in C++, where lambdas and strings and other nice things exist... + bool errored = false; + + if ((r = archive_read_open_filename(a, path, 10240)) != ARCHIVE_OK) { + fprintf(stderr, "%s\n", archive_error_string(a)); + errored = true; + } + // search image for root desktop file, and read it into key file structure so it can be edited eventually + gchar *desktop_filename = NULL; + GKeyFile *key_file = NULL; + + if (!errored && !appimage_type1_get_desktop_filename_and_key_file(&a, &desktop_filename, &key_file)) { + errored = true; + } + + // validate that both have been set to a non-NULL value + if (desktop_filename == NULL || key_file == NULL) { + errored = true; + } + + if (!errored) { + desktop_icon_value_original = g_key_file_get_string(key_file, "Desktop Entry", "Icon", NULL); + + if (verbose) + fprintf(stderr, "desktop_icon_value_original: %s\n", desktop_icon_value_original); + + if (!write_edited_desktop_file(key_file, path, desktop_filename, 1, md5, verbose)) { + fprintf(stderr, "Failed to install desktop file\n"); + errored = true; + } + } + + // next step: copy icons recursively to their target destination + + // reopen ISO9660 image + // TODO: merge both steps (reading desktop file and copying icons) again to not have to read the ISO file twice + if (!errored) { + // close and reopen archive + archive_read_free(a); + + a = archive_read_new(); + archive_read_support_format_iso9660(a); + + if ((r = archive_read_open_filename(a, path, 10240)) != ARCHIVE_OK) { + fprintf(stderr, "archive error: %s\n", archive_error_string(a)); + errored = true; + } else { + if (!archive_copy_icons_recursively_to_destination(&a, md5, desktop_icon_value_original, verbose)) { + errored = true; + } + } + } + + // cleanup + g_free(desktop_filename); g_free(desktop_icon_value_original); g_free(md5); - return TRUE; + g_key_file_free(key_file); + archive_read_free(a); + + return !errored; +} + +bool appimage_type2_get_desktop_filename_and_key_file(sqfs* fs, gchar** desktop_filename, gchar* md5, GKeyFile** key_file, gboolean verbose) { + /* TOOO: Change so that only one run of squash_get_matching_files is needed in total, + * this should hopefully improve performance */ + + /* Get desktop file(s) in the root directory of the AppImage */ + // Only in root dir + gchar** str_array = squash_get_matching_files_install_icons_and_mime_data(fs, "(^[^/]*?.desktop$)", "", md5, verbose); + + bool errored = false; + + // gchar **str_array = squash_get_matching_files(&fs, "(^.*?.desktop$)", md5, verbose); // Not only there + /* Work trough the NULL-terminated array of strings */ + for (int i = 0; str_array[i]; ++i) { + fprintf(stderr, "Got root desktop: %s\n", str_array[i]); + + if (!g_key_file_load_from_squash(fs, str_array[i], *key_file, verbose)) + errored = true; + else + *desktop_filename = g_path_get_basename(str_array[i]); + } + + /* Free the NULL-terminated array of strings and its contents */ + g_strfreev(str_array); + + return !errored; } /* Register a type 2 AppImage in the system */ -bool appimage_type2_register_in_system(char *path, gboolean verbose) -{ +bool appimage_type2_register_in_system(char *path, gboolean verbose) { fprintf(stderr, "squashfs based type 2 AppImage\n"); - long unsigned int fs_offset; // The offset at which a squashfs image is expected - char *md5 = appimage_get_md5(path); - GKeyFile *key_file_structure = g_key_file_new(); // A structure that will hold the information from the desktop file - gchar *desktop_icon_value_original = "iDoNotMatchARegex"; // FIXME: otherwise the regex does weird stuff in the first run - if(verbose) + + // the offset at which a squashfs image is expected + long unsigned int fs_offset; + char* md5 = appimage_get_md5(path); + + // a structure that will hold the information from the desktop file + GKeyFile* key_file = g_key_file_new(); + // FIXME: otherwise the regex does weird stuff in the first run + gchar* desktop_icon_value_original = "iDoNotMatchARegex"; + + if (verbose) fprintf(stderr, "md5 of URI RFC 2396: %s\n", md5); + fs_offset = get_elf_size(path); - if(verbose) + + if (verbose) fprintf(stderr, "fs_offset: %lu\n", fs_offset); + sqfs fs; + sqfs_err err = sqfs_open_image(&fs, path, fs_offset); - if (err != SQFS_OK){ + + if (err != SQFS_OK) { sqfs_destroy(&fs); fprintf(stderr, "sqfs_open_image error: %s\n", path); return FALSE; } else { - if(verbose) + if (verbose) fprintf(stderr, "sqfs_open_image: %s\n", path); } - /* TOOO: Change so that only one run of squash_get_matching_files is needed in total, - * this should hopefully improve performance */ + gchar* desktop_filename = NULL; - /* Get desktop file(s) in the root directory of the AppImage */ - gchar **str_array = squash_get_matching_files(&fs, "(^[^/]*?.desktop$)", desktop_icon_value_original, md5, verbose); // Only in root dir - // gchar **str_array = squash_get_matching_files(&fs, "(^.*?.desktop$)", md5, verbose); // Not only there - /* Work trough the NULL-terminated array of strings */ - for (int i=0; str_array[i]; ++i) { - fprintf(stderr, "Got root desktop: %s\n", str_array[i]); - gboolean success = g_key_file_load_from_squash(&fs, str_array[i], key_file_structure, verbose); - if(success){ - gchar *desktop_filename = g_path_get_basename(str_array[i]); + bool errored = false; - desktop_icon_value_original = g_key_file_get_value(key_file_structure, "Desktop Entry", "Icon", NULL); - if(verbose) + if (appimage_type2_get_desktop_filename_and_key_file(&fs, &desktop_filename, md5, &key_file, verbose)) { + desktop_icon_value_original = g_key_file_get_value(key_file, "Desktop Entry", "Icon", NULL); + + if (desktop_icon_value_original == NULL) { + errored = true; + } else { + if (verbose) fprintf(stderr, "desktop_icon_value_original: %s\n", desktop_icon_value_original); - if (!write_edited_desktop_file(key_file_structure, path, desktop_filename, 2, md5, verbose)) { + if (!write_edited_desktop_file(key_file, path, desktop_filename, 2, md5, verbose)) { fprintf(stderr, "Failed to install desktop file\n"); return false; } - - g_free(desktop_filename); } - g_key_file_free(key_file_structure); - + } else { + errored = true; } - /* Free the NULL-terminated array of strings and its contents */ - g_strfreev(str_array); - /* Get relevant file(s) */ - static char *const pattern = "(^usr/share/(icons|pixmaps)/.*.(png|svg|svgz|xpm)$|^.DirIcon$|^usr/share/mime/packages/.*.xml$|^usr/share/appdata/.*metainfo.xml$|^[^/]*?.(png|svg|svgz|xpm)$)"; - gchar **str_array2 = squash_get_matching_files(&fs, pattern, desktop_icon_value_original, md5, verbose); + if (!errored) { + /* Get relevant file(s) */ + static char* const pattern = "(^usr/share/(icons|pixmaps)/.*.(png|svg|svgz|xpm)$|^.DirIcon$|^usr/share/mime/packages/.*.xml$|^usr/share/appdata/.*metainfo.xml$|^[^/]*?.(png|svg|svgz|xpm)$)"; - sqfs_destroy(&fs); + gchar** str_array2 = squash_get_matching_files_install_icons_and_mime_data(&fs, pattern, desktop_icon_value_original, md5, verbose); - /* Free the NULL-terminated array of strings and its contents */ - g_strfreev(str_array2); + /* Free the NULL-terminated array of strings and its contents */ + g_strfreev(str_array2); + } /* The above also gets AppStream metainfo file(s), TODO: Check if the id matches and do something with them*/ - set_executable(path, verbose); + g_free(desktop_filename); + sqfs_destroy(&fs); + g_free(md5); g_free(desktop_icon_value_original); return TRUE; } -// forward declare function -void appimage_create_thumbnail(const gchar *appimage_file_path, gboolean verbose); +/* Check whether AppImage is registered in the system already */ +bool appimage_is_registered_in_system(const char* path) { + // there's two criteria whether an AppImage has been registered in the system: + // 1) Has the thumbnail been created? + // 2) Has the desktop file been registered? + // if both questions can be answered yes, then an AppImage has been registered properly + + if (!g_file_test(path, G_FILE_TEST_IS_REGULAR)) + return false; + + gchar* thumbnail_path = get_thumbnail_path(path, "normal", false); + if (!g_file_test(thumbnail_path, G_FILE_TEST_IS_REGULAR)) { + // cleanup + g_free(thumbnail_path); + + return false; + } + + gchar* md5 = appimage_get_md5(path); + + int appimage_type = appimage_get_type(path, false); + + GKeyFile* key_file = g_key_file_new(); + gchar* desktop_filename = NULL; + + switch (appimage_type) { + case 1: + { + // open AppImage as ISO9660 file + struct archive *a = NULL; + a = archive_read_new(); + + if (archive_read_support_format_iso9660(a) != ARCHIVE_OK || + archive_read_open_filename(a, path, 10240) != ARCHIVE_OK) { + + // cleanup + archive_read_free(a); + g_free(thumbnail_path); + g_free(md5); + g_free(desktop_filename); + g_key_file_free(key_file); + + return false; + } + + bool rv = appimage_type1_get_desktop_filename_and_key_file(&a, &desktop_filename, &key_file); + + archive_read_free(a); + + if (!rv) { + // cleanup + g_free(thumbnail_path); + g_free(md5); + g_key_file_free(key_file); + g_free(desktop_filename); + + return false; + } + } + break; + case 2: + { + long unsigned int fs_offset; // The offset at which a squashfs image is expected + fs_offset = get_elf_size(path); + + sqfs fs; + sqfs_err err = sqfs_open_image(&fs, path, fs_offset); + + if (err != SQFS_OK) { + fprintf(stderr, "sqfs_open_image error: %s\n", path); + + // cleanup + sqfs_destroy(&fs); + g_free(thumbnail_path); + g_free(md5); + g_free(desktop_filename); + g_key_file_free(key_file); + + return false; + } + + bool rv = appimage_type2_get_desktop_filename_and_key_file(&fs, &desktop_filename, md5, &key_file, false); + + sqfs_destroy(&fs); + + if (!rv) { + // cleanup + g_free(thumbnail_path); + g_free(md5); + g_free(desktop_filename); + g_key_file_free(key_file); + + return false; + } + } + + break; + default: + // type not recognized + + // cleanup + g_free(thumbnail_path); + g_free(md5); + g_key_file_free(key_file); + g_free(desktop_filename); + + return false; + } + + gchar* desktop_file_path = build_installed_desktop_file_path(md5, desktop_filename); + + bool rv = true; + + if (!g_file_test(desktop_file_path, G_FILE_TEST_IS_REGULAR)) + rv = false; + + g_free(thumbnail_path); + g_free(md5); + g_free(desktop_filename); + g_key_file_free(key_file); + + return rv; +} /* Register an AppImage in the system */ int appimage_register_in_system(char *path, gboolean verbose) @@ -947,10 +1267,13 @@ int appimage_register_in_system(char *path, gboolean verbose) g_str_has_suffix(path, ".download") || g_str_has_suffix(path, ".zs-old") || g_str_has_suffix(path, ".~") - ) + ) { return 0; + } + int type = appimage_get_type(path, verbose); - if(type == 1 || type == 2) { + + if(type != -1) { fprintf(stderr, "\n-> Registering type %d AppImage: %s\n", type, path); appimage_create_thumbnail(path, false); } else { @@ -959,12 +1282,26 @@ int appimage_register_in_system(char *path, gboolean verbose) return 0; } - if(type == 1){ - appimage_type1_register_in_system(path, verbose); + switch (type) { + case 1: + appimage_type1_register_in_system(path, verbose); + break; + case 2: + appimage_type2_register_in_system(path, verbose); + break; + default: + fprintf(stderr, "Error: unknown AppImage type %d\n", type); + return 1; } - if(type == 2){ - appimage_type2_register_in_system(path, verbose); + if (type == 1) { + if (!appimage_type1_register_in_system(path, verbose)) + return 1; + } + + if (type == 2) { + if (!appimage_type2_register_in_system(path, verbose)) + return 1; } return 0; diff --git a/src/shared.h b/src/shared.h index 21a2f12b1..7bff9b63d 100644 --- a/src/shared.h +++ b/src/shared.h @@ -82,6 +82,8 @@ void unregister_using_md5_id(const char* name, int level, char* md5, gboolean ve void delete_thumbnail(char* path, char* size, gboolean verbose); +bool appimage_is_registered_in_system(const char* path); + int appimage_register_in_system(char* path, gboolean verbose); void appimage_create_thumbnail(const gchar* appimage_file_path, gboolean verbose); @@ -95,7 +97,9 @@ bool write_edited_desktop_file(GKeyFile* key_file_structure, const char* appimag gboolean g_key_file_load_from_squash(sqfs* fs, char* path, GKeyFile* key_file_structure, gboolean verbose); -gchar** squash_get_matching_files(sqfs* fs, char* pattern, gchar* desktop_icon_value_original, char* md5, gboolean verbose); +gchar** squash_get_matching_files_install_icons_and_mime_data(sqfs* fs, char* pattern, + gchar* desktop_icon_value_original, char* md5, + gboolean verbose); void squash_extract_inode_to_file(sqfs* fs, sqfs_inode* inode, const gchar* dest); diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index c73797eb6..5fa5b1b56 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -63,26 +63,22 @@ class LibAppImageTest : public AppImageKitTest TEST_F(LibAppImageTest, appimage_get_type_invalid) { - int t = appimage_get_type("/tmp", 0); - ASSERT_EQ(t, -1); + ASSERT_EQ(appimage_get_type("/tmp", false), -1); } TEST_F(LibAppImageTest, appimage_get_type_1) { - int t = appimage_get_type(appImage_type_1_file_path.c_str(), 0); - ASSERT_EQ(t, 1); + ASSERT_EQ(appimage_get_type(appImage_type_1_file_path.c_str(), false), 1); } TEST_F(LibAppImageTest, appimage_get_type_2) { - int t = appimage_get_type(appImage_type_2_file_path.c_str(), 0); - ASSERT_EQ(t, 2); + ASSERT_EQ(appimage_get_type(appImage_type_2_file_path.c_str(), false), 2); } TEST_F(LibAppImageTest, appimage_register_in_system_with_type1) { - int r = appimage_register_in_system(appImage_type_1_file_path.c_str(), true); - ASSERT_EQ(r, 0); + ASSERT_EQ(appimage_register_in_system(appImage_type_1_file_path.c_str(), true), 0); ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_1_file_path)); @@ -91,8 +87,7 @@ TEST_F(LibAppImageTest, appimage_register_in_system_with_type1) TEST_F(LibAppImageTest, appimage_register_in_system_with_type2) { - int r = appimage_register_in_system(appImage_type_2_file_path.c_str(), true); - ASSERT_EQ(r, 0); + ASSERT_EQ(appimage_register_in_system(appImage_type_2_file_path.c_str(), true), 0); ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_2_file_path)); @@ -101,8 +96,7 @@ TEST_F(LibAppImageTest, appimage_register_in_system_with_type2) TEST_F(LibAppImageTest, appimage_type1_register_in_system) { - bool r = appimage_type1_register_in_system(appImage_type_1_file_path.c_str(), false); - ASSERT_TRUE(r); + ASSERT_TRUE(appimage_type1_register_in_system(appImage_type_1_file_path.c_str(), false)); ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_1_file_path)); @@ -111,8 +105,7 @@ TEST_F(LibAppImageTest, appimage_type1_register_in_system) TEST_F(LibAppImageTest, appimage_type2_register_in_system) { - bool r = appimage_type2_register_in_system(appImage_type_2_file_path.c_str(), false); - ASSERT_TRUE(r); + ASSERT_TRUE(appimage_type2_register_in_system(appImage_type_2_file_path.c_str(), false)); ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_2_file_path)); appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); @@ -175,16 +168,16 @@ TEST_F(LibAppImageTest, create_thumbnail_appimage_type_2) { } TEST_F(LibAppImageTest, appimage_extract_file_following_symlinks) { - char * target_path = const_cast("/tmp/test_libappimage_tmp_file"); - appimage_extract_file_following_symlinks(appImage_type_2_file_path.c_str(), "echo.desktop", target_path); + const char target_path[] = "/tmp/test_libappimage_tmp_file"; + appimage_extract_file_following_symlinks(appImage_type_2_file_path.c_str(), "echo.desktop", target_path); - char *expected = const_cast("[Desktop Entry]\n" - "Version=1.0\n" - "Type=Application\n" - "Name=Echo\n" - "Comment=Just echo.\n" - "Exec=echo %F\n" - "Icon=utilities-terminal\n"); + const char expected[] = ("[Desktop Entry]\n" + "Version=1.0\n" + "Type=Application\n" + "Name=Echo\n" + "Comment=Just echo.\n" + "Exec=echo %F\n" + "Icon=utilities-terminal\n"); ASSERT_TRUE(g_file_test(target_path, G_FILE_TEST_EXISTS)); @@ -192,7 +185,7 @@ TEST_F(LibAppImageTest, appimage_extract_file_following_symlinks) { std::streamsize size = file.tellg(); file.seekg(0, std::ios::beg); - std::vector buffer(size); + std::vector buffer(static_cast(size)); if (file.read(buffer.data(), size)) ASSERT_TRUE( strncmp(expected, buffer.data(), strlen(expected)) == 0 ); else @@ -202,6 +195,34 @@ TEST_F(LibAppImageTest, appimage_extract_file_following_symlinks) { remove(target_path); } +bool test_appimage_is_registered_in_system(const std::string& pathToAppImage, bool integrateAppImage) { + if (integrateAppImage) { + EXPECT_EQ(appimage_register_in_system(pathToAppImage.c_str(), false), 0); + } + + return appimage_is_registered_in_system(pathToAppImage.c_str()); +} + +TEST_F(LibAppImageTest, appimage_is_registered_in_system) { + // make sure tested AppImages are not registered + appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); + appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); + + // if the test order is false -> true, cleanup isn't necessary + + // type 1 tests + EXPECT_FALSE(test_appimage_is_registered_in_system(appImage_type_1_file_path, false)); + EXPECT_TRUE(test_appimage_is_registered_in_system(appImage_type_1_file_path, true)); + + // type 2 tests + EXPECT_FALSE(test_appimage_is_registered_in_system(appImage_type_2_file_path, false)); + EXPECT_TRUE(test_appimage_is_registered_in_system(appImage_type_2_file_path, true)); + + // cleanup + appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); + appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); +} + } // namespace int main(int argc, char **argv) From 357b535763d21f3a42853ef61a45dbc2c23e3493 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 20 Mar 2018 23:41:38 +0100 Subject: [PATCH 096/544] Implement codacy suggestions --- src/shared.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/shared.c b/src/shared.c index 3711daa11..ed736d4ca 100644 --- a/src/shared.c +++ b/src/shared.c @@ -714,12 +714,10 @@ bool appimage_type1_get_desktop_filename_and_key_file(struct archive** a, gchar* // must not be freed struct archive_entry* entry; - int r = -1; - gchar* filename; for (;;) { - r = archive_read_next_header(*a, &entry); + int r = archive_read_next_header(*a, &entry); if (r == ARCHIVE_EOF) { return false; @@ -1164,8 +1162,7 @@ bool appimage_is_registered_in_system(const char* path) { case 1: { // open AppImage as ISO9660 file - struct archive *a = NULL; - a = archive_read_new(); + struct archive *a = archive_read_new(); if (archive_read_support_format_iso9660(a) != ARCHIVE_OK || archive_read_open_filename(a, path, 10240) != ARCHIVE_OK) { From 45c429521a853673331a612eaaf34aac44bfcf59 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 21 Mar 2018 00:06:03 +0100 Subject: [PATCH 097/544] Implement codacy suggestions, mk. 2 --- src/shared.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/shared.c b/src/shared.c index ed736d4ca..92c647664 100644 --- a/src/shared.c +++ b/src/shared.c @@ -794,10 +794,8 @@ bool archive_copy_icons_recursively_to_destination(struct archive** a, const gch bool errored = false; - int r = -1; - for (;;) { - r = archive_read_next_header(*a, &entry); + int r = archive_read_next_header(*a, &entry); if (r == ARCHIVE_EOF) { break; From ed380094a97cecc4b5cc19493bde52fd91df54e1 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 21 Mar 2018 00:27:45 +0100 Subject: [PATCH 098/544] Resolve relative paths in appimage_get_md5 Internally, the function needs an absolute path, however that isn't clear to the user. Instead of correcting the docstring, the function will now just resolve the absolute path transparently. If the path can't be resolved, the path will be hashed as-is. --- src/shared.c | 10 +++++++++- tests/test_libappimage.cpp | 15 +++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/shared.c b/src/shared.c index 92c647664..d78487a36 100644 --- a/src/shared.c +++ b/src/shared.c @@ -94,7 +94,15 @@ gchar* replace_str(const gchar const *src, const gchar const *find, const gchar * This can be used to identify files that are related to a given AppImage at a given location */ char *appimage_get_md5(const char* path) { - gchar *uri = g_filename_to_uri (path, NULL, NULL); + char* absolute_path; + + if ((absolute_path = realpath(path, NULL)) == NULL) + absolute_path = strdup(path); + + gchar *uri = g_filename_to_uri(absolute_path, NULL, NULL); + + free(absolute_path); + if (uri != NULL) { GChecksum *checksum; diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index 5fa5b1b56..66b91997d 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -105,9 +105,9 @@ TEST_F(LibAppImageTest, appimage_type1_register_in_system) TEST_F(LibAppImageTest, appimage_type2_register_in_system) { - ASSERT_TRUE(appimage_type2_register_in_system(appImage_type_2_file_path.c_str(), false)); + EXPECT_TRUE(appimage_type2_register_in_system(appImage_type_2_file_path.c_str(), false)); - ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_2_file_path)); + EXPECT_TRUE(areIntegrationFilesDeployed(appImage_type_2_file_path)); appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); } @@ -118,12 +118,15 @@ TEST_F(LibAppImageTest, appimage_unregister_in_system) { TEST_F(LibAppImageTest, appimage_get_md5) { - std::string expected = "128e476a7794288cad0eb2542f7c995b"; - gchar * sum = appimage_get_md5("/tmp/testfile"); + std::string pathToTestFile = "/some/fixed/path"; - int res = g_strcmp0(expected.c_str(), sum); - ASSERT_EQ(res, 0); + std::string expected = "972f4824b8e6ea26a55e9af60a285af7"; + + gchar* sum = appimage_get_md5(pathToTestFile.c_str()); + EXPECT_EQ(sum, expected); g_free(sum); + + unlink(pathToTestFile.c_str()); } TEST_F(LibAppImageTest, get_md5_invalid_file_path) From 57f9d7fad1d6b7b2d239798318cd2a8e644e0d79 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 21 Mar 2018 19:05:47 +0100 Subject: [PATCH 099/544] Improve unit tests --- tests/fixtures.h | 29 +++++++++++++++++++++++------ tests/test_libappimage.cpp | 18 +++++++++--------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/tests/fixtures.h b/tests/fixtures.h index 02ae93073..173f62c3d 100644 --- a/tests/fixtures.h +++ b/tests/fixtures.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -20,7 +21,7 @@ class AppImageKitTest : public ::testing::Test { AppImageKitTest() { char* tmpl = strdup("/tmp/AppImageKit-unit-tests-XXXXXX"); tempDir = mkdtemp(tmpl); - free(tmpl); + delete[] tmpl; tempHome = tempDir + "/HOME"; @@ -75,14 +76,30 @@ class AppImageKitTest : public ::testing::Test { private: static const int rmTree(const std::string& path) { - return nftw(path.c_str(), unlinkCb, 64, FTW_DEPTH | FTW_PHYS); + int rv = nftw(path.c_str(), unlinkCb, 64, FTW_DEPTH|FTW_MOUNT|FTW_PHYS); + + if (rv != 0) { + int error = errno; + std::cerr << "nftw() in rmTree(" << path << ") failed: " << strerror(error) << std::endl; + return rv; + } + + return 0; } static int unlinkCb(const char* fpath, const struct stat* sb, int typeflag, struct FTW* ftwbuf) { - int rv = remove(fpath); - - if (rv) - perror(fpath); + int rv; + + switch (typeflag) { + case FTW_D: + case FTW_DNR: + case FTW_DP: + rv = rmdir(fpath); + break; + default: + rv = unlink(fpath); + break; + } return rv; }; diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index 66b91997d..45a834027 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -78,7 +78,7 @@ TEST_F(LibAppImageTest, appimage_get_type_2) TEST_F(LibAppImageTest, appimage_register_in_system_with_type1) { - ASSERT_EQ(appimage_register_in_system(appImage_type_1_file_path.c_str(), true), 0); + ASSERT_EQ(appimage_register_in_system(appImage_type_1_file_path.c_str(), false), 0); ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_1_file_path)); @@ -87,7 +87,7 @@ TEST_F(LibAppImageTest, appimage_register_in_system_with_type1) TEST_F(LibAppImageTest, appimage_register_in_system_with_type2) { - ASSERT_EQ(appimage_register_in_system(appImage_type_2_file_path.c_str(), true), 0); + ASSERT_EQ(appimage_register_in_system(appImage_type_2_file_path.c_str(), false), 0); ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_2_file_path)); @@ -139,7 +139,7 @@ TEST_F(LibAppImageTest, get_md5_invalid_file_path) } TEST_F(LibAppImageTest, create_thumbnail_appimage_type_1) { - appimage_create_thumbnail(appImage_type_1_file_path.c_str()); + appimage_create_thumbnail(appImage_type_1_file_path.c_str()); gchar *sum = appimage_get_md5(appImage_type_1_file_path.c_str()); std::string path = std::string(g_get_user_cache_dir()) @@ -155,7 +155,7 @@ TEST_F(LibAppImageTest, create_thumbnail_appimage_type_1) { } TEST_F(LibAppImageTest, create_thumbnail_appimage_type_2) { - appimage_create_thumbnail(appImage_type_2_file_path.c_str()); + appimage_create_thumbnail(appImage_type_2_file_path.c_str()); gchar* sum = appimage_get_md5(appImage_type_2_file_path.c_str()); std::string path = std::string(g_get_user_cache_dir()) @@ -171,8 +171,8 @@ TEST_F(LibAppImageTest, create_thumbnail_appimage_type_2) { } TEST_F(LibAppImageTest, appimage_extract_file_following_symlinks) { - const char target_path[] = "/tmp/test_libappimage_tmp_file"; - appimage_extract_file_following_symlinks(appImage_type_2_file_path.c_str(), "echo.desktop", target_path); + std::string target_path = tempDir + "test_libappimage_tmp_file"; + appimage_extract_file_following_symlinks(appImage_type_2_file_path.c_str(), "echo.desktop", target_path.c_str()); const char expected[] = ("[Desktop Entry]\n" "Version=1.0\n" @@ -182,9 +182,9 @@ TEST_F(LibAppImageTest, appimage_extract_file_following_symlinks) { "Exec=echo %F\n" "Icon=utilities-terminal\n"); - ASSERT_TRUE(g_file_test(target_path, G_FILE_TEST_EXISTS)); + ASSERT_TRUE(g_file_test(target_path.c_str(), G_FILE_TEST_EXISTS)); - std::ifstream file(target_path, std::ios::binary | std::ios::ate); + std::ifstream file(target_path.c_str(), std::ios::binary | std::ios::ate); std::streamsize size = file.tellg(); file.seekg(0, std::ios::beg); @@ -195,7 +195,7 @@ TEST_F(LibAppImageTest, appimage_extract_file_following_symlinks) { FAIL(); // Clean - remove(target_path); + remove(target_path.c_str()); } bool test_appimage_is_registered_in_system(const std::string& pathToAppImage, bool integrateAppImage) { From 8efdf0655dca1ded8b01fd203f297dc46b096de3 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 21 Mar 2018 20:37:43 +0100 Subject: [PATCH 100/544] Fix appimaged service file installation --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b860880b9..3ab14e527 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -242,7 +242,7 @@ install( ) install( - FILES ${CMAKE_SOURCE_DIR}/resources/appimaged.service + FILES ${PROJECT_SOURCE_DIR}/resources/appimaged.service DESTINATION lib/systemd/user/ COMPONENT appimaged ) From b0a5c4d811cd88a07553cd465fc06da21f184315 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 22 Mar 2018 21:39:16 +0100 Subject: [PATCH 101/544] Improve docs --- src/shared.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/shared.c b/src/shared.c index d78487a36..7899134a5 100644 --- a/src/shared.c +++ b/src/shared.c @@ -1262,7 +1262,10 @@ bool appimage_is_registered_in_system(const char* path) { return rv; } -/* Register an AppImage in the system */ +/* + * Register an AppImage in the system + * Returns 0 on success, non-0 otherwise. + */ int appimage_register_in_system(char *path, gboolean verbose) { if((g_str_has_suffix(path, ".part")) || From 852a8b45c55a2b8617b6a16d03fafc3e7c065a38 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 22 Mar 2018 21:45:35 +0100 Subject: [PATCH 102/544] Update docs in libappimage header --- include/appimage/appimage.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index b533dd03b..25ea8077e 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -20,7 +20,10 @@ bool appimage_type1_register_in_system(const char *path, bool verbose); /* Register a type 2 AppImage in the system */ bool appimage_type2_register_in_system(const char *path, bool verbose); -/* Register an AppImage in the system */ +/* + * Register an AppImage in the system + * Returns 0 on success, non-0 otherwise. + */ int appimage_register_in_system(const char *path, bool verbose); /* Unregister an AppImage in the system */ From 04dd60b452932668a563b472b450430d995029d1 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 22 Mar 2018 22:51:39 +0100 Subject: [PATCH 103/544] Make embedding of magic bytes configurable --- src/CMakeLists.txt | 4 ++++ src/build-runtime.sh.in | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3ab14e527..4910892e2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,10 @@ find_package(Sanitizers) # set up build script + +# if set to anything but ON, the magic bytes won't be embedded +set(APPIMAGEKIT_EMBED_MAGIC_BYTES ON CACHE BOOL "") + configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/build-runtime.sh.in ${CMAKE_CURRENT_BINARY_DIR}/build-runtime.sh diff --git a/src/build-runtime.sh.in b/src/build-runtime.sh.in index 9233b7917..ad85e6282 100755 --- a/src/build-runtime.sh.in +++ b/src/build-runtime.sh.in @@ -73,7 +73,9 @@ HEXLENGTH=$(objdump -h runtime | grep .upd_info | awk '{print $3}') dd bs=1 if=runtime skip=$(($(echo 0x$HEXOFFSET)+0)) count=$(($(echo 0x$HEXLENGTH)+0)) | xxd # Insert AppImage magic bytes -printf '\x41\x49\x02' | dd of=runtime bs=1 seek=8 count=3 conv=notrunc +if [ "@APPIMAGEKIT_EMBED_MAGIC_BYTES@" == "ON" ]; then + printf '\x41\x49\x02' | dd of=runtime bs=1 seek=8 count=3 conv=notrunc +fi # Convert runtime into a data object that can be embedded into appimagetool ld -r -b binary -o data.o runtime From 65a5d96cb0efa4b989f44c0e71e9bf55547b4096 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 23 Mar 2018 02:42:14 +0100 Subject: [PATCH 104/544] Add support for CCache to speed up builds --- CMakeLists.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b6298a0a7..6fd378024 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,20 @@ include(ExternalProject) # enable testing globally include(CTest) +# support for ccache +# call CMake with -DUSE_CCACHE=ON to make use of it +set(USE_CCACHE OFF CACHE BOOL "") +if(USE_CCACHE) + find_program(CCACHE ccache) + if(CCACHE) + message(STATUS "Using ccache") + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE}) + set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE}) + else() + message(WARNING "USE_CCACHE set, but could not find ccache") + endif() +endif() + ##################### # build information # From 9600855f2d74e2ba61828c48fb67f1c4152ddfe7 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 23 Mar 2018 02:42:37 +0100 Subject: [PATCH 105/544] Build dependencies with ccache --- cmake/dependencies.cmake | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 736d9e66e..d963f904f 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -8,6 +8,19 @@ pkg_check_modules(OPENSSL REQUIRED openssl) pkg_check_modules(FUSE REQUIRED fuse) +if(USE_CCACHE) + message(STATUS "Using CCache to build AppImageKit dependencies") + # TODO: find way to use find_program with all possible paths + # (might differ from distro to distro) + # these work on Debian and Ubuntu: + set(CC "/usr/lib/ccache/gcc") + set(CXX "/usr/lib/ccache/g++") +else() + set(CC "${CMAKE_C_COMPILER}") + set(CXX "${CMAKE_CXX_COMPILER}") +endif() + + set(USE_SYSTEM_XZ OFF CACHE BOOL "Use system xz/liblzma instead of building our own") if(NOT USE_SYSTEM_XZ) @@ -16,7 +29,7 @@ if(NOT USE_SYSTEM_XZ) ExternalProject_Add(xz URL https://tukaani.org/xz/xz-5.2.3.tar.gz URL_HASH SHA512=a5eb4f707cf31579d166a6f95dbac45cf7ea181036d1632b4f123a4072f502f8d57cd6e7d0588f0bf831a07b8fc4065d26589a25c399b95ddcf5f73435163da6 - CONFIGURE_COMMAND CFLAGS=-fPIC CPPFLAGS=-fPIC /configure --disable-shared --enable-static --prefix= --libdir=/lib + CONFIGURE_COMMAND CC=${CC} CXX=${CXX} CFLAGS=-fPIC CPPFLAGS=-fPIC /configure --disable-shared --enable-static --prefix= --libdir=/lib BUILD_COMMAND make INSTALL_COMMAND make install ) @@ -68,7 +81,7 @@ ExternalProject_Add(squashfuse COMMAND automake --force-missing --add-missing COMMAND autoreconf -fi || true COMMAND sed -i "/PKG_CHECK_MODULES.*/,/,:./d" configure # https://github.com/vasi/squashfuse/issues/12 - COMMAND ./configure --disable-demo --disable-high-level --without-lzo --without-lz4 --prefix= --libdir=/lib --with-xz=${xz_PREFIX} + COMMAND CC=${CC} CXX=${CXX} ./configure --disable-demo --disable-high-level --without-lzo --without-lz4 --prefix= --libdir=/lib --with-xz=${xz_PREFIX} COMMAND sed -i "s|XZ_LIBS = -llzma |XZ_LIBS = -Bstatic ${xz_LIBRARIES}/|g" Makefile BUILD_COMMAND make BUILD_IN_SOURCE ON @@ -103,7 +116,7 @@ ExternalProject_Add(mksquashfs COMMAND sed -i "s|LIBS += -llzma|LIBS += -Bstatic ${xz_LIBRARIES}|g" /squashfs-tools/Makefile COMMAND sed -i "s|install: mksquashfs unsquashfs|install: mksquashfs|g" squashfs-tools/Makefile COMMAND sed -i "/cp unsquashfs/d" squashfs-tools/Makefile - BUILD_COMMAND make -C squashfs-tools/ XZ_SUPPORT=1 mksquashfs + BUILD_COMMAND CC=${CC} CXX=${CXX} make -C squashfs-tools/ XZ_SUPPORT=1 mksquashfs # make install unfortunately expects unsquashfs to be built as well, hence can't install the binary # therefore using built file in SOURCE_DIR # TODO: implement building out of source @@ -132,7 +145,7 @@ if(NOT USE_SYSTEM_INOTIFY_TOOLS) PATCH_COMMAND wget -N --content-disposition "https://git.savannah.gnu.org/gitweb/?p=config.git$%3CSEMICOLON%3Ea=blob_plain$%3CSEMICOLON%3Ef=config.guess$%3CSEMICOLON%3Ehb=HEAD" COMMAND wget -N --content-disposition "https://git.savannah.gnu.org/gitweb/?p=config.git$%3CSEMICOLON%3Ea=blob_plain$%3CSEMICOLON%3Ef=config.sub$%3CSEMICOLON%3Ehb=HEAD" UPDATE_COMMAND "" # make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time - CONFIGURE_COMMAND /configure --enable-shared --enable-static --enable-doxygen=no --prefix= --libdir=/lib + CONFIGURE_COMMAND CC=${CC} CXX=${CXX} /configure --enable-shared --enable-static --enable-doxygen=no --prefix= --libdir=/lib BUILD_COMMAND make BUILD_IN_SOURCE ON INSTALL_COMMAND make install @@ -166,7 +179,7 @@ if(NOT USE_SYSTEM_LIBARCHIVE) ExternalProject_Add(libarchive URL https://www.libarchive.org/downloads/libarchive-3.3.1.tar.gz URL_HASH SHA512=90702b393b6f0943f42438e277b257af45eee4fa82420431f6a4f5f48bb846f2a72c8ff084dc3ee9c87bdf8b57f4d8dddf7814870fe2604fe86c55d8d744c164 - CONFIGURE_COMMAND CFLAGS=-fPIC CPPFLAGS=-fPIC /configure --disable-shared --enable-static --disable-bsdtar --disable-bsdcat --disable-bsdcpio --with-zlib --without-bz2lib --without-iconv --without-lz4 --without-lzma --without-lzo2 --without-nettle --without-openssl --without-xml2 --without-expat --prefix= --libdir=/lib + CONFIGURE_COMMAND CC=${CC} CXX=${CXX} CFLAGS=-fPIC CPPFLAGS=-fPIC /configure --disable-shared --enable-static --disable-bsdtar --disable-bsdcat --disable-bsdcpio --with-zlib --without-bz2lib --without-iconv --without-lz4 --without-lzma --without-lzo2 --without-nettle --without-openssl --without-xml2 --without-expat --prefix= --libdir=/lib BUILD_COMMAND make INSTALL_COMMAND make install ) From d78765e8cc8c6ebb2991a084e56f55684a6d1e44 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 23 Mar 2018 03:08:01 +0100 Subject: [PATCH 106/544] Add debuggable runtime target to CMake For use with IDEs that support CMake directly. --- src/CMakeLists.txt | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4910892e2..91bf7cb8e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -15,7 +15,7 @@ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime COMMAND bash ${CMAKE_CURRENT_BINARY_DIR}/build-runtime.sh WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/build-runtime.sh - MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/runtime.c + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/runtime.c DEPENDS squashfuse ) @@ -225,6 +225,38 @@ target_link_libraries(digest add_sanitizers(digest) +add_executable(runtime-debug EXCLUDE_FROM_ALL elf.c notify.c getsection.c runtime.c) + +target_link_libraries(runtime-debug + PRIVATE + ${squashfuse_LIBRARIES} + ${libarchive_LIBRARIES} + ${xz_LIBRARIES} + PUBLIC + pthread + ${GLIB_LIBRARIES} + ${GIO_LIBRARIES} + ${ZLIB_LIBRARIES} + ${CAIRO_LIBRARIES} + ${CMAKE_DL_LIBS} +) + +set(_RUNTIME_FLAGS -g -O0 -ffunction-sections -fdata-sections -s -Wl,--gc-sections -DGIT_COMMIT='${GIT_COMMIT}' -D_FILE_OFFSET_BITS=64) + +set_target_properties(runtime-debug PROPERTIES LINK_FLAGS "${_RUNTIME_FLAGS}") + +target_compile_options(runtime-debug + PUBLIC "${_RUNTIME_FLAGS}" +) + +if(NOT USE_SYSTEM_INOTIFY_TOOLS) + add_dependencies(runtime-debug inotify-tools) +endif() +if(NOT USE_SYSTEM_LIBARCHIVE) + add_dependencies(runtime-debug libarchive) +endif() + + # install binaries if(AUXILIARY_FILES_DESTINATION) install( From 52f95ae1181c076cc7ed1ea0a76c85d55f68525b Mon Sep 17 00:00:00 2001 From: James Stronz Date: Fri, 23 Mar 2018 14:13:44 -0500 Subject: [PATCH 107/544] install-build-deps.sh: removed archlinux dep g++ (provided by gcc) and added cmake --- install-build-deps.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install-build-deps.sh b/install-build-deps.sh index 8790beacb..6694c70d8 100755 --- a/install-build-deps.sh +++ b/install-build-deps.sh @@ -65,7 +65,7 @@ fi if [ -e /usr/bin/pacman ] ; then echo "Checking arch package provides and installed packages" "cmake" declare -a arr=("zsync" "git" "libarchive" "autoconf" "libtool" "make" - "libtool" "fuse2" "xz" "glib2" "openssl" "inotify-tools" "lz4" "gcc" "g++") + "libtool" "fuse2" "xz" "glib2" "openssl" "inotify-tools" "lz4" "gcc" "cmake") for i in "${arr[@]}" do if [ ! "$(package-query -Q $i || package-query --qprovides $i -Q)" ]; then From c44f53b52a60cff6a1606a70aa6fead0ae18289b Mon Sep 17 00:00:00 2001 From: James Stronz Date: Fri, 23 Mar 2018 14:45:35 -0500 Subject: [PATCH 108/544] install-build-deps.sh: added dependencies not in base-devel and removed make --- install-build-deps.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/install-build-deps.sh b/install-build-deps.sh index 6694c70d8..f4a3f86ae 100755 --- a/install-build-deps.sh +++ b/install-build-deps.sh @@ -63,9 +63,9 @@ fi # Install dependencies for Arch Linux if [ -e /usr/bin/pacman ] ; then - echo "Checking arch package provides and installed packages" "cmake" - declare -a arr=("zsync" "git" "libarchive" "autoconf" "libtool" "make" - "libtool" "fuse2" "xz" "glib2" "openssl" "inotify-tools" "lz4" "gcc" "cmake") + echo "Checking arch package provides and installed packages" + declare -a arr=("zsync" "git" "libarchive" "autoconf" "libtool" "libtool" "fuse2" "xz" "glib2" "openssl" + "inotify-tools" "lz4" "gcc" "cmake" "wget" "vim" "desktop-file-utils" "cairo") for i in "${arr[@]}" do if [ ! "$(package-query -Q $i || package-query --qprovides $i -Q)" ]; then From 1255c7353c157647353c790cfe376a7986f5a39d Mon Sep 17 00:00:00 2001 From: James Stronz Date: Fri, 23 Mar 2018 15:15:19 -0500 Subject: [PATCH 109/544] install-build-deps.sh: removed duplicate --- install-build-deps.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install-build-deps.sh b/install-build-deps.sh index f4a3f86ae..2e5558870 100755 --- a/install-build-deps.sh +++ b/install-build-deps.sh @@ -64,7 +64,7 @@ fi # Install dependencies for Arch Linux if [ -e /usr/bin/pacman ] ; then echo "Checking arch package provides and installed packages" - declare -a arr=("zsync" "git" "libarchive" "autoconf" "libtool" "libtool" "fuse2" "xz" "glib2" "openssl" + declare -a arr=("zsync" "git" "libarchive" "autoconf" "libtool" "fuse2" "xz" "glib2" "openssl" "inotify-tools" "lz4" "gcc" "cmake" "wget" "vim" "desktop-file-utils" "cairo") for i in "${arr[@]}" do From c5315bdcf58822a00db3ace960b44be1c1983d5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20L=C3=B3pez=20Zubieta?= Date: Fri, 23 Mar 2018 14:31:07 -0600 Subject: [PATCH 110/544] Add appimage_list_files to the libappimage api. --- include/appimage/appimage.h | 11 ++ src/shared.c | 38 ++++ src/shared.h | 2 + tests/test_libappimage.cpp | 368 +++++++++++++++++++++--------------- 4 files changed, 262 insertions(+), 157 deletions(-) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index 25ea8077e..508f8ba01 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -37,6 +37,17 @@ void appimage_extract_file_following_symlinks(const char* appimage_file_path, co * https://specifications.freedesktop.org/thumbnail-spec/0.8.0/index.html */ void appimage_create_thumbnail(const char* appimage_file_path); + +/* List files contained in the AppImage file. + * Returns: a newly allocated char** ended at NULL. If no files ware found also is returned a {NULL} + * + * You should ALWAYS take care of releasing this structure like this: + * char **list; + * for (char **ptr = list; *ptr != null; ptr ++) + * free(*ptr) + * free(list); + * */ +char** appimage_list_files(const char* path); #ifdef __cplusplus } #endif diff --git a/src/shared.c b/src/shared.c index 7899134a5..1c25ccf64 100644 --- a/src/shared.c +++ b/src/shared.c @@ -1766,3 +1766,41 @@ void appimage_extract_file_following_symlinks(const gchar* appimage_file_path, c extract_appimage_file(&handler, file_path, target_dir); } + +void extract_appimage_file_name(void *handler_data, void *entry_data, void *user_data) { + appimage_handler *h = handler_data; + struct archive_entry *entry = entry_data; + GList **list = user_data; + + char *filename = h->get_file_name(h, entry); + + GList* ptr = g_list_find_custom (*list, filename, g_strcmp0); + + if (ptr == NULL) + *list = g_list_append(*list, filename); + else + free(filename); +} + + +char** appimage_list_files(const char *path) { + GList *list = NULL; + appimage_handler handler = create_appimage_handler(path); + + handler.traverse(&handler, extract_appimage_file_name, &list); + + int n = g_list_length(list); + char **result = malloc(sizeof(char*) * (n+1) ); + result[n] = NULL; + + GList *itr = list; + for (int i = 0; i < n; i ++) { + result[i] = (char *) itr->data; + itr = itr->next; + } + + + g_list_free(list); + + return result; +} diff --git a/src/shared.h b/src/shared.h index 7bff9b63d..c594436d2 100644 --- a/src/shared.h +++ b/src/shared.h @@ -116,3 +116,5 @@ gchar* replace_str(const gchar* src, const gchar* find, const gchar* replace); void set_executable(const char* path, gboolean verbose); extern char* vendorprefix; + +char** appimage_list_files(const char* path); \ No newline at end of file diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index 45a834027..3ee4be0b3 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -15,221 +15,275 @@ #include "fixtures.h" -namespace AppImageTests -{ +namespace AppImageTests { -class LibAppImageTest : public AppImageKitTest -{ -protected: - std::string appImage_type_1_file_path; - std::string appImage_type_2_file_path; + class LibAppImageTest : public AppImageKitTest { + protected: + std::string appImage_type_1_file_path; + std::string appImage_type_2_file_path; - LibAppImageTest() - { - appImage_type_1_file_path = std::string(TEST_DATA_DIR) + "/AppImageExtract_6-x86_64.AppImage"; - appImage_type_2_file_path = std::string(TEST_DATA_DIR) + "/Echo-x86_64.AppImage"; - } + LibAppImageTest() { + appImage_type_1_file_path = std::string(TEST_DATA_DIR) + "/AppImageExtract_6-x86_64.AppImage"; + appImage_type_2_file_path = std::string(TEST_DATA_DIR) + "/Echo-x86_64.AppImage"; + } - void rm_file(const std::string& path) - { - g_remove(path.c_str()); - } + void rm_file(const std::string &path) { + g_remove(path.c_str()); + } - bool areIntegrationFilesDeployed(const std::string& path) - { - gchar *sum = appimage_get_md5(path.c_str()); + bool areIntegrationFilesDeployed(const std::string &path) { + gchar *sum = appimage_get_md5(path.c_str()); - GDir *dir; - GError *error; - const gchar *filename; + GDir *dir; + GError *error; + const gchar *filename; - char *apps_path = g_strconcat(g_get_user_data_dir(), "/applications/", NULL); + char *apps_path = g_strconcat(g_get_user_data_dir(), "/applications/", NULL); - bool found = false; - dir = g_dir_open(apps_path, 0, &error); - while ((filename = g_dir_read_name(dir))) - { - gchar *m = g_strrstr(filename, sum); + bool found = false; + dir = g_dir_open(apps_path, 0, &error); + while ((filename = g_dir_read_name(dir))) { + gchar *m = g_strrstr(filename, sum); - if (m != NULL) - found = true; + if (m != NULL) + found = true; + } + g_dir_close(dir); + g_free(apps_path); + g_free(sum); + return found; } - g_dir_close(dir); - g_free(apps_path); - g_free(sum); - return found; + }; + + TEST_F(LibAppImageTest, appimage_get_type_invalid) { + ASSERT_EQ(appimage_get_type("/tmp", false), -1); } -}; -TEST_F(LibAppImageTest, appimage_get_type_invalid) -{ - ASSERT_EQ(appimage_get_type("/tmp", false), -1); -} + TEST_F(LibAppImageTest, appimage_get_type_1) { + ASSERT_EQ(appimage_get_type(appImage_type_1_file_path.c_str(), false), 1); + } -TEST_F(LibAppImageTest, appimage_get_type_1) -{ - ASSERT_EQ(appimage_get_type(appImage_type_1_file_path.c_str(), false), 1); -} + TEST_F(LibAppImageTest, appimage_get_type_2) { + ASSERT_EQ(appimage_get_type(appImage_type_2_file_path.c_str(), false), 2); + } -TEST_F(LibAppImageTest, appimage_get_type_2) -{ - ASSERT_EQ(appimage_get_type(appImage_type_2_file_path.c_str(), false), 2); -} + TEST_F(LibAppImageTest, appimage_register_in_system_with_type1) { + ASSERT_EQ(appimage_register_in_system(appImage_type_1_file_path.c_str(), false), 0); -TEST_F(LibAppImageTest, appimage_register_in_system_with_type1) -{ - ASSERT_EQ(appimage_register_in_system(appImage_type_1_file_path.c_str(), false), 0); + ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_1_file_path)); - ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_1_file_path)); + appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); + } - appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); -} + TEST_F(LibAppImageTest, appimage_register_in_system_with_type2) { + ASSERT_EQ(appimage_register_in_system(appImage_type_2_file_path.c_str(), false), 0); -TEST_F(LibAppImageTest, appimage_register_in_system_with_type2) -{ - ASSERT_EQ(appimage_register_in_system(appImage_type_2_file_path.c_str(), false), 0); + ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_2_file_path)); - ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_2_file_path)); + appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); + } - appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); -} + TEST_F(LibAppImageTest, appimage_type1_register_in_system) { + ASSERT_TRUE(appimage_type1_register_in_system(appImage_type_1_file_path.c_str(), false)); -TEST_F(LibAppImageTest, appimage_type1_register_in_system) -{ - ASSERT_TRUE(appimage_type1_register_in_system(appImage_type_1_file_path.c_str(), false)); + ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_1_file_path)); - ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_1_file_path)); + appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); + } - appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); -} + TEST_F(LibAppImageTest, appimage_type2_register_in_system) { + EXPECT_TRUE(appimage_type2_register_in_system(appImage_type_2_file_path.c_str(), false)); -TEST_F(LibAppImageTest, appimage_type2_register_in_system) -{ - EXPECT_TRUE(appimage_type2_register_in_system(appImage_type_2_file_path.c_str(), false)); + EXPECT_TRUE(areIntegrationFilesDeployed(appImage_type_2_file_path)); + appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); + } - EXPECT_TRUE(areIntegrationFilesDeployed(appImage_type_2_file_path)); - appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); -} + TEST_F(LibAppImageTest, appimage_unregister_in_system) { + ASSERT_FALSE(areIntegrationFilesDeployed(appImage_type_1_file_path)); + ASSERT_FALSE(areIntegrationFilesDeployed(appImage_type_2_file_path)); + } -TEST_F(LibAppImageTest, appimage_unregister_in_system) { - ASSERT_FALSE(areIntegrationFilesDeployed(appImage_type_1_file_path)); - ASSERT_FALSE(areIntegrationFilesDeployed(appImage_type_2_file_path)); -} + TEST_F(LibAppImageTest, appimage_get_md5) { + std::string pathToTestFile = "/some/fixed/path"; + + std::string expected = "972f4824b8e6ea26a55e9af60a285af7"; -TEST_F(LibAppImageTest, appimage_get_md5) -{ - std::string pathToTestFile = "/some/fixed/path"; + gchar *sum = appimage_get_md5(pathToTestFile.c_str()); + EXPECT_EQ(sum, expected); + g_free(sum); - std::string expected = "972f4824b8e6ea26a55e9af60a285af7"; + unlink(pathToTestFile.c_str()); + } - gchar* sum = appimage_get_md5(pathToTestFile.c_str()); - EXPECT_EQ(sum, expected); - g_free(sum); + TEST_F(LibAppImageTest, get_md5_invalid_file_path) { + std::string expected = ""; + gchar *sum = appimage_get_md5(""); - unlink(pathToTestFile.c_str()); -} + int res = g_strcmp0(expected.c_str(), sum); + ASSERT_EQ(res, 0); + } -TEST_F(LibAppImageTest, get_md5_invalid_file_path) -{ - std::string expected = ""; - gchar * sum = appimage_get_md5(""); + TEST_F(LibAppImageTest, create_thumbnail_appimage_type_1) { + appimage_create_thumbnail(appImage_type_1_file_path.c_str()); - int res = g_strcmp0(expected.c_str(), sum); - ASSERT_EQ(res, 0); -} + gchar *sum = appimage_get_md5(appImage_type_1_file_path.c_str()); + std::string path = std::string(g_get_user_cache_dir()) + + "/thumbnails/normal/" + + std::string(sum) + ".png"; -TEST_F(LibAppImageTest, create_thumbnail_appimage_type_1) { - appimage_create_thumbnail(appImage_type_1_file_path.c_str()); + g_free(sum); - gchar *sum = appimage_get_md5(appImage_type_1_file_path.c_str()); - std::string path = std::string(g_get_user_cache_dir()) - + "/thumbnails/normal/" - + std::string(sum) + ".png"; + ASSERT_TRUE(g_file_test(path.c_str(), G_FILE_TEST_EXISTS)); - g_free(sum); + // Clean + rm_file(path); + } - ASSERT_TRUE(g_file_test(path.c_str(), G_FILE_TEST_EXISTS)); + TEST_F(LibAppImageTest, create_thumbnail_appimage_type_2) { + appimage_create_thumbnail(appImage_type_2_file_path.c_str()); - // Clean - rm_file(path); -} + gchar *sum = appimage_get_md5(appImage_type_2_file_path.c_str()); + std::string path = std::string(g_get_user_cache_dir()) + + "/thumbnails/normal/" + + std::string(sum) + ".png"; -TEST_F(LibAppImageTest, create_thumbnail_appimage_type_2) { - appimage_create_thumbnail(appImage_type_2_file_path.c_str()); + g_free(sum); - gchar* sum = appimage_get_md5(appImage_type_2_file_path.c_str()); - std::string path = std::string(g_get_user_cache_dir()) - + "/thumbnails/normal/" - + std::string(sum) + ".png"; + ASSERT_TRUE(g_file_test(path.c_str(), G_FILE_TEST_EXISTS)); - g_free(sum); + // Clean + rm_file(path); + } - ASSERT_TRUE(g_file_test(path.c_str(), G_FILE_TEST_EXISTS)); + TEST_F(LibAppImageTest, appimage_extract_file_following_symlinks) { + std::string target_path = tempDir + "test_libappimage_tmp_file"; + appimage_extract_file_following_symlinks(appImage_type_2_file_path.c_str(), "echo.desktop", + target_path.c_str()); + + const char expected[] = ("[Desktop Entry]\n" + "Version=1.0\n" + "Type=Application\n" + "Name=Echo\n" + "Comment=Just echo.\n" + "Exec=echo %F\n" + "Icon=utilities-terminal\n"); + + ASSERT_TRUE(g_file_test(target_path.c_str(), G_FILE_TEST_EXISTS)); + + std::ifstream file(target_path.c_str(), std::ios::binary | std::ios::ate); + std::streamsize size = file.tellg(); + file.seekg(0, std::ios::beg); + + std::vector buffer(static_cast(size)); + if (file.read(buffer.data(), size)) + ASSERT_TRUE(strncmp(expected, buffer.data(), strlen(expected)) == 0); + else + FAIL(); + + // Clean + remove(target_path.c_str()); + } - // Clean - rm_file(path); -} + bool test_appimage_is_registered_in_system(const std::string &pathToAppImage, bool integrateAppImage) { + if (integrateAppImage) { + EXPECT_EQ(appimage_register_in_system(pathToAppImage.c_str(), false), 0); + } -TEST_F(LibAppImageTest, appimage_extract_file_following_symlinks) { - std::string target_path = tempDir + "test_libappimage_tmp_file"; - appimage_extract_file_following_symlinks(appImage_type_2_file_path.c_str(), "echo.desktop", target_path.c_str()); + return appimage_is_registered_in_system(pathToAppImage.c_str()); + } - const char expected[] = ("[Desktop Entry]\n" - "Version=1.0\n" - "Type=Application\n" - "Name=Echo\n" - "Comment=Just echo.\n" - "Exec=echo %F\n" - "Icon=utilities-terminal\n"); + TEST_F(LibAppImageTest, appimage_is_registered_in_system) { + // make sure tested AppImages are not registered + appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); + appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); - ASSERT_TRUE(g_file_test(target_path.c_str(), G_FILE_TEST_EXISTS)); + // if the test order is false -> true, cleanup isn't necessary - std::ifstream file(target_path.c_str(), std::ios::binary | std::ios::ate); - std::streamsize size = file.tellg(); - file.seekg(0, std::ios::beg); + // type 1 tests + EXPECT_FALSE(test_appimage_is_registered_in_system(appImage_type_1_file_path, false)); + EXPECT_TRUE(test_appimage_is_registered_in_system(appImage_type_1_file_path, true)); - std::vector buffer(static_cast(size)); - if (file.read(buffer.data(), size)) - ASSERT_TRUE( strncmp(expected, buffer.data(), strlen(expected)) == 0 ); - else - FAIL(); + // type 2 tests + EXPECT_FALSE(test_appimage_is_registered_in_system(appImage_type_2_file_path, false)); + EXPECT_TRUE(test_appimage_is_registered_in_system(appImage_type_2_file_path, true)); - // Clean - remove(target_path.c_str()); -} + // cleanup + appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); + appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); + } -bool test_appimage_is_registered_in_system(const std::string& pathToAppImage, bool integrateAppImage) { - if (integrateAppImage) { - EXPECT_EQ(appimage_register_in_system(pathToAppImage.c_str(), false), 0); + TEST_F(LibAppImageTest, appimage_list_files_false_appimage) { + + char **files = appimage_list_files("/bin/ls"); + + char *expected[] = {NULL}; + + int i = 0; + for (; files[i] != NULL && expected[i] != NULL; i++) { + EXPECT_STREQ(files[i], expected[i]); + free(files[i]); + } + + free(files); + if (i != 0) + FAIL(); } - return appimage_is_registered_in_system(pathToAppImage.c_str()); -} + TEST_F(LibAppImageTest, appimage_list_files_type_1) { + + char **files = appimage_list_files(appImage_type_1_file_path.c_str()); + + char *expected[] = { + (char *) "AppImageExtract.desktop", + (char *) ".DirIcon", + (char *) "AppImageExtract.png", + (char *) "usr/bin/appimageextract", + (char *) "usr/bin/xorriso", + (char *) "usr/lib/libisofs.so.6", + (char *) "usr/lib/libisoburn.so.1", + (char *) "usr/lib/libburn.so.4", + (char *) "AppRun", + NULL}; + + int i = 0; + for (; files[i] != NULL && expected[i] != NULL; i++) { + EXPECT_STREQ(files[i], expected[i]); + free(files[i]); + } -TEST_F(LibAppImageTest, appimage_is_registered_in_system) { - // make sure tested AppImages are not registered - appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); - appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); + free(files); + if (i != 9) + FAIL(); + } - // if the test order is false -> true, cleanup isn't necessary + TEST_F(LibAppImageTest, appimage_list_files_type_2) { - // type 1 tests - EXPECT_FALSE(test_appimage_is_registered_in_system(appImage_type_1_file_path, false)); - EXPECT_TRUE(test_appimage_is_registered_in_system(appImage_type_1_file_path, true)); + char **files = appimage_list_files(appImage_type_2_file_path.c_str()); - // type 2 tests - EXPECT_FALSE(test_appimage_is_registered_in_system(appImage_type_2_file_path, false)); - EXPECT_TRUE(test_appimage_is_registered_in_system(appImage_type_2_file_path, true)); + char *expected[] = { + (char *) ".DirIcon", + (char *) "AppRun", + (char *) "echo.desktop", + (char *) "usr", + (char *) "usr/bin", + (char *) "usr/bin/echo", + (char *) "utilities-terminal.svg", + NULL}; - // cleanup - appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); - appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); -} + int i = 0; + for (; files[i] != NULL && expected[i] != NULL; i++) { + EXPECT_STREQ(files[i], expected[i]); + free(files[i]); + } + + free(files); + if (i != 7) + FAIL(); + } } // namespace -int main(int argc, char **argv) -{ +int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } From 5ade4fe2b3abbf5bec37fac260d75fe9027ceeab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20L=C3=B3pez=20Zubieta?= Date: Fri, 23 Mar 2018 16:12:58 -0600 Subject: [PATCH 111/544] Add appimage_string_list_free --- include/appimage/appimage.h | 9 ++++----- src/shared.c | 7 +++++++ tests/test_libappimage.cpp | 19 +++++++------------ 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index 508f8ba01..e7d4aeba2 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -41,13 +41,12 @@ void appimage_create_thumbnail(const char* appimage_file_path); /* List files contained in the AppImage file. * Returns: a newly allocated char** ended at NULL. If no files ware found also is returned a {NULL} * - * You should ALWAYS take care of releasing this structure like this: - * char **list; - * for (char **ptr = list; *ptr != null; ptr ++) - * free(*ptr) - * free(list); + * You should ALWAYS take care of releasing this using `appimage_string_list_free`. * */ char** appimage_list_files(const char* path); + +void appimage_string_list_free(char** list); + #ifdef __cplusplus } #endif diff --git a/src/shared.c b/src/shared.c index 1c25ccf64..1bd676520 100644 --- a/src/shared.c +++ b/src/shared.c @@ -1804,3 +1804,10 @@ char** appimage_list_files(const char *path) { return result; } + +void appimage_string_list_free(char** list) { + for (char **ptr = list; ptr != NULL && *ptr != NULL; ptr ++) + free(*ptr); + + free(list); +} \ No newline at end of file diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index 3ee4be0b3..a75b4749a 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -219,12 +219,11 @@ namespace AppImageTests { char *expected[] = {NULL}; int i = 0; - for (; files[i] != NULL && expected[i] != NULL; i++) { + for (; files[i] != NULL && expected[i] != NULL; i++) EXPECT_STREQ(files[i], expected[i]); - free(files[i]); - } - free(files); + appimage_string_list_free(files); + if (i != 0) FAIL(); } @@ -246,12 +245,10 @@ namespace AppImageTests { NULL}; int i = 0; - for (; files[i] != NULL && expected[i] != NULL; i++) { + for (; files[i] != NULL && expected[i] != NULL; i++) EXPECT_STREQ(files[i], expected[i]); - free(files[i]); - } - free(files); + appimage_string_list_free(files); if (i != 9) FAIL(); } @@ -271,12 +268,10 @@ namespace AppImageTests { NULL}; int i = 0; - for (; files[i] != NULL && expected[i] != NULL; i++) { + for (; files[i] != NULL && expected[i] != NULL; i++) EXPECT_STREQ(files[i], expected[i]); - free(files[i]); - } - free(files); + appimage_string_list_free(files); if (i != 7) FAIL(); } From 8d0258ccd68898e3aa23769a6826b42a422ddeb4 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 23 Mar 2018 23:54:46 +0100 Subject: [PATCH 112/544] Add docs for appimage_string_list_free --- include/appimage/appimage.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index e7d4aeba2..263b255af 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -45,6 +45,7 @@ void appimage_create_thumbnail(const char* appimage_file_path); * */ char** appimage_list_files(const char* path); +/* Releases memory of a string list (a.k.a. list of pointers to char arrays allocated in heap memory). */ void appimage_string_list_free(char** list); #ifdef __cplusplus From 8e5faa631c16a46c94409d4a413f0b75442b381c Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 24 Mar 2018 03:39:22 +0100 Subject: [PATCH 113/544] Make TARGET_APPIMAGE more useful Necessary for AppImageLauncher and possibly other applications to run AppImages without using the embedded runtime. Please beware that TARGET_APPIMAGE MUST be an absolute path. --- src/runtime.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 5765724b7..4be893dab 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -592,15 +592,11 @@ main (int argc, char *argv[]) setenv( "OWD", cwd, 1 ); } - /* If we are operating on an AppImage different from this file, - * then we do not execute the payload */ - if(getenv("TARGET_APPIMAGE") == NULL){ - /* TODO: Find a way to get the exit status and/or output of this */ - execv (filename, real_argv); - /* Error if we continue here */ - perror ("execv error"); - exit (1); - } + /* TODO: Find a way to get the exit status and/or output of this */ + execv (filename, real_argv); + /* Error if we continue here */ + perror("execv error"); + exit(1); } return 0; From 83130214580d74131fff057902382ccafd94a2ca Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 24 Mar 2018 03:39:39 +0100 Subject: [PATCH 114/544] Make use of CMAKE_DL_LIBS instead of dl for linking --- src/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4910892e2..658d8e8c3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -142,7 +142,7 @@ target_link_libraries(appimagetool ) target_link_libraries(appimagetool - dl + ${CMAKE_DL_LIBS} pthread ${ZLIB_LIBRARIES} ${xz_LIBRARIES} @@ -172,7 +172,7 @@ add_executable(appimaged appimaged.c notify.c elf.c getsection.c) target_link_libraries(appimaged pthread - dl + ${CMAKE_DL_LIBS} ${CAIRO_LIBRARIES} ${GLIB_LIBRARIES} ${GIO_LIBRARIES} From 87b90477c1e5392a3f215dfa747623942a62e995 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 24 Mar 2018 12:46:27 +0100 Subject: [PATCH 115/544] Disable debug prints in libappimage, mk. 1 --- src/CMakeLists.txt | 1 + src/shared.c | 31 ++++++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 658d8e8c3..0412c3e84 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -189,6 +189,7 @@ target_compile_definitions(appimaged PRIVATE -DBUILD_DATE="${DATE}" PRIVATE -D_FILE_OFFSET_BITS=64 PRIVATE -DHAVE_LIBARCHIVE3=0 + PRIVATE -DSTANDALONE=1 ) add_dependencies(appimaged squashfuse) diff --git a/src/shared.c b/src/shared.c index 1bd676520..6ea37df1e 100644 --- a/src/shared.c +++ b/src/shared.c @@ -230,26 +230,36 @@ int appimage_get_type(const char* path, gboolean verbose) fread(buffer, 1, 3, f); fclose(f); if((buffer[0] == 0x41) && (buffer[1] == 0x49) && (buffer[2] == 0x01)){ +#ifdef STANDALONE fprintf(stderr, "_________________________\n"); +#endif if(verbose){ fprintf(stderr, "AppImage type 1\n"); } return 1; } else if((buffer[0] == 0x41) && (buffer[1] == 0x49) && (buffer[2] == 0x02)){ +#ifdef STANDALONE fprintf(stderr, "_________________________\n"); +#endif if(verbose){ fprintf(stderr, "AppImage type 2\n"); } return 2; } else { if((g_str_has_suffix(path,".AppImage")) || (g_str_has_suffix(path,".appimage"))) { +#ifdef STANDALONE fprintf(stderr, "_________________________\n"); - fprintf(stderr, "Blindly assuming AppImage type 1\n"); - fprintf(stderr, "The author of this AppImage should embed the magic bytes, see https://github.com/AppImage/AppImageSpec\n"); +#endif + if (verbose) { + fprintf(stderr, "Blindly assuming AppImage type 1\n"); + fprintf(stderr, "The author of this AppImage should embed the magic bytes, see https://github.com/AppImage/AppImageSpec\n"); + } return 1; } else { +#ifdef STANDALONE + fprintf(stderr, "_________________________\n"); +#endif if(verbose){ - fprintf(stderr, "_________________________\n"); fprintf(stderr, "Unrecognized file '%s'\n", path); } return -1; @@ -681,7 +691,9 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag /* When appimaged sees itself, then do nothing here */ if(strcmp ("appimaged.desktop", desktop_filename) == 0) { g_free(destination); +#ifdef STANDALONE fprintf(stderr, "appimaged's desktop file found -- not installing desktop file for myself\n"); +#endif return true; } @@ -689,8 +701,11 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag fprintf(stderr, "install: %s\n", destination); gchar *dirname = g_path_get_dirname(destination); - if(g_mkdir_with_parents(dirname, 0755)) + if(g_mkdir_with_parents(dirname, 0755)) { +#ifdef STANDALONE fprintf(stderr, "Could not create directory: %s\n", dirname); +#endif + } g_free(dirname); // g_key_file_save_to_file(key_file_structure, destination, NULL); @@ -744,7 +759,9 @@ bool appimage_type1_get_desktop_filename_and_key_file(struct archive** a, gchar* /* Get desktop file(s) in the root directory of the AppImage and act on it in one go */ if ((g_str_has_suffix(filename, ".desktop") && (NULL == strstr(filename, "/")))) { +#ifdef STANDALONE fprintf(stderr, "Got root desktop: %s\n", filename); +#endif const void* buff; @@ -1049,7 +1066,9 @@ bool appimage_type2_get_desktop_filename_and_key_file(sqfs* fs, gchar** desktop_ // gchar **str_array = squash_get_matching_files(&fs, "(^.*?.desktop$)", md5, verbose); // Not only there /* Work trough the NULL-terminated array of strings */ for (int i = 0; str_array[i]; ++i) { +#ifdef STANDALONE fprintf(stderr, "Got root desktop: %s\n", str_array[i]); +#endif if (!g_key_file_load_from_squash(fs, str_array[i], *key_file, verbose)) errored = true; @@ -1373,9 +1392,11 @@ int appimage_unregister_in_system(char *path, gboolean verbose) char *md5 = appimage_get_md5(path); /* The file is already gone by now, so we can't determine its type anymore */ +#ifdef STANDALONE fprintf(stderr, "_________________________\n"); fprintf(stderr, "\n"); fprintf(stderr, "-> UNREGISTER %s\n", path); +#endif /* Could use gnome_desktop_thumbnail_factory_lookup instead of the next line */ /* Delete the thumbnails if they exist */ @@ -1810,4 +1831,4 @@ void appimage_string_list_free(char** list) { free(*ptr); free(list); -} \ No newline at end of file +} From 4843ac617d44d52b0114cda674dbcc44cb0d20b8 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 24 Mar 2018 22:58:17 +0100 Subject: [PATCH 116/544] Disable debug prints in libappimage, mk. 2 --- src/shared.c | 161 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 141 insertions(+), 20 deletions(-) diff --git a/src/shared.c b/src/shared.c index 6ea37df1e..ff1d6fdee 100644 --- a/src/shared.c +++ b/src/shared.c @@ -72,7 +72,9 @@ void set_executable(const char *path, gboolean verbose) if(!g_find_program_in_path ("firejail")){ int result = chmod(path, 0755); // TODO: Only do this if signature verification passed if(result != 0){ +#ifdef STANDALONE fprintf(stderr, "Could not set %s executable: %s\n", path, strerror(errno)); +#endif } else { if(verbose) fprintf(stderr, "Set %s executable\n", path); @@ -163,10 +165,11 @@ void move_icon_to_destination(gchar *icon_path, gboolean verbose) if(g_str_has_suffix (icon_path, ".xpm")) { // TODO: GdkPixbuf has a convenient way to load XPM data. Then you can call // gdk_cairo_set_source_pixbuf() to transfer the data to a Cairo surface. +#ifdef STANDALONE fprintf(stderr, "XPM size parsing not yet implemented\n"); +#endif } - if(g_str_has_suffix (icon_path, ".png")) { image = cairo_image_surface_create_from_png(icon_path); w = cairo_image_surface_get_width (image); @@ -178,7 +181,9 @@ void move_icon_to_destination(gchar *icon_path, gboolean verbose) // Probably the right thing to do would be to figure out at runtime which icon sizes are allowable. // Or could we put our own index.theme into .local/share/icons/ and have it observed? if((w != h) || ((w != 16) && (w != 24) && (w != 32) && (w != 36) && (w != 48) && (w != 64) && (w != 72) && (w != 96) && (w != 128) && (w != 192) && (w != 256) && (w != 512))){ +#ifdef STANDALONE fprintf(stderr, "%s has nonstandard size w = %i, h = %i; please fix it\n", icon_path, w, h); +#endif } else { g_free(dest_dir); dest_dir = g_build_path("/", g_get_user_data_dir(), "/icons/hicolor/", g_strdup_printf("%ix%i", w, h), "/apps/", NULL); @@ -195,8 +200,11 @@ void move_icon_to_destination(gchar *icon_path, gboolean verbose) if(verbose) fprintf(stderr, "Move from %s to %s\n", icon_path, icon_dest_path); gchar *dirname = g_path_get_dirname(dest_dir); - if(g_mkdir_with_parents(dirname, 0755)) + if(g_mkdir_with_parents(dirname, 0755)) { +#ifdef STANDALONE fprintf(stderr, "Could not create directory: %s\n", dest_dir); +#endif + } g_free(dirname); g_free(dest_dir); @@ -208,7 +216,9 @@ void move_icon_to_destination(gchar *icon_path, gboolean verbose) GFile *icon_file = g_file_new_for_path(icon_path); GFile *target_file = g_file_new_for_path(icon_dest_path); if(!g_file_move(icon_file, target_file, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error)){ +#ifdef STANDALONE fprintf(stderr, "Error moving file: %s\n", error->message); +#endif g_error_free(error); } g_object_unref(icon_file); @@ -290,14 +300,19 @@ void squash_extract_inode_to_file(sqfs *fs, sqfs_inode *inode, const gchar *dest FILE * f; f = fopen (dest, "w+"); if (f == NULL){ +#ifdef STANDALONE fprintf(stderr, "fopen error\n"); +#endif return; } while (bytes_already_read < (*inode).xtra.reg.file_size) { char buf[bytes_at_a_time]; - if (sqfs_read_range(fs, inode, (sqfs_off_t) bytes_already_read, &bytes_at_a_time, buf)) + if (sqfs_read_range(fs, inode, (sqfs_off_t) bytes_already_read, &bytes_at_a_time, buf)) { +#ifdef STANDALONE fprintf(stderr, "sqfs_read_range error\n"); +#endif + } fwrite(buf, 1, (size_t) bytes_at_a_time, f); bytes_already_read = bytes_already_read + bytes_at_a_time; } @@ -322,8 +337,11 @@ gchar **squash_get_matching_files_install_icons_and_mime_data(sqfs* fs, char* pa GPtrArray *array = g_ptr_array_new(); sqfs_traverse trv; sqfs_err err = sqfs_traverse_open(&trv, fs, sqfs_inode_root(fs)); - if (err!= SQFS_OK) + if (err!= SQFS_OK) { +#ifdef STANDALONE fprintf(stderr, "sqfs_traverse_open error\n"); +#endif + } while (sqfs_traverse_next(&trv, &err)) { if (!trv.dir_end) { int r; @@ -333,8 +351,11 @@ gchar **squash_get_matching_files_install_icons_and_mime_data(sqfs* fs, char* pa r = regexec(®ex, trv.path, 2, match, 0); regfree(®ex); sqfs_inode inode; - if(sqfs_inode_get(fs, &inode, trv.entry.inode)) + if(sqfs_inode_get(fs, &inode, trv.entry.inode)) { +#ifdef STANDALONE fprintf(stderr, "sqfs_inode_get error\n"); +#endif + } if(r == 0){ // We have a match if(verbose) @@ -379,8 +400,11 @@ gchar **squash_get_matching_files_install_icons_and_mime_data(sqfs* fs, char* pa fprintf(stderr, "install: %s\n", dest); gchar *dirname = g_path_get_dirname(dest); - if(g_mkdir_with_parents(dirname, 0755)) + if(g_mkdir_with_parents(dirname, 0755)) { +#ifdef STANDALONE fprintf(stderr, "Could not create directory: %s\n", dirname); +#endif + } g_free(dirname); @@ -404,8 +428,11 @@ gchar **squash_get_matching_files_install_icons_and_mime_data(sqfs* fs, char* pa } } g_ptr_array_add(array, NULL); - if (err) + if (err) { +#ifdef STANDALONE fprintf(stderr, "sqfs_traverse_next error\n"); +#endif + } sqfs_traverse_close(&trv); return (gchar **) g_ptr_array_free(array, FALSE); } @@ -419,8 +446,10 @@ gboolean g_key_file_load_from_squash(sqfs *fs, char *path, GKeyFile *key_file_st sqfs_traverse trv; gboolean success = true; sqfs_err err = sqfs_traverse_open(&trv, fs, sqfs_inode_root(fs)); - if (err != SQFS_OK) + if (err != SQFS_OK) { fprintf(stderr, "sqfs_traverse_open error\n"); + return false; + } while (sqfs_traverse_next(&trv, &err)) { if (!trv.dir_end) { if (strcmp(path, trv.path) == 0){ @@ -436,15 +465,19 @@ gboolean g_key_file_load_from_squash(sqfs *fs, char *path, GKeyFile *key_file_st // fwrite(buf, 1, max_bytes_to_read, stdout); success = g_key_file_load_from_data (key_file_structure, buf, max_bytes_to_read, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, NULL); } else { +#ifdef STANDALONE fprintf(stderr, "TODO: Implement inode.base.inode_type %i\n", inode.base.inode_type); +#endif } break; } } } +#ifdef STANDALONE if (err) fprintf(stderr, "sqfs_traverse_next error\n"); +#endif sqfs_traverse_close(&trv); return success; @@ -465,7 +498,9 @@ gchar *build_installed_desktop_file_path(gchar* md5, gchar* desktop_filename) { /* Write a modified desktop file to disk that points to the AppImage */ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimage_path, gchar* desktop_filename, int appimage_type, char *md5, gboolean verbose){ if(!g_key_file_has_key(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL)){ +#ifdef STANDALONE fprintf(stderr, "Desktop file has no Exec key\n"); +#endif return false; } @@ -481,7 +516,9 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag if (fields[i] != G_KEY_FILE_DESKTOP_KEY_EXEC) continue; +#ifdef STANDALONE fprintf(stderr, "%s entry missing in Desktop file\n", fields[i]); +#endif return false; }; @@ -492,7 +529,9 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag // error handling if (executable == NULL) { +#ifdef STANDALONE fprintf(stderr, "Invalid value for Exec= entry in Desktop file\n"); +#endif return false; } @@ -545,16 +584,23 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag if(g_find_program_in_path ("AppImageUpdate")){ if(appimage_type == 2){ get_elf_section_offset_and_length(appimage_path, ".upd_info", &upd_offset, &upd_length); - if(upd_length != 1024) - fprintf(stderr, "WARNING: .upd_info length is %lu rather than 1024, this might be a bug in the AppImage\n", upd_length); + if(upd_length != 1024) { +#ifdef STANDALONE + fprintf(stderr, + "WARNING: .upd_info length is %lu rather than 1024, this might be a bug in the AppImage\n", + upd_length); +#endif + } } if(appimage_type == 1){ /* If we have a type 1 AppImage, then we hardcode the offset and length */ upd_offset = 33651; // ISO 9660 Volume Descriptor field upd_length = 512; // Might be wrong } +#ifdef STANDALONE fprintf(stderr, ".upd_info offset: %lu\n", upd_offset); fprintf(stderr, ".upd_info length: %lu\n", upd_length); +#endif char buffer[3]; FILE *binary = fopen(appimage_path, "rt"); if (binary != NULL) @@ -582,7 +628,6 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag g_free(basename); g_free(icon_path); - g_key_file_set_value(key_file_structure, "Desktop Entry", "Icon", icon_with_md5); g_free(icon_with_md5); @@ -597,7 +642,9 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag g_free(generated_by); } g_key_file_set_value(key_file_structure, "Desktop Entry", "X-AppImage-Identifier", md5); +#ifdef STANDALONE fprintf(stderr, "Installing desktop file\n"); +#endif if(verbose) { gchar *buf = g_key_file_to_data(key_file_structure, NULL, NULL); fprintf(stderr, "%s", buf); @@ -915,7 +962,9 @@ bool archive_copy_icons_recursively_to_destination(struct archive** a, const gch if (f == NULL) { int error = errno; +#ifdef STANDALONE fprintf(stderr, "Could not open file %s for writing: %s\n", dest, strerror(error)); +#endif // cleanup g_free(dest); @@ -936,13 +985,17 @@ bool archive_copy_icons_recursively_to_destination(struct archive** a, const gch break; if (r != ARCHIVE_OK) { +#ifdef STANDALONE fprintf(stderr, "%s\n", archive_error_string(*a)); +#endif break; } if ((fwrite(buff, size, 1, f) != size) || ferror(f) || feof(f)) { - int error = errno; +#ifdef STANDALONE fprintf(stderr, "Failed to copy icon: %s\n", strerror(error)); + int error = errno; +#endif errored = true; break; @@ -973,7 +1026,9 @@ bool archive_copy_icons_recursively_to_destination(struct archive** a, const gch /* Register a type 1 AppImage in the system */ bool appimage_type1_register_in_system(const char *path, gboolean verbose) { +#ifdef STANDALONE fprintf(stderr, "ISO9660 based type 1 AppImage\n"); +#endif gchar *desktop_icon_value_original = NULL; char *md5 = appimage_get_md5(path); @@ -994,7 +1049,9 @@ bool appimage_type1_register_in_system(const char *path, gboolean verbose) bool errored = false; if ((r = archive_read_open_filename(a, path, 10240)) != ARCHIVE_OK) { +#ifdef STANDALONE fprintf(stderr, "%s\n", archive_error_string(a)); +#endif errored = true; } // search image for root desktop file, and read it into key file structure so it can be edited eventually @@ -1017,7 +1074,9 @@ bool appimage_type1_register_in_system(const char *path, gboolean verbose) fprintf(stderr, "desktop_icon_value_original: %s\n", desktop_icon_value_original); if (!write_edited_desktop_file(key_file, path, desktop_filename, 1, md5, verbose)) { +#ifdef STANDALONE fprintf(stderr, "Failed to install desktop file\n"); +#endif errored = true; } } @@ -1034,7 +1093,9 @@ bool appimage_type1_register_in_system(const char *path, gboolean verbose) archive_read_support_format_iso9660(a); if ((r = archive_read_open_filename(a, path, 10240)) != ARCHIVE_OK) { +#ifdef STANDALONE fprintf(stderr, "archive error: %s\n", archive_error_string(a)); +#endif errored = true; } else { if (!archive_copy_icons_recursively_to_destination(&a, md5, desktop_icon_value_original, verbose)) { @@ -1084,7 +1145,9 @@ bool appimage_type2_get_desktop_filename_and_key_file(sqfs* fs, gchar** desktop_ /* Register a type 2 AppImage in the system */ bool appimage_type2_register_in_system(char *path, gboolean verbose) { +#ifdef STANDALONE fprintf(stderr, "squashfs based type 2 AppImage\n"); +#endif // the offset at which a squashfs image is expected long unsigned int fs_offset; @@ -1109,7 +1172,9 @@ bool appimage_type2_register_in_system(char *path, gboolean verbose) { if (err != SQFS_OK) { sqfs_destroy(&fs); +#ifdef STANDALONE fprintf(stderr, "sqfs_open_image error: %s\n", path); +#endif return FALSE; } else { if (verbose) @@ -1129,7 +1194,9 @@ bool appimage_type2_register_in_system(char *path, gboolean verbose) { if (verbose) fprintf(stderr, "desktop_icon_value_original: %s\n", desktop_icon_value_original); if (!write_edited_desktop_file(key_file, path, desktop_filename, 2, md5, verbose)) { +#ifdef STANDALONE fprintf(stderr, "Failed to install desktop file\n"); +#endif return false; } } @@ -1226,7 +1293,9 @@ bool appimage_is_registered_in_system(const char* path) { sqfs_err err = sqfs_open_image(&fs, path, fs_offset); if (err != SQFS_OK) { +#ifdef STANDALONE fprintf(stderr, "sqfs_open_image error: %s\n", path); +#endif // cleanup sqfs_destroy(&fs); @@ -1299,7 +1368,9 @@ int appimage_register_in_system(char *path, gboolean verbose) int type = appimage_get_type(path, verbose); if(type != -1) { +#ifdef STANDALONE fprintf(stderr, "\n-> Registering type %d AppImage: %s\n", type, path); +#endif appimage_create_thumbnail(path, false); } else { if (verbose) @@ -1315,7 +1386,9 @@ int appimage_register_in_system(char *path, gboolean verbose) appimage_type2_register_in_system(path, verbose); break; default: +#ifdef STANDALONE fprintf(stderr, "Error: unknown AppImage type %d\n", type); +#endif return 1; } @@ -1414,7 +1487,9 @@ int appimage_unregister_in_system(char *path, gboolean verbose) bool is_handler_valid(const appimage_handler *handler) { if (!handler) { +#ifdef STANDALONE fprintf(stderr, "WARNING: Invalid handler found, you should take a look at this now!"); +#endif return false; } @@ -1424,8 +1499,11 @@ bool is_handler_valid(const appimage_handler *handler) { void mk_base_dir(const char *target) { gchar *dirname = g_path_get_dirname(target); - if(g_mkdir_with_parents(dirname, 0755)) + if(g_mkdir_with_parents(dirname, 0755)) { +#ifdef STANDALONE fprintf(stderr, "Could not create directory: %s\n", dirname); +#endif + } g_free(dirname); } @@ -1455,7 +1533,9 @@ void dummy_extract_file(struct appimage_handler *handler, void *data, char *targ void appimage_type1_open(appimage_handler *handler) { if ( is_handler_valid(handler) && !handler->is_open ) { +#ifdef STANDALONE fprintf(stderr, "Opening %s as Type 1 AppImage\n", handler->path); +#endif struct archive *a; a = archive_read_new(); archive_read_support_format_iso9660(a); @@ -1472,7 +1552,9 @@ void appimage_type1_open(appimage_handler *handler) { void appimage_type1_close(appimage_handler *handler) { if ( is_handler_valid(handler) && handler->is_open ) { +#ifdef STANDALONE fprintf(stderr, "Closing %s\n", handler->path); +#endif struct archive *a = handler->cache; archive_read_close(a); archive_read_free(a); @@ -1486,7 +1568,9 @@ void appimage_type1_traverse(appimage_handler *handler, traverse_cb command, voi appimage_type1_open(handler); if (!command) { +#ifdef STANDALONE fprintf(stderr, "No traverse command set.\n"); +#endif return; } @@ -1536,7 +1620,9 @@ void appimage_type1_extract_file (appimage_handler *handler, void *data, const c int f = open(target, O_WRONLY | O_CREAT | O_TRUNC, mode); if (f == -1){ +#ifdef STANDALONE fprintf(stderr, "open error: %s\n", target); +#endif return; } @@ -1559,14 +1645,18 @@ appimage_handler appimage_type_1_create_handler() { void appimage_type2_open(appimage_handler *handler) { if (is_handler_valid(handler) && !handler->is_open) { +#ifdef STANDALONE fprintf(stderr, "Opening %s as Type 2 AppImage\n", handler->path); +#endif long unsigned int fs_offset; // The offset at which a squashfs image is expected fs_offset = get_elf_size(handler->path); sqfs *fs = malloc(sizeof(sqfs)); sqfs_err err = sqfs_open_image(fs, handler->path, fs_offset); if (err != SQFS_OK){ +#ifdef STANDALONE fprintf(stderr, "sqfs_open_image error: %s\n", handler->path); +#endif free(fs); handler->is_open = false; handler->cache = NULL; @@ -1579,7 +1669,9 @@ void appimage_type2_open(appimage_handler *handler) { void appimage_type2_close(appimage_handler *handler) { if ( is_handler_valid(handler) && handler->is_open ) { +#ifdef STANDALONE fprintf(stderr, "Closing %s\n", handler->path); +#endif sqfs_destroy(handler->cache); free(handler->cache); @@ -1597,13 +1689,19 @@ void appimage_type2_traverse(appimage_handler *handler, traverse_cb command, voi sqfs_traverse trv; sqfs_inode_id root_inode = sqfs_inode_root(fs); sqfs_err err = sqfs_traverse_open(&trv, fs, root_inode); - if (err!= SQFS_OK) + if (err!= SQFS_OK) { +#ifdef STANDALONE fprintf(stderr, "sqfs_traverse_open error\n"); +#endif + } while (sqfs_traverse_next(&trv, &err)) command(handler, &trv, command_data); - if (err) + if (err) { +#ifdef STANDALONE fprintf(stderr, "sqfs_traverse_next error\n"); +#endif + } sqfs_traverse_close(&trv); } @@ -1629,8 +1727,11 @@ void appimage_type2_extract_file_following_symlinks(sqfs *fs, sqfs_inode *inode, appimage_type2_extract_regular_file(fs, inode, target); else if(inode->base.inode_type == SQUASHFS_SYMLINK_TYPE) { appimage_type2_extract_symlink(fs, inode, target); - } else + } else { +#ifdef STANDALONE fprintf(stderr, "WARNING: Unable to extract file of type %d", inode->base.inode_type); +#endif + } } void appimage_type2_extract_symlink(sqfs *fs, sqfs_inode *inode, const char *target) { @@ -1638,18 +1739,27 @@ void appimage_type2_extract_symlink(sqfs *fs, sqfs_inode *inode, const char *tar sqfs_readlink(fs, inode, NULL, &size); char buf[size]; int ret = sqfs_readlink(fs, inode, buf, &size); - if (ret != 0) + if (ret != 0) { +#ifdef STANDALONE fprintf(stderr, "WARNING: Symlink error."); +#endif + } else { sqfs_err err = sqfs_inode_get(fs, inode, fs->sb.root_inode); - if (err != SQFS_OK) + if (err != SQFS_OK) { +#ifdef STANDALONE fprintf(stderr, "WARNING: Unable to get the root inode. Error: %d", err); +#endif + } bool found = false; err = sqfs_lookup_path(fs, inode, buf, &found); - if (err != SQFS_OK) + if (err != SQFS_OK) { +#ifdef STANDALONE fprintf(stderr, "WARNING: There was an error while trying to lookup a symblink. Error: %d", err); +#endif + } if (found) appimage_type2_extract_file_following_symlinks(fs, inode, target); @@ -1661,8 +1771,11 @@ void appimage_type2_extract_file (appimage_handler *handler, void *data, const c sqfs_traverse *trv = data; sqfs_inode inode; - if(sqfs_inode_get(fs, &inode, trv->entry.inode)) + if(sqfs_inode_get(fs, &inode, trv->entry.inode)) { +#ifdef STANDALONE fprintf(stderr, "sqfs_inode_get error\n"); +#endif + } appimage_type2_extract_file_following_symlinks(fs, &inode, target); } @@ -1682,7 +1795,9 @@ appimage_handler create_appimage_handler(const char *const path) { int appimage_type = appimage_get_type(path, 0); appimage_handler handler; +#ifdef STANDALONE fprintf(stderr,"AppImage type: %d\n", appimage_type); +#endif switch (appimage_type) { case 1: handler = appimage_type_1_create_handler(); @@ -1691,7 +1806,9 @@ appimage_handler create_appimage_handler(const char *const path) { handler = appimage_type_2_create_handler(); break; default: +#ifdef STANDALONE fprintf(stderr,"Appimage type %d not supported yet\n", appimage_type); +#endif handler.traverse = dummy_traverse_func; break; } @@ -1706,7 +1823,9 @@ void move_file(const char *source, const char *target) { GFile *icon_file = g_file_new_for_path(source); GFile *target_file = g_file_new_for_path(target); if (!g_file_move (icon_file, target_file, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error)) { +#ifdef STANDALONE fprintf(stderr, "Error moving file: %s\n", error->message); +#endif g_clear_error (&error); } @@ -1776,7 +1895,9 @@ void appimage_create_thumbnail(const gchar *appimage_file_path, gboolean verbose // clean up g_free(target_path); } else { +#ifdef STANDALONE fprintf(stderr, "ERROR: Icon file not extracted: %s", tmp_path); +#endif } } From 288ab7b97dc450602062f2676e980fc8828659be Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 24 Mar 2018 23:51:43 +0100 Subject: [PATCH 117/544] Fix line flip --- src/shared.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/shared.c b/src/shared.c index ff1d6fdee..0da0bb195 100644 --- a/src/shared.c +++ b/src/shared.c @@ -993,10 +993,9 @@ bool archive_copy_icons_recursively_to_destination(struct archive** a, const gch if ((fwrite(buff, size, 1, f) != size) || ferror(f) || feof(f)) { #ifdef STANDALONE - fprintf(stderr, "Failed to copy icon: %s\n", strerror(error)); int error = errno; + fprintf(stderr, "Failed to copy icon: %s\n", strerror(error)); #endif - errored = true; break; } From 5f430ef28a20dd30f0b3ee6ac9a7e0018f300332 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sun, 25 Mar 2018 03:22:33 +0200 Subject: [PATCH 118/544] Remove annoying debug message --- src/runtime.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index 4be893dab..1eb08db78 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -283,7 +283,6 @@ main (int argc, char *argv[]) sprintf(appimage_path, "/proc/self/exe"); } else { sprintf(appimage_path, "%s", getenv("TARGET_APPIMAGE")); - fprintf(stderr, "Using TARGET_APPIMAGE %s\n", appimage_path); } sprintf(argv0_path, argv[0]); From 9ee4abf303a6df1ff67cda3607aaaea5a8f20a40 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 27 Mar 2018 20:27:26 +0200 Subject: [PATCH 119/544] Test whether dirs returned by glib are correct --- tests/fixtures.h | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/tests/fixtures.h b/tests/fixtures.h index 173f62c3d..0a779d58c 100644 --- a/tests/fixtures.h +++ b/tests/fixtures.h @@ -25,23 +25,23 @@ class AppImageKitTest : public ::testing::Test { tempHome = tempDir + "/HOME"; + mkdir(tempHome.c_str(), 0700); + oldHome = getenv("HOME"); oldXdgDataHome = getenv("XDG_DATA_HOME"); oldXdgConfigHome = getenv("XDG_CONFIG_HOME"); - std::stringstream newHome; - newHome << "HOME=" << tempHome; - putenv(strdup(newHome.str().c_str())); - - std::stringstream newXdgDataHome; - newXdgDataHome << "XDG_DATA_HOME=" << tempHome << "/.local/share"; - putenv(strdup(newXdgDataHome.str().c_str())); + std::string newXdgDataHome = tempHome + "/.local/share"; + std::string newXdgConfigHome = tempHome + "/.config"; - std::stringstream newXdgConfigHome; - newXdgDataHome << "XDG_CONFIG_HOME=" << tempHome << "/.config"; - putenv(strdup(newXdgConfigHome.str().c_str())); + setenv("HOME", tempHome.c_str(), true); + setenv("XDG_DATA_HOME", newXdgDataHome.c_str(), true); + setenv("XDG_CONFIG_HOME", newXdgConfigHome.c_str(), true); - mkdir(tempHome.c_str(), 0700); + EXPECT_EQ(getenv("HOME"), tempHome); + EXPECT_EQ(tempHome, g_get_home_dir()); + EXPECT_EQ(newXdgDataHome, g_get_user_data_dir()); + EXPECT_EQ(newXdgConfigHome, g_get_user_config_dir()); }; ~AppImageKitTest() { @@ -50,25 +50,19 @@ class AppImageKitTest : public ::testing::Test { } if (oldHome != NULL) { - std::stringstream newHome; - newHome << "HOME=" << oldHome; - putenv(strdup(newHome.str().c_str())); + setenv("HOME", oldHome, true); } else { - unsetenv("XDG_DATA_HOME"); + unsetenv("HOME"); } if (oldXdgDataHome != NULL) { - std::stringstream newXdgDataHome; - newXdgDataHome << "XDG_DATA_HOME=" << oldXdgDataHome; - putenv(strdup(newXdgDataHome.str().c_str())); + setenv("XDG_DATA_HOME", oldXdgDataHome, true); } else { unsetenv("XDG_DATA_HOME"); } if (oldXdgConfigHome != NULL) { - std::stringstream newXdgConfigHome; - newXdgConfigHome << "XDG_CONFIG_HOME=" << oldXdgConfigHome; - putenv(strdup(newXdgConfigHome.str().c_str())); + setenv("XDG_CONFIG_HOME", oldXdgConfigHome, true); } else { unsetenv("XDG_CONFIG_HOME"); } From f03f055ca57b61649c9face6d2bb54420dda3c51 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 27 Mar 2018 20:29:04 +0200 Subject: [PATCH 120/544] Try to fix issues by resetting GLib caches --- tests/fixtures.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/fixtures.h b/tests/fixtures.h index 0a779d58c..36235d16f 100644 --- a/tests/fixtures.h +++ b/tests/fixtures.h @@ -38,6 +38,11 @@ class AppImageKitTest : public ::testing::Test { setenv("XDG_DATA_HOME", newXdgDataHome.c_str(), true); setenv("XDG_CONFIG_HOME", newXdgConfigHome.c_str(), true); + // reset GLib internal caches + // "might" leak memory, according to docs, hence nothing we could fix + // https://developer.gnome.org/glib/stable/glib-Miscellaneous-Utility-Functions.html#g-reload-user-special-dirs-cache + g_reload_user_special_dirs_cache(); + EXPECT_EQ(getenv("HOME"), tempHome); EXPECT_EQ(tempHome, g_get_home_dir()); EXPECT_EQ(newXdgDataHome, g_get_user_data_dir()); From 186b911494c956a33612369a525d4194dc3eebaf Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 28 Mar 2018 00:56:58 +0200 Subject: [PATCH 121/544] Mark CMake variables as advanced Helps preventing users from changing them accidentally. They're either not meant to be changed, or even dangerous to switch on. --- CMakeLists.txt | 2 ++ src/CMakeLists.txt | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6fd378024..7dde93f28 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,11 +36,13 @@ execute_process( # set version and build number set(VERSION 1-alpha) +mark_as_advanced(VERSION) if("$ENV{TRAVIS_BUILD_NUMBER}" STREQUAL "") set(BUILD_NUMBER "") else() set(BUILD_NUMBER "$ENV{TRAVIS_BUILD_NUMBER}") endif() +mark_as_advanced(BUILD_NUMBER) # get current date execute_process( diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 35a292fa5..0a3b7de76 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,7 +3,11 @@ find_package(Sanitizers) # set up build script # if set to anything but ON, the magic bytes won't be embedded +# CAUTION: the magic bytes are a hard requirement for type 2 AppImages! This option should NEVER be used unless you are +# 100% sure what you are doing here! set(APPIMAGEKIT_EMBED_MAGIC_BYTES ON CACHE BOOL "") +# mark as advanced so it won't show up in CMake GUIs etc., to prevent users from accidentally using this option +mark_as_advanced(APPIMAGEKIT_EMBED_MAGIC_BYTES) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/build-runtime.sh.in @@ -243,6 +247,7 @@ target_link_libraries(runtime-debug ) set(_RUNTIME_FLAGS -g -O0 -ffunction-sections -fdata-sections -s -Wl,--gc-sections -DGIT_COMMIT='${GIT_COMMIT}' -D_FILE_OFFSET_BITS=64) +mark_as_advanced(_RUNTIME_FLAGS) set_target_properties(runtime-debug PROPERTIES LINK_FLAGS "${_RUNTIME_FLAGS}") From 059b03102a3faacd36539fbd80bf32c6b8b12ecf Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 28 Mar 2018 17:19:52 +0200 Subject: [PATCH 122/544] Add xdg-basedir library replacing corresponding GLib calls Includes unit test. --- src/xdg-basedir/CMakeLists.txt | 14 +++ src/xdg-basedir/test-xdg-basedir.cpp | 166 +++++++++++++++++++++++++++ src/xdg-basedir/xdg-basedir.c | 67 +++++++++++ src/xdg-basedir/xdg-basedir.h | 33 ++++++ 4 files changed, 280 insertions(+) create mode 100644 src/xdg-basedir/CMakeLists.txt create mode 100644 src/xdg-basedir/test-xdg-basedir.cpp create mode 100644 src/xdg-basedir/xdg-basedir.c create mode 100644 src/xdg-basedir/xdg-basedir.h diff --git a/src/xdg-basedir/CMakeLists.txt b/src/xdg-basedir/CMakeLists.txt new file mode 100644 index 000000000..5f0f78e36 --- /dev/null +++ b/src/xdg-basedir/CMakeLists.txt @@ -0,0 +1,14 @@ +# target_include_libraries was introduced in version 3.0 +cmake_minimum_required(VERSION 3.0) + +include_directories(${gtest_INCLUDE_DIRS}) + +# force static linking +add_library(xdg-basedir STATIC xdg-basedir.h xdg-basedir.c) +target_include_directories(xdg-basedir PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +add_executable(test-xdg-basedir test-xdg-basedir.cpp) +target_link_libraries(test-xdg-basedir ${gtest_LIBRARIES} pthread xdg-basedir) +if(NOT USE_SYSTEM_GTEST) + add_dependencies(test-xdg-basedir gtest) +endif() diff --git a/src/xdg-basedir/test-xdg-basedir.cpp b/src/xdg-basedir/test-xdg-basedir.cpp new file mode 100644 index 000000000..4ca3647b5 --- /dev/null +++ b/src/xdg-basedir/test-xdg-basedir.cpp @@ -0,0 +1,166 @@ +// system headers +#include +#include + +// library headers +#include + +// local headers +#include "xdg-basedir.h" + +bool compareStrings(const char* str1, const char* str2) { + if (str1 == NULL || str2 == NULL) + return false; + + return strcmp(str1, str2) == 0; +} + +TEST(xdg_basedir_test, test_user_home_default_value) { + char* home = user_home(); + EXPECT_PRED2(compareStrings, home, getenv("HOME")); + free(home); +} + +TEST(xdg_basedir_test, test_user_home_custom_value) { + char* oldValue = strdup(getenv("HOME")); + setenv("HOME", "ABCDEFG", true); + + char* currentValue = user_home(); + EXPECT_PRED2(compareStrings, currentValue, getenv("HOME")); + EXPECT_PRED2(compareStrings, currentValue, "ABCDEFG"); + free(currentValue); + + setenv("HOME", oldValue, true); + free(oldValue); +} + +TEST(xdg_basedir_test, test_xdg_data_home_default_value) { + // make sure env var is not set, to force function to use default value + char* oldValue; + + if ((oldValue = getenv("XDG_DATA_HOME")) != NULL) { + unsetenv("XDG_DATA_HOME"); + } + + char* currentValue = xdg_data_home(); + + // too lazy to calculate size + char* expectedValue = static_cast(malloc(PATH_MAX)); + strcpy(expectedValue, getenv("HOME")); + strcat(expectedValue, "/.local/share"); + + EXPECT_PRED2(compareStrings, currentValue, expectedValue); + + free(expectedValue); + free(currentValue); + + if (oldValue != NULL) { + setenv("XDG_DATA_HOME", oldValue, true); + free(oldValue); + } +} + +TEST(xdg_basedir_test, test_xdg_data_home_custom_value) { + char* oldValue = getenv("XDG_DATA_HOME"); + setenv("XDG_DATA_HOME", "HIJKLM", true); + + char* currentValue = xdg_data_home(); + EXPECT_PRED2(compareStrings, currentValue, "HIJKLM"); + free(currentValue); + + if (oldValue != NULL) { + setenv("XDG_DATA_HOME", oldValue, true); + free(oldValue); + } else { + unsetenv("XDG_DATA_HOME"); + } +} + +TEST(xdg_basedir_test, test_xdg_config_home_default_value) { + // make sure env var is not set, to force function to use default value + char* oldValue; + + if ((oldValue = getenv("XDG_CONFIG_HOME")) != NULL) { + unsetenv("XDG_CONFIG_HOME"); + } + + char* currentValue = xdg_config_home(); + + // too lazy to calculate size + char* expectedValue = static_cast(malloc(PATH_MAX)); + strcpy(expectedValue, getenv("HOME")); + strcat(expectedValue, "/.config"); + + EXPECT_PRED2(compareStrings, currentValue, expectedValue); + + free(expectedValue); + free(currentValue); + + if (oldValue != NULL) { + setenv("XDG_CONFIG_HOME", oldValue, true); + free(oldValue); + } +} + +TEST(xdg_basedir_test, test_xdg_config_home_custom_value) { + char* oldValue = getenv("XDG_CONFIG_HOME"); + setenv("XDG_CONFIG_HOME", "NOPQRS", true); + + char* currentValue = xdg_config_home(); + EXPECT_PRED2(compareStrings, currentValue, "NOPQRS"); + free(currentValue); + + if (oldValue != NULL) { + setenv("XDG_CONFIG_HOME", oldValue, true); + free(oldValue); + } else { + unsetenv("XDG_CONFIG_HOME"); + } +} + +TEST(xdg_basedir_test, test_xdg_cache_home_default_value) { + // make sure env var is not set, to force function to use default value + char* oldValue; + + if ((oldValue = getenv("XDG_CACHE_HOME")) != NULL) { + unsetenv("XDG_CACHE_HOME"); + } + + char* currentValue = xdg_cache_home(); + + // too lazy to calculate size + char* expectedValue = static_cast(malloc(PATH_MAX)); + strcpy(expectedValue, getenv("HOME")); + strcat(expectedValue, "/.cache"); + + EXPECT_PRED2(compareStrings, currentValue, expectedValue); + + free(expectedValue); + free(currentValue); + + if (oldValue != NULL) { + setenv("XDG_CACHE_HOME", oldValue, true); + free(oldValue); + } +} + +TEST(xdg_basedir_test, test_xdg_cache_home_custom_value) { + char* oldValue = getenv("XDG_CACHE_HOME"); + setenv("XDG_CACHE_HOME", "TUVWXY", true); + + char* currentValue = xdg_cache_home(); + EXPECT_PRED2(compareStrings, currentValue, "TUVWXY"); + free(currentValue); + + if (oldValue != NULL) { + setenv("XDG_CACHE_HOME", oldValue, true); + free(oldValue); + } else { + unsetenv("XDG_CACHE_HOME"); + } +} + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/src/xdg-basedir/xdg-basedir.c b/src/xdg-basedir/xdg-basedir.c new file mode 100644 index 000000000..b985f07a0 --- /dev/null +++ b/src/xdg-basedir/xdg-basedir.c @@ -0,0 +1,67 @@ +#include "xdg-basedir.h" +#include +#include + +char* user_home() { + return strdup(getenv("HOME")); +} + +char* xdg_config_home() { + char* config_home; + + if ((config_home = getenv("XDG_CONFIG_HOME")) == NULL) { + char* home = user_home(); + static const char const* suffix = "/.config"; + + config_home = calloc(strlen(home) + strlen(suffix) + 1, sizeof(char)); + + strcpy(config_home, home); + strcat(config_home, suffix); + + free(home); + + return config_home; + } else { + return strdup(config_home); + } +} + +char* xdg_data_home() { + char* data_home; + + if ((data_home = getenv("XDG_DATA_HOME")) == NULL) { + char* home = user_home(); + static const char const* suffix = "/.local/share"; + + data_home = calloc(strlen(home) + strlen(suffix) + 1, sizeof(char)); + + strcpy(data_home, home); + strcat(data_home, suffix); + + free(home); + + return data_home; + } else { + return strdup(data_home); + } +} + +char* xdg_cache_home() { + char* cache_home; + + if ((cache_home = getenv("XDG_CACHE_HOME")) == NULL) { + char* home = user_home(); + static const char const* suffix = "/.cache"; + + cache_home = calloc(strlen(home) + strlen(suffix) + 1, sizeof(char)); + + strcpy(cache_home, home); + strcat(cache_home, suffix); + + free(home); + + return cache_home; + } else { + return strdup(cache_home); + } +} diff --git a/src/xdg-basedir/xdg-basedir.h b/src/xdg-basedir/xdg-basedir.h new file mode 100644 index 000000000..720cdb202 --- /dev/null +++ b/src/xdg-basedir/xdg-basedir.h @@ -0,0 +1,33 @@ +#ifndef XDG_BASEDIR_H +#define XDG_BASEDIR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Convenience wrapper. Result must be free'd. + */ +char* user_home(); + +/* + * + */ +char* xdg_config_home(); + +/* + * + */ +char* xdg_data_home(); + +/* + * + */ +char* xdg_cache_home(); + + +#ifdef __cplusplus +} +#endif + +#endif /* XDG_BASEDIR_H */ From 4664bb2d8537a9c535158d1fc76e13bcfc626d02 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 28 Mar 2018 18:04:49 +0200 Subject: [PATCH 123/544] Use xdg-basedir lib instead of GLib where applicable --- src/CMakeLists.txt | 9 +++++++++ src/shared.c | 30 ++++++++++++++++++++---------- tests/CMakeLists.txt | 3 +++ tests/fixtures.h | 17 +++++++++-------- tests/test_libappimage.cpp | 32 +++++++++++++++++++++----------- 5 files changed, 62 insertions(+), 29 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 35a292fa5..ad7756709 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -28,6 +28,10 @@ add_custom_command(OUTPUT data.o add_custom_target(runtime DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/runtime) +# include XDG basedir library +add_subdirectory(xdg-basedir) + + # allow setting different path for mksquashfs after installation set(AUXILIARY_FILES_DESTINATION "lib/appimagekit" CACHE STRING "Target install directory for mksquashfs") @@ -60,6 +64,7 @@ target_link_libraries(libappimage ${libarchive_LIBRARIES} ${inotify-tools_LIBRARIES} ${xz_LIBRARIES} + xdg-basedir PUBLIC pthread ${GLIB_LIBRARIES} @@ -108,6 +113,7 @@ target_link_libraries(libappimage_static ${libarchive_LIBRARIES} ${inotify-tools_LIBRARIES} ${xz_LIBRARIES} + xdg-basedir PUBLIC pthread ${GLIB_LIBRARIES} @@ -146,6 +152,7 @@ target_link_libraries(appimagetool pthread ${ZLIB_LIBRARIES} ${xz_LIBRARIES} + xdg-basedir ) target_compile_definitions(appimagetool @@ -181,6 +188,7 @@ target_link_libraries(appimaged ${xz_LIBRARIES} ${ZLIB_LIBRARIES} ${libarchive_LIBRARIES} + xdg-basedir ) target_compile_definitions(appimaged @@ -233,6 +241,7 @@ target_link_libraries(runtime-debug ${squashfuse_LIBRARIES} ${libarchive_LIBRARIES} ${xz_LIBRARIES} + xdg-basedir PUBLIC pthread ${GLIB_LIBRARIES} diff --git a/src/shared.c b/src/shared.c index 0da0bb195..5605fa1cb 100644 --- a/src/shared.c +++ b/src/shared.c @@ -46,6 +46,8 @@ #include "getsection.h" #include "elf.h" +#include "xdg-basedir.h" + // own header #include "shared.h" @@ -132,7 +134,9 @@ char *get_thumbnail_path(const char *path, char *thumbnail_size, gboolean verbos { char *md5 = appimage_get_md5(path); char *file = g_strconcat(md5, ".png", NULL); - gchar *thumbnail_path = g_build_filename(g_get_user_cache_dir(), "thumbnails", thumbnail_size, file, NULL); + char* cache_home = xdg_cache_home(); + gchar *thumbnail_path = g_build_filename(cache_home, "thumbnails", thumbnail_size, file, NULL); + g_free(cache_home); g_free(file); g_free(md5); return thumbnail_path; @@ -148,12 +152,14 @@ char *get_thumbnail_path(const char *path, char *thumbnail_size, gboolean verbos void move_icon_to_destination(gchar *icon_path, gboolean verbose) { // FIXME: This default location is most likely wrong, but at least the icons with unknown size can go somewhere - gchar *dest_dir = g_build_path("/", g_get_user_data_dir(), "/icons/hicolor/48x48/apps/", NULL); + char* data_home = xdg_data_home(); + gchar *dest_dir = g_build_path("/", data_home, "/icons/hicolor/48x48/apps/", NULL); if((g_str_has_suffix (icon_path, ".svg")) || (g_str_has_suffix (icon_path, ".svgz"))) { g_free(dest_dir); - dest_dir = g_build_path("/", g_get_user_data_dir(), "/icons/hicolor/scalable/apps/", NULL); + dest_dir = g_build_path("/", data_home, "/icons/hicolor/scalable/apps/", NULL); } + g_free(data_home); if((g_str_has_suffix (icon_path, ".png")) || (g_str_has_suffix (icon_path, ".xpm"))) { @@ -186,7 +192,7 @@ void move_icon_to_destination(gchar *icon_path, gboolean verbose) #endif } else { g_free(dest_dir); - dest_dir = g_build_path("/", g_get_user_data_dir(), "/icons/hicolor/", g_strdup_printf("%ix%i", w, h), "/apps/", NULL); + dest_dir = g_build_path("/", xdg_data_home(), "/icons/hicolor/", g_strdup_printf("%ix%i", w, h), "/apps/", NULL); } } if(verbose) @@ -364,7 +370,7 @@ gchar **squash_get_matching_files_install_icons_and_mime_data(sqfs* fs, char* pa gchar *dest = NULL; if(inode.base.inode_type == SQUASHFS_REG_TYPE) { if(g_str_has_prefix(trv.path, "usr/share/icons/") || g_str_has_prefix(trv.path, "usr/share/pixmaps/") || (g_str_has_prefix(trv.path, "usr/share/mime/") && g_str_has_suffix(trv.path, ".xml"))){ - gchar *path = replace_str(trv.path, "usr/share", g_get_user_data_dir()); + gchar *path = replace_str(trv.path, "usr/share", xdg_data_home()); char *dest_dirname = g_path_get_dirname(path); g_free(path); gchar *base_name = g_path_get_basename(trv.path); @@ -487,8 +493,9 @@ gchar *build_installed_desktop_file_path(gchar* md5, gchar* desktop_filename) { gchar *partial_path; partial_path = g_strdup_printf("applications/appimagekit_%s-%s", md5, desktop_filename); - gchar *destination; - destination = g_build_filename(g_get_user_data_dir(), partial_path, NULL); + char *data_home = xdg_data_home(); + gchar *destination = g_build_filename(data_home, partial_path, NULL); + g_free(data_home); g_free(partial_path); @@ -829,7 +836,7 @@ bool appimage_type1_get_desktop_filename_and_key_file(struct archive** a, gchar* break; } - *desktop_filename = g_strdup(g_path_get_basename(filename)); + *desktop_filename = g_path_get_basename(filename); // a structure that will hold the information from the desktop file *key_file = g_key_file_new(); @@ -896,7 +903,7 @@ bool archive_copy_icons_recursively_to_destination(struct archive** a, const gch || (g_str_has_prefix(filename, "usr/share/mime/") && g_str_has_suffix(filename, ".xml")) ) { - gchar* dest_path = replace_str(filename, "usr/share", g_get_user_data_dir()); + gchar* dest_path = replace_str(filename, "usr/share", xdg_data_home()); gchar* dest_dirname = g_path_get_dirname(dest_path); g_free(dest_path); @@ -1344,6 +1351,7 @@ bool appimage_is_registered_in_system(const char* path) { g_free(thumbnail_path); g_free(md5); g_free(desktop_filename); + g_free(desktop_file_path); g_key_file_free(key_file); return rv; @@ -1475,7 +1483,9 @@ int appimage_unregister_in_system(char *path, gboolean verbose) delete_thumbnail(path, "normal", verbose); // 128x128 delete_thumbnail(path, "large", verbose); // 256x256 - unregister_using_md5_id(g_get_user_data_dir(), 0, md5, verbose); + char* data_home = xdg_data_home(); + unregister_using_md5_id(data_home, 0, md5, verbose); + g_free(data_home); g_free(md5); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5120c57d4..743e02c4f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -17,6 +17,7 @@ if(BUILD_TESTING) target_link_libraries(test_libappimage pthread libappimage + xdg-basedir ${gtest_LIBRARIES} ) @@ -41,6 +42,7 @@ if(BUILD_TESTING) ${libarchive_LIBRARIES} ${inotify-tools_LIBRARIES} ${xz_LIBRARIES} + xdg-basedir pthread ${GLIB_LIBRARIES} ${GIO_LIBRARIES} @@ -85,6 +87,7 @@ if(BUILD_TESTING) ${libarchive_LIBRARIES} ${inotify-tools_LIBRARIES} ${xz_LIBRARIES} + xdg-basedir pthread ${GLIB_LIBRARIES} ${GIO_LIBRARIES} diff --git a/tests/fixtures.h b/tests/fixtures.h index 36235d16f..cd4e0a4cb 100644 --- a/tests/fixtures.h +++ b/tests/fixtures.h @@ -3,6 +3,7 @@ #include #include #include +#include // fixture providing a temporary directory, and a temporary home directory within that directory @@ -21,7 +22,7 @@ class AppImageKitTest : public ::testing::Test { AppImageKitTest() { char* tmpl = strdup("/tmp/AppImageKit-unit-tests-XXXXXX"); tempDir = mkdtemp(tmpl); - delete[] tmpl; + free(tmpl); tempHome = tempDir + "/HOME"; @@ -38,15 +39,15 @@ class AppImageKitTest : public ::testing::Test { setenv("XDG_DATA_HOME", newXdgDataHome.c_str(), true); setenv("XDG_CONFIG_HOME", newXdgConfigHome.c_str(), true); - // reset GLib internal caches - // "might" leak memory, according to docs, hence nothing we could fix - // https://developer.gnome.org/glib/stable/glib-Miscellaneous-Utility-Functions.html#g-reload-user-special-dirs-cache - g_reload_user_special_dirs_cache(); + char* xdgDataHome = xdg_data_home(); + char* xdgConfigHome = xdg_config_home(); EXPECT_EQ(getenv("HOME"), tempHome); - EXPECT_EQ(tempHome, g_get_home_dir()); - EXPECT_EQ(newXdgDataHome, g_get_user_data_dir()); - EXPECT_EQ(newXdgConfigHome, g_get_user_config_dir()); + EXPECT_EQ(newXdgDataHome, xdgDataHome); + EXPECT_EQ(newXdgConfigHome, xdgConfigHome); + + free(xdgDataHome); + free(xdgConfigHome); }; ~AppImageKitTest() { diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index a75b4749a..f7c7a71cc 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -35,20 +35,24 @@ namespace AppImageTests { gchar *sum = appimage_get_md5(path.c_str()); GDir *dir; - GError *error; - const gchar *filename; + GError *error = NULL; + const gchar *filename = NULL; - char *apps_path = g_strconcat(g_get_user_data_dir(), "/applications/", NULL); + char *data_home = xdg_data_home(); + char *apps_path = g_strconcat(data_home, "/applications/", NULL); + free(data_home); bool found = false; dir = g_dir_open(apps_path, 0, &error); - while ((filename = g_dir_read_name(dir))) { - gchar *m = g_strrstr(filename, sum); - - if (m != NULL) - found = true; + if (dir != NULL) { + while ((filename = g_dir_read_name(dir))) { + gchar* m = g_strrstr(filename, sum); + + if (m != NULL) + found = true; + } + g_dir_close(dir); } - g_dir_close(dir); g_free(apps_path); g_free(sum); return found; @@ -127,10 +131,13 @@ namespace AppImageTests { appimage_create_thumbnail(appImage_type_1_file_path.c_str()); gchar *sum = appimage_get_md5(appImage_type_1_file_path.c_str()); - std::string path = std::string(g_get_user_cache_dir()) + + char *cache_home = xdg_cache_home(); + std::string path = std::string(cache_home) + "/thumbnails/normal/" + std::string(sum) + ".png"; + g_free(cache_home); g_free(sum); ASSERT_TRUE(g_file_test(path.c_str(), G_FILE_TEST_EXISTS)); @@ -143,10 +150,13 @@ namespace AppImageTests { appimage_create_thumbnail(appImage_type_2_file_path.c_str()); gchar *sum = appimage_get_md5(appImage_type_2_file_path.c_str()); - std::string path = std::string(g_get_user_cache_dir()) + + char* cache_home = xdg_cache_home(); + std::string path = std::string(cache_home) + "/thumbnails/normal/" + std::string(sum) + ".png"; + g_free(cache_home); g_free(sum); ASSERT_TRUE(g_file_test(path.c_str(), G_FILE_TEST_EXISTS)); From fbe7f2a72849d56775f753d9c42af265044fc96a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 28 Mar 2018 19:01:32 +0200 Subject: [PATCH 124/544] Fix remaining call in appimaged --- src/appimaged.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/appimaged.c b/src/appimaged.c index dc63ab443..de2fcf951 100644 --- a/src/appimaged.c +++ b/src/appimaged.c @@ -256,7 +256,9 @@ int main(int argc, char ** argv) { gchar *global_autostart_file = "/etc/xdg/autostart/appimaged.desktop"; gchar *global_systemd_file = "/usr/lib/systemd/user/appimaged.service"; gchar *partial_path = g_strdup_printf("autostart/appimagekit-appimaged.desktop"); - gchar *destination = g_build_filename(g_get_user_config_dir(), partial_path, NULL); + char* config_home = xdg_config_home(); + gchar *destination = g_build_filename(config_home, partial_path, NULL); + free(config_home); if(uninstall){ if(g_file_test (installed_appimaged_location, G_FILE_TEST_EXISTS)) From b51c174ebed08cc4f30b0962b2d5209410227cab Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 28 Mar 2018 19:41:07 +0200 Subject: [PATCH 125/544] Fix doc strings --- src/xdg-basedir/xdg-basedir.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/xdg-basedir/xdg-basedir.h b/src/xdg-basedir/xdg-basedir.h index 720cdb202..17c5659f5 100644 --- a/src/xdg-basedir/xdg-basedir.h +++ b/src/xdg-basedir/xdg-basedir.h @@ -6,22 +6,29 @@ extern "C" { #endif /* - * Convenience wrapper. Result must be free'd. + * Get user's home directory. Convenience wrapper for getenv("HOME"). + * Returns a freshly allocated char array that must be free'd after usage. */ char* user_home(); /* - * + * Get XDG config home directory using $XDG_CONFIG_HOME environment variable. + * Falls back to default value ~/.config if environment variable is not set. + * Returns a freshly allocated char array that must be free'd after usage. */ char* xdg_config_home(); /* - * + * Get XDG data home directory using $XDG_DATA_HOME environment variable. + * Falls back to default value ~/.local/share if environment variable is not set. + * Returns a freshly allocated char array that must be free'd after usage. */ char* xdg_data_home(); /* - * + * Get XDG cache home directory using $XDG_CACHE_HOME environment variable. + * Falls back to default value ~/.cache if environment variable is not set. + * Returns a freshly allocated char array that must be free'd after usage. */ char* xdg_cache_home(); From 4da07b1a337a3ceef45a1a897d6c7dffe30d67fb Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 28 Mar 2018 19:44:04 +0200 Subject: [PATCH 126/544] Improve readability --- src/xdg-basedir/xdg-basedir.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/xdg-basedir/xdg-basedir.c b/src/xdg-basedir/xdg-basedir.c index b985f07a0..c154c763c 100644 --- a/src/xdg-basedir/xdg-basedir.c +++ b/src/xdg-basedir/xdg-basedir.c @@ -7,9 +7,9 @@ char* user_home() { } char* xdg_config_home() { - char* config_home; + char* config_home = getenv("XDG_CONFIG_HOME"); - if ((config_home = getenv("XDG_CONFIG_HOME")) == NULL) { + if (config_home == NULL) { char* home = user_home(); static const char const* suffix = "/.config"; @@ -27,9 +27,9 @@ char* xdg_config_home() { } char* xdg_data_home() { - char* data_home; + char* data_home = getenv("XDG_DATA_HOME"); - if ((data_home = getenv("XDG_DATA_HOME")) == NULL) { + if (data_home == NULL) { char* home = user_home(); static const char const* suffix = "/.local/share"; @@ -47,9 +47,9 @@ char* xdg_data_home() { } char* xdg_cache_home() { - char* cache_home; + char* cache_home = getenv("XDG_CACHE_HOME"); - if ((cache_home = getenv("XDG_CACHE_HOME")) == NULL) { + if (cache_home == NULL) { char* home = user_home(); static const char const* suffix = "/.cache"; From 9646b53e2a892dd6fdd227ad97b2452263413580 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 28 Mar 2018 19:46:19 +0200 Subject: [PATCH 127/544] Fix remaining mem leaks --- src/shared.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/shared.c b/src/shared.c index 5605fa1cb..be11ae871 100644 --- a/src/shared.c +++ b/src/shared.c @@ -192,7 +192,9 @@ void move_icon_to_destination(gchar *icon_path, gboolean verbose) #endif } else { g_free(dest_dir); - dest_dir = g_build_path("/", xdg_data_home(), "/icons/hicolor/", g_strdup_printf("%ix%i", w, h), "/apps/", NULL); + char* data_home = xdg_data_home(); + dest_dir = g_build_path("/", data_home, "/icons/hicolor/", g_strdup_printf("%ix%i", w, h), "/apps/", NULL); + free(data_home); } } if(verbose) @@ -370,7 +372,9 @@ gchar **squash_get_matching_files_install_icons_and_mime_data(sqfs* fs, char* pa gchar *dest = NULL; if(inode.base.inode_type == SQUASHFS_REG_TYPE) { if(g_str_has_prefix(trv.path, "usr/share/icons/") || g_str_has_prefix(trv.path, "usr/share/pixmaps/") || (g_str_has_prefix(trv.path, "usr/share/mime/") && g_str_has_suffix(trv.path, ".xml"))){ - gchar *path = replace_str(trv.path, "usr/share", xdg_data_home()); + char* data_home = xdg_data_home(); + gchar *path = replace_str(trv.path, "usr/share", data_home); + free(data_home); char *dest_dirname = g_path_get_dirname(path); g_free(path); gchar *base_name = g_path_get_basename(trv.path); From f42279f3ad50c02bceaff2c5c42b3f1218ae96be Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 28 Mar 2018 21:50:08 +0200 Subject: [PATCH 128/544] Get desktop file path when registering an AppImage --- include/appimage/appimage.h | 19 +++++++++++ src/appimaged.c | 16 ++++++--- src/shared.c | 56 ++++++++++++++++++++---------- src/shared.h | 11 +++--- tests/test_libappimage.cpp | 68 ++++++++++++++++++++++++++++++++++++- 5 files changed, 143 insertions(+), 27 deletions(-) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index 263b255af..fb146ac3c 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -12,19 +12,38 @@ char *appimage_get_md5(char const* path); /* Check if a file is an AppImage. Returns the image type if it is, or -1 if it isn't */ int appimage_get_type(const char* path, bool verbose); +/* + * Checks whether an AppImage is registered in system by checking whether the files have been copied to the right locations + */ bool appimage_is_registered_in_system(const char* path); /* Register a type 1 AppImage in the system */ bool appimage_type1_register_in_system(const char *path, bool verbose); +/* + * Register a type 1 AppImage in the system + * desktop_file_path will be set to the path of the integrated desktop file, unless it is NULL. + */ +bool appimage_type1_register_in_system_get_desktop_file_path(const char *path, bool verbose, char **desktop_file_path); /* Register a type 2 AppImage in the system */ bool appimage_type2_register_in_system(const char *path, bool verbose); +/* + * Register a type 2 AppImage in the system + * desktop_file_path will be set to the path of the integrated desktop file, unless it is NULL. + */ +bool appimage_type2_register_in_system_get_desktop_file_path(const char *path, bool verbose, char **desktop_file_path); /* * Register an AppImage in the system * Returns 0 on success, non-0 otherwise. */ int appimage_register_in_system(const char *path, bool verbose); +/* + * Register an AppImage in the system + * Set app_for_removal to add a [Desktop Action] for removing the AppImage using that executable. + * desktop_file_path will be set to the path of the integrated desktop file, unless it is NULL. + */ +int appimage_register_in_system_get_desktop_file_path(const char *path, bool verbose, char **desktop_file_path); /* Unregister an AppImage in the system */ int appimage_unregister_in_system(const char *path, bool verbose); diff --git a/src/appimaged.c b/src/appimaged.c index de2fcf951..ab187444e 100644 --- a/src/appimaged.c +++ b/src/appimaged.c @@ -249,7 +249,10 @@ int main(int argc, char ** argv) { exit(1); } - gchar *user_bin_dir = g_build_filename(g_get_home_dir(), "/.local/bin", NULL); + char* home_dir = user_home(); + gchar *user_bin_dir = g_build_filename(home_dir, "/.local/bin", NULL); + free(home_dir); + gchar *installed_appimaged_location = g_build_filename(user_bin_dir, "appimaged", NULL); const gchar *appimage_location = g_getenv("APPIMAGE"); gchar *own_desktop_file_location = g_build_filename(g_getenv("APPDIR"), "/appimaged.desktop", NULL); @@ -320,11 +323,16 @@ int main(int argc, char ** argv) { } } + add_dir_to_watch(user_bin_dir); add_dir_to_watch(g_get_user_special_dir(G_USER_DIRECTORY_DOWNLOAD)); - add_dir_to_watch(g_build_filename(g_get_home_dir(), "/bin", NULL)); - add_dir_to_watch(g_build_filename(g_get_home_dir(), "/.bin", NULL)); - add_dir_to_watch(g_build_filename(g_get_home_dir(), "/Applications", NULL)); + + char* home_dir = user_home(); + add_dir_to_watch(g_build_filename(home_dir, "/bin", NULL)); + add_dir_to_watch(g_build_filename(home_dir, "/.bin", NULL)); + add_dir_to_watch(g_build_filename(home_dir, "/Applications", NULL)); + free(home_dir); + add_dir_to_watch(g_build_filename("/Applications", NULL)); // Perhaps we should determine the following dynamically using something like // mount | grep -i iso | head -n 1 | cut -d ' ' -f 3 diff --git a/src/shared.c b/src/shared.c index be11ae871..d7d593af1 100644 --- a/src/shared.c +++ b/src/shared.c @@ -507,7 +507,7 @@ gchar *build_installed_desktop_file_path(gchar* md5, gchar* desktop_filename) { } /* Write a modified desktop file to disk that points to the AppImage */ -bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimage_path, gchar* desktop_filename, int appimage_type, char *md5, gboolean verbose){ +bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimage_path, gchar* desktop_filename, int appimage_type, char *md5, gboolean verbose, char **desktop_file_path) { if(!g_key_file_has_key(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL)){ #ifdef STANDALONE fprintf(stderr, "Desktop file has no Exec key\n"); @@ -783,6 +783,11 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag /* GNOME shows the icon and name on the desktop file only if it is executable */ chmod(destination, 0755); + // set desktop_file_path if possible + if (desktop_file_path != NULL) { + *desktop_file_path = strdup(destination); + } + g_free(destination); return true; @@ -1034,7 +1039,7 @@ bool archive_copy_icons_recursively_to_destination(struct archive** a, const gch } /* Register a type 1 AppImage in the system */ -bool appimage_type1_register_in_system(const char *path, gboolean verbose) +bool appimage_type1_register_in_system_get_desktop_file_path(const char *path, gboolean verbose, char **desktop_file_path) { #ifdef STANDALONE fprintf(stderr, "ISO9660 based type 1 AppImage\n"); @@ -1083,7 +1088,7 @@ bool appimage_type1_register_in_system(const char *path, gboolean verbose) if (verbose) fprintf(stderr, "desktop_icon_value_original: %s\n", desktop_icon_value_original); - if (!write_edited_desktop_file(key_file, path, desktop_filename, 1, md5, verbose)) { + if (!write_edited_desktop_file(key_file, path, desktop_filename, 1, md5, verbose, desktop_file_path)) { #ifdef STANDALONE fprintf(stderr, "Failed to install desktop file\n"); #endif @@ -1124,6 +1129,10 @@ bool appimage_type1_register_in_system(const char *path, gboolean verbose) return !errored; } +bool appimage_type1_register_in_system(const char* path, gboolean verbose) { + return appimage_type1_register_in_system_get_desktop_file_path(path, verbose, NULL); +} + bool appimage_type2_get_desktop_filename_and_key_file(sqfs* fs, gchar** desktop_filename, gchar* md5, GKeyFile** key_file, gboolean verbose) { /* TOOO: Change so that only one run of squash_get_matching_files is needed in total, * this should hopefully improve performance */ @@ -1154,7 +1163,7 @@ bool appimage_type2_get_desktop_filename_and_key_file(sqfs* fs, gchar** desktop_ } /* Register a type 2 AppImage in the system */ -bool appimage_type2_register_in_system(char *path, gboolean verbose) { +bool appimage_type2_register_in_system_get_desktop_file_path(const char* path, gboolean verbose, char** desktop_file_path) { #ifdef STANDALONE fprintf(stderr, "squashfs based type 2 AppImage\n"); #endif @@ -1203,7 +1212,7 @@ bool appimage_type2_register_in_system(char *path, gboolean verbose) { } else { if (verbose) fprintf(stderr, "desktop_icon_value_original: %s\n", desktop_icon_value_original); - if (!write_edited_desktop_file(key_file, path, desktop_filename, 2, md5, verbose)) { + if (!write_edited_desktop_file(key_file, path, desktop_filename, 2, md5, verbose, desktop_file_path)) { #ifdef STANDALONE fprintf(stderr, "Failed to install desktop file\n"); #endif @@ -1235,6 +1244,10 @@ bool appimage_type2_register_in_system(char *path, gboolean verbose) { return TRUE; } +bool appimage_type2_register_in_system(const char* path, gboolean verbose) { + return appimage_type2_register_in_system_get_desktop_file_path(path, verbose, NULL); +} + /* Check whether AppImage is registered in the system already */ bool appimage_is_registered_in_system(const char* path) { // there's two criteria whether an AppImage has been registered in the system: @@ -1364,8 +1377,9 @@ bool appimage_is_registered_in_system(const char* path) { /* * Register an AppImage in the system * Returns 0 on success, non-0 otherwise. + * Set app_for_removal to add a [Desktop Action] for removing the AppImage using that executable. */ -int appimage_register_in_system(char *path, gboolean verbose) +int appimage_register_in_system_get_desktop_file_path(const char* path, gboolean verbose, const char* get_desktop_file_path) { if((g_str_has_suffix(path, ".part")) || g_str_has_suffix(path, ".tmp") || @@ -1391,10 +1405,12 @@ int appimage_register_in_system(char *path, gboolean verbose) switch (type) { case 1: - appimage_type1_register_in_system(path, verbose); + if (!appimage_type1_register_in_system_get_desktop_file_path(path, verbose, get_desktop_file_path)) + return 1; break; case 2: - appimage_type2_register_in_system(path, verbose); + if (!appimage_type2_register_in_system_get_desktop_file_path(path, verbose, get_desktop_file_path)) + return 1; break; default: #ifdef STANDALONE @@ -1403,19 +1419,17 @@ int appimage_register_in_system(char *path, gboolean verbose) return 1; } - if (type == 1) { - if (!appimage_type1_register_in_system(path, verbose)) - return 1; - } - - if (type == 2) { - if (!appimage_type2_register_in_system(path, verbose)) - return 1; - } - return 0; } +/* + * Register an AppImage in the system + * Returns 0 on success, non-0 otherwise. + */ +int appimage_register_in_system(char* path, gboolean verbose) { + return appimage_register_in_system_get_desktop_file_path(path, verbose, NULL); +} + /* Delete the thumbnail for a given file and size if it exists */ void delete_thumbnail(char *path, char *size, gboolean verbose) { @@ -1529,15 +1543,21 @@ void dummy_traverse_func(appimage_handler *handler, traverse_cb command, void *d (void) command; (void) data; +#ifdef STANDALONE fprintf(stderr, "Called %s\n", __FUNCTION__); +#endif } char* dummy_get_file_name (appimage_handler *handler, void *data) { +#ifdef STANDALONE fprintf(stderr, "Called %s\n", __FUNCTION__); +#endif } void dummy_extract_file(struct appimage_handler *handler, void *data, char *target) { +#ifdef STANDALONE fprintf(stderr, "Called %s\n", __FUNCTION__); +#endif } /* diff --git a/src/shared.h b/src/shared.h index c594436d2..03fa64b38 100644 --- a/src/shared.h +++ b/src/shared.h @@ -88,12 +88,15 @@ int appimage_register_in_system(char* path, gboolean verbose); void appimage_create_thumbnail(const gchar* appimage_file_path, gboolean verbose); -bool appimage_type2_register_in_system(char* path, gboolean verbose); +bool appimage_type2_register_in_system_get_desktop_file_path(const char* path, gboolean verbose, char** desktop_file_path); + +bool appimage_type2_register_in_system(const char* path, gboolean verbose); + +bool appimage_type1_register_in_system_get_desktop_file_path(const char* path, gboolean verbose, char** desktop_file_path); bool appimage_type1_register_in_system(const char* path, gboolean verbose); -bool write_edited_desktop_file(GKeyFile* key_file_structure, const char* appimage_path, gchar* desktop_filename, - int appimage_type, char* md5, gboolean verbose); +bool write_edited_desktop_file(GKeyFile* key_file_structure, const char* appimage_path, gchar* desktop_filename, int appimage_type, char* md5, gboolean verbose, char** desktop_file_path); gboolean g_key_file_load_from_squash(sqfs* fs, char* path, GKeyFile* key_file_structure, gboolean verbose); @@ -117,4 +120,4 @@ void set_executable(const char* path, gboolean verbose); extern char* vendorprefix; -char** appimage_list_files(const char* path); \ No newline at end of file +char** appimage_list_files(const char* path); diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index f7c7a71cc..986bc91db 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -1,5 +1,6 @@ #include "appimage/appimage.h" +#include #include #include @@ -16,7 +17,6 @@ namespace AppImageTests { - class LibAppImageTest : public AppImageKitTest { protected: std::string appImage_type_1_file_path; @@ -57,6 +57,10 @@ namespace AppImageTests { g_free(sum); return found; } + + static bool compareStrings(const char* str1, const char* str2) { + return strcmp(str1, str2) == 0; + } }; TEST_F(LibAppImageTest, appimage_get_type_invalid) { @@ -87,6 +91,22 @@ namespace AppImageTests { appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); } + TEST_F(LibAppImageTest, appimage_register_in_system_with_type1_get_desktop_file_path) { + ASSERT_EQ(appimage_register_in_system(appImage_type_1_file_path.c_str(), false), 0); + + ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_1_file_path)); + + appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); + } + + TEST_F(LibAppImageTest, appimage_register_in_system_with_type2_get_desktop_file_path) { + ASSERT_EQ(appimage_register_in_system(appImage_type_2_file_path.c_str(), false), 0); + + ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_2_file_path)); + + appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); + } + TEST_F(LibAppImageTest, appimage_type1_register_in_system) { ASSERT_TRUE(appimage_type1_register_in_system(appImage_type_1_file_path.c_str(), false)); @@ -102,6 +122,52 @@ namespace AppImageTests { appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); } + TEST_F(LibAppImageTest, appimage_type1_register_in_system_get_desktop_file_path) { + char* desktop_file_path = NULL; + EXPECT_TRUE(appimage_type1_register_in_system_get_desktop_file_path(appImage_type_1_file_path.c_str(), false, &desktop_file_path)); + EXPECT_TRUE(desktop_file_path != NULL); + + glob_t pglob; + + char* data_home = xdg_data_home(); + std::string dirPath = std::string(data_home) + "/applications/*.desktop"; + free(data_home); + + EXPECT_EQ(glob(dirPath.c_str(), GLOB_NOSORT, NULL, &pglob), 0); + EXPECT_EQ(pglob.gl_pathc, 1); + + if (pglob.gl_pathc >= 1) { + EXPECT_PRED2(compareStrings, pglob.gl_pathv[0], desktop_file_path); + } + + globfree(&pglob); + + appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); +} + + TEST_F(LibAppImageTest, appimage_type2_register_in_system_get_desktop_file_path) { + char* desktop_file_path = NULL; + EXPECT_TRUE(appimage_type2_register_in_system_get_desktop_file_path(appImage_type_2_file_path.c_str(), false, &desktop_file_path)); + EXPECT_TRUE(desktop_file_path != NULL); + + glob_t pglob; + + char* data_home = xdg_data_home(); + std::string dirPath = std::string(data_home) + "/applications/*.desktop"; + free(data_home); + + EXPECT_EQ(glob(dirPath.c_str(), GLOB_NOSORT, NULL, &pglob), 0); + EXPECT_EQ(pglob.gl_pathc, 1); + + if (pglob.gl_pathc >= 1) { + EXPECT_PRED2(compareStrings, pglob.gl_pathv[0], desktop_file_path); + } + + globfree(&pglob); + + appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); + } + TEST_F(LibAppImageTest, appimage_unregister_in_system) { ASSERT_FALSE(areIntegrationFilesDeployed(appImage_type_1_file_path)); ASSERT_FALSE(areIntegrationFilesDeployed(appImage_type_2_file_path)); From 44831b437316f7ecaadd2d7c664ec5977e5cfd3f Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 28 Mar 2018 22:05:19 +0200 Subject: [PATCH 129/544] Fix build errors --- src/appimaged.c | 21 +++++++++++++-------- tests/test_shared.cpp | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/appimaged.c b/src/appimaged.c index ab187444e..794f35421 100644 --- a/src/appimaged.c +++ b/src/appimaged.c @@ -249,9 +249,12 @@ int main(int argc, char ** argv) { exit(1); } - char* home_dir = user_home(); - gchar *user_bin_dir = g_build_filename(home_dir, "/.local/bin", NULL); - free(home_dir); + gchar *user_bin_dir; + { + char* home_dir = user_home(); + user_bin_dir = g_build_filename(home_dir, "/.local/bin", NULL); + free(home_dir); + } gchar *installed_appimaged_location = g_build_filename(user_bin_dir, "appimaged", NULL); const gchar *appimage_location = g_getenv("APPIMAGE"); @@ -327,11 +330,13 @@ int main(int argc, char ** argv) { add_dir_to_watch(user_bin_dir); add_dir_to_watch(g_get_user_special_dir(G_USER_DIRECTORY_DOWNLOAD)); - char* home_dir = user_home(); - add_dir_to_watch(g_build_filename(home_dir, "/bin", NULL)); - add_dir_to_watch(g_build_filename(home_dir, "/.bin", NULL)); - add_dir_to_watch(g_build_filename(home_dir, "/Applications", NULL)); - free(home_dir); + { + char* home_dir = user_home(); + add_dir_to_watch(g_build_filename(home_dir, "/bin", NULL)); + add_dir_to_watch(g_build_filename(home_dir, "/.bin", NULL)); + add_dir_to_watch(g_build_filename(home_dir, "/Applications", NULL)); + free(home_dir); + } add_dir_to_watch(g_build_filename("/Applications", NULL)); // Perhaps we should determine the following dynamically using something like diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index ea5377bf3..bc0f75d10 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -38,7 +38,7 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { gboolean success = g_key_file_load_from_data(keyFile, buffer.data(), buffer.size(), G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, NULL); if (success) { - write_edited_desktop_file(keyFile, "testpath", strdup("abc"), 1, strdup("def"), false); + write_edited_desktop_file(keyFile, "testpath", strdup("abc"), 1, strdup("def"), false, NULL); } g_key_file_free(keyFile); From 70bab82ff369722b51c318f140cb705ac0872d77 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 28 Mar 2018 22:16:23 +0200 Subject: [PATCH 130/544] Revert "Get desktop file path when registering an AppImage" --- include/appimage/appimage.h | 19 ----------- src/appimaged.c | 21 +++--------- src/shared.c | 56 ++++++++++-------------------- src/shared.h | 11 +++--- tests/test_libappimage.cpp | 68 +------------------------------------ tests/test_shared.cpp | 2 +- 6 files changed, 28 insertions(+), 149 deletions(-) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index fb146ac3c..263b255af 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -12,38 +12,19 @@ char *appimage_get_md5(char const* path); /* Check if a file is an AppImage. Returns the image type if it is, or -1 if it isn't */ int appimage_get_type(const char* path, bool verbose); -/* - * Checks whether an AppImage is registered in system by checking whether the files have been copied to the right locations - */ bool appimage_is_registered_in_system(const char* path); /* Register a type 1 AppImage in the system */ bool appimage_type1_register_in_system(const char *path, bool verbose); -/* - * Register a type 1 AppImage in the system - * desktop_file_path will be set to the path of the integrated desktop file, unless it is NULL. - */ -bool appimage_type1_register_in_system_get_desktop_file_path(const char *path, bool verbose, char **desktop_file_path); /* Register a type 2 AppImage in the system */ bool appimage_type2_register_in_system(const char *path, bool verbose); -/* - * Register a type 2 AppImage in the system - * desktop_file_path will be set to the path of the integrated desktop file, unless it is NULL. - */ -bool appimage_type2_register_in_system_get_desktop_file_path(const char *path, bool verbose, char **desktop_file_path); /* * Register an AppImage in the system * Returns 0 on success, non-0 otherwise. */ int appimage_register_in_system(const char *path, bool verbose); -/* - * Register an AppImage in the system - * Set app_for_removal to add a [Desktop Action] for removing the AppImage using that executable. - * desktop_file_path will be set to the path of the integrated desktop file, unless it is NULL. - */ -int appimage_register_in_system_get_desktop_file_path(const char *path, bool verbose, char **desktop_file_path); /* Unregister an AppImage in the system */ int appimage_unregister_in_system(const char *path, bool verbose); diff --git a/src/appimaged.c b/src/appimaged.c index 794f35421..de2fcf951 100644 --- a/src/appimaged.c +++ b/src/appimaged.c @@ -249,13 +249,7 @@ int main(int argc, char ** argv) { exit(1); } - gchar *user_bin_dir; - { - char* home_dir = user_home(); - user_bin_dir = g_build_filename(home_dir, "/.local/bin", NULL); - free(home_dir); - } - + gchar *user_bin_dir = g_build_filename(g_get_home_dir(), "/.local/bin", NULL); gchar *installed_appimaged_location = g_build_filename(user_bin_dir, "appimaged", NULL); const gchar *appimage_location = g_getenv("APPIMAGE"); gchar *own_desktop_file_location = g_build_filename(g_getenv("APPDIR"), "/appimaged.desktop", NULL); @@ -326,18 +320,11 @@ int main(int argc, char ** argv) { } } - add_dir_to_watch(user_bin_dir); add_dir_to_watch(g_get_user_special_dir(G_USER_DIRECTORY_DOWNLOAD)); - - { - char* home_dir = user_home(); - add_dir_to_watch(g_build_filename(home_dir, "/bin", NULL)); - add_dir_to_watch(g_build_filename(home_dir, "/.bin", NULL)); - add_dir_to_watch(g_build_filename(home_dir, "/Applications", NULL)); - free(home_dir); - } - + add_dir_to_watch(g_build_filename(g_get_home_dir(), "/bin", NULL)); + add_dir_to_watch(g_build_filename(g_get_home_dir(), "/.bin", NULL)); + add_dir_to_watch(g_build_filename(g_get_home_dir(), "/Applications", NULL)); add_dir_to_watch(g_build_filename("/Applications", NULL)); // Perhaps we should determine the following dynamically using something like // mount | grep -i iso | head -n 1 | cut -d ' ' -f 3 diff --git a/src/shared.c b/src/shared.c index d7d593af1..be11ae871 100644 --- a/src/shared.c +++ b/src/shared.c @@ -507,7 +507,7 @@ gchar *build_installed_desktop_file_path(gchar* md5, gchar* desktop_filename) { } /* Write a modified desktop file to disk that points to the AppImage */ -bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimage_path, gchar* desktop_filename, int appimage_type, char *md5, gboolean verbose, char **desktop_file_path) { +bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimage_path, gchar* desktop_filename, int appimage_type, char *md5, gboolean verbose){ if(!g_key_file_has_key(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL)){ #ifdef STANDALONE fprintf(stderr, "Desktop file has no Exec key\n"); @@ -783,11 +783,6 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag /* GNOME shows the icon and name on the desktop file only if it is executable */ chmod(destination, 0755); - // set desktop_file_path if possible - if (desktop_file_path != NULL) { - *desktop_file_path = strdup(destination); - } - g_free(destination); return true; @@ -1039,7 +1034,7 @@ bool archive_copy_icons_recursively_to_destination(struct archive** a, const gch } /* Register a type 1 AppImage in the system */ -bool appimage_type1_register_in_system_get_desktop_file_path(const char *path, gboolean verbose, char **desktop_file_path) +bool appimage_type1_register_in_system(const char *path, gboolean verbose) { #ifdef STANDALONE fprintf(stderr, "ISO9660 based type 1 AppImage\n"); @@ -1088,7 +1083,7 @@ bool appimage_type1_register_in_system_get_desktop_file_path(const char *path, g if (verbose) fprintf(stderr, "desktop_icon_value_original: %s\n", desktop_icon_value_original); - if (!write_edited_desktop_file(key_file, path, desktop_filename, 1, md5, verbose, desktop_file_path)) { + if (!write_edited_desktop_file(key_file, path, desktop_filename, 1, md5, verbose)) { #ifdef STANDALONE fprintf(stderr, "Failed to install desktop file\n"); #endif @@ -1129,10 +1124,6 @@ bool appimage_type1_register_in_system_get_desktop_file_path(const char *path, g return !errored; } -bool appimage_type1_register_in_system(const char* path, gboolean verbose) { - return appimage_type1_register_in_system_get_desktop_file_path(path, verbose, NULL); -} - bool appimage_type2_get_desktop_filename_and_key_file(sqfs* fs, gchar** desktop_filename, gchar* md5, GKeyFile** key_file, gboolean verbose) { /* TOOO: Change so that only one run of squash_get_matching_files is needed in total, * this should hopefully improve performance */ @@ -1163,7 +1154,7 @@ bool appimage_type2_get_desktop_filename_and_key_file(sqfs* fs, gchar** desktop_ } /* Register a type 2 AppImage in the system */ -bool appimage_type2_register_in_system_get_desktop_file_path(const char* path, gboolean verbose, char** desktop_file_path) { +bool appimage_type2_register_in_system(char *path, gboolean verbose) { #ifdef STANDALONE fprintf(stderr, "squashfs based type 2 AppImage\n"); #endif @@ -1212,7 +1203,7 @@ bool appimage_type2_register_in_system_get_desktop_file_path(const char* path, g } else { if (verbose) fprintf(stderr, "desktop_icon_value_original: %s\n", desktop_icon_value_original); - if (!write_edited_desktop_file(key_file, path, desktop_filename, 2, md5, verbose, desktop_file_path)) { + if (!write_edited_desktop_file(key_file, path, desktop_filename, 2, md5, verbose)) { #ifdef STANDALONE fprintf(stderr, "Failed to install desktop file\n"); #endif @@ -1244,10 +1235,6 @@ bool appimage_type2_register_in_system_get_desktop_file_path(const char* path, g return TRUE; } -bool appimage_type2_register_in_system(const char* path, gboolean verbose) { - return appimage_type2_register_in_system_get_desktop_file_path(path, verbose, NULL); -} - /* Check whether AppImage is registered in the system already */ bool appimage_is_registered_in_system(const char* path) { // there's two criteria whether an AppImage has been registered in the system: @@ -1377,9 +1364,8 @@ bool appimage_is_registered_in_system(const char* path) { /* * Register an AppImage in the system * Returns 0 on success, non-0 otherwise. - * Set app_for_removal to add a [Desktop Action] for removing the AppImage using that executable. */ -int appimage_register_in_system_get_desktop_file_path(const char* path, gboolean verbose, const char* get_desktop_file_path) +int appimage_register_in_system(char *path, gboolean verbose) { if((g_str_has_suffix(path, ".part")) || g_str_has_suffix(path, ".tmp") || @@ -1405,12 +1391,10 @@ int appimage_register_in_system_get_desktop_file_path(const char* path, gboolean switch (type) { case 1: - if (!appimage_type1_register_in_system_get_desktop_file_path(path, verbose, get_desktop_file_path)) - return 1; + appimage_type1_register_in_system(path, verbose); break; case 2: - if (!appimage_type2_register_in_system_get_desktop_file_path(path, verbose, get_desktop_file_path)) - return 1; + appimage_type2_register_in_system(path, verbose); break; default: #ifdef STANDALONE @@ -1419,15 +1403,17 @@ int appimage_register_in_system_get_desktop_file_path(const char* path, gboolean return 1; } - return 0; -} + if (type == 1) { + if (!appimage_type1_register_in_system(path, verbose)) + return 1; + } -/* - * Register an AppImage in the system - * Returns 0 on success, non-0 otherwise. - */ -int appimage_register_in_system(char* path, gboolean verbose) { - return appimage_register_in_system_get_desktop_file_path(path, verbose, NULL); + if (type == 2) { + if (!appimage_type2_register_in_system(path, verbose)) + return 1; + } + + return 0; } /* Delete the thumbnail for a given file and size if it exists */ @@ -1543,21 +1529,15 @@ void dummy_traverse_func(appimage_handler *handler, traverse_cb command, void *d (void) command; (void) data; -#ifdef STANDALONE fprintf(stderr, "Called %s\n", __FUNCTION__); -#endif } char* dummy_get_file_name (appimage_handler *handler, void *data) { -#ifdef STANDALONE fprintf(stderr, "Called %s\n", __FUNCTION__); -#endif } void dummy_extract_file(struct appimage_handler *handler, void *data, char *target) { -#ifdef STANDALONE fprintf(stderr, "Called %s\n", __FUNCTION__); -#endif } /* diff --git a/src/shared.h b/src/shared.h index 03fa64b38..c594436d2 100644 --- a/src/shared.h +++ b/src/shared.h @@ -88,15 +88,12 @@ int appimage_register_in_system(char* path, gboolean verbose); void appimage_create_thumbnail(const gchar* appimage_file_path, gboolean verbose); -bool appimage_type2_register_in_system_get_desktop_file_path(const char* path, gboolean verbose, char** desktop_file_path); - -bool appimage_type2_register_in_system(const char* path, gboolean verbose); - -bool appimage_type1_register_in_system_get_desktop_file_path(const char* path, gboolean verbose, char** desktop_file_path); +bool appimage_type2_register_in_system(char* path, gboolean verbose); bool appimage_type1_register_in_system(const char* path, gboolean verbose); -bool write_edited_desktop_file(GKeyFile* key_file_structure, const char* appimage_path, gchar* desktop_filename, int appimage_type, char* md5, gboolean verbose, char** desktop_file_path); +bool write_edited_desktop_file(GKeyFile* key_file_structure, const char* appimage_path, gchar* desktop_filename, + int appimage_type, char* md5, gboolean verbose); gboolean g_key_file_load_from_squash(sqfs* fs, char* path, GKeyFile* key_file_structure, gboolean verbose); @@ -120,4 +117,4 @@ void set_executable(const char* path, gboolean verbose); extern char* vendorprefix; -char** appimage_list_files(const char* path); +char** appimage_list_files(const char* path); \ No newline at end of file diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index 986bc91db..f7c7a71cc 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -1,6 +1,5 @@ #include "appimage/appimage.h" -#include #include #include @@ -17,6 +16,7 @@ namespace AppImageTests { + class LibAppImageTest : public AppImageKitTest { protected: std::string appImage_type_1_file_path; @@ -57,10 +57,6 @@ namespace AppImageTests { g_free(sum); return found; } - - static bool compareStrings(const char* str1, const char* str2) { - return strcmp(str1, str2) == 0; - } }; TEST_F(LibAppImageTest, appimage_get_type_invalid) { @@ -91,22 +87,6 @@ namespace AppImageTests { appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); } - TEST_F(LibAppImageTest, appimage_register_in_system_with_type1_get_desktop_file_path) { - ASSERT_EQ(appimage_register_in_system(appImage_type_1_file_path.c_str(), false), 0); - - ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_1_file_path)); - - appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); - } - - TEST_F(LibAppImageTest, appimage_register_in_system_with_type2_get_desktop_file_path) { - ASSERT_EQ(appimage_register_in_system(appImage_type_2_file_path.c_str(), false), 0); - - ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_2_file_path)); - - appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); - } - TEST_F(LibAppImageTest, appimage_type1_register_in_system) { ASSERT_TRUE(appimage_type1_register_in_system(appImage_type_1_file_path.c_str(), false)); @@ -122,52 +102,6 @@ namespace AppImageTests { appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); } - TEST_F(LibAppImageTest, appimage_type1_register_in_system_get_desktop_file_path) { - char* desktop_file_path = NULL; - EXPECT_TRUE(appimage_type1_register_in_system_get_desktop_file_path(appImage_type_1_file_path.c_str(), false, &desktop_file_path)); - EXPECT_TRUE(desktop_file_path != NULL); - - glob_t pglob; - - char* data_home = xdg_data_home(); - std::string dirPath = std::string(data_home) + "/applications/*.desktop"; - free(data_home); - - EXPECT_EQ(glob(dirPath.c_str(), GLOB_NOSORT, NULL, &pglob), 0); - EXPECT_EQ(pglob.gl_pathc, 1); - - if (pglob.gl_pathc >= 1) { - EXPECT_PRED2(compareStrings, pglob.gl_pathv[0], desktop_file_path); - } - - globfree(&pglob); - - appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); -} - - TEST_F(LibAppImageTest, appimage_type2_register_in_system_get_desktop_file_path) { - char* desktop_file_path = NULL; - EXPECT_TRUE(appimage_type2_register_in_system_get_desktop_file_path(appImage_type_2_file_path.c_str(), false, &desktop_file_path)); - EXPECT_TRUE(desktop_file_path != NULL); - - glob_t pglob; - - char* data_home = xdg_data_home(); - std::string dirPath = std::string(data_home) + "/applications/*.desktop"; - free(data_home); - - EXPECT_EQ(glob(dirPath.c_str(), GLOB_NOSORT, NULL, &pglob), 0); - EXPECT_EQ(pglob.gl_pathc, 1); - - if (pglob.gl_pathc >= 1) { - EXPECT_PRED2(compareStrings, pglob.gl_pathv[0], desktop_file_path); - } - - globfree(&pglob); - - appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); - } - TEST_F(LibAppImageTest, appimage_unregister_in_system) { ASSERT_FALSE(areIntegrationFilesDeployed(appImage_type_1_file_path)); ASSERT_FALSE(areIntegrationFilesDeployed(appImage_type_2_file_path)); diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index bc0f75d10..ea5377bf3 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -38,7 +38,7 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { gboolean success = g_key_file_load_from_data(keyFile, buffer.data(), buffer.size(), G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, NULL); if (success) { - write_edited_desktop_file(keyFile, "testpath", strdup("abc"), 1, strdup("def"), false, NULL); + write_edited_desktop_file(keyFile, "testpath", strdup("abc"), 1, strdup("def"), false); } g_key_file_free(keyFile); From e3a405f8c85acbfc29034fd097c355236a280fca Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 28 Mar 2018 23:12:00 +0200 Subject: [PATCH 131/544] Add appimage_registered_desktop_file_path This new function uses glob() to find an AppImage's desktop file after registration in XDG_DATA_HOME. As the MD5 is supposed to be unique (collision resistant for our use case), this should work fine. Instead of searching the AppImage's contents for the missing filename component, it is sufficient to just build a pattern for glob() using the MD5 hash of the AppImage, using a wildcard character in place of the missing component. The glob() call should then return a single file path, which is returned by this function. --- include/appimage/appimage.h | 9 +++ src/shared.c | 129 +++++++++++------------------------- src/shared.h | 4 +- tests/test_libappimage.cpp | 73 ++++++++++++++++++++ 4 files changed, 123 insertions(+), 92 deletions(-) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index 263b255af..ffa92c648 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -12,6 +12,15 @@ char *appimage_get_md5(char const* path); /* Check if a file is an AppImage. Returns the image type if it is, or -1 if it isn't */ int appimage_get_type(const char* path, bool verbose); +/* + * Finds the desktop file of a registered AppImage and returns the path + * Returns NULL if the desktop file can't be found, which should only occur when the AppImage hasn't been registered yet + */ +char* appimage_registered_desktop_file_path(const char* path, char* md5, bool verbose); + +/* + * Check whether an AppImage has been registered in the system + */ bool appimage_is_registered_in_system(const char* path); /* Register a type 1 AppImage in the system */ diff --git a/src/shared.c b/src/shared.c index be11ae871..bcf0bbbe0 100644 --- a/src/shared.c +++ b/src/shared.c @@ -60,6 +60,7 @@ #endif #include +#include #include // To get the size of icons, move_icon_to_destination() @@ -1235,6 +1236,42 @@ bool appimage_type2_register_in_system(char *path, gboolean verbose) { return TRUE; } +char* appimage_registered_desktop_file_path(const char *path, char *md5, bool verbose) { + glob_t pglob = {}; + + // if md5 has been calculated before, we can just use it to save these extra calculations + // if not, we need to calculate it here + if (md5 == NULL) + md5 = appimage_get_md5(path); + + char *data_home = xdg_data_home(); + + // TODO: calculate this value exactly + char *glob_pattern = malloc(PATH_MAX); + sprintf(glob_pattern, "%s/applications/appimagekit_%s-*.desktop", data_home, md5); + + glob(glob_pattern, 0, NULL, &pglob); + + char* rv = NULL; + + if (pglob.gl_pathc <= 0) { + if (verbose) { + fprintf(stderr, "No results found by glob()"); + } + } else if (pglob.gl_pathc >= 1) { + if (pglob.gl_pathc > 1 && verbose) { + fprintf(stderr, "Too many results returned by glob(), returning first result found"); + } + + // need to copy value to be able to globfree() later on + rv = strdup(pglob.gl_pathv[0]); + } + + globfree(&pglob); + + return rv; +}; + /* Check whether AppImage is registered in the system already */ bool appimage_is_registered_in_system(const char* path) { // there's two criteria whether an AppImage has been registered in the system: @@ -1255,97 +1292,8 @@ bool appimage_is_registered_in_system(const char* path) { gchar* md5 = appimage_get_md5(path); - int appimage_type = appimage_get_type(path, false); - GKeyFile* key_file = g_key_file_new(); - gchar* desktop_filename = NULL; - - switch (appimage_type) { - case 1: - { - // open AppImage as ISO9660 file - struct archive *a = archive_read_new(); - - if (archive_read_support_format_iso9660(a) != ARCHIVE_OK || - archive_read_open_filename(a, path, 10240) != ARCHIVE_OK) { - - // cleanup - archive_read_free(a); - g_free(thumbnail_path); - g_free(md5); - g_free(desktop_filename); - g_key_file_free(key_file); - - return false; - } - - bool rv = appimage_type1_get_desktop_filename_and_key_file(&a, &desktop_filename, &key_file); - - archive_read_free(a); - - if (!rv) { - // cleanup - g_free(thumbnail_path); - g_free(md5); - g_key_file_free(key_file); - g_free(desktop_filename); - - return false; - } - } - break; - case 2: - { - long unsigned int fs_offset; // The offset at which a squashfs image is expected - fs_offset = get_elf_size(path); - - sqfs fs; - sqfs_err err = sqfs_open_image(&fs, path, fs_offset); - - if (err != SQFS_OK) { -#ifdef STANDALONE - fprintf(stderr, "sqfs_open_image error: %s\n", path); -#endif - - // cleanup - sqfs_destroy(&fs); - g_free(thumbnail_path); - g_free(md5); - g_free(desktop_filename); - g_key_file_free(key_file); - - return false; - } - - bool rv = appimage_type2_get_desktop_filename_and_key_file(&fs, &desktop_filename, md5, &key_file, false); - - sqfs_destroy(&fs); - - if (!rv) { - // cleanup - g_free(thumbnail_path); - g_free(md5); - g_free(desktop_filename); - g_key_file_free(key_file); - - return false; - } - } - - break; - default: - // type not recognized - - // cleanup - g_free(thumbnail_path); - g_free(md5); - g_key_file_free(key_file); - g_free(desktop_filename); - - return false; - } - - gchar* desktop_file_path = build_installed_desktop_file_path(md5, desktop_filename); + gchar* desktop_file_path = appimage_registered_desktop_file_path(path, md5, false); bool rv = true; @@ -1354,7 +1302,6 @@ bool appimage_is_registered_in_system(const char* path) { g_free(thumbnail_path); g_free(md5); - g_free(desktop_filename); g_free(desktop_file_path); g_key_file_free(key_file); diff --git a/src/shared.h b/src/shared.h index c594436d2..184f0e431 100644 --- a/src/shared.h +++ b/src/shared.h @@ -82,6 +82,8 @@ void unregister_using_md5_id(const char* name, int level, char* md5, gboolean ve void delete_thumbnail(char* path, char* size, gboolean verbose); +char* appimage_registered_desktop_file_path(const char* path, char* md5, bool verbose); + bool appimage_is_registered_in_system(const char* path); int appimage_register_in_system(char* path, gboolean verbose); @@ -117,4 +119,4 @@ void set_executable(const char* path, gboolean verbose); extern char* vendorprefix; -char** appimage_list_files(const char* path); \ No newline at end of file +char** appimage_list_files(const char* path); diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index f7c7a71cc..5d6a52b09 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -286,6 +286,79 @@ namespace AppImageTests { FAIL(); } + TEST_F(LibAppImageTest, test_appimage_registered_desktop_file_path_not_registered) { + EXPECT_TRUE(appimage_registered_desktop_file_path(appImage_type_1_file_path.c_str(), NULL, false) == NULL); + EXPECT_TRUE(appimage_registered_desktop_file_path(appImage_type_2_file_path.c_str(), NULL, false) == NULL); + } + + TEST_F(LibAppImageTest, test_appimage_registered_desktop_file_path_type1) { + EXPECT_TRUE(appimage_type1_register_in_system(appImage_type_1_file_path.c_str(), false)); + + char* desktop_file_path = appimage_registered_desktop_file_path(appImage_type_1_file_path.c_str(), NULL, false); + + EXPECT_TRUE(desktop_file_path != NULL); + + free(desktop_file_path); + } + + TEST_F(LibAppImageTest, test_appimage_registered_desktop_file_path_type2) { + EXPECT_TRUE(appimage_type2_register_in_system(appImage_type_2_file_path.c_str(), false)); + + char* desktop_file_path = appimage_registered_desktop_file_path(appImage_type_2_file_path.c_str(), NULL, false); + + EXPECT_TRUE(desktop_file_path != NULL); + + free(desktop_file_path); + } + + TEST_F(LibAppImageTest, test_appimage_registered_desktop_file_path_type1_precalculated_md5) { + EXPECT_TRUE(appimage_type1_register_in_system(appImage_type_1_file_path.c_str(), false)); + + char* md5 = appimage_get_md5(appImage_type_1_file_path.c_str()); + char* desktop_file_path = appimage_registered_desktop_file_path(appImage_type_1_file_path.c_str(), md5, false); + free(md5); + + EXPECT_TRUE(desktop_file_path != NULL); + + free(desktop_file_path); + } + + TEST_F(LibAppImageTest, test_appimage_registered_desktop_file_path_type2_precalculated_md5) { + EXPECT_TRUE(appimage_type2_register_in_system(appImage_type_2_file_path.c_str(), false)); + + char* md5 = appimage_get_md5(appImage_type_2_file_path.c_str()); + char* desktop_file_path = appimage_registered_desktop_file_path(appImage_type_2_file_path.c_str(), md5, false); + free(md5); + + EXPECT_TRUE(desktop_file_path != NULL); + + free(desktop_file_path); + } + + TEST_F(LibAppImageTest, test_appimage_registered_desktop_file_path_type1_wrong_md5) { + EXPECT_TRUE(appimage_type1_register_in_system(appImage_type_1_file_path.c_str(), false)); + + char* md5 = strdup("abcdefg"); + char* desktop_file_path = appimage_registered_desktop_file_path(appImage_type_1_file_path.c_str(), md5, false); + free(md5); + + EXPECT_TRUE(desktop_file_path == NULL); + + free(desktop_file_path); + } + + TEST_F(LibAppImageTest, test_appimage_registered_desktop_file_path_type2_wrong_md5) { + EXPECT_TRUE(appimage_type2_register_in_system(appImage_type_2_file_path.c_str(), false)); + + char* md5 = strdup("abcdefg"); + char* desktop_file_path = appimage_registered_desktop_file_path(appImage_type_2_file_path.c_str(), md5, false); + free(md5); + + EXPECT_TRUE(desktop_file_path == NULL); + + free(desktop_file_path); + } + } // namespace int main(int argc, char **argv) { From ea5aa1bcbbbd0b2857b81e949360cd688ed79ab6 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 29 Mar 2018 02:03:55 +0200 Subject: [PATCH 132/544] Remove appimaged specific desktop integration code from libappimage libappimage users do not want to use appimaged specific desktop actions etc. This PR guards these code snippets with a compiler definition that is only activated for appimaged builds. This PR should be considered a quick fix for the issue. In the long term, the code needs to be moved to appimaged's source files. Desktop actions can easily be added to the desktop file since the introduction of appimage_registered_desktop_file_path, so this shouldn't be much work. --- src/CMakeLists.txt | 2 ++ src/shared.c | 10 ++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ffa00bb74..21841ff5c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -202,7 +202,9 @@ target_compile_definitions(appimaged PRIVATE -D_FILE_OFFSET_BITS=64 PRIVATE -DHAVE_LIBARCHIVE3=0 PRIVATE -DSTANDALONE=1 + PRIVATE -DAPPIMAGED=1 ) +# TODO: remove -DAPPIMAGED=1, move these code snippets to appimaged's source code files add_dependencies(appimaged squashfuse) diff --git a/src/shared.c b/src/shared.c index bcf0bbbe0..01cc2cba8 100644 --- a/src/shared.c +++ b/src/shared.c @@ -570,6 +570,7 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag g_free(new_exec_value); } +#ifdef APPIMAGED /* If firejail is on the $PATH, then use it to run AppImages */ if(g_find_program_in_path ("firejail")){ char *firejail_exec; @@ -583,9 +584,10 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag g_key_file_set_value(key_file_structure, firejail_profile_group, G_KEY_FILE_DESKTOP_KEY_EXEC, firejail_profile_exec); g_key_file_set_value(key_file_structure, firejail_profile_group, G_KEY_FILE_DESKTOP_KEY_TRY_EXEC, firejail_tryexec); g_key_file_set_value(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, "Actions", "FirejailProfile;"); - } +#endif +#ifdef APPIMAGED /* Add AppImageUpdate desktop action * https://specifications.freedesktop.org/desktop-entry-spec/latest/ar01s10.html * This will only work if AppImageUpdate is on the user's $PATH. @@ -630,6 +632,7 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag } } } +#endif gchar *icon_path = g_key_file_get_value(key_file_structure, "Desktop Entry", "Icon", NULL); gchar *basename = g_path_get_basename(icon_path); @@ -645,14 +648,13 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag g_free(icon_with_md5); } - /* At compile time, inject GIT_COMMIT like this: - * cc ... -DGIT_COMMIT=\"$(git describe --tags --always --abbrev=7)\" -.. - */ +#ifdef APPIMAGED { gchar *generated_by = g_strdup_printf("Generated by appimaged %s", GIT_COMMIT); g_key_file_set_value(key_file_structure, "Desktop Entry", "X-AppImage-Comment", generated_by); g_free(generated_by); } +#endif g_key_file_set_value(key_file_structure, "Desktop Entry", "X-AppImage-Identifier", md5); #ifdef STANDALONE fprintf(stderr, "Installing desktop file\n"); From 25e1f15613eb4f7757ac6c9c04a1f0a5b149fca0 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 4 Apr 2018 16:31:23 +0200 Subject: [PATCH 133/544] Include public header in shared.h This deprecates all the duplicate definitions in shared.h, and avoids broken definitions in the public header appimage.h. --- include/appimage/appimage.h | 2 +- src/CMakeLists.txt | 4 ++++ src/shared.c | 12 ++++++------ src/shared.h | 28 +++------------------------- 4 files changed, 14 insertions(+), 32 deletions(-) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index ffa92c648..c2ca51201 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -45,7 +45,7 @@ void appimage_extract_file_following_symlinks(const char* appimage_file_path, co /* Create AppImage thumbnail according to * https://specifications.freedesktop.org/thumbnail-spec/0.8.0/index.html */ -void appimage_create_thumbnail(const char* appimage_file_path); +void appimage_create_thumbnail(const char* appimage_file_path, bool verbose); /* List files contained in the AppImage file. * Returns: a newly allocated char** ended at NULL. If no files ware found also is returned a {NULL} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 21841ff5c..d421477fe 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -36,6 +36,10 @@ add_custom_target(runtime DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/runtime) add_subdirectory(xdg-basedir) +# include public include directory to avoid having to maintain definitions in two places +include_directories(${PROJECT_SOURCE_DIR}/include) + + # allow setting different path for mksquashfs after installation set(AUXILIARY_FILES_DESTINATION "lib/appimagekit" CACHE STRING "Target install directory for mksquashfs") diff --git a/src/shared.c b/src/shared.c index 01cc2cba8..fda688692 100644 --- a/src/shared.c +++ b/src/shared.c @@ -237,7 +237,7 @@ void move_icon_to_destination(gchar *icon_path, gboolean verbose) } /* Check if a file is an AppImage. Returns the image type if it is, or -1 if it isn't */ -int appimage_get_type(const char* path, gboolean verbose) +int appimage_get_type(const char* path, bool verbose) { FILE *f = fopen(path, "rt"); if (f != NULL) @@ -1037,7 +1037,7 @@ bool archive_copy_icons_recursively_to_destination(struct archive** a, const gch } /* Register a type 1 AppImage in the system */ -bool appimage_type1_register_in_system(const char *path, gboolean verbose) +bool appimage_type1_register_in_system(const char *path, bool verbose) { #ifdef STANDALONE fprintf(stderr, "ISO9660 based type 1 AppImage\n"); @@ -1157,7 +1157,7 @@ bool appimage_type2_get_desktop_filename_and_key_file(sqfs* fs, gchar** desktop_ } /* Register a type 2 AppImage in the system */ -bool appimage_type2_register_in_system(char *path, gboolean verbose) { +bool appimage_type2_register_in_system(const char *path, bool verbose) { #ifdef STANDALONE fprintf(stderr, "squashfs based type 2 AppImage\n"); #endif @@ -1314,7 +1314,7 @@ bool appimage_is_registered_in_system(const char* path) { * Register an AppImage in the system * Returns 0 on success, non-0 otherwise. */ -int appimage_register_in_system(char *path, gboolean verbose) +int appimage_register_in_system(const char *path, bool verbose) { if((g_str_has_suffix(path, ".part")) || g_str_has_suffix(path, ".tmp") || @@ -1420,7 +1420,7 @@ void unregister_using_md5_id(const char *name, int level, char* md5, gboolean ve /* Unregister an AppImage in the system */ -int appimage_unregister_in_system(char *path, gboolean verbose) +int appimage_unregister_in_system(const char *path, bool verbose) { char *md5 = appimage_get_md5(path); @@ -1838,7 +1838,7 @@ void extract_appimage_icon(appimage_handler *h, gchar *target) { /* Create AppImage thumbanil according to * https://specifications.freedesktop.org/thumbnail-spec/0.8.0/index.html */ -void appimage_create_thumbnail(const gchar *appimage_file_path, gboolean verbose) { +void appimage_create_thumbnail(const char *appimage_file_path, bool verbose) { // extract AppImage icon to /tmp appimage_handler handler = create_appimage_handler(appimage_file_path); diff --git a/src/shared.h b/src/shared.h index 184f0e431..d6567513a 100644 --- a/src/shared.h +++ b/src/shared.h @@ -3,6 +3,9 @@ #include #include +// include public header to avoid duplicate definitions of functions +#include "appimage/appimage.h" + /* AppImage generic handler calback to be used in algorithms */ typedef void (*traverse_cb)(void *handler, void *entry_data, void *user_data); @@ -19,9 +22,6 @@ struct appimage_handler bool is_open; } typedef appimage_handler; -void appimage_extract_file_following_symlinks(const gchar* appimage_file_path, const char* file_path, - const char* target_dir); - void extract_appimage_icon(appimage_handler* h, gchar* target); void extract_appimage_icon_command(void* handler_data, void* entry_data, void* user_data); @@ -44,8 +44,6 @@ void appimage_type2_extract_regular_file(sqfs* fs, sqfs_inode* inode, const char void appimage_type2_extract_symlink(sqfs* fs, sqfs_inode* inode, const char* target); -void appimage_type2_extract_symlink(sqfs* fs, sqfs_inode* inode, const char* target); - char* appimage_type2_get_file_name(appimage_handler* handler, void* data); void appimage_type2_traverse(appimage_handler* handler, traverse_cb command, void* command_data); @@ -76,24 +74,10 @@ void mk_base_dir(const char* target); bool is_handler_valid(const appimage_handler* handler); -int appimage_unregister_in_system(char* path, gboolean verbose); - void unregister_using_md5_id(const char* name, int level, char* md5, gboolean verbose); void delete_thumbnail(char* path, char* size, gboolean verbose); -char* appimage_registered_desktop_file_path(const char* path, char* md5, bool verbose); - -bool appimage_is_registered_in_system(const char* path); - -int appimage_register_in_system(char* path, gboolean verbose); - -void appimage_create_thumbnail(const gchar* appimage_file_path, gboolean verbose); - -bool appimage_type2_register_in_system(char* path, gboolean verbose); - -bool appimage_type1_register_in_system(const char* path, gboolean verbose); - bool write_edited_desktop_file(GKeyFile* key_file_structure, const char* appimage_path, gchar* desktop_filename, int appimage_type, char* md5, gboolean verbose); @@ -105,18 +89,12 @@ gchar** squash_get_matching_files_install_icons_and_mime_data(sqfs* fs, char* pa void squash_extract_inode_to_file(sqfs* fs, sqfs_inode* inode, const gchar* dest); -int appimage_get_type(const char* path, gboolean verbose); - void move_icon_to_destination(gchar* icon_path, gboolean verbose); char* get_thumbnail_path(const char* path, char* thumbnail_size, gboolean verbose); -char* appimage_get_md5(const char* path); - gchar* replace_str(const gchar* src, const gchar* find, const gchar* replace); void set_executable(const char* path, gboolean verbose); extern char* vendorprefix; - -char** appimage_list_files(const char* path); From 4305ab4aa1c1091a3344d0deda371a901a7a0687 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 4 Apr 2018 19:49:19 +0200 Subject: [PATCH 134/544] Fix missing include for appimaged --- src/CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d421477fe..a2a468eaa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -36,16 +36,11 @@ add_custom_target(runtime DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/runtime) add_subdirectory(xdg-basedir) -# include public include directory to avoid having to maintain definitions in two places -include_directories(${PROJECT_SOURCE_DIR}/include) - - # allow setting different path for mksquashfs after installation set(AUXILIARY_FILES_DESTINATION "lib/appimagekit" CACHE STRING "Target install directory for mksquashfs") add_library(libappimage SHARED - ${PROJECT_SOURCE_DIR}/include/appimage/appimage.h shared.c getsection.c notify.c @@ -210,6 +205,11 @@ target_compile_definitions(appimaged ) # TODO: remove -DAPPIMAGED=1, move these code snippets to appimaged's source code files +target_include_directories(appimaged + PUBLIC $ + INTERFACE $ +) + add_dependencies(appimaged squashfuse) if(NOT USE_SYSTEM_INOTIFY_TOOLS) From f6f342b0a9f443185f2b0748b63b4b8e2a69185b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 4 Apr 2018 19:55:19 +0200 Subject: [PATCH 135/544] Fix build issues --- tests/CMakeLists.txt | 9 ++++++++- tests/test_libappimage.cpp | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 743e02c4f..833bfef09 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -51,7 +51,14 @@ if(BUILD_TESTING) ${gtest_LIBRARIES} ) - target_include_directories(test_shared PRIVATE ../src/) + target_include_directories(test_shared + # used to include shared.h + PRIVATE ${PROJECT_SOURCE_DIR}/src/ + # need to include libappimage's header directory as well + # as we're building this test manually from the source files, we need to replicate the build settings of + # libappimage, appimagetool, ... + PRIVATE ${PROJECT_SOURCE_DIR}/include/ + ) add_dependencies(test_shared squashfuse) diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index 5d6a52b09..973965577 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -128,7 +128,7 @@ namespace AppImageTests { } TEST_F(LibAppImageTest, create_thumbnail_appimage_type_1) { - appimage_create_thumbnail(appImage_type_1_file_path.c_str()); + appimage_create_thumbnail(appImage_type_1_file_path.c_str(), false); gchar *sum = appimage_get_md5(appImage_type_1_file_path.c_str()); @@ -147,7 +147,7 @@ namespace AppImageTests { } TEST_F(LibAppImageTest, create_thumbnail_appimage_type_2) { - appimage_create_thumbnail(appImage_type_2_file_path.c_str()); + appimage_create_thumbnail(appImage_type_2_file_path.c_str(), false); gchar *sum = appimage_get_md5(appImage_type_2_file_path.c_str()); From fff7c561198332bd9adca2c662d31bce5c5b1890 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 4 Apr 2018 21:29:03 +0200 Subject: [PATCH 136/544] Move test paths to fixture base class --- tests/fixtures.h | 7 +++++++ tests/test_libappimage.cpp | 8 -------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/tests/fixtures.h b/tests/fixtures.h index cd4e0a4cb..73dac3b0c 100644 --- a/tests/fixtures.h +++ b/tests/fixtures.h @@ -18,6 +18,10 @@ class AppImageKitTest : public ::testing::Test { std::string tempDir; std::string tempHome; +protected: + std::string appImage_type_1_file_path; + std::string appImage_type_2_file_path; + public: AppImageKitTest() { char* tmpl = strdup("/tmp/AppImageKit-unit-tests-XXXXXX"); @@ -48,6 +52,9 @@ class AppImageKitTest : public ::testing::Test { free(xdgDataHome); free(xdgConfigHome); + + appImage_type_1_file_path = std::string(TEST_DATA_DIR) + "/AppImageExtract_6-x86_64.AppImage"; + appImage_type_2_file_path = std::string(TEST_DATA_DIR) + "/Echo-x86_64.AppImage"; }; ~AppImageKitTest() { diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index 973965577..b18ddabf1 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -19,14 +19,6 @@ namespace AppImageTests { class LibAppImageTest : public AppImageKitTest { protected: - std::string appImage_type_1_file_path; - std::string appImage_type_2_file_path; - - LibAppImageTest() { - appImage_type_1_file_path = std::string(TEST_DATA_DIR) + "/AppImageExtract_6-x86_64.AppImage"; - appImage_type_2_file_path = std::string(TEST_DATA_DIR) + "/Echo-x86_64.AppImage"; - } - void rm_file(const std::string &path) { g_remove(path.c_str()); } From 01fa866e82abf25e07ed9f03cb3ddf6de57f31b7 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 5 Apr 2018 13:24:39 +0200 Subject: [PATCH 137/544] Improve Debian versioning Append build ID to Debian package release, similar to AppImage naming. See https://github.com/TheAssassin/AppImageLauncher/commit/eed81f6 for more information. --- cmake/cpack_debs.cmake | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/cmake/cpack_debs.cmake b/cmake/cpack_debs.cmake index e97dfb02d..48d9d2e75 100644 --- a/cmake/cpack_debs.cmake +++ b/cmake/cpack_debs.cmake @@ -1,14 +1,22 @@ # required for DEB-DEFAULT to work as intended cmake_minimum_required(VERSION 3.6) -set(PROJECT_VERSION 1.0) set(CPACK_GENERATOR "DEB") -set(CPACK_DEBIAN_PACKAGE_VERSION ${PROJECT_VERSION}) -file(READ ${PROJECT_BINARY_DIR}/GIT_COMMIT GIT_COMMIT) -message("GIT_COMMIT: ${GIT_COMMIT}") +# versioning +# it appears setting CPACK_DEBIAN_PACKAGE_VERSION doesn't work, hence setting CPACK_PACKAGE_VERSION +set(CPACK_PACKAGE_VERSION ${VERSION}) + +# use git hash as package release set(CPACK_DEBIAN_PACKAGE_RELEASE "git${GIT_COMMIT}") +# append build ID, similar to AppImage naming +if(DEFINED ENV{TRAVIS_BUILD_NUMBER}) + set(CPACK_DEBIAN_PACKAGE_RELEASE "${CPACK_DEBIAN_PACKAGE_RELEASE}-travis$ENV{TRAVIS_BUILD_NUMBER}") +else() + set(CPACK_DEBIAN_PACKAGE_RELEASE "${CPACK_DEBIAN_PACKAGE_RELEASE}-local") +endif() + if(DEFINED ENV{ARCH}) set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE $ENV{ARCH}) if(CPACK_DEBIAN_PACKAGE_ARCHITECTURE MATCHES "i686") From a2e72b011b4308059c818d2c72f8289dc6bdde7b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 5 Apr 2018 17:00:03 +0200 Subject: [PATCH 138/544] Conform to CMake Debian release restrictions Dashes are not allowed. --- cmake/cpack_debs.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/cpack_debs.cmake b/cmake/cpack_debs.cmake index 48d9d2e75..4e6a56245 100644 --- a/cmake/cpack_debs.cmake +++ b/cmake/cpack_debs.cmake @@ -12,9 +12,9 @@ set(CPACK_DEBIAN_PACKAGE_RELEASE "git${GIT_COMMIT}") # append build ID, similar to AppImage naming if(DEFINED ENV{TRAVIS_BUILD_NUMBER}) - set(CPACK_DEBIAN_PACKAGE_RELEASE "${CPACK_DEBIAN_PACKAGE_RELEASE}-travis$ENV{TRAVIS_BUILD_NUMBER}") + set(CPACK_DEBIAN_PACKAGE_RELEASE "${CPACK_DEBIAN_PACKAGE_RELEASE}~travis$ENV{TRAVIS_BUILD_NUMBER}") else() - set(CPACK_DEBIAN_PACKAGE_RELEASE "${CPACK_DEBIAN_PACKAGE_RELEASE}-local") + set(CPACK_DEBIAN_PACKAGE_RELEASE "${CPACK_DEBIAN_PACKAGE_RELEASE}~local") endif() if(DEFINED ENV{ARCH}) From 14bcf72749b28890bf2ea6ff136d1b1ad2ae2b1e Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 5 Apr 2018 21:40:39 +0200 Subject: [PATCH 139/544] Remove duplicate calls --- src/shared.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/shared.c b/src/shared.c index fda688692..2ac5ecc18 100644 --- a/src/shared.c +++ b/src/shared.c @@ -1340,10 +1340,12 @@ int appimage_register_in_system(const char *path, bool verbose) switch (type) { case 1: - appimage_type1_register_in_system(path, verbose); + if (!appimage_type1_register_in_system(path, verbose)) + return 1; break; case 2: - appimage_type2_register_in_system(path, verbose); + if (!appimage_type2_register_in_system(path, verbose)) + return 1; break; default: #ifdef STANDALONE @@ -1352,16 +1354,6 @@ int appimage_register_in_system(const char *path, bool verbose) return 1; } - if (type == 1) { - if (!appimage_type1_register_in_system(path, verbose)) - return 1; - } - - if (type == 2) { - if (!appimage_type2_register_in_system(path, verbose)) - return 1; - } - return 0; } From c5c380280b15e2749281d57b093f1a5cf14fb687 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 5 Apr 2018 22:27:33 +0200 Subject: [PATCH 140/544] Add appimage_is_terminal_app Largely based on appimage_is_no_display code. Suffers from the same segfault bug in the i386 tests. --- include/appimage/appimage.h | 24 +++++ src/shared.c | 200 +++++++++++++++++++++++++++++++++--- 2 files changed, 212 insertions(+), 12 deletions(-) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index c2ca51201..862cadd73 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -57,6 +57,30 @@ char** appimage_list_files(const char* path); /* Releases memory of a string list (a.k.a. list of pointers to char arrays allocated in heap memory). */ void appimage_string_list_free(char** list); +/* + * Checks whether a type 1 AppImage's desktop file has set Terminal=true. + * Useful to check whether the author of an AppImage doesn't want it to be integrated. + * + * Returns >0 if set, 0 if not set, <0 on errors. + */ +int appimage_type1_is_terminal_app(const char* path); + +/* + * Checks whether a type 2 AppImage's desktop file has set Terminal=true. + * Useful to check whether the author of an AppImage doesn't want it to be integrated. + * + * Returns >0 if set, 0 if not set, <0 on errors. + */ +int appimage_type2_is_terminal_app(const char* path); + +/* + * Checks whether an AppImage's desktop file has set Terminal=true. + * Useful to check whether the author of an AppImage doesn't want it to be integrated. + * + * Returns >0 if set, 0 if not set, <0 on errors. + */ +int appimage_is_terminal_app(const char* path); + #ifdef __cplusplus } #endif diff --git a/src/shared.c b/src/shared.c index fda688692..b1bb961b3 100644 --- a/src/shared.c +++ b/src/shared.c @@ -1238,6 +1238,190 @@ bool appimage_type2_register_in_system(const char *path, bool verbose) { return TRUE; } +int appimage_type1_is_terminal_app(const char* path) { + // check if file exists + if (!g_file_test(path, G_FILE_TEST_IS_REGULAR)) + return -1; + + // check if file is of correct type + if (appimage_get_type(path, false) != 1) + return -1; + + char* md5 = appimage_get_md5(path); + + if (md5 == NULL) + return -1; + + // open ISO9660 image using libarchive + struct archive *a = archive_read_new(); + archive_read_support_format_iso9660(a); + + // libarchive status int -- passed to called functions + int r; + + if ((r = archive_read_open_filename(a, path, 10240)) != ARCHIVE_OK) { + // cleanup + free(md5); + archive_read_free(a); + + return -1; + } + // search image for root desktop file, and read it into key file structure so it can be edited eventually + gchar *desktop_filename = NULL; + GKeyFile *key_file = NULL; + + if (!appimage_type1_get_desktop_filename_and_key_file(&a, &desktop_filename, &key_file)) { + // cleanup + free(md5); + archive_read_free(a); + g_free(desktop_filename); + g_key_file_free(key_file); + + return -1; + } + + // validate that both have been set to a non-NULL value + if (desktop_filename == NULL || key_file == NULL) { + // cleanup + free(md5); + archive_read_free(a); + g_free(desktop_filename); + g_key_file_free(key_file); + + return -1; + } + + GError *error = NULL; + gboolean rv = g_key_file_get_boolean(key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, &error); + + // cleanup + free(md5); + archive_read_free(a); + g_free(desktop_filename); + g_key_file_free(key_file); + + int result; + + if (!rv) { + // if the key file hasn't been found and the error is not set to NOT_FOUND, return an error + if (error == G_KEY_FILE_ERROR_NOT_FOUND) + result = -1; + else + result = 0; + } else { + result = 1; + } + + if (error != NULL) + g_error_free(error); + + return result; +}; + +int appimage_type2_is_terminal_app(const char* path) { + // check if file exists + if (!g_file_test(path, G_FILE_TEST_IS_REGULAR)) + return -1; + + // check if file is of correct type + if (appimage_get_type(path, false) != 2) + return -1; + + char* md5 = appimage_get_md5(path); + + if (md5 == NULL) + return -1; + + unsigned long fs_offset = get_elf_size(path); + + sqfs fs; + + sqfs_err err = sqfs_open_image(&fs, path, fs_offset); + + if (err != SQFS_OK) { + free(md5); + sqfs_destroy(&fs); + return -1; + } + + gchar* desktop_filename = NULL; + + // a structure that will hold the information from the desktop file + GKeyFile* key_file = g_key_file_new(); + + if (!appimage_type2_get_desktop_filename_and_key_file(&fs, &desktop_filename, md5, &key_file, false)) { + // cleanup + free(md5); + free(desktop_filename); + sqfs_destroy(&fs); + g_key_file_free(key_file); + + return -1; + } + + // validate that both have been set to a non-NULL value + if (desktop_filename == NULL || key_file == NULL) { + // cleanup + free(md5); + sqfs_destroy(&fs); + g_free(desktop_filename); + g_key_file_free(key_file); + + return -1; + } + + // no longer used + free(md5); + + GError *error = NULL; + gboolean rv = g_key_file_get_boolean(key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TERMINAL, &error); + + // cleanup + free(desktop_filename); + sqfs_destroy(&fs); + g_key_file_free(key_file); + + int result; + + if (!rv) { + // if the key file hasn't been found and the error is not set to NOT_FOUND, return an error + if (error != NULL && error->code != G_KEY_FILE_ERROR_KEY_NOT_FOUND) + result = -1; + else + result = 0; + } else { + result = 1; + } + + if (error != NULL) + g_error_free(error); + + return result; +}; + +/* + * Checks whether an AppImage's desktop file has set NoDisplay=true. + * Useful to check whether the author of an AppImage doesn't want it to be integrated. + * + * Returns >0 if set, 0 if not set, <0 on errors. + */ +int appimage_is_terminal_app(const char *path) { + // check if file exists + if (!g_file_test(path, G_FILE_TEST_IS_REGULAR)) + return -1; + + int type = appimage_get_type(path, false); + + switch (type) { + case 1: + return appimage_type1_is_terminal_app(path); + case 2: + return appimage_type2_is_terminal_app(path); + default: + return -1; + } +} + char* appimage_registered_desktop_file_path(const char *path, char *md5, bool verbose) { glob_t pglob = {}; @@ -1340,10 +1524,12 @@ int appimage_register_in_system(const char *path, bool verbose) switch (type) { case 1: - appimage_type1_register_in_system(path, verbose); + if (!appimage_type1_register_in_system(path, verbose)) + return 1; break; case 2: - appimage_type2_register_in_system(path, verbose); + if (!appimage_type2_register_in_system(path, verbose)) + return 1; break; default: #ifdef STANDALONE @@ -1352,16 +1538,6 @@ int appimage_register_in_system(const char *path, bool verbose) return 1; } - if (type == 1) { - if (!appimage_type1_register_in_system(path, verbose)) - return 1; - } - - if (type == 2) { - if (!appimage_type2_register_in_system(path, verbose)) - return 1; - } - return 0; } From 326f0be4cbe4382a4277ce484b511262c7192ce3 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 5 Apr 2018 22:33:24 +0200 Subject: [PATCH 141/544] Add unit tests --- tests/data/appimagetool-x86_64.AppImage | Bin 0 -> 528288 bytes tests/fixtures.h | 2 ++ tests/test_shared.cpp | 24 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+) create mode 100755 tests/data/appimagetool-x86_64.AppImage diff --git a/tests/data/appimagetool-x86_64.AppImage b/tests/data/appimagetool-x86_64.AppImage new file mode 100755 index 0000000000000000000000000000000000000000..900aee5505b2a91ddbca278b25b4f824d1676e5d GIT binary patch literal 528288 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�NjE;n8#prE^UC9 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≀}+|%&yaL4A<1=>Ef=jEK=ST%TZ7qr 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%0AoC>jHy>!&fq)F; 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures.h b/tests/fixtures.h index 73dac3b0c..c97f9d6e1 100644 --- a/tests/fixtures.h +++ b/tests/fixtures.h @@ -21,6 +21,7 @@ class AppImageKitTest : public ::testing::Test { protected: std::string appImage_type_1_file_path; std::string appImage_type_2_file_path; + std::string appImage_type_2_terminal_file_path; public: AppImageKitTest() { @@ -55,6 +56,7 @@ class AppImageKitTest : public ::testing::Test { appImage_type_1_file_path = std::string(TEST_DATA_DIR) + "/AppImageExtract_6-x86_64.AppImage"; appImage_type_2_file_path = std::string(TEST_DATA_DIR) + "/Echo-x86_64.AppImage"; + appImage_type_2_terminal_file_path = std::string(TEST_DATA_DIR) + "/appimagetool-x86_64.AppImage"; }; ~AppImageKitTest() { diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index ea5377bf3..3777e18e4 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -141,6 +141,30 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { ASSERT_EQ(installedLines.size(), 0); } +TEST_F(SharedCTest, test_appimage_type1_is_terminal_app) { + // TODO: add type 1 AppImage with Terminal=true + //EXPECT_EQ(appimage_is_terminal_app(appImage_type_1_terminal_file_path.c_str()), 1); + EXPECT_EQ(appimage_type1_is_terminal_app(appImage_type_1_file_path.c_str()), 0); + EXPECT_EQ(appimage_type1_is_terminal_app(appImage_type_2_file_path.c_str()), -1); + EXPECT_EQ(appimage_type1_is_terminal_app("/invalid/path"), -1); +} + +TEST_F(SharedCTest, test_appimage_type2_is_terminal_app) { + EXPECT_EQ(appimage_type2_is_terminal_app(appImage_type_1_file_path.c_str()), -1); + EXPECT_EQ(appimage_type2_is_terminal_app(appImage_type_2_terminal_file_path.c_str()), 1); + EXPECT_EQ(appimage_type2_is_terminal_app(appImage_type_2_file_path.c_str()), 0); + EXPECT_EQ(appimage_type2_is_terminal_app("/invalid/path"), -1); +} + +TEST_F(SharedCTest, test_appimage_is_terminal_app) { + EXPECT_EQ(appimage_is_terminal_app(appImage_type_1_file_path.c_str()), 0); + EXPECT_EQ(appimage_is_terminal_app(appImage_type_2_file_path.c_str()), 0); + // TODO: add type 1 AppImage with Terminal=true + //EXPECT_EQ(appimage_is_terminal_app(appImage_type_1_terminal_file_path.c_str()), 1); + //EXPECT_EQ(appimage_is_terminal_app(appImage_type_2_terminal_file_path.c_str()), 1); + EXPECT_EQ(appimage_is_terminal_app("/invalid/path"), -1); +} + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); From c52be8b24b1709757b2132a52c48e3bc38d7600f Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 5 Apr 2018 22:36:10 +0200 Subject: [PATCH 142/544] Fix Debian package file paths --- CMakeLists.txt | 3 --- cmake/cpack_debs.cmake | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7dde93f28..ac30c98e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,9 +58,6 @@ set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) -# write version information for CPack to files -file(WRITE ${PROJECT_BINARY_DIR}/GIT_COMMIT "${GIT_COMMIT}") - ########################## # configure dependencies # diff --git a/cmake/cpack_debs.cmake b/cmake/cpack_debs.cmake index e97dfb02d..7d8e23e23 100644 --- a/cmake/cpack_debs.cmake +++ b/cmake/cpack_debs.cmake @@ -21,8 +21,8 @@ message("CPACK_DEBIAN_PACKAGE_ARCHITECTURE: ${CPACK_DEBIAN_PACKAGE_ARCHITECTURE} set(CPACK_DEBIAN_PACKAGE_MAINTAINER "AppImage Team") set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://appimage.org/") set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) -set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md") -set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE") +set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.md") +set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE") set(CPACK_DEBIAN_LIBAPPIMAGE_PACKAGE_NAME "libappimage") set(CPACK_DEBIAN_LIBAPPIMAGE_PACKAGE_DEPENDS "libarchive13, libc6 (>= 2.4), libglib2.0-0, zlib1g, fuse") From 842d68341596a75e598d327cdc3f05cb036670e3 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 6 Apr 2018 00:48:10 +0200 Subject: [PATCH 143/544] Fix i686 build issues --- cmake/dependencies.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index d963f904f..a8e429760 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -81,7 +81,8 @@ ExternalProject_Add(squashfuse COMMAND automake --force-missing --add-missing COMMAND autoreconf -fi || true COMMAND sed -i "/PKG_CHECK_MODULES.*/,/,:./d" configure # https://github.com/vasi/squashfuse/issues/12 - COMMAND CC=${CC} CXX=${CXX} ./configure --disable-demo --disable-high-level --without-lzo --without-lz4 --prefix= --libdir=/lib --with-xz=${xz_PREFIX} + COMMAND sed -i "s/typedef off_t sqfs_off_t/typedef int64_t sqfs_off_t/g" common.h # off_t's size might differ, see https://stackoverflow.com/a/9073762 + COMMAND CC=${CC} CXX=${CXX} /configure --disable-demo --disable-high-level --without-lzo --without-lz4 --prefix= --libdir=/lib --with-xz=${xz_PREFIX} COMMAND sed -i "s|XZ_LIBS = -llzma |XZ_LIBS = -Bstatic ${xz_LIBRARIES}/|g" Makefile BUILD_COMMAND make BUILD_IN_SOURCE ON From 93a062d8d8614874d99810c2d24f1a7f512af0a2 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 10 Apr 2018 02:13:33 +0200 Subject: [PATCH 144/544] Update appimagetool AppImage --- tests/data/appimagetool-x86_64.AppImage | Bin 528288 -> 528288 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/data/appimagetool-x86_64.AppImage b/tests/data/appimagetool-x86_64.AppImage index 900aee5505b2a91ddbca278b25b4f824d1676e5d..d07dcc71932a7b50543a592cd6c2bff2b189a4df 100755 GIT binary patch delta 110146 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%0AGbQCa4#V1Ehi`fKSHJj6gKN-FlW5j>( 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ⅇ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 From 0dbd6a66bd7b5720b0b93501dafaea2a5c295040 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 10 Apr 2018 02:18:59 +0200 Subject: [PATCH 145/544] Support for X-AppImage-Version, mk. 1 Lacks multi-locale support. Support for libappimage and appimaged only, not (yet) for appimagetool. --- src/shared.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/src/shared.c b/src/shared.c index b1bb961b3..35acebb00 100644 --- a/src/shared.c +++ b/src/shared.c @@ -634,6 +634,63 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag } #endif + { + char* appimage_version = g_key_file_get_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, "X-AppImage-Version", NULL); + + if (appimage_version != NULL) { + // TODO: support for multiple locales + // the following code snippet is prepared for multiple locales, we just need to add all possible locales + // NULL refers to the key without the locale tag + static const gchar* locales[] = {NULL}; + + for (int i = 0; i < (sizeof(locales) / sizeof(gchar*)); i++) { + const gchar* locale = locales[i]; + + // check whether the key is set at all + gchar* old_contents; + + // it's a little annoying that the GLib functions don't simply work with NULL as the locale, that'd + // make the following if-else construct unnecessary + if (locale == NULL) { + old_contents = g_key_file_get_string( + key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, NULL + ); + } else { + old_contents = g_key_file_get_locale_string( + key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, locale, NULL + ); + } + + // continue to next key if not set + if (old_contents == NULL) { + continue; + } + + // copy key's original contents + static const gchar old_key[] = "X-AppImage-Old-Name"; + + // append AppImage version + gchar* new_contents = g_strdup_printf("%s (%s)", old_contents, appimage_version); + + // see comment for above if-else construct + if (locale == NULL) { + g_key_file_set_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, old_key, old_contents); + g_key_file_set_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, new_contents); + } else { + g_key_file_set_locale_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, old_key, locale, old_contents); + g_key_file_set_locale_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, locale, new_contents); + } + + // cleanup + g_free(old_contents); + g_free(new_contents); + } + } + + // cleanup + g_free(appimage_version); + } + gchar *icon_path = g_key_file_get_value(key_file_structure, "Desktop Entry", "Icon", NULL); gchar *basename = g_path_get_basename(icon_path); @@ -665,7 +722,6 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag g_free(buf); } - /* https://specifications.freedesktop.org/menu-spec/menu-spec-latest.html#paths says: * * $XDG_DATA_DIRS/applications/ From 678cb625974f70d6f72017326d4797dffaea63f5 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 10 Apr 2018 02:20:06 +0200 Subject: [PATCH 146/544] Unit tests for X-AppImage-Version, mk. 1 --- tests/fixtures.h | 2 ++ tests/test_libappimage.cpp | 62 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/tests/fixtures.h b/tests/fixtures.h index c97f9d6e1..3288b415f 100644 --- a/tests/fixtures.h +++ b/tests/fixtures.h @@ -21,6 +21,7 @@ class AppImageKitTest : public ::testing::Test { protected: std::string appImage_type_1_file_path; std::string appImage_type_2_file_path; + std::string appImage_type_2_versioned_path; std::string appImage_type_2_terminal_file_path; public: @@ -56,6 +57,7 @@ class AppImageKitTest : public ::testing::Test { appImage_type_1_file_path = std::string(TEST_DATA_DIR) + "/AppImageExtract_6-x86_64.AppImage"; appImage_type_2_file_path = std::string(TEST_DATA_DIR) + "/Echo-x86_64.AppImage"; + appImage_type_2_versioned_path = std::string(TEST_DATA_DIR) + "/Echo-test1234-x86_64.AppImage"; appImage_type_2_terminal_file_path = std::string(TEST_DATA_DIR) + "/appimagetool-x86_64.AppImage"; }; diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index b18ddabf1..b2374758a 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -351,6 +352,67 @@ namespace AppImageTests { free(desktop_file_path); } + TEST_F(LibAppImageTest, test_appimage_type2_appimage_version) { + EXPECT_TRUE(appimage_type2_register_in_system(appImage_type_2_versioned_path.c_str(), false)); + + char* desktopFilePath = appimage_registered_desktop_file_path(appImage_type_2_versioned_path.c_str(), NULL, false); + + GKeyFile *desktopFile = g_key_file_new(); + + GError* error = NULL; + + gboolean loaded = g_key_file_load_from_file(desktopFile, desktopFilePath, G_KEY_FILE_KEEP_TRANSLATIONS, &error); + + if (!loaded) { + g_key_file_free(desktopFile); + ADD_FAILURE() << "Failed to read desktop file: " << error->message; + g_error_free(error); + return; + } + + const std::string versionKey = "X-AppImage-Version"; + const std::string oldNameKey = "X-AppImage-Old-Name"; + + std::string expectedVersion = "test1234"; + gchar* actualVersion = g_key_file_get_string(desktopFile, G_KEY_FILE_DESKTOP_GROUP, versionKey.c_str(), &error); + + if (actualVersion == NULL) { + g_key_file_free(desktopFile); + ADD_FAILURE() << "Failed to get " << versionKey << " key: " << error->message; + g_error_free(error); + return; + } + + EXPECT_EQ(expectedVersion, std::string(actualVersion)); + + gchar* oldName = g_key_file_get_string(desktopFile, G_KEY_FILE_DESKTOP_GROUP, oldNameKey.c_str(), &error); + + if (oldName == NULL) { + g_key_file_free(desktopFile); + ADD_FAILURE() << "Failed to get " << oldNameKey << " key: " << error->message; + g_error_free(error); + return; + } + + gchar* newName = g_key_file_get_string(desktopFile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, &error); + + if (newName == NULL) { + g_key_file_free(desktopFile); + ADD_FAILURE() << "Failed to get " << G_KEY_FILE_DESKTOP_KEY_NAME << " key: " << error->message; + g_error_free(error); + return; + } + + std::string expectedName = std::string(oldName) + " (" + expectedVersion + ")"; + + EXPECT_EQ(expectedName, std::string(newName)); + + // cleanup + g_key_file_free(desktopFile); + if (error != NULL) + g_error_free(error); + } + } // namespace int main(int argc, char **argv) { From ef1a238373be5caf2241a99b36b735e7265eef39 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 10 Apr 2018 04:24:02 +0200 Subject: [PATCH 147/544] Fix nasty bug in memory management when VERSION is set The destination pointer was set to a pointer of a variable on the stack, which, as soon as the variable got out of scope, became invalid. However, the value existed under this address until the next char array of size PATH_MAX was allocated on stack. The value the destination pointer pointed to has then been the appdata file's path. Therefore, an AppImage was created under that path. The fix was simple: just create a new memory buffer by using strdup(). As the memory is allocated on the heap, the pointer remains valid until the memory is free'd explicitly. It appears to me like nobody has used the VERSION environment variable before to have appimagetool choose the right filename. Even linuxdeployqt chooses the filename based on VERSION and passes it explicitly to appimagetool. Therefore, it hasn't been discovered since @probonopd introduced the VERSION stuff in 2016. --- src/appimagetool.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 514d2bee8..fc3a5c102 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -634,10 +634,11 @@ main (int argc, char *argv[]) if (version_env!=NULL) sprintf (dest_path, "%s-%s-%s.AppImage", app_name_for_filename, version_env, arch); - - destination = dest_path; + + destination = strdup(dest_path); replacestr(destination, " ", "_"); } + fprintf (stdout, "%s should be packaged as %s\n", source, destination); /* Check if the Icon file is how it is expected */ gchar* icon_name = get_desktop_entry(kf, "Icon"); From bc339d2210fca95d95f682c5a20c0718ea199be4 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 10 Apr 2018 04:35:42 +0200 Subject: [PATCH 148/544] X-AppImage-Version support, mk. 2 (appimagetool support) Whenever VERSION is set in the environment, it will be embedded in the desktop file. Side effect: the desktop file is being edited. This might not be desirable for users. CC @probonopd --- src/appimagetool.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index fc3a5c102..2c7a779ad 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -581,7 +581,7 @@ main (int argc, char *argv[]) /* Read information from .desktop file */ GKeyFile *kf = g_key_file_new (); - if (!g_key_file_load_from_file (kf, desktop_file, 0, NULL)) + if (!g_key_file_load_from_file (kf, desktop_file, G_KEY_FILE_KEEP_TRANSLATIONS | G_KEY_FILE_KEEP_COMMENTS, NULL)) die(".desktop file cannot be parsed"); if(verbose){ @@ -627,13 +627,19 @@ main (int argc, char *argv[]) /* No destination has been specified, to let's construct one * TODO: Find out the architecture and use a $VERSION that might be around in the env */ char dest_path[PATH_MAX]; - sprintf (dest_path, "%s-%s.AppImage", app_name_for_filename, arch); - - if(verbose) - fprintf (stderr,"dest_path: %s\n", dest_path); - - if (version_env!=NULL) - sprintf (dest_path, "%s-%s-%s.AppImage", app_name_for_filename, version_env, arch); + sprintf(dest_path, "%s-%s.AppImage", app_name_for_filename, arch); + + if (version_env != NULL) { + sprintf(dest_path, "%s-%s-%s.AppImage", app_name_for_filename, version_env, arch); + + // set VERSION in desktop file and save it + g_key_file_set_string(kf, G_KEY_FILE_DESKTOP_GROUP, "X-AppImage-Version", version_env); + + if (!g_key_file_save_to_file(kf, desktop_file, NULL)) { + fprintf(stderr, "Could not save modified desktop file\n"); + exit(1); + } + } destination = strdup(dest_path); replacestr(destination, " ", "_"); From 0b44476a94d55bce077d1e5200f31dded56938c3 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 10 Apr 2018 23:49:37 +0200 Subject: [PATCH 149/544] Fix error comparison --- src/shared.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared.c b/src/shared.c index 35acebb00..f12b43e64 100644 --- a/src/shared.c +++ b/src/shared.c @@ -1360,7 +1360,7 @@ int appimage_type1_is_terminal_app(const char* path) { if (!rv) { // if the key file hasn't been found and the error is not set to NOT_FOUND, return an error - if (error == G_KEY_FILE_ERROR_NOT_FOUND) + if (error->code != G_KEY_FILE_ERROR_NOT_FOUND) result = -1; else result = 0; From 719776b37e9e0aab51a2e47154b039c073703ac3 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 11 Apr 2018 05:26:48 +0200 Subject: [PATCH 150/544] Make sure to use custom glib --- build.sh | 3 +++ cmake/dependencies.cmake | 12 ++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index a4887644d..39dcc0878 100755 --- a/build.sh +++ b/build.sh @@ -69,6 +69,9 @@ git submodule update --init --recursive mkdir build cd build +# make sure that deps in separate install tree are found +export PKG_CONFIG_PATH=/deps/lib/pkgconfig/ + cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_TESTING=ON -DAPPIMAGEKIT_PACKAGE_DEBS=ON make -j$JOBS make install DESTDIR=install_prefix/ diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index a8e429760..a63b745f5 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -1,12 +1,20 @@ # find required system dependencies via pkg-config find_package(PkgConfig REQUIRED) -pkg_check_modules(GLIB REQUIRED glib-2.0) -pkg_check_modules(GIO REQUIRED gio-2.0) +pkg_check_modules(GLIB REQUIRED glib-2.0>=2.40) +pkg_check_modules(GIO REQUIRED gio-2.0>=2.40) pkg_check_modules(ZLIB REQUIRED zlib) pkg_check_modules(CAIRO REQUIRED cairo) pkg_check_modules(OPENSSL REQUIRED openssl) pkg_check_modules(FUSE REQUIRED fuse) +if(GLIB_LIBRARY_DIRS) + link_directories(${GLIB_LIBRARY_DIRS}) +endif() + +if(GIO_LIBRARY_DIRS) + link_directories(${GLIB_LIBRARY_DIRS}) +endif() + if(USE_CCACHE) message(STATUS "Using CCache to build AppImageKit dependencies") From 6c72c5725bfc4b91bb16a43abe58cec0513d558d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 11 Apr 2018 05:31:42 +0200 Subject: [PATCH 151/544] Deploy glib to official AppImages --- build-appdirs.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/build-appdirs.sh b/build-appdirs.sh index 96a875635..3259ad0f3 100644 --- a/build-appdirs.sh +++ b/build-appdirs.sh @@ -29,6 +29,12 @@ ln -s "$APPIMAGETOOL_APPDIR"/appimagetool.svg "$APPIMAGETOOL_APPDIR"/.DirIcon mkdir -p "$APPIMAGETOOL_APPDIR"/usr/share/metainfo cp ../resources/usr/share/metainfo/appimagetool.appdata.xml "$APPIMAGETOOL_APPDIR"/usr/share/metainfo/ +if [ -d /deps/ ]; then + # deploy glib + mkdir -p "$APPIMAGETOOL_APPDIR"/usr/lib/ + cp /deps/lib/libglib-2.0.so* "$APPIMAGETOOL_APPDIR"/usr/lib/ +fi + ####################################################################### # build appimaged AppDir @@ -48,3 +54,9 @@ cp ../resources/AppRun "$APPIMAGED_APPDIR"/ cp ../resources/appimaged.desktop "$APPIMAGED_APPDIR"/ cp ../resources/appimagetool.svg "$APPIMAGED_APPDIR"/appimaged.svg ( cd "$APPIMAGED_APPDIR"/ ; ln -s appimaged.svg .DirIcon ) + +if [ -d /deps/ ]; then + # deploy glib + mkdir -p "$APPIMAGED_APPDIR"/usr/lib/ + cp /deps/lib/libglib-2.0.so* "$APPIMAGED_APPDIR"/usr/lib/ +fi From 885cdf580bbbe8ef41a4522cc550a0cfd77cf4c0 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 11 Apr 2018 05:34:52 +0200 Subject: [PATCH 152/544] Fix library issue --- build.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.sh b/build.sh index 39dcc0878..a83f1e493 100755 --- a/build.sh +++ b/build.sh @@ -76,6 +76,10 @@ cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_T make -j$JOBS make install DESTDIR=install_prefix/ +if [ -d /deps/lib ]; then + export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":/deps/lib/ +fi + if [ $RUN_TESTS -ne 0 ]; then ctest -V fi From 3abcb56a5c3aaf17c5f6b9c8477076b33f3aa256 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 11 Apr 2018 14:54:21 +0200 Subject: [PATCH 153/544] Debug segfault, mk. 1 --- build.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.sh b/build.sh index a83f1e493..338caf800 100755 --- a/build.sh +++ b/build.sh @@ -80,6 +80,8 @@ if [ -d /deps/lib ]; then export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":/deps/lib/ fi +ldd tests/test_* + if [ $RUN_TESTS -ne 0 ]; then ctest -V fi From 2e2be8defabaf5df382de5c2f6238de57bece145 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 11 Apr 2018 21:46:57 +0200 Subject: [PATCH 154/544] Add missing test file --- tests/data/Echo-test1234-x86_64.AppImage | Bin 0 -> 180128 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 tests/data/Echo-test1234-x86_64.AppImage diff --git a/tests/data/Echo-test1234-x86_64.AppImage b/tests/data/Echo-test1234-x86_64.AppImage new file mode 100755 index 0000000000000000000000000000000000000000..4e893a3c807f58cbb81b09754683646388d7bacd GIT binary patch literal 180128 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�NjE;n8#prE^UC9 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 Date: Wed, 11 Apr 2018 22:56:31 +0200 Subject: [PATCH 155/544] Fix error comparison --- src/shared.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared.c b/src/shared.c index f12b43e64..1235b7bc1 100644 --- a/src/shared.c +++ b/src/shared.c @@ -1360,7 +1360,7 @@ int appimage_type1_is_terminal_app(const char* path) { if (!rv) { // if the key file hasn't been found and the error is not set to NOT_FOUND, return an error - if (error->code != G_KEY_FILE_ERROR_NOT_FOUND) + if (error->code != G_KEY_FILE_ERROR_KEY_NOT_FOUND) result = -1; else result = 0; From e246cb5e381b11fcd5ff37fc3f08a6cc87cd6827 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 11 Apr 2018 22:59:22 +0200 Subject: [PATCH 156/544] Check whether test files exist --- tests/fixtures.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/fixtures.h b/tests/fixtures.h index 3288b415f..5703eeffc 100644 --- a/tests/fixtures.h +++ b/tests/fixtures.h @@ -59,6 +59,11 @@ class AppImageKitTest : public ::testing::Test { appImage_type_2_file_path = std::string(TEST_DATA_DIR) + "/Echo-x86_64.AppImage"; appImage_type_2_versioned_path = std::string(TEST_DATA_DIR) + "/Echo-test1234-x86_64.AppImage"; appImage_type_2_terminal_file_path = std::string(TEST_DATA_DIR) + "/appimagetool-x86_64.AppImage"; + + EXPECT_TRUE(isFile(appImage_type_1_file_path)); + EXPECT_TRUE(isFile(appImage_type_2_file_path)); + EXPECT_TRUE(isFile(appImage_type_2_versioned_path)); + EXPECT_TRUE(isFile(appImage_type_2_terminal_file_path)); }; ~AppImageKitTest() { From 7517e517d22bb3ca0864677390a0b9921a85d114 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sun, 15 Apr 2018 23:50:05 +0200 Subject: [PATCH 157/544] Deploy other GLib libraries --- build-appdirs.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build-appdirs.sh b/build-appdirs.sh index 3259ad0f3..e33840074 100644 --- a/build-appdirs.sh +++ b/build-appdirs.sh @@ -32,7 +32,9 @@ cp ../resources/usr/share/metainfo/appimagetool.appdata.xml "$APPIMAGETOOL_APPDI if [ -d /deps/ ]; then # deploy glib mkdir -p "$APPIMAGETOOL_APPDIR"/usr/lib/ - cp /deps/lib/libglib-2.0.so* "$APPIMAGETOOL_APPDIR"/usr/lib/ + cp /deps/lib/libglib*-2.0.so* "$APPIMAGETOOL_APPDIR"/usr/lib/ + cp /deps/lib/libgio*-2.0.so* "$APPIMAGETOOL_APPDIR"/usr/lib/ + cp /deps/lib/libgobject*-2.0.so* "$APPIMAGETOOL_APPDIR"/usr/lib/ fi ####################################################################### From 16d9dc140c5da52d57a5d6bc9b176b1f98ba5eef Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 16 Apr 2018 00:09:10 +0200 Subject: [PATCH 158/544] Fix appimaged deployment --- build-appdirs.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build-appdirs.sh b/build-appdirs.sh index e33840074..f51f34a35 100644 --- a/build-appdirs.sh +++ b/build-appdirs.sh @@ -60,5 +60,7 @@ cp ../resources/appimagetool.svg "$APPIMAGED_APPDIR"/appimaged.svg if [ -d /deps/ ]; then # deploy glib mkdir -p "$APPIMAGED_APPDIR"/usr/lib/ - cp /deps/lib/libglib-2.0.so* "$APPIMAGED_APPDIR"/usr/lib/ + cp /deps/lib/libglib*-2.0.so* "$APPIMAGED_APPDIR"/usr/lib/ + cp /deps/lib/libgio*-2.0.so* "$APPIMAGED_APPDIR"/usr/lib/ + cp /deps/lib/libgobject*-2.0.so* "$APPIMAGED_APPDIR"/usr/lib/ fi From 4041ef0814f4b5442a942e17945e7949b4f36002 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 16 Apr 2018 00:30:13 +0200 Subject: [PATCH 159/544] Try copying all dependencies --- build-appdirs.sh | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/build-appdirs.sh b/build-appdirs.sh index f51f34a35..29ae299ed 100644 --- a/build-appdirs.sh +++ b/build-appdirs.sh @@ -32,9 +32,7 @@ cp ../resources/usr/share/metainfo/appimagetool.appdata.xml "$APPIMAGETOOL_APPDI if [ -d /deps/ ]; then # deploy glib mkdir -p "$APPIMAGETOOL_APPDIR"/usr/lib/ - cp /deps/lib/libglib*-2.0.so* "$APPIMAGETOOL_APPDIR"/usr/lib/ - cp /deps/lib/libgio*-2.0.so* "$APPIMAGETOOL_APPDIR"/usr/lib/ - cp /deps/lib/libgobject*-2.0.so* "$APPIMAGETOOL_APPDIR"/usr/lib/ + cp /deps/lib/lib*.so* "$APPIMAGETOOL_APPDIR"/usr/lib/ fi ####################################################################### @@ -60,7 +58,5 @@ cp ../resources/appimagetool.svg "$APPIMAGED_APPDIR"/appimaged.svg if [ -d /deps/ ]; then # deploy glib mkdir -p "$APPIMAGED_APPDIR"/usr/lib/ - cp /deps/lib/libglib*-2.0.so* "$APPIMAGED_APPDIR"/usr/lib/ - cp /deps/lib/libgio*-2.0.so* "$APPIMAGED_APPDIR"/usr/lib/ - cp /deps/lib/libgobject*-2.0.so* "$APPIMAGED_APPDIR"/usr/lib/ + cp /deps/lib/lib*.so* "$APPIMAGED_APPDIR"/usr/lib/ fi From 8441485e458b4bd5f6bdaed40d08960f9c9b20cf Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 16 Apr 2018 00:54:19 +0200 Subject: [PATCH 160/544] Bundle libffi --- build-appdirs.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/build-appdirs.sh b/build-appdirs.sh index 29ae299ed..c4dc492b8 100644 --- a/build-appdirs.sh +++ b/build-appdirs.sh @@ -33,6 +33,10 @@ if [ -d /deps/ ]; then # deploy glib mkdir -p "$APPIMAGETOOL_APPDIR"/usr/lib/ cp /deps/lib/lib*.so* "$APPIMAGETOOL_APPDIR"/usr/lib/ + # libffi is a runtime dynamic dependency + # see this thread for more information on the topic: + # https://mail.gnome.org/archives/gtk-devel-list/2012-July/msg00062.html + cp /usr/lib*/libffi.so.5 "$APPIMAGED_APPDIR"/usr/lib/ fi ####################################################################### @@ -59,4 +63,8 @@ if [ -d /deps/ ]; then # deploy glib mkdir -p "$APPIMAGED_APPDIR"/usr/lib/ cp /deps/lib/lib*.so* "$APPIMAGED_APPDIR"/usr/lib/ + # libffi is a runtime dynamic dependency + # see this thread for more information on the topic: + # https://mail.gnome.org/archives/gtk-devel-list/2012-July/msg00062.html + cp /usr/lib*/libffi.so.5 "$APPIMAGED_APPDIR"/usr/lib/ fi From 8474af3c3cea0b9df8946e8da26aac9fb8c8b69d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 16 Apr 2018 01:01:47 +0200 Subject: [PATCH 161/544] Fix libffi deployment --- build-appdirs.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/build-appdirs.sh b/build-appdirs.sh index c4dc492b8..fb0eb13b4 100644 --- a/build-appdirs.sh +++ b/build-appdirs.sh @@ -36,7 +36,11 @@ if [ -d /deps/ ]; then # libffi is a runtime dynamic dependency # see this thread for more information on the topic: # https://mail.gnome.org/archives/gtk-devel-list/2012-July/msg00062.html - cp /usr/lib*/libffi.so.5 "$APPIMAGED_APPDIR"/usr/lib/ + if [ "$ARCH" == "x86_64" ]; then + cp /usr/lib64/libffi.so.5 "$APPIMAGETOOL_APPDIR"/usr/lib/ + else + cp /usr/lib/libffi.so.5 "$APPIMAGETOOL_APPDIR"/usr/lib/ + fi fi ####################################################################### @@ -66,5 +70,9 @@ if [ -d /deps/ ]; then # libffi is a runtime dynamic dependency # see this thread for more information on the topic: # https://mail.gnome.org/archives/gtk-devel-list/2012-July/msg00062.html - cp /usr/lib*/libffi.so.5 "$APPIMAGED_APPDIR"/usr/lib/ + if [ "$ARCH" == "x86_64" ]; then + cp /usr/lib64/libffi.so.5 "$APPIMAGED_APPDIR"/usr/lib/ + else + cp /usr/lib/libffi.so.5 "$APPIMAGED_APPDIR"/usr/lib/ + fi fi From cc66e7efdab2cf44cb8ba78b3c2e12d5549640ee Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 16 Apr 2018 14:11:47 +0200 Subject: [PATCH 162/544] Fix AppImageExtract's desktop file --- tests/data/AppImageExtract_6-x86_64.AppImage | Bin 655360 -> 655360 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/data/AppImageExtract_6-x86_64.AppImage b/tests/data/AppImageExtract_6-x86_64.AppImage index 4cfddc7de257fdf1399c5cd5b9cf0ff25fdc8941..20c26980179577510d964761cbc46ab3fb724355 100755 GIT binary patch delta 2257 zcmb_cT}YEr7(VYd=jYNiG53joGfh{PO=m*|O;cACiDaS4DoKp~>>ueubQVle2uawd z>j$G?^TrgbX@3erKXjuvAwjapi`~S$NKk|7eBU`ox7-Fs2e$L>oacGo=RNN^Gn=($ zvvz3EtZY(5g{%0Hr{-o^Ql2h1+mM};t;@;P=}?X?+h?I?8d8NiD{v#`#&*S>j=>df zN3*QR2fBuf)(l_uk&9i$3oCl-^6Alu0@O>wC#0>sg3uwpWH?4a#Tjb3x})_uOv{c zx}}1tGH)Un@P~O}wXkA;<3RCwiC7a^RCCzxiHusQ)bC8d`=S|h;fpD z?IQH{Gcg*14XI<9VDUIXryk>R_pq>W1FVjoD_u*KM?R4T^oyqO;Hl18YD*&ph423ryA!QU2g(3$;#E5{fBncO$p>W}JFXTr3MFpXD01_mU z-X95790~yix`9fFg_6lgF^HTbI)btf3Z-mZo|J}8Dqg7WgB1F}gqA)yNIdbx%tq$v zOCRiFsAwDP^RLxtgZS7o;-G9HLJT4nsDlSK$XYFWjg9X%*cI(twESq*VPW0@+x#YT zp1%wBaOR13fZi`mIO%}6e>}}|$Utf__%>9SbHHx@*>(=#drvE_7yzwQaiX~Jcg474 z9H0wlPmQ!S)+wz+5Y2c&Y8iq!hU)JHy>u1)2#Z(2f=Y?`Qj0OqmUjLE1XakHO_aazU=kXWtZ1c(~ zOhE#R3%p{}6zpK@x2NC$i)W`GC(z?bp9U?(Igd=ko7JP9@k-(qn`U53Br(nYew5Cv zdAJs8b$Q)1mlxYBHo0JXfQ#U~=YpnC=9zaxg4Q<;KtZ6MncR>Ts3}%APU-*DouAxr zQw`Uj9g{stc5?2p#Yl@rX3@wk8pU%>2=~67E9UH6ahSu-&4iw5=iDI}rCjtp>Tcxz E0HfFhJpcdz delta 2392 zcmb_cUrbw77(ZYCUdUz_vK96xD!O4u2D`MSVNGga8;F{b#^L57lR?+bZnO|+3?tPR zmH^SjOv$*T8Z+ZVyF{_1vI{j3mc1B#fd`cr4G(*0Obld-!R*1EbI&cTQt5TP$WvO~y>&qGF4|o&F{k(LL=FkJN}YwW71OP85+{tWi0}mf-m) zpw2)j+}m-bYM}2*$QSAD7zp^gA{YH3e{aASY3S*BIoNU0-`J01eBsUO_V%uhu)i;S z%HP`;=nhr&*Qp(w_MO!nuUa{+7^R1TI}9I>PUdKjMszQ#SUyG@JvP+B(xDIP*K>GV zD}&^{4n^|7Rd5<}ng0uu_lu&|@cuv3(MP1~zns3WwJv5M*;9>5yfk<;NnD-ps`E|7 zpX-Rfl>Fdv{_k}a-ojTDzj@nV#BWCE0x`x0TkS{JG8CI;BGmIHTYKp|)cw&PgxecG zE4j$)rE3yz#NV8Ltoy39v3Z_`@0g@V)v=kwb676nx2RfzvM+hA!(J0j!Q?7k9F+^; zB$t^WvIg$NGbKAV_?FMED8w!%g9rVC2e-*gB#_~amE+65Yqy>*5vr#$Z{DFijd-^# z%0YRMtnS;n?=#BI!YuXwc<=!2GmEolDCo=_-7jM}qsT!m2NH-OAo^qx?kbiCfKGbN zFuy95C!umD+fz-_g&W{x_f&c>1rCR5o8z^dFoFT~qXv3h!(9t8EO%+JWSRhv0x{u?ai}gQ9x_^+ z_P|qGI;7v@aJYo+uo~%KKlz%pmV|?}K6PpV^5st;v5j*pOM*i)OlnWUZXWe-WxRx3 zl&4GGHR)awYPI33ZsGgQq_*4wTO|d^mr98n*yKhnCj>xUfzI?`@SJHp1tmQH2_jNj zA~sb71CzTjjE+$b$A%5WFbp$#_fpWP-9OJ1lv5Ra%67+;->LZHsV-`#)TS zSGfJ_BG?PPvWg|Ju{gPP3FaTQVma@SJiBcfp0iN${6EPgSFb^zd3+`BMy}*#=hSF-hg?ibRh5dz^G@ivrYFA(WDGNiT&^moa_w_R)f~dov r9)E^}AR50L5d=XNgrber+c(X^+atn;F(GW2lCtouZo~4$wV?12+>;$e From e3ea524a640e27921cace758a117b1babefffdb7 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 16 Apr 2018 14:13:40 +0200 Subject: [PATCH 163/544] Add appimage_shall_not_be_integrated Also contains a bunch of fixes for appimage_is_terminal_app. --- include/appimage/appimage.h | 27 ++- src/shared.c | 199 ++++++++++++++++++- tests/data/Echo-no-integrate-x86_64.AppImage | Bin 0 -> 180128 bytes tests/fixtures.h | 3 + tests/test_shared.cpp | 33 ++- 5 files changed, 251 insertions(+), 11 deletions(-) create mode 100755 tests/data/Echo-no-integrate-x86_64.AppImage diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index 862cadd73..016b7fbf7 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -59,7 +59,6 @@ void appimage_string_list_free(char** list); /* * Checks whether a type 1 AppImage's desktop file has set Terminal=true. - * Useful to check whether the author of an AppImage doesn't want it to be integrated. * * Returns >0 if set, 0 if not set, <0 on errors. */ @@ -67,7 +66,6 @@ int appimage_type1_is_terminal_app(const char* path); /* * Checks whether a type 2 AppImage's desktop file has set Terminal=true. - * Useful to check whether the author of an AppImage doesn't want it to be integrated. * * Returns >0 if set, 0 if not set, <0 on errors. */ @@ -75,12 +73,35 @@ int appimage_type2_is_terminal_app(const char* path); /* * Checks whether an AppImage's desktop file has set Terminal=true. - * Useful to check whether the author of an AppImage doesn't want it to be integrated. * * Returns >0 if set, 0 if not set, <0 on errors. */ int appimage_is_terminal_app(const char* path); +/* + * Checks whether a type 1 AppImage's desktop file has set X-AppImage-Version=false. + * Useful to check whether the author of an AppImage doesn't want it to be integrated. + * + * Returns >0 if set, 0 if not set, <0 on errors. + */ +int appimage_type1_shall_not_be_integrated(const char* path); + +/* + * Checks whether a type 2 AppImage's desktop file has set X-AppImage-Version=false. + * Useful to check whether the author of an AppImage doesn't want it to be integrated. + * + * Returns >0 if set, 0 if not set, <0 on errors. + */ +int appimage_type2_shall_not_be_integrated(const char* path); + +/* + * Checks whether an AppImage's desktop file has set X-AppImage-Version=false. + * Useful to check whether the author of an AppImage doesn't want it to be integrated. + * + * Returns >0 if set, 0 if not set, <0 on errors. + */ +int appimage_shall_not_be_integrated(const char* path); + #ifdef __cplusplus } #endif diff --git a/src/shared.c b/src/shared.c index 1235b7bc1..e11fd81f9 100644 --- a/src/shared.c +++ b/src/shared.c @@ -1348,7 +1348,7 @@ int appimage_type1_is_terminal_app(const char* path) { } GError *error = NULL; - gboolean rv = g_key_file_get_boolean(key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, &error); + gboolean rv = g_key_file_get_boolean(key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TERMINAL, &error); // cleanup free(md5); @@ -1446,7 +1446,7 @@ int appimage_type2_is_terminal_app(const char* path) { else result = 0; } else { - result = 1; + result = 1; } if (error != NULL) @@ -1456,7 +1456,7 @@ int appimage_type2_is_terminal_app(const char* path) { }; /* - * Checks whether an AppImage's desktop file has set NoDisplay=true. + * Checks whether an AppImage's desktop file has set Terminal=true. * Useful to check whether the author of an AppImage doesn't want it to be integrated. * * Returns >0 if set, 0 if not set, <0 on errors. @@ -1478,6 +1478,199 @@ int appimage_is_terminal_app(const char *path) { } } +int appimage_type1_shall_not_be_integrated(const char* path) { + // check if file exists + if (!g_file_test(path, G_FILE_TEST_IS_REGULAR)) + return -1; + + // check if file is of correct type + if (appimage_get_type(path, false) != 1) + return -1; + + char* md5 = appimage_get_md5(path); + + if (md5 == NULL) + return -1; + + // open ISO9660 image using libarchive + struct archive *a = archive_read_new(); + archive_read_support_format_iso9660(a); + + // libarchive status int -- passed to called functions + int r; + + if ((r = archive_read_open_filename(a, path, 10240)) != ARCHIVE_OK) { + // cleanup + free(md5); + archive_read_free(a); + + return -1; + } + // search image for root desktop file, and read it into key file structure so it can be edited eventually + gchar *desktop_filename = NULL; + GKeyFile *key_file = NULL; + + if (!appimage_type1_get_desktop_filename_and_key_file(&a, &desktop_filename, &key_file)) { + // cleanup + free(md5); + archive_read_free(a); + g_free(desktop_filename); + g_key_file_free(key_file); + + return -1; + } + + // validate that both have been set to a non-NULL value + if (desktop_filename == NULL || key_file == NULL) { + // cleanup + free(md5); + archive_read_free(a); + g_free(desktop_filename); + g_key_file_free(key_file); + + return -1; + } + + GError *error = NULL; + gboolean rv = g_key_file_get_boolean(key_file, G_KEY_FILE_DESKTOP_GROUP, "X-AppImage-Integrate", &error); + + // cleanup + free(md5); + archive_read_free(a); + g_free(desktop_filename); + g_key_file_free(key_file); + + int result; + + if (!rv) { + // if the key file hasn't been found and the error is not set to NOT_FOUND, return an error + if (error != NULL) { + if (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND) + result = 0; + else + result = -1; + } + else { + result = 1; + } + } else { + result = 0; + } + + if (error != NULL) + g_error_free(error); + + return result; +}; + +int appimage_type2_shall_not_be_integrated(const char* path) { + // check if file exists + if (!g_file_test(path, G_FILE_TEST_IS_REGULAR)) + return -1; + + // check if file is of correct type + if (appimage_get_type(path, false) != 2) + return -1; + + char* md5 = appimage_get_md5(path); + + if (md5 == NULL) + return -1; + + unsigned long fs_offset = get_elf_size(path); + + sqfs fs; + + sqfs_err err = sqfs_open_image(&fs, path, fs_offset); + + if (err != SQFS_OK) { + free(md5); + sqfs_destroy(&fs); + return -1; + } + + gchar* desktop_filename = NULL; + + // a structure that will hold the information from the desktop file + GKeyFile* key_file = g_key_file_new(); + + if (!appimage_type2_get_desktop_filename_and_key_file(&fs, &desktop_filename, md5, &key_file, false)) { + // cleanup + free(md5); + free(desktop_filename); + sqfs_destroy(&fs); + g_key_file_free(key_file); + + return -1; + } + + // validate that both have been set to a non-NULL value + if (desktop_filename == NULL || key_file == NULL) { + // cleanup + free(md5); + sqfs_destroy(&fs); + g_free(desktop_filename); + g_key_file_free(key_file); + + return -1; + } + + // no longer used + free(md5); + + GError *error = NULL; + gboolean rv = g_key_file_get_boolean(key_file, G_KEY_FILE_DESKTOP_GROUP, "X-AppImage-Integrate", &error); + + // cleanup + free(desktop_filename); + sqfs_destroy(&fs); + g_key_file_free(key_file); + + int result; + + if (!rv) { + // if the key file hasn't been found and the error is not set to NOT_FOUND, return an error + if (error != NULL) { + if (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND) + result = 0; + else + result = -1; + } else { + result = 1; + } + } else { + result = 0; + } + + if (error != NULL) + g_error_free(error); + + return result; +}; + +/* + * Checks whether an AppImage's desktop file has set X-AppImage-Integrate=false. + * Useful to check whether the author of an AppImage doesn't want it to be integrated. + * + * Returns >0 if set, 0 if not set, <0 on errors. + */ +int appimage_shall_not_be_integrated(const char *path) { + // check if file exists + if (!g_file_test(path, G_FILE_TEST_IS_REGULAR)) + return -1; + + int type = appimage_get_type(path, false); + + switch (type) { + case 1: + return appimage_type1_shall_not_be_integrated(path); + case 2: + return appimage_type2_shall_not_be_integrated(path); + default: + return -1; + } +} + char* appimage_registered_desktop_file_path(const char *path, char *md5, bool verbose) { glob_t pglob = {}; diff --git a/tests/data/Echo-no-integrate-x86_64.AppImage b/tests/data/Echo-no-integrate-x86_64.AppImage new file mode 100755 index 0000000000000000000000000000000000000000..ab9b793bfde4677ab9de693f8029ebc83d731079 GIT binary patch literal 180128 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�NjE;n8#prE^UC9 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 Date: Mon, 16 Apr 2018 14:31:46 +0200 Subject: [PATCH 164/544] Adapt unit test to updated AppImageExtract AppImage --- tests/test_libappimage.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index b2374758a..e3febd5f6 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -235,17 +235,17 @@ namespace AppImageTests { char **files = appimage_list_files(appImage_type_1_file_path.c_str()); - char *expected[] = { - (char *) "AppImageExtract.desktop", - (char *) ".DirIcon", - (char *) "AppImageExtract.png", - (char *) "usr/bin/appimageextract", - (char *) "usr/bin/xorriso", - (char *) "usr/lib/libisofs.so.6", - (char *) "usr/lib/libisoburn.so.1", - (char *) "usr/lib/libburn.so.4", - (char *) "AppRun", - NULL}; + const char *expected[] = { + (char *) "AppImageExtract.desktop", + (char *) ".DirIcon", + (char *) "AppImageExtract.png", + (char *) "usr/bin/appimageextract", + (char *) "AppRun", + (char *) "usr/bin/xorriso", + (char *) "usr/lib/libburn.so.4", + (char *) "usr/lib/libisoburn.so.1", + (char *) "usr/lib/libisofs.so.6", + NULL}; int i = 0; for (; files[i] != NULL && expected[i] != NULL; i++) From 171b1706aeaec0e49eb3fd92bf7981cd100e1d87 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 17 Apr 2018 18:49:37 +0200 Subject: [PATCH 165/544] Use IMPORTED targets for all dependency libs Fixes #751. --- cmake/dependencies.cmake | 356 +++++++++++++++++++++++++-------------- src/CMakeLists.txt | 114 +++++-------- src/build-runtime.sh.in | 4 +- tests/CMakeLists.txt | 70 +++----- 4 files changed, 290 insertions(+), 254 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index a63b745f5..c03c187ac 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -1,19 +1,163 @@ +# required for pkg-config's IMPORTED_TARGET +cmake_minimum_required(VERSION 3.6) + # find required system dependencies via pkg-config find_package(PkgConfig REQUIRED) -pkg_check_modules(GLIB REQUIRED glib-2.0>=2.40) -pkg_check_modules(GIO REQUIRED gio-2.0>=2.40) -pkg_check_modules(ZLIB REQUIRED zlib) -pkg_check_modules(CAIRO REQUIRED cairo) -pkg_check_modules(OPENSSL REQUIRED openssl) -pkg_check_modules(FUSE REQUIRED fuse) - -if(GLIB_LIBRARY_DIRS) - link_directories(${GLIB_LIBRARY_DIRS}) -endif() -if(GIO_LIBRARY_DIRS) - link_directories(${GLIB_LIBRARY_DIRS}) -endif() + +# imports a library from the standard set of variables CMake creates when using its pkg-config module or find_package +# this is code shared by import_pkgconfig_target and import_external_project, hence it's been extracted into a separate +# CMake function +# +# partly inspired by https://github.com/Kitware/CMake/blob/master/Modules/FindPkgConfig.cmake#L187 +# +# positional parameters: +# - target_name: name of the target that should be created +# - variable_prefix: prefix of the variable that should be used to create the target from +function(import_library_from_prefix target_name variable_prefix) + message(STATUS "Importing target ${target_name} from variable prefix ${variable_prefix}") + + add_library(${target_name} INTERFACE IMPORTED) + + # FIXME: the following line produces CMake errors "directory not found" + # CMake does, however, not complain if the INCLUDE_DIRECTORIES property contains missing directories + # possibly related: https://cmake.org/Bug/view.php?id=15052 + #set_property(TARGET ${target_name} PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${variable_prefix}_INCLUDE_DIRS) + include_directories(${${variable_prefix}_INCLUDE_DIRS}) + + set_property(TARGET ${target_name} PROPERTY INTERFACE_LINK_LIBRARIES ${${variable_prefix}_LIBRARIES}) + + if(${variable_prefix}_CFLAGS_OTHER) + set_property(TARGET ${target_name} PROPERTY INTERFACE_COMPILE_OPTIONS ${${variable_prefix}_CFLAGS_OTHER}) + endif() + + if(${variable_prefix}_LIBRARY_DIRS) + link_directories(${${variable_prefix}_LIBRARY_DIRS}) + endif() + + # export some of the imported properties with the target name as prefix + # this is necessary to allow the other external projects, which are not built with CMake or not within the same + # CMake context, to link to the libraries built as external projects (or the system ones, depending on the build + # configuration) + set(${target_name}_INCLUDE_DIRS ${${variable_prefix}_INCLUDE_DIRS} CACHE INTERNAL "") + set(${target_name}_LIBRARIES ${${variable_prefix}_LIBRARIES} CACHE INTERNAL "") + set(${target_name}_LIBRARY_DIRS ${${variable_prefix}_LIBRARY_DIRS} CACHE INTERNAL "") + # TODO: the following might not always apply + set(${target_name}_PREFIX ${CMAKE_INSTALL_PREFIX}/lib CACHE INTERNAL "") + + message(STATUS "${variable_prefix}_LIBRARIES: ${${variable_prefix}_LIBRARIES}") +endfunction() + + +# imports a library using pkg-config +# +# positional parameters: +# - target_name: name of the target that we shall create for you +# - pkg_config_target: librar(y name to pass to pkg-config (may include a version) +function(import_pkgconfig_target target_name pkg_config_target) + message(STATUS "Importing target ${target_name} via pkg-config (${pkg_config_target})") + + pkg_check_modules(${target_name}-IMPORTED REQUIRED ${pkg_config_target}) + + import_library_from_prefix(${target_name} ${target_name}-IMPORTED) +endfunction() + +function(import_find_pkg_target target_name pkg_name variable_prefix) + message(STATUS "Importing target ${target_name} via find_package (${pkg_name})") + + find_package(${pkg_name}) + if(NOT ${pkg_name}_FOUND) + message(FATAL_ERROR "${pkg_name} could not be found on the system. You will have to either install it, or use the bundled package.") + endif() + + import_library(${prefix}) +endfunction() + + +# imports a library from an existing external project +# +# required parameters: +# - TARGET_NAME: +function(import_external_project) + set(oneValueArgs TARGET_NAME EXT_PROJECT_NAME) + set(multiValueArgs LIBRARIES INCLUDE_DIRS LIBRARY_DIRS) + cmake_parse_arguments(IMPORT_EXTERNAL_PROJECT "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") + + # check whether parameters have been set + if(NOT IMPORT_EXTERNAL_PROJECT_TARGET_NAME) + message(FATAL_ERROR "TARGET_NAME parameter missing, but is required") + endif() + if(NOT IMPORT_EXTERNAL_PROJECT_EXT_PROJECT_NAME) + message(FATAL_ERROR "EXT_PROJECT_NAME parameter missing, but is required") + endif() + if(NOT IMPORT_EXTERNAL_PROJECT_LIBRARIES) + message(FATAL_ERROR "LIBRARIES parameter missing, but is required") + endif() + if(NOT IMPORT_EXTERNAL_PROJECT_INCLUDE_DIRS) + message(FATAL_ERROR "INCLUDE_DIRS parameter missing, but is required") + endif() + + message(STATUS "Importing target ${IMPORT_EXTERNAL_PROJECT_TARGET_NAME} from external project ${IMPORT_EXTERNAL_PROJECT_EXT_PROJECT_NAME}") + + add_library(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME} INTERFACE IMPORTED) + + ExternalProject_Get_Property(${IMPORT_EXTERNAL_PROJECT_EXT_PROJECT_NAME} SOURCE_DIR) + ExternalProject_Get_Property(${IMPORT_EXTERNAL_PROJECT_EXT_PROJECT_NAME} INSTALL_DIR) + + # "evaluate" patterns in the passed arguments by using some string replacing magic + # this makes it easier to use this function, as some external project properties don't need to be evaluated and + # passed beforehand, and should reduce the amount of duplicate code in this file + foreach(item ITEMS + IMPORT_EXTERNAL_PROJECT_EXT_PROJECT_NAME + IMPORT_EXTERNAL_PROJECT_LIBRARIES + IMPORT_EXTERNAL_PROJECT_INCLUDE_DIRS + IMPORT_EXTERNAL_PROJECT_LIBRARY_DIRS) + + # create new variable with fixed string... + string(REPLACE "" "${SOURCE_DIR}" ${item}-out "${${item}}") + # ... and set the original value to the new value + set(${item} "${${item}-out}") + + # create new variable with fixed string... + string(REPLACE "" "${INSTALL_DIR}" ${item}-out "${${item}}") + # ... and set the original value to the new value + set(${item} "${${item}-out}") + endforeach() + + set_property(TARGET ${IMPORT_EXTERNAL_PROJECT_TARGET_NAME} PROPERTY INTERFACE_LINK_LIBRARIES "${IMPORT_EXTERNAL_PROJECT_LIBRARIES}") + + # FIXME: the following line produces CMake errors "directory not found" + # CMake does, however, not complain if the INCLUDE_DIRECTORIES property contains missing directories + # possibly related: https://cmake.org/Bug/view.php?id=15052 + #set_property(TARGET ${IMPORT_EXTERNAL_PROJECT_TARGET_NAME} PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${IMPORT_EXTERNAL_PROJECT_INCLUDE_DIRS}) + include_directories(${IMPORT_EXTERNAL_PROJECT_INCLUDE_DIRS}) + + if(${IMPORT_EXTERNAL_PROJECT_LIBRARY_DIRS}) + link_directories(${IMPORT_EXTERNAL_PROJECT_LIBRARY_DIRS}) + endif() + + # finally, add a depenceny on the external project to make sure it's built + add_dependencies(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME} "${IMPORT_EXTERNAL_PROJECT_EXT_PROJECT_NAME}") + + # read external project properties, and export them with the target name as prefix + # this is necessary to allow the other external projects, which are not built with CMake or not within the same + # CMake context, to link to the libraries built as external projects (or the system ones, depending on the build + # configuration) + set(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME}_INCLUDE_DIRS "${IMPORT_EXTERNAL_PROJECT_INCLUDE_DIRS}" CACHE INTERNAL "") + set(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME}_LIBRARIES "${IMPORT_EXTERNAL_PROJECT_LIBRARIES}" CACHE INTERNAL "") + set(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME}_PREFIX ${INSTALL_DIR} CACHE INTERNAL "") +endfunction() + + +# the names of the targets need to differ from the library filenames +# this is especially an issue with libcairo, where the library is called libcairo +# therefore, all libs imported this way have been prefixed with lib +import_pkgconfig_target(libglib glib-2.0>=2.40) +import_pkgconfig_target(libgio gio-2.0>=2.40) +import_pkgconfig_target(libzlib zlib) +import_pkgconfig_target(libcairo cairo) +import_pkgconfig_target(libopenssl openssl) +import_pkgconfig_target(libfuse fuse) if(USE_CCACHE) @@ -34,7 +178,7 @@ set(USE_SYSTEM_XZ OFF CACHE BOOL "Use system xz/liblzma instead of building our if(NOT USE_SYSTEM_XZ) message(STATUS "Downloading and building xz") - ExternalProject_Add(xz + ExternalProject_Add(xz-EXTERNAL URL https://tukaani.org/xz/xz-5.2.3.tar.gz URL_HASH SHA512=a5eb4f707cf31579d166a6f95dbac45cf7ea181036d1632b4f123a4072f502f8d57cd6e7d0588f0bf831a07b8fc4065d26589a25c399b95ddcf5f73435163da6 CONFIGURE_COMMAND CC=${CC} CXX=${CXX} CFLAGS=-fPIC CPPFLAGS=-fPIC /configure --disable-shared --enable-static --prefix= --libdir=/lib @@ -42,32 +186,18 @@ if(NOT USE_SYSTEM_XZ) INSTALL_COMMAND make install ) - ExternalProject_Get_Property(xz SOURCE_DIR) - ExternalProject_Get_Property(xz INSTALL_DIR) - set(xz_SOURCE_DIR "${SOURCE_DIR}") - set(xz_INSTALL_DIR "${INSTALL_DIR}") - mark_as_advanced(xz_SOURCE_DIR xz_INSTALL_DIR) - - set(xz_INCLUDE_DIR "${xz_SOURCE_DIR}/src/liblzma/api/") - set(xz_LIBRARIES_DIR "${xz_INSTALL_DIR}/lib") - set(xz_LIBRARIES "${xz_LIBRARIES_DIR}/liblzma.a") - - set(xz_PREFIX "${xz_INSTALL_DIR}") + import_external_project( + TARGET_NAME xz + EXT_PROJECT_NAME xz-EXTERNAL + LIBRARIES "/lib/liblzma.a" + INCLUDE_DIRS "/src/liblzma/api/" + ) else() message(STATUS "Using system xz") - find_package(LibLZMA) - if(NOT LIBLZMA_FOUND) - message(FATAL_ERROR "liblzma could not be found on the system. You will have to either install it, or use the bundled xz.") - endif() - - set(xz_INCLUDE_DIR "${LIBLZMA_INCLUDE_DIRS}") - set(xz_LIBRARIES "${LIBLZMA_LIBRARIES}") - set(xz_PREFIX "/usr/lib") + import_find_pkg_target(xz LibLZMA LIBLZMA) endif() -mark_as_advanced(xz_INCLUDE_DIR xz_LIBRARIES_DIR xz_LIBRARIES xz_PREFIX) - # as distros don't provide suitable squashfuse and squashfs-tools, those dependencies are bundled in, can, and should # be used from this repository @@ -78,7 +208,7 @@ configure_file( @ONLY ) -ExternalProject_Add(squashfuse +ExternalProject_Add(squashfuse-EXTERNAL GIT_REPOSITORY https://github.com/vasi/squashfuse/ GIT_TAG 1f98030 UPDATE_COMMAND "" # make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time @@ -97,50 +227,13 @@ ExternalProject_Add(squashfuse INSTALL_COMMAND make install ) -ExternalProject_Get_Property(squashfuse SOURCE_DIR) -ExternalProject_Get_Property(squashfuse INSTALL_DIR) -set(squashfuse_SOURCE_DIR "${SOURCE_DIR}") -set(squashfuse_INSTALL_DIR "${INSTALL_DIR}") -mark_as_advanced(squashfuse_SOURCE_DIR squashfuse_INSTALL_DIR) - -set(squashfuse_LIBRARY_DIR ${squashfuse_SOURCE_DIR}/.libs) -set(squashfuse_INCLUDE_DIR ${squashfuse_SOURCE_DIR}) - -set(libsquashfuse ${squashfuse_LIBRARY_DIR}/libsquashfuse.a) -set(libsquashfuse_ll ${squashfuse_LIBRARY_DIR}/libsquashfuse_ll.a) -set(libfuseprivate ${squashfuse_LIBRARY_DIR}/libfuseprivate.a) -set(squashfuse_LIBRARIES ${libsquashfuse} ${libsquashfuse_ll} ${libfuseprivate}) -mark_as_advanced(libsquashfuse libfuseprivate) - -mark_as_advanced(squashfuse_LIBRARY_DIR squashfuse_LIBRARIES squashfuse_INCLUDE_DIR) - - -# TODO: allow using system wide mksquashfs -ExternalProject_Add(mksquashfs - GIT_REPOSITORY https://github.com/plougher/squashfs-tools/ - GIT_TAG 5be5d61 - UPDATE_COMMAND "" # make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time - PATCH_COMMAND patch -N -p1 < ${PROJECT_SOURCE_DIR}/src/mksquashfs-mkfs-fixed-timestamp.patch || true - CONFIGURE_COMMAND sed -i "s|CFLAGS += -DXZ_SUPPORT|CFLAGS += -DXZ_SUPPORT -I${xz_INCLUDE_DIR}|g" /squashfs-tools/Makefile - COMMAND sed -i "s|LIBS += -llzma|LIBS += -Bstatic ${xz_LIBRARIES}|g" /squashfs-tools/Makefile - COMMAND sed -i "s|install: mksquashfs unsquashfs|install: mksquashfs|g" squashfs-tools/Makefile - COMMAND sed -i "/cp unsquashfs/d" squashfs-tools/Makefile - BUILD_COMMAND CC=${CC} CXX=${CXX} make -C squashfs-tools/ XZ_SUPPORT=1 mksquashfs - # make install unfortunately expects unsquashfs to be built as well, hence can't install the binary - # therefore using built file in SOURCE_DIR - # TODO: implement building out of source - BUILD_IN_SOURCE ON - INSTALL_COMMAND make -C squashfs-tools/ install INSTALL_DIR= +import_external_project( + TARGET_NAME squashfuse + EXT_PROJECT_NAME squashfuse-EXTERNAL + LIBRARIES "/.libs/libsquashfuse.a;/.libs/libsquashfuse_ll.a;/.libs/libfuseprivate.a" + INCLUDE_DIRS "" ) -ExternalProject_Get_Property(mksquashfs INSTALL_DIR) -set(mksquashfs_INSTALL_DIR "${INSTALL_DIR}") -mark_as_advanced(mksquashfs_INSTALL_DIR) - -# for later use when packaging as an AppImage -set(mksquashfs_BINARY "${mksquashfs_INSTALL_DIR}/mksquashfs") -mark_as_advanced(mksquashfs_BINARY) - set(USE_SYSTEM_INOTIFY_TOOLS OFF CACHE BOOL "Use system libinotifytools instead of building our own") @@ -148,7 +241,7 @@ if(NOT USE_SYSTEM_INOTIFY_TOOLS) message(STATUS "Downloading and building inotify-tools") # TODO: build out of source - ExternalProject_Add(inotify-tools + ExternalProject_Add(inotify-tools-EXTERNAL URL https://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz URL_HASH SHA512=6074d510e89bba5da0d7c4d86f2562c662868666ba0a7ea5d73e53c010a0050dd1fc01959b22cffdb9b8a35bd1b0b43c04d02d6f19927520f05889e8a9297dfb PATCH_COMMAND wget -N --content-disposition "https://git.savannah.gnu.org/gitweb/?p=config.git$%3CSEMICOLON%3Ea=blob_plain$%3CSEMICOLON%3Ef=config.guess$%3CSEMICOLON%3Ehb=HEAD" @@ -160,32 +253,25 @@ if(NOT USE_SYSTEM_INOTIFY_TOOLS) INSTALL_COMMAND make install ) - ExternalProject_Get_Property(inotify-tools INSTALL_DIR) - set(inotify-tools_INSTALL_DIR "${INSTALL_DIR}") - mark_as_advanced(inotify-tools_INSTALL_DIR) - - set(inotify-tools_INCLUDE_DIR ${inotify-tools_INSTALL_DIR}/include/) - set(inotify-tools_LIBRARY_DIR ${inotify-tools_INSTALL_DIR}/lib) - set(inotify-tools_LIBRARIES ${inotify-tools_LIBRARY_DIR}/libinotifytools.a) - mark_as_advanced(inotify-tools_LIBRARY_DIR) + import_external_project( + TARGET_NAME inotify-tools + EXT_PROJECT_NAME inotify-tools-EXTERNAL + LIBRARIES "/lib/libinotifytools.a" + INCLUDE_DIRS "/include/" + ) else() message(STATUS "Using system inotify-tools") - find_package(INotify REQUIRED) - - set(inotify-tools_INCLUDE_DIR ${INOTIFYTOOLS_INCLUDE_DIRS}) - set(inotify-tools_LIBRARIES ${INOTIFYTOOLS_LIBRARY}) + import_find_pkg_target(inotify-tools INotify INOTIFYTOOLS) endif() -mark_as_advanced(inotify-tools_LIBRARIES inotify-tools_INCLUDE_DIR) - set(USE_SYSTEM_LIBARCHIVE OFF CACHE BOOL "Use system libarchive instead of building our own") if(NOT USE_SYSTEM_LIBARCHIVE) message(STATUS "Downloading and building libarchive") - ExternalProject_Add(libarchive + ExternalProject_Add(libarchive-EXTERNAL URL https://www.libarchive.org/downloads/libarchive-3.3.1.tar.gz URL_HASH SHA512=90702b393b6f0943f42438e277b257af45eee4fa82420431f6a4f5f48bb846f2a72c8ff084dc3ee9c87bdf8b57f4d8dddf7814870fe2604fe86c55d8d744c164 CONFIGURE_COMMAND CC=${CC} CXX=${CXX} CFLAGS=-fPIC CPPFLAGS=-fPIC /configure --disable-shared --enable-static --disable-bsdtar --disable-bsdcat --disable-bsdcpio --with-zlib --without-bz2lib --without-iconv --without-lz4 --without-lzma --without-lzo2 --without-nettle --without-openssl --without-xml2 --without-expat --prefix= --libdir=/lib @@ -193,28 +279,16 @@ if(NOT USE_SYSTEM_LIBARCHIVE) INSTALL_COMMAND make install ) - ExternalProject_Get_Property(libarchive INSTALL_DIR) - set(libarchive_INSTALL_DIR "${INSTALL_DIR}") - mark_as_advanced(libarchive_INSTALL_DIR) - - set(libarchive_INCLUDE_DIR ${libarchive_INSTALL_DIR}/include) - set(libarchive_LIBRARY_DIR ${libarchive_INSTALL_DIR}/lib) - set(libarchive_LIBRARIES ${libarchive_LIBRARY_DIR}/libarchive.a) - mark_as_advanced(libarchive_LIBRARY_DIR libarchive_LIBRARIES libarchive_INCLUDE_DIR) + import_external_project( + TARGET_NAME libarchive + EXT_PROJECT_NAME libarchive-EXTERNAL + LIBRARIES "/lib/libarchive.a" + INCLUDE_DIRS "/include/" + ) else() message(STATUS "Using system libarchive") - find_package(LibArchive REQUIRED) - - set(libarchive_INCLUDE_DIR ${LibArchive_INCLUDE_DIR}) - set(libarchive_LIBRARIES ${LibArchive_LIBRARY}) -endif() - - -# only have to build custom xz when not using system libxz -if(NOT USE_SYSTEM_XZ) - add_dependencies(squashfuse xz) - add_dependencies(mksquashfs xz) + import_find_pkg_target(libarchive LibArchive LibArchive) endif() @@ -223,27 +297,57 @@ set(USE_SYSTEM_GTEST OFF CACHE BOOL "Use system GTest instead of downloading and if(NOT USE_SYSTEM_GTEST) message(STATUS "Downloading and building GTest") - ExternalProject_Add(gtest + ExternalProject_Add(gtest-EXTERNAL GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG release-1.8.0 UPDATE_COMMAND "" # make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time CONFIGURE_COMMAND ${CMAKE_COMMAND} -G${CMAKE_GENERATOR} -DCMAKE_INSTALL_PREFIX= /googletest ) - ExternalProject_Get_Property(gtest SOURCE_DIR) - ExternalProject_Get_Property(gtest INSTALL_DIR) - set(gtest_SOURCE_DIR "${SOURCE_DIR}") - set(gtest_INSTALL_DIR "${INSTALL_DIR}") - mark_as_advanced(gtest_SOURCE_DIR gtest_INSTALL_DIR) - - set(gtest_INCLUDE_DIRS "${gtest_INSTALL_DIR}/include/") - set(gtest_LIBRARIES_DIR "${gtest_INSTALL_DIR}/lib") - set(gtest_LIBRARIES "${gtest_LIBRARIES_DIR}/libgtest.a" "${gtest_LIBRARIES_DIR}/libgtest_main.a") + import_external_project( + TARGET_NAME gtest + EXT_PROJECT_NAME gtest-EXTERNAL + LIBRARIES "/lib/libgtest.a;/lib/libgtest_main.a" + INCLUDE_DIRS "/include/" + ) else() message(STATUS "Using system GTest") - find_package(GTest REQUIRED) + import_find_pkg_target(gtest GTest GTEST) +endif() + + +# TODO: allow using system wide mksquashfs +ExternalProject_Add(mksquashfs + GIT_REPOSITORY https://github.com/plougher/squashfs-tools/ + GIT_TAG 5be5d61 + UPDATE_COMMAND "" # make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time + PATCH_COMMAND patch -N -p1 < ${PROJECT_SOURCE_DIR}/src/mksquashfs-mkfs-fixed-timestamp.patch || true + CONFIGURE_COMMAND sed -i "s|CFLAGS += -DXZ_SUPPORT|CFLAGS += -DXZ_SUPPORT -I${xz_INCLUDE_DIR}|g" /squashfs-tools/Makefile + COMMAND sed -i "s|LIBS += -llzma|LIBS += -Bstatic ${xz_LIBRARIES}|g" /squashfs-tools/Makefile + COMMAND sed -i "s|install: mksquashfs unsquashfs|install: mksquashfs|g" squashfs-tools/Makefile + COMMAND sed -i "/cp unsquashfs/d" squashfs-tools/Makefile + BUILD_COMMAND CC=${CC} CXX=${CXX} make -C squashfs-tools/ XZ_SUPPORT=1 mksquashfs + # make install unfortunately expects unsquashfs to be built as well, hence can't install the binary + # therefore using built file in SOURCE_DIR + # TODO: implement building out of source + BUILD_IN_SOURCE ON + INSTALL_COMMAND make -C squashfs-tools/ install INSTALL_DIR= +) + +ExternalProject_Get_Property(mksquashfs INSTALL_DIR) +set(mksquashfs_INSTALL_DIR "${INSTALL_DIR}") +mark_as_advanced(mksquashfs_INSTALL_DIR) - set(gtest_INCLUDE_DIRS "${GTEST_INCLUDE_DIRS}") - set(gtest_LIBRARIES "${GTEST_LIBRARIES}") +# for later use when packaging as an AppImage +set(mksquashfs_BINARY "${mksquashfs_INSTALL_DIR}/mksquashfs") +mark_as_advanced(mksquashfs_BINARY) + + +#### build dependency configuration #### + +# only have to build custom xz when not using system libxz +if(NOT USE_SYSTEM_XZ) + add_dependencies(squashfuse xz) + add_dependencies(mksquashfs xz) endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a2a468eaa..10bd7f66b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -63,29 +63,19 @@ target_include_directories(libappimage target_link_libraries(libappimage PRIVATE - ${squashfuse_LIBRARIES} - ${libarchive_LIBRARIES} - ${inotify-tools_LIBRARIES} - ${xz_LIBRARIES} + squashfuse + libarchive + inotify-tools + xz xdg-basedir PUBLIC pthread - ${GLIB_LIBRARIES} - ${GIO_LIBRARIES} - ${ZLIB_LIBRARIES} - ${CAIRO_LIBRARIES} + libglib + libgio + libzlib + libcairo ) -add_dependencies(libappimage squashfuse) - -if(NOT USE_SYSTEM_LIBARCHIVE) - add_dependencies(libappimage libarchive) -endif() - -if(NOT USE_SYSTEM_INOTIFY_TOOLS) - add_dependencies(libappimage inotify-tools) -endif() - add_library(libappimage_static STATIC ${PROJECT_SOURCE_DIR}/include/appimage/appimage.h @@ -112,29 +102,19 @@ target_include_directories(libappimage_static target_link_libraries(libappimage_static PRIVATE - ${squashfuse_LIBRARIES} - ${libarchive_LIBRARIES} - ${inotify-tools_LIBRARIES} - ${xz_LIBRARIES} + squashfuse + libarchive + inotify-tools + xz xdg-basedir PUBLIC pthread - ${GLIB_LIBRARIES} - ${GIO_LIBRARIES} - ${ZLIB_LIBRARIES} - ${CAIRO_LIBRARIES} + libglib + libgio + libzlib + libcairo ) -add_dependencies(libappimage_static squashfuse) - -if(NOT USE_SYSTEM_LIBARCHIVE) - add_dependencies(libappimage_static libarchive) -endif() - -if(NOT USE_SYSTEM_INOTIFY_TOOLS) - add_dependencies(libappimage_static inotify-tools) -endif() - add_executable(appimagetool appimagetool.c @@ -145,16 +125,16 @@ add_executable(appimagetool ) target_link_libraries(appimagetool - ${GLIB_LIBRARIES} - ${squashfuse_LIBRARIES} - ${ZLIB_LIBRARIES} + libglib + libzlib + squashfuse ) target_link_libraries(appimagetool ${CMAKE_DL_LIBS} pthread - ${ZLIB_LIBRARIES} - ${xz_LIBRARIES} + libzlib + xz xdg-basedir ) @@ -183,14 +163,14 @@ add_executable(appimaged appimaged.c notify.c elf.c getsection.c) target_link_libraries(appimaged pthread ${CMAKE_DL_LIBS} - ${CAIRO_LIBRARIES} - ${GLIB_LIBRARIES} - ${GIO_LIBRARIES} - ${inotify-tools_LIBRARIES} - ${squashfuse_LIBRARIES} - ${xz_LIBRARIES} - ${ZLIB_LIBRARIES} - ${libarchive_LIBRARIES} + libcairo + libglib + libgio + inotify-tools + squashfuse + xz + libzlib + libarchive xdg-basedir ) @@ -210,15 +190,6 @@ target_include_directories(appimaged INTERFACE $ ) -add_dependencies(appimaged squashfuse) - -if(NOT USE_SYSTEM_INOTIFY_TOOLS) - add_dependencies(appimaged inotify-tools) -endif() -if(NOT USE_SYSTEM_LIBARCHIVE) - add_dependencies(appimaged libarchive) -endif() - add_sanitizers(appimaged) @@ -230,15 +201,15 @@ add_sanitizers(AppRun) add_executable(validate validate.c getsection.c) target_link_libraries(validate - ${GLIB_LIBRARIES} - ${OPENSSL_LIBRARIES} + libglib + libopenssl ) add_executable(digest digest.c getsection.c) target_link_libraries(digest - ${OPENSSL_LIBRARIES} + libopenssl ) add_sanitizers(digest) @@ -248,16 +219,16 @@ add_executable(runtime-debug EXCLUDE_FROM_ALL elf.c notify.c getsection.c runtim target_link_libraries(runtime-debug PRIVATE - ${squashfuse_LIBRARIES} - ${libarchive_LIBRARIES} - ${xz_LIBRARIES} + squashfuse + libarchive + xz xdg-basedir PUBLIC pthread - ${GLIB_LIBRARIES} - ${GIO_LIBRARIES} - ${ZLIB_LIBRARIES} - ${CAIRO_LIBRARIES} + libglib + libgio + libzlib + libcairo ${CMAKE_DL_LIBS} ) @@ -270,13 +241,6 @@ target_compile_options(runtime-debug PUBLIC "${_RUNTIME_FLAGS}" ) -if(NOT USE_SYSTEM_INOTIFY_TOOLS) - add_dependencies(runtime-debug inotify-tools) -endif() -if(NOT USE_SYSTEM_LIBARCHIVE) - add_dependencies(runtime-debug libarchive) -endif() - # install binaries if(AUXILIARY_FILES_DESTINATION) diff --git a/src/build-runtime.sh.in b/src/build-runtime.sh.in index ad85e6282..ea84b3d26 100755 --- a/src/build-runtime.sh.in +++ b/src/build-runtime.sh.in @@ -36,7 +36,7 @@ trap cleanup EXIT cd "$build_dir" # Compile runtime but do not link -$CC -DGIT_COMMIT=\"$git_version\" -I"@xz_INCLUDE_DIR@" -I"@squashfuse_INCLUDE_DIR@" \ +$CC -DGIT_COMMIT=\"$git_version\" -I"@xz_INCLUDE_DIRS@" -I"@squashfuse_INCLUDE_DIRS@" \ -D_FILE_OFFSET_BITS=64 -g $small_FLAGS -c "$repo_root"/runtime.c # Prepare 1024 bytes of space for updateinformation @@ -60,7 +60,7 @@ objcopy --add-section .sig_key=8192_blank_bytes \ squashfuse_libs="@squashfuse_LIBRARIES@" $CC $small_FLAGS $small_LDFLAGS -o runtime "$repo_root"/elf.c "$repo_root"/notify.c "$repo_root"/getsection.c \ runtime4.o ${squashfuse_libs//;/ } \ - -Wl,-Bdynamic -lpthread -l"@ZLIB_LIBRARIES@" -L"@ZLIB_LIBRARY_DIRS@" -Wl,-Bstatic "@xz_LIBRARIES@" -Wl,-Bdynamic -ldl + -Wl,-Bdynamic -lpthread -l"@libzlib_LIBRARIES@" -L"@libzlib_LIBRARY_DIRS@" -Wl,-Bstatic "@xz_LIBRARIES@" -Wl,-Bdynamic -ldl $STRIP runtime # Test if we can read it back diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 833bfef09..f4485f743 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,7 +1,5 @@ # build and add test only if tests are enabled if(BUILD_TESTING) - include_directories(${gtest_INCLUDE_DIRS}) - add_definitions( -DTEST_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data/" -DGIT_COMMIT="AppImageKit unit tests" @@ -18,13 +16,9 @@ if(BUILD_TESTING) pthread libappimage xdg-basedir - ${gtest_LIBRARIES} + gtest ) - if(NOT USE_SYSTEM_GTEST) - add_dependencies(test_libappimage gtest) - endif() - add_test(test_libappimage test_libappimage) @@ -38,17 +32,17 @@ if(BUILD_TESTING) target_link_libraries(test_shared PRIVATE - ${squashfuse_LIBRARIES} - ${libarchive_LIBRARIES} - ${inotify-tools_LIBRARIES} - ${xz_LIBRARIES} + squashfuse + libarchive + inotify-tools + xz xdg-basedir pthread - ${GLIB_LIBRARIES} - ${GIO_LIBRARIES} - ${ZLIB_LIBRARIES} - ${CAIRO_LIBRARIES} - ${gtest_LIBRARIES} + libglib + libgio + libzlib + libcairo + gtest ) target_include_directories(test_shared @@ -60,20 +54,6 @@ if(BUILD_TESTING) PRIVATE ${PROJECT_SOURCE_DIR}/include/ ) - add_dependencies(test_shared squashfuse) - - if(NOT USE_SYSTEM_LIBARCHIVE) - add_dependencies(test_shared libarchive) - endif() - - if(NOT USE_SYSTEM_INOTIFY_TOOLS) - add_dependencies(test_shared inotify-tools) - endif() - - if(NOT USE_SYSTEM_GTEST) - add_dependencies(test_shared gtest) - endif() - add_test(test_shared test_shared) target_compile_options(test_shared PRIVATE -fpermissive) @@ -90,35 +70,23 @@ if(BUILD_TESTING) target_link_libraries(test_getsection PRIVATE - ${squashfuse_LIBRARIES} - ${libarchive_LIBRARIES} - ${inotify-tools_LIBRARIES} - ${xz_LIBRARIES} + squashfuse + libarchive + inotify-tools + xz xdg-basedir pthread - ${GLIB_LIBRARIES} - ${GIO_LIBRARIES} - ${ZLIB_LIBRARIES} - ${CAIRO_LIBRARIES} - ${gtest_LIBRARIES} + libglib + libgio + libzlib + libcairo + gtest ) target_include_directories(test_getsection PRIVATE ../src/) add_dependencies(test_getsection squashfuse) - if(NOT USE_SYSTEM_LIBARCHIVE) - add_dependencies(test_getsection libarchive) - endif() - - if(NOT USE_SYSTEM_INOTIFY_TOOLS) - add_dependencies(test_getsection inotify-tools) - endif() - - if(NOT USE_SYSTEM_GTEST) - add_dependencies(test_getsection gtest) - endif() - add_test(test_getsection test_getsection) target_compile_options(test_getsection PRIVATE -fpermissive) From e31c3e07304d233130deee24e74bc3ebffb9458a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 17 Apr 2018 18:52:14 +0200 Subject: [PATCH 166/544] Skip import of existing targets CC #751. --- cmake/dependencies.cmake | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index c03c187ac..6f974e368 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -17,6 +17,11 @@ find_package(PkgConfig REQUIRED) function(import_library_from_prefix target_name variable_prefix) message(STATUS "Importing target ${target_name} from variable prefix ${variable_prefix}") + if(TARGET ${target_name}) + message(WARNING "Target exists already, skipping") + return() + endif() + add_library(${target_name} INTERFACE IMPORTED) # FIXME: the following line produces CMake errors "directory not found" @@ -99,6 +104,11 @@ function(import_external_project) message(STATUS "Importing target ${IMPORT_EXTERNAL_PROJECT_TARGET_NAME} from external project ${IMPORT_EXTERNAL_PROJECT_EXT_PROJECT_NAME}") + if(TARGET ${target_name}) + message(WARNING "Target exists already, skipping") + return() + endif() + add_library(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME} INTERFACE IMPORTED) ExternalProject_Get_Property(${IMPORT_EXTERNAL_PROJECT_EXT_PROJECT_NAME} SOURCE_DIR) From f0adbc896b23e089106bcf58d4c00133598a1db3 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 17 Apr 2018 19:06:11 +0200 Subject: [PATCH 167/544] Fix xz include dir variable name --- cmake/dependencies.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 6f974e368..b5f74b726 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -333,7 +333,7 @@ ExternalProject_Add(mksquashfs GIT_TAG 5be5d61 UPDATE_COMMAND "" # make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time PATCH_COMMAND patch -N -p1 < ${PROJECT_SOURCE_DIR}/src/mksquashfs-mkfs-fixed-timestamp.patch || true - CONFIGURE_COMMAND sed -i "s|CFLAGS += -DXZ_SUPPORT|CFLAGS += -DXZ_SUPPORT -I${xz_INCLUDE_DIR}|g" /squashfs-tools/Makefile + CONFIGURE_COMMAND sed -i "s|CFLAGS += -DXZ_SUPPORT|CFLAGS += -DXZ_SUPPORT -I${xz_INCLUDE_DIRS}|g" /squashfs-tools/Makefile COMMAND sed -i "s|LIBS += -llzma|LIBS += -Bstatic ${xz_LIBRARIES}|g" /squashfs-tools/Makefile COMMAND sed -i "s|install: mksquashfs unsquashfs|install: mksquashfs|g" squashfs-tools/Makefile COMMAND sed -i "/cp unsquashfs/d" squashfs-tools/Makefile From e24709b78900f5ae1655fb84181344e2c631a3ed Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 17 Apr 2018 19:15:13 +0200 Subject: [PATCH 168/544] We don't use IMPORTED_TARGET --- cmake/dependencies.cmake | 3 --- 1 file changed, 3 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index b5f74b726..efdbe0a66 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -1,6 +1,3 @@ -# required for pkg-config's IMPORTED_TARGET -cmake_minimum_required(VERSION 3.6) - # find required system dependencies via pkg-config find_package(PkgConfig REQUIRED) From 6cff671351ed0bf6c8f479dc7480c1dc343f28cf Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 18 Apr 2018 23:14:03 +0200 Subject: [PATCH 169/544] Force add TryExec key to desktop files Fixes https://github.com/TheAssassin/AppImageLauncher/issues/18 --- src/shared.c | 21 ++++++--------------- tests/test_libappimage.cpp | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/shared.c b/src/shared.c index e11fd81f9..a523c30ab 100644 --- a/src/shared.c +++ b/src/shared.c @@ -518,21 +518,9 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag // parse [Try]Exec= value, replace executable by AppImage path, append parameters // TODO: should respect quoted strings within value - const gchar const* fields[] = {G_KEY_FILE_DESKTOP_KEY_EXEC, G_KEY_FILE_DESKTOP_KEY_TRY_EXEC}; - for (int i = 0; i < (sizeof(fields) / sizeof(gchar*)); i++) { - char* field_value = g_key_file_get_value(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, fields[i], NULL); - - // TryExec is not a mandatory field - if (field_value == NULL) { - if (fields[i] != G_KEY_FILE_DESKTOP_KEY_EXEC) - continue; - -#ifdef STANDALONE - fprintf(stderr, "%s entry missing in Desktop file\n", fields[i]); -#endif - return false; - }; + { + char* field_value = g_key_file_get_value(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL); // saving a copy for later free() call char* original_field_value = field_value; @@ -565,11 +553,14 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag if (original_field_value != NULL) free(original_field_value); - g_key_file_set_value(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, fields[i], new_exec_value); + g_key_file_set_value(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, new_exec_value); g_free(new_exec_value); } + // force add a TryExec= key + g_key_file_set_value(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TRY_EXEC, appimage_path); + #ifdef APPIMAGED /* If firejail is on the $PATH, then use it to run AppImages */ if(g_find_program_in_path ("firejail")){ diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index e3febd5f6..e72f4f135 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -413,6 +413,38 @@ namespace AppImageTests { g_error_free(error); } + TEST_F(LibAppImageTest, test_try_exec_key_exists_type_1) { + const std::string& pathToAppImage = appImage_type_1_file_path; + + ASSERT_EQ(appimage_register_in_system(pathToAppImage.c_str(), false), 0); + + GKeyFile* kf = g_key_file_new(); + + const char* desktopFilePath = appimage_registered_desktop_file_path(pathToAppImage.c_str(), NULL, false); + + ASSERT_TRUE(g_key_file_load_from_file(kf, desktopFilePath, G_KEY_FILE_NONE, NULL)); + + const char* expectedTryExecValue = g_key_file_get_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TRY_EXEC, NULL); + + EXPECT_EQ(expectedTryExecValue, pathToAppImage); + } + + TEST_F(LibAppImageTest, test_try_exec_key_exists_type_2) { + const std::string& pathToAppImage = appImage_type_2_file_path; + + ASSERT_EQ(appimage_register_in_system(pathToAppImage.c_str(), false), 0); + + GKeyFile* kf = g_key_file_new(); + + const char* desktopFilePath = appimage_registered_desktop_file_path(pathToAppImage.c_str(), NULL, false); + + ASSERT_TRUE(g_key_file_load_from_file(kf, desktopFilePath, G_KEY_FILE_NONE, NULL)); + + const char* expectedTryExecValue = g_key_file_get_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TRY_EXEC, NULL); + + EXPECT_EQ(expectedTryExecValue, pathToAppImage); + } + } // namespace int main(int argc, char **argv) { From 05116ba4b87fe4a856b69f11bb5d3f49c18ef021 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 19 Apr 2018 03:35:27 +0200 Subject: [PATCH 170/544] Protection of these calls is no longer needed --- cmake/dependencies.cmake | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index efdbe0a66..10ae721c2 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -354,7 +354,5 @@ mark_as_advanced(mksquashfs_BINARY) #### build dependency configuration #### # only have to build custom xz when not using system libxz -if(NOT USE_SYSTEM_XZ) - add_dependencies(squashfuse xz) - add_dependencies(mksquashfs xz) -endif() +add_dependencies(squashfuse xz) +add_dependencies(mksquashfs xz) From e06d69d63b28c7ff78094f1c91d21ade041b19f9 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 19 Apr 2018 03:38:00 +0200 Subject: [PATCH 171/544] There is no use in public/private linking of executables --- src/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 10bd7f66b..f45cc4090 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -218,12 +218,10 @@ add_sanitizers(digest) add_executable(runtime-debug EXCLUDE_FROM_ALL elf.c notify.c getsection.c runtime.c) target_link_libraries(runtime-debug - PRIVATE squashfuse libarchive xz xdg-basedir - PUBLIC pthread libglib libgio From 9dc43c65d6cafadb6bf2f184205d62786e46206c Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 19 Apr 2018 03:38:31 +0200 Subject: [PATCH 172/544] Set argv0 depending on TARGET_APPIMAGE Appears to fix #743. --- src/runtime.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/runtime.c b/src/runtime.c index 1eb08db78..00902baad 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -281,8 +281,10 @@ main (int argc, char *argv[]) */ if(getenv("TARGET_APPIMAGE") == NULL){ sprintf(appimage_path, "/proc/self/exe"); + sprintf(argv0_path, argv[0]); } else { sprintf(appimage_path, "%s", getenv("TARGET_APPIMAGE")); + sprintf(argv0_path, getenv("TARGET_APPIMAGE")); } sprintf(argv0_path, argv[0]); From 6370bf35e010cc077353c9e4711ae6613de38463 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 24 Apr 2018 18:08:25 +0200 Subject: [PATCH 173/544] Remove annoying debug message --- cmake/dependencies.cmake | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 10ae721c2..3aab62d81 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -46,8 +46,6 @@ function(import_library_from_prefix target_name variable_prefix) set(${target_name}_LIBRARY_DIRS ${${variable_prefix}_LIBRARY_DIRS} CACHE INTERNAL "") # TODO: the following might not always apply set(${target_name}_PREFIX ${CMAKE_INSTALL_PREFIX}/lib CACHE INTERNAL "") - - message(STATUS "${variable_prefix}_LIBRARIES: ${${variable_prefix}_LIBRARIES}") endfunction() From 9f1a97ec7b153253f97ffb8cbc49239da756aaf9 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 24 Apr 2018 18:09:24 +0200 Subject: [PATCH 174/544] Remove annoying debug message, mk. 2 --- cmake/dependencies.cmake | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 3aab62d81..89d6615dc 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -12,8 +12,6 @@ find_package(PkgConfig REQUIRED) # - target_name: name of the target that should be created # - variable_prefix: prefix of the variable that should be used to create the target from function(import_library_from_prefix target_name variable_prefix) - message(STATUS "Importing target ${target_name} from variable prefix ${variable_prefix}") - if(TARGET ${target_name}) message(WARNING "Target exists already, skipping") return() From 40cae7d36ca054faf97adb7e4f9c4cbd8f14bf5d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 24 Apr 2018 18:11:35 +0200 Subject: [PATCH 175/544] Remove annoying debug message, mk. 3 --- cmake/dependencies.cmake | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 89d6615dc..e6f26b228 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -95,8 +95,6 @@ function(import_external_project) message(FATAL_ERROR "INCLUDE_DIRS parameter missing, but is required") endif() - message(STATUS "Importing target ${IMPORT_EXTERNAL_PROJECT_TARGET_NAME} from external project ${IMPORT_EXTERNAL_PROJECT_EXT_PROJECT_NAME}") - if(TARGET ${target_name}) message(WARNING "Target exists already, skipping") return() From 4252883eed58981391c7e6660c1bd2ce1d1c2153 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 24 Apr 2018 23:59:30 +0200 Subject: [PATCH 176/544] Fix build of runtime-debug --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f45cc4090..d342651b5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -215,7 +215,7 @@ target_link_libraries(digest add_sanitizers(digest) -add_executable(runtime-debug EXCLUDE_FROM_ALL elf.c notify.c getsection.c runtime.c) +add_executable(runtime-debug EXCLUDE_FROM_ALL elf.c notify.c getsection.c ${CMAKE_CURRENT_SOURCE_DIR}/runtime.c) target_link_libraries(runtime-debug squashfuse From 0a6577ff3500ea5fd01c059c06587c4b3e3db6c7 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 26 Apr 2018 18:16:21 +0200 Subject: [PATCH 177/544] Split runtime flags into compile and link flags --- src/CMakeLists.txt | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d342651b5..3911201c6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -153,8 +153,6 @@ if(AUXILIARY_FILES_DESTINATION) ) endif() -add_dependencies(appimagetool mksquashfs squashfuse) - add_sanitizers(appimagetool) @@ -230,13 +228,10 @@ target_link_libraries(runtime-debug ${CMAKE_DL_LIBS} ) -set(_RUNTIME_FLAGS -g -O0 -ffunction-sections -fdata-sections -s -Wl,--gc-sections -DGIT_COMMIT='${GIT_COMMIT}' -D_FILE_OFFSET_BITS=64) -mark_as_advanced(_RUNTIME_FLAGS) - -set_target_properties(runtime-debug PROPERTIES LINK_FLAGS "${_RUNTIME_FLAGS}") +set_target_properties(runtime-debug PROPERTIES LINK_FLAGS "-ffunction-sections -fdata-sections -s -Wl,--gc-sections") target_compile_options(runtime-debug - PUBLIC "${_RUNTIME_FLAGS}" + PUBLIC -DGIT_COMMIT='${GIT_COMMIT}' -D_FILE_OFFSET_BITS=64 ) From 30177f052ec2bf06e53bd660323099afbe6a63f9 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 28 Apr 2018 03:53:31 +0200 Subject: [PATCH 178/544] Use setproctitle() with TARGET_APPIMAGE Fixes #763 --- src/CMakeLists.txt | 1 + src/build-runtime.sh.in | 2 +- src/runtime.c | 14 +++++++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3911201c6..c4e12e4de 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -226,6 +226,7 @@ target_link_libraries(runtime-debug libzlib libcairo ${CMAKE_DL_LIBS} + bsd ) set_target_properties(runtime-debug PROPERTIES LINK_FLAGS "-ffunction-sections -fdata-sections -s -Wl,--gc-sections") diff --git a/src/build-runtime.sh.in b/src/build-runtime.sh.in index ea84b3d26..ac4c17a5f 100755 --- a/src/build-runtime.sh.in +++ b/src/build-runtime.sh.in @@ -60,7 +60,7 @@ objcopy --add-section .sig_key=8192_blank_bytes \ squashfuse_libs="@squashfuse_LIBRARIES@" $CC $small_FLAGS $small_LDFLAGS -o runtime "$repo_root"/elf.c "$repo_root"/notify.c "$repo_root"/getsection.c \ runtime4.o ${squashfuse_libs//;/ } \ - -Wl,-Bdynamic -lpthread -l"@libzlib_LIBRARIES@" -L"@libzlib_LIBRARY_DIRS@" -Wl,-Bstatic "@xz_LIBRARIES@" -Wl,-Bdynamic -ldl + -Wl,-Bdynamic -lpthread -l"@libzlib_LIBRARIES@" -L"@libzlib_LIBRARY_DIRS@" -Wl,-Bstatic "@xz_LIBRARIES@" -Wl,-Bdynamic -ldl -lbsd $STRIP runtime # Test if we can read it back diff --git a/src/runtime.c b/src/runtime.c index 00902baad..ce0bc472c 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -37,6 +37,8 @@ #include #include #include +#include +#include #include #include #include @@ -279,12 +281,22 @@ main (int argc, char *argv[]) * change any time. Do not rely on it being present. We might even limit this * functionality specifically for builds used by appimaged. */ - if(getenv("TARGET_APPIMAGE") == NULL){ + if (getenv("TARGET_APPIMAGE") == NULL) { sprintf(appimage_path, "/proc/self/exe"); sprintf(argv0_path, argv[0]); } else { sprintf(appimage_path, "%s", getenv("TARGET_APPIMAGE")); sprintf(argv0_path, getenv("TARGET_APPIMAGE")); + + char buffer[1024]; + strcpy(buffer, getenv("TARGET_APPIMAGE")); + for (int i = 1; i < argc; i++) { + strcat(buffer, " "); + strcat(buffer, argv[i]); + } + + setproctitle_init(argc, argv, environ); + setproctitle("%s", buffer); } sprintf(argv0_path, argv[0]); From 3bbbb4f301c4177e8aa8866fd21b25006fe6be5d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 28 Apr 2018 11:12:07 +0200 Subject: [PATCH 179/544] Introduce CMake option for setproctitle feature --- src/CMakeLists.txt | 8 ++++++++ src/build-runtime.sh.in | 7 ++++++- src/runtime.c | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c4e12e4de..5eba631b3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,5 +1,7 @@ find_package(Sanitizers) +set(APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE OFF CACHE BOOL "Useful for $TARGET_APPIMAGE; see issue #763") + # set up build script # if set to anything but ON, the magic bytes won't be embedded @@ -235,6 +237,12 @@ target_compile_options(runtime-debug PUBLIC -DGIT_COMMIT='${GIT_COMMIT}' -D_FILE_OFFSET_BITS=64 ) +if(APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE) + target_compile_definitions(runtime-debug + PUBLIC -DENABLE_SETPROCTITLE + ) +endif() + # install binaries if(AUXILIARY_FILES_DESTINATION) diff --git a/src/build-runtime.sh.in b/src/build-runtime.sh.in index ac4c17a5f..9630fb7b7 100755 --- a/src/build-runtime.sh.in +++ b/src/build-runtime.sh.in @@ -24,6 +24,11 @@ repo_root="@CMAKE_CURRENT_SOURCE_DIR@" small_FLAGS="-Os -ffunction-sections -fdata-sections" small_LDFLAGS="-s -Wl,--gc-sections" +if [ "@APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE@" == "ON" ]; then + small_FLAGS="$SMALL_FLAGS -DENABLE_SETPROCTITLE" + small_LDFLAGS="$SMALL_LDFLAGS -lbsd" +fi + cd $repo_root git_version="@GIT_COMMIT@" @@ -60,7 +65,7 @@ objcopy --add-section .sig_key=8192_blank_bytes \ squashfuse_libs="@squashfuse_LIBRARIES@" $CC $small_FLAGS $small_LDFLAGS -o runtime "$repo_root"/elf.c "$repo_root"/notify.c "$repo_root"/getsection.c \ runtime4.o ${squashfuse_libs//;/ } \ - -Wl,-Bdynamic -lpthread -l"@libzlib_LIBRARIES@" -L"@libzlib_LIBRARY_DIRS@" -Wl,-Bstatic "@xz_LIBRARIES@" -Wl,-Bdynamic -ldl -lbsd + -Wl,-Bdynamic -lpthread -l"@libzlib_LIBRARIES@" -L"@libzlib_LIBRARY_DIRS@" -Wl,-Bstatic "@xz_LIBRARIES@" -Wl,-Bdynamic -ldl $STRIP runtime # Test if we can read it back diff --git a/src/runtime.c b/src/runtime.c index ce0bc472c..c73b3a420 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -288,6 +288,7 @@ main (int argc, char *argv[]) sprintf(appimage_path, "%s", getenv("TARGET_APPIMAGE")); sprintf(argv0_path, getenv("TARGET_APPIMAGE")); +#ifdef ENABLE_SETPROCTITLE char buffer[1024]; strcpy(buffer, getenv("TARGET_APPIMAGE")); for (int i = 1; i < argc; i++) { @@ -297,6 +298,7 @@ main (int argc, char *argv[]) setproctitle_init(argc, argv, environ); setproctitle("%s", buffer); +#endif } sprintf(argv0_path, argv[0]); From 54a9ab038660c04d6859cf419c718eae39dae8d3 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 28 Apr 2018 21:34:53 +0200 Subject: [PATCH 180/544] Don't include headers if not needed --- src/runtime.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index c73b3a420..3cbf00bd0 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -37,8 +37,10 @@ #include #include #include -#include -#include +#ifdef ENABLE_SETPROCTITLE + #include + #include +#endif #include #include #include From fbbbecd77895c8de22d07cab3ad821c00d50ce4a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sun, 29 Apr 2018 00:14:15 +0200 Subject: [PATCH 181/544] Remove -s flag which removes debug information --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5eba631b3..4244b66ac 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -231,7 +231,7 @@ target_link_libraries(runtime-debug bsd ) -set_target_properties(runtime-debug PROPERTIES LINK_FLAGS "-ffunction-sections -fdata-sections -s -Wl,--gc-sections") +set_target_properties(runtime-debug PROPERTIES LINK_FLAGS "-ffunction-sections -fdata-sections -Wl,--gc-sections") target_compile_options(runtime-debug PUBLIC -DGIT_COMMIT='${GIT_COMMIT}' -D_FILE_OFFSET_BITS=64 From ae352b58ff839303ab65f23dd440786c170e950e Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sun, 29 Apr 2018 00:23:22 +0200 Subject: [PATCH 182/544] Use double quotes to wrap git commit ID With single quotes, the compiler embeds the value as a numeric, which might e.g., be implicitly used as a pointer value, etc. This issue has been solved elsewhere by using double quotes as well. Hopefully this is the last remaining place where single quotes are used accidentally. --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4244b66ac..617a742ca 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -234,7 +234,7 @@ target_link_libraries(runtime-debug set_target_properties(runtime-debug PROPERTIES LINK_FLAGS "-ffunction-sections -fdata-sections -Wl,--gc-sections") target_compile_options(runtime-debug - PUBLIC -DGIT_COMMIT='${GIT_COMMIT}' -D_FILE_OFFSET_BITS=64 + PUBLIC -DGIT_COMMIT="${GIT_COMMIT}" -D_FILE_OFFSET_BITS=64 ) if(APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE) From d51acd7dd22b95b3d3bad4d813b015318f8763d9 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sun, 29 Apr 2018 00:25:33 +0200 Subject: [PATCH 183/544] Load libbsd dynamically Also replaces a few occurrences of sprintf with strcpy, as sprintf was misused and yielded compiler warnings. --- src/runtime.c | 52 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 3cbf00bd0..2d56d5e69 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -37,10 +37,6 @@ #include #include #include -#ifdef ENABLE_SETPROCTITLE - #include - #include -#endif #include #include #include @@ -284,27 +280,47 @@ main (int argc, char *argv[]) * functionality specifically for builds used by appimaged. */ if (getenv("TARGET_APPIMAGE") == NULL) { - sprintf(appimage_path, "/proc/self/exe"); - sprintf(argv0_path, argv[0]); + strcpy(appimage_path, "/proc/self/exe"); + strcpy(argv0_path, argv[0]); } else { - sprintf(appimage_path, "%s", getenv("TARGET_APPIMAGE")); - sprintf(argv0_path, getenv("TARGET_APPIMAGE")); + strcpy(appimage_path, getenv("TARGET_APPIMAGE")); + strcpy(argv0_path, getenv("TARGET_APPIMAGE")); #ifdef ENABLE_SETPROCTITLE - char buffer[1024]; - strcpy(buffer, getenv("TARGET_APPIMAGE")); - for (int i = 1; i < argc; i++) { - strcat(buffer, " "); - strcat(buffer, argv[i]); - } + // load libbsd dynamically to change proc title + // this is an optional feature, therefore we don't hard require it + void* libbsd = dlopen("libbsd.so", RTLD_NOW); + + if (libbsd != NULL) { + // clear error state + dlerror(); + + // try to load the two required symbols + void (*setproctitle_init)(int, char**, char**) = dlsym(libbsd, "setproctitle_init"); + + char* error; + + if ((error = dlerror()) == NULL) { + void (*setproctitle)(const char*, char*) = dlsym(libbsd, "setproctitle"); - setproctitle_init(argc, argv, environ); - setproctitle("%s", buffer); + if (dlerror() == NULL) { + char buffer[1024]; + strcpy(buffer, getenv("TARGET_APPIMAGE")); + for (int i = 1; i < argc; i++) { + strcat(buffer, " "); + strcat(buffer, argv[i]); + } + + (*setproctitle_init)(argc, argv, environ); + (*setproctitle)("%s", buffer); + } + } + + dlclose(libbsd); + } #endif } - sprintf(argv0_path, argv[0]); - fs_offset = get_elf_size(appimage_path); arg=getArg(argc,argv,'-'); From e6d6e7fe4ee5be1ff602cda5955035532d9e753e Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 2 May 2018 17:15:23 +0200 Subject: [PATCH 184/544] Refactor get_elf_size Use ssize_t to be able to add an error check (return value < 0). Before, the function just called exit(), which is undesirable when using from the library. Instead, the user of the library should be able to treat the error gracefully. Furthermore adds error checks everywhere the function is called. --- src/appimagetool.c | 8 ++++++-- src/elf.c | 32 +++++++++++++++----------------- src/elf.h | 2 +- src/runtime.c | 8 +++++++- src/shared.c | 41 +++++++++++++++++++++++++++++++---------- 5 files changed, 60 insertions(+), 31 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 2c7a779ad..d7110a099 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -104,8 +104,12 @@ int sfs_ls(char* image) { sqfs_traverse trv; sqfs fs; - unsigned long fs_offset = get_elf_size(image); - + ssize_t fs_offset = get_elf_size(image); + + // error check + if (fs_offset < 0) + die("failed to read elf size"); + if ((err = sqfs_open_image(&fs, image, fs_offset))) die("sqfs_open_image error"); diff --git a/src/elf.c b/src/elf.c index 77fab66c7..dc5249e25 100644 --- a/src/elf.c +++ b/src/elf.c @@ -43,7 +43,7 @@ static uint64_t file64_to_cpu(uint64_t val) return val; } -static unsigned long read_elf32(int fd) +static ssize_t read_elf32(int fd) { Elf32_Ehdr ehdr32; Elf32_Shdr shdr32; @@ -55,7 +55,7 @@ static unsigned long read_elf32(int fd) if (ret < 0 || (size_t)ret != sizeof(ehdr32)) { fprintf(stderr, "Read of ELF header from %s failed: %s\n", fname, strerror(errno)); - exit(10); + return -1; } ehdr.e_shoff = file32_to_cpu(ehdr32.e_shoff); @@ -67,7 +67,7 @@ static unsigned long read_elf32(int fd) if (ret < 0 || (size_t)ret != sizeof(shdr32)) { fprintf(stderr, "Read of ELF section header from %s failed: %s\n", fname, strerror(errno)); - exit(10); + return -1; } /* ELF ends either with the table of section headers (SHT) or with a section. */ @@ -76,7 +76,7 @@ static unsigned long read_elf32(int fd) return sht_end > last_section_end ? sht_end : last_section_end; } -static unsigned long read_elf64(int fd) +static ssize_t read_elf64(int fd) { Elf64_Ehdr ehdr64; Elf64_Shdr shdr64; @@ -88,7 +88,7 @@ static unsigned long read_elf64(int fd) if (ret < 0 || (size_t)ret != sizeof(ehdr64)) { fprintf(stderr, "Read of ELF header from %s failed: %s\n", fname, strerror(errno)); - exit(10); + return -1; } ehdr.e_shoff = file64_to_cpu(ehdr64.e_shoff); @@ -100,7 +100,7 @@ static unsigned long read_elf64(int fd) if (ret < 0 || (size_t)ret != sizeof(shdr64)) { fprintf(stderr, "Read of ELF section header from %s failed: %s\n", fname, strerror(errno)); - exit(10); + return -1; } /* ELF ends either with the table of section headers (SHT) or with a section. */ @@ -109,38 +109,36 @@ static unsigned long read_elf64(int fd) return sht_end > last_section_end ? sht_end : last_section_end; } -unsigned long get_elf_size(const char *fname) -{ +ssize_t get_elf_size(const char* fname) { ssize_t ret; int fd; - static unsigned long size = 0; + ssize_t size = -1; fd = open(fname, O_RDONLY); if (fd < 0) { fprintf(stderr, "Cannot open %s: %s\n", fname, strerror(errno)); - return(1); + return -1; } ret = pread(fd, ehdr.e_ident, EI_NIDENT, 0); if (ret != EI_NIDENT) { fprintf(stderr, "Read of e_ident from %s failed: %s\n", fname, strerror(errno)); - return(1); + return -1; } if ((ehdr.e_ident[EI_DATA] != ELFDATA2LSB) && - (ehdr.e_ident[EI_DATA] != ELFDATA2MSB)) - { + (ehdr.e_ident[EI_DATA] != ELFDATA2MSB)) { fprintf(stderr, "Unkown ELF data order %u\n", ehdr.e_ident[EI_DATA]); - return(1); + return -1; } - if(ehdr.e_ident[EI_CLASS] == ELFCLASS32) { + if (ehdr.e_ident[EI_CLASS] == ELFCLASS32) { size = read_elf32(fd); - } else if(ehdr.e_ident[EI_CLASS] == ELFCLASS64) { + } else if (ehdr.e_ident[EI_CLASS] == ELFCLASS64) { size = read_elf64(fd); } else { fprintf(stderr, "Unknown ELF class %u\n", ehdr.e_ident[EI_CLASS]); - return(1); + return -1; } close(fd); diff --git a/src/elf.h b/src/elf.h index 77cc164dc..bbede7876 100644 --- a/src/elf.h +++ b/src/elf.h @@ -16,6 +16,6 @@ e_shoff + ( e_shentsize * e_shnum ) = 126584 #ifndef ELFSIZE_H #define ELFSIZE_H -unsigned long get_elf_size(const char *fname); +ssize_t get_elf_size(const char *fname); #endif /* ELFSIZE_H */ diff --git a/src/runtime.c b/src/runtime.c index 2d56d5e69..339a4ccb2 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -61,7 +61,7 @@ extern int notify(char *title, char *body, int timeout); struct stat st; -static long unsigned int fs_offset; // The offset at which a filesystem image is expected = end of this ELF +static ssize_t fs_offset; // The offset at which a filesystem image is expected = end of this ELF static void die(const char *msg) { fprintf(stderr, "%s\n", msg); @@ -323,6 +323,12 @@ main (int argc, char *argv[]) fs_offset = get_elf_size(appimage_path); + // error check + if (fs_offset < 0) { + printf("Failed to get fs offset for %s\n", appimage_path); + exit(EXIT_FAILURE); + } + arg=getArg(argc,argv,'-'); /* Print the help and then exit */ diff --git a/src/shared.c b/src/shared.c index a523c30ab..ce0cbea52 100644 --- a/src/shared.c +++ b/src/shared.c @@ -1210,7 +1210,6 @@ bool appimage_type2_register_in_system(const char *path, bool verbose) { #endif // the offset at which a squashfs image is expected - long unsigned int fs_offset; char* md5 = appimage_get_md5(path); // a structure that will hold the information from the desktop file @@ -1221,14 +1220,20 @@ bool appimage_type2_register_in_system(const char *path, bool verbose) { if (verbose) fprintf(stderr, "md5 of URI RFC 2396: %s\n", md5); - fs_offset = get_elf_size(path); + ssize_t fs_offset = get_elf_size(path); + + if (fs_offset < 0) { + if (verbose) + fprintf(stderr, "failed to read fs_offset\n"); + return false; + } if (verbose) fprintf(stderr, "fs_offset: %lu\n", fs_offset); sqfs fs; - sqfs_err err = sqfs_open_image(&fs, path, fs_offset); + sqfs_err err = sqfs_open_image(&fs, path, (size_t) fs_offset); if (err != SQFS_OK) { sqfs_destroy(&fs); @@ -1379,11 +1384,15 @@ int appimage_type2_is_terminal_app(const char* path) { if (md5 == NULL) return -1; - unsigned long fs_offset = get_elf_size(path); + ssize_t fs_offset = get_elf_size(path); + + // error check + if (fs_offset < 0) + return -1; sqfs fs; - sqfs_err err = sqfs_open_image(&fs, path, fs_offset); + sqfs_err err = sqfs_open_image(&fs, path, (size_t) fs_offset); if (err != SQFS_OK) { free(md5); @@ -1568,11 +1577,14 @@ int appimage_type2_shall_not_be_integrated(const char* path) { if (md5 == NULL) return -1; - unsigned long fs_offset = get_elf_size(path); + ssize_t fs_offset = get_elf_size(path); + + if (fs_offset < 0) + return -1; sqfs fs; - sqfs_err err = sqfs_open_image(&fs, path, fs_offset); + sqfs_err err = sqfs_open_image(&fs, path, (size_t) fs_offset); if (err != SQFS_OK) { free(md5); @@ -2026,11 +2038,20 @@ void appimage_type2_open(appimage_handler *handler) { #ifdef STANDALONE fprintf(stderr, "Opening %s as Type 2 AppImage\n", handler->path); #endif - long unsigned int fs_offset; // The offset at which a squashfs image is expected - fs_offset = get_elf_size(handler->path); + // The offset at which a squashfs image is expected + ssize_t fs_offset = get_elf_size(handler->path); + + if (fs_offset < 0) { +#ifdef STANDALONE + fprintf(stderr, "get_elf_size error\n"); +#endif + handler->is_open = false; + handler->cache = NULL; + return; + } sqfs *fs = malloc(sizeof(sqfs)); - sqfs_err err = sqfs_open_image(fs, handler->path, fs_offset); + sqfs_err err = sqfs_open_image(fs, handler->path, (size_t) fs_offset); if (err != SQFS_OK){ #ifdef STANDALONE fprintf(stderr, "sqfs_open_image error: %s\n", handler->path); From 0f7c6dd51e4ebf8ca45b3ad74b6fd14c96b91573 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 2 May 2018 17:17:57 +0200 Subject: [PATCH 185/544] Add get_elf_size to libappimage --- include/appimage/appimage.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index 016b7fbf7..b78230b2a 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -102,6 +102,22 @@ int appimage_type2_shall_not_be_integrated(const char* path); */ int appimage_shall_not_be_integrated(const char* path); +/* + * Calculate the size of an ELF file on disk based on the information in its header + * + * Example: + * + * ls -l 126584 + * + * Calculation using the values also reported by readelf -h: + * Start of section headers e_shoff 124728 + * Size of section headers e_shentsize 64 + * Number of section headers e_shnum 29 + * + * e_shoff + ( e_shentsize * e_shnum ) = 126584 + */ +ssize_t get_elf_size(const char *fname); + #ifdef __cplusplus } #endif From 34cbee4239b4a2e7e073a8aae630b8b8ee1969cb Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 2 May 2018 17:20:39 +0200 Subject: [PATCH 186/544] Remove duplicate declaration of get_elf_size --- src/elf.h | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 src/elf.h diff --git a/src/elf.h b/src/elf.h deleted file mode 100644 index bbede7876..000000000 --- a/src/elf.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -Calculate the size of an ELF file on disk based on the information in its header - -Example: - -ls -l 126584 - -Calculation using the values also reported by readelf -h: -Start of section headers e_shoff 124728 -Size of section headers e_shentsize 64 -Number of section headers e_shnum 29 - -e_shoff + ( e_shentsize * e_shnum ) = 126584 -*/ - -#ifndef ELFSIZE_H -#define ELFSIZE_H - -ssize_t get_elf_size(const char *fname); - -#endif /* ELFSIZE_H */ From e539e803ef5dac0f19b7192ca485f7aa18d9b6ce Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 2 May 2018 21:12:38 +0200 Subject: [PATCH 187/544] Add appimage_ prefix to get_elf_size Makes the API more consistent. --- include/appimage/appimage.h | 2 +- src/elf.c | 2 +- src/shared.c | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index b78230b2a..ec1379914 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -116,7 +116,7 @@ int appimage_shall_not_be_integrated(const char* path); * * e_shoff + ( e_shentsize * e_shnum ) = 126584 */ -ssize_t get_elf_size(const char *fname); +ssize_t appimage_get_elf_size(const char* fname); #ifdef __cplusplus } diff --git a/src/elf.c b/src/elf.c index dc5249e25..6e578b6e0 100644 --- a/src/elf.c +++ b/src/elf.c @@ -109,7 +109,7 @@ static ssize_t read_elf64(int fd) return sht_end > last_section_end ? sht_end : last_section_end; } -ssize_t get_elf_size(const char* fname) { +ssize_t appimage_get_elf_size(const char* fname) { ssize_t ret; int fd; ssize_t size = -1; diff --git a/src/shared.c b/src/shared.c index ce0cbea52..c10a3f665 100644 --- a/src/shared.c +++ b/src/shared.c @@ -1220,7 +1220,7 @@ bool appimage_type2_register_in_system(const char *path, bool verbose) { if (verbose) fprintf(stderr, "md5 of URI RFC 2396: %s\n", md5); - ssize_t fs_offset = get_elf_size(path); + ssize_t fs_offset = appimage_get_elf_size(path); if (fs_offset < 0) { if (verbose) @@ -1356,7 +1356,7 @@ int appimage_type1_is_terminal_app(const char* path) { if (!rv) { // if the key file hasn't been found and the error is not set to NOT_FOUND, return an error - if (error->code != G_KEY_FILE_ERROR_KEY_NOT_FOUND) + if (error != NULL && error->code != G_KEY_FILE_ERROR_KEY_NOT_FOUND) result = -1; else result = 0; @@ -1384,7 +1384,7 @@ int appimage_type2_is_terminal_app(const char* path) { if (md5 == NULL) return -1; - ssize_t fs_offset = get_elf_size(path); + ssize_t fs_offset = appimage_get_elf_size(path); // error check if (fs_offset < 0) @@ -1577,7 +1577,7 @@ int appimage_type2_shall_not_be_integrated(const char* path) { if (md5 == NULL) return -1; - ssize_t fs_offset = get_elf_size(path); + ssize_t fs_offset = appimage_get_elf_size(path); if (fs_offset < 0) return -1; @@ -2039,7 +2039,7 @@ void appimage_type2_open(appimage_handler *handler) { fprintf(stderr, "Opening %s as Type 2 AppImage\n", handler->path); #endif // The offset at which a squashfs image is expected - ssize_t fs_offset = get_elf_size(handler->path); + ssize_t fs_offset = appimage_get_elf_size(handler->path); if (fs_offset < 0) { #ifdef STANDALONE From 4a1dbd1c660a2e27fcd63728fd3622e837efa66b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 2 May 2018 21:54:13 +0200 Subject: [PATCH 188/544] Add missing includes --- include/appimage/appimage.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index ec1379914..64b0f2faf 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -1,5 +1,8 @@ #pragma once +#include +#include + #ifdef __cplusplus extern "C" { #endif From 17f54143c47b83e03ca312d3787a9b6e2cd7ed17 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 2 May 2018 21:54:34 +0200 Subject: [PATCH 189/544] Fix appimagetool build --- src/CMakeLists.txt | 5 +++++ src/appimagetool.c | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 617a742ca..773d0302a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -126,6 +126,11 @@ add_executable(appimagetool data.o ) +target_include_directories(appimagetool + PUBLIC $ + INTERFACE $ +) + target_link_libraries(appimagetool libglib libzlib diff --git a/src/appimagetool.c b/src/appimagetool.c index d7110a099..50670eccb 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -56,6 +56,7 @@ #include "elf.h" #include "getsection.h" +#include "appimage/appimage.h" #ifdef __linux__ #define HAVE_BINARY_RUNTIME @@ -104,7 +105,7 @@ int sfs_ls(char* image) { sqfs_traverse trv; sqfs fs; - ssize_t fs_offset = get_elf_size(image); + ssize_t fs_offset = appimage_get_elf_size(image); // error check if (fs_offset < 0) From 5ba234f38a3f70cc47f826bd41eff26a26af9fb2 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 2 May 2018 21:55:06 +0200 Subject: [PATCH 190/544] Fix runtime build --- src/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index 339a4ccb2..0fcf80f4a 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -321,7 +321,7 @@ main (int argc, char *argv[]) #endif } - fs_offset = get_elf_size(appimage_path); + fs_offset = appimage_get_elf_size(appimage_path); // error check if (fs_offset < 0) { From 5693fa914dfee6614efa34d49587f24fb8f58782 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 4 May 2018 20:52:58 +0200 Subject: [PATCH 191/544] Fix #757 --- cmake/dependencies.cmake | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index e6f26b228..bc522417e 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -348,5 +348,7 @@ mark_as_advanced(mksquashfs_BINARY) #### build dependency configuration #### # only have to build custom xz when not using system libxz -add_dependencies(squashfuse xz) -add_dependencies(mksquashfs xz) +if(TARGET xz-EXTERNAL) + add_dependencies(squashfuse xz-EXTERNAL) + add_dependencies(mksquashfs xz-EXTERNAL) +endif() From dd2ca30408930f7e06f33387d2fd3e86f037a251 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 4 May 2018 21:27:46 +0200 Subject: [PATCH 192/544] [debug] Log xz_LIBRARIES --- cmake/dependencies.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index bc522417e..fcf431d72 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -351,4 +351,6 @@ mark_as_advanced(mksquashfs_BINARY) if(TARGET xz-EXTERNAL) add_dependencies(squashfuse xz-EXTERNAL) add_dependencies(mksquashfs xz-EXTERNAL) + + message(WARNING "xz_LIBRARIES: ${xz_LIBRARIES}") endif() From 9d13533e01f7371205a2c87ff2c4df8a14c52f98 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 4 May 2018 21:41:46 +0200 Subject: [PATCH 193/544] Make external projects depend on each other Will eventually be replaced by ExternalProject_Add's DEPENDS option. --- cmake/dependencies.cmake | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index fcf431d72..9850615c3 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -349,8 +349,6 @@ mark_as_advanced(mksquashfs_BINARY) # only have to build custom xz when not using system libxz if(TARGET xz-EXTERNAL) - add_dependencies(squashfuse xz-EXTERNAL) - add_dependencies(mksquashfs xz-EXTERNAL) - - message(WARNING "xz_LIBRARIES: ${xz_LIBRARIES}") + add_dependencies(squashfuse-EXTERNAL xz-EXTERNAL) + add_dependencies(mksquashfs-EXTERNAL xz-EXTERNAL) endif() From 6e9b302b083cdab762d6440472766cbafb3793a7 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 4 May 2018 21:58:24 +0200 Subject: [PATCH 194/544] Fix target name --- cmake/dependencies.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 9850615c3..c980e9cbd 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -350,5 +350,5 @@ mark_as_advanced(mksquashfs_BINARY) # only have to build custom xz when not using system libxz if(TARGET xz-EXTERNAL) add_dependencies(squashfuse-EXTERNAL xz-EXTERNAL) - add_dependencies(mksquashfs-EXTERNAL xz-EXTERNAL) + add_dependencies(mksquashfs xz-EXTERNAL) endif() From e091ac57e6754b3eeaa465f4694b67f8473caf9f Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 4 May 2018 22:37:12 +0200 Subject: [PATCH 195/544] Fix inotify CMake package config --- cmake/FindINotify.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/FindINotify.cmake b/cmake/FindINotify.cmake index ca23a7006..f8bfb84f7 100644 --- a/cmake/FindINotify.cmake +++ b/cmake/FindINotify.cmake @@ -7,7 +7,7 @@ get_filename_component(INOTIFYTOOLS_LIBRARY_DIR ${INOTIFYTOOLS_LIBRARY} PATH) mark_as_advanced(INOTIFYTOOLS_LIBRARY_DIR) include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(INOTIFY DEFAULT_MSG INOTIFYTOOLS_INCLUDE_DIR INOTIFYTOOLS_LIBRARY_DIR) +find_package_handle_standard_args(INOTIFYTOOLS DEFAULT_MSG INOTIFYTOOLS_INCLUDE_DIR INOTIFYTOOLS_LIBRARY_DIR) IF(INOTIFYTOOLS_FOUND) SET(INOTIFYTOOLS_INCLUDE_DIRS ${INOTIFYTOOLS_INCLUDE_DIR}) From e9a21080b0daa66f13f2a268b029cfd0dae67825 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 4 May 2018 22:38:29 +0200 Subject: [PATCH 196/544] Fix find_package based import --- cmake/dependencies.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index c980e9cbd..f67eb49c7 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -64,11 +64,11 @@ function(import_find_pkg_target target_name pkg_name variable_prefix) message(STATUS "Importing target ${target_name} via find_package (${pkg_name})") find_package(${pkg_name}) - if(NOT ${pkg_name}_FOUND) + if(NOT ${variable_prefix}_FOUND) message(FATAL_ERROR "${pkg_name} could not be found on the system. You will have to either install it, or use the bundled package.") endif() - import_library(${prefix}) + import_library_from_prefix(${target_name} ${variable_prefix}) endfunction() From 38a43a4d0a1f48b5128218da6e8f27bd96ac9f21 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 4 May 2018 22:39:24 +0200 Subject: [PATCH 197/544] Fix dependency on xz --- cmake/dependencies.cmake | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index f67eb49c7..a33a4127f 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -1,3 +1,7 @@ +# >= 3.2 required for ExternalProject_Add_StepDependencies +cmake_minimum_required(VERSION 3.2) + + # find required system dependencies via pkg-config find_package(PkgConfig REQUIRED) @@ -349,6 +353,10 @@ mark_as_advanced(mksquashfs_BINARY) # only have to build custom xz when not using system libxz if(TARGET xz-EXTERNAL) - add_dependencies(squashfuse-EXTERNAL xz-EXTERNAL) - add_dependencies(mksquashfs xz-EXTERNAL) + if(TARGET squashfuse-EXTERNAL) + ExternalProject_Add_StepDependencies(squashfuse-EXTERNAL configure xz-EXTERNAL) + endif() + if(TARGET mksquashfs) + ExternalProject_Add_StepDependencies(mksquashfs configure xz-EXTERNAL) + endif() endif() From fd85edfed86f3d13070b8373a0a3caf205d59bd6 Mon Sep 17 00:00:00 2001 From: probonopd Date: Fri, 4 May 2018 23:57:11 +0200 Subject: [PATCH 198/544] Note on targeted build systems, closes #766 [ci skip] --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d80661773..3e4a6ee02 100644 --- a/README.md +++ b/README.md @@ -234,3 +234,5 @@ cd AppImageKit/ sudo bash -ex install-build-deps.sh bash -ex build.sh ``` + +Please note: It is not recommended nor supported to build AppImageKit on any newer build system than the oldest still-supported versions of major distributions for reasons outlined [here](https://github.com/AppImage/AppImageKit/wiki/Creating-AppImages#creating-appimages-that-are-compatible-with-many-systems). Currently we are targeting CentOS 6.x and Ubuntu 14.04 as build systems and we are not interested to build AppImageKit on newer versions anytime soon. Binaries built on those systems will run just fine on newer (later) target systems (distributions). From 8adb1105224e46b9c4a6ffc890e82862cd1ee956 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 5 May 2018 01:59:48 +0200 Subject: [PATCH 199/544] Combine target_link_libraries --- src/CMakeLists.txt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 773d0302a..446fe0160 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -131,16 +131,12 @@ target_include_directories(appimagetool INTERFACE $ ) -target_link_libraries(appimagetool - libglib - libzlib - squashfuse -) - target_link_libraries(appimagetool ${CMAKE_DL_LIBS} pthread + libglib libzlib + squashfuse xz xdg-basedir ) From 5f74701ffedc928a88e616ce7f61676f577b59c2 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 7 May 2018 17:08:50 +0200 Subject: [PATCH 200/544] Fix link issues --- src/CMakeLists.txt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 446fe0160..ce78cdcec 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -131,14 +131,19 @@ target_include_directories(appimagetool INTERFACE $ ) +# trick: list libraries on which imported static ones depend on in the PUBLIC section +# CMake then adds them after the PRIVATE ones in the linker command target_link_libraries(appimagetool + PRIVATE ${CMAKE_DL_LIBS} - pthread - libglib - libzlib squashfuse xz xdg-basedir + PUBLIC + pthread + libglib + libgio + libzlib ) target_compile_definitions(appimagetool From ed415bebecc1d54c47038dcd6fcdb03c4a33c262 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 3 May 2018 16:23:47 +0200 Subject: [PATCH 201/544] Add appimage_hexlify --- include/appimage/appimage.h | 6 ++++++ src/shared.c | 15 +++++++++++++++ tests/test_shared.cpp | 27 +++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index 64b0f2faf..2db5b4539 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -121,6 +121,12 @@ int appimage_shall_not_be_integrated(const char* path); */ ssize_t appimage_get_elf_size(const char* fname); +/* + * Creates hexadecimal representation of a byte array. Allocates a new char array (string) with the correct size that + * needs to be free()d. + */ +char* appimage_hexlify(const char* bytes, size_t numBytes); + #ifdef __cplusplus } #endif diff --git a/src/shared.c b/src/shared.c index c10a3f665..8c04098c7 100644 --- a/src/shared.c +++ b/src/shared.c @@ -2352,3 +2352,18 @@ void appimage_string_list_free(char** list) { free(list); } + +char* appimage_hexlify(const char* bytes, const size_t numBytes) { + // first of all, allocate the new string + // a hexadecimal representation works like "every byte will be represented by two chars" + // additionally, we need to null-terminate the string + char* hexlified = (char*) calloc((2 * numBytes + 1), sizeof(char)); + + for (size_t i = 0; i < numBytes; i++) { + char buffer[3]; + sprintf(buffer, "%02x", (unsigned char) bytes[i]); + strcat(hexlified, buffer); + } + + return hexlified; +} diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index 53ad5cce1..482354eda 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -188,6 +188,33 @@ TEST_F(SharedCTest, test_appimage_shall_not_integrate) { EXPECT_EQ(appimage_is_terminal_app("/invalid/path"), -1); } +static bool test_strcmp(char* a, char* b) { + return strcmp(a, b) == 0; +} + +TEST_F(SharedCTest, test_appimage_hexlify) { + { + char bytesIn[] = "\x00\x01\x02\x03\x04\x05\x06\x07"; + char expectedHex[] = "0001020304050607"; + + char* hexlified = appimage_hexlify(bytesIn, 8); + EXPECT_PRED2(test_strcmp, hexlified, expectedHex); + + // cleanup + free(hexlified); + } + { + char bytesIn[] = "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"; + char expectedHex[] = "f8f9fafbfcfdfeff"; + + char* hexlified = appimage_hexlify(bytesIn, 8); + EXPECT_PRED2(test_strcmp, hexlified, expectedHex); + + // cleanup + free(hexlified); + } +} + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); From f7e3e042d6fe1e32a36c25bf0cb3e47c2d700be8 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 3 May 2018 21:52:08 +0200 Subject: [PATCH 202/544] Fix error message --- src/appimagetool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 50670eccb..61bc658af 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -969,7 +969,7 @@ main (int argc, char *argv[]) int rv = get_elf_section_offset_and_length(destination, ".sha256_sig", &sig_offset, &sig_length); if (rv != 0 || sig_offset == 0 || sig_length == 0) { - die("Could not find section .sig_key in runtime"); + die("Could not find section .sha256_sig in runtime"); } if (verbose) { From 50174923bd2c329653c700eb1b2bd32cb6f22c59 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 3 May 2018 22:24:50 +0200 Subject: [PATCH 203/544] Use scopes to bring some structure into signature code --- src/appimagetool.c | 220 +++++++++++++++++++++++---------------------- 1 file changed, 115 insertions(+), 105 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 61bc658af..f5f531e60 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -963,161 +963,171 @@ main (int argc, char *argv[]) fp = NULL; - unsigned long sig_offset = 0; - unsigned long sig_length = 0; + FILE* destinationfp = fopen(destination, "r+"); - int rv = get_elf_section_offset_and_length(destination, ".sha256_sig", &sig_offset, &sig_length); + // calculate signature + { + unsigned long sig_offset = 0; + unsigned long sig_length = 0; - if (rv != 0 || sig_offset == 0 || sig_length == 0) { - die("Could not find section .sha256_sig in runtime"); - } + int rv = get_elf_section_offset_and_length(destination, ".sha256_sig", &sig_offset, &sig_length); - if (verbose) { - printf("sig_offset: %lu\n", sig_offset); - printf("sig_length: %lu\n", sig_length); - } + if (rv != 0 || sig_offset == 0 || sig_length == 0) { + die("Could not find section .sha256_sig in runtime"); + } - if (sig_offset == 0) { - die("Could not determine offset for signature"); - } + if (verbose) { + printf("sig_offset: %lu\n", sig_offset); + printf("sig_length: %lu\n", sig_length); + } - FILE* destinationfp = fopen(destination, "r+"); + if (sig_offset == 0) { + die("Could not determine offset for signature"); + } - if (destinationfp == NULL) - die("Not able to open the destination file for writing, aborting"); + if (destinationfp == NULL) + die("Not able to open the destination file for writing, aborting"); - // if(strlen(updateinformation)>sig_length) - // die("signature does not fit into segment, aborting"); + // if(strlen(updateinformation)>sig_length) + // die("signature does not fit into segment, aborting"); - fseek(destinationfp, sig_offset, SEEK_SET); + fseek(destinationfp, sig_offset, SEEK_SET); - FILE* ascfilefp = fopen(ascfile, "rb"); + FILE* ascfilefp = fopen(ascfile, "rb"); - if (ascfilefp == NULL) { - die("Not able to open the asc file for reading, aborting"); - } + if (ascfilefp == NULL) { + die("Not able to open the asc file for reading, aborting"); + } - static const int bufsize = 1024; - char buffer[bufsize]; + static const int bufsize = 1024; + char buffer[bufsize]; - size_t totalBytesRead = 0; + size_t totalBytesRead = 0; - while (!feof(ascfilefp)) { - size_t bytesRead = fread(buffer, sizeof(char), bufsize, ascfilefp); - totalBytesRead += bytesRead; + while (!feof(ascfilefp)) { + size_t bytesRead = fread(buffer, sizeof(char), bufsize, ascfilefp); + totalBytesRead += bytesRead; - if (totalBytesRead > sig_length) { - die("Error: cannot embed key in AppImage: size exceeds reserved ELF section size"); - } + if (totalBytesRead > sig_length) { + die("Error: cannot embed key in AppImage: size exceeds reserved ELF section size"); + } - size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destinationfp); + size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destinationfp); - if (bytesRead != bytesWritten) { - char message[128]; - sprintf(message, "Bytes read and written differ: %lu != %lu", (long unsigned) bytesRead, (long unsigned) bytesWritten); - die(message); + if (bytesRead != bytesWritten) { + char message[128]; + sprintf(message, "Bytes read and written differ: %lu != %lu", (long unsigned) bytesRead, + (long unsigned) bytesWritten); + die(message); + } } - } - fclose(ascfilefp); - if (g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) - unlink(digestfile); + fclose(ascfilefp); + if (g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) + unlink(digestfile); - if (sign_key == NULL || strlen(sign_key) > 0) { - // read which key was used to sign from signature - sprintf(command, "%s --batch --list-packets %s", gpg2_path, ascfile); + if (sign_key == NULL || strlen(sign_key) > 0) { + // read which key was used to sign from signature + sprintf(command, "%s --batch --list-packets %s", gpg2_path, ascfile); - fp = popen(command, "r"); + fp = popen(command, "r"); - if (fp == NULL) - die("Failed to call gpg[2] to detect signature's key ID"); + if (fp == NULL) + die("Failed to call gpg[2] to detect signature's key ID"); - while (!feof(fp)) { - size_t bytesRead = fread(buffer, sizeof(char), bufsize, fp); + while (!feof(fp)) { + size_t bytesRead = fread(buffer, sizeof(char), bufsize, fp); - char* keyid_pos = strstr(buffer, "keyid"); + char* keyid_pos = strstr(buffer, "keyid"); - if (keyid_pos == NULL) - continue; + if (keyid_pos == NULL) + continue; - char* keyIDBegin = keyid_pos + strlen("keyid "); - char* endOfKeyID = strstr(keyIDBegin, "\n"); + char* keyIDBegin = keyid_pos + strlen("keyid "); + char* endOfKeyID = strstr(keyIDBegin, "\n"); - sign_key = calloc(endOfKeyID - keyIDBegin, sizeof(char)); - memcpy(sign_key, keyIDBegin, endOfKeyID - keyIDBegin); - } + sign_key = calloc(endOfKeyID - keyIDBegin, sizeof(char)); + memcpy(sign_key, keyIDBegin, endOfKeyID - keyIDBegin); + } - // read rest of process input to avoid broken pipe error - while (!feof(fp)) { - fread(buffer, sizeof(char), bufsize, fp); - } + // read rest of process input to avoid broken pipe error + while (!feof(fp)) { + fread(buffer, sizeof(char), bufsize, fp); + } - int retval = pclose(fp); - fp = NULL; + int retval = pclose(fp); + fp = NULL; - if (retval != 0) - die("Failed to call gpg[2] to detect signature's key ID"); - } + if (retval != 0) + die("Failed to call gpg[2] to detect signature's key ID"); + } - if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) - unlink(ascfile); + if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) + unlink(ascfile); + } // export key and write into section - sprintf(command, "%s --batch --export --armor %s", gpg2_path, sign_key); + { + sprintf(command, "%s --batch --export --armor %s", gpg2_path, sign_key); - unsigned long key_offset, key_length; - rv = get_elf_section_offset_and_length(destination, ".sig_key", &key_offset, &key_length); + unsigned long key_offset, key_length; + int rv = get_elf_section_offset_and_length(destination, ".sig_key", &key_offset, &key_length); - if (verbose) { - printf("key_offset: %lu\n", key_offset); - printf("key_length: %lu\n", key_length); - } + if (verbose) { + printf("key_offset: %lu\n", key_offset); + printf("key_length: %lu\n", key_length); + } - if (rv != 0 || key_offset == 0 || key_length == 0) { - die("Could not find section .sig_key in runtime"); - } + if (rv != 0 || key_offset == 0 || key_length == 0) { + die("Could not find section .sig_key in runtime"); + } - fseek(destinationfp, key_offset, SEEK_SET); + fseek(destinationfp, key_offset, SEEK_SET); - fp = popen(command, "r"); + fp = popen(command, "r"); - if (fp == NULL) - die("Failed to call gpg[2] to export the signature key"); + if (fp == NULL) + die("Failed to call gpg[2] to export the signature key"); - totalBytesRead = 0; - while (!feof(fp)) { - size_t bytesRead = fread(buffer, sizeof(char), bufsize, fp); - totalBytesRead += bytesRead; + static const int bufsize = 1024; + char buffer[bufsize]; - if (totalBytesRead > key_length) { - // read rest of process input to avoid broken pipe error - while (!feof(fp)) { - fread(buffer, sizeof(char), bufsize, fp); + size_t totalBytesRead = 0; + while (!feof(fp)) { + size_t bytesRead = fread(buffer, sizeof(char), bufsize, fp); + totalBytesRead += bytesRead; + + if (totalBytesRead > key_length) { + // read rest of process input to avoid broken pipe error + while (!feof(fp)) { + fread(buffer, sizeof(char), bufsize, fp); + } + + pclose(fp); + die("Error: cannot embed key in AppImage: size exceeds reserved ELF section size"); } - pclose(fp); - die("Error: cannot embed key in AppImage: size exceeds reserved ELF section size"); + size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destinationfp); + + if (bytesRead != bytesWritten) { + char message[128]; + sprintf(message, "Error: Bytes read and written differ: %lu != %lu", + (long unsigned) bytesRead, (long unsigned) bytesWritten); + die(message); + } } - size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destinationfp); + int exportexitcode = pclose(fp); + fp = NULL; - if (bytesRead != bytesWritten) { + if (exportexitcode != 0) { char message[128]; - sprintf(message, "Error: Bytes read and written differ: %lu != %lu", (long unsigned) bytesRead, (long unsigned) bytesWritten); + sprintf(message, "GPG key export failed: exit code %d", exportexitcode); die(message); } - } - int exportexitcode = pclose(fp); - fp = NULL; - - if (exportexitcode != 0) { - char message[128]; - sprintf(message, "GPG key export failed: exit code %d", exportexitcode); - die(message); + fclose(destinationfp); } - - fclose(destinationfp); } } From 91f717b525adc953048ac6f8d9035067c9357af3 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 4 May 2018 01:37:35 +0200 Subject: [PATCH 204/544] Add MD5 digest section --- src/build-runtime.sh.in | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/build-runtime.sh.in b/src/build-runtime.sh.in index 9630fb7b7..69fbc78ea 100755 --- a/src/build-runtime.sh.in +++ b/src/build-runtime.sh.in @@ -44,15 +44,21 @@ cd "$build_dir" $CC -DGIT_COMMIT=\"$git_version\" -I"@xz_INCLUDE_DIRS@" -I"@squashfuse_INCLUDE_DIRS@" \ -D_FILE_OFFSET_BITS=64 -g $small_FLAGS -c "$repo_root"/runtime.c -# Prepare 1024 bytes of space for updateinformation +# Prepare 16 bytes of space for MD5 digest section +printf '\0%.0s' {0..1023} > 16_blank_bytes +objcopy --add-section .digest_md5=16_blank_bytes \ + --set-section-flags .digest_md5=noload,readonly runtime.o runtime1.o + +# Prepare 1024 bytes of space for update information section printf '\0%.0s' {0..1023} > 1024_blank_bytes objcopy --add-section .upd_info=1024_blank_bytes \ - --set-section-flags .upd_info=noload,readonly runtime.o runtime2.o + --set-section-flags .upd_info=noload,readonly runtime1.o runtime2.o objcopy --add-section .sha256_sig=1024_blank_bytes \ --set-section-flags .sha256_sig=noload,readonly runtime2.o runtime3.o +# prepare 8192 bytes of space for key section cat 1024_blank_bytes 1024_blank_bytes 1024_blank_bytes 1024_blank_bytes > 4096_blank_bytes cat 4096_blank_bytes 4096_blank_bytes > 8192_blank_bytes From 0f14e84ee081308b3ab4ca2f553be9beea945b84 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 4 May 2018 01:37:55 +0200 Subject: [PATCH 205/544] Add digest calculation algorithm --- include/appimage/appimage.h | 15 ++++ src/CMakeLists.txt | 5 ++ src/shared.c | 132 ++++++++++++++++++++++++++++++++++++ tests/test_shared.cpp | 19 ++++++ 4 files changed, 171 insertions(+) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index 2db5b4539..213ae7e55 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -121,6 +121,21 @@ int appimage_shall_not_be_integrated(const char* path); */ ssize_t appimage_get_elf_size(const char* fname); +/* + * Calculate MD5 digest of AppImage file, skipping the signature and digest sections. + * + * The digest section must be skipped as the value calculated by this method is going to be embedded in it by default. + * + * The signature section must be skipped as the signature will not be available at the time this hash is calculated. + * + * The hash is _not_ compatible with tools like md5sum. + * + * You need to allocate a char array of at least 16 bytes (128 bit) and pass a reference to it as digest parameter. + * The function will set it to the raw digest, without any kind of termination. Please use appimage_hexlify() if you + * need a textual representation. + */ +bool appimage_digest_md5(const char* fname, char* digest); + /* * Creates hexadecimal representation of a byte array. Allocates a new char array (string) with the correct size that * needs to be free()d. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ce78cdcec..a21ce844d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -154,6 +154,11 @@ target_compile_definitions(appimagetool PRIVATE -DENABLE_BINRELOC ) +target_include_directories(appimagetool + PUBLIC $ + INTERFACE $ +) + if(AUXILIARY_FILES_DESTINATION) message(STATUS "Installing auxiliary files in path: ${AUXILIARY_FILES_DESTINATION}") target_compile_definitions(appimagetool diff --git a/src/shared.c b/src/shared.c index 8c04098c7..e6cca6254 100644 --- a/src/shared.c +++ b/src/shared.c @@ -2353,6 +2353,138 @@ void appimage_string_list_free(char** list) { free(list); } +bool appimage_digest_md5(const char* path, char* digest) { + // only supported for type 2 and later + if (appimage_get_type(path, false) < 2) + return false; + + // skip digest, signature and key sections in digest calculation + unsigned long digest_md5_offset = 0, digest_md5_length = 0; + if (get_elf_section_offset_and_length(path, ".digest_md5", &digest_md5_offset, &digest_md5_length) != 0) + return false; + + unsigned long signature_offset = 0, signature_length = 0; + if (get_elf_section_offset_and_length(path, ".sha256_sig", &signature_offset, &signature_length) != 0) + return false; + + unsigned long sig_key_offset = 0, sig_key_length = 0; + if (get_elf_section_offset_and_length(path, ".sig_key", &sig_key_offset, &sig_key_length) != 0) + return false; + + GChecksum *checksum = g_checksum_new(G_CHECKSUM_MD5); + + // read file in chunks + static const int chunk_size = 4096; + + FILE *fp = fopen(path, "r"); + + // determine file size + fseek(fp, 0L, SEEK_END); + const long file_size = ftell(fp); + rewind(fp); + + long bytes_left = file_size; + + // if a section spans over more than a single chunk, we need emulate null bytes in the following chunks + ssize_t bytes_skip_following_chunks = 0; + + while (bytes_left > 0) { + char buffer[chunk_size]; + + long current_position = ftell(fp); + + ssize_t bytes_left_this_chunk = chunk_size; + + // first, check whether there's bytes left that need to be skipped + if (bytes_skip_following_chunks > 0) { + ssize_t bytes_skip_this_chunk = (bytes_skip_following_chunks % chunk_size == 0) ? chunk_size : (bytes_skip_following_chunks % chunk_size); + bytes_left_this_chunk -= bytes_skip_this_chunk; + + // we could just set it to 0 here, but it makes more sense to use -= for debugging + bytes_skip_following_chunks -= bytes_skip_this_chunk; + + // make sure to skip these bytes in the file + fseek(fp, bytes_skip_this_chunk, SEEK_CUR); + } + + // check whether there's a section in this chunk that we need to skip + if (digest_md5_offset != 0 && digest_md5_length != 0 && digest_md5_offset - current_position > 0 && digest_md5_offset - current_position < chunk_size) { + ssize_t begin_of_section = (digest_md5_offset - current_position) % chunk_size; + // read chunk before section + fread(buffer, sizeof(char), (size_t) begin_of_section, fp); + + bytes_left_this_chunk -= begin_of_section; + bytes_left_this_chunk -= digest_md5_length; + + // if bytes_left is now < 0, the section exceeds the current chunk + // this amount of bytes needs to be skipped in the future sections + if (bytes_left_this_chunk < 0) { + bytes_skip_following_chunks = (size_t) (-1 * bytes_left_this_chunk); + bytes_left_this_chunk = 0; + } + + // if there's bytes left to read, we need to seek the difference between chunk's end and bytes_left + fseek(fp, (chunk_size - bytes_left_this_chunk - begin_of_section), SEEK_CUR); + } + + // check whether there's a section in this chunk that we need to skip + if (signature_offset != 0 && signature_length != 0 && signature_offset - current_position > 0 && signature_offset - current_position < chunk_size) { + ssize_t begin_of_section = (signature_offset - current_position) % chunk_size; + // read chunk before section + fread(buffer, sizeof(char), (size_t) begin_of_section, fp); + + bytes_left_this_chunk -= begin_of_section; + bytes_left_this_chunk -= signature_length; + + // if bytes_left is now < 0, the section exceeds the current chunk + // this amount of bytes needs to be skipped in the future sections + if (bytes_left_this_chunk < 0) { + bytes_skip_following_chunks = (size_t) (-1 * bytes_left_this_chunk); + bytes_left_this_chunk = 0; + } + + // if there's bytes left to read, we need to seek the difference between chunk's end and bytes_left + fseek(fp, (chunk_size - bytes_left_this_chunk - begin_of_section), SEEK_CUR); + } + + // check whether there's a section in this chunk that we need to skip + if (sig_key_offset != 0 && sig_key_length != 0 && sig_key_offset - current_position > 0 && sig_key_offset - current_position < chunk_size) { + ssize_t begin_of_section = (sig_key_offset - current_position) % chunk_size; + // read chunk before section + fread(buffer, sizeof(char), (size_t) begin_of_section, fp); + + bytes_left_this_chunk -= begin_of_section; + bytes_left_this_chunk -= sig_key_length; + + // if bytes_left is now < 0, the section exceeds the current chunk + // this amount of bytes needs to be skipped in the future sections + if (bytes_left_this_chunk < 0) { + bytes_skip_following_chunks = (size_t) (-1 * bytes_left_this_chunk); + bytes_left_this_chunk = 0; + } + + // if there's bytes left to read, we need to seek the difference between chunk's end and bytes_left + fseek(fp, (chunk_size - bytes_left_this_chunk - begin_of_section), SEEK_CUR); + } + + // check whether we're done already + if (bytes_left_this_chunk > 0) { + // read data from file into buffer with the correct offset in case bytes have to be skipped + fread(buffer + (chunk_size - bytes_left_this_chunk), sizeof(char), (size_t) bytes_left_this_chunk, fp); + } + + // feed buffer into checksum calculation + g_checksum_update(checksum, (const guchar*) buffer, chunk_size); + + bytes_left -= chunk_size; + } + + gsize digest_len = 16; + g_checksum_get_digest(checksum, (guint8*) digest, &digest_len); + + return true; +} + char* appimage_hexlify(const char* bytes, const size_t numBytes) { // first of all, allocate the new string // a hexadecimal representation works like "every byte will be represented by two chars" diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index 482354eda..d918898d7 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -215,6 +215,25 @@ TEST_F(SharedCTest, test_appimage_hexlify) { } } +// compares whether the size first bytes of two given byte buffers are equal +bool test_compare_bytes(const char* buf1, const char* buf2, int size) { + for (int i = 0; i < size; i++) { + if (buf1[i] != buf2[i]) { + return false; + } + } + + return true; +} + +TEST_F(SharedCTest, test_appimage_digest_md5) { + char digest[16]; + char expectedDigest[] = {-20, 92, -89, 99, -47, -62, 14, 36, -5, -127, 65, -126, 116, -41, -33, -121}; + + EXPECT_TRUE(appimage_digest_md5(appImage_type_2_file_path.c_str(), digest)); + EXPECT_PRED3(test_compare_bytes, digest, expectedDigest, 16); +} + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); From 6c5da91d5b86f1c0d03944618ff12ae08f21bc42 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 4 May 2018 01:41:29 +0200 Subject: [PATCH 206/544] Fix code style --- src/appimagetool.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index f5f531e60..09f44dbe5 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -857,19 +857,19 @@ main (int argc, char *argv[]) } } - if(sign){ + if (sign) { bool using_gpg = FALSE; bool using_shasum = FALSE; /* The user has indicated that he wants to sign */ - gchar *gpg2_path = g_find_program_in_path("gpg2"); + gchar* gpg2_path = g_find_program_in_path("gpg2"); if (!gpg2_path) { gpg2_path = g_find_program_in_path("gpg"); using_gpg = TRUE; } - gchar *sha256sum_path = g_find_program_in_path("sha256sum"); + gchar* sha256sum_path = g_find_program_in_path("sha256sum"); if (!sha256sum_path) { sha256sum_path = g_find_program_in_path("shasum"); @@ -882,7 +882,7 @@ main (int argc, char *argv[]) fprintf(stderr, "sha256sum or shasum is not installed, cannot sign\n"); } else { fprintf(stderr, "%s and %s are installed and user requested to sign, " - "hence signing\n", using_gpg ? "gpg" : "gpg2", + "hence signing\n", using_gpg ? "gpg" : "gpg2", using_shasum ? "shasum" : "sha256sum"); char* digestfile; @@ -1130,15 +1130,15 @@ main (int argc, char *argv[]) } } } - + /* If updateinformation was provided, then we also generate the zsync file (after having signed the AppImage) */ - if(updateinformation != NULL){ - gchar *zsyncmake_path = g_find_program_in_path ("zsyncmake"); - if(!zsyncmake_path){ - fprintf (stderr, "zsyncmake is not installed/bundled, skipping\n"); + if (updateinformation != NULL) { + gchar* zsyncmake_path = g_find_program_in_path("zsyncmake"); + if (!zsyncmake_path) { + fprintf(stderr, "zsyncmake is not installed/bundled, skipping\n"); } else { - fprintf (stderr, "zsyncmake is available and updateinformation is provided, " - "hence generating zsync file\n"); + fprintf(stderr, "zsyncmake is available and updateinformation is provided, " + "hence generating zsync file\n"); int pid = fork(); @@ -1173,13 +1173,13 @@ main (int argc, char *argv[]) die("zsyncmake command did not succeed"); } } - } - - fprintf (stderr, "Success\n\n"); - fprintf (stderr, "Please consider submitting your AppImage to AppImageHub, the crowd-sourced\n"); - fprintf (stderr, "central directory of available AppImages, by opening a pull request\n"); - fprintf (stderr, "at https://github.com/AppImage/appimage.github.io\n"); } + + fprintf(stderr, "Success\n\n"); + fprintf(stderr, "Please consider submitting your AppImage to AppImageHub, the crowd-sourced\n"); + fprintf(stderr, "central directory of available AppImages, by opening a pull request\n"); + fprintf(stderr, "at https://github.com/AppImage/appimage.github.io\n"); + } /* If the first argument is a regular file, then we assume that we should unpack it */ if (g_file_test (remaining_args[0], G_FILE_TEST_IS_REGULAR)){ From 5d037a0690ab6dee82b8d376f66304cd78ba7048 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 8 May 2018 00:50:54 +0200 Subject: [PATCH 207/544] Rename and improve MD5 digest function --- include/appimage/appimage.h | 4 +- src/CMakeLists.txt | 22 +++- src/appimagetool_shared.c | 202 ++++++++++++++++++++++++++++++++++++ src/build-runtime.sh.in | 2 +- src/digest_md5.c | 96 +++++++++++++++++ src/shared.c | 199 ----------------------------------- tests/CMakeLists.txt | 1 + tests/test_shared.cpp | 4 +- 8 files changed, 326 insertions(+), 204 deletions(-) create mode 100644 src/appimagetool_shared.c create mode 100644 src/digest_md5.c diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index 213ae7e55..f9edf50ae 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -133,8 +133,10 @@ ssize_t appimage_get_elf_size(const char* fname); * You need to allocate a char array of at least 16 bytes (128 bit) and pass a reference to it as digest parameter. * The function will set it to the raw digest, without any kind of termination. Please use appimage_hexlify() if you * need a textual representation. + * + * Please beware that this calculation is only available for type 2 AppImages. */ -bool appimage_digest_md5(const char* fname, char* digest); +bool appimage_type2_digest_md5(const char* fname, char* digest); /* * Creates hexadecimal representation of a byte array. Allocates a new char array (string) with the correct size that diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a21ce844d..b8dbe3ed8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -43,10 +43,12 @@ set(AUXILIARY_FILES_DESTINATION "lib/appimagekit" CACHE STRING "Target install d add_library(libappimage SHARED + ${PROJECT_SOURCE_DIR}/include/appimage/appimage.h shared.c getsection.c notify.c elf.c + appimagetool_shared.c ) set_target_properties(libappimage PROPERTIES PREFIX "") @@ -85,6 +87,7 @@ add_library(libappimage_static STATIC getsection.c notify.c elf.c + appimagetool_shared.c ) set_target_properties(libappimage_static PROPERTIES PREFIX "") @@ -119,11 +122,13 @@ target_link_libraries(libappimage_static add_executable(appimagetool + ${PROJECT_SOURCE_DIR}/include/appimage/appimage.h appimagetool.c getsection.c binreloc.c elf.c data.o + appimagetool_shared.c ) target_include_directories(appimagetool @@ -169,7 +174,7 @@ endif() add_sanitizers(appimagetool) -add_executable(appimaged appimaged.c notify.c elf.c getsection.c) +add_executable(appimaged appimaged.c notify.c elf.c getsection.c appimagetool_shared.c) target_link_libraries(appimaged pthread @@ -255,6 +260,21 @@ if(APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE) endif() +# digest_md5 demo application +# can be used to verify AppImages' MD5 digest +add_executable(digest_md5 EXCLUDE_FROM_ALL digest_md5.c getsection.c appimagetool_shared.c) + +target_include_directories(digest_md5 + PUBLIC $ + INTERFACE $ +) + +target_link_libraries(digest_md5 + PRIVATE + libglib +) + + # install binaries if(AUXILIARY_FILES_DESTINATION) install( diff --git a/src/appimagetool_shared.c b/src/appimagetool_shared.c new file mode 100644 index 000000000..96bc2de06 --- /dev/null +++ b/src/appimagetool_shared.c @@ -0,0 +1,202 @@ +#include +#include +#include +#include + +#include "appimage/appimage.h" +#include "getsection.h" + +/* Check if a file is an AppImage. Returns the image type if it is, or -1 if it isn't */ +int appimage_get_type(const char* path, bool verbose) +{ + FILE *f = fopen(path, "rt"); + if (f != NULL) + { + char buffer[3] = {0}; + + /* Check magic bytes at offset 8 */ + fseek(f, 8, SEEK_SET); + fread(buffer, 1, 3, f); + fclose(f); + if((buffer[0] == 0x41) && (buffer[1] == 0x49) && (buffer[2] == 0x01)){ +#ifdef STANDALONE + fprintf(stderr, "_________________________\n"); +#endif + if(verbose){ + fprintf(stderr, "AppImage type 1\n"); + } + return 1; + } else if((buffer[0] == 0x41) && (buffer[1] == 0x49) && (buffer[2] == 0x02)){ +#ifdef STANDALONE + fprintf(stderr, "_________________________\n"); +#endif + if(verbose){ + fprintf(stderr, "AppImage type 2\n"); + } + return 2; + } else { + if((g_str_has_suffix(path,".AppImage")) || (g_str_has_suffix(path,".appimage"))) { +#ifdef STANDALONE + fprintf(stderr, "_________________________\n"); +#endif + if (verbose) { + fprintf(stderr, "Blindly assuming AppImage type 1\n"); + fprintf(stderr, "The author of this AppImage should embed the magic bytes, see https://github.com/AppImage/AppImageSpec\n"); + } + return 1; + } else { +#ifdef STANDALONE + fprintf(stderr, "_________________________\n"); +#endif + if(verbose){ + fprintf(stderr, "Unrecognized file '%s'\n", path); + } + return -1; + } + } + } + return -1; +} + +bool appimage_type2_digest_md5(const char* path, char* digest) { + // skip digest, signature and key sections in digest calculation + unsigned long digest_md5_offset = 0, digest_md5_length = 0; + if (get_elf_section_offset_and_length(path, ".digest_md5", &digest_md5_offset, &digest_md5_length) != 0) + return false; + + unsigned long signature_offset = 0, signature_length = 0; + if (get_elf_section_offset_and_length(path, ".sha256_sig", &signature_offset, &signature_length) != 0) + return false; + + unsigned long sig_key_offset = 0, sig_key_length = 0; + if (get_elf_section_offset_and_length(path, ".sig_key", &sig_key_offset, &sig_key_length) != 0) + return false; + + GChecksum *checksum = g_checksum_new(G_CHECKSUM_MD5); + + // read file in chunks + static const int chunk_size = 4096; + + FILE *fp = fopen(path, "r"); + + // determine file size + fseek(fp, 0L, SEEK_END); + const long file_size = ftell(fp); + rewind(fp); + + long bytes_left = file_size; + + // if a section spans over more than a single chunk, we need emulate null bytes in the following chunks + ssize_t bytes_skip_following_chunks = 0; + + while (bytes_left > 0) { + char buffer[chunk_size]; + + long current_position = ftell(fp); + + ssize_t bytes_left_this_chunk = chunk_size; + + // first, check whether there's bytes left that need to be skipped + if (bytes_skip_following_chunks > 0) { + ssize_t bytes_skip_this_chunk = (bytes_skip_following_chunks % chunk_size == 0) ? chunk_size : (bytes_skip_following_chunks % chunk_size); + bytes_left_this_chunk -= bytes_skip_this_chunk; + + // we could just set it to 0 here, but it makes more sense to use -= for debugging + bytes_skip_following_chunks -= bytes_skip_this_chunk; + + // make sure to skip these bytes in the file + fseek(fp, bytes_skip_this_chunk, SEEK_CUR); + } + + // check whether there's a section in this chunk that we need to skip + if (digest_md5_offset != 0 && digest_md5_length != 0 && digest_md5_offset - current_position > 0 && digest_md5_offset - current_position < chunk_size) { + ssize_t begin_of_section = (digest_md5_offset - current_position) % chunk_size; + // read chunk before section + fread(buffer, sizeof(char), (size_t) begin_of_section, fp); + + bytes_left_this_chunk -= begin_of_section; + bytes_left_this_chunk -= digest_md5_length; + + // if bytes_left is now < 0, the section exceeds the current chunk + // this amount of bytes needs to be skipped in the future sections + if (bytes_left_this_chunk < 0) { + bytes_skip_following_chunks = (size_t) (-1 * bytes_left_this_chunk); + bytes_left_this_chunk = 0; + } + + // if there's bytes left to read, we need to seek the difference between chunk's end and bytes_left + fseek(fp, (chunk_size - bytes_left_this_chunk - begin_of_section), SEEK_CUR); + } + + // check whether there's a section in this chunk that we need to skip + if (signature_offset != 0 && signature_length != 0 && signature_offset - current_position > 0 && signature_offset - current_position < chunk_size) { + ssize_t begin_of_section = (signature_offset - current_position) % chunk_size; + // read chunk before section + fread(buffer, sizeof(char), (size_t) begin_of_section, fp); + + bytes_left_this_chunk -= begin_of_section; + bytes_left_this_chunk -= signature_length; + + // if bytes_left is now < 0, the section exceeds the current chunk + // this amount of bytes needs to be skipped in the future sections + if (bytes_left_this_chunk < 0) { + bytes_skip_following_chunks = (size_t) (-1 * bytes_left_this_chunk); + bytes_left_this_chunk = 0; + } + + // if there's bytes left to read, we need to seek the difference between chunk's end and bytes_left + fseek(fp, (chunk_size - bytes_left_this_chunk - begin_of_section), SEEK_CUR); + } + + // check whether there's a section in this chunk that we need to skip + if (sig_key_offset != 0 && sig_key_length != 0 && sig_key_offset - current_position > 0 && sig_key_offset - current_position < chunk_size) { + ssize_t begin_of_section = (sig_key_offset - current_position) % chunk_size; + // read chunk before section + fread(buffer, sizeof(char), (size_t) begin_of_section, fp); + + bytes_left_this_chunk -= begin_of_section; + bytes_left_this_chunk -= sig_key_length; + + // if bytes_left is now < 0, the section exceeds the current chunk + // this amount of bytes needs to be skipped in the future sections + if (bytes_left_this_chunk < 0) { + bytes_skip_following_chunks = (size_t) (-1 * bytes_left_this_chunk); + bytes_left_this_chunk = 0; + } + + // if there's bytes left to read, we need to seek the difference between chunk's end and bytes_left + fseek(fp, (chunk_size - bytes_left_this_chunk - begin_of_section), SEEK_CUR); + } + + // check whether we're done already + if (bytes_left_this_chunk > 0) { + // read data from file into buffer with the correct offset in case bytes have to be skipped + fread(buffer + (chunk_size - bytes_left_this_chunk), sizeof(char), (size_t) bytes_left_this_chunk, fp); + } + + // feed buffer into checksum calculation + g_checksum_update(checksum, (const guchar*) buffer, chunk_size); + + bytes_left -= chunk_size; + } + + gsize digest_len = 16; + g_checksum_get_digest(checksum, (guint8*) digest, &digest_len); + + return true; +} + +char* appimage_hexlify(const char* bytes, const size_t numBytes) { + // first of all, allocate the new string + // a hexadecimal representation works like "every byte will be represented by two chars" + // additionally, we need to null-terminate the string + char* hexlified = (char*) calloc((2 * numBytes + 1), sizeof(char)); + + for (size_t i = 0; i < numBytes; i++) { + char buffer[3]; + sprintf(buffer, "%02x", (unsigned char) bytes[i]); + strcat(hexlified, buffer); + } + + return hexlified; +} diff --git a/src/build-runtime.sh.in b/src/build-runtime.sh.in index 69fbc78ea..90a6aea57 100755 --- a/src/build-runtime.sh.in +++ b/src/build-runtime.sh.in @@ -45,7 +45,7 @@ $CC -DGIT_COMMIT=\"$git_version\" -I"@xz_INCLUDE_DIRS@" -I"@squashfuse_INCLUDE_D -D_FILE_OFFSET_BITS=64 -g $small_FLAGS -c "$repo_root"/runtime.c # Prepare 16 bytes of space for MD5 digest section -printf '\0%.0s' {0..1023} > 16_blank_bytes +printf '\0%.0s' {0..15} > 16_blank_bytes objcopy --add-section .digest_md5=16_blank_bytes \ --set-section-flags .digest_md5=noload,readonly runtime.o runtime1.o diff --git a/src/digest_md5.c b/src/digest_md5.c new file mode 100644 index 000000000..ee7bdabf2 --- /dev/null +++ b/src/digest_md5.c @@ -0,0 +1,96 @@ +#include +#include +#include + +#include "appimage/appimage.h" +#include "getsection.h" + + +bool compare_byte_buffers(const char* buf1, const char* buf2, size_t num_bytes) { + for (size_t i = 0; i < num_bytes; i++) { + if (buf1[i] != buf2[i]) { + return false; + } + } + + return true; +} + + +int main(int argc, char* argv[]) { + if (argc != 2) { + printf("Usage: %s \n", argv[0]); + printf("\n"); + printf("Calculate AppImage MD5 digest, and compare it to embedded value (if available)\n"); + } + + const char* fname = argv[1]; + if (!g_file_test(fname, G_FILE_TEST_IS_REGULAR)) { + fprintf(stderr, "No such file or directory: %s\n", fname); + return 1; + } + + static const int digest_size = 16; + + // first, calculate MD5 digest using algorithm in libappimage + char expected_digest[digest_size]; + + if (!appimage_type2_digest_md5(fname, expected_digest)) { + fprintf(stderr, "Could not calculate MD5 digest\n"); + return 1; + } + + // print hex encoded digest + char* hexlified_expected_digest = appimage_hexlify(expected_digest, digest_size); + printf("calculated: %s\n", hexlified_expected_digest); + free(hexlified_expected_digest); + + unsigned long offset = 0, length = 0; + + static const char section_name[] = ".digest_md5"; + + if (get_elf_section_offset_and_length(fname, section_name, &offset, &length) != 0 || offset == 0 || length == 0) { + fprintf(stderr, "Could not find %s section in file\n", section_name); + return 1; + } + + if (length < digest_size) { + fprintf(stderr, + "Invalid section length for section %s: expected %d bytes, found %lu bytes\n", + section_name, digest_size, length + ); + return 1; + } + + char embedded_digest[digest_size]; + FILE* fp = fopen(fname, "r"); + + if (fp == NULL) { + fprintf(stderr, "Failed to open AppImage for writing"); + return 1; + } + + if (fseek(fp, offset, SEEK_SET) != 0) { + fprintf(stderr, "Failed to read embedded digest: failed to seek to offset\n"); + fclose(fp); + return 1; + } + + if (fread(embedded_digest, sizeof(char), digest_size, fp) != digest_size) { + fprintf(stderr, "Failed to read embedded digest: read invalid amount of bytes from file\n"); + fclose(fp); + return 1; + } + + char* hexlified_embedded_digest = appimage_hexlify(embedded_digest, digest_size); + printf(" embedded: %s\n", embedded_digest); + free(hexlified_embedded_digest); + + if (compare_byte_buffers(expected_digest, embedded_digest, digest_size)) { + printf("Digests match\n"); + return 0; + } else { + printf("Digests don't match!"); + return 1; + } +} diff --git a/src/shared.c b/src/shared.c index e6cca6254..d27e33682 100644 --- a/src/shared.c +++ b/src/shared.c @@ -236,58 +236,6 @@ void move_icon_to_destination(gchar *icon_path, gboolean verbose) } -/* Check if a file is an AppImage. Returns the image type if it is, or -1 if it isn't */ -int appimage_get_type(const char* path, bool verbose) -{ - FILE *f = fopen(path, "rt"); - if (f != NULL) - { - char buffer[3] = {0}; - - /* Check magic bytes at offset 8 */ - fseek(f, 8, SEEK_SET); - fread(buffer, 1, 3, f); - fclose(f); - if((buffer[0] == 0x41) && (buffer[1] == 0x49) && (buffer[2] == 0x01)){ -#ifdef STANDALONE - fprintf(stderr, "_________________________\n"); -#endif - if(verbose){ - fprintf(stderr, "AppImage type 1\n"); - } - return 1; - } else if((buffer[0] == 0x41) && (buffer[1] == 0x49) && (buffer[2] == 0x02)){ -#ifdef STANDALONE - fprintf(stderr, "_________________________\n"); -#endif - if(verbose){ - fprintf(stderr, "AppImage type 2\n"); - } - return 2; - } else { - if((g_str_has_suffix(path,".AppImage")) || (g_str_has_suffix(path,".appimage"))) { -#ifdef STANDALONE - fprintf(stderr, "_________________________\n"); -#endif - if (verbose) { - fprintf(stderr, "Blindly assuming AppImage type 1\n"); - fprintf(stderr, "The author of this AppImage should embed the magic bytes, see https://github.com/AppImage/AppImageSpec\n"); - } - return 1; - } else { -#ifdef STANDALONE - fprintf(stderr, "_________________________\n"); -#endif - if(verbose){ - fprintf(stderr, "Unrecognized file '%s'\n", path); - } - return -1; - } - } - } - return -1; -} - /* Get filename extension */ static gchar *get_file_extension(const gchar *filename) { @@ -2352,150 +2300,3 @@ void appimage_string_list_free(char** list) { free(list); } - -bool appimage_digest_md5(const char* path, char* digest) { - // only supported for type 2 and later - if (appimage_get_type(path, false) < 2) - return false; - - // skip digest, signature and key sections in digest calculation - unsigned long digest_md5_offset = 0, digest_md5_length = 0; - if (get_elf_section_offset_and_length(path, ".digest_md5", &digest_md5_offset, &digest_md5_length) != 0) - return false; - - unsigned long signature_offset = 0, signature_length = 0; - if (get_elf_section_offset_and_length(path, ".sha256_sig", &signature_offset, &signature_length) != 0) - return false; - - unsigned long sig_key_offset = 0, sig_key_length = 0; - if (get_elf_section_offset_and_length(path, ".sig_key", &sig_key_offset, &sig_key_length) != 0) - return false; - - GChecksum *checksum = g_checksum_new(G_CHECKSUM_MD5); - - // read file in chunks - static const int chunk_size = 4096; - - FILE *fp = fopen(path, "r"); - - // determine file size - fseek(fp, 0L, SEEK_END); - const long file_size = ftell(fp); - rewind(fp); - - long bytes_left = file_size; - - // if a section spans over more than a single chunk, we need emulate null bytes in the following chunks - ssize_t bytes_skip_following_chunks = 0; - - while (bytes_left > 0) { - char buffer[chunk_size]; - - long current_position = ftell(fp); - - ssize_t bytes_left_this_chunk = chunk_size; - - // first, check whether there's bytes left that need to be skipped - if (bytes_skip_following_chunks > 0) { - ssize_t bytes_skip_this_chunk = (bytes_skip_following_chunks % chunk_size == 0) ? chunk_size : (bytes_skip_following_chunks % chunk_size); - bytes_left_this_chunk -= bytes_skip_this_chunk; - - // we could just set it to 0 here, but it makes more sense to use -= for debugging - bytes_skip_following_chunks -= bytes_skip_this_chunk; - - // make sure to skip these bytes in the file - fseek(fp, bytes_skip_this_chunk, SEEK_CUR); - } - - // check whether there's a section in this chunk that we need to skip - if (digest_md5_offset != 0 && digest_md5_length != 0 && digest_md5_offset - current_position > 0 && digest_md5_offset - current_position < chunk_size) { - ssize_t begin_of_section = (digest_md5_offset - current_position) % chunk_size; - // read chunk before section - fread(buffer, sizeof(char), (size_t) begin_of_section, fp); - - bytes_left_this_chunk -= begin_of_section; - bytes_left_this_chunk -= digest_md5_length; - - // if bytes_left is now < 0, the section exceeds the current chunk - // this amount of bytes needs to be skipped in the future sections - if (bytes_left_this_chunk < 0) { - bytes_skip_following_chunks = (size_t) (-1 * bytes_left_this_chunk); - bytes_left_this_chunk = 0; - } - - // if there's bytes left to read, we need to seek the difference between chunk's end and bytes_left - fseek(fp, (chunk_size - bytes_left_this_chunk - begin_of_section), SEEK_CUR); - } - - // check whether there's a section in this chunk that we need to skip - if (signature_offset != 0 && signature_length != 0 && signature_offset - current_position > 0 && signature_offset - current_position < chunk_size) { - ssize_t begin_of_section = (signature_offset - current_position) % chunk_size; - // read chunk before section - fread(buffer, sizeof(char), (size_t) begin_of_section, fp); - - bytes_left_this_chunk -= begin_of_section; - bytes_left_this_chunk -= signature_length; - - // if bytes_left is now < 0, the section exceeds the current chunk - // this amount of bytes needs to be skipped in the future sections - if (bytes_left_this_chunk < 0) { - bytes_skip_following_chunks = (size_t) (-1 * bytes_left_this_chunk); - bytes_left_this_chunk = 0; - } - - // if there's bytes left to read, we need to seek the difference between chunk's end and bytes_left - fseek(fp, (chunk_size - bytes_left_this_chunk - begin_of_section), SEEK_CUR); - } - - // check whether there's a section in this chunk that we need to skip - if (sig_key_offset != 0 && sig_key_length != 0 && sig_key_offset - current_position > 0 && sig_key_offset - current_position < chunk_size) { - ssize_t begin_of_section = (sig_key_offset - current_position) % chunk_size; - // read chunk before section - fread(buffer, sizeof(char), (size_t) begin_of_section, fp); - - bytes_left_this_chunk -= begin_of_section; - bytes_left_this_chunk -= sig_key_length; - - // if bytes_left is now < 0, the section exceeds the current chunk - // this amount of bytes needs to be skipped in the future sections - if (bytes_left_this_chunk < 0) { - bytes_skip_following_chunks = (size_t) (-1 * bytes_left_this_chunk); - bytes_left_this_chunk = 0; - } - - // if there's bytes left to read, we need to seek the difference between chunk's end and bytes_left - fseek(fp, (chunk_size - bytes_left_this_chunk - begin_of_section), SEEK_CUR); - } - - // check whether we're done already - if (bytes_left_this_chunk > 0) { - // read data from file into buffer with the correct offset in case bytes have to be skipped - fread(buffer + (chunk_size - bytes_left_this_chunk), sizeof(char), (size_t) bytes_left_this_chunk, fp); - } - - // feed buffer into checksum calculation - g_checksum_update(checksum, (const guchar*) buffer, chunk_size); - - bytes_left -= chunk_size; - } - - gsize digest_len = 16; - g_checksum_get_digest(checksum, (guint8*) digest, &digest_len); - - return true; -} - -char* appimage_hexlify(const char* bytes, const size_t numBytes) { - // first of all, allocate the new string - // a hexadecimal representation works like "every byte will be represented by two chars" - // additionally, we need to null-terminate the string - char* hexlified = (char*) calloc((2 * numBytes + 1), sizeof(char)); - - for (size_t i = 0; i < numBytes; i++) { - char buffer[3]; - sprintf(buffer, "%02x", (unsigned char) bytes[i]); - strcat(hexlified, buffer); - } - - return hexlified; -} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f4485f743..0b20bef1a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -28,6 +28,7 @@ if(BUILD_TESTING) ${PROJECT_SOURCE_DIR}/src/shared.c ${PROJECT_SOURCE_DIR}/src/elf.c ${PROJECT_SOURCE_DIR}/src/getsection.c + ${PROJECT_SOURCE_DIR}/src/appimagetool_shared.c ) target_link_libraries(test_shared diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index d918898d7..046616df1 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -226,11 +226,11 @@ bool test_compare_bytes(const char* buf1, const char* buf2, int size) { return true; } -TEST_F(SharedCTest, test_appimage_digest_md5) { +TEST_F(SharedCTest, appimage_type2_digest_md5) { char digest[16]; char expectedDigest[] = {-20, 92, -89, 99, -47, -62, 14, 36, -5, -127, 65, -126, 116, -41, -33, -121}; - EXPECT_TRUE(appimage_digest_md5(appImage_type_2_file_path.c_str(), digest)); + EXPECT_TRUE(appimage_type2_digest_md5(appImage_type_2_file_path.c_str(), digest)); EXPECT_PRED3(test_compare_bytes, digest, expectedDigest, 16); } From c628f622ecd3b6394730cb370672bc47fb5d555e Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 8 May 2018 01:31:26 +0200 Subject: [PATCH 208/544] Fix dependency issues (fixes #773) --- cmake/dependencies.cmake | 1 + src/CMakeLists.txt | 14 +++++++++----- tests/CMakeLists.txt | 1 - 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index a33a4127f..d814010e0 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -158,6 +158,7 @@ endfunction() # this is especially an issue with libcairo, where the library is called libcairo # therefore, all libs imported this way have been prefixed with lib import_pkgconfig_target(libglib glib-2.0>=2.40) +import_pkgconfig_target(libgobject gobject-2.0>=2.40) import_pkgconfig_target(libgio gio-2.0>=2.40) import_pkgconfig_target(libzlib zlib) import_pkgconfig_target(libcairo cairo) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ce78cdcec..602b63478 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -73,6 +73,7 @@ target_link_libraries(libappimage PUBLIC pthread libglib + libgobject libgio libzlib libcairo @@ -112,6 +113,7 @@ target_link_libraries(libappimage_static PUBLIC pthread libglib + libgobject libgio libzlib libcairo @@ -142,7 +144,7 @@ target_link_libraries(appimagetool PUBLIC pthread libglib - libgio + libgobject libzlib ) @@ -167,17 +169,20 @@ add_sanitizers(appimagetool) add_executable(appimaged appimaged.c notify.c elf.c getsection.c) target_link_libraries(appimaged - pthread + PRIVATE ${CMAKE_DL_LIBS} + pthread libcairo - libglib - libgio inotify-tools squashfuse xz libzlib libarchive xdg-basedir + PUBLIC + libglib + libgio + libgobject ) target_compile_definitions(appimaged @@ -230,7 +235,6 @@ target_link_libraries(runtime-debug xdg-basedir pthread libglib - libgio libzlib libcairo ${CMAKE_DL_LIBS} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f4485f743..2763f1f93 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -77,7 +77,6 @@ if(BUILD_TESTING) xdg-basedir pthread libglib - libgio libzlib libcairo gtest From 0fb0b37377b3a71dc3c29b8034310928c4ba4079 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 8 May 2018 00:51:06 +0200 Subject: [PATCH 209/544] Embed MD5 digest, mk. 1 --- src/appimagetool.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/appimagetool.c b/src/appimagetool.c index 09f44dbe5..3bc47b5e5 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -857,6 +857,57 @@ main (int argc, char *argv[]) } } + // calculate and embed MD5 digest + { + fprintf(stderr, "Embedding MD5 digest\n"); + + unsigned long digest_md5_offset = 0; + unsigned long digest_md5_length = 0; + + int rv = get_elf_section_offset_and_length(destination, ".sha256_sig", &digest_md5_offset, &digest_md5_length); + + if (rv != 0 || digest_md5_offset == 0 || digest_md5_length == 0) { + die("Could not find section .digest_md5 in runtime"); + } + + static const unsigned long section_size = 16; + + if (digest_md5_length < section_size) { + fprintf( + stderr, + ".digest_md5 section in runtime's ELF header is too small" + "(found %lu bytes, minimum required: %lu bytes)\n", + digest_md5_length, section_size + ); + exit(1); + } + + char digest[section_size]; + + if (!appimage_type2_digest_md5(destination, digest)) { + die("Failed to calculate MD5 digest"); + } + + FILE* destinationfp = fopen(destination, "r+"); + + if (destinationfp == NULL) { + die("Failed to open AppImage for updating"); + } + + if (fseek(destinationfp, digest_md5_offset, SEEK_SET) != 0) { + fclose(destinationfp); + die("Failed to embed MD5 digest: could not seek to section offset"); + } + + if (fwrite(digest, sizeof(char), section_size, destinationfp) != section_size) { + fclose(destinationfp); + die("Failed to embed MD5 digest: write failed"); + } + + fflush(destinationfp); + fclose(destinationfp); + } + if (sign) { bool using_gpg = FALSE; bool using_shasum = FALSE; From bd1051f856f49db653913c8cd5888bee18212439 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 8 May 2018 17:53:24 +0200 Subject: [PATCH 210/544] Close dangling open files --- src/appimagetool_shared.c | 2 ++ src/digest_md5.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/appimagetool_shared.c b/src/appimagetool_shared.c index 96bc2de06..2f534108b 100644 --- a/src/appimagetool_shared.c +++ b/src/appimagetool_shared.c @@ -183,6 +183,8 @@ bool appimage_type2_digest_md5(const char* path, char* digest) { gsize digest_len = 16; g_checksum_get_digest(checksum, (guint8*) digest, &digest_len); + fclose(fp); + return true; } diff --git a/src/digest_md5.c b/src/digest_md5.c index ee7bdabf2..ec2302728 100644 --- a/src/digest_md5.c +++ b/src/digest_md5.c @@ -82,6 +82,8 @@ int main(int argc, char* argv[]) { return 1; } + fclose(fp); + char* hexlified_embedded_digest = appimage_hexlify(embedded_digest, digest_size); printf(" embedded: %s\n", embedded_digest); free(hexlified_embedded_digest); From 70eabee385975a3fd34120b18d34b6a85d1c3b77 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 8 May 2018 23:30:52 +0200 Subject: [PATCH 211/544] Remove unnecessary dependency on libbsd, mk. 1 --- src/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 602b63478..4e844dc7f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -238,7 +238,6 @@ target_link_libraries(runtime-debug libzlib libcairo ${CMAKE_DL_LIBS} - bsd ) set_target_properties(runtime-debug PROPERTIES LINK_FLAGS "-ffunction-sections -fdata-sections -Wl,--gc-sections") From eb032658fb2b2aec1c0b9cbf11a0d9e512192c32 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 8 May 2018 23:31:28 +0200 Subject: [PATCH 212/544] Remove unnecessary dependency on libbsd, mk. 2 --- src/build-runtime.sh.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build-runtime.sh.in b/src/build-runtime.sh.in index 9630fb7b7..d58630d4d 100755 --- a/src/build-runtime.sh.in +++ b/src/build-runtime.sh.in @@ -26,7 +26,7 @@ small_LDFLAGS="-s -Wl,--gc-sections" if [ "@APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE@" == "ON" ]; then small_FLAGS="$SMALL_FLAGS -DENABLE_SETPROCTITLE" - small_LDFLAGS="$SMALL_LDFLAGS -lbsd" + small_LDFLAGS="$SMALL_LDFLAGS" fi cd $repo_root From 4d9f726c0000dd051ee96a32ce6abbb4101bff4e Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 9 May 2018 13:13:23 +0200 Subject: [PATCH 213/544] Rename variable --- src/appimagetool.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 3bc47b5e5..e7a3fdcda 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -882,9 +882,9 @@ main (int argc, char *argv[]) exit(1); } - char digest[section_size]; + char digest_buffer[section_size]; - if (!appimage_type2_digest_md5(destination, digest)) { + if (!appimage_type2_digest_md5(destination, digest_buffer)) { die("Failed to calculate MD5 digest"); } @@ -899,7 +899,7 @@ main (int argc, char *argv[]) die("Failed to embed MD5 digest: could not seek to section offset"); } - if (fwrite(digest, sizeof(char), section_size, destinationfp) != section_size) { + if (fwrite(digest_buffer, sizeof(char), section_size, destinationfp) != section_size) { fclose(destinationfp); die("Failed to embed MD5 digest: write failed"); } From b802f68f9de5a860dea60b90129186aae02a256d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 9 May 2018 13:26:10 +0200 Subject: [PATCH 214/544] Fix digest_md5 print --- src/digest_md5.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/digest_md5.c b/src/digest_md5.c index ec2302728..ac94addef 100644 --- a/src/digest_md5.c +++ b/src/digest_md5.c @@ -85,7 +85,7 @@ int main(int argc, char* argv[]) { fclose(fp); char* hexlified_embedded_digest = appimage_hexlify(embedded_digest, digest_size); - printf(" embedded: %s\n", embedded_digest); + printf(" embedded: %s\n", hexlified_embedded_digest); free(hexlified_embedded_digest); if (compare_byte_buffers(expected_digest, embedded_digest, digest_size)) { From 7c8e9544f84656dfca1a6f89d5e8f2bd5b99f2ff Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 9 May 2018 13:26:31 +0200 Subject: [PATCH 215/544] Get offset and length for the right section --- src/appimagetool.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index e7a3fdcda..cdd58d688 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -864,7 +864,7 @@ main (int argc, char *argv[]) unsigned long digest_md5_offset = 0; unsigned long digest_md5_length = 0; - int rv = get_elf_section_offset_and_length(destination, ".sha256_sig", &digest_md5_offset, &digest_md5_length); + int rv = get_elf_section_offset_and_length(destination, ".digest_md5", &digest_md5_offset, &digest_md5_length); if (rv != 0 || digest_md5_offset == 0 || digest_md5_length == 0) { die("Could not find section .digest_md5 in runtime"); @@ -904,7 +904,6 @@ main (int argc, char *argv[]) die("Failed to embed MD5 digest: write failed"); } - fflush(destinationfp); fclose(destinationfp); } From 94575b0bfb42b19caf4ea033d03e70a4450b80d0 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 9 May 2018 21:01:34 +0200 Subject: [PATCH 216/544] Quick fix for broken builds due to out of date apt cache on Travis --- travis/travis-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 971ec561f..48fd9fc5a 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -52,7 +52,7 @@ docker run --rm \ cd build/ # test AppImages -[ "$ARCH" == "i686" ] && sudo apt-get install -y gcc-multilib lib32z1 libfuse2 libfuse2:i386 libglib2.0-0:i386 libcairo2:i386 +[ "$ARCH" == "i686" ] && sudo apt-get update && sudo apt-get install -y gcc-multilib lib32z1 libfuse2 libfuse2:i386 libglib2.0-0:i386 libcairo2:i386 bash -x ../travis/test-appimages.sh # install more tools From 241c4c210d5f8d93a665b8b70c9e5eb4a8101b10 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 9 May 2018 21:45:30 +0200 Subject: [PATCH 217/544] Refactor get_elf_section_offset_and_length --- include/appimage/appimage.h | 5 +++++ src/appimagetool.c | 25 ++++++++++++++++++------- src/appimagetool_shared.c | 6 +++--- src/digest_md5.c | 2 +- src/getsection.c | 8 ++++---- src/getsection.h | 3 --- 6 files changed, 31 insertions(+), 18 deletions(-) diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h index f9edf50ae..9cea6039e 100644 --- a/include/appimage/appimage.h +++ b/include/appimage/appimage.h @@ -144,6 +144,11 @@ bool appimage_type2_digest_md5(const char* fname, char* digest); */ char* appimage_hexlify(const char* bytes, size_t numBytes); +/* + * Return the offset, and the length of an ELF section with a given name in a given ELF file + */ +bool appimage_get_elf_section_offset_and_length(const char* fname, const char* section_name, unsigned long* offset, unsigned long* length); + #ifdef __cplusplus } #endif diff --git a/src/appimagetool.c b/src/appimagetool.c index cdd58d688..5adcf3eef 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -835,7 +835,13 @@ main (int argc, char *argv[]) unsigned long ui_offset = 0; unsigned long ui_length = 0; - get_elf_section_offset_and_length(destination, ".upd_info", &ui_offset, &ui_length); + + bool rv = appimage_get_elf_section_offset_and_length(destination, ".upd_info", &ui_offset, &ui_length); + + if (!rv || ui_offset == 0 || ui_length == 0) { + die("Could not find section .upd_info in runtime"); + } + if(verbose) { printf("ui_offset: %lu\n", ui_offset); printf("ui_length: %lu\n", ui_length); @@ -864,9 +870,9 @@ main (int argc, char *argv[]) unsigned long digest_md5_offset = 0; unsigned long digest_md5_length = 0; - int rv = get_elf_section_offset_and_length(destination, ".digest_md5", &digest_md5_offset, &digest_md5_length); + bool rv = appimage_get_elf_section_offset_and_length(destination, ".digest_md5", &digest_md5_offset, &digest_md5_length); - if (rv != 0 || digest_md5_offset == 0 || digest_md5_length == 0) { + if (!rv || digest_md5_offset == 0 || digest_md5_length == 0) { die("Could not find section .digest_md5 in runtime"); } @@ -1020,9 +1026,9 @@ main (int argc, char *argv[]) unsigned long sig_offset = 0; unsigned long sig_length = 0; - int rv = get_elf_section_offset_and_length(destination, ".sha256_sig", &sig_offset, &sig_length); + bool rv = appimage_get_elf_section_offset_and_length(destination, ".sha256_sig", &sig_offset, &sig_length); - if (rv != 0 || sig_offset == 0 || sig_length == 0) { + if (!rv || sig_offset == 0 || sig_length == 0) { die("Could not find section .sha256_sig in runtime"); } @@ -1120,8 +1126,13 @@ main (int argc, char *argv[]) { sprintf(command, "%s --batch --export --armor %s", gpg2_path, sign_key); - unsigned long key_offset, key_length; - int rv = get_elf_section_offset_and_length(destination, ".sig_key", &key_offset, &key_length); + unsigned long key_offset = 0, key_length = 0; + + bool rv = appimage_get_elf_section_offset_and_length(destination, ".sig_key", &key_offset, &key_length); + + if (!rv || key_offset == 0 || key_length == 0) { + die("Could not find section .sig_key in runtime"); + } if (verbose) { printf("key_offset: %lu\n", key_offset); diff --git a/src/appimagetool_shared.c b/src/appimagetool_shared.c index 2f534108b..6b74ef26d 100644 --- a/src/appimagetool_shared.c +++ b/src/appimagetool_shared.c @@ -61,15 +61,15 @@ int appimage_get_type(const char* path, bool verbose) bool appimage_type2_digest_md5(const char* path, char* digest) { // skip digest, signature and key sections in digest calculation unsigned long digest_md5_offset = 0, digest_md5_length = 0; - if (get_elf_section_offset_and_length(path, ".digest_md5", &digest_md5_offset, &digest_md5_length) != 0) + if (!appimage_get_elf_section_offset_and_length(path, ".digest_md5", &digest_md5_offset, &digest_md5_length)) return false; unsigned long signature_offset = 0, signature_length = 0; - if (get_elf_section_offset_and_length(path, ".sha256_sig", &signature_offset, &signature_length) != 0) + if (!appimage_get_elf_section_offset_and_length(path, ".sha256_sig", &signature_offset, &signature_length)) return false; unsigned long sig_key_offset = 0, sig_key_length = 0; - if (get_elf_section_offset_and_length(path, ".sig_key", &sig_key_offset, &sig_key_length) != 0) + if (!appimage_get_elf_section_offset_and_length(path, ".sig_key", &sig_key_offset, &sig_key_length)) return false; GChecksum *checksum = g_checksum_new(G_CHECKSUM_MD5); diff --git a/src/digest_md5.c b/src/digest_md5.c index ac94addef..8e5b14f66 100644 --- a/src/digest_md5.c +++ b/src/digest_md5.c @@ -49,7 +49,7 @@ int main(int argc, char* argv[]) { static const char section_name[] = ".digest_md5"; - if (get_elf_section_offset_and_length(fname, section_name, &offset, &length) != 0 || offset == 0 || length == 0) { + if (!appimage_get_elf_section_offset_and_length(fname, section_name, &offset, &length) || offset == 0 || length == 0) { fprintf(stderr, "Could not find %s section in file\n", section_name); return 1; } diff --git a/src/getsection.c b/src/getsection.c index b329676c3..79d7c9b67 100644 --- a/src/getsection.c +++ b/src/getsection.c @@ -2,13 +2,13 @@ #include #include #include +#include #include #include #include "light_elf.h" /* Return the offset, and the length of an ELF section with a given name in a given ELF file */ -int get_elf_section_offset_and_length(const char* fname, const char* section_name, unsigned long* offset, - unsigned long* length) { +bool appimage_get_elf_section_offset_and_length(const char* fname, const char* section_name, unsigned long* offset, unsigned long* length) { uint8_t* data; int i; int fd = open(fname, O_RDONLY); @@ -51,11 +51,11 @@ int get_elf_section_offset_and_length(const char* fname, const char* section_nam } else { sprintf(stderr, "Platforms other than 32-bit/64-bit are currently not supported!"); munmap(data, map_size); - return 2; + return false; } munmap(data, map_size); - return 0; + return true; } char* read_file_offset_length(const char* fname, unsigned long offset, unsigned long length) { diff --git a/src/getsection.h b/src/getsection.h index 290047166..f75a1391c 100644 --- a/src/getsection.h +++ b/src/getsection.h @@ -1,9 +1,6 @@ #ifndef GETSECTION_H #define GETSECTION_H -/* Return the offset, and the length of an ELF section with a given name in a given ELF file */ -int get_elf_section_offset_and_length(const char* fname, const char* section_name, unsigned long *offset, unsigned long *length); - int print_hex(const char* fname, unsigned long offset, unsigned long length); int print_binary(const char* fname, unsigned long offset, unsigned long length); From d38c4bc1f369785d8314bf65fde9856f86c25bf2 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 9 May 2018 22:09:02 +0200 Subject: [PATCH 218/544] Fix runtime build --- src/CMakeLists.txt | 5 +++++ src/build-runtime.sh.in | 2 +- src/runtime.c | 6 +++--- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 611606ad3..08d57c78a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -252,6 +252,11 @@ target_link_libraries(runtime-debug set_target_properties(runtime-debug PROPERTIES LINK_FLAGS "-ffunction-sections -fdata-sections -Wl,--gc-sections") +target_include_directories(runtime-debug + PUBLIC $ + INTERFACE $ +) + target_compile_options(runtime-debug PUBLIC -DGIT_COMMIT="${GIT_COMMIT}" -D_FILE_OFFSET_BITS=64 ) diff --git a/src/build-runtime.sh.in b/src/build-runtime.sh.in index 7fee96230..224c586fe 100755 --- a/src/build-runtime.sh.in +++ b/src/build-runtime.sh.in @@ -41,7 +41,7 @@ trap cleanup EXIT cd "$build_dir" # Compile runtime but do not link -$CC -DGIT_COMMIT=\"$git_version\" -I"@xz_INCLUDE_DIRS@" -I"@squashfuse_INCLUDE_DIRS@" \ +$CC -DGIT_COMMIT=\"$git_version\" -I"@xz_INCLUDE_DIRS@" -I"@squashfuse_INCLUDE_DIRS@" -I"@PROJECT_SOURCE_DIR@/include" \ -D_FILE_OFFSET_BITS=64 -g $small_FLAGS -c "$repo_root"/runtime.c # Prepare 16 bytes of space for MD5 digest section diff --git a/src/runtime.c b/src/runtime.c index 0fcf80f4a..d05c8a902 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -53,12 +53,12 @@ #define ENABLE_DLOPEN #endif #include "squashfuse_dlopen.h" +#include "appimage/appimage.h" #include //#include "notify.c" extern int notify(char *title, char *body, int timeout); - struct stat st; static ssize_t fs_offset; // The offset at which a filesystem image is expected = end of this ELF @@ -459,7 +459,7 @@ main (int argc, char *argv[]) if(arg && (strcmp(arg,"appimage-updateinformation")==0 || strcmp(arg,"appimage-updateinfo")==0)) { unsigned long offset = 0; unsigned long length = 0; - get_elf_section_offset_and_length(appimage_path, ".upd_info", &offset, &length); + appimage_get_elf_section_offset_and_length(appimage_path, ".upd_info", &offset, &length); // printf("offset: %lu\n", offset); // printf("length: %lu\n", length); // print_hex(appimage_path, offset, length); @@ -470,7 +470,7 @@ main (int argc, char *argv[]) if(arg && strcmp(arg,"appimage-signature")==0) { unsigned long offset = 0; unsigned long length = 0; - get_elf_section_offset_and_length(appimage_path, ".sha256_sig", &offset, &length); + appimage_get_elf_section_offset_and_length(appimage_path, ".sha256_sig", &offset, &length); // printf("offset: %lu\n", offset); // printf("length: %lu\n", length); // print_hex(appimage_path, offset, length); From 919f0f9eec7b843bd614ef8d9d0a259c406d41a1 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 9 May 2018 22:22:23 +0200 Subject: [PATCH 219/544] Fix validate build --- src/CMakeLists.txt | 5 +++++ src/validate.c | 1 + 2 files changed, 6 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 08d57c78a..9b11d67a3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -226,6 +226,11 @@ target_link_libraries(validate libopenssl ) +target_include_directories(validate + PUBLIC $ + INTERFACE $ #include +#include "appimage/appimage.h" #include "getsection.h" #include "light_elf.h" From ffe0b6b92f028930605e3bf387ea7fe0209b852a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 9 May 2018 22:30:02 +0200 Subject: [PATCH 220/544] Fix validate build, mk. 2 --- src/validate.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/validate.c b/src/validate.c index 7cadeeb9f..8023ea7fc 100644 --- a/src/validate.c +++ b/src/validate.c @@ -116,7 +116,11 @@ int main(int argc,char **argv) { unsigned long skip_offset = 0; unsigned long skip_length = 0; - get_elf_section_offset_and_length(filename, ".sha256_sig", &skip_offset, &skip_length); + if (!appimage_get_elf_section_offset_and_length(filename, ".sha256_sig", &skip_offset, &skip_length)) { + fprintf(stderr, "Failed to read .sha256_sig section"); + exit(1); + } + if(skip_length > 0) { fprintf(stderr, "Skipping ELF section %s with offset %lu, length %lu\n", segment_name, skip_offset, skip_length); } else { From faee8ac6abb62892814e640377c4b62433cf8994 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 9 May 2018 22:44:01 +0200 Subject: [PATCH 221/544] Fix appimaged build --- src/shared.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/shared.c b/src/shared.c index d27e33682..7550860a1 100644 --- a/src/shared.c +++ b/src/shared.c @@ -536,7 +536,9 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag unsigned long upd_length = 0; if(g_find_program_in_path ("AppImageUpdate")){ if(appimage_type == 2){ - get_elf_section_offset_and_length(appimage_path, ".upd_info", &upd_offset, &upd_length); + if (!appimage_get_elf_section_offset_and_length(appimage_path, ".upd_info", &upd_offset, &upd_length) || upd_offset == 0 || upd_length == 0) { + fprintf("Could not read .upd_info section in AppImage's header\n"); + } if(upd_length != 1024) { #ifdef STANDALONE fprintf(stderr, From 8b9c6ee152762120addec63611cc084108fe5173 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 10 May 2018 15:39:04 +0200 Subject: [PATCH 222/544] Fix appimaged build, mk. 2 --- src/shared.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared.c b/src/shared.c index 7550860a1..e8afc5d6e 100644 --- a/src/shared.c +++ b/src/shared.c @@ -537,7 +537,7 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag if(g_find_program_in_path ("AppImageUpdate")){ if(appimage_type == 2){ if (!appimage_get_elf_section_offset_and_length(appimage_path, ".upd_info", &upd_offset, &upd_length) || upd_offset == 0 || upd_length == 0) { - fprintf("Could not read .upd_info section in AppImage's header\n"); + fprintf(stderr, "Could not read .upd_info section in AppImage's header\n"); } if(upd_length != 1024) { #ifdef STANDALONE From 93474ad3200bb61b6eb024732126ad5c010ae7fc Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 11 May 2018 00:12:30 +0200 Subject: [PATCH 223/544] Fix appimaged build, mk. 3 --- src/digest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/digest.c b/src/digest.c index 5d3c3c82d..851097e30 100644 --- a/src/digest.c +++ b/src/digest.c @@ -122,7 +122,7 @@ int main(int argc,char **argv) } if(argc < 4){ - get_elf_section_offset_and_length(filename, ".sha256_sig", &skip_offset, &skip_length); + appimage_get_elf_section_offset_and_length(filename, ".sha256_sig", &skip_offset, &skip_length); if(skip_length > 0) fprintf(stderr, "Skipping ELF section %s with offset %lu, length %lu\n", segment_name, skip_offset, skip_length); } else if(argc == 4) { From 002592d9dc1c5fb67db6700fd8c09c10d8408a40 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 11 May 2018 00:19:01 +0200 Subject: [PATCH 224/544] Fix tests build, mk. 1 --- tests/test_getsection.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_getsection.cpp b/tests/test_getsection.cpp index d47154e14..fc2808fe4 100644 --- a/tests/test_getsection.cpp +++ b/tests/test_getsection.cpp @@ -24,12 +24,12 @@ bool isPowerOfTwo(int number) { } -TEST_F(GetSectionCTest, test_get_elf_section_offset_and_length) { +TEST_F(GetSectionCTest, test_appimage_get_elf_section_offset_and_length) { std::string appImagePath = std::string(TEST_DATA_DIR) + "/appimaged-i686.AppImage"; unsigned long offset, length; - ASSERT_EQ(get_elf_section_offset_and_length(appImagePath.c_str(), ".upd_info", &offset, &length), 0); + ASSERT_EQ(appimage_get_elf_section_offset_and_length(appImagePath.c_str(), ".upd_info", &offset, &length), 0); EXPECT_GT(offset, 0); EXPECT_GT(length, 0); @@ -43,7 +43,7 @@ TEST_F(GetSectionCTest, test_print_binary) { unsigned long offset, length; - ASSERT_EQ(get_elf_section_offset_and_length(appImagePath.c_str(), ".upd_info", &offset, &length), 0); + ASSERT_EQ(appimage_get_elf_section_offset_and_length(appImagePath.c_str(), ".upd_info", &offset, &length), 0); EXPECT_EQ(print_binary(appImagePath.c_str(), offset, length), 0); } @@ -54,7 +54,7 @@ TEST_F(GetSectionCTest, test_print_hex) { unsigned long offset, length; - ASSERT_EQ(get_elf_section_offset_and_length(appImagePath.c_str(), ".sha256_sig", &offset, &length), 0); + ASSERT_EQ(appimage_get_elf_section_offset_and_length(appImagePath.c_str(), ".sha256_sig", &offset, &length), 0); EXPECT_EQ(print_hex(appImagePath.c_str(), offset, length), 0); } From 04d79cd6277054cb120e728b3999a21e2aacb1ad Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 11 May 2018 00:37:24 +0200 Subject: [PATCH 225/544] Fix tests build, mk. 2 --- tests/CMakeLists.txt | 10 +++++++++- tests/test_getsection.cpp | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 51f19879b..285598537 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -83,7 +83,15 @@ if(BUILD_TESTING) gtest ) - target_include_directories(test_getsection PRIVATE ../src/) + target_include_directories(test_getsection + # used to include getsection.h + PRIVATE ${PROJECT_SOURCE_DIR}/src/ + # need to include libappimage's header directory as well + # as we're building this test manually from the source files, we need to replicate the build settings of + # libappimage, appimagetool, ... + PRIVATE ${PROJECT_SOURCE_DIR}/include/ + ) + add_dependencies(test_getsection squashfuse) diff --git a/tests/test_getsection.cpp b/tests/test_getsection.cpp index fc2808fe4..3b1211425 100644 --- a/tests/test_getsection.cpp +++ b/tests/test_getsection.cpp @@ -5,6 +5,7 @@ #include // local headers +#include #include "fixtures.h" extern "C" { From 00ea7c3c5637c561445790da6114a7e68b174520 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 11 May 2018 00:46:20 +0200 Subject: [PATCH 226/544] Fix tests build, mk. 3 --- tests/test_getsection.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_getsection.cpp b/tests/test_getsection.cpp index 3b1211425..40413d3b9 100644 --- a/tests/test_getsection.cpp +++ b/tests/test_getsection.cpp @@ -30,7 +30,7 @@ TEST_F(GetSectionCTest, test_appimage_get_elf_section_offset_and_length) { unsigned long offset, length; - ASSERT_EQ(appimage_get_elf_section_offset_and_length(appImagePath.c_str(), ".upd_info", &offset, &length), 0); + ASSERT_TRUE(appimage_get_elf_section_offset_and_length(appImagePath.c_str(), ".upd_info", &offset, &length)); EXPECT_GT(offset, 0); EXPECT_GT(length, 0); @@ -44,7 +44,7 @@ TEST_F(GetSectionCTest, test_print_binary) { unsigned long offset, length; - ASSERT_EQ(appimage_get_elf_section_offset_and_length(appImagePath.c_str(), ".upd_info", &offset, &length), 0); + ASSERT_TRUE(appimage_get_elf_section_offset_and_length(appImagePath.c_str(), ".upd_info", &offset, &length)); EXPECT_EQ(print_binary(appImagePath.c_str(), offset, length), 0); } @@ -55,7 +55,7 @@ TEST_F(GetSectionCTest, test_print_hex) { unsigned long offset, length; - ASSERT_EQ(appimage_get_elf_section_offset_and_length(appImagePath.c_str(), ".sha256_sig", &offset, &length), 0); + ASSERT_TRUE(appimage_get_elf_section_offset_and_length(appImagePath.c_str(), ".sha256_sig", &offset, &length)); EXPECT_EQ(print_hex(appImagePath.c_str(), offset, length), 0); } From 6ebe473ee5d5879b9b8f0ecc8f8754e576de5515 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 May 2018 19:08:22 +0200 Subject: [PATCH 227/544] Fix usage of AppImageKit dependencies in other projects --- cmake/dependencies.cmake | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index d814010e0..77ec3c808 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -2,10 +2,6 @@ cmake_minimum_required(VERSION 3.2) -# find required system dependencies via pkg-config -find_package(PkgConfig REQUIRED) - - # imports a library from the standard set of variables CMake creates when using its pkg-config module or find_package # this is code shared by import_pkgconfig_target and import_external_project, hence it's been extracted into a separate # CMake function @@ -21,7 +17,7 @@ function(import_library_from_prefix target_name variable_prefix) return() endif() - add_library(${target_name} INTERFACE IMPORTED) + add_library(${target_name} INTERFACE IMPORTED GLOBAL) # FIXME: the following line produces CMake errors "directory not found" # CMake does, however, not complain if the INCLUDE_DIRECTORIES property contains missing directories @@ -57,6 +53,8 @@ endfunction() # - target_name: name of the target that we shall create for you # - pkg_config_target: librar(y name to pass to pkg-config (may include a version) function(import_pkgconfig_target target_name pkg_config_target) + find_package(PkgConfig REQUIRED) + message(STATUS "Importing target ${target_name} via pkg-config (${pkg_config_target})") pkg_check_modules(${target_name}-IMPORTED REQUIRED ${pkg_config_target}) @@ -104,7 +102,7 @@ function(import_external_project) return() endif() - add_library(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME} INTERFACE IMPORTED) + add_library(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME} INTERFACE IMPORTED GLOBAL) ExternalProject_Get_Property(${IMPORT_EXTERNAL_PROJECT_EXT_PROJECT_NAME} SOURCE_DIR) ExternalProject_Get_Property(${IMPORT_EXTERNAL_PROJECT_EXT_PROJECT_NAME} INSTALL_DIR) From 8221333356630d890a358ab77a9c3cac63f48bca Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 May 2018 19:12:19 +0200 Subject: [PATCH 228/544] No longer need to globally include dependencies' directories --- CMakeLists.txt | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ac30c98e4..3b3a5e2aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -96,16 +96,6 @@ check_program(desktop-file-validate) include(cmake/dependencies.cmake) -# include directories globally -include_directories(${GLIB_INCLUDE_DIRS}) -include_directories(${CAIRO_INCLUDE_DIRS}) -include_directories(${ZLIB_INCLUDE_DIRS}) -include_directories(${xz_INCLUDE_DIR}) -include_directories(${inotify-tools_INCLUDE_DIR}) -include_directories(${squashfuse_INCLUDE_DIR}) -include_directories(${libarchive_INCLUDE_DIR}) - - ################ # Source files # ################ From 6d5817d94d5fb21399435fd4b72f58a33f8fd4a2 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 May 2018 19:13:07 +0200 Subject: [PATCH 229/544] Remove appimaged source files --- resources/appimaged.desktop | 9 - resources/appimaged.service | 10 - .../usr/share/metainfo/appimaged.appdata.xml | 31 -- src/CMakeLists.txt | 48 --- src/appimaged.c | 348 ------------------ 5 files changed, 446 deletions(-) delete mode 100644 resources/appimaged.desktop delete mode 100644 resources/appimaged.service delete mode 100644 resources/usr/share/metainfo/appimaged.appdata.xml delete mode 100644 src/appimaged.c diff --git a/resources/appimaged.desktop b/resources/appimaged.desktop deleted file mode 100644 index 289e1d513..000000000 --- a/resources/appimaged.desktop +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Type=Application -Name=appimaged -Exec=appimaged -Comment=Optional daemon to integrate AppImages with the desktop -Icon=appimaged -Categories=Development; -Terminal=false -NoDisplay=true diff --git a/resources/appimaged.service b/resources/appimaged.service deleted file mode 100644 index 55e0a653f..000000000 --- a/resources/appimaged.service +++ /dev/null @@ -1,10 +0,0 @@ -[Unit] -Description=AppImage daemon -After=basic.target -[Service] -ExecStart=/usr/bin/appimaged -Restart=always -RestartSec=5s -StartLimitInterval=0 -[Install] -WantedBy=graphical.target diff --git a/resources/usr/share/metainfo/appimaged.appdata.xml b/resources/usr/share/metainfo/appimaged.appdata.xml deleted file mode 100644 index b8206c278..000000000 --- a/resources/usr/share/metainfo/appimaged.appdata.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - appimaged.desktop - MIT - MIT - appimaged -

Register AppImage files with the system - -

- appimaged is a daemon that observes direcories and registers - AppImage files with your desktop so that you can upen thesem - from the menu, see their icons, have their MIME types and file associatons - set, can easily update them, and so on. -

-

- It is an entirely optional component. - It also unregisters AppImages when they are moved away or deleted. -

-
- - - Update from Ubuntu with AppImageUpdate - https://cloud.githubusercontent.com/assets/2480569/19410850/0390fe9c-92f6-11e6-9882-3ca6d360a190.jpg - - - https://github.com/probonopd/appimagetool - AppImage - - appimaged - - diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9b11d67a3..df2a05d67 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -176,44 +176,6 @@ endif() add_sanitizers(appimagetool) -add_executable(appimaged appimaged.c notify.c elf.c getsection.c appimagetool_shared.c) - -target_link_libraries(appimaged - PRIVATE - ${CMAKE_DL_LIBS} - pthread - libcairo - inotify-tools - squashfuse - xz - libzlib - libarchive - xdg-basedir - PUBLIC - libglib - libgio - libgobject -) - -target_compile_definitions(appimaged - PRIVATE -DGIT_COMMIT="${GIT_COMMIT}" - PRIVATE -DBUILD_NUMBER="${BUILD_NUMBER}" - PRIVATE -DBUILD_DATE="${DATE}" - PRIVATE -D_FILE_OFFSET_BITS=64 - PRIVATE -DHAVE_LIBARCHIVE3=0 - PRIVATE -DSTANDALONE=1 - PRIVATE -DAPPIMAGED=1 -) -# TODO: remove -DAPPIMAGED=1, move these code snippets to appimaged's source code files - -target_include_directories(appimaged - PUBLIC $ - INTERFACE $ -) - -add_sanitizers(appimaged) - - add_executable(AppRun AppRun.c) add_sanitizers(AppRun) @@ -303,16 +265,6 @@ else() ) endif() -install( - TARGETS appimaged - RUNTIME DESTINATION bin COMPONENT appimaged -) - -install( - FILES ${PROJECT_SOURCE_DIR}/resources/appimaged.service - DESTINATION lib/systemd/user/ - COMPONENT appimaged -) install( TARGETS AppRun appimagetool digest validate RUNTIME DESTINATION bin COMPONENT applications diff --git a/src/appimaged.c b/src/appimaged.c deleted file mode 100644 index de2fcf951..000000000 --- a/src/appimaged.c +++ /dev/null @@ -1,348 +0,0 @@ -/************************************************************************** - * - * Copyright (c) 2004-18 Simon Peter - * - * All Rights Reserved. - * - * 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. - * - **************************************************************************/ - -#ident "AppImage by Simon Peter, http://appimage.org/" - -/* - * Optional daempon to watch directories for AppImages - * and register/unregister them with the system - * - * TODO (feel free to send pull requests): - * - Switch to https://developer.gnome.org/gio/stable/GFileMonitor.html (but with subdirectories) - * which would drop the dependency on libinotifytools.so.0 - * - Add and remove subdirectories on the fly at runtime - - * see https://github.com/paragone/configure-via-inotify/blob/master/inotify/src/inotifywatch.c - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include "shared.c" - -#include - -#ifndef RELEASE_NAME - #define RELEASE_NAME "continuous build" -#endif - -extern int notify(char *title, char *body, int timeout); - -static gboolean verbose = FALSE; -static gboolean showVersionOnly = FALSE; -static gboolean install = FALSE; -static gboolean uninstall = FALSE; -static gboolean no_install = FALSE; -gchar **remaining_args = NULL; - -static GOptionEntry entries[] = -{ - { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Be verbose", NULL }, - { "install", 'i', 0, G_OPTION_ARG_NONE, &install, "Install this appimaged instance to $HOME", NULL }, - { "uninstall", 'u', 0, G_OPTION_ARG_NONE, &uninstall, "Uninstall an appimaged instance from $HOME", NULL }, - { "no-install", 'n', 0, G_OPTION_ARG_NONE, &no_install, "Force run without installation", NULL }, - { "version", 0, 0, G_OPTION_ARG_NONE, &showVersionOnly, "Show version number", NULL }, - { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &remaining_args, NULL }, - { NULL } -}; - -#define EXCLUDE_CHUNK 1024 -#define WR_EVENTS (IN_CLOSE_WRITE | IN_MOVED_FROM | IN_MOVED_TO | IN_DELETE | IN_DELETE_SELF | IN_MOVE_SELF) - -/* Run the actual work in treads; - * pthread allows to pass only one argument to the thread function, - * hence we use a struct as the argument in which the real arguments are */ -struct arg_struct { - char* path; - gboolean verbose; -}; - -void *thread_appimage_register_in_system(void *arguments) -{ - struct arg_struct *args = arguments; - appimage_register_in_system(args->path, args->verbose); - pthread_exit(NULL); -} - -void *thread_appimage_unregister_in_system(void *arguments) -{ - struct arg_struct *args = arguments; - appimage_unregister_in_system(args->path, args->verbose); - pthread_exit(NULL); -} - -/* Recursively process the files in this directory and its subdirectories, - * http://stackoverflow.com/questions/8436841/how-to-recursively-list-directories-in-c-on-linux - */ -void initially_register(const char *name, int level) -{ - DIR *dir; - struct dirent *entry; - - if (!(dir = opendir(name))) { - if (verbose) { - if (errno == EACCES) { - g_print("_________________________\n"); - g_print("Permission denied on dir '%s'\n", name); - } - else { - g_print("_________________________\n"); - g_print("Failed to open dir '%s'\n", name); - } - } - closedir(dir); - return; - } - - if (!(entry = readdir(dir))) { - if (verbose) { - g_print("_________________________\n"); - g_print("Invalid directory stream descriptor '%s'\n", name); - } - closedir(dir); - return; - } - - do { - if (entry->d_type == DT_DIR) { - char path[1024]; - int len = snprintf(path, sizeof(path)-1, "%s/%s", name, entry->d_name); - path[len] = 0; - if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) - continue; - initially_register(path, level + 1); - } - else { - int ret; - gchar *absolute_path = g_build_path(G_DIR_SEPARATOR_S, name, entry->d_name, NULL); - if(g_file_test(absolute_path, G_FILE_TEST_IS_REGULAR)){ - pthread_t some_thread; - struct arg_struct args; - args.path = absolute_path; - args.verbose = verbose; - ret = pthread_create(&some_thread, NULL, thread_appimage_register_in_system, &args); - if (!ret) { - pthread_join(some_thread, NULL); - } - } - g_free(absolute_path); - } - } while ((entry = readdir(dir)) != NULL); - closedir(dir); -} - -void add_dir_to_watch(const char *directory) -{ - if (g_file_test (directory, G_FILE_TEST_IS_DIR)){ - if(!inotifytools_watch_file(directory, WR_EVENTS) ) { - fprintf(stderr, "%s: %s\n", directory, strerror(inotifytools_error())); - exit(1); - - } - initially_register(directory, 0); - } -} - -void handle_event(struct inotify_event *event) -{ - int ret; - gchar *absolute_path = g_build_path(G_DIR_SEPARATOR_S, inotifytools_filename_from_wd(event->wd), event->name, NULL); - - if((event->mask & IN_CLOSE_WRITE) | (event->mask & IN_MOVED_TO)){ - if(g_file_test(absolute_path, G_FILE_TEST_IS_REGULAR)){ - pthread_t some_thread; - struct arg_struct args; - args.path = absolute_path; - args.verbose = verbose; - g_print("_________________________\n"); - ret = pthread_create(&some_thread, NULL, thread_appimage_register_in_system, &args); - if (!ret) { - pthread_join(some_thread, NULL); - } - } - } - - if((event->mask & IN_MOVED_FROM) | (event->mask & IN_DELETE)){ - pthread_t some_thread; - struct arg_struct args; - args.path = absolute_path; - args.verbose = verbose; - g_print("_________________________\n"); - ret = pthread_create(&some_thread, NULL, thread_appimage_unregister_in_system, &args); - if (!ret) { - pthread_join(some_thread, NULL); - } - } - - g_free(absolute_path); - - /* Too many FS events were received, some event notifications were potentially lost */ - if (event->mask & IN_Q_OVERFLOW){ - printf ("Warning: AN OVERFLOW EVENT OCCURRED\n"); - } - - if(event->mask & IN_IGNORED){ - printf ("Warning: AN IN_IGNORED EVENT OCCURRED\n"); - } - -} - -int main(int argc, char ** argv) { - - GError *error = NULL; - GOptionContext *context; - - context = g_option_context_new (""); - g_option_context_add_main_entries (context, entries, NULL); - // g_option_context_add_group (context, gtk_get_option_group (TRUE)); - if (!g_option_context_parse (context, &argc, &argv, &error)) - { - g_print("option parsing failed: %s\n", error->message); - exit (1); - } - - // always show version, but exit immediately if only the version number was requested - fprintf( - stderr, - "appimaged, %s (commit %s), build %s built on %s\n", - RELEASE_NAME, GIT_COMMIT, BUILD_NUMBER, BUILD_DATE - ); - - if(showVersionOnly) - exit(0); - - if (!inotifytools_initialize()) { - fprintf(stderr, "inotifytools_initialize error\n"); - exit(1); - } - - gchar *user_bin_dir = g_build_filename(g_get_home_dir(), "/.local/bin", NULL); - gchar *installed_appimaged_location = g_build_filename(user_bin_dir, "appimaged", NULL); - const gchar *appimage_location = g_getenv("APPIMAGE"); - gchar *own_desktop_file_location = g_build_filename(g_getenv("APPDIR"), "/appimaged.desktop", NULL); - gchar *global_autostart_file = "/etc/xdg/autostart/appimaged.desktop"; - gchar *global_systemd_file = "/usr/lib/systemd/user/appimaged.service"; - gchar *partial_path = g_strdup_printf("autostart/appimagekit-appimaged.desktop"); - char* config_home = xdg_config_home(); - gchar *destination = g_build_filename(config_home, partial_path, NULL); - free(config_home); - - if(uninstall){ - if(g_file_test (installed_appimaged_location, G_FILE_TEST_EXISTS)) - fprintf(stderr, "* Please delete %s\n", installed_appimaged_location); - if(g_file_test (destination, G_FILE_TEST_EXISTS)) - fprintf(stderr, "* Please delete %s\n", destination); - fprintf(stderr, "* To remove all AppImage desktop integration, run\n"); - fprintf(stderr, " find ~/.local/share -name 'appimagekit_*' -exec rm {} \\;\n\n"); - exit(0); - } - - if(install){ - if(((appimage_location != NULL)) && ((own_desktop_file_location != NULL))){ - printf("Running from within %s\n", appimage_location); - if ( (! g_file_test ("/usr/bin/appimaged", G_FILE_TEST_EXISTS)) && (! g_file_test (global_autostart_file, G_FILE_TEST_EXISTS)) && (! g_file_test (global_systemd_file, G_FILE_TEST_EXISTS))){ - printf ("%s is not installed, moving it to %s\n", argv[0], installed_appimaged_location); - g_mkdir_with_parents(user_bin_dir, 0755); - gchar *command = g_strdup_printf("mv \"%s\" \"%s\"", appimage_location, installed_appimaged_location); - system(command); - /* When appimaged installs itself, then to the $XDG_CONFIG_HOME/autostart/ directory, falling back to ~/.config/autostart/ */ - fprintf(stderr, "Installing to autostart: %s\n", own_desktop_file_location); - g_mkdir_with_parents(g_path_get_dirname(destination), 0755); - gchar *command2 = g_strdup_printf("cp \"%s\" \"%s\"", own_desktop_file_location, destination); - system(command2); - if(g_file_test (installed_appimaged_location, G_FILE_TEST_EXISTS)) - fprintf(stderr, "* Installed %s\n", installed_appimaged_location); - if(g_file_test (destination, G_FILE_TEST_EXISTS)){ - gchar *command3 = g_strdup_printf("sed -i -e 's|^Exec=.*|Exec=%s|g' '%s'", installed_appimaged_location, destination); - if(verbose) - fprintf(stderr, "%s\n", command3); - system(command3); - fprintf(stderr, "* Installed %s\n", destination); - } - if(g_file_test (installed_appimaged_location, G_FILE_TEST_EXISTS)) - fprintf(stderr, "\nTo uninstall, run %s --uninstall and follow the instructions\n\n", installed_appimaged_location); - char *title; - char *body; - title = g_strdup_printf("Please log out"); - body = g_strdup_printf("and log in again to complete the installation"); - notify(title, body, 15); - exit(0); - } - } else { - printf("Not running from within an AppImage. This binary cannot be installed in this way.\n"); - exit(1); - } - } - - /* When we run from inside an AppImage, then we check if we are installed - * in a per-user location and if not, we install ourselves there */ - if(!no_install && (appimage_location != NULL && own_desktop_file_location != NULL)) { - if ( (! g_file_test ("/usr/bin/appimaged", G_FILE_TEST_EXISTS)) && ((! g_file_test (global_autostart_file, G_FILE_TEST_EXISTS)) || (! g_file_test (destination, G_FILE_TEST_EXISTS))) && (! g_file_test (global_systemd_file, G_FILE_TEST_EXISTS)) && (! g_file_test (installed_appimaged_location, G_FILE_TEST_EXISTS)) && (g_file_test (own_desktop_file_location, G_FILE_TEST_IS_REGULAR))){ - char *title; - char *body; - title = g_strdup_printf("Not installed\n"); - body = g_strdup_printf("Please run %s --install", argv[0]); - notify(title, body, 15); - exit(1); - } - } - - add_dir_to_watch(user_bin_dir); - add_dir_to_watch(g_get_user_special_dir(G_USER_DIRECTORY_DOWNLOAD)); - add_dir_to_watch(g_build_filename(g_get_home_dir(), "/bin", NULL)); - add_dir_to_watch(g_build_filename(g_get_home_dir(), "/.bin", NULL)); - add_dir_to_watch(g_build_filename(g_get_home_dir(), "/Applications", NULL)); - add_dir_to_watch(g_build_filename("/Applications", NULL)); - // Perhaps we should determine the following dynamically using something like - // mount | grep -i iso | head -n 1 | cut -d ' ' -f 3 - add_dir_to_watch(g_build_filename("/isodevice/Applications", NULL)); // Ubuntu Live media - add_dir_to_watch(g_build_filename("/isofrom/Applications", NULL)); // openSUSE Live media - add_dir_to_watch(g_build_filename("/run/archiso/img_dev/Applications", NULL)); // Antergos Live media - add_dir_to_watch(g_build_filename("/lib/live/mount/findiso/Applications", NULL)); // Manjaro Live media - add_dir_to_watch(g_build_filename("/opt", NULL)); - add_dir_to_watch(g_build_filename("/usr/local/bin", NULL)); - - struct inotify_event * event = inotifytools_next_event(-1); - while (event) { - if(verbose){ - inotifytools_printf(event, "%w%f %e\n"); - } - fflush(stdout); - handle_event(event); - fflush(stdout); - event = inotifytools_next_event(-1); - } -} From 4f4c6eabf90b7fe10b92d10f077ef0c2a726ba44 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 May 2018 19:23:08 +0200 Subject: [PATCH 230/544] Remove appimaged from build scripts --- build-appdirs.sh => build-appdir.sh | 34 ------------------- cmake/cpack_debs.cmake | 8 +---- travis/build-packages-and-appimages.sh | 4 --- .../{test-appimages.sh => test-appimage.sh} | 8 ----- 4 files changed, 1 insertion(+), 53 deletions(-) rename build-appdirs.sh => build-appdir.sh (56%) rename travis/{test-appimages.sh => test-appimage.sh} (77%) diff --git a/build-appdirs.sh b/build-appdir.sh similarity index 56% rename from build-appdirs.sh rename to build-appdir.sh index fb0eb13b4..df727d400 100644 --- a/build-appdirs.sh +++ b/build-appdir.sh @@ -42,37 +42,3 @@ if [ -d /deps/ ]; then cp /usr/lib/libffi.so.5 "$APPIMAGETOOL_APPDIR"/usr/lib/ fi fi - -####################################################################### - -# build appimaged AppDir - -APPIMAGED_APPDIR=appdirs/appimaged.AppDir - -rm -rf "$APPIMAGED_APPDIR"/ || true -mkdir -p "$APPIMAGED_APPDIR"/usr/bin -mkdir -p "$APPIMAGED_APPDIR"/usr/lib -cp -f install_prefix/usr/bin/appimaged "$APPIMAGED_APPDIR"/usr/bin -cp -f install_prefix/usr/bin/validate "$APPIMAGED_APPDIR"/usr/bin -mkdir -p "$APPIMAGED_APPDIR"/usr/share/metainfo -cp ../resources/usr/share/metainfo/appimaged.appdata.xml "$APPIMAGED_APPDIR"/usr/share/metainfo/ - -cp ../resources/AppRun "$APPIMAGED_APPDIR"/ - -cp ../resources/appimaged.desktop "$APPIMAGED_APPDIR"/ -cp ../resources/appimagetool.svg "$APPIMAGED_APPDIR"/appimaged.svg -( cd "$APPIMAGED_APPDIR"/ ; ln -s appimaged.svg .DirIcon ) - -if [ -d /deps/ ]; then - # deploy glib - mkdir -p "$APPIMAGED_APPDIR"/usr/lib/ - cp /deps/lib/lib*.so* "$APPIMAGED_APPDIR"/usr/lib/ - # libffi is a runtime dynamic dependency - # see this thread for more information on the topic: - # https://mail.gnome.org/archives/gtk-devel-list/2012-July/msg00062.html - if [ "$ARCH" == "x86_64" ]; then - cp /usr/lib64/libffi.so.5 "$APPIMAGED_APPDIR"/usr/lib/ - else - cp /usr/lib/libffi.so.5 "$APPIMAGED_APPDIR"/usr/lib/ - fi -fi diff --git a/cmake/cpack_debs.cmake b/cmake/cpack_debs.cmake index f8a387563..7510862e4 100644 --- a/cmake/cpack_debs.cmake +++ b/cmake/cpack_debs.cmake @@ -40,13 +40,7 @@ set(CPACK_DEBIAN_LIBAPPIMAGE-DEV_PACKAGE_NAME "libappimage-dev") set(CPACK_DEBIAN_LIBAPPIMAGE-DEV_PACKAGE_DEPENDS "libappimage") set(CPACK_DEBIAN_LIBAPPIMAGE-DEV_PACKAGE_DESCRIPTION "Utilities collection to handle AppImage files.") -set(CPACK_DEBIAN_APPIMAGED_PACKAGE_NAME "appimaged") -set(CPACK_COMPONENT_APPIMAGED_DESCRIPTION - "Optional AppImage daemon for desktop integration.\n Integrates AppImages into the desktop, e.g., installs icons and menu entries.") - -set(CPACK_DEBIAN_APPIMAGED_PACKAGE_DEPENDS "libarchive13, libc6 (>= 2.4), libglib2.0-0, zlib1g, fuse") - -set(CPACK_COMPONENTS_ALL appimaged libappimage libappimage-dev) +set(CPACK_COMPONENTS_ALL libappimage libappimage-dev) set(CPACK_DEB_COMPONENT_INSTALL ON) include(CPack) diff --git a/travis/build-packages-and-appimages.sh b/travis/build-packages-and-appimages.sh index 0bf207d26..19ada1d29 100644 --- a/travis/build-packages-and-appimages.sh +++ b/travis/build-packages-and-appimages.sh @@ -14,7 +14,3 @@ cd out/ ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -s -v \ -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ appimagetool-"$ARCH".AppImage || true - -./appimagetool-"$ARCH".AppImage ./appimaged.AppDir/ -s -v \ - -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimaged-$ARCH.AppImage.zsync" \ - appimaged-"$ARCH".AppImage || true diff --git a/travis/test-appimages.sh b/travis/test-appimage.sh similarity index 77% rename from travis/test-appimages.sh rename to travis/test-appimage.sh index e5cad4c0c..9cc0a9f23 100644 --- a/travis/test-appimages.sh +++ b/travis/test-appimage.sh @@ -21,13 +21,5 @@ out/appimagetool-"$ARCH".AppImage --version || error # should not fail out/appimagetool-"$ARCH".AppImage --appimage-version || error # should not fail out/appimagetool-"$ARCH".AppImage --appimage-updateinformation || error # should not fail -# now check appimaged -timeout "$TIMEOUT" out/appimaged-"$ARCH".AppImage --no-install - -if [ $? -ne 124 ]; then - echo "Error: appimaged was not terminated by timeout as expected" >&2 - exit 1 -fi - echo "" >&2 echo "Tests successful!" >&2 From bf071ac914efa416b0309931999fd9f53a1c2621 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 May 2018 19:23:26 +0200 Subject: [PATCH 231/544] Update README with link to appimaged repo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3e4a6ee02..9f26d3f4f 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Providing an [AppImage](http://appimage.org/) for distributing application has, - No root needed - No system libraries changed - Works out of the box, no installation of runtimes needed -- Optional desktop integration with `appimaged` +- Optional desktop integration with [appimaged](https://github.com/AppImage/appimaged) - Optional binary delta updates, e.g., for continuous builds (only download the binary diff) using AppImageUpdate - Can optionally GPG2-sign your AppImages (inside the file) - Works on Live ISOs From fb3e3e2e5263f01aae9f7d9674b066a37eb0549e Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 May 2018 19:28:28 +0200 Subject: [PATCH 232/544] Remove appimaged part from README --- README.md | 69 ------------------------------------------------------- 1 file changed, 69 deletions(-) diff --git a/README.md b/README.md index 9f26d3f4f..99b0ec918 100644 --- a/README.md +++ b/README.md @@ -152,75 +152,6 @@ cat Your.squashfs >> Your.AppImage chmod a+x Your.AppImage ``` -## appimaged usage - -`appimaged` is an optional daemon that watches locations like `~/bin` and `~/Downloads` for AppImages and if it detects some, registers them with the system, so that they show up in the menu, have their icons show up, MIME types associated, etc. It also unregisters AppImages again from the system if they are deleted. If [firejail](https://github.com/netblue30/firejail) is installed, it runs the AppImages with it. - -A precompiled version can be found in the last successful Travis CI build, you can get it with: - -``` -wget "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimaged-x86_64.AppImage" -chmod a+x appimaged-x86_64.AppImage -``` - -Usage in a nutshell: - -``` -./appimaged-x86_64.AppImage --install -``` - -Or, if you are on a deb-based system: - -``` -wget -c "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimaged_1.0_amd64.deb" -sudo dpkg -i appimaged_*.deb -systemctl --user add-wants default.target appimaged -systemctl --user start appimaged -``` - -It will register the AppImages in with your system from the following places: -* $HOME/Downloads (or its localized equivalent, as determined by `G_USER_DIRECTORY_DOWNLOAD` in glib) -* $HOME/.local/bin -* $HOME/bin -* $HOME/Applications -* /Applications -* /isodevice/Applications -* /isofrom/Applications -* /run/archiso/img_dev/Applications -* /lib/live/mount/findiso/Applications -* /opt -* /usr/local/bin - -Run `appimaged -v` for increased verbosity. - -Detailed usage: -``` -Usage: - appimaged [OPTION...] - -Help Options: - -h, --help Show help options - -Application Options: - -v, --verbose Be verbose - -i, --install Install this appimaged instance to $HOME - -u, --uninstall Uninstall an appimaged instance from $HOME - --version Show version number - -``` - -__NOTE:__ It may be necessary to restart (or `xkill`) dash, nautilus, to recognize new directories that didn't exist prior to the first run of `appimaged`. Alternatively, it should be sufficient to log out of the session and log in again after having run appimaged once. - -If you have `AppImageUpdate` on your `$PATH`, then it can also do this neat trick: - -![screenshot from 2016-10-15 16-37-05](https://cloud.githubusercontent.com/assets/2480569/19410850/0390fe9c-92f6-11e6-9882-3ca6d360a190.jpg) - -Download AppImageUpdate from https://github.com/AppImage/AppImageUpdate/releases/tag/continuous and put on your `$PATH`: - -``` -sudo mv "Downloads/AppImageUpdate-*.AppImage" /usr/local/bin/AppImageUpdate -chmod a+x /usr/local/bin/AppImageUpdate -``` ## Building From d5eb051a260ba53268c01ab755a615845c4be6eb Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 May 2018 19:39:52 +0200 Subject: [PATCH 233/544] build-appdirs.sh has been renamed --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 338caf800..b015a12e1 100755 --- a/build.sh +++ b/build.sh @@ -97,7 +97,7 @@ for FILE in install_prefix/usr/bin/*; do ldd "$FILE" || true done -bash -ex "$HERE/build-appdirs.sh" +bash -ex "$HERE/build-appdir.sh" ls -lh From b41747ffc04ed28b2de526508a60a759f7aa77ef Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 May 2018 19:49:15 +0200 Subject: [PATCH 234/544] No longer build Debian packages --- .travis.yml | 2 -- ...build-packages-and-appimages.sh => build-appimage.sh} | 5 ----- travis/travis-build.sh | 9 ++++----- 3 files changed, 4 insertions(+), 12 deletions(-) rename travis/{build-packages-and-appimages.sh => build-appimage.sh} (80%) diff --git a/.travis.yml b/.travis.yml index 2fa6e4055..c4edf5b3c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,8 +16,6 @@ after_success: - ls -lh out/* # <= wrong line: see https://travis-ci.org/AppImage/AppImageKit/jobs/347965050#L4211 - ls -lh build/out/* - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh - # don't upload any .debs but appimaged's - - find build/out/ -iname '*.deb' -not -iname '*appimaged*' -print -delete - bash ./upload.sh build/out/* notifications: diff --git a/travis/build-packages-and-appimages.sh b/travis/build-appimage.sh similarity index 80% rename from travis/build-packages-and-appimages.sh rename to travis/build-appimage.sh index 19ada1d29..5ec704cdc 100644 --- a/travis/build-packages-and-appimages.sh +++ b/travis/build-appimage.sh @@ -4,13 +4,8 @@ set -e cd /AppImageKit/build -cpack -V -mv *.deb out/ - cd out/ -# || true -- temporary workaround - ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -s -v \ -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ appimagetool-"$ARCH".AppImage || true diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 48fd9fc5a..14f328ae7 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -35,9 +35,8 @@ docker run --rm \ # inspect AppDirs find build/out/appimagetool.AppDir/ -find build/out/appimaged.AppDir/ -# build AppImages +# build AppImage docker run --rm \ --cap-add SYS_ADMIN \ --device /dev/fuse:mrw \ @@ -47,13 +46,13 @@ docker run --rm \ -v "${PWD}"/travis/:/travis \ -v $HOME/.gnupg:/root/.gnupg \ "$DOCKER_IMAGE" \ - /bin/bash -x "/travis/build-packages-and-appimages.sh" + /bin/bash -x "/travis/build-appimage.sh" cd build/ # test AppImages [ "$ARCH" == "i686" ] && sudo apt-get update && sudo apt-get install -y gcc-multilib lib32z1 libfuse2 libfuse2:i386 libglib2.0-0:i386 libcairo2:i386 -bash -x ../travis/test-appimages.sh +bash -x ../travis/test-appimage.sh # install more tools # (vim-common contains xxd) @@ -64,7 +63,7 @@ sudo chown -R travis.travis . # remove binaries from output directory ls -al out/ -rm -r out/{appimaged,appimagetool,validate,digest,mksquashfs,*.AppDir} +rm -r out/{appimagetool,validate,digest,mksquashfs,*.AppDir} # inspect runtime xxd out/runtime | head -n 1 From 9df82a1fd006e0fe82da970435193729042a85a3 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 23 May 2018 22:47:17 +0200 Subject: [PATCH 235/544] Fix type 1 integration size and n arguments in fwrite() call were in the wrong order, causing the returned number of elements written to be 1 instead of the actual size. This caused the error check to report false positives. Also contains a couple of other fixes. --- src/shared.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/shared.c b/src/shared.c index e8afc5d6e..ba5650506 100644 --- a/src/shared.c +++ b/src/shared.c @@ -122,7 +122,7 @@ char *appimage_get_md5(const char* path) g_free(uri); return result; } else { - return ""; + return NULL; } } @@ -1002,7 +1002,7 @@ bool archive_copy_icons_recursively_to_destination(struct archive** a, const gch break; } - if ((fwrite(buff, size, 1, f) != size) || ferror(f) || feof(f)) { + if (fwrite(buff, 1, size, f) != size) { #ifdef STANDALONE int error = errno; fprintf(stderr, "Failed to copy icon: %s\n", strerror(error)); @@ -1019,7 +1019,7 @@ bool archive_copy_icons_recursively_to_destination(struct archive** a, const gch fprintf(stderr, "Installed: %s\n", dest); } - if (g_str_has_prefix(dest, "/tmp")) { + if (!errored && g_str_has_prefix(dest, "/tmp")) { move_icon_to_destination(dest, verbose); } @@ -1632,6 +1632,13 @@ char* appimage_registered_desktop_file_path(const char *path, char *md5, bool ve if (md5 == NULL) md5 = appimage_get_md5(path); + // sanity check + if (md5 == NULL) { + if (verbose) + fprintf(stderr, "appimage_get_md5() failed\n"); + return NULL; + } + char *data_home = xdg_data_home(); // TODO: calculate this value exactly From 2e11261a0e6b0818bcc7319e2258ffe076546975 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 23 May 2018 22:57:08 +0200 Subject: [PATCH 236/544] Fix unit tests --- tests/test_libappimage.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index e72f4f135..2c6721161 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -113,11 +113,9 @@ namespace AppImageTests { } TEST_F(LibAppImageTest, get_md5_invalid_file_path) { - std::string expected = ""; gchar *sum = appimage_get_md5(""); - int res = g_strcmp0(expected.c_str(), sum); - ASSERT_EQ(res, 0); + ASSERT_EQ(sum, NULL); } TEST_F(LibAppImageTest, create_thumbnail_appimage_type_1) { From 844c9c9746911a3339f483156179b3b258adec5a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 23 May 2018 23:07:45 +0200 Subject: [PATCH 237/544] Fix unit tests, mk. 2 --- tests/test_libappimage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp index 2c6721161..c8c7679b1 100644 --- a/tests/test_libappimage.cpp +++ b/tests/test_libappimage.cpp @@ -115,7 +115,7 @@ namespace AppImageTests { TEST_F(LibAppImageTest, get_md5_invalid_file_path) { gchar *sum = appimage_get_md5(""); - ASSERT_EQ(sum, NULL); + ASSERT_TRUE(sum == NULL) << "sum is not NULL"; } TEST_F(LibAppImageTest, create_thumbnail_appimage_type_1) { From 0afd5757f659336d5783087119d40c34a410b63b Mon Sep 17 00:00:00 2001 From: Maxim Biro Date: Mon, 28 May 2018 19:12:03 -0400 Subject: [PATCH 238/544] Fix ld not preserving ELF flags --- src/appimagetool.c | 8 ++++---- src/appimagetoolnoglib.c | 8 ++++---- src/build-runtime.sh.in | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 5adcf3eef..ba9d17110 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -60,8 +60,8 @@ #ifdef __linux__ #define HAVE_BINARY_RUNTIME -extern int _binary_runtime_start; -extern int _binary_runtime_end; +extern char runtime[]; +extern unsigned int runtime_len; #endif enum fARCH { @@ -743,8 +743,8 @@ main (int argc, char *argv[]) #ifdef HAVE_BINARY_RUNTIME /* runtime is embedded into this executable * http://stupefydeveloper.blogspot.de/2008/08/cc-embed-binary-data-into-elf.html */ - size = (int)((void *)&_binary_runtime_end - (void *)&_binary_runtime_start); - data = (char *)&_binary_runtime_start; + size = runtime_len; + data = runtime; #else die("No runtime file was provided"); #endif diff --git a/src/appimagetoolnoglib.c b/src/appimagetoolnoglib.c index 6e751e9ef..f900e76f6 100644 --- a/src/appimagetoolnoglib.c +++ b/src/appimagetoolnoglib.c @@ -19,8 +19,8 @@ #include -extern int _binary_runtime_start; -extern int _binary_runtime_size; +extern char runtime[]; +extern unsigned int runtime_len; const char *argp_program_version = @@ -254,8 +254,8 @@ int main (int argc, char **argv) /* runtime is embedded into this executable * http://stupefydeveloper.blogspot.de/2008/08/cc-embed-binary-data-into-elf.html */ - int size = (int)&_binary_runtime_size; - char *data = (char *)&_binary_runtime_start; + int size = runtime_len; + char *data = runtime; if (arguments.verbose) printf("Size of the embedded runtime: %d bytes\n", size); /* Where to store updateinformation. Fixed offset preferred for easy manipulation diff --git a/src/build-runtime.sh.in b/src/build-runtime.sh.in index 224c586fe..563992ef1 100755 --- a/src/build-runtime.sh.in +++ b/src/build-runtime.sh.in @@ -89,7 +89,7 @@ if [ "@APPIMAGEKIT_EMBED_MAGIC_BYTES@" == "ON" ]; then fi # Convert runtime into a data object that can be embedded into appimagetool -ld -r -b binary -o data.o runtime +xxd -i runtime | $CC -c -x c - -o data.o # Show header for debugging purposes xxd runtime | head -n 1 From 8df732baaf8427b6410686ce70045caf521dd083 Mon Sep 17 00:00:00 2001 From: probonopd Date: Wed, 30 May 2018 07:39:43 +0200 Subject: [PATCH 239/544] Add example for .config [ci skip] --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index 99b0ec918..43bf92ce6 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,28 @@ Normally the application contained inside an AppImage will store its configurati - If there is a directory with the same name as the AppImage plus `.home`, then `$HOME` will automatically be set to it before executing the payload application - If there is a directory with the same name as the AppImage plus `.config`, then `$XDG_CONFIG_HOME` will automatically be set to it before executing the payload application +Example: Imagine you want to use the Leafpad text editor, but carry its settings around with the executable. You can do the following: + +```bash +# Download Leafpad AppImage and make it executable +wget -c "https://bintray.com/probono/AppImages/download_file?file_path=Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage" -O Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage +chmod a+x Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage + +# Create a directory with the same name as the AppImage plus the ".config" extension +# in the same directory as the AppImage +mkdir Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage.config + +# Run Leafpad, change some setting (e.g., change the default font size) then close Leafpad +./Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage + +# Now, check where the settings were written: +linux@linux:~> find Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage.config +(...) +Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage.config/leafpad/leafpadrc +``` + +Note that the file `leafpadrc` was written in the directory we have created before. + ## appimagetool usage `appimagetool` is used to generate an AppImage from an existing `AppDir`. Higher-level tools such as [`linuxdeployqt`](https://github.com/probonopd/linuxdeployqt) use it internally. A precompiled version can be found on [GitHub Releases](https://github.com/AppImage/AppImageKit/releases). From d8e675308e208678faf07de4ffd49de27369677f Mon Sep 17 00:00:00 2001 From: probonopd Date: Thu, 31 May 2018 10:50:51 +0200 Subject: [PATCH 240/544] Fix compilation, closes #796 --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index df2a05d67..c560ddd18 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -26,7 +26,7 @@ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime ) add_custom_command(OUTPUT data.o - COMMAND ld -r -b binary -o data.o runtime + COMMAND xxd -i runtime | $CC -c -x c - -o data.o WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/runtime ) From fc61cbacac6c2dde26fbf531f47c92566c07ae83 Mon Sep 17 00:00:00 2001 From: probonopd Date: Thu, 31 May 2018 10:59:16 +0200 Subject: [PATCH 241/544] Use ${CMAKE_C_COMPILER}, #https://github.com/AppImage/AppImageKit/issues/796#issuecomment-393463459 --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c560ddd18..77621ee20 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -26,7 +26,7 @@ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime ) add_custom_command(OUTPUT data.o - COMMAND xxd -i runtime | $CC -c -x c - -o data.o + COMMAND xxd -i runtime | ${CMAKE_C_COMPILER} -c -x c - -o data.o WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/runtime ) From ce983e5881e6d8d251cf6f91824b54a8bd0ae747 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 1 Jun 2018 02:09:49 +0200 Subject: [PATCH 242/544] Use SourceForge mirror to download xz tarball Fixes #797 --- cmake/dependencies.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 77ec3c808..a3b9d24be 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -183,7 +183,7 @@ if(NOT USE_SYSTEM_XZ) message(STATUS "Downloading and building xz") ExternalProject_Add(xz-EXTERNAL - URL https://tukaani.org/xz/xz-5.2.3.tar.gz + URL https://netcologne.dl.sourceforge.net/project/lzmautils/xz-5.2.3.tar.gz URL_HASH SHA512=a5eb4f707cf31579d166a6f95dbac45cf7ea181036d1632b4f123a4072f502f8d57cd6e7d0588f0bf831a07b8fc4065d26589a25c399b95ddcf5f73435163da6 CONFIGURE_COMMAND CC=${CC} CXX=${CXX} CFLAGS=-fPIC CPPFLAGS=-fPIC /configure --disable-shared --enable-static --prefix= --libdir=/lib BUILD_COMMAND make From d45b2ff2ebbe9a2ec00d8ce13f60a659a75afd72 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 7 Jun 2018 16:22:34 +0200 Subject: [PATCH 243/544] Fix error handling for .sig_key --- src/appimagetool.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index ba9d17110..a3fd8b992 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1130,16 +1130,12 @@ main (int argc, char *argv[]) bool rv = appimage_get_elf_section_offset_and_length(destination, ".sig_key", &key_offset, &key_length); - if (!rv || key_offset == 0 || key_length == 0) { - die("Could not find section .sig_key in runtime"); - } - if (verbose) { printf("key_offset: %lu\n", key_offset); printf("key_length: %lu\n", key_length); } - if (rv != 0 || key_offset == 0 || key_length == 0) { + if (!rv || key_offset == 0 || key_length == 0) { die("Could not find section .sig_key in runtime"); } From 30ef1961980665fdbf9ac8a3fcd95c091b7533e0 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 10 Jun 2018 10:01:40 +0000 Subject: [PATCH 244/544] Generate zsync file when running on GitLab CI (#804) --- src/appimagetool.c | 63 +++++++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index a3fd8b992..a264233a3 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -475,6 +475,17 @@ main (int argc, char *argv[]) /* https://github.com/probonopd/uploadtool */ char* github_token; github_token = getenv("GITHUB_TOKEN"); + + /* Parse GitLab CI environment variables. + * https://docs.gitlab.com/ee/ci/variables/#predefined-variables-environment-variables + * echo "${CI_PROJECT_URL}/-/jobs/artifacts/${CI_COMMIT_REF_NAME}/raw/QtQuickApp-x86_64.AppImage?job=${CI_JOB_NAME}" + */ + char* CI_PROJECT_URL; + CI_PROJECT_URL = getenv("CI_PROJECT_URL"); + char* CI_COMMIT_REF_NAME; + CI_COMMIT_REF_NAME = getenv("CI_COMMIT_REF_NAME"); // The branch or tag name for which project is built + char* CI_JOB_NAME; + CI_JOB_NAME = getenv("CI_JOB_NAME"); // The name of the job as defined in .gitlab-ci.yml /* Parse OWD environment variable. * If it is available then cd there. It is the original CWD prior to running AppRun */ @@ -786,32 +797,44 @@ main (int argc, char *argv[]) /* If the user has not provided update information but we know this is a Travis CI build, * then fill in update information based on TRAVIS_REPO_SLUG */ if(guessupdateinformation){ - if(!travis_repo_slug){ - printf("Cannot guess update information since $TRAVIS_REPO_SLUG is missing\n"); - } else if(!github_token) { - printf("Will not guess update information since $GITHUB_TOKEN is missing,\n"); - if(0 != strcmp(travis_pull_request, "false")){ - printf("please set it in the Travis CI Repository Settings for this project.\n"); - printf("You can get one from https://github.com/settings/tokens\n"); + if(travis_repo_slug){ + if(!github_token) { + printf("Will not guess update information since $GITHUB_TOKEN is missing,\n"); + if(0 != strcmp(travis_pull_request, "false")){ + printf("please set it in the Travis CI Repository Settings for this project.\n"); + printf("You can get one from https://github.com/settings/tokens\n"); + } else { + printf("which is expected since this is a pull request\n"); + } } else { - printf("which is expected since this is a pull request\n"); + gchar *zsyncmake_path = g_find_program_in_path ("zsyncmake"); + if(zsyncmake_path){ + char buf[1024]; + gchar **parts = g_strsplit (travis_repo_slug, "/", 2); + /* https://github.com/AppImage/AppImageSpec/blob/master/draft.md#github-releases + * gh-releases-zsync|probono|AppImages|latest|Subsurface*-x86_64.AppImage.zsync */ + gchar *channel = "continuous"; + if(travis_tag != NULL){ + if((strcmp(travis_tag, "") != 0) && (strcmp(travis_tag, "continuous") != 0)) { + channel = "latest"; + } + } + sprintf(buf, "gh-releases-zsync|%s|%s|%s|%s*-%s.AppImage.zsync", parts[0], parts[1], channel, app_name_for_filename, arch); + updateinformation = buf; + printf("Guessing update information based on $TRAVIS_TAG=%s and $TRAVIS_REPO_SLUG=%s\n", travis_tag, travis_repo_slug); + printf("%s\n", updateinformation); + } else { + printf("Will not guess update information since zsyncmake is missing\n"); + } } - } else { + } else if(CI_COMMIT_REF_NAME){ + // ${CI_PROJECT_URL}/-/jobs/artifacts/${CI_COMMIT_REF_NAME}/raw/QtQuickApp-x86_64.AppImage?job=${CI_JOB_NAME} gchar *zsyncmake_path = g_find_program_in_path ("zsyncmake"); if(zsyncmake_path){ char buf[1024]; - gchar **parts = g_strsplit (travis_repo_slug, "/", 2); - /* https://github.com/AppImage/AppImageSpec/blob/master/draft.md#github-releases - * gh-releases-zsync|probono|AppImages|latest|Subsurface*-x86_64.AppImage.zsync */ - gchar *channel = "continuous"; - if(travis_tag != NULL){ - if((strcmp(travis_tag, "") != 0) && (strcmp(travis_tag, "continuous") != 0)) { - channel = "latest"; - } - } - sprintf(buf, "gh-releases-zsync|%s|%s|%s|%s*-%s.AppImage.zsync", parts[0], parts[1], channel, app_name_for_filename, arch); + sprintf(buf, "zsync|%s/-/jobs/artifacts/%s/raw/%s-%s.AppImage.zsync?job=%s", CI_PROJECT_URL, CI_COMMIT_REF_NAME, app_name_for_filename, arch, CI_JOB_NAME); updateinformation = buf; - printf("Guessing update information based on $TRAVIS_TAG=%s and $TRAVIS_REPO_SLUG=%s\n", travis_tag, travis_repo_slug); + printf("Guessing update information based on $CI_COMMIT_REF_NAME=%s and $CI_JOB_NAME=%s\n", CI_COMMIT_REF_NAME, CI_JOB_NAME); printf("%s\n", updateinformation); } else { printf("Will not guess update information since zsyncmake is missing\n"); From 5b5ca1a70cd84966d9084a9efb70115aa4b9fdb2 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 10 Jun 2018 10:48:20 +0000 Subject: [PATCH 245/544] Guess update information based on Travis CI or GitLab environment variables --- src/appimagetool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index a264233a3..69beaa18e 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -434,7 +434,7 @@ static GOptionEntry entries[] = { { "list", 'l', 0, G_OPTION_ARG_NONE, &list, "List files in SOURCE AppImage", NULL }, { "updateinformation", 'u', 0, G_OPTION_ARG_STRING, &updateinformation, "Embed update information STRING; if zsyncmake is installed, generate zsync file", NULL }, - { "guess", 'g', 0, G_OPTION_ARG_NONE, &guessupdateinformation, "Guess update information based on Travis CI environment variables", NULL }, + { "guess", 'g', 0, G_OPTION_ARG_NONE, &guessupdateinformation, "Guess update information based on Travis CI or GitLab environment variables", NULL }, { "bintray-user", 0, 0, G_OPTION_ARG_STRING, &bintray_user, "Bintray user name", NULL }, { "bintray-repo", 0, 0, G_OPTION_ARG_STRING, &bintray_repo, "Bintray repository", NULL }, { "version", 0, 0, G_OPTION_ARG_NONE, &showVersionOnly, "Show version number", NULL }, From 1528fccb4d5f04f107a10aee6306acc5e13d3362 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 10 Jun 2018 10:50:08 +0000 Subject: [PATCH 246/544] Update USAGE [ci skip] --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 43bf92ce6..156224b29 100644 --- a/README.md +++ b/README.md @@ -157,12 +157,18 @@ Help Options: Application Options: -l, --list List files in SOURCE AppImage -u, --updateinformation Embed update information STRING; if zsyncmake is installed, generate zsync file + -g, --guess Guess update information based on Travis CI or GitLab environment variables --bintray-user Bintray user name --bintray-repo Bintray repository --version Show version number -v, --verbose Produce verbose output - -s, --sign Sign with gpg2 + -s, --sign Sign with gpg[2] + --comp Squashfs compression -n, --no-appstream Do not check AppStream metadata + --exclude-file Uses given file as exclude file for mksquashfs, in addition to .appimageignore. + --runtime-file Runtime file to use + --sign-key Key ID to use for gpg[2] signatures + --sign-args Extra arguments to use when signing with gpg[2] ``` If you want to generate an AppImage manually, you can: From b343c5030d0cb786cb5fe495abb4d362dafafc27 Mon Sep 17 00:00:00 2001 From: Alexis Lopez Zubieta Date: Tue, 19 Jun 2018 19:05:48 -0500 Subject: [PATCH 247/544] Add test-xdg-basedir to ctest and build it only when BUILD_TESTING is ON. --- src/xdg-basedir/CMakeLists.txt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/xdg-basedir/CMakeLists.txt b/src/xdg-basedir/CMakeLists.txt index 5f0f78e36..d015221d3 100644 --- a/src/xdg-basedir/CMakeLists.txt +++ b/src/xdg-basedir/CMakeLists.txt @@ -7,8 +7,11 @@ include_directories(${gtest_INCLUDE_DIRS}) add_library(xdg-basedir STATIC xdg-basedir.h xdg-basedir.c) target_include_directories(xdg-basedir PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -add_executable(test-xdg-basedir test-xdg-basedir.cpp) -target_link_libraries(test-xdg-basedir ${gtest_LIBRARIES} pthread xdg-basedir) -if(NOT USE_SYSTEM_GTEST) - add_dependencies(test-xdg-basedir gtest) -endif() +if (BUILD_TESTING) + add_executable(test-xdg-basedir test-xdg-basedir.cpp) + target_link_libraries(test-xdg-basedir ${gtest_LIBRARIES} pthread xdg-basedir) + if (NOT USE_SYSTEM_GTEST) + add_dependencies(test-xdg-basedir gtest) + endif () + add_test(test-xdg-basedir test-xdg-basedir) +endif () \ No newline at end of file From c39a5dca80e13e3db1b9193f879d98694c83a424 Mon Sep 17 00:00:00 2001 From: Alexis Lopez Zubieta Date: Tue, 19 Jun 2018 19:06:55 -0500 Subject: [PATCH 248/544] Add BUILD_TESTING config option. --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3b3a5e2aa..89df72a29 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,7 @@ project(AppImageKit) include(ExternalProject) # enable testing globally +option(BUILD_TESTING "Build the testing tree" ON) include(CTest) # support for ccache From 626bac69e2332d5d111e111db0d60ce8f1a396c0 Mon Sep 17 00:00:00 2001 From: Alexis Lopez Zubieta Date: Tue, 19 Jun 2018 19:37:50 -0500 Subject: [PATCH 249/544] Revert "Add BUILD_TESTING config option." This reverts commit c39a5dca80e13e3db1b9193f879d98694c83a424. --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 89df72a29..3b3a5e2aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,6 @@ project(AppImageKit) include(ExternalProject) # enable testing globally -option(BUILD_TESTING "Build the testing tree" ON) include(CTest) # support for ccache From e5c08486d27bc80e3fda53eb5b58c75ab7018715 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 20 Jun 2018 03:41:22 +0200 Subject: [PATCH 250/544] Don't build GTest when BUILD_TESTING is set to OFF --- cmake/dependencies.cmake | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index a3b9d24be..5577ead53 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -296,28 +296,30 @@ else() endif() +if(BUILD_TESTING) set(USE_SYSTEM_GTEST OFF CACHE BOOL "Use system GTest instead of downloading and building GTest") if(NOT USE_SYSTEM_GTEST) - message(STATUS "Downloading and building GTest") - - ExternalProject_Add(gtest-EXTERNAL - GIT_REPOSITORY https://github.com/google/googletest.git - GIT_TAG release-1.8.0 - UPDATE_COMMAND "" # make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time - CONFIGURE_COMMAND ${CMAKE_COMMAND} -G${CMAKE_GENERATOR} -DCMAKE_INSTALL_PREFIX= /googletest - ) - - import_external_project( - TARGET_NAME gtest - EXT_PROJECT_NAME gtest-EXTERNAL - LIBRARIES "/lib/libgtest.a;/lib/libgtest_main.a" - INCLUDE_DIRS "/include/" - ) -else() - message(STATUS "Using system GTest") - - import_find_pkg_target(gtest GTest GTEST) + message(STATUS "Downloading and building GTest") + + ExternalProject_Add(gtest-EXTERNAL + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG release-1.8.0 + UPDATE_COMMAND "" # make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time + CONFIGURE_COMMAND ${CMAKE_COMMAND} -G${CMAKE_GENERATOR} -DCMAKE_INSTALL_PREFIX= /googletest + ) + + import_external_project( + TARGET_NAME gtest + EXT_PROJECT_NAME gtest-EXTERNAL + LIBRARIES "/lib/libgtest.a;/lib/libgtest_main.a" + INCLUDE_DIRS "/include/" + ) + else() + message(STATUS "Using system GTest") + + import_find_pkg_target(gtest GTest GTEST) + endif() endif() From 86bb202c505c5e0e4b73af3631c3cbce275826f6 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 4 Jul 2018 14:43:03 +0200 Subject: [PATCH 251/544] Fix icon copying error check --- src/shared.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared.c b/src/shared.c index ba5650506..f9395faae 100644 --- a/src/shared.c +++ b/src/shared.c @@ -951,7 +951,7 @@ bool archive_copy_icons_recursively_to_destination(struct archive** a, const gch // cleanup g_free(filename); - if (dest != NULL) { + if (dest != NULL && strlen(dest) <= 0) { if (verbose) fprintf(stderr, "install: %s\n", dest); From e16f5881fa0edcac026eb82ca581522f32f2587a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 4 Jul 2018 14:43:48 +0200 Subject: [PATCH 252/544] Don't pretend successful integration if AppImage filename has suffix --- src/shared.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared.c b/src/shared.c index f9395faae..06d3435fd 100644 --- a/src/shared.c +++ b/src/shared.c @@ -1715,7 +1715,7 @@ int appimage_register_in_system(const char *path, bool verbose) g_str_has_suffix(path, ".zs-old") || g_str_has_suffix(path, ".~") ) { - return 0; + return 1; } int type = appimage_get_type(path, verbose); From db78267cf53a70dfeaebe3512118cdfc96ef99d2 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 10 Jul 2018 12:34:54 +0200 Subject: [PATCH 253/544] Allow AppRun to work with big AppImages --- src/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 77621ee20..322e5d08b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -178,6 +178,12 @@ add_sanitizers(appimagetool) add_executable(AppRun AppRun.c) +target_compile_definitions(AppRun + PRIVATE -D_FILE_OFFSET_BITS=64 + PRIVATE -DGIT_COMMIT="${GIT_COMMIT}" + PRIVATE -DENABLE_BINRELOC +) + add_sanitizers(AppRun) From 1c6a1deb357e652b0d2392cdcb26d302e5af4d41 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 10 Jul 2018 20:15:53 +0200 Subject: [PATCH 254/544] Don't fail when sanitizers submodule isn't available Instead, a warning will be shown. Fixes #795. --- src/CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 322e5d08b..353ae646c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,5 +1,12 @@ find_package(Sanitizers) +if(NOT COMMAND add_sanitizers) + message(WARNING "Sanitizers CMake module not found, sanitizer support is not available") + # defining a no-op function to avoid CMake errors + function(add_sanitizers ...) + endfunction() +endif() + set(APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE OFF CACHE BOOL "Useful for $TARGET_APPIMAGE; see issue #763") # set up build script From 1beecf36fae39595c703393a6c97341a965dfb85 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 14 Jul 2018 00:18:16 +0200 Subject: [PATCH 255/544] Replace build-runtime.sh with CMake code Makes the build of the runtime more transparent, and creates a _real_ executable target for the runtime for use in CMake. Reduces maintenance overhead significantly. Eliminates need for the runtime-debug target. Changes to CMake variables are automatically applied to the runtime target as well. CC #789 --- src/CMakeLists.txt | 70 ++--------------------------- src/build-runtime.cmake | 85 ++++++++++++++++++++++++++++++++++++ src/build-runtime.sh.in | 97 ----------------------------------------- 3 files changed, 89 insertions(+), 163 deletions(-) create mode 100644 src/build-runtime.cmake delete mode 100755 src/build-runtime.sh.in diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 353ae646c..3f2544281 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -7,39 +7,6 @@ if(NOT COMMAND add_sanitizers) endfunction() endif() -set(APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE OFF CACHE BOOL "Useful for $TARGET_APPIMAGE; see issue #763") - -# set up build script - -# if set to anything but ON, the magic bytes won't be embedded -# CAUTION: the magic bytes are a hard requirement for type 2 AppImages! This option should NEVER be used unless you are -# 100% sure what you are doing here! -set(APPIMAGEKIT_EMBED_MAGIC_BYTES ON CACHE BOOL "") -# mark as advanced so it won't show up in CMake GUIs etc., to prevent users from accidentally using this option -mark_as_advanced(APPIMAGEKIT_EMBED_MAGIC_BYTES) - -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/build-runtime.sh.in - ${CMAKE_CURRENT_BINARY_DIR}/build-runtime.sh - @ONLY -) - -add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime - COMMAND bash ${CMAKE_CURRENT_BINARY_DIR}/build-runtime.sh - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/build-runtime.sh - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/runtime.c - DEPENDS squashfuse -) - -add_custom_command(OUTPUT data.o - COMMAND xxd -i runtime | ${CMAKE_C_COMPILER} -c -x c - -o data.o - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/runtime -) - -add_custom_target(runtime DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/runtime) - # include XDG basedir library add_subdirectory(xdg-basedir) @@ -130,13 +97,16 @@ target_link_libraries(libappimage_static ) +include(build-runtime.cmake) + + add_executable(appimagetool ${PROJECT_SOURCE_DIR}/include/appimage/appimage.h appimagetool.c getsection.c binreloc.c elf.c - data.o + runtime_embed.o appimagetool_shared.c ) @@ -216,38 +186,6 @@ target_link_libraries(digest add_sanitizers(digest) -add_executable(runtime-debug EXCLUDE_FROM_ALL elf.c notify.c getsection.c ${CMAKE_CURRENT_SOURCE_DIR}/runtime.c) - -target_link_libraries(runtime-debug - squashfuse - libarchive - xz - xdg-basedir - pthread - libglib - libzlib - libcairo - ${CMAKE_DL_LIBS} -) - -set_target_properties(runtime-debug PROPERTIES LINK_FLAGS "-ffunction-sections -fdata-sections -Wl,--gc-sections") - -target_include_directories(runtime-debug - PUBLIC $ - INTERFACE $ -) - -target_compile_options(runtime-debug - PUBLIC -DGIT_COMMIT="${GIT_COMMIT}" -D_FILE_OFFSET_BITS=64 -) - -if(APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE) - target_compile_definitions(runtime-debug - PUBLIC -DENABLE_SETPROCTITLE - ) -endif() - - # digest_md5 demo application # can be used to verify AppImages' MD5 digest add_executable(digest_md5 EXCLUDE_FROM_ALL digest_md5.c getsection.c appimagetool_shared.c) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake new file mode 100644 index 000000000..8137649a1 --- /dev/null +++ b/src/build-runtime.cmake @@ -0,0 +1,85 @@ +set(APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE OFF CACHE BOOL "Useful for $TARGET_APPIMAGE; see issue #763") + +# if set to anything but ON, the magic bytes won't be embedded +# CAUTION: the magic bytes are a hard requirement for type 2 AppImages! This option should NEVER be used unless you are +# 100% sure what you are doing here! +set(APPIMAGEKIT_EMBED_MAGIC_BYTES ON CACHE BOOL "") +# mark as advanced so it won't show up in CMake GUIs etc., to prevent users from accidentally using this option +mark_as_advanced(APPIMAGEKIT_EMBED_MAGIC_BYTES) + +set(runtime_cflags -Os -ffunction-sections -fdata-sections -DGIT_COMMIT=\"${GIT_COMMIT}\" -I${xz_INCLUDE_DIRS} -I${squashfuse_INCLUDE_DIRS} -I${PROJECT_SOURCE_DIR}/include) +set(runtime_ldflags -s -Wl,--gc-sections) + +if(APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE) + set(runtime_cflags "${runtime_cflags} -DENABLE_SETPROCTITLE") +endif() + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/16_blank_bytes + COMMAND printf '\\0%.0s' {0..15} > ${CMAKE_CURRENT_BINARY_DIR}/16_blank_bytes +) + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes + COMMAND printf '\\0%.0s' {0..1023} > ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes +) + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/8192_blank_bytes + COMMAND printf '\\0%.0s' {0..8191} > ${CMAKE_CURRENT_BINARY_DIR}/8192_blank_bytes +) + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.0.o + COMMAND ${CMAKE_C_COMPILER} ${runtime_cflags} -c ${CMAKE_CURRENT_SOURCE_DIR}/runtime.c -o runtime.0.o + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +) + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.1.o + COMMAND objcopy --add-section .digest_md5=16_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.0.o runtime.1.o + MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/runtime.0.o + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/16_blank_bytes + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +) + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.2.o + COMMAND objcopy --add-section .upd_info=1024_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.1.o runtime.2.o + MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/runtime.1.o + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +) + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.3.o + COMMAND objcopy --add-section .sha256_sig=1024_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.2.o runtime.3.o + MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/runtime.2.o + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +) + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o + COMMAND objcopy --add-section .sig_key=8192_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.3.o runtime.4.o + MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/runtime.3.o + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/8192_blank_bytes + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +) + +add_executable(runtime ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o elf.c notify.c getsection.c) +set_property(TARGET runtime PROPERTY LINKER_LANGUAGE C) +target_link_libraries(runtime PRIVATE squashfuse dl xz libzlib pthread) + +add_custom_command( + TARGET runtime + POST_BUILD + COMMAND printf '\\x41\\x49\\x02' | dd of=runtime bs=1 seek=8 count=3 conv=notrunc +) + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime_embed.o + COMMAND xxd -i runtime | ${CMAKE_C_COMPILER} -c -x c - -o runtime_embed.o + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + MAIN_DEPENDENCY runtime +) diff --git a/src/build-runtime.sh.in b/src/build-runtime.sh.in deleted file mode 100755 index 563992ef1..000000000 --- a/src/build-runtime.sh.in +++ /dev/null @@ -1,97 +0,0 @@ -#! /bin/bash - -######################## -# build runtime script # -######################## -# -# template to be configured by the CMake build system - -if which clang >/dev/null; then - CC=clang -else - CC=gcc -fi - -STRIP=strip - -set -xe - -build_dir=$(mktemp -d) -orig_cwd=$(pwd) -repo_root="@CMAKE_CURRENT_SOURCE_DIR@" - -# TODO: check whether those options are needed for other tools' build processes -small_FLAGS="-Os -ffunction-sections -fdata-sections" -small_LDFLAGS="-s -Wl,--gc-sections" - -if [ "@APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE@" == "ON" ]; then - small_FLAGS="$SMALL_FLAGS -DENABLE_SETPROCTITLE" - small_LDFLAGS="$SMALL_LDFLAGS" -fi - -cd $repo_root -git_version="@GIT_COMMIT@" - -cleanup() { - [ -d $build_dir ] && rm -r "$build_dir" -} - -trap cleanup EXIT - -cd "$build_dir" - -# Compile runtime but do not link -$CC -DGIT_COMMIT=\"$git_version\" -I"@xz_INCLUDE_DIRS@" -I"@squashfuse_INCLUDE_DIRS@" -I"@PROJECT_SOURCE_DIR@/include" \ - -D_FILE_OFFSET_BITS=64 -g $small_FLAGS -c "$repo_root"/runtime.c - -# Prepare 16 bytes of space for MD5 digest section -printf '\0%.0s' {0..15} > 16_blank_bytes -objcopy --add-section .digest_md5=16_blank_bytes \ - --set-section-flags .digest_md5=noload,readonly runtime.o runtime1.o - -# Prepare 1024 bytes of space for update information section -printf '\0%.0s' {0..1023} > 1024_blank_bytes - -objcopy --add-section .upd_info=1024_blank_bytes \ - --set-section-flags .upd_info=noload,readonly runtime1.o runtime2.o - -objcopy --add-section .sha256_sig=1024_blank_bytes \ - --set-section-flags .sha256_sig=noload,readonly runtime2.o runtime3.o - -# prepare 8192 bytes of space for key section -cat 1024_blank_bytes 1024_blank_bytes 1024_blank_bytes 1024_blank_bytes > 4096_blank_bytes -cat 4096_blank_bytes 4096_blank_bytes > 8192_blank_bytes - -objcopy --add-section .sig_key=8192_blank_bytes \ - --set-section-flags .sig_key=noload,readonly runtime3.o runtime4.o - -# Now statically link against libsquashfuse_ll, libsquashfuse and liblzma -# and embed .upd_info and .sha256_sig sections -# TODO: squashfuse_LIBRARIES is a semicolon separated list of values that has to be split during runtime of this script -squashfuse_libs="@squashfuse_LIBRARIES@" -$CC $small_FLAGS $small_LDFLAGS -o runtime "$repo_root"/elf.c "$repo_root"/notify.c "$repo_root"/getsection.c \ - runtime4.o ${squashfuse_libs//;/ } \ - -Wl,-Bdynamic -lpthread -l"@libzlib_LIBRARIES@" -L"@libzlib_LIBRARY_DIRS@" -Wl,-Bstatic "@xz_LIBRARIES@" -Wl,-Bdynamic -ldl -$STRIP runtime - -# Test if we can read it back -readelf -x .upd_info runtime # hexdump -readelf -p .upd_info runtime || true # string - -# The raw updateinformation data can be read out manually like this: -HEXOFFSET=$(objdump -h runtime | grep .upd_info | awk '{print $6}') -HEXLENGTH=$(objdump -h runtime | grep .upd_info | awk '{print $3}') -dd bs=1 if=runtime skip=$(($(echo 0x$HEXOFFSET)+0)) count=$(($(echo 0x$HEXLENGTH)+0)) | xxd - -# Insert AppImage magic bytes -if [ "@APPIMAGEKIT_EMBED_MAGIC_BYTES@" == "ON" ]; then - printf '\x41\x49\x02' | dd of=runtime bs=1 seek=8 count=3 conv=notrunc -fi - -# Convert runtime into a data object that can be embedded into appimagetool -xxd -i runtime | $CC -c -x c - -o data.o - -# Show header for debugging purposes -xxd runtime | head -n 1 - -cp runtime data.o "$orig_cwd" From a2c6abf6e284c34a4e959e5eb398f550f66a3588 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 14 Jul 2018 00:41:13 +0200 Subject: [PATCH 256/544] Improve documentation --- src/build-runtime.cmake | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index 8137649a1..8ffd9eb29 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -14,27 +14,32 @@ if(APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE) set(runtime_cflags "${runtime_cflags} -DENABLE_SETPROCTITLE") endif() +# objcopy requires actual files for creating new sections to populate the new section +# therefore, we generate 3 suitable files containing blank bytes in the right sizes add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/16_blank_bytes COMMAND printf '\\0%.0s' {0..15} > ${CMAKE_CURRENT_BINARY_DIR}/16_blank_bytes ) - add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes COMMAND printf '\\0%.0s' {0..1023} > ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes ) - add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/8192_blank_bytes COMMAND printf '\\0%.0s' {0..8191} > ${CMAKE_CURRENT_BINARY_DIR}/8192_blank_bytes ) +# compile first raw object (not linked yet) into which the sections will be embedded +# TODO: find out how this .o object can be generated using a normal add_executable call +# that'd allow us to get rid of the -I parameters in runtime_cflags add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.0.o COMMAND ${CMAKE_C_COMPILER} ${runtime_cflags} -c ${CMAKE_CURRENT_SOURCE_DIR}/runtime.c -o runtime.0.o WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) +# embed the sections, one by one +# TODO: find out whether all the sections can be embedded in a single objcopy call add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.1.o COMMAND objcopy --add-section .digest_md5=16_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.0.o runtime.1.o @@ -42,7 +47,6 @@ add_custom_command( DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/16_blank_bytes WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) - add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.2.o COMMAND objcopy --add-section .upd_info=1024_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.1.o runtime.2.o @@ -50,7 +54,6 @@ add_custom_command( DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) - add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.3.o COMMAND objcopy --add-section .sha256_sig=1024_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.2.o runtime.3.o @@ -58,7 +61,6 @@ add_custom_command( DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) - add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o COMMAND objcopy --add-section .sig_key=8192_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.3.o runtime.4.o @@ -67,16 +69,23 @@ add_custom_command( WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) +# add the runtime as a normal executable +# CLion will recognize it as a normal executable, one can simply step into the code add_executable(runtime ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o elf.c notify.c getsection.c) +# CMake gets confused by the .o object, therefore we need to tell it that it shall link everything using the C compiler set_property(TARGET runtime PROPERTY LINKER_LANGUAGE C) target_link_libraries(runtime PRIVATE squashfuse dl xz libzlib pthread) -add_custom_command( - TARGET runtime - POST_BUILD - COMMAND printf '\\x41\\x49\\x02' | dd of=runtime bs=1 seek=8 count=3 conv=notrunc -) +# embed the magic bytes after the runtime's build has finished +if(APPIMAGEKIT_EMBED_MAGIC_BYTES) + add_custom_command( + TARGET runtime + POST_BUILD + COMMAND printf '\\x41\\x49\\x02' | dd of=runtime bs=1 seek=8 count=3 conv=notrunc + ) +endif() +# required for embedding in appimagetool add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime_embed.o COMMAND xxd -i runtime | ${CMAKE_C_COMPILER} -c -x c - -o runtime_embed.o From 55269426aade1342f44bcec3006d188c0020c02d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 14 Jul 2018 00:42:36 +0200 Subject: [PATCH 257/544] Fix argument escaping --- src/build-runtime.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index 8ffd9eb29..6c6fa0774 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -7,7 +7,7 @@ set(APPIMAGEKIT_EMBED_MAGIC_BYTES ON CACHE BOOL "") # mark as advanced so it won't show up in CMake GUIs etc., to prevent users from accidentally using this option mark_as_advanced(APPIMAGEKIT_EMBED_MAGIC_BYTES) -set(runtime_cflags -Os -ffunction-sections -fdata-sections -DGIT_COMMIT=\"${GIT_COMMIT}\" -I${xz_INCLUDE_DIRS} -I${squashfuse_INCLUDE_DIRS} -I${PROJECT_SOURCE_DIR}/include) +set(runtime_cflags -Os -ffunction-sections -fdata-sections -DGIT_COMMIT=\\"${GIT_COMMIT}\\" -I${xz_INCLUDE_DIRS} -I${squashfuse_INCLUDE_DIRS} -I${PROJECT_SOURCE_DIR}/include) set(runtime_ldflags -s -Wl,--gc-sections) if(APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE) From 18c8210a0fa35887a8f325295da730af2a37d421 Mon Sep 17 00:00:00 2001 From: David Hotham Date: Sat, 14 Jul 2018 13:08:53 +0100 Subject: [PATCH 258/544] Reap defunct child process Payload software that calls `wait()` or `waitpid(-1, ...)` may be confused if it is told about a defunct child process from the AppImage runtime. Fixes #812 --- src/runtime.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/runtime.c b/src/runtime.c index d05c8a902..f8217d028 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -561,6 +561,8 @@ main (int argc, char *argv[]) /* Pause until mounted */ read (keepalive_pipe[0], &c, 1); + /* Fuse process has now daemonized, reap our child */ + waitpid(pid, NULL, 0); dir_fd = open (mount_dir, O_RDONLY); if (dir_fd == -1) { From 304a121d9ce9340627e50966e87274f8ed6a0c9b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 16 Jul 2018 16:29:55 +0200 Subject: [PATCH 259/544] Add missing strip call --- src/build-runtime.cmake | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index 6c6fa0774..9d388c908 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -76,6 +76,12 @@ add_executable(runtime ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o elf.c notify.c ge set_property(TARGET runtime PROPERTY LINKER_LANGUAGE C) target_link_libraries(runtime PRIVATE squashfuse dl xz libzlib pthread) +add_custom_command( + TARGET runtime + POST_BUILD + COMMAND ${strip} ${CMAKE_CURRENT_BINARY_DIR}/runtime +) + # embed the magic bytes after the runtime's build has finished if(APPIMAGEKIT_EMBED_MAGIC_BYTES) add_custom_command( From 90ce2b4d34d8239a2579126bf1dc554b33d963a2 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 16 Jul 2018 16:45:13 +0200 Subject: [PATCH 260/544] Fix and improve strip for runtime --- src/build-runtime.cmake | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index 9d388c908..39de862c6 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -76,11 +76,17 @@ add_executable(runtime ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o elf.c notify.c ge set_property(TARGET runtime PROPERTY LINKER_LANGUAGE C) target_link_libraries(runtime PRIVATE squashfuse dl xz libzlib pthread) -add_custom_command( - TARGET runtime - POST_BUILD - COMMAND ${strip} ${CMAKE_CURRENT_BINARY_DIR}/runtime -) +if (CMAKE_BUILD_TYPE MATCHES DEBUG) + message(WARNING "Debug build, not stripping runtime to allow debugging using gdb etc.") +else() + find_program(STRIP strip) + + add_custom_command( + TARGET runtime + POST_BUILD + COMMAND ${STRIP} ${CMAKE_CURRENT_BINARY_DIR}/runtime + ) +endif() # embed the magic bytes after the runtime's build has finished if(APPIMAGEKIT_EMBED_MAGIC_BYTES) From dc0aef24cce4bb076781e5c4ea758bb40ccb3a2f Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 16 Jul 2018 16:48:35 +0200 Subject: [PATCH 261/544] Fix build type comparison --- src/build-runtime.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index 39de862c6..86eb27e47 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -76,7 +76,8 @@ add_executable(runtime ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o elf.c notify.c ge set_property(TARGET runtime PROPERTY LINKER_LANGUAGE C) target_link_libraries(runtime PRIVATE squashfuse dl xz libzlib pthread) -if (CMAKE_BUILD_TYPE MATCHES DEBUG) +string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE_UPPER) +if (BUILD_TYPE_UPPER STREQUAL DEBUG) message(WARNING "Debug build, not stripping runtime to allow debugging using gdb etc.") else() find_program(STRIP strip) From 8d393ac9e10ddd72de392f49a351a6d7933ea5dd Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 16 Jul 2018 18:44:15 +0200 Subject: [PATCH 262/544] Localization support for X-AppImage-Version Fixes #820. --- src/shared.c | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/src/shared.c b/src/shared.c index 06d3435fd..4a5c9ff21 100644 --- a/src/shared.c +++ b/src/shared.c @@ -579,10 +579,43 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag char* appimage_version = g_key_file_get_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, "X-AppImage-Version", NULL); if (appimage_version != NULL) { - // TODO: support for multiple locales - // the following code snippet is prepared for multiple locales, we just need to add all possible locales + // parse desktop files and generate a list of locales representing all localized Name entries // NULL refers to the key without the locale tag - static const gchar* locales[] = {NULL}; + gchar* locales[256] = {NULL}; + gint localesCount = 1; + + { + // create temporary in-memory copy of the keyfile + gsize bufsize; + char* orig_buffer = g_key_file_to_data(key_file_structure, &bufsize, NULL); + + if (orig_buffer == NULL) { + fprintf(stderr, "Failed to create in-memory copy of desktop file\n"); + return false; + } + + // need to keep original reference to buffer to be able to free() it later + char* buffer = orig_buffer; + + // parse line by line + char* line = NULL; + while ((line = strsep(&buffer, "\n")) != NULL) { + if (strncmp(line, "Name[", 5) != 0) + continue; + + // python: s = split(line, "[")[1] + char* s = strsep(&line, "["); + s = strsep(&line, "["); + + // python: locale = split(s, "]")[0] + char* locale = strsep(&s, "]"); + + locales[localesCount++] = locale; + } + + free(orig_buffer); + } + for (int i = 0; i < (sizeof(locales) / sizeof(gchar*)); i++) { const gchar* locale = locales[i]; From 257cb41b0af275e066b1702d28fdb2c6d70ed6fb Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 16 Jul 2018 20:26:07 +0200 Subject: [PATCH 263/544] Fix setproctitle flag --- src/build-runtime.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index 86eb27e47..ead018487 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -11,7 +11,7 @@ set(runtime_cflags -Os -ffunction-sections -fdata-sections -DGIT_COMMIT=\\"${GIT set(runtime_ldflags -s -Wl,--gc-sections) if(APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE) - set(runtime_cflags "${runtime_cflags} -DENABLE_SETPROCTITLE") + set(runtime_cflags ${runtime_cflags} -DENABLE_SETPROCTITLE) endif() # objcopy requires actual files for creating new sections to populate the new section From 68eefe691e3db3e4253b9100ad32a75851a3bdaf Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 16 Jul 2018 20:38:09 +0200 Subject: [PATCH 264/544] Build runtime in C99 mode --- src/build-runtime.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index ead018487..efb4894dc 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -7,7 +7,7 @@ set(APPIMAGEKIT_EMBED_MAGIC_BYTES ON CACHE BOOL "") # mark as advanced so it won't show up in CMake GUIs etc., to prevent users from accidentally using this option mark_as_advanced(APPIMAGEKIT_EMBED_MAGIC_BYTES) -set(runtime_cflags -Os -ffunction-sections -fdata-sections -DGIT_COMMIT=\\"${GIT_COMMIT}\\" -I${xz_INCLUDE_DIRS} -I${squashfuse_INCLUDE_DIRS} -I${PROJECT_SOURCE_DIR}/include) +set(runtime_cflags -std=c99 -Os -ffunction-sections -fdata-sections -DGIT_COMMIT=\\"${GIT_COMMIT}\\" -I${xz_INCLUDE_DIRS} -I${squashfuse_INCLUDE_DIRS} -I${PROJECT_SOURCE_DIR}/include) set(runtime_ldflags -s -Wl,--gc-sections) if(APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE) From 55a22558c7d6617613c02ae45644e7103bf91c14 Mon Sep 17 00:00:00 2001 From: "Jason C. McDonald" Date: Mon, 16 Jul 2018 12:50:43 -0700 Subject: [PATCH 265/544] CSI-commenting AppRun.c --- src/AppRun.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 6 deletions(-) diff --git a/src/AppRun.c b/src/AppRun.c index acd997a60..e602996da 100644 --- a/src/AppRun.c +++ b/src/AppRun.c @@ -33,42 +33,69 @@ THE SOFTWARE. #include #include +/** Macro to throw error and exit. */ #define die(...) \ do { \ fprintf(stderr, "Error: " __VA_ARGS__); \ exit(1); \ } while(0); + +/** Macro to set environmental variables. */ #define SET_NEW_ENV(str,len,fmt,...) \ format = fmt; \ length = strlen(format) + (len); \ char *str = calloc(length, sizeof(char)); \ snprintf(str, length, format, __VA_ARGS__); \ putenv(str); + +/** Macro to return the largest of a pair of numbers */ #define MAX(a,b) (a > b ? a : b) + +/* Redefine the boolean type and its constants to use integers, with n<0 == true. + * FIXME: This is terrible, bad and wrong. Fix it in refactor. + */ #define bool int #define false 0 #define true -1 #define LINE_SIZE 255 +/** Check for a *.desktop file at the given path. + * \param the file path to check + * \return True (1) if the path points to a .desktop file, else false (0). + */ int filter(const struct dirent *dir) { + // Get pointer to file path. char *p = (char*) &dir->d_name; + // Read only the file extension (start reading from last dot in path) p = strrchr(p, '.'); + // Return true if the file extension .desktop is found return p && !strcmp(p, ".desktop"); } int main(int argc, char *argv[]) { + // Get path to the application directory. char *appdir = dirname(realpath("/proc/self/exe", NULL)); + /* If there's a problem accessing the application directory, + * throw fatal error. + */ if (!appdir) die("Could not access /proc/self/exe\n"); + // Check for .desktop files + // The return code for whether we found a .desktop file int ret; + // A pointer to a pointer of a list of file paths. (NOTE: Why?) struct dirent **namelist; + // Scan for .desktop files. ret = scandir(appdir, &namelist, filter, NULL); + // If we found no .desktop files, there's nothing to run. Fatal error. if (ret == 0) { die("No .desktop files found\n"); - } else if(ret == -1) { + } + // If there was an error with scandir(...), we can't go on. Fatal error. + else if(ret == -1) { die("Could not scan directory %s\n", appdir); } @@ -76,29 +103,64 @@ int main(int argc, char *argv[]) { char *desktop_file = calloc(LINE_SIZE, sizeof(char)); snprintf(desktop_file, LINE_SIZE, "%s/%s", appdir, namelist[0]->d_name); FILE *f = fopen(desktop_file, "r"); + // Store the line we're reading. char *line = malloc(LINE_SIZE); + // Skip the `Exec=` prefix on `line`, only looking at the stored value. char *exe = line+5; size_t n = LINE_SIZE; + /* Search each line of our file for the 'Exec=' entry. + * To search, we store the line in `line`, and then check for the + * correct prefix. If it doesn't match, we keep looking. + */ do { + // If we reach the end of the file without finding 'Exec=', fatal error. if (getline(&line, &n, f) == -1) die("Executable not found, make sure there is a line starting with 'Exec='\n"); } while(strncmp(line, "Exec=", 5)); + // We now have the line we need, close the file. fclose(f); - // parse arguments + /* FIXME: We aren't ensuring that 'exe' has a value! + * If the entire line is `Exec=`, attempting to access `exe` will result + * in undefined behavior (wild pointer). + */ + + /* Parse arguments */ + + // Flag if we're within quotation marks. bool in_quotes = 0; + + // Loop through each character in a line. + /* FIXME: This should use a while or do-while, instead of a for with an + * arbitrary character range (LINE_SIZE = 255). This is both inefficient + * and prone to undesired edge-case behavior. + */ for (n = 0; n < LINE_SIZE; n++) { - if (!line[n]) // end of string + // If we've reached the end of the string/line, break out of loop. + if (!line[n]) break; + /* If we encounter a LINE FEED (10) or CARRIAGE RETURN (13)... */ else if (line[n] == 10 || line[n] == 13) { + /* Change the next three characters to NULL CHAR. + * NOTE: Why? + * FIXME: What if [n+1] and/or [n+2] are past the end of the string? + */ line[n] = '\0'; line[n+1] = '\0'; line[n+2] = '\0'; + // Break out of loop. break; - } else if (line[n] == '"') { + } + // If the current character is a quote, invert our `in_quotes` flag. + else if (line[n] == '"') { + // FIXME: This logic doesn't account for escaped quotes (\") in_quotes = !in_quotes; - } else if (line[n] == ' ' && !in_quotes) + } + /* If the current character is a quote, change it to a NULL CHAR. + * NOTE: Why? + */ + else if (line[n] == ' ' && !in_quotes) line[n] = '\0'; } @@ -195,7 +257,7 @@ int main(int argc, char *argv[]) { /* Run */ ret = execvp(exe, outargptrs); - + int error = errno; if (ret == -1) From 7027f719671b3582745406bfe8646b07d48da1bd Mon Sep 17 00:00:00 2001 From: "Jason C. McDonald" Date: Mon, 16 Jul 2018 13:37:00 -0700 Subject: [PATCH 266/544] Adjusted bracketing style back to K&R --- src/AppRun.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/AppRun.c b/src/AppRun.c index e602996da..5cdda7409 100644 --- a/src/AppRun.c +++ b/src/AppRun.c @@ -93,9 +93,9 @@ int main(int argc, char *argv[]) { // If we found no .desktop files, there's nothing to run. Fatal error. if (ret == 0) { die("No .desktop files found\n"); - } + // If there was an error with scandir(...), we can't go on. Fatal error. - else if(ret == -1) { + } else if(ret == -1) { die("Could not scan directory %s\n", appdir); } @@ -138,10 +138,11 @@ int main(int argc, char *argv[]) { */ for (n = 0; n < LINE_SIZE; n++) { // If we've reached the end of the string/line, break out of loop. - if (!line[n]) + if (!line[n]) { break; + /* If we encounter a LINE FEED (10) or CARRIAGE RETURN (13)... */ - else if (line[n] == 10 || line[n] == 13) { + } else if (line[n] == 10 || line[n] == 13) { /* Change the next three characters to NULL CHAR. * NOTE: Why? * FIXME: What if [n+1] and/or [n+2] are past the end of the string? @@ -151,9 +152,9 @@ int main(int argc, char *argv[]) { line[n+2] = '\0'; // Break out of loop. break; - } + // If the current character is a quote, invert our `in_quotes` flag. - else if (line[n] == '"') { + } else if (line[n] == '"') { // FIXME: This logic doesn't account for escaped quotes (\") in_quotes = !in_quotes; } From 852d6282e038bc21e36177a80108e29dfe286e9c Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 17 Jul 2018 00:37:09 +0200 Subject: [PATCH 267/544] Add support for optional TOOLS_PREFIX If a tool with said prefix is found, it is used, otherwise a non-prefixed version will be looked for. --- CMakeLists.txt | 28 ++-------------------------- cmake/tools.cmake | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 26 deletions(-) create mode 100644 cmake/tools.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 3b3a5e2aa..3e4f572b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,32 +65,8 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake) -# first of all, make sure required programs are available -function(check_program name) - string(TOUPPER ${name} name_upper) - find_program(${name_upper} ${name}) - - message(STATUS "Checking for program ${name}") - - if(NOT ${name_upper}) - message(FATAL_ERROR "Could not find required program ${name}.") - endif() - - mark_as_advanced(${name_upper}) -endfunction() - -check_program(aclocal) -check_program(autoheader) -check_program(automake) -check_program(autoreconf) -check_program(libtoolize) -check_program(patch) -check_program(sed) -check_program(wget) -check_program(xxd) -check_program(desktop-file-validate) -# TODO: add checks for remaining commands - +# find paths to tools, incorporating optional TOOLS_PREFIX +include(cmake/tools.cmake) # configure dependencies include(cmake/dependencies.cmake) diff --git a/cmake/tools.cmake b/cmake/tools.cmake new file mode 100644 index 000000000..7cf863ac7 --- /dev/null +++ b/cmake/tools.cmake @@ -0,0 +1,44 @@ +if(TOOLS_PREFIX) + message(STATUS "TOOLS_PREFIX ${TOOLS_PREFIX} detected") +endif() + +# first of all, make sure required programs are available +function(check_program name) + if(TOOLS_PREFIX) + set(prefix ${TOOLS_PREFIX}_) + endif() + + message(STATUS "Checking for program ${name}") + + string(TOUPPER ${name} name_upper) + + if(prefix) + # try prefixed version first + find_program(${name_upper} ${prefix}${name}) + endif() + + # try non-prefixed version + if(NOT ${name_upper}) + find_program(${name_upper} ${name}) + + if(NOT ${name_upper}) + message(FATAL_ERROR "Could not find required program ${name}.") + endif() + endif() + + message(STATUS "Found program ${name}: ${${name_upper}}") + + mark_as_advanced(${name_upper}) +endfunction() + +check_program(aclocal) +check_program(autoheader) +check_program(automake) +check_program(autoreconf) +check_program(libtoolize) +check_program(patch) +check_program(sed) +check_program(wget) +check_program(xxd) +check_program(desktop-file-validate) +# TODO: add checks for remaining commands From 45e5b1ada8e0098e84e22df08e3250e25065f462 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 17 Jul 2018 00:49:59 +0200 Subject: [PATCH 268/544] Use check_program to search for runtime build tools --- cmake/tools.cmake | 4 ++++ src/build-runtime.cmake | 20 +++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/cmake/tools.cmake b/cmake/tools.cmake index 7cf863ac7..d8ac02668 100644 --- a/cmake/tools.cmake +++ b/cmake/tools.cmake @@ -41,4 +41,8 @@ check_program(sed) check_program(wget) check_program(xxd) check_program(desktop-file-validate) +check_program(objcopy) +check_program(objdump) +check_program(readelf) +check_program(strip) # TODO: add checks for remaining commands diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index efb4894dc..f041d0147 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -7,8 +7,12 @@ set(APPIMAGEKIT_EMBED_MAGIC_BYTES ON CACHE BOOL "") # mark as advanced so it won't show up in CMake GUIs etc., to prevent users from accidentally using this option mark_as_advanced(APPIMAGEKIT_EMBED_MAGIC_BYTES) -set(runtime_cflags -std=c99 -Os -ffunction-sections -fdata-sections -DGIT_COMMIT=\\"${GIT_COMMIT}\\" -I${xz_INCLUDE_DIRS} -I${squashfuse_INCLUDE_DIRS} -I${PROJECT_SOURCE_DIR}/include) -set(runtime_ldflags -s -Wl,--gc-sections) +set(runtime_cflags -std=c99 -Os -ffunction-sections -fdata-sections -DGIT_COMMIT=\\"${GIT_COMMIT}\\" -I${squashfuse_INCLUDE_DIRS} -I${PROJECT_SOURCE_DIR}/include ${CMAKE_C_FLAGS}) +set(runtime_ldflags -s -Wl,--gc-sections ${CMAKE_EXE_LINKER_FLAGS}) + +if(NOT xz_INCLUDE_DIRS STREQUAL "") + list(APPEND runtime_cflags -I${xz_INCLUDE_DIRS}) +endif() if(APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE) set(runtime_cflags ${runtime_cflags} -DENABLE_SETPROCTITLE) @@ -42,28 +46,28 @@ add_custom_command( # TODO: find out whether all the sections can be embedded in a single objcopy call add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.1.o - COMMAND objcopy --add-section .digest_md5=16_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.0.o runtime.1.o + COMMAND ${OBJCOPY} --add-section .digest_md5=16_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.0.o runtime.1.o MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/runtime.0.o DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/16_blank_bytes WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.2.o - COMMAND objcopy --add-section .upd_info=1024_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.1.o runtime.2.o + COMMAND ${OBJCOPY} --add-section .upd_info=1024_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.1.o runtime.2.o MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/runtime.1.o DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.3.o - COMMAND objcopy --add-section .sha256_sig=1024_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.2.o runtime.3.o + COMMAND ${OBJCOPY} --add-section .sha256_sig=1024_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.2.o runtime.3.o MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/runtime.2.o DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o - COMMAND objcopy --add-section .sig_key=8192_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.3.o runtime.4.o + COMMAND ${OBJCOPY} --add-section .sig_key=8192_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.3.o runtime.4.o MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/runtime.3.o DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/8192_blank_bytes WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} @@ -80,8 +84,6 @@ string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE_UPPER) if (BUILD_TYPE_UPPER STREQUAL DEBUG) message(WARNING "Debug build, not stripping runtime to allow debugging using gdb etc.") else() - find_program(STRIP strip) - add_custom_command( TARGET runtime POST_BUILD @@ -101,7 +103,7 @@ endif() # required for embedding in appimagetool add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime_embed.o - COMMAND xxd -i runtime | ${CMAKE_C_COMPILER} -c -x c - -o runtime_embed.o + COMMAND ${XXD} -i runtime | ${CMAKE_C_COMPILER} -c -x c - -o runtime_embed.o WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} MAIN_DEPENDENCY runtime ) From b2c8563e82fd89060c645e51a5db2b17a50ac6c4 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 17 Jul 2018 01:10:13 +0200 Subject: [PATCH 269/544] Cross compilation support, mk. 1 --- cmake/dependencies.cmake | 128 +++++++++++++++++--------- cmake/toolchains/i386-linux-gnu.cmake | 20 ++++ cmake/tools.cmake | 1 + 3 files changed, 105 insertions(+), 44 deletions(-) create mode 100644 cmake/toolchains/i386-linux-gnu.cmake diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 5577ead53..61def2a24 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -52,14 +52,37 @@ endfunction() # positional parameters: # - target_name: name of the target that we shall create for you # - pkg_config_target: librar(y name to pass to pkg-config (may include a version) -function(import_pkgconfig_target target_name pkg_config_target) +function(import_pkgconfig_target) + set(keywords STATIC) + set(oneValueArgs TARGET_NAME PKGCONFIG_TARGET) + cmake_parse_arguments(IMPORT_PKGCONFIG_TARGET "${keywords}" "${oneValueArgs}" "" "${ARGN}") + + # check whether parameters have been set + if(NOT IMPORT_PKGCONFIG_TARGET_TARGET_NAME) + message(FATAL_ERROR "TARGET_NAME parameter missing, but is required") + endif() + if(NOT IMPORT_PKGCONFIG_TARGET_PKGCONFIG_TARGET) + message(FATAL_ERROR "PKGCONFIG_TARGET parameter missing, but is required") + endif() + find_package(PkgConfig REQUIRED) - message(STATUS "Importing target ${target_name} via pkg-config (${pkg_config_target})") + set(type "shared") + if(IMPORT_PKGCONFIG_TARGET_STATIC) + set(type "static") + endif() + + message(STATUS "Importing target ${IMPORT_PKGCONFIG_TARGET_TARGET_NAME} via pkg-config (${IMPORT_PKGCONFIG_TARGET_PKGCONFIG_TARGET}, ${type})") - pkg_check_modules(${target_name}-IMPORTED REQUIRED ${pkg_config_target}) + pkg_check_modules(${IMPORT_PKGCONFIG_TARGET_TARGET_NAME}-IMPORTED REQUIRED ${IMPORT_PKGCONFIG_TARGET_PKGCONFIG_TARGET}) - import_library_from_prefix(${target_name} ${target_name}-IMPORTED) + if(IMPORT_PKGCONFIG_TARGET_STATIC) + set(prefix ${IMPORT_PKGCONFIG_TARGET_TARGET_NAME}-IMPORTED_STATIC) + else() + set(prefix ${IMPORT_PKGCONFIG_TARGET_TARGET_NAME}-IMPORTED) + endif() + + import_library_from_prefix(${IMPORT_PKGCONFIG_TARGET_TARGET_NAME} ${prefix}) endfunction() function(import_find_pkg_target target_name pkg_name variable_prefix) @@ -155,13 +178,13 @@ endfunction() # the names of the targets need to differ from the library filenames # this is especially an issue with libcairo, where the library is called libcairo # therefore, all libs imported this way have been prefixed with lib -import_pkgconfig_target(libglib glib-2.0>=2.40) -import_pkgconfig_target(libgobject gobject-2.0>=2.40) -import_pkgconfig_target(libgio gio-2.0>=2.40) -import_pkgconfig_target(libzlib zlib) -import_pkgconfig_target(libcairo cairo) -import_pkgconfig_target(libopenssl openssl) -import_pkgconfig_target(libfuse fuse) +import_pkgconfig_target(TARGET_NAME libglib PKGCONFIG_TARGET glib-2.0>=2.40) +import_pkgconfig_target(TARGET_NAME libgobject PKGCONFIG_TARGET gobject-2.0>=2.40) +import_pkgconfig_target(TARGET_NAME libgio PKGCONFIG_TARGET gio-2.0>=2.40) +import_pkgconfig_target(TARGET_NAME libzlib PKGCONFIG_TARGET zlib) +import_pkgconfig_target(TARGET_NAME libcairo PKGCONFIG_TARGET cairo) +import_pkgconfig_target(TARGET_NAME libopenssl PKGCONFIG_TARGET openssl) +import_pkgconfig_target(TARGET_NAME libfuse PKGCONFIG_TARGET fuse) if(USE_CCACHE) @@ -176,18 +199,26 @@ else() set(CXX "${CMAKE_CXX_COMPILER}") endif() +set(CFLAGS ${CMAKE_C_FLAGS}) +set(CPPFLAGS ${CMAKE_CXX_FLAGS}) +set(LDFLAGS ${CMAKE_EXE_LINKER_FLAGS}) + set(USE_SYSTEM_XZ OFF CACHE BOOL "Use system xz/liblzma instead of building our own") if(NOT USE_SYSTEM_XZ) message(STATUS "Downloading and building xz") + set(xz_CFLAGS CFLAGS="${CFLAGS} -fPIC") + set(xz_CPPFLAGS CPPFLAGS="${CPPFLAGS} -fPIC") + ExternalProject_Add(xz-EXTERNAL URL https://netcologne.dl.sourceforge.net/project/lzmautils/xz-5.2.3.tar.gz URL_HASH SHA512=a5eb4f707cf31579d166a6f95dbac45cf7ea181036d1632b4f123a4072f502f8d57cd6e7d0588f0bf831a07b8fc4065d26589a25c399b95ddcf5f73435163da6 - CONFIGURE_COMMAND CC=${CC} CXX=${CXX} CFLAGS=-fPIC CPPFLAGS=-fPIC /configure --disable-shared --enable-static --prefix= --libdir=/lib - BUILD_COMMAND make - INSTALL_COMMAND make install + CONFIGURE_COMMAND export CC=${CC} CXX=${CXX} ${xz_CFLAGS} ${xz_CPPFLAGS} LDFLAGS=${LDFLAGS} + COMMAND /configure --disable-shared --enable-static --prefix= --libdir=/lib ${EXTRA_CONFIGURE_FLAGS} + BUILD_COMMAND ${MAKE} + INSTALL_COMMAND ${MAKE} install ) import_external_project( @@ -199,7 +230,7 @@ if(NOT USE_SYSTEM_XZ) else() message(STATUS "Using system xz") - import_find_pkg_target(xz LibLZMA LIBLZMA) + import_pkgconfig_target(TARGET_NAME xz PKGCONFIG_TARGET liblzma STATIC) endif() @@ -217,18 +248,18 @@ ExternalProject_Add(squashfuse-EXTERNAL GIT_TAG 1f98030 UPDATE_COMMAND "" # make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time PATCH_COMMAND bash -xe ${CMAKE_CURRENT_BINARY_DIR}/patch-squashfuse.sh - CONFIGURE_COMMAND libtoolize --force + CONFIGURE_COMMAND ${LIBTOOLIZE} --force COMMAND env ACLOCAL_FLAGS="-I /usr/share/aclocal" aclocal - COMMAND autoheader - COMMAND automake --force-missing --add-missing - COMMAND autoreconf -fi || true - COMMAND sed -i "/PKG_CHECK_MODULES.*/,/,:./d" configure # https://github.com/vasi/squashfuse/issues/12 - COMMAND sed -i "s/typedef off_t sqfs_off_t/typedef int64_t sqfs_off_t/g" common.h # off_t's size might differ, see https://stackoverflow.com/a/9073762 - COMMAND CC=${CC} CXX=${CXX} /configure --disable-demo --disable-high-level --without-lzo --without-lz4 --prefix= --libdir=/lib --with-xz=${xz_PREFIX} - COMMAND sed -i "s|XZ_LIBS = -llzma |XZ_LIBS = -Bstatic ${xz_LIBRARIES}/|g" Makefile - BUILD_COMMAND make + COMMAND ${AUTOHEADER} + COMMAND ${AUTOMAKE} --force-missing --add-missing + COMMAND ${AUTORECONF} -fi || true + COMMAND ${SED} -i "/PKG_CHECK_MODULES.*/,/,:./d" configure # https://github.com/vasi/squashfuse/issues/12 + COMMAND ${SED} -i "s/typedef off_t sqfs_off_t/typedef int64_t sqfs_off_t/g" common.h # off_t's size might differ, see https://stackoverflow.com/a/9073762 + COMMAND CC=${CC} CXX=${CXX} CFLAGS=${CFLAGS} LDFLAGS=${LDFLAGS} /configure --disable-demo --disable-high-level --without-lzo --without-lz4 --prefix= --libdir=/lib --with-xz=${xz_PREFIX} ${EXTRA_CONFIGURE_FLAGS} + COMMAND ${SED} -i "s|XZ_LIBS = -llzma |XZ_LIBS = -Bstatic ${xz_LIBRARIES}/|g" Makefile + BUILD_COMMAND ${MAKE} BUILD_IN_SOURCE ON - INSTALL_COMMAND make install + INSTALL_COMMAND ${MAKE} install ) import_external_project( @@ -248,13 +279,13 @@ if(NOT USE_SYSTEM_INOTIFY_TOOLS) ExternalProject_Add(inotify-tools-EXTERNAL URL https://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz URL_HASH SHA512=6074d510e89bba5da0d7c4d86f2562c662868666ba0a7ea5d73e53c010a0050dd1fc01959b22cffdb9b8a35bd1b0b43c04d02d6f19927520f05889e8a9297dfb - PATCH_COMMAND wget -N --content-disposition "https://git.savannah.gnu.org/gitweb/?p=config.git$%3CSEMICOLON%3Ea=blob_plain$%3CSEMICOLON%3Ef=config.guess$%3CSEMICOLON%3Ehb=HEAD" - COMMAND wget -N --content-disposition "https://git.savannah.gnu.org/gitweb/?p=config.git$%3CSEMICOLON%3Ea=blob_plain$%3CSEMICOLON%3Ef=config.sub$%3CSEMICOLON%3Ehb=HEAD" - UPDATE_COMMAND "" # make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time - CONFIGURE_COMMAND CC=${CC} CXX=${CXX} /configure --enable-shared --enable-static --enable-doxygen=no --prefix= --libdir=/lib - BUILD_COMMAND make + PATCH_COMMAND ${WGET} -N --content-disposition "https://git.savannah.gnu.org/gitweb/?p=config.git$%3CSEMICOLON%3Ea=blob_plain$%3CSEMICOLON%3Ef=config.guess$%3CSEMICOLON%3Ehb=HEAD" + COMMAND ${WGET} -N --content-disposition "https://git.savannah.gnu.org/gitweb/?p=config.git$%3CSEMICOLON%3Ea=blob_plain$%3CSEMICOLON%3Ef=config.sub$%3CSEMICOLON%3Ehb=HEAD" + UPDATE_COMMAND "" # ${MAKE} sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time + CONFIGURE_COMMAND CC=${CC} CXX=${CXX} CFLAGS=${CFLAGS} LDFLAGS=${LDFLAGS} /configure --enable-shared --enable-static --enable-doxygen=no --prefix= --libdir=/lib ${EXTRA_CONFIGURE_FLAGS} + BUILD_COMMAND ${MAKE} BUILD_IN_SOURCE ON - INSTALL_COMMAND make install + INSTALL_COMMAND ${MAKE} install ) import_external_project( @@ -275,12 +306,16 @@ set(USE_SYSTEM_LIBARCHIVE OFF CACHE BOOL "Use system libarchive instead of build if(NOT USE_SYSTEM_LIBARCHIVE) message(STATUS "Downloading and building libarchive") + set(libarchive_CFLAGS CFLAGS="${CFLAGS} -fPIC") + set(libarchive_CPPFLAGS CPPFLAGS="${CPPFLAGS} -fPIC") + ExternalProject_Add(libarchive-EXTERNAL URL https://www.libarchive.org/downloads/libarchive-3.3.1.tar.gz URL_HASH SHA512=90702b393b6f0943f42438e277b257af45eee4fa82420431f6a4f5f48bb846f2a72c8ff084dc3ee9c87bdf8b57f4d8dddf7814870fe2604fe86c55d8d744c164 - CONFIGURE_COMMAND CC=${CC} CXX=${CXX} CFLAGS=-fPIC CPPFLAGS=-fPIC /configure --disable-shared --enable-static --disable-bsdtar --disable-bsdcat --disable-bsdcpio --with-zlib --without-bz2lib --without-iconv --without-lz4 --without-lzma --without-lzo2 --without-nettle --without-openssl --without-xml2 --without-expat --prefix= --libdir=/lib - BUILD_COMMAND make - INSTALL_COMMAND make install + CONFIGURE_COMMAND export CC=${CC} CXX=${CXX} CFLAGS=${CFLAGS} ${libarchive_CFLAGS} ${libarchive_CPPFLAGS} LDFLAGS=${LDFLAGS} + COMMAND /configure --disable-shared --enable-static --disable-bsdtar --disable-bsdcat --disable-bsdcpio --with-zlib --without-bz2lib --without-iconv --without-lz4 --without-lzma --without-lzo2 --without-nettle --without-openssl --without-xml2 --without-expat --prefix= --libdir=/lib ${EXTRA_CONFIGURE_FLAGS} + BUILD_COMMAND ${MAKE} + INSTALL_COMMAND ${MAKE} install ) import_external_project( @@ -305,8 +340,8 @@ if(NOT USE_SYSTEM_GTEST) ExternalProject_Add(gtest-EXTERNAL GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG release-1.8.0 - UPDATE_COMMAND "" # make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time - CONFIGURE_COMMAND ${CMAKE_COMMAND} -G${CMAKE_GENERATOR} -DCMAKE_INSTALL_PREFIX= /googletest + UPDATE_COMMAND "" # ${MAKE} sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time + CONFIGURE_COMMAND CC=${CC} CXX=${CXX} CFLAGS=${CFLAGS} CPPFLAGS=${CPPFLAGS} LDFLAGS=${LDFLAGS} ${CMAKE_COMMAND} -G${CMAKE_GENERATOR} -DCMAKE_INSTALL_PREFIX= /googletest ) import_external_project( @@ -324,21 +359,26 @@ endif() # TODO: allow using system wide mksquashfs +set(mksquashfs_cflags "-DXZ_SUPPORT ${CFLAGS}") +if(xz_INCLUDE_DIRS) + set(mksquashfs_cflags "${mksquashfs_cflags} -I${xz_INCLUDE_DIRS}") +endif() + ExternalProject_Add(mksquashfs GIT_REPOSITORY https://github.com/plougher/squashfs-tools/ GIT_TAG 5be5d61 - UPDATE_COMMAND "" # make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time + UPDATE_COMMAND "" # ${MAKE} sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time PATCH_COMMAND patch -N -p1 < ${PROJECT_SOURCE_DIR}/src/mksquashfs-mkfs-fixed-timestamp.patch || true - CONFIGURE_COMMAND sed -i "s|CFLAGS += -DXZ_SUPPORT|CFLAGS += -DXZ_SUPPORT -I${xz_INCLUDE_DIRS}|g" /squashfs-tools/Makefile - COMMAND sed -i "s|LIBS += -llzma|LIBS += -Bstatic ${xz_LIBRARIES}|g" /squashfs-tools/Makefile - COMMAND sed -i "s|install: mksquashfs unsquashfs|install: mksquashfs|g" squashfs-tools/Makefile - COMMAND sed -i "/cp unsquashfs/d" squashfs-tools/Makefile - BUILD_COMMAND CC=${CC} CXX=${CXX} make -C squashfs-tools/ XZ_SUPPORT=1 mksquashfs - # make install unfortunately expects unsquashfs to be built as well, hence can't install the binary + CONFIGURE_COMMAND ${SED} -i "s|CFLAGS += -DXZ_SUPPORT|CFLAGS += ${mksquashfs_cflags}|g" /squashfs-tools/Makefile + COMMAND ${SED} -i "s|LIBS += -llzma|LIBS += -Bstatic -l${xz_LIBRARIES}|g" /squashfs-tools/Makefile + COMMAND ${SED} -i "s|install: mksquashfs unsquashfs|install: mksquashfs|g" squashfs-tools/Makefile + COMMAND ${SED} -i "/cp unsquashfs/d" squashfs-tools/Makefile + BUILD_COMMAND env CC=${CC} CXX=${CXX} LDFLAGS=${LDFLAGS} ${MAKE} -C squashfs-tools/ XZ_SUPPORT=1 mksquashfs + # ${MAKE} install unfortunately expects unsquashfs to be built as well, hence can't install the binary # therefore using built file in SOURCE_DIR # TODO: implement building out of source BUILD_IN_SOURCE ON - INSTALL_COMMAND make -C squashfs-tools/ install INSTALL_DIR= + INSTALL_COMMAND ${MAKE} -C squashfs-tools/ install INSTALL_DIR= ) ExternalProject_Get_Property(mksquashfs INSTALL_DIR) diff --git a/cmake/toolchains/i386-linux-gnu.cmake b/cmake/toolchains/i386-linux-gnu.cmake new file mode 100644 index 000000000..cb80884b1 --- /dev/null +++ b/cmake/toolchains/i386-linux-gnu.cmake @@ -0,0 +1,20 @@ +# this toolchain file works for cross compiling on Ubuntu when the following prerequisites are given: +# - all dependencies that would be needed for a normal build must be installed as i386 versions +# - building XZ/liblzma doesn't work yet, so one has to install liblzma-dev:i386 and set -DUSE_SYSTEM_XZ=ON +# - building GTest doesn't work yet, so one has to install libgtest-dev:i386 and set -DUSE_SYSTEM_GTEST=ON +# some of the packets interfere with their x86_64 version (e.g., libfuse-dev:i386, libglib2-dev:i386), so building on a +# normal system will most likely not work, but on systems like Travis it should work fine + +set(CMAKE_SYSTEM_NAME Linux CACHE STRING "" FORCE) +set(CMAKE_SYSTEM_PROCESSOR i386 CACHE STRING "" FORCE) + +set(CMAKE_C_FLAGS "-m32" CACHE STRING "" FORCE) +set(CMAKE_CXX_FLAGS "-m32" CACHE STRING "" FORCE) + +# CMAKE_SHARED_LINKER_FLAGS, CMAKE_STATIC_LINKER_FLAGS etc. must not be set, but CMAKE_EXE_LINKER_FLAGS is necessary +set(CMAKE_EXE_LINKER_FLAGS "-m32" CACHE STRING "" FORCE) + +# host = target system +# build = build system +# both must be specified +set(EXTRA_CONFIGURE_FLAGS "--host=i686-pc-linux-gnu" "--build=x86_64-pc-linux-gnu" CACHE STRING "" FORCE) diff --git a/cmake/tools.cmake b/cmake/tools.cmake index d8ac02668..ac4580d8e 100644 --- a/cmake/tools.cmake +++ b/cmake/tools.cmake @@ -45,4 +45,5 @@ check_program(objcopy) check_program(objdump) check_program(readelf) check_program(strip) +check_program(make) # TODO: add checks for remaining commands From 0c44a496a8d9d06e976d06d350fb5484ee7991aa Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 17 Jul 2018 02:44:54 +0200 Subject: [PATCH 270/544] Improve toolchain --- cmake/toolchains/i386-linux-gnu.cmake | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cmake/toolchains/i386-linux-gnu.cmake b/cmake/toolchains/i386-linux-gnu.cmake index cb80884b1..48f4f0737 100644 --- a/cmake/toolchains/i386-linux-gnu.cmake +++ b/cmake/toolchains/i386-linux-gnu.cmake @@ -2,6 +2,7 @@ # - all dependencies that would be needed for a normal build must be installed as i386 versions # - building XZ/liblzma doesn't work yet, so one has to install liblzma-dev:i386 and set -DUSE_SYSTEM_XZ=ON # - building GTest doesn't work yet, so one has to install libgtest-dev:i386 and set -DUSE_SYSTEM_GTEST=ON +# - building libarchive doesn't work yet, so one has to install liblzma-dev:i386 and set -DUSE_SYSTEM_LIBARCHIVE=ON (TODO: link system libarchive statically like liblzma) # some of the packets interfere with their x86_64 version (e.g., libfuse-dev:i386, libglib2-dev:i386), so building on a # normal system will most likely not work, but on systems like Travis it should work fine @@ -18,3 +19,9 @@ set(CMAKE_EXE_LINKER_FLAGS "-m32" CACHE STRING "" FORCE) # build = build system # both must be specified set(EXTRA_CONFIGURE_FLAGS "--host=i686-pc-linux-gnu" "--build=x86_64-pc-linux-gnu" CACHE STRING "" FORCE) + +# may help with some rare issues +set(CMAKE_PREFIX_PATH /usr/lib/i386-linux-gnu CACHE STRING "" FORCE) + +# makes sure that at least on Ubuntu pkg-config will search for the :i386 packages +set(ENV{PKG_CONFIG_PATH} /usr/lib/i386-linux-gnu/pkgconfig/ CACHE STRING "" FORCE) From 8c81c74a57baa38cb5e983f57f19a36a91c48cb1 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 17 Jul 2018 16:14:34 +0200 Subject: [PATCH 271/544] Fix usage of CFLAGS --- cmake/dependencies.cmake | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 61def2a24..31f7bcf65 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -209,14 +209,10 @@ set(USE_SYSTEM_XZ OFF CACHE BOOL "Use system xz/liblzma instead of building our if(NOT USE_SYSTEM_XZ) message(STATUS "Downloading and building xz") - set(xz_CFLAGS CFLAGS="${CFLAGS} -fPIC") - set(xz_CPPFLAGS CPPFLAGS="${CPPFLAGS} -fPIC") - ExternalProject_Add(xz-EXTERNAL URL https://netcologne.dl.sourceforge.net/project/lzmautils/xz-5.2.3.tar.gz URL_HASH SHA512=a5eb4f707cf31579d166a6f95dbac45cf7ea181036d1632b4f123a4072f502f8d57cd6e7d0588f0bf831a07b8fc4065d26589a25c399b95ddcf5f73435163da6 - CONFIGURE_COMMAND export CC=${CC} CXX=${CXX} ${xz_CFLAGS} ${xz_CPPFLAGS} LDFLAGS=${LDFLAGS} - COMMAND /configure --disable-shared --enable-static --prefix= --libdir=/lib ${EXTRA_CONFIGURE_FLAGS} + CONFIGURE_COMMAND CC=${CC} CXX=${CXX} CFLAGS=${CFLAGS} CPPFLAGS=${CPPFLAGS} LDFLAGS=${LDFLAGS} /configure --with-pic --disable-shared --enable-static --prefix= --libdir=/lib ${EXTRA_CONFIGURE_FLAGS} BUILD_COMMAND ${MAKE} INSTALL_COMMAND ${MAKE} install ) @@ -306,14 +302,10 @@ set(USE_SYSTEM_LIBARCHIVE OFF CACHE BOOL "Use system libarchive instead of build if(NOT USE_SYSTEM_LIBARCHIVE) message(STATUS "Downloading and building libarchive") - set(libarchive_CFLAGS CFLAGS="${CFLAGS} -fPIC") - set(libarchive_CPPFLAGS CPPFLAGS="${CPPFLAGS} -fPIC") - ExternalProject_Add(libarchive-EXTERNAL URL https://www.libarchive.org/downloads/libarchive-3.3.1.tar.gz URL_HASH SHA512=90702b393b6f0943f42438e277b257af45eee4fa82420431f6a4f5f48bb846f2a72c8ff084dc3ee9c87bdf8b57f4d8dddf7814870fe2604fe86c55d8d744c164 - CONFIGURE_COMMAND export CC=${CC} CXX=${CXX} CFLAGS=${CFLAGS} ${libarchive_CFLAGS} ${libarchive_CPPFLAGS} LDFLAGS=${LDFLAGS} - COMMAND /configure --disable-shared --enable-static --disable-bsdtar --disable-bsdcat --disable-bsdcpio --with-zlib --without-bz2lib --without-iconv --without-lz4 --without-lzma --without-lzo2 --without-nettle --without-openssl --without-xml2 --without-expat --prefix= --libdir=/lib ${EXTRA_CONFIGURE_FLAGS} + CONFIGURE_COMMAND CC=${CC} CXX=${CXX} CFLAGS=${CFLAGS} CPPFLAGS=${CPPFLAGS} LDFLAGS=${LDFLAGS} /configure --with-pic --disable-shared --enable-static --disable-bsdtar --disable-bsdcat --disable-bsdcpio --with-zlib --without-bz2lib --without-iconv --without-lz4 --without-lzma --without-lzo2 --without-nettle --without-openssl --without-xml2 --without-expat --prefix= --libdir=/lib ${EXTRA_CONFIGURE_FLAGS} BUILD_COMMAND ${MAKE} INSTALL_COMMAND ${MAKE} install ) From 94393c271c684a92e4cbbb4b5f757837022dd65b Mon Sep 17 00:00:00 2001 From: "Jason C. McDonald" Date: Tue, 17 Jul 2018 13:40:21 -0700 Subject: [PATCH 272/544] Finished CSI commenting on AppRun.c --- .gitignore | 1 + src/AppRun.c | 80 ++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 70 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index cae76fb40..0aaf2e25d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ build/ cmake-build-*/ .idea/ Testing/ +codealike.json \ No newline at end of file diff --git a/src/AppRun.c b/src/AppRun.c index 5cdda7409..d1b67c4dc 100644 --- a/src/AppRun.c +++ b/src/AppRun.c @@ -135,6 +135,7 @@ int main(int argc, char *argv[]) { /* FIXME: This should use a while or do-while, instead of a for with an * arbitrary character range (LINE_SIZE = 255). This is both inefficient * and prone to undesired edge-case behavior. + * Also, why in the hey aren't we using the `exe` string? */ for (n = 0; n < LINE_SIZE; n++) { // If we've reached the end of the string/line, break out of loop. @@ -158,30 +159,52 @@ int main(int argc, char *argv[]) { // FIXME: This logic doesn't account for escaped quotes (\") in_quotes = !in_quotes; } - /* If the current character is a quote, change it to a NULL CHAR. - * NOTE: Why? + /* If the current character is a space, change it to a NULL CHAR, + * effectively splitting the string into multiple strings. + * This will allow us to iterate through the space-delimited args + * in the upcoming step. */ else if (line[n] == ' ' && !in_quotes) line[n] = '\0'; } - // count arguments + // Create a pointer to each "substring" within `line`. char* arg = exe; + // Counter for the number of arguments found. int argcount = 0; + + /* FIXME: The following seems to only abort the loop on a NULL pointer! + * Possible undefined behavior if `line+1` is a valid (thus wild) pointer. + */ + // Loop through each memory-adjacent string, counting them up. while ((arg += (strlen(arg)+1)) && *arg) argcount += 1; - // merge args + /* Merge the `Exec=` arguments with the `argv` arguments + * from the call to `main()`. + */ + // Store the final list of arguments as an array of C-strings. char* outargptrs[argcount + argc + 1]; + // Store the name of the executable as the first argument. outargptrs[0] = exe; + // Keep track of which argument (index) we're storing. int outargindex = 1; + /* Reset the `arg` pointer to the beginning of the sequence of + * memory-adjacent strings. + */ arg = exe; - int argc_ = argc - 1; // argv[0] is the filename + // Skip the first argument, which is the filename, from the `main()` call. + int argc_ = argc - 1; char** argv_ = argv + 1; + // Iterate through each argument from `Exec()`. + // FIXME: Same possible undefined behavior as earlier. while ((arg += (strlen(arg)+1)) && *arg) { - if (arg[0] == '%' || (arg[0] == '"' && arg[1] == '%')) { // handle desktop file field codes + // If the current argument is a desktop file field code... + if (arg[0] == '%' || (arg[0] == '"' && arg[1] == '%')) { + // Get the actual code after the `%` or `"%` char code = arg[arg[0] == '%' ? 1 : 2]; switch(code) { + // For single file or URL args, merge in one of the `argv` args. case 'f': case 'u': if (argc_ > 0) { @@ -189,6 +212,9 @@ int main(int argc, char *argv[]) { argc_--; } break; + /* For multiple file or URL args, merge in the rest of the + * `argv` args + */ case 'F': case 'U': while (argc_ > 0) { @@ -196,34 +222,49 @@ int main(int argc, char *argv[]) { argc_--; } break; + /* The Icon (i), translated name (c), and desktop file location + * (k) keys are not supported. Throw a non-fatal error. + */ case 'i': case 'c': case 'k': fprintf(stderr, "WARNING: Desktop file field code %%%c is not currently supported\n", code); break; + // Everything else is invalid. Throw a non-fatal error. + // TODO: Properly support deprecated codes (accept but remove) according to spec (???) default: fprintf(stderr, "WARNING: Invalid desktop file field code %%%c\n", code); break; } + + // If the current arg is anything else, just store it as-is. } else { outargptrs[outargindex++] = arg; } } + + // Iterate through and store all of the remaining `argv` arguments. while (argc_ > 0) { outargptrs[outargindex++] = *argv_++; argc_--; } - outargptrs[outargindex] = '\0'; // trailing null argument required by execvp() + // A trailing null argument is required by `execvp()` + outargptrs[outargindex] = '\0'; - // change directory + // Change directory to the application directory we found earlier. + + // Calculate the length of the application directory path string. size_t appdir_s = strlen(appdir); + // Define the path to the ./usr subfolder in the application directory. char *usr_in_appdir = malloc(appdir_s + 5); snprintf(usr_in_appdir, appdir_s + 5, "%s/usr", appdir); + // Attempt to change to the `/usr` directory. ret = chdir(usr_in_appdir); + // If we encounter a problem changing to that directory, throw a fatal error. if (ret != 0) die("Could not cd into %s\n", usr_in_appdir); - // set environment variables + // Append to the environment variables, so the AppImage can run correctly. char *old_env; size_t length; const char *format; @@ -231,39 +272,55 @@ int main(int argc, char *argv[]) { /* https://docs.python.org/2/using/cmdline.html#envvar-PYTHONHOME */ SET_NEW_ENV(new_pythonhome, appdir_s, "PYTHONHOME=%s/usr/", appdir); + // Append the system path. old_env = getenv("PATH") ?: ""; SET_NEW_ENV(new_path, appdir_s*5 + strlen(old_env), "PATH=%s/usr/bin/:%s/usr/sbin/:%s/usr/games/:%s/bin/:%s/sbin/:%s", appdir, appdir, appdir, appdir, appdir, old_env); + // Append the system library path. old_env = getenv("LD_LIBRARY_PATH") ?: ""; SET_NEW_ENV(new_ld_library_path, appdir_s*10 + strlen(old_env), "LD_LIBRARY_PATH=%s/usr/lib/:%s/usr/lib/i386-linux-gnu/:%s/usr/lib/x86_64-linux-gnu/:%s/usr/lib32/:%s/usr/lib64/:%s/lib/:%s/lib/i386-linux-gnu/:%s/lib/x86_64-linux-gnu/:%s/lib32/:%s/lib64/:%s", appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, old_env); + // Append the Python path. old_env = getenv("PYTHONPATH") ?: ""; SET_NEW_ENV(new_pythonpath, appdir_s + strlen(old_env), "PYTHONPATH=%s/usr/share/pyshared/:%s", appdir, old_env); + // Append the XDG path old_env = getenv("XDG_DATA_DIRS") ?: "/usr/local/share/:/usr/share/"; SET_NEW_ENV(new_xdg_data_dirs, appdir_s + strlen(old_env), "XDG_DATA_DIRS=%s/usr/share/:%s", appdir, old_env); + // Append the Perl path old_env = getenv("PERLLIB") ?: ""; SET_NEW_ENV(new_perllib, appdir_s*2 + strlen(old_env), "PERLLIB=%s/usr/share/perl5/:%s/usr/lib/perl5/:%s", appdir, appdir, old_env); + // Append the GSettings Schema path /* http://askubuntu.com/questions/251712/how-can-i-install-a-gsettings-schema-without-root-privileges */ old_env = getenv("GSETTINGS_SCHEMA_DIR") ?: ""; SET_NEW_ENV(new_gsettings_schema_dir, appdir_s + strlen(old_env), "GSETTINGS_SCHEMA_DIR=%s/usr/share/glib-2.0/schemas/:%s", appdir, old_env); + //Append the Qt Path old_env = getenv("QT_PLUGIN_PATH") ?: ""; SET_NEW_ENV(new_qt_plugin_path, appdir_s*10 + strlen(old_env), "QT_PLUGIN_PATH=%s/usr/lib/qt4/plugins/:%s/usr/lib/i386-linux-gnu/qt4/plugins/:%s/usr/lib/x86_64-linux-gnu/qt4/plugins/:%s/usr/lib32/qt4/plugins/:%s/usr/lib64/qt4/plugins/:%s/usr/lib/qt5/plugins/:%s/usr/lib/i386-linux-gnu/qt5/plugins/:%s/usr/lib/x86_64-linux-gnu/qt5/plugins/:%s/usr/lib32/qt5/plugins/:%s/usr/lib64/qt5/plugins/:%s", appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, old_env); - /* Otherwise may get errors because Python cannot write __pycache__ bytecode cache */ + /* We need this, otherwise we may get errors because Python cannot + * write __pycache__ bytecode cache. + */ putenv("PYTHONDONTWRITEBYTECODE=1"); - /* Run */ + /* Execute the program, using the executable name from the .desktop + * file (`exe`) and the final merged array of arguments. + */ ret = execvp(exe, outargptrs); + // Store the last error number; in this case, the one from `execvp(...)`. int error = errno; + /* If `execvp(...)` returned a negative value, throw a fatal error using + * the retrieved error code. + */ if (ret == -1) die("Error executing '%s': %s\n", exe, strerror(error)); + // Deallocate everything we've malloc'd. free(line); free(desktop_file); free(usr_in_appdir); @@ -275,5 +332,6 @@ int main(int argc, char *argv[]) { free(new_perllib); free(new_gsettings_schema_dir); free(new_qt_plugin_path); + return 0; } From e7b8e6b41395c280af24b02095da68dfa1b07cbf Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 18 Jul 2018 16:34:41 +0200 Subject: [PATCH 273/544] Fix linking to liblzma --- cmake/dependencies.cmake | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 31f7bcf65..ad69cdc5e 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -171,6 +171,7 @@ function(import_external_project) # configuration) set(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME}_INCLUDE_DIRS "${IMPORT_EXTERNAL_PROJECT_INCLUDE_DIRS}" CACHE INTERNAL "") set(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME}_LIBRARIES "${IMPORT_EXTERNAL_PROJECT_LIBRARIES}" CACHE INTERNAL "") + set(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME}_LIBRARY_DIRS "${IMPORT_EXTERNAL_PROJECT_LIBRARY_DIRS}" CACHE INTERNAL "") set(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME}_PREFIX ${INSTALL_DIR} CACHE INTERNAL "") endfunction() @@ -220,6 +221,7 @@ if(NOT USE_SYSTEM_XZ) import_external_project( TARGET_NAME xz EXT_PROJECT_NAME xz-EXTERNAL + LIBRARY_DIRS /lib/ LIBRARIES "/lib/liblzma.a" INCLUDE_DIRS "/src/liblzma/api/" ) @@ -352,9 +354,19 @@ endif() # TODO: allow using system wide mksquashfs set(mksquashfs_cflags "-DXZ_SUPPORT ${CFLAGS}") + +if(xz_LIBRARIES MATCHES "\\.a$") + set(mksquashfs_ldflags "${xz_LIBRARIES}") +else() + set(mksquashfs_ldflags "-l${xz_LIBRARIES}") +endif() + if(xz_INCLUDE_DIRS) set(mksquashfs_cflags "${mksquashfs_cflags} -I${xz_INCLUDE_DIRS}") endif() +if(xz_LIBRARY_DIRS) + set(mksquashfs_ldflags "${mksquashfs_ldflags} -L${xz_LIBRARY_DIRS}") +endif() ExternalProject_Add(mksquashfs GIT_REPOSITORY https://github.com/plougher/squashfs-tools/ @@ -362,7 +374,7 @@ ExternalProject_Add(mksquashfs UPDATE_COMMAND "" # ${MAKE} sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time PATCH_COMMAND patch -N -p1 < ${PROJECT_SOURCE_DIR}/src/mksquashfs-mkfs-fixed-timestamp.patch || true CONFIGURE_COMMAND ${SED} -i "s|CFLAGS += -DXZ_SUPPORT|CFLAGS += ${mksquashfs_cflags}|g" /squashfs-tools/Makefile - COMMAND ${SED} -i "s|LIBS += -llzma|LIBS += -Bstatic -l${xz_LIBRARIES}|g" /squashfs-tools/Makefile + COMMAND ${SED} -i "s|LIBS += -llzma|LIBS += -Bstatic ${mksquashfs_ldflags}|g" /squashfs-tools/Makefile COMMAND ${SED} -i "s|install: mksquashfs unsquashfs|install: mksquashfs|g" squashfs-tools/Makefile COMMAND ${SED} -i "/cp unsquashfs/d" squashfs-tools/Makefile BUILD_COMMAND env CC=${CC} CXX=${CXX} LDFLAGS=${LDFLAGS} ${MAKE} -C squashfs-tools/ XZ_SUPPORT=1 mksquashfs From 6f38312dc595ed140ef2e769129832b18c732a93 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 23 Jul 2018 23:08:53 +0200 Subject: [PATCH 274/544] Fix CFLAGS handling CC https://github.com/TheAssassin/AppImageLauncher/issues/60 --- cmake/dependencies.cmake | 6 +++--- cmake/toolchains/i386-linux-gnu.cmake | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index ad69cdc5e..ea133a39a 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -200,9 +200,9 @@ else() set(CXX "${CMAKE_CXX_COMPILER}") endif() -set(CFLAGS ${CMAKE_C_FLAGS}) -set(CPPFLAGS ${CMAKE_CXX_FLAGS}) -set(LDFLAGS ${CMAKE_EXE_LINKER_FLAGS}) +set(CFLAGS ${DEPENDENCIES_CFLAGS}) +set(CPPFLAGS ${DEPENDENCIES_CPPFLAGS}) +set(LDFLAGS ${DEPENDENCIES_LDFLAGS}) set(USE_SYSTEM_XZ OFF CACHE BOOL "Use system xz/liblzma instead of building our own") diff --git a/cmake/toolchains/i386-linux-gnu.cmake b/cmake/toolchains/i386-linux-gnu.cmake index 48f4f0737..dc6c28011 100644 --- a/cmake/toolchains/i386-linux-gnu.cmake +++ b/cmake/toolchains/i386-linux-gnu.cmake @@ -15,6 +15,10 @@ set(CMAKE_CXX_FLAGS "-m32" CACHE STRING "" FORCE) # CMAKE_SHARED_LINKER_FLAGS, CMAKE_STATIC_LINKER_FLAGS etc. must not be set, but CMAKE_EXE_LINKER_FLAGS is necessary set(CMAKE_EXE_LINKER_FLAGS "-m32" CACHE STRING "" FORCE) +set(DEPENDENCIES_CFLAGS "-m32" CACHE STRING "" FORCE) +set(DEPENDENCIES_CPPFLAGS "-m32" CACHE STRING "" FORCE) +set(DEPENDENCIES_LDFLAGS "-m32" CACHE STRING "" FORCE) + # host = target system # build = build system # both must be specified From c1aa0572c9cbbe2b44d94d4559d3724e7c0129eb Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 23 Jul 2018 23:43:37 +0200 Subject: [PATCH 275/544] Fix flags escaping --- cmake/dependencies.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index ea133a39a..4975dbc84 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -200,9 +200,9 @@ else() set(CXX "${CMAKE_CXX_COMPILER}") endif() -set(CFLAGS ${DEPENDENCIES_CFLAGS}) -set(CPPFLAGS ${DEPENDENCIES_CPPFLAGS}) -set(LDFLAGS ${DEPENDENCIES_LDFLAGS}) +set(CFLAGS "${DEPENDENCIES_CFLAGS}") +set(CPPFLAGS "${DEPENDENCIES_CPPFLAGS}") +set(LDFLAGS "${DEPENDENCIES_LDFLAGS}") set(USE_SYSTEM_XZ OFF CACHE BOOL "Use system xz/liblzma instead of building our own") From 5e9edc28e79233009f5c26005a09db22226ef35d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 24 Jul 2018 00:19:26 +0200 Subject: [PATCH 276/544] Fix runtime build --- src/build-runtime.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index f041d0147..7b713aa28 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -7,8 +7,8 @@ set(APPIMAGEKIT_EMBED_MAGIC_BYTES ON CACHE BOOL "") # mark as advanced so it won't show up in CMake GUIs etc., to prevent users from accidentally using this option mark_as_advanced(APPIMAGEKIT_EMBED_MAGIC_BYTES) -set(runtime_cflags -std=c99 -Os -ffunction-sections -fdata-sections -DGIT_COMMIT=\\"${GIT_COMMIT}\\" -I${squashfuse_INCLUDE_DIRS} -I${PROJECT_SOURCE_DIR}/include ${CMAKE_C_FLAGS}) -set(runtime_ldflags -s -Wl,--gc-sections ${CMAKE_EXE_LINKER_FLAGS}) +set(runtime_cflags -std=c99 -Os -ffunction-sections -fdata-sections -DGIT_COMMIT=\\"${GIT_COMMIT}\\" -I${squashfuse_INCLUDE_DIRS} -I${PROJECT_SOURCE_DIR}/include ${DEPENDENCIES_CFLAGS}) +set(runtime_ldflags -s -Wl,--gc-sections ${DEPENDENCIES_LDFLAGS}) if(NOT xz_INCLUDE_DIRS STREQUAL "") list(APPEND runtime_cflags -I${xz_INCLUDE_DIRS}) From 9ea052736d3b5d572c5decb8738425269ba7d753 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 24 Jul 2018 04:06:36 +0200 Subject: [PATCH 277/544] Fix variable handling --- cmake/dependencies.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 4975dbc84..ea133a39a 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -200,9 +200,9 @@ else() set(CXX "${CMAKE_CXX_COMPILER}") endif() -set(CFLAGS "${DEPENDENCIES_CFLAGS}") -set(CPPFLAGS "${DEPENDENCIES_CPPFLAGS}") -set(LDFLAGS "${DEPENDENCIES_LDFLAGS}") +set(CFLAGS ${DEPENDENCIES_CFLAGS}) +set(CPPFLAGS ${DEPENDENCIES_CPPFLAGS}) +set(LDFLAGS ${DEPENDENCIES_LDFLAGS}) set(USE_SYSTEM_XZ OFF CACHE BOOL "Use system xz/liblzma instead of building our own") From 24efefe34066a5ee1f15acc3c9e5102c7fdc1b5f Mon Sep 17 00:00:00 2001 From: "Jason C. McDonald" Date: Mon, 23 Jul 2018 20:22:07 -0700 Subject: [PATCH 278/544] Refactored AppRun.c --- src/AppRun.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/AppRun.c b/src/AppRun.c index d1b67c4dc..583cdd2b5 100644 --- a/src/AppRun.c +++ b/src/AppRun.c @@ -51,7 +51,7 @@ THE SOFTWARE. /** Macro to return the largest of a pair of numbers */ #define MAX(a,b) (a > b ? a : b) -/* Redefine the boolean type and its constants to use integers, with n<0 == true. +/* Define the boolean type and its constants to use integers, with n<0 == true. * FIXME: This is terrible, bad and wrong. Fix it in refactor. */ #define bool int @@ -85,8 +85,8 @@ int main(int argc, char *argv[]) { // Check for .desktop files // The return code for whether we found a .desktop file int ret; - // A pointer to a pointer of a list of file paths. (NOTE: Why?) - struct dirent **namelist; + // An array of pointers to lists of file paths. + struct dirent** namelist; // Scan for .desktop files. ret = scandir(appdir, &namelist, filter, NULL); @@ -269,7 +269,9 @@ int main(int argc, char *argv[]) { size_t length; const char *format; - /* https://docs.python.org/2/using/cmdline.html#envvar-PYTHONHOME */ + /* Append the Python home path. + * https://docs.python.org/2/using/cmdline.html#envvar-PYTHONHOME + */ SET_NEW_ENV(new_pythonhome, appdir_s, "PYTHONHOME=%s/usr/", appdir); // Append the system path. From a6a12dce35728ac783b199c5f658af8a00eddd29 Mon Sep 17 00:00:00 2001 From: "Jason C. McDonald" Date: Mon, 23 Jul 2018 22:05:10 -0700 Subject: [PATCH 279/544] Refactoring (the unsaved changes from before. Oops!) --- src/AppRun.c | 245 ++++++++++++++++++++++++--------------------------- 1 file changed, 117 insertions(+), 128 deletions(-) diff --git a/src/AppRun.c b/src/AppRun.c index 583cdd2b5..c9337d78b 100644 --- a/src/AppRun.c +++ b/src/AppRun.c @@ -25,62 +25,56 @@ THE SOFTWARE. **************************************************************************/ -#include -#include -#include -#include #include -#include -#include - -/** Macro to throw error and exit. */ -#define die(...) \ - do { \ - fprintf(stderr, "Error: " __VA_ARGS__); \ - exit(1); \ - } while(0); - -/** Macro to set environmental variables. */ -#define SET_NEW_ENV(str,len,fmt,...) \ - format = fmt; \ - length = strlen(format) + (len); \ - char *str = calloc(length, sizeof(char)); \ - snprintf(str, length, format, __VA_ARGS__); \ +#include +#include +#include + +/** Macro to set environment variables. */ +#define SET_NEW_ENV(str, len, fmt, ...) \ + format = fmt; \ + length = strlen(format); \ + char* str = calloc(length, sizeof(char)); \ + snprintf(str, length, format, __VA_ARGS__); \ putenv(str); /** Macro to return the largest of a pair of numbers */ -#define MAX(a,b) (a > b ? a : b) - -/* Define the boolean type and its constants to use integers, with n<0 == true. - * FIXME: This is terrible, bad and wrong. Fix it in refactor. - */ -#define bool int -#define false 0 -#define true -1 +#define MAX(a, b) (a > b? a : b) +// TODO: Is this arbitrary? Check and refine. #define LINE_SIZE 255 -/** Check for a *.desktop file at the given path. +/** Throw error and exit. */ +void die(const char * format, ...) { + va_list args; + va_start(args, format); + vprintf(format, args); + va_end(args); + exit(1); +} + +/** Check for a .desktop file at the given path. * \param the file path to check - * \return True (1) if the path points to a .desktop file, else false (0). + * \return true if the path points to a .desktop file, else false. */ -int filter(const struct dirent *dir) { - // Get pointer to file path. - char *p = (char*) &dir->d_name; - // Read only the file extension (start reading from last dot in path) - p = strrchr(p, '.'); - // Return true if the file extension .desktop is found - return p && !strcmp(p, ".desktop"); -} + int filter(const struct dirent* dir) { + // Get pointer to file path. + char* p = (char*) &dir->d_name; + // Read only the file extension (start reading from last dot in path) + p = strrchr(p, '.'); + // Return true if the file extension .desktop is found. + return (p && !strcmp(p, ".desktop")) ? 1 : 0; + } int main(int argc, char *argv[]) { // Get path to the application directory. - char *appdir = dirname(realpath("/proc/self/exe", NULL)); + char* appdir = dirname(realpath("/proc/self/exe", NULL)); /* If there's a problem accessing the application directory, * throw fatal error. */ - if (!appdir) + if (!appdir) { die("Could not access /proc/self/exe\n"); + } // Check for .desktop files // The return code for whether we found a .desktop file @@ -90,118 +84,109 @@ int main(int argc, char *argv[]) { // Scan for .desktop files. ret = scandir(appdir, &namelist, filter, NULL); - // If we found no .desktop files, there's nothing to run. Fatal error. if (ret == 0) { - die("No .desktop files found\n"); - - // If there was an error with scandir(...), we can't go on. Fatal error. + // If we found no .desktop files, there's nothing to run. Fatal error. + die("No .desktop files found.\n"); } else if(ret == -1) { + // If there was an error with scandir(), we can't go on. Fatal error. die("Could not scan directory %s\n", appdir); } - /* Extract executable from .desktop file */ - char *desktop_file = calloc(LINE_SIZE, sizeof(char)); + /* Extract executable from the first (and presumably only) desktop + * file found in the application directory. + */ + char* desktop_file = calloc(LINE_SIZE, sizeof(char)); snprintf(desktop_file, LINE_SIZE, "%s/%s", appdir, namelist[0]->d_name); - FILE *f = fopen(desktop_file, "r"); + // Open the desktop file for reading. + FILE* f = fopen(desktop_file, "r";) // Store the line we're reading. - char *line = malloc(LINE_SIZE); + char* line = malloc(LINE_SIZE); // Skip the `Exec=` prefix on `line`, only looking at the stored value. - char *exe = line+5; - size_t n = LINE_SIZE; + char* exe = line + 5; + size_t n = LINE_SIZE; - /* Search each line of our file for the 'Exec=' entry. + /* Search each line of our file for the `Exec=` entry. * To search, we store the line in `line`, and then check for the * correct prefix. If it doesn't match, we keep looking. */ do { - // If we reach the end of the file without finding 'Exec=', fatal error. - if (getline(&line, &n, f) == -1) - die("Executable not found, make sure there is a line starting with 'Exec='\n"); - } while(strncmp(line, "Exec=", 5)); + // If we reach the end of the file without finding `Exec=`, fatal error. + if (getline(&line, &n, f) == -1) { + die("Executable not found. Make sure there is a line starting with 'Exec='\n"); + } + } while(strncmp(line, "Exec", 5)); // We now have the line we need, close the file. fclose(f); - /* FIXME: We aren't ensuring that 'exe' has a value! - * If the entire line is `Exec=`, attempting to access `exe` will result - * in undefined behavior (wild pointer). + /* If the line we found has nothing more than `Exec=`, it's missing a value. + * This means the .desktop file is malformed. Fatal error. */ - - /* Parse arguments */ + if( strlen(line) <= 5) { + die("Executable not found. Make sure 'Exec=' has a value.\n"); + } // Flag if we're within quotation marks. - bool in_quotes = 0; + bool in_quotes = false; // Loop through each character in a line. - /* FIXME: This should use a while or do-while, instead of a for with an - * arbitrary character range (LINE_SIZE = 255). This is both inefficient - * and prone to undesired edge-case behavior. - * Also, why in the hey aren't we using the `exe` string? - */ - for (n = 0; n < LINE_SIZE; n++) { - // If we've reached the end of the string/line, break out of loop. - if (!line[n]) { - break; - - /* If we encounter a LINE FEED (10) or CARRIAGE RETURN (13)... */ - } else if (line[n] == 10 || line[n] == 13) { - /* Change the next three characters to NULL CHAR. - * NOTE: Why? - * FIXME: What if [n+1] and/or [n+2] are past the end of the string? + int n = 0; + do { + if ((exe[n] == 10 || exe[n] == 13) && exe[n+1] && exe[n+2]) { + /* If we encounter a LINE FEED (10) or CARRIAGE RETURN (13), change + * the next three characters to NULL CHAR. This acts as a sentry + * while parsing through all the substrings later. + * (We also confirm that the next two characters aren't already null.) + */ + exe[n] = '\0'; + exe[n+1] = '\0'; + exe[n+2] = '\0'; + } else if (exe[n] == '"' && exe[n-1] != '\\') { + /* If the current character is a non-escaped quote, toggle whether + * we are parsing inside a string. */ - line[n] = '\0'; - line[n+1] = '\0'; - line[n+2] = '\0'; - // Break out of loop. - break; - - // If the current character is a quote, invert our `in_quotes` flag. - } else if (line[n] == '"') { - // FIXME: This logic doesn't account for escaped quotes (\") in_quotes = !in_quotes; + } else if (line[n] == ' ' && !in_quotes) { + /* If the current character is a space, change it to a NULL CHAR, + * effectively splitting the string into multiple strings. + * This will allow us to iterate through the space-delimited args + * in the upcoming step. + */ + exe[n] = '\0'; } - /* If the current character is a space, change it to a NULL CHAR, - * effectively splitting the string into multiple strings. - * This will allow us to iterate through the space-delimited args - * in the upcoming step. - */ - else if (line[n] == ' ' && !in_quotes) - line[n] = '\0'; - } + } while (exe[++n] != '\0'); // Create a pointer to each "substring" within `line`. - char* arg = exe; + char* arg = exe; // Counter for the number of arguments found. - int argcount = 0; + int argcount = 0; - /* FIXME: The following seems to only abort the loop on a NULL pointer! - * Possible undefined behavior if `line+1` is a valid (thus wild) pointer. - */ // Loop through each memory-adjacent string, counting them up. - while ((arg += (strlen(arg)+1)) && *arg) + while ((arg += (strlen(arg)+1)) && *arg != '\0') { argcount += 1; + } /* Merge the `Exec=` arguments with the `argv` arguments * from the call to `main()`. */ + // Store the final list of arguments as an array of C-strings. - char* outargptrs[argcount + argc + 1]; + char* outargptrs[argcount + argc + 1]; // Store the name of the executable as the first argument. outargptrs[0] = exe; // Keep track of which argument (index) we're storing. - int outargindex = 1; + int outargindex = 1; /* Reset the `arg` pointer to the beginning of the sequence of * memory-adjacent strings. */ - arg = exe; + arg = exe; // Skip the first argument, which is the filename, from the `main()` call. - int argc_ = argc - 1; - char** argv_ = argv + 1; - // Iterate through each argument from `Exec()`. - // FIXME: Same possible undefined behavior as earlier. + int argc_ = argc - 1; + char** argv_ = argv + 1; + // Iterate through each argument from `Exec=`. while ((arg += (strlen(arg)+1)) && *arg) { - // If the current argument is a desktop file field code... + // If the current argument is a desktop file field code. if (arg[0] == '%' || (arg[0] == '"' && arg[1] == '%')) { - // Get the actual code after the `%` or `"%` + // Get the actual code after the `%` or `"5`. char code = arg[arg[0] == '%' ? 1 : 2]; switch(code) { // For single file or URL args, merge in one of the `argv` args. @@ -209,46 +194,48 @@ int main(int argc, char *argv[]) { case 'u': if (argc_ > 0) { outargptrs[outargindex++] = *argv_++; - argc_--; + --argc_; } break; /* For multiple file or URL args, merge in the rest of the - * `argv` args + * `argv` args. */ case 'F': case 'U': while (argc_ > 0) { outargptrs[outargindex++] = *argv_++; - argc_--; + --argc_; } break; /* The Icon (i), translated name (c), and desktop file location - * (k) keys are not supported. Throw a non-fatal error. - */ + * (k) keys are not supported. Throw a non-fatal error. + */ case 'i': case 'c': case 'k': - fprintf(stderr, "WARNING: Desktop file field code %%%c is not currently supported\n", code); + fprintf(stderr, "WARNING: Desktop field field %%%c is not currently supported.\n", code); break; // Everything else is invalid. Throw a non-fatal error. - // TODO: Properly support deprecated codes (accept but remove) according to spec (???) + /* TODO: Properly support deprecated codes (accept but remove) + * according to spec (???) + */ default: - fprintf(stderr, "WARNING: Invalid desktop file field code %%%c\n", code); + fprintf(stderr, "WARNING: Invalid desktop file field code %%%c.\n", code); break; } - - // If the current arg is anything else, just store it as-is. } else { + // If the current arg is anything else, just store it as-is. outargptrs[outargindex++] = arg; } } - // Iterate through and store all of the remaining `argv` arguments. + // Iterate through and store all of the remaining 'argv' arguments. while (argc_ > 0) { outargptrs[outargindex++] = *argv_++; - argc_--; + --argc_; } - // A trailing null argument is required by `execvp()` + + // A trailing null argument is required by `execvp()`. outargptrs[outargindex] = '\0'; // Change directory to the application directory we found earlier. @@ -257,12 +244,13 @@ int main(int argc, char *argv[]) { size_t appdir_s = strlen(appdir); // Define the path to the ./usr subfolder in the application directory. char *usr_in_appdir = malloc(appdir_s + 5); - snprintf(usr_in_appdir, appdir_s + 5, "%s/usr", appdir); + snprintf(usr_in_appdir, appdir_s + 1, "%s/usr", appdir); // Attempt to change to the `/usr` directory. ret = chdir(usr_in_appdir); // If we encounter a problem changing to that directory, throw a fatal error. - if (ret != 0) + if (ret != 0) { die("Could not cd into %s\n", usr_in_appdir); + } // Append to the environment variables, so the AppImage can run correctly. char *old_env; @@ -313,16 +301,17 @@ int main(int argc, char *argv[]) { */ ret = execvp(exe, outargptrs); - // Store the last error number; in this case, the one from `execvp(...)`. + // Store the last error number; in this case, the one from `execvp()`. int error = errno; - /* If `execvp(...)` returned a negative value, throw a fatal error using + /* If `execvp()` returned a negative value, throw a fatal error using * the retrieved error code. */ - if (ret == -1) + if (ret == -1) { die("Error executing '%s': %s\n", exe, strerror(error)); + } - // Deallocate everything we've malloc'd. + // Deallocated everything we've malloc'd. free(line); free(desktop_file); free(usr_in_appdir); @@ -336,4 +325,4 @@ int main(int argc, char *argv[]) { free(new_qt_plugin_path); return 0; -} +} \ No newline at end of file From ec669ba6f942bc92fd825087accade5c808c2f21 Mon Sep 17 00:00:00 2001 From: "Jason C. McDonald" Date: Mon, 23 Jul 2018 22:12:06 -0700 Subject: [PATCH 280/544] Added missing #includes to refectored version; fix typo --- src/AppRun.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/AppRun.c b/src/AppRun.c index c9337d78b..567eb9549 100644 --- a/src/AppRun.c +++ b/src/AppRun.c @@ -26,9 +26,14 @@ THE SOFTWARE. **************************************************************************/ #include +#include +#include #include #include #include +#include +#include +#include /** Macro to set environment variables. */ #define SET_NEW_ENV(str, len, fmt, ...) \ @@ -186,7 +191,7 @@ int main(int argc, char *argv[]) { while ((arg += (strlen(arg)+1)) && *arg) { // If the current argument is a desktop file field code. if (arg[0] == '%' || (arg[0] == '"' && arg[1] == '%')) { - // Get the actual code after the `%` or `"5`. + // Get the actual code after the `%` or `"%`. char code = arg[arg[0] == '%' ? 1 : 2]; switch(code) { // For single file or URL args, merge in one of the `argv` args. @@ -244,7 +249,7 @@ int main(int argc, char *argv[]) { size_t appdir_s = strlen(appdir); // Define the path to the ./usr subfolder in the application directory. char *usr_in_appdir = malloc(appdir_s + 5); - snprintf(usr_in_appdir, appdir_s + 1, "%s/usr", appdir); + snprintf(usr_in_appdir, appdir_s + 5, "%s/usr", appdir); // Attempt to change to the `/usr` directory. ret = chdir(usr_in_appdir); // If we encounter a problem changing to that directory, throw a fatal error. From 8d6ac636ed138d6230b9e018b74940ee9593e7db Mon Sep 17 00:00:00 2001 From: "Jason C. McDonald" Date: Tue, 24 Jul 2018 12:14:41 -0700 Subject: [PATCH 281/544] Improved AppRun.c refactor (address changes) --- .gitignore | 2 +- src/AppRun.c | 80 +++++++++++++++++++++++++++++----------------------- 2 files changed, 46 insertions(+), 36 deletions(-) diff --git a/.gitignore b/.gitignore index 0aaf2e25d..26cbcd8e4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,4 @@ build/ cmake-build-*/ .idea/ Testing/ -codealike.json \ No newline at end of file +codealike.json diff --git a/src/AppRun.c b/src/AppRun.c index 567eb9549..c9b9fc78c 100644 --- a/src/AppRun.c +++ b/src/AppRun.c @@ -35,18 +35,24 @@ THE SOFTWARE. #include #include -/** Macro to set environment variables. */ -#define SET_NEW_ENV(str, len, fmt, ...) \ - format = fmt; \ - length = strlen(format); \ - char* str = calloc(length, sizeof(char)); \ - snprintf(str, length, format, __VA_ARGS__); \ - putenv(str); +/** Macro to set environment variables. + * The do-while(0) is because of http://www.bruceblinn.com/linuxinfo/DoWhile.html + */ +// TODO: Convert this to a regular function later? +#define SET_NEW_ENV(str, len, fmt, ...) \ + do { \ + format = fmt; \ + length = strlen(format); \ + char* str = calloc(length, sizeof(char)); \ + snprintf(str, length, format, __VA_ARGS__); \ + putenv(str); \ + free(str); \ + } while(0); /** Macro to return the largest of a pair of numbers */ -#define MAX(a, b) (a > b? a : b) +#define MAX(a, b) (a > b ? a : b) -// TODO: Is this arbitrary? Check and refine. +// This constant will be used for allocating strings of unknown size. #define LINE_SIZE 255 /** Throw error and exit. */ @@ -91,7 +97,7 @@ int main(int argc, char *argv[]) { if (ret == 0) { // If we found no .desktop files, there's nothing to run. Fatal error. - die("No .desktop files found.\n"); + die("No .desktop files found\n"); } else if(ret == -1) { // If there was an error with scandir(), we can't go on. Fatal error. die("Could not scan directory %s\n", appdir); @@ -103,7 +109,7 @@ int main(int argc, char *argv[]) { char* desktop_file = calloc(LINE_SIZE, sizeof(char)); snprintf(desktop_file, LINE_SIZE, "%s/%s", appdir, namelist[0]->d_name); // Open the desktop file for reading. - FILE* f = fopen(desktop_file, "r";) + FILE* f = fopen(desktop_file, "r"); // Store the line we're reading. char* line = malloc(LINE_SIZE); // Skip the `Exec=` prefix on `line`, only looking at the stored value. @@ -119,44 +125,44 @@ int main(int argc, char *argv[]) { if (getline(&line, &n, f) == -1) { die("Executable not found. Make sure there is a line starting with 'Exec='\n"); } - } while(strncmp(line, "Exec", 5)); + } while(strncmp(line, "Exec=", 5)); // We now have the line we need, close the file. fclose(f); /* If the line we found has nothing more than `Exec=`, it's missing a value. * This means the .desktop file is malformed. Fatal error. */ - if( strlen(line) <= 5) { - die("Executable not found. Make sure 'Exec=' has a value.\n"); + if(strlen(line) <= 5) { + die("Executable not found. Make sure 'Exec=' has a value\n"); } // Flag if we're within quotation marks. bool in_quotes = false; // Loop through each character in a line. - int n = 0; + int ch = 0; do { - if ((exe[n] == 10 || exe[n] == 13) && exe[n+1] && exe[n+2]) { + if ((exe[ch] == 10 || exe[ch] == 13) && exe[ch+1] && exe[ch+2]) { /* If we encounter a LINE FEED (10) or CARRIAGE RETURN (13), change * the next three characters to NULL CHAR. This acts as a sentry * while parsing through all the substrings later. * (We also confirm that the next two characters aren't already null.) */ - exe[n] = '\0'; - exe[n+1] = '\0'; - exe[n+2] = '\0'; - } else if (exe[n] == '"' && exe[n-1] != '\\') { + exe[ch] = '\0'; + exe[ch+1] = '\0'; + exe[ch+2] = '\0'; + } else if (exe[ch] == '"' && exe[ch-1] != '\\') { /* If the current character is a non-escaped quote, toggle whether * we are parsing inside a string. */ in_quotes = !in_quotes; - } else if (line[n] == ' ' && !in_quotes) { + } else if (line[ch] == ' ' && !in_quotes) { /* If the current character is a space, change it to a NULL CHAR, * effectively splitting the string into multiple strings. * This will allow us to iterate through the space-delimited args * in the upcoming step. */ - exe[n] = '\0'; + exe[ch] = '\0'; } } while (exe[++n] != '\0'); @@ -218,14 +224,14 @@ int main(int argc, char *argv[]) { case 'i': case 'c': case 'k': - fprintf(stderr, "WARNING: Desktop field field %%%c is not currently supported.\n", code); + fprintf(stderr, "WARNING: Desktop file field %%%c is not currently supported\n", code); break; // Everything else is invalid. Throw a non-fatal error. /* TODO: Properly support deprecated codes (accept but remove) * according to spec (???) */ default: - fprintf(stderr, "WARNING: Invalid desktop file field code %%%c.\n", code); + fprintf(stderr, "WARNING: Invalid desktop file field code %%%c\n", code); break; } } else { @@ -247,7 +253,7 @@ int main(int argc, char *argv[]) { // Calculate the length of the application directory path string. size_t appdir_s = strlen(appdir); - // Define the path to the ./usr subfolder in the application directory. + // Define the path to the ./usr subdirectory in the application directory. char *usr_in_appdir = malloc(appdir_s + 5); snprintf(usr_in_appdir, appdir_s + 5, "%s/usr", appdir); // Attempt to change to the `/usr` directory. @@ -292,7 +298,7 @@ int main(int argc, char *argv[]) { old_env = getenv("GSETTINGS_SCHEMA_DIR") ?: ""; SET_NEW_ENV(new_gsettings_schema_dir, appdir_s + strlen(old_env), "GSETTINGS_SCHEMA_DIR=%s/usr/share/glib-2.0/schemas/:%s", appdir, old_env); - //Append the Qt Path + //Append the Qt Plugin Path old_env = getenv("QT_PLUGIN_PATH") ?: ""; SET_NEW_ENV(new_qt_plugin_path, appdir_s*10 + strlen(old_env), "QT_PLUGIN_PATH=%s/usr/lib/qt4/plugins/:%s/usr/lib/i386-linux-gnu/qt4/plugins/:%s/usr/lib/x86_64-linux-gnu/qt4/plugins/:%s/usr/lib32/qt4/plugins/:%s/usr/lib64/qt4/plugins/:%s/usr/lib/qt5/plugins/:%s/usr/lib/i386-linux-gnu/qt5/plugins/:%s/usr/lib/x86_64-linux-gnu/qt5/plugins/:%s/usr/lib32/qt5/plugins/:%s/usr/lib64/qt5/plugins/:%s", appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, old_env); @@ -320,14 +326,18 @@ int main(int argc, char *argv[]) { free(line); free(desktop_file); free(usr_in_appdir); - free(new_pythonhome); - free(new_path); - free(new_ld_library_path); - free(new_pythonpath); - free(new_xdg_data_dirs); - free(new_perllib); - free(new_gsettings_schema_dir); - free(new_qt_plugin_path); + + /* NOTE: These are no longer needed, as we free `str` at the end of the + * SET_NEW_ENV() macro. + */ + // free(new_pythonhome); + // free(new_path); + // free(new_ld_library_path); + // free(new_pythonpath); + // free(new_xdg_data_dirs); + // free(new_perllib); + // free(new_gsettings_schema_dir); + // free(new_qt_plugin_path); return 0; -} \ No newline at end of file +} From 1e82c308a64294c33fcb0040d92b06921d05a241 Mon Sep 17 00:00:00 2001 From: "Jason C. McDonald" Date: Tue, 24 Jul 2018 21:57:34 -0700 Subject: [PATCH 282/544] Removed commented-out code. --- src/AppRun.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/AppRun.c b/src/AppRun.c index c9b9fc78c..898a5937b 100644 --- a/src/AppRun.c +++ b/src/AppRun.c @@ -327,17 +327,5 @@ int main(int argc, char *argv[]) { free(desktop_file); free(usr_in_appdir); - /* NOTE: These are no longer needed, as we free `str` at the end of the - * SET_NEW_ENV() macro. - */ - // free(new_pythonhome); - // free(new_path); - // free(new_ld_library_path); - // free(new_pythonpath); - // free(new_xdg_data_dirs); - // free(new_perllib); - // free(new_gsettings_schema_dir); - // free(new_qt_plugin_path); - return 0; } From 3ae8c8c469c1881546be6e4191d932b887b41265 Mon Sep 17 00:00:00 2001 From: Bryce Gibson Date: Wed, 25 Jul 2018 15:26:16 +1000 Subject: [PATCH 283/544] Handle hardlinks during extraction. --- src/runtime.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/runtime.c b/src/runtime.c index f8217d028..4815021b1 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -361,6 +361,7 @@ main (int argc, char *argv[]) char *pattern; char *prefix; char prefixed_path_to_extract[1024]; + char **created_inode; prefix = "squashfs-root/"; @@ -379,6 +380,13 @@ main (int argc, char *argv[]) if ((err = sqfs_open_image(&fs, appimage_path, fs_offset))) exit(1); + created_inode = malloc(fs.sb.inodes * sizeof(char *)); + if(created_inode != NULL) { + memset(created_inode, 0, fs.sb.inodes * sizeof(char *)); + } else { + fprintf(stderr, "Can't track hardlinks.\n"); + } + if ((err = sqfs_traverse_open(&trv, &fs, sqfs_inode_root(&fs)))) die("sqfs_traverse_open error"); while (sqfs_traverse_next(&trv, &err)) { @@ -404,6 +412,16 @@ main (int argc, char *argv[]) } } } else if(inode.base.inode_type == SQUASHFS_REG_TYPE || inode.base.inode_type == SQUASHFS_LREG_TYPE){ + if(created_inode[inode.base.inode_number - 1]) { + unlink(prefixed_path_to_extract); + if(link(created_inode[inode.base.inode_number - 1], prefixed_path_to_extract) == -1) { + fprintf(stderr, "Couldn't create hardlink from \"%s\" to \"%s\": %s\n", prefixed_path_to_extract, created_inode[inode.base.inode_number - 1], strerror(errno)); + // fallthrow and follow the extract logic in the hope that it will work + } else { + continue; + } + } + created_inode[inode.base.inode_number - 1] = strdup(prefixed_path_to_extract); // fprintf(stderr, "Extract to: %s\n", prefixed_path_to_extract); if(private_sqfs_stat(&fs, &inode, &st) != 0) die("private_sqfs_stat error"); From 387b7bb17961984da3ae6b9a6166f926afb28a2b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 26 Jul 2018 13:28:47 +0200 Subject: [PATCH 284/544] Revert "Refactored AppRun.c" --- .gitignore | 1 - src/AppRun.c | 273 +++++++++++++++------------------------------------ 2 files changed, 79 insertions(+), 195 deletions(-) diff --git a/.gitignore b/.gitignore index 26cbcd8e4..cae76fb40 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,3 @@ build/ cmake-build-*/ .idea/ Testing/ -codealike.json diff --git a/src/AppRun.c b/src/AppRun.c index 898a5937b..acd997a60 100644 --- a/src/AppRun.c +++ b/src/AppRun.c @@ -25,307 +25,192 @@ THE SOFTWARE. **************************************************************************/ -#include -#include -#include -#include -#include #include #include -#include #include +#include +#include +#include +#include -/** Macro to set environment variables. - * The do-while(0) is because of http://www.bruceblinn.com/linuxinfo/DoWhile.html - */ -// TODO: Convert this to a regular function later? -#define SET_NEW_ENV(str, len, fmt, ...) \ +#define die(...) \ do { \ - format = fmt; \ - length = strlen(format); \ - char* str = calloc(length, sizeof(char)); \ - snprintf(str, length, format, __VA_ARGS__); \ - putenv(str); \ - free(str); \ + fprintf(stderr, "Error: " __VA_ARGS__); \ + exit(1); \ } while(0); +#define SET_NEW_ENV(str,len,fmt,...) \ + format = fmt; \ + length = strlen(format) + (len); \ + char *str = calloc(length, sizeof(char)); \ + snprintf(str, length, format, __VA_ARGS__); \ + putenv(str); +#define MAX(a,b) (a > b ? a : b) +#define bool int +#define false 0 +#define true -1 -/** Macro to return the largest of a pair of numbers */ -#define MAX(a, b) (a > b ? a : b) - -// This constant will be used for allocating strings of unknown size. #define LINE_SIZE 255 -/** Throw error and exit. */ -void die(const char * format, ...) { - va_list args; - va_start(args, format); - vprintf(format, args); - va_end(args); - exit(1); +int filter(const struct dirent *dir) { + char *p = (char*) &dir->d_name; + p = strrchr(p, '.'); + return p && !strcmp(p, ".desktop"); } -/** Check for a .desktop file at the given path. - * \param the file path to check - * \return true if the path points to a .desktop file, else false. - */ - int filter(const struct dirent* dir) { - // Get pointer to file path. - char* p = (char*) &dir->d_name; - // Read only the file extension (start reading from last dot in path) - p = strrchr(p, '.'); - // Return true if the file extension .desktop is found. - return (p && !strcmp(p, ".desktop")) ? 1 : 0; - } - int main(int argc, char *argv[]) { - // Get path to the application directory. - char* appdir = dirname(realpath("/proc/self/exe", NULL)); - /* If there's a problem accessing the application directory, - * throw fatal error. - */ - if (!appdir) { + char *appdir = dirname(realpath("/proc/self/exe", NULL)); + if (!appdir) die("Could not access /proc/self/exe\n"); - } - // Check for .desktop files - // The return code for whether we found a .desktop file int ret; - // An array of pointers to lists of file paths. - struct dirent** namelist; - // Scan for .desktop files. + struct dirent **namelist; ret = scandir(appdir, &namelist, filter, NULL); if (ret == 0) { - // If we found no .desktop files, there's nothing to run. Fatal error. die("No .desktop files found\n"); } else if(ret == -1) { - // If there was an error with scandir(), we can't go on. Fatal error. die("Could not scan directory %s\n", appdir); } - /* Extract executable from the first (and presumably only) desktop - * file found in the application directory. - */ - char* desktop_file = calloc(LINE_SIZE, sizeof(char)); + /* Extract executable from .desktop file */ + char *desktop_file = calloc(LINE_SIZE, sizeof(char)); snprintf(desktop_file, LINE_SIZE, "%s/%s", appdir, namelist[0]->d_name); - // Open the desktop file for reading. - FILE* f = fopen(desktop_file, "r"); - // Store the line we're reading. - char* line = malloc(LINE_SIZE); - // Skip the `Exec=` prefix on `line`, only looking at the stored value. - char* exe = line + 5; - size_t n = LINE_SIZE; - - /* Search each line of our file for the `Exec=` entry. - * To search, we store the line in `line`, and then check for the - * correct prefix. If it doesn't match, we keep looking. - */ + FILE *f = fopen(desktop_file, "r"); + char *line = malloc(LINE_SIZE); + char *exe = line+5; + size_t n = LINE_SIZE; + do { - // If we reach the end of the file without finding `Exec=`, fatal error. - if (getline(&line, &n, f) == -1) { - die("Executable not found. Make sure there is a line starting with 'Exec='\n"); - } + if (getline(&line, &n, f) == -1) + die("Executable not found, make sure there is a line starting with 'Exec='\n"); } while(strncmp(line, "Exec=", 5)); - // We now have the line we need, close the file. fclose(f); - /* If the line we found has nothing more than `Exec=`, it's missing a value. - * This means the .desktop file is malformed. Fatal error. - */ - if(strlen(line) <= 5) { - die("Executable not found. Make sure 'Exec=' has a value\n"); - } - - // Flag if we're within quotation marks. - bool in_quotes = false; - - // Loop through each character in a line. - int ch = 0; - do { - if ((exe[ch] == 10 || exe[ch] == 13) && exe[ch+1] && exe[ch+2]) { - /* If we encounter a LINE FEED (10) or CARRIAGE RETURN (13), change - * the next three characters to NULL CHAR. This acts as a sentry - * while parsing through all the substrings later. - * (We also confirm that the next two characters aren't already null.) - */ - exe[ch] = '\0'; - exe[ch+1] = '\0'; - exe[ch+2] = '\0'; - } else if (exe[ch] == '"' && exe[ch-1] != '\\') { - /* If the current character is a non-escaped quote, toggle whether - * we are parsing inside a string. - */ + // parse arguments + bool in_quotes = 0; + for (n = 0; n < LINE_SIZE; n++) { + if (!line[n]) // end of string + break; + else if (line[n] == 10 || line[n] == 13) { + line[n] = '\0'; + line[n+1] = '\0'; + line[n+2] = '\0'; + break; + } else if (line[n] == '"') { in_quotes = !in_quotes; - } else if (line[ch] == ' ' && !in_quotes) { - /* If the current character is a space, change it to a NULL CHAR, - * effectively splitting the string into multiple strings. - * This will allow us to iterate through the space-delimited args - * in the upcoming step. - */ - exe[ch] = '\0'; - } - } while (exe[++n] != '\0'); - - // Create a pointer to each "substring" within `line`. - char* arg = exe; - // Counter for the number of arguments found. - int argcount = 0; - - // Loop through each memory-adjacent string, counting them up. - while ((arg += (strlen(arg)+1)) && *arg != '\0') { - argcount += 1; + } else if (line[n] == ' ' && !in_quotes) + line[n] = '\0'; } - /* Merge the `Exec=` arguments with the `argv` arguments - * from the call to `main()`. - */ + // count arguments + char* arg = exe; + int argcount = 0; + while ((arg += (strlen(arg)+1)) && *arg) + argcount += 1; - // Store the final list of arguments as an array of C-strings. - char* outargptrs[argcount + argc + 1]; - // Store the name of the executable as the first argument. + // merge args + char* outargptrs[argcount + argc + 1]; outargptrs[0] = exe; - // Keep track of which argument (index) we're storing. - int outargindex = 1; - /* Reset the `arg` pointer to the beginning of the sequence of - * memory-adjacent strings. - */ - arg = exe; - // Skip the first argument, which is the filename, from the `main()` call. - int argc_ = argc - 1; - char** argv_ = argv + 1; - // Iterate through each argument from `Exec=`. + int outargindex = 1; + arg = exe; + int argc_ = argc - 1; // argv[0] is the filename + char** argv_ = argv + 1; while ((arg += (strlen(arg)+1)) && *arg) { - // If the current argument is a desktop file field code. - if (arg[0] == '%' || (arg[0] == '"' && arg[1] == '%')) { - // Get the actual code after the `%` or `"%`. + if (arg[0] == '%' || (arg[0] == '"' && arg[1] == '%')) { // handle desktop file field codes char code = arg[arg[0] == '%' ? 1 : 2]; switch(code) { - // For single file or URL args, merge in one of the `argv` args. case 'f': case 'u': if (argc_ > 0) { outargptrs[outargindex++] = *argv_++; - --argc_; + argc_--; } break; - /* For multiple file or URL args, merge in the rest of the - * `argv` args. - */ case 'F': case 'U': while (argc_ > 0) { outargptrs[outargindex++] = *argv_++; - --argc_; + argc_--; } break; - /* The Icon (i), translated name (c), and desktop file location - * (k) keys are not supported. Throw a non-fatal error. - */ case 'i': case 'c': case 'k': - fprintf(stderr, "WARNING: Desktop file field %%%c is not currently supported\n", code); + fprintf(stderr, "WARNING: Desktop file field code %%%c is not currently supported\n", code); break; - // Everything else is invalid. Throw a non-fatal error. - /* TODO: Properly support deprecated codes (accept but remove) - * according to spec (???) - */ default: fprintf(stderr, "WARNING: Invalid desktop file field code %%%c\n", code); break; } } else { - // If the current arg is anything else, just store it as-is. outargptrs[outargindex++] = arg; } } - - // Iterate through and store all of the remaining 'argv' arguments. while (argc_ > 0) { outargptrs[outargindex++] = *argv_++; - --argc_; + argc_--; } + outargptrs[outargindex] = '\0'; // trailing null argument required by execvp() - // A trailing null argument is required by `execvp()`. - outargptrs[outargindex] = '\0'; - - // Change directory to the application directory we found earlier. - - // Calculate the length of the application directory path string. + // change directory size_t appdir_s = strlen(appdir); - // Define the path to the ./usr subdirectory in the application directory. char *usr_in_appdir = malloc(appdir_s + 5); snprintf(usr_in_appdir, appdir_s + 5, "%s/usr", appdir); - // Attempt to change to the `/usr` directory. ret = chdir(usr_in_appdir); - // If we encounter a problem changing to that directory, throw a fatal error. - if (ret != 0) { + if (ret != 0) die("Could not cd into %s\n", usr_in_appdir); - } - // Append to the environment variables, so the AppImage can run correctly. + // set environment variables char *old_env; size_t length; const char *format; - /* Append the Python home path. - * https://docs.python.org/2/using/cmdline.html#envvar-PYTHONHOME - */ + /* https://docs.python.org/2/using/cmdline.html#envvar-PYTHONHOME */ SET_NEW_ENV(new_pythonhome, appdir_s, "PYTHONHOME=%s/usr/", appdir); - // Append the system path. old_env = getenv("PATH") ?: ""; SET_NEW_ENV(new_path, appdir_s*5 + strlen(old_env), "PATH=%s/usr/bin/:%s/usr/sbin/:%s/usr/games/:%s/bin/:%s/sbin/:%s", appdir, appdir, appdir, appdir, appdir, old_env); - // Append the system library path. old_env = getenv("LD_LIBRARY_PATH") ?: ""; SET_NEW_ENV(new_ld_library_path, appdir_s*10 + strlen(old_env), "LD_LIBRARY_PATH=%s/usr/lib/:%s/usr/lib/i386-linux-gnu/:%s/usr/lib/x86_64-linux-gnu/:%s/usr/lib32/:%s/usr/lib64/:%s/lib/:%s/lib/i386-linux-gnu/:%s/lib/x86_64-linux-gnu/:%s/lib32/:%s/lib64/:%s", appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, old_env); - // Append the Python path. old_env = getenv("PYTHONPATH") ?: ""; SET_NEW_ENV(new_pythonpath, appdir_s + strlen(old_env), "PYTHONPATH=%s/usr/share/pyshared/:%s", appdir, old_env); - // Append the XDG path old_env = getenv("XDG_DATA_DIRS") ?: "/usr/local/share/:/usr/share/"; SET_NEW_ENV(new_xdg_data_dirs, appdir_s + strlen(old_env), "XDG_DATA_DIRS=%s/usr/share/:%s", appdir, old_env); - // Append the Perl path old_env = getenv("PERLLIB") ?: ""; SET_NEW_ENV(new_perllib, appdir_s*2 + strlen(old_env), "PERLLIB=%s/usr/share/perl5/:%s/usr/lib/perl5/:%s", appdir, appdir, old_env); - // Append the GSettings Schema path /* http://askubuntu.com/questions/251712/how-can-i-install-a-gsettings-schema-without-root-privileges */ old_env = getenv("GSETTINGS_SCHEMA_DIR") ?: ""; SET_NEW_ENV(new_gsettings_schema_dir, appdir_s + strlen(old_env), "GSETTINGS_SCHEMA_DIR=%s/usr/share/glib-2.0/schemas/:%s", appdir, old_env); - //Append the Qt Plugin Path old_env = getenv("QT_PLUGIN_PATH") ?: ""; SET_NEW_ENV(new_qt_plugin_path, appdir_s*10 + strlen(old_env), "QT_PLUGIN_PATH=%s/usr/lib/qt4/plugins/:%s/usr/lib/i386-linux-gnu/qt4/plugins/:%s/usr/lib/x86_64-linux-gnu/qt4/plugins/:%s/usr/lib32/qt4/plugins/:%s/usr/lib64/qt4/plugins/:%s/usr/lib/qt5/plugins/:%s/usr/lib/i386-linux-gnu/qt5/plugins/:%s/usr/lib/x86_64-linux-gnu/qt5/plugins/:%s/usr/lib32/qt5/plugins/:%s/usr/lib64/qt5/plugins/:%s", appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, old_env); - /* We need this, otherwise we may get errors because Python cannot - * write __pycache__ bytecode cache. - */ + /* Otherwise may get errors because Python cannot write __pycache__ bytecode cache */ putenv("PYTHONDONTWRITEBYTECODE=1"); - /* Execute the program, using the executable name from the .desktop - * file (`exe`) and the final merged array of arguments. - */ + /* Run */ ret = execvp(exe, outargptrs); - - // Store the last error number; in this case, the one from `execvp()`. + int error = errno; - /* If `execvp()` returned a negative value, throw a fatal error using - * the retrieved error code. - */ - if (ret == -1) { + if (ret == -1) die("Error executing '%s': %s\n", exe, strerror(error)); - } - // Deallocated everything we've malloc'd. free(line); free(desktop_file); free(usr_in_appdir); - + free(new_pythonhome); + free(new_path); + free(new_ld_library_path); + free(new_pythonpath); + free(new_xdg_data_dirs); + free(new_perllib); + free(new_gsettings_schema_dir); + free(new_qt_plugin_path); return 0; } From adf11822a7d54a33baae80b5b4c59417c6c6f145 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 26 Jul 2018 23:41:24 +0200 Subject: [PATCH 285/544] Fix memleak --- src/shared.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/shared.c b/src/shared.c index 4a5c9ff21..3f8b0ad47 100644 --- a/src/shared.c +++ b/src/shared.c @@ -637,6 +637,7 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag // continue to next key if not set if (old_contents == NULL) { + g_free(old_contents); continue; } From e30303c2bb6bf7a1b034fc57e8c177743bfb8480 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 26 Jul 2018 23:42:52 +0200 Subject: [PATCH 286/544] Fix localized icon names --- src/shared.c | 135 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 92 insertions(+), 43 deletions(-) diff --git a/src/shared.c b/src/shared.c index 3f8b0ad47..0fb569c4c 100644 --- a/src/shared.c +++ b/src/shared.c @@ -578,48 +578,111 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag { char* appimage_version = g_key_file_get_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, "X-AppImage-Version", NULL); - if (appimage_version != NULL) { - // parse desktop files and generate a list of locales representing all localized Name entries - // NULL refers to the key without the locale tag - gchar* locales[256] = {NULL}; - gint localesCount = 1; + // parse desktop files and generate a list of locales representing all localized Name entries + // NULL refers to the key without the locale tag + gchar* locales[256] = {NULL}; + gint localesCount = 1; - { - // create temporary in-memory copy of the keyfile - gsize bufsize; - char* orig_buffer = g_key_file_to_data(key_file_structure, &bufsize, NULL); + { + // create temporary in-memory copy of the keyfile + gsize bufsize; + char* orig_buffer = g_key_file_to_data(key_file_structure, &bufsize, NULL); - if (orig_buffer == NULL) { - fprintf(stderr, "Failed to create in-memory copy of desktop file\n"); - return false; - } + if (orig_buffer == NULL) { + fprintf(stderr, "Failed to create in-memory copy of desktop file\n"); + return false; + } + + // need to keep original reference to buffer to be able to free() it later + char* buffer = orig_buffer; - // need to keep original reference to buffer to be able to free() it later - char* buffer = orig_buffer; + // parse line by line + char* line = NULL; + while ((line = strsep(&buffer, "\n")) != NULL) { + // the only keys for which we're interested in localizations is Name and Icon + if (strncmp(line, "Name[", 5) != 0 && strncmp(line, "Icon[", 5) != 0) + continue; - // parse line by line - char* line = NULL; - while ((line = strsep(&buffer, "\n")) != NULL) { - if (strncmp(line, "Name[", 5) != 0) - continue; + // python: s = split(line, "[")[1] + char* s = strsep(&line, "["); + s = strsep(&line, "["); - // python: s = split(line, "[")[1] - char* s = strsep(&line, "["); - s = strsep(&line, "["); + // python: locale = split(s, "]")[0] + char* locale = strsep(&s, "]"); - // python: locale = split(s, "]")[0] - char* locale = strsep(&s, "]"); + // avoid duplicates in list of locales + bool is_duplicate = false; - locales[localesCount++] = locale; + // unfortunately, the list of locales is not sorted, therefore a linear search is required + // however, this won't have a significant impact on the performance + // start at index 1, first entry is NULL + for (int i = 1; i < localesCount; i++) { + if (strcmp(locale, locales[i]) == 0) { + is_duplicate = true; + break; + } } - free(orig_buffer); + if (is_duplicate) + continue; + + locales[localesCount++] = locale; } + free(orig_buffer); + } + + // iterate over locales, check whether name or icon entries exist, and edit accordingly + for (int i = 0; i < (sizeof(locales) / sizeof(gchar*)); i++) { + const gchar* locale = locales[i]; + + // check for icon entries and add MD5 hash + { + // check whether the key is set at all + gchar* old_contents = NULL; + + // it's a little annoying that the GLib functions don't simply work with NULL as the locale, that'd + // make the following if-else construct unnecessary + if (locale == NULL) { + old_contents = g_key_file_get_string( + key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, NULL + ); + } else { + old_contents = g_key_file_get_locale_string( + key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, locale, NULL + ); + } + + // continue to next key if not set + if (old_contents == NULL) { + g_free(old_contents); + continue; + } + + // copy key's original contents + static const gchar old_key[] = "X-AppImage-Old-Icon"; + + // append AppImage version + gchar *basename = g_path_get_basename(old_contents); + gchar* new_contents = g_strdup_printf("%s_%s_%s", vendorprefix, md5, basename); + g_free(basename); - for (int i = 0; i < (sizeof(locales) / sizeof(gchar*)); i++) { - const gchar* locale = locales[i]; + // see comment for above if-else construct + if (locale == NULL) { + g_key_file_set_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, old_key, old_contents); + g_key_file_set_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, new_contents); + } else { + g_key_file_set_locale_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, old_key, locale, old_contents); + g_key_file_set_locale_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, locale, new_contents); + } + // cleanup + g_free(old_contents); + g_free(new_contents); + } + + // check for name entries and append version suffix + if (appimage_version != NULL) { // check whether the key is set at all gchar* old_contents; @@ -666,20 +729,6 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag g_free(appimage_version); } - gchar *icon_path = g_key_file_get_value(key_file_structure, "Desktop Entry", "Icon", NULL); - gchar *basename = g_path_get_basename(icon_path); - - { - gchar *icon_with_md5 = g_strdup_printf("%s_%s_%s", vendorprefix, md5, basename); - - g_free(basename); - g_free(icon_path); - - g_key_file_set_value(key_file_structure, "Desktop Entry", "Icon", icon_with_md5); - - g_free(icon_with_md5); - } - #ifdef APPIMAGED { gchar *generated_by = g_strdup_printf("Generated by appimaged %s", GIT_COMMIT); From c91936fa279e79926c8b94976a1d63f5ddccdf82 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 26 Jul 2018 23:52:41 +0200 Subject: [PATCH 287/544] Avoid processing non-localized strings more than once NULL values refer to the non-localized version of the keys. By default, the array storing the locales contains only NULL values, and the counter is set to 1. This makes sure that the non-localized string is processed. Now, if the loop runs over the entire array, unless there's localized entries, the non-localized string will be processed more than once. This commit fixes this behavior. --- src/shared.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared.c b/src/shared.c index 0fb569c4c..b7524efc8 100644 --- a/src/shared.c +++ b/src/shared.c @@ -633,7 +633,7 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag } // iterate over locales, check whether name or icon entries exist, and edit accordingly - for (int i = 0; i < (sizeof(locales) / sizeof(gchar*)); i++) { + for (int i = 0; i < localesCount; i++) { const gchar* locale = locales[i]; // check for icon entries and add MD5 hash From 0c981bf5fe3fa27b90e53a4a277b2a9c2b18948d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 27 Jul 2018 00:18:07 +0200 Subject: [PATCH 288/544] Add proper error check --- tests/test_shared.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index 046616df1..b46b85ba1 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -102,6 +102,9 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { map::const_iterator entry = entries.find(key); + if (entry == entries.end()) + FAIL() << "No such entry in desktop file: " << key; + if (key == "Exec" || key == "TryExec") { vector execSplit = splitString(value); EXPECT_GT(execSplit.size(), 0) << "key: " << key; From 9429d37a4a0ffa9cb5a1c9ac8e0541741544d35e Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 27 Jul 2018 00:31:47 +0200 Subject: [PATCH 289/544] Don't waste 100s of MB of RAM --- tests/test_shared.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index b46b85ba1..de0bd23be 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -53,11 +53,19 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { ASSERT_TRUE(originalStrm) << "Failed to open desktop file " << pathToOriginalDesktopFile.str(); ASSERT_TRUE(installedStrm) << "Failed to open desktop file " << pathToInstalledDesktopFile.str(); + originalStrm.seekg(0, ios::end); + unsigned long originalStrmSize = static_cast(originalStrm.tellg()); + originalStrm.seekg(0, ios::beg); + + installedStrm.seekg(0, ios::end); + unsigned long installedStrmSize = static_cast(installedStrm.tellg()); + installedStrm.seekg(0, ios::beg); + // split both files by lines, then convert to key-value list, and check whether all lines from original file // are also available in the installed file // some values modified by write_edited_desktop_file need some extra checks, which can be performed then. - vector originalData(100 * 1024 * 1024); - vector installedData(100 * 1024 * 1024); + vector originalData(originalStrmSize); + vector installedData(installedStrmSize); originalStrm.read(originalData.data(), originalData.size()); installedStrm.read(installedData.data(), originalData.size()); From 736e201a5d0800a447626d1ee4d318ff69de0feb Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 27 Jul 2018 00:57:05 +0200 Subject: [PATCH 290/544] Improve test strings --- tests/test_shared.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index de0bd23be..b39264569 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -38,7 +38,7 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { gboolean success = g_key_file_load_from_data(keyFile, buffer.data(), buffer.size(), G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, NULL); if (success) { - write_edited_desktop_file(keyFile, "testpath", strdup("abc"), 1, strdup("def"), false); + write_edited_desktop_file(keyFile, "testpath", strdup("vendorprefix"), 1, strdup("md5testvalue"), false); } g_key_file_free(keyFile); From b2d03ecd8e94e09fda80165c12fb155f7d2c0e08 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 27 Jul 2018 01:22:13 +0200 Subject: [PATCH 291/544] Don't waste 100 of MB of RAM --- tests/test_shared.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index b39264569..ba16f3ace 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -28,8 +28,12 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { ASSERT_TRUE(ifs) << "Failed to open file: " << pathToOriginalDesktopFile.str(); + ifs.seekg(0, ios::end); + unsigned long bufferSize = static_cast(ifs.tellg()); + ifs.seekg(0, ios::beg); + // should be large enough - vector buffer(100 * 1024 * 1024); + vector buffer(bufferSize); // read in desktop file ifs.read(buffer.data(), buffer.size()); From 7f895dcd06867a48b4356c0a3f8d22ef50bf383b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 27 Jul 2018 01:23:06 +0200 Subject: [PATCH 292/544] Evaluate GLib error --- tests/test_shared.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index ba16f3ace..4069d417f 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -38,8 +38,12 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { // read in desktop file ifs.read(buffer.data(), buffer.size()); + GError* error = NULL; + GKeyFile *keyFile = g_key_file_new(); - gboolean success = g_key_file_load_from_data(keyFile, buffer.data(), buffer.size(), G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, NULL); + gboolean success = g_key_file_load_from_data(keyFile, buffer.data(), buffer.size(), G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &error); + + ASSERT_EQ(error, NULL) << "Error while creating key file from data: " << error->message; if (success) { write_edited_desktop_file(keyFile, "testpath", strdup("vendorprefix"), 1, strdup("md5testvalue"), false); From bbe39104c98cf4c27dc815a209ae8b27214f7376 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 27 Jul 2018 01:24:52 +0200 Subject: [PATCH 293/544] Use ASSERTs instead of EXPECTs EXPECT doesn't work due to installedLines.erase(line) --- tests/test_shared.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index 4069d417f..e0fbc23e5 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -123,21 +123,21 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { if (key == "Exec" || key == "TryExec") { vector execSplit = splitString(value); - EXPECT_GT(execSplit.size(), 0) << "key: " << key; - EXPECT_EQ(execSplit[0], "testpath") << "key: " << key; + ASSERT_GT(execSplit.size(), 0) << "key: " << key; + ASSERT_EQ(execSplit[0], "testpath") << "key: " << key; vector originalExecSplit = splitString((*entry).second); - EXPECT_EQ(execSplit.size(), originalExecSplit.size()) + ASSERT_EQ(execSplit.size(), originalExecSplit.size()) << key << ": " << value << " and " << (*entry).second << " contain different number of parameters"; // the rest of the split parts should be equal for (int i = 1; i < execSplit.size(); i++) { - EXPECT_EQ(execSplit[i], originalExecSplit[i]); + ASSERT_EQ(execSplit[i], originalExecSplit[i]); } } else if (key == "Icon") { - EXPECT_EQ(value, "appimagekit_def_cura-icon"); + ASSERT_EQ(value, "appimagekit_def_cura-icon"); } else { - EXPECT_EQ(value, (*entry).second); + ASSERT_EQ(value, (*entry).second); } installedLines.erase(line); @@ -146,9 +146,9 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { // finally, handle X-AppImage- entries for (vector::iterator line = installedLines.begin(); line != installedLines.end();) { if (stringStartsWith(*line, "X-AppImage-Comment")) { - EXPECT_EQ(*line, "X-AppImage-Comment=Generated by appimaged AppImageKit unit tests"); + ASSERT_EQ(*line, "X-AppImage-Comment=Generated by appimaged AppImageKit unit tests"); } else if (stringStartsWith(*line, "X-AppImage-Identifier")) { - EXPECT_EQ(*line, "X-AppImage-Identifier=def"); + ASSERT_EQ(*line, "X-AppImage-Identifier=def"); } else { line++; continue; From 6d9d5750c69a656a58bfec2ecb00460ca566f2aa Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 27 Jul 2018 01:25:12 +0200 Subject: [PATCH 294/544] Improve unit test --- tests/test_shared.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index e0fbc23e5..ca06e381a 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -45,14 +45,17 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { ASSERT_EQ(error, NULL) << "Error while creating key file from data: " << error->message; + gchar desktop_filename[] = "desktop_filename"; + gchar md5testvalue[] = "md5testvalue"; + if (success) { - write_edited_desktop_file(keyFile, "testpath", strdup("vendorprefix"), 1, strdup("md5testvalue"), false); + write_edited_desktop_file(keyFile, "testpath", desktop_filename, 1, md5testvalue, false); } g_key_file_free(keyFile); stringstream pathToInstalledDesktopFile; - pathToInstalledDesktopFile << tempHome << "/.local/share/applications/appimagekit_def-abc"; + pathToInstalledDesktopFile << tempHome << g_strdup_printf("/.local/share/applications/appimagekit_%s-%s", md5testvalue, desktop_filename); // now, read original and installed desktop file, and compare both ifstream originalStrm(pathToOriginalDesktopFile.str().c_str()); From 10c66e26a8389c8b961d00a46b4dfc1c97fb0473 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 27 Jul 2018 01:26:17 +0200 Subject: [PATCH 295/544] Fix comparison --- tests/test_shared.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index ca06e381a..dc5d717a9 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -138,7 +138,7 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { ASSERT_EQ(execSplit[i], originalExecSplit[i]); } } else if (key == "Icon") { - ASSERT_EQ(value, "appimagekit_def_cura-icon"); + ASSERT_EQ(value, g_strdup_printf("appimagekit_%s_cura-icon", md5testvalue)); } else { ASSERT_EQ(value, (*entry).second); } From de389137651c4b5da3dd2825fbf07044bc58c421 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 27 Jul 2018 02:04:26 +0200 Subject: [PATCH 296/544] Collect locales separately for entry types This is necessary due to some very implicit behavior of the GLib key file parser. The localized functions return a value even if there is no localized version, probably to save one call when you're just interested in getting _some_ value while reading a desktop file. This is of course a bit annoying, as you can't simply check whether a localized entry exists via a NULL check. --- src/shared.c | 135 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 82 insertions(+), 53 deletions(-) diff --git a/src/shared.c b/src/shared.c index b7524efc8..cf5fd5c96 100644 --- a/src/shared.c +++ b/src/shared.c @@ -578,10 +578,14 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag { char* appimage_version = g_key_file_get_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, "X-AppImage-Version", NULL); - // parse desktop files and generate a list of locales representing all localized Name entries + // parse desktop files and generate a list of locales representing all localized Name/Icon entries // NULL refers to the key without the locale tag - gchar* locales[256] = {NULL}; - gint localesCount = 1; + // the locales for both entry types need to be tracked separately due to a limitation in the GLib API, see + // the comment below for more information + gchar* nameLocales[256] = {NULL}; + gchar* iconLocales[256] = {NULL}; + gint nameLocalesCount = 1; + gint iconLocalesCount = 1; { // create temporary in-memory copy of the keyfile @@ -599,8 +603,11 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag // parse line by line char* line = NULL; while ((line = strsep(&buffer, "\n")) != NULL) { + const bool is_name_entry = strncmp(line, "Name[", 5) == 0; + const bool is_icon_entry = strncmp(line, "Icon[", 5) == 0; + // the only keys for which we're interested in localizations is Name and Icon - if (strncmp(line, "Name[", 5) != 0 && strncmp(line, "Icon[", 5) != 0) + if (!(is_name_entry || is_icon_entry)) continue; // python: s = split(line, "[")[1] @@ -610,13 +617,25 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag // python: locale = split(s, "]")[0] char* locale = strsep(&s, "]"); + // create references to the right variables + gchar** locales = NULL; + gint* localesCount = NULL; + + if (is_name_entry) { + locales = nameLocales; + localesCount = &nameLocalesCount; + } else if (is_icon_entry) { + locales = iconLocales; + localesCount = &iconLocalesCount; + } + // avoid duplicates in list of locales bool is_duplicate = false; // unfortunately, the list of locales is not sorted, therefore a linear search is required // however, this won't have a significant impact on the performance // start at index 1, first entry is NULL - for (int i = 1; i < localesCount; i++) { + for (int i = 1; i < *localesCount; i++) { if (strcmp(locale, locales[i]) == 0) { is_duplicate = true; break; @@ -626,63 +645,68 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag if (is_duplicate) continue; - locales[localesCount++] = locale; + locales[(*localesCount)++] = locale; } free(orig_buffer); } // iterate over locales, check whether name or icon entries exist, and edit accordingly - for (int i = 0; i < localesCount; i++) { - const gchar* locale = locales[i]; - - // check for icon entries and add MD5 hash - { - // check whether the key is set at all - gchar* old_contents = NULL; - - // it's a little annoying that the GLib functions don't simply work with NULL as the locale, that'd - // make the following if-else construct unnecessary - if (locale == NULL) { - old_contents = g_key_file_get_string( - key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, NULL - ); - } else { - old_contents = g_key_file_get_locale_string( - key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, locale, NULL - ); - } - - // continue to next key if not set - if (old_contents == NULL) { - g_free(old_contents); - continue; - } + for (int i = 0; i < iconLocalesCount; i++) { + const gchar* locale = iconLocales[i]; + + // check whether the key is set at all + gchar* old_contents = NULL; + + // it's a little annoying that the GLib functions don't simply work with NULL as the locale, that'd + // make the following if-else construct unnecessary + if (locale == NULL) { + old_contents = g_key_file_get_string( + key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, NULL + ); + } else { + // please note that the following call will return a value even if there is no localized version + // probably to save one call when you're just interested in getting _some_ value while reading + // a desktop file + old_contents = g_key_file_get_locale_string( + key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, "XXXXX", NULL + ); + } - // copy key's original contents - static const gchar old_key[] = "X-AppImage-Old-Icon"; + // continue to next key if not set + if (old_contents == NULL) { + g_free(old_contents); + continue; + } - // append AppImage version - gchar *basename = g_path_get_basename(old_contents); - gchar* new_contents = g_strdup_printf("%s_%s_%s", vendorprefix, md5, basename); - g_free(basename); + // copy key's original contents + static const gchar old_key[] = "X-AppImage-Old-Icon"; + + // append AppImage version + gchar* basename = g_path_get_basename(old_contents); + gchar* new_contents = g_strdup_printf("%s_%s_%s", vendorprefix, md5, basename); + g_free(basename); + + // see comment for above if-else construct + if (locale == NULL) { + g_key_file_set_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, old_key, old_contents); + g_key_file_set_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, + new_contents); + } else { + g_key_file_set_locale_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, old_key, locale, old_contents); + g_key_file_set_locale_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, locale, new_contents); + } - // see comment for above if-else construct - if (locale == NULL) { - g_key_file_set_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, old_key, old_contents); - g_key_file_set_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, new_contents); - } else { - g_key_file_set_locale_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, old_key, locale, old_contents); - g_key_file_set_locale_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, locale, new_contents); - } + // cleanup + g_free(old_contents); + g_free(new_contents); + } - // cleanup - g_free(old_contents); - g_free(new_contents); - } + // check for name entries and append version suffix + if (appimage_version != NULL) { + for (int i = 0; i < nameLocalesCount; i++) { + const gchar* locale = nameLocales[i]; - // check for name entries and append version suffix - if (appimage_version != NULL) { // check whether the key is set at all gchar* old_contents; @@ -693,6 +717,9 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, NULL ); } else { + // please note that the following call will return a value even if there is no localized version + // probably to save one call when you're just interested in getting _some_ value while reading + // a desktop file old_contents = g_key_file_get_locale_string( key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, locale, NULL ); @@ -713,10 +740,12 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag // see comment for above if-else construct if (locale == NULL) { g_key_file_set_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, old_key, old_contents); - g_key_file_set_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, new_contents); + g_key_file_set_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, + new_contents); } else { g_key_file_set_locale_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, old_key, locale, old_contents); - g_key_file_set_locale_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, locale, new_contents); + g_key_file_set_locale_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, + G_KEY_FILE_DESKTOP_KEY_NAME, locale, new_contents); } // cleanup From b4eb7548fd22864fe1949980f9d40e05a5a76069 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 27 Jul 2018 02:07:26 +0200 Subject: [PATCH 297/544] Properly initialize vectors --- tests/test_shared.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index dc5d717a9..042b20d82 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -33,7 +33,7 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { ifs.seekg(0, ios::beg); // should be large enough - vector buffer(bufferSize); + vector buffer(bufferSize, '\0'); // read in desktop file ifs.read(buffer.data(), buffer.size()); @@ -75,8 +75,8 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { // split both files by lines, then convert to key-value list, and check whether all lines from original file // are also available in the installed file // some values modified by write_edited_desktop_file need some extra checks, which can be performed then. - vector originalData(originalStrmSize); - vector installedData(installedStrmSize); + vector originalData(originalStrmSize, '\0'); + vector installedData(installedStrmSize, '\0'); originalStrm.read(originalData.data(), originalData.size()); installedStrm.read(installedData.data(), originalData.size()); From 436ad736e9c5de0660009d41211f0c2e27f2d53b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 27 Jul 2018 02:07:48 +0200 Subject: [PATCH 298/544] Use the correct variable --- tests/test_shared.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index 042b20d82..701f76141 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -79,7 +79,7 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { vector installedData(installedStrmSize, '\0'); originalStrm.read(originalData.data(), originalData.size()); - installedStrm.read(installedData.data(), originalData.size()); + installedStrm.read(installedData.data(), installedData.size()); vector originalLines = splitString(originalData.data(), '\n'); vector installedLines = splitString(installedData.data(), '\n'); From d1547ce0161340e73d2c819a5c34c18b3fe3b901 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 27 Jul 2018 02:08:06 +0200 Subject: [PATCH 299/544] Improve error message --- tests/test_shared.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index 701f76141..dc920783b 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -101,7 +101,7 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { // sort original entries into map for (vector::const_iterator line = originalLines.begin(); line != originalLines.end(); line++) { vector lineSplit = splitString(*line, '='); - ASSERT_EQ(lineSplit.size(), 2); + ASSERT_EQ(lineSplit.size(), 2) << "line: " << *line; entries.insert(std::make_pair(lineSplit[0], lineSplit[1])); } From 8b42f4e6521c7b2154e2ebbcbc2901c89c8fb3fb Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 27 Jul 2018 02:09:12 +0200 Subject: [PATCH 300/544] Add space for trailing NULL character --- tests/test_shared.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index dc920783b..a50abc2bc 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -29,7 +29,7 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { ASSERT_TRUE(ifs) << "Failed to open file: " << pathToOriginalDesktopFile.str(); ifs.seekg(0, ios::end); - unsigned long bufferSize = static_cast(ifs.tellg()); + unsigned long bufferSize = static_cast(ifs.tellg() + 1); ifs.seekg(0, ios::beg); // should be large enough @@ -65,11 +65,11 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { ASSERT_TRUE(installedStrm) << "Failed to open desktop file " << pathToInstalledDesktopFile.str(); originalStrm.seekg(0, ios::end); - unsigned long originalStrmSize = static_cast(originalStrm.tellg()); + unsigned long originalStrmSize = static_cast(originalStrm.tellg() + 1); originalStrm.seekg(0, ios::beg); installedStrm.seekg(0, ios::end); - unsigned long installedStrmSize = static_cast(installedStrm.tellg()); + unsigned long installedStrmSize = static_cast(installedStrm.tellg() + 1); installedStrm.seekg(0, ios::beg); // split both files by lines, then convert to key-value list, and check whether all lines from original file From ab660e8d3fd9865f42a107ca0a55f659990d0d6b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 27 Jul 2018 02:10:36 +0200 Subject: [PATCH 301/544] Fix comparison --- tests/test_shared.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index a50abc2bc..a2343af4d 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -151,7 +151,7 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { if (stringStartsWith(*line, "X-AppImage-Comment")) { ASSERT_EQ(*line, "X-AppImage-Comment=Generated by appimaged AppImageKit unit tests"); } else if (stringStartsWith(*line, "X-AppImage-Identifier")) { - ASSERT_EQ(*line, "X-AppImage-Identifier=def"); + ASSERT_EQ(*line, g_strdup_printf("X-AppImage-Identifier=%s", md5testvalue)); } else { line++; continue; From 73b8dc3c3b4a4bb7fd77b838ba291bdd5da0cb8f Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 27 Jul 2018 02:12:00 +0200 Subject: [PATCH 302/544] Ignore X-AppImage-Old-[Name|Icon] entries --- tests/test_shared.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp index a2343af4d..963c2c2da 100644 --- a/tests/test_shared.cpp +++ b/tests/test_shared.cpp @@ -152,6 +152,8 @@ TEST_F(SharedCTest, test_write_desktop_file_exec) { ASSERT_EQ(*line, "X-AppImage-Comment=Generated by appimaged AppImageKit unit tests"); } else if (stringStartsWith(*line, "X-AppImage-Identifier")) { ASSERT_EQ(*line, g_strdup_printf("X-AppImage-Identifier=%s", md5testvalue)); + } else if (stringStartsWith(*line, "X-AppImage-Old-")) { + // skip "old" entries, created by localization support } else { line++; continue; From ef2f0e00fea26f44afa429041e558c056e7316ef Mon Sep 17 00:00:00 2001 From: Bryce Gibson Date: Mon, 30 Jul 2018 07:51:04 +1000 Subject: [PATCH 303/544] Free created_inode. --- src/runtime.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/runtime.c b/src/runtime.c index 4815021b1..f5f8eb53d 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -464,6 +464,10 @@ main (int argc, char *argv[]) } if (err) die("sqfs_traverse_next error"); + for (int i = 0; i < fs.sb.inodes; i++) { + free(created_inode[i]); + } + free(created_inode); sqfs_traverse_close(&trv); sqfs_fd_close(fs.fd); exit(0); From 273311b89ecc55d69945459e657562aae2f095ca Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 30 Jul 2018 21:40:51 +0200 Subject: [PATCH 304/544] Fix localized icon handling CC https://github.com/TheAssassin/AppImageLauncher/issues/62 --- src/shared.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared.c b/src/shared.c index cf5fd5c96..234082ad4 100644 --- a/src/shared.c +++ b/src/shared.c @@ -669,7 +669,7 @@ bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimag // probably to save one call when you're just interested in getting _some_ value while reading // a desktop file old_contents = g_key_file_get_locale_string( - key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, "XXXXX", NULL + key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, locale, NULL ); } From 50c394a7548c39b242956ff430f41367c631cac9 Mon Sep 17 00:00:00 2001 From: Bryce Gibson Date: Thu, 2 Aug 2018 06:51:54 +1000 Subject: [PATCH 305/544] Cleanup. --- src/runtime.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index f5f8eb53d..ad0acf796 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -380,6 +380,7 @@ main (int argc, char *argv[]) if ((err = sqfs_open_image(&fs, appimage_path, fs_offset))) exit(1); + // track duplicate inodes for hardlinks created_inode = malloc(fs.sb.inodes * sizeof(char *)); if(created_inode != NULL) { memset(created_inode, 0, fs.sb.inodes * sizeof(char *)); @@ -412,15 +413,18 @@ main (int argc, char *argv[]) } } } else if(inode.base.inode_type == SQUASHFS_REG_TYPE || inode.base.inode_type == SQUASHFS_LREG_TYPE){ - if(created_inode[inode.base.inode_number - 1]) { + // if we've already created this inode, then this is a hardlink + char* exiting_path_for_inode = created_inode[inode.base.inode_number - 1]; + if(exiting_path_for_inode) { unlink(prefixed_path_to_extract); - if(link(created_inode[inode.base.inode_number - 1], prefixed_path_to_extract) == -1) { - fprintf(stderr, "Couldn't create hardlink from \"%s\" to \"%s\": %s\n", prefixed_path_to_extract, created_inode[inode.base.inode_number - 1], strerror(errno)); + if(link(exiting_path_for_inode, prefixed_path_to_extract) == -1) { + fprintf(stderr, "Couldn't create hardlink from \"%s\" to \"%s\": %s\n", prefixed_path_to_extract, exiting_path_for_inode, strerror(errno)); // fallthrow and follow the extract logic in the hope that it will work } else { continue; } } + // track the path we extract to for this inode, so that we can `link` if this inode is found again created_inode[inode.base.inode_number - 1] = strdup(prefixed_path_to_extract); // fprintf(stderr, "Extract to: %s\n", prefixed_path_to_extract); if(private_sqfs_stat(&fs, &inode, &st) != 0) From 84a231973da1fed78ec783d98df8abdcbbe63bf9 Mon Sep 17 00:00:00 2001 From: Bryce Gibson Date: Thu, 2 Aug 2018 08:29:43 +1000 Subject: [PATCH 306/544] Typo. --- src/runtime.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index ad0acf796..675c859da 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -414,11 +414,11 @@ main (int argc, char *argv[]) } } else if(inode.base.inode_type == SQUASHFS_REG_TYPE || inode.base.inode_type == SQUASHFS_LREG_TYPE){ // if we've already created this inode, then this is a hardlink - char* exiting_path_for_inode = created_inode[inode.base.inode_number - 1]; - if(exiting_path_for_inode) { + char* existing_path_for_inode = created_inode[inode.base.inode_number - 1]; + if(existing_path_for_inode) { unlink(prefixed_path_to_extract); - if(link(exiting_path_for_inode, prefixed_path_to_extract) == -1) { - fprintf(stderr, "Couldn't create hardlink from \"%s\" to \"%s\": %s\n", prefixed_path_to_extract, exiting_path_for_inode, strerror(errno)); + if(link(existing_path_for_inode, prefixed_path_to_extract) == -1) { + fprintf(stderr, "Couldn't create hardlink from \"%s\" to \"%s\": %s\n", prefixed_path_to_extract, existing_path_for_inode, strerror(errno)); // fallthrow and follow the extract logic in the hope that it will work } else { continue; From 14b1f10cc2f8dcd71747ea2a0f3c4ee84740e7d2 Mon Sep 17 00:00:00 2001 From: Bryce Gibson Date: Thu, 2 Aug 2018 12:40:50 +1000 Subject: [PATCH 307/544] Be more explicit. --- src/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index 675c859da..17cb18e84 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -415,7 +415,7 @@ main (int argc, char *argv[]) } else if(inode.base.inode_type == SQUASHFS_REG_TYPE || inode.base.inode_type == SQUASHFS_LREG_TYPE){ // if we've already created this inode, then this is a hardlink char* existing_path_for_inode = created_inode[inode.base.inode_number - 1]; - if(existing_path_for_inode) { + if(existing_path_for_inode != NULL) { unlink(prefixed_path_to_extract); if(link(existing_path_for_inode, prefixed_path_to_extract) == -1) { fprintf(stderr, "Couldn't create hardlink from \"%s\" to \"%s\": %s\n", prefixed_path_to_extract, existing_path_for_inode, strerror(errno)); From ce98321b960913b2467634cc22b6c7261066c28f Mon Sep 17 00:00:00 2001 From: Bryce Gibson Date: Fri, 3 Aug 2018 10:12:32 +1000 Subject: [PATCH 308/544] Exit on malloc fail. --- src/runtime.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index 17cb18e84..7df224f5c 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -385,7 +385,8 @@ main (int argc, char *argv[]) if(created_inode != NULL) { memset(created_inode, 0, fs.sb.inodes * sizeof(char *)); } else { - fprintf(stderr, "Can't track hardlinks.\n"); + fprintf(stderr, "Failed allocating memory to track hardlinks.\n"); + exit(1); } if ((err = sqfs_traverse_open(&trv, &fs, sqfs_inode_root(&fs)))) From 5d13ff2e16c24c6d8a93b1f81d9a599219787082 Mon Sep 17 00:00:00 2001 From: Bryce Gibson Date: Fri, 3 Aug 2018 10:21:47 +1000 Subject: [PATCH 309/544] Fail more loudly. --- src/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index 7df224f5c..d267a53ea 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -420,7 +420,7 @@ main (int argc, char *argv[]) unlink(prefixed_path_to_extract); if(link(existing_path_for_inode, prefixed_path_to_extract) == -1) { fprintf(stderr, "Couldn't create hardlink from \"%s\" to \"%s\": %s\n", prefixed_path_to_extract, existing_path_for_inode, strerror(errno)); - // fallthrow and follow the extract logic in the hope that it will work + exit(EXIT_FAILURE); } else { continue; } From 9f0eeb61f070a6c74d2f9c9e5a114c1396c98097 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 3 Aug 2018 16:56:49 +0200 Subject: [PATCH 310/544] Revert "Bundle file command (quick fix for #590)" --- build-appdir.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/build-appdir.sh b/build-appdir.sh index df727d400..4db942090 100644 --- a/build-appdir.sh +++ b/build-appdir.sh @@ -21,8 +21,6 @@ cp install_prefix/usr/lib/appimagekit/mksquashfs "$APPIMAGETOOL_APPDIR"/usr/lib/ cp $(which desktop-file-validate) "$APPIMAGETOOL_APPDIR"/usr/bin/ cp $(which zsyncmake) "$APPIMAGETOOL_APPDIR"/usr/bin/ -cp -f /usr/bin/file "$APPIMAGETOOL_APPDIR"/usr/bin - cp ../resources/appimagetool.desktop "$APPIMAGETOOL_APPDIR" cp ../resources/appimagetool.svg "$APPIMAGETOOL_APPDIR"/appimagetool.svg ln -s "$APPIMAGETOOL_APPDIR"/appimagetool.svg "$APPIMAGETOOL_APPDIR"/.DirIcon From 62ef45633b4228ce6b0d15de7da28eabef06f632 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 8 Aug 2018 17:57:03 +0200 Subject: [PATCH 311/544] Improve ignores --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index cae76fb40..5fd78af1e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ # Build directory -build/ +*build*/ cmake-build-*/ .idea/ Testing/ From a971367904eadc2a7ca89f6681568d067636d4b6 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 8 Aug 2018 19:07:24 +0200 Subject: [PATCH 312/544] Improve error message --- src/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index d267a53ea..768e831de 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -459,7 +459,7 @@ main (int argc, char *argv[]) unlink(prefixed_path_to_extract); ret = symlink(buf, prefixed_path_to_extract); if (ret != 0) - die("symlink error"); + die("Error: could not create symlink"); } else { fprintf(stderr, "TODO: Implement inode.base.inode_type %i\n", inode.base.inode_type); } From 3f2ab0ca259b3f2a411026fbd98ed34977bbbd6c Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 8 Aug 2018 19:59:34 +0200 Subject: [PATCH 313/544] Rebuild runtime if runtime.c changes --- src/build-runtime.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index 7b713aa28..4034ae0f2 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -37,6 +37,7 @@ add_custom_command( # TODO: find out how this .o object can be generated using a normal add_executable call # that'd allow us to get rid of the -I parameters in runtime_cflags add_custom_command( + MAIN_DEPENDENCY runtime.c OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.0.o COMMAND ${CMAKE_C_COMPILER} ${runtime_cflags} -c ${CMAKE_CURRENT_SOURCE_DIR}/runtime.c -o runtime.0.o WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} From 8b19d4f638a39fc65ffa5150a1e11530dc96e294 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 8 Aug 2018 21:26:30 +0200 Subject: [PATCH 314/544] Build runtime with debug information --- src/build-runtime.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index 4034ae0f2..9da0b8d94 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -7,7 +7,7 @@ set(APPIMAGEKIT_EMBED_MAGIC_BYTES ON CACHE BOOL "") # mark as advanced so it won't show up in CMake GUIs etc., to prevent users from accidentally using this option mark_as_advanced(APPIMAGEKIT_EMBED_MAGIC_BYTES) -set(runtime_cflags -std=c99 -Os -ffunction-sections -fdata-sections -DGIT_COMMIT=\\"${GIT_COMMIT}\\" -I${squashfuse_INCLUDE_DIRS} -I${PROJECT_SOURCE_DIR}/include ${DEPENDENCIES_CFLAGS}) +set(runtime_cflags -std=c99 -g -Os -ffunction-sections -fdata-sections -DGIT_COMMIT=\\"${GIT_COMMIT}\\" -I${squashfuse_INCLUDE_DIRS} -I${PROJECT_SOURCE_DIR}/include ${DEPENDENCIES_CFLAGS}) set(runtime_ldflags -s -Wl,--gc-sections ${DEPENDENCIES_LDFLAGS}) if(NOT xz_INCLUDE_DIRS STREQUAL "") From 858dbea1cfe5ca251edcac8422024f8c1fbebef7 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 8 Aug 2018 22:53:06 +0200 Subject: [PATCH 315/544] Improve runtime build Disable optimizations for debug builds --- src/build-runtime.cmake | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index 9da0b8d94..774121ac7 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -7,9 +7,25 @@ set(APPIMAGEKIT_EMBED_MAGIC_BYTES ON CACHE BOOL "") # mark as advanced so it won't show up in CMake GUIs etc., to prevent users from accidentally using this option mark_as_advanced(APPIMAGEKIT_EMBED_MAGIC_BYTES) -set(runtime_cflags -std=c99 -g -Os -ffunction-sections -fdata-sections -DGIT_COMMIT=\\"${GIT_COMMIT}\\" -I${squashfuse_INCLUDE_DIRS} -I${PROJECT_SOURCE_DIR}/include ${DEPENDENCIES_CFLAGS}) +# check type of current build +string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE_UPPER) +if (BUILD_TYPE_UPPER STREQUAL DEBUG) + set(BUILD_DEBUG TRUE) +else() + set(BUILD_DEBUG FALSE) +endif() + +set(runtime_cflags -std=c99 -ffunction-sections -fdata-sections -DGIT_COMMIT=\\"${GIT_COMMIT}\\" -I${squashfuse_INCLUDE_DIRS} -I${PROJECT_SOURCE_DIR}/include ${DEPENDENCIES_CFLAGS}) set(runtime_ldflags -s -Wl,--gc-sections ${DEPENDENCIES_LDFLAGS}) +if(BUILD_DEBUG) + message(WARNING "Debug build, adding debug information") + set(runtime_cflags -g ${runtime_cflags}) +else() + message(STATUS "Release build, optimizing runtime") + set(runtime_cflags -Os ${runtime_cflags}) +endif() + if(NOT xz_INCLUDE_DIRS STREQUAL "") list(APPEND runtime_cflags -I${xz_INCLUDE_DIRS}) endif() @@ -81,8 +97,7 @@ add_executable(runtime ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o elf.c notify.c ge set_property(TARGET runtime PROPERTY LINKER_LANGUAGE C) target_link_libraries(runtime PRIVATE squashfuse dl xz libzlib pthread) -string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE_UPPER) -if (BUILD_TYPE_UPPER STREQUAL DEBUG) +if(BUILD_DEBUG) message(WARNING "Debug build, not stripping runtime to allow debugging using gdb etc.") else() add_custom_command( From 99b2b665b748249e05a1a5663193d6abb3ffc412 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 8 Aug 2018 23:22:57 +0200 Subject: [PATCH 316/544] Reduce severity of symlink creation errors CC #834. --- src/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index 768e831de..0e151d007 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -459,7 +459,7 @@ main (int argc, char *argv[]) unlink(prefixed_path_to_extract); ret = symlink(buf, prefixed_path_to_extract); if (ret != 0) - die("Error: could not create symlink"); + fprintf(stderr, "WARNING: could not create symlink\n"); } else { fprintf(stderr, "TODO: Implement inode.base.inode_type %i\n", inode.base.inode_type); } From 3647642f573519f5d745afef8af9325d404c7819 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 15 Aug 2018 21:07:22 +0200 Subject: [PATCH 317/544] Fix IDE warnings about missing functions --- src/build-runtime.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index 774121ac7..7dc7b409f 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -96,6 +96,7 @@ add_executable(runtime ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o elf.c notify.c ge # CMake gets confused by the .o object, therefore we need to tell it that it shall link everything using the C compiler set_property(TARGET runtime PROPERTY LINKER_LANGUAGE C) target_link_libraries(runtime PRIVATE squashfuse dl xz libzlib pthread) +target_include_directories(runtime PRIVATE ${PROJECT_SOURCE_DIR}/include) if(BUILD_DEBUG) message(WARNING "Debug build, not stripping runtime to allow debugging using gdb etc.") From ab418905f7201f028b982169a6fe5feca01d75ed Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 16 Aug 2018 13:25:12 +0200 Subject: [PATCH 318/544] Extract extraction code into separate function Also change meaning of optional parameter to override output directory. --- src/runtime.c | 254 +++++++++++++++++++++++++++----------------------- 1 file changed, 135 insertions(+), 119 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 0e151d007..bf3678ebd 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -55,8 +55,6 @@ #include "squashfuse_dlopen.h" #include "appimage/appimage.h" -#include - //#include "notify.c" extern int notify(char *title, char *body, int timeout); struct stat st; @@ -266,9 +264,127 @@ portable_option(const char *arg, const char *appimage_path, const char *name) } } -int -main (int argc, char *argv[]) -{ +bool extract_appimage(const char* const appimage_path, const char* const _prefix) { + sqfs_err err = SQFS_OK; + sqfs_traverse trv; + sqfs fs; + char prefixed_path_to_extract[1024]; + + // local copy we can modify safely + // allocate 1 more byte than we would need so we can add a trailing slash if there is none yet + char* prefix = malloc(strlen(_prefix+2)); + strcpy(prefix, _prefix); + + // sanitize prefix + if (prefix[strlen(prefix)] != '/') + strcat(prefix, "/"); + + if (access(prefix, F_OK) == -1) { + if (mkdir_p(prefix) == -1) { + perror("mkdir_p error"); + exit(EXIT_FAILURE); + } + } + + if ((err = sqfs_open_image(&fs, appimage_path, (size_t) fs_offset))) + die("Failed to open squashfs image"); + + // track duplicate inodes for hardlinks + char** created_inode = malloc(fs.sb.inodes * sizeof(char*)); + if (created_inode != NULL) { + memset(created_inode, 0, fs.sb.inodes * sizeof(char*)); + } else { + die("Failed allocating memory to track hardlinks."); + } + + if ((err = sqfs_traverse_open(&trv, &fs, sqfs_inode_root(&fs)))) + die("sqfs_traverse_open error"); + while (sqfs_traverse_next(&trv, &err)) { + if (!trv.dir_end) { + // fprintf(stderr, "trv.path: %s\n", trv.path); + // fprintf(stderr, "sqfs_inode_id: %lu\n", trv.entry.inode); + sqfs_inode inode; + if (sqfs_inode_get(&fs, &inode, trv.entry.inode)) + die("sqfs_inode_get error"); + // fprintf(stderr, "inode.base.inode_type: %i\n", inode.base.inode_type); + // fprintf(stderr, "inode.xtra.reg.file_size: %lu\n", inode.xtra.reg.file_size); + strcpy(prefixed_path_to_extract, ""); + strcat(strcat(prefixed_path_to_extract, prefix), trv.path); + fprintf(stderr, "%s\n", prefixed_path_to_extract); + if (inode.base.inode_type == SQUASHFS_DIR_TYPE || inode.base.inode_type == SQUASHFS_LDIR_TYPE) { + // fprintf(stderr, "inode.xtra.dir.parent_inode: %ui\n", inode.xtra.dir.parent_inode); + // fprintf(stderr, "mkdir_p: %s/\n", prefixed_path_to_extract); + if (access(prefixed_path_to_extract, F_OK) == -1) { + if (mkdir_p(prefixed_path_to_extract) == -1) { + perror("mkdir_p error"); + exit(EXIT_FAILURE); + } + } + } else if (inode.base.inode_type == SQUASHFS_REG_TYPE || inode.base.inode_type == SQUASHFS_LREG_TYPE) { + // if we've already created this inode, then this is a hardlink + char* existing_path_for_inode = created_inode[inode.base.inode_number - 1]; + if (existing_path_for_inode != NULL) { + unlink(prefixed_path_to_extract); + if (link(existing_path_for_inode, prefixed_path_to_extract) == -1) { + fprintf(stderr, "Couldn't create hardlink from \"%s\" to \"%s\": %s\n", + prefixed_path_to_extract, existing_path_for_inode, strerror(errno)); + exit(EXIT_FAILURE); + } else { + continue; + } + } + // track the path we extract to for this inode, so that we can `link` if this inode is found again + created_inode[inode.base.inode_number - 1] = strdup(prefixed_path_to_extract); + // fprintf(stderr, "Extract to: %s\n", prefixed_path_to_extract); + if (private_sqfs_stat(&fs, &inode, &st) != 0) + die("private_sqfs_stat error"); + // Read the file in chunks + off_t bytes_already_read = 0; + sqfs_off_t bytes_at_a_time = 64 * 1024; + FILE* f; + f = fopen(prefixed_path_to_extract, "w+"); + if (f == NULL) + die("fopen error"); + while (bytes_already_read < inode.xtra.reg.file_size) { + char buf[bytes_at_a_time]; + if (sqfs_read_range(&fs, &inode, (sqfs_off_t) bytes_already_read, &bytes_at_a_time, buf)) + die("sqfs_read_range error"); + // fwrite(buf, 1, bytes_at_a_time, stdout); + fwrite(buf, 1, bytes_at_a_time, f); + bytes_already_read = bytes_already_read + bytes_at_a_time; + } + fclose(f); + chmod(prefixed_path_to_extract, st.st_mode); + } else if (inode.base.inode_type == SQUASHFS_SYMLINK_TYPE) { + size_t size; + sqfs_readlink(&fs, &inode, NULL, &size); + char buf[size]; + int ret = sqfs_readlink(&fs, &inode, buf, &size); + if (ret != 0) + die("symlink error"); + // fprintf(stderr, "Symlink: %s to %s \n", prefixed_path_to_extract, buf); + unlink(prefixed_path_to_extract); + ret = symlink(buf, prefixed_path_to_extract); + if (ret != 0) + fprintf(stderr, "WARNING: could not create symlink\n"); + } else { + fprintf(stderr, "TODO: Implement inode.base.inode_type %i\n", inode.base.inode_type); + } + // fprintf(stderr, "\n"); + } + } + if (err) + die("sqfs_traverse_next error"); + for (int i = 0; i < fs.sb.inodes; i++) { + free(created_inode[i]); + } + free(created_inode); + sqfs_traverse_close(&trv); + sqfs_fd_close(fs.fd); + exit(0); +} + +int main (int argc, char *argv[]) { char appimage_path[PATH_MAX]; char argv0_path[PATH_MAX]; char * arg; @@ -352,129 +468,29 @@ main (int argc, char *argv[]) exit(0); } - /* Exract the AppImage */ arg=getArg(argc,argv,'-'); - if(arg && strcmp(arg,"appimage-extract")==0) { - sqfs_err err = SQFS_OK; - sqfs_traverse trv; - sqfs fs; - char *pattern; - char *prefix; - char prefixed_path_to_extract[1024]; - char **created_inode; - - prefix = "squashfs-root/"; - - if(access(prefix, F_OK ) == -1 ) { - if (mkdir_p(prefix) == -1) { - perror("mkdir_p error"); - exit(EXIT_FAILURE); - } - } - if(argc == 3){ - pattern = argv[2]; - if (pattern[0] == '/') pattern++; // Remove leading '/' - } + /* extract the AppImage */ + if(arg && strcmp(arg,"appimage-extract")==0) { + char default_prefix[] = "squashfs-root/"; - if ((err = sqfs_open_image(&fs, appimage_path, fs_offset))) - exit(1); + char* prefix = NULL; - // track duplicate inodes for hardlinks - created_inode = malloc(fs.sb.inodes * sizeof(char *)); - if(created_inode != NULL) { - memset(created_inode, 0, fs.sb.inodes * sizeof(char *)); + // default use case: use standard prefix + if (argc == 2) { + prefix = default_prefix; + } else if (argc == 3) { + prefix = argv[2]; } else { - fprintf(stderr, "Failed allocating memory to track hardlinks.\n"); + fprintf(stderr, "Unexpected argument count: %d\n", argc-1); + fprintf(stderr, "Usage: %s --appimage-extract []\n", argv0_path); exit(1); } - if ((err = sqfs_traverse_open(&trv, &fs, sqfs_inode_root(&fs)))) - die("sqfs_traverse_open error"); - while (sqfs_traverse_next(&trv, &err)) { - if (!trv.dir_end) { - if((argc != 3) || (fnmatch (pattern, trv.path, FNM_FILE_NAME) == 0)){ - // fprintf(stderr, "trv.path: %s\n", trv.path); - // fprintf(stderr, "sqfs_inode_id: %lu\n", trv.entry.inode); - sqfs_inode inode; - if (sqfs_inode_get(&fs, &inode, trv.entry.inode)) - die("sqfs_inode_get error"); - // fprintf(stderr, "inode.base.inode_type: %i\n", inode.base.inode_type); - // fprintf(stderr, "inode.xtra.reg.file_size: %lu\n", inode.xtra.reg.file_size); - strcpy(prefixed_path_to_extract, ""); - strcat(strcat(prefixed_path_to_extract, prefix), trv.path); - fprintf(stderr, "%s\n", prefixed_path_to_extract); - if(inode.base.inode_type == SQUASHFS_DIR_TYPE || inode.base.inode_type == SQUASHFS_LDIR_TYPE){ - // fprintf(stderr, "inode.xtra.dir.parent_inode: %ui\n", inode.xtra.dir.parent_inode); - // fprintf(stderr, "mkdir_p: %s/\n", prefixed_path_to_extract); - if(access(prefixed_path_to_extract, F_OK ) == -1 ) { - if (mkdir_p(prefixed_path_to_extract) == -1) { - perror("mkdir_p error"); - exit(EXIT_FAILURE); - } - } - } else if(inode.base.inode_type == SQUASHFS_REG_TYPE || inode.base.inode_type == SQUASHFS_LREG_TYPE){ - // if we've already created this inode, then this is a hardlink - char* existing_path_for_inode = created_inode[inode.base.inode_number - 1]; - if(existing_path_for_inode != NULL) { - unlink(prefixed_path_to_extract); - if(link(existing_path_for_inode, prefixed_path_to_extract) == -1) { - fprintf(stderr, "Couldn't create hardlink from \"%s\" to \"%s\": %s\n", prefixed_path_to_extract, existing_path_for_inode, strerror(errno)); - exit(EXIT_FAILURE); - } else { - continue; - } - } - // track the path we extract to for this inode, so that we can `link` if this inode is found again - created_inode[inode.base.inode_number - 1] = strdup(prefixed_path_to_extract); - // fprintf(stderr, "Extract to: %s\n", prefixed_path_to_extract); - if(private_sqfs_stat(&fs, &inode, &st) != 0) - die("private_sqfs_stat error"); - // Read the file in chunks - off_t bytes_already_read = 0; - sqfs_off_t bytes_at_a_time = 64*1024; - FILE * f; - f = fopen (prefixed_path_to_extract, "w+"); - if (f == NULL) - die("fopen error"); - while (bytes_already_read < inode.xtra.reg.file_size) - { - char buf[bytes_at_a_time]; - if (sqfs_read_range(&fs, &inode, (sqfs_off_t) bytes_already_read, &bytes_at_a_time, buf)) - die("sqfs_read_range error"); - // fwrite(buf, 1, bytes_at_a_time, stdout); - fwrite(buf, 1, bytes_at_a_time, f); - bytes_already_read = bytes_already_read + bytes_at_a_time; - } - fclose(f); - chmod (prefixed_path_to_extract, st.st_mode); - } else if(inode.base.inode_type == SQUASHFS_SYMLINK_TYPE){ - size_t size; - sqfs_readlink(&fs, &inode, NULL, &size); - char buf[size]; - int ret = sqfs_readlink(&fs, &inode, buf, &size); - if (ret != 0) - die("symlink error"); - // fprintf(stderr, "Symlink: %s to %s \n", prefixed_path_to_extract, buf); - unlink(prefixed_path_to_extract); - ret = symlink(buf, prefixed_path_to_extract); - if (ret != 0) - fprintf(stderr, "WARNING: could not create symlink\n"); - } else { - fprintf(stderr, "TODO: Implement inode.base.inode_type %i\n", inode.base.inode_type); - } - // fprintf(stderr, "\n"); - } - } - } - if (err) - die("sqfs_traverse_next error"); - for (int i = 0; i < fs.sb.inodes; i++) { - free(created_inode[i]); + if (!extract_appimage(appimage_path, prefix)) { + exit(1); } - free(created_inode); - sqfs_traverse_close(&trv); - sqfs_fd_close(fs.fd); + exit(0); } From 3048d600d31cb30ec706e0bd342c47d22e701d8e Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 16 Aug 2018 13:38:30 +0200 Subject: [PATCH 319/544] Fix comparison --- src/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index bf3678ebd..bbf4bdbc4 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -276,7 +276,7 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix strcpy(prefix, _prefix); // sanitize prefix - if (prefix[strlen(prefix)] != '/') + if (prefix[strlen(prefix) - 1] != '/') strcat(prefix, "/"); if (access(prefix, F_OK) == -1) { From 72f1dce2ce4e12464affcbc0832e9f5be227aaee Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 16 Aug 2018 16:06:46 +0200 Subject: [PATCH 320/544] Use return codes instead of exit calls --- src/runtime.c | 57 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index bbf4bdbc4..ad7c6c39b 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -272,7 +272,7 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix // local copy we can modify safely // allocate 1 more byte than we would need so we can add a trailing slash if there is none yet - char* prefix = malloc(strlen(_prefix+2)); + char* prefix = malloc(strlen(_prefix + 2)); strcpy(prefix, _prefix); // sanitize prefix @@ -282,30 +282,38 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix if (access(prefix, F_OK) == -1) { if (mkdir_p(prefix) == -1) { perror("mkdir_p error"); - exit(EXIT_FAILURE); + return false; } } - if ((err = sqfs_open_image(&fs, appimage_path, (size_t) fs_offset))) - die("Failed to open squashfs image"); + if ((err = sqfs_open_image(&fs, appimage_path, (size_t) fs_offset))) { + fprintf(stderr, "Failed to open squashfs image\n"); + return false; + }; // track duplicate inodes for hardlinks char** created_inode = malloc(fs.sb.inodes * sizeof(char*)); if (created_inode != NULL) { memset(created_inode, 0, fs.sb.inodes * sizeof(char*)); } else { - die("Failed allocating memory to track hardlinks."); + fprintf(stderr, "Failed allocating memory to track hardlinks\n"); + return false; + } + + if ((err = sqfs_traverse_open(&trv, &fs, sqfs_inode_root(&fs)))) { + fprintf(stderr, "sqfs_traverse_open error\n"); + return false; } - if ((err = sqfs_traverse_open(&trv, &fs, sqfs_inode_root(&fs)))) - die("sqfs_traverse_open error"); while (sqfs_traverse_next(&trv, &err)) { if (!trv.dir_end) { // fprintf(stderr, "trv.path: %s\n", trv.path); // fprintf(stderr, "sqfs_inode_id: %lu\n", trv.entry.inode); sqfs_inode inode; - if (sqfs_inode_get(&fs, &inode, trv.entry.inode)) - die("sqfs_inode_get error"); + if (sqfs_inode_get(&fs, &inode, trv.entry.inode)) { + fprintf(stderr, "sqfs_inode_get error\n"); + return false; + } // fprintf(stderr, "inode.base.inode_type: %i\n", inode.base.inode_type); // fprintf(stderr, "inode.xtra.reg.file_size: %lu\n", inode.xtra.reg.file_size); strcpy(prefixed_path_to_extract, ""); @@ -317,7 +325,7 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix if (access(prefixed_path_to_extract, F_OK) == -1) { if (mkdir_p(prefixed_path_to_extract) == -1) { perror("mkdir_p error"); - exit(EXIT_FAILURE); + return false; } } } else if (inode.base.inode_type == SQUASHFS_REG_TYPE || inode.base.inode_type == SQUASHFS_LREG_TYPE) { @@ -328,7 +336,7 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix if (link(existing_path_for_inode, prefixed_path_to_extract) == -1) { fprintf(stderr, "Couldn't create hardlink from \"%s\" to \"%s\": %s\n", prefixed_path_to_extract, existing_path_for_inode, strerror(errno)); - exit(EXIT_FAILURE); + return false; } else { continue; } @@ -343,12 +351,16 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix sqfs_off_t bytes_at_a_time = 64 * 1024; FILE* f; f = fopen(prefixed_path_to_extract, "w+"); - if (f == NULL) - die("fopen error"); + if (f == NULL) { + perror("fopen error"); + return false; + } while (bytes_already_read < inode.xtra.reg.file_size) { char buf[bytes_at_a_time]; - if (sqfs_read_range(&fs, &inode, (sqfs_off_t) bytes_already_read, &bytes_at_a_time, buf)) - die("sqfs_read_range error"); + if (sqfs_read_range(&fs, &inode, (sqfs_off_t) bytes_already_read, &bytes_at_a_time, buf)) { + perror("sqfs_read_range error"); + return false; + } // fwrite(buf, 1, bytes_at_a_time, stdout); fwrite(buf, 1, bytes_at_a_time, f); bytes_already_read = bytes_already_read + bytes_at_a_time; @@ -360,8 +372,10 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix sqfs_readlink(&fs, &inode, NULL, &size); char buf[size]; int ret = sqfs_readlink(&fs, &inode, buf, &size); - if (ret != 0) - die("symlink error"); + if (ret != 0) { + perror("symlink error"); + return false; + } // fprintf(stderr, "Symlink: %s to %s \n", prefixed_path_to_extract, buf); unlink(prefixed_path_to_extract); ret = symlink(buf, prefixed_path_to_extract); @@ -373,15 +387,18 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix // fprintf(stderr, "\n"); } } - if (err) - die("sqfs_traverse_next error"); + if (err) { + fprintf(stderr, "sqfs_traverse_next error\n"); + return false; + } for (int i = 0; i < fs.sb.inodes; i++) { free(created_inode[i]); } free(created_inode); sqfs_traverse_close(&trv); sqfs_fd_close(fs.fd); - exit(0); + + return true; } int main (int argc, char *argv[]) { From 22625f4cd93d4f84ea8b61bc1e3c7a71c011c9ed Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 16 Aug 2018 17:00:15 +0200 Subject: [PATCH 321/544] --appimage-extract-and-run mk. 1 --- src/runtime.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) diff --git a/src/runtime.c b/src/runtime.c index ad7c6c39b..0b86d4250 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -401,6 +402,70 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix return true; } +// based on https://stackoverflow.com/questions/2256945/removing-a-non-empty-directory-programmatically-in-c-or-c +bool rm_recursive(const char* const path) { + FTS* ftsp = NULL; + FTSENT* curr; + + // fts is supposed not to modify the arguments in this array + char* files[] = {(char*) path, NULL}; + + // FTS_NOCHDIR - Avoid changing cwd, which could cause unexpected behavior in multithreaded programs + // FTS_PHYSICAL - Don't follow symlinks. Prevents deletion of files outside of the specified directory + // FTS_XDEV - Don't cross filesystem boundaries + ftsp = fts_open(files, FTS_NOCHDIR | FTS_PHYSICAL | FTS_XDEV, NULL); + if (ftsp == NULL) { + fprintf(stderr, "%s: fts_open failed: %s\n", path, strerror(errno)); + return false; + } + + bool ret = true; + + while ((curr = fts_read(ftsp))) { + if (!ret) + break; + + switch (curr->fts_info) { + case FTS_NS: + case FTS_DNR: + case FTS_ERR: + fprintf(stderr, "%s: fts_read error: %s\n", + curr->fts_accpath, strerror(curr->fts_errno)); + break; + + case FTS_DC: + case FTS_DOT: + case FTS_NSOK: + // Not reached unless FTS_LOGICAL, FTS_SEEDOT, or FTS_NOSTAT were passed to fts_open() + break; + + case FTS_D: + // Do nothing. Need depth-first search, so directories are deleted in FTS_DP + break; + + case FTS_DP: + case FTS_F: + case FTS_SL: + case FTS_SLNONE: + case FTS_DEFAULT: + if (remove(curr->fts_accpath) < 0) { + fprintf(stderr, "%s: Failed to remove: %s\n", + curr->fts_path, strerror(errno)); + ret = false; + } + break; + + default: + fprintf(stderr, "Unexpected fts_info\n"); + ret = false; + break; + } + } + + fts_close(ftsp); + return ret; +} + int main (int argc, char *argv[]) { char appimage_path[PATH_MAX]; char argv0_path[PATH_MAX]; @@ -511,6 +576,77 @@ int main (int argc, char *argv[]) { exit(0); } + if (arg && strcmp(arg, "appimage-extract-and-run") == 0) { + char temp_base[PATH_MAX] = "/tmp"; + + const char* const TMPDIR = getenv("TMPDIR"); + if (TMPDIR != NULL) + strcpy(temp_base, getenv("TMPDIR")); + + const char target_dir[] = "appimage_extracted_XXXXXX"; + + char* template = malloc(strlen(temp_base) + 1 + strlen(target_dir) + 2); + strcpy(template, temp_base); + strcat(template, "/"); + strcat(template, target_dir); + + char* prefix = mkdtemp(template); + + if (template != prefix) { + int error = errno; + fprintf(stderr, "Failed to create temporary directory: %s\n", strerror(error)); + exit(1); + } + + if (!extract_appimage(appimage_path, prefix)) { + fprintf(stderr, "Failed to extract AppImage\n"); + exit(1); + } + + int pid; + if ((pid = fork()) == 1) { + int error = errno; + fprintf(stderr, "fork() failed: %s\n", strerror(error)); + exit(1); + } else if (pid == 0) { + const char apprun_fname[] = "AppRun"; + char* apprun_path = malloc(strlen(prefix) + 1 + strlen(apprun_fname) + 1); + strcpy(apprun_path, prefix); + strcat(apprun_path, "/"); + strcat(apprun_path, apprun_fname); + + // create copy of argument list without the --appimage-extract-and-run parameter + char* new_argv[argc]; + int new_argc = 0; + new_argv[new_argc++] = strdup(apprun_path); + for (int i = 1; i < argc; ++i) { + if (strcmp(argv[i], "--appimage-extract-and-run") != 0) { + new_argv[new_argc++] = strdup(argv[i]); + } + } + new_argv[new_argc] = NULL; + + execv(apprun_path, new_argv); + + int error = errno; + fprintf(stderr, "Failed to run %s: %s\n", apprun_path, strerror(error)); + + free(apprun_path); + } + + int child_rv = waitpid(pid, NULL, 0); + + // TODO: implement NO_CLEANUP environment variable + // it doesn't make sense to implement it until we have "predictable target directories" which can be used to + // speed up subsequent calls by not extracting the files again + rm_recursive(prefix); + + // template == prefix, must be freed only once + free(prefix); + + exit(child_rv ? 0 : 1); + } + if(arg && strcmp(arg,"appimage-version")==0) { fprintf(stderr,"Version: %s\n", GIT_COMMIT); exit(0); From dfd18a4b67d381b62da0990f316fc924b858b3fa Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 16 Aug 2018 19:42:04 +0200 Subject: [PATCH 322/544] Fix memleak --- src/runtime.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime.c b/src/runtime.c index 0b86d4250..8fb8ef7f1 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -303,6 +303,7 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix if ((err = sqfs_traverse_open(&trv, &fs, sqfs_inode_root(&fs)))) { fprintf(stderr, "sqfs_traverse_open error\n"); + free(created_inode); return false; } From 38865226065541c2e6866b14c5b1c266f355b330 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 16 Aug 2018 19:43:45 +0200 Subject: [PATCH 323/544] Fix resource leak --- src/runtime.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime.c b/src/runtime.c index 8fb8ef7f1..15e8bc561 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -361,6 +361,7 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix char buf[bytes_at_a_time]; if (sqfs_read_range(&fs, &inode, (sqfs_off_t) bytes_already_read, &bytes_at_a_time, buf)) { perror("sqfs_read_range error"); + fclose(f); return false; } // fwrite(buf, 1, bytes_at_a_time, stdout); From d441abd226bd74f13ac528949488d692a38d8479 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 16 Aug 2018 21:01:17 +0200 Subject: [PATCH 324/544] Properly clean up resources --- src/runtime.c | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 15e8bc561..a967e7670 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -307,6 +307,8 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix return false; } + bool rv = true; + while (sqfs_traverse_next(&trv, &err)) { if (!trv.dir_end) { // fprintf(stderr, "trv.path: %s\n", trv.path); @@ -314,7 +316,8 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix sqfs_inode inode; if (sqfs_inode_get(&fs, &inode, trv.entry.inode)) { fprintf(stderr, "sqfs_inode_get error\n"); - return false; + rv = false; + break; } // fprintf(stderr, "inode.base.inode_type: %i\n", inode.base.inode_type); // fprintf(stderr, "inode.xtra.reg.file_size: %lu\n", inode.xtra.reg.file_size); @@ -327,7 +330,8 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix if (access(prefixed_path_to_extract, F_OK) == -1) { if (mkdir_p(prefixed_path_to_extract) == -1) { perror("mkdir_p error"); - return false; + rv = false; + break; } } } else if (inode.base.inode_type == SQUASHFS_REG_TYPE || inode.base.inode_type == SQUASHFS_LREG_TYPE) { @@ -338,7 +342,8 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix if (link(existing_path_for_inode, prefixed_path_to_extract) == -1) { fprintf(stderr, "Couldn't create hardlink from \"%s\" to \"%s\": %s\n", prefixed_path_to_extract, existing_path_for_inode, strerror(errno)); - return false; + rv = false; + break; } else { continue; } @@ -355,14 +360,16 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix f = fopen(prefixed_path_to_extract, "w+"); if (f == NULL) { perror("fopen error"); - return false; + rv = false; + break; } while (bytes_already_read < inode.xtra.reg.file_size) { char buf[bytes_at_a_time]; if (sqfs_read_range(&fs, &inode, (sqfs_off_t) bytes_already_read, &bytes_at_a_time, buf)) { perror("sqfs_read_range error"); fclose(f); - return false; + rv = false; + break; } // fwrite(buf, 1, bytes_at_a_time, stdout); fwrite(buf, 1, bytes_at_a_time, f); @@ -370,6 +377,8 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix } fclose(f); chmod(prefixed_path_to_extract, st.st_mode); + if (!rv) + break; } else if (inode.base.inode_type == SQUASHFS_SYMLINK_TYPE) { size_t size; sqfs_readlink(&fs, &inode, NULL, &size); @@ -377,7 +386,8 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix int ret = sqfs_readlink(&fs, &inode, buf, &size); if (ret != 0) { perror("symlink error"); - return false; + rv = false; + break; } // fprintf(stderr, "Symlink: %s to %s \n", prefixed_path_to_extract, buf); unlink(prefixed_path_to_extract); @@ -388,20 +398,24 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix fprintf(stderr, "TODO: Implement inode.base.inode_type %i\n", inode.base.inode_type); } // fprintf(stderr, "\n"); + + if (!rv) + break; } } - if (err) { - fprintf(stderr, "sqfs_traverse_next error\n"); - return false; - } for (int i = 0; i < fs.sb.inodes; i++) { free(created_inode[i]); } free(created_inode); + + if (err != SQFS_OK) { + fprintf(stderr, "sqfs_traverse_next error\n"); + rv = false; + } sqfs_traverse_close(&trv); sqfs_fd_close(fs.fd); - return true; + return rv; } // based on https://stackoverflow.com/questions/2256945/removing-a-non-empty-directory-programmatically-in-c-or-c From 9b1e88c29309653c58adef3dbd03e4ce487dde3e Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 16 Aug 2018 21:03:53 +0200 Subject: [PATCH 325/544] Improve code style --- src/runtime.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index a967e7670..449045bf8 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -429,7 +429,7 @@ bool rm_recursive(const char* const path) { // FTS_NOCHDIR - Avoid changing cwd, which could cause unexpected behavior in multithreaded programs // FTS_PHYSICAL - Don't follow symlinks. Prevents deletion of files outside of the specified directory // FTS_XDEV - Don't cross filesystem boundaries - ftsp = fts_open(files, FTS_NOCHDIR | FTS_PHYSICAL | FTS_XDEV, NULL); + FTS* ftsp = fts_open(files, FTS_NOCHDIR | FTS_PHYSICAL | FTS_XDEV, NULL); if (ftsp == NULL) { fprintf(stderr, "%s: fts_open failed: %s\n", path, strerror(errno)); return false; @@ -437,7 +437,7 @@ bool rm_recursive(const char* const path) { bool ret = true; - while ((curr = fts_read(ftsp))) { + for (FTSENT* curr; (curr = fts_read(ftsp)) != NULL;) { if (!ret) break; From c5f463fe524c19618c57c58b971705511edcd077 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 16 Aug 2018 22:04:03 +0200 Subject: [PATCH 326/544] Use nftw instead of fts I prefer fts, as it doesn't require any sort of callback and is therefore easier to implement, but it doesn't work with LFS. --- src/runtime.c | 94 ++++++++++++++++++++++----------------------------- 1 file changed, 40 insertions(+), 54 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 449045bf8..a02d0d429 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -38,7 +38,7 @@ #include #include #include -#include +#include #include #include #include @@ -418,68 +418,54 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix return rv; } -// based on https://stackoverflow.com/questions/2256945/removing-a-non-empty-directory-programmatically-in-c-or-c -bool rm_recursive(const char* const path) { - FTS* ftsp = NULL; - FTSENT* curr; - - // fts is supposed not to modify the arguments in this array - char* files[] = {(char*) path, NULL}; - - // FTS_NOCHDIR - Avoid changing cwd, which could cause unexpected behavior in multithreaded programs - // FTS_PHYSICAL - Don't follow symlinks. Prevents deletion of files outside of the specified directory - // FTS_XDEV - Don't cross filesystem boundaries - FTS* ftsp = fts_open(files, FTS_NOCHDIR | FTS_PHYSICAL | FTS_XDEV, NULL); - if (ftsp == NULL) { - fprintf(stderr, "%s: fts_open failed: %s\n", path, strerror(errno)); - return false; - } +int rm_recursive_callback(const char* path, const struct stat* stat, const int type, struct FTW* ftw) { + (void) stat; + (void) ftw; - bool ret = true; + switch (type) { + case FTW_NS: + case FTW_DNR: + fprintf(stderr, "%s: ftw error: %s\n", + path, strerror(errno)); + return 1; - for (FTSENT* curr; (curr = fts_read(ftsp)) != NULL;) { - if (!ret) + case FTW_D: + // ignore directories at first, will be handled by FTW_DP break; - switch (curr->fts_info) { - case FTS_NS: - case FTS_DNR: - case FTS_ERR: - fprintf(stderr, "%s: fts_read error: %s\n", - curr->fts_accpath, strerror(curr->fts_errno)); - break; - - case FTS_DC: - case FTS_DOT: - case FTS_NSOK: - // Not reached unless FTS_LOGICAL, FTS_SEEDOT, or FTS_NOSTAT were passed to fts_open() - break; + case FTW_F: + case FTW_SL: + case FTW_SLN: + if (remove(path) != 0) { + fprintf(stderr, "Failed to remove %s: %s\n", path, strerror(errno)); + return false; + } + break; - case FTS_D: - // Do nothing. Need depth-first search, so directories are deleted in FTS_DP - break; - case FTS_DP: - case FTS_F: - case FTS_SL: - case FTS_SLNONE: - case FTS_DEFAULT: - if (remove(curr->fts_accpath) < 0) { - fprintf(stderr, "%s: Failed to remove: %s\n", - curr->fts_path, strerror(errno)); - ret = false; - } - break; + case FTW_DP: + if (rmdir(path) != 0) { + fprintf(stderr, "Failed to remove directory %s: %s\n", path, strerror(errno)); + return false; + } + break; - default: - fprintf(stderr, "Unexpected fts_info\n"); - ret = false; - break; - } + default: + fprintf(stderr, "Unexpected fts_info\n"); + return 1; } - fts_close(ftsp); - return ret; + return 0; +}; + +bool rm_recursive(const char* const path) { + // FTW_DEPTH: perform depth-first search to make sure files are deleted before the containing directories + // FTW_MOUNT: prevent deletion of files on other mounted filesystems + // FTW_PHYS: do not follow symlinks, but report symlinks as such; this way, the symlink targets, which might point + // to locations outside path will not be deleted accidentally (attackers might abuse this) + int rv = nftw(path, &rm_recursive_callback, 0, FTW_DEPTH | FTW_MOUNT | FTW_PHYS); + + return rv == 0; } int main (int argc, char *argv[]) { From 6e0c0042775ca33d16437a35c0ead30e6e6a8113 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 16 Aug 2018 22:39:11 +0200 Subject: [PATCH 327/544] Fix type --- src/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index a02d0d429..a9e382400 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -691,7 +691,7 @@ int main (int argc, char *argv[]) { int dir_fd, res; char mount_dir[64]; - int namelen = strlen(basename(argv[0])); + size_t namelen = strlen(basename(argv[0])); if(namelen>6){ namelen=6; } From bd3418c5dcdecd11bdfa5ecfb8a04e7b293f5445 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 16 Aug 2018 23:39:37 +0200 Subject: [PATCH 328/544] Extract appimage_hexlify into separate source file --- src/CMakeLists.txt | 2 ++ src/appimagetool_shared.c | 15 --------------- src/build-runtime.cmake | 2 +- src/hexlify.c | 18 ++++++++++++++++++ tests/CMakeLists.txt | 1 + 5 files changed, 22 insertions(+), 16 deletions(-) create mode 100644 src/hexlify.c diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3f2544281..7ed1e17db 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -23,6 +23,7 @@ add_library(libappimage SHARED notify.c elf.c appimagetool_shared.c + hexlify.c ) set_target_properties(libappimage PROPERTIES PREFIX "") @@ -63,6 +64,7 @@ add_library(libappimage_static STATIC notify.c elf.c appimagetool_shared.c + hexlify.c ) set_target_properties(libappimage_static PROPERTIES PREFIX "") diff --git a/src/appimagetool_shared.c b/src/appimagetool_shared.c index 6b74ef26d..aba816b1f 100644 --- a/src/appimagetool_shared.c +++ b/src/appimagetool_shared.c @@ -187,18 +187,3 @@ bool appimage_type2_digest_md5(const char* path, char* digest) { return true; } - -char* appimage_hexlify(const char* bytes, const size_t numBytes) { - // first of all, allocate the new string - // a hexadecimal representation works like "every byte will be represented by two chars" - // additionally, we need to null-terminate the string - char* hexlified = (char*) calloc((2 * numBytes + 1), sizeof(char)); - - for (size_t i = 0; i < numBytes; i++) { - char buffer[3]; - sprintf(buffer, "%02x", (unsigned char) bytes[i]); - strcat(hexlified, buffer); - } - - return hexlified; -} diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index 7dc7b409f..f1f211e61 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -92,7 +92,7 @@ add_custom_command( # add the runtime as a normal executable # CLion will recognize it as a normal executable, one can simply step into the code -add_executable(runtime ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o elf.c notify.c getsection.c) +add_executable(runtime ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o elf.c notify.c getsection.c hexlify.c) # CMake gets confused by the .o object, therefore we need to tell it that it shall link everything using the C compiler set_property(TARGET runtime PROPERTY LINKER_LANGUAGE C) target_link_libraries(runtime PRIVATE squashfuse dl xz libzlib pthread) diff --git a/src/hexlify.c b/src/hexlify.c new file mode 100644 index 000000000..113a595ba --- /dev/null +++ b/src/hexlify.c @@ -0,0 +1,18 @@ +#include +#include +#include + +char* appimage_hexlify(const char* bytes, const size_t numBytes) { + // first of all, allocate the new string + // a hexadecimal representation works like "every byte will be represented by two chars" + // additionally, we need to null-terminate the string + char* hexlified = (char*) calloc((2 * numBytes + 1), sizeof(char)); + + for (size_t i = 0; i < numBytes; i++) { + char buffer[3]; + sprintf(buffer, "%02x", (unsigned char) bytes[i]); + strcat(hexlified, buffer); + } + + return hexlified; +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 285598537..8fbb0483d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -29,6 +29,7 @@ if(BUILD_TESTING) ${PROJECT_SOURCE_DIR}/src/elf.c ${PROJECT_SOURCE_DIR}/src/getsection.c ${PROJECT_SOURCE_DIR}/src/appimagetool_shared.c + ${PROJECT_SOURCE_DIR}/src/hexlify.c ) target_link_libraries(test_shared From b966b21b096458a205c25b249b3e094ad201fb3b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 17 Aug 2018 00:09:19 +0200 Subject: [PATCH 329/544] Fix error check --- src/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index a9e382400..150f87a45 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -606,7 +606,7 @@ int main (int argc, char *argv[]) { } int pid; - if ((pid = fork()) == 1) { + if ((pid = fork()) == -1) { int error = errno; fprintf(stderr, "fork() failed: %s\n", strerror(error)); exit(1); From 2578c5d7979317a1fcbc6236be5288b1f9415c6f Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 17 Aug 2018 00:09:58 +0200 Subject: [PATCH 330/544] Improve code style --- src/runtime.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 150f87a45..756aed47e 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -273,7 +273,7 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix // local copy we can modify safely // allocate 1 more byte than we would need so we can add a trailing slash if there is none yet - char* prefix = malloc(strlen(_prefix + 2)); + char* prefix = malloc(strlen(_prefix + 3)); strcpy(prefix, _prefix); // sanitize prefix @@ -293,10 +293,8 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix }; // track duplicate inodes for hardlinks - char** created_inode = malloc(fs.sb.inodes * sizeof(char*)); - if (created_inode != NULL) { - memset(created_inode, 0, fs.sb.inodes * sizeof(char*)); - } else { + char** created_inode = calloc(fs.sb.inodes, sizeof(char*)); + if (created_inode == NULL) { fprintf(stderr, "Failed allocating memory to track hardlinks\n"); return false; } From 09e498c6f845de633947f36a7177010451143edb Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 17 Aug 2018 00:19:57 +0200 Subject: [PATCH 331/544] Fix buffer size calculation C strings are annoying... --- src/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index 756aed47e..9f17ad78c 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -273,7 +273,7 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix // local copy we can modify safely // allocate 1 more byte than we would need so we can add a trailing slash if there is none yet - char* prefix = malloc(strlen(_prefix + 3)); + char* prefix = malloc(strlen(_prefix) + 2); strcpy(prefix, _prefix); // sanitize prefix From bfcc545fd437a3e4a7c0d9a60f70463da02c6235 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 17 Aug 2018 00:21:55 +0200 Subject: [PATCH 332/544] Implement "content-aware" filenames --- src/CMakeLists.txt | 4 + src/build-runtime.cmake | 2 +- src/md5.c | 335 ++++++++++++++++++++++++++++++++++++++++ src/md5.h | 96 ++++++++++++ src/runtime.c | 39 +++-- 5 files changed, 464 insertions(+), 12 deletions(-) create mode 100644 src/md5.c create mode 100644 src/md5.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7ed1e17db..0df0e6b8d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -16,6 +16,10 @@ add_subdirectory(xdg-basedir) set(AUXILIARY_FILES_DESTINATION "lib/appimagekit" CACHE STRING "Target install directory for mksquashfs") +add_library(md5 md5.c md5.h) +target_include_directories(md5 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + + add_library(libappimage SHARED ${PROJECT_SOURCE_DIR}/include/appimage/appimage.h shared.c diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index f1f211e61..1c77b8fd2 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -95,7 +95,7 @@ add_custom_command( add_executable(runtime ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o elf.c notify.c getsection.c hexlify.c) # CMake gets confused by the .o object, therefore we need to tell it that it shall link everything using the C compiler set_property(TARGET runtime PROPERTY LINKER_LANGUAGE C) -target_link_libraries(runtime PRIVATE squashfuse dl xz libzlib pthread) +target_link_libraries(runtime PRIVATE squashfuse dl xz libzlib pthread md5) target_include_directories(runtime PRIVATE ${PROJECT_SOURCE_DIR}/include) if(BUILD_DEBUG) diff --git a/src/md5.c b/src/md5.c new file mode 100644 index 000000000..bb3cf18d8 --- /dev/null +++ b/src/md5.c @@ -0,0 +1,335 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// WjCryptLib_Md5 +// +// Implementation of MD5 hash function. Originally written by Alexander Peslyak. Modified by WaterJuice retaining +// Public Domain license. +// +// This is free and unencumbered software released into the public domain - June 2013 waterjuice.org +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "md5.h" +#include + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// INTERNAL FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// F, G, H, I +// +// The basic MD5 functions. F and G are optimised compared to their RFC 1321 definitions for architectures that lack +// an AND-NOT instruction, just like in Colin Plumb's implementation. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#define F( x, y, z ) ( (z) ^ ((x) & ((y) ^ (z))) ) +#define G( x, y, z ) ( (y) ^ ((z) & ((x) ^ (y))) ) +#define H( x, y, z ) ( (x) ^ (y) ^ (z) ) +#define I( x, y, z ) ( (y) ^ ((x) | ~(z)) ) + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// STEP +// +// The MD5 transformation for all four rounds. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#define STEP( f, a, b, c, d, x, t, s ) \ + (a) += f((b), (c), (d)) + (x) + (t); \ + (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \ + (a) += (b); + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TransformFunction +// +// This processes one or more 64-byte data blocks, but does NOT update the bit counters. There are no alignment +// requirements. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static +void* +TransformFunction + ( + Md5Context* ctx, + void const* data, + uintmax_t size + ) +{ + uint8_t* ptr; + uint32_t a; + uint32_t b; + uint32_t c; + uint32_t d; + uint32_t saved_a; + uint32_t saved_b; + uint32_t saved_c; + uint32_t saved_d; + + #define GET(n) (ctx->block[(n)]) + #define SET(n) (ctx->block[(n)] = \ + ((uint32_t)ptr[(n)*4 + 0] << 0 ) \ + | ((uint32_t)ptr[(n)*4 + 1] << 8 ) \ + | ((uint32_t)ptr[(n)*4 + 2] << 16) \ + | ((uint32_t)ptr[(n)*4 + 3] << 24) ) + + ptr = (uint8_t*)data; + + a = ctx->a; + b = ctx->b; + c = ctx->c; + d = ctx->d; + + do + { + saved_a = a; + saved_b = b; + saved_c = c; + saved_d = d; + + // Round 1 + STEP( F, a, b, c, d, SET(0), 0xd76aa478, 7 ) + STEP( F, d, a, b, c, SET(1), 0xe8c7b756, 12 ) + STEP( F, c, d, a, b, SET(2), 0x242070db, 17 ) + STEP( F, b, c, d, a, SET(3), 0xc1bdceee, 22 ) + STEP( F, a, b, c, d, SET(4), 0xf57c0faf, 7 ) + STEP( F, d, a, b, c, SET(5), 0x4787c62a, 12 ) + STEP( F, c, d, a, b, SET(6), 0xa8304613, 17 ) + STEP( F, b, c, d, a, SET(7), 0xfd469501, 22 ) + STEP( F, a, b, c, d, SET(8 ), 0x698098d8, 7 ) + STEP( F, d, a, b, c, SET(9 ), 0x8b44f7af, 12 ) + STEP( F, c, d, a, b, SET(10 ), 0xffff5bb1, 17 ) + STEP( F, b, c, d, a, SET(11 ), 0x895cd7be, 22 ) + STEP( F, a, b, c, d, SET(12 ), 0x6b901122, 7 ) + STEP( F, d, a, b, c, SET(13 ), 0xfd987193, 12 ) + STEP( F, c, d, a, b, SET(14 ), 0xa679438e, 17 ) + STEP( F, b, c, d, a, SET(15 ), 0x49b40821, 22 ) + + // Round 2 + STEP( G, a, b, c, d, GET(1), 0xf61e2562, 5 ) + STEP( G, d, a, b, c, GET(6), 0xc040b340, 9 ) + STEP( G, c, d, a, b, GET(11), 0x265e5a51, 14 ) + STEP( G, b, c, d, a, GET(0), 0xe9b6c7aa, 20 ) + STEP( G, a, b, c, d, GET(5), 0xd62f105d, 5 ) + STEP( G, d, a, b, c, GET(10), 0x02441453, 9 ) + STEP( G, c, d, a, b, GET(15), 0xd8a1e681, 14 ) + STEP( G, b, c, d, a, GET(4), 0xe7d3fbc8, 20 ) + STEP( G, a, b, c, d, GET(9), 0x21e1cde6, 5 ) + STEP( G, d, a, b, c, GET(14), 0xc33707d6, 9 ) + STEP( G, c, d, a, b, GET(3), 0xf4d50d87, 14 ) + STEP( G, b, c, d, a, GET(8), 0x455a14ed, 20 ) + STEP( G, a, b, c, d, GET(13), 0xa9e3e905, 5 ) + STEP( G, d, a, b, c, GET(2), 0xfcefa3f8, 9 ) + STEP( G, c, d, a, b, GET(7), 0x676f02d9, 14 ) + STEP( G, b, c, d, a, GET(12), 0x8d2a4c8a, 20 ) + + // Round 3 + STEP( H, a, b, c, d, GET(5), 0xfffa3942, 4 ) + STEP( H, d, a, b, c, GET(8), 0x8771f681, 11 ) + STEP( H, c, d, a, b, GET(11), 0x6d9d6122, 16 ) + STEP( H, b, c, d, a, GET(14), 0xfde5380c, 23 ) + STEP( H, a, b, c, d, GET(1), 0xa4beea44, 4 ) + STEP( H, d, a, b, c, GET(4), 0x4bdecfa9, 11 ) + STEP( H, c, d, a, b, GET(7), 0xf6bb4b60, 16 ) + STEP( H, b, c, d, a, GET(10), 0xbebfbc70, 23 ) + STEP( H, a, b, c, d, GET(13), 0x289b7ec6, 4 ) + STEP( H, d, a, b, c, GET(0), 0xeaa127fa, 11 ) + STEP( H, c, d, a, b, GET(3), 0xd4ef3085, 16 ) + STEP( H, b, c, d, a, GET(6), 0x04881d05, 23 ) + STEP( H, a, b, c, d, GET(9), 0xd9d4d039, 4 ) + STEP( H, d, a, b, c, GET(12), 0xe6db99e5, 11 ) + STEP( H, c, d, a, b, GET(15), 0x1fa27cf8, 16 ) + STEP( H, b, c, d, a, GET(2), 0xc4ac5665, 23 ) + + // Round 4 + STEP( I, a, b, c, d, GET(0), 0xf4292244, 6 ) + STEP( I, d, a, b, c, GET(7), 0x432aff97, 10 ) + STEP( I, c, d, a, b, GET(14), 0xab9423a7, 15 ) + STEP( I, b, c, d, a, GET(5), 0xfc93a039, 21 ) + STEP( I, a, b, c, d, GET(12), 0x655b59c3, 6 ) + STEP( I, d, a, b, c, GET(3), 0x8f0ccc92, 10 ) + STEP( I, c, d, a, b, GET(10), 0xffeff47d, 15 ) + STEP( I, b, c, d, a, GET(1), 0x85845dd1, 21 ) + STEP( I, a, b, c, d, GET(8), 0x6fa87e4f, 6 ) + STEP( I, d, a, b, c, GET(15), 0xfe2ce6e0, 10 ) + STEP( I, c, d, a, b, GET(6), 0xa3014314, 15 ) + STEP( I, b, c, d, a, GET(13), 0x4e0811a1, 21 ) + STEP( I, a, b, c, d, GET(4), 0xf7537e82, 6 ) + STEP( I, d, a, b, c, GET(11), 0xbd3af235, 10 ) + STEP( I, c, d, a, b, GET(2), 0x2ad7d2bb, 15 ) + STEP( I, b, c, d, a, GET(9), 0xeb86d391, 21 ) + + a += saved_a; + b += saved_b; + c += saved_c; + d += saved_d; + + ptr += 64; + } while( size -= 64 ); + + ctx->a = a; + ctx->b = b; + ctx->c = c; + ctx->d = d; + + #undef GET + #undef SET + + return ptr; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// EXPORTED FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Md5Initialise +// +// Initialises an MD5 Context. Use this to initialise/reset a context. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void +Md5Initialise + ( + Md5Context* Context // [out] + ) +{ + Context->a = 0x67452301; + Context->b = 0xefcdab89; + Context->c = 0x98badcfe; + Context->d = 0x10325476; + + Context->lo = 0; + Context->hi = 0; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Md5Update +// +// Adds data to the MD5 context. This will process the data and update the internal state of the context. Keep on +// calling this function until all the data has been added. Then call Md5Finalise to calculate the hash. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void +Md5Update + ( + Md5Context* Context, // [in out] + void const* Buffer, // [in] + uint32_t BufferSize // [in] + ) +{ + uint32_t saved_lo; + uint32_t used; + uint32_t free; + + saved_lo = Context->lo; + if( (Context->lo = (saved_lo + BufferSize) & 0x1fffffff) < saved_lo ) + { + Context->hi++; + } + Context->hi += (uint32_t)( BufferSize >> 29 ); + + used = saved_lo & 0x3f; + + if( used ) + { + free = 64 - used; + + if( BufferSize < free ) + { + memcpy( &Context->buffer[used], Buffer, BufferSize ); + return; + } + + memcpy( &Context->buffer[used], Buffer, free ); + Buffer = (uint8_t*)Buffer + free; + BufferSize -= free; + TransformFunction(Context, Context->buffer, 64); + } + + if( BufferSize >= 64 ) + { + Buffer = TransformFunction( Context, Buffer, BufferSize & ~(unsigned long)0x3f ); + BufferSize &= 0x3f; + } + + memcpy( Context->buffer, Buffer, BufferSize ); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Md5Finalise +// +// Performs the final calculation of the hash and returns the digest (16 byte buffer containing 128bit hash). After +// calling this, Md5Initialised must be used to reuse the context. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void +Md5Finalise + ( + Md5Context* Context, // [in out] + MD5_HASH* Digest // [in] + ) +{ + uint32_t used; + uint32_t free; + + used = Context->lo & 0x3f; + + Context->buffer[used++] = 0x80; + + free = 64 - used; + + if(free < 8) + { + memset( &Context->buffer[used], 0, free ); + TransformFunction( Context, Context->buffer, 64 ); + used = 0; + free = 64; + } + + memset( &Context->buffer[used], 0, free - 8 ); + + Context->lo <<= 3; + Context->buffer[56] = (uint8_t)( Context->lo ); + Context->buffer[57] = (uint8_t)( Context->lo >> 8 ); + Context->buffer[58] = (uint8_t)( Context->lo >> 16 ); + Context->buffer[59] = (uint8_t)( Context->lo >> 24 ); + Context->buffer[60] = (uint8_t)( Context->hi ); + Context->buffer[61] = (uint8_t)( Context->hi >> 8 ); + Context->buffer[62] = (uint8_t)( Context->hi >> 16 ); + Context->buffer[63] = (uint8_t)( Context->hi >> 24 ); + + TransformFunction( Context, Context->buffer, 64 ); + + Digest->bytes[0] = (uint8_t)( Context->a ); + Digest->bytes[1] = (uint8_t)( Context->a >> 8 ); + Digest->bytes[2] = (uint8_t)( Context->a >> 16 ); + Digest->bytes[3] = (uint8_t)( Context->a >> 24 ); + Digest->bytes[4] = (uint8_t)( Context->b ); + Digest->bytes[5] = (uint8_t)( Context->b >> 8 ); + Digest->bytes[6] = (uint8_t)( Context->b >> 16 ); + Digest->bytes[7] = (uint8_t)( Context->b >> 24 ); + Digest->bytes[8] = (uint8_t)( Context->c ); + Digest->bytes[9] = (uint8_t)( Context->c >> 8 ); + Digest->bytes[10] = (uint8_t)( Context->c >> 16 ); + Digest->bytes[11] = (uint8_t)( Context->c >> 24 ); + Digest->bytes[12] = (uint8_t)( Context->d ); + Digest->bytes[13] = (uint8_t)( Context->d >> 8 ); + Digest->bytes[14] = (uint8_t)( Context->d >> 16 ); + Digest->bytes[15] = (uint8_t)( Context->d >> 24 ); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Md5Calculate +// +// Combines Md5Initialise, Md5Update, and Md5Finalise into one function. Calculates the MD5 hash of the buffer. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void +Md5Calculate + ( + void const* Buffer, // [in] + uint32_t BufferSize, // [in] + MD5_HASH* Digest // [in] + ) +{ + Md5Context context; + + Md5Initialise( &context ); + Md5Update( &context, Buffer, BufferSize ); + Md5Finalise( &context, Digest ); +} diff --git a/src/md5.h b/src/md5.h new file mode 100644 index 000000000..98eab9ac7 --- /dev/null +++ b/src/md5.h @@ -0,0 +1,96 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// WjCryptLib_Md5 +// +// Implementation of MD5 hash function. Originally written by Alexander Peslyak. Modified by WaterJuice retaining +// Public Domain license. +// +// This is free and unencumbered software released into the public domain - June 2013 waterjuice.org +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#pragma once + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TYPES +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Md5Context - This must be initialised using Md5Initialised. Do not modify the contents of this structure directly. +typedef struct +{ + uint32_t lo; + uint32_t hi; + uint32_t a; + uint32_t b; + uint32_t c; + uint32_t d; + uint8_t buffer[64]; + uint32_t block[16]; +} Md5Context; + +#define MD5_HASH_SIZE ( 128 / 8 ) + +typedef struct +{ + uint8_t bytes [MD5_HASH_SIZE]; +} MD5_HASH; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// PUBLIC FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Md5Initialise +// +// Initialises an MD5 Context. Use this to initialise/reset a context. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void +Md5Initialise + ( + Md5Context* Context // [out] + ); + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Md5Update +// +// Adds data to the MD5 context. This will process the data and update the internal state of the context. Keep on +// calling this function until all the data has been added. Then call Md5Finalise to calculate the hash. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void +Md5Update + ( + Md5Context* Context, // [in out] + void const* Buffer, // [in] + uint32_t BufferSize // [in] + ); + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Md5Finalise +// +// Performs the final calculation of the hash and returns the digest (16 byte buffer containing 128bit hash). After +// calling this, Md5Initialised must be used to reuse the context. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void +Md5Finalise + ( + Md5Context* Context, // [in out] + MD5_HASH* Digest // [in] + ); + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Md5Calculate +// +// Combines Md5Initialise, Md5Update, and Md5Finalise into one function. Calculates the MD5 hash of the buffer. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void +Md5Calculate + ( + void const* Buffer, // [in] + uint32_t BufferSize, // [in] + MD5_HASH* Digest // [in] + ); diff --git a/src/runtime.c b/src/runtime.c index 9f17ad78c..f49243b7b 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -49,6 +49,7 @@ #include "elf.h" #include "getsection.h" +#include "md5.h" #ifndef ENABLE_DLOPEN #define ENABLE_DLOPEN @@ -164,7 +165,7 @@ char* getArg(int argc, char *argv[],char chr) /* mkdir -p implemented in C, needed for https://github.com/AppImage/AppImageKit/issues/333 * https://gist.github.com/JonathonReinhart/8c0d90191c38af2dcadb102c4e202950 */ int -mkdir_p(const char *path) +mkdir_p(const char* const path) { /* Adapted from http://stackoverflow.com/a/2336245/119527 */ const size_t len = strlen(path); @@ -583,21 +584,37 @@ int main (int argc, char *argv[]) { if (TMPDIR != NULL) strcpy(temp_base, getenv("TMPDIR")); - const char target_dir[] = "appimage_extracted_XXXXXX"; + char* hexlified_digest; - char* template = malloc(strlen(temp_base) + 1 + strlen(target_dir) + 2); - strcpy(template, temp_base); - strcat(template, "/"); - strcat(template, target_dir); + // calculate MD5 hash of file, and use it to make extracted directory name "content-aware" + // see https://github.com/AppImage/AppImageKit/issues/841 for more information + { + FILE* f = fopen(appimage_path, "rb"); + if (f == NULL) { + perror("Failed to open AppImage file"); + exit(1); + } - char* prefix = mkdtemp(template); + Md5Context ctx; + Md5Initialise(&ctx); - if (template != prefix) { - int error = errno; - fprintf(stderr, "Failed to create temporary directory: %s\n", strerror(error)); - exit(1); + char buf[4096]; + for (size_t bytes_read; (bytes_read = fread(buf, sizeof(char), sizeof(buf), f)); bytes_read > 0) { + Md5Update(&ctx, buf, (uint32_t) bytes_read); + } + + MD5_HASH digest; + Md5Finalise(&ctx, &digest); + + hexlified_digest = appimage_hexlify(digest.bytes, sizeof(digest.bytes)); } + char* prefix = malloc(strlen(temp_base) + 20 + strlen(hexlified_digest) + 2); + strcpy(prefix, temp_base); + strcat(prefix, "/appimage_extracted_"); + strcat(prefix, hexlified_digest); + free(hexlified_digest); + if (!extract_appimage(appimage_path, prefix)) { fprintf(stderr, "Failed to extract AppImage\n"); exit(1); From 3fe7b87d23839a7386348212eb4e21918b8e8ae4 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 17 Aug 2018 00:30:09 +0200 Subject: [PATCH 333/544] Restore pattern matching --- src/runtime.c | 177 +++++++++++++++++++++++++------------------------- 1 file changed, 89 insertions(+), 88 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index f49243b7b..2497cddab 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -46,6 +46,7 @@ #include #include #include +#include #include "elf.h" #include "getsection.h" @@ -266,7 +267,7 @@ portable_option(const char *arg, const char *appimage_path, const char *name) } } -bool extract_appimage(const char* const appimage_path, const char* const _prefix) { +bool extract_appimage(const char* const appimage_path, const char* const _prefix, const char* const _pattern) { sqfs_err err = SQFS_OK; sqfs_traverse trv; sqfs fs; @@ -310,96 +311,98 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix while (sqfs_traverse_next(&trv, &err)) { if (!trv.dir_end) { - // fprintf(stderr, "trv.path: %s\n", trv.path); - // fprintf(stderr, "sqfs_inode_id: %lu\n", trv.entry.inode); - sqfs_inode inode; - if (sqfs_inode_get(&fs, &inode, trv.entry.inode)) { - fprintf(stderr, "sqfs_inode_get error\n"); - rv = false; - break; - } - // fprintf(stderr, "inode.base.inode_type: %i\n", inode.base.inode_type); - // fprintf(stderr, "inode.xtra.reg.file_size: %lu\n", inode.xtra.reg.file_size); - strcpy(prefixed_path_to_extract, ""); - strcat(strcat(prefixed_path_to_extract, prefix), trv.path); - fprintf(stderr, "%s\n", prefixed_path_to_extract); - if (inode.base.inode_type == SQUASHFS_DIR_TYPE || inode.base.inode_type == SQUASHFS_LDIR_TYPE) { - // fprintf(stderr, "inode.xtra.dir.parent_inode: %ui\n", inode.xtra.dir.parent_inode); - // fprintf(stderr, "mkdir_p: %s/\n", prefixed_path_to_extract); - if (access(prefixed_path_to_extract, F_OK) == -1) { - if (mkdir_p(prefixed_path_to_extract) == -1) { - perror("mkdir_p error"); - rv = false; - break; - } + if (_pattern == NULL || fnmatch(_pattern, trv.path, FNM_FILE_NAME) == 0) { + // fprintf(stderr, "trv.path: %s\n", trv.path); + // fprintf(stderr, "sqfs_inode_id: %lu\n", trv.entry.inode); + sqfs_inode inode; + if (sqfs_inode_get(&fs, &inode, trv.entry.inode)) { + fprintf(stderr, "sqfs_inode_get error\n"); + rv = false; + break; } - } else if (inode.base.inode_type == SQUASHFS_REG_TYPE || inode.base.inode_type == SQUASHFS_LREG_TYPE) { - // if we've already created this inode, then this is a hardlink - char* existing_path_for_inode = created_inode[inode.base.inode_number - 1]; - if (existing_path_for_inode != NULL) { - unlink(prefixed_path_to_extract); - if (link(existing_path_for_inode, prefixed_path_to_extract) == -1) { - fprintf(stderr, "Couldn't create hardlink from \"%s\" to \"%s\": %s\n", - prefixed_path_to_extract, existing_path_for_inode, strerror(errno)); + // fprintf(stderr, "inode.base.inode_type: %i\n", inode.base.inode_type); + // fprintf(stderr, "inode.xtra.reg.file_size: %lu\n", inode.xtra.reg.file_size); + strcpy(prefixed_path_to_extract, ""); + strcat(strcat(prefixed_path_to_extract, prefix), trv.path); + fprintf(stderr, "%s\n", prefixed_path_to_extract); + if (inode.base.inode_type == SQUASHFS_DIR_TYPE || inode.base.inode_type == SQUASHFS_LDIR_TYPE) { + // fprintf(stderr, "inode.xtra.dir.parent_inode: %ui\n", inode.xtra.dir.parent_inode); + // fprintf(stderr, "mkdir_p: %s/\n", prefixed_path_to_extract); + if (access(prefixed_path_to_extract, F_OK) == -1) { + if (mkdir_p(prefixed_path_to_extract) == -1) { + perror("mkdir_p error"); + rv = false; + break; + } + } + } else if (inode.base.inode_type == SQUASHFS_REG_TYPE || inode.base.inode_type == SQUASHFS_LREG_TYPE) { + // if we've already created this inode, then this is a hardlink + char* existing_path_for_inode = created_inode[inode.base.inode_number - 1]; + if (existing_path_for_inode != NULL) { + unlink(prefixed_path_to_extract); + if (link(existing_path_for_inode, prefixed_path_to_extract) == -1) { + fprintf(stderr, "Couldn't create hardlink from \"%s\" to \"%s\": %s\n", + prefixed_path_to_extract, existing_path_for_inode, strerror(errno)); + rv = false; + break; + } else { + continue; + } + } + // track the path we extract to for this inode, so that we can `link` if this inode is found again + created_inode[inode.base.inode_number - 1] = strdup(prefixed_path_to_extract); + // fprintf(stderr, "Extract to: %s\n", prefixed_path_to_extract); + if (private_sqfs_stat(&fs, &inode, &st) != 0) + die("private_sqfs_stat error"); + // Read the file in chunks + off_t bytes_already_read = 0; + sqfs_off_t bytes_at_a_time = 64 * 1024; + FILE* f; + f = fopen(prefixed_path_to_extract, "w+"); + if (f == NULL) { + perror("fopen error"); rv = false; break; - } else { - continue; } - } - // track the path we extract to for this inode, so that we can `link` if this inode is found again - created_inode[inode.base.inode_number - 1] = strdup(prefixed_path_to_extract); - // fprintf(stderr, "Extract to: %s\n", prefixed_path_to_extract); - if (private_sqfs_stat(&fs, &inode, &st) != 0) - die("private_sqfs_stat error"); - // Read the file in chunks - off_t bytes_already_read = 0; - sqfs_off_t bytes_at_a_time = 64 * 1024; - FILE* f; - f = fopen(prefixed_path_to_extract, "w+"); - if (f == NULL) { - perror("fopen error"); - rv = false; - break; - } - while (bytes_already_read < inode.xtra.reg.file_size) { - char buf[bytes_at_a_time]; - if (sqfs_read_range(&fs, &inode, (sqfs_off_t) bytes_already_read, &bytes_at_a_time, buf)) { - perror("sqfs_read_range error"); - fclose(f); + while (bytes_already_read < inode.xtra.reg.file_size) { + char buf[bytes_at_a_time]; + if (sqfs_read_range(&fs, &inode, (sqfs_off_t) bytes_already_read, &bytes_at_a_time, buf)) { + perror("sqfs_read_range error"); + fclose(f); + rv = false; + break; + } + // fwrite(buf, 1, bytes_at_a_time, stdout); + fwrite(buf, 1, bytes_at_a_time, f); + bytes_already_read = bytes_already_read + bytes_at_a_time; + } + fclose(f); + chmod(prefixed_path_to_extract, st.st_mode); + if (!rv) + break; + } else if (inode.base.inode_type == SQUASHFS_SYMLINK_TYPE) { + size_t size; + sqfs_readlink(&fs, &inode, NULL, &size); + char buf[size]; + int ret = sqfs_readlink(&fs, &inode, buf, &size); + if (ret != 0) { + perror("symlink error"); rv = false; break; } - // fwrite(buf, 1, bytes_at_a_time, stdout); - fwrite(buf, 1, bytes_at_a_time, f); - bytes_already_read = bytes_already_read + bytes_at_a_time; + // fprintf(stderr, "Symlink: %s to %s \n", prefixed_path_to_extract, buf); + unlink(prefixed_path_to_extract); + ret = symlink(buf, prefixed_path_to_extract); + if (ret != 0) + fprintf(stderr, "WARNING: could not create symlink\n"); + } else { + fprintf(stderr, "TODO: Implement inode.base.inode_type %i\n", inode.base.inode_type); } - fclose(f); - chmod(prefixed_path_to_extract, st.st_mode); + // fprintf(stderr, "\n"); + if (!rv) break; - } else if (inode.base.inode_type == SQUASHFS_SYMLINK_TYPE) { - size_t size; - sqfs_readlink(&fs, &inode, NULL, &size); - char buf[size]; - int ret = sqfs_readlink(&fs, &inode, buf, &size); - if (ret != 0) { - perror("symlink error"); - rv = false; - break; - } - // fprintf(stderr, "Symlink: %s to %s \n", prefixed_path_to_extract, buf); - unlink(prefixed_path_to_extract); - ret = symlink(buf, prefixed_path_to_extract); - if (ret != 0) - fprintf(stderr, "WARNING: could not create symlink\n"); - } else { - fprintf(stderr, "TODO: Implement inode.base.inode_type %i\n", inode.base.inode_type); } - // fprintf(stderr, "\n"); - - if (!rv) - break; } } for (int i = 0; i < fs.sb.inodes; i++) { @@ -555,22 +558,20 @@ int main (int argc, char *argv[]) { /* extract the AppImage */ if(arg && strcmp(arg,"appimage-extract")==0) { - char default_prefix[] = "squashfs-root/"; - - char* prefix = NULL; + char* pattern; // default use case: use standard prefix if (argc == 2) { - prefix = default_prefix; + pattern = NULL; } else if (argc == 3) { - prefix = argv[2]; + pattern = argv[2]; } else { - fprintf(stderr, "Unexpected argument count: %d\n", argc-1); + fprintf(stderr, "Unexpected argument count: %d\n", argc - 1); fprintf(stderr, "Usage: %s --appimage-extract []\n", argv0_path); exit(1); } - if (!extract_appimage(appimage_path, prefix)) { + if (!extract_appimage(appimage_path, "squashfs-root/", pattern)) { exit(1); } @@ -615,7 +616,7 @@ int main (int argc, char *argv[]) { strcat(prefix, hexlified_digest); free(hexlified_digest); - if (!extract_appimage(appimage_path, prefix)) { + if (!extract_appimage(appimage_path, prefix, NULL)) { fprintf(stderr, "Failed to extract AppImage\n"); exit(1); } From 3916d00df759c5a8519c3a54d2dd230e13c5d03e Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 17 Aug 2018 00:34:00 +0200 Subject: [PATCH 334/544] Add note about pattern matching to help text --- src/runtime.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index 2497cddab..9ea1e8e9e 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -211,7 +211,8 @@ print_help(const char *appimage_path) // TODO: "--appimage-list List content from embedded filesystem image\n" printf( "AppImage options:\n\n" - " --appimage-extract Extract content from embedded filesystem image\n" + " --appimage-extract [] Extract content from embedded filesystem image\n" + " If pattern is passed, only extract matching files\n" " --appimage-help Print this help\n" " --appimage-mount Mount embedded filesystem image and print\n" " mount point and wait for kill with Ctrl-C\n" From b4ca0085e5bcc1e77058a71107e9bf5f67dd8d6a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 17 Aug 2018 00:49:14 +0200 Subject: [PATCH 335/544] Don't overwrite existing files Should speed up extraction on subsequent calls when using NO_CLEANUP in the future. --- src/runtime.c | 66 +++++++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 9ea1e8e9e..cc3f8323c 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -268,7 +268,7 @@ portable_option(const char *arg, const char *appimage_path, const char *name) } } -bool extract_appimage(const char* const appimage_path, const char* const _prefix, const char* const _pattern) { +bool extract_appimage(const char* const appimage_path, const char* const _prefix, const char* const _pattern, const bool overwrite) { sqfs_err err = SQFS_OK; sqfs_traverse trv; sqfs fs; @@ -349,38 +349,42 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix } else { continue; } - } - // track the path we extract to for this inode, so that we can `link` if this inode is found again - created_inode[inode.base.inode_number - 1] = strdup(prefixed_path_to_extract); - // fprintf(stderr, "Extract to: %s\n", prefixed_path_to_extract); - if (private_sqfs_stat(&fs, &inode, &st) != 0) - die("private_sqfs_stat error"); - // Read the file in chunks - off_t bytes_already_read = 0; - sqfs_off_t bytes_at_a_time = 64 * 1024; - FILE* f; - f = fopen(prefixed_path_to_extract, "w+"); - if (f == NULL) { - perror("fopen error"); - rv = false; - break; - } - while (bytes_already_read < inode.xtra.reg.file_size) { - char buf[bytes_at_a_time]; - if (sqfs_read_range(&fs, &inode, (sqfs_off_t) bytes_already_read, &bytes_at_a_time, buf)) { - perror("sqfs_read_range error"); - fclose(f); + } else { + if (!overwrite && access(prefixed_path_to_extract, F_OK) == 0) + continue; + + // track the path we extract to for this inode, so that we can `link` if this inode is found again + created_inode[inode.base.inode_number - 1] = strdup(prefixed_path_to_extract); + // fprintf(stderr, "Extract to: %s\n", prefixed_path_to_extract); + if (private_sqfs_stat(&fs, &inode, &st) != 0) + die("private_sqfs_stat error"); + // Read the file in chunks + off_t bytes_already_read = 0; + sqfs_off_t bytes_at_a_time = 64 * 1024; + FILE* f; + f = fopen(prefixed_path_to_extract, "w+"); + if (f == NULL) { + perror("fopen error"); rv = false; break; } - // fwrite(buf, 1, bytes_at_a_time, stdout); - fwrite(buf, 1, bytes_at_a_time, f); - bytes_already_read = bytes_already_read + bytes_at_a_time; + while (bytes_already_read < inode.xtra.reg.file_size) { + char buf[bytes_at_a_time]; + if (sqfs_read_range(&fs, &inode, (sqfs_off_t) bytes_already_read, &bytes_at_a_time, buf)) { + perror("sqfs_read_range error"); + fclose(f); + rv = false; + break; + } + // fwrite(buf, 1, bytes_at_a_time, stdout); + fwrite(buf, 1, bytes_at_a_time, f); + bytes_already_read = bytes_already_read + bytes_at_a_time; + } + fclose(f); + chmod(prefixed_path_to_extract, st.st_mode); + if (!rv) + break; } - fclose(f); - chmod(prefixed_path_to_extract, st.st_mode); - if (!rv) - break; } else if (inode.base.inode_type == SQUASHFS_SYMLINK_TYPE) { size_t size; sqfs_readlink(&fs, &inode, NULL, &size); @@ -572,7 +576,7 @@ int main (int argc, char *argv[]) { exit(1); } - if (!extract_appimage(appimage_path, "squashfs-root/", pattern)) { + if (!extract_appimage(appimage_path, "squashfs-root/", pattern, true)) { exit(1); } @@ -617,7 +621,7 @@ int main (int argc, char *argv[]) { strcat(prefix, hexlified_digest); free(hexlified_digest); - if (!extract_appimage(appimage_path, prefix, NULL)) { + if (!extract_appimage(appimage_path, prefix, NULL, false)) { fprintf(stderr, "Failed to extract AppImage\n"); exit(1); } From 8a9f67ec8182d2530dd53ebdf0fda6c157679c78 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 17 Aug 2018 00:49:37 +0200 Subject: [PATCH 336/544] Implement NO_CLEANUP --- src/runtime.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index cc3f8323c..48037d503 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -475,7 +475,7 @@ bool rm_recursive(const char* const path) { return rv == 0; } -int main (int argc, char *argv[]) { +int main(int argc, char *argv[]) { char appimage_path[PATH_MAX]; char argv0_path[PATH_MAX]; char * arg; @@ -657,17 +657,19 @@ int main (int argc, char *argv[]) { free(apprun_path); } - int child_rv = waitpid(pid, NULL, 0); + int rv = waitpid(pid, NULL, 0); - // TODO: implement NO_CLEANUP environment variable - // it doesn't make sense to implement it until we have "predictable target directories" which can be used to - // speed up subsequent calls by not extracting the files again - rm_recursive(prefix); + if (getenv("NO_CLEANUP") == NULL) { + if (!rm_recursive(prefix)) { + fprintf(stderr, "Failed to clean up cache directory\n"); + rv = false; + } + } // template == prefix, must be freed only once free(prefix); - exit(child_rv ? 0 : 1); + exit(rv ? 0 : 1); } if(arg && strcmp(arg,"appimage-version")==0) { From a39b12c0de4bbcfcd2e7908606a88e409efe4b80 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 17 Aug 2018 00:53:21 +0200 Subject: [PATCH 337/544] Also compare file sizes to make existence check more robust --- src/runtime.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index 48037d503..25e382782 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -350,8 +350,11 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix continue; } } else { - if (!overwrite && access(prefixed_path_to_extract, F_OK) == 0) + struct stat st; + if (!overwrite && stat(prefixed_path_to_extract, &st) == 0 && st.st_size == inode.xtra.reg.file_size) { + fprintf(stderr, "File exists and file size matches, skipping\n"); continue; + } // track the path we extract to for this inode, so that we can `link` if this inode is found again created_inode[inode.base.inode_number - 1] = strdup(prefixed_path_to_extract); From 99589f85d56f63f9219c4fceb682151fae19e0c0 Mon Sep 17 00:00:00 2001 From: Joshua Jackson Date: Sun, 19 Aug 2018 14:19:07 -0500 Subject: [PATCH 338/544] Typo (#843) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 156224b29..b048f6db3 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Both bundle not only the application itself, but also the required Qt libraries > We basically don't make binaries for Linux. Why? Because binaries for Linux desktop applications is a major f*ing pain in the ass. Right. You don't make binaries for Linux. You make binaries for Fedora 19, Fedora 20, maybe there's even like RHEL 5 from ten years ago, you make binaries for debian stable. -So why not use the same approach as on Windows and OS X, namely, treat the base operating system as a _platform_ on top of which we tun the application we care about. This means that we have to bundle the application with all their dependencies that are _not_ part of the base operating system. Welcome [application bundles](https://blogs.gnome.org/tvb/2013/12/10/application-bundles-for-glade/). +So why not use the same approach as on Windows and OS X, namely, treat the base operating system as a _platform_ on top of which we run the application we care about. This means that we have to bundle the application with all their dependencies that are _not_ part of the base operating system. Welcome [application bundles](https://blogs.gnome.org/tvb/2013/12/10/application-bundles-for-glade/). > Or actually you don't make binaries for debian stable because debian stable has libraries that are so old that anything that was built in the last century doesn't work. But you might make binaries for debian... whatever the codename is for unstable. And even that is a major pain because (...) debian has those rules that you are supposed to use shared libraries. Right. From 6470b9b8e9def5a77300c9d6a4563933f848514b Mon Sep 17 00:00:00 2001 From: Riceball LEE Date: Tue, 21 Aug 2018 00:52:46 +0800 Subject: [PATCH 339/544] * [bug] critical AppRun can not parse exe on desktop file: Error executing '' (#844) --- src/AppRun.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AppRun.c b/src/AppRun.c index acd997a60..876e313c6 100644 --- a/src/AppRun.c +++ b/src/AppRun.c @@ -77,7 +77,6 @@ int main(int argc, char *argv[]) { snprintf(desktop_file, LINE_SIZE, "%s/%s", appdir, namelist[0]->d_name); FILE *f = fopen(desktop_file, "r"); char *line = malloc(LINE_SIZE); - char *exe = line+5; size_t n = LINE_SIZE; do { @@ -85,6 +84,7 @@ int main(int argc, char *argv[]) { die("Executable not found, make sure there is a line starting with 'Exec='\n"); } while(strncmp(line, "Exec=", 5)); fclose(f); + char *exe = line+5; // parse arguments bool in_quotes = 0; @@ -195,7 +195,7 @@ int main(int argc, char *argv[]) { /* Run */ ret = execvp(exe, outargptrs); - + int error = errno; if (ret == -1) From 310bcd0ebc2833c1ac46b292021c636fce9ffd9d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 23 Aug 2018 12:46:00 +0200 Subject: [PATCH 340/544] Switch to new libappimage repository --- .gitmodules | 3 + CMakeLists.txt | 12 +- cmake/AppImageKitConfig.cmake.in | 25 - cmake/AppImageKitConfigVersion.cmake.in | 11 - cmake/FindINotify.cmake | 15 - cmake/dependencies.cmake | 307 +-- cmake/tools.cmake | 49 - include/appimage/appimage.h | 154 -- lib/CMakeLists.txt | 1 + lib/libappimage | 1 + squashfuse.patch | 57 - squashfuse_dlopen.c | 11 - squashfuse_dlopen.h | 262 -- squashfuse_dlopen.patch | 640 ----- src/CMakeLists.txt | 166 +- src/appimagetool.c | 2 - src/appimagetool_shared.c | 189 -- src/build-runtime.cmake | 14 +- src/digest.c | 2 +- src/elf.c | 146 -- src/getsection.c | 105 - src/getsection.h | 8 - src/hexlify.c | 18 - src/light_byteswap.h | 16 - src/md5.c | 335 --- src/md5.h | 96 - src/patch-squashfuse.sh.in | 8 - src/runtime.c | 10 +- src/shared.c | 2423 ------------------ src/shared.h | 100 - src/validate.c | 6 +- src/xdg-basedir/CMakeLists.txt | 17 - src/xdg-basedir/test-xdg-basedir.cpp | 166 -- src/xdg-basedir/xdg-basedir.c | 67 - src/xdg-basedir/xdg-basedir.h | 40 - tests/CMakeLists.txt | 102 - tests/data/AppImageExtract_6-x86_64.AppImage | Bin 655360 -> 0 bytes tests/data/Cura.desktop | 15 - tests/data/Echo-no-integrate-x86_64.AppImage | Bin 180128 -> 0 bytes tests/data/Echo-test1234-x86_64.AppImage | Bin 180128 -> 0 bytes tests/data/Echo-x86_64.AppImage | Bin 121752 -> 0 bytes tests/data/appimaged-i686.AppImage | Bin 230412 -> 0 bytes tests/data/appimagetool-x86_64.AppImage | Bin 528288 -> 0 bytes tests/fixtures.h | 184 -- tests/test_getsection.cpp | 66 - tests/test_libappimage.cpp | 451 ---- tests/test_shared.cpp | 264 -- 47 files changed, 43 insertions(+), 6521 deletions(-) delete mode 100644 cmake/AppImageKitConfig.cmake.in delete mode 100644 cmake/AppImageKitConfigVersion.cmake.in delete mode 100644 cmake/FindINotify.cmake delete mode 100644 cmake/tools.cmake delete mode 100644 include/appimage/appimage.h create mode 100644 lib/CMakeLists.txt create mode 160000 lib/libappimage delete mode 100644 squashfuse.patch delete mode 100644 squashfuse_dlopen.c delete mode 100644 squashfuse_dlopen.h delete mode 100644 squashfuse_dlopen.patch delete mode 100644 src/appimagetool_shared.c delete mode 100644 src/elf.c delete mode 100644 src/getsection.c delete mode 100644 src/getsection.h delete mode 100644 src/hexlify.c delete mode 100644 src/light_byteswap.h delete mode 100644 src/md5.c delete mode 100644 src/md5.h delete mode 100755 src/patch-squashfuse.sh.in delete mode 100644 src/shared.c delete mode 100644 src/shared.h delete mode 100644 src/xdg-basedir/CMakeLists.txt delete mode 100644 src/xdg-basedir/test-xdg-basedir.cpp delete mode 100644 src/xdg-basedir/xdg-basedir.c delete mode 100644 src/xdg-basedir/xdg-basedir.h delete mode 100644 tests/CMakeLists.txt delete mode 100755 tests/data/AppImageExtract_6-x86_64.AppImage delete mode 100644 tests/data/Cura.desktop delete mode 100755 tests/data/Echo-no-integrate-x86_64.AppImage delete mode 100755 tests/data/Echo-test1234-x86_64.AppImage delete mode 100755 tests/data/Echo-x86_64.AppImage delete mode 100755 tests/data/appimaged-i686.AppImage delete mode 100755 tests/data/appimagetool-x86_64.AppImage delete mode 100644 tests/fixtures.h delete mode 100644 tests/test_getsection.cpp delete mode 100644 tests/test_libappimage.cpp delete mode 100644 tests/test_shared.cpp diff --git a/.gitmodules b/.gitmodules index 9c36da2a9..a5daa46d3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "cmake/sanitizers-cmake"] path = cmake/sanitizers-cmake url = https://github.com/arsenm/sanitizers-cmake +[submodule "lib/libappimage"] + path = lib/libappimage + url = https://github.com/AppImage/libappimage.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e4f572b0..219f4b75e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,10 +65,10 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake) -# find paths to tools, incorporating optional TOOLS_PREFIX -include(cmake/tools.cmake) - # configure dependencies +add_subdirectory(lib) + +include(lib/libappimage/cmake/tools.cmake) include(cmake/dependencies.cmake) @@ -89,9 +89,3 @@ set(APPIMAGEKIT_PACKAGE_DEBS FALSE CACHE BOOL "") if(APPIMAGEKIT_PACKAGE_DEBS) include(cmake/cpack_debs.cmake) endif() - -################################ -# unit and functionality tests # -################################ - -add_subdirectory(tests) diff --git a/cmake/AppImageKitConfig.cmake.in b/cmake/AppImageKitConfig.cmake.in deleted file mode 100644 index c2643fc4b..000000000 --- a/cmake/AppImageKitConfig.cmake.in +++ /dev/null @@ -1,25 +0,0 @@ -# - Config file for the AppImage package -# It defines the following variables -# APPIMAGEKIT_INCLUDE_DIRS - include directories for APPIMAGE -# APPIMAGEKIT_LIBRARIES - libraries to link against - -# Compute paths -get_filename_component(APPIMAGEKIT_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) -set(APPIMAGEKIT_INCLUDE_DIRS "@CONF_INCLUDE_DIRS@") - -# Our library dependencies (contains definitions for IMPORTED targets) -include("${APPIMAGEKIT_CMAKE_DIR}/AppImageKitTargets.cmake") - -find_package(PkgConfig REQUIRED) -pkg_check_modules(GLIB REQUIRED glib-2.0) -pkg_check_modules(GIO REQUIRED gio-2.0) -pkg_check_modules(ZLIB REQUIRED zlib) -pkg_check_modules(CAIRO REQUIRED cairo) -pkg_check_modules(OPENSSL REQUIRED openssl) - -find_library(LIBAPPIMAGE_SHARED_PATH - NAMES appimage - HINTS "${CMAKE_PREFIX_PATH}" -) - -set(APPIMAGEKIT_LIBRARIES ${LIBAPPIMAGE_SHARED_PATH}) \ No newline at end of file diff --git a/cmake/AppImageKitConfigVersion.cmake.in b/cmake/AppImageKitConfigVersion.cmake.in deleted file mode 100644 index a55ea6801..000000000 --- a/cmake/AppImageKitConfigVersion.cmake.in +++ /dev/null @@ -1,11 +0,0 @@ -set(PACKAGE_VERSION "@GIT_COMMIT@") - -# Check whether the requested PACKAGE_FIND_VERSION is compatible -if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") - set(PACKAGE_VERSION_COMPATIBLE FALSE) -else() - set(PACKAGE_VERSION_COMPATIBLE TRUE) - if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") - set(PACKAGE_VERSION_EXACT TRUE) - endif() -endif() diff --git a/cmake/FindINotify.cmake b/cmake/FindINotify.cmake deleted file mode 100644 index f8bfb84f7..000000000 --- a/cmake/FindINotify.cmake +++ /dev/null @@ -1,15 +0,0 @@ -find_path(INOTIFYTOOLS_INCLUDE_DIR sys/inotify.h PATH_SUFFIXES inotify) -mark_as_advanced(INOTIFYTOOLS_INCLUDE_DIR) - -find_library(INOTIFYTOOLS_LIBRARY inotifytools PATH_SUFFIXES lib/inotify) - -get_filename_component(INOTIFYTOOLS_LIBRARY_DIR ${INOTIFYTOOLS_LIBRARY} PATH) -mark_as_advanced(INOTIFYTOOLS_LIBRARY_DIR) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(INOTIFYTOOLS DEFAULT_MSG INOTIFYTOOLS_INCLUDE_DIR INOTIFYTOOLS_LIBRARY_DIR) - -IF(INOTIFYTOOLS_FOUND) - SET(INOTIFYTOOLS_INCLUDE_DIRS ${INOTIFYTOOLS_INCLUDE_DIR}) - SET(INOTIFYTOOLS_LIBRARY_DIRS ${INOTIFYTOOLS_LIBRARY_DIR}) -ENDIF(INOTIFYTOOLS_FOUND) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index ea133a39a..02190dc11 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -2,189 +2,13 @@ cmake_minimum_required(VERSION 3.2) -# imports a library from the standard set of variables CMake creates when using its pkg-config module or find_package -# this is code shared by import_pkgconfig_target and import_external_project, hence it's been extracted into a separate -# CMake function -# -# partly inspired by https://github.com/Kitware/CMake/blob/master/Modules/FindPkgConfig.cmake#L187 -# -# positional parameters: -# - target_name: name of the target that should be created -# - variable_prefix: prefix of the variable that should be used to create the target from -function(import_library_from_prefix target_name variable_prefix) - if(TARGET ${target_name}) - message(WARNING "Target exists already, skipping") - return() - endif() - - add_library(${target_name} INTERFACE IMPORTED GLOBAL) - - # FIXME: the following line produces CMake errors "directory not found" - # CMake does, however, not complain if the INCLUDE_DIRECTORIES property contains missing directories - # possibly related: https://cmake.org/Bug/view.php?id=15052 - #set_property(TARGET ${target_name} PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${variable_prefix}_INCLUDE_DIRS) - include_directories(${${variable_prefix}_INCLUDE_DIRS}) - - set_property(TARGET ${target_name} PROPERTY INTERFACE_LINK_LIBRARIES ${${variable_prefix}_LIBRARIES}) - - if(${variable_prefix}_CFLAGS_OTHER) - set_property(TARGET ${target_name} PROPERTY INTERFACE_COMPILE_OPTIONS ${${variable_prefix}_CFLAGS_OTHER}) - endif() - - if(${variable_prefix}_LIBRARY_DIRS) - link_directories(${${variable_prefix}_LIBRARY_DIRS}) - endif() - - # export some of the imported properties with the target name as prefix - # this is necessary to allow the other external projects, which are not built with CMake or not within the same - # CMake context, to link to the libraries built as external projects (or the system ones, depending on the build - # configuration) - set(${target_name}_INCLUDE_DIRS ${${variable_prefix}_INCLUDE_DIRS} CACHE INTERNAL "") - set(${target_name}_LIBRARIES ${${variable_prefix}_LIBRARIES} CACHE INTERNAL "") - set(${target_name}_LIBRARY_DIRS ${${variable_prefix}_LIBRARY_DIRS} CACHE INTERNAL "") - # TODO: the following might not always apply - set(${target_name}_PREFIX ${CMAKE_INSTALL_PREFIX}/lib CACHE INTERNAL "") -endfunction() - - -# imports a library using pkg-config -# -# positional parameters: -# - target_name: name of the target that we shall create for you -# - pkg_config_target: librar(y name to pass to pkg-config (may include a version) -function(import_pkgconfig_target) - set(keywords STATIC) - set(oneValueArgs TARGET_NAME PKGCONFIG_TARGET) - cmake_parse_arguments(IMPORT_PKGCONFIG_TARGET "${keywords}" "${oneValueArgs}" "" "${ARGN}") - - # check whether parameters have been set - if(NOT IMPORT_PKGCONFIG_TARGET_TARGET_NAME) - message(FATAL_ERROR "TARGET_NAME parameter missing, but is required") - endif() - if(NOT IMPORT_PKGCONFIG_TARGET_PKGCONFIG_TARGET) - message(FATAL_ERROR "PKGCONFIG_TARGET parameter missing, but is required") - endif() - - find_package(PkgConfig REQUIRED) - - set(type "shared") - if(IMPORT_PKGCONFIG_TARGET_STATIC) - set(type "static") - endif() - - message(STATUS "Importing target ${IMPORT_PKGCONFIG_TARGET_TARGET_NAME} via pkg-config (${IMPORT_PKGCONFIG_TARGET_PKGCONFIG_TARGET}, ${type})") - - pkg_check_modules(${IMPORT_PKGCONFIG_TARGET_TARGET_NAME}-IMPORTED REQUIRED ${IMPORT_PKGCONFIG_TARGET_PKGCONFIG_TARGET}) - - if(IMPORT_PKGCONFIG_TARGET_STATIC) - set(prefix ${IMPORT_PKGCONFIG_TARGET_TARGET_NAME}-IMPORTED_STATIC) - else() - set(prefix ${IMPORT_PKGCONFIG_TARGET_TARGET_NAME}-IMPORTED) - endif() - - import_library_from_prefix(${IMPORT_PKGCONFIG_TARGET_TARGET_NAME} ${prefix}) -endfunction() - -function(import_find_pkg_target target_name pkg_name variable_prefix) - message(STATUS "Importing target ${target_name} via find_package (${pkg_name})") - - find_package(${pkg_name}) - if(NOT ${variable_prefix}_FOUND) - message(FATAL_ERROR "${pkg_name} could not be found on the system. You will have to either install it, or use the bundled package.") - endif() - - import_library_from_prefix(${target_name} ${variable_prefix}) -endfunction() - - -# imports a library from an existing external project -# -# required parameters: -# - TARGET_NAME: -function(import_external_project) - set(oneValueArgs TARGET_NAME EXT_PROJECT_NAME) - set(multiValueArgs LIBRARIES INCLUDE_DIRS LIBRARY_DIRS) - cmake_parse_arguments(IMPORT_EXTERNAL_PROJECT "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") - - # check whether parameters have been set - if(NOT IMPORT_EXTERNAL_PROJECT_TARGET_NAME) - message(FATAL_ERROR "TARGET_NAME parameter missing, but is required") - endif() - if(NOT IMPORT_EXTERNAL_PROJECT_EXT_PROJECT_NAME) - message(FATAL_ERROR "EXT_PROJECT_NAME parameter missing, but is required") - endif() - if(NOT IMPORT_EXTERNAL_PROJECT_LIBRARIES) - message(FATAL_ERROR "LIBRARIES parameter missing, but is required") - endif() - if(NOT IMPORT_EXTERNAL_PROJECT_INCLUDE_DIRS) - message(FATAL_ERROR "INCLUDE_DIRS parameter missing, but is required") - endif() - - if(TARGET ${target_name}) - message(WARNING "Target exists already, skipping") - return() - endif() - - add_library(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME} INTERFACE IMPORTED GLOBAL) - - ExternalProject_Get_Property(${IMPORT_EXTERNAL_PROJECT_EXT_PROJECT_NAME} SOURCE_DIR) - ExternalProject_Get_Property(${IMPORT_EXTERNAL_PROJECT_EXT_PROJECT_NAME} INSTALL_DIR) - - # "evaluate" patterns in the passed arguments by using some string replacing magic - # this makes it easier to use this function, as some external project properties don't need to be evaluated and - # passed beforehand, and should reduce the amount of duplicate code in this file - foreach(item ITEMS - IMPORT_EXTERNAL_PROJECT_EXT_PROJECT_NAME - IMPORT_EXTERNAL_PROJECT_LIBRARIES - IMPORT_EXTERNAL_PROJECT_INCLUDE_DIRS - IMPORT_EXTERNAL_PROJECT_LIBRARY_DIRS) - - # create new variable with fixed string... - string(REPLACE "" "${SOURCE_DIR}" ${item}-out "${${item}}") - # ... and set the original value to the new value - set(${item} "${${item}-out}") - - # create new variable with fixed string... - string(REPLACE "" "${INSTALL_DIR}" ${item}-out "${${item}}") - # ... and set the original value to the new value - set(${item} "${${item}-out}") - endforeach() - - set_property(TARGET ${IMPORT_EXTERNAL_PROJECT_TARGET_NAME} PROPERTY INTERFACE_LINK_LIBRARIES "${IMPORT_EXTERNAL_PROJECT_LIBRARIES}") - - # FIXME: the following line produces CMake errors "directory not found" - # CMake does, however, not complain if the INCLUDE_DIRECTORIES property contains missing directories - # possibly related: https://cmake.org/Bug/view.php?id=15052 - #set_property(TARGET ${IMPORT_EXTERNAL_PROJECT_TARGET_NAME} PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${IMPORT_EXTERNAL_PROJECT_INCLUDE_DIRS}) - include_directories(${IMPORT_EXTERNAL_PROJECT_INCLUDE_DIRS}) - - if(${IMPORT_EXTERNAL_PROJECT_LIBRARY_DIRS}) - link_directories(${IMPORT_EXTERNAL_PROJECT_LIBRARY_DIRS}) - endif() - - # finally, add a depenceny on the external project to make sure it's built - add_dependencies(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME} "${IMPORT_EXTERNAL_PROJECT_EXT_PROJECT_NAME}") - - # read external project properties, and export them with the target name as prefix - # this is necessary to allow the other external projects, which are not built with CMake or not within the same - # CMake context, to link to the libraries built as external projects (or the system ones, depending on the build - # configuration) - set(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME}_INCLUDE_DIRS "${IMPORT_EXTERNAL_PROJECT_INCLUDE_DIRS}" CACHE INTERNAL "") - set(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME}_LIBRARIES "${IMPORT_EXTERNAL_PROJECT_LIBRARIES}" CACHE INTERNAL "") - set(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME}_LIBRARY_DIRS "${IMPORT_EXTERNAL_PROJECT_LIBRARY_DIRS}" CACHE INTERNAL "") - set(${IMPORT_EXTERNAL_PROJECT_TARGET_NAME}_PREFIX ${INSTALL_DIR} CACHE INTERNAL "") -endfunction() +include(${PROJECT_SOURCE_DIR}/lib/libappimage/cmake/scripts.cmake) # the names of the targets need to differ from the library filenames # this is especially an issue with libcairo, where the library is called libcairo # therefore, all libs imported this way have been prefixed with lib -import_pkgconfig_target(TARGET_NAME libglib PKGCONFIG_TARGET glib-2.0>=2.40) -import_pkgconfig_target(TARGET_NAME libgobject PKGCONFIG_TARGET gobject-2.0>=2.40) -import_pkgconfig_target(TARGET_NAME libgio PKGCONFIG_TARGET gio-2.0>=2.40) -import_pkgconfig_target(TARGET_NAME libzlib PKGCONFIG_TARGET zlib) -import_pkgconfig_target(TARGET_NAME libcairo PKGCONFIG_TARGET cairo) -import_pkgconfig_target(TARGET_NAME libopenssl PKGCONFIG_TARGET openssl) +import_pkgconfig_target(TARGET_NAME libssl PKGCONFIG_TARGET openssl) import_pkgconfig_target(TARGET_NAME libfuse PKGCONFIG_TARGET fuse) @@ -205,69 +29,6 @@ set(CPPFLAGS ${DEPENDENCIES_CPPFLAGS}) set(LDFLAGS ${DEPENDENCIES_LDFLAGS}) -set(USE_SYSTEM_XZ OFF CACHE BOOL "Use system xz/liblzma instead of building our own") - -if(NOT USE_SYSTEM_XZ) - message(STATUS "Downloading and building xz") - - ExternalProject_Add(xz-EXTERNAL - URL https://netcologne.dl.sourceforge.net/project/lzmautils/xz-5.2.3.tar.gz - URL_HASH SHA512=a5eb4f707cf31579d166a6f95dbac45cf7ea181036d1632b4f123a4072f502f8d57cd6e7d0588f0bf831a07b8fc4065d26589a25c399b95ddcf5f73435163da6 - CONFIGURE_COMMAND CC=${CC} CXX=${CXX} CFLAGS=${CFLAGS} CPPFLAGS=${CPPFLAGS} LDFLAGS=${LDFLAGS} /configure --with-pic --disable-shared --enable-static --prefix= --libdir=/lib ${EXTRA_CONFIGURE_FLAGS} - BUILD_COMMAND ${MAKE} - INSTALL_COMMAND ${MAKE} install - ) - - import_external_project( - TARGET_NAME xz - EXT_PROJECT_NAME xz-EXTERNAL - LIBRARY_DIRS /lib/ - LIBRARIES "/lib/liblzma.a" - INCLUDE_DIRS "/src/liblzma/api/" - ) -else() - message(STATUS "Using system xz") - - import_pkgconfig_target(TARGET_NAME xz PKGCONFIG_TARGET liblzma STATIC) -endif() - - -# as distros don't provide suitable squashfuse and squashfs-tools, those dependencies are bundled in, can, and should -# be used from this repository -# TODO: implement out-of-source builds for squashfuse, as for the other dependencies -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/src/patch-squashfuse.sh.in - ${CMAKE_CURRENT_BINARY_DIR}/patch-squashfuse.sh - @ONLY -) - -ExternalProject_Add(squashfuse-EXTERNAL - GIT_REPOSITORY https://github.com/vasi/squashfuse/ - GIT_TAG 1f98030 - UPDATE_COMMAND "" # make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time - PATCH_COMMAND bash -xe ${CMAKE_CURRENT_BINARY_DIR}/patch-squashfuse.sh - CONFIGURE_COMMAND ${LIBTOOLIZE} --force - COMMAND env ACLOCAL_FLAGS="-I /usr/share/aclocal" aclocal - COMMAND ${AUTOHEADER} - COMMAND ${AUTOMAKE} --force-missing --add-missing - COMMAND ${AUTORECONF} -fi || true - COMMAND ${SED} -i "/PKG_CHECK_MODULES.*/,/,:./d" configure # https://github.com/vasi/squashfuse/issues/12 - COMMAND ${SED} -i "s/typedef off_t sqfs_off_t/typedef int64_t sqfs_off_t/g" common.h # off_t's size might differ, see https://stackoverflow.com/a/9073762 - COMMAND CC=${CC} CXX=${CXX} CFLAGS=${CFLAGS} LDFLAGS=${LDFLAGS} /configure --disable-demo --disable-high-level --without-lzo --without-lz4 --prefix= --libdir=/lib --with-xz=${xz_PREFIX} ${EXTRA_CONFIGURE_FLAGS} - COMMAND ${SED} -i "s|XZ_LIBS = -llzma |XZ_LIBS = -Bstatic ${xz_LIBRARIES}/|g" Makefile - BUILD_COMMAND ${MAKE} - BUILD_IN_SOURCE ON - INSTALL_COMMAND ${MAKE} install -) - -import_external_project( - TARGET_NAME squashfuse - EXT_PROJECT_NAME squashfuse-EXTERNAL - LIBRARIES "/.libs/libsquashfuse.a;/.libs/libsquashfuse_ll.a;/.libs/libfuseprivate.a" - INCLUDE_DIRS "" -) - - set(USE_SYSTEM_INOTIFY_TOOLS OFF CACHE BOOL "Use system libinotifytools instead of building our own") if(NOT USE_SYSTEM_INOTIFY_TOOLS) @@ -277,8 +38,8 @@ if(NOT USE_SYSTEM_INOTIFY_TOOLS) ExternalProject_Add(inotify-tools-EXTERNAL URL https://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz URL_HASH SHA512=6074d510e89bba5da0d7c4d86f2562c662868666ba0a7ea5d73e53c010a0050dd1fc01959b22cffdb9b8a35bd1b0b43c04d02d6f19927520f05889e8a9297dfb - PATCH_COMMAND ${WGET} -N --content-disposition "https://git.savannah.gnu.org/gitweb/?p=config.git$%3CSEMICOLON%3Ea=blob_plain$%3CSEMICOLON%3Ef=config.guess$%3CSEMICOLON%3Ehb=HEAD" - COMMAND ${WGET} -N --content-disposition "https://git.savannah.gnu.org/gitweb/?p=config.git$%3CSEMICOLON%3Ea=blob_plain$%3CSEMICOLON%3Ef=config.sub$%3CSEMICOLON%3Ehb=HEAD" + PATCH_COMMAND ${WGET} -N --content-disposition "https://raw.githubusercontent.com/AppImage/external-resources/master/patches/config.guess" + COMMAND ${WGET} -N --content-disposition "https://raw.githubusercontent.com/AppImage/external-resources/master/patches/config.sub" UPDATE_COMMAND "" # ${MAKE} sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time CONFIGURE_COMMAND CC=${CC} CXX=${CXX} CFLAGS=${CFLAGS} LDFLAGS=${LDFLAGS} /configure --enable-shared --enable-static --enable-doxygen=no --prefix= --libdir=/lib ${EXTRA_CONFIGURE_FLAGS} BUILD_COMMAND ${MAKE} @@ -299,63 +60,12 @@ else() endif() -set(USE_SYSTEM_LIBARCHIVE OFF CACHE BOOL "Use system libarchive instead of building our own") - -if(NOT USE_SYSTEM_LIBARCHIVE) - message(STATUS "Downloading and building libarchive") - - ExternalProject_Add(libarchive-EXTERNAL - URL https://www.libarchive.org/downloads/libarchive-3.3.1.tar.gz - URL_HASH SHA512=90702b393b6f0943f42438e277b257af45eee4fa82420431f6a4f5f48bb846f2a72c8ff084dc3ee9c87bdf8b57f4d8dddf7814870fe2604fe86c55d8d744c164 - CONFIGURE_COMMAND CC=${CC} CXX=${CXX} CFLAGS=${CFLAGS} CPPFLAGS=${CPPFLAGS} LDFLAGS=${LDFLAGS} /configure --with-pic --disable-shared --enable-static --disable-bsdtar --disable-bsdcat --disable-bsdcpio --with-zlib --without-bz2lib --without-iconv --without-lz4 --without-lzma --without-lzo2 --without-nettle --without-openssl --without-xml2 --without-expat --prefix= --libdir=/lib ${EXTRA_CONFIGURE_FLAGS} - BUILD_COMMAND ${MAKE} - INSTALL_COMMAND ${MAKE} install - ) - - import_external_project( - TARGET_NAME libarchive - EXT_PROJECT_NAME libarchive-EXTERNAL - LIBRARIES "/lib/libarchive.a" - INCLUDE_DIRS "/include/" - ) -else() - message(STATUS "Using system libarchive") - - import_find_pkg_target(libarchive LibArchive LibArchive) -endif() - - -if(BUILD_TESTING) -set(USE_SYSTEM_GTEST OFF CACHE BOOL "Use system GTest instead of downloading and building GTest") - -if(NOT USE_SYSTEM_GTEST) - message(STATUS "Downloading and building GTest") - - ExternalProject_Add(gtest-EXTERNAL - GIT_REPOSITORY https://github.com/google/googletest.git - GIT_TAG release-1.8.0 - UPDATE_COMMAND "" # ${MAKE} sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time - CONFIGURE_COMMAND CC=${CC} CXX=${CXX} CFLAGS=${CFLAGS} CPPFLAGS=${CPPFLAGS} LDFLAGS=${LDFLAGS} ${CMAKE_COMMAND} -G${CMAKE_GENERATOR} -DCMAKE_INSTALL_PREFIX= /googletest - ) - - import_external_project( - TARGET_NAME gtest - EXT_PROJECT_NAME gtest-EXTERNAL - LIBRARIES "/lib/libgtest.a;/lib/libgtest_main.a" - INCLUDE_DIRS "/include/" - ) - else() - message(STATUS "Using system GTest") - - import_find_pkg_target(gtest GTest GTEST) - endif() -endif() - - # TODO: allow using system wide mksquashfs set(mksquashfs_cflags "-DXZ_SUPPORT ${CFLAGS}") -if(xz_LIBRARIES MATCHES "\\.a$") +if(NOT xz_LIBRARIES OR xz_LIBRARIES STREQUAL "") + message(FATAL_ERROR "xz_LIBRARIES not set") +elseif(xz_LIBRARIES MATCHES "\\.a$") set(mksquashfs_ldflags "${xz_LIBRARIES}") else() set(mksquashfs_ldflags "-l${xz_LIBRARIES}") @@ -398,9 +108,6 @@ mark_as_advanced(mksquashfs_BINARY) # only have to build custom xz when not using system libxz if(TARGET xz-EXTERNAL) - if(TARGET squashfuse-EXTERNAL) - ExternalProject_Add_StepDependencies(squashfuse-EXTERNAL configure xz-EXTERNAL) - endif() if(TARGET mksquashfs) ExternalProject_Add_StepDependencies(mksquashfs configure xz-EXTERNAL) endif() diff --git a/cmake/tools.cmake b/cmake/tools.cmake deleted file mode 100644 index ac4580d8e..000000000 --- a/cmake/tools.cmake +++ /dev/null @@ -1,49 +0,0 @@ -if(TOOLS_PREFIX) - message(STATUS "TOOLS_PREFIX ${TOOLS_PREFIX} detected") -endif() - -# first of all, make sure required programs are available -function(check_program name) - if(TOOLS_PREFIX) - set(prefix ${TOOLS_PREFIX}_) - endif() - - message(STATUS "Checking for program ${name}") - - string(TOUPPER ${name} name_upper) - - if(prefix) - # try prefixed version first - find_program(${name_upper} ${prefix}${name}) - endif() - - # try non-prefixed version - if(NOT ${name_upper}) - find_program(${name_upper} ${name}) - - if(NOT ${name_upper}) - message(FATAL_ERROR "Could not find required program ${name}.") - endif() - endif() - - message(STATUS "Found program ${name}: ${${name_upper}}") - - mark_as_advanced(${name_upper}) -endfunction() - -check_program(aclocal) -check_program(autoheader) -check_program(automake) -check_program(autoreconf) -check_program(libtoolize) -check_program(patch) -check_program(sed) -check_program(wget) -check_program(xxd) -check_program(desktop-file-validate) -check_program(objcopy) -check_program(objdump) -check_program(readelf) -check_program(strip) -check_program(make) -# TODO: add checks for remaining commands diff --git a/include/appimage/appimage.h b/include/appimage/appimage.h deleted file mode 100644 index 9cea6039e..000000000 --- a/include/appimage/appimage.h +++ /dev/null @@ -1,154 +0,0 @@ -#pragma once - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Return the md5 hash constructed according to -* https://specifications.freedesktop.org/thumbnail-spec/thumbnail-spec-latest.html#THUMBSAVE -* This can be used to identify files that are related to a given AppImage at a given location */ -char *appimage_get_md5(char const* path); - -/* Check if a file is an AppImage. Returns the image type if it is, or -1 if it isn't */ -int appimage_get_type(const char* path, bool verbose); - -/* - * Finds the desktop file of a registered AppImage and returns the path - * Returns NULL if the desktop file can't be found, which should only occur when the AppImage hasn't been registered yet - */ -char* appimage_registered_desktop_file_path(const char* path, char* md5, bool verbose); - -/* - * Check whether an AppImage has been registered in the system - */ -bool appimage_is_registered_in_system(const char* path); - -/* Register a type 1 AppImage in the system */ -bool appimage_type1_register_in_system(const char *path, bool verbose); - -/* Register a type 2 AppImage in the system */ -bool appimage_type2_register_in_system(const char *path, bool verbose); - -/* - * Register an AppImage in the system - * Returns 0 on success, non-0 otherwise. - */ -int appimage_register_in_system(const char *path, bool verbose); - -/* Unregister an AppImage in the system */ -int appimage_unregister_in_system(const char *path, bool verbose); - -/* Extract a given file from the appimage following the symlinks until a concrete file is found */ -void appimage_extract_file_following_symlinks(const char* appimage_file_path, const char* file_path, - const char* target_dir); - -/* Create AppImage thumbnail according to - * https://specifications.freedesktop.org/thumbnail-spec/0.8.0/index.html - */ -void appimage_create_thumbnail(const char* appimage_file_path, bool verbose); - -/* List files contained in the AppImage file. - * Returns: a newly allocated char** ended at NULL. If no files ware found also is returned a {NULL} - * - * You should ALWAYS take care of releasing this using `appimage_string_list_free`. - * */ -char** appimage_list_files(const char* path); - -/* Releases memory of a string list (a.k.a. list of pointers to char arrays allocated in heap memory). */ -void appimage_string_list_free(char** list); - -/* - * Checks whether a type 1 AppImage's desktop file has set Terminal=true. - * - * Returns >0 if set, 0 if not set, <0 on errors. - */ -int appimage_type1_is_terminal_app(const char* path); - -/* - * Checks whether a type 2 AppImage's desktop file has set Terminal=true. - * - * Returns >0 if set, 0 if not set, <0 on errors. - */ -int appimage_type2_is_terminal_app(const char* path); - -/* - * Checks whether an AppImage's desktop file has set Terminal=true. - * - * Returns >0 if set, 0 if not set, <0 on errors. - */ -int appimage_is_terminal_app(const char* path); - -/* - * Checks whether a type 1 AppImage's desktop file has set X-AppImage-Version=false. - * Useful to check whether the author of an AppImage doesn't want it to be integrated. - * - * Returns >0 if set, 0 if not set, <0 on errors. - */ -int appimage_type1_shall_not_be_integrated(const char* path); - -/* - * Checks whether a type 2 AppImage's desktop file has set X-AppImage-Version=false. - * Useful to check whether the author of an AppImage doesn't want it to be integrated. - * - * Returns >0 if set, 0 if not set, <0 on errors. - */ -int appimage_type2_shall_not_be_integrated(const char* path); - -/* - * Checks whether an AppImage's desktop file has set X-AppImage-Version=false. - * Useful to check whether the author of an AppImage doesn't want it to be integrated. - * - * Returns >0 if set, 0 if not set, <0 on errors. - */ -int appimage_shall_not_be_integrated(const char* path); - -/* - * Calculate the size of an ELF file on disk based on the information in its header - * - * Example: - * - * ls -l 126584 - * - * Calculation using the values also reported by readelf -h: - * Start of section headers e_shoff 124728 - * Size of section headers e_shentsize 64 - * Number of section headers e_shnum 29 - * - * e_shoff + ( e_shentsize * e_shnum ) = 126584 - */ -ssize_t appimage_get_elf_size(const char* fname); - -/* - * Calculate MD5 digest of AppImage file, skipping the signature and digest sections. - * - * The digest section must be skipped as the value calculated by this method is going to be embedded in it by default. - * - * The signature section must be skipped as the signature will not be available at the time this hash is calculated. - * - * The hash is _not_ compatible with tools like md5sum. - * - * You need to allocate a char array of at least 16 bytes (128 bit) and pass a reference to it as digest parameter. - * The function will set it to the raw digest, without any kind of termination. Please use appimage_hexlify() if you - * need a textual representation. - * - * Please beware that this calculation is only available for type 2 AppImages. - */ -bool appimage_type2_digest_md5(const char* fname, char* digest); - -/* - * Creates hexadecimal representation of a byte array. Allocates a new char array (string) with the correct size that - * needs to be free()d. - */ -char* appimage_hexlify(const char* bytes, size_t numBytes); - -/* - * Return the offset, and the length of an ELF section with a given name in a given ELF file - */ -bool appimage_get_elf_section_offset_and_length(const char* fname, const char* section_name, unsigned long* offset, unsigned long* length); - -#ifdef __cplusplus -} -#endif diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt new file mode 100644 index 000000000..9ca1144be --- /dev/null +++ b/lib/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(libappimage) diff --git a/lib/libappimage b/lib/libappimage new file mode 160000 index 000000000..27ec5e788 --- /dev/null +++ b/lib/libappimage @@ -0,0 +1 @@ +Subproject commit 27ec5e7887b6961cbe7ed7c4f4f9b784328e5c02 diff --git a/squashfuse.patch b/squashfuse.patch deleted file mode 100644 index db94d2f76..000000000 --- a/squashfuse.patch +++ /dev/null @@ -1,57 +0,0 @@ -diff --git a/Makefile.am b/Makefile.am -index f0d7cde..70c4aa0 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -14,6 +14,7 @@ bin_PROGRAMS = - noinst_PROGRAMS = - - noinst_LTLIBRARIES = libsquashfuse.la -+noinst_LTLIBRARIES += libsquashfuse_ll.la - - # Main library: libsquashfuse - libsquashfuse_la_SOURCES = swap.c cache.c table.c dir.c file.c fs.c \ -@@ -46,10 +47,9 @@ endif - - # Low-level squashfuse_ll, if supported - if SQ_WANT_LOWLEVEL --bin_PROGRAMS += squashfuse_ll --squashfuse_ll_SOURCES = ll.c ll_inode.c nonstd-daemon.c ll.h --squashfuse_ll_CPPFLAGS = $(FUSE_CPPFLAGS) --squashfuse_ll_LDADD = libsquashfuse.la libfuseprivate.la $(COMPRESSION_LIBS) \ -+libsquashfuse_ll_la_SOURCES = ll.c ll_inode.c nonstd-daemon.c ll.h -+libsquashfuse_ll_la_CPPFLAGS = $(FUSE_CPPFLAGS) -+libsquashfuse_ll_la_LIBADD = libsquashfuse.la libfuseprivate.la $(COMPRESSION_LIBS) \ - $(FUSE_LIBS) - - noinst_LTLIBRARIES += libfuseprivate.la -diff --git a/ll.c b/ll.c -index a2c7902..8fcb3f4 100644 ---- a/ll.c -+++ b/ll.c -@@ -390,7 +390,7 @@ static sqfs_ll *sqfs_ll_open(const char *path, size_t offset) { - return NULL; - } - --int main(int argc, char *argv[]) { -+int fusefs_main(int argc, char *argv[], void (*mounted) (void)) { - struct fuse_args args; - sqfs_opts opts; - -@@ -451,6 +451,8 @@ int main(int argc, char *argv[]) { - if (sqfs_ll_daemonize(fg) != -1) { - if (fuse_set_signal_handlers(se) != -1) { - fuse_session_add_chan(se, ch.ch); -+ if (mounted) -+ mounted (); - /* FIXME: multithreading */ - err = fuse_session_loop(se); - fuse_remove_signal_handlers(se); -@@ -466,6 +468,8 @@ int main(int argc, char *argv[]) { - } - } - fuse_opt_free_args(&args); -+ if (mounted) -+ rmdir (mountpoint); - free(ll); - free(mountpoint); - diff --git a/squashfuse_dlopen.c b/squashfuse_dlopen.c deleted file mode 100644 index e4a9d6a22..000000000 --- a/squashfuse_dlopen.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "squashfuse_dlopen.h" - -int have_libloaded = 0; - -const char *load_library_errmsg = - "AppImages require FUSE to run. \n" - "You might still be able to extract the contents of this AppImage \n" - "if you run it with the --appimage-extract option. \n" - "See https://github.com/AppImage/AppImageKit/wiki/FUSE \n" - "for more information\n"; - diff --git a/squashfuse_dlopen.h b/squashfuse_dlopen.h deleted file mode 100644 index da3c34ff8..000000000 --- a/squashfuse_dlopen.h +++ /dev/null @@ -1,262 +0,0 @@ -#ifndef SQFS_DLOPEN_H -#define SQFS_DLOPEN_H - -//#define ENABLE_DLOPEN - -#ifdef ENABLE_DLOPEN - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -/*** dlopen() stuff ***/ - -#define LIBNAME "libfuse.so.2" - -void *libhandle; -int have_libloaded; -const char *load_library_errmsg; - -#define LOAD_LIBRARY \ -if (have_libloaded != 1) { \ - if (!(libhandle = dlopen(LIBNAME, RTLD_LAZY))) { \ - fprintf(stderr, "dlopen(): error loading " LIBNAME "\n\n%s", load_library_errmsg ); \ - exit(1); \ - } else { \ - have_libloaded = 1; \ - } \ -} - -#define STRINGIFY(x) #x - -#define LOAD_SYMBOL(type,x,param) \ -type (*dl_##x) param; \ -*(void **) (&dl_##x) = dlsym(libhandle, STRINGIFY(x)); \ -if (dlerror()) { \ - fprintf(stderr, "dlsym(): error loading symbol from " LIBNAME "\n\n%s", load_library_errmsg ); \ - CLOSE_LIBRARY; \ - exit(1); \ -} - -#define DL(x) dl_##x -#define CLOSE_LIBRARY dlclose(libhandle); - - -/*** libfuse stuff ***/ - -#define FUSE_ROOT_ID 1 -#define FUSE_ARGS_INIT(argc, argv) { argc, argv, 0 } -#define FUSE_OPT_KEY(templ, key) { templ, -1U, key } -#define FUSE_OPT_KEY_OPT -1 -#define FUSE_OPT_KEY_NONOPT -2 -#define FUSE_OPT_END { NULL, 0, 0 } - -enum fuse_buf_flags { - FUSE_BUF_IS_FD = (1 << 1), - FUSE_BUF_FD_SEEK = (1 << 2), - FUSE_BUF_FD_RETRY = (1 << 3), -}; - -typedef unsigned long fuse_ino_t; -typedef struct fuse_req *fuse_req_t; - -struct fuse_chan; -struct fuse_pollhandle; - -struct fuse_args { - int argc; - char **argv; - int allocated; -}; - -typedef int (*fuse_fill_dir_t) (void *buf, const char *name, const struct stat *stbuf, off_t off); -typedef int (*fuse_opt_proc_t)(void *data, const char *arg, int key, struct fuse_args *outargs); -typedef struct fuse_dirhandle *fuse_dirh_t; -typedef int (*fuse_dirfil_t) (fuse_dirh_t h, const char *name, int type, ino_t ino); - -struct fuse_file_info { - int flags; - unsigned long fh_old; - int writepage; - unsigned int direct_io : 1; - unsigned int keep_cache : 1; - unsigned int flush : 1; - unsigned int nonseekable : 1; - unsigned int flock_release : 1; - unsigned int padding : 27; - uint64_t fh; - uint64_t lock_owner; -}; - -struct fuse_entry_param { - fuse_ino_t ino; - unsigned long generation; - struct stat attr; - double attr_timeout; - double entry_timeout; -}; - -struct fuse_opt { - const char *templ; - unsigned long offset; - int value; -}; - -struct fuse_forget_data { - uint64_t ino; - uint64_t nlookup; -}; - -struct fuse_conn_info { - unsigned proto_major; - unsigned proto_minor; - unsigned async_read; - unsigned max_write; - unsigned max_readahead; - unsigned capable; - unsigned want; - unsigned max_background; - unsigned congestion_threshold; - unsigned reserved[23]; -}; - -struct fuse_buf { - size_t size; - enum fuse_buf_flags flags; - void *mem; - int fd; - off_t pos; -}; - -struct fuse_bufvec { - size_t count; - size_t idx; - size_t off; - struct fuse_buf buf[1]; -}; - -struct fuse_context { - struct fuse *fuse; - uid_t uid; - gid_t gid; - pid_t pid; - void *private_data; - mode_t umask; -}; - -struct fuse_operations { - int (*getattr) (const char *, struct stat *); - int (*readlink) (const char *, char *, size_t); - int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t); - int (*mknod) (const char *, mode_t, dev_t); - int (*mkdir) (const char *, mode_t); - int (*unlink) (const char *); - int (*rmdir) (const char *); - int (*symlink) (const char *, const char *); - int (*rename) (const char *, const char *); - int (*link) (const char *, const char *); - int (*chmod) (const char *, mode_t); - int (*chown) (const char *, uid_t, gid_t); - int (*truncate) (const char *, off_t); - int (*utime) (const char *, struct utimbuf *); - int (*open) (const char *, struct fuse_file_info *); - int (*read) (const char *, char *, size_t, off_t, struct fuse_file_info *); - int (*write) (const char *, const char *, size_t, off_t, struct fuse_file_info *); - int (*statfs) (const char *, struct statvfs *); - int (*flush) (const char *, struct fuse_file_info *); - int (*release) (const char *, struct fuse_file_info *); - int (*fsync) (const char *, int, struct fuse_file_info *); - int (*setxattr) (const char *, const char *, const char *, size_t, int); - int (*getxattr) (const char *, const char *, char *, size_t); - int (*listxattr) (const char *, char *, size_t); - int (*removexattr) (const char *, const char *); - int (*opendir) (const char *, struct fuse_file_info *); - int (*readdir) (const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *); - int (*releasedir) (const char *, struct fuse_file_info *); - int (*fsyncdir) (const char *, int, struct fuse_file_info *); - void *(*init) (struct fuse_conn_info *conn); - void (*destroy) (void *); - int (*access) (const char *, int); - int (*create) (const char *, mode_t, struct fuse_file_info *); - int (*ftruncate) (const char *, off_t, struct fuse_file_info *); - int (*fgetattr) (const char *, struct stat *, struct fuse_file_info *); - int (*lock) (const char *, struct fuse_file_info *, int cmd, struct flock *); - int (*utimens) (const char *, const struct timespec tv[2]); - int (*bmap) (const char *, size_t blocksize, uint64_t *idx); - unsigned int flag_nullpath_ok:1; - unsigned int flag_nopath:1; - unsigned int flag_utime_omit_ok:1; - unsigned int flag_reserved:29; - int (*ioctl) (const char *, int cmd, void *arg, struct fuse_file_info *, unsigned int flags, void *data); - int (*poll) (const char *, struct fuse_file_info *, struct fuse_pollhandle *ph, unsigned *reventsp); - int (*write_buf) (const char *, struct fuse_bufvec *buf, off_t off, struct fuse_file_info *); - int (*read_buf) (const char *, struct fuse_bufvec **bufp, size_t size, off_t off, struct fuse_file_info *); - int (*flock) (const char *, struct fuse_file_info *, int op); - int (*fallocate) (const char *, int, off_t, off_t, struct fuse_file_info *); -}; - -struct fuse_lowlevel_ops { - void (*init) (void *userdata, struct fuse_conn_info *conn); - void (*destroy) (void *userdata); - void (*lookup) (fuse_req_t req, fuse_ino_t parent, const char *name); - void (*forget) (fuse_req_t req, fuse_ino_t ino, unsigned long nlookup); - void (*getattr) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi); - void (*setattr) (fuse_req_t req, fuse_ino_t ino, struct stat *attr, int to_set, struct fuse_file_info *fi); - void (*readlink) (fuse_req_t req, fuse_ino_t ino); - void (*mknod) (fuse_req_t req, fuse_ino_t parent, const char *name, mode_t mode, dev_t rdev); - void (*mkdir) (fuse_req_t req, fuse_ino_t parent, const char *name, mode_t mode); - void (*unlink) (fuse_req_t req, fuse_ino_t parent, const char *name); - void (*rmdir) (fuse_req_t req, fuse_ino_t parent, const char *name); - void (*symlink) (fuse_req_t req, const char *link, fuse_ino_t parent, const char *name); - void (*rename) (fuse_req_t req, fuse_ino_t parent, const char *name, fuse_ino_t newparent, const char *newname); - void (*link) (fuse_req_t req, fuse_ino_t ino, fuse_ino_t newparent, const char *newname); - void (*open) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi); - void (*read) (fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, struct fuse_file_info *fi); - void (*write) (fuse_req_t req, fuse_ino_t ino, const char *buf, size_t size, off_t off, struct fuse_file_info *fi); - void (*flush) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi); - void (*release) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi); - void (*fsync) (fuse_req_t req, fuse_ino_t ino, int datasync, struct fuse_file_info *fi); - void (*opendir) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi); - void (*readdir) (fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, struct fuse_file_info *fi); - void (*releasedir) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi); - void (*fsyncdir) (fuse_req_t req, fuse_ino_t ino, int datasync, struct fuse_file_info *fi); - void (*statfs) (fuse_req_t req, fuse_ino_t ino); - void (*setxattr) (fuse_req_t req, fuse_ino_t ino, const char *name, const char *value, size_t size, int flags); - void (*getxattr) (fuse_req_t req, fuse_ino_t ino, const char *name, size_t size); - void (*listxattr) (fuse_req_t req, fuse_ino_t ino, size_t size); - void (*removexattr) (fuse_req_t req, fuse_ino_t ino, const char *name); - void (*access) (fuse_req_t req, fuse_ino_t ino, int mask); - void (*create) (fuse_req_t req, fuse_ino_t parent, const char *name, mode_t mode, struct fuse_file_info *fi); - void (*getlk) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi, struct flock *lock); - void (*setlk) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi, struct flock *lock, int sleep); - void (*bmap) (fuse_req_t req, fuse_ino_t ino, size_t blocksize, uint64_t idx); - void (*ioctl) (fuse_req_t req, fuse_ino_t ino, int cmd, void *arg, struct fuse_file_info *fi, unsigned flags, const void *in_buf, size_t in_bufsz, size_t out_bufsz); - void (*poll) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi, struct fuse_pollhandle *ph); - void (*write_buf) (fuse_req_t req, fuse_ino_t ino, struct fuse_bufvec *bufv, off_t off, struct fuse_file_info *fi); - void (*retrieve_reply) (fuse_req_t req, void *cookie, fuse_ino_t ino, off_t offset, struct fuse_bufvec *bufv); - void (*forget_multi) (fuse_req_t req, size_t count, struct fuse_forget_data *forgets); - void (*flock) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi, int op); - void (*fallocate) (fuse_req_t req, fuse_ino_t ino, int mode, off_t offset, off_t length, struct fuse_file_info *fi); -}; - -#else /* !ENABLE_DLOPEN */ - -#define LOAD_LIBRARY -#define LOAD_SYMBOL(x) -#define DL(x) -#define CLOSE_LIBRARY - -#endif /* !ENABLE_DLOPEN */ - -#endif /* SQFS_DLOPEN_H */ - diff --git a/squashfuse_dlopen.patch b/squashfuse_dlopen.patch deleted file mode 100644 index 59e1e6e68..000000000 --- a/squashfuse_dlopen.patch +++ /dev/null @@ -1,640 +0,0 @@ ---- a/Makefile.am -+++ b/Makefile.am -@@ -1,6 +1,7 @@ - COMPRESSION_LIBS = $(ZLIB_LIBS) $(XZ_LIBS) $(LZO_LIBS) $(LZ4_LIBS) - - ACLOCAL_AMFLAGS = -I m4 --install -+AM_CFLAGS = -fno-strict-aliasing -DENABLE_DLOPEN - - # Suppress AppleDouble - if MAKE_EXPORT -@@ -19,13 +20,13 @@ - # Main library: libsquashfuse - libsquashfuse_la_SOURCES = swap.c cache.c table.c dir.c file.c fs.c \ - decompress.c xattr.c hash.c stack.c traverse.c util.c \ -- nonstd-pread.c nonstd-stat.c \ -+ nonstd-pread.c nonstd-stat.c squashfuse_dlopen.c \ - squashfs_fs.h common.h nonstd-internal.h nonstd.h swap.h cache.h table.h \ - dir.h file.h decompress.h xattr.h squashfuse.h hash.h stack.h traverse.h \ -- util.h fs.h -+ util.h fs.h squashfuse_dlopen.h - libsquashfuse_la_CPPFLAGS = $(ZLIB_CPPFLAGS) $(XZ_CPPFLAGS) $(LZO_CPPFLAGS) \ - $(LZ4_CPPFLAGS) --libsquashfuse_la_LIBADD = -+libsquashfuse_la_LIBADD = -ldl - - # Helper for FUSE clients: libfuseprivate - libfuseprivate_la_SOURCES = fuseprivate.c nonstd-makedev.c nonstd-enoattr.c \ ---- a/fuseprivate.c -+++ b/fuseprivate.c -@@ -94,15 +94,17 @@ - } - - void sqfs_usage(char *progname, bool fuse_usage) { -+ LOAD_SYMBOL(int,fuse_opt_add_arg,(struct fuse_args *args, const char *arg)); -+ LOAD_SYMBOL(int,fuse_parse_cmdline,(struct fuse_args *args, char **mountpoint, int *multithreaded, int *foreground)); - fprintf(stderr, "%s (c) 2012 Dave Vasilevsky\n\n", PACKAGE_STRING); - fprintf(stderr, "Usage: %s [options] ARCHIVE MOUNTPOINT\n", - progname ? progname : PACKAGE_NAME); - if (fuse_usage) { - struct fuse_args args = FUSE_ARGS_INIT(0, NULL); -- fuse_opt_add_arg(&args, ""); /* progname */ -- fuse_opt_add_arg(&args, "-ho"); -+ DL(fuse_opt_add_arg)(&args, ""); /* progname */ -+ DL(fuse_opt_add_arg)(&args, "-ho"); - fprintf(stderr, "\n"); -- fuse_parse_cmdline(&args, NULL, NULL, NULL); -+ DL(fuse_parse_cmdline)(&args, NULL, NULL, NULL); - } - exit(-2); - } ---- a/fuseprivate.h -+++ b/fuseprivate.h -@@ -27,7 +27,10 @@ - - #include "squashfuse.h" - --#include -+#include "squashfuse_dlopen.h" -+#ifndef ENABLE_DLOPEN -+# include -+#endif - - #include - ---- a/hl.c -+++ b/hl.c -@@ -33,6 +33,7 @@ - #include - #include - -+int have_libloaded = 0; - - typedef struct sqfs_hl sqfs_hl; - struct sqfs_hl { -@@ -42,9 +43,10 @@ - - static sqfs_err sqfs_hl_lookup(sqfs **fs, sqfs_inode *inode, - const char *path) { -+ LOAD_SYMBOL(struct fuse_context *,fuse_get_context,(void)); - bool found; - -- sqfs_hl *hl = fuse_get_context()->private_data; -+ sqfs_hl *hl = DL(fuse_get_context)()->private_data; - *fs = &hl->fs; - if (inode) - *inode = hl->root; /* copy */ -@@ -67,7 +69,8 @@ - } - - static void *sqfs_hl_op_init(struct fuse_conn_info *conn) { -- return fuse_get_context()->private_data; -+ LOAD_SYMBOL(struct fuse_context *,fuse_get_context,(void)); -+ return DL(fuse_get_context)()->private_data; - } - - static int sqfs_hl_op_getattr(const char *path, struct stat *st) { -@@ -264,7 +267,16 @@ - return NULL; - } - -+#ifdef ENABLE_DLOPEN -+#define fuse_main(argc, argv, op, user_data) \ -+ DL(fuse_main_real)(argc, argv, op, sizeof(*(op)), user_data) -+#endif -+ - int main(int argc, char *argv[]) { -+ LOAD_SYMBOL(int,fuse_opt_parse,(struct fuse_args *args, void *data, const struct fuse_opt opts[], fuse_opt_proc_t proc)); -+ LOAD_SYMBOL(int,fuse_opt_add_arg,(struct fuse_args *args, const char *arg)); -+ LOAD_SYMBOL(int,fuse_main_real,(int argc, char *argv[], const struct fuse_operations *op, size_t op_size, void *user_data)); /* fuse_main */ -+ LOAD_SYMBOL(void,fuse_opt_free_args,(struct fuse_args *args)); - struct fuse_args args; - sqfs_opts opts; - sqfs_hl *hl; -@@ -299,7 +311,7 @@ - opts.image = NULL; - opts.mountpoint = 0; - opts.offset = 0; -- if (fuse_opt_parse(&args, &opts, fuse_opts, sqfs_opt_proc) == -1) -+ if (DL(fuse_opt_parse)(&args, &opts, fuse_opts, sqfs_opt_proc) == -1) - sqfs_usage(argv[0], true); - if (!opts.image) - sqfs_usage(argv[0], true); -@@ -308,8 +320,9 @@ - if (!hl) - return -1; - -- fuse_opt_add_arg(&args, "-s"); /* single threaded */ -+ DL(fuse_opt_add_arg)(&args, "-s"); /* single threaded */ - ret = fuse_main(args.argc, args.argv, &sqfs_hl_ops, hl); -- fuse_opt_free_args(&args); -+ DL(fuse_opt_free_args)(&args); -+ CLOSE_LIBRARY; - return ret; - } ---- a/ll.h -+++ b/ll.h -@@ -27,7 +27,10 @@ - - #include "squashfuse.h" - --#include -+#include "squashfuse_dlopen.h" -+#ifndef ENABLE_DLOPEN -+# include -+#endif - - typedef struct sqfs_ll sqfs_ll; - struct sqfs_ll { ---- a/ll_inode.c -+++ b/ll_inode.c -@@ -348,12 +348,14 @@ - - - sqfs_err sqfs_ll_iget(fuse_req_t req, sqfs_ll_i *lli, fuse_ino_t i) { -+ LOAD_SYMBOL(void *,fuse_req_userdata,(fuse_req_t req)); -+ LOAD_SYMBOL(int,fuse_reply_err,(fuse_req_t req, int err)); - sqfs_err err = SQFS_OK; -- lli->ll = fuse_req_userdata(req); -+ lli->ll = DL(fuse_req_userdata)(req); - if (i != SQFS_FUSE_INODE_NONE) { - err = sqfs_ll_inode(lli->ll, &lli->inode, i); - if (err) -- fuse_reply_err(req, ENOENT); -+ DL(fuse_reply_err)(req, ENOENT); - } - return err; - } ---- a/nonstd-daemon.c -+++ b/nonstd-daemon.c -@@ -28,11 +28,16 @@ - #include "nonstd-internal.h" - - #include --#include -+ -+#include "squashfuse_dlopen.h" -+#ifndef ENABLE_DLOPEN -+# include -+#endif - - int sqfs_ll_daemonize(int fg) { - #if HAVE_DECL_FUSE_DAEMONIZE -- return fuse_daemonize(fg); -+ LOAD_SYMBOL(int,fuse_daemonize,(int foreground)); -+ return DL(fuse_daemonize)(fg); - #else - return daemon(0,0); - #endif ---- a/ll.c -+++ b/ll.c -@@ -38,37 +38,41 @@ - - static void sqfs_ll_op_getattr(fuse_req_t req, fuse_ino_t ino, - struct fuse_file_info *fi) { -+ LOAD_SYMBOL(int,fuse_reply_err,(fuse_req_t req, int err)); -+ LOAD_SYMBOL(int,fuse_reply_attr,(fuse_req_t req, const struct stat *attr, double attr_timeout)); - sqfs_ll_i lli; - struct stat st; - if (sqfs_ll_iget(req, &lli, ino)) - return; - - if (sqfs_stat(&lli.ll->fs, &lli.inode, &st)) { -- fuse_reply_err(req, ENOENT); -+ DL(fuse_reply_err)(req, ENOENT); - } else { - st.st_ino = ino; -- fuse_reply_attr(req, &st, SQFS_TIMEOUT); -+ DL(fuse_reply_attr)(req, &st, SQFS_TIMEOUT); - } - } - - static void sqfs_ll_op_opendir(fuse_req_t req, fuse_ino_t ino, - struct fuse_file_info *fi) { -+ LOAD_SYMBOL(int,fuse_reply_err,(fuse_req_t req, int err)); -+ LOAD_SYMBOL(int,fuse_reply_open,(fuse_req_t req, const struct fuse_file_info *fi)); - sqfs_ll_i *lli; - - fi->fh = (intptr_t)NULL; - - lli = malloc(sizeof(*lli)); - if (!lli) { -- fuse_reply_err(req, ENOMEM); -+ DL(fuse_reply_err)(req, ENOMEM); - return; - } - - if (sqfs_ll_iget(req, lli, ino) == SQFS_OK) { - if (!S_ISDIR(lli->inode.base.mode)) { -- fuse_reply_err(req, ENOTDIR); -+ DL(fuse_reply_err)(req, ENOTDIR); - } else { - fi->fh = (intptr_t)lli; -- fuse_reply_open(req, fi); -+ DL(fuse_reply_open)(req, fi); - return; - } - } -@@ -77,28 +81,35 @@ - - static void sqfs_ll_op_create(fuse_req_t req, fuse_ino_t parent, const char *name, - mode_t mode, struct fuse_file_info *fi) { -- fuse_reply_err(req, EROFS); -+ LOAD_SYMBOL(int,fuse_reply_err,(fuse_req_t req, int err)); -+ DL(fuse_reply_err)(req, EROFS); - } - - static void sqfs_ll_op_releasedir(fuse_req_t req, fuse_ino_t ino, - struct fuse_file_info *fi) { - free((sqfs_ll_i*)(intptr_t)fi->fh); -- fuse_reply_err(req, 0); /* yes, this is necessary */ -+ LOAD_SYMBOL(int,fuse_reply_err,(fuse_req_t req, int err)); -+ DL(fuse_reply_err)(req, 0); /* yes, this is necessary */ - } - - static size_t sqfs_ll_add_direntry(fuse_req_t req, char *buf, size_t bufsize, - const char *name, const struct stat *st, off_t off) { - #if HAVE_DECL_FUSE_ADD_DIRENTRY -- return fuse_add_direntry(req, buf, bufsize, name, st, off); -+ LOAD_SYMBOL(size_t,fuse_add_direntry,(fuse_req_t req, char *buf, size_t bufsize, const char *name, const struct stat *stbuf, off_t off)); -+ return DL(fuse_add_direntry)(req, buf, bufsize, name, st, off); - #else -- size_t esize = fuse_dirent_size(strlen(name)); -+ LOAD_SYMBOL(size_t,fuse_dirent_size(size_t namelen)); -+ LOAD_SYMBOL(char *,fuse_add_dirent,(char *buf, const char *name, const struct stat *stbuf, off_t off)); -+ size_t esize = DL(fuse_dirent_size)(strlen(name)); - if (bufsize >= esize) -- fuse_add_dirent(buf, name, st, off); -+ DL(fuse_add_dirent)(buf, name, st, off); - return esize; - #endif - } - static void sqfs_ll_op_readdir(fuse_req_t req, fuse_ino_t ino, size_t size, - off_t off, struct fuse_file_info *fi) { -+ LOAD_SYMBOL(int,fuse_reply_err,(fuse_req_t req, int err)); -+ LOAD_SYMBOL(int,fuse_reply_buf,(fuse_req_t req, const char *buf, size_t size)); - sqfs_err sqerr; - sqfs_dir dir; - sqfs_name namebuf; -@@ -135,14 +146,16 @@ - } - - if (err) -- fuse_reply_err(req, err); -+ DL(fuse_reply_err)(req, err); - else -- fuse_reply_buf(req, buf, bufpos - buf); -+ DL(fuse_reply_buf)(req, buf, bufpos - buf); - free(buf); - } - - static void sqfs_ll_op_lookup(fuse_req_t req, fuse_ino_t parent, - const char *name) { -+ LOAD_SYMBOL(int,fuse_reply_err,(fuse_req_t req, int err)); -+ LOAD_SYMBOL(int,fuse_reply_entry,(fuse_req_t req, const struct fuse_entry_param *e)); - sqfs_ll_i lli; - sqfs_err sqerr; - sqfs_name namebuf; -@@ -154,7 +167,7 @@ - return; - - if (!S_ISDIR(lli.inode.base.mode)) { -- fuse_reply_err(req, ENOTDIR); -+ DL(fuse_reply_err)(req, ENOTDIR); - return; - } - -@@ -162,55 +175,58 @@ - sqerr = sqfs_dir_lookup(&lli.ll->fs, &lli.inode, name, strlen(name), &entry, - &found); - if (sqerr) { -- fuse_reply_err(req, EIO); -+ DL(fuse_reply_err)(req, EIO); - return; - } - if (!found) { -- fuse_reply_err(req, ENOENT); -+ DL(fuse_reply_err)(req, ENOENT); - return; - } - - if (sqfs_inode_get(&lli.ll->fs, &inode, sqfs_dentry_inode(&entry))) { -- fuse_reply_err(req, ENOENT); -+ DL(fuse_reply_err)(req, ENOENT); - } else { - struct fuse_entry_param fentry; - memset(&fentry, 0, sizeof(fentry)); - if (sqfs_stat(&lli.ll->fs, &inode, &fentry.attr)) { -- fuse_reply_err(req, EIO); -+ DL(fuse_reply_err)(req, EIO); - } else { - fentry.attr_timeout = fentry.entry_timeout = SQFS_TIMEOUT; - fentry.ino = lli.ll->ino_register(lli.ll, &entry); - fentry.attr.st_ino = fentry.ino; -- fuse_reply_entry(req, &fentry); -+ DL(fuse_reply_entry)(req, &fentry); - } - } - } - - static void sqfs_ll_op_open(fuse_req_t req, fuse_ino_t ino, - struct fuse_file_info *fi) { -+ LOAD_SYMBOL(int,fuse_reply_err,(fuse_req_t req, int err)); -+ LOAD_SYMBOL(int,fuse_reply_open,(fuse_req_t req, const struct fuse_file_info *fi)); -+ LOAD_SYMBOL(void *,fuse_req_userdata,(fuse_req_t req)); - sqfs_inode *inode; - sqfs_ll *ll; - - if (fi->flags & (O_WRONLY | O_RDWR)) { -- fuse_reply_err(req, EROFS); -+ DL(fuse_reply_err)(req, EROFS); - return; - } - - inode = malloc(sizeof(sqfs_inode)); - if (!inode) { -- fuse_reply_err(req, ENOMEM); -+ DL(fuse_reply_err)(req, ENOMEM); - return; - } - -- ll = fuse_req_userdata(req); -+ ll = DL(fuse_req_userdata)(req); - if (sqfs_ll_inode(ll, inode, ino)) { -- fuse_reply_err(req, ENOENT); -+ DL(fuse_reply_err)(req, ENOENT); - } else if (!S_ISREG(inode->base.mode)) { -- fuse_reply_err(req, EISDIR); -+ DL(fuse_reply_err)(req, EISDIR); - } else { - fi->fh = (intptr_t)inode; - fi->keep_cache = 1; -- fuse_reply_open(req, fi); -+ DL(fuse_reply_open)(req, fi); - return; - } - free(inode); -@@ -218,37 +234,43 @@ - - static void sqfs_ll_op_release(fuse_req_t req, fuse_ino_t ino, - struct fuse_file_info *fi) { -+ LOAD_SYMBOL(int,fuse_reply_err,(fuse_req_t req, int err)); - free((sqfs_inode*)(intptr_t)fi->fh); - fi->fh = 0; -- fuse_reply_err(req, 0); -+ DL(fuse_reply_err)(req, 0); - } - - static void sqfs_ll_op_read(fuse_req_t req, fuse_ino_t ino, - size_t size, off_t off, struct fuse_file_info *fi) { -- sqfs_ll *ll = fuse_req_userdata(req); -+ LOAD_SYMBOL(void *,fuse_req_userdata,(fuse_req_t req)); -+ LOAD_SYMBOL(int,fuse_reply_err,(fuse_req_t req, int err)); -+ LOAD_SYMBOL(int,fuse_reply_buf,(fuse_req_t req, const char *buf, size_t size)); -+ sqfs_ll *ll = DL(fuse_req_userdata)(req); - sqfs_inode *inode = (sqfs_inode*)(intptr_t)fi->fh; - sqfs_err err = SQFS_OK; - - off_t osize; - char *buf = malloc(size); - if (!buf) { -- fuse_reply_err(req, ENOMEM); -+ DL(fuse_reply_err)(req, ENOMEM); - return; - } - - osize = size; - err = sqfs_read_range(&ll->fs, inode, off, &osize, buf); - if (err) { -- fuse_reply_err(req, EIO); -+ DL(fuse_reply_err)(req, EIO); - } else if (osize == 0) { /* EOF */ -- fuse_reply_buf(req, NULL, 0); -+ DL(fuse_reply_buf)(req, NULL, 0); - } else { -- fuse_reply_buf(req, buf, osize); -+ DL(fuse_reply_buf)(req, buf, osize); - } - free(buf); - } - - static void sqfs_ll_op_readlink(fuse_req_t req, fuse_ino_t ino) { -+ LOAD_SYMBOL(int,fuse_reply_err,(fuse_req_t req, int err)); -+ LOAD_SYMBOL(int,fuse_reply_readlink,(fuse_req_t req, const char *link)); - char *dst; - size_t size; - sqfs_ll_i lli; -@@ -256,21 +278,24 @@ - return; - - if (!S_ISLNK(lli.inode.base.mode)) { -- fuse_reply_err(req, EINVAL); -+ DL(fuse_reply_err)(req, EINVAL); - } else if (sqfs_readlink(&lli.ll->fs, &lli.inode, NULL, &size)) { -- fuse_reply_err(req, EIO); -+ DL(fuse_reply_err)(req, EIO); - } else if (!(dst = malloc(size + 1))) { -- fuse_reply_err(req, ENOMEM); -+ DL(fuse_reply_err)(req, ENOMEM); - } else if (sqfs_readlink(&lli.ll->fs, &lli.inode, dst, &size)) { -- fuse_reply_err(req, EIO); -+ DL(fuse_reply_err)(req, EIO); - free(dst); - } else { -- fuse_reply_readlink(req, dst); -+ DL(fuse_reply_readlink)(req, dst); - free(dst); - } - } - - static void sqfs_ll_op_listxattr(fuse_req_t req, fuse_ino_t ino, size_t size) { -+ LOAD_SYMBOL(int,fuse_reply_err,(fuse_req_t req, int err)); -+ LOAD_SYMBOL(int,fuse_reply_xattr,(fuse_req_t req, size_t count)); -+ LOAD_SYMBOL(int,fuse_reply_buf,(fuse_req_t req, const char *buf, size_t size)); - sqfs_ll_i lli; - char *buf; - int ferr; -@@ -280,17 +305,17 @@ - - buf = NULL; - if (size && !(buf = malloc(size))) { -- fuse_reply_err(req, ENOMEM); -+ DL(fuse_reply_err)(req, ENOMEM); - return; - } - - ferr = sqfs_listxattr(&lli.ll->fs, &lli.inode, buf, &size); - if (ferr) { -- fuse_reply_err(req, ferr); -+ DL(fuse_reply_err)(req, ferr); - } else if (buf) { -- fuse_reply_buf(req, buf, size); -+ DL(fuse_reply_buf)(req, buf, size); - } else { -- fuse_reply_xattr(req, size); -+ DL(fuse_reply_xattr)(req, size); - } - free(buf); - } -@@ -301,13 +326,16 @@ - , uint32_t position - #endif - ) { -+ LOAD_SYMBOL(int,fuse_reply_err,(fuse_req_t req, int err)); -+ LOAD_SYMBOL(int,fuse_reply_xattr,(fuse_req_t req, size_t count)); -+ LOAD_SYMBOL(int,fuse_reply_buf,(fuse_req_t req, const char *buf, size_t size)); - sqfs_ll_i lli; - char *buf = NULL; - size_t real = size; - - #ifdef FUSE_XATTR_POSITION - if (position != 0) { /* We don't support resource forks */ -- fuse_reply_err(req, EINVAL); -+ DL(fuse_reply_err)(req, EINVAL); - return; - } - #endif -@@ -316,26 +344,27 @@ - return; - - if (!(buf = malloc(size))) -- fuse_reply_err(req, ENOMEM); -+ DL(fuse_reply_err)(req, ENOMEM); - else if (sqfs_xattr_lookup(&lli.ll->fs, &lli.inode, name, buf, &real)) -- fuse_reply_err(req, EIO); -+ DL(fuse_reply_err)(req, EIO); - else if (real == 0) -- fuse_reply_err(req, sqfs_enoattr()); -+ DL(fuse_reply_err)(req, sqfs_enoattr()); - else if (size == 0) -- fuse_reply_xattr(req, real); -+ DL(fuse_reply_xattr)(req, real); - else if (size < real) -- fuse_reply_err(req, ERANGE); -+ DL(fuse_reply_err)(req, ERANGE); - else -- fuse_reply_buf(req, buf, real); -+ DL(fuse_reply_buf)(req, buf, real); - free(buf); - } - - static void sqfs_ll_op_forget(fuse_req_t req, fuse_ino_t ino, - unsigned long nlookup) { -+ LOAD_SYMBOL(void,fuse_reply_none,(fuse_req_t req)); - sqfs_ll_i lli; - sqfs_ll_iget(req, &lli, SQFS_FUSE_INODE_NONE); - lli.ll->ino_forget(lli.ll, ino, nlookup); -- fuse_reply_none(req); -+ DL(fuse_reply_none)(req); - } - - -@@ -348,23 +377,27 @@ - - static sqfs_err sqfs_ll_mount(sqfs_ll_chan *ch, const char *mountpoint, - struct fuse_args *args) { -+ LOAD_SYMBOL(struct fuse_chan *,fuse_mount,(const char *mountpoint, struct fuse_args *args)); - #ifdef HAVE_NEW_FUSE_UNMOUNT -- ch->ch = fuse_mount(mountpoint, args); -+ ch->ch = DL(fuse_mount)(mountpoint, args); - #else -- ch->fd = fuse_mount(mountpoint, args); -+ LOAD_SYMBOL(struct fuse_chan *,fuse_kern_chan_new,(int fd)); -+ ch->fd = DL(fuse_mount)(mountpoint, args); - if (ch->fd == -1) - return SQFS_ERR; -- ch->ch = fuse_kern_chan_new(ch->fd); -+ ch->ch = DL(fuse_kern_chan_new)(ch->fd); - #endif - return ch->ch ? SQFS_OK : SQFS_ERR; - } - - static void sqfs_ll_unmount(sqfs_ll_chan *ch, const char *mountpoint) { - #ifdef HAVE_NEW_FUSE_UNMOUNT -- fuse_unmount(mountpoint, ch->ch); -+ LOAD_SYMBOL(void,fuse_unmount,(const char *mountpoint, struct fuse_chan *ch)); -+ DL(fuse_unmount)(mountpoint, ch->ch); - #else -+ LOAD_SYMBOL(void,fuse_unmount,(const char *mountpoint)); - close(ch->fd); -- fuse_unmount(mountpoint); -+ DL(fuse_unmount)(mountpoint); - #endif - } - -@@ -391,6 +424,19 @@ - } - - int fusefs_main(int argc, char *argv[], void (*mounted) (void)) { -+ LOAD_SYMBOL(int,fuse_opt_parse,(struct fuse_args *args, void *data, const struct fuse_opt opts[], fuse_opt_proc_t proc)); -+ LOAD_SYMBOL(int,fuse_parse_cmdline,(struct fuse_args *args, char **mountpoint, int *multithreaded, int *foreground)); -+ LOAD_SYMBOL(struct fuse_session *,fuse_lowlevel_new,(struct fuse_args *args, const struct fuse_lowlevel_ops *op, size_t op_size, void *userdata)); -+ LOAD_SYMBOL(int,fuse_set_signal_handlers,(struct fuse_session *se)); -+ LOAD_SYMBOL(void,fuse_session_add_chan,(struct fuse_session *se, struct fuse_chan *ch)); -+ LOAD_SYMBOL(int,fuse_session_loop,(struct fuse_session *se)); -+ LOAD_SYMBOL(void,fuse_remove_signal_handlers,(struct fuse_session *se)); -+#if HAVE_DECL_FUSE_SESSION_REMOVE_CHAN -+ LOAD_SYMBOL(void,fuse_session_remove_chan,(struct fuse_chan *ch)); -+#endif -+ LOAD_SYMBOL(void,fuse_session_destroy,(struct fuse_session *se)); -+ LOAD_SYMBOL(void,fuse_opt_free_args,(struct fuse_args *args)); -+ - struct fuse_args args; - sqfs_opts opts; - -@@ -429,10 +475,10 @@ - opts.image = NULL; - opts.mountpoint = 0; - opts.offset = 0; -- if (fuse_opt_parse(&args, &opts, fuse_opts, sqfs_opt_proc) == -1) -+ if (DL(fuse_opt_parse)(&args, &opts, fuse_opts, sqfs_opt_proc) == -1) - sqfs_usage(argv[0], true); - -- if (fuse_parse_cmdline(&args, &mountpoint, &mt, &fg) == -1) -+ if (DL(fuse_parse_cmdline)(&args, &mountpoint, &mt, &fg) == -1) - sqfs_usage(argv[0], true); - if (mountpoint == NULL) - sqfs_usage(argv[0], true); -@@ -445,33 +491,34 @@ - sqfs_ll_chan ch; - err = -1; - if (sqfs_ll_mount(&ch, mountpoint, &args) == SQFS_OK) { -- struct fuse_session *se = fuse_lowlevel_new(&args, -+ struct fuse_session *se = DL(fuse_lowlevel_new)(&args, - &sqfs_ll_ops, sizeof(sqfs_ll_ops), ll); - if (se != NULL) { - if (sqfs_ll_daemonize(fg) != -1) { -- if (fuse_set_signal_handlers(se) != -1) { -- fuse_session_add_chan(se, ch.ch); -+ if (DL(fuse_set_signal_handlers)(se) != -1) { -+ DL(fuse_session_add_chan)(se, ch.ch); - if (mounted) - mounted (); - /* FIXME: multithreading */ -- err = fuse_session_loop(se); -- fuse_remove_signal_handlers(se); -+ err = DL(fuse_session_loop)(se); -+ DL(fuse_remove_signal_handlers)(se); - #if HAVE_DECL_FUSE_SESSION_REMOVE_CHAN -- fuse_session_remove_chan(ch.ch); -+ DL(fuse_session_remove_chan)(ch.ch); - #endif - } - } -- fuse_session_destroy(se); -+ DL(fuse_session_destroy)(se); - } - sqfs_ll_destroy(ll); - sqfs_ll_unmount(&ch, mountpoint); - } - } -- fuse_opt_free_args(&args); -+ DL(fuse_opt_free_args)(&args); - if (mounted) - rmdir (mountpoint); - free(ll); - free(mountpoint); -+ CLOSE_LIBRARY; - - return -err; - } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0df0e6b8d..8a7b0aeb2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -8,112 +8,18 @@ if(NOT COMMAND add_sanitizers) endif() -# include XDG basedir library -add_subdirectory(xdg-basedir) - - # allow setting different path for mksquashfs after installation set(AUXILIARY_FILES_DESTINATION "lib/appimagekit" CACHE STRING "Target install directory for mksquashfs") -add_library(md5 md5.c md5.h) -target_include_directories(md5 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - - -add_library(libappimage SHARED - ${PROJECT_SOURCE_DIR}/include/appimage/appimage.h - shared.c - getsection.c - notify.c - elf.c - appimagetool_shared.c - hexlify.c -) - -set_target_properties(libappimage PROPERTIES PREFIX "") -set_target_properties(libappimage PROPERTIES PUBLIC_HEADER "${PROJECT_SOURCE_DIR}/include/appimage/appimage.h") - -target_compile_definitions(libappimage - PRIVATE -D_FILE_OFFSET_BITS=64 - PRIVATE -DGIT_COMMIT="${GIT_COMMIT}" - PRIVATE -DENABLE_BINRELOC -) - -target_include_directories(libappimage - PUBLIC $ - INTERFACE $ -) - -target_link_libraries(libappimage - PRIVATE - squashfuse - libarchive - inotify-tools - xz - xdg-basedir - PUBLIC - pthread - libglib - libgobject - libgio - libzlib - libcairo -) - - -add_library(libappimage_static STATIC - ${PROJECT_SOURCE_DIR}/include/appimage/appimage.h - shared.c - getsection.c - notify.c - elf.c - appimagetool_shared.c - hexlify.c -) - -set_target_properties(libappimage_static PROPERTIES PREFIX "") -set_target_properties(libappimage_static PROPERTIES LIBRARY_OUTPUT_NAME libappimage) -set_target_properties(libappimage_static PROPERTIES PUBLIC_HEADER "${PROJECT_SOURCE_DIR}/include/appimage/appimage.h") - -target_compile_definitions(libappimage_static - PRIVATE -D_FILE_OFFSET_BITS=64 - PRIVATE -DGIT_COMMIT="${GIT_COMMIT}" - PRIVATE -DENABLE_BINRELOC -) - -target_include_directories(libappimage_static - PUBLIC $ - INTERFACE $ -) - -target_link_libraries(libappimage_static - PRIVATE - squashfuse - libarchive - inotify-tools - xz - xdg-basedir - PUBLIC - pthread - libglib - libgobject - libgio - libzlib - libcairo -) - - +# the runtime build configuration is quite long, therefore it's managed in a separate CMake script include(build-runtime.cmake) add_executable(appimagetool - ${PROJECT_SOURCE_DIR}/include/appimage/appimage.h appimagetool.c - getsection.c binreloc.c - elf.c runtime_embed.o - appimagetool_shared.c ) target_include_directories(appimagetool @@ -124,16 +30,10 @@ target_include_directories(appimagetool # trick: list libraries on which imported static ones depend on in the PUBLIC section # CMake then adds them after the PRIVATE ones in the linker command target_link_libraries(appimagetool - PRIVATE ${CMAKE_DL_LIBS} squashfuse - xz xdg-basedir - PUBLIC - pthread - libglib - libgobject - libzlib + libappimage_static ) target_compile_definitions(appimagetool @@ -170,11 +70,12 @@ target_compile_definitions(AppRun add_sanitizers(AppRun) -add_executable(validate validate.c getsection.c) +add_executable(validate validate.c) target_link_libraries(validate + libappimage_static libglib - libopenssl + libssl ) target_include_directories(validate @@ -183,10 +84,11 @@ target_include_directories(validate ) -add_executable(digest digest.c getsection.c) +add_executable(digest digest.c) target_link_libraries(digest - libopenssl + libappimage_static + libssl ) add_sanitizers(digest) @@ -194,7 +96,7 @@ add_sanitizers(digest) # digest_md5 demo application # can be used to verify AppImages' MD5 digest -add_executable(digest_md5 EXCLUDE_FROM_ALL digest_md5.c getsection.c appimagetool_shared.c) +add_executable(digest_md5 EXCLUDE_FROM_ALL digest_md5.c) target_include_directories(digest_md5 PUBLIC $ @@ -202,8 +104,8 @@ target_include_directories(digest_md5 ) target_link_libraries(digest_md5 - PRIVATE - libglib + PRIVATE libglib + PRIVATE libappimage_static ) @@ -229,49 +131,3 @@ install( ARCHIVE DESTINATION lib/static COMPONENT applications INCLUDES DESTINATION include COMPONENT applications ) - - -# install libappimage -install(TARGETS libappimage - EXPORT AppImageKitTargets - LIBRARY DESTINATION lib COMPONENT libappimage - ARCHIVE DESTINATION lib/static COMPONENT libappimage - PUBLIC_HEADER DESTINATION include/appimage COMPONENT libappimage-dev -) - -# Add all targets to the build-tree export set -export( - TARGETS libappimage - FILE "${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/AppImageKitTargets.cmake" -) - -# Export the package for use from the build-tree -# (this registers the build-tree with a global CMake-registry) -export(PACKAGE AppImageKit) - -# Create the AppImageConfig.cmake and AppImageConfigVersion files -configure_file( - "${PROJECT_SOURCE_DIR}/cmake/AppImageKitConfig.cmake.in" - "${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/AppImageKitConfig.cmake" - @ONLY -) -# ... for both -configure_file( - "${PROJECT_SOURCE_DIR}/cmake/AppImageKitConfigVersion.cmake.in" - "${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/AppImageKitConfigVersion.cmake" - @ONLY -) - -# Install the AppImageConfig.cmake and AppImageConfigVersion.cmake -install(FILES - "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/AppImageKitConfig.cmake" - "${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/AppImageKitConfigVersion.cmake" - DESTINATION "lib/cmake/AppImageKit" - COMPONENT libappimage-dev -) - -# Install the export set for use with the install-tree -install(EXPORT AppImageKitTargets - DESTINATION "lib/cmake/AppImageKit" - COMPONENT libappimage-dev -) diff --git a/src/appimagetool.c b/src/appimagetool.c index 69beaa18e..494872a3a 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -54,8 +54,6 @@ #include #include -#include "elf.h" -#include "getsection.h" #include "appimage/appimage.h" #ifdef __linux__ diff --git a/src/appimagetool_shared.c b/src/appimagetool_shared.c deleted file mode 100644 index aba816b1f..000000000 --- a/src/appimagetool_shared.c +++ /dev/null @@ -1,189 +0,0 @@ -#include -#include -#include -#include - -#include "appimage/appimage.h" -#include "getsection.h" - -/* Check if a file is an AppImage. Returns the image type if it is, or -1 if it isn't */ -int appimage_get_type(const char* path, bool verbose) -{ - FILE *f = fopen(path, "rt"); - if (f != NULL) - { - char buffer[3] = {0}; - - /* Check magic bytes at offset 8 */ - fseek(f, 8, SEEK_SET); - fread(buffer, 1, 3, f); - fclose(f); - if((buffer[0] == 0x41) && (buffer[1] == 0x49) && (buffer[2] == 0x01)){ -#ifdef STANDALONE - fprintf(stderr, "_________________________\n"); -#endif - if(verbose){ - fprintf(stderr, "AppImage type 1\n"); - } - return 1; - } else if((buffer[0] == 0x41) && (buffer[1] == 0x49) && (buffer[2] == 0x02)){ -#ifdef STANDALONE - fprintf(stderr, "_________________________\n"); -#endif - if(verbose){ - fprintf(stderr, "AppImage type 2\n"); - } - return 2; - } else { - if((g_str_has_suffix(path,".AppImage")) || (g_str_has_suffix(path,".appimage"))) { -#ifdef STANDALONE - fprintf(stderr, "_________________________\n"); -#endif - if (verbose) { - fprintf(stderr, "Blindly assuming AppImage type 1\n"); - fprintf(stderr, "The author of this AppImage should embed the magic bytes, see https://github.com/AppImage/AppImageSpec\n"); - } - return 1; - } else { -#ifdef STANDALONE - fprintf(stderr, "_________________________\n"); -#endif - if(verbose){ - fprintf(stderr, "Unrecognized file '%s'\n", path); - } - return -1; - } - } - } - return -1; -} - -bool appimage_type2_digest_md5(const char* path, char* digest) { - // skip digest, signature and key sections in digest calculation - unsigned long digest_md5_offset = 0, digest_md5_length = 0; - if (!appimage_get_elf_section_offset_and_length(path, ".digest_md5", &digest_md5_offset, &digest_md5_length)) - return false; - - unsigned long signature_offset = 0, signature_length = 0; - if (!appimage_get_elf_section_offset_and_length(path, ".sha256_sig", &signature_offset, &signature_length)) - return false; - - unsigned long sig_key_offset = 0, sig_key_length = 0; - if (!appimage_get_elf_section_offset_and_length(path, ".sig_key", &sig_key_offset, &sig_key_length)) - return false; - - GChecksum *checksum = g_checksum_new(G_CHECKSUM_MD5); - - // read file in chunks - static const int chunk_size = 4096; - - FILE *fp = fopen(path, "r"); - - // determine file size - fseek(fp, 0L, SEEK_END); - const long file_size = ftell(fp); - rewind(fp); - - long bytes_left = file_size; - - // if a section spans over more than a single chunk, we need emulate null bytes in the following chunks - ssize_t bytes_skip_following_chunks = 0; - - while (bytes_left > 0) { - char buffer[chunk_size]; - - long current_position = ftell(fp); - - ssize_t bytes_left_this_chunk = chunk_size; - - // first, check whether there's bytes left that need to be skipped - if (bytes_skip_following_chunks > 0) { - ssize_t bytes_skip_this_chunk = (bytes_skip_following_chunks % chunk_size == 0) ? chunk_size : (bytes_skip_following_chunks % chunk_size); - bytes_left_this_chunk -= bytes_skip_this_chunk; - - // we could just set it to 0 here, but it makes more sense to use -= for debugging - bytes_skip_following_chunks -= bytes_skip_this_chunk; - - // make sure to skip these bytes in the file - fseek(fp, bytes_skip_this_chunk, SEEK_CUR); - } - - // check whether there's a section in this chunk that we need to skip - if (digest_md5_offset != 0 && digest_md5_length != 0 && digest_md5_offset - current_position > 0 && digest_md5_offset - current_position < chunk_size) { - ssize_t begin_of_section = (digest_md5_offset - current_position) % chunk_size; - // read chunk before section - fread(buffer, sizeof(char), (size_t) begin_of_section, fp); - - bytes_left_this_chunk -= begin_of_section; - bytes_left_this_chunk -= digest_md5_length; - - // if bytes_left is now < 0, the section exceeds the current chunk - // this amount of bytes needs to be skipped in the future sections - if (bytes_left_this_chunk < 0) { - bytes_skip_following_chunks = (size_t) (-1 * bytes_left_this_chunk); - bytes_left_this_chunk = 0; - } - - // if there's bytes left to read, we need to seek the difference between chunk's end and bytes_left - fseek(fp, (chunk_size - bytes_left_this_chunk - begin_of_section), SEEK_CUR); - } - - // check whether there's a section in this chunk that we need to skip - if (signature_offset != 0 && signature_length != 0 && signature_offset - current_position > 0 && signature_offset - current_position < chunk_size) { - ssize_t begin_of_section = (signature_offset - current_position) % chunk_size; - // read chunk before section - fread(buffer, sizeof(char), (size_t) begin_of_section, fp); - - bytes_left_this_chunk -= begin_of_section; - bytes_left_this_chunk -= signature_length; - - // if bytes_left is now < 0, the section exceeds the current chunk - // this amount of bytes needs to be skipped in the future sections - if (bytes_left_this_chunk < 0) { - bytes_skip_following_chunks = (size_t) (-1 * bytes_left_this_chunk); - bytes_left_this_chunk = 0; - } - - // if there's bytes left to read, we need to seek the difference between chunk's end and bytes_left - fseek(fp, (chunk_size - bytes_left_this_chunk - begin_of_section), SEEK_CUR); - } - - // check whether there's a section in this chunk that we need to skip - if (sig_key_offset != 0 && sig_key_length != 0 && sig_key_offset - current_position > 0 && sig_key_offset - current_position < chunk_size) { - ssize_t begin_of_section = (sig_key_offset - current_position) % chunk_size; - // read chunk before section - fread(buffer, sizeof(char), (size_t) begin_of_section, fp); - - bytes_left_this_chunk -= begin_of_section; - bytes_left_this_chunk -= sig_key_length; - - // if bytes_left is now < 0, the section exceeds the current chunk - // this amount of bytes needs to be skipped in the future sections - if (bytes_left_this_chunk < 0) { - bytes_skip_following_chunks = (size_t) (-1 * bytes_left_this_chunk); - bytes_left_this_chunk = 0; - } - - // if there's bytes left to read, we need to seek the difference between chunk's end and bytes_left - fseek(fp, (chunk_size - bytes_left_this_chunk - begin_of_section), SEEK_CUR); - } - - // check whether we're done already - if (bytes_left_this_chunk > 0) { - // read data from file into buffer with the correct offset in case bytes have to be skipped - fread(buffer + (chunk_size - bytes_left_this_chunk), sizeof(char), (size_t) bytes_left_this_chunk, fp); - } - - // feed buffer into checksum calculation - g_checksum_update(checksum, (const guchar*) buffer, chunk_size); - - bytes_left -= chunk_size; - } - - gsize digest_len = 16; - g_checksum_get_digest(checksum, (guint8*) digest, &digest_len); - - fclose(fp); - - return true; -} diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index 1c77b8fd2..eed2d6d01 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -15,7 +15,15 @@ else() set(BUILD_DEBUG FALSE) endif() -set(runtime_cflags -std=c99 -ffunction-sections -fdata-sections -DGIT_COMMIT=\\"${GIT_COMMIT}\\" -I${squashfuse_INCLUDE_DIRS} -I${PROJECT_SOURCE_DIR}/include ${DEPENDENCIES_CFLAGS}) +set(runtime_cflags + -std=c99 -ffunction-sections -fdata-sections + -DGIT_COMMIT=\\"${GIT_COMMIT}\\" + -I${squashfuse_INCLUDE_DIRS} + -I${PROJECT_SOURCE_DIR}/include + -I${PROJECT_SOURCE_DIR}/lib/libappimage/include + -I${PROJECT_SOURCE_DIR}/lib/libappimage/src/libappimage_hashlib/include + ${DEPENDENCIES_CFLAGS} +) set(runtime_ldflags -s -Wl,--gc-sections ${DEPENDENCIES_LDFLAGS}) if(BUILD_DEBUG) @@ -92,10 +100,10 @@ add_custom_command( # add the runtime as a normal executable # CLion will recognize it as a normal executable, one can simply step into the code -add_executable(runtime ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o elf.c notify.c getsection.c hexlify.c) +add_executable(runtime ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o notify.c) # CMake gets confused by the .o object, therefore we need to tell it that it shall link everything using the C compiler set_property(TARGET runtime PROPERTY LINKER_LANGUAGE C) -target_link_libraries(runtime PRIVATE squashfuse dl xz libzlib pthread md5) +target_link_libraries(runtime PRIVATE squashfuse dl xz libzlib pthread libappimage_shared libappimage_hashlib) target_include_directories(runtime PRIVATE ${PROJECT_SOURCE_DIR}/include) if(BUILD_DEBUG) diff --git a/src/digest.c b/src/digest.c index 851097e30..fb6da7cd2 100644 --- a/src/digest.c +++ b/src/digest.c @@ -10,7 +10,7 @@ #include #include -#include "getsection.h" +#include "appimage/appimage_shared.h" typedef unsigned char byte; diff --git a/src/elf.c b/src/elf.c deleted file mode 100644 index 6e578b6e0..000000000 --- a/src/elf.c +++ /dev/null @@ -1,146 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include "light_elf.h" -#include "light_byteswap.h" - - -typedef Elf32_Nhdr Elf_Nhdr; - -static char *fname; -static Elf64_Ehdr ehdr; - -#if __BYTE_ORDER == __LITTLE_ENDIAN -#define ELFDATANATIVE ELFDATA2LSB -#elif __BYTE_ORDER == __BIG_ENDIAN -#define ELFDATANATIVE ELFDATA2MSB -#else -#error "Unknown machine endian" -#endif - -static uint16_t file16_to_cpu(uint16_t val) -{ - if (ehdr.e_ident[EI_DATA] != ELFDATANATIVE) - val = bswap_16(val); - return val; -} - -static uint32_t file32_to_cpu(uint32_t val) -{ - if (ehdr.e_ident[EI_DATA] != ELFDATANATIVE) - val = bswap_32(val); - return val; -} - -static uint64_t file64_to_cpu(uint64_t val) -{ - if (ehdr.e_ident[EI_DATA] != ELFDATANATIVE) - val = bswap_64(val); - return val; -} - -static ssize_t read_elf32(int fd) -{ - Elf32_Ehdr ehdr32; - Elf32_Shdr shdr32; - off_t last_shdr_offset; - ssize_t ret; - unsigned long sht_end, last_section_end; - - ret = pread(fd, &ehdr32, sizeof(ehdr32), 0); - if (ret < 0 || (size_t)ret != sizeof(ehdr32)) { - fprintf(stderr, "Read of ELF header from %s failed: %s\n", - fname, strerror(errno)); - return -1; - } - - ehdr.e_shoff = file32_to_cpu(ehdr32.e_shoff); - ehdr.e_shentsize = file16_to_cpu(ehdr32.e_shentsize); - ehdr.e_shnum = file16_to_cpu(ehdr32.e_shnum); - - last_shdr_offset = ehdr.e_shoff + (ehdr.e_shentsize * (ehdr.e_shnum - 1)); - ret = pread(fd, &shdr32, sizeof(shdr32), last_shdr_offset); - if (ret < 0 || (size_t)ret != sizeof(shdr32)) { - fprintf(stderr, "Read of ELF section header from %s failed: %s\n", - fname, strerror(errno)); - return -1; - } - - /* ELF ends either with the table of section headers (SHT) or with a section. */ - sht_end = ehdr.e_shoff + (ehdr.e_shentsize * ehdr.e_shnum); - last_section_end = file64_to_cpu(shdr32.sh_offset) + file64_to_cpu(shdr32.sh_size); - return sht_end > last_section_end ? sht_end : last_section_end; -} - -static ssize_t read_elf64(int fd) -{ - Elf64_Ehdr ehdr64; - Elf64_Shdr shdr64; - off_t last_shdr_offset; - ssize_t ret; - unsigned long sht_end, last_section_end; - - ret = pread(fd, &ehdr64, sizeof(ehdr64), 0); - if (ret < 0 || (size_t)ret != sizeof(ehdr64)) { - fprintf(stderr, "Read of ELF header from %s failed: %s\n", - fname, strerror(errno)); - return -1; - } - - ehdr.e_shoff = file64_to_cpu(ehdr64.e_shoff); - ehdr.e_shentsize = file16_to_cpu(ehdr64.e_shentsize); - ehdr.e_shnum = file16_to_cpu(ehdr64.e_shnum); - - last_shdr_offset = ehdr.e_shoff + (ehdr.e_shentsize * (ehdr.e_shnum - 1)); - ret = pread(fd, &shdr64, sizeof(shdr64), last_shdr_offset); - if (ret < 0 || (size_t)ret != sizeof(shdr64)) { - fprintf(stderr, "Read of ELF section header from %s failed: %s\n", - fname, strerror(errno)); - return -1; - } - - /* ELF ends either with the table of section headers (SHT) or with a section. */ - sht_end = ehdr.e_shoff + (ehdr.e_shentsize * ehdr.e_shnum); - last_section_end = file64_to_cpu(shdr64.sh_offset) + file64_to_cpu(shdr64.sh_size); - return sht_end > last_section_end ? sht_end : last_section_end; -} - -ssize_t appimage_get_elf_size(const char* fname) { - ssize_t ret; - int fd; - ssize_t size = -1; - - fd = open(fname, O_RDONLY); - if (fd < 0) { - fprintf(stderr, "Cannot open %s: %s\n", - fname, strerror(errno)); - return -1; - } - ret = pread(fd, ehdr.e_ident, EI_NIDENT, 0); - if (ret != EI_NIDENT) { - fprintf(stderr, "Read of e_ident from %s failed: %s\n", - fname, strerror(errno)); - return -1; - } - if ((ehdr.e_ident[EI_DATA] != ELFDATA2LSB) && - (ehdr.e_ident[EI_DATA] != ELFDATA2MSB)) { - fprintf(stderr, "Unkown ELF data order %u\n", - ehdr.e_ident[EI_DATA]); - return -1; - } - if (ehdr.e_ident[EI_CLASS] == ELFCLASS32) { - size = read_elf32(fd); - } else if (ehdr.e_ident[EI_CLASS] == ELFCLASS64) { - size = read_elf64(fd); - } else { - fprintf(stderr, "Unknown ELF class %u\n", ehdr.e_ident[EI_CLASS]); - return -1; - } - - close(fd); - return size; -} diff --git a/src/getsection.c b/src/getsection.c deleted file mode 100644 index 79d7c9b67..000000000 --- a/src/getsection.c +++ /dev/null @@ -1,105 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include "light_elf.h" - -/* Return the offset, and the length of an ELF section with a given name in a given ELF file */ -bool appimage_get_elf_section_offset_and_length(const char* fname, const char* section_name, unsigned long* offset, unsigned long* length) { - uint8_t* data; - int i; - int fd = open(fname, O_RDONLY); - size_t map_size = (size_t) lseek(fd, 0, SEEK_END); - - data = mmap(NULL, map_size, PROT_READ, MAP_SHARED, fd, 0); - close(fd); - - // this trick works as both 32 and 64 bit ELF files start with the e_ident[EI_NINDENT] section - unsigned char class = data[EI_CLASS]; - - if (class == ELFCLASS32) { - Elf32_Ehdr* elf; - Elf32_Shdr* shdr; - - elf = (Elf32_Ehdr*) data; - shdr = (Elf32_Shdr*) (data + ((Elf32_Ehdr*) elf)->e_shoff); - - char* strTab = (char*) (data + shdr[elf->e_shstrndx].sh_offset); - for (i = 0; i < elf->e_shnum; i++) { - if (strcmp(&strTab[shdr[i].sh_name], section_name) == 0) { - *offset = shdr[i].sh_offset; - *length = shdr[i].sh_size; - } - } - } else if (class == ELFCLASS64) { - Elf64_Ehdr* elf; - Elf64_Shdr* shdr; - - elf = (Elf64_Ehdr*) data; - shdr = (Elf64_Shdr*) (data + elf->e_shoff); - - char* strTab = (char*) (data + shdr[elf->e_shstrndx].sh_offset); - for (i = 0; i < elf->e_shnum; i++) { - if (strcmp(&strTab[shdr[i].sh_name], section_name) == 0) { - *offset = shdr[i].sh_offset; - *length = shdr[i].sh_size; - } - } - } else { - sprintf(stderr, "Platforms other than 32-bit/64-bit are currently not supported!"); - munmap(data, map_size); - return false; - } - - munmap(data, map_size); - return true; -} - -char* read_file_offset_length(const char* fname, unsigned long offset, unsigned long length) { - FILE* f; - if ((f = fopen(fname, "r")) == NULL) { - return NULL; - } - - fseek(f, offset, SEEK_SET); - - char* buffer = calloc(length + 1, sizeof(char)); - fread(buffer, length, sizeof(char), f); - - fclose(f); - - return buffer; -} - -int print_hex(char* fname, unsigned long offset, unsigned long length) { - char* data; - if ((data = read_file_offset_length(fname, offset, length)) == NULL) { - return 1; - } - - for (long long k = 0; k < length && data[k] != '\0'; k++) { - printf("%x", data[k]); - } - - free(data); - - printf("\n"); - - return 0; -} - -int print_binary(char* fname, unsigned long offset, unsigned long length) { - char* data; - if ((data = read_file_offset_length(fname, offset, length)) == NULL) { - return 1; - } - - printf("%s\n", data); - - free(data); - - return 0; -} diff --git a/src/getsection.h b/src/getsection.h deleted file mode 100644 index f75a1391c..000000000 --- a/src/getsection.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef GETSECTION_H -#define GETSECTION_H - -int print_hex(const char* fname, unsigned long offset, unsigned long length); - -int print_binary(const char* fname, unsigned long offset, unsigned long length); - -#endif /* GETSECTION_H */ diff --git a/src/hexlify.c b/src/hexlify.c deleted file mode 100644 index 113a595ba..000000000 --- a/src/hexlify.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include -#include - -char* appimage_hexlify(const char* bytes, const size_t numBytes) { - // first of all, allocate the new string - // a hexadecimal representation works like "every byte will be represented by two chars" - // additionally, we need to null-terminate the string - char* hexlified = (char*) calloc((2 * numBytes + 1), sizeof(char)); - - for (size_t i = 0; i < numBytes; i++) { - char buffer[3]; - sprintf(buffer, "%02x", (unsigned char) bytes[i]); - strcat(hexlified, buffer); - } - - return hexlified; -} diff --git a/src/light_byteswap.h b/src/light_byteswap.h deleted file mode 100644 index 6fe5c7c10..000000000 --- a/src/light_byteswap.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef LIGHT_BYTESWAP -#define LIGHT_BYTESWAP - -#define bswap_16(value) \ -((((value) & 0xff) << 8) | ((value) >> 8)) - -#define bswap_32(value) \ -(((uint32_t)bswap_16((uint16_t)((value) & 0xffff)) << 16) | \ -(uint32_t)bswap_16((uint16_t)((value) >> 16))) - -#define bswap_64(value) \ -(((uint64_t)bswap_32((uint32_t)((value) & 0xffffffff)) \ -<< 32) | \ -(uint64_t)bswap_32((uint32_t)((value) >> 32))) - -#endif diff --git a/src/md5.c b/src/md5.c deleted file mode 100644 index bb3cf18d8..000000000 --- a/src/md5.c +++ /dev/null @@ -1,335 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// WjCryptLib_Md5 -// -// Implementation of MD5 hash function. Originally written by Alexander Peslyak. Modified by WaterJuice retaining -// Public Domain license. -// -// This is free and unencumbered software released into the public domain - June 2013 waterjuice.org -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// IMPORTS -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "md5.h" -#include - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// INTERNAL FUNCTIONS -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// F, G, H, I -// -// The basic MD5 functions. F and G are optimised compared to their RFC 1321 definitions for architectures that lack -// an AND-NOT instruction, just like in Colin Plumb's implementation. -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#define F( x, y, z ) ( (z) ^ ((x) & ((y) ^ (z))) ) -#define G( x, y, z ) ( (y) ^ ((z) & ((x) ^ (y))) ) -#define H( x, y, z ) ( (x) ^ (y) ^ (z) ) -#define I( x, y, z ) ( (y) ^ ((x) | ~(z)) ) - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// STEP -// -// The MD5 transformation for all four rounds. -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#define STEP( f, a, b, c, d, x, t, s ) \ - (a) += f((b), (c), (d)) + (x) + (t); \ - (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \ - (a) += (b); - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// TransformFunction -// -// This processes one or more 64-byte data blocks, but does NOT update the bit counters. There are no alignment -// requirements. -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -static -void* -TransformFunction - ( - Md5Context* ctx, - void const* data, - uintmax_t size - ) -{ - uint8_t* ptr; - uint32_t a; - uint32_t b; - uint32_t c; - uint32_t d; - uint32_t saved_a; - uint32_t saved_b; - uint32_t saved_c; - uint32_t saved_d; - - #define GET(n) (ctx->block[(n)]) - #define SET(n) (ctx->block[(n)] = \ - ((uint32_t)ptr[(n)*4 + 0] << 0 ) \ - | ((uint32_t)ptr[(n)*4 + 1] << 8 ) \ - | ((uint32_t)ptr[(n)*4 + 2] << 16) \ - | ((uint32_t)ptr[(n)*4 + 3] << 24) ) - - ptr = (uint8_t*)data; - - a = ctx->a; - b = ctx->b; - c = ctx->c; - d = ctx->d; - - do - { - saved_a = a; - saved_b = b; - saved_c = c; - saved_d = d; - - // Round 1 - STEP( F, a, b, c, d, SET(0), 0xd76aa478, 7 ) - STEP( F, d, a, b, c, SET(1), 0xe8c7b756, 12 ) - STEP( F, c, d, a, b, SET(2), 0x242070db, 17 ) - STEP( F, b, c, d, a, SET(3), 0xc1bdceee, 22 ) - STEP( F, a, b, c, d, SET(4), 0xf57c0faf, 7 ) - STEP( F, d, a, b, c, SET(5), 0x4787c62a, 12 ) - STEP( F, c, d, a, b, SET(6), 0xa8304613, 17 ) - STEP( F, b, c, d, a, SET(7), 0xfd469501, 22 ) - STEP( F, a, b, c, d, SET(8 ), 0x698098d8, 7 ) - STEP( F, d, a, b, c, SET(9 ), 0x8b44f7af, 12 ) - STEP( F, c, d, a, b, SET(10 ), 0xffff5bb1, 17 ) - STEP( F, b, c, d, a, SET(11 ), 0x895cd7be, 22 ) - STEP( F, a, b, c, d, SET(12 ), 0x6b901122, 7 ) - STEP( F, d, a, b, c, SET(13 ), 0xfd987193, 12 ) - STEP( F, c, d, a, b, SET(14 ), 0xa679438e, 17 ) - STEP( F, b, c, d, a, SET(15 ), 0x49b40821, 22 ) - - // Round 2 - STEP( G, a, b, c, d, GET(1), 0xf61e2562, 5 ) - STEP( G, d, a, b, c, GET(6), 0xc040b340, 9 ) - STEP( G, c, d, a, b, GET(11), 0x265e5a51, 14 ) - STEP( G, b, c, d, a, GET(0), 0xe9b6c7aa, 20 ) - STEP( G, a, b, c, d, GET(5), 0xd62f105d, 5 ) - STEP( G, d, a, b, c, GET(10), 0x02441453, 9 ) - STEP( G, c, d, a, b, GET(15), 0xd8a1e681, 14 ) - STEP( G, b, c, d, a, GET(4), 0xe7d3fbc8, 20 ) - STEP( G, a, b, c, d, GET(9), 0x21e1cde6, 5 ) - STEP( G, d, a, b, c, GET(14), 0xc33707d6, 9 ) - STEP( G, c, d, a, b, GET(3), 0xf4d50d87, 14 ) - STEP( G, b, c, d, a, GET(8), 0x455a14ed, 20 ) - STEP( G, a, b, c, d, GET(13), 0xa9e3e905, 5 ) - STEP( G, d, a, b, c, GET(2), 0xfcefa3f8, 9 ) - STEP( G, c, d, a, b, GET(7), 0x676f02d9, 14 ) - STEP( G, b, c, d, a, GET(12), 0x8d2a4c8a, 20 ) - - // Round 3 - STEP( H, a, b, c, d, GET(5), 0xfffa3942, 4 ) - STEP( H, d, a, b, c, GET(8), 0x8771f681, 11 ) - STEP( H, c, d, a, b, GET(11), 0x6d9d6122, 16 ) - STEP( H, b, c, d, a, GET(14), 0xfde5380c, 23 ) - STEP( H, a, b, c, d, GET(1), 0xa4beea44, 4 ) - STEP( H, d, a, b, c, GET(4), 0x4bdecfa9, 11 ) - STEP( H, c, d, a, b, GET(7), 0xf6bb4b60, 16 ) - STEP( H, b, c, d, a, GET(10), 0xbebfbc70, 23 ) - STEP( H, a, b, c, d, GET(13), 0x289b7ec6, 4 ) - STEP( H, d, a, b, c, GET(0), 0xeaa127fa, 11 ) - STEP( H, c, d, a, b, GET(3), 0xd4ef3085, 16 ) - STEP( H, b, c, d, a, GET(6), 0x04881d05, 23 ) - STEP( H, a, b, c, d, GET(9), 0xd9d4d039, 4 ) - STEP( H, d, a, b, c, GET(12), 0xe6db99e5, 11 ) - STEP( H, c, d, a, b, GET(15), 0x1fa27cf8, 16 ) - STEP( H, b, c, d, a, GET(2), 0xc4ac5665, 23 ) - - // Round 4 - STEP( I, a, b, c, d, GET(0), 0xf4292244, 6 ) - STEP( I, d, a, b, c, GET(7), 0x432aff97, 10 ) - STEP( I, c, d, a, b, GET(14), 0xab9423a7, 15 ) - STEP( I, b, c, d, a, GET(5), 0xfc93a039, 21 ) - STEP( I, a, b, c, d, GET(12), 0x655b59c3, 6 ) - STEP( I, d, a, b, c, GET(3), 0x8f0ccc92, 10 ) - STEP( I, c, d, a, b, GET(10), 0xffeff47d, 15 ) - STEP( I, b, c, d, a, GET(1), 0x85845dd1, 21 ) - STEP( I, a, b, c, d, GET(8), 0x6fa87e4f, 6 ) - STEP( I, d, a, b, c, GET(15), 0xfe2ce6e0, 10 ) - STEP( I, c, d, a, b, GET(6), 0xa3014314, 15 ) - STEP( I, b, c, d, a, GET(13), 0x4e0811a1, 21 ) - STEP( I, a, b, c, d, GET(4), 0xf7537e82, 6 ) - STEP( I, d, a, b, c, GET(11), 0xbd3af235, 10 ) - STEP( I, c, d, a, b, GET(2), 0x2ad7d2bb, 15 ) - STEP( I, b, c, d, a, GET(9), 0xeb86d391, 21 ) - - a += saved_a; - b += saved_b; - c += saved_c; - d += saved_d; - - ptr += 64; - } while( size -= 64 ); - - ctx->a = a; - ctx->b = b; - ctx->c = c; - ctx->d = d; - - #undef GET - #undef SET - - return ptr; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// EXPORTED FUNCTIONS -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Md5Initialise -// -// Initialises an MD5 Context. Use this to initialise/reset a context. -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void -Md5Initialise - ( - Md5Context* Context // [out] - ) -{ - Context->a = 0x67452301; - Context->b = 0xefcdab89; - Context->c = 0x98badcfe; - Context->d = 0x10325476; - - Context->lo = 0; - Context->hi = 0; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Md5Update -// -// Adds data to the MD5 context. This will process the data and update the internal state of the context. Keep on -// calling this function until all the data has been added. Then call Md5Finalise to calculate the hash. -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void -Md5Update - ( - Md5Context* Context, // [in out] - void const* Buffer, // [in] - uint32_t BufferSize // [in] - ) -{ - uint32_t saved_lo; - uint32_t used; - uint32_t free; - - saved_lo = Context->lo; - if( (Context->lo = (saved_lo + BufferSize) & 0x1fffffff) < saved_lo ) - { - Context->hi++; - } - Context->hi += (uint32_t)( BufferSize >> 29 ); - - used = saved_lo & 0x3f; - - if( used ) - { - free = 64 - used; - - if( BufferSize < free ) - { - memcpy( &Context->buffer[used], Buffer, BufferSize ); - return; - } - - memcpy( &Context->buffer[used], Buffer, free ); - Buffer = (uint8_t*)Buffer + free; - BufferSize -= free; - TransformFunction(Context, Context->buffer, 64); - } - - if( BufferSize >= 64 ) - { - Buffer = TransformFunction( Context, Buffer, BufferSize & ~(unsigned long)0x3f ); - BufferSize &= 0x3f; - } - - memcpy( Context->buffer, Buffer, BufferSize ); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Md5Finalise -// -// Performs the final calculation of the hash and returns the digest (16 byte buffer containing 128bit hash). After -// calling this, Md5Initialised must be used to reuse the context. -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void -Md5Finalise - ( - Md5Context* Context, // [in out] - MD5_HASH* Digest // [in] - ) -{ - uint32_t used; - uint32_t free; - - used = Context->lo & 0x3f; - - Context->buffer[used++] = 0x80; - - free = 64 - used; - - if(free < 8) - { - memset( &Context->buffer[used], 0, free ); - TransformFunction( Context, Context->buffer, 64 ); - used = 0; - free = 64; - } - - memset( &Context->buffer[used], 0, free - 8 ); - - Context->lo <<= 3; - Context->buffer[56] = (uint8_t)( Context->lo ); - Context->buffer[57] = (uint8_t)( Context->lo >> 8 ); - Context->buffer[58] = (uint8_t)( Context->lo >> 16 ); - Context->buffer[59] = (uint8_t)( Context->lo >> 24 ); - Context->buffer[60] = (uint8_t)( Context->hi ); - Context->buffer[61] = (uint8_t)( Context->hi >> 8 ); - Context->buffer[62] = (uint8_t)( Context->hi >> 16 ); - Context->buffer[63] = (uint8_t)( Context->hi >> 24 ); - - TransformFunction( Context, Context->buffer, 64 ); - - Digest->bytes[0] = (uint8_t)( Context->a ); - Digest->bytes[1] = (uint8_t)( Context->a >> 8 ); - Digest->bytes[2] = (uint8_t)( Context->a >> 16 ); - Digest->bytes[3] = (uint8_t)( Context->a >> 24 ); - Digest->bytes[4] = (uint8_t)( Context->b ); - Digest->bytes[5] = (uint8_t)( Context->b >> 8 ); - Digest->bytes[6] = (uint8_t)( Context->b >> 16 ); - Digest->bytes[7] = (uint8_t)( Context->b >> 24 ); - Digest->bytes[8] = (uint8_t)( Context->c ); - Digest->bytes[9] = (uint8_t)( Context->c >> 8 ); - Digest->bytes[10] = (uint8_t)( Context->c >> 16 ); - Digest->bytes[11] = (uint8_t)( Context->c >> 24 ); - Digest->bytes[12] = (uint8_t)( Context->d ); - Digest->bytes[13] = (uint8_t)( Context->d >> 8 ); - Digest->bytes[14] = (uint8_t)( Context->d >> 16 ); - Digest->bytes[15] = (uint8_t)( Context->d >> 24 ); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Md5Calculate -// -// Combines Md5Initialise, Md5Update, and Md5Finalise into one function. Calculates the MD5 hash of the buffer. -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void -Md5Calculate - ( - void const* Buffer, // [in] - uint32_t BufferSize, // [in] - MD5_HASH* Digest // [in] - ) -{ - Md5Context context; - - Md5Initialise( &context ); - Md5Update( &context, Buffer, BufferSize ); - Md5Finalise( &context, Digest ); -} diff --git a/src/md5.h b/src/md5.h deleted file mode 100644 index 98eab9ac7..000000000 --- a/src/md5.h +++ /dev/null @@ -1,96 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// WjCryptLib_Md5 -// -// Implementation of MD5 hash function. Originally written by Alexander Peslyak. Modified by WaterJuice retaining -// Public Domain license. -// -// This is free and unencumbered software released into the public domain - June 2013 waterjuice.org -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -#pragma once - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// IMPORTS -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include -#include - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// TYPES -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -// Md5Context - This must be initialised using Md5Initialised. Do not modify the contents of this structure directly. -typedef struct -{ - uint32_t lo; - uint32_t hi; - uint32_t a; - uint32_t b; - uint32_t c; - uint32_t d; - uint8_t buffer[64]; - uint32_t block[16]; -} Md5Context; - -#define MD5_HASH_SIZE ( 128 / 8 ) - -typedef struct -{ - uint8_t bytes [MD5_HASH_SIZE]; -} MD5_HASH; - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PUBLIC FUNCTIONS -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Md5Initialise -// -// Initialises an MD5 Context. Use this to initialise/reset a context. -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void -Md5Initialise - ( - Md5Context* Context // [out] - ); - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Md5Update -// -// Adds data to the MD5 context. This will process the data and update the internal state of the context. Keep on -// calling this function until all the data has been added. Then call Md5Finalise to calculate the hash. -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void -Md5Update - ( - Md5Context* Context, // [in out] - void const* Buffer, // [in] - uint32_t BufferSize // [in] - ); - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Md5Finalise -// -// Performs the final calculation of the hash and returns the digest (16 byte buffer containing 128bit hash). After -// calling this, Md5Initialised must be used to reuse the context. -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void -Md5Finalise - ( - Md5Context* Context, // [in out] - MD5_HASH* Digest // [in] - ); - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Md5Calculate -// -// Combines Md5Initialise, Md5Update, and Md5Finalise into one function. Calculates the MD5 hash of the buffer. -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void -Md5Calculate - ( - void const* Buffer, // [in] - uint32_t BufferSize, // [in] - MD5_HASH* Digest // [in] - ); diff --git a/src/patch-squashfuse.sh.in b/src/patch-squashfuse.sh.in deleted file mode 100755 index 96fb1641e..000000000 --- a/src/patch-squashfuse.sh.in +++ /dev/null @@ -1,8 +0,0 @@ -#! /bin/bash - -git checkout ll.c Makefile.am fuseprivate.c fuseprivate.h hl.c ll.h ll_inode.c nonstd-daemon.c - -patch -p1 < @PROJECT_SOURCE_DIR@/squashfuse.patch -patch -p1 < @PROJECT_SOURCE_DIR@/squashfuse_dlopen.patch - -cp -v @PROJECT_SOURCE_DIR@/squashfuse_dlopen.c @PROJECT_SOURCE_DIR@/squashfuse_dlopen.h . diff --git a/src/runtime.c b/src/runtime.c index 25e382782..fabeb6973 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -48,15 +48,13 @@ #include #include -#include "elf.h" -#include "getsection.h" -#include "md5.h" +#include +#include #ifndef ENABLE_DLOPEN #define ENABLE_DLOPEN #endif #include "squashfuse_dlopen.h" -#include "appimage/appimage.h" //#include "notify.c" extern int notify(char *title, char *body, int timeout); @@ -687,7 +685,7 @@ int main(int argc, char *argv[]) { // printf("offset: %lu\n", offset); // printf("length: %lu\n", length); // print_hex(appimage_path, offset, length); - print_binary(appimage_path, offset, length); + appimage_print_binary(appimage_path, offset, length); exit(0); } @@ -698,7 +696,7 @@ int main(int argc, char *argv[]) { // printf("offset: %lu\n", offset); // printf("length: %lu\n", length); // print_hex(appimage_path, offset, length); - print_binary(appimage_path, offset, length); + appimage_print_binary(appimage_path, offset, length); exit(0); } diff --git a/src/shared.c b/src/shared.c deleted file mode 100644 index 234082ad4..000000000 --- a/src/shared.c +++ /dev/null @@ -1,2423 +0,0 @@ -/************************************************************************** - * - * Copyright (c) 2004-18 Simon Peter - * - * All Rights Reserved. - * - * 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. - * - **************************************************************************/ - -#ident "AppImage by Simon Peter, http://appimage.org/" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "squashfuse.h" -#include -#include "getsection.h" -#include "elf.h" - -#include "xdg-basedir.h" - -// own header -#include "shared.h" - -#if HAVE_LIBARCHIVE3 == 1 // CentOS -# include -# include -#else // other systems -# include -# include -#endif - -#include -#include - -#include // To get the size of icons, move_icon_to_destination() - -#define FNM_FILE_NAME 2 - -#define URI_MAX (FILE_MAX * 3 + 8) - -char *vendorprefix = "appimagekit"; - -void set_executable(const char *path, gboolean verbose) -{ - if(!g_find_program_in_path ("firejail")){ - int result = chmod(path, 0755); // TODO: Only do this if signature verification passed - if(result != 0){ -#ifdef STANDALONE - fprintf(stderr, "Could not set %s executable: %s\n", path, strerror(errno)); -#endif - } else { - if(verbose) - fprintf(stderr, "Set %s executable\n", path); - } - } -} - -/* Search and replace on a string, this really should be in Glib */ -gchar* replace_str(const gchar const *src, const gchar const *find, const gchar const *replace){ - gchar **split = g_strsplit(src, find, -1); - gchar *retval = g_strjoinv(replace, split); - - g_strfreev(split); - return retval; -} - -/* Return the md5 hash constructed according to - * https://specifications.freedesktop.org/thumbnail-spec/thumbnail-spec-latest.html#THUMBSAVE - * This can be used to identify files that are related to a given AppImage at a given location */ -char *appimage_get_md5(const char* path) -{ - char* absolute_path; - - if ((absolute_path = realpath(path, NULL)) == NULL) - absolute_path = strdup(path); - - gchar *uri = g_filename_to_uri(absolute_path, NULL, NULL); - - free(absolute_path); - - if (uri != NULL) - { - GChecksum *checksum; - checksum = g_checksum_new(G_CHECKSUM_MD5); - guint8 digest[16]; - gsize digest_len = sizeof (digest); - g_checksum_update(checksum, (const guchar *) uri, strlen (uri)); - g_checksum_get_digest(checksum, digest, &digest_len); - g_assert(digest_len == 16); - gchar *result = g_strdup(g_checksum_get_string(checksum)); - g_checksum_free(checksum); - g_free(uri); - return result; - } else { - return NULL; - } -} - -/* Return the path of the thumbnail regardless whether it already exists; may be useful because - * G*_FILE_ATTRIBUTE_THUMBNAIL_PATH only exists if the thumbnail is already there. - * Check libgnomeui/gnome-thumbnail.h for actually generating thumbnails in the correct - * sizes at the correct locations automatically; which would draw in a dependency on gdk-pixbuf. - */ -char *get_thumbnail_path(const char *path, char *thumbnail_size, gboolean verbose) -{ - char *md5 = appimage_get_md5(path); - char *file = g_strconcat(md5, ".png", NULL); - char* cache_home = xdg_cache_home(); - gchar *thumbnail_path = g_build_filename(cache_home, "thumbnails", thumbnail_size, file, NULL); - g_free(cache_home); - g_free(file); - g_free(md5); - return thumbnail_path; -} - -/* Move an icon file to the path where a given icon can be installed in $HOME. - * This is needed because png and xpm icons cannot be installed in a generic - * location but are only picked up in directories that have the size of - * the icon as part of their directory name, as specified in the theme.index - * See https://github.com/AppImage/AppImageKit/issues/258 - */ - -void move_icon_to_destination(gchar *icon_path, gboolean verbose) -{ - // FIXME: This default location is most likely wrong, but at least the icons with unknown size can go somewhere - char* data_home = xdg_data_home(); - gchar *dest_dir = g_build_path("/", data_home, "/icons/hicolor/48x48/apps/", NULL); - - if((g_str_has_suffix (icon_path, ".svg")) || (g_str_has_suffix (icon_path, ".svgz"))) { - g_free(dest_dir); - dest_dir = g_build_path("/", data_home, "/icons/hicolor/scalable/apps/", NULL); - } - g_free(data_home); - - if((g_str_has_suffix (icon_path, ".png")) || (g_str_has_suffix (icon_path, ".xpm"))) { - - cairo_surface_t *image; - - int w = 0; - int h = 0; - - if(g_str_has_suffix (icon_path, ".xpm")) { - // TODO: GdkPixbuf has a convenient way to load XPM data. Then you can call - // gdk_cairo_set_source_pixbuf() to transfer the data to a Cairo surface. -#ifdef STANDALONE - fprintf(stderr, "XPM size parsing not yet implemented\n"); -#endif - } - - if(g_str_has_suffix (icon_path, ".png")) { - image = cairo_image_surface_create_from_png(icon_path); - w = cairo_image_surface_get_width (image); - h = cairo_image_surface_get_height (image); - cairo_surface_destroy (image); - } - - // FIXME: The following sizes are taken from the hicolor icon theme. - // Probably the right thing to do would be to figure out at runtime which icon sizes are allowable. - // Or could we put our own index.theme into .local/share/icons/ and have it observed? - if((w != h) || ((w != 16) && (w != 24) && (w != 32) && (w != 36) && (w != 48) && (w != 64) && (w != 72) && (w != 96) && (w != 128) && (w != 192) && (w != 256) && (w != 512))){ -#ifdef STANDALONE - fprintf(stderr, "%s has nonstandard size w = %i, h = %i; please fix it\n", icon_path, w, h); -#endif - } else { - g_free(dest_dir); - char* data_home = xdg_data_home(); - dest_dir = g_build_path("/", data_home, "/icons/hicolor/", g_strdup_printf("%ix%i", w, h), "/apps/", NULL); - free(data_home); - } - } - if(verbose) - fprintf(stderr, "dest_dir %s\n", dest_dir); - - gchar *basename = g_path_get_basename(icon_path); - - gchar* icon_dest_path = g_build_path("/", dest_dir, basename, NULL); - - g_free(basename); - if(verbose) - fprintf(stderr, "Move from %s to %s\n", icon_path, icon_dest_path); - gchar *dirname = g_path_get_dirname(dest_dir); - if(g_mkdir_with_parents(dirname, 0755)) { -#ifdef STANDALONE - fprintf(stderr, "Could not create directory: %s\n", dest_dir); -#endif - } - - g_free(dirname); - g_free(dest_dir); - - // This is required only for old versions of glib2 and is harmless for newer - g_type_init(); - - GError *error = NULL; - GFile *icon_file = g_file_new_for_path(icon_path); - GFile *target_file = g_file_new_for_path(icon_dest_path); - if(!g_file_move(icon_file, target_file, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error)){ -#ifdef STANDALONE - fprintf(stderr, "Error moving file: %s\n", error->message); -#endif - g_error_free(error); - } - g_object_unref(icon_file); - g_object_unref(target_file); - g_free(icon_dest_path); - -} - -/* Get filename extension */ -static gchar *get_file_extension(const gchar *filename) -{ - gchar **tokens; - gchar *extension; - tokens = g_strsplit(filename, ".", 2); - if (tokens[0] == NULL) - extension = NULL; - else - extension = g_strdup(tokens[1]); - g_strfreev(tokens); - return extension; -} - -// Read the file in chunks -void squash_extract_inode_to_file(sqfs *fs, sqfs_inode *inode, const gchar *dest) { - off_t bytes_already_read = 0; - sqfs_off_t bytes_at_a_time = 64*1024; - FILE * f; - f = fopen (dest, "w+"); - if (f == NULL){ -#ifdef STANDALONE - fprintf(stderr, "fopen error\n"); -#endif - return; - } - while (bytes_already_read < (*inode).xtra.reg.file_size) - { - char buf[bytes_at_a_time]; - if (sqfs_read_range(fs, inode, (sqfs_off_t) bytes_already_read, &bytes_at_a_time, buf)) { -#ifdef STANDALONE - fprintf(stderr, "sqfs_read_range error\n"); -#endif - } - fwrite(buf, 1, (size_t) bytes_at_a_time, f); - bytes_already_read = bytes_already_read + bytes_at_a_time; - } - fclose(f); -} - -/* Find files in the squashfs matching to the regex pattern. - * Returns a newly-allocated NULL-terminated array of strings. - * Use g_strfreev() to free it. - * - * The following is done within the sqfs_traverse run for performance reaons: - * 1.) For found files that are in usr/share/icons, install those icons into the system - * with a custom name that involves the md5 identifier to tie them to a particular - * AppImage. - * 2.) For found files that are in usr/share/mime/packages, install those icons into the system - * with a custom name that involves the md5 identifier to tie them to a particular - * AppImage. - */ -gchar **squash_get_matching_files_install_icons_and_mime_data(sqfs* fs, char* pattern, - gchar* desktop_icon_value_original, char* md5, - gboolean verbose) { - GPtrArray *array = g_ptr_array_new(); - sqfs_traverse trv; - sqfs_err err = sqfs_traverse_open(&trv, fs, sqfs_inode_root(fs)); - if (err!= SQFS_OK) { -#ifdef STANDALONE - fprintf(stderr, "sqfs_traverse_open error\n"); -#endif - } - while (sqfs_traverse_next(&trv, &err)) { - if (!trv.dir_end) { - int r; - regex_t regex; - regmatch_t match[2]; - regcomp(®ex, pattern, REG_ICASE | REG_EXTENDED); - r = regexec(®ex, trv.path, 2, match, 0); - regfree(®ex); - sqfs_inode inode; - if(sqfs_inode_get(fs, &inode, trv.entry.inode)) { -#ifdef STANDALONE - fprintf(stderr, "sqfs_inode_get error\n"); -#endif - } - if(r == 0){ - // We have a match - if(verbose) - fprintf(stderr, "squash_get_matching_files found: %s\n", trv.path); - g_ptr_array_add(array, g_strdup(trv.path)); - gchar *dest = NULL; - if(inode.base.inode_type == SQUASHFS_REG_TYPE) { - if(g_str_has_prefix(trv.path, "usr/share/icons/") || g_str_has_prefix(trv.path, "usr/share/pixmaps/") || (g_str_has_prefix(trv.path, "usr/share/mime/") && g_str_has_suffix(trv.path, ".xml"))){ - char* data_home = xdg_data_home(); - gchar *path = replace_str(trv.path, "usr/share", data_home); - free(data_home); - char *dest_dirname = g_path_get_dirname(path); - g_free(path); - gchar *base_name = g_path_get_basename(trv.path); - gchar *dest_basename = g_strdup_printf("%s_%s_%s", vendorprefix, md5, base_name); - - dest = g_build_path("/", dest_dirname, dest_basename, NULL); - - g_free(base_name); - g_free(dest_basename); - } - /* According to https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html#install_icons - * share/pixmaps is ONLY searched in /usr but not in $XDG_DATA_DIRS and hence $HOME and this seems to be true at least in XFCE */ - if(g_str_has_prefix (trv.path, "usr/share/pixmaps/")){ - gchar *dest_basename = g_strdup_printf("%s_%s_%s", vendorprefix, md5, g_path_get_basename(trv.path)); - - dest = g_build_path("/", "/tmp", dest_basename, NULL); - - g_free(dest_basename); - } - /* Some AppImages only have the icon in their root directory, so we have to get it from there */ - if((g_str_has_prefix(trv.path, desktop_icon_value_original)) && (! strstr(trv.path, "/")) && ( (g_str_has_suffix(trv.path, ".png")) || (g_str_has_suffix(trv.path, ".xpm")) || (g_str_has_suffix(trv.path, ".svg")) || (g_str_has_suffix(trv.path, ".svgz")))){ - gchar *ext = get_file_extension(trv.path); - gchar *dest_basename = g_strdup_printf("%s_%s_%s.%s", vendorprefix, md5, desktop_icon_value_original, ext); - - dest = g_build_path("/", "/tmp", dest_basename, NULL); - - g_free(dest_basename); - g_free(ext); - } - - if(dest){ - if(verbose) - fprintf(stderr, "install: %s\n", dest); - - gchar *dirname = g_path_get_dirname(dest); - if(g_mkdir_with_parents(dirname, 0755)) { -#ifdef STANDALONE - fprintf(stderr, "Could not create directory: %s\n", dirname); -#endif - } - - g_free(dirname); - - squash_extract_inode_to_file(fs, &inode, dest); - - chmod (dest, 0644); - - if(verbose) - fprintf(stderr, "Installed: %s\n", dest); - - // If we were unsure about the size of an icon, we temporarily installed - // it to /tmp and now move it into the proper place - if(g_str_has_prefix (dest, "/tmp/")) { - move_icon_to_destination(dest, verbose); - } - - g_free(dest); - } - } - } - } - } - g_ptr_array_add(array, NULL); - if (err) { -#ifdef STANDALONE - fprintf(stderr, "sqfs_traverse_next error\n"); -#endif - } - sqfs_traverse_close(&trv); - return (gchar **) g_ptr_array_free(array, FALSE); -} - -/* Loads a desktop file from squashfs into an empty GKeyFile structure. - * FIXME: Use sqfs_lookup_path() instead of g_key_file_load_from_squash() - * should help for performance. Please submit a pull request if you can - * get it to work. - */ -gboolean g_key_file_load_from_squash(sqfs *fs, char *path, GKeyFile *key_file_structure, gboolean verbose) { - sqfs_traverse trv; - gboolean success = true; - sqfs_err err = sqfs_traverse_open(&trv, fs, sqfs_inode_root(fs)); - if (err != SQFS_OK) { - fprintf(stderr, "sqfs_traverse_open error\n"); - return false; - } - while (sqfs_traverse_next(&trv, &err)) { - if (!trv.dir_end) { - if (strcmp(path, trv.path) == 0){ - sqfs_inode inode; - if (sqfs_inode_get(fs, &inode, trv.entry.inode)) - fprintf(stderr, "sqfs_inode_get error\n"); - if (inode.base.inode_type == SQUASHFS_REG_TYPE){ - off_t bytes_already_read = 0; - sqfs_off_t max_bytes_to_read = 256*1024; - char buf[max_bytes_to_read]; - if (sqfs_read_range(fs, &inode, (sqfs_off_t) bytes_already_read, &max_bytes_to_read, buf)) - fprintf(stderr, "sqfs_read_range error\n"); - // fwrite(buf, 1, max_bytes_to_read, stdout); - success = g_key_file_load_from_data (key_file_structure, buf, max_bytes_to_read, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, NULL); - } else { -#ifdef STANDALONE - fprintf(stderr, "TODO: Implement inode.base.inode_type %i\n", inode.base.inode_type); -#endif - } - break; - } - } - } - -#ifdef STANDALONE - if (err) - fprintf(stderr, "sqfs_traverse_next error\n"); -#endif - sqfs_traverse_close(&trv); - - return success; -} - -gchar *build_installed_desktop_file_path(gchar* md5, gchar* desktop_filename) { - gchar *partial_path; - partial_path = g_strdup_printf("applications/appimagekit_%s-%s", md5, desktop_filename); - - char *data_home = xdg_data_home(); - gchar *destination = g_build_filename(data_home, partial_path, NULL); - g_free(data_home); - - g_free(partial_path); - - return destination; -} - -/* Write a modified desktop file to disk that points to the AppImage */ -bool write_edited_desktop_file(GKeyFile *key_file_structure, const char* appimage_path, gchar* desktop_filename, int appimage_type, char *md5, gboolean verbose){ - if(!g_key_file_has_key(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL)){ -#ifdef STANDALONE - fprintf(stderr, "Desktop file has no Exec key\n"); -#endif - return false; - } - - // parse [Try]Exec= value, replace executable by AppImage path, append parameters - // TODO: should respect quoted strings within value - - { - char* field_value = g_key_file_get_value(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL); - - // saving a copy for later free() call - char* original_field_value = field_value; - - char* executable = strsep(&field_value, " "); - - // error handling - if (executable == NULL) { -#ifdef STANDALONE - fprintf(stderr, "Invalid value for Exec= entry in Desktop file\n"); -#endif - return false; - } - - unsigned long new_exec_value_size = strlen(appimage_path) + 1; - - if (field_value != NULL) - new_exec_value_size += strlen(field_value) + 1; - - gchar* new_exec_value = calloc(new_exec_value_size, sizeof(gchar)); - - // build new value - strcpy(new_exec_value, appimage_path); - - if (field_value != NULL && strlen(field_value) > 0) { - strcat(new_exec_value, " "); - strcat(new_exec_value, field_value); - } - - if (original_field_value != NULL) - free(original_field_value); - - g_key_file_set_value(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, new_exec_value); - - g_free(new_exec_value); - } - - // force add a TryExec= key - g_key_file_set_value(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TRY_EXEC, appimage_path); - -#ifdef APPIMAGED - /* If firejail is on the $PATH, then use it to run AppImages */ - if(g_find_program_in_path ("firejail")){ - char *firejail_exec; - firejail_exec = g_strdup_printf("firejail --env=DESKTOPINTEGRATION=appimaged --noprofile --appimage '%s'", appimage_path); - g_key_file_set_value(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, firejail_exec); - - gchar *firejail_profile_group = "Desktop Action FirejailProfile"; - gchar *firejail_profile_exec = g_strdup_printf("firejail --env=DESKTOPINTEGRATION=appimaged --private --appimage '%s'", appimage_path); - gchar *firejail_tryexec = "firejail"; - g_key_file_set_value(key_file_structure, firejail_profile_group, G_KEY_FILE_DESKTOP_KEY_NAME, "Run without sandbox profile"); - g_key_file_set_value(key_file_structure, firejail_profile_group, G_KEY_FILE_DESKTOP_KEY_EXEC, firejail_profile_exec); - g_key_file_set_value(key_file_structure, firejail_profile_group, G_KEY_FILE_DESKTOP_KEY_TRY_EXEC, firejail_tryexec); - g_key_file_set_value(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, "Actions", "FirejailProfile;"); - } -#endif - -#ifdef APPIMAGED - /* Add AppImageUpdate desktop action - * https://specifications.freedesktop.org/desktop-entry-spec/latest/ar01s10.html - * This will only work if AppImageUpdate is on the user's $PATH. - * TODO: we could have it call this appimaged instance instead of AppImageUpdate and let it - * figure out how to update the AppImage */ - unsigned long upd_offset = 0; - unsigned long upd_length = 0; - if(g_find_program_in_path ("AppImageUpdate")){ - if(appimage_type == 2){ - if (!appimage_get_elf_section_offset_and_length(appimage_path, ".upd_info", &upd_offset, &upd_length) || upd_offset == 0 || upd_length == 0) { - fprintf(stderr, "Could not read .upd_info section in AppImage's header\n"); - } - if(upd_length != 1024) { -#ifdef STANDALONE - fprintf(stderr, - "WARNING: .upd_info length is %lu rather than 1024, this might be a bug in the AppImage\n", - upd_length); -#endif - } - } - if(appimage_type == 1){ - /* If we have a type 1 AppImage, then we hardcode the offset and length */ - upd_offset = 33651; // ISO 9660 Volume Descriptor field - upd_length = 512; // Might be wrong - } -#ifdef STANDALONE - fprintf(stderr, ".upd_info offset: %lu\n", upd_offset); - fprintf(stderr, ".upd_info length: %lu\n", upd_length); -#endif - char buffer[3]; - FILE *binary = fopen(appimage_path, "rt"); - if (binary != NULL) - { - /* Check whether the first three bytes at the offset are not NULL */ - fseek(binary, upd_offset, SEEK_SET); - fread(buffer, 1, 3, binary); - fclose(binary); - if((buffer[0] != 0x00) && (buffer[1] != 0x00) && (buffer[2] != 0x00)){ - gchar *appimageupdate_group = "Desktop Action AppImageUpdate"; - gchar *appimageupdate_exec = g_strdup_printf("%s %s", "AppImageUpdate", appimage_path); - g_key_file_set_value(key_file_structure, appimageupdate_group, G_KEY_FILE_DESKTOP_KEY_NAME, "Update"); - g_key_file_set_value(key_file_structure, appimageupdate_group, G_KEY_FILE_DESKTOP_KEY_EXEC, appimageupdate_exec); - g_key_file_set_value(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, "Actions", "AppImageUpdate;"); - } - } - } -#endif - - { - char* appimage_version = g_key_file_get_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, "X-AppImage-Version", NULL); - - // parse desktop files and generate a list of locales representing all localized Name/Icon entries - // NULL refers to the key without the locale tag - // the locales for both entry types need to be tracked separately due to a limitation in the GLib API, see - // the comment below for more information - gchar* nameLocales[256] = {NULL}; - gchar* iconLocales[256] = {NULL}; - gint nameLocalesCount = 1; - gint iconLocalesCount = 1; - - { - // create temporary in-memory copy of the keyfile - gsize bufsize; - char* orig_buffer = g_key_file_to_data(key_file_structure, &bufsize, NULL); - - if (orig_buffer == NULL) { - fprintf(stderr, "Failed to create in-memory copy of desktop file\n"); - return false; - } - - // need to keep original reference to buffer to be able to free() it later - char* buffer = orig_buffer; - - // parse line by line - char* line = NULL; - while ((line = strsep(&buffer, "\n")) != NULL) { - const bool is_name_entry = strncmp(line, "Name[", 5) == 0; - const bool is_icon_entry = strncmp(line, "Icon[", 5) == 0; - - // the only keys for which we're interested in localizations is Name and Icon - if (!(is_name_entry || is_icon_entry)) - continue; - - // python: s = split(line, "[")[1] - char* s = strsep(&line, "["); - s = strsep(&line, "["); - - // python: locale = split(s, "]")[0] - char* locale = strsep(&s, "]"); - - // create references to the right variables - gchar** locales = NULL; - gint* localesCount = NULL; - - if (is_name_entry) { - locales = nameLocales; - localesCount = &nameLocalesCount; - } else if (is_icon_entry) { - locales = iconLocales; - localesCount = &iconLocalesCount; - } - - // avoid duplicates in list of locales - bool is_duplicate = false; - - // unfortunately, the list of locales is not sorted, therefore a linear search is required - // however, this won't have a significant impact on the performance - // start at index 1, first entry is NULL - for (int i = 1; i < *localesCount; i++) { - if (strcmp(locale, locales[i]) == 0) { - is_duplicate = true; - break; - } - } - - if (is_duplicate) - continue; - - locales[(*localesCount)++] = locale; - } - - free(orig_buffer); - } - - // iterate over locales, check whether name or icon entries exist, and edit accordingly - for (int i = 0; i < iconLocalesCount; i++) { - const gchar* locale = iconLocales[i]; - - // check whether the key is set at all - gchar* old_contents = NULL; - - // it's a little annoying that the GLib functions don't simply work with NULL as the locale, that'd - // make the following if-else construct unnecessary - if (locale == NULL) { - old_contents = g_key_file_get_string( - key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, NULL - ); - } else { - // please note that the following call will return a value even if there is no localized version - // probably to save one call when you're just interested in getting _some_ value while reading - // a desktop file - old_contents = g_key_file_get_locale_string( - key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, locale, NULL - ); - } - - // continue to next key if not set - if (old_contents == NULL) { - g_free(old_contents); - continue; - } - - // copy key's original contents - static const gchar old_key[] = "X-AppImage-Old-Icon"; - - // append AppImage version - gchar* basename = g_path_get_basename(old_contents); - gchar* new_contents = g_strdup_printf("%s_%s_%s", vendorprefix, md5, basename); - g_free(basename); - - // see comment for above if-else construct - if (locale == NULL) { - g_key_file_set_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, old_key, old_contents); - g_key_file_set_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, - new_contents); - } else { - g_key_file_set_locale_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, old_key, locale, old_contents); - g_key_file_set_locale_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, locale, new_contents); - } - - // cleanup - g_free(old_contents); - g_free(new_contents); - } - - // check for name entries and append version suffix - if (appimage_version != NULL) { - for (int i = 0; i < nameLocalesCount; i++) { - const gchar* locale = nameLocales[i]; - - // check whether the key is set at all - gchar* old_contents; - - // it's a little annoying that the GLib functions don't simply work with NULL as the locale, that'd - // make the following if-else construct unnecessary - if (locale == NULL) { - old_contents = g_key_file_get_string( - key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, NULL - ); - } else { - // please note that the following call will return a value even if there is no localized version - // probably to save one call when you're just interested in getting _some_ value while reading - // a desktop file - old_contents = g_key_file_get_locale_string( - key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, locale, NULL - ); - } - - // continue to next key if not set - if (old_contents == NULL) { - g_free(old_contents); - continue; - } - - // copy key's original contents - static const gchar old_key[] = "X-AppImage-Old-Name"; - - // append AppImage version - gchar* new_contents = g_strdup_printf("%s (%s)", old_contents, appimage_version); - - // see comment for above if-else construct - if (locale == NULL) { - g_key_file_set_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, old_key, old_contents); - g_key_file_set_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, - new_contents); - } else { - g_key_file_set_locale_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, old_key, locale, old_contents); - g_key_file_set_locale_string(key_file_structure, G_KEY_FILE_DESKTOP_GROUP, - G_KEY_FILE_DESKTOP_KEY_NAME, locale, new_contents); - } - - // cleanup - g_free(old_contents); - g_free(new_contents); - } - } - - // cleanup - g_free(appimage_version); - } - -#ifdef APPIMAGED - { - gchar *generated_by = g_strdup_printf("Generated by appimaged %s", GIT_COMMIT); - g_key_file_set_value(key_file_structure, "Desktop Entry", "X-AppImage-Comment", generated_by); - g_free(generated_by); - } -#endif - g_key_file_set_value(key_file_structure, "Desktop Entry", "X-AppImage-Identifier", md5); -#ifdef STANDALONE - fprintf(stderr, "Installing desktop file\n"); -#endif - if(verbose) { - gchar *buf = g_key_file_to_data(key_file_structure, NULL, NULL); - fprintf(stderr, "%s", buf); - g_free(buf); - } - - /* https://specifications.freedesktop.org/menu-spec/menu-spec-latest.html#paths says: - * - * $XDG_DATA_DIRS/applications/ - * When two desktop entries have the same name, the one appearing earlier in the path is used. - * - * -- - * - * https://developer.gnome.org/integration-guide/stable/desktop-files.html.en says: - * - * Place this file in the /usr/share/applications directory so that it is accessible - * by everyone, or in ~/.local/share/applications if you only wish to make it accessible - * to a single user. Which is used should depend on whether your application is - * installed systemwide or into a user's home directory. GNOME monitors these directories - * for changes, so simply copying the file to the right location is enough to register it - * with the desktop. - * - * Note that the ~/.local/share/applications location is not monitored by versions of GNOME - * prior to version 2.10 or on Fedora Core Linux, prior to version 2.8. - * These versions of GNOME follow the now-deprecated vfolder standard, - * and so desktop files must be installed to ~/.gnome2/vfolders/applications. - * This location is not supported by GNOME 2.8 on Fedora Core nor on upstream GNOME 2.10 - * so for maximum compatibility with deployed desktops, put the file in both locations. - * - * Note that the KDE Desktop requires one to run kbuildsycoca to force a refresh of the menus. - * - * -- - * - * https://specifications.freedesktop.org/menu-spec/menu-spec-latest.html says: - * - * To prevent that a desktop entry from one party inadvertently cancels out - * the desktop entry from another party because both happen to get the same - * desktop-file id it is recommended that providers of desktop-files ensure - * that all desktop-file ids start with a vendor prefix. - * A vendor prefix consists of [a-zA-Z] and is terminated with a dash ("-"). - * For example, to ensure that GNOME applications start with a vendor prefix of "gnome-", - * it could either add "gnome-" to all the desktop files it installs - * in datadir/applications/ or it could install desktop files in a - * datadir/applications/gnome subdirectory. - * - * -- - * - * https://specifications.freedesktop.org/desktop-entry-spec/latest/ape.html says: - * The desktop file ID is the identifier of an installed desktop entry file. - * - * To determine the ID of a desktop file, make its full path relative - * to the $XDG_DATA_DIRS component in which the desktop file is installed, - * remove the "applications/" prefix, and turn '/' into '-'. - * For example /usr/share/applications/foo/bar.desktop has the desktop file ID - * foo-bar.desktop. - * If multiple files have the same desktop file ID, the first one in the - * $XDG_DATA_DIRS precedence order is used. - * For example, if $XDG_DATA_DIRS contains the default paths - * /usr/local/share:/usr/share, then /usr/local/share/applications/org.foo.bar.desktop - * and /usr/share/applications/org.foo.bar.desktop both have the same desktop file ID - * org.foo.bar.desktop, but only the first one will be used. - * - * -- - * - * https://specifications.freedesktop.org/desktop-entry-spec/latest/ar01s07.html says: - * - * The application must name its desktop file in accordance with the naming - * recommendations in the introduction section (e.g. the filename must be like - * org.example.FooViewer.desktop). The application must have a D-Bus service - * activatable at the well-known name that is equal to the desktop file name - * with the .desktop portion removed (for our example, org.example.FooViewer). - * - * -- - * - * Can it really be that no one thought about having multiple versions of the same - * application installed? What are we supposed to do if we want - * a) have desktop files installed by appimaged not interfere with desktop files - * provided by the system, i.e., if an application is installed in the system - * and the user also installs the AppImage, then both should be available to the user - * b) both should be D-Bus activatable - * c) the one installed by appimaged should have an AppImage vendor prefix to make - * it easy to distinguish it from system- or upstream-provided ones - */ - - /* FIXME: The following is most likely not correct; see the comments above. - * Open a GitHub issue or send a pull request if you would like to propose asolution. */ - /* TODO: Check for consistency of the id with the AppStream file, if it exists in the AppImage */ - gchar *destination = build_installed_desktop_file_path(md5, desktop_filename); - - /* When appimaged sees itself, then do nothing here */ - if(strcmp ("appimaged.desktop", desktop_filename) == 0) { - g_free(destination); -#ifdef STANDALONE - fprintf(stderr, "appimaged's desktop file found -- not installing desktop file for myself\n"); -#endif - return true; - } - - if(verbose) - fprintf(stderr, "install: %s\n", destination); - - gchar *dirname = g_path_get_dirname(destination); - if(g_mkdir_with_parents(dirname, 0755)) { -#ifdef STANDALONE - fprintf(stderr, "Could not create directory: %s\n", dirname); -#endif - } - g_free(dirname); - - // g_key_file_save_to_file(key_file_structure, destination, NULL); - // g_key_file_save_to_file is too new, only since 2.40 - /* Write config file on disk */ - gsize length; - gchar *buf; - GIOChannel *file; - buf = g_key_file_to_data(key_file_structure, &length, NULL); - file = g_io_channel_new_file(destination, "w", NULL); - g_io_channel_write_chars(file, buf, length, NULL, NULL); - g_io_channel_shutdown(file, TRUE, NULL); - g_io_channel_unref(file); - - g_free(buf); - - /* GNOME shows the icon and name on the desktop file only if it is executable */ - chmod(destination, 0755); - - g_free(destination); - - return true; -} - -bool appimage_type1_get_desktop_filename_and_key_file(struct archive** a, gchar** desktop_filename, GKeyFile** key_file) { - // iterate over all files ("entries") in the archive - // looking for a file with .desktop extension in the root directory - - // must not be freed - struct archive_entry* entry; - - gchar* filename; - - for (;;) { - int r = archive_read_next_header(*a, &entry); - - if (r == ARCHIVE_EOF) { - return false; - } - - if (r != ARCHIVE_OK) { - fprintf(stderr, "%s\n", archive_error_string(*a)); - return false; - } - - /* Skip all but regular files; FIXME: Also handle symlinks correctly */ - if (archive_entry_filetype(entry) != AE_IFREG) - continue; - - filename = replace_str(archive_entry_pathname(entry), "./", ""); - - /* Get desktop file(s) in the root directory of the AppImage and act on it in one go */ - if ((g_str_has_suffix(filename, ".desktop") && (NULL == strstr(filename, "/")))) { -#ifdef STANDALONE - fprintf(stderr, "Got root desktop: %s\n", filename); -#endif - - const void* buff; - - size_t size = 1024 * 1024; - int64_t offset = 0; - - r = archive_read_data_block(*a, &buff, &size, &offset); - - if (r == ARCHIVE_EOF) { - // cleanup - g_free(filename); - - return true; - } - - if (r != ARCHIVE_OK) { - fprintf(stderr, "%s", archive_error_string(*a)); - break; - } - - *desktop_filename = g_path_get_basename(filename); - - // a structure that will hold the information from the desktop file - *key_file = g_key_file_new(); - - gboolean success = g_key_file_load_from_data(*key_file, buff, size, - G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, NULL); - - if (!success) { - // cleanup - g_free(key_file); - key_file = NULL; - - break; - } - - // cleanup - g_free(filename); - - return true; - } - } - - g_free(filename); - - return false; -} - -bool archive_copy_icons_recursively_to_destination(struct archive** a, const gchar* md5, - const gchar* desktop_icon_value_original, gboolean verbose) { - // iterate over all files ("entries") in the archive - // looking for a file with .desktop extension in the root directory - struct archive_entry* entry; - gchar* filename = NULL; - - bool errored = false; - - for (;;) { - int r = archive_read_next_header(*a, &entry); - - if (r == ARCHIVE_EOF) { - break; - } - - if (r != ARCHIVE_OK) { - fprintf(stderr, "%s\n", archive_error_string(*a)); - - errored = true; - break; - } - - /* Skip all but regular files; FIXME: Also handle symlinks correctly */ - if (archive_entry_filetype(entry) != AE_IFREG) - continue; - - filename = replace_str(archive_entry_pathname(entry), "./", ""); - - gchar* dest = NULL; - - // Get icon file(s) and MIME types and act on them in one go - - // add vendor prefix (and MD5 hash as an identifier for future operations) - if (g_str_has_prefix(filename, "usr/share/icons/") - || g_str_has_prefix(filename, "usr/share/pixmaps/") - || (g_str_has_prefix(filename, "usr/share/mime/") && g_str_has_suffix(filename, ".xml")) - ) { - - gchar* dest_path = replace_str(filename, "usr/share", xdg_data_home()); - gchar* dest_dirname = g_path_get_dirname(dest_path); - g_free(dest_path); - - gchar* file_basename = g_path_get_basename(filename); - gchar* dest_basename = g_strdup_printf("%s_%s_%s", vendorprefix, md5, file_basename); - g_free(file_basename); - - dest = g_build_path("/", dest_dirname, dest_basename, NULL); - - g_free(dest_basename); - g_free(dest_dirname); - } - - // According to https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html#install_icons - // share/pixmaps is ONLY searched in /usr but not in $XDG_DATA_DIRS and hence $HOME and this seems to be true at least in XFCE - if (g_str_has_prefix(filename, "usr/share/pixmaps/")) { - // clean up dest in case it has been set before - g_free(dest); - - // TODO: avoid cluttering /tmp too much - dest = g_build_path("/", "/tmp", NULL); - } - - if (desktop_icon_value_original != NULL) { - if (g_str_has_prefix(filename, desktop_icon_value_original) && !strstr(filename, "/") && (g_str_has_suffix(filename, ".png") || g_str_has_suffix(filename, ".xpm") || g_str_has_suffix(filename, ".svg") || g_str_has_suffix(filename, ".svgz"))) { - gchar* file_extension = get_file_extension(filename); - gchar* dest_basename = g_strdup_printf("%s_%s_%s.%s", vendorprefix, md5, desktop_icon_value_original, - file_extension); - g_free(file_extension); - - // clean up dest in case it has been set before - g_free(dest); - - // TODO: avoid cluttering /tmp too much - dest = g_build_path("/", "/tmp", dest_basename, NULL); - - g_free(dest_basename); - } - } - - // cleanup - g_free(filename); - - if (dest != NULL && strlen(dest) <= 0) { - if (verbose) - fprintf(stderr, "install: %s\n", dest); - - gchar* dir_name = g_path_get_dirname(dest); - - if (g_mkdir_with_parents(dir_name, 0755)) { - fprintf(stderr, "Could not create directory: %s\n", dir_name); - - // cleanup - g_free(dir_name); - - errored = true; - break; - } - - g_free(dir_name); - - FILE *f = fopen(dest, "w+"); - - if (f == NULL) { - int error = errno; -#ifdef STANDALONE - fprintf(stderr, "Could not open file %s for writing: %s\n", dest, strerror(error)); -#endif - - // cleanup - g_free(dest); - - errored = true; - break; - } - - const void* buff; - - size_t size; - int64_t offset; - - for (;;) { - r = archive_read_data_block(*a, &buff, &size, &offset); - - if (r == ARCHIVE_EOF) - break; - - if (r != ARCHIVE_OK) { -#ifdef STANDALONE - fprintf(stderr, "%s\n", archive_error_string(*a)); -#endif - break; - } - - if (fwrite(buff, 1, size, f) != size) { -#ifdef STANDALONE - int error = errno; - fprintf(stderr, "Failed to copy icon: %s\n", strerror(error)); -#endif - errored = true; - break; - } - } - - fclose(f); - chmod(dest, 0644); - - if (verbose && !errored) { - fprintf(stderr, "Installed: %s\n", dest); - } - - if (!errored && g_str_has_prefix(dest, "/tmp")) { - move_icon_to_destination(dest, verbose); - } - - g_free(dest); - - if (errored) - break; - } - } - - return !errored; -} - -/* Register a type 1 AppImage in the system */ -bool appimage_type1_register_in_system(const char *path, bool verbose) -{ -#ifdef STANDALONE - fprintf(stderr, "ISO9660 based type 1 AppImage\n"); -#endif - gchar *desktop_icon_value_original = NULL; - - char *md5 = appimage_get_md5(path); - - if(verbose) - fprintf(stderr, "md5 of URI RFC 2396: %s\n", md5); - - // open ISO9660 image using libarchive - struct archive *a = archive_read_new(); - archive_read_support_format_iso9660(a); - - // libarchive status int -- passed to called functions - int r; - - // use global bool to not have duplicate cleanup code in the following calls - // all if() checks need to be prefixed with "!errored &&" therefore, and on error need to set errored to true - // this would be _by far_ less complex code in C++, where lambdas and strings and other nice things exist... - bool errored = false; - - if ((r = archive_read_open_filename(a, path, 10240)) != ARCHIVE_OK) { -#ifdef STANDALONE - fprintf(stderr, "%s\n", archive_error_string(a)); -#endif - errored = true; - } - // search image for root desktop file, and read it into key file structure so it can be edited eventually - gchar *desktop_filename = NULL; - GKeyFile *key_file = NULL; - - if (!errored && !appimage_type1_get_desktop_filename_and_key_file(&a, &desktop_filename, &key_file)) { - errored = true; - } - - // validate that both have been set to a non-NULL value - if (desktop_filename == NULL || key_file == NULL) { - errored = true; - } - - if (!errored) { - desktop_icon_value_original = g_key_file_get_string(key_file, "Desktop Entry", "Icon", NULL); - - if (verbose) - fprintf(stderr, "desktop_icon_value_original: %s\n", desktop_icon_value_original); - - if (!write_edited_desktop_file(key_file, path, desktop_filename, 1, md5, verbose)) { -#ifdef STANDALONE - fprintf(stderr, "Failed to install desktop file\n"); -#endif - errored = true; - } - } - - // next step: copy icons recursively to their target destination - - // reopen ISO9660 image - // TODO: merge both steps (reading desktop file and copying icons) again to not have to read the ISO file twice - if (!errored) { - // close and reopen archive - archive_read_free(a); - - a = archive_read_new(); - archive_read_support_format_iso9660(a); - - if ((r = archive_read_open_filename(a, path, 10240)) != ARCHIVE_OK) { -#ifdef STANDALONE - fprintf(stderr, "archive error: %s\n", archive_error_string(a)); -#endif - errored = true; - } else { - if (!archive_copy_icons_recursively_to_destination(&a, md5, desktop_icon_value_original, verbose)) { - errored = true; - } - } - } - - // cleanup - g_free(desktop_filename); - g_free(desktop_icon_value_original); - g_free(md5); - g_key_file_free(key_file); - archive_read_free(a); - - return !errored; -} - -bool appimage_type2_get_desktop_filename_and_key_file(sqfs* fs, gchar** desktop_filename, gchar* md5, GKeyFile** key_file, gboolean verbose) { - /* TOOO: Change so that only one run of squash_get_matching_files is needed in total, - * this should hopefully improve performance */ - - /* Get desktop file(s) in the root directory of the AppImage */ - // Only in root dir - gchar** str_array = squash_get_matching_files_install_icons_and_mime_data(fs, "(^[^/]*?.desktop$)", "", md5, verbose); - - bool errored = false; - - // gchar **str_array = squash_get_matching_files(&fs, "(^.*?.desktop$)", md5, verbose); // Not only there - /* Work trough the NULL-terminated array of strings */ - for (int i = 0; str_array[i]; ++i) { -#ifdef STANDALONE - fprintf(stderr, "Got root desktop: %s\n", str_array[i]); -#endif - - if (!g_key_file_load_from_squash(fs, str_array[i], *key_file, verbose)) - errored = true; - else - *desktop_filename = g_path_get_basename(str_array[i]); - } - - /* Free the NULL-terminated array of strings and its contents */ - g_strfreev(str_array); - - return !errored; -} - -/* Register a type 2 AppImage in the system */ -bool appimage_type2_register_in_system(const char *path, bool verbose) { -#ifdef STANDALONE - fprintf(stderr, "squashfs based type 2 AppImage\n"); -#endif - - // the offset at which a squashfs image is expected - char* md5 = appimage_get_md5(path); - - // a structure that will hold the information from the desktop file - GKeyFile* key_file = g_key_file_new(); - // FIXME: otherwise the regex does weird stuff in the first run - gchar* desktop_icon_value_original = "iDoNotMatchARegex"; - - if (verbose) - fprintf(stderr, "md5 of URI RFC 2396: %s\n", md5); - - ssize_t fs_offset = appimage_get_elf_size(path); - - if (fs_offset < 0) { - if (verbose) - fprintf(stderr, "failed to read fs_offset\n"); - return false; - } - - if (verbose) - fprintf(stderr, "fs_offset: %lu\n", fs_offset); - - sqfs fs; - - sqfs_err err = sqfs_open_image(&fs, path, (size_t) fs_offset); - - if (err != SQFS_OK) { - sqfs_destroy(&fs); -#ifdef STANDALONE - fprintf(stderr, "sqfs_open_image error: %s\n", path); -#endif - return FALSE; - } else { - if (verbose) - fprintf(stderr, "sqfs_open_image: %s\n", path); - } - - gchar* desktop_filename = NULL; - - bool errored = false; - - if (appimage_type2_get_desktop_filename_and_key_file(&fs, &desktop_filename, md5, &key_file, verbose)) { - desktop_icon_value_original = g_key_file_get_value(key_file, "Desktop Entry", "Icon", NULL); - - if (desktop_icon_value_original == NULL) { - errored = true; - } else { - if (verbose) - fprintf(stderr, "desktop_icon_value_original: %s\n", desktop_icon_value_original); - if (!write_edited_desktop_file(key_file, path, desktop_filename, 2, md5, verbose)) { -#ifdef STANDALONE - fprintf(stderr, "Failed to install desktop file\n"); -#endif - return false; - } - } - } else { - errored = true; - } - - if (!errored) { - /* Get relevant file(s) */ - static char* const pattern = "(^usr/share/(icons|pixmaps)/.*.(png|svg|svgz|xpm)$|^.DirIcon$|^usr/share/mime/packages/.*.xml$|^usr/share/appdata/.*metainfo.xml$|^[^/]*?.(png|svg|svgz|xpm)$)"; - - gchar** str_array2 = squash_get_matching_files_install_icons_and_mime_data(&fs, pattern, desktop_icon_value_original, md5, verbose); - - /* Free the NULL-terminated array of strings and its contents */ - g_strfreev(str_array2); - } - - /* The above also gets AppStream metainfo file(s), TODO: Check if the id matches and do something with them*/ - set_executable(path, verbose); - - g_free(desktop_filename); - sqfs_destroy(&fs); - - g_free(md5); - g_free(desktop_icon_value_original); - return TRUE; -} - -int appimage_type1_is_terminal_app(const char* path) { - // check if file exists - if (!g_file_test(path, G_FILE_TEST_IS_REGULAR)) - return -1; - - // check if file is of correct type - if (appimage_get_type(path, false) != 1) - return -1; - - char* md5 = appimage_get_md5(path); - - if (md5 == NULL) - return -1; - - // open ISO9660 image using libarchive - struct archive *a = archive_read_new(); - archive_read_support_format_iso9660(a); - - // libarchive status int -- passed to called functions - int r; - - if ((r = archive_read_open_filename(a, path, 10240)) != ARCHIVE_OK) { - // cleanup - free(md5); - archive_read_free(a); - - return -1; - } - // search image for root desktop file, and read it into key file structure so it can be edited eventually - gchar *desktop_filename = NULL; - GKeyFile *key_file = NULL; - - if (!appimage_type1_get_desktop_filename_and_key_file(&a, &desktop_filename, &key_file)) { - // cleanup - free(md5); - archive_read_free(a); - g_free(desktop_filename); - g_key_file_free(key_file); - - return -1; - } - - // validate that both have been set to a non-NULL value - if (desktop_filename == NULL || key_file == NULL) { - // cleanup - free(md5); - archive_read_free(a); - g_free(desktop_filename); - g_key_file_free(key_file); - - return -1; - } - - GError *error = NULL; - gboolean rv = g_key_file_get_boolean(key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TERMINAL, &error); - - // cleanup - free(md5); - archive_read_free(a); - g_free(desktop_filename); - g_key_file_free(key_file); - - int result; - - if (!rv) { - // if the key file hasn't been found and the error is not set to NOT_FOUND, return an error - if (error != NULL && error->code != G_KEY_FILE_ERROR_KEY_NOT_FOUND) - result = -1; - else - result = 0; - } else { - result = 1; - } - - if (error != NULL) - g_error_free(error); - - return result; -}; - -int appimage_type2_is_terminal_app(const char* path) { - // check if file exists - if (!g_file_test(path, G_FILE_TEST_IS_REGULAR)) - return -1; - - // check if file is of correct type - if (appimage_get_type(path, false) != 2) - return -1; - - char* md5 = appimage_get_md5(path); - - if (md5 == NULL) - return -1; - - ssize_t fs_offset = appimage_get_elf_size(path); - - // error check - if (fs_offset < 0) - return -1; - - sqfs fs; - - sqfs_err err = sqfs_open_image(&fs, path, (size_t) fs_offset); - - if (err != SQFS_OK) { - free(md5); - sqfs_destroy(&fs); - return -1; - } - - gchar* desktop_filename = NULL; - - // a structure that will hold the information from the desktop file - GKeyFile* key_file = g_key_file_new(); - - if (!appimage_type2_get_desktop_filename_and_key_file(&fs, &desktop_filename, md5, &key_file, false)) { - // cleanup - free(md5); - free(desktop_filename); - sqfs_destroy(&fs); - g_key_file_free(key_file); - - return -1; - } - - // validate that both have been set to a non-NULL value - if (desktop_filename == NULL || key_file == NULL) { - // cleanup - free(md5); - sqfs_destroy(&fs); - g_free(desktop_filename); - g_key_file_free(key_file); - - return -1; - } - - // no longer used - free(md5); - - GError *error = NULL; - gboolean rv = g_key_file_get_boolean(key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TERMINAL, &error); - - // cleanup - free(desktop_filename); - sqfs_destroy(&fs); - g_key_file_free(key_file); - - int result; - - if (!rv) { - // if the key file hasn't been found and the error is not set to NOT_FOUND, return an error - if (error != NULL && error->code != G_KEY_FILE_ERROR_KEY_NOT_FOUND) - result = -1; - else - result = 0; - } else { - result = 1; - } - - if (error != NULL) - g_error_free(error); - - return result; -}; - -/* - * Checks whether an AppImage's desktop file has set Terminal=true. - * Useful to check whether the author of an AppImage doesn't want it to be integrated. - * - * Returns >0 if set, 0 if not set, <0 on errors. - */ -int appimage_is_terminal_app(const char *path) { - // check if file exists - if (!g_file_test(path, G_FILE_TEST_IS_REGULAR)) - return -1; - - int type = appimage_get_type(path, false); - - switch (type) { - case 1: - return appimage_type1_is_terminal_app(path); - case 2: - return appimage_type2_is_terminal_app(path); - default: - return -1; - } -} - -int appimage_type1_shall_not_be_integrated(const char* path) { - // check if file exists - if (!g_file_test(path, G_FILE_TEST_IS_REGULAR)) - return -1; - - // check if file is of correct type - if (appimage_get_type(path, false) != 1) - return -1; - - char* md5 = appimage_get_md5(path); - - if (md5 == NULL) - return -1; - - // open ISO9660 image using libarchive - struct archive *a = archive_read_new(); - archive_read_support_format_iso9660(a); - - // libarchive status int -- passed to called functions - int r; - - if ((r = archive_read_open_filename(a, path, 10240)) != ARCHIVE_OK) { - // cleanup - free(md5); - archive_read_free(a); - - return -1; - } - // search image for root desktop file, and read it into key file structure so it can be edited eventually - gchar *desktop_filename = NULL; - GKeyFile *key_file = NULL; - - if (!appimage_type1_get_desktop_filename_and_key_file(&a, &desktop_filename, &key_file)) { - // cleanup - free(md5); - archive_read_free(a); - g_free(desktop_filename); - g_key_file_free(key_file); - - return -1; - } - - // validate that both have been set to a non-NULL value - if (desktop_filename == NULL || key_file == NULL) { - // cleanup - free(md5); - archive_read_free(a); - g_free(desktop_filename); - g_key_file_free(key_file); - - return -1; - } - - GError *error = NULL; - gboolean rv = g_key_file_get_boolean(key_file, G_KEY_FILE_DESKTOP_GROUP, "X-AppImage-Integrate", &error); - - // cleanup - free(md5); - archive_read_free(a); - g_free(desktop_filename); - g_key_file_free(key_file); - - int result; - - if (!rv) { - // if the key file hasn't been found and the error is not set to NOT_FOUND, return an error - if (error != NULL) { - if (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND) - result = 0; - else - result = -1; - } - else { - result = 1; - } - } else { - result = 0; - } - - if (error != NULL) - g_error_free(error); - - return result; -}; - -int appimage_type2_shall_not_be_integrated(const char* path) { - // check if file exists - if (!g_file_test(path, G_FILE_TEST_IS_REGULAR)) - return -1; - - // check if file is of correct type - if (appimage_get_type(path, false) != 2) - return -1; - - char* md5 = appimage_get_md5(path); - - if (md5 == NULL) - return -1; - - ssize_t fs_offset = appimage_get_elf_size(path); - - if (fs_offset < 0) - return -1; - - sqfs fs; - - sqfs_err err = sqfs_open_image(&fs, path, (size_t) fs_offset); - - if (err != SQFS_OK) { - free(md5); - sqfs_destroy(&fs); - return -1; - } - - gchar* desktop_filename = NULL; - - // a structure that will hold the information from the desktop file - GKeyFile* key_file = g_key_file_new(); - - if (!appimage_type2_get_desktop_filename_and_key_file(&fs, &desktop_filename, md5, &key_file, false)) { - // cleanup - free(md5); - free(desktop_filename); - sqfs_destroy(&fs); - g_key_file_free(key_file); - - return -1; - } - - // validate that both have been set to a non-NULL value - if (desktop_filename == NULL || key_file == NULL) { - // cleanup - free(md5); - sqfs_destroy(&fs); - g_free(desktop_filename); - g_key_file_free(key_file); - - return -1; - } - - // no longer used - free(md5); - - GError *error = NULL; - gboolean rv = g_key_file_get_boolean(key_file, G_KEY_FILE_DESKTOP_GROUP, "X-AppImage-Integrate", &error); - - // cleanup - free(desktop_filename); - sqfs_destroy(&fs); - g_key_file_free(key_file); - - int result; - - if (!rv) { - // if the key file hasn't been found and the error is not set to NOT_FOUND, return an error - if (error != NULL) { - if (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND) - result = 0; - else - result = -1; - } else { - result = 1; - } - } else { - result = 0; - } - - if (error != NULL) - g_error_free(error); - - return result; -}; - -/* - * Checks whether an AppImage's desktop file has set X-AppImage-Integrate=false. - * Useful to check whether the author of an AppImage doesn't want it to be integrated. - * - * Returns >0 if set, 0 if not set, <0 on errors. - */ -int appimage_shall_not_be_integrated(const char *path) { - // check if file exists - if (!g_file_test(path, G_FILE_TEST_IS_REGULAR)) - return -1; - - int type = appimage_get_type(path, false); - - switch (type) { - case 1: - return appimage_type1_shall_not_be_integrated(path); - case 2: - return appimage_type2_shall_not_be_integrated(path); - default: - return -1; - } -} - -char* appimage_registered_desktop_file_path(const char *path, char *md5, bool verbose) { - glob_t pglob = {}; - - // if md5 has been calculated before, we can just use it to save these extra calculations - // if not, we need to calculate it here - if (md5 == NULL) - md5 = appimage_get_md5(path); - - // sanity check - if (md5 == NULL) { - if (verbose) - fprintf(stderr, "appimage_get_md5() failed\n"); - return NULL; - } - - char *data_home = xdg_data_home(); - - // TODO: calculate this value exactly - char *glob_pattern = malloc(PATH_MAX); - sprintf(glob_pattern, "%s/applications/appimagekit_%s-*.desktop", data_home, md5); - - glob(glob_pattern, 0, NULL, &pglob); - - char* rv = NULL; - - if (pglob.gl_pathc <= 0) { - if (verbose) { - fprintf(stderr, "No results found by glob()"); - } - } else if (pglob.gl_pathc >= 1) { - if (pglob.gl_pathc > 1 && verbose) { - fprintf(stderr, "Too many results returned by glob(), returning first result found"); - } - - // need to copy value to be able to globfree() later on - rv = strdup(pglob.gl_pathv[0]); - } - - globfree(&pglob); - - return rv; -}; - -/* Check whether AppImage is registered in the system already */ -bool appimage_is_registered_in_system(const char* path) { - // there's two criteria whether an AppImage has been registered in the system: - // 1) Has the thumbnail been created? - // 2) Has the desktop file been registered? - // if both questions can be answered yes, then an AppImage has been registered properly - - if (!g_file_test(path, G_FILE_TEST_IS_REGULAR)) - return false; - - gchar* thumbnail_path = get_thumbnail_path(path, "normal", false); - if (!g_file_test(thumbnail_path, G_FILE_TEST_IS_REGULAR)) { - // cleanup - g_free(thumbnail_path); - - return false; - } - - gchar* md5 = appimage_get_md5(path); - - GKeyFile* key_file = g_key_file_new(); - gchar* desktop_file_path = appimage_registered_desktop_file_path(path, md5, false); - - bool rv = true; - - if (!g_file_test(desktop_file_path, G_FILE_TEST_IS_REGULAR)) - rv = false; - - g_free(thumbnail_path); - g_free(md5); - g_free(desktop_file_path); - g_key_file_free(key_file); - - return rv; -} - -/* - * Register an AppImage in the system - * Returns 0 on success, non-0 otherwise. - */ -int appimage_register_in_system(const char *path, bool verbose) -{ - if((g_str_has_suffix(path, ".part")) || - g_str_has_suffix(path, ".tmp") || - g_str_has_suffix(path, ".download") || - g_str_has_suffix(path, ".zs-old") || - g_str_has_suffix(path, ".~") - ) { - return 1; - } - - int type = appimage_get_type(path, verbose); - - if(type != -1) { -#ifdef STANDALONE - fprintf(stderr, "\n-> Registering type %d AppImage: %s\n", type, path); -#endif - appimage_create_thumbnail(path, false); - } else { - if (verbose) - fprintf(stderr, "-> Skipping file %s\n", path); - return 0; - } - - switch (type) { - case 1: - if (!appimage_type1_register_in_system(path, verbose)) - return 1; - break; - case 2: - if (!appimage_type2_register_in_system(path, verbose)) - return 1; - break; - default: -#ifdef STANDALONE - fprintf(stderr, "Error: unknown AppImage type %d\n", type); -#endif - return 1; - } - - return 0; -} - -/* Delete the thumbnail for a given file and size if it exists */ -void delete_thumbnail(char *path, char *size, gboolean verbose) -{ - gchar *thumbnail_path = get_thumbnail_path(path, size, verbose); - if(verbose) - fprintf(stderr, "get_thumbnail_path: %s\n", thumbnail_path); - if(g_file_test(thumbnail_path, G_FILE_TEST_IS_REGULAR)){ - g_unlink(thumbnail_path); - if(verbose) - fprintf(stderr, "deleted: %s\n", thumbnail_path); - } - g_free(thumbnail_path); -} - -/* Recursively delete files in path and subdirectories that contain the given md5 - */ -void unregister_using_md5_id(const char *name, int level, char* md5, gboolean verbose) -{ - DIR *dir; - struct dirent *entry; - - if (!(dir = opendir(name))) - return; - if (!(entry = readdir(dir))) - return; - - do { - if (entry->d_type == DT_DIR) { - char path[1024]; - int len = snprintf(path, sizeof(path)-1, "%s/%s", name, entry->d_name); - path[len] = 0; - if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) - continue; - unregister_using_md5_id(path, level + 1, md5, verbose); - } - - else { - gchar *needle = g_strdup_printf("%s_%s", vendorprefix, md5); - if(strstr(entry->d_name, needle)) { - gchar *path_to_be_deleted = g_strdup_printf("%s/%s", name, entry->d_name); - if(g_file_test(path_to_be_deleted, G_FILE_TEST_IS_REGULAR)){ - g_unlink(path_to_be_deleted); - if(verbose) - fprintf(stderr, "deleted: %s\n", path_to_be_deleted); - } - g_free(path_to_be_deleted); - } - g_free(needle); - } - } while ((entry = readdir(dir)) != NULL); - closedir(dir); -} - - -/* Unregister an AppImage in the system */ -int appimage_unregister_in_system(const char *path, bool verbose) -{ - char *md5 = appimage_get_md5(path); - - /* The file is already gone by now, so we can't determine its type anymore */ -#ifdef STANDALONE - fprintf(stderr, "_________________________\n"); - fprintf(stderr, "\n"); - fprintf(stderr, "-> UNREGISTER %s\n", path); -#endif - /* Could use gnome_desktop_thumbnail_factory_lookup instead of the next line */ - - /* Delete the thumbnails if they exist */ - delete_thumbnail(path, "normal", verbose); // 128x128 - delete_thumbnail(path, "large", verbose); // 256x256 - - char* data_home = xdg_data_home(); - unregister_using_md5_id(data_home, 0, md5, verbose); - g_free(data_home); - - g_free(md5); - - return 0; -} - - - -bool is_handler_valid(const appimage_handler *handler) { - if (!handler) { -#ifdef STANDALONE - fprintf(stderr, "WARNING: Invalid handler found, you should take a look at this now!"); -#endif - return false; - } - - return true; -} - -void mk_base_dir(const char *target) -{ - gchar *dirname = g_path_get_dirname(target); - if(g_mkdir_with_parents(dirname, 0755)) { -#ifdef STANDALONE - fprintf(stderr, "Could not create directory: %s\n", dirname); -#endif - } - - g_free(dirname); -} - -/* - * Dummy fallback functions - */ -void dummy_traverse_func(appimage_handler *handler, traverse_cb command, void *data) { - (void) handler; - (void) command; - (void) data; - - fprintf(stderr, "Called %s\n", __FUNCTION__); -} - -char* dummy_get_file_name (appimage_handler *handler, void *data) { - fprintf(stderr, "Called %s\n", __FUNCTION__); -} - -void dummy_extract_file(struct appimage_handler *handler, void *data, char *target) { - fprintf(stderr, "Called %s\n", __FUNCTION__); -} - -/* - * AppImage Type 1 Functions - */ - -void appimage_type1_open(appimage_handler *handler) { - if ( is_handler_valid(handler) && !handler->is_open ) { -#ifdef STANDALONE - fprintf(stderr, "Opening %s as Type 1 AppImage\n", handler->path); -#endif - struct archive *a; - a = archive_read_new(); - archive_read_support_format_iso9660(a); - if (archive_read_open_filename(a, handler->path, 10240) != ARCHIVE_OK) { - fprintf(stderr, "%s", archive_error_string(a)); - handler->cache = NULL; - handler->is_open = false; - } else { - handler->cache = a; - handler->is_open = true; - } - } -} - -void appimage_type1_close(appimage_handler *handler) { - if ( is_handler_valid(handler) && handler->is_open ) { -#ifdef STANDALONE - fprintf(stderr, "Closing %s\n", handler->path); -#endif - struct archive *a = handler->cache; - archive_read_close(a); - archive_read_free(a); - - handler->cache = NULL; - handler->is_open = false; - } -} - -void appimage_type1_traverse(appimage_handler *handler, traverse_cb command, void *command_data) { - appimage_type1_open(handler); - - if (!command) { -#ifdef STANDALONE - fprintf(stderr, "No traverse command set.\n"); -#endif - return; - } - - if (handler->is_open) { - struct archive *a = handler->cache; - struct archive_entry *entry; - int r; - - for (;;) { - r = archive_read_next_header(a, &entry); - if (r == ARCHIVE_EOF) { - break; - } - if (r != ARCHIVE_OK) { - fprintf(stderr, "%s\n", archive_error_string(a)); - break; - } - - /* Skip all but regular files; FIXME: Also handle symlinks correctly */ - if(archive_entry_filetype(entry) != AE_IFREG) { - continue; - } - - command(handler, entry, command_data); - } - } - - appimage_type1_close(handler); -} - -char* appimage_type1_get_file_name (appimage_handler *handler, void *data) { - (void) handler; - - struct archive_entry *entry = (struct archive_entry *) data; - - char *filename = replace_str(archive_entry_pathname(entry), "./", ""); - return filename; -} - -void appimage_type1_extract_file (appimage_handler *handler, void *data, const char *target) { - (void) data; - - struct archive *a = handler->cache; - mk_base_dir(target); - - mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; - int f = open(target, O_WRONLY | O_CREAT | O_TRUNC, mode); - - if (f == -1){ -#ifdef STANDALONE - fprintf(stderr, "open error: %s\n", target); -#endif - return; - } - - archive_read_data_into_fd(a, f); - close(f); -} - -appimage_handler appimage_type_1_create_handler() { - appimage_handler h; - h.traverse = appimage_type1_traverse; - h.get_file_name = appimage_type1_get_file_name; - h.extract_file = appimage_type1_extract_file; - - return h; -} - -/* - * AppImage Type 2 Functions - */ - -void appimage_type2_open(appimage_handler *handler) { - if (is_handler_valid(handler) && !handler->is_open) { -#ifdef STANDALONE - fprintf(stderr, "Opening %s as Type 2 AppImage\n", handler->path); -#endif - // The offset at which a squashfs image is expected - ssize_t fs_offset = appimage_get_elf_size(handler->path); - - if (fs_offset < 0) { -#ifdef STANDALONE - fprintf(stderr, "get_elf_size error\n"); -#endif - handler->is_open = false; - handler->cache = NULL; - return; - } - - sqfs *fs = malloc(sizeof(sqfs)); - sqfs_err err = sqfs_open_image(fs, handler->path, (size_t) fs_offset); - if (err != SQFS_OK){ -#ifdef STANDALONE - fprintf(stderr, "sqfs_open_image error: %s\n", handler->path); -#endif - free(fs); - handler->is_open = false; - handler->cache = NULL; - } else { - handler->is_open = true; - handler->cache = fs; - } - } -} - -void appimage_type2_close(appimage_handler *handler) { - if ( is_handler_valid(handler) && handler->is_open ) { -#ifdef STANDALONE - fprintf(stderr, "Closing %s\n", handler->path); -#endif - - sqfs_destroy(handler->cache); - free(handler->cache); - - handler->is_open = false; - handler->cache = NULL; - } -} - -void appimage_type2_traverse(appimage_handler *handler, traverse_cb command, void *command_data) { - appimage_type2_open(handler); - - if (handler->is_open && handler->cache != NULL) { - sqfs *fs = handler->cache; - sqfs_traverse trv; - sqfs_inode_id root_inode = sqfs_inode_root(fs); - sqfs_err err = sqfs_traverse_open(&trv, fs, root_inode); - if (err!= SQFS_OK) { -#ifdef STANDALONE - fprintf(stderr, "sqfs_traverse_open error\n"); -#endif - } - while (sqfs_traverse_next(&trv, &err)) - command(handler, &trv, command_data); - - if (err) { -#ifdef STANDALONE - fprintf(stderr, "sqfs_traverse_next error\n"); -#endif - } - sqfs_traverse_close(&trv); - } - - appimage_type2_close(handler); -} - -char* appimage_type2_get_file_name (appimage_handler *handler, void *data) { - (void) handler; - sqfs_traverse *trv = data; - return strdup(trv->path); -} - -void appimage_type2_extract_symlink(sqfs *fs, sqfs_inode *inode, const char *target); - -void appimage_type2_extract_regular_file(sqfs *fs, sqfs_inode *inode, const char* target) { - mk_base_dir(target); - - // Read the file in chunks - squash_extract_inode_to_file(fs, inode, target); -} -void appimage_type2_extract_file_following_symlinks(sqfs *fs, sqfs_inode *inode, const char* target) { - if(inode->base.inode_type == SQUASHFS_REG_TYPE) - appimage_type2_extract_regular_file(fs, inode, target); - else if(inode->base.inode_type == SQUASHFS_SYMLINK_TYPE) { - appimage_type2_extract_symlink(fs, inode, target); - } else { -#ifdef STANDALONE - fprintf(stderr, "WARNING: Unable to extract file of type %d", inode->base.inode_type); -#endif - } -} - -void appimage_type2_extract_symlink(sqfs *fs, sqfs_inode *inode, const char *target) { - size_t size; - sqfs_readlink(fs, inode, NULL, &size); - char buf[size]; - int ret = sqfs_readlink(fs, inode, buf, &size); - if (ret != 0) { -#ifdef STANDALONE - fprintf(stderr, "WARNING: Symlink error."); -#endif - } - else { - - sqfs_err err = sqfs_inode_get(fs, inode, fs->sb.root_inode); - if (err != SQFS_OK) { -#ifdef STANDALONE - fprintf(stderr, "WARNING: Unable to get the root inode. Error: %d", err); -#endif - } - - bool found = false; - err = sqfs_lookup_path(fs, inode, buf, &found); - if (err != SQFS_OK) { -#ifdef STANDALONE - fprintf(stderr, "WARNING: There was an error while trying to lookup a symblink. Error: %d", err); -#endif - } - - if (found) - appimage_type2_extract_file_following_symlinks(fs, inode, target); - } -} - -void appimage_type2_extract_file (appimage_handler *handler, void *data, const char *target) { - sqfs *fs = handler->cache; - sqfs_traverse *trv = data; - - sqfs_inode inode; - if(sqfs_inode_get(fs, &inode, trv->entry.inode)) { -#ifdef STANDALONE - fprintf(stderr, "sqfs_inode_get error\n"); -#endif - } - - appimage_type2_extract_file_following_symlinks(fs, &inode, target); -} - -appimage_handler appimage_type_2_create_handler() { - appimage_handler h; - h.traverse = appimage_type2_traverse; - h.get_file_name = appimage_type2_get_file_name; - h.extract_file = appimage_type2_extract_file; - - return h; -} - -/* Factory function for creating the right appimage handler for - * a given file. */ -appimage_handler create_appimage_handler(const char *const path) { - int appimage_type = appimage_get_type(path, 0); - - appimage_handler handler; -#ifdef STANDALONE - fprintf(stderr,"AppImage type: %d\n", appimage_type); -#endif - switch (appimage_type) { - case 1: - handler = appimage_type_1_create_handler(); - break; - case 2: - handler = appimage_type_2_create_handler(); - break; - default: -#ifdef STANDALONE - fprintf(stderr,"Appimage type %d not supported yet\n", appimage_type); -#endif - handler.traverse = dummy_traverse_func; - break; - } - handler.path = path; - handler.is_open = false; - return handler; -} - -void move_file(const char *source, const char *target) { - g_type_init(); - GError *error = NULL; - GFile *icon_file = g_file_new_for_path(source); - GFile *target_file = g_file_new_for_path(target); - if (!g_file_move (icon_file, target_file, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error)) { -#ifdef STANDALONE - fprintf(stderr, "Error moving file: %s\n", error->message); -#endif - g_clear_error (&error); - } - - g_object_unref(icon_file); - g_object_unref(target_file); -} - -struct extract_appimage_file_command_data { - const char *path; - const char *destination; -}; - -void extract_appimage_file_command(void *handler_data, void *entry_data, void *user_data) { - appimage_handler *h = handler_data; - struct archive_entry *entry = entry_data; - const struct extract_appimage_file_command_data const *params = user_data; - - char *filename = h->get_file_name(h, entry); - if (strcmp(params->path, filename) == 0) - h->extract_file(h, entry, params->destination); - - free(filename); -} - -void extract_appimage_file(appimage_handler *h, const char *path, const char *destination) { - struct extract_appimage_file_command_data data; - data.path = path; - data.destination = destination; - h->traverse(h, extract_appimage_file_command, &data); -} - -void extract_appimage_icon_command(void *handler_data, void *entry_data, void *user_data) { - appimage_handler *h = handler_data; - struct archive_entry *entry = entry_data; - gchar *path = user_data; - - char *filename = h->get_file_name(h, entry); - if (strcmp(".DirIcon", filename) == 0) - h->extract_file(h, entry, path); - - free(filename); -} - -void extract_appimage_icon(appimage_handler *h, gchar *target) { - h->traverse(h, extract_appimage_icon_command, target); -} - -/* Create AppImage thumbanil according to - * https://specifications.freedesktop.org/thumbnail-spec/0.8.0/index.html - */ -void appimage_create_thumbnail(const char *appimage_file_path, bool verbose) { - // extract AppImage icon to /tmp - appimage_handler handler = create_appimage_handler(appimage_file_path); - - char *tmp_path = "/tmp/appimage_thumbnail_tmp"; - extract_appimage_icon(&handler, tmp_path); - - if (g_file_test(tmp_path, G_FILE_TEST_EXISTS) ) { - // TODO: transform it to png with sizes 128x128 and 254x254 - gchar *target_path = get_thumbnail_path(appimage_file_path, "normal", verbose); - - mk_base_dir(target_path); - - // deploy icon as thumbnail - move_file (tmp_path, target_path); - - // clean up - g_free(target_path); - } else { -#ifdef STANDALONE - fprintf(stderr, "ERROR: Icon file not extracted: %s", tmp_path); -#endif - } - -} - -void appimage_extract_file_following_symlinks(const gchar* appimage_file_path, const char* file_path, - const char* target_dir) { - appimage_handler handler = create_appimage_handler(appimage_file_path); - - extract_appimage_file(&handler, file_path, target_dir); -} - -void extract_appimage_file_name(void *handler_data, void *entry_data, void *user_data) { - appimage_handler *h = handler_data; - struct archive_entry *entry = entry_data; - GList **list = user_data; - - char *filename = h->get_file_name(h, entry); - - GList* ptr = g_list_find_custom (*list, filename, g_strcmp0); - - if (ptr == NULL) - *list = g_list_append(*list, filename); - else - free(filename); -} - - -char** appimage_list_files(const char *path) { - GList *list = NULL; - appimage_handler handler = create_appimage_handler(path); - - handler.traverse(&handler, extract_appimage_file_name, &list); - - int n = g_list_length(list); - char **result = malloc(sizeof(char*) * (n+1) ); - result[n] = NULL; - - GList *itr = list; - for (int i = 0; i < n; i ++) { - result[i] = (char *) itr->data; - itr = itr->next; - } - - - g_list_free(list); - - return result; -} - -void appimage_string_list_free(char** list) { - for (char **ptr = list; ptr != NULL && *ptr != NULL; ptr ++) - free(*ptr); - - free(list); -} diff --git a/src/shared.h b/src/shared.h deleted file mode 100644 index d6567513a..000000000 --- a/src/shared.h +++ /dev/null @@ -1,100 +0,0 @@ -#pragma once - -#include -#include - -// include public header to avoid duplicate definitions of functions -#include "appimage/appimage.h" - -/* AppImage generic handler calback to be used in algorithms */ -typedef void (*traverse_cb)(void *handler, void *entry_data, void *user_data); - -/* AppImage generic handler to be used in algorithms */ -struct appimage_handler -{ - const gchar *path; - char* (*get_file_name) (struct appimage_handler *handler, void *entry); - void (*extract_file) (struct appimage_handler *handler, void *entry, const char *target); - - void (*traverse)(struct appimage_handler *handler, traverse_cb command, void *user_data); - - void *cache; - bool is_open; -} typedef appimage_handler; - -void extract_appimage_icon(appimage_handler* h, gchar* target); - -void extract_appimage_icon_command(void* handler_data, void* entry_data, void* user_data); - -void extract_appimage_file(appimage_handler* h, const char* path, const char* destination); - -void extract_appimage_file_command(void* handler_data, void* entry_data, void* user_data); - -void move_file(const char* source, const char* target); - -appimage_handler create_appimage_handler(const char* const path); - -appimage_handler appimage_type_2_create_handler(); - -void appimage_type2_extract_file(appimage_handler* handler, void* data, const char* target); - -void appimage_type2_extract_file_following_symlinks(sqfs* fs, sqfs_inode* inode, const char* target); - -void appimage_type2_extract_regular_file(sqfs* fs, sqfs_inode* inode, const char* target); - -void appimage_type2_extract_symlink(sqfs* fs, sqfs_inode* inode, const char* target); - -char* appimage_type2_get_file_name(appimage_handler* handler, void* data); - -void appimage_type2_traverse(appimage_handler* handler, traverse_cb command, void* command_data); - -void appimage_type2_close(appimage_handler* handler); - -void appimage_type2_open(appimage_handler* handler); - -appimage_handler appimage_type_1_create_handler(); - -void appimage_type1_extract_file(appimage_handler* handler, void* data, const char* target); - -char* appimage_type1_get_file_name(appimage_handler* handler, void* data); - -void appimage_type1_traverse(appimage_handler* handler, traverse_cb command, void* command_data); - -void appimage_type1_close(appimage_handler* handler); - -void appimage_type1_open(appimage_handler* handler); - -void dummy_extract_file(struct appimage_handler* handler, void* data, char* target); - -char* dummy_get_file_name(appimage_handler* handler, void* data); - -void dummy_traverse_func(appimage_handler* handler, traverse_cb command, void* data); - -void mk_base_dir(const char* target); - -bool is_handler_valid(const appimage_handler* handler); - -void unregister_using_md5_id(const char* name, int level, char* md5, gboolean verbose); - -void delete_thumbnail(char* path, char* size, gboolean verbose); - -bool write_edited_desktop_file(GKeyFile* key_file_structure, const char* appimage_path, gchar* desktop_filename, - int appimage_type, char* md5, gboolean verbose); - -gboolean g_key_file_load_from_squash(sqfs* fs, char* path, GKeyFile* key_file_structure, gboolean verbose); - -gchar** squash_get_matching_files_install_icons_and_mime_data(sqfs* fs, char* pattern, - gchar* desktop_icon_value_original, char* md5, - gboolean verbose); - -void squash_extract_inode_to_file(sqfs* fs, sqfs_inode* inode, const gchar* dest); - -void move_icon_to_destination(gchar* icon_path, gboolean verbose); - -char* get_thumbnail_path(const char* path, char* thumbnail_size, gboolean verbose); - -gchar* replace_str(const gchar* src, const gchar* find, const gchar* replace); - -void set_executable(const char* path, gboolean verbose); - -extern char* vendorprefix; diff --git a/src/validate.c b/src/validate.c index 8023ea7fc..f4cfd23e3 100644 --- a/src/validate.c +++ b/src/validate.c @@ -1,7 +1,3 @@ -/* - cc -o validate ../getsection.c ../validate.c -lssl -lcrypto $(pkg-config --cflags glib-2.0) -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -*/ - #include #include #include @@ -17,7 +13,7 @@ #include #include "appimage/appimage.h" -#include "getsection.h" +#include "appimage/appimage_shared.h" #include "light_elf.h" typedef unsigned char byte; diff --git a/src/xdg-basedir/CMakeLists.txt b/src/xdg-basedir/CMakeLists.txt deleted file mode 100644 index d015221d3..000000000 --- a/src/xdg-basedir/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -# target_include_libraries was introduced in version 3.0 -cmake_minimum_required(VERSION 3.0) - -include_directories(${gtest_INCLUDE_DIRS}) - -# force static linking -add_library(xdg-basedir STATIC xdg-basedir.h xdg-basedir.c) -target_include_directories(xdg-basedir PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - -if (BUILD_TESTING) - add_executable(test-xdg-basedir test-xdg-basedir.cpp) - target_link_libraries(test-xdg-basedir ${gtest_LIBRARIES} pthread xdg-basedir) - if (NOT USE_SYSTEM_GTEST) - add_dependencies(test-xdg-basedir gtest) - endif () - add_test(test-xdg-basedir test-xdg-basedir) -endif () \ No newline at end of file diff --git a/src/xdg-basedir/test-xdg-basedir.cpp b/src/xdg-basedir/test-xdg-basedir.cpp deleted file mode 100644 index 4ca3647b5..000000000 --- a/src/xdg-basedir/test-xdg-basedir.cpp +++ /dev/null @@ -1,166 +0,0 @@ -// system headers -#include -#include - -// library headers -#include - -// local headers -#include "xdg-basedir.h" - -bool compareStrings(const char* str1, const char* str2) { - if (str1 == NULL || str2 == NULL) - return false; - - return strcmp(str1, str2) == 0; -} - -TEST(xdg_basedir_test, test_user_home_default_value) { - char* home = user_home(); - EXPECT_PRED2(compareStrings, home, getenv("HOME")); - free(home); -} - -TEST(xdg_basedir_test, test_user_home_custom_value) { - char* oldValue = strdup(getenv("HOME")); - setenv("HOME", "ABCDEFG", true); - - char* currentValue = user_home(); - EXPECT_PRED2(compareStrings, currentValue, getenv("HOME")); - EXPECT_PRED2(compareStrings, currentValue, "ABCDEFG"); - free(currentValue); - - setenv("HOME", oldValue, true); - free(oldValue); -} - -TEST(xdg_basedir_test, test_xdg_data_home_default_value) { - // make sure env var is not set, to force function to use default value - char* oldValue; - - if ((oldValue = getenv("XDG_DATA_HOME")) != NULL) { - unsetenv("XDG_DATA_HOME"); - } - - char* currentValue = xdg_data_home(); - - // too lazy to calculate size - char* expectedValue = static_cast(malloc(PATH_MAX)); - strcpy(expectedValue, getenv("HOME")); - strcat(expectedValue, "/.local/share"); - - EXPECT_PRED2(compareStrings, currentValue, expectedValue); - - free(expectedValue); - free(currentValue); - - if (oldValue != NULL) { - setenv("XDG_DATA_HOME", oldValue, true); - free(oldValue); - } -} - -TEST(xdg_basedir_test, test_xdg_data_home_custom_value) { - char* oldValue = getenv("XDG_DATA_HOME"); - setenv("XDG_DATA_HOME", "HIJKLM", true); - - char* currentValue = xdg_data_home(); - EXPECT_PRED2(compareStrings, currentValue, "HIJKLM"); - free(currentValue); - - if (oldValue != NULL) { - setenv("XDG_DATA_HOME", oldValue, true); - free(oldValue); - } else { - unsetenv("XDG_DATA_HOME"); - } -} - -TEST(xdg_basedir_test, test_xdg_config_home_default_value) { - // make sure env var is not set, to force function to use default value - char* oldValue; - - if ((oldValue = getenv("XDG_CONFIG_HOME")) != NULL) { - unsetenv("XDG_CONFIG_HOME"); - } - - char* currentValue = xdg_config_home(); - - // too lazy to calculate size - char* expectedValue = static_cast(malloc(PATH_MAX)); - strcpy(expectedValue, getenv("HOME")); - strcat(expectedValue, "/.config"); - - EXPECT_PRED2(compareStrings, currentValue, expectedValue); - - free(expectedValue); - free(currentValue); - - if (oldValue != NULL) { - setenv("XDG_CONFIG_HOME", oldValue, true); - free(oldValue); - } -} - -TEST(xdg_basedir_test, test_xdg_config_home_custom_value) { - char* oldValue = getenv("XDG_CONFIG_HOME"); - setenv("XDG_CONFIG_HOME", "NOPQRS", true); - - char* currentValue = xdg_config_home(); - EXPECT_PRED2(compareStrings, currentValue, "NOPQRS"); - free(currentValue); - - if (oldValue != NULL) { - setenv("XDG_CONFIG_HOME", oldValue, true); - free(oldValue); - } else { - unsetenv("XDG_CONFIG_HOME"); - } -} - -TEST(xdg_basedir_test, test_xdg_cache_home_default_value) { - // make sure env var is not set, to force function to use default value - char* oldValue; - - if ((oldValue = getenv("XDG_CACHE_HOME")) != NULL) { - unsetenv("XDG_CACHE_HOME"); - } - - char* currentValue = xdg_cache_home(); - - // too lazy to calculate size - char* expectedValue = static_cast(malloc(PATH_MAX)); - strcpy(expectedValue, getenv("HOME")); - strcat(expectedValue, "/.cache"); - - EXPECT_PRED2(compareStrings, currentValue, expectedValue); - - free(expectedValue); - free(currentValue); - - if (oldValue != NULL) { - setenv("XDG_CACHE_HOME", oldValue, true); - free(oldValue); - } -} - -TEST(xdg_basedir_test, test_xdg_cache_home_custom_value) { - char* oldValue = getenv("XDG_CACHE_HOME"); - setenv("XDG_CACHE_HOME", "TUVWXY", true); - - char* currentValue = xdg_cache_home(); - EXPECT_PRED2(compareStrings, currentValue, "TUVWXY"); - free(currentValue); - - if (oldValue != NULL) { - setenv("XDG_CACHE_HOME", oldValue, true); - free(oldValue); - } else { - unsetenv("XDG_CACHE_HOME"); - } -} - -int main(int argc, char **argv) { - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/src/xdg-basedir/xdg-basedir.c b/src/xdg-basedir/xdg-basedir.c deleted file mode 100644 index c154c763c..000000000 --- a/src/xdg-basedir/xdg-basedir.c +++ /dev/null @@ -1,67 +0,0 @@ -#include "xdg-basedir.h" -#include -#include - -char* user_home() { - return strdup(getenv("HOME")); -} - -char* xdg_config_home() { - char* config_home = getenv("XDG_CONFIG_HOME"); - - if (config_home == NULL) { - char* home = user_home(); - static const char const* suffix = "/.config"; - - config_home = calloc(strlen(home) + strlen(suffix) + 1, sizeof(char)); - - strcpy(config_home, home); - strcat(config_home, suffix); - - free(home); - - return config_home; - } else { - return strdup(config_home); - } -} - -char* xdg_data_home() { - char* data_home = getenv("XDG_DATA_HOME"); - - if (data_home == NULL) { - char* home = user_home(); - static const char const* suffix = "/.local/share"; - - data_home = calloc(strlen(home) + strlen(suffix) + 1, sizeof(char)); - - strcpy(data_home, home); - strcat(data_home, suffix); - - free(home); - - return data_home; - } else { - return strdup(data_home); - } -} - -char* xdg_cache_home() { - char* cache_home = getenv("XDG_CACHE_HOME"); - - if (cache_home == NULL) { - char* home = user_home(); - static const char const* suffix = "/.cache"; - - cache_home = calloc(strlen(home) + strlen(suffix) + 1, sizeof(char)); - - strcpy(cache_home, home); - strcat(cache_home, suffix); - - free(home); - - return cache_home; - } else { - return strdup(cache_home); - } -} diff --git a/src/xdg-basedir/xdg-basedir.h b/src/xdg-basedir/xdg-basedir.h deleted file mode 100644 index 17c5659f5..000000000 --- a/src/xdg-basedir/xdg-basedir.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef XDG_BASEDIR_H -#define XDG_BASEDIR_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Get user's home directory. Convenience wrapper for getenv("HOME"). - * Returns a freshly allocated char array that must be free'd after usage. - */ -char* user_home(); - -/* - * Get XDG config home directory using $XDG_CONFIG_HOME environment variable. - * Falls back to default value ~/.config if environment variable is not set. - * Returns a freshly allocated char array that must be free'd after usage. - */ -char* xdg_config_home(); - -/* - * Get XDG data home directory using $XDG_DATA_HOME environment variable. - * Falls back to default value ~/.local/share if environment variable is not set. - * Returns a freshly allocated char array that must be free'd after usage. - */ -char* xdg_data_home(); - -/* - * Get XDG cache home directory using $XDG_CACHE_HOME environment variable. - * Falls back to default value ~/.cache if environment variable is not set. - * Returns a freshly allocated char array that must be free'd after usage. - */ -char* xdg_cache_home(); - - -#ifdef __cplusplus -} -#endif - -#endif /* XDG_BASEDIR_H */ diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt deleted file mode 100644 index 8fbb0483d..000000000 --- a/tests/CMakeLists.txt +++ /dev/null @@ -1,102 +0,0 @@ -# build and add test only if tests are enabled -if(BUILD_TESTING) - add_definitions( - -DTEST_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data/" - -DGIT_COMMIT="AppImageKit unit tests" - ) - - - # Link runTests with what we want to test and the GTest and pthread library - add_executable(test_libappimage - test_libappimage.cpp - fixtures.h - ) - - target_link_libraries(test_libappimage - pthread - libappimage - xdg-basedir - gtest - ) - - add_test(test_libappimage test_libappimage) - - - add_executable(test_shared - test_shared.cpp - fixtures.h - ${PROJECT_SOURCE_DIR}/src/shared.c - ${PROJECT_SOURCE_DIR}/src/elf.c - ${PROJECT_SOURCE_DIR}/src/getsection.c - ${PROJECT_SOURCE_DIR}/src/appimagetool_shared.c - ${PROJECT_SOURCE_DIR}/src/hexlify.c - ) - - target_link_libraries(test_shared - PRIVATE - squashfuse - libarchive - inotify-tools - xz - xdg-basedir - pthread - libglib - libgio - libzlib - libcairo - gtest - ) - - target_include_directories(test_shared - # used to include shared.h - PRIVATE ${PROJECT_SOURCE_DIR}/src/ - # need to include libappimage's header directory as well - # as we're building this test manually from the source files, we need to replicate the build settings of - # libappimage, appimagetool, ... - PRIVATE ${PROJECT_SOURCE_DIR}/include/ - ) - - add_test(test_shared test_shared) - - target_compile_options(test_shared PRIVATE -fpermissive) - - - add_executable(test_getsection - test_getsection.cpp - fixtures.h - ${PROJECT_SOURCE_DIR}/src/light_elf.h - ${PROJECT_SOURCE_DIR}/src/light_byteswap.h - ${PROJECT_SOURCE_DIR}/src/elf.c - ${PROJECT_SOURCE_DIR}/src/getsection.c - ) - - target_link_libraries(test_getsection - PRIVATE - squashfuse - libarchive - inotify-tools - xz - xdg-basedir - pthread - libglib - libzlib - libcairo - gtest - ) - - target_include_directories(test_getsection - # used to include getsection.h - PRIVATE ${PROJECT_SOURCE_DIR}/src/ - # need to include libappimage's header directory as well - # as we're building this test manually from the source files, we need to replicate the build settings of - # libappimage, appimagetool, ... - PRIVATE ${PROJECT_SOURCE_DIR}/include/ - ) - - - add_dependencies(test_getsection squashfuse) - - add_test(test_getsection test_getsection) - - target_compile_options(test_getsection PRIVATE -fpermissive) -endif() diff --git a/tests/data/AppImageExtract_6-x86_64.AppImage b/tests/data/AppImageExtract_6-x86_64.AppImage deleted file mode 100755 index 20c26980179577510d964761cbc46ab3fb724355..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655360 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 z 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 z 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

{Z38$ysB!ca%)bQ@0lHf_pe(=E?xT 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

AlTxNG%*@88^I{yUSKUi8?8tGV{)#x`o6*y`T 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%0DP$ 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 w>0f8TLDp9>kf95$Xp}Yv32WF zsjszNdhX=qk9CGqv$fEi!sx1~mfGA8+w@%74?#+Pez_y)f4-cVS)%*lI72^U{ACtu zic!E}CBMUi4^cib0xb3eh;{-vsgOR!iv{SQKEI~~f(>HsYv;b^HWv(jf2Cbt@OQLp29;F_FCxB+%!Dr7LOdFuMUwv zM?qVQYA;Ju$R08z=j9h*0FdrnsDHdk`j~p%J0v=M)kSu${mlLQw-2=*nvt|1oloIQ z_s+gg10-%Z6{C`iuvL(Kuk{m+;yG!9@E18pHy+HEf^6 zw&KE(Q0^HSu@SzL?~M5CfSzax)bmFgVz8-XUb$&-hq_?*kmiz!^10?bjN4~?{jL$%9`|2(M_CFK>obo zNlM+f#>c+f%n~s(0b-KT?QZmF-v^OE3w|4SQ*U4EHSN8V=8fci>wOt}`xqBmRc~CQ zBUL1tfyR-ynXep~gN2UoX!U(-Kay_V;Zgd_0K`SC{J(yZWSs)MlzMN(z^>%+&2Y6f zK#`%ISxT?U^`}Lsu?=pSuc(CP5z8gcih zE?v*DG@FWWv=pFB`zwq9aIJTa?$tq@S7h~X1$%qyW+~I8l&>!v0q1?0TTMp$V!2{R z*REOz(_eRnP{xrQ!qbFvqSk!uwOiWpsm@1Bq~{hi5gl_uc+=BrQP}s)>+31)77$bF zmps;6FxVn}N5gIAP_a`B!o^wAv9|s|m)R)2T*-Lb&P{gnWLP(C&#%qll&(I#)Owsq zx=PXN97~B;&Xy)c#36$E28Z}_+3m-V=aF5?f#*CG0htH2M?jKsp218scQ1c7q2~DH zLBtB#>w|7PnQ?1(R=1w|4q(4rjvej82d2PeS^6TvHS)~gzXo4{J;4v!z(OLkgH364 z^ZTCy>)C4*IY|Ih#M(R~W^}SQ{dtj=8P~}Fo9lnAB@V2RUh=mZt^ZG7>&g$@@zvn9( zq{5NsG+F(-AE1#ogaUuu+ePjX9ewbAH1QPSckhs+-@G;!{otTmAQNu`Bdozjt7hgj zAgCtG9WZ8ZlIBdej#0doyi{VVr@%1Jj*C+&VpSWB1V~SYUOvD`l#xIgN{~LLiTq~< z0Zh4<`Dv|V*nr7CTx(I-Bp_YJE=diZAO5qI+zyL;0{W+ic3r{TMkJfHbK zjgnAKT7DWLDHrJ7MBRbEW$4DElWE7cenA!{r$tKk5G-|zjJj%p zT_$}krAzg#F&g(Kk1!qV%ywwkvbR?GfKK`d8cHl39K+CLVG~h=ryI~_{xNz?L9}== z&l3A`FacA{yj#D5!pOW!3TlP0Dr9~lZJ~G*;M{+V?nYGvdRt?>@WA6L<&H~p^a0I6 zz)f)aq?B-`*PJ_z|Gp~qL%5$*qo$hyjD+3w+=5%;g<+kn75}uN3IY9kH6BGXHY7 z-YeLRc%caxv>N^HV!lCt4x+&In;PI*vYiC)eBzaDm29!3o0vulG0$1TJqiyG2hbNa zpVg|jgD+DZ_;%3H$!&2@D5eX3hI3@nuIcD1%w-9WtpG}*i{gArddA~?=3p#>Cu+Ni z_Aj^AR9^V;4T{LSf(?k3&WuhbJu77xMxJ!D#O&c({rc2hmqzHN8k%ZI>v$Kfn!I4h` zj>Lawrx*yL|wibNM%*HyFIGlN0Zc%f4OEq?R!AJ&r(KE)tr;8_pJx4wk_sSkeQM;K`Ul#>YMxf;J` zgm6%drh(P(H#CVuKxPkcPjBhG%DH(hOTgFEKm38)pIJH)S)089*RPXEwLdEyGw&B*qd#M z$qEL2EHE!jeg1W(M-o3H@FdQ<4KS!vo|%cwBT%9OELI%5XG|nhas8iadoVS26a;&n zh4X(0oGdW2P2^GJ<*u()h<)nRD}q z1_P`L*v37mygoj}UtFjF+U9ojuzueMCP_Ga294@^!kiY8xgwV+A~g6!D#&R4`$DMR zh}Hf&(X}|bZ_}>a9(S>aIpTyXA99H<3moNz2^)e~h6D_cWi+e|&rxtCc~DZF0>gsZ zm~Z+}v`Wn}oI5VUmJWY=gUFNAT%AS8RA*M`V-(%yjN$yYWTK_53Ym*uyhZi+TaFJM z)k&cePkwb;j%8F7IDlKUw#!TQct{%f7CppjZnB8z1+;jZM-WyH#y9VccHEkTtk;$? zg-#yLo6?{hT{bpp_rNX3uH(w;9(tZrsCc==*I|$rJa<=eye3bD*GY7LBf3{umNnql zD%vBuw*;-$76pS}w-HIdr4g8z>8m}R4ISt1e8c-O{4h_p|JqAIb-ieTG%tj8NE~ga zJak$G04x{&l3p70Qc!Gu_(XRx^(t2D2D@!c_0$_)=y`PRc;&5gvyE$sST5RH^A%GGtDNN!5IONtxf34|I5k1v zxK(D|wjVhf`mJ^e1-wqrBbPwoK|}^QW7LZxH+L3X0uEj&3?L%~2+`4d+%{KisV*$R`zYB*zaHrmdg{b1`kv|YG3)-Ey7-rmpIQ3pM+zhN zF0zR80wTRacUi*bneeAW4tZA#F{CU}o;;>~p{{_O(8l$&nGQt3{+w}sFuCfvG|qKL zF2i-lhX!I$Fu?fKR%psAQ+0(b>F2gpr1HR0#H%%Tf(QSbPb5=M@8jpiemK&5460xM zneg3);`w_OPGgx(zyD1-o~}Zvu;K38HV^S2@Vap4p?xkj9;Au*!wvA&KJvg<^V6Oc zBaulpi+K~TF9)xg)b<8g$sS;)z8Bhk;=**8M0h2q6zd^TlO_Ci_Q>RWGd1r=vOH%e<3#W{~$4UA4127=#+CS zYX&$`GoCYV1MgGC-P+O-Qfx|f^@f2|D+tOKus_E>)-SINN z3oiYc71ZX>r+ga@U`q2%+!4W#xfpQmm<21Tc2091g#JL&2!30erawxv5Gm@L9%mS^ ziO?JGVxxS;g&moSO3N$xL!`N?M~O1)YhW^WPC(}LZMc+4$$DkpHP^^!Z+_|da}LSw z?>mK%7E$^mxANKw3jN61V1Y?rDI3fwwxcDYbudYekWAh%Eh@NmuCWZ%a+31_sx9IZ zNpHZ2t3oV;N-}0{|9+&d!UDMmeh(;M*I8IUf-Gf1{XzIT7R{+oR^;LM?c5Q)SJZ|_$8?-gV%-Qy^<5*~GXISREqOP~fH1(HQx*WW0!=1rV zex`e1*cF1^MApqLe5C&L(>jSvlwbM>H$oj$a1qVeA07S`GZ5_d~i>Vx(fUh z8PN$l@Mjr_Nl@8L#JcT#-OcV930-teR*yT#xV=Sn?~pcO1ttQ3O;Zbcn-|r3VtDLNNrwJ zKxJ^@)k$taJirVr7*kdV)rV zjV$a4J-vfk56P##)Da1-q9T;yA4OZm2<%z1R1(Eb^`HCe^ok7QjN%Nq-ZQo%d7mH` zq2?{tb=ILd9g``17P~HUTO%{Glm%6Nt!r9_|I+Vps3p%(d8noc!akjK5D%{`e9L84 zyhmghuVfrllowOK5G_)cSM14&n_AXXW?Ixb2_EfV;7#M~o^elc8cyrmI;&?$kJCg4 zNxt-&YxgWMvuUs#zWrPnVoKf=5NFw9evRwm5e_JPM#>-2*E*u6W0`86sjkp69MHdV z(L)a-LR?ssG9li8J+0sZtVL&Meq>h6XAZQJ`^d?uO~EWQjla_XQv6UUf#N3EOW}aU~pcQ4(#vabPo1Y^GuB6lP9{X z!J???#sxfDYL^VEUDIZ(7;&Jl^!?2=eAFawIY9V~nvV*luBdRuNY&t$O;Ibw@ljH< zGJ6$PZ=D_c(yn--zi>+`1K&c@kdpFJ;$qYi>YAZ*1v^;DV!o%&dB!;hg~<-~LtrVG zm7^bFd9PgZl3&=opJy&BpVU{HIy5+N%=~>-MWxc7MCq2gMk5DSf%doPO$i)&^RMl+ zL^Vl9+$kUFBZWw92yupKrfFkl4X$}blZcvS{eV7<-}7R-QTMmZt7KTnekPR|qo5+3 zpoN^#+$YjJG*RbY1hgsE+KR$1tYULvJLf=CnrLh*r$^(OB1#(8j$%TQRf7zCjiZWU z{rghc;BdUSdups2E_hiaQjktC{J6Q9Rptad>Tt!G&~-=*qf8YQH-UfHoL$zEcZ^AP zF_7MdPj#NJn*+)`xFUjC)NnS^S8R-|VJYOQs)-$$mE%75#ZkIb<8b&D|I#f5Cv;Qf zU119ZvU%QHjG$k4-<$7iUw(F8Dfc{(`5O|_Q0>_ZQn%yB7jzCpIv@2yG9*$$?HHKe{h!05 z-&dy)<1|;Zj@3zPq){msP3GRjp3X$zu;M4d+&aog)3ZwYTA`U}1>Gp&se&Q-OIpOu z1VLf5@Z1TB)M<_DkoW1({z2U1hSht0u>{Jzs;E*1vR*7F@D<8KzJPB{f+HmrwE}PN zI|JNr)C-B%JadkdU1=5?Y1H)5pUr=L?b#+Pbj6HcVciPz+w%kEco;KDWYvl!c9^Ej zqcsRF3+nz>1>z9&ub-f^e%BMS6W41$#w`A3`;PGb(f!GAL=#MR0!GmN+LR9a7|u~@@}9+m=V{J7BKyCRDs36M4oDB=n*V_Zd?SxUe$ zYF~t*(!YNY`Q6E4moOdJ1U_#q`9K_F*H;vsP&4c+$swExUhst^xgzY1=HW*4mz`Xw zGr?T&Jc1Q^-WP_{La+m4pdCsQm$*=cE9|_lWQ0iO1NJ}o z`LzUf5o_xZ|9ZS)|H%kf=+uZu%3=xPB|wn#MghL$iU>E}cY{68KjgcFeS>v9cq{PY zSA!rt#%~)-10IO=kg2{(^aYCD5(vUv*{+KR z6CL=9#U)#f{Umvat^%8ICj#K#<}gS0cz{4f3CAMVo1j-h+R#?`#rO#|;b^@VZ3Oep z3HD*Ge87e`;;RvNBDUv{dteN_(dO|!;QIvvKZvFxns9(z?1I*BKMrB6NPxE50o^w7 z4RIxu30pn~;wqR4YDMn<3I9EC%OFTt{B7W4fxEEm7UA^%W}Ka(&tPN|)YyiGuXrJCP=YUP2%tW#hZgKF@yG-Ou~s{W9m?ncvKr zncU@{T^H%hUSEqnK%Ow$iy2#^KQml0^f0jV= zVVL`2bblD1KCX>9Svw|9|25Ks^Bd(ntK9(XK_;oHL)X4Tc=u5p(_y$5jU)p1I(|8S zxJ!YdJz8>}I9am*tWL=N^`yF9vlbYnPys zOUNO1x6qDamcc}New3CN(Y~jMmu*R=xXf0L%Y{B#(!C%tZ22|xc+#b8L4m=C0e1H< zgd=rdYoMm-4%`zbxKDngr;2)#b4}Drx;HlNT^x_>?IsIqSqGoVUB#5mg1fMjB;Q9) zGJZ5|I|^*xJk1U3CdPi3h&CzARw!KNt5gpxuax)cp)losan>o-VK?P)wk8d(tO5)Z zsr9f-;6vxU{TCU}DKdvTy#vG_x|5#CIbf-3LC1=D{mj8?ZugD9^Vs~BjrV2va|$KC zQCO~E^VP!@){@jZ;MLReMq_rxqY7B6N;1R!78gf%8Nrr{ohPmKvSa>Mg+@!lPF%9S zSle3nw{iI7H2^qOh;$9|?W&9PGA4-Tb0N5f^8*? zSM5#1IA5g-e`PXX#iJKme;;Hj<=SxC8O@rNW^SVRtZ6Tqe_GLalwMTXb@z0WAWaWN z;^1c=y$yHNS-rYUrU&hW%B2zb~8e_TVm*X4E-BD!bWzM zW&+fZ7 zEW^3N<-$5!k4MRtz>9^8=8&UK-~%|$C2~zXO#>SZKl)ATJ)L15Td}K*s=fO1YhKvN z)`GiJDc8YedveOA_wmv>j&q$E`93eoPZ1HnS3$%GR{A{XxZZfR{h}ok;2HeV+=XFu zASJ*vJlY??v3?i1{|z(dZ+nL$ch^}YYt|n~BR9x}Bvy(M-;~>oHHq<`5;rJ=`Wtlu z%tms%W4}Dx^x0gvg~Z7j^ab@~iYfMfW=xOeT_!Xjqr|*Sjh4J=5LwG}|3wIf38m7W zVLdkgsm4l2SQ2joL|O7(et*YCvjd~sQGyJ*!XnLl090l(45J8i9m~l++ria0kpqi>eUM74E(-yIk3uKjZ0kW8G1N5xiwS8>;shbR|opP{QYrzmHlhx2R zT>hh>WQ}(dg=}m-5CH~vx-1ekq1Qqmccm=>Jh2SjZz)5>`};ihfConmasY%r;p!Iu zj@O#eCCj6cvy3Yl_^vAtQ9G#NLJTpjU-fpL+#KBqU4b^jdc=c`H2sXWOTB}@b7jQ_ z%>X3Xbs}tXg$nx!F|mIX>CPO{t>g}!h{u0i2k#9yHe8*h^ep6z9m5zAfqVBdbHlB^ zapD((eX-DTxJd?7cg9^9(k18j4f1M6TMY3WL9Y!gpu#!2K2BB0yCyDf#a>U#BDqzwNeiSK3jD7Y$0YqLRPijMODSh_<8bVne^8#7geH^FpNWk*MLR&@_nu2HM#d zAbU8Jp@y8(58c4bzG=VTe0{^bM;Enzz3cYSMz@zSA!*Xz-b03z|Pzas=;%r7}05;ai!{&P$IZb2QAWmk)iRjwsFadDy237BXWa_@(UMI z1kCP-D9@f)X0uI$BL#LpJ5eDRenhsyqP4A$A+@R=$d!W`WRvrjQ$Nn+ZC;gwI5wHM z4&EavC1oeE3))QmLvcyRFC zgsD^@691B<{{pijEfJze!$XZzo9eWcu7nB)tKgFpWl1DSS0A# zbl1Hg((%NEl`W3%`!A@vSkMy}vsft`OW{AP++zv}E;q~F%{52=w*iN*epC|_F}K4* z#o+K6S`#thv{Bl0n!wb|h~w_vU;5pzkhTBb;umNOcTIbf(bgY(eZ59koJVM2;5zwz z-1|fX;zMsdLHrfc9k?}WJ#Hw={UVSg-FPmyA<`BEa{&2C z-q^=&xF0q3;%yhN0SS?H+odrr-lB;HKsmdHY>FhC=ZeS_QqQlfyrqLoo=FxQ3+g}+ z43Z(hGcxp$iHFk;^o?D0$ip)_n}cD9&NBz`vNpIrLx5MwE+aM(Yxjwjdtm69=VuEp zlR=;9mBI5N+xq`!t0&ZHy7VbKc2N{5)b)8};vDpf&Su+C@*x_eU{4aAs@!k;(0>&t{$D zGgYRjAqLS)|Ev>AlAw-H)>LUBqEGWeWzP#O?^VBbZxo-Wb&)+H%RPzqxjT`4LY{jp zy|RRRvCXM8HNXCYe-Sr|T6Y{@ioINe9kH8+?K3@CJI>*P+Gl3p9+q3D8U8obUKnw%)#KyGnJ*CA! z8#anDYrR99V!K6ek`;=&cywhF1L(UV^SW`}FaLg$Kg|zOsv8}wgywsILcVE3oUM8I z*|2}dr*QA$n$Fi1H3JV2@}YURarKav@Gfe&U5+X++?ZzGbf_ zNq3=R5uIsZ^cxxauP3P~-0(SuXW>;nS2CW)G+q5GsHz#o|CIV&mE3&(=*V5;yed5T=yGTQ4{(TK`!n!u+Zy%x*i|~ z3j6|RSpA0mJJbK`t1<5G1dz5xbT`kcd(*uUv5#pOMpXQrhu8cEp98lB4^V;xd`$*o(c{oA)PPi_RSM`Hqqp?=RYS?zJeIbM&JPmHWD?se}^dA5gc{(;GH^ z5)h&?e5L)v>9)Pzcc_=cIF}dj%ft;18+0c6H}_;T=bNb4-%&|N9{8Gb^D~t&1#0}0 zuP%>@1SUMCzMZ;SauV4mr@kr{#Xvqz=cUH!_u#X9q!cg8o*EPS!PL+er8-Jh616k#jFIZA!huQmVMP6Bbw|l##!hKmX zHbiQy>DQOo^}M^hyIkW-^nRm2{X%OAM~ey%temSiSX<}i_aTL_Ng1wLPi?JH1O27N1-E58Enl`+PZ(>T|O z@r7w&JIv`^N}4=A&)G)n2}Kzu6Smxm7$sfVnRBM3Ch>Pz30E0}RF*Re@Nfq#oiEzc zYcAyW$E05CjA$n@4aXQOJ&29*;I4gB93Q6zZk(X>F*iaS?gn|ca5Xc=)^sx^eHVK= zU+!PLKiM4Kos>$O+vWZCJaN5B>G56ltoLzZX0a)@C6?=Bi5~7MsZD%K<%qK9R&LK- zpSv-->uo-9{~Zd5c|NoDm6RyJy`I)Ax8#vMOCcy)iw(Qk_lzMnF8Z*r(r{DnQ;@2P zIgfefYjYEocLCvSVoFUGQ2bEBP4JM)C9xGvD$%3<1m9QAO0RAvZvF7t5U ztHPD9+1lMW<;!|xGxOK+W`%h-;oUU2C9!EL$%$S$v8z)oYv=Rga+fRhF3%^16~%Lt zt?!NZn{`&=-c_j-dTbThUm1qXfnIvP87-!N_sa0|R=r(H8L9ooOEtR0>_m&i)kJzF zGcvd@VQs9PT>n8)&}&w;znzKu>}yo;+iJp2!-a{DBN1Fhj_fa9FEOxJg(Ap`7TCLV zu2~Y-i+26kt0EA$i*(stKh09WMb+|@mT$u~)dUl}KOtTettBEA(3H~gV4^4cj#9l6-zRVWq6kAr(%>}3_6Nzd z$uS?qgM~hMcg!MlPJ_j#Mm8=UtMPLLa1hd9o%r};BN<`cGeIekY+5vtnO&9&&aLLc z-gO5KN@V8fB89W5xeyjW5!C-O@v$*!dF5`NIlC)&pmZ>p817X74WGzK?Ec&sSsQYS zVw1%)$eDAneL~O{S+lc!o+XBxsHt*bZ^Q2vr6l4$c@s~Ys_nA-FnW_QzkJMD^i<6< zmUW*vPnP{M+&fg{O{2JswVF5Ny7T@tcVcCt5O?tX;C@0{;ACpO9C07T$fn<@nJ8+6 zf4%E0Q$&hbe|6nSuTNGql&H_49r2YCE~WO8uu$4gJuRT-#bH0)aj_vvuK%(qxF`Bg zLq@K9#6$!QAj?>*LMmVaSD`}KdPIFWy)Y$?J2pGM#x9t^I=e@0vI!-378`(&^SHK~ zxP@-?1tTCRY?%v zmCXrs(!7l6?*LhdKDmUGKtr~iF5iV%oH?3=mEGol94vX46Y1sv7WqFB@;JSn&krzmScxT>u)l6#;M+n_%?ZU?Wkr_II56+mhR{ zH79$3^l9?#kT}RJBsy^)?cN?1X)p#m?9UN)m!<2aOxFW}3H}=>_wEry6?AJS7giP1 z@z=!%z4_@=9@Sz;2Z*IZ^71{p9M~bAwdyg&c}4LC^NInVaXSTlf_1{n0uw;fmq#w1 zcptH?amt%vFY&LGW(yK7kp87K242C(O&q^6@~!aLAEnTczmWl&kT-MqrAi|r$13Zt zPG^T-r!_TDhnwSRgM)SeGj)LW4D@ASDPZBc5jo z*-*`k9fBUGEBj^P8#Yj`E%^4$juB{$zwi8M%zjB03?}ky9gRuxxT*<4B?yhZo5v#u zwW&`0uL5?MXD-G%x;3$wZ{WU~$IN0^h~1=+-Sw{S)3)+9cgvSI1##4Vk6FDu@^lmM z;DvLDY~V`CyAHXvfaAjoul2y`#Ou+69i$)IMfu1JKl^o=JZ2%XvnF_HEJ}d_7_Kog=Cz1Pf5K!x8^E-EO zsQ5E`)nV0&G*tED52wu)NbS*8`^Wz8mSYTL(qwBouk0t5h762rOdI~R{~auZtU{f7 zL+3&)%mH$eHIWM~*fU3BMC;08#Y#Ua;Q@3%?Jdy9WR+Ui#{IAmL-gT;+jb+SCai;MPwK>>HT6QCf=h{J zS+Y%=i=6<6?MJU}H1!SW-BIt?rh|^+0{j|vMR+W;)?nwO^+m(w-EI9zV@%TR(tf{# zWxI;6FRq71@L-=Cmj%S&vh;bn>;a_18SS+Nt3J4x0vxCam@UB*5N&HKzS#AKjjrlE zD9&PRoulIfeUx^uMYh#(%a4@7y1lt@cJlHnVQyEa>e{c*(J1C+Tn8@eiyzyf=Z3kT zCC+enIy44`|I;T;lH-i~U@=Al07#v~p(fkb;Ld{n%0RN625wHFYH zK&BxQLW(D17dr~)y@P@h0^+u^hDS#`OggRo8XY~fCj<&nI=x-#0;~v!dGi_pw6H5I z=Q6?i^0JjSAzQoKTS0q-=wh4|gsyPM`iKxk=4E)Tn#=9ic;xb?YsX-#&+1p?zG25F zc8X7empqzL1`~h7a3UROi$)RbXB6;=MPjfEi7dsxxgHM^?*gBl8xYY~iWq|GF(o=X zR2eF1f_t9z*G+#r+$_%*y^a9B|~WHP*qX^40zXUaEl2bn%ep>^gERuL-wK$avlH z(hI8C_Ns-{7m*HFzy7h3>D^schz~M^i1^4^s{4DLT>^ABNu3jnM$hZGW6nqJ*dLw3 zL;Seb@FmjoYqO=Wg?lw!Y=E1eBi6E~z2phH0UO0TV+^BvY;*W%b;z#i_|q<_9DcD; z=1WWX*_D@7=JLD2s)!I;%@aZ^$dC@08G1?@hv8R+F!^`|>ExpRaO&1TPOamLZweoz z2SOK7A#<``s$G&t8>RfrHI*pD`wfzK=LuP8^vccYSBd?~iVII3UDd>=*|9(h{l>stS#GC7*8+1MG4&(!ViN|cl zNUAjHwv65`J&|}AFeP^h^K!@dswdR(<4QZ2^S$*p0SmS_zd$E+1&0qz!uuf<2Dl%R zVse3oPMAoA{IlCO!{XlLak^bxV%<-*@a~i|ZZjVzTR9%KP2yN+hylzcYX?22J5-{% zLA{9G!@m5p9ER}z6(B_%1AqRR(ni0{TPKVbe$ro=5zNvXiysueXnmoD+7!OTGdToz zw|p)eU}OfokPyoSs89xFDsJh9!zWUD6}MV0$z~>mufv76(g+ej6nR`&#?$oAKWiv^ zPjYPfVNAr<4@+`2dqzhVZ07s0HpA`@!qOi+h{H?AT7)o_td$5~GuX_J913GaJ~QP> z+Wfsr7e0`Zj$K`!krV?HdYwX;nV9kHu`=S3Op)2bSO7CIfYBi&pa-!VFTB?h7a1Mbkg5G<8p<*BzIZ({5`oS zkm_?8FXw1*6;{_!$x`^IH{{dX_I`kK-d)!OnLs5F@f!0pPDN%aCxcB;W z`aV8o!RtXExp|OB=Z>Nkm|>$Z@@@z*Dt2pov=wJ!kX6%#>_2%rgLA8%LWZ` z9OR*OoQTDGcQLNf0EK?HjPs+vxVc55Lo1hrhW$9eSIy?l^9Nu}qAs7HAyFm|bv>`8 zhFlAEthKpN-iO85&!m z3EHw0p%>3Fe&NIB+QHcdq!5+8VgajP0zJCPj~gh&oe&q$GW?OX%g(;F*h$=#=c?j0 zdtG%9ix_%0@V^!xc6agkVfPYWmYT`tjsW&NRRhCHht_()s^&opd$pPiC!g6W3)%-f7HEtUkF&yJ_ zC3h)m+HzbT1uK7Ah11$o3ZCkGMcaKqmb@a4@<;MwUQF*2su7IICMGq)?1O)wQS_V~ z#(4QP_D+F}-$jlVqI@PXNV>oTx|`@L5C>rc_owZ4=EMAIVo~vbqRBX zYgy~zQ*Zo1dHG-=8f3qr&_r(^(^?;w``Gejll7?dC7!c z_)c~@V{ucAG38Anxc0c@MyN+FAN;a%6Kk#HPqkc{>Frscj38WBoom7SyCTbkKYaB% zQ~P>P`WsvJlOMBp#veAO9c6>R63W(c?b5G-*W@wHlkN1r3r_!uXCYxMuVkY4zbwpo zF~oUw>LffUz&3^=XEg6abGNPYeayHp^W?3VylMDRQ;~a?)L9^y;VRq-v!afNX>1v* zVe5nzhI>`aphF-pv}n)On;&^yjpr!oAscL0=h~fem^#)u;m@@Yw?96#N_q|RHyRcF zmu~W94Wi`iy@>M-yx7A9lCS_#j1|3v?z5NP=*jwoi(}Nla;esW^J@`i*ybdJd`HRx zJ;x@u)ne@hg*iag`rzlgy{xFuMlZlHX?s^ zap50u;d^ia-%fdYB5-+{=mvFO6JGTRu|)9WSN^1z4bHTE`S+m(Sy3!b2j8^(J1I|i zmO~~PTWR|asp~6N7#LrmcP*3i(B_TE(~zR8di4|1Zsz-b58ddIAb4n6dZX`Qu^q|F zM7BkxYwIUE&%<@E4~nkkNU@OZ~W1&1DZsmPy|7BDGcxto$#hpbmnZ zM!O!4hW05!zu*#KQn9D}&N8A7A3DD>=4zkMOzQH3)D@{@D%OC@>T(Tv+n0wWxa}#q zTcup(&-ib*0>a@&I{&?yb znln`GG&r|kQ99`UpX=;#srze4rJZ|Bt9DmZ&>mv6fs0oVzj^6RV($imf~QFmIl`5jnw?S>wAF z>8n?l!^O(Q}riS2&RN8ZYX-Q5FY*v@WxJ;lMQ zWAGZ1^MXdtXgqX3Z!ayI zROs>%?!rE-dFJ1U`iNwcnT!*ioghGF5{wB+JFB!8iwUB$Ark>>7? zg7yXQ4|&lJO}v@j7388i+m?rD*&e;U@WF-jxQdMny8m}sm4cKWkzT$iV>6~^c3ACc&ryqUr9Q%uhSkFGKgn!Zql*P zjkWDYa^*4EC9DZ77vmiF4!dB#CCAMlS<{?7pf1HKR8WySucrnz?be1kud_HS`5XS( z_T#dq%a`QU_vUeX1 z8QnZSl5ppiwU{$8$D{K%WqN){mbPl`sY}VzV?jcgR^y}ADvpjPVTaLY;T=v^nK~(~ z_o0O`r=^X7Jjwl~5q~YOLk65cu9Aga;`K_ubyZxB2pfOIja?U(<5VL+#ULR24c~fE zSBsb0VHg)x4;A|Jb-l0CRUv4wyD5G$m)twwXRUmN1W0@4x&}s@>3X=Ub{xCWoRKjD z@*TSw&I+hm@hOaNbS^SHYqFz;o`i#E3xZkoHhL>Ei9i-=rt<=inr{km)0mH~}U* z;7s?b&Vk7wipxVs#3%@~tx-Op=zEz$=9Du<}TV!A<`G?FO}WieA-Djk$7z4SM}E-eD3f4R_Dh6zf^8fa|6ez4%bDCQk( zzV&EaUrBeq@sb`&^=v>|d=Kq!>oz)o9mUaXse8!xsOo2zTkiVBa^G-d9R_gZEhKi$ z7D)s06t-a3bTy8-61&`>>i@*@PM2nP26*0goV4*BItUE?U13eA~U)&v}N|INo% zt23CKMP1CNH=!FChLq|FJA~*xbk9M{LDG>!*3I2zm+9^t(hVLFFS|X$B(B7qCSS7DQVE$K57Ew83=ivEw5f~urI2cFC%gf)dp6R<~~0k3;Q8O}HwYX9Ye zZJJ6jQgTh}JVk!%o7S%J)oT=?IAw#HkUO4Rwn6VV(dBMukI>rt$yM8a&9HUw%wEq1vRpD%7$2KS0|Naol zK0N)4ug_UrF!QcmJIVQ{Q%C2u7u$?4cApV%Bpfc}hRHlb7Vb7){ebaw9WC~RN|OS4 zrOUry3aP@eDxMihg_q{yDqn)CmL>XAH@mrWRJHO^Axf(!#X*0aH?2aW2*36Ao?)Kb z!1gz%rJWwrt;r@9HYONONyfKE3MZnMUhOU@!i4Cr3I~DozH3x=c(MJH7fHF^uRArf z2P|KmzhC-w@J$_ErMGI`rOTpQOH)1Tbkg?B)HI@a$KF)OL??ouUvr4>sSrQ0aLscP zfR{#e`f_Teb43rYvh>r+5cpyEg$n@*mVh2lug{?D?#3Q4M)AU zx;1^p$4m02jNq#bu!V~&=JjH(!LW)!UNKYf)1S|o?!?tLpKH`xAT`pHQw$CVhxzMv zzovFrzP2}h*4Z;Pyjg$e$Gjzvwt)^q)!D@M5wg+f06{Hyg`U%A$f@6g^fVCVRGdi9KC z;s)6xpl_YMNtsf#XEw)clX1lk`m);eG~g!V*h3dC*s-^B5L|$ys&3KB;tkgqmkp3Z zt@@6U7e_%kgWg#6<|ppZTs6^$d&Pw`#_!t%sx)s4eQ*#IoQ(PKk>e{zHPkLZfrtCq zuj%g>=X87Ttjah)F7a<@mpbqbkJH}E^iMWb)Ho_Gcw+o8s`68EwxU^tM4V}xrbUqs z+*05!#eXoGk7CL+pg>Ym%7ACFX2#Aq32xvINLkKX<0M)4{29yWS8CiJMFpkgfucXe zN++w2_zbe``&!zL-pgx{+b9dz+Sd=S7PtATEBt)FBNVFhi2j0flGd?H`yLv{?F|CJLKNAom_d_tz6=~7HKn- zWa!SLKL9JAg1I7E*sXrP`)>ceS5B8aqEo1ftuLDs)(I#j+xvK@HsewCe%rF$L7wyQ z^R8U-%s1o0JjUz|t+kbekE0X$+cN@M^xZ}_eqXnL#sl7Hho&p;stFFwhj*71~1L?cEYKP%Tha&TxH4tp0%6koVsIT+S{G2UQ1%$8|H zE#|8DO(t0S^Ix0uZ{hS`Q~$P}N8j0h2FpE=gZ(Af2#@`n`c=AEftHOfhvH-Fn{#>D z0zHPenzy8S^)B?kIp`BwLq1&QK1vPXb_*Fw{N9hA{l2Sh&mLC!^WypM({rhjbDI%? z5uk$$wX)oMtAOhT&*Aglzv>QeqE@FNqhqLn)sOj%Pijs9=bv~Se^4jV-I;iF11ju! zdat@6yw-zE%umNk&lnufud3**6vn!EsJMNv(d(g^q17gZnG*A=<$oZ6U#pj9bdK`( zp7D_$;s(~**WMUd$KnmYWWYwfS4@7( zj?HrqXBT<(-kt9Q#g0G6vtxfg4tVVH(~q(tKckrVSVoA8<2=lD%4O7kS)$Ojd;LK)(i#8l(Dl_8Zx`efVJDtF0~TQ=Ux!XY--dl!;52&jTtneWhI&qoJJ0NV zVoEy6j*^=u#~m_X>4loNRt#xhcNIy#rzYPio#o6q;#aFJ{rTVUaJ`A)*Rui%>1&}w z9mz?eX4U-i@nOC)yCib4v8NwxO5Ggn&jeOABFuKj_D9W1OH3_Av>$EB@SEBy8Po~~ zE5tF4mylr-{-|_6>X-fbRE}=H?^Eq-8ro4Q-NC2)u}=EOpurcZ_nV$PnyRrp}^_*|~s#TRdFc z+!5oyzfk4So~k!8)&3$jtb9rC@cpM1bu%vt`H9s}U6}EaRLd#A>r$ljZ5gY$6WuZT zFWruz#KeK3x}=P=FGZ5JsQrXT8~>qB6)jEqEtN<`E!8M}blrWu?am=my?(2nCWj9j zNrkE01w0BbBjPEH7}|a4b~L@+g^xz!0EXPz4!PA90d7JA!z1(&8GxgoK)P;4$yiRZ zt|;i+KjG?uABXvY5#mS56A!wdjd<)lBGymDyT#lhWu`!~qR&*Wj1IxRCCiV-m{9_P`_|{HE_iq6;a8Yr2X(Bf-2FSJuh~65YEtZ|gxd5f z8(JmiHQXg7*&}xC`@}CeELCCJdGEPtY?ZY9QT>kD$BpEl<>MYwmm_lg3zo0t`Sjz% zJ;wTMx!NE01rRFBcYJRkr_>7QqmeAReP7E(S)|38iF<+G>B;L?Fu>b)&Of_-)g8Z8 z+DCs>+t2;gO64SC@<&3HYM*$wjK;XOOQ6Q~OD}iy@FeJrLNhT(J^JdS&}8@PM3cXK zdaL6!9c%dlcV>$u}9 zzwuQx8}s8?>1-KL=SK&HUpHCfb^5SIp8Woe{@7WrPzuvt?a+OH??28o2wqStd1NN_ ze$rQ?)~_ki0Y!yG zHOJ{CqWcdiIK_KU@%q~aFD(@p?~|H5Q+t%QxmWv+f|dJvaCo@)!fLN}19`I2%?|z&+XP45NMK<#?kwG|uC~D8^)^|Rl$nt^H(uU=(0Vj0zGT}(D*<^c1 z;%Fo0QLCm#{WY5O1uZf;TO&x0I8fMohXTZbPicuJTYU7}iN}unccftWH*ba~tKRk^ z03i!O?|7~pmp!stY1UCJ#hABMfHIgp)6=T@cvKfAaZj$67GFUD9Xth*ec98@IP95R zD#((!`{!r6R5spF{kx%)f@yZc-S_#^i4{Tvp&k<-(<{=QN*_I$sR1SuQ-;1^E0_hdH zu%@pt)w_pghBx@Q1bCPZYAo8>EoriCzl$7Kb$#^5q$7p&t84f4aev{9?ey(-{^3D# z11IT8Bih9-?AkTb$AQ2=OZOOMev)Rd?IADZ9ft{DXPW3XL-Zbe z7RsQX>R6<(vk=V^AK-p5GCn8FN{k-7mqi}~CutzZOJ=d8F_JVh?5~sECebXMzHej^ zGh-ZmBzn&m+~Qq3_2h3@JH!Bu`kM{7r#=S?41`h+m?2PNB&R{h`zjFc$t#N^kt-5O66il^XIg>7$fWK zlw#=Vea{zdeEX2W%e&g&uD)6U7*0{F=6Xpw30|6(2o)R{51-GTT|b_rk}?&ezg8o z+U|ZAQKk&_`Qi{|=N(<6Qo4S=^%z(oXG5ynwM2)j0jsl5v#BVi6)S!P+`li7h zIfcv6U76r^{h@kMtA={d9Gzvto2&Nc5cz0BvF@-2qa^db#<%xjrT+GO@+l1}L@$L- zWgNEmeqJoH^X<%-Fvn`#<-%EW-QcJon^4c0FM8Kq>{d_6Jf%c_t3kF*JNbw2!uGj# zn2BEef#eW*bM1U%Tw_`nzBj3JXyPk1`0Dl6-U%~J< zCwM>nvqOAB+$MC!t`C-U4fmu49~`XcA!Nm`PXeBSIDG>i?PuoQL8S4G%N^K`j?-wjRK}hI06jl%yz5B*p#ZQ0qRmb8@k_M+Mf zOP_BBwdVA}8WuK?D-!Dky(dqC^C%(Nr^amSuN5FIN|7~%=cVJ$9%n&z8j0c-<7{8LLvn4+&nS{Hf3H`lLrPASrLxSEvkUJSoi4`P1uO*)W)VC zV*_U+?0}(BDH5UtWiT%5HNRgoy>SVeI;lB0J{6%4yY)xvX?EqLP{nVobf~n2KZ0hz?usC_;qtP z2rFq-bV7x_)uCh!!oI%HU|ZLKYMR&7TpZbwE%= z1ePbH1JV0>1+gWXwk0Ul8L_`q+FPLpY}!A_hb^7K2U5_m>Jt#Q+9Uh;N_HQ>i<;UH zM1%=`k?KqW-{&^9rb;#O@qa#-m*2Z$l7iVgec#h?xl@Kqm0DGVzO$-1;Z3!!>dpFr ze}MKa!!TndUZYgltdy}9rMu}L@+jSl1D7wcr6)mo(+f(i)9MQlwB^eb%8Bpi^lZ7> z{;`yPuVu?A-SOgM>6GpqG6s?2G`Uso>8DTFsvjOtZqWDe`}oUjxOn>;agN1M*6;@B zgG@i}h@oiC$w=atcm zY#Np^@%zBf-Ps~QMe|s2gK(4(zMy#>LDOy4bEDxO7CxYM%}jd2yAemT zZk@(Y3Sd8AA_Y7p5UAR`C=Ix-(vb^8V>+SMYD74dQ|npbw!n2H`0aH~(`)^`8R&KiEHn_&+Z%{=rcHV0Q>G3_XF!XcAx(X#^L% z{s}Gqv2_2j(sw{lqE`O-@DJPhn!p1l6JRm_Smyso1i_I17s6Cle1uv4C$l@AsC{eg z?yk4_C_eTPaoZf~?_(v}Y+JbvRK`-DJ8$8|t&=Hq)kG<=Rcxp3gIj8a#c+2UM3`FP zGq}4gqD!ri6z*<^@GP40Mu-asKAU!Wjy_C|a#__4ZqQ!g{PTqP8O*=888<=FN zoW)47OtHBH@h6;}imno~wmd|pke4H_Bo8*cccxZ2wA&&aC^o&fe@&-CrNnH>3b~Oi z0xB=}TswM0ihyr1qU{XRU5xnH<7jX9eo$eYnyM&{32P!Z8A4#neMUsYLR0`M?ZB

!;AW;;_$Aox#+j+0>i@n^)-emv7lyxIUEfHeU8E&&+C zA)846R;wit9AAz?ydm)L!$g6sglGm5yORmBUN!4J!ZZp+v;-qKdN>yW;`c;0mmtzj z>i(x4r>6UF8rkW82rxO^g^(EVJ-7=K9@2nPmHI}23?%9N%Zx%1FCjA_!08kM(kkAY zk1&m9lFmCqlJCHu{hy&366|{=8501xk={}Sfaw1LjzDq0kej9!oQ&5VCWzlHQIjDJSIf^-(+|1_I_q_Y|SjD8&H9L7JRA4EEr@z3ac zk*IXxkwi={uw0-t|qh}y}E8`z% zd4E&AQ6JqrSW#=6T*i(Tw!PJhf3vG5u0$=RdVWfoHPfA|R!?k)vWly_>YZqYDt!-v zG^lkKO`bnkvDFP33m;J5&G3$G=#T1#za!M@HiMe9&uMLofcn(xCWGpUnh5zR9nqVi z=xBI^{EDBpMqLb#hWRNAwr^_dEZT<#f1k%Y;OY;>2T)IYs&y0hLdN!v);42({dVed z_0$-{rnWAD{vY4e*1cZ(r`C4NT=#cJyifJ~?KaNe^a*M#Um1*u>e;yNua5Y3wRWfL z7qu=5@3E+!-p!NP39s5biMiSE$=p@dV}vre9OkQ@NhWxHumkIuWLbyBH??)*?alN~ zje(}BeTLd5&(s)K=lPr1ICRXksGbA!>-}#-(^7v`&w|(%)l(9?Pxb7wdGcdhZ9w?a zJ%89duGn^)=Z@G@>at%GVPnl#y^%xWSYK*lPr=Tc&;)%~Jv-d<)+2|W7S+3oW#p@4 zqFG6EZ53D;s`trQ(*^kXTC4>=ZQd7RW7y|wu~zo^PHY_e{4h2i%PrfC?QOzwhVgSf ztJZFJJ*j$5s?9aA;t#9fbF1|169(yDpyO(r%r*FjKx}ocSS#>t^PKPXxn>2}Q05hQIcXwBKFl?X zjQ9we7yD;`qIpyGdu@c@pVl8Ujs@QEf zMt5B$%1$?O`9K)w41aDOr^o-oIW~FgBiW#wWBrr(G1uT9w8IKfP}DjuB=}~^It%O3 ztXNneU%~3*^Zr49{(dWs$0g}?i(=NJUFfqeG_p6vRQm9uSfDMhEjA`)9Wt(ZXT@5u zps%dIesEJyKzAka49uDT24n;l3@^LWTvN$_ar15(%o?lcNn_#3f(-xDXE1kGtV$zx zUo8G97+(okEYoW{JR5Pa5HZ*6z!~&(0C%R8j=3=@p0sS$Tf;KF8QHZvp%Rn1=HIL} zTWp-_Q62aI6Rs99+m~8+C$GE}6HQFO{N+qOUWo%o&C?|%$xZtEuL>zSbJ8u^U4dvnFTY%>C+ zM{!ntsE>YBVUd7N-HVNxR8RL75#>ZO=Q^B=6VWsg|lk=HUJhw5GggakPf^PL0;($LR94wCY(LC$|Uf zYiZA7t1jQF%a7OPYw4uBlU)&>#firQkRnC_UbLYDgo8l3ZQ-qaS!+F7U<ncS$o$j3~@?_B+G9K2Vn-n3*jX{yQ98=5v@(}zXVnBQ6T z{ML~X*LF}NuV|0?&>m|CD-P|kQ&4$~m_>Jt>Kz!XdP`zWHg7(tpX$vqV*bjL8$VWS zkGTE|?PlBR?Af?#`n1JxK5cc`uyZ7y-(kAzB(`yf{I|KHo>$QXvxL!xIF`BHZ z&6AV4rCyq8NcTj>0-*BHJFfTJJGAzr=vk-Z++Op}wX8b}fOned#0G=QuU3y&csu)5 z@A&E;&UvPp{1;*+tY0{E)#nT@Gpn8X0*oJDx8FNDBuuPNR{m!L?5u}>(-ffjo=uYx zHGcuO+lQ!0iSFKQL)xNfy(F^wT^Fl$nI@D{940?a4EPm;;XO7#MWCFUeKo(Kxp4*M z7vOxi2d2FCgzH)q*zq8C894KURqsrbnsf}b)dJ!#X|l;RO!dI541f}-ub`@gCX@p1 zpKLa<0Yrd}-|d!JN1zv25_7Phfl@npsf@OLyuFlJYTeZAbkEn& zQR7UIifq+$9K^!i7lr`quS)|tC{@|Sg0z52xDy!N?;FtG(NWt}d0_s{DGQ|a2G#7I ziB+H!*5S_kILZmUIZj3G&U)yzFjv48t$LTT%D(s=D>JV`Re~~#%+dJcOKm#>^9gnD zg1RlJS7^Vj-fWp4)IV&$Wewlfft9-Z;6Q(?Hb-zFWrb1ie8&dI)x^66ip~=u#6zwR z*4I8B3$_iP3g`2dTBF1s!69$)w=-JDy-TVT(wpkJjL1AE?vDjQLJC+ zwe-4?y{4qY@Up)^-1Y&VU+?5>Y_L-bECToaZ15)+vB~sKcCgaOb6Z_df8U;M^Z0F^ zgP?AFWj{lI?^KMguK2#Wc3KCmA^%OdB8_}}T5)`Qq<`9Rd~jTf)TEOzW+|Sp%{6#= z(mN$GX=)xhI7IW=Me7E+9x#mJv#JjJ^mHt&#Ur*omPFpKzS-ypO)QHWAJ zTYv^Gd_4hzp1V_0s?QqSGnqM?aKhJjf{{5wCeJ3Ix&W25$y|dsx6O4g1JfYiDIZ}F zyrACy7^lVjn(LOIL%eN2A723mVfP_``PA~G#h75EPywe>?Er2E>38T{K9Ct_J)vIB;%(W-Za(4n|faU*u zmMzwb0?1JpoNH=x+do|gHtJp${cU8N-w z2U-l{JpH*MgOw12E5Qo#A1CA=^w|%e#4xFbPWtk(RnHcR1RZgG$~!ZicZMs5gP(3$8nhkWC#W#ZKNcLLgB`mgqjjZ^C#)OvBNOoj{0{J4e z!`k*=-@)Vs$Ak2-YYcXFB(uX|D*H0IY8y#>FiWxk_ffFK-R%iYT+hlX9Lp1{(XqTI z?w_&U4XQUfmRR1-c?4*3hU&Qy7SCzz{K?=B}T) zFH=yjQ{{YSL2usiHCMa`+Iq<0zrc7_A2hHLfbsH$|&YDrJ+{`9d)T-fvV z^J{~IduV4HSIIjM8@zA&Ic6AO1yN$Z{*&4S*&8=Koi;MxL&wCLwFJIhSX0);hldA<@ z{5)Z2+dFLjSzkOSL9H1xnO}&7x6b#^3hXx}xCO&LlY${fTt{pNs{U2Ac}Lu(2KM2z z7-ab3D9(<-orub$(dZt8(-DW$5s%Z6h`UWP^j8gxrwtkU-IsQPG1P+3Lt!<*`!FAy z%(c%jr`r}Ajm^a1wlmOHml|tHc|U^USM$0XP--4#Y80<1CNzOSMY?O6VXI;5F*P=t zKH1GQX$t53qM1T-jje+Tl7)B6V}$3Jm6IajBYNeeDBoRYK*QnYBgy+FZk})2&;8)v z{L|(9>N{cw8u^CD*XJ^A{5fTA%AAzhDX?$PVy1BnI7*C@JOc}p)_#YF*C)1`%(Y*! zt&RCl=90nMyz_e7io=(^a27?6`QpzWh+|%#gW(9pw+r&10bIq&l?fGh#-N0x1 zZZy&satU*Pmj=qjbYgO*p`hMfmR5VnT=OuLMga8py*#ebz4{9bS%RkU`9M2^g79pq zJ+kDrgzX7C6Pi4~eS-U+uk;JHgs;GsJcrSzdP4XSn`1yTgYlYjbIL6#Sz38ns+?QzS_2@t0gv0YA3dh@mXV0w5V!!JeCI zCPUwl9dk_*Jo!-z3wu}7y1&O+VQ|@@OiJ}nV2#|wcEWKFrm=h8iYf8@NVB5cmmnu5=`NEoFPHctn|%}u^MX5g9c_mT@Vhl`f$;w1Dc1Xz3Ae=PQbe5SBIWUubXhK z@4shQFKX`=`fuGE=i+_-t>=V&_X*xW;DWsU2X0egXf?uZN?B|0FUCd4a{a1UZ)|Gw zQ7F&a_~zt7|L_k!wQTyA{koDlJGR)^0#LxQAVquAJzq@sY{AK9!4mUI{357`UpBKV z*PzJx)TDDmPW80;2F9a8Nd>za##v=M^K{RTh{Pe1j8F0Do?p|4es7Ba0Z3nV2Jd5= zSK!}UosOz>8lH23;#=` zL)+B#Zn$x`ZvLvQn4mn>s6>1pu$wFCe^bKr8JXC zJ4$I0N~y!fj`i<9%0$`qU&CM|152Iw*((QJL<6`8#U!`~~Kn4NnDp1E3KYfE3Rr z8;DbkYaoB!--*vZ3`bqo05gp`!#i@ix3g>i=zz^C2l49G9heXY%Kqj`F;`7~oFA&X~sNQHuZ%%DuM0ye~G}W-^ zQq{99-D_()WveUds7g|j&8xPiBp!9|PfyzIejXNI+t;YE{F&#(_yy!O6}`-$yq-Bv zUP1qWA9XU_vnSoNBOs{wkSrb&#X~%o;jPR%0y5=&?m3`~jbdqI&bE-!L^?=H#q*w2 zbpM$bycLlc-^*-`dNx%KRk>u%icOyGIf{0FBF>YV<~ilTh^A+FtnbOcIy!J_uzIYN ziw3U{UI10_i!T!@M43b7ih}n)WRAwEdu+Prs}xT=Gbm0ZbO4toteZ)gFBaNud!<0L zAMMiYM=FfpcD50Hp61z6SwM>#cJ4J32M1OM|NEK|J_MB`2)XhCHrrm)`uFGg zn~Ao%d@wrdz~~6Ep5 zRc?solOa}6Plu@Bmhdy_`)o#~?ITG(xP3nhHYgsd1>2*bnjgn07^_J}`BQE1WWjqF z^=vZli9j_kPV?@IU5z@7PpOxkYJTfG&Ue<8@8iLH4XdxZHHx_ocSlH)k(ST_+Ypj* z-0Cm~U+}JCA2@6=IEL2h*2wCE7K|`qD2dClE!KLyH}*7C;wnt30u}2v0hU<1-JMCx z-iUGhG@Ex!TEY=<=W$9*!algpJNCC}bpwy^W5N?I3(D6G->|;3uB2CQF{CFQso28} z#cJrMA-%fUU`v7pw75!z{X0%!rXvg0m}_o;VK~A2A8D>lp~#|zX(P0=y>vqBeTNMj zI^q!~-`GF-aNTPV_W|x>RX~?*-qF=RSYQH7Ab-=mcO2pO6n5gR^J^7%chm`J!)(B- z@O2aZrQERXy!cDjCdIifK>Jws{m{R= zk5!-U+0O*R=4n?W45~K~ZP(tuhrbRo&9aPQdBB`bpa7ieHPr5$)*Q(-V+|LP2pH3N z-)#1N1d3U_K@{P`kTlf1q8cwURGyXWUHvLVWsXabOrp}$EWVRT2R{K$xJXu`SziGQ z)#kk-4XsOBlej|Y-0wQ?f-JMRf2%<w^Jp7oSLDu0E?>}XSoZ5aitfg-dnkCBDid7=yarTH z*MRU=*h;#&wlZ*wEj6}MJUGNdk$A`!51Ha2Lp*4AZ(rO2*cEGHpQIf-n``#z9_Z?6 z8%B*Wj9AAzL$^@2^2<=?PVjBoymF3#E0}tI{lZ)`Ac7apPD?lhYS`NqtW(#;D#(PI zw8dO~#>no49JbZPGF=S0?t?fNnP@}9;6^fYF&^tgh6MojI{uOiYKR!cT)Tsw8VYIS4g(J=^fQ z(7mqaNOpH=(_JyVZC5w!bcDI)3j^5&e3)=yLV3P6`FQ$1qnl0{+<~9f!bz2rX+$P- z^2!!&ukfo{xF56q(fb0s@g#0p;eE($3cnB8!p)a`intF6^HxRsG_#oEF?yMSG0RHk z8gJxA_vRxkjtx^;a~8GKed9Y2FoM2_;J5Cu!+0JuknZcDxU5GD=7ZP4{qYS>Wl^J* z#*QF==9-Hlc+?g&V3{rXOvI30J)v`0=TJuJmjK%ib=V-_DejSVzTV+PI6rH0fsaG z*D&x-^_;^)b#?5J>pohccVN_`36!GEb55<^U|{_5Wtz_la=RIMFT!SQmMOYum{FYTa<7S~sDeS~u2^ zUN>++dR=4$`ukqkr8a;?*aW7)Y-qDDs5CGWn}NL0=IsqU0<{S!i)a^24b$|bPZw`a zudC>o4$GN_!2jysTr^?rpD@>ci^DMCZ{eqVY26x9xzwuaQ06zW9Rl=yP^M9WqYej_ z?=>(*=DKM#p8krz#f%cOezzPy6LoO*YS78wQN`9Dm7N`=dcb9k(n#nCjV9-P*JI zl*wGvX21yAHXb=ZwyRqWxK(DLe_08BhR}4=J-&W;z=WHvg>4z|T1xc~kze`1m%!cE zRNamjo>RMQ!_ZY?mliOhglC$GZzN+N)A!Xeev-VoatZDXm8gcRNZ#2!g$&@)rjTD7 zr`8@Z*FMEP{H-GfvvnBnJM*2WWGv7&kj%^YT}qhpnhG-hvq2HF(qEhur8}j3XrL`A zne}oyUX>8Ma~GZ+C{^JqVEfD+xG_V&`$4~93s}uUj;*pe%lxNVs7Gwz@z&MQO>sY1 zZK~&Y5kmVA*SoL!A|v0(m+<3;ob@H{KoKKe4Rc+Yx{TK{^pL3bQr`8z}4zgH>!9fQpdt|J%)`NtfZSKea-hF zZg&p_aqM%!I6Qpq^UBD3ma@;$X(=*8+^<6wr^wVAp}5heE(t8@pkR-36<)NAHoW zR|DZg>aj2KZ{{e)ZPMB6-l>*lKX;frI@nh_x@@gJXz(nyxOfl_<12N2vR?z&h#ho$ z_V@?>0UeXhdlGi~-`AeU3V8uF9TXYWb6g`bE6Mg&F;Wz7tHVFFe4s>qb_=jBBU`omZB&VHu|pG z#yq(JDd140=QZPHDO1H)3E#D)OZpqtrFUQ~7Xma?-m(3Bo3@Hxun2&$ zttRaK**^pKLqMHH#07)2uqU!h1#}wY`P}FJ3d6GrO&FFP81jyXWRG%dOvGIeqY?PI ze7{h{kB@8O$Kaxj`|UDVYo4$9T?5ZqaHLasD4u=S%lCT=3lW-YIvLovtExX@-*9rN zfm?H6t&Ur=)Tl5OaKP8IgCD|erIC+QtItI)x*9ua#VeT|t{yD<{P8A!e+4;9RQVZV zKAs_#h%>~_!Ta5Kx(hwx2k$mdGh3&gT`A_Z(I(i)H~eT)^R{*QR!#b1vA=ewE6rPr z-U%$$q?U@rl zou1QW4&Mi7$+o`#3#Pa*FbKMTIL0a2yo3MzE$ZCo&M8di4p%8F0;|Qmlhf<+BMqrT zf52k5hb`727n>Ebn3vfA-^vBA5CzlgT#*KL=`jNOKD531RE7uN&uh7RhAP~YhhgGb z>8+_z+?9yop6F{E#A-}tLJ^b)T#cD{x=hzL`8tI08IF4k+hE$B(da|E|HdyJeOwf{ z{gSy^d$(F+96=(|OT>k4G`TW+T5!%I-4H-=x3q2Ojs|olphcp{p(UEu#J)+n%kg5Uj=5KCTRmrwJ$1 zvz5gnXi!h!cX3=Rnme&koe~)lxHsUr#pEdidwEV~^As}Wr;u$wg$I{B3H%tgyFR`p z^S6`T-}=+tHzb4n`yPi-X&hi2_!gYw7ZBlDaQbObBzT$RjdTex$j5fq3(W?`LrSC} z$iq#h<`fH#T64+*-sfWQWV`xZn)M&(Zw$MC32ODY)L%(>M1Os2*&=7(AEHj~mgKf! zgZ3`S`^`qywMmh|YZ;zfP0f=mICrY2ciW@E?+*tq-$6qaD5Ryn?2l1M@w;*b^^0!- zF&!V(>;g$!fGWKA$8;-Ui)*rZE#B&!Fv=Y*ecz$kU|!pK!YJ3DHBIhG`~;BQo8vbV z4}CM8Sb0RYkU8Hti5?)6LtCr-02yxFhM|y zXT_qeXRD|!hc=MH1Y4~F!h%Xy){3jUR!N}9)tUr44uP(VE-EOj7wd_l1qwpBTEGiX z5k;XO;)H-8NIBcQ&+(nfBn9;MzVAP6=6m1Y=ldL=2YLc|J?%t$yTFJ0cPw=&1cIZa;OYrk+{+XsHkUYxs?;tXy zBK#$}W+-g)_aT+%2lyS|v-4~4TlSGc+(wk=eifRpsB2g!OKN>yp;@tdRCm(4g?)Vd z49kYcTOYkV`aIi)O3M0!6#6K$=tFDIz%Ty)vY%2rGBX9?&?wrJlHjqAO!*T^R!r7fy#&JyD?&Zgg%{8qIdZi+CM|wV-b6oBSL== z?Oa&7=@9AJX;%YH>QKKZf;HX2h4w(&SexEE8R>Y4hHTiXQ|U&@NOFll0q+7JO1;(U&^TgKp3ZN8JN4 zbphw>=pAKi!8dIInZ#=4C3M*IazCW!uc01#@32XVVQCdJL2R!Y3R>RNciEJ@f%#-k z;MuHrpHkx77oyqse^2pvY2~owd%+Io`%&n)<{GbX8YwN zn*gqLX{hOg*HMAuQvVTmwpIj_R*UgB>>>1y>v)FS$J*!d{Q6E>=Qpxmwnew4~ppQx2(GT|9>(O?&WZ(cj*^vbxw8 z$*)cGMa3)X;(6Bg@Rfy^80lc)kz2Vx*B*nWk|xkp!k*h%!z3*lMP;{;7N*;o*OqB# zUR$=E(NgSYd*J-1!(d5a-Y=dDSH=@W>mnjC-EWjO#NB|8H&|EtsIZ_r*SM#nq3beC zgcDNaqH#y%rouo{kH5#qxzz8LBK1lf#}$nEa1dG3IdyvCV#ZRrZxI_5IpKe>r{#Rb za*FW$gTjK3#K*NR2})Uk+jEIN?c-MRcGPV$6r0ez3hpE5U7n&1wUKmPu1W5hG#<+J z+$`7h2a5Nf_&W<$C##zzl4%qyLFSvU!Joq3mcQXVt^N=%m32UU7plJk_1&KI-|K;n zO%`-_ci4_eVm_Jfe(Xcq0ytFed33ago>Kz-Ep)CySAWuqu5NNKWVPl1>=A8fA{;hj zBI{+huCHY)mvSPkcOYTi$=n~*t_w{1`Z1!f?`=(A-x5tH;X?#XWvF5|dRcSvWV^qFhel5eeCbv1$i6qKWA zLKmu#_Cgb+gCt>2)=Un<;YrXA@Fs@aS(37DYFv-ZJ&!imgFNi(st+zRQeKMP5_m9)e^~k`<=YGY@e$+27 zt=7mQ71rM{$a!PsZsapmo@Ah+-h^C)=;;t*H}HD8LZ}r_VKB>}(w*AtB>HZ<+Az5E z4<~t+e;(_AxGzA#ug<22;Y~CZyCmi+Wh2`v7b$CjXcHcaI&D>3D1H`CION_&QjJ|y zpp6|t3`-gS| zj*4>WdfC4j1w&NFs}C7Rar1YsH#Q!V%C*2In!J@YJD@Gd=FZ) z7G+UCn0M*~YHaxnWM-xIXy(mlgN>n&gJMEc&=AT$m*I@6^^2^HXl}V@G_FueQ)RyuoO~nx{B_N?~^dn&TYb?rgk%+CUvz--L~S1aCRe9xM?d)8zFQ_IZn#(D1O+Pk2SAYDQ>et7P5I|R$WpQyLaXkOt#qMOr#Sro&WL+j3HKYhgDrzqyS@LXoT zdb5#^C%J&INigl#f57?wR?PpGMfm(ROde=5@kUX3@pzVw+X|+Z<*8H=53ntuFO5 z&voXA#!B8|B`pS?(ieE1Y~b^R21E?vGGV6aDKA1m7b@4FN5AgI!xMVG2D|OI z_sFn}^Na(iqXpT6e=`TWF-kt`80u2P5t9W2M@ROpG4T6pvBjg_pH22{2V~!BI)@e` zHI}nI)XB7~T_Y7Dh{dbKBD!{mK-d`kKcc!C@%Q>SkQ1~ROY;6IIaKAr7^MJwLb@V>C2su!dl7gSd5P0)wEh3|xE)dF)URwp|a&nH?> zN1*#gN4t@fvoYk0berPP|Y8HJzqoi>g7TqmjYLz%4@9qqA>?R5VaW=l>Y za!o&hsRQ+R1Z0JZf)88pV_LO8 z_e|$YtgTDb`LYGimkoHnqzEa!Kvvm7Pfxr|9$aklx!@jo7nfhdYmB(U2Ms+3uKk($ z=a56LdRCA@X)Dk&nv1z;2dsQgCkocve~2Gx{Bb#bCDZ7;Y}-#f6qJe|Mo}%+o)hF`xft^q6m0Xc^`otRFKMvNpI4 z?*SfjaSw*1`6I`C1e zMSXZa9@D?L)OGqV^Tqlm#i4^Z7<10NzQgAF?zP>rzOR4ZGS-gwEo1%B`!v=!zY#sw z_rGr$-ZJaQ74KWtcitJ+_tU??SnGuE$yZd~e10(H%ok(+sX6BB&yDZG=f~0i)A^BN zvBx|3ysBZ7%9$H-e+?GHv+g3bUvrFWidY7=BL6jFky_EtrO1GfYL`{1>c)Pq`3 zfI#9wIuCIK&O}-ugZ6+v2}%j=5cmid`3W_)nZ!O!uJ_XKnM*j5HX~$$O~0LjCfTFM zFPMqJ=k8CzoY?-{H0O-{A$pVhv!VHq`}6J`vp;98-vRZnd&#W-R<3^$hq!Np`kiV? zYD2z_bw{ZgeImp9-_w8Gj4QbrQFx_K@>lzj3W?d#sEeH~l3Pl~i}Ze*C^|3v$y zzSOFH=Wfq)FUGdV`(ms1#6{ZEF47({Z1{urG`)DH_C)rx+RS^c{fnk><7&by(oes@ z&A3j5_f$Wu`bKI+KdhSMSt_jIZM-H=HL6AWxW#n-E-XBb=YC@(y8=oP_1Z(KWJ~XuQeClBE z!U&%fx#kUY^EK$-zDk0ZHduY|L!z#*aT7AJZ3DS&onqVe45o{WU~mnprci6vZx=0` zeP;gAIo}hW?tk!@NHX7XTanJ)ED#n^^w#A$5@gbQ9=V6LEAvVI`yA~qm%3JA?EkL? zOEt~ZB)j=tQ_W1SA{Ia(NowvES11y=)PLAq2GoU%U}v33vEG-F=0H0I0>Lr#*j)w~ z1gUwu4D*E|^&z`H{T;KS@?x|4z4SCV=t9(w@8`44%3eW$?iT$(aRiy8k zWqC|swy$Ox*4s-FcOC|H5Yo6X+N>*fvDP;orn9r6^@Wo#S=UapB3dt`pkwrV1$}r5 z_Hee6cg#Hyeq`d0uCbJ$N$={Pen$vi!fDIS=tD1f$!Q@+)nDawG%}%uXUE4shyI(( z(0@}DZRG;tasn<+??NH4L+?5b-UX(aA4M=yh7gapSJbx|qT^MzNN&wqidnzfv;|iE zhFCm(I!^F0>gh4{zL z5uXq7h3AM@ApY8O#1~`#&lax@cr0pu<(g?|?xG&v{42U`*(*s+-p12yHnllaHI40H zV#eRQl5IlTYSXsS$>d2zp9c|r6>@TstWCpBj<)dASoUg1I1Ge4R~^Fm$*{kIpx?9s zqZMsji5ibuC{6D3YYA&d{Zb$NZ!5}rse$JyfSJAf$(q8><}`>>qrdbT84FGv!k#$!{LNDC2#Y%8x(b;cUOv%wOUa()w0pDo}eUnQC{)YZkyexG@bQB zt)J)p5x+E7{U)YaaHSep(mVCzuW}RbaX*sZv`(UN@Yv8?+m1GEkfMGrD<>sGe6qW{ z_vb{94B_xz(BGa*cSQ%p%phsTg>MV2R6`xC6=Qz#?64PXa4T;)qGu5(8DuL-G(th4d>!X3z zAVH$iD&$|L<0froqv;-}`%F9qy^W@KU-q;T?VrlfUp-~TzdTBMtPb^S95M%CwC6PG zlZaY;yO9LjuWmAmbgFNEP5%~cYjw)SYOcoU9}RX8mcB7N>3B;Uvm^W1^n6*JA-vc} zhSqC=#`?GAj@7rm&Qm4k=`+cqA1LPO)j4eY<$uONVL~m;ope7%rs}$vXsR|?C-W~n zRUgMp)q`8jsY++9VbV7tII$*uzs72wqzVlqYS+6l;FC(KJ{yhmo#$1mHuV#=$I0&s z;pLI`a_P#r3jH6|LZCqV*F@)>8>&3BJ{Qx}gh9``39pcVog^v(KiDB|PwWNVBr zFc||qG#TqJ%nOZsN(oGji%W#_WX+RK^ZntcGsmk-g?Wu*&r=%co79}PAd>DuJ&PBA zu_znfDgGvT)*3}R0*@5+J0AKbJoj^WP!z-(<<3`{(j!Q~yQ&BWfgn_Mgk2N&Qzv|1J45|6Klb>c7Z8#*#n% z&*e{}{)_xKS@Ng-x%_tOzsP^2Dw5ycIzPf%qbnWZ@i0a9pQNoe&7gtX2--NjN&7dc z`E8keH9;5|=b0Bpn%;HNK&^MW3pTF)FQ_r^ZA?357o6>cZZfG#Jn8p;PCv@^f6t&F zW%|{mjW}VL{=r)k{;=!CoH$J%z(3OU+xSPOel!2b*01Fsx%w6SBVWIee<*qf{!y&k z=*P0ip>b>)Nl@VUe(pFcw!`iW?wV%NXX5?Z=G^oV`zdH<$32&v(cIZ6Z-s8!6sgbP z>vFAlUG8x=xB?S1%JdgI5Hp|(nE@D5uG<1EL-{R^Lu~ribsSPdbCdLbup7J<8J=3R zJKzcU7(%%D52$w3jX$WjOcn1z1f}|ID%Ok7O#_w0Vc?YTnNz_)C<(3x_8iA=P}a6F zejCTC1AcF^{QlbVdz&S_L6H=yR|L0rcFTa2jABC24j z@fv-ey`Xsq*rNP}dI#i6(eEeWI?Lp%;I}>IJ1yorGv+%z<~uv)J2&P#KjwRM%(oKr zT^#d0%=)d_{2L}?Xj!wzjcC1dGpXpop}vliazoJ3&+-a#CF@W(Q<2`rcp^Cl zi*|RdL+Br9@v%)X{&sI&f}_nUy)+fUq$Xc#Ag_6Pn4^e52?=5ZQBx6n`u@|*Ak0QC zpnpH2#?+hcFcFfrkhRg=2;Je#$c;wQ$=fQ?&9ab;??dyV-=n0@Bz*4Of(BSc-jnfe zLg@GE2|yEHjw}+nMzMQ$C3sIr?mkN&E}ojXlZ{fV_Ll%Je7~Gv`-CUsE5lh~d-}!314L2$JM|_JnDMO!D!T6Gn3V0Wu2J)F0m~I!nkq|fd;tajlNr6GBCC&S(8$a`i6b$BscTVY%ba+E#u|0{n&$flHQhS4uu%}%b9YFED? zbFN!Ve0{m*ZmDPIY)J2(6Ixda-wvr~(q-`NSq;DAdnR?lxQft6f=@vD$~h(k(DOtUY+wt4p@dQY|;w?GLbU2zNQMr_d%t3xkD z`$HULI@}xybqo@-;=T@MWZ?vNvSIH$A&u;?Uah1T{Z$pC?57R(2ZST}ST&K)Qov)$M-h|3CJxyirc|zISfS+6_l)aY-(55IgcVqlkp}b+a zqV8sT@Vg4)gk7OmPq7S8y!Ygl`pa4Su%@%eVSEDU~T3-NLsbQ!PTRvB+YV- zcL=P{JfAF}tg!G)hv7a*&fDZEm22*Wm3=P+c!n$La)$m>xfE!#qV9kOofq96zh9`^ z7EMH{0`}1tpqs^)VJJ~L)kDGYmi^QDx1oebGKuZi_Q03t3HS|L=R5rU5FeqrMjP~{ zM_K0^3)FvT;tv8Kyx(ef2ZNGSYTBW>i;N*Tz(XSYC6u2Te!moTAIl|1oQ#wX)1*&; z3ZNh5xn?cLNNTnwRLc+(%{ee+{(_iZvbFHPnpr4w+k|i!`(4@0=46kwSh~=)$v6rh zY(9s)EZX>$MWYEy-f{P1D8l=i7=I0@CHLD?e0?dSbhQ82{S;|JWJD)$fEM>wztyR-(Q|f%tQT5 z{={&K5qiOmawzmjK|s9Q!W>cVvCo)^@&%+gp0fKR?s$up)Q5$)K+jA(fs+=_STmB z%$hB7pXuaX5E;?+0ybuiK4LtbHdpE0TJ@v`dg3;F5_*&Mkaz0q%MF(av(AK9RJmWs z%;1V;!lPR(o*f*43u4~`kJ}ecX(|AMX^W!n)h}kQJSo%{^Xf*)XvDb3{ZLL5gLSSs#$kRrUxo1+h$h^6X zdE2RHma_@3BC6=R<=7VQ?s%h`(0|S_zkhB%#-469AKRZ2^YQHXGtI|q*{$azcUex)!l`G*C@4jqwoXT9d&V$BCHHY4m}nY!Ps^qG+Yz_e7Fx<%F+rHiGtpV{4<*j4458N)I)C4w7Ejj#@Uyi&-QjgKv-`-qP%W>&$sd~ z4*3sz*hYi>qq~n_IY=e!)9%b%G6{{wc9GH82~vsw4oel)d`s0(6-j627XbYy`)-r? zj;-oW_OD0>dOspqf&|$Ygde>nce@qz-ct_|T}O2LPNv&sUwZ^o-a_`eZ2PY+VnFbJ z;{tGM+Cnk|LmA|zP)AJ1E)Z;vyv>u}QKS=Ed7?`_Fm=<>%+rh1yx#FKu*a0~7H@l=ZEW_oY1jSvDncc~?W}tETM8X>w`M zr+?QOc8+QAm>6|PuF9eHO%09MldqUyc9PGNghlHk9b)uYN_RXu-3pu^vV<`5jmc+w zEQ7vTjJ?4HExV2>t6I);B-|K$uoa#e^Mg{DhKf6~W)R{lT=M)ku=3rG{%(Mnz--aDp0^?cl7`?Y~wiZ>|vH>d+sJv$KuA6gx5jPX~Wj|@3W zzwo;x=6iI^cUjDLdGvQhg=z1~-&HZ+)iK|*E%vc|+@z?t^4^J|4~+N=NwlE#slJ0&lP{3IUntr_q6D>P$Z64SPEB&=HFz9Ot$(66J~5{*XNv>g85e{`l~y}7XL71GQA*|0 z_PFORIC=5Z?dQnbGTEz5OtwK1$p!_uzk+yq>SIy-9g^f)&yQY7Z8moUx?)fmUyRjj zAW!fn%RA2CCmCtt=X@@cW8^iD^RFrDH?iPAFz+=xhH6 z{Ub)^S^OzS>HgEEFT8g?B`dJZ&~ zQHAlHwpP!hcB3;!(e$wUeMS3t6MN3mzyGH}Ek^NIkdZD}>ffA+o6ee)VbAq3JhKQV z5t-S!h2)gOYS-LUs6A|VZ$OseTJzzx(jnK(%D~07a6-lI1o!(DC#8i?c@_}ZvOB}( z1PU?l$FX<0G!`+rpzM4l@6e<^F5v*mq0J&{tstk4{BwNiQa2W8!{K^fSCqA`DDTIK zk2uHy!D?7D8z;9blD36*I@RL@Qs&Z9GawhaopR-eIyn$~&D#JeSIaZXVQ`A1%}#A7 zI;bto`l2vz>!crvWp~I?i*6Q`RVQ!PZgm|yDb)uNEZw25D#%(@03>&1Bhdn{xYYI7 z9v~&c+^Bk2R!f2UV^Q9(^7J5)!I8El6-oy~h6ZCiyY zQ~U$N#Coh980ljStlIo=Ln#_*-`m3wk7LCK~}Ip{oIka z!6^@bUk9LYS0FW6$@^_`8}w)kqXi*?ImInjp!C(Qtc^u^8zr&Vh92PGn@rL3M5E?0j|f~8tG@?&zkQHczyVqIP!<@XGOcqj%JeE z%yZ={?TO5V<0|*kGouA(#{;YNgE|&ic{jk=96S7;66i~VbZoN%6QbnpQ{?_|Snt!X ze>5DfPrODrD4rT4?~i)#S@=xW##!*baYzxvWV`#D*g@R@gSxQXvs%&K7ESXXaDT*a z#AK99D{8q-&)h}tMjNSf)1c`^4;zQ~)L8rW<5rcAuNZ>$bJ{=S&tS(_(Mv*bMSS4z zu9%Q4d5$Q736c`HdCKMSaRi>EcPJ$e`u7#fo=Av`lRTTDkqagFB1l-Avt+d9G3n-1T#~+a`WLgx-;@1lnDAMLbl~FH>E;;>mFOrkpyx{BE*9=)wM@qYsfCPMWb7TH&)sl+)R2g*JVOzTIHVuGNPYF&krTU!c^<7$TAwYAmNyCtgeVJ2mA_b`gx@`k=WAQdyo@I_AkyZlEJW(;>jl zP~Z559&OkBcr~aA%BW9>rL*dn1pV$&CYQH?7&h@lAIUyM>sCfR$BOzN6Uhp16a9mS z3~)|*O`qM~Kb=90+nY=F49HIj4@6r ztu~cVzjFvLq>}qla+iwIf4kdyIpFny?$~FeDi?{j<5dM7|g)_h3qx^Rq zk40!)A`lw4z+vSXF4oU13bx=ho=RYL-Fku3xJlqNZnLv^t882?Gud zzWN|2T(#^gjTfA0;jiby1pKy}-~HnW1JB`2mU6ZfsgrG3q^qHSKC44D!B0gPw>Z@P zc8I+e{&zxk3P(eKvWrSTdmb;FRfRX*$fe z`+V91O;0;*1mic3G^#v&ga<2tj3S~&_Wdkj4unMWX_Ck+`+EvcMo_>KT7;clnxCF` zalM{K6I9vv0s;dDJ`%uNJ9WpytjN|Yp1<$@J{-27!ap-g2qjm^z91y2P=-nPnw#Pf znDs90IV|d$c!%n^PZ2I~U8N8uuZA`ULqHU%UuX-L3;aR!S0vX| zu^KVT#CJ)dPBbq>_^(dPJ0u6tk+5%r`+!UPggSJ4ui82wRXsl-lIt)8dvUH7zCqzC zi6gyUxL1Z>5|1j-bt@LNWN*?l?qFQH&MgcAl$fEvFw%l8_VsWmIWZ&Hr5W|a@vi&t zc-9Xe*Mgu0uvP!PWO8v?@SiA13^3ojmT^Oox32%=y9iu^rMew|6?0WD`>qkHcyB#` zdLjMEQ=}bMDuJNG{}TSs9_H2lqlIN#|FYnT(@_gRwG_HF!qMh-2S0suoe~+B(iCzIAqfOmbI~Dm{9Q#o;VrHZzX(CwJD7ui=CC)RCE#UZAc7VVcNfB z(|Zn=$t_Trca7vdmCpE5{R7wDL~ghbI@MppL(;IK^1Ox$%G_-_4??VOZ zA*b2`OUS$!aef!g708zkb)8wy7b)>^j>_g&fL!(bwf5x})IdSk$Ld>iA%hj`)om<1B6aX&kp9>^uS%0EWy6~l$9_qgFg z`TL*rV;OSA^#}Pka>Vs}`8TO)4CLRW;&9t=L;riYq5nNxyr-`i9;NSUaU_iN8qsY) zvAERJQS?b#hnU^7P0%Mz2nIEL8Pg{pQ7|m49+XbqCi_21W(q|Y6v`n%p&SyVHwrpc?2+Nu#Xw0r)O*wU zD^0E$lIUodiuVI@SmEb#@pxA^A-|YBL^{-|3piw7Qk|ZN2A4+oJ9x;*HB*t=AOVD< zihcvp&ikpsmyEY8o95IdDt&PBJ$g>q)i71D8A{|+i^WgQcu6X@2uv2x;3eAd#=8p*ELF#uzWt^qEP;zpQvUMCz}+AVR7aY z0WUlvs;p!O#2h?3>l5+b8s-W--zY$|i(P@5<0NtIfKmBW5Ni8;BwSh((_nQsj4b0? zy!BUN&T`0El1L?I;=qf(RX5ofBOsUE%vP>`S%3zV5HZG{e9?_5MSEALU}nQV zIK1uZ2Ve_kixwy-A5ht=x_2-60LFb4deBjEJS_WA;81|taCIX6XeH3+OIbLeKk|mB zeZ}&OtxVQ85QRE99q5}UIwF0uq81K*IJUj{sAlJ*miLB2zho;NYA%9N{^AG&aflSq zm&pk1E0RJB;$=Vjhk`mXVZC>ked|ymkZX)*{A*F;$WDTy`luznPVbP<6xEdENX;Ri zNO~V6Es$&Kpn;ee8o2v*i2j!JYSHp@N($LY>iq^A`#qC=TKlh+c-K{)U|K2%QUphy zM6xYeF&$;{vT$f)dCCo*vbv^x4V+8&7CW>%StA{GtKPqmRM1`OTG{t*68lnJ&)2H( z<({qg9Vo@I3*qV0k=Nfr5sc}I+(EK$YKk!mH&1Vmeth*O`!Jon&m}?k3lbN=>?}$o z5}Ew9E{ONEcQj3XjZoG7*TWz!NHjxW%&U^j5>If6>3uMyfBwp3eiQcA$KJzwbEyq+ zjzRrgr9eWv;^=J%r;mRNbOr&U3(||!N$gG%a^(hZf`QW?9YRx@1yg#1?7xm4O1_M% z;j?!?cWUo^x2<=9?8oPfXoT918u3zZ-mE3YX04b(UC{3dQ1Rx<2|nL!=6#6sjy!YT zc>My-tC)F*H%HVkA^*|T__*3Gco?|vCIZHv)*Mm(VV2~R)A7V<4~GYlg!PsyORRt| z!*|mH|0aQ-jM){rF!Fc7XjYV8Iz;vt(67thlKs7sMJBnXuhjb>5PiwiT6+2_-sQAY zWjmsYXtUkj6%-_!upxe$J-t8%ui3dS#pS2rAa-F=?C_<~Zk z3sIm8BzKBjlXyW@VizPc@Mz)}6g~S_#EW9fDsu55>yV$D+DN-9UxG%&rQpxLiSRQW ze(Iw&PF+s6ck}HfM!7w==_mh-cOicpAsB>T4~82xB~U+QM) zMbm2R#@p`r(zh#iOK$0{BK3GqU2Q%yqa5nN!cn{X%QbW8N_48*D}O=*GG;HKx8&3fS(;O^P@zjDsAmqI|s%K2<9f8EFp~dlzs*jTC zE+TK}+JtuSc1wl_+?aNX3Rlo%8_Esj#gpx&YPnsm8GC+yRoVGs6rK2BAOj0*FmX!Y z+;<|dLV?QTjN=xM@AEvQ_)4F(iQIWkRfXwT0hgDfBr3uRwlc*J@e`}WSa z9$=^A%;PHEPP_eyTt2Q`+P#^0S_S_O`6`}*)6jq77@pQMa4A&ejgDfOhRfTW@Hc4xjtbYV?)|d$7bJ39aGGX z{p+NeqzfnUK$4XN246%sxKnK|LccOFs=;@Un-#ucqY4wv3Lh*K!i?2W=h8@>HmXnS@1!R0fL@ip z?cEn2yy0{>{MLsZ2};L__^Y2mHNiWM;|xvC4wfIsTlSd#X(7E6gH4BVUXtKUd^a-V zAEi(urrg5l>+4CSKR?+~)xVgnzTh5=?KZKG+gFMU{>+O84&Jik_zOyJ zTT!04LiV9rFC?qhM?gAJ-0|~7aZ6gV8}$dNIJn-`J0WlIMJTHDb*~;D><@GD+QKfu z9`GM+Bz`v+M7ynRtt3`Dln^}sm>FBfvCB9%{?-T?6nqL@j#0Zmb-=J}mwn$szF_xb zsByf;217anp8d6L1S@s&KoZG~6vMspJQ{BM&2;(T){H0XfEF`%Pt4s`z*d+`O+upGQ6AETE!hj9)c0Wkf-gnLjByaFpS;N& z6=H2qfcT0D$vI2@hP+N3D7j!Y+;&(`=tZmi;>g+X=PUOsZDaTYwzejJ0P&(xr@2^S zYQr<4_7vG%A|J}uHcFr|DV4_|tu3<)(%Uk-AhRvgtl4duU69+B*#-G+iCuuzN9=~? zp*-y+ZRlg@8DX?!YB<{u(lc{)xeqttXxeAR`OL|Kn^{9S-GVs%(Ad06KzdSP^@R5Ph7a%#c7nY#YllX4`0S-$hPR;N#h4QiC26X?05+!EHJ-R z7z$Z@8EO1GTMz$a)V(~Oed#P=V=xr1I5X0lDui(5rM65zrVD9_?0Xr?Sb+sG3nws8 z9MY@AAU!I)Dy0iN&w`vLr?z4_snmt#83hOipdNCeVdZ1+z^$w!asU=@2`<{vxM<5< zl?~)<1fRD@Tn56}N$3 z>GZ3uLtZ>91BsSWwK$bNkW_Jb*TzFYdq`I&fK{rB?JiAL0>$viRyw%QN1r;-=0Y_M zb)em$-IeC@He9R@Od}`rf#T~R*>&)nl4(VDNaPwd1X@;LlU%Cv8#@iBGmiv0ldrPy zz6QHk@ZrBE%s3XqXaIvKm2h}lE-O@n6pGSRi^27jO9a2yHL4!_k4cpV=PHuWPTr@e zMZ<8n(h?$)@Sy(SEMu})#F?{+?5OsN_OwFpfBzEN)I;!b(B#ZWOm}x-*{>+#@sGuZ zoI+m6n<~X(c!H`a80OTBYyglPQjd+OQUO`t6{)y1AT4r5NDo2xV{kl8IP8{Z8l8pi$ zBRG{w!}NX+OZ3>tXU|i_7cn;#>Y@~pq(@<+ZuMhkuoRWkrhH>1TdR#WPL)i|i(mSP zm7+#?R?rD4`*x#A9Q5`Ookbi>jTw1RLKc2nu#Sx8a1b;c1WgQrH#g3cYmvtch&pF7 zX+;bf29MxG5+|{z>o``CjK?w1uN%nX?tFp6GBG1pca?I_(^2U_D;uUSsbyIw2RvD# zKU~Yk>>TjKX#Ij(RtynY%Jg+hqq3Ci?xof&9}s6deW^9qLgH|Lw#1t8L*jIoFNw-a z9Pf-JC?z}~`>-S?^v3rUoRNY!F#=Z#AoFy&=6NK`y}PAA>iMwe6TQ2eahE4LwU_77 znX+AeZWZi)3Y2SRaOzXi2Jfy!BWwwU9fJd6)vg2z)SgGaoGNywR{aiZ{1T3%tuO$y zL^B#7P_V#r42#JMr~zNbL|m3?P#FK~&rTss)%LJ1Fvc$Xo=Xz@4EF}!sEW8zwP!zK z^ciH*!TOQ#RioHQ`S=^Lb;>2a4KNS#XBNM9B4~$sm3Cg`qBD8 zz*waReH1jQgta#7Zx+-as)#elAgxMj;-4FhZpf;4TOiGlQ#y{|U?4dn8m(gV>F zzp5~GNk#Lz5x(bWM*|^lk)>Z>fjA$p&-mV;Nv=LlI-*3i45Op3-G&wkJ^iit0N$JM zRDlPL9bdP)n#t5gunu0A`k32kLECb+=;=d6X=?FN^eqC>&OA5+y8$8lX z`W6LoJ(Ff0M|RBclN=!ROqxOgE)fvlGwE>($Q1zzJ(EUKz*Xpc*uRY+c_evi+DSqz zQ0rFEx?lBcN&zmj!^*1NDN5dImv<|jS&!T>jL z)H+vQ{n+ajjZ$hKGd3mSZm!yWo-%5SQ~Fg2bh6XFoANm<&eu^5Lr@;LaG(DL*Ed&D z)d)M!`^h%aa>|8jU>Bo4XabWw8t1CD8@t!L&aPhx`9%kHAkPks`vPynLo6PI%({QC zkw845T!A6>Bt&ai)tDHvLm?=jb>)2n8xUqzt%vcO6qnz#caHlfcE|W=vxG0-dCW}s z_)0A4lSVr4d*P*EzQ`K<2JTkyeOe^bg`|rGP_U!152Tg8@+*OnX-6@Ek8Vb%bf}k) z?mF3j0<~ujpF&ya@j|shZ|KQ8xJ3U1elg)a|0oJi>l6b^EVNZ!jUUC-f~1p1x@V4> z_Or%&`;_&)eKhL5T^{@1&K2)%sOuYt`dI^$6LI1&7%hG`@L_HQmsoxev-~c${8lW# z^CQK$Ey1~#-`V1Ky)R>?#Q$eVoTbcs|1UMv8FQ_#e|0@N2bzSc>50%Z~qeU z_8%?Y{$>33$DvrGFYhJvEzz!KT)uk_Zi4?HBj8z-N8-#HCbjh7Kcc*i%{90n6_YQ7 z`TQ{ne_aH>zM@~aH@hSwL$!bqm|SuVJjpf1u6XM&NAd(Y+j`a(6YDnvtqPZCVPr1SN;lkgeB zu2|#nkth5sL(uU^&~Xu@M}o+!ZeU1T^JXR|!I^LhU-%>}jXH;RFWp`1jcZL6-Yt{J zEO*uM^DqQSX`u*d2$UoCD6;Pp7@8t&5i6xEs)fL>_>{R7iZ`%FO1Mzh(svNxbewxM0wq%`h;OUZ#S1{F>*a|vmo>I z0LjgK86S&q+&uVQ!#yh_>cb~ww;u^Z9~MZVOnp=nc@Dg^r&y9a7P4xpq)7>$KwZUp?ra>n@r7G4y*C`V_oE1X(&e!K2Enf; zU&jAXpH=o>5n**6K1B!qCoS1J9QbR~QG6JD^OWH?oH?Es{w5)NHTg2Ji~MccnA=(Q zy@V=cT8SMu(%A=db8gIFW=m%u%*P(L4kpC5H8eS_W7+?4tciW_;+P7LtjehMaLZ|f zHzqp7DS(?f&Ls`b$Pa#oZ+ZEDk9`IZ)*K8s>;&anogUU-+_NCkS?CRWuAU@*dssBU0&%ofsmWrOeWdBPza}^U4 z!#T2l<|#^(;BM~z81=FVg-h>n?&$_udGN$FSgSk)(N$G_)|HG=WBgx9J_PA(aUvlrxty zZPu1VY`%<4iIrr^`2E^LyoSgLJ;u+F_y`=0iDpVnZI@w8g@`G~7=EYwgw74$&aA@& zk&4KsU`(-yDaM##B4!xIluL$M4isc4{N%D<+9xtuAoZ6-ChM@-6;l!<&vv;crFXIH zD}xiX_h8wF3$^#1p1~DUq$1A>C#>s<^kUp1`{pKaS0@TC1U)@7yJNxQXNmD!ctDC% zSFc#il-sF`;V2ku;<5D}B$E$ND7%pT$v>5VC*uIAcYoRUE4H9m_V-5>yr#8MX*Fx& zi;}xESvSUfEcs$#mjUJVm;LPxud(`T)FxRyZHi{vr9`!B6y}cLL-f8!_E&Mc3bK9Cl}LLJm;DRjKiBg{3p1s$c%+a>~9XT2fc;ERiiga+(@7CdY`XW9z z&;c@T$$PE@k{o{cH^@~@Nkmh4Iyl9tkL&=SA3`j>Ds=zFJeJ*eT1zzf!=g@?c5gQ1%hU&mnubb|MEWx^HDMr( ze-9We|0VF`3fkchu3Kak&{mZ0#PvS#w6TWcF5)$u8#(F5?z1kQSGvNYxiA_(GeS5H zj%2&#FwLRJHX5`2#OJsZo=eOR+JJ1$S$t>+fth~kW!!?AQ)W>=1+6W(1dEz|Dq=qc zcedJWx!Bxqi+o3Zvo_&pIN5_Gky76eQtS#|WDRL_`R7AHsPxeCJEtqs?nDE}JQxF9 zE)fIA|D^G_<51JeX@4ExFfi6?m0)tw^dG%eTs?OlF-E!Pg>-sdZfqjm+P^+&`06E^ z+=kbt@0U0;ARfS z!P`v*i*|D%b#P3R1&%L|6qLuLxK#Qfx-XgCpB=e7{ZXV#_yU^8A5TTi-*`QC{=U5+ zX8!KHCNh5yz%mZ@YB9X4YnMxr-F)RW`05E({zkfel@Rol>}!LJ!w z^wzFibo)r=@li#4u;@eP61jQCUZSH{bfhyWEjafm4nqH2$^8hPhJ=C5c#dnbuzqF= zpaoSmi9FhU4Q(q@`)AhT5@g$1^%p2H<2q71D&8xxRuLTLIbl879?e+@wmZr8SXi1- zI%KPXQbX^=`mZ{N{}!ckf37W7Rlz1$C!Tv8pBS78o7FzXsp?FHAbY}YWA;RvjoB0F zHfB#`+L%3&Z6me>R)hAbf*&j=t1KpvG?X93;5WmbZ_)?{z zfI7_&Z+xMX_QLK1BrGAn*HA|AUWDvhcQqWPvHpqvkbmUeKN`DxlVdq{S731GBA+}T z1&Ruagp1K$d>F!(lqlY{5&S0T#(Kp&B|nbfS*zX4DsH>Mu^d6nJT+{R{Fjfphil7U zN2}3HZ1F=aB8)w;O=pH_&JGFgoso3m343PuRVFh<6;{n{f)WbO=f^@_Sa6hxeXJ>5y& zjm+5f%gnZ~nR|kYAj~ueukz8zEH?LiY~@^HS0$L1btb z3%1nw;P9|WDeVhtq}Jt9T|Lk_5TG4GISWx&Z!dVvnFOpYov8tW*!7pHX~EbEj!fx zsBLU_RP@e>^Sp&8l(&J5AgJNum@2=!at(p%gmMmqYT2U0zs224(T0=rP6Od(@f8t- zm$$EAZ1-2MF!TyuxPskS2>Z!dG_)37u$7ECIqZyfiKq^p4yzo|%w2HGT&@KAT-_+e zEwz!%P4+iMbnGr_q{~ZcXX$z{j`1qlY4DxhSP8Y4OM8wuek$9NkdhTCaM{h74Sv#M z@qfbR;kSj2PA#8nn6e@`g5JIR8P4Yzyc9B?YwfN!$;5v}5R~tm{DiTyYzm&Vo3#SV zvF33Y4#kVp$%5lURIa%ZEfm+7F`54Da@ADgD*723^0aq-d=>o;Rgx9^GJ-?*KM^)y zIgJA4Dnxo-iBnF>#QLR|8=@z2SmnEoSa(#G#ibNkR8Tz<*Au)Tg0rrDLclGBOJFC5 zTTG7{mEr%P6>A`=<3UOIJDWVAGK{^3z`a2XM6y_(fquLy!%ZA<>@Y^Gq=*x^p2OkO zNDsG5G;juHqDFmX_!Ot_qhtD+n0}@+2_uekL^%}XdGd&fH$nw9%D%P8b(rx*oG2PL z{)Z3(^x({%RNWKd>_#j%B*nRV$us{!l`UQE5mBE_>Vl-NM_gl(CyDW&P-G>oQv%LE#5;brk@&HEqFSC|6o@@G)n$Zqo zraW319?OC4X;~g`#!8y0oH&kHK<)ar*;3A89@Zn&u62~ZK3 z3Tvti*YLtSK@;`qDQppx4K(p$WUTxbwgBh)ghuWyN>Il^1(=68_E^w-4$KZ=x~D1K ze>v!9T09Snbd$Kh5|uZc(oN=|O*q>A+eNx&v59ErZ=`f#4q8n!-$kT*lPg(3OSdhh zTfjm0W03#gNlrJ8Gq0ziN3F=pa5)DBFv#B^($(^cPo(zMQo3avqjqb1ju(yip64hIaq4or8N zmu>YfOm`urYvG_F803d_P3b(mbh4?xhfiR-7q}mIufYDNbkX>$TGFbC-Qp^d&orf1 zt~|F6z0gPblX_tyIi})sLp_eh$WzSqO5bI1s~QDfxxBam$fSfgll~xpt)wAPhD$x6 zcFHhd6x72G6hdYrT80hb33K)AR0C){f=8FLC76YFtp>d`2;mcs=r_yA0i7JdLq@Z? zxUvz|YyJ;-Qs`(`Jw>XEU*>EnfXCU6_QY77fpiYMoG$inpWGi>|DOrn;0>RV;ZlQU z^S^hhzj6<->7MggukXw*&|#leotQF66=9{tQ-l;nP%e%TkL zxTi0(p|eguoHtP4#pD)hL-29LU!*i8%i?h74vVIl0>rt)NE=1UA}Ij zl5)od6|LQrr@F;ylG-8kL-ko8s$A+;3ul4dhhZg!Ia^%n=SA>ZH+AoT_*k2x-j6?w@&+SUVf5*~yp* z7hA6WTnejQ$8x%3B9Bfy1*2V6=n?Y7EYcwrT(yWqgqKgX?j!1Gra(fAX@P3u~BY*Y8Jp-&bKkGDgx zY!3=#Ba!RPEvq`aH*>z{i8lJ_j)WmXpOFje#ncz z!A4ULpwV>2*l{^#L;EX{KQl#7Ng|F5^mj>^m`M4s1cI4#KeS+o3Qt#5hoLb?+|NVd zuz(?}N6m z(H?f@_r~Waevj=lzDM%+M&tV~{x;L!9`k)e%=cw6-*U`%O5_{vpsL;6iSPCxzGyP{ zt`y%NZLA^iJt5|MT+H`hW4=#qjQ$=R6W=H1yJyVznwb1we-{0HeoXq<_J)6o{;obs z--zhi%HNN68Q%BJ2=<$UI9Yrc4sB*X#jH&CFPS-mD*hL;k2Cp$5q@W|=)lPG2oFs? zin%Z9NV53L$Y;BHcKl)WU`~^MFM-6OM=2*{3vIIUf0e+1a=`;u)CR|3pf86ET1F1h z5u8`RPQcll26uicF_iU}&nNTT$6eY#Y>NK?G3?z#(9>vUQNV-h%QmrpoV^~hE86|J zQ|zI^xL%xj_&p+bQh#jO1_Ja&V-x+R(}?ZP5&EG`(pR~xU2wETLP4#m@ zh`Px^(zaOezS)Ehop)EdLp_GF4<}4RY7yEQ3&=ltrkBjBx*t9)#TEHCAT5=vep!z` zZOJ8UkzB9~XuIjB$jT}mrKP!WuU`)jvf8^NGRk9c%2(Kl*tok4>DWOTaHd~A>y5gvA4ohNquSYMI18*>xHQZ3M zB?6xsB#?F%k69%4$-9V{y{s`I9~-Ve&um^_lUMAT51Ng zbI(r0DFQY2o3^ZK*9Xc7-c2{om~s?LeI{d}rPc1Xs=oXu4#_==TMI;fj-I(JaP{cz7>!JN8XTqH__<#=>aj;;8YI2A||*y z2QOR;!6}j87P_LF;zBj@INp(Arg$%(Fpj3n@{i~=<^9dg~a1G(ihfm_%%A_yDaAW zZ!zD+G2bOI-}(Gazq2jB(=ET*^G!8>*enqSL6&6VH8v`N$IHcgAfn)Kir)k3K?ELm zsJ}bZt?)G06H?i4UhMf?$msBH1C89E_W~0#YK!UU`_-wAy4b0XN!M?H^mv62LqJ(GouE1?$iyNi_C#~yj`kui_= zgafX;+_0N2&QJs-0W=?Ns>!rEjsIQD|I%@d)#qOurza%~!%cP5h&2&>{QNYlUoiMi zKZn0J_8pmQ`s=bUoT7N2vV}bdl!m@G%Zf=jTlxu<-c9MlhTA{Gzfp91TKlJmcwUzc z$%&?Ah-CUp9AJ~8`I9M-!WM2c`-k85nD4Zh@AR1OOzXF1hZi)4=7$@}k3f`smC|QN z(xZPfOk}=iQoOm+;^qQh`kT= z(mzcU0IRDLt@;Fm$iDQHSC{;C>HwQNWrXQRDqNgP8UB@MdH&6(67hdBxtnss7=*F^SL~;KSw5u z{v1w->W>lsl@Y%sA=aO`!LL0+tXg8);+cg0juiD9IFwvk?+pD$DgYG<)C3nftxyZd z?#3SD-xdw{Ek16~&L2K^eXA$^|56|A4<%i>M#)t2HY)Of%`o~No9WL&%MGSYviJvp z`ROP;DhJWew6U+qPh@Fy{Fi?a|9sXH&yy~y~wZz3swoUds8>;mSm z098P$zgRfys$5&m+^VSkQ@MXO7sK12$N$sYx5qbCWsT;fDFi5-FoG6DjhOLk0kL(^ zX`pD2N#I0M=?o8Xz=64SI*cDPgK$EtEp3@3+VjOgzZrCN9=>&S93SHY@j*!`G@v5o z;R|K}5#fYTS}2tAXmZzDd!HnIIC}5>ez$)#=dsT|`>eh8+Uvd2`m(UTu10ZT)gdY+ zbDpyPuMNWiromskX;2GluvTq;l-Do(clB?TY01uWkn+Dq)e|c6@c7M2#(!3fO^rM# z^O4&>P=+8@?-ZX1`@+U=tfC9_ZVtU^R_e2qGQwbd>3Dq66!y{*Jidh;J7N7~GY-$* zT$#`gp-GbxC04n#9UTFEaYL0= zx!Ij@lWgyBt2dSJhCOiu#aS(Isv3%fP4(nI!R=r(euXgG6SNicU>=~Te+h?kPe5NRgD^`)vS#>Nmo&hujom0ZzU!k|#T3bQ7 z6A=1c{)p#8leynz3HQ64$NerBalgyOW*!#G{4XoG|E1c*bPgToXgl|wi2WCJGuaxdA4)=hk2;E6z@-Q8I*CfE|*=(#={su zp+0&!^9v)M5zmL<{7=dJXyI6ck^^9#08;yzILn=3h2tncwqX1)9@}HF=j33q1?d(B zQ|2S-+!7)#d}H)|oQ=V~^eY5(z!?U2-|>pH)#J3yV>M;7sq|!~0|#Qq##1sc!($h@ zcPE#OM?EM8PI2woBAltkI8#eurYfjj4s9ixX$4BMn`4{!e!@1(uW6^$yotmqH;U)k z_=AadLPN*5pvc)ovH{n99Hrv4+RqYkV!xvo@b^pjU|*vt^hhEekDvYY>Qk!@)xw{m zsh>8Uu$fT*}JMYggbUO2e!f zyYcQm(Qjf(JncvD-soBGf1|wtx6|+$Na=YJH-VmZP-!@TB1oY-1eR7E1x4i^xN_%? zo^t7jOr)INs$7K;mmcu2hLz*4K40@qC z;=gYt`1`4>^#NU}FRNQ%UB^+QhncbF-xaMqA18a%hGJK-mG@|NxSAbZY0ml>CKKTz?BTWQNR3W z4%HvJ@U8W$HfASvVT#SH8P4HkZQ)fmTb1UGsG`xLU2r)#bo7F;WXUz7+(c?sH5*tl z3#xvAvxYZ}inw@2k8!d(4{l_BjL-O*VE-5;>t)rVOA@@^RvQ18^bcS~)ro)Z_TIq9 z-;+(iP2>fxXX{(v9KLHCa0%Mw%ZVr0giOzRbdgGOK1CR4nQs2| zSWl^reSPd~5~<5&HHWbmYMYzlSFT;I^QN#vIpBk@m_OFwP8G(opjHd0{3ZcCQG=N` z&&TQoE*?z%bBjkE?@q#H1npQRo13}f!aqE+#3HE5vcc$>e`;$S<5T*f_p6Rm7Rtaj zB>C4TLH8O5-FgnXFaz1vKJqC@9lAUcVfsKCJXy%M->ZAiTWDXacnu-@fNCqHE$# za;J{Dqur{>#%Ac{IMcfRp;MoXKk4;C;E|uM39M zvbQW;gzQc?(naAUAr;#_fRL_Sr2Vv=k<7A_T1WmB5NQ06g;>2LvimU%rb440)p zR6@e|b_d7r*rC4l8`Jnp#ILlvp?#2x*MZrOM(ZznZ8pC@)$=PF7)_`;MKl4JFbcvk zi|gQ-vu<^gO{ycZnEAn?v1}2`SnEv9d>78OsjXz{d43MA;Sn}YVm&}&ao>Rri7jBX zAO2f>Gp6C2fzWM0|Lxi8G;_5Zs+oG~8+zC0C9TwN<}j_4v7?DUXh|Am`{*k&r8$hA zj3C8hboA*S`WpKH?@_&Ixg5OBBHLw)GGJ8Lw^e}7m%+#?%=x>bhdcCohD(?miiTxM zQ5Ym4(A_J(Y+h3Dcx``fb*OiiF}AD(CU_p|2|U3X%WIXz!CzQWfBd0@59Nmg`@CT{ zh*T5u_vzLjHwr;Oqk%e)2y9ap>hU1ZnTaZsf~dP!yQ@7;n?#7RYP870ZrE4{k&%dL z5Ms+m0*((a4k=d{fC)~*!!0bZS=G;@(|Dc$iKX0Ao}d@xha1qmpiKlC;p;-zj}a8K zyo&Csn<$8<_6Qmchd>kke)OlwxCd=FAf~Tih^#h>fe$H*ixbO=c&A|!kO|}yr?{mE zJ2p^CFoXEeYh*2aj@lR6$O1--^^+6vgcLE^$VP{v$VLsT%RGJ(SmM2u$ft${p|Seh zw9P$sjP1d2T>Ufv2h)pKs1fz8vRAXVnWyPPsj)IVeOS>-=-y`^qJ)y8pQ!!2))EfS;p# zOcvlLcRMO){q&r)d(P6vr!i8Ns1ZIC(K z?d&ZSlnQUry5K_WSzQlYY1Xcf!gsyWE50XHPpg}+4_GWL(z4GI@#gX1%WqpCY4l~G zMS8PF_ElO9-c9h6jlNVU3MDuiAky()3%RM(JxX>ubQ-v}jiyudPohx}6Hw>qLl2J%dvK;vdvwXb6F1THph zZ!AuQ#kI$d@-R-Z4i^;Qu)a(mWM86;fNT2V{MZbO^VcV-lM%cji-gqXo#bHn1*Ut0 z+dZC{jBBb`=hN6nqq-EB)e4K|IEG-nPMJxy!G0d*?g6;ZtTbqE(Oqo55^q<8limZe1z_?B z+}>D&oxcx9eiWh|5Y4V({3KgW8{%4AyRh{6D#y$MzzUfX#jLGKEdm;$@12l$Q& zYKe(hvfsp#{8#V#^Qn06_t*+c8AOu~k_85#SH!nLU@@G^Fb`z_L%}w%uj0oP`Ax04 zHbur7b}#FZ-v)t2e#0+Ce$(&YZ8`M&rY#TeuiA{SOYZj!nESND_T?~zzYreu$EK2ACw&+^a-n-!|IbPh!^ip!^=j`0g&fTT^*}0va zYcCyV`U9q&1-UrC)uYP_2ho$Mb6UIKAtAAZWV3V|H6$jr+VfKCZ$wvyf8#=>>dK!c-35V zl4{dVpCTDNbG?z%c&4d9ikjo0^3hoNysREm#^#tr|9>Euc9qq?U}W>5{FUn`U+bw4 zjJ?6*81O9!*C4z|{XF*PZROm8L+V;^SU??R!Ui z^0lvQM10hqJ<0`IELa2WlwZrip#$e)1?r_(H=V>zPDn}nOg;JiS^zm^LPJ(2TK61*0n#D1kV@`ruJrY`rwm)BE%r`QeOo`71k3{_39} z9>_RS0|mQe_2Or9=`)~7=4EuGGrlxW!8=U8^Mh8HN$Bio0{LsEx%S+!6>YWWhL<0c zeN&Ik9t)fbhB?(7qzBcJAN^>op>Ajs{NH_0&D;dPDgTXN<|}XxlBc*X^C@gM-Q33? zgRL)KKQp<&WH$z;9HB(0J@mQR=rOTf``(vC5hjxNU8)r8%5M%sq4=D2vu#xv%bYPKi2JKGD~ zovnx3&7{XWqXGLa3;K+{5pI3A`)vXb@& zEg86(_2#e&24=Z*hABT0aZvSEo-wpVZajaBeD)mB)*|uY zNXR)*P(k)D?b4(poH2D+M1K^sYRxheKchA`9x}?MyR--Y#Z-#_#P6PE4rM)z9ox5x z0jw($*d?z1EkVB0(!fBP&}>&=s!T~8h|597g;9c8B-Kw~xfbH0nHQUc^urTeZYd7^ z!bA_w2o+wd9UFsioMmyS&L5g!Q@hM`>v+@TV)dw96Q^rbd(8fy=9*>|I|^dwEE@}S zDVJ8+3K=uER-#HTWK1F8AUMCY;x5Gv@61uv{<|P2+7ugb-euEVw`4dJ_U}&2gVWd zBxn0_Hh&RE3DPJcRM9Vh8Oq(M&X^GG#<=0Y-Q9d%?XzT9MUjjQ$|~?WG=t|bcz8Yj zi$29J;MT+TpZW`_2fce#M;3b&SE85NvdE0|NA6;MV36|qXDP4Mg>-!gkH@;8n~J6k zPzqV5eU>NppND7<1Z01DAF(m0Zr!3iyf49RHz)FU&A$s+nCR<=NWVTM^9#pVgYqF9 zyZ{H@*JI&y`Z|aFp$z z1E~^2s7DEA0R2{$;5E2~8Aq3Lx?S3ttGPpk6Vs@+PO`IXn&C?XT$W8I*s`$QZ9gtP zP)jrh*T_u?o?37o7K(uW*+$`AOYc5lVDHZGBH648=7pn8DLU^!rTm^Ib0@A%$)s(U=SayAlg}Jh0WGVR9S7NvcnT85uL-@T$BY2#>gV<1y1WqhO(=o zp}A-nLeY|fX)uEvwfX!8muCfMnC%~n4;d-LperYo6|(f10XgCze`wXrfyyWXe%?b@ zBUL3LzC4>gpyG3)1LA5@9F%UAf?g}aGGkVeY(E83c#*i~Ve-nDm5u2C8Q@LrEf}}W z6X*IOg1x=wcrqpwC?i_J9R==SaSrSzI>irWt&&4ogWb4-1G_2)p-0b}DFRiz1}@Z5 zfVCan8Lk|3`D3MB)LpXu12J%^zzRS43z6Dnz(+-ocjJ1?JsEW5I75XY!Z3TJ`jU{0 zQ|#W_c+RL_Z#-he*?^r4Fb6P1h70ZtZ;tlqeh^2pY=`rZEZ^IV&o{f+v0q#HG|Z>7cH-6vx*B3U9`NSMf_LhASExP zF^n0w%c9NvgnQ>A!fc9KXkMrO!vz9BrAZsLpKZDH8LA^k)BZ&la#DNnr~lGf4Xbhk zZN|!YvWvw2r2EIBzNft(ea}DR%>UmETg%aN%r@Q^F{ygsI|67#_!WKs&gTX}ls8%`86OgZ3LrcKBR7COeFfHb?R$1Z4mK z4cIHS&vAFj?*pbaDcj`8rT+U z)SsJ7cs|_{89*UN{HYQvO4smvHJaws;rQIBL?Y3DzDZ^-?}eNI$)egLCM74Smr5g^ z2%H>}=TdNy)cu-vIi^O2ElJ(%y&lL(^(Ll{tI6za61;DrPu6B4=g44m{7o>FKcA!r zY05hH7d;(OV6V-5`2t;q>Oui#=hSD8zF%J~cxd}5pxGdVf z1L(WZM%ug2KGC&zVjadfbT*llVN97YJfZI=ZCcLPOsQvS;Spn7Dt-X8y!v~-uLPyV z-Pk?E-FR_GvHk0+Ce(N~usD#h2S_MWH^Ewn;y-qI$N?H11_~yTYDJkR*|KsZn4!_x9Dn*y4c*yjGaQ@G=C@Gk+V^A zJZ=5;Umvx{Vvk$kqn>ap+ckCNAgLgJ^BL&|QEjK| z2gyM9l%#$n`3@UJ|6{tB9%&6-unkPXXW#+18i5I*QhBUyW9F9H*2sW zs_-6I)!O5q>Vv}^n`AD9PM*98y_}|58759+#v)&4j^1hPMMQ`n@7A@EPf$&h=r7av zM=GEYog4oad%fv@P(S%pk*=RyQ`AR4nT{{JznT8ZJ?-b;hB9csMEg1O;;h1u#=}Z8 zT9lt<7UZgTM1Lbyj(^kUC$4d}&FY2@D%?R<+)q+>xbj;i-%%r@L%E+yp%FLdo(k-$ z&I6)!Td3+fgDdxh(|*b+-hQgM6bn)n3um-v0Q|)Q>jQsT2Izl@KFk*<1>dI;Aa8NM zz{;vrNXQ$z)VQ0M93U6CKqrothKAZZuN14|bv)i=T0`}yR&Mwm}P&l z#0$=t*xHRfmUcgV$b1&x$-^LD1w-*3z}0OHtE z#-v`qgES`eg2UM;Cdlf40$Fu&dCMj9-x9__KE$3VdRj2NYbG4uCauSVcdo*Hi-iHV zq5Qa%4o$G3!s1mo1$NPz5d(pE(p7Vc94x5_*0N#G$yQxf?ZHS7Ic{FseogXMEt9`M z_NtF6BzKK`^C`iAg^&ylS8<#BA3wr3#vVeUEE^E=cil`V8{A{Pf;{#`cfazODmHX3WxOw>+P^mWY6B{p}2<-6{&8ltfenLRl;@}1sKz5o|u zn|1q5k2UoFMSlCAu+NXU*q?nKMYVJp4b$PGkoF}a$Z&33G1&!USB18NoQd>5269f*W!67fc>7Y}SqZ z6_VS&rRExh<_BnLKdRYwGwvTfo1&(azSH-$K;Nl6jZOe4J9zA|mCdo=v&UL@p>;mG zJ6Wd(`SnM8@$3EiH-BgU({z4(w#|$R<^v!0wAH`M+K}IW(}%j>KjlXcX4yple=)|p z7MWz`+m78}1v&EhM>gB7r@i28`0SgQw`#Wb$4v>+QKq@3V#mHOjS6f;nU{|A>lPvHUgrJ)GpUtP>iHuc z`$1Wp)-DU3$^>!U97Dk+RX?n83Pc9cWb^zbKO8vy6^P1b@Ytq zh4$YM-3nq6JS0CV3z5Fhwdv1g^jIHEJfUp`$dP(RTSe;73+i6=1cr$AP4^RBljy6j z3iH;udruH_uv>8TxBm?%|frf+Kv9n-CAXW3d2k4W@QYHen0d%)u63KVB0qj?u%md(?MgP=#VBUz4 z0Ru?KWF^6_cYb#czm)o1J%dR~F`Fa$Czz0<$kJYi5!e^lvTDXC<5*l}e{_fWA$^&| zCp!SV=9u^6{IJu0x6LH}B@8?7;Pm-+t6Qt>q1zJ9&~1X+Qa7OS%M97qEC3Xle(5}{ zAZhn8U)1cZyALw#Ga9e2;^_0 zCtep~f9eAtaoqs>R@GRQ8IlsJ5%Vhr2U5DsdZ)NFt5~iBtn6&H~AY-K%=LFpO0J!kgqkGd48 zQ-%@>0R$?}Las5vPqWi@gF#&V5s%%S;0fON6n0IHahSl1VtBJ-v-r9Z8%|+no_}p- zK@z2`j&6=409(;s2D&KL6xixD;VSuMZ3v4#1LwpcmcfWDjHF*3Cv@9QWN){)C)ePOBY)R(n z#ZKrn3EyIM2ZETv_X5uiD=`SO;Hn_21_~^m&a}<8Rpjpy*R7?zR^;zS)hwuUerGA0|*Rm(H#8wphUW(uFZ4o5<@v7N+ zYBkvF9z!;}l!_yfPs0I>=|>r(AdHqe???E+HN1X{$tH)UKL0R}_*BQqp(PoxZ=UFQ zUYU?jab*>0>AVs`GP7&?G?6@r&Pu*5CYA_*)x)XY08?}O!ve`0gEw*8(H7--^2V1# z6!gSIEQKmenB|llkJK-*o%I2|%0SvrF&==sc`1OBM zU8%am6coM1Ml~^TPD-$h(f-`M+8Aiz!9d=#+JE08;3!tD<=?N5qDk~WO+wic+aef1 zCfNqQq%i>CwQ+n5SizW&VL3H-VbwE(G0u;*I8qYb(D$SX>*9dg7`2 zr#GJXJ$vzghxO0Lw~7AmqZ)CSM~!P6*{jyH#K}c!7`^7k_xW>ohErfWNtJUdhQ*q- z8{j+EV;O|#{%&T>Y~g-$AExwu65uPU`t$^MkEYg)C-@L4f86R0T&oi>AU+3yQRD#v zWs}s?0LeZ9;<|Dn88fO*uxSfn{8Mo#VxS7m?U(q@Us*GPu7DK7JDqAkZN> zSX3a3@M3CxI$=YbAT|6MUaee?qj0L7d<l6~WVgxTF#o@fAaRc^Ha zdjZ)ioXSI0V~!5o5bw>;1ur8$wR4l83{zWt2jl8M%A` zt=;M!4NE6G4tUcn05dWgb2R#n3AGoj%8B_s_)VO6=6Nx01L}Kd_Cd_Mn$Clk^;j4L zWC-8+Ys-fMoAKv*K$g;7K@&*~O@JSOL7UeIm};_d4Q{f!MV%6vkIbPaA^R$w31%}2C>r2F5SZ~0lQc^m|ePqE>&j9SiBT3Ov4N6(N#-qBbET; zf?>*XVnqbhLTpuSwnv?SK9t6Y5qqVOY-%F1-CiNr5m$G%-U?%;0 zs%}yme7lnZn)XRMZQBMT(!JWZlM8B?2a5}yzy)>woo|9_4|#VkdZ))ZKbOiW^($=| zn&dZ7`cGe1kq3Z-M&+O9?*mZ9F4g(LGD)4V0I8eD9$Wr>Nql?4PsO*pwKHv$|L;qw z*|fkQH9Hpw3wfhu`(}hpOAu5BLvxW}&_?58=DDdj57mUPVEQ!1&(kb&c2jpeADJKK zuH_VEA3>KeL z9-^}%?u(o)=VF0BFI9yzO^dy$;|peSPG9(DZSq^R&}o&2Rtnl}Z{n(Hb*mBO7q0wP z-G1l0Xq+aln>1c=Nug;Q3rDS(3coFdgI3%q)y5Yp*K4oib3ub!Z1_}MXQ~gCY^*&$ zYK1ve(o%bVQ27sCfx}MG*{-jT>2;H?N5<4`Z(a5btcL4})$piYz2t?$g~}EO++G;l z**CrvEnJ~$V=DZb=e}cZ2b>jRhU5xzfB0A{e4Cs>^24xbz2lG~rumh7SfL69Qw3G= zR6)u7iLKttkpXWb0;wH-BhHdW$KIp$Nb3vf_)BjxnbnU)muf4JwXXnv?;=K&?!bpw z4+TytleYn{gk}lOP*K8_+XbAG_=m9MOJrao=SkvftnTTD&W5AoY-m=uyL7AixidGs zk+QqmcZ#=mN$TfPZWmgXU&B(Fz_KQ=D*5UrWNJf81!5(l@9{V;oJU}TCX4>RpwGvuNVox&BDU6dQ1(1`-QJjuy=?7jBs$5 zhFxkTkf_OY1v-_XSbz~IW~O1HyENj2S51<9&4Lulx>>S+EQYWrcWJW}x(`%unY(E2%)0HLd&KEYY^wZNoGf~4FZ(wxm#&n5d7VA_d7A#-ANJavY9eal`JND%SRGVq z9=K3#DXWjp=kmg%fU*QOgJy;IM<=uB*@Ecie(HVd$_wA|g5C@PZY|@Oq@R-}=|4qY z%9{()mu+%AXpjGcsfUIo7eb)Jz;>ApS7L(=uc0f$l_0}7#oM*~R;Q{#^G98QR&h1f zHr5tE11U5of#qG)BhotyY1eUHBIxTMaTVk*zI(8yH zG3}nm-ss)s3jG|gqczZaD=;JztLNY>YUf^!CyGlurBLAnr~0Kw=#bXqTR5K~HvE9~ z|9WT{LyIAyWyIz{|1EOqNz&jo3HEb!BPMxUB;j~*>0#K$;SDx}_A>Mx-HNf!yI+m- z{X^ZNHN%NBv=o;75!fNFqBVapqh>VB>O2rGUFw-ZTC^kG-rx@_M~lR&cG~REXR~ijGAJqkyNT@m`K{VxuO>4-4WsPgTVDYQV+*h0{N5|b zQ#x~ji#iOK#D_OYxu3AS*MtQcqRHG>;>;uBNd7j41F<38-_gFkdXh(M7zmRD6lcV5 zouONS;&hE#kp)LUZMp~#I2uGq+3GttusY%l{Y;Qcw*^|8O<5DG=V81NV1{=5Wmuy^ zEPoquxv?yLz2R&6!G*yb7evQr@CtY7X+#CgUg$e#1bnF8nvM)lLf_GMn7v>Mhwj`d%j#CS@!T!) z*<*6!d2{XuNN0Z(x;4+&b$2=XN!jW^(CS%1sxAYrTS0oNa|m!Wrp{r+9jDHL*GJSj zOqk8K&XLKgPvI_JPpXhM?N=`&w#8nk*WP$3o`__Qf-fPf;M89JtU9m67sNbFBTS#n z{KtYf9vC&&fGHmTBz)IzAO0%O-PfiKc=cPrAQK$a7Ioxuc#jys-OU$9n1~M!!krWW zBZr3mq!#FEWE1w!lO!C-4@;}UC&Yp8Rem^P0mJWs|Q6F?uP*>pfF3hDb-QopHv_#)o9E}PHukNAEmZ^+|+ zvUzWi<53f0rj;WAR)U-Rcg%;!*7eOadRSnV8>-P7r3K!I#n7wSIG&CiCHYSX43PDYc*qHpi8} z4LaoV&H`Wxryob}WU7R5RNH%;q?Ls72op%u10c+3AH9GKFQx^{x&#$e*P$;#jvR7k z#Ce^zV?r~IwGm_CY74AI;@V~uwu<~`y@znHKY4+i45-$0fAv!~p!q(%eBZ?$9;Fp- z6-M}pTiu}*(O4=34md1{L9nc{L23u z_{<1Qs)k-bxm^*Mc`mff+>N%M1vabJeT-zsgfbI>XU*?y=8tN=7%TT@rQIy|fcD4d z`Sv;x9jkDHC{^eNroIK1I(M%&046v#lIbN`XiXt>vw@20;{5*=Hl|B^`KKu8eiN5N z_X*z!TLc#`i+CDA+rV6HKEXPODpEHB<+c}-pv?Vlpfo1ocqko?6&JrN92FgoZ$-Ze zj#G~Hg5!^$`*t`s{Ixe6Pe;?>xC6SN$OxvNYvC@VMKxQ^BGzfEyrCBz+)h>^E5=fW_a7JyzFVAB&p>ELF z6o>(I#@F@%x&mM5RyW1&AwN1YK;jhoVD^ANTVg9R;ewAC7c$732zjs>2yO++TvQu) z>`QFf%dYpZtR1s$78=Y+{pBNU+IvUYYdygcHt$%;H+i7<_bhTk(pc8XtKmZlMp1t< zs^a?^^QSEEsMkbN9jEi{> z@nRj~#bRE+>%Ia+;sQd53~`;sze^dz{a21zYtR35MMkq>A(|cNp7$90LT`e7;bO$6 zdD<^Q6!C;6@uHg*0!$TtgY5P-XJ`|i><^oMkd94xfK7Y6giW7#(aL={(0Ya=i?la8 z87i@QOfa8_O1-gY5v^+v5;OFMfGhKmTh1YjLY&_Jm5x%6P=2$g5v7RYlYij?TTW~l z|879Br8u-j{L5(=c%g(;xD1g>6b~arfMN5}F-(TNfV7k+mW|`YMj>J&t6#wQ5RZQR zRc{0fk~2KRvOQlh$SmR;&tmOwPxQvHGu<5i+Uh5C4D-WL^!haUd^Uj^<&oXwzJh_^ zAwAFhYMLr^Xi*riQOD{8Gf_ml=D(fyRMjj$c$S{eOtm~gufWZKay zvO~)b!hvyx$i&^z4M>qi$ET!KnPYIJBt>&g!a=%SIi99ebW zBMLmr-<5PjLa8G!f13+19Tu^br6d}|1Tcg?`;KZ0^^En+I;Up~q95(4j=CM3?{6q-CR5Ke*+(S)QEW6ti64F6IIqYo=MU+h3W*TT3ytjQQH-@ zQP4&ZGBkk+rdTatRn%$`*%eoW381_cCedEUXxEorchz0@(Op^f*>!!XfC6cuE#Osrc7o8LL-&ZH@z?(_Zp_=8UF+`0GMbI(2ZyxnsPgqo^?o*?u8;E=Ti zt&Xzlc#tjl!4YCJS{+hNSpmJjmib#8L2aa4_I|5OVR>$ueUqBxjK;M*w<0y@=axk~ zH@dZqByY7DYFu7qI<9>9&J-{WHsOrUKeC_oqWr!(iG`d z={D*1wMn5)Js<=%987gv;$mnTYb-ySD%LZqt#JW7Y@*u%1JTt#_M`x=AX^8mJ8(Qh zYvck!Zt*!R2zHClNq<>^T-{K{rZziT{O-X56eVW$K>O7jmLEwK?+dp0KcWv3)1g=D zK`-P@D;M`^kbRrkCX6)QUM|Ah62Mm$YBVtzN|JeX8UJK9#oaEm8E#!>-61yBy$@!} z-6gBL3uSGbBM8`MpUSb3P1u?Kw?7aBGFz*Z$l5}Sr!B-1GHcfVdJMXX4Wn9ei+!yL z8Eeu9{;4Nb7X2Q-u?N{unCdOEHUsdlO>sLy+EjNz2!6T%v4v}=5j^{31B3!Onv&U3 znf;)QhKX0QWNmcnb6K13kl7x66An+C@5JXOe1`tg4MTGUiFW|pG#y|ey@oeylR4)2 zqp1q$LOBDP))(_uZb>Y{5AFE=mbEA1D-*s>K%2}ChR-0PIKCGF+gH9{T>$7xy{kp4e5-+T&=hR;glzd-KAy4|2BWh+4;vwWa+#qH2%5;#q=mhUz| z>X2c~4rP_hCIK)wl0&di2|jb+2%j-})+TFttuiYEQXksN=VGZz*8ra`bCeVQ4LCQz z3{Yp`vk^|G%rQOH1lFYgHH8E!uqqk3SJTryz(&{6mp}u`+SLxelJ)t2F!-7s<`1hQ zYdbFp-8+F-xrrAMXh8s`AP6nGLTpHKX^8FAF9QT{1~l_{{7RDnV?ovDv_qz8dg!hP*q&j^z1e z-n%TyS!HaGN#c881wNj1nD7F6VbDr8tOrNxvoc_k=fa|O2H99=i0#$iehQGH-s2EB zc~=n2v<0vPn7g4!+^{D1&i z+dE$stBYwt9p&4>1;3+JwGtPHa+4f8?NJhKG>1T2KKl=o%Nqh&><;d6%wZ#RA zosXvRCf&IF7{De?#sxYFHoFSWUsB=Ikdb5xOT2yU_Cimm9LqY0!c1(UyP&gF7G&*R zCxRvh_UVrtO7&qe%eB(tXk3i$Ay^i;3oK$J4$lEkD!AGLd?kgmXu@}$HuMGW*iaQL-SrNw`S-O`mxsSQF%*e415mNchQ=UV*CentR@ z29V^CR9%p~>le4OjdJz=hHaN0&eONji0XPofHNzV zgTs**+ct#+kFq9IQjJ4=)DgjjD8>nkeN_8xVc zklPw*lWGGNknsaD$oRvNgtYlp`Z#D{C6a~gZ51EukHxWCoM{=T9d=Qx#V51%a>L=# z@}XUF!;y33qK&X3BsR$@S0AA*O@H+X-01=it#pd4twKzN*tQVcBe6iftd&;5y8?aG z0id2Pi^Q52-A`2aJWHiI1B0x}jh&^Hf(h6M(4ZDAfHu^)a1G4eVn)BjhyMg`V)+(H z3s`_B=fDQb+C-u~ zy5eKQvF(pgp7S132Fco-0wiKjTVik>ys#oa=JYDv$XSc@9;POq(~u z6W43!;=+B(T~&aD5^@81M%**;2Ygy!F$5r4W+5PRAlgc-R4&7!_u-2Yl#EbiEI`2r zx*psp!#v}APyoIZBY(AX5h;EIIa@Qna0Hh$_cDr*7~BUNPs5)6n{>q~iS>RrU~-vN zjF#CfsIL_h5Ze3#J@haw^8(}zF3_Id`z=gXhgj=}ifT77yQ8!S7PwuW4W72uvs1<2 z>sw}_%4>IrVy8^5763nfw@dA|0%utbKdBBN0(kNmd@Bal0}G1l1LpulK)b&Y8Pp!& zAPhrt(QE+VKy1E5Kd(fv;8c!>_W{-kdo6MZrx^JI;u@+rVCN_Wvu4%m6Qrw%2Lgaf_oNB@DYS)@zyp3Q~2A8A+hfz}!$85$X zDz8Gw7C(i3spn^OH|w``gv2u*N~N$3F%rN9F(TsTtMMx2;KaCSgmqW)5zYjn(n9Xy z=!QiFy_2Kl!E6tUwuzBj@x4ukD!xr1`wVDkx6982Z4q}lZMPuMT<^ebIkCAr)vIsL zFOb+e{n04e3}7G@z-#O+PIfW)tq+9WW$jU-?y2$>c|`7h)-Fb8Lx1v;b+`^r*k5s` z$SiO@atML?0W!G&x(SWI=}~R8DEkn|J2MReLCOHK7=MRgVY^Ji09weN!zZO#un>EK zI@drQ<9oz&fE^04AE>s}u(QA1u)V+D8cwBFpp4;(0|z=NzsmIjVEz80BXUs!q&%5@ zm>h!ZUE-4@FX^B;=b+w>-9h7-bZ~JVr-KoKK?hAl2lA5c6X>9PIMKmNKm*A?XW$*D zSoXB(t-!2dEfy#K=UB$P^uf&Y_w~ihtyRZiX1BsI^O}WLfhSG_hT+0`fDwz4?~bNY zo-Z>;@T>kff_V#3ZVY)3ifSCHfSN(`2e2mo0pK9a$o~>*H>XJ%A@k|aoli6weY87s z7XR1-ur(UWY>sIPQBix9T91d>MO8a zjk8BP#ituVn8_VOKCXWD z&(t^Dx2f%iey;s9u)ey(*03W>ZU1xbzKq)a>wX6Q9JPJ%&$W;E%*w=P*3aWJt1mvY zehQxme-^g9Q|bfm-K1kGy7-Y&&h;8=cMpstLhE`a7cuCZtlL`h7EgPpY^Tw zSYPj&dk|On9`&%bZmuq=UDmnVus5I%b(>A-!~t!!HEhk2)OHx!R%{b#emwvI^&D#Z zF@J8ncAUfL<)rlEU~}_+3V-n4`7`hHf98F`PrN^Fya4uK9A5h|r2N4K;MR=xa%DEx z^ zwztKF`a?@V71iEdj%|QKo27@B7|QkxctH4n&L4pO3ibmZ@}T400ersa*kA8Te!m*! z2(AFTB7M!(>p{?$Tb90V;s2CbAj~TZ#riQhEmr(MT@SCv_$;V)v@Bh2RI7#8OXJ25 zZrN#By59H=kFC9rTY4YcjmPGtI#+}Sk)5o?3R1tNX1ra%Zj&*we!K&p#QItG7ONG3 z*m_KDU!rah)b+nqKN?hv@5c`YAbhp6?D%qnP&xTp>k1Y zgAhKiW~(*qm9;hIgiKj!sX-w3=&#{?oCESf=4`br21K@~CPpN6J6{3e{*wB=&Cgzp zlbZD-Zj)(iEH$Kk>yIzR32BiTHD%08D!eqgmgt4sK!IoqP%G_JK=?nTkHEfJX`xAF z*`|G4niOQ8apN|b&)ECWTTO<7>vzxdfIeS;Wgyb2T(3U?4Fy2~6+E4uwq%hh7gZl< zwhy~qW*@1I0#x>digw6qgP`(KJeEL8D$o>ytX*ztMB@#|^^3T|qF>7F zd8Bv6)@-w&nmrFxqI^OSpTSdrLTb`>d%dithucSfik`GJ?Wkao&rGk7P%39lVuX>Q z@m&|TtDG4UUMwV)nhN}61JXO8DB7`TjI7QF#cf20?T~G=r>~q!mi3Q2pB#URm z>K~xfcX1B12WPNG=pk!5EYnS}A4?PESk|aJ1wh-eNkFUzp&OU1T_!WTTN`UfiwXBN zn?4`xZA>&CzF5|7t3prBc{DCg1?(GCh?b>LFPV3$tlc6*jqrD--Pwf`%JI-Swi2N3 z948CmfoLH`drIqDXiR!wQ}WYLY%1b#_@BN(OVhU@woQMtmaI}2p_1hEbRYvbRd1e; z48Q;}+7bR;UGfdXJ_(fQBzrU<_oB-Ixv+MjkN4_(QaFS>YG)Ps*4~uWRm2xfT3O&O zu!q0tts&L}BfL>)Xm{kc!h_X(u+f96lMOIOeE4n{IMfBe7Xsi?t=$cqt{~O=-N07I zS@FRN4>kY}@ zfApjXKKd$=fbU^GC()J(v)G5_6c`4zZmPc6!5QeNV*E9N|M=~G+6>8X4+Vgs;kSJ~ z#G-F#N4VZ?7fiNWIhq!fg%;GMo(|gQH5GjrAq^I$+9UuONGU)*lEaV(pt=KJ`sV-Ha0dYZQMuJ;SB&WZ)NkHXf)yo6(a&#SUQrY zbAAWNG>|7gw38-}5DhQ^2W&}|J7C3p(W_rygZxE|JWn+T0R<`0%j!-jG?#wAsp;wD zWOUQjzy~$8fLeVM(HQV-0IJZmO0>y5IYq#&HEz|*6NtVMu;XGS{O9Rxq3`gYzE$r@ zA!?o?B&GSe7%dXWzJ<8F<<_*{$VQfqH`3OOS%At!b;_`VYgvn6(V_(n@kizsz+iKP zex~4WHvAP}LWCMzpIH;3c5TF+1;6wyhq(=BA1sK@(m{eU#H5>Pb;@b0t%isD4sLp> z-O$sEedRL1yc6}5UcArw#ql_I0?xllp!vS;ze3y@dQW-<{Rr|tEwNYg(nr zDENt%{-hE+7G=@(p1t36jORRmKav>zW|a4^%~-ksrZU$PtJ_P#z4 z3-^JLYwqTiD1ow8TwAr4K5J_U`X#mJ+|SU0f6e^@8S7tiFQdP&xnHNhZ@HJ#-}l@k z5ieP{K11JB{(|UwZgpkaL$`RY;h}5hj_T;@Dy#Xf+I-hU@5IQiZ0z}(L7Q=>dL4HU zz2ysBfUHrhU4<{%-XOczq6_UkDUc-tPHhk|9(5b(zpYYjz$w;W3rg(4As@x^V>mr% z724)NML(ARA&DLB->TbOX64!0YWrw*05o5=nQc^e`r^B64cl^ZyK-CEMy!JU42bWt ztJ?%pccE+m2)EZ}sqOpyY-8&#i9yYHA}78JtqMZJRvX*w$EIxl+!i5~+a)!$XT^8r z!1@^Sqs83P~9ouK)a|8 zyo7C#HSlz1ZeeH4|N8K_46IR&K8?be7ad}|7XJvduL-d)XCikz~-*+Y%G8u zfYFAnS^NV}T&n5viIIvd=yj(JeWISYuO?*`BX>X%+XN*A%kM>p=hp0+!*($;25W9B zfO6Mz*ncfGN1S5h0x0yPplq=I!JM9yRxvEd0_75$6apwG$$6}H;O`rLA+-}bxC_0t3^8(xp7NM_Q!P*)TkQ9RkYZ7;HBE& z@P58{M~G{nWhhOBus03Y6jAgV+?;|f(S3$O%0lh}{ql6b`+EERs|`1`8njvTz?Pza zI1A7fLXV?LrjFQ~*n2RxO19!SVqGNnMGLJY0JQR7#r)S6{;P!lYUjUv@JqjOHtfhL zy>KlusTRF4N^aO`(|x}&DFinvF*4Fh9w*&(*kq$5N#H2pQy1!S%ba5LT&T9p zAx6go5iWBn`S8iKI{nqxN$-V^E+RbMtI+ls&=!Vb0RhpWx8B#7W)YIRB#P8v6NLyG%jO7V*L6=RRR+o4Ys?$s*?x$$5mP94SUTa|o z24nBlN9;3D%zoDm0<J$qQl1uqm2M z&E9A#E__DC+NvH3+Jfl}jv%;ZeI#qMOK^C3zc-t&1(c{A!0@jv33BU)zo=Vcd&xb$ zqyd>}87wIF5yo}EJRQ;ZUBbVWc`uJc0~2B+y`DJtDtESknhNUSE7Mk{a$vi(Dp}KB zRd-q8(XQCx$<8)4By63HcDCW5{Hh|n+SzDTtkYht*(NB$D^ha~%=tK>)L&ezHVu%P z$7Olozia^(KIj~S)b4X7_P@oXxLt{`gF+FT=$<0S{O&4%I|M&wBJgGGI}AIaP?V{t zs~2LG=`ffw_9+iYfj2YK@hLL2EIz)J7HCSg%`XYT_+02EF2s?RpmN|N7jp=N&jQnM z6Jl<+zG@j#O9&&G7v%yumW*k(mmp}tB`t`Ql`YV&FxE$Gw`Ht@Z#82JpyDqNVieD0K>ulv@5T}RrlgDwbHiJhhpYt$ z=&ihxhdPffPlW%2KoT<@E6tKZ(jbg~KN{B%6_ z@$t!^u>ivIg6xAb)>H;-9<<{;vGyD*Ms4g3#um7T_?a%LhhT~C^4HFA=SU!hkBu!T z8KU0-gwk0$0AyPc)$~9iD7s<<Y|`SU(+#YUU3FyyH#|BGmwlVg}i%X8s^3yoyg` zA$|b@ew)5y1qHhn3Szz8jirN0z7(HoJhTPf!8N(9E3MR@-+iXO`~@^S`rSDI6_&V^ zK>@KI)&(w@Yh(E%^~slVKL|g*fOhFZv`ZIbRA&jsb{V0aLLH$4FE=1ss)M(Sq2KV@&c_Gj~j^5wLQ4O-Rmfec8Jjx z@FVfBp58c}YQMW&)+QAL1F^}rF%GR*^Vu=7P8;KdZE6I(7N3rb^>Jo*C+fySu~) z_-VZxIgK)sqF#Z%LfpEy^*xTV5E|V>TA2^l|0U;Pd|ser^{kYu)wE{RmUE*)*Ho02 zPn;DVP~Ur=&5_|RFybdy`Em9qa-%&0tB#u|XxAxt00o*GTWp5l%FKZVax@lLI>$Nf zVziZrjdo&*uVXRtDe+7Ub~FhdHyW~oVR#oV>5w*TqohqJjBXGkb8&kobAYEKnNRkj z39+HS#BD_Q+VAaN_^Y5c>fQ4U)2%}v4Fio;4v{+j?g7^DKuH^mM5g4%D$vLz2EJfh zK%s?4^~)4ia@ytUFGUikLQJRK`T`2TE^3s$U(9+k-O+;IXN&|O7r0?;M7cv;ItIm@ zB~AEUaLIOz76y5?KmvR!!G@0henID5NkC+Zayp*Yk(V@5Hx0Y`3$0Y%7g5S+&zBhC zmY+fICf{>&zBlX(brJGCJf{J#^bm~~iK z6vA4W_H+RV{s%KYIH*l7_G=G110W?nz6ci)#s9^oxC>W&Z85_CgKUdlflW}rIi5s< zc8FoX8>)uj!9vn6xtbdj3q!!#{j!knPPBLTSC@~MnwBFAUJ3higvBS)Ed;so{V7FbRFWJjAw}d zO=!7|MTftxm$ti#vb z0Y&l1E4ae46XO`)q`IBTrvcCR$wByDQ?V$ht`kDu_Brnv254I64}6C*)B|7lX|i{H z23bm)9AuqzfC9m)bsT5g14^>sF;rR03alG~rzEmY!@ug{dE~3%aV%owPLgq+a~EUZ z+NA&+tj>H3ot5a2W2II(R*{V#fb3H0z!h6S;v*j)fVu*gGK|kK?k)rh&c$P#`aeM8 zuC+D8o=5u=5hw;9%35&>7LXJx6Np@}uz-EU^4wTVE#NV*e6fBIGE#h9s1LXkRG~b# zSZ^c$UkYj)!a|`#uI`Z8E`97aL>X49Mf098!<~<)E%V+zZ_c=~==axZLw6`w1go1+ zuL*jGH7ggQG7z&jCv%NBN>C3pr>w>uviCrEzr;RFoS8x|X#yWH=pCpyf5|qaA!R78 zhvHQ@XP(ZY&sOls+l7PFjwfSng}mb@0g9Lo`z`Ei&8uuWb0+S?aVa!(>?5$PEhq z^(~!j9aCVOI%&}R+pPRpkKa92zqy15%vvclp4bzGze+UAA+{gB_QPIMWtt`a-idAy zWc?!9BG#QppHYit)!)l(5C8PKnEOKdc1HT!5ZkK%x)X7P@$%ZQi-`op$VBpNG@Xar zh0j9mbX*r3I#kAEHmH7tw2`erZL}V^ttS=G#uXBk1_12HY=I0QLn*QpNf)ZSJRSTH z6(~N|Ay^kWid*raBzZsay=!Cs3oIn*HwIZ#sOW&aqE&u_oZHdJE)BVfeLka zz`ck8FR8=><^YI-R(y-whv^*q&v2qL_95;Df1FmQzYjA>@d7AwfH+>E?>|NW-ay>r z=kx({UzAZ?+Nrt;W zPx@D!lc7S@eTBK{EC?X=E}Tb(w#_%=;$LgHh`tmff9HI09)1VS*_0}hvjd*E>0cVJ zjf8FZMga0b7~oa#LNxrcaX}t2#xWcA{qZoqyax3FKEAwzyneG_)|vHH5S~IK0`q3Q zZpKLf?0PHN_vT%S=X|JO&0!J@aSPCs04vIVP$3)j>F_xi&~eMHYt0H9jS6Nl{DC%B z+X#P&2&lZoulOD`^Y}ezy2ChQV{Gn?w)Ez{{|a=x0uumcrJXMUkDs9r_oq_nEpspN ztbxE#>TPJ%Baw4HSt%;@XWvD&R>2??UgXnjjUty>RIWe0k{1=4MY6usC@MCKO7#1T zq7t*HSf64P`OKn1y~t=@Hj7;P=|)kxSyZ6gph(Lq$`?o~g2IK4m1yO}7$yP!n}(LK zJH+~|eozIJsJrz0pW~7Gl~A{k>gu;akv6*u3d*@+cg>S1d@YxR42f60p$WE7o2 zMXPGe1xCjlbpcAXH~EIK3MC-kMIKqn`O&8Cm;#yw(RJ!=lCk){$7JH5;cLQhU zbau?#0bbr`o`Z?4T8*D#r}}T7<)!6NI!Z80=Ra$nPk_4V(z}e(VytU5ORqCZ3$ZSi zUVx=uqZFi)Ro|sc&o@d7pwwYAOHX+gRaXtY91&0~ekbrW60xT*fhz1HSZ=3qJ|Nb= zgO&WTv8_@~SFZT*`~38sul8~ok7R;WsCGHSTbd*8=WWIki#|Daa1H_5FM?OZg7G|Skk>+oO}=#{0f;&|Tl9rwD* zcp#&~k+pBhgE z`bKy%#L_*;vA1pEvdnZx9|!SOJosX!!(^*j#<^=_H#v&50i<8a7cG<|j1pgBT;@5N zHw*bt#mAOexD5k_dxW%8@jSn#G0U5BezZ*vxkw0d;MssEd8dHL(uyakE7BTx+Qa1>mFC}%S)z3oi!O1ht@nBUcwx1lK(E2<6fQ0b-(|!_ z_sK!hHy_L-02n>4bROG?oO8$^EXmqT_&d+3|IZ{`aixZcbCst9SdtkZG~F@hLc`v< zE5qK&tMdwTzcu8Abq?620Z%!ycDn3sRZf$&Sx)R>C32cX_1z?2;W^np=NC>=pAL0h z@e}n+C`&C^+0Z)pw7apX{WjQ2XMudSn$Sen%H?P6|K%g_%zx^8{Z3yk{ zCHk*#09<=pjN~9t7!t>H8E4>TwSr_am>loxgTlwbB`Fk<=RPQ@-HyeI=SyrKAZP~S z7m}y)a{@@vH#_Ex0?o$>>cbX^5V{k!h}88xDJhnh?MLCU2j$1%Y58$dvH9uTCR2Vq zo@}9gGCY!17QfKOU@j>!athhPZh&EeaxIVeW%%^uB7>es4E-V$bAL^a-(T}C*3L@E z-YsHev!ODF*mM`J#}ETqRP{N8pmtj^&r>qriHQaD>`4?P?xY2-l{;{;0&%x?oh(rR z(FsvIkF+^lfn?rdkU7Y{7Z7QI`o5;za2V$(l~CXevc*n)>8(hofr2u2pCicbE0$Wu z723(fb0pBQOiMKJ9$IQaJ-)l#%;WNkX@4@$ zZfz-h7kTB-4N8Ma#d6a^Y`be7v0*{(REDUdWV~EAT1$zYVi^`PX#f0d~E1GKP-@8YQhSvU;*;r z>A1M3lL!K=ePtm>q+VQZ$R(>UrF;(88A-zYcyxZP7`ejAEzIzxpw254#K^~1q{FW< z71+gocOjmZ`!|hnHQzgSqN!%68*RAzV7z|Tv!)-($I(>EyHvZ0(lQiwXpfDqfSJvc+woB++|SCW-Dqd~-T)jMWsiT+inr%#O# zJAifqwF!_`%#%pyKG3RFj4gpN`MvNUKGxBLHZqu1pll=#FD^L1pZGXB0BODhm|>5C zr>jxd0Zicuj<*gQIZE{ZnP8j}PBeo!$T7R}BEgb)nc~es_*Q4Q7YLG?a){CQq1EN7 zo?<=m2dK<>$K&uMG^$5z;$vuHz+^ksjZ(8eiwr;uidtD?qM(NxnSf-hoMccCLX!0t z9Y&`}p=P8jJ+?HwI&qtRd0A%MuT& zU)w?#V;U20Vs?Ox;LUai5MtB+drLO>FYzFZQZv{ctaoJD7J!q|EzxPV#Ir|@klMs= zkJ7n)T`S}ElgSeM=(ycifB6XKYrU2f8K^m9Uj#w#%D#3KKilu;rj%FsR``oPrj#~Q zUhK2UtesZZIc|V!1*%@8e}(assq>9<|K(8IZ6k%{c)UOiY!v;i(M}LswYiQ&|071; z0eBvrI>BE&DJ?TaQ_6$5WrOOdjnIdVr|5pC{_NvD8KJwUjW^Hnpom37{iUZ3WU5|! zmd}YiTpQV{zhH_|)t{kDXV!NlkF^D<kBr=<9L2^;B*H56mrh52=}hQvo|(Un=fUxG zbdD_%!p*Wa$APEB{Ia%~TPXa%8J+r=mnl%E$&Vf%k*&1w)C(c46qNT<9&w}444VK+ z%+rP$<~b17P^Cxju5(;0BnYfQ-D(%3gUA5eW0;Zt;konh2+$Ug+h?MulAvh6g2VvUq~9j>x%vfd(XJJI0pj~SRJtvAM38_EV>I-NKz1c>=YcK*LGBHvI1;E^+BW;{B z8wk4papXww1VT?n@wRc8Pm;e8BZ`fJA^5AE@QTVM){xlTgI*=Odc?kpOj-|nDSy-O zN6r^4tWB=Y|D7Bgc6n+C+8OrRxRt)dII;B5K|VKPZLzUkmbCZ^ZNz6wf-GR6V>XGM zuBoIOF8%p_q4#quWq70nMh{8735*sE=tYK2jG~2vj8;Zl*Vgm4=3SiG!}bG4 z>1otD8O@;!E@+e&M?1vF=9pb4WLh_~D`|5_{n4?CES@Nlz7(X5NsRmg#XswQF?~g$QKwIdXzJ^+>!k4G63SAE1{Gv^zLXiBJs?+%kp z?F3lA>fs}6eLR!nJa~@Dag_AnesdW&fHO97u37%2IDpAVPt5Aln()nWKH*<`%= zmLn^iZttAS2w7hr*S#~8uz?;cyy$OyU}au=!m&ruOwdUZ%nS^dNU=9Tf>vv?a{9cAT2i=Dr~3n zXV}aDju5S4BW&iC-Q0Z>10Xv~ojx&gm(^k#=}$SfC!H(rkbZ_AFdf6#;pHaNa^UY` z9;Jd)gg-;v7=>Ich=vgIPk`jmKCy>#GnEM9Lskl^JK*U+a|or$NuFow4~3vLyk~m< zM@)5>i0XENU{@&iYv^V(rh3KU-M$Aw$H)<-g~w_{&DC+b3Vr6;uTOqq`r~#Nr3@?h(%q>O-hNbM91};vxc&!D z7%Y4$AA$+~V1=(){M^4*ty*@Q%le_NP`J_#ok;kQBh0 zUik(L|CcH5k3b^3dv^wry&=I{jHSjA0cuKlrm z2M3SOcK~bQQ<5%~n|L0iW$k1{xR*kmH;kc^@k);2j6~CB9z9=-8Bg&r@x2(2&vcTb z&W!uw9o9pw>UNvjZja3<6!e|Y0{fXf(PUbU-B&_}R-QnZ1bB2FO6)&+DYPNhmliIw zg<3gVVZLS;;JN^=pa)|kM~B3*Fp;H>U@SD;f(gWn z4#?hykT`CaY`X$Dk^bx`%mb;*w$cJmn|x@tBUE&cleQs0hS$ifqClTJf^epPjF45s zctYNN#5BdFnA@H&qdQZ5;=Rx?d0f8xO#1%6;WtHy9aqJX`*K}oB7qa|yJ0jkG8_a9 z+uH;<9y1N_JJiJQ-$(U%A9e$dZ3;Qg_l!Onj(NTakn!fbDF1e-Xcy>sC_i325yNwb zT^00xMkr;V>xZtf$VEreNFISmzVaFq$u0xQ!f{A;=>xCkNdEQc6Oepi8p(H<=bC>G zzh-`#t1v(PPHZ|hzeN9L6g^bwKa}7Dtw=plV&tlcLp4+1KUuz-zW$WnJoY?m&Dke& zkEH2g4IXaO|K#oKarr=2yIpiifh?AG%MCmG2SIFc=ySa3q~Xfl7=l~k=?t3r8OSkX zJ{0hCT7LIX^MP_=N;Om6h5Pgg*dKge1>E}1tMU0gcOBVl^@^);O3vqKl_-d3r@q>2 z8md9y>*KOR(}cQ1P_pztdix|mHuJSil1R6cCI&p;8wpzu;=%vp1120iU_xEwvV?z; zT%68#t(CfrC_(X|$7!oAEd+8HuMKM#>nB_FYu`;#zSpJ)KE=AoJkIN5?||ysNJ^TZ zAHo^+-s75^z(aYujz3#Uxt7;b>f%WTcmh*AWuNKj^)o$uJ07x6NB(g7*D4C6_s~ns zL*t~PPlF&)rsO3@dU7yD=8P2Pbfl=GZMb3X)U6{B!P_Xl$m%GNo)!{_iyVMc&zFY1XV|yb#ui*)A*6hRbfPT;u4n%iZB}Bv&l(ig zk%7~@Wo{d>Sn@sbS|h2JzWFM|&#e~3&q9a39)Gq3jC(fty%$DSeQploXy~&ZjF7#9 z+|73--7SHhe|80_$CE}F8gQwDAAQcpL zH~A*oYfgT@%$mUly#`V0`$R9hBAo;L-eyZF%x6H3&9ei+4n~5d*d}duzW(*S7;sep zSkB||P9NNh>8%&$``Hd&@b1011!PR#$p|r#b) zvHeu@^b?0`5iq>rZ$CAJTV+FtCO;kI_l%;{QQ_4*Pj9F0Q&G%?rPV;EIM4=Jpu8Zd zTLtC9GS=Y1;2Kgwjc6bJ&)pnswCt04pOVfYHIQ|wq`1c{DdY!FqI_kEkx&!`8%V6s8*iw*v9D*GKCM^%-%8;RK$i`p4@t5M(_4h{dd|+2Cw;E*e zf3ts~rvvZ1xW&okNQAdQjDBq%o*+GqlEmXpSWO{z&>YvdKtX8lAPV||Vwt~|+1l`S zG-3H)S z+>QsE#d zut(;Rk>qWCj~k^}5;@O@8RrO99q2BnF41D-oHsxC561ar z$+M+44i0&@&0Qw5L1u!BCp3EKV)W;Q4912))N3JJFgv6f8GfS}`JwCYd}9YzOP{(+vKqHP?Sn14V&6tO@v6{EkR z1PcKtu2Jj(kLhbOD<$#i2112C7q+j}ml3z%++OcCa8byI&zh03l_0D01@U|iiTmtp z7p@HUH zN`)}gi2n&L=|)4%oKpE3G>C~0p~Y8PMX3T~b=k;9ikix*J3`)F;=|}ZUYSK-W#d=e zr~=}Jc`r;S50I-_Bv?YRX}~`=U{K9v#&tLOFwipeL^Pw1T$0(oP*J-~#E+>fFcHy6 z_od>~aU4csSema;u@YR4i#2g}@A@ZqBnBT6Nqt__(|e-DnS6O#U73&_icQbr1EtGO z%=Q+zg-eO)hhIs2kd8wRYNv-{%kZ`n12?g!oGJ32oK699o2qZ34b@GJ3x6O@F@!^A}$RS3ibQ{EMqaY@_X9yiDDMQ@gB!4mRpU}lqae(rTbGuBpNbDT1OlnA zCgqf4_8Ok=5N3NU8O^j(ejNWPN;L{={3t!x#Rvv_A;d2j;ZzRw2*}$~mNJxVeCC~Z z>NYy9<>Em@F}pQH#}-JDA^*;Nhb8=>x&xH>hC*LW4@&Z~+P*=~>Y!=1yK5Gru(JeCV7>|YV4AY1W!XWIS*!`(cYzAJLvH?UfuAFeM zmwq+LuF4!b*-ds84p)2>As}(&xbyU-PR-}Mz_QO`xdxA$D*dmqRAE@fz8<5u{KWPQ zy&X&P5})*B$k`5Pd_dxJ+D|x-q^NJhla5xNza0iDxCc#VKa#JG$oq@?2+yw_oqly6yCRR;K3E-yK} zoVd}Mm}(60{ID|%)u0Gj0(rXD)mWk?1SADmh=pS0x-6W;Z}6CRhT8Q{C|xs@Uoxg| za-(F>kj@)xhzPI&6aaT=7Rs9?p^^uH?L4#gCv$$J_Fh|W?LlVkzs@m7w}*C!jk?Vk z-4~cy$zU>=ERL8=7d_Z9UMjK_Xaxo3=ou7UT;NQ9UcZKv_hJFwzOn<-AMc=#3?+fYsO)h@$lQM=a@4|4?*byVx zHa(ZHb`wF8Ly;R5B)&RoFboB_E~e#cn7oJ?6a?K_GQ7Ax3k%oZP6dnIYRG58&GBD{f;4R z4xTm%iT+M=9TX-;K{X6qG3cnv_!@W4#91_`xy8nQm&m4^QFC49@AU-z+(HVxU4sFw zdiy!O!Po-`tF&`*u#HWLmay390Sd_ z<|52Dkdc(oY&XzM_h)gi*bOMibz{@85?lD{HY^<>E)BNw3=wLaRzEJbL^rK~ACoXT z0pDfX94EgKR9$4Zf%pnNtUa$|R$IhK4U}@MPB6^4`Dv_5+MFr+X_YuDb1H+e z#fBl*R*A?pS;bvD_$XAI;;ZmJD|Jz!ou5sPUes;OB*sw>%IG$ix-I3Cxi~$U{Im_t zVe$zQ_{8Xg>7Z3PW<<~%K1FFYGE_r%M2>Q}jCBEDQQMs(1&QAr56ivm%noBCFh!l9 zx_twQ7{Mh?9h8HzhHjz=;jO1ilGDLG$8eZ?WZPTR88-@qgiievPSmyIkMV^$&?!dq z9I*4&BX%wsY*_6Z#mH^Q;$!m$1m6t?0)g8-mzQw&4iJR3UXBeH4qGg~&K3cO4ht_A z7M={N?pA3zn!K8QIYNk4I+}gX%N6@e((B_W)m`?qze=iZ^|OYCgjMQ{TiJ$#e^vU6 z@0>b~i4-p;)wBzWL#!Wms;_pK2xM~;^tHXqVp(x3*IW<2WUkNe`A`;9TCzTZ*Ya#G ztUHNmccnRYrWlurQ+?zvP6!(TEs0BsJl~=n&oHMvXOR0lD6vjQJ`u+)7P#|)e?T8- zRXMZ?IY~k}%+2S8rpU{;4B9X1_u#wUU6Z?o^}&gTF1{cTL{QoF4|ny|)SY_8*{IS@ zbcc98K1||=Hn@4xyIHjH&{i>(hl;~C|CMnpW}>?|z&=CidU}xUP2j;ZVEi?sK-FCf zyxxkB66i(&Ar35Hd~E3X;eq(SJmNKiQhewJ91qvj#fK>M+mfSPUEd`1s_QCO*S80& zJ7ljeK755>#?s*)$C;L&D78GE6>C=rb1Ukcb1{;l6+)H?vUA(asY^T?L2b>SA-VN3*053&9nDWM=VaBRmQgCnUm_ZvKK#m$S&Yg+a2T~;jRg>VTquYE!O*l*hH&! z$q}U3MH`D6S!-;1j~cgOW@g_Ry(}H`P^e8=lJ_evScH7F)2#+)6F>@DIEyDLdS*oy zpYAf22(k}hX_v7b5-hja&=x;ii`j{;jg7pFVhhF!s1t-3-BDa_)vL}l&QhsOq-}*L zcpN}1i_OTgj)~c?@O#@AyjR9P46={>>^nmuzSqW=Qn6tJI-;kHbTe0z3Id}n7t}^; z0&T;w2eVLYB=-_IS$*UHY(SI0Bay39c!*XnJDt1&cy`wG;PPxFAhk=)*%earSRo|U zPPW1WY-rU@@Yil39M74_&4ChKvvIhrx}%J>P;l?p$?OmVRsAzEFvIXi$+5wWvUWu; z3j78NZY`kD%#e46yC4{wBycqNO*AaXvCe%_KHF|-||aNXIhl=@B}<- zM)H|AUK^?7(LVh$7#%h}bM8*MPI`fR9!aieoNnec5n2EL00V#dKbaC%)i)p*zD(K+ zUsEu>=DxfK_|X}(wvaU&E9=i3|LpC9(AF*gA?XQCV3_>~FK>o;#vPESLSt)4(RwkThgEzDcpDI0AxXjV+lwzR?%jf4z#Bsj z;zrB2UjPzz;Ok)r9<}27^ad;=-tUA>xEQz1&G60T2XS1D{~DFvM_>P%59fX0MTyH1 z0u(E_T~hx=ey>D8-oV(rfx(qG+yLNsyxv}LI-u!4@9!fK^aFS%0z3~(%O|D*DtAn4 z@i{#b$pjVuuQI_j=#4>dD;_pwg2YbbO=;3k``bDFCz?=}<4YIVNn-D@%*q+{p6~9{ z%CWw!Ebca=yo|&^Jd~{;4_-sNSIy{~m42igQCZDmVQhF`&0?!_`I?^M_VDL;dtPle z-r-m~7BA@3;l zZO)OJ#|a^^zSP=04%Xi|yQOxVmD*8Tvgqs-ZAEA_sczFh8A$Qg_7G3BiRX3N1$Cbw zF#(&91s+F|D5bll=9|GA=u@zHLp*qZ4nJJ2uOGyHa!&37VJ*B(20L8~CI0P=C-{LR z3?bp6+v0~^Zh+O>+U5HAeDtNzj}~%mY38Z0X%M1*A0mEk?hE>cI&zr~<_}4Uf*n}0<3%m)xjEL~nq#Sde_lfl> zKtwNA`l96Rfte^d5g+mJ`JCZTHtg^<^Q}45pBTZUZFPxjNE-B}{m(E$n0sfl--&bY z4YHE|_qpHf{O{%-rE@+@Ehm|%zYI)IROT$v0gwOg{uy<5rE$|tahfe0AJY+{gyNXB z2&SZRZ6-e6uNhsD<`>9nL&z`2S=FwrI`J_p9j6VSrDOQ%{Z4hIx&>ad*6haw_UGqqS z)~k}0C3QAi!{@;N_BX8XVkW!@i}2I&h5$b=UT3i=H%OY@O-A5n$-!jhZd<(G3J=x9 zPC>fK$D_=0OtA|3$N|RoYop^nlZ<;iw)ZDFDlr0u`OfB^@K_RGLa_x_D~>~cMy#Kh zm6iOhHc&lcHS&5s--AmzU`Hc1v%C2m*Y=p_M}7B063fdj?`rUwAAdkP#RYXn$Ga= z{aCy>63Dp*fteYBp*B!Dphz}f=cqiAYKyCubFQ#~o>aU5YINC6NO^$_OX|)(@ zs-hpx$RIh|X0W>Q)Jd?7^F{5#vQ+oLhn;%kbx4Yh&}g!;@BVr6`zA3#bl8<%FDFgn zO!t{9U)GGCn8wE^B#PjEY8O}U66@OwZ5+G6)^7Gs!H2bvNin4|TchQ6(-8Ld^q*Y?CsNb~nJ<@BkR zS8h~GGFY!}A>EIkCB%Pzs5aQWo5a}rJ=BvDknUO6x0}Hk-N@8U57fP

- https://github.com/probonopd/appimagetool + https://github.com/AppImage/AppImageKit AppImage appimagetool From 8645236a56263be44fe3fb7fc92600e7fcd94244 Mon Sep 17 00:00:00 2001 From: probonopd Date: Fri, 11 Jan 2019 16:43:03 +0000 Subject: [PATCH 390/544] Use git revision as the version when VERSION is not set and when -g is passed --- src/appimagetool.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index b1ff38c47..378fb8ea5 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1,6 +1,6 @@ /************************************************************************** * - * Copyright (c) 2004-18 Simon Peter + * Copyright (c) 2004-19 Simon Peter * * All Rights Reserved. * @@ -483,10 +483,6 @@ static GOptionEntry entries[] = int main (int argc, char *argv[]) { - /* Parse VERSION environment variable. - * We cannot use g_environ_getenv (g_get_environ() since it is too new for CentOS 6 */ - char* version_env; - version_env = getenv("VERSION"); /* Parse Travis CI environment variables. * https://docs.travis-ci.com/user/environment-variables/#Default-Environment-Variables @@ -556,6 +552,39 @@ main (int argc, char *argv[]) if (showVersionOnly) exit(0); + /* Parse VERSION environment variable. + * We cannot use g_environ_getenv (g_get_environ() since it is too new for CentOS 6 + * Also, if VERSION is not set and -g is called and if git is on the path, use + * git rev-parse --short HEAD + * TODO: Might also want to somehow make use of + * git rev-parse --abbrev-ref HEAD + * git log -1 --format=%ci */ + gchar *version_env; // In which cases do we need to malloc() here? + version_env = getenv("VERSION"); + if(guessupdateinformation){ + if(g_find_program_in_path ("git")) { + if (version_env == NULL) { + GError *error = NULL; + gchar *out = NULL; + GString *command_line = g_string_new("git"); + g_string_append_printf(command_line, " rev-parse --short HEAD"); + int ret = g_spawn_command_line_sync(command_line->str, &out, NULL, NULL, &error); + g_assert_no_error(error); + if (ret) { + version_env = g_strstrip(out); + } else { + g_print("Failed to run 'git rev-parse --short HEAD'"); + } + g_string_free(command_line, true); + if (version_env != NULL) { + g_print("NOTE: Using the output of 'git rev-parse --short HEAD' as the version:\n"); + g_print(" %s\n", version_env); + g_print(" Please set the $VERSION environment variable if this is not intended\n"); + } + } + } + } + if(!((0 == strcmp(sqfs_comp, "gzip")) || (0 ==strcmp(sqfs_comp, "xz")))) die("Only gzip (faster execution, larger files) and xz (slower execution, smaller files) compression is supported at the moment. Let us know if there are reasons for more, should be easy to add. You could help the project by doing some systematic size/performance measurements. Watch for size, execution speed, and zsync delta size."); /* Check for dependencies here. Better fail early if they are not present. */ From f7e3cb01d066128c902aa3992db85709a0bc8f8a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 12 Jan 2019 02:16:26 +0100 Subject: [PATCH 391/544] Fix #905 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d456816ec..f59d0763e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,7 +36,7 @@ after_success: - ls -lh build/out/* - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh # make sure only pushes to rewrite create a new release, otherwise pretend PR and upload to transfer.sh - - if [ "$TRAVIS_BRANCH" != "$TRAVIS_TAG" ] && [ "$TRAVIS_BRANCH" != "appimagetool/master" ]; then export TRAVIS_EVENT_TYPE=pull_request; fi + - if [ "$TRAVIS_BRANCH" != "$TRAVIS_TAG" ] && [ "$TRAVIS_BRANCH" != "master" ]; then export TRAVIS_EVENT_TYPE=pull_request; fi - bash ./upload.sh build/out/* notifications: From 990b7538e18fe2584790078e54cbba339595957d Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 13 Jan 2019 10:44:04 +0000 Subject: [PATCH 392/544] https://standards.freedesktop.org/desktop-entry-spec/1.0/ --- src/appimagetool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 378fb8ea5..6bf1f76b2 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -649,7 +649,7 @@ main (int argc, char *argv[]) if(g_find_program_in_path ("desktop-file-validate")) { if(validate_desktop_file(desktop_file) != 0){ fprintf(stderr, "ERROR: Desktop file contains errors. Please fix them. Please see\n"); - fprintf(stderr, " https://standards.freedesktop.org/desktop-entry-spec/latest/\n"); + fprintf(stderr, " https://standards.freedesktop.org/desktop-entry-spec/1.0/n"); die(" for more information."); } } From 15cf2c561185854e93f26c44b96047e2038f2773 Mon Sep 17 00:00:00 2001 From: probonopd Date: Thu, 17 Jan 2019 23:25:36 +0000 Subject: [PATCH 393/544] Not every executable is a binary --- src/appimagetool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 6bf1f76b2..feaeb4c80 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -398,7 +398,7 @@ void find_arch(const gchar *real_path, const gchar *pattern, bool* archs) { if (g_file_test(full_name, G_FILE_TEST_IS_SYMLINK)) { } else if (g_file_test(full_name, G_FILE_TEST_IS_DIR)) { find_arch(full_name, pattern, archs); - } else if (g_file_test(full_name, G_FILE_TEST_IS_EXECUTABLE) || g_pattern_match_simple(pattern, entry) ) { + } else if (g_file_test(g_pattern_match_simple(pattern, entry))) { guess_arch_of_file(full_name, archs); } } From ec95164dcede33d10a5a4118ef07d9bad59cbceb Mon Sep 17 00:00:00 2001 From: probonopd Date: Thu, 17 Jan 2019 23:40:45 +0000 Subject: [PATCH 394/544] if (g_pattern_match_simple(pattern, entry)) --- src/appimagetool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index feaeb4c80..836ff9716 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -398,7 +398,7 @@ void find_arch(const gchar *real_path, const gchar *pattern, bool* archs) { if (g_file_test(full_name, G_FILE_TEST_IS_SYMLINK)) { } else if (g_file_test(full_name, G_FILE_TEST_IS_DIR)) { find_arch(full_name, pattern, archs); - } else if (g_file_test(g_pattern_match_simple(pattern, entry))) { + } else if (g_pattern_match_simple(pattern, entry)) { guess_arch_of_file(full_name, archs); } } From 5b997e1200e6733bb4ed8a8c178c703407097502 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 18 Jan 2019 01:04:00 +0100 Subject: [PATCH 395/544] Revert "if (g_pattern_match_simple(pattern, entry))" This reverts commit ec95164dcede33d10a5a4118ef07d9bad59cbceb. --- src/appimagetool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 836ff9716..feaeb4c80 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -398,7 +398,7 @@ void find_arch(const gchar *real_path, const gchar *pattern, bool* archs) { if (g_file_test(full_name, G_FILE_TEST_IS_SYMLINK)) { } else if (g_file_test(full_name, G_FILE_TEST_IS_DIR)) { find_arch(full_name, pattern, archs); - } else if (g_pattern_match_simple(pattern, entry)) { + } else if (g_file_test(g_pattern_match_simple(pattern, entry))) { guess_arch_of_file(full_name, archs); } } From 5f155121506b15a4d432ebde9db24730b097a5b5 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 18 Jan 2019 01:04:02 +0100 Subject: [PATCH 396/544] Revert "Not every executable is a binary" This reverts commit 15cf2c561185854e93f26c44b96047e2038f2773. --- src/appimagetool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index feaeb4c80..6bf1f76b2 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -398,7 +398,7 @@ void find_arch(const gchar *real_path, const gchar *pattern, bool* archs) { if (g_file_test(full_name, G_FILE_TEST_IS_SYMLINK)) { } else if (g_file_test(full_name, G_FILE_TEST_IS_DIR)) { find_arch(full_name, pattern, archs); - } else if (g_file_test(g_pattern_match_simple(pattern, entry))) { + } else if (g_file_test(full_name, G_FILE_TEST_IS_EXECUTABLE) || g_pattern_match_simple(pattern, entry) ) { guess_arch_of_file(full_name, archs); } } From e8a1883ed937255cce80c4d8322a384396875085 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sat, 19 Jan 2019 11:46:26 +0000 Subject: [PATCH 397/544] Check for Categories=, closes #909 --- src/appimagetool.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/appimagetool.c b/src/appimagetool.c index 6bf1f76b2..8adf94447 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -658,6 +658,8 @@ main (int argc, char *argv[]) GKeyFile *kf = g_key_file_new (); if (!g_key_file_load_from_file (kf, desktop_file, G_KEY_FILE_KEEP_TRANSLATIONS | G_KEY_FILE_KEEP_COMMENTS, NULL)) die(".desktop file cannot be parsed"); + if (!get_desktop_entry(kf, "Categories")) + die(".desktop file is missing a Categories= key"); if(verbose){ fprintf (stderr,"Name: %s\n", get_desktop_entry(kf, "Name")); From cddcc2ec0823c4ff9124e23cd5b1977338d74159 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 22 Jan 2019 15:58:37 +0100 Subject: [PATCH 398/544] Update libappimage to latest version --- lib/libappimage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libappimage b/lib/libappimage index 5d032421a..13f401a4a 160000 --- a/lib/libappimage +++ b/lib/libappimage @@ -1 +1 @@ -Subproject commit 5d032421aef066e6e1c05b30a8006f0c84a02b71 +Subproject commit 13f401a4a384ec59ec9a144e2a7006adf751571f From a9f25977d22db3c69a377e40a1bfdeac35330c84 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 2 Feb 2019 00:44:23 +0100 Subject: [PATCH 399/544] Increase robustness of git commit version guessing Fixes #919. --- src/appimagetool.c | 48 +++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 8adf94447..33835b79b 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -79,7 +79,7 @@ static gboolean sign = FALSE; static gboolean no_appstream = FALSE; gchar **remaining_args = NULL; gchar *updateinformation = NULL; -static gboolean guessupdateinformation = FALSE; +static gboolean guess_update_information = FALSE; gchar *bintray_user = NULL; gchar *bintray_repo = NULL; gchar *sqfs_comp = "gzip"; @@ -464,7 +464,7 @@ static GOptionEntry entries[] = { { "list", 'l', 0, G_OPTION_ARG_NONE, &list, "List files in SOURCE AppImage", NULL }, { "updateinformation", 'u', 0, G_OPTION_ARG_STRING, &updateinformation, "Embed update information STRING; if zsyncmake is installed, generate zsync file", NULL }, - { "guess", 'g', 0, G_OPTION_ARG_NONE, &guessupdateinformation, "Guess update information based on Travis CI or GitLab environment variables", NULL }, + { "guess", 'g', 0, G_OPTION_ARG_NONE, &guess_update_information, "Guess update information based on Travis CI or GitLab environment variables", NULL }, { "bintray-user", 0, 0, G_OPTION_ARG_STRING, &bintray_user, "Bintray user name", NULL }, { "bintray-repo", 0, 0, G_OPTION_ARG_STRING, &bintray_repo, "Bintray repository", NULL }, { "version", 0, 0, G_OPTION_ARG_NONE, &showVersionOnly, "Show version number", NULL }, @@ -559,27 +559,31 @@ main (int argc, char *argv[]) * TODO: Might also want to somehow make use of * git rev-parse --abbrev-ref HEAD * git log -1 --format=%ci */ - gchar *version_env; // In which cases do we need to malloc() here? - version_env = getenv("VERSION"); - if(guessupdateinformation){ - if(g_find_program_in_path ("git")) { + gchar* version_env = getenv("VERSION"); + + if (guess_update_information){ + if (g_find_program_in_path("git")) { if (version_env == NULL) { - GError *error = NULL; - gchar *out = NULL; - GString *command_line = g_string_new("git"); - g_string_append_printf(command_line, " rev-parse --short HEAD"); - int ret = g_spawn_command_line_sync(command_line->str, &out, NULL, NULL, &error); - g_assert_no_error(error); - if (ret) { - version_env = g_strstrip(out); + GError* error = NULL; + gchar* out = NULL; + + char command_line[] = "git rev-parse --short HEAD"; + + int exitcode = -1; + int ret = g_spawn_command_line_sync(command_line, &out, NULL, &exitcode, &error); + + if (ret != 0 ||error != NULL) { + g_printerr("Failed to run 'git rev-parse --short HEAD': %s\n", error->message); + } else if (exitcode != 0) { + g_print("Failed to run 'git rev-parse --short HEAD': exited with code %d\n", exitcode); } else { - g_print("Failed to run 'git rev-parse --short HEAD'"); - } - g_string_free(command_line, true); - if (version_env != NULL) { - g_print("NOTE: Using the output of 'git rev-parse --short HEAD' as the version:\n"); - g_print(" %s\n", version_env); - g_print(" Please set the $VERSION environment variable if this is not intended\n"); + version_env = g_strstrip(out); + + if (version_env != NULL) { + g_print("NOTE: Using the output of 'git rev-parse --short HEAD' as the version:\n"); + g_print(" %s\n", version_env); + g_print(" Please set the $VERSION environment variable if this is not intended\n"); + } } } } @@ -857,7 +861,7 @@ main (int argc, char *argv[]) /* If the user has not provided update information but we know this is a Travis CI build, * then fill in update information based on TRAVIS_REPO_SLUG */ - if(guessupdateinformation){ + if(guess_update_information){ if(travis_repo_slug){ if(!github_token) { printf("Will not guess update information since $GITHUB_TOKEN is missing,\n"); From 05779fc6b72ffe31ccac8d1078dcabd34e441782 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 2 Feb 2019 01:23:07 +0100 Subject: [PATCH 400/544] Log to stderr --- src/appimagetool.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 33835b79b..8316d581a 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -575,14 +575,14 @@ main (int argc, char *argv[]) if (ret != 0 ||error != NULL) { g_printerr("Failed to run 'git rev-parse --short HEAD': %s\n", error->message); } else if (exitcode != 0) { - g_print("Failed to run 'git rev-parse --short HEAD': exited with code %d\n", exitcode); + g_printerr("Failed to run 'git rev-parse --short HEAD': exited with code %d\n", exitcode); } else { version_env = g_strstrip(out); if (version_env != NULL) { - g_print("NOTE: Using the output of 'git rev-parse --short HEAD' as the version:\n"); - g_print(" %s\n", version_env); - g_print(" Please set the $VERSION environment variable if this is not intended\n"); + g_printerr("NOTE: Using the output of 'git rev-parse --short HEAD' as the version:\n"); + g_printerr(" %s\n", version_env); + g_printerr(" Please set the $VERSION environment variable if this is not intended\n"); } } } From 26c77697ad1e55d9c5bf1068e962a8bc42c9147a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 2 Feb 2019 17:13:27 +0100 Subject: [PATCH 401/544] Use LTO to reduce binary size of runtime 240k -> 192k on my machine. --- src/build-runtime.cmake | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index 4a28d4a16..b33947170 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -22,7 +22,7 @@ else() endif() set(runtime_cflags - -std=c99 -ffunction-sections -fdata-sections + -std=c99 -ffunction-sections -fdata-sections -flto -DGIT_COMMIT=\\"${GIT_COMMIT}\\" -I${squashfuse_INCLUDE_DIRS} -I${PROJECT_SOURCE_DIR}/include @@ -30,7 +30,7 @@ set(runtime_cflags -I${PROJECT_SOURCE_DIR}/lib/libappimage/src/libappimage_hashlib/include ${DEPENDENCIES_CFLAGS} ) -set(runtime_ldflags -s -Wl,--gc-sections ${DEPENDENCIES_LDFLAGS}) +set(runtime_ldflags -s -Wl,--gc-sections -flto ${DEPENDENCIES_LDFLAGS}) if(BUILD_DEBUG) message(WARNING "Debug build, adding debug information") @@ -110,6 +110,7 @@ add_executable(runtime ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o notify.c) # CMake gets confused by the .o object, therefore we need to tell it that it shall link everything using the C compiler set_property(TARGET runtime PROPERTY LINKER_LANGUAGE C) target_link_libraries(runtime PRIVATE libsquashfuse dl xz libzlib pthread libappimage_shared libappimage_hashlib) +target_link_options(runtime PRIVATE ${runtime_ldflags}) target_include_directories(runtime PRIVATE ${PROJECT_SOURCE_DIR}/include) if(BUILD_DEBUG) From c161cae5ca75441fe7acada7ccc5aaa85b3c191d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 2 Feb 2019 17:59:53 +0100 Subject: [PATCH 402/544] Need a fallback for target_link_options due to too old CMake version --- src/build-runtime.cmake | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index b33947170..92a1d622c 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -110,7 +110,11 @@ add_executable(runtime ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o notify.c) # CMake gets confused by the .o object, therefore we need to tell it that it shall link everything using the C compiler set_property(TARGET runtime PROPERTY LINKER_LANGUAGE C) target_link_libraries(runtime PRIVATE libsquashfuse dl xz libzlib pthread libappimage_shared libappimage_hashlib) -target_link_options(runtime PRIVATE ${runtime_ldflags}) +if(COMMAND target_link_options) + target_link_options(runtime PRIVATE ${runtime_ldflags}) +else() + set_property(TARGET runtime PROPERTY LINK_FLAGS ${runtime_ldflags}) +endif() target_include_directories(runtime PRIVATE ${PROJECT_SOURCE_DIR}/include) if(BUILD_DEBUG) From c99b1dff690f28cd2a74f4170df8d6a7e2e9ad0c Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 2 Feb 2019 19:28:43 +0100 Subject: [PATCH 403/544] Fallback mk. 2 --- src/build-runtime.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index 92a1d622c..6cb42ee01 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -113,7 +113,8 @@ target_link_libraries(runtime PRIVATE libsquashfuse dl xz libzlib pthread libapp if(COMMAND target_link_options) target_link_options(runtime PRIVATE ${runtime_ldflags}) else() - set_property(TARGET runtime PROPERTY LINK_FLAGS ${runtime_ldflags}) + message(WARNING "CMake version < 3.13, falling back to using target_link_libraries instead of target_link_options") + target_link_libraries(runtime PRIVATE ${runtime_ldflags}) endif() target_include_directories(runtime PRIVATE ${PROJECT_SOURCE_DIR}/include) From 9eb3d2e8139b1c83c84aa1c07c1cd8388020fddb Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 2 Feb 2019 21:14:53 +0100 Subject: [PATCH 404/544] Fix LTO implementation --- src/build-runtime.cmake | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index 6cb42ee01..1b59dd875 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -21,8 +21,9 @@ else() get_target_property(squashfuse_INCLUDE_DIRS libsquashfuse INTERFACE_INCLUDE_DIRECTORIES) endif() +# must not include -flto in the following flags, otherwise the data sections will be stripped out set(runtime_cflags - -std=c99 -ffunction-sections -fdata-sections -flto + -std=c99 -ffunction-sections -fdata-sections -DGIT_COMMIT=\\"${GIT_COMMIT}\\" -I${squashfuse_INCLUDE_DIRS} -I${PROJECT_SOURCE_DIR}/include @@ -30,7 +31,8 @@ set(runtime_cflags -I${PROJECT_SOURCE_DIR}/lib/libappimage/src/libappimage_hashlib/include ${DEPENDENCIES_CFLAGS} ) -set(runtime_ldflags -s -Wl,--gc-sections -flto ${DEPENDENCIES_LDFLAGS}) +# must not include -Wl,--gc-sections in the following flags, otherwise the data sections will be stripped out +set(runtime_ldflags -s -ffunction-sections -fdata-sections -flto ${DEPENDENCIES_LDFLAGS}) if(BUILD_DEBUG) message(WARNING "Debug build, adding debug information") From 9b8242cddaf185f0988d1832466ad17a42b6c6d8 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sun, 10 Feb 2019 07:52:28 +0100 Subject: [PATCH 405/544] Print all log messages on stderr That's a lot more straightforward to users, as other tools do the same. "Special messages" like the mount dir (on --appimage-mount) etc. are still printed to stdout for easier piping and being able to differentiate between log/error messages and values the users might want to use for automation. CC #923. --- src/runtime.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 3070a770d..92b07f25e 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -215,7 +215,7 @@ void print_help(const char *appimage_path) { // TODO: "--appimage-list List content from embedded filesystem image\n" - printf( + fprintf(stderr, "AppImage options:\n\n" " --appimage-extract [] Extract content from embedded filesystem image\n" " If pattern is passed, only extract matching files\n" @@ -259,16 +259,16 @@ portable_option(const char *arg, const char *appimage_path, const char *name) ssize_t length = readlink(appimage_path, fullpath, sizeof(fullpath)); if (length < 0) { - printf("Error getting realpath for %s\n", appimage_path); + fprintf(stderr, "Error getting realpath for %s\n", appimage_path); exit(EXIT_FAILURE); } fullpath[length] = '\0'; sprintf(portable_dir, "%s.%s", fullpath, name); if (!mkdir(portable_dir, S_IRWXU)) - printf("Portable %s directory created at %s\n", name, portable_dir); + fprintf(stderr, "Portable %s directory created at %s\n", name, portable_dir); else - printf("Error creating portable %s directory at %s: %s\n", name, portable_dir, strerror(errno)); + fprintf(stderr, "Error creating portable %s directory at %s: %s\n", name, portable_dir, strerror(errno)); exit(0); } @@ -563,7 +563,7 @@ int main(int argc, char *argv[]) { // error check if (fs_offset < 0) { - printf("Failed to get fs offset for %s\n", appimage_path); + fprintf(stderr, "Failed to get fs offset for %s\n", appimage_path); exit(EXIT_EXECERROR); } @@ -575,7 +575,7 @@ int main(int argc, char *argv[]) { ssize_t length = readlink(appimage_path, fullpath, sizeof(fullpath)); if (length < 0) { - printf("Error getting realpath for %s\n", appimage_path); + fprintf(stderr, "Error getting realpath for %s\n", appimage_path); exit(EXIT_EXECERROR); } fullpath[length] = '\0'; @@ -737,8 +737,8 @@ int main(int argc, char *argv[]) { unsigned long offset = 0; unsigned long length = 0; appimage_get_elf_section_offset_and_length(appimage_path, ".upd_info", &offset, &length); - // printf("offset: %lu\n", offset); - // printf("length: %lu\n", length); + // fprintf(stderr, "offset: %lu\n", offset); + // fprintf(stderr, "length: %lu\n", length); // print_hex(appimage_path, offset, length); appimage_print_binary(appimage_path, offset, length); exit(0); @@ -748,8 +748,8 @@ int main(int argc, char *argv[]) { unsigned long offset = 0; unsigned long length = 0; appimage_get_elf_section_offset_and_length(appimage_path, ".sha256_sig", &offset, &length); - // printf("offset: %lu\n", offset); - // printf("length: %lu\n", length); + // fprintf(stderr, "offset: %lu\n", offset); + // fprintf(stderr, "length: %lu\n", length); // print_hex(appimage_path, offset, length); appimage_print_binary(appimage_path, offset, length); exit(0); @@ -889,7 +889,7 @@ int main(int argc, char *argv[]) { strcpy (portable_home_dir, fullpath); strcat (portable_home_dir, ".home"); if(is_writable_directory(portable_home_dir)){ - printf("Setting $HOME to %s\n", portable_home_dir); + fprintf(stderr, "Setting $HOME to %s\n", portable_home_dir); setenv("HOME",portable_home_dir,1); } @@ -897,7 +897,7 @@ int main(int argc, char *argv[]) { strcpy (portable_config_dir, fullpath); strcat (portable_config_dir, ".config"); if(is_writable_directory(portable_config_dir)){ - printf("Setting $XDG_CONFIG_HOME to %s\n", portable_config_dir); + fprintf(stderr, "Setting $XDG_CONFIG_HOME to %s\n", portable_config_dir); setenv("XDG_CONFIG_HOME",portable_config_dir,1); } From e03f1fa9ed6dcb6fc789bc0a7a2854664e6d2f0f Mon Sep 17 00:00:00 2001 From: rkfg Date: Fri, 22 Feb 2019 17:03:44 +0300 Subject: [PATCH 406/544] Only mount tmpfs to /tmp if it's not mounted yet This is a logical error that renders the script non-working on Debian for instance. If grep returns true (i.e. /tmp is already mounted as tmpfs) lazy evaluation should skip the right part. If it returns false then we should mount /tmp. With && the logic is exactly the opposite. How was it working before? --- testappimage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testappimage b/testappimage index b47ca39cd..8bfd96e74 100644 --- a/testappimage +++ b/testappimage @@ -35,7 +35,7 @@ mkdir -p /tmp/$PREF/iso mkdir -p /tmp/$PREF/workdir # openSUSE LEAP 42.2 does not have a tmpfs in /tmp but we need this -mount | grep "/tmp type tmpfs" && sudo mount -t tmpfs tmpfs /tmp/ +mount | grep "/tmp type tmpfs" || sudo mount -t tmpfs tmpfs /tmp/ # If ISO was specified, then mount it and find contained filesystem THEFS="$1" From c8eae94742a4eb11fa4f8fa7c9f262fab7927cc6 Mon Sep 17 00:00:00 2001 From: rkfg Date: Fri, 22 Feb 2019 22:45:51 +0300 Subject: [PATCH 407/544] Don't show grep output --- testappimage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testappimage b/testappimage index 8bfd96e74..958bae546 100644 --- a/testappimage +++ b/testappimage @@ -35,7 +35,7 @@ mkdir -p /tmp/$PREF/iso mkdir -p /tmp/$PREF/workdir # openSUSE LEAP 42.2 does not have a tmpfs in /tmp but we need this -mount | grep "/tmp type tmpfs" || sudo mount -t tmpfs tmpfs /tmp/ +mount | grep -q "/tmp type tmpfs" || sudo mount -t tmpfs tmpfs /tmp/ # If ISO was specified, then mount it and find contained filesystem THEFS="$1" From ece4bb505d0ac07b9d013d88fce7e18bed729a0c Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 17 Mar 2019 11:09:42 +0100 Subject: [PATCH 408/544] Revert a9f2597 Revert a9f2597 to see if this has an impact on #934 --- src/appimagetool.c | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 8316d581a..d0854c959 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -79,7 +79,7 @@ static gboolean sign = FALSE; static gboolean no_appstream = FALSE; gchar **remaining_args = NULL; gchar *updateinformation = NULL; -static gboolean guess_update_information = FALSE; +static gboolean guessupdateinformation = FALSE; gchar *bintray_user = NULL; gchar *bintray_repo = NULL; gchar *sqfs_comp = "gzip"; @@ -464,7 +464,7 @@ static GOptionEntry entries[] = { { "list", 'l', 0, G_OPTION_ARG_NONE, &list, "List files in SOURCE AppImage", NULL }, { "updateinformation", 'u', 0, G_OPTION_ARG_STRING, &updateinformation, "Embed update information STRING; if zsyncmake is installed, generate zsync file", NULL }, - { "guess", 'g', 0, G_OPTION_ARG_NONE, &guess_update_information, "Guess update information based on Travis CI or GitLab environment variables", NULL }, + { "guess", 'g', 0, G_OPTION_ARG_NONE, &guessupdateinformation, "Guess update information based on Travis CI or GitLab environment variables", NULL }, { "bintray-user", 0, 0, G_OPTION_ARG_STRING, &bintray_user, "Bintray user name", NULL }, { "bintray-repo", 0, 0, G_OPTION_ARG_STRING, &bintray_repo, "Bintray repository", NULL }, { "version", 0, 0, G_OPTION_ARG_NONE, &showVersionOnly, "Show version number", NULL }, @@ -559,11 +559,12 @@ main (int argc, char *argv[]) * TODO: Might also want to somehow make use of * git rev-parse --abbrev-ref HEAD * git log -1 --format=%ci */ - gchar* version_env = getenv("VERSION"); - - if (guess_update_information){ - if (g_find_program_in_path("git")) { + gchar *version_env; // In which cases do we need to malloc() here? + version_env = getenv("VERSION"); + if(guessupdateinformation){ + if(g_find_program_in_path ("git")) { if (version_env == NULL) { +<<<<<<< HEAD GError* error = NULL; gchar* out = NULL; @@ -584,6 +585,24 @@ main (int argc, char *argv[]) g_printerr(" %s\n", version_env); g_printerr(" Please set the $VERSION environment variable if this is not intended\n"); } +======= + GError *error = NULL; + gchar *out = NULL; + GString *command_line = g_string_new("git"); + g_string_append_printf(command_line, " rev-parse --short HEAD"); + int ret = g_spawn_command_line_sync(command_line->str, &out, NULL, NULL, &error); + g_assert_no_error(error); + if (ret) { + version_env = g_strstrip(out); + } else { + g_print("Failed to run 'git rev-parse --short HEAD'"); + } + g_string_free(command_line, true); + if (version_env != NULL) { + g_print("NOTE: Using the output of 'git rev-parse --short HEAD' as the version:\n"); + g_print(" %s\n", version_env); + g_print(" Please set the $VERSION environment variable if this is not intended\n"); +>>>>>>> parent of a9f2597... Increase robustness of git commit version guessing } } } @@ -861,7 +880,7 @@ main (int argc, char *argv[]) /* If the user has not provided update information but we know this is a Travis CI build, * then fill in update information based on TRAVIS_REPO_SLUG */ - if(guess_update_information){ + if(guessupdateinformation){ if(travis_repo_slug){ if(!github_token) { printf("Will not guess update information since $GITHUB_TOKEN is missing,\n"); From e2737b8b689110bd830d474a87b29a64ed768ade Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 17 Mar 2019 13:08:58 +0100 Subject: [PATCH 409/544] Revert a9f2597 (cont'd) https://github.com/AppImage/AppImageKit/issues/934#issuecomment-473657996 --- src/appimagetool.c | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index d0854c959..1f1f0edc7 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -564,7 +564,6 @@ main (int argc, char *argv[]) if(guessupdateinformation){ if(g_find_program_in_path ("git")) { if (version_env == NULL) { -<<<<<<< HEAD GError* error = NULL; gchar* out = NULL; @@ -585,24 +584,6 @@ main (int argc, char *argv[]) g_printerr(" %s\n", version_env); g_printerr(" Please set the $VERSION environment variable if this is not intended\n"); } -======= - GError *error = NULL; - gchar *out = NULL; - GString *command_line = g_string_new("git"); - g_string_append_printf(command_line, " rev-parse --short HEAD"); - int ret = g_spawn_command_line_sync(command_line->str, &out, NULL, NULL, &error); - g_assert_no_error(error); - if (ret) { - version_env = g_strstrip(out); - } else { - g_print("Failed to run 'git rev-parse --short HEAD'"); - } - g_string_free(command_line, true); - if (version_env != NULL) { - g_print("NOTE: Using the output of 'git rev-parse --short HEAD' as the version:\n"); - g_print(" %s\n", version_env); - g_print(" Please set the $VERSION environment variable if this is not intended\n"); ->>>>>>> parent of a9f2597... Increase robustness of git commit version guessing } } } From d7ef8e81078bee1860c935382efa523dd60cc577 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 19 Mar 2019 10:13:12 +0100 Subject: [PATCH 410/544] Revert "Revert a9f2597 (cont'd)" This reverts commit e2737b8b689110bd830d474a87b29a64ed768ade. --- src/appimagetool.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/appimagetool.c b/src/appimagetool.c index 1f1f0edc7..d0854c959 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -564,6 +564,7 @@ main (int argc, char *argv[]) if(guessupdateinformation){ if(g_find_program_in_path ("git")) { if (version_env == NULL) { +<<<<<<< HEAD GError* error = NULL; gchar* out = NULL; @@ -584,6 +585,24 @@ main (int argc, char *argv[]) g_printerr(" %s\n", version_env); g_printerr(" Please set the $VERSION environment variable if this is not intended\n"); } +======= + GError *error = NULL; + gchar *out = NULL; + GString *command_line = g_string_new("git"); + g_string_append_printf(command_line, " rev-parse --short HEAD"); + int ret = g_spawn_command_line_sync(command_line->str, &out, NULL, NULL, &error); + g_assert_no_error(error); + if (ret) { + version_env = g_strstrip(out); + } else { + g_print("Failed to run 'git rev-parse --short HEAD'"); + } + g_string_free(command_line, true); + if (version_env != NULL) { + g_print("NOTE: Using the output of 'git rev-parse --short HEAD' as the version:\n"); + g_print(" %s\n", version_env); + g_print(" Please set the $VERSION environment variable if this is not intended\n"); +>>>>>>> parent of a9f2597... Increase robustness of git commit version guessing } } } From b9db2de516082aac507c94c51444443a9b8f149e Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 19 Mar 2019 10:13:15 +0100 Subject: [PATCH 411/544] Revert "Revert a9f2597" This reverts commit ece4bb505d0ac07b9d013d88fce7e18bed729a0c. --- src/appimagetool.c | 33 +++++++-------------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index d0854c959..8316d581a 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -79,7 +79,7 @@ static gboolean sign = FALSE; static gboolean no_appstream = FALSE; gchar **remaining_args = NULL; gchar *updateinformation = NULL; -static gboolean guessupdateinformation = FALSE; +static gboolean guess_update_information = FALSE; gchar *bintray_user = NULL; gchar *bintray_repo = NULL; gchar *sqfs_comp = "gzip"; @@ -464,7 +464,7 @@ static GOptionEntry entries[] = { { "list", 'l', 0, G_OPTION_ARG_NONE, &list, "List files in SOURCE AppImage", NULL }, { "updateinformation", 'u', 0, G_OPTION_ARG_STRING, &updateinformation, "Embed update information STRING; if zsyncmake is installed, generate zsync file", NULL }, - { "guess", 'g', 0, G_OPTION_ARG_NONE, &guessupdateinformation, "Guess update information based on Travis CI or GitLab environment variables", NULL }, + { "guess", 'g', 0, G_OPTION_ARG_NONE, &guess_update_information, "Guess update information based on Travis CI or GitLab environment variables", NULL }, { "bintray-user", 0, 0, G_OPTION_ARG_STRING, &bintray_user, "Bintray user name", NULL }, { "bintray-repo", 0, 0, G_OPTION_ARG_STRING, &bintray_repo, "Bintray repository", NULL }, { "version", 0, 0, G_OPTION_ARG_NONE, &showVersionOnly, "Show version number", NULL }, @@ -559,12 +559,11 @@ main (int argc, char *argv[]) * TODO: Might also want to somehow make use of * git rev-parse --abbrev-ref HEAD * git log -1 --format=%ci */ - gchar *version_env; // In which cases do we need to malloc() here? - version_env = getenv("VERSION"); - if(guessupdateinformation){ - if(g_find_program_in_path ("git")) { + gchar* version_env = getenv("VERSION"); + + if (guess_update_information){ + if (g_find_program_in_path("git")) { if (version_env == NULL) { -<<<<<<< HEAD GError* error = NULL; gchar* out = NULL; @@ -585,24 +584,6 @@ main (int argc, char *argv[]) g_printerr(" %s\n", version_env); g_printerr(" Please set the $VERSION environment variable if this is not intended\n"); } -======= - GError *error = NULL; - gchar *out = NULL; - GString *command_line = g_string_new("git"); - g_string_append_printf(command_line, " rev-parse --short HEAD"); - int ret = g_spawn_command_line_sync(command_line->str, &out, NULL, NULL, &error); - g_assert_no_error(error); - if (ret) { - version_env = g_strstrip(out); - } else { - g_print("Failed to run 'git rev-parse --short HEAD'"); - } - g_string_free(command_line, true); - if (version_env != NULL) { - g_print("NOTE: Using the output of 'git rev-parse --short HEAD' as the version:\n"); - g_print(" %s\n", version_env); - g_print(" Please set the $VERSION environment variable if this is not intended\n"); ->>>>>>> parent of a9f2597... Increase robustness of git commit version guessing } } } @@ -880,7 +861,7 @@ main (int argc, char *argv[]) /* If the user has not provided update information but we know this is a Travis CI build, * then fill in update information based on TRAVIS_REPO_SLUG */ - if(guessupdateinformation){ + if(guess_update_information){ if(travis_repo_slug){ if(!github_token) { printf("Will not guess update information since $GITHUB_TOKEN is missing,\n"); From 003f34d8f213d2043d54f3a54fd6954d32533f49 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 19 Mar 2019 11:01:09 +0100 Subject: [PATCH 412/544] Fix segfaults related to git subprocess Developed following the GLib docs instead of making guesses on how it works based on other code. Might have to rework other code in the file as well to make it work properly. --- src/appimagetool.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 8316d581a..2c53f9dd2 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -561,21 +561,33 @@ main (int argc, char *argv[]) * git log -1 --format=%ci */ gchar* version_env = getenv("VERSION"); - if (guess_update_information){ + if (guess_update_information) { if (g_find_program_in_path("git")) { if (version_env == NULL) { GError* error = NULL; - gchar* out = NULL; + gchar* out = NULL; char command_line[] = "git rev-parse --short HEAD"; - int exitcode = -1; - int ret = g_spawn_command_line_sync(command_line, &out, NULL, &exitcode, &error); - - if (ret != 0 ||error != NULL) { - g_printerr("Failed to run 'git rev-parse --short HEAD': %s\n", error->message); - } else if (exitcode != 0) { - g_printerr("Failed to run 'git rev-parse --short HEAD': exited with code %d\n", exitcode); + // *not* the exit code! must be interpreted via g_spawn_check_exit_status! + int exit_status = -1; + + // g_spawn_command_line_sync returns whether the program succeeded + gint ret = g_spawn_command_line_sync(command_line, &out, NULL, &exit_status, &error); + + if (ret != 0 || error != NULL) { + // g_spawn_command_line_sync might have set error already, in that case we don't want to overwrite + if (error == NULL) { + // to get a proper error message, we now fetch the message via the returned exit code + // the call returns false if the call failed, and this is what we expect to have happened + // hence we can assume that there must be an error in GLib if it returned true + if (g_spawn_check_exit_status(exit_status, &error)) { + g_printerr("Error: GLib is being inconsistent"); + exit(1); + } + } + g_printerr("Failed to run 'git rev-parse --short HEAD: %s (code %d)\n", error->message, + error->code); } else { version_env = g_strstrip(out); From cc005ee2d05b5c186e15d31ba101ab7aea21a818 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 19 Mar 2019 21:11:30 +0100 Subject: [PATCH 413/544] Temporarily disable extended checks to see why it fails on Travis --- src/appimagetool.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 2c53f9dd2..a077e42aa 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -581,13 +581,9 @@ main (int argc, char *argv[]) // to get a proper error message, we now fetch the message via the returned exit code // the call returns false if the call failed, and this is what we expect to have happened // hence we can assume that there must be an error in GLib if it returned true - if (g_spawn_check_exit_status(exit_status, &error)) { - g_printerr("Error: GLib is being inconsistent"); - exit(1); - } + g_spawn_check_exit_status(exit_status, &error); } - g_printerr("Failed to run 'git rev-parse --short HEAD: %s (code %d)\n", error->message, - error->code); + g_printerr("Failed to run 'git rev-parse --short HEAD: %s (code %d)\n", error->message, error->code); } else { version_env = g_strstrip(out); From c5da068372580133749ef3f03fc29a33f375fdd0 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 22 Mar 2019 01:20:48 +0100 Subject: [PATCH 414/544] Add more debug statements --- src/appimagetool.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index a077e42aa..18c5f353a 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -581,9 +581,16 @@ main (int argc, char *argv[]) // to get a proper error message, we now fetch the message via the returned exit code // the call returns false if the call failed, and this is what we expect to have happened // hence we can assume that there must be an error in GLib if it returned true - g_spawn_check_exit_status(exit_status, &error); + if (g_spawn_check_exit_status(exit_status, &error)) { + g_printerr("Failed to run 'git rev-parse --short HEAD, but GLib says the process didn't exit abnormally"); + } + } + + if (error == NULL) { + g_printerr("Failed to run 'git rev-parse --short HEAD, but failed to interpret GLib error state: %d\n", exit_status); + } else { + g_printerr("Failed to run 'git rev-parse --short HEAD: %s (code %d)\n", error->message, error->code); } - g_printerr("Failed to run 'git rev-parse --short HEAD: %s (code %d)\n", error->message, error->code); } else { version_env = g_strstrip(out); From 428d63d5840e6fe340e27e57c9bff3ab49e31376 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 22 Mar 2019 01:20:58 +0100 Subject: [PATCH 415/544] Fix memleak --- src/appimagetool.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 18c5f353a..d110fb36b 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -562,7 +562,9 @@ main (int argc, char *argv[]) gchar* version_env = getenv("VERSION"); if (guess_update_information) { - if (g_find_program_in_path("git")) { + char* gitPath = g_find_program_in_path("git"); + + if (gitPath != NULL) { if (version_env == NULL) { GError* error = NULL; gchar* out = NULL; @@ -602,6 +604,8 @@ main (int argc, char *argv[]) } } } + + free(gitPath); } if(!((0 == strcmp(sqfs_comp, "gzip")) || (0 ==strcmp(sqfs_comp, "xz")))) From 58c9f8e0ad337e70335fe4a219d0d073d8817afe Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 24 Mar 2019 12:40:21 +0000 Subject: [PATCH 416/544] Make "could not sign, continuing", hopefully closes #940 --- src/appimagetool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 1f1f0edc7..8450de7e1 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1102,7 +1102,7 @@ main (int argc, char *argv[]) if (pclose(fp) != 0) { fprintf(stderr, "ERROR: %s command did not succeed, could not sign, continuing\n", using_gpg ? "gpg" : "gpg2"); - return 1; + return 0; } fp = NULL; From d3280e06dac9cf075570699e323618b144d53d21 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sun, 24 Mar 2019 13:53:34 +0100 Subject: [PATCH 417/544] Properly handle gpg2 errors Fixes #940. --- src/appimagetool.c | 233 +++++++++++++++++++++++---------------------- 1 file changed, 117 insertions(+), 116 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 48fe9c04e..73f12a42d 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1121,176 +1121,177 @@ main (int argc, char *argv[]) if (pclose(fp) != 0) { fprintf(stderr, "ERROR: %s command did not succeed, could not sign, continuing\n", using_gpg ? "gpg" : "gpg2"); - return 0; - } + } else { - fp = NULL; + fp = NULL; - FILE* destinationfp = fopen(destination, "r+"); + FILE* destinationfp = fopen(destination, "r+"); - // calculate signature - { - unsigned long sig_offset = 0; - unsigned long sig_length = 0; + // calculate signature + { + unsigned long sig_offset = 0; + unsigned long sig_length = 0; - bool rv = appimage_get_elf_section_offset_and_length(destination, ".sha256_sig", &sig_offset, &sig_length); + bool rv = appimage_get_elf_section_offset_and_length(destination, ".sha256_sig", &sig_offset, + &sig_length); - if (!rv || sig_offset == 0 || sig_length == 0) { - die("Could not find section .sha256_sig in runtime"); - } + if (!rv || sig_offset == 0 || sig_length == 0) { + die("Could not find section .sha256_sig in runtime"); + } - if (verbose) { - printf("sig_offset: %lu\n", sig_offset); - printf("sig_length: %lu\n", sig_length); - } + if (verbose) { + printf("sig_offset: %lu\n", sig_offset); + printf("sig_length: %lu\n", sig_length); + } - if (sig_offset == 0) { - die("Could not determine offset for signature"); - } + if (sig_offset == 0) { + die("Could not determine offset for signature"); + } - if (destinationfp == NULL) - die("Not able to open the destination file for writing, aborting"); + if (destinationfp == NULL) + die("Not able to open the destination file for writing, aborting"); - // if(strlen(updateinformation)>sig_length) - // die("signature does not fit into segment, aborting"); + // if(strlen(updateinformation)>sig_length) + // die("signature does not fit into segment, aborting"); - fseek(destinationfp, sig_offset, SEEK_SET); + fseek(destinationfp, sig_offset, SEEK_SET); - FILE* ascfilefp = fopen(ascfile, "rb"); + FILE* ascfilefp = fopen(ascfile, "rb"); - if (ascfilefp == NULL) { - die("Not able to open the asc file for reading, aborting"); - } + if (ascfilefp == NULL) { + die("Not able to open the asc file for reading, aborting"); + } - static const int bufsize = 1024; - char buffer[bufsize]; + static const int bufsize = 1024; + char buffer[bufsize]; - size_t totalBytesRead = 0; + size_t totalBytesRead = 0; - while (!feof(ascfilefp)) { - size_t bytesRead = fread(buffer, sizeof(char), bufsize, ascfilefp); - totalBytesRead += bytesRead; + while (!feof(ascfilefp)) { + size_t bytesRead = fread(buffer, sizeof(char), bufsize, ascfilefp); + totalBytesRead += bytesRead; - if (totalBytesRead > sig_length) { - die("Error: cannot embed key in AppImage: size exceeds reserved ELF section size"); - } + if (totalBytesRead > sig_length) { + die("Error: cannot embed key in AppImage: size exceeds reserved ELF section size"); + } - size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destinationfp); + size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destinationfp); - if (bytesRead != bytesWritten) { - char message[128]; - sprintf(message, "Bytes read and written differ: %lu != %lu", (long unsigned) bytesRead, - (long unsigned) bytesWritten); - die(message); + if (bytesRead != bytesWritten) { + char message[128]; + sprintf(message, "Bytes read and written differ: %lu != %lu", (long unsigned) bytesRead, + (long unsigned) bytesWritten); + die(message); + } } - } - fclose(ascfilefp); - if (g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) - unlink(digestfile); + fclose(ascfilefp); + if (g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) + unlink(digestfile); - if (sign_key == NULL || strlen(sign_key) > 0) { - // read which key was used to sign from signature - sprintf(command, "%s --batch --list-packets %s", gpg2_path, ascfile); + if (sign_key == NULL || strlen(sign_key) > 0) { + // read which key was used to sign from signature + sprintf(command, "%s --batch --list-packets %s", gpg2_path, ascfile); - fp = popen(command, "r"); + fp = popen(command, "r"); - if (fp == NULL) - die("Failed to call gpg[2] to detect signature's key ID"); + if (fp == NULL) + die("Failed to call gpg[2] to detect signature's key ID"); - while (!feof(fp)) { - size_t bytesRead = fread(buffer, sizeof(char), bufsize, fp); + while (!feof(fp)) { + size_t bytesRead = fread(buffer, sizeof(char), bufsize, fp); - char* keyid_pos = strstr(buffer, "keyid"); + char* keyid_pos = strstr(buffer, "keyid"); - if (keyid_pos == NULL) - continue; + if (keyid_pos == NULL) + continue; - char* keyIDBegin = keyid_pos + strlen("keyid "); - char* endOfKeyID = strstr(keyIDBegin, "\n"); + char* keyIDBegin = keyid_pos + strlen("keyid "); + char* endOfKeyID = strstr(keyIDBegin, "\n"); - sign_key = calloc(endOfKeyID - keyIDBegin, sizeof(char)); - memcpy(sign_key, keyIDBegin, endOfKeyID - keyIDBegin); - } + sign_key = calloc(endOfKeyID - keyIDBegin, sizeof(char)); + memcpy(sign_key, keyIDBegin, endOfKeyID - keyIDBegin); + } - // read rest of process input to avoid broken pipe error - while (!feof(fp)) { - fread(buffer, sizeof(char), bufsize, fp); - } + // read rest of process input to avoid broken pipe error + while (!feof(fp)) { + fread(buffer, sizeof(char), bufsize, fp); + } - int retval = pclose(fp); - fp = NULL; + int retval = pclose(fp); + fp = NULL; + + if (retval != 0) + die("Failed to call gpg[2] to detect signature's key ID"); + } - if (retval != 0) - die("Failed to call gpg[2] to detect signature's key ID"); + if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) + unlink(ascfile); } - if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) - unlink(ascfile); - } + // export key and write into section + { + sprintf(command, "%s --batch --export --armor %s", gpg2_path, sign_key); - // export key and write into section - { - sprintf(command, "%s --batch --export --armor %s", gpg2_path, sign_key); + unsigned long key_offset = 0, key_length = 0; - unsigned long key_offset = 0, key_length = 0; + bool rv = appimage_get_elf_section_offset_and_length(destination, ".sig_key", &key_offset, &key_length); - bool rv = appimage_get_elf_section_offset_and_length(destination, ".sig_key", &key_offset, &key_length); + if (verbose) { + printf("key_offset: %lu\n", key_offset); + printf("key_length: %lu\n", key_length); + } - if (verbose) { - printf("key_offset: %lu\n", key_offset); - printf("key_length: %lu\n", key_length); - } + if (!rv || key_offset == 0 || key_length == 0) { + die("Could not find section .sig_key in runtime"); + } - if (!rv || key_offset == 0 || key_length == 0) { - die("Could not find section .sig_key in runtime"); - } + fseek(destinationfp, key_offset, SEEK_SET); - fseek(destinationfp, key_offset, SEEK_SET); + fp = popen(command, "r"); - fp = popen(command, "r"); + if (fp == NULL) + die("Failed to call gpg[2] to export the signature key"); - if (fp == NULL) - die("Failed to call gpg[2] to export the signature key"); + static const int bufsize = 1024; + char buffer[bufsize]; - static const int bufsize = 1024; - char buffer[bufsize]; + size_t totalBytesRead = 0; + while (!feof(fp)) { + size_t bytesRead = fread(buffer, sizeof(char), bufsize, fp); + totalBytesRead += bytesRead; - size_t totalBytesRead = 0; - while (!feof(fp)) { - size_t bytesRead = fread(buffer, sizeof(char), bufsize, fp); - totalBytesRead += bytesRead; + if (totalBytesRead > key_length) { + // read rest of process input to avoid broken pipe error + while (!feof(fp)) { + fread(buffer, sizeof(char), bufsize, fp); + } - if (totalBytesRead > key_length) { - // read rest of process input to avoid broken pipe error - while (!feof(fp)) { - fread(buffer, sizeof(char), bufsize, fp); + pclose(fp); + die("Error: cannot embed key in AppImage: size exceeds reserved ELF section size"); } - pclose(fp); - die("Error: cannot embed key in AppImage: size exceeds reserved ELF section size"); + size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destinationfp); + + if (bytesRead != bytesWritten) { + char message[128]; + sprintf(message, "Error: Bytes read and written differ: %lu != %lu", + (long unsigned) bytesRead, (long unsigned) bytesWritten); + die(message); + } } - size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destinationfp); + int exportexitcode = pclose(fp); + fp = NULL; - if (bytesRead != bytesWritten) { + if (exportexitcode != 0) { char message[128]; - sprintf(message, "Error: Bytes read and written differ: %lu != %lu", - (long unsigned) bytesRead, (long unsigned) bytesWritten); + sprintf(message, "GPG key export failed: exit code %d", exportexitcode); die(message); } - } - int exportexitcode = pclose(fp); - fp = NULL; - - if (exportexitcode != 0) { - char message[128]; - sprintf(message, "GPG key export failed: exit code %d", exportexitcode); - die(message); + fclose(destinationfp); } - - fclose(destinationfp); } } } From c6d03368156a1ab081b20978fb7f87b8b0d7e35c Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 22 Mar 2019 16:51:15 +0100 Subject: [PATCH 418/544] Fix various CLI behavior problems Version guessing stuff isn't needed when not in AppImage creation mode. appimagetool should exit with an error code when the passed AppDir does not exist, and shouldn't silently exit with code 1. --- src/appimagetool.c | 133 +++++++++++++++++++++++---------------------- 1 file changed, 69 insertions(+), 64 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 73f12a42d..ad7292794 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -552,62 +552,6 @@ main (int argc, char *argv[]) if (showVersionOnly) exit(0); - /* Parse VERSION environment variable. - * We cannot use g_environ_getenv (g_get_environ() since it is too new for CentOS 6 - * Also, if VERSION is not set and -g is called and if git is on the path, use - * git rev-parse --short HEAD - * TODO: Might also want to somehow make use of - * git rev-parse --abbrev-ref HEAD - * git log -1 --format=%ci */ - gchar* version_env = getenv("VERSION"); - - if (guess_update_information) { - char* gitPath = g_find_program_in_path("git"); - - if (gitPath != NULL) { - if (version_env == NULL) { - GError* error = NULL; - gchar* out = NULL; - - char command_line[] = "git rev-parse --short HEAD"; - - // *not* the exit code! must be interpreted via g_spawn_check_exit_status! - int exit_status = -1; - - // g_spawn_command_line_sync returns whether the program succeeded - gint ret = g_spawn_command_line_sync(command_line, &out, NULL, &exit_status, &error); - - if (ret != 0 || error != NULL) { - // g_spawn_command_line_sync might have set error already, in that case we don't want to overwrite - if (error == NULL) { - // to get a proper error message, we now fetch the message via the returned exit code - // the call returns false if the call failed, and this is what we expect to have happened - // hence we can assume that there must be an error in GLib if it returned true - if (g_spawn_check_exit_status(exit_status, &error)) { - g_printerr("Failed to run 'git rev-parse --short HEAD, but GLib says the process didn't exit abnormally"); - } - } - - if (error == NULL) { - g_printerr("Failed to run 'git rev-parse --short HEAD, but failed to interpret GLib error state: %d\n", exit_status); - } else { - g_printerr("Failed to run 'git rev-parse --short HEAD: %s (code %d)\n", error->message, error->code); - } - } else { - version_env = g_strstrip(out); - - if (version_env != NULL) { - g_printerr("NOTE: Using the output of 'git rev-parse --short HEAD' as the version:\n"); - g_printerr(" %s\n", version_env); - g_printerr(" Please set the $VERSION environment variable if this is not intended\n"); - } - } - } - } - - free(gitPath); - } - if(!((0 == strcmp(sqfs_comp, "gzip")) || (0 ==strcmp(sqfs_comp, "xz")))) die("Only gzip (faster execution, larger files) and xz (slower execution, smaller files) compression is supported at the moment. Let us know if there are reasons for more, should be easy to add. You could help the project by doing some systematic size/performance measurements. Watch for size, execution speed, and zsync delta size."); /* Check for dependencies here. Better fail early if they are not present. */ @@ -656,7 +600,63 @@ main (int argc, char *argv[]) } /* If the first argument is a directory, then we assume that we should package it */ - if (g_file_test (remaining_args[0], G_FILE_TEST_IS_DIR)){ + if (g_file_test(remaining_args[0], G_FILE_TEST_IS_DIR)) { + /* Parse VERSION environment variable. + * We cannot use g_environ_getenv (g_get_environ() since it is too new for CentOS 6 + * Also, if VERSION is not set and -g is called and if git is on the path, use + * git rev-parse --short HEAD + * TODO: Might also want to somehow make use of + * git rev-parse --abbrev-ref HEAD + * git log -1 --format=%ci */ + gchar* version_env = getenv("VERSION"); + + if (guess_update_information) { + char* gitPath = g_find_program_in_path("git"); + + if (gitPath != NULL) { + if (version_env == NULL) { + GError* error = NULL; + gchar* out = NULL; + + char command_line[] = "git rev-parse --short HEAD"; + + // *not* the exit code! must be interpreted via g_spawn_check_exit_status! + int exit_status = -1; + + // g_spawn_command_line_sync returns whether the program succeeded + gint ret = g_spawn_command_line_sync(command_line, &out, NULL, &exit_status, &error); + + if (ret != 0 || error != NULL) { + // g_spawn_command_line_sync might have set error already, in that case we don't want to overwrite + if (error == NULL) { + // to get a proper error message, we now fetch the message via the returned exit code + // the call returns false if the call failed, and this is what we expect to have happened + // hence we can assume that there must be an error in GLib if it returned true + if (g_spawn_check_exit_status(exit_status, &error)) { + g_printerr("Failed to run 'git rev-parse --short HEAD, but GLib says the process didn't exit abnormally"); + } + } + + if (error == NULL) { + g_printerr("Failed to run 'git rev-parse --short HEAD, but failed to interpret GLib error state: %d\n", exit_status); + } else { + g_printerr("Failed to run 'git rev-parse --short HEAD: %s (code %d)\n", error->message, error->code); + } + } else { + version_env = g_strstrip(out); + + if (version_env != NULL) { + g_printerr("NOTE: Using the output of 'git rev-parse --short HEAD' as the version:\n"); + g_printerr(" %s\n", version_env); + g_printerr(" Please set the $VERSION environment variable if this is not intended\n"); + } + } + } + } + + free(gitPath); + } + char *destination; char source[PATH_MAX]; realpath(remaining_args[0], source); @@ -1344,13 +1344,18 @@ main (int argc, char *argv[]) fprintf(stderr, "Please consider submitting your AppImage to AppImageHub, the crowd-sourced\n"); fprintf(stderr, "central directory of available AppImages, by opening a pull request\n"); fprintf(stderr, "at https://github.com/AppImage/appimage.github.io\n"); - } - - /* If the first argument is a regular file, then we assume that we should unpack it */ - if (g_file_test (remaining_args[0], G_FILE_TEST_IS_REGULAR)){ - fprintf (stdout, "%s is a file, assuming it is an AppImage and should be unpacked\n", remaining_args[0]); + + return 0; + } else if (g_file_test(remaining_args[0], G_FILE_TEST_IS_REGULAR)) { + /* If the first argument is a regular file, then we assume that we should unpack it */ + fprintf(stdout, "%s is a file, assuming it is an AppImage and should be unpacked\n", remaining_args[0]); die("To be implemented"); + return 1; + } else { + fprintf(stderr, "Error: no such file or directory: %s\n", remaining_args[0]); + return 1; } - - return 0; + + // should never be reached + return 1; } From 915b76dd0fb47fa17505f5dcf524eebae0e77edd Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 30 Mar 2019 12:54:59 +0100 Subject: [PATCH 419/544] Fix more GLib annoyances --- src/appimagetool.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index ad7292794..2c772f9ee 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -624,19 +624,11 @@ main (int argc, char *argv[]) int exit_status = -1; // g_spawn_command_line_sync returns whether the program succeeded - gint ret = g_spawn_command_line_sync(command_line, &out, NULL, &exit_status, &error); - - if (ret != 0 || error != NULL) { - // g_spawn_command_line_sync might have set error already, in that case we don't want to overwrite - if (error == NULL) { - // to get a proper error message, we now fetch the message via the returned exit code - // the call returns false if the call failed, and this is what we expect to have happened - // hence we can assume that there must be an error in GLib if it returned true - if (g_spawn_check_exit_status(exit_status, &error)) { - g_printerr("Failed to run 'git rev-parse --short HEAD, but GLib says the process didn't exit abnormally"); - } - } + // its return value is buggy, hence we're using g_spawn_check_exit_status to check for errors + g_spawn_command_line_sync(command_line, &out, NULL, &exit_status, &error); + // g_spawn_command_line_sync might have set error already, in that case we don't want to overwrite + if (error != NULL || !g_spawn_check_exit_status(exit_status, &error)) { if (error == NULL) { g_printerr("Failed to run 'git rev-parse --short HEAD, but failed to interpret GLib error state: %d\n", exit_status); } else { From e827baa719f5444aeef7202fe1f71c97d4200dde Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 6 Apr 2019 03:53:53 +0200 Subject: [PATCH 420/544] Fix --appimage-mount mountpoint communication Right now, the buffering of stdout prevents proper reading of the mountpoint from stdout in scripts and other processes in general. This commit fixes the runtime's behavior. --- src/runtime.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 92b07f25e..86b0e40ec 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -868,13 +868,23 @@ int main(int argc, char *argv[]) { } real_argv[i] = NULL; - if(arg && strcmp(arg,"appimage-mount")==0) { + if(arg && strcmp(arg, "appimage-mount") == 0) { char real_mount_dir[PATH_MAX]; - if (realpath(mount_dir, real_mount_dir) == real_mount_dir) + + if (realpath(mount_dir, real_mount_dir) == real_mount_dir) { printf("%s\n", real_mount_dir); - else + } else { printf("%s\n", mount_dir); + } + + // stdout is, by default, buffered (unlike stderr), therefore in order to allow other processes to read + // the path from stdout, we need to flush the buffers now + // this is a less-invasive alternative to setbuf(stdout, NULL); + fflush(stdout); + for (;;) pause(); + + exit(0); } /* Setting some environment variables that the app "inside" might use */ From acaf2f333819e7ccfd9122f237bdf892da2b7564 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 6 Apr 2019 04:54:40 +0200 Subject: [PATCH 421/544] Refactor and improve mountpoint name generation --- src/runtime.c | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 86b0e40ec..2fb638d28 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -496,6 +496,32 @@ bool rm_recursive(const char* const path) { return rv == 0; } +bool build_mount_point(char* mount_dir, const char* const argv0, char const* const temp_base, const size_t templen) { + const size_t maxnamelen = 6; + + // when running for another AppImage, we should use that for building the mountpoint name instead + char* target_appimage = getenv("TARGET_APPIMAGE"); + + char* path_basename; + if (target_appimage != NULL) { + path_basename = basename(target_appimage); + } else { + path_basename = basename(argv0); + } + + size_t namelen = strlen(path_basename); + // limit length of tempdir name + if (namelen > maxnamelen) { + namelen = maxnamelen; + } + + strcpy(mount_dir, temp_base); + strncpy(mount_dir + templen, "/.mount_", 8); + strncpy(mount_dir + templen + 8, path_basename, namelen); + strncpy(mount_dir+templen+8+namelen, "XXXXXX", 6); + mount_dir[templen+8+namelen+6] = 0; // null terminate destination +} + int main(int argc, char *argv[]) { char appimage_path[PATH_MAX]; char argv0_path[PATH_MAX]; @@ -774,17 +800,7 @@ int main(int argc, char *argv[]) { // allocate enough memory (size of name won't exceed 60 bytes) char mount_dir[templen + 60]; - size_t namelen = strlen(basename(argv[0])); - // limit length of tempdir name - if(namelen > 6){ - namelen = 6; - } - - strcpy(mount_dir, temp_base); - strncpy(mount_dir+templen, "/.mount_", 8); - strncpy(mount_dir+templen+8, basename(argv[0]), namelen); - strncpy(mount_dir+templen+8+namelen, "XXXXXX", 6); - mount_dir[templen+8+namelen+6] = 0; // null terminate destination + build_mount_point(mount_dir, argv[0], temp_base, templen); size_t mount_dir_size = strlen(mount_dir); pid_t pid; From cd5b6c4018b24db16a62616bf772619000448f9f Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 1 May 2019 22:32:40 +0200 Subject: [PATCH 422/544] Allow using extract-and-run via environment variable Useful for "nested" AppImage calls, e.g., linuxdeploy plugins called by linuxdeploy in a Docker environment. --- src/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index 2fb638d28..048649c90 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -662,7 +662,7 @@ int main(int argc, char *argv[]) { free(abspath); } - if (arg && strcmp(arg, "appimage-extract-and-run") == 0) { + if (getenv("APPIMAGE_EXTRACT_AND_RUN") != NULL || (arg && strcmp(arg, "appimage-extract-and-run") == 0)) { char* hexlified_digest = NULL; // calculate MD5 hash of file, and use it to make extracted directory name "content-aware" From 3e32d1f6e0a05fd568e118776077667cc82d88cd Mon Sep 17 00:00:00 2001 From: probonopd Date: Sat, 11 May 2019 08:12:51 +0000 Subject: [PATCH 423/544] Update README.md [ci skip] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6338d03f4..3293bda20 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# AppImageKit [![Build Status](https://travis-ci.org/AppImage/AppImageKit.svg?branch=appimagetool/master)](https://travis-ci.org/AppImage/AppImageKit) ![Downloads](https://img.shields.io/github/downloads/AppImage/AppImageKit/total.svg) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/ff60338a447941afb17c30f777314bee)](https://www.codacy.com/app/probonopd/AppImageKit?utm_source=github.com&utm_medium=referral&utm_content=AppImage/AppImageKit&utm_campaign=Badge_Grade) [![discourse](https://img.shields.io/badge/forum-discourse-orange.svg)](http://discourse.appimage.org) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/probonopd/AppImageKit?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![irc](https://img.shields.io/badge/IRC-%23AppImage%20on%20freenode-blue.svg)](https://webchat.freenode.net/?channels=AppImage) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZT9CL8M5TJU72) +# AppImageKit [![Build Status](https://travis-ci.org/AppImage/AppImageKit.svg?branch=appimagetool/master)](https://travis-ci.org/AppImage/AppImageKit) ![Downloads](https://img.shields.io/github/downloads/AppImage/AppImageKit/total.svg) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/ff60338a447941afb17c30f777314bee)](https://www.codacy.com/app/probonopd/AppImageKit?utm_source=github.com&utm_medium=referral&utm_content=AppImage/AppImageKit&utm_campaign=Badge_Grade) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/probonopd/AppImageKit?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![irc](https://img.shields.io/badge/IRC-%23AppImage%20on%20freenode-blue.svg)](https://webchat.freenode.net/?channels=AppImage) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZT9CL8M5TJU72) The __AppImage__ format is a format for packaging applications in a way that allows them to run on a variety of different target systems (base operating systems, distributions) without further modification. From c13f60c0b3553c3d9495b1a66ab0adc328d55b89 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sat, 15 Jun 2019 14:42:47 +0000 Subject: [PATCH 424/544] Update CONTRIBUTING.md --- CONTRIBUTING.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8ed801ed6..758be3c67 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,8 @@ # Contributing -Welcome to AppImage. A good starting point for most questions is our wiki at https://github.com/AppImage/AppImageKit/wiki. +Welcome to AppImage. A good starting point for most questions is our wiki at https://github.com/AppImage/AppImageKit/wiki + +## How to contribute ### I would like to request an AppImage for an application @@ -23,3 +25,17 @@ Your contribution is especially welcome in these ares: * [Open bugs](https://github.com/search?utf8=%E2%9C%93&q=org%3AAppImage+label%3Abug+state%3Aopen&type=Issues) If you would like to report issues with AppImageKit itself, or would like to contribute to its development, please see get in touch with us in `#AppImage` on `irc.freenode.net`. We welcome pull requests addressing any of the open issues and/or other bugfixes and/or feature additions. In the case of complex feature additions, it is best to contact us first, before you spend much time. + +## Project governance + +Founder and project leader Simon Peter (probonopd) reserves the right to define the AppImage format, brand, high-level architecture, user experience, and project governance + +## Rules for contributing + +* The only supported version is git master +* We do not bugfix any versions other than git master +* Versions other than git master are considered outdated and obsolete +* Our software comes in AppImage format. Everything else is unsupported by us +* If git master breaks, all other work stops and every contributor focuses exclusively on un-breaking master +* Every contribution shall be sent as a pull request, which must build "green" before it is merged +* Pinned issues shall be closed before other issues are being worked on From 20fe2cf363179ec9c7db229ef1e680d1be0ae64a Mon Sep 17 00:00:00 2001 From: probonopd Date: Mon, 24 Jun 2019 08:03:07 +0200 Subject: [PATCH 425/544] Remove support for .svgz Remove support for .svgz since it is not allowed as per the XDG Icon Theme specification, and hence cannot be expected to work on every desktop environment (although some may support it) https://github.com/TheAssassin/appimagelint/issues/14#issuecomment-504790182 --- src/appimagetool.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 2c772f9ee..9fcce5a49 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -743,22 +743,18 @@ main (int argc, char *argv[]) gchar* icon_file_path = NULL; gchar* icon_file_png; gchar* icon_file_svg; - gchar* icon_file_svgz; gchar* icon_file_xpm; icon_file_png = g_strdup_printf("%s/%s.png", source, icon_name); icon_file_svg = g_strdup_printf("%s/%s.svg", source, icon_name); - icon_file_svgz = g_strdup_printf("%s/%s.svgz", source, icon_name); icon_file_xpm = g_strdup_printf("%s/%s.xpm", source, icon_name); if (g_file_test(icon_file_png, G_FILE_TEST_IS_REGULAR)) { icon_file_path = icon_file_png; } else if(g_file_test(icon_file_svg, G_FILE_TEST_IS_REGULAR)) { icon_file_path = icon_file_svg; - } else if(g_file_test(icon_file_svgz, G_FILE_TEST_IS_REGULAR)) { - icon_file_path = icon_file_svgz; } else if(g_file_test(icon_file_xpm, G_FILE_TEST_IS_REGULAR)) { icon_file_path = icon_file_xpm; } else { - fprintf (stderr, "%s{.png,.svg,.svgz,.xpm} defined in desktop file but not found\n", icon_name); + fprintf (stderr, "%s{.png,.svg,.xpm} defined in desktop file but not found\n", icon_name); fprintf (stderr, "For example, you could put a 256x256 pixel png into\n"); gchar *icon_name_with_png = g_strconcat(icon_name, ".png", NULL); gchar *example_path = g_build_filename(source, "/", icon_name_with_png, NULL); From 2d36ff7f6627f9a2e52039e3c4ef0928958f62ed Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 7 Jul 2019 08:00:09 +0000 Subject: [PATCH 426/544] Update AppRun.c --- src/AppRun.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/AppRun.c b/src/AppRun.c index 876e313c6..3ff82af3f 100644 --- a/src/AppRun.c +++ b/src/AppRun.c @@ -190,6 +190,9 @@ int main(int argc, char *argv[]) { old_env = getenv("QT_PLUGIN_PATH") ?: ""; SET_NEW_ENV(new_qt_plugin_path, appdir_s*10 + strlen(old_env), "QT_PLUGIN_PATH=%s/usr/lib/qt4/plugins/:%s/usr/lib/i386-linux-gnu/qt4/plugins/:%s/usr/lib/x86_64-linux-gnu/qt4/plugins/:%s/usr/lib32/qt4/plugins/:%s/usr/lib64/qt4/plugins/:%s/usr/lib/qt5/plugins/:%s/usr/lib/i386-linux-gnu/qt5/plugins/:%s/usr/lib/x86_64-linux-gnu/qt5/plugins/:%s/usr/lib32/qt5/plugins/:%s/usr/lib64/qt5/plugins/:%s", appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, old_env); + SET_NEW_ENV(new_gspath, appdir_s + strlen(old_env), "GST_PLUGIN_SYSTEM_PATH=%s/usr/lib/gstreamer:%s", appdir, old_env); + SET_NEW_ENV(new_gspath1, appdir_s + strlen(old_env), "GST_PLUGIN_SYSTEM_PATH_1_0=%s/usr/lib/gstreamer-1.0:%s", appdir, old_env); + /* Otherwise may get errors because Python cannot write __pycache__ bytecode cache */ putenv("PYTHONDONTWRITEBYTECODE=1"); From bb3488122c42d0b16a3300c8d68e7e63f51bf32c Mon Sep 17 00:00:00 2001 From: "FeRD (Frank Dana)" Date: Mon, 14 Oct 2019 23:41:00 -0400 Subject: [PATCH 427/544] mksquashfs dep: Update to 4.4, drop patch --- cmake/dependencies.cmake | 5 +- src/appimagetool.c | 2 +- src/mksquashfs-mkfs-fixed-timestamp.patch | 57 ----------------------- 3 files changed, 3 insertions(+), 61 deletions(-) delete mode 100644 src/mksquashfs-mkfs-fixed-timestamp.patch diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 9f7901f00..685a86ff3 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -51,9 +51,8 @@ endif() ExternalProject_Add(mksquashfs GIT_REPOSITORY https://github.com/plougher/squashfs-tools/ - GIT_TAG 5be5d61 - UPDATE_COMMAND "" # ${MAKE} sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time - PATCH_COMMAND patch -N -p1 < ${PROJECT_SOURCE_DIR}/src/mksquashfs-mkfs-fixed-timestamp.patch || true + GIT_TAG 4.4 + UPDATE_COMMAND "" # Make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time CONFIGURE_COMMAND ${SED} -i "s|CFLAGS += -DXZ_SUPPORT|CFLAGS += ${mksquashfs_cflags}|g" /squashfs-tools/Makefile COMMAND ${SED} -i "s|LIBS += -llzma|LIBS += -Bstatic ${mksquashfs_ldflags}|g" /squashfs-tools/Makefile COMMAND ${SED} -i "s|install: mksquashfs unsquashfs|install: mksquashfs|g" squashfs-tools/Makefile diff --git a/src/appimagetool.c b/src/appimagetool.c index 9fcce5a49..9062738ee 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -198,7 +198,7 @@ int sfs_mksquashfs(char *source, char *destination, int offset) { args[i++] = exclude_file; } - args[i++] = "-mkfs-fixed-time"; + args[i++] = "-mkfs-time"; args[i++] = "0"; args[i++] = 0; diff --git a/src/mksquashfs-mkfs-fixed-timestamp.patch b/src/mksquashfs-mkfs-fixed-timestamp.patch deleted file mode 100644 index d95ffd3ad..000000000 --- a/src/mksquashfs-mkfs-fixed-timestamp.patch +++ /dev/null @@ -1,57 +0,0 @@ ->From 9575f13b1f865523f020bff460c5a37a078c2b6d Mon Sep 17 00:00:00 2001 -From: intrigeri -Date: Sun, 20 Nov 2016 15:56:13 +0000 -Subject: [PATCH 1/2] Add a -mkfs-fixed-time option, to allow - overriding the filesystem creation time for reproducible builds. - -Based on a patch by Alexander Couzens posted on -https://sourceforge.net/p/squashfs/mailman/message/34673610/ - -Edited by @TheAssassin to work with the current development version of -mksquashfs. ---- - squashfs-tools/mksquashfs.c | 14 +++++++++++++- - 1 file changed, 13 insertions(+), 1 deletion(-) - -diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c -index 13d60f7..e21e251 100644 ---- a/squashfs-tools/mksquashfs.c 2018-02-05 23:26:27.882300146 +0100 -+++ b/squashfs-tools/mksquashfs.c 2018-02-05 23:26:05.382276655 +0100 -@@ -131,6 +131,9 @@ - /* inode lookup table */ - squashfs_inode *inode_lookup_table = NULL; - -+/* override filesystem creation time */ -+time_t mkfs_fixed_time = -1; -+ - /* in memory directory data */ - #define I_COUNT_SIZE 128 - #define DIR_ENTRIES 32 -@@ -5353,6 +5356,15 @@ - force_progress = TRUE; - else if(strcmp(argv[i], "-no-exports") == 0) - exportable = FALSE; -+ else if(strcmp(argv[i], "-mkfs-fixed-time") == 0) { -+ if((++i == argc) || (mkfs_fixed_time = -+ strtoll(argv[i], &b, 10), *b != '\0')) { -+ ERROR("%s: -mkfs-fixed-time missing or invalid " -+ "timestamp\n", argv[0]); -+ -+ exit(1); -+ } -+ } - else if(strcmp(argv[i], "-offset") == 0 || - strcmp(argv[i], "-o") ==0) { - if(++i == argc) { -@@ -6031,7 +6043,7 @@ - sBlk.flags = SQUASHFS_MKFLAGS(noI, noD, noF, noX, no_fragments, - always_use_fragments, duplicate_checking, exportable, - no_xattrs, comp_opts); -- sBlk.mkfs_time = time(NULL); -+ sBlk.mkfs_time = mkfs_fixed_time != -1 ? mkfs_fixed_time : time(NULL); - - disable_info(); - --- -2.10.2 - From 91b44f67fc45ae279d915484379ed55b93e7f2d0 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 8 Nov 2019 16:56:27 +0100 Subject: [PATCH 428/544] Make verbosity of --appimage-extract-and-run configurable Fixes #1002. --- src/runtime.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 048649c90..a4f039944 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -274,7 +274,7 @@ portable_option(const char *arg, const char *appimage_path, const char *name) } } -bool extract_appimage(const char* const appimage_path, const char* const _prefix, const char* const _pattern, const bool overwrite) { +bool extract_appimage(const char* const appimage_path, const char* const _prefix, const char* const _pattern, const bool overwrite, const bool verbose) { sqfs_err err = SQFS_OK; sqfs_traverse trv; sqfs fs; @@ -331,7 +331,10 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix // fprintf(stderr, "inode.xtra.reg.file_size: %lu\n", inode.xtra.reg.file_size); strcpy(prefixed_path_to_extract, ""); strcat(strcat(prefixed_path_to_extract, prefix), trv.path); - fprintf(stdout, "%s\n", prefixed_path_to_extract); + + if (verbose) + fprintf(stdout, "%s\n", prefixed_path_to_extract); + if (inode.base.inode_type == SQUASHFS_DIR_TYPE || inode.base.inode_type == SQUASHFS_LDIR_TYPE) { // fprintf(stderr, "inode.xtra.dir.parent_inode: %ui\n", inode.xtra.dir.parent_inode); // fprintf(stderr, "mkdir_p: %s/\n", prefixed_path_to_extract); @@ -633,7 +636,7 @@ int main(int argc, char *argv[]) { exit(1); } - if (!extract_appimage(appimage_path, "squashfs-root/", pattern, true)) { + if (!extract_appimage(appimage_path, "squashfs-root/", pattern, true, true)) { exit(1); } @@ -694,7 +697,9 @@ int main(int argc, char *argv[]) { strcat(prefix, hexlified_digest); free(hexlified_digest); - if (!extract_appimage(appimage_path, prefix, NULL, false)) { + const bool verbose = (getenv("VERBOSE") != NULL); + + if (!extract_appimage(appimage_path, prefix, NULL, false, verbose)) { fprintf(stderr, "Failed to extract AppImage\n"); exit(EXIT_EXECERROR); } From 8f9165b1284db89b2d4ed26b514087115aa25193 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 10 Nov 2019 03:40:48 +0000 Subject: [PATCH 429/544] Optmized with zopflipng -m [ci skip] --- resources/appimage.png | Bin 0 -> 9773 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/appimage.png diff --git a/resources/appimage.png b/resources/appimage.png new file mode 100644 index 0000000000000000000000000000000000000000..a304efdfab107653faae17e85a254f7f50582e6f GIT binary patch literal 9773 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 Hu0mjfS&vS> literal 0 HcmV?d00001 From b51f685cebfc8cbd6a57a305ce58490cce73fa88 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 10 Nov 2019 04:44:33 +0100 Subject: [PATCH 430/544] renamed to appimagetool.png [ci skip] --- resources/{appimage.png => appimagetool.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename resources/{appimage.png => appimagetool.png} (100%) diff --git a/resources/appimage.png b/resources/appimagetool.png similarity index 100% rename from resources/appimage.png rename to resources/appimagetool.png From 703fa5757d80caabbc5e4b777d0440e43e059b08 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 10 Nov 2019 04:50:32 +0100 Subject: [PATCH 431/544] Use svg rather than png --- build-appdir.sh | 4 ++-- src/CMakeLists.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build-appdir.sh b/build-appdir.sh index 51cce0dd9..1e8490dfd 100644 --- a/build-appdir.sh +++ b/build-appdir.sh @@ -26,8 +26,8 @@ cp $(which desktop-file-validate) "$APPIMAGETOOL_APPDIR"/usr/bin/ cp $(which zsyncmake) "$APPIMAGETOOL_APPDIR"/usr/bin/ cp ../resources/appimagetool.desktop "$APPIMAGETOOL_APPDIR" -cp ../resources/appimagetool.svg "$APPIMAGETOOL_APPDIR"/appimagetool.svg -ln -s "$APPIMAGETOOL_APPDIR"/appimagetool.svg "$APPIMAGETOOL_APPDIR"/.DirIcon +cp ../resources/appimagetool.png "$APPIMAGETOOL_APPDIR"/appimagetool.png +cp "$APPIMAGETOOL_APPDIR"/appimagetool.png "$APPIMAGETOOL_APPDIR"/.DirIcon if [ -d /deps/ ]; then # deploy glib diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 85a9c0b39..0228e0829 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -153,5 +153,5 @@ install( ) install(FILES "${PROJECT_SOURCE_DIR}/resources/appimagetool.desktop" DESTINATION share/applications COMPONENT appimagetool EXCLUDE_FROM_ALL) -install(FILES "${PROJECT_SOURCE_DIR}/resources/appimagetool.svg" DESTINATION share/icons/hicolor/scalable/apps COMPONENT appimagetool EXCLUDE_FROM_ALL) +install(FILES "${PROJECT_SOURCE_DIR}/resources/appimagetool.png" DESTINATION share/icons/hicolor/128x128/apps COMPONENT appimagetool EXCLUDE_FROM_ALL) install(FILES "${PROJECT_SOURCE_DIR}/resources/usr/share/metainfo/appimagetool.appdata.xml" DESTINATION share/metainfo COMPONENT appimagetool EXCLUDE_FROM_ALL) From 5e9c8978a024c32eb434305abc9d565105edba40 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sun, 17 Nov 2019 19:48:59 +0100 Subject: [PATCH 432/544] Remove unmaintained script --- install-build-deps.sh | 80 ------------------------------------------- 1 file changed, 80 deletions(-) delete mode 100755 install-build-deps.sh diff --git a/install-build-deps.sh b/install-build-deps.sh deleted file mode 100755 index 91cdc0789..000000000 --- a/install-build-deps.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/bash - -set -e - -# Install build dependencies; TODO: Support systems that do not use apt-get (Pull Requests welcome!) - -ARCH=$(uname -m) -if [ "$ARCH" == "i686" ]; then - ARCH=i386 -fi - - -# Install dependencies for openSUSE -if [ -e /usr/bin/zypper ] ; then - sudo zypper refresh - sudo zypper in -y build git-core gcc g++ wget make glibc-devel glib2-devel libarchive-devel \ - fuse fuse-devel zlib-devel patch cairo-devel zsync desktop-file-utils cmake - #for some reason openSUSE Tumbleweed have apt-get. - return -fi - -if [ -e /usr/bin/apt-get ] ; then - sudo apt-get update - sudo apt-get -y install zsync git libarchive-dev autoconf libtool make gcc g++ libtool libfuse-dev \ - liblzma-dev libglib2.0-dev libssl-dev libinotifytools0-dev liblz4-dev libcairo-dev desktop-file-utils cmake - # libtool-bin might be required in newer distributions but is not available in precise - test -e /usr/lib/$ARCH-linux-gnu/pkgconfig/liblz4.pc || - sudo cp -v resources/liblz4.pc /usr/lib/$ARCH-linux-gnu/pkgconfig/ - if cat /etc/lsb-release | grep 14.04 2>&1 >/dev/null; then - export CMAKE_VERSION=3.10.0 - # sometimes, using a crowbar is easier than fiddling with PPAs - wget https://cmake.org/files/v3.10/cmake-"$CMAKE_VERSION"-Linux-x86_64.tar.gz -O- | tar xz --strip-components=1 -C /usr/local - fi -fi - -if [ -e /usr/bin/yum ] ; then - # Install and enable EPEL and Devtoolset-4 by Software Collections - # https://www.softwarecollections.org/en/scls/rhscl/devtoolset-4/ - if [ "$ARCH" == "x86_64" ]; then - yum -y install centos-release-scl-rh epel-release - yum -y install devtoolset-4-gcc.$ARCH devtoolset-4-gcc-c++.$ARCH - fi - - # Install and enable Autotools by Pavel Raiskup - # https://www.softwarecollections.org/en/scls/praiskup/autotools/ - rpm -ivh https://www.softwarecollections.org/en/scls/praiskup/autotools/epel-6-$ARCH/download/praiskup-autotools-epel-6-$ARCH.noarch.rpm - yum -y install autotools-latest # 19 MB - - if [ "$ARCH" == "x86_64" ]; then - rpm -ivh https://github.com/kikitux/blog/raw/master/zsync/zsync-0.6.2-1.el6.rf.x86_64.rpm - fi - if [ "$ARCH" == "i386" ]; then - rpm -ivh https://github.com/kikitux/blog/raw/master/zsync/zsync-0.6.2-1.el6.rf.i686.rpm - fi - - yum -y install epel-release - yum -y install git wget make binutils fuse glibc-devel glib2-devel libarchive3-devel fuse-devel zlib-devel patch openssl-static openssl-devel vim-common cairo-devel desktop-file-utils libtool # inotify-tools-devel lz4-devel - - export AUTOMAKE_VERSION=1.15 AUTOCONF_VERSION=2.69 CMAKE_VERSION=3.10.0 - wget https://raw.githubusercontent.com/AppImage/AppImageBuild/master/build-automake.sh -O- | bash - wget https://raw.githubusercontent.com/AppImage/AppImageBuild/master/build-autoconf.sh -O- | bash - wget https://cmake.org/files/v3.10/cmake-"$CMAKE_VERSION"-Linux-x86_64.tar.gz -O- | tar xz --strip-components=1 -C /usr -fi - -# Install dependencies for Arch Linux -if [ -e /usr/bin/pacman ] ; then - echo "Checking arch package provides and installed packages" - declare -a arr=("zsync" "git" "libarchive" "autoconf" "libtool" "fuse2" "xz" "glib2" "openssl" - "inotify-tools" "lz4" "gcc" "cmake" "wget" "vim" "desktop-file-utils" "cairo") - for i in "${arr[@]}" - do - if [ ! "$(package-query -Q $i || package-query --qprovides $i -Q)" ]; then - TO_INSTALL="$TO_INSTALL $i" - fi - done - if [ "$TO_INSTALL" ]; then - echo "Found the following missing packages:$TO_INSTALL, installing now" - sudo pacman -S --needed $TO_INSTALL - fi -fi From 8d9fe4907a174ec5e81a307f65e18514e42e4249 Mon Sep 17 00:00:00 2001 From: Paul Verest Date: Tue, 19 Nov 2019 14:20:01 +0800 Subject: [PATCH 433/544] Update year in README Copyright --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3293bda20..c340e0d73 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ run on a variety of different target systems (base operating systems, distributi Using AppImageKit you can package desktop applications as AppImages that run on common Linux-based operating systems, such as RHEL, CentOS, Ubuntu, Fedora, Debian and derivatives. -Copyright (c) 2004-18 Simon Peter and contributors. +Copyright (c) 2004-19 Simon Peter and contributors. https://en.wikipedia.org/wiki/AppImage From ea01d156b21c8ef5c82bdc95c2c965f50fadabbb Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 23 Nov 2019 18:28:59 +0100 Subject: [PATCH 434/544] Print hash used to calculate signature for debugging --- src/appimagetool.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/appimagetool.c b/src/appimagetool.c index 9062738ee..cea7902d7 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1076,6 +1076,9 @@ main (int argc, char *argv[]) if (pclose(fp) != 0) die(using_shasum ? "shasum command did not succeed" : "sha256sum command did not succeed"); + // print hash which is later signed for debugging purposes + printf("Signing using SHA256 digest: %s\n", output); + fp = NULL; if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) From d8dc84516766cb3f99f313c882807ee08ed3c11b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 23 Nov 2019 20:09:49 +0100 Subject: [PATCH 435/544] Fix and improve digest calculation Removes redundancy and fixes a memleak. --- src/appimagetool.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index cea7902d7..75520cbe8 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1062,22 +1062,31 @@ main (int argc, char *argv[]) fgets(output, sizeof(output) - 1, fp); - if (verbose) - printf("%s: %s\n", using_shasum ? "shasum" : "sha256sum", - g_strsplit_set(output, " ", -1)[0]); - - FILE* fpx = fopen(digestfile, "w"); - - if (fpx != NULL) { - fputs(g_strsplit_set(output, " ", -1)[0], fpx); - fclose(fpx); - } if (pclose(fp) != 0) die(using_shasum ? "shasum command did not succeed" : "sha256sum command did not succeed"); - // print hash which is later signed for debugging purposes - printf("Signing using SHA256 digest: %s\n", output); + // let's use a new scope to avoid polluting the scope too much with temporary variables + { + // the output of sha256sum is always + // we have to split the string, the first item contains the hash then + gchar** split_result = g_strsplit_set(output, " ", -1); + + // extract the first item reference, doesn't have to be free-d + const gchar* digest_only = split_result[0]; + + // print hash which is later signed for debugging purposes + printf("Signing using SHA256 digest: %s\n", digest_only); + + FILE* fpx = fopen(digestfile, "w"); + + if (fpx != NULL) { + fputs(digest_only, fpx); + fclose(fpx); + } + + g_strfreev(split_result); + } fp = NULL; From 5e5ae5ec3217eb9f6003b8d301d387077b1395e6 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 23 Nov 2019 22:42:21 +0100 Subject: [PATCH 436/544] Actually sign AppImages --- travis/build-appimage.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/build-appimage.sh b/travis/build-appimage.sh index b330b7ba1..c23c059eb 100755 --- a/travis/build-appimage.sh +++ b/travis/build-appimage.sh @@ -6,7 +6,7 @@ cd /AppImageKit/build cd out/ -if [ "TRAVIS_PULL_REQUEST" == "false" ] ; then +if [ "$TRAVIS_PULL_REQUEST" == "false" ] ; then # Sign only when NOT on a pull request ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -s -v \ -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ From 64321b72bc35fc886772ab7d95f3924b67207b32 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 23 Nov 2019 22:50:18 +0100 Subject: [PATCH 437/544] Actually sign AppImages, mk. 2 Travis documents that the variable should be set to "false", but we just tested and the variable is empty/not set outside PR builds. Therefore we had to extend the check. --- travis/build-appimage.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/build-appimage.sh b/travis/build-appimage.sh index c23c059eb..e8be2a257 100755 --- a/travis/build-appimage.sh +++ b/travis/build-appimage.sh @@ -6,7 +6,7 @@ cd /AppImageKit/build cd out/ -if [ "$TRAVIS_PULL_REQUEST" == "false" ] ; then +if [ "$TRAVIS_PULL_REQUEST" == "false" ] || [ "$TRAVIS_PULL_REQUEST" == "" ]; then # Sign only when NOT on a pull request ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -s -v \ -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ From 7cb0f6dee74007f11288b18deae4e54d30e23754 Mon Sep 17 00:00:00 2001 From: Zaoqi Date: Sun, 15 Dec 2019 15:47:06 +0800 Subject: [PATCH 438/544] fix build issue on Alpinelinux --- src/light_elf.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/light_elf.h b/src/light_elf.h index d6044a711..ca0f95e59 100644 --- a/src/light_elf.h +++ b/src/light_elf.h @@ -26,7 +26,9 @@ #include -__BEGIN_DECLS +#ifdef _cplusplus +extern "C" { +#endif typedef uint16_t Elf32_Half; typedef uint16_t Elf64_Half; @@ -114,6 +116,8 @@ typedef struct elf32_note { #define EI_CLASS 4 #define EI_DATA 5 -__END_DECLS +#ifdef _cplusplus +extern "C" } +#endif #endif /* elf.h */ From 366cd6a8c461769d8754907a27d4580a85582a8d Mon Sep 17 00:00:00 2001 From: Zaoqi Date: Sun, 15 Dec 2019 15:49:17 +0800 Subject: [PATCH 439/544] typo --- src/light_elf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/light_elf.h b/src/light_elf.h index ca0f95e59..110030125 100644 --- a/src/light_elf.h +++ b/src/light_elf.h @@ -117,7 +117,7 @@ typedef struct elf32_note { #define EI_DATA 5 #ifdef _cplusplus -extern "C" } +} #endif #endif /* elf.h */ From 76f5edaca36100c272052f68d10c4254f5ad2fe8 Mon Sep 17 00:00:00 2001 From: Zaoqi Date: Fri, 20 Dec 2019 18:38:30 +0800 Subject: [PATCH 440/544] Update light_elf.h --- src/light_elf.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/light_elf.h b/src/light_elf.h index 110030125..f13b9817b 100644 --- a/src/light_elf.h +++ b/src/light_elf.h @@ -26,7 +26,7 @@ #include -#ifdef _cplusplus +#ifdef __cplusplus extern "C" { #endif @@ -116,7 +116,7 @@ typedef struct elf32_note { #define EI_CLASS 4 #define EI_DATA 5 -#ifdef _cplusplus +#ifdef __cplusplus } #endif From c7289b6e91331d30959c3ee7f33f0048db29bde1 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 5 Jan 2020 20:58:35 +0000 Subject: [PATCH 441/544] Happy New Year [ci skip] --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 01559aaf0..bfef707c2 100644 --- a/LICENSE +++ b/LICENSE @@ -7,7 +7,7 @@ does NOT apply to the contents of AppImages that anyone may create. Software contained inside an AppImage may be licensed under any license at the discretion of the respecive rights holder(s). -Copyright (c) 2004-18 Simon Peter +Copyright (c) 2004-20 Simon Peter Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From f79c15ddc2e0555121ec5d4e21022fa9ae10585a Mon Sep 17 00:00:00 2001 From: probonopd Date: Tue, 10 Mar 2020 17:56:54 +0000 Subject: [PATCH 442/544] 0755 permissions for directories, addresses #1032 https://github.com/AppImage/AppImageKit/issues/1032#issuecomment-597050268 --- src/runtime.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index a4f039944..107b6e7f6 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -194,7 +194,7 @@ mkdir_p(const char* const path) /* Temporarily truncate */ *p = '\0'; - if (mkdir(_path, S_IRWXU) != 0) { + if (mkdir(_path, 0755) != 0) { if (errno != EEXIST) return -1; } @@ -203,7 +203,7 @@ mkdir_p(const char* const path) } } - if (mkdir(_path, S_IRWXU) != 0) { + if (mkdir(_path, 0755) != 0) { if (errno != EEXIST) return -1; } From df8b13c19e569a6db0b9d186c81dd1ae4afbf58a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 8 May 2020 11:49:30 +0200 Subject: [PATCH 443/544] Fix #1047 --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index c340e0d73..aa47a87f9 100644 --- a/README.md +++ b/README.md @@ -190,7 +190,6 @@ On the oldest still-supported Ubuntu LTS release (at this point, 14.04): ``` git clone --single-branch --recursive https://github.com/AppImage/AppImageKit cd AppImageKit/ -sudo bash -ex install-build-deps.sh bash -ex build.sh ``` From cd161a9a1796eb0a324bed6d8bae9dbe342778be Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 11 Jun 2020 17:00:41 +0200 Subject: [PATCH 444/544] Fix section flag setting --- src/build-runtime.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index 1b59dd875..dc9717506 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -86,21 +86,21 @@ add_custom_command( ) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.2.o - COMMAND ${OBJCOPY} --add-section .upd_info=1024_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.1.o runtime.2.o + COMMAND ${OBJCOPY} --add-section .upd_info=1024_blank_bytes --set-section-flags .upd_info=noload,readonly runtime.1.o runtime.2.o MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/runtime.1.o DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.3.o - COMMAND ${OBJCOPY} --add-section .sha256_sig=1024_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.2.o runtime.3.o + COMMAND ${OBJCOPY} --add-section .sha256_sig=1024_blank_bytes --set-section-flags .sha256_sig=noload,readonly runtime.2.o runtime.3.o MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/runtime.2.o DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o - COMMAND ${OBJCOPY} --add-section .sig_key=8192_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.3.o runtime.4.o + COMMAND ${OBJCOPY} --add-section .sig_key=8192_blank_bytes --set-section-flags .sig_key=noload,readonly runtime.3.o runtime.4.o MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/runtime.3.o DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/8192_blank_bytes WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} From bfc6d914f03f618301fd5877b12a4cfaa1e91983 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 11 Jun 2020 17:03:02 +0200 Subject: [PATCH 445/544] Embed $VERSION into desktop file if custom filename is specified --- src/appimagetool.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 75520cbe8..2d5a4ab04 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -719,24 +719,28 @@ main (int argc, char *argv[]) /* No destination has been specified, to let's construct one * TODO: Find out the architecture and use a $VERSION that might be around in the env */ char dest_path[PATH_MAX]; - sprintf(dest_path, "%s-%s.AppImage", app_name_for_filename, arch); + // if $VERSION is specified, we embed it into the filename if (version_env != NULL) { sprintf(dest_path, "%s-%s-%s.AppImage", app_name_for_filename, version_env, arch); - - // set VERSION in desktop file and save it - g_key_file_set_string(kf, G_KEY_FILE_DESKTOP_GROUP, "X-AppImage-Version", version_env); - - if (!g_key_file_save_to_file(kf, desktop_file, NULL)) { - fprintf(stderr, "Could not save modified desktop file\n"); - exit(1); - } + } else { + sprintf(dest_path, "%s-%s.AppImage", app_name_for_filename, arch); } destination = strdup(dest_path); replacestr(destination, " ", "_"); } + // if $VERSION is specified, we embed its value into the desktop file + if (version_env != NULL) { + g_key_file_set_string(kf, G_KEY_FILE_DESKTOP_GROUP, "X-AppImage-Version", version_env); + + if (!g_key_file_save_to_file(kf, desktop_file, NULL)) { + fprintf(stderr, "Could not save modified desktop file\n"); + exit(1); + } + } + fprintf (stdout, "%s should be packaged as %s\n", source, destination); /* Check if the Icon file is how it is expected */ gchar* icon_name = get_desktop_entry(kf, "Icon"); From e6e6d35b6590a6e16174370de6a47dddb2a4740f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 28 Jun 2020 14:47:47 +0200 Subject: [PATCH 446/544] Use mksquashfs instead of downloading during the build. --- cmake/dependencies.cmake | 82 +++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 685a86ff3..b5d7812f1 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -30,49 +30,55 @@ set(CFLAGS ${DEPENDENCIES_CFLAGS}) set(CPPFLAGS ${DEPENDENCIES_CPPFLAGS}) set(LDFLAGS ${DEPENDENCIES_LDFLAGS}) +set(USE_SYSTEM_MKSQUASHFS OFF CACHE BOOL "Use system mksquashfs instead of downloading and building our own") + +if(NOT USE_SYSTEM_MKSQUASHFS) + # TODO: allow using system wide mksquashfs + set(mksquashfs_cflags "-DXZ_SUPPORT ${CFLAGS}") + + if(NOT xz_LIBRARIES OR xz_LIBRARIES STREQUAL "") + message(FATAL_ERROR "xz_LIBRARIES not set") + elseif(xz_LIBRARIES MATCHES "\\.a$") + set(mksquashfs_ldflags "${xz_LIBRARIES}") + else() + set(mksquashfs_ldflags "-l${xz_LIBRARIES}") + endif() -# TODO: allow using system wide mksquashfs -set(mksquashfs_cflags "-DXZ_SUPPORT ${CFLAGS}") + if(xz_INCLUDE_DIRS) + set(mksquashfs_cflags "${mksquashfs_cflags} -I${xz_INCLUDE_DIRS}") + endif() + if(xz_LIBRARY_DIRS) + set(mksquashfs_ldflags "${mksquashfs_ldflags} -L${xz_LIBRARY_DIRS}") + endif() -if(NOT xz_LIBRARIES OR xz_LIBRARIES STREQUAL "") - message(FATAL_ERROR "xz_LIBRARIES not set") -elseif(xz_LIBRARIES MATCHES "\\.a$") - set(mksquashfs_ldflags "${xz_LIBRARIES}") + ExternalProject_Add(mksquashfs + GIT_REPOSITORY https://github.com/plougher/squashfs-tools/ + GIT_TAG 4.4 + UPDATE_COMMAND "" # Make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time + CONFIGURE_COMMAND ${SED} -i "s|CFLAGS += -DXZ_SUPPORT|CFLAGS += ${mksquashfs_cflags}|g" /squashfs-tools/Makefile + COMMAND ${SED} -i "s|LIBS += -llzma|LIBS += -Bstatic ${mksquashfs_ldflags}|g" /squashfs-tools/Makefile + COMMAND ${SED} -i "s|install: mksquashfs unsquashfs|install: mksquashfs|g" squashfs-tools/Makefile + COMMAND ${SED} -i "/cp unsquashfs/d" squashfs-tools/Makefile + BUILD_COMMAND env CC=${CC} CXX=${CXX} LDFLAGS=${LDFLAGS} ${MAKE} -C squashfs-tools/ XZ_SUPPORT=1 mksquashfs + # ${MAKE} install unfortunately expects unsquashfs to be built as well, hence can't install the binary + # therefore using built file in SOURCE_DIR + # TODO: implement building out of source + BUILD_IN_SOURCE ON + INSTALL_COMMAND ${MAKE} -C squashfs-tools/ install INSTALL_DIR= + ) + + ExternalProject_Get_Property(mksquashfs INSTALL_DIR) + set(mksquashfs_INSTALL_DIR "${INSTALL_DIR}") + mark_as_advanced(mksquashfs_INSTALL_DIR) + + # for later use when packaging as an AppImage + set(mksquashfs_BINARY "${mksquashfs_INSTALL_DIR}/mksquashfs") + mark_as_advanced(mksquashfs_BINARY) else() - set(mksquashfs_ldflags "-l${xz_LIBRARIES}") -endif() + message(STATUS "Using system mksquashfs") -if(xz_INCLUDE_DIRS) - set(mksquashfs_cflags "${mksquashfs_cflags} -I${xz_INCLUDE_DIRS}") + set(mksquashfs_BINARY "mksquashfs") endif() -if(xz_LIBRARY_DIRS) - set(mksquashfs_ldflags "${mksquashfs_ldflags} -L${xz_LIBRARY_DIRS}") -endif() - -ExternalProject_Add(mksquashfs - GIT_REPOSITORY https://github.com/plougher/squashfs-tools/ - GIT_TAG 4.4 - UPDATE_COMMAND "" # Make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time - CONFIGURE_COMMAND ${SED} -i "s|CFLAGS += -DXZ_SUPPORT|CFLAGS += ${mksquashfs_cflags}|g" /squashfs-tools/Makefile - COMMAND ${SED} -i "s|LIBS += -llzma|LIBS += -Bstatic ${mksquashfs_ldflags}|g" /squashfs-tools/Makefile - COMMAND ${SED} -i "s|install: mksquashfs unsquashfs|install: mksquashfs|g" squashfs-tools/Makefile - COMMAND ${SED} -i "/cp unsquashfs/d" squashfs-tools/Makefile - BUILD_COMMAND env CC=${CC} CXX=${CXX} LDFLAGS=${LDFLAGS} ${MAKE} -C squashfs-tools/ XZ_SUPPORT=1 mksquashfs - # ${MAKE} install unfortunately expects unsquashfs to be built as well, hence can't install the binary - # therefore using built file in SOURCE_DIR - # TODO: implement building out of source - BUILD_IN_SOURCE ON - INSTALL_COMMAND ${MAKE} -C squashfs-tools/ install INSTALL_DIR= -) - -ExternalProject_Get_Property(mksquashfs INSTALL_DIR) -set(mksquashfs_INSTALL_DIR "${INSTALL_DIR}") -mark_as_advanced(mksquashfs_INSTALL_DIR) - -# for later use when packaging as an AppImage -set(mksquashfs_BINARY "${mksquashfs_INSTALL_DIR}/mksquashfs") -mark_as_advanced(mksquashfs_BINARY) - #### build dependency configuration #### From 9d02de75e3cb0f9935d4bcb55c2becd93755a484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 28 Jun 2020 18:06:37 +0200 Subject: [PATCH 447/544] Don't install mksquashfs when using the system one. --- src/CMakeLists.txt | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0228e0829..a621c83a8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -117,18 +117,20 @@ target_link_libraries(digest_md5 # install binaries -if(AUXILIARY_FILES_DESTINATION) - install( - PROGRAMS ${mksquashfs_INSTALL_DIR}/mksquashfs ${CMAKE_CURRENT_BINARY_DIR}/runtime - DESTINATION ${AUXILIARY_FILES_DESTINATION} - COMPONENT applications - ) -else() - install( - PROGRAMS ${mksquashfs_INSTALL_DIR}/mksquashfs ${CMAKE_CURRENT_BINARY_DIR}/runtime - DESTINATION bin - COMPONENT applications - ) +if(NOT USE_SYSTEM_MKSQUASHFS) + if(AUXILIARY_FILES_DESTINATION) + install( + PROGRAMS ${mksquashfs_INSTALL_DIR}/mksquashfs ${CMAKE_CURRENT_BINARY_DIR}/runtime + DESTINATION ${AUXILIARY_FILES_DESTINATION} + COMPONENT applications + ) + else() + install( + PROGRAMS ${mksquashfs_INSTALL_DIR}/mksquashfs ${CMAKE_CURRENT_BINARY_DIR}/runtime + DESTINATION bin + COMPONENT applications + ) + endif() endif() set(optional_targets "") From 15de5b6659c9e7ccac32a4342abc21e1a4765d00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 5 Jul 2020 14:51:50 +0200 Subject: [PATCH 448/544] Add a warning. --- cmake/dependencies.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index b5d7812f1..6c48e817f 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -30,7 +30,7 @@ set(CFLAGS ${DEPENDENCIES_CFLAGS}) set(CPPFLAGS ${DEPENDENCIES_CPPFLAGS}) set(LDFLAGS ${DEPENDENCIES_LDFLAGS}) -set(USE_SYSTEM_MKSQUASHFS OFF CACHE BOOL "Use system mksquashfs instead of downloading and building our own") +set(USE_SYSTEM_MKSQUASHFS OFF CACHE BOOL "Use system mksquashfs instead of downloading and building our own. Warning: you need a recent version otherwise it might not work as intended.") if(NOT USE_SYSTEM_MKSQUASHFS) # TODO: allow using system wide mksquashfs From 884e2ee8d3e7fbcf1b2d7b145e5c7ac4f4bcc712 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 5 Jul 2020 14:52:49 +0200 Subject: [PATCH 449/544] Resolve the TODO. --- cmake/dependencies.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 6c48e817f..d953e2bdc 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -33,7 +33,6 @@ set(LDFLAGS ${DEPENDENCIES_LDFLAGS}) set(USE_SYSTEM_MKSQUASHFS OFF CACHE BOOL "Use system mksquashfs instead of downloading and building our own. Warning: you need a recent version otherwise it might not work as intended.") if(NOT USE_SYSTEM_MKSQUASHFS) - # TODO: allow using system wide mksquashfs set(mksquashfs_cflags "-DXZ_SUPPORT ${CFLAGS}") if(NOT xz_LIBRARIES OR xz_LIBRARIES STREQUAL "") From c63c0fbf048116236743b28e43ba53dc26eed60a Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Sun, 22 Nov 2020 15:44:56 +0300 Subject: [PATCH 450/544] fix: remove unused import stdlib.h --- src/appimagetool.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 2d5a4ab04..3831e3dee 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -37,7 +37,6 @@ #include #include -#include #include #include "squashfuse.h" From 1bd63cd21186e76098703f183e63ceea747acda7 Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Sat, 5 Dec 2020 22:23:10 +0300 Subject: [PATCH 451/544] ci: add GitHub Actions CI --- .github/workflows/build.yml | 104 ++++++++++++++++++++++++++++++++++++ travis/travis-build.sh | 6 +-- 2 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..184e7b48d --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,104 @@ +name: Build + +on: + push: + branches: + - 'master' + pull_request: + + +jobs: + Build: + name: Build appimagetool + runs-on: ubuntu-20.04 + strategy: + matrix: + include: + - ARCH: 'x86_64' + docker-container: 'appimagebuild' + - ARCH: 'i386' + docker-container: 'appimagebuild-i386' + - ARCH: 'armhf' + docker-container: 'appimagebuild-armhf-cross' + - ARCH: 'aarch64' + docker-container: 'appimagebuild-aarch64-cross' + fail-fast: false + env: + DOCKER_IMAGE: quay.io/appimage/${{ matrix.docker-container }} + ARCH: ${{ matrix.ARCH }} + + steps: + - uses: actions/checkout@v2 + with: + submodules: true + + - name: Install dependencies for ARM and AARCH64 + if: endsWith(matrix.docker-container, 'cross') + run: | + sudo apt-get update + sudo apt-get -y install binfmt-support qemu-user-static + + - name: Build + run: | + bash -ex travis/travis-build.sh + + - name: List files + run: | + ls -lh out/* + ls -lh build/out/* + + - name: Upload artifact + uses: actions/upload-artifact@v1.0.0 + with: + # Artifact name + name: appimagetool-${{ matrix.ARCH }}.AppImage.zip + path: build/out + + + Release: + needs: [Build] + runs-on: ubuntu-latest + + steps: + - uses: actions/download-artifact@v1 + with: + name: appimagetool-x86_64.AppImage.zip + - uses: actions/download-artifact@v1 + with: + name: appimagetool-i386.AppImage.zip + - uses: actions/download-artifact@v1 + with: + name: appimagetool-armhf.AppImage.zip + - uses: actions/download-artifact@v1 + with: + name: appimagetool-aarch64.AppImage.zip + + - name: Continuous Release + uses: marvinpinto/action-automatic-releases@latest + if: github.ref == 'refs/heads/master' && startsWith(github.ref, 'refs/tags/') != true + with: + prerelease: true + draft: false + automatic_release_tag: continuous + title: continuous + files: | + appimagetool-x86_64.AppImage.zip + appimagetool-i386.AppImage.zip + appimagetool-armhf.AppImage.zip + appimagetool-aarch64.AppImage.zip + repo_token: ${{ secrets.GITHUB_TOKEN }} + + - name: Tagged Release + uses: marvinpinto/action-automatic-releases@latest + if: startsWith(github.ref, 'refs/tags/v') + with: + prerelease: false + draft: true + automatic_release_tag: true + files: | + appimagetool-x86_64.AppImage.zip + appimagetool-i386.AppImage.zip + appimagetool-armhf.AppImage.zip + appimagetool-aarch64.AppImage.zip + repo_token: ${{ secrets.GITHUB_TOKEN }} + diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 3c0e4749c..e558c41d5 100755 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -31,7 +31,7 @@ mkdir -p ./out/ # build AppImageKit docker run --rm \ --device /dev/fuse:mrw \ - -e ARCH -e TRAVIS -e TRAVIS_BUILD_NUMBER \ + -e ARCH \ -i \ -v "${PWD}":/AppImageKit \ -v "${PWD}"/travis/:/travis \ @@ -45,7 +45,7 @@ find build/out/appimagetool.AppDir/ docker run --rm \ --cap-add SYS_ADMIN \ --device /dev/fuse:mrw \ - -e ARCH -e TRAVIS -e TRAVIS_BUILD_NUMBER \ + -e ARCH \ -i \ -v "${PWD}":/AppImageKit \ -v "${PWD}"/travis/:/travis \ @@ -64,7 +64,7 @@ cd build/ sudo apt-get install vim-common # fix permissions -sudo chown -R travis.travis . +sudo chown -R runner.runner . # remove binaries from output directory ls -al out/ From 3a5e13ad73e8b10ff158623de923211c3a41ff20 Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Sun, 6 Dec 2020 14:50:57 +0300 Subject: [PATCH 452/544] ci: remove ls -lh out/ --- .github/workflows/build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 184e7b48d..100768ec8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -44,7 +44,6 @@ jobs: - name: List files run: | - ls -lh out/* ls -lh build/out/* - name: Upload artifact From 260b30c3804868eb8e7aa3200756a97b278cda13 Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Sun, 6 Dec 2020 15:11:40 +0300 Subject: [PATCH 453/544] ci: add i386 arch and do apt update --- .github/workflows/build.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 100768ec8..f6e691601 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,7 +39,12 @@ jobs: sudo apt-get -y install binfmt-support qemu-user-static - name: Build + shell: bash run: | + if [[ "$ARCH" == "i386" ]]; then + sudo dpkg --add-architecture i386 + sudo apt-get update + fi bash -ex travis/travis-build.sh - name: List files From 375ffed6ad163f67606396f0a6b270063282eba9 Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Fri, 11 Dec 2020 21:31:21 +0300 Subject: [PATCH 454/544] ci: optimize download-action by calling them only once. download-action automatically downloads all the releases when called without a name param --- .github/workflows/build.yml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f6e691601..13ad13bcb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -64,18 +64,8 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/download-artifact@v1 - with: - name: appimagetool-x86_64.AppImage.zip - - uses: actions/download-artifact@v1 - with: - name: appimagetool-i386.AppImage.zip - - uses: actions/download-artifact@v1 - with: - name: appimagetool-armhf.AppImage.zip - - uses: actions/download-artifact@v1 - with: - name: appimagetool-aarch64.AppImage.zip + - name: Download Artifact + uses: actions/download-artifact@v1 - name: Continuous Release uses: marvinpinto/action-automatic-releases@latest From e3d98c6d77f570cee1818152ff3634e468dfb564 Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Fri, 11 Dec 2020 21:38:47 +0300 Subject: [PATCH 455/544] ci: remove .travis.yml --- .travis.yml | 63 ----------------------------------------------------- 1 file changed, 63 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index f59d0763e..000000000 --- a/.travis.yml +++ /dev/null @@ -1,63 +0,0 @@ -language: c -sudo: required - -services: - - docker - -matrix: - include: - - env: ARCH=x86_64 DOCKER_IMAGE=quay.io/appimage/appimagebuild - - env: ARCH=i686 DOCKER_IMAGE=quay.io/appimage/appimagebuild-i386 - - env: ARCH=armhf DOCKER_IMAGE=quay.io/appimage/appimagebuild-armhf-cross - addons: - apt: - update: true - packages: - # install binfmt support system-wide (for use in Docker containers) - - binfmt-support - # sets up the required binfmt interpreters so that qemu will actually be used (for use in Docker containers) - - qemu-user-static - - env: ARCH=aarch64 DOCKER_IMAGE=quay.io/appimage/appimagebuild-aarch64-cross - addons: - apt: - update: true - packages: - # install binfmt support system-wide (for use in Docker containers) - - binfmt-support - # sets up the required binfmt interpreters so that qemu will actually be used (for use in Docker containers) - - qemu-user-static - -script: - - bash travis/travis-build.sh - - -after_success: - - ls -lh out/* # <= wrong line: see https://travis-ci.org/AppImage/AppImageKit/jobs/347965050#L4211 - - ls -lh build/out/* - - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh - # make sure only pushes to rewrite create a new release, otherwise pretend PR and upload to transfer.sh - - if [ "$TRAVIS_BRANCH" != "$TRAVIS_TAG" ] && [ "$TRAVIS_BRANCH" != "master" ]; then export TRAVIS_EVENT_TYPE=pull_request; fi - - bash ./upload.sh build/out/* - -notifications: - irc: - channels: - - "chat.freenode.net#AppImage" - on_success: always # options: [always|never|change] default: always - on_failure: always # options: [always|never|change] default: always - on_start: always # options: [always|never|change] default: always - template: - - "%{repository} build %{build_number}: %{result} %{build_url}" - use_notice: true - # skip_join: true - webhooks: - urls: - - https://webhooks.gitter.im/e/4bf20518805a55998cc2 - on_success: always # options: [always|never|change] default: always - on_failure: always # options: [always|never|change] default: always - on_start: always # options: [always|never|change] default: always - -branches: - except: - - # Do not build tags that we create when we upload to GitHub Releases - - /^(?i:continuous)$/ From b56378bc6ab15b58e6ece7a75d6e43439441dc65 Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Fri, 11 Dec 2020 21:39:14 +0300 Subject: [PATCH 456/544] ci: rename travis directory to ci --- .github/workflows/build.yml | 2 +- {travis => ci}/build-appimage.sh | 0 {travis => ci}/build-binaries.sh | 0 travis/travis-build.sh => ci/ci-build.sh | 0 {travis => ci}/test-appimage.sh | 0 5 files changed, 1 insertion(+), 1 deletion(-) rename {travis => ci}/build-appimage.sh (100%) rename {travis => ci}/build-binaries.sh (100%) rename travis/travis-build.sh => ci/ci-build.sh (100%) rename {travis => ci}/test-appimage.sh (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 13ad13bcb..0688db5c5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,7 +45,7 @@ jobs: sudo dpkg --add-architecture i386 sudo apt-get update fi - bash -ex travis/travis-build.sh + bash -ex ci/ci-build.sh - name: List files run: | diff --git a/travis/build-appimage.sh b/ci/build-appimage.sh similarity index 100% rename from travis/build-appimage.sh rename to ci/build-appimage.sh diff --git a/travis/build-binaries.sh b/ci/build-binaries.sh similarity index 100% rename from travis/build-binaries.sh rename to ci/build-binaries.sh diff --git a/travis/travis-build.sh b/ci/ci-build.sh similarity index 100% rename from travis/travis-build.sh rename to ci/ci-build.sh diff --git a/travis/test-appimage.sh b/ci/test-appimage.sh similarity index 100% rename from travis/test-appimage.sh rename to ci/test-appimage.sh From 218a68eb14612f60a2bd69331a80e7798fa1186c Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Fri, 11 Dec 2020 21:41:51 +0300 Subject: [PATCH 457/544] ci: rename docker-container to docker-image sed -i 's,docker-container,docker-image,g' .github/workflows/build.yml --- .github/workflows/build.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0688db5c5..04d6d1d81 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,16 +15,16 @@ jobs: matrix: include: - ARCH: 'x86_64' - docker-container: 'appimagebuild' + docker-image: 'appimagebuild' - ARCH: 'i386' - docker-container: 'appimagebuild-i386' + docker-image: 'appimagebuild-i386' - ARCH: 'armhf' - docker-container: 'appimagebuild-armhf-cross' + docker-image: 'appimagebuild-armhf-cross' - ARCH: 'aarch64' - docker-container: 'appimagebuild-aarch64-cross' + docker-image: 'appimagebuild-aarch64-cross' fail-fast: false env: - DOCKER_IMAGE: quay.io/appimage/${{ matrix.docker-container }} + DOCKER_IMAGE: quay.io/appimage/${{ matrix.docker-image }} ARCH: ${{ matrix.ARCH }} steps: @@ -33,7 +33,7 @@ jobs: submodules: true - name: Install dependencies for ARM and AARCH64 - if: endsWith(matrix.docker-container, 'cross') + if: endsWith(matrix.docker-image, 'cross') run: | sudo apt-get update sudo apt-get -y install binfmt-support qemu-user-static From 000eefddca9249a8bfe70ee979aeee669438f01c Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Fri, 11 Dec 2020 23:30:11 +0300 Subject: [PATCH 458/544] ci: format build.yml --- .github/workflows/build.yml | 109 ++++++++++++++++++------------------ 1 file changed, 55 insertions(+), 54 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 04d6d1d81..9e5c4a0ce 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,35 +28,35 @@ jobs: ARCH: ${{ matrix.ARCH }} steps: - - uses: actions/checkout@v2 - with: - submodules: true + - uses: actions/checkout@v2 + with: + submodules: true - - name: Install dependencies for ARM and AARCH64 - if: endsWith(matrix.docker-image, 'cross') - run: | - sudo apt-get update - sudo apt-get -y install binfmt-support qemu-user-static - - - name: Build - shell: bash - run: | - if [[ "$ARCH" == "i386" ]]; then - sudo dpkg --add-architecture i386 + - name: Install dependencies for ARM and AARCH64 + if: endsWith(matrix.docker-image, 'cross') + run: | sudo apt-get update - fi - bash -ex ci/ci-build.sh + sudo apt-get -y install binfmt-support qemu-user-static + + - name: Build + shell: bash + run: | + if [[ "$ARCH" == "i386" ]]; then + sudo dpkg --add-architecture i386 + sudo apt-get update + fi + bash -ex ci/ci-build.sh - - name: List files - run: | - ls -lh build/out/* + - name: List files + run: | + ls -lh build/out/* - - name: Upload artifact - uses: actions/upload-artifact@v1.0.0 - with: - # Artifact name - name: appimagetool-${{ matrix.ARCH }}.AppImage.zip - path: build/out + - name: Upload artifact + uses: actions/upload-artifact@v1.0.0 + with: + # Artifact name + name: appimagetool-${{ matrix.ARCH }}.AppImage.zip + path: build/out Release: @@ -64,35 +64,36 @@ jobs: runs-on: ubuntu-latest steps: - - name: Download Artifact - uses: actions/download-artifact@v1 + - name: Download Artifact + uses: actions/download-artifact@v1 + + - name: Continuous Release + uses: marvinpinto/action-automatic-releases@latest + if: github.ref == 'refs/heads/master' && startsWith(github.ref, 'refs/tags/') != true + with: + prerelease: true + draft: false + automatic_release_tag: continuous + title: continuous + files: | + appimagetool-x86_64.AppImage.zip + appimagetool-i386.AppImage.zip + appimagetool-armhf.AppImage.zip + appimagetool-aarch64.AppImage.zip + repo_token: ${{ secrets.GITHUB_TOKEN }} - - name: Continuous Release - uses: marvinpinto/action-automatic-releases@latest - if: github.ref == 'refs/heads/master' && startsWith(github.ref, 'refs/tags/') != true - with: - prerelease: true - draft: false - automatic_release_tag: continuous - title: continuous - files: | - appimagetool-x86_64.AppImage.zip - appimagetool-i386.AppImage.zip - appimagetool-armhf.AppImage.zip - appimagetool-aarch64.AppImage.zip - repo_token: ${{ secrets.GITHUB_TOKEN }} + - name: Tagged Release + uses: marvinpinto/action-automatic-releases@latest + if: startsWith(github.ref, 'refs/tags/v') + with: + prerelease: false + draft: true + automatic_release_tag: true + files: | + appimagetool-x86_64.AppImage.zip + appimagetool-i386.AppImage.zip + appimagetool-armhf.AppImage.zip + appimagetool-aarch64.AppImage.zip + repo_token: ${{ secrets.GITHUB_TOKEN }} - - name: Tagged Release - uses: marvinpinto/action-automatic-releases@latest - if: startsWith(github.ref, 'refs/tags/v') - with: - prerelease: false - draft: true - automatic_release_tag: true - files: | - appimagetool-x86_64.AppImage.zip - appimagetool-i386.AppImage.zip - appimagetool-armhf.AppImage.zip - appimagetool-aarch64.AppImage.zip - repo_token: ${{ secrets.GITHUB_TOKEN }} From 9caf23ec33d59645c3661e806bb60c159c8cea74 Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Fri, 11 Dec 2020 23:33:58 +0300 Subject: [PATCH 459/544] ci: use pyuploadtool instead of marvinpinto/automatic-release-action --- .github/workflows/build.yml | 36 +++++++----------------------------- 1 file changed, 7 insertions(+), 29 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9e5c4a0ce..50363723a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -55,7 +55,7 @@ jobs: uses: actions/upload-artifact@v1.0.0 with: # Artifact name - name: appimagetool-${{ matrix.ARCH }}.AppImage.zip + name: appimagetool-${{ matrix.ARCH }}.build.zip path: build/out @@ -68,32 +68,10 @@ jobs: uses: actions/download-artifact@v1 - name: Continuous Release - uses: marvinpinto/action-automatic-releases@latest - if: github.ref == 'refs/heads/master' && startsWith(github.ref, 'refs/tags/') != true - with: - prerelease: true - draft: false - automatic_release_tag: continuous - title: continuous - files: | - appimagetool-x86_64.AppImage.zip - appimagetool-i386.AppImage.zip - appimagetool-armhf.AppImage.zip - appimagetool-aarch64.AppImage.zip - repo_token: ${{ secrets.GITHUB_TOKEN }} - - - name: Tagged Release - uses: marvinpinto/action-automatic-releases@latest - if: startsWith(github.ref, 'refs/tags/v') - with: - prerelease: false - draft: true - automatic_release_tag: true - files: | - appimagetool-x86_64.AppImage.zip - appimagetool-i386.AppImage.zip - appimagetool-armhf.AppImage.zip - appimagetool-aarch64.AppImage.zip - repo_token: ${{ secrets.GITHUB_TOKEN }} - + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + wget -q https://github.com/TheAssassin/pyuploadtool/releases/download/continuous/pyuploadtool-x86_64.AppImage + chmod +x pyuploadtool-x86_64.AppImage + ./pyuploadtool-x86_64.AppImage **/appimagetool*.AppImage* From 7c471b243347199edf1c222ec41e2c5e1d07dff9 Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Sat, 12 Dec 2020 17:55:34 +0300 Subject: [PATCH 460/544] ci: run builds on workflow_dispatch https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows\#workflow_dispatch --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 50363723a..61244c5d0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,6 +5,7 @@ on: branches: - 'master' pull_request: + workflow_dispatch: jobs: From 3057a7b099c55626a0608129cb4f8d37700e7e05 Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Mon, 14 Dec 2020 07:26:31 +0300 Subject: [PATCH 461/544] ci: fix: use ubuntu-latest instead of ubuntu-20.04 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 61244c5d0..3853704ee 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,7 +11,7 @@ on: jobs: Build: name: Build appimagetool - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest strategy: matrix: include: From d2d3c68ceb581f6b548a825f11307173f7dc1257 Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Mon, 14 Dec 2020 07:35:03 +0300 Subject: [PATCH 462/544] ci: use multiarch/qemu-user-static over docker instead of depending on ubuntu's package repos --- .github/workflows/build.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3853704ee..219229969 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,11 +33,8 @@ jobs: with: submodules: true - - name: Install dependencies for ARM and AARCH64 - if: endsWith(matrix.docker-image, 'cross') - run: | - sudo apt-get update - sudo apt-get -y install binfmt-support qemu-user-static + - name: Set up QEMU integration for Docker + run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - name: Build shell: bash From 35a2a030aa3fbe4a79f4866a5b0f02d54664cd0e Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Mon, 14 Dec 2020 07:35:28 +0300 Subject: [PATCH 463/544] ci: do not explicitly specify the shell --- .github/workflows/build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 219229969..4e97a59a3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,7 +37,6 @@ jobs: run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - name: Build - shell: bash run: | if [[ "$ARCH" == "i386" ]]; then sudo dpkg --add-architecture i386 From b83a6f4144fb1e95f494ea87b5245da409df253e Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Mon, 14 Dec 2020 07:49:03 +0300 Subject: [PATCH 464/544] ci: remove the .zip extension on uploaded artifacts --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4e97a59a3..54af76a33 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -52,7 +52,7 @@ jobs: uses: actions/upload-artifact@v1.0.0 with: # Artifact name - name: appimagetool-${{ matrix.ARCH }}.build.zip + name: appimagetool-${{ matrix.ARCH }}.build path: build/out From da70aa88f900d7574b332559fdef12e72bee260b Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Mon, 14 Dec 2020 07:53:10 +0300 Subject: [PATCH 465/544] ci: use a more descriptive name for the run Co-authored by: TheAssassin --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 54af76a33..82cbdc634 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -64,7 +64,7 @@ jobs: - name: Download Artifact uses: actions/download-artifact@v1 - - name: Continuous Release + - name: Create release and upload artifacts env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | From 6917b9feaf40b7fd754557411337276a149511be Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 08:06:04 +0100 Subject: [PATCH 466/544] Improve actions workflow Added a few things from the other build scripts, made job names lower case. Changed the build script file name to the future name, and removed a soon-to-be-obsolete hack. --- .github/workflows/build.yml | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 82cbdc634..62030d77e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,10 +9,11 @@ on: jobs: - Build: + build: name: Build appimagetool runs-on: ubuntu-latest strategy: + fail-fast: false matrix: include: - ARCH: 'x86_64' @@ -23,7 +24,7 @@ jobs: docker-image: 'appimagebuild-armhf-cross' - ARCH: 'aarch64' docker-image: 'appimagebuild-aarch64-cross' - fail-fast: false + env: DOCKER_IMAGE: quay.io/appimage/${{ matrix.docker-image }} ARCH: ${{ matrix.ARCH }} @@ -38,11 +39,7 @@ jobs: - name: Build run: | - if [[ "$ARCH" == "i386" ]]; then - sudo dpkg --add-architecture i386 - sudo apt-get update - fi - bash -ex ci/ci-build.sh + bash -ex ci/build-in-docker.sh - name: List files run: | @@ -56,14 +53,15 @@ jobs: path: build/out - Release: - needs: [Build] + upload: + needs: [build] runs-on: ubuntu-latest steps: - - name: Download Artifact + - name: Download Artifacts uses: actions/download-artifact@v1 - + - name: Inspect directory after downloading artifacts + run: ls -alFR - name: Create release and upload artifacts env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 6751f31d5804cf5f7b87730d7f3447dc575339a6 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 13:29:39 +0100 Subject: [PATCH 467/544] Update ignore patterns --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5fd78af1e..1bfa344b4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ cmake-build-*/ .idea/ Testing/ +*.swp From be4b51e2d00e524b048f290e9293e951cae60af3 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 13:37:22 +0100 Subject: [PATCH 468/544] Improve all build related scripts --- build-appdir.sh | 48 ------ ci/build-appdir.sh | 72 +++++++++ ci/build-appimage.sh | 19 --- ci/build-binaries-and-appimage.sh | 97 ++++++++++++ ci/build-binaries.sh | 13 -- ci/build-in-docker.sh | 48 ++++++ ci/ci-build.sh | 142 +++++++++++------- ci/test-appimage.sh | 33 +++- .../test-appimagetool.sh | 64 +++++--- 9 files changed, 380 insertions(+), 156 deletions(-) delete mode 100644 build-appdir.sh create mode 100755 ci/build-appdir.sh delete mode 100755 ci/build-appimage.sh create mode 100755 ci/build-binaries-and-appimage.sh delete mode 100755 ci/build-binaries.sh create mode 100755 ci/build-in-docker.sh rename test-appimagetool.sh => ci/test-appimagetool.sh (68%) diff --git a/build-appdir.sh b/build-appdir.sh deleted file mode 100644 index 1e8490dfd..000000000 --- a/build-appdir.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash - -set -e -set -x - - -####################################################################### - -# build AppImageTool AppDir -APPIMAGETOOL_APPDIR=appdirs/appimagetool.AppDir - -rm -rf "$APPIMAGETOOL_APPDIR" || true - -# Run make install only for the 'appimagetool.AppImage' component to deploy appimagetools files to -# the $APPIMAGETOOL_APPDIR -DESTDIR="$APPIMAGETOOL_APPDIR" cmake -DCOMPONENT=appimagetool -P cmake_install.cmake - -mkdir -p "$APPIMAGETOOL_APPDIR"/usr/lib/appimagekit/ - -# Copy AppDir specific files -cp ../resources/AppRun "$APPIMAGETOOL_APPDIR" -cp install_prefix/usr/lib/appimagekit/mksquashfs "$APPIMAGETOOL_APPDIR"/usr/lib/appimagekit/ -# prefer binaries from /deps, if available -export PATH=/deps/bin:"$PATH" -cp $(which desktop-file-validate) "$APPIMAGETOOL_APPDIR"/usr/bin/ -cp $(which zsyncmake) "$APPIMAGETOOL_APPDIR"/usr/bin/ - -cp ../resources/appimagetool.desktop "$APPIMAGETOOL_APPDIR" -cp ../resources/appimagetool.png "$APPIMAGETOOL_APPDIR"/appimagetool.png -cp "$APPIMAGETOOL_APPDIR"/appimagetool.png "$APPIMAGETOOL_APPDIR"/.DirIcon - -if [ -d /deps/ ]; then - # deploy glib - mkdir -p "$APPIMAGETOOL_APPDIR"/usr/lib/ - cp /deps/lib/lib*.so* "$APPIMAGETOOL_APPDIR"/usr/lib/ - # libffi is a runtime dynamic dependency - # see this thread for more information on the topic: - # https://mail.gnome.org/archives/gtk-devel-list/2012-July/msg00062.html - if [ "$ARCH" == "x86_64" ]; then - cp /usr/lib64/libffi.so.5 "$APPIMAGETOOL_APPDIR"/usr/lib/ - elif [ "$ARCH" == "i686" ]; then - cp /usr/lib/libffi.so.5 "$APPIMAGETOOL_APPDIR"/usr/lib/ - elif [ "$ARCH" == "armhf" ] || [ "$ARCH" == "aarch64" ]; then - cp /deps/lib/libffi.so.6 "$APPIMAGETOOL_APPDIR"/usr/lib/ - else - echo "WARNING: unknown architecture, not bundling libffi" - fi -fi diff --git a/ci/build-appdir.sh b/ci/build-appdir.sh new file mode 100755 index 000000000..951963d53 --- /dev/null +++ b/ci/build-appdir.sh @@ -0,0 +1,72 @@ +#!/bin/bash + +set -e +set -x +set -o functrace + +if [[ "$3" == "" ]]; then + echo "Usage: bash $0 " + exit 2 +fi + +# using shift makes adding/removing parameters easier +repo_root="$1" +shift +install_prefix="$1" +shift +appimagetool_appdir="$1" + +if [[ ! -d "$install_prefix" ]]; then + echo "Error: could not find install-prefix directory: $install_prefix" + exit 3 +fi + +if [[ ! -d "$repo_root" ]]; then + echo "Error: could not find repo root directory: $repo_root" + exit 4 +fi + +if [[ -d "$appimagetool_appdir" ]]; then + echo "Warning: removing existing appimagetool AppDir: $appimagetool_appdir" + rm -rf "$appimagetool_appdir" +fi + +# Run make install only for the appimagetool component to deploy appimagetools files to +# the $appimagetool_appdir +DESTDIR="$appimagetool_appdir" cmake -DCOMPONENT=appimagetool -P cmake_install.cmake + +mkdir -p "$appimagetool_appdir"/usr/lib/appimagekit/ + +# Copy AppDir specific files +cp "$repo_root"/resources/AppRun "$appimagetool_appdir" +cp "$install_prefix"/usr/lib/appimagekit/mksquashfs "$appimagetool_appdir"/usr/lib/appimagekit/ + +# prefer binaries from /deps, if available +export PATH=/deps/bin:"$PATH" +cp "$(which desktop-file-validate)" "$appimagetool_appdir"/usr/bin/ +cp "$(which zsyncmake)" "$appimagetool_appdir"/usr/bin/ + +cp "$repo_root"/resources/appimagetool.desktop "$appimagetool_appdir" +cp "$repo_root"/resources/appimagetool.png "$appimagetool_appdir"/appimagetool.png +cp "$appimagetool_appdir"/appimagetool.png "$appimagetool_appdir"/.DirIcon + +if [ -d /deps/ ]; then + # deploy GLib + mkdir -p "$appimagetool_appdir"/usr/lib/ + cp /deps/lib/lib*.so* "$appimagetool_appdir"/usr/lib/ + + # libffi is a runtime dynamic dependency + # see this thread for more information on the topic: + # https://mail.gnome.org/archives/gtk-devel-list/2012-July/msg00062.html + if [ "$ARCH" == "x86_64" ]; then + cp "$(ldconfig -p | grep libffi.so.6 | grep x86-64 | cut -d'>' -f2 | tr -d ' ')" "$appimagetool_appdir"/usr/lib/ + elif [ "$ARCH" == "i686" ]; then + cp "$(ldconfig -p | grep libffi.so.6 | grep i386 | cut -d'>' -f2 | tr -d ' ')" "$appimagetool_appdir"/usr/lib/ + elif [ "$ARCH" == "armhf" ]; then + cp "$(ldconfig -p | grep libffi.so.6 | grep arm | grep hf | cut -d'>' -f2 | tr -d ' ')" "$appimagetool_appdir"/usr/lib/ + elif [ "$ARCH" == "aarch64" ]; then + cp "$(ldconfig -p | grep libffi.so.6 | grep aarch64 | cut -d'>' -f2 | tr -d ' ')" "$appimagetool_appdir"/usr/lib/ + else + echo "WARNING: unknown architecture, not bundling libffi" + fi +fi diff --git a/ci/build-appimage.sh b/ci/build-appimage.sh deleted file mode 100755 index e8be2a257..000000000 --- a/ci/build-appimage.sh +++ /dev/null @@ -1,19 +0,0 @@ -#! /bin/bash - -set -e - -cd /AppImageKit/build - -cd out/ - -if [ "$TRAVIS_PULL_REQUEST" == "false" ] || [ "$TRAVIS_PULL_REQUEST" == "" ]; then - # Sign only when NOT on a pull request - ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -s -v \ - -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ - appimagetool-"$ARCH".AppImage -else - # Do not attempt to sign (it would fail ayway) - ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -v \ - -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ - appimagetool-"$ARCH".AppImage -fi diff --git a/ci/build-binaries-and-appimage.sh b/ci/build-binaries-and-appimage.sh new file mode 100755 index 000000000..47565da2a --- /dev/null +++ b/ci/build-binaries-and-appimage.sh @@ -0,0 +1,97 @@ +#! /bin/bash + +set -e +set -x +set -o functrace + +# make sure the prebuilt libraries in the container will be found +# (in case we're building in an AppImageBuild container) +export LD_LIBRARY_PATH=/deps/lib:"$LD_LIBRARY_PATH" +export PKG_CONFIG_PATH=/deps/lib/pkgconfig/ +export PATH=/deps/bin:"$PATH" + +# note: signing is not working at the moment +# see ci-build.sh for more information +echo "$KEY" | md5sum + +# we always build in a temporary directory +# use RAM disk if possible +if [ -d /dev/shm ] && mount | grep /dev/shm | grep -v -q noexec; then + TEMP_BASE=/dev/shm +elif [ -d /docker-ramdisk ]; then + TEMP_BASE=/docker-ramdisk +else + TEMP_BASE=/tmp +fi + +BUILD_DIR="$(mktemp -d -p "$TEMP_BASE" AppImageKit-build-XXXXXX)" + +cleanup () { + if [ -d "$BUILD_DIR" ]; then + rm -rf "$BUILD_DIR" + fi +} + +trap cleanup EXIT + +REPO_ROOT="$(readlink -f "$(dirname "${BASH_SOURCE[0]}")"/..)" +OLD_CWD="$(readlink -f .)" + +pushd "$BUILD_DIR" + +# configure build and generate build files +cmake "$REPO_ROOT" \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DBUILD_TESTING=ON \ + -DAPPIMAGEKIT_PACKAGE_DEBS=ON + +# run build +if [[ "$CI" != "" ]]; then + nproc="$(nproc)" +else + nproc="$(nproc --ignore=1)" +fi + +make -j"$nproc" + +# install so-far-built binaries into some prefix +# this way, we can test them, use them to build the AppDir later, copy stuff from there into said AppDir, ... +install_prefix="install-prefix" +make install DESTDIR="$install_prefix" + +# print first few bytes in runtime +# allows checking whether the magic bytes are in place +xxd src/runtime | head -n1 + +# strip everything *but* runtime +find "$install_prefix"/usr/bin/ -not -iname runtime -print -exec "$STRIP" "{}" \; 2>/dev/null + +# more debugging +ls -lh "$install_prefix"/usr/bin +for FILE in "$install_prefix"/usr/bin/*; do + echo "$FILE" + ldd "$FILE" || true +done + +# continue building AppDir +appdir="appimagetool.AppDir" +bash "$REPO_ROOT"/ci/build-appdir.sh "$REPO_ROOT" "$install_prefix" "$appdir" + +# list result +ls -lh +find "$install_prefix" + +# test built appimagetool +"$REPO_ROOT"/ci/test-appimagetool.sh "$REPO_ROOT" "$install_prefix"/usr/bin/appimagetool + +# seems to work -- let's build an AppImage +# we start by putting the rest of the files into the AppDir + +"$appdir"/AppRun ./appimagetool.AppDir/ -v \ + -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ + appimagetool-"$ARCH".AppImage + +mv appimagetool-"$ARCH".AppImage "$OLD_CWD" +mv "$install_prefix"/usr/lib/appimagekit/runtime "$OLD_CWD" +mv "$install_prefix"/usr/bin/* "$OLD_CWD" diff --git a/ci/build-binaries.sh b/ci/build-binaries.sh deleted file mode 100755 index 3292291f5..000000000 --- a/ci/build-binaries.sh +++ /dev/null @@ -1,13 +0,0 @@ -#! /bin/bash - -set -e -set -x - -cd /AppImageKit - -./build.sh "$@" - -# make sure the prebuilt libraries in the container will be found -export LD_LIBRARY_PATH=/deps/lib:"$LD_LIBRARY_PATH" - -./test-appimagetool.sh build/install_prefix/usr/bin/appimagetool diff --git a/ci/build-in-docker.sh b/ci/build-in-docker.sh new file mode 100755 index 000000000..17f009c38 --- /dev/null +++ b/ci/build-in-docker.sh @@ -0,0 +1,48 @@ +#! /bin/bash + +if [[ "$DIST" == "" ]] || [[ "$ARCH" == "" ]]; then + echo "Usage: env ARCH=... DIST=... bash $0" + exit 1 +fi + +set -x +set -e + +cd "$(readlink -f "$(dirname "$0")")" + +# sets variables $image, $dockerfile +source build-docker-image.sh + +# figure out which build script to use +if [[ "$BUILD_LITE" == "" ]]; then + build_script=build.sh +else + build_script=build-lite.sh +fi + +DOCKER_OPTS=() +# fix for https://stackoverflow.com/questions/51195528/rcc-error-in-resource-qrc-cannot-find-file-png +if [ "$CI" != "" ]; then + DOCKER_OPTS+=("--security-opt" "seccomp:unconfined") +fi + +# only if there's more than 3G of free space in RAM, we can build in a RAM disk +if [[ "$GITHUB_ACTIONS" != "" ]]; then + echo "Building on GitHub actions, which does not support --tmpfs flag -> building on regular disk" +elif [[ "$(free -m | grep "Mem:" | awk '{print $4}')" -gt 3072 ]]; then + echo "Host system has enough free memory -> building in RAM disk" + DOCKER_OPTS+=("--tmpfs /docker-ramdisk:exec,mode=777") +else + echo "Host system does not have enough free memory -> building on regular disk" +fi + +# run the build with the current user to +# a) make sure root is not required for builds +# b) allow the build scripts to "mv" the binaries into the /out directory +uid="$(id -u)" +# run build +docker run -e DIST -e ARCH -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ID --rm -i --user "$uid" \ + "${DOCKER_OPTS[@]}" -v "$(readlink -f ..):/ws" \ + "$image" \ + bash -xc "export CI=1 && cd /ws && source ci/$build_script" + diff --git a/ci/ci-build.sh b/ci/ci-build.sh index e558c41d5..acc7282b4 100755 --- a/ci/ci-build.sh +++ b/ci/ci-build.sh @@ -3,81 +3,121 @@ set -e set -x -if [ "$CI" == "" ]; then - echo "Not running on CI system, aborting to prevent damage from system" +if [[ "$ARCH" == "" ]]; then + echo "Usage: env ARCH=... bash $0" exit 2 fi case "$ARCH" in "x86_64") export ARCH="x86_64" + docker_dist=centos7 ;; "i386"|"i686") export ARCH="i686" - # sleep so as not to overwrite during uploading (FIXME) - sleep 60 + docker_dist=centos7 + ;; + armhf|aarch64) + docker_dist=xenial + ;; + *) + echo "Unknown architecture: $ARCH" + exit 3 ;; esac + +#### NOTE #### +# Signing is currently broken, as the secret to decrypt the key is not available at the moment. +# Even worse, putting key material in a third-party execution environment is not a good idea +# to begin with. +# The signing doesn't add anything security wise anyway, so it doesn't really matter if it works +# at the moment or not. +#### END NOTE #### + # clean up and download data from GitHub -rm -rf data.tar.g* .gnu* || true -wget https://github.com/AppImage/AppImageKit/files/584665/data.zip -O data.tar.gz.gpg -( set +x ; echo $KEY | gpg2 --batch --passphrase-fd 0 --no-tty --skip-verify --output data.tar.gz --decrypt data.tar.gz.gpg ) || true -( tar xf data.tar.gz ; sudo chown -R $USER .gnu* ; rm -rf $HOME/.gnu* ; mv .gnu* $HOME/ ) || true +#rm -rf data.tar.g* .gnu* || true +#wget https://github.com/AppImage/AppImageKit/files/584665/data.zip -O data.tar.gz.gpg +#( set +x ; echo $KEY | gpg2 --batch --passphrase-fd 0 --no-tty --skip-verify --output data.tar.gz --decrypt data.tar.gz.gpg ) || true +#( tar xf data.tar.gz ; sudo chown -R $USER .gnu* ; rm -rf $HOME/.gnu* ; mv .gnu* $HOME/ ) || true -# prepare output directory -mkdir -p ./out/ -# build AppImageKit -docker run --rm \ - --device /dev/fuse:mrw \ - -e ARCH \ - -i \ - -v "${PWD}":/AppImageKit \ - -v "${PWD}"/travis/:/travis \ - "$DOCKER_IMAGE" \ - /bin/bash -x "/travis/build-binaries.sh" --run-tests - -# inspect AppDirs -find build/out/appimagetool.AppDir/ - -# build AppImage -docker run --rm \ - --cap-add SYS_ADMIN \ - --device /dev/fuse:mrw \ - -e ARCH \ - -i \ - -v "${PWD}":/AppImageKit \ - -v "${PWD}"/travis/:/travis \ - -v $HOME/.gnupg:/root/.gnupg \ - "$DOCKER_IMAGE" \ - /bin/bash -x "/travis/build-appimage.sh" +# make sure we're in the repository root directory +this_dir="$(readlink -f "$(dirname "$0")")" +repo_root="$this_dir"/.. -cd build/ +# docker image name +docker_image=quay.io/appimage/appimagebuild:"$docker_dist"-"$ARCH" +# make sure it's up to date +docker pull "$docker_image" -# test AppImages -[ "$ARCH" == "i686" ] && sudo apt-get update && sudo apt-get install -y gcc-multilib lib32z1 libfuse2 libfuse2:i386 libglib2.0-0:i386 libcairo2:i386 -[ "$ARCH" != "armhf" ] && [ "$ARCH" != "aarch64" ] && bash -x ../travis/test-appimage.sh +# prepare output directory +mkdir -p out/ + +# we run all builds with non-privileged user accounts to make sure the build doesn't depend on such features +uid="$(id -u)" + +# note: we cannot just use '-e ARCH', as this wouldn't overwrite the value set via ENV ARCH=... in the image +common_docker_opts=( + -e TERM="$TERM" + -e ARCH="$ARCH" + -i + -v "$repo_root":/ws + -v "$(readlink -f out/)":/out +) + +# make ctrl-c work +if [[ "$TERM" != "" ]]; then + common_docker_opts+=("-t") +fi -# install more tools -# (vim-common contains xxd) -sudo apt-get install vim-common +# build AppImageKit and appimagetool-"$ARCH".AppImage +# TODO: make gnupg home available, e.g., through "-v" "$HOME"/.gnupg:/root/.gnupg +# TODO: this ^ won't work since we don't build as root any more +# note: we enforce using the same UID in the container as outside, so that the created files are owned by the caller +docker run --rm \ + --user "$uid" \ + "${common_docker_opts[@]}" \ + "-v" "$HOME"/.gnupg:/root/.gnupg \ + "$docker_image" \ + /bin/bash -xc "cd /out && /ws/ci/build-binaries-and-appimage.sh --run-tests" + +# test appimagetool-"$ARCH".AppImage +# note: if we're in a CI system, we allow the use of FUSE in the container, to make sure that this functionality works as intended +# outside CI environments, we use APPIMAGE_EXTRACT_AND_RUN instead, which is safer, but gives less meaningful results +docker_test_opts=("${common_docker_opts[@]}") + +if [[ "$CI" != "" ]]; then + echo "Warning: assuming this is running in a CI environment, allowing the use of FUSE in the container" + docker_test_opts+=( + "--device" "/dev/fuse:mrw" + "--cap-add" "SYS_ADMIN" + ) +else + echo "Note: this is not a CI environment, using APPIMAGE_EXTRACT_AND_RUN and patching out magic bytes" + docker_test_opts+=( + "-e" "APPIMAGE_EXTRACT_AND_RUN=1" + "-e" "PATCH_OUT_MAGIC_BYTES=1" + ) +fi -# fix permissions -sudo chown -R runner.runner . +# to make fuse happy, we need to use a "real" user +# as we don't want to use root, we use the user "build" we created in AppImageBuild +docker run --rm \ + --user build \ + "${docker_test_opts[@]}" \ + "$docker_image" \ + /bin/bash -xc "cd /out && bash /ws/ci/test-appimage.sh ./appimagetool-\"$ARCH\".AppImage" # remove binaries from output directory ls -al out/ -rm -r out/{appimagetool,mksquashfs,*.AppDir} -rm -r out/{validate,digest} || true +rm out/appimagetool +rm out/{validate,digest} -# inspect runtime -xxd out/runtime | head -n 1 | grep "4149 0200" +# make sure the runtime contains the magic bytes +hexdump -Cv out/runtime | head -n 1 | grep "41 49 02 00" # fix filename for upload mv out/runtime out/runtime-"$ARCH" -# remove unused files -sudo rm -rf out/*.AppDir out/*.AppImage.digest - # fix filename for upload -sudo mv out/AppRun out/AppRun-"$ARCH" +mv out/AppRun out/AppRun-"$ARCH" diff --git a/ci/test-appimage.sh b/ci/test-appimage.sh index 9cc0a9f23..62f6175c5 100755 --- a/ci/test-appimage.sh +++ b/ci/test-appimage.sh @@ -5,21 +5,42 @@ set -x set +e TIMEOUT=3 -ARCH=${ARCH:-$(uname -m)} +ARCH="${ARCH:-"$(uname -m)"}" error() { echo "Error: command failed" >&2 exit 1 } +if [[ "$1" == "" ]] || [[ ! -x "$1" ]]; then + echo "Usage: env [PATCH_OUT_MAGIC_BYTES=1] bash $0 " + exit 2 +fi + +appimagetool="$1" + +if [[ "$PATCH_OUT_MAGIC_BYTES" != "" ]]; then + tmpdir="$(mktemp -d /tmp/appimage-test-XXXXX)" + cleanup() { + [[ -d "$tmpdir" ]] && rm -r "$tmpdir" + } + trap cleanup EXIT + + echo "Copying appimagetool and patching out magic bytes" + cp "$appimagetool" "$tmpdir/" + ls -al "$tmpdir" + appimagetool="$tmpdir"/"$(basename "$appimagetool")" + dd if=/dev/zero of="$appimagetool" bs=1 count=3 seek=8 conv=notrunc +fi + # first of all, try to run appimagetool -out/appimagetool-"$ARCH".AppImage && error # should fail due to missing parameter -out/appimagetool-"$ARCH".AppImage -h || error # should not fail +"$appimagetool" && error # should fail due to missing parameter +"$appimagetool" -h || error # should not fail # print version and update information -out/appimagetool-"$ARCH".AppImage --version || error # should not fail -out/appimagetool-"$ARCH".AppImage --appimage-version || error # should not fail -out/appimagetool-"$ARCH".AppImage --appimage-updateinformation || error # should not fail +"$appimagetool" --version || error # should not fail +"$appimagetool" --appimage-version || error # should not fail +"$appimagetool" --appimage-updateinformation || error # should not fail echo "" >&2 echo "Tests successful!" >&2 diff --git a/test-appimagetool.sh b/ci/test-appimagetool.sh similarity index 68% rename from test-appimagetool.sh rename to ci/test-appimagetool.sh index 8e656232e..3ce574dad 100755 --- a/test-appimagetool.sh +++ b/ci/test-appimagetool.sh @@ -4,22 +4,52 @@ set -e set -E set -o functrace -# this script attempts to package appimagetool as an AppImage with... surprise, appimagetool +if [[ "$2" == "" ]]; then + echo "Usage: bash $0 " + exit 2 +fi -tempdir=$(mktemp -d /tmp/appimage-test.XXXXXXXX) -thisdir=$(dirname $(readlink -f "$0")) +# using shift makes adding/removing parameters easier +repo_root="$(readlink -f "$1")" +shift +appimagetool="$(readlink -f "$1")" -appimagetool=$(readlink -f "$1") +if [[ ! -x "$appimagetool" ]]; then + echo "Error: appimagetool $appimagetool is not an executable" + exit 3 +fi -# make sure to use the built mksquashfs -export PATH=$(dirname "$appimagetool"):"$PATH" +# this script attempts to package appimagetool as an AppImage with... surprise, appimagetool -if [ ! -f "$appimagetool" ] || [ ! -x "$appimagetool" ]; then - echo "Usage: $0 " - exit 1 +# we always build in a temporary directory +# use RAM disk if possible +if [ -d /dev/shm ] && mount | grep /dev/shm | grep -v -q noexec; then + TEMP_BASE=/dev/shm +elif [ -d /docker-ramdisk ]; then + TEMP_BASE=/docker-ramdisk +else + TEMP_BASE=/tmp fi -if [ "$TRAVIS" == true ]; then +BUILD_DIR="$(mktemp -d -p "$TEMP_BASE" appimagetool-test-XXXXXX)" + +cleanup () { + if [ -d "$BUILD_DIR" ]; then + rm -rf "$BUILD_DIR" + fi +} + +trap cleanup EXIT + +REPO_ROOT="$(readlink -f "$(dirname "${BASH_SOURCE[0]}")"/..)" +OLD_CWD="$(readlink -f .)" + +pushd "$BUILD_DIR" + +# make sure to use the built mksquashfs +export PATH="$(dirname "$appimagetool")":"$PATH" + +if [ "$CI" == true ]; then # TODO: find way to get colored log on Travis log() { echo -e "\n$*\n"; } else @@ -31,28 +61,24 @@ trap '[[ $FUNCNAME = exithook ]] || { last_lineno=$real_lineno; real_lineno=$LIN exithook() { local exitcode="$1" - local lineno=${last_lineno:-$2} + local lineno="${last_lineno:-$2}" - if [ $exitcode -ne 0 ]; then + if [ "$exitcode" -ne 0 ]; then echo "$(tput setaf 1)$(tput bold)Test run failed: error in line $lineno$(tput sgr0)" else log "Tests succeeded!" fi - rm -r "$tempdir"; - - exit $exitcode + exit "$exitcode" } trap 'exithook $? $LINENO ${BASH_LINENO[@]}' EXIT # real script begins here -cd "$tempdir" - log "create a sample AppDir" mkdir -p appimagetool.AppDir/usr/share/metainfo/ -cp "$thisdir"/resources/{appimagetool.*,AppRun} appimagetool.AppDir/ -#cp "$thisdir"/resources/usr/share/metainfo/appimagetool.appdata.xml appimagetool.AppDir/usr/share/metainfo/ +cp "$repo_root"/resources/{appimagetool.*,AppRun} appimagetool.AppDir/ +#cp "$repo_root"/resources/usr/share/metainfo/appimagetool.appdata.xml appimagetool.AppDir/usr/share/metainfo/ cp "$appimagetool" appimagetool.AppDir/ mkdir -p appimagetool.AppDir/usr/share/applications cp appimagetool.AppDir/appimagetool.desktop appimagetool.AppDir/usr/share/applications From bf15bdd544b3ee2e149d45b312fa25dedd860e4b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 13:38:06 +0100 Subject: [PATCH 469/544] Ignore build artifacts --- .gitignore | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.gitignore b/.gitignore index 1bfa344b4..9b7abd502 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,13 @@ cmake-build-*/ .idea/ Testing/ *.swp +runtime +runtime-* +AppRun +AppRun-* +validate +validate-* +digest +digest-* +appimagetool +appimagetool-* From bf10379ddfc422578fac0983b77b7149408b4cf9 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 13:43:48 +0100 Subject: [PATCH 470/544] Remove old, untested, overly complex build.sh It's not been used by anyone anyway. And we don't have the resources to maintain more than one build system. The Docker-based one works well, and is usable outside the CI as well. --- README.md | 6 ++- build.sh | 108 ------------------------------------------------------ 2 files changed, 4 insertions(+), 110 deletions(-) delete mode 100755 build.sh diff --git a/README.md b/README.md index aa47a87f9..faa930251 100644 --- a/README.md +++ b/README.md @@ -185,12 +185,14 @@ chmod a+x Your.AppImage __NOTE:__ The AppImage project supplies [binaries](https://github.com/AppImage/AppImageKit/releases/tag/continuous) that application developers can use. These binaries are built using the CentOS 6 Docker on Travis CI build system in this repository. As an application developer, you do not have to use the build system. You only have to use the build systems when contributing to AppImageKit, when needing another architecture than `x86_64`, or when trying to reproduce our binaries. -On the oldest still-supported Ubuntu LTS release (at this point, 14.04): +Our build system is based on Docker. To build your own binaries, please install Docker first. Then, follow the following steps: ``` git clone --single-branch --recursive https://github.com/AppImage/AppImageKit cd AppImageKit/ -bash -ex build.sh +bash ci/build.sh ``` +This will create the binaries in a directory called `out/`. + Please note: It is not recommended nor supported to build AppImageKit on any newer build system than the oldest still-supported versions of major distributions for reasons outlined [here](https://github.com/AppImage/AppImageKit/wiki/Creating-AppImages#creating-appimages-that-are-compatible-with-many-systems). Currently we are targeting CentOS 6.x and Ubuntu 14.04 as build systems and we are not interested to build AppImageKit on newer versions anytime soon. Binaries built on those systems will run just fine on newer (later) target systems (distributions). diff --git a/build.sh b/build.sh deleted file mode 100755 index b69e99ab0..000000000 --- a/build.sh +++ /dev/null @@ -1,108 +0,0 @@ -#!/bin/bash - -# -# This script installs the required build-time dependencies -# and builds AppImages for AppImageKit -# - -STRIP="strip" -STATIC_BUILD=1 -JOBS=${JOBS:-1} -RUN_TESTS=0 - -while [ $1 ]; do - case $1 in - '--debug' | '-d' ) - STRIP="true" - ;; - '--use-shared-libs' | '-s' ) - STATIC_BUILD=0 - ;; - '--run-tests' | '-t' ) - RUN_TESTS=1 - ;; - '--clean' | '-c' ) - rm -rf build - git clean -df - rm -rf squashfuse/* squashfuse/.git - rm -rf squashfs-tools/* squashfs-tools/.git - exit - ;; - '--help' | '-h' ) - echo 'Usage: ./build.sh [OPTIONS]' - echo - echo 'OPTIONS:' - echo ' -h, --help: Show this help screen' - echo ' -d, --debug: Build with debug info.' - echo ' -n, --no-dependencies: Do not try to install distro specific build dependencies.' - echo ' -s, --use-shared-libs: Use distro provided shared versions of inotify-tools and openssl.' - echo ' -c, --clean: Clean all artifacts generated by the build.' - exit - ;; - esac - - shift -done - - -if cat /etc/*release | grep "CentOS" 2>&1 >/dev/null; then - if [ -e /opt/rh/devtoolset-4/enable ]; then - . /opt/rh/devtoolset-4/enable - fi -fi - -echo "$KEY" | md5sum - -set -e -set -x - -HERE="$(dirname "$(readlink -f "${0}")")" -cd "$HERE" - -# Fetch git submodules -git submodule update --init --recursive - -# Clean up from previous run -[ -d build/ ] && rm -rf build/ - -# Build AppImage -mkdir build -cd build - -# make sure that deps in separate install tree are found -export PKG_CONFIG_PATH=/deps/lib/pkgconfig/ - -# make CMake use the right tools for ARM cross-compiling using toolchain file -if [ "$ARCH" == "armhf" ]; then - export PATH=/deps/bin:"$PATH" - export EXTRA_CMAKE_FLAGS="-DCMAKE_TOOLCHAIN_FILE=$HERE/cmake/toolchains/arm-linux-gnueabihf.cmake" -elif [ "$ARCH" == "aarch64" ]; then - export PATH=/deps/bin:"$PATH" - export EXTRA_CMAKE_FLAGS="-DCMAKE_TOOLCHAIN_FILE=$HERE/cmake/toolchains/aarch64-linux-gnu.cmake" -fi - -cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_TESTING=ON -DAPPIMAGEKIT_PACKAGE_DEBS=ON "${EXTRA_CMAKE_FLAGS[@]}" -make -j$JOBS -make install DESTDIR=install_prefix/ - -if [ -d /deps/lib ]; then - export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":/deps/lib/ -fi - -xxd src/runtime | head -n 1 - -# Do NOT strip runtime -find install_prefix/usr/bin/ -not -iname runtime -print -exec "$STRIP" "{}" \; 2>/dev/null - -ls -lh install_prefix/usr/bin/ -for FILE in install_prefix/usr/bin/*; do - echo "$FILE" - ldd "$FILE" || true -done - -bash -ex "$HERE/build-appdir.sh" - -ls -lh - -mkdir -p out -cp -r install_prefix/usr/{bin,lib/appimagekit}/* appdirs/*.AppDir out/ From 6c0d0f48c8f6298e98892acbe3bb12816def06ae Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 13:45:53 +0100 Subject: [PATCH 471/544] Fix build script filename --- .github/workflows/build.yml | 2 +- ci/{ci-build.sh => build.sh} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename ci/{ci-build.sh => build.sh} (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 62030d77e..86426072c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,7 +39,7 @@ jobs: - name: Build run: | - bash -ex ci/build-in-docker.sh + bash -ex ci/build.sh - name: List files run: | diff --git a/ci/ci-build.sh b/ci/build.sh similarity index 100% rename from ci/ci-build.sh rename to ci/build.sh From 678a1f28acfb2ba4689845c81c1bb99a0bfda6df Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 13:48:44 +0100 Subject: [PATCH 472/544] For some reason, GitHub sets $TERM --- ci/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/build.sh b/ci/build.sh index acc7282b4..e99d898e7 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -67,7 +67,7 @@ common_docker_opts=( ) # make ctrl-c work -if [[ "$TERM" != "" ]]; then +if [[ "$CI" != "" ]] && [[ "$TERM" != "" ]]; then common_docker_opts+=("-t") fi From 28b02847d881579242a7bbf8a015382e076455f4 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 13:49:53 +0100 Subject: [PATCH 473/544] Fix i386/i686 build --- ci/build.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ci/build.sh b/ci/build.sh index e99d898e7..6c80950fe 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -8,6 +8,9 @@ if [[ "$ARCH" == "" ]]; then exit 2 fi +# TODO: fix inconsistency in architecture naming *everywhere* +docker_arch= + case "$ARCH" in "x86_64") export ARCH="x86_64" @@ -15,6 +18,7 @@ case "$ARCH" in ;; "i386"|"i686") export ARCH="i686" + docker_arch="i386" docker_dist=centos7 ;; armhf|aarch64) @@ -47,7 +51,7 @@ this_dir="$(readlink -f "$(dirname "$0")")" repo_root="$this_dir"/.. # docker image name -docker_image=quay.io/appimage/appimagebuild:"$docker_dist"-"$ARCH" +docker_image=quay.io/appimage/appimagebuild:"$docker_dist"-"${docker_arch:-ARCH}" # make sure it's up to date docker pull "$docker_image" From a877ae9d4fb6e83061b3dd4d79214f47b22cf849 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 13:51:39 +0100 Subject: [PATCH 474/544] Fix fallback variable name --- ci/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/build.sh b/ci/build.sh index 6c80950fe..9971ec7b4 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -51,7 +51,7 @@ this_dir="$(readlink -f "$(dirname "$0")")" repo_root="$this_dir"/.. # docker image name -docker_image=quay.io/appimage/appimagebuild:"$docker_dist"-"${docker_arch:-ARCH}" +docker_image=quay.io/appimage/appimagebuild:"$docker_dist"-"${docker_arch:-$ARCH}" # make sure it's up to date docker pull "$docker_image" From 9f1cb79ad942818fc05d8ad0e0e621a1cf79dbd2 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 13:52:22 +0100 Subject: [PATCH 475/544] Fix CI detection --- ci/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/build.sh b/ci/build.sh index 9971ec7b4..159b794c5 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -71,7 +71,7 @@ common_docker_opts=( ) # make ctrl-c work -if [[ "$CI" != "" ]] && [[ "$TERM" != "" ]]; then +if [[ "$CI" == "" ]] && [[ "$TERM" != "" ]]; then common_docker_opts+=("-t") fi From 8de650792e707d9be7b8656bee5806018c324fbb Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 13:58:03 +0100 Subject: [PATCH 476/544] Check out submodules recursively --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 86426072c..c206c927a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,7 +32,7 @@ jobs: steps: - uses: actions/checkout@v2 with: - submodules: true + submodules: 'recursive' - name: Set up QEMU integration for Docker run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes From c482767bc59f8f41c6e95da2d0b81444b2fc873a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 14:07:30 +0100 Subject: [PATCH 477/544] Need to use root for FUSE in Docker on actions --- ci/build.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ci/build.sh b/ci/build.sh index 159b794c5..ab84e428f 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -107,8 +107,14 @@ fi # to make fuse happy, we need to use a "real" user # as we don't want to use root, we use the user "build" we created in AppImageBuild +# in the CI system, however, we must use root, as the build user doesn't have access to FUSE +if [[ "$CI" != "" ]]; then + docker_test_opts+=("--user" "root") +else + docker_test_opts+=("--user" "build") +fi + docker run --rm \ - --user build \ "${docker_test_opts[@]}" \ "$docker_image" \ /bin/bash -xc "cd /out && bash /ws/ci/test-appimage.sh ./appimagetool-\"$ARCH\".AppImage" From 9136bd05d6e484d749bda168c6415a008eab61a1 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 14:15:12 +0100 Subject: [PATCH 478/544] Revert "Need to use root for FUSE in Docker on actions" This reverts commit c482767bc59f8f41c6e95da2d0b81444b2fc873a. --- ci/build.sh | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/ci/build.sh b/ci/build.sh index ab84e428f..159b794c5 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -107,14 +107,8 @@ fi # to make fuse happy, we need to use a "real" user # as we don't want to use root, we use the user "build" we created in AppImageBuild -# in the CI system, however, we must use root, as the build user doesn't have access to FUSE -if [[ "$CI" != "" ]]; then - docker_test_opts+=("--user" "root") -else - docker_test_opts+=("--user" "build") -fi - docker run --rm \ + --user build \ "${docker_test_opts[@]}" \ "$docker_image" \ /bin/bash -xc "cd /out && bash /ws/ci/test-appimage.sh ./appimagetool-\"$ARCH\".AppImage" From b183fe04c1738d998d4a5c68db4f3a2bdf5624b1 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 14:17:16 +0100 Subject: [PATCH 479/544] Try to allow FUSE in Docker --- ci/build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/build.sh b/ci/build.sh index 159b794c5..9f99d31d6 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -96,6 +96,7 @@ if [[ "$CI" != "" ]]; then docker_test_opts+=( "--device" "/dev/fuse:mrw" "--cap-add" "SYS_ADMIN" + "--security-opt" "apparmor:unconfined" ) else echo "Note: this is not a CI environment, using APPIMAGE_EXTRACT_AND_RUN and patching out magic bytes" From b40e022bb802387786cdbb1a0607ac765088a7f8 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 14:24:34 +0100 Subject: [PATCH 480/544] Fix artifacts uploading --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c206c927a..6f20efaaa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -43,14 +43,14 @@ jobs: - name: List files run: | - ls -lh build/out/* + ls -lh out/* - name: Upload artifact uses: actions/upload-artifact@v1.0.0 with: # Artifact name name: appimagetool-${{ matrix.ARCH }}.build - path: build/out + path: out/* upload: From 2b6b9d757f9bb564fbaf8ae7066aec3d66f56adf Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 14:29:00 +0100 Subject: [PATCH 481/544] Artifacts uploading thingy doesn't like globs --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6f20efaaa..cd18b3f02 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -43,14 +43,14 @@ jobs: - name: List files run: | - ls -lh out/* + ls -lh out/ - name: Upload artifact uses: actions/upload-artifact@v1.0.0 with: # Artifact name name: appimagetool-${{ matrix.ARCH }}.build - path: out/* + path: out/ upload: From 262b72d5a600bd4b640cea598cafd5378e423553 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 14:30:47 +0100 Subject: [PATCH 482/544] Remove accidentally committed script --- ci/build-in-docker.sh | 48 ------------------------------------------- 1 file changed, 48 deletions(-) delete mode 100755 ci/build-in-docker.sh diff --git a/ci/build-in-docker.sh b/ci/build-in-docker.sh deleted file mode 100755 index 17f009c38..000000000 --- a/ci/build-in-docker.sh +++ /dev/null @@ -1,48 +0,0 @@ -#! /bin/bash - -if [[ "$DIST" == "" ]] || [[ "$ARCH" == "" ]]; then - echo "Usage: env ARCH=... DIST=... bash $0" - exit 1 -fi - -set -x -set -e - -cd "$(readlink -f "$(dirname "$0")")" - -# sets variables $image, $dockerfile -source build-docker-image.sh - -# figure out which build script to use -if [[ "$BUILD_LITE" == "" ]]; then - build_script=build.sh -else - build_script=build-lite.sh -fi - -DOCKER_OPTS=() -# fix for https://stackoverflow.com/questions/51195528/rcc-error-in-resource-qrc-cannot-find-file-png -if [ "$CI" != "" ]; then - DOCKER_OPTS+=("--security-opt" "seccomp:unconfined") -fi - -# only if there's more than 3G of free space in RAM, we can build in a RAM disk -if [[ "$GITHUB_ACTIONS" != "" ]]; then - echo "Building on GitHub actions, which does not support --tmpfs flag -> building on regular disk" -elif [[ "$(free -m | grep "Mem:" | awk '{print $4}')" -gt 3072 ]]; then - echo "Host system has enough free memory -> building in RAM disk" - DOCKER_OPTS+=("--tmpfs /docker-ramdisk:exec,mode=777") -else - echo "Host system does not have enough free memory -> building on regular disk" -fi - -# run the build with the current user to -# a) make sure root is not required for builds -# b) allow the build scripts to "mv" the binaries into the /out directory -uid="$(id -u)" -# run build -docker run -e DIST -e ARCH -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ID --rm -i --user "$uid" \ - "${DOCKER_OPTS[@]}" -v "$(readlink -f ..):/ws" \ - "$image" \ - bash -xc "export CI=1 && cd /ws && source ci/$build_script" - From 2dcdddf8e86136cf19c36aab5b2f762ea91313b8 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 14:38:31 +0100 Subject: [PATCH 483/544] Fix library search on CentOS 7 i386 --- ci/build-appdir.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/build-appdir.sh b/ci/build-appdir.sh index 951963d53..4be7c977a 100755 --- a/ci/build-appdir.sh +++ b/ci/build-appdir.sh @@ -61,7 +61,7 @@ if [ -d /deps/ ]; then if [ "$ARCH" == "x86_64" ]; then cp "$(ldconfig -p | grep libffi.so.6 | grep x86-64 | cut -d'>' -f2 | tr -d ' ')" "$appimagetool_appdir"/usr/lib/ elif [ "$ARCH" == "i686" ]; then - cp "$(ldconfig -p | grep libffi.so.6 | grep i386 | cut -d'>' -f2 | tr -d ' ')" "$appimagetool_appdir"/usr/lib/ + cp "$(ldconfig -p | grep libffi.so.6 | head -n1 | cut -d'>' -f2 | tr -d ' ')" "$appimagetool_appdir"/usr/lib/ elif [ "$ARCH" == "armhf" ]; then cp "$(ldconfig -p | grep libffi.so.6 | grep arm | grep hf | cut -d'>' -f2 | tr -d ' ')" "$appimagetool_appdir"/usr/lib/ elif [ "$ARCH" == "aarch64" ]; then From 24613d38c78e3afa4f0b67a5f9e419ac2b682ad3 Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Mon, 14 Dec 2020 18:42:38 +0300 Subject: [PATCH 484/544] ci: remove redundant specification of docker-image The script now pulls the right tag depending upon the architecture --- .github/workflows/build.yml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cd18b3f02..c7c596ef5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,18 +15,9 @@ jobs: strategy: fail-fast: false matrix: - include: - - ARCH: 'x86_64' - docker-image: 'appimagebuild' - - ARCH: 'i386' - docker-image: 'appimagebuild-i386' - - ARCH: 'armhf' - docker-image: 'appimagebuild-armhf-cross' - - ARCH: 'aarch64' - docker-image: 'appimagebuild-aarch64-cross' + ARCH: ['x86_64', 'i386', 'armhf', 'aarch64'] env: - DOCKER_IMAGE: quay.io/appimage/${{ matrix.docker-image }} ARCH: ${{ matrix.ARCH }} steps: From 33dbbf0e59e123a22671dcabb67aa0856ff6f2fd Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 18:18:00 +0100 Subject: [PATCH 485/544] Disable test for emulated ARM builds --- ci/build.sh | 50 +++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/ci/build.sh b/ci/build.sh index 9f99d31d6..83507a86f 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -89,31 +89,35 @@ docker run --rm \ # test appimagetool-"$ARCH".AppImage # note: if we're in a CI system, we allow the use of FUSE in the container, to make sure that this functionality works as intended # outside CI environments, we use APPIMAGE_EXTRACT_AND_RUN instead, which is safer, but gives less meaningful results -docker_test_opts=("${common_docker_opts[@]}") - -if [[ "$CI" != "" ]]; then - echo "Warning: assuming this is running in a CI environment, allowing the use of FUSE in the container" - docker_test_opts+=( - "--device" "/dev/fuse:mrw" - "--cap-add" "SYS_ADMIN" - "--security-opt" "apparmor:unconfined" - ) -else - echo "Note: this is not a CI environment, using APPIMAGE_EXTRACT_AND_RUN and patching out magic bytes" - docker_test_opts+=( - "-e" "APPIMAGE_EXTRACT_AND_RUN=1" - "-e" "PATCH_OUT_MAGIC_BYTES=1" - ) +# note: FUSE and QEMU don't like each other, so if we're running in emulated mode, we can't run these tests +# therefore, by default, on ARM, these tests are not run +if [[ "$ARCH" == "arm"* ]] || [[ "$ARCH" == "aarch"* ]]; then + docker_test_opts=("${common_docker_opts[@]}") + + if [[ "$CI" != "" ]]; then + echo "Warning: assuming this is running in a CI environment, allowing the use of FUSE in the container" + docker_test_opts+=( + "--device" "/dev/fuse:mrw" + "--cap-add" "SYS_ADMIN" + "--security-opt" "apparmor:unconfined" + ) + else + echo "Note: this is not a CI environment, using APPIMAGE_EXTRACT_AND_RUN and patching out magic bytes" + docker_test_opts+=( + "-e" "APPIMAGE_EXTRACT_AND_RUN=1" + "-e" "PATCH_OUT_MAGIC_BYTES=1" + ) + fi + + # to make fuse happy, we need to use a "real" user + # as we don't want to use root, we use the user "build" we created in AppImageBuild + docker run --rm \ + --user build \ + "${docker_test_opts[@]}" \ + "$docker_image" \ + /bin/bash -xc "cd /out && bash /ws/ci/test-appimage.sh ./appimagetool-\"$ARCH\".AppImage" fi -# to make fuse happy, we need to use a "real" user -# as we don't want to use root, we use the user "build" we created in AppImageBuild -docker run --rm \ - --user build \ - "${docker_test_opts[@]}" \ - "$docker_image" \ - /bin/bash -xc "cd /out && bash /ws/ci/test-appimage.sh ./appimagetool-\"$ARCH\".AppImage" - # remove binaries from output directory ls -al out/ rm out/appimagetool From a3c69f66ea6404315bd02724cde92494a42ab3f0 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 18:46:12 +0100 Subject: [PATCH 486/544] Fix comparison --- ci/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/build.sh b/ci/build.sh index 83507a86f..942c1a064 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -91,7 +91,7 @@ docker run --rm \ # outside CI environments, we use APPIMAGE_EXTRACT_AND_RUN instead, which is safer, but gives less meaningful results # note: FUSE and QEMU don't like each other, so if we're running in emulated mode, we can't run these tests # therefore, by default, on ARM, these tests are not run -if [[ "$ARCH" == "arm"* ]] || [[ "$ARCH" == "aarch"* ]]; then +if [[ "$ARCH" != "arm"* ]] && [[ "$ARCH" != "aarch"* ]]; then docker_test_opts=("${common_docker_opts[@]}") if [[ "$CI" != "" ]]; then From 68b034535015e4a3a4cd6751f353a930768d846e Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Mon, 14 Dec 2020 21:12:22 +0300 Subject: [PATCH 487/544] ci: bump actions/download-artifact to v2 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c7c596ef5..10d7d1de4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -50,7 +50,7 @@ jobs: steps: - name: Download Artifacts - uses: actions/download-artifact@v1 + uses: actions/download-artifact@v2 - name: Inspect directory after downloading artifacts run: ls -alFR - name: Create release and upload artifacts From dce3540d3b27e29f06678cddbb6eed20778d9016 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 19:16:44 +0100 Subject: [PATCH 488/544] Fix and improve release creation --- .github/workflows/build.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 10d7d1de4..4434b03bb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,11 +45,12 @@ jobs: upload: - needs: [build] + name: Create release and upload artifacts + needs: + - build runs-on: ubuntu-latest - steps: - - name: Download Artifacts + - name: Download artifacts uses: actions/download-artifact@v2 - name: Inspect directory after downloading artifacts run: ls -alFR @@ -59,5 +60,4 @@ jobs: run: | wget -q https://github.com/TheAssassin/pyuploadtool/releases/download/continuous/pyuploadtool-x86_64.AppImage chmod +x pyuploadtool-x86_64.AppImage - ./pyuploadtool-x86_64.AppImage **/appimagetool*.AppImage* - + ./pyuploadtool-x86_64.AppImage **/appimagetool*.AppImage **/AppRun* From 8235d581c9791eaca51dcfea365272a718ed3f1a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 19:43:28 +0100 Subject: [PATCH 489/544] Make .zsync files available --- ci/build-binaries-and-appimage.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/build-binaries-and-appimage.sh b/ci/build-binaries-and-appimage.sh index 47565da2a..634ffec0b 100755 --- a/ci/build-binaries-and-appimage.sh +++ b/ci/build-binaries-and-appimage.sh @@ -92,6 +92,6 @@ find "$install_prefix" -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ appimagetool-"$ARCH".AppImage -mv appimagetool-"$ARCH".AppImage "$OLD_CWD" +mv appimagetool-"$ARCH".AppImage* "$OLD_CWD" mv "$install_prefix"/usr/lib/appimagekit/runtime "$OLD_CWD" mv "$install_prefix"/usr/bin/* "$OLD_CWD" From 7d4a62e2a969789416524b4d8e882ef9912b4c35 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 14 Dec 2020 19:44:47 +0100 Subject: [PATCH 490/544] Make file movements visible --- ci/build-binaries-and-appimage.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ci/build-binaries-and-appimage.sh b/ci/build-binaries-and-appimage.sh index 634ffec0b..cfca7ded9 100755 --- a/ci/build-binaries-and-appimage.sh +++ b/ci/build-binaries-and-appimage.sh @@ -92,6 +92,6 @@ find "$install_prefix" -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ appimagetool-"$ARCH".AppImage -mv appimagetool-"$ARCH".AppImage* "$OLD_CWD" -mv "$install_prefix"/usr/lib/appimagekit/runtime "$OLD_CWD" -mv "$install_prefix"/usr/bin/* "$OLD_CWD" +mv -v appimagetool-"$ARCH".AppImage* "$OLD_CWD" +mv -v "$install_prefix"/usr/lib/appimagekit/runtime "$OLD_CWD" +mv -v "$install_prefix"/usr/bin/* "$OLD_CWD" From 50c8071cda26779c1a1f77eaaf358b98690dd750 Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Tue, 15 Dec 2020 11:05:36 +0300 Subject: [PATCH 491/544] ci: add release-* to Release assets --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4434b03bb..03e77f197 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -60,4 +60,4 @@ jobs: run: | wget -q https://github.com/TheAssassin/pyuploadtool/releases/download/continuous/pyuploadtool-x86_64.AppImage chmod +x pyuploadtool-x86_64.AppImage - ./pyuploadtool-x86_64.AppImage **/appimagetool*.AppImage **/AppRun* + ./pyuploadtool-x86_64.AppImage **/appimagetool*.AppImage **/AppRun* **/runtime-* From 790dbb46d236fd04d8a2a3fbd3d4a13d6bd49a0b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 15 Dec 2020 11:13:52 +0300 Subject: [PATCH 492/544] ci: run against all branches cherry picked and formatted from 13a6d95 Co-authored by: Srevin Saju --- .github/workflows/build.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 03e77f197..fbde0c358 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,11 +1,6 @@ name: Build -on: - push: - branches: - - 'master' - pull_request: - workflow_dispatch: +on: [ push, pull_request, workflow_dispatch ] jobs: From 4933743a44a80f0911d2d5f08c25226f8521d7a1 Mon Sep 17 00:00:00 2001 From: Srevin Saju Date: Tue, 15 Dec 2020 11:18:52 +0300 Subject: [PATCH 493/544] ci: fix uploading of zsync files This patch exists on 13a6d9530a92729429b0d01edc3958b8d27a928a, but not on master yet, so lets add this glob too --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fbde0c358..9def0ad45 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -55,4 +55,4 @@ jobs: run: | wget -q https://github.com/TheAssassin/pyuploadtool/releases/download/continuous/pyuploadtool-x86_64.AppImage chmod +x pyuploadtool-x86_64.AppImage - ./pyuploadtool-x86_64.AppImage **/appimagetool*.AppImage **/AppRun* **/runtime-* + ./pyuploadtool-x86_64.AppImage **/appimagetool*.AppImage* **/AppRun* **/runtime-* From 5ae4eae6f845221239198914b2964e286c90e28f Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 15 Dec 2020 12:55:06 +0100 Subject: [PATCH 494/544] We build more than just appimagetool --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9def0ad45..3bf3c12c3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,7 +5,7 @@ on: [ push, pull_request, workflow_dispatch ] jobs: build: - name: Build appimagetool + name: Build runs-on: ubuntu-latest strategy: fail-fast: false From b181fc409a69fc2fede12e3a5cf0c0b76e7ebfd6 Mon Sep 17 00:00:00 2001 From: youcai Date: Sun, 27 Dec 2020 22:17:07 +0800 Subject: [PATCH 495/544] fix: block envs set in resources/AppRun when invoking appstream utilities --- src/appimagetool.c | 53 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 3831e3dee..6b374197a 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -457,6 +457,41 @@ bool readFile(char* filename, int* size, char** buffer) { return TRUE; } +/* run a command outside the current appimage, block environs like LD_LIBRARY_PATH */ +int run_external(const char *filename, char *const argv []) { + int pid = fork(); + if (pid < 0) { + g_print("run_external: fork failed"); + // fork failed + exit(1); + } else if (pid == 0) { + // blocks env defined in resources/AppRun + unsetenv("LD_LIBRARY_PATH"); + unsetenv("PYTHONPATH"); + unsetenv("XDG_DATA_DIRS"); + unsetenv("PERLLIB"); + unsetenv("GSETTINGS_SCHEMA_DIR"); + unsetenv("QT_PLUGIN_PATH"); + // runs command + execv(filename, argv); + // execv(3) returns, indicating error + g_print("run_external: subprocess execv(3) got error %s", g_strerror(errno)); + exit(1); + } else { + int wstatus; + if (waitpid(pid, &wstatus, 0) == -1) { + g_print("run_external: wait failed"); + return -1; + } + if (WIFEXITED(wstatus) && (WEXITSTATUS(wstatus) == 0)) { + return 0; + } else { + g_print("run_external: subprocess exited with status %d", WEXITSTATUS(wstatus)); + return 1; + } + } +} + // ##################################################################### static GOptionEntry entries[] = @@ -794,19 +829,29 @@ main (int argc, char *argv[]) fprintf (stderr, "AppStream upstream metadata found in usr/share/metainfo/%s\n", application_id); /* Use ximion's appstreamcli to make sure that desktop file and appdata match together */ if(g_find_program_in_path ("appstreamcli")) { - sprintf (command, "%s validate-tree %s", g_find_program_in_path ("appstreamcli"), source); + char *args[] = { + "appstreamcli", + "validate-tree", + source, + NULL + }; g_print("Trying to validate AppStream information with the appstreamcli tool\n"); g_print("In case of issues, please refer to https://github.com/ximion/appstream\n"); - int ret = system(command); + int ret = run_external(g_find_program_in_path ("appstreamcli"), args); if (ret != 0) die("Failed to validate AppStream information with appstreamcli"); } /* It seems that hughsie's appstream-util does additional validations */ if(g_find_program_in_path ("appstream-util")) { - sprintf (command, "%s validate-relax %s", g_find_program_in_path ("appstream-util"), appdata_path); + char *args[] = { + "appstream-util", + "validate-relax", + appdata_path, + NULL + }; g_print("Trying to validate AppStream information with the appstream-util tool\n"); g_print("In case of issues, please refer to https://github.com/hughsie/appstream-glib\n"); - int ret = system(command); + int ret = run_external(g_find_program_in_path ("appstream-util"), args); if (ret != 0) die("Failed to validate AppStream information with appstream-util"); } From 7952683b2f336ca582d1d65235743937a1bc5882 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 29 Dec 2020 23:58:30 -0500 Subject: [PATCH 496/544] runtime: fix double fclose() on sqfs read error --- src/runtime.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index 107b6e7f6..bada3af93 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -396,7 +396,6 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix char buf[bytes_at_a_time]; if (sqfs_read_range(&fs, &inode, (sqfs_off_t) bytes_already_read, &bytes_at_a_time, buf)) { perror("sqfs_read_range error"); - fclose(f); rv = false; break; } From c08670c2c3f7ca757a573bb0385884de077bb33a Mon Sep 17 00:00:00 2001 From: probonopd Date: Wed, 2 Jun 2021 18:51:31 +0200 Subject: [PATCH 497/544] Change from freenode to libera.chat https://github.com/AppImage/AppImageKit/issues/1136 [ci skip] --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 758be3c67..421a99a16 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,7 +24,7 @@ Your contribution is especially welcome in these ares: * [Issues we need help with](https://github.com/search?utf8=%E2%9C%93&q=org%3AAppImage+state%3Aopen+label%3Ahigh-priority&type=Issues) * [Open bugs](https://github.com/search?utf8=%E2%9C%93&q=org%3AAppImage+label%3Abug+state%3Aopen&type=Issues) -If you would like to report issues with AppImageKit itself, or would like to contribute to its development, please see get in touch with us in `#AppImage` on `irc.freenode.net`. We welcome pull requests addressing any of the open issues and/or other bugfixes and/or feature additions. In the case of complex feature additions, it is best to contact us first, before you spend much time. +If you would like to report issues with AppImageKit itself, or would like to contribute to its development, please see get in touch with us in `#AppImage` on `irc.libera.chat`. We welcome pull requests addressing any of the open issues and/or other bugfixes and/or feature additions. In the case of complex feature additions, it is best to contact us first, before you spend much time. ## Project governance From 859090b6bd635ef42a00d1944e060a3da2658c1b Mon Sep 17 00:00:00 2001 From: probonopd Date: Wed, 2 Jun 2021 18:59:07 +0200 Subject: [PATCH 498/544] Change from freenode to libera.chat https://github.com/AppImage/AppImageKit/issues/1136 [ci skip] --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index faa930251..fa0e87358 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# AppImageKit [![Build Status](https://travis-ci.org/AppImage/AppImageKit.svg?branch=appimagetool/master)](https://travis-ci.org/AppImage/AppImageKit) ![Downloads](https://img.shields.io/github/downloads/AppImage/AppImageKit/total.svg) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/ff60338a447941afb17c30f777314bee)](https://www.codacy.com/app/probonopd/AppImageKit?utm_source=github.com&utm_medium=referral&utm_content=AppImage/AppImageKit&utm_campaign=Badge_Grade) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/probonopd/AppImageKit?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![irc](https://img.shields.io/badge/IRC-%23AppImage%20on%20freenode-blue.svg)](https://webchat.freenode.net/?channels=AppImage) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZT9CL8M5TJU72) +# AppImageKit [![Build Status](https://travis-ci.org/AppImage/AppImageKit.svg?branch=appimagetool/master)](https://travis-ci.org/AppImage/AppImageKit) ![Downloads](https://img.shields.io/github/downloads/AppImage/AppImageKit/total.svg) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/ff60338a447941afb17c30f777314bee)](https://www.codacy.com/app/probonopd/AppImageKit?utm_source=github.com&utm_medium=referral&utm_content=AppImage/AppImageKit&utm_campaign=Badge_Grade) [![irc](https://img.shields.io/badge/IRC-%23AppImage%20on%20libera.chat-blue.svg)](https://web.libera.chat/#AppImage) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZT9CL8M5TJU72) The __AppImage__ format is a format for packaging applications in a way that allows them to run on a variety of different target systems (base operating systems, distributions) without further modification. @@ -7,7 +7,7 @@ run on a variety of different target systems (base operating systems, distributi Using AppImageKit you can package desktop applications as AppImages that run on common Linux-based operating systems, such as RHEL, CentOS, Ubuntu, Fedora, Debian and derivatives. -Copyright (c) 2004-19 Simon Peter and contributors. +Copyright (c) 2004-21 Simon Peter and contributors. https://en.wikipedia.org/wiki/AppImage @@ -32,7 +32,7 @@ Providing an [AppImage](http://appimage.org/) for distributing application has, [Here is an overview](https://appimage.github.io/apps) of projects that are already distributing upstream-provided, official AppImages. -If you have questions, AppImage developers are on #AppImage on irc.freenode.net. +If you have questions, AppImage developers are on #AppImage on irc.libera.chat. ## Motivation From 1681fd84dbe09c7d9b22e13cdb16ea601aa0ec47 Mon Sep 17 00:00:00 2001 From: probonopd Date: Wed, 9 Jun 2021 08:11:02 +0200 Subject: [PATCH 499/544] Trigger build From c9e0b67ae5b60801831751b14b6385984ddadb48 Mon Sep 17 00:00:00 2001 From: probonopd Date: Tue, 26 Oct 2021 05:37:09 +0200 Subject: [PATCH 500/544] Update README.md [ci skip] --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index fa0e87358..3515b2874 100644 --- a/README.md +++ b/README.md @@ -5,15 +5,13 @@ run on a variety of different target systems (base operating systems, distributi ![appimagekitr](https://user-images.githubusercontent.com/2480569/34471155-5b53131a-ef41-11e7-90a0-8c57b3c21551.png) -Using AppImageKit you can package desktop applications as AppImages that run on common Linux-based operating systems, such as RHEL, CentOS, Ubuntu, Fedora, Debian and derivatives. +Using the AppImage format you can package desktop applications as AppImages that run on common Linux-based operating systems, such as RHEL, CentOS, Ubuntu, Fedora, Debian and derivatives. Copyright (c) 2004-21 Simon Peter and contributors. https://en.wikipedia.org/wiki/AppImage -__AppImageKit__ is a concrete implementation of the AppImage format and provides tools such as `appimagetool` and `appimaged` for conveniently handling AppImages. - -`appimagetool` converts an AppDir into a self-mounting filesystem image. `appimaged` is a daemon that handles registering and unregistering AppImages with the system (e.g., menu entries, icons, MIME types, binary delta updates, and such). +__AppImageKit__ is a concrete implementation of the AppImage format, especially the tiny runtime that becomes part of each AppImage. Providing an [AppImage](http://appimage.org/) for distributing application has, among others, these advantages: - Applications packaged as an AppImage can run on many distributions (including Ubuntu, Fedora, openSUSE, CentOS, elementaryOS, Linux Mint, and others) From 5bec95b66e88fda20a72da372aa60802c452f723 Mon Sep 17 00:00:00 2001 From: Alexis Lopez Zubieta Date: Wed, 20 Oct 2021 14:33:49 -0500 Subject: [PATCH 501/544] feat: Allow www.pling.com and www.appimagehub.com as update source The purposed format for the whole update information would be: `pling-v1-zsync||` closes #1152 --- src/appimagetool.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 6b374197a..b9939253e 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -967,7 +967,8 @@ main (int argc, char *argv[]) if(!g_str_has_prefix(updateinformation,"zsync|")) if(!g_str_has_prefix(updateinformation,"bintray-zsync|")) if(!g_str_has_prefix(updateinformation,"gh-releases-zsync|")) - die("The provided updateinformation is not in a recognized format"); + if(!g_str_has_prefix(updateinformation,"pling-v1-zsync|")) + die("The provided updateinformation is not in a recognized format"); gchar **ui_type = g_strsplit_set(updateinformation, "|", -1); From 312be7bdc59861d1bb9d854683786989e4fddecb Mon Sep 17 00:00:00 2001 From: probonopd Date: Fri, 28 Jan 2022 23:32:51 +0100 Subject: [PATCH 502/544] Remove non-working badge and update year [ci skip] --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3515b2874..2c78fd46d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# AppImageKit [![Build Status](https://travis-ci.org/AppImage/AppImageKit.svg?branch=appimagetool/master)](https://travis-ci.org/AppImage/AppImageKit) ![Downloads](https://img.shields.io/github/downloads/AppImage/AppImageKit/total.svg) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/ff60338a447941afb17c30f777314bee)](https://www.codacy.com/app/probonopd/AppImageKit?utm_source=github.com&utm_medium=referral&utm_content=AppImage/AppImageKit&utm_campaign=Badge_Grade) [![irc](https://img.shields.io/badge/IRC-%23AppImage%20on%20libera.chat-blue.svg)](https://web.libera.chat/#AppImage) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZT9CL8M5TJU72) +# AppImageKit [![Build Status](https://travis-ci.org/AppImage/AppImageKit.svg?branch=appimagetool/master)](https://travis-ci.org/AppImage/AppImageKit) ![Downloads](https://img.shields.io/github/downloads/AppImage/AppImageKit/total.svg) [![irc](https://img.shields.io/badge/IRC-%23AppImage%20on%20libera.chat-blue.svg)](https://web.libera.chat/#AppImage) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZT9CL8M5TJU72) The __AppImage__ format is a format for packaging applications in a way that allows them to run on a variety of different target systems (base operating systems, distributions) without further modification. @@ -7,7 +7,7 @@ run on a variety of different target systems (base operating systems, distributi Using the AppImage format you can package desktop applications as AppImages that run on common Linux-based operating systems, such as RHEL, CentOS, Ubuntu, Fedora, Debian and derivatives. -Copyright (c) 2004-21 Simon Peter and contributors. +Copyright (c) 2004-22 Simon Peter and contributors. https://en.wikipedia.org/wiki/AppImage From 473d4219c51a249da3cbfd862f3dcb7232ba4626 Mon Sep 17 00:00:00 2001 From: James Hobson Date: Tue, 24 Nov 2020 13:29:34 +0100 Subject: [PATCH 503/544] Fixed Validate.c (Issue 949) --- src/validate.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/validate.c b/src/validate.c index f4cfd23e3..e1d1e037e 100644 --- a/src/validate.c +++ b/src/validate.c @@ -19,6 +19,7 @@ typedef unsigned char byte; char segment_name[] = ".sha256_sig"; +char segment_key_name[] = ".sig_key"; int sha256_file(char *path, char outputBuffer[65], int skip_offset, int skip_length) { @@ -109,38 +110,53 @@ int main(int argc,char **argv) { char *filename = argv[1]; - unsigned long skip_offset = 0; - unsigned long skip_length = 0; + unsigned long skip_offset_sig = 0; + unsigned long skip_length_sig = 0; + + unsigned long skip_offset_key = 0; + unsigned long skip_length_key = 0; - if (!appimage_get_elf_section_offset_and_length(filename, ".sha256_sig", &skip_offset, &skip_length)) { + if (!appimage_get_elf_section_offset_and_length(filename, ".sha256_sig", &skip_offset_sig, &skip_length_sig)) { fprintf(stderr, "Failed to read .sha256_sig section"); exit(1); } + if (!appimage_get_elf_section_offset_and_length(filename, ".sig_key", &skip_offset_key, &skip_length_key)) { + fprintf(stderr, "Failed to read .sig_key section"); + exit(1); + } - if(skip_length > 0) { - fprintf(stderr, "Skipping ELF section %s with offset %lu, length %lu\n", segment_name, skip_offset, skip_length); + if(skip_length_sig > 0) { + fprintf(stderr, "Skipping ELF section %s with offset %lu, length %lu\n", segment_name, skip_offset_sig, skip_length_sig); } else { fprintf(stderr, "ELF section %s not found, is the file signed?\n", segment_name); exit(1); } + if(skip_length_key > 0) { + fprintf(stderr, "Skipping ELF section %s with offset %lu, length %lu\n", segment_key_name, skip_offset_key, skip_length_key); + } else { + fprintf(stderr, "ELF section %s not found, is the file signed?\n", segment_key_name); + exit(1); + } + int skip_offset = skip_offset_sig; + int skip_length = skip_length_sig + skip_length_key; char *digestfile; digestfile = g_strconcat("/tmp/", basename(g_strconcat(filename, ".digest", NULL)), NULL); char *signaturefile; signaturefile = g_strconcat("/tmp/", basename(g_strconcat(filename, ".sig", NULL)), NULL); - uint8_t *data = malloc(skip_length); + uint8_t *data = malloc(skip_length_sig); unsigned long k; FILE* fd = fopen(filename, "r"); - fseek(fd, skip_offset, SEEK_SET); - fread(data, skip_length, sizeof(uint8_t), fd); + fseek(fd, skip_offset_sig, SEEK_SET); + fread(data, skip_length_sig, sizeof(uint8_t), fd); fclose(fd); FILE *fpdst2 = fopen(signaturefile, "w"); if (fpdst2 == NULL) { fprintf(stderr, "Not able to open the signature file for writing, aborting"); exit(1); } - for (k = 0; k < skip_length; k++) { + for (k = 0; k < skip_length_sig; k++) { fprintf(fpdst2, "%c", data[k]); } fclose(fpdst2); From 77d97ecb07c298221f6ba4e7fbae2f93b9b854ca Mon Sep 17 00:00:00 2001 From: James Hobson Date: Tue, 24 Nov 2020 13:38:10 +0100 Subject: [PATCH 504/544] Added check of assumed memory layout --- src/validate.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/validate.c b/src/validate.c index e1d1e037e..2f3081934 100644 --- a/src/validate.c +++ b/src/validate.c @@ -137,6 +137,10 @@ int main(int argc,char **argv) { fprintf(stderr, "ELF section %s not found, is the file signed?\n", segment_key_name); exit(1); } + if(skip_offset_sig + skip_length_sig != skip_offset_key) { + fprintf(stderr, "Validate only worlds when .sha256_sig and .sig_key are next to one another in the ELF\n"); + exit(0); + } int skip_offset = skip_offset_sig; int skip_length = skip_length_sig + skip_length_key; From 82e54eabc1635e177c3fcd0385ae2104b4d6229b Mon Sep 17 00:00:00 2001 From: James Hobson Date: Sat, 5 Dec 2020 17:38:59 +0100 Subject: [PATCH 505/544] Added support for older appimages (untested) --- src/validate.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/validate.c b/src/validate.c index 2f3081934..225d2120e 100644 --- a/src/validate.c +++ b/src/validate.c @@ -121,8 +121,8 @@ int main(int argc,char **argv) { exit(1); } if (!appimage_get_elf_section_offset_and_length(filename, ".sig_key", &skip_offset_key, &skip_length_key)) { - fprintf(stderr, "Failed to read .sig_key section"); - exit(1); + skip_length_key = 0; + skip_offset_key = 0; } if(skip_length_sig > 0) { @@ -134,10 +134,10 @@ int main(int argc,char **argv) { if(skip_length_key > 0) { fprintf(stderr, "Skipping ELF section %s with offset %lu, length %lu\n", segment_key_name, skip_offset_key, skip_length_key); } else { - fprintf(stderr, "ELF section %s not found, is the file signed?\n", segment_key_name); + fprintf(stderr, "ELF section %s not found, assuming older AppImage Standard\n", segment_key_name); exit(1); } - if(skip_offset_sig + skip_length_sig != skip_offset_key) { + if(skip_offset_sig + skip_length_sig != skip_offset_key && skip_length_key != 0) { fprintf(stderr, "Validate only worlds when .sha256_sig and .sig_key are next to one another in the ELF\n"); exit(0); } From 988a8cbf2f6caa85548603f83445bc543d413899 Mon Sep 17 00:00:00 2001 From: James Hobson Date: Mon, 7 Dec 2020 08:34:20 +0100 Subject: [PATCH 506/544] Tested on current appimage standard --- src/validate.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/validate.c b/src/validate.c index 225d2120e..0608ec72a 100644 --- a/src/validate.c +++ b/src/validate.c @@ -135,7 +135,6 @@ int main(int argc,char **argv) { fprintf(stderr, "Skipping ELF section %s with offset %lu, length %lu\n", segment_key_name, skip_offset_key, skip_length_key); } else { fprintf(stderr, "ELF section %s not found, assuming older AppImage Standard\n", segment_key_name); - exit(1); } if(skip_offset_sig + skip_length_sig != skip_offset_key && skip_length_key != 0) { fprintf(stderr, "Validate only worlds when .sha256_sig and .sig_key are next to one another in the ELF\n"); From 68d69e37d3e2c2b01814d2de0ac5fde12c2bcab5 Mon Sep 17 00:00:00 2001 From: James Hobson Date: Mon, 7 Dec 2020 08:40:56 +0100 Subject: [PATCH 507/544] Typo fix and indentation fix --- src/validate.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/validate.c b/src/validate.c index 0608ec72a..7e8ce30c6 100644 --- a/src/validate.c +++ b/src/validate.c @@ -121,8 +121,8 @@ int main(int argc,char **argv) { exit(1); } if (!appimage_get_elf_section_offset_and_length(filename, ".sig_key", &skip_offset_key, &skip_length_key)) { - skip_length_key = 0; - skip_offset_key = 0; + skip_length_key = 0; + skip_offset_key = 0; } if(skip_length_sig > 0) { @@ -137,8 +137,8 @@ int main(int argc,char **argv) { fprintf(stderr, "ELF section %s not found, assuming older AppImage Standard\n", segment_key_name); } if(skip_offset_sig + skip_length_sig != skip_offset_key && skip_length_key != 0) { - fprintf(stderr, "Validate only worlds when .sha256_sig and .sig_key are next to one another in the ELF\n"); - exit(0); + fprintf(stderr, "validate only works when .sha256_sig and .sig_key are contiguous in the ELF header\n"); + exit(0); } int skip_offset = skip_offset_sig; int skip_length = skip_length_sig + skip_length_key; From 672b3d0d1bf5fd74c3465da5fd62486606025a09 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 25 Feb 2022 16:41:59 +0100 Subject: [PATCH 508/544] Allow signing with passphrase --- src/appimagetool.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index b9939253e..b8a3c33ec 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1155,9 +1155,16 @@ main (int argc, char *argv[]) strcat(key_arg, "'"); } + // passing the passphrase via the environment is at least better than using a CLI parameter + gchar *sign_passphrase = getenv("APPIMAGETOOL_SIGN_PASSPHRASE"); + sprintf(command, - "%s --batch --detach-sign --armor %s %s %s", - gpg2_path, key_arg ? key_arg : "", sign_args ? sign_args : "", digestfile + "%s --detach-sign --armor %s %s %s %s", + gpg2_path, + key_arg ? key_arg : "", + sign_args ? sign_args : "", + sign_passphrase != NULL ? "--passphrase-fd 0 --pinentry-mode loopback" : "", + digestfile ); free(key_arg); @@ -1166,12 +1173,25 @@ main (int argc, char *argv[]) if (verbose) fprintf(stderr, "%s\n", command); - fp = popen(command, "r"); + fp = popen(command, "w"); + + if (fp == NULL) { + perror("ERROR: popen() call failed"); + exit(1); + } + + // write passphrase to stdin (fd 0 of subprocess) + if (sign_passphrase != NULL) { + if (fwrite(sign_passphrase, sizeof(char), strlen(sign_passphrase), fp) != strlen(sign_passphrase)) { + perror("ERROR: failed to pass passphrase to process, exiting"); + exit(1); + } + } if (pclose(fp) != 0) { - fprintf(stderr, "ERROR: %s command did not succeed, could not sign, continuing\n", using_gpg ? "gpg" : "gpg2"); + int errno_backup = errno; + fprintf(stderr, "ERROR: %s command did not succeed, could not sign (%s), continuing\n", using_gpg ? "gpg" : "gpg2", strerror(errno_backup)); } else { - fp = NULL; FILE* destinationfp = fopen(destination, "r+"); From 9a13f09f3017c1a7bdf190a0760166bb97e09f60 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Sun, 3 Apr 2022 03:57:50 +0200 Subject: [PATCH 509/544] Add --mksquashfs-opt (#1188) Closes https://github.com/AppImage/AppImageKit/issues/1186 --- ci/test-appimagetool.sh | 18 ++++++++++++++++++ src/appimagetool.c | 13 +++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/ci/test-appimagetool.sh b/ci/test-appimagetool.sh index 3ce574dad..125e9c19c 100755 --- a/ci/test-appimagetool.sh +++ b/ci/test-appimagetool.sh @@ -117,3 +117,21 @@ if [ "$hash1" != "$hash2" ]; then echo "Hash $hash1 doesn't match hash $hash2!" exit 1 fi + +log "check --mksquashfs-opt forwarding" +out=$("$appimagetool" appimagetool.AppDir appimagetool.AppImage --mksquashfs-opt "-misspelt-option" 2>&1) +echo "${out}" | grep -q "invalid option" +"$appimagetool" appimagetool.AppDir appimagetool.AppImage.1 +"$appimagetool" appimagetool.AppDir appimagetool.AppImage.2 --mksquashfs-opt "-mem" --mksquashfs-opt "100M" +"$appimagetool" appimagetool.AppDir appimagetool.AppImage.3 --mksquashfs-opt "-all-time" --mksquashfs-opt "12345" +hash1=$(sha256sum appimagetool.AppImage.1 | awk '{print $1}') +hash2=$(sha256sum appimagetool.AppImage.2 | awk '{print $1}') +hash3=$(sha256sum appimagetool.AppImage.3 | awk '{print $1}') +if [ "$hash1" != "$hash2" ]; then + echo "Hashes of regular and mem-restricted AppImages differ" + exit 1 +fi +if [ "$hash1" == "$hash3" ]; then + echo "Hashes of regular and mtime-modified AppImages don't differ" + exit 1 +fi diff --git a/src/appimagetool.c b/src/appimagetool.c index b8a3c33ec..95016387e 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -82,6 +82,7 @@ static gboolean guess_update_information = FALSE; gchar *bintray_user = NULL; gchar *bintray_repo = NULL; gchar *sqfs_comp = "gzip"; +gchar **sqfs_opts = NULL; gchar *exclude_file = NULL; gchar *runtime_file = NULL; gchar *sign_args = NULL; @@ -142,7 +143,10 @@ int sfs_mksquashfs(char *source, char *destination, int offset) { gchar* offset_string; offset_string = g_strdup_printf("%i", offset); - char* args[32]; + guint sqfs_opts_len = sqfs_opts ? g_strv_length(sqfs_opts) : 0; + + int max_num_args = sqfs_opts_len + 22; + char* args[max_num_args]; bool use_xz = strcmp(sqfs_comp, "xz") >= 0; int i = 0; @@ -155,8 +159,8 @@ int sfs_mksquashfs(char *source, char *destination, int offset) { args[i++] = destination; args[i++] = "-offset"; args[i++] = offset_string; - args[i++] = "-comp"; + args[i++] = "-comp"; if (use_xz) args[i++] = "xz"; else @@ -200,6 +204,10 @@ int sfs_mksquashfs(char *source, char *destination, int offset) { args[i++] = "-mkfs-time"; args[i++] = "0"; + for (guint sqfs_opts_idx = 0; sqfs_opts_idx < sqfs_opts_len; ++sqfs_opts_idx) { + args[i++] = sqfs_opts[sqfs_opts_idx]; + } + args[i++] = 0; if (verbose) { @@ -505,6 +513,7 @@ static GOptionEntry entries[] = { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Produce verbose output", NULL }, { "sign", 's', 0, G_OPTION_ARG_NONE, &sign, "Sign with gpg[2]", NULL }, { "comp", 0, 0, G_OPTION_ARG_STRING, &sqfs_comp, "Squashfs compression", NULL }, + { "mksquashfs-opt", 0, 0, G_OPTION_ARG_STRING_ARRAY, &sqfs_opts, "Argument to pass through to mksquashfs; can be specified multiple times", NULL }, { "no-appstream", 'n', 0, G_OPTION_ARG_NONE, &no_appstream, "Do not check AppStream metadata", NULL }, { "exclude-file", 0, 0, G_OPTION_ARG_STRING, &exclude_file, _exclude_file_desc, NULL }, { "runtime-file", 0, 0, G_OPTION_ARG_STRING, &runtime_file, "Runtime file to use", NULL }, From ab25cef915e2f3050aafe63deeb1506e93d7dab7 Mon Sep 17 00:00:00 2001 From: "S. Zeid" Date: Thu, 27 Jan 2022 22:02:14 -0600 Subject: [PATCH 510/544] ci: Fix building with Podman I had two issues building with Podman: 1. `/dev/shm` did not have available space--on a host with ~16 GiB of RAM. To work around this, I added a check that at least 1 GiB of space is available or else `/dev/shm` won't be used. 2. Permission denied errors when moving binaries to `/out` when running rootlessly. The user ID inside the container was not mapping to the host user ID. Setting `PODMAN_USERNS=keep-id` solves this. The use of this environment variable instead of the equivalent `--userns` option should ensure that Docker runs are not affected by this change. (I do not override `$PODMAN_USERNS` if it is already set, so that users can easily override it if needed for their host system.) Tested on Alpine Linux edge x86_64 with Podman 3.4.4. (`apk add podman-docker` provides a shim for `docker` that invokes `podman`.) --- ci/build-binaries-and-appimage.sh | 10 +++++++++- ci/build.sh | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/ci/build-binaries-and-appimage.sh b/ci/build-binaries-and-appimage.sh index cfca7ded9..58620730f 100755 --- a/ci/build-binaries-and-appimage.sh +++ b/ci/build-binaries-and-appimage.sh @@ -15,8 +15,16 @@ export PATH=/deps/bin:"$PATH" echo "$KEY" | md5sum # we always build in a temporary directory -# use RAM disk if possible +# use RAM disk if possible and if enough space available +USE_SHM=0 if [ -d /dev/shm ] && mount | grep /dev/shm | grep -v -q noexec; then + SHM_FREE_KIB_MIN=$((1 * 1024 * 1024)) + SHM_FREE_KIB=$(df -P -k /dev/shm | tail -n 1 | sed -e 's/ \+/ /g' | cut -d ' ' -f 4) + if [[ "$SHM_FREE_KIB" != "" ]] && [ $SHM_FREE_KIB -ge $SHM_FREE_KIB_MIN ]; then + USE_SHM=1 + fi +fi +if [[ "$USE_SHM" = "1" ]]; then TEMP_BASE=/dev/shm elif [ -d /docker-ramdisk ]; then TEMP_BASE=/docker-ramdisk diff --git a/ci/build.sh b/ci/build.sh index 942c1a064..07b042b36 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -79,6 +79,7 @@ fi # TODO: make gnupg home available, e.g., through "-v" "$HOME"/.gnupg:/root/.gnupg # TODO: this ^ won't work since we don't build as root any more # note: we enforce using the same UID in the container as outside, so that the created files are owned by the caller +env PODMAN_USERNS=${PODMAN_USERNS:-keep-id} \ docker run --rm \ --user "$uid" \ "${common_docker_opts[@]}" \ From e30750f54a0f73e39e7d7ce69e61ab7ab5e3609e Mon Sep 17 00:00:00 2001 From: "S. Zeid" Date: Fri, 28 Jan 2022 18:06:26 -0600 Subject: [PATCH 511/544] ci: explain use of $PODMAN_USERNS in build.sh --- ci/build.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ci/build.sh b/ci/build.sh index 07b042b36..87932d709 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -61,6 +61,14 @@ mkdir -p out/ # we run all builds with non-privileged user accounts to make sure the build doesn't depend on such features uid="$(id -u)" +# When running under Podman (on hosts where `docker` is a shim that invokes `podman`), +# UID/GID mappings may lead to permission errors when copying artifacts to `/out`. +# We set the user namespace mode to `keep-id` to make sure that the host UID/GID +# are mapped to the same values inside the container, but using this environment +# variable (a) to not affect builds using Docker, and (b) to allow overriding the +# user namespace mode easily if necessary. +export PODMAN_USERNS="${PODMAN_USERNS:-keep-id}" + # note: we cannot just use '-e ARCH', as this wouldn't overwrite the value set via ENV ARCH=... in the image common_docker_opts=( -e TERM="$TERM" @@ -79,7 +87,6 @@ fi # TODO: make gnupg home available, e.g., through "-v" "$HOME"/.gnupg:/root/.gnupg # TODO: this ^ won't work since we don't build as root any more # note: we enforce using the same UID in the container as outside, so that the created files are owned by the caller -env PODMAN_USERNS=${PODMAN_USERNS:-keep-id} \ docker run --rm \ --user "$uid" \ "${common_docker_opts[@]}" \ From 1f739c1bea7e0b8bb91c66011492515acb3ae9fc Mon Sep 17 00:00:00 2001 From: probonopd Date: Fri, 29 Apr 2022 21:31:40 +0200 Subject: [PATCH 512/544] Remove graphic which mentioned freenode [ci skip] --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 2c78fd46d..06d52e353 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,6 @@ The __AppImage__ format is a format for packaging applications in a way that allows them to run on a variety of different target systems (base operating systems, distributions) without further modification. -![appimagekitr](https://user-images.githubusercontent.com/2480569/34471155-5b53131a-ef41-11e7-90a0-8c57b3c21551.png) - Using the AppImage format you can package desktop applications as AppImages that run on common Linux-based operating systems, such as RHEL, CentOS, Ubuntu, Fedora, Debian and derivatives. Copyright (c) 2004-22 Simon Peter and contributors. From 054e547560b5cb1059dcd719d88d619cee3d51ff Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 11 Jul 2022 20:31:04 +0200 Subject: [PATCH 513/544] Replace popen and fork/exec with GIO subprocessing Should help make the code more robust, reap child process correctly, etc., and saves a few lines. --- cmake/dependencies.cmake | 1 + src/CMakeLists.txt | 1 + src/appimagetool.c | 469 ++++++++++++++++++++++----------------- 3 files changed, 263 insertions(+), 208 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index d953e2bdc..896e3a8d9 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -12,6 +12,7 @@ import_pkgconfig_target(TARGET_NAME libfuse PKGCONFIG_TARGET fuse) # openssl is required for optional tools only, and doesn't need to be enforced # FIXME: remove dependency to openssl by implementing own SHA hashes in libappimage_hashlib import_pkgconfig_target(TARGET_NAME libssl PKGCONFIG_TARGET openssl OPTIONAL) +import_pkgconfig_target(TARGET_NAME libgio PKGCONFIG_TARGET gio OPTIONAL) if(USE_CCACHE) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a621c83a8..cdc6d851a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -35,6 +35,7 @@ target_link_libraries(appimagetool xdg-basedir libappimage_shared libglib + libgio libzlib xz ) diff --git a/src/appimagetool.c b/src/appimagetool.c index 95016387e..e34e24e6e 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -32,6 +32,7 @@ #include #include +#include #include #include @@ -571,7 +572,6 @@ main (int argc, char *argv[]) GError *error = NULL; GOptionContext *context; - char command[PATH_MAX]; // initialize help text of argument sprintf(_exclude_file_desc, "Uses given file as exclude file for mksquashfs, in addition to %s.", APPIMAGEIGNORE); @@ -748,7 +748,6 @@ main (int argc, char *argv[]) gchar* arch = getArchName(archs); fprintf(stderr, "Using architecture %s\n", arch); - FILE *fp; char app_name_for_filename[PATH_MAX]; sprintf(app_name_for_filename, "%s", get_desktop_entry(kf, "Name")); replacestr(app_name_for_filename, " ", "_"); @@ -1078,21 +1077,21 @@ main (int argc, char *argv[]) using_gpg = TRUE; } - gchar* sha256sum_path = g_find_program_in_path("sha256sum"); + gchar* shasum_sha256sum_path = g_find_program_in_path("sha256sum"); - if (!sha256sum_path) { - sha256sum_path = g_find_program_in_path("shasum"); + if (!shasum_sha256sum_path) { + shasum_sha256sum_path = g_find_program_in_path("shasum"); using_shasum = 1; } if (!gpg2_path) { fprintf(stderr, "gpg2 or gpg is not installed, cannot sign\n"); - } else if (!sha256sum_path) { + } else if (!shasum_sha256sum_path) { fprintf(stderr, "sha256sum or shasum is not installed, cannot sign\n"); } else { fprintf(stderr, "%s and %s are installed and user requested to sign, " "hence signing\n", using_gpg ? "gpg" : "gpg2", - using_shasum ? "shasum" : "sha256sum"); + using_shasum ? "shasum" : "sha256sum"); char* digestfile; digestfile = br_strcat(destination, ".digest"); @@ -1103,32 +1102,56 @@ main (int argc, char *argv[]) if (g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) unlink(digestfile); - if (using_shasum) - sprintf(command, "%s -a256 %s", sha256sum_path, destination); - else - sprintf(command, "%s %s", sha256sum_path, destination); + gchar* shasum_sha256sum_command[4] = {shasum_sha256sum_path}; - if (verbose) - fprintf(stderr, "%s\n", command); + if (using_shasum) { + shasum_sha256sum_command[1] = "-a256"; + shasum_sha256sum_command[2] = destination; + } else { + shasum_sha256sum_command[1] = destination; + } - fp = popen(command, "r"); + if (verbose) { + fprintf(stderr, "Running %s process: ", using_shasum ? "shasum" : "sha256sum"); + for (gint j = 0; shasum_sha256sum_command[j] != NULL; ++j) { + fprintf(stderr, "'%s' ", shasum_sha256sum_command[j]); + } + fprintf(stderr, "\n"); + } - if (fp == NULL) - die(using_shasum ? "shasum command did not succeed" : "sha256sum command did not succeed"); + GSubprocess* proc = g_subprocess_newv((const gchar* const*) shasum_sha256sum_command, G_SUBPROCESS_FLAGS_STDOUT_PIPE, &error); - char output[1024]; + if (proc == NULL) { + fprintf(stderr, "ERROR: failed to create %s process: %s\n", using_shasum ? "shasum" : "sha256sum", error->message); + exit(1); + } - fgets(output, sizeof(output) - 1, fp); + GBytes *stdout_buf; + if (!g_subprocess_communicate(proc, NULL, NULL, &stdout_buf, NULL, &error)) { + fprintf(stderr, "ERROR: failed to %s process: %s\n", using_shasum ? "shasum" : "sha256sum", error->message); + g_object_unref(proc); + exit(1); + } - if (pclose(fp) != 0) - die(using_shasum ? "shasum command did not succeed" : "sha256sum command did not succeed"); + if (!g_subprocess_wait_check(proc, NULL, &error)) { + fprintf(stderr, "ERROR: %s process exited abnormally: %s\n", using_shasum ? "shasum" : "sha256sum", error->message); + g_object_unref(proc); + exit(1); + } // let's use a new scope to avoid polluting the scope too much with temporary variables { // the output of sha256sum is always // we have to split the string, the first item contains the hash then - gchar** split_result = g_strsplit_set(output, " ", -1); + + gsize buffer_size; + gchar* buffer_data = (gchar*) g_bytes_get_data(stdout_buf, &buffer_size); + + gchar** split_result = g_strsplit_set(buffer_data, " ", -1); + + // this also frees the stdout buffer, which may be done after its contents have been copied into split_result + g_object_unref(proc); // extract the first item reference, doesn't have to be free-d const gchar* digest_only = split_result[0]; @@ -1146,226 +1169,258 @@ main (int argc, char *argv[]) g_strfreev(split_result); } - fp = NULL; - - if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) + if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) { unlink(ascfile); - - char* key_arg = NULL; - - if (sign_key && strlen(sign_key) > 0) { - key_arg = calloc(sizeof(char), strlen(sign_key) + strlen("--local-user ''")); - - if (key_arg == NULL) - die("malloc() failed"); - - strcpy(key_arg, "--local-user '"); - strcat(key_arg, sign_key); - strcat(key_arg, "'"); } - // passing the passphrase via the environment is at least better than using a CLI parameter - gchar *sign_passphrase = getenv("APPIMAGETOOL_SIGN_PASSPHRASE"); - - sprintf(command, - "%s --detach-sign --armor %s %s %s %s", - gpg2_path, - key_arg ? key_arg : "", - sign_args ? sign_args : "", - sign_passphrase != NULL ? "--passphrase-fd 0 --pinentry-mode loopback" : "", - digestfile - ); - - free(key_arg); - key_arg = NULL; - - if (verbose) - fprintf(stderr, "%s\n", command); + { + // passing the passphrase via the environment is at least better than using a CLI parameter + gchar* sign_passphrase = getenv("APPIMAGETOOL_SIGN_PASSPHRASE"); - fp = popen(command, "w"); + g_autoptr(GPtrArray) sign_process_argv = g_ptr_array_new(); - if (fp == NULL) { - perror("ERROR: popen() call failed"); - exit(1); - } + g_ptr_array_add(sign_process_argv, gpg2_path); + g_ptr_array_add(sign_process_argv, strdup("--detach-sign")); + g_ptr_array_add(sign_process_argv, "--armor"); - // write passphrase to stdin (fd 0 of subprocess) - if (sign_passphrase != NULL) { - if (fwrite(sign_passphrase, sizeof(char), strlen(sign_passphrase), fp) != strlen(sign_passphrase)) { - perror("ERROR: failed to pass passphrase to process, exiting"); - exit(1); + if (sign_key && strlen(sign_key) > 0) { + g_ptr_array_add(sign_process_argv, "--local-user"); + g_ptr_array_add(sign_process_argv, sign_key); } - } - - if (pclose(fp) != 0) { - int errno_backup = errno; - fprintf(stderr, "ERROR: %s command did not succeed, could not sign (%s), continuing\n", using_gpg ? "gpg" : "gpg2", strerror(errno_backup)); - } else { - fp = NULL; - - FILE* destinationfp = fopen(destination, "r+"); - - // calculate signature - { - unsigned long sig_offset = 0; - unsigned long sig_length = 0; - bool rv = appimage_get_elf_section_offset_and_length(destination, ".sha256_sig", &sig_offset, - &sig_length); + if (sign_args) { + gchar** split = g_strsplit(sign_args, " ", 0); - if (!rv || sig_offset == 0 || sig_length == 0) { - die("Could not find section .sha256_sig in runtime"); + for (size_t split_idx = 0; split[split_idx] != NULL; ++split_idx) { + g_ptr_array_add(sign_process_argv, split[split_idx]); } + } - if (verbose) { - printf("sig_offset: %lu\n", sig_offset); - printf("sig_length: %lu\n", sig_length); - } + if (sign_passphrase) { + g_ptr_array_add(sign_process_argv, "--passphrase-fd"); + g_ptr_array_add(sign_process_argv, "0"); + g_ptr_array_add(sign_process_argv, "--pinentry-mode"); + g_ptr_array_add(sign_process_argv, "loopback"); + } - if (sig_offset == 0) { - die("Could not determine offset for signature"); - } + g_ptr_array_add(sign_process_argv, digestfile); + g_ptr_array_add(sign_process_argv, NULL); - if (destinationfp == NULL) - die("Not able to open the destination file for writing, aborting"); + if (verbose) { + fprintf(stderr, "Running gpg process: "); + for (size_t i = 0; i < sign_process_argv->len; ++i) { + fprintf(stderr, "'%s' ", (char*) g_ptr_array_index(sign_process_argv, i)); + } + fprintf(stderr, "\n"); + } - // if(strlen(updateinformation)>sig_length) - // die("signature does not fit into segment, aborting"); + GSubprocess* sign_proc = g_subprocess_newv((const gchar* const*) sign_process_argv->pdata, G_SUBPROCESS_FLAGS_STDIN_PIPE, &error); - fseek(destinationfp, sig_offset, SEEK_SET); + if (sign_proc == NULL) { + fprintf(stderr, "ERROR: failed to create gpg process: %s\n", error->message); + exit(1); + } - FILE* ascfilefp = fopen(ascfile, "rb"); + if (sign_passphrase) { + bool success = g_subprocess_communicate_utf8(sign_proc, sign_passphrase, NULL, NULL, NULL, &error); - if (ascfilefp == NULL) { - die("Not able to open the asc file for reading, aborting"); + if (!success) { + fprintf(stderr, "ERROR: failed to pass passphrase to gpg process: %s\n", error->message); + g_object_unref(sign_proc); + exit(1); } + } - static const int bufsize = 1024; - char buffer[bufsize]; + if (!g_subprocess_wait_check(sign_proc, NULL, &error)) { + fprintf(stderr, "ERROR: %s command did not succeed, could not sign (%s), continuing\n", + using_gpg ? "gpg" : "gpg2", error->message); + g_object_unref(sign_proc); + } else { + g_object_unref(sign_proc); - size_t totalBytesRead = 0; + FILE* destinationfp = fopen(destination, "r+"); - while (!feof(ascfilefp)) { - size_t bytesRead = fread(buffer, sizeof(char), bufsize, ascfilefp); - totalBytesRead += bytesRead; + // calculate signature + { + unsigned long sig_offset = 0; + unsigned long sig_length = 0; - if (totalBytesRead > sig_length) { - die("Error: cannot embed key in AppImage: size exceeds reserved ELF section size"); + bool rv = appimage_get_elf_section_offset_and_length(destination, ".sha256_sig", + &sig_offset, + &sig_length); + + if (!rv || sig_offset == 0 || sig_length == 0) { + die("Could not find section .sha256_sig in runtime"); } - size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destinationfp); + if (verbose) { + printf("sig_offset: %lu\n", sig_offset); + printf("sig_length: %lu\n", sig_length); + } - if (bytesRead != bytesWritten) { - char message[128]; - sprintf(message, "Bytes read and written differ: %lu != %lu", (long unsigned) bytesRead, - (long unsigned) bytesWritten); - die(message); + if (sig_offset == 0) { + die("Could not determine offset for signature"); } - } - fclose(ascfilefp); - if (g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) - unlink(digestfile); + if (destinationfp == NULL) + die("Not able to open the destination file for writing, aborting"); - if (sign_key == NULL || strlen(sign_key) > 0) { - // read which key was used to sign from signature - sprintf(command, "%s --batch --list-packets %s", gpg2_path, ascfile); + // if(strlen(updateinformation)>sig_length) + // die("signature does not fit into segment, aborting"); - fp = popen(command, "r"); + fseek(destinationfp, sig_offset, SEEK_SET); - if (fp == NULL) - die("Failed to call gpg[2] to detect signature's key ID"); + FILE* ascfilefp = fopen(ascfile, "rb"); - while (!feof(fp)) { - size_t bytesRead = fread(buffer, sizeof(char), bufsize, fp); + if (ascfilefp == NULL) { + die("Not able to open the asc file for reading, aborting"); + } - char* keyid_pos = strstr(buffer, "keyid"); + static const int bufsize = 1024; + char buffer[bufsize]; - if (keyid_pos == NULL) - continue; + size_t totalBytesRead = 0; - char* keyIDBegin = keyid_pos + strlen("keyid "); - char* endOfKeyID = strstr(keyIDBegin, "\n"); + while (!feof(ascfilefp)) { + size_t bytesRead = fread(buffer, sizeof(char), bufsize, ascfilefp); + totalBytesRead += bytesRead; - sign_key = calloc(endOfKeyID - keyIDBegin, sizeof(char)); - memcpy(sign_key, keyIDBegin, endOfKeyID - keyIDBegin); - } + if (totalBytesRead > sig_length) { + die("Error: cannot embed key in AppImage: size exceeds reserved ELF section size"); + } + + size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destinationfp); - // read rest of process input to avoid broken pipe error - while (!feof(fp)) { - fread(buffer, sizeof(char), bufsize, fp); + if (bytesRead != bytesWritten) { + char message[128]; + sprintf(message, "Bytes read and written differ: %lu != %lu", + (long unsigned) bytesRead, + (long unsigned) bytesWritten); + die(message); + } } - int retval = pclose(fp); - fp = NULL; + fclose(ascfilefp); + if (g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) + unlink(digestfile); + + if (sign_key == NULL || strlen(sign_key) > 0) { + // read which key was used to sign from signature + GSubprocess* key_proc = g_subprocess_new( + G_SUBPROCESS_FLAGS_STDOUT_PIPE, + &error, + gpg2_path, + "--batch", + "--list-packets", + ascfile, + NULL + ); + + if (key_proc == NULL) { + fprintf(stderr, "ERROR: failed to create process to fetch key: %s\n", error->message); + exit(1); + } - if (retval != 0) - die("Failed to call gpg[2] to detect signature's key ID"); - } + char* key_proc_stdout_buf; - if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) - unlink(ascfile); - } + if (!g_subprocess_communicate_utf8(key_proc, NULL, NULL, &key_proc_stdout_buf, NULL, &error)) { + fprintf(stderr, "ERROR: failed to fetch key from stdout: %s\n", error->message); + g_object_unref(key_proc); + exit(1); + } - // export key and write into section - { - sprintf(command, "%s --batch --export --armor %s", gpg2_path, sign_key); + if (!g_subprocess_wait_check(key_proc, NULL, &error)) { + fprintf(stderr, "ERROR: key process exited abnormally: %s\n", error->message); + g_object_unref(key_proc); + exit(1); + } - unsigned long key_offset = 0, key_length = 0; + char* keyid_begin = strstr(key_proc_stdout_buf, "keyid"); - bool rv = appimage_get_elf_section_offset_and_length(destination, ".sig_key", &key_offset, &key_length); + if (keyid_begin == NULL) { + fprintf(stderr, "ERROR: could not find keyid begin in gpg output\n"); + g_object_unref(key_proc); + exit(1); + } - if (verbose) { - printf("key_offset: %lu\n", key_offset); - printf("key_length: %lu\n", key_length); - } + keyid_begin += strlen("keyid "); - if (!rv || key_offset == 0 || key_length == 0) { - die("Could not find section .sig_key in runtime"); - } + char* keyid_end = strstr(keyid_begin, "\n"); - fseek(destinationfp, key_offset, SEEK_SET); + if (keyid_end == NULL) { + fprintf(stderr, "ERROR: could not find keyid end in gpg output\n"); + g_object_unref(key_proc); + exit(1); + } - fp = popen(command, "r"); + sign_key = calloc(keyid_end - keyid_begin + 1, sizeof(char)); + memcpy(sign_key, keyid_begin, keyid_end - keyid_begin); + } - if (fp == NULL) - die("Failed to call gpg[2] to export the signature key"); + if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) + unlink(ascfile); + } - static const int bufsize = 1024; - char buffer[bufsize]; + // export key and write into section + { + unsigned long key_offset = 0, key_length = 0; - size_t totalBytesRead = 0; - while (!feof(fp)) { - size_t bytesRead = fread(buffer, sizeof(char), bufsize, fp); - totalBytesRead += bytesRead; + bool rv = appimage_get_elf_section_offset_and_length(destination, ".sig_key", &key_offset, + &key_length); - if (totalBytesRead > key_length) { - // read rest of process input to avoid broken pipe error - while (!feof(fp)) { - fread(buffer, sizeof(char), bufsize, fp); - } + if (verbose) { + printf("key_offset: %lu\n", key_offset); + printf("key_length: %lu\n", key_length); + } - pclose(fp); - die("Error: cannot embed key in AppImage: size exceeds reserved ELF section size"); + if (!rv || key_offset == 0 || key_length == 0) { + die("Could not find section .sig_key in runtime"); } - size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destinationfp); + fseek(destinationfp, (long) key_offset, SEEK_SET); + + GSubprocess *key_export_proc = g_subprocess_new( + G_SUBPROCESS_FLAGS_STDOUT_PIPE, + &error, + gpg2_path, + "--batch", + "--export", + "--armor", + sign_key, + NULL + ); + + if (key_export_proc == NULL) { + fprintf(stderr, "ERROR: failed to create key export process: %s\n", error->message); + exit(1); + } - if (bytesRead != bytesWritten) { - char message[128]; - sprintf(message, "Error: Bytes read and written differ: %lu != %lu", - (long unsigned) bytesRead, (long unsigned) bytesWritten); - die(message); + char* key_export_stdout_buf; + if (!g_subprocess_communicate_utf8(key_export_proc, NULL, NULL, &key_export_stdout_buf, NULL, &error)) { + fprintf(stderr, "ERROR: failed to fetch exported key from stdout: %s\n", error->message); + g_object_unref(key_export_proc); + exit(1); } - } - int exportexitcode = pclose(fp); - fp = NULL; + size_t key_export_stdout_buf_len = strlen(key_export_stdout_buf); + if (key_export_stdout_buf_len > key_length) { + fprintf(stderr, "ERROR: cannot embed key in AppImage: size exceeds reserved ELF section size\n"); + g_object_unref(key_export_proc); + exit(1); + } - if (exportexitcode != 0) { - char message[128]; - sprintf(message, "GPG key export failed: exit code %d", exportexitcode); - die(message); + size_t key_bytes_written = fwrite(key_export_proc, sizeof(char), key_export_stdout_buf_len, destinationfp); + if (key_bytes_written != key_export_stdout_buf_len) { + + fprintf( + stderr, + "ERROR: Bytes read and written differ: %lu != %lu\n", + (long unsigned) key_export_stdout_buf_len, + (long unsigned) key_bytes_written + ); + g_object_unref(key_export_proc); + exit(1); + } } fclose(destinationfp); @@ -1383,38 +1438,36 @@ main (int argc, char *argv[]) fprintf(stderr, "zsyncmake is available and updateinformation is provided, " "hence generating zsync file\n"); - int pid = fork(); - - if (verbose) - fprintf(stderr, "%s %s -u %s", zsyncmake_path, destination, basename(destination)); - - if (pid == -1) { - // fork error - die("fork() failed"); - } else if (pid == 0) { - char* zsyncmake_command[] = {zsyncmake_path, destination, "-u", basename(destination), NULL}; + const gchar* const zsyncmake_command[] = {zsyncmake_path, destination, "-u", basename(destination), NULL}; - // redirect stdout/stderr to /dev/null - int fd = open("/dev/null", O_WRONLY); + if (verbose) { + fprintf(stderr, "Running zsyncmake process: "); + for (gint j = 0; j < (sizeof(zsyncmake_command) / sizeof(char*) - 1); ++j) { + fprintf(stderr, "'%s' ", zsyncmake_command[j]); + } + fprintf(stderr, "\n"); + } - dup2(fd, 1); - dup2(fd, 2); - close(fd); + GSubprocessFlags flags = G_SUBPROCESS_FLAGS_NONE; - execv(zsyncmake_path, zsyncmake_command); + if (!verbose) { + flags = G_SUBPROCESS_FLAGS_STDERR_SILENCE | G_SUBPROCESS_FLAGS_STDOUT_SILENCE; + } - die("execv() should not return"); - } else { - int exitstatus; + GSubprocess* proc = g_subprocess_newv(zsyncmake_command, flags, &error); - if (waitpid(pid, &exitstatus, 0) == -1) { - perror("waitpid() failed"); - exit(EXIT_FAILURE); - } + if (proc == NULL) { + fprintf(stderr, "ERROR: failed to create zsyncmake process: %s\n", error->message); + exit(1); + } - if (WEXITSTATUS(exitstatus) != 0) - die("zsyncmake command did not succeed"); + if (!g_subprocess_wait_check(proc, NULL, &error)) { + fprintf(stderr, "ERROR: zsyncmake returned abnormal exit code: %s\n", error->message); + g_object_unref(proc); + exit(1); } + + g_object_unref(proc); } } From 9095ecec7af55689f52cdef6f78874808e6dd79d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 16 Jul 2022 03:31:43 +0200 Subject: [PATCH 514/544] Allow users to require signing Currently, if signing fails, appimagetool just reports the error but continues to build the AppImage. This is not ideal for automated environments which want to make sure the resulting AppImages have been signed correctly. This commit adds support for the APPIMAGETOOL_FORCE_SIGN environment variable, which makes appimagetool abort in case signing fails. --- src/appimagetool.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index e34e24e6e..7c5e8c006 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1232,9 +1232,16 @@ main (int argc, char *argv[]) } if (!g_subprocess_wait_check(sign_proc, NULL, &error)) { - fprintf(stderr, "ERROR: %s command did not succeed, could not sign (%s), continuing\n", - using_gpg ? "gpg" : "gpg2", error->message); g_object_unref(sign_proc); + + if (getenv("APPIMAGETOOL_FORCE_SIGN") != NULL) { + fprintf(stderr, "ERROR: %s command did not succeed, could not sign (%s), aborting\n", + using_gpg ? "gpg" : "gpg2", error->message); + exit(1); + } else { + fprintf(stderr, "ERROR: %s command did not succeed, could not sign (%s), continuing\n", + using_gpg ? "gpg" : "gpg2", error->message); + } } else { g_object_unref(sign_proc); From b119bbe7ebdb3e48774cca87d83c915d4ce63825 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 16 Jul 2022 03:32:38 +0200 Subject: [PATCH 515/544] Add missing gpg2 flag According to the man page, the other options are not used unless --batch is passed as well. --- src/appimagetool.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/appimagetool.c b/src/appimagetool.c index 7c5e8c006..14738e5fe 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1201,6 +1201,7 @@ main (int argc, char *argv[]) g_ptr_array_add(sign_process_argv, "0"); g_ptr_array_add(sign_process_argv, "--pinentry-mode"); g_ptr_array_add(sign_process_argv, "loopback"); + g_ptr_array_add(sign_process_argv, "--batch"); } g_ptr_array_add(sign_process_argv, digestfile); From 3b5a839fc5dd6b5e052d059f0d80f4870f6db777 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 16 Jul 2022 03:35:33 +0200 Subject: [PATCH 516/544] Allow user interaction with gpg2 process This commit makes sure the parent process's stdin pipe can be used by the gpg2 signing process, allowing user interaction such as passing passphrases etc. --- src/appimagetool.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 14738e5fe..7b8f4889e 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1215,7 +1215,14 @@ main (int argc, char *argv[]) fprintf(stderr, "\n"); } - GSubprocess* sign_proc = g_subprocess_newv((const gchar* const*) sign_process_argv->pdata, G_SUBPROCESS_FLAGS_STDIN_PIPE, &error); + // this should allow the user to, e.g., reply to a prompt + GSubprocessFlags flags = G_SUBPROCESS_FLAGS_STDIN_INHERIT; + + if (sign_passphrase) { + flags = G_SUBPROCESS_FLAGS_STDIN_PIPE; + } + + GSubprocess* sign_proc = g_subprocess_newv((const gchar* const*) sign_process_argv->pdata, flags, &error); if (sign_proc == NULL) { fprintf(stderr, "ERROR: failed to create gpg process: %s\n", error->message); @@ -1225,6 +1232,8 @@ main (int argc, char *argv[]) if (sign_passphrase) { bool success = g_subprocess_communicate_utf8(sign_proc, sign_passphrase, NULL, NULL, NULL, &error); + free(sign_passphrase_buffer); + if (!success) { fprintf(stderr, "ERROR: failed to pass passphrase to gpg process: %s\n", error->message); g_object_unref(sign_proc); From 6f6836f448ec46b4a8441c79db5bf3ab3bc63720 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 16 Jul 2022 03:39:02 +0200 Subject: [PATCH 517/544] Notify user when using APPIMAGETOOL_SIGN_PASSPHRASE --- src/appimagetool.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/appimagetool.c b/src/appimagetool.c index 7b8f4889e..6cd2f6cff 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1197,6 +1197,7 @@ main (int argc, char *argv[]) } if (sign_passphrase) { + fprintf(stderr, "Signing using passphrase from environment variable\n"); g_ptr_array_add(sign_process_argv, "--passphrase-fd"); g_ptr_array_add(sign_process_argv, "0"); g_ptr_array_add(sign_process_argv, "--pinentry-mode"); From 7f9be6958ea3723d15f2e7a338e6da6e3d28baf2 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 16 Jul 2022 04:22:32 +0200 Subject: [PATCH 518/544] Remove obsolete debug code --- src/appimagetool.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 6cd2f6cff..7c436c222 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1233,8 +1233,6 @@ main (int argc, char *argv[]) if (sign_passphrase) { bool success = g_subprocess_communicate_utf8(sign_proc, sign_passphrase, NULL, NULL, NULL, &error); - free(sign_passphrase_buffer); - if (!success) { fprintf(stderr, "ERROR: failed to pass passphrase to gpg process: %s\n", error->message); g_object_unref(sign_proc); From e561a5e20d33355b5621d185b1d038077151fe85 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 25 Jul 2022 01:21:58 +0200 Subject: [PATCH 519/544] Update build environment to bionic xenial has been EOL for a year already. --- ci/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/build.sh b/ci/build.sh index 87932d709..390170dc2 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -22,7 +22,7 @@ case "$ARCH" in docker_dist=centos7 ;; armhf|aarch64) - docker_dist=xenial + docker_dist=bionic ;; *) echo "Unknown architecture: $ARCH" From ed692d71dee4ed19c8d6ef15c98442c2acf94e99 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 27 Jul 2022 03:08:48 +0200 Subject: [PATCH 520/544] Fix squashfuse build with newer automake versions After updating the AppImageBuild Docker images, we had to adjust some details around the build of mksquashfs within libappimage 0.1.x. --- lib/libappimage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libappimage b/lib/libappimage index 13f401a4a..9c1fae809 160000 --- a/lib/libappimage +++ b/lib/libappimage @@ -1 +1 @@ -Subproject commit 13f401a4a384ec59ec9a144e2a7006adf751571f +Subproject commit 9c1fae809dedbb3015e9cd5b46e2b5aab06df36e From e15fd5f41f73b106c70bbb0d7a853f4786797047 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 20 Jul 2022 14:09:36 +0200 Subject: [PATCH 521/544] Rewrite signing using gpgme and gcrypt --- src/CMakeLists.txt | 9 + src/appimagetool.c | 382 +----------------------------------- src/appimagetool_sign.c | 425 ++++++++++++++++++++++++++++++++++++++++ src/appimagetool_sign.h | 3 + 4 files changed, 445 insertions(+), 374 deletions(-) create mode 100644 src/appimagetool_sign.c create mode 100644 src/appimagetool_sign.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cdc6d851a..f2247b405 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -18,6 +18,7 @@ include(build-runtime.cmake) add_executable(appimagetool appimagetool.c + appimagetool_sign.c binreloc.c runtime_embed.o ) @@ -27,6 +28,12 @@ target_include_directories(appimagetool INTERFACE $ ) +# required for appimagetool's signing +# we're using CMake's functionality directly, since we want to link those statically +find_package(PkgConfig) +pkg_check_modules(libgpgme REQUIRED gpgme IMPORTED_TARGET) +pkg_check_modules(libgcrypt REQUIRED libgcrypt IMPORTED_TARGET) + # trick: list libraries on which imported static ones depend on in the PUBLIC section # CMake then adds them after the PRIVATE ones in the linker command target_link_libraries(appimagetool @@ -37,6 +44,8 @@ target_link_libraries(appimagetool libglib libgio libzlib + PkgConfig::libgcrypt + PkgConfig::libgpgme xz ) diff --git a/src/appimagetool.c b/src/appimagetool.c index 7c436c222..9dd0ec153 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -53,8 +53,11 @@ #include #include #include +#include +#include #include "appimage/appimage.h" +#include "appimagetool_sign.h" #ifdef __linux__ #define HAVE_BINARY_RUNTIME @@ -1066,381 +1069,12 @@ main (int argc, char *argv[]) } if (sign) { - bool using_gpg = FALSE; - bool using_shasum = FALSE; - - /* The user has indicated that he wants to sign */ - gchar* gpg2_path = g_find_program_in_path("gpg2"); - - if (!gpg2_path) { - gpg2_path = g_find_program_in_path("gpg"); - using_gpg = TRUE; - } - - gchar* shasum_sha256sum_path = g_find_program_in_path("sha256sum"); - - if (!shasum_sha256sum_path) { - shasum_sha256sum_path = g_find_program_in_path("shasum"); - using_shasum = 1; - } - - if (!gpg2_path) { - fprintf(stderr, "gpg2 or gpg is not installed, cannot sign\n"); - } else if (!shasum_sha256sum_path) { - fprintf(stderr, "sha256sum or shasum is not installed, cannot sign\n"); - } else { - fprintf(stderr, "%s and %s are installed and user requested to sign, " - "hence signing\n", using_gpg ? "gpg" : "gpg2", - using_shasum ? "shasum" : "sha256sum"); - - char* digestfile; - digestfile = br_strcat(destination, ".digest"); - - char* ascfile; - ascfile = br_strcat(destination, ".digest.asc"); - - if (g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) - unlink(digestfile); - - gchar* shasum_sha256sum_command[4] = {shasum_sha256sum_path}; - - if (using_shasum) { - shasum_sha256sum_command[1] = "-a256"; - shasum_sha256sum_command[2] = destination; - } else { - shasum_sha256sum_command[1] = destination; - } - - if (verbose) { - fprintf(stderr, "Running %s process: ", using_shasum ? "shasum" : "sha256sum"); - for (gint j = 0; shasum_sha256sum_command[j] != NULL; ++j) { - fprintf(stderr, "'%s' ", shasum_sha256sum_command[j]); - } - fprintf(stderr, "\n"); - } - - GSubprocess* proc = g_subprocess_newv((const gchar* const*) shasum_sha256sum_command, G_SUBPROCESS_FLAGS_STDOUT_PIPE, &error); - - if (proc == NULL) { - fprintf(stderr, "ERROR: failed to create %s process: %s\n", using_shasum ? "shasum" : "sha256sum", error->message); + if (!sign_appimage(destination, sign_key, verbose)) { + if (getenv("APPIMAGETOOL_FORCE_SIGN") != NULL) { + fprintf(stderr, "ERROR: signing failed, aborting\n"); exit(1); - } - - GBytes *stdout_buf; - - if (!g_subprocess_communicate(proc, NULL, NULL, &stdout_buf, NULL, &error)) { - fprintf(stderr, "ERROR: failed to %s process: %s\n", using_shasum ? "shasum" : "sha256sum", error->message); - g_object_unref(proc); - exit(1); - } - - if (!g_subprocess_wait_check(proc, NULL, &error)) { - fprintf(stderr, "ERROR: %s process exited abnormally: %s\n", using_shasum ? "shasum" : "sha256sum", error->message); - g_object_unref(proc); - exit(1); - } - - // let's use a new scope to avoid polluting the scope too much with temporary variables - { - // the output of sha256sum is always - // we have to split the string, the first item contains the hash then - - gsize buffer_size; - gchar* buffer_data = (gchar*) g_bytes_get_data(stdout_buf, &buffer_size); - - gchar** split_result = g_strsplit_set(buffer_data, " ", -1); - - // this also frees the stdout buffer, which may be done after its contents have been copied into split_result - g_object_unref(proc); - - // extract the first item reference, doesn't have to be free-d - const gchar* digest_only = split_result[0]; - - // print hash which is later signed for debugging purposes - printf("Signing using SHA256 digest: %s\n", digest_only); - - FILE* fpx = fopen(digestfile, "w"); - - if (fpx != NULL) { - fputs(digest_only, fpx); - fclose(fpx); - } - - g_strfreev(split_result); - } - - if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) { - unlink(ascfile); - } - - { - // passing the passphrase via the environment is at least better than using a CLI parameter - gchar* sign_passphrase = getenv("APPIMAGETOOL_SIGN_PASSPHRASE"); - - g_autoptr(GPtrArray) sign_process_argv = g_ptr_array_new(); - - g_ptr_array_add(sign_process_argv, gpg2_path); - g_ptr_array_add(sign_process_argv, strdup("--detach-sign")); - g_ptr_array_add(sign_process_argv, "--armor"); - - if (sign_key && strlen(sign_key) > 0) { - g_ptr_array_add(sign_process_argv, "--local-user"); - g_ptr_array_add(sign_process_argv, sign_key); - } - - if (sign_args) { - gchar** split = g_strsplit(sign_args, " ", 0); - - for (size_t split_idx = 0; split[split_idx] != NULL; ++split_idx) { - g_ptr_array_add(sign_process_argv, split[split_idx]); - } - } - - if (sign_passphrase) { - fprintf(stderr, "Signing using passphrase from environment variable\n"); - g_ptr_array_add(sign_process_argv, "--passphrase-fd"); - g_ptr_array_add(sign_process_argv, "0"); - g_ptr_array_add(sign_process_argv, "--pinentry-mode"); - g_ptr_array_add(sign_process_argv, "loopback"); - g_ptr_array_add(sign_process_argv, "--batch"); - } - - g_ptr_array_add(sign_process_argv, digestfile); - g_ptr_array_add(sign_process_argv, NULL); - - if (verbose) { - fprintf(stderr, "Running gpg process: "); - for (size_t i = 0; i < sign_process_argv->len; ++i) { - fprintf(stderr, "'%s' ", (char*) g_ptr_array_index(sign_process_argv, i)); - } - fprintf(stderr, "\n"); - } - - // this should allow the user to, e.g., reply to a prompt - GSubprocessFlags flags = G_SUBPROCESS_FLAGS_STDIN_INHERIT; - - if (sign_passphrase) { - flags = G_SUBPROCESS_FLAGS_STDIN_PIPE; - } - - GSubprocess* sign_proc = g_subprocess_newv((const gchar* const*) sign_process_argv->pdata, flags, &error); - - if (sign_proc == NULL) { - fprintf(stderr, "ERROR: failed to create gpg process: %s\n", error->message); - exit(1); - } - - if (sign_passphrase) { - bool success = g_subprocess_communicate_utf8(sign_proc, sign_passphrase, NULL, NULL, NULL, &error); - - if (!success) { - fprintf(stderr, "ERROR: failed to pass passphrase to gpg process: %s\n", error->message); - g_object_unref(sign_proc); - exit(1); - } - } - - if (!g_subprocess_wait_check(sign_proc, NULL, &error)) { - g_object_unref(sign_proc); - - if (getenv("APPIMAGETOOL_FORCE_SIGN") != NULL) { - fprintf(stderr, "ERROR: %s command did not succeed, could not sign (%s), aborting\n", - using_gpg ? "gpg" : "gpg2", error->message); - exit(1); - } else { - fprintf(stderr, "ERROR: %s command did not succeed, could not sign (%s), continuing\n", - using_gpg ? "gpg" : "gpg2", error->message); - } - } else { - g_object_unref(sign_proc); - - FILE* destinationfp = fopen(destination, "r+"); - - // calculate signature - { - unsigned long sig_offset = 0; - unsigned long sig_length = 0; - - bool rv = appimage_get_elf_section_offset_and_length(destination, ".sha256_sig", - &sig_offset, - &sig_length); - - if (!rv || sig_offset == 0 || sig_length == 0) { - die("Could not find section .sha256_sig in runtime"); - } - - if (verbose) { - printf("sig_offset: %lu\n", sig_offset); - printf("sig_length: %lu\n", sig_length); - } - - if (sig_offset == 0) { - die("Could not determine offset for signature"); - } - - if (destinationfp == NULL) - die("Not able to open the destination file for writing, aborting"); - - // if(strlen(updateinformation)>sig_length) - // die("signature does not fit into segment, aborting"); - - fseek(destinationfp, sig_offset, SEEK_SET); - - FILE* ascfilefp = fopen(ascfile, "rb"); - - if (ascfilefp == NULL) { - die("Not able to open the asc file for reading, aborting"); - } - - static const int bufsize = 1024; - char buffer[bufsize]; - - size_t totalBytesRead = 0; - - while (!feof(ascfilefp)) { - size_t bytesRead = fread(buffer, sizeof(char), bufsize, ascfilefp); - totalBytesRead += bytesRead; - - if (totalBytesRead > sig_length) { - die("Error: cannot embed key in AppImage: size exceeds reserved ELF section size"); - } - - size_t bytesWritten = fwrite(buffer, sizeof(char), bytesRead, destinationfp); - - if (bytesRead != bytesWritten) { - char message[128]; - sprintf(message, "Bytes read and written differ: %lu != %lu", - (long unsigned) bytesRead, - (long unsigned) bytesWritten); - die(message); - } - } - - fclose(ascfilefp); - if (g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) - unlink(digestfile); - - if (sign_key == NULL || strlen(sign_key) > 0) { - // read which key was used to sign from signature - GSubprocess* key_proc = g_subprocess_new( - G_SUBPROCESS_FLAGS_STDOUT_PIPE, - &error, - gpg2_path, - "--batch", - "--list-packets", - ascfile, - NULL - ); - - if (key_proc == NULL) { - fprintf(stderr, "ERROR: failed to create process to fetch key: %s\n", error->message); - exit(1); - } - - char* key_proc_stdout_buf; - - if (!g_subprocess_communicate_utf8(key_proc, NULL, NULL, &key_proc_stdout_buf, NULL, &error)) { - fprintf(stderr, "ERROR: failed to fetch key from stdout: %s\n", error->message); - g_object_unref(key_proc); - exit(1); - } - - if (!g_subprocess_wait_check(key_proc, NULL, &error)) { - fprintf(stderr, "ERROR: key process exited abnormally: %s\n", error->message); - g_object_unref(key_proc); - exit(1); - } - - char* keyid_begin = strstr(key_proc_stdout_buf, "keyid"); - - if (keyid_begin == NULL) { - fprintf(stderr, "ERROR: could not find keyid begin in gpg output\n"); - g_object_unref(key_proc); - exit(1); - } - - keyid_begin += strlen("keyid "); - - char* keyid_end = strstr(keyid_begin, "\n"); - - if (keyid_end == NULL) { - fprintf(stderr, "ERROR: could not find keyid end in gpg output\n"); - g_object_unref(key_proc); - exit(1); - } - - sign_key = calloc(keyid_end - keyid_begin + 1, sizeof(char)); - memcpy(sign_key, keyid_begin, keyid_end - keyid_begin); - } - - if (g_file_test(ascfile, G_FILE_TEST_IS_REGULAR)) - unlink(ascfile); - } - - // export key and write into section - { - unsigned long key_offset = 0, key_length = 0; - - bool rv = appimage_get_elf_section_offset_and_length(destination, ".sig_key", &key_offset, - &key_length); - - if (verbose) { - printf("key_offset: %lu\n", key_offset); - printf("key_length: %lu\n", key_length); - } - - if (!rv || key_offset == 0 || key_length == 0) { - die("Could not find section .sig_key in runtime"); - } - - fseek(destinationfp, (long) key_offset, SEEK_SET); - - GSubprocess *key_export_proc = g_subprocess_new( - G_SUBPROCESS_FLAGS_STDOUT_PIPE, - &error, - gpg2_path, - "--batch", - "--export", - "--armor", - sign_key, - NULL - ); - - if (key_export_proc == NULL) { - fprintf(stderr, "ERROR: failed to create key export process: %s\n", error->message); - exit(1); - } - - char* key_export_stdout_buf; - if (!g_subprocess_communicate_utf8(key_export_proc, NULL, NULL, &key_export_stdout_buf, NULL, &error)) { - fprintf(stderr, "ERROR: failed to fetch exported key from stdout: %s\n", error->message); - g_object_unref(key_export_proc); - exit(1); - } - - size_t key_export_stdout_buf_len = strlen(key_export_stdout_buf); - if (key_export_stdout_buf_len > key_length) { - fprintf(stderr, "ERROR: cannot embed key in AppImage: size exceeds reserved ELF section size\n"); - g_object_unref(key_export_proc); - exit(1); - } - - size_t key_bytes_written = fwrite(key_export_proc, sizeof(char), key_export_stdout_buf_len, destinationfp); - if (key_bytes_written != key_export_stdout_buf_len) { - - fprintf( - stderr, - "ERROR: Bytes read and written differ: %lu != %lu\n", - (long unsigned) key_export_stdout_buf_len, - (long unsigned) key_bytes_written - ); - g_object_unref(key_export_proc); - exit(1); - } - } - - fclose(destinationfp); - } + } else { + fprintf(stderr, "ERROR: signing failed, continuing\n"); } } } diff --git a/src/appimagetool_sign.c b/src/appimagetool_sign.c new file mode 100644 index 000000000..31112e84f --- /dev/null +++ b/src/appimagetool_sign.c @@ -0,0 +1,425 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "binreloc.h" +#include "appimage/appimage_shared.h" + +// used to identify calls to the callback +static const char gpgme_hook[] = "appimagetool gpgme hook"; +static const char signature_elf_section[] = ".sha256_sig"; +static const char key_elf_section[] = ".sig_key"; + +char* get_passphrase_from_environment() { + return getenv("APPIMAGETOOL_SIGN_PASSPHRASE"); +} + +gpgme_error_t gpgme_passphrase_callback(void* hook, const char* uid_hint, const char* passphrase_info, int prev_was_valid, int fd) { + (void) passphrase_info; + (void) prev_was_valid; + + assert(hook == gpgme_hook); + + // passing the passphrase via the environment is at least better than using a CLI parameter + char* passphrase_from_env = get_passphrase_from_environment(); + + if (passphrase_from_env == NULL) { + fprintf(stderr, "[sign] no passphrase available from environment\n"); + return GPG_ERR_NO_PASSPHRASE; + } + + fprintf(stderr, "[sign] providing passphrase for key %s\n", uid_hint); + + gpgme_io_writen(fd, passphrase_from_env, strlen(passphrase_from_env)); + + // need to write a newline character according to the docs + // maybe this would have solved the hanging issues we had with gpg(2) as a subprocess when writing to stdin...? + gpgme_io_writen(fd, "\n", 1); + + return GPG_ERR_NO_ERROR; +} + +gpgme_error_t gpgme_status_callback(void* hook, const char* keyword, const char* args) { + assert(hook == gpgme_hook); + + fprintf(stderr, "[gpgme] %s: %s\n", keyword, args); + return GPG_ERR_NO_ERROR; +} + +// all of these are from gpg based libraries, and are used exclusively in the code below +// whenever there is an error in sign_appimage, we can free() up these resources +static gpgme_ctx_t gpgme_ctx = NULL; +static gpgme_data_t gpgme_appimage_file_data = NULL; +static gpgme_data_t gpgme_sig_data = NULL; +// we support just a single key at the moment +static gpgme_key_t gpgme_key = NULL; +static gpgme_data_t gpgme_key_data = NULL; + +// this little helper can be called wherever the resources above must be released +void release_resources() { + if (gpgme_appimage_file_data != NULL) { + gpgme_data_release(gpgme_appimage_file_data); + gpgme_appimage_file_data = NULL; + } + if (gpgme_sig_data != NULL) { + gpgme_data_release(gpgme_sig_data); + gpgme_sig_data = NULL; + } + if (gpgme_ctx != NULL) { + gpgme_release(gpgme_ctx); + gpgme_ctx = NULL; + } + if (gpgme_key != NULL) { + gpgme_key_release(gpgme_key); + gpgme_key = NULL; + } + if (gpgme_key_data != NULL) { + gpgme_data_release(gpgme_key_data); + gpgme_key_data = NULL; + } +} + +// it's possible to use a single macro to error-check both gpgme and gcrypt, since both originate from the gpg project +// the error types gcry_error_t and gpgme_error_t are both aliases for gpg_error_t +#define gpg_check_call(call_to_function) \ + { \ + gpg_error_t error = (call_to_function); \ + if (error != GPG_ERR_NO_ERROR) { \ + fprintf(stderr, "[sign] %s: call failed: %s\n", #call_to_function, gpgme_strerror(error)); \ + release_resources(); \ + return false; \ + } \ + } + +char* calculate_sha256_hex_digest(char* filename) { + // like gcrypt, gcrypt must be initialized + { + static const char gcrypt_minimum_required_version[] = "1.8.1"; + const char* gcrypt_version = gcry_check_version(gcrypt_minimum_required_version); + + if (gcrypt_version == NULL) { + fprintf(stderr, "[sign] could not initialize gcrypt (>= %s)\n", gcrypt_minimum_required_version); + release_resources(); + return NULL; + } else { + fprintf(stderr, "[sign] found gcrypt version %s\n", gcrypt_version); + } + } + + // algo is defined by the spec + static const int hash_algo = GCRY_MD_SHA256; + + // open file and feed data chunk wise to gcrypt + FILE* file = fopen(filename, "r"); + if (file == NULL) { + fprintf(stderr, "[sign] could not calculate digest: opening file %s failed", filename); + release_resources(); + return NULL; + } + + gcry_md_hd_t gcry_md_handle = NULL; + + gpg_check_call(gcry_md_open(&gcry_md_handle, hash_algo, 0)); + + // 4k chunks should work well enough + char read_buffer[4096 * sizeof(char)]; + + for (;;) { + size_t bytes_read = fread(read_buffer, sizeof(char), sizeof(read_buffer), file); + + // if we have an error, we can stop immediately + if (ferror(file) != 0) { + fprintf(stderr, "[sign] failed to read chunk for hashing from file %s\n", filename); + fclose(file); + gcry_md_close(gcry_md_handle); + return NULL; + } + + gcry_md_write(gcry_md_handle, read_buffer, bytes_read); + + // once we read all the data, we can stop + if (feof(file) != 0) { + break; + } + } + + // done, we can close the file + // since we do no longer have to worry about the file pointer, we can use gpg_check_call just fine below + if (fclose(file) != 0) { + fprintf(stderr, "[sign] failed to close hashed file %s\n", filename); + gcry_md_close(gcry_md_handle); + return NULL; + } + + gpg_check_call(gcry_md_final(gcry_md_handle)); + + // conveniently, we can ask gcrypt for the digest size + unsigned int digest_size = gcry_md_get_algo_dlen(hash_algo); + + // read raw digest (i.e., memory-readable, not hexlified like, e.g., sha256sum would return) + unsigned char* digest_in_ctx = gcry_md_read(gcry_md_handle, hash_algo); + + if (digest_in_ctx == NULL) { + fprintf(stderr, "[sign] gcry_md_read failed\n"); + gcry_md_close(gcry_md_handle); + return NULL; + } + + // create "human-readable" version for the output + // the method allocates a suitable string buffer + // needs to be done before releasing the handle since this destroys digest_in_ctx + char* out_buffer = appimage_hexlify((const char*) digest_in_ctx, digest_size); + + // release all resources and return the result to the caller + gcry_md_close(gcry_md_handle); + + return out_buffer; +} + +bool add_signers(const char* key_id) { + // if a key id is specified, we ask gpgme to use this key explicitly, otherwise we use the first key in gpgme's list + if (key_id != NULL) { + // we could use the list stuff below, but using gpgme_get_key is a lot easier... + gpg_check_call(gpgme_get_key(gpgme_ctx, key_id, &gpgme_key, true)); + } else { + // searching the "first available key" is a little complex in gpgme... + // since we are just looking for the first one, we don't need a loop at least + gpg_check_call(gpgme_op_keylist_start(gpgme_ctx, NULL, 0)); + gpg_check_call(gpgme_op_keylist_next(gpgme_ctx, &gpgme_key)); + } + + fprintf(stderr, "[sign] using key with fingerprint %s, issuer name %s\n", gpgme_key->fpr, gpgme_key->uids->name); + gpg_check_call(gpgme_signers_add(gpgme_ctx, gpgme_key)); + + return true; +} + +bool embed_data_in_elf_section(const char* filename, const char* elf_section, gpgme_data_t data, bool verbose) { + // first up: find the ELF section in the AppImage file + unsigned long key_section_offset = 0; + unsigned long key_section_length = 0; + + if (verbose) { + fprintf(stderr, "[sign] embedding data in ELF section %s\n", elf_section); + } + + bool rv = appimage_get_elf_section_offset_and_length( + filename, + elf_section, + &key_section_offset, + &key_section_length + ); + + if (!rv || key_section_offset == 0 || key_section_length == 0) { + fprintf(stderr, "[sign] could not determine offset for signature\n"); + release_resources(); + return false; + } + + if (verbose) { + fprintf(stderr, "[sign] key_offset: %lu\n", key_section_offset); + fprintf(stderr, "[sign] key_length: %lu\n", key_section_length); + } + + // next, read the exported key's size from the data object + const off_t data_size = gpgme_data_seek(data, 0, SEEK_END); + if (data_size < 0) { + fprintf(stderr, "[sign] failed to detect size of signature\n"); + release_resources(); + return false; + } + + if (verbose) { + fprintf(stderr, "[sign] data size: %lu\n", data_size); + } + + // rewind so we can later read the data + if (gpgme_data_seek(data, 0, SEEK_SET) < 0) { + fprintf(stderr, "[sign] failed to rewind data object\n"); + release_resources(); + return false; + } + + if (data_size > key_section_length) { + fprintf(stderr, "[sign] cannot embed key in AppImage: size exceeds reserved ELF section size\n"); + release_resources(); + return false; + } + + // we need to read the signature into a custom buffer + char data_buffer[data_size]; + + size_t total_bytes_read = 0; + size_t bytes_read = 0; + + for (;;) { + bytes_read = gpgme_data_read(data, data_buffer, data_size); + + // EOF + if (bytes_read == 0) { + break; + } + + // error + if (bytes_read < 0) { + fprintf(stderr, "[sign] failed to read from data object\n"); + release_resources(); + return false; + } + + total_bytes_read += bytes_read; + } + + if (total_bytes_read != data_size) { + fprintf( + stderr, + "[sign] failed to read entire data from data object (%lu != %lu)\n", + total_bytes_read, + data_size + ); + release_resources(); + return false; + } + + FILE* destinationfp = fopen(filename, "r+"); + + if (destinationfp == NULL) { + fprintf(stderr, "[sign] failed to open the destination file for writing\n"); + release_resources(); + return false; + } + + if (fseek(destinationfp, (long) key_section_offset, SEEK_SET) < 0) { + fprintf(stderr, "[sign] fseek failed: %s\n", strerror(errno)); + release_resources(); + fclose(destinationfp); + return false; + } + + // write at once + if (fwrite(data_buffer, sizeof(char), data_size, destinationfp) != data_size) { + fprintf(stderr, "[sign] failed to write signature to AppImage file\n"); + release_resources(); + fclose(destinationfp); + return false; + } + + // done -> release file descriptor + if (fclose(destinationfp) != 0) { + fprintf(stderr, "[sign] failed to close file descriptor: %s\n", strerror(errno)); + release_resources(); + return false; + } + + return true; +} + +bool sign_appimage(char* appimage_filename, char* key_id, bool verbose) { + fprintf(stderr, "[sign] signing requested"); + + // like gcrypt, gpgme must be initialized + { + static const char gpgme_minimum_required_version[] = "1.10.0"; + const char* gpgme_version = gpgme_check_version(gpgme_minimum_required_version); + + if (gpgme_version == NULL) { + fprintf(stderr, "[sign] could not initialize gpgme (>= %s)\n", gpgme_minimum_required_version); + release_resources(); + return false; + } else { + fprintf(stderr, "[sign] found gpgme version %s\n", gpgme_version); + } + } + + // as per the spec, an SHA256 hash is signed and the signature is then embedded in the AppImage + char* hex_digest = calculate_sha256_hex_digest(appimage_filename); + if (hex_digest == NULL) { + release_resources(); + return false; + } + + fprintf(stderr, "[sign] calculated digest: %s\n", hex_digest); + + system("realpath sleep-x86_64.AppImage"); + + gpg_check_call(gpgme_new(&gpgme_ctx)); + + // we want an ASCII armored signature of plain text (hex string) + gpgme_set_textmode(gpgme_ctx, true); + gpgme_set_armor(gpgme_ctx, true); + + // in case the user provides a passphrase in the environment, we have to set the pinentry mode to loopback, like with the CLI + if (get_passphrase_from_environment() != NULL) { + gpgme_set_pinentry_mode(gpgme_ctx, GPGME_PINENTRY_MODE_LOOPBACK); + gpgme_set_passphrase_cb(gpgme_ctx, gpgme_passphrase_callback, (void*) gpgme_hook); + } + + // implement some fancy logging with log prefixes and stuff + gpgme_set_status_cb(gpgme_ctx, gpgme_status_callback, (void*) gpgme_hook); + + if (!add_signers(key_id)) { + release_resources(); + return false; + } + + assert(gpgme_key != NULL); + + // we don't have to let gpgme copy the data since we can ensure the buffer remains valid the entire time + gpg_check_call(gpgme_data_new_from_mem(&gpgme_appimage_file_data, hex_digest, strlen(hex_digest), 0)); + + // we further need an out buffer to store the signature, we let gpgme handle the allocation + gpg_check_call(gpgme_data_new(&gpgme_sig_data)); + + // now, we can sign the data + gpg_check_call(gpgme_op_sign(gpgme_ctx, gpgme_appimage_file_data, gpgme_sig_data, GPGME_SIG_MODE_NORMAL)); + + gpgme_sign_result_t sign_result = gpgme_op_sign_result(gpgme_ctx); + + if (sign_result == NULL) { + fprintf(stderr, "[sign] signing failed\n"); + release_resources(); + exit(1); + } + + // we expect exactly one signature + assert(sign_result->signatures->next == NULL); + + fprintf( + stderr, + "[sign] signed using pubkey algo %s, hash algo %s, key fingerprint %s\n", + gpgme_pubkey_algo_name(sign_result->signatures->pubkey_algo), + gpgme_hash_algo_name(sign_result->signatures->hash_algo), + sign_result->signatures->fpr + ); + + fprintf(stderr, "[sign] embedding signature in AppImage\n"); + if (!embed_data_in_elf_section(appimage_filename, signature_elf_section, gpgme_sig_data, verbose)) { + fprintf(stderr, "[sign] failed to embed signature in AppImage\n"); + release_resources(); + return false; + } + + // exporting the key to a gpgme data object is relatively easy + gpgme_data_new(&gpgme_key_data); + gpgme_key_t keys_to_export[] = {gpgme_key, NULL}; + gpg_check_call(gpgme_op_export_keys(gpgme_ctx, keys_to_export, 0, gpgme_key_data)); + + fprintf(stderr, "[sign] embedding key in AppImage\n"); + if (!embed_data_in_elf_section(appimage_filename, key_elf_section, gpgme_key_data, verbose)) { + fprintf(stderr, "[sign] failed to embed key in AppImage\n"); + release_resources(); + return false; + } + + release_resources(); + return true; +} + + diff --git a/src/appimagetool_sign.h b/src/appimagetool_sign.h new file mode 100644 index 000000000..c7253b26e --- /dev/null +++ b/src/appimagetool_sign.h @@ -0,0 +1,3 @@ +#pragma once + +bool sign_appimage(char* appimage_filename, char* key_id, bool verbose); From 181f8e92ced472e2ecf60c5a97fd386bf01c4204 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 27 Jul 2022 17:35:10 +0200 Subject: [PATCH 522/544] Fix missing newline character in log message --- src/appimagetool_sign.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/appimagetool_sign.c b/src/appimagetool_sign.c index 31112e84f..d7e804af7 100644 --- a/src/appimagetool_sign.c +++ b/src/appimagetool_sign.c @@ -322,7 +322,7 @@ bool embed_data_in_elf_section(const char* filename, const char* elf_section, gp } bool sign_appimage(char* appimage_filename, char* key_id, bool verbose) { - fprintf(stderr, "[sign] signing requested"); + fprintf(stderr, "[sign] signing requested\n"); // like gcrypt, gpgme must be initialized { From d555677710efef322d69a79635bb7a7bc8201305 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 27 Jul 2022 17:35:23 +0200 Subject: [PATCH 523/544] Remove outdated debug statement --- src/appimagetool_sign.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/appimagetool_sign.c b/src/appimagetool_sign.c index d7e804af7..5a84da8c3 100644 --- a/src/appimagetool_sign.c +++ b/src/appimagetool_sign.c @@ -347,8 +347,6 @@ bool sign_appimage(char* appimage_filename, char* key_id, bool verbose) { fprintf(stderr, "[sign] calculated digest: %s\n", hex_digest); - system("realpath sleep-x86_64.AppImage"); - gpg_check_call(gpgme_new(&gpgme_ctx)); // we want an ASCII armored signature of plain text (hex string) From 912c4f9b44f2a5a537f1b7399479aa0678b0416a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 29 Jul 2022 18:32:45 +0200 Subject: [PATCH 524/544] Bundle desktop-file-validate This PR bundles desktop-file-validate inside the appimagetool AppDir. Fixes #1171. --- ci/build-appdir.sh | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/ci/build-appdir.sh b/ci/build-appdir.sh index 4be7c977a..00a1ce32b 100755 --- a/ci/build-appdir.sh +++ b/ci/build-appdir.sh @@ -50,23 +50,40 @@ cp "$repo_root"/resources/appimagetool.desktop "$appimagetool_appdir" cp "$repo_root"/resources/appimagetool.png "$appimagetool_appdir"/appimagetool.png cp "$appimagetool_appdir"/appimagetool.png "$appimagetool_appdir"/.DirIcon +# bundle desktop-file-validate +# https://github.com/AppImage/AppImageKit/issues/1171 +install -D "$(which desktop-file-validate)" "$appimagetool_appdir"/usr/bin/ + if [ -d /deps/ ]; then - # deploy GLib + # deploy GLib, gpgme and gcrypt mkdir -p "$appimagetool_appdir"/usr/lib/ cp /deps/lib/lib*.so* "$appimagetool_appdir"/usr/lib/ + + case "$ARCH" in + x86_64) + libarch=x86-64 + ;; + i686) + libarch=i386 + ;; + armhf) + libarch=arm + ;; + *) + libarch="$ARCH" + ;; + esac + # libffi is a runtime dynamic dependency # see this thread for more information on the topic: # https://mail.gnome.org/archives/gtk-devel-list/2012-July/msg00062.html - if [ "$ARCH" == "x86_64" ]; then - cp "$(ldconfig -p | grep libffi.so.6 | grep x86-64 | cut -d'>' -f2 | tr -d ' ')" "$appimagetool_appdir"/usr/lib/ - elif [ "$ARCH" == "i686" ]; then - cp "$(ldconfig -p | grep libffi.so.6 | head -n1 | cut -d'>' -f2 | tr -d ' ')" "$appimagetool_appdir"/usr/lib/ - elif [ "$ARCH" == "armhf" ]; then - cp "$(ldconfig -p | grep libffi.so.6 | grep arm | grep hf | cut -d'>' -f2 | tr -d ' ')" "$appimagetool_appdir"/usr/lib/ - elif [ "$ARCH" == "aarch64" ]; then - cp "$(ldconfig -p | grep libffi.so.6 | grep aarch64 | cut -d'>' -f2 | tr -d ' ')" "$appimagetool_appdir"/usr/lib/ - else - echo "WARNING: unknown architecture, not bundling libffi" - fi + # libpcre is used by desktop-file-validate + for pattern in libffi libpcre; do + # even though it is likely not necessary, we deploy every viable version of the libraries just to make sure... + ldconfig -p | grep "$pattern" | grep "$libarch" | while read -r line; do + lib="$(echo "$line" | cut -d'>' -f2 | tr -d ' ')" + cp "$lib" "$appimagetool_appdir"/usr/lib/ + done + done fi From 6443ca05b39805cec3e35b877c23ca1d0298a12a Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 29 Jul 2022 18:39:59 +0200 Subject: [PATCH 525/544] Choose from secret keys only --- src/appimagetool_sign.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/appimagetool_sign.c b/src/appimagetool_sign.c index 5a84da8c3..b758a239e 100644 --- a/src/appimagetool_sign.c +++ b/src/appimagetool_sign.c @@ -189,9 +189,9 @@ bool add_signers(const char* key_id) { // we could use the list stuff below, but using gpgme_get_key is a lot easier... gpg_check_call(gpgme_get_key(gpgme_ctx, key_id, &gpgme_key, true)); } else { - // searching the "first available key" is a little complex in gpgme... + // searching the "first available secret key" is a little complex in gpgme... // since we are just looking for the first one, we don't need a loop at least - gpg_check_call(gpgme_op_keylist_start(gpgme_ctx, NULL, 0)); + gpg_check_call(gpgme_op_keylist_start(gpgme_ctx, NULL, true)); gpg_check_call(gpgme_op_keylist_next(gpgme_ctx, &gpgme_key)); } From 68cdb36ff38e9b09d84a9b00d2fed62ab02ccfb1 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 30 Jul 2022 03:46:28 +0200 Subject: [PATCH 526/544] Fix i386 AppImage --- ci/build-appdir.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ci/build-appdir.sh b/ci/build-appdir.sh index 00a1ce32b..6e5aa5ff2 100755 --- a/ci/build-appdir.sh +++ b/ci/build-appdir.sh @@ -65,7 +65,9 @@ if [ -d /deps/ ]; then libarch=x86-64 ;; i686) - libarch=i386 + # for some reason, ldconfig -p does not list entries with an architecture for i386... + # thankfully, grepping for an empty string is a no-op + libarch= ;; armhf) libarch=arm From a6caef6a1bbffceb9cf9f9becb6b8bf3ef76b20d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 2 Aug 2022 13:44:38 +0200 Subject: [PATCH 527/544] Log when APPIMAGETOOL_SIGN_PASSPHRASE is set There appear to be cases in which a passphrase is set (and appimagetool correctly changes the pinentry mode to loopback) in which the gpg-agent never asks for a password. In such a scenario, the logging within our passphrase callback is never used, making it impossible to tell where the problem is exactly. With this change, the log will show whether or not the passphrase env var was found. --- src/appimagetool_sign.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/appimagetool_sign.c b/src/appimagetool_sign.c index b758a239e..2e5e18e5e 100644 --- a/src/appimagetool_sign.c +++ b/src/appimagetool_sign.c @@ -355,6 +355,7 @@ bool sign_appimage(char* appimage_filename, char* key_id, bool verbose) { // in case the user provides a passphrase in the environment, we have to set the pinentry mode to loopback, like with the CLI if (get_passphrase_from_environment() != NULL) { + fprintf(stderr, "[sign] passphrase available from environment, setting pinentry mode to loopback\n"); gpgme_set_pinentry_mode(gpgme_ctx, GPGME_PINENTRY_MODE_LOOPBACK); gpgme_set_passphrase_cb(gpgme_ctx, gpgme_passphrase_callback, (void*) gpgme_hook); } From bc310372ea5602961cd1d0f2b4a4d7e70097fa2d Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 2 Aug 2022 13:59:30 +0200 Subject: [PATCH 528/544] Make gpgme log more verbosely --- src/appimagetool_sign.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/appimagetool_sign.c b/src/appimagetool_sign.c index 2e5e18e5e..af432fccc 100644 --- a/src/appimagetool_sign.c +++ b/src/appimagetool_sign.c @@ -349,6 +349,12 @@ bool sign_appimage(char* appimage_filename, char* key_id, bool verbose) { gpg_check_call(gpgme_new(&gpgme_ctx)); + if (verbose) { + // this should significantly increase the amount of logging we see in the status callback + fprintf(stderr, "[sign] running in verbose mode, enabling full-status flag on gpgme context\n"); + gpg_check_call(gpgme_set_ctx_flag(gpgme_ctx, "full-status", "1")); + } + // we want an ASCII armored signature of plain text (hex string) gpgme_set_textmode(gpgme_ctx, true); gpgme_set_armor(gpgme_ctx, true); From 729a1a60e41cdd90554462495576cdae4a2896ed Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 3 Aug 2022 02:15:11 +0200 Subject: [PATCH 529/544] Warn user if available gpg(-agent) is not (fully) compatible --- src/appimagetool.c | 2 +- src/appimagetool_sign.c | 49 +++++++++++++++++++++++++++++++++++++++++ src/appimagetool_sign.h | 2 ++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 9dd0ec153..6f27020e0 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -1070,7 +1070,7 @@ main (int argc, char *argv[]) if (sign) { if (!sign_appimage(destination, sign_key, verbose)) { - if (getenv("APPIMAGETOOL_FORCE_SIGN") != NULL) { + if (getenv(FORCE_SIGN_ENV_VAR) != NULL) { fprintf(stderr, "ERROR: signing failed, aborting\n"); exit(1); } else { diff --git a/src/appimagetool_sign.c b/src/appimagetool_sign.c index af432fccc..e8586581c 100644 --- a/src/appimagetool_sign.c +++ b/src/appimagetool_sign.c @@ -11,6 +11,7 @@ #include "binreloc.h" #include "appimage/appimage_shared.h" +#include "appimagetool_sign.h" // used to identify calls to the callback static const char gpgme_hook[] = "appimagetool gpgme hook"; @@ -349,6 +350,54 @@ bool sign_appimage(char* appimage_filename, char* key_id, bool verbose) { gpg_check_call(gpgme_new(&gpgme_ctx)); + + // make sure we have a compatible agent around + { + gpgme_engine_info_t engine_info; + gpg_check_call(gpgme_get_engine_info(&engine_info)); + + while (engine_info && engine_info->protocol != gpgme_get_protocol(gpgme_ctx)) { + engine_info = engine_info->next; + } + + if (engine_info == NULL) { + fprintf( + stderr, + "[sign] could not detect gpg version for an unknown reason (engine name: %s)\n", + gpgme_get_protocol_name(engine_info->protocol) + ); + exit(1); + } + + fprintf( + stderr, + "[sign] using engine %s (found in %s), version %s, gpgme requires at least version %s\n", + gpgme_get_protocol_name(engine_info->protocol), + engine_info->file_name, + engine_info->version, + engine_info->req_version + ); + + // check whether the version is problematic + // we just need the first two items, and we assume the format will be something like "2.1*" + unsigned int major; + unsigned int minor; + if (sscanf(engine_info->version, "%u.%u", &major, &minor) == 2) { + if (major == 2) { + if (minor == 0) { + fprintf(stderr, "[sign] warning: loopback pinentry mode not supported with gpg 2.0.x, %s may not work\n", FORCE_SIGN_ENV_VAR); + } else if (minor == 1) { + fprintf(stderr, "[sign] warning: gpg 2.1.x detected, %s can only work with allow-loopback-entry set within the gpg-agent configuration\n", FORCE_SIGN_ENV_VAR); + } + } else { + fprintf(stderr, "[sign] error: unsupported engine version, aborting\n"); + exit(1); + } + } else { + fprintf(stderr, "[sign] warning: failed to validate gpg version, expect problems\n"); + } + } + if (verbose) { // this should significantly increase the amount of logging we see in the status callback fprintf(stderr, "[sign] running in verbose mode, enabling full-status flag on gpgme context\n"); diff --git a/src/appimagetool_sign.h b/src/appimagetool_sign.h index c7253b26e..6ecee684e 100644 --- a/src/appimagetool_sign.h +++ b/src/appimagetool_sign.h @@ -1,3 +1,5 @@ #pragma once +static const char* const FORCE_SIGN_ENV_VAR = "APPIMAGETOOL_FORCE_SIGN"; + bool sign_appimage(char* appimage_filename, char* key_id, bool verbose); From a419fa4f6635209f8345615127ad2b990c846021 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 17 Aug 2022 02:41:21 +0200 Subject: [PATCH 530/544] Create detached signatures again The new signing code used "normal" signatures, but we need detached ones to retain compatibility with older versions of AppImageUpdate. --- src/appimagetool_sign.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/appimagetool_sign.c b/src/appimagetool_sign.c index e8586581c..8b483ef19 100644 --- a/src/appimagetool_sign.c +++ b/src/appimagetool_sign.c @@ -432,7 +432,7 @@ bool sign_appimage(char* appimage_filename, char* key_id, bool verbose) { gpg_check_call(gpgme_data_new(&gpgme_sig_data)); // now, we can sign the data - gpg_check_call(gpgme_op_sign(gpgme_ctx, gpgme_appimage_file_data, gpgme_sig_data, GPGME_SIG_MODE_NORMAL)); + gpg_check_call(gpgme_op_sign(gpgme_ctx, gpgme_appimage_file_data, gpgme_sig_data, GPGME_SIG_MODE_DETACHED)); gpgme_sign_result_t sign_result = gpgme_op_sign_result(gpgme_ctx); From 4bcfe23e1b45833a167b306f25b18d3b9ce36b2c Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 17 Aug 2022 03:02:35 +0200 Subject: [PATCH 531/544] Fix mode name --- src/appimagetool_sign.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/appimagetool_sign.c b/src/appimagetool_sign.c index 8b483ef19..970c2b4c1 100644 --- a/src/appimagetool_sign.c +++ b/src/appimagetool_sign.c @@ -432,7 +432,7 @@ bool sign_appimage(char* appimage_filename, char* key_id, bool verbose) { gpg_check_call(gpgme_data_new(&gpgme_sig_data)); // now, we can sign the data - gpg_check_call(gpgme_op_sign(gpgme_ctx, gpgme_appimage_file_data, gpgme_sig_data, GPGME_SIG_MODE_DETACHED)); + gpg_check_call(gpgme_op_sign(gpgme_ctx, gpgme_appimage_file_data, gpgme_sig_data, GPGME_SIG_MODE_DETACH)); gpgme_sign_result_t sign_result = gpgme_op_sign_result(gpgme_ctx); From 90704a014727556591e396ae8095131d41374a7e Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 14 Sep 2022 20:50:32 +0200 Subject: [PATCH 532/544] Drop obsolete --sign-args --- src/appimagetool.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 6f27020e0..f007ce317 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -89,7 +89,6 @@ gchar *sqfs_comp = "gzip"; gchar **sqfs_opts = NULL; gchar *exclude_file = NULL; gchar *runtime_file = NULL; -gchar *sign_args = NULL; gchar *sign_key = NULL; gchar *pathToMksquashfs = NULL; @@ -522,7 +521,6 @@ static GOptionEntry entries[] = { "exclude-file", 0, 0, G_OPTION_ARG_STRING, &exclude_file, _exclude_file_desc, NULL }, { "runtime-file", 0, 0, G_OPTION_ARG_STRING, &runtime_file, "Runtime file to use", NULL }, { "sign-key", 0, 0, G_OPTION_ARG_STRING, &sign_key, "Key ID to use for gpg[2] signatures", NULL}, - { "sign-args", 0, 0, G_OPTION_ARG_STRING, &sign_args, "Extra arguments to use when signing with gpg[2]", NULL}, { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &remaining_args, NULL, NULL }, { 0,0,0,0,0,0,0 } }; From b719a7f0cda9eedbb4a86d155a44fac973ca1309 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Thu, 29 Sep 2022 15:54:21 +0200 Subject: [PATCH 533/544] Die on mksquashfs failure. (#1189) * Die on mksquashfs failure. * review * Use %d to print pid_t --- ci/test-appimagetool.sh | 12 ++++++++++-- src/appimagetool.c | 25 +++++++++++++++++++------ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/ci/test-appimagetool.sh b/ci/test-appimagetool.sh index 125e9c19c..aaf9491e3 100755 --- a/ci/test-appimagetool.sh +++ b/ci/test-appimagetool.sh @@ -119,8 +119,6 @@ if [ "$hash1" != "$hash2" ]; then fi log "check --mksquashfs-opt forwarding" -out=$("$appimagetool" appimagetool.AppDir appimagetool.AppImage --mksquashfs-opt "-misspelt-option" 2>&1) -echo "${out}" | grep -q "invalid option" "$appimagetool" appimagetool.AppDir appimagetool.AppImage.1 "$appimagetool" appimagetool.AppDir appimagetool.AppImage.2 --mksquashfs-opt "-mem" --mksquashfs-opt "100M" "$appimagetool" appimagetool.AppDir appimagetool.AppImage.3 --mksquashfs-opt "-all-time" --mksquashfs-opt "12345" @@ -135,3 +133,13 @@ if [ "$hash1" == "$hash3" ]; then echo "Hashes of regular and mtime-modified AppImages don't differ" exit 1 fi + +log "check appimagetool dies when mksquashfs fails" +set +e # temporarily disable error trapping as next line is supposed to fail +out=$("$appimagetool" appimagetool.AppDir appimagetool.AppImage --mksquashfs-opt "-misspelt-option" 2>&1) +rc=$? +set -e +test ${rc} == 1 +echo "${out}" | grep -q "invalid option" +echo "${out}" | grep -qP 'mksquashfs \(pid \d+\) exited with code 1' +echo "${out}" | grep -q "sfs_mksquashfs error" diff --git a/src/appimagetool.c b/src/appimagetool.c index f007ce317..a4132649f 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -134,13 +134,26 @@ int sfs_ls(char* image) { * execlp(), execvp(), and execvpe() search on the $PATH */ int sfs_mksquashfs(char *source, char *destination, int offset) { pid_t pid = fork(); - if (pid == -1) { - // error, failed to fork() + perror("sfs_mksquashfs fork() failed"); return(-1); - } else if (pid > 0) { + } + + if (pid > 0) { + // This is the parent process. Wait for the child to termiante and check its exit status. int status; - waitpid(pid, &status, 0); + if(waitpid(pid, &status, 0) == -1) { + perror("sfs_mksquashfs waitpid() failed"); + return(-1); + } + + int retcode = WEXITSTATUS(status); + if (retcode) { + fprintf(stderr, "mksquashfs (pid %d) exited with code %d\n", pid, retcode); + return(-1); + } + + return 0; } else { // we are the child gchar* offset_string; @@ -223,11 +236,11 @@ int sfs_mksquashfs(char *source, char *destination, int offset) { #ifndef AUXILIARY_FILES_DESTINATION execvp("mksquashfs", args); + perror("execvp(\"mksquashfs\") failed"); #else execvp(pathToMksquashfs, args); + fprintf(stderr, "execvp(\"%s\") failed: %s\n", pathToMksquashfs, strerror(errno)); #endif - - perror("execlp"); // exec*() returns only on error return -1; // exec never returns } return 0; From 62e2c76560d0ec05f55ab8cf9350de16f70f31e7 Mon Sep 17 00:00:00 2001 From: Jordan Christiansen Date: Fri, 24 Feb 2023 14:48:07 -0600 Subject: [PATCH 534/544] Enable portable home/config dirs for extract-and-run --- src/runtime.c | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index bada3af93..e6cd989d6 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -524,6 +524,27 @@ bool build_mount_point(char* mount_dir, const char* const argv0, char const* con mount_dir[templen+8+namelen+6] = 0; // null terminate destination } +void set_portable_home_and_config(char *basepath) { + char portable_home_dir[PATH_MAX]; + char portable_config_dir[PATH_MAX]; + + /* If there is a directory with the same name as the AppImage plus ".home", then export $HOME */ + strcpy (portable_home_dir, basepath); + strcat (portable_home_dir, ".home"); + if(is_writable_directory(portable_home_dir)){ + fprintf(stderr, "Setting $HOME to %s\n", portable_home_dir); + setenv("HOME",portable_home_dir,1); + } + + /* If there is a directory with the same name as the AppImage plus ".config", then export $XDG_CONFIG_HOME */ + strcpy (portable_config_dir, basepath); + strcat (portable_config_dir, ".config"); + if(is_writable_directory(portable_config_dir)){ + fprintf(stderr, "Setting $XDG_CONFIG_HOME to %s\n", portable_config_dir); + setenv("XDG_CONFIG_HOME",portable_config_dir,1); + } +} + int main(int argc, char *argv[]) { char appimage_path[PATH_MAX]; char argv0_path[PATH_MAX]; @@ -731,6 +752,8 @@ int main(int argc, char *argv[]) { setenv("ARGV0", argv0_path, 1); setenv("APPDIR", prefix, 1); + set_portable_home_and_config(fullpath); + execv(apprun_path, new_argv); int error = errno; @@ -912,24 +935,7 @@ int main(int argc, char *argv[]) { setenv( "ARGV0", argv0_path, 1 ); setenv( "APPDIR", mount_dir, 1 ); - char portable_home_dir[PATH_MAX]; - char portable_config_dir[PATH_MAX]; - - /* If there is a directory with the same name as the AppImage plus ".home", then export $HOME */ - strcpy (portable_home_dir, fullpath); - strcat (portable_home_dir, ".home"); - if(is_writable_directory(portable_home_dir)){ - fprintf(stderr, "Setting $HOME to %s\n", portable_home_dir); - setenv("HOME",portable_home_dir,1); - } - - /* If there is a directory with the same name as the AppImage plus ".config", then export $XDG_CONFIG_HOME */ - strcpy (portable_config_dir, fullpath); - strcat (portable_config_dir, ".config"); - if(is_writable_directory(portable_config_dir)){ - fprintf(stderr, "Setting $XDG_CONFIG_HOME to %s\n", portable_config_dir); - setenv("XDG_CONFIG_HOME",portable_config_dir,1); - } + set_portable_home_and_config(fullpath); /* Original working directory */ char cwd[1024]; From 5735cc5bed206497cddfbd2a75e1982c2606c35d Mon Sep 17 00:00:00 2001 From: Jordan Christiansen Date: Sat, 25 Feb 2023 09:58:14 -0600 Subject: [PATCH 535/544] Fix CI release step See https://github.com/AppImageCommunity/AppImageUpdate/commit/f2a6873a714e21518129134259579a4772a9ceaf --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3bf3c12c3..327e27302 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -43,7 +43,7 @@ jobs: name: Create release and upload artifacts needs: - build - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - name: Download artifacts uses: actions/download-artifact@v2 From 701b711f42250584b65a88f6427006b1d160164d Mon Sep 17 00:00:00 2001 From: probonopd Date: Fri, 5 May 2023 21:29:30 +0200 Subject: [PATCH 536/544] Remove broken Travis build shield [ci skip] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 06d52e353..4d3cb3434 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# AppImageKit [![Build Status](https://travis-ci.org/AppImage/AppImageKit.svg?branch=appimagetool/master)](https://travis-ci.org/AppImage/AppImageKit) ![Downloads](https://img.shields.io/github/downloads/AppImage/AppImageKit/total.svg) [![irc](https://img.shields.io/badge/IRC-%23AppImage%20on%20libera.chat-blue.svg)](https://web.libera.chat/#AppImage) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZT9CL8M5TJU72) +# AppImageKit ![Downloads](https://img.shields.io/github/downloads/AppImage/AppImageKit/total.svg) [![irc](https://img.shields.io/badge/IRC-%23AppImage%20on%20libera.chat-blue.svg)](https://web.libera.chat/#AppImage) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZT9CL8M5TJU72) The __AppImage__ format is a format for packaging applications in a way that allows them to run on a variety of different target systems (base operating systems, distributions) without further modification. From e8dadbb09fed3ae3c3d5a5a9ba2c47a072f71c40 Mon Sep 17 00:00:00 2001 From: Ravener Date: Tue, 30 Jan 2024 23:32:18 +0500 Subject: [PATCH 537/544] Fix typo (#1312) [ci skip] --- src/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index e6cd989d6..fa0aa7d31 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -242,7 +242,7 @@ print_help(const char *appimage_path) " Or you can invoke this AppImage with the --appimage-portable-home option,\n" " which will create this directory for you. As long as the directory exists\n" " and is neither moved nor renamed, the application contained inside this\n" - " AppImage to store its data in this directory rather than in your home\n" + " AppImage will store its data in this directory rather than in your home\n" " directory\n" , appimage_path); } From 2b8f5b39c41d3895e6b6b88a45b1905f4ffce4ef Mon Sep 17 00:00:00 2001 From: probonopd Date: Mon, 25 Nov 2024 13:13:48 +0100 Subject: [PATCH 538/544] Update README.md [ci skip] --- README.md | 73 +++++++++---------------------------------------------- 1 file changed, 11 insertions(+), 62 deletions(-) diff --git a/README.md b/README.md index 4d3cb3434..39c797355 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# AppImageKit ![Downloads](https://img.shields.io/github/downloads/AppImage/AppImageKit/total.svg) [![irc](https://img.shields.io/badge/IRC-%23AppImage%20on%20libera.chat-blue.svg)](https://web.libera.chat/#AppImage) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZT9CL8M5TJU72) +# AppImageKit [![irc](https://img.shields.io/badge/IRC-%23AppImage%20on%20libera.chat-blue.svg)](https://web.libera.chat/#AppImage) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZT9CL8M5TJU72) The __AppImage__ format is a format for packaging applications in a way that allows them to run on a variety of different target systems (base operating systems, distributions) without further modification. Using the AppImage format you can package desktop applications as AppImages that run on common Linux-based operating systems, such as RHEL, CentOS, Ubuntu, Fedora, Debian and derivatives. -Copyright (c) 2004-22 Simon Peter and contributors. +Copyright (c) 2004-24 Simon Peter and contributors. https://en.wikipedia.org/wiki/AppImage @@ -127,68 +127,17 @@ Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage.config/leafpad/leafpadrc Note that the file `leafpadrc` was written in the directory we have created before. -## appimagetool usage +## appimagetool -`appimagetool` is used to generate an AppImage from an existing `AppDir`. Higher-level tools such as [`linuxdeployqt`](https://github.com/probonopd/linuxdeployqt) use it internally. A precompiled version can be found on [GitHub Releases](https://github.com/AppImage/AppImageKit/releases). +`appimagetool` is a low-level tool used to convert a valid AppDir into an AppImage. It us usually used by [higher-level tools](https://github.com/AppImageCommunity/awesome-appimage?tab=readme-ov-file#appimage-developer-tools) that can be used by application developers to provide AppImages of their applications to end users. `appimagetool` itself is not needed by end users, and is normally not used directly by developers. +Please see https://github.com/AppImage/appimagetool. -``` -wget "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage" -chmod a+x appimagetool-x86_64.AppImage -``` - -Usage in a nutshell, assuming that you already have an [AppDir](https://github.com/AppImage/AppImageSpec/blob/master/draft.md#appdir) in place: - -``` -./appimagetool-x86_64.AppImage some.AppDir -``` - -Detailed usage: -``` -Usage: - appimagetool [OPTION...] SOURCE [DESTINATION] - Generate, extract, and inspect AppImages - -Help Options: - -h, --help Show help options - -Application Options: - -l, --list List files in SOURCE AppImage - -u, --updateinformation Embed update information STRING; if zsyncmake is installed, generate zsync file - -g, --guess Guess update information based on Travis CI or GitLab environment variables - --bintray-user Bintray user name - --bintray-repo Bintray repository - --version Show version number - -v, --verbose Produce verbose output - -s, --sign Sign with gpg[2] - --comp Squashfs compression - -n, --no-appstream Do not check AppStream metadata - --exclude-file Uses given file as exclude file for mksquashfs, in addition to .appimageignore. - --runtime-file Runtime file to use - --sign-key Key ID to use for gpg[2] signatures - --sign-args Extra arguments to use when signing with gpg[2] -``` - -If you want to generate an AppImage manually, you can: +## AppImage runtime -``` -mksquashfs Your.AppDir Your.squashfs -root-owned -noappend -cat runtime >> Your.AppImage -cat Your.squashfs >> Your.AppImage -chmod a+x Your.AppImage -``` - - -## Building - -__NOTE:__ The AppImage project supplies [binaries](https://github.com/AppImage/AppImageKit/releases/tag/continuous) that application developers can use. These binaries are built using the CentOS 6 Docker on Travis CI build system in this repository. As an application developer, you do not have to use the build system. You only have to use the build systems when contributing to AppImageKit, when needing another architecture than `x86_64`, or when trying to reproduce our binaries. - -Our build system is based on Docker. To build your own binaries, please install Docker first. Then, follow the following steps: - -``` -git clone --single-branch --recursive https://github.com/AppImage/AppImageKit -cd AppImageKit/ -bash ci/build.sh -``` +The AppImage runtime is a small piece of code that becomes part of every AppImage. It mounts the AppImage and executes the application contained in it. +Please see https://github.com/AppImage/type2-runtime. -This will create the binaries in a directory called `out/`. +## AppImageSpec -Please note: It is not recommended nor supported to build AppImageKit on any newer build system than the oldest still-supported versions of major distributions for reasons outlined [here](https://github.com/AppImage/AppImageKit/wiki/Creating-AppImages#creating-appimages-that-are-compatible-with-many-systems). Currently we are targeting CentOS 6.x and Ubuntu 14.04 as build systems and we are not interested to build AppImageKit on newer versions anytime soon. Binaries built on those systems will run just fine on newer (later) target systems (distributions). +The AppImageSpec defines the AppImage format. +Please see https://github.com/AppImage/AppImageSpec. From 142d826bd7f2131fcd70548e8481bc5883905a6f Mon Sep 17 00:00:00 2001 From: probonopd Date: Thu, 28 Nov 2024 14:19:48 +0000 Subject: [PATCH 539/544] Remove files that are no longer used --- .github/workflows/build.yml | 58 - .gitmodules | 6 - CMakeLists.txt | 91 -- CONTRIBUTING.md | 41 - Makefile.runtime | 50 - build-tool-osx.sh | 116 -- ci/build-appdir.sh | 91 -- ci/build-binaries-and-appimage.sh | 105 -- ci/build.sh | 140 -- ci/test-appimage.sh | 46 - ci/test-appimagetool.sh | 145 --- cmake/cpack_debs.cmake | 46 - cmake/dependencies.cmake | 90 -- cmake/sanitizers-cmake | 1 - cmake/toolchains/aarch64-linux-gnu.cmake | 20 - cmake/toolchains/arm-linux-gnueabihf.cmake | 20 - cmake/toolchains/i386-linux-gnu.cmake | 31 - lib/CMakeLists.txt | 1 - lib/libappimage | 1 - resources/AppRun | 12 - resources/appimagetool.desktop | 9 - resources/appimagetool.png | Bin 9773 -> 0 bytes resources/appimagetool.svg | 320 ----- resources/liblz4.pc | 14 - resources/pubkey.asc | 30 - .../share/metainfo/appimagetool.appdata.xml | 31 - squashfs_osx.patch | 434 ------- src/AppRun.c | 219 ---- src/CMakeLists.txt | 169 --- src/appimagetool.c | 1153 ----------------- src/appimagetool_sign.c | 479 ------- src/appimagetool_sign.h | 5 - src/appimagetoolnoglib.c | 307 ----- src/binreloc.c | 766 ----------- src/binreloc.h | 80 -- src/build-runtime.cmake | 148 --- src/digest.c | 145 --- src/digest_md5.c | 98 -- src/embed-magic-bytes-in-file.sh | 8 - src/light_elf.h | 123 -- src/notify.c | 91 -- src/runtime.c | 958 -------------- src/validate.c | 204 --- testappimage | 205 --- 44 files changed, 7107 deletions(-) delete mode 100644 .github/workflows/build.yml delete mode 100644 .gitmodules delete mode 100644 CMakeLists.txt delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile.runtime delete mode 100755 build-tool-osx.sh delete mode 100755 ci/build-appdir.sh delete mode 100755 ci/build-binaries-and-appimage.sh delete mode 100755 ci/build.sh delete mode 100755 ci/test-appimage.sh delete mode 100755 ci/test-appimagetool.sh delete mode 100644 cmake/cpack_debs.cmake delete mode 100644 cmake/dependencies.cmake delete mode 160000 cmake/sanitizers-cmake delete mode 100644 cmake/toolchains/aarch64-linux-gnu.cmake delete mode 100644 cmake/toolchains/arm-linux-gnueabihf.cmake delete mode 100644 cmake/toolchains/i386-linux-gnu.cmake delete mode 100644 lib/CMakeLists.txt delete mode 160000 lib/libappimage delete mode 100755 resources/AppRun delete mode 100644 resources/appimagetool.desktop delete mode 100644 resources/appimagetool.png delete mode 100644 resources/appimagetool.svg delete mode 100644 resources/liblz4.pc delete mode 100644 resources/pubkey.asc delete mode 100644 resources/usr/share/metainfo/appimagetool.appdata.xml delete mode 100644 squashfs_osx.patch delete mode 100644 src/AppRun.c delete mode 100644 src/CMakeLists.txt delete mode 100644 src/appimagetool.c delete mode 100644 src/appimagetool_sign.c delete mode 100644 src/appimagetool_sign.h delete mode 100644 src/appimagetoolnoglib.c delete mode 100644 src/binreloc.c delete mode 100644 src/binreloc.h delete mode 100644 src/build-runtime.cmake delete mode 100644 src/digest.c delete mode 100644 src/digest_md5.c delete mode 100755 src/embed-magic-bytes-in-file.sh delete mode 100644 src/light_elf.h delete mode 100644 src/notify.c delete mode 100644 src/runtime.c delete mode 100644 src/validate.c delete mode 100644 testappimage diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 327e27302..000000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,58 +0,0 @@ -name: Build - -on: [ push, pull_request, workflow_dispatch ] - - -jobs: - build: - name: Build - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - ARCH: ['x86_64', 'i386', 'armhf', 'aarch64'] - - env: - ARCH: ${{ matrix.ARCH }} - - steps: - - uses: actions/checkout@v2 - with: - submodules: 'recursive' - - - name: Set up QEMU integration for Docker - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - - - name: Build - run: | - bash -ex ci/build.sh - - - name: List files - run: | - ls -lh out/ - - - name: Upload artifact - uses: actions/upload-artifact@v1.0.0 - with: - # Artifact name - name: appimagetool-${{ matrix.ARCH }}.build - path: out/ - - - upload: - name: Create release and upload artifacts - needs: - - build - runs-on: ubuntu-20.04 - steps: - - name: Download artifacts - uses: actions/download-artifact@v2 - - name: Inspect directory after downloading artifacts - run: ls -alFR - - name: Create release and upload artifacts - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - wget -q https://github.com/TheAssassin/pyuploadtool/releases/download/continuous/pyuploadtool-x86_64.AppImage - chmod +x pyuploadtool-x86_64.AppImage - ./pyuploadtool-x86_64.AppImage **/appimagetool*.AppImage* **/AppRun* **/runtime-* diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index a5daa46d3..000000000 --- a/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "cmake/sanitizers-cmake"] - path = cmake/sanitizers-cmake - url = https://github.com/arsenm/sanitizers-cmake -[submodule "lib/libappimage"] - path = lib/libappimage - url = https://github.com/AppImage/libappimage.git diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 219f4b75e..000000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,91 +0,0 @@ -cmake_minimum_required(VERSION 3.2) - -project(AppImageKit) - -include(ExternalProject) - -# enable testing globally -include(CTest) - -# support for ccache -# call CMake with -DUSE_CCACHE=ON to make use of it -set(USE_CCACHE OFF CACHE BOOL "") -if(USE_CCACHE) - find_program(CCACHE ccache) - if(CCACHE) - message(STATUS "Using ccache") - set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE}) - set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE}) - else() - message(WARNING "USE_CCACHE set, but could not find ccache") - endif() -endif() - - -##################### -# build information # -##################### - -# determine Git commit ID -execute_process( - COMMAND git rev-parse --short HEAD - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - OUTPUT_VARIABLE GIT_COMMIT - OUTPUT_STRIP_TRAILING_WHITESPACE -) - -# set version and build number -set(VERSION 1-alpha) -mark_as_advanced(VERSION) -if("$ENV{TRAVIS_BUILD_NUMBER}" STREQUAL "") - set(BUILD_NUMBER "") -else() - set(BUILD_NUMBER "$ENV{TRAVIS_BUILD_NUMBER}") -endif() -mark_as_advanced(BUILD_NUMBER) - -# get current date -execute_process( - COMMAND env LC_ALL=C date -u "+%Y-%m-%d %H:%M:%S %Z" - OUTPUT_VARIABLE DATE - OUTPUT_STRIP_TRAILING_WHITESPACE -) - -# C and C++ versions -set(CMAKE_C_STANDARD 99) -set(CMAKE_CXX_STANDARD 98) -set(CMAKE_C_STANDARD_REQUIRED ON) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) - - -########################## -# configure dependencies # -########################## - -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake) - -# configure dependencies -add_subdirectory(lib) - -include(lib/libappimage/cmake/tools.cmake) -include(cmake/dependencies.cmake) - - -################ -# Source files # -################ - -# sanitizer support -set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/sanitizers-cmake/cmake" ${CMAKE_MODULE_PATH}) - -add_subdirectory(src) - -################################ -# packaging # -################################ -set(APPIMAGEKIT_PACKAGE_DEBS FALSE CACHE BOOL "") - -if(APPIMAGEKIT_PACKAGE_DEBS) - include(cmake/cpack_debs.cmake) -endif() diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 421a99a16..000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,41 +0,0 @@ -# Contributing - -Welcome to AppImage. A good starting point for most questions is our wiki at https://github.com/AppImage/AppImageKit/wiki - -## How to contribute - -### I would like to request an AppImage for an application - -If there is no AppImage of your favorite application available, please request it from the author(s) of the application, e.g., as a feature request in the issue tracker of the application. For example, if you would like to see an AppImage of Mozilla Firefox, then please leave a comment at https://bugzilla.mozilla.org/show_bug.cgi?id=1249971. The more people request an AppImage from the upstream authors, the more likely is that an AppImage will be provided. - -### I would like to provide an AppImage for my application - -If you are an application author and would like to make your application available as an AppImage, please start here: https://github.com/AppImage/AppImageKit/wiki/Creating-AppImages. Feel free to open a [GitHub Issue](https://github.com/AppImage/AppImageKit/issues) in the AppImageKit project if you need support using the tools provided by AppImageKit. - -### I would like to have my AppImage included in the AppImageHub central directory of available AppImages - -Please see the [AppImageHub Readme](https://github.com/AppImage/appimage.github.io/blob/master/README.md). - -### I would like to contribute to AppImageKit development - -Your contribution is especially welcome in these ares: - -* [__High-priority__ issues we need help with](https://github.com/search?utf8=%E2%9C%93&q=org%3AAppImage+label%3Ahelp-wanted+state%3Aopen+label%3Ahigh-priority&type=Issues) -* [Issues we need help with](https://github.com/search?utf8=%E2%9C%93&q=org%3AAppImage+state%3Aopen+label%3Ahigh-priority&type=Issues) -* [Open bugs](https://github.com/search?utf8=%E2%9C%93&q=org%3AAppImage+label%3Abug+state%3Aopen&type=Issues) - -If you would like to report issues with AppImageKit itself, or would like to contribute to its development, please see get in touch with us in `#AppImage` on `irc.libera.chat`. We welcome pull requests addressing any of the open issues and/or other bugfixes and/or feature additions. In the case of complex feature additions, it is best to contact us first, before you spend much time. - -## Project governance - -Founder and project leader Simon Peter (probonopd) reserves the right to define the AppImage format, brand, high-level architecture, user experience, and project governance - -## Rules for contributing - -* The only supported version is git master -* We do not bugfix any versions other than git master -* Versions other than git master are considered outdated and obsolete -* Our software comes in AppImage format. Everything else is unsupported by us -* If git master breaks, all other work stops and every contributor focuses exclusively on un-breaking master -* Every contribution shall be sent as a pull request, which must build "green" before it is merged -* Pinned issues shall be closed before other issues are being worked on diff --git a/Makefile.runtime b/Makefile.runtime deleted file mode 100644 index dcda0126d..000000000 --- a/Makefile.runtime +++ /dev/null @@ -1,50 +0,0 @@ -CC = gcc -CFLAGS = -std=gnu99 -Wall -Wno-unused-parameter -Wno-unused-result -Wformat-security -Os -g -STRIP = strip -MAGIC = echo "8: 414902" | xxd -r - -MKDIR = mkdir -p -COPY = cp -f -COPY_FILE = $(COPY) - -all: runtime -.PHONY: all embed mrproper - -# Prepare 1024 bytes of space for updateinformation -1024_blank_bytes: - #printf '\0%.0s' {0..1023} > $@ - echo "03FF: 00" | xxd -r > $@ - stat $@ - -# Compile runtime but do not link -runtime.o: runtime.c - $(CC) -c $(CFLAGS) $^ -DGIT_COMMIT=\"$(git describe --tags --always --abbrev=7)\" \ - -I./squashfuse/ -D_FILE_OFFSET_BITS=64 - -# Add .upd_info and .sha256_sig sections -embed: 1024_blank_bytes runtime - objcopy --add-section .upd_info=1024_blank_bytes \ - --set-section-flags .upd_info=noload,readonly runtime - objcopy --add-section .sha256_sig=1024_blank_bytes \ - --set-section-flags .sha256_sig=noload,readonly runtime - stat runtime - -# Now statically link against libsquashfuse_ll, libsquashfuse and liblzma -# TODO: generate runtime in function of the compressor we choose to avoid embeded unnecessary compression. -runtime: runtime.o notify.o elf.o getsection.o - $(CC) $(CFLAGS) $^ ./squashfuse/.libs/libsquashfuse_ll.a \ - ./squashfuse/.libs/libsquashfuse.a ./squashfuse/.libs/libfuseprivate.a \ - -lfuse -lpthread -lz -linotifytools -ldl `pkg-config --libs liblzma liblz4` -o runtime - -install: runtime embed - $(MKDIR) build - $(COPY_FILE) runtime build - $(STRIP) build/runtime - # Insert AppImage magic bytes at offset 8 - # verify with : xxd -ps -s 0x8 -l 3 build/runtime - $(MAGIC) build/runtime - -clean: - rm -f *.o 1024_blank_bytes - -mrproper: clean - rm -f runtime diff --git a/build-tool-osx.sh b/build-tool-osx.sh deleted file mode 100755 index f49c0c8cb..000000000 --- a/build-tool-osx.sh +++ /dev/null @@ -1,116 +0,0 @@ -#!/bin/bash -# -# This script installs the required build-time dependencies -# and builds AppImageTool on OSX -# - -small_FLAGS="-Os -ffunction-sections -fdata-sections" -CC="cc -O2 -Wall -Wno-deprecated-declarations -Wno-unused-result" - -STRIP="strip" -JOBS=${JOBS:-1} - -echo $KEY | md5sum - -set -e -set -x - -HERE="$(dirname "$(readlink -f "${0}")")" -cd "$HERE" - -# Fetch git submodules -git submodule init -git submodule update - -# Clean up from previous run -rm -rf build/ || true - -# Build lzma always static because the runtime gets distributed with -# the generated .AppImage file. -if [ ! -e "./xz-5.2.3/build/lib/liblzma.a" ] ; then - wget -c http://tukaani.org/xz/xz-5.2.3.tar.gz - tar xf xz-5.2.3.tar.gz - cd xz-5.2.3 - mkdir -p build/lib - CFLAGS="-Wall $small_FLAGS" ./configure --prefix=$(pwd)/build --libdir=$(pwd)/build/lib --enable-static --disable-shared - make -j$JOBS && make install - cd - -fi - -# Patch squashfuse_ll to be a library rather than an executable - -cd squashfuse -if [ ! -e ./ll.c.orig ]; then - patch -p1 --backup < ../squashfuse.patch - patch -p1 --backup < ../squashfuse_dlopen.patch -fi -if [ ! -e ./squashfuse_dlopen.c ]; then - cp ../squashfuse_dlopen.c . -fi -if [ ! -e ./squashfuse_dlopen.h ]; then - cp ../squashfuse_dlopen.h . -fi - -# Build libsquashfuse_ll library - -if [ ! -e ./Makefile ] ; then - export ACLOCAL_FLAGS="-I /usr/share/aclocal" - glibtoolize --force - aclocal - autoheader - automake --force-missing --add-missing - autoreconf -fi || true # Errors out, but the following succeeds then? - autoconf - sed -i "" '/PKG_CHECK_MODULES.*/,/,:./d' configure # https://github.com/vasi/squashfuse/issues/12 - CFLAGS="-Wall $small_FLAGS" ./configure --disable-demo --disable-high-level --without-lzo --without-lz4 --with-xz=$(pwd)/../xz-5.2.3/build - - # Patch Makefile to use static lzma - sed -i "" "s|XZ_LIBS = -llzma -L$(pwd)/../xz-5.2.3/build/lib|XZ_LIBS = -Bstatic -llzma -L$(pwd)/../xz-5.2.3/build/lib|g" Makefile -fi - -bash --version - -make -j$JOBS - -cd .. - -# Build mksquashfs with -offset option to skip n bytes -# https://github.com/plougher/squashfs-tools/pull/13 -cd squashfs-tools -if [ ! -e squashfs-tools/action.c.orig ] ; then - patch -p1 --backup < ../squashfs_osx.patch -fi -cd squashfs-tools - -# Patch squashfuse-tools Makefile to link against static llzma -sed -i "" "s|CFLAGS += -DXZ_SUPPORT|CFLAGS += -DXZ_SUPPORT -I../../xz-5.2.3/build/include|g" Makefile -sed -i "" "s|LIBS += -llzma|LIBS += -Bstatic -llzma -L../../xz-5.2.3/build/lib|g" Makefile - -make -j$JOBS XZ_SUPPORT=1 mksquashfs # LZ4_SUPPORT=1 did not build yet on CentOS 6 -$STRIP mksquashfs - -cd ../../ - -pwd - -mkdir build -cd build - -cp ../squashfs-tools/squashfs-tools/mksquashfs . - - -# Compile appimagetool but do not link - glib version - -$CC -DGIT_COMMIT=\"$(git describe --tags --always --abbrev=7)\" -D_FILE_OFFSET_BITS=64 -I../squashfuse/ \ - $(pkg-config --cflags glib-2.0) -g -Os ../getsection.c -c ../appimagetool.c - -# Now statically link against libsquashfuse - glib version - - # statically link against liblzma - $CC -o appimagetool appimagetool.o ../elf.c ../getsection.c -DENABLE_BINRELOC ../binreloc.c \ - ../squashfuse/.libs/libsquashfuse.a ../squashfuse/.libs/libfuseprivate.a \ - -L../xz-5.2.3/build/lib \ - -ldl -lpthread \ - $(pkg-config --cflags --libs glib-2.0) -lz -llzma - - diff --git a/ci/build-appdir.sh b/ci/build-appdir.sh deleted file mode 100755 index 6e5aa5ff2..000000000 --- a/ci/build-appdir.sh +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash - -set -e -set -x -set -o functrace - -if [[ "$3" == "" ]]; then - echo "Usage: bash $0 " - exit 2 -fi - -# using shift makes adding/removing parameters easier -repo_root="$1" -shift -install_prefix="$1" -shift -appimagetool_appdir="$1" - -if [[ ! -d "$install_prefix" ]]; then - echo "Error: could not find install-prefix directory: $install_prefix" - exit 3 -fi - -if [[ ! -d "$repo_root" ]]; then - echo "Error: could not find repo root directory: $repo_root" - exit 4 -fi - -if [[ -d "$appimagetool_appdir" ]]; then - echo "Warning: removing existing appimagetool AppDir: $appimagetool_appdir" - rm -rf "$appimagetool_appdir" -fi - -# Run make install only for the appimagetool component to deploy appimagetools files to -# the $appimagetool_appdir -DESTDIR="$appimagetool_appdir" cmake -DCOMPONENT=appimagetool -P cmake_install.cmake - -mkdir -p "$appimagetool_appdir"/usr/lib/appimagekit/ - -# Copy AppDir specific files -cp "$repo_root"/resources/AppRun "$appimagetool_appdir" -cp "$install_prefix"/usr/lib/appimagekit/mksquashfs "$appimagetool_appdir"/usr/lib/appimagekit/ - -# prefer binaries from /deps, if available -export PATH=/deps/bin:"$PATH" -cp "$(which desktop-file-validate)" "$appimagetool_appdir"/usr/bin/ -cp "$(which zsyncmake)" "$appimagetool_appdir"/usr/bin/ - -cp "$repo_root"/resources/appimagetool.desktop "$appimagetool_appdir" -cp "$repo_root"/resources/appimagetool.png "$appimagetool_appdir"/appimagetool.png -cp "$appimagetool_appdir"/appimagetool.png "$appimagetool_appdir"/.DirIcon - -# bundle desktop-file-validate -# https://github.com/AppImage/AppImageKit/issues/1171 -install -D "$(which desktop-file-validate)" "$appimagetool_appdir"/usr/bin/ - -if [ -d /deps/ ]; then - # deploy GLib, gpgme and gcrypt - mkdir -p "$appimagetool_appdir"/usr/lib/ - cp /deps/lib/lib*.so* "$appimagetool_appdir"/usr/lib/ - - - case "$ARCH" in - x86_64) - libarch=x86-64 - ;; - i686) - # for some reason, ldconfig -p does not list entries with an architecture for i386... - # thankfully, grepping for an empty string is a no-op - libarch= - ;; - armhf) - libarch=arm - ;; - *) - libarch="$ARCH" - ;; - esac - - # libffi is a runtime dynamic dependency - # see this thread for more information on the topic: - # https://mail.gnome.org/archives/gtk-devel-list/2012-July/msg00062.html - # libpcre is used by desktop-file-validate - for pattern in libffi libpcre; do - # even though it is likely not necessary, we deploy every viable version of the libraries just to make sure... - ldconfig -p | grep "$pattern" | grep "$libarch" | while read -r line; do - lib="$(echo "$line" | cut -d'>' -f2 | tr -d ' ')" - cp "$lib" "$appimagetool_appdir"/usr/lib/ - done - done -fi diff --git a/ci/build-binaries-and-appimage.sh b/ci/build-binaries-and-appimage.sh deleted file mode 100755 index 58620730f..000000000 --- a/ci/build-binaries-and-appimage.sh +++ /dev/null @@ -1,105 +0,0 @@ -#! /bin/bash - -set -e -set -x -set -o functrace - -# make sure the prebuilt libraries in the container will be found -# (in case we're building in an AppImageBuild container) -export LD_LIBRARY_PATH=/deps/lib:"$LD_LIBRARY_PATH" -export PKG_CONFIG_PATH=/deps/lib/pkgconfig/ -export PATH=/deps/bin:"$PATH" - -# note: signing is not working at the moment -# see ci-build.sh for more information -echo "$KEY" | md5sum - -# we always build in a temporary directory -# use RAM disk if possible and if enough space available -USE_SHM=0 -if [ -d /dev/shm ] && mount | grep /dev/shm | grep -v -q noexec; then - SHM_FREE_KIB_MIN=$((1 * 1024 * 1024)) - SHM_FREE_KIB=$(df -P -k /dev/shm | tail -n 1 | sed -e 's/ \+/ /g' | cut -d ' ' -f 4) - if [[ "$SHM_FREE_KIB" != "" ]] && [ $SHM_FREE_KIB -ge $SHM_FREE_KIB_MIN ]; then - USE_SHM=1 - fi -fi -if [[ "$USE_SHM" = "1" ]]; then - TEMP_BASE=/dev/shm -elif [ -d /docker-ramdisk ]; then - TEMP_BASE=/docker-ramdisk -else - TEMP_BASE=/tmp -fi - -BUILD_DIR="$(mktemp -d -p "$TEMP_BASE" AppImageKit-build-XXXXXX)" - -cleanup () { - if [ -d "$BUILD_DIR" ]; then - rm -rf "$BUILD_DIR" - fi -} - -trap cleanup EXIT - -REPO_ROOT="$(readlink -f "$(dirname "${BASH_SOURCE[0]}")"/..)" -OLD_CWD="$(readlink -f .)" - -pushd "$BUILD_DIR" - -# configure build and generate build files -cmake "$REPO_ROOT" \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_BUILD_TYPE=RelWithDebInfo \ - -DBUILD_TESTING=ON \ - -DAPPIMAGEKIT_PACKAGE_DEBS=ON - -# run build -if [[ "$CI" != "" ]]; then - nproc="$(nproc)" -else - nproc="$(nproc --ignore=1)" -fi - -make -j"$nproc" - -# install so-far-built binaries into some prefix -# this way, we can test them, use them to build the AppDir later, copy stuff from there into said AppDir, ... -install_prefix="install-prefix" -make install DESTDIR="$install_prefix" - -# print first few bytes in runtime -# allows checking whether the magic bytes are in place -xxd src/runtime | head -n1 - -# strip everything *but* runtime -find "$install_prefix"/usr/bin/ -not -iname runtime -print -exec "$STRIP" "{}" \; 2>/dev/null - -# more debugging -ls -lh "$install_prefix"/usr/bin -for FILE in "$install_prefix"/usr/bin/*; do - echo "$FILE" - ldd "$FILE" || true -done - -# continue building AppDir -appdir="appimagetool.AppDir" -bash "$REPO_ROOT"/ci/build-appdir.sh "$REPO_ROOT" "$install_prefix" "$appdir" - -# list result -ls -lh -find "$install_prefix" - -# test built appimagetool -"$REPO_ROOT"/ci/test-appimagetool.sh "$REPO_ROOT" "$install_prefix"/usr/bin/appimagetool - -# seems to work -- let's build an AppImage -# we start by putting the rest of the files into the AppDir - -"$appdir"/AppRun ./appimagetool.AppDir/ -v \ - -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ - appimagetool-"$ARCH".AppImage - -mv -v appimagetool-"$ARCH".AppImage* "$OLD_CWD" -mv -v "$install_prefix"/usr/lib/appimagekit/runtime "$OLD_CWD" -mv -v "$install_prefix"/usr/bin/* "$OLD_CWD" diff --git a/ci/build.sh b/ci/build.sh deleted file mode 100755 index 390170dc2..000000000 --- a/ci/build.sh +++ /dev/null @@ -1,140 +0,0 @@ -#! /bin/bash - -set -e -set -x - -if [[ "$ARCH" == "" ]]; then - echo "Usage: env ARCH=... bash $0" - exit 2 -fi - -# TODO: fix inconsistency in architecture naming *everywhere* -docker_arch= - -case "$ARCH" in - "x86_64") - export ARCH="x86_64" - docker_dist=centos7 - ;; - "i386"|"i686") - export ARCH="i686" - docker_arch="i386" - docker_dist=centos7 - ;; - armhf|aarch64) - docker_dist=bionic - ;; - *) - echo "Unknown architecture: $ARCH" - exit 3 - ;; -esac - - -#### NOTE #### -# Signing is currently broken, as the secret to decrypt the key is not available at the moment. -# Even worse, putting key material in a third-party execution environment is not a good idea -# to begin with. -# The signing doesn't add anything security wise anyway, so it doesn't really matter if it works -# at the moment or not. -#### END NOTE #### - -# clean up and download data from GitHub -#rm -rf data.tar.g* .gnu* || true -#wget https://github.com/AppImage/AppImageKit/files/584665/data.zip -O data.tar.gz.gpg -#( set +x ; echo $KEY | gpg2 --batch --passphrase-fd 0 --no-tty --skip-verify --output data.tar.gz --decrypt data.tar.gz.gpg ) || true -#( tar xf data.tar.gz ; sudo chown -R $USER .gnu* ; rm -rf $HOME/.gnu* ; mv .gnu* $HOME/ ) || true - - -# make sure we're in the repository root directory -this_dir="$(readlink -f "$(dirname "$0")")" -repo_root="$this_dir"/.. - -# docker image name -docker_image=quay.io/appimage/appimagebuild:"$docker_dist"-"${docker_arch:-$ARCH}" -# make sure it's up to date -docker pull "$docker_image" - -# prepare output directory -mkdir -p out/ - -# we run all builds with non-privileged user accounts to make sure the build doesn't depend on such features -uid="$(id -u)" - -# When running under Podman (on hosts where `docker` is a shim that invokes `podman`), -# UID/GID mappings may lead to permission errors when copying artifacts to `/out`. -# We set the user namespace mode to `keep-id` to make sure that the host UID/GID -# are mapped to the same values inside the container, but using this environment -# variable (a) to not affect builds using Docker, and (b) to allow overriding the -# user namespace mode easily if necessary. -export PODMAN_USERNS="${PODMAN_USERNS:-keep-id}" - -# note: we cannot just use '-e ARCH', as this wouldn't overwrite the value set via ENV ARCH=... in the image -common_docker_opts=( - -e TERM="$TERM" - -e ARCH="$ARCH" - -i - -v "$repo_root":/ws - -v "$(readlink -f out/)":/out -) - -# make ctrl-c work -if [[ "$CI" == "" ]] && [[ "$TERM" != "" ]]; then - common_docker_opts+=("-t") -fi - -# build AppImageKit and appimagetool-"$ARCH".AppImage -# TODO: make gnupg home available, e.g., through "-v" "$HOME"/.gnupg:/root/.gnupg -# TODO: this ^ won't work since we don't build as root any more -# note: we enforce using the same UID in the container as outside, so that the created files are owned by the caller -docker run --rm \ - --user "$uid" \ - "${common_docker_opts[@]}" \ - "-v" "$HOME"/.gnupg:/root/.gnupg \ - "$docker_image" \ - /bin/bash -xc "cd /out && /ws/ci/build-binaries-and-appimage.sh --run-tests" - -# test appimagetool-"$ARCH".AppImage -# note: if we're in a CI system, we allow the use of FUSE in the container, to make sure that this functionality works as intended -# outside CI environments, we use APPIMAGE_EXTRACT_AND_RUN instead, which is safer, but gives less meaningful results -# note: FUSE and QEMU don't like each other, so if we're running in emulated mode, we can't run these tests -# therefore, by default, on ARM, these tests are not run -if [[ "$ARCH" != "arm"* ]] && [[ "$ARCH" != "aarch"* ]]; then - docker_test_opts=("${common_docker_opts[@]}") - - if [[ "$CI" != "" ]]; then - echo "Warning: assuming this is running in a CI environment, allowing the use of FUSE in the container" - docker_test_opts+=( - "--device" "/dev/fuse:mrw" - "--cap-add" "SYS_ADMIN" - "--security-opt" "apparmor:unconfined" - ) - else - echo "Note: this is not a CI environment, using APPIMAGE_EXTRACT_AND_RUN and patching out magic bytes" - docker_test_opts+=( - "-e" "APPIMAGE_EXTRACT_AND_RUN=1" - "-e" "PATCH_OUT_MAGIC_BYTES=1" - ) - fi - - # to make fuse happy, we need to use a "real" user - # as we don't want to use root, we use the user "build" we created in AppImageBuild - docker run --rm \ - --user build \ - "${docker_test_opts[@]}" \ - "$docker_image" \ - /bin/bash -xc "cd /out && bash /ws/ci/test-appimage.sh ./appimagetool-\"$ARCH\".AppImage" -fi - -# remove binaries from output directory -ls -al out/ -rm out/appimagetool -rm out/{validate,digest} - -# make sure the runtime contains the magic bytes -hexdump -Cv out/runtime | head -n 1 | grep "41 49 02 00" -# fix filename for upload -mv out/runtime out/runtime-"$ARCH" - -# fix filename for upload -mv out/AppRun out/AppRun-"$ARCH" diff --git a/ci/test-appimage.sh b/ci/test-appimage.sh deleted file mode 100755 index 62f6175c5..000000000 --- a/ci/test-appimage.sh +++ /dev/null @@ -1,46 +0,0 @@ -#! /bin/bash - -set -x -# important to allow for checking the exit code of timeout -set +e - -TIMEOUT=3 -ARCH="${ARCH:-"$(uname -m)"}" - -error() { - echo "Error: command failed" >&2 - exit 1 -} - -if [[ "$1" == "" ]] || [[ ! -x "$1" ]]; then - echo "Usage: env [PATCH_OUT_MAGIC_BYTES=1] bash $0 " - exit 2 -fi - -appimagetool="$1" - -if [[ "$PATCH_OUT_MAGIC_BYTES" != "" ]]; then - tmpdir="$(mktemp -d /tmp/appimage-test-XXXXX)" - cleanup() { - [[ -d "$tmpdir" ]] && rm -r "$tmpdir" - } - trap cleanup EXIT - - echo "Copying appimagetool and patching out magic bytes" - cp "$appimagetool" "$tmpdir/" - ls -al "$tmpdir" - appimagetool="$tmpdir"/"$(basename "$appimagetool")" - dd if=/dev/zero of="$appimagetool" bs=1 count=3 seek=8 conv=notrunc -fi - -# first of all, try to run appimagetool -"$appimagetool" && error # should fail due to missing parameter -"$appimagetool" -h || error # should not fail - -# print version and update information -"$appimagetool" --version || error # should not fail -"$appimagetool" --appimage-version || error # should not fail -"$appimagetool" --appimage-updateinformation || error # should not fail - -echo "" >&2 -echo "Tests successful!" >&2 diff --git a/ci/test-appimagetool.sh b/ci/test-appimagetool.sh deleted file mode 100755 index aaf9491e3..000000000 --- a/ci/test-appimagetool.sh +++ /dev/null @@ -1,145 +0,0 @@ -#! /bin/bash - -set -e -set -E -set -o functrace - -if [[ "$2" == "" ]]; then - echo "Usage: bash $0 " - exit 2 -fi - -# using shift makes adding/removing parameters easier -repo_root="$(readlink -f "$1")" -shift -appimagetool="$(readlink -f "$1")" - -if [[ ! -x "$appimagetool" ]]; then - echo "Error: appimagetool $appimagetool is not an executable" - exit 3 -fi - -# this script attempts to package appimagetool as an AppImage with... surprise, appimagetool - -# we always build in a temporary directory -# use RAM disk if possible -if [ -d /dev/shm ] && mount | grep /dev/shm | grep -v -q noexec; then - TEMP_BASE=/dev/shm -elif [ -d /docker-ramdisk ]; then - TEMP_BASE=/docker-ramdisk -else - TEMP_BASE=/tmp -fi - -BUILD_DIR="$(mktemp -d -p "$TEMP_BASE" appimagetool-test-XXXXXX)" - -cleanup () { - if [ -d "$BUILD_DIR" ]; then - rm -rf "$BUILD_DIR" - fi -} - -trap cleanup EXIT - -REPO_ROOT="$(readlink -f "$(dirname "${BASH_SOURCE[0]}")"/..)" -OLD_CWD="$(readlink -f .)" - -pushd "$BUILD_DIR" - -# make sure to use the built mksquashfs -export PATH="$(dirname "$appimagetool")":"$PATH" - -if [ "$CI" == true ]; then - # TODO: find way to get colored log on Travis - log() { echo -e "\n$*\n"; } -else - log() { echo -e "\n$(tput setaf 2)$(tput bold)$*$(tput sgr0)\n"; } -fi - -# debug log -trap '[[ $FUNCNAME = exithook ]] || { last_lineno=$real_lineno; real_lineno=$LINENO; }' DEBUG - -exithook() { - local exitcode="$1" - local lineno="${last_lineno:-$2}" - - if [ "$exitcode" -ne 0 ]; then - echo "$(tput setaf 1)$(tput bold)Test run failed: error in line $lineno$(tput sgr0)" - else - log "Tests succeeded!" - fi - - exit "$exitcode" -} - -trap 'exithook $? $LINENO ${BASH_LINENO[@]}' EXIT - -# real script begins here -log "create a sample AppDir" -mkdir -p appimagetool.AppDir/usr/share/metainfo/ -cp "$repo_root"/resources/{appimagetool.*,AppRun} appimagetool.AppDir/ -#cp "$repo_root"/resources/usr/share/metainfo/appimagetool.appdata.xml appimagetool.AppDir/usr/share/metainfo/ -cp "$appimagetool" appimagetool.AppDir/ -mkdir -p appimagetool.AppDir/usr/share/applications -cp appimagetool.AppDir/appimagetool.desktop appimagetool.AppDir/usr/share/applications - -log "create a file that should be ignored" -touch appimagetool.AppDir/to-be-ignored - -log "create an AppImage without an ignore file to make sure it is bundled" -"$appimagetool" appimagetool.AppDir appimagetool.AppImage || false -"$appimagetool" -l appimagetool.AppImage | grep -q to-be-ignored || false - -log "now set up the ignore file, and check that the file is properly ignored" -echo "to-be-ignored" > .appimageignore -"$appimagetool" appimagetool.AppDir appimagetool.AppImage -"$appimagetool" -l appimagetool.AppImage | grep -q to-be-ignored && false - -log "remove the default ignore file, and check if an explicitly passed one works, too" -rm .appimageignore -echo "to-be-ignored" > ignore -"$appimagetool" appimagetool.AppDir appimagetool.AppImage --exclude-file ignore || false -"$appimagetool" -l appimagetool.AppImage | grep -q to-be-ignored && false - -log "check whether files in both .appimageignore and the explicitly passed file work" -touch appimagetool.AppDir/to-be-ignored-too -echo "to-be-ignored-too" > .appimageignore -"$appimagetool" appimagetool.AppDir appimagetool.AppImage --exclude-file ignore -"$appimagetool" -l appimagetool.AppImage | grep -q to-be-ignored || true -"$appimagetool" -l appimagetool.AppImage | grep -q to-be-ignored-too || true - -log "check whether AppImages built from the exact same AppDir are the same files (reproducible builds, #625)" -"$appimagetool" appimagetool.AppDir appimagetool.AppImage.1 -"$appimagetool" appimagetool.AppDir appimagetool.AppImage.2 -hash1=$(sha256sum appimagetool.AppImage.1 | awk '{print $1}') -hash2=$(sha256sum appimagetool.AppImage.2 | awk '{print $1}') -if [ "$hash1" != "$hash2" ]; then - echo "Hash $hash1 doesn't match hash $hash2!" - exit 1 -fi - -log "check --mksquashfs-opt forwarding" -"$appimagetool" appimagetool.AppDir appimagetool.AppImage.1 -"$appimagetool" appimagetool.AppDir appimagetool.AppImage.2 --mksquashfs-opt "-mem" --mksquashfs-opt "100M" -"$appimagetool" appimagetool.AppDir appimagetool.AppImage.3 --mksquashfs-opt "-all-time" --mksquashfs-opt "12345" -hash1=$(sha256sum appimagetool.AppImage.1 | awk '{print $1}') -hash2=$(sha256sum appimagetool.AppImage.2 | awk '{print $1}') -hash3=$(sha256sum appimagetool.AppImage.3 | awk '{print $1}') -if [ "$hash1" != "$hash2" ]; then - echo "Hashes of regular and mem-restricted AppImages differ" - exit 1 -fi -if [ "$hash1" == "$hash3" ]; then - echo "Hashes of regular and mtime-modified AppImages don't differ" - exit 1 -fi - -log "check appimagetool dies when mksquashfs fails" -set +e # temporarily disable error trapping as next line is supposed to fail -out=$("$appimagetool" appimagetool.AppDir appimagetool.AppImage --mksquashfs-opt "-misspelt-option" 2>&1) -rc=$? -set -e -test ${rc} == 1 -echo "${out}" | grep -q "invalid option" -echo "${out}" | grep -qP 'mksquashfs \(pid \d+\) exited with code 1' -echo "${out}" | grep -q "sfs_mksquashfs error" diff --git a/cmake/cpack_debs.cmake b/cmake/cpack_debs.cmake deleted file mode 100644 index 7510862e4..000000000 --- a/cmake/cpack_debs.cmake +++ /dev/null @@ -1,46 +0,0 @@ -# required for DEB-DEFAULT to work as intended -cmake_minimum_required(VERSION 3.6) - -set(CPACK_GENERATOR "DEB") - -# versioning -# it appears setting CPACK_DEBIAN_PACKAGE_VERSION doesn't work, hence setting CPACK_PACKAGE_VERSION -set(CPACK_PACKAGE_VERSION ${VERSION}) - -# use git hash as package release -set(CPACK_DEBIAN_PACKAGE_RELEASE "git${GIT_COMMIT}") - -# append build ID, similar to AppImage naming -if(DEFINED ENV{TRAVIS_BUILD_NUMBER}) - set(CPACK_DEBIAN_PACKAGE_RELEASE "${CPACK_DEBIAN_PACKAGE_RELEASE}~travis$ENV{TRAVIS_BUILD_NUMBER}") -else() - set(CPACK_DEBIAN_PACKAGE_RELEASE "${CPACK_DEBIAN_PACKAGE_RELEASE}~local") -endif() - -if(DEFINED ENV{ARCH}) - set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE $ENV{ARCH}) - if(CPACK_DEBIAN_PACKAGE_ARCHITECTURE MATCHES "i686") - set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "i386") - endif() -endif() - -message("CPACK_DEBIAN_PACKAGE_ARCHITECTURE: ${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}") - -set(CPACK_DEBIAN_PACKAGE_MAINTAINER "AppImage Team") -set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://appimage.org/") -set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) -set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.md") -set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE") - -set(CPACK_DEBIAN_LIBAPPIMAGE_PACKAGE_NAME "libappimage") -set(CPACK_DEBIAN_LIBAPPIMAGE_PACKAGE_DEPENDS "libarchive13, libc6 (>= 2.4), libglib2.0-0, zlib1g, fuse") -set(CPACK_DEBIAN_LIBAPPIMAGE_PACKAGE_DESCRIPTION "Utilities collection to handle AppImage files.") - -set(CPACK_DEBIAN_LIBAPPIMAGE-DEV_PACKAGE_NAME "libappimage-dev") -set(CPACK_DEBIAN_LIBAPPIMAGE-DEV_PACKAGE_DEPENDS "libappimage") -set(CPACK_DEBIAN_LIBAPPIMAGE-DEV_PACKAGE_DESCRIPTION "Utilities collection to handle AppImage files.") - -set(CPACK_COMPONENTS_ALL libappimage libappimage-dev) -set(CPACK_DEB_COMPONENT_INSTALL ON) - -include(CPack) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake deleted file mode 100644 index 896e3a8d9..000000000 --- a/cmake/dependencies.cmake +++ /dev/null @@ -1,90 +0,0 @@ -# >= 3.2 required for ExternalProject_Add_StepDependencies -cmake_minimum_required(VERSION 3.2) - - -include(${PROJECT_SOURCE_DIR}/lib/libappimage/cmake/scripts.cmake) - - -# the names of the targets need to differ from the library filenames -# this is especially an issue with libcairo, where the library is called libcairo -# therefore, all libs imported this way have been prefixed with lib -import_pkgconfig_target(TARGET_NAME libfuse PKGCONFIG_TARGET fuse) -# openssl is required for optional tools only, and doesn't need to be enforced -# FIXME: remove dependency to openssl by implementing own SHA hashes in libappimage_hashlib -import_pkgconfig_target(TARGET_NAME libssl PKGCONFIG_TARGET openssl OPTIONAL) -import_pkgconfig_target(TARGET_NAME libgio PKGCONFIG_TARGET gio OPTIONAL) - - -if(USE_CCACHE) - message(STATUS "Using CCache to build AppImageKit dependencies") - # TODO: find way to use find_program with all possible paths - # (might differ from distro to distro) - # these work on Debian and Ubuntu: - set(CC "/usr/lib/ccache/gcc") - set(CXX "/usr/lib/ccache/g++") -else() - set(CC "${CMAKE_C_COMPILER}") - set(CXX "${CMAKE_CXX_COMPILER}") -endif() - -set(CFLAGS ${DEPENDENCIES_CFLAGS}) -set(CPPFLAGS ${DEPENDENCIES_CPPFLAGS}) -set(LDFLAGS ${DEPENDENCIES_LDFLAGS}) - -set(USE_SYSTEM_MKSQUASHFS OFF CACHE BOOL "Use system mksquashfs instead of downloading and building our own. Warning: you need a recent version otherwise it might not work as intended.") - -if(NOT USE_SYSTEM_MKSQUASHFS) - set(mksquashfs_cflags "-DXZ_SUPPORT ${CFLAGS}") - - if(NOT xz_LIBRARIES OR xz_LIBRARIES STREQUAL "") - message(FATAL_ERROR "xz_LIBRARIES not set") - elseif(xz_LIBRARIES MATCHES "\\.a$") - set(mksquashfs_ldflags "${xz_LIBRARIES}") - else() - set(mksquashfs_ldflags "-l${xz_LIBRARIES}") - endif() - - if(xz_INCLUDE_DIRS) - set(mksquashfs_cflags "${mksquashfs_cflags} -I${xz_INCLUDE_DIRS}") - endif() - if(xz_LIBRARY_DIRS) - set(mksquashfs_ldflags "${mksquashfs_ldflags} -L${xz_LIBRARY_DIRS}") - endif() - - ExternalProject_Add(mksquashfs - GIT_REPOSITORY https://github.com/plougher/squashfs-tools/ - GIT_TAG 4.4 - UPDATE_COMMAND "" # Make sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time - CONFIGURE_COMMAND ${SED} -i "s|CFLAGS += -DXZ_SUPPORT|CFLAGS += ${mksquashfs_cflags}|g" /squashfs-tools/Makefile - COMMAND ${SED} -i "s|LIBS += -llzma|LIBS += -Bstatic ${mksquashfs_ldflags}|g" /squashfs-tools/Makefile - COMMAND ${SED} -i "s|install: mksquashfs unsquashfs|install: mksquashfs|g" squashfs-tools/Makefile - COMMAND ${SED} -i "/cp unsquashfs/d" squashfs-tools/Makefile - BUILD_COMMAND env CC=${CC} CXX=${CXX} LDFLAGS=${LDFLAGS} ${MAKE} -C squashfs-tools/ XZ_SUPPORT=1 mksquashfs - # ${MAKE} install unfortunately expects unsquashfs to be built as well, hence can't install the binary - # therefore using built file in SOURCE_DIR - # TODO: implement building out of source - BUILD_IN_SOURCE ON - INSTALL_COMMAND ${MAKE} -C squashfs-tools/ install INSTALL_DIR= - ) - - ExternalProject_Get_Property(mksquashfs INSTALL_DIR) - set(mksquashfs_INSTALL_DIR "${INSTALL_DIR}") - mark_as_advanced(mksquashfs_INSTALL_DIR) - - # for later use when packaging as an AppImage - set(mksquashfs_BINARY "${mksquashfs_INSTALL_DIR}/mksquashfs") - mark_as_advanced(mksquashfs_BINARY) -else() - message(STATUS "Using system mksquashfs") - - set(mksquashfs_BINARY "mksquashfs") -endif() - -#### build dependency configuration #### - -# only have to build custom xz when not using system libxz -if(TARGET xz-EXTERNAL) - if(TARGET mksquashfs) - ExternalProject_Add_StepDependencies(mksquashfs configure xz-EXTERNAL) - endif() -endif() diff --git a/cmake/sanitizers-cmake b/cmake/sanitizers-cmake deleted file mode 160000 index 6947cff3a..000000000 --- a/cmake/sanitizers-cmake +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6947cff3a9c9305eb9c16135dd81da3feb4bf87f diff --git a/cmake/toolchains/aarch64-linux-gnu.cmake b/cmake/toolchains/aarch64-linux-gnu.cmake deleted file mode 100644 index 4b35337c3..000000000 --- a/cmake/toolchains/aarch64-linux-gnu.cmake +++ /dev/null @@ -1,20 +0,0 @@ -# toolchain file that can be used for cross-compiling AppImageKit using the respective AppImageBuild container - -set(CMAKE_SYSTEM_NAME Linux CACHE STRING "" FORCE) -set(CMAKE_SYSTEM_PROCESSOR arm CACHE STRING "" FORCE) - -set(triple aarch64-linux-gnu CACHE STRING "" FORCE) - -set(CMAKE_C_COMPILER "${triple}-gcc" CACHE STRING "" FORCE) -set(CMAKE_CXX_COMPILER "${triple}-g++" CACHE STRING "" FORCE) - -set(TOOLS_PREFIX "${triple}-" CACHE STRING "" FORCE) - -set(DEPENDENCIES_CFLAGS "-I/deps/include" CACHE STRING "" FORCE) -set(DEPENDENCIES_CPPFLAGS "${DEPENDENCIES_CFLAGS}" CACHE STRING "" FORCE) -set(DEPENDENCIES_LDFLAGS "-L/deps/lib/" CACHE STRING "" FORCE) - -# host = target system -# build = build system -# both must be specified -set(EXTRA_CONFIGURE_FLAGS "--host=${triple}" "--build=x86_64-pc-linux-gnu" "--target=${triple}" CACHE STRING "" FORCE) diff --git a/cmake/toolchains/arm-linux-gnueabihf.cmake b/cmake/toolchains/arm-linux-gnueabihf.cmake deleted file mode 100644 index 6c755e66e..000000000 --- a/cmake/toolchains/arm-linux-gnueabihf.cmake +++ /dev/null @@ -1,20 +0,0 @@ -# toolchain file that can be used for cross-compiling AppImageKit using the respective AppImageBuild container - -set(CMAKE_SYSTEM_NAME Linux CACHE STRING "" FORCE) -set(CMAKE_SYSTEM_PROCESSOR arm CACHE STRING "" FORCE) - -set(triple arm-linux-gnueabihf CACHE STRING "" FORCE) - -set(CMAKE_C_COMPILER "${triple}-gcc" CACHE STRING "" FORCE) -set(CMAKE_CXX_COMPILER "${triple}-g++" CACHE STRING "" FORCE) - -set(TOOLS_PREFIX "${triple}-" CACHE STRING "" FORCE) - -set(DEPENDENCIES_CFLAGS "-I/deps/include" CACHE STRING "" FORCE) -set(DEPENDENCIES_CPPFLAGS "${DEPENDENCIES_CFLAGS}" CACHE STRING "" FORCE) -set(DEPENDENCIES_LDFLAGS "-L/deps/lib/" CACHE STRING "" FORCE) - -# host = target system -# build = build system -# both must be specified -set(EXTRA_CONFIGURE_FLAGS "--host=${triple}" "--build=x86_64-pc-linux-gnu" "--target=${triple}" CACHE STRING "" FORCE) diff --git a/cmake/toolchains/i386-linux-gnu.cmake b/cmake/toolchains/i386-linux-gnu.cmake deleted file mode 100644 index dc6c28011..000000000 --- a/cmake/toolchains/i386-linux-gnu.cmake +++ /dev/null @@ -1,31 +0,0 @@ -# this toolchain file works for cross compiling on Ubuntu when the following prerequisites are given: -# - all dependencies that would be needed for a normal build must be installed as i386 versions -# - building XZ/liblzma doesn't work yet, so one has to install liblzma-dev:i386 and set -DUSE_SYSTEM_XZ=ON -# - building GTest doesn't work yet, so one has to install libgtest-dev:i386 and set -DUSE_SYSTEM_GTEST=ON -# - building libarchive doesn't work yet, so one has to install liblzma-dev:i386 and set -DUSE_SYSTEM_LIBARCHIVE=ON (TODO: link system libarchive statically like liblzma) -# some of the packets interfere with their x86_64 version (e.g., libfuse-dev:i386, libglib2-dev:i386), so building on a -# normal system will most likely not work, but on systems like Travis it should work fine - -set(CMAKE_SYSTEM_NAME Linux CACHE STRING "" FORCE) -set(CMAKE_SYSTEM_PROCESSOR i386 CACHE STRING "" FORCE) - -set(CMAKE_C_FLAGS "-m32" CACHE STRING "" FORCE) -set(CMAKE_CXX_FLAGS "-m32" CACHE STRING "" FORCE) - -# CMAKE_SHARED_LINKER_FLAGS, CMAKE_STATIC_LINKER_FLAGS etc. must not be set, but CMAKE_EXE_LINKER_FLAGS is necessary -set(CMAKE_EXE_LINKER_FLAGS "-m32" CACHE STRING "" FORCE) - -set(DEPENDENCIES_CFLAGS "-m32" CACHE STRING "" FORCE) -set(DEPENDENCIES_CPPFLAGS "-m32" CACHE STRING "" FORCE) -set(DEPENDENCIES_LDFLAGS "-m32" CACHE STRING "" FORCE) - -# host = target system -# build = build system -# both must be specified -set(EXTRA_CONFIGURE_FLAGS "--host=i686-pc-linux-gnu" "--build=x86_64-pc-linux-gnu" CACHE STRING "" FORCE) - -# may help with some rare issues -set(CMAKE_PREFIX_PATH /usr/lib/i386-linux-gnu CACHE STRING "" FORCE) - -# makes sure that at least on Ubuntu pkg-config will search for the :i386 packages -set(ENV{PKG_CONFIG_PATH} /usr/lib/i386-linux-gnu/pkgconfig/ CACHE STRING "" FORCE) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt deleted file mode 100644 index 9ca1144be..000000000 --- a/lib/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory(libappimage) diff --git a/lib/libappimage b/lib/libappimage deleted file mode 160000 index 9c1fae809..000000000 --- a/lib/libappimage +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 9c1fae809dedbb3015e9cd5b46e2b5aab06df36e diff --git a/resources/AppRun b/resources/AppRun deleted file mode 100755 index 2f9426cc2..000000000 --- a/resources/AppRun +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -SELF=$(readlink -f "$0") -HERE=${SELF%/*} -export PATH="${HERE}/usr/bin/:${HERE}/usr/sbin/:${HERE}/usr/games/:${HERE}/bin/:${HERE}/sbin/${PATH:+:$PATH}" -export LD_LIBRARY_PATH="${HERE}/usr/lib/:${HERE}/usr/lib/i386-linux-gnu/:${HERE}/usr/lib/x86_64-linux-gnu/:${HERE}/usr/lib32/:${HERE}/usr/lib64/:${HERE}/lib/:${HERE}/lib/i386-linux-gnu/:${HERE}/lib/x86_64-linux-gnu/:${HERE}/lib32/:${HERE}/lib64/${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" -export PYTHONPATH="${HERE}/usr/share/pyshared/${PYTHONPATH:+:$PYTHONPATH}" -export XDG_DATA_DIRS="${HERE}/usr/share/${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" -export PERLLIB="${HERE}/usr/share/perl5/:${HERE}/usr/lib/perl5/${PERLLIB:+:$PERLLIB}" -export GSETTINGS_SCHEMA_DIR="${HERE}/usr/share/glib-2.0/schemas/${GSETTINGS_SCHEMA_DIR:+:$GSETTINGS_SCHEMA_DIR}" -export QT_PLUGIN_PATH="${HERE}/usr/lib/qt4/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt4/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt4/plugins/:${HERE}/usr/lib32/qt4/plugins/:${HERE}/usr/lib64/qt4/plugins/:${HERE}/usr/lib/qt5/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt5/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt5/plugins/:${HERE}/usr/lib32/qt5/plugins/:${HERE}/usr/lib64/qt5/plugins/${QT_PLUGIN_PATH:+:$QT_PLUGIN_PATH}" -EXEC=$(grep -e '^Exec=.*' "${HERE}"/*.desktop | head -n 1 | cut -d "=" -f 2 | cut -d " " -f 1) -exec "${EXEC}" "$@" diff --git a/resources/appimagetool.desktop b/resources/appimagetool.desktop deleted file mode 100644 index 86eabaf3d..000000000 --- a/resources/appimagetool.desktop +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Type=Application -Name=appimagetool -Exec=appimagetool -Comment=Tool to generate AppImages from AppDirs -Icon=appimagetool -Categories=Development; -Terminal=true - diff --git a/resources/appimagetool.png b/resources/appimagetool.png deleted file mode 100644 index a304efdfab107653faae17e85a254f7f50582e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9773 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 Hu0mjfS&vS> diff --git a/resources/appimagetool.svg b/resources/appimagetool.svg deleted file mode 100644 index 83ac5658b..000000000 --- a/resources/appimagetool.svg +++ /dev/null @@ -1,320 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/liblz4.pc b/resources/liblz4.pc deleted file mode 100644 index d2c7f86fd..000000000 --- a/resources/liblz4.pc +++ /dev/null @@ -1,14 +0,0 @@ -# LZ4 - Fast LZ compression algorithm -# Copyright (C) 2011-2014, Yann Collet. -# BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - -prefix=/usr -libdir=/usr/lib -includedir=/usr/include - -Name: lz4 -Description: fast lossless compression algorithm library -URL: http://code.google.com/p/lz4/ -Version: 131 -Libs: -L/usr/lib -llz4 -Cflags: -I/usr/include \ No newline at end of file diff --git a/resources/pubkey.asc b/resources/pubkey.asc deleted file mode 100644 index 49ce8c4f6..000000000 --- a/resources/pubkey.asc +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1 - -mQENBFgk9CwBCACs1C/QsJEGfrY4i6ppoCZ4YfNeRKNKIY7StV2ea/cWePEBTGlP -3uT4M2JGVpoXdwqZCQjpLS1d3gzIvldb6Z1aSOV7ylrcXsQuLQb93mt9kI7qtX1m -sSZOMuQj41ppdcg6z7Lt8H5k8AKKdlZvTAhm0tvvCWaevfTWf2WWBNUnYJf+eToO -IRZlVmXepFp9btQWdaOvHBfJ2rnCoA5f1yjlJ47K97UQKfBPYbYFwxYoKpB+DIHT -iALubIwB5xmsTqJr8jovEYP6hcqJe2tOEKNLmDNBw4/B6Vpf/R49WvpOS4RST2Ad -CUYCkL8HxmS9+QdBkWCdBMFiU5tIbmTIQFEfABEBAAG0MWFwcGltYWdlLm9yZyA8 -cHJvYm9ub3BkQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT6JATgEEwECACIFAlgk -9CwCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEGW0OEAQGy3EV6kH/iGd -w2Rj93b/pSpLgxVgOPIjNGXIEjLIi6qbIoBq2S0jpitIj3kW3PmwMZyozNoytVp+ -2TrrrqaS7Zv3P1HkQ+3DlGef4uwCTob5KQW8GY/cErSE3aWpmIOPFo2kwhaBaaJ+ -7vlnTmyTKIVqKqZg0JWFy4/VDIP6DPlkV6X3ehj/9/y8L1tfskdww81wA4N7e/PX -sPKH0bqib3lej1sVnwukakpbJwV07B84Uah7AGxd5f/he6u8vLLxz1oQJl4pIY8v -2DNgN4VoaWYGBHYKWluDalK8ClFkvzE3Ep7+hiFTAReJuby4LP5LCfZIesyJhR7e -6C+vZ4UEm8KdUScaxgS5AQ0EWCT0LAEIAKvi5l6gq5qdpfUwUCiBq2YHyDIXtXQG -KzcLoYpPeKCKqKYxmbmW3SIIIsIt42WjpZ0vBNWYJ+SbykNR9Fh+F1CMqrPiKOvT -shVnsbQybk+ljeO3O4Qtg1kj6mpCL3m7lPAMJ9pGZ9292xovLG0q5qoJg5WvNTIq -O7FUxbDWcRjUJDlsg5kbRDI/p2h65TEgqF0pGv+sziFXqBAtHm9eVr+mDa10ln47 -uB9QCW7tFMiuSP4j2KPVbZz+sRr6V1RVf/sS/5G7A4cukzF57ZSwCLRn8W+Pb7HQ -B9wC+uOUlmoGVlKc+xLeFYDM3+ksd86TJMmiQ0nWFMTCLr1aquKh8C8AEQEAAYkB -HwQYAQIACQUCWCT0LAIbDAAKCRBltDhAEBstxHDEB/47Uw2zTXRATH/cdpLDRaJE -UngRaxmygMer+huw4Whgn4m2VwOvW0oYVwZQfwJfq+irNDa8AgqDQjl077OO/XXh -swiAJc/OZ9QDX5eTwTUyzecVWXCqkZPktXnzaRY/kHoiPhTQh5IP5rpfMIX+BfWv -IUYqtHrfXqPZLJuELg8EorrVwGysXZuOZ0MwjUrEnBBfqWyWFq/CSVvlib+FOAOu -OJTO1UYLslZENdjzTwSKrDkxkTsbnOdVzWGGQEqYqJlm4vD5+OZoaHdjuSoJbl/p -7GvM8kP7zjugUA9BPTVBz7xKDZaN4wZ8G3Q50QfsR6MozFHKOMnVGeNG7rdZNQ0g -=dor1 ------END PGP PUBLIC KEY BLOCK----- diff --git a/resources/usr/share/metainfo/appimagetool.appdata.xml b/resources/usr/share/metainfo/appimagetool.appdata.xml deleted file mode 100644 index 0f7da9c2f..000000000 --- a/resources/usr/share/metainfo/appimagetool.appdata.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - appimagetool.desktop - MIT - MIT - appimagetool - Create AppImage files - -

- appimagetool is a tool that lets you generate AppImage files. An AppImage - is a self-running bundle that contains an application and everything - it needs to run that cannot reasonably expected to be part of each target system. -

-

- This can include libraries that are not commonly available on target systems, - resources such as translations, icons, fonts, and other auxiliary files. - appimagetool makes it easy to take an AppDir (e.g., generated by linuxdeployqt) - and turn it into an AppImage. -

-

- You can also embed update information so that your users can update the AppImage - using binary delta updates with the AppImageUpdate tool. - You can also sign the AppImage with GPG. -

-
- https://github.com/AppImage/AppImageKit - AppImage - - appimagetool - -
diff --git a/squashfs_osx.patch b/squashfs_osx.patch deleted file mode 100644 index b08351b10..000000000 --- a/squashfs_osx.patch +++ /dev/null @@ -1,434 +0,0 @@ -diff --git a/squashfs-tools/action.c b/squashfs-tools/action.c -index 4b06ccb..40780ae 100644 ---- a/squashfs-tools/action.c -+++ b/squashfs-tools/action.c -@@ -38,6 +38,10 @@ - #include - #include - -+#ifndef FNM_EXTMATCH /* glibc extension */ -+ #define FNM_EXTMATCH 0 -+#endif -+ - #include "squashfs_fs.h" - #include "mksquashfs.h" - #include "action.h" -@@ -2284,9 +2288,12 @@ static char *get_start(char *s, int n) - - static int subpathname_fn(struct atom *atom, struct action_data *action_data) - { -- return fnmatch(atom->argv[0], get_start(strdupa(action_data->subpath), -+ char *path = strdup(action_data->subpath); -+ int is_match = fnmatch(atom->argv[0], get_start(path, - count_components(atom->argv[0])), - FNM_PATHNAME|FNM_PERIOD|FNM_EXTMATCH) == 0; -+ free(path); -+ return is_match; - } - - /* -diff --git a/squashfs-tools/info.c b/squashfs-tools/info.c -index 7968c77..56f26dc 100644 ---- a/squashfs-tools/info.c -+++ b/squashfs-tools/info.c -@@ -134,31 +134,22 @@ void dump_state() - void *info_thrd(void *arg) - { - sigset_t sigmask; -- struct timespec timespec = { .tv_sec = 1, .tv_nsec = 0 }; -- int sig, waiting = 0; -+ int sig, err, waiting = 0; - - sigemptyset(&sigmask); - sigaddset(&sigmask, SIGQUIT); - sigaddset(&sigmask, SIGHUP); -+ sigaddset(&sigmask, SIGALRM); - - while(1) { -- if(waiting) -- sig = sigtimedwait(&sigmask, NULL, ×pec); -- else -- sig = sigwaitinfo(&sigmask, NULL); -+ err = sigwait(&sigmask, &sig); - -- if(sig == -1) { -+ if(err == -1) { - switch(errno) { -- case EAGAIN: -- /* interval timed out */ -- waiting = 0; -- /* FALLTHROUGH */ - case EINTR: -- /* if waiting, the wait will be longer, but -- that's OK */ - continue; - default: -- BAD_ERROR("sigtimedwait/sigwaitinfo failed " -+ BAD_ERROR("sigwait failed " - "because %s\n", strerror(errno)); - } - } -@@ -169,8 +160,12 @@ void *info_thrd(void *arg) - /* set one second interval period, if ^\ received - within then, dump queue and cache status */ - waiting = 1; -- } else -+ alarm(1); -+ } else if (sig == SIGQUIT) { - dump_state(); -+ } else if (sig == SIGALRM) { -+ waiting = 0; -+ } - } - } - -diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c -index e7965c4..44d62ce 100644 ---- a/squashfs-tools/mksquashfs.c -+++ b/squashfs-tools/mksquashfs.c -@@ -50,6 +50,10 @@ - #include - #include - -+#ifndef FNM_EXTMATCH /* glibc extension */ -+ #define FNM_EXTMATCH 0 -+#endif -+ - #ifndef linux - #define __BYTE_ORDER BYTE_ORDER - #define __BIG_ENDIAN BIG_ENDIAN -@@ -830,13 +834,13 @@ char *subpathname(struct dir_ent *dir_ent) - } - - --inline unsigned int get_inode_no(struct inode_info *inode) -+static inline unsigned int get_inode_no(struct inode_info *inode) - { - return inode->inode_number; - } - - --inline unsigned int get_parent_no(struct dir_info *dir) -+static inline unsigned int get_parent_no(struct dir_info *dir) - { - return dir->depth ? get_inode_no(dir->dir_ent->inode) : inode_no; - } -@@ -2029,7 +2033,7 @@ struct file_info *duplicate(long long file_size, long long bytes, - } - - --inline int is_fragment(struct inode_info *inode) -+static inline int is_fragment(struct inode_info *inode) - { - off_t file_size = inode->buf.st_size; - -@@ -2998,13 +3002,13 @@ struct inode_info *lookup_inode2(struct stat *buf, int pseudo, int id) - } - - --inline struct inode_info *lookup_inode(struct stat *buf) -+static inline struct inode_info *lookup_inode(struct stat *buf) - { - return lookup_inode2(buf, 0, 0); - } - - --inline void alloc_inode_no(struct inode_info *inode, unsigned int use_this) -+static inline void alloc_inode_no(struct inode_info *inode, unsigned int use_this) - { - if (inode->inode_number == 0) { - inode->inode_number = use_this ? : inode_no ++; -@@ -3015,7 +3019,7 @@ inline void alloc_inode_no(struct inode_info *inode, unsigned int use_this) - } - - --inline struct dir_ent *create_dir_entry(char *name, char *source_name, -+static inline struct dir_ent *create_dir_entry(char *name, char *source_name, - char *nonstandard_pathname, struct dir_info *dir) - { - struct dir_ent *dir_ent = malloc(sizeof(struct dir_ent)); -@@ -3033,7 +3037,7 @@ inline struct dir_ent *create_dir_entry(char *name, char *source_name, - } - - --inline void add_dir_entry(struct dir_ent *dir_ent, struct dir_info *sub_dir, -+static inline void add_dir_entry(struct dir_ent *dir_ent, struct dir_info *sub_dir, - struct inode_info *inode_info) - { - struct dir_info *dir = dir_ent->our_dir; -@@ -3049,7 +3053,7 @@ inline void add_dir_entry(struct dir_ent *dir_ent, struct dir_info *sub_dir, - } - - --inline void add_dir_entry2(char *name, char *source_name, -+static inline void add_dir_entry2(char *name, char *source_name, - char *nonstandard_pathname, struct dir_info *sub_dir, - struct inode_info *inode_info, struct dir_info *dir) - { -@@ -3061,7 +3065,7 @@ inline void add_dir_entry2(char *name, char *source_name, - } - - --inline void free_dir_entry(struct dir_ent *dir_ent) -+static inline void free_dir_entry(struct dir_ent *dir_ent) - { - if(dir_ent->name) - free(dir_ent->name); -@@ -3082,7 +3086,7 @@ inline void free_dir_entry(struct dir_ent *dir_ent) - } - - --inline void add_excluded(struct dir_info *dir) -+static inline void add_excluded(struct dir_info *dir) - { - dir->excluded ++; - } -@@ -4199,6 +4203,7 @@ void initialise_threads(int readq, int fragq, int bwriteq, int fwriteq, - sigemptyset(&sigmask); - sigaddset(&sigmask, SIGQUIT); - sigaddset(&sigmask, SIGHUP); -+ sigaddset(&sigmask, SIGALRM); - if(pthread_sigmask(SIG_BLOCK, &sigmask, NULL) == -1) - BAD_ERROR("Failed to set signal mask in intialise_threads\n"); - -@@ -4986,6 +4991,36 @@ int parse_num(char *arg, int *res) - - int get_physical_memory() - { -+ int phys_mem; -+#ifndef linux -+ #ifdef HW_MEMSIZE -+ #define SYSCTL_PHYSMEM HW_MEMSIZE -+ #elif defined(HW_PHYSMEM64) -+ #define SYSCTL_PHYSMEM HW_PHYSMEM64 -+ #else -+ #define SYSCTL_PHYSMEM HW_PHYSMEM -+ #endif -+ -+ int mib[2]; -+ uint64_t sysctl_physmem = 0; -+ size_t sysctl_len = sizeof(sysctl_physmem); -+ -+ mib[0] = CTL_HW; -+ mib[1] = SYSCTL_PHYSMEM; -+ -+ if(sysctl(mib, 2, &sysctl_physmem, &sysctl_len, NULL, 0) == 0) { -+ /* some systems use 32-bit values, work with what we're given */ -+ if (sysctl_len == 4) -+ sysctl_physmem = *(uint32_t*)&sysctl_physmem; -+ phys_mem = sysctl_physmem >> 20; -+ } else { -+ ERROR_START("Failed to get amount of available " -+ "memory."); -+ ERROR_EXIT(" Defaulting to least viable amount\n"); -+ phys_mem = SQUASHFS_LOWMEM; -+ } -+ #undef SYSCTL_PHYSMEM -+#else - /* - * Long longs are used here because with PAE, a 32-bit - * machine can have more than 4GB of physical memory -@@ -4993,10 +5028,11 @@ int get_physical_memory() - * sysconf(_SC_PHYS_PAGES) relies on /proc being mounted. - * If it isn't fail. - */ -- long long num_pages = sysconf(_SC_PHYS_PAGES); -- long long page_size = sysconf(_SC_PAGESIZE); - int phys_mem = num_pages * page_size >> 20; -+#endif - -+ long long num_pages = sysconf(_SC_PHYS_PAGES); -+ long long page_size = sysconf(_SC_PAGESIZE); - if(num_pages == -1 || page_size == -1) - return 0; - -diff --git a/squashfs-tools/mksquashfs.h b/squashfs-tools/mksquashfs.h -index 55708a3..d44d1fd 100644 ---- a/squashfs-tools/mksquashfs.h -+++ b/squashfs-tools/mksquashfs.h -@@ -24,6 +24,7 @@ - * mksquashfs.h - * - */ -+#include - - struct dir_info { - char *pathname; -diff --git a/squashfs-tools/pseudo.c b/squashfs-tools/pseudo.c -index cb74cf6..fe2b4bc 100644 ---- a/squashfs-tools/pseudo.c -+++ b/squashfs-tools/pseudo.c -@@ -30,6 +30,7 @@ - #include - #include - #include -+#include - #include - #include - #include -diff --git a/squashfs-tools/read_xattrs.c b/squashfs-tools/read_xattrs.c -index 42106f5..837d3fb 100644 ---- a/squashfs-tools/read_xattrs.c -+++ b/squashfs-tools/read_xattrs.c -@@ -39,13 +39,13 @@ - #include - #endif - -+#include -+ - #include "squashfs_fs.h" - #include "squashfs_swap.h" - #include "xattr.h" - #include "error.h" - --#include -- - extern int read_fs_bytes(int, long long, int, void *); - extern int read_block(int, long long, long long *, int, void *); - -diff --git a/squashfs-tools/unsquashfs.c b/squashfs-tools/unsquashfs.c -index c5e0876..e5566ff 100644 ---- a/squashfs-tools/unsquashfs.c -+++ b/squashfs-tools/unsquashfs.c -@@ -32,7 +32,12 @@ - #include "stdarg.h" - #include "fnmatch_compat.h" - -+#ifndef linux -+#include -+#else - #include -+#endif -+ - #include - #include - #include -@@ -2180,6 +2185,7 @@ void initialise_threads(int fragment_buffer_size, int data_buffer_size) - sigemptyset(&sigmask); - sigaddset(&sigmask, SIGQUIT); - sigaddset(&sigmask, SIGHUP); -+ sigaddset(&sigmask, SIGALRM); - if(pthread_sigmask(SIG_BLOCK, &sigmask, NULL) == -1) - EXIT_UNSQUASH("Failed to set signal mask in initialise_threads" - "\n"); -diff --git a/squashfs-tools/unsquashfs.h b/squashfs-tools/unsquashfs.h -index 0edbd25..cea9caa 100644 ---- a/squashfs-tools/unsquashfs.h -+++ b/squashfs-tools/unsquashfs.h -@@ -46,6 +46,10 @@ - #include - #include - -+#ifndef FNM_EXTMATCH /* glibc extension */ -+ #define FNM_EXTMATCH 0 -+#endif -+ - #ifndef linux - #define __BYTE_ORDER BYTE_ORDER - #define __BIG_ENDIAN BIG_ENDIAN -diff --git a/squashfs-tools/unsquashfs_info.c b/squashfs-tools/unsquashfs_info.c -index c8e2b9b..e26f0de 100644 ---- a/squashfs-tools/unsquashfs_info.c -+++ b/squashfs-tools/unsquashfs_info.c -@@ -97,31 +97,21 @@ void dump_state() - void *info_thrd(void *arg) - { - sigset_t sigmask; -- struct timespec timespec = { .tv_sec = 1, .tv_nsec = 0 }; -- int sig, waiting = 0; -+ int sig, err, waiting = 0; - - sigemptyset(&sigmask); - sigaddset(&sigmask, SIGQUIT); - sigaddset(&sigmask, SIGHUP); -+ sigaddset(&sigmask, SIGALRM); - - while(1) { -- if(waiting) -- sig = sigtimedwait(&sigmask, NULL, ×pec); -- else -- sig = sigwaitinfo(&sigmask, NULL); -- -- if(sig == -1) { -- switch(errno) { -- case EAGAIN: -- /* interval timed out */ -- waiting = 0; -- /* FALLTHROUGH */ -+ err = sigwait(&sigmask, &sig); -+ -+ if(err == -1) { - case EINTR: -- /* if waiting, the wait will be longer, but -- that's OK */ - continue; - default: -- BAD_ERROR("sigtimedwait/sigwaitinfo failed " -+ BAD_ERROR("sigwait failed " - "because %s\n", strerror(errno)); - } - } -@@ -133,8 +123,12 @@ void *info_thrd(void *arg) - /* set one second interval period, if ^\ received - within then, dump queue and cache status */ - waiting = 1; -- } else -- dump_state(); -+ alarm(1); -+ } else if (sig == SIGQUIT) { -+ dump_state(); -+ } else if (sig == SIGALRM) { -+ waiting = 0; -+ } - } - } - -diff --git a/squashfs-tools/unsquashfs_xattr.c b/squashfs-tools/unsquashfs_xattr.c -index 59f4aae..13f0e35 100644 ---- a/squashfs-tools/unsquashfs_xattr.c -+++ b/squashfs-tools/unsquashfs_xattr.c -@@ -27,6 +27,11 @@ - - #include - -+#ifdef XATTR_NOFOLLOW /* Apple's xattrs */ -+ #define lsetxattr(path_, name_, val_, sz_, flags_) \ -+ setxattr(path_, name_, val_, sz_, 0, flags_ | XATTR_NOFOLLOW) -+#endif -+ - #define NOSPACE_MAX 10 - - extern int root_process; -diff --git a/squashfs-tools/xattr.c b/squashfs-tools/xattr.c -index b46550c..5b32eca 100644 ---- a/squashfs-tools/xattr.c -+++ b/squashfs-tools/xattr.c -@@ -22,6 +22,14 @@ - * xattr.c - */ - -+#ifndef linux -+#define __BYTE_ORDER BYTE_ORDER -+#define __BIG_ENDIAN BIG_ENDIAN -+#define __LITTLE_ENDIAN LITTLE_ENDIAN -+#else -+#include -+#endif -+ - #define TRUE 1 - #define FALSE 0 - -@@ -36,6 +44,13 @@ - #include - #include - -+#ifdef XATTR_NOFOLLOW /* Apple's xattrs */ -+ #define llistxattr(path_, buf_, sz_) \ -+ listxattr(path_, buf_, sz_, XATTR_NOFOLLOW) -+ #define lgetxattr(path_, name_, val_, sz_) \ -+ getxattr(path_, name_, val_, sz_, 0, XATTR_NOFOLLOW) -+#endif -+ - #include "squashfs_fs.h" - #include "squashfs_swap.h" - #include "mksquashfs.h" diff --git a/src/AppRun.c b/src/AppRun.c deleted file mode 100644 index 3ff82af3f..000000000 --- a/src/AppRun.c +++ /dev/null @@ -1,219 +0,0 @@ -/************************************************************************** - -Copyright (c) 2004-18 Simon Peter -Portions Copyright (c) 2010 RazZziel - -All Rights Reserved. - -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. - -**************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include - -#define die(...) \ - do { \ - fprintf(stderr, "Error: " __VA_ARGS__); \ - exit(1); \ - } while(0); -#define SET_NEW_ENV(str,len,fmt,...) \ - format = fmt; \ - length = strlen(format) + (len); \ - char *str = calloc(length, sizeof(char)); \ - snprintf(str, length, format, __VA_ARGS__); \ - putenv(str); -#define MAX(a,b) (a > b ? a : b) -#define bool int -#define false 0 -#define true -1 - -#define LINE_SIZE 255 - -int filter(const struct dirent *dir) { - char *p = (char*) &dir->d_name; - p = strrchr(p, '.'); - return p && !strcmp(p, ".desktop"); -} - -int main(int argc, char *argv[]) { - char *appdir = dirname(realpath("/proc/self/exe", NULL)); - if (!appdir) - die("Could not access /proc/self/exe\n"); - - int ret; - struct dirent **namelist; - ret = scandir(appdir, &namelist, filter, NULL); - - if (ret == 0) { - die("No .desktop files found\n"); - } else if(ret == -1) { - die("Could not scan directory %s\n", appdir); - } - - /* Extract executable from .desktop file */ - char *desktop_file = calloc(LINE_SIZE, sizeof(char)); - snprintf(desktop_file, LINE_SIZE, "%s/%s", appdir, namelist[0]->d_name); - FILE *f = fopen(desktop_file, "r"); - char *line = malloc(LINE_SIZE); - size_t n = LINE_SIZE; - - do { - if (getline(&line, &n, f) == -1) - die("Executable not found, make sure there is a line starting with 'Exec='\n"); - } while(strncmp(line, "Exec=", 5)); - fclose(f); - char *exe = line+5; - - // parse arguments - bool in_quotes = 0; - for (n = 0; n < LINE_SIZE; n++) { - if (!line[n]) // end of string - break; - else if (line[n] == 10 || line[n] == 13) { - line[n] = '\0'; - line[n+1] = '\0'; - line[n+2] = '\0'; - break; - } else if (line[n] == '"') { - in_quotes = !in_quotes; - } else if (line[n] == ' ' && !in_quotes) - line[n] = '\0'; - } - - // count arguments - char* arg = exe; - int argcount = 0; - while ((arg += (strlen(arg)+1)) && *arg) - argcount += 1; - - // merge args - char* outargptrs[argcount + argc + 1]; - outargptrs[0] = exe; - int outargindex = 1; - arg = exe; - int argc_ = argc - 1; // argv[0] is the filename - char** argv_ = argv + 1; - while ((arg += (strlen(arg)+1)) && *arg) { - if (arg[0] == '%' || (arg[0] == '"' && arg[1] == '%')) { // handle desktop file field codes - char code = arg[arg[0] == '%' ? 1 : 2]; - switch(code) { - case 'f': - case 'u': - if (argc_ > 0) { - outargptrs[outargindex++] = *argv_++; - argc_--; - } - break; - case 'F': - case 'U': - while (argc_ > 0) { - outargptrs[outargindex++] = *argv_++; - argc_--; - } - break; - case 'i': - case 'c': - case 'k': - fprintf(stderr, "WARNING: Desktop file field code %%%c is not currently supported\n", code); - break; - default: - fprintf(stderr, "WARNING: Invalid desktop file field code %%%c\n", code); - break; - } - } else { - outargptrs[outargindex++] = arg; - } - } - while (argc_ > 0) { - outargptrs[outargindex++] = *argv_++; - argc_--; - } - outargptrs[outargindex] = '\0'; // trailing null argument required by execvp() - - // change directory - size_t appdir_s = strlen(appdir); - char *usr_in_appdir = malloc(appdir_s + 5); - snprintf(usr_in_appdir, appdir_s + 5, "%s/usr", appdir); - ret = chdir(usr_in_appdir); - if (ret != 0) - die("Could not cd into %s\n", usr_in_appdir); - - // set environment variables - char *old_env; - size_t length; - const char *format; - - /* https://docs.python.org/2/using/cmdline.html#envvar-PYTHONHOME */ - SET_NEW_ENV(new_pythonhome, appdir_s, "PYTHONHOME=%s/usr/", appdir); - - old_env = getenv("PATH") ?: ""; - SET_NEW_ENV(new_path, appdir_s*5 + strlen(old_env), "PATH=%s/usr/bin/:%s/usr/sbin/:%s/usr/games/:%s/bin/:%s/sbin/:%s", appdir, appdir, appdir, appdir, appdir, old_env); - - old_env = getenv("LD_LIBRARY_PATH") ?: ""; - SET_NEW_ENV(new_ld_library_path, appdir_s*10 + strlen(old_env), "LD_LIBRARY_PATH=%s/usr/lib/:%s/usr/lib/i386-linux-gnu/:%s/usr/lib/x86_64-linux-gnu/:%s/usr/lib32/:%s/usr/lib64/:%s/lib/:%s/lib/i386-linux-gnu/:%s/lib/x86_64-linux-gnu/:%s/lib32/:%s/lib64/:%s", appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, old_env); - - old_env = getenv("PYTHONPATH") ?: ""; - SET_NEW_ENV(new_pythonpath, appdir_s + strlen(old_env), "PYTHONPATH=%s/usr/share/pyshared/:%s", appdir, old_env); - - old_env = getenv("XDG_DATA_DIRS") ?: "/usr/local/share/:/usr/share/"; - SET_NEW_ENV(new_xdg_data_dirs, appdir_s + strlen(old_env), "XDG_DATA_DIRS=%s/usr/share/:%s", appdir, old_env); - - old_env = getenv("PERLLIB") ?: ""; - SET_NEW_ENV(new_perllib, appdir_s*2 + strlen(old_env), "PERLLIB=%s/usr/share/perl5/:%s/usr/lib/perl5/:%s", appdir, appdir, old_env); - - /* http://askubuntu.com/questions/251712/how-can-i-install-a-gsettings-schema-without-root-privileges */ - old_env = getenv("GSETTINGS_SCHEMA_DIR") ?: ""; - SET_NEW_ENV(new_gsettings_schema_dir, appdir_s + strlen(old_env), "GSETTINGS_SCHEMA_DIR=%s/usr/share/glib-2.0/schemas/:%s", appdir, old_env); - - old_env = getenv("QT_PLUGIN_PATH") ?: ""; - SET_NEW_ENV(new_qt_plugin_path, appdir_s*10 + strlen(old_env), "QT_PLUGIN_PATH=%s/usr/lib/qt4/plugins/:%s/usr/lib/i386-linux-gnu/qt4/plugins/:%s/usr/lib/x86_64-linux-gnu/qt4/plugins/:%s/usr/lib32/qt4/plugins/:%s/usr/lib64/qt4/plugins/:%s/usr/lib/qt5/plugins/:%s/usr/lib/i386-linux-gnu/qt5/plugins/:%s/usr/lib/x86_64-linux-gnu/qt5/plugins/:%s/usr/lib32/qt5/plugins/:%s/usr/lib64/qt5/plugins/:%s", appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, old_env); - - SET_NEW_ENV(new_gspath, appdir_s + strlen(old_env), "GST_PLUGIN_SYSTEM_PATH=%s/usr/lib/gstreamer:%s", appdir, old_env); - SET_NEW_ENV(new_gspath1, appdir_s + strlen(old_env), "GST_PLUGIN_SYSTEM_PATH_1_0=%s/usr/lib/gstreamer-1.0:%s", appdir, old_env); - - /* Otherwise may get errors because Python cannot write __pycache__ bytecode cache */ - putenv("PYTHONDONTWRITEBYTECODE=1"); - - /* Run */ - ret = execvp(exe, outargptrs); - - int error = errno; - - if (ret == -1) - die("Error executing '%s': %s\n", exe, strerror(error)); - - free(line); - free(desktop_file); - free(usr_in_appdir); - free(new_pythonhome); - free(new_path); - free(new_ld_library_path); - free(new_pythonpath); - free(new_xdg_data_dirs); - free(new_perllib); - free(new_gsettings_schema_dir); - free(new_qt_plugin_path); - return 0; -} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt deleted file mode 100644 index f2247b405..000000000 --- a/src/CMakeLists.txt +++ /dev/null @@ -1,169 +0,0 @@ -find_package(Sanitizers) - -if(NOT COMMAND add_sanitizers) - message(WARNING "Sanitizers CMake module not found, sanitizer support is not available") - # defining a no-op function to avoid CMake errors - function(add_sanitizers ...) - endfunction() -endif() - - -# allow setting different path for mksquashfs after installation -set(AUXILIARY_FILES_DESTINATION "lib/appimagekit" CACHE STRING "Target install directory for mksquashfs") - - -# the runtime build configuration is quite long, therefore it's managed in a separate CMake script -include(build-runtime.cmake) - - -add_executable(appimagetool - appimagetool.c - appimagetool_sign.c - binreloc.c - runtime_embed.o -) - -target_include_directories(appimagetool - PUBLIC $ - INTERFACE $ -) - -# required for appimagetool's signing -# we're using CMake's functionality directly, since we want to link those statically -find_package(PkgConfig) -pkg_check_modules(libgpgme REQUIRED gpgme IMPORTED_TARGET) -pkg_check_modules(libgcrypt REQUIRED libgcrypt IMPORTED_TARGET) - -# trick: list libraries on which imported static ones depend on in the PUBLIC section -# CMake then adds them after the PRIVATE ones in the linker command -target_link_libraries(appimagetool - ${CMAKE_DL_LIBS} - libsquashfuse - xdg-basedir - libappimage_shared - libglib - libgio - libzlib - PkgConfig::libgcrypt - PkgConfig::libgpgme - xz -) - -target_compile_definitions(appimagetool - PRIVATE -D_FILE_OFFSET_BITS=64 - PRIVATE -DGIT_COMMIT="${GIT_COMMIT}" - PRIVATE -DBUILD_NUMBER="${BUILD_NUMBER}" - PRIVATE -DBUILD_DATE="${DATE}" - PRIVATE -DENABLE_BINRELOC -) - -target_include_directories(appimagetool - PUBLIC $ - INTERFACE $ -) - -if(AUXILIARY_FILES_DESTINATION) - message(STATUS "Installing auxiliary files in path: ${AUXILIARY_FILES_DESTINATION}") - target_compile_definitions(appimagetool - PRIVATE -DAUXILIARY_FILES_DESTINATION="${AUXILIARY_FILES_DESTINATION}" - ) -endif() - -add_sanitizers(appimagetool) - - -add_executable(AppRun AppRun.c) - -target_compile_definitions(AppRun - PRIVATE -D_FILE_OFFSET_BITS=64 - PRIVATE -DGIT_COMMIT="${GIT_COMMIT}" - PRIVATE -DENABLE_BINRELOC -) - -add_sanitizers(AppRun) - - -if (NOT TARGET libssl) - message(WARNING "Could not find suitable libssl, skipping build of validate and digest") -else() - add_executable(validate validate.c) - - target_link_libraries(validate - libappimage_shared - libglib - libssl - ) - - target_include_directories(validate - PUBLIC $ - INTERFACE $ - INTERFACE $ -) - -target_link_libraries(digest_md5 - PRIVATE libglib - PRIVATE libappimage_shared -) - - -# install binaries -if(NOT USE_SYSTEM_MKSQUASHFS) - if(AUXILIARY_FILES_DESTINATION) - install( - PROGRAMS ${mksquashfs_INSTALL_DIR}/mksquashfs ${CMAKE_CURRENT_BINARY_DIR}/runtime - DESTINATION ${AUXILIARY_FILES_DESTINATION} - COMPONENT applications - ) - else() - install( - PROGRAMS ${mksquashfs_INSTALL_DIR}/mksquashfs ${CMAKE_CURRENT_BINARY_DIR}/runtime - DESTINATION bin - COMPONENT applications - ) - endif() -endif() - -set(optional_targets "") -foreach(target validate digest) - if(TARGET ${target}) - list(APPEND optional_targets ${target}) - endif() -endforeach() - -install( - TARGETS AppRun appimagetool ${optional_targets} - RUNTIME DESTINATION bin COMPONENT applications - LIBRARY DESTINATION lib COMPONENT applications - ARCHIVE DESTINATION lib/static COMPONENT applications - INCLUDES DESTINATION include COMPONENT applications -) - -# Configure appimagetool component -install( - TARGETS appimagetool AppRun - RUNTIME DESTINATION bin COMPONENT appimagetool EXCLUDE_FROM_ALL -) - -install(FILES "${PROJECT_SOURCE_DIR}/resources/appimagetool.desktop" DESTINATION share/applications COMPONENT appimagetool EXCLUDE_FROM_ALL) -install(FILES "${PROJECT_SOURCE_DIR}/resources/appimagetool.png" DESTINATION share/icons/hicolor/128x128/apps COMPONENT appimagetool EXCLUDE_FROM_ALL) -install(FILES "${PROJECT_SOURCE_DIR}/resources/usr/share/metainfo/appimagetool.appdata.xml" DESTINATION share/metainfo COMPONENT appimagetool EXCLUDE_FROM_ALL) diff --git a/src/appimagetool.c b/src/appimagetool.c deleted file mode 100644 index a4132649f..000000000 --- a/src/appimagetool.c +++ /dev/null @@ -1,1153 +0,0 @@ -/************************************************************************** - * - * Copyright (c) 2004-19 Simon Peter - * - * All Rights Reserved. - * - * 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. - * - **************************************************************************/ - -#ident "AppImage by Simon Peter, http://appimage.org/" - -#ifndef RELEASE_NAME - #define RELEASE_NAME "continuous build" -#endif - -#include -#include -#include -#include - -#include -#include - -#include -#include "squashfuse.h" - -#include -#include -#include - -#include "binreloc.h" - -#include - -#include -#include -#include -#include -#include -#include - -#include "appimage/appimage.h" -#include "appimagetool_sign.h" - -#ifdef __linux__ -#define HAVE_BINARY_RUNTIME -extern char runtime[]; -extern unsigned int runtime_len; -#endif - -enum fARCH { - fARCH_i386, - fARCH_x86_64, - fARCH_arm, - fARCH_aarch64 -}; - -static gchar const APPIMAGEIGNORE[] = ".appimageignore"; -static char _exclude_file_desc[256]; - -static gboolean list = FALSE; -static gboolean verbose = FALSE; -static gboolean showVersionOnly = FALSE; -static gboolean sign = FALSE; -static gboolean no_appstream = FALSE; -gchar **remaining_args = NULL; -gchar *updateinformation = NULL; -static gboolean guess_update_information = FALSE; -gchar *bintray_user = NULL; -gchar *bintray_repo = NULL; -gchar *sqfs_comp = "gzip"; -gchar **sqfs_opts = NULL; -gchar *exclude_file = NULL; -gchar *runtime_file = NULL; -gchar *sign_key = NULL; -gchar *pathToMksquashfs = NULL; - -// ##################################################################### - -static void die(const char *msg) { - fprintf(stderr, "%s\n", msg); - exit(1); -} - -/* Function that prints the contents of a squashfs file -* using libsquashfuse (#include "squashfuse.h") */ -int sfs_ls(char* image) { - sqfs_err err = SQFS_OK; - sqfs_traverse trv; - sqfs fs; - - ssize_t fs_offset = appimage_get_elf_size(image); - - // error check - if (fs_offset < 0) - die("failed to read elf size"); - - if ((err = sqfs_open_image(&fs, image, fs_offset))) - die("sqfs_open_image error"); - - if ((err = sqfs_traverse_open(&trv, &fs, sqfs_inode_root(&fs)))) - die("sqfs_traverse_open error"); - while (sqfs_traverse_next(&trv, &err)) { - if (!trv.dir_end) { - printf("%s\n", trv.path); - } - } - if (err) - die("sqfs_traverse_next error"); - sqfs_traverse_close(&trv); - - sqfs_fd_close(fs.fd); - return 0; -} - -/* Generate a squashfs filesystem using mksquashfs on the $PATH -* execlp(), execvp(), and execvpe() search on the $PATH */ -int sfs_mksquashfs(char *source, char *destination, int offset) { - pid_t pid = fork(); - if (pid == -1) { - perror("sfs_mksquashfs fork() failed"); - return(-1); - } - - if (pid > 0) { - // This is the parent process. Wait for the child to termiante and check its exit status. - int status; - if(waitpid(pid, &status, 0) == -1) { - perror("sfs_mksquashfs waitpid() failed"); - return(-1); - } - - int retcode = WEXITSTATUS(status); - if (retcode) { - fprintf(stderr, "mksquashfs (pid %d) exited with code %d\n", pid, retcode); - return(-1); - } - - return 0; - } else { - // we are the child - gchar* offset_string; - offset_string = g_strdup_printf("%i", offset); - - guint sqfs_opts_len = sqfs_opts ? g_strv_length(sqfs_opts) : 0; - - int max_num_args = sqfs_opts_len + 22; - char* args[max_num_args]; - bool use_xz = strcmp(sqfs_comp, "xz") >= 0; - - int i = 0; -#ifndef AUXILIARY_FILES_DESTINATION - args[i++] = "mksquashfs"; -#else - args[i++] = pathToMksquashfs; -#endif - args[i++] = source; - args[i++] = destination; - args[i++] = "-offset"; - args[i++] = offset_string; - - args[i++] = "-comp"; - if (use_xz) - args[i++] = "xz"; - else - args[i++] = sqfs_comp; - - args[i++] = "-root-owned"; - args[i++] = "-noappend"; - - if (use_xz) { - // https://jonathancarter.org/2015/04/06/squashfs-performance-testing/ says: - // improved performance by using a 16384 block size with a sacrifice of around 3% more squashfs image space - args[i++] = "-Xdict-size"; - args[i++] = "100%"; - args[i++] = "-b"; - args[i++] = "16384"; - } - - // check if ignore file exists and use it if possible - if (access(APPIMAGEIGNORE, F_OK) >= 0) { - printf("Including %s", APPIMAGEIGNORE); - args[i++] = "-wildcards"; - args[i++] = "-ef"; - - // avoid warning: assignment discards ‘const’ qualifier - char* buf = strdup(APPIMAGEIGNORE); - args[i++] = buf; - } - - // if an exclude file has been passed on the command line, should be used, too - if (exclude_file != 0 && strlen(exclude_file) > 0) { - if (access(exclude_file, F_OK) < 0) { - printf("WARNING: exclude file %s not found!", exclude_file); - return -1; - } - - args[i++] = "-wildcards"; - args[i++] = "-ef"; - args[i++] = exclude_file; - } - - args[i++] = "-mkfs-time"; - args[i++] = "0"; - - for (guint sqfs_opts_idx = 0; sqfs_opts_idx < sqfs_opts_len; ++sqfs_opts_idx) { - args[i++] = sqfs_opts[sqfs_opts_idx]; - } - - args[i++] = 0; - - if (verbose) { - printf("mksquashfs commandline: "); - for (char** t = args; *t != 0; t++) { - printf("%s ", *t); - } - printf("\n"); - } - -#ifndef AUXILIARY_FILES_DESTINATION - execvp("mksquashfs", args); - perror("execvp(\"mksquashfs\") failed"); -#else - execvp(pathToMksquashfs, args); - fprintf(stderr, "execvp(\"%s\") failed: %s\n", pathToMksquashfs, strerror(errno)); -#endif - return -1; // exec never returns - } - return 0; -} - -/* Validate desktop file using desktop-file-validate on the $PATH -* execlp(), execvp(), and execvpe() search on the $PATH */ -int validate_desktop_file(char *file) { - int statval; - int child_pid; - child_pid = fork(); - if(child_pid == -1) - { - printf("could not fork! \n"); - return 1; - } - else if(child_pid == 0) - { - execlp("desktop-file-validate", "desktop-file-validate", file, NULL); - } - else - { - waitpid(child_pid, &statval, WUNTRACED | WCONTINUED); - if(WIFEXITED(statval)){ - return(WEXITSTATUS(statval)); - } - } - return -1; -} - -/* Generate a squashfs filesystem -* The following would work if we link to mksquashfs.o after we renamed -* main() to mksquashfs_main() in mksquashfs.c but we don't want to actually do -* this because squashfs-tools is not under a permissive license -* i *nt sfs_mksquashfs(char *source, char *destination) { -* char *child_argv[5]; -* child_argv[0] = NULL; -* child_argv[1] = source; -* child_argv[2] = destination; -* child_argv[3] = "-root-owned"; -* child_argv[4] = "-noappend"; -* mksquashfs_main(5, child_argv); -* } -*/ - -/* in-place modification of the string, and assuming the buffer pointed to by -* line is large enough to hold the resulting string*/ -static void replacestr(char *line, const char *search, const char *replace) -{ - char *sp = NULL; - - if ((sp = strstr(line, search)) == NULL) { - return; - } - int search_len = strlen(search); - int replace_len = strlen(replace); - int tail_len = strlen(sp+search_len); - - memmove(sp+replace_len,sp+search_len,tail_len+1); - memcpy(sp, replace, replace_len); - - /* Do it recursively again until no more work to do */ - - if ((sp = strstr(line, search))) { - replacestr(line, search, replace); - } -} - -int count_archs(bool* archs) { - int countArchs = 0; - int i; - for (i = 0; i < 4; i++) { - countArchs += archs[i]; - } - return countArchs; -} - -gchar* getArchName(bool* archs) { - if (archs[fARCH_i386]) - return "i386"; - else if (archs[fARCH_x86_64]) - return "x86_64"; - else if (archs[fARCH_arm]) - return "armhf"; - else if (archs[fARCH_aarch64]) - return "aarch64"; - else - return "all"; -} - -void extract_arch_from_e_machine_field(int16_t e_machine, const gchar* sourcename, bool* archs) { - if (e_machine == 3) { - archs[fARCH_i386] = 1; - if(verbose) - fprintf(stderr, "%s used for determining architecture i386\n", sourcename); - } - - if (e_machine == 62) { - archs[fARCH_x86_64] = 1; - if(verbose) - fprintf(stderr, "%s used for determining architecture x86_64\n", sourcename); - } - - if (e_machine == 40) { - archs[fARCH_arm] = 1; - if(verbose) - fprintf(stderr, "%s used for determining architecture armhf\n", sourcename); - } - - if (e_machine == 183) { - archs[fARCH_aarch64] = 1; - if(verbose) - fprintf(stderr, "%s used for determining architecture aarch64\n", sourcename); - } -} - -void extract_arch_from_text(gchar *archname, const gchar* sourcename, bool* archs) { - if (archname) { - archname = g_strstrip(archname); - if (archname) { - replacestr(archname, "-", "_"); - replacestr(archname, " ", "_"); - if (g_ascii_strncasecmp("i386", archname, 20) == 0 - || g_ascii_strncasecmp("i486", archname, 20) == 0 - || g_ascii_strncasecmp("i586", archname, 20) == 0 - || g_ascii_strncasecmp("i686", archname, 20) == 0 - || g_ascii_strncasecmp("intel_80386", archname, 20) == 0 - || g_ascii_strncasecmp("intel_80486", archname, 20) == 0 - || g_ascii_strncasecmp("intel_80586", archname, 20) == 0 - || g_ascii_strncasecmp("intel_80686", archname, 20) == 0 - ) { - archs[fARCH_i386] = 1; - if (verbose) - fprintf(stderr, "%s used for determining architecture i386\n", sourcename); - } else if (g_ascii_strncasecmp("x86_64", archname, 20) == 0) { - archs[fARCH_x86_64] = 1; - if (verbose) - fprintf(stderr, "%s used for determining architecture x86_64\n", sourcename); - } else if (g_ascii_strncasecmp("arm", archname, 20) == 0) { - archs[fARCH_arm] = 1; - if (verbose) - fprintf(stderr, "%s used for determining architecture ARM\n", sourcename); - } else if (g_ascii_strncasecmp("arm_aarch64", archname, 20) == 0) { - archs[fARCH_aarch64] = 1; - if (verbose) - fprintf(stderr, "%s used for determining architecture ARM aarch64\n", sourcename); - } - } - } -} - -int16_t read_elf_e_machine_field(const gchar* file_path) { - int16_t e_machine = 0x00; - FILE* file = 0; - file = fopen(file_path, "rb"); - if (file) { - fseek(file, 0x12, SEEK_SET); - fgets((char*) (&e_machine), 0x02, file); - fclose(file); - } - - return e_machine; -} - -void guess_arch_of_file(const gchar *archfile, bool* archs) { - int16_t e_machine_field = read_elf_e_machine_field(archfile); - extract_arch_from_e_machine_field(e_machine_field, archfile, archs); -} - -void find_arch(const gchar *real_path, const gchar *pattern, bool* archs) { - GDir *dir; - gchar *full_name; - dir = g_dir_open(real_path, 0, NULL); - if (dir != NULL) { - const gchar *entry; - while ((entry = g_dir_read_name(dir)) != NULL) { - full_name = g_build_filename(real_path, entry, NULL); - if (g_file_test(full_name, G_FILE_TEST_IS_SYMLINK)) { - } else if (g_file_test(full_name, G_FILE_TEST_IS_DIR)) { - find_arch(full_name, pattern, archs); - } else if (g_file_test(full_name, G_FILE_TEST_IS_EXECUTABLE) || g_pattern_match_simple(pattern, entry) ) { - guess_arch_of_file(full_name, archs); - } - } - g_dir_close(dir); - } - else { - g_warning("%s: %s", real_path, g_strerror(errno)); - } -} - -gchar* find_first_matching_file_nonrecursive(const gchar *real_path, const gchar *pattern) { - GDir *dir; - gchar *full_name; - dir = g_dir_open(real_path, 0, NULL); - if (dir != NULL) { - const gchar *entry; - while ((entry = g_dir_read_name(dir)) != NULL) { - full_name = g_build_filename(real_path, entry, NULL); - if (g_file_test(full_name, G_FILE_TEST_IS_REGULAR)) { - if(g_pattern_match_simple(pattern, entry)) - return(full_name); - } - } - g_dir_close(dir); - } - else { - g_warning("%s: %s", real_path, g_strerror(errno)); - } - return NULL; -} - -gchar* get_desktop_entry(GKeyFile *kf, char *key) { - gchar *value = g_key_file_get_string (kf, "Desktop Entry", key, NULL); - if (! value){ - fprintf(stderr, "%s entry not found in desktop file\n", key); - } - return value; -} - -bool readFile(char* filename, int* size, char** buffer) { - FILE* f = fopen(filename, "rb"); - if (f==NULL) { - *buffer = 0; - *size = 0; - return false; - } - - fseek(f, 0, SEEK_END); - long fsize = ftell(f); - fseek(f, 0, SEEK_SET); - - char *indata = malloc(fsize); - fread(indata, fsize, 1, f); - fclose(f); - *size = (int)fsize; - *buffer = indata; - return TRUE; -} - -/* run a command outside the current appimage, block environs like LD_LIBRARY_PATH */ -int run_external(const char *filename, char *const argv []) { - int pid = fork(); - if (pid < 0) { - g_print("run_external: fork failed"); - // fork failed - exit(1); - } else if (pid == 0) { - // blocks env defined in resources/AppRun - unsetenv("LD_LIBRARY_PATH"); - unsetenv("PYTHONPATH"); - unsetenv("XDG_DATA_DIRS"); - unsetenv("PERLLIB"); - unsetenv("GSETTINGS_SCHEMA_DIR"); - unsetenv("QT_PLUGIN_PATH"); - // runs command - execv(filename, argv); - // execv(3) returns, indicating error - g_print("run_external: subprocess execv(3) got error %s", g_strerror(errno)); - exit(1); - } else { - int wstatus; - if (waitpid(pid, &wstatus, 0) == -1) { - g_print("run_external: wait failed"); - return -1; - } - if (WIFEXITED(wstatus) && (WEXITSTATUS(wstatus) == 0)) { - return 0; - } else { - g_print("run_external: subprocess exited with status %d", WEXITSTATUS(wstatus)); - return 1; - } - } -} - -// ##################################################################### - -static GOptionEntry entries[] = -{ - { "list", 'l', 0, G_OPTION_ARG_NONE, &list, "List files in SOURCE AppImage", NULL }, - { "updateinformation", 'u', 0, G_OPTION_ARG_STRING, &updateinformation, "Embed update information STRING; if zsyncmake is installed, generate zsync file", NULL }, - { "guess", 'g', 0, G_OPTION_ARG_NONE, &guess_update_information, "Guess update information based on Travis CI or GitLab environment variables", NULL }, - { "bintray-user", 0, 0, G_OPTION_ARG_STRING, &bintray_user, "Bintray user name", NULL }, - { "bintray-repo", 0, 0, G_OPTION_ARG_STRING, &bintray_repo, "Bintray repository", NULL }, - { "version", 0, 0, G_OPTION_ARG_NONE, &showVersionOnly, "Show version number", NULL }, - { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Produce verbose output", NULL }, - { "sign", 's', 0, G_OPTION_ARG_NONE, &sign, "Sign with gpg[2]", NULL }, - { "comp", 0, 0, G_OPTION_ARG_STRING, &sqfs_comp, "Squashfs compression", NULL }, - { "mksquashfs-opt", 0, 0, G_OPTION_ARG_STRING_ARRAY, &sqfs_opts, "Argument to pass through to mksquashfs; can be specified multiple times", NULL }, - { "no-appstream", 'n', 0, G_OPTION_ARG_NONE, &no_appstream, "Do not check AppStream metadata", NULL }, - { "exclude-file", 0, 0, G_OPTION_ARG_STRING, &exclude_file, _exclude_file_desc, NULL }, - { "runtime-file", 0, 0, G_OPTION_ARG_STRING, &runtime_file, "Runtime file to use", NULL }, - { "sign-key", 0, 0, G_OPTION_ARG_STRING, &sign_key, "Key ID to use for gpg[2] signatures", NULL}, - { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &remaining_args, NULL, NULL }, - { 0,0,0,0,0,0,0 } -}; - -int -main (int argc, char *argv[]) -{ - - /* Parse Travis CI environment variables. - * https://docs.travis-ci.com/user/environment-variables/#Default-Environment-Variables - * TRAVIS_COMMIT: The commit that the current build is testing. - * TRAVIS_REPO_SLUG: The slug (in form: owner_name/repo_name) of the repository currently being built. - * TRAVIS_TAG: If the current build is for a git tag, this variable is set to the tag’s name. - * We cannot use g_environ_getenv (g_get_environ() since it is too new for CentOS 6 */ - // char* travis_commit; - // travis_commit = getenv("TRAVIS_COMMIT"); - char* travis_repo_slug; - travis_repo_slug = getenv("TRAVIS_REPO_SLUG"); - char* travis_tag; - travis_tag = getenv("TRAVIS_TAG"); - char* travis_pull_request; - travis_pull_request = getenv("TRAVIS_PULL_REQUEST"); - /* https://github.com/probonopd/uploadtool */ - char* github_token; - github_token = getenv("GITHUB_TOKEN"); - - /* Parse GitLab CI environment variables. - * https://docs.gitlab.com/ee/ci/variables/#predefined-variables-environment-variables - * echo "${CI_PROJECT_URL}/-/jobs/artifacts/${CI_COMMIT_REF_NAME}/raw/QtQuickApp-x86_64.AppImage?job=${CI_JOB_NAME}" - */ - char* CI_PROJECT_URL; - CI_PROJECT_URL = getenv("CI_PROJECT_URL"); - char* CI_COMMIT_REF_NAME; - CI_COMMIT_REF_NAME = getenv("CI_COMMIT_REF_NAME"); // The branch or tag name for which project is built - char* CI_JOB_NAME; - CI_JOB_NAME = getenv("CI_JOB_NAME"); // The name of the job as defined in .gitlab-ci.yml - - /* Parse OWD environment variable. - * If it is available then cd there. It is the original CWD prior to running AppRun */ - char* owd_env = NULL; - owd_env = getenv("OWD"); - if(NULL!=owd_env){ - int ret; - ret = chdir(owd_env); - if (ret != 0){ - fprintf(stderr, "Could not cd into %s\n", owd_env); - exit(1); - } - } - - GError *error = NULL; - GOptionContext *context; - - // initialize help text of argument - sprintf(_exclude_file_desc, "Uses given file as exclude file for mksquashfs, in addition to %s.", APPIMAGEIGNORE); - - context = g_option_context_new ("SOURCE [DESTINATION] - Generate, extract, and inspect AppImages"); - g_option_context_add_main_entries (context, entries, NULL); - // g_option_context_add_group (context, gtk_get_option_group (TRUE)); - if (!g_option_context_parse (context, &argc, &argv, &error)) - { - fprintf(stderr, "Option parsing failed: %s\n", error->message); - exit(1); - } - - fprintf( - stderr, - "appimagetool, %s (commit %s), build %s built on %s\n", - RELEASE_NAME, GIT_COMMIT, BUILD_NUMBER, BUILD_DATE - ); - - // always show version, but exit immediately if only the version number was requested - if (showVersionOnly) - exit(0); - - if(!((0 == strcmp(sqfs_comp, "gzip")) || (0 ==strcmp(sqfs_comp, "xz")))) - die("Only gzip (faster execution, larger files) and xz (slower execution, smaller files) compression is supported at the moment. Let us know if there are reasons for more, should be easy to add. You could help the project by doing some systematic size/performance measurements. Watch for size, execution speed, and zsync delta size."); - /* Check for dependencies here. Better fail early if they are not present. */ - if(! g_find_program_in_path ("file")) - die("file command is missing but required, please install it"); -#ifndef AUXILIARY_FILES_DESTINATION - if(! g_find_program_in_path ("mksquashfs")) - die("mksquashfs command is missing but required, please install it"); -#else - { - // build path relative to appimagetool binary - char *appimagetoolDirectory = dirname(realpath("/proc/self/exe", NULL)); - if (!appimagetoolDirectory) { - g_print("Could not access /proc/self/exe\n"); - exit(1); - } - - pathToMksquashfs = g_build_filename(appimagetoolDirectory, "..", AUXILIARY_FILES_DESTINATION, "mksquashfs", NULL); - - if (!g_file_test(pathToMksquashfs, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_EXECUTABLE)) { - g_printf("No such file or directory: %s\n", pathToMksquashfs); - g_free(pathToMksquashfs); - exit(1); - } - } -#endif - if(! g_find_program_in_path ("desktop-file-validate")) - die("desktop-file-validate command is missing, please install it"); - if(! g_find_program_in_path ("zsyncmake")) - g_print("WARNING: zsyncmake command is missing, please install it if you want to use binary delta updates\n"); - if(! no_appstream) - if(! g_find_program_in_path ("appstreamcli")) - g_print("WARNING: appstreamcli command is missing, please install it if you want to use AppStream metadata\n"); - if(! g_find_program_in_path ("gpg2") && ! g_find_program_in_path ("gpg")) - g_print("WARNING: gpg2 or gpg command is missing, please install it if you want to create digital signatures\n"); - if(! g_find_program_in_path ("sha256sum") && ! g_find_program_in_path ("shasum")) - g_print("WARNING: sha256sum or shasum command is missing, please install it if you want to create digital signatures\n"); - - if(!&remaining_args[0]) - die("SOURCE is missing"); - - /* If in list mode */ - if (list){ - sfs_ls(remaining_args[0]); - exit(0); - } - - /* If the first argument is a directory, then we assume that we should package it */ - if (g_file_test(remaining_args[0], G_FILE_TEST_IS_DIR)) { - /* Parse VERSION environment variable. - * We cannot use g_environ_getenv (g_get_environ() since it is too new for CentOS 6 - * Also, if VERSION is not set and -g is called and if git is on the path, use - * git rev-parse --short HEAD - * TODO: Might also want to somehow make use of - * git rev-parse --abbrev-ref HEAD - * git log -1 --format=%ci */ - gchar* version_env = getenv("VERSION"); - - if (guess_update_information) { - char* gitPath = g_find_program_in_path("git"); - - if (gitPath != NULL) { - if (version_env == NULL) { - GError* error = NULL; - gchar* out = NULL; - - char command_line[] = "git rev-parse --short HEAD"; - - // *not* the exit code! must be interpreted via g_spawn_check_exit_status! - int exit_status = -1; - - // g_spawn_command_line_sync returns whether the program succeeded - // its return value is buggy, hence we're using g_spawn_check_exit_status to check for errors - g_spawn_command_line_sync(command_line, &out, NULL, &exit_status, &error); - - // g_spawn_command_line_sync might have set error already, in that case we don't want to overwrite - if (error != NULL || !g_spawn_check_exit_status(exit_status, &error)) { - if (error == NULL) { - g_printerr("Failed to run 'git rev-parse --short HEAD, but failed to interpret GLib error state: %d\n", exit_status); - } else { - g_printerr("Failed to run 'git rev-parse --short HEAD: %s (code %d)\n", error->message, error->code); - } - } else { - version_env = g_strstrip(out); - - if (version_env != NULL) { - g_printerr("NOTE: Using the output of 'git rev-parse --short HEAD' as the version:\n"); - g_printerr(" %s\n", version_env); - g_printerr(" Please set the $VERSION environment variable if this is not intended\n"); - } - } - } - } - - free(gitPath); - } - - char *destination; - char source[PATH_MAX]; - realpath(remaining_args[0], source); - - /* Check if *.desktop file is present in source AppDir */ - gchar *desktop_file = find_first_matching_file_nonrecursive(source, "*.desktop"); - if(desktop_file == NULL){ - die("Desktop file not found, aborting"); - } - if(verbose) - fprintf (stdout, "Desktop file: %s\n", desktop_file); - - if(g_find_program_in_path ("desktop-file-validate")) { - if(validate_desktop_file(desktop_file) != 0){ - fprintf(stderr, "ERROR: Desktop file contains errors. Please fix them. Please see\n"); - fprintf(stderr, " https://standards.freedesktop.org/desktop-entry-spec/1.0/n"); - die(" for more information."); - } - } - - /* Read information from .desktop file */ - GKeyFile *kf = g_key_file_new (); - if (!g_key_file_load_from_file (kf, desktop_file, G_KEY_FILE_KEEP_TRANSLATIONS | G_KEY_FILE_KEEP_COMMENTS, NULL)) - die(".desktop file cannot be parsed"); - if (!get_desktop_entry(kf, "Categories")) - die(".desktop file is missing a Categories= key"); - - if(verbose){ - fprintf (stderr,"Name: %s\n", get_desktop_entry(kf, "Name")); - fprintf (stderr,"Icon: %s\n", get_desktop_entry(kf, "Icon")); - fprintf (stderr,"Exec: %s\n", get_desktop_entry(kf, "Exec")); - fprintf (stderr,"Comment: %s\n", get_desktop_entry(kf, "Comment")); - fprintf (stderr,"Type: %s\n", get_desktop_entry(kf, "Type")); - fprintf (stderr,"Categories: %s\n", get_desktop_entry(kf, "Categories")); - } - - /* Determine the architecture */ - bool archs[4] = {0, 0, 0, 0}; - extract_arch_from_text(getenv("ARCH"), "Environmental variable ARCH", archs); - if (count_archs(archs) != 1) { - /* If no $ARCH variable is set check a file */ - /* We use the next best .so that we can find to determine the architecture */ - find_arch(source, "*.so.*", archs); - int countArchs = count_archs(archs); - if (countArchs != 1) { - if (countArchs < 1) - fprintf(stderr, "Unable to guess the architecture of the AppDir source directory \"%s\"\n", remaining_args[0]); - else - fprintf(stderr, "More than one architectures were found of the AppDir source directory \"%s\"\n", remaining_args[0]); - fprintf(stderr, "A valid architecture with the ARCH environmental variable should be provided\ne.g. ARCH=x86_64 %s", argv[0]), - die(" ..."); - } - } - gchar* arch = getArchName(archs); - fprintf(stderr, "Using architecture %s\n", arch); - - char app_name_for_filename[PATH_MAX]; - sprintf(app_name_for_filename, "%s", get_desktop_entry(kf, "Name")); - replacestr(app_name_for_filename, " ", "_"); - - if(verbose) - fprintf (stderr,"App name for filename: %s\n", app_name_for_filename); - - if (remaining_args[1]) { - destination = remaining_args[1]; - } else { - /* No destination has been specified, to let's construct one - * TODO: Find out the architecture and use a $VERSION that might be around in the env */ - char dest_path[PATH_MAX]; - - // if $VERSION is specified, we embed it into the filename - if (version_env != NULL) { - sprintf(dest_path, "%s-%s-%s.AppImage", app_name_for_filename, version_env, arch); - } else { - sprintf(dest_path, "%s-%s.AppImage", app_name_for_filename, arch); - } - - destination = strdup(dest_path); - replacestr(destination, " ", "_"); - } - - // if $VERSION is specified, we embed its value into the desktop file - if (version_env != NULL) { - g_key_file_set_string(kf, G_KEY_FILE_DESKTOP_GROUP, "X-AppImage-Version", version_env); - - if (!g_key_file_save_to_file(kf, desktop_file, NULL)) { - fprintf(stderr, "Could not save modified desktop file\n"); - exit(1); - } - } - - fprintf (stdout, "%s should be packaged as %s\n", source, destination); - /* Check if the Icon file is how it is expected */ - gchar* icon_name = get_desktop_entry(kf, "Icon"); - gchar* icon_file_path = NULL; - gchar* icon_file_png; - gchar* icon_file_svg; - gchar* icon_file_xpm; - icon_file_png = g_strdup_printf("%s/%s.png", source, icon_name); - icon_file_svg = g_strdup_printf("%s/%s.svg", source, icon_name); - icon_file_xpm = g_strdup_printf("%s/%s.xpm", source, icon_name); - if (g_file_test(icon_file_png, G_FILE_TEST_IS_REGULAR)) { - icon_file_path = icon_file_png; - } else if(g_file_test(icon_file_svg, G_FILE_TEST_IS_REGULAR)) { - icon_file_path = icon_file_svg; - } else if(g_file_test(icon_file_xpm, G_FILE_TEST_IS_REGULAR)) { - icon_file_path = icon_file_xpm; - } else { - fprintf (stderr, "%s{.png,.svg,.xpm} defined in desktop file but not found\n", icon_name); - fprintf (stderr, "For example, you could put a 256x256 pixel png into\n"); - gchar *icon_name_with_png = g_strconcat(icon_name, ".png", NULL); - gchar *example_path = g_build_filename(source, "/", icon_name_with_png, NULL); - fprintf (stderr, "%s\n", example_path); - exit(1); - } - - /* Check if .DirIcon is present in source AppDir */ - gchar *diricon_path = g_build_filename(source, ".DirIcon", NULL); - - if (! g_file_test(diricon_path, G_FILE_TEST_EXISTS)){ - fprintf (stderr, "Deleting pre-existing .DirIcon\n"); - g_unlink(diricon_path); - } - if (! g_file_test(diricon_path, G_FILE_TEST_IS_REGULAR)){ - fprintf (stderr, "Creating .DirIcon symlink based on information from desktop file\n"); - int res = symlink(basename(icon_file_path), diricon_path); - if(res) - die("Could not symlink .DirIcon"); - } - - /* Check if AppStream upstream metadata is present in source AppDir */ - if(! no_appstream){ - char application_id[PATH_MAX]; - sprintf (application_id, "%s", basename(desktop_file)); - replacestr(application_id, ".desktop", ".appdata.xml"); - gchar *appdata_path = g_build_filename(source, "/usr/share/metainfo/", application_id, NULL); - if (! g_file_test(appdata_path, G_FILE_TEST_IS_REGULAR)){ - fprintf (stderr, "WARNING: AppStream upstream metadata is missing, please consider creating it\n"); - fprintf (stderr, " in usr/share/metainfo/%s\n", application_id); - fprintf (stderr, " Please see https://www.freedesktop.org/software/appstream/docs/chap-Quickstart.html#sect-Quickstart-DesktopApps\n"); - fprintf (stderr, " for more information or use the generator at http://output.jsbin.com/qoqukof.\n"); - } else { - fprintf (stderr, "AppStream upstream metadata found in usr/share/metainfo/%s\n", application_id); - /* Use ximion's appstreamcli to make sure that desktop file and appdata match together */ - if(g_find_program_in_path ("appstreamcli")) { - char *args[] = { - "appstreamcli", - "validate-tree", - source, - NULL - }; - g_print("Trying to validate AppStream information with the appstreamcli tool\n"); - g_print("In case of issues, please refer to https://github.com/ximion/appstream\n"); - int ret = run_external(g_find_program_in_path ("appstreamcli"), args); - if (ret != 0) - die("Failed to validate AppStream information with appstreamcli"); - } - /* It seems that hughsie's appstream-util does additional validations */ - if(g_find_program_in_path ("appstream-util")) { - char *args[] = { - "appstream-util", - "validate-relax", - appdata_path, - NULL - }; - g_print("Trying to validate AppStream information with the appstream-util tool\n"); - g_print("In case of issues, please refer to https://github.com/hughsie/appstream-glib\n"); - int ret = run_external(g_find_program_in_path ("appstream-util"), args); - if (ret != 0) - die("Failed to validate AppStream information with appstream-util"); - } - } - } - - /* Upstream mksquashfs can currently not start writing at an offset, - * so we need a patched one. https://github.com/plougher/squashfs-tools/pull/13 - * should hopefully change that. */ - - fprintf (stderr, "Generating squashfs...\n"); - int size = 0; - char* data = NULL; - bool using_external_data = false; - if (runtime_file != NULL) { - if (!readFile(runtime_file, &size, &data)) - die("Unable to load provided runtime file"); - using_external_data = true; - } else { -#ifdef HAVE_BINARY_RUNTIME - /* runtime is embedded into this executable - * http://stupefydeveloper.blogspot.de/2008/08/cc-embed-binary-data-into-elf.html */ - size = runtime_len; - data = runtime; -#else - die("No runtime file was provided"); -#endif - } - if (verbose) - printf("Size of the embedded runtime: %d bytes\n", size); - - int result = sfs_mksquashfs(source, destination, size); - if(result != 0) - die("sfs_mksquashfs error"); - - fprintf (stderr, "Embedding ELF...\n"); - FILE *fpdst = fopen(destination, "rb+"); - if (fpdst == NULL) { - die("Not able to open the AppImage for writing, aborting"); - } - - fseek(fpdst, 0, SEEK_SET); - fwrite(data, size, 1, fpdst); - fclose(fpdst); - if (using_external_data) - free(data); - - fprintf (stderr, "Marking the AppImage as executable...\n"); - if (chmod (destination, 0755) < 0) { - printf("Could not set executable bit, aborting\n"); - exit(1); - } - - if(bintray_user != NULL){ - if(bintray_repo != NULL){ - char buf[1024]; - sprintf(buf, "bintray-zsync|%s|%s|%s|%s-_latestVersion-%s.AppImage.zsync", bintray_user, bintray_repo, app_name_for_filename, app_name_for_filename, arch); - updateinformation = buf; - printf("%s\n", updateinformation); - } - } - - /* If the user has not provided update information but we know this is a Travis CI build, - * then fill in update information based on TRAVIS_REPO_SLUG */ - if(guess_update_information){ - if(travis_repo_slug){ - if(!github_token) { - printf("Will not guess update information since $GITHUB_TOKEN is missing,\n"); - if(0 != strcmp(travis_pull_request, "false")){ - printf("please set it in the Travis CI Repository Settings for this project.\n"); - printf("You can get one from https://github.com/settings/tokens\n"); - } else { - printf("which is expected since this is a pull request\n"); - } - } else { - gchar *zsyncmake_path = g_find_program_in_path ("zsyncmake"); - if(zsyncmake_path){ - char buf[1024]; - gchar **parts = g_strsplit (travis_repo_slug, "/", 2); - /* https://github.com/AppImage/AppImageSpec/blob/master/draft.md#github-releases - * gh-releases-zsync|probono|AppImages|latest|Subsurface*-x86_64.AppImage.zsync */ - gchar *channel = "continuous"; - if(travis_tag != NULL){ - if((strcmp(travis_tag, "") != 0) && (strcmp(travis_tag, "continuous") != 0)) { - channel = "latest"; - } - } - sprintf(buf, "gh-releases-zsync|%s|%s|%s|%s*-%s.AppImage.zsync", parts[0], parts[1], channel, app_name_for_filename, arch); - updateinformation = buf; - printf("Guessing update information based on $TRAVIS_TAG=%s and $TRAVIS_REPO_SLUG=%s\n", travis_tag, travis_repo_slug); - printf("%s\n", updateinformation); - } else { - printf("Will not guess update information since zsyncmake is missing\n"); - } - } - } else if(CI_COMMIT_REF_NAME){ - // ${CI_PROJECT_URL}/-/jobs/artifacts/${CI_COMMIT_REF_NAME}/raw/QtQuickApp-x86_64.AppImage?job=${CI_JOB_NAME} - gchar *zsyncmake_path = g_find_program_in_path ("zsyncmake"); - if(zsyncmake_path){ - char buf[1024]; - sprintf(buf, "zsync|%s/-/jobs/artifacts/%s/raw/%s-%s.AppImage.zsync?job=%s", CI_PROJECT_URL, CI_COMMIT_REF_NAME, app_name_for_filename, arch, CI_JOB_NAME); - updateinformation = buf; - printf("Guessing update information based on $CI_COMMIT_REF_NAME=%s and $CI_JOB_NAME=%s\n", CI_COMMIT_REF_NAME, CI_JOB_NAME); - printf("%s\n", updateinformation); - } else { - printf("Will not guess update information since zsyncmake is missing\n"); - } - } - } - - /* If updateinformation was provided, then we check and embed it */ - if(updateinformation != NULL){ - if(!g_str_has_prefix(updateinformation,"zsync|")) - if(!g_str_has_prefix(updateinformation,"bintray-zsync|")) - if(!g_str_has_prefix(updateinformation,"gh-releases-zsync|")) - if(!g_str_has_prefix(updateinformation,"pling-v1-zsync|")) - die("The provided updateinformation is not in a recognized format"); - - gchar **ui_type = g_strsplit_set(updateinformation, "|", -1); - - if(verbose) - printf("updateinformation type: %s\n", ui_type[0]); - /* TODO: Further checking of the updateinformation */ - - - unsigned long ui_offset = 0; - unsigned long ui_length = 0; - - bool rv = appimage_get_elf_section_offset_and_length(destination, ".upd_info", &ui_offset, &ui_length); - - if (!rv || ui_offset == 0 || ui_length == 0) { - die("Could not find section .upd_info in runtime"); - } - - if(verbose) { - printf("ui_offset: %lu\n", ui_offset); - printf("ui_length: %lu\n", ui_length); - } - if(ui_offset == 0) { - die("Could not determine offset for updateinformation"); - } else { - if(strlen(updateinformation)>ui_length) - die("updateinformation does not fit into segment, aborting"); - FILE *fpdst2 = fopen(destination, "r+"); - if (fpdst2 == NULL) - die("Not able to open the destination file for writing, aborting"); - fseek(fpdst2, ui_offset, SEEK_SET); - // fseek(fpdst2, ui_offset, SEEK_SET); - // fwrite(0x00, 1, 1024, fpdst); // FIXME: Segfaults; why? - // fseek(fpdst, ui_offset, SEEK_SET); - fwrite(updateinformation, strlen(updateinformation), 1, fpdst2); - fclose(fpdst2); - } - } - - // calculate and embed MD5 digest - { - fprintf(stderr, "Embedding MD5 digest\n"); - - unsigned long digest_md5_offset = 0; - unsigned long digest_md5_length = 0; - - bool rv = appimage_get_elf_section_offset_and_length(destination, ".digest_md5", &digest_md5_offset, &digest_md5_length); - - if (!rv || digest_md5_offset == 0 || digest_md5_length == 0) { - die("Could not find section .digest_md5 in runtime"); - } - - static const unsigned long section_size = 16; - - if (digest_md5_length < section_size) { - fprintf( - stderr, - ".digest_md5 section in runtime's ELF header is too small" - "(found %lu bytes, minimum required: %lu bytes)\n", - digest_md5_length, section_size - ); - exit(1); - } - - char digest_buffer[section_size]; - - if (!appimage_type2_digest_md5(destination, digest_buffer)) { - die("Failed to calculate MD5 digest"); - } - - FILE* destinationfp = fopen(destination, "r+"); - - if (destinationfp == NULL) { - die("Failed to open AppImage for updating"); - } - - if (fseek(destinationfp, digest_md5_offset, SEEK_SET) != 0) { - fclose(destinationfp); - die("Failed to embed MD5 digest: could not seek to section offset"); - } - - if (fwrite(digest_buffer, sizeof(char), section_size, destinationfp) != section_size) { - fclose(destinationfp); - die("Failed to embed MD5 digest: write failed"); - } - - fclose(destinationfp); - } - - if (sign) { - if (!sign_appimage(destination, sign_key, verbose)) { - if (getenv(FORCE_SIGN_ENV_VAR) != NULL) { - fprintf(stderr, "ERROR: signing failed, aborting\n"); - exit(1); - } else { - fprintf(stderr, "ERROR: signing failed, continuing\n"); - } - } - } - - /* If updateinformation was provided, then we also generate the zsync file (after having signed the AppImage) */ - if (updateinformation != NULL) { - gchar* zsyncmake_path = g_find_program_in_path("zsyncmake"); - if (!zsyncmake_path) { - fprintf(stderr, "zsyncmake is not installed/bundled, skipping\n"); - } else { - fprintf(stderr, "zsyncmake is available and updateinformation is provided, " - "hence generating zsync file\n"); - - const gchar* const zsyncmake_command[] = {zsyncmake_path, destination, "-u", basename(destination), NULL}; - - if (verbose) { - fprintf(stderr, "Running zsyncmake process: "); - for (gint j = 0; j < (sizeof(zsyncmake_command) / sizeof(char*) - 1); ++j) { - fprintf(stderr, "'%s' ", zsyncmake_command[j]); - } - fprintf(stderr, "\n"); - } - - GSubprocessFlags flags = G_SUBPROCESS_FLAGS_NONE; - - if (!verbose) { - flags = G_SUBPROCESS_FLAGS_STDERR_SILENCE | G_SUBPROCESS_FLAGS_STDOUT_SILENCE; - } - - GSubprocess* proc = g_subprocess_newv(zsyncmake_command, flags, &error); - - if (proc == NULL) { - fprintf(stderr, "ERROR: failed to create zsyncmake process: %s\n", error->message); - exit(1); - } - - if (!g_subprocess_wait_check(proc, NULL, &error)) { - fprintf(stderr, "ERROR: zsyncmake returned abnormal exit code: %s\n", error->message); - g_object_unref(proc); - exit(1); - } - - g_object_unref(proc); - } - } - - fprintf(stderr, "Success\n\n"); - fprintf(stderr, "Please consider submitting your AppImage to AppImageHub, the crowd-sourced\n"); - fprintf(stderr, "central directory of available AppImages, by opening a pull request\n"); - fprintf(stderr, "at https://github.com/AppImage/appimage.github.io\n"); - - return 0; - } else if (g_file_test(remaining_args[0], G_FILE_TEST_IS_REGULAR)) { - /* If the first argument is a regular file, then we assume that we should unpack it */ - fprintf(stdout, "%s is a file, assuming it is an AppImage and should be unpacked\n", remaining_args[0]); - die("To be implemented"); - return 1; - } else { - fprintf(stderr, "Error: no such file or directory: %s\n", remaining_args[0]); - return 1; - } - - // should never be reached - return 1; -} diff --git a/src/appimagetool_sign.c b/src/appimagetool_sign.c deleted file mode 100644 index 970c2b4c1..000000000 --- a/src/appimagetool_sign.c +++ /dev/null @@ -1,479 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "binreloc.h" -#include "appimage/appimage_shared.h" -#include "appimagetool_sign.h" - -// used to identify calls to the callback -static const char gpgme_hook[] = "appimagetool gpgme hook"; -static const char signature_elf_section[] = ".sha256_sig"; -static const char key_elf_section[] = ".sig_key"; - -char* get_passphrase_from_environment() { - return getenv("APPIMAGETOOL_SIGN_PASSPHRASE"); -} - -gpgme_error_t gpgme_passphrase_callback(void* hook, const char* uid_hint, const char* passphrase_info, int prev_was_valid, int fd) { - (void) passphrase_info; - (void) prev_was_valid; - - assert(hook == gpgme_hook); - - // passing the passphrase via the environment is at least better than using a CLI parameter - char* passphrase_from_env = get_passphrase_from_environment(); - - if (passphrase_from_env == NULL) { - fprintf(stderr, "[sign] no passphrase available from environment\n"); - return GPG_ERR_NO_PASSPHRASE; - } - - fprintf(stderr, "[sign] providing passphrase for key %s\n", uid_hint); - - gpgme_io_writen(fd, passphrase_from_env, strlen(passphrase_from_env)); - - // need to write a newline character according to the docs - // maybe this would have solved the hanging issues we had with gpg(2) as a subprocess when writing to stdin...? - gpgme_io_writen(fd, "\n", 1); - - return GPG_ERR_NO_ERROR; -} - -gpgme_error_t gpgme_status_callback(void* hook, const char* keyword, const char* args) { - assert(hook == gpgme_hook); - - fprintf(stderr, "[gpgme] %s: %s\n", keyword, args); - return GPG_ERR_NO_ERROR; -} - -// all of these are from gpg based libraries, and are used exclusively in the code below -// whenever there is an error in sign_appimage, we can free() up these resources -static gpgme_ctx_t gpgme_ctx = NULL; -static gpgme_data_t gpgme_appimage_file_data = NULL; -static gpgme_data_t gpgme_sig_data = NULL; -// we support just a single key at the moment -static gpgme_key_t gpgme_key = NULL; -static gpgme_data_t gpgme_key_data = NULL; - -// this little helper can be called wherever the resources above must be released -void release_resources() { - if (gpgme_appimage_file_data != NULL) { - gpgme_data_release(gpgme_appimage_file_data); - gpgme_appimage_file_data = NULL; - } - if (gpgme_sig_data != NULL) { - gpgme_data_release(gpgme_sig_data); - gpgme_sig_data = NULL; - } - if (gpgme_ctx != NULL) { - gpgme_release(gpgme_ctx); - gpgme_ctx = NULL; - } - if (gpgme_key != NULL) { - gpgme_key_release(gpgme_key); - gpgme_key = NULL; - } - if (gpgme_key_data != NULL) { - gpgme_data_release(gpgme_key_data); - gpgme_key_data = NULL; - } -} - -// it's possible to use a single macro to error-check both gpgme and gcrypt, since both originate from the gpg project -// the error types gcry_error_t and gpgme_error_t are both aliases for gpg_error_t -#define gpg_check_call(call_to_function) \ - { \ - gpg_error_t error = (call_to_function); \ - if (error != GPG_ERR_NO_ERROR) { \ - fprintf(stderr, "[sign] %s: call failed: %s\n", #call_to_function, gpgme_strerror(error)); \ - release_resources(); \ - return false; \ - } \ - } - -char* calculate_sha256_hex_digest(char* filename) { - // like gcrypt, gcrypt must be initialized - { - static const char gcrypt_minimum_required_version[] = "1.8.1"; - const char* gcrypt_version = gcry_check_version(gcrypt_minimum_required_version); - - if (gcrypt_version == NULL) { - fprintf(stderr, "[sign] could not initialize gcrypt (>= %s)\n", gcrypt_minimum_required_version); - release_resources(); - return NULL; - } else { - fprintf(stderr, "[sign] found gcrypt version %s\n", gcrypt_version); - } - } - - // algo is defined by the spec - static const int hash_algo = GCRY_MD_SHA256; - - // open file and feed data chunk wise to gcrypt - FILE* file = fopen(filename, "r"); - if (file == NULL) { - fprintf(stderr, "[sign] could not calculate digest: opening file %s failed", filename); - release_resources(); - return NULL; - } - - gcry_md_hd_t gcry_md_handle = NULL; - - gpg_check_call(gcry_md_open(&gcry_md_handle, hash_algo, 0)); - - // 4k chunks should work well enough - char read_buffer[4096 * sizeof(char)]; - - for (;;) { - size_t bytes_read = fread(read_buffer, sizeof(char), sizeof(read_buffer), file); - - // if we have an error, we can stop immediately - if (ferror(file) != 0) { - fprintf(stderr, "[sign] failed to read chunk for hashing from file %s\n", filename); - fclose(file); - gcry_md_close(gcry_md_handle); - return NULL; - } - - gcry_md_write(gcry_md_handle, read_buffer, bytes_read); - - // once we read all the data, we can stop - if (feof(file) != 0) { - break; - } - } - - // done, we can close the file - // since we do no longer have to worry about the file pointer, we can use gpg_check_call just fine below - if (fclose(file) != 0) { - fprintf(stderr, "[sign] failed to close hashed file %s\n", filename); - gcry_md_close(gcry_md_handle); - return NULL; - } - - gpg_check_call(gcry_md_final(gcry_md_handle)); - - // conveniently, we can ask gcrypt for the digest size - unsigned int digest_size = gcry_md_get_algo_dlen(hash_algo); - - // read raw digest (i.e., memory-readable, not hexlified like, e.g., sha256sum would return) - unsigned char* digest_in_ctx = gcry_md_read(gcry_md_handle, hash_algo); - - if (digest_in_ctx == NULL) { - fprintf(stderr, "[sign] gcry_md_read failed\n"); - gcry_md_close(gcry_md_handle); - return NULL; - } - - // create "human-readable" version for the output - // the method allocates a suitable string buffer - // needs to be done before releasing the handle since this destroys digest_in_ctx - char* out_buffer = appimage_hexlify((const char*) digest_in_ctx, digest_size); - - // release all resources and return the result to the caller - gcry_md_close(gcry_md_handle); - - return out_buffer; -} - -bool add_signers(const char* key_id) { - // if a key id is specified, we ask gpgme to use this key explicitly, otherwise we use the first key in gpgme's list - if (key_id != NULL) { - // we could use the list stuff below, but using gpgme_get_key is a lot easier... - gpg_check_call(gpgme_get_key(gpgme_ctx, key_id, &gpgme_key, true)); - } else { - // searching the "first available secret key" is a little complex in gpgme... - // since we are just looking for the first one, we don't need a loop at least - gpg_check_call(gpgme_op_keylist_start(gpgme_ctx, NULL, true)); - gpg_check_call(gpgme_op_keylist_next(gpgme_ctx, &gpgme_key)); - } - - fprintf(stderr, "[sign] using key with fingerprint %s, issuer name %s\n", gpgme_key->fpr, gpgme_key->uids->name); - gpg_check_call(gpgme_signers_add(gpgme_ctx, gpgme_key)); - - return true; -} - -bool embed_data_in_elf_section(const char* filename, const char* elf_section, gpgme_data_t data, bool verbose) { - // first up: find the ELF section in the AppImage file - unsigned long key_section_offset = 0; - unsigned long key_section_length = 0; - - if (verbose) { - fprintf(stderr, "[sign] embedding data in ELF section %s\n", elf_section); - } - - bool rv = appimage_get_elf_section_offset_and_length( - filename, - elf_section, - &key_section_offset, - &key_section_length - ); - - if (!rv || key_section_offset == 0 || key_section_length == 0) { - fprintf(stderr, "[sign] could not determine offset for signature\n"); - release_resources(); - return false; - } - - if (verbose) { - fprintf(stderr, "[sign] key_offset: %lu\n", key_section_offset); - fprintf(stderr, "[sign] key_length: %lu\n", key_section_length); - } - - // next, read the exported key's size from the data object - const off_t data_size = gpgme_data_seek(data, 0, SEEK_END); - if (data_size < 0) { - fprintf(stderr, "[sign] failed to detect size of signature\n"); - release_resources(); - return false; - } - - if (verbose) { - fprintf(stderr, "[sign] data size: %lu\n", data_size); - } - - // rewind so we can later read the data - if (gpgme_data_seek(data, 0, SEEK_SET) < 0) { - fprintf(stderr, "[sign] failed to rewind data object\n"); - release_resources(); - return false; - } - - if (data_size > key_section_length) { - fprintf(stderr, "[sign] cannot embed key in AppImage: size exceeds reserved ELF section size\n"); - release_resources(); - return false; - } - - // we need to read the signature into a custom buffer - char data_buffer[data_size]; - - size_t total_bytes_read = 0; - size_t bytes_read = 0; - - for (;;) { - bytes_read = gpgme_data_read(data, data_buffer, data_size); - - // EOF - if (bytes_read == 0) { - break; - } - - // error - if (bytes_read < 0) { - fprintf(stderr, "[sign] failed to read from data object\n"); - release_resources(); - return false; - } - - total_bytes_read += bytes_read; - } - - if (total_bytes_read != data_size) { - fprintf( - stderr, - "[sign] failed to read entire data from data object (%lu != %lu)\n", - total_bytes_read, - data_size - ); - release_resources(); - return false; - } - - FILE* destinationfp = fopen(filename, "r+"); - - if (destinationfp == NULL) { - fprintf(stderr, "[sign] failed to open the destination file for writing\n"); - release_resources(); - return false; - } - - if (fseek(destinationfp, (long) key_section_offset, SEEK_SET) < 0) { - fprintf(stderr, "[sign] fseek failed: %s\n", strerror(errno)); - release_resources(); - fclose(destinationfp); - return false; - } - - // write at once - if (fwrite(data_buffer, sizeof(char), data_size, destinationfp) != data_size) { - fprintf(stderr, "[sign] failed to write signature to AppImage file\n"); - release_resources(); - fclose(destinationfp); - return false; - } - - // done -> release file descriptor - if (fclose(destinationfp) != 0) { - fprintf(stderr, "[sign] failed to close file descriptor: %s\n", strerror(errno)); - release_resources(); - return false; - } - - return true; -} - -bool sign_appimage(char* appimage_filename, char* key_id, bool verbose) { - fprintf(stderr, "[sign] signing requested\n"); - - // like gcrypt, gpgme must be initialized - { - static const char gpgme_minimum_required_version[] = "1.10.0"; - const char* gpgme_version = gpgme_check_version(gpgme_minimum_required_version); - - if (gpgme_version == NULL) { - fprintf(stderr, "[sign] could not initialize gpgme (>= %s)\n", gpgme_minimum_required_version); - release_resources(); - return false; - } else { - fprintf(stderr, "[sign] found gpgme version %s\n", gpgme_version); - } - } - - // as per the spec, an SHA256 hash is signed and the signature is then embedded in the AppImage - char* hex_digest = calculate_sha256_hex_digest(appimage_filename); - if (hex_digest == NULL) { - release_resources(); - return false; - } - - fprintf(stderr, "[sign] calculated digest: %s\n", hex_digest); - - gpg_check_call(gpgme_new(&gpgme_ctx)); - - - // make sure we have a compatible agent around - { - gpgme_engine_info_t engine_info; - gpg_check_call(gpgme_get_engine_info(&engine_info)); - - while (engine_info && engine_info->protocol != gpgme_get_protocol(gpgme_ctx)) { - engine_info = engine_info->next; - } - - if (engine_info == NULL) { - fprintf( - stderr, - "[sign] could not detect gpg version for an unknown reason (engine name: %s)\n", - gpgme_get_protocol_name(engine_info->protocol) - ); - exit(1); - } - - fprintf( - stderr, - "[sign] using engine %s (found in %s), version %s, gpgme requires at least version %s\n", - gpgme_get_protocol_name(engine_info->protocol), - engine_info->file_name, - engine_info->version, - engine_info->req_version - ); - - // check whether the version is problematic - // we just need the first two items, and we assume the format will be something like "2.1*" - unsigned int major; - unsigned int minor; - if (sscanf(engine_info->version, "%u.%u", &major, &minor) == 2) { - if (major == 2) { - if (minor == 0) { - fprintf(stderr, "[sign] warning: loopback pinentry mode not supported with gpg 2.0.x, %s may not work\n", FORCE_SIGN_ENV_VAR); - } else if (minor == 1) { - fprintf(stderr, "[sign] warning: gpg 2.1.x detected, %s can only work with allow-loopback-entry set within the gpg-agent configuration\n", FORCE_SIGN_ENV_VAR); - } - } else { - fprintf(stderr, "[sign] error: unsupported engine version, aborting\n"); - exit(1); - } - } else { - fprintf(stderr, "[sign] warning: failed to validate gpg version, expect problems\n"); - } - } - - if (verbose) { - // this should significantly increase the amount of logging we see in the status callback - fprintf(stderr, "[sign] running in verbose mode, enabling full-status flag on gpgme context\n"); - gpg_check_call(gpgme_set_ctx_flag(gpgme_ctx, "full-status", "1")); - } - - // we want an ASCII armored signature of plain text (hex string) - gpgme_set_textmode(gpgme_ctx, true); - gpgme_set_armor(gpgme_ctx, true); - - // in case the user provides a passphrase in the environment, we have to set the pinentry mode to loopback, like with the CLI - if (get_passphrase_from_environment() != NULL) { - fprintf(stderr, "[sign] passphrase available from environment, setting pinentry mode to loopback\n"); - gpgme_set_pinentry_mode(gpgme_ctx, GPGME_PINENTRY_MODE_LOOPBACK); - gpgme_set_passphrase_cb(gpgme_ctx, gpgme_passphrase_callback, (void*) gpgme_hook); - } - - // implement some fancy logging with log prefixes and stuff - gpgme_set_status_cb(gpgme_ctx, gpgme_status_callback, (void*) gpgme_hook); - - if (!add_signers(key_id)) { - release_resources(); - return false; - } - - assert(gpgme_key != NULL); - - // we don't have to let gpgme copy the data since we can ensure the buffer remains valid the entire time - gpg_check_call(gpgme_data_new_from_mem(&gpgme_appimage_file_data, hex_digest, strlen(hex_digest), 0)); - - // we further need an out buffer to store the signature, we let gpgme handle the allocation - gpg_check_call(gpgme_data_new(&gpgme_sig_data)); - - // now, we can sign the data - gpg_check_call(gpgme_op_sign(gpgme_ctx, gpgme_appimage_file_data, gpgme_sig_data, GPGME_SIG_MODE_DETACH)); - - gpgme_sign_result_t sign_result = gpgme_op_sign_result(gpgme_ctx); - - if (sign_result == NULL) { - fprintf(stderr, "[sign] signing failed\n"); - release_resources(); - exit(1); - } - - // we expect exactly one signature - assert(sign_result->signatures->next == NULL); - - fprintf( - stderr, - "[sign] signed using pubkey algo %s, hash algo %s, key fingerprint %s\n", - gpgme_pubkey_algo_name(sign_result->signatures->pubkey_algo), - gpgme_hash_algo_name(sign_result->signatures->hash_algo), - sign_result->signatures->fpr - ); - - fprintf(stderr, "[sign] embedding signature in AppImage\n"); - if (!embed_data_in_elf_section(appimage_filename, signature_elf_section, gpgme_sig_data, verbose)) { - fprintf(stderr, "[sign] failed to embed signature in AppImage\n"); - release_resources(); - return false; - } - - // exporting the key to a gpgme data object is relatively easy - gpgme_data_new(&gpgme_key_data); - gpgme_key_t keys_to_export[] = {gpgme_key, NULL}; - gpg_check_call(gpgme_op_export_keys(gpgme_ctx, keys_to_export, 0, gpgme_key_data)); - - fprintf(stderr, "[sign] embedding key in AppImage\n"); - if (!embed_data_in_elf_section(appimage_filename, key_elf_section, gpgme_key_data, verbose)) { - fprintf(stderr, "[sign] failed to embed key in AppImage\n"); - release_resources(); - return false; - } - - release_resources(); - return true; -} - - diff --git a/src/appimagetool_sign.h b/src/appimagetool_sign.h deleted file mode 100644 index 6ecee684e..000000000 --- a/src/appimagetool_sign.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -static const char* const FORCE_SIGN_ENV_VAR = "APPIMAGETOOL_FORCE_SIGN"; - -bool sign_appimage(char* appimage_filename, char* key_id, bool verbose); diff --git a/src/appimagetoolnoglib.c b/src/appimagetoolnoglib.c deleted file mode 100644 index f900e76f6..000000000 --- a/src/appimagetoolnoglib.c +++ /dev/null @@ -1,307 +0,0 @@ -#include -#include - -#include -#include -#include "squashfuse.h" - -#include -#include - -#include "binreloc.h" -#ifndef NULL - #define NULL ((void *) 0) -#endif - -#include - -#include - -#include - -extern char runtime[]; -extern unsigned int runtime_len; - - -const char *argp_program_version = - "appimagetool 0.1"; - -const char *argp_program_bug_address = - ""; - -static char doc[] = - "appimagetool -- Generate, extract, and inspect AppImages"; - -/* This structure is used by main to communicate with parse_opt. */ -struct arguments -{ - char *args[2]; /* SOURCE and DESTINATION */ - int verbose; /* The -v flag */ - int list; /* The -l flag */ - char *dumpfile; /* Argument for -d */ -}; - - -static struct argp_option options[] = -{ - {"verbose", 'v', 0, 0, "Produce verbose output"}, - {"list", 'l', 0, 0, - "List files in SOURCE AppImage"}, - {"dump", 'd', "FILE", 0, - "Dump FILE from SOURCE AppImage to stdout"}, - {0} -}; - - -static error_t -parse_opt (int key, char *arg, struct argp_state *state) -{ - struct arguments *arguments = state->input; - - switch (key) - { - case 'v': - arguments->verbose = 1; - break; - case 'l': - arguments->list = 1; - break; - case 'd': - arguments->dumpfile = arg; - break; - case ARGP_KEY_ARG: - if (state->arg_num >= 3) - { - argp_usage(state); - } - arguments->args[state->arg_num] = arg; - break; - case ARGP_KEY_END: - if (state->arg_num < 1) - { - argp_usage (state); - } - break; - default: - return ARGP_ERR_UNKNOWN; - } - return 0; -} - - -static char args_doc[] = "SOURCE {DESTINATION}"; - - -static struct argp argp = {options, parse_opt, args_doc, doc}; - - -// ##################################################################### - - -static void die(const char *msg) { - fprintf(stderr, "%s\n", msg); - exit(1); -} - -int is_directory(const char *path) { - struct stat statbuf; - if (stat(path, &statbuf) != 0) - return 0; - return S_ISDIR(statbuf.st_mode); -} - -int is_regular_file(const char *path) -{ - struct stat path_stat; - stat(path, &path_stat); - return S_ISREG(path_stat.st_mode); -} - -/* Function that prints the contents of a squashfs file - * using libsquashfuse (#include "squashfuse.h") */ -int sfs_ls(char* image) { - sqfs_err err = SQFS_OK; - sqfs_traverse trv; - sqfs fs; - - if ((err = sqfs_open_image(&fs, image, 0))) - die("sqfs_open_image error"); - - if ((err = sqfs_traverse_open(&trv, &fs, sqfs_inode_root(&fs)))) - die("sqfs_traverse_open error"); - while (sqfs_traverse_next(&trv, &err)) { - if (!trv.dir_end) { - printf("%s\n", trv.path); - } - } - if (err) - die("sqfs_traverse_next error"); - sqfs_traverse_close(&trv); - - sqfs_fd_close(fs.fd); - return 0; -} - -/* Generate a squashfs filesystem using mksquashfs on the $PATH */ -int sfs_mksquashfs(char *source, char *destination) { - pid_t parent = getpid(); - pid_t pid = fork(); - - if (pid == -1) { - // error, failed to fork() - return(-1); - } else if (pid > 0) { - int status; - waitpid(pid, &status, 0); - } else { - // we are the child - execlp("mksquashfs", "mksquashfs", source, destination, "-root-owned", "-noappend", (char *)0); - perror("execlp"); // execvp() returns only on error - return(-1); // exec never returns - } - return(0); -} - -/* Generate a squashfs filesystem - * The following would work if we link to mksquashfs.o after we renamed - * main() to mksquashfs_main() in mksquashfs.c but we don't want to actually do - * this because squashfs-tools is not under a permissive license -int sfs_mksquashfs(char *source, char *destination) { - char *child_argv[5]; - child_argv[0] = NULL; - child_argv[1] = source; - child_argv[2] = destination; - child_argv[3] = "-root-owned"; - child_argv[4] = "-noappend"; - mksquashfs_main(5, child_argv); -} - */ - -// ##################################################################### - -int main (int argc, char **argv) -{ - - /* Initialize binreloc so that we always know where we live */ - BrInitError error; - if (br_init (&error) == 0) { - printf ("Warning: binreloc failed to initialize (error code %d)\n", error); - } - printf ("This tool is located at %s\n", br_find_exe_dir(NULL)); - - struct arguments arguments; - - /* Set argument defaults */ - arguments.list = 0; - arguments.verbose = 0; - arguments.dumpfile = NULL; - - /* Where the magic happens */ - argp_parse (&argp, argc, argv, 0, 0, &arguments); - - /* If in list mode */ - if (arguments.list){ - sfs_ls(arguments.args[0]); - exit(0); - } - - /* If in dumpfile mode */ - if (arguments.dumpfile){ - fprintf (stdout, "%s from the AppImage %s should be dumped to stdout\n", arguments.dumpfile, arguments.args[0]); - die("To be implemented"); - } - - /* Print argument values */ - if (arguments.verbose) - fprintf (stdout, "Original SOURCE = %s\nOriginal DESTINATION = %s\n", - arguments.args[0], - arguments.args[1]); - - /* If the first argument is a directory, then we assume that we should package it */ - if(is_directory(arguments.args[0])){ - char *destination; - char source[PATH_MAX]; - realpath(arguments.args[0], source); - if (arguments.args[1]) { - destination = arguments.args[1]; - } else { - /* No destination has been specified, to let's construct one - * TODO: Find out the architecture and use a $VERSION that might be around in the env */ - destination = basename(br_strcat(source, ".AppImage")); - fprintf (stdout, "DESTINATION not specified, so assuming %s\n", destination); - } - fprintf (stdout, "%s should be packaged as %s\n", arguments.args[0], destination); - - /* mksquashfs can currently not start writing at an offset, - * so we need a tempfile. https://github.com/plougher/squashfs-tools/pull/13 - * should hopefully change that. */ - char *tempfile; - fprintf (stderr, "Generating squashfs...\n"); - tempfile = br_strcat(destination, ".temp"); - int result = sfs_mksquashfs(source, tempfile); - if(result != 0) - die("sfs_mksquashfs error"); - - fprintf (stderr, "Generating AppImage...\n"); - FILE *fpsrc = fopen(tempfile, "rb"); - if (fpsrc == NULL) { - die("Not able to open the tempfile for reading, aborting"); - } - FILE *fpdst = fopen(destination, "w"); - if (fpdst == NULL) { - die("Not able to open the destination file for writing, aborting"); - } - - /* runtime is embedded into this executable - * http://stupefydeveloper.blogspot.de/2008/08/cc-embed-binary-data-into-elf.html */ - int size = runtime_len; - char *data = runtime; - if (arguments.verbose) - printf("Size of the embedded runtime: %d bytes\n", size); - /* Where to store updateinformation. Fixed offset preferred for easy manipulation - * after the fact. Proposal: 4 KB at the end of the 128 KB padding. - * Hence, offset 126976, max. 4096 bytes long. - * Possibly we might want to store additional information in the future. - * Assuming 4 blocks of 4096 bytes each. - */ - if(size > 128*1024-4*4096-2){ - die("Size of the embedded runtime is too large, aborting"); - } - // printf("%s", data); - fwrite(data, size, 1, fpdst); - - if(ftruncate(fileno(fpdst), 128*1024) != 0) { - die("Not able to write padding to destination file, aborting"); - } - - fseek (fpdst, 0, SEEK_END); - char byte; - - while (!feof(fpsrc)) - { - fread(&byte, sizeof(char), 1, fpsrc); - fwrite(&byte, sizeof(char), 1, fpdst); - } - - fclose(fpsrc); - fclose(fpdst); - - fprintf (stderr, "Marking the AppImage as executable...\n"); - if (chmod (destination, 0755) < 0) { - printf("Could not set executable bit, aborting\n"); - exit(1); - } - if(unlink(tempfile) != 0) { - die("Could not delete the tempfile, aborting"); - } - fprintf (stderr, "Success\n"); -} - - /* If the first argument is a regular file, then we assume that we should unpack it */ - if(is_regular_file(arguments.args[0])){ - fprintf (stdout, "%s is a file, assuming it is an AppImage and should be unpacked\n", arguments.args[0]); - die("To be implemented"); - } - - return 0; -} diff --git a/src/binreloc.c b/src/binreloc.c deleted file mode 100644 index c9b5db285..000000000 --- a/src/binreloc.c +++ /dev/null @@ -1,766 +0,0 @@ -/* - * BinReloc - a library for creating relocatable executables - * Written by: Hongli Lai - * http://autopackage.org/ - * - * This source code is public domain. You can relicense this code - * under whatever license you want. - * - * See http://autopackage.org/docs/binreloc/ for - * more information and how to use this. - */ - -#ifndef BINRELOC_C -#define BINRELOC_C - -#ifdef ENABLE_BINRELOC - #include - #include - #include -#endif /* ENABLE_BINRELOC */ -#include -#include -#include -#include -#include "binreloc.h" - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - - -/** @internal - * Find the canonical filename of the executable. Returns the filename - * (which must be freed) or NULL on error. If the parameter 'error' is - * not NULL, the error code will be stored there, if an error occured. - */ -static char * -_br_find_exe (BrInitError *error) -{ -#ifndef ENABLE_BINRELOC - if (error) - *error = BR_INIT_ERROR_DISABLED; - return NULL; -#else - char *path, *path2, *line, *result; - size_t buf_size; - ssize_t size; - struct stat stat_buf; - FILE *f; - - /* Read from /proc/self/exe (symlink) */ - if (sizeof (path) > SSIZE_MAX) - buf_size = SSIZE_MAX - 1; - else - buf_size = PATH_MAX - 1; - path = (char *) malloc (buf_size); - if (path == NULL) { - /* Cannot allocate memory. */ - if (error) - *error = BR_INIT_ERROR_NOMEM; - return NULL; - } - path2 = (char *) malloc (buf_size); - if (path2 == NULL) { - /* Cannot allocate memory. */ - if (error) - *error = BR_INIT_ERROR_NOMEM; - free (path); - return NULL; - } - - strncpy (path2, "/proc/self/exe", buf_size - 1); - - while (1) { - int i; - - size = readlink (path2, path, buf_size - 1); - if (size == -1) { - /* Error. */ - free (path2); - break; - } - - /* readlink() success. */ - path[size] = '\0'; - - /* Check whether the symlink's target is also a symlink. - * We want to get the final target. */ - i = stat (path, &stat_buf); - if (i == -1) { - /* Error. */ - free (path2); - break; - } - - /* stat() success. */ - if (!S_ISLNK (stat_buf.st_mode)) { - /* path is not a symlink. Done. */ - free (path2); - return path; - } - - /* path is a symlink. Continue loop and resolve this. */ - strncpy (path, path2, buf_size - 1); - } - - - /* readlink() or stat() failed; this can happen when the program is - * running in Valgrind 2.2. Read from /proc/self/maps as fallback. */ - - buf_size = PATH_MAX + 128; - line = (char *) realloc (path, buf_size); - if (line == NULL) { - /* Cannot allocate memory. */ - free (path); - if (error) - *error = BR_INIT_ERROR_NOMEM; - return NULL; - } - - f = fopen ("/proc/self/maps", "r"); - if (f == NULL) { - free (line); - if (error) - *error = BR_INIT_ERROR_OPEN_MAPS; - return NULL; - } - - /* The first entry should be the executable name. */ - result = fgets (line, (int) buf_size, f); - if (result == NULL) { - fclose (f); - free (line); - if (error) - *error = BR_INIT_ERROR_READ_MAPS; - return NULL; - } - - /* Get rid of newline character. */ - buf_size = strlen (line); - if (buf_size <= 0) { - /* Huh? An empty string? */ - fclose (f); - free (line); - if (error) - *error = BR_INIT_ERROR_INVALID_MAPS; - return NULL; - } - if (line[buf_size - 1] == 10) - line[buf_size - 1] = 0; - - /* Extract the filename; it is always an absolute path. */ - path = strchr (line, '/'); - - /* Sanity check. */ - if (strstr (line, " r-xp ") == NULL || path == NULL) { - fclose (f); - free (line); - if (error) - *error = BR_INIT_ERROR_INVALID_MAPS; - return NULL; - } - - path = strdup (path); - free (line); - fclose (f); - return path; -#endif /* ENABLE_BINRELOC */ -} - - -/** @internal - * Find the canonical filename of the executable which owns symbol. - * Returns a filename which must be freed, or NULL on error. - */ -static char * -_br_find_exe_for_symbol (const void *symbol, BrInitError *error) -{ -#ifndef ENABLE_BINRELOC - if (error) - *error = BR_INIT_ERROR_DISABLED; - return (char *) NULL; -#else - #define SIZE PATH_MAX + 100 - FILE *f; - size_t address_string_len; - char *address_string, line[SIZE], *found; - - if (symbol == NULL) - return (char *) NULL; - - f = fopen ("/proc/self/maps", "r"); - if (f == NULL) - return (char *) NULL; - - address_string_len = 4; - address_string = (char *) malloc (address_string_len); - found = (char *) NULL; - - while (!feof (f)) { - char *start_addr, *end_addr, *end_addr_end, *file; - void *start_addr_p, *end_addr_p; - size_t len; - - if (fgets (line, SIZE, f) == NULL) - break; - - /* Sanity check. */ - if (strstr (line, " r-xp ") == NULL || strchr (line, '/') == NULL) - continue; - - /* Parse line. */ - start_addr = line; - end_addr = strchr (line, '-'); - file = strchr (line, '/'); - - /* More sanity check. */ - if (!(file > end_addr && end_addr != NULL && end_addr[0] == '-')) - continue; - - end_addr[0] = '\0'; - end_addr++; - end_addr_end = strchr (end_addr, ' '); - if (end_addr_end == NULL) - continue; - - end_addr_end[0] = '\0'; - len = strlen (file); - if (len == 0) - continue; - if (file[len - 1] == '\n') - file[len - 1] = '\0'; - - /* Get rid of "(deleted)" from the filename. */ - len = strlen (file); - if (len > 10 && strcmp (file + len - 10, " (deleted)") == 0) - file[len - 10] = '\0'; - - /* I don't know whether this can happen but better safe than sorry. */ - len = strlen (start_addr); - if (len != strlen (end_addr)) - continue; - - - /* Transform the addresses into a string in the form of 0xdeadbeef, - * then transform that into a pointer. */ - if (address_string_len < len + 3) { - address_string_len = len + 3; - address_string = (char *) realloc (address_string, address_string_len); - } - - memcpy (address_string, "0x", 2); - memcpy (address_string + 2, start_addr, len); - address_string[2 + len] = '\0'; - sscanf (address_string, "%p", &start_addr_p); - - memcpy (address_string, "0x", 2); - memcpy (address_string + 2, end_addr, len); - address_string[2 + len] = '\0'; - sscanf (address_string, "%p", &end_addr_p); - - - if (symbol >= start_addr_p && symbol < end_addr_p) { - found = file; - break; - } - } - - free (address_string); - fclose (f); - - if (found == NULL) - return (char *) NULL; - else - return strdup (found); -#endif /* ENABLE_BINRELOC */ -} - - -#ifndef BINRELOC_RUNNING_DOXYGEN - #undef NULL - #define NULL ((void *) 0) /* typecasted as char* for C++ type safeness */ -#endif - -static char *exe = (char *) NULL; - - -/** Initialize the BinReloc library (for applications). - * - * This function must be called before using any other BinReloc functions. - * It attempts to locate the application's canonical filename. - * - * @note If you want to use BinReloc for a library, then you should call - * br_init_lib() instead. - * - * @param error If BinReloc failed to initialize, then the error code will - * be stored in this variable. Set to NULL if you want to - * ignore this. See #BrInitError for a list of error codes. - * - * @returns 1 on success, 0 if BinReloc failed to initialize. - */ -int -br_init (BrInitError *error) -{ - exe = _br_find_exe (error); - return exe != NULL; -} - - -/** Initialize the BinReloc library (for libraries). - * - * This function must be called before using any other BinReloc functions. - * It attempts to locate the calling library's canonical filename. - * - * @note The BinReloc source code MUST be included in your library, or this - * function won't work correctly. - * - * @param error If BinReloc failed to initialize, then the error code will - * be stored in this variable. Set to NULL if you want to - * ignore this. See #BrInitError for a list of error codes. - * - * @returns 1 on success, 0 if a filename cannot be found. - */ -int -br_init_lib (BrInitError *error) -{ - exe = _br_find_exe_for_symbol ((const void *) "", error); - return exe != NULL; -} - - -/** Find the canonical filename of the current application. - * - * @param default_exe A default filename which will be used as fallback. - * @returns A string containing the application's canonical filename, - * which must be freed when no longer necessary. If BinReloc is - * not initialized, or if br_init() failed, then a copy of - * default_exe will be returned. If default_exe is NULL, then - * NULL will be returned. - */ -char * -br_find_exe (const char *default_exe) -{ - if (exe == (char *) NULL) { - /* BinReloc is not initialized. */ - if (default_exe != (const char *) NULL) - return strdup (default_exe); - else - return (char *) NULL; - } - return strdup (exe); -} - - -/** Locate the directory in which the current application is installed. - * - * The prefix is generated by the following pseudo-code evaluation: - * \code - * dirname(exename) - * \endcode - * - * @param default_dir A default directory which will used as fallback. - * @return A string containing the directory, which must be freed when no - * longer necessary. If BinReloc is not initialized, or if the - * initialization function failed, then a copy of default_dir - * will be returned. If default_dir is NULL, then NULL will be - * returned. - */ -char * -br_find_exe_dir (const char *default_dir) -{ - if (exe == NULL) { - /* BinReloc not initialized. */ - if (default_dir != NULL) - return strdup (default_dir); - else - return NULL; - } - - return br_dirname (exe); -} - - -/** Locate the prefix in which the current application is installed. - * - * The prefix is generated by the following pseudo-code evaluation: - * \code - * dirname(dirname(exename)) - * \endcode - * - * @param default_prefix A default prefix which will used as fallback. - * @return A string containing the prefix, which must be freed when no - * longer necessary. If BinReloc is not initialized, or if - * the initialization function failed, then a copy of default_prefix - * will be returned. If default_prefix is NULL, then NULL will be returned. - */ -char * -br_find_prefix (const char *default_prefix) -{ - char *dir1, *dir2; - - if (exe == (char *) NULL) { - /* BinReloc not initialized. */ - if (default_prefix != (const char *) NULL) - return strdup (default_prefix); - else - return (char *) NULL; - } - - dir1 = br_dirname (exe); - dir2 = br_dirname (dir1); - free (dir1); - return dir2; -} - - -/** Locate the application's binary folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/bin" - * \endcode - * - * @param default_bin_dir A default path which will used as fallback. - * @return A string containing the bin folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if - * the initialization function failed, then a copy of default_bin_dir will - * be returned. If default_bin_dir is NULL, then NULL will be returned. - */ -char * -br_find_bin_dir (const char *default_bin_dir) -{ - char *prefix, *dir; - - prefix = br_find_prefix ((const char *) NULL); - if (prefix == (char *) NULL) { - /* BinReloc not initialized. */ - if (default_bin_dir != (const char *) NULL) - return strdup (default_bin_dir); - else - return (char *) NULL; - } - - dir = br_build_path (prefix, "bin"); - free (prefix); - return dir; -} - - -/** Locate the application's superuser binary folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/sbin" - * \endcode - * - * @param default_sbin_dir A default path which will used as fallback. - * @return A string containing the sbin folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the - * initialization function failed, then a copy of default_sbin_dir will - * be returned. If default_bin_dir is NULL, then NULL will be returned. - */ -char * -br_find_sbin_dir (const char *default_sbin_dir) -{ - char *prefix, *dir; - - prefix = br_find_prefix ((const char *) NULL); - if (prefix == (char *) NULL) { - /* BinReloc not initialized. */ - if (default_sbin_dir != (const char *) NULL) - return strdup (default_sbin_dir); - else - return (char *) NULL; - } - - dir = br_build_path (prefix, "sbin"); - free (prefix); - return dir; -} - - -/** Locate the application's data folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/share" - * \endcode - * - * @param default_data_dir A default path which will used as fallback. - * @return A string containing the data folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the - * initialization function failed, then a copy of default_data_dir - * will be returned. If default_data_dir is NULL, then NULL will be - * returned. - */ -char * -br_find_data_dir (const char *default_data_dir) -{ - char *prefix, *dir; - - prefix = br_find_prefix ((const char *) NULL); - if (prefix == (char *) NULL) { - /* BinReloc not initialized. */ - if (default_data_dir != (const char *) NULL) - return strdup (default_data_dir); - else - return (char *) NULL; - } - - dir = br_build_path (prefix, "share"); - free (prefix); - return dir; -} - - -/** Locate the application's localization folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/share/locale" - * \endcode - * - * @param default_locale_dir A default path which will used as fallback. - * @return A string containing the localization folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the - * initialization function failed, then a copy of default_locale_dir will be returned. - * If default_locale_dir is NULL, then NULL will be returned. - */ -char * -br_find_locale_dir (const char *default_locale_dir) -{ - char *data_dir, *dir; - - data_dir = br_find_data_dir ((const char *) NULL); - if (data_dir == (char *) NULL) { - /* BinReloc not initialized. */ - if (default_locale_dir != (const char *) NULL) - return strdup (default_locale_dir); - else - return (char *) NULL; - } - - dir = br_build_path (data_dir, "locale"); - free (data_dir); - return dir; -} - - -/** Locate the application's library folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/lib" - * \endcode - * - * @param default_lib_dir A default path which will used as fallback. - * @return A string containing the library folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the initialization - * function failed, then a copy of default_lib_dir will be returned. - * If default_lib_dir is NULL, then NULL will be returned. - */ -char * -br_find_lib_dir (const char *default_lib_dir) -{ - char *prefix, *dir; - - prefix = br_find_prefix ((const char *) NULL); - if (prefix == (char *) NULL) { - /* BinReloc not initialized. */ - if (default_lib_dir != (const char *) NULL) - return strdup (default_lib_dir); - else - return (char *) NULL; - } - - dir = br_build_path (prefix, "lib"); - free (prefix); - return dir; -} - - -/** Locate the application's libexec folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/libexec" - * \endcode - * - * @param default_libexec_dir A default path which will used as fallback. - * @return A string containing the libexec folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the initialization - * function failed, then a copy of default_libexec_dir will be returned. - * If default_libexec_dir is NULL, then NULL will be returned. - */ -char * -br_find_libexec_dir (const char *default_libexec_dir) -{ - char *prefix, *dir; - - prefix = br_find_prefix ((const char *) NULL); - if (prefix == (char *) NULL) { - /* BinReloc not initialized. */ - if (default_libexec_dir != (const char *) NULL) - return strdup (default_libexec_dir); - else - return (char *) NULL; - } - - dir = br_build_path (prefix, "libexec"); - free (prefix); - return dir; -} - - -/** Locate the application's configuration files folder. - * - * The path is generated by the following pseudo-code evaluation: - * \code - * prefix + "/etc" - * \endcode - * - * @param default_etc_dir A default path which will used as fallback. - * @return A string containing the etc folder's path, which must be freed when - * no longer necessary. If BinReloc is not initialized, or if the initialization - * function failed, then a copy of default_etc_dir will be returned. - * If default_etc_dir is NULL, then NULL will be returned. - */ -char * -br_find_etc_dir (const char *default_etc_dir) -{ - char *prefix, *dir; - - prefix = br_find_prefix ((const char *) NULL); - if (prefix == (char *) NULL) { - /* BinReloc not initialized. */ - if (default_etc_dir != (const char *) NULL) - return strdup (default_etc_dir); - else - return (char *) NULL; - } - - dir = br_build_path (prefix, "etc"); - free (prefix); - return dir; -} - - -/*********************** - * Utility functions - ***********************/ - -/** Concatenate str1 and str2 to a newly allocated string. - * - * @param str1 A string. - * @param str2 Another string. - * @returns A newly-allocated string. This string should be freed when no longer needed. - */ -char * -br_strcat (const char *str1, const char *str2) -{ - char *result; - size_t len1, len2; - - if (str1 == NULL) - str1 = ""; - if (str2 == NULL) - str2 = ""; - - len1 = strlen (str1); - len2 = strlen (str2); - - result = (char *) malloc (len1 + len2 + 1); - memcpy (result, str1, len1); - memcpy (result + len1, str2, len2); - result[len1 + len2] = '\0'; - - return result; -} - - -char * -br_build_path (const char *dir, const char *file) -{ - char *dir2, *result; - size_t len; - int must_free = 0; - - len = strlen (dir); - if (len > 0 && dir[len - 1] != '/') { - dir2 = br_strcat (dir, "/"); - must_free = 1; - } else - dir2 = (char *) dir; - - result = br_strcat (dir2, file); - if (must_free) - free (dir2); - return result; -} - - -/* Emulates glibc's strndup() */ -static char * -br_strndup (const char *str, size_t size) -{ - char *result = (char *) NULL; - size_t len; - - if (str == (const char *) NULL) - return (char *) NULL; - - len = strlen (str); - if (len == 0) - return strdup (""); - if (size > len) - size = len; - - result = (char *) malloc (len + 1); - memcpy (result, str, size); - result[size] = '\0'; - return result; -} - - -/** Extracts the directory component of a path. - * - * Similar to g_dirname() or the dirname commandline application. - * - * Example: - * \code - * br_dirname ("/usr/local/foobar"); --> Returns: "/usr/local" - * \endcode - * - * @param path A path. - * @returns A directory name. This string should be freed when no longer needed. - */ -char * -br_dirname (const char *path) -{ - char *end, *result; - - if (path == (const char *) NULL) - return (char *) NULL; - - end = strrchr (path, '/'); - if (end == (const char *) NULL) - return strdup ("."); - - while (end > path && *end == '/') - end--; - result = br_strndup (path, end - path + 1); - if (result[0] == 0) { - free (result); - return strdup ("/"); - } else - return result; -} - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* BINRELOC_C */ diff --git a/src/binreloc.h b/src/binreloc.h deleted file mode 100644 index 93b71040f..000000000 --- a/src/binreloc.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * BinReloc - a library for creating relocatable executables - * Written by: Hongli Lai - * http://autopackage.org/ - * - * This source code is public domain. You can relicense this code - * under whatever license you want. - * - * See http://autopackage.org/docs/binreloc/ for - * more information and how to use this. - */ - -#ifndef BINRELOC_H -#define BINRELOC_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - -/** These error codes can be returned by br_init(), br_init_lib(), gbr_init() or gbr_init_lib(). */ -typedef enum { - /** Cannot allocate memory. */ - BR_INIT_ERROR_NOMEM, - /** Unable to open /proc/self/maps; see errno for details. */ - BR_INIT_ERROR_OPEN_MAPS, - /** Unable to read from /proc/self/maps; see errno for details. */ - BR_INIT_ERROR_READ_MAPS, - /** The file format of /proc/self/maps is invalid; kernel bug? */ - BR_INIT_ERROR_INVALID_MAPS, - /** BinReloc is disabled (the ENABLE_BINRELOC macro is not defined). */ - BR_INIT_ERROR_DISABLED -} BrInitError; - - -#ifndef BINRELOC_RUNNING_DOXYGEN -/* Mangle symbol names to avoid symbol collisions with other ELF objects. */ - #define br_init dJyi14798182285183_br_init - #define br_init_lib dJyi14798182285183_br_init_lib - #define br_find_exe dJyi14798182285183_br_find_exe - #define br_find_exe_dir dJyi14798182285183_br_find_exe_dir - #define br_find_prefix dJyi14798182285183_br_find_prefix - #define br_find_bin_dir dJyi14798182285183_br_find_bin_dir - #define br_find_sbin_dir dJyi14798182285183_br_find_sbin_dir - #define br_find_data_dir dJyi14798182285183_br_find_data_dir - #define br_find_locale_dir dJyi14798182285183_br_find_locale_dir - #define br_find_lib_dir dJyi14798182285183_br_find_lib_dir - #define br_find_libexec_dir dJyi14798182285183_br_find_libexec_dir - #define br_find_etc_dir dJyi14798182285183_br_find_etc_dir - #define br_strcat dJyi14798182285183_br_strcat - #define br_build_path dJyi14798182285183_br_build_path - #define br_dirname dJyi14798182285183_br_dirname - - -#endif -int br_init (BrInitError *error); -int br_init_lib (BrInitError *error); - -char *br_find_exe (const char *default_exe); -char *br_find_exe_dir (const char *default_dir); -char *br_find_prefix (const char *default_prefix); -char *br_find_bin_dir (const char *default_bin_dir); -char *br_find_sbin_dir (const char *default_sbin_dir); -char *br_find_data_dir (const char *default_data_dir); -char *br_find_locale_dir (const char *default_locale_dir); -char *br_find_lib_dir (const char *default_lib_dir); -char *br_find_libexec_dir (const char *default_libexec_dir); -char *br_find_etc_dir (const char *default_etc_dir); - -/* Utility functions */ -char *br_strcat (const char *str1, const char *str2); -char *br_build_path (const char *dir, const char *file); -char *br_dirname (const char *path); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* BINRELOC_H */ diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake deleted file mode 100644 index dc9717506..000000000 --- a/src/build-runtime.cmake +++ /dev/null @@ -1,148 +0,0 @@ -set(APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE OFF CACHE BOOL "Useful for $TARGET_APPIMAGE; see issue #763") - -# if set to anything but ON, the magic bytes won't be embedded -# CAUTION: the magic bytes are a hard requirement for type 2 AppImages! This option should NEVER be used unless you are -# 100% sure what you are doing here! -set(APPIMAGEKIT_EMBED_MAGIC_BYTES ON CACHE BOOL "") -# mark as advanced so it won't show up in CMake GUIs etc., to prevent users from accidentally using this option -mark_as_advanced(APPIMAGEKIT_EMBED_MAGIC_BYTES) - -# check type of current build -string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE_UPPER) -if (BUILD_TYPE_UPPER STREQUAL DEBUG) - set(BUILD_DEBUG TRUE) -else() - set(BUILD_DEBUG FALSE) -endif() - -if (NOT TARGET libsquashfuse) - message(FATAL_ERROR "TARGET NOT found libsquashfuse") -else() - get_target_property(squashfuse_INCLUDE_DIRS libsquashfuse INTERFACE_INCLUDE_DIRECTORIES) -endif() - -# must not include -flto in the following flags, otherwise the data sections will be stripped out -set(runtime_cflags - -std=c99 -ffunction-sections -fdata-sections - -DGIT_COMMIT=\\"${GIT_COMMIT}\\" - -I${squashfuse_INCLUDE_DIRS} - -I${PROJECT_SOURCE_DIR}/include - -I${PROJECT_SOURCE_DIR}/lib/libappimage/include - -I${PROJECT_SOURCE_DIR}/lib/libappimage/src/libappimage_hashlib/include - ${DEPENDENCIES_CFLAGS} -) -# must not include -Wl,--gc-sections in the following flags, otherwise the data sections will be stripped out -set(runtime_ldflags -s -ffunction-sections -fdata-sections -flto ${DEPENDENCIES_LDFLAGS}) - -if(BUILD_DEBUG) - message(WARNING "Debug build, adding debug information") - set(runtime_cflags -g ${runtime_cflags}) -else() - message(STATUS "Release build, optimizing runtime") - set(runtime_cflags -Os ${runtime_cflags}) -endif() - -if(NOT xz_INCLUDE_DIRS STREQUAL "") - list(APPEND runtime_cflags -I${xz_INCLUDE_DIRS}) -endif() - -if(APPIMAGEKIT_RUNTIME_ENABLE_SETPROCTITLE) - set(runtime_cflags ${runtime_cflags} -DENABLE_SETPROCTITLE) -endif() - -# objcopy requires actual files for creating new sections to populate the new section -# therefore, we generate 3 suitable files containing blank bytes in the right sizes -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/16_blank_bytes - COMMAND dd if=/dev/zero bs=1 count=16 of=${CMAKE_CURRENT_BINARY_DIR}/16_blank_bytes -) -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes - COMMAND dd if=/dev/zero bs=1 count=1024 of=${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes -) -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/8192_blank_bytes - COMMAND dd if=/dev/zero bs=1 count=8192 of=${CMAKE_CURRENT_BINARY_DIR}/8192_blank_bytes -) - -# compile first raw object (not linked yet) into which the sections will be embedded -# TODO: find out how this .o object can be generated using a normal add_executable call -# that'd allow us to get rid of the -I parameters in runtime_cflags -add_custom_command( - MAIN_DEPENDENCY runtime.c - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.0.o - COMMAND ${CMAKE_C_COMPILER} ${runtime_cflags} -c ${CMAKE_CURRENT_SOURCE_DIR}/runtime.c -o runtime.0.o - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} -) - -# embed the sections, one by one -# TODO: find out whether all the sections can be embedded in a single objcopy call -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.1.o - COMMAND ${OBJCOPY} --add-section .digest_md5=16_blank_bytes --set-section-flags .digest_md5=noload,readonly runtime.0.o runtime.1.o - MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/runtime.0.o - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/16_blank_bytes - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} -) -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.2.o - COMMAND ${OBJCOPY} --add-section .upd_info=1024_blank_bytes --set-section-flags .upd_info=noload,readonly runtime.1.o runtime.2.o - MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/runtime.1.o - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} -) -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.3.o - COMMAND ${OBJCOPY} --add-section .sha256_sig=1024_blank_bytes --set-section-flags .sha256_sig=noload,readonly runtime.2.o runtime.3.o - MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/runtime.2.o - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} -) -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o - COMMAND ${OBJCOPY} --add-section .sig_key=8192_blank_bytes --set-section-flags .sig_key=noload,readonly runtime.3.o runtime.4.o - MAIN_DEPENDENCY ${CMAKE_CURRENT_BINARY_DIR}/runtime.3.o - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/8192_blank_bytes - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} -) - -# add the runtime as a normal executable -# CLion will recognize it as a normal executable, one can simply step into the code -add_executable(runtime ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o notify.c) -# CMake gets confused by the .o object, therefore we need to tell it that it shall link everything using the C compiler -set_property(TARGET runtime PROPERTY LINKER_LANGUAGE C) -target_link_libraries(runtime PRIVATE libsquashfuse dl xz libzlib pthread libappimage_shared libappimage_hashlib) -if(COMMAND target_link_options) - target_link_options(runtime PRIVATE ${runtime_ldflags}) -else() - message(WARNING "CMake version < 3.13, falling back to using target_link_libraries instead of target_link_options") - target_link_libraries(runtime PRIVATE ${runtime_ldflags}) -endif() -target_include_directories(runtime PRIVATE ${PROJECT_SOURCE_DIR}/include) - -if(BUILD_DEBUG) - message(WARNING "Debug build, not stripping runtime to allow debugging using gdb etc.") -else() - add_custom_command( - TARGET runtime - POST_BUILD - COMMAND ${STRIP} ${CMAKE_CURRENT_BINARY_DIR}/runtime - ) -endif() - -# embed the magic bytes after the runtime's build has finished -if(APPIMAGEKIT_EMBED_MAGIC_BYTES) - add_custom_command( - TARGET runtime - POST_BUILD - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/embed-magic-bytes-in-file.sh ${CMAKE_CURRENT_BINARY_DIR}/runtime - ) -endif() - -# required for embedding in appimagetool -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/runtime_embed.o - COMMAND ${XXD} -i runtime | ${CMAKE_C_COMPILER} -c -x c - -o runtime_embed.o - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - MAIN_DEPENDENCY runtime -) diff --git a/src/digest.c b/src/digest.c deleted file mode 100644 index fb6da7cd2..000000000 --- a/src/digest.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - cc -o digest getsection.c digest.c -lssl -lcrypto -*/ - -#include -#include -#include -#include -#include -#include -#include - -#include "appimage/appimage_shared.h" - -typedef unsigned char byte; - -char segment_name[] = ".sha256_sig"; - -int sha256_file(char *path, char outputBuffer[65], int skip_offset, int skip_length) -{ - FILE *file = fopen(path, "rb"); - if(!file) return(1); - byte hash[SHA256_DIGEST_LENGTH]; - SHA256_CTX sha256; - SHA256_Init(&sha256); - const int bufSize = 1024*1024; - byte *buffer = malloc(bufSize); - int bytesRead = 0; - if(!buffer) { - fclose(file); - return ENOMEM; - } - - int totalBytesRead = 0; - if(skip_offset <= bufSize){ - bytesRead = fread(buffer, 1, skip_offset, file); - totalBytesRead += bytesRead; - // printf("totalBytesRead: %i\n", totalBytesRead); - // printf("bytesRead: %i\n", bytesRead); - SHA256_Update(&sha256, buffer, bytesRead); - } else { - int stillToRead = skip_offset-bytesRead; - // printf("Initial stillToRead: %i\n", stillToRead); - int readThisTime; - - if(stillToRead>bufSize){ - readThisTime = bufSize; - } else { - readThisTime = stillToRead; - } - while((bytesRead = fread(buffer, 1, readThisTime, file))) - { - totalBytesRead += bytesRead; - // printf("totalBytesRead: %i\n", totalBytesRead); - // printf("readThisTime: %i\n", readThisTime); - // printf("bytesRead: %i\n", bytesRead); - SHA256_Update(&sha256, buffer, bytesRead); - stillToRead = skip_offset-totalBytesRead; - // printf("stillToRead: %i\n", stillToRead); - - if(stillToRead>bufSize){ - readThisTime = bufSize; - } else { - readThisTime = stillToRead; - } - } - } - - fseek(file, skip_offset+skip_length, SEEK_SET); - - /* Instead of the skipped area, calculate the sha256 of the same amount if 0x00s */ - int i = 0; - for(i = 0; i < skip_length; i++) { - SHA256_Update(&sha256, "\0", 1); - totalBytesRead += 1; - } - - while((bytesRead = fread(buffer, 1, bufSize, file))) - { - totalBytesRead += bytesRead; - // printf("totalBytesRead: %i\n", totalBytesRead); - // printf("bytesRead: %i\n", bytesRead); - SHA256_Update(&sha256, buffer, bytesRead); - } - SHA256_Final(hash, &sha256); - - // fprintf(stderr, "totalBytesRead: %i\n", totalBytesRead); - - for(i = 0; i < SHA256_DIGEST_LENGTH; i++) - { - sprintf(outputBuffer + (i * 2), "%02x", hash[i]); - } - outputBuffer[64] = 0; - - fclose(file); - free(buffer); - - return 0; -} - -int main(int argc,char **argv) -{ - int res = 0; - - if(argc < 2){ - fprintf(stderr, "Usage: %s file offset length\n", argv[0]); - fprintf(stderr, "If no offset and length are provided, the ELF section '%s' is skipped\n\n", segment_name); - fprintf(stderr, "Calculate a sha256 of a file except a skipped area from offset to offset+length bytes\n"); - fprintf(stderr, "which is replaced with 0x00 during checksum calculation.\n"); - fprintf(stderr, "This is useful when a signature is placed in the skipped area.\n"); - exit(1); - } - - unsigned long skip_offset = 0; - unsigned long skip_length = 0; - char *filename = argv[1]; - - struct stat st; - if (stat(filename, &st) < 0) { - fprintf(stderr, "not existing file: %s\n", filename); - exit(1); - } - - if(argc < 4){ - appimage_get_elf_section_offset_and_length(filename, ".sha256_sig", &skip_offset, &skip_length); - if(skip_length > 0) - fprintf(stderr, "Skipping ELF section %s with offset %lu, length %lu\n", segment_name, skip_offset, skip_length); - } else if(argc == 4) { - skip_offset = atoi(argv[2]); - skip_length = atoi(argv[3]); - } else { - exit(1); - } - - int size = st.st_size; - if(size < skip_offset+skip_length){ - fprintf(stderr, "offset+length cannot be less than the file size\n"); - exit(1); - } - - static char buffer[65]; - res = sha256_file(filename, buffer, skip_offset, skip_length); - printf("%s\n", buffer); - return res; -} diff --git a/src/digest_md5.c b/src/digest_md5.c deleted file mode 100644 index 5285f20b5..000000000 --- a/src/digest_md5.c +++ /dev/null @@ -1,98 +0,0 @@ -#include -#include -#include - -#include "appimage/appimage_shared.h" -#include "getsection.h" - - -bool compare_byte_buffers(const char* buf1, const char* buf2, size_t num_bytes) { - for (size_t i = 0; i < num_bytes; i++) { - if (buf1[i] != buf2[i]) { - return false; - } - } - - return true; -} - - -int main(int argc, char* argv[]) { - if (argc != 2) { - printf("Usage: %s \n", argv[0]); - printf("\n"); - printf("Calculate AppImage MD5 digest, and compare it to embedded value (if available)\n"); - } - - const char* fname = argv[1]; - if (!g_file_test(fname, G_FILE_TEST_IS_REGULAR)) { - fprintf(stderr, "No such file or directory: %s\n", fname); - return 1; - } - - static const int digest_size = 16; - - // first, calculate MD5 digest using algorithm in libappimage - char expected_digest[digest_size]; - - if (!appimage_type2_digest_md5(fname, expected_digest)) { - fprintf(stderr, "Could not calculate MD5 digest\n"); - return 1; - } - - // print hex encoded digest - char* hexlified_expected_digest = appimage_hexlify(expected_digest, digest_size); - printf("calculated: %s\n", hexlified_expected_digest); - free(hexlified_expected_digest); - - unsigned long offset = 0, length = 0; - - static const char section_name[] = ".digest_md5"; - - if (!appimage_get_elf_section_offset_and_length(fname, section_name, &offset, &length) || offset == 0 || length == 0) { - fprintf(stderr, "Could not find %s section in file\n", section_name); - return 1; - } - - if (length < digest_size) { - fprintf(stderr, - "Invalid section length for section %s: expected %d bytes, found %lu bytes\n", - section_name, digest_size, length - ); - return 1; - } - - char embedded_digest[digest_size]; - FILE* fp = fopen(fname, "r"); - - if (fp == NULL) { - fprintf(stderr, "Failed to open AppImage for writing"); - return 1; - } - - if (fseek(fp, offset, SEEK_SET) != 0) { - fprintf(stderr, "Failed to read embedded digest: failed to seek to offset\n"); - fclose(fp); - return 1; - } - - if (fread(embedded_digest, sizeof(char), digest_size, fp) != digest_size) { - fprintf(stderr, "Failed to read embedded digest: read invalid amount of bytes from file\n"); - fclose(fp); - return 1; - } - - fclose(fp); - - char* hexlified_embedded_digest = appimage_hexlify(embedded_digest, digest_size); - printf(" embedded: %s\n", hexlified_embedded_digest); - free(hexlified_embedded_digest); - - if (compare_byte_buffers(expected_digest, embedded_digest, digest_size)) { - printf("Digests match\n"); - return 0; - } else { - printf("Digests don't match!"); - return 1; - } -} diff --git a/src/embed-magic-bytes-in-file.sh b/src/embed-magic-bytes-in-file.sh deleted file mode 100755 index 23a8a97a4..000000000 --- a/src/embed-magic-bytes-in-file.sh +++ /dev/null @@ -1,8 +0,0 @@ -#! /bin/bash - -if [ "$1" == "" ]; then - echo "Usage: bash $0 " - exit 2 -fi - -echo -ne 'AI\x02' | dd of="$1" bs=1 count=3 seek=8 conv=notrunc diff --git a/src/light_elf.h b/src/light_elf.h deleted file mode 100644 index f13b9817b..000000000 --- a/src/light_elf.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * - * Linux kernel - * Copyright (C) 2017 Linus Torvalds - * Modified work Copyright (C) 2017 @teras (https://github.com/teras) - * (Shortened version -- original work found here: - * https://github.com/torvalds/linux/blob/master/include/uapi/linux/elf.h) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef LIGHT_ELF_H -#define LIGHT_ELF_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef uint16_t Elf32_Half; -typedef uint16_t Elf64_Half; -typedef uint32_t Elf32_Word; -typedef uint32_t Elf64_Word; -typedef uint64_t Elf64_Xword; -typedef uint32_t Elf32_Addr; -typedef uint64_t Elf64_Addr; -typedef uint32_t Elf32_Off; -typedef uint64_t Elf64_Off; - -#define EI_NIDENT 16 - -typedef struct elf32_hdr { - unsigned char e_ident[EI_NIDENT]; - Elf32_Half e_type; - Elf32_Half e_machine; - Elf32_Word e_version; - Elf32_Addr e_entry; /* Entry point */ - Elf32_Off e_phoff; - Elf32_Off e_shoff; - Elf32_Word e_flags; - Elf32_Half e_ehsize; - Elf32_Half e_phentsize; - Elf32_Half e_phnum; - Elf32_Half e_shentsize; - Elf32_Half e_shnum; - Elf32_Half e_shstrndx; -} Elf32_Ehdr; - -typedef struct elf64_hdr { - unsigned char e_ident[EI_NIDENT]; /* ELF "magic number" */ - Elf64_Half e_type; - Elf64_Half e_machine; - Elf64_Word e_version; - Elf64_Addr e_entry; /* Entry point virtual address */ - Elf64_Off e_phoff; /* Program header table file offset */ - Elf64_Off e_shoff; /* Section header table file offset */ - Elf64_Word e_flags; - Elf64_Half e_ehsize; - Elf64_Half e_phentsize; - Elf64_Half e_phnum; - Elf64_Half e_shentsize; - Elf64_Half e_shnum; - Elf64_Half e_shstrndx; -} Elf64_Ehdr; - -typedef struct elf32_shdr { - Elf32_Word sh_name; - Elf32_Word sh_type; - Elf32_Word sh_flags; - Elf32_Addr sh_addr; - Elf32_Off sh_offset; - Elf32_Word sh_size; - Elf32_Word sh_link; - Elf32_Word sh_info; - Elf32_Word sh_addralign; - Elf32_Word sh_entsize; -} Elf32_Shdr; - -typedef struct elf64_shdr { - Elf64_Word sh_name; /* Section name, index in string tbl */ - Elf64_Word sh_type; /* Type of section */ - Elf64_Xword sh_flags; /* Miscellaneous section attributes */ - Elf64_Addr sh_addr; /* Section virtual addr at execution */ - Elf64_Off sh_offset; /* Section file offset */ - Elf64_Xword sh_size; /* Size of section in bytes */ - Elf64_Word sh_link; /* Index of another section */ - Elf64_Word sh_info; /* Additional section information */ - Elf64_Xword sh_addralign; /* Section alignment */ - Elf64_Xword sh_entsize; /* Entry size if section holds table */ -} Elf64_Shdr; - -/* Note header in a PT_NOTE section */ -typedef struct elf32_note { - Elf32_Word n_namesz; /* Name size */ - Elf32_Word n_descsz; /* Content size */ - Elf32_Word n_type; /* Content type */ -} Elf32_Nhdr; - -#define ELFCLASS32 1 -#define ELFDATA2LSB 1 -#define ELFDATA2MSB 2 -#define ELFCLASS64 2 -#define EI_CLASS 4 -#define EI_DATA 5 - -#ifdef __cplusplus -} -#endif - -#endif /* elf.h */ diff --git a/src/notify.c b/src/notify.c deleted file mode 100644 index ca51e04d4..000000000 --- a/src/notify.c +++ /dev/null @@ -1,91 +0,0 @@ -#include -#include -#include -#include - -/* Try to show a notification on the GUI, fall back to the command line - * timeout is the timeout in milliseconds. timeout = NULL seems to trigger a - * GUI error dialog rather than a notification */ -int notify(char *title, char *body, int timeout) -{ - /* http://stackoverflow.com/questions/13204177/how-to-find-out-if-running-from-terminal-or-gui */ - if (isatty(fileno(stdin))){ - /* We were launched from the command line. */ - printf("\n%s\n", title); - printf("%s\n", body); - } - else - { - /* We were launched from inside the desktop */ - printf("\n%s\n", title); - printf("%s\n", body); - /* https://debian-administration.org/article/407/Creating_desktop_notifications */ - void *handle, *n; - typedef void (*notify_init_t)(char *); - typedef void *(*notify_notification_new_t)( char *, char *, char *, char *); - typedef void (*notify_notification_set_timeout_t)( void *, int ); - typedef void (*notify_notification_show_t)(void *, char *); - handle = NULL; - if(handle == NULL) - handle= dlopen("libnotify.so.3", RTLD_LAZY); - if(handle == NULL) - handle= dlopen("libnotify.so.4", RTLD_LAZY); - if(handle == NULL) - handle= dlopen("libnotify.so.5", RTLD_LAZY); - if(handle == NULL) - handle= dlopen("libnotify.so.6", RTLD_LAZY); - if(handle == NULL) - handle= dlopen("libnotify.so.7", RTLD_LAZY); - if(handle == NULL) - handle= dlopen("libnotify.so.8", RTLD_LAZY); - - if(handle == NULL) - { - printf("Failed to open libnotify.\n\n" ); - } - notify_init_t init = (notify_init_t)dlsym(handle, "notify_init"); - if ( init == NULL ) - { - dlclose( handle ); - return 1; - } - init("AppImage"); - - notify_notification_new_t nnn = (notify_notification_new_t)dlsym(handle, "notify_notification_new"); - if ( nnn == NULL ) - { - dlclose( handle ); - return 1; - } - n = nnn(title, body, NULL, NULL); - notify_notification_set_timeout_t nnst = (notify_notification_set_timeout_t)dlsym(handle, "notify_notification_set_timeout"); - if ( nnst == NULL ) - { - dlclose( handle ); - return 1; - } - nnst(n, timeout); - notify_notification_show_t show = (notify_notification_show_t)dlsym(handle, "notify_notification_show"); - if ( init == NULL ) - { - dlclose( handle ); - return 1; - } - show(n, NULL ); - dlclose(handle ); - } - return 0; -} - -/* -int main( int argc, char *argv[] ) -{ - char *title; - char *body; - printf("%s\n", "Test"); - title = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua."; - body = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."; - notify(title, body, 3000); // 3 seconds timeout - return 0; -} -*/ diff --git a/src/runtime.c b/src/runtime.c deleted file mode 100644 index fa0aa7d31..000000000 --- a/src/runtime.c +++ /dev/null @@ -1,958 +0,0 @@ -/************************************************************************** - * - * Copyright (c) 2004-18 Simon Peter - * Portions Copyright (c) 2007 Alexander Larsson - * - * All Rights Reserved. - * - * 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. - * - **************************************************************************/ - -#ident "AppImage by Simon Peter, http://appimage.org/" - -#define _GNU_SOURCE - -#include "squashfuse.h" -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#ifndef ENABLE_DLOPEN -#define ENABLE_DLOPEN -#endif -#include "squashfuse_dlopen.h" - -/* Exit status to use when launching an AppImage fails. - * For applications that assign meanings to exit status codes (e.g. rsync), - * we avoid "cluttering" pre-defined exit status codes by using 127 which - * is known to alias an application exit status and also known as launcher - * error, see SYSTEM(3POSIX). - */ -#define EXIT_EXECERROR 127 /* Execution error exit status. */ - -//#include "notify.c" -extern int notify(char *title, char *body, int timeout); -struct stat st; - -static ssize_t fs_offset; // The offset at which a filesystem image is expected = end of this ELF - -static void die(const char *msg) { - fprintf(stderr, "%s\n", msg); - exit(EXIT_EXECERROR); -} - -/* Check whether directory is writable */ -bool is_writable_directory(char* str) { - if(access(str, W_OK) == 0) { - return true; - } else { - return false; - } -} - -bool startsWith(const char *pre, const char *str) -{ - size_t lenpre = strlen(pre), - lenstr = strlen(str); - return lenstr < lenpre ? false : strncmp(pre, str, lenpre) == 0; -} - -/* Fill in a stat structure. Does not set st_ino */ -sqfs_err private_sqfs_stat(sqfs *fs, sqfs_inode *inode, struct stat *st) { - sqfs_err err = SQFS_OK; - uid_t id; - - memset(st, 0, sizeof(*st)); - st->st_mode = inode->base.mode; - st->st_nlink = inode->nlink; - st->st_mtime = st->st_ctime = st->st_atime = inode->base.mtime; - - if (S_ISREG(st->st_mode)) { - /* FIXME: do symlinks, dirs, etc have a size? */ - st->st_size = inode->xtra.reg.file_size; - st->st_blocks = st->st_size / 512; - } else if (S_ISBLK(st->st_mode) || S_ISCHR(st->st_mode)) { - st->st_rdev = sqfs_makedev(inode->xtra.dev.major, - inode->xtra.dev.minor); - } else if (S_ISLNK(st->st_mode)) { - st->st_size = inode->xtra.symlink_size; - } - - st->st_blksize = fs->sb.block_size; /* seriously? */ - - err = sqfs_id_get(fs, inode->base.uid, &id); - if (err) - return err; - st->st_uid = id; - err = sqfs_id_get(fs, inode->base.guid, &id); - st->st_gid = id; - if (err) - return err; - - return SQFS_OK; -} - -/* ================= End ELF parsing */ - -extern int fusefs_main(int argc, char *argv[], void (*mounted) (void)); -// extern void ext2_quit(void); - -static pid_t fuse_pid; -static int keepalive_pipe[2]; - -static void * -write_pipe_thread (void *arg) -{ - char c[32]; - int res; - // sprintf(stderr, "Called write_pipe_thread"); - memset (c, 'x', sizeof (c)); - while (1) { - /* Write until we block, on broken pipe, exit */ - res = write (keepalive_pipe[1], c, sizeof (c)); - if (res == -1) { - kill (fuse_pid, SIGTERM); - break; - } - } - return NULL; -} - -void -fuse_mounted (void) -{ - pthread_t thread; - fuse_pid = getpid(); - pthread_create(&thread, NULL, write_pipe_thread, keepalive_pipe); -} - -char* getArg(int argc, char *argv[],char chr) -{ - int i; - for (i=1; i sizeof(_path)-1) { - errno = ENAMETOOLONG; - return -1; - } - strcpy(_path, path); - - /* Iterate the string */ - for (p = _path + 1; *p; p++) { - if (*p == '/') { - /* Temporarily truncate */ - *p = '\0'; - - if (mkdir(_path, 0755) != 0) { - if (errno != EEXIST) - return -1; - } - - *p = '/'; - } - } - - if (mkdir(_path, 0755) != 0) { - if (errno != EEXIST) - return -1; - } - - return 0; -} - -void -print_help(const char *appimage_path) -{ - // TODO: "--appimage-list List content from embedded filesystem image\n" - fprintf(stderr, - "AppImage options:\n\n" - " --appimage-extract [] Extract content from embedded filesystem image\n" - " If pattern is passed, only extract matching files\n" - " --appimage-help Print this help\n" - " --appimage-mount Mount embedded filesystem image and print\n" - " mount point and wait for kill with Ctrl-C\n" - " --appimage-offset Print byte offset to start of embedded\n" - " filesystem image\n" - " --appimage-portable-home Create a portable home folder to use as $HOME\n" - " --appimage-portable-config Create a portable config folder to use as\n" - " $XDG_CONFIG_HOME\n" - " --appimage-signature Print digital signature embedded in AppImage\n" - " --appimage-updateinfo[rmation] Print update info embedded in AppImage\n" - " --appimage-version Print version of AppImageKit\n" - "\n" - "Portable home:\n" - "\n" - " If you would like the application contained inside this AppImage to store its\n" - " data alongside this AppImage rather than in your home directory, then you can\n" - " place a directory named\n" - "\n" - " %s.home\n" - "\n" - " Or you can invoke this AppImage with the --appimage-portable-home option,\n" - " which will create this directory for you. As long as the directory exists\n" - " and is neither moved nor renamed, the application contained inside this\n" - " AppImage will store its data in this directory rather than in your home\n" - " directory\n" - , appimage_path); -} - -void -portable_option(const char *arg, const char *appimage_path, const char *name) -{ - char option[32]; - sprintf(option, "appimage-portable-%s", name); - - if (arg && strcmp(arg, option)==0) { - char portable_dir[PATH_MAX]; - char fullpath[PATH_MAX]; - - ssize_t length = readlink(appimage_path, fullpath, sizeof(fullpath)); - if (length < 0) { - fprintf(stderr, "Error getting realpath for %s\n", appimage_path); - exit(EXIT_FAILURE); - } - fullpath[length] = '\0'; - - sprintf(portable_dir, "%s.%s", fullpath, name); - if (!mkdir(portable_dir, S_IRWXU)) - fprintf(stderr, "Portable %s directory created at %s\n", name, portable_dir); - else - fprintf(stderr, "Error creating portable %s directory at %s: %s\n", name, portable_dir, strerror(errno)); - - exit(0); - } -} - -bool extract_appimage(const char* const appimage_path, const char* const _prefix, const char* const _pattern, const bool overwrite, const bool verbose) { - sqfs_err err = SQFS_OK; - sqfs_traverse trv; - sqfs fs; - char prefixed_path_to_extract[1024]; - - // local copy we can modify safely - // allocate 1 more byte than we would need so we can add a trailing slash if there is none yet - char* prefix = malloc(strlen(_prefix) + 2); - strcpy(prefix, _prefix); - - // sanitize prefix - if (prefix[strlen(prefix) - 1] != '/') - strcat(prefix, "/"); - - if (access(prefix, F_OK) == -1) { - if (mkdir_p(prefix) == -1) { - perror("mkdir_p error"); - return false; - } - } - - if ((err = sqfs_open_image(&fs, appimage_path, (size_t) fs_offset))) { - fprintf(stderr, "Failed to open squashfs image\n"); - return false; - }; - - // track duplicate inodes for hardlinks - char** created_inode = calloc(fs.sb.inodes, sizeof(char*)); - if (created_inode == NULL) { - fprintf(stderr, "Failed allocating memory to track hardlinks\n"); - return false; - } - - if ((err = sqfs_traverse_open(&trv, &fs, sqfs_inode_root(&fs)))) { - fprintf(stderr, "sqfs_traverse_open error\n"); - free(created_inode); - return false; - } - - bool rv = true; - - while (sqfs_traverse_next(&trv, &err)) { - if (!trv.dir_end) { - if (_pattern == NULL || fnmatch(_pattern, trv.path, FNM_FILE_NAME | FNM_LEADING_DIR) == 0) { - // fprintf(stderr, "trv.path: %s\n", trv.path); - // fprintf(stderr, "sqfs_inode_id: %lu\n", trv.entry.inode); - sqfs_inode inode; - if (sqfs_inode_get(&fs, &inode, trv.entry.inode)) { - fprintf(stderr, "sqfs_inode_get error\n"); - rv = false; - break; - } - // fprintf(stderr, "inode.base.inode_type: %i\n", inode.base.inode_type); - // fprintf(stderr, "inode.xtra.reg.file_size: %lu\n", inode.xtra.reg.file_size); - strcpy(prefixed_path_to_extract, ""); - strcat(strcat(prefixed_path_to_extract, prefix), trv.path); - - if (verbose) - fprintf(stdout, "%s\n", prefixed_path_to_extract); - - if (inode.base.inode_type == SQUASHFS_DIR_TYPE || inode.base.inode_type == SQUASHFS_LDIR_TYPE) { - // fprintf(stderr, "inode.xtra.dir.parent_inode: %ui\n", inode.xtra.dir.parent_inode); - // fprintf(stderr, "mkdir_p: %s/\n", prefixed_path_to_extract); - if (access(prefixed_path_to_extract, F_OK) == -1) { - if (mkdir_p(prefixed_path_to_extract) == -1) { - perror("mkdir_p error"); - rv = false; - break; - } - } - } else if (inode.base.inode_type == SQUASHFS_REG_TYPE || inode.base.inode_type == SQUASHFS_LREG_TYPE) { - // if we've already created this inode, then this is a hardlink - char* existing_path_for_inode = created_inode[inode.base.inode_number - 1]; - if (existing_path_for_inode != NULL) { - unlink(prefixed_path_to_extract); - if (link(existing_path_for_inode, prefixed_path_to_extract) == -1) { - fprintf(stderr, "Couldn't create hardlink from \"%s\" to \"%s\": %s\n", - prefixed_path_to_extract, existing_path_for_inode, strerror(errno)); - rv = false; - break; - } else { - continue; - } - } else { - struct stat st; - if (!overwrite && stat(prefixed_path_to_extract, &st) == 0 && st.st_size == inode.xtra.reg.file_size) { - fprintf(stderr, "File exists and file size matches, skipping\n"); - continue; - } - - // track the path we extract to for this inode, so that we can `link` if this inode is found again - created_inode[inode.base.inode_number - 1] = strdup(prefixed_path_to_extract); - // fprintf(stderr, "Extract to: %s\n", prefixed_path_to_extract); - if (private_sqfs_stat(&fs, &inode, &st) != 0) - die("private_sqfs_stat error"); - - // create parent dir - char* p = strrchr(prefixed_path_to_extract, '/'); - if (p) { - // set an \0 to end the split the string - *p = '\0'; - mkdir_p(prefixed_path_to_extract); - - // restore dir seprator - *p = '/'; - } - - // Read the file in chunks - off_t bytes_already_read = 0; - sqfs_off_t bytes_at_a_time = 64 * 1024; - FILE* f; - f = fopen(prefixed_path_to_extract, "w+"); - if (f == NULL) { - perror("fopen error"); - rv = false; - break; - } - while (bytes_already_read < inode.xtra.reg.file_size) { - char buf[bytes_at_a_time]; - if (sqfs_read_range(&fs, &inode, (sqfs_off_t) bytes_already_read, &bytes_at_a_time, buf)) { - perror("sqfs_read_range error"); - rv = false; - break; - } - // fwrite(buf, 1, bytes_at_a_time, stdout); - fwrite(buf, 1, bytes_at_a_time, f); - bytes_already_read = bytes_already_read + bytes_at_a_time; - } - fclose(f); - chmod(prefixed_path_to_extract, st.st_mode); - if (!rv) - break; - } - } else if (inode.base.inode_type == SQUASHFS_SYMLINK_TYPE || inode.base.inode_type == SQUASHFS_LSYMLINK_TYPE) { - size_t size; - sqfs_readlink(&fs, &inode, NULL, &size); - char buf[size]; - int ret = sqfs_readlink(&fs, &inode, buf, &size); - if (ret != 0) { - perror("symlink error"); - rv = false; - break; - } - // fprintf(stderr, "Symlink: %s to %s \n", prefixed_path_to_extract, buf); - unlink(prefixed_path_to_extract); - ret = symlink(buf, prefixed_path_to_extract); - if (ret != 0) - fprintf(stderr, "WARNING: could not create symlink\n"); - } else { - fprintf(stderr, "TODO: Implement inode.base.inode_type %i\n", inode.base.inode_type); - } - // fprintf(stderr, "\n"); - - if (!rv) - break; - } - } - } - for (int i = 0; i < fs.sb.inodes; i++) { - free(created_inode[i]); - } - free(created_inode); - - if (err != SQFS_OK) { - fprintf(stderr, "sqfs_traverse_next error\n"); - rv = false; - } - sqfs_traverse_close(&trv); - sqfs_fd_close(fs.fd); - - return rv; -} - -int rm_recursive_callback(const char* path, const struct stat* stat, const int type, struct FTW* ftw) { - (void) stat; - (void) ftw; - - switch (type) { - case FTW_NS: - case FTW_DNR: - fprintf(stderr, "%s: ftw error: %s\n", - path, strerror(errno)); - return 1; - - case FTW_D: - // ignore directories at first, will be handled by FTW_DP - break; - - case FTW_F: - case FTW_SL: - case FTW_SLN: - if (remove(path) != 0) { - fprintf(stderr, "Failed to remove %s: %s\n", path, strerror(errno)); - return false; - } - break; - - - case FTW_DP: - if (rmdir(path) != 0) { - fprintf(stderr, "Failed to remove directory %s: %s\n", path, strerror(errno)); - return false; - } - break; - - default: - fprintf(stderr, "Unexpected fts_info\n"); - return 1; - } - - return 0; -}; - -bool rm_recursive(const char* const path) { - // FTW_DEPTH: perform depth-first search to make sure files are deleted before the containing directories - // FTW_MOUNT: prevent deletion of files on other mounted filesystems - // FTW_PHYS: do not follow symlinks, but report symlinks as such; this way, the symlink targets, which might point - // to locations outside path will not be deleted accidentally (attackers might abuse this) - int rv = nftw(path, &rm_recursive_callback, 0, FTW_DEPTH | FTW_MOUNT | FTW_PHYS); - - return rv == 0; -} - -bool build_mount_point(char* mount_dir, const char* const argv0, char const* const temp_base, const size_t templen) { - const size_t maxnamelen = 6; - - // when running for another AppImage, we should use that for building the mountpoint name instead - char* target_appimage = getenv("TARGET_APPIMAGE"); - - char* path_basename; - if (target_appimage != NULL) { - path_basename = basename(target_appimage); - } else { - path_basename = basename(argv0); - } - - size_t namelen = strlen(path_basename); - // limit length of tempdir name - if (namelen > maxnamelen) { - namelen = maxnamelen; - } - - strcpy(mount_dir, temp_base); - strncpy(mount_dir + templen, "/.mount_", 8); - strncpy(mount_dir + templen + 8, path_basename, namelen); - strncpy(mount_dir+templen+8+namelen, "XXXXXX", 6); - mount_dir[templen+8+namelen+6] = 0; // null terminate destination -} - -void set_portable_home_and_config(char *basepath) { - char portable_home_dir[PATH_MAX]; - char portable_config_dir[PATH_MAX]; - - /* If there is a directory with the same name as the AppImage plus ".home", then export $HOME */ - strcpy (portable_home_dir, basepath); - strcat (portable_home_dir, ".home"); - if(is_writable_directory(portable_home_dir)){ - fprintf(stderr, "Setting $HOME to %s\n", portable_home_dir); - setenv("HOME",portable_home_dir,1); - } - - /* If there is a directory with the same name as the AppImage plus ".config", then export $XDG_CONFIG_HOME */ - strcpy (portable_config_dir, basepath); - strcat (portable_config_dir, ".config"); - if(is_writable_directory(portable_config_dir)){ - fprintf(stderr, "Setting $XDG_CONFIG_HOME to %s\n", portable_config_dir); - setenv("XDG_CONFIG_HOME",portable_config_dir,1); - } -} - -int main(int argc, char *argv[]) { - char appimage_path[PATH_MAX]; - char argv0_path[PATH_MAX]; - char * arg; - - /* We might want to operate on a target appimage rather than this file itself, - * e.g., for appimaged which must not run untrusted code from random AppImages. - * This variable is intended for use by e.g., appimaged and is subject to - * change any time. Do not rely on it being present. We might even limit this - * functionality specifically for builds used by appimaged. - */ - if (getenv("TARGET_APPIMAGE") == NULL) { - strcpy(appimage_path, "/proc/self/exe"); - strcpy(argv0_path, argv[0]); - } else { - strcpy(appimage_path, getenv("TARGET_APPIMAGE")); - strcpy(argv0_path, getenv("TARGET_APPIMAGE")); - -#ifdef ENABLE_SETPROCTITLE - // load libbsd dynamically to change proc title - // this is an optional feature, therefore we don't hard require it - void* libbsd = dlopen("libbsd.so", RTLD_NOW); - - if (libbsd != NULL) { - // clear error state - dlerror(); - - // try to load the two required symbols - void (*setproctitle_init)(int, char**, char**) = dlsym(libbsd, "setproctitle_init"); - - char* error; - - if ((error = dlerror()) == NULL) { - void (*setproctitle)(const char*, char*) = dlsym(libbsd, "setproctitle"); - - if (dlerror() == NULL) { - char buffer[1024]; - strcpy(buffer, getenv("TARGET_APPIMAGE")); - for (int i = 1; i < argc; i++) { - strcat(buffer, " "); - strcat(buffer, argv[i]); - } - - (*setproctitle_init)(argc, argv, environ); - (*setproctitle)("%s", buffer); - } - } - - dlclose(libbsd); - } -#endif - } - - // temporary directories are required in a few places - // therefore we implement the detection of the temp base dir at the top of the code to avoid redundancy - char temp_base[PATH_MAX] = P_tmpdir; - - { - const char* const TMPDIR = getenv("TMPDIR"); - if (TMPDIR != NULL) - strcpy(temp_base, getenv("TMPDIR")); - } - - fs_offset = appimage_get_elf_size(appimage_path); - - // error check - if (fs_offset < 0) { - fprintf(stderr, "Failed to get fs offset for %s\n", appimage_path); - exit(EXIT_EXECERROR); - } - - arg=getArg(argc,argv,'-'); - - /* Print the help and then exit */ - if(arg && strcmp(arg,"appimage-help")==0) { - char fullpath[PATH_MAX]; - - ssize_t length = readlink(appimage_path, fullpath, sizeof(fullpath)); - if (length < 0) { - fprintf(stderr, "Error getting realpath for %s\n", appimage_path); - exit(EXIT_EXECERROR); - } - fullpath[length] = '\0'; - - print_help(fullpath); - exit(0); - } - - /* Just print the offset and then exit */ - if(arg && strcmp(arg,"appimage-offset")==0) { - printf("%lu\n", fs_offset); - exit(0); - } - - arg=getArg(argc,argv,'-'); - - /* extract the AppImage */ - if(arg && strcmp(arg,"appimage-extract")==0) { - char* pattern; - - // default use case: use standard prefix - if (argc == 2) { - pattern = NULL; - } else if (argc == 3) { - pattern = argv[2]; - } else { - fprintf(stderr, "Unexpected argument count: %d\n", argc - 1); - fprintf(stderr, "Usage: %s --appimage-extract []\n", argv0_path); - exit(1); - } - - if (!extract_appimage(appimage_path, "squashfs-root/", pattern, true, true)) { - exit(1); - } - - exit(0); - } - - // calculate full path of AppImage - int length; - char fullpath[PATH_MAX]; - - if(getenv("TARGET_APPIMAGE") == NULL) { - // If we are operating on this file itself - ssize_t len = readlink(appimage_path, fullpath, sizeof(fullpath)); - if (len < 0) { - perror("Failed to obtain absolute path"); - exit(EXIT_EXECERROR); - } - fullpath[len] = '\0'; - } else { - char* abspath = realpath(appimage_path, NULL); - if (abspath == NULL) { - perror("Failed to obtain absolute path"); - exit(EXIT_EXECERROR); - } - strcpy(fullpath, abspath); - free(abspath); - } - - if (getenv("APPIMAGE_EXTRACT_AND_RUN") != NULL || (arg && strcmp(arg, "appimage-extract-and-run") == 0)) { - char* hexlified_digest = NULL; - - // calculate MD5 hash of file, and use it to make extracted directory name "content-aware" - // see https://github.com/AppImage/AppImageKit/issues/841 for more information - { - FILE* f = fopen(appimage_path, "rb"); - if (f == NULL) { - perror("Failed to open AppImage file"); - exit(EXIT_EXECERROR); - } - - Md5Context ctx; - Md5Initialise(&ctx); - - char buf[4096]; - for (size_t bytes_read; (bytes_read = fread(buf, sizeof(char), sizeof(buf), f)); bytes_read > 0) { - Md5Update(&ctx, buf, (uint32_t) bytes_read); - } - - MD5_HASH digest; - Md5Finalise(&ctx, &digest); - - hexlified_digest = appimage_hexlify(digest.bytes, sizeof(digest.bytes)); - } - - char* prefix = malloc(strlen(temp_base) + 20 + strlen(hexlified_digest) + 2); - strcpy(prefix, temp_base); - strcat(prefix, "/appimage_extracted_"); - strcat(prefix, hexlified_digest); - free(hexlified_digest); - - const bool verbose = (getenv("VERBOSE") != NULL); - - if (!extract_appimage(appimage_path, prefix, NULL, false, verbose)) { - fprintf(stderr, "Failed to extract AppImage\n"); - exit(EXIT_EXECERROR); - } - - int pid; - if ((pid = fork()) == -1) { - int error = errno; - fprintf(stderr, "fork() failed: %s\n", strerror(error)); - exit(EXIT_EXECERROR); - } else if (pid == 0) { - const char apprun_fname[] = "AppRun"; - char* apprun_path = malloc(strlen(prefix) + 1 + strlen(apprun_fname) + 1); - strcpy(apprun_path, prefix); - strcat(apprun_path, "/"); - strcat(apprun_path, apprun_fname); - - // create copy of argument list without the --appimage-extract-and-run parameter - char* new_argv[argc]; - int new_argc = 0; - new_argv[new_argc++] = strdup(apprun_path); - for (int i = 1; i < argc; ++i) { - if (strcmp(argv[i], "--appimage-extract-and-run") != 0) { - new_argv[new_argc++] = strdup(argv[i]); - } - } - new_argv[new_argc] = NULL; - - /* Setting some environment variables that the app "inside" might use */ - setenv("APPIMAGE", fullpath, 1); - setenv("ARGV0", argv0_path, 1); - setenv("APPDIR", prefix, 1); - - set_portable_home_and_config(fullpath); - - execv(apprun_path, new_argv); - - int error = errno; - fprintf(stderr, "Failed to run %s: %s\n", apprun_path, strerror(error)); - - free(apprun_path); - exit(EXIT_EXECERROR); - } - - int status = 0; - int rv = waitpid(pid, &status, 0); - status = rv > 0 && WIFEXITED (status) ? WEXITSTATUS (status) : EXIT_EXECERROR; - - if (getenv("NO_CLEANUP") == NULL) { - if (!rm_recursive(prefix)) { - fprintf(stderr, "Failed to clean up cache directory\n"); - if (status == 0) /* avoid messing existing failure exit status */ - status = EXIT_EXECERROR; - } - } - - // template == prefix, must be freed only once - free(prefix); - - exit(status); - } - - if(arg && strcmp(arg,"appimage-version")==0) { - fprintf(stderr,"Version: %s\n", GIT_COMMIT); - exit(0); - } - - if(arg && (strcmp(arg,"appimage-updateinformation")==0 || strcmp(arg,"appimage-updateinfo")==0)) { - unsigned long offset = 0; - unsigned long length = 0; - appimage_get_elf_section_offset_and_length(appimage_path, ".upd_info", &offset, &length); - // fprintf(stderr, "offset: %lu\n", offset); - // fprintf(stderr, "length: %lu\n", length); - // print_hex(appimage_path, offset, length); - appimage_print_binary(appimage_path, offset, length); - exit(0); - } - - if(arg && strcmp(arg,"appimage-signature")==0) { - unsigned long offset = 0; - unsigned long length = 0; - appimage_get_elf_section_offset_and_length(appimage_path, ".sha256_sig", &offset, &length); - // fprintf(stderr, "offset: %lu\n", offset); - // fprintf(stderr, "length: %lu\n", length); - // print_hex(appimage_path, offset, length); - appimage_print_binary(appimage_path, offset, length); - exit(0); - } - - portable_option(arg, appimage_path, "home"); - portable_option(arg, appimage_path, "config"); - - // If there is an argument starting with appimage- (but not appimage-mount which is handled further down) - // then stop here and print an error message - if((arg && strncmp(arg, "appimage-", 8) == 0) && (arg && strcmp(arg,"appimage-mount")!=0)) { - fprintf(stderr,"--%s is not yet implemented in version %s\n", arg, GIT_COMMIT); - exit(1); - } - - LOAD_LIBRARY; /* exit if libfuse is missing */ - - int dir_fd, res; - - size_t templen = strlen(temp_base); - - // allocate enough memory (size of name won't exceed 60 bytes) - char mount_dir[templen + 60]; - - build_mount_point(mount_dir, argv[0], temp_base, templen); - - size_t mount_dir_size = strlen(mount_dir); - pid_t pid; - char **real_argv; - int i; - - if (mkdtemp(mount_dir) == NULL) { - perror ("create mount dir error"); - exit (EXIT_EXECERROR); - } - - if (pipe (keepalive_pipe) == -1) { - perror ("pipe error"); - exit (EXIT_EXECERROR); - } - - pid = fork (); - if (pid == -1) { - perror ("fork error"); - exit (EXIT_EXECERROR); - } - - if (pid == 0) { - /* in child */ - - char *child_argv[5]; - - /* close read pipe */ - close (keepalive_pipe[0]); - - char *dir = realpath(appimage_path, NULL ); - - char options[100]; - sprintf(options, "ro,offset=%lu", fs_offset); - - child_argv[0] = dir; - child_argv[1] = "-o"; - child_argv[2] = options; - child_argv[3] = dir; - child_argv[4] = mount_dir; - - if(0 != fusefs_main (5, child_argv, fuse_mounted)){ - char *title; - char *body; - title = "Cannot mount AppImage, please check your FUSE setup."; - body = "You might still be able to extract the contents of this AppImage \n" - "if you run it with the --appimage-extract option. \n" - "See https://github.com/AppImage/AppImageKit/wiki/FUSE \n" - "for more information"; - notify(title, body, 0); // 3 seconds timeout - }; - } else { - /* in parent, child is $pid */ - int c; - - /* close write pipe */ - close (keepalive_pipe[1]); - - /* Pause until mounted */ - read (keepalive_pipe[0], &c, 1); - - /* Fuse process has now daemonized, reap our child */ - waitpid(pid, NULL, 0); - - dir_fd = open (mount_dir, O_RDONLY); - if (dir_fd == -1) { - perror ("open dir error"); - exit (EXIT_EXECERROR); - } - - res = dup2 (dir_fd, 1023); - if (res == -1) { - perror ("dup2 error"); - exit (EXIT_EXECERROR); - } - close (dir_fd); - - real_argv = malloc (sizeof (char *) * (argc + 1)); - for (i = 0; i < argc; i++) { - real_argv[i] = argv[i]; - } - real_argv[i] = NULL; - - if(arg && strcmp(arg, "appimage-mount") == 0) { - char real_mount_dir[PATH_MAX]; - - if (realpath(mount_dir, real_mount_dir) == real_mount_dir) { - printf("%s\n", real_mount_dir); - } else { - printf("%s\n", mount_dir); - } - - // stdout is, by default, buffered (unlike stderr), therefore in order to allow other processes to read - // the path from stdout, we need to flush the buffers now - // this is a less-invasive alternative to setbuf(stdout, NULL); - fflush(stdout); - - for (;;) pause(); - - exit(0); - } - - /* Setting some environment variables that the app "inside" might use */ - setenv( "APPIMAGE", fullpath, 1 ); - setenv( "ARGV0", argv0_path, 1 ); - setenv( "APPDIR", mount_dir, 1 ); - - set_portable_home_and_config(fullpath); - - /* Original working directory */ - char cwd[1024]; - if (getcwd(cwd, sizeof(cwd)) != NULL) { - setenv( "OWD", cwd, 1 ); - } - - char filename[mount_dir_size + 8]; /* enough for mount_dir + "/AppRun" */ - strcpy (filename, mount_dir); - strcat (filename, "/AppRun"); - - /* TODO: Find a way to get the exit status and/or output of this */ - execv (filename, real_argv); - /* Error if we continue here */ - perror("execv error"); - exit(EXIT_EXECERROR); - } - - return 0; -} diff --git a/src/validate.c b/src/validate.c deleted file mode 100644 index 7e8ce30c6..000000000 --- a/src/validate.c +++ /dev/null @@ -1,204 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "appimage/appimage.h" -#include "appimage/appimage_shared.h" -#include "light_elf.h" - -typedef unsigned char byte; - -char segment_name[] = ".sha256_sig"; -char segment_key_name[] = ".sig_key"; - -int sha256_file(char *path, char outputBuffer[65], int skip_offset, int skip_length) -{ - FILE *file = fopen(path, "rb"); - if(!file) return(1); - byte hash[SHA256_DIGEST_LENGTH]; - SHA256_CTX sha256; - SHA256_Init(&sha256); - const int bufSize = 1024*1024; - byte *buffer = malloc(bufSize); - int bytesRead = 0; - if(!buffer) { - fclose(file); - return ENOMEM; - } - - int totalBytesRead = 0; - if(skip_offset <= bufSize){ - bytesRead = fread(buffer, 1, skip_offset, file); - totalBytesRead += bytesRead; - // printf("totalBytesRead: %i\n", totalBytesRead); - // printf("bytesRead: %i\n", bytesRead); - SHA256_Update(&sha256, buffer, bytesRead); - } else { - int stillToRead = skip_offset-bytesRead; - // printf("Initial stillToRead: %i\n", stillToRead); - int readThisTime; - - if(stillToRead>bufSize){ - readThisTime = bufSize; - } else { - readThisTime = stillToRead; - } - while((bytesRead = fread(buffer, 1, readThisTime, file))) - { - totalBytesRead += bytesRead; - // printf("totalBytesRead: %i\n", totalBytesRead); - // printf("readThisTime: %i\n", readThisTime); - // printf("bytesRead: %i\n", bytesRead); - SHA256_Update(&sha256, buffer, bytesRead); - stillToRead = skip_offset-totalBytesRead; - // printf("stillToRead: %i\n", stillToRead); - - if(stillToRead>bufSize){ - readThisTime = bufSize; - } else { - readThisTime = stillToRead; - } - } - } - - fseek(file, skip_offset+skip_length, SEEK_SET); - - /* Instead of the skipped area, calculate the sha256 of the same amount if 0x00s */ - int i = 0; - for(i = 0; i < skip_length; i++) { - SHA256_Update(&sha256, "\0", 1); - totalBytesRead += 1; - } - - while((bytesRead = fread(buffer, 1, bufSize, file))) - { - totalBytesRead += bytesRead; - // printf("totalBytesRead: %i\n", totalBytesRead); - // printf("bytesRead: %i\n", bytesRead); - SHA256_Update(&sha256, buffer, bytesRead); - } - SHA256_Final(hash, &sha256); - - // fprintf(stderr, "totalBytesRead: %i\n", totalBytesRead); - - for(i = 0; i < SHA256_DIGEST_LENGTH; i++) - { - sprintf(outputBuffer + (i * 2), "%02x", hash[i]); - } - outputBuffer[64] = 0; - - fclose(file); - - return 0; -} - -int main(int argc,char **argv) { - if(argc < 2){ - fprintf(stderr, "Usage: %s Signed.AppImage\n", argv[0]); - exit(1); - } - - char *filename = argv[1]; - - unsigned long skip_offset_sig = 0; - unsigned long skip_length_sig = 0; - - unsigned long skip_offset_key = 0; - unsigned long skip_length_key = 0; - - if (!appimage_get_elf_section_offset_and_length(filename, ".sha256_sig", &skip_offset_sig, &skip_length_sig)) { - fprintf(stderr, "Failed to read .sha256_sig section"); - exit(1); - } - if (!appimage_get_elf_section_offset_and_length(filename, ".sig_key", &skip_offset_key, &skip_length_key)) { - skip_length_key = 0; - skip_offset_key = 0; - } - - if(skip_length_sig > 0) { - fprintf(stderr, "Skipping ELF section %s with offset %lu, length %lu\n", segment_name, skip_offset_sig, skip_length_sig); - } else { - fprintf(stderr, "ELF section %s not found, is the file signed?\n", segment_name); - exit(1); - } - if(skip_length_key > 0) { - fprintf(stderr, "Skipping ELF section %s with offset %lu, length %lu\n", segment_key_name, skip_offset_key, skip_length_key); - } else { - fprintf(stderr, "ELF section %s not found, assuming older AppImage Standard\n", segment_key_name); - } - if(skip_offset_sig + skip_length_sig != skip_offset_key && skip_length_key != 0) { - fprintf(stderr, "validate only works when .sha256_sig and .sig_key are contiguous in the ELF header\n"); - exit(0); - } - int skip_offset = skip_offset_sig; - int skip_length = skip_length_sig + skip_length_key; - - char *digestfile; - digestfile = g_strconcat("/tmp/", basename(g_strconcat(filename, ".digest", NULL)), NULL); - char *signaturefile; - signaturefile = g_strconcat("/tmp/", basename(g_strconcat(filename, ".sig", NULL)), NULL); - - uint8_t *data = malloc(skip_length_sig); - unsigned long k; - FILE* fd = fopen(filename, "r"); - fseek(fd, skip_offset_sig, SEEK_SET); - fread(data, skip_length_sig, sizeof(uint8_t), fd); - fclose(fd); - FILE *fpdst2 = fopen(signaturefile, "w"); - if (fpdst2 == NULL) { - fprintf(stderr, "Not able to open the signature file for writing, aborting"); - exit(1); - } - for (k = 0; k < skip_length_sig; k++) { - fprintf(fpdst2, "%c", data[k]); - } - fclose(fpdst2); - free(data); - - struct stat st; - stat(filename, &st); - int size = st.st_size; - if(size < skip_offset+skip_length){ - fprintf(stderr, "offset+length cannot be less than the file size\n"); - exit(1); - } - - static char buffer[65]; - sha256_file(filename, buffer, skip_offset, skip_length); - printf("%s\n", buffer); - - - FILE *f = fopen(digestfile, "w"); - if (f == NULL){ - printf("Error opening digestfile\n"); - exit(1); - } - fprintf(f, "%s", buffer); - fclose(f); - if (! g_file_test(digestfile, G_FILE_TEST_IS_REGULAR)) { - printf("Error writing digestfile\n"); - exit(1); - } - - char command[1024]; - gchar *gpg2_path = g_find_program_in_path ("gpg2"); - sprintf (command, "%s --verify %s %s", gpg2_path, signaturefile, digestfile); - fprintf (stderr, "%s\n", command); - FILE *fp = popen(command, "r"); - if (fp == NULL) - fprintf(stderr, "gpg2 command did not succeed"); - int exitcode = WEXITSTATUS(pclose(fp)); - unlink(digestfile); - unlink(signaturefile); - return exitcode; -} diff --git a/testappimage b/testappimage deleted file mode 100644 index 958bae546..000000000 --- a/testappimage +++ /dev/null @@ -1,205 +0,0 @@ -#!/bin/bash - -# -# Test an AppDir or AppImage on a given ISO or squashfs or ext3 base system -# TODO: -# - Make compatible with type 2 AppImages (currently we have to first mount them by hand) -# - Check https://github.com/FGrose/livecd-tools/blob/liveimage-mount/tools/liveimage-mount -# - -set -e -# set -x - -xhost + # Workaround for: QXcbConnection: Could not connect to display :0 - -HERE=$(dirname $(readlink -f "${0}")) -export PATH=$HERE:$HERE/usr/bin:$PATH - -if [ "$1x" == "x" ] ; then - echo "Please specify a ISO or squashfs base system to run the AppImage on" - exit 1 -fi - -if [ "$2x" == "x" ] ; then - echo "Please specify an AppDir or AppImage outside the ISO or command inside the ISO to be run" - exit 1 -fi - -export PREF=$RANDOM - -mkdir -p /tmp/$PREF/unionfs/ro -mkdir -p /tmp/$PREF/unionfs/root -mkdir -p /tmp/$PREF/unionfs/rw -mkdir -p /tmp/$PREF/union -mkdir -p /tmp/$PREF/iso -mkdir -p /tmp/$PREF/workdir - -# openSUSE LEAP 42.2 does not have a tmpfs in /tmp but we need this -mount | grep -q "/tmp type tmpfs" || sudo mount -t tmpfs tmpfs /tmp/ - -# If ISO was specified, then mount it and find contained filesystem -THEFS="$1" -if [ ${1: -4} == ".iso" ] ; then - ISO="$1" - mount -o loop,ro "$ISO" /tmp/$PREF/iso - # If there is a squashfs file named $ISO.buildsquash then we overlay- - # mount this as well. This can significantly speed up subsequent builds - # because dependencies can be installed there. The squashfs file can be - # generated by squashing the unionfs/rw directory. - if [ -e $ISO.buildsquash ] ; then - mount -o loop,ro "$ISO.buildsquash" /tmp/$PREF/unionfs/ro - fi -fi - -# If sfs was provided, then assume it contains a rootfs use just that -THEFS="$1" -if [ ${1: -4} == ".sfs" ] ; then - ISO="$1" - mount -o loop,ro "$ISO" /tmp/$PREF/unionfs/root -fi - -# If ext3 was provided, then assume it contains a rootfs use just that -THEFS="$1" -if [ ${1: -4} == "ext3" ] ; then - ISO="$1" - mount -o loop,ro "$ISO" /tmp/$PREF/unionfs/root -fi - -echo "" -echo "====================================================" -echo "" -echo $ISO - -# In case of Ubuntu-like ISOs -if [ -e /tmp/$PREF/iso/casper/filesystem.squashfs ] ; then - THEFS=/tmp/$PREF/iso/casper/filesystem.squashfs - mount "$THEFS" /tmp/$PREF/unionfs/root -o loop,ro || exit 1 -fi - -# In case of Fedora-like ISOs -if [ -e /tmp/$PREF/iso/LiveOS/squashfs.img ] ; then - mount -o loop,ro /tmp/$PREF/iso/LiveOS/squashfs.img /tmp/$PREF/iso/ - if [ -e /tmp/$PREF/iso/LiveOS/ext3fs.img ] ; then - # F23 and below use https://github.com/rhinstaller/livecd-tools - THEFS=/tmp/$PREF/iso/LiveOS/ext3fs.img || exit 1 - fi - if [ -e /tmp/$PREF/iso/LiveOS/rootfs.img ] ; then - # F24 and above use https://github.com/rhinstaller/lorax and livemedia-creator - THEFS=/tmp/$PREF/iso/LiveOS/rootfs.img || exit 1 - fi - mount "$THEFS" /tmp/$PREF/unionfs/root -o loop,ro || exit 1 -fi - -# In case of debian-like ISOs -if [ -e /tmp/$PREF/iso/live/filesystem.squashfs ] ; then - THEFS=/tmp/$PREF/iso/live/filesystem.squashfs - mount "$THEFS" /tmp/$PREF/unionfs/root -o loop,ro || exit 1 -fi - -# In case of openSUSE-like ISOs -if [ -e /tmp/$PREF/iso/*-read-only.* ] ; then - THEFS=$(ls /tmp/$PREF/iso/*-read-only.* | head -n 1) - mount "$THEFS" /tmp/$PREF/unionfs/root -o loop,ro || exit 1 -fi - -# In case of puppy-like ISOs -if [ -e /tmp/$PREF/iso/puppy_*.sfs ] ; then - THEFS=$(ls /tmp/$PREF/iso/puppy_*.sfs | head -n 1) - mount "$THEFS" /tmp/$PREF/unionfs/root -o loop,ro || exit 1 -fi - -trap atexit EXIT - -atexit() -{ set +e - umount -l /tmp/$PREF/union/var/lib/dbus 2>/dev/null - umount -l /tmp/$PREF/union/etc/resolv.conf 2>/dev/null - umount -l /tmp/$PREF/union/proc 2>/dev/null - umount -l /tmp/$PREF/union/dev 2>/dev/null - umount -l /tmp/$PREF/union/mnt 2>/dev/null - umount -l /tmp/$PREF/union 2>/dev/null - umount -l /tmp/$PREF/unionfs/ro 2>/dev/null - umount -l /tmp/$PREF/unionfs/root 2>/dev/null - umount -l /tmp/$PREF/iso 2>/dev/null - umount -l /tmp/$PREF/iso 2>/dev/null - umount -l /tmp/$PREF/iso 2>/dev/null - rm -r /tmp/$PREF/workdir - rm -r /tmp/$PREF/unionfs/root - rm -r /tmp/$PREF/unionfs/rw - rm -r /tmp/$PREF/unionfs/ro - rm -r /tmp/$PREF/unionfs - rm -r /tmp/$PREF/union - rm -r /tmp/$PREF/iso - rm -r /tmp/$PREF/ -} - -# Kernel 4.0 or newer required -kernel_major=$(uname -r | cut -d . -f 1) -if [ ! $kernel_major -ge 4 ] ; then - echo "Falling back to unionfs-fuse because kernel is not 4.x or newer" - echo "This can potentially be unreliable" - unionfs-fuse -o allow_other,use_ino,suid,dev,nonempty -ocow,chroot=/tmp/$PREF/unionfs/,max_files=32768 /rw=RW:/ro=RO:/root=RO /tmp/$PREF/union -else - echo "Using OverlayFS because kernel is 4.x or newer" - sudo mount -t overlay -o lowerdir=/tmp/$PREF/unionfs/ro:/tmp/$PREF/unionfs/root,upperdir=/tmp/$PREF/unionfs/rw,workdir=/tmp/$PREF/workdir none /tmp/$PREF/union -fi - -ls /tmp/$PREF/union/mnt >/dev/null && MNT=/mnt -# ls /tmp/$PREF/union/automake >/dev/null && MNT=/automake || echo "" # Puppy - -if [ "x$MNT" == "x" ] ; then - echo "Could not find free mountpoint" - exit 1 -fi -if [ -f "$2" ] ; then - mount "$2" /tmp/$PREF/union/$MNT -o loop,ro -elif [ -d "$2" ] ; then - mount "$2" /tmp/$PREF/union/$MNT -o bind -else - shift - export RUN_COMMAND=$1 - export RUN_INSIDE=$@ -fi - -cat > /tmp/$PREF/union/run.sh < '/etc/pango/pango.modules' 2>/dev/null # otherwise only squares instead of text -[ -f /si-chroot ] && ln -s /lib/ld-lsb.so.3 /lib/ld-linux.so.2 -# LD_LIBRARY_PATH=$MNT/usr/lib:$MNT/usr/lib32:$MNT/usr/lib64:$MNT/lib/:$LD_LIBRARY_PATH ldd $MNT/usr/bin/* $MNT/usr/lib/* 2>/dev/null | grep "not found" | sort | uniq -export HOME="/root" -export LANG="en_EN.UTF-8" -# export QT_PLUGIN_PATH=./lib/qt4/plugins ###################### !!! -#dbus-launch $MNT/AppRun || -export LIBGL_DEBUG=verbose -export QT_DEBUG_PLUGINS=1 -export LC_ALL=C.UTF-8 -mkdir -p /usr/share/appimagekit -touch /usr/share/appimagekit/no_desktopintegration -dbus-uuidgen --ensure ; dbus-launch # Needed for CentOS 6.7 to launch apps that talk to dbus -if [ -f $MNT/usr/lib/qt5/plugins/platforms/libqxcb.so ] ; then - export LD_LIBRARY_PATH=$MNT/usr/lib/:$LD_LIBRARY_PATH - ##ldd $MNT/usr/lib/qt5/plugins/platforms/libqxcb.so | grep not -fi -##find $MNT/usr/lib -type f -exec sh -c 'ldd {} | grep "not found"' 2>/dev/null \; -if [ $(which $RUN_COMMAND) ] ; then - exec $RUN_INSIDE -else - $MNT/AppRun && echo "+++++++++ SUCCESS $ISO $2 +++++++++" -fi -EOF -chmod a+x /tmp/$PREF/union/run.sh -mount -t proc proc /tmp/$PREF/union/proc -mkdir -p /tmp/$PREF/union/var/lib/dbus -mount --bind /dev /tmp/$PREF/union/dev -mount --bind /var/lib/dbus /tmp/$PREF/union/var/lib/dbus -touch /tmp/$PREF/union/etc/resolv.conf || echo "" -mount --bind /etc/resolv.conf /tmp/$PREF/union/etc/resolv.conf -xhost local: >/dev/null 2>&1 # otherwise "cannot open display: :0.0" -echo "" -chroot /tmp/$PREF/union/ /run.sh # $MNT/AppRun -echo "" -exit $? From 2c7c9ccf699c4cb8b7fdba8caed554a087022d82 Mon Sep 17 00:00:00 2001 From: probonopd Date: Thu, 28 Nov 2024 15:29:44 +0100 Subject: [PATCH 540/544] Remove outdated information --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 39c797355..ad76d59b2 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,6 @@ Copyright (c) 2004-24 Simon Peter and contributors. https://en.wikipedia.org/wiki/AppImage -__AppImageKit__ is a concrete implementation of the AppImage format, especially the tiny runtime that becomes part of each AppImage. - Providing an [AppImage](http://appimage.org/) for distributing application has, among others, these advantages: - Applications packaged as an AppImage can run on many distributions (including Ubuntu, Fedora, openSUSE, CentOS, elementaryOS, Linux Mint, and others) - One app = one file = super simple for users: just download one AppImage file, [make it executable](http://discourse.appimage.org/t/how-to-make-an-appimage-executable/80), and run @@ -26,7 +24,7 @@ Providing an [AppImage](http://appimage.org/) for distributing application has, - Can be listed in the [AppImageHub](https://appimage.github.io/apps) central directory of available AppImages - Can double as a self-extracting compressed archive with the `--appimage-extract` parameter -[Here is an overview](https://appimage.github.io/apps) of projects that are already distributing upstream-provided, official AppImages. +[Here is an overview](https://appimage.github.io/apps) of projects that are distributing AppImages. If you have questions, AppImage developers are on #AppImage on irc.libera.chat. @@ -84,7 +82,7 @@ AppImage to the rescue! ## AppImage usage -Running an AppImage mounts the filesystem image and transparently runs the contained application. So the usage of an AppImage normally should equal the usage of the application contained in it. However, there is special functionality, as described here. If an AppImage you have received does not support these options, ask the author of the AppImage to recreate it using the latest `appimagetool` (or `linuxdeployqt`). +Running an AppImage mounts the filesystem image and transparently runs the contained application. So the usage of an AppImage normally should equal the usage of the application contained in it. However, there is special functionality, as described here. If an AppImage you have received does not support these options, ask the author of the AppImage to recreate it using the latest tooling). ### Command line arguments @@ -109,7 +107,7 @@ Example: Imagine you want to use the Leafpad text editor, but carry its settings ```bash # Download Leafpad AppImage and make it executable -wget -c "https://bintray.com/probono/AppImages/download_file?file_path=Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage" -O Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage +Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage chmod a+x Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage # Create a directory with the same name as the AppImage plus the ".config" extension From 1f7981d8bae239b7da196d4712080c774928b2b0 Mon Sep 17 00:00:00 2001 From: probonopd Date: Thu, 28 Nov 2024 15:31:07 +0100 Subject: [PATCH 541/544] Update appimaged URL --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ad76d59b2..a5389ef7d 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Providing an [AppImage](http://appimage.org/) for distributing application has, - No root needed - No system libraries changed - Works out of the box, no installation of runtimes needed -- Optional desktop integration with [appimaged](https://github.com/AppImage/appimaged) +- Optional desktop integration with [appimaged](https://github.com/probonopd/go-appimage/tree/master/src/appimaged#appimaged) - Optional binary delta updates, e.g., for continuous builds (only download the binary diff) using AppImageUpdate - Can optionally GPG2-sign your AppImages (inside the file) - Works on Live ISOs From a476e9d28a5e55805b7c14dae084d84d8ada0daa Mon Sep 17 00:00:00 2001 From: probonopd Date: Thu, 28 Nov 2024 15:35:13 +0100 Subject: [PATCH 542/544] Remove section "Motivation" --- README.md | 54 +----------------------------------------------------- 1 file changed, 1 insertion(+), 53 deletions(-) diff --git a/README.md b/README.md index a5389ef7d..6adfc803d 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Copyright (c) 2004-24 Simon Peter and contributors. https://en.wikipedia.org/wiki/AppImage Providing an [AppImage](http://appimage.org/) for distributing application has, among others, these advantages: -- Applications packaged as an AppImage can run on many distributions (including Ubuntu, Fedora, openSUSE, CentOS, elementaryOS, Linux Mint, and others) +- Applications packaged as an AppImage can run on many distributions (including Debian, Ubuntu, Fedora, openSUSE, Linux Mint, and others) - One app = one file = super simple for users: just download one AppImage file, [make it executable](http://discourse.appimage.org/t/how-to-make-an-appimage-executable/80), and run - No unpacking or installation necessary - No root needed @@ -28,58 +28,6 @@ Providing an [AppImage](http://appimage.org/) for distributing application has, If you have questions, AppImage developers are on #AppImage on irc.libera.chat. -## Motivation - -Linus addresses some core issues of Linux on the desktop in his [DebConf 14_ QA with Linus Torvalds talk](https://www.youtube.com/watch?v=5PmHRSeA2c8). At 05:40 Linus highlights application packaging: - -> I'm talking about actual application writers that want to make a package of their application for Linux. And I've seen this firsthand with the other project I've been involved with, which is my divelog application. - -Obviously Linus is talking about [Subsurface](https://subsurface-divelog.org). - -> We make binaries for Windows and OS X. - -Both bundle not only the application itself, but also the required Qt libraries that the application needs to run. Also included are dependency libraries like `libssh2.1.dylib`and `libzip.2.dylib`. - -> We basically don't make binaries for Linux. Why? Because binaries for Linux desktop applications is a major f*ing pain in the ass. Right. You don't make binaries for Linux. You make binaries for Fedora 19, Fedora 20, maybe there's even like RHEL 5 from ten years ago, you make binaries for debian stable. - -So why not use the same approach as on Windows and OS X, namely, treat the base operating system as a _platform_ on top of which we run the application we care about. This means that we have to bundle the application with all their dependencies that are _not_ part of the base operating system. Welcome [application bundles](https://blogs.gnome.org/tvb/2013/12/10/application-bundles-for-glade/). - -> Or actually you don't make binaries for debian stable because debian stable has libraries that are so old that anything that was built in the last century doesn't work. But you might make binaries for debian... whatever the codename is for unstable. And even that is a major pain because (...) debian has those rules that you are supposed to use shared libraries. Right. - -This is why binaries going into an AppImage should be built against the oldest still-supported LTS or Enterprise distributions. - -> And if you don't use shared libraries, getting your package in, like, is just painful. - -"Getting your package in" means that the distribution accepts the package as part of the base operating system. For an application, that might not be desired at all. As long as we can package the application in a way that it seamlessly runs on top of the base operating system. - -> But using shared libraries is not an option when the libraries are experimental and the libraries are used by two people and one of them is crazy, so every other day some ABI breaks. - -One simple way to achieve this is to bundle private copies of the libraries in question with the application that uses them. Preferably in a way that does not interfere with anything else that is running on the base operating system. Note that this does not have to be true for all libraries; core libraries that are matured, have stable interfaces and can reasonably expected to be present in all distributions do not necessarily have to be bundled with the application. - -> So you actually want to just compile one binary and have it work. Preferably forever. And preferably across all Linux distributions. - -That is actually possible, as long as you stay away from any distribution-specific packaging, and as long as you do not use a too recent build system. The same will probably be true for Windows and OS X - if you compile on OS X 10.11 then I would not expect the resulting build products to run on OS X 10.5. - -> And I actually think distributions have done a horribly, horribly bad job. - -Distributions are all about building the base operating system. But I don't think distributions are a good way to get applications. Rather, I would prefer to get the latest versions of applications directly from the people who write them. And this is already a reality for software like Google Chrome, Eclipse, Arduino and other applications. Who uses the (mostly outdated and changed) versions that are part of the distributions? Probably most people don't. - -> One of the things that I do on the kernel - and I have to fight this every single release and I think it's sad - we have one rule in the kernel, one rule: we don't break userspace. (...) People break userspace, I get really, really angry. (...) - -Excellent. Thank you for this policy! This is why I can still run the Mosaic browser from over a decade ago on modern Linux-based operating systems. (I tried and it works.) - -> And then all the distributions come in and they screw it all up. Because they break binary compatibility left and right. - -Luckily, binaries built on older distributions tend to still work on newer distributions. At least that has been my experience over the last decade with building application bundles using AppImageKit, and before that, klik. - -> They update glibc and everything breaks. (...) - -There is a [way around this](https://blogs.gnome.org/tvb/2013/12/14/application-bundles-revisited/), although not many people actually care to use the workaround (yet). - -> So that's my rant. And that's what I really fundamentally think needs to change for Linux to work on the desktop because you can't have applications writers to do fifteen billion different versions. - -AppImage to the rescue! - ## AppImage usage Running an AppImage mounts the filesystem image and transparently runs the contained application. So the usage of an AppImage normally should equal the usage of the application contained in it. However, there is special functionality, as described here. If an AppImage you have received does not support these options, ask the author of the AppImage to recreate it using the latest tooling). From faf0a1023eb3bb5506acb5b49a13e23cb01b9089 Mon Sep 17 00:00:00 2001 From: probonopd Date: Thu, 28 Nov 2024 15:36:20 +0100 Subject: [PATCH 543/544] Create motivation.md --- motivation.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 motivation.md diff --git a/motivation.md b/motivation.md new file mode 100644 index 000000000..c23946ece --- /dev/null +++ b/motivation.md @@ -0,0 +1,51 @@ +# Motivation + +Linus addresses some core issues of Linux on the desktop in his [DebConf 14_ QA with Linus Torvalds talk](https://www.youtube.com/watch?v=5PmHRSeA2c8). At 05:40 Linus highlights application packaging: + +> I'm talking about actual application writers that want to make a package of their application for Linux. And I've seen this firsthand with the other project I've been involved with, which is my divelog application. + +Obviously Linus is talking about [Subsurface](https://subsurface-divelog.org). + +> We make binaries for Windows and OS X. + +Both bundle not only the application itself, but also the required Qt libraries that the application needs to run. Also included are dependency libraries like `libssh2.1.dylib`and `libzip.2.dylib`. + +> We basically don't make binaries for Linux. Why? Because binaries for Linux desktop applications is a major f*ing pain in the ass. Right. You don't make binaries for Linux. You make binaries for Fedora 19, Fedora 20, maybe there's even like RHEL 5 from ten years ago, you make binaries for debian stable. + +So why not use the same approach as on Windows and OS X, namely, treat the base operating system as a _platform_ on top of which we run the application we care about. This means that we have to bundle the application with all their dependencies that are _not_ part of the base operating system. Welcome [application bundles](https://blogs.gnome.org/tvb/2013/12/10/application-bundles-for-glade/). + +> Or actually you don't make binaries for debian stable because debian stable has libraries that are so old that anything that was built in the last century doesn't work. But you might make binaries for debian... whatever the codename is for unstable. And even that is a major pain because (...) debian has those rules that you are supposed to use shared libraries. Right. + +This is why binaries going into an AppImage should be built against the oldest still-supported LTS or Enterprise distributions, or _all_ dependencies should be privately bundled in the AppImage. + +> And if you don't use shared libraries, getting your package in, like, is just painful. + +"Getting your package in" means that the distribution accepts the package as part of the base operating system. For an application, that might not be desired at all. As long as we can package the application in a way that it seamlessly runs on top of the base operating system. + +> But using shared libraries is not an option when the libraries are experimental and the libraries are used by two people and one of them is crazy, so every other day some ABI breaks. + +One simple way to achieve this is to bundle private copies of the libraries in question with the application that uses them. Preferably in a way that does not interfere with anything else that is running on the base operating system. Note that this does not have to be true for all libraries; core libraries that are matured, have stable interfaces and can reasonably expected to be present in all distributions do not necessarily have to be bundled with the application. + +> So you actually want to just compile one binary and have it work. Preferably forever. And preferably across all Linux distributions. + +That is actually possible, as long as you stay away from any distribution-specific packaging, and as long as you privately bundle all dependencies. + +> And I actually think distributions have done a horribly, horribly bad job. + +Distributions are all about building the base operating system. But I don't think distributions are a good way to get applications. Rather, I would prefer to get the latest versions of applications directly from the people who write them. And this is already a reality for software like Google Chrome, Eclipse, Arduino and other applications. Who uses the (mostly outdated and changed) versions that are part of the distributions? Probably most people don't. + +> One of the things that I do on the kernel - and I have to fight this every single release and I think it's sad - we have one rule in the kernel, one rule: we don't break userspace. (...) People break userspace, I get really, really angry. (...) + +Excellent. Thank you for this policy! This is why I can still run the Mosaic browser from over a decade ago on modern Linux-based operating systems. (I tried and it works.) + +> And then all the distributions come in and they screw it all up. Because they break binary compatibility left and right. + +Luckily, binaries built on older distributions tend to still work on newer distributions. At least that has been my experience over the last decade with building application bundles using AppImageKit, and before that, klik. + +> They update glibc and everything breaks. (...) + +There is a [way around this](https://blogs.gnome.org/tvb/2013/12/14/application-bundles-revisited/), although not many people actually care to use the workaround (yet). + +> So that's my rant. And that's what I really fundamentally think needs to change for Linux to work on the desktop because you can't have applications writers to do fifteen billion different versions. + +AppImage to the rescue! From db405d11816bb4aa7fe21ad186492f71e043c5be Mon Sep 17 00:00:00 2001 From: probonopd Date: Thu, 28 Nov 2024 15:36:54 +0100 Subject: [PATCH 544/544] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 6adfc803d..7394bc752 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,6 @@ Example: Imagine you want to use the Leafpad text editor, but carry its settings ```bash # Download Leafpad AppImage and make it executable -Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage chmod a+x Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage # Create a directory with the same name as the AppImage plus the ".config" extension

HpLGixP& zLqM$S`}$$?b#evmO?cJsv$@7;i6?S1?^iR@xSD&ILmTIamD@&CfFQ{L0%H|7;|o>XWCS zH$I9Qd55|4*KrFxQ9ttRzcp7U7(^j)R4LkZHy}pvygZd5zmMa0wTRedB zJ*w-3fOq?x%lN^9Yn|Hc!G5-_VOxLJ<`;IzAjin;Uk3KW%KMlA3k`VS=b8EhYOT>9(TT;-bp+{GoS z%`o2j4&0giY`P;@{gE7-H~??!I1Q9)C)5E_D09iI(&=Ya1uZ_FcilLhukIRBw9#L5 zfR*R_b+%h@V(fiO63x~Zg?u@P!r-Iwl(B!pB0p&8zoF;KAh8ls;LSD7}XPlj)N&bj0IfG}ltPd2OtVZKOONcnc7Z9N>JNjE8Jl6Dt2JC^p1CiLJab0=mkTld zHC?L#eJAv{(${LZ(n(*whWaPmr-Av~`9@gNo4@_@?=tQ%ylD^am~V3T#J6&bnl{Go zO=ofc3_jqsFQ(f31RBZ>W+L|&D3SY1CrRW^N!*w5B<{DY{i*yhvv6>jKW4sDuckCF zBlPcVnfYTrv-ReWF)&qhT>cn~nLg$(JbjGIOds<-hMPZSqwFy*UBi~1HuLiJe$UhY z0qa~&L!6RIWtfGK0j?aSu=Ids)E1gg7?^))V z3v5k{@IGc&(rJBN%fePM!PG)P>}U{E<8+*gE-g!{z5H~qUT*E-iQL|U*%dj(~ z)0^bceLGWj-GVl9s!&R%$#pj~< zyyU6Gf8dRbZ(gMQmwtBGXy7$|#H02-epPySGY{L*#=B0)MC0ON``SP=5lx{Hpk4m| zG50R;QB~Le_?($Zm_YChHbPLUiH@2eYDSc#l!wAhAd`e=2=Z14C~zj>B}ftilliT+_C7O{fRB6s{oVhs zA4|@hv(G;Jz1LoAeZR}n{2KI$)hY&Vizh-!8TT1Flbbl2Ia@%7r{*yJ)IzPy(7{$=TC59Usph<9N&Zw$pGy1MyZWN7)2BA- zeDXSfYHy-Ay#w-&Zu`+Cd}N)Tzjx{L1b^ixQ>efTjw8WyC!{YDHxXGS)M0SepBiT*@WJP)+*721nVh-uMaEo-)$77sNdd*w z4{cT>qw5TjhQ@DO!Q+iAWma*W&T?!jV1@uTsCSq_&;ndB=Sa#c%o53BIF-U`ST+U0 z7*E@Zp}NChVpfe-rysVIAbtp`ritJ(fe#`+9MYMjpRQzw#bQumd%jQDhFnD3(|xJk*(2bD@4s1IsbWV1yO{+ zrj7@6MH@L#2c4AFl9;g3!BmA7ZGUk*&Vx9WqUrKO-p#|tXrW?;zsVku9FgmB!n8%Uw?xWE?fKR| zWV3EeGH;SiUVAkbgVhH8F;+{-C#T>^0G^QbQc~|SY-1!s=f^X-0YOI5ix;`Sv{FOW z^FUFscElM+LR7m{7M8fJZ6RK75F{I12@I$j-CCd(I+{tq`XbDFGKB zKsT}=8@bM+>9%1wvd4-`{&kU}aF&7qMj)~>FH9grG(mG-cR?rR?0F%^ofw-haDGM{ z2S2t$8Hd8ipJgS^SAv2Sedyk)u_HudnlK3KUuq9;x zg&5I3YKe7@5ORb?llFUgccqM^VU&Us3`~c}x?Q!F!F&_tc^V+Bh|=I{4w; zy3n+g9)H9Ra;G!|$3i>61{+{8>nR4S?D7hd(yxj|v!^He`3A#?=zL!M=l8ZBP&~$d zEFL4CX8MU0zeB=%jKqi`7;zTjf)4ZfP-_eW-ePb@qU}Sd@+kG`ALqiNe=Dj2#K5)i zDg_>-f3F|vQhjE;x`BS%Fc6^`vY>+$5^3U+)0Dy~Lv+m9JaA(_NK{Ejvd<|}qpM;V z_ko{(J4I^DPKnew{dUwAj|U0Xmy97eL85Ssu=rQP2fi~NV;vwzDfN2J1)mv7Va7?F`Gq8bQaa}V2O}xw5=0KMgVI)u{i)))^6;#NJj>s_3f zOOH%-O8ZAFuCJNHb9lsq7V?0aWOGV7KTL^o667q}2J|>m4-bfA9I0$c2w_996LvKT zmF^Lpnj1t=J>F5)JntCQJV3WU(Yzn6ns1Smy`=D8@5w)` zhm*?ZA()P$M7_jEGw4y$??Xj-JSkpZ<`WRrBT2yv==-wiB88F4n*T>uQ5mBVP<3fr zD;jGN7olaYL^+rI)G5v88w|jUzi*Gj=|H|uL(g~mR5O3oAd%p+~#BH8t8@jvnpK^zVvu zH|%UICC*)BCW{SIm~qL-%IG|@zB~gXD}|40JQ=ty7k?|U&-^xaN&Ky*dVNp2xEJ@N zPl$sbLvWRz>axMUNnQ2{8yP{i;VCBXLy16KX{m9za#$R$A6*)U>jq>Zq%d4Ku6Y=) zoK9i5K4)RL0{E?&|45C*brV%#PR~RnuB&3nNL&v=ky8R~b@n&mb6|2;x~PeId@V_* z9!SK>3PiKDxO>B`Yuqq~IZ%GT}} z-6c$yRl9Csh#ai`mQD5YyV-`0a; zbt`7aZ7Jfng()~ztU1PmUY+Gv#afhK6>10hRi3t!U*%|<_*J$R=2uqjU;N6V{T;4S zgJV@c#umVdown9YSO6#Mfw8pciCBDTam8#a_04)c?${{n`V@b^^7$DCpLwb>JM%2* zcg25A$eaqN`*l@w%xBk6UAh`0-Jp9je?O7_ibVP=zBTFGMoc|`k zAZ5OEUf#+H8RhM!*?r2}g_(EMq#Ja%F1@_%45j0%uSpk@&l38Hnsj6GF4Kq8j^Z6E z1?Nws71CRP9%0?2;3%u4q@%99J6(eas2HU{9rJzYfoeU4IYgaJvDXAAP%aH#i}Jn| z9ze+O_k;7TQ85}z_}c_p#!1RozHW>Zay_=k*XX>`#?H&$T7vgmm9fd^6M8{{UMcTWAPVJvYp^(58JW#1*eyl>O3C3ho*(>$ z^l+@XKU*1lNqV%WF*{n>Vdh#x=S#H82cIPlV&$BqT%c8XbZ~m3RjhR3jA-2>H&#@1 zgI^gHqXcmsOlG;psCjb9+o!vv&P}IxDn^*$;T77zT-<8{1YB3=T4-$^9W*y$=%ZkP zmc`zKwi<7 z8#EiKw|o{?(K%6l4gpH4ODHLeIf^2%foF<~UlEwXI1_H(6ZFI|Zg92LC05>Nbq@K7 zRSe8!FB#$1PkSNlN~T-=%{AoWQ*BL*ALozU}WO-M!q3$7aT{0^&Y~I>sSGv0-7z1b>1jxCmfxbkChv5!=nEP{b%JqFu$*)v4G!R~Y%jlpCcW}|4&>9{67fDSn&a1aZ$ z%)3PjJ~|OGw-ncS(p6SGG%5Z1NO&y;uYqeT5|S5v^>ky`_&4m*9)cfQ#TWRM-n4lj z{m>lz%{kQEe5)g3!*yNk#athDA<5C`P`>7TWK16>$>;B;a55`bp)c{X2e2*Fkrxpy zvkp%I^pD(jH%^9GcP8_9DsggqLJgOs4jZc7^22!CAyhkuJ`D*EIn;R{hff*RVV^ij zZ`|trfm3P8?@;2DxT7B>PAqUv<)}8K9{~p#>{dCc^=H4WJVA@rm)*$XH%@96x-lYK z(#d9PiusYGn4d_B_4_%AVe~z?E?NBa)m_%ZJbp-`EWIN=!AJ7kK|isCz=jiOn0FhU zAM7XW`zZh+*JqUNfCZ!8+A`c?_Vq`tgUR0iodZR-Px3?Ie+!=AcU=2Xn%)J690R+M3>vL zDo>Fn2L3?s;Mm=>p47jGBpn_CUdHj$a>Pm-k5zjI=9+@B&MH{g7K+7r5)bW%j%m z*GG3^%yH7uqemvQt9%nbU?Fn?_TBi6)TWGNC+P>gOOn@7csK86DY$44M^1DHA&+@P zu1RrD$;7#r!Z7`+B!9v}!{Kld{qN(UEIX0>^TWK0szv{Q;3KO=e^dpJYRYx7PEzt{ zNpUL}nLh2K;khiCqugfeaMZXg^h37U1mvK$GR30HpgoNrQ1%hy;VC!a=7NEGQcg~{ zWe3YKr2}<~+OO|H-NC$kA`1RJ){=O1sU{xf7^x7hJ;+oD(P|18!(3kO+t)$l)q?(T zIr=o*zZQ@4337EdF6HA^t?3Y!sETV&8btp-W}0{#$(n*e3(*V==cb7V@=$hG(>|vo z&~P+O{PG;O#&9%EJi;!a|70drWQEzjxn>W0oo;h0UQni~C|Lq^;^JpGa_a;}=&>~4 z1@fM(k4npEB`c37A05nU#Hr~O$)Hi5)4?CW#^%PEI?Xa~kf-bjf&UJ|j%j4FSb;XC zgiPLV!C~m}y?+D5d@C;`njiG4}maVg65t z%^`5Y+neKjylGn7^~^_T&gam=7-ez61+2es2W>%=WG5tf@Mq9lj!Dt`AQ{t$8awX? zv7~*3h>=qGk|y#fPZqbbxpQPpayHP;2_V`NCwoUPugYVif zL>2NW6&e|zQn8WoDM?1gr!>|`hJXCz`lY^ZYd*n~#NVhNAc*NuP*oa5QT79*iaI<#%zCG|L*c zq84gVEry~sjKT4}R^hJdtav8FS>fwWILPt0POWie8VpmN%41hVTvh`dVdciJDqJA* z!b0%&)OXIl^ERaXr?lP43Hemd-U*L$o%V4+_2JqeN zI&`Ihkp*Jv_MO<m1jl0OdbUV-VVAJ- zEQCaSg}bHTsEN28{RnOOEyrj8dtpT!F%fT!kD?}tUGKe?Tt+8qD=rXDk?8pn<@tX0 z(P>1M_NlLcq#vdJ`*;tU6Zk6h_KryM{E3F8-fpWu#@YKZ9{Q6ZoInJ5dk^0dBaCPM zzjWRTt$eS(St4_+cd{GK2mUV&Jnmcs-)|v)I>=@EjUCjeW}CS9b&}?vw!v{^zS-cT zu&pJ5I9AZ=8$dO|A&+X?yWr!v1w?bXGui;Sv6{GvL^O86g1e1J9fyzf>4P7k$5f(K zZgte;lHe1Q$v}sRA9fS(zn8!8^L;T~9x?GVce>T_Qc3VJiL61*+p!2Z99HjUMOcaJ z9qf-MdaYiEEysC+@YdRi`Z`8mso0kkDvEg2SZfV#1%{epGbwXj zyLl3qh1$sf5YEToD62h=S=@-ki{+ck9UyJM-7NT<1%I>QZ#MibgujK_Kld}ok!;8% zhj=ht1@Qm866Kj-oao)ZH#kj3K3 z^KmXMsw652x;*s$UcNZ5r?!3!gn5BG8swp?0@)l)OrS@z(_P4E;cNCNx75fe#7pI86G_f4!R_MK81o~_b1Mc4v&2NoM*Ru}9;|@@PIYMOthlCwrKiy0 zm_swkFooLV*YL=~+VP!yK-Ck0&M9p_++g`u#8Ui4$ole4!8*9^PxQa4TdmZ=Fa9gl zqvB`lQp_Z1$d=aLn=@{#YlM5Gw9e(pDZTe6?$U_UmM$O(P&Y|^+BS-j)2AI+VnC8& zL99&My@YHLY3L=|O;To9;GpCl;V7M2Q=H|#H&WaiHuV6>zf9Tm))jGGJ5510Zl1uj z)14xE!2YO*^H{Hyz__~<-z;4Y&&`$owfMUgCReRTbqi8{y|i7EgerV9 z+>~~s0gZRcb}6hG9ZCbdm@egScjwnRGQyJj0$OH1!2^Cv6^xtRV&Dcr*T-4dm01iN zN6{{74~3(q;+AT&QU{~Y+r6e6n}{`LxM}oeOvM|h*_4k6UQ?u-AtHA`7ULr_I^Vr* zuZzg|werYt!4Mg4G)9J-;IDa$v*IUd&Wh3L&WhpPBEv00WOxSL?+*X(f&AW?Sjiol z9JW*#ag~wJ=lG6Cdl7TaC#M-1;1lEq%=`3d+W<0K;rU`!F%MBq-HS(eo%!5~*2_M) zUNQ<=80$zA8Jz-Cmeou?VaCd_=plGZK7rV1V-yK~SY6<2YjEi*{^)MfKY>`oVoj6& z32DsEc*?e;+=hMK+U{1iD^=n4>m03ZcVQpTyM>P%Mm#DyGB&y@1S!}D+64bp3^#H| zfo`Vt4yDQg9Sqqz797T2b%fiE&2=gMX!Z~u#CD)avH)#ngz$lC~`^+9)l~gx||ZjK^!X61Mi4# zP3a8>w3|Lab9pQa)~o&>V$<%E7R2yvk9f}!uAfE4tWeRND?5EBVch+hx?vBVOCseW zt0Tg~>V2of$BZ~Jtr7V{ysxwsSFAxN&xrgH0d+J>M6SfEi2N`7Qz8FTz+~Z5*Y+XZ&9;dAG0Wf+_J@s2c^&(OPR2q6#8di(VyvuG zRmdx;4C~?FyTeUTh6sC3y26SVko*PuR?DuC*9c7K8V@&FD_&Slej_hzC29D$K=aXA z@t11Kt(LJ=wizRG9m{T`K>Tbu6*2~tS2U<@g}jMfo?sPxXN!Qf-b}<=>pQ5n^;4Hd zkS_(M796r7#U^Y|vsAR+r$vSrjE@YrzpeYu<aXo;A_-&d6cTHK;Lg4KW}OzDPR zrf5S}T3~2FE^u&OP(yCIN*j(|n#|4$>T#US&5}9+*0z&51+Wy?E3G?D!SmvZLjIg+ z$$TJaSD9NF{hA;K?iC17AA!2Uaze^zbtE#o8+Fh`sjbk1VZF$Q2WsKUKPlZ}wmFL! z7Zrw@@8?*{6fYRBIe?CL5o5U&9Au-Bia97zRIJ3cf{SQ#(b-L%_yBHKSeexs%86kS z;I`K7BDZ?uwsP93H0@}@mCLHv^@Jox%#4M;2)+t(LqAC85bxbpP^av^e9f8TYQ*f2 zFQ$2i=oO%Nz@i@=?-FWj7NnTcljU8GSn(xvh%59(BI)BJBZaqdztzeyVVY@>Ww@TSY5>!q?3M#l1b1$p*;=6Zb&lw^R58{ zji?_Ul@pv{4YY_$kpCl57IER34$hJNU3ktbw0k$j;@mGREfv%`bJl(Xo|C{g zAcCe#!Gh>pFiI{He@4e+??~dYIlnj;Y8#L|3B^TkDdFQtbrYNoXXPgfInK%hSqDPC zi6}m=s6)+Ybs~^tJ^sE6nR;erMkuI~fvDjn<(7o0A_wo};o-Z$!@>Z0JIAeIdWJI; zN8*&0mP-y|xs*@ye_i4az=Y&CQNNgFD+ziitZd$2DeAHw@WvgaP|iH!jr<|$+7x7> zNQvwFjd<8`S1>&6j@noX9<~~O{eQy4`Y}7i!_LK=z7-F<;=Ay$=e`3Eo42Wx@1J*E z(Dhw-*vB~OZW0g6O;QTf1EHahS~cZUG#&K&Z{uPAurZdv!;VPcVSOAAJ9lG@<6-Bf z;$cTzf`>h*71zX4@UYKJ)?N&M2Ojn$*6pDmT^0|^oDPpiVqNgCr?jP45}ugj0f+pV zMpq{s>}~HSajM~LG5|?`~LzS*39v+sEHz^j_%}`P;O~;7j!Tz zJfE|SMc+C>L`>R|>KI{qlxlT)Pl2(c&Ku)sarLtLoT!JI)GHOtI`VIqf?3;FFr7mV z;UBA6^E?KBqZq!m6X+DflyT7MvbVnpblQ{xI?dHVr{w&t3sF`?p4N3io_>%-o;Dkj z$kUZ5Ze=%T=y=oRC?mD&_|^_KJO0YSru)7FY?|E_Y?@7A)4y=A>5r0N)8D_^1#J51 zdkk!PBiHYlt*K-2p5^*jOuq5@dkK*6bsL~Hn-i!~9GzJg7;q7BrR2|dVLhbzFxHjN z4e_PR&vV$*$LUrZWIRQbBuc5BluS|rC%Sfup%Xe(qR=bidj|*| zDg_5`y)oBtDM+;Nrd)$|%K+M0CLwGRQG(OVY!MsFK%!D}FIwMIaH0=zoG25U2`4)8 z7KRhmZxcGysx28njci5Tl9Xyv5(7QV2_sP#bSRmZ)Hmp`;UXZ79x=_M13ZGW}t(;^Lah$fvi21w@_eb=yDa0zEr7c*XE!+_6 z4EH=Se;>l-5DzyUF`onQ%Ht^7Ci+|Wd>V@dos62CAeI3GF>FnkPl(obv^wCllf~DX zjv?JV_z#S;)ug>b1YdzRZ9R7;WvI`eR_TgTEO3G7Kgh9w@TQSLKey0%YY##{b3E#! z0!+e)-#nSNlLx}F`0A}3B-f5zIfK*$RgwvXxuW&6OmLXwK)?aw^EV1iESZdy_Y~`v zjl-vH1qPSWhO5;pD5a0)n&|8#iV|kmBxp4p=N^(2DO{Gamnz56l*bU7Gr)#n1PV4F zcC&+FH`lav#EaI8OWxtwO&Tr@7}xVRHxusm?`V_$StypE%zss2xYa`L+`sW<{N2l= zd___GtWcWXZ*yc@B13H7*ZOmi8cfrEm|;o^60KU$X~UxwIG7W5c^+XV^8{4>!9gxh zTzrDa_PwMko?Zk~1p3w~E_s$5l;E}t#lyh@!%0dK!K&1rv(M=`$s=JMWr*HXu#d8q zZT~N%L?-LNbXb=WgDh8@)rIknj*ixb-1-~K;eXy^N>#YY`nPfrw2_)d9dGoA&L%_1 zEq`vppzS%Hq0? z9S_+i{yxO&M4(7GXOJWloNFlw#KpihcnbRgmkspRNI)?y(G$sdS_7kR|6jvTUeWRG z_{oz={N%552%{$YzqkZH$=4$!17+yRb*p1>7F`V`uHgJ^a@Ubh3v#0nhDbCKs(FwOm*n^>)jaS!@RFyrUkv+i;U!O@m+LjL&Ui_x7{g4`w&}8ni|`DT`kmIH zNxsTU@RI#6#Y>W(XbK)wT!Q`G{G!&fCKm6C=Sr-9x&II1DX;3s@RUccAw1>E|1~^i z2H`1Z!QS!jLsRZq^_^(Sot%h9dG|HKQ?AtUl;+CI<0)5iJmrf21w7@-{~n&QSLOc| zJmmvj@RS?>>)(l|9Q5kt@RX=lMmU{zWAi0&%J;9j1Wx(tRXUs!p_DkRPBdMDrhMwE zOVE^$T&1HanfmCU_ED1#rc{ZK=b-kNCLK$O(hc7ET@ykn?|kALp_E1rrObYULn-IC z!dCv|WW-Ohjr`|G_SYFaIfmUz1y2^zt*+q7>)~$jgHTuSWDmN%p(}WD*$KQ|+Z8U|wNIph7#;K_^o?a%L=SrH?*@TL{|6Kg!hKN6QX zkXq$9x+RZ%FGfazwJTzb-1sB7=wzQldy%g@2N#l@3@c<{zxM>>v2rfl#f*+1Grq^3()Pln&eh~R>#Ayg{+sJ3&$Zxr*4vFx zbPvL2Hx$8b+Sw0camcM4O97wSsElK>(}U}|Jb4AWn5^E`I_`_VzPtejX)SvGv>uki zO=js=RqYh*DvZ(e!i^U63sQ#_IxCz-X_A~S==wu9+W+0k*F>93z9ZI>K#1H{MgJih zHm6woc$79zzJ_LNi}>t&Oyw5X?@=^|_-e#sf)&J*-$wcw#32X~_ks?J0QO>)b{{d@ z($AF?i5rAtanxzlxr&v$v^!7?-9HaRt{wbs`J`aquU$?4m@VD_d|IruvS(=P*9>(2 zK`u5tnpS!8+ucRGX74W%T2o88=z&i5imtx++>RP(5SR2pp2r65Z^+8bYoMWPbMwYj zdqW%dXBlf2D$Ne64@RF-@4UX|} z0`A1=oyWyoWW&ek3HtF4)!2XiJ5IJ1I@TP76+nCAUD8HcJi-^Kdo-io#Z4CfcsJh` z)X1X806%tNAGwH~{-E|C6_j;;VxS+=|cO zyOWXH!Qp>02HeYs!LZk<9M-1B80}Yfr{|=x*GA(rjIz=bynTj2X(hQ>{~L3c_FWHDs*qA(=c>)gm&{^q5st zLII~WC10JS|I)4+#1>mxOY?cI8qM_IJT zo!AB#Qv0aTdE|PO!%}_~#ociz4b3AH>$`WnCumZtT@_h*aG_2U0xgb+IZq%rFi)_D zFTLn|vG`)OQ!O^aY)Xq0a`E7ZiUGot1@uNo(RqBsK|kVn>6!H=Ws2AF=H;pWD5cnX z7%@;VVx_QKQ#uufP~u>a(4&?nE1M^33m*&{k^KbhQyz8D37+pAiF}VO$9zw_O)mBh*{p8ql<$V+h*{P1)!|D2 zSe`_(N;M`!N-Q2rXT69$B(Dy^ikjy8LJBUN0arB(@i&{N>2PmOFU*4;vFsL3OFYN= zE-c3c3JlwY6)b5ve~xjHYUurB0ct3b;WA}O`&RjH!SR*kPn!d~sLZd1l5r}lNN{$JATNWHO!01~L!GAR$jf`V*8)nRcZ;CEW z+X`Qb{^VQY^K=1^z(pRSr7%jklg0fhWnqAFw8L+5Ssu5qo%{zhQ_a2VfSa`qaD!O( z-0Ji+=#hw|mY5v!A;CLX5_%+DCcevZpPYZ{c(XM02jpxwyPDg!38rzFc38Ca7?yKp zOjPp1xG)Znm~)0mrXfhqNyp^_ZzWPZV}t~bh%-%KDbCQrOZ)h(1iL1jRnv^!*Ik|TJ)8gz%0e@-fj zK3OU$TW}c(obZ(*6jcNf?-p`dJE`6H7PlvT=lLT)g4`TdmgmfOVX<-NA4ehhU9M5u z2R+mLD(;sX-O3KqiZatPp%oEu8(cDorWUkEpicCoX4Zu?r~hK*UxGD4@e0B}FbDmMh2p$lDL6Rs6&wLvsU&z$0dNQqg&b~M4j|)ccQ24&MXePSVHb^Ge z*wiO6#G+KT1!Eqwz*Piqo&-Z+99iGso*T9vtdO$LL*QqoJH}6zC|6^d7kX08Kd=S4 z)zU00Meu=nDsMzMXkllpH_U67(&EZzbt%dJ&{l{a*zX?tiY*(iX8zWVY7@7zjK1tf z^Em#^XOE?#9pWOH1pR%O2A?^C&)derU-`Vyw?RH^41~OXdkDH^S;(RI>5(Jow-xtd zMwMw8N=Fm$5#C}k&r#lBA1?Yz5}jw<`Coa8Hq9J_IOF_{R4u(o(P@1DcGvjn`?QbE zPKnbb9B?bF;pi+$Ac^Q#9hdk|=spw9;1Vn(Y;xW**xNtBecboc;D}5R7k=&x%Ek0B zxT9ddkfR-!0eDuF#d~T{|WDi;2LVyIBb=jQ`t{wA0u5ZFHr!)*#tkp z5(Qd(e}uy{fn%4iOcLJ7<`dW34Sp2% z`u+?GQ ziA03LOO7Rc{F`3HR)p1MLA${U(om%nxo5~PgO+;i6;!>Thrr^q@ZFNK7HY18o}zOe zapXCSZG1+%i0D+4GyilTq`+5uBG@heoan!b!WNm~ZdhE5N|6%b>*oGbmpb#$Kw?M& zzXJ`*3j=Ur2`eMa;^O;IH;e;q4zsK-E=SJz7xHj8Hi(N6gXSq~cLv8~N@ca4q8Jn+ z<}TU>XZG_hT;Fm1b>_D_mGhV}zUCVz1wWt_i4D6F*ss)iaW@F#IMV9*NE0jXmgJL0 zWz7H@lc&g~xi;5YW!A(&+E!t6M%wHAjZ#s)C_hBUQ?nqcgP*!4 z*ARgbSH}$<2er@z^g{UnOC{4vDJ08NBM;!~B@94sAN~=UmRXP%Wn9ynyTNU|kcQGz zZw7)P1GA~Dm=Jd6A{ke0(f?<>ImXPVP_q4?zJXsMJOT&aWMm8q4#Xk9q-Tr|7K{T( z@LOiyy}rxD*877+BTt8d)|fCaC|?l;=yTd~hdI3FVIJQHkmn78?_II7)ONix&Wz7& zl1!^+8WUFJcC#|VA}-!W5w_AGQFJ8Lou&Zt6rgQwGPzg|4)@J9(0J854$o(r3FAJO zQ7^fRA~SbK?_jB4fYfBgKnIb7+GppX8D+NO@kXMiBNZ97lR{6UW7+Ga@Hz|;BOfAv zBtH>3^~Fv@Aex7-p%&3;vPSF#lyf(Y=E(^=`FI1fsFMW)z9{U16N?KS5Wd2aK1nR(9b#ZLjoA~v@pjT{ ztwHY?c_J0P&6qq?vLmN&HtYvXuGsH;*-cR=$u+Po@rmY_X+1|cnp_)C#mNxwnG=dG zxC|)4hU_i8FjLPXDULe413guq{R{STyP2Y%d)FrXHKohx9pR+qeHpf#H{nhE?Hxj~ zJ%7u&bqd`=mQ5ykLYUQUg(*6nAP*L~-RQkmZa0zDNpv!VD$_Lx;|G3 z86}cChycMkzdR#}{X=KOpQe2@&tNzsT6^N(sp4(nCvS&G1K`Z~xs+dx#~AUwD#^5H zGD)weXS!)K)+6tt+<8Wv6n3xXK#+2J*<;_)ycT_s(il*+-lUfoK|6e*a+EySg^iS~ws%@$@#iL${V$2&YA z+rP%0Bw%K|Vq2M{A`|^+8^onT8BAnzqdIV~5L1ym*q@fv&7|h79Ar~R#)n-iF2eIu zae0RjK^>FmzZE9BI z65{CL*0*>Hx*-#R-up(MK?%g<5;$NgO=Hwy1K@;zt3mqbf=Td;zO+f85FZHUj4=j~U$ReXTTQJaEEVK{vN^ISuO$ z>%B+m$0p9{c9Qi?4vcJFis(W&eiy#T_)W0$o*lvD4+jOAkM`8hT~rj@E`qe7;^x1L zXx>bW?Tt`8(J@I}y6UkN((2em_JM(AaRvEoGvU(+$>JsloB_w%ZbKg zVW}>kC2;mN3n%h)gh!9SJb-s6Uq;>8NeMb9d0C#ktVmuiOGxL!8CX~CO{aHG}aK+Ygd zq$O2fVUt^ZgK10EcWIJigsA1r;li!#AqPdA3fgLo_|C3&tU}I+)JJ6B({NvV2FCv) zYyjkm$V3jBe*Y2E?=MfiZ|3*43%^S$$hobTw6tCJcPV%sxjCIOBSVE4IEH6ac@6c3 z=)ZyvjcY2{F9Z8k&VHRS(yyiLmy^A>oc;O{0rP{{PeB>mT~gm!NlLa4UhBmI%TI>q zOKIi6UlZZi3jSm)TrcO>5?oK?*E0|`QqJSj&%qxr@gLK~#pr*6^{J8dZbld6=S$33 z9J`V5Jfa^Xcc^1KKspf@jWwgJ8DeK|`bLqA;}Onzv~sU`jXk2hT4+PsR>>rA>l zT$n?Nf-^{wQ6n&-1%;(nv$hy`(F)v3y~iYz(x1@YXzJ1)e*sq}G`gTj#NIW%KXPiM>v#^dwoeaEZ^+ksdDDM_yRT z-q+i?fZl$Q-sVZ@CcV8f`F45A+e%g~?_8N0PC#gEQor?DLg|(45m@asBf};7KPI@3 zy#eOXl98mmr19bj%1i0o*n#e3tW^nXdJsOpqL&^#j66bu@^VT#$VNV!TD*lh*5J4x z!4&21G7}!e$1<&f{}nD#P9_M8?h))^jyc;%W`|jTBsr{Z_J-(#srGqP3f0hXA%$PT zssclDl&F4zD9nm9aUq^7NotJB7gOGM%N@e(jXVqd^eXh7YyLz(&v^)qgJIaZlx-lC zE&7X;_|nwBn0$s~m9E2|LnsaQ2739CpVj%Vd9B)!Z!75MBFMMA$cGLa2zoZ}>)CwJ zH5(}DW%6L7h>aLMkH_^qo=C|9(qf{ha*@u*)RZ{Io+WU38n)Qjs+#?4D( z@wLo_kOmDyn)X_Xh+eiZ!GqVYI~O?@k%a(cNgyU zHCnKZA6%kG;GLx_X+vMpj{w+^e?kCsr?=J2XjB&z1e15t=G#l|U+KZ|l7XuZTSpJyplVSih zSt~9^7oP9r-=D^v`Z-_i#9%t-Qy}Vw4oSW1l^L)!m)f#$QlEWO479>LYH`}KjA(%- z5B^V(q)`k^CVzN*B$7r&T!#MWndL*E4IWM-l(eMmK#yef@<4=Bmdk!ZK5Rwj0MxEH z- zqSSV8vov*S`P{T2q92)H9OYX=C~z_|+oI1zKSBthNSS!Elt>Vt0paz$l)u+4Y(_Fd z(SH{)B3@YAo$Ehtd_Ktx=_cRwyL?Z;BEr;22cWTDtP=ktlvgFLZ3r}Y7r^re@p-!b z+&8j(ZaS2xA7t!Uu%%ewQt+ePK7ws&_V!>XN5l{tF|3wT(YneF>RlO_akoUq%=))S zlH0nA{&TEsCm-+h?PQV+(ci$5G<-{vCrDd(m-={W4SiXdL>-sLl3AF~3zSf3uE7q+_**#&8+BF{=)s;A$-9Nj{Q8 zb1DRfyu}=SJI4AAhl@vjSSV4BiGhvD^9HQTnWzj${&>&ODYk5HrUUYhLm`lz$`LW! zXlj|ofCcp>#Ggs+k?738r-TlC+Ezg4&8GxBe@;TI;C?YMU7&GLL8S}1?Y2<;P=p?%u)##!FYR}7W1V4tzTlq?Qo zwxkZOm=4R|TNO0=bw3o4R$&{7UPz61h+2{XXq3BEe%dxD*`P-FS(t3lZt!zhvMtl$ zvqJRe7peT|P6}%blfy_RJTc&c2T&y<>w@wO5M7V}t6@#4k|m`|HCQEVtR5`-WO3($ zIFkh#F2HXoS(4$#=u~{u0L6Oj0{hVPF)(2z=54qcDR;p}f%wBTpZN zmh!n7I0_R*qE;^S7CT{TLn}21cP<-_IAgT%0_rBVSgBO^bJ#fq`268U*{7x-pdc?NQ`P;^pp2{ z(jUdG9MN2X80}O<*NHwUNpBRZ|mxMGUQp^Lq+tjA#5Lt2mVFmkRmB2 z&0Rsx!vsSKpjxY?+A0SAj)L!zUZVeLs>IOpyA9qxVr91>X?=bT0_3m6%2C3Qv`oDI znU-FWtUL)79SNLV=X$8{+2}wtiXX9(ydnB`AW1g8RF{IMW8%)gIyg9WY4lw-zqKAv z9l7uqz616UD#rjAo?sHB?cG;F`})bcXahn98WT;?iq@7RTQmK z%ffeUO0{n)uB?mYSUji$6qR=6ynMJ=Zb!@ip>p}~M{?Di^7Ddn-qp8m!65?+r;AQC zmGXI5LwZ(DgL&9Dq-5C~a(K1_#;R0Ph4r$B958CN*Ptq`)mOq2VO ze8$}AGlp;bOnm_BgVs*(;|q?U{7bD!<3Jm+@PA&pKRog+Uwt4DOZ8h#;OUsC=CXfD zK%$q-U4TRtW)#63Eg`dlk#+UB%Ee9u1|pksqu}@uj^0HUns8ajG*Hf1&t1w%Sjvgm z5dQXKN9HWzHPgXG@HS>yfG(YLIN~zPquy0MmEOtbZi$)9JuXIiYq=3cx}4_Q$zL;H zgH0?=^#8z!uufkZMlH=h=Uxya`pRdA8JXU|t(jt@6QUFjwFToXQTz~jA!#fnuNn_#Ivob^Uw_qp zsRi2GW#s%{o6g}xT!b)*i~oo|>!I?w!c1nyND&I=8k0i7Todk~WW9gegvHq);Gz8& z#9DBAb%xovfW+_Crr~Pl9Zuy;xc$2D`E+Gd{tjhNxUpOQ9;b3Pf4%toQ2ut@xhq3z zCJ2ai$Yv;fC6(2IU`?!?iTxD{oXO@3ob*Sh_yehT^`64TPF}ygF``rGC#+3l$*)Q6 z5|7fPwLTpqf8U(p5&wX4W~>GosZsde-DCV--4p$DLcW!eEp)Ak73jI7+=?=tg;6=! z8&G)52H_2gW)qiH*+X~|%0#(;SxBIt(`{BHsK=i@CfWKi?|Id1#G@0eYoh;s)cuv! z-lN)b(YpadY2(P-$t0r8K-}kmju{4>J1i;8w$|ez2?P-%h@8U=qEr<=l#agz=wTPp z<`m1d*5MWA>#?iRwijse-K}RNH|BK725L3T3U7uFnJ&quAd!s+WUo5k9heQgn9Ks- zHi~{T0>5gFa;?DMoUFfziqM~;B2ge5bcHzupXE^+#lWj3W~?z^MvpqornQ#G*jf2X zl<$kJO2m%d<5xsK#8t-3;?cB*HH%Z7Ex>~_jwDfvWsjOY7?L0pZ`Ut&x_Hm`1!P@|JLtkCcdAAjM7C@ zYJY$*%35_EsqZE%2Od_nUyFHCVrX|~CY^F4xAgfZq9 zuP62XGy#5j=Kmcv0;P_Mtn_jWJMUJ_>ApWj4D*}+fZUw8D)<|`x64fh2n{N4&zO}R zJ$NB$A8IOqd*Y(as33zr5G$?z249rZ<_xpJQRvfqh_R;o+*o|7IHB&0Xm#4=Ocigd z73Kegx6l@SS~(qEfTyvtT90r@D)K;WWG8fhyJiCkgg=ZCPi2e)T)E<(4m8G~aXuYht6)l1s37Hq5t2GnSo(;b%#j8!iyQ~gaKNHl89I+e|oJuWGQgHlM ziLxPql38#Z4TU!nS3DGJj@|(?^owcw#bjEcaZw_k8Dy7Tr$-%_hVo}`Ja$b3sio>c zm<^btw%{~55eU9a)Mwznu#S8PTD%s7>h1G!3nDb;Ktj&s*+U4-v9R_)+v2bq^6h#L zl6r~;dX&?%kCAclPd<$F_DsTUiFHVYk42etr`)wu&Nm?%jrJA7)Ih$7z0oFM5sGdB zL2>pme4vf=F}TGXmf@YgOJFy!`&N*nMO$awjZ4{-AQ(<({K8+D`8?(@InlqHQ8u{H zIjRNvh3RSsi2i3uxC#j#rG}zgIh9Ns8u)XZFr6&qoujRu&1`nowHA)mfz;X?`du8W zYncJ0Mq4}^krTQspqJqiZhD!)Ed9-WxnD&{4EW*{mn2vI+$Y?Ke@K#`#~c_j2<4Kr<20qu%8D44=8`Z_Ema(kSy z=+kF#I4QfEUvwjt2x^0;5Ym)niJua6vw1sT6L#^x^~_RGCAf>~=N}|7H%9T2u7Q$Z zgN=oQsfW1!bah>catxL0*sfBEqLnD0HBUyBk#p651sjk)Vf^~$byN7MQ-mH}Va4S`Agihav9(xUvycJGL&3%Y~KvKTKVJQi_d6hQ0iyG#C z87=1c(-|&hcl7fZr)=o-iTyKpRotv9%`a1{Vgrs=vyL#p?x{q>qIiV?7)&LG1iUwg z+5^9n!=vQgkZ5rNsJWoYhgqT17E&BeY+g2OwmK!bd z;hdy@nLb8v;JB3oI7HALZc_7bMskO}h(JnD&|EKtzc8U<(%^jzU2;511h>ddPttZO z$>(8YpQ6Eu#-ftowVon)@yYS<%2cM}@t?As;f@8?=6HY&WeDmn_s5km!CC7L|Q&6UguCZ*^Y; z>^AI5&F~}-ki)uCF*4G~tZWji4l#Bz2}&O33^^23aZt84dnT%cP+j_*4zo;p1e&jo z{(;Q)L+N`=H5oo;@|a+QQ1MOl#Y3Wf6O587^d`B$M(rH(YfWr;M4$@Qr2O%RY!afe zb~dP|=}TY>^eTF4T_AxH22|QSSW3=P15oQjn?xJh8I7D?f!sM%syusHsMCFqXv<(k-arWkm~NR1ab;k^##8jG8(?1E!i4_E`kM=fxg$vA`P zzb0k3l4a9YK0zxm3?}a!Pp}Yf;oQ9bF=Q)8r5QY!{fpI1In#j}+nUE2cyoY{^ zFESs{M@dxIOt20&KbPbK`)|~*?a@U2rX}k)e0pmA?oF-VvB$d9ukyaG_4{lC)o)1- z@{W_ELYk0@f1vu9zok9{q0yWFD}@goWgm3AM0$r(4BIuuHWAnEDP+*c)5kP~JEBDF zR%)7ivUB$sbRcX5N8=23k{)OVHQX<#C@#*`AlXNV4saT5rdz5)&2 zUbrI8AWs_>NTU~d4w*Z#`tD&8=km__9`XTcu3vc(|J0>6cu(ipP7SVJRRlM*N7h3- zze!fql(gAh)BXU{4#l)jbxnKx-Y#kJh9+X#d%C6#bxpeh(|%C}X|G2WW^Fv$E1}2L zMojO-7sUA{bk+}w)WeP`xR5aNW?a0mhX;9YhBKr?{xU}lOyaD%g(y&IKc9y3Z=?iQ z?Qz(VxO$vnCbvPTw;n`bMlALq0!f1e>QR4KcO7c{a~$&F40Myj#i}`%mD3fd^N6l< zAf{N{MW-ayC5X>5_df(pH@D##=&(CjdZG=P0QQs@8oW@lcEKk~xMd$CMef-*eQV*9 z#eq8CY&Y(;SYSldDiJ4xf)nOrk}XdgHZ4Xzy?IV1wZl{LaG8r|x{og=_2Bw>q_OjP zgsQG!vk^&o^KLzE$G3m>s$a1goK2sl0yHloJSR5msOi+K(Kle?a$4e6?fOS`mk{5h zu(lw9JemW`$W!{1cJ>k20`I2-#dMoAS~Z_*L$C#lC*>g-MV(@s1I2L*)%H3GgJnDe zvieuZD~MC9sg11|=cqEYWOSo=re9*YME{5UP+v$0$%yv)ql_H07j+@!CH}e;cQ*w0Ur1JsGV|8jL<4Yk!#P^Wn|K<(Ic#2>bpOp`- zQySRs-AwO5dAuX}GIv1x7(i&0w|bXPcp?L)iiO{j#mcUn0Q{rn%W*29|o z91DR_;jumR&%wx7s?d{28?}~gLaS(NylC|H;G;-b+KhaX$YDQC>pN9HEW;P^>`(`v zL`s1C4mZePyo@ zOYBeI^_yZm6AjsrDO5ogymLA%gMVfoyDYGCG3Pvb(YGdRMFk(3n~T@01_2NU=_J@iPL_UkFJlt>?` z{t=hK>rn8I6v~Q;lDuv#X7yI&VW?yY3CajB5lSjAp!cNq#T14&Q>Z+8G<5H?aBL$+NTT$b860JC-0uwDn@QfG!6(e)B=zUT*uN`rd0vi(q1QOS*+@aGydN7oeAtTZ-5dY8 z--I#9!iTdn>J?a6!e*)HfNuxVjIC5OrxI?h&yB*^{@9sYi^`GBC@Jn4p)R|A&Ktkp zol)yjpSR!tuNqA?8^g7I)vP?FUfGWCICDc8wXiRT9I9Es4SGYkHp``cXxTp_$0pP( zVP$>m_S_x0(c$X5Jx^}^B%HC=A#8Pow~7t{Hugj0+*L7Ey zUHzW;^f{;Sm9k0M(z?T$doFkVaMhpPKeA|4Mzh-Q>hPw%!X{;(@_B1R?iOe6nT#eF zko9VoHM|i&f7=g67AzO`K`D1aDL>Dx&CuZar|?bo>0Rpc`NHo<#+=G&mvXwb-jQ3M zyJxui%FsP8mH!Is{-rY`1T_lRc6SP=m9RqzwQhIip3dFw%m}NQJ)o?gh3onXVJvB@ zGpKBGD7CFS9JwK9?pbHXdbCtD3j3fi!p2eRhw1-(FdkQSIFtrVvytjjxOVp>#hJ0g zAspakg0^reXD~%W?k0GGqK+o)fijF#2NVofpYL^jucePVvA>#I>)}JW^%;AFFnsDb zl*K7T)n&#Pe)CdHsZ}=N^JZu6X-H5-rBHUX?tmqA8I=4qys^xsethlX5x;%Yq3m+x zZgu8r&WzL0huyI9Ux#Z&p?;M5?p?W-58VzW;!tWFt-CNh#w(88-7e*vBXDZIGbG5#G|>Ayhk+s4Mp*HraWThoz_=t}Yu={6TRjTz3r=*r9BL zi&A)WyZd3i%`yTlDO-|*EGq(xKbK~1Jl~HF#JG=*7 z4QXAut>KMVI)yVzeQqtZP~V?fZ{Ow2Xmf$At~%2UkOT@GuFVwcVPSOTp2N-!J8iG`;xYT4<=#P){VD%H0VC=)S1u&aa{TP)BS+NK)4aY9PQM-2yeFn$h`VTFL&UFi_Ez{Kc%BI^N{Q)$YrV$JA)6%cEAoY!(=rc-EwdK9EZzxW#)8@!ew zCMOE>bNctU6dr_1#}*>5 zM!41r6|}?T?ygih?PtPu8A8~;5psoQti@092K?K$17nnp_A1q%H+jsO7N@-l+t8() zblA7T=Y<&`uUi}5comk~z6(2DsfU8#WQxptIgh3nl*fwm-F{jKL(jvf>^L#5Z@>A^ zP0$kdTGsi<4uu2uia^1sPs6qSgj$Ea8ar00f`Wy&T!jM`J}>NoBGzN3P&Zg5(tcQB zhAy^aHPozLuqb~P-k72KEk*U8?!{UQXQ1LxqN|SlVgFJ4b~V$2Wjqa^`f=OSuU|)N zf4HunupLSwR4cXYTU+c{5eIbhi}C&=V68~UffIs;!&&k0{qJsoMsNxmYlmFt_4!|e zbnmdk5cw272@jzZu#5;*j*MM!8@l;?#S2-OR4=+Sn`D<4&_tG z`RbzAUbq*& z9YR&c4*PmxuY!xM;hC>b#o-HZdwa$v`wn%|4-LvrDE9WB`2(#x!<%{wn=(FE4%oLq z`7~t-zG{=7(=c?2@C#~IVs_u-S4QrtqFwruhVg;UZwx3bx#REvR`q#+tgr1Rc^ zfrfeAkrCvihE8jamTIG~bgCvqM6CW?9yACw0Mq+F6o+@?*C%(!yw7J3|U1>!oe5P`W zXj$wnJPyh2hG#771z{=rT8Hq*jqS*I9TK|4TR;|X(#4>v)PjMEEn4lx%a77oxmeX!kXnI-ee+OV-z1NGf-8|%uB&n@pR@^Vx3&K z=TICJ2fJ7&_yn z42I5lErT&#EYDy}7b`LtS|cNsZ<s%+8N+m!S=F0+Q;tP0nB%Mi@3^ zYtPeq6F)|W07?E&d+!1t*Hzv7j~=!s#*vl8BmxXMN$o@dM;SX#q9jhDr#*5cdo0P0 zk~oQEJuDGDCYn(^PTU}nBv z=GNT0Aiy){e%Idn%$zwha%eyI|M~R)`PBI+KWVMC-+QmU_S%mVy_H{bm+!w_Z7wD9 zmhZn?etY4ga#2uyJuooz)`SiJ}awV;mU_4ho3diCht?bvunRr zb?_H+Yd@4wzSuymI%IR`%Gpxq%W<-PHeZgD$27WW%`;t0~_Rb~zvP z>w#~}*(=pjLtnM#Zct8x=l1D0d&Kj2@SlRMKb`xY`TBUV{&vD<`BTzlXj_r??v7Wh z^E>W)rFyYXVjKGEO~KY5sKTrKRLhnn8M^*1{bFHShSVX3p_g;#4mZZ_y1Oq8e2aWY zKOtFjB75ob{o1Qa)jt12wX6MnXO4bAA)=;N$?Z%3>n#Uud5L~XTDt7#ujVX&{v-M7 zx7_8=NAzz*uwC8|cxmmoQOXlaC;v(GiWjauc%6FoXd*YdZ21?KUE6VR*>&>G_lcb7 zRpkEK;r#1d{tx{P(;;fdw|xIc(yQh+x!(4^OKJX+!7qoE%kif27piNWuY=2HL*;nF zS3aHyn9qeq?oH_Xb5YY@)%UQzozMeo@9+HN1^wR13x|};l5YOS|CBGSzVLi$jyi`C zc;i*cjp=#SnoiAs@DA~xx_W`M!raP+xc$as>d5KeAuD4{_t-;MK1_h0d_&QzYaL>p z5U2DT>dyH#wfp_TRpPeEGJK4ZNE=1l7)906h1EGi`f-psS(F6hTF!XP_54bI6}CC4 zV!o?yUg!TR`FYq*HTFkVg^ZdhHF_vG_ZPpE3OS?-^U~|;74bmu{lB!o_KAC!AO58J znCVRLi=R94-J9m#QgW59jbHqe5MP>qAo$X+-Y(fefmxyfyZ+ku*Ppnz{NSlCIyMs1 z+N*1)t8V#P`N6MICH3o3|EIUf9n_IkgVJL18PK{z&r5@UaXj_0N_D?ReU^k!t0dGP zZqp|`$}Xb>qN{=#O5hiAF2bz@%3MmIjEdUnjQ`s&JN~zs@vpy-QvAzg-7XW?;LcS$ z^~Yo6{o|pRt%Kj6`_8=X=s_J~fdqd?1zn9+Q@>kL2J{^jy zO|2sRly|m!6=|JiyQtiMlA`_~?>+LQgh#I|Cf%8JS=GubTCLm_619>T_%^+17S5q+ z=NrUh7+J6E&sQ2I`u0QHZ_r9FPj+Ejza4y!^u?R!9|h$R~Whq(&hY>HYHj^K)u1>A7{mLw{D5 zqu<(uTB@llgD-rfOg|`TT;)OIDwlUGl`mYrc{iO)PdhkW{?hp+)d$bX2AuYP*9@KZ z&HaInYR}M@MBI+vwf3iG-)f_a})smQt1yM8Xue-vqddGPMJJ>ODx zy=c&*|EeOqNwd}YUpc&SHs9^i*N3ghs62PwLy}j!?9;F2)ZBgk>4(UG`6SB^<)bYo z`MK`bL__bLJ@~S86~8ZfWisg-{?&Y}FlmMzoE^A5^)95gXNOb``=ZwnvEJ$Xn#%IQ zmt&v(lG;T4)48p+aXa}v=!5^zpuYjV$p0D3C&#^_ZwnrJ=dV9)se3R(Kk?hA)ETaM zd*Em4!QrpHtnKW%_ia&E2K_JllK-CRiuC#VB3;k;1|seKB|iS_h?KO(oL^dexB32T zG;VL^=fnKGkDq(_Ssl4;b;MWM(tC5%>I=8`T5VnZ7L@A#{=R;zzrCfct9Q2$eGN}` zg~Rekd#ts4psl^l>geij7uh7Iv#YI*C^G1gaC>W4OLvl?Bj3}BY)hL;z~Pj)xg(Yv zu1*|=R$`S~y?t%%)}F3trxj`GY1f>VZprIjGS?M}60+>maXZ9MGd}@-e4kd|RA2Dl zFBxd^HJ-sY`H_V|w($FYgRoBc=L}}!|F*$BzhQg}g?In`|3&@={~zYho#sOA^B+0? z|IzbTSrrJZ^=&M#soh>*?F-gyY4lasT8&%lYZ|v&4Wa7FnvFG;<&8C4xA->p4fM8I zoBO)E+M|r6XnSv@tFJd==rs*nt-J5MGjPw^yYIf+*RZ`IbX$GB)fHhxMy*}#GEC7v zZ6$7&n_ORC6MBNMYs-B#)z#Hcgx0PrU8jFlzm=E64+H|vZ)*bq^V>RpYZ&N?w(Mf8 z3(2akw>l(K#A=jOMy^vVGJb0^<5sl4y*74e_3up*8aH|fTk1T7hFT9Hw8an_!Y%y~ zow}~*$Ur#U*B_M%b%e{yJ)z6J(LLhiKJzgt2CD&1_wXgT-_I_y&t6fqqu}rmU z1{K%e*MnZSqJ2u^*Y)+cThY#zUaPOS-D+)#wsiOH)*8RFMS7FWFRIZXAu+Hij#y{1P^C!YAFLuZMb|Mw%*uIHCsePp+*r)4+&!dD|` zb@%DM)3Qr7gw;0CE-BG#te&n&PfN75)9UNcfmDyO+9-*n|8U=c)zh-q>Z9=eU2T#V z21$Q=$3TP$a@Ss_+6bLoBA3`&JKI~IsRN^8@IC@VvC2F_2BueS6^3Pq4lsscFN}czZvXlm5 zrFU8_G(`2r8gCANlT>`Z#=bu4xp%Lt^&(Eksl`N~RR(&gqHOtU7zmf7>eo>-<^@Wp zeoR%iC9Bd}9YaVoA3D{F?2Sa*dqnT)VPQqu>4MTp$m<@dOjljk_q9H0)pxbgS*l&y zOW8k;(sRo=s?XK7YXkpA`E^>p27@h1Z)xvWoj$2NwUSlA^uThuywUdUy^>0@TByG# zd;9kErt)t!&>}6-0UA$_DU@t=eaX_AsJF><{Awt-NPRiuRYK?yWX#YKE5w*af(&$Z z?4@#L0IEUXWvVNw)m_DRPY6bJ8$;FAmDKRIYN8Pf8@kU0J*yIVCK)?T!m3|D8}AR*U?Che7A!ckq{ zy5|R2p%M9iBn!aFv^zbCxc z4p~F?=%`&XkM`+4r}axHEe(25i>wY+nfDr29}V8G%Y1Xm%?`1{>X(5c)2-ZVssDcy zPaUJBMTK#Vc*p*7`X@CIk#=JcbwzcT>*^K#qRY(x2ii^7s_AX*>j`(aN880V5^Hab zZsTO*IQB-wE8i`H!euI%fXP-#3s}pL@0F#lm_K5MsE&INc?yd%#Cl>>Ps0PMWbL){P}Ms``=Ty+@BzRRg{4F-!>=VI4BXYXdIX zU&uo*M6~tp{+6B| zr`2AMh$|*f{*^b!6|?+pd@CZ?X_R7mKBW&u4NIFazRY@IKBK)_yZavBui?%KWEQB$c%cA0`lqN1SsoodnPsVY>1 zg_VP{0CiVrg<ze4tvV1UOR|SbV@e^?(#K5cw04o$lTO9x zI+5fe(SDR8c2J9&LeeZX$F3e=d85~(QDtTC?nX( z&&sAZ%Va%YrQ07*XDkJbkg-QiQ}?yDVn*tD*{X^3RgwROzJdN$$(%B`&4LDYd1b8> zI@W@1lBUNNRDr_6`fwI0N5;eahBTtiS?{&*T6)`716$IVh+8$Ak0>yV{%C!iv z)RMa=EDas)>S=|9)63qy3<0?LtOIPdyT0j;_W@* zsH2T(b}g^s>h0^jRUGJ%a7(Lk_ITElEY(pwz0`~DMN&K6dXb^#LsFBejru^m&9^TG5ahQ zx;~%EfTY$h4cgaxo3u*uuhi6Dqas2Hw72v)<`ezT$q8%pmS~!OWyE*)?V{jDB+T&d z!5ktRdpae%I`&9fwbh%P>{71<(QhSSUDd{SV~JU zx;NaeM%sW_JgM?Pka&*DlGfr>)B594fP_ zGUVFZ)vVYl8itvr3#yK}Vn7CtYhKRoKT@-5Y6?+R+vk+cSKcbhGC54UBJLHQS}62O zm(jDYk#fxs3%X1*=RjxXN}GiscC@RZm1WX2_Ds6_%`tMEVA*|h*|=&(bQmeo{`PM1 zsL`wXd&Oy~ouzwJMeCNAruTSVq@uJxCfO-;u^pGdJ(kb9->Pg;_SCMu_b5N{mg*hV z^-Ieuw$?W;-B{jOUc1!nZ!E2=X$Y2wmNsmyuYY*yL*?~bYPM`zDw`fl#j(9~d#I`$ zsH(2mzG-Q7ef`Fo+Ulj{&ho;yI#O)a^+m+(-zp=<`0-SZNV&~oT@|_6x@D=(fluYY zr*h!aDf?8)K9jOfr{`1Y`Am8~NpE$;qGYQh^50V5p`ZTc_%B|Wyx&?~(jh;-j!1v2 zPdcBkhxC2SFCCJ^-5tJgU*tZYQX@~O0iOJ$>zVfZd<;-15v>Xwfu6QIgx1}0pKta0Hs9)X z`~>8e0KaXoY`Aq@MYZpt%3yi@6OF#|hRT|nWQ#uGsEQ|06;C|9HpPhST9_w#HiH{j zyYBY&cieeb>D}cOl~vUnTXwa!wRdFSLzEZS-oej1`MLi8XZwrETIlbN?7DqjMm_kF z>-?^$m_lObM@mXcd`UmIFRT{@Y7zhm-&(w=bkB}tIPuBp`A2+(DKD_z=dUy~loLdaG9&(*Ojji`o`@=>O;!S} z9+1fR|AQ4)F#~t?>RWsb(sfhotv$N3q?+_>kYUM3(sY>COHyxY!KbDRy}y~#ZYrWA z_q}~xvL;TSiT1cfD0vUYk3_-}Z+BE}9LW^XE#{KboMQin)Vv|4BQ;j9_Gt99CAC5U z#fHR08=zW60VFA6?e2Bju~IEDC9%FeB=~fDclu&i>cVBeo8)D;YR^J7lttcXO=Y`@ zD*^~SY+Q$<>MX9ErES9w$-%3e}#)olAHS;Dza`CLA*w7+*5ZydpDP35d~ zwf{OP${1&|Tpd{5)>guAslVh8m6v|yBvFNzzsIk^>Qz9Eh+& z^;;XaR&K48Uv|_~RX1RHg+f>y*2b;%R%mNOO_L=Ch1KwILt}NF)lgkmzNN9IvLU%o z5~{5(Z>YA!_g`MwXeFa>Xe{4SRbF4!U{zIz%Ih2Js<$+*u|hQsm6$RQl|Q`3+Om0# zwY{NSr6j>rhSE-pl$iY1Z>@aLs;{ZqMBG~%tLvHbxA6PFJM&rcT}8&M(DsU2Oswj9 z6+v27tcI=I>np2EEMlp436d;PZmf}Cw~&#Vy7KymtsPryx7Sru@`lR#no#3b9ifv} z%@+QuGbJo{Wq(Iax%OeKD+#2PrM$kPrmLiI7@VOLXr|OR&YYX=P+DGf%st6s6@>w?0Q{`?N+(Q)!-nNquJM zNwww}8;0(-H}tgHu%k-3?zDjKL)Y8(WBfE&`ezkCHID1moPA*#9qC~WtoD`n^hqTd zA8oY6z3-^S)!sXX%Y(b<9Rm?8~p(Ew$=)rRrVTT6GomTBqu` zq+U`dq+pg<<<6GyI`I`mRkw<$Rh>4N)~J2i)QPpF?t`%l#;RA_5$CvrV@sxHIORgn zyL1blKmFC(>BF;!Prc~dckmwT@ zpa1e3*YvM=|F5@yW}rYG6}+P3)x{?kpQ!lBTOZkW!vBqHhF*VQ+w#x9QWpBf>-C{8 z`S$(yd|$^OO)i-$^YuqN$_8J}{n5pa_upT(@7L3@@W7H^y?F82H(nW-+v{_D?Y(I@ zlj+vnYn6EHt9{E1e7;yR4D0g+k!lTKVHY zNx>Vk19EQ4i;shXmL1}`N-k1uw)-_z9V=O@Q%buH0>Khqrz-pE#ESv}B=>69AN+4A zY4C~g-m;>IFTscPZ@<4#@x|a8Y}3<9G+<<+{j-$D)Y&RltJ*irg*WT0jL)L&I?rvs zmyWe0J~X-2S+V|mMli|rn8Qh@6Jf4_7nT4&}x^Y@{M#5JAunld*W8cZ*fs`+?>^rb8wbj$h+leYa6W6D=JzxSsY-j%WOEVck)* zxQbAir;>i@F0sh%r6OXHSx%bL0?y;=+PmW;B*q1`_gF-fjq3$&XGtY>2JA&Xj<{5M zU{TO$Tzya^J|b#dPFtKDWt9U;GDRdKeD;g82-A!JE00nU6@i%g6X+dcQNZR~BwIF9 zkXCP-fRZSu)ytI9v+@I!C+gF;%?P;GOW*yGy3!!5R6pT2Eucco@{W*jnyB6i(O(xl zA8`piFWx55wERKN5K-WG5gh$7Ts>WMj)~QuA>z>EBm8OE%)oHpdbUP`2q_btgOy+( z#K^B3yQc3s0z2Plg&IGgEkuq=${|Hyc37NEv@8wOW!FS(`M*`T+j}_>E&V0}h&iRC zEo||6wOQ=`Y~yv~{&o{7N8NA#+<{_F+Bk;p>5=MbRsy zD^=CIVE^6WjzvM&x=ZT)rj_+hvNJ+4^<_tep_n*LoSxhnTdz|pmMNTZ5v$AI9$R<6 zR9a5htp1dG|0QnhJ*9Qh`@kv@m<5ZnJboR{-p04wCoZ;Og>!O!?&T%1dZh@fe*U61 z8hFwWk#(ja!Z}1l*dp9&{6OID%5R6B zP`yloa3?gHp7wUh+8EAuXwK|6a&%Chxl=OgzWOflDD!b`ZL$AwbSeS_p+j*1$& zG${~^yr$~5@o{#WxlFk&4xda*)xt1Qt z+!2es8oFORQ;H+aw^KU{QDbdt8ulhEGO$hrEv*8C{TIqp6X226@B(~3ig3(K~yMAdHIqJE*cl2@1<0m7T8jCsuZ7 zi*deb6++V#FsnaWDWFu|RBxd!BpxX-F0CzK@mfz?fP*yRNBkMDc`hKzI4)l*y(rjT zCp{=A9(5lrCMU_k-^8FLGxq~tOlTUB-qfA&|Gr?`-3um_(c=D*0B8z4hsC$+3V?CU z$TA2@vp&gX$-GF(yS|Z7d*+lhj=JSJ{+D(NewTN2VunGup-{R;IN3Qmy^!%-fCgrB zgv=0cvGw?yaHqwiY#~={JWs!cAIXdSbDq63%1Luju&K@hec%nGGV0oU$l+y>Y;9+8 z_x}PNyIV~L|3C>6pm|I9D-9;6mBvJ8<4ctwTtYCgg{YXeVz&R+&xqjvC&>|65c+mm zI3$!d*L^4u3EBMy0^5rHe*cNEmZGZ?2t_%`NDE}t-B%Zjk7$G>L!1oJOa-Eu0Ie>F663OjN+^x3JF31dHS&`BuJci6 z)P*d<^Tx%rx09oK8nDW2!RCwKdJF3sH2y8wO$s#E?bR0WZ!2`EzeK^x&m7c2?|&0f zcv<}6=%T1(m&Z&?)SvOe;gd?zA;J^UwTaA#`hWyjF3QrN?m?`#H3jLBL#$)V7Acj| z%Xh*4*RPy+s zm-3*~N+CC@_Vl-@BF5=&)FM1|c||Z?^qVZ+ACkFMH)MYjuD$NjrWB~W8m^f`IAm~F zP%>>VOu8nH86mN~AK|m=?|yD6AhJ{e6tZZD~F+85HgX5$i~)#G)YIg=Jh?lo=W>aqx|BLh;csw3y0n zLtz1@xvSj}3ZU8)Q*VKmlM^beJF}7u0jKU1#m0yjeq|iJXJ%V--Tx^ee=?pZO++Ob z5)>8CyE7#)@~h82jzQQTHspra@15D6QFjR)D9iqjlIR_JiW7A@6qKbNY(M-i1or}` zn*vK>LiN(p0>3_(uE*~kTNjOwsI_AXOGXq7zcL1djK=i_MT7$0BI;vWU{G2k zHF1<$zh0_ELqwy~u1sO)@j>T&7&%}?e!Gu7#1CsUZ9D`piobceCvF}d_L)?m7 z8yBQ|=3;ljGj}?V*YJq3fFf?ae4j`0Ae&`bS|$-xzj;)cQ=K4s)1p-DO@w)*{*v3g2rChph#-OT3$Yk zgH7{4XrR6Qd_)ga*dovTAMpuz>0ri<^!cyy+~vGPfxmm($+EL0)BN{00hmPJ3C%>+Fl7a*+P%s0&Ks zZemL3rluuSID)HCO+J*l71pLa5uZpfZjrjXo6I}H-p-$TF3=3T<3QSerBY#^ZW^op zqjNs^Y4Cosu$)jv9lP@;b^N!;{7x0l4mN~GQ780kmj8aLRBPdQnu)NSfKvSs;cYy{ zG7*X1D*g>huSOmzT{}1rmxHX13|bE2K;0xEA-;vbXK7R07qUS76BBi|=mU#9HKx<* z<`e7$l%TyTp@!KMC5O^E#x*I(k~yuyJ{hC87$Q(;*CLVm_d2E}#KH>*Rye3`oyLMM znGw$8r%LCVrzPHG9lIww2MF-RSm3dVx^(agb|-BXO7Vu!`YwyiLgdm>I5LlT5hUF( zK)WTl!y*e}-9yAOcNY4;BDxNj8Il@)(V}a6f5qB~1QfWZMO@kWYgCM^rlhA0i*Kdc z3~h*MhyHZ$e8oHW%VF>;@oVYQVQtYD!@uLdFWskLzq(ugc*TD>+%wMe`xPds5*Fjm z9d6aSD@G1?8JC05Pjwp3gV5Bcwjs_=A=wQ5A{Z_19adY~i#)4cC3z$*k^yr8q z@(@yw3QI1(fW*z*NoG*wJVY|-|H3E&g>gq=oh?*0VdMy4xW!m$0>Z;?vG6h|&=Te2G?7GU|0IR}oQSr3%{SDpH=mYO*`4UA zUXdQWH&~Uucw$6ye&2r%WBd+B^gq+vcm$FS_dNZ}3YiQ^(qZ;uZf&`Q0*jGTD+pJV zlNKn9CM7{eW-5O`lq3`M-_2xIpOn%bd95csV$KaW&mq7rK>o}37H(WcdPgkeA}t~s zb3o#60U^j4ZX911h>rl&CocUT3*!V^7a*_SM2xRkO>3&Gou4zff{nj{cTzFMZga(d zbgX0R=O2^Klh57{N;CP-;l~}-H!z%IgDgEJe-it_pzcE>D+#ljM{(TO%|FRkJqkd6 zS{!F3uD)UXOCO@@66U`VugQbJ{DnGowzVR3cLdVly2yg9JYc*gg-6 z<_k+&CMam1GY=kLG|LxmvPe{blrmy1hw)^ZWXgw9xh<0|G!tUS2>+t4dsL^hm+So? zT8DA>*Kg$eyg6mIjDuXcRONd&)uDCnl)-%i(QZ6Iuta z({96NPV}VUTn;$Ml&|Ttbs8;?u!Lazqeyex>6vdoDJkhQDU3Qn=onARj6?NzmDRI` zhz>)>3xyU#DvYQt%0KC=EXuzeuSU?q6K3el;5nN2LyOjYR3hiEA?i{e8PT3kh`<~X zCGO_PvC0GKy1Dr1+7Tn1AwJr1J{LFrsI&7-55uu$b{ zLj}L_o?;sE$78cg6|*;%uVv4HD;b1W!)8Q2UdSyH<9a&G0Yi_XkaE?&OA4L@Z)7VI z?Y1HgdU2g?nW{XGt)vyOr7u3hZ8W|C9)a5EuNeJ#acgSDc!Kn{V61m5E#6OceX@14 z^2!5&rlnwO)UhC8X8D2V=l7^yNG|pZ0v@o2{k-hMtm6HPPoDgIvh*};22SSQ@VIix zE9g>AP0o+chi~itn68^lxMG1hzjyie%@G6D=f?RW`KoTBZNC)A2LX$%JkQwS=FlPz zOwf<7%!g5fLq>p07ViP-EefwR4@em~GyRCVuN=Jo6Z!?bKr9>~-7%!`<8r?EjM9vw zQ3>0@E5t0`-oxsB=Jdi*@5X`Vr6)GEh8b3DyKk36F)Zix`jbl8aqu>IyF|%Op=m=c zXeHg}r)&BX%c6m-70Y^0+vyUU(?7f)CY0QB`^Bt#U|pG~(_v)h%P~%+6Sr`!F%?CL zxr#W+%#NYcGA8}8zrmy4QRPib)HeIl(bEOQmn84Utsf(;bS?m~X21L6hC5B!3W=xF zs;EL(dkxGvklPCWt00;$yt?QOY{udc9)wLY$n0lSv4U=OKV6GOsC!_K8?Prl49?Su zYh~RAjXjtf74kkf+-&cbwm1nLHiGfA_&oaFVQJ$KZ&r75Bl|WsapM8SQ_hx^J93+Q zOv}%8M0~*)daiD}yo%kqjp6qQuBWy0n(BprRPn0r&a7jt$fd2f}GS;x*dnyCX}_D(Ssz ze;urz)X-CFO@UzbkcBDe=FaTwkD3c6$yS!N5LJuH11LtY8F{jNtIdoQ5atzvCu7sK zz~+gxQFyuKJI?U*q%vP=VuG;tV_1g{2>-3QT>122Q=4B0D6LkoLcPCbePYCv?n1%o zE)_g#xQ#hqhujG+c<}EOaPzvcE5hyFvk4Ew%&NHKxU}@3LF@Qq6s0zerJ|{;z>)&T zGF5-kWH%fw=T3SET2`UxaCq`5$4csFnCA(UGW~lKH&D_p+|*s z!FtdC2EN6Rwqw?!ytw}ScWa5kU;k0GU?1n^&QCx1>BV)k8Z+%8&sjxi{z>g?Iq;Mj zaC?#vJB+Amc2+Ndp^}BDkzw;~C|mQ_SRstl(~I`$+0ALz=PwAdJ_^kSX{r_L1y7#k z-QW6YyY(4t#Jj0awYW$joO3ny5P!QMivU=dBxg4cGq{bf!lGLIg1xf-IFD80eQ&Ce z_hwFX!MWoxvQpyM1Hh>*ZrMs7$9R&OU4pY_r?qEWY@pqMD5RGRu-h&FvGCfL)_~|j zpudqZl92A9%9?F|zVHH>t~i3BOQeYehygW9nb2!5qPCN|dmIcZKauwjJR&osCejQJ zl&gAjQCGqYv1vA-gJOu&oNpfh0WIBkWa0cFJJyH=BwM7EZl4spKel%5){sEGWxNL! zYh$MT@gaIbRtqUp`>Dsgbe)*QR#syYr7(wKn?u4!p;(VO7p&v3^k@o|R2NEOy0N%< za~y}CVBe(d-+R=4Lzoe%$;eZa>BupVAf;ghIcQ0a7d_9Gu9S;&$;C$)WJhE6aV|@8 zGSPWK)}BIlIfAW+^CUOz2P7tcvUJaLr4Fq48l& z!FH*B(m5K`uMt!+l3uer&03))DgVXW(>?4bmp!&b$}nvgNWyNJY=_BF9PhHv2v9nJ z@n!G1&0RwlD~@9GI7rr{YY(vd&%JB~K%HMBLQtVYzbSJZMsW-p5eD&hKeOe3atz5)zCAr)3 zumkg&m5v+>`jmTmu6GVp&#N{nK231%o zl#DXUfRSgLAt73!&Cs*j0)Ky_d-D?FX*=tw!WpIqwsIakfz%42D-n8TIw;tIIgagO zANJ~)8R|~{LbDml8oDktkKV{%Tk|-g_h~(yRo-+|9>f*Ee?FzfI<9%1eoKsg$WBmR zcsWdBbj29wbo##Y``qkt3-H{!Qr$D4>&6!)?&bU}VV6DgY0K6}@GSbZbkY}`t%34Y zQpxqOTGQpr7vU>|qOv(KL+a9d2;npFJ6WDH7lK*$ZG#>=%>M%4$}YtZqa+QJY%iGp zlIOxOIZ7T_|Lxd`*p+CKyj;s=%uUn+z70O2&D75ydrQ7}S*Y)G&xVq6ZK)6La#%{87On;*AA#YwYei5%**Yl;m>=$&y` z>I1!-l|=b^tT`1{XysH=bnSjlvK>O*b!~>^9W0u!yj}YTqCdZ3(1UUghay!9e`E}=0J?G)um7W(v|M<;gvU3JWxwZpm)saM;sGtw=CcgOPwW|4K(JSQlIkglZ%3v2iPju_4R?C!8r*!o}%+DB-RYN1zQUAc( zCuvJj*zG`NKG8ud5qr||4Y$!lKSZpu$TiNuZxc)Jp~UL1V>!V(QPSneBDEJ9*!bx~ z?r#0yz(TbV(!S2JCh~eJaDJ+vC_b9SEF+}pKJ5In6wIjQJGoIEm#~Ki^nUZQGwi_m zudjS*4wc%=O@v@mxq#20gvV@<72~74;^%lZ^uN0UHi#c~|ydmJ)8{ z)0$7zlTEiCJg(KjkY4PgvAK{8BDMzQj}Cap@Dim1$B5%Dk#oWF-wr&q8%(BFRQDtbRLN zxKfn8ex3Vh=Cmp}lj$4cP8=!XT^+&n(ut-xhoN005kP!h{rBG8aeuHS#b6^m3h&yV zCp*d~*|C4G@BNgzjI!SA&mm3IJTn8K4Fh{8-53K~)Z;w+#3{zN$TA%moSZa@%!Bvx zVn%w)CpQp2-3wtd68tUd`=FfJx(~rJ)LV>*IFm3HAa31TiRC*2$W9SH`SVoU%5UB| zYFxt8OyOqU5EQ3S>-`A>@kMJrq-b#Pu{4O3xWY;d{5h?n^)DyY%u=M6~QVi)Ld%w z5p6+fFdajD{&ZYGDmwB5%G4M?OM*=1NEv=%RRc3_K+N87;7ysq8hs&b#klNufFS2x zObJw9RvE`Pu^pH^?Y_SpDIj|1mK(1T!7ceFH8KS^>D_(a#+z@|hSR`lnjEuY%TIR*o)hP-JUilpV2964?rtiFTM>q} zaKn0EPh#h6h5LNh4hb8A0OiL)AZdsXI4{`|FS) z{euJX$fNI=u>J-ZF?+7uElGEj;5wfYM#(^R_9`2{sR_6z7o&jD_aV{p6R6WH-GR!p z(2zJ{_7Dzn3EpXlifG6T)GxylA`C>rwA*VF=fRb)@O1to9O>#hcB>GRYzyPgcyMtV zo!jLcE&|UJNNvU7o0`pg%R0vx>rWjbF&oB@@V)0?B~CXE^0hsvS;b2qp&m;0@t8`Z z^TRI6{sE3~WgQZlt@Zkm<%ez6IzP$7BH#|5S&5H*N0Wm8ZAI*9wq;r+Dg-k=H%9|eoASPz%5HHrDIEfJ#s zMsQ_2)}YM6EmtbLbFtH1w1oi~s_KPZz99RrzaFOe|%S_Q~|$np=0$Y5^-6YUb+; zXkS3;9lj+#>a^za{TVQ|Tt+ROzhc+L-E&>MXq_z5+F8I_PoD=VjTGagIoHkNd&ycy zCvC}~;3s@w>Kc;y(MYch^awYQ?_6ZWiM9mDvfr%1DTR~ieEvyRYhWu0ITvsxi^m=6iK zWUPySJWX2hk&s!hg>%GM4%wKX163($6n^&ItAtyT|dK^I!G{u!SXc z`0kIteFvw%zPa-1jn6&hTzq8h1to6iukFClpY)k0$y<`H{UPPQg~JNUc~^n$p4|3} z4vE)>;a1R|rSM?qf0a-QlR;wxLl`JfJB@KIc;+|n?lu5v-EnWyOcv-l;CZH|Sr;@y ziW2YP%$5dxvzm*dQFP0PTSdduar@{`^;VanAUC3~LoRO#YMIuCrgZ=~H^wxAM=AKt zG>)njPINZH|MS)zHpdsa#0^r7{tkWmhgghbEBG-N{1>2uv@Y1VX?>q_VFCNf^GSn; zH{P}M-U2pAb7yTzT9AU8s)dP(8uuN5$wVjFoLI!o2J+&kbk-9K9oE7 zjbJKT>*iJUtToZ1jWn%0Z@CT(j^)@6mFt7$f&cPM#~w!jZ-+>qrLZwx6`wa^sDfBx z0OW2<)hD*TCbIR8dRAY=pJk6|B-$6@ZoG{9^N_v>9+9dzols?bgl1+`!bfi1-@aAY?<76>>u0Clwu&4fK@dpy>=(yR-qE3*E2)VTeCCfPChy2Li0Fc z`W+_l71|YwT3T3|4jy$x;iSl?`0~f#rUNG~F|HdMB`oPFQC9H^Af55+y2vIa$RbQ1 zBa@U+b6NMq2`{W>lfLB~YcFq-2A&$n`J)lH{O`?om(mddq69=?iJ0hGR~rP3V4wKDas;BtBIuV;md0oz(Uxgf)DA zdCixsqtpk^d_A#cWWmj6C$Y4@y!E1wU@L5vla&^+8$ruwQg-$%pYc0pQ*r)2idoq& zEUUTHe{6HU+;5rnSE^Z&S9Q5b2TX!K2&my~z7Y$h%h0gPeV!Y7Nz9%nT&%!S9M3P? zN47X80D2(d41cE1?3_M6;3>*dCWf0WgDn|0AHAF5R=CvrFY8fQ(JVx^g|WZE_5%81e18TY z1uexeb#rl#a*cCg)QlEAP$+C~RRBnT*NU?tkseQOc3ZX&qc$J?%cbR78g*)ehdqN_ zatY6&wcap&U+~5C>PpF~pGT}}moPzVhc)rs3-pEs$_~L2z?<(w(ZN!z@zk!ExrCf6Zj1bibO@L3yST=i@DWJET zC=*;f04jQZxU`uq8?=YxE6LFba#j`P?}w}`U0L1t5yK2c_yoNJyMt98%tf-;Dl?-Z z#1-H#^J=aX6`#Jmi&e)@Uxi0GzE{ka%8mKnf`2h4NNmVMk&WQd%S3o;XQan&&gaa< zwXV}!ny}-Gq&5wB5wnq@VwRuPcw+-qIf64C#8r{O*olv>iQWUXmk(|{e+nEMxg6we z&^1>{K9l{neD3uA4QE?2SD9ndRCAV zZd!hz%^0QFWDxt~uV3~trM1kar!86kvMHN~6KO5QeH=CIAO(V4>8K=MJ?kqg0lT zQ~*2vuuYBbeNW99(T}`_lo)1@@-Ox!hi`6R5_B-4Gw#CX`+HnJ+61nVp~){M&(N$n zq(l7vbREW*#PU7W(2JK)t4v@H%EvKZ9A$<0=mUFZE||INH{7zux1 zwL+L7D-kaHPcYJWDWmPfX5HkEkgYh`b=e@)zJlJy?uAR6GUx#wVpTt*rNYMN@>o2J z(g$ckZE>ClvEodD6emu)~GwwIG zViRe}^9ISvn7>__pN6r%2P#)#Cl-lpQiQ@y9l6e%3#f(;d5b}$?`RofICsFz4M@^5 zHEyN$DIn*gGh;G$7Jmn|G{+25(98PAo4bO8@>o`{egq&gfuc4TiGH^M=-RQs{ZtdN zn`AU>?~*bGH3i*B^FjRIR=TmvXTDbZ@URG1a)38lbH)cSh#FxP+G1xOW*glBEVq*I zCWAf8+@pP`sy$|+SesL?rga2m@bf$=)(Lu<=!mCT5b6ym8U*5%SnLCR3g#x*XePEb z;|n&sn>xhn?uN%73)o)yBJ<7K581w&imqXJ8;g$!I_BR^C+=K4dJgQ<08YdKTK=!T zL#w;yhpK;TB2IFpFg;jv`r7`I5ItQ*13Fg&a%x9mg1%kt~4T-1wNq~?diok6y!u0Ic_+I) zMq8pm1Fy;uI61`Oppn`6;yCGbV9!Jo`NU#wX8YDRegDr@;Kd42LPpS<#u^5bhY=Xk zXDD-pIV@Z^&GIKWbdo00g&*78H1vDIU@RrCARPxi28EGmwH^=cqimh>(oysdU<7%5 z5jO2O=Aj*R@3C6-XwEDWTI!!-i+(9LmeQY*zxJ8OoMl^5N5ltTjZ9lg{Sw#^0kKMp z-{i{SrngMX1>%p`gdVvM;;?!0=ojc7WQdRMVbs_?5DEJ0ItfgC1YPdyIu))UPAp1M ze~S;|?)8Mu)`T1ger%B7pM95&oG}liUs2PSL=%&|?Y2l~fkOlAi8YFFu1)YVd#2rf zm4f_HXD|z$dIH#pgmn)2VO<4Sv#0{R{Vf0<6s5p17p*CzJN~k63E%UcjYCI~$a-+U z>yuo+Sv}5&1k|Jnc$PItu;M((bL%w!tp8I$mG5$~OS%p0dX6C`mm;$>hG2;kBTASi zpC6#nSX;Tsrfl+n&b3@Ja-YYDYc+4gyVgNhFdvkQhLgXoS8nskK2xJHmUeC9pQqgU;4c1zn?2t39C-fP*tD#m^0R86SB3c7g}RUZV%sA! z?m*8pINOBr`RT_e_=d2?;V`W)eBYi?kWFAX4?lLl`1X2&SJMB zhM#de(<+*08UQ&RdOnL3S~g)Z3=Htv;|RO0hFu9S4`G?<#xA6PzseEQNK;udCnxJW zIFkW`4a#gb^wBwN>lr^`#Tv_34aL%1>?1vnccFavx z?>k@Jv47Xc(Da1fn%+Iw(Ack=)($k~4I_MH39s(lDb7v0R8Cspa%Xn(R4`F;lYk?!1Y3T>EN-j{ipHkb_@84k##M z8}`LsqFIEjKEA+j;9l2W3n(%HcUuOF*wc_JwGXR5k+O(QqO%P7PC5zu1TbL2Ye?oC zzmBXbWkeiiJ~i_PNmSGuA!|ujo#Rmgx*PH9JR*hEz;LTvb+}M#XjvwSHOX!_J@|6p{qfS>r}r66?-V(6dEeoy z&EQnjG?|%oGpYXPg)_Fck9!2KUpRN$DV-#6xV|rYl3Rj5Q81w&%q_%5tu=LhRiJjXU4s_dI(b8z$S}^J!9y{6O08uk${$ zyG^J2zeSio%VQXE@?L9d$KLNfgS(<~U#9qOv(Wi(akV%)?lgH^<;BfrJ;`s+UA{b! zmmU0lo@2@~KIn>;Z2a{99vt2Sx6Z7$70ZhcQh6ZKe)rFX^QEucS?=BcUmyF%ztp1m zz2gjM)i?y8*Dbwj(N^zr$N0CkFUfPv=0Xl!)&I~baC4yM!`SZ~cccTT3*-=W)&Zpc zk$Zb?SSDiMul0Uaik1<}cF~*Cz-a(pO~|HoFH0&=EhUZf>AW?i=AkBPgwR;t$srye znFyWGA>#{4Nj6#W0NMWEv9FDJa%1@9^f*F^CU|aRN}%6ZelqxJ95>?YQw0~wJ}vK5 zY*dg8${EUb_IpwPp8i({-{eGM z#KyFTcv;Qog1Sr(o?g`YrS6@yj%fhKPYh@kDbrnf?bw>2nSRdz;}qiqF8Q*0Rp9GK zhpLejsQ}EwTE-mr;6mf!0p;FvVqr9$v!wfO%EleY&5k)5>TZ`tIzC<4CSZ^>-0;f& zZ>(xl$4%%4xGOvvcbADzY#K1dBX2s>Udp^Ux4Qne0*~4ipw22lr&UE?BI7sI)6A7C z^Opy7G}Em^N``S)+ZJ{1yZHDY{)TP3-sEH3VRr}jj)ZPoS9Lq{O|a(%;uEc~FNY{q ztGoTmxt@t!NQL*RRR7?Q}I)~8JvlGo!#SNF$Mp4tqXHLu%-i=Dy>@J^@e!t$_Uc@F?^ zX`w)AGTzQl*MIgf_M@diNA?@-1yq2p!8p)dz za1wo~8s!aCC8Lg!{2O@CAV*18FwZUmnx|05P{$DNU@jj_4Pi{%L;p_|HfwPvon4l< zK+}-@f6`A`g6p~-W^8Uq(n<2enr0f~S`ZC1-$%IX^>BKt6BPAXVo;5?A7H-*w|I=O zT8WUgskT)rp7@lZznlPuTm(=)p~I|g|NHx21pXI+|3%<`5%^yO{uhD&Md1IJ2>f63 CK2w7M2WHmx!Xc5>d+?2W4>~uK7RDx%ZuULrJUc@AIEFymvkK zoO91T=iGDe`+7@R@S^mzG+%Lfx{tqf-vz!jJog-5#H>&M>+|JJ()GG*gs&%RPVf!# z^*}+Er(Kch;XaoU7=G?ETW5V4cxK{ni>cp|RwOm?%SShSe+>c9uXW!M_s>EXzDEz_T2Gqwtr9zq9ej-?{h;;_o~7Bh_c(uMB@9@#p?V zn1tUvPsg(Wf2H^vgun6l{PA}w{!YQ)75KXte`E1C6o13D|D&tDEw(us{w6=fZBd{2ltEJmei(i2Uu{ zz?t7o`LpPAIDBfQysyt%UW`=g*S{M$RQLU{YHEjFEseRh`I~FXSDA8G|Gd`?oDb3G zaQNKQO?%Z%`(wM|bMJ28%vWYz~{SL{`L84yJ_!EV|=+)exTZpu#qoc_LCU-KdJ^=UWlsrwIy5BYJp@^iYuGp8H=e9=w& z-*!`eTQ}ubc7soAH|_82ru;xRD{!yznk`J(4KtTa)_L#cf&XO7Kh`{=iQ9^W;f-7yD9&o8~8Cx%7R;Yo6Pms-GV?J+Ui-pY7I@w&^bIGo;C;wqx1BI1byv7A1Ip( zs?l-gwex+~%nDUsJJUDk+PQOmGiJ|QFw=K!&Gb;{2H(7S(}Bbd^8~^Sx68u07;@gM zc{Q^_zJ>D$u1ffVA|f#}Tz!_WisQ+@HEc>Msx;~Il3>7eL8N+mXf|<}H6L_^W&(ZR zyfCP(X6;NFyXsnuxqyvkESl-7TD0(5PK?Y}mEig+^BD*{*AShNnK=_n4{2!*|rR*TQ|z^gST@ z#)X%jY~Oy`)odnvTX%25{60@P{e1V=;VJj-6>?8c!QsBo{pESe-Mu2~@;&8cZeu)M zz0G}$x7_txSkAqW`?Cxj?g7ac_gCpDH>{JYNuF|Y-u+GUlzaDCvpwY;+x=C0%6qtl zcrNyo6DRjq>nV3_IqQ~r%H2I7%Nso9-u>eWPdWFD?r){1ocl2M_n@cT-J`Q^m8YDt zzX~~j0d>CEuM0BZ_T26~@XM4)e@RV13 z${AyDe~Ufkj2F4TT2HyVhh*I{PdQ@>?ytd9ewJH^=L%0b^}738=_x-Krdi`~X}c6iFiddhvqAEx}5c*?Uq<)xnT98dX0p7LBz`8ZE`o~PXMl;?ZO%RS`< zp7M)5B+X|(R!9_?hKbt+{?Vb3Yyo-67s(72^ zUt^voD&8#lZOqd&#aBuGY36B?;wvS;fq9yuc!T8EF;5c|ua*3x%yXLK)slaRd77N~ zG|B&td77GdrR48no+c(A5+Pty`Fko+CY(=~|aN&Z&m;ZykHIg-DTd77NKPx1?y zr>TkW`x*r&|A={-n0UM7uV$WMu6Uc|zt23kVDVhfiq}g1Eaqv7;?eP5CO_nFUQzFqRWn5RjJw@Lmr=4nde z&63~7JWWV^mE@mho~9$dQt}&^r^$#nNPZpjbcy1%l7EzWnvQt2f+nA?{j<1sZ z)67#f$5$ecr~E1{C#xvuM4uHM{(=qNPEFW*DjQsnNi( z@Pl&ug&$h>E-UixzRC&ZvF7T#ihWkBrB)uXjo&TusTpYaaYF<3900BN19E+HD7~{y z)Lg@wCMd><))|anSdoq+Ec?Cdk6%O7*sTAQCRTK|SNR9m3BFS{R`EB?%{Q`sqP6rx z0nqYw1^`(0KC4AtXr;AUFMJ(3Iti_h3(Y^+2RQ!0;70A3W5E|+`09zk?ieJ|zj(s< zC#T^&ulT7+_}5yRkVnfG8CE2bW{uoYb8>2YE7F{1*;#M)Kham*IbaijY(o-_7QUyb z=O!2bU`lJ&<0wn}Xd}jLnoW?A3w_}%(UVE!_D{sfoo!R%r=pkLaa()sn8(=5UmDw3 zJLXSJTK4Cb-C_Bkw)|xqHclL0_-SFYWq)NY-Ls5S@);(lzWIh@)k?738KL5sX3Kux zvRfLbAxfV(t8nW&>d!_WVrh2F-l*x9omwquzmP zWI?rmbz7Bv^cI#qkFqK|s}X7cYB1!Vom=dk{zuxZ8QZM17uHc_slR+Kl;($qsat^s zxbqK`6mBDPUe$#5Mt=|*0VA4d#?<#d<5*c$0=M53Je->YIsQksSTnX-8U4;jfw~%F zqjZ2}x5l4Gr`pfc8?%2|?DN;}Mh>JG;Q^FD{izy-qR{cG6G@<8B~f@3D8v`bTDv)r zulgD)&j)%Ct~M+h6~_dS^3j^|=UBEKWuSZ$(xjZ+?n*mHSAPQ?nB^jWJq;@;x=Y&k zbMUZ${G=pF*AVDW0hGnlK$E(anY4ZOPHW^A%RiRbe0~HPeQ=PCvOYvQaTKKFStP)` zi@@7Bv9gwKqD)Snva$He;)%uf%f%DQ?Jv>rUNoFIzTEyqT?`O*Ol`yiEB%C^{m-To zz&SvvL{ZS*Tlj%`0;%}vkSw>>-i-PJU9VQ)*+`jeItd-sNHVw{0L>HgM;uBNF zRl2yC#eGu6m+9h47Jp1;X&@tX@l+PSnJONli|4brHC5cZX$ea*iPH+CEKGS!SBK7T zdH^MzZH<316@N7qLkhPRZVTGGgZ780-K=ZN?M*7G8-)D;vz{cXF90|ZD78ODbF_WW zK$?k$C@K6D3Kb)6N2|%Uno|6O;wi;H+*o{7@s)+mm;iA9IkJ5_^l+|apA#tjRBc7q z!cXmu>#(4q57cMqTLy$Wi|rk2Ip#Y411YfV&FWz^ws#V>1D|wu7T-}C$Q+#(o?h%< zT^cy680$C>$sYs?tU1m3!L+xnIj`rJ+s`|tX*pKfKPsYN>|ok%mDWKC2>XkjaXIC78S2LkD7Sl*M`HPjr$?uUe<*`o5VYSe&j<$cWt`Dg zOM4FtU}1z@tL2>@o>4-ThmLSRDB}p_&bVBTfM=c_p(ybjgwo#^y6kIkR4qqK%l;4? zRZk1#XDKbu6I1Jgg>=?vWt^SmK_o}HBP<^MV_-?L~57B+fN2YsXwiUfg+O^hY zN_5h)Uu~Qw4R@pACO~g&hF}79bqWT>yn-RSfOb)%<c!i`rf`$fzC1l-E`=+FMu zSEk!-_V`?D#+5miJwC^|G8+#If3xv7$=*=4beC^m)zZ&>wc%XLxu{?*BC|g0SC(B; zU>*DnkD|n>RVVvaRgLlGh5I|#pYANlSI2yx^pxZ${Oq|h3{UBze0C{@ksRn>9nQ3( z69Ro9l_-SWz^(*j4@PBQRQ7Ny?UI4&bksR$Ymd*vZ0CpwS&`OkSYS~+?gKbvy^juX$ zrY`-e6Pq(Agc#W5^Ie}ElRGAfG0re{8{fK)Lzs=U*t-;S`B6**So0!t>SlO zL*qxj%n0|daOUU07}YNEor#rJp0?R?jvmw#K8VJfXg&|#U5q_teX}jl{q^5RceiF0 zWSi-oY}p&sJ=nv#?VEmsA^r8g<(i8=PW()J^%z>!HT&xpqpDUw_`(pnFEc{< zma}|^0ckoAjq$R`LV>2$q~bC{bRN%c$JEg(!aY%Oun3~toVbgFAk#Sh58&Jt5Jk(m zk4@cjvP<|4af7N?3&48l&lOoDemT1qHj5%vS>U99_3}0#QWg0;Ez|@5W{1x-fMB%i z0KK!>Uq1*BQ>re4%gVA|c*JkR?4nb8s5k!Y<*$Da*pgc*($-CbaZm%`ssa1nP0x_N z1=Og9ig!_9#p-9H2hT!OAqf(fD3n!J*qJ!3X*au!W*28Un~52DRojW9&^nm0p2b1? zP1$e?mqJUmFisHkCR4kUUu_4*Aq zP!%r2@Be_z*Gm!FqZ%k+b-rfVZ^Y}VNt`k3GhiBzK_@K4LN3I4D37d{6$73ZqeeXe zzlRWaLfRf50=2E>|9r$?;y=KYHhv$iNOb#$0{?ixodvk-=AgW>h9F*s=ty{>vDUPG zOxlL}H~!ib{GaZ88fKIufjyjD(FB@ROi~I_+4u-LCC+bLYx-WJ`%VC>Jgp87sqqoI09#MKgx+!&4d43Ea4Y_os>+MxPkS=9spWXhcjg3-U^L(0|u_W>cY z6{{dt*nHrxs9D1>YOKBhwc+`psn)?4tj?{G&wBVT+hVObGc>RI%wh8u1ZR9^M+c&b zW!DRwKLJj8bP3Enw)w5%38bw{9BO#;M7M`zO%Df$8`4L$1b0*|0-;kL#b(6H%z`p?ho2e0R&)EV=!4>mCp2OGw`ha|@0 z`VsxBo+;aujx~0Y=#Nw<+3;hj=!uF_yHgEAZ%{ZJ z;NY&P`-Kw8HrhnuIdGtu-nuoT(`wnBp_ZTn3^mNx$W1@)SMCgGEw=~6tj^}dhh_Ee zN)RXLx7y*JUlPmY*54P(ONwV6z(YU4xb9W&0v+{J{FC@hdk*iA*{BVWmCp-WvM$6` zzMhpUXt`0towi;eoE#LW-7-wpj5Zr&$czXt)A+y zRVDy7eZq=6fKC$;j_>ETD>`cjwl;d-Ts(Ek#s>YfoD1Xo(8rB8Mn3Nhoz3mdC-6S4 zXj3f!SauwKX12XeJ%@NV+)HfbX67S>gB%;XIL7^C_qMUBq13PE=3kZRm}+2|+Zqn0xufZcd@ zdGrbDsd8Hd?StwzxPkTt8Mb~~c(YS7x^SD`YF|3ga=10wU)T(Z4kZ30;nh@pGxFmR zSp63jIF}6!^??mNxF497lFH|x@8b8tN_UCJ8rIP9#?I(`^%SthrUg5iGVF&Y=CzjO z!TywhJA_ffO%%$@@?#}(y2(us*#@TR_^jnzm2Gyu+rsG^8@M-lKh26R7-2;hq4yUU z2my_&Fu;XtAqoKczB&)&f<=7*30rj_T*O&XwL_p)N=7?3q3`(7RvLyv$jq;J3RZhl zo-fqfax$EvfvCv`o@s^6iS<^rALFXp0MQD?A36mjC*#lDD3sd=b%^CFVz+0K6@!`~ zCKCeL>PfgJ<<3=kR&?&I&?O%rn6MWrB~zXH9#u-K5LZ$EX=qU}Ix~<12b@an^&q^D zRp=^`4EeDlHwSWkq1o2RM9mCl@-r5lTDL9yU2OJ(mc7G@Y)rEhSd^Jw}x)9qQMjPIoClnxkfTVfl6y=8FK6q&M5}R z23r0{HduBUwgm{dmlee4L4s5BZNyZ0x`>VbdTE zR>nfi+5766ceu8CmZ$BphANC!ZuboJEi3$#`24gQY!99`69*8@74`2{*r#CAndoK3 zz%IBP3?-1g9vRkp4Uz8xb(?IC!mnFSU0?-T5o@gA0XY2uj~5 zmSsKG_-bK0OFOFU^U)e~+8wCq?EJb#}Q~8itShIXQ^r^@!9Ixo$S4_+|CRb>+yQ%BHDn*Si#L~ zNp@&X(2kd9T$)|%Tp;IUt?Gp1!NrjZJwwCF!N4aeENV6oE{|mf$PH@RF7aQZFU#sW z!>5%ynE}hr_38$rQ?Y1v3b4fAFm>PqPgt_mcU^2YhZ=O}x45t<+?KOAySVe0(|`e@ z8yn%;0Q)MmCth))Bygk`nyO2r3gbht(0_KehKGnt{9>%u7U*|$O8Nj+zJ&ps$k&bk+MxmoXV2<79E*(s45o*hP>9i|-(3Iy? zeW?_Wpn>h9c0(unpO_Hn<6j*N98r$4^a}V)_RiupzC1Aa6v&@{HJhhRq-M>rH%zwM z+(V2m{ssM`VDyodB!x75GTw5|MYI-16WT~c0ZyiOV+cFB39m`hlxQ!=o^ej93{ zF9O=!&yJ_XGA^1&zCH2_&eKf3EMsmj#$iTePj&^)TDHK%86vRsK?Jb}EO(ZF-drC;1ifd z_CQPZupi-nir zsX-XS+;UpPazGurFE~<_`^RlYRF=!_nDUJ4F#&sFv#hi?RrE~?I@=C?(@KN+`T>%o zP6)502a-co4+SfRm`gnT6X8$(VfoWRuk}+4(KIWvqf=iWNa+*KK!+@V7|xVm7NQx) z{Q+H-SJhYGD~!`Im{E}4SB=r(^?|^muPw5QLB0A9_Wh!yf8Q?teTQ#l%D;y>V{kt- zjsxq{IOkZ)xiU}g7SLnl+8?0o4Q=^#v<>()|_$o&Jjs>WX? zBW{`9>0jQg^(~jU6^T`=qbO9-Cu=cdswdNs(dV^O7t1hC-dD({#Kh$4@{;HVjGqkM)A%6D!se{V>KCR_yj#G?iQ=2I5||BD*_+(HS{# z4u^iWv}GA;TjCiXS%0?A#%2I5UciCax@qWvu*D zjG0|?T}|kOG5B|Oc!w3e>2&oS)F3fT^+Q7RWaOsPGuOZx`od58SKky+A=oy`njN8r zU6Y9#Oik!FmNPyZb69dJx>s8n)zj9}2-zPN<6!h{at1oB z*Cutn)*mOD4g(B>(P8#lN-g019j(z69ZK!@RG8>!&Ns3_ugz+qW;7>2!c{1ms*5-e zjid!dL0!b@K#u1Q_J+ddUfcb3ZNPz({5cen*uZ!rN>cmFV*6tV$5&5E)CTHbwV)wn z{b*6Za`@EAYXYHel;tJxYzhEy1c@CFxa>QAhZ1KMQ#H zS0mJtbq++snlYfkN^9$EH~nOjW<_gq*X9yidoMR?G3~g*xTX}uuBHO z0^bb0wcStk&r9{cUHbd$C!!f)?51E#XTkued>*r(T4k4<&O|;o$%W0xorBubaUzHj zjzd@4;lsi|#lZgr0zmkG#Hu3TSV<1#22_;f6B3>Ucmn4Ucwm�NjE;n8#prE^UC9 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�NjE;n8#prE^UC9 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 GC-5I}RO(#- diff --git a/tests/data/appimaged-i686.AppImage b/tests/data/appimaged-i686.AppImage deleted file mode 100755 index 40cde7499614dd7b92ea9b9d1228c2a64581c91d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230412 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�OB#KSh#A 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 UPl5jw_)mfV6!=ep|9=(uKhm^7ZU6uP diff --git a/tests/data/appimagetool-x86_64.AppImage b/tests/data/appimagetool-x86_64.AppImage deleted file mode 100755 index d07dcc71932a7b50543a592cd6c2bff2b189a4df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 528288 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�NjE;n8#prE^UC9 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%0DKn{>_O*O=R+ zw1Z!RIICWakEIQG4%>gxC=H2p=%k}K;7|#0m25X~w<;01UT;5ppwZrmajh7?Xzg!DafOblSQ{IRl7$y%k>B_i;o&MkjWBR`W1^EsMZTq)tZ7PCny`SOzf%PFG?;#*&mH)c(F zCWri&7^`$HK9zcF%dUR;&2?8x<~OW*y3fV2oo)3jb3>hyDC6<2R*)xhJt*5%y)r#m z_0gHXS;UgCN;bGR+QPn5k)_5sJ@y|%7;Rk0E zL^4lPb9vs`F;vrZ?dOd8#F@80w>2I^yM5%8&YB?jp}Vu*!lI0wpD9D|e8qyef>TI( zQ7n_p+nV#lgEm_JB~+xsLby;Lt7hFi<5dY;?XqgxsnIS(qs{Wo0)@^WL%;lYlLYSQ7JSPVPckHubp@UY?tEr@oZXO*g!P);zq`ZN~* zi(?XPSjWe-oSPYZ8=YHFBXCiw?31kZv(1l+9a+Fvn&umqN<1}&;&7_QYUgSpM;a6( zo(TgJRZnrh@XNZpxW+I({cM8!^PDry-Be>5vf+L(uhqqX%q&4ZdQf7gkP?}cNzd%F z29mFGPL9c+;WyS|8cPlm4|~WX!ZtL-v}pyhn`ODpX0G+#J-W)J&HL1)@JiTKj+(jn zlAsTV4@fQ*mC4g5tv^7j*I{pbxPEC&wnJLBjOzKr_k9G8_|I7`?+&V#xV9$}GED}2 za2dLO*tpzAPf+va<+b^rSIhCuoPv*P!=~U}=QFpX_@8l|DauyT|JY*k=@k07(DogJkrKyvCo!DuMXHiT>^ybaRlyD2da6{Z4TP-x zXxP-~zHX{!roQorcC^*GomLicl^ReQ#G{qLY_Dhk{9Npgen;(335FnD=ylIj>zk70 zF3SAiIf>;vzIdOt;`1MQ2g}aa{Rk@cN$}(yeYm=CH(DEM!+!1J%M6M}GWC8><0Rp? zq}OC3*B>R~LB)&SQWaI0j>R!kiB@f<)Xv6Pyld=L=y_r~I6%U@^|+}!Lj=T8Oc@fW zOw9tb4W?Zo-()bS3BqChX~gk)oXR<&yh><1s&GufJx%Ps_M6wG9KO3^H&P>N-yuERszWwm-B;MD}=-VvWpOC8yo`JO`rj22@W`!*Z9p@#54c7eYxOgqh zTMF)%F-2XVq!fC9`&L^m@CNKU#Rknrn`o^mP1$&6>7(^mjJJy)zB0l)%O`5P{;o~u z2u!A+>gJd9K~8gvk6>|9PRg6cA>nd>j)wX;$>KY)QYGK0*QPdK6Ro7Q2Shg>!;J|Q z1~~}~-oUE2>UC0?_}t@)i8nYq2)%l29W$yDmIJol(hoY|f9Ye#yI%K0lca;iv=2`? zg=f+#B?mDw(LHE8pX<-gkC>m~?WL}8xV1cs3@pKV^=v!0k)b1LQ}ZaRI9if88c!wD z_KRgk--7ld1dybKy?23&DUbjEr>RJ_V|IlQ#yuqC9>SEaRJu`!N=5euMeb1& zLQ4oCmnGH`a@!5LEFm^Fmv!6LZF5U3*1F8+_c}A5IWy;&iQoVKef&! zd41mR&-HvR=bV}Gz4y9X#*x7GBk#|?rKIyhpX#5q~1LgC_5Q*rQLJW6(aVL?yi5oPc(iz^Ts!IUJgAy^~HZdPc84)Z#qA+k!ge5zPtM0I@huO`ZXtf zhNPAlZLTbKDVh@Br)8U;Y`WMlvzN?nwtU0=U6RlPQ{L6z;n{g?le+uvwDH=w@JjRz zkElJ_2bbL*PYz~g{Oh#WJpN-`YDuqxW;yjP6eKC`OsqG!(=S7|#QgSiZoTbhk#&CP ze64a<&)KVn@7=tqaqj~k21zPqR`n`9=dS1zCU9#bc`BSW&upr1tBqA{+)X~&&mFR!_kn!jZGFMy&5+-|L&E)TZUP0-tt$ko!Ms>U%q=waaJ+n zg!JlzEfZxATQoTLL!?!wME_SO*EVTBVBRMGmmRLi0~$O%@ZNISna6oOS3Mf(^kZtb z*;Aj7ue^Eg{_Dh%d)pk^GU?b#-=(t+nx65AZeGMa&p&pF11{E|T-R=U*AGR`o0jx%@J@QUtMu$m%d>G4zE8FM&nSJH>4)!p zE$bh-ZuacK_G9)&R^!u?o(K2o?@(rUru)p!(-$4}4M<)uan9|s`J#FGI@bVMNsvpg ztYp)-Q(mlTl-c*hI;+{g|GS`0!CJG7_CAHb%=kC7No>LKwDt~v?%cm(%dgLE4)p(T zQvQ2~G34>&iB??}NmnNK&1(GJ_4Ljc9_=^tvwG?o42&IciTPEpvso%*Slt2|2FKGc3XXSTFtE2DZzQ0$j>-E4 zUQa)4JFlqUYSswpg}emk;we#avs&Cf+4Oc>hOG<4v`Q3h9wPni3Q#1(f* z?$1w-{&wo*v4HC-HuGDbo7?`{>YMVk_x8_!`82do11Zw9}6=O{^qim%@6~r%LJLxMTdb7uJVH~VeRHuFN>xX zUC-T`9lj&tlhw;h#ARW4OKFL!D`+WSqng%@L<_wE-yBl3)Y zZl5m8mtK1FIAD~k;pwi5Yo^csD`;kZZ}o|}D_Z$Hf2{u6QNis^Hm%1ls%n0C@JOd3 zi#z?p?5x~u($o$a^yN0*#_T6%iG1P_advsG&kE%d1nMST0x zH}Qr29`_!5ZmfM3=xIOP(`83_+B5Og2Bog&vKC%nvv9_x91rUczg&MQnQwi5>78B) z4Ys_F*-T;{emdrCczVe>Q>n+A&6Rsrr`+}VBwK$jsm1fDt^V5kv~#v$bg#52#(Uc= z>i@Xis17f7gtw>Dzrbg_VVK|1Bh7#KW>ce+AesS^DqBCA(JfUEKFylA*zef;x&2l=wZHkIy`<6J0|$G)ay%J!J;1td`G&Az zZ|ZG+d@kDLx#>7pi>U{9oUpdP_&)l|&_b`fe&;+yPjX^Y{^;OCr+>j2+sS!O4`j_Z zm)1G6ZTjT?v*S8Fcvro?{cpw|t46i-E^n|kq|j*Pv2#;h8eVy1w&cZ+fA_6EJU8ss z@p+0Ct$RP&64vI5{mdexV|7n#AGM)%pPXAEi<67<|Cry^tmA?oJ=^yGXQ%NGZ_b`? zPp5yu(8oc4x&Pj{d2r^s`oD*7@JQ`)sLPTnxzFFfogA7VA3U{xd{tDp_di8{-=Ia# zH))oeJ@y7+k3NqUGwH;jN(Pp&S`&T?-D2dwE60QUMbx>ckn0~dHs$5 zxg&F`=1=)!%IY59|1+`qjD;Vs#d`i!6!7Ebpn2Zs#?hY(WqV3DqB=>eYey_{SG^_G%e+c#u+gzN~{KMG3n~wKvaonia z?I457<15<7jM!(DIp&dUVaeQn-XG78yY86K!D-DmnVxSRP06uqwY$L_lbDY;{Yzf{ z)!$PxBl*dmn5*8+8m>y+@O^T>vxPrzDsHx_!1H&+xYWz9PNrzE=jXq@`OY+F4nxx^m>? zifvu{4Vk>M;-bxo4#zC}wA^;ie$BWe%?7+1d?l^U==jl1@BFp-=6lC!P673gU)nf- z_1%i}s_zEwIFJ$@`OlQww|^h^di2$uv#MX(&puGHy>Iu8((RA0&B$qSG`>sS3oWO| z+{)bF^ZBV;uK!)>d$aobv6RMcOZ_&PwcORKkS26y`y*3|ogu;&Ux6Y^8i-Id2%jYt|C`SaBC zu7ywKUgNJlig*&b!Ee(3R*U7=8Vh%S_stI5p#NH)uTK80^yK-zjePu{FL!I(w#%TO z)3)qe==E~Ls%@X_CitzKdB3>jHvc5|JHOp?u=zQ1%wZGrTkCrCo!g|X?fh@=w0-!& z$8Ey0Dq-JIv!eSN3tC?6_UB69icg!q&HCq%d31xKq)F+Qt6odi?)ZJ@KLxWdEjW5G zu6d_(uGc~vI}A!3yyJrLo1P{=mk@mCeMISyQEL`u~xo7u)mSuA~ zcwXBT-q-xDSwcqpMQtsADV_V>_l8NQn^tV`X!blZ@7>B@chA4;HFM;VzpLv@{W7{Y zvt0M&;&cBMefs?x(xzHE(J`olLVWF6S^Vs2iHZyF4(!Ofe`@O5wifgE9d%!`K=!t} zJox&~O}PQL-x`c@D(c^J$XFTJ;^_BJoyJ?vG_xt2$RTA%nP zIQ*euO6v2j232M)9)#w&- zY}oAj@Op~=4jbQ`@Ah=@m@Nipo;@G3ea@%F)-Rj1GEP|)e|6ZeDIGVLJm~McX$;JgmiWzMC=Z~LkM{?l#l>VLhg9M zw>Kf~zQ~skA@P0)^Cx7@2tuX=5Mn)&kej0jxfevp@iBx<3?`&aD13#XT;YU#iaC6N5W8qXHpQS!afHl`C&U51^PQ1jC*<9ckl_x5yd0$Y-UM9-^DP@fybPJI+Q5tX zw%Iyb|4&XPQ6`h@Y;*l2fU(Y5Mn&@bKeFA2I_C__+pysbhTgqZx18-szYDu zqb_}^b$)#9yfNP-B-a#3iB|M2Kio*mkCwf%?sSFM(Gy-*Pq>Mm@OpZ})pcmi3n%pW ztSy=u_O~z<2pkYGud9OOwG{|@cT*54!kj@ja1a8FWGuZY~ z5N|LNl!ME`4Dc$L555J9!HsqbQUUG--+^g;6~x+HAlMDcz@UB#k^;tnIpBV<1T1z! ze6S1@e`_1~b5FFb|ZuAU+cgz5^>ju?V`Wf+T}tcj#cjP~^Kl{DF301?UY{ zgOQ-v1Ni`@U=HXF9tN{KVJF6WFZctCLFN|>#KRP%63hbazJ-6#8%*(rJ(vd;fYsm) zQ0}83Cf`8^C15ou1GD^4f1to0enBx<26_jg91V~jC1EHDqu2c@GF zq#7&$B^D?rXa{FoQJ814=*{C^eM{S?G!I2H8{R)As&?2=JGpd1VVQ@~^}56l9K!F(`e8tMlu z08KDZR)E%^cm{N^Y$p7*hQHbH1D4G}c|h4*^ous|GY{ni%hD7?fbpknKF%Ldnt}X+ zDPSd70a~_0IP?1eU>=wOhAcxr0p(ydm<5`&hhNYd6lWn_Fa=Bo3&0$(0xV|YeUJQg zK)TD3E+|`p^Bc{Da;r;SU3A$|}?sC|Qkopf#Ao47h8MUoZi@0j|wMc{&ON z|A7*);U=^XxCjgZM{a>V_yEiU--E^AsI6#cPyq@$Azweh9()bTz-HTE56Zz5&~Q8K z!9cJWwA%rDuxKajI|~Hmpak4=8TAHU1tUT8E2uy46qpb0`W^iOJOoyQr$MoeK+v@u z?F9Y;dV}Uy(XYVMU>4|q4eba143>co*I^GfzXAI$0>QD{um{`TfjyW7%E2pO7TE7D z?7_`o87TP^_F!*NY>WJYc3@Ej$_>5)Q$Ux$P;Sub9?A_a0xQ77pr9-2=@H5ehJZ4L zl_)n@31)x_Fdv-v82u5HJwv)+4k(tw4=4p+fZkx@bL1Ob31)#-RmeAJ{Q~(02ZGgL zEGX`V?f^=`GSC~Wu7*9>=q2pIL0|#+?JM*bkbv*Npm*r!-4XvklpCz`9{mjr0F%K) zFb6FCh;oC&KB3&;CQ#4={uL-Ucm#;tJ1W$n(VEsv0CxREj5-@NwA(h}l(4?n8 z;FO4UC@2Trz-?e87@Gupu-z2cgLYsExC-mRO7IqF(hL0_HFE4J-j8!Mk7vICC!S!JstQgMWdQjNN?L_dzZ+3@{ta2P+oB9_+FR_FxcbVkZz}g4W>f#jpoIfRSLQOxS}#U_SVA z3GBgvOJNVjfhK(gf?UuV49# z;SIIIZJ1wL!Rr;mw=)ZV2az~k=peF8HS`kY85m{@MV1J15YdG$ll)A)qB<(bEN1cQ zC=xFfI*Kfp7&?n2nMOlJ*6GF$B57(J!?6Y;>%k%kG{kYF4w$rx@Y>c%LBgp0GRA(X zp_53m#K=)(ooVbOlBU;j5ZR^HbrpFVIvR-V;L$;3?a240%D*}M9O;a)N1*bT$>cws z@t0~O9InhiYrxcvJ>ow`{0;(Dc~gZEtUsonm|q^MhTe$@fEPw(>=F?!v{8`3tldzN zbh1c17&>E@4ZR)oRw_HOI=x*8w?+640jGX_MR_u%T`BZK(7&U)H~cZ>dVuh~2>+d1 zuE9*XhKr=a{UV8jx^#>m3$&kq7n*N@roC(sJ|5w_sh=fGeP=R$(v487sm4B{0*P>` z$l5{akW;^m-&oj}cj5LYCVy!NzkqNz9r^PW$zrs!r;J~S`1cXNj;XpH27gn>ZJFUx zqb0_fb^KE68a}FrZp^0p0P%~lH!=mR5Z@g=Z@GOLX!wa{k@r`-m{s>4xcr#vjERC<-4$OI- zM*TNp#{+M+{+M>!N_9JZ?c~CicbLdq7@?<`yiIkrlas3aOud@d!Io`+g6tQ3J|1)W zcRc#{U}bx;Zk)}8Udlk;NX?8J;qY4qzjCf$cdp-PQ@%&_dAgOkm@-g7Ty%`f9wKSH z_V~c`w{panAbyhIi~ZVLBpai%y4=mQ+P^OL1n_66)o#pqV2|)XgqLvB(bW%~L?OaG zy3%3%r@>DJ{CvwB4{{M+iEwA`c;F+FC2+=r(}*V?q#)Coc+qS;SCMpzW;oF5hp!Po z1o6#y{m>kd0uerr?T5l3wIP#^4gSxEo@em+I4vA$s%``28O7935aL@pC`eq5{mDZl z^ZdL&xoXw_R``)QaL+TQUlk$T4&l9x^v*{q2EtI@$l}KKtB;Jmvx3C1;~P{5WgYGrp%_ zaRw%(N*m?)hxs(ah1<^=KW!17h4AFh=A~p)bw?aR+lv`T{7vaKIRicIu3Xo-iey3; zQ{@Taz@1J$?+s37%=xejesf$EB!Zt0sc?ikA58s~GwHk1amRhV(t3S|m(L;HMre#H86j-FvxxK5`q*o>VY)9|m-J`0(sro z$t-~vqV&j|7v=aT5B`48=Z~rS*`N7i^J8I-@ni_jbA9$+B3a01iO2CmRO2_(ZsG73 z0)HNCySb^_Lo$sW$C!L)B3=gKUC@{A2()yhu2QS|X({Y2hbl-<9rMHxQOH>Bc|y7V zL40e(KP=?5uRGhm&TRYoU=JhL)4;wu=hY#abwxN94k?}rqWz->Ode+Xhue}%Bi^W=_)Ox>0uJO|<4LOu28fmK`>Z&l@HW|(Wh3v*JfQ>{es zH|+EEO;3^P8h9gKxCf0d=8u0gehdEiN8@+kg=dRY*Vg&z?m~FJj_}h6&(jfpTSxwx zar`yS&o0e8w@rIrXMqih#9KkESbYRLt}++hJ!i<+F{FhsfIHvkkYh z|HGe&pMvz`jXSRqF7>1HsIGMrla2>B8OEQ@ci11m&O*x{Gv7NQT#oS5On|SBb+Bfh z9D$i9poZO;lbKe1=fZC#{5EFmo9(8`auiX0lD_)#MQUE$p^fRYuVE+kSCA(HJ=cx2 z*X>wA?$kN(JDClyVc*NlXF=$IhyCgLQujP86*};)Po<_YD1MJ3EQQ?sR=?W1%~~6OGRg55k`kUb@UYorv&a ze>zWV&Ii=X*w5CJ%Jo0>-;CymIqR5pUJ=cYtwBxuiy`O)QJ=3f=>~&oC!>bQ&v497 z$_Ezau?^*>wE&ZkX4>f#8tM!@l)}YD1VJ^L`di<2U8c|1^F}-o7py;bMfZ)Ul2WV)HV@Oz49*E}ZS6YW#=2 z9QKa%`dBK;B?%LWT~3Kil=C0-Jm~G&aV3PU7v`F@1qPe~=v@u;?CYJh)`c?RA~c)R zXZ1YP%v}}k${#kI5bpX}d|CpgKV>&o-Rs}~<$Z?_`jaqKXTNbY6DH`)nTHwePal!a z;ZX`Q@yq38uHg$W=ve@(^X-9+W94WCN&HHGNqYLbFj{B6l_MjQP9d{F9it%8271=* z+UG%t@Q5C7Gjt~JV8-?Xt0w55V==$zYX>(rogpG`;Q^iLxGDRAuJ)dwGrpr{AC}9c zAB^)!_!a%2!dN)JhW26nJ%hiJ5C!=t_=#$VA66-I^+4fXUa_5O!>79~nSg#7&v!jq%8>j&ldN8@YmTa7YhCLkA#g3P>N zfk;`#(3GiB#+F$hr$HA(@5tW= zONOYcUp4)7<)ZbGfz3P_hDiY|1jcr=FN9$%rid-Z&*`4w&=fJa~k#qu?lib-@3p-Yn&=J z5KgUOoM6gj!8~IWhxw7au5#qAtGq`KjD9ev{ zIfz$>fBysF83?~>pmjgbu*`tDhsWq!nP;5j3X&ku(uL8=TYOCVr=c%{-np*!{lHX1 z!xnYbw*i%Yo*~}ysR|Oz@iR&pN4fvQLgeyP&HhfQ2dG>q_kYkYPSxJWG4^uS-UE8; zWCi(+Q;zd&Ibs?A(-b6wW1q^}XF|81uDK7S)O|GR?}FZaI=w&5+K*=KOQBDKzLleI zWc6pz-$K94(MvVum*9Mup&)Iw^Xb@*!nG%sGdDb<><3n{TcMaIrRFrTK7}spDD9> zE2IJaR(mboV~Js=QL3@w`Sxr+dLmx%HqH7`881{*5B|_2wrQ>pDfLMjJrVj$=!ZDv z+{gCkZ0HTPD@dib?wo2UyvufHrJo|iE8kA<Q6Jr{Z| z^zj@$l+}x%--Et@qt9dY+tA&2D#&e)ex21nLO1?VK{gp__m^BFb$_vHBM_wT(VxCO z^wK?a9l+`nH06hGSwQz8YJHZb{%1n(S3vh)tbLfK{Ltsspcg?u4}AtlpQ0&0bnCsk z#}lTXeT3cu`bK^~TdC=1OuV-Evl8+C=Eu9k?T;Ra=f6)u`fA5Z)RZ?Cx*WO}C%^8R z^B?*K=vO&Js7?<;LJ1rh*y1BLFRM(q_Fu+gdTWA|2Urw-3xje$9@i* zk3#7CpdaPuW51A-kK2gnR-_<-96x@V{trC`xJ^U!fH_muohaJz0pnD(FUyrw;yByQsA3j3&hu%e7kJKtZ zCc4mLHIyHEGIR+if6dtZ1u^<@{qw|3=(CS&uX~|~YtGMH=nJ4<(biov4O5MTXVeYN z_&JSu-HH{Yic^n|*?N2coj@OBteww5V|6}_tWlOT3X;t!$1=7YZJ`&O)nCs}(6^n{ zKM#aMzkZhPL)3bprkrWe%b^GI`?D9fKkq_3qw|>GIqA&Sod3`#oY&kJQR$wV^$+wl z=k>4O%+U~4(2F?wAQ1=xzHqIk{n79h z(CxMLsaoZS{t>#qb%#Inz#&BMc##O*3wkccezm6kp_f9h5OUV}Lbm+SGd+pkd8Zuu zOXyv-^=PgB&va}r{kjDv1Tpj-ociC&)_+gvYlacx$w}W$Q-0`YhUxd82>ogedN%Y2 z&^Ceq5RMn`_)i>=xb}x zv!U;TzLJxEmZtwhZ#BGz@1WW|}+h(uY8K?m4e z1s+P82*)KnW&;mxp2U>j%)-9AUf}$LrOIX$m+Q6Awf4cit>_taj(Mnn0#z0Gk2ludMFh zx(HLpT}ia(ON-0=7G)<(i+M2DX;lW_ntQ8G+dLkR`|_q1sw>6FSqrYe$y5?ZZxi2$ z^3_;jLYfO+2T+y>lr;QNeiWH}=v-HH`uIvT!v9FaljeFhye|J}{Nb?Sw5GTC?7lc% z$a~OO+vcxHd^kS_?Ln?q)BjB&^&4w0TQzN`_(Rq#xEC(wZtY zRBSECxB`j#<9KD0bVdm|$vEuAxnJ`NA=<^S6+M-U{D1v;+4gBcC)-dnzdYmVC@L;< zR9hEKyqa^`ED>pYOwfIo4O7~X#QC~w)VAue5VtYj6j80cLy^`#{6jS|AtsCVHu|Sh zWSX}ewXAaeFKJrZv3HM4BE~d1jyA~Me@I4f(CeeWl5pr~!sBpOWCy?G8k!Ol3JPeN z5{t3~-Zk*!;m{#D&<)V7sz#-A3ougV-qRAS6-Tb9(^7q?k!6i|NB3fNXNF(d;k7p^wffwK}$L#vz_1N$`+J#>VCUDT{{LczvRn?O@dUK^xA zQ|u<_#OaWDu-mI~yN{Eu`NQ*iQOMhE0TxKkL&;BTPJ}HV866#|2F$agJ9>3^yl&@^ zLkgH`4-=(#8jPL>SMwkJ4H(jYIy)XHZ+YXez9>>qbJkM0jKofYWszZz5* zrf)075GWiWUv2F)X1(1UueNLW@!64^7q1(CY}WS*zeB%~xIuj+UM|kJu+ScrkoT(P z1v>RQmW-)B`~VK$ya5m!F$$jGzO>xZ2)~aC``vOOD5iA&u$?@eK3p~E_Q=;>HSjnd zI)2U@Trl1g+o&4WK=xR|-wqU*7EM?~2rT&^$_=1yj4ytoHL2U~`Kwm&#IPVb4e3Ax z{?#P%EEzFZ zXi0aMa^)8mj}s3(%hs@0UHN^%SR_}NeO9EV zV%uw{y0U8Wd-8wT1#s+3e{0Uh489$DC1}jO*{Zw0zTYf;{qX^@<{qM906kK0oQ*66 z#AOvO;WB|J9urJ~9UdB-jcTP&deEDXWvpO=+|E&P!jiLq44sdx)4IGKgR~8oUmAg% zZFVHnU72g&wBGIZGnc=*3cn*`{KHLkK(r*Er_pW!^?xX$Yv5?nlh4AIpa0}NHo!<5 z@;03&o~CZ?(L>tp#XW+6=5NWdcF=aUJ*?YXtK#c&b@ZM0lerxmNb&tr*bk{OZKT`D zs4?1_t>}ppVy%pWFu=n(ZL=vH>zWYn$=H55X9TsCn%?n`)f#-uIa~%%RfDDV1N$>C z$6p@#QkJ&0^}%L+MB{+i=9{+DojB3Y)-yHrCOSCk)7L0LcaM zrCYt%iaU`^wFZ|y`OouWCioVqvmop9*hr*)hB7F~oWXTs9~>)0q&KzIV;(PxqNs16 zm8e;kH&TB%#aSMf(w3GMzm!x$sVRwcV61eJqNk8&P|5;lb3M~)QC|mu!9})L0$g5J zQyE;=Q`rJsdg+HGxEAb)Z`}mD#!v;tPC6mgL|q)K1XC7xbFetTPK6c?8@Re(gu`Id*(e4A;9k@^^euwccYZv}Xc;&W2;}7v-?&FE_0i zqF%NyyElYTc?vf^A(ieiPa;41OYF9dcISyiEq1wxMZN4^{C4jfo`kjDub}gsZbrk@ zME&7=k6l?DKl>Zr^j?7w{NekKomei(F2r7x<$Qo_0i?qs!^Wvrk$0*>s_^TX)9d{mo z>KDUMH+1r{R8KsALHlXmm;Vm7h@tbgNQ9AxDf~%pdVeKC=M~)iv9|~VM_7nriIz*u z?cTHdui4mQ^w8mp#@pR+Uka(bccF_me~`btweF66@QPiHy^#I+Hq?y;mxlv)9jnAeBTo`Lu@ z;4d04?v#okkj4oSM4Q)GyBALe!p*)A(g2p}z1@@D#tIMeK9}Uk72O<1(;s?8C3e#) zf{y6j{M2xParB3%QIgA5^sflgw$@U(z&d*1AGzLT8QbX)`ortEM1UKvzXfhvU~C9L z5IN93`RO4>a(RsYumiWG+fZXnqj2HfiexPW5I%N2VjoP7Te20XF$RFpe=j=VlkT04 z?*pr9+_V?Ye8v4C29UM2mPmF(mt{CUq`y4HDFO0oKpI0i@i3EASM3!15s1C5iPn&U&ru}X5v3U~4%LjYXJfF{{dupw>-=8qa-6;(U7q@*~F z6UErRV}NXLndbXCa=TMwQxBc=C|l2)Z>jxVRRNrH*4iQey6bq23DwE_BQrf3NdKq3~oosT^uv-%=Hw$h|Yz=^i>>ws= zL$TvoJoaxfu5es#bS13(_=86)%mWL9#bo!|XkE(g<6u7uYha$7JYSfN>4;vjL z>#aA-DfsYZQ|X*WBY7O>NacpZt!2}>(1$A1S^IXuIVBu2Y@CUnK8n$vBBJ&~VNtC( z$VO=zJGrXd%6aSovSt#-Tgp&~6uCQj8CtaF!^-`vrwBYMnY5VIhP` znp$DN5JE01v(nadhOaJa(>WZDM^zntl4j<{fl!(PtmG>-Qs^haTl@dfTlZBV&G!jJ z9O50d)>Rqmm_h!SZ+EFzKgmoHx@VwtRyB4CP7n)NgZ*~(-7I@Q*p+Lu#!xvYSIChz zvX6QKa<>U5&hIdtsmzmHhKaDQuqTx<_sQ%_c)L5JzxhAZ@gG#2dSm)JqO|Be=BgAD z6fGsbs=H8rP8VZhQ*%+tNJaRLrs9AxXMOwP>|3#EX}8Hcco$s!Wp$1 zI{Zce@86h1s0o>Tt|9i&xHsNrlz!yu^K{6eIdQ=m`@YW|mDbKzuQfOB*SP@#{&^!@ z_iY2=;OL@mSrv_DZ2f){nAcoP;^9N?kIU+AFn(D|aIP>ZPTB5$O}bE=oqd#L2_lh0 zKCg`3;dtLQLG>W2lZ-L<(R^&OEg~RY497Z5kF=~o;(B@574@5ZoyJOj?-em-91idB zDX3X@_jmfpJL{M;c9ZSvx>^QyeD1)ueh2w@r!(djdmT4rHW`kpn(7G3`+m({Da~de zyB%nu&S+>i@8HIu!A;-fh^y-GhNHu1V%H~cKM;NTo#rb>AwPUwUA5 zL^WFr_!9?iPVBC`y-1^zPrqOB0~bj|Gy3mECvef7k8W&9a+`^(NV-HK()fk15hizU zkUBm_c5C-<_63Bm{cl73=9-%d#bpl?_I z2xSfFPWm^@`6oglV)}ZP+V#cw-x^$FkbplU8<-^bxyV2OXat$_4rF79=zl&u%wodC|ADuMA-Lmjw3PxKv5+8Q3I8Jb)ik?! z3qkygM*o|O{3p^O;`-lOjDN1~--9I0VXqJV`TFNS;%?C81;HCaMc`k82>(d+|5N+_ zjlTRFefc-SxP^epk08s$`XGVH|7A(u|4)oV1Rxm_1WfRc*ml3+(C+KU-$N3R>p!-v zkjX%*|4}YZc7O4Q%mJzYiSH00+%47t$;oe&F@o)1ivQ!Sc6``v0W0>ebYlN13C8#b zXZ|0YEpKA?e^ulA=a%=MK!*qr!#~Kpf8exh(i^PlVyh|qZ&88I>R(I8)VEd2SR~7p z@PK&EO?^0h3+}-mlrPJcU;1qJ;O&r%L)kN%g55&CQN_?Yn)38sQ^k}zmB zwHT4hQ+adu+0?^Nz+y-ds4NDFL!Oj?j*?D@x$y2KcQ>k>s!YDfc27U z5t&uHsYdjocth%f+J%Jx?6JDyAOM!WWt zmp3G*=$lQ5R}RE7tPfZdemECFh{-nW8j_J{xC;QXHWU#9Qi-il7x-B<7t+3GNF+e? zO@K65<_r*44OvT!)dX2vE8$H6S*jSu6%`n=EwiEuNguvX4`OGd6pn;sED(kO$yhA3 zP8z}m-|S!B%wZ9jAFygNFM*Ia!&sgW*YUFaStoSf1btEvHxU%TPqTnv2qTjJF$zrh z-!}C_NVHQ5XG5IogvmiXYzN)QLjd+zfsjCuZNm89HVOZP0QwYy$p3MPy|IBHED+=W zDUmn25Jd!03{qCeHd#QD+@=zaI}ua+h`;fMm|_vtAe@auZ}uT3Caft)B?Iwyqacbi zMYbG-8Ft?*M46@(j)KG>45NbtoR;xM{vW3@2n`4)B#573ELMmgve+ALh+>AQMh8(s zZcq!me?d59Ks-EC05J;5cNTmjIxaaBMCpCd^Tr5w%Nc4v=(Q5;7@y|9P2Q>KNI0U! zd{h?09vdofI0;!{QJb_f(P}GcIU#|a113p*`s6DR-twr`_7@X@!%2KKWrW1Wtw*z* z%7~ZK_|8vr!XO(9X@Cgcj(@8zjYJnh(hB}OG_v|BNU zk$nC1EMxpGNXd=wx4&lQ0&Wnm*JV+`jI-HvD_y+(CKdehCV2Q3G-@*xCD)7>*cB#s z$;8yFFHjw}C?4e@l3P8Jb6%5gQiHEvF^(5Si$kwLT-g<2zT=5?%+moO>+<(rEv|sL zuuQ4Oc=$Fb-oCuu#5sX7B*K%HR_QDJ2<4 zIFZ2K#j zrKysRE4mQ}dGp3HuMAQuETdVAE3&Bz28l@}L`<)1J6ZmQiNeUPQADgiIBLeYk7maf z?sit|St>byXx{HCOFUW=hAp@?;@t#kaPE*aQ0E;#yW)I*DbkyE`C^G!wocY0@}1b0 zcsGGfVqRnz2X8;L2l&uyHG8in|C|!d))8}S{aZp4+ZS04IZ%&8u8iHs~vd z0Xy=gYp1Ym-ko%j@3{b#`omP1FXIuei$=2cK?j#ogj(@VEwcC)>Y=D? z+z5x};+7hQH#@vH)lKK!c2d;d5_HR48WmD^g~}uLuCu&VQ6`@6??d8;*;*enh!LEh z&$pN*1ZWdbydply=A3@;)52L=^8SqSmkhvp8~Jvnqcsl2s01SL-dJ=Bdg3LN-nQ3e zT(C<7-q1B}up(sNozD3MPU1R%(%%NA>f)((+~6b1>x$y;_n@$AOURPAB{{-I1~gkW?<9bU zkYIdTI;8Yz0d%kLLDD3)CAq?C-+NwoC25!UHJv0$Ixdsd1U~}81t_BX)vI$O)=1r$ z7?!;sgwNtt=rwXx;IV(}?l-GANvOVngu9yk1;SUVb%RlMEbVulJ!S=Qp>sfrvevJZ zC#BZ#*p&EeXJN(Alr-nTgedL2rFq!f%=pVG-^KvgR(=+~Md7v; zH`|g7%@V#wg3HW5{_gpX@In(ja?uC>?ZKaRbx(D!JXdA#YS$8_8l_uo&JPv7XJ!bG zJDiC>VwL=b+1D6XFv(h6Q4fo|x8yF~wry*RKc)a}>t+NKa;xHd7=rc!e;A^CEk#S9 zbvZT^8mTy@OmZN@yVvuIB8cFdLuuL5Og=1#`mnbjtzZ*l@h7{hyK)ALhg~?GUJplu zz|UboQhq_I@sk&;0f-|?nX2-5&_#r&tYDimPoPnv^A8q6!b$sJ&lXRmK>>M4QlDF< zZE7;4UyaPjlnClx!$%?U_Z`^(0<(=+*@L!7&s=lBdYQ#Y%jLh>IfiZ}cO#f<)E_1no|4^c`rF>fAK$qtl2b zs1bFIP<`Ww*U1l-Z(TWwdFR$Y(5FWD{z^Mykw%wA?NhAR_=6b8Zd1~ONm2@{c+CA& z@eHc)AgJx0Y(n^ZfSlDKvqd{vM$<}Yr|-K&Ro)^h>8L(>7|}H;qM%I+OT;XB`va4C zaX^OP=>99}gZPfrhG{EdJK4N#>0SE-N6#;28|IUj*hn4Ds}LfGb5}Og-*r&k3kLau zG`n9E<4oX8UT64>BvEWRAE1TT@^JQ<0I=oHfGFq4C&kcPTY2@Ecyoi8)*C)}Y#>b^ zNL}7203L+|Q69_{InvWKmi66&Oal~at>SgPU zK)mAbw4Hm8J+~!+%<=+> z`$HpTXPw`*A=xR9+c23@HQ}D9Q|t)=5^XBuNn;O$zkgzD_uVtQ(ibTt#?0%73ir)P zB<7?J5M_`23Nrwk!vKm(xf2)GwA7Wb6uln_FF3t5eqQ=bud+(ok)k&7VmZuu`A zU&u6EdSKjd;V(OAjtO715BcpGsWX2{Jqnsfaq#QPZ;pKAVe^U{4Dh0i`ZfsXRA)I) zGN2B@hG~6}TL<(hGzhIE@-;r8rheCteh`VFxBnN&e6dQXU-o-q+wZOtk;CA?yQZI5 z>a%6M6kZ9wJE{m1d4-;W{VguiS^$Q#<{2JK9p*-o#qX@@L=%(oBXUDpX!%9JFU($w zch_gP!)VYd1^F?XMU;&qrIM0Yu&lcb@&x5HsJl2rX_KGY7UOi$mDMxsK&-SRLt&;p@B_orV~x z#K*!juHF!O>)J=wnr>}nSzN{8OJ85!P;u%xE$QF!MXr_i=^tMg-fiK{VvIyfj;S7D zUri@9zrq&20149{wx?#Lg{P=|z2;7S{X} zMuUGn1b3YU3(gPG?ZT`cVP}BG2{s_2b*?k5xTA`Xgd@VoZ>5Bs{BKy%d^rnx8{W7= zG)17X9Bd%y`ssm>|21iGvAK@yvS^C+#f{OZt3nROoEP}W6Diuz3GIDX{v&`LN;8`4 zYUnHK1;V z_yuk#LTjrwgDn3jM2yqV7JWtO?5F60M056x(8=x>vw#mi(6(};$JKw?FL@HxkfYzA zW`Q`M81BJqUSReuz#!oT@c!on=o~$y)3=<=0m|9|?1K|2?!bel>EP&)5wL(n9C$w@ z2AmY~?Et(2nH(JM1772!-gg5q8LqHmZp3nUE_IYgTyj5wOaMr)+qCk)Zps&v7csKe zJb(OKaL&FU*ozGPew(qT5-PT3b?tBR(Uj`P{DwI@hr{-RntLPVA`0XFM8+6bT5VZx zk7EeuQwq&lR@^W;SN&Cz8x9E0KP{=UnzmPLfZ}+^&LyJp9a1(#j>IePwiObhGqLfz<2 z+%tg%OdY|EzrAj@g=UrOL0QS&Pp&vvX59T_yXq}eQcPge1(TH>nS6;(40?0nfja#I zxBx@|Ib5OmI1KCr0p&lO`LsTSbU$!(Km6iOAG0th%ZOJ`r9oZm*S>Y0U#|gb|3j#ldDQIo{aXN zKOBbS4T@bFtx<}l%z?8=@v-OfpTPS1AG3T63qygsyr0EWESW@01`e73Sn%HlhXU@M z*^Qqzt30uIKYN5R?8}nC*1NJ$L@Irox*i7JvqR3d-c3iRnh+{~%)X)Sd)@p1{{q#H zACeMGGETBvkcy^5r|m_z<|KLbN#0V@ri}=ii>@r6bZ@FP?VA%uBy&7O%cS#R`+h=x zy|TfF@|76dq#=$6nVUVmU~OVNa}>83CK^h8RLGYW{@44FTl^h`7>tVFMX+3TeF9S7 z*OF^L*|J(PC_+CO6bT>n2;PHUwVAju|1dw3`OvI7`?xy{+=R*KYkQPe8{=Tjwm1!R z>{J3-ztS~rILcl*AY3VXGR9}+j4enjTv@mlE*?p*e_8ihVW=#8j$5kx&E}i;`Td=u zF?7v~_svGC`fzgZZ+y?$1S?-SbCwdi6>?_o9ruqViy3i-tApq#t@GP;Rx6&f`^Xnd z9rM7ngmjF> z?l!K}>t!XP&36b1@-oV+XiZAT=ZqfEc?%JQ7vOzGQ*)IIz1o9wQ476bO5dza?zo8u zWV(kiT~dP(_UP5BPCg3oL>lorn;VBvL)pBEDElShvn6&`oj*}D{wAxIi?_#PRumk8 zOBFp)8^%*igh93Rm-kGtC&?XIb<&B+!Y~MP@aeu+-It4)#cJNZU{9_ct{G1?@QD!> zClZ&Xb&s<#3fyCsaZiMOUhKKm^p|)rHrs? zFjzC8pmPMd)}LEKOPFW$EPsDNq9=x0fiPEjVyrn7&534Jvx+piH7fUxzy$Ff9Y5`6 zQw}(%G%k|d9Na=5e$72-vw{A3U@?)ColvAz5o;iAx3smPTYr$LTZ zX`yF0o2YB_J&%>5$g0{T5}!*W&lwAD&VEW=u4Vrk)_;RVH!;7|+@fB3L+Fqp<|dck zN)a|O7|S>jtRSa$li%5+S233wx7SmV^MrB>r?e*t5~wjK0Zq@ptAdjgUTWQ(TeTW$ z%?UCBwB#h%Vtb4glad=#@fu{$Za(Mq0L30M)5Z$oq#6!P^%2j?Cb=KmwxtSsJjCsy zqzI9K;2(xdBmO)UC~n!V-DnR=)h#vXGnWo`tI2n~jrthcKc}~d`XOESsuALvPJ-_} zUki!k!^wI+eep1)n2-_j2u3ScUU(}|Y3yJs=`aTfm8THw)IUVY+M7PeID#S{aIWxw ztNb<&RXENH)%ino??PhprNmO~(RNkM7W`FAR<}A3%;a+SjBy1m3Pdls zZBL0cphrV+BoYg`o?R~?-~zm{eR%=!F|t$4ktu9d{6_P&$A-xw&hVG=k_4pa6%@Iw zi09dTDK%Ec1bD3o*nxzt-A&jQwolw*+Z zl+2mH?`3yUB`3}1P4q{Hg@>R6llXT(yE2i21b`~lRc|qwBZs}27_DNf5a{>Iv=+M<^@Oq;DtI74yosd92&{2-xc7bVRs@iL87-X`z8zjhi7;+UA%t+CJD)p-U zj1_wbV1lXq`wJEFp_CCN`?IYTg;4(aY95VxS@pjQ2`Xj&gc~TOZiZ}8^RlIQQ!#-9 z%)fb=Gl6Ric^)I(D+kxTaf+T}DRDm&^fo(~aL0N=<@WwE&6;$M(thLrfDxk4a7}a* zOSo?sHCqY!xiWJi&xS8TI`U0Fy;wL$m!uEh$noOiJ$j1|>)JlZOQq(362u?+pS4wH zvc$TGQtHmjXanOnA623Q3EEdyd zIPPb^0 zH$PfN%ahWPVG8Mu$X(G_EL*z=BvDS^uO zRuDb?p?KxJH)fLCjAN<>uZO>Qb#ZC6k*LV=ppTk+(jqTB>dXAWh5naOwKBK^EB$P{ zTfvd{dRbZ;=WTeME8mOE*vKZwp6+07Q8De_rrx>;*6X~ag!!77KWhgTt47cKhemOG zD$wOfavZ2S$!HBF7e)Y-1HSWf3veM-=C52;*SQ63TEq2+_^)giOF9S{3^fuxP8Ti- znTULKq1Z6S^}k>bZ7ZwH*Nban6S0`mICVFLByj$7M25|JXq4hK5UT1(kp?%Jc+3J0 ztmBMn!9tCWjtSm_E3O!Afu)(3ireI-b?2TN zawphQ1{`vp`=3nSiwyi+3VYsh$PT3{XpM zJqNkwy^_O+H8s9x|7EmiKgn1>1G{U$IyjsTM*}xrvE_Z?&-0%={C=2&FA>GbWJ6;+$qGi{czcZ(P_}F`T^VBf%0sYc4hbHyxkQ+Fz@J7J;G61?EH?#ddQ!-z?GW1=yMaH z*4Rz+eV7C)cD`lADhe~quC*@%<6^7k;-;x$Or9`s?DPVoTC=1Me%_1;mVSsd?w_vq zbr<0PeI1q^7Wf8}F?Luw{bS>Ii_yl!BTf|IOBlR?MSOKU%vDj!x>-)NW&v)^tW}jw zjT>SMg>0~MvY|ue6)Ha{i264*9soN3wsv(G2&5{7)p zG067LK3qiD%fJ6NpT3?^=6TgtwXG=(ehul$7~ayZ8dc2nJ*I4O*6zF96scMysl41Y z%Ov_s>UA;mNeA2aDhESqq8{nw26II-%hZaL@S%6)FlWqh$D{=G*6I35HELc!YF?Wo*L2&P1#x zQ-pB$K|RDQw)it6$4d)!m6;6(%fi91$=gYqTDq%C8Z>U{%sc}W=y00582L?Nf0I-mPj~8xP9gf{wQD*fu|@}HLJ})QzCPQh=>)GgZN*O1?I!6fdETyBTk2; z18*o}?G(|56k#kBG>L*Pw`H-Y{4KG+?%8%(>=Gz|B}DTbW!ZMYS2?H7JOg~Bc%)v% zuenH$J}VP_`k7vBKg8wAe`QTe*7)eRVBeX2TA$WhcA|4qvr-SN-U|CeUqT&9SSw{l zwy(7A>cSMda+IfYOC`RfyRLEnZOd{7I;BeNtfXpP^<7Q3;%M071>m^McV+w5jo&czm{_slWZMY2a*a)GR$?QP_oee^Dezq7%Tjs2AqGSpLlj#>Qk^ zY(!koaz9w`qFd5kg_cxV+XO5D_%?9l9fz-Q$11{#cacPu81j5my#b$IxW5o_p04!a zsh*9z`!0%M();aRNmpXgL(s?sP;1W(C2}m{L>=(7JKZMw{`fxrm?6~#yZE@uXF?!g zSS=QsQfAgb^I!IAI4E?bcL_A)lf~TEH)}cKw)hZg#i8Ann~==B#^+72(4aS#Qia|< z&Z+HmJwj^sM>0uS>hOL4V3(HXneJkRIX#H7H^CxBmphsaT<$b%T2AB{#`&VJ8@Rx6 zFg=MK0yh7CY0dHLixWj3#%U|q9FS@!ossPYcz&*y*^WDHHF{h zl7(vQbuiaNmxSK{*x^3F!FnuQqw!8A!vC|hZbnP@Jv-DB&Z7Zw+{JXAZ=U4lQ+6s1j+>JxAKJW=bS z|Bm=A?4Be~ZK6;5V`fDWf84QYI&8mVCBCmA2`rh1hX^tderd#~@o8SW{qzH6ZVmOh z+s>Bwg7HNYpQ83p`5xm1%M{rRv`WT}VV-=SR=o;-?pgKji|amz>6rY_-`fY|J6|$x zhhJ+-F!6cfaMhO?$!&VS)O-hv6L?0B8Mz{+4H?u|^1pA<>?_Onj$wpu(u|c!>)pXPH0#1khc*r zrJcG1nw6S(``r0Ha{8Y_A)d{d@j|?wBBW!`rfU{y?pX`sg&-XEf_4^-skTxY_s*SIE zS##4aR%|^SFVd(1VBUYfUOK`bf@^y{$^e*de;X+qfq*-%Mj-NAsn`kehybpBPKfJ^ zzFt))xCqby-G3NmGUw^2IqlJ~=&i!806G1lumV-MAT}A0Dg1#8F5{`N9)DaCIC6fm zJaCBsN;Mf;rU7Q8ewu}srh6W$xS?0@Erl(nDLm+$1ZoZ1S1ejfW!K`bzkRYpNl7?M z&f_fMa3m!69l?hV{nB*oVvWd<4{i&{P+ZD=uyI%==9QeE`o^?a2?|ouVIDTRN zcUbqGbP_~L(CbEb>F1p&*r5+_KKI%kHU24&UJX^H-?1LCeR{v2mG$`QN|@Unc`d%# zb%M~j-o3Tq7N{M=)LoeLW!|i~r8Lq+XWwPEJxB*ee7vzYqW^ZbiX2|)Lu;e#?@mQZ zvgq)I=vkPhvW~C8^EL1EYXTD%2KLIF+;A%(tc=^6vz0+q#Ti8CXdJRDpTzo*AO)JG zyiPdaI{TZ|c)9HMtspx_l|`Q;_$}dC;1EXjwLweNEUDU+KcK%E313yK7i0l7tdLuZ zsk+6MW+q;eIi={{J0?cCTlN~Ff-dj2hpF45h)k5h9x!k+iL8uDuBzMn->KI!Hp1oh zIZ3v`;Pvszu~tJrLugXYSTS`&i71`bB>UZCQbpfp23wdXlLlH7LZmgJ>*r zY@eFdwnyAnMEkN1?pVpNtx;<^R1Y=V4uP~4_538(;~~G9RjiUyyP1=J2H#sx(ay)k z&s%JPk}skkKzcXb0z2~LxCorL;Y=UJm)ep(IvuvkXY=ViQkp6-n`)u-rGdG0UYpPx z)6!8UgRlONev@TwjU|n6h~v96zuV}QyyuIfl&#Pgg6VtbkiTG~tNE!1I_0Z<`2vxE zIHU*mHYu}Gl|C-?<4Rk9khrnnS|Zg}-B;7u`2e_O<=gRzWZ-`eWodms3S1m8$bR|| zyDziX+q|-phq8L=yNOfh+zDi0MKQIS)em7A`U&E_!5f+P;mLy5mzMq1a4KKLUb8?~t@O)%-X=0yJr_+9An>sjXPIOzV7(PBQ+>6gJba;HEaAG03^J29$S9rfnjV%_h=d(XMWFP`XMrEoR{ zGVAk8yF8}~qevJYSfw@E6iB(4L?4?sP2od-^Wq4buCVO*3-@_AjTyeptH8HT%GCbI z3v08PsZg&AAIt1??5=SkPu0@1P=#U8k;6k5M=^AK4n4NK3SRK+cvAc;nlv({5@dKqiFkuN-665ZS!U4>ePb%Xp=LnBsBT1z=K8xBPR_u;VB{bd zaECU<_E`9Acb9OfMU!Bw7BBu4zgInnXCUZn;OsmQ5*YK> z^Uoe6R#pt->`0BTNEq~trhfx1F!LDj^b_aj_$}#%IS_niPz3hbHSgTSI}R>MuCpnQ zk#NB=cK(d3hsQkV;5?%sj&lK?rY^jhlFI^|s=u%7w%X{<{OP{cqu2BYed0xd94uC9 zBn|(7N9*dmNJpt-f@jo9dtwi&(A<}HRl&f1Bw{*bG`^?Ud#v<19Y(zmON(othX@NpiMjjM)Ye zk_ij{kb9p}>Jpr7mNnf!uo6U%pouqMY&9Ony07=l9mDvWXC&Gi-v6t%ap&l|4&klc zr7)|iv2y*JL!5lyhwMXtf7PkL+K6^cnxkI-L{mC6^plbi@kjLRA-zX+YO{9vAGblm zQnzG1E-9SN}kud=`(QFTUnhu~MYK1uJ=b;X4k&7bvwh!NDNwzwE9;;CB zA4`L(n7Y@UK?5Zi@__0V+Ld|7f1+KG zui^h9hm8LU-s12wAldLBsQ6l#2kwMf448dWJ3$|@K$FSa3y7&fo@fb1|E0zId^PfV zU6!;!V}tGQ?&D7$PD#v`k|;LQY+D?Jm1Ad!eHKdO;Sf2MXB`~m&-HsdK7^=awP$Ky zMA3Q)r~f<%#JDvLg*UIao0M3#MUBT7d-jc`yT~p#X?tbkEF5)SdAkNBeFPh`$ z06eFkmB7=_&?RmZm+G9qcG?70;}=BWiU} zRL{E%mY#WAQ#>!~U#N8G4wu#kN){pC^79pSc}=RfR}WigCKe0>#9@Vp&T4OOuJAdk z4rlfj;3KLuqjT;gbS=z6BeW`?=T&zXzT)QPLif{)j;{yN4vBgUr%9{dZ6EnPs-C3n zB#waU?t*xj8h4o-vYac|e^YM+9Ud+fA@|`3=rfVr)l`I6gfCRL)VGKAO7ILeBlq|bcm z0O75mj|E(}{SYcN&Wi2eF2+nQSZk!&6&6DK3`MJ8ol!bhgaPH5XtICB;1A25SaAo&Nh6P zXeb!ZI-9vTs0fi;nXOcw95K+EV_o{}u~~)O)Zt?82(GsyrzoW2sb6$N8oV@93JKOt zFAp=Fk>M3kEOI$$!jw5G#DWFL_~-hz>c{04hcGd*0FUq}20!~2ge)SRnOs^>)vr)@ zHlk`z8w28{#(QWuK_g{}qp>N|LFExh*)%0wmuiUq zy9k9vaPIpf^7|q)#aeOAkBPWFtAmb{PLVL@T&-O+UD2)!82rf9cZSnRRj)X|zW{qWwL;D`d7FSX|#DK0ICR))VcirAL zrZeJ9#-pGLjzBnghY8LCdzdP<{$(d38XXcE+X?i|z}XBxn@B(pLh-ZRQdq!Gg+i|; z4U~+q2eF3&F1-M+*rS8OXt6|@YZ%$@Wxy;((qdPyao=c)>(U=IAi@%Y>+sBWo#N|4 zB`ay`AI@w7I*@zU&@WG-Ov@JsW=rW%Pj2{sApEqR8xo6ypFNjqjq84A;#*7Py<~}K z5;+_&nz)Q*|5cLe$B1@@tQ%DVre)Q0G@U2-5AUq|7k!UH1Fq*==jWgOw?ZuL)L^FX zq`w>2mtM9=vLQ0X_fro;EKWr19hO z4WYKK?RGR_gE=&Mo5Z06c07*biMLSDCBS5+I9 zS%e2MXR~GPm^$SlD(l~3zyVp7Ld_t*X9DSKAr5Y*;~RGg=`HauYdsB9A=k{fx0O^x z9JZvk(j@Cq#h*V&^%dMCiNz~PO_x;3QF6Kupkw!d2Twr_XDmhd5wNf8RY}M++XNQ z@uQEmbqe$a$f0`Ur|=pqn_3EN*cQTp595FMl}G&VftDk_vYD+VQ~t(5HvDP821e34 zB4f%rqI2W5MCa!KsngqQlaPZQ6}*~gO~$0kPZ_P#k=8-0iPmwSMwEI$gjY((>+=C! zj;ZZ`^ZGrF>_<@KW>o1(lKdk%>LWW)VsHSHBew6+OX{EOJ}t?A62nkzFs3ujDPQ1R zx?i4;#5d;}Z+RCQ9sk`IV0E`*+pS}bIAch;7j5!yQpM32_0?732_sSTc8jGxvi(Za zzzu6a8uqd|;syMyn-ODwD9BjG1Gf^+6vu@blRjF-jI-9%sp{B0dbHWVkC>ia z35^dNYu4h!!uBH!{Sr*s-xSsdiR#rKp%@-lkq=6rqLj7qss<(7Z+v-Xp5e_dan23@P!V7QFHF!)U&%>1EG4}kF z2~I3>O3O`+EwyqsU*~f~^{cCO_4fS=P!D&kBK2VXsD;hP>>*kS?ZAcQC2b8G97FV5 z!OjV=YZZ>Ni#J4X748ttMbGvLr+m~EZ&wDA)cEk84;AkRl`B0LW8C*hirY+~&cC7y zdi)w{Tu}q_e}4wuWC6`4mW~=C$(ww8T`!`y;2NMaSmC*75Pj9mvOf72zA(~E{-}4^ z>O1(61(Hh7;x#HWK1N=5{)Bk#dy_K6e+wBl;(feyx~;6;UdZ^%D&oKR7tWA@)H=Ew zh-hGgB7pZ_Fh2}o)g6B#DRcv|?w`Q}my~zPDc+xe{&d=)sSb1?zwt>mk>E{%p|pI} z->U>U?Fnrwqk9hDUqLOZ|3vSo+y2e;Ge#wS6GNVwuMFV>us!+!)5LXIf){$>INq_} zOY&zM+}8vunSaw()Y!{)1L|ct-UNB=;yPH5ek=L^VaW29yZ6iAbq!)3H|Ud11}=U< zPT0K~v?L(mm4P8D=NK6Cz^5_`@Xq166a!3gh(o`Z(zl-Z5M~@83(9njfTY+Bc<8U} zHq3}Q7+X1 z->4UQbb;5E&iBLH4!H_+R19WL`!@?+>bl91{3ifirUF8~IZLs`=|@h^(nhM(pEHI=;iidHT55Y(n;T6SSI;%47h&@xOD1zN$xTJQy2(WHES)S z-B;jLd*W0)a%v-+2Uze=m{}~IZa9?UNxRiOQR)2r8>l>cJOXV9&@}}9c}7FE-6-^O zqJIlA2A7~vr+lC{wkMyZqzDWC|`IVn;I-CTfs(fDa&woIK#B} z*$MB+e8P4&K$~C>nHA%E|Iu!%d`r8na%uRs%A$|mSH7)sB6r_Y_`b?n?`w>DHYVDA zm5%h^{(sz8sTjqTU4(SwSy=8aoEO00^!yU_iBo9AB>eTCE*PHQchyLt^!B}Y2~Wm^ zeDI^_NE6`Jh+Oy=(k`>6{oCUP?C z{>zs4X*xgr+kKk5PYK$6nm^J0lq>3enxPN0ZIqo?xKHz?Q-XG%CNzn*6=u2cZkoekWe7z4M3wyc zf4m>6AJn8@zwyQgx=uE~N1gM?e{|_y@(w)JGSRO*Nuoa>oH*;9%dYW!hvm2-oFfNv zu=Dc`EZ7vL*(|w=T|k?t3{DikoB`ytvv4~g4@utsalOFKMwwL0J9>x_+K(Vt zb#$2Gu;^P!3*P-7(p3c;uBEDKa8GM-5uLv@RzQ-iy69sX?$t%KC6l#yH7dU>b{8mQ z{fx4{09hS1Ma$4}fZIkjbSVHb2OgJeKV<;9*HG@6Sn%Q^7C97Gk1TM??Asw1m1uXX zI%VGfN3rDW>>!Kf-ute0dYjARFj#)+>^P9HJP0v7YJ)Qp6rTK%k`66Y3_HivllKWb-Y6h0B2Nnt0$`7`%tH9 z_rF@~ceE}_6WpdV;eD}%X@N=aardb;xbBpcK`FS_yDE4c*nRluikFm}#G;Mbe%qN! z?*5FF;P#gHWt?SmG27P@gPpW^B+@gYre_Yn!}JWB*>{c6@2h6((T4D}4vV?s<10A* z1x0oWT#Sj_2mC~0(KpmA(ff8xSfRO(U~ILy1WobvKMR6(*U4Om@@R@4x|A3=arwQ% zqIWOb%)>TXSsM>y09ayC+BEktj7!p(Ao>>KDsTwM-?`!gIAE`m;^ZNTieyr(?c^by z88Y)DYH~s0_pd z)yc|0JS*Q_8Q6}_I1lWg3^U8s^0wk5ICP5-(rNz#c=lYXIMPn4IFKZ@`BB~`uB)v$ zU~2QNTr0IXMbTucj7l3_yrAprU$n5`3XF$K*!QA^s7w^s#SEAzdW)e+1M)@hpcrl7 z4JZ`7_)EO0b*1cv=#cu=1#MDr(6!8RWwv6msCjQ{6T>`o2*^p{IiDtn$;o6IXmh?p z8JWW7{j3z5C(CRI?2O$1peicz^nO@lY!$t0w0&^A{pFdrX`x|S3*2q>4xX}GOAY|d zwW`EVfD9YEhr7Xw8K=<*RX>CkQ{W#^3;O3ad^{gjDPEaa3bu-p#qD^Dz8jlRV>FTGY*G6Ddb-6Sa4&7~s9%J0 znK0K!*U>bzts?Ur5OwFVBr~zvqP(Y>ibsO?2tgAJ!WJt9(>TaO`N`L z8df*1XVDI8unaJUf!?xf4&b8m1YS4s(FLYACppM>#7~;DZ-S> zS7%~prM!(++wZhgcaMS|T>^<4uMYR5zZ z?RDLEOuG(<*6kUNk4WCscQ&)^EkZ2ZpHO7PQd*nsb$=s)Xa&D&asH8PcTJl=7F?j~ z%l@ExQ!w1!sGcLTo;EQkz#ub&_P(x#=0P8u^?;4mo)yeG0r}hbI)#hjHATU{H}5rS z9!7lzpV$4y>a(w-n4;k}AD+g*SOKLP_y;_fgdLgs1SEQYXQv!e>jPg#=8+b)h~CZ2 znQ+re#;Sf>S$N%R!WCF1dcULE!JS_$JLUbQm#`9#yGM*r_Ih>Ka1Y`^ng9q-G^E@6@Xpm@cb(svn|P%3oI#t{D|KI)9=7I zA83CE0|h!<;lA+*|6F~EcUO=%x7adRrxVwtT`jB^z23Lkop|e4FfLomkjt(u?Anbq zb@gk+7I>axQr{y0UV7s-k`H9FYjO(~7rn-_c-Ct?izmMJzgcX3O=kn^OvdiO0E(9d zwgs2wm$Zz>l$04M6x#S1`jZEnJ&gw1aa{C{fd%NH|IR=@XkE?#k%imc^%%HnB1M9$ z-Z7d#B3qdTlTfuG+lO%&RrdaPkoL`TTT+$#Fuj516U7spL_u)MD!$%&C3G%pYBIsky3Pz@-17DxaW)W+XiRnIaAJ@cn z(SL7Kyb9_EdsT!Aka@OSs^~Ywpk%-R%RwL+{;$A@(BA@18DE)xQ#&;4t7cRg$LPL` zU}k=al8`T3=r+R=T%UjuEXR)k3|@2u2G9kJPZPZ_2=t7jAhYG~R6KxzVdq{6h5Q9Z z6F+!>iCwy!yh7SAw9#*JLs;iq>y6ncdkJ{i5p_?GWB6{I!Qy_R~}t|As!%WxhoI zO-~YZ>k)lN;abWs0$cZc-*l`@Vjg8U)(FBn=F3;RP9Rq7w|%sZ>#%#{S8y(jV)im8!Nc@KE+tKlzFvgVSKF8 zc{aTbhAGOc1GI`>$|iJW&-_BW+4op5kJ@Kfj9K&sltBE_a=-FPxXx4XPVjE6|Lsab z0_6ugTj26fjO1Vb1;;PEZ}I?RH!kyVJ3g?bnZN&STB59Kv(|VVyKSMTX6LXQSG;)e zL!0Ce#^9qFA5XGC9rfhLxb|Qq$;Z(D`5W_pz83a>F46iSLs*V)W>X>M_;{L%#&FiP z7<}9bmjGboD@Slem+E6Hx{qTh^q>a>rM>;Tm7l#i7y zTT5nUGK?)UaA_|v@FH8(YV$S5Icw{QqK#K zE9IwMhL-n>{;k|NzT6AAd1fr)%AHB&E~RoYE9DQgCHw1&<+bL^TS?`maOE|jN8FfB z+RKB8fze1MN6feW>#oqz? zU6RiZFU293T1R`I=d|C7P}>~WJr1xAzocl6hQ7c=&DAH>2(+MW;d7Yzx0NvH5xSq{ z6&5I>pFNoRg61^8HJ07pQlz^bF{)Ml4ns(2iEAu+3+-mGkL6Jq!S#>TXiB=C{cWFO493e#n5N66NYWRn zK-U!f{er`EPl_ZPt$@zO{^ee@(dB9gEZr?zu1(9vIvt?K}p)KBXun!p6l zI7UvLV;n(UR$a7;tt3dDalgEA`Tl}`6?LfQX@d#-jPy~B*Fr9E8+3nvAVBt7-lYA7 z#kk8avpWXW2VpMJQj zWc1;x&;0!0&0|@#o(F{KS(aR*%9`IIyaT zzb_`kwgBzU;EOHo&X<3NoF|$t^N`H{h2*bcN!b6f7=Ke>9VL!uiMzvzA|$F)6$)PP zJO@~5T_*h?nS28Gms$3e;q3dL4TUzKUz83kXy@;1x9?AHbeTOB2G98f_bL5%Dda7c z+V2St@uNsC7z6|EZg}(@Gf2wS68+xU!8pmVNjqQbDK|^$wXi-)H@Qzs$^w&wCu>!9 z5-;_yejMhJA^K>M!KQ)$49Nzyx4D|pX|%C0X< zSTd5G6miN2O6huRr331&9kMo5UpHtwg=nalS-*|a6MJb_Lz&d2&!WTiQ-u!cEQhai zn`j;6{hnm*TXu*S`{+O%-dQWRrqFIVVIICB4>kqHYUhuz8ek@?>BM5KCOq}3Bs{>% zw}#7iS^rzvNm|*OXP>%W^Ld2rFaH`^H)$99EO<`easTx>jBngS)$XExs0qFd?Q5BT zXgL2W%1?W72`gBBx`PeJ$2PoQaxsmHY0r{}<(I|OvrhS7YB_bUI^sEGV2ncg+YTN3 z`QpEKY?(|2Hr5L4#|X-HG0E6jMl zWmZPJaE^gq`n??EF<4FaH+tdka47O;Ty1ySO#aNNKuML1r$5f9cA2?}rvNWj1Fj5r z0dZxaw5DI>jOZVIS>0Yz7B6E5@PBE9lILPc3fne>Y4aD!Qv*F08sGg@!M#D=2Md$G zWW17POln==$d`KSi*WI}a~q>y3DfW4e?OG=yTo;^2lR4Z#cuR~N7q>|^xH*u+u(hu zFJO%hX_b%`3)%jJ`B3WGtbVeXU3OH|znA-JEv~520FdikWZ9b95d0;d^T%eT9v-f= zPQ`_?uYAEHn!iEbCB=ehgo~|&qW+cy~~Tvuqp%I z3~f)(6Bd3v1|}Tzt9JBWc7G#xc_|u6X>shpWinkhsbVNywy$0bPgu^@T!NwCI@V$$vm@P% zSCl5;dB71EHwl_V9TlR(qu4IzWrr>V^{ZyBj2e3)`+c#W*|iwAKBJ#M5WOh|Jt9{( z>Qd_&pYgcAGT&sAr{SR_$zK596@SFycHujVv;wk#?h|ylKToCD&msO!Ns7_`EDp-M zByAHIh`JfiY3sKjA{lN;PYv|P@njlQ zj@U;{!A~OWNDZljDN-@hOlM&n%1F}&0eFKKWw^SXLXDWB#(A{Ze`+w@I8|o)lAVA1 zk)(gv;_&&mBK%Rc)6KZC4xO30H!!YQA1{;HX#aq{b5r=85k--88_aol{Iro~JDT@k zAfNfr^>}2uV~7XKP9h>MjJO3f!b?8(Bcx#4&Y;aMW08;jA_}cr{WIh6UN_2gTFquT z9@2A^Ss6`6*1iSL>g`**P-`E$S`<{XtKEL| z#V28pU^H-`y|R5nEHQV6pW|ZFhuE)1Qq)hFewDJHbikHnH`?0M70P5>C)Z8 z!j%#4Im+#s%FFGCvzj{^hCm*w0%#A@22L8#Y{EUJO}On6p~8vJurttBHsV1pXt2{j zf?=n=AD(KvK{H4Jtd00fD`BLo6QIq(VA*oU!OHJh{L7+n{L2E==aKz?Xxm)n=8coU z`jK~?J0|a{XuP@NLQL09{{5KPEu|qS`BhRjY+AS`;+J1pQv#qpD^7q+{ z<3k=KaY}+tAA*cIkiqjKZLKGOknpQ^v91-vVb$b@`YCg9VO5K>5mEvz|N_3;*Bat zfuPMMbqAf)bsZp*5>Z&S110S2Fa9`XZN${k;$c(k#>lmo**`dVvgB&k%pch4*y7_` z^tdCtyh;7fuiBFO*En2bSK0i7a95=RG{zR%p*vI^v|$3%$J1tvk|qyxHXfOrONQ#5 zuomwrdb178<(1-;o0&jdwNNwh*2K`p0;mpHrPk`JRC$xQv;q(_b?>{lbki;0$`!>2 z1Xx}dpC`BA(hBdlqPHuQr#TMEE7*}ml#d2tSg3!-xP`cx?36E*Ho_obQ6cJ{B6RRA zE@sQ#d}dbng`8w_MNBZ&Rzx<`+#0sKN)G9_=0&!++Mryk$~=CXYyQ0dvAa5U9`1*5 zjPz}6W_PmUtl5_RCikR;G+}NL!oT|yzK>g6mu2vlyKg{GvpLcj(N_p!6~I3OdWt^0 z0=sB_jNsZ8SfJe-oiJ=Bi;g%Za29?tmLoNhaCHJI^&L(q(2NC|bw4)#Uh%ukDS^i^ zu;ch0*jBN+i`93GuGba}LaDV|9)$>OnWuI6T=Kp`lIW%7Ol~bkIc&gu)z9Ex_6wTi zXUW~g;tI&uqVH=c15xk$vxf zn(X_Ad2HoYOS<^~q3uoJqbiaI;F%;thLHG13=l4fGHAHgL}5)dgBdcBH!zVPAVE;k z$f1BByy1`|ftf+xJ_h2sxVnn2y1MJG=R$~>NeCq1f^v8Sxx)R1ArP)yB$=i>kHI% za>tSo{t0+jiaWktJd`EY!VDp0!b{A!aIbf97#wKTk@MJF=|yVzSa<|t_zrXK=k<7A zPZoz^q_>)ept|)j9Fe*k%KE)i;F)@@((!DCt&`9Er1t(}Yy`yFiE8g_3LPt2l>-rf z7Cj_U=E%~e;n%>kmxj-e$Cmzw`H>D8{APMaD;MrS`fn;pEFzVwmzI&rRj(B&7VlcY z#NrRB<~ZlFj?&YrU96>M#7t>1s!t^oz` zPwR#y}Lx zV?0;Vqs}%?pU8{*oEHn4`g3l)FDq!8DrDe&Ia+#=4DZdR!@m*o<;Sgyi7n5>@b;y& z$YKvsC(7?Gp($Ow7+2`CFzbAL5ivEh%4z*Ov0R<3Jpf&K0n09hvR6U&!1unjMd~<(eth@oDXZXAp`FkNGQcYtH zDl#O?(iQj$uS`5IkM*!Oi!<0k@%*J`ojmwEG<5?4^7fLXBiJ22fHidR@ZoHc=?n6X%7KEb)^^^zom5ZlQ{4q2Ha9mA5fs^dX zVeD=-c9mi;AZZ~f@yaGAt*T{9U{%dH!u;PYz`KEBn8TS1F|phGOYoFo_y?G0NipSl z1M^IU{BpmA>kcvdAwiqH%u(D);G%)px75G8*b{UQmbn z>H>WFbxL{q6*wY~WaXw{xuUJ?kynLp8deewg?)uv3A-Dm1W3>T{cS-T`&4NCQX>lG zngsP(aJCofnU-~8h(LgBQW@Ex(L{|#fNs($YckYTB`6(yRmbi_NS8pl4-w1dqD4x2 zkezy`l+s0jyor@VYPz8d8{y;fqSZv?5jl9-tbd0Ic9AQI(Yf{J>JWGI3< zQtBkjz9qO&9a2^dG$Uv@y3nkXpx(@Qc{NDBo*HKlnC&k@0jpSRT~&=*(VXW@6y86* z1jXeG&k@50)S_b?N$>f{BrZibhP$8~AK5Jf{zMv@FpJj~F%92iIWf7w$?*O@5?dYv zt)LCtCdD0l+RSdXeEXmmJ*7npk1%J)fZ}}%@f6b`WuOPpzR%&-hV@vB@{eFvXAjBH zo4(!jU9=khIJm4*X=pQGu$6MvIJ--IFXJa>qAZ@n0DqTc`CdTt)p0xEPl=Yui&s2A zh~E$r`?5T{6<5t~&qW=PZj%6A(q<^x0GWMn!A}+{G*F%w=Hl_f4F{Ezz?QsmJrf2nWDH>me<=>X+L2v;G$;RZAx1KrL;fFPV$ zND$)Qh0<5K$G2bQ9xa7$!y5>#c@B2a8puL0KSLa#5U@fO#3^CMS(x!4Wqb_BZTMLD z^;NU#OVyf7#ajHci;6)#WokVsSo~Eg{-9b#Ixj`mWf=8> z4C~)*b8+h30t=kfm2O=ns;dQqz3R$iFHM0762+&15HK)@& zB&+7!KYWDSDl(rUt`9D|Q)w?bjeHm=j=NIAa)(ioaRt*Oi;-BH$7T{w* z%a8NOqtmU>Nn*EB_>d##B0-#?(jHD-Z8gfHNHk4 z#ktqu-!bgY(p~DDVizYWW>Q1P%BX+jz*nN^=J=eJBXA@nFK!L8fB9&WZa?p8Y*}0a zL0AR0AWGs~MX^_X-Km^Mrq33JrOy>|(`PzQ@FfU<)Ur$Yv@6^Oaye9X^45Z-cr=uU zj|(1F&wWc+b^X-553#&4EHAzx4BUZq%ko8QFz;ab;#oe9o?Sn$_x%|b0MdiQ+j}(q z>ThXdkBlU7*98-ehx`ybcI`no^Z*$Byan^~qs3d)o-<8pt51OC(SCsnA@;w65GwDR zNd8i10@>V3L{KhooQYj}BPjGja}Pp1&wX0Xmo>z@8Xj2LWlFhnJ~yS@H=oU0d~J#P z1J9|XH*@iD+we5N@#uID_bu4L1Y44n@( zkq(}+9z1>UjP>AIvG1plBCm$|#*#@`S*U%|0o>EGm~W*%unw0*D#}Zr&Qg@_@Z-H% zAx)-E&nn``)JT?i=9w^Us3o()w4r9t3e$#q9BWY&%owC?&nS?(Mv~9+!bi=@wp&nXaA-R8nVEcV?w$D)&yc9Yx;vA>5{xu^E|>2oUp-fm=$mp_NRwPD3vr_QFYm#^!*79# zB+EZ0qpQEhVxN@NO!O`?AjQ>XT*diK6V%fgXnUqqHmVr79ue1I|`u?0~dR;M| zp$_opn(6iRdb(sd9QOW3JdXYf=Qx!LW@kWuJk3np?93M^A_B6SDMM zXIpgWu)|+GZM7BTv8O}+uAuTcP`SeASko@#uaoPa#=Z9PEZT!d18mO$XFsc}SznAy zyB=EFTR6+#r5zMN6t)?d#A%yerWTH2@*4gN`H zo&Pb^7Td%?PWX(vXYVtb|EH%wIDY(Ty58OLEDpuES@dvkjUTrJ-x4Sns9=|cn^1|P zD}x|u5Xzp!vm4Czj?ajHHY)rG+JA4NW%OomP9$^;PX;$&`6@5;H9$_e;#1(nOeE)T zC-naHDFXNX1v$r$AzWlquF2Zp*Lg=pdV-w25`c-FM7>qi4IVK#ZD6H%UwI+^3%5sl z4R-CkOR#v!c)*2v%B~iAZ?v)pK9)54N^x`PtZXiwdm_2-cm#yDkj`5n>AO`3F`B;H zZuHk6#yOsaiRYaKt+R1>i?%xo;mxVJhJeY-NVYnX) zZ^ZB|EW8WD(JWkx;T!*;aKau4Ut-}544-1*`568g!oH1rnEw+NFJruqg%kHe_)8Yf z!SG*MxB$a%vhZgZ-k_Alu#1J0zk~2%7Ve7eovp-U_z49E%rl;aKf>@R7Ouwd{Vbe~ z`R`)kXEEHLg-zc>xCi2&@jc<+MS+R&!B1HKVE8Hvmty!F3!C;q_%I8E&Z(-qD4F8>lKfwI&uyDqH2*1L@OECPRQWu7ov2X*1=dtj1EStx|hcP_q6EysC zfbbu~;^)Jc`~VAogyDM>958$*3pZlf-YlGW5W<{-KZYY&xB$cTe`ok$IKaZ)PD1!N zgwZS^_Qem_ewLPl;c^!K9p>A@!bKSWcNUg0{0<9e{D|#`uy6j4)P@%^yorUEVYrHg z=V93R6NU3I%(L($4C9oL|M8aU!6EW7SPpJPaO>Y{4hC^v8eQl04#{%=lPDrtpQ5$; z_30CJf$?~cf%p7JIroHHbh@$LIZ;Ns*ni+nT<>#DkTdE@c3|Lk+`_DibatdQaGnVG zsx%y)#(ZJg#Y%#+av7gj?%S=hwhnL9PWHwlY6sKPc?nhv&V%~j1xxhPot@Blk?^3e z7E9cuY4Z%`Hs|OInx+e#3!3J0o}Vat#0<`}heDA$&a+*w*i(jjsp@tZ+E+Ah#o17eIXB*B`Vez^ZNnlxoACf)U@N}YF38tE$$5T^AXB^% zFy!AxXqD~cl*&@->xz7+&FgiX2c57>hBc2V_;VY`a@*>N z@b`+;4#jNTEUc&eF^|?yEpX+xcP8R(>k?WRarMcOf1a!^HaVQ9cT8yhcWJZORL^EmTF{9~YYgdwvEiPN z!wp^Ofpvw^_%aGXpOP+&e~$XT5Wqzld8ym-$0uSf((oQr%sTn?H`(HHp$nr(!vzqN zX^m-8^n7fR;rbNi-D(}PV|(;bG&1`4$MIBP=w`Givco8^8=zwjz6@VXMveW4aI$y1 z`w1uG%BefVZnusxtM5^2fj{3K&YyEz3>;(^<30w+;&#_bz1ZzhsG2-S(ihLZ%Faj9 zr(OLt(&q^EGm1X%R6h;$8LxhJqR($eE1%Ky`JwVD$3RqPSG68v4c8t;mg4-QX!Skr z-;>FGsf>+xnB&P^t6)wf^Qie3X+bW^4LJ+xo^qfBb?AJir0L4CdSC zY#15btV{;!gPe@U3)Zj9wd64MvK<$6mt{Vb(2*|S-e@v}!nr?=M%Qv~C1c`aXg_eB z8FjCVkzz{l=59uuu3(1frdW9|9)rKCx@=fIb+YmjO&SFbF?7h-UD2P=~W@qKNjJTEq6XJ|_Sw4nV z!a}{dQ^*bpo}+rVnNh8wcz%8cyW*3x$kwr&Mbq=O-7~~)Hvr*E!;kPgYvJZT#_(}MkAsUM4BNou|#zO${FRPC1yie*D1;H6z4A-H2 z*~uu3xky0+2H)f{*a?GcDHx5xLzKaY!2=ZRjKP0XFsAc9sBX+uI>sNuqvkbkd)uJV zqQN{B4{cHo%eVX$gvic?XdYpgi>WbXyr9gTae8^=Ft7-L*;HiGvBsw2Bsuk9085T{VTiW_Z$+9rNg;Y$e zQ=B@vc?&aj>p6@^y+QfH+c>x-lhpI}sV7LQM~+ZE(zo;Pz}BD-8(|Gv2|q*$oTn2k zx-QF`k03R88c}V~ZN}X!T&?aT>F^m2PM+A7NJ@v`tG;CU_Fn*I6=a&VWZ-n&tPJ?E zZrz8$>fd3GzWbpy)}lg)k%k)}y!9gp79-ZY*KIbF{effLmcu#rvQ`sDB|%iqtWpHA z5r3-iN5-EE_*08N*YKwSf12S3OQDDB91JW`1IyJwff{fV*dHtaJ{@W8hL8gR#8oD?aZ)6SuI$~9%TTxr76b)Y@5L9lFkB(IjOCupK=RO{d$IbK@ zCKXkPzR}YEGRZ=obyGQaaWwOpkPJ)Ag$XFQeNTQU<$e#NE>shmFU(-xvadt3tHsE< za*<)K+Ytr3A@qT#Mlf-kJ6Q`(M_AWFU)@J8HVo$`C}fJd*1Sy|-jxtF+%_E2*`a_k5 zspHwgEXHky5EN~uVf14W{fTT(ofx-!JQ5PlNJx&Q`|rO^!cn$t8E>YJhAuEq!lkqc ze#wPUqeOhT_A z^S43azY&%QSP3#6}I6G-t3@5tSs|KjuCB14OjUO$Y|WJtW)GJh6oLw3J*@f}V?mgFoK~Qco`~wiSAQmA9R~PwNc$QGRB2ADEXc-*u92bIc8=PK^><+ zHja~Lf-+8ME3neAK1Ug+>?;6_PIkT&=~iJm2&?`(FKH;{MYItBhALP!)vBl1H%24> z{)st?)GlRlr)Wr;=%mZsoH6Ps-!a|-z0?a?eeohJBNaKg%A7~Z=j&`5RU^&7p>cpG z{CPVEC*lAX{1N+(!(YQyl%fq!vUZ4uoD9J8cJjdL0$TGQxfVKw61$-c4%PM;KT+p* zT*UVV6D~C1L9j3K7@cT&Hmc`X_XGa&>)E8S_Njw(D61c)JO7&>VoL67=@5*U;(N*K z$I_}%IZkbTiyaDfvWhw@&}?%ikZQ9(@`l!X==LE@47v0i>%DEzzy5FVU}EFX(De;} zB);u=9NoW?FUBpl;jJ?eTC4wG<>p^X(*9&}(0Px&K%V)c4VLDE;XuwAYNG z4=`jZ$Mbj$9MNMaqYv6&Py3&_WEQ!idVxU}y=3p1@EMh9-_8mBy8$lywtE z;a@0mf)MInht%~F{P=QN%A4pz6(+xDbaRLv@Z5bTo`1iFXFbcu;7Vws5h!JZ^3-c& z_X6On+-S+Y zq%@Q)$epxg!TC_7p?5l+!Rq{(7ZghUGo!MVuc}lw>_N6R>zuDMJf3BEytR_yfks&T zF^I?BP(@4RKik!cmN*}-H2iWutEke@$DvfYFQBXj&KXoQUxE78TD{w{6pRup2%`(H zs44G3N=a3yvgLBJR@riAN~K}0R@tXxl;u1xK$}4MXneGO*e<0Xu}i`ZqrCY5z&ftN zVzxWv6AIb0PbXJt=%+yR_Xap6=R^73q+d+=1xrbdaz?v}XOklWd4qZ-QqrJeA!naT z!`}N8s5{RGgR0*lf6;kVL^!ThLH>#!(hB3JGlvbuT{ILZkmHd$X$;A3J4wFT_aVKx zDWM=0_LwKnEB!g2_2*kJtNr<~4JwQeRfyClA00()>Wx*dBjut}XC_kVJZCy1hvCXn zj?T~t52_zF=@25*iYpz{a()G{)?=trkZC4E8_;fsG+7^SwXkc>AMY6L$|Yh4mq z8kTqeLO4yrc3~86Ar+cYD3FXx19oY{a=+3@T_rVg%S&n_=Vpelr5~|A*r+8xl&KWl z#Zp#kDZ?P8Bq@Y6zBZA452{Gxr}IgrE4Hg$fk-Daq~m{Kv_L-Np+K^RIJesQMXOS+EYW_=5RIW zR}K{`_O}kK#S0ohqmTc76^kT>#Uc%hAtRNPB9<~$OX;entYs-9wUh=cU~UazPPTMh zSt{oE>C995jy4iJ-Tum)L3qO?-68)}#d_~YrS~$zdaq3Fy+m$<>zs=BF6RGYgNlQI zIE)M7Ko)$0HWi0W)O)8w2c#t-JQDTFZ9SnfMnUDz3M!b&7Y7w>Gd^u!{v7^|tva1a z$JaNy8aUDixKFGoYmJ}|PQXs4P#^dOto`4eRgkV_9oJby+LxhrDKv*%Q{el9^=k4a zHTjX_RB)e`vPMmr#`m5(15B#A%;M?@UsGnIM z4A8Sa;KPRFW<5UI6%B`nD~b-J*CtjRJezifz1&xhQZEpK4TliHN<*%lNqTY@K-FIc z+-k{(q0xGu>@8)gqxHVB9=|zUSvjRMkpEwy{Alh)zD>(d1`<6l(O&Rnma-R2f-+*< zY2FDe@EN7Mo@X8TqF3!M%LBn+`gG1SFQ|zoPX{&81U(hAzVdWdL9AmSY#NBB5lYIF zjQbm;rBp*o$#WMqtkGhXJbR>y^(RUzTWku(ADo8#<)K!7M*O*!A3vS_6?~SSR%+c1 z`Q^>)wDHF}&xBy$OMAKAN=rk}l1nT>K5JEhV!E?8h=$xSvtn?=5UT|J@rclk5U?V8 zpQM$=Pv=nYlyO6*ZmL3*xMr0OGV}%`fy|tRAh2@GyO*m zna&nW0YJJ;<^3eS!$P<2qT$E8K`c9ZQYrcwv_tNt72KDu#3!RJPJ|X;1o0&|hgw%k z_E|HOG3(9}eatY?WHtbf6c~W1Csh7`jolwbwX3s1Rx5cSRLu_< zSv5kf20xtxD-ADLl^M`gg;c;GWowWk5z^`qq$={yq(J~tK(4>4QW|Jd5#Ch|`NdFv zbi^hUe=P^x(n)8A0igBCUY zb2Z(H>6?`Fg&dV5%n8&P*SXSh`kGgLqfTtjxI$Y|gRUS(`b@ z|I=~ET&iRiEbR6G1sx_FzMQ5ChilVR;c#V|DjW)Fs&M#hnkpPlOH+lzN77W`(2=GJ zha=Ne;V>0K{@mm0B*e+~+KcMAjY(7Dw^uXyA5#2Pu<4WfU*SYvJfo^FTg5%&zsAcm zyZ94{%~o^=j@DI@Ji8rYRuPwVi1%iHD@TuJ`z3iF-;(`pF{%+1;ep?b`m$iY&{^Cy zV*qTPTlS?LoFQg?yL{;k&u(sQDP=F^#p$2fT{|OqS1CtNV1ol{gL)l55c=_i{C5(1 zgry){R-<#_Efc?Wc(eAPBj&Tbw4x}OlY~m*5Af3T&$2yrLJa1x>wnA^e}^vxZnmXW z3$fw$@Oba^swwI{iRQlyz^?-E(!@Q!&(7fU`}ufy_V^l1nf@7;Nhu906{fF|U4+O3 z*67@>7a9gszB|T8GKa!&Oli4$Iyj5)B#UGi2cV1dYqL)KjZeD_BmXc7;Gdjdr zbEQ70*o#ZM&aM9|GA3!)n4NF2$~Lgpg7*T8U$9FLc)w(Zv9HSSrYo;0qdE7#J29gd zNoY?2?Ovqpw(CpL(qwO@pdU}ER(%CjApD7}4-2oLuGm?imYE)8gdULJNhQy4ZM}ah z{+p!ez+cF}0}~%@VzQrE3}@eH|1T)~lg}d~E0+hB@viNOeA@m6Z{i_smUvme%LZxw4CqHK?hCUusZc`3)pi{l_)4t$PdE=omf0=Gp!16X{{y~m)_ zLCDB?hAVg=WLN5)+!`|(WoNJe@^1mm0f6HY$g`|yO_Zz&q^W~v3^-Ezh*~qEr1Vwn z{JLF2Cro(kVN8fJm!LYAw8SJ2xlcU<9h9*G)~~w_*mwO#d!q*PY2};?osqj*IBrb= z8JDOd9|n)soL*}dWP%9O=1=I;ulef%;BK^ zSMKKrZs!N$>y;kdn(nO(3K_w1?M!g#^`pJLALIat8e$Z;>? zLlwI5`&F>M76!I71UB&3jyZdCYhF`we#Ub4ft-GN5(7gtI2zqm4Xor{!F#zivngkm z$tGnFfo@4)PyNwtPGgYy<{ckJ`cY==jyI%-VnHb3wmj4wKMyvD6U?!8u{1lc+9o>8 zW}ID#_OjCvj!YK|P;oRj}HOyOew7)j`)I?(t;C0bPLcP}}y;T5SJPhJvjKtUi7 zB=Cw<<(nZnPo3cpUqc zzm<8;jW#4jnaBMW{XKA_4OJoi`OUwTxhrJmwxAu}w@7+|4s%7qLK2K&zBOQ_;?~vR z(Ytp}w*>!@<_^@^k6W|139mk~a zr_SW|)Hz_BPacKTxO3tXHU0e-ueGA%__t%AFkyJ`Uab zgn!44U+Z7!nlBnv(ljl)Nu^5InG-@}iS5BLDxjgL^;MrCek8CG_>qNJ+-k!0*T1Yu zwe6R9fpY9#N#_J3Q`KYrCCNBWFGTTajofOy9>YQFvS77(oBZmYP@mvjywNGsU$ zm&B052-+>Ae7<#-P?czy=Br{I2O3s=ee4c<7cI*Cj{Ny-Ieqfhdj?Ygf@#%{50 zvp}4@Z7ALT?gY8hH|c`LxP1W8b(slz?8dnm4F%Eu6pN0)=odrLi&?Z0qu&liPowCb z1mtUowr<;SL`%$MWyqGV(XT}hVbO_bP9)WjUWjeiAi5ii&cNs&FKE%NL#PJAr#4ja zxgm;4f?0lMl3>QAh>%HwF-fXDf>97H7ei)gVXUtcd))kY`ZW2vv(LBaGs<@t`}7XM z$+obUFN=MzfN%CdFq3uUa+Dw63fbFEIe<>(t4o*(5*R1>m#avz;&$P2$ex{IrlEv! zbl!qbAz*Ceq-97E{zve>ep#&lcH%d3sCN@+?Bq_A!&iszZJJ)t=@dgy_3}5fsVF+3 z^UY#;e|dpDV!+Y7)tW(_~&uf+pQTKOJLW5U$RRgUfOSOU0esMujna!6m9H)29$ z4sZ2F8NEelSIH{w!~{B(!;9rMQRddaMdtBqY~pe> zkB^5X6%o&?cQ+a^NQWaP1w`3|(*zuep> zOKjl0@9UU;ygjef>MDg5y-G^5Nzp6~$9j6%%s zokb=+VZug5+R>g>-gRDoj8ue>1$B6*!4x?uUk0o=-vskWZi@gZR3cJ=-zQ9-wTpFVwls;`@<=an#U6(@>NOOjcyXUM-9wty zWpW&_!aLDhd$zd4CT8stSA4bVWG$-P4}|r5dXc6P(ECYGhjujd~^^=aBW3i zUUC916G0qoD65W>vcE!*8=*E}q>n+bM5G*8bpm@vzIcgtrwu8GXINb;dx4}nz0@IA z3;zt+*Ob!Du5!KIwIfQNW+UB&2YaPe<(~r_+t=&c2-wOoixn>$Z2V*pQ{=iuG~Udq*2_JomV$T zioeE2G4VXnaIG^mf~TEig;VY`5ZRe_rw<_1OW7dS)L8*Kt0z0J6smz5l#v@o^$2fb zS!NhM{Kz9i=WD>RSP8WR*0F)uhXXN}P>|35P92Cocee8f*>OCg9MYm(hc|sER;<3- zfI)%YZa*$|S1WAr4Rn;$!so4kVK^ucyfZW+dZ;vPG#p}`G9d5Y%Le3!UmuX}{=d+G z{IAC&w&qvHqmYfqG$Aw|69hIM>+bx&jmP^J{=;}ogF5Al3q#}a8IH%%g)|XZgiDn6YMFUU3H#qMdipIT4O9uUy!tQpHLXcGu-Y#C1y&VUI`)wL;Ial2U}>|0B#la~BIGzk8m!ib z?cUgEvJ>1YUUI-rog8HMzyIBz0`_MK`$LzkUUolATEZWx0TfSiWa|aymI{rJ0%O3r z3lzQrp+SsIG~rH`gU3%o9CQskeL9TxHRwbtm+fP-a8Dy`Up?kufS=X$iLcx63k{dJ zWh(p1VPA7ZJ+uHT7>^h+O;rZSCJ~bK#DGrKP%A+) z$p`AtNav1h&*|Jpl?ElZvT;n7Kj@DkRG(B@%LB6RsjQ(%X!@WG`rJXzczX^bLv{;* zJHf0*VHB?%_*1%+Y6rPyf&$P)GaF!;nEgc{#WH5H?Z7<4 zny+Kv{eNf)v;Pm>>|feKMqsD4?bl~R{feKn{O`50V?gSOIp%c2E|M$&Z@!&jm%y+S z7D;GLj}#J-W#Q!k16Wy^P9!mekXhlSx3l}ReX8nsgz$TkfX~wVGBcW`pMcZtXZi8| z>O{f*z=`6Zn9L0SzGig?+!SE;ujbKIpFL2W>hInb3>Gp=nard)TE)=|L(#DcPX=ej zi}De)9XdY2)f6F2fJtftq0jjMFHJE~X6Heu3z#>`%i|3Z8Fmj=hn-(DIIjjnR=_py zy*7GW`FY@Cm_H%u!GwweJY&%*{tVS`ec1Qszw#ZP|4Z^aU+@J*w~?1a>3Wu~Z=XIX z3G+x@#hgB5zbEva82%k2Jsc(SeJD1(yeBBu3iDGA1a4AcVXtZJ89+>e%N{f}zjP`ncq5BQY#T-)*Ei;%nyeZfol zNmglof*eHUQZXYT%%1<%@)_;=_o2j;QfXWpS6V{ntD$?6#R<|QMx?i4Kx;w|SCig( zf|ok+Y1U*$KFT<=n0F{996pPGi^UgqtS{sL=lUikV4c!PBhI5_S3{)G8>dw#^27xB zBf=nK{)lk6+V}qsp0OP~BlpL4-!K2K;F;RNGqrq{hRR{{hRUs$$0+X z>ici{E2CY1Wwaa5w(t~K!w^O?MAh$i+I_#JegDV)NBr%{d|FKY zdElV#A8q8`E)Bn5{7?P)pUOX&$nx;XXelfvzq6L>Dz#TjH&XgyHU0JW>84*#|F7DY z@&B@Y8UIE5GXAIbNql0*WEvkez0Yr?1MIw;el0Bwzu%@m$=at4y(r)BwEGUDm;VGW zu^qg`cJLD0!Bg6&xJnNzOZfjMe{sAtis55|i7KSvlnGcJL94f~q; zuN#+8aF)A2CrYVC%7}uf+qS1|SEpcm`|uOT;|0PEY~vtkGHg~xp|gBC$js==hndq| zG6c`{3iAUv$_Tt*N{y6Z^pvg~5bht|wNpP@N>8){8zUd-N&J>EZI&_r6aY++zwH?U zSkkk@c|FNfKZhGBPvAC3x1(l6`cQV>kZ$4J=no=& zFy}tN424Jb8=#YaPgr!TzjXlFqn8ZVF(g_3+1souSr3dfKX6}#%|Hy`puW(^l3Pl2 zwd4gr>P>HZ`~7b91u{vF$ib}5YTPr=H3Di)#xDpwXA^>FlQC|Yto9wQf*Ot+#4rddm z8O2$#HgT58wsw9zuNaxcqoEBXkm^xWVsoS$y^^-7mp?_V?7e;ZVnIk>!g;V!uDy1@ zpxEQLZli3yRsIX*k(+{H{+)>~`~mg7fBIk{X61e9Lxrexi}Uxk+iLs|wej~0&4do~ zcT?eI6zqN3A05=_++8Ys3*-JxAE2Vz?nFhO_fe_n(>_E+vwC)U+-2>VqAdm_Ou2iW5o?AUPFQIQB*>_z?|t|XXs#rJCdA$DB?0j`zk z-12h*Qt2-$mFD(h*O@up+nUN$s8pHHFu`Czc(IdzrsmCSS_=R@^c3^|)kpLH6(82$ z6DEo+XoS)({*Y2yQjD0QF-qxvG@edAUt;AKyR*Zi#iXN2N*%Wpq@y-49#*+p^!dCr z)f~I(2AR)(5d~&OQ|sduni_=;*)ojy22RY4RcOgBMwvraEy*!OA-)^y4gG2BM*V5% zt@dYRZ|cu&Jv#Jf8gv>==^{4Y-|Rv2-OPH@+oMfS-o(}}xl=dlNfYZyw$5AL=mque ziKlwKz0`W8UR1BGW4&bwG>(HHr8q+y$N7MU{Ch|W6e#{%tq50OaEEJf?_qE+bngK7 z87K?_aBPX`GSJ>YrpJVKF@yet+Q=5*$Ofm;$S&!nj_g0X{@Qx1EXH`)_?(fij50Gl zUB%Lpr-pNPr^n>icxe%g{H?fN3>BuQ-zAK*enUfci5E}G`&%^g{p+cmaC0CB4JM1n zc`@EBe|`%#v5%Se9Cpe`r|o?AF*=3y$odVgaeKK1(YGZ%4I7Y!zGa>tNH^oJ4!F@Vs4^<<1@la+vRvicE;R1EVCx3Z# zxPiuH)pbqm0gc{vGc|fe50!40^`J%%i|;_UpHsbYy&$EypEe%~pyBczlw=9s(q=Xm zbYrt|3D&{v`uisl-(rcwx-(eadadqYcdEPSmJW3fXLY{~DaC`dx;H`Hfz@s8?RM<1 zrSbn|f0f?!KlayTz)oIgBAm0kt2mEgI7fBFc@@YzB5Ox$#O9CE?wLdQb9>P@6beHpH#SdMn zo<#`P+y{g-B|Hqm$-KBd&_&(XcMGxTj*HtIQ_y&qvlh)O46NYA9_U!N$1TXtl|z15 z1_B-UWgPl~5qA+!%I+A^9SS;Kl*t-3Il5y0;!+MP^)dH!Yv_f`R5LZGr~iAMW(P)T zCFlN{KJLLDDmBr;|7l(t4>ECr^5`C&p1D8JDev!{(;ZS?BIaIz)I~_httt}EwFL7W zWsf9(vTVO%e%*u$^xlStTj;%w^WY7z)wSH5pkMiWT+)(K4m+f2Nr88;f}6DpUL>8H zoj7{UaadQ4uu0WdDAhJ&HXhzDzM_-qb8?xAR=IEpwMSKv$bS#LUxwNO<%Q6{(3#^E z&!_1316`HMo>*n-{J?Bfqf(+`%=b7N88~wjbyZJZd@O-qwFAp&?wIL3gFK${hDV7ZU?)n)W5$gQU4#f4%8ogGgFI1NAPy>1o|80Xq8U9f@ku? z|Iu8sWOHq1;CCigZ$&IwjX|6g7DDlr+|2C%Po_1yx~sZockiOww+{JlLbKtC4ry@$ zj)_UWCr&XhhhEs^4>-je(oW_`9Qr1UftnHn+`)2ly!=!br2xI0k;a%xq+{q}3A&v+I7{NkI1Uk82F_-9Ys^#VO6@pNr|!yzT&OgM+gp}@Tq zNaQIK5Z`MtM0}5!RMBFBiHI*QuA^un-lXydmtu+PQm+!4&r`hRm)JHU>Xe(E?{oO5xF>3%5@PfPq`W)>l`lF(b7}h(Q~GWqS7kXAPgX zoA*ZTt%kh3n3YhFzV|c)*?i;NgJ3dKEqrBG0_O22;F_p>Fd=VINWRh>gChH=iTmjz zggZcTyFERfacn5xqp$SJ2;%hOL-Q+X z)zq@sfZoLaiT+VH(Kv*;H-L4vplP;{SVI@C;Jg*39xUF*-MrQxSV7g*4i!-RcA^OXlyLaUdaEoaM5bQ6mjhNeigl)x zDo<)<@>{f?Y?(#rS-$|WeGmu4TNO>j`$n9)a{e)nh&Lyu!^*iAC*y8hHz7S4)03_- z{h=;IynSQB*GpJq-s-|u%vYnCUo<8Ygr7fVw!;`CkR?X>{T7DuX?FP-1wtmfXM##< zV*%;@4C&LcD$*xo3F$XGcR)G;a3Etp-LhKWkv#WMC$A1hYQ|Zzj>L zp4tI-VJ02xfG;7{-_)wYXFkc-8`$HrnZ#c*$CxJOrd!N0`U9wHe6Q|+R zh2gWq*a07_iVthsEKMb-6y=6f57S~ZHCA2pUXCJvA}YOH??5lHO7Ex2cap|}kXgid zVGxZL&twhyCQ8}I$FQsISX@EArWd?9Mx|jU8fV6-6tb-zfp(2iioU_PXH*Yn900%% zYzpS+0q0vyDf0CZbF^ zEVo1{WLXtDe|RYd>faGX^?PE}1>F@x^`}R7T+oY*8UlSa1d12}Zy5;zLv))(eT|VV z>MNlZ|6Wbt`v?ba&^QA6ml$>64n_RheE*-uZ)VePjbBT||9Skj>;KE~8`l~7&mBqq zm(^Jvzs%0mf6ayt%LR)c?IDQSCGz1>g5J zjUSVzXthrIjnVtKfktmQ8?iBJx4*4ZM=Ud;?O-J-TZwXxwLco$AHmumt@eL;G;4oU zhyHIgDC-C>q1Oq>G$|^yt{tX{Xt71L8G)S!wyb}nr~XgEtxDm63$PQWKSZ5yEL!b^ zcpc+EN&ijJeKR_wnI?2)4ZI2N(K-^i6nn=_cX6JhVe(ZQxzHIG=&t1xx+sYdUke*B z{3&xt&n2L}J`3XK&Cx@Seh%>>@2alFcagwxbG++Zt-J!diQ8-hX)*_-MPNY#ajHLb zRknosc4u&}RXRHddd?`!a0i91N+OF#@zZYw3~XuTD-DqD{1!sObi0&pCMWT{SRsF) zQ`AFv?{t~l%#`0AD~DEl9zd5wt)cz!@dWHxw=RS@y7Fz0_zpceda8)f1zv9>Pm`!V z3J7Ttb5T$0xmG)f;O*{%L-~zb{`z3+Z|0XCOq6nfHTli^#<2;~IJ%!s$IGsM%Kh|% zN%$@h4^8gZYd2`L54TBqC+yxWJig6+-2YtvLrKb=XQE^`;jQDTuxro4j^#JCD^K+% z6rfWi-CgRXTljeh^q8wvpFh`A$BX|Kdht?3LF$vv5d};1bDXIKOCsht??$Vk&LJr^ zz9>3xZ)s&ycrYr|C-Gt=_NzK+6@H-xCf3&Ikco9XV`Ar`#mYHyVsvFf0NL z{gX9rW)q%tcNUw=9gF zE$>DE);}~8)~`jVSicfMSUUi>c3AJ$5!QDj)}ek)ssl7fP?DtwB!%_sMjh+d!sgas zd%oUN)8RmV`hd{QAhRo(u+UX*K!Bc{;<0H;1(@^FPaB)?Do-cNFCP#8#riN3-vG!bnIi6SgJS-Nn-RMtU-4%lEM<6x}iX)yE= z>R{a4)EeSr?^9lCqiXWwYK5sxPj08Y{5*@nQ>6ZMR4+fHpwL@P5_6-pOCiR8Oi3vX z9k1kI?J=x&mtM1f*Vx*2f7RN{o$t`z=Enb3do!@cjiac>o3$E8HMWMop9#^RLmE0o zhZMBjY_t}vfR$y6lJDzgfK<`~1VNKJE9G>cC$meQ*KBn)2ZcxYyurM*@EVM+iL@av z$r+8f3_FiNdbD$p9fsZ^4!sdH>j<>-6YI9l3R&C4>aeR8hrWgvhaP~8fs+ntz+?zy zdrot1GQ%VF-3s6Mr~;i*f$TguqoCz>CR=5=YhW(ZbDf}bqP0ZBnYj$=2KlY7m4IxT zJ+Hf6T6E3ssxTpCzurKYp2YR2)l7DAjn)dFYwI>6b-dm`k=#Ci4vRQOSXV1HC6NfqwEx>eJGaLVz_JK!u(O`jSyMBj%nRp@KP(9 zRzgYsyhrdu`3=>;uAsCxQ zgtQCRa7IY2b*;bh-Z7<=**QR8k5eO<{c3kt1~f2E@h@-#^8 zQK;Ps@;%VI}^UAgMm3s!7D!)}v>*ixEW`)n5f+5Kg-_*YYpIr!Rw(EwGX)QoS z#X(31?yc-p6feC}-9q=bhZ~__bsh5`cmsi3b~W}7XTI$i3)902Rj1S-ioAN$SYAk| zX9d}P+HtbNZYgaBM6cEnqF*(el?DEbWb?_g*LCE%K=s5VVG%ACCcf@ZG{;_%}Xllr0Cg!I# zQfKe3Z!`R(8`~6k-$`y_L&Z1 zMxeX0-tSC8j}a@3LC$?A`7&_Qphecxl6IWWJIs5d-h}@pjK*s`4I@AKi?3E8DvKjcGQQp>w3<@mQ{hQG0^#J9; zTgqux=@6<^$}+kdT7}Lwbm?>rXE`Khi7QRn;tZIdS9vLFXB8rc)4U$d9e5WRQE%SJ zJT{zeB|?KPje~*5<8=f4CBYTtzZUgghjSO>l0}Ul7lOv3!-*2}{fM{&ex3SkLSyQf%Bgh%N4`k#OY2 zOg3NrgIh!Abs+Bg54C9D*rD>u26m;DAPZ=ax*djnzn^z{z&>jX~4JSaq@>T2wa)OrG_^(Ca%k{oD)pG@#*_&CHG zIZ%&?7{xN@T8DS85xO0{wV-VqYn?(KJ2>}x+KQ1T^gHET#EA$5I1>49^{geZh&PbN zg+X`^5WG)9?Y|5o@-M}o3aW28wL^{l0E#pbW`e~7 zi8isZWEZ2mPLSa58f5qW34ZtrmgriP%Optu&_Zigzj}4SoOr1z zH|aX21nuIFjQ5QC4j8W-LTsp&Fg1*1f9}CHbZ;Q*6LuJHhd3Y!Q#`w25$FyfVn+pz z-Ii=hP%Vg^G2@Qa?*3j$PucCi%+>>vuiHr1U6_)rvfg6%pp4B!xh1gU zd`>0?pRQ)dT(5=B9N7Lu_e(A8ehC>O38nzuCw9{_%ffiCL>Ak9x8b^Re{HL(rG!tW zQi5NT;dOJ3I+VRIME;0O5Q0Ycyr@9LCrYk>-Wh<%YZqFBZ!jj#P!m^BVwTA_;v(JE7T*tlOENFwEJV8teKj;sU1%ly zRqR4ltdzSl7{Vw#1WYNd+n(=?;Wq!2QtCOtPHI%~&$o*W^@;n45+239UK=lE{|Df{ zTF4goxt%^SzT26C?0`d>2?EppaU(mJ!2P} zzh?I7FVK!64SgIka9LH7VKM}4-Z_1B1Ld@;6?a;_&V1PJU1tl#;Ug}iQR_On_>wBK zBtwjFC$KAgUJIXh&>^06=H>*V9Ad3{-Okv_Tx2KLrZV|oL;BwHzb+30 zGiJ%eYDJ3;{~&iM3g#$0>PVosv)|MztR`$!?=sG^E98{30<_e1x~wjBQI~0{`=+Mj zQkRAlqA--sv5;vaW?DiWoRv~1_q;?)-s+k*OJ3w9w&dM7PfK2sO{{Heq)olQ)%erE z`!LQf%k<;GPjc>8P?|!n^6ToJz)#j_{A76&2&y3}(u0_~R0LoUP>WhO4<>zWW3Vlpr;#5CI5Csp3>XKV;a^pUbzL%{hK?LT=n zHYwfAdu{*FIe;z2Mq8zI{Z_tPP7sUIIi+H|KC+isk+b^mJ zlwKqRmUcv-4kr>_s7RJaF*&h`tsfL`8P&G>T^CsOr7~1s+QRG%N|wn0US20trP&u% z!X3jZjS6%m+=2^=NHkI(5{WoZU)G5S&O?dM6e>O~k7uZCJKu(iEf*LS50_g>lpKmE z4Q&a@p9;O8ntdAW&*1|II}tf~i>F&CV9KOnX2lzW@Hx@m5favbM5i&NoHfwKkIqpW zpQ%yXIJ1V@n0UTp8{Z008-*#qD)N=cjl_SR^%MU&k7m84%HO7qlLM@cPCIdX`QE`w;{C zj0Scl1Dp6OVBb2gjPY9iZ-~9bgZoixL(4Hk%L7nDU5z4=fjBdO)T&_APz1$M1F`ca z?!~@jGuRk3?<~CmHRknw9ST}Y_6?e$^JeNr!;A3AZ?sDz$aVqmjo+!LqjUo7@Ji|n zzp@Z?Vu~TaXL0;dh=Ml{+70uJ|NyinCbcB+s)ug?cl*W>F zQj)ADZN{WqS<*i#sa8#T2a_UMQa&Z^Qj_LmlB^Pp-_^>5M-%K{wAlH(wy4J@MeM-t z?Gzfs9szZy%RbePf1vjHJ2k3uDRH9yx(4kVxljLD?K`E;f2bi`KZxBX36or{k-|vW z-ETtv*KcT0&Le%~YU06DI0X#(ezUI9@I3q$kgf7OzhZNn9MvmwvSG5{%wiNd%?{sk z{OQ(UrQvSB>hfZU5(1X1($K#RoHp$fTT_^lv9iDWXV;?$5U#%~<(NGOgiegVSD$?W zqh^JiQl`;U>Wm5Lllt&DnI4|Wx3Tnqk?HC0FsAKXk&K+3^8QTLu?!G>!uKGu(U|Gs?b~w%kb4;F6ai?&zkH>aKhl=^_s5gtwZrtXa2)u58M$fLGTo(F*C|HqS^o_aZt2 zwsblN^dSKBEV>?^1=z5Ddi*+5q{Y~WF_wmj#}MH?0z=db!>-dAXojM~7)Jl$_xhZt z58+}%UwXMos7_wMOOf0IYM)nwfSA ztW23nWbSsVIZ2E%Gx%s4g>&y98fNV(yr#Bm%{69sB0*k$O>NZzidz9t&dRU1DD6W1 zR3)!T{;axHDfMABF_jr1eQjtU@0}mvyhYPzsDO5NSM?ck?NUY(Hra1v_at^{Ng}S& zj{S79Ny0VF6Eru13HK-oRjmsD!7z*c1}LT6KU=-e060lOY>*2L@^e?A-IcL0o=;y@=ok7e_bN_HpkU|ozDd|s zqbPA%BJ!KFNtX<0JG(A3SugY?Us>`11k`XCWvU8TVDGp~SxHlZ^7$sB6r*-nuB>bM ziT=B`Y3mRGi*SA!_%>`k*?)!5=&+us?^)%~SccGg@{Up>Y&~Jry5)c#jq)j@+E83m$jir{oEL8)SI=W%3np6!9)5EG_p4#F2V^F*nADxj9PVM zr`DVC|s6t;#^%fr$=L1!#M@^`Jp{fjmLf2UfNUvRZX2=^mza0hY;Hy4*? zSal^S#~{z$Ls9-KF4Q7!gNVZ7&$REG>3fs*t;cW4@aze*F0}r#_u6%#_u67T(0VSK zfU!xl63|=(_P8uGFdF;hFkK)}SIh4xk$*hQ2rtQw)>3dhAi&5?KogBq%^75P+HkQN zUHEeAKc!cEa+Y{0rDlL`K6W=cX@!Y}?r^ND&geeV=>o|pZ#P7-yXlkz)>T1zJoD;y zSA)T6^&D_oT;+PSIGxt_H2}PFs$IO`h#c^4wVAdMqm*HyEgRpP=Wk{JG86!M!AA;r zbiT#ZCBL9T4zUiUWd=BylbF^w4dCU!&#X%C{e=;Jl3e}^5q@r)Cyp7qRm;t>N+nob z0ftID@3XFIL5pb+Yux8tgDEC-Ig*Z-%R;z5H^Y*OZTI&Kc37_!{lR*sLdYxQW0ZfW zV?z=9OW4jBR3hsSh3|~*cSIm{agI4Tr3NOQWO(8@4pDyhz(huWq;Ha%Hgpukue2iQ zNXyLQDEXX~eRO#x9A=Bc=ZDlq;jdI*6(4D^94B6spYj-N^hus4YWG&G$T)5V}skPN*nP+Iqo`(G*l@w5=UH$ zTYc2b9311gdv+@$pNiv7GjrtvYT5wcCjo;#fWR<1y-q3BX4nG&Vr91bfM93M9*-cU zQAy~iAVNsM8C6a*O8&T>X&Y`2Y)5z#0Nw%NGnVGn(mq6&pfIIy!pn<(R;Se*2$9Kb zwf*h+6~h-t+OJ=@cx8(_)jNVDEAYR(WKH6kiCLt3oFj^5a_>|#X;`kVRJPa(v@Hv% zXtl1;S}@{woV$W}=M~A>usrwjH_#;?t1ny1$5_sNica$H#mm&HD!M8@ZI?zRgct;J zuKPK$v-1)$+e<&OW24Sm#m<-bG^kpzTBRuSN3c?%P;ZB*1mSnMFg@XC*V;%GzFkeo zEgf=*=Xq&<0-nG2XOCmjeqtw>;m4Pu^J8xFgL*Wxfer%jvETr5Pqh+X3-&_yR4Wqn z-1^7pbR!F>Wmb|ur|tXa<8p2VLj&k)?~izBaM+nj7=w7VPQC5G7JmOT>5Y2UlHx6=4UWO|Y^@G)W!& zYPfdkvvCGv2LIda-dpY=hx!rwPdvnWlhwWTHrC9`KLECinYk4C>781e5B)%G=G?|0 z^ID<=0P$M(_0uzfVi z0py%aYxJjw*fvW0Voes!-Mdx4B4nfz@M}VSXYrgv(#bzJlOHlRkrzN=ZvCsIfPmZO z>O-`CVLx3W)6~Kb*&tnRW@-R?4k)KYJJ~5wrJ~g`-xzq6$s;Qh?evU#`x)k;r;>St z2~^<|_o1iZk6p}4Wb6L=gX+5PKFHSn_V!kwYT=+27%sqL#zzs(c^~Psr5Q=WJi9d4 zq&>au9(b|+yW55TPjlZM-&C|FFyqe$4?4Fa8g7>QT z`^S&ZhvuB!J-a)zv$He1voka}bnjODnaxMEq3g6ClU+FF@jh@x!8vBX-i3|%g)KM? zN0d|W8yE&vU~`YhyI;$cy9Y}#XXn1i3X-6L;5u#{$gX=9bfI0MW82kTq8ok)pN9~4 z%95|!xy@$4^P9aw@f~QH2J^=*ZM1v#MX~clUfxq@L{%IJyhbQqMgTqt($r{l1PO2l z)^fkO8r+|S?;Gd*q{4kbvF+m|Z+>(eGU@`0a_lhl58(%$OO$p%k1MWbSUCLy4vRTu zn~gLLc^Igkoo|FU<(D5g?Y~6yvP<7>Zw}r29c;5er|rl_?@JWCSu_sVXB6GNAR9p9 zL)yJ7r}q$!qQyPb>1}Xz6g?BH23InAhJF5rCb~szCHv?J2?n7!k59(&RUjrk#4je& zX%rN&7~Gp^Z=jDQ=nwmY22>$?&yvR`Diw5kFd+e`SM<3pN|)amiM~n&hbD=sKf2om zmg@aU!w`$|-H=o5J}JrrK)dLlgvy!S^Q_g_Y=6XclPC{?5;^eS3IFpFJx;5Ufi%Y6 zV6qtn@3ko5-9k7Sk_45+8Jm~)IOB}LuW-!re-E*he52x|6OMyub)Cd0wtZ&<837Ea z1xme#?H(m%N_}xdmfRU4v9_%xfbpi86~&}jr4y$3`;cL=Q|@82d-fXxQ^NPoWb?y6 zH;gB;Sr+BB}y%A*z z&m?Rg{Xzi=^O>d57SUK&)(9Nj4R%YVy0IKoD#L@D6*?T?V&E1OtRm!IG5* z>p*}jcP7cxiRGejj3+nzG zkiW3P(EBl$rS~&}*T-E0CnzsM+t|}E=81d><tp5Qsme=7$5Iu!K)b5fx8R_E^s#vC2`i{o?XPj#tJXrY_b~iQY~8U>U}flJhOD`$R3s_0`&eOh!uw_9Hf) z5c2X5>QcLQGmdP}55MhdU~xFE`kFfMm{#I#D3L9l419{VgQX&@IuFV%kqH4)@a2UD ziSol1^#6gHF4C9rm&p6`)d^y1(A9;Xql3eL`St(7&&kb;@(fqu(+^s1~jX(BXc_C%SA>kPOrB@L=LsPMF-5Tv-tx>SItwUvALuuA}~4A%>`y!H|w! znB(Vlyy3@j3a+_Gzq|H(n}Ho6rQZOLzI>yY+aOl$Z=o2zRV`QALWb)KF}K61@1R6~ zqckX9iVb{+f^4VSht#_&Kr+g%4n#0RzE^>e{Y{}u`+o;iPN_%VWg2(lWT>3pgq9Hn zMy1@(jbevm7&^3v+L$GsK-cA(e{JtxS2tlrdr*{9iq2ju6jzfcg5g5(SMX3Wgj@t5 ztwBNeHsu1=ER?qqWkZ8QG{W$I<=Rl=G_Wfkf_EJW+YJ>342x|6nhLQ6O@%0Y&iRem z@5RCMGwk^wJ{PbuzvA;e_Phn3H?ilMI2y5|@TRPe!zPX>$7w(?AW>wP5N?O(IcX&C z2F!DxL0B=!$nHtdB}U|x;cjDadDTwWQxD9kJOg+`mXE@s>;`ezH;tleW%+397DI0N z2HQFkeM%cW7g`K^aMHEpXiiu$*cL4st9^IB+q<1G6)zkMD=I^_jRrFUqM}AQ)gFyp zL&CIaQRI+Lm_CXgKuUcP9x9Ry1owAPjQA}!N_)^T$(7ksUHM>K-9XZu>u=)5x6?iF z9k8hw5SGZR9eIui@q~mYc;6nSI>R$o7p1{iUCTa*V;_tgU$MkQjXr>l_JyyoRB>Ju zles^rfss!Sg`gx}SF0$CqQW<0;VW2S_m>R9qed8}_U#c2Rwx<^okS~-^5YeASt}*S+8)!*@XXYj@lWvLYbgvG`y!9N@T*_AZ{Vf< z!ql%YBAc+{F;$rD+f=JtPEVF64I4(&<68rVubdmWZB|y_mwUL z(F@4=foIj11dNcYzKk?5%LSN7Wk`c#+Cje+Hc=mk=fHjFqCTHd-e63ypU0*fDi#|l zEd$eTInS&R5|m?`IM!+@3PHX#FcRrtqAmK-vO54zQx{y@H0kPBl0N%qEUW=vUTi5zh!;_>$0Y9b6p4ZU9&m?D~nO{y_+#W;N2F`H!QLx^^E)QiAewY zvN;vLcgP0Z1|Gu~r%dUTeXxD)0KmtPL2Iyk+IlHkp~@bjoM)l^o+C>C4P-?1#s-w& z?PYk}nk_gsh&Ta`mk(tqH6!=I^R{Y>Z1rw&m#GZDxj%bNdy+f9R{?Off!6Xer3-{3 z)*~jb4}xl38K8D!KX5B=Jy6FgY~2e~csx^Zd;^;CNP{aK{U26$HIxryU3qaMc4bIo za%Jegk$QByKhxCx2>ZTO`0+p4$La8K@GISTk~~D}hwojS$aIJuUCA!}T_fh65G4@3 z<4%pdqXthI`EQPeJE!BqW*e9>@5d6=UFBD)?%s+f)CVS6gq6S>V>XVwqa4ll(K7iC zbT-N9F*BZm@`-85?&D(G3l?|1Y`1FkN7m1m_RmSN*H91#{WL}*t1VP>d^8#cs3$X~A+Z zu^PWLpMo(ZGnr*k&CV>1GOAW(UX!TG>&h8oEa@x3lEFB7xy( zL>1rQvr8M4d4Mpy+bVeRzNaz<^60ccC~ipxqjBseARu{bYZ}?zRm|{jyM+dKWHm}8 z6^2$Y8gVfsv83R$C5FyXs+o#Kf6Qcj1MI^MD;{XOw)kC;uR2ceIMgS!>xsw(=LD_;pneMNvwW z^2lO8_eUuocxlYf41*^AD>9#0fgw#{`_-ZXoA@_f%;}?*8XGY&m}0Rb_lHf zd&D%YeGoD5^UY`V<10Uu6nsg~Zzllt9dy8=*N!{$42;y@x0ZHep7$)zbA&FAuf+_D zekT1&EF%79Di5NaEFQQjfpS&Kqrnu4KaC2Xw;?+)W-yWY=xQz?btD;jhuj)gQIl^< zsHv$5qq^FHYj+HG1J%2SiIT&14!95QHG+mR1YWz zc)v=?#Ob5D1?mK%yL#pVG+2HuE={Lb(`5qrPGR~klqo{4$2_5H1uw<0l*xnMj*7h2 zjQ(4)ed8AExO#^paIs%z=mX3qLuXbA z2v>0;nrQ+*EHmift7}E@oilTH@|?~A)Vx)Q9#@(Y0zAnnN<7jH`)qwhBSXsu{A_O% zJKM2T%wm--!qo4Ym~*Ee)~K36jam-dUCb)*V9^gCLz&H5S+YvkN*=54VKM>_yo|+O z*XJj(O76r;9&Xb6_u})#zV7Lr7>#b-usgm3Ig8@Edg|j#NkH=MbX$Yjd|p3ud&3rEzxE!K;n6p1Ky@ zY9({ubvAyVu-SbhZ$k~JffM0RyIbMUWw*ee_QTy*{NefdDB(yYx{Nsmaz6$Ku2J4z z))Z1cgfTrX3^PA7H_C9_A>6F=@i}g3)2%uyb>GCL()KE)OL3+9Q`x+61zW0%doU-h z_hd^g(>DYP>7UxJRry+Y&>3`%JIH|01!fE-Ev1gR2!(DR_tD z0Z!U=&q8%V@jY~!bKN8GBIZ_C+y_%WQ}|+oI9oh@fliSDi>76C_+bG$?@kxdoXH`F zFF%Cw8`=3_&-cn;{YvL^P+1BPWv8BY?-z5;(Q9pnn}#F$drpKxLit3KRe2qm%1&1& zb-n2M2!2ls`gq8~i;)L2CB=by#2yF807KaF`Qp;1&;XxlenoB@+yY>b@xG#M=Yva0 zA88M@MUFxsW3{@TegtJCbHVbihQP|E2>Wu6dB_?Y#X@86-O~H6(Vtft({GD-2P!B) z`_%(V6mbFf!}z>nIkc2;(4NG~ zF}LRrt5Ls9{|(85IYJZqOvK871ZlSoBls}HQ|Ln!>PpL1Vkm<10#<1HCh+<^4 zQw-{Dv$vM14f$4LcaE&G8PXiK7*|{9)Gf5XV&1umU*J=uC2Hvql!g_hgx&7t=ZT9} z5iFYlb8oF8%*|MZn0tQ%U@rT-8ZWy&f-t|7RkUIyzj~%D{4(w1t1ivceR$yGw`X>H5@}^j?|WFIbB%>Qv;Z5JYI{mu#M+VNe0z;9ZJvRFNsR0B@9zZ zO4OHXI|VCf7!VKDFmGosQ{`3xar~N&P6w_~zjiEU{<8*wOwoQYzZZ;VXc*}sdNCL5 z&ml%uI&4vr`Sm&S$^~xcx{WXPMqXE7ocQIatP0FGE|pVVrgv) zdPq`JQZPk%V{ubRJLsVcp+!sfw^g#RBB?sqj?)vT|K+Uu1V$t)ms0=SW>1>Qoz9B< zhzzkq&y|Gi&9eE1l|+UWK!(1)3ru{#YhrB)_NRTT=GLcgEE2^}zMo{)-I6JJxh;#jIq?-xGHJ1UpEwPY#FH2p$)MZdU#MB&2O=GERA(eL0l>Qwds}!>mSk`-x z1)ShEOs~as3rnAk6%EIV652xQ@lPoA9Zc-HxesnEEVBor)3vJA*jA4*FsOIjk`_q&R`Ai zuQCA0wIa#t;5VnvHxN0y7pvs_*@B4kZIqv0B>5>H<);y!MzX_F+LVdc{0^jlu0ls1 zQoj34eHHMvLVG2yyO>^Q&IT+m^1W48}S3e6E59aO3>GR+jaAs#@cH{U?-3-9CA@w{p_W*iQJ|=!!3qj`d&c269R5d<%Smel?+8 zD1cpy#@0G?z}B`*8miv2o&81ci1yl1dq?K{QF~89`N;O3qxRO#;q8fPd%fDzcKEz6 z00(Or)HA*y9HcXX?hYlDF>O)Yo;(M)!6yw1wkb2#3goW-7VPNG!v z(dSIPA!lBt#J_+>ComZw7w=Uc17F1_x{h4h?7U8mHzEC;yhS?4EdDLZkWZVKr_X-q zI`go!Tj>g-Zt6z5#W49Yx=&cEzfYK4SuqGtGuED9w+)lGFef!?zEZt_R)k$2;}*sq z+`=ehP`q;S7tP}fO{qswN}>QNbY0VBiw6yCuq{p*{V9{5wx}|dawW7-k&*bgL9rqb zxx;PN;7HwmZ2IQU2a~vTlPLYF^uCh&cr@AE_oLr3%!Kr1@!|BbNH08njxPP7isumI z&Btkm-Kej2-xXRh*EH6fYoRwq6Kyvc1aC*Jv%dK_@+KRIUsj_Qo(IR9zB$auvtl7@ zyaMUix0b{?zfl5ESHP$T6*jdpV6ie4P;dRPUb*d$jevCU$cJ=(be#EzFuu`?!hQ zUnD~zy}ht>4g~{FrexRB{^7(vS3aydv=u>E!l;*Q#(n?h^g9lhC_k0L! zvjL959)&cVFT3B}h%alnB4UiA?}|1qNq z>}H~i^gW*d*S^pa)`oO!HEsf3KJ~b}ZWNl=n4NFpO5;lRhFqyx@-vp~+)BUGfk>`#W*V|nH@a@4 z_zP2@VKlU92haz`^0=>1eeeTl4?lEBP6vDpU$|@e_yaEN!pe>G2IR6aq5BGhG7nPy z&O~NLxl@!zB)HoJ-&N(|hZ2x3Ud>9o$$gwI1m|X0GNHNjQjTrCGG zB_Gh;9lPXLZfQr(k_GQ*)H8C(-s)efgC&C5+RdFcDe@Lz#_9x#gkvh+(L5T`OJ6g#qS!Sx1`P{qBq(jhWAom5mAc6diWOCl|AO!7&nKaV`~D*BS(bNf)J zu~GC?#sl+UTQd`x`&SYJ5=jiOvCFuced+!0vpM{hw$7UWrCyXe$5|KDF)SmPM)p4J z+*0(E5k^>aUAjL;Cs)YkJRo}*-1qT|OS_d1=kZ$P{1|V8dlh@Oq>84(ACb!8}ds0?W zsuiow-X$j2qPrnH>k(E~iarx81f>iugMbcZEnp#_&{Chz^GcTqu%F1#aP=G&4Ks8c z96x%<{xJ7%gMj3iQmvD0cwfMR^Wz3G!sv^4ZQzT*;U>L*aB|wmG3UjTJv#7<$d{8+ z^G$*eB*+k~C7j=2FWSDRuI#3F*m?G|@M~D&53y?)dxA4GCcPyRevVLJB;7Ifowe z;PIn5%x@>zqj4H7xs09vDnzA&-`DIP-iD_f#sSJ%W-l%CnYWwmuXAd)sxpB}%?Vtn zWir5<{~}-}^7WsOnpL^;Ut!|SLt6;i10<`1_V234p}7MsKD%-D={wVgnp~i7yiCeC zImeZHZxVfzQlz04W$A2{$+dc0t$y;qXd{qT^lFwg`d@0XN8y7}rPzPyB|_lYP(qE|+qB!%~8m@$sh}q20kR4J2Zwa#>&bqRXV<1?Zwug;~eq_J=9G)|pth_#+`nS(vvk-II@-6kbt7P}B# zHkYB}A>#MY{>O9G_UFEJ@p%u!0rn!?I`#*95IdJmwwc=5)*8Y(RJvr2$^r{a4mrc( zNcFoOpoCRzVXDYUc3%ciVG~(Qrf!pti-L1gx3do8dMG*R4$om@MHe=uO5RkvH|Z^2 z`KdYjlQ7)BNm_L|ly*q#yPXY2*e^n9{~Wb~b#FF!p9ci%N68t{$yl@aR zpBrhg7?j0tGj0a+pv(dZz|DZyJcuy+)+9j!yxmM=xLsWs3mAq*?Ipf~>nXo)@+Q|~ z)V(&KX;nWaR$>v&7OIh5H*~(!T&Xzmmbw%K-e!6a3xOr9G_qv{5q2*iOoVhhAk3~u zn3zH%T~v_CZlJq+c`{5!ChM6y&9#9X+!F9dEqyXmZK=yUG^(?7=bIjbF}R8N81{aO zAJL$6gfD{Yb?e0bw^c5*YeqAFuINvwagYWrW2?f-*th1`BDgDBvuA<6mG(Bnghi9@ z18=JQZ})6q_uEerG{ue zF3Q{`iW`PCxCZ@JO~^F3o}$`3iGZ*^DRe6qu=+G$HHjSXFlrl+LTJV=;teK$A5L|B zXdI*tE8ejglYY9ygMA$n6KxaJd?gD_e^1B3(kPEYAnH5SPfIO6=D1vVSDgP z^9M7dU*HhIS;V6r3ur{16KnLIAk`Q{YC>Nw z__L2ye_xl2^1y_P+LosINv{5eW`bqj$$$gD6+oyopGSpVDHb4o7l;n`|EXfTHX=IF)r;%Mo z9P3Vzsud~5Qj!NjC{tF@uusT(_=-&X3l-(Zu~%V9$9!a7@|MN@f~b^J#rAv{AyQwH>ClT|ceGMApQV>AZ=? zH^R##B^-D|Mb9t3=JFd}QQr{>7~|AdZQ%>Ubmtq4f@(Ahs(+O?`upqLWwWs2Zn4B+ z>*7(2#g!#@i|)sXkIVPQ07(>xGU1#yg=cZ|Q7dB>EJI@$y4QRy7Z?X$kwBRw1bX}# z$_+jhzCs`G&dJv`9Gs|D3o646)jj!=_vobu71C6nkp9&*{}tOH=O~DB_ky; zG17m|AIZNAVX?0>gn7gAuR2OgUgHXvJQOk0SM-ziem*vnGjv0@&q zDp`V~68+W7>hks4G+vYCb^Q_t&{fppDkR2%9xf-rH&4iTD<`}^zU?)&j&J2l>zDD` zYRD9{2=y|27Tf(b2Hw@0Ftp333KUyP`CfaD6+K!~jCyT{1)oqJp^eU3d{1d?U@u|a1g0C9}5?!sWL)hZOr7EEfeudk6 zAy`xD8HLeq&2i=wgSY`u2jE-<723CPuAZcFbZ-kfe^%oc-fUzIqjD4ua*k^Dg-k>t}tD7_Sc+S{`;#XAH8vlX0ljjHE@bEgI z#K`)*K~nqtk5`GB=UvR_t;*G}s{1{0l8(>kaXuff$OoGhdw@gmM!qYXzTRfF*RXb$!atZHC#(oMvc28p~ z*KpC3z6@SKZz-$0?s2p)*sSS0a!w3x7W}x!Q)O(mP4uJ~-1QF0-1$`-9z4Zf0l#Gh zH;poklF|iu_P0dFqxYxgIU~5=mCYxolX>9`)xThJ2u0Ei9^WRmgWT1y`X=o*+AQ2J zzGfPWfAk7uVc^E{O-%B7fzo65V0str6GMCWjli}s%34$EHBG?7_)|HSw|s@3}!~j`gn1`6X=S9bacod zI@=&SI=N%Ttjp0XW$THL+@c+C6;5AIR(}P+RM^e(?@G|l+f>rk0IRj9(IQO6Yu)T_ zUUM5Yem=Mm>Ri>9Cg)bXxA+YvuExYRTB7%Dyz)&ghK$UkjwqYIoC*X{)SG!ew76z- zJ362vgX=-O_h+$}A4U2=`#!YBvra|swLME}BG%?Yzgeff! z?Z=2E#@>iow}&YWv+mG(gwYGgeL&zU2EaKOmDRnq;+0rDS}WdgfeLNKLfyi10ioPO zEF*ReW?idgC1IAoME!mR`~FQVWYY?jVxjl7La$xWpa0};&ceun^;Q-rA@?g>63L@o zhD2i@!{hu|alMvW5H!If&Enlqj4Hf>BKOM|rIkfQo3IdIoeuQ)gf2v_=(O)zGA!LD z`kpI5FnPaTmjOrOaOAP*F?CAY#rcBR;#Y^l(I(dg`+!hB=4 z&lPL1OHNCs{BjXFYIDY;#T6taOuF1I4=s>;zFORs>PjmipvIS*c;#=ugwCUeBmy1U zrJ)lA?-+nD+q>80vZoHVnX-g?_USwI>eD=XL?$!mrPcVTD>gG1PcT8o>gL60E)IB! zymX`Oqg$nxgv3kbXG-;fMv6-qtRs7b2>&b?=6Q?D>X6f2l8qg_lH&suMU`t_3R~bl zh;Cdm@{Ob^7qAE@o8{P-JzWiQ&tmwyn&Q&>o!m~{Dbiq;@l-s>H9Q3ac_eQmuo`6? zae)UP5WE`*z1=TiQ_JtW@3VFyC!w^VcC~7X$``{Zqk6fw&f<^q#^`my2yh>^LsQ)r&j^Rf85V;iSQ}QNG>V z;5w3(yGQPGKC^1CDbrZ*-C_qCEO2cNuH^MO{5x8`ehn{dLgN8+sV6-!6_|-Dnij$ggKX~m5}64c@tePysz#gW{!&*S zZKAn9S6nYqT%V7$e-`-MPK2tZFDK+V3(Lb2+&VP>IHjvWsOW3*%v*EaCsd4Usjd9UTY_DHzxy*{*eX+Lg_WNWmcoqhT~`PnY<+$=6fmd- zSg!j(Mlpu`HK=x@D4+PvcSCEf2&x{~Ez0$q>t5D{&;Sk;hcuS1aiBWnKncaf!Oj3O zR^Jt7;YeWSVvg0|n^0ogOA$;y0ZaVu0a2(*ik$!r1xAO${=uVhW{gXedx_FHUtf$p zIqn}&#~UwQ+<|{V9Z0i~?Yg)Vfg%sxxBnWOn_md}Ld95myF?#%X$k>A!av`o` z>4S>8qWFy*Y8@@2TQH<`a%n}ojwGQxhQ(y}(TY|(ng1tvU(H4U7zqY>_7on)dkGbN zS~`Re>c$>`MQVLT9Q*ouC>^Y1a$oG`DHmhoXPD~&)PjH=#8C_oTs8ycg{quFX(te> zrwa8(4InROdu;}LYNN{mV2nmET>Z;xuLlq|Cx=R9(xo-=u;3_@4`bmQDZLH+Eh_=( zkc)*B53C(jVRSF$^bc}it)9L;O%@y<*9{!+=ZhkSB`+R&XnCngTaV;ktC0-sBohg1 zYXrx7&|rKqR)@6y$33ZAT`^LX{l_|oaeeAm_h%0I2@?#=gB{V{dIAm1+mjKZ{59JV zqC>z&docSkJ}%#2DS51-j?3B!+=v|*NIW_Fo}j>#unQm5kFAGw!e8NKAHD$vgBwdR zT2vU{11Cn{`#C5YI6Faqe#zxwGlG4c2KE8~TWL3iro%z#@akK&tXj-!D59+IF{^u6 z47dWacCxHxnAK6snvEE!WLdK@D={n~;8!2AtVx)4xt8@Me)S5=%Ehd!!csA2J;$;{ z%u3d>Mq-77S=KF)ZOy{0RF-uaX5ARB5VNjkS*IsORM?1FEm+pB$gHF*AxoJ|Syho) zd6@Mr%lc?igt{>gvzAa+x(r$6wO7&@3apI+EZspXy|*Km@{1;;p>X$?Y=%KF%+AzC z;Z<~6mL3AFM3}yZ2(oq!k|!}v!SSQi1iaE0bLEfwK>}zk{qW-fV^iu;cmL!{RgXR) zSk2p~*bG8<^8;g}3@-}qSSkH$NO*{?_oIX(n@CJO+zTYu#WOv{iuZ$FBhPc7rIau&B_6aC zg=;Bg0Oy#A0O!?VD(nPs78Y_L`6B1qM>Y%HHwm7P@J?8F^J`QhFdymkYBWrQ!^#wMYj78PxW0V6yE`WA#rh{+az?a z5?)zGJ8I};L;AsQPUJvH=Ii0f^V{yCGXq@L7oEv=_o%9ilgw5~4WQ$6y^<7XBj3?g zb*&}ykx4v+Z{Q62^@MS#XNphMgb2l@7SY`n_-A06{{BA`ttPQgzJD>|lX(1OC$QJR z11$dw%-ISa}GHi~G2-Ay0z8_{vw9~sql#+z$=+TX)T<&I^a?a#KLk4B%)@4iklXp6$ zdi3#|d?*t=VqyRX-~CopyAm{yzZBTP66~Qrk2u8Qi)70EQp8keN~X~72>LYyDcGLs zvx04xqU6bfoH64=7<&*vKUbwl7jl!?D4?Xohi*K19=66gSk5W%8s$0q#v1*B@|yt zml)G;AK%qLcgL#^v}9MFW*3BYnpcc!h`JA4s@W?=6dXb(iHWF%dUx6xd#j`S;onWb zkRa*D$92Wnq_}bEcUrDtdRII`y#|G`EXi%PS1?pU9htcs=?X*p;Ipb<$?ABJRX~Is zL9W@3Wae(evjz+klI0uS!Ju5GcF1X9EKrpDG~#C%kDWfvga)zUY{{Jf&xz#a5VUCb z=eqk-7b|+~UUCMzw@O+?;CF4`#ZJyc6OiF<&>+i_9=EE{1wRMQ9%GzzE4i-rjmU8L z@|rR|8>2F-_O;A39@6&j)1a>z%5Z=pD>djof>s&#xY*6ZelEV36pGwSV$5SesM-BM zkgN-&^r0`>(BQ)_Lsdf?Z zYA)$Z?y;J##O!6xTHJTam#+#7wGPQIk248t*GnC$U$CK%9uRPiRX-j`Ju4JrAPO$v z`td!RHq~Qm+!smB%9e4e%Jixf>vMHA1ig4aXejrVH^eTTA0&5P{6Y^{ZF{bRAC!~e zXUaJy&!7&uE~-fNH*J0$^5hQlp(UxR+YeLD;LY9fNxsEVA62DyT>+#7&xL- zC3W5anZm2L0ZL@^GI*BOciZ7e-Sd1J233fY&6`~4P~=BY?5$#}TAUaTu9~2dH zcV>0_UG$l*2>aY)`w-GT=tH-kjT^<>Q_3W_ih$wpk*ke#OBQ}CRR!m8ms(dd`>%3l z|21B-|H|j*oH}nUR@vM%9^vmS6yP9TXBbBw-HLmot55lsQ{!}ryg03|yhQ8!}U*@$II4N9#`?QQw^9^4JP++qD#j4<5u18iFI^T13nY)E6U zSapnY2=^QkrC(v#9MVA=Ic0w#4qC}r9N6?R@Z~7U)R6{@MyZU*$WaSiszrxKv6Qh| zHur>bj&6$7A!jVPVw5&Y=4-Gc-hM>YJ+0WHbVg3Up}+wc%7YEsxZ1#km!5XfE_1RM%|1t%xW8 z0?&k(yxUFOx=tEl@jGKebSJ|Nl7*8W;!8IZqz>NzW>H4#qn$P!v!qRkOz+N2kfPAP z0frJMwPeO77Zds}RJ&zWBhx>6EQck7sUaN6yR%)f|YLIAU@nq`vl6B%Q za?VlA_YH1mp|kVnf^5Xpg#t5^lKDzkJ3qe)qa!m!kDmIf0$c$yKruui^8=d3!`sj z=5D~f!%ScqD9qRaPj+cY4DuVqkFi7Ve4K%g$4KU;u{{hd4lg1!6P6kZMV49hTT5xU zt#_ueDpT^)&UvuIDAgZZMphaOwNQ+4JM8lKI8RgbI3-h_9G|>J`5fi~aMFHBWGhAj zmkCDWSwlDu0iHNz=ROw)l1jF8I2gz3&6XdtrBHMhbaCuVb=l(F!A$v|@f1*mTnGP( zOYgMjSlk5)sA!*ZPXex!Vrno`>X#@KKggr$R_(F2 z`bx6mq*8Euf4edqDBs@Tu$?iw=itZnz<=4~+K_>@Ov75_!M26?Is0-Uez{n=7QTdb zCr?uetKIWNSeHHjM}(E|Tm)eS#voy_Ft($~!Id+)0kFX0d&-3XYz+p>$WZQox+&!J zO^h}=TNHldNIfz6H-~gK@EqMQrV;S>6ZIgqoe;7@6CW#Ah4EswuCeCaB0CGpzd@>O2j z@kzXv1to&Jn#Cgl0#mM-ih&yjJjVhzRH2!KXU!t!{BWb-U2I@hVMu-Dd34Pgm11G~ zm)xeM+mjq^)k1L<1{9&|%2@o>JmzmidY4D?YWq}ENC^P8JSo>gdDqA2pKCeD3u(%U zr)WoI_-I^sszm8va%Fh}I#J#646S|7vd|ANwIFY+J)zj@Hkv@T5)0a&p?lyjE@O&I zbK#WDGuK|_NoxO}(7wAU__HeS8n=t7)x;A8&tdZKI2=QT9O9a#feqUckQK9tWNevL z`&(wgDt~ZvI6~F>C~kq>-{(l8&~9W+aT@U8kkiGdyRw}Y498*jfZ{~{2k;cGGI*Wp z=YE3`8JM&lGzpVKUR`p-;|5mt6C=e>H;MA%B1ohlIX!I34n#6q2$6Z1v>sYjUVehO z#1fk8{e8WY@M@AZQ@T@Gn5Q|&?Q3;PlMVp4Cc9~ z-bhRAoq$-Uv=@UWbgQFC^q}%&`yMk_X6f{vLW}4*l%eE4fxRjmrabrrlOp!vVP*Cc z%!=6wzkxR|XzgXNP_cm(s{a8NJ4U7efT!*LehEm8O7|zY4P2(r(b8B^-Pu6|ff3x6 zF2&F&lP$`@QEIH1)GR>qOP&kN+xZqq2h|PZQgwzTiZ26X4xB^h((ZE#0-l8gn3ZhA zEe95}MY6|1M{UUVg6~6X`@V$UjLbt91Az(Lo%$GPAh7aWJYMCq%R5;K`GT4g3* zJx1PXm*%NnzPgPf>_4xSSnyc*Jb@jWDo*rAun{H?dXnztJv8a|v8Q`bD6O8B(YP`kL}K4J3Q2D_ zM#|*mwOh|Px@T=86=rk zJb_A;h$W;SCG!XHsysza55`72KM#K&lFawRPqlgq zh6HI5ukj`+x47_ zRob29yZHx)bR6eV)t*=}cMGh-hAf}SI^{RS2grFdsTJ4TeEN6T_hb(P2?%>dSv71# ze(-@BPb$;*1y>^1Ls2GrNQVgcxeu%^l;mGTvnC@?oi*b|sy?wtcER%!mY<;I4;`tV^LZPP(9aJU zH0gR@U(gQ!N!p?48yzijJ&x^L%}12szSTon(g7g)z#ETf`lgucr}&sakuYKWezw&K z(ohTYEdUO?APvZuhgoPetE8*(zPwm<#wx5l3KSW70!nQbTf`oQ2Vvz8q8!IYz`MoW z9@!e68{Y>D;Q+Lz+<(Pc|W?O_uxbYA!?})jUJ z)7b2(HLij(lpm5e2iw5>@>E*wsasu7$T_srb~fa$N5||q3<;ly&~cItXYqSRrgbLD zNz!R_pzS$glzy?Re0I9bc1&q;OMbsj#M@pzVYn8T$Ejk={9LZok>UxX}D&5v#N7e7SRp<9S zSF}h+MPrp{JR@V2EmNj+4~Sy@;yfmsksaHdy`ZHn{egp5JOu(f;W$Sq+17j2{4g2LuUBWto<1?CK>mF05*oonwBZz8=;IHVLOO*D( zyhsqGLIv=k;KDfKIg|#SjiRTp(cq4zxNX6%A_?2@Z?bq3<~80ro@c=bVM1ln=4z~N z5ceM`O6xWOzmS%1AmL+X8U6SclZ!j=0{ZbGM-e?#(BMk*ti!Ux_}d@}%Ng9Q;b{Rq zT@6q3s8}3y%xZAOLbFz!ylKw(ajnZxUJP`@iQ>gd0FK(r=-i}r89G%9v?aNneIYrw z!z2735|8eZrCI;L*uzqEmn)9SW@5ODRJXg^*2H&>M<{?d4FJ!1i`Zs2DdH~jJ zXT7Je-r(*o%GvRNP=H|hJgt~td9#?xsITu0p?)j?$ikHoTDL(Du_l)pROz7O57GZP zImvcK6Z(UlB5+UN00l_aGNuQNXxv=Q=YUk$C}B8OXQMpiq+~4}QLQEub))p}X>2jB zJA2Eqh*Sj{IEtz3$9Gf6r?QmGm^Ur}|&ZC~YP5D8k-OYd8rPkD?0K2lnILen8 zR{N;2Seq8Inu&O=Qlfl0A>I)a>t&ug`p~+r^Qe1;J1?r=u+F#SogZnX&dWon|Lnu~ zaDA;|bsv-26}Y)!loX|hM!mCASR%QLfnycWGT_Un?N_>y0UT>2NfPVu&EOgaPnd0R zw+CuucQ$|_d9jc??V_adi7>(94X$g5gSnA|#WN0;5b>h2vs66%aTa^(Oks|49o>$eMQHI9o;UE@ZsG1p&ZBDc5{`<8-QlznPDhttRKD$v34G( zwz|Gq^;1uji)ekKF3}f#OF0XJOsSM*hRe}>MvfS~8k6~{Bo^=&6&Tso932_q`bWm2 z(mIg{Xn6+x%uHeAl*Gs>k&#mZLGNWH*|LNIjLgE+O+e35rRaO8(0D9n$bfo zc~%%cR&{BS+KM@WR(QhRaU!gRp2CF&*A4JD+AUxiVMURf+(_e!voO#SDlNl-4V*W# zN@^&d9_7*`UbB=l41f69Fsmk?RTEDoi;`Fvgw|!qtO8${wPIsfu`c0a(7CT$>xFMnfx3Km6QYD2I zm1uRzN0%TUOg+ySY=>e0^P?JG=~wky!Cl;2M*L-?4~)oKo9MN}2OlFRK?g(JQpd zZvrm3i6(qKEn)+?OtuN;V4hJ!Il1*tb8Z@o1(C-GuVcN*$>F`SME1(!VKRl^Sw}qR zR$~0L*D>NKZUW!JuA3n`*=Iz?iK#dXoONh6T-RdUR}4)V`Lu+igOO{L%I!hfV9~&n&^<~BgfN?rxXM#NkIA_Rh&6a9a-nqe3xWS0cYzS5=W^|dnaMwHrD(mEzb{RbLDb6xPvKhX>DoYdtr3$(L4Tbao$vLB+~`~5f8<6gS z^AwgDT=DQX8v9rlKocUydy0&aV8S=A%AEOo(ZCMo3h)FfJ6HpvG(q1INkUUbVoS?B zh06%p%L3OMHPUxs=s7O#5awGORUDZOml}f}p2CC{E)MT6hKsljuLkWASl3qRtGS2+ zrR!QCVUoSk@*Bo*r4fZyHbr5^VItinEsbm(`RS!=qpk##)mcQ<&?ro8Bo)b1xY*!| zk)4Z!u}ofTSsLhc21}yceJS~ov`$=DnbcRuaqa6Bxgg5`Z9tO0LsYHcbBVvw%1ud+ z^fVYsH>>itqOX=M3M0aK*sKIISIVx9XkJ$NPaQ)Vri@gn0a84LwFbO8OkK)j{HYdX zdE!oSEPY5VAQeA~6ycNf4NKWSF)2953QPJ9PJZn^aAvFhkupRX@ zk_ew8De)&yU0qoEe#oc_*kM&(@G|!Ugx889AVnqpcD<_4^}a6Jw?i5k{0cOG&1qT` z;`wVjX@BTzgXgH-IyHsuG z@t&HXjoRw@-~(LMNg~l#zApukAZPDlbX=og40{*@90FH6wUW92z>YPNW{BUW)MN}Z zhMylYa*4B4(_a;)fuZK(Jb#hGd6cn+j-+A2+-DNVbw>?cT_!cOTZDY8E9a>bn0O4d z_s1$}-D*<7_3dnm!tmsU3yMTON(^nwIQHvna%InTp~#AR;3 zgeH5Xs>zb{z%b{}upmwSv5pFrh^<$%wcGqu8upWfhK{VCt*M`Z*VTz~k#gBW*Hw7M zK*YLkj<|%*I<`sQ%`~-II&Z~IpY?oFTQr3j{RxBxL&{S}8zGVkk+yK}fW(`&sOb94 zmph|iq)bt4WWr@=3$Yz56UEEGh-w39qDGv!>`h>^!mm7i6TBHqOCvB&`zaFYdf9bUxyhA`RSw2xqJobTN6yI*&h)!SD;lZ)AB_A z4h%3DtHL>kSE-wGZ0ete*$+~qMR@r$m`K4p7#oDe65yv9R4Y4o0oIeD%jTa_x*DV{ zvZ+)ava9N#CAn5|!q?B#(e(Dzp|dG>IU|$0Mv>Epv6k`a$Lpd4Ejfdh4axYWQ!!EP zu!flnsBUq}dIQk099Ie%Rf9EHE3!;0 zVq`^FZaj*;=C>%5KI9#MwYO1t32#84Eb<@lKD^f@@XqEdELOma5${m`bnPWXgwyaJ zM%X00+~3HjakG|~@K-5PTM50;j?+|2D;YF~4o^_M4-Yf#6RzUJeE#BLZV`CLpbj(E zg57O~=QVfe@GQ!4wR%Lqdxs9u(3MTpG3Y{-0<-f65l8o=Hum{iRYY6R@#HE|`bvlR zfvi5NsFrV4aNOgW;-zRl0wZnjxHLwZ4ZteuBMyPe>m+w0?aH2)s($=R;$wq{dxJDb zMYJ0yO3U@TRX#87R;^B;0>ltb_H7EuBZ?gI<3+Nws2m+W;0`pDawON4o7wABcun3; z>>l1;KwELY>@1Oo6v^&lIlCnJ*fn1z*BTpF&${)MyN#$dV54%pv|ZRFRZH6?Cy;xo z5lD8L5k_p9JQJNOu{SS0&c%K?^xU@#YGSW#jA=t2a{Z(Y#CEL~tQ7x8W{C&;slG_b!vSGimV zwj~VqEZI2=!7j!Q6!Y<*H|n4~q6EM$fexx*cfJq-cH0YjunipS5;=PsgOkHNWEvv@ z4Pf5hTo(h_rJ+Oxc=`DVfIm8~2YA+b0+>-I>oaZd%05id!2WRO@_-KPm@wFLWak_N zy9m2c#D|357^RLV2C$2vn=07XpN{~$<9R*UtN+T0Vp-hV>ryW zor{3E>p4Bl9nLYBae4u$D$Ibh5*6mi#=;Yb1N`IJ2!J=7)dRfZECblZ`?);KKs0EN zwLA8J4%)adwDV=>e1x`ucYx3a92)2v2&X8BE zCE$d+n8R?e9cLoI?s-NJ_6=tk*x^YA0IU3rEfqx?@Da_2XA%c~S7QY5-!|%juV`eP zY#Mgkjch~%`{#!{eWnAuQyA=pvU4GVozL54m@Co}aN1qWXE@l|jS*nq*{BCQsgZ#l zo@xwQ74ia&cr@T6I&smmz58?o@U^G)z^_03$IJGo(c5*vCxn4tEISwfy>)xg=?KUj zr}dEEar*y$-QLp>0sM~*df+!U{HJx>_>ku^9sIU1{L5tLvcI%$4{wM7JG(&-_FWDC z$LsdtQxP!lKBb5Ghg1J$-7fbg+jL+jhQThAon?P%-G2O31lU7Q>A@CH{hzJd7fwb1 zeE6gu;JTB4YTd3bj2WT>`{pp%Yh~x!zqD>Ydolv-f1cEXeecQtgLOM565tCb^Z*|@ z@u${p*NF1xbpR)Y0j`vtm49{Je(^*E%uk=t!#v`||GI8pbs_@bm$c~31lX?Qday?w|36r_uQ?t8`DMrTkeiPGmv#H&mb>23ft?Zt zdz0+k^tadTX~!bKE z*X@}{Bfx(7s2=QsqyN*o?RV}%)AfLGxxpZhz|m1F?!uaB$KKjuGr)~DRVl4;yJwlh zXN!_Ypem{M>+li!Ae!^PBkY42RZ5HGTBq-3)5Rjf+9MHo{``m@&;L4dX%WE}6D>P; z>8vge-%3^&zBnW3^$w%*zbN=O9*IEpRY&xwjy>{s1%(kf{%SQfhxLdpJIwI(4M%Jl zLo6z*YA~`ZH%+X=@ z4<(-S^%2-TRIkVG?)v{E@u&!nia>DJTfzvQMF{@On-+QX5eR;uUXS1b^?ykY^5T&MFfJ^ z-xNmh976D4-X4h#Mj*KHpdP^o5B_N}i%oI<-I9ZP)XqPsO>si)28LQx_0?vl9Mq$B zEdOA>4z+(M#q~WHf!baN^{DN3@V`rODr!v;sD0wbFly%!YX8ng%qM{e?7kh)V|QBM zuL^WD(fQW{19}{11hk1xINro?jQa{|Txx5%uB2c?a(WCY|<-f>_ zDqhVIcon*Z@j9RI`af;?h)M*4Qx!deZ&Ln-=twhOrT+tZ9Pc`y&3MA`Hw?$PiJ`W? z>VO`{pYabC>Tuj#GM#!L0>=dh^f-R%z<-iVRRp(;K=7g)!U$eK2>zcomk#WYK=Ahc zdIW#9|8EPaH2Zlqp8a|>yZ39epU_;&(2Uz9YA^2FuSc_kf3R4G=H@bR!u|*}x7)8r zbBq0#mVs3SM@Jwy`}#0~7ZQU1r){j4_eCIh{60N`pWOF9ZetMx;FWdSr$=+!eHsHG zG|ymY#$6e;FTuTfH2<=feX#65h`_7%MxgoAy?Qjy+54YFU{9qb0?qqvVKgr$H2?h# zvupQ8;JE!>J&w(L|F#@VQ=eB;{<|K#i+|UqK4Etj!!Bre%GV9=kNbj4sI2J>4{y#m|jMh{>xi)ReK^3ykw6a!Snb0Jvo?WJg;Nq9zAyN z+oR2R!tNY~UEE_*yKw6sJ$A3*AFTZ|a`4IDBCxyfH$8T@{q|?%;MNfczUtaAg3AcO ze|ZydDWMjagxCbEI)y5u1|8Wf z-Y^jdh|3@$^Zg&^oO|!g# z@k&npA4r+qmfq84mtT<7V~hOOm)GU<`4!fG;UB9V|9$*KF8n?yyyAlN;}x7dpIe&7 zsk5-9UaNg0R@+XMA8y2dW0-TnD`!1@K{7V0($f1QiCJdCh|O+?iasM&@v(VjKFePg zo2^-TVufa#dIElE-B$ZOP*Y2q^w(!gu zaAllogOqsyN?UbpRzviHr_V~7T~ z`@8HJ7r@`$D`MxAS*!ajy-#*N=T~kRSBeUK4vbfCgVArZ^lcKf|NXoNw1=N}gZ9Al z4BAEkhKC8dvBn~}p5TFN<=Y*&_7Gfq;0MBWqnIkKRYO!|=uzv-_wecy6bKd)z_rhN z0DQsoZUCSCJOP-2SJw)ll`w`iYEv-wbi5juSvK%OzZ=Gf`x#^j0pkZ5#s@9^pzQxU z{cae4O;kAOf^igJ9EBB@Fuu3n1LJl5ZW!Oz&oEvmKoZ_&#nu%8_(TtYzdqLia328} zkpKbQDCWs4)}}J_HtWk98NdVr0)zzcuYc(QaPpUK0C)eA0Zi3mydhczjJH!#Z&hIS zbiW!`T{iQ%U%J73*DuxXCop#~nB$fnm!r7umu@gG6BXhvFt-7iVI#FkFjxK31LoOYWLm|U#$r+Xo z|8K}a`C7v~V3^O@Wk1j7<4+ZriX>|HRTCCme8uTyJ_G4!^=O{H_13OI1aYb@hHAE9 zhSP@GkQ$6*HA_z!R_&Td`U=C;vz@h=w@}YQg4?gr(@g+hJmPG@;SlxS0y}nNONOm)Yj5xDnCQ8cwsa z=^04$%)e#zlW|%fSQ|4uVCe&q^gL4^p&x00daphVZMQ~RMy5B_C({1 zP7U%0S7~Byy|n>3&)(XQ^K*8&`dQ`V&c*#~HH-lHcvn@KFSyrV7TlZIhfSJY&%S_# zOxUR-<;^#9g=+i+8NP7kK5Q{lvCl7BGwbKW2d%ksUn_q&Ns}MW;VypkHrYjz^A}~V z5zUsVAL8F_V-SM?IiZ#QOCtgmq)kp-(ZfW5z6C9DSc zdjoV|2W5W@bS$6D%p!7td>rQJ(58CY<7OB}*8p3sF0sUQ|U7nbQ@+; zjHQz^J5*+t8eR&2gI5y;v$<-Bc31GV5`}FhR?ue1sUk8v zIn(wm3Il@Z3U&$;H@lgJ*M^Lx-HoR(AaL40!YSIe~hGS!!PXdf2HCrd29 zoF)wNlOj=#i8ED#8ao*VoK-k*Du475To@+1-pVrrF%Qsa_Dv^@d>uM}&3HiYvp^mh zLm?kTR1VLec?~|spv9h-Ab0tQNGwKlMs{eg7=exy(3iLiS9YQ>mbnM>Rzlv&l4H46 zj6>CoBv$RiifR-6boQwF+FNV*Tw^*=yV@rv6H@s=tnjyYA(2_9%i`ZGt&3vGl{iy(`LAMY38O@)Uw%m0yVl zwb){_NEn#7QzYs!v05ZnVWM6!Qb=4S5_e$Y5|LPki3K9D5fgJUVYMRTfYgbcYNHg4 z207Z`=gZY-mcSSyxr*S{Iv`CR8Td0Nkqm5nJPC5sch ze@K>=oxqwQ<;z^;%0R}FIop*%Jn&>!26DrU79ZSCeCMzhKGOkxeZ5+`rQN}{`*F1i z(%&kh!e!yp#wgs_#0A^AVENbu>$%{qT+lyu!SlG_g~;Vdgji4}hcgd;#WOSFnaX&^ zABWihkI53u94X4dCXk|5T31%{-;ap&4FMJtamT}-PcP=b*Fu%0Mhu8RWGJx0syn>= z`sMX2W4gV(zRvu4otXr_6zQo3!H2sD5fhP8V@RNDfN~c|Su!B9y@l&#=_-eAV|JCu zuBL3&NVUkG?=3ywnJP{Pre)UGgCtQM-1;Jk9V0G$IydOTr_+NDKG}%li)nc9<6PNh zaBuBu*lyE%^^qBfHuK~MpbuK+Bv;Beh)Tj>#07iIg^EP8@AhmAt+CpZE^7>V(*E#C zE`+59g075;f=)6a*GJS$LE{}ML3|tQT~xI3Dn)XM^53vTs4!h`NSax{Se0ku|Bcu4 zQe{~}DocD!ewGv1Hy^utmnTDZXU%Xp7jnpXqF2TeQ?Ns^-k^w;P^-Af#mp24PIEo^ zs;iTUp%sW|D4sPMf@Kp-YE(jGoaf1);bL=_88P69v2gBDX1GvN^zSbr3jS&R%>&4{H#-=|iB>Cf8SXB1_Ncn6?^{ zN`{myAcS&J;~bR&HMmjKIZ5ewKxhbNLW}bbFVd3okwlcTe6TT_Z{^YWBe}|^dhz>m zAMlLkE9IATIn3cA)hB2*C%T8D2s#N{v&8HoxnPr6x{rEFPd9oKD5j92C5a^VgKTqd znFE~OC-Zs8(^4cdcaG%gfA@kUZ8y1)!gftlVTMpwG!%z~R*`QENeTbr(Y#A@5bJ8T zj07LkM=GJ@bHD(SXfG-yq9PkB4+^|^$yfa|vs)`SurUp*dys**B$PVh-viNC#ek0U!)yUSGsssr=@I*a=W%ut~U}?NjQn?Smsm5Jhs5FY-i(S8$xPI57EsN)7j4>HO z!#|mKFNq-h$hGWi%>;=Fv=K?keFFcngG}B92AnQ!Nn)$0Z{iJ{X7ew#K1Q&LDEY9vKN^@ha$*HOesz$80C zZ0jUcTdH?9Urvp-CpIGQPmrm_cpWBEqj#=9%bjK8o?L$-8L$>YXCTRJP;CBWvXCL6 z5!Nd$S<0)x!mD*dmHCX2%X6beY!FI$=@U}fM5*SK0cEjRlGa>_*5*6XQI*0uYt?)~ zP?reFP`0rQ+CX^(9V?NZDwk|!l(G^Ew?wB9Ym(T+!>>C{NN)iMR0>+}hDr%0Nz~<2 zRK7$(Df$?tL?18hH6*&Mw1{|cwy{P)Y89JGtC@JNTS9*$2mD6Yi+)4PvLnkU?0KNQ zK%IXCrSpKDFSS6`E=mqVf!X49foxsOxajRMr+g92!CPy zqOAmx>!9Cglz)Pd9c2gB4KU95jw16}!5HVzh+vN)Pff#Q3{rWNzEH51ynb@`dw2m6 z%U9o$M#MBqoq#Z>I+P`jrCC{+?eH_sb;gM3yh_m?vtc)&^G>D>)$nJxzv(oOFuuEa zIyANu`w~{VmzcD7ilL{4WMvS-)2zK4EYc0Q_JW_qb_#0V&kA4)Sn1#ZEv0bBzVLYG><=~r|oGw}|4@!GHA}Xi=0^77I7JEZ>?5*~3 z)maf~V$(>l?L(T&n#?GW65B8sS?c~6NmMvHE-FyIza zNmy_mj-=2uRkw|@7>_Wdd z0bPAsBGG*Q>litO1pr&7(`RRraWS}!zY(g1*IA}af+%abv;f3PQZP>_lUQZYB3shP zzgW3Ptd^u;KNq~>CF#_{4;5Y#IkW{?lwmHmAc#!At?TX(GR-<6(`;m!=JO=aNU`Sg zQBJXB^Z7WZSh)F@9h4&ZhWm-{RAPwysoZoZAlQTFI(ui8ms=&p-dX-@np&FWwlf7f zNosWRD+0QM&r8;=%wlPmSqy*A*L)s;q@Ddkyd&?zVIC%uFzHir9H^Qz$eh?qX(P6- zmc&E+q)8*zf;ZpFy98BX^wX5AhCz-VVG7rWuTb^><_{_9^L2N(pl7VWoP-++YhXa@j}17~vQr>t83+bdvYT z4l}q(iN(Yf`=oHC1TS9O3$P6muKNTQ^_7<6du&#Cz5SJ}q^4^KR{RBrsxfnuqE|ew z#8&w;?a*{=Vx!={60I}uq6T>9r%Dg?G@A@LP<`_b4qt*6ri(a-%;{q_K=y2`r+uSP5JSs9D4Jomt$EmtExZwlW-;p*729Y?2y*wa-wMe@IF=TWY>H%f30Xav zeJ|xwDVO_#g?L1b_tQ)l0^|2=5yCT>>lx2#KOb&#r%fr$cre z0iHhA(It5L1n{b45|7j56nF}J+K8o*TzQi)bpt2_DW6J?e(vYn-7Dw}XRks*w6w?z|GSK);?T|~PWU3b})5q(7CZIHEG z4rANs-2Y~==bEDsS7)jjvRLM4W<@1H{wVQ_0#C9Gt=-b1!^k@4L`V(6We^#39^XX5l8Z%>bl8m~4 z^hB!q+-t@Iy>zO=7sBwZ_If;$LA;7`4YPd}{^@OB!-^6f#-Q$$o0OBW?e$a~Whu^q zF<%y-0KL;x9d?*9J_U$J(D;aHZ>J$5bEU!8I+~90({zsvaE4A{TsZdn~B>5EhX8!_Y!DDF9o8Z$(4uVSaf@>^k7oNb0OrU z^_AnE`+xTqYiJsxpHmid+^`@rNK*=K9wufn(TEOs?eUw2*r47L1!C0-sJxL;c^#wj z9gNCrc<51F(o_Yy4RU0~3qb#ayLcJbNUUlIvAh=LwF9a-gHh&l-hxENMJnW!r}?ds z^DEJ;2;Ocw&0Cu>7P&*nh&AlwEjL|lIY67;c{vSI6YE;ptU}uBSu>O~B&vOMu6bMP)4k7hrx%L3=3cu84BE4o)3re57UNqq9q$zU3QyWp8>ktGNOfVDxP!~ z>&ty|f)u2{2a{CzWK^{CV1?tgITgq+(eM-a_=gBuq;DsxZctVTIq`v;hLTLe?qCwe zpx(ZU*S((C-QabvrE_^z(e`C@NQ$cX8kfK?ERNbm7P6`063riN%|~5iM)G(9`e+@#ivQ9fYSslmLSEzVcP2jDIUoQ#e~by zqRLr>cot-m?SpM0R!+|M>XmX3%xElH7wCpo$>KGWr`U!9fP8gkmoSgLle{xMA&Df{ z!@o0dr;ZGMls4dF+;Yrtjof;8mDA)(t1cuOs{}dH)CVFh1GL!(2G7tG$fc(+bDj%i zOm%7%)iD&+0iisLmfWlmot`FHA=uXAa~2VV5N3jm>%Y6-If=L~PyhwVEqm=VzU&k$ zXyIR-PcXFk#AakgiUrwVBcT<;4=L74$LI=*8U;l~OfqMfp<=tI69Hz{rB{Mjyb>dB z$VQE)=IYYUnGrpAr{-D3>%}Tg+#olG{+2rF2*};(%ZHQKnr~cdX4Tn;{F|~xR~)Aq z9_HwrVKY>qU#bX6xjz>(o=$V*dJe|C#EIvWysfff;*r~Y}pJ&Xb)*J zn!L7(+E}1cs1i~ewlMEfwLMhLcB)m&KvxmkRdj;To=6%3&u~&h-1yz%><1fMX0=W{zN_IP#_5ShHFO2H>DJ+Kw z3G5T$W1p!~2{Lr?Y~B!x3r3>aelwxG^Idis^_Gb8(J2s{575L@!T{H&)~HUU5Zz)J z_ur6kW5;tR;KX^|V51KWMz~jMmGrdhHtol1?-^gYxxEhjc@56&N} z=~mUWTHd}A%WL!U=7esa^UDuEai-0un{bh0%R(HoM2=O|RPEIj&MFgC`!{#Rh@R6_ zZD)zM7Y`Z3*>fP?O@BHXQhGV^@H*~F>r+6uCH%g8dd}RUcZ?Cig^4wXtg0;aF)Oo-Rscs16>>xzup6LVDTALRn;ZQR3TwH{0vRfCpmvq!{Qj`(_br;2 zIyq5B!0KX`e;&HAe?4C-bmPfAC)ee(&RVdul@|}jVn~k(cS&K_*Qf-Eq=(4Zg{B(q zX+FjCTt4YIzl6$u8Ru_abKfE}vg+_OL{N z45-)6K-LN^9h+TF>`tAxsJ>~E z_aTAyaXxsS0uDYTrW2s)xYX1CV2Q)*g%%Sc6cbwQLku*#scrk`#P%tG9bqt>xr4cZ zj|elV09M10`HZnNxj}&OYAz9S+%giN(`f`*GCD(J*^FTEK5l}__BjG$TmWm0k`PRE zrqp$SfVX=khMrMz;`t%gn{8os8+?*=ku1t-(}G(cDl0g9`EW{ePQUGjggpHg;*swZ zqPb|9LoGsVSjhI0uW#^Uq7OFU_u8NOsj>tEJ?^L_W?qMz8b_K&$b$ZWB_m2z)q?E{ z%Y5=|9M$Y?t##ZS&=*=*2Vc{~*GM8n_nMFn@>^8u@JPHfh+q9oL?fUbyjGKqP^`(f zR8ojR1fDWFQUDFKCWHl%5}iKfPc1Q3j;ia=pJH)yh?h{ zf2^`YP9#{?>M*=R2VuhOdiG^A8!ao1FwT^;f|Ze9BDwP5md~O=lq7&vyp^tZjVZW! z(OVeYOGjKMH&=hbT#JuF7N0cw$>YVhwn!&lOrA$1m&WV?<|eKKNF1dujy|{-KG)l7 zNN3%6XMv!DSjF=cWnO#-!G#G_K<7Lzt%YbeAXP{Zo(;}h8F9$F7m7- zmlZ!?$>q$_l8Z-LxzX4(6eZu)V^JFT!>#mZ`^Hf=T+(GV^v&0JF8pexUuVLvjr0rP z-A-i@;o7md~cBLE3vYb80O-y;mP1;b4yH zgU;qa_Dp7YhP689*7eo>Lh9U)qe6kaH4k`bPSADXed}9)76V38(R-XNrv8!&JiwhD zpfG6L6$bsZ^WE$=lR!TfBtd9@_AWbfyR4_8SVQhRLCA1!vqFfjCE2-(1q``{6Rx76 zFV)j>i`>L=QyuP`dz+ zhPf_MV;rd4gkKNShhk^SG`sbRE`u2gng|j$&YU78!Pe zZ8Pvnf}FPgMBtCXwvR$;@MONzVW+atE1|=CZ^&l@E3LZtN>Y?aL)s0Lxr6Tz(5si% z=fhQG&{Ee249Hd&suMYirpq%qR{b3!(2Rrkm}YDpC9CeaVgU8xq#qVrqk`vtVy~fM zjl!z>L2qn)h^<727#Ctcm)IwQGj`II`TBWn=tHc>acitLFu309_G)P$1=sVU6 zF8)!cDH$A|6H$;m9g$)uixj(IBLw&QoPkukY6}DHms|iM^`6AR*L@}6dS)RkBi$RB zeV!bZ?6b@XEUagn`){`hn|mLf&56~nQ`06}ZA%~P;mGjy-Pf9LAPCn!q7Lb>^;~~lECEijwFG>E`cH+9G|%e3A2mc>m1!dy^JIFY}X-B z+jR(388hi5ejhsvUr&h`JYM7NZG=$^=sq~-jEMuL^Kzfgm$ZA`Gs8+e^Fi76rSR5dIF0H*9QLVl|ik$56}YB z0STav!1N;tO={Cvr`FF={`fQC3e?fcQ~_zCPYEmV4!5=U!x31rCz-0TFanv4uxpk+ zDGBjjO&rjGuEiMA%bcL0f7i(V)+wl|r&ui%yOBT;+ZdwmV-0kYpupPEOa^(39wZaV z;lV4pPdY91ll??W!l&|Z&Xu2>Z7ch1OMGUD=&fp;-lkJ;NsJ|JoDCad@UTxcSyj*^ zO`{xb>^lsWQ2F}C2G_!-9jksA`mE~|;M{qwiK>wOVKjp1J&~3kU!&CHcMAla_ZIGs zp3F^r*&~}4`__MzE|lsNmr!zpl0Tka&_q94<^%GAo=&KrTHh_LUw63gj8r>ki7-4@ zAd87rtb4>|r+=IG+f9!Y+vmH+vCqeg?epVUr`alW!Y#sY8VrqRoqq3kr$&xi@+HX8 zosUdjvn#eke;0O!ee=l$c4&_xQ+UCquvl&!_1acx!D`(%HO%4YW+6SilS{nab2CWn zvuJ4*XO_ZgmpQk-^l4|hkR#v(K88D`&CzYe%uO$_Vs@wsMV3+8gB;-PGzNN!?QZZJ z)18Q%3WWA;z>5~ z1(OUreyK@b2(#}wya?n^zYwM*f~yl359U3G?;?q+G43)TF`Y~&DB0M350tp};y2Q& zGvVDcW8HdT^tQ%*o?z}B-sDbia<{K!2SdG5_N9q1r;8zG6 z`$wM@MlYb}i{0J~FYO_r3FrtO2~QUu2~RiksR_pxvP)fbY=~?4bV)dWI9fnxKj*q& zbmML63@aoW#9^LlpPC`rcXp=O9RlN z3MuoFtw4Gudc-A_!YlDDe}Pw`CgJi*yeHv!CHfpawU71GWTBq=sAyX_Cq69i!;Ez- zmKsW|lS92rczf)7+(!KK)n%Ga>^#C0bT84{`~7Y+f6BY*)FBGAu+o*wpb!YTEM0+Xk z;X+l#WY&~Rz*6j-PhIU9pRZuU&7r8bsf$lT5(3W{DF_mqtt!h6Ok@yxTff+S=b1dD z1NrVNATfV8=Wh_B>n`(xT%JO5oq8C5F&3)^T*r>YWfHW7R-l2EZqty|$&5>sV#kuG zvsid>40qZY&tlEl6Qxl(*!DF|TthMVk~S8k!ec-xJO-pB%I=UYx_Q91CSf!1@_;a8 zKS4zA*0AuQ03t?}JOWJ!TCuI0tRkY1i$ot*e2HteXxAe#qAu$=XFk~^8#ZO(lyXE# zdLkKazptQO314 z%I=P}+Y%ekYi-H%nN~3stx2$|_Y-`SWj<5ml$jnDWzKcYBe?l}6xGRH2vvuFBpDUy(6RPIc0$C3} zqK`m@*MG6;g?y#YcR{kt_9Nz0Y<|wH z6cxKTU&%#bC>0kKwUF;BZalLt1(2YJ74GWSEWIB@Hl{!f1-@jMw^?jfnfoHh zUi)T>njeAh&JwybbId{t$;9cID3 z#%x!8tuI<8>#Ey%LISz+>ew8!?40uCi`&~xr===ZB%}4SU6nL%B`B8;n5F!7C5#n= zOU2m%5a)5;zUHNF1A{c0{8&1&XwEfG9od!bTzOe7E`kbJE8+nV^nzOxg%_~<{@@a~ zUmMn3S71B!VUPH6D+AdWmA%Bw?RUf+UElm7|CFlU9nc<(!~umjIIT# z>tapaKTx70pid1WPG`Yyce5)6msh<^Bi0VfEClM=?TiE|V8z-6@^ZDJ5scsnzUNcW zJ7lZcgZG!rc2EmHh_gsE0*V{A6`d+xv(w*luh~}T9f@k!4N=ua>KjPD-;qr``$u_? z#QWoutQ_3@t+#|>-Sviyq?c}m&U3ys;V-;Ia5kV$^F`u9LHs?R`POWar6n=*6u|`X z_Za?X#Yn7%0Sui_y4Z-R56j!pFPGHhTzrN`9sKM{PiN^HjZM(k+Ft*aK0nfuO)a@R zY=ovHo-zg6SECQF|9)KEQoN~UBtOsR!x7HO?s^9bTY?{Emg6^IO3i0NW|uvSIP1Y( zEKR2%#y6+Cs9rT zfeR7XkbTj3XiM72lJ3`Tu)J^M!x5VG#$ zySR$6czmW1vdIoNO9T@@{WJv~Olv+fxVJ%^ZU<(5XkS2RC3odO(tdx@kf7#38FpHF zcv1cL!M$~PX!G~7O>FE+ae`iUTi*0;cXE1j(3P~y>0UsUoTl!41n$2X^IXm;r0z*G zOyIX#{RV32SxUf?#6Isk8DDYA3UNe8Nid*G|ChpTJ$ctrp3Ql+Wt@59|MF9HHlojf z_uFaiZ)v=ftt&kZcaHFR#o|7{5ZT$%iVi7$uF99WhS9HG84zM~%eV=38xb~P_@SKH z{dhUQPGl$lzL z6m1U_w5>zi!KSZgE+4CH0=QA(hoyO3;?KFFv9z}_AQxoOE508b1WB{bUSTGp`at9^ zyDZXTS2i2sv_{VDziase3SL7FsK}BXTjv+Y(E*F)l)eE)g=Jr~qdDzd3?HGV0QFSI zv8P5^VQ)dvn}Xf=Jz}Go<(|e|U3L$1mm<&=A?7q8LH8;Y0_|&n11LT~0hl0VZ|Wv& z1_>i({mA##W<0Sk_zab2(2P>KbfP@jd3^p`^izIk- zyH&zg$=>Y{s@OWdzQ17vpfXKBrT;ZLx?3LHlHm764%tX}kfx6SL67v6A-WAqCI{p_ zxez9fk$NL1G+!dDDkJNNAfRBsKoUzBkrBH{<2ek0=1B*vp}Wk73B7@f452dEMS!4n zoHtBJ5lIK7y{04mX#uH2{O}u;y6-hf_EINmA{rSWi3v7e43$afX3M0}#a4MkDsMpL z$*&eHn#u-l;BFri1zHYE17=-6SvLNWWGh;1Alwx@E;FX zPjaXg#p*yT%%|jiDHWa6&@9nVA2c+}#ZnKv0()_VkVVmBxrscsfT@0QH}Awla&4vN zS8zz6;9lmfy0fV2tistW!;ySZ3ZE0!bah(x3a)!PRzK>k+EFxfziZ|PvozFlGNagP z*=@D#wpw;uExWCj-B!zPoWrbm=jo|2m=j~oi2010{3tpo_T`0>``0;7cwosJ z)mNBxdju=QDKeivryx-9W3DJuva4^C@!NPkKt{@+7@^e3Cr`uVOx1rcbXcl%vxa+p zPrmVT5^C#}S^%nljlL%sdD172@mf{#+Npnjh3~q%eDwFQ;kOENjZ+ygV|_LMyrW&2 z{eLHm)y{2CG~VrE^%Q>-s{^9ZFyMqJz^=p{_NzgPzmv(D@^blRj`^# z$b7bu&*#)4PKl#mqA|W4GAm-R&H5$97vq`9DBmi!76#?#AGKxhOPU@2PAWrZvPd&b z&vthGrrgk;Ufa8(-j7xXdZVVY>3MnF^(-!%b(J+DFSV-jSty^aZ2CDFKk-?^8a>zi zZ}OnVXLe4e|l;?8E1|9evx(s%ZxeeHMjk~1yB-~rd0ha_E7 zkSIYCT)wq!+qP}nwr$(CZR@SQ`_{H?Teo)?F^%c&n4gKR?x@Vl!f<%;|6p&3scNji zs$dIrN2T#QVk5Wo3 z9Z<{kPg{1LTep%==-+8urI!(s>%F^;#XQ@0l5=v=yH$O$kIFkAqs19mF>l)Dzc>-bDuE*Ru{7hDL)=n3BeTO`ZG|3w@E_mP-Wt3 ztYbtxHn@T#@Pj$txJ>lXnYxpY3bNWjMSQgmLt#U>b2#KQ{)%L>CBH(_9I^NOz|101 zuon?Q9)L5nRLPf#Es6;+>|2rNt=ovHw zNXgJ}0rv=ILS1L4Xf{h#dwc|+WaNQ?Vd8^`lLL;6EW20?8?rCf1`f4ZmX~>$eM3=l zw3t}DS~57z+!!}GngiL*~h=sfrQJzMu6?@pZ8kHVE9 zowC>MoQL^sXjuQj6hF&J@ZmJ;6I0=*f7I``cc+>dotb0Ew6IO%*}n<^bjUerSuFZic%BK~Fh#J;*C zcdw0<7QCjjjSI}FR=L7#Flb3kL*>b&We)ETj-?v9xJ%Zlgpc9<0EckR?X{OLVdh9k z$TlkoCSSKuok3D-A(8zfhs$A32zKSr1z7h^ocuZe@{TFfi+7&_zg}^3UOUR{ znV5H@S#tYR7b+Tv;G@5iejdr7B8Pgxz%BxB-HI@^yd=%?-AeCO3i zrF@CgKWL>}NMeLB);Y?=^KxynoQP*xT0e{l;wA6!Y>MNlVHHQ(5&x~rL@P`-)6fH$ zqGj8)4{HHoi1Y{JDtr9(iqtr+=*~)eTqlNX&)sY>MrCkT75~Z5cm^CH(a01H^jg0l z=caT3@%~a`9W#P&}8{mmB1 zoOBDHI@QQWuafwiG<+Vg>>Yp9y5Jv^kfMMI(km-QEXIfxACpwo6Q=Xz)8{@DN&^tw zLlDM0WxH!RpklWm=eh(JKb&def`$tXkLw%*kBj{mhuvx?#1oG5!YNDBb4=rhMD7+V z%n-0Pe-w=2(fVw@Q4}s{dzuZju}SPWYi zv#3L_hl1M~So0M}wjyV{^!rT4GO`YuPGeth2bs%}|6NSqIO{KGd$K_HUL>eVM?x9* zjV>fWmJ2Y|;*_X@vU~wsb666FAw%whJEEp&lcBq~Zu$3ZxxdBID!oh+Fyoa2|3LAL zP3z&N1&F(J5unN3C61waWNw*6Qh-4*6ulUG%mqpKCtzs>)Kpw(OIg_3$|FuYz|V1Xh`5kCpti zPO8{2lBej_>u7Tk4qI58ju=*!5UqpqLp3jBoLjMUS6FCJ#ez3Xp0a=OUZPaG=|Eokfp_*arEv!$fp~2Hv=?#>+q2`P|z;FHT6FjE>=-i?N_5; zl0rbc0mBk1{AuIb$vvbn-r}6(M+`}vJ_Csg^=%6SS&@-Pd3XyG+_f6bsdG(%<7)_A zJg?G3yy^aE1z$B(6882v9B6qS#F@-uOvG^n0(Qq01KByd0;y$QO4 zi+Yub;)SAXdo8)2Cj?35JOGw)IAN_`1ff%`rr$to_$#>5QG{`vFPTqbn(+5o6Wz!# z&;B124EfuRGoSsj^&4$a{XggmW(?DH9u}{wqq+`hh9(`n=25tUW!}t;dYwW0ULVRyN3_H2U2kb{Uo~Q*4Kz&UQ6FKrAP6 zq$`fac99?2lGY$KCp0r*a;CmW6Bv@rBE>0e`i)aXxAZ_4J+7Zdn%v3x>r#uca%Zi0 zAAMs!ESI$MIk?(hO=@8Ar1Hk~LW~C7Qtze#Lm_~gKUGa`2T&o+@;|&Wv;>38w$0#F z?bNkm1v=&tWpkkfmrmvNXG+Qo6Qy^W^0OyIkUxJ`L2q=mC>zjjq^xxRXbupioq1u= zIhSIN%K#ntYVYkPgbN=?41t+5MQ&5%`aff2Jh8K#Q`)gOkGYeaC zU)!uzWui3D_xpvdJ>P*Yvg#!#G~?7=?rvtqqc(NgrF8x!&WL_q7X>u^AMF; z${NJqj0l{=r3Q~M4Tv05^1ge;4tm3j%x=-Qbf=xg1=~G5LgD;F4WE?uin+KP;p{|4 zw?|}ouPt?}bhySeG7Zx;GfoZXYi{OpS81!biEh4J%-pFN;mxD+lAr0moJpzbcxuf> zG8Pb#)V)y{lrJ!58~$QUQjYr~f7nEZq2Rc{U(^2>?u5b*i5vF{1*|*GR<2=RDq`Uy z@%9bEBMaarfmcUw2-2#ZgN$FSyvRT4TBgA<4sGAxuPC0w5KNwg+pRgvgqa(3h?>F&(LpXrTtl9@9C*S_;&n;t@oUps>;v8YE=n0jSDOgp^ z%(8O&b@5Y1&ZU3upluNS6WNLShBv&w6&AG0Dxo|$yn(uT&%+k}L8jSdLks^RXLv`= zBO4F_7pEmM?wn+uuB{5(1&ZiKf zN3J>P2I-35h3|Qn974YHOwJn32n01bx7;AbGyvRq7QLiRX)gj~vS1v=%>v2&oXruf zvNfsV6!Gij9#XClG2)@|lAUwFKRuYI!&IVtlnH&x4%oy~v+36K;mC7V@|ZGV3Srmz z8NCT@{8(Tv&z`)vG!ODeRxBwh#*9-ozxSSgG+C>8-9fd_&0t|)#Um+$k_z*ea7tUs zyv4N8FGe2kx}Ok97F!xlsF(LBN%d$BEeFa%8q=ns;GO>%__L*)KdvSn9l`A+NeCCw zuH|4=xvO_DVgVX9^g znXw>`?k~ym&c7gJzD~7Nj%_OC>3Ef3-$3^8V*G*a0Mo4p+ueIO`%%W}j41LitB0q8 zBr3rNj7G#7(0Beoq{;SX~B&wjAIbU>6t%Hd{%wKSGWccaIJJQPhX?+&H>#Z?#Qpjo$>@!1 zdnD1Q-;oG2RnV?Czuz>OxV&IiI;m7@4_EsUfpJ$-ErrI1ZId-+O876cQ>~kUQrrkl zX369RbL#McUdF}|;QQSV3P1`c;9_-HaE+(%ke0dwX?edht>3ZPPc;it8>FhX01_)z zwxG}$sJ|6J1HeL+TYK5HQupxgin!nt9QEyc_n1iQ@Z;w*%KJ>JYb+s^vIb+wFuD3q z6Ip?^dW$j~Xx*|9scvTlpV)MlzLpio+q3!9I%_gjrGn)KCON`IfqHjnjSE=aH7Q^^ zU)B{b>)6nq8SK>a)vGFLr*~V%6?%7K$HY16g3;`4wGHnUmCV_ z!U>q=rqi90Meke7>!WCJlRwmw%kqUCIZCIr=DlDkA)~i?@)zF;uq3P2R*~GHKdEd} z2Y3qzp~-NLLgL@bg}`Bn@JEFU8nm9Ss`J)ps1&97#-@=8E|%3iFWb%Xcmd@Vp2|h$ z3o4}%_6-b?<9>EA?XdJp_m#!J{JaNhs)1i*%UNx zIpTS*4p_U+RUFWG4BUNOr=qgE_A-4bA-3$NHdVL#@uiXEoEudcErKB$5n0i?z(^P#G=}u6VRfzU~OW%J>dp?^fUeEXnPWZ0pQEcZ?H1K_R z_?3ds(Fde1Axi-Gh{d*dAw2TZXb90T-;hMz)fm%z!f!phCuUoa>R)9x4`QsVairH! zv%(p=G_HEztwirufduXxUUFU9&QAtY{%OlE=T13C+_E!t&Qp|u)5=hkVSU8T)?^ty zTqrB(BxrxS2>#QSNKr#K?>LK=3oApABiKvxbJ~FE>EEIs9KK6!JSPw(6BnA0ki2OR zJDkgIXgpSVkw9Ma6j0t)+<7M^?_D6niTMs~zMPJs7Q!=6fj?Y z`2*I(RFBw^L|>TS_@`kA5Wrn~O5$jZv-{>hAlwsB=|Ggk9H(*gtJrr0qFO-Xkr7s&2XJXPN>KsqGqDjpOy4p5opUmQ%xu zsWO2}G!&a3w!UrFke{||$ZuPX6}O!xNDo{#i3_-n2(=Qbj= z<-LzkBX?0Cv2>1CU0+Iju2JAiVA`9uKgjJ{gm5D_e1^7dc;TQjX*CCnLrh4Z+|nk0 zV>7zUA)diDex~F85e2lXyH}Bdt@|1V=BNsp0U~8nrR$T?_fKO=5+Yqv>j$RS(&`81 zKow{h2j(QC%IXL5rApUFy7Q;#2ii*E`Xn~{`azJgZ^)dQA(d2P#?8|Cq#{@#AbCQ9 z(-}K{EUls>ZSc|l7StpuTvJg5MI>TUHIfYNl)=MF$aHL(>{7MJUKy8lzaMBhF6F+R zO3C}SOf&b@Chkt?_^&w-l>4@ebi+CG!)-O6Kcs^@?hAgCQ#(LO zyLKX-TfZHpUAq8^`?fyiS1o{uel+s7~A=gxSgY+T`0i%`<7 zzHn>(7i3C~Zb$yKuHb?oqgvX%Q2JTM#LhMgR4|mM^}WI3UDx|zp4Xx1_r*`9=ER*F z4_g>s2(P;d^7ivD_dSVv8{C&A3*}o8+IhM=kCk@~UggrL+H;`j6KjGj?CcMWt)bomxEiBo@JlX-ds^&@Pw*(4_Wp$VrEl*1kYlRHz&v}7GQ`Sf?*=Tee>zgizH<^j4GUo-=8)a&b09;Y%z0I>l zxk}L+INOm0Jba5eEN+mh9K>k8cM5$%-2?2-t^X2HC)7HpWm7$&#yc?7u_qa*iTv-T z0P;b>PQzo`)f_BV-ZAbIxILV(ts$J7;fvIDerXKb7jT3+w>wBxJZOH88GE?Ck)gWD ziE`>+0(^@#9Y6PH5*shEsyh&UWU5Ez?%Ro3IVso}vMRRkA?tA`>|? z&P7PP<0$-kOuVo-+kEZ0ldC+H$kf*~kMqQpK}@eR?*OUl05Lt5!n*U(t0H6`Jv;F9 z%|iP%Ek9pFS{@980IfuMqP1|)s+AWlR=`kCxJ_Ebl>vA8hqH7GP*1)}a&wJvphO$5 zm^yPr1k>zaKUrlz$yI*nF#BY>tMQ6*0tYRhXt#M*z|$f-QKQzNLI+`_9H|&a1A>R4 zoBD9$g@y17BzWB*Lv0~_a4#%G;lpd?wDBrB9#U!He`(PP^7g>q4h&D0wOpL&KXZ9# z+STx4Q&F0c2iiacbEVN$_k>dYKGI@Pal`PUQFK(KOXp{z@LfE~tAXNR|JKr=+G&Q@ z`){;oFfufN>apI&gU@uXpSNet?X$S?^;`cu5;zR!&6#B~-?6XRBt zJ~;xrca|_?`3vo^?W=LR!Tw?Z3CF@zB<~z^q7lesg~{xb5jJiUz$cw|EuiNau&#q` zumD0egce)P=CMFJ75r+j>=y}l43(WfpYl&YdVTs9H`?DY zyJ^rno|%maZ8on~Q_NNt+WyK?LGS23K12}A)dRxtNwS$7On|w9=8Y7j8lS0&NLfv3 zJOKrs7IH(G&#?}Aqv}b%+7XE^bC&>Zy>X7v6OZ$D$?uG`-C%N^J`uqg9FXb4aMCUg zj?ROXg0?+RrSDtjgPGp?U9)>u1&k;-=o#RxgPaPJ=zLvK_lII3zg9e2D{w{>idZj? z5An2=1;u4Yi$1T4EJRRP)q&t;;Cdfcj6z)UvFe>+R{w$>R-wP>dQwM>SiO9Ul#jxF zA;NEhNzOA;44Hakea74+4J~;JcJd)Ju{lRp#8u=d1AXKl!KWI9b9#u~h)kJAm=CsK?Cv5L( zMpw@2ymL(VI7Rpzy>q_*t(<{qmpxVGSmU)D417R)OMilH#2|={gRZLu1N#^PuS~*sV zqw~wE83OetR);W&>B;R$oC0>C0n?Qp*he&1yg<#&Chsz5UGm|vM{2=r!1B(&N3`@H za#5pq)D!~n_lxbTFKbP~AVy}db}ttjDrIhBXKUA9mv`cN(L<|pqc>J~-GyKqVUR!b z*uGi=(k54WAa%R~(s)+WdwVxzw}qN7gGYxD$lj@mXjx6AJOMVZ3;QH(l#4N9->Bjk z!HZe4a-pbQo~MkeUD}xrZ--L3?zsH+>HZpe$_?d?1g`G(NhD#YGpr5EqG2=C)D(t| zM;FbAFUtlbRJ)iqyJCwrx>hD}#n=}19-|X^j3WFNcl9L(7UG-Ng#>TMK@7NYu5aZ= zXU=iI_dAr2ER6;x`{C{0{nyAZ5jALZi9%`mM7pVLVj>FsPFzt&6V0fbFj!reBZZYs z&v-Z8LtUS^^VYq=kgB?WT>PTAK6AoUH0R?_Q=1$W!#VkFfg#Q>4#im4(jbp?mT|!E z>cH<;;HPqW4%oA!n6nS?vjHzSV2=%doLPY0e`vX2PmN$so8V{D7P0?3`p5-8%ctr2 zzqMuyQqfYe!0+M!H7{KsCVAXmL%40?wLo;(`FYb$!Vq_wGnsKwN@BT9L`s_VPWJsh zZsT|0b4Az$@3O%cG-!DL-5M92@U=&1|Jx-O9pEcq+g{kUVi>g#2(@gw_W$cb!Pna5 z`eD~14YD|@$=MW_lwpHFctdgWyhb6NC79nG>HyUQTEM^rd1C&{f#1X|h!R3FU1@47 zd*l91es#6)F^ua_5#oL)d*LL3i$3&=8zQ0f*TgJFeI(!SY+Z1ccrSGCC*LQhesOEN z{&;;Kr}h?J7pJKStYeaqjaTLrrPp@_4;&qZX1m zJ|-B_A(>v@ID{!l%`HV+*?4^x;K$*|iih#;e|9t2+F1A|YEY*hkg&YrBqc39hspt~ zBQr9rM77oIHF`vlnWb7b%1o~eaaxY+e7zpeOdq+ZSsf~VCy$3H1-W!n`dr}{4e&AU zqs>CB-wEpDeYrg7<7L#Bi&4#u>)Uo)&cj*7<3#P7_Wnc{!tBEeZ!Ui5f2Kp*ab9Bo zH9SIM`#06OgbaGoEwq*2N@{@bWl`n2nJ2vFwzmyoQN1ZMVvU*HZ~nf<9NRt*q-fbp zzVW?iw%4=Y15gD$Z}C>-u&cD$Y$EkK{C9SCe55CM@2GKSrVygFbW|PyffwW_U_fHb zOs!QS%SLQt%BFq<)4YDi3_VWNT+=y5e2+5rC+e=*N(^fhTO6rRxrldN((Ll?6$4m1 z#ZaT%9&p@;+3y+*D?aBZ-Qc5Q$GGDadE=9IT}ph8szGjPa=u`(VJ5>~w`2Afgu&x0 z)9j>NR4m8ig)nYutI8FGfk~M|6@|&%awRWOW+kVO@O&I0%e@FT_waaL;KR4FIO77f zQ4!yHzS4a;xLNTw=Cpt}&J3ODt;2K!M7u;iuRrdd|bKr}i3vYfsq_>5Mhq(Vuu^cs`rJ;v7ew>MNw(JME-fv3d^Nja?e}2EWGa0E9OZ9vY@qd#h z=GSn{I>yRyg!v9)wEEMtNjghiW@zv5q`WQ@!JpW z47}#c`M*7B0Y6<^_@9;WZRNdZ5lD*K<2c~k*E&HMQOJSdQ-&YJ^2o)!NE z`02mK1AksbelOTGjD{=ck!slvxU;vhH$8jp5IO4;K>E|V(htAgyw}~8Jt1%V6IV}y zMU8H`WbN+w1(5Eu)_XZE&YMo9X(825dQ4BLAuJO{vY`UV$LDl|c`4&%S5E+*?J>LD zJ0xS6eH&Ki^7OkHwb9?Chp5iJ!$laUSO{d$bJZJGl@%=i4Vt#hq7j2rog zV2qt2#E&U=G8pk57SoZJ9UW|)JBpbL1H*qVTtf>6))|4gZpg|ua=|-T7HbDkbdI`k zK`0)bA2bX!)!XM;va$I*@6^Nhw4D*bPOzp$@uh|BeFT>rQslHu7R3>)< z%e6bwNUjl3*#xEquFsLB%EEY|dV@zYe5Xrc<(4RFI0KM3E|jxPWqG!q1!`>-s}|am zsS48c)O@K;1=%>(?=pAq0MAA_E#1y~m@`m_R$CCwHdRA8$)`(T=033V@5L1lO&t%+ zqtflPVM?K<+HA5 z2oU8aHeAf9iBXXVm@&hYoOWO)H%7b6Cf6)urex-AW$r&oW%h`7Oe7K6?hkAfy5Gog zHKZ_4w`StLXmxe5T<^$<&2hfDhGVA!ijUi7wts8^^zP2IBn-T+uzBt{fV5^;)D6yv zGN2Bd>+!|@i2R5rhdFw|!Q%vOro><1NVc4ysB9{wy2Eq04uA>QEafSq93HgP&3Ho{D17PifbrU48%S~ZBoWbP|L|Q%+lPuRJ%{8k1adb zl0!zX3<8_Jap`M-=0y5Qi1EgUZ@Lvas25_kL4cT;qm6}2#t{lfg?n@%`~UI48}JQ_l|gi$TH&~3XFW8{X>+kT4FD1LT*DC7X_^VwQ68}g0oSHBHXDAJyz#Rj zzVV)Fj8EQ|5x1c}EPTXv5|4*&GBH+~5ckcU39G}H>ELid1!pAc@BU_t=VzL@)8egT z$%Dwyd8V$`aUe)$$O|AOAV>T^+gIiBPWfhZc$gh^b7LJ+A2hq;AAGfrvEA{dl1Ce$ zdULTt0}>wNoOl%s+FYVa|0gT*DOtEp+)n2ifPL5~oDDAhaqsfx31Vs`wTf^U%R zHPwcM$VH>*ioQ5kaL1et;erx6WEV31D3$yxf>&JJ)&~OfDZporbn`)F=ExymA~-~K zoc7@29e~Q+-Hgoi%v4XH!pM0U!(RBPj<>iqikXaD-(i62rTWCAGos0-5^I)I5H2|O z&A$0()%MIj!I}9dpNX&C1#F&v2;{-J0lNRU!KzJp&LW9wqj-!rCD&_#V`XNGw>Wg0 zu9EKU-&-xUj_E7YI>Zy#44bEQ41KRY$~1%Z%5I`WsBI+9fGD zxTshU=z2b*ovi}jYa#XOX85af#BdlF)0GzfQG>Y5t>=$i%&91YYjSgQi?(djI8AxU zZ#@nA<%07ePEd|>;x6EK-qyk_5dC*QCywp_c}h)CKDs-SWY)$1KA9R_)hIe|GVQ9Wi|6!uzHT=%uFvX8yWJ z?b8GP4&*mk9Q-2XKYaIEoXzPYScxsE+@}mNc)907Te>h^+S40a0JM^}tcA(U)HoJ3*V#65t9j zswc+72FFZ1fn{)9o>iNeS?qT6`X-UUSi}s_p$LgQ63ht zw64T{5#+@!9f&U|%w$KU#MwS6e)4+nkF{rihul^BGF}h(fk~U{V77bxQ+Sz&)O|00st;e0L>^QL^fFheB79I=2&k>A+oaT)m)fi0~) zVO{Y797&c`kOEhTG1@a2Lu4;(d%6Hei$OrmViR$p0&nwMsB1xD)VYk784hR)r<`2^ zfTF)!Adu0tz}!d!OB~cHe>3wfrL<+hH&(cg%B>!^`loskp5nQsp;~z!juXJO+jw+| z?R{@H5f!TJjYFTFykz4kfc98u|^q-Lc;Pv zp16AYrIY?Nl?{Ko!*w(5Jv0nS;o&**(q`@aDv}~+uJS&7A(FP%SEA((+Y_DbDVEW7 zF;~@1+UOXSLh8+7W`q-)78)5yjresKOA39w^dPRj ziA!8+Ux|u60KjuTs3lSen?x~L5qsL10Ac`6qebbi&4rxR z{kMn0;AIwHSWon~@zRqqU3?IEE*)FfxoO2M_xr;FN&g;PWAxfun=r znZpQMXhh3m`3l)lS5=;5Q6}&zuERZJsa{JX#=%A?Tcd>0qmw$Mx4#OZUji1k;kIod zoQBG2BG6c{bSi;_gp{rY*w3Y1+aIsSYE%&`UuZ;90HifOtIZB83C%&?4-0cn zG(k?VvIkZajwp0cTM5rpDM@_*Y$tu#J&y@0)2q;kg3NW<^qjm~6~!YMZd{U&!h}Z> z(BV%)nU{oN+N(QQj}eI`l3I)-SSPKw_s=I78Ra8bV+OUR7B_1SwRN`Qb8T{WVbYc_ z<3%zpa6`TQ%m6snDo66&xG5(6Uh0*iHM*$9?_mq^wo~#wpzXN3mIw1P8z@8n<3;r0 z(3l*gBG{q~V>>9h2^PG*hbht-nw)513VABT7r?62;qs9U%IMN>RtDb-^}Iv8w$Os} zGkO&zdYudARpL-K*b5r7_>7RGrpEHWH`j{zh0kx8SwWp z0Q> zm}kLOqgPHky!uZSdt&*jaE$F-ue|CW|?0)_-k@u)Gy*0&oOORusa-BVpmI zGy^&sF0ktno*`@kuc6zujjsRMu4ICp_>Wk z4OMo{;Nr?}Jo*gLD9P3oll5a{=5naOnB9CVgYa_lEvR|L;A3kd&(P9wG(f-r1Hb^= zr1JjC`96w!hrsZV%9AHiKK{`hA7ckCUT0(}{=25b4KVDMzV`uMSLm-+qrmh1v+;p@ zT3-7wO$KOXnyuUzgp%Y%o3U8Y?0(TUh$HAm00^clocObjOZXRz1Q40WicMQRSqEmCS*-wU_;Vhzmw;6 z(|I$6CBa^s)MVxY+x2ptck}&medD|1*6Ss9x6~4S^1-v|z{G`V<^Q-(0~9YR8%(=T z3%r3>kYRz88`P5KJ|D^C}17HrE{M%T_>S&IINT%Y%hF?P72S;6@fDt%%Jx z5ck!{%iICD2w7wxKk%y(hXkCnZ|`QV3uj14n~MI$NCg)L9wQpX@`a>=pD|svj#drN z+fp+ZSUVZ{tCww)0^i~P6M(UJQCdX+{rbLyhfMV&3fc%$mA|Ajd^LX=mgK9hdKME6 z%&X0Gau%PBnx?eA! z7(~@0r`&s-+Le}CDip(v4$+W4+dG7jT@A5lbcw&&av{1PY|S#;!2Am*bsO72qRSDk zvw->mY1{Gza8mT_QIbbi1k4 zZ|XJ4!~k(r&KH)$=x-h*r-vH=mGoA&?Q-}HtRf^Qk04oguZVaB2Qy9z#+2)1BVveI zSNZQ_M8X3{-~()jn&iQ2{WQnD5&(|lV2P~n!50;Nkz>`w1UZ$PL1iQ4LGNG4D|E3X zaWQl5)2!w3}p_CALX_Ak7kyd>P7D`bgX?U-zg%=8UQj%Ohv!2~^_F@!ZqI>(NU+hPmJA6C=g9 zddaIm26Cq`Br~2GK6k+BrJ4uBJ|BUCr<{ZB&6E5Bp1jNh`%T%gcv**~D`|03kC%lfeGYmpm}% zwGSF;Yh@mn8rIm8=?Nyzi3X0tgsD`~HNsM@eptN^X-beS#M$(4SdSsfvLj}sUk4wz zjCc8Kw3P^hHlJWk&P?-w2_lX{#3y;$1Pis}IFjQYOF>1YoOTe}de=zx#PQ^f6xv)y z*7UNj<$HVC8D2TLlnJj5yv&00TKM=`Ca*^AS<(WFk0Ps2<2lmJ@n8dyNhKlRI9)%2 zY~RJ%$r&hcN|B`?rltOJ2bR=qu-1K(aXnueyy|s_4|OHZVw|o=UbQUoY5x+ zae$$4aa25>=QWNYa9TIjVFe_EW34Pg-(swz`ZEnlB=GU^zd& z7P2f$vrjk~O#>Na&x9<8v^|iT+0@4^ERdRL@Hk}eJGijB_^HmG$A~T;oS17m4J>mH zaL&vJ8R?ob9H3Nc7;VCpaBe<^KRPcS5jW70?%qh<94qInCV<5&2nb%n01}(HC`d%1 zG|ku|B$9wsXl~x~<;)0>rfx&~(j$MFT5$uS&gKgCglZHLI_cG*;|GCf(RO z*ll%x-?62$ixHfOqFHtj(P^DFotx512=86Q$MTt4_26 z%k^JH6LcPyX*T1vH7{Vlh1a;b9=hl(dyX%<%iW0iV_f3@-hAozxPi%mFS>ZuAQ~pEICT7u00mSXc%}+ znu%<>7eW7ubCFn=f~XFWcR;>B#~0rRCa%j0Uc|~Vf%(WtfThr@6j?;fgMw6!SLl;Z z-}~9$6&ID?gARiSFCSkQ%)L8)?bCN3A(flAZD42^1189PKN);#c^}D-(OB(!S=Yp7 z!ib!&QGj|5qitiaA0mBdn|E>lUg5(1H#YC&#@!ii2dN?Ck;p31FY<-lYN2G-3CHtu zi!)*6uHd>MFZD9u`Ut~hpFs2$9UePlmHM{nkbxhG<6L|*sPv8pC!n^JR>c?`ehA6`$-hjJbE9ND(;e*wX|S0bE0lQht&#jBxE#?N4hRzjwaSt0rx6b>rwd}SR~jEe3Zg!SOb#sSG9Kw21h zCxA?N{ypM>0%!`fbO<=VLy5RX_A|T7CIS@zd+ZnKz-B)r>W~ ztj|dPyipu6+SRLz6MgYgAUp)9XGai`Kn=5fUywXIm*A$HWU{cypD?c^AH#bVIz&8Z zR^b3!6xYNcKupm`PCq(UeovLPR4z0!h74Y&HIJk)SECGq;aimF&+$-(4k2Q;MU>I$ zA?OCjXyOcNCfadGn45Q8_^OwFEBl{!#(lxOY(FfhlbGe`!dmpsfFA!!KAxx_k-Yd z?!6wNE!pFvd+H%r{%~zFZA&BU)fEZ&k&aEzJ1L*lU3&iTlh8eq#O}s$<_-QC4}{;Q z0$YDB>iu?i-yWL$E)NpQWTJunNSx74&E3$+Y&*a45e2@P*--UBI`&GE|H z@cZ&SstFClvQ5UhIOJnj-pAr%XKn&(JAmzpzwyOyYX;kd)m%vuCxmpvan-zZEXUfs zInVH;=6%4Js-rEc?VxDJ@rQ)I8|L{7)v;>I9lp)ajyRn5Jv1u8rdwc(gJ|wZ&h0LA z%yLv1mS;svm8bLR{nhxmI{0Q}KD~dGJt4z4%RbkxDYN6swu_~W&czKN->P@Z(|<VtXg6?K`^XGkH00#lBIKo7k%J?w1%@4tm?wg( z7YFybDUhQ&Y28z^K5!}#f~SW79KJbrBNs-+8zN7A$4Qr0|I+xu!*&oFV@|f4EDzE4 zDvJsd=JvB8iR~R>#ILga#Z~-HiNyzuE(FQEez3SZS_Th=$gcqmIUd9do=C-#5;R>8 zo>yA7xpxRuqeQ!I%^$;376b5Ko_ore1+$ekbP=7TLuNr`UWwL$NA72b1xdCuhlT^8 zohx1}&K4-6N-VC`s!{hSmLoVy1zF`hqH++21KU}aKA3yy`q(Xy?6b8_sQ%bkALRzM z)TeNy;>B$Io=tiex`qjHD(4~luBfnj{wKjLTnCFS6s!O#C-wRiDI=OF@>G->t4_`F zU_I7YwAQ>`3a_a}rYGVcV1w;pF75IV2R+!ir;Q%w^-qwK6y<=HzZs@Y?+!~nY*D;` zLiPBjy0|90xFC?nUj-tnya19>A+-dD+oe9)$xGMv0$MeX03klLCx-07Y@Zq`ed3s& zWdyNB!)M_l7;WbZh+_m#vjAc=jW35e5^Q2qw_&H(as|{c#rCgWC1i#df6pM)O8Wa z;at}wr+XK^vTzcK;5f#=o#Njq5IB!CJj#f(<$KIU-tKUi^NRCuM&oiBpyZA`r_3|nmJpQFFq zk02PE;0}DmR=5C|)*shkj`k;o&kmEWC>p;%>zxkz46PT^+aG@X_lL`w#Ax z^*fH!h6&z{Z?xCDS{A zDHINbInH|_)mn%fx`zvGfqHblng=TsY`s92(vZI0{{clny1yV|b$(?-<7vUKMX5Ls zv=x0g@~jhmL9yJ$LS@-pdNd8$Y4?zw6_L=^e*jIRzndHIVGdyeB|iU4i3xwk7BdR{tJf4J3~}cUO@|3XfAZ!rp$07`j0UB6 zF)BjmsG@2_QFDhzC+4kUzn>v7LMN&ELjMBaF6nHB}FLQ8JY%n z$`X~ZR1|9K5W&)go(;H7Tn>`*HIPBz*nU3$4apf5_IpraEcfpf*|DB2Xw)i8b|sLV zLm4MQ4k)xux&+Vt!L|8hkEe=T^7wmK(4AZC2L;Kj!y0w0G_=z;Yb@$nGi<6&`m z0O8|dv2N@5cn}XqIQV#w@DT_cUK2V5_;?8M@i5@yp>?6dh>wRzQl9im%KNE%izt^A z5gu3ZD9~IRa?iEr#1P?;<<|(E$fAj^nZ4IIz2YLyU^yhfa)`llNPy)KgXMEBuq=AO z@{6zOV7cE5mQ?Jb=NMhrU=qZ{!0cRv%!odIH7j_qmRM zO{zEZ+~1I>4Px~Kiq#V(VzqzS_zRb6CLiQ5&?GOc2^C@L73p_!&$8~wg7;ZYCk5{@ zs_Yx%V8Ae801!C3CUgWUas)Bp zD0IRRkdzSvj$qAD$UbX_aqW}>_F0seCQ1bCvj83Bm35kLH56xF{&DfzCB!VBkVv2dQ| zh4XaFKse07xNzbb;mLtK=*^ctQqhE~CNG(v`IWw8j_XTiQ8wn_E4XA9%PyBcIzL_C z{Xt3Jsb%%=fbhA$*1GM9^JTkD?=M|*@YfiMdVkH>IcJ^DQ62MbR=lcZ)xPjkeW9wj z;!+t(%n0KzPiID`MKeN=2vO`r84v$dveQA$q!4@gs!R$Ged7NulfuG^nM?|=m6{Ze z32~Wxm49bU3a!5OfUv(kKr!R0Un*uKe)zrf|Ar=qkG(dt$zky2QYo5z-wOHX*k$cR z@#McsSQyh_VN8Pso&#eVEKtTnK>XZ7;ZuMC*1sxP7-RMybHRe-`$s;m@%^Nm??Is{ z3cf!pVs*YRvgeB6`w8K!06aS3!`Ww?=(8T6@z3Q%i*Xs_aTyasKgQ#7#s`P)cwG%W z^~Jl+Ar3uPfgWR3`-WyPU4(x!o#~>Me!M`0C>)}UOU_9g`nqPuIP>GHGGjcy=WR1% ze0b0QH)H&cnK51~HDgFjru~oK6*I;|zE+2@ztus_%fI}EnwK;+{^-YVo0;Q(P0noQ zxNvr6fL{K?nE-l@KR{mtZ9SLQ0Q$LqnH@kM>3j14EdXJ{7raMBr~?R_`$_>p!n=mw zXM85}={FDWzC>q<{-=G=fA!DY=zqhHbo9TC(ciOgU(QuR{DuL#v*2#Hyzd}^DsI^^bzN4zI=t+7xG*VyRbg-epS6>}QbPVl z`P1xT`_Yvxbi#yWm+>pY(8e_J%!g76gon%R?#r}HzK-v;bb1e|E4;NcW97K}j@^wG3|Ew+wztc%#GXpC1vgFjzav_@J9jtzCFyannNpW||i| zx=L5%T|YkXeq2QI)p`Z@jpXMe#J;L7gx&ikzLfticQSb~>2br=1$4fuLSDVd(#>Bv z{V}W@fsUxI864(T(XhCCd(63(ZS)fNIlBODmaiYX^?Zt%d zy5@HO;XCt=xIM>?%M0`H@=@S~;-7W-c#f^D6mCAsa}4J24aY7i&oTUb`Lcfbs8QyQ z(Usc!YVEyIdk<^xt&Trf>kfZsu*RM8H|E$AjP4y>86HF?$&(+K;|&H3d-2?^3UNA( z-0pklhfjn?a2ilp|I}oUX!Zt~u79K|+&?iXHpQm|f{x(N4YWBUJ1hoaa~F;5h!(V= zv#cL4mGnKHt0Te%)>H#^qBzVy9x#SH(m^&MczHx59(R5Mr%0d6i3=yhg^&}vGbx=0 zByZA3`Y#FA!ytJDH@#OobKY=f&CD2d$Z?3n>*k4}5ZmwX(r(z~$uST4?6H|{*$w+m zgQ4fuJ?7KnwQ$R90gPVgx*ZRefabz4Tj)Z@6UB>h8Y#TRuNeTKw||d0C;zy9?1z4- z@_1vog03Jf3g6BmU%od|9#%{5W2B=xK}GIb=hwF8P4{D7Txcs_Jh-*F>Z>n8fyIHx zcj6;F&y?EArQoitIN#C68$B)bCe$Zm-vy6#8vH^xIzXBZ^bd2Nm+v;qf^V zjmg~}$7MHgoc$5?!RKc({QQRa4Gip}z0HN^xtr-XJ3eJev~yDu7sNd_N8KqNc9wbD5>Ig_;?Q1wE!405#QVRBz1PxNy{dhWRybtjnbbjfV2U%dtRk-O-0P85 z-oKZoPPI!`!OJ~?9rm`M^gn!| zPQ8}1dn0zDGl#|HsXT#Sq#FlF3C1Zurhw^0V@CTKiIH$Y^^54)1!C&%6;t;dt*7V~ zS@qPH4ZRK{j91mJ+f4V0-a)_D{ql@2_sranU%GO>Ta%Jmel5r8X#bw0 zG)_mgTg{#NsHVu_xs4V^d7fdn*8T7D<`vObHJ9%0;JGAd-t3-N+#8?_xK1q2`mX3t zN0nHzLksSUl*k(K$ZXx@{jQE3?a*A@Tg!p@KxpCq(9zO6(|>NLm3d>Bj|53+>vX%1 z0Mp_7`z+^vr34uK{GW~hgP(tJMRR?h&F$4we4L0JTSr8#aD=s)$G_RjuP!0Xshmjxnj{cq`jWq+jp{;t@6aL z`fA(J{jJTcbB2u)0C7-PM~pI8X-9Tm=DU=B@trvSHB{aF6sIpFmz-`X#FhY%)mOz9 z87+e~^YH=U#g;;D$z)66i6zhlk1oN>Yge}{`*Bm@jpo8@;n6qdG{b;?r3Zjv-%oQl zt@?h|&5e-nS1pCtHWprOy0YL*xc@s9;Wg*8FNX&nT>^4UatQ!&Yze3Y$t7mXKyFEG z%fJ&$R>Cx1jdjDn@W8x6bP@kraxEEZziCuk27*A<%^ML6&(FtmG;`=qiJw8%`5$`h z7vCAe1jTz0q#)!whWe`@!=7PmYTDk^VurSEeQ@hq^TB-1OvlY`t2>?TGiz(?WkH!< zPZzN>*+eQAH{+2+(u$dhlxasJsa5TEBGs9++Ot+97E5F)@3wS48?{XMw4ynrYNc}U ze~oQMl9;Z~%-dFMky&p-Fl0A<%Il6G*<07H#ca`ZcP4Auwk*6ik?S(8Y&M;RsF-Ee z#Dd=Z@oc2CJ!Zv|5vT!BktEXD_CzX?6O_2ASf}>5-QLlcv+T8Ii)~rE%yi0(S#~aw zisTaTE=umOq7kS(RH_boEpA)6yH@V5NhWs(J>^5UW}s)|kjw6~b5=LhAe+r+a#rk~ zpig_DmHE_c+sU!Hw23u0v8mnA#qg5uHq+jMgGO&Qk+ZUIzF~SjTeInoNJp{{%R#=e zGZ7eSpd-qyv4gJkPF<-M_@brcKZnEFos~B%l{lG{(@X zTo!l%+6+?z`b&&DPbZ07IQzMzXkXDqM(M~}!AM^ya-b~o;Rzi+w zS0o#WLWrx_MP@@ogVVo?2clh8beEm)He-=oq%6OB_sAcwcVJLP44yV)fIx~`k zM@Eiv)~d%uUL3m5%0+u)8aH=ZxsHf!1!s%z7NL?0-&<`fA4{9v=~yD($1Pc0V=p#i zY0EZoB&^*DXd;r}mB6WW!*uz9y&@(IMLp%0%|$x7E}aPU8%9Pl87mc|&TTNw=A0R2 zKIpKRbi#^Jak9L(q#$27{TUFn7}}>4st}3d6;v+ZngE+ih3))jG(ax z&^{5fc+VP=6HzmnNbN#~ zZRLyA#ETu{4FP}>6hC%O+P{X6Utek(!l66jl9;$n;FJsl=pb^B>$O2~9u9oI4 z4+Lj!mzHj(_Q|9jNodpzX=c|CdTMun=-6d@HlgHqh}X-6z!XOfY=c3jMF z4bE!aaMnKz?~3>^FY+!dge3R&bt}&Etdw_r@PoJAA;f_)cCewgayda&$+o>(yR3GkSIQ2E$EIUL6ojdG*}I0Cfy4|gT0*3TFdH8 z5En%Mb~~A4`R;DQg?dq7Ill1lm8*KQlUI0J=;C*2%VsRsn|~H~Mq@u+cY63$Zy2&n zBx@rXkOHK{3;wTD6aJ_^6fWIJAm&?x(-%; zf-4J%LEX9|xo8*b+xch|*2Z`qnW;CM_Oc_(Af_4GozS=$bAJP&L zz_6McRC!#IK-@#8RwIOYn`s5kfx2qRI-7ba54cJxUrxeHr&bc;yc^YmJ-f2Xl@s%$ z<0%XOc3?lg1?}4HrQ<1UOTN1U5C*cv@)?k;5H6|D&3HNw94cABNtb}NxfaBs$Mcq% z$B*S^Cp?yMQo(;_J+P;pBS{!m@Wfx~K7X^Lhs|KK1>+wAF6tG%43o>z6pAA(@ zN(&aPZ7AUPz%0h5IrD9MI_IQADo_g?UO|a+-uXf9C=Xc@$hA5E7}=^sSW6X19ORP5EV>7kT}A9Drz};F{mt1b|wvSN)oL;kO2fZ)Cu4X;m)a6t_z#g4c)F; z>p%sxDMnBvjKq*ERFV`I7^DOhlIzObfE>wqJt)2w>F5n*a7cEGXdN*I2^c6ll&lvI z<*ht(4-QN$5zQylc{|ysXPK4UiV_-hL;|Eq+iHh40QCCk?XB5#lyr65Q>mHOd8Wwv zD~SKeqy^=w0bOghp&=7zQbv}bR=9^F*%U;sHHE;~Ni~OVDdm$o%+3Zfxn`|Eg2ZGA z+jjN4qPx+GNAgLj$#*AG2@nj31E2(`62oB~h17R5{A2e4AX_<&e{ z8yAq<8*Z!bL}l~Vm8FqUlT@OusG&-muKX7_+r2kxV8sW=lHX*#(5x zXE>lyQfx?PI~(%5?#8mVBU3`_IzA9r+w7 zyug(!(pju08vq~((1gTN7$z&*ZDX_X`vMp*SaDN6v z?Jkr{`zXsMtiv`@2XhnR6fL3aObc`f>?+YCx7Hb;Mbv_f1NF=bk#!kVt`C?h=Ol#T z^0w1yPE6Vix`2&Uv*5o<^QkoApZx27%w%u&n@`(9x)7Gs`Ted&4 zj`SKd=2<-!(@As#(4xW<$z~&|Tp#oV;7(}khA?Dky0^KddHW-%{cLL9z9qD6o4M)1 zt!9(i+O&0h^Mh z$+Aiiz>Y(OhdB+?ZBWKDWm<8mZiv1bJ>>EXEH}|~Dh~DF<$$7uBIhU#X#ItlZUiw< zt1O&apo%lPpl+E;_p(5U^j-E$$D$`y5tVKu=&Hz=&~Ti_IFYEpKCT9-444kE64qij zEg?odC~GR)xK_xe)J~_)jav0GO}F7PfJf0gy6}vRF{m(*aT+k}B3r(c&Id_0jU#U1XpFPG5z2S-EuD z7m3wBPOF0t{m0d^;gepc+ii755dHK5C_SlNvn!w^y;H!gssP*71gHO{2s_KRl*>0$ zo1F1RJ-4)wZXx6b^>hwVwMdlo6EJ$zs?Q?{K^5O26`+$|u9J@9wH*evUU|~Vs!4jO zT`(h4{&YLF@;fC%U9sz9K zfu>2ez^xL`TX7e|WPAOG1U@}xeyH98JhG{N(j*3wyG`aJ`!S%(fVLk0zdI0MBoUuF zlB)9SJIwW@S+(N`QGUYNr=rs(qx~gX?-eP&$c}~5QwEyO95OWyDYEKoRg4N z(UXXnTQ+Ue^4l5E&n=l9Rvqjc4rCfZPRF{UOo!Tn1%z{KhsQWte_29Pi34TRnYA(Q zvSm!aIe?_uwk|haH8n3N>$}k>oij4FO1H@;o!Xa`X(8PXpLFG#Mg5>OXq69zKo!dE zk0g5|eRe&>XzBHIq6)O!vj(SI0v)a1DOYKHPQgNl(Ud{j&T}jZP>&?dw?KgS0zO4) zFfUm|!&ry!U6{jcFY~bah$85-Oe;Yr^q(syd{BU=mDHba)TX4R(%7`gAi^MGdtjI}FU$M2Ng=>q9kjhDs&2job zT<#5b@cvC+0CG3&b$8>AwPT0S(?_o|ecYX1NQS|ZbhbO4%{FL@+U&4U^i=WV)jRTDMHt zM)PdgLg+6oOY#wIu>>S>&?}mE;6_g#zyncUtYfyDq*@f2{WX#>AK9j_W~4CjLw?sz ztlO+=xYlrUJr48T0ov-|{IsQ@ZM?3Kb1Q*Lvs|KRJ}Pq)k~Enlt&|~C=M%AGH58>LUdI?erw=Ii&(x?^ALH0avhM7 zawYC0J(5ArtFhE4Qt@;^wvwk6irqPuHcCbo>62Ow4OS8XZ_-hB$~dzlLZF~07RmG^ zy!*v%!t7KXp#XAwG~H!A>os==+H6aGIBE}0w|o0cAvCZ?j|*x_nmVaID1)yTG8@sM z_Y&KoX>Q18v#<=qpxLZ+*2Fdkr<2#}Kw1M>xo>8XtxgmC@ADVkc>d5D90){`IV+3X z3O$y|z>1rxa^>cJ0(p~_M`#yr+Nn=rW(F?A4(_mEF42l6R|eY0gQ`jSbfu|;Qyy$PPA@Sxu%P8* zLf{gEj?qN3QwtPOq=Z}%l{D8XJe<~Nz-QCA#E->$JjvP^jLZqy1UhaSBk$fpwumbLrx-kn_FgQfd=K1+^S&r_Z14A{nd zyY*(%y$^2P-n`{L-b>h?Hc1lIcXf3KM>5uXE6qYJ8gS(*=xcwU&QEnimM!-sn{_5x zxa!>7bN=>yx4SPotVDWT+8YkN5OA8*>Z&i$vnrejfY@Nxchu2zrvEq6|C{Ll9caMQ z)C~I6_6vQLnz~@Urd{HMaT^cCk|_5#o8y{kMa%{8#`LtVKb;m`;wVu~*dCCCnK4Q;`(6v8}bGc|+6o(6mliL1-c@@v{mQ zE?6$-DtE4ih80kags2mKH<(6^ur5yCspFG`cyJuzena0hkDAap&bt%)rI&PPGR*-|6K-OZbC4LFxl zmXgESKh ztqskVZ|HV+!($XD0ot)ACF zW`!bw)=#P>$<;@EB?+~Rm`YNppD3!CLxn|)6)i`dHlRBbI0hwlD~}3E4VT?46r-RK z)ckQe^1v0E#0fHPxhVosq#37SJ%z57I)EzMO&B^DH&tDf9ivUmWwh}`c9%w?9p%nC zrJgCH%Sv~lVl{UaO7fXyx(or3OZP9yr)a0m$;SN)nPEv5Q&xC^5lKz0R2_sQ6L!=} zCL<{;owqe=%(^A}a<<}kIYK(W>!={*y2%h-MPO8mXQOy_iRX}b4vXiwcploo&ylCy z&&JP+^y0Z!JgdcXLZllOPwyX{qf%=gS{U5%e9osd0Xi461;$X{=%nkV&-rQ5ZcnDu zyYiWKS{h|MnJiuYBkuf27oC}L$lK{mnmgX(=xpEth&xFPZ>PHPfrvB-lvq`9R0clW z)I{B=qPM}fIC3HCk9^(E_ITg+Y4PoVWB&1i<(ziG0;f{rx2D#qKeF887;DovyqU4SyMuR^O9NXb38CX z%0P|{2cl>)v1q=}p#LvLtrnmyVs3k=t!Z0$(>C2rRX996oK3s6+jQ3Bkg8mzsYR_I zH{RZ`((Fid)+3KcQa);4L{|z)(@kJED`$wHq5F4ICO&VYD(Y1r(a~BG4Fb`!3GEW^ z5;U%}9tX=1fJ#m{&uOLIUTSyrs~?qBho`NgU0h%G0@6A_dJd7*w^>%guf61kr}@v4 zvDc@s*l8)D+_Zwe{>OgiC3G?@@sAHGJC4c_ce&e@QeuBT^5%?~yz120Wm!s?6arFw zk*Wp~#a+gd15_e?laDGdJ#(<{ZKZGXe$G`o2z&YqJz_{>f(c^L`PDM<+%gQB}K z>r4>1Hm?TTg-^UQ9~L@@sc#`q{N`o5UC&ECVIDs=ftu1 z2+PJ~RtXyS!79;ZWi9bpldb_hszX{3U|eW{HMVDg2r~Rf@~K^BB#wyBTRaAvunZv! z#*A7c^x!4~cX=|PAgJOJDHzX4j4fI#Vph+JR6dzBwmsOkbwjAVwP|~JOVj3%Q6Du{ zbR<$M>@K6uxNAGe^2S}8P@y*#8I6XLr=;W=1EtE>0BUri3X1xWL1s4thsvND8PP5X zH&W?z#wB^tgn+?9(-%EibV{L7ha!b63eob-%7E|<-%<28R|MM08%vTAU(D|OP9(*< zL)gjY`UX`_yyev!73`#^;>9OQV+QI#2H8QNr>v;K=WdNihn-I5b0DziA~~A9)HVy& zGXoZ|ZsV3)j3=Hj0`i`TZGEX+WH$?eYt4{g26FHKu3Wl&X`Q*Wekn>zOYegBPT(aN z`{0|&x3ng@)bTTO<#&0kVl@+t08SQfddaqCPO`1ojw8NJN9l9}&JfLKvy{$*-gM-; z4TG9fs%V{>A=Ef07@Op*i)HE7q>*Nc51*bMWd)d;UuOV$Oo-#9ujOE%4Dw8gr&hBcT zMLMF#+hADTV7YX?kwh+&h`EaPEthX8$mO#sOQ$)Te$hBvI}WbGmd0^n#qhr<{?~#3 zCGkI-CtF6$mljla=o~DaCx|E0y>+yWhi{lNOHJ@2)fJ>&)fL#Qh19L|51mDeh>nwen)N2V%SwqOdSM6^(yOGC;My0b}H{4ofT9ps!^^5@apQ3!`?|} z(0hvP0gD$2=BZumOK%HW?NPuX6;gI>a2E5)D;YbkdZqY{a@1_r4ViAH^}y%e1@aPZ z*RD{SAw7z;dh)C6XUDbwD*2?$ILw%@aTep}QcgBQ14YPMIaRRHXfi_IF!F^k?R>P$ zwS%t4Wfu8sl&vhH>r+1YH~8k)&u3v&ow~XWzT~}9Hu?8QQoO8oJ5+^zbQa}EqnO79 z6P3dp9#;*{l8){_A#2Lofn%O9sv4W@wFxlPVs8Derf9KV=I~^^}7^AiygbXL*>5DS*H>xI_ zoWBu@T=mSSBH6xn&^pmBPgBHIo~VcIsi*U;67aX(*WHdPl6Y8PelY;L5_P=Alh##dDzMq{W~B{iy!Qt^vHmaFXHGJB+O&EHJe6-7FlFyO zGCDTdWJX4I_TC&E^KfwNgp7;`kr5f$h3tgv88WiT&ZuN7GQQ^+jsJMx_xpao@BG~7 zd7k^ZuIs+`b=~&?fpdT$c5b#1SCET4%nbsvbK?NPTtOCKO9wa<47UXV??7;8uq6bJ zg@lBp2?1MytnHu>C$J-g1LWrI3;}_itU!)1E8x+>-3??72HskM++ZMA1S~+y5$tAZ z3v#!!!um&ij#K1QDgexXCSr3+1o)`J+&~Z~n7fTF;-#IF2N-H+1p>R;xI03e+~B|r zhzSm|f_T_jLO{-Nh`SZ+bXj1^+Rn+&%?{=SqGy8BpHce{d~qO{I%Ur0zcJ?swuiZ5 z{V()55X8>(hQRqpvcJ)_bNWeF#|h%)46$@W00QuKPBtJ*Td*q_m~lOo`oGBfo8JCV zmX$ZasGa2*-Z_nbQkCq*>XtA^M?e4$kf*I3z@sJD31opVA_(FIv2=F>TL5$b3BVv{ zI|yI`m^BD)3xPsGa7$M^XSWNr|0_RmZ%05lhks>7>tEjkX19ZbYycesDgnF~U`bFw zfL{P);q3;2(_QEh&_4q5+;I>#2Do*1a&UrqI)U8bkaLC0|BrC$f8_%X$P06aS|PLo z2#<&&YnUrw&@*_<3*P`)oVh=OGQufN9pabCf5BP)k8sw1!kydcLgByQ;D5rMD;x`n z3j|WM0jMHeiwU8xU(djU1r%oKfb`SlkU&h9ASM`yNkjyG{^f+k^2h|J z3~+Bi39eu#8weJX3WDjsPyckSpRDLO!QGvmVXmj%j>t4jmH;+_YhcMgkdxWso1b01&#%z)>+(6A*06`uOIDi?{4t^RrdQzIIimLLW zAQcBYILsP|GBNKUCa)prccVw6o1nWHIz+vvLK=!q=a|N^l#4rRX_jX(muAeN@|0X?< z9^FpAxZo~uTY3(xGYaPlIFsjWL3)Jk=|R6UgAf6*7~BqsP6Xb?lHO+&vCb0^NXpT| z&c+?)4*!d4&+K53^2`DXq=H32rp^Nyx@DgWNm<3R?ya6dJ!3e6}Fn1PL!~zI|A_Veug#mX6!4b%a zh5k_bKWm%oVja1k#U17hSRBF9S*=BI^K(%q_yuFic1{SgFc1{6s;4c0g9t?gGk@Z8 zfS^F(yr^_QQavqmKjqW<3ouZpSr8LI>j4BCz@wWtBF=tkh65z4ru?h-K!l>ZE94hF zI6&cNg#I&2{~*ra`1rLT$QBI$#S4(DPhIFVStGJGCqJK%ppYoyTNtqHU+K8H{=EwV zTO%s}Ka2N!zxNNEpUd^T08CauCHwjLBO#qXU#xUChiimn0%E!bg<5f+egh?vAGk0v zo%x%h+AVoKMO7_BkR8m@4SK#J2k1O^o_ZS$B+LU8Zm7GX(}f0q&y!AICm0+GfjIw` zC;|TkS{^tMIJO9*U?KhS*^sz(nzaxiaq54+dgFhw+JEpr0QbLppXNUR|C4r4>&s~+ zVS;lbCN$h3?q{2UTVP8>OaT!LBnvBdM`tAQfB#%adb*f}yS4S{h6X{36|uxAho@~d z=S_sFfw+a7&#=PT*pQIioq$Hk8KFUdL2FmA4WbkMR|-D?ekXDI0qkJ;&qV%?gP`OH z28?$$b4ubjE>2sm3+%t~{7=Y8e~|;&wK@C)C%>WnAA?199)jE1xY+^4AHf|r@NmYZHSC|_T+s=T)z#hkygvd60}Qz#Dm;)nZS0)D&{JoD zd&AuzjlgTOYY?g|4u#qQU>@n_yR!w>~2!yym{pi=OpD{6SowI-5a{gCTgg?2tyEdWC^dC*GZE z84uX`{BFjZ;vgrGm^erT>%Xjbeq_V(p9x&x|Ly`8oSw~rFcFhjf06G$xXi!8{WC|x zKRMzR!1{^z(}gaW`DLs>`2Gp!?gVT)U^Y&6h;(oZt z?Y!y#g@3M%b4mUi<{2K4!hdB<&}qK^#R%}`0@2zP=J;p+{|AdA{h>{yU$P_da`AET zBVqpC2M{?8^LG=RPH6p9B?u0Io*ozc3;-k!(7ym6T|@@b?}35z_ozTRjR+)689Pga zbYNiT@oQ~W*m;Bjq@5v_cGh+XP`Qh#U#tCF5QCgyo)A}OOAf@Lyen|A0}Eb1&pTGY zisvr*^A>PO5I^5-4iK*(@Fjd32xN$xB|r#J|L^mlvsq4k3rl+>FCT<&0e3&$?~G~0 z`=68nC?qdoL8NnrkPwU@fn6OD!_C&+(E{m|!?SomQ2c-QhVwj)VCakyUXHWtSx!8= zKTW28%cK7R9&lr%vlNPn$$EC!basRcG#gGAc4FfI{mQI==Ff9Oih=+w08p-ur(dU{ zbNtHdKz;t*93U|K)U^7BAgezegbM`HwuPMI{q-fl;`tH#Pq#r(0$;2Ha)!8C0(Bm2 z^Ygg*ti?qjpZ=nQfJR7qzK^{)F#%GN`}xv;T@z^K0rvxz1S|o+Sm*3O#uWr{aR);I za_2`MzZN@HmoTpg-`QU90uMkr+bSZ?m)*`tgQ4)#lP^q6gfpD#^mJze0RgUcj%Rz; zxC7jupSSUuI-QFH+_CeSvO2NzvT!_r-tD8#rRL{ z|E?P^pL2y=)T95V7ZB+GRwG#dDBndM_&M`0dic!^f2o8AB=(zJh)T!9^Dp>kjW>W} zjX2FgI3pC%86)Bu{2zV%U+7)@aP!Z6BNECVh4UiKoqsx|p@=gbFR+`N>uK|kIL`Qa z=5o3RLA(OC6~DF^XP8hM$OYON{5kf2K|_+(kw^FdqK`&&?WZKn>`s>hD4Lx`4C%+)0}^{DdPa0)zj00`H%P)Xn=J3 ze@y)5a~Ee(2+f_*JMFvd;D4Tx{-M0n-DEW{OhZ~>E&PbZFct4*{h zpofeMjI+D52^16*3=9kc0s;^SBq=HR*Y%UQBcx+xgk1W5G*;$JR<0T~>xyg=ZW?3< zN<11irGAn09DNMgD2S*&gqN}9E{=|yNxkcF>2yFI+Ej|$W=d0&UCQEp`TF(tr%m`h znK+Cvj#bX*!EQ=Z1trE4Vf!AM8aI<1+j;XlSuU4!_!~5AW6!qB$L0-dSiVKGVPhi+ z!Ft6aOh?6a=*Xc$j4Q0A4ab7iV%d9ebv54$;c$JFxzh0Lw)K^K=Lff&voxR`lq-)0 z7}1hPLIm)3oHOhR$eOY#F`z=U%AN`=m31Z8%W$>eECc3MZ@?t#b zDrN7i5fKR~85ub_1?3eK3<@43B!Sab6A3B#>(L3}`q9ZvVAud71{kk_u?@_>1V$q; z27oaSjL#cKCu*BVC+WY9qTjCnzlSI=j)Z*l4Ur5CO<0akqJg2rdNzIl_wRtKA=~lE zsKoIJf#mT?;rS4eK0fgRM#rt=6Quv}N#H^ErEG@lOE}+os`_KD_nq%@wpq%$oAom zOc{s|yeQ-uXBI`8)(FrT?IZ*DH&pIa&@r@@>n1<0>BG-?Q=L|Qi4`LZ)vRnBr=4*X zyEN1n#!aYftN(%q+$7FvT@@oW<$>lhiChO7Ou9xeydEA>>Tac@mKbRGPwFqJ$RF(> z7cV!shg-pQ!}!gsB4|w`D5!d^s=VO|&V1G7CxfMKBJ#tZUV08bC1svO2_l<<6Jc8} z1mCcVziID?n{R0EgWZR>`1Axbj-?n0t27P$u1p;M#$XmksO=Uq?Qt`jor#{sw{9Cq zfQulMav9CR$%AU>c$WQrxS`JkL66c08`#Y2{r&a&hqvlqkq%l&{>DREn{Oksi@cTAZI>*b!(WkGWv6seYV^BJ8PoBZ{MPQ2dr zc5;#B;O;9y)^!mi{ADm6SN z@u{9KW-q-XOjU)G@^J7GZvF7bSL;*0bTgCKLxb<{OV1B&elP!E>l8F`wU?~^o)Pow zy*bYkn5X(RRfa-`}4&fMxrjWM1=F8D9r+N40}c zRGZ5$i-4JJ^1hLo_p8X;DNcGi-Bhw4D4sGL8Mnrsk=(d3CZttdSJ0MLJMG_BCck=8 z$wR&M=1oL%&0C(ha;@B~3Px1H{+c+n(Ox#aY3&A^aRx3Q>+)(PaO)*1Ta$Qp*fpVg z?262XI4x8&sD@GNmpBpeFU3nm8E7HM*P_MAj?xCTlHKvVdq2-mw%s0LB95&^@w)_dn2uSZhrV4cxoE|R56q0!1D z>V)7RRD&d{K#BsSl*t3mk|*7Q1tun*OVm*4$&7^5P#T_L?=!~W#|xzCks!IUJg{d$ zeeT@K=5qh`3S-c83#6=V;(4)&$>(%A8P*;LnB9@HN3jF1$hzS*5C zzZ z7I{8Bf`YCmkKg>L?%K;a#-gwN5*3_5MCs5n%=<4G6}mo=YW1_p`Telg zyRK9Ol9zuwDd+}PK@xq}K_zBbcQJvQ$+{UHbVsgNV%#wjui5Puk>U0w2B}X?&d{a+ zDbF$aQNcvCCC-O!l}I_k!BlluBBWf5Y7K3ZRy=Qwk3$V<)i_Db`~-1QIjLAaP$S(W zLP~nA#T%3nV^REIK&$c*S=-JBy`A;e_`K%z;e_$M)jIUz{3z;I4%57;*VeCvta&@U zEmUxR52G^q&UH<0ZccF8Is?7U-%@);n;x>Q@^QQDQg(9zl}&6g4|7I3TXk{U;(q${ zk!a8M$ep8=zB-43fFr}Q(JSVh6?Xd_Gz5d> zd_2ocELBGjy78Ch274-d_M?JFXO)N&UScyuRdqUNJPnts4VE)uxQq@JzS1f|${T`* z$10tqW^=hf+pqD!TjyT4h4R%l;d`b#3`tM(@XDtWNS{+7X@4~2RXa?!uoxZF@_t9I zHm9iTccA{5bM(#-b&mycL=>lHZNl}~mD;QQ;~8jQw*5?tnj!K|u?kS`3@!H+K_bxt zbW8?&ZAJ`shy>xHcV0q{LS3{qRctoPwTL&fb=_N;QT?ASrjHsK)|bZL%+-+`_UGYB z1Vu3WmBmWDX6$$VPTFmELvBgh$MeXj(g8BHW9Zi=gsJt_Ls;QkX)$K?MmkX@e~(0j z>k(rdBL0Q!n~|M{f-f7?%Uznv$3*|!+>KV|8-)@=riNOrL5vrDV*r07BoTLRT?fZ% z{|cs7+!zKHXBw8cyfL=Jhv9B@`*unR2 zYKk_BLDVma>yw)b!tSOD3ARiKAQw z>S$^Gf*q{Uv}!&ynhRNYV`Wuynch0eZq^3WJ*q&SNvf!NRqM95d#uu-<+NHiCbjCL zSBA%x>*GsaTT+y!iF|NN-F8#k<`Tco%{q5I z%#l~Rk&WNAYM+a0&Xf465Bt??tcc7T&S-&*?yp%Jl!j*OUyuE4a`^|Fv7s!?)RDW$ zEPzU2?v=~8*{^-2^W!=21>qgkEpmli^59G>-eC>uexc^zJPbk*B0lw zSKf!MtwspG`25D$?$bs!@lnU%z+oCR@wfm@=Y)gc$^n(n*bnK}w0-wtw=N0vGt*QWt_t(*%tl$?=lALotNI5Twxp}I5ur#iBE0yyEf6T zC`r-LqpR2aL+o+Ov%vRFk5>pA^IxiTr?*7|mg?%S z(+^xKp$!OdZp*wT;InkkUhpzUc@^QOkWu85ef3!0^VGhu4juy#GE z{`7ysZ0f22v_MP0A9P|q|N63$NH5VMnr~xTXv)li>9z3a({MrV924! zqty)~N*~7TxA;A0W_1ZH_0#nz)em@bR!Gtb4qUz$N_RHinJLQau(^fd>dp*%*X!(G z^q7=_kn_i@Y>Bjficpr7zAMtv@Mndf_L44nAB>wX`7(?;A5v7>+`#Hb3N5n}R_Des z`;s`nVGt6U_)&Zy^gg6wR`i3RT6CWTE5GM`g2hh@p8A@&V{4MO4I1Awzq4<&rY9;~ z-t5t|`Z z4q0v{B(5)>xE9lNF<$EIyAQ^AY= z9cLzAg|?<|Gxy8PqvP;uE;$?W6zxmSEMICBHe9B;mAiNX_9u0gWi3-PBpmiTg5Hzc z3O2doM|gJ&nJgBo&lyXeXsa?Mt?a?W9u$+U3z2=73`BX#aMEU-mrnA_(b)%Y zON{w%R2i(94t&%p@l%%{ru=dOrMqE)DHl4iyvo-Z`0%0gP}&-6>ApscneJksD6hU~ z5N34Vk`w<`jHdgzj=7?h*>jR_n(iN>a@ zea7XGZ0qRi`aki`ghlIG@__e8=uy(_pS;O^gFe=T+#u*wQKW^5LHb11mF9%)T@K;> zJFnd4I`DhP2_EIw7haPiq!ecG$O&+_ZXY8+_Ax&$?sHA)g1@ET%+`}npja;uDLU#g zC6q<`s^Vc8zWFYSS!QZQ>bsSOH~0Q^+Bm6+Qf94&ktd&5+xN>OGi9+Y@HQyX?UXa? zHB!VT1zCaxk{>0gA9Hafzt(0xoL)&IaxsbYB%8bbj!UrMg<=Gu?2^P~(7m8qkJ#A- z;yq)dBZF1Nq?h!{Yms(8Z?>DtIQYwX;gSR*hoPM&p zhB}Ri{}MKHadWLkpMIYV`NrIUUFYc8&Wv5jXo4wFS<`K29v2G&+)RoRB|_eQPvo_Y zw$j#^@8Ei#hJi%&z`(>=bH4fjllfNA70oqC7HMAd$6FLg`ScbU>yK_X4&IuIQQzL( zaAb&9zZRFvLmuQqki)O#oV38!Kcj_IGLORD)Kr0%d1&Q}Tsx!#zTX-yb=@t44l{e= zo+`=q9K6k{bkkjBpeIMjic41J| z-`3xEiG#3V^V28OYh4XLh8Ky96346-m5&+(zyB0Q9Aqmjx}dWnd5cKjj)7aD^77N~ zsg@b6OD)SueOVLTeZ<0dmf)x_Qr}BcRhIi>+r{B<7F63bw?kDY`6R zKbqw_aonQzmVV*L2Ro?oxeG(+75!T^DxQ4FN2Z$DoQzuwPjMejM-7xg#lH_~tOdG~ znYR+ayyNuUqI`Pb(!+PS^kROD(#XZ8^K!JFfp;F2 zES1tH-;dl{VD6TFE4QafW-T)>f#%I8n|m`5+J0HG_XOMHOvv0A z+&mPw@ka1&u~hLBu%HcO;8}lhc58ppXp)=IfA2n{dHxb*$)KDm(hp|K0jS3uSe9(6 zRH7;cnQSDN@a-N+=0XCSOR}I-Q;DutLOP2xbCtZxUe7X?+{aKMU6H(yC4!D>L3^8% z`?t`W^@j8$myd+*3WX+$h8BNAPjnrvWHEXb_Kl9bPaeZ_iv**CAe%0a)6EFozSY%6 zZ>U)Qqg5!&SjACjI?B-Uv*BB>KoI*;no0ssLsSuR8`6(L!#O>AEACa_UbdwtKAK!1 zU3F-3AF8b#j>CRbSxlw+nEHjyF5Mj(9qaDv0!CM|Amh&?P#1kRae&n#{ z2qCP|Wzxm+mvu1k-wj{YeOw{JA+Q~es`D;++})RLgH&oiq7qFpYxqXe^^n)BG#`V% z+sL*ks4^YvKSEVrsfD-*H?;|dt>j?ObPTb=zE+Sn#FJ>^zj1?I1#5qJsc?PPpD#YI zk80-$ZDck@aZW3f-;9;TyFC=M>1&K@PM2l+>%A8f@zjH#o2Xw`So79)7r(s27j-Qj z|LI=E8_t=bfTJ9@4wXofgH$RRFAhFN*+YfkOUmFy3F9}dQD5S-OT@mSe2eU`dW(qv zocG4v*qNOw#jf%9$)sab%42)gX%-Ads(Dap90Rq!bZX$USTm$#wrq6R-)U_2oF-1I za|UCH4wva}rd%4id~+b8GbW2xRlr#~BuY{~i8YQ&>;7EyFazIv+P#2~buF!N#v?kF zXZl-&cC*bSZnA_54WBKiL{v)xwggcN(c?xodc?D>l#)D!?}6mSQ$ymxdhAQP0}llX zt{8=$d_LCB0;w|#fnIUGXz1kIh_Gk;jKbO^A@guotq8^jNXjT8dvDq(jKxKJhA}Y%iyF z&=h!Gjd%PF;~|db)#cvBRiGvuu&0|gxUoQ($|a~8RG9?oJ{4nXcUXd?%XwhsH_5sTTK(um;X{UJuk6I zDioEs_{j7Jw-^VkAo+yfg04@{KbYFS;+oSjU-X-2`%Sp?*jCeijc*G-$-(@qqDIxq zV_Z|$ji$cd`QRLO)b+1aHth^)*ZUO_Lgj)E*&LG zP@LK>vn27&Fuu@g&bdkWo=br_Y0hK}H?ovg+=<^_>2FLJ@GHBdHwiXPwbU@W z*B*$jWV;d9)639@P7#~D_eQ!+oR~+WwrT;_8Sg!Y;|nD1TvXRaP)26z=L*^tLc-pP ziG~J{@fE0V;xl9K2=r(sse+@@4jisEoblA!BVV;;!9j6&iRV}DJAKpFtnG0h6}^~b~;3`g-sgv+IWr)d;rm%?68 zCO=S8y3M;NJo8HGbCB=;De2A5{*$0-|L~%15MiZ{JN5RU7KRazKm2H@f`r zd6=0j%0YKaCR-wgTT0XZfWlKge^JbeiB%nci*a>}4lJAkJFg_}o)@i)i1@F-_RM7? zOiz4zWrdfRQEexWTUb+6px^T0&Ac`n)ph>&vPq9s&789jw9zlQ*=KY#f=9t7cO=wT zofY=prB2)UBo;I+M@emH-51pTP#qg*SH2{$Q-Fse`ON!S!62_T&A8lFKudAU_0Dlf z&7NNd-Vr8R-13|d%a?@MRFOA*tbA|nDp~3Ekr{N3qiMEo+#m~inv3IDNQ8a`>xZZ2 zp_(s~;h=S|gSBH#?}`=;hOxeVag%gly1U}8h-Qvu{!%ds-kpj=iN1yh$x`f8_|@4UKI z{QE`Ng1fzjOv$t%KiMtGNtSQ73-8h1SoD0(6E`4q?apiv9gZCC)fYjpNv4<>@vf7^ zpx!EbwK~jjdHz{Q+IOXjYun;P*}YFj3EJ0OqNY$KMMhnh`tw8ytO`}C_N#J2Ro)EJ zwFJ2@dWKz+{`BY*+%);=@JHpU2O9ECoININ)Ly!#HG8)E{?e8Y$7j5)R~%dkRRb>> zR10Eq(Y_#V=e|l&8Xn6`rp&|%{!}d#K8YiCe3!l7_DlNYRi#T!-|kes4fr6u!$J{x zqFzt|XbOdaVAxl)nojo5r43OYFZAk~GeB3iK9PmV&4IZl ze}rF!Z5+RzduQOQ)5bN?In(~xcc@h5arS;K-OGnGb(Pi}81;k^_XDcb_#QN^zKmrX zqk3ZMC+5+)9(K1uk<>=dD-#Nu=GF|QN-@}YgLaD|vP=PX%}AJKYMo!*$Ca)6b~}CF zngX>g>mm8ohhW@q4Z~;wluqwo$WM$-&B-@k@89ma<#G4hVtLnL9I5uw9md%;oIuQ{ zGH!1Y_y<9elMC^og|b&(V+RzM`7-n8$CHOt zxr*x(pPXATQQ6BaFE%kMaG^xTVq=u-Pjp!#&E`3N?E4E6cXo?gInk?dBqhih-NZI7$8XSU zE#S4Ygoap*1wNF(^=~ENNgAAS&gRKU=_!YhX;5{!B%*)3Za;=c1p}PtV*hn@7bx;u69y4#_Cero2Ze#)Egj0P2nSoAT1;U zjkELC`d0E1mgowm-Ru;+zBM4R`CU!I=z5{>Pz|53pGVp?)0arsb}Sb-@2uVB9H6se zBw;^btY4;N;I#{7NXgN)@YwIPm=a)zXw_Ci_B{)sVt4tV38e!LloDzV<=YG1ao6s8 zi!7!2RoNo>QD;+nju(e|!Y!w@lT^@c2H*(f4uuXLnoOJj$cgd$U#aP}S; zKD%XQh!NeXz^bdO5cs504VQ#nEpLoZ&SJ1ou9H?xNqkMj1qe*2m{p4a&{ckqf zx0!YHwA=@;>8}AuO+yDg(u9=+oxY)-AON5Bu|pC z4^MiW%M?-RUmJ0?Tt6yCygf>Eb0+xYhg7hR(6gY4*J44=?h_$5v}8hJ)AIsp2}J@c zK7by$jMhJxq%w)re%umyYyeA}4%kd{QzlCO(Hxnqf%iBj9tAt*X6H&`shme5Rm5gR z05`1S+CpS`jw4YyekOL!+ZT^(%xyg0tgo)Tk!6y32|1j2*~cT2FIk_L|H-vJliLfF z8B)=bizRB3o3R(Utn!>_dD(h%)^-Ip+sx>(iq5sNS~QRSl^*)|YgmTJVZL|X;iXEM zA5k|Zez1IN*_uBx*;3%G-|c7s?K;BqM)pQTMvSja47`t*8SvIO8LQK586!&r%_I}l z&+tzX^%A2-_P*|dy%m(-e4F}UrN!W$N6WU#<5u4m?A8%{A^BXN0(qP&CCMP+AxXBK zUd1oRT8eUfC8}L@T&kANfyTEAsEt=4Cq~wv!A3nSUYeMkOPX18s5%_56rKB7)E+cw zfgZ2kf?b4VPFx;^EqUn$dU+kGrue%yqWX{F6gYk#7IM_29J2qAsATVHq-9yA(Q8TZ zl*=lSxWr0)2F%nSbi(ALMoqul6i9D|o5KDC9hIG@dx@h#){BEQeCVcty3)<`)B+I# zA|a8QX)YfBp%R{93N0bSgkGTyLnRW2lOd8Oej#GjHwDCtE+tp!?r>ds@T!*vMMR6H zc=rVVAqN$z{dbI!Sr0{{k2`IT`}E%LYDc4I+G;z#_7StLqdmb4&HRSB z@cQsoceIQ+wW*$IDbr=mTl?CxN7yAg^RY-#GA@y#Zv-#%W0*txbAv^X*^z7 z-JI-JwC2|k&P=(>EE2DIf35NzQ9FDemUuP%Zt~E#bpMUR!%6dokz&Ks9>QRsNGiPa`A4hRbneXr@6}q6zSS)Vk z___S|Fq4I!)@43gHQBkh9PqAJ)l{jsi~oSHU^nZPrQ2giygiy9Djhq{UMAjc2{M*P8x=xvXW-?mS%FYB%56Jf@^u=9#SE#0H zx%QLn6teG_Q`q8pOok&hZ^&-rNLk^!3@U!XKVfBPUaG>*CesWL312PD%cso~e5la6 z-In(OYmVG<%Ie*i)ry-<(&zz8(5fzPdj4}R^NWVOM?Lx-H$ITG6q3i~ zTltXRofQG4raY~Se-dZ2-74B}ZRE|+4n*^_Jgj3SMRa#%pJCPLWgF2g0)t!BjZZ2i zi%A_{uFP%JY(;QVhSux7R&Kxiyj-e;D5tJqZHkthkZL2;bh5!;)xj4L(IFuxLcG8eqL z46gBiXZ(23xczlgpeyrI79A1m_c3tz;eEn{ioHSp+c}CgcK6baNiHd&Fumlk{rqum z%?#B6y+V3kiPyVPNV>z{gQM*Dwc>3plLD*pVWM+=~#cKJ* zYeer2)HK9Z9q&dSE3dnlPgBQ+Ek97JC56A^UKF_eI9HyxQ*FvyVvf}brfeZVsL2g% zf$$?8oFrp1s7f1UKe)lIHkLV(;eVL932^`P%x$#xmblUY;ydvD(U za+94tbs@^1cs!tcN%1X#vR{zJd6z7?>(^0{7}X) z)4nK%HjM+@bYFPt6agN2pcvWQ6+ZJM=b&1gi(YUR|IMgHI9*sF9bT3HNyL{&2W{gZ z{cz3cA&<402Kw4;Ki`NqxA zO(PmOo>Y8e8cL0G32qJigtBLHh#y=XBj+$?@2`fP{W=mJg!)mrdx_myT(SG4NB$P0 z`bKF>7R4gV*Sd7)#O2G8=b8uUq?^{FNDd6nfXo>MUE~=%<=5dRL2NDnQXusX$XflLbe$p4?G??M20`4Uu5I3t?Ygnhg}q z1l6JytfXc|YF99@$7_ogf?gPQ z&tz-c1lncf38k+TfnOYnb8^aJS&)_zr%~3dbscuU9{2dD^j11F(VqOf7?}CBa;8^a zibc|{1(CA8ZLNE-hAj@Jh-zi@Pa~jRAd6 zCeiaQrL*)fCbE$Tnm5|?t_5isNZ44xGmB;~>ObygzwsmQRqZSDnXehQ2MfrFT|QPt z+&C(oP?@q&yxUaA{xo2NC;ssZ;V%%mnwPe@U1B0bEplSZFCLSB6{jcoWGH*vSEgI$ zNb!2{+jkqUH>wx6^j}e~>AH+{N4l8}7zJP?(&AQyD93rb=7&akNm&$di5^>VywhXn zp1LCgYRUZpSG`o^HdGmr@I5Rcd|bxxt^KC|2mdJR?Rq|uIalARmmIhIDQVU$uO!fQL`P^3-ifY^DyE%S!GB>Tk+Fgy+>AAk$iK#??Z5pNpBMK_M$pI)#l?- zhU#XIt(?GCO%u1nF8yeMK;)$m5Kih#UDN7sVUn??_b*+02qw9&@@+X4#c=gO9ZN0V z-SRh_?o@#j^}F{#!QIme9n`}@i8VKlRajU>t?g}~*WdZxL1|IcefwP9W0#n;wfq(e zc*$bJRm5u_N?uktD;Zn#cKYGt>p`Qj9o(i}xd%7f`o*|82%J%cKlGkB2V#DKYJR`# zVinnAZiZRJxwp%7UE#`9r=&k^m+WVp_(8O9PZ#KUiqP6hGrzu{-Hfl(-`#JFC7~Cz z#Mt4LQYcZ2Fs{^Ev5qMH>RkOySd^j@o$+O<;!Lr$*!VNalu1CW}CY2EspX?iO{`h595AZ zVZ2V}kA2;~n`?EuUp}#13$qEun4|jUafQ~&Sbnfu?cE1fb0r2UV&m+l>n1$*d!M)t zy40I$o_pyLKPAi}4wf$PETsmz{{H^7kJwUW;?{;a6lf(D;2j2KkBH3HA4(u_bFc* zvGdYaxJnT7GJs?29s`>Uw4LC@dE0%2lv`%SGBCzGo#ge$N18obOGj(=dHua4mLKM9 zbdh53U%6iCEbHRN6N9gCw<44E+3FJY^U?Q>==8c9-~9K>{Z=%+UsxYO|`0FcB`detG>xKalD_$_rz}&Z0_mlgn^DJ z;Aw^SpgxMP)93NXD96rZsvZ8NFxUI=eyiibq1lrs!SJ;#US0Q0Z$E0dV=ImV=h(2C zHbEaA;V@%5Mqt&lY_rhUwd-P2)qU+ZOLJufzC6rMOi!)VXbjSkZ^3J>j*piUWUf{S zvP*uoY_(HXWwaI|mcU$N8*|FLD*U$Pe@M+472ygf^ZR z?Eer8p3Z(#6Gj_>_tBu_w!SolCk`%Ipw*q83MF1Dcm<1TZx#f{ysddfJ}C(~mNd=h zrc00Hc3p{NBk8QlCFqyI*M}8`gfy5|{2hvVv%NZdN?bIXY@1N}a9g^=F*=@-jeG8& zyVZx$d}_j$L<7R(FKbQpp6uJ#q!jDFbTo-)_;WR$}98x28fZ3)Ao+4(UyK_D|^gBS-`@5fm{T1c7lq%-f) zO6JP#cEjmAb?9`SCl6`F1F-t@vZ$?whG<$waYb@e9mp2&cf}7ip7=`rqwnAFDKnEs-!eME|&%+|Q({zI=v(T8iUUf$X&q?!)DY zmLYR1#+DlBU7H4Z;XoH;^1a<${x=_-O&I-iLhZ?DgenDOB6V)R2uJ&56GIZvzL1!4 zKZSj>V+X7Q%1;n|p0;tdDXYMS8g#31zG0=%MQJeNa>Z!PT#dr968^ADWdC@@3zSbB zqE7Y>VH7Wx^-zA$*%8Ml=n~@&^?}$-Zg{7raj}yjMRjmX;R@+>&lc5Ve-X2_iCu=? zTMug}Jd8T(#tRDARN_}9;Y@E5WigmB?TJ6W&8*7y!ana-z-`9rxd(;5AC8`2-^?!& zCyUv5;-*-8Y4gLKo1>!b!lEUFFP~2KqT8Uoq?Z0ZAXn(n7KK4M;r+pW@Xk@gYAYFf z^`}>+^FMBvq8ZrUJ+29uf_BoU?uKv_F<;3~m(pBrRDLk;r{q}Uu_Y{SqRZhzl~mwa zXF`m0CE6_Tic@j7=f`)QKOnIQO-6Ug$GrPZ3VFYnh`6rb7HjfgbM9IT(0H+I8QVPg zVVP9Bu53DvEW*ESPiwf)=7BB$<=rL1!lg^k6iL>&Hr4A06NENlqT(X~QzHlJ3CgLO zy2GlWCUko()YoOJkrEZ0TgVOeyASB+!uK@WYkmlj`>KQQxFnd}7c8}x;Q-AEtUmHU zT~>LJodv%uI$!(Ex7a<>g>B^N+G2dDs+&23>5W$@_zk#WN z+>qG!GR+Si#^o_WyU5ZC?y-=(Q3 zpP;-`mG`*^xr4t+yxGcEqfcBimRg*(@tPvK;OT1})T``#78~zd)s8{95^|27F(1T~ zci7RFCd7o`#MY70-fBvUW7tdY`HQ7ILf+_`e~B^?Qtjv4%!TS=NDMHcYrTb3?$oIz zP_jEk6ku&KwPUz;TiB#jM6P=8ydxX1M*GyufO@C)n=*DgwSF(EOdRWkNn8eOc)V-C zVm{N0fde)_!`4GoX8mw=*3G97`E}85W&?S9%(n7zT0y8FRw$}$s>LVcl-@sw^BE!DPl;SuYItFzL zlu#vMc9*yxe{jLPb*)w@%b~9(6*CXp7A=Q;WTo)BUxH5QvrKZq${!M-6-jE$6_tB& zLY7Dh44}`K?gnCeYSJC!C9~$Xdd9`~fA# z*!F=1O5(>9O9AnzR|@T+^vCK|%$HaqX`(eU`@h|5$dD21mU?4ekxm)mzGZPMe|m8F zswL~QtT}<_@f{BarYDa(j&+-Oh8MG3BtOy;cjeepUvtymYJNgVBOaKky~#4@tVjI0 z@_-_`eKq5H!jgf^iy&S<&o%3niLQkmH-l1!S6Qz0k2N3qA=5O0t5o|cp`PmOda@g> zj^?@3n;t6oNLWJg1b1CEt15zT^Mm=5C#Ok~2kmj9Z*xVvrwri9Fw4+N_)PFp#vByQ z8ninP9>s_~ukKaLIt+blMti(v8@pyida~Oqz@oMCc4{^9SV_b?KzzPj^9K9{)=gcj zWL-*8$r%%)*4e!9^h2pD_))zS!!$}vevuPjLABmVm2)Nj_J*!`D|&c6mEKNE45C&h zCrOZT<{pZWt+e<@YniSj)&A*4CFDJMHpW3;?)c;ia=rrBQ{~_*9~R;tk%F z-?Lrs|91TIlOLZLb1A+1`u1nmbiVk)<&=zngKvId88Tqn@A`rU;WfWR-3(iv^zh6# zU%t9>ZuK{RetT=e>O(KRJ!Nyl(IKX84ZaxGeXuqlYDS35xzNW$qf?IkK6~N1XS%lP z^1(At6i7^3aHz*Yc(DzhZCq_7k7E z)uu3fY(!Dh?*=CSw0QbYyL)#|+3;3Y+QaWJJ=}TstDX19&nh`}z4X*$Gh&-g`}Ee1 zcb^_nX_(gN_mQc$gWnv~`_1wle!*%7{$87d4fgH|N{HD1)ZvXMrhobB zi8jM($}?hL%>C&0g?}%fUb_D4XPPt(Szx_TzuOai+nT)3%sn$W&OEKd?IXtN3-{eV z_s27CS*^D;OUfPn@`3*6_H0`JXyg}@dTNjFzjej3a>28sPW-!Oz?SR5mv49WYkuUN zV}XB!eLVHj82@?~c26DtSN(n0&dhSZ=`kg`>C$7beB>W|?%!Eo4mmpP`%!0N4Zr2i zN&lwH2pax1r+X~Qi?|ZfW?!k>=|jsF4O}(1>y?`7mpXs$8oPa5ySNKY4kR6Q*>>X0 z(x_%%UiI8~`?X*DR~N3C`p1WBt!>-){cZo$4qpbZC~`Sb@1vK;?QY*M_uHgr(~9%I zS>Mz1;SH}1?KtqyS6vVO_37EpH2iCZTuc0M&{r+mOv>Kb@T=tAvFjdr_mPdaQbzpx z`Nu=%r-UyZIPccXUjM#6YjcyfxeYRW_6>dO(f3Cg?tb`iTy({eoKIf->-X8#+pW4~ z{J8b7_u|+0ef?OU^hdjOi7gp>>96=R@2$SIe#tjWUg*8~&joFkKW)A^XXxuiV_w^r zxHj(0#P;VxK0dOf88h5&8#8IPcE=fQ2D>=myMe!SxV$*1%X{DCLt@^6?cSU=;M1e; z?=5bj_dNc9-AvOd%pFD_K$$l0}FzDeYb!4-p5-G^&BvG(YDHS-9PGb!lz%m zLuZ0tobq1l$7;gA%y1h&Z+xroe%yEY->|15#x(r!{GRnMd|#P)tMTKnypul5_~(*} zim#^J8UOXGE31DGUiD7N%l#kS6Y%o2i_3G{9-sF}z0cY$oBeI}+krPvejEMIm;EnS zUpkTAB4*R5y`Jq3_i65OylB4Vn^AXmY})a5;$I71^-kIl-EYjMkN$e8|IY2p5ARvM zs3S`?oL%{2h_1ue?W;P>exqH#f?wR;tLQT9dZRNPe;s{h)N_9pg}IjeyLi;doTTw# zO^rVdxZC)j*T32E_|D4#FL&v;Vcb)1j*fiKWp8Hry42Rae=B3*Ua|*_4YdbZ<0n@Jf%wf7+d`PW!y{zl^Bnr)xFvHtsEE5^R}YjwkbQCW|+_SyN{ zxtsA@`VIIbsY7+Zg0RFcR_}{9%I2+lD%JW~%{#B;{Cslhj*d;&zjb`jiyK1jR$rKO z>D9fv##G$ZPKYS#+qHYW$2$C;`rEUbPE%iLH*?d>#o=rEbss*mWbEW0j(h;~v zMS2X;@9=u-_15VJ+gfjZ`q@8iw+FQ!e*N0ZThlsS>^P`->4Nn;J=RYPeBLxWbKVT^ zktx#>^4>ZfoYLd=vEzsKn|2>fc;dz~-KC=6zWn0%ww3!XyT|@?>EqB%HKR{^on7>B z)iZY<{wV0ptW)`~?(f;@vsp*Z$2{h%Z}HhnH=4iuM_c_H<8;}Y<->nyxWwT+=k1P}xuwg-ovzE@xima;?|b8aAAh!6@`WGXn{T}F_a`-$Uw_H` z{pY+VnyehzFz*R%lU^Ole>^_^=jmfUiu!WrhOohl_ml=_7Ii=1`$pf*Hvw z=XhfKj~Yx${zad@?q*NzEzh=BCg%?NIVC74sQBpY?&Fi!&_U-=1h93`|)Bo#l{a5UK>0GnF z*YA5i^XdFATefS~`qGp2tph{%{B^e1^=BvS*Pgy{bMVWnEzkP@-tr;W^zHM$9{x%C z!~06E3>>+4O5&-m%iL2}o=mx#T77lq%tPGZ`fw_-<*dQ0CR z;^TQ<-z2te>}h4o@v-33)XU1kycE9`pw;PJTwGn<@YKWOPEUP$JQR-waXeL337mL*tO`*BuwcD$7>oM2@gCt2AA ze9TE!_RVA~dv>aoJvPnCB4@zP2yLd7WzM#;O>?d6?|D|1lwxIP7FgM%i>z#Cs+GAc zv9h^Kt*q@+R<>lBm7QO1Wt~@A*{W4mc5$_p?O9`G*R!mw>}mM>td+f*ZDlPsS=md^ z!S5U^tG@;D+H7S#wu0McWn*8kvc9=iR`sHl?bvB$`(CoL)w`{%SDuyqycd4$N4gGL z+3`aNC*R7Rd&SCXUbV8xhmoe&tt|9SE7QVnV_~due``Vbs~$Rh z^unL^z{eFIH;4Z>E3&dv`1qedyzu!QpVv-V8T-V_qEB1d8~9wqr}w8;wilnrO6m?T zea86sVS^&Wo_K6PP~X7by#jhX(!E>PhyA;B?$ohE`}Pm{wQJY5O&ed|)~#B#Z0Y0E zqDAxO&6_oA+O$cNCXE|6YShTv+q+@Ih6aP7L4yWfUS7hL4&j=IaP>pD1|nPu5w3=~ z3XcmOz3}L4kCqoX z@8aN(gL_-qI^*3`_XBj>_@Od8}ZEO9& z(qAqutTfQeP%|7izJ%)L3%aLB}hfd0TZU`)P=|cc4Ge_&MS$V3~=f0E50j zdVmSQLSP!OOu(-YUR(GNOaQuHfITn>m<2Qf^MF}jBY%M>MTFN5{sH}gS(gwm zU`aXR11$Uo{`nyt-CZ=f* z|A0O~|Eus1nD#4lVD4`wmfiv1tC7x*2>%Y^2lTm%a_)rq|Bdnime;@@SYP59kMUXYd#3<6>sHz+7MnFviu)YJgd8W)_5okz3Eq(tv68 zp#!r#paW}wJ`aQUG_yEhE-*#--pI^ix+342nOP1n3z!eA0u}>ne9TPK4e4)bW`02b zR&Wo@2c`q7e9f#3nAHa12zp!i*B$W&W&w@u%&ZU?;_%aI`0=oBu9ncS00}KMXXCVDRAD|JK z222dP2p{P45&R2>KOZBWzyx3tFdvu( zECl8Nji-<huujCcTJt|Gp`gkRy$ zU|}49Kfr`*s3$-puu|ZGHNY&O_Yk=M4f!-g7%$L1fC<-;|G+e07O?OJ{0F+{2xds&T~fHhhR%M)~+g_Qww^%hnGOmMLwls zYGG->7&i;c1*QQDfF-~Zpnp9Js}j)N!rbGKFZC@f1nBQ!VM)MpU>4BF6XC@P?tw;c3o91v8d+E+FuyUv9SOaug#`f1 zfeFC0W{5Y?y}58iAW4P!7PvNaO=BFdE?k_XDed=Z7KP<29N`h9e%pLBKfR31A9v;|Sy<&}Ssd zAJ_v}2HXU!20l6p?h`S`kB57pKQInB9GC(;0L%gQdlK$}*}yX3oH1|@tWJRY2}u7~ zxCj2c8tDYqPe(ohLx8!!zk!9o$~8zgaK$>5!$gf{1JDn+6&M0!z$DDfM155`dZG?N^K43A>V-ws17Xmd&h(FK| z==L1k0}ld?!0a5P8(0D?0DcQB16~JK1GSrx?#UWWPhbEr5f}&D2225ZKM(i7VZZ|5 z*IO*C92mP5^%eLE&}WK9vu+#eA@Flx0x)hn@(oxH%mwQO09FHU9fy0PM$_p8+yje&aljveDZt$y!aeYzgnjuxl;8V*vXkto zEc2oeLZa+5MNx^dgvv5$u@pvj#>`~jib_J3A*8YuCF=}>?EAisCB{C6VaBYVd4KrE?vfq>E%8BN@Mm z;B{q#2oFz+;FY^@9nD!f@E^{@OGkV_0moimk%jGm&X7k7VgDLlJ@dpjD?H-gwRj}y zN0RC!Po1?K5lqnaJ9+73rVx9~T&umO{<^hE>xtjzDdTbA?2~%8qu+_K@Do14@s|UC zJQg$zJC@05WPg&}jC=L0Sqax{yepMI;QVH_wC9%YrF^keZEI4NNm5Vsxg|PuR$s zo7_x}^tx90!cW+l^CA~h;3BUEMQA4y=^9Uyc(a%C3S9oNCq*iLK6^51Z9LUxRp61lyc+(oa* zfinGVNXQlX;YtxT7OE{jqdhyC^p`-cY z0*>u!%!K<1%W#z)N1qG?k9j_AA8p5oMgmEJ7*ru=R-*Ru7C7{Q1}RC+sy1=Z=n z*PK zk{4$ZK4P6ZZ&usf)qFaiU{fS@nzQ$K#qm|nbMuj~g%fNKU`(qPd8hC;FO?H7#m1L# zz9=P7be3~~b3gJ~2V0H1~MnIobgJl`7*l-$(*e?+`YU^8viUON>7N~ zoQT3Q{NJqVv-!#LQLldifZe_(dw!rE3v#DJPwhlXvaJ!-!w++O*-d4Zvmq}Uw(vM# z^!|z7<5oan^0huZ8(2JS=P!~S?~IcXDb&q2qQ`WOg=JA}3M6#>MYPJ|(T9K~hmE(2bfF7H3ENs+hHQpsc*&U$3+=;|T+FuhKG?rbSB(r5>aL#f@t1ZguNoR8ZPoy}8_p@isRcc=e&ElBP=*sJi z%Brek3!^W-{%LO8bohAub%Wb8{bsi@2Zv)9k2rTCBav8RYZ&j&#B-e&ksQq(1g!BT z&dlSpg1sDaY-TW=Xl{B$7M|rykVKYx8}vT{!2H2hES5fA=DnvoAX+ML_%SUt!y>Cb?yQ z!N12}Z9mjH#e4Dimt#+6E`8*@d;HX~fXHXfu|A7(_jySDTs3T>NAlM4T5*0k7Hz=p znI{vavLmRQewdo^X4G?}@ppOCMjhVM=I|_WnVFNQUd_;Y5KT77)#z$nklWTDU6_}> zcL`{=cBaTP8A7jQ+xvXwJ9DAW~Yx|o-+};zPWMp^b(2pw_IGlwdu95EdZrUv1ym0 zVXxKyled!E?V9m^3=p{Sx&@ZDfHQ*^wP?;fOK1Vv?Lu?2cT|LEYcd6h-bo~y zG4%2LNgDn*PPS2)@>c*DwI!`Wxl#T@_sL`QNu!UnPxp2?7Ia^SI;AS*M|x0E2~UrqrP1t)xAsr(mckbQMumT&LRwsFCU0qr%I|)S@YPBr8Y&lQ zaJZ`8(gMm7^-mxz7Alh+zNZew8I}7s#GBp}-x%SZl=RlsQW`Ch_h-fl9wlEKT1Sgl zk8Z~VtCgI93yZ30!+|YQ#8C=b`CXP(oQl9 zyK}Jq!S%jc=A_;8gJbD;bh|_(-1)Lz@QGbU0xpBF4&_DPH7Uz0QG1AWzzMdb~cG667XlTjdij8i+FP50Y;b zSo0bLi6z`Bkh{^jeOI?D`h}fIW0UhDBrnnU2E$H4;Ld_!l&~L`H#)VebPmuKoocsR zLy86;BRnWI=0DR_0{Pm}@Cfj0qAhAOfbqB}4Po>3G&KS*`{bAMQAn%(ed$k=xOx~> zclK>j!}91KKP`j_L~bkY%AT9JVg4%Qt0^Y8i17K!>5|j7uX&zGMBuzHozyM5adsGc zVtx9O=_#Q8^viw|nWwkJW)|II@cUm9;a^s$ebzr+@auueM-{e&&nt=Yl(YRI#U{r7 z-{P6yo7?^-u4Gq88Yq+b9uWANPJ}0x0f=vBXQ;@vb@RJr$);g~J7O*PDBLqO>+|40 zr;FvUzAS)OzS`OUm^e42SA%phm=58R%r2jodF66ttG{cxT||Gb{>a}r<=qC6TizHt zQIVk=LwN;VZdMjtH%ETpWkS>)Q?#r$ZkEZz-&loAz5Q(_<<Nw*3kT3O4ejyHxUrQPw`u!X#N@qu`EmF)cp15 z#x9d!%W?^UCAS_cH;j~d{WU%MU5(6L$qf)aKvU-@Itoejujf%4z9PeE_4RRcqUeXa z6W$qbsFw9paryjlZ!ekN&6GdsLRAn}KB-{5eNb4)y8*&BRoG;q^lSF@=4?tN<+0i| z6#@z|X>a_*=CyxHQ)z1ifnU^Pc!o<+3GgO8A%{fn zW!c|Ic{m{Z{>R78{zMZvFQCZ2R&Y@L3RnAClRz`4#v-a5A1x|PX|>oh_fLT8V^J!N`bK=#nn^iG+)kBF8DOYV7R zJ8S>fh>*%Td)3drC3bFa@x2BOHhn6K1gboG9`$K5q=Kxq^Ep>%=kYO(pYPv)3cQi8uYNEs8%>EnP0$fDH9C0n+p17@^&6zXJ~5OFoA|{~L8Sl2%-N@< zmzZa)0T!0Mtt-IccM83txq+!a^XdiAMq-bo-8A1`uok`dpSX}pYmU;Rgbx@K)Zj1q zjaIx;%{vtD%!Fq2&}BsXn&|eW1KF*t3n|K%wR^Q6wB$>~BIG5R8R=P>!UUv_?tq44 z?HiKJgBMkn+dCgbaGH0$lOIOJevGhNMAbUi6i?i|zlMlC&=_MqTrT!$l5yi38ZgJG zK9vP|o4q=LzpW37MHru9N=5iQh7sl}cncx2_+L4N#z7vr0*7JuRj}Xc5~xLM85OT8 zc~})@ipaQgNHeuPWh@#xBq~VzV4*Z_tF^-$4d%p6L`tm&5f}EGg}?sRyzKN)WoDyA zU{Vs>-+qvHbeT`c&hhi*+1rfJZz3oGaVKoNVdsJ_#MRZh%KOlLGNYMksZ0~8&+xVp zN;B}32Q)k}IkTUe$o;)sI5s@EAviZ!{-?>kyPBBy<4?Lt8J+tZ7rY|2=ehPr0G8eraJsC5I#&$i{r$BS(0DhJQX;KL zco!39roWTH$8>Mb#esi;pYDhJk^#GEZXR35HTZ99zlWl1uwp-EZ*#u6CY4k9=K3G$ zxC*_f`X$f6cCf$<|F@uofQ`ZTEX^x4;G}?#0t;eUW(#qwUlM9Jfa@x+pH=9a0577J zaCghHKf@gsQ2x7x5{wqvUBrZq@PR5LQpBF&ae6R@p&l=nw{iWEHc466atq$lT2K@I zR;8~sCR|e382>S`&kwD6cCof!YD@bOgojq#KfS1fmKE4uxUj|W&Az|eM7H3S{yrB} zXGOF8sVqWO%UI0>)2%k|aecA)p^j7z*XuQm@oQ++5DcE-Ub?M6d!b~%NF?`1CMfX{ z_}r{5SHwwql=&b^&`Y%2jhn6(k8HT|ec2(w_xnEcM&}=eMGYe0S8Df4!1tWKQTXJc zux~SvB|I&hB)Q>KR1I%D;XwXrH;NXtFBo?uog zk>H1ZB1WGPVA(FTl_$od(95q)uCJo(V^5$b92QB_l3+u1!j>6r$-Kih|q8aY4H z-mCQdC?IKPLEO2|yMfwxiR*WKW#wXC{q^5Td56eF2s%6KV0@As!f;R8=bT}BSS(g# zKA3gB{S13gj$vRIL z)1ti`G=O20f6I2S!19!(a3WtnLPPArjmAG&?OmHIyF9*H1M9kV-hq9=$@d+>j_Zr| z!rEJ5$0y^2W)SN#wfp=!)u4^JYL_Ru-(Z%{WJ>|%x<&Hi)ADgTWyvJzz!Zq=_=qI7 zL4eZ+H2SwL)bx7i#>4&cdpCpL?8=ls;+c4imFY+fy%&|!(O33nCvQcs^KIco#*4Ad zw6{3k1&D3J)S^tc7Us!Y+}%#ki{CSnZtbWpRH%;jUY3~?N}nw+Etz<6lV*QBVc)aG zW#sA_2Fub8!A_nL45<@!Ka8Gc+J7)T`sfv8k)veT8zAbil$g1zeERz@>|g6&1w5!g z(#Z#ue+y}9Ib4frsd5F!P$m&cL0DDSKiMCN$=>&snxxJbZSpKR%K5lw(L?o5@4xq~ zlaf&g#E@7QUSi6gIK5H&?{Dumd2$@Iz{uStE--R-17bq#a(2%wG_~m3>^5||b^#Pw zLIUUyTj_MkJEBssZ!8_XSw-1U*5%gQ%dg;vI2LUC0(<3qRr zVorw0sMwItIcyOGb12&E7=Qwe*;UN6Cf5h77JSFB-o{``YE&f;#=(vz{;?8+M@TDq)VEqSlw1Ha9PkaBHL{9sE>bwTgLD18=zsV(HTz`I zOaaZn9G%AqodM!~4eTP_F7%IgQI<<1hCvD2_$h{u)LnoqUeMnB4^{G{TkockWvXbs z@gis_7=}CfBNYRJxdBh9O@h4K&%LOmeJ;`%8)v#X3N?I7g2_)UJTc3jIOeA$(N<}9?kLDT3dV+qG-e$Pj-`a?M9tzeq0!q%r-Vb+#e270$^$}{W#(eT zHe7@0a=v5_Df+i83TVHhh8Yb~x$W-mkV2Ek4!0>MUFFe&U8cm0*mgRw3=8SX*$*0* zjXVd<;59u4j!kB21Hb<2ffOpiltPjo{uy-AYT2pVm5T`Kr&*KzPu zWQV)9k}ll(I~PfP0@Ru7#Rihca9_rL%0i`~V%)6P_d_;n=|Uls9)d&V;@~R^TO*LU ztL@i$zq<7I1B+fRNnnZDv0;&$@HWHSYbrTyhP}WY9r)?}@}ta-(rtX(XYG`4LBPW7 zjtM~;otL@N0$PE;mR#6x(Y-g0tO9uV+=?bkP!va#TNip-z~kR{oZ{BtzpZq8xyZT; z^YF+l%R-t|%5u-~)U>ZB0|6SN0l!*x!y-24B^eyEn(xWR@%-jz=WUdS7%k$tznJkZ zC%0;nw&w;G4c@5BeH(0&`ZT3>*30?Kzb(Yyh@ZVjpPtRIVrYT2tf_5uH|$*#7K(_d3>*g3&} z4208BE0Fu}Ae{jSJs0ZOjyP0dXIs$aZ@YzdHV@OA4S2mb`o@ot{s(UE+rJ(+ z1%#sl!?rhz3T@svYr9k(NC#a-`Zfbl>F%eNo*GH2c3ZcHKExt3mc=Q2-AKv4$}Ps` zt&3x^O~GNWAE>ZE(*Yk^l!uAv=yC=~0o^lyXNuY47!9bnh}>nC9#NldvYKg;j>Zt7 zph?}Hp^b*;W5QxSG=T9SdbqF5HZ1kr?F>zV&<&W&D&4Sf3oi2R+ypkF5=zu0kvd!pQmZP1J1Uz>Twzs zNy&KY<*sQkm67_6<^oR`?`qeZVVb|9IB|FTzdi;z#*C>#7wL^k#rxllg?En7fk|)Y zy?3uK2x*XqDofUsM}PWwT0pt!rCnF6RdihSYsf1pjK{D2YFkr7YM2B3AX zPZXGg_0AtCn{N>`X_%arjf@HHH{{)!)t&0V1=XkT0UIv?`c5IDIjOJ;@=u`VIRDJs zezidX(?s8xg1frhrv)s$SmqR;RQ2C@X^qs+^qgHZ8}1Ei9iZJXC(54q#`UsYC;5fK zoGptoe?6!7G>myWg-dmM-(ff1$rJg63uz_gg95w`_V=-AWbuhZiK}aTq^M&61U*#mbcXR>kY2S8cNd zcF4Q5g&Hz|ntR&N$=|?+cW$%rR8Rk6?XC{>A82 zhkrfXyU!MABS+=HYieY}C*s>5Yr%t8RJC!w)$D2F_^dy zSky(hUI`#1@-f0MQ;zM)!J$8%QL)m|T_?ZeWM<_RftR{+iUhS64H(`g*X8eslPGNEMB)!0yhY++)|7q?@Va7YM5ojK^(sCAQ7 zp=Aq%$P=<2G~>ob4?)g{{@+V>^6Ob9#@h)`4z%_kDr8EntBal3^W=5E72WW>s_vo2vw>oM$WQ+-#&@uV@oE>EE zCrW3Q;`ml_bh~Y;i>2Hs_HdMSCq$cW@%57SGJN~bnrhDK<6k9A!QAj`Ca~Lo z+s=I(?p=NHya{r3(k=CA5eecY_giqse^I0G5Kblb&r4~>!YvhZv(F1``^U}t#?nG` z^Jy$kch-jY^5+lpo+aCwbBAL0YVY{m{LTofft=6_VFoO&oa?ApYX{j--gKh+wzR%G zrr<-hk6z3z(NceCMlxETleHCAC_-9AYv!ff$V4?rNhK(08HDXZ-=Xyk*H!rb*fw^a zp`_lSaghE5rI5GB*ALB&{hU>a0!+@ghX zQ6CU-?#ib>1tFy+o$)mXwGj!g=6-@?$;n*Ezg@&zaZIT|h&lYVaqgKxWIQ@E0Hx3X zI%d3)k_GQCUM|Z?v5R6Mv)ai9&&Zok$&UHTbHz08_du*1+Tw$m_StYTJfd+6eU7vp zvc3P(26t{#bkK?6;|}o)|7Oe>v?vG(997mY0)(F-X{1mk8W6{*ifdqhW=9tj6}4ku z=nAg51`&cwlnAE@Qv-l@yQzMx~|?Y}djDaVx_|ADvOqYlMjw z?01=i&Yd6Wn+^ z_DcZu=>y>y^eHNj6+~^5I9PeTa)D$~l_$W+$HZ<2z3j!gXxK7+W9N@V4|Y>cP@M3S zB?CW70O9haOXl!mV;12W=EPiQ9qKt4#4~tkJbG|#tvX*5Pf|Q2nQBJvlwm|S+*C>8 zgX9aFi&tUBzZguREh_0(0y#i-8@;@_sWLei>4G$GxCaZbyhc9xBY_t79@tyJl8&Ns z&CS>V9#0sWu&PUL{${;?g%AoCHiv&;hhh(9$xMI9N` z44_U_0eQnip@PXPBu^NN*9}Ozl7luG7dF+5uDIHtE`ZsV@pRM5k<-}J%~$6Bj<24u zezU5wmYzd{Zm-ABV^VLbvZovse=ud>1v+;5ImB{z@Abu}H7{uv~YX>azy8upAbXiszUte`7sR zX*U>0hhogeo!A90v9s9E2C1p9n3|+Y{ia?Z zE811$iReI>A{@Rg1^^Jpd36ksJjNyj340~gysQ}qhj2X>iikbkt z+>n0j7%wo0^u$#CVpb_{+P`oS4hBx|;ON%n7~gXjPm;0R@ULYa*T7K~H7N$i;3r5n z&h)q`JZlhj#>=h1nHsf1a*0Ifxx$S?uD9)6W2;h!;cH~krcCR^gRK=|#!}kG{_xW^ z-2%ctEY24U3S9O~4)s-9PdvFE4-}`q?1vY?>Crn^|0?AD>7=T{7*eyQsP1*~mEg6g z*cP|7S*pB&6Q(~_DR=k?u=Vi#{re#mGWDG+B7#lJ_XT0^OO;>x8)tFCy+2dwKxt~x zjRWGrC6deFz{~JNcEdo=sMvBmDUe17P^AZ9FC;go`sqgbUPj~N;_BWa8U1|hlJK$f z$rQvpnf|*px^Ot|`~g!{GMtO_%^7IA2$eb3+mVrs#JT2*c<0sGl;G6Uk|mi>Tp{V{kE}u zLxmJMIChxjdyT+rJZb}3yu`Z6ZTV`x!v_3wbFN?@wxR|sE@&(nu4@jjZ>397pRaW} zGw)UnunJHyzz-u&wip1?^R?%+YsG_x>JB)^S`K4ws*V--eNg4kvweoiW37afjFR?# znxYf6V8ZFK+aG;~F6_t@!v`1FwF0T9j!X@n%d>@=#}^2P-hs>62*6JU{)V?n4}!w) zz#%O!WR@_!*t|v30h`t!$KdLYp!S#%(OCqBvZ+vK34JNk)CURhaeXB^ueZ4UJXNdjpNLz;7kjA&mkj~c$$@u z=~}PsW+46}$#1G}={_@1I|@|7R`j;UxU#4BBF>dkMr|C{wJEI2E1!pOnUbeHMF*l4;VG?55b5fmhaWNfFpFOpUcSHDBW)T#O<04Mq?Z5oPSc2)E8;<-X7(P?JvEQq(7LXtEZv$#r$8@*`o^pRlk-fT>yuDoi zfFf-+SaN}EDn??NEiVl*Yj-z%hDEUTEz#~VV2C_bK{vD$$4!Fsk zOldfi!nh-j0ES5fr@8+6(Uk*AJY+!F=5@wkz zeQUUQu?+oKcBlj`1D;_hPx=^mx~-Q>1}8rZ2tMHqHU4fo;4dEe-&QdEGkX4Yd_T|zP-0g=HYf*LL1Xjy zn-WHFzbldXe^{efV0KC8g!n$?KzIwd{=`0){HXxRWBk!DKH=kle8kWt<_?K3?cDIAMZ}l*XVkItU7Dte6M(_(I9SnK&nVvQIBI?p91XytSPW1*e;Luw0A6 zkGM@ig2tUTkbjq$rYsfPCPdjQpiZ|cv%jWjAczfXClmf78^}@&SMcY$9~L?kLUXK%_8S3eV(bPpNWB zRn;9|8J2^qa#jH?rRMvN^wHTXpRNqT3^uA|ra`0}1JVsP7$J)r9UN>ogR#g}x)BbO zA`S6xFr}`e9O7L$*d%u`gXsyQ#!}wc3FAV(m<9Mc%dW?}+QjGaF?dLa&eWO75n;wS z#b8*tDd;h~X#V%frpI4?m{nK#I8*cwY2d-syI;>Ss;x0fqwf%Fx|@UI9{ev(s2O&} zBC&ahHJH*E`*CsF23xnG_JMAB_c+)Mn|2?~Y9N64%hLNhDh@S?$@r1OeZbm^UHR52 z$JC0hgA2#01?vv(E5pQ82Awzj?+G;VyE9SL>)Xl$Dh{i!e4m z(E!eP&<;DS0>Pgm?-a0VXS5N$oyL=U|MKI~0;cIed_^!~ z>HX&+2~)?0KO>^lDrYuloU8(lyRr(TOeXyHz0+n{=S>IZp4o#~QLZ%>@VwAtRLiwz z&P;@R4`hZ08r%$95Z2xp`G;)Y@&?gH8)#xrf*{u1NH1i0iOv4HcORfE}q{Km)+?__LUYj43eqK zt+{d9Pjm(VMFd-lxH8>irwBI~ad{mSpxo4ebL&Q~T5YI(QD(89hv;hFWev>U#&A=K z7l^d!+THr@2P6N@dmY7mAW0o{b0}N|obFHGpDS1*YqZ{YE%!IWqTI>EHv4yPj{n6Phttel8X~ zne{`{O=8g#yB=e~r_KLITu#BrEcDZ^!lFI4A;vfNLIk!y2F_o|XD)7~>}-;GyEb=M zWKjz{5+lW5DK@VdxOsO`JXmSV;`B|uPksiAV%WRb?U;DJRM9-8##^E3yBY;fQUa(S z+HMf+1?*7F2!Do%yO^)C(T&j8yE=oVNtnrMwX%Pc2yT$O#W0zAST|z1~LW{zr5H2c+Icq@s7MNhXcPXuX+rho6<+f zpnm?r*8K=lC4TZx22_$%gL^uy_RQBIKQ-?4{sB;kHeQZq!TV6+a^`Tw`z`mmB|PVy zhUZm1Ul;J)zlTeuw#OZI_c@Dm0aNR$+xuMQrs2osP92C;y|DH|Y3fZM1xX(0RrTZt zhFWL7cab~FxDgCa%PrAUx~zh1WZX1vzu9K_6n`_=_NX}IyI*8Jp;SdAuesIoCqjav77Z=gYlfSU1{ z*Jz%r%e}n_NlJ3Di$&_I1|tL-j!QP|2sB)lZ0L{(ov#S$ueYt*G#@$$#yrj8moElXMFr-n* z4e+f|K#ak2Xn!7@slZx=`%4DP=jP6A+s8PGs86ques+K1W$ zb7AViH-ct9UC^@)pR8jwOFnH=HZ+MKTm;j7PP$>AHJGQx=%=cmYs0k-QoM9($ia=G zx*Z1)<(EzNQ#NhqvE3&}E&vh8=(a8LaGmRxW7F{`|m)yNH=iO;$_6fpM{aR za&FK7ADha6vBM$XW|!6*lJC?j0`F@f6Jd6*9S=4~=lKI%i^F!*bW#AHgAp-c2nUf{ zbAKChWVE>fn#-sYOOI=8)lAD*&$;SR_2?GMA}dXmVl2-3Vr9{a86k2{)BkmSOS@wH z<&3f=L@#XT*X_UmVh^F8HF<0~VW&VPi(hd#N>EkMgC2CH)w2^Ll+Azp*(RG?|NM0m& zxLiP`?_}8K)v6qlduH~7pRZu77tx<)9n)y9!u#i7;uZI5$%Sw=5Y=X)>^Hp|=OoHB zh=r{iDX@Oz&48?vStCh@c6WD@yWmHXyj-wnu&@Rl66mg?R=(hEm*0p3M@;rH+>9PV8uOpu$?~wfi<7r43S?o`@QIJ#E^>X6RQ=x-;ktHJ^t{E>LM<4mTwSrQWrE|zJM}E+MkU)&vt+~aCCilVV4!e|zuI2Lsn=8aryvx6rZ}2WF z#3cM&PM+F^maWCI;6OvqGS9$7Mh9me`7JFhkNklK%_G03JDIY5sS~(H|`jH@u`P#Y~at^8QlR|=k`auQ}^~e zypz6h>X1C@iR962=T&#Q>kH=2ivT-AWc@T{`bhlg@(Vopd~Eh-z7QEAw*W$eI40mK z6YuoATcyd?5SB-|vs8STZO%L&)PNz$eIeDWEwS?6m@~XYx`?RnMPxOVrX*^ZrQ&SE zRpg1Y1hqwfy7zLG!@p$YsjzjZvW^mPQ;K$!RE`@f$|VvCizK;13oWI*wpH?4;>9NGRq|f&fhd5PlW<34aNez zHV@%D&=JwaFrwd#XcatMVQE6P5|SI-?c5ns~aT2mI}d$x%KP1p{k zI`PPn0t4wAXdz#J0NDb)6=@{32;*7vi1!M4+->pBizBcodaBJoq)M@x{X5pmKk%R= z5LNjeB%c(@)JX4AdNRPw9@Wa$ZCGHmXAP$Ec zp_hp3Z1EcmB14x4BA8%h;GzdDtgu|>z&5<(rS@z4r+__e$j($7O@;bKwhgZm>c(6v zgM?e`;dyYHlH!#%yZFS)`hI)>H}ToTQ7F?af`d35QEHZi4+4VboO3#=3zF|^a0F`P z-HxzWDh>$$#tczF-)-R)gM3>kOssU+6;H_MpDL#3+-^igLGCmLrf94TJX~6qpqsI) z`>Wtw&jWKQkVMdp#y~ms-yMJ0)ltQDyZlSV`_Ajo8I+={0VbVNS?rgX!CYm8*dkOZ zrMAFYBHc$N&$p3vN`)oa7_YVhHl9a)X|uqihH{IFz7=UaEa-^~lI&oF5$kv=kQ{FUdk zsdNatl0^J0PWFpR0hCA&v+LG10Q=me^Cx)} zX8|yGx?Bz7jc*-Fb)si`Q>#I@iA4cRAD^-eiTdR?5h_Fn6~G$3jyFh0Xmg0()|)Ej zvtd)ehG=d02iC0`(A{6Yg{;chvAlIS^b}S41NnZdn0C_LD@TzQcr(IQ5mwJD4rW%K zbFDWY$=X7l16s9Ut~CbYOsGy{6BUNiXsii)T$t==^2K7EcFNm!R&CDq1naacnbKu3yRwc z=mfsr=(<%^c^>8kfqib6oDYy-G@n?ime_CR{+Ei1Ma5Ts@l$IUF*Xz+pIKTCw`JXx z4s+@R6lS47gdi#Wn|Ab4L~p!7TdM>r;-(SkKcvnnglkA#DD)=6_5Gf*_3HuQ;o94c zfv9Vr9JRa9;0qZ8LYsE_Vxaq~D}Xy=ta1Lf2g<6}())5zcQr zp^AtP|3Jh_5l}fg6SSU0e{dt>(`T6p5sXO-v;w^UR2zbZZ6vSQ-rhgDtcq*>H^7eP z9m@vWQowtPNh~95sYmi~rA>;>DI$<>KQNXNKe6*B5$V|ZR?~lAl`SVRNcj(fNkk+T ztxHrCpmi9x(J%hmr5*bzH(Jr!=HIBeJtLwy2VK8;WE4xOz4Z=iexMo~x;}rGkEoWA zu`_pT*^#GR8!S4|*M?W6i`o-a_sNTp+&83dERAcbsF1pEdVeo;aZbe2R?jekniYabsi0d!y~P$N?=yQIHoik zLM*RiQv;q0MmSqG)*a6?w$ZP79@p2X4*&km(dV=#2SJbSbOJ5jfi%C2(SfZacEio&dgZTLEHRQLl5B&s==@qRUH%oZ(*y1~pYrkBthG7>_x2I(Jn?B~uS zAD+&^I~i7yVHUq|x0xiJ1R`eGhhK^n*)}1fxdPT9+6y4gvrQ~giH)m;H#{4tnZ4y6 zu_{fw$r5o$1s_>|PdSDD?k_Q;6P?+8)BmOQD*j~z$I)`(E}n}h?{oCB=tHOwo7(1| z?O|?+4wSZ`Y>PI*`amP7BCB*}myzjcieH)eF25}th;L2b8*yq0QHF(ZK<-_{02wyzEabgVVdxNQIDj;tHoB7l2nF7A#m^l2B%qjAwxOM5of}N?rDB-- zlSI}#O8c;}JQPn1`?Mw4eFPuECxR>+bzEg^iFhICbcb)ppAow@M^#FtJ^ko*ET$Yg zVQo~6;9DVBT=^V~muhh_`ie{V8&bvkcvb0>2xeCO^-QIw`jIJtc!#Vzt?Ms`Vm>91 zMIg{82?VML5`4wA9mTIoznJ9VP<^SQ(bj&;@h#jo`I0XVs!mK!AUjYn72E{mDWawr zE}G)fhP*>RH%z%jmt878YHnx)EuGuzNo2jIM6i9Hpe#yh8#Ld)@j89h!EKh}sl*f@ ziYMsmoH`mDS3o{6kWxbbuI%g(!zEMBv{lLjUsI%JVqfA_&L!e-xBsaX1#u9e#uxX7 zn|kjpX$DCh34209e4gM}E*w}SM!Gp;K9oMjKw^<7tnsw+>zPyoOL{$8fyLck{hmT$ zDzJE0Sh7onJV_Ck+i^{|=NLY-;%?5!8LM_+e&V3(7TN6ig;}QM4P>vI+ibn&o&P7e z^InO983}(oiFJ7i*1pHMc9r<#@lkks$r4LimCnDXtfuiA(mBFFA6A5}I|4M9) zkn#xAh|Gx8wwe@Q+Yk@{6bGG%`=S6!rkq%sxf-+s9{6%k<4s8yS=F2D)QM_czJU}g z3i_16Ppkay#PZ6V6&>|dI9=%<&8 z58j1nzhk`$U8k2S5_hVsI+bs4-dGaqq4Wer(gl^SmE}kbqBofL@YedBix{$TGG8k=1L%2NQI>ZLgOhnH;<@B z=(_#Gst;R+zI@C50gj@8`j#+Q){jUsvelSg*&DorQJkq`sp}d*QrrZ=0^=i4S`_MhU8^bxa1d6e?DkPjQe#8`a=(6xt9 zF%~b;t_T*Q?in$4anCj`L;*3nAAuRlW6?6L5uaMv`9wC!q&%)iSr6o`O zQ#{Qle3MJ-`i&byp*Gk5`_aAp*-w5xIl;NT9VIM6T3t$hl?t)XC9GF`Uq4(;-6Dlp zp$vk)Z;a}fSdo9^@&dVYHo43qS*=)2P6Ww=4=GNsQ*B{Wo>kh62TkKAqBnvG@621b=iO4X zf(b&qbutuFBTyvS*otD8d5w^lvOf;Cc5V&YGPhKwM%yvs0Au_{{1J-B3yPbi78q`h z0fz0(%vvOcj z3iwB$=efYIUunv@5cp4k^ZC@8Bg5qxh`_7hGk;aTVJ9z&puZOMPvd=QoOk^K@WuxT zzXSL;fKOjTco}j&1pG3*zit8Oe-zQ~%b;J6_t@>=JOl8(z`wxz=8^wLT!Z)Mv0r!a z2mZAk*t5>8t2s7;e&z?@pWr=nQ&{hFKY(?2srg*$GT@V!n)!+>_*{BE@wp6mEu!5m zpdZHj_`bq*JHQXad-&LY`&*^eZ9%S0U#VJsCO#c57!T-NN|1HpS zzWrywpU;|nUW?%K7uFBn5BO=$pC5&NKX3AxepEQ0Hqbu?`bW8L2ly2Qlh6DJJ}Zwx zzVtHE&mOMZ0iPF(#OE6D&qwgt1p2jAqW?1IOM$-)d@uNX68N7s5zfyK-2nWRI^NF! zyLTt>-;5Hz1>^f2;7^Ye&h^`m1HXAozmZq@$x;8>PdobK{h@wZH*ogTehdB&Ux>O{ zuFC@c{6&P1f&MMvXHWDS@#FqSBOeI-D)2cR_!qAxd+HHV7en-EN2fG;ffnUOY!F9I4 zhkwM7jdmUNM5zzB{ z9{-5-@-g82-bX&i+zLKzmOZ=`^!#4P1)#qNIKL&0H2;^#D^b`9tJ)i`6AA1eH{4IE|O;f7;R%Y zzeME{k#bNZF4R(_WeEJv;DLlBcK0w z=Km?;|6eTCafDxdR-fSy9CaM=|J!U+Z?k|;So%yzKJO5EfSu>~bOrb?I0AVL;Cb+w zZOLB){l^FTjC!gofVUyvelpil0H2&g{XK%~*}y+;@t5b<62H=t|NEft0X^UG6#Dg* zgUx*Yi)eRXBely9NmR&lx?B ze(m`q>ES%sx0iw2&%?gbM&rfrn|_SrR?x?~^I;uuexJ=w;12W0`+Q~rZvda%-ea6|T?o8q2jTNE z@K;30|2fdtK1ux9I^8jY^mf$6G|%^go*x4Kt1p_*CH)wDE^*BD_&e@bk@%kkK6_a| z+wh(u*8lMs-=&1F;`#*OJMX1_{T%hi3Ez0fS@!8aW6aNwGXFa9pU?X>@bnTh-*P+f)hm0A^QrreCw=n!!1>(sS>XIWb$;K- zZ-HNw={LqpCORblU5lvQTll#91d@N)lD`e~S8gQwck?+K@YS$aTvxW}gz)*ZUf{=v z;2#B__}j$iQt-bP^6a+O`xk(>ono%{FM?0Lzt4zUA3LG-oe63mi@<*yA^+YJNT2*3 z{?mXTF%$ddY8tP1VI9o|etq0LZ(1-joc~8azpY4m;5zUNfbYD@oVN|&PZo&(ja=Ug zd|J))2R;Klem(JdiQmsNlkDei%YNPq`rS7XpAy%h%_KbxkB}bzfd0O~dgvzl{|86; z*Ae}FI|4uWM6CCZkeum#f_f)8?lo(E9&sYc!|%! z3#i>I+1~&k{#^m)b1~@Oc{b@k2{}J^BFXt#YybKh_`C^w$mfYa0H1AFn*P;u;4^0R z_gA2gf7E>b@ek5YHyf!FM3K_9c^{|fluez(U|0L?~oP$Vyet*rH2tN6f zsNFw3W!8;fcoNNrTdnzUMFgK)Bk-LO__JvD))%SWnQTANuWeSp{useW)^#g={)6=P z3+$%{&JL$PDguwsCcWK%j9D+VXg2ZRzk~1;#_PNYKII7f;@PB6eorUQtF7Q)%i*~{ zu5+7BdN{zU*S#0`XD$7F5BMHyKK}>!KmW0QBVPC=`g`sE)UQ{7|2abbLr%v0Tu*v_ z3-jc7;Cmi`{|USU_(Z%o7zrJuW4&My-Et-!wp{GwT~&zM(_0{>sklPS(0vVJxbp99grtHA$& z`j%aoKkqn&`nB$P($BMy|EN0e-(VzN_Y7J>oqooIiI#KWWMD%^^Fv)AFw_oD(kRji8^v`-M0v-!X^tV9%KQ zyTXI_Q~A#uf_`caN6?hPdN!inU(ccWcGH1Ju&k{;&$JL&&kjLY%BC%#XT z^YdJpxx}A;$BCa0T{9Pcm*tNQfX^P}88{v+&EKEBC}bFY~jF8_AW*KX-G z?BqSbxAo$8AlP3*yTjHz`9TE#m(XASJuBw_SMZ-)Y1*s(+A+`JFWnCN`QG+${wKAQ zJWpEds|$R3780K=zu6#GhAnKal4#Jt@-C`BINusJnIL~AN>XRtB~^pA0<6M#P0_HeH-$M3D6&U8s^n4Jx0CI z;ipCHQxW)L@EJJQ%>S%E4Sx9CJB@W$IgR8z9{JBJ*q;ZVN!Z~tfnOcb?%m)&X3fK0 z;4@VsKKpU~8|d3+oAf_{Jp4O>{9M@ofKTks9wRUJ58&I8NBs@>zb8(79y-XZk2)oe zer@eF&OI~0UqKx>$CXQg$FJ@&>gYZQ{`|Xkf9Cy*=_k$S&Bx;5db=pAGu>py>~s*AcFVi4LCU z-!bgZC%}LHfA<>le46=RL;d=1^y?1LKfep}0sF`<(ATc(HOA$~z?Z?lV%c7UJb$wM zpTB^9VgYd&N4p0kuoM|&9|C?Gom9hoFP$Kd%0KCe$EVOJBRpA$JQ0H42Ed=@8Z z9X)Nu^(&JRc}4J_YA61W@O}sWvn~FYMDY16^Vwj&zv3?7KRTBBbqf0r=r8|HEAOZO ziFVtpaeNtkE<1$icR--mBIMaG1^F#L2d7{MV9#&jJYkCD+3`-(A2qNDW11zce?d_ z@qYrZ!GC7_CDsqlP54cwzX#rPz7=0cKJS>`@*dRvJ4v6nalJGa(y^UbUn@!fe}#RU z)rt7X8n1Tn;otq`eR(nX90&j0e}86Y__$Of@K1nG+dA|8Y}+E}?*RRV+&PuHRK=oyk-jccAQ7^YsX&${~jx^@@L>nE&Fy*8vHN9 zIX?0RGt#7I{{3F=S0){7xDRek*?eA>>(Vt=|`b@3G|kWfzTa+oh)6dmHTztR;D#*+r@V!6`7rR; zpD@qsM}hBig?WCowVUMU-_7Fw-qKCu*gzfH{Tz3L&$d&|Jis@B@4nI8-yZ}%Z5;0# z!8~~acns&BkFwqF#=dXa`5&|1?lJQizk{6oJLWup_B$Q(r>DoL(>vsJ*geah90Po| z)$U2BN1VrGf0CWY`8VqCw}5X3pIdFe8u+l~k6jNwlgK;qb6&TDewsDzcQQTV@sqK??}VH) zH<VN-f`>|gKp8<={1HfOg z^!7OT^Y5i`{qt_nPqXt*z+)Dlmw~rg_#eQ(_GOZP6a4BoBlL6V0;2!ad(G$jW-N%X z4-2T>$EJ`qZq1Ts6!;6){&ES+Y4z*cGvLo} zGV4rsM6~;D@QGXfeGq(hf5<$~{Q>Z4$d__H{1?FYeF^6vyq`w2`_6^P4_oW^FyK>G zf8W0_oKO2g((~W(+`(?NyBK`dTXEL;z~@-~%}4Mb1OIdJyh#!KFI$Lx6aG2-r8fW{ zfPOZx9gE=qJ;*a*jr)_pw*w#Gx&rWD4ZFRB^$&dV8tmhc^Y_3H$GqkD&h67f{d%L# ztaCfEC*mBZ2m9tXslRpj38w?U;fH1(b!`M6Sth6Ks-^!r@YU9Mjf4M&4Q9RiRls+i zX3o!>Big+u0{>nQ$9Kf%2I%bv+}|~XKLz|3(AzlbrgpL44*I9pnR3e4zpHUUo$zhI z-wS*<{C~C&ZN1P>yEz|D1pWL~#D5v&=>$Hpiul}taaq_)`{r2s8Kb|8SRUBzuk(2^ z+P%Zl|Hj^My=?-YY3G}9%>?ih@%|`2H@Ojb&&|lIK>oWT_&)^tJvW;EygbI0`rm5B zm9K#Q!1tN&7kZ2J(@k=ojdu6x1AYnNT&H~~@a^aquZ!dQ!sSdw;48qVb_2=39{kq> zzZCVZ{9LenorTJKw43(uH`vz>vhZ>6d2B|X5f9z~yr-Y!pN|c4dxV_dM!VB2{yzer zX?^DUdKq{Y`Eafc-rGmx@}+fVebIaRVGl3C@3_M6JsNn=pqbx0xgUD4?89lG-&P=b z{(&2MfXCML80UBLF=1u52h4d=1OI7O-gR?7*XNk$i5K^W>+L4+S!=DAF9AQ?(&xXi z{8qmDG0;z1zti*r=)ZyUvN`-bBk*Z>ZfG0y@HY6gwSULRvq=X`?H3-=FXiX9fKUF7 z`pfm(vzY!|Gf$ENz8m?I8T_7k;HO)4o96L*0dcP)W^K)l0wfHRih`~vUw z;^&mtfqvT;h@Rh1Qe6@rhmJ&Mdno1m|ue)|H>U!55)=Lu(Gyl}3;^)MZ0lHNXToy(sC`l%Hp4?jno1O26z z9ljX!0}k*=W|)WR`}@vvDcvPA&e0rKHb~<2@T( zKl3s0pSsbEi?>GbzXkkf!+x?IxC{KB>^AdekAVN(cn=|;2mKWI13frT#C(>&Q={T6 zOa3=N-}X_`4?oZQ_ob9KUTVF+`rXSApIUMru`Ik_nFxH%GOVxpW_^VdL4N`0Q-%cx(ES^50CK%cSt_3dS_OUOUZVY>=>R^$1Ri=gLU18=LD^$&Z2 z@2Q$~G6yaXm%nW}>Limij{F{&uH{@mMtbA=z$MG^oR{UdoDceK-zEBw@OvtjlO855 zJ=7xPxdMD*uqRU--$l@W1M>7hpDfU>2>NHie>?JxZy|yE9Prfxguf2E`jWz1f4}ut zpdZQN{gALTZ?imUbA0z*5iZa473eR{*Usm-8~8TVnQ*;*2k0i5Qjk9vuIcpt9TrD!LmiPM?dAIHk6}^UAcN%3USE^QAFBSqhPQL04m8yf;l9O*# z>zU4-a;@Yx+R0KMewERiNW_z|TDCD<5xs1$i5A*BQUTDF5Ny5T z7WJva$DO*H6)FdPr$OK8)2Cxzb5MRIE)qVQM2FsbLYFfc*Ck6PG{tnK5-HW`Y$fj$ ziekq2y(b~kI&HEu=9X)Xai2*4vQrnJGo`DhQ#9han>3`$pcenMtBeqL&>0j{Rj8sX zlgNlG>ZBM(oi5oCD^~LEm>BG|-rr2O-otJ&W;M@kin&v)RNFHh`iN!{@k}gVtUF#V zTcIu|68hH}O|ncMfk3-r=4K7#nu8_pdH5)En_)S%PHexEea?G7VMGg;tSWj+n~=ZHSLC`sj_99a49FDCSk0^_&~aHS12T zQ4c0fI+03)zM5-@DZ_Vo8cj!cCumfQ=C@t(Oak8uvGGYrE{1wk*!yB#nHxD}Vufm{ zRNd@IQwBPzNF`s;Sa&?3^ea22p&i}0MQKCcLYI|hdC;xnf)r>;pN?ztS&d~<@jznx zyL85A!}_{Yta{jGWyE<{Z*X zgQK>WMzyR_bcxNd;d%{llf=b}Z(TIHRF{60h--YMuu6RFXyp-#X&!Sfep6l+`6>Xx$wxR-2x@ z>X7$rE>?2G{!O&s3xlRNo$M5jRv2(MvN}ijMg-iNDFs^ zz7p+dUv$KEAEhImmfl~}t%w~*yF1wx8`@H=Ih*U*n%GE0tLjpO1af@j^6>nTmTRTt zj=H6o&}Lq28ggApE0k@xL*p@wsSrJtmUb98=CxwW9MuK+ERr!@n^(n3(Y(p2RXrf? znBbjj`0U2EX!45-L;8GCt@3Proa7zMU7(Aa5SFvFc5ZdA<)4DgGOsC@dRa(F565EisIa`yKLik{a0*#Z z8g6lsPVt2|oK1A5WphHmsV(Icu@+kvi5!=NGbk)# z9whXgX6;<-n~E6TY$=Q(uwj*0(Heo>4FG)d_=D)UXdh(uf~B5^Uz=ZQs%3;0pwvUa zfTRo-O|vG99P8cFO@U5n-lm!|x*PDLkg#4A!`3JYQ;B{B1o-6fhmh_E#MB>YF8vD( zwh~y`QA|zQ&EQ5_zskh=3z)C;S_ypf{tF>}tKoSyZf*s*XCH!nMk z%La8D04bin(Fk-};kyYXD2Rds`KeH9dc*RAH(V?<#FE-9FEHBTlkBJnU*tfQa-~{r z5JOdx>p}R)ULddUOdBeiNcci`otk$f%7Gz$jMgl%6C8{utg#v`` zhANDdvm-9cLKl9+G2Y8#WHCGNHxZNC64Tq9{Mu@idyw?0)dw+bQiQDVpD}I<77e&r zkkpzDn&HCH3C0LkLhcFD(`mTvDH)UKjhRN(_(mIkhJ4lubES%qRbA%gg$hoH2zE$b zm`F>j%+TbnOqz-C1g0foeW}T3DO0&vtT*l#Q<=ADjT-${GbB!+*1N=i;dmR_*Mj+^58}HI|&GG9?PWZe(DSeK^X?OAl8{M99~SVK53bA!_q?%rc+x6GQUC5DOm}8 z_K7rd>28Wf4G44Bn)>!E(2%k`$|F-McU{U=RXu#bo-~|OJGlx{VuKCyLT;*bA=n0! zBe?L_O0ZDOAc5wUG0CfS(yBUtBu(mc#yu@e^kwb9NYaHcEQ5^%`2m#j3495kVmOy1 z$0fKWr2#NLBxvH;srL$_ul5-ZXrP=48;cB(v(*>-OX6x*`XsxHr)}=VX zEz(oKhOTwU5*PA2zbyF|ymN+Cgy zwA_ZDJ5fA@gIx|hNs5w%DFEdVEpNQQ_n#L_i2C+-|7=1oj^4iw|@MiM59BSvaa zm`JZFr)M!XsOCnU?~#1#m2BDM?B^wA5IW+@h0ZcT}AHAlGKJ~e;{*&R2pIA_XuUsfUOIvO>+_6}$RP|g-1#~)02LrM-;cbasd7MtB zRGORTqs+OfIYFsP(6RrFgEw)LoQ>*3v6^d?%;rcm>9GZ}hq&CDsWoS!Hp$eKBAv)J zrG)p~O*Hj6ZjoQ(xIq!nx(<@WG$x*!nqB^!RNgWvM%_g#MFsYn6qx0h4nbm?v*wOl zuUG3ae|#wXB)M^ZKqnQ3IU#4p7|#}5a~B=MN6iTtcn7IxH~Xu;V9r@GsIBoW>5JA- z(G$jR+#Eee#5by&!WPIKUS(VYl4N@l3z3gmkVo~G6@z_Vy;?|rf#T`E$LlM z#Hdh3RZaNi6G`F~MEu4935_|^cB#~FF-N|Xuw~L$@sAQjfVer!L5v(j-Op49dpId9 z$qhv9P?~u1tj{uhayhD5tWBeqm_}Ec@nv~LSk*#tOqhKUzq;~d&)MSEtHxc@9d2bw ziZwG*jcP+B1(f%$=9#_Tjp&HhGWn%Er!a?=BcPU~J0_=$npr5yyHZgN2)gvgM1z8MDH1bv4a;aD@ zQqU_6v1K!9QObQp8fTR#HcsFCYA!Zk<*eLc6UK7&3)gZolrEWzmMS91Xe*Ia)Qr`s zv@f}YEwzw5Jgj9!B|$5>a?QN2tWMHwyP~#OTI*#IU4%46`EbKTNJ_T5V(Tc%32F_e zSZTI0hop-2{-^ZmDrO!X_1U&TC70FcSR9+GAjZUSAf=94d7}&tZn2GGhoNZ$qr$z> z+%)!QjjogSRo-7sX0g|KGMVO#7u{0c_IxU?@VzMwpj91kF-NIHbGlxv3W{;vP8jx6 z=4{B1Xx+R0DNb3Kyx$DU2ei%$hk*)o$Zy3asOwu;M*Y&~9c@+Ns z*!Ja-jpbGQ%2v9{2Cjd#B>V?WO5FmBDP9qN*`V;LqylTjuoXg;s+nPJ56_M6NHpNrcUiPy!6$GslG=_*D{EWDylJKy45U*PFnjda<$3~E4L4G zh=LnA`d%>AG^e;KcJ4-&qIAb8jL8IDI@RhzJ7jdL{=yLJ#n{2?uDVptr)pCU#O9_w z6wb1>XE{MZ@7lBaW$o@-l=BpGBjd{U>Cu&Twi;R^Dk~D)x-3#rQ36VHWwF<2AE~xt+mXR_BcR%C}~ObSoS&Daoa!dsGEZ%qtWNY{Xg?s0wQ3;Fxlea)sfPdm7i) zP@NR}#58vb6_xIfcJd5A8TDd04oI~5Bln_`Ywat+Xwx{8_bkumTf6{eJJc)+okRK# zr6?UO*C5MaghwYAiDh=OqrRb09D;-9f>LzLreX(OcGw;oBgZ^hx#YXGs*@(?s>+yI z%_(=8Dzbvr7BW9Ik3oh*YVND=mEkwMY10ZxUz&UcO1f}-%+Z{u79Az8Rn26G$s)&| z=1ktUm{xjJEvDR$m#8WUgXlOpRgyXA7%ol{ z;iY6JxhWciM&wkkQK7GDPO*xWo25pvRvHh|I<&ShQT^T24=Pf+jIE-;Jr>3jrpZm2WDl6rWP1VtB%k;8VeWMLx6iv-`(SYDZad+TWs4uZgN(sHz z;KU!9R>#pZMvGGSrgtMdV{JSw!In`eph^wWDZ~shO;Mg)!eSFI*4);BQu;-8;kyVW zHpE~WmqmI`Cd7g%7eULb*iIfhwpvOHgJiXby2pHAUp%*D^;>9P1_-`&Fns2gaN1!{ zju~E1wZjmK-lWUo**iz8AF7p#N#oC(ot+F~myisg<|WJWaU%mIHd**U{)S2B4rItL zJC4|x@XS!_5|gJ2Y7{Wl)f8{_=7Shso=X>18m6u~E_{jBVU^p5?Y*fiH18YYwnnuO zvWvIYPsq?+#b_}-k7p#ZWioY$OG>4COhJiEn+lD%c{7DT%iE;~H8?_Ubs-F&xiyJm zM}u{DGaXgry(-FETWxl!WOAo0TRs=hn zn6Gkt!j6-8!iA=K!%DVP(X!@TXi|964Sud_4Kn_Ze2ZaABYOqS;5?2L+uZNHWsUrLiT zlzG-BEM)_-URdq}E`5-t(UX13HXD8)7iqWTj-?mqyK}x9lq*;AY+z${!U#`!YUy@L z?}{GeHs_-g3-UW|3n+EyqL; zKZz*Sj)YVZMi5?GQJC6+f{v3=m29Qzm0Y(L-EFPI{z0%Vxc>x))JHQk<5@0H83#FD zNG)iAcIzRVISXZ4z{5igeWj6B-&o@{n#l4OWWCxj4qjo%VpKKj2k~;3wI_8h>put&43shH(D49K<%4=su>OpIfY`?b&nP z5xb?((jF+?dPzc593K+bU~suwCr@4#?R>%_RE2y-!c1+3YDQ)?FVkSG3KY$gA!LVw z;~qJ#Eg8jz*drXo26^7YxPw|KE+6g|gCy989nOY4mJl56tD|+p`#@GbB++Q*HmM@R z$RP9dqD>f^m}QHDlt!#jt&iB}N<)fc%Z}^?^Er)5-Z`6J!;2E86=fz?B z2&Vqk*^3`s%ElZ$%OE>b5i4CD55dQ2$@lUQCt@M93deKG0?N#N-jy%giG`ovVP^~K z>RQrpT(hHlC4=>9HlNFSwretOoV)6$Wvc6XA&=U{;B&0b*0W`g60GHHttK~x*66i0 zY~d%!P%>@j8I8?b8SnB)(W|O=`;3=V4w?&B%tc6v5^Jr3Vx(xB5N+;zG5rZ*j^R8$ z=Ca1AX;t)i!OJfE?6*+}6cWk{P132DmWUD_f2Fk)rdY9-k2(%+sm`>sd3aFJ%&f>A zsM>7UhDu3L@bp+DhGk?MV|rOYuxRMKxAmA-_)Xfpmw}mGGE=MsHDj@s5-W8x2evY3 zmP@*zGN)F*TT^4?kf>dZlG{Q5c>%U&8T_YkL#>d1=KB8uM=faDc-ri}3w%`7oj5)T zpfMteifvT1*BENBGsE0@4+2d{0uu=jNl;qRFwEQ}Ba@jpa|eR2(oJHWMl8B^*WJEo zx9z&E>)OX!#WtXbimxKtYO7VWRwv?v`arb8{J!7sIp@x~lNkus?f&=k@A#4LJ>T>C zp6~fS&$*d7`>dI(qw$%kp2}d$vX(iub@h>GG9K#H6nIQ(p-3zmU!&N%pm?R@>e?Cb zU!~UHmq_Z$(#DP;bhr{bUR^sgol4SBv&^Ve5nMNnpOTRUZHzuR#nr}yZOxr+t@D;O zF8e}fk-1~h)rIpQD(dokZLo-RzpXo-F4m&o@9p%u58KA&EQ0j9Wn{thhoAaL(~g-k zKV1P6^4wYag^u8o#YGsC>Io&anSJXCMi^g>w)y@mniq67H+D33Hn%QoFFFMFG_{f@ zZ&}s`WEG!TOU69K7@x1;-SguuXm9E0XkEOZy|cY3*s_SGD>`^L3}kcK9Wztm9<4XT zq^el&{MZ+CbS`aMzMyq+DJi;KchBsLrMsi?)Ho#S2(8C#^WodWwjaI$h`|wNyj=Gj z75Sc{B;Ru+@;yf)-`v2wAFxj?D_WZ7)YW$ zC)Zz6*|EM)o733W7mJ2NdNdKQTnr{_PN=Uh+8gTD^h6?7Nko}2O^M!KEw0b$fP$hY zlx{7qB}2NVz(B3oDy4KK6TMh$jwVx;t>HwxU<7F0ok&Kt)SPB*trko4;eh8=c4*1o zXgm~~qbJi^W##P8_xHw>wOTR-q|K>S?T%VSi-!}DXuNw)?edQKHh-;>(nIk`D3*w8 zb86#>+Rx9eoPCzfrZj<3*R_bUE~@t^t?@OfaHvmH>U(s(Z`RD2>(;HaM>*1-NOsSh zq1bG5VaC+j?n*^bVBUCYRwO*9mUrk&Cu7tw5}v8WG$c1QQ?;uzYxB*+`Q~AqJ-Sv4 z1FI786!na!&XyV{BV9&oq-LFq8mWOmV5Y-4)9JK93tMV^To3iz%w2)TVqKjM2bhPo z-T9W|Yc;DMeP2mps8*gG*xv{L8yy6~o=T*XVXX^#YWBFM&us2!HY#lndqj^&!wBx1 z<~3~zdgoMMC=4!C;Hm$*XhiRsQ|tEk^;5Y=i+1vtAu2sk(BD7D|~+EUoU(*KE@ydAo&a6$L}+Xm(#`YCh2k$&L1#aw=peI z;#_~dVH=NG`|}1IFA`FZJek|!_+N0sP6)RS>v#j7yyNwPl=+=z$E&(QR{dTn zekRZBwyQ3m%i%S--Xd+$_u3uw`53tcG2yQhDW~QRc|u3tWv54V{M91m)j-F*MHD2#P0chE?dCswW(hJxXh^6?}xTt8>9`N zn7ssR>2Ue{Zb(DWo4c(}pFQCBt1fWpKD&Fy$1qhgnMaDW{C?NrcU|@4f1gZP=a)jC zaZmOMhIM~?`SQRfIBhN|UpkU}xxH?i%ke)bUpA-1?od@fu^5O@AKKbE=b{2-?)U! z=WyCQ4oLPqzHtiI(aVKA$C0<{6EX(llMCM`B!qU)xTXvIEyQs4Og!ABC*znH&xj*y zquRRs3GnKWVJZ4T-5QYq^1*UwUa>lnjA%(w<)x3Qic`t%J}S)-AdYI(JBrt*dP0%J zI*|Cn$}18HuvWf8G}>z8Oe>FFUlf~8CV?fkSZKWlrNsY@Fu6QC)U_j zuTJzAuZ|?bX}n;urI~{8V|}T`x@a7hW#cyiUWcnhgZ$NiyF?50GODjcCGy?tEK%7T z>W}tDuh1fSU6|dg>7htS59OsmU|f)IiMxPgq-)l)=J|#=hr_cjN+j3hrNsXOBr}3=YRatF_pi+BU3I)Unc& zNcZ(7A{y^5*xFrb*8E5`)dvk`MdPT$CZpc%bhz@yUmxSXRl7=_+X3k;egc?OyD{T% zI<4S6R8@8OX5@`+_ZYKdm>0XdAXx8q`BeF)qS)*XkJIaN^5DVg_xLCE z#Sq*5&n>xhBy#ji_Bk9!-oH|dF_P~hi*ov9M?JG!SOf7OukuKn8VEQ_t*jVBAXk{d z>zQXTn&WF78rY6mU^(Iu8F^VE8aHFX0&2+^SayAuTi^<(w?#tuR!$O(3$j?ovJhgH z`7Rb0?eRzq19p4tZaf>2j$A0=k@6vQx^}0_=~O*=`Aqf~!-}nO+CtuLha zRF*PR4iB+<*4b=x3;9mPWI9Gdbp-?_vWyjQ9pppx`9U4e>kTE>Xi3&)Z8Q~K9gX2| z^cd65Gh68M5^J?&S1hs4sMq2l0Jhbk@S1Mgq*g;5Q@tKA-B#mCanOJGY8Bp9TRBu>io@z+7u^o00=5^}4b_grkD}T= z(97k+{*Yr}504#6VZ{a<2I~zr-HyJ)=R*u~$q6~4-RXuH#)&8=q=+88F?Hi8*e2ld z2mI)Xe150LOKq@$-{tkVcu8g5h-l~miYcBccEgPzUp@F4w8)!|~Cb$i*8y+pU_p;6p?YBr1tZ30&DfGDrS?R4YH9WEDa zJfVmaG#arRr?d(h6qN7)an1*-cs-F+YW4`SqRd8k(3bGE(qIKBX3 zJkZ$q`HzP|W@KL~b#Wsu2IZPA9R~<#Hg#Or4NdtB_!Yi!58RY5mAY#fyt_x-vP+$0|8Ph*g2+V;O<;R8uTGHnYX?`Sddl{ zPq&o|tY0yUS4`o&F?bYKm~;kIE~WvH9VVQ}B_^(lS=hyNTt84onQY>F5-6>RAquU6 zWb6}gyPXUZa0PI${Hn)8ecV8**ROD1SOs$=LA41<6^4Qd0!pe=VZv$U!isZAwuOtP zmCLG6;gT7!3RzY7-dnjWC_-GULQ)kjnJ&%%)#%_QF<`<;>cfQ-wptNVNpFv!pt_BY zHo-_fkrh(xl5Jd6oxCWUSEk`(6dws@LMo({*g-;S z{T5WJl0q)zH6qgIK z3YgPpb@`Fe9!~&qZeIY6stc?i?zJCrRHVtVfMSXW5CD*9>f?6!+*X$tcnYgjA#i|nc}TsB9cwX+#^l_|fCORrCqWxHyV46BU`uObAN%Mi@x6E@lC zoHyfQK9?e7mIRs`Slbvvh1B}2Mwp-&qRUxeGjk-C_fTzu}@QMkTgO-M(uFBB!PtN8sD2l91~k3 z6ab1kI6cA(9J{vc_%&CFx zWxImbmpmcpp--_DYPlrLdE;x#TVEqkP`DIZjc|d7cZLC?fmD@ku9Mb<4-jwBws|1# z_ERTj`~6Hf-D1-`^p56{BUqaVVWqIwfmjg^Hy&mLASEAi!w_h}uTT~#{0&hn?4fX% zU_)TTNsTFpaXL|ac!~QcYQ!`Nt6i+dmTzR^ZQMN0VtRyaz4@}>Icuqi2BIq8>WcqA zWlIIQ5{NrxEPiqmEMr0yaQQtD3S0A!LRK7hrX2yV@QxnlVKAXG5*T?_r;6GJbD|-0JDe^T zqTGHD^mhhcik5=_-=rxp0} z6a#gt*KZXM%(tm-7JI9ZIJzXBb9)9;S;f>CR)JL}W2(CRZYj*-;g70%y)1nU_*_m* zJDlEtBS0AeY#jwrBE%Nvm-E)dTGivEbj#_&jbUcg=_T5syXrL&D$F?FWs%-Fd0Ii7 z^5DBr$SRkQNtQ^54A-H$F}h>kg=OyG_g!A(4Q{H7*d=He4xWV9XXWDTG>I(mRi@Hk zG{tkNJ}2=Bq7Ri6$g4UXl;W8>3Ox~1sfth&t56)JfIOijR-rbEP!cI#HM0RXBhN!% z1;i{YBZTghk_UWF=1d_>^T|}IECc|lW3i=E(h_&TDk%w54J+3cr_5HL;YLw0tU^^3 zLocjcRh+WZ=1Y-9)vs`^uyQR?6tdUDXM~j9g_tVUa?)(yhQ!SzdQfI5IK(o|=yQ+oU z_0eF7{$$J5A*|BjOV0~rfd=Ds>3{?h>y-?KuZ3KD>7PvDti>s^->6RwG6mm+4;=9M zY=M&A3?i7=15wM!oc#!mQdkAQY9%w<(Ccgn!Ht)qM?28721QFS=>)~-m4fA&!u+ks z?SJT78+2+fZr5NrQ5T7c}tgJ5+)aHzO=b@xe1?%>qb- z=p_-$sx_21C!>lTPGpp?=XuI1vI@lBM9W-oHi28GPHXS->!!Fr!ckQm1wFrz4aYx~ zX*gWdb7%|v#^8(~eX$f(Bk-yxKdOO04NrSo}LBM}|_;|BPmCMg~$qFw3(%N>P4 z2beD+a41FWZz{3}JAo7=Mzj9;t-_8~{lm+MDjPqtksq1q;)_Pc$9$q0Nt31df#y_! zn!V%4rh33|U@HJPy#hZhdu{tsCHBBBPF4bcP)BgB!LPwNQKd*)iJtIN*zZm4`;R2e zT(ruc&`I6_isTvjW^fouvoIsp>3OTYBk}0m-bVXQ4%(L-e~XHW#sW?{C7V$Nz6Ret zC&!xaOH7=5oEyt;5DTv}S-J)e7tLv2+Pqf`96Uy`Kw;r3DpT>$I2y2xpV=Ii#PhTn zkib3pHhv3t`gQ#@GbFC)IWyX<+7(>oT12_3$>!}>DoKIJ5MOm00;p+XGEN9^v;U$(JQ1j1t_##cTaB?peFB(v35TE2O-L^ zTe5j^5H@FSf56)PujA0Z3zz)ZcHW9GqpmLn!*to#n>5WL=vD68&vsAIGH1NEKr@L! zcXMATuDzeeZXP#ChHK%LNP426e>x6N4Aj{NYTa=1Aqn=TQTVixDkrdK7a%Tg{$%Gc z!q7YI4J*Cloi?&GvfK`8e`mxFg>(1u^v>r!+GvlzMqDsb<73uJ2MDL@j#;Hj{54sm56c$dv^wLwR3ET|`YyZ@qm1 zIs{Y(%B`aRMdT2{o#=$-Mg=*mJ2bqB#Xtn3H^%vY`FQpB^bhj>>Q0#D2^DN85nj>I zs^^sRwIrg;RnY324W=&m8#|q%STG_?VvNCX@fv;(*WUxd2ZGoUg(na$NlPWF=wBL8)>WLhzOeCS{Y3&vg60yV+RO&G+ssby@BRdJf0w$yoEbIm6ayAwO&te*!z z_3hEI!zYASKWFitnU0FVub=Ld)_9<92Qa0M_aOv=>%X|&y^kdP?Cez#0z}&5d3fK= z;y{0TAeZb;@&FCa%gJC(xFx#JgL%_|#Z^fBdkBqjol@W#9}b6YuPt4aNgo8^8;NyU z=IsIhdh!l?P0~>(bbM1N3uw@`h~y9Dk)vB_G1WLksl1*zh>MMO6Le$i3}^sSb2jl+ zbI=UdZG)d+70Y_?Hl_To=pB~jCW85K2WP?W)@fswC=}atcscX$7E&e z$un?3L54c^_Vhu($;$DK2Ufsl&nR4?6K0P-^Itkl=y*iRc#H?6?5b61E35mVf>1_C z9RlV6OvqOglYK(SrtoS)!1CHn39y!pgF(P|=szU5`(f9Zd?(XFiXX!y~Yx zv#HOoD}R2R;$v_W+cUjlo*q|!erT?PS_WF%+rX%V4W+aIiV64YvA%K9(TW;6MX{b- z-vB2*$+_{8$g?QKP26nyFR|buC=K3x+!bQ%rZFp}KN_ z^qIWDP%%~dYs#(feWyO3J>#~S{PJPoz1;q%!rocdkHsNFR{JHorqbunA_V_|#)C@#Wl>!v_Z1GEp55-Sl=o%1 zH)EZzrdR17;47Nn!^bIZ1);!u5UB+_io5X!48|wt_SZ_flyGg>Pj`c@w%32Lx*krK zW29@io2+jjcQlE|7|fOR5Wo`s&@~F>>XCHgmZBO_TohgCRkjL|U*2G+03CB|CG-c} z!O*onZGgaNyw2@W75Lh;G-yW=;SU4-Om_t|=|6hrf9Dw9mp_?5;$%R#Cm2trlt9hj zf&VI{8{<+eK7|lo7#W48Dlje-e)a*bQt?U)q50k^fh!tcuIQM3n}c<@r6;@;BCdP% z0s*>|z{g|@KWl_;dIq6SuvSlr=xdnF#H&t(E1#lKwgJM&`A?xwM(OC=6pXuU9i!|F z%0(|tgcsc8ba(fNYahx**FO=S>M7~&Y7q|ra87=y7BwjrJx$PC;?koE2)_U{%=Uf= zZ#evBvk%Kr8c zzZ4p?t;#bndySr)qn$llulRb+q zaiL$q0w2O?jm>Uk91mQbULjNMwlCJWm#{qvY^)JV{|y^U&JB)qkTjo?dLqsJBV3*< zPaMb3Q+S=6I=I?xf(0vSiuKn={{1(z-%}?}a%XkVZJcZ@|rcYJKQy0;j#I?6putO3$3{ey% zv3D0kjVx`#WfW#ByqZ*K=3}@Ba+BCnX&r5IGCVSl!6$7l)M{M#`kb*ys*Ta)vi<=) z9kX@m_=GYPi$$*xVNmy!9oK{bdCBv4E-ah)7pLclV#YaV!lPWW%&Du26tgRYkwBiN z*4UmX2>N(BqGC)x*?iWV=$pw4sk;a4zg3Jlh}O?JNcZ=a*YIoG49;sRcZisKN*?{^ zaKymhL%0fiSS++#5f{#+ijYZ8{m-pTvO1i$G;1O9FBoaUzXr_+CG*xS5M-ii;W8Pr zkF^z?&|}3{W^cyLF*fmWkY(JFEDfXa$91~K^<_tXHGOn{xrngv_+Gb3Mm=SMMN7ez za(Np05NB$pA6^dGh)KXA?rR{ttsxqH;ov`9!gl{=ECB7P974@`LoW6`7_&+Gm|5@}(QLywA~8r5noINMrPr7{!4c z2V$?uX(OO9nFoMJx?Tu?CC_-4BDLrD2T@F}|971MM?lF9^tfwhHb4CzqF7%{0UeKH z@xvM>b3UPmv-LQ`1~+cI!;83-e>9*5g?`4QTM-0%tvNZ*&WTY(1OcUfbs3Lmog(r6 z@uM%1!2)V}X~8w|d%g&M*};!8Pe>+yj61XkPa6HCj5}%4Poo&VA;C3?dol?6^hYrm zAEF3bR67SACHnmUx}#4F--_TK`F;TT4yV+Ug4B~X#ak)mn;C-s_aknM4;2KzuwVhX z{w>NK1@O#UiZ?cd&-h>gk^ZYhkh%1eImMg#KKON)@goFH1iw_ePmFH0R6hj2X1dSM z^x>t^8^)c|aWD{|9q$PikN}JH8NpA0Z~u|%VDgh&^MkTe75rqMbfDkAW(uCH%laQc z{f|!rR&yT%+w0c9$#}GY-RnI-Wl?ngXL5AXjR3jarDfl1$l z|3KY;AOZ}!MZg*KsN}kD-$&Zu@fttaz8#_Yif-uF@f|(;^caoG`JsMPzsN%I8saOE z(ieI;fik)Y$B)M(+?AdU=?W`JHpCBJYoi(d+@aFg_p!7e&P=L&{7jvpjI%4aiK~tN z>)`^G(i3J%;ocZG_8DpF(p6Yl=8c&;a}di=e4}0$&EVP?F!t$h>QY>YN~0fO>XKiG zn3ALcoHlLD97{9wL``ey{JuAK8r31)< z5gnaE@xAg&#DTKKy9z(j{p9QAq zHU1WYElM?V<-yFj+BZ!t0dTPg&fo+-)ajPyz#%bH&B2l1ROtZ!8G^eeIXC+LS0`;X zU`&c`4XoLXJnjazQ#bbfQT_RS)sKz`%+w1tO#w%^tvd%7>PeES3$~i-uLnmprAp-k z6M!gFMzD(}jR$b<-UO-d|M7wkAi%s7ja;#_QYY@zssFMYXj06T1BYJI$Q1!2YmMCh z5&@UTTm8w{_^DwBF4~hbl@PoXzIfxe|0RSrE(i8z-{-^%_9igog!CWkzw!QmbueJr zCv9pF7;Oa~sQt%`Jh=UDCE@58|NB@F=~}=!We?tvgJp~ZH%9-j4x#!}1Y8|s@x6%V zvci4L;sjNaINDU@*Ib*G1PIj}zz|3?b*Wia*8j9Jb<+$kSLzB=Bgd!0#>Oo+} zmI}(Iobh=L!FmY4opI6MAFWC?m8ks7IuhtU+K0vG3%v>3wR-AvnJbXC_b&#A)iwfT z3$}ebDX#Z@I~qBKwp_oD?1M^S$#`3Hs#$M^-R9uhh^Dy+b8$@{%6Jww`rt?fvvMv1 zbCArM=SH~B54g@XnQRDq7ttJ^y0*~wAc#*t&XY)$(z@c9`0X6&tZSp`Lj2}+9*D>- z?pW}&K-N(*6#}UX0LBHlFrL$jH5U73Q$5k&RK$Zb`Xg*hswVCv+twtZ7%UdYvqVbb zO#-1>Re104RrbDq1dLXlwT_|>9zKOZMiQ7I|IK}5p{rLOV5ybbOu4|G|OkX_TXt#rp5p!na zpu=h^D*w4bwwqFy()R6$F)hpc%!c|?UXatkM69qZ<1QOuL3YN}>Uc}-jR9o{7;Vpq zHqcacy6cdxYR}$v?5>Q3!GojBy%ym<_d6=uW~i^BMm-?QHecne7@wX=Zf<|ZzXW9$ z3%dQa0-@pYlfTyE_9*CBPx6+vz=gdlR&qktJmgLs+7fq%GIEsqp)M!+Jc#VezNpUE zHOtCti5@dH!Z!mHQ^dSND*X`lp)*>pp!gS{Uc7hjf=>U@-zp9^n{N34q+AZ&pC39N z3YR+p7h4L^l@O3gCE8s8QTYwN{;($mLZd4_ykSExV2xbJ8zKaL(biO+Z&2bV%so%k zOBZ9hXAR2!1wGDj^eQad10J0?_?yF@CqD{u3F*fECfT#d#NJ(GzsCrH&de?pG|c zn6@}E7lYeu_Q1(te{S%~1Nwtv%dp99ssQW6`Z!ZYR=OalEtiY5##!FsX#TKwUM&e@ zAssr8J#PxnPTtTZ=JQ{Vf=bA42S zKZ;vvrt=`W5WVoIHu;*YPS%5YhRVgd^P@3v_0K$!rDS4i1>aM-e2j+tl#~K zuZ1|0N!jXHYezcyF%|^1bS*LrN401Offj2~5OnHb&dCuJTwpt~xJ@>|5I<~i*j-)2 ze6jL@nl!Yxm0*56_Nq`zlmS(pAz;r}+|}pw$jo+WzxAB&ySq4t?ieUoREkkEa&Yv# zz_G3fg}9Zvg0ML6$eeynA2xzy#Hu54Xqdd!Jkd3&>YmzyY&VzIf&y@a8YGYDJpsOB zX8kBx3nDy9X)5D+%w29OFFyUJi-*K^0a)f|Cia&%*txPMYHg`<1==0w`uc8$R?3g% zq~&gLfrK*j0*Xaw@38}$3A#UR2V|_YD#V-1*D_f#&$L)y#qHYCFLcD3#T7Lgd@!4X zw8%DlFv0~qrpt`>dg%^qQiEvk{U%#BqpSVosvq^J&aQOtdz)sY_J7xX>ay0oZGO`e z_f_9O$p1Icix~d(2TIX5p|0C}12bHv?_5fN_N7R-zo-9lMqvAk6)M|VH8@&X-?e<< zZou7(-ac6sRU8o%*^cu1ym#DjMBrHj@Fu*MJz83bH9`D|XfZ$SnHHv4m#$vR@_h5# zeANwo!rDGi5#{*t%3HB!6k5zkR&PSwu*PQmUPeGs8Bp$i`8i8Lz%9=DyWducFYw%M zqCUJ{K&r~PNm(p&iL)J`XGd#hW9s20n0O+P#T%4TbD zJ8cHapm<3*juPiiyjsOtXb1Aq3c7jPc}@*w6bAy%Bz;y4SY z%}eL!;UW?>Zlb>Z>Tm)PpYXmYbeSL0m1sjWw^hNz$Y`B@kO2jCto``mKV@RfS`PB~ z;gvm3w}WYdOd5L4x&8DxYV@#%;zbMe+9Qf8wsJsCN5ENf_~nlI(h&Z^mBjK{ZH|^=PfAJ;R5^B_Eze{1^m^m8P@JHQ=!s2rHb=M~z{&i#84uosUg_U!Q z(lz7pDBU?n@Iqf|H{eNI8Jc=Tolr(#GoCMqtOIja+3rb*7o9mHC?8qlxT=ju{8C{S z4zSXqcA@JdD`&2N20i2#{i%@*}2Hf@FF=tt!>2?>(ucLv`XS?NMbL^{v z?tq-jK6%}+U?0vFTX>m)t#JCDp_6_yku_>R`@dHFOj^U&haazMGVhGNALCKYw>2Cy zE~t%I+WapdA#MTU@xaOF?iFi6ABoR{yhZ`zH8_~@OxC0`hvtrNRwOY*$tzLdn{AXc zANP;p!)u`HdVwiAvI%{FBkAQ5GtkA)4f` z$B>58vZKgiY{>$|c5l^whI>6J^xVGZNqC>u#lrya;Oh*&6@|8MIkaURnwj&do>BjD z>YHi`O`QzLSsV5B;Sg$H=+d_#9!sIrH}nl>6ik&r@mbmu_zZXAx?w%PSlBRi`pf`V z9$Qdf9iXQ|+i>3Vw?PZosT@>#v1cQGD!!l5_0Uf!)^@u- z-L9O~OP(yef2GR9f5)Z1-01bCpJW(5Qgv4g6v%e%&oR&Udvjh@bv=6CrnL((dLi;) z0J!$IfSz4Ea+%J8vp{Xq4_398)%s#n+%xcp3W3d-aN@dz{OOIC=_u;5^~Z5p!q5B~ z$`92o#fqEB0P-`mFMA0G9|l0(wD<2*hvJ}^p6aI;gJzP!UG#Gh%egSv;E z!dqL-khc|c>T7cIgsSU(6pNo$vS$zbt%~vC^Tc=EEQ>$!YxarKr;~!3v>@wk#-uq$ zPV>!``j{6HV*=C{Q<4?!kO!5$sj9yHoM_XWsXS}w(p+t* z$WI!PYnq>qha)fJQa%H*HR_Vw-3Rq=v7s`$2MrLt@EHK(8^_2_;JzxvZ6eqz=5FDB zi$u?U3QMEI#`x9PV0EnJ0{XFI7kpZ*k(2WnNpV1i&r_eJkNsOd&=W@-J;O_?eZzKO zI6>QD+}mG1AcCDM7YHO z-ZedOf*-7qXsDzT8TL%KT%*56o+d4_tf!mRY*xG}lddZjfv(E|6WUQM_GTp36K{~w zT>C5*6PKPL7x$cbpS`gx;Wjj|sPfW1;Ue>F<`2!Ls0?GBVLWBq`I>ypfMCH5p!yq) zw#!2*XK}T0AM(lvR84KrB_AVpigoUko(k*lEitKu-=5hr8rkGZ!e^NK)5VmB+G39# z{MwJ3c(>R-Z4SnyZ%HQICHRN5)}!_yPu^I%wkg1?^Ni1j?+*WG;j%ezUF)5KcVT|~ zNB6Sj>P$;Rep)=u{)6mqh2=ASV^h}$T1HmC`;%?p2TR4|DY7d2GQb$|H+|B|7UhWd z<9#;zpSb235?h1oQSFstKcm-uzk~-%g3ys0$m~%+sq0>S4c>T90+BD_aNu2;3EX4+ zBofQ2;WX9fh(&j;ZELyshWJjO_4mql!sFBZ#HAH%nS^EkNzR)>Hyp|JTNaeg;G7b=F({6h_0ce%xR}qR z8Cqwj&Wt0tSd1O2*^HpR7-H9?2&x{Ewy;nSiVmYV?|H9Z;zZu3TX8m*hI5S<*zWQR zLT(1cJ8+A;-lnD-B<)A!AA72}y1p~qPnU}mUey^Am9RBKGU@1UDm&ijL5;+~Vl0}^ zk=wy6&G_qu7SqiM{tt|`BI-m?(osyjEu|!dqS9mvqgi&2cD#MxgavrxiB37z>b7Tn zF1vqo6w&fn&t*zqxZBJpI%M%{c=vT1Bn|M0S%_E~>|H_>n%Cmjmc?BkPSO2*^3Ex6K-8#M6w^c8C%=R40c zf9@N(z}aTLeb_NIPXP2oratsQ2LY#!tMp~(9oupFCl3y4wXC1{wxH+2G}<*|eruNz zRDX9@{emNYdddy%bd~={_-hPRuEcw>nMYQ7oBBjdquJ*Ln(PYB2c$wQ-i`>86Yx2M zyL%mVZarqBg-oPbi=hy|8g}Yv&zha)#;*W5V}AMNnzC35i}4xO1rv zo~AI7dj|(={tijc6dKSm`jJR!H~z-_O0L*racpXVIng*Dq*NjDYj!xst-v_M;u{yQ zAySfnL^G5GVR!47xVsNLBK|_V6eD!q%$leLpWN|D^6*gcT)W}Hnb>omOKwM9HFi8` z(iPtCNFBT_b*KLhQY&~!Hw7FG@wxV#epx8HU-2n};NqMEp&nD&RW>{=J_l*@XRMFO zu4s|g-4{r44S}DG2j`3DhIz=rdzlpmPv5rxs9q*k^mR1`im_J@00`PHS#rf{qxrIm zzPj4EvH$+zG^FOlcelGw&g;( zWKiVa3ou~4tu-PFwChsD|3j_*%Wm*Y&CIuWjW?WZ>Q|cD^v&4Bd*V1PEfzQ}mbMT= zDm&ubcBuOJrxkr1ytMcp5FF0hu6w=t#~TghZ#8U&5A&grk>ocv4mNG zr+8HG9PK?XG<&{MaikPaW!lb7rQ0qke4D&4jxz2HJ2 zj!%uJ>dEp5z6ar>M|R1@~7goaYSxjkU7+wr2)BzM`je9jfZU^TzyRVP7-1b4!?+2<h6BCbVNgX*5lUVlG&?@a8(WBOx<(J z9p>@{(yrL^ikJ~L{6RvT2GWk#_jqLPxtXke<#cdG@mNu&^5^U&Ogd-ul~9AJM_y)f zQ04ndUu0cRC`ohO6>$Eu3MLqFtzo8A)4Fr1w`sRPvp3DNw{w4n(~s)y+ppC$aa1Pl zgeH+};cPYyt|!`5IKfkGvkIvm<`=$B+;w8)D+vzX8$ul6A_#6LVp2xbgsUL>1((<- zF_+}5_^8+19|FIAx+6FgS{-kpe*3Q9muc-MfpdXeWa(TpouaL066wA)*UE|3Xs6>< z=DN3Fy0SeN42PTEwa=N2b}STX(V{o{;x{aLYACL6n08cSQt3Aiij2?dvweYS{Tp$C zSs7{t$wTmoXmm_P}z9?`ov)odbKmr?V-G|y=KCGMVp24ae{s0a62Y= z=$j=#6TsaU$k+p?D%H!ne4_%o()hcQU8Nt>OOSI%&vRgAvIKl4gCz z7`8zeNM(qYN3RL_0aW~__ibqj#;KWCiukl$p&fG}?B+(GIi6uQoot~)861DWrH2BwAP2SC}xST?lB zUs|D?lB7$#-U!Pp=5v6OS~Q+&rl*b+7Ljg3QBGUsm-!AyE*$hj_dQ_RvYo+3SuE{9 z)JjKXv=pJ>$XSWTEC8r!$NX{u-NLtue4)*$r>dUvev-s>Qo}KA<5Js(!c=HZY9zCo z1VDS0D{)Zn*8gH0?k)@Uj-7fJ(HB5#P50!sfrJ~Uhx+rS z1FZddg_iSy9`a@Xe2x%{uc8q4oSSMb_}E4ult?~Fy_RkLp8*|Kq3|__Qpmk@F$U1E z*Itm9eX#1BF(0#uJvFPK9fX&ZYL8%Xqzybeq}-OGb}NH;BaSUsF@fa-wDJ=Eqdt&r0#=G;{%f)I#-bWh!12bu@1eZ`|cD z>0V@St~#sQXl~?RT$3Ei77z*pALslQ{Pl6<-LK1*{b&GV&C|)jYsqQ$l;%9EW6sud z#;v#x<6kF+NCa&MPQT*dQPl^?zTp)qWsl9s+{~lmj23>n_6Bf{*T>YN#B7(8?s9LF zDlu4A*#OuUf0opVqv9VC<~1epEMLC^0L4|l{2R+L^UmiD$YR97ak&xMH+f}# zWGC(%Z$;dIQ;l5D8opbK@ckbc{VT5L7sGRa-aB)dm=SMkIP%Re8Fy(8yJh3y3-xG5 zfDQMoSHY?spf6%`VJq<$R5+YB?_^kJ>G`2wh8ORvYe8I7a!;_SQCQF99-HTaA+4GMophocH^Q7Rpr`zGlyo0HG zy(SJe%rCSJJ||9~?=O+?gLr`h>rru(_wF=u@ z7SdX_&VZP;h*DGK+>0Y0O6;)5{C48e>jt-mpt#GIu1*|f#rfqN|Dlk`M7iSz7{;Cj znQ(gSj>>XEbiD(;wK+sy62{!BJp?hw|OH9d?oFCtru&k+8p>^-&eguI*{sQ5PB+}T{r=O( zQt?PKuH9Zb4ZG2assCD#5U?nh1jtk`Ul;Q}I$-kF5I=$B>34e-7q7=Kn5vF3{)2A`_<>gx*<JEz^aI!8#@;hyXc*nO>JjM^4YLCc= z7hZvcwx8_k0n`pJ)$kxJ;)W+54|_L=Ap=}JqUOmbK1!I5`>XZ?xVo{dpA{xLntWd^^vz-L0-MT@g*ZMx)!L+YrsmL|=T z(toTA6791kSJQ$T^|^l7us$8KbuW7KE4F_*mi9Pvr*SQli2&Wx!9Mz9ck^^1-KHj~ zEPSS#bCjuh-VY7Z>f|egvoT`ySLyb*+N+J1iXL6IN{#wa8i`shi(BS~TQ`Q5=Vwu3 z&z!b&kq=hHXRmDIZx3d+wro|Js|DBWsb=&|;tF>^V+?JIr|;f6?7|`VG8XA{^EIR! z%5WAgYq`!LJ4{0+>nTXIw>FbBmI%^Hr8Ld7&V87gx_WAsj1;Obnq{v7g&1>l+Xw4w z+r-dsn+EUq|BMgeT!&CTFkNQUHM;V(dObCf35FLuS|BPy}M7r@uG+n2#@zKKS$?i80!8}Fl2CG-G08~g5fdM-6NSXP-@4~-e@gl zgcUZ}h16t%xY8yVWj$))!R)I!y(`N4dih5N^V2HFfDL12S25oi$CYBK<<8nrCM@+l z1}MTTgIU$aBczWvAFFSZco_to`FmgBGDH5dNIiaIYKzm%`7 z3}aMsY?dJIbVkv}^7q-SfvOcO?%U~{M;w@eZO zAG-YD?^GP{EE%jxPBdz{zhRm#^ax+DFesdmr}JDxW|@f}NC#<2iW3GA)9#oHw0C!) z?Fx#0h<#-i+GER5D}YFYNe`mG^%KDtYsbBp`IvQ$e__b!;Kf)VJXlyp6tz(^F1l#k z5R51OWmwI<|EYV{M7MPE2u*i8JA)^;TvaXa?mkdkJxQMmGp;RkSFllQ-Kr6fX;Uvd zppPp#n1w+W8-Zt|Or0B9r~tGVQw^x`AzAbA!;7C_gqB?`sXJlS`W6$RQG<;PnzZ(Q z@?kCE&a^NZvTAhNS?Vs%V-1jo=jBiy2HNy*ca00T7DqL?GSxf(JQuMSULqK1waKF? zxxc5_J-bzimP~|QM)|gdYgu_jiFx*$iGnw<(Yj8Qw9Z|L4WlVfOg3;|pP!r(8H+g)#kC+9~W7Sh@!%gPk*PM}B}L<9tLA)PG< zYbP4~_&J0;L5>HlbV2ZhvJaD_{=xIZg0a6-850rG5*HDVtXHGd3&qD?x)%|*KuN39 z1pRHTZrTZQgpNRc{5ikr+p5*qul2JRJ4LXt+>JQpGNFq}31V?bz=AHg=GA(eQN;1c zXF2**%DV7y#$%+F@jhGKM8|f32YFr0EP7%BvgI-Sj^ z^OL`5N&WpUpiq2Jc61UDAnYh66C&c%dvmRz%!L+p8=JfFv-0=_!SR=Zko1Xh_oQsJ zs%FmO&-l4-Bz6ytYBt{&A*4LR0cvzkr4G~ z-ZA~*32`5bGm8E$8Ec_yfJYvNA2cO~ss6$KB8G&~PAT@UH(x7y#5$t@Uy0gkMQI|; zIY2}QiM5V@naD=&Kxs839Ci&p*)qZCri%c%6c*#n5nAC6J24HGPZPyhIZ>&y_qZwD zrMCK4zi64H=WG?V{0<50a|0rk>^;S7on*w%;bBr^AEpWoBXyM^r9L;K$CJ5%rj)&- z7T#PY#02PI>r5w4f-m2TeGkS~@ukVDOUbO1Fm!7tRT7qHl${%hMt( z@L&u>Io#Uzh^9cLPsHWh=t~yVJGT5}KyuW~&o`W*A2n6xgEqIA!BqG-y z3lq1zx8jTi<{U@44?6%<6YQ^gx_emRIsT43BKip9va%P5gr_KCXl3mNaI&;irB>O) z5W0iNI8WQ|NMVU)1OmA_(vul9ICBuDN@oQ)kx(>o{WZA9F$H^v1jE{D$B?|pVh%f% z?2&&W?;-qP1`CKW<2>%T^nN*@|E!BF3Y9w3;&|FJ^98~c60UhR!t72+qi)}H!|!qx z!oV(}JIIe7Tg7wYkrX33(-cFo7|U5+&Gn~CDa)3Kc9i8RQ8jj@!_ejl{KHs}!zPXB zhPg(MV=;>OTGAy=ntNclwt(e_I}x{4gFMr#R05ZLl3~Fd$NIy+KqsLt;bqLTR|82b zNUX;HVcN>3EQVxwUUX4}H?_prsYs-ruSr}nb~ok9|KcEPmF*r?jQCG#Q+e^{im+gGF3QrXy> zn{<97Y3I%c;EcgdxZIT(|H0B>XSL+AE`rxhkr3-S-}d+ujEtCJDm)04wln%3_-`nO z-j+T}3&*{Y_I}rdv}d{#vw8#Bjgj?lu(3`qDq+T4R^b|;(3Qa$I80h0mp=|WDs44L zQzD|nd~TtF40$C#5IgKDhsgo60<~WgCEQOePcf4mz}*64kCS;GiB8;| zC@>{ls6>H2t$9??fZ_4+9aov^#4mpCZj4iC0edsCTU_gfXk~&I+ps;#oGjBlW)R?>)Q0c3$(wH8hGY;@ZwYMKEJg2hKP)s zu+7Kd7C#wN-jvO^%M7s6y8+GWVMXz|K*@`^(zA_!W zjvh`3t)}QpP^dlQ-`@W!n5#>o4LvnHeWSfSx;UtM7ed`S0-a+c%eTh&Nq9U%>G1~) zD07|ng!fr?dUJ#U_NFIyh)@Z+bq06Dh}@jhcR@6$_S+x;_ZxTE)*eU=^=jJzDeODZ zy0SP4)vXg!?`th0Et^?$dEKl{}5D3^nnzX#r=j5=I+!Q zGce5cMjtli^z+RAm!~RzoWS0@B?gW?zlX$^Gw9BTbne%fQm_^H@eeAv^lZk z&h>_d>i2J_hRfT3K$nPrc&C!6d(u#TWDU2K-{I*eD&wKz&h)V1_poZBW@o%ZrpcWJ zA~UWx3Dlmx9W?IFoB?!Hcc&+=FfXq4;T=fS@$L}=n6Oeujp6*90ZpO@M=rpCDbe5k z+OUCpB2*_2zA*hG&=wci4&dCH0?v4Sa>t(AJ9dDN=p$i333Y29B!U{(mflB$D&XpP z?O5vA*}roaHQ56gDa3jBD7-E-EfxS8ekr+dDInY2Ft(Q?xHmGmJxhK56MeaSh0Wq~ z;4uVWNZlw=4@!m5hb!>@-p8;a8}qxQP#C(Tl7Z35R6RVK zotNjLn{esmU1{C*bI&{0$nJY?vG$uZQmjFc#R`VP@-g?;28%Wb!s}mCat{Aa=h@iu z6_QUQciJmI?{Ih8I3FS??K5?}ZCt3k2QdClw9V-kKh6i|aMN?-L`&uG{be3fzMDO* z1H}M&yAVSCLxSOvAr(?S7v2}nfVg)Fk^?IH?fWs>G@>HhGA!tiKePW9oCja8{+CXa zZDoxQ=4e)g!yfvyD2UDrfqcH+BZy5{hnou~#@-e1TH--*J>yw?Vy44wOF-0oX}u|J zTjzxQz}RMl+*Nb)F{ZT>ARkD(pLv8uIm8l9AUy*+6k!NTs9YVQ){S zJa3WFb{J(8SM{`?-;EBd+0YpG#DwT~H{9{G>EL!3cOS1tKqcWQXs$Nby}ckDT%;(| z9PY&ph(2AxZ+v+T@8Pq~;4J>LnVjjVoLmxvX`c>iy75##&H4+N=Ng*f8rouWIByze zQ_xiXP&vTzqb)ei|Hd9BkBt*$NLvp{{JGCy!6L1~&|BQX+Ot#NPs+;_RE&RWAMheDgC?k;G{#sdO3*>$h@hWmUO)?bp%%bD z-ZK^UBt+B$5qIm036g>I!w0loToW1&wugM#|*d9{ti zjdw2m!(Z6*|F}l@YWMO+B%~?`?eXJ^aORv=s07j!_4H z^vXZ4?!UF7%CLrM_&)%{Ks>+tm_;Gx^fe=MuAekvLs?OS0+NB_y$j=A_g}f(8^!HY z6EjVG$aWlZ!rI~k&OaWrh zIS9NVSLjb2KjZdcIq>}Ya%^0F0Sra*5A_?M{&%#G*H1wI<(Pl%#Es?UVbTQt8-5eP z@A|BWh(}bov^2@gvCcYax;tob|>4pg;r2Yj{_MNqYHtO2qbT$*6 zvth^XxHp%(kFOg!bM1ud%h4DOOk6PKjJ|7W-MQRSreEa)6Pl+e z*RXp0fw7z6sUPYWbNxa)njd#P4Yz&t}Qb(}v?UVd#Qnb`A>?_m#Q z^U!|3i|rv^lK=7yC|@WciazJ`}Y zC?S4h`?!Mn59Qc;o~dpSd`rlD*~iQF>W07Re%5bVRTMwvR7S^{9NIaY%i&@UFXb@K z;WZrIz~Q$!yq&`l4jJrMeYzday-gnoAv;DsGn(_zL>H@s5M+@7{cwr~zN%NMCV;!5$F^^-J)nHo39p^Tf=-(7*Fwwo?9JAf*JIB1f z^OiRhrDgLBbGuAO@qO5)n)~0<(Qw$c3H*&6hu>GRzHc3&ofz-mOSDs_o9X$%^5X3_ z_|1I%uOrMW_Rn5>o{1V-7be2KdFF!rR4ggBeWCc)5ba8+2d^I zDbcRFU>$)H?e=}njBhB>?v9z}eOoxr@jAxYZq@Sf*~QDo*)BcKb^}LfC+z0N679AX ztmB`?+3vgJr0+-LY`3LEJLR)x`?r0Z^JE2FX)SpwJ|H5xKe9IgMPrByg#~AI4j;HOb@jG;E(TIggJ)u;O#U5E7Pp$7|P*1WN{uhs? zLMPPW--cmB{?r%KampzCt84x6ZxE=A96g=U*xr`%JcQI-V`29&*eNQFUWgu;fMpr z=HM!!o`8-xEFUX@eRhskWQv6%Yb5_w`^Bh=|MIQVN@84i4 zPQPLQIZw+A^6r`w&3Shr|HS(Bg8m|p51wew`zP_UiNgNZaJr5uIJekSV{TV!|JN7v zKfwDR;2o7o#rt#iSOyFFD?C3^&Sd4Rs~|2bnE$H<{lz&;#WJ4nAA$Z&1^TD({tEB^ z?&k{ZbwU4I3i?mw_I2tttbBdh;phKhLI2HPYT%IT&vEAVh4OO;??1s<(5n2xitwwj z|1S#qSM&bWthxobILpL6N zegU5-=r7LAcJcn3%MaiG_XYho+`NiIR{nm);pJx!AIn%j_t$mb;^iao?@uM-57GZf z_TMBs(x;jCfAGV1mMLPAhU=Yc@#@COF$^F+ssWVPhINzQMW51P^dJR!uPXE9d=s zc)uRrUcfszVRsa)ZzBI+`0>17XRul9Q^CG2{gaNbu~-_o<7nV{lYni!U0XrF3!vXI zM-jIOI%meBtG(`-5X?b1lh&kLNU!q3em@XoU0_^Kj0 zN9TDwR%Izp2~48HItf`S30eWZkm zlO}*RZi^I}i5b^4uWn_8ZnhsnEH}Yv*i284Q&cKjG1;wIcXnzw+1iJh$y!P_+Hriu zY~c_cXWYz=A#NVGB_?FdC_bR~ob&(p-oG1K$ZqZK)YNnp{C&>(-}n6I{`dBO&ew#d z$}HLK+uGpClAL_)cFDeOr@f9xjiE5P4zEPH?b{qajLE?%ce}&IzfwqL$xaWRj6)%x z*;k5`B-!Z+m2=!}?Sg!}qiF~K-s)~>#@_8>J%ex5$A=}Sv(*pJ$#y&WSvjH54$098 zHQK8;*xUWSCdupYvET_(TcgM4?r4(S?Y^LHq+m02|34FWVDKrcP-F~0sWFv!u4%bd>t--TR>S*d{X@)t1 zJWvM;K>!uGwn@$oPm9kXIdS41UV&{jwNW%_K7Do^F24+I4bU~agC4!@c6jz?d|*Le z*V?KdtFSLCUZH(kE_`2ByprE*lKEXH8UB*!oBCf(r)l4%xEuzG`kh4o_3z2jtHS8*2r=xR2N@@b41)FYv`Z?RJ4LKKir^ ze9-~9Q{ao|vbzNS4AHI&{B-d-P~eNtjQa$>N&G!Y;ET^luL%5m#OE}DFWTQj0{=eo z{i?v9De&JG_~LK>0|I}Rz`r2y?-!pt1itu;uL%6v0)JTGi|5Qo1peHZ7x_A0e20}P z@WpfKnF2pY;Aac`1u?%f>3nftMe+NWgT^Yy@ZUdXGU(TzMpy1yEKAY6-S8jr1)_OK z6KYRn5D$9fd5|WYg8`zyg*2*uBusQ8(x~#014MrlX~5r;=rW{H^&|B}FGCttK2l5c5~NYp3BoCw_aM@!;)JOb&6|TXsx~2cM)U4P z8dW-yNwg7ZROJXAX30xJ8dW$lJcjhmML=iL_=)}v()ZB#iN1{Vy)=HJFCl#&ji2cE zke*57C;BYXSu}p4-$8m7ji2aaNZ(K6C%O;mY#Kk&KSp{sji2bhM|uv8pXeVVJ(tE$ z^vg)kqwy2{Jks-N{A2pL9rKmy;JZ&DKu6%i;o42rr@{y3StRSJx5AX1+CS4GDUU*d zFB$fOHI!1G$Dlfrq64Hlz2Zm1mFQaC2@OjAKYC;HG6X+L@c?PvGgOPzTep&}fgyvn z^ny26#UBnEtihD^kSRLzL@g`wC>ANb;JI`%$^Do#fSPsetTk0E^&#}Hb55|X|HuvH>B5OcUXc)B|Hwz6O}8fDKP4^<5v(%XMu39~Y#tW44bWu8K$oZ$QBUnw6VaA}8*yI%eT1GRg6 zBg2_lCE(aq=H{Ejh|)p^LwWi(!b+Yphu8N+eNJ0&w95RUZLcp^w(V`roi}t3jRWy7 ztp(?O6;{JJYw)ry_ys|Gey+T6ix6w9do4-Uz=&bzny#-IeeZ^L=gzYt+N|<#1m=Ud zv-_$I$Ds=Uo3`K}A+c(>ZvI&aSt3Hh_u7IZL+>fB+Zt}QfJ=T=$0aWho<~$v)4}Pc zgITMx5RdkD!GJ#tjKFwyC{T0<)h*k)8og1Lz_MmgRt z>PsrK8QM$vP+zKpW2(wrweI;eo1pgu z^uts_KQtXo`5BnMvgy8Ok2Ef3(CmwDsi5bk?pnkf3;w713UB}N5!@JHuHhS$%hZj) zqo#v1bGy%)y72+o97d4Bdm;uMClMIF8E7mZUvl?Z|L4}=Cnu*(laz&^=%pu2Hf88X z(33UT6S&kp2)=0x6}|a@jExiWIH<9{p2dD_XZ`RssD0>>)IOvS?Pl{fLHi%0+Fz$m zxNuRg+y{-72T%1}^QTp%-5&Z&hAX$a0oaNU=65K93*<7k7J7kZPt*9y;Go}O-E%xU z7Rb;X9(vInrW+R)T>wQREAd+PDjRR09V!1;Qod^=WEmDbK$by~(K5VM9lX#tC>V!w z$TZZWEV+T@ReMk#ylsxs6+VIri?Hm<0 zd-^k>+mT<7srcC+jne)@ZLbQ^U{6gW09aG^^C@HrKFL8~sq4z4co%}1Hl)E-h`cn0 zIJBXZ(>Z9H(A;MZWgtSYHE=V{)V-hJX5U44#7r{L*0(;GW(^(26GqnHj9ew{I-+4Q zn;n{w>pyv0T%UuPxIM4nAryb^i%^PZEkS><|9*w@kHr{&tk^ z)XJy7rIqWLPx@Lsf80Htt7-R_h$uX&=?RoEK;}O5f1{j7J9A*i)=$-~{&*gU4&~^I zT=gaK&jA1MPFx5hf-s*6UqfLV3M~tC;oVI50t)eEWZxk{_}NtwcA&74-p`=Bn|#e~Ty#9z7lY6am|Cj59V2wPCN zPY_y|@bp|<6ylEweW|&+ z@CXyGMd5au5<&RaOt@q&?ko`u$khf(pJA_6@Y?dLun>!&KHFv->uhLwp+&Idenb{}q{`_DCmi0{xkh*KZ*F zHJCzt;U7wQbG9s1mJXV_@qKS~)6Z>9Bk;si`b#u$ncjuY-gTizZYiIjZkL|0njTZC z1E&nOukFsw^n4Ubc@|0sRv(A|N&fr@{*>Ko-A8wOYiPw!l`dFh-XgqWsIssp>VHvr2r3=wE#JE-H(Gkk^n+ujgJ*+T_d-7+-Y5gR zC4F^QO5(k8FJ7pAki;eX9kk!fRljA?l3~i6a z)u9|1>=fU%Yp))mY+h3#RKO3V#a7_<``Z0JHC}&g#Gcriw0da7bhJ*kRd3wH>hXIy zML`}Zh;)%2w~``G!?>uZQNHtsMe=5Whm1nIepeF*vl236^dX;{#guPx5$=VWi|`~^ z9WniH^t3pf<0jIrM!{@%xSF*XmlWfN&k@DuH0t%xPa&XkMf76>2Ks>yeW$2E7=y?` z$USWoOA}Z$e5$*UCalFZ*<3WaUEhLn^Ps@K?J{T_^oUONAvA@fL#TAJ%6Lpv3{T(C zN@0ZY;%eh@bP@`Jys1jPsPKtlIz8?-9#WNEPh3sdpTS*vbwX_r>MggvqLhV8q%8phiVmvr~g|e@~1OMDR94_GdJZ`5m{`!+r6wz34 zow2$Rc2EP?)UG@RcJIVU>)3C#Kzx0g5s^1;s;jP9tE~qfD;`#ao<+b0s4rV=j9FJ; zwZ@H^>z;;_z$^92`GT3lr8?Q<#o5UM!9FlC8Po*Lad`piVSG6aYAr!IRW90t9S%o((KfeGiq^4fF^2bcw_^xiJ*Y6DR~cijTeCyM z2i40v-3Z1hd!KH@L$ff=%?#MHV7xtbxhJTCwI5fDF}_@*-wDMgus>YDhHo6#UOQ;c z#C8i+N+=|jBa>7TSB~9r8hoO{lYwDDxN9D_8OPVdqRkgklsI)=b0)=e2FvVg!J5EY zX{J{z?`h~5ua<1Sd>m}lA^Tm_-3CN(!tlnl4FA~ec8?zygrYuq9HAVoRW=QjBUz>In$u zKal9tbw4}jQIqwD^#3E>{yRGVn-lcQ@)i4A5|>~89oM%^-am<_!?U=*15fK`#pbW& zv?Y$eDvp*pof*fM;^<+X4kqYd`(*l*6?<;WlE1JZcMUff4f++Uh@ZL&%GNpnw_?JPNn&wjVClY zJN@#$Mzd1|TU44S^(xH|9W-nCGbglPZHw>hZ{II9jQ5vT>*Z-rg7Ul6b1ezv zjp}*Q1o9^JJWGQ1)mXX*63CtExxxhUH9S3$p#2t}zB9@E4NM|`ZxXqZK(2arT}vQW z&re@XAm6TPVgAH&7f)v-kk_dGT?yo>U(lQc@^;mqAc5S&)4~LD9==#AOCYb{>0=4x z%~L!_jxly^{0vy_`_U-QTQ8)zoNEW8(fzp8K8Qw#afx4wMzcYY>OX{hkhXuye#`BG zbbu>ZqByZL`8lM)i_s{#6jf$qs{R4!qm~M79;S)UkTKGmm&dEazG3XkS3v#_4LBo{ z!qHLGK#KZEK_4lYYv8W68SP0woG=t!#od}e-H-6Pz}U7>+(3-?w;qH2Rc4eVUE<+c zsa<@hTMuKuXozXIYJzsxWemv4%?YC^vijyhJ;N}E6d!J)ajenmvt@J{lJ7Gl2tLc_ zxfSX=aCv-ux^9f?dO0pWofe*Mb4+-;|7qNvzlx(@Ro9hj|M>Y~^{k(IZa7gKo=S|grTD6xYX|eWls{Yfe{SBwZ+Uu$MPpkKv-Wjp^5?%jz|LIqF`B!-P z;ROD}iTtNkzsvpn5W5oR06m%iw0eL14nLgzRsE;;^YZ(7`TcRuM)B(@-hW#6SB%yF zMD54>Pxtcjy}bNC7$){x)XwEgu|BZ6U+2X0HJSf(EiYd?#q#m~)AhW3{j!PkPv$?Z z`Q=7j*Db{~l^`lwE%g66N z;`J|)|MaQ^?N8Nz+RDpM=0E*kBH%kFc-ox33w%`7wKzOyW&#rkp5bW}ltjmxAW9CP zW)O4^IftCliEs-jRxD^FVns+{2Dl0;PDa@sPMhyuddt0k+S*=jYg>EkwHO|ykO`0n z&yes&G`!Cw1OiAB9$~(<);=?tplN$A{>+@c&faUUz4qGcv0vw1)i=Q^2$uLitK~@x zrY80EP}*a{i=XMt(et`5iJr=<;i^WF*QVtr;dfW5UZ_f9+=W1o8|^oIETy$t*X?%pd># z$gJk0+uCP0{~uzuZ%Djd=C5MrQ7IODssUVD9kf7blGIWI3* zFl&Kj&b-&KKw-SV;^Nn4yz=sbS#w{0bC#v3Xii|kY|8@w{KDdYw!HSH|MfR#&6sbQ zwfJ?vWkK=$*XR0+EJgE*XU(l1$X0|{;pHL|fq&i{OVO-(MV7*N_W5%lr~l33qSxolvb;I# z%>}dkPy=9|J8uT$c-jB@yt$UwX8C~#L_ROzw-iB*g_su!FDjffZvm9#_-4!~^#615 ztQoIhStR`B`LAIyzz6S&76Z4SJXAGzo~3Bf{MY@!2O#}bz{y(-Sl^ttaF(T*pv64P z%Y}ur7A!zwd5dSvK(3msfAeK%a1np8U~Zgo^JmSnQ#k9fke_9fJL=t>v5`1J5e0CB%CkbAh1b-w6?$kKEXOd5c|I(A- z)@1vU1h*x@vy$NUBzR5|yk`5}%;9?SdaT45_1b;6H-Zu%pJPDqx4@;Ba{gdr_5_~`s{G%lJz+}H62|g$Z z{%I2Y&LsHyBzSrfygUhhR}#EB34V97Uy=kLoCH6d1Rs(FZ%BgQlLR-C;P)oMTaw^I zli=-1@GgF!w-cV3>|ZCr?@N~dB>4Tw@}C5ECCh&j{DEZoPlA6ZS^ksY4<^fh5p_EY*O zru$L*DP4!@{?vX-@4)l`YCokbFg=jkPw9=A9z^Y@^k&VftQbKc(kmdMLHO1JggibOyDb z(yw4TliE+|?_v5rYComFi|PBR{gi$h(=KX1rN?9X0ct;`$6)$9)P72j#PoyIeo7C+ zbQZOr()VFHo7zw5yD>eC+7D@|*~|8QUt=e=;OUl0Q@mB>4SPKntt!$&KUEDN)5bc; z_;qP1jsY#4^7><$7A;inx5jE|2$UxOo2s!hlQH9aKmcqY7TfnwN?+Onox zOhsnm*u8&AlVAltnZ)NMq-Umep9^Q$yt&u`W@GXyHElAJ4RG#!=1@ zC@!mU3An5U+l7D>Oxg4}Z*KZl$Xg7FEzW%&%f=_5z-A(N8)W9BAH4xjOAkOd)h1w- z0E2>$W5G#SFe6bgoXGSm$W%I6V>dL`X1IVKtjf@lE#Yyuu#1uUqnqafW~tmL!D6Vj zj2}R;PX5c!%g=e)EqSUu#mja2fXyLle{Gnc;j_%Te#K-^uG#J zg~|hiH9$3uKMw)^<-YimJY9ZC{=Ph8tBi?Z4P9z%y+QP9Y^y)r*GV$I%Hkw1-06eF&g(?X-Pp!0*G(dq zZ9~MIHlXV)rwjF$FHTn>B*dYBZ@R0&$6j@{09$=*j;mdRKL#*Z^MxN?_-LjDNcFm} ziXZ+9G3)}?xk$ptMnDYY0MDJqPr(P)^d&B*#*UB_lI)4=;9Xn*otWwuPxUiixnYXq z3yCsLvw`{XS5Io;>8>m-Jja#e3%}~h^}&+|*sg7j^ApI>^s$d?*_WkOBi0TL3_n~B z12+0k)Cphm#x4Zu;&L%{Bf7_b#p+DagxWc0(E=9$2eomS#eb(U6B3@B=3s8Bzt@&U zh-VMJW?vZ};4df(X1w?ks*A4jihaBr`*=U~@p@|25?2NY{sW^?@cphV<3HOG6%4ZGpT&|7?Wl&1i6!sgLwE}01?J~$C`K+`!j@Ml zu3}zJaV?G`crT6&Iz2~YQ(W4{UqG`UOKvTeDa~guc(_Z+KBF&rSkMZ$d$YG=L!4S+%=mK~$YwLB z;HO7rTHYC3z|N`?Frca_jqB&|I0;_JV%Z>{5R=Ni!AfECZ-6*&u*zx-f@&1jqGUI? zx4*mJ=bqzoi0{8-!(yXdC<5#&m7O={5j9Yu0y3Nn1gC&{2d;`A{t-PZPn@?YWh23x zDwzuiB4=zqeJ!z83;SHte1*-LzKPf_uje`f01!yK_+8LiOxV7ouO@W52U;CH2O zDTiQL-bBpHt}wE}uLklbY2ioD=I~0gh(Im7(ilsYC}p?#A{}^xeL=zfuP^(v;GSFgtznu@IE`1&S`K`|O5brpxMy;2+uVm>h)DB}^ z7SvfDCA^8q2)y8poVLlqb5Buc6lC9=sK5Gvg$9U^xm-|pH1AeiPm%nPBt5N_+XODWGgW27b!IHU+eHZuC27)ghmg4@2G{RVs(p7{7!rXkuJ-^>2+E*wnAdc)v9Q zjQ6K#yzfgG?>$%JeRlc^_3G3SnKUjOFbp;?-bWpK4}SfTS!>Ab95r8pkgBlMMaWVCXw0bANE$rAI(c{a51VFi;TPfW6B5 zGd%Dtybjd`MDW!1Jc1r!%6m@?_0KDSfeh*&MG0s(PG?~Up9BMjGT!4F7z*LxUp|7G z_oDIJugPvs1|cjVP&6@e$I>gAZGZQtnDeD8nDp;J^G-H(NE^z6$MW9WLO2lC3ai0T zlU=-MT!KnU(MkXwK7OLNE)&CI4+Fz0kYRTu7&iIqIKy7QOhOR1C!4=_)?-1VB2Sr0 zCTrRGbO^tU`Im_!V#)siD}B)MPP7HA%ExXQgRXI>KspBF7jtXuaMBPayZ@E(-ens5 z7SOL8mzQn#za*ADB-MFJn*9aFPbkAPf>f8FM+@g@;^yX7`&>sLO)I<{tPtc%O58x=7hEx$k2Cks(`b!`w)1}Uf)(;2 z<53af`^{+4!Kg3;T&ay(9Y@j75{rc&{q=B=pH}~GK+;|tj-7vWb8#IBdJ8na>BoFL zwsJ~g9NhBvLBBB%%&b@U_Y}Yy_6KmAzn{iNyNrh}VHb~fdG#edgbgKNVy^r~4E-R6 zuGdAQqXnr3s$PMS4!%tq81ayUT5!>5!I%2t-o}UU@ZM4|xojH7Dz<|>jwM>%F$qIY!a4`^Qo(4WkT(A7>o2*gOojJbdPJshdz{P*_aa-?JZ7Z=P~1lz?tZr4nAJC z>^nffB?x@Jqfau3JVgdiTxy<-BjtQ9b%Y;uDL6}6kiZEDBNgff{$_FV zz+yv!rY_*u75AHH4iCo_7%=BX>p_o20doKQ0^0qUSfT^6pph4Be|*t#RvvS0&j8^@ zKCmb|ig+k;!}M-e-?Xul-e8IV?GrFt(<#8OPZpr-w8CRB*ch6K$XT25AW#Tn7wq8A zvoirD+72&Mj$4{OEeN%WAzyEDu-=20#*07_i+WilApDmi&`)4Up-1gJ%S)Igm$Hxx z%8o`+bUW!W>CK`Er-`v7yE-lt%5Fqw13dBVfI?fP>64%XQ*yE~psx@^Z}s8`qJv^_ zIju^$58fiSrZXfLwID3UbIq}s6f8%Z?FiCCfTYE7H~DK%6>Q2*-+cCZRI zq+fX4zkeqaNy$J@B@_!d;$j5+pC0o+3Czs^3Z{bqtSk@Jh$|~{YyIGu_Q`~DTNc-Y zbsw3q?t$}hmnYmvaW`~$2Ke(o8Ez+p8K5J6o5EE|mKlO&aPhXw!p&ph4bHQyj&_oci*yL9j-v8Ev9V7= z$v*|Tjm#zp3XzX$sLr2(jLN~FE`>YKIh#HE5#>3k??K4<-V$V?4gm_r208wjM3+>) zxrk~$XIPuiYv086zF)?uu!S6a4nlu=OVso^CZuqt=HN7w9}sND&NB9LzKfx8HX2!d zDnBEY;oQ86R|3-LBWdlk>od&pLZ7wtJA9wJLM*6&p>KC(Vle3hs(*;s!UM10pK00r z@xgdoUTnlxLk^HVpHvQwn6~+Ivk6bZyU;Oz9$2@yzE;A0_5lKKxWKZ0H)Pwm7pcWb zHz^AwX$waJxfsUwOAW)a<_>>|?1nd?)azo>w3Tw+rBlIgEqA2*us} z?g_4p{F6h+0uz;RO40p1T=0BbUFEzkRK5Rsm#or52XBpqaw*yz-hf#%p*ygqb=T8_E61@d)5X(r?y5rt}q_NOI zde2e~M(R0EWv=ljd@97)tPqqNh6M!9YKmug(%^2*V+KXq=zmD%$+326V$er_hR#eW z*Z5~Krh*m-IG(e_UzYPGh@ssO4wry{Zl@Wval11!$u$2Me%CjkO8T@Og%!ALc1D^J zS4@}BAb!B(6E-41oCq|dQjYqslgdqL`4hJj)`Xpi)?*+Qe&8{{AAR8_k3>NS4x9ym z&8HKr`wcK6`qNvyu}7dvn(NfYSx#I{S&!?_n&_+5*uWl$XH`2_8abQw1cF(J;P+4g z_R_jKj?{1`FV`ro$ge5eaHi?G6o_Hm6f@GKsw9Va)#m? zC(dl}Sw-%q#+|rHIGIzJvUn(;41s)OD~ye&x!O;UN^NnUV12ADiSLgBhLJ#s_M8VxSh_K>Yv+jsEC5 zug+sUektJzWr;s67t6}wDI=P34Ku9dO$d*R-U~9bm@9w)BG?EBC{8e*I}?{u-zh$= zl^zY#JXN1RL#Zu;P}}rRSlgaw_>{xYQ}LL3AQkKL0cKtW9_Gf!5}A*lj^l1QNts^8 zOy@B=ADGDWc_PzJo@p#*I@mQ+X(H2aAXC@%AmwD2^`NV#__*nZ^Wm~sl% zpn=CCv+axL1FupuQGC^@Ap4e&T{dPwH9mKX{}sNzRt!n`uNYZ^0cRJXLzbP3p|q@PFvG~X zphD4B0}*!rSS`}*Xgbt6UkEPExHW^pe~4^Wj?gfA1TZ#zf^n6K@qa%+-SnTlzc6@# z_*X2ug%U9}UPBtxU`j=rH*&$zbUfa_=Zp*_m&J_S2EGcC)4)44!&rEN6jMK_CC~@6 zeh#mqyE{nXqx4LL4AH-K#K-donEdY!oFA*or_i~or*OaeT2;QC{bBdTs(i<-FE*~K z%1>K3Wu&tz-`R4aZtGT}BQZX3cF>6<<6|w{1H15JR4>(9cmk=WT6my%=rBB_<3j^H zWZ;7V4_Wxo0uMR(&<+o|xU`|M_V80+Pn7U9d)VVp!rx5;zE-n?ksXf6p7doWEip@M z*;)8wNj=D}%dADQ$1Va%87f)k~cJ{?G4!4@&M*q8-0 zm?$DU2QNE8SoSIGs8pfqD|=y)%SW<4cs8}{Xk@1&vLk)jDXRG-l{u=g zdPQGBl_>16)UITfE7D;=Do3iVvThd?JuMxI?`Maxc(qyl0V;i1)>qrGsLHm=(hW7U zUXJXr!qWtO2()7-q7jZk>BBPn3X02-y=HkC#W7})Q@;N(kUPN{Sf+JAckcFtqc6~bzs1bOluYQQwfIQqa82KpO0OqN}DJA@> z>%78F0o)PUnJzCoO{Gs^X(jcP%J!?$Hht4jYIf!>9kXc5zp1 z2*jRpxo*R}+Jq$|UM(F&)T^Znqx`N_Qbam3%I8`=Uf=Yf*#_vo$ey8{eHp14`pxdN z-&WH{abR*)1pKJG?gU*i65+RXtIA-M?UFNZVqZwRK)h4UT=%K00@@6@1`LqdO;!3r z&D;im;Z>%}_5rzrx#(XXH3g+8Ee-k_9zT+$n~Kz;X6_%QxJo(Kp!7v$)Dq}H;KK6A zj-mLw3dTWytW0W&R1cMw8A9C+jFPr>@(S9T`>UoS zbGtH(w;Tj;B)$WRkpth}Z0TlFLuIL188yeX8aRP%hQ}4W-LkYDDkCKs**#Rc3KE!& zs1@ldq?7o8Ou$Z9E=yl1qo6ZJO?Q>5(oJb6bk$HrYC-{{k|0^jxn${^MsPCgQL>gJ zzwqrEU<7i2aw?!!*3fG(T+2=EDebi_!TdE=0IuQ9$Jbz4*WjDT&Y@sZ(s^|XR#&Y` zwW@R&*`e4JL^R#C9&tmrOb2ZMxz?CGl7Sp7gi{7FKQ>6`izUNFgP6&NFcmqzmh zJxvT#tAP^U!*0y98Z)hg>Q=y8$b3zfz>MPHDG?D7vH>J+?I>iDJ~kIyvI3hnLAUor zWTgmMP9lsgh5R2u-c<-)t4M8%1PmR@5Vt91NX00Qbp;}UbSV-fw8PVCM6!}9k=mq# zd}LgdE+BXXaZ!;DafF+a5SHTm)l^J@;j$b!h`*%_Ujffo$D2-ctwj0}yea{L(FWbx zpi0&7ZYY930_D<^vl1IQ%0#^q=uA|$DvoG%0<;oFWd*_ z3GIq>7Joopz%Y-%)6m3FDUD+#3IP#zBgzXYzvPZtE(X(BlR^ydHEYkYLm&iO-kk!C3P$B8ZaUJSuyG+tTWxpn%5f zpQK>D`syc$UBUsCT~~zTYHA~7gqEtAmyvr=5SRcwnxGHp56%3DD$l&B3J8~Wl4(n& z0_2zSZrMpzhw~8lqq2HnigXZUbR`fYMTk|YO_U!TgG`Wz8>7$~NR@=q8XNz+-N3y1J3&LZM07p79Q#H&F*Vc>9c`^i1L_;lAc%$nMS z!*`X+4yc)@4Qse{HpIxB02b9{4L^kfn#?*fv2{HT5d$76`x8%mYg1 zRSL;co5KhbnpJiNaZS+YJZu5b8o;$ux(a`{0V?3^Fhm9AVI-bWFjSg?be#k|D$4RM zPy`3ibpS2j2wDOIE`9hggsjB@3{KY${4K}P2W%h2DWlkq-*jWABQfuhc#fC)X3a;{)} zXcs=|b1?GC4wYR}h5Zm~$x@U^K%c03D8R_+L*oVMtRn12zvd$t_)j8Ig`Gq1Y3ERQ2hPDo;*zX(+nt`an zfJEp}*j{K-53>%`5z=1pyiqOEgvr<^<1q?&#bYQNh|?xT_zLiYRfOn4mYOKgg_gxt z1{&;bIFQOI2*Rh2Xu#h9t%x%gI3)nK9|tTdLmad#B*YHZKZ|-G3%wPJg@-| z0Wyt`7)f&q0AZ-m5Cgy&5)r^l}_@IVP#(~^hYQ_QqfWMA)=iaHS|I>7}g2j>Kwdk}Ii{h^4F8jHruE+Uu+7}r-pRR=$ zrEBb@IMjlNOWJ~l5IoT{a>Az7U-T@822}{b_O`$&zEbh>5s#&*ueol_L4`;7&cHI- zT9%joKszo?jl;`Y0>?Gn*7+4JMi@V(Exy~*&F%k5^Z?tTW+3Pa9VnO{qYZ!lF+^uk zDXU-+Agiq|c*0iRXa(BDvbykqf30s^KGmY(%zJxN;OGWCA19SVbyu`M(5a-C%yULk zxm2TtTK)GX*1PZ2f>i<_5%!6HIw;g?!3#nl8fkDAvFfcwxSqrg$CWgg7YjPu^MjWGTN(Sv2d>O!)jVk zKWW8Hm=&96@g`BPUwhdBJaV!|OghqH^caZvXczBa2JuY>vr+PkQRo-@!k^HBleTOdBH4P| z`HwBw(|naeX1k`EvN=tw%BPhnMO-)0imQ29@HE1w@8B<&-MybYvIY0aA0R2^hPeE;KFoC z1otcjky1fwZt|JyMTOh7NP~U6zT{DOekKFPIQ+)6$hj2F_Vy%@sWi=9gIibU$7n?e zQLU^HLwPV3o_ND0>c7U;x-TyM9IA9`g;#yJ7ffR<=*Ku^b`jBQ;-4;i^|2OyoW+Lc zUf#e3reG;jgR?(QA8r}LePij-c`?4S4t+PRi(13;25-9r@yCxs4sYR}qWkmgTI58E zrcddcQRE))5JS6gYu~!@y^5a5>mi0VLn?~Luu2uy3ZrQG6i`)29}#C%rQ*N=SSJPJ zb>E{F;SVc-E_d}iFKC4|;2u&Pwr3`l)M@M)kKe}fG&)j|r~5|66m}UfcVbm&fp*1B zzA1^LR)i@o7vYaS#LrvFp#QTkH?60hnSl+?)0*B-mLD(pN6*E#!JER9rG;vg@FJ&J zvczh!gy-erYM#SpvE=FY$Exyj&4tc%^C-#?Z(${^&ojf8m*sPpizQQNjeUW~SJ*sJ zA3GdX$Oz==J5K^+gSqaBZ>T{&cHJ1+fopn1ycl{|FuPz~p7ou6;=0K_A}4K4cNdi+ z05AY#2$n9ozrVPy4&F%>;k=nz_?g+6wGqR{%EhuYfz<{ZdW!!US@87zlYO9Gr?EOM zJh~QX$(3rL&Nx4fvYUyz{r7~QaS712P>sJ|@EQog?{N^ZmgpKhz7JW3$e;xAtdCf> z1N5M_3esaivK5eQd>(CA#Iil$4iwpJMcLKiXVQz9t^OpQrxfz6#Dq+bSXNbJ%d^98 zYyDX~i&@0->;UOel-&Z4JzxYRm>K$W=RQ&tT#(nS+vOE0Cboht7p@B1!+BYP!79A& zTJe2cLx+|GdJ#u|^8cCVbDUC*)QU$GhfyaDACC4M=$~rwLhYu8uN4kzU_S!qB4?fA zx|-BWtT!JTeQ%kYK;u}30~S!s9MM03=NUUK*v8wHXJ@viHKj^+Im^q94y2vFs5eY4 zrb=~Ev$yb|isq=!Kk6AhZ2)LsDVDHH67Bv6ehO{kpIT($60c8=oPY{ra_TjtTVcJ$ zA3u)ggky*%$E(}>Nv-hLp1|Xv9iU}3!XEKYJA}Pjuo3OsIY82y+Q#0tN83SIe1!+d zHz-XyFFMsU!dc+#IAL%)K_P+TW_u?KH>(@>Ma)ep+i{Bk-&g5@9`gp@nFfym9598D z5#A2qEj}I3$hXt{2VEb*cQ=|x2*Fc)FSP0i2+t zYZq{jqaF7)v2ECa(060B^~Xk+9eV%E!Fk@ci$2z_McSXzBG>zA*%e6C0L@+NAE<>N z{rpCTWeXm*hV~6Geo_v~M|jocC}20Sw!LQUc%G~P70$D0nZgURpqexwHoFCMnC?%p z7>`0uH9R*9T9X!U&C~jlhb>BWBRFRRjL{Kl*0cKXEMr~u|l_NJQ1%43j?OPmgGd{VS=`Vv=0{aLLLX{7Oj*k`-cX%hvrhlE{ z2INb|phrxu-)(+6FnS1{HAa`xc)k?|K>2OQi7|()KN~aijDkGD>R8he1NUknbMW9? zY11!mJAYo-s)e7QrbW(zBINpgRC-6K%p^`8k~# zv3BUS+nr-j;4M|=Lst7&$F(zvpKx;W{V}Ckw$X> z*M9u}u#tuBpo`2QdtJ+}(jq5Q$n^;}W@y2So~B80`owj!hegiVlyII8nu_nGs1|-> znw(j!vhruczU?rM9Zxf5yM`>(5P<_Ci`>yL_`+?6XyZ!6!OYhLf3*dQub;aE0^Tg=&OH=fxV@-`T zeB$zC{2|77Dy_tAgj-9o-7OlmoAv{Buq(!Lp2hEcLM`?~yQeM|%C%MDA@8%p*nVKb z5cDyfsF%Vo5lamI=k~)>?y$Gj*#_JJ z*3JRZm-|}aJdBas^%I^4hh8%8FSxNK!$zS?y0LnrDW(-%Re_W$>^|AOT^66+&c@rr zdBrHTL-Ba8)V$$UL`ho+RjIWpy$JkUk@E}m7T>(Rp!l61 zFpRtYLVJR_o&xnAwmvc5E{m(HqO<8vfJ4Tj4X8z;FHv$jPL<5TAn^vyk+kE8GT2od zOD#Br40i{Klgui`k`jugP!a{~mgk@+!V8MsE#itWd2zsUR)t5dz9!vLm9Gzfte~*@ zS>5$VI>qFF%o=aceCYY`z>xfehO;IYW#i!%|$F8 z&*pq=AJ2wo1oMgo5>}L39Lr7|%jq}^6CcnXA|+3s^4KlC0IXCUL`tQ0pvT=y3}LhL z^t8tmU4_WMMseGh`}8!Ov|R}A>jg0m#5#{zLBb~&LtafEy&SQDgKzW$ zx`J;M3v?||V!ns!qzaW%yFNAMcKRQb-L0a28M+9$p-&Z(81l4kf6(m|L#Ob5l&t6j ziF0AVRZuO9n{K;a1@{X&|IU8F+v4%?L`V2}dt%pMxJP&>8vOORQ;_DGF;$M+1r?zQ z=O4@C8wu0lZFPJzVFm_twecN=SvW6yIKHhg2P3|Q_};?Y@S-%@UdURc>dacH1>)XK zy4}WhO7)TIdos65I~C!G@Fm+C*>jgvpLs>9w@q2UCvYn9~ zeWWXy_0koA-9r25 z3_v4i)?)H7AUdxI6zv?ip`x8j~|C z>3x+Vv||04ha!6h%c%$Tm3Q;kt@OH$S1o5&MQZMpQ?Yh}?}aL9jvuIq?C3w<+<=JF zWT~ymbz`Poy!P?>+Q)dNgFr|!0hs9vs2_-vc#cXS1zC`JC_x5hI?o9iZ*Jj2%2F$# z@^nsfCv8XwQ3m8dy?6W_mh}BwEP>jr{~Mlc`$u@P{~zJWX->m8*wTe3Uw6ZkEZXlu zw8iD4zbqj)zC&-MgW%R6E2Q1#HZGutcbBvsLMcVK5ZQC5EbTWpI?2-4?5ZN1khYIE zcT=IL?`AuNM(GM*9YmlVeWm)uI03>_X{*duK2+|M>XDfQx+1enDC}PdM`S4igJcuQ zcMaRE2s@;!@hW!o1=KxglhAb6dFcQa*(Mn509LRYIYZdC6T5^9Y&+I+z$96^%B~1e zX)6$HF$u=`Xd;vPHyN#j4m`A-hd zz|flY8QBiJAYJ4T4l8oJsZZ11_~88$adtD3+sTw-5!uBRbM z(LVwORTF5QqwRRpE(oTyNz7wu`T*zMW-=m+u4bZR`AA7@vZk3cz(juZ&aUV6_i60% zX1YG{#4S8;5u(MiKu^m2BE*=Ba*_BJ=r|2K?wl5WE*IzG`fBW;7Jhe947?wl_g;`o z)z!vplgeMj^NC68D>stXS8x&rL?eT$!SNymkP0bcwR2b#b1OAYw`vZ$EHCrt~c|! zTe`rc)&GKf@4~5UN3h+B^U2P;>e}i&xd;7s!@Ix%h3&|$2wu0bT95c|l})=i-Q_~C z-9~`Fpq!cYm}rywM_m$r8(QuQ+r*MB6ypO@PDo%#^pEj4)0|6&W|Y+U$GfjDcoI0k z$#L9O)3(o(yT?Bm$vLR7n(RpMnvGS9{}yT5W5& )xV-@gmy~RcB9jtj9|meZu`d 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 diff --git a/tests/fixtures.h b/tests/fixtures.h deleted file mode 100644 index 3469b6bb9..000000000 --- a/tests/fixtures.h +++ /dev/null @@ -1,184 +0,0 @@ -#pragma once - -#include -#include -#include -#include - - -// fixture providing a temporary directory, and a temporary home directory within that directory -// overwrites HOME environment variable to ensure desktop files etc. are not installed in the system -class AppImageKitTest : public ::testing::Test { -private: - char* oldHome; - char* oldXdgDataHome; - char* oldXdgConfigHome; - -public: - std::string tempDir; - std::string tempHome; - -protected: - std::string appImage_type_1_file_path; - std::string appImage_type_2_file_path; - std::string appImage_type_2_versioned_path; - std::string appImage_type_2_terminal_file_path; - std::string appImage_type_2_shall_not_integrate_path; - -public: - AppImageKitTest() { - char* tmpl = strdup("/tmp/AppImageKit-unit-tests-XXXXXX"); - tempDir = mkdtemp(tmpl); - free(tmpl); - - tempHome = tempDir + "/HOME"; - - mkdir(tempHome.c_str(), 0700); - - oldHome = getenv("HOME"); - oldXdgDataHome = getenv("XDG_DATA_HOME"); - oldXdgConfigHome = getenv("XDG_CONFIG_HOME"); - - std::string newXdgDataHome = tempHome + "/.local/share"; - std::string newXdgConfigHome = tempHome + "/.config"; - - setenv("HOME", tempHome.c_str(), true); - setenv("XDG_DATA_HOME", newXdgDataHome.c_str(), true); - setenv("XDG_CONFIG_HOME", newXdgConfigHome.c_str(), true); - - char* xdgDataHome = xdg_data_home(); - char* xdgConfigHome = xdg_config_home(); - - EXPECT_EQ(getenv("HOME"), tempHome); - EXPECT_EQ(newXdgDataHome, xdgDataHome); - EXPECT_EQ(newXdgConfigHome, xdgConfigHome); - - free(xdgDataHome); - free(xdgConfigHome); - - appImage_type_1_file_path = std::string(TEST_DATA_DIR) + "/AppImageExtract_6-x86_64.AppImage"; - appImage_type_2_file_path = std::string(TEST_DATA_DIR) + "/Echo-x86_64.AppImage"; - appImage_type_2_versioned_path = std::string(TEST_DATA_DIR) + "/Echo-test1234-x86_64.AppImage"; - appImage_type_2_shall_not_integrate_path = std::string(TEST_DATA_DIR) + "/Echo-no-integrate-x86_64.AppImage"; - appImage_type_2_terminal_file_path = std::string(TEST_DATA_DIR) + "/appimagetool-x86_64.AppImage"; - - EXPECT_TRUE(isFile(appImage_type_1_file_path)); - EXPECT_TRUE(isFile(appImage_type_2_file_path)); - EXPECT_TRUE(isFile(appImage_type_2_versioned_path)); - EXPECT_TRUE(isFile(appImage_type_2_terminal_file_path)); - EXPECT_TRUE(isFile(appImage_type_2_shall_not_integrate_path)); - }; - - ~AppImageKitTest() { - if (isDir(tempDir)) { - rmTree(tempDir); - } - - if (oldHome != NULL) { - setenv("HOME", oldHome, true); - } else { - unsetenv("HOME"); - } - - if (oldXdgDataHome != NULL) { - setenv("XDG_DATA_HOME", oldXdgDataHome, true); - } else { - unsetenv("XDG_DATA_HOME"); - } - - if (oldXdgConfigHome != NULL) { - setenv("XDG_CONFIG_HOME", oldXdgConfigHome, true); - } else { - unsetenv("XDG_CONFIG_HOME"); - } - } - -private: - static const int rmTree(const std::string& path) { - int rv = nftw(path.c_str(), unlinkCb, 64, FTW_DEPTH|FTW_MOUNT|FTW_PHYS); - - if (rv != 0) { - int error = errno; - std::cerr << "nftw() in rmTree(" << path << ") failed: " << strerror(error) << std::endl; - return rv; - } - - return 0; - } - - static int unlinkCb(const char* fpath, const struct stat* sb, int typeflag, struct FTW* ftwbuf) { - int rv; - - switch (typeflag) { - case FTW_D: - case FTW_DNR: - case FTW_DP: - rv = rmdir(fpath); - break; - default: - rv = unlink(fpath); - break; - } - - return rv; - }; - -public: - static const bool isFile(const std::string& path) { - struct stat st; - - if (stat(path.c_str(), &st) != 0) { - perror("Failed to call stat(): "); - return false; - } - - return S_ISREG(st.st_mode); - } - - static const bool isDir(const std::string& path) { - struct stat st; - - if (stat(path.c_str(), &st) != 0) { - perror("Failed to call stat(): "); - return false; - } - - return S_ISDIR(st.st_mode); - } - - static const std::vector splitString(const std::string& s, char delim = ' ') { - std::vector result; - - std::stringstream ss(s); - std::string item; - - while (std::getline(ss, item, delim)) { - result.push_back(item); - } - - return result; - } - - static const bool isEmptyString(const std::string& str) { - // check whether string is empty beforehand, as the string is interpreted as C string and contains a trailing \0 - if (str.empty()) - return true; - - for (int i = 0; i < str.length(); i++) { - char chr = str[i]; - if (chr != ' ' && chr != '\t') - return false; - } - - return true; - } - - static const bool stringStartsWith(const std::string& str, const std::string& prefix) { - for (int i = 0; i < prefix.length(); i++) { - if (str[i] != prefix[i]) - return false; - } - - return true; - } -}; diff --git a/tests/test_getsection.cpp b/tests/test_getsection.cpp deleted file mode 100644 index 40413d3b9..000000000 --- a/tests/test_getsection.cpp +++ /dev/null @@ -1,66 +0,0 @@ -// system headers -#include - -// library headers -#include - -// local headers -#include -#include "fixtures.h" - -extern "C" { - #include "getsection.h" -} - - -using namespace std; - - -// most simple derivative class for better naming of the tests in this file -class GetSectionCTest : public AppImageKitTest {}; - - -bool isPowerOfTwo(int number) { - return (number & (number - 1)) == 0; -} - - -TEST_F(GetSectionCTest, test_appimage_get_elf_section_offset_and_length) { - std::string appImagePath = std::string(TEST_DATA_DIR) + "/appimaged-i686.AppImage"; - - unsigned long offset, length; - - ASSERT_TRUE(appimage_get_elf_section_offset_and_length(appImagePath.c_str(), ".upd_info", &offset, &length)); - - EXPECT_GT(offset, 0); - EXPECT_GT(length, 0); - - EXPECT_PRED1(isPowerOfTwo, length); -} - - -TEST_F(GetSectionCTest, test_print_binary) { - std::string appImagePath = std::string(TEST_DATA_DIR) + "/appimaged-i686.AppImage"; - - unsigned long offset, length; - - ASSERT_TRUE(appimage_get_elf_section_offset_and_length(appImagePath.c_str(), ".upd_info", &offset, &length)); - - EXPECT_EQ(print_binary(appImagePath.c_str(), offset, length), 0); -} - - -TEST_F(GetSectionCTest, test_print_hex) { - std::string appImagePath = std::string(TEST_DATA_DIR) + "/appimaged-i686.AppImage"; - - unsigned long offset, length; - - ASSERT_TRUE(appimage_get_elf_section_offset_and_length(appImagePath.c_str(), ".sha256_sig", &offset, &length)); - - EXPECT_EQ(print_hex(appImagePath.c_str(), offset, length), 0); -} - -int main(int argc, char **argv) { - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/tests/test_libappimage.cpp b/tests/test_libappimage.cpp deleted file mode 100644 index c8c7679b1..000000000 --- a/tests/test_libappimage.cpp +++ /dev/null @@ -1,451 +0,0 @@ -#include "appimage/appimage.h" - -#include -#include - -#include -#include -#include - -#include -#include - -#include -#include - -#include "fixtures.h" - - -namespace AppImageTests { - - class LibAppImageTest : public AppImageKitTest { - protected: - void rm_file(const std::string &path) { - g_remove(path.c_str()); - } - - bool areIntegrationFilesDeployed(const std::string &path) { - gchar *sum = appimage_get_md5(path.c_str()); - - GDir *dir; - GError *error = NULL; - const gchar *filename = NULL; - - char *data_home = xdg_data_home(); - char *apps_path = g_strconcat(data_home, "/applications/", NULL); - free(data_home); - - bool found = false; - dir = g_dir_open(apps_path, 0, &error); - if (dir != NULL) { - while ((filename = g_dir_read_name(dir))) { - gchar* m = g_strrstr(filename, sum); - - if (m != NULL) - found = true; - } - g_dir_close(dir); - } - g_free(apps_path); - g_free(sum); - return found; - } - }; - - TEST_F(LibAppImageTest, appimage_get_type_invalid) { - ASSERT_EQ(appimage_get_type("/tmp", false), -1); - } - - TEST_F(LibAppImageTest, appimage_get_type_1) { - ASSERT_EQ(appimage_get_type(appImage_type_1_file_path.c_str(), false), 1); - } - - TEST_F(LibAppImageTest, appimage_get_type_2) { - ASSERT_EQ(appimage_get_type(appImage_type_2_file_path.c_str(), false), 2); - } - - TEST_F(LibAppImageTest, appimage_register_in_system_with_type1) { - ASSERT_EQ(appimage_register_in_system(appImage_type_1_file_path.c_str(), false), 0); - - ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_1_file_path)); - - appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); - } - - TEST_F(LibAppImageTest, appimage_register_in_system_with_type2) { - ASSERT_EQ(appimage_register_in_system(appImage_type_2_file_path.c_str(), false), 0); - - ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_2_file_path)); - - appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); - } - - TEST_F(LibAppImageTest, appimage_type1_register_in_system) { - ASSERT_TRUE(appimage_type1_register_in_system(appImage_type_1_file_path.c_str(), false)); - - ASSERT_TRUE(areIntegrationFilesDeployed(appImage_type_1_file_path)); - - appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); - } - - TEST_F(LibAppImageTest, appimage_type2_register_in_system) { - EXPECT_TRUE(appimage_type2_register_in_system(appImage_type_2_file_path.c_str(), false)); - - EXPECT_TRUE(areIntegrationFilesDeployed(appImage_type_2_file_path)); - appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); - } - - TEST_F(LibAppImageTest, appimage_unregister_in_system) { - ASSERT_FALSE(areIntegrationFilesDeployed(appImage_type_1_file_path)); - ASSERT_FALSE(areIntegrationFilesDeployed(appImage_type_2_file_path)); - } - - TEST_F(LibAppImageTest, appimage_get_md5) { - std::string pathToTestFile = "/some/fixed/path"; - - std::string expected = "972f4824b8e6ea26a55e9af60a285af7"; - - gchar *sum = appimage_get_md5(pathToTestFile.c_str()); - EXPECT_EQ(sum, expected); - g_free(sum); - - unlink(pathToTestFile.c_str()); - } - - TEST_F(LibAppImageTest, get_md5_invalid_file_path) { - gchar *sum = appimage_get_md5(""); - - ASSERT_TRUE(sum == NULL) << "sum is not NULL"; - } - - TEST_F(LibAppImageTest, create_thumbnail_appimage_type_1) { - appimage_create_thumbnail(appImage_type_1_file_path.c_str(), false); - - gchar *sum = appimage_get_md5(appImage_type_1_file_path.c_str()); - - char *cache_home = xdg_cache_home(); - std::string path = std::string(cache_home) - + "/thumbnails/normal/" - + std::string(sum) + ".png"; - - g_free(cache_home); - g_free(sum); - - ASSERT_TRUE(g_file_test(path.c_str(), G_FILE_TEST_EXISTS)); - - // Clean - rm_file(path); - } - - TEST_F(LibAppImageTest, create_thumbnail_appimage_type_2) { - appimage_create_thumbnail(appImage_type_2_file_path.c_str(), false); - - gchar *sum = appimage_get_md5(appImage_type_2_file_path.c_str()); - - char* cache_home = xdg_cache_home(); - std::string path = std::string(cache_home) - + "/thumbnails/normal/" - + std::string(sum) + ".png"; - - g_free(cache_home); - g_free(sum); - - ASSERT_TRUE(g_file_test(path.c_str(), G_FILE_TEST_EXISTS)); - - // Clean - rm_file(path); - } - - TEST_F(LibAppImageTest, appimage_extract_file_following_symlinks) { - std::string target_path = tempDir + "test_libappimage_tmp_file"; - appimage_extract_file_following_symlinks(appImage_type_2_file_path.c_str(), "echo.desktop", - target_path.c_str()); - - const char expected[] = ("[Desktop Entry]\n" - "Version=1.0\n" - "Type=Application\n" - "Name=Echo\n" - "Comment=Just echo.\n" - "Exec=echo %F\n" - "Icon=utilities-terminal\n"); - - ASSERT_TRUE(g_file_test(target_path.c_str(), G_FILE_TEST_EXISTS)); - - std::ifstream file(target_path.c_str(), std::ios::binary | std::ios::ate); - std::streamsize size = file.tellg(); - file.seekg(0, std::ios::beg); - - std::vector buffer(static_cast(size)); - if (file.read(buffer.data(), size)) - ASSERT_TRUE(strncmp(expected, buffer.data(), strlen(expected)) == 0); - else - FAIL(); - - // Clean - remove(target_path.c_str()); - } - - bool test_appimage_is_registered_in_system(const std::string &pathToAppImage, bool integrateAppImage) { - if (integrateAppImage) { - EXPECT_EQ(appimage_register_in_system(pathToAppImage.c_str(), false), 0); - } - - return appimage_is_registered_in_system(pathToAppImage.c_str()); - } - - TEST_F(LibAppImageTest, appimage_is_registered_in_system) { - // make sure tested AppImages are not registered - appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); - appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); - - // if the test order is false -> true, cleanup isn't necessary - - // type 1 tests - EXPECT_FALSE(test_appimage_is_registered_in_system(appImage_type_1_file_path, false)); - EXPECT_TRUE(test_appimage_is_registered_in_system(appImage_type_1_file_path, true)); - - // type 2 tests - EXPECT_FALSE(test_appimage_is_registered_in_system(appImage_type_2_file_path, false)); - EXPECT_TRUE(test_appimage_is_registered_in_system(appImage_type_2_file_path, true)); - - // cleanup - appimage_unregister_in_system(appImage_type_1_file_path.c_str(), false); - appimage_unregister_in_system(appImage_type_2_file_path.c_str(), false); - } - - TEST_F(LibAppImageTest, appimage_list_files_false_appimage) { - - char **files = appimage_list_files("/bin/ls"); - - char *expected[] = {NULL}; - - int i = 0; - for (; files[i] != NULL && expected[i] != NULL; i++) - EXPECT_STREQ(files[i], expected[i]); - - appimage_string_list_free(files); - - if (i != 0) - FAIL(); - } - - TEST_F(LibAppImageTest, appimage_list_files_type_1) { - - char **files = appimage_list_files(appImage_type_1_file_path.c_str()); - - const char *expected[] = { - (char *) "AppImageExtract.desktop", - (char *) ".DirIcon", - (char *) "AppImageExtract.png", - (char *) "usr/bin/appimageextract", - (char *) "AppRun", - (char *) "usr/bin/xorriso", - (char *) "usr/lib/libburn.so.4", - (char *) "usr/lib/libisoburn.so.1", - (char *) "usr/lib/libisofs.so.6", - NULL}; - - int i = 0; - for (; files[i] != NULL && expected[i] != NULL; i++) - EXPECT_STREQ(files[i], expected[i]); - - appimage_string_list_free(files); - if (i != 9) - FAIL(); - } - - TEST_F(LibAppImageTest, appimage_list_files_type_2) { - - char **files = appimage_list_files(appImage_type_2_file_path.c_str()); - - char *expected[] = { - (char *) ".DirIcon", - (char *) "AppRun", - (char *) "echo.desktop", - (char *) "usr", - (char *) "usr/bin", - (char *) "usr/bin/echo", - (char *) "utilities-terminal.svg", - NULL}; - - int i = 0; - for (; files[i] != NULL && expected[i] != NULL; i++) - EXPECT_STREQ(files[i], expected[i]); - - appimage_string_list_free(files); - if (i != 7) - FAIL(); - } - - TEST_F(LibAppImageTest, test_appimage_registered_desktop_file_path_not_registered) { - EXPECT_TRUE(appimage_registered_desktop_file_path(appImage_type_1_file_path.c_str(), NULL, false) == NULL); - EXPECT_TRUE(appimage_registered_desktop_file_path(appImage_type_2_file_path.c_str(), NULL, false) == NULL); - } - - TEST_F(LibAppImageTest, test_appimage_registered_desktop_file_path_type1) { - EXPECT_TRUE(appimage_type1_register_in_system(appImage_type_1_file_path.c_str(), false)); - - char* desktop_file_path = appimage_registered_desktop_file_path(appImage_type_1_file_path.c_str(), NULL, false); - - EXPECT_TRUE(desktop_file_path != NULL); - - free(desktop_file_path); - } - - TEST_F(LibAppImageTest, test_appimage_registered_desktop_file_path_type2) { - EXPECT_TRUE(appimage_type2_register_in_system(appImage_type_2_file_path.c_str(), false)); - - char* desktop_file_path = appimage_registered_desktop_file_path(appImage_type_2_file_path.c_str(), NULL, false); - - EXPECT_TRUE(desktop_file_path != NULL); - - free(desktop_file_path); - } - - TEST_F(LibAppImageTest, test_appimage_registered_desktop_file_path_type1_precalculated_md5) { - EXPECT_TRUE(appimage_type1_register_in_system(appImage_type_1_file_path.c_str(), false)); - - char* md5 = appimage_get_md5(appImage_type_1_file_path.c_str()); - char* desktop_file_path = appimage_registered_desktop_file_path(appImage_type_1_file_path.c_str(), md5, false); - free(md5); - - EXPECT_TRUE(desktop_file_path != NULL); - - free(desktop_file_path); - } - - TEST_F(LibAppImageTest, test_appimage_registered_desktop_file_path_type2_precalculated_md5) { - EXPECT_TRUE(appimage_type2_register_in_system(appImage_type_2_file_path.c_str(), false)); - - char* md5 = appimage_get_md5(appImage_type_2_file_path.c_str()); - char* desktop_file_path = appimage_registered_desktop_file_path(appImage_type_2_file_path.c_str(), md5, false); - free(md5); - - EXPECT_TRUE(desktop_file_path != NULL); - - free(desktop_file_path); - } - - TEST_F(LibAppImageTest, test_appimage_registered_desktop_file_path_type1_wrong_md5) { - EXPECT_TRUE(appimage_type1_register_in_system(appImage_type_1_file_path.c_str(), false)); - - char* md5 = strdup("abcdefg"); - char* desktop_file_path = appimage_registered_desktop_file_path(appImage_type_1_file_path.c_str(), md5, false); - free(md5); - - EXPECT_TRUE(desktop_file_path == NULL); - - free(desktop_file_path); - } - - TEST_F(LibAppImageTest, test_appimage_registered_desktop_file_path_type2_wrong_md5) { - EXPECT_TRUE(appimage_type2_register_in_system(appImage_type_2_file_path.c_str(), false)); - - char* md5 = strdup("abcdefg"); - char* desktop_file_path = appimage_registered_desktop_file_path(appImage_type_2_file_path.c_str(), md5, false); - free(md5); - - EXPECT_TRUE(desktop_file_path == NULL); - - free(desktop_file_path); - } - - TEST_F(LibAppImageTest, test_appimage_type2_appimage_version) { - EXPECT_TRUE(appimage_type2_register_in_system(appImage_type_2_versioned_path.c_str(), false)); - - char* desktopFilePath = appimage_registered_desktop_file_path(appImage_type_2_versioned_path.c_str(), NULL, false); - - GKeyFile *desktopFile = g_key_file_new(); - - GError* error = NULL; - - gboolean loaded = g_key_file_load_from_file(desktopFile, desktopFilePath, G_KEY_FILE_KEEP_TRANSLATIONS, &error); - - if (!loaded) { - g_key_file_free(desktopFile); - ADD_FAILURE() << "Failed to read desktop file: " << error->message; - g_error_free(error); - return; - } - - const std::string versionKey = "X-AppImage-Version"; - const std::string oldNameKey = "X-AppImage-Old-Name"; - - std::string expectedVersion = "test1234"; - gchar* actualVersion = g_key_file_get_string(desktopFile, G_KEY_FILE_DESKTOP_GROUP, versionKey.c_str(), &error); - - if (actualVersion == NULL) { - g_key_file_free(desktopFile); - ADD_FAILURE() << "Failed to get " << versionKey << " key: " << error->message; - g_error_free(error); - return; - } - - EXPECT_EQ(expectedVersion, std::string(actualVersion)); - - gchar* oldName = g_key_file_get_string(desktopFile, G_KEY_FILE_DESKTOP_GROUP, oldNameKey.c_str(), &error); - - if (oldName == NULL) { - g_key_file_free(desktopFile); - ADD_FAILURE() << "Failed to get " << oldNameKey << " key: " << error->message; - g_error_free(error); - return; - } - - gchar* newName = g_key_file_get_string(desktopFile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, &error); - - if (newName == NULL) { - g_key_file_free(desktopFile); - ADD_FAILURE() << "Failed to get " << G_KEY_FILE_DESKTOP_KEY_NAME << " key: " << error->message; - g_error_free(error); - return; - } - - std::string expectedName = std::string(oldName) + " (" + expectedVersion + ")"; - - EXPECT_EQ(expectedName, std::string(newName)); - - // cleanup - g_key_file_free(desktopFile); - if (error != NULL) - g_error_free(error); - } - - TEST_F(LibAppImageTest, test_try_exec_key_exists_type_1) { - const std::string& pathToAppImage = appImage_type_1_file_path; - - ASSERT_EQ(appimage_register_in_system(pathToAppImage.c_str(), false), 0); - - GKeyFile* kf = g_key_file_new(); - - const char* desktopFilePath = appimage_registered_desktop_file_path(pathToAppImage.c_str(), NULL, false); - - ASSERT_TRUE(g_key_file_load_from_file(kf, desktopFilePath, G_KEY_FILE_NONE, NULL)); - - const char* expectedTryExecValue = g_key_file_get_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TRY_EXEC, NULL); - - EXPECT_EQ(expectedTryExecValue, pathToAppImage); - } - - TEST_F(LibAppImageTest, test_try_exec_key_exists_type_2) { - const std::string& pathToAppImage = appImage_type_2_file_path; - - ASSERT_EQ(appimage_register_in_system(pathToAppImage.c_str(), false), 0); - - GKeyFile* kf = g_key_file_new(); - - const char* desktopFilePath = appimage_registered_desktop_file_path(pathToAppImage.c_str(), NULL, false); - - ASSERT_TRUE(g_key_file_load_from_file(kf, desktopFilePath, G_KEY_FILE_NONE, NULL)); - - const char* expectedTryExecValue = g_key_file_get_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TRY_EXEC, NULL); - - EXPECT_EQ(expectedTryExecValue, pathToAppImage); - } - -} // namespace - -int main(int argc, char **argv) { - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/tests/test_shared.cpp b/tests/test_shared.cpp deleted file mode 100644 index 963c2c2da..000000000 --- a/tests/test_shared.cpp +++ /dev/null @@ -1,264 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "fixtures.h" - -extern "C" { - #include "shared.h" -} - - -using namespace std; - - -// most simple derivative class for better naming of the tests in this file -class SharedCTest : public AppImageKitTest {}; - - -TEST_F(SharedCTest, test_write_desktop_file_exec) { - // install Cura desktop file into temporary HOME with some hardcoded paths - stringstream pathToOriginalDesktopFile; - pathToOriginalDesktopFile << TEST_DATA_DIR << "/" << "Cura.desktop"; - ifstream ifs(pathToOriginalDesktopFile.str().c_str()); - - ASSERT_TRUE(ifs) << "Failed to open file: " << pathToOriginalDesktopFile.str(); - - ifs.seekg(0, ios::end); - unsigned long bufferSize = static_cast(ifs.tellg() + 1); - ifs.seekg(0, ios::beg); - - // should be large enough - vector buffer(bufferSize, '\0'); - - // read in desktop file - ifs.read(buffer.data(), buffer.size()); - - GError* error = NULL; - - GKeyFile *keyFile = g_key_file_new(); - gboolean success = g_key_file_load_from_data(keyFile, buffer.data(), buffer.size(), G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &error); - - ASSERT_EQ(error, NULL) << "Error while creating key file from data: " << error->message; - - gchar desktop_filename[] = "desktop_filename"; - gchar md5testvalue[] = "md5testvalue"; - - if (success) { - write_edited_desktop_file(keyFile, "testpath", desktop_filename, 1, md5testvalue, false); - } - - g_key_file_free(keyFile); - - stringstream pathToInstalledDesktopFile; - pathToInstalledDesktopFile << tempHome << g_strdup_printf("/.local/share/applications/appimagekit_%s-%s", md5testvalue, desktop_filename); - - // now, read original and installed desktop file, and compare both - ifstream originalStrm(pathToOriginalDesktopFile.str().c_str()); - ifstream installedStrm(pathToInstalledDesktopFile.str().c_str()); - - ASSERT_TRUE(originalStrm) << "Failed to open desktop file " << pathToOriginalDesktopFile.str(); - ASSERT_TRUE(installedStrm) << "Failed to open desktop file " << pathToInstalledDesktopFile.str(); - - originalStrm.seekg(0, ios::end); - unsigned long originalStrmSize = static_cast(originalStrm.tellg() + 1); - originalStrm.seekg(0, ios::beg); - - installedStrm.seekg(0, ios::end); - unsigned long installedStrmSize = static_cast(installedStrm.tellg() + 1); - installedStrm.seekg(0, ios::beg); - - // split both files by lines, then convert to key-value list, and check whether all lines from original file - // are also available in the installed file - // some values modified by write_edited_desktop_file need some extra checks, which can be performed then. - vector originalData(originalStrmSize, '\0'); - vector installedData(installedStrmSize, '\0'); - - originalStrm.read(originalData.data(), originalData.size()); - installedStrm.read(installedData.data(), installedData.size()); - - vector originalLines = splitString(originalData.data(), '\n'); - vector installedLines = splitString(installedData.data(), '\n'); - // first of all, remove all empty lines - // ancient glib versions like the ones CentOS 6 provides tend to introduce a blank line before the - // [Desktop Entry] header, hence the blank lines need to be stripped out before the next step - originalLines.erase(std::remove_if(originalLines.begin(), originalLines.end(), isEmptyString), originalLines.end()); - installedLines.erase(std::remove_if(installedLines.begin(), installedLines.end(), isEmptyString), installedLines.end()); - // first line should be "[Desktop Entry]" header - ASSERT_EQ(originalLines.front(), "[Desktop Entry]"); - ASSERT_EQ(installedLines.front(), "[Desktop Entry]"); - // drop "[Desktop Entry]" header - originalLines.erase(originalLines.begin()); - installedLines.erase(installedLines.begin()); - - // now, create key-value maps - map entries; - - // sort original entries into map - for (vector::const_iterator line = originalLines.begin(); line != originalLines.end(); line++) { - vector lineSplit = splitString(*line, '='); - ASSERT_EQ(lineSplit.size(), 2) << "line: " << *line; - entries.insert(std::make_pair(lineSplit[0], lineSplit[1])); - } - - // now, remove all entries found in installed desktop entry from entries - for (vector::iterator line = installedLines.begin(); line != installedLines.end();) { - vector lineSplit = splitString(*line, '='); - ASSERT_EQ(lineSplit.size(), 2) << "Condition failed for line: " << *line; - - const string& key = lineSplit[0]; - const string& value = lineSplit[1]; - - if (stringStartsWith(key, "X-AppImage-")) { - // skip this entry - line++; - continue; - } - - map::const_iterator entry = entries.find(key); - - if (entry == entries.end()) - FAIL() << "No such entry in desktop file: " << key; - - if (key == "Exec" || key == "TryExec") { - vector execSplit = splitString(value); - ASSERT_GT(execSplit.size(), 0) << "key: " << key; - ASSERT_EQ(execSplit[0], "testpath") << "key: " << key; - - vector originalExecSplit = splitString((*entry).second); - ASSERT_EQ(execSplit.size(), originalExecSplit.size()) - << key << ": " << value << " and " << (*entry).second << " contain different number of parameters"; - - // the rest of the split parts should be equal - for (int i = 1; i < execSplit.size(); i++) { - ASSERT_EQ(execSplit[i], originalExecSplit[i]); - } - } else if (key == "Icon") { - ASSERT_EQ(value, g_strdup_printf("appimagekit_%s_cura-icon", md5testvalue)); - } else { - ASSERT_EQ(value, (*entry).second); - } - - installedLines.erase(line); - } - - // finally, handle X-AppImage- entries - for (vector::iterator line = installedLines.begin(); line != installedLines.end();) { - if (stringStartsWith(*line, "X-AppImage-Comment")) { - ASSERT_EQ(*line, "X-AppImage-Comment=Generated by appimaged AppImageKit unit tests"); - } else if (stringStartsWith(*line, "X-AppImage-Identifier")) { - ASSERT_EQ(*line, g_strdup_printf("X-AppImage-Identifier=%s", md5testvalue)); - } else if (stringStartsWith(*line, "X-AppImage-Old-")) { - // skip "old" entries, created by localization support - } else { - line++; - continue; - } - - installedLines.erase(line); - } - - ASSERT_EQ(installedLines.size(), 0); -} - -TEST_F(SharedCTest, test_appimage_type1_is_terminal_app) { - // TODO: add type 1 AppImage with Terminal=false - EXPECT_EQ(appimage_type1_is_terminal_app(appImage_type_1_file_path.c_str()), 1); - EXPECT_EQ(appimage_type1_is_terminal_app(appImage_type_2_file_path.c_str()), -1); - EXPECT_EQ(appimage_type1_is_terminal_app("/invalid/path"), -1); -} - -TEST_F(SharedCTest, test_appimage_type2_is_terminal_app) { - EXPECT_EQ(appimage_type2_is_terminal_app(appImage_type_1_file_path.c_str()), -1); - EXPECT_EQ(appimage_type2_is_terminal_app(appImage_type_2_terminal_file_path.c_str()), 1); - EXPECT_EQ(appimage_type2_is_terminal_app(appImage_type_2_file_path.c_str()), 0); - EXPECT_EQ(appimage_type2_is_terminal_app("/invalid/path"), -1); -} - -TEST_F(SharedCTest, test_appimage_is_terminal_app) { - EXPECT_EQ(appimage_is_terminal_app(appImage_type_1_file_path.c_str()), 1); - EXPECT_EQ(appimage_is_terminal_app(appImage_type_2_file_path.c_str()), 0); - // TODO: add type 1 AppImage with Terminal=true - //EXPECT_EQ(appimage_is_terminal_app(appImage_type_1_terminal_file_path.c_str()), 1); - EXPECT_EQ(appimage_is_terminal_app(appImage_type_2_terminal_file_path.c_str()), 1); - EXPECT_EQ(appimage_is_terminal_app("/invalid/path"), -1); -} - -TEST_F(SharedCTest, test_appimage_type1_shall_not_integrate) { - // TODO: add type 1 AppImage with X-AppImage-Integrate=false - //EXPECT_EQ(appimage_is_terminal_app(appImage_type_1_shall_not_integrate_path.c_str()), 1); - EXPECT_EQ(appimage_type1_shall_not_be_integrated(appImage_type_1_file_path.c_str()), 0); - EXPECT_EQ(appimage_type1_shall_not_be_integrated(appImage_type_2_file_path.c_str()), -1); - EXPECT_EQ(appimage_type1_shall_not_be_integrated("/invalid/path"), -1); -} - -TEST_F(SharedCTest, test_appimage_type2_shall_not_integrate) { - EXPECT_EQ(appimage_type2_shall_not_be_integrated(appImage_type_1_file_path.c_str()), -1); - EXPECT_EQ(appimage_type2_shall_not_be_integrated(appImage_type_2_shall_not_integrate_path.c_str()), 1); - EXPECT_EQ(appimage_type2_shall_not_be_integrated(appImage_type_2_file_path.c_str()), 0); - EXPECT_EQ(appimage_type2_shall_not_be_integrated("/invalid/path"), -1); -} - -TEST_F(SharedCTest, test_appimage_shall_not_integrate) { - EXPECT_EQ(appimage_shall_not_be_integrated(appImage_type_1_file_path.c_str()), 0); - EXPECT_EQ(appimage_shall_not_be_integrated(appImage_type_2_file_path.c_str()), 0); - // TODO: add type 1 AppImage with X-AppImage-Integrate=false - //EXPECT_EQ(appimage_shall_not_be_integrated(appImage_type_1_shall_not_integrate_path.c_str()), 1); - EXPECT_EQ(appimage_shall_not_be_integrated(appImage_type_2_shall_not_integrate_path.c_str()), 1); - EXPECT_EQ(appimage_is_terminal_app("/invalid/path"), -1); -} - -static bool test_strcmp(char* a, char* b) { - return strcmp(a, b) == 0; -} - -TEST_F(SharedCTest, test_appimage_hexlify) { - { - char bytesIn[] = "\x00\x01\x02\x03\x04\x05\x06\x07"; - char expectedHex[] = "0001020304050607"; - - char* hexlified = appimage_hexlify(bytesIn, 8); - EXPECT_PRED2(test_strcmp, hexlified, expectedHex); - - // cleanup - free(hexlified); - } - { - char bytesIn[] = "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"; - char expectedHex[] = "f8f9fafbfcfdfeff"; - - char* hexlified = appimage_hexlify(bytesIn, 8); - EXPECT_PRED2(test_strcmp, hexlified, expectedHex); - - // cleanup - free(hexlified); - } -} - -// compares whether the size first bytes of two given byte buffers are equal -bool test_compare_bytes(const char* buf1, const char* buf2, int size) { - for (int i = 0; i < size; i++) { - if (buf1[i] != buf2[i]) { - return false; - } - } - - return true; -} - -TEST_F(SharedCTest, appimage_type2_digest_md5) { - char digest[16]; - char expectedDigest[] = {-20, 92, -89, 99, -47, -62, 14, 36, -5, -127, 65, -126, 116, -41, -33, -121}; - - EXPECT_TRUE(appimage_type2_digest_md5(appImage_type_2_file_path.c_str(), digest)); - EXPECT_PRED3(test_compare_bytes, digest, expectedDigest, 16); -} - -int main(int argc, char **argv) { - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} From bb825e8c57f9347e52533864ff789035d29fece0 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 23 Aug 2018 12:47:25 +0200 Subject: [PATCH 341/544] Prevent usage of Travis build script outside Travis --- travis/travis-build.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/travis/travis-build.sh b/travis/travis-build.sh index 14f328ae7..76bc37429 100644 --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -3,6 +3,11 @@ set -e set -x +if [ "$CI" == "" ]; then + echo "Not running on CI system, aborting to prevent damage from system" + exit 2 +fi + case "$ARCH" in "x86_64") export ARCH="x86_64" From 7fee7833942b25c29f3e9e54738b1911afd2162e Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 23 Aug 2018 16:52:12 +0200 Subject: [PATCH 342/544] Update libappimage --- lib/libappimage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libappimage b/lib/libappimage index 27ec5e788..406792e76 160000 --- a/lib/libappimage +++ b/lib/libappimage @@ -1 +1 @@ -Subproject commit 27ec5e7887b6961cbe7ed7c4f4f9b784328e5c02 +Subproject commit 406792e7637edd4adad0e866b42e59b96c8b4a2f From 4e5c4cdeb74654d315c5838ca12a25ea4fb817f3 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 23 Aug 2018 17:12:11 +0200 Subject: [PATCH 343/544] Tests are managed within libappimage --- build.sh | 6 ------ 1 file changed, 6 deletions(-) diff --git a/build.sh b/build.sh index b015a12e1..315b10c0a 100755 --- a/build.sh +++ b/build.sh @@ -80,12 +80,6 @@ if [ -d /deps/lib ]; then export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":/deps/lib/ fi -ldd tests/test_* - -if [ $RUN_TESTS -ne 0 ]; then - ctest -V -fi - xxd src/runtime | head -n 1 # Do NOT strip runtime From aa8f7db1eb0a54586ac4847f6e6a1b74a2aaf47b Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Mon, 3 Sep 2018 16:35:30 +0200 Subject: [PATCH 344/544] Fix desktop integration check Fixes https://github.com/TheAssassin/AppImageLauncher/issues/46. --- lib/libappimage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libappimage b/lib/libappimage index 406792e76..2714f17ec 160000 --- a/lib/libappimage +++ b/lib/libappimage @@ -1 +1 @@ -Subproject commit 406792e7637edd4adad0e866b42e59b96c8b4a2f +Subproject commit 2714f17ecb4ff50734135b21aa01d4b30fd3820b From cdbbdb74bb432d1ac544ef17a2c83d287c71d6c2 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 6 Sep 2018 14:01:09 +0200 Subject: [PATCH 345/544] Remove unnecessary dependency inotify-tools --- cmake/dependencies.cmake | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 02190dc11..d702f96dd 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -29,37 +29,6 @@ set(CPPFLAGS ${DEPENDENCIES_CPPFLAGS}) set(LDFLAGS ${DEPENDENCIES_LDFLAGS}) -set(USE_SYSTEM_INOTIFY_TOOLS OFF CACHE BOOL "Use system libinotifytools instead of building our own") - -if(NOT USE_SYSTEM_INOTIFY_TOOLS) - message(STATUS "Downloading and building inotify-tools") - - # TODO: build out of source - ExternalProject_Add(inotify-tools-EXTERNAL - URL https://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz - URL_HASH SHA512=6074d510e89bba5da0d7c4d86f2562c662868666ba0a7ea5d73e53c010a0050dd1fc01959b22cffdb9b8a35bd1b0b43c04d02d6f19927520f05889e8a9297dfb - PATCH_COMMAND ${WGET} -N --content-disposition "https://raw.githubusercontent.com/AppImage/external-resources/master/patches/config.guess" - COMMAND ${WGET} -N --content-disposition "https://raw.githubusercontent.com/AppImage/external-resources/master/patches/config.sub" - UPDATE_COMMAND "" # ${MAKE} sure CMake won't try to fetch updates unnecessarily and hence rebuild the dependency every time - CONFIGURE_COMMAND CC=${CC} CXX=${CXX} CFLAGS=${CFLAGS} LDFLAGS=${LDFLAGS} /configure --enable-shared --enable-static --enable-doxygen=no --prefix= --libdir=/lib ${EXTRA_CONFIGURE_FLAGS} - BUILD_COMMAND ${MAKE} - BUILD_IN_SOURCE ON - INSTALL_COMMAND ${MAKE} install - ) - - import_external_project( - TARGET_NAME inotify-tools - EXT_PROJECT_NAME inotify-tools-EXTERNAL - LIBRARIES "/lib/libinotifytools.a" - INCLUDE_DIRS "/include/" - ) -else() - message(STATUS "Using system inotify-tools") - - import_find_pkg_target(inotify-tools INotify INOTIFYTOOLS) -endif() - - # TODO: allow using system wide mksquashfs set(mksquashfs_cflags "-DXZ_SUPPORT ${CFLAGS}") From 279b15c9f90d84df494d2a315111c4fd2d33421c Mon Sep 17 00:00:00 2001 From: Chris Roberts Date: Fri, 7 Sep 2018 10:07:32 -0700 Subject: [PATCH 346/544] Mount within TMPDIR when environment variable is set --- src/runtime.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index fabeb6973..b2dd7a4bc 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -714,15 +714,20 @@ int main(int argc, char *argv[]) { int dir_fd, res; + char temp_base[PATH_MAX] = "/tmp"; + if (getenv("TMPDIR") != NULL) + strcpy(temp_base, getenv("TMPDIR")); + size_t templen = strlen(temp_base); char mount_dir[64]; size_t namelen = strlen(basename(argv[0])); if(namelen>6){ namelen=6; } - strncpy(mount_dir, "/tmp/.mount_", 12); - strncpy(mount_dir+12, basename(argv[0]), namelen); - strncpy(mount_dir+12+namelen, "XXXXXX", 6); - mount_dir[12+namelen+6] = 0; // null terminate destination + strcpy(mount_dir, temp_base); + strncpy(mount_dir+templen, "/.mount_", 8); + strncpy(mount_dir+templen+8, basename(argv[0]), namelen); + strncpy(mount_dir+templen+8+namelen, "XXXXXX", 6); + mount_dir[templen+8+namelen+6] = 0; // null terminate destination char filename[100]; /* enough for mount_dir + "/AppRun" */ pid_t pid; From 005066b93010723390f0ffec8d8d11aa9042c468 Mon Sep 17 00:00:00 2001 From: Chris Roberts Date: Tue, 11 Sep 2018 07:52:17 -0700 Subject: [PATCH 347/544] Use glibc P_tmpdir macro for default temporary directory location Provide error information on failure to create temporary directory. Expand mount path for display when mounting appimage. --- src/runtime.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index b2dd7a4bc..47ac7ddba 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -585,7 +585,7 @@ int main(int argc, char *argv[]) { } if (arg && strcmp(arg, "appimage-extract-and-run") == 0) { - char temp_base[PATH_MAX] = "/tmp"; + char temp_base[PATH_MAX] = P_tmpdir; const char* const TMPDIR = getenv("TMPDIR"); if (TMPDIR != NULL) @@ -714,11 +714,11 @@ int main(int argc, char *argv[]) { int dir_fd, res; - char temp_base[PATH_MAX] = "/tmp"; + char temp_base[PATH_MAX] = P_tmpdir; if (getenv("TMPDIR") != NULL) strcpy(temp_base, getenv("TMPDIR")); size_t templen = strlen(temp_base); - char mount_dir[64]; + char mount_dir[templen + 60]; size_t namelen = strlen(basename(argv[0])); if(namelen>6){ namelen=6; @@ -729,12 +729,14 @@ int main(int argc, char *argv[]) { strncpy(mount_dir+templen+8+namelen, "XXXXXX", 6); mount_dir[templen+8+namelen+6] = 0; // null terminate destination - char filename[100]; /* enough for mount_dir + "/AppRun" */ + size_t mount_dir_size = strlen(mount_dir); + char filename[mount_dir_size + 8]; /* enough for mount_dir + "/AppRun" */ pid_t pid; char **real_argv; int i; if (mkdtemp(mount_dir) == NULL) { + perror ("create mount dir error"); exit (1); } @@ -814,7 +816,11 @@ int main(int argc, char *argv[]) { real_argv[i] = NULL; if(arg && strcmp(arg,"appimage-mount")==0) { - printf("%s\n", mount_dir); + char real_mount_dir[PATH_MAX]; + if (realpath(mount_dir, real_mount_dir) == real_mount_dir) + printf("%s\n", real_mount_dir); + else + printf("%s\n", mount_dir); for (;;) pause(); } From 80f3320843fb05ed69a578badb9138c3b0a9feaf Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 12 Sep 2018 20:02:32 +0200 Subject: [PATCH 348/544] Fix codacy warning --- src/runtime.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 47ac7ddba..984890719 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -730,7 +730,6 @@ int main(int argc, char *argv[]) { mount_dir[templen+8+namelen+6] = 0; // null terminate destination size_t mount_dir_size = strlen(mount_dir); - char filename[mount_dir_size + 8]; /* enough for mount_dir + "/AppRun" */ pid_t pid; char **real_argv; int i; @@ -806,9 +805,6 @@ int main(int argc, char *argv[]) { } close (dir_fd); - strcpy (filename, mount_dir); - strcat (filename, "/AppRun"); - real_argv = malloc (sizeof (char *) * (argc + 1)); for (i = 0; i < argc; i++) { real_argv[i] = argv[i]; @@ -866,6 +862,10 @@ int main(int argc, char *argv[]) { setenv( "OWD", cwd, 1 ); } + char filename[mount_dir_size + 8]; /* enough for mount_dir + "/AppRun" */ + strcpy (3, mount_dir); + strcat (filename, "/AppRun"); + /* TODO: Find a way to get the exit status and/or output of this */ execv (filename, real_argv); /* Error if we continue here */ From 4ace9d406d5640c63a87896a29feefc2aa9556e1 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 12 Sep 2018 20:16:21 +0200 Subject: [PATCH 349/544] Move temp base dir to the top to avoid redundancy --- src/runtime.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 984890719..4cb4e780f 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -529,6 +529,16 @@ int main(int argc, char *argv[]) { #endif } + // temporary directories are required in a few places + // therefore we implement the detection of the temp base dir at the top of the code to avoid redundancy + char temp_base[PATH_MAX] = P_tmpdir; + + { + const char* const TMPDIR = getenv("TMPDIR"); + if (TMPDIR != NULL) + strcpy(temp_base, getenv("TMPDIR")); + } + fs_offset = appimage_get_elf_size(appimage_path); // error check @@ -585,13 +595,7 @@ int main(int argc, char *argv[]) { } if (arg && strcmp(arg, "appimage-extract-and-run") == 0) { - char temp_base[PATH_MAX] = P_tmpdir; - - const char* const TMPDIR = getenv("TMPDIR"); - if (TMPDIR != NULL) - strcpy(temp_base, getenv("TMPDIR")); - - char* hexlified_digest; + char* hexlified_digest = NULL; // calculate MD5 hash of file, and use it to make extracted directory name "content-aware" // see https://github.com/AppImage/AppImageKit/issues/841 for more information @@ -714,9 +718,6 @@ int main(int argc, char *argv[]) { int dir_fd, res; - char temp_base[PATH_MAX] = P_tmpdir; - if (getenv("TMPDIR") != NULL) - strcpy(temp_base, getenv("TMPDIR")); size_t templen = strlen(temp_base); char mount_dir[templen + 60]; size_t namelen = strlen(basename(argv[0])); From 8e85248869bebdd8ae981518a754a727345b4d24 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 12 Sep 2018 21:04:16 +0200 Subject: [PATCH 350/544] Fix variable name --- src/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index 4cb4e780f..923a2cd63 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -864,7 +864,7 @@ int main(int argc, char *argv[]) { } char filename[mount_dir_size + 8]; /* enough for mount_dir + "/AppRun" */ - strcpy (3, mount_dir); + strcpy (filename, mount_dir); strcat (filename, "/AppRun"); /* TODO: Find a way to get the exit status and/or output of this */ From 06a27f90e9f7b7fc92a6d8b96fb6bd310747d526 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 12 Sep 2018 21:07:02 +0200 Subject: [PATCH 351/544] Document mount_dir related variables --- src/runtime.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 923a2cd63..b81ee544c 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -719,11 +719,16 @@ int main(int argc, char *argv[]) { int dir_fd, res; size_t templen = strlen(temp_base); + + // allocate enough memory (size of name won't exceed 60 bytes) char mount_dir[templen + 60]; + size_t namelen = strlen(basename(argv[0])); - if(namelen>6){ - namelen=6; + // limit length of tempdir name + if(namelen > 6){ + namelen = 6; } + strcpy(mount_dir, temp_base); strncpy(mount_dir+templen, "/.mount_", 8); strncpy(mount_dir+templen+8, basename(argv[0]), namelen); From 00b9787b2e0494cf36d7b620e78f00c7ac2f8949 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 14 Sep 2018 04:14:08 +0200 Subject: [PATCH 352/544] Update libappimage --- lib/libappimage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libappimage b/lib/libappimage index 2714f17ec..23730b9a1 160000 --- a/lib/libappimage +++ b/lib/libappimage @@ -1 +1 @@ -Subproject commit 2714f17ecb4ff50734135b21aa01d4b30fd3820b +Subproject commit 23730b9a13c86c3a9ddb251d789f05502e5c59b2 From e38a73b5e5df0633684f00b6d197ad866b07fc7c Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 14 Sep 2018 04:27:47 +0200 Subject: [PATCH 353/544] Update libappimage --- lib/libappimage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libappimage b/lib/libappimage index 23730b9a1..d00aee7a9 160000 --- a/lib/libappimage +++ b/lib/libappimage @@ -1 +1 @@ -Subproject commit 23730b9a13c86c3a9ddb251d789f05502e5c59b2 +Subproject commit d00aee7a9b74895d70c2ced8e65e4e5461947fc9 From 032be88d204330c526ba98e0e2bdcb30bba30d08 Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Fri, 28 Sep 2018 10:40:54 +0200 Subject: [PATCH 354/544] install-build-deps.sh: avoid overwriting liblz4.pc if provided by liblz4-dev Signed-off-by: Tim Janik --- install-build-deps.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/install-build-deps.sh b/install-build-deps.sh index 2e5558870..91cdc0789 100755 --- a/install-build-deps.sh +++ b/install-build-deps.sh @@ -24,7 +24,8 @@ if [ -e /usr/bin/apt-get ] ; then sudo apt-get -y install zsync git libarchive-dev autoconf libtool make gcc g++ libtool libfuse-dev \ liblzma-dev libglib2.0-dev libssl-dev libinotifytools0-dev liblz4-dev libcairo-dev desktop-file-utils cmake # libtool-bin might be required in newer distributions but is not available in precise - sudo cp resources/liblz4.pc /usr/lib/$ARCH-linux-gnu/pkgconfig/ + test -e /usr/lib/$ARCH-linux-gnu/pkgconfig/liblz4.pc || + sudo cp -v resources/liblz4.pc /usr/lib/$ARCH-linux-gnu/pkgconfig/ if cat /etc/lsb-release | grep 14.04 2>&1 >/dev/null; then export CMAKE_VERSION=3.10.0 # sometimes, using a crowbar is easier than fiddling with PPAs From 835ce21b2cfa169cec42b0dafa7545fadfa719c4 Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Fri, 28 Sep 2018 11:21:35 +0200 Subject: [PATCH 355/544] src/runtime.c: exit with error status if waitpid() failed --- src/runtime.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index b81ee544c..99a86822d 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -667,14 +667,14 @@ int main(int argc, char *argv[]) { if (getenv("NO_CLEANUP") == NULL) { if (!rm_recursive(prefix)) { fprintf(stderr, "Failed to clean up cache directory\n"); - rv = false; + rv = -1; } } // template == prefix, must be freed only once free(prefix); - exit(rv ? 0 : 1); + exit(rv >= 0 ? 0 : 1); } if(arg && strcmp(arg,"appimage-version")==0) { From d631bcea3a456901fb19d8a608eed7405fc839f8 Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Fri, 28 Sep 2018 11:24:16 +0200 Subject: [PATCH 356/544] src/runtime.c: use 127 as exit status if payload launching failed Signed-off-by: Tim Janik --- src/runtime.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 99a86822d..640c672e1 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -56,6 +56,14 @@ #endif #include "squashfuse_dlopen.h" +/* Exit status to use when launching an AppImage fails. + * For applications that assign meanings to exit status codes (e.g. rsync), + * we avoid "cluttering" pre-defined exit status codes by using 127 which + * is known to alias an application exit status and also known as launcher + * error, see SYSTEM(3POSIX). + */ +#define EXIT_EXECERROR 127 /* Execution error exit status. */ + //#include "notify.c" extern int notify(char *title, char *body, int timeout); struct stat st; @@ -64,7 +72,7 @@ static ssize_t fs_offset; // The offset at which a filesystem image is expected static void die(const char *msg) { fprintf(stderr, "%s\n", msg); - exit(1); + exit(EXIT_EXECERROR); } /* Check whether directory is writable */ @@ -544,7 +552,7 @@ int main(int argc, char *argv[]) { // error check if (fs_offset < 0) { printf("Failed to get fs offset for %s\n", appimage_path); - exit(EXIT_FAILURE); + exit(EXIT_EXECERROR); } arg=getArg(argc,argv,'-'); @@ -556,7 +564,7 @@ int main(int argc, char *argv[]) { ssize_t length = readlink(appimage_path, fullpath, sizeof(fullpath)); if (length < 0) { printf("Error getting realpath for %s\n", appimage_path); - exit(EXIT_FAILURE); + exit(EXIT_EXECERROR); } fullpath[length] = '\0'; @@ -603,7 +611,7 @@ int main(int argc, char *argv[]) { FILE* f = fopen(appimage_path, "rb"); if (f == NULL) { perror("Failed to open AppImage file"); - exit(1); + exit(EXIT_EXECERROR); } Md5Context ctx; @@ -628,14 +636,14 @@ int main(int argc, char *argv[]) { if (!extract_appimage(appimage_path, prefix, NULL, false)) { fprintf(stderr, "Failed to extract AppImage\n"); - exit(1); + exit(EXIT_EXECERROR); } int pid; if ((pid = fork()) == -1) { int error = errno; fprintf(stderr, "fork() failed: %s\n", strerror(error)); - exit(1); + exit(EXIT_EXECERROR); } else if (pid == 0) { const char apprun_fname[] = "AppRun"; char* apprun_path = malloc(strlen(prefix) + 1 + strlen(apprun_fname) + 1); @@ -674,7 +682,7 @@ int main(int argc, char *argv[]) { // template == prefix, must be freed only once free(prefix); - exit(rv >= 0 ? 0 : 1); + exit(rv >= 0 ? 0 : EXIT_EXECERROR); } if(arg && strcmp(arg,"appimage-version")==0) { @@ -742,18 +750,18 @@ int main(int argc, char *argv[]) { if (mkdtemp(mount_dir) == NULL) { perror ("create mount dir error"); - exit (1); + exit (EXIT_EXECERROR); } if (pipe (keepalive_pipe) == -1) { perror ("pipe error"); - exit (1); + exit (EXIT_EXECERROR); } pid = fork (); if (pid == -1) { perror ("fork error"); - exit (1); + exit (EXIT_EXECERROR); } if (pid == 0) { @@ -801,13 +809,13 @@ int main(int argc, char *argv[]) { dir_fd = open (mount_dir, O_RDONLY); if (dir_fd == -1) { perror ("open dir error"); - exit (1); + exit (EXIT_EXECERROR); } res = dup2 (dir_fd, 1023); if (res == -1) { perror ("dup2 error"); - exit (1); + exit (EXIT_EXECERROR); } close (dir_fd); @@ -876,7 +884,7 @@ int main(int argc, char *argv[]) { execv (filename, real_argv); /* Error if we continue here */ perror("execv error"); - exit(1); + exit(EXIT_EXECERROR); } return 0; From 4f2a991bff0c11fdfba813c056caf5544ce2501e Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Fri, 28 Sep 2018 11:42:38 +0200 Subject: [PATCH 357/544] SRC: runtime: exit child on execv errors instead of duplicating parent's cleanups Signed-off-by: Tim Janik --- src/runtime.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime.c b/src/runtime.c index 640c672e1..b40a1879a 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -668,6 +668,7 @@ int main(int argc, char *argv[]) { fprintf(stderr, "Failed to run %s: %s\n", apprun_path, strerror(error)); free(apprun_path); + exit(EXIT_EXECERROR); } int rv = waitpid(pid, NULL, 0); From 1db0027b1fcdaa6e603dc3e122bed048943a8557 Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Fri, 28 Sep 2018 12:00:46 +0200 Subject: [PATCH 358/544] src/runtime.c: preserve exit status on --appimage-extract-and-run (normal exit) Signed-off-by: Tim Janik --- src/runtime.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index b40a1879a..2d3b2e3e1 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -671,19 +671,22 @@ int main(int argc, char *argv[]) { exit(EXIT_EXECERROR); } - int rv = waitpid(pid, NULL, 0); + int status = 0; + int rv = waitpid(pid, &status, 0); + status = rv > 0 && WIFEXITED (status) ? WEXITSTATUS (status) : EXIT_EXECERROR; if (getenv("NO_CLEANUP") == NULL) { if (!rm_recursive(prefix)) { fprintf(stderr, "Failed to clean up cache directory\n"); - rv = -1; + if (status == 0) /* avoid messing existing failure exit status */ + status = EXIT_EXECERROR; } } // template == prefix, must be freed only once free(prefix); - exit(rv >= 0 ? 0 : EXIT_EXECERROR); + exit(status); } if(arg && strcmp(arg,"appimage-version")==0) { From 6917f75fbd79f98d125ffd638f8aedc340c4fae3 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 4 Oct 2018 21:37:52 +0200 Subject: [PATCH 359/544] Set typical AppImage vars in extract-and-run mode --- src/runtime.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 2d3b2e3e1..7cad54184 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -602,6 +602,19 @@ int main(int argc, char *argv[]) { exit(0); } + // calculate full path of AppImage + int length; + char fullpath[PATH_MAX]; + + if(getenv("TARGET_APPIMAGE") == NULL){ + // If we are operating on this file itself + length = readlink(appimage_path, fullpath, sizeof(fullpath)); + fullpath[length] = '\0'; + } else { + // If we are operating on a different AppImage than this file + sprintf(fullpath, "%s", appimage_path); // TODO: Make absolute + } + if (arg && strcmp(arg, "appimage-extract-and-run") == 0) { char* hexlified_digest = NULL; @@ -662,6 +675,11 @@ int main(int argc, char *argv[]) { } new_argv[new_argc] = NULL; + /* Setting some environment variables that the app "inside" might use */ + setenv("APPIMAGE", fullpath, 1); + setenv("ARGV0", argv0_path, 1); + setenv("APPDIR", prefix, 1); + execv(apprun_path, new_argv); int error = errno; @@ -838,18 +856,6 @@ int main(int argc, char *argv[]) { for (;;) pause(); } - int length; - char fullpath[PATH_MAX]; - - if(getenv("TARGET_APPIMAGE") == NULL){ - // If we are operating on this file itself - length = readlink(appimage_path, fullpath, sizeof(fullpath)); - fullpath[length] = '\0'; - } else { - // If we are operating on a different AppImage than this file - sprintf(fullpath, "%s", appimage_path); // TODO: Make absolute - } - /* Setting some environment variables that the app "inside" might use */ setenv( "APPIMAGE", fullpath, 1 ); setenv( "ARGV0", argv0_path, 1 ); From 23ca6bb1a0d61dbefa14bab8fbc7fc91d83d34cb Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Thu, 4 Oct 2018 22:32:05 +0200 Subject: [PATCH 360/544] Implement absolute path calculation with proper error checks --- src/runtime.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 7cad54184..38b132a34 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -606,13 +606,22 @@ int main(int argc, char *argv[]) { int length; char fullpath[PATH_MAX]; - if(getenv("TARGET_APPIMAGE") == NULL){ + if(getenv("TARGET_APPIMAGE") == NULL) { // If we are operating on this file itself - length = readlink(appimage_path, fullpath, sizeof(fullpath)); - fullpath[length] = '\0'; + ssize_t len = readlink(appimage_path, fullpath, sizeof(fullpath)); + if (len < 0) { + perror("Failed to obtain absolute path"); + exit(EXIT_EXECERROR); + } + fullpath[len] = '\0'; } else { - // If we are operating on a different AppImage than this file - sprintf(fullpath, "%s", appimage_path); // TODO: Make absolute + char* abspath = realpath(appimage_path, NULL); + if (abspath == NULL) { + perror("Failed to obtain absolute path"); + exit(EXIT_EXECERROR); + } + strcpy(fullpath, abspath); + free(abspath); } if (arg && strcmp(arg, "appimage-extract-and-run") == 0) { From 27d9efd6c1c6ca6ec1e68ec1a480368e6895e733 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sun, 7 Oct 2018 21:25:37 +0200 Subject: [PATCH 361/544] Remove dependency on libcairo2 Fixes #862. --- lib/libappimage | 2 +- src/CMakeLists.txt | 11 +++++++---- src/digest_md5.c | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/libappimage b/lib/libappimage index d00aee7a9..ab44b7b3f 160000 --- a/lib/libappimage +++ b/lib/libappimage @@ -1 +1 @@ -Subproject commit d00aee7a9b74895d70c2ced8e65e4e5461947fc9 +Subproject commit ab44b7b3fda3ec286ed3b001aa58d3d282828419 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8a7b0aeb2..eddeca6d8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -33,7 +33,10 @@ target_link_libraries(appimagetool ${CMAKE_DL_LIBS} squashfuse xdg-basedir - libappimage_static + libappimage_shared + libglib + libzlib + xz ) target_compile_definitions(appimagetool @@ -73,7 +76,7 @@ add_sanitizers(AppRun) add_executable(validate validate.c) target_link_libraries(validate - libappimage_static + libappimage_shared libglib libssl ) @@ -87,7 +90,7 @@ target_include_directories(validate add_executable(digest digest.c) target_link_libraries(digest - libappimage_static + libappimage_shared libssl ) @@ -105,7 +108,7 @@ target_include_directories(digest_md5 target_link_libraries(digest_md5 PRIVATE libglib - PRIVATE libappimage_static + PRIVATE libappimage_shared ) diff --git a/src/digest_md5.c b/src/digest_md5.c index 8e5b14f66..5285f20b5 100644 --- a/src/digest_md5.c +++ b/src/digest_md5.c @@ -2,7 +2,7 @@ #include #include -#include "appimage/appimage.h" +#include "appimage/appimage_shared.h" #include "getsection.h" From 194569c02a243efc3a83be14befdc6870560292f Mon Sep 17 00:00:00 2001 From: Alexis Lopez Zubieta Date: Wed, 10 Oct 2018 11:49:20 +0200 Subject: [PATCH 362/544] Read e_machine elf file header field instead of using an external tool to guess the files architecture. --- src/appimagetool.c | 46 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 494872a3a..7b235e672 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -308,6 +308,28 @@ gchar* getArchName(bool* archs) { return "all"; } +void extract_arch_from_e_machine_field(int16_t e_machine, const gchar* sourcename, bool* archs) { + if (e_machine == 3) { + archs[fARCH_i386] = 1; + fprintf(stderr, "%s used for determining architecture i386\n", sourcename); + } + + if (e_machine == 62) { + archs[fARCH_x86_64] = 1; + fprintf(stderr, "%s used for determining architecture x86_64\n", sourcename); + } + + if (e_machine == 40) { + archs[fARCH_arm] = 1; + fprintf(stderr, "%s used for determining architecture ARM\n", sourcename); + } + + if (e_machine == 183) { + archs[fARCH_aarch64] = 1; + fprintf(stderr, "%s used for determining architecture ARM aarch64\n", sourcename); + } +} + void extract_arch_from_text(gchar *archname, const gchar* sourcename, bool* archs) { if (archname) { archname = g_strstrip(archname); @@ -343,16 +365,22 @@ void extract_arch_from_text(gchar *archname, const gchar* sourcename, bool* arch } } +int16_t read_elf_e_machine_field(const gchar* file_path) { + int16_t e_machine = 0x00; + FILE* file = 0; + file = fopen(file_path, "rb"); + if (file) { + fseek(file, 0x12, SEEK_SET); + fgets((char*) (&e_machine), 0x02, file); + fclose(file); + } + + return e_machine; +} + void guess_arch_of_file(const gchar *archfile, bool* archs) { - char line[PATH_MAX]; - char command[PATH_MAX]; - sprintf(command, "/usr/bin/file -L -N -b %s", archfile); - FILE* fp = popen(command, "r"); - if (fp == NULL) - die("Failed to run file command"); - fgets(line, sizeof (line) - 1, fp); - pclose(fp); - extract_arch_from_text(g_strsplit_set(line, ",", -1)[1], archfile, archs); + int16_t e_machine_field = read_elf_e_machine_field(archfile); + extract_arch_from_e_machine_field(e_machine_field, archfile, archs); } void find_arch(const gchar *real_path, const gchar *pattern, bool* archs) { From 225057b6f81568ed1b3da594ae1fc7e42eeef673 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 21 Oct 2018 12:10:35 +0000 Subject: [PATCH 363/544] Update .travis.yml --- .travis.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index c4edf5b3c..53d4ae62b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,6 +37,8 @@ notifications: on_start: always # options: [always|never|change] default: always branches: - only: - - appimagetool/master - - feature/usage + except: + - # Do not build tags that we create when we upload to GitHub Releases + - /^(?i:continuous)$/ + - # our master is called "appimagetool/master" + - master From 613e8e8cf4a4d49b4ce5709e3c00df7622f9b5d8 Mon Sep 17 00:00:00 2001 From: Alexis Lopez Zubieta Date: Fri, 19 Oct 2018 23:35:51 +0200 Subject: [PATCH 364/544] Deploy appimagetool binaries and resources using cmake --- build-appdir.sh | 14 +++++++------- src/CMakeLists.txt | 10 ++++++++++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/build-appdir.sh b/build-appdir.sh index 4db942090..6291a3419 100644 --- a/build-appdir.sh +++ b/build-appdir.sh @@ -3,8 +3,6 @@ set -e set -x -# preparations -mkdir -p appdirs/ ####################################################################### @@ -12,11 +10,15 @@ mkdir -p appdirs/ APPIMAGETOOL_APPDIR=appdirs/appimagetool.AppDir rm -rf "$APPIMAGETOOL_APPDIR" || true -mkdir -p "$APPIMAGETOOL_APPDIR"/usr/{bin,lib/appimagekit} -cp -f install_prefix/usr/bin/appimagetool "$APPIMAGETOOL_APPDIR"/usr/bin +# Run make install only for the 'appimagetool.AppImage' component to deploy appimagetools files to +# the $APPIMAGETOOL_APPDIR +DESTDIR="$APPIMAGETOOL_APPDIR" cmake -DCOMPONENT=appimagetool -P cmake_install.cmake + +mkdir -p "$APPIMAGETOOL_APPDIR"/usr/lib/appimagekit/ + +# Copy AppDir specific files cp ../resources/AppRun "$APPIMAGETOOL_APPDIR" -cp install_prefix/usr/bin/appimagetool "$APPIMAGETOOL_APPDIR"/usr/bin/ cp install_prefix/usr/lib/appimagekit/mksquashfs "$APPIMAGETOOL_APPDIR"/usr/lib/appimagekit/ cp $(which desktop-file-validate) "$APPIMAGETOOL_APPDIR"/usr/bin/ cp $(which zsyncmake) "$APPIMAGETOOL_APPDIR"/usr/bin/ @@ -24,8 +26,6 @@ cp $(which zsyncmake) "$APPIMAGETOOL_APPDIR"/usr/bin/ cp ../resources/appimagetool.desktop "$APPIMAGETOOL_APPDIR" cp ../resources/appimagetool.svg "$APPIMAGETOOL_APPDIR"/appimagetool.svg ln -s "$APPIMAGETOOL_APPDIR"/appimagetool.svg "$APPIMAGETOOL_APPDIR"/.DirIcon -mkdir -p "$APPIMAGETOOL_APPDIR"/usr/share/metainfo -cp ../resources/usr/share/metainfo/appimagetool.appdata.xml "$APPIMAGETOOL_APPDIR"/usr/share/metainfo/ if [ -d /deps/ ]; then # deploy glib diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index eddeca6d8..150745794 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -134,3 +134,13 @@ install( ARCHIVE DESTINATION lib/static COMPONENT applications INCLUDES DESTINATION include COMPONENT applications ) + +# Configure appimagetool component +install( + TARGETS appimagetool AppRun + RUNTIME DESTINATION bin COMPONENT appimagetool EXCLUDE_FROM_ALL +) + +install(FILES "${PROJECT_SOURCE_DIR}/resources/appimagetool.desktop" DESTINATION share/applications COMPONENT appimagetool EXCLUDE_FROM_ALL) +install(FILES "${PROJECT_SOURCE_DIR}/resources/appimagetool.svg" DESTINATION share/icons/hicolor/scalable/apps COMPONENT appimagetool EXCLUDE_FROM_ALL) +install(FILES "${PROJECT_SOURCE_DIR}/resources/usr/share/metainfo/appimagetool.appdata.xml" DESTINATION share/metainfo COMPONENT appimagetool EXCLUDE_FROM_ALL) From cbb0e232faba3b59504ee639745b8ad31e374af5 Mon Sep 17 00:00:00 2001 From: probonopd Date: Wed, 7 Nov 2018 18:49:03 +0100 Subject: [PATCH 365/544] Print paths to stdout rather than stderr, closes #880 --- src/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index 38b132a34..20f9d5874 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -331,7 +331,7 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix // fprintf(stderr, "inode.xtra.reg.file_size: %lu\n", inode.xtra.reg.file_size); strcpy(prefixed_path_to_extract, ""); strcat(strcat(prefixed_path_to_extract, prefix), trv.path); - fprintf(stderr, "%s\n", prefixed_path_to_extract); + fprintf(stdout, "%s\n", prefixed_path_to_extract); if (inode.base.inode_type == SQUASHFS_DIR_TYPE || inode.base.inode_type == SQUASHFS_LDIR_TYPE) { // fprintf(stderr, "inode.xtra.dir.parent_inode: %ui\n", inode.xtra.dir.parent_inode); // fprintf(stderr, "mkdir_p: %s/\n", prefixed_path_to_extract); From 8a404a36e44056bd5401eda75e20988bc6ac0c4c Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 27 Nov 2018 10:52:16 +0100 Subject: [PATCH 366/544] Update libappimage --- lib/libappimage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libappimage b/lib/libappimage index ab44b7b3f..4bfa7ab4e 160000 --- a/lib/libappimage +++ b/lib/libappimage @@ -1 +1 @@ -Subproject commit ab44b7b3fda3ec286ed3b001aa58d3d282828419 +Subproject commit 4bfa7ab4eb408117ea76bcc1f60cdf64c9feaa1c From edc3893c6743668f0b3c880e3817f81bc81a39e8 Mon Sep 17 00:00:00 2001 From: Alexis Lopez Zubieta Date: Tue, 27 Nov 2018 20:19:05 -0600 Subject: [PATCH 367/544] Fix squashfuse.h not found --- src/CMakeLists.txt | 2 +- src/build-runtime.cmake | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 150745794..622d9a344 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -31,7 +31,7 @@ target_include_directories(appimagetool # CMake then adds them after the PRIVATE ones in the linker command target_link_libraries(appimagetool ${CMAKE_DL_LIBS} - squashfuse + libsquashfuse xdg-basedir libappimage_shared libglib diff --git a/src/build-runtime.cmake b/src/build-runtime.cmake index eed2d6d01..950f8ef61 100644 --- a/src/build-runtime.cmake +++ b/src/build-runtime.cmake @@ -15,6 +15,12 @@ else() set(BUILD_DEBUG FALSE) endif() +if (NOT TARGET libsquashfuse) + message(FATAL_ERROR "TARGET NOT found libsquashfuse") +else() + get_target_property(squashfuse_INCLUDE_DIRS libsquashfuse INTERFACE_INCLUDE_DIRECTORIES) +endif() + set(runtime_cflags -std=c99 -ffunction-sections -fdata-sections -DGIT_COMMIT=\\"${GIT_COMMIT}\\" @@ -103,7 +109,7 @@ add_custom_command( add_executable(runtime ${CMAKE_CURRENT_BINARY_DIR}/runtime.4.o notify.c) # CMake gets confused by the .o object, therefore we need to tell it that it shall link everything using the C compiler set_property(TARGET runtime PROPERTY LINKER_LANGUAGE C) -target_link_libraries(runtime PRIVATE squashfuse dl xz libzlib pthread libappimage_shared libappimage_hashlib) +target_link_libraries(runtime PRIVATE libsquashfuse dl xz libzlib pthread libappimage_shared libappimage_hashlib) target_include_directories(runtime PRIVATE ${PROJECT_SOURCE_DIR}/include) if(BUILD_DEBUG) From 3c8a07bca278a2497e03de2794deb504429603fa Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 28 Nov 2018 23:43:57 +0100 Subject: [PATCH 368/544] Update libappimage --- lib/libappimage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libappimage b/lib/libappimage index 4bfa7ab4e..8b3969667 160000 --- a/lib/libappimage +++ b/lib/libappimage @@ -1 +1 @@ -Subproject commit 4bfa7ab4eb408117ea76bcc1f60cdf64c9feaa1c +Subproject commit 8b3969667004659f0033c71556a161bca3d60690 From d7d8481942d061e0de7dea92893d1395ff82652d Mon Sep 17 00:00:00 2001 From: probonopd Date: Wed, 5 Dec 2018 20:38:46 +0000 Subject: [PATCH 369/544] Update appimagetool.c --- src/appimagetool.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index 7b235e672..e44db0306 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -301,9 +301,9 @@ gchar* getArchName(bool* archs) { else if (archs[fARCH_x86_64]) return "x86_64"; else if (archs[fARCH_arm]) - return "ARM"; + return "armhf"; else if (archs[fARCH_aarch64]) - return "ARM_aarch64"; + return "aarch64"; else return "all"; } @@ -321,12 +321,12 @@ void extract_arch_from_e_machine_field(int16_t e_machine, const gchar* sourcenam if (e_machine == 40) { archs[fARCH_arm] = 1; - fprintf(stderr, "%s used for determining architecture ARM\n", sourcename); + fprintf(stderr, "%s used for determining architecture armhf\n", sourcename); } if (e_machine == 183) { archs[fARCH_aarch64] = 1; - fprintf(stderr, "%s used for determining architecture ARM aarch64\n", sourcename); + fprintf(stderr, "%s used for determining architecture aarch64\n", sourcename); } } From 8ec39c1ff8124538d046789eff212f8397192a52 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Wed, 5 Dec 2018 21:47:41 +0100 Subject: [PATCH 370/544] ARM builds (#699) Build for armhf and aarch64 architectures (ARM 32 bit and ARM 64 bit). Thanks @TheAssassin --- .travis.yml | 31 ++++++++++++--- build-appdir.sh | 8 +++- build.sh | 11 +++++- cmake/dependencies.cmake | 4 +- cmake/toolchains/aarch64-linux-gnu.cmake | 20 ++++++++++ cmake/toolchains/arm-linux-gnueabihf.cmake | 20 ++++++++++ lib/libappimage | 2 +- src/CMakeLists.txt | 45 ++++++++++++++-------- src/build-runtime.cmake | 8 ++-- src/embed-magic-bytes-in-file.sh | 8 ++++ travis/build-appimage.sh | 2 +- travis/build-binaries.sh | 3 ++ travis/test-appimage.sh | 0 travis/travis-build.sh | 7 ++-- 14 files changed, 135 insertions(+), 34 deletions(-) create mode 100644 cmake/toolchains/aarch64-linux-gnu.cmake create mode 100644 cmake/toolchains/arm-linux-gnueabihf.cmake create mode 100755 src/embed-magic-bytes-in-file.sh mode change 100644 => 100755 travis/build-appimage.sh mode change 100644 => 100755 travis/build-binaries.sh mode change 100644 => 100755 travis/test-appimage.sh mode change 100644 => 100755 travis/travis-build.sh diff --git a/.travis.yml b/.travis.yml index 53d4ae62b..7cc9b7802 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,31 @@ language: c -compiler: gcc +sudo: required services: - docker -env: - - ARCH=x86_64 DOCKER_IMAGE=quay.io/appimage/appimagebuild - - ARCH=i686 DOCKER_IMAGE=quay.io/appimage/appimagebuild-i386 +matrix: + include: + - env: ARCH=x86_64 DOCKER_IMAGE=quay.io/appimage/appimagebuild + - env: ARCH=i686 DOCKER_IMAGE=quay.io/appimage/appimagebuild-i386 + - env: ARCH=armhf DOCKER_IMAGE=quay.io/appimage/appimagebuild-armhf-cross + addons: + apt: + update: true + packages: + # install binfmt support system-wide (for use in Docker containers) + - binfmt-support + # sets up the required binfmt interpreters so that qemu will actually be used (for use in Docker containers) + - qemu-user-static + - env: ARCH=aarch64 DOCKER_IMAGE=quay.io/appimage/appimagebuild-aarch64-cross + addons: + apt: + update: true + packages: + # install binfmt support system-wide (for use in Docker containers) + - binfmt-support + # sets up the required binfmt interpreters so that qemu will actually be used (for use in Docker containers) + - qemu-user-static script: - bash travis/travis-build.sh @@ -16,6 +35,8 @@ after_success: - ls -lh out/* # <= wrong line: see https://travis-ci.org/AppImage/AppImageKit/jobs/347965050#L4211 - ls -lh build/out/* - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh + # make sure only pushes to rewrite create a new release, otherwise pretend PR and upload to transfer.sh + - if [ "$TRAVIS_BRANCH" != "$TRAVIS_TAG" ] && [ "$TRAVIS_BRANCH" != "appimagetool/master" ]; then export TRAVIS_EVENT_TYPE=pull_request; fi - bash ./upload.sh build/out/* notifications: @@ -24,7 +45,7 @@ notifications: - "chat.freenode.net#AppImage" on_success: always # options: [always|never|change] default: always on_failure: always # options: [always|never|change] default: always - on_start: always # options: [always|never|change] default: always + on_start: always # options: [always|never|change] default: always template: - "%{repository} build %{build_number}: %{result} %{build_url}" use_notice: true diff --git a/build-appdir.sh b/build-appdir.sh index 6291a3419..51cce0dd9 100644 --- a/build-appdir.sh +++ b/build-appdir.sh @@ -20,6 +20,8 @@ mkdir -p "$APPIMAGETOOL_APPDIR"/usr/lib/appimagekit/ # Copy AppDir specific files cp ../resources/AppRun "$APPIMAGETOOL_APPDIR" cp install_prefix/usr/lib/appimagekit/mksquashfs "$APPIMAGETOOL_APPDIR"/usr/lib/appimagekit/ +# prefer binaries from /deps, if available +export PATH=/deps/bin:"$PATH" cp $(which desktop-file-validate) "$APPIMAGETOOL_APPDIR"/usr/bin/ cp $(which zsyncmake) "$APPIMAGETOOL_APPDIR"/usr/bin/ @@ -36,7 +38,11 @@ if [ -d /deps/ ]; then # https://mail.gnome.org/archives/gtk-devel-list/2012-July/msg00062.html if [ "$ARCH" == "x86_64" ]; then cp /usr/lib64/libffi.so.5 "$APPIMAGETOOL_APPDIR"/usr/lib/ - else + elif [ "$ARCH" == "i686" ]; then cp /usr/lib/libffi.so.5 "$APPIMAGETOOL_APPDIR"/usr/lib/ + elif [ "$ARCH" == "armhf" ] || [ "$ARCH" == "aarch64" ]; then + cp /deps/lib/libffi.so.6 "$APPIMAGETOOL_APPDIR"/usr/lib/ + else + echo "WARNING: unknown architecture, not bundling libffi" fi fi diff --git a/build.sh b/build.sh index 315b10c0a..b69e99ab0 100755 --- a/build.sh +++ b/build.sh @@ -72,7 +72,16 @@ cd build # make sure that deps in separate install tree are found export PKG_CONFIG_PATH=/deps/lib/pkgconfig/ -cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_TESTING=ON -DAPPIMAGEKIT_PACKAGE_DEBS=ON +# make CMake use the right tools for ARM cross-compiling using toolchain file +if [ "$ARCH" == "armhf" ]; then + export PATH=/deps/bin:"$PATH" + export EXTRA_CMAKE_FLAGS="-DCMAKE_TOOLCHAIN_FILE=$HERE/cmake/toolchains/arm-linux-gnueabihf.cmake" +elif [ "$ARCH" == "aarch64" ]; then + export PATH=/deps/bin:"$PATH" + export EXTRA_CMAKE_FLAGS="-DCMAKE_TOOLCHAIN_FILE=$HERE/cmake/toolchains/aarch64-linux-gnu.cmake" +fi + +cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_TESTING=ON -DAPPIMAGEKIT_PACKAGE_DEBS=ON "${EXTRA_CMAKE_FLAGS[@]}" make -j$JOBS make install DESTDIR=install_prefix/ diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index d702f96dd..9f7901f00 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -8,8 +8,10 @@ include(${PROJECT_SOURCE_DIR}/lib/libappimage/cmake/scripts.cmake) # the names of the targets need to differ from the library filenames # this is especially an issue with libcairo, where the library is called libcairo # therefore, all libs imported this way have been prefixed with lib -import_pkgconfig_target(TARGET_NAME libssl PKGCONFIG_TARGET openssl) import_pkgconfig_target(TARGET_NAME libfuse PKGCONFIG_TARGET fuse) +# openssl is required for optional tools only, and doesn't need to be enforced +# FIXME: remove dependency to openssl by implementing own SHA hashes in libappimage_hashlib +import_pkgconfig_target(TARGET_NAME libssl PKGCONFIG_TARGET openssl OPTIONAL) if(USE_CCACHE) diff --git a/cmake/toolchains/aarch64-linux-gnu.cmake b/cmake/toolchains/aarch64-linux-gnu.cmake new file mode 100644 index 000000000..4b35337c3 --- /dev/null +++ b/cmake/toolchains/aarch64-linux-gnu.cmake @@ -0,0 +1,20 @@ +# toolchain file that can be used for cross-compiling AppImageKit using the respective AppImageBuild container + +set(CMAKE_SYSTEM_NAME Linux CACHE STRING "" FORCE) +set(CMAKE_SYSTEM_PROCESSOR arm CACHE STRING "" FORCE) + +set(triple aarch64-linux-gnu CACHE STRING "" FORCE) + +set(CMAKE_C_COMPILER "${triple}-gcc" CACHE STRING "" FORCE) +set(CMAKE_CXX_COMPILER "${triple}-g++" CACHE STRING "" FORCE) + +set(TOOLS_PREFIX "${triple}-" CACHE STRING "" FORCE) + +set(DEPENDENCIES_CFLAGS "-I/deps/include" CACHE STRING "" FORCE) +set(DEPENDENCIES_CPPFLAGS "${DEPENDENCIES_CFLAGS}" CACHE STRING "" FORCE) +set(DEPENDENCIES_LDFLAGS "-L/deps/lib/" CACHE STRING "" FORCE) + +# host = target system +# build = build system +# both must be specified +set(EXTRA_CONFIGURE_FLAGS "--host=${triple}" "--build=x86_64-pc-linux-gnu" "--target=${triple}" CACHE STRING "" FORCE) diff --git a/cmake/toolchains/arm-linux-gnueabihf.cmake b/cmake/toolchains/arm-linux-gnueabihf.cmake new file mode 100644 index 000000000..6c755e66e --- /dev/null +++ b/cmake/toolchains/arm-linux-gnueabihf.cmake @@ -0,0 +1,20 @@ +# toolchain file that can be used for cross-compiling AppImageKit using the respective AppImageBuild container + +set(CMAKE_SYSTEM_NAME Linux CACHE STRING "" FORCE) +set(CMAKE_SYSTEM_PROCESSOR arm CACHE STRING "" FORCE) + +set(triple arm-linux-gnueabihf CACHE STRING "" FORCE) + +set(CMAKE_C_COMPILER "${triple}-gcc" CACHE STRING "" FORCE) +set(CMAKE_CXX_COMPILER "${triple}-g++" CACHE STRING "" FORCE) + +set(TOOLS_PREFIX "${triple}-" CACHE STRING "" FORCE) + +set(DEPENDENCIES_CFLAGS "-I/deps/include" CACHE STRING "" FORCE) +set(DEPENDENCIES_CPPFLAGS "${DEPENDENCIES_CFLAGS}" CACHE STRING "" FORCE) +set(DEPENDENCIES_LDFLAGS "-L/deps/lib/" CACHE STRING "" FORCE) + +# host = target system +# build = build system +# both must be specified +set(EXTRA_CONFIGURE_FLAGS "--host=${triple}" "--build=x86_64-pc-linux-gnu" "--target=${triple}" CACHE STRING "" FORCE) diff --git a/lib/libappimage b/lib/libappimage index 8b3969667..1a99ca0c8 160000 --- a/lib/libappimage +++ b/lib/libappimage @@ -1 +1 @@ -Subproject commit 8b3969667004659f0033c71556a161bca3d60690 +Subproject commit 1a99ca0c8fa67307502e2cd3ffb6a77352f92db8 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 622d9a344..85a9c0b39 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -73,28 +73,32 @@ target_compile_definitions(AppRun add_sanitizers(AppRun) -add_executable(validate validate.c) +if (NOT TARGET libssl) + message(WARNING "Could not find suitable libssl, skipping build of validate and digest") +else() + add_executable(validate validate.c) -target_link_libraries(validate - libappimage_shared - libglib - libssl -) + target_link_libraries(validate + libappimage_shared + libglib + libssl + ) -target_include_directories(validate - PUBLIC $ - INTERFACE $ + INTERFACE $ ${CMAKE_CURRENT_BINARY_DIR}/16_blank_bytes + COMMAND dd if=/dev/zero bs=1 count=16 of=${CMAKE_CURRENT_BINARY_DIR}/16_blank_bytes ) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes - COMMAND printf '\\0%.0s' {0..1023} > ${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes + COMMAND dd if=/dev/zero bs=1 count=1024 of=${CMAKE_CURRENT_BINARY_DIR}/1024_blank_bytes ) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/8192_blank_bytes - COMMAND printf '\\0%.0s' {0..8191} > ${CMAKE_CURRENT_BINARY_DIR}/8192_blank_bytes + COMMAND dd if=/dev/zero bs=1 count=8192 of=${CMAKE_CURRENT_BINARY_DIR}/8192_blank_bytes ) # compile first raw object (not linked yet) into which the sections will be embedded @@ -127,7 +127,7 @@ if(APPIMAGEKIT_EMBED_MAGIC_BYTES) add_custom_command( TARGET runtime POST_BUILD - COMMAND printf '\\x41\\x49\\x02' | dd of=runtime bs=1 seek=8 count=3 conv=notrunc + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/embed-magic-bytes-in-file.sh ${CMAKE_CURRENT_BINARY_DIR}/runtime ) endif() diff --git a/src/embed-magic-bytes-in-file.sh b/src/embed-magic-bytes-in-file.sh new file mode 100755 index 000000000..23a8a97a4 --- /dev/null +++ b/src/embed-magic-bytes-in-file.sh @@ -0,0 +1,8 @@ +#! /bin/bash + +if [ "$1" == "" ]; then + echo "Usage: bash $0 " + exit 2 +fi + +echo -ne 'AI\x02' | dd of="$1" bs=1 count=3 seek=8 conv=notrunc diff --git a/travis/build-appimage.sh b/travis/build-appimage.sh old mode 100644 new mode 100755 index 5ec704cdc..6b6b05cfa --- a/travis/build-appimage.sh +++ b/travis/build-appimage.sh @@ -8,4 +8,4 @@ cd out/ ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -s -v \ -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ - appimagetool-"$ARCH".AppImage || true + appimagetool-"$ARCH".AppImage diff --git a/travis/build-binaries.sh b/travis/build-binaries.sh old mode 100644 new mode 100755 index 75c722780..3292291f5 --- a/travis/build-binaries.sh +++ b/travis/build-binaries.sh @@ -7,4 +7,7 @@ cd /AppImageKit ./build.sh "$@" +# make sure the prebuilt libraries in the container will be found +export LD_LIBRARY_PATH=/deps/lib:"$LD_LIBRARY_PATH" + ./test-appimagetool.sh build/install_prefix/usr/bin/appimagetool diff --git a/travis/test-appimage.sh b/travis/test-appimage.sh old mode 100644 new mode 100755 diff --git a/travis/travis-build.sh b/travis/travis-build.sh old mode 100644 new mode 100755 index 76bc37429..3c0e4749c --- a/travis/travis-build.sh +++ b/travis/travis-build.sh @@ -57,7 +57,7 @@ cd build/ # test AppImages [ "$ARCH" == "i686" ] && sudo apt-get update && sudo apt-get install -y gcc-multilib lib32z1 libfuse2 libfuse2:i386 libglib2.0-0:i386 libcairo2:i386 -bash -x ../travis/test-appimage.sh +[ "$ARCH" != "armhf" ] && [ "$ARCH" != "aarch64" ] && bash -x ../travis/test-appimage.sh # install more tools # (vim-common contains xxd) @@ -68,10 +68,11 @@ sudo chown -R travis.travis . # remove binaries from output directory ls -al out/ -rm -r out/{appimagetool,validate,digest,mksquashfs,*.AppDir} +rm -r out/{appimagetool,mksquashfs,*.AppDir} +rm -r out/{validate,digest} || true # inspect runtime -xxd out/runtime | head -n 1 +xxd out/runtime | head -n 1 | grep "4149 0200" # fix filename for upload mv out/runtime out/runtime-"$ARCH" From 6e8e2eba90438d931d118938fa2e29212bafaea7 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sat, 8 Dec 2018 15:24:17 +0000 Subject: [PATCH 371/544] Support SQUASHFS_LSYMLINK_TYPE Port over from https://github.com/AppImage/libappimage/commit/1898d4101cd32c0fc80f0179d5f07c4d85988c4c --- src/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index 20f9d5874..f63837be4 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -394,7 +394,7 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix if (!rv) break; } - } else if (inode.base.inode_type == SQUASHFS_SYMLINK_TYPE) { + } else if (inode.base.inode_type == SQUASHFS_SYMLINK_TYPE || inode.base.inode_type == SQUASHFS_LSYMLINK_TYPE) { size_t size; sqfs_readlink(&fs, &inode, NULL, &size); char buf[size]; From d8ad21e155418f7127ee5137a9452ea801303e5d Mon Sep 17 00:00:00 2001 From: probonopd Date: Wed, 12 Dec 2018 21:44:20 +0100 Subject: [PATCH 372/544] Save two external processes for $HERE, thanks @Lekensteyn Closes #891 [ci skip] --- resources/AppRun | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/AppRun b/resources/AppRun index a58d58c5b..9922148ce 100755 --- a/resources/AppRun +++ b/resources/AppRun @@ -1,5 +1,6 @@ #!/bin/sh -HERE="$(dirname "$(readlink -f "${0}")")" +SELF=$(readlink -f "$0") +HERE=${SELF%/*} export PATH="${HERE}"/usr/bin/:"${HERE}"/usr/sbin/:"${HERE}"/usr/games/:"${HERE}"/bin/:"${HERE}"/sbin/:"${PATH}" export LD_LIBRARY_PATH="${HERE}"/usr/lib/:"${HERE}"/usr/lib/i386-linux-gnu/:"${HERE}"/usr/lib/x86_64-linux-gnu/:"${HERE}"/usr/lib32/:"${HERE}"/usr/lib64/:"${HERE}"/lib/:"${HERE}"/lib/i386-linux-gnu/:"${HERE}"/lib/x86_64-linux-gnu/:"${HERE}"/lib32/:"${HERE}"/lib64/:"${LD_LIBRARY_PATH}" export PYTHONPATH="${HERE}"/usr/share/pyshared/:"${PYTHONPATH}" From ccdd9bc1a1d31f0a9c53d369cc9cc68ce86592ec Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 21 Dec 2018 19:25:40 +0100 Subject: [PATCH 373/544] Update libappimage --- lib/libappimage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libappimage b/lib/libappimage index 1a99ca0c8..5d032421a 160000 --- a/lib/libappimage +++ b/lib/libappimage @@ -1 +1 @@ -Subproject commit 1a99ca0c8fa67307502e2cd3ffb6a77352f92db8 +Subproject commit 5d032421aef066e6e1c05b30a8006f0c84a02b71 From a7602134f6744c5a23baaf0d5de20945cc434bfc Mon Sep 17 00:00:00 2001 From: David Hotham Date: Sat, 22 Dec 2018 13:21:31 +0000 Subject: [PATCH 374/544] Use SIGTERM to terminate fuse, not SIGHUP Fixes #896 --- src/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index f63837be4..2cfb31f15 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -145,7 +145,7 @@ write_pipe_thread (void *arg) /* Write until we block, on broken pipe, exit */ res = write (keepalive_pipe[1], c, sizeof (c)); if (res == -1) { - kill (fuse_pid, SIGHUP); + kill (fuse_pid, SIGTERM); break; } } From 54c4b0ade9795737f0c24925ca4834622c5ff03e Mon Sep 17 00:00:00 2001 From: probonopd Date: Sat, 22 Dec 2018 13:41:06 +0000 Subject: [PATCH 375/544] Do not try to sign when on PR https://github.com/AppImage/AppImageKit/pull/897#issuecomment-449570837 --- travis/build-appimage.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/travis/build-appimage.sh b/travis/build-appimage.sh index 6b6b05cfa..751943b8b 100755 --- a/travis/build-appimage.sh +++ b/travis/build-appimage.sh @@ -6,6 +6,14 @@ cd /AppImageKit/build cd out/ -./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -s -v \ +if [ "TRAVIS_PULL_REQUEST" == "false" ] ; then + # Sign only when NOT on a pull request + ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -s -v \ -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ appimagetool-"$ARCH".AppImage +else + # Do not attempt to sign (it would fail ayway) + ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -v \ + -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ + appimagetool-"$ARCH".AppImage + fi From 19b28e8e9b27e4c2880f1f1d4d017f6ec29cec43 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sat, 22 Dec 2018 13:41:51 +0000 Subject: [PATCH 376/544] Fix whitespace [ci skip] --- travis/build-appimage.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/build-appimage.sh b/travis/build-appimage.sh index 751943b8b..da583aa3f 100755 --- a/travis/build-appimage.sh +++ b/travis/build-appimage.sh @@ -16,4 +16,4 @@ else ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -v \ -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ appimagetool-"$ARCH".AppImage - fi +fi From 6baa36d0b1e0481aa36a36bb54140b81959b3874 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sat, 22 Dec 2018 13:57:10 +0000 Subject: [PATCH 377/544] Fix whitespace --- travis/build-appimage.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/travis/build-appimage.sh b/travis/build-appimage.sh index da583aa3f..b330b7ba1 100755 --- a/travis/build-appimage.sh +++ b/travis/build-appimage.sh @@ -7,13 +7,13 @@ cd /AppImageKit/build cd out/ if [ "TRAVIS_PULL_REQUEST" == "false" ] ; then - # Sign only when NOT on a pull request - ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -s -v \ - -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ - appimagetool-"$ARCH".AppImage + # Sign only when NOT on a pull request + ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -s -v \ + -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ + appimagetool-"$ARCH".AppImage else # Do not attempt to sign (it would fail ayway) - ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -v \ - -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ - appimagetool-"$ARCH".AppImage + ./appimagetool.AppDir/AppRun ./appimagetool.AppDir/ -v \ + -u "gh-releases-zsync|AppImage|AppImageKit|continuous|appimagetool-$ARCH.AppImage.zsync" \ + appimagetool-"$ARCH".AppImage fi From 526c3d652bcc0c3e0126537188438f0ea3f52a9c Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 25 Dec 2018 17:33:14 +0100 Subject: [PATCH 378/544] Fix build instructions Closes #898. [ci skip] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b048f6db3..0e1919f7b 100644 --- a/README.md +++ b/README.md @@ -188,7 +188,7 @@ __NOTE:__ The AppImage project supplies [binaries](https://github.com/AppImage/A On the oldest still-supported Ubuntu LTS release (at this point, 14.04): ``` -git clone -b appimagetool/master --single-branch --recursive https://github.com/AppImage/AppImageKit +git clone --single-branch --recursive https://github.com/AppImage/AppImageKit cd AppImageKit/ sudo bash -ex install-build-deps.sh bash -ex build.sh From 1cc088cbd9f633521a8d1ea587c04907702f9852 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Sat, 15 Dec 2018 22:34:45 +0100 Subject: [PATCH 379/544] Avoid injecting the current directory into paths If LD_LIBRARY_PATH was previously not set, it could end up as: LD_LIBRARY_PATH=.../lib64/: which might result in querying the current working directory for libraries. Use the "Use Alternative Value" parameter expansion (POSIX Shell standard) to expand to an empty value (if the value is empty or unset) and to `:$LD_LIBRARY_PATH` otherwise. This patch was created with this eye-bleeding command to avoid typos: sed -r 's/:"\$\{([A-Z_]+)\}"$/"${\1:+:$\1}"/' resources/AppRun --- resources/AppRun | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/AppRun b/resources/AppRun index 9922148ce..8daa8ef86 100755 --- a/resources/AppRun +++ b/resources/AppRun @@ -1,12 +1,12 @@ #!/bin/sh SELF=$(readlink -f "$0") HERE=${SELF%/*} -export PATH="${HERE}"/usr/bin/:"${HERE}"/usr/sbin/:"${HERE}"/usr/games/:"${HERE}"/bin/:"${HERE}"/sbin/:"${PATH}" -export LD_LIBRARY_PATH="${HERE}"/usr/lib/:"${HERE}"/usr/lib/i386-linux-gnu/:"${HERE}"/usr/lib/x86_64-linux-gnu/:"${HERE}"/usr/lib32/:"${HERE}"/usr/lib64/:"${HERE}"/lib/:"${HERE}"/lib/i386-linux-gnu/:"${HERE}"/lib/x86_64-linux-gnu/:"${HERE}"/lib32/:"${HERE}"/lib64/:"${LD_LIBRARY_PATH}" -export PYTHONPATH="${HERE}"/usr/share/pyshared/:"${PYTHONPATH}" -export XDG_DATA_DIRS="${HERE}"/usr/share/:"${XDG_DATA_DIRS}" -export PERLLIB="${HERE}"/usr/share/perl5/:"${HERE}"/usr/lib/perl5/:"${PERLLIB}" -export GSETTINGS_SCHEMA_DIR="${HERE}"/usr/share/glib-2.0/schemas/:"${GSETTINGS_SCHEMA_DIR}" -export QT_PLUGIN_PATH="${HERE}"/usr/lib/qt4/plugins/:"${HERE}"/usr/lib/i386-linux-gnu/qt4/plugins/:"${HERE}"/usr/lib/x86_64-linux-gnu/qt4/plugins/:"${HERE}"/usr/lib32/qt4/plugins/:"${HERE}"/usr/lib64/qt4/plugins/:"${HERE}"/usr/lib/qt5/plugins/:"${HERE}"/usr/lib/i386-linux-gnu/qt5/plugins/:"${HERE}"/usr/lib/x86_64-linux-gnu/qt5/plugins/:"${HERE}"/usr/lib32/qt5/plugins/:"${HERE}"/usr/lib64/qt5/plugins/:"${QT_PLUGIN_PATH}" +export PATH="${HERE}"/usr/bin/:"${HERE}"/usr/sbin/:"${HERE}"/usr/games/:"${HERE}"/bin/:"${HERE}"/sbin/"${PATH:+:$PATH}" +export LD_LIBRARY_PATH="${HERE}"/usr/lib/:"${HERE}"/usr/lib/i386-linux-gnu/:"${HERE}"/usr/lib/x86_64-linux-gnu/:"${HERE}"/usr/lib32/:"${HERE}"/usr/lib64/:"${HERE}"/lib/:"${HERE}"/lib/i386-linux-gnu/:"${HERE}"/lib/x86_64-linux-gnu/:"${HERE}"/lib32/:"${HERE}"/lib64/"${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" +export PYTHONPATH="${HERE}"/usr/share/pyshared/"${PYTHONPATH:+:$PYTHONPATH}" +export XDG_DATA_DIRS="${HERE}"/usr/share/"${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" +export PERLLIB="${HERE}"/usr/share/perl5/:"${HERE}"/usr/lib/perl5/"${PERLLIB:+:$PERLLIB}" +export GSETTINGS_SCHEMA_DIR="${HERE}"/usr/share/glib-2.0/schemas/"${GSETTINGS_SCHEMA_DIR:+:$GSETTINGS_SCHEMA_DIR}" +export QT_PLUGIN_PATH="${HERE}"/usr/lib/qt4/plugins/:"${HERE}"/usr/lib/i386-linux-gnu/qt4/plugins/:"${HERE}"/usr/lib/x86_64-linux-gnu/qt4/plugins/:"${HERE}"/usr/lib32/qt4/plugins/:"${HERE}"/usr/lib64/qt4/plugins/:"${HERE}"/usr/lib/qt5/plugins/:"${HERE}"/usr/lib/i386-linux-gnu/qt5/plugins/:"${HERE}"/usr/lib/x86_64-linux-gnu/qt5/plugins/:"${HERE}"/usr/lib32/qt5/plugins/:"${HERE}"/usr/lib64/qt5/plugins/"${QT_PLUGIN_PATH:+:$QT_PLUGIN_PATH}" EXEC=$(grep -e '^Exec=.*' "${HERE}"/*.desktop | head -n 1 | cut -d "=" -f 2 | cut -d " " -f 1) exec "${EXEC}" "$@" From 452ae987421334549b9560f3a8ff45bff7d414d5 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Sat, 15 Dec 2018 22:39:44 +0100 Subject: [PATCH 380/544] Remove redundant quotes to improve readability Automated with: sed -r '/export/{s/"//g;s/=(.*)/="\1"/}' resources/AppRun -i --- resources/AppRun | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/AppRun b/resources/AppRun index 8daa8ef86..2f9426cc2 100755 --- a/resources/AppRun +++ b/resources/AppRun @@ -1,12 +1,12 @@ #!/bin/sh SELF=$(readlink -f "$0") HERE=${SELF%/*} -export PATH="${HERE}"/usr/bin/:"${HERE}"/usr/sbin/:"${HERE}"/usr/games/:"${HERE}"/bin/:"${HERE}"/sbin/"${PATH:+:$PATH}" -export LD_LIBRARY_PATH="${HERE}"/usr/lib/:"${HERE}"/usr/lib/i386-linux-gnu/:"${HERE}"/usr/lib/x86_64-linux-gnu/:"${HERE}"/usr/lib32/:"${HERE}"/usr/lib64/:"${HERE}"/lib/:"${HERE}"/lib/i386-linux-gnu/:"${HERE}"/lib/x86_64-linux-gnu/:"${HERE}"/lib32/:"${HERE}"/lib64/"${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" -export PYTHONPATH="${HERE}"/usr/share/pyshared/"${PYTHONPATH:+:$PYTHONPATH}" -export XDG_DATA_DIRS="${HERE}"/usr/share/"${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" -export PERLLIB="${HERE}"/usr/share/perl5/:"${HERE}"/usr/lib/perl5/"${PERLLIB:+:$PERLLIB}" -export GSETTINGS_SCHEMA_DIR="${HERE}"/usr/share/glib-2.0/schemas/"${GSETTINGS_SCHEMA_DIR:+:$GSETTINGS_SCHEMA_DIR}" -export QT_PLUGIN_PATH="${HERE}"/usr/lib/qt4/plugins/:"${HERE}"/usr/lib/i386-linux-gnu/qt4/plugins/:"${HERE}"/usr/lib/x86_64-linux-gnu/qt4/plugins/:"${HERE}"/usr/lib32/qt4/plugins/:"${HERE}"/usr/lib64/qt4/plugins/:"${HERE}"/usr/lib/qt5/plugins/:"${HERE}"/usr/lib/i386-linux-gnu/qt5/plugins/:"${HERE}"/usr/lib/x86_64-linux-gnu/qt5/plugins/:"${HERE}"/usr/lib32/qt5/plugins/:"${HERE}"/usr/lib64/qt5/plugins/"${QT_PLUGIN_PATH:+:$QT_PLUGIN_PATH}" +export PATH="${HERE}/usr/bin/:${HERE}/usr/sbin/:${HERE}/usr/games/:${HERE}/bin/:${HERE}/sbin/${PATH:+:$PATH}" +export LD_LIBRARY_PATH="${HERE}/usr/lib/:${HERE}/usr/lib/i386-linux-gnu/:${HERE}/usr/lib/x86_64-linux-gnu/:${HERE}/usr/lib32/:${HERE}/usr/lib64/:${HERE}/lib/:${HERE}/lib/i386-linux-gnu/:${HERE}/lib/x86_64-linux-gnu/:${HERE}/lib32/:${HERE}/lib64/${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" +export PYTHONPATH="${HERE}/usr/share/pyshared/${PYTHONPATH:+:$PYTHONPATH}" +export XDG_DATA_DIRS="${HERE}/usr/share/${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" +export PERLLIB="${HERE}/usr/share/perl5/:${HERE}/usr/lib/perl5/${PERLLIB:+:$PERLLIB}" +export GSETTINGS_SCHEMA_DIR="${HERE}/usr/share/glib-2.0/schemas/${GSETTINGS_SCHEMA_DIR:+:$GSETTINGS_SCHEMA_DIR}" +export QT_PLUGIN_PATH="${HERE}/usr/lib/qt4/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt4/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt4/plugins/:${HERE}/usr/lib32/qt4/plugins/:${HERE}/usr/lib64/qt4/plugins/:${HERE}/usr/lib/qt5/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt5/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt5/plugins/:${HERE}/usr/lib32/qt5/plugins/:${HERE}/usr/lib64/qt5/plugins/${QT_PLUGIN_PATH:+:$QT_PLUGIN_PATH}" EXEC=$(grep -e '^Exec=.*' "${HERE}"/*.desktop | head -n 1 | cut -d "=" -f 2 | cut -d " " -f 1) exec "${EXEC}" "$@" From fc72d8ddc97f07e4b0c3c5c69a88c70a91f9c5bb Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 30 Dec 2018 22:45:35 +0000 Subject: [PATCH 381/544] Add downloads badge [ci skip] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0e1919f7b..818b861ba 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# AppImageKit [![Build Status](https://travis-ci.org/AppImage/AppImageKit.svg?branch=appimagetool/master)](https://travis-ci.org/AppImage/AppImageKit) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/ff60338a447941afb17c30f777314bee)](https://www.codacy.com/app/probonopd/AppImageKit?utm_source=github.com&utm_medium=referral&utm_content=AppImage/AppImageKit&utm_campaign=Badge_Grade) [![discourse](https://img.shields.io/badge/forum-discourse-orange.svg)](http://discourse.appimage.org) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/probonopd/AppImageKit?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![irc](https://img.shields.io/badge/IRC-%23AppImage%20on%20freenode-blue.svg)](https://webchat.freenode.net/?channels=AppImage) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZT9CL8M5TJU72) +# AppImageKit [![Build Status](https://travis-ci.org/AppImage/AppImageKit.svg?branch=appimagetool/master)](https://travis-ci.org/AppImage/AppImageKit) [![Downloads](https://img.shields.io/github/downloads/AppImage/AppImageKit/total.svg) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/ff60338a447941afb17c30f777314bee)](https://www.codacy.com/app/probonopd/AppImageKit?utm_source=github.com&utm_medium=referral&utm_content=AppImage/AppImageKit&utm_campaign=Badge_Grade) [![discourse](https://img.shields.io/badge/forum-discourse-orange.svg)](http://discourse.appimage.org) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/probonopd/AppImageKit?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![irc](https://img.shields.io/badge/IRC-%23AppImage%20on%20freenode-blue.svg)](https://webchat.freenode.net/?channels=AppImage) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZT9CL8M5TJU72) The __AppImage__ format is a format for packaging applications in a way that allows them to run on a variety of different target systems (base operating systems, distributions) without further modification. From 569794043875bea6437faea0b0f207f49bf70b5d Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 30 Dec 2018 22:47:36 +0000 Subject: [PATCH 382/544] Update README.md [ci skip] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 818b861ba..6338d03f4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# AppImageKit [![Build Status](https://travis-ci.org/AppImage/AppImageKit.svg?branch=appimagetool/master)](https://travis-ci.org/AppImage/AppImageKit) [![Downloads](https://img.shields.io/github/downloads/AppImage/AppImageKit/total.svg) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/ff60338a447941afb17c30f777314bee)](https://www.codacy.com/app/probonopd/AppImageKit?utm_source=github.com&utm_medium=referral&utm_content=AppImage/AppImageKit&utm_campaign=Badge_Grade) [![discourse](https://img.shields.io/badge/forum-discourse-orange.svg)](http://discourse.appimage.org) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/probonopd/AppImageKit?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![irc](https://img.shields.io/badge/IRC-%23AppImage%20on%20freenode-blue.svg)](https://webchat.freenode.net/?channels=AppImage) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZT9CL8M5TJU72) +# AppImageKit [![Build Status](https://travis-ci.org/AppImage/AppImageKit.svg?branch=appimagetool/master)](https://travis-ci.org/AppImage/AppImageKit) ![Downloads](https://img.shields.io/github/downloads/AppImage/AppImageKit/total.svg) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/ff60338a447941afb17c30f777314bee)](https://www.codacy.com/app/probonopd/AppImageKit?utm_source=github.com&utm_medium=referral&utm_content=AppImage/AppImageKit&utm_campaign=Badge_Grade) [![discourse](https://img.shields.io/badge/forum-discourse-orange.svg)](http://discourse.appimage.org) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/probonopd/AppImageKit?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![irc](https://img.shields.io/badge/IRC-%23AppImage%20on%20freenode-blue.svg)](https://webchat.freenode.net/?channels=AppImage) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZT9CL8M5TJU72) The __AppImage__ format is a format for packaging applications in a way that allows them to run on a variety of different target systems (base operating systems, distributions) without further modification. From 49aeb522a098b5792c43cce20ebe31c197a39e8e Mon Sep 17 00:00:00 2001 From: probonopd Date: Fri, 4 Jan 2019 13:44:16 +0000 Subject: [PATCH 383/544] Update CONTRIBUTING.md [ci skip] --- CONTRIBUTING.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 75fb4752f..668fd4e1d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,7 +16,13 @@ Please see the [AppImageHub Readme](https://github.com/AppImage/appimage.github. ### I would like to contribute to AppImageKit development -If you would like to report issues with AppImageKit itself, or would like to contribute to its development, please see our [list of issues](https://github.com/AppImage/AppImageKit/issues) and get in touch with us in `#AppImage` on `irc.freenode.net`. We welcome pull requests addressing any of the open issues and/or other bugfixes and/or feature additions. In the case of complex feature additions, it is best to contact us first, before you spend much time. +Your contribution is especially welcome in these ares: + +* [__High-priority__ issues we need help with](https://github.com/search?utf8=%E2%9C%93&q=org%3AAppImage+label%3Ahelp-wanted+state%3Aopen+label%3Ahigh-priority&type=Issues) +* [Issues we need help with](https://github.com/search?utf8=%E2%9C%93&q=org%3AAppImage+state%3Aopen+label%3Ahigh-priority&type=Issues) +* [Open bugs](https://github.com/search?utf8=%E2%9C%93&q=org%3AAppImage+label%3Abug+state%3Aopen&type=Issues) + +If you would like to report issues with AppImageKit itself, or would like to contribute to its development, please see get in touch with us in `#AppImage` on `irc.freenode.net`. We welcome pull requests addressing any of the open issues and/or other bugfixes and/or feature additions. In the case of complex feature additions, it is best to contact us first, before you spend much time. Fork, then clone the __appimagetool/master__ branch of the repo: From df12f3c8749d4872b5d89a9ceef70cb47c21b46c Mon Sep 17 00:00:00 2001 From: probonopd Date: Fri, 4 Jan 2019 13:45:36 +0000 Subject: [PATCH 384/544] Remove generic git usage [ci skip] --- CONTRIBUTING.md | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 668fd4e1d..8ed801ed6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,25 +23,3 @@ Your contribution is especially welcome in these ares: * [Open bugs](https://github.com/search?utf8=%E2%9C%93&q=org%3AAppImage+label%3Abug+state%3Aopen&type=Issues) If you would like to report issues with AppImageKit itself, or would like to contribute to its development, please see get in touch with us in `#AppImage` on `irc.freenode.net`. We welcome pull requests addressing any of the open issues and/or other bugfixes and/or feature additions. In the case of complex feature additions, it is best to contact us first, before you spend much time. - -Fork, then clone the __appimagetool/master__ branch of the repo: - - git clone -b appimagetool/master --single-branch --recursive git@github.com:your-username/AppImageKit.git - -Compile: - -``` -cd AppImageKit/ -sudo bash -ex install-build-deps.sh -bash -ex build.sh -``` - -Make your change. Build again to be sure you didn't break anything. Run the resulting binaries to test them. - -Push to your fork and [submit a pull request][pr]. - -[pr]: https://github.com/AppImage/AppImageKit/compare/appimagetool/master - -At this point you're waiting on us. We like to at least comment on pull requests -within three business days (and, typically, one business day). We may suggest -some changes or improvements or alternatives. From 92ce16363bf302654433ea1b47e99bf9707fd2eb Mon Sep 17 00:00:00 2001 From: probonopd Date: Sat, 5 Jan 2019 11:54:52 +0100 Subject: [PATCH 385/544] Only print the architecture stuff if we are in verbose mode --- src/appimagetool.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/appimagetool.c b/src/appimagetool.c index e44db0306..b1ff38c47 100644 --- a/src/appimagetool.c +++ b/src/appimagetool.c @@ -311,22 +311,26 @@ gchar* getArchName(bool* archs) { void extract_arch_from_e_machine_field(int16_t e_machine, const gchar* sourcename, bool* archs) { if (e_machine == 3) { archs[fARCH_i386] = 1; - fprintf(stderr, "%s used for determining architecture i386\n", sourcename); + if(verbose) + fprintf(stderr, "%s used for determining architecture i386\n", sourcename); } if (e_machine == 62) { archs[fARCH_x86_64] = 1; - fprintf(stderr, "%s used for determining architecture x86_64\n", sourcename); + if(verbose) + fprintf(stderr, "%s used for determining architecture x86_64\n", sourcename); } if (e_machine == 40) { archs[fARCH_arm] = 1; - fprintf(stderr, "%s used for determining architecture armhf\n", sourcename); + if(verbose) + fprintf(stderr, "%s used for determining architecture armhf\n", sourcename); } if (e_machine == 183) { archs[fARCH_aarch64] = 1; - fprintf(stderr, "%s used for determining architecture aarch64\n", sourcename); + if(verbose) + fprintf(stderr, "%s used for determining architecture aarch64\n", sourcename); } } From 5bffa45db35f23990b7848f0122f60671e4e9afa Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Tue, 8 Jan 2019 13:33:22 +0100 Subject: [PATCH 386/544] Fix Travis config --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7cc9b7802..d456816ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -61,5 +61,3 @@ branches: except: - # Do not build tags that we create when we upload to GitHub Releases - /^(?i:continuous)$/ - - # our master is called "appimagetool/master" - - master From b0cdd11131803fb21e76406e02f6da12071d839c Mon Sep 17 00:00:00 2001 From: Alexis Lopez Zubieta Date: Wed, 9 Jan 2019 14:15:54 -0600 Subject: [PATCH 387/544] Runtime: Create parent dirs while extracting single file --- src/runtime.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/runtime.c b/src/runtime.c index 2cfb31f15..6d5eaf6c8 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -367,6 +367,18 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix // fprintf(stderr, "Extract to: %s\n", prefixed_path_to_extract); if (private_sqfs_stat(&fs, &inode, &st) != 0) die("private_sqfs_stat error"); + + // create parent dir + char* p = strrchr(prefixed_path_to_extract, '/'); + if (p) { + // set an \0 to end the split the string + *p = '\0'; + mkdir_p(prefixed_path_to_extract); + + // restore dir seprator + *p = '/'; + } + // Read the file in chunks off_t bytes_already_read = 0; sqfs_off_t bytes_at_a_time = 64 * 1024; From 895799ee65b2e515be0d0a0aeb8998c4bcca1fa0 Mon Sep 17 00:00:00 2001 From: Alexis Lopez Zubieta Date: Wed, 9 Jan 2019 14:31:09 -0600 Subject: [PATCH 388/544] Runtime: Allow recursive extraction of partial sections of the AppImage --- src/runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime.c b/src/runtime.c index 2cfb31f15..a431f71c2 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -318,7 +318,7 @@ bool extract_appimage(const char* const appimage_path, const char* const _prefix while (sqfs_traverse_next(&trv, &err)) { if (!trv.dir_end) { - if (_pattern == NULL || fnmatch(_pattern, trv.path, FNM_FILE_NAME) == 0) { + if (_pattern == NULL || fnmatch(_pattern, trv.path, FNM_FILE_NAME | FNM_LEADING_DIR) == 0) { // fprintf(stderr, "trv.path: %s\n", trv.path); // fprintf(stderr, "sqfs_inode_id: %lu\n", trv.entry.inode); sqfs_inode inode; From 76f2883c7736ff4b78c47402d4749bc82d0fa348 Mon Sep 17 00:00:00 2001 From: Friedrich Date: Fri, 11 Jan 2019 14:55:41 +0100 Subject: [PATCH 389/544] Fix homepage link in appimagetool appdata --- resources/usr/share/metainfo/appimagetool.appdata.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/usr/share/metainfo/appimagetool.appdata.xml b/resources/usr/share/metainfo/appimagetool.appdata.xml index 042ac1a61..0f7da9c2f 100644 --- a/resources/usr/share/metainfo/appimagetool.appdata.xml +++ b/resources/usr/share/metainfo/appimagetool.appdata.xml @@ -23,7 +23,7 @@ You can also sign the AppImage with GPG.

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 delta 110310 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