Browse Source

WebClient: remove remaining inline onclick events

Signed-off-by: Nicola Murino <nicola.murino@gmail.com>
Nicola Murino 1 year ago
parent
commit
61e6cc6985

+ 23 - 23
go.mod

@@ -9,15 +9,15 @@ require (
 	github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5
 	github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5
 	github.com/alexedwards/argon2id v1.0.0
 	github.com/alexedwards/argon2id v1.0.0
 	github.com/amoghe/go-crypt v0.0.0-20220222110647-20eada5f5964
 	github.com/amoghe/go-crypt v0.0.0-20220222110647-20eada5f5964
-	github.com/aws/aws-sdk-go-v2 v1.22.2
-	github.com/aws/aws-sdk-go-v2/config v1.23.0
-	github.com/aws/aws-sdk-go-v2/credentials v1.15.2
-	github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3
-	github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.13.5
-	github.com/aws/aws-sdk-go-v2/service/marketplacemetering v1.18.1
-	github.com/aws/aws-sdk-go-v2/service/s3 v1.42.1
-	github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1
-	github.com/aws/aws-sdk-go-v2/service/sts v1.25.1
+	github.com/aws/aws-sdk-go-v2 v1.23.0
+	github.com/aws/aws-sdk-go-v2/config v1.25.1
+	github.com/aws/aws-sdk-go-v2/credentials v1.16.1
+	github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4
+	github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.13.8
+	github.com/aws/aws-sdk-go-v2/service/marketplacemetering v1.18.2
+	github.com/aws/aws-sdk-go-v2/service/s3 v1.42.2
+	github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.2
+	github.com/aws/aws-sdk-go-v2/service/sts v1.25.2
 	github.com/bmatcuk/doublestar/v4 v4.6.1
 	github.com/bmatcuk/doublestar/v4 v4.6.1
 	github.com/cockroachdb/cockroach-go/v2 v2.3.5
 	github.com/cockroachdb/cockroach-go/v2 v2.3.5
 	github.com/coreos/go-oidc/v3 v3.7.0
 	github.com/coreos/go-oidc/v3 v3.7.0
@@ -38,7 +38,7 @@ require (
 	github.com/hashicorp/go-retryablehttp v0.7.5
 	github.com/hashicorp/go-retryablehttp v0.7.5
 	github.com/jackc/pgx/v5 v5.5.0
 	github.com/jackc/pgx/v5 v5.5.0
 	github.com/jlaffaye/ftp v0.0.0-20201112195030-9aae4d151126
 	github.com/jlaffaye/ftp v0.0.0-20201112195030-9aae4d151126
-	github.com/klauspost/compress v1.17.2
+	github.com/klauspost/compress v1.17.3
 	github.com/lestrrat-go/jwx/v2 v2.0.16
 	github.com/lestrrat-go/jwx/v2 v2.0.16
 	github.com/lithammer/shortuuid/v3 v3.0.7
 	github.com/lithammer/shortuuid/v3 v3.0.7
 	github.com/mattn/go-sqlite3 v1.14.18
 	github.com/mattn/go-sqlite3 v1.14.18
@@ -85,18 +85,18 @@ require (
 	cloud.google.com/go/iam v1.1.5 // indirect
 	cloud.google.com/go/iam v1.1.5 // indirect
 	github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 // indirect
 	github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 // indirect
 	github.com/ajg/form v1.5.1 // indirect
 	github.com/ajg/form v1.5.1 // indirect
-	github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.0 // indirect
-	github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 // indirect
-	github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 // indirect
-	github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0 // indirect
-	github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.2 // indirect
-	github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 // indirect
-	github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.2 // indirect
-	github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 // indirect
-	github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.2 // indirect
-	github.com/aws/aws-sdk-go-v2/service/sso v1.17.1 // indirect
-	github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1 // indirect
-	github.com/aws/smithy-go v1.16.0 // indirect
+	github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1 // indirect
+	github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3 // indirect
+	github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3 // indirect
+	github.com/aws/aws-sdk-go-v2/internal/ini v1.7.0 // indirect
+	github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3 // indirect
+	github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 // indirect
+	github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3 // indirect
+	github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3 // indirect
+	github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3 // indirect
+	github.com/aws/aws-sdk-go-v2/service/sso v1.17.2 // indirect
+	github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.2 // indirect
+	github.com/aws/smithy-go v1.17.0 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/boombuler/barcode v1.0.1 // indirect
 	github.com/boombuler/barcode v1.0.1 // indirect
 	github.com/cenkalti/backoff/v4 v4.2.1 // indirect
 	github.com/cenkalti/backoff/v4 v4.2.1 // indirect
@@ -134,7 +134,7 @@ require (
 	github.com/mattn/go-colorable v0.1.13 // indirect
 	github.com/mattn/go-colorable v0.1.13 // indirect
 	github.com/mattn/go-isatty v0.0.20 // indirect
 	github.com/mattn/go-isatty v0.0.20 // indirect
 	github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
 	github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
-	github.com/miekg/dns v1.1.56 // indirect
+	github.com/miekg/dns v1.1.57 // indirect
 	github.com/mitchellh/go-testing-interface v1.14.1 // indirect
 	github.com/mitchellh/go-testing-interface v1.14.1 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/oklog/run v1.1.0 // indirect
 	github.com/oklog/run v1.1.0 // indirect

+ 46 - 46
go.sum

@@ -71,48 +71,48 @@ github.com/alexedwards/argon2id v1.0.0 h1:wJzDx66hqWX7siL/SRUmgz3F8YMrd/nfX/xHHc
 github.com/alexedwards/argon2id v1.0.0/go.mod h1:tYKkqIjzXvZdzPvADMWOEZ+l6+BD6CtBXMj5fnJppiw=
 github.com/alexedwards/argon2id v1.0.0/go.mod h1:tYKkqIjzXvZdzPvADMWOEZ+l6+BD6CtBXMj5fnJppiw=
 github.com/amoghe/go-crypt v0.0.0-20220222110647-20eada5f5964 h1:I9YN9WMo3SUh7p/4wKeNvD/IQla3U3SUa61U7ul+xM4=
 github.com/amoghe/go-crypt v0.0.0-20220222110647-20eada5f5964 h1:I9YN9WMo3SUh7p/4wKeNvD/IQla3U3SUa61U7ul+xM4=
 github.com/amoghe/go-crypt v0.0.0-20220222110647-20eada5f5964/go.mod h1:eFiR01PwTcpbzXtdMces7zxg6utvFM5puiWHpWB8D/k=
 github.com/amoghe/go-crypt v0.0.0-20220222110647-20eada5f5964/go.mod h1:eFiR01PwTcpbzXtdMces7zxg6utvFM5puiWHpWB8D/k=
-github.com/aws/aws-sdk-go-v2 v1.22.2 h1:lV0U8fnhAnPz8YcdmZVV60+tr6CakHzqA6P8T46ExJI=
-github.com/aws/aws-sdk-go-v2 v1.22.2/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c=
-github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.0 h1:hHgLiIrTRtddC0AKcJr5s7i/hLgcpTt+q/FKxf1Zayk=
-github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.0/go.mod h1:w4I/v3NOWgD+qvs1NPEwhd++1h3XPHFaVxasfY6HlYQ=
-github.com/aws/aws-sdk-go-v2/config v1.23.0 h1:kqzEfGGDIrRJpfJckgwuZfFTbU9NB1jZnRcaO9MpOqE=
-github.com/aws/aws-sdk-go-v2/config v1.23.0/go.mod h1:p7wbxKXXjS1GGQOss7VXOazVMFF9bjUGq85/4wR/fSw=
-github.com/aws/aws-sdk-go-v2/credentials v1.15.2 h1:rKH7khRMxPdD0u3dHecd0Q7NOVw3EUe7AqdkUOkiOGI=
-github.com/aws/aws-sdk-go-v2/credentials v1.15.2/go.mod h1:tXM8wmaeAhfC7nZoCxb0FzM/aRaB1m1WQ7x0qlBLq80=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3 h1:G5KawTAkyHH6WyKQCdHiW4h3PmAXNJpOgwKg3H7sDRE=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3/go.mod h1:hugKmSFnZB+HgNI1sYGT14BUPZkO6alC/e0AWu+0IAQ=
-github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.13.5 h1:P/xwilRdRLLg1PzfviDq0Zjb74weOoDCrh8J5lRCQAY=
-github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.13.5/go.mod h1:9cLHf2IwX6Jyw0KjLVbXly/g6DmzExgUzB1w/AQPGQE=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 h1:AaQsr5vvGR7rmeSWBtTCcw16tT9r51mWijuCQhzLnq8=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2/go.mod h1:o1IiRn7CWocIFTXJjGKJDOwxv1ibL53NpcvcqGWyRBA=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 h1:UZx8SXZ0YtzRiALzYAWcjb9Y9hZUR7MBKaBQ5ouOjPs=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2/go.mod h1:ipuRpcSaklmxR6C39G187TpBAO132gUfleTGccUPs8c=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0 h1:hwZB07/beLiCopuRKF0t+dEHmP39iN4YtDh3X5d3hrg=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0/go.mod h1:rdAuXeHWhI/zkpYcO5n8WCpaIgY9MUxFyBsuqq3kjyA=
-github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.2 h1:pyVrNAf7Hwz0u39dLKN5t+n0+K/3rMYKuiOoIum3AsU=
-github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.2/go.mod h1:mydrfOb9uiOYCxuCPR8YHQNQyGQwUQ7gPMZGBKbH8NY=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 h1:CJxo7ZBbaIzmXfV3hjcx36n9V87gJsIUPJflwqEHl3Q=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0/go.mod h1:yjVfjuY4nD1EW9i387Kau+I6V5cBA5YnC/mWNopjZrI=
-github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.2 h1:f2LhPofnjcdOQKRtumKjMvIHkfSQ8aH/rwKUDEQ/SB4=
-github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.2/go.mod h1:q+xX0H4OfuWDuBy7y/LDi4v8IBOWuF+vtp8Z6ex+lw4=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 h1:h7j73yuAVVjic8pqswh+L/7r2IHP43QwRyOu6zcCDDE=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2/go.mod h1:H07AHdK5LSy8F7EJUQhoxyiCNkePoHj2D8P2yGTWafo=
-github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.2 h1:gbIaOzpXixUpoPK+js/bCBK1QBDXM22SigsnzGZio0U=
-github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.2/go.mod h1:p+S7RNbdGN8qgHDSg2SCQJ9FeMAmvcETQiVpeGhYnNM=
-github.com/aws/aws-sdk-go-v2/service/marketplacemetering v1.18.1 h1:/CQ/XwDvcKS9wlVgdjfKNT4jUpU5PckWyp19VpmPBTs=
-github.com/aws/aws-sdk-go-v2/service/marketplacemetering v1.18.1/go.mod h1:kZxmW3E6zOoBhQWTzbdBeYROG5iqrPe7HcK1BY0QH+s=
-github.com/aws/aws-sdk-go-v2/service/s3 v1.42.1 h1:o6MCcX1rJW8Y3g+hvg2xpjF6JR6DftuYhfl3Nc1WV9Q=
-github.com/aws/aws-sdk-go-v2/service/s3 v1.42.1/go.mod h1:UDtxEWbREX6y4KREapT+jjtjoH0TiVSS6f5nfaY1UaM=
-github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1 h1:xK86ln1cEDa0cUpLaCbFFX/BABPw4ognfzpGfbF4PkY=
-github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1/go.mod h1:eqTdeirkcyBiDviU/N1JMcImS9zEJDn5wOzX3BsU4wU=
-github.com/aws/aws-sdk-go-v2/service/sso v1.17.1 h1:km+ZNjtLtpXYf42RdaDZnNHm9s7SYAuDGTafy6nd89A=
-github.com/aws/aws-sdk-go-v2/service/sso v1.17.1/go.mod h1:aHBr3pvBSD5MbzOvQtYutyPLLRPbl/y9x86XyJJnUXQ=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1 h1:iRFNqZH4a67IqPvK8xxtyQYnyrlsvwmpHOe9r55ggBA=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1/go.mod h1:pTy5WM+6sNv2tB24JNKFtn6EvciQ5k40ZJ0pq/Iaxj0=
-github.com/aws/aws-sdk-go-v2/service/sts v1.25.1 h1:txgVXIXWPXyqdiVn92BV6a/rgtpX31HYdsOYj0sVQQQ=
-github.com/aws/aws-sdk-go-v2/service/sts v1.25.1/go.mod h1:VAiJiNaoP1L89STFlEMgmHX1bKixY+FaP+TpRFrmyZ4=
-github.com/aws/smithy-go v1.16.0 h1:gJZEH/Fqh+RsvlJ1Zt4tVAtV6bKkp3cC+R6FCZMNzik=
-github.com/aws/smithy-go v1.16.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE=
+github.com/aws/aws-sdk-go-v2 v1.23.0 h1:PiHAzmiQQr6JULBUdvR8fKlA+UPKLT/8KbiqpFBWiAo=
+github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA=
+github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1 h1:ZY3108YtBNq96jNZTICHxN1gSBSbnvIdYwwqnvCV4Mc=
+github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ=
+github.com/aws/aws-sdk-go-v2/config v1.25.1 h1:YsjngBOl2mx4l3egkVWndr6/6TqtkdsWJFZIsQ924Ek=
+github.com/aws/aws-sdk-go-v2/config v1.25.1/go.mod h1:yV6h7TRVzhdIFmUk9WWDRpWwYGg1woEzKr0k1IYz2Tk=
+github.com/aws/aws-sdk-go-v2/credentials v1.16.1 h1:WessyrdgyFN5TB+eLQdrFSlN/3oMnqukIFhDxK6z8h0=
+github.com/aws/aws-sdk-go-v2/credentials v1.16.1/go.mod h1:RQJyPxKcr+m4ArlIG1LUhMOrjposVfzbX6H8oR6oCgE=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4 h1:9wKDWEjwSnXZre0/O3+ZwbBl1SmlgWYBbrTV10X/H1s=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA=
+github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.13.8 h1:wuOjvalpd2CnXffks74Vq6n3yv9vunKCoy4R1sjStGk=
+github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.13.8/go.mod h1:vywwjy6VnrR48Izg136JoSUXC4mH9QeUi3g0EH9DSrA=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3 h1:DUwbD79T8gyQ23qVXFUthjzVMTviSHi3y4z58KvghhM=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3 h1:AplLJCtIaUZDCbr6+gLYdsYNxne4iuaboJhVt9d+WXI=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.7.0 h1:usgqiJtamuGIBj+OvYmMq89+Z1hIKkMJToz1WpoeNUY=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.7.0/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3 h1:lMwCXiWJlrtZot0NJTjbC8G9zl+V3i68gBTBBvDeEXA=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 h1:rpkF4n0CyFcrJUG/rNNohoTmhtWlFTRI4BsZOh9PvLs=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI=
+github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3 h1:xbwRyCy7kXrOj89iIKLB6NfE2WCpP9HoKyk8dMDvnIQ=
+github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3 h1:kJOolE8xBAD13xTCgOakByZkyP4D/owNmvEiioeUNAg=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950=
+github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3 h1:KV0z2RDc7euMtg8aUT1czv5p29zcLlXALNFsd3jkkEc=
+github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec=
+github.com/aws/aws-sdk-go-v2/service/marketplacemetering v1.18.2 h1:UaKsLxZ4sHdYlyX2cRZ+7YznCQS7jwHHgVy1hKkNKfE=
+github.com/aws/aws-sdk-go-v2/service/marketplacemetering v1.18.2/go.mod h1:4L1Z3QlQqkGEPSRH9fYPuHLxNEK54VgExjw4J/ShjbM=
+github.com/aws/aws-sdk-go-v2/service/s3 v1.42.2 h1:NnduxUd9+Fq9DcCDdJK8v6l9lR1xDX4usvog+JuQAno=
+github.com/aws/aws-sdk-go-v2/service/s3 v1.42.2/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8=
+github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.2 h1:M5NodszNDBfyfFBKoAzJY0flmkkQCg7MGk6+/vBGjCM=
+github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.2/go.mod h1:+8dYLQz+I30HIGyhp+6htf3+yyGTqBzzTOG90Ai8lWs=
+github.com/aws/aws-sdk-go-v2/service/sso v1.17.2 h1:V47N5eKgVZoRSvx2+RQ0EpAEit/pqOhqeSQFiS4OFEQ=
+github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.2 h1:sMAcO7VHVw28HTAdZpTULDzFirHOsVm/x25CxhUH0jA=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.2/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs=
+github.com/aws/aws-sdk-go-v2/service/sts v1.25.2 h1:vwyiRTnXLqsak/6WAQ+uTRhVqKI6vxUQ0HJXjKij0zM=
+github.com/aws/aws-sdk-go-v2/service/sts v1.25.2/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ=
+github.com/aws/smithy-go v1.17.0 h1:wWJD7LX6PBV6etBUwO0zElG0nWN9rUhp0WdYeHSHAaI=
+github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE=
 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I=
 github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I=
@@ -327,8 +327,8 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
-github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
+github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA=
+github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
 github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
 github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
 github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
 github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
@@ -378,8 +378,8 @@ github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvls
 github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
 github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
 github.com/mhale/smtpd v0.8.0 h1:5JvdsehCg33PQrZBvFyDMMUDQmvbzVpZgKob7eYBJc0=
 github.com/mhale/smtpd v0.8.0 h1:5JvdsehCg33PQrZBvFyDMMUDQmvbzVpZgKob7eYBJc0=
 github.com/mhale/smtpd v0.8.0/go.mod h1:MQl+y2hwIEQCXtNhe5+55n0GZOjSmeqORDIXbqUL3x4=
 github.com/mhale/smtpd v0.8.0/go.mod h1:MQl+y2hwIEQCXtNhe5+55n0GZOjSmeqORDIXbqUL3x4=
-github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE=
-github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY=
+github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM=
+github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk=
 github.com/minio/sio v0.3.1 h1:d59r5RTHb1OsQaSl1EaTWurzMMDRLA5fgNmjzD4eVu4=
 github.com/minio/sio v0.3.1 h1:d59r5RTHb1OsQaSl1EaTWurzMMDRLA5fgNmjzD4eVu4=
 github.com/minio/sio v0.3.1/go.mod h1:S0ovgVgc+sTlQyhiXA1ppBLv7REM7TYi5yyq2qL/Y6o=
 github.com/minio/sio v0.3.1/go.mod h1:S0ovgVgc+sTlQyhiXA1ppBLv7REM7TYi5yyq2qL/Y6o=
 github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU=
 github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU=

+ 10 - 8
internal/httpd/webclient.go

@@ -169,6 +169,7 @@ type shareLoginPage struct {
 	Version    string
 	Version    string
 	Error      string
 	Error      string
 	CSRFToken  string
 	CSRFToken  string
+	CSPNonce   string
 	StaticURL  string
 	StaticURL  string
 	Branding   UIBranding
 	Branding   UIBranding
 }
 }
@@ -594,12 +595,13 @@ func (s *httpdServer) renderClientResetPwdPage(w http.ResponseWriter, r *http.Re
 	renderClientTemplate(w, templateResetPassword, data)
 	renderClientTemplate(w, templateResetPassword, data)
 }
 }
 
 
-func (s *httpdServer) renderShareLoginPage(w http.ResponseWriter, currentURL, error, ip string) {
+func (s *httpdServer) renderShareLoginPage(w http.ResponseWriter, r *http.Request, error, ip string) {
 	data := shareLoginPage{
 	data := shareLoginPage{
-		CurrentURL: currentURL,
+		CurrentURL: r.RequestURI,
 		Version:    version.Get().Version,
 		Version:    version.Get().Version,
 		Error:      error,
 		Error:      error,
 		CSRFToken:  createCSRFToken(ip),
 		CSRFToken:  createCSRFToken(ip),
+		CSPNonce:   secure.CSPNonce(r.Context()),
 		StaticURL:  webStaticFilesPath,
 		StaticURL:  webStaticFilesPath,
 		Branding:   s.binding.Branding.WebClient,
 		Branding:   s.binding.Branding.WebClient,
 	}
 	}
@@ -1763,29 +1765,29 @@ func (s *httpdServer) ensurePDF(w http.ResponseWriter, r *http.Request, name str
 
 
 func (s *httpdServer) handleClientShareLoginGet(w http.ResponseWriter, r *http.Request) {
 func (s *httpdServer) handleClientShareLoginGet(w http.ResponseWriter, r *http.Request) {
 	r.Body = http.MaxBytesReader(w, r.Body, maxLoginBodySize)
 	r.Body = http.MaxBytesReader(w, r.Body, maxLoginBodySize)
-	s.renderShareLoginPage(w, r.RequestURI, "", util.GetIPFromRemoteAddress(r.RemoteAddr))
+	s.renderShareLoginPage(w, r, "", util.GetIPFromRemoteAddress(r.RemoteAddr))
 }
 }
 
 
 func (s *httpdServer) handleClientShareLoginPost(w http.ResponseWriter, r *http.Request) {
 func (s *httpdServer) handleClientShareLoginPost(w http.ResponseWriter, r *http.Request) {
 	r.Body = http.MaxBytesReader(w, r.Body, maxLoginBodySize)
 	r.Body = http.MaxBytesReader(w, r.Body, maxLoginBodySize)
 	ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr)
 	ipAddr := util.GetIPFromRemoteAddress(r.RemoteAddr)
 	if err := r.ParseForm(); err != nil {
 	if err := r.ParseForm(); err != nil {
-		s.renderShareLoginPage(w, r.RequestURI, err.Error(), ipAddr)
+		s.renderShareLoginPage(w, r, err.Error(), ipAddr)
 		return
 		return
 	}
 	}
 	if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil {
 	if err := verifyCSRFToken(r.Form.Get(csrfFormToken), ipAddr); err != nil {
-		s.renderShareLoginPage(w, r.RequestURI, err.Error(), ipAddr)
+		s.renderShareLoginPage(w, r, err.Error(), ipAddr)
 		return
 		return
 	}
 	}
 	shareID := getURLParam(r, "id")
 	shareID := getURLParam(r, "id")
 	share, err := dataprovider.ShareExists(shareID, "")
 	share, err := dataprovider.ShareExists(shareID, "")
 	if err != nil {
 	if err != nil {
-		s.renderShareLoginPage(w, r.RequestURI, dataprovider.ErrInvalidCredentials.Error(), ipAddr)
+		s.renderShareLoginPage(w, r, dataprovider.ErrInvalidCredentials.Error(), ipAddr)
 		return
 		return
 	}
 	}
 	match, err := share.CheckCredentials(strings.TrimSpace(r.Form.Get("share_password")))
 	match, err := share.CheckCredentials(strings.TrimSpace(r.Form.Get("share_password")))
 	if !match || err != nil {
 	if !match || err != nil {
-		s.renderShareLoginPage(w, r.RequestURI, dataprovider.ErrInvalidCredentials.Error(), ipAddr)
+		s.renderShareLoginPage(w, r, dataprovider.ErrInvalidCredentials.Error(), ipAddr)
 		return
 		return
 	}
 	}
 	c := jwtTokenClaims{
 	c := jwtTokenClaims{
@@ -1793,7 +1795,7 @@ func (s *httpdServer) handleClientShareLoginPost(w http.ResponseWriter, r *http.
 	}
 	}
 	err = c.createAndSetCookie(w, r, s.tokenAuth, tokenAudienceWebShare, ipAddr)
 	err = c.createAndSetCookie(w, r, s.tokenAuth, tokenAudienceWebShare, ipAddr)
 	if err != nil {
 	if err != nil {
-		s.renderShareLoginPage(w, r.RequestURI, common.ErrInternalFailure.Error(), ipAddr)
+		s.renderShareLoginPage(w, r, common.ErrInternalFailure.Error(), ipAddr)
 		return
 		return
 	}
 	}
 	next := path.Clean(r.URL.Query().Get("next"))
 	next := path.Clean(r.URL.Query().Get("next"))

File diff suppressed because it is too large
+ 2 - 2
static/vendor/pdfobject/pdfobject.min.js


+ 34 - 0
templates/common/base.html

@@ -123,6 +123,40 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
             +' '+(e?'KMGTPEZY'[--e]+'iB':'Bytes')
             +' '+(e?'KMGTPEZY'[--e]+'iB':'Bytes')
     }
     }
 
 
+    function initRepeaterItems() {
+        let repeaterDeleteButtons = document.querySelectorAll('[data-repeater-delete]');
+        let repeaterCreateButtons = document.querySelectorAll('[data-repeater-create]');
+
+        repeaterDeleteButtons.forEach(d => {
+            d.addEventListener("click", function(e){
+                e.preventDefault();
+            });
+        });
+
+        repeaterCreateButtons.forEach(d => {
+            d.addEventListener("click", function(e){
+                e.preventDefault();
+            });
+        });
+    }
+
+    function initRepeater(selector) {
+        $(selector).repeater({
+            initEmpty: false,
+
+            show: function () {
+                $(this).slideDown();
+                $(this).find('[data-repeater-delete]').on("click", function(e){
+                    e.preventDefault();
+                });
+            },
+
+            hide: function (deleteElement) {
+                $(this).slideUp(deleteElement);
+            }
+        });
+    }
+
     KTUtil.onDOMContentLoaded(function () {
     KTUtil.onDOMContentLoaded(function () {
         var dismissErrorBtn = $('#id_dismiss_error_msg');
         var dismissErrorBtn = $('#id_dismiss_error_msg');
         if (dismissErrorBtn){
         if (dismissErrorBtn){

+ 1 - 1
templates/webclient/changepassword.html

@@ -63,7 +63,7 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
 {{end}}
 {{end}}
 
 
 {{- define "extra_js"}}
 {{- define "extra_js"}}
-<script type="text/javascript" {{- if .CSPNonce}} nonce="{{.}}"{{- end}}>
+<script type="text/javascript" {{- if .CSPNonce}} nonce="{{.CSPNonce}}"{{- end}}>
     KTUtil.onDOMContentLoaded(function () {
     KTUtil.onDOMContentLoaded(function () {
         $('#change_pwd_form').submit(function (event) {
         $('#change_pwd_form').submit(function (event) {
             let submitButton = document.querySelector('#form_submit');
             let submitButton = document.querySelector('#form_submit');

+ 1 - 1
templates/webclient/editfile.html

@@ -101,7 +101,7 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
 
 
 {{- define "extra_js"}}
 {{- define "extra_js"}}
 <script src="{{.StaticURL}}/vendor/codemirror/cm6.bundle.min.js"></script>
 <script src="{{.StaticURL}}/vendor/codemirror/cm6.bundle.min.js"></script>
-<script type="text/javascript" {{- if .CSPNonce}} nonce="{{.}}"{{- end}}>
+<script type="text/javascript" {{- if .CSPNonce}} nonce="{{.CSPNonce}}"{{- end}}>
     var cmView;
     var cmView;
 
 
     function keepAlive() {
     function keepAlive() {

+ 123 - 39
templates/webclient/files.html

@@ -183,8 +183,8 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
 <script src="{{.StaticURL}}/vendor/glightbox/glightbox.min.js"></script>
 <script src="{{.StaticURL}}/vendor/glightbox/glightbox.min.js"></script>
 <script src="{{.StaticURL}}/vendor/pdfobject/pdfobject.min.js"></script>
 <script src="{{.StaticURL}}/vendor/pdfobject/pdfobject.min.js"></script>
 <script src="{{.StaticURL}}/vendor/video-js/video.min.js"></script>
 <script src="{{.StaticURL}}/vendor/video-js/video.min.js"></script>
-{{- if not .ShareUploadBaseURL}}
 <script type="text/javascript" {{- if .CSPNonce}} nonce="{{.CSPNonce}}"{{- end}}>
 <script type="text/javascript" {{- if .CSPNonce}} nonce="{{.CSPNonce}}"{{- end}}>
+    //{{- if not .ShareUploadBaseURL}}
     const supportedEditExtensions = ["csv", "bat", "dyalog", "apl", "asc", "pgp", "sig", "asn", "asn1", "b", "bf",
     const supportedEditExtensions = ["csv", "bat", "dyalog", "apl", "asc", "pgp", "sig", "asn", "asn1", "b", "bf",
             "c", "h", "ino", "cpp", "c++", "cc", "cxx", "hpp", "h++", "hh", "hxx", "cob", "cpy", "cbl", "cs", "clj",
             "c", "h", "ino", "cpp", "c++", "cc", "cxx", "hpp", "h++", "hh", "hxx", "cob", "cpy", "cbl", "cs", "clj",
             "cljc", "cljx", "cljs", "gss", "cmake", "cmake.in", "coffee", "cl", "lisp", "el", "cyp", "cypher",
             "cljc", "cljx", "cljs", "gss", "cmake", "cmake.in", "coffee", "cl", "lisp", "el", "cyp", "cypher",
@@ -203,9 +203,7 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
             "vtl", "vhd", "vhdl", "vue", "xml", "xsl", "xsd", "svg", "xy", "xquery", "ys", "yaml", "yml", "z80",
             "vtl", "vhd", "vhdl", "vue", "xml", "xsl", "xsd", "svg", "xy", "xquery", "ys", "yaml", "yml", "z80",
             "mscgen", "mscin", "msc", "xu", "msgenny", "wat", "wast"];
             "mscgen", "mscin", "msc", "xu", "msgenny", "wat", "wast"];
     const supportedEditFilenames = ["readme", "dockerfile", "pkgbuild"]
     const supportedEditFilenames = ["readme", "dockerfile", "pkgbuild"]
-</script>
-{{- end}}
-<script type="text/javascript" {{- if .CSPNonce}} nonce="{{.CSPNonce}}"{{- end}}>
+    //{{- end}}
     function keepAlive() {
     function keepAlive() {
         //{{- if not .ShareUploadBaseURL}}
         //{{- if not .ShareUploadBaseURL}}
         axios.get('{{.PingURL}}',{
         axios.get('{{.PingURL}}',{
@@ -255,13 +253,12 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
                         render: function (data, type, row) {
                         render: function (data, type, row) {
                             if (type === 'display') {
                             if (type === 'display') {
                                 data = escapeHTML(data);
                                 data = escapeHTML(data);
-                                let dirPath = row['dir_path'];
                                 return `<div class="d-flex align-items-center">
                                 return `<div class="d-flex align-items-center">
                                                 <i class="ki-duotone ki-folder fs-1 text-primary me-4">
                                                 <i class="ki-duotone ki-folder fs-1 text-primary me-4">
                                                     <i class="path1"></i>
                                                     <i class="path1"></i>
                                                     <i class="path2"></i>
                                                     <i class="path2"></i>
                                                 </i>
                                                 </i>
-                                                <a href="#" onclick="onDirBrowserClick('${dirPath}');" class="text-gray-700 text-hover-primary">${data}</a>
+                                                <a href="#" class="text-gray-700 text-hover-primary" data-dirbrowser-table-row="open">${data}</a>
                                             </div>`
                                             </div>`
                             }
                             }
                             return data;
                             return data;
@@ -289,8 +286,22 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
             });
             });
 
 
             dt.on('draw', function () {
             dt.on('draw', function () {
-                let navHTML = `<i class="ki-duotone ki-home fs-1 text-primary me-3"></i>
-                                <a href="#" onclick="onDirBrowserClick('%2F');">Home</a>`;
+                let dirBrowserNav = document.getElementById("dirs_browser_nav");
+                while (dirBrowserNav.firstChild) {
+                    dirBrowserNav.removeChild(dirBrowserNav.firstChild);
+                }
+                let mainNavIcon = document.createElement("i");
+                mainNavIcon.classList.add("ki-duotone", "ki-home", "fs-1", "text-primary", "me-3");
+                let mainNavLink = document.createElement("a");
+                mainNavLink.textContent = "Home";
+                mainNavLink.href = "#";
+                mainNavLink.addEventListener("click", function(e){
+                    e.preventDefault();
+                    onDirBrowserClick("%2F");
+                });
+                dirBrowserNav.appendChild(mainNavIcon);
+                dirBrowserNav.appendChild(mainNavLink);
+
                 let p = "/";
                 let p = "/";
                 if (curDir && curDir != "%2F") {
                 if (curDir && curDir != "%2F") {
                     p = decodeURIComponent(curDir.replace(/\+/g, '%20'));
                     p = decodeURIComponent(curDir.replace(/\+/g, '%20'));
@@ -305,13 +316,24 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
                                 fullPath += encodeURIComponent("/" + dir);
                                 fullPath += encodeURIComponent("/" + dir);
                             }
                             }
                             dir = escapeHTML(dir);
                             dir = escapeHTML(dir);
-                            navHTML += `<i class="ki-duotone ki-right fs-2x text-primary mx-1"></i>
-                                <a href="#" onclick="onDirBrowserClick('${fullPath}');">${dir}</a>`;
+                            let navIcon = document.createElement("i");
+                            navIcon.classList.add("ki-duotone", "ki-right", "fs-2x", "text-primary", "mx-1");
+                            let navLink = document.createElement("a");
+                            navLink.textContent = dir;
+                            navLink.href = "#";
+                            let pathCopy = fullPath
+                            navLink.addEventListener("click", function(e){
+                                e.preventDefault();
+                                onDirBrowserClick(pathCopy);
+                            });
+                            dirBrowserNav.appendChild(navIcon);
+                            dirBrowserNav.appendChild(navLink);
                         }
                         }
                     }
                     }
                 }
                 }
-                document.getElementById("dirs_browser_nav").innerHTML = navHTML;
+
                 $('#move_copy_folder').val(p);
                 $('#move_copy_folder').val(p);
+                handleRowActions();
             });
             });
         }
         }
 
 
@@ -367,6 +389,18 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
             });
             });
         }
         }
 
 
+        function handleRowActions(){
+            const openLinks = document.querySelectorAll('[data-dirbrowser-table-row="open"]');
+
+            openLinks.forEach(d => {
+                d.addEventListener("click", function(e){
+                    e.preventDefault();
+                    const parent = e.target.closest('tr');
+                    onDirBrowserClick(dt.row(parent).data()['dir_path']);
+                });
+            });
+        }
+
         return {
         return {
             init: function (url, dirPath) {
             init: function (url, dirPath) {
                 curDir = dirPath;
                 curDir = dirPath;
@@ -524,19 +558,8 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
                                         case "ogg":
                                         case "ogg":
                                         case "mp3":
                                         case "mp3":
                                         case "wav":
                                         case "wav":
-                                            let mediaType = 'video/mp4';
-                                            if (extension == 'webm'){
-                                                mediaType = 'video/webm';
-                                            } else if (extension == 'ogg' || extension == 'ogv') {
-                                                mediaType = 'video/ogg';
-                                            } else if (extension == 'mp3'){
-                                                mediaType = 'audio/mpeg';
-                                            } else if (extension == 'wav'){
-                                                mediaType = 'audio/wav';
-                                            }
-                                            let name = b64EncodeUnicode(row["name"]);
                                             previewDiv = `<div class="ms-2" data-kt-filemanger-table="view_item">
                                             previewDiv = `<div class="ms-2" data-kt-filemanger-table="view_item">
-												    <a href="#" onclick="openVideoPlayer('${name}', '${row['url']}', '${mediaType}');" class="btn btn-sm btn-icon btn-light btn-active-light-primary">
+												    <a href="#" class="btn btn-sm btn-icon btn-light btn-active-light-primary" data-kt-filemanager-table-action="view_media">
 													    <i class="ki-duotone ki-eye fs-5 m-0">
 													    <i class="ki-duotone ki-eye fs-5 m-0">
 														    <span class="path1"></span>
 														    <span class="path1"></span>
 														    <span class="path2"></span>
 														    <span class="path2"></span>
@@ -576,7 +599,6 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
                                             //{{- end}}
                                             //{{- end}}
                                     }
                                     }
                                 }
                                 }
-                                let meta = b64EncodeUnicode(row["meta"]);
                                 let more = `{{- if not .ShareUploadBaseURL}}
                                 let more = `{{- if not .ShareUploadBaseURL}}
                                             {{- if or .CanRename .CanAddFiles .CanShare .CanDelete }}
                                             {{- if or .CanRename .CanAddFiles .CanShare .CanDelete }}
                                             <div class="ms-2">
                                             <div class="ms-2">
@@ -591,22 +613,22 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
 												<div class="menu menu-sub menu-sub-dropdown menu-column menu-rounded menu-gray-700 menu-state-bg-light-primary fw-semibold fs-7 w-150px py-4" data-kt-menu="true">
 												<div class="menu menu-sub menu-sub-dropdown menu-column menu-rounded menu-gray-700 menu-state-bg-light-primary fw-semibold fs-7 w-150px py-4" data-kt-menu="true">
 													{{- if .CanRename}}
 													{{- if .CanRename}}
                                                     <div class="menu-item px-3">
                                                     <div class="menu-item px-3">
-														<a href="#" onclick="renameItem('${meta}');" class="menu-link px-3" data-kt-filemanager-table="rename">Rename</a>
+														<a href="#" class="menu-link px-3" data-kt-filemanager-table-action="rename">Rename</a>
 													</div>
 													</div>
                                                     {{- end}}
                                                     {{- end}}
                                                     {{- if or .CanRename .CanAddFiles}}
                                                     {{- if or .CanRename .CanAddFiles}}
 													<div class="menu-item px-3">
 													<div class="menu-item px-3">
-														<a href="#" onclick="moveOrCopyItem('${meta}');" class="menu-link px-3" data-kt-filemanager-table-filter="move_or_copy">Move or copy</a>
+														<a href="#" class="menu-link px-3" data-kt-filemanager-table-action="move_or_copy">Move or copy</a>
 													</div>
 													</div>
                                                     {{- end}}
                                                     {{- end}}
                                                     {{- if .CanShare}}
                                                     {{- if .CanShare}}
                                                     <div class="menu-item px-3">
                                                     <div class="menu-item px-3">
-														<a href="#" onclick="shareItem('${meta}');" class="menu-link px-3" data-kt-filemanager-table="share">Share</a>
+														<a href="#" class="menu-link px-3" data-kt-filemanager-table-action="share">Share</a>
 													</div>
 													</div>
                                                     {{- end}}
                                                     {{- end}}
                                                     {{- if .CanDelete}}
                                                     {{- if .CanDelete}}
 													<div class="menu-item px-3">
 													<div class="menu-item px-3">
-														<a href="#" onclick="deleteItem('${meta}');" class="menu-link text-danger px-3" data-kt-filemanager-table-filter="delete">Delete</a>
+														<a href="#" class="menu-link text-danger px-3" data-kt-filemanager-table-action="delete">Delete</a>
 													</div>
 													</div>
                                                     {{- end}}
                                                     {{- end}}
 											    </div>
 											    </div>
@@ -682,6 +704,7 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
                     });
                     });
                 }
                 }
                 toggleToolbars();
                 toggleToolbars();
+                handleRowActions();
             });
             });
 
 
             dt.on('user-select', function(e, dt, type, cell, originalEvent){
             dt.on('user-select', function(e, dt, type, cell, originalEvent){
@@ -750,6 +773,59 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
             }
             }
         }
         }
 
 
+        function handleRowActions() {
+            const renameButtons = document.querySelectorAll('[data-kt-filemanager-table-action="rename"]');
+
+            renameButtons.forEach(d => {
+                d.addEventListener("click", function(e){
+                    e.preventDefault();
+                    const parent = e.target.closest('tr');
+                    renameItem(dt.row(parent).data()["meta"]);
+                });
+            });
+
+            const moveCopyButtons = document.querySelectorAll('[data-kt-filemanager-table-action="move_or_copy"]');
+
+            moveCopyButtons.forEach(d => {
+                d.addEventListener("click", function(e){
+                    e.preventDefault();
+                    const parent = e.target.closest('tr');
+                    moveOrCopyItem(dt.row(parent).data()["meta"]);
+                });
+            });
+
+            const shareButtons = document.querySelectorAll('[data-kt-filemanager-table-action="share"]');
+
+            shareButtons.forEach(d => {
+                d.addEventListener("click", function(e){
+                    e.preventDefault();
+                    const parent = e.target.closest('tr');
+                    shareItem(dt.row(parent).data()["meta"]);
+                });
+            });
+
+            const deleteButtons = document.querySelectorAll('[data-kt-filemanager-table-action="delete"]');
+
+            deleteButtons.forEach(d => {
+                d.addEventListener("click", function(e){
+                    e.preventDefault();
+                    const parent = e.target.closest('tr');
+                    deleteItem(dt.row(parent).data()["meta"]);
+                });
+            });
+
+            const viewMediaLinks = document.querySelectorAll('[data-kt-filemanager-table-action="view_media"]');
+
+            viewMediaLinks.forEach(d => {
+                d.addEventListener("click", function(e){
+                    e.preventDefault();
+                    const parent = e.target.closest('tr');
+                    let rowData = dt.row(parent).data();
+                    openVideoPlayer(rowData["name"], rowData["url"]);
+                });
+            });
+        }
+
         var initLightbox = function() {
         var initLightbox = function() {
             lightbox = GLightbox({
             lightbox = GLightbox({
                     slideHTML: `<div class="gslide">
                     slideHTML: `<div class="gslide">
@@ -985,10 +1061,9 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
 
 
     function moveOrCopyItem(meta) {
     function moveOrCopyItem(meta) {
         $('#errorMsg').addClass("d-none");
         $('#errorMsg').addClass("d-none");
-        let decodedMeta = UnicodeDecodeB64(meta);
         $('#move_copy_name_container').removeClass("d-none");
         $('#move_copy_name_container').removeClass("d-none");
         $('#move_copy_source').val(meta);
         $('#move_copy_source').val(meta);
-        $('#move_copy_name').val(getNameFromMeta(decodedMeta));
+        $('#move_copy_name').val(getNameFromMeta(meta));
         $('#modal_move_or_copy').modal('show');
         $('#modal_move_or_copy').modal('show');
         KTDatatablesFoldersExplorer.init('{{.DirsURL}}?dirtree=1&path={{.CurrentDir}}', '{{.CurrentDir}}');
         KTDatatablesFoldersExplorer.init('{{.DirsURL}}?dirtree=1&path={{.CurrentDir}}', '{{.CurrentDir}}');
     }
     }
@@ -1017,7 +1092,7 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
                 });
                 });
             });
             });
         } else {
         } else {
-            let meta = UnicodeDecodeB64($('#move_copy_source').val());
+            let meta = $('#move_copy_source').val();
             let sourceName = getNameFromMeta(meta);
             let sourceName = getNameFromMeta(meta);
             items.push({
             items.push({
                 targetDir: targetDir,
                 targetDir: targetDir,
@@ -1204,7 +1279,6 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
         let errDivEl = $('#errorMsg');
         let errDivEl = $('#errorMsg');
         let errTxtEl = $('#errorTxt');
         let errTxtEl = $('#errorTxt');
         errDivEl.addClass("d-none");
         errDivEl.addClass("d-none");
-        meta = UnicodeDecodeB64(meta);
         let itemName = getNameFromMeta(meta);
         let itemName = getNameFromMeta(meta);
 
 
         ModalAlert.fire({
         ModalAlert.fire({
@@ -1251,7 +1325,6 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
     }
     }
 
 
     function shareItem(meta) {
     function shareItem(meta) {
-        meta = UnicodeDecodeB64(meta);
         let filesArray = [];
         let filesArray = [];
         filesArray.push(getNameFromMeta(meta));
         filesArray.push(getNameFromMeta(meta));
         let files = encodeURIComponent(JSON.stringify(filesArray));
         let files = encodeURIComponent(JSON.stringify(filesArray));
@@ -1263,8 +1336,7 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
 
 
     function renameItem(meta) {
     function renameItem(meta) {
         $('#errorMsg').addClass("d-none");
         $('#errorMsg').addClass("d-none");
-        let decodedMeta = UnicodeDecodeB64(meta);
-        let oldName = getNameFromMeta(decodedMeta);
+        let oldName = getNameFromMeta(meta);
         $('#rename_old_name').val(meta);
         $('#rename_old_name').val(meta);
         $('#rename_new_name').val(oldName);
         $('#rename_new_name').val(oldName);
         $('#rename_title').text(`Rename "${oldName}"`);
         $('#rename_title').text(`Rename "${oldName}"`);
@@ -1272,8 +1344,8 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
     }
     }
 
 
     function doRename() {
     function doRename() {
-        let decodedMeta = UnicodeDecodeB64($('#rename_old_name').val());
-        let oldName = getNameFromMeta(decodedMeta);
+        let meta = $('#rename_old_name').val();
+        let oldName = getNameFromMeta(meta);
         let newName = $('#rename_new_name').val();
         let newName = $('#rename_new_name').val();
         let errDivEl = $('#errorMsg');
         let errDivEl = $('#errorMsg');
         let errTxtEl = $('#errorTxt');
         let errTxtEl = $('#errorTxt');
@@ -1474,7 +1546,19 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
         uploadFile();
         uploadFile();
     }
     }
 
 
-    function openVideoPlayer(name, url, videoType){
+    function openVideoPlayer(name, url){
+        let extension = name.slice((name.lastIndexOf(".") - 1 >>> 0) + 2).toLowerCase();
+        let videoType = 'video/mp4';
+        if (extension == 'webm') {
+            videoType = 'video/webm';
+        } else if (extension == 'ogg' || extension == 'ogv') {
+            videoType = 'video/ogg';
+        } else if (extension == 'mp3') {
+            videoType = 'audio/mpeg';
+        } else if (extension == 'wav') {
+            videoType = 'audio/wav';
+        }
+
         if (!player){
         if (!player){
             player = videojs('video_player', {
             player = videojs('video_player', {
                 controls: true,
                 controls: true,
@@ -1482,7 +1566,7 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
                 preload: 'auto'
                 preload: 'auto'
             });
             });
         }
         }
-        $("#video_title").text(UnicodeDecodeB64(name));
+        $("#video_title").text(name);
         $('#modal_video_player').modal('show');
         $('#modal_video_player').modal('show');
         player.src({
         player.src({
             type: videoType,
             type: videoType,

+ 3 - 13
templates/webclient/profile.html

@@ -139,20 +139,10 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
 {{- define "extra_js"}}
 {{- define "extra_js"}}
 {{- if .LoggedUser.CanManagePublicKeys}}
 {{- if .LoggedUser.CanManagePublicKeys}}
 <script src="{{.StaticURL}}/assets/plugins/custom/formrepeater/formrepeater.bundle.js"></script>
 <script src="{{.StaticURL}}/assets/plugins/custom/formrepeater/formrepeater.bundle.js"></script>
-<script type="text/javascript" {{- if .CSPNonce}} nonce="{{.}}"{{- end}}>
+<script type="text/javascript" {{- if .CSPNonce}} nonce="{{.CSPNonce}}"{{- end}}>
     KTUtil.onDOMContentLoaded(function () {
     KTUtil.onDOMContentLoaded(function () {
-        $('#public_keys').repeater({
-            initEmpty: false,
-
-            show: function () {
-                $(this).slideDown();
-            },
-
-            hide: function (deleteElement) {
-                $(this).slideUp(deleteElement);
-            }
-        });
-
+        initRepeater('#public_keys');
+        initRepeaterItems();
 
 
         $("#page_form").submit(function (event) {
         $("#page_form").submit(function (event) {
             let submitButton = document.querySelector('#form_submit');
             let submitButton = document.querySelector('#form_submit');

+ 3 - 13
templates/webclient/share.html

@@ -191,17 +191,8 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
 <script src="{{.StaticURL}}/assets/plugins/custom/formrepeater/formrepeater.bundle.js"></script>
 <script src="{{.StaticURL}}/assets/plugins/custom/formrepeater/formrepeater.bundle.js"></script>
 <script type="text/javascript" {{- if .CSPNonce}} nonce="{{.CSPNonce}}"{{- end}}>
 <script type="text/javascript" {{- if .CSPNonce}} nonce="{{.CSPNonce}}"{{- end}}>
     KTUtil.onDOMContentLoaded(function () {
     KTUtil.onDOMContentLoaded(function () {
-            $('#paths').repeater({
-                initEmpty: false,
-
-                show: function () {
-                    $(this).slideDown();
-                },
-
-                hide: function (deleteElement) {
-                    $(this).slideUp(deleteElement);
-                }
-            });
+            initRepeater('#paths');
+            initRepeaterItems();
 
 
             const picker = new tempusDominus.TempusDominus(document.getElementById("id_expiration"), {
             const picker = new tempusDominus.TempusDominus(document.getElementById("id_expiration"), {
                 localization: {
                 localization: {
@@ -209,7 +200,7 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
                 }
                 }
             });
             });
             //{{ if gt .Share.ExpiresAt 0 }}
             //{{ if gt .Share.ExpiresAt 0 }}
-            let input_dt = moment('{{.Share.ExpiresAt }}','x').toDate();
+            let input_dt = moment('{{.Share.ExpiresAt }}', 'x').toDate();
             picker.dates.setValue(tempusDominus.DateTime.convert(input_dt));
             picker.dates.setValue(tempusDominus.DateTime.convert(input_dt));
             //{{ end }}
             //{{ end }}
 
 
@@ -232,6 +223,5 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
                 return true;
                 return true;
             });
             });
         });
         });
-
 </script>
 </script>
 {{- end}}
 {{- end}}

+ 152 - 99
templates/webclient/shares.html

@@ -161,121 +161,174 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
     }
     }
 
 
     function showShareLink(shareID, shareScope, isExpired) {
     function showShareLink(shareID, shareScope, isExpired) {
-            if (isExpired == "1") {
-                $('#expiredShare').show();
+        if (isExpired == "1") {
+            $('#expiredShare').show();
+            $('#writeShare').hide();
+            $('#readShare').hide();
+        } else {
+            let shareURL = '{{.BasePublicSharesURL}}' + "/" + fixedEncodeURIComponent(shareID);
+            if (shareScope == 'Read') {
+                $('#expiredShare').hide();
                 $('#writeShare').hide();
                 $('#writeShare').hide();
-                $('#readShare').hide();
+                $('#readShare').show();
+                $('#readLink').attr("href", shareURL);
+                $('#readLink').attr("title", shareURL);
+                $('#readUncompressedLink').attr("href", shareURL + "?compress=false");
+                $('#readUncompressedLink').attr("title", shareURL + "?compress=false");
+                $('#readBrowseLink').attr("href", shareURL + "/browse");
+                $('#readBrowseLink').attr("title", shareURL + "/browse");
             } else {
             } else {
-                let shareURL = '{{.BasePublicSharesURL}}' + "/" + fixedEncodeURIComponent(shareID);
-                if (shareScope == 'Read') {
-                    $('#expiredShare').hide();
-                    $('#writeShare').hide();
-                    $('#readShare').show();
-                    $('#readLink').attr("href", shareURL);
-                    $('#readLink').attr("title", shareURL);
-                    $('#readUncompressedLink').attr("href", shareURL + "?compress=false");
-                    $('#readUncompressedLink').attr("title", shareURL + "?compress=false");
-                    $('#readBrowseLink').attr("href", shareURL + "/browse");
-                    $('#readBrowseLink').attr("title", shareURL + "/browse");
-                } else {
-                    $('#expiredShare').hide();
-                    $('#writeShare').show();
-                    $('#readShare').hide();
-                    $('#writePageLink').attr("href", shareURL + "/upload");
-                    $('#writePageLink').attr("title", shareURL + "/upload");
-                }
+                $('#expiredShare').hide();
+                $('#writeShare').show();
+                $('#readShare').hide();
+                $('#writePageLink').attr("href", shareURL + "/upload");
+                $('#writePageLink').attr("title", shareURL + "/upload");
             }
             }
-            $('#link_modal').modal('show');
         }
         }
+        $('#link_modal').modal('show');
+    }
 
 
-    KTUtil.onDOMContentLoaded(function () {
-        const tableData = [];
-        {{- range .Shares}}
-        tableData.push(['{{.Name}}','{{.GetScopeAsString}}','{{.GetInfoString}}','{{.ShareID}}','{{- if .IsExpired}}1{{- else}}0{{- end}}']);
-        {{- end}}
+    const tableData = [];
+    {{- range .Shares}}
+    tableData.push(['{{.Name}}','{{.GetScopeAsString}}','{{.GetInfoString}}','{{.ShareID}}','{{- if .IsExpired}}1{{- else}}0{{- end}}']);
+    {{- end}}
 
 
-        let dt = $('#dataTable').DataTable({
-            data: tableData,
-            columnDefs: [
-                {
-                    targets: 3,
-                    searchable: false,
-                    orderable: false,
-                    className: 'text-end',
-                    render: function (data, type, row) {
-                        if (type === 'display') {
-                            return `<div class="d-flex justify-content-end">
-                                <div class="ms-2">
-                                    <a href="#" onclick="showShareLink('${row[3]}','${row[1]}','${row[4]}')" class="btn btn-sm btn-icon btn-light btn-active-light-primary">
-                                        <i class="ki-duotone ki-fasten fs-5 m-0">
-                                            <span class="path1"></span>
-                                            <span class="path2"></span>
-                                        </i>
-                                    </a>
-                                </div>
-                                <div class="ms-2">
-                                    <button type="button" class="btn btn-sm btn-icon btn-light btn-active-light-primary"
-                                        data-kt-menu-trigger="click" data-kt-menu-placement="bottom-end">
-                                        <i class="ki-duotone ki-dots-square fs-5 m-0">
-                                            <span class="path1"></span>
-                                            <span class="path2"></span>
-                                            <span class="path3"></span>
-                                            <span class="path4"></span>
-                                        </i>
-                                    </button>
-                                    <div class="menu menu-sub menu-sub-dropdown menu-column menu-rounded menu-gray-600 menu-state-bg-light-primary fw-semibold fs-7 w-150px py-4" data-kt-menu="true">
-                                        <div class="menu-item px-3">
-                                            <a href="#" onclick="editAction('${row[3]}');" class="menu-link px-3">Edit</a>
-                                        </div>
-                                        <div class="menu-item px-3">
-                                            <a href="#" onclick="deleteAction('${row[3]}');" class="menu-link text-danger px-3">Delete</a>
+    var sharesDatatable = function(){
+        var dt;
+
+        var initDatatable = function () {
+            dt = $('#dataTable').DataTable({
+                data: tableData,
+                columnDefs: [
+                    {
+                        targets: 3,
+                        searchable: false,
+                        orderable: false,
+                        className: 'text-end',
+                        render: function (data, type, row) {
+                            if (type === 'display') {
+                                return `<div class="d-flex justify-content-end">
+                                    <div class="ms-2">
+                                        <a href="#" class="btn btn-sm btn-icon btn-light btn-active-light-primary" data-share-table-action="show_link">
+                                            <i class="ki-duotone ki-fasten fs-5 m-0">
+                                                <span class="path1"></span>
+                                                <span class="path2"></span>
+                                            </i>
+                                        </a>
+                                    </div>
+                                    <div class="ms-2">
+                                        <button type="button" class="btn btn-sm btn-icon btn-light btn-active-light-primary"
+                                            data-kt-menu-trigger="click" data-kt-menu-placement="bottom-end">
+                                            <i class="ki-duotone ki-dots-square fs-5 m-0">
+                                                <span class="path1"></span>
+                                                <span class="path2"></span>
+                                                <span class="path3"></span>
+                                                <span class="path4"></span>
+                                            </i>
+                                        </button>
+                                        <div class="menu menu-sub menu-sub-dropdown menu-column menu-rounded menu-gray-600 menu-state-bg-light-primary fw-semibold fs-7 w-150px py-4" data-kt-menu="true">
+                                            <div class="menu-item px-3">
+                                                <a href="#" class="menu-link px-3" data-share-table-action="edit_row">Edit</a>
+                                            </div>
+                                            <div class="menu-item px-3">
+                                                <a href="#" class="menu-link text-danger px-3" data-share-table-action="delete_row">Delete</a>
+                                            </div>
                                         </div>
                                         </div>
                                     </div>
                                     </div>
-                                </div>
-                            </div>`;
+                                </div>`;
+                            }
+                            return "";
                         }
                         }
-                        return "";
-                    }
-                },
-                {
-                    targets: [0, 2],
-                    render: function (data, type, row) {
-                        if (type === 'display') {
-                            return escapeHTML(data);
+                    },
+                    {
+                        targets: [0, 2],
+                        render: function (data, type, row) {
+                            if (type === 'display') {
+                                return escapeHTML(data);
+                            }
+                            return data
                         }
                         }
-                        return data
-                    }
-                }
-            ],
-            deferRender: true,
-            stateSave: true,
-            stateDuration: 0,
-            stateLoadParams: function (settings, data) {
-                    if (data.search.search){
-                        const filterSearch = document.querySelector('[data-share-table-filter="search"]');
-                        filterSearch.value = data.search.search;
                     }
                     }
+                ],
+                deferRender: true,
+                stateSave: true,
+                stateDuration: 0,
+                stateLoadParams: function (settings, data) {
+                        if (data.search.search){
+                            const filterSearch = document.querySelector('[data-share-table-filter="search"]');
+                            filterSearch.value = data.search.search;
+                        }
+                    },
+                language: {
+                    emptyTable: "No share defined"
                 },
                 },
-            language: {
-                emptyTable: "No share defined"
-            },
-            order: [[1, 'asc']],
-            initComplete: function(settings, json) {
-                $('#loader').addClass("d-none");
-                $('#card_content').removeClass("d-none");
-                $.fn.dataTable.Api(settings).columns.adjust().draw();
+                order: [[1, 'asc']],
+                initComplete: function(settings, json) {
+                    $('#loader').addClass("d-none");
+                    $('#card_content').removeClass("d-none");
+                    let api = $.fn.dataTable.Api(settings);
+                    api.columns.adjust().draw();
+                    KTMenu.createInstances();
+                    handleRowActions();
+                }
+            });
+
+            dt.on('draw', function () {
                 KTMenu.createInstances();
                 KTMenu.createInstances();
-            }
-        });
+                handleRowActions();
+            });
+        }
 
 
-        document.querySelector('[data-share-table-filter="search"]').addEventListener('keyup', function(e){
-            dt.search(e.target.value, true, false).draw();
-        });
+        var handleSearchDatatable = function () {
+            const filterSearch = document.querySelector('[data-share-table-filter="search"]');
+            filterSearch.addEventListener('keyup', function (e) {
+                dt.rows().deselect();
+                dt.search(e.target.value, true, false).draw();
+            });
+        }
 
 
-        dt.on('draw', function () {
-            KTMenu.createInstances();
-        });
+        function handleRowActions() {
+            const editButtons = document.querySelectorAll('[data-share-table-action="edit_row"]');
+
+            editButtons.forEach(d => {
+                d.addEventListener("click", function(e){
+                    e.preventDefault();
+                    const parent = e.target.closest('tr');
+                    editAction(dt.row(parent).data()[3]);
+                });
+            });
+
+            const deleteButtons = document.querySelectorAll('[data-share-table-action="delete_row"]');
+
+            deleteButtons.forEach(d => {
+                d.addEventListener("click", function(e){
+                    e.preventDefault();
+                    const parent = e.target.closest('tr');
+                    deleteAction(dt.row(parent).data()[3]);
+                });
+            });
+
+            const showLinkButtons = document.querySelectorAll('[data-share-table-action="show_link"]');
+
+            showLinkButtons.forEach(d => {
+                d.addEventListener("click", function(e){
+                    e.preventDefault();
+                    let rowData = dt.row(e.target.closest('tr')).data();
+                    showShareLink(rowData[3], rowData[1], rowData[4]);
+                });
+            });
+        }
 
 
+        return {
+            init: function () {
+                initDatatable();
+                handleSearchDatatable();
+            }
+        }
+    }();
+
+    KTUtil.onDOMContentLoaded(function () {
+        sharesDatatable.init();
     });
     });
 </script>
 </script>
 {{end}}
 {{end}}

+ 1 - 1
templates/webclient/shareupload.html

@@ -54,7 +54,7 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
 {{- end}}
 {{- end}}
 
 
 {{- define "extra_js"}}
 {{- define "extra_js"}}
-<script type="text/javascript" {{- if .CSPNonce}} nonce="{{.}}"{{- end}}>
+<script type="text/javascript" {{- if .CSPNonce}} nonce="{{.CSPNonce}}"{{- end}}>
 
 
     function uploadFiles(files) {
     function uploadFiles(files) {
         let has_errors = false;
         let has_errors = false;

+ 1 - 1
templates/webclient/viewpdf.html

@@ -27,7 +27,7 @@ explicit grant from the SFTPGo Team (support@sftpgo.com).
 
 
 <body>
 <body>
     <script src="{{.StaticURL}}/vendor/pdfobject/pdfobject.min.js"></script>
     <script src="{{.StaticURL}}/vendor/pdfobject/pdfobject.min.js"></script>
-    <script type="text/javascript" {{- if .CSPNonce}} nonce="{{.}}"{{- end}}>
+    <script type="text/javascript" {{- if .CSPNonce}} nonce="{{.CSPNonce}}"{{- end}}>
         PDFObject.embed("{{.URL}}", document.body);
         PDFObject.embed("{{.URL}}", document.body);
     </script>
     </script>
 </body>
 </body>

Some files were not shown because too many files changed in this diff