diff options
Diffstat (limited to 'trivionomicon/pkgs')
14 files changed, 795 insertions, 0 deletions
diff --git a/trivionomicon/pkgs/athena-bccr/0001-Remove-CheckUpdatePlugin-from-default-list.patch b/trivionomicon/pkgs/athena-bccr/0001-Remove-CheckUpdatePlugin-from-default-list.patch new file mode 100644 index 0000000..a15896a --- /dev/null +++ b/trivionomicon/pkgs/athena-bccr/0001-Remove-CheckUpdatePlugin-from-default-list.patch @@ -0,0 +1,25 @@ +From 5e7eb46f46af6a29a2aea19db722ebc28baede25 Mon Sep 17 00:00:00 2001 +From: Alejandro Soto <alejandro@34project.org> +Date: Sat, 21 Jun 2025 22:37:19 -0600 +Subject: [PATCH] Remove CheckUpdatePlugin from default list + +--- + src/main/java/cr/libre/firmador/Settings.java | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/main/java/cr/libre/firmador/Settings.java b/src/main/java/cr/libre/firmador/Settings.java +index e392a82..c2ab5e4 100644 +--- a/src/main/java/cr/libre/firmador/Settings.java ++++ b/src/main/java/cr/libre/firmador/Settings.java +@@ -160,7 +160,7 @@ public class Settings { + @SuppressWarnings("this-escape") + public Settings() { + activePlugins.add("cr.libre.firmador.plugins.DummyPlugin"); +- activePlugins.add("cr.libre.firmador.plugins.CheckUpdatePlugin"); ++ // activePlugins.add("cr.libre.firmador.plugins.CheckUpdatePlugin"); + // activePlugins.add("cr.libre.firmador.plugins.DocumentSignLogs"); + availablePlugins.add("cr.libre.firmador.plugins.DummyPlugin"); + availablePlugins.add("cr.libre.firmador.plugins.CheckUpdatePlugin"); +-- +2.51.2 + diff --git a/trivionomicon/pkgs/athena-bccr/LaunchGaudi.java b/trivionomicon/pkgs/athena-bccr/LaunchGaudi.java new file mode 100644 index 0000000..e4bcdbf --- /dev/null +++ b/trivionomicon/pkgs/athena-bccr/LaunchGaudi.java @@ -0,0 +1,12 @@ +// Los del BCCR no se molestaron en ponerle un main al Agente Gaudi porque el +// actualizador (que a su vez sí tiene main) carga el jar en memoria y crea una +// instancia de Inicializador usando reflexión. El actualizador no es relevante +// en Nix. En todo caso, dicho actualizador es sumamente frágil y me daría +// demasiada pereza arreglarlo, así que en su lugar usamos este stub para +// launchear Gaudi. + +public class LaunchGaudi { + public static void main(String[] args) { + new InicializadorCliente.Inicializador(""); + } +} diff --git a/trivionomicon/pkgs/athena-bccr/default.nix b/trivionomicon/pkgs/athena-bccr/default.nix new file mode 100644 index 0000000..c4a8575 --- /dev/null +++ b/trivionomicon/pkgs/athena-bccr/default.nix @@ -0,0 +1,31 @@ +{ + callPackage, + lib, +}: let + latest = "deb64-rev26.2"; + + releases = lib.mapAttrs (name: release: release // {name = name;}) (import ./releases.nix); + + overrideUnwrapped = default: new: let + args = default // new; + unwrappedPkgs = lib.filterAttrs (name: _: ! lib.elem name ["override" "overrideDerivation"]) (callPackage ./unwrapped.nix args); + in + lib.fix (unwrapped: lib.mapAttrs (_: pkg: callPackage pkg unwrapped) unwrappedPkgs) + // { + override = overrideUnwrapped args; + }; + + pkgsForRelease = release: let + inherit (unwrapped) card-driver bccr-cacerts; + + unwrapped = overrideUnwrapped {inherit release;} {}; + pkcs11-module = "${card-driver.lib}/${card-driver.pkcs11-path}"; + in { + inherit card-driver bccr-cacerts pkcs11-module; + inherit (release) vendor; + + gaudi = callPackage ./gaudi-env.nix {inherit unwrapped;}; + firmador = callPackage ./firmador.nix {inherit pkcs11-module;}; + }; +in + lib.mapAttrs (_: pkgsForRelease) (releases // {latest = releases.${latest};}) diff --git a/trivionomicon/pkgs/athena-bccr/firmador.nix b/trivionomicon/pkgs/athena-bccr/firmador.nix new file mode 100644 index 0000000..82578e8 --- /dev/null +++ b/trivionomicon/pkgs/athena-bccr/firmador.nix @@ -0,0 +1,57 @@ +{ + fetchgit, + lib, + makeWrapper, + maven, + openjdk, + wrapGAppsHook3, + pkcs11-module ? null, +}: let + jdk = openjdk.override { + enableJavaFX = true; + }; + + version = "1.9.8+master"; +in + maven.buildMavenPackage { + pname = "firmador"; + inherit version; + + src = fetchgit { + url = "https://codeberg.org/firmador/firmador"; + rev = "676b0e3c0dc5adb0628d4d98efcfccfca3daa8a7"; + hash = "sha256-f/EKll1csvUCRSt4G1SeDB4gVW+ZtUgJjlmM7PlafyQ="; + }; + + patches = [ + ./0001-Remove-CheckUpdatePlugin-from-default-list.patch + ]; + + mvnHash = "sha256-0vwJ1f+0UXxrXRaJ1BHqfOXDU/pxrSPdYYEQ71m4jJQ="; + + nativeBuildInputs = [ + makeWrapper + wrapGAppsHook3 + ]; + + postPatch = lib.optionalString (pkcs11-module != null) '' + sed -i 's@/usr/lib/x64-athena/libASEP11.so@${pkcs11-module}@g' src/main/java/cr/libre/firmador/signers/CRSigner.java + ''; + + installPhase = '' + runHook preInstall + + mkdir -p $out/bin $out/share/java + install -Dm644 target/firmador.jar $out/share/java + + makeWrapper ${jdk}/bin/java $out/bin/firmador \ + --add-flags "-jar $out/share/java/firmador.jar" + + runHook postInstall + ''; + + meta = { + homepage = "https://firmador.libre.cr"; + license = lib.licenses.gpl3Plus; + }; + } diff --git a/trivionomicon/pkgs/athena-bccr/gaudi-env.nix b/trivionomicon/pkgs/athena-bccr/gaudi-env.nix new file mode 100644 index 0000000..db79641 --- /dev/null +++ b/trivionomicon/pkgs/athena-bccr/gaudi-env.nix @@ -0,0 +1,62 @@ +{ + buildFHSEnv, + curl, + lib, + writeShellScriptBin, + gaudiHash ? null, + unwrapped, +}: let + unwrappedWithGaudi = unwrapped.override {inherit gaudiHash;}; +in + buildFHSEnv { + name = "gaudi"; + + targetPkgs = pkgs: [ + unwrappedWithGaudi.card-driver.lib + unwrappedWithGaudi.gaudi + + (writeShellScriptBin "launch-gaudi" '' + set -o errexit + set -o pipefail + set -o nounset + + PATH="${lib.makeBinPath [curl]}:$PATH" + + echo "$0: testing for incompatible releases..." >&2 + + jar_name=bccr-firma-fva-clienteMultiplataforma.jar + url="https://www.firmadigital.go.cr/Bccr.Firma.Fva.Actualizador.ClienteFirmadorJava//recursosLiberica17/actualizador/$jar_name" + ca_file="${unwrappedWithGaudi.bccr-cacerts}/root-ca.pem" + url_hash=$(curl -sS --cacert "$ca_file" "$url" | sha256sum | cut -d' ' -f1) + jar_path="${unwrappedWithGaudi.gaudi}/share/java/$jar_name" + jar_hash=$(sha256sum "$jar_path" | cut -d' ' -f1) + + if [ "$url_hash" != "$jar_hash" ]; then + last_modified=$(curl -sS --head --cacert "$ca_file" "$url" | grep -i '^last-modified:' | head -1) + + echo "$0: sha256 mismatch for $jar_path due to server-side update" >&2 + echo "$0: expected: $url_hash" >&2 + echo "$0: actual: $jar_hash" >&2 + echo "$0: $last_modified" >&2 + echo "$0: run the following to download the new client JAR, then update your derivation:" >&2 + echo "$0: \$ ${unwrappedWithGaudi.update-gaudi}" >&2 + + exit 1 + fi + + cache_path_1="''${XDG_CACHE_HOME:-$HOME/.cache}/Agente-GAUDI" + cache_path_2="''${XDG_CACHE_HOME:-$HOME/.cache}/Firmador-BCCR" + + for cache_path in "$cache_path_1" "$cache_path_2"; do + mkdir -p "$cache_path" + ln -sf -- ${unwrappedWithGaudi.gaudi}/share/java/bccr-firma-fva-clienteMultiplataforma.jar "$cache_path" + done + + cp -f --no-preserve=mode -t "$cache_path_1" -- "${unwrappedWithGaudi.gaudi}/share/java/config.properties" + + exec gaudi + '') + ]; + + runScript = "launch-gaudi"; + } diff --git a/trivionomicon/pkgs/athena-bccr/releases.nix b/trivionomicon/pkgs/athena-bccr/releases.nix new file mode 100644 index 0000000..cbc5bdb --- /dev/null +++ b/trivionomicon/pkgs/athena-bccr/releases.nix @@ -0,0 +1,27 @@ +{ + "deb64-rev26" = { + # nix hash convert --hash-algo sha256 --from base16 --to sri $(sha256sum sfd_ClientesLinux_DEB64_Rev26.zip | cut -d' ' -f1) + hash = "sha256-ZPWP9TqJQ5coJAPzUSiaXKVItBWlqFM4smCjOf+gqQM="; + filename = "sfd_ClientesLinux_DEB64_Rev26.zip"; + basename = "sfd_ClientesLinux_DEB64_Rev26"; + vendor = "athena"; + + srcPaths = { + gaudi = "Firma Digital/Agente GAUDI/agente-gaudi_20.0_amd64.deb"; + idprotect = "Firma Digital/PinTool/IDProtect PINTool 7.24.02/DEB/idprotectclient_7.24.02-0_amd64.deb"; + }; + }; + + "deb64-rev26.2" = { + # nix hash convert --hash-algo sha256 --from base16 --to sri $(sha256sum sfd_ClientesLinux_DEB64_Ubuntu24_rev26_02 | cut -d' ' -f1) + hash = "sha256-DNzP0YRnuUbfKLhi7JeQCirdGx4kM7ROqHDkTuVs0mA="; + filename = "sfd_ClientesLinux_DEB64_Ubuntu24_rev26_02.zip"; + basename = "sfd_ClientesLinux_DEB64_Ubuntu24_26_02"; + vendor = "idopte"; + + srcPaths = { + gaudi = "Firma Digital/Agente GAUDI/agente-gaudi_27.0_amd64.deb"; + idopte = "Firma Digital/Idopte/Idopte_6.23.44.0_ubun24_amd64.deb"; + }; + }; +} diff --git a/trivionomicon/pkgs/athena-bccr/unwrapped.nix b/trivionomicon/pkgs/athena-bccr/unwrapped.nix new file mode 100644 index 0000000..c7781e4 --- /dev/null +++ b/trivionomicon/pkgs/athena-bccr/unwrapped.nix @@ -0,0 +1,288 @@ +{ + lib, + requireFile, + release, + gaudiHash ? null, + ... +}: let + inherit (release) srcPaths vendor; + + src = requireFile { + url = "https://soportefirmadigital.com"; + name = release.filename; + + inherit (release) hash; + }; + + gaudiUpdateSrc = {update-gaudi}: + requireFile { + url = "${update-gaudi}"; + name = "gaudi-update-${release.name}.zip"; + + hash = gaudiHash; + }; + + moduleFromDeb = name: args @ { + stdenv, + dpkg, + unzip, + srcPath, + ... + }: + stdenv.mkDerivation ({ + pname = "${name}-unwrapped"; + version = release.name; + + inherit src; + + nativeBuildInputs = [dpkg unzip] ++ (args.nativeBuildInputs or []); + + postUnpack = '' + dpkg -x ${lib.escapeShellArg "${release.basename}/${srcPath}"} ${lib.escapeShellArg release.basename} + ''; + } + // lib.removeAttrs args ["stdenv" "dpkg" "unzip" "srcPath" "nativeBuildInputs"]); + + ase-idprotect = { + autoPatchelfHook, + dpkg, + fontconfig, + freetype, + pcsclite, + stdenv, + unzip, + xorg, + zlib, + ... + }: + moduleFromDeb "ase-idprotect" { + inherit dpkg stdenv unzip; + srcPath = srcPaths.idprotect; + + buildInputs = [ + fontconfig + freetype + pcsclite + stdenv.cc.cc.lib + xorg.libX11 + xorg.libXext + zlib + ]; + + nativeBuildInputs = [ + autoPatchelfHook + ]; + + outputs = ["out" "lib"]; + + installPhase = '' + runHook preInstall + + install -m755 -d $out/bin $lib/{etc,lib/x64-athena} + install -m755 usr/bin/IDProtect{_Manager,PINTool} $out/bin/ + install -m755 usr/lib/x64-athena/* $lib/lib/x64-athena + cp -r etc/Athena $lib/etc/Athena + + runHook postInstall + ''; + + preFixup = '' + patchelf --set-rpath $lib/lib/x64-athena $out/bin/* + ''; + + passthru.pkcs11-path = "lib/x64-athena/libASEP11.so"; + }; + + scmiddleware = { + autoPatchelfHook, + dpkg, + glib, + gtk3, + libappindicator-gtk3, + libnotify, + openssl, + pcsclite, + stdenv, + unzip, + webkitgtk_4_1, + ... + }: + moduleFromDeb "idopte-scmiddleware" { + inherit dpkg stdenv unzip; + srcPath = srcPaths.idopte; + + buildInputs = [ + glib + gtk3 + libappindicator-gtk3 + libnotify + openssl + pcsclite + stdenv.cc.cc.lib + webkitgtk_4_1 + ]; + + nativeBuildInputs = [ + autoPatchelfHook + ]; + + outputs = ["out" "lib"]; + + installPhase = '' + runHook preInstall + + install -m755 -d $out/bin $lib/{etc,lib/SCMiddleware} + install -m755 usr/lib/SCMiddleware/{idocachesrv,SCManager} $out/bin + install -m755 usr/lib/SCMiddleware/*.so $lib/lib/SCMiddleware + cp -r etc/id* $lib/etc + + runHook postInstall + ''; + + preFixup = '' + patchelf --set-rpath $lib/lib/SCMiddleware $lib/lib/SCMiddleware/* $out/bin/* + ''; + + passthru.pkcs11-path = "lib/SCMiddleware/libidop11.so"; + }; +in + { + gaudi = { + autoPatchelfHook, + dpkg, + makeWrapper, + openjdk, + pkgs, + stdenv, + unzip, + writeShellScriptBin, + update-gaudi, + ... + }: let + jdk = openjdk.override { + enableJavaFX = true; + openjfx_jdk = pkgs."openjfx${lib.head (lib.splitString "." openjdk.version)}".override {withWebKit = true;}; + }; + + fakeSudo = writeShellScriptBin "sudo" ""; + gaudiUpdate = gaudiUpdateSrc {inherit update-gaudi;}; + in + moduleFromDeb "gaudi" { + inherit dpkg stdenv unzip; + srcPath = srcPaths.gaudi; + + nativeBuildInputs = [ + autoPatchelfHook + jdk + makeWrapper + ]; + + preBuild = lib.optionalString (gaudiHash != null) '' + unzip -o ${gaudiUpdate} -d opt/Agente-GAUDI/lib/app + ''; + + buildPhase = '' + runHook preBuild + + install -m755 -d $out/{bin,opt/Firmador-BCCR/lib} + cp -r opt/Agente-GAUDI/lib/app $out/opt/Firmador-BCCR/lib/app + + # Preserves the original filename and avoids <hash>-LaunchGaudi.java + ln -s ${./LaunchGaudi.java} LaunchGaudi.java + + javac \ + -cp opt/Agente-GAUDI/lib/app/bccr-firma-fva-clienteMultiplataforma.jar \ + -d $out/opt/Firmador-BCCR/lib/app \ + LaunchGaudi.java + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + install -m755 -d $out/{share,opt/Firmador-BCCR/lib/runtime/lib} + install -m755 -D opt/Agente-GAUDI/bin/Agente-GAUDI $out/opt/Firmador-BCCR/bin/Agente-GAUDI + install -m755 -D opt/Agente-GAUDI/lib/libapplauncher.so $out/opt/Firmador-BCCR/lib/libapplauncher.so + + ln -s ../opt/Firmador-BCCR/lib/app $out/share/java + ln -s Firmador-BCCR $out/opt/Agente-GAUDI + ln -s ${jdk}/lib/openjdk/lib/libjli.so $out/opt/Firmador-BCCR/lib/runtime/lib/libjli.so + + makeWrapper ${jdk}/bin/java $out/bin/gaudi \ + --prefix PATH : ${fakeSudo}/bin \ + --add-flags "-cp $out/share/java:$out/share/java/bccr-firma-fva-clienteMultiplataforma.jar" \ + --add-flags "-Djavax.net.ssl.trustStore=$out/opt/Firmador-BCCR/lib/app/bccr.cacerts" \ + --add-flags "LaunchGaudi" + + runHook postInstall + ''; + }; + + bccr-cacerts = { + openssl, + stdenv, + unzip, + ... + }: + stdenv.mkDerivation { + pname = "bccr-cacerts"; + version = release.name; + + inherit src; + + nativeBuildInputs = [ + openssl + unzip + ]; + + installPhase = '' + cp -r Firma\ Digital/Certificados $out + openssl x509 -in $out/CA\ RAIZ\ NACIONAL\ -\ COSTA\ RICA\ v2.crt -out $out/root-ca.pem -text + ''; + }; + + update-gaudi = { + wget, + writeShellScript, + zip, + bccr-cacerts, + ... + }: + writeShellScript "update-gaudi" '' + set -o errexit + set -o pipefail + set -o nounset + + temp_dir="$(mktemp -d)" + trap 'cd / && rm -rf -- "$temp_dir"' EXIT + cd "$temp_dir" + + PATH="${lib.makeBinPath [wget zip]}:$PATH" + ca_cert="${bccr-cacerts}/root-ca.pem" + base_url="https://www.firmadigital.go.cr/Bccr.Firma.Fva.Actualizador.ClienteFirmadorJava//recursosLiberica17/actualizador" + + wget --ca-certificate="$ca_cert" "$base_url/bccr.cacerts" + wget --ca-certificate="$ca_cert" "$base_url/config.properties" + wget --ca-certificate="$ca_cert" "$base_url/bccr-firma-fva-clienteMultiplataforma.jar" + wget --ca-certificate="$ca_cert" "$base_url/ServicioActualizadorClienteBCCR.jar" + + # https://gist.github.com/stokito/c588b8d6a6a0aee211393d68eea678f2 + TZ=UTC find . -exec touch --no-dereference -a -m -t 198002010000.00 {} + + zip_path="$PWD/gaudi-update-${release.name}.zip" + TZ=UTC zip -q --move --recurse-paths --symlinks -X "$zip_path" . + TZ=UTC touch -a -m -t 198002010000.00 "$zip_path" + + set -x + nix-store --add-fixed sha256 "$zip_path" + set +x + + echo -e "\ngaudiHash: $(nix-hash --to-sri --type sha256 $(sha256sum "$zip_path" | cut -d' ' -f1))" + ''; + } + // lib.optionalAttrs (vendor == "athena") { + card-driver = ase-idprotect; + } + // lib.optionalAttrs (vendor == "idopte") { + card-driver = scmiddleware; + } diff --git a/trivionomicon/pkgs/default.nix b/trivionomicon/pkgs/default.nix new file mode 100644 index 0000000..1b11af9 --- /dev/null +++ b/trivionomicon/pkgs/default.nix @@ -0,0 +1,11 @@ +final: prev: +with prev.lib; let + inherit (final) callPackage; +in { + override = {}; + + athena-bccr = callPackage ./athena-bccr {}; + snapborg = final.python3Packages.callPackage ./snapborg {}; + socialpredict = callPackage ./socialpredict {}; + spliit = callPackage ./spliit {}; +} diff --git a/trivionomicon/pkgs/snapborg/0001-Remove-env-arg-from-subprocess-calls.patch b/trivionomicon/pkgs/snapborg/0001-Remove-env-arg-from-subprocess-calls.patch new file mode 100644 index 0000000..33f7a0c --- /dev/null +++ b/trivionomicon/pkgs/snapborg/0001-Remove-env-arg-from-subprocess-calls.patch @@ -0,0 +1,29 @@ +From c363931656938f9cc3354b8e2797fe9abac1b0e3 Mon Sep 17 00:00:00 2001 +From: Alejandro Soto <alejandro@34project.org> +Date: Sun, 31 Aug 2025 13:30:45 -0600 +Subject: [PATCH] Remove "env" arg from subprocess calls + +--- + snapborg/borg.py | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/snapborg/borg.py b/snapborg/borg.py +index 89a3d84..b74ddf7 100644 +--- a/snapborg/borg.py ++++ b/snapborg/borg.py +@@ -173,11 +173,10 @@ def launch_borg(args, password=None, print_output=False, dryrun=False, cwd=None) + # TODO: parse output from JSON log lines + try: + if print_output: +- subprocess.run(cmd, env=env, check=True, cwd=cwd) ++ subprocess.run(cmd, check=True, cwd=cwd) + else: + subprocess.check_output(cmd, + stderr=subprocess.STDOUT, +- env=env, + cwd=cwd) + except CalledProcessError as e: + if e.returncode == 1: +-- +2.49.0 + diff --git a/trivionomicon/pkgs/snapborg/default.nix b/trivionomicon/pkgs/snapborg/default.nix new file mode 100644 index 0000000..271be5c --- /dev/null +++ b/trivionomicon/pkgs/snapborg/default.nix @@ -0,0 +1,34 @@ +{ + borgbackup, + buildPythonApplication, + fetchFromGitHub, + lib, + packaging, + pyyaml, +}: +buildPythonApplication { + pname = "snapborg"; + version = "0.1.0-unstable-20250331"; + + src = fetchFromGitHub { + repo = "snapborg"; + owner = "enzingerm"; + + rev = "7e860395319f995161a6e0c7954ce47635e3cd59"; + hash = "sha256-RzYL4IHulk1Q/ALWFs6YCTeCO8ohwqXH2NMHRctRVSA="; + }; + + patches = [ + ./0001-Remove-env-arg-from-subprocess-calls.patch # Fixes broken $PATH when calling borg + ]; + + propagatedBuildInputs = [ + borgbackup + packaging + pyyaml + ]; + + preFixup = '' + makeWrapperArgs+=(--prefix PATH : ${lib.makeBinPath [borgbackup]}) + ''; +} diff --git a/trivionomicon/pkgs/socialpredict/0001-Support-POSTGRES_URL-for-overriding-the-PG-DSN.patch b/trivionomicon/pkgs/socialpredict/0001-Support-POSTGRES_URL-for-overriding-the-PG-DSN.patch new file mode 100644 index 0000000..69dc660 --- /dev/null +++ b/trivionomicon/pkgs/socialpredict/0001-Support-POSTGRES_URL-for-overriding-the-PG-DSN.patch @@ -0,0 +1,30 @@ +From 67cf25f7cb397d37d807797b6013447b19c8f73b Mon Sep 17 00:00:00 2001 +From: Alejandro Soto <alejandro@34project.org> +Date: Thu, 29 Jan 2026 23:21:21 -0600 +Subject: [PATCH] Support POSTGRES_URL for overriding the PG DSN + +--- + backend/util/postgres.go | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/util/postgres.go b/util/postgres.go +index ac69932..030f516 100644 +--- a/util/postgres.go ++++ b/util/postgres.go +@@ -49,8 +49,11 @@ func InitDB() { + dbPort = "5432" + } + +- dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=UTC", +- dbHost, dbUser, dbPassword, dbName, dbPort) ++ dsn := os.Getenv("POSTGRES_URL") ++ if dsn == "" { ++ dsn = fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=UTC", ++ dbHost, dbUser, dbPassword, dbName, dbPort) ++ } + + DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{}) + if err != nil { +-- +2.51.2 + diff --git a/trivionomicon/pkgs/socialpredict/0002-Fix-API_URL-api-v0-.-API_URL-v0.patch b/trivionomicon/pkgs/socialpredict/0002-Fix-API_URL-api-v0-.-API_URL-v0.patch new file mode 100644 index 0000000..09b0d70 --- /dev/null +++ b/trivionomicon/pkgs/socialpredict/0002-Fix-API_URL-api-v0-.-API_URL-v0.patch @@ -0,0 +1,47 @@ +From 9ce9d4d3bdbd12dfb3dda98f3d4f72d3bbe724b7 Mon Sep 17 00:00:00 2001 +From: Alejandro Soto <alejandro@34project.org> +Date: Sat, 31 Jan 2026 13:04:28 -0600 +Subject: [PATCH 2/2] Fix ${API_URL}/api/v0/... -> ${API_URL}/v0/... + +--- + src/hooks/usePortfolio.jsx | 2 +- + src/hooks/useUserData.jsx | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/hooks/usePortfolio.jsx b/src/hooks/usePortfolio.jsx +index 0f0774b..a233ea3 100644 +--- a/src/hooks/usePortfolio.jsx ++++ b/src/hooks/usePortfolio.jsx +@@ -17,7 +17,7 @@ const usePortfolio = (username) => { + headers['Content-Type'] = 'application/json'; + } + +- const response = await fetch(`${API_URL}/api/v0/portfolio/${username}`, { headers }); ++ const response = await fetch(`${API_URL}/v0/portfolio/${username}`, { headers }); + if (!response.ok) { + throw new Error('Failed to fetch portfolio'); + } +diff --git a/src/hooks/useUserData.jsx b/src/hooks/useUserData.jsx +index 593594f..960c5aa 100644 +--- a/src/hooks/useUserData.jsx ++++ b/src/hooks/useUserData.jsx +@@ -15,14 +15,14 @@ const useUserData = (username, usePrivateProfile = false) => { + + if (usePrivateProfile) { + // Use private profile endpoint for authenticated user's own profile +- url = `${API_URL}/api/v0/privateprofile`; ++ url = `${API_URL}/v0/privateprofile`; + headers = { + 'Authorization': `Bearer ${token}`, + 'Content-Type': 'application/json' + }; + } else { + // Use public user endpoint for viewing other users' profiles +- url = `${API_URL}/api/v0/userinfo/${username}`; ++ url = `${API_URL}/v0/userinfo/${username}`; + if (token) { + headers = { + 'Authorization': `Bearer ${token}`, +-- +2.51.2 + diff --git a/trivionomicon/pkgs/socialpredict/default.nix b/trivionomicon/pkgs/socialpredict/default.nix new file mode 100644 index 0000000..22dc6a9 --- /dev/null +++ b/trivionomicon/pkgs/socialpredict/default.nix @@ -0,0 +1,66 @@ +{ + buildGoModule, + buildNpmPackage, + fetchFromGitHub, + lib, +}: let + version = "2.1.0"; + + src = fetchFromGitHub { + owner = "openpredictionmarkets"; + repo = "socialpredict"; + tag = "v${version}"; + hash = "sha256-aV6Z7vsqV8zxyB+v7hSyOm/jzGqR8YnhG+xLKSC9Qoo="; + }; + + meta = { + description = "Easy to Deploy Prediction Market Platform "; + homepage = "https://github.com/openpredictionmarkets/socialpredict"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; []; # [ _3442 ]; + }; +in { + backend = buildGoModule { + pname = "socialpredict-backend"; + inherit src version; + + patches = [ + ./0001-Support-POSTGRES_URL-for-overriding-the-PG-DSN.patch + ]; + + sourceRoot = "source/backend"; + vendorHash = "sha256-ah2d+gHe7HULEsqMSUwGOL4D00aY0QtZvcD3pTQp/Q0="; + + meta = meta // {mainProgram = "socialpredict";}; + }; + + frontend = buildNpmPackage { + pname = "socialpredict-frontend"; + inherit src meta version; + + sourceRoot = "source/frontend"; + npmDepsHash = "sha256-zn1yPtvi8DaKESMGAtqnh/66xET+QaCa1TUlpbatI70="; + + patches = [ + ./0002-Fix-API_URL-api-v0-.-API_URL-v0.patch + ]; + + buildPhase = '' + runHook preBuild + + node --max_old_space_size=1024000 ./node_modules/vite/bin/vite.js build + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + mkdir -p $out + cp -r build/* $out + rm $out/env-config.js.template + + runHook postInstall + ''; + }; +} diff --git a/trivionomicon/pkgs/spliit/default.nix b/trivionomicon/pkgs/spliit/default.nix new file mode 100644 index 0000000..280e820 --- /dev/null +++ b/trivionomicon/pkgs/spliit/default.nix @@ -0,0 +1,76 @@ +{ + buildNpmPackage, + fetchFromGitHub, + nodePackages, + lib, + writeShellScriptBin, + pkgs, +}: let + schemaEngine = "${pkgs.prisma-engines}/bin/schema-engine"; + queryEngineBin = "${pkgs.prisma-engines}/bin/query-engine"; + queryEngineLib = "${pkgs.prisma-engines}/lib/libquery_engine.node"; + buildFlags = ["--ignore-scripts"]; +in + buildNpmPackage { + pname = "spliit2"; + version = "master-20250420"; + + src = fetchFromGitHub { + repo = "spliit"; + owner = "spliit-app"; + + rev = "a11efc79c13298c0d282e47496d132538752405f"; + hash = "sha256-v4gaPzLzBbbqw/LDYxe1fiyficcrqcGOop23YPiTrdc="; + }; + + npmDepsHash = "sha256-sd0/7ruNUFxUKTeTwx/v8Vc/G3llkXP6RSDE78h3qVU="; + + nativeBuildInputs = [pkgs.openssl]; + + npmRebuildFlags = buildFlags; + + PRISMA_SCHEMA_ENGINE_BINARY = schemaEngine; + PRISMA_QUERY_ENGINE_BINARY = queryEngineBin; + PRISMA_QUERY_ENGINE_LIBRARY = queryEngineLib; + + preBuild = '' + cp -v scripts/build.env .env + + npx prisma generate + ''; + + npmBuildFlags = buildFlags; + + postInstall = '' + cp -r .next public package.json next.config.mjs $out/lib/node_modules/spliit2 + + install -Dvm755 -t $out/bin ${lib.getExe (writeShellScriptBin "spliit2" '' + set -euxo pipefail + + cd @out@/lib/node_modules/spliit2 + + export PATH="$PWD/node_modules/.bin:$PATH" + export NEXT_TELEMETRY_DISABLED=1 + + export PRISMA_SCHEMA_ENGINE_BINARY="${schemaEngine}" + export PRISMA_QUERY_ENGINE_BINARY="${queryEngineBin}" + export PRISMA_QUERY_ENGINE_LIBRARY="${queryEngineLib}" + + prisma migrate deploy + next start + '')} + + substituteInPlace $out/bin/spliit2 \ + --replace @out@ $out + + wrapProgram $out/bin/spliit2 \ + --prefix PATH : ${lib.makeBinPath [pkgs.openssl]} + ''; + + meta = { + description = "Free and Open Source Alternative to Splitwise. Share expenses with your friends and family."; + homepage = "https://spliit.app"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; []; + }; + } |
