···2727 } ":";
2828 };
29293030- # the INI file can now be given as plain old nix values
3130in
3131+# the INI file can now be given as plain old nix values
3232customToINI {
3333 main = {
3434 pushinfo = true;
+5-5
doc/hooks/tauri.section.md
···2323 wrapGAppsHook4,
2424}:
25252626-rustPlatform.buildRustPackage rec {
2727- # . . .
2626+rustPlatform.buildRustPackage (finalAttrs: {
2727+ # ...
28282929 useFetchCargoVendor = true;
3030 cargoHash = "...";
31313232 # Assuming our app's frontend uses `npm` as a package manager
3333 npmDeps = fetchNpmDeps {
3434- name = "${pname}-npm-deps-${version}";
3434+ name = "${finalAttrs.pname}-npm-deps-${finalAttrs.version}";
3535 inherit src;
3636 hash = "...";
3737 };
···6161 # And make sure we build there too
6262 buildAndTestSubdir = cargoRoot;
63636464- # . . .
6565-}
6464+ # ...
6565+})
6666```
67676868## Variables controlling cargo-tauri {#tauri-hook-variables-controlling}
···198198 fetchFromGitHub,
199199}:
200200201201-buildNpmPackage rec {
201201+buildNpmPackage (finalAttrs: {
202202 pname = "flood";
203203 version = "4.7.0";
204204205205 src = fetchFromGitHub {
206206 owner = "jesec";
207207- repo = pname;
208208- rev = "v${version}";
207207+ repo = "flood";
208208+ tag = "v${finalAttrs.version}";
209209 hash = "sha256-BR+ZGkBBfd0dSQqAvujsbgsEPFYw/ThrylxUbOksYxM=";
210210 };
211211···222222 license = lib.licenses.gpl3Only;
223223 maintainers = with lib.maintainers; [ winter ];
224224 };
225225-}
225225+})
226226```
227227228228In the default `installPhase` set by `buildNpmPackage`, it uses `npm pack --json --dry-run` to decide what files to install in `$out/lib/node_modules/$name/`, where `$name` is the `name` string defined in the package's `package.json`.
···646646647647```nix
648648{
649649+ nativeBuildInputs = [
650650+ writableTmpDirAsHomeHook
651651+ ];
652652+649653 buildPhase = ''
650650- export HOME=$(mktemp -d)
654654+ runHook preBuild
655655+651656 yarn --offline build
657657+658658+ runHook postBuild
652659 '';
653660}
654661```
+2-3
doc/languages-frameworks/lisp.section.md
···135135- names starting with a number have a `_` prepended (`3d-vectors`->`_3d-vectors`)
136136- `_` in names is converted to `__` for reversibility
137137138138-139138## Defining packages manually inside Nixpkgs {#lisp-defining-packages-inside}
140139141140Packages that for some reason are not in Quicklisp, and so cannot be
···185184 domain = "gitlab.common-lisp.net";
186185 owner = "alexandria";
187186 repo = "alexandria";
188188- rev = "v${version}";
187187+ tag = "v${version}";
189188 hash = "sha256-1Hzxt65dZvgOFIljjjlSGgKYkj+YBLwJCACi5DZsKmQ=";
190189 };
191190 };
···212211 domain = "gitlab.common-lisp.net";
213212 owner = "alexandria";
214213 repo = "alexandria";
215215- rev = "v${version}";
214214+ tag = "v${version}";
216215 hash = "sha256-1Hzxt65dZvgOFIljjjlSGgKYkj+YBLwJCACi5DZsKmQ=";
217216 };
218217})
+53-17
doc/languages-frameworks/maven.section.md
···23232424 src = fetchFromGitHub {
2525 owner = "intoolswetrust";
2626- repo = pname;
2727- rev = "${pname}-${version}";
2626+ repo = "jd-cli";
2727+ tag = "jd-cli-${version}";
2828 hash = "sha256-rRttA5H0A0c44loBzbKH7Waoted3IsOgxGCD2VM0U/Q=";
2929 };
3030···3333 nativeBuildInputs = [ makeWrapper ];
34343535 installPhase = ''
3636+ runHook preInstall
3737+3638 mkdir -p $out/bin $out/share/jd-cli
3739 install -Dm644 jd-cli/target/jd-cli.jar $out/share/jd-cli
38403941 makeWrapper ${jre}/bin/java $out/bin/jd-cli \
4042 --add-flags "-jar $out/share/jd-cli/jd-cli.jar"
4343+4444+ runHook postInstall
4145 '';
42464347 meta = {
···301305 buildInputs = [ maven ];
302306 src = ./.; # or fetchFromGitHub, cleanSourceWith, etc
303307 buildPhase = ''
308308+ runHook preBuild
309309+304310 mvn package -Dmaven.repo.local=$out
311311+312312+ runHook postBuild
305313 '';
306314307315 # keep only *.{pom,jar,sha1,nbm} and delete all ephemeral files with lastModified timestamps inside
308316 installPhase = ''
317317+ runHook preInstall
318318+309319 find $out -type f \
310320 -name \*.lastUpdated -or \
311321 -name resolver-status.properties -or \
312322 -name _remote.repositories \
313323 -delete
324324+325325+ runHook postInstall
314326 '';
315327316328 # don't do any fixup
···354366 maven,
355367 callPackage,
356368}:
357357-# pick a repository derivation, here we will use buildMaven
358369let
370370+ # pick a repository derivation, here we will use buildMaven
359371 repository = callPackage ./build-maven-repository.nix { };
360372in
361361-stdenv.mkDerivation rec {
373373+stdenv.mkDerivation (finalAttrs: {
362374 pname = "maven-demo";
363375 version = "1.0";
364376···366378 buildInputs = [ maven ];
367379368380 buildPhase = ''
381381+ runHook preBuild
382382+369383 echo "Using repository ${repository}"
370384 mvn --offline -Dmaven.repo.local=${repository} package;
385385+386386+ runHook postBuild
371387 '';
372388373389 installPhase = ''
374374- install -Dm644 target/${pname}-${version}.jar $out/share/java
390390+ runHook preInstall
391391+392392+ install -Dm644 target/${finalAttrs.pname}-${finalAttrs.version}.jar $out/share/java
393393+394394+ runHook postInstall
375395 '';
376376-}
396396+})
377397```
378398379399::: {.tip}
···421441let
422442 repository = callPackage ./build-maven-repository.nix { };
423443in
424424-stdenv.mkDerivation rec {
444444+stdenv.mkDerivation (finalAttrs: {
425445 pname = "maven-demo";
426446 version = "1.0";
427447···430450 buildInputs = [ maven ];
431451432452 buildPhase = ''
453453+ runHook preBuild
454454+433455 echo "Using repository ${repository}"
434456 mvn --offline -Dmaven.repo.local=${repository} package;
457457+458458+ runHook postBuild
435459 '';
436460437461 installPhase = ''
462462+ runHook preInstall
463463+438464 mkdir -p $out/bin
439465440466 classpath=$(find ${repository} -name "*.jar" -printf ':%h/%f');
441441- install -Dm644 target/${pname}-${version}.jar $out/share/java
467467+ install -Dm644 target/maven-demo-${finalAttrs.version}.jar $out/share/java
442468 # create a wrapper that will automatically set the classpath
443469 # this should be the paths from the dependency derivation
444444- makeWrapper ${jre}/bin/java $out/bin/${pname} \
445445- --add-flags "-classpath $out/share/java/${pname}-${version}.jar:''${classpath#:}" \
470470+ makeWrapper ${jre}/bin/java $out/bin/maven-demo \
471471+ --add-flags "-classpath $out/share/java/maven-demo-${finalAttrs.version}.jar:''${classpath#:}" \
446472 --add-flags "Main"
473473+474474+ runHook postInstall
447475 '';
448448-}
476476+})
449477```
450478451479#### MANIFEST file via Maven Plugin {#manifest-file-via-maven-plugin}
···502530 makeWrapper,
503531 jre,
504532}:
505505-# pick a repository derivation, here we will use buildMaven
506533let
534534+ # pick a repository derivation, here we will use buildMaven
507535 repository = callPackage ./build-maven-repository.nix { };
508536in
509509-stdenv.mkDerivation rec {
537537+stdenv.mkDerivation (finalAttrs: {
510538 pname = "maven-demo";
511539 version = "1.0";
512540···515543 buildInputs = [ maven ];
516544517545 buildPhase = ''
546546+ runHook preBuild
547547+518548 echo "Using repository ${repository}"
519549 mvn --offline -Dmaven.repo.local=${repository} package;
550550+551551+ runHook postBuild
520552 '';
521553522554 installPhase = ''
555555+ runHook preInstall
556556+523557 mkdir -p $out/bin
524558525559 # create a symbolic link for the repository directory
526560 ln -s ${repository} $out/repository
527561528528- install -Dm644 target/${pname}-${version}.jar $out/share/java
562562+ install -Dm644 target/maven-demo-${finalAttrs.version}.jar $out/share/java
529563 # create a wrapper that will automatically set the classpath
530564 # this should be the paths from the dependency derivation
531531- makeWrapper ${jre}/bin/java $out/bin/${pname} \
532532- --add-flags "-jar $out/share/java/${pname}-${version}.jar"
565565+ makeWrapper ${jre}/bin/java $out/bin/maven-demo \
566566+ --add-flags "-jar $out/share/java/maven-demo-${finalAttrs.version}.jar"
567567+568568+ runHook postInstall
533569 '';
534534-}
570570+})
535571```
536572::: {.note}
537573Our script produces a dependency on `jre` rather than `jdk` to restrict the runtime closure necessary to run the application.
···2135213521362136#### Common issues {#common-issues}
2137213721382138-* Tests that attempt to access `$HOME` can be fixed by using the following
21392139- work-around before running tests (e.g. `preCheck`): `export HOME=$(mktemp -d)`
21382138+* Tests that attempt to access `$HOME` can be fixed by using `writableTmpDirAsHomeHook` in
21392139+ `nativeCheckInputs`, which sets up a writable temporary directory as the home directory. Alternatively,
21402140+ you can achieve the same effect manually (e.g. in `preCheck`) with: `export HOME=$(mktemp -d)`.
21402141* Compiling with Cython causes tests to fail with a `ModuleNotLoadedError`.
21412142 This can be fixed with two changes in the derivation: 1) replacing `pytest` with
21422143 `pytestCheckHook` and 2) adding a `preCheck` containing `cd $out` to run
···91919292A list of the maintainers of this Nix expression. Maintainers are defined in [`nixpkgs/maintainers/maintainer-list.nix`](https://github.com/NixOS/nixpkgs/blob/master/maintainers/maintainer-list.nix). There is no restriction to becoming a maintainer, just add yourself to that list in a separate commit titled “maintainers: add alice” in the same pull request, and reference maintainers with `maintainers = with lib.maintainers; [ alice bob ]`.
93939494+### `teams` {#var-meta-teams}
9595+9696+A list of the teams of this Nix expression. Teams are defined in [`nixpkgs/maintainers/team-list.nix`](https://github.com/NixOS/nixpkgs/blob/master/maintainers/team-list.nix), and can be defined in a package with `meta.teams = with lib.teams; [ team1 team2 ]`.
9797+9498### `mainProgram` {#var-meta-mainProgram}
959996100The name of the main binary for the package. This affects the binary `nix run` executes. Example: `"rg"`
+19-7
doc/stdenv/stdenv.chapter.md
···2020**Since [RFC 0035](https://github.com/NixOS/rfcs/pull/35), this is preferred for packages in Nixpkgs**, as it allows us to reuse the version easily:
21212222```nix
2323-stdenv.mkDerivation rec {
2323+stdenv.mkDerivation (finalAttrs: {
2424 pname = "libfoo";
2525 version = "1.2.3";
2626 src = fetchurl {
2727- url = "http://example.org/libfoo-source-${version}.tar.bz2";
2727+ url = "http://example.org/libfoo-source-${finalAttrs.version}.tar.bz2";
2828 hash = "sha256-tWxU/LANbQE32my+9AXyt3nCT7NBVfJ45CX757EMT3Q=";
2929 };
3030-}
3030+})
3131```
32323333Many packages have dependencies that are not provided in the standard environment. It’s usually sufficient to specify those dependencies in the `buildInputs` attribute:
···5353stdenv.mkDerivation {
5454 pname = "fnord";
5555 version = "4.5";
5656+5657 # ...
5858+5759 buildPhase = ''
6060+ runHook preBuild
6161+5862 gcc foo.c -o foo
6363+6464+ runHook postBuild
5965 '';
6666+6067 installPhase = ''
6868+ runHook preInstall
6969+6170 mkdir -p $out/bin
6271 cp foo $out/bin
7272+7373+ runHook postInstall
6374 '';
6475}
6576```
···212223213224Consider for example this simplified derivation for `solo5`, a sandboxing tool:
214225```nix
215215-stdenv.mkDerivation rec {
226226+stdenv.mkDerivation (finalAttrs: {
216227 pname = "solo5";
217228 version = "0.7.5";
218229219230 src = fetchurl {
220220- url = "https://github.com/Solo5/solo5/releases/download/v${version}/solo5-v${version}.tar.gz";
231231+ url = "https://github.com/Solo5/solo5/releases/download/v${finalAttrs.version}/solo5-v${finalAttrs.version}.tar.gz";
221232 hash = "sha256-viwrS9lnaU8sTGuzK/+L/PlMM/xRRtgVuK5pixVeDEw=";
222233 };
223234···225236 makeWrapper
226237 pkg-config
227238 ];
239239+228240 buildInputs = [ libseccomp ];
229241230242 postInstall = ''
···249261 util-linux
250262 qemu
251263 ];
252252- checkPhase = ''[elided] '';
253253-}
264264+ checkPhase = ''[elided]'';
265265+})
254266```
255267256268- `makeWrapper` is a setup hook, i.e., a shell script sourced by the generic builder of `stdenv`.
···57575858[`maintainer-list.nix`]: ../maintainer-list.nix
59596060+### `get-maintainer-pings-between.sh`
6161+6262+Gets which maintainers would be pinged between two Nixpkgs revisions.
6363+Outputs a JSON object on stdout mapping GitHub usernames to the attributes
6464+that they would be getting pinged for.
6565+6666+Example:
6767+6868+```sh
6969+maintainers/scripts/get-maintainer-pings-between.sh HEAD^ HEAD
7070+```
60716172## Conventions
6273
···3636 - `services.mattermost.listenAddress` has been split into {option}`services.mattermost.host` and {option}`services.mattermost.port`. If your `listenAddress` contained a port, you will need to edit your configuration.
3737 - Mattermost now supports peer authentication on both MySQL and Postgres database backends. Updating {option}`system.stateVersion` to 25.05 or later will result in peer authentication being used by default if the Mattermost server would otherwise be connecting to localhost. This is the recommended configuration.
3838 - The Mattermost module will produce eval warnings if a database password would end up in the Nix store, and recommend alternatives such as peer authentication or using the environment file.
3939- - Mattermost's entire test suite is now enabled by default, which will extend build time from sources by up to an hour. A `withoutTests` passthru has been added in case you want to skip it.
4039 - We now support `mmctl` for Mattermost administration if both {option}`services.mattermost.socket.enable` and {option}`services.mattermost.socket.export` are set, which export the Mattermost control socket path into the system environment.
4140 - A new `pkgs.mattermost.buildPlugin` function has been added, which allows plugins to be built from source, including webapp frontends with a supported package-lock.json. See the Mattermost NixOS test and [manual](https://nixos.org/manual/nixpkgs/unstable/#sec-mattermost-plugins-build) for an example.
4241 - Note that the Mattermost module will create an account _without_ a well-known UID if the username differs from the default (`mattermost`). If you used Mattermost with a nonstandard username, you may want to review the module changes before upgrading.
···5857- [scanservjs](https://github.com/sbs20/scanservjs/), a web UI for SANE scanners. Available at [services.scanservjs](#opt-services.scanservjs.enable).
59586059- [Kimai](https://www.kimai.org/), a web-based multi-user time-tracking application. Available as [services.kimai](options.html#opt-services.kimai).
6060+6161+- [Kismet](https://www.kismetwireless.net/), a Wi-Fi, Bluetooth, and RF monitoring application supporting a wide range of hardware. Available as {option}`services.kismet`.
6262+6363+- [vwifi](https://github.com/Raizo62/vwifi), a Wi-Fi simulator daemon leveraging the `mac80211_hwsim` and `vhost_vsock` kernel modules for efficient simulation of multi-node Wi-Fi networks. Available as {option}`services.vwifi`.
61646265- [Homer](https://homer-demo.netlify.app/), a very simple static homepage for your server. Available as [services.homer](options.html#opt-services.homer).
6366···526529- `bind.cacheNetworks` now only controls access for recursive queries, where it previously controlled access for all queries.
527530528531- [`services.mongodb.enableAuth`](#opt-services.mongodb.enableAuth) now uses the newer [mongosh](https://github.com/mongodb-js/mongosh) shell instead of the legacy shell to configure the initial superuser. You can configure the mongosh package to use through the [`services.mongodb.mongoshPackage`](#opt-services.mongodb.mongoshPackage) option.
532532+533533+- There is a new set of NixOS test tools for testing virtual Wi-Fi networks in many different topologies. See the {option}`services.vwifi` module, {option}`services.kismet` NixOS test, and [manual](https://nixos.org/manual/nixpkgs/unstable/#sec-nixos-test-wifi) for documentation and examples.
529534530535- The paperless module now has an option for regular automatic export of
531536 documents data using the integrated document exporter.
···11+{
22+ config,
33+ lib,
44+ pkgs,
55+ ...
66+}:
77+88+let
99+ inherit (lib.trivial) isFloat isInt isBool;
1010+ inherit (lib.modules) mkIf;
1111+ inherit (lib.options)
1212+ literalExpression
1313+ mkOption
1414+ mkPackageOption
1515+ mkEnableOption
1616+ ;
1717+ inherit (lib.strings)
1818+ isString
1919+ escapeShellArg
2020+ escapeShellArgs
2121+ concatMapStringsSep
2222+ concatMapAttrsStringSep
2323+ replaceStrings
2424+ substring
2525+ stringLength
2626+ hasInfix
2727+ hasSuffix
2828+ typeOf
2929+ match
3030+ ;
3131+ inherit (lib.lists) all isList flatten;
3232+ inherit (lib.attrsets)
3333+ attrsToList
3434+ filterAttrs
3535+ optionalAttrs
3636+ mapAttrs'
3737+ mapAttrsToList
3838+ nameValuePair
3939+ ;
4040+ inherit (lib.generators) toKeyValue;
4141+ inherit (lib) types;
4242+4343+ # Deeply checks types for a given type function. Calls `override` with type and value.
4444+ deep =
4545+ func: override: type:
4646+ let
4747+ prev = func type;
4848+ in
4949+ prev
5050+ // {
5151+ check = value: prev.check value && (override type value);
5252+ };
5353+5454+ # Deep listOf.
5555+ listOf' = deep types.listOf (type: value: all type.check value);
5656+5757+ # Deep attrsOf.
5858+ attrsOf' = deep types.attrsOf (type: value: all (item: type.check item.value) (attrsToList value));
5959+6060+ # Kismet config atoms.
6161+ atom =
6262+ with types;
6363+ oneOf [
6464+ number
6565+ bool
6666+ str
6767+ ];
6868+6969+ # Composite types.
7070+ listOfAtom = listOf' atom;
7171+ atomOrList = with types; either atom listOfAtom;
7272+ lists = listOf' atomOrList;
7373+ kvPair = attrsOf' atomOrList;
7474+ kvPairs = listOf' kvPair;
7575+7676+ # Options that eval to a string with a header (foo:key=value)
7777+ headerKvPair = attrsOf' (attrsOf' atomOrList);
7878+ headerKvPairs = attrsOf' (listOf' (attrsOf' atomOrList));
7979+8080+ # Toplevel config type.
8181+ topLevel =
8282+ let
8383+ topLevel' =
8484+ with types;
8585+ oneOf [
8686+ headerKvPairs
8787+ headerKvPair
8888+ kvPairs
8989+ kvPair
9090+ listOfAtom
9191+ lists
9292+ atom
9393+ ];
9494+ in
9595+ topLevel'
9696+ // {
9797+ description = "Kismet config stanza";
9898+ };
9999+100100+ # Throws invalid.
101101+ invalid = atom: throw "invalid value '${toString atom}' of type '${typeOf atom}'";
102102+103103+ # Converts an atom.
104104+ mkAtom =
105105+ atom:
106106+ if isString atom then
107107+ if hasInfix "\"" atom || hasInfix "," atom then
108108+ ''"${replaceStrings [ ''"'' ] [ ''\"'' ] atom}"''
109109+ else
110110+ atom
111111+ else if isFloat atom || isInt atom || isBool atom then
112112+ toString atom
113113+ else
114114+ invalid atom;
115115+116116+ # Converts an inline atom or list to a string.
117117+ mkAtomOrListInline =
118118+ atomOrList:
119119+ if isList atomOrList then
120120+ mkAtom "${concatMapStringsSep "," mkAtom atomOrList}"
121121+ else
122122+ mkAtom atomOrList;
123123+124124+ # Converts an out of line atom or list to a string.
125125+ mkAtomOrList =
126126+ atomOrList:
127127+ if isList atomOrList then
128128+ "${concatMapStringsSep "," mkAtomOrListInline atomOrList}"
129129+ else
130130+ mkAtom atomOrList;
131131+132132+ # Throws if the string matches the given regex.
133133+ deny =
134134+ regex: str:
135135+ assert (match regex str) == null;
136136+ str;
137137+138138+ # Converts a set of k/v pairs.
139139+ convertKv = concatMapAttrsStringSep "," (
140140+ name: value: "${mkAtom (deny "=" name)}=${mkAtomOrListInline value}"
141141+ );
142142+143143+ # Converts k/v pairs with a header.
144144+ convertKvWithHeader = header: attrs: "${mkAtom (deny ":" header)}:${convertKv attrs}";
145145+146146+ # Converts the entire config.
147147+ convertConfig = mapAttrs' (
148148+ name: value:
149149+ let
150150+ # Convert foo' into 'foo+' for support for '+=' syntax.
151151+ newName = if hasSuffix "'" name then substring 0 (stringLength name - 1) name + "+" else name;
152152+153153+ # Get the stringified value.
154154+ newValue =
155155+ if headerKvPairs.check value then
156156+ flatten (
157157+ mapAttrsToList (header: values: (map (value: convertKvWithHeader header value) values)) value
158158+ )
159159+ else if headerKvPair.check value then
160160+ mapAttrsToList convertKvWithHeader value
161161+ else if kvPairs.check value then
162162+ map convertKv value
163163+ else if kvPair.check value then
164164+ convertKv value
165165+ else if listOfAtom.check value then
166166+ mkAtomOrList value
167167+ else if lists.check value then
168168+ map mkAtomOrList value
169169+ else if atom.check value then
170170+ mkAtom value
171171+ else
172172+ invalid value;
173173+ in
174174+ nameValuePair newName newValue
175175+ );
176176+177177+ mkKismetConf =
178178+ options:
179179+ (toKeyValue { listsAsDuplicateKeys = true; }) (
180180+ filterAttrs (_: value: value != null) (convertConfig options)
181181+ );
182182+183183+ cfg = config.services.kismet;
184184+in
185185+{
186186+ options.services.kismet = {
187187+ enable = mkEnableOption "kismet";
188188+ package = mkPackageOption pkgs "kismet" { };
189189+ user = mkOption {
190190+ description = "The user to run Kismet as.";
191191+ type = types.str;
192192+ default = "kismet";
193193+ };
194194+ group = mkOption {
195195+ description = "The group to run Kismet as.";
196196+ type = types.str;
197197+ default = "kismet";
198198+ };
199199+ serverName = mkOption {
200200+ description = "The name of the server.";
201201+ type = types.str;
202202+ default = "Kismet";
203203+ };
204204+ serverDescription = mkOption {
205205+ description = "The description of the server.";
206206+ type = types.str;
207207+ default = "NixOS Kismet server";
208208+ };
209209+ logTypes = mkOption {
210210+ description = "The log types.";
211211+ type = with types; listOf str;
212212+ default = [ "kismet" ];
213213+ };
214214+ dataDir = mkOption {
215215+ description = "The Kismet data directory.";
216216+ type = types.path;
217217+ default = "/var/lib/kismet";
218218+ };
219219+ httpd = {
220220+ enable = mkOption {
221221+ description = "True to enable the HTTP server.";
222222+ type = types.bool;
223223+ default = false;
224224+ };
225225+ address = mkOption {
226226+ description = "The address to listen on. Note that this cannot be a hostname or Kismet will not start.";
227227+ type = types.str;
228228+ default = "127.0.0.1";
229229+ };
230230+ port = mkOption {
231231+ description = "The port to listen on.";
232232+ type = types.port;
233233+ default = 2501;
234234+ };
235235+ };
236236+ settings = mkOption {
237237+ description = ''
238238+ Options for Kismet. See:
239239+ https://www.kismetwireless.net/docs/readme/configuring/configfiles/
240240+ '';
241241+ default = { };
242242+ type = with types; attrsOf topLevel;
243243+ example = literalExpression ''
244244+ {
245245+ /* Examples for atoms */
246246+ # dot11_link_bssts=false
247247+ dot11_link_bssts = false; # Boolean
248248+249249+ # dot11_related_bss_window=10000000
250250+ dot11_related_bss_window = 10000000; # Integer
251251+252252+ # devicefound=00:11:22:33:44:55
253253+ devicefound = "00:11:22:33:44:55"; # String
254254+255255+ # log_types+=wiglecsv
256256+ log_types' = "wiglecsv";
257257+258258+ /* Examples for lists of atoms */
259259+ # wepkey=00:DE:AD:C0:DE:00,FEEDFACE42
260260+ wepkey = [ "00:DE:AD:C0:DE:00" "FEEDFACE42" ];
261261+262262+ # alert=ADHOCCONFLICT,5/min,1/sec
263263+ # alert=ADVCRYPTCHANGE,5/min,1/sec
264264+ alert = [
265265+ [ "ADHOCCONFLICT" "5/min" "1/sec" ]
266266+ [ "ADVCRYPTCHANGE" "5/min" "1/sec" ]
267267+ ];
268268+269269+ /* Examples for sets of atoms */
270270+ # source=wlan0:name=ath11k
271271+ source.wlan0 = { name = "ath11k"; };
272272+273273+ /* Examples with colon-suffixed headers */
274274+ # gps=gpsd:host=localhost,port=2947
275275+ gps.gpsd = {
276276+ host = "localhost";
277277+ port = 2947;
278278+ };
279279+280280+ # apspoof=Foo1:ssid=Bar1,validmacs="00:11:22:33:44:55,aa:bb:cc:dd:ee:ff"
281281+ # apspoof=Foo1:ssid=Bar2,validmacs="01:12:23:34:45:56,ab:bc:cd:de:ef:f0"
282282+ # apspoof=Foo2:ssid=Baz1,validmacs="11:22:33:44:55:66,bb:cc:dd:ee:ff:00"
283283+ apspoof.Foo1 = [
284284+ { ssid = "Bar1"; validmacs = [ "00:11:22:33:44:55" "aa:bb:cc:dd:ee:ff" ]; }
285285+ { ssid = "Bar2"; validmacs = [ "01:12:23:34:45:56" "ab:bc:cd:de:ef:f0" ]; }
286286+ ];
287287+288288+ # because Foo1 is a list, Foo2 needs to be as well
289289+ apspoof.Foo2 = [
290290+ {
291291+ ssid = "Bar2";
292292+ validmacs = [ "00:11:22:33:44:55" "aa:bb:cc:dd:ee:ff" ];
293293+ };
294294+ ];
295295+ }
296296+ '';
297297+ };
298298+ extraConfig = mkOption {
299299+ description = ''
300300+ Literal Kismet config lines appended to the site config.
301301+ Note that `services.kismet.settings` allows you to define
302302+ all options here using Nix attribute sets.
303303+ '';
304304+ default = "";
305305+ type = types.str;
306306+ example = ''
307307+ # Looks like the following in `services.kismet.settings`:
308308+ # wepkey = [ "00:DE:AD:C0:DE:00" "FEEDFACE42" ];
309309+ wepkey=00:DE:AD:C0:DE:00,FEEDFACE42
310310+ '';
311311+ };
312312+ };
313313+314314+ config =
315315+ let
316316+ configDir = "${cfg.dataDir}/.kismet";
317317+ settings =
318318+ cfg.settings
319319+ // {
320320+ server_name = cfg.serverName;
321321+ server_description = cfg.serverDescription;
322322+ logging_enabled = cfg.logTypes != [ ];
323323+ log_types = cfg.logTypes;
324324+ }
325325+ // optionalAttrs cfg.httpd.enable {
326326+ httpd_bind_address = cfg.httpd.address;
327327+ httpd_port = cfg.httpd.port;
328328+ httpd_auth_file = "${configDir}/kismet_httpd.conf";
329329+ httpd_home = "${cfg.package}/share/kismet/httpd";
330330+ };
331331+ in
332332+ mkIf cfg.enable {
333333+ systemd.tmpfiles.settings = {
334334+ "10-kismet" = {
335335+ ${cfg.dataDir} = {
336336+ d = {
337337+ inherit (cfg) user group;
338338+ mode = "0750";
339339+ };
340340+ };
341341+ ${configDir} = {
342342+ d = {
343343+ inherit (cfg) user group;
344344+ mode = "0750";
345345+ };
346346+ };
347347+ };
348348+ };
349349+ systemd.services.kismet =
350350+ let
351351+ kismetConf = pkgs.writeText "kismet.conf" ''
352352+ ${mkKismetConf settings}
353353+ ${cfg.extraConfig}
354354+ '';
355355+ in
356356+ {
357357+ description = "Kismet monitoring service";
358358+ wants = [ "basic.target" ];
359359+ after = [
360360+ "basic.target"
361361+ "network.target"
362362+ ];
363363+ wantedBy = [ "multi-user.target" ];
364364+ serviceConfig =
365365+ let
366366+ capabilities = [
367367+ "CAP_NET_ADMIN"
368368+ "CAP_NET_RAW"
369369+ ];
370370+ kismetPreStart = pkgs.writeShellScript "kismet-pre-start" ''
371371+ owner=${escapeShellArg "${cfg.user}:${cfg.group}"}
372372+ mkdir -p ~/.kismet
373373+374374+ # Ensure permissions on directories Kismet uses.
375375+ chown "$owner" ~/ ~/.kismet
376376+ cd ~/.kismet
377377+378378+ package=${cfg.package}
379379+ if [ -d "$package/etc" ]; then
380380+ for file in "$package/etc"/*.conf; do
381381+ # Symlink the config files if they exist or are already a link.
382382+ base="''${file##*/}"
383383+ if [ ! -f "$base" ] || [ -L "$base" ]; then
384384+ ln -sf "$file" "$base"
385385+ fi
386386+ done
387387+ fi
388388+389389+ for file in kismet_httpd.conf; do
390390+ # Un-symlink these files.
391391+ if [ -L "$file" ]; then
392392+ cp "$file" ".$file"
393393+ rm -f "$file"
394394+ mv ".$file" "$file"
395395+ chmod 0640 "$file"
396396+ chown "$owner" "$file"
397397+ fi
398398+ done
399399+400400+ # Link the site config.
401401+ ln -sf ${kismetConf} kismet_site.conf
402402+ '';
403403+ in
404404+ {
405405+ Type = "simple";
406406+ ExecStart = escapeShellArgs [
407407+ "${cfg.package}/bin/kismet"
408408+ "--homedir"
409409+ cfg.dataDir
410410+ "--confdir"
411411+ configDir
412412+ "--datadir"
413413+ "${cfg.package}/share"
414414+ "--no-ncurses"
415415+ "-f"
416416+ "${configDir}/kismet.conf"
417417+ ];
418418+ WorkingDirectory = cfg.dataDir;
419419+ ExecStartPre = "+${kismetPreStart}";
420420+ Restart = "always";
421421+ KillMode = "control-group";
422422+ CapabilityBoundingSet = capabilities;
423423+ AmbientCapabilities = capabilities;
424424+ LockPersonality = true;
425425+ NoNewPrivileges = true;
426426+ PrivateDevices = false;
427427+ PrivateTmp = true;
428428+ PrivateUsers = false;
429429+ ProtectClock = true;
430430+ ProtectControlGroups = true;
431431+ ProtectHome = true;
432432+ ProtectHostname = true;
433433+ ProtectKernelLogs = true;
434434+ ProtectKernelModules = true;
435435+ ProtectKernelTunables = true;
436436+ ProtectProc = "invisible";
437437+ ProtectSystem = "full";
438438+ RestrictNamespaces = true;
439439+ RestrictSUIDSGID = true;
440440+ User = cfg.user;
441441+ Group = cfg.group;
442442+ UMask = "0007";
443443+ TimeoutStopSec = 30;
444444+ };
445445+446446+ # Allow it to restart if the wifi interface is not up
447447+ unitConfig.StartLimitIntervalSec = 5;
448448+ };
449449+ users.groups.${cfg.group} = { };
450450+ users.users.${cfg.user} = {
451451+ inherit (cfg) group;
452452+ description = "User for running Kismet";
453453+ isSystemUser = true;
454454+ home = cfg.dataDir;
455455+ };
456456+ };
457457+458458+ meta.maintainers = with lib.maintainers; [ numinit ];
459459+}
+200
nixos/modules/services/networking/vwifi.nix
···11+{
22+ config,
33+ lib,
44+ pkgs,
55+ ...
66+}:
77+88+let
99+ inherit (lib.modules) mkIf mkMerge;
1010+ inherit (lib.options) mkOption mkPackageOption mkEnableOption;
1111+ inherit (lib.lists) optional optionals;
1212+ inherit (lib.strings)
1313+ hasSuffix
1414+ escapeShellArgs
1515+ ;
1616+ inherit (lib) types;
1717+ cfg = config.services.vwifi;
1818+in
1919+{
2020+ options = {
2121+ services.vwifi =
2222+ let
2323+ mkOptionalPort =
2424+ name:
2525+ mkOption {
2626+ description = ''
2727+ The ${name} port. Set to null if we should leave it unset.
2828+ '';
2929+ type = with types; nullOr port;
3030+ default = null;
3131+ };
3232+ in
3333+ {
3434+ package = mkPackageOption pkgs "vwifi" { };
3535+ module = {
3636+ enable = mkEnableOption "mac80211_hwsim module";
3737+ numRadios = mkOption {
3838+ description = "The number of virtual radio interfaces to create.";
3939+ type = types.int;
4040+ default = 1;
4141+ };
4242+ macPrefix = mkOption {
4343+ description = ''
4444+ The prefix for MAC addresses to use, without the trailing ':'.
4545+ If one radio is created, you can specify the whole MAC address here.
4646+ The default is defined in vwifi/src/config.h.
4747+ '';
4848+ type = types.strMatching "^(([0-9A-Fa-f]{2}:){0,5}[0-9A-Fa-f]{2})$";
4949+ default = "74:F8:F6";
5050+ };
5151+ };
5252+ client = {
5353+ enable = mkEnableOption "vwifi client";
5454+ spy = mkEnableOption "spy mode, useful for wireless monitors";
5555+ serverAddress = mkOption {
5656+ description = ''
5757+ The address of the server. If set to null, will try to use the vsock protocol.
5858+ Note that this assumes that the server is spawned on the host and passed through to
5959+ QEMU, with something like:
6060+6161+ -device vhost-vsock-pci,id=vwifi0,guest-cid=42
6262+ '';
6363+ type = with types; nullOr str;
6464+ default = null;
6565+ };
6666+ serverPort = mkOptionalPort "server port";
6767+ extraArgs = mkOption {
6868+ description = ''
6969+ Extra arguments to pass to vwifi-client. You can use this if you want to bring
7070+ the radios up using vwifi-client instead of at boot.
7171+ '';
7272+ type = with types; listOf str;
7373+ default = [ ];
7474+ example = [
7575+ "--number"
7676+ "3"
7777+ ];
7878+ };
7979+ };
8080+ server = {
8181+ enable = mkEnableOption "vwifi server";
8282+ vsock.enable = mkEnableOption "vsock kernel module";
8383+ ports = {
8484+ vhost = mkOptionalPort "vhost";
8585+ tcp = mkOptionalPort "TCP server";
8686+ spy = mkOptionalPort "spy interface";
8787+ control = mkOptionalPort "control interface";
8888+ };
8989+ openFirewall = mkEnableOption "opening the firewall for the TCP and spy ports";
9090+ extraArgs = mkOption {
9191+ description = ''
9292+ Extra arguments to pass to vwifi-server. You can use this for things including
9393+ changing the ports or inducing packet loss.
9494+ '';
9595+ type = with types; listOf str;
9696+ default = [ ];
9797+ example = [ "--lost-packets" ];
9898+ };
9999+ };
100100+ };
101101+ };
102102+103103+ config = mkMerge [
104104+ (mkIf cfg.module.enable {
105105+ boot.kernelModules = [
106106+ "mac80211_hwsim"
107107+ ];
108108+ boot.extraModprobeConfig = ''
109109+ # We'll add more radios using vwifi-add-interfaces in the systemd unit.
110110+ options mac80211_hwsim radios=0
111111+ '';
112112+ systemd.services.vwifi-add-interfaces = mkIf (cfg.module.numRadios > 0) {
113113+ description = "vwifi interface bringup";
114114+ wantedBy = [ "network-pre.target" ];
115115+ serviceConfig = {
116116+ Type = "oneshot";
117117+ ExecStart =
118118+ let
119119+ args = [
120120+ (toString cfg.module.numRadios)
121121+ cfg.module.macPrefix
122122+ ];
123123+ in
124124+ "${cfg.package}/bin/vwifi-add-interfaces ${escapeShellArgs args}";
125125+ };
126126+ };
127127+ assertions = [
128128+ {
129129+ assertion = !(hasSuffix ":" cfg.module.macPrefix);
130130+ message = ''
131131+ services.vwifi.module.macPrefix should not have a trailing ":".
132132+ '';
133133+ }
134134+ ];
135135+ })
136136+ (mkIf cfg.client.enable {
137137+ systemd.services.vwifi-client =
138138+ let
139139+ clientArgs =
140140+ optional cfg.client.spy "--spy"
141141+ ++ optional (cfg.client.serverAddress != null) cfg.client.serverAddress
142142+ ++ optionals (cfg.client.serverPort != null) [
143143+ "--port"
144144+ cfg.client.serverPort
145145+ ]
146146+ ++ cfg.client.extraArgs;
147147+ in
148148+ rec {
149149+ description = "vwifi client";
150150+ wantedBy = [ "multi-user.target" ];
151151+ after = [ "network.target" ];
152152+ requires = after;
153153+ serviceConfig = {
154154+ ExecStart = "${cfg.package}/bin/vwifi-client ${escapeShellArgs clientArgs}";
155155+ };
156156+ };
157157+ })
158158+ (mkIf cfg.server.enable {
159159+ boot.kernelModules = mkIf cfg.server.vsock.enable [
160160+ "vhost_vsock"
161161+ ];
162162+ networking.firewall.allowedTCPPorts = mkIf cfg.server.openFirewall (
163163+ optional (cfg.server.ports.tcp != null) cfg.server.ports.tcp
164164+ ++ optional (cfg.server.ports.spy != null) cfg.server.ports.spy
165165+ );
166166+ systemd.services.vwifi-server =
167167+ let
168168+ serverArgs =
169169+ optionals (cfg.server.ports.vhost != null) [
170170+ "--port-vhost"
171171+ (toString cfg.server.ports.vhost)
172172+ ]
173173+ ++ optionals (cfg.server.ports.tcp != null) [
174174+ "--port-tcp"
175175+ (toString cfg.server.ports.tcp)
176176+ ]
177177+ ++ optionals (cfg.server.ports.spy != null) [
178178+ "--port-spy"
179179+ (toString cfg.server.ports.spy)
180180+ ]
181181+ ++ optionals (cfg.server.ports.control != null) [
182182+ "--port-ctrl"
183183+ (toString cfg.server.ports.control)
184184+ ]
185185+ ++ cfg.server.extraArgs;
186186+ in
187187+ rec {
188188+ description = "vwifi server";
189189+ wantedBy = [ "multi-user.target" ];
190190+ after = [ "network.target" ];
191191+ requires = after;
192192+ serviceConfig = {
193193+ ExecStart = "${cfg.package}/bin/vwifi-server ${escapeShellArgs serverArgs}";
194194+ };
195195+ };
196196+ })
197197+ ];
198198+199199+ meta.maintainers = with lib.maintainers; [ numinit ];
200200+}
+21-11
nixos/modules/services/web-apps/mattermost.nix
···4141 # The directory to store mutable data within dataDir.
4242 mutableDataDir = "${cfg.dataDir}/data";
43434444- # The plugin directory. Note that this is the *post-unpack* plugin directory,
4545- # since Mattermost unpacks plugins to put them there. (Hence, mutable data.)
4646- pluginDir = "${mutableDataDir}/plugins";
4444+ # The plugin directory. Note that this is the *pre-unpack* plugin directory,
4545+ # since Mattermost looks in mutableDataDir for a directory called "plugins".
4646+ # If Mattermost is installed with plugins defined in a Nix configuration, the plugins
4747+ # are symlinked here. Otherwise, this is a real directory and the tarballs are uploaded here.
4848+ pluginTarballDir = "${mutableDataDir}/plugins";
4949+5050+ # We need a different unpack directory for Mattermost to sync things to at launch,
5151+ # since the above may be a symlink to the store.
5252+ pluginUnpackDir = "${mutableDataDir}/.plugins";
47534854 # Mattermost uses this as a staging directory to unpack plugins, among possibly other things.
4955 # Ensure that it's inside mutableDataDir since it can get rather large.
···232238 services.mattermost.environmentFile = "<your environment file>";
233239 services.mattermost.database.fromEnvironment = true;
234240 '' database;
235235- FileSettings.Directory = cfg.dataDir;
236236- PluginSettings.Directory = "${pluginDir}/server";
237237- PluginSettings.ClientDirectory = "${pluginDir}/client";
241241+242242+ # Note that the plugin tarball directory is not configurable, and is expected to be in FileSettings.Directory/plugins.
243243+ FileSettings.Directory = mutableDataDir;
244244+ PluginSettings.Directory = "${pluginUnpackDir}/server";
245245+ PluginSettings.ClientDirectory = "${pluginUnpackDir}/client";
246246+238247 LogSettings = {
239248 FileLocation = cfg.logDir;
240249···800809 "R- ${tempDir} - - - - -"
801810 "d= ${tempDir} 0750 ${cfg.user} ${cfg.group} - -"
802811803803- # Ensure that pluginDir is a directory, as it could be a symlink on prior versions.
812812+ # Ensure that pluginUnpackDir is a directory.
804813 # Don't remove or clean it out since it should be persistent, as this is where plugins are unpacked.
805805- "d= ${pluginDir} 0750 ${cfg.user} ${cfg.group} - -"
814814+ "d= ${pluginUnpackDir} 0750 ${cfg.user} ${cfg.group} - -"
806815807816 # Ensure that the plugin directories exist.
808817 "d= ${mattermostConf.PluginSettings.Directory} 0750 ${cfg.user} ${cfg.group} - -"
···819828 if cfg.pluginsBundle == null then
820829 # Create the plugin tarball directory to allow plugin uploads.
821830 [
822822- "d= ${cfg.dataDir}/plugins 0750 ${cfg.user} ${cfg.group} - -"
831831+ "d= ${pluginTarballDir} 0750 ${cfg.user} ${cfg.group} - -"
823832 ]
824833 else
825834 # Symlink the plugin tarball directory, removing anything existing, since it's managed by Nix.
826826- [ "L+ ${cfg.dataDir}/plugins - - - - ${cfg.pluginsBundle}" ]
835835+ [ "L+ ${pluginTarballDir} - - - - ${cfg.pluginsBundle}" ]
827836 );
828837829838 systemd.services.mattermost = rec {
···867876 # Logs too.
868877 oldLogs="$dataDir/logs"
869878 newLogs="$logDir"
870870- if [ "$oldLogs" != "$newLogs" ] && [ -d "$oldLogs" ]; then
879879+ if [ "$oldLogs" != "$newLogs" ] && [ -d "$oldLogs" ] && [ ! -f "$newLogs/.initial-created" ]; then
871880 # Migrate the legacy log location to the new log location.
872881 # Allow this to fail if there aren't any logs to move.
873882 echo "Moving legacy logs at $oldLogs to $newLogs" >&2
874883 mkdir -p "$newLogs"
875884 mv "$oldLogs"/* "$newLogs" || true
885885+ touch "$newLogs/.initial-created"
876886 fi
877887 ''
878888 + optionalString (!cfg.mutableConfig) ''
···335335 if [ "$actualPostAttachmentHash" != "$postAttachmentHash" ]; then
336336 echo "Post attachment hash mismatched!" >&2
337337 exit 1
338338- else
338338+ fi
339339+340340+ # Make sure it's on the filesystem in the expected place
341341+ fsPath="$(find /var/lib/mattermost/data -name "$(basename -- "$postAttachment")" -print -quit)"
342342+ if [ -z "$fsPath" ] || [ ! -f "$fsPath" ]; then
343343+ echo "Attachment didn't exist on the filesystem!" >&2
344344+ exit 1
345345+ fi
346346+347347+ # And that the hash matches.
348348+ actualFsAttachmentHash="$(sha256sum "$fsPath" | awk '{print $1}')"
349349+ if [ "$actualFsAttachmentHash" == "$postAttachmentHash" ]; then
339350 echo "Post attachment hash was OK!" >&2
340351 exit 0
352352+ else
353353+ echo "Attachment hash mismatched on disk!" >&2
354354+ exit 1
341355 fi
342356 else
343357 echo "Post didn't exist when it should have!" >&2
···454468 # Switch to the newer config and make sure the plugins directory is replaced with a directory,
455469 # since it could have been a symlink on previous versions.
456470 mostlyMutable.systemctl("stop mattermost.service")
457457- mostlyMutable.succeed(f"[ ! -L /var/lib/mattermost/data/plugins ] && rm -rf /var/lib/mattermost/data/plugins && ln -s {mostlyMutablePlugins} /var/lib/mattermost/data/plugins || true")
458471 mostlyMutable.succeed('[ -L /var/lib/mattermost/data/plugins ] && [ -d /var/lib/mattermost/data/plugins ]')
459472 switch_to_specialisation(mostlyMutable, mostlyMutableToplevel, "upgrade")
460473 wait_mattermost_up(mostlyMutable)
461461- mostlyMutable.succeed('[ ! -L /var/lib/mattermost/data/plugins ] && [ -d /var/lib/mattermost/data/plugins ]')
462474463475 # HelpLink should be changed, still, and the post should still exist
464476 expect_config(mostlyMutable, esr, '.AboutLink == "https://nixos.org" and .HelpLink == "https://nixos.org/nixos/manual"')
···5656 # substitute the markers set by the mark-paths patch
5757 substituteInPlace fpcsrc/compiler/systems/t_linux.pas --subst-var-by dynlinker-prefix "${glibc}"
5858 substituteInPlace fpcsrc/compiler/systems/t_linux.pas --subst-var-by syslibpath "${glibc}/lib"
5959+6060+ substituteInPlace fpcsrc/compiler/systems/t_darwin.pas \
6161+ --replace-fail "LibrarySearchPath.AddLibraryPath(sysrootpath,'=/usr/lib',true)" "LibrarySearchPath.AddLibraryPath(sysrootpath,'$SDKROOT/usr/lib',true)"
6262+5963 # Replace the `codesign --remove-signature` command with a custom script, since `codesign` is not available
6064 # in nixpkgs
6165 # Remove the -no_uuid strip flag which does not work on llvm-strip, only
···7777 '';
78787979 meta = {
8080+ broken = true; # ModuleNotFoundError: No module named 'proton.vpn.local_agent'
8081 description = "Provides the necessary functionality for other ProtonVPN components to interact with NetworkManager";
8182 homepage = "https://github.com/ProtonVPN/python-proton-vpn-network-manager";
8283 license = lib.licenses.gpl3Only;
···240240 ]
241241 },
242242 "notes": {
243243- "hash": "sha256-dpMCehjhPQoOA+MVdLeGc370hmqWzmsMczgV08m/cO4=",
244244- "url": "https://github.com/nextcloud-releases/notes/releases/download/v4.11.0/notes-v4.11.0.tar.gz",
245245- "version": "4.11.0",
246246- "description": "The Notes app is a distraction free notes taking app for [Nextcloud](https://www.nextcloud.com/). It provides categories for better organization and supports formatting using [Markdown](https://en.wikipedia.org/wiki/Markdown) syntax. Notes are saved as files in your Nextcloud, so you can view and edit them with every Nextcloud client. Furthermore, a separate [REST API](https://github.com/nextcloud/notes/blob/master/docs/api/README.md) allows for an easy integration into third-party apps (currently, there are notes apps for [Android](https://github.com/nextcloud/notes-android), [iOS](https://github.com/nextcloud/notes-ios) and the [console](https://git.danielmoch.com/nncli/about) which allow convenient access to your Nextcloud notes). Further features include marking notes as favorites.",
243243+ "hash": "sha256-UdqK6DiC67YPcy84wFEZaT8AQLDhhNndLiEesQeBY7M=",
244244+ "url": "https://github.com/nextcloud-releases/notes/releases/download/v4.12.0/notes-v4.12.0.tar.gz",
245245+ "version": "4.12.0",
246246+ "description": "The Notes app is a distraction free notes taking app for [Nextcloud](https://www.nextcloud.com/). It provides categories for better organization and supports formatting using [Markdown](https://en.wikipedia.org/wiki/Markdown) syntax. Notes are saved as files in your Nextcloud, so you can view and edit them with every Nextcloud client. Furthermore, a separate [REST API](https://github.com/nextcloud/notes/blob/master/docs/api/README.md) allows for an easy integration into apps ([Android](https://github.com/nextcloud/notes-android), [iOS](https://github.com/nextcloud/notes-ios), as well as [3rd-party apps](https://github.com/nextcloud/notes/wiki#3rd-party-clients) which allow convenient access to your Nextcloud notes). Further features include marking notes as favorites.",
247247 "homepage": "https://github.com/nextcloud/notes",
248248 "licenses": [
249249 "agpl"
···340340 ]
341341 },
342342 "sociallogin": {
343343- "hash": "sha256-M2sITpieWvl2WPjxWHtyyZRNQPagYLahVaJcDoiTsh8=",
344344- "url": "https://github.com/zorn-v/nextcloud-social-login/releases/download/v5.9.2/release.tar.gz",
345345- "version": "5.9.2",
343343+ "hash": "sha256-DNf48YmVJ49v+lynTCIBTZhPi/S1mjyIF5OWf+UVKeY=",
344344+ "url": "https://github.com/zorn-v/nextcloud-social-login/releases/download/v6.0.1/release.tar.gz",
345345+ "version": "6.0.1",
346346 "description": "# Social login\n\nMake possible create users and login via Telegram, OAuth or OpenID\n\nFor OAuth you must create app for certain providers. Login button appear at login page if app id specified. Settings are in \"Social login\" section of settings page.\n\n## Installation\n\nLogin to your NextCloud installation as an administrator and under \"Apps\" click \"Download and enable\" next to the \"Social Login\" app.\n\nSee below for setup and configuration instructions.\n\n\n\n## Custom OAuth2/OIDC groups\n\nYou can use groups from your custom provider. For that you should specify \"Groups claim\" in custom OAuth2/OIDC provider settings. That claim should be returned from provider in `id_token` or at user info endpoint. Format should be `array` or comma separated string. Eg (with claim named `roles`)\n\n```json\n{\"roles\": [\"admin\", \"user\"]}\n```\nor\n```json\n{\"roles\": \"admin,user\"}\n```\n\nAlso nested claims is supported. For example `resource_access.client-id.roles` for\n\n```json\n\"resource_access\": {\n \"client-id\": {\n \"roles\": [\n \"client-role-1\",\n \"client-role-2\"\n ]\n }\n}\n```\n\nThere is also support for setting the displayName:\n```\n{\"roles\": [{gid: 1, displayName: \"admin\"}, {gid: 2, displayName: \"user\"}]}\n```\n\n\nYou can use provider groups in two ways:\n\n1. Map provider groups to existing nextcloud groups\n2. Create provider groups in nextcloud and associate it to user (if appropriate option specified)\n\nIf you want sync groups on every login do not forget to check \"Update user profile every login\" setting\n\n## Examples for groups\n\n* You can find example how to configure WSO2IS for return roles claim with OIDC [here](https://medium.com/@dewni.matheesha/claim-mapping-and-retrieving-end-user-information-in-wso2is-cffd5f3937ff)\n* [GitLab OIDC allowing specific GitLab groups](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/gitlab.md)\n\n## Built-in OAuth providers\n\nYou can copy link of certain login button to get proper \"redirect url\" for OAuth app setting.\n\n* [Google](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/google.md)\n* [Amazon](https://developer.amazon.com/loginwithamazon/console/site/lwa/overview.html)\n* [Facebook](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/facebook.md)\n* [Twitter](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/twitter.md)\n* [GitHub](https://github.com/settings/developers)\n* [Discord](#configure-discord)\n* [Telegram](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/telegram.md)\n* PlexTv - you can use any title as app id\n* [Codeberg](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/codeberg.md)\n\nDetails about \"Allow login only from specified domain\" google setting you can find here [#44](https://github.com/zorn-v/nextcloud-social-login/issues/44)\nYou can use comma separated list for multiple domains\n\n## Config\n\nYou can use `'social_login_auto_redirect' => true` setting in `config.php` for auto redirect unauthorized users to social login if only one provider is configured.\nIf you want to temporary disable this function (e.g. for login as local admin), you can add `noredir=1` query parameter in url for login page. Something like `https://cloud.domain.com/login?noredir=1`\n\nTo set options for http client, you can use\n```php\n 'social_login_http_client' => [\n 'timeout' => 45,\n 'proxy' => 'socks4://127.0.0.1:9050', // Check https://curl.se/libcurl/c/CURLOPT_PROXY.html for allowed variants\n ],\n```\nin `config.php`\n\n### Configurate a provider via CLI\n\nYou can configure everything from commandline by using the occ utility. To setup a oidc-provider replace the variables and URLs with values that match your deployment.\n```bash\nphp occ config:app:set sociallogin custom_providers --value='{\"custom_oidc\": [{\"name\": \"gitlab_oidc\", \"title\": \"Gitlab\", \"authorizeUrl\": \"https://gitlab.my-domain.org/oauth/authorize\", \"tokenUrl\": \"https://gitlab.my-domain.org/oauth/token\", \"userInfoUrl\": \"https://gitlab.my-domain.org/oauth/userinfo\", \"logoutUrl\": \"\", \"clientId\": \"$my_application_id\", \"clientSecret\": \"$my_super_secret_secret\", \"scope\": \"openid\", \"groupsClaim\": \"groups\", \"style\": \"gitlab\", \"defaultGroup\": \"\"}]}'\n```\nto do this with docker you just need to add `docker exec -t -uwww-data CONTAINER_NAME` in front of the command, or run it interactively from `docker exec -it -uwww-data CONTAINER_NAME sh`\n\nTo find out how to configure other providers, just configure them in the GUI and take a look at the database afterwards:\n```\nmysql -u nextcloud -p nextcloud\nPassword: <yourpassword>\n\n> SELECT * FROM oc_appconfig WHERE appid='sociallogin';\n```\n\nOr just run\n\n`docker exec -t -uwww-data CONTAINER_NAME php occ config:app:get sociallogin custom_providers`\n\n### Configure Discord\n\nTo properly configure discord you have to:\n\n1. Create new discord application on [DiscordApp developers](https://discordapp.com/developers/applications/me#top)\n2. Open tab `Settings -> OAuth2 -> General`. In `Redirects` add new redirection link looking like this: `https://nextcloud.mydomain.com/apps/sociallogin/oauth/discord`.\n3. Copy `CLIENT ID` and generate and copy `CLIENT SECRET`\n4. Open in Nextcloud `Settings -> Social Login` and paste `CLIENT ID` into field `App id` and `CLIENT SECRET` into `Secret`.\n5. Select default group for users created this way.\n6. For group mapping check [#395](https://github.com/zorn-v/nextcloud-social-login/pull/395)\n\n## Hint\n\n### About Callback(Reply) Url\nYou can copy link from specific login button on login page and paste it on provider's website as callback url. To make proper button visible, just fill certain provider settings with random data and change it later.\n\nSome users may get strange reply(Callback) url error from provider even if you pasted the right url, that's because your nextcloud server may generate http urls when you are actually using https.\nPlease set 'overwriteprotocol' => 'https', in your config.php file.",
347347 "homepage": "https://github.com/zorn-v/nextcloud-social-login",
348348 "licenses": [
+13-13
pkgs/servers/nextcloud/packages/30.json
···4040 ]
4141 },
4242 "contacts": {
4343- "hash": "sha256-suiKZfa+nL9xMFkkZwlrrGiicoIf5zyxpNXS3q7nCC8=",
4444- "url": "https://github.com/nextcloud-releases/contacts/releases/download/v7.0.5/contacts-v7.0.5.tar.gz",
4545- "version": "7.0.5",
4343+ "hash": "sha256-3G1di/PnOAIML2vwKglmuMApvn8+nXYjdqnySSSoLDI=",
4444+ "url": "https://github.com/nextcloud-releases/contacts/releases/download/v7.0.6/contacts-v7.0.6.tar.gz",
4545+ "version": "7.0.6",
4646 "description": "The Nextcloud contacts app is a user interface for Nextcloud's CardDAV server. Easily sync contacts from various devices with your Nextcloud and edit them online.\n\n* 🚀 **Integration with other Nextcloud apps!** Currently Mail and Calendar – more to come.\n* 🎉 **Never forget a birthday!** You can sync birthdays and other recurring events with your Nextcloud Calendar.\n* 👥 **Sharing of Adressbooks!** You want to share your contacts with your friends or coworkers? No problem!\n* 🙈 **We’re not reinventing the wheel!** Based on the great and open SabreDAV library.",
4747 "homepage": "https://github.com/nextcloud/contacts#readme",
4848 "licenses": [
···190190 ]
191191 },
192192 "mail": {
193193- "hash": "sha256-PeDfYIaU1HNONCI/aNwsMv0gBUArATj/dXKUW52ejW8=",
194194- "url": "https://github.com/nextcloud-releases/mail/releases/download/v4.3.6/mail-v4.3.6.tar.gz",
195195- "version": "4.3.6",
193193+ "hash": "sha256-AV0vrDU4zeg7AQQpJkj5mHQatxCa2RMON5tY4Q/OjyM=",
194194+ "url": "https://github.com/nextcloud-releases/mail/releases/download/v5.0.0/mail-v5.0.0.tar.gz",
195195+ "version": "5.0.0",
196196 "description": "**💌 A mail app for Nextcloud**\n\n- **🚀 Integration with other Nextcloud apps!** Currently Contacts, Calendar & Files – more to come.\n- **📥 Multiple mail accounts!** Personal and company account? No problem, and a nice unified inbox. Connect any IMAP account.\n- **🔒 Send & receive encrypted mails!** Using the great [Mailvelope](https://mailvelope.com) browser extension.\n- **🙈 We’re not reinventing the wheel!** Based on the great [Horde](https://horde.org) libraries.\n- **📬 Want to host your own mail server?** We do not have to reimplement this as you could set up [Mail-in-a-Box](https://mailinabox.email)!\n\n## Ethical AI Rating\n\n### Priority Inbox\n\nPositive:\n* The software for training and inferencing of this model is open source.\n* The model is created and trained on-premises based on the user's own data.\n* The training data is accessible to the user, making it possible to check or correct for bias or optimise the performance and CO2 usage.\n\n### Thread Summaries (opt-in)\n\n**Rating:** 🟢/🟡/🟠/🔴\n\nThe rating depends on the installed text processing backend. See [the rating overview](https://docs.nextcloud.com/server/latest/admin_manual/ai/index.html) for details.\n\nLearn more about the Nextcloud Ethical AI Rating [in our blog](https://nextcloud.com/blog/nextcloud-ethical-ai-rating/).",
197197 "homepage": "https://github.com/nextcloud/mail#readme",
198198 "licenses": [
···240240 ]
241241 },
242242 "notes": {
243243- "hash": "sha256-dpMCehjhPQoOA+MVdLeGc370hmqWzmsMczgV08m/cO4=",
244244- "url": "https://github.com/nextcloud-releases/notes/releases/download/v4.11.0/notes-v4.11.0.tar.gz",
245245- "version": "4.11.0",
246246- "description": "The Notes app is a distraction free notes taking app for [Nextcloud](https://www.nextcloud.com/). It provides categories for better organization and supports formatting using [Markdown](https://en.wikipedia.org/wiki/Markdown) syntax. Notes are saved as files in your Nextcloud, so you can view and edit them with every Nextcloud client. Furthermore, a separate [REST API](https://github.com/nextcloud/notes/blob/master/docs/api/README.md) allows for an easy integration into third-party apps (currently, there are notes apps for [Android](https://github.com/nextcloud/notes-android), [iOS](https://github.com/nextcloud/notes-ios) and the [console](https://git.danielmoch.com/nncli/about) which allow convenient access to your Nextcloud notes). Further features include marking notes as favorites.",
243243+ "hash": "sha256-UdqK6DiC67YPcy84wFEZaT8AQLDhhNndLiEesQeBY7M=",
244244+ "url": "https://github.com/nextcloud-releases/notes/releases/download/v4.12.0/notes-v4.12.0.tar.gz",
245245+ "version": "4.12.0",
246246+ "description": "The Notes app is a distraction free notes taking app for [Nextcloud](https://www.nextcloud.com/). It provides categories for better organization and supports formatting using [Markdown](https://en.wikipedia.org/wiki/Markdown) syntax. Notes are saved as files in your Nextcloud, so you can view and edit them with every Nextcloud client. Furthermore, a separate [REST API](https://github.com/nextcloud/notes/blob/master/docs/api/README.md) allows for an easy integration into apps ([Android](https://github.com/nextcloud/notes-android), [iOS](https://github.com/nextcloud/notes-ios), as well as [3rd-party apps](https://github.com/nextcloud/notes/wiki#3rd-party-clients) which allow convenient access to your Nextcloud notes). Further features include marking notes as favorites.",
247247 "homepage": "https://github.com/nextcloud/notes",
248248 "licenses": [
249249 "agpl"
···340340 ]
341341 },
342342 "sociallogin": {
343343- "hash": "sha256-M2sITpieWvl2WPjxWHtyyZRNQPagYLahVaJcDoiTsh8=",
344344- "url": "https://github.com/zorn-v/nextcloud-social-login/releases/download/v5.9.2/release.tar.gz",
345345- "version": "5.9.2",
343343+ "hash": "sha256-DNf48YmVJ49v+lynTCIBTZhPi/S1mjyIF5OWf+UVKeY=",
344344+ "url": "https://github.com/zorn-v/nextcloud-social-login/releases/download/v6.0.1/release.tar.gz",
345345+ "version": "6.0.1",
346346 "description": "# Social login\n\nMake possible create users and login via Telegram, OAuth or OpenID\n\nFor OAuth you must create app for certain providers. Login button appear at login page if app id specified. Settings are in \"Social login\" section of settings page.\n\n## Installation\n\nLogin to your NextCloud installation as an administrator and under \"Apps\" click \"Download and enable\" next to the \"Social Login\" app.\n\nSee below for setup and configuration instructions.\n\n\n\n## Custom OAuth2/OIDC groups\n\nYou can use groups from your custom provider. For that you should specify \"Groups claim\" in custom OAuth2/OIDC provider settings. That claim should be returned from provider in `id_token` or at user info endpoint. Format should be `array` or comma separated string. Eg (with claim named `roles`)\n\n```json\n{\"roles\": [\"admin\", \"user\"]}\n```\nor\n```json\n{\"roles\": \"admin,user\"}\n```\n\nAlso nested claims is supported. For example `resource_access.client-id.roles` for\n\n```json\n\"resource_access\": {\n \"client-id\": {\n \"roles\": [\n \"client-role-1\",\n \"client-role-2\"\n ]\n }\n}\n```\n\nThere is also support for setting the displayName:\n```\n{\"roles\": [{gid: 1, displayName: \"admin\"}, {gid: 2, displayName: \"user\"}]}\n```\n\n\nYou can use provider groups in two ways:\n\n1. Map provider groups to existing nextcloud groups\n2. Create provider groups in nextcloud and associate it to user (if appropriate option specified)\n\nIf you want sync groups on every login do not forget to check \"Update user profile every login\" setting\n\n## Examples for groups\n\n* You can find example how to configure WSO2IS for return roles claim with OIDC [here](https://medium.com/@dewni.matheesha/claim-mapping-and-retrieving-end-user-information-in-wso2is-cffd5f3937ff)\n* [GitLab OIDC allowing specific GitLab groups](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/gitlab.md)\n\n## Built-in OAuth providers\n\nYou can copy link of certain login button to get proper \"redirect url\" for OAuth app setting.\n\n* [Google](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/google.md)\n* [Amazon](https://developer.amazon.com/loginwithamazon/console/site/lwa/overview.html)\n* [Facebook](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/facebook.md)\n* [Twitter](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/twitter.md)\n* [GitHub](https://github.com/settings/developers)\n* [Discord](#configure-discord)\n* [Telegram](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/telegram.md)\n* PlexTv - you can use any title as app id\n* [Codeberg](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/codeberg.md)\n\nDetails about \"Allow login only from specified domain\" google setting you can find here [#44](https://github.com/zorn-v/nextcloud-social-login/issues/44)\nYou can use comma separated list for multiple domains\n\n## Config\n\nYou can use `'social_login_auto_redirect' => true` setting in `config.php` for auto redirect unauthorized users to social login if only one provider is configured.\nIf you want to temporary disable this function (e.g. for login as local admin), you can add `noredir=1` query parameter in url for login page. Something like `https://cloud.domain.com/login?noredir=1`\n\nTo set options for http client, you can use\n```php\n 'social_login_http_client' => [\n 'timeout' => 45,\n 'proxy' => 'socks4://127.0.0.1:9050', // Check https://curl.se/libcurl/c/CURLOPT_PROXY.html for allowed variants\n ],\n```\nin `config.php`\n\n### Configurate a provider via CLI\n\nYou can configure everything from commandline by using the occ utility. To setup a oidc-provider replace the variables and URLs with values that match your deployment.\n```bash\nphp occ config:app:set sociallogin custom_providers --value='{\"custom_oidc\": [{\"name\": \"gitlab_oidc\", \"title\": \"Gitlab\", \"authorizeUrl\": \"https://gitlab.my-domain.org/oauth/authorize\", \"tokenUrl\": \"https://gitlab.my-domain.org/oauth/token\", \"userInfoUrl\": \"https://gitlab.my-domain.org/oauth/userinfo\", \"logoutUrl\": \"\", \"clientId\": \"$my_application_id\", \"clientSecret\": \"$my_super_secret_secret\", \"scope\": \"openid\", \"groupsClaim\": \"groups\", \"style\": \"gitlab\", \"defaultGroup\": \"\"}]}'\n```\nto do this with docker you just need to add `docker exec -t -uwww-data CONTAINER_NAME` in front of the command, or run it interactively from `docker exec -it -uwww-data CONTAINER_NAME sh`\n\nTo find out how to configure other providers, just configure them in the GUI and take a look at the database afterwards:\n```\nmysql -u nextcloud -p nextcloud\nPassword: <yourpassword>\n\n> SELECT * FROM oc_appconfig WHERE appid='sociallogin';\n```\n\nOr just run\n\n`docker exec -t -uwww-data CONTAINER_NAME php occ config:app:get sociallogin custom_providers`\n\n### Configure Discord\n\nTo properly configure discord you have to:\n\n1. Create new discord application on [DiscordApp developers](https://discordapp.com/developers/applications/me#top)\n2. Open tab `Settings -> OAuth2 -> General`. In `Redirects` add new redirection link looking like this: `https://nextcloud.mydomain.com/apps/sociallogin/oauth/discord`.\n3. Copy `CLIENT ID` and generate and copy `CLIENT SECRET`\n4. Open in Nextcloud `Settings -> Social Login` and paste `CLIENT ID` into field `App id` and `CLIENT SECRET` into `Secret`.\n5. Select default group for users created this way.\n6. For group mapping check [#395](https://github.com/zorn-v/nextcloud-social-login/pull/395)\n\n## Hint\n\n### About Callback(Reply) Url\nYou can copy link from specific login button on login page and paste it on provider's website as callback url. To make proper button visible, just fill certain provider settings with random data and change it later.\n\nSome users may get strange reply(Callback) url error from provider even if you pasted the right url, that's because your nextcloud server may generate http urls when you are actually using https.\nPlease set 'overwriteprotocol' => 'https', in your config.php file.",
347347 "homepage": "https://github.com/zorn-v/nextcloud-social-login",
348348 "licenses": [
+13-13
pkgs/servers/nextcloud/packages/31.json
···4040 ]
4141 },
4242 "contacts": {
4343- "hash": "sha256-suiKZfa+nL9xMFkkZwlrrGiicoIf5zyxpNXS3q7nCC8=",
4444- "url": "https://github.com/nextcloud-releases/contacts/releases/download/v7.0.5/contacts-v7.0.5.tar.gz",
4545- "version": "7.0.5",
4343+ "hash": "sha256-3G1di/PnOAIML2vwKglmuMApvn8+nXYjdqnySSSoLDI=",
4444+ "url": "https://github.com/nextcloud-releases/contacts/releases/download/v7.0.6/contacts-v7.0.6.tar.gz",
4545+ "version": "7.0.6",
4646 "description": "The Nextcloud contacts app is a user interface for Nextcloud's CardDAV server. Easily sync contacts from various devices with your Nextcloud and edit them online.\n\n* 🚀 **Integration with other Nextcloud apps!** Currently Mail and Calendar – more to come.\n* 🎉 **Never forget a birthday!** You can sync birthdays and other recurring events with your Nextcloud Calendar.\n* 👥 **Sharing of Adressbooks!** You want to share your contacts with your friends or coworkers? No problem!\n* 🙈 **We’re not reinventing the wheel!** Based on the great and open SabreDAV library.",
4747 "homepage": "https://github.com/nextcloud/contacts#readme",
4848 "licenses": [
···190190 ]
191191 },
192192 "mail": {
193193- "hash": "sha256-PeDfYIaU1HNONCI/aNwsMv0gBUArATj/dXKUW52ejW8=",
194194- "url": "https://github.com/nextcloud-releases/mail/releases/download/v4.3.6/mail-v4.3.6.tar.gz",
195195- "version": "4.3.6",
193193+ "hash": "sha256-AV0vrDU4zeg7AQQpJkj5mHQatxCa2RMON5tY4Q/OjyM=",
194194+ "url": "https://github.com/nextcloud-releases/mail/releases/download/v5.0.0/mail-v5.0.0.tar.gz",
195195+ "version": "5.0.0",
196196 "description": "**💌 A mail app for Nextcloud**\n\n- **🚀 Integration with other Nextcloud apps!** Currently Contacts, Calendar & Files – more to come.\n- **📥 Multiple mail accounts!** Personal and company account? No problem, and a nice unified inbox. Connect any IMAP account.\n- **🔒 Send & receive encrypted mails!** Using the great [Mailvelope](https://mailvelope.com) browser extension.\n- **🙈 We’re not reinventing the wheel!** Based on the great [Horde](https://horde.org) libraries.\n- **📬 Want to host your own mail server?** We do not have to reimplement this as you could set up [Mail-in-a-Box](https://mailinabox.email)!\n\n## Ethical AI Rating\n\n### Priority Inbox\n\nPositive:\n* The software for training and inferencing of this model is open source.\n* The model is created and trained on-premises based on the user's own data.\n* The training data is accessible to the user, making it possible to check or correct for bias or optimise the performance and CO2 usage.\n\n### Thread Summaries (opt-in)\n\n**Rating:** 🟢/🟡/🟠/🔴\n\nThe rating depends on the installed text processing backend. See [the rating overview](https://docs.nextcloud.com/server/latest/admin_manual/ai/index.html) for details.\n\nLearn more about the Nextcloud Ethical AI Rating [in our blog](https://nextcloud.com/blog/nextcloud-ethical-ai-rating/).",
197197 "homepage": "https://github.com/nextcloud/mail#readme",
198198 "licenses": [
···230230 ]
231231 },
232232 "notes": {
233233- "hash": "sha256-dpMCehjhPQoOA+MVdLeGc370hmqWzmsMczgV08m/cO4=",
234234- "url": "https://github.com/nextcloud-releases/notes/releases/download/v4.11.0/notes-v4.11.0.tar.gz",
235235- "version": "4.11.0",
236236- "description": "The Notes app is a distraction free notes taking app for [Nextcloud](https://www.nextcloud.com/). It provides categories for better organization and supports formatting using [Markdown](https://en.wikipedia.org/wiki/Markdown) syntax. Notes are saved as files in your Nextcloud, so you can view and edit them with every Nextcloud client. Furthermore, a separate [REST API](https://github.com/nextcloud/notes/blob/master/docs/api/README.md) allows for an easy integration into third-party apps (currently, there are notes apps for [Android](https://github.com/nextcloud/notes-android), [iOS](https://github.com/nextcloud/notes-ios) and the [console](https://git.danielmoch.com/nncli/about) which allow convenient access to your Nextcloud notes). Further features include marking notes as favorites.",
233233+ "hash": "sha256-UdqK6DiC67YPcy84wFEZaT8AQLDhhNndLiEesQeBY7M=",
234234+ "url": "https://github.com/nextcloud-releases/notes/releases/download/v4.12.0/notes-v4.12.0.tar.gz",
235235+ "version": "4.12.0",
236236+ "description": "The Notes app is a distraction free notes taking app for [Nextcloud](https://www.nextcloud.com/). It provides categories for better organization and supports formatting using [Markdown](https://en.wikipedia.org/wiki/Markdown) syntax. Notes are saved as files in your Nextcloud, so you can view and edit them with every Nextcloud client. Furthermore, a separate [REST API](https://github.com/nextcloud/notes/blob/master/docs/api/README.md) allows for an easy integration into apps ([Android](https://github.com/nextcloud/notes-android), [iOS](https://github.com/nextcloud/notes-ios), as well as [3rd-party apps](https://github.com/nextcloud/notes/wiki#3rd-party-clients) which allow convenient access to your Nextcloud notes). Further features include marking notes as favorites.",
237237 "homepage": "https://github.com/nextcloud/notes",
238238 "licenses": [
239239 "agpl"
···330330 ]
331331 },
332332 "sociallogin": {
333333- "hash": "sha256-M2sITpieWvl2WPjxWHtyyZRNQPagYLahVaJcDoiTsh8=",
334334- "url": "https://github.com/zorn-v/nextcloud-social-login/releases/download/v5.9.2/release.tar.gz",
335335- "version": "5.9.2",
333333+ "hash": "sha256-DNf48YmVJ49v+lynTCIBTZhPi/S1mjyIF5OWf+UVKeY=",
334334+ "url": "https://github.com/zorn-v/nextcloud-social-login/releases/download/v6.0.1/release.tar.gz",
335335+ "version": "6.0.1",
336336 "description": "# Social login\n\nMake possible create users and login via Telegram, OAuth or OpenID\n\nFor OAuth you must create app for certain providers. Login button appear at login page if app id specified. Settings are in \"Social login\" section of settings page.\n\n## Installation\n\nLogin to your NextCloud installation as an administrator and under \"Apps\" click \"Download and enable\" next to the \"Social Login\" app.\n\nSee below for setup and configuration instructions.\n\n\n\n## Custom OAuth2/OIDC groups\n\nYou can use groups from your custom provider. For that you should specify \"Groups claim\" in custom OAuth2/OIDC provider settings. That claim should be returned from provider in `id_token` or at user info endpoint. Format should be `array` or comma separated string. Eg (with claim named `roles`)\n\n```json\n{\"roles\": [\"admin\", \"user\"]}\n```\nor\n```json\n{\"roles\": \"admin,user\"}\n```\n\nAlso nested claims is supported. For example `resource_access.client-id.roles` for\n\n```json\n\"resource_access\": {\n \"client-id\": {\n \"roles\": [\n \"client-role-1\",\n \"client-role-2\"\n ]\n }\n}\n```\n\nThere is also support for setting the displayName:\n```\n{\"roles\": [{gid: 1, displayName: \"admin\"}, {gid: 2, displayName: \"user\"}]}\n```\n\n\nYou can use provider groups in two ways:\n\n1. Map provider groups to existing nextcloud groups\n2. Create provider groups in nextcloud and associate it to user (if appropriate option specified)\n\nIf you want sync groups on every login do not forget to check \"Update user profile every login\" setting\n\n## Examples for groups\n\n* You can find example how to configure WSO2IS for return roles claim with OIDC [here](https://medium.com/@dewni.matheesha/claim-mapping-and-retrieving-end-user-information-in-wso2is-cffd5f3937ff)\n* [GitLab OIDC allowing specific GitLab groups](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/gitlab.md)\n\n## Built-in OAuth providers\n\nYou can copy link of certain login button to get proper \"redirect url\" for OAuth app setting.\n\n* [Google](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/google.md)\n* [Amazon](https://developer.amazon.com/loginwithamazon/console/site/lwa/overview.html)\n* [Facebook](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/facebook.md)\n* [Twitter](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/twitter.md)\n* [GitHub](https://github.com/settings/developers)\n* [Discord](#configure-discord)\n* [Telegram](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/telegram.md)\n* PlexTv - you can use any title as app id\n* [Codeberg](https://github.com/zorn-v/nextcloud-social-login/blob/master/docs/sso/codeberg.md)\n\nDetails about \"Allow login only from specified domain\" google setting you can find here [#44](https://github.com/zorn-v/nextcloud-social-login/issues/44)\nYou can use comma separated list for multiple domains\n\n## Config\n\nYou can use `'social_login_auto_redirect' => true` setting in `config.php` for auto redirect unauthorized users to social login if only one provider is configured.\nIf you want to temporary disable this function (e.g. for login as local admin), you can add `noredir=1` query parameter in url for login page. Something like `https://cloud.domain.com/login?noredir=1`\n\nTo set options for http client, you can use\n```php\n 'social_login_http_client' => [\n 'timeout' => 45,\n 'proxy' => 'socks4://127.0.0.1:9050', // Check https://curl.se/libcurl/c/CURLOPT_PROXY.html for allowed variants\n ],\n```\nin `config.php`\n\n### Configurate a provider via CLI\n\nYou can configure everything from commandline by using the occ utility. To setup a oidc-provider replace the variables and URLs with values that match your deployment.\n```bash\nphp occ config:app:set sociallogin custom_providers --value='{\"custom_oidc\": [{\"name\": \"gitlab_oidc\", \"title\": \"Gitlab\", \"authorizeUrl\": \"https://gitlab.my-domain.org/oauth/authorize\", \"tokenUrl\": \"https://gitlab.my-domain.org/oauth/token\", \"userInfoUrl\": \"https://gitlab.my-domain.org/oauth/userinfo\", \"logoutUrl\": \"\", \"clientId\": \"$my_application_id\", \"clientSecret\": \"$my_super_secret_secret\", \"scope\": \"openid\", \"groupsClaim\": \"groups\", \"style\": \"gitlab\", \"defaultGroup\": \"\"}]}'\n```\nto do this with docker you just need to add `docker exec -t -uwww-data CONTAINER_NAME` in front of the command, or run it interactively from `docker exec -it -uwww-data CONTAINER_NAME sh`\n\nTo find out how to configure other providers, just configure them in the GUI and take a look at the database afterwards:\n```\nmysql -u nextcloud -p nextcloud\nPassword: <yourpassword>\n\n> SELECT * FROM oc_appconfig WHERE appid='sociallogin';\n```\n\nOr just run\n\n`docker exec -t -uwww-data CONTAINER_NAME php occ config:app:get sociallogin custom_providers`\n\n### Configure Discord\n\nTo properly configure discord you have to:\n\n1. Create new discord application on [DiscordApp developers](https://discordapp.com/developers/applications/me#top)\n2. Open tab `Settings -> OAuth2 -> General`. In `Redirects` add new redirection link looking like this: `https://nextcloud.mydomain.com/apps/sociallogin/oauth/discord`.\n3. Copy `CLIENT ID` and generate and copy `CLIENT SECRET`\n4. Open in Nextcloud `Settings -> Social Login` and paste `CLIENT ID` into field `App id` and `CLIENT SECRET` into `Secret`.\n5. Select default group for users created this way.\n6. For group mapping check [#395](https://github.com/zorn-v/nextcloud-social-login/pull/395)\n\n## Hint\n\n### About Callback(Reply) Url\nYou can copy link from specific login button on login page and paste it on provider's website as callback url. To make proper button visible, just fill certain provider settings with random data and change it later.\n\nSome users may get strange reply(Callback) url error from provider even if you pasted the right url, that's because your nextcloud server may generate http urls when you are actually using https.\nPlease set 'overwriteprotocol' => 'https', in your config.php file.",
337337 "homepage": "https://github.com/zorn-v/nextcloud-social-login",
338338 "licenses": [
···694694 scikits-samplerate = throw "scikits-samplerate has been removed, it was unsed and unmaintained since 2015"; # added 2024-05-23
695695 selectors2 = throw "selectors2 has been removed: archived by upstream."; # added 2024-07-27
696696 selectors34 = throw "selectors34 has been removed: functionality provided by Python itself; archived by upstream."; # added 2021-06-10
697697+ sentry-sdk_2 = sentry-sdk; # added 2025-04-20
697698 sequoia = throw "python3Packages.sequoia was replaced by pysequoia - built from a dedicated repository, with a new API."; # added 2023-06-24
698699 setuptools_dso = setuptools-dso; # added 2024-03-03
699700 setuptools_scm = setuptools-scm; # added 2021-06-03