From c317dcec0d36ba6c51f73bd23b5425a3f1d03141 Mon Sep 17 00:00:00 2001 From: Maximilian Bosch Date: Sun, 20 Aug 2023 12:30:34 +0200 Subject: [PATCH] nextcloud*Packages: expose proper license information This change makes sure that each Nextcloud plugin installed provides a `meta` section with proper license information. Unfortunately, the metadata from the appstore is useless for this purpose since it doesn't differentiate between e.g. AGPL 3.x and AGPL 3.x or any later version. In fact, this isn't consistent between their software, e.g. `bookmarks` has `agpl3Plus` according to the files' headers[1] whereas `twofactor_nextcloud_notification` is AGPL 3 only[2]. I don't think there's any trivial and reasonable way to retrieve this information programatically, so I decided to change the format of `nextcloud-apps.json`[3] to also contain the license in the form of the license attribute we have in `lib/licenses.nix`, i.e. GNU AGPL 3 or later is `agpl3Plus`. I retrieved the information using the following approach: * go to the source code of $app at the revision we currently have packaged * check for a license identifier (does it specify the license only or the license "or any later version")? * first in `src/main.js` because most apps from Nextcloud itself used actual spdx identifiers in the frontend's source-code. * then in `lib/AppInfo/Application.php` which each Nextcloud app has. License changes should be updated accordingly when updating the apps. As with any other package in nixpkgs as well, this currently needs to be done manually (or as part of the review process)[4]. Also, I decided to change the `name` of the `applyPatches` derivation from `source-patched` to `nextcloud-app-${appName}-${appVersion}`. When deploying a lot of apps (and probably displaying the diff using `nix store diff-closures` on deploy), the current output isn't very helpful. This is purely optional because I didn't want to break the interface of `fetchNextcloudApp` again. [1] https://github.com/nextcloud/bookmarks/blob/v13.1.0/lib/AppInfo/Application.php#L6 [2] https://github.com/nextcloud/twofactor_nextcloud_notification/blob/v3.7.0/lib/AppInfo/Application.php [3] This isn't really well-defined since it's preprocessed with `jq(1)` before passing the apps to nc4nix. [4] Though notable license changes (e.g. agpl -> gpl) would also pop up in the diff of .json, so this is pretty easy to catch. --- .../fetchnextcloudapp/default.nix | 24 +++---- pkgs/servers/nextcloud/packages/default.nix | 12 +++- pkgs/servers/nextcloud/packages/generate.sh | 2 +- .../nextcloud/packages/nextcloud-apps.json | 62 +++++++++---------- 4 files changed, 51 insertions(+), 49 deletions(-) diff --git a/pkgs/build-support/fetchnextcloudapp/default.nix b/pkgs/build-support/fetchnextcloudapp/default.nix index 29a3f727a0824..658cd87cafa78 100644 --- a/pkgs/build-support/fetchnextcloudapp/default.nix +++ b/pkgs/build-support/fetchnextcloudapp/default.nix @@ -1,27 +1,22 @@ { stdenv, fetchzip, applyPatches, lib, ... }: { url , sha256 -, licenses +, appName ? null +, appVersion ? null +, license , patches ? [ ] , name ? null , version ? null , description ? null , homepage ? null }: -let - # TODO: do something better - licenseMap = { - "agpl" = lib.licenses.agpl3Only; - "apache" = lib.licenses.asl20; - }; -in if name != null || version != null then throw '' `pkgs.fetchNextcloudApp` has been changed to use `fetchzip`. To update, please * remove `name`/`version` * update the hash '' -else applyPatches { +else applyPatches ({ inherit patches; src = fetchzip { inherit url sha256; @@ -33,11 +28,12 @@ else applyPatches { fi popd &>/dev/null ''; - meta = - ({ - licenses = map (licenseString: licenseMap.${licenseString}) licenses; + meta = { + license = lib.licenses.${license}; longDescription = description; inherit homepage; - }); + }; }; -} +} // lib.optionalAttrs (appName != null && appVersion != null) { + name = "nextcloud-app-${appName}-${appVersion}"; +}) diff --git a/pkgs/servers/nextcloud/packages/default.nix b/pkgs/servers/nextcloud/packages/default.nix index 3c0f28464cca4..9c12619968afd 100644 --- a/pkgs/servers/nextcloud/packages/default.nix +++ b/pkgs/servers/nextcloud/packages/default.nix @@ -9,15 +9,21 @@ let packages = self: generatedJson = { inherit apps; }; + appBaseDefs = builtins.fromJSON (builtins.readFile ./nextcloud-apps.json); in { # Create a derivation from the official Nextcloud apps. # This takes the data generated from the go tool. - mkNextcloudDerivation = self.callPackage ({ }: { data }: + mkNextcloudDerivation = self.callPackage ({ }: { pname, data }: pkgs.fetchNextcloudApp { - inherit (data) url sha256 description homepage licenses; + appName = pname; + appVersion = data.version; + license = appBaseDefs.${pname}; + inherit (data) url sha256 description homepage; }) {}; - } // lib.mapAttrs (type: pkgs: lib.makeExtensible (_: lib.mapAttrs (pname: data: self.mkNextcloudDerivation { inherit data; }) pkgs)) generatedJson; + } // lib.mapAttrs (type: pkgs: + lib.makeExtensible (_: lib.mapAttrs (pname: data: self.mkNextcloudDerivation { inherit pname; inherit data; }) pkgs)) + generatedJson; in (lib.makeExtensible (_: (lib.makeScope newScope packages))).extend (selfNC: superNC: {}) diff --git a/pkgs/servers/nextcloud/packages/generate.sh b/pkgs/servers/nextcloud/packages/generate.sh index ff8957a6a34dd..48960ab24decd 100755 --- a/pkgs/servers/nextcloud/packages/generate.sh +++ b/pkgs/servers/nextcloud/packages/generate.sh @@ -8,7 +8,7 @@ set -x export NEXTCLOUD_VERSIONS=$(nix-instantiate --eval -E 'import ./nc-versions.nix {}' -A e) -APPS=`cat nextcloud-apps.json | jq -r '.[]' | sed -z 's/\n/,/g;s/,$/\n/'` +APPS=`cat nextcloud-apps.json | jq -r 'keys|.[]' | sed -z 's/\n/,/g;s/,$/\n/'` nc4nix -apps $APPS rm *.log diff --git a/pkgs/servers/nextcloud/packages/nextcloud-apps.json b/pkgs/servers/nextcloud/packages/nextcloud-apps.json index 26b57eba06034..bbbe556f6cbef 100644 --- a/pkgs/servers/nextcloud/packages/nextcloud-apps.json +++ b/pkgs/servers/nextcloud/packages/nextcloud-apps.json @@ -1,31 +1,31 @@ -[ - "bookmarks" -, "calendar" -, "contacts" -, "cospend" -, "deck" -, "files_texteditor" -, "files_markdown" -, "forms" -, "groupfolders" -, "impersonate" -, "keeweb" -, "mail" -, "maps" -, "memories" -, "news" -, "notes" -, "notify_push" -, "onlyoffice" -, "polls" -, "previewgenerator" -, "qownnotesapi" -, "registration" -, "spreed" -, "tasks" -, "twofactor_nextcloud_notification" -, "twofactor_totp" -, "twofactor_webauthn" -, "unsplash" -, "user_saml" -] +{ + "bookmarks": "agpl3Plus" +, "calendar": "agpl3Plus" +, "contacts": "agpl3Plus" +, "cospend": "agpl3Plus" +, "deck": "agpl3Plus" +, "files_texteditor": "agpl3Plus" +, "files_markdown": "agpl3Plus" +, "forms": "agpl3Plus" +, "groupfolders": "agpl3Plus" +, "impersonate": "agpl3Plus" +, "keeweb": "agpl3Plus" +, "mail": "agpl3Plus" +, "maps": "agpl3Plus" +, "memories": "agpl3Plus" +, "news": "agpl3Plus" +, "notes": "agpl3Plus" +, "notify_push": "agpl3Plus" +, "onlyoffice": "asl20" +, "polls": "agpl3Plus" +, "previewgenerator": "agpl3Plus" +, "qownnotesapi": "agpl3Plus" +, "registration": "agpl3Plus" +, "spreed": "agpl3Plus" +, "tasks": "agpl3Plus" +, "twofactor_nextcloud_notification": "agpl3Only" +, "twofactor_totp": "agpl3Plus" +, "twofactor_webauthn": "agpl3Plus" +, "unsplash": "agpl3Only" +, "user_saml": "agpl3Plus" +}