diff options
| -rw-r--r-- | accounts/gkleen@sif/zshrc | 68 | ||||
| -rw-r--r-- | hosts/surtr/default.nix | 2 | ||||
| -rw-r--r-- | hosts/surtr/email/default.nix | 70 | ||||
| -rw-r--r-- | modules/postfwd.nix | 19 | ||||
| -rw-r--r-- | overlays/spm/frontend/src/app/spm/spm.component.html | 5 | ||||
| -rw-r--r-- | overlays/spm/frontend/src/app/spm/spm.component.sass | 4 | ||||
| -rw-r--r-- | overlays/spm/wordlist.txt | 1 |
7 files changed, 131 insertions, 38 deletions
diff --git a/accounts/gkleen@sif/zshrc b/accounts/gkleen@sif/zshrc index 1b7cc06c..bda73d76 100644 --- a/accounts/gkleen@sif/zshrc +++ b/accounts/gkleen@sif/zshrc | |||
| @@ -45,7 +45,7 @@ genmail() { | |||
| 45 | s() { | 45 | s() { |
| 46 | dir=$(pwd) | 46 | dir=$(pwd) |
| 47 | [[ ${#@} -ge 1 ]] && dir=$1 | 47 | [[ ${#@} -ge 1 ]] && dir=$1 |
| 48 | 48 | ||
| 49 | shellFile=$(findNix ${@}) | 49 | shellFile=$(findNix ${@}) |
| 50 | [[ ${#@} -ge 1 ]] && shift | 50 | [[ ${#@} -ge 1 ]] && shift |
| 51 | 51 | ||
| @@ -137,7 +137,7 @@ dir() { | |||
| 137 | *) printf "Invalid option: %s\n" $arg >&2; exit 2 ;; | 137 | *) printf "Invalid option: %s\n" $arg >&2; exit 2 ;; |
| 138 | esac | 138 | esac |
| 139 | done | 139 | done |
| 140 | 140 | ||
| 141 | shift $((OPTIND - 1)) | 141 | shift $((OPTIND - 1)) |
| 142 | 142 | ||
| 143 | if [[ -z ${dir} && ${#@} -ge 1 ]]; then | 143 | if [[ -z ${dir} && ${#@} -ge 1 ]]; then |
| @@ -145,7 +145,7 @@ dir() { | |||
| 145 | shift | 145 | shift |
| 146 | fi | 146 | fi |
| 147 | 147 | ||
| 148 | [[ -n ${dir} ]] || return 2; | 148 | [[ -n ${dir} ]] || return 2; |
| 149 | 149 | ||
| 150 | if [[ ! -e ${dir} ]]; then | 150 | if [[ ! -e ${dir} ]]; then |
| 151 | if [[ -z "${gitWorktree}" ]]; then | 151 | if [[ -z "${gitWorktree}" ]]; then |
| @@ -156,7 +156,7 @@ dir() { | |||
| 156 | else | 156 | else |
| 157 | gitWorktree="" | 157 | gitWorktree="" |
| 158 | fi | 158 | fi |
| 159 | 159 | ||
| 160 | ( | 160 | ( |
| 161 | cd ${dir} | 161 | cd ${dir} |
| 162 | export dir; | 162 | export dir; |
| @@ -164,7 +164,7 @@ dir() { | |||
| 164 | ${findNix} && { nixShell=$(findNix) || return $? } | 164 | ${findNix} && { nixShell=$(findNix) || return $? } |
| 165 | 165 | ||
| 166 | [[ -n ${repoUrl} ]] && git clone -- ${repoUrl} . | 166 | [[ -n ${repoUrl} ]] && git clone -- ${repoUrl} . |
| 167 | 167 | ||
| 168 | if [[ -n ${templateArchive} ]]; then | 168 | if [[ -n ${templateArchive} ]]; then |
| 169 | ( | 169 | ( |
| 170 | archiveFile="" | 170 | archiveFile="" |
| @@ -181,16 +181,36 @@ dir() { | |||
| 181 | templateArchive=${archiveFile} | 181 | templateArchive=${archiveFile} |
| 182 | fi | 182 | fi |
| 183 | 183 | ||
| 184 | case $(file --brief --mime-type --dereference ${templateArchive}) in | 184 | unpack=true |
| 185 | application/zip) unzip ${templateArchive} ;; | 185 | while ${unpack}; do |
| 186 | application/vnd.debian.binary-package) | 186 | case $(file --brief --mime-type --dereference ${templateArchive}) in |
| 187 | nix shell nixos#binutils --command ar x ${templateArchive} | 187 | application/zip) |
| 188 | mkdir control data | 188 | unzip ${templateArchive} |
| 189 | tar -C control -xvaf control.* | 189 | unpack=false |
| 190 | tar -C data -xvaf data.* | 190 | ;; |
| 191 | ;; | 191 | application/vnd.debian.binary-package) |
| 192 | *) tar -xvaf ${templateArchive} ;; | 192 | nix shell nixos#binutils --command ar x ${templateArchive} |
| 193 | esac | 193 | mkdir control data |
| 194 | tar -C control -xvaf control.* | ||
| 195 | tar -C data -xvaf data.* | ||
| 196 | unpack=false | ||
| 197 | ;; | ||
| 198 | application/x-rpm) | ||
| 199 | cpioArchive=$(mktemp -t "archive.XXXXXXXXXX.${templateArchive:t:r}.cpio") | ||
| 200 | nix shell nixos#busybox --command rpm2cpio ${templateArchive} > ${cpioArchive} | ||
| 201 | templateArchive=${cpioArchive} | ||
| 202 | unpack=true | ||
| 203 | ;; | ||
| 204 | application/x-cpio) | ||
| 205 | cpio --extract --make-directories --no-absolute-filenames -F ${templateArchive} | ||
| 206 | unpack=false | ||
| 207 | ;; | ||
| 208 | *) | ||
| 209 | tar -xvaf ${templateArchive} | ||
| 210 | unpack=false | ||
| 211 | ;; | ||
| 212 | esac | ||
| 213 | done | ||
| 194 | ) | 214 | ) |
| 195 | fi | 215 | fi |
| 196 | 216 | ||
| @@ -202,7 +222,7 @@ dir() { | |||
| 202 | 222 | ||
| 203 | # typeset -a messages | 223 | # typeset -a messages |
| 204 | # messages=(${(z)$(notmuch search --output=messages ${notmuchMsg})}) | 224 | # messages=(${(z)$(notmuch search --output=messages ${notmuchMsg})}) |
| 205 | 225 | ||
| 206 | # for message (${messages}); do | 226 | # for message (${messages}); do |
| 207 | # typeset -A notmuchAtts | 227 | # typeset -A notmuchAtts |
| 208 | # notmuchAtts=() | 228 | # notmuchAtts=() |
| @@ -253,7 +273,7 @@ dir() { | |||
| 253 | quickserve --root . --upload . --show-hidden --tar gz | 273 | quickserve --root . --upload . --show-hidden --tar gz |
| 254 | fi | 274 | fi |
| 255 | 275 | ||
| 256 | 276 | ||
| 257 | if [[ ${#@} -eq 0 ]] || ${forceShell}; then | 277 | if [[ ${#@} -eq 0 ]] || ${forceShell}; then |
| 258 | if [[ ${#@} -gt 0 ]]; then | 278 | if [[ ${#@} -gt 0 ]]; then |
| 259 | if [[ -z ${nixShell} ]]; then | 279 | if [[ -z ${nixShell} ]]; then |
| @@ -264,11 +284,11 @@ dir() { | |||
| 264 | fi | 284 | fi |
| 265 | 285 | ||
| 266 | cd $(pwd) # Needed for mounting to work | 286 | cd $(pwd) # Needed for mounting to work |
| 267 | 287 | ||
| 268 | isSingleDir() { | 288 | isSingleDir() { |
| 269 | typeset -a contents | 289 | typeset -a contents |
| 270 | contents=(*(N) .*(N)) | 290 | contents=(*(N) .*(N)) |
| 271 | 291 | ||
| 272 | if [[ ${#contents} -eq 1 && -d ${contents[1]} ]]; then | 292 | if [[ ${#contents} -eq 1 && -d ${contents[1]} ]]; then |
| 273 | print ${contents[1]} | 293 | print ${contents[1]} |
| 274 | return 0 | 294 | return 0 |
| @@ -278,7 +298,7 @@ dir() { | |||
| 278 | } | 298 | } |
| 279 | while d=$(isSingleDir); do cd ${d}; done | 299 | while d=$(isSingleDir); do cd ${d}; done |
| 280 | 300 | ||
| 281 | 301 | ||
| 282 | if [[ -z ${nixShell} ]]; then | 302 | if [[ -z ${nixShell} ]]; then |
| 283 | exec -- zsh | 303 | exec -- zsh |
| 284 | else | 304 | else |
| @@ -302,7 +322,7 @@ tmpdir() { | |||
| 302 | printf "Unmounting %s\n" ${1} >&2 | 322 | printf "Unmounting %s\n" ${1} >&2 |
| 303 | fusermount -u ${1} || umount ${1} || sudo umount ${1} | 323 | fusermount -u ${1} || umount ${1} || sudo umount ${1} |
| 304 | } | 324 | } |
| 305 | 325 | ||
| 306 | if mountpoint -q -- ${dir}; then | 326 | if mountpoint -q -- ${dir}; then |
| 307 | unmount ${dir} || return $? | 327 | unmount ${dir} || return $? |
| 308 | else | 328 | else |
| @@ -311,7 +331,7 @@ tmpdir() { | |||
| 311 | unmount ${subDir} || return $? | 331 | unmount ${subDir} || return $? |
| 312 | done <<<$(find ${dir} -xdev -type d -print0 | sort -zr) | 332 | done <<<$(find ${dir} -xdev -type d -print0 | sort -zr) |
| 313 | fi | 333 | fi |
| 314 | 334 | ||
| 315 | rm -rfv --one-file-system -- ${dir} | 335 | rm -rfv --one-file-system -- ${dir} |
| 316 | } | 336 | } |
| 317 | 337 | ||
| @@ -323,7 +343,7 @@ tmpdir() { | |||
| 323 | "?"|":") printf "Invalid option: %s\n" $arg >&2; exit 2 ;; | 343 | "?"|":") printf "Invalid option: %s\n" $arg >&2; exit 2 ;; |
| 324 | esac | 344 | esac |
| 325 | done | 345 | done |
| 326 | 346 | ||
| 327 | ( | 347 | ( |
| 328 | trap cleanup EXIT | 348 | trap cleanup EXIT |
| 329 | 349 | ||
| @@ -362,7 +382,7 @@ nix-ghci() { | |||
| 362 | pkgExpr="${1}" | 382 | pkgExpr="${1}" |
| 363 | shift | 383 | shift |
| 364 | fi | 384 | fi |
| 365 | 385 | ||
| 366 | nix-shell -p "with (import <nixpkgs> {}); pkgs.haskellPackages.ghcWithPackages (p: with p; [${pkgExpr}])" --run "ghci ${@}" | 386 | nix-shell -p "with (import <nixpkgs> {}); pkgs.haskellPackages.ghcWithPackages (p: with p; [${pkgExpr}])" --run "ghci ${@}" |
| 367 | } | 387 | } |
| 368 | 388 | ||
diff --git a/hosts/surtr/default.nix b/hosts/surtr/default.nix index 2be25560..e031c9b3 100644 --- a/hosts/surtr/default.nix +++ b/hosts/surtr/default.nix | |||
| @@ -57,7 +57,7 @@ | |||
| 57 | { address = "202.61.241.61"; prefixLength = 22; } | 57 | { address = "202.61.241.61"; prefixLength = 22; } |
| 58 | ]; | 58 | ]; |
| 59 | ipv6.addresses = [ | 59 | ipv6.addresses = [ |
| 60 | { address = "2a03:4000:52:ada:98e7:16ff:feba:7a2e"; prefixLength = 128; } | 60 | # { address = "2a03:4000:52:ada:98e7:16ff:feba:7a2e"; prefixLength = 128; } |
| 61 | { address = "2a03:4000:52:ada::"; prefixLength = 96; } | 61 | { address = "2a03:4000:52:ada::"; prefixLength = 96; } |
| 62 | ]; | 62 | ]; |
| 63 | }; | 63 | }; |
diff --git a/hosts/surtr/email/default.nix b/hosts/surtr/email/default.nix index 9cfba1f1..2fe5b7f0 100644 --- a/hosts/surtr/email/default.nix +++ b/hosts/surtr/email/default.nix | |||
| @@ -59,6 +59,7 @@ in { | |||
| 59 | 59 | ||
| 60 | services.postfix = { | 60 | services.postfix = { |
| 61 | enable = true; | 61 | enable = true; |
| 62 | enableSmtp = false; | ||
| 62 | hostname = "surtr.yggdrasil.li"; | 63 | hostname = "surtr.yggdrasil.li"; |
| 63 | recipientDelimiter = ""; | 64 | recipientDelimiter = ""; |
| 64 | setSendmail = true; | 65 | setSendmail = true; |
| @@ -66,20 +67,22 @@ in { | |||
| 66 | destination = []; | 67 | destination = []; |
| 67 | sslCert = "/run/credentials/postfix.service/surtr.yggdrasil.li.pem"; | 68 | sslCert = "/run/credentials/postfix.service/surtr.yggdrasil.li.pem"; |
| 68 | sslKey = "/run/credentials/postfix.service/surtr.yggdrasil.li.key.pem"; | 69 | sslKey = "/run/credentials/postfix.service/surtr.yggdrasil.li.key.pem"; |
| 69 | networks = ["127.0.0.0/8" "[::ffff:127.0.0.0]/104" "[::1]/128" "10.141.0.0/16"]; | 70 | networks = []; |
| 70 | config = let | 71 | config = let |
| 71 | relay_ccert = "texthash:${pkgs.writeText "relay_ccert" ""}"; | 72 | relay_ccert = "texthash:${pkgs.writeText "relay_ccert" ""}"; |
| 72 | in { | 73 | in { |
| 74 | smtpd_tls_security_level = "may"; | ||
| 75 | |||
| 73 | #the dh params | 76 | #the dh params |
| 74 | smtpd_tls_dh1024_param_file = toString config.security.dhparams.params."postfix-1024".path; | 77 | smtpd_tls_dh1024_param_file = toString config.security.dhparams.params."postfix-1024".path; |
| 75 | smtpd_tls_dh512_param_file = toString config.security.dhparams.params."postfix-512".path; | 78 | smtpd_tls_dh512_param_file = toString config.security.dhparams.params."postfix-512".path; |
| 76 | #enable ECDH | 79 | #enable ECDH |
| 77 | smtpd_tls_eecdh_grade = "strong"; | 80 | smtpd_tls_eecdh_grade = "strong"; |
| 78 | #enabled SSL protocols, don't allow SSLv2 and SSLv3 | 81 | #enabled SSL protocols, don't allow SSLv2 and SSLv3 |
| 79 | smtpd_tls_protocols = ["!SSLv2" "!SSLv3" "!TLSv1" "!TLSv1.1" "!TLSv1.2"]; | 82 | smtpd_tls_protocols = ["!SSLv2" "!SSLv3" "!TLSv1" "!TLSv1.1"]; |
| 80 | smtpd_tls_mandatory_protocols = ["!SSLv2" "!SSLv3" "!TLSv1" "!TLSv1.1" "!TLSv1.2"]; | 83 | smtpd_tls_mandatory_protocols = ["!SSLv2" "!SSLv3" "!TLSv1" "!TLSv1.1"]; |
| 81 | #allowed ciphers for smtpd_tls_security_level=encrypt | 84 | #allowed ciphers for smtpd_tls_security_level=encrypt |
| 82 | smtpd_tls_mandatory_ciphers = "high"; | 85 | smtpd_tls_mandatory_ciphers = "medium"; |
| 83 | #allowed ciphers for smtpd_tls_security_level=may | 86 | #allowed ciphers for smtpd_tls_security_level=may |
| 84 | #smtpd_tls_ciphers = high | 87 | #smtpd_tls_ciphers = high |
| 85 | #enforce the server cipher preference | 88 | #enforce the server cipher preference |
| @@ -92,6 +95,7 @@ in { | |||
| 92 | smtpd_tls_loglevel = "1"; | 95 | smtpd_tls_loglevel = "1"; |
| 93 | #enable TLS logging to see the ciphers for outbound connections | 96 | #enable TLS logging to see the ciphers for outbound connections |
| 94 | smtp_tls_loglevel = "1"; | 97 | smtp_tls_loglevel = "1"; |
| 98 | tls_medium_cipherlist = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"; | ||
| 95 | 99 | ||
| 96 | smtpd_tls_received_header = true; | 100 | smtpd_tls_received_header = true; |
| 97 | 101 | ||
| @@ -101,6 +105,8 @@ in { | |||
| 101 | smtp_tls_security_level = "dane"; | 105 | smtp_tls_security_level = "dane"; |
| 102 | smtp_dns_support_level = "dnssec"; | 106 | smtp_dns_support_level = "dnssec"; |
| 103 | 107 | ||
| 108 | smtp_tls_connection_reuse = true; | ||
| 109 | |||
| 104 | tls_server_sni_maps = ''texthash:${pkgs.writeText "sni" '' | 110 | tls_server_sni_maps = ''texthash:${pkgs.writeText "sni" '' |
| 105 | bouncy.email /run/credentials/postfix.service/bouncy.email.full.pem | 111 | bouncy.email /run/credentials/postfix.service/bouncy.email.full.pem |
| 106 | mailin.bouncy.email /run/credentials/postfix.service/mailin.bouncy.email.full.pem | 112 | mailin.bouncy.email /run/credentials/postfix.service/mailin.bouncy.email.full.pem |
| @@ -130,7 +136,6 @@ in { | |||
| 130 | dbname = email | 136 | dbname = email |
| 131 | query = SELECT action FROM virtual_mailbox_access WHERE lookup = '%s' | 137 | query = SELECT action FROM virtual_mailbox_access WHERE lookup = '%s' |
| 132 | ''}" | 138 | ''}" |
| 133 | "permit_mynetworks" | ||
| 134 | "check_ccert_access ${relay_ccert}" | 139 | "check_ccert_access ${relay_ccert}" |
| 135 | "reject_non_fqdn_helo_hostname" | 140 | "reject_non_fqdn_helo_hostname" |
| 136 | "reject_invalid_helo_hostname" | 141 | "reject_invalid_helo_hostname" |
| @@ -149,14 +154,15 @@ in { | |||
| 149 | address_verify_poll_delay = "1s"; | 154 | address_verify_poll_delay = "1s"; |
| 150 | 155 | ||
| 151 | smtpd_relay_restrictions = [ | 156 | smtpd_relay_restrictions = [ |
| 152 | "permit_mynetworks" | ||
| 153 | "check_ccert_access ${relay_ccert}" | 157 | "check_ccert_access ${relay_ccert}" |
| 154 | "reject_unauth_destination" | 158 | "reject_unauth_destination" |
| 155 | ]; | 159 | ]; |
| 156 | 160 | ||
| 157 | propagate_unmatched_extensions = ["canonical" "virtual" "alias"]; | 161 | propagate_unmatched_extensions = ["canonical" "virtual" "alias"]; |
| 158 | smtpd_authorized_verp_clients = "$authorized_verp_clients"; | 162 | smtpd_authorized_verp_clients = ""; |
| 159 | authorized_verp_clients = "$mynetworks"; | 163 | authorized_verp_clients = ""; |
| 164 | |||
| 165 | smtpd_client_event_limit_exceptions = ""; | ||
| 160 | 166 | ||
| 161 | milter_default_action = "accept"; | 167 | milter_default_action = "accept"; |
| 162 | smtpd_milters = [config.services.opendkim.socket "local:/run/rspamd/rspamd-milter.sock"]; | 168 | smtpd_milters = [config.services.opendkim.socket "local:/run/rspamd/rspamd-milter.sock"]; |
| @@ -197,6 +203,12 @@ in { | |||
| 197 | ''}''; | 203 | ''}''; |
| 198 | dvlmtp_destination_recipient_limit = "1"; | 204 | dvlmtp_destination_recipient_limit = "1"; |
| 199 | virtual_transport = "dvlmtp:unix:/run/postfix/dovecot-lmtp"; | 205 | virtual_transport = "dvlmtp:unix:/run/postfix/dovecot-lmtp"; |
| 206 | |||
| 207 | authorized_submit_users = "inline:{ root= postfwd= }"; | ||
| 208 | |||
| 209 | postscreen_access_list = ""; | ||
| 210 | postscreen_denylist_action = "drop"; | ||
| 211 | postscreen_greet_action = "enforce"; | ||
| 200 | }; | 212 | }; |
| 201 | masterConfig = { | 213 | masterConfig = { |
| 202 | smtps = { | 214 | smtps = { |
| @@ -204,6 +216,14 @@ in { | |||
| 204 | private = false; | 216 | private = false; |
| 205 | command = "smtpd"; | 217 | command = "smtpd"; |
| 206 | args = [ | 218 | args = [ |
| 219 | "-o" "smtpd_tls_security_level=encrypt" | ||
| 220 | "-o" "{smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, !TLSv1.2}" | ||
| 221 | "-o" "{smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, !TLSv1.2}" | ||
| 222 | "-o" "smtpd_tls_mandatory_ciphers=high" | ||
| 223 | "-o" "smtpd_tls_dh1024_param_file=${toString config.security.dhparams.params."postfix-smtps-1024".path}" | ||
| 224 | "-o" "smtpd_tls_dh512_param_file=${toString config.security.dhparams.params."postfix-smtps-512".path}" | ||
| 225 | "-o" "{tls_eecdh_auto_curves = X25519 X448}" | ||
| 226 | |||
| 207 | "-o" "smtpd_tls_wrappermode=yes" | 227 | "-o" "smtpd_tls_wrappermode=yes" |
| 208 | "-o" "smtpd_tls_ask_ccert=yes" | 228 | "-o" "smtpd_tls_ask_ccert=yes" |
| 209 | "-o" "smtpd_tls_req_ccert=yes" | 229 | "-o" "smtpd_tls_req_ccert=yes" |
| @@ -224,6 +244,27 @@ in { | |||
| 224 | "flags=DORX" | 244 | "flags=DORX" |
| 225 | ]; | 245 | ]; |
| 226 | }; | 246 | }; |
| 247 | smtp_pass = { | ||
| 248 | name = "smtpd"; | ||
| 249 | type = "pass"; | ||
| 250 | command = "smtpd"; | ||
| 251 | }; | ||
| 252 | postscreen = { | ||
| 253 | name = "smtp"; | ||
| 254 | type = "inet"; | ||
| 255 | private = false; | ||
| 256 | command = "postscreen"; | ||
| 257 | maxproc = 1; | ||
| 258 | }; | ||
| 259 | smtp = {}; | ||
| 260 | relay = { | ||
| 261 | command = "smtp"; | ||
| 262 | args = [ "-o" "smtp_fallback_relay=" ]; | ||
| 263 | }; | ||
| 264 | tlsproxy = { | ||
| 265 | maxproc = 0; | ||
| 266 | }; | ||
| 267 | dnsblog = {}; | ||
| 227 | }; | 268 | }; |
| 228 | }; | 269 | }; |
| 229 | 270 | ||
| @@ -596,6 +637,9 @@ in { | |||
| 596 | params = { | 637 | params = { |
| 597 | "postfix-512".bits = 512; | 638 | "postfix-512".bits = 512; |
| 598 | "postfix-1024".bits = 2048; | 639 | "postfix-1024".bits = 2048; |
| 640 | |||
| 641 | "postfix-smtps-512".bits = 512; | ||
| 642 | "postfix-smtps-1024".bits = 2048; | ||
| 599 | }; | 643 | }; |
| 600 | }; | 644 | }; |
| 601 | 645 | ||
| @@ -800,8 +844,14 @@ in { | |||
| 800 | services.postfwd = { | 844 | services.postfwd = { |
| 801 | enable = true; | 845 | enable = true; |
| 802 | rules = '' | 846 | rules = '' |
| 803 | id=RCPT01; protocol_state=DATA; protocol_state=END-OF-MESSAGE; action=rcpt(ccert_subject/100/3600/450 4.7.1 Exceeding maximum of 100 recipients per hour [$$ratecount]) | 847 | id=RCPT01; protocol_state=DATA; protocol_state=END-OF-MESSAGE; action=rcpt(ccert_subject/100/3600/set(HIT_RATELIMIT=1,HIT_RATECOUNT=$$ratecount,HIT_RATELIMIT_LIMIT=100,HIT_RATELIMIT_INTERVAL=3600)) |
| 804 | id=RCPT02; protocol_state=DATA; protocol_state=END-OF-MESSAGE; action=rcpt(ccert_subject/1000/86400/450 4.7.1 Exceeding maximum of 1000 recipients per day [$$ratecount]) | 848 | id=RCPT02; protocol_state=DATA; protocol_state=END-OF-MESSAGE; action=rcpt(ccert_subject/1000/86400/set(HIT_RATELIMIT=1,HIT_RATECOUNT=$$ratecount,HIT_RATELIMIT_LIMIT=1000,HIT_RATELIMIT_INTERVAL=86400)) |
| 849 | |||
| 850 | id=JUMP_REJECT_RL; HIT_RATELIMIT=="1"; action=jump(REJECT_RL) | ||
| 851 | |||
| 852 | id=EOF; action=DUNNO | ||
| 853 | |||
| 854 | id=REJECT_RL; action=450 4.7.1 Exceeding maximum of $$HIT_RATELIMIT_LIMIT recipients per $$HIT_RATELIMIT_INTERVAL seconds [$$HIT_RATECOUNT] | ||
| 805 | ''; | 855 | ''; |
| 806 | }; | 856 | }; |
| 807 | }; | 857 | }; |
diff --git a/modules/postfwd.nix b/modules/postfwd.nix index 4afea0a1..e10c04a7 100644 --- a/modules/postfwd.nix +++ b/modules/postfwd.nix | |||
| @@ -32,6 +32,11 @@ in { | |||
| 32 | "--proto" "unix" | 32 | "--proto" "unix" |
| 33 | "--port" "/run/postfwd3/postfwd3.sock" | 33 | "--port" "/run/postfwd3/postfwd3.sock" |
| 34 | "--save_rates" "/var/lib/postfwd/rates" | 34 | "--save_rates" "/var/lib/postfwd/rates" |
| 35 | "--save_groups" "/var/lib/postfwd/groups" | ||
| 36 | "--summary" "3600" | ||
| 37 | "--cache" "600" | ||
| 38 | "--cache_proto" "unix" | ||
| 39 | "--cache_port" "/run/postfwd3/cache.sock" | ||
| 35 | "--file" (pkgs.writeText "postfwd3-rules" cfg.rules) | 40 | "--file" (pkgs.writeText "postfwd3-rules" cfg.rules) |
| 36 | ]}"; | 41 | ]}"; |
| 37 | PIDFile = "/run/postfwd3/postfwd3.pid"; | 42 | PIDFile = "/run/postfwd3/postfwd3.pid"; |
| @@ -45,7 +50,8 @@ in { | |||
| 45 | 50 | ||
| 46 | DynamicUser = true; | 51 | DynamicUser = true; |
| 47 | ProtectSystem = "strict"; | 52 | ProtectSystem = "strict"; |
| 48 | SystemCallFilter = "@system-service"; | 53 | ProtectHome = true; |
| 54 | SystemCallFilter = ["@system-service" "~@resources @obsolete"]; | ||
| 49 | NoNewPrivileges = true; | 55 | NoNewPrivileges = true; |
| 50 | ProtectKernelTunables = true; | 56 | ProtectKernelTunables = true; |
| 51 | ProtectKernelModules = true; | 57 | ProtectKernelModules = true; |
| @@ -59,6 +65,17 @@ in { | |||
| 59 | PrivateDevices = true; | 65 | PrivateDevices = true; |
| 60 | PrivateTmp = true; | 66 | PrivateTmp = true; |
| 61 | ProtectHostname = true; | 67 | ProtectHostname = true; |
| 68 | RestrictNamespaces = true; | ||
| 69 | CapabilityBoundingSet = ""; | ||
| 70 | RestrictAddressFamilies = ["AF_UNIX"]; | ||
| 71 | PrivateNetwork = true; | ||
| 72 | PrivateUsers = true; | ||
| 73 | SystemCallArchitectures = "native"; | ||
| 74 | LockPersonality = true; | ||
| 75 | ProtectProc = "invisible"; | ||
| 76 | ProcSubset = "pid"; | ||
| 77 | DevicePolicy = "closed"; | ||
| 78 | IPAddressDeny = "any"; | ||
| 62 | }; | 79 | }; |
| 63 | }; | 80 | }; |
| 64 | }; | 81 | }; |
diff --git a/overlays/spm/frontend/src/app/spm/spm.component.html b/overlays/spm/frontend/src/app/spm/spm.component.html index 5d0e625a..416da91f 100644 --- a/overlays/spm/frontend/src/app/spm/spm.component.html +++ b/overlays/spm/frontend/src/app/spm/spm.component.html | |||
| @@ -1,7 +1,10 @@ | |||
| 1 | <div id="mail-panel-container" fxLayout="row wrap" style="gap: 16px"> | 1 | <div id="mail-panel-container" fxLayout="row wrap" style="gap: 16px"> |
| 2 | <ng-template ngFor [ngForOf]="spmMails$ | async | keyvalue: asIsOrder" let-entry> | 2 | <ng-template ngFor [ngForOf]="spmMails$ | async | keyvalue: asIsOrder" let-entry> |
| 3 | <mat-card> | 3 | <mat-card> |
| 4 | <mat-card-title class="mono" *ngIf="entry.value.state !== 'loading'">{{entry.value.local}}</mat-card-title> | 4 | <mat-card-title class="mono" *ngIf="entry.value.state !== 'loading' && entry.value.state !== 'claimed'">{{entry.value.local}}</mat-card-title> |
| 5 | <mat-card-title class="mono" *ngIf="entry.value.state === 'claimed'"> | ||
| 6 | <a href="mailto:{{entry.value.local}}@{{entry.value.domain}}">{{entry.value.local}}</a> | ||
| 7 | </mat-card-title> | ||
| 5 | <mat-card-subtitle class="mono" *ngIf="entry.value.state !== 'loading'">@{{entry.value.domain}}</mat-card-subtitle> | 8 | <mat-card-subtitle class="mono" *ngIf="entry.value.state !== 'loading'">@{{entry.value.domain}}</mat-card-subtitle> |
| 6 | <mat-card-content *ngIf="entry.value.state === 'loading'"> | 9 | <mat-card-content *ngIf="entry.value.state === 'loading'"> |
| 7 | <mat-spinner style="margin: auto"></mat-spinner> | 10 | <mat-spinner style="margin: auto"></mat-spinner> |
diff --git a/overlays/spm/frontend/src/app/spm/spm.component.sass b/overlays/spm/frontend/src/app/spm/spm.component.sass index 74ad7d0e..773eb879 100644 --- a/overlays/spm/frontend/src/app/spm/spm.component.sass +++ b/overlays/spm/frontend/src/app/spm/spm.component.sass | |||
| @@ -1,3 +1,7 @@ | |||
| 1 | a | ||
| 2 | color: inherit | ||
| 3 | text-decoration: inherit | ||
| 4 | |||
| 1 | #add-button | 5 | #add-button |
| 2 | position: fixed | 6 | position: fixed |
| 3 | bottom: 16px | 7 | bottom: 16px |
diff --git a/overlays/spm/wordlist.txt b/overlays/spm/wordlist.txt index 028ca87e..0db5ca44 100644 --- a/overlays/spm/wordlist.txt +++ b/overlays/spm/wordlist.txt | |||
| @@ -605,7 +605,6 @@ keg | |||
| 605 | kept | 605 | kept |
| 606 | kick | 606 | kick |
| 607 | kilt | 607 | kilt |
| 608 | king | ||
| 609 | kite | 608 | kite |
| 610 | kitty | 609 | kitty |
| 611 | kiwi | 610 | kiwi |
