From 88f7563e51442773bd8b3fe35e8800b135e08262 Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Tue, 19 Jan 2021 15:38:05 +0100 Subject: postgresql: upgrade to release 13.1 Fixes CVE-2020-25694, plus a bunch more CVE that don't look relevant. * --with-krb5 no longer exists, neither does --disable-shared * remove internal-zlib.patch.1: zlib is only used by pg_* tools / contrib/pgcrypto * remove postgresql-libs-leak.patch: some relic from pre-gbuild times, not clear what the point is for static libs * remove postgresql-9.2.1-libreoffice.patch: another dmake .mk file relic, and the win32 nmake build system was removed * add postgres-msvc-build.patch.1 to fix Cygwin perl and openssl * on WNT, libpq.dll is now built, no longer static lib postgresql: fix mistake in RepositoryExternal.mk Change-Id: Ic0232a28801b2f604d9f4e33d5621ae3362defaa Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109640 Tested-by: Jenkins Reviewed-by: Michael Stahl (cherry picked from commit 234833f7823a1424b62c93e145f0cfe2c6b6efd5) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109698 Reviewed-by: Thorsten Behrens (cherry picked from commit 1362bf7fa2957d34a7cef18dd95ede22cc42787f) --- RepositoryExternal.mk | 24 +++-- download.lst | 4 +- external/postgresql/ExternalPackage_postgresql.mk | 16 +++ external/postgresql/ExternalProject_postgresql.mk | 16 +-- external/postgresql/Module_postgresql.mk | 6 ++ external/postgresql/UnpackedTarball_postgresql.mk | 11 +-- external/postgresql/config.pl | 1 + external/postgresql/internal-zlib.patch.1 | 29 ------ external/postgresql/postgres-msvc-build.patch.1 | 110 +++++++++++++++++++++ .../postgresql/postgresql-9.2.1-libreoffice.patch | 74 -------------- external/postgresql/postgresql-libs-leak.patch | 40 -------- solenv/flatpak-manifest.in | 6 +- 12 files changed, 166 insertions(+), 171 deletions(-) create mode 100644 external/postgresql/ExternalPackage_postgresql.mk create mode 100644 external/postgresql/config.pl delete mode 100644 external/postgresql/internal-zlib.patch.1 create mode 100644 external/postgresql/postgres-msvc-build.patch.1 delete mode 100644 external/postgresql/postgresql-9.2.1-libreoffice.patch delete mode 100644 external/postgresql/postgresql-libs-leak.patch diff --git a/RepositoryExternal.mk b/RepositoryExternal.mk index c5c888f143c3..3d2d61dfc2b4 100644 --- a/RepositoryExternal.mk +++ b/RepositoryExternal.mk @@ -3027,9 +3027,15 @@ endef else # !SYSTEM_POSTGRESQL +ifeq ($(OS),WNT) +$(eval $(call gb_Helper_register_packages_for_install,postgresqlsdbc,\ + postgresql \ +)) +endif # WNT + define gb_LinkTarget__use_postgresql -$(call gb_LinkTarget_use_external_project,$(1),postgresql) +$(call gb_LinkTarget_use_external_project,$(1),postgresql,full) $(call gb_LinkTarget_set_include,$(1),\ -I$(call gb_UnpackedTarball_get_dir,postgresql)/src/include \ @@ -3037,19 +3043,21 @@ $(call gb_LinkTarget_set_include,$(1),\ $$(INCLUDE) \ ) +ifeq ($(OS),WNT) + $(call gb_LinkTarget_add_libs,$(1),\ - $(call gb_UnpackedTarball_get_dir,postgresql)/src/interfaces/libpq/libpq$(gb_StaticLibrary_PLAINEXT) \ + $(call gb_UnpackedTarball_get_dir,postgresql)/$(if $(MSVC_USE_DEBUG_RUNTIME),Debug,Release)/libpq/libpq.lib \ ) -ifeq ($(OS),WNT) -$(call gb_LinkTarget_use_external,$(1),openssl) +else # WNT -$(call gb_LinkTarget_use_system_win32_libs,$(1),\ - secur32 \ - ws2_32 \ +$(call gb_LinkTarget_add_libs,$(1),\ + $(call gb_UnpackedTarball_get_dir,postgresql)/src/interfaces/libpq/libpq$(gb_StaticLibrary_PLAINEXT) \ + $(call gb_UnpackedTarball_get_dir,postgresql)/src/common/libpgcommon$(gb_StaticLibrary_PLAINEXT) \ + $(call gb_UnpackedTarball_get_dir,postgresql)/src/port/libpgport$(gb_StaticLibrary_PLAINEXT) \ ) -endif +endif # WNT endef diff --git a/download.lst b/download.lst index 815ac5b1195a..bdbed280f3e0 100644 --- a/download.lst +++ b/download.lst @@ -210,8 +210,8 @@ export LIBPNG_SHA256SUM := 505e70834d35383537b6491e7ae8641f1a4bed1876dbfe361201f export LIBPNG_TARBALL := libpng-1.6.37.tar.xz export POPPLER_SHA256SUM := 016dde34e5f868ea98a32ca99b643325a9682281500942b7113f4ec88d20e2f3 export POPPLER_TARBALL := poppler-21.01.0.tar.xz -export POSTGRESQL_SHA256SUM := a754c02f7051c2f21e52f8669a421b50485afcde9a581674d6106326b189d126 -export POSTGRESQL_TARBALL := postgresql-9.2.24.tar.bz2 +export POSTGRESQL_SHA256SUM := 12345c83b89aa29808568977f5200d6da00f88a035517f925293355432ffe61f +export POSTGRESQL_TARBALL := postgresql-13.1.tar.bz2 export PYTHON_SHA256SUM := 06a0a9f1bf0d8cd1e4121194d666c4e28ddae4dd54346de6c343206599f02136 export PYTHON_TARBALL := Python-3.7.7.tar.xz export QRCODEGEN_SHA256SUM := fcdf9fd69fde07ae4dca2351d84271a9de8093002f733b77c70f52f1630f6e4a diff --git a/external/postgresql/ExternalPackage_postgresql.mk b/external/postgresql/ExternalPackage_postgresql.mk new file mode 100644 index 000000000000..f6c9a9bb6deb --- /dev/null +++ b/external/postgresql/ExternalPackage_postgresql.mk @@ -0,0 +1,16 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_ExternalPackage_ExternalPackage,postgresql,postgresql)) + +$(eval $(call gb_ExternalPackage_use_external_project,postgresql,postgresql)) + +$(eval $(call gb_ExternalPackage_add_file,postgresql,$(LIBO_LIB_FOLDER)/libpq.dll,$(if $(MSVC_USE_DEBUG_RUNTIME),Debug,Release)/libpq/libpq.dll)) + +# vim: set noet sw=4 ts=4: diff --git a/external/postgresql/ExternalProject_postgresql.mk b/external/postgresql/ExternalProject_postgresql.mk index ba462a34a1a1..001c3f961ac8 100644 --- a/external/postgresql/ExternalProject_postgresql.mk +++ b/external/postgresql/ExternalProject_postgresql.mk @@ -12,7 +12,6 @@ $(eval $(call gb_ExternalProject_ExternalProject,postgresql)) $(eval $(call gb_ExternalProject_use_externals,postgresql,\ $(if $(ENABLE_LDAP),openldap) \ openssl \ - zlib \ )) $(eval $(call gb_ExternalProject_register_targets,postgresql,\ @@ -25,8 +24,9 @@ $(eval $(call gb_ExternalProject_use_nmake,postgresql,build)) $(call gb_ExternalProject_get_state_target,postgresql,build) : $(call gb_ExternalProject_run,build,\ - nmake -f win32.mak USE_SSL=1 USE_LDAP=1 \ - ,src) + MSBFLAGS=/p:Platform=$(if $(filter X86_64,$(CPUNAME)),x64,Win32) \ + $(PERL) build.pl $(if $(MSVC_USE_DEBUG_RUNTIME),Debug,Release) libpq \ + ,src/tools/msvc) else @@ -55,21 +55,25 @@ postgresql_LDFLAGS += \ endif +# note: as of 13.1, zlib is not needed by libpq +# passing MAKELEVEL=0 is required to find internal headers $(call gb_ExternalProject_get_state_target,postgresql,build) : $(call gb_ExternalProject_run,build,\ ./configure \ - --without-readline --disable-shared --with-ldap \ + --without-readline \ + --without-zlib \ + --with-ldap \ $(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM)) \ $(if $(DISABLE_OPENSSL),,--with-openssl \ - $(if $(WITH_KRB5), --with-krb5) \ $(if $(WITH_GSSAPI),--with-gssapi)) \ $(if $(ENABLE_LDAP),,--with-ldap=no) \ + CFLAGS="-fPIC" \ CPPFLAGS="$(postgresql_CPPFLAGS)" \ LDFLAGS="$(postgresql_LDFLAGS)" \ $(if $(ENABLE_LDAP),EXTRA_LDAP_LIBS="-llber -lssl3 -lsmime3 -lnss3 -lnssutil3 -lplds4 -lplc4 -lnspr4") \ && cd src/interfaces/libpq \ - && MAKEFLAGS= && $(MAKE) all-static-lib) + && MAKEFLAGS= && $(MAKE) MAKELEVEL=0 all-static-lib) endif diff --git a/external/postgresql/Module_postgresql.mk b/external/postgresql/Module_postgresql.mk index 1f655c6e5034..7ea89dad3b39 100644 --- a/external/postgresql/Module_postgresql.mk +++ b/external/postgresql/Module_postgresql.mk @@ -14,4 +14,10 @@ $(eval $(call gb_Module_add_targets,postgresql,\ UnpackedTarball_postgresql \ )) +ifeq ($(OS),WNT) +$(eval $(call gb_Module_add_targets,postgresql,\ + ExternalPackage_postgresql \ +)) +endif # WNT + # vim: set noet sw=4 ts=4: diff --git a/external/postgresql/UnpackedTarball_postgresql.mk b/external/postgresql/UnpackedTarball_postgresql.mk index a7e57ab93301..6c941f1e9b22 100644 --- a/external/postgresql/UnpackedTarball_postgresql.mk +++ b/external/postgresql/UnpackedTarball_postgresql.mk @@ -11,19 +11,12 @@ $(eval $(call gb_UnpackedTarball_UnpackedTarball,postgresql)) $(eval $(call gb_UnpackedTarball_set_tarball,postgresql,$(POSTGRESQL_TARBALL),,postgresql)) -$(eval $(call gb_UnpackedTarball_set_patchlevel,postgresql,3)) - $(eval $(call gb_UnpackedTarball_add_patches,postgresql, \ - external/postgresql/postgresql-libs-leak.patch \ - external/postgresql/postgresql-9.2.1-libreoffice.patch \ external/postgresql/windows.patch.0 \ + external/postgresql/postgres-msvc-build.patch.1 \ )) -ifeq ($(SYSTEM_ZLIB),) -$(eval $(call gb_UnpackedTarball_add_patches,postgresql, \ - external/postgresql/internal-zlib.patch.1 \ -)) -endif +$(eval $(call gb_UnpackedTarball_add_file,postgresql,src/tools/msvc/config.pl,external/postgresql/config.pl)) $(eval $(call gb_UnpackedTarball_update_autoconf_configs,postgresql)) diff --git a/external/postgresql/config.pl b/external/postgresql/config.pl new file mode 100644 index 000000000000..ae163ebbd166 --- /dev/null +++ b/external/postgresql/config.pl @@ -0,0 +1 @@ +$config->{openssl} = "$ENV{WORKDIR}/UnpackedTarball/openssl"; diff --git a/external/postgresql/internal-zlib.patch.1 b/external/postgresql/internal-zlib.patch.1 deleted file mode 100644 index ac2b728e1314..000000000000 --- a/external/postgresql/internal-zlib.patch.1 +++ /dev/null @@ -1,29 +0,0 @@ -diff -up postgresql/configure.dt postgresql/configure ---- postgresql/configure.dt 2016-11-03 17:34:17.282388226 +0100 -+++ postgresql/configure 2016-11-03 17:34:35.004202484 +0100 -@@ -8566,13 +8566,13 @@ fi - - if test "$with_zlib" = yes; then - --{ $as_echo "$as_me:$LINENO: checking for inflate in -lz" >&5 --$as_echo_n "checking for inflate in -lz... " >&6; } -+{ $as_echo "$as_me:$LINENO: checking for inflate in -lzlib" >&5 -+$as_echo_n "checking for inflate in -lzlib... " >&6; } - if test "${ac_cv_lib_z_inflate+set}" = set; then - $as_echo_n "(cached) " >&6 - else - ac_check_lib_save_LIBS=$LIBS --LIBS="-lz $LIBS" -+LIBS="-lzlib $LIBS" - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF -@@ -8636,7 +8636,7 @@ if test "x$ac_cv_lib_z_inflate" = x""yes - #define HAVE_LIBZ 1 - _ACEOF - -- LIBS="-lz $LIBS" -+ LIBS="-lzlib $LIBS" - - else - { { $as_echo "$as_me:$LINENO: error: zlib library not found diff --git a/external/postgresql/postgres-msvc-build.patch.1 b/external/postgresql/postgres-msvc-build.patch.1 new file mode 100644 index 000000000000..4ccd82aa28fb --- /dev/null +++ b/external/postgresql/postgres-msvc-build.patch.1 @@ -0,0 +1,110 @@ +Cygwin perl calls /bin/sh which can't resolve to .exe + +Also Cygwin perl has $Config{osname} different from MSWin32, and why even check that? + +--- postgresql/src/tools/msvc/build.pl.orig 2021-01-19 17:36:09.801463500 +0100 ++++ postgresql/src/tools/msvc/build.pl 2021-01-19 17:36:20.426821300 +0100 +@@ -55,13 +55,13 @@ + if ($buildwhat) + { + system( +- "msbuild $buildwhat.vcxproj /verbosity:normal $msbflags /p:Configuration=$bconf" ++ "msbuild.exe $buildwhat.vcxproj /verbosity:normal $msbflags /p:Configuration=$bconf" + ); + } + else + { + system( +- "msbuild pgsql.sln /verbosity:normal $msbflags /p:Configuration=$bconf" ++ "msbuild.exe pgsql.sln /verbosity:normal $msbflags /p:Configuration=$bconf" + ); + } + +--- postgresql/src/tools/msvc/Project.pm.orig 2021-01-19 17:59:18.799237700 +0100 ++++ postgresql/src/tools/msvc/Project.pm 2021-01-19 17:59:48.487711700 +0100 +@@ -22,7 +22,7 @@ + my $self = { + name => $name, + type => $type, +- guid => $^O eq "MSWin32" ? Win32::GuidGen() : 'FAKE', ++ guid => Win32::GuidGen(), + files => {}, + references => [], + libraries => [], +--- postgresql/src/tools/msvc/Solution.pm.orig 2021-01-19 18:03:04.594229100 +0100 ++++ postgresql/src/tools/msvc/Solution.pm 2021-01-19 18:04:13.677610100 +0100 +@@ -59,7 +59,7 @@ + { + my $self = shift; + +- if ($^O eq "MSWin32") ++ if (1) #($^O eq "MSWin32") + { + # Examine CL help output to determine if we are in 32 or 64-bit mode. + my $output = `cl /? 2>&1`; +@@ -1081,7 +1081,7 @@ + } + if ($fld ne "") + { +- $flduid{$fld} = $^O eq "MSWin32" ? Win32::GuidGen() : 'FAKE'; ++ $flduid{$fld} = Win32::GuidGen(); + print $sln <{options}->{openssl}\\bin\\openssl.exe" version 2>&1); ++ qq("$self->{options}->{openssl}\\out32dll\\openssl.exe" version 2>&1); ++ print "$opensslcmd"; + my $sslout = `$opensslcmd`; + + $? >> 8 == 0 +@@ -964,8 +964,8 @@ + # On both Win32 and Win64 the same library + # names are used without a debugging context. + $dbgsuffix = 0; +- $libsslpath = '\lib\libssl.lib'; +- $libcryptopath = '\lib\libcrypto.lib'; ++ $libsslpath = '\libssl.lib'; ++ $libcryptopath = '\libcrypto.lib'; + } + + $proj->AddLibrary($self->{options}->{openssl} . $libsslpath, +@@ -990,9 +990,9 @@ + # to be here, so don't ask for it in last + # parameter. + $proj->AddLibrary( +- $self->{options}->{openssl} . '\lib\ssleay32.lib', 0); ++ $self->{options}->{openssl} . '\out32dll\ssleay32.lib', 0); + $proj->AddLibrary( +- $self->{options}->{openssl} . '\lib\libeay32.lib', 0); ++ $self->{options}->{openssl} . '\out32dll\libeay32.lib', 0); + } + } + } diff --git a/external/postgresql/postgresql-9.2.1-libreoffice.patch b/external/postgresql/postgresql-9.2.1-libreoffice.patch deleted file mode 100644 index 174ee8551a78..000000000000 --- a/external/postgresql/postgresql-9.2.1-libreoffice.patch +++ /dev/null @@ -1,74 +0,0 @@ ---- misc/build/postgresql-9.1.1/src/interfaces/libpq/Makefile 2011-09-22 23:57:57.000000000 +0200 -+++ misc/build/postgresql-9.1.1.patched/src/interfaces/libpq/Makefile 2011-12-15 09:02:18.000000000 +0100 -@@ -148,3 +148,6 @@ - maintainer-clean: distclean maintainer-clean-lib - $(MAKE) -C test $@ - rm -f libpq-dist.rc -+ -+libpq-flags.mk: -+ @printf '%s\n' 'LIBPQ_DEP_LIBS+=$(SHLIB_LINK)' > '$@' ---- misc/build/postgresql-9.1.1/src/interfaces/libpq/win32.mak 2011-12-14 14:28:59.000000000 +0100 -+++ misc/build/postgresql-9.1.1.patched/src/interfaces/libpq/win32.mak 2011-12-15 09:11:37.000000000 +0100 -@@ -11,14 +11,12 @@ - !ENDIF - - !IFDEF DEBUG --OPT=/Od /Zi /MDd -+OPT=/Od /Zi - LOPT=/DEBUG --DEBUGDEF=/D _DEBUG --OUTFILENAME=libpqd -+OUTFILENAME=libpq - !ELSE - OPT=/O2 /MD - LOPT= --DEBUGDEF=/D NDEBUG - OUTFILENAME=libpq - !ENDIF - -@@ -67,18 +66,11 @@ - CPP=cl.exe - RSC=rc.exe - --!IFDEF DEBUG --OUTDIR=.\Debug --INTDIR=.\Debug --CPP_OBJS=.\Debug/ --!ELSE --OUTDIR=.\Release --INTDIR=.\Release --CPP_OBJS=.\Release/ --!ENDIF -- -+OUTDIR=. -+INTDIR=. -+CPP_OBJS=./ - --ALL : config "$(OUTDIR)\$(OUTFILENAME).lib" "$(OUTDIR)\$(OUTFILENAME).dll" -+ALL : config "$(OUTDIR)\$(OUTFILENAME).lib" - - CLEAN : - -@erase "$(INTDIR)\getaddrinfo.obj" -@@ -178,10 +170,11 @@ - "$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - --CPP_PROJ=/nologo /W3 /EHsc $(OPT) /I "..\..\include" /I "..\..\include\port\win32" /I "..\..\include\port\win32_msvc" /I "..\..\port" /I. /I "$(SSL_INC)" \ -+CPP_PROJ=/nologo /W3 /EHsc $(OPT) /I "..\..\include" /I "..\..\include\port\win32" /I "..\..\include\port\win32_msvc" /I "..\..\port" /I. $(SOLARINC) /I $(WORKDIR)/UnpackedTarball/openssl/include \ - /D "FRONTEND" $(DEBUGDEF) \ - /D "WIN32" /D "_WINDOWS" /Fp"$(INTDIR)\libpq.pch" \ - /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c \ -+ /D "_CRT_NONSTDC_NO_DEPRECATE" \ - /D "_CRT_SECURE_NO_DEPRECATE" $(ADD_DEFINES) - - !IFDEF USE_SSL -@@ -222,7 +215,7 @@ - << - - "$(INTDIR)\libpq.res" : "$(INTDIR)" libpq-dist.rc -- $(RSC) $(RSC_PROJ) libpq-dist.rc -+ $(RSC) $(SOLARINC) $(RSC_PROJ) libpq-dist.rc - - - "$(OUTDIR)\$(OUTFILENAME).dll" : "$(OUTDIR)" "$(INTDIR)\libpq.res" - diff --git a/external/postgresql/postgresql-libs-leak.patch b/external/postgresql/postgresql-libs-leak.patch deleted file mode 100644 index 8224137f1f97..000000000000 --- a/external/postgresql/postgresql-libs-leak.patch +++ /dev/null @@ -1,40 +0,0 @@ -diff --recursive -u misc/build/postgresql-9.1.1/configure.in misc/build/postgresql-9.1.1.patched/configure.in ---- misc/build/postgresql-9.1.1/configure.in 2011-09-22 23:57:57.000000000 +0200 -+++ misc/build/postgresql-9.1.1.patched/configure.in 2012-02-03 11:42:45.000000000 +0100 -@@ -903,18 +903,9 @@ - *** Not using spinlocks will cause poor performance.]) - fi - --if test "$with_gssapi" = yes ; then -- if test "$PORTNAME" != "win32"; then -- AC_SEARCH_LIBS(gss_init_sec_context, [gssapi_krb5 gss 'gssapi -lkrb5 -lcrypto'], [], -- [AC_MSG_ERROR([could not find function 'gss_init_sec_context' required for GSSAPI])]) -- else -- LIBS="$LIBS -lgssapi32" -- fi --fi -- - if test "$with_krb5" = yes ; then - if test "$PORTNAME" != "win32"; then -- AC_SEARCH_LIBS(com_err, [krb5 'krb5 -lcrypto -ldes -lasn1 -lroken' com_err 'com_err -lssl -lcrypto'], [], -+ AC_SEARCH_LIBS(com_err, [com_err 'com_err -lssl -lcrypto' krb5 'krb5 -lcrypto -ldes -lasn1 -lroken'], [], - [AC_MSG_ERROR([could not find function 'com_err' required for Kerberos 5])]) - AC_SEARCH_LIBS(krb5_sendauth, [krb5 'krb5 -lcrypto -ldes -lasn1 -lroken'], [], - [AC_MSG_ERROR([could not find function 'krb5_sendauth' required for Kerberos 5])]) -@@ -924,6 +915,15 @@ - fi - fi - -+if test "$with_gssapi" = yes ; then -+ if test "$PORTNAME" != "win32"; then -+ AC_SEARCH_LIBS(gss_init_sec_context, [gssapi_krb5 gss 'gssapi -lkrb5 -lcrypto'], [], -+ [AC_MSG_ERROR([could not find function 'gss_init_sec_context' required for GSSAPI])]) -+ else -+ LIBS="$LIBS -lgssapi32" -+ fi -+fi -+ - if test "$with_openssl" = yes ; then - dnl Order matters! - if test "$PORTNAME" != "win32"; then - diff --git a/solenv/flatpak-manifest.in b/solenv/flatpak-manifest.in index b624ffcb512e..c5f7d8f4ae16 100644 --- a/solenv/flatpak-manifest.in +++ b/solenv/flatpak-manifest.in @@ -381,10 +381,10 @@ "dest-filename": "external/tarballs/poppler-0.82.0.tar.xz" }, { - "url": "https://dev-www.libreoffice.org/src/postgresql-9.2.24.tar.bz2", - "sha256": "a754c02f7051c2f21e52f8669a421b50485afcde9a581674d6106326b189d126", + "url": "https://dev-www.libreoffice.org/src/postgresql-13.1.tar.bz2", + "sha256": "12345c83b89aa29808568977f5200d6da00f88a035517f925293355432ffe61f", "type": "file", - "dest-filename": "external/tarballs/postgresql-9.2.24.tar.bz2" + "dest-filename": "external/tarballs/postgresql-13.1.tar.bz2" }, { "url": "https://dev-www.libreoffice.org/src/QR-Code-generator-1.4.0.tar.gz", -- cgit