# Run service that spits out an unbound-compatible blocklist of websites,
# as mandated by polish telecommunications law.
#
# https://sip.lex.pl/akty-prawne/dzu-dziennik-ustaw/gry-hazardowe-17581037/art-15-f
# Dz.U.2019.847 t.j.
# Art. 15f. [Rejestr domen służących do oferowania gier hazardowych niezgodnie z ustawą]
# 5.  Przedsiębiorca telekomunikacyjny świadczący usługi dostępu do sieci
#     Internet jest obowiązany do:
#  1) nieodpłatnego uniemożliwienia dostępu do stron internetowych
#     wykorzystujących nazwy domen internetowych wpisanych do Rejestru
#     poprzez ich usunięcie z systemów teleinformatycznych przedsiębiorców
#     telekomunikacyjnych, służących do zamiany nazw domen internetowych na
#     adresy IP, nie później niż w ciągu 48 godzin od dokonania wpisu do
#     Rejestru;
#  2) nieodpłatnego przekierowania połączeń odwołujących się do nazw domen
#     internetowych wpisanych do Rejestru do strony internetowej prowadzonej
#     przez ministra właściwego do spraw finansów publicznych, zawierającej
#     komunikat, skierowany do odbiorców usługi dostępu do Internetu
#     obejmujący w szczególności informacje o lokalizacji Rejestru, wpisaniu
#     szukanej nazwy domeny internetowej do tego Rejestru, listę podmiotów
#     legalnie oferujących gry hazardowe na terytorium Rzeczypospolitej
#     Polskiej, a także powiadomienie o grożącej odpowiedzialności
#     karno-skarbowej uczestnika gier urządzanych wbrew przepisom ustawy;
#  3) nieodpłatnego umożliwienia dostępu do stron internetowych
#     wykorzystujących nazwy domen wykreślonych z Rejestru, nie później niż w
#     ciągu 48 godzin od wykreślenia nazwy domeny internetowej z Rejestru.

{ config, pkgs, lib, ...  }:

with lib;

let
  rshUnbound = pkgs.buildGoModule {
    pname = "rsh-unbound";
    version = "20200926";
    src = pkgs.fetchFromGitHub {
      owner = "q3k";
      repo = "rsh-unbound";
      rev = "31f8975d30a301fdf6f1d445826ebcd671ae07a3";
      sha256 = "sha256-twI9VzPLBgztdccDgB29lJG7ekwpjr1eh27nR5F/TMA=";
    };

    vendorSha256 = "sha256-A8yHaqSWHhvNmGrk6C6XOVYfVaFbiPmKqglg6gImwWM=";
  };

  cfg = config.hscloud.rsh;

in {
  options.hscloud.rsh = with types; {
    enable = mkOption {
      type = bool;
      default = false;
      description = "Enable the RSH-Unboudn service.";
    };
    out = mkOption {
      type = str;
      default = "/var/lib/rsh.conf";
      description = "Output file for generated unbound config.";
    };
    register = mkOption {
      type = str;
      description = "URL of blocklist register.";
      default = "https://hazard.mf.gov.pl/api/Register";
    };
  };

  config = mkIf cfg.enable {
    services.unbound.settings.server.include = [ cfg.out ];
    systemd.services.rsh = {
      wantedBy = [ "multi-user.target" "unbound.service" ];
      serviceConfig = {
        Type = "simple";
        ExecStartPre = "${pkgs.coreutils}/bin/touch ${cfg.out}";
        ExecStart = "${rshUnbound}/bin/rsh-unbound -output ${cfg.out} -register_endpoint ${cfg.register}";
        Restart = "always";
        RestartSec = "10";
      };
    };
  };
}
