new configuration version
|
@ -16,3 +16,5 @@ spec:
|
|||
namespace: "adn-agov-nevisidm-admin-01-uat"
|
||||
- name: "proxy-idm-saml-sp-nevisidm-admin-realm-identity"
|
||||
namespace: "adn-agov-nevisidm-admin-01-uat"
|
||||
- name: "proxy-sp-ident-authenticationrealm-identity"
|
||||
namespace: "adn-agov-nevisidm-admin-01-uat"
|
||||
|
|
|
@ -45,7 +45,7 @@ spec:
|
|||
podDisruptionBudget:
|
||||
maxUnavailable: "50%"
|
||||
git:
|
||||
tag: "r-de679db35a5049f78feb4eca1e828eb6997985b5"
|
||||
tag: "r-030a0c32f7aa373371615e3c88c1e7e33eccfd82"
|
||||
dir: "DEFAULT-ADN-AGOV-ADMIN-PROJECT/DEFAULT-ADN-AGOV-ADMIN-INV/auth"
|
||||
credentials: "git-credentials"
|
||||
keystores:
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIFjzCCA3egAwIBAgIUFEFkfNhFmliJmUk1v6WdyJN+05swDQYJKoZIhvcNAQEL
|
||||
BQAwVzELMAkGA1UEBhMCY2gxEDAOBgNVBAoMB0Fkbm92dW0xDTALBgNVBAsMBGFn
|
||||
b3YxJzAlBgNVBAMMHmlkZW50LmFnb3Ytdy5henVyZS5hZG5vdnVtLm5ldDAeFw0y
|
||||
NTA1MDcwNDQ3NDlaFw0zNTA1MDUwNDQ3NDlaMFcxCzAJBgNVBAYTAmNoMRAwDgYD
|
||||
VQQKDAdBZG5vdnVtMQ0wCwYDVQQLDARhZ292MScwJQYDVQQDDB5pZGVudC5hZ292
|
||||
LXcuYXp1cmUuYWRub3Z1bS5uZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
|
||||
AoICAQDIxuUes2jqQdn1usiVTtVpfJ2GZTxp0bqESesFUeRru5d9x00N6oeGL92e
|
||||
DXnZfWByzASA6rFWGs44SEpNu97wLMqofPXJ6IGPGXmC7ZHzn4kzLo4Lab3Uy3r+
|
||||
Xi5PD3j8G29ll+QIZTXBOD2ahgC5LxibnRPuV3UAXZdzcreDnozWbcYFTNmFT6+W
|
||||
H0LRGlohkgO4yVpLLTH9ayoD0R198kcOTyLXr7IwFH8zvhzZAwNdHPHHP0nLuoVq
|
||||
gqkNy/eZng4bT3ZWwvoX+RYXs7eJOiMUXd7PzOhvaTi1MMwHroVtFVgoJOSC9UW2
|
||||
bchzuc62M3Plt02WI3FRKXFX9wX6aLzVFNDl3+1xvvfjE6zdgNBfrw7Q7xwp2ejJ
|
||||
J8vY5bHDGq6OtmjAhELDio/YE611TLbB2r5XbDxVLp46pQvCDcu4091vzeLPCHX5
|
||||
msYecamrZJRDL9X+01SeXc/bPMngHE1QaBqa1tAB2JEzg9k72EDj1b/cfmGsO839
|
||||
0VSUQ9RqdQy2kJrLXx2GfxGkZdjLZJaCpGEXsedlCg5e2K/7H9Wtr/1ofSoV+0k3
|
||||
xe9xuMIbC0wwh+dQ2ATMnTEHZHHwLrKo1qu4GSBdiRMBD92ib5EdRj94gXa0v3Cg
|
||||
8uBp49lZHc6l7ctxQ97Ly9gxoobPXDoxh2/EbhCpM4dop74N5QIDAQABo1MwUTAd
|
||||
BgNVHQ4EFgQU/LigkPHuQ28Zc/fsi36K4zsmjhIwHwYDVR0jBBgwFoAU/LigkPHu
|
||||
Q28Zc/fsi36K4zsmjhIwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
|
||||
AgEAIQ0ajadHzIeOmTuPTOJo3+b47dNoZ/LnVn8tRz+q5xHd4bswrHTPyRW1gkP3
|
||||
bGY0cp+JMsjKIeqqouhCu+i5OAPZyM57McDj9gMrx33jp4uKJF7Fa47KxZTC8Bam
|
||||
tiLcPwXgkEQVWCn8xE6GrgZF93yolcABDW44U0G4yFR33p/IYvNFEQwnAGLN8CZC
|
||||
2QIJGhSdCv+SKO2gf9SMOlOe26osgCv2aMQpRso+rbA2xOT9NAe5D/QNeyXX4ljX
|
||||
Ghz0Hjen5+vE6vlUUXfflNg6EpA7rscj8R6R5cjY1oBKCuGCkO4MEx/kRTPJIq3g
|
||||
dVl0dLSD3hcsOEu+DuCtzhj2avXVdgC/TZMrDl0VxL5Iv+Pmah16DoDZKlI00QHZ
|
||||
Lne8n6fBd7U7m5I3EIlptdt8SxzKQ2IdrfJz9iSDzICl7CmYor2K5jYr2SUHLNSi
|
||||
kFtSXY9zGHJ0nawzQSQCuXCIoW/utLIWQAfIsrTX325JSbCV62IthzRmoxOsupm0
|
||||
O3h5NOnKSJI6oX2YVfWt1qPrNLPJf/IHOT7Khq/10wgd4Cg49JfKPcQ1Bj+4knQ1
|
||||
M1Wyhazq24a8cH5eAo02Ckv79Pb5/UMhj7o7ZiFTLhzLATXju1v3+vA7F6PV0C8U
|
||||
MNzIMeVZsN3qpcvJSEgkRtHuQe9akc7GmhNL4w+LV20QZy4=
|
||||
-----END CERTIFICATE-----
|
|
@ -0,0 +1,54 @@
|
|||
-----BEGIN ENCRYPTED PRIVATE KEY-----
|
||||
MIIJqzBVBgkqhkiG9w0BBQ0wSDAnBgkqhkiG9w0BBQwwGgQUuj8UNQmLKEwOD3Ij
|
||||
gjT2bC1IgOUCAggAMB0GCWCGSAFlAwQBKgQQilo/zrSzyfj+eUjtGegooASCCVBn
|
||||
3gQUmNY8CiejjthSXhpxCfVdX4P0lyhQ1Y7Q4wGhxVNTRNQoAJoUx6rnvhO+bLyp
|
||||
/cW5OkIu212YrSaF9Yr+H06k6v8fMMeDEqLCrAT54HjtNqKP3NerBT0bQHs+ZHI7
|
||||
CK92SyxDlwVXzmLBei2vTnclud93AwFXlnY1HEmt6nOIzzZYOZOrJJARoUfnsdEP
|
||||
q0c27EhJ4crY6V4Ld+fhudOo7pPGchDOwagEXIjmi/rLnk3ZPo9vUE5TZh85bcv6
|
||||
ggAoOKXR6nBVSykdUvwjBSQgkZj13WRSoutWOILxHer98qql3OhstFbmn0OPqabx
|
||||
C3XL9Xh2iycWNWUFRoRb/b+g6asJrTKNmbq9h1v/iFr2s2dC8bHK3IXRuV0sTGyT
|
||||
m3iUQOjFN1e1/kAcCu4a7qZwKk0athIPsEX89nkP0TV8TyGKRjP7jyECiTt4AwyE
|
||||
b/I/gbJs8d6zACPkslXJmLmPUhxwwHBRw8Ayk83xvAtjGJAGMNqa2DjjTGE40jnJ
|
||||
2/Mmq9uIK1tf7TBF7cp5SJrEpd+c+eq+nx2tgGhYfj3TrlG0LLi2kW/QVcYlJyVE
|
||||
hDxA/PDQQ9ykuwwHGtmgykjEpxqhIlkzrsFfuShRw9KcwFwLaAWDzECzMjzwdCux
|
||||
z3U4HYWMuSUgvwF/ek40yvw40DLPOz9l6WgFRwdtr2t7wPLu/g3KkyRp0SXL5Wf2
|
||||
8cyMQ/CZhm10aSzOqFda9c2rFKZ+ICfPg96NGJ9y2lMm7aKVXywxlk42u8wfkG6B
|
||||
Q0vRUNhmhED+SC+aDmxUpwmG5WCX5SJVvt3e9VRBDxZzHVEqTgtOqN8XgFDpoLg8
|
||||
nis2Gz3VEpV2Ex1N4mgVNRSp8qIkB+SXm8aFi0s4XFAc4MBVDaW5orS8ucgxoX1m
|
||||
SGa16/EwnP68rQou5bWlApe6TdmxFPGKiQgEb9eHLXy9Ye8wsUo85iDcLUGmiK9k
|
||||
A9OnE5+essvEKEP0UPkSvML/uf5kaLWNb6lmWmZ9LZd9XuvrAwY+4jH+03OxWEwB
|
||||
UBuEWCrkkYqYubMh6avkZQl/nG0I2nJx1lz7XOaWgXXaHm6w6kqQdfBvpzr6MUXy
|
||||
gJKFKaCydI/z+Hb/HRsxQLBTXo/BdTGCYbakiQQbXEKmhrrrHuXUb273kJpmKAWu
|
||||
s0147rjEPnZlZjsnKctILUOrUctkB8E53yXLx4mp4ptxOtbb/FgOxdUIo9iQ5/sZ
|
||||
5o2whxjHIXn/jCGXUbdZXmAJ7fG9WY6WHBlcJrJuKJt3duu8OqJ45IZA6kkZLvCm
|
||||
eR4tFSJWqvHfxLrzznHLzENOgB2A4Syvrzvbi9nBWWavS6dtqnBpVCr4FbchpZEM
|
||||
N+ljYY3SJ7iX2a0mPpQ5llOfhC3yqrG71aaPLxcuFAY1g/YX/SWRTT3yMds/XZAh
|
||||
Cd3iCR48Y+NZXQdnnTTyGpe3O+pxZbzxTeRcq7OKETKM/KJaISynEveccTvR1Jh0
|
||||
7oHr+SxqmzFA3McupLvupv81ERT3kXe6h+5KlIdawwxW30gsIgFpx4XhpYQeBEPC
|
||||
j/zH+ivBXJRs5+H4KGdTPJCRmXbSVmbCDPedrQOLNHY+rj79PhsV3Ut4s5+EHNiV
|
||||
269FL0q3MdrPnZfbQSno2HCrOBoixVfFh7Kk+gEAL575NZPvhmkYdtS/ysYlR4yJ
|
||||
Y6Zwl6IUV/bAu1hTg9vSZsxDId0mrmiJ9U6ovWrIzXHif1asLoHX1oxQHTJq0T9o
|
||||
boLodekjlXswfXHckQyPwa3fDa0MnGb5ZN1vOo0X+DvmwthNKwhAuUULrTYqSJPQ
|
||||
zGziNz1aEntO+2W6p+ZiHC0sUl3slVWS13borTLCs1GxyF3THctwCisfs6KfUQ46
|
||||
N9urr/IGyD76TJgXDCWyCStNnDFSi5T67yvHkIkdJsFw4FhFq7nKCiiSqHy0hvwl
|
||||
LuCnBDA5Io+77xRdWKY1X9qdFxeEnp7nTPsk0k0+LH6Ty213wxyOPrIzTGtPYGaH
|
||||
AmFbY4yQ2jEjR1D1IAhH7AjPAP6Ifszp+PdSlCX++nIOQ6JFNw0TKIcxhg5iQ+hS
|
||||
5a76Nmf1R1/KwWTB2h1aP9GxbKnz08xba4zdkf8WOKXTY943i5Dy2mNZ149ha03N
|
||||
oOsyzihPw0Spf2ckI4fSTfosXtugoFw8lzt8IKn0V9xk1xWdKGIqCsPXVg9e0YT3
|
||||
i/axJeQ6bEOUvUzMqmj20BxNZ+zwCRcFYJjaC9+L3DAmRpqKgZ9FAi+IHu+F2XS7
|
||||
sQ6rsFJap7L4fbYy4h05Yr8PAwekJVmw3wOM2Y6jbTa0X/rE/kcOq+eHKywB1zia
|
||||
fwzGNfE1yDujucQ7gDkFUCHXl2s/5PKYyKf/YSxz5v3KNp4KSNSEM8zgru45xvJx
|
||||
bNn1A0loW6/KdJVT5lnZ62sKgrd46Zd+8asruQWl0KMCK8t+B0GEuhTUraZd2Ynb
|
||||
8yOFnjHfzVcaBaaj5IILw5uVGJ30+vtx7ewaeXF82ssiXjPGE7DMDjW4CQsG5PTk
|
||||
upTmWm3zmZnvo/YCLfbzI/WjTnaIoF0vFpE2bIuB4L/BqP1nYlmmFreKmqs0YFoE
|
||||
uLn/7xmbxmw3z6dEboRPPgf9Yx2i+lOJhmfxYjSL0pnnRkFEJWkgaogMaTBgU9p1
|
||||
aUvOQZy25SiTnjPagikHIGyQHbWfISAEG2hlpT1Au3pvowQrQ1YdfNHTklRSy32C
|
||||
tA5EaR2AhZmrnSK9TqDREyayM0/g7ms7r7Ul0XbuZ0AJISkcpNvY64C6GCDrN/e4
|
||||
NG+bTh7ALAX7f9QSJns86DAI4n+bYzoFBwclTiQ5N6q05StJIimNkOplNAXpAD26
|
||||
H2d/Mz1JtfhHv9V9w0eM1d64Fcb8SqE2D8f+9m733JRPz8I7LdADq3nRBAwyrusO
|
||||
6/D5tp85Bnt29aPspkJT6AYhPXql9mygg+fzjpnVzBZstkqBAALfgHelRfEyK3sp
|
||||
6f2FvxHuHbS7/iSmdLkZ5HCo1A1U2UFocOhfSxnscghwjDaMoueR+Km034Xc9sCf
|
||||
gXQoZyvcy86NssJvnmIPHF0PP+T3+8lxyl8wE8zWS4xUMPtChQLIZlqQP8iy0Jlo
|
||||
O9FxMcvUnSCzFilbfihHd9VwFkOPcYoyhtyWtAEAhZz0qVjjchESO0D0hiJ9pAYI
|
||||
QymW8hknE9mkKNvA+dv2t0EYdiEkUZxXJxpAp29c5A==
|
||||
-----END ENCRYPTED PRIVATE KEY-----
|
|
@ -0,0 +1,2 @@
|
|||
#!/bin/bash
|
||||
echo 'KdBAW9xaXAr+ZUg+DVfaepnTTMRGtnu5s8VEO6Cbpw='
|
|
@ -0,0 +1,87 @@
|
|||
-----BEGIN ENCRYPTED PRIVATE KEY-----
|
||||
MIIJqzBVBgkqhkiG9w0BBQ0wSDAnBgkqhkiG9w0BBQwwGgQUuj8UNQmLKEwOD3Ij
|
||||
gjT2bC1IgOUCAggAMB0GCWCGSAFlAwQBKgQQilo/zrSzyfj+eUjtGegooASCCVBn
|
||||
3gQUmNY8CiejjthSXhpxCfVdX4P0lyhQ1Y7Q4wGhxVNTRNQoAJoUx6rnvhO+bLyp
|
||||
/cW5OkIu212YrSaF9Yr+H06k6v8fMMeDEqLCrAT54HjtNqKP3NerBT0bQHs+ZHI7
|
||||
CK92SyxDlwVXzmLBei2vTnclud93AwFXlnY1HEmt6nOIzzZYOZOrJJARoUfnsdEP
|
||||
q0c27EhJ4crY6V4Ld+fhudOo7pPGchDOwagEXIjmi/rLnk3ZPo9vUE5TZh85bcv6
|
||||
ggAoOKXR6nBVSykdUvwjBSQgkZj13WRSoutWOILxHer98qql3OhstFbmn0OPqabx
|
||||
C3XL9Xh2iycWNWUFRoRb/b+g6asJrTKNmbq9h1v/iFr2s2dC8bHK3IXRuV0sTGyT
|
||||
m3iUQOjFN1e1/kAcCu4a7qZwKk0athIPsEX89nkP0TV8TyGKRjP7jyECiTt4AwyE
|
||||
b/I/gbJs8d6zACPkslXJmLmPUhxwwHBRw8Ayk83xvAtjGJAGMNqa2DjjTGE40jnJ
|
||||
2/Mmq9uIK1tf7TBF7cp5SJrEpd+c+eq+nx2tgGhYfj3TrlG0LLi2kW/QVcYlJyVE
|
||||
hDxA/PDQQ9ykuwwHGtmgykjEpxqhIlkzrsFfuShRw9KcwFwLaAWDzECzMjzwdCux
|
||||
z3U4HYWMuSUgvwF/ek40yvw40DLPOz9l6WgFRwdtr2t7wPLu/g3KkyRp0SXL5Wf2
|
||||
8cyMQ/CZhm10aSzOqFda9c2rFKZ+ICfPg96NGJ9y2lMm7aKVXywxlk42u8wfkG6B
|
||||
Q0vRUNhmhED+SC+aDmxUpwmG5WCX5SJVvt3e9VRBDxZzHVEqTgtOqN8XgFDpoLg8
|
||||
nis2Gz3VEpV2Ex1N4mgVNRSp8qIkB+SXm8aFi0s4XFAc4MBVDaW5orS8ucgxoX1m
|
||||
SGa16/EwnP68rQou5bWlApe6TdmxFPGKiQgEb9eHLXy9Ye8wsUo85iDcLUGmiK9k
|
||||
A9OnE5+essvEKEP0UPkSvML/uf5kaLWNb6lmWmZ9LZd9XuvrAwY+4jH+03OxWEwB
|
||||
UBuEWCrkkYqYubMh6avkZQl/nG0I2nJx1lz7XOaWgXXaHm6w6kqQdfBvpzr6MUXy
|
||||
gJKFKaCydI/z+Hb/HRsxQLBTXo/BdTGCYbakiQQbXEKmhrrrHuXUb273kJpmKAWu
|
||||
s0147rjEPnZlZjsnKctILUOrUctkB8E53yXLx4mp4ptxOtbb/FgOxdUIo9iQ5/sZ
|
||||
5o2whxjHIXn/jCGXUbdZXmAJ7fG9WY6WHBlcJrJuKJt3duu8OqJ45IZA6kkZLvCm
|
||||
eR4tFSJWqvHfxLrzznHLzENOgB2A4Syvrzvbi9nBWWavS6dtqnBpVCr4FbchpZEM
|
||||
N+ljYY3SJ7iX2a0mPpQ5llOfhC3yqrG71aaPLxcuFAY1g/YX/SWRTT3yMds/XZAh
|
||||
Cd3iCR48Y+NZXQdnnTTyGpe3O+pxZbzxTeRcq7OKETKM/KJaISynEveccTvR1Jh0
|
||||
7oHr+SxqmzFA3McupLvupv81ERT3kXe6h+5KlIdawwxW30gsIgFpx4XhpYQeBEPC
|
||||
j/zH+ivBXJRs5+H4KGdTPJCRmXbSVmbCDPedrQOLNHY+rj79PhsV3Ut4s5+EHNiV
|
||||
269FL0q3MdrPnZfbQSno2HCrOBoixVfFh7Kk+gEAL575NZPvhmkYdtS/ysYlR4yJ
|
||||
Y6Zwl6IUV/bAu1hTg9vSZsxDId0mrmiJ9U6ovWrIzXHif1asLoHX1oxQHTJq0T9o
|
||||
boLodekjlXswfXHckQyPwa3fDa0MnGb5ZN1vOo0X+DvmwthNKwhAuUULrTYqSJPQ
|
||||
zGziNz1aEntO+2W6p+ZiHC0sUl3slVWS13borTLCs1GxyF3THctwCisfs6KfUQ46
|
||||
N9urr/IGyD76TJgXDCWyCStNnDFSi5T67yvHkIkdJsFw4FhFq7nKCiiSqHy0hvwl
|
||||
LuCnBDA5Io+77xRdWKY1X9qdFxeEnp7nTPsk0k0+LH6Ty213wxyOPrIzTGtPYGaH
|
||||
AmFbY4yQ2jEjR1D1IAhH7AjPAP6Ifszp+PdSlCX++nIOQ6JFNw0TKIcxhg5iQ+hS
|
||||
5a76Nmf1R1/KwWTB2h1aP9GxbKnz08xba4zdkf8WOKXTY943i5Dy2mNZ149ha03N
|
||||
oOsyzihPw0Spf2ckI4fSTfosXtugoFw8lzt8IKn0V9xk1xWdKGIqCsPXVg9e0YT3
|
||||
i/axJeQ6bEOUvUzMqmj20BxNZ+zwCRcFYJjaC9+L3DAmRpqKgZ9FAi+IHu+F2XS7
|
||||
sQ6rsFJap7L4fbYy4h05Yr8PAwekJVmw3wOM2Y6jbTa0X/rE/kcOq+eHKywB1zia
|
||||
fwzGNfE1yDujucQ7gDkFUCHXl2s/5PKYyKf/YSxz5v3KNp4KSNSEM8zgru45xvJx
|
||||
bNn1A0loW6/KdJVT5lnZ62sKgrd46Zd+8asruQWl0KMCK8t+B0GEuhTUraZd2Ynb
|
||||
8yOFnjHfzVcaBaaj5IILw5uVGJ30+vtx7ewaeXF82ssiXjPGE7DMDjW4CQsG5PTk
|
||||
upTmWm3zmZnvo/YCLfbzI/WjTnaIoF0vFpE2bIuB4L/BqP1nYlmmFreKmqs0YFoE
|
||||
uLn/7xmbxmw3z6dEboRPPgf9Yx2i+lOJhmfxYjSL0pnnRkFEJWkgaogMaTBgU9p1
|
||||
aUvOQZy25SiTnjPagikHIGyQHbWfISAEG2hlpT1Au3pvowQrQ1YdfNHTklRSy32C
|
||||
tA5EaR2AhZmrnSK9TqDREyayM0/g7ms7r7Ul0XbuZ0AJISkcpNvY64C6GCDrN/e4
|
||||
NG+bTh7ALAX7f9QSJns86DAI4n+bYzoFBwclTiQ5N6q05StJIimNkOplNAXpAD26
|
||||
H2d/Mz1JtfhHv9V9w0eM1d64Fcb8SqE2D8f+9m733JRPz8I7LdADq3nRBAwyrusO
|
||||
6/D5tp85Bnt29aPspkJT6AYhPXql9mygg+fzjpnVzBZstkqBAALfgHelRfEyK3sp
|
||||
6f2FvxHuHbS7/iSmdLkZ5HCo1A1U2UFocOhfSxnscghwjDaMoueR+Km034Xc9sCf
|
||||
gXQoZyvcy86NssJvnmIPHF0PP+T3+8lxyl8wE8zWS4xUMPtChQLIZlqQP8iy0Jlo
|
||||
O9FxMcvUnSCzFilbfihHd9VwFkOPcYoyhtyWtAEAhZz0qVjjchESO0D0hiJ9pAYI
|
||||
QymW8hknE9mkKNvA+dv2t0EYdiEkUZxXJxpAp29c5A==
|
||||
-----END ENCRYPTED PRIVATE KEY-----
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIFjzCCA3egAwIBAgIUFEFkfNhFmliJmUk1v6WdyJN+05swDQYJKoZIhvcNAQEL
|
||||
BQAwVzELMAkGA1UEBhMCY2gxEDAOBgNVBAoMB0Fkbm92dW0xDTALBgNVBAsMBGFn
|
||||
b3YxJzAlBgNVBAMMHmlkZW50LmFnb3Ytdy5henVyZS5hZG5vdnVtLm5ldDAeFw0y
|
||||
NTA1MDcwNDQ3NDlaFw0zNTA1MDUwNDQ3NDlaMFcxCzAJBgNVBAYTAmNoMRAwDgYD
|
||||
VQQKDAdBZG5vdnVtMQ0wCwYDVQQLDARhZ292MScwJQYDVQQDDB5pZGVudC5hZ292
|
||||
LXcuYXp1cmUuYWRub3Z1bS5uZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
|
||||
AoICAQDIxuUes2jqQdn1usiVTtVpfJ2GZTxp0bqESesFUeRru5d9x00N6oeGL92e
|
||||
DXnZfWByzASA6rFWGs44SEpNu97wLMqofPXJ6IGPGXmC7ZHzn4kzLo4Lab3Uy3r+
|
||||
Xi5PD3j8G29ll+QIZTXBOD2ahgC5LxibnRPuV3UAXZdzcreDnozWbcYFTNmFT6+W
|
||||
H0LRGlohkgO4yVpLLTH9ayoD0R198kcOTyLXr7IwFH8zvhzZAwNdHPHHP0nLuoVq
|
||||
gqkNy/eZng4bT3ZWwvoX+RYXs7eJOiMUXd7PzOhvaTi1MMwHroVtFVgoJOSC9UW2
|
||||
bchzuc62M3Plt02WI3FRKXFX9wX6aLzVFNDl3+1xvvfjE6zdgNBfrw7Q7xwp2ejJ
|
||||
J8vY5bHDGq6OtmjAhELDio/YE611TLbB2r5XbDxVLp46pQvCDcu4091vzeLPCHX5
|
||||
msYecamrZJRDL9X+01SeXc/bPMngHE1QaBqa1tAB2JEzg9k72EDj1b/cfmGsO839
|
||||
0VSUQ9RqdQy2kJrLXx2GfxGkZdjLZJaCpGEXsedlCg5e2K/7H9Wtr/1ofSoV+0k3
|
||||
xe9xuMIbC0wwh+dQ2ATMnTEHZHHwLrKo1qu4GSBdiRMBD92ib5EdRj94gXa0v3Cg
|
||||
8uBp49lZHc6l7ctxQ97Ly9gxoobPXDoxh2/EbhCpM4dop74N5QIDAQABo1MwUTAd
|
||||
BgNVHQ4EFgQU/LigkPHuQ28Zc/fsi36K4zsmjhIwHwYDVR0jBBgwFoAU/LigkPHu
|
||||
Q28Zc/fsi36K4zsmjhIwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
|
||||
AgEAIQ0ajadHzIeOmTuPTOJo3+b47dNoZ/LnVn8tRz+q5xHd4bswrHTPyRW1gkP3
|
||||
bGY0cp+JMsjKIeqqouhCu+i5OAPZyM57McDj9gMrx33jp4uKJF7Fa47KxZTC8Bam
|
||||
tiLcPwXgkEQVWCn8xE6GrgZF93yolcABDW44U0G4yFR33p/IYvNFEQwnAGLN8CZC
|
||||
2QIJGhSdCv+SKO2gf9SMOlOe26osgCv2aMQpRso+rbA2xOT9NAe5D/QNeyXX4ljX
|
||||
Ghz0Hjen5+vE6vlUUXfflNg6EpA7rscj8R6R5cjY1oBKCuGCkO4MEx/kRTPJIq3g
|
||||
dVl0dLSD3hcsOEu+DuCtzhj2avXVdgC/TZMrDl0VxL5Iv+Pmah16DoDZKlI00QHZ
|
||||
Lne8n6fBd7U7m5I3EIlptdt8SxzKQ2IdrfJz9iSDzICl7CmYor2K5jYr2SUHLNSi
|
||||
kFtSXY9zGHJ0nawzQSQCuXCIoW/utLIWQAfIsrTX325JSbCV62IthzRmoxOsupm0
|
||||
O3h5NOnKSJI6oX2YVfWt1qPrNLPJf/IHOT7Khq/10wgd4Cg49JfKPcQ1Bj+4knQ1
|
||||
M1Wyhazq24a8cH5eAo02Ckv79Pb5/UMhj7o7ZiFTLhzLATXju1v3+vA7F6PV0C8U
|
||||
MNzIMeVZsN3qpcvJSEgkRtHuQe9akc7GmhNL4w+LV20QZy4=
|
||||
-----END CERTIFICATE-----
|
|
@ -0,0 +1,65 @@
|
|||
import ch.nevis.esauth.auth.engine.AuthResponse
|
||||
import groovy.xml.XmlSlurper
|
||||
import groovy.json.JsonSlurper
|
||||
|
||||
def cleanSession() {
|
||||
def s = request.getAuthSession(true)
|
||||
|
||||
s.removeAttribute('agov.ident.rpcode.backup')
|
||||
s.removeAttribute('agov.ident.rpcode')
|
||||
s.removeAttribute('agov.ident.entityId')
|
||||
s.removeAttribute('saml.response.statusCode')
|
||||
if (response.getActualRoles().length > 0) {
|
||||
def actualRoles = Arrays.copyOf(response.getActualRoles(), response.getActualRoles().length)
|
||||
actualRoles.each{ role -> response.removeActualRole(role) }
|
||||
}
|
||||
}
|
||||
|
||||
// for auditing
|
||||
def sourceIp = request.getLoginContext()['connection.HttpHeader.X-Real-IP'] ?: 'unknown'
|
||||
def userAgent = request.getLoginContext()['connection.HttpHeader.user-agent'] ?: request.getLoginContext()['connection.HttpHeader.User-Agent'] ?: 'unknown'
|
||||
def referer = request.getLoginContext()['connection.HttpHeader.referer'] ?: request.getLoginContext()['connection.HttpHeader' +
|
||||
'.Referer'] ?: '-'
|
||||
def origin = request.getLoginContext()['connection.HttpHeader.origin'] ?: request.getLoginContext()['connection.HttpHeader' +
|
||||
'.Origin'] ?: '-'
|
||||
|
||||
// 1) we need to know the code of the RP
|
||||
def rpcode = inargs['rpcode'] ?: inargs['RelayState']
|
||||
def rpcodeBackup = session['agov.ident.rpcode']
|
||||
|
||||
if (rpcode)
|
||||
{
|
||||
if (rpcodeBackup) {
|
||||
response.setSessionAttribute('agov.ident.rpcode.backup', rpcodeBackup)
|
||||
}
|
||||
response.setSessionAttribute('agov.ident.rpcode', rpcode)
|
||||
} else {
|
||||
cleanSession()
|
||||
LOG.info("Event='IDENT-INVALIDREQ', rpcode='missing', SourceIp=${sourceIp}, UserAgent=${userAgent}, Referer='${referer}', Origin='${origin}'")
|
||||
response.setResult('inavlidurl')
|
||||
return
|
||||
}
|
||||
|
||||
// 2) load rp settings in session (if needed)
|
||||
if (rpcode != rpcodeBackup) {
|
||||
def slurper = new JsonSlurper()
|
||||
def rpMap = slurper.parseText(parameters['rpcode.list'])
|
||||
LOG.debug(">>> rpMaP: ${rpMap}")
|
||||
if (!rpMap[rpcode]) {
|
||||
cleanSession()
|
||||
LOG.info("Event='IDENT-INVALIDREQ', rpcode='${rpcode}', SourceIp=${sourceIp}, UserAgent=${userAgent}, Referer='${referer}', Origin='${origin}'")
|
||||
response.setResult('inavlidurl')
|
||||
return
|
||||
}
|
||||
response.setSessionAttribute('agov.ident.entityId', rpMap[rpcode])
|
||||
}
|
||||
|
||||
// 3) if we have a response ...
|
||||
if (inargs['SAMLResponse']) {
|
||||
response.setResult('processResponse')
|
||||
return
|
||||
}
|
||||
|
||||
// 4) otherwise
|
||||
response.setResult('sendAuthnRequest')
|
||||
return
|
|
@ -1,14 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE esauth-server SYSTEM "/opt/nevisauth/dtd/esauth4.dtd">
|
||||
<esauth-server instance="auth">
|
||||
<!-- source: pattern://6df66943ca713eed2a25d935, pattern://6f9c9f982dcc7ef59a34f1f7, pattern://7518c6cc61e47eec6322ae17, pattern://ac27dd7daad0ca2b7229bfaf -->
|
||||
<!-- source: pattern://6df66943ca713eed2a25d935, pattern://6df66943ca713eed2a25d935, pattern://6f9c9f982dcc7ef59a34f1f7, pattern://7518c6cc61e47eec6322ae17, pattern://ac27dd7daad0ca2b7229bfaf -->
|
||||
<SessionCoordinator sessionInitialInactivityTimeout="1200" sessionInactivityTimeout="28800" sessionInitialMaxLifetime="1200" sessionMaxLifetime="28800" sessionIdPreGenerate="true">
|
||||
<!-- source: pattern://ac27dd7daad0ca2b7229bfaf -->
|
||||
<LocalSessionStore maxSessions="100000"/>
|
||||
<!-- source: pattern://ac27dd7daad0ca2b7229bfaf -->
|
||||
<TokenAssembler name="DefaultTokenAssembler">
|
||||
<Selector default="true"/>
|
||||
<!-- source: pattern://6df66943ca713eed2a25d935, pattern://6f9c9f982dcc7ef59a34f1f7, pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263, pattern://6df66943ca713eed2a25d935, pattern://6f9c9f982dcc7ef59a34f1f7, pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<TokenSpec ttl="28800">
|
||||
<!-- source: pattern://ac27dd7daad0ca2b7229bfaf -->
|
||||
<field src="session" key="ch.nevis.session.sessid" as="sessid"/>
|
||||
|
@ -79,6 +79,11 @@
|
|||
<!-- source: pattern://271d024334021208b71ac80a -->
|
||||
<KeyObject name="Signer_NEVIS_SecToken" certificate="/var/opt/keys/own/auth-sh4r3d-nevisidm-sectoken-signer/cert.pem" privateKey="/var/opt/keys/own/auth-sh4r3d-nevisidm-sectoken-signer/keystore.jks" passPhrase="pipe:///var/opt/keys/own/auth-sh4r3d-nevisidm-sectoken-signer/keypass"/>
|
||||
</KeyStore>
|
||||
<!-- source: pattern://6589067d403de8c65bcdcb16 -->
|
||||
<KeyStore name="AGOV_IDENT_KS">
|
||||
<!-- source: pattern://6589067d403de8c65bcdcb16 -->
|
||||
<KeyObject name="AGOV_IDENT_SIGNER" certificate="/var/opt/keys/own/agov-ident-signer-keystore/cert.pem" privateKey="/var/opt/keys/own/agov-ident-signer-keystore/keystore.jks" passPhrase="pipe:///var/opt/keys/own/agov-ident-signer-keystore/keypass"/>
|
||||
</KeyStore>
|
||||
<!-- source: pattern://7e94f2eb346f07f78440e884 -->
|
||||
<KeyStore name="Store_SAML_SP_nevisidm_admin_Realm">
|
||||
<!-- source: pattern://7e94f2eb346f07f78440e884 -->
|
||||
|
@ -96,8 +101,15 @@
|
|||
</SessionCoordinator>
|
||||
<!-- source: pattern://ac27dd7daad0ca2b7229bfaf -->
|
||||
<LocalOutOfContextDataStore reaperPeriod="60"/>
|
||||
<!-- source: pattern://2787b678d9cce5310a335419, pattern://fd3912c7af7a88b6342a4c78, pattern://12c979b6af0f15f1328656a4, pattern://24cbc652d3166c8374eda3cd, pattern://56955e7b6b92c254d7d1aae1, pattern://ac27dd7daad0ca2b7229bfaf, pattern://6df66943ca713eed2a25d935, pattern://6f9c9f982dcc7ef59a34f1f7, pattern://7518c6cc61e47eec6322ae17, pattern://ac27dd7daad0ca2b7229bfaf, pattern://ac27dd7daad0ca2b7229bfaf -->
|
||||
<!-- source: pattern://2787b678d9cce5310a335419, pattern://fd3912c7af7a88b6342a4c78, pattern://12c979b6af0f15f1328656a4, pattern://24cbc652d3166c8374eda3cd, pattern://56955e7b6b92c254d7d1aae1, pattern://ac27dd7daad0ca2b7229bfaf, pattern://6df66943ca713eed2a25d935, pattern://6f9c9f982dcc7ef59a34f1f7, pattern://7518c6cc61e47eec6322ae17, pattern://ac27dd7daad0ca2b7229bfaf, pattern://6df66943ca713eed2a25d935, pattern://ac27dd7daad0ca2b7229bfaf, pattern://ac27dd7daad0ca2b7229bfaf -->
|
||||
<AuthEngine useLiteralDictionary="true" literalDictionaryLanguages="en,de,fr,it" inputLanguageCookie="LANG" compatLevel="none" addAutheLevelToSecRoles="true" classPath="/opt/nevisidmcl/nevisauth/lib:/opt/nevisauth/plugin" propagateSession="false">
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<Domain name="IDENT-AuthenticationRealm" default="false" inactiveInterval="7200" reauthInterval="0" resetAuthenticationCondition="${inargs:cancel}">
|
||||
<Entry method="authenticate" state="IDENT-AuthenticationRealm_IDENT-Process-and-Dispatch"/>
|
||||
<Entry method="authenticate" state="IDENT-AuthenticationRealm_IDENT-Process-and-Dispatch" selector="${request:currentResource:^http[s]?\u003A//[^/]+/process/.*$:true}"/>
|
||||
<Entry method="stepup" state="IDENT-AuthenticationRealm_Selector"/>
|
||||
<Entry method="stepup" state="IDENT-AuthenticationRealm_IDENT-Process-and-Dispatch" selector="${request:currentResource:^http[s]?\u003A//[^/]+/process/.*$:true}"/>
|
||||
</Domain>
|
||||
<!-- source: pattern://6df66943ca713eed2a25d935 -->
|
||||
<Domain name="OP-ONBRDNG-AuthenticationRealm" default="false" inactiveInterval="1200" reauthInterval="0" resetAuthenticationCondition="${inargs:cancel}">
|
||||
<Entry method="authenticate" state="OP-ONBRDNG-AuthenticationRealm_OP-ONBRDNG-PreProcessing"/>
|
||||
|
@ -121,6 +133,475 @@
|
|||
<Entry method="stepup" state="SAML_SP_nevisidm_operations_Realm_NEVIS_SecToken" selector="${request:requiredRoles:^token.NEVIS_SecToken$:true}"/>
|
||||
<Entry method="unlock" state="SAML_SP_nevisidm_operations_Realm_Extract_Issuer"/>
|
||||
</Domain>
|
||||
<AuthState name="IDENT-AuthenticationRealm_IDENT-Process-and-Dispatch" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false" resumeState="true">
|
||||
<!-- source: pattern://0f6977caedca600b17221f0a -->
|
||||
<ResultCond name="inavlidurl" next="IDENT-AuthenticationRealm_IDENT-Failed"/>
|
||||
<!-- source: pattern://0f6977caedca600b17221f0a -->
|
||||
<ResultCond name="processResponse" next="IDENT-AuthenticationRealm_IDENT-SamlServiceProvider-ProcessResponse"/>
|
||||
<!-- source: pattern://0f6977caedca600b17221f0a -->
|
||||
<ResultCond name="sendAuthnRequest" next="IDENT-AuthenticationRealm_IDENT-SamlServiceProvider-AuthnRequest"/>
|
||||
<!-- source: pattern://0f6977caedca600b17221f0a -->
|
||||
<Response value="AUTH_ERROR"/>
|
||||
<!-- source: pattern://0f6977caedca600b17221f0a -->
|
||||
<property name="scriptTraceGroup" value="AGOVOP-IDENT"/>
|
||||
<!-- source: pattern://0f6977caedca600b17221f0a -->
|
||||
<property name="script" value="file:///var/opt/nevisauth/default/conf/IdentProcessAndDispatch.groovy"/>
|
||||
<!-- source: pattern://0f6977caedca600b17221f0a -->
|
||||
<property name="parameter.rpcode.list" value="${param.list"/>
|
||||
</AuthState>
|
||||
<AuthState name="IDENT-AuthenticationRealm_IDENT-Failed" class="ch.nevis.esauth.auth.states.standard.AuthError" final="true">
|
||||
<!-- source: pattern://026e4ae8ef4cc5496a7fe8c6 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://026e4ae8ef4cc5496a7fe8c6 -->
|
||||
<Gui name="IDENT-Failed" label="${notes:agov.ident.error.title.label}">
|
||||
<!-- source: pattern://026e4ae8ef4cc5496a7fe8c6 -->
|
||||
<GuiElem name="error" type="error" label="${notes:agov.ident.msg.label}"/>
|
||||
</Gui>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="IDENT-AuthenticationRealm_IDENT-SamlServiceProvider-ProcessResponse" class="ch.nevis.esauth.auth.states.saml.ServiceProviderState" final="false" resumeState="false">
|
||||
<!-- source: pattern://ac1151fe6a973b135fd4a460 -->
|
||||
<ResultCond name="ok" next="IDENT-AuthenticationRealm_IDENT-Succeeded"/>
|
||||
<!-- source: pattern://ac1151fe6a973b135fd4a460 -->
|
||||
<ResultCond name="status-Requester" next="IDENT-AuthenticationRealm_IDENT-Failed-WithRetry"/>
|
||||
<!-- source: pattern://ac1151fe6a973b135fd4a460 -->
|
||||
<ResultCond name="status-Responder" next="IDENT-AuthenticationRealm_IDENT-Failed-WithRetry"/>
|
||||
<!-- source: pattern://ac1151fe6a973b135fd4a460 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://ac1151fe6a973b135fd4a460 -->
|
||||
<Gui name="NoGui"/>
|
||||
</Response>
|
||||
<propertyRef name="SAML_SP_nevisidm_operations_Realm_SAML_IDP_op_Connector_Connector"/>
|
||||
<!-- source: pattern://ac1151fe6a973b135fd4a460 -->
|
||||
<property name="idpURL" value="https://trustbroker.agov-d.azure.adnovum.net/adfs/ls"/>
|
||||
<!-- source: pattern://ac1151fe6a973b135fd4a460 -->
|
||||
<property name="consumerURL" value="https://ident.agov-w.azure.adnovum.net/process"/>
|
||||
<!-- source: pattern://ac1151fe6a973b135fd4a460 -->
|
||||
<property name="relayState" value=""/>
|
||||
<!-- source: pattern://ac1151fe6a973b135fd4a460 -->
|
||||
<property name="out.binding" value="none"/>
|
||||
<!-- source: pattern://ac1151fe6a973b135fd4a460 -->
|
||||
<property name="in.binding" value="auto"/>
|
||||
<!-- source: pattern://ac1151fe6a973b135fd4a460 -->
|
||||
<property name="in.relayState" value=""/>
|
||||
<!-- source: pattern://ac1151fe6a973b135fd4a460 -->
|
||||
<property name="in.audienceRegex" value="${session:agov.ident.entityId}"/>
|
||||
<!-- source: pattern://ac1151fe6a973b135fd4a460 -->
|
||||
<property name="in.audience.checkrequired" value="true"/>
|
||||
<!-- source: pattern://ac1151fe6a973b135fd4a460 -->
|
||||
<property name="in.map_issuer_certificate" value="false"/>
|
||||
<!-- source: pattern://ac1151fe6a973b135fd4a460 -->
|
||||
<property name="in.verify" value="Response Assertion"/>
|
||||
</AuthState>
|
||||
<AuthState name="IDENT-AuthenticationRealm_IDENT-SamlServiceProvider-AuthnRequest" class="ch.nevis.esauth.auth.states.saml.AssertionRequestState" final="false" resumeState="false">
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<ResultCond name="default" next="IDENT-AuthenticationRealm_Authentication_Failed"/>
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<ResultCond name="ok" next="IDENT-AuthenticationRealm_Prepare_Done"/>
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<Gui name="NoGui"/>
|
||||
</Response>
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<property name="idpURL" value="https://trustbroker.agov-d.azure.adnovum.net/adfs/ls"/>
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<property name="consumerURL" value="https://ident.agov-w.azure.adnovum.net/process"/>
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<property name="out.binding" value="http-post"/>
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<property name="out.requestType" value="AuthnRequest"/>
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<property name="out.sign" value="AuthnRequest"/>
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<property name="out.signatureKeyInfo" value="Certificate"/>
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<property name="out.keystoreref" value="AGOV_IDENT_KS"/>
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<property name="out.keyobjectref" value="AGOV_IDENT_SIGNER"/>
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<property name="out.issuer" value="${sess:agov.ident.entityId}"/>
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<property name="request.ttl" value="60"/>
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<property name="relayState" value="${sess:agov.ident.rpcode}"/>
|
||||
</AuthState>
|
||||
<AuthState name="IDENT-AuthenticationRealm_IDENT-Succeeded" class="ch.nevis.esauth.auth.states.standard.AuthError" final="true">
|
||||
<!-- source: pattern://5f2cdff72cb899bff468ad90 -->
|
||||
<Response value="AUTH_CONTINUE">
|
||||
<!-- source: pattern://5f2cdff72cb899bff468ad90 -->
|
||||
<Gui name="IDENT-Succeeded" label="agov.ident.succeeded.title">
|
||||
<!-- source: pattern://5f2cdff72cb899bff468ad90 -->
|
||||
<GuiElem name="info" type="info" label="agov.ident.succeeded.msg"/>
|
||||
</Gui>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="IDENT-AuthenticationRealm_IDENT-Failed-WithRetry" class="ch.nevis.esauth.auth.states.standard.AuthError" final="true">
|
||||
<!-- source: pattern://ea2c110e0adfa95722c2cc99 -->
|
||||
<ResultCond name="continue" next="IDENT-AuthenticationRealm_IDENT-Process-and-Dispatch"/>
|
||||
<!-- source: pattern://ea2c110e0adfa95722c2cc99 -->
|
||||
<Response value="AUTH_CONTINUE">
|
||||
<!-- source: pattern://ea2c110e0adfa95722c2cc99 -->
|
||||
<Gui name="IDENT-Failed-WithRetry" label="${notes:agov.ident.error.title.label}">
|
||||
<!-- source: pattern://ea2c110e0adfa95722c2cc99 -->
|
||||
<GuiElem name="error" type="error" label="${notes:agov.ident.msg.label}"/>
|
||||
<!-- source: pattern://ea2c110e0adfa95722c2cc99 -->
|
||||
<GuiElem name="continue" type="button" label="continue.button.label" value="true"/>
|
||||
</Gui>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_SAML_IDP_op_Connector_Connector" class="ch.nevis.esauth.auth.states.saml.ServiceProviderState" final="false" resumeState="true">
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<ResultCond name="LogoutFailed" next="SAML_SP_nevisidm_operations_Realm_Logout_Fail"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<ResultCond name="logout" next="SAML_SP_nevisidm_operations_Realm_Logout_Done"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<ResultCond name="logoutCompleted" next="SAML_SP_nevisidm_operations_Realm_Logout_Redirect"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<ResultCond name="ok" next="SAML_SP_nevisidm_operations_Realm_Restore_Level"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<Arg name="ch.nevis.isiweb4.response.status" value="403"/>
|
||||
</Response>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="idpURL" value="https://trustbroker.agov-d.azure.adnovum.net/adfs/ls"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="in.binding" value="auto"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="in.map_issuer_certificate" value="true"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="in.verify" value="Response Assertion"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="in.max_age" value="60"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="in.audienceRegex" value="^https://op.agov-w.azure.adnovum.net/SAML2/ACS/.*$"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="in.tolerance" value="5"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="out.binding" value="http-post"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="out.ttl" value="60"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="out.signatureKeyInfo" value="Certificate"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="relayState" value="#{inargs.containsKey('RelayState') ? inargs.get('RelayState') : request['currentResource']}"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="logoutType" value="NONE"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="out.sign" value="AuthnRequest,LogoutRequest"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<property name="out.authnContextClassRef" value="urn:qa.agov.ch:names:tc:ac:classes:100"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<property name="consumerURL" value="${request:currentResource:(http.?.//[^/]+)/.*:$1/SAML2/ACS/}"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<property name="out.issuer" value="https://op.agov-w.azure.adnovum.net/SAML2/ACS/"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<property name="in.keystoreref" value="Store_SAML_SP_nevisidm_operations_Realm"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<property name="out.keystoreref" value="Store_SAML_SP_nevisidm_operations_Realm"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<property name="out.keyobjectref" value="Signer_SAML_SP_nevisidm_operations_Realm"/>
|
||||
</AuthState>
|
||||
<AuthState name="IDENT-AuthenticationRealm_Authentication_Failed" class="ch.nevis.esauth.auth.states.standard.AuthError" final="false">
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<Gui name="Error">
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<GuiElem name="info" type="error" label="error_99"/>
|
||||
<!-- source: pattern://dce20cc904f88df4b77f93d9 -->
|
||||
<GuiElem name="submit" type="button" label="continue.button.label"/>
|
||||
</Gui>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="IDENT-AuthenticationRealm_Prepare_Done" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false">
|
||||
<!-- source: pattern://026e4ae8ef4cc5496a7fe8c6, pattern://dce20cc904f88df4b77f93d9, pattern://5f2cdff72cb899bff468ad90, pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<ResultCond name="default" next="IDENT-AuthenticationRealm_Auth_Done"/>
|
||||
<!-- source: pattern://026e4ae8ef4cc5496a7fe8c6, pattern://dce20cc904f88df4b77f93d9, pattern://5f2cdff72cb899bff468ad90, pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<Response value="AUTH_DONE">
|
||||
<!-- source: pattern://026e4ae8ef4cc5496a7fe8c6, pattern://dce20cc904f88df4b77f93d9, pattern://5f2cdff72cb899bff468ad90, pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<Gui name="ContinueResponse"/>
|
||||
</Response>
|
||||
<!-- source: pattern://026e4ae8ef4cc5496a7fe8c6, pattern://dce20cc904f88df4b77f93d9, pattern://5f2cdff72cb899bff468ad90, pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<property name="script" value="file:///var/opt/nevisauth/default/conf/prepare_done.groovy"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_Logout_Fail" class="ch.nevis.esauth.auth.states.standard.AuthGeneric" final="true">
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<Gui name="empty"/>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_Logout_Done" class="ch.nevis.esauth.auth.states.standard.AuthDone" final="false">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Gui name="ContinueResponse"/>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_Logout_Redirect" class="ch.nevis.esauth.auth.states.standard.AuthGeneric" final="true">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Gui name="AuthDoneDialog">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<GuiElem name="lasterror" type="error" label="${notes:lasterrorinfo}" value="${notes:lasterror}"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<GuiElem name="continue" type="button" label="continue.button.label" value="true"/>
|
||||
</Gui>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Arg name="nevis.transfer.type" value="redirect"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Arg name="nevis.transfer.destination" value="/loggedout"/>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_Restore_Level" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<ResultCond name="ok" next="SAML_SP_nevisidm_operations_Realm_set_userExtId_Groovy_Script_Step"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Arg name="ch.nevis.isiweb4.response.status" value="403"/>
|
||||
</Response>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<property name="script" value="file:///var/opt/nevisauth/default/conf/saml_sp_level.groovy"/>
|
||||
</AuthState>
|
||||
<AuthState name="IDENT-AuthenticationRealm_Auth_Done" class="ch.nevis.esauth.auth.states.standard.AuthDone" final="false">
|
||||
<!-- source: pattern://026e4ae8ef4cc5496a7fe8c6, pattern://dce20cc904f88df4b77f93d9, pattern://5f2cdff72cb899bff468ad90, pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<Response value="AUTH_DONE">
|
||||
<!-- source: pattern://026e4ae8ef4cc5496a7fe8c6, pattern://dce20cc904f88df4b77f93d9, pattern://5f2cdff72cb899bff468ad90, pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<Gui name="ContinueResponse"/>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_set_userExtId_Groovy_Script_Step" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false">
|
||||
<!-- source: pattern://488949a743edb1f46f73f232 -->
|
||||
<ResultCond name="error" next="SAML_SP_nevisidm_operations_Realm_Authentication_Failed"/>
|
||||
<!-- source: pattern://488949a743edb1f46f73f232 -->
|
||||
<ResultCond name="ok" next="SAML_SP_nevisidm_operations_Realm_fetch_User_Authentication_Step"/>
|
||||
<!-- source: pattern://488949a743edb1f46f73f232 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://488949a743edb1f46f73f232 -->
|
||||
<Arg name="ch.nevis.isiweb4.response.status" value="403"/>
|
||||
</Response>
|
||||
<!-- source: pattern://488949a743edb1f46f73f232 -->
|
||||
<property name="script" value="file:///var/opt/nevisauth/default/conf/set_userextid_groovy_script_step.groovy"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_Authentication_Failed" class="ch.nevis.esauth.auth.states.standard.AuthError" final="false">
|
||||
<!-- source: pattern://700ec185425d8645fea2caf5 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://700ec185425d8645fea2caf5 -->
|
||||
<Gui name="Error">
|
||||
<!-- source: pattern://700ec185425d8645fea2caf5 -->
|
||||
<GuiElem name="info" type="error" label="error_99"/>
|
||||
<!-- source: pattern://700ec185425d8645fea2caf5 -->
|
||||
<GuiElem name="submit" type="button" label="continue.button.label"/>
|
||||
</Gui>
|
||||
<!-- source: pattern://700ec185425d8645fea2caf5 -->
|
||||
<Arg name="ch.nevis.isiweb4.response.status" value="403"/>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_fetch_User_Authentication_Step" class="ch.nevis.idm.authstate.IdmUserVerifyState" final="false" resumeState="true">
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="clientNotFound" next="SAML_SP_nevisidm_operations_Realm_Authentication_Failed"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="failed" next="SAML_SP_nevisidm_operations_Realm_Authentication_Failed"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="prospect" next="SAML_SP_nevisidm_operations_Realm_fetch_User_Authentication_Step_selectProfile"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<Gui name="AuthFailDialog"/>
|
||||
</Response>
|
||||
<propertyRef name="nevisIDM_Connector"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="user.loginid" value="unknown"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="userExtId" value="${sess:operationsExtId}"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="client.name" value="OPERATIONS"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.user" value="HIGH"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.profile" value="HIGH"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.role" value="HIGH"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.authorization" value="HIGH"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.dataroom" value="HIGH"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_fetch_User_Authentication_Step_selectProfile" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false" resumeState="true">
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="error" next="SAML_SP_nevisidm_operations_Realm_Authentication_Failed"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="ok" next="SAML_SP_nevisidm_operations_Realm_fetch_User_Authentication_Step_IdmGetPropertiesState"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<Response value="AUTH_CONTINUE">
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<Gui name="op_idmlogin_select_profile">
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<GuiElem name="lasterror" type="error" label="${notes:lasterrorinfo}" value="${notes:lasterror}" optional="true"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<GuiElem name="submit" type="button" label="submit.button.label" value="go"/>
|
||||
</Gui>
|
||||
</Response>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="script" value="file:///var/opt/nevisauth/default/conf/selectIdmProfile.groovy"/>
|
||||
</AuthState>
|
||||
<AuthState name="nevisIDM_Connector" class="ch.nevis.esauth.auth.states.standard.AuthGeneric" final="false">
|
||||
<!-- source: pattern://12c979b6af0f15f1328656a4 -->
|
||||
<property name="login.service.connection.0" value="https://idm:8989/nevisidm/services/v1/LoginService"/>
|
||||
<!-- source: pattern://12c979b6af0f15f1328656a4 -->
|
||||
<property name="admin.service.connection.0" value="https://idm:8989/nevisidm/services/v1/AdminService"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_fetch_User_Authentication_Step_IdmGetPropertiesState" class="ch.nevis.idm.authstate.IdmGetPropertiesState" final="false" resumeState="true">
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="clientNotFound" next="SAML_SP_nevisidm_operations_Realm_Authentication_Failed"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="default" next="SAML_SP_nevisidm_operations_Realm_Authentication_Failed"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="ok" next="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="showGui" next="SAML_SP_nevisidm_operations_Realm_Authentication_Failed"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<Response value="AUTH_ERROR"/>
|
||||
<propertyRef name="nevisIDM_Connector"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="user.attributes" value="loginId,extId,firstName,name,email,language"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="chooseProfileFromSession" value="operationsProfileExtId"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="userExtId" value="${sess:operationsExtId}"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="client.name" value="OPERATIONS"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.user" value="HIGH"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.profile" value="HIGH"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.role" value="HIGH"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.authorization" value="HIGH"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.dataroom" value="HIGH"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded" class="ch.nevis.esauth.auth.states.standard.ConditionalDispatcherState" final="false" resumeState="false">
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="default" next="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_Update"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="emailaddressDidntChange,givennameDidntChange,surnameDidntChange,languageDidntChange" next="SAML_SP_nevisidm_operations_Realm_Prepare_Done"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<Response value="AUTH_ERROR"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="condition:emailaddressDidntChange" value="#{ !sess.containsKey('idp.email') or sess.get('idp.email').equals(sess.get('ch.nevis.idm.User.email')) }"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="condition:givennameDidntChange" value="#{ !sess.containsKey('idp.firstName') or sess.get('idp.firstName').equals(sess.get('ch.nevis.idm.User.firstName')) }"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="condition:surnameDidntChange" value="#{ !sess.containsKey('idp.lastName') or sess.get('idp.lastName').equals(sess.get('ch.nevis.idm.User.lastName')) }"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="condition:languageDidntChange" value="#{ !sess.containsKey('idp.language') or sess.get('idp.language').equals(sess.get('ch.nevis.idm.User.language')) }"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_Update" class="ch.nevis.idm.authstate.IdmSetPropertiesState" final="false" resumeState="false">
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="emailExists" next="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_AuditError"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="inputInvalid" next="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_AuditError"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="inputMissing" next="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_AuditError"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="loginIdExists" next="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_AuditError"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="ok" next="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_AuditUpdate"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="userIdExists" next="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_AuditError"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<Arg name="ch.nevis.isiweb4.response.status" value="403"/>
|
||||
</Response>
|
||||
<propertyRef name="nevisIDM_Connector"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.loginid" value="${sess:ch.adnovum.nevisidm.user.loginId}"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="client.name" value="${sess:ch.adnovum.nevisidm.clientName}"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.attributes.optional" value="email,firstName,name,language"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.attributes.mandatory" value="remarks"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.attribute.email" value="${notes|saml.attributes.http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress}"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.attribute.firstName" value="${notes|saml.attributes.http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname}"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.attribute.name" value="${notes|saml.attributes.http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname}"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.attribute.language" value="${notes|saml.attributes.http://schemas.agov.ch/ws/2023/05/identity/claims/languageOfCorrespondance}"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.attribute.remarks" value="Updated based on assertion '${sess:ch.nevis.auth.saml.assertion.id}' (Request-ID: ${inctx:connection.HttpHeader.X-Request-ID})"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.attributes.overwrite" value="email,firstName,name,language,remarks"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="allowInvalidUserEmails" value="true"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_Prepare_Done" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17, pattern://271d024334021208b71ac80a -->
|
||||
<ResultCond name="default" next="SAML_SP_nevisidm_operations_Realm_Redirect_RelayState"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17, pattern://271d024334021208b71ac80a -->
|
||||
<Response value="AUTH_DONE">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17, pattern://271d024334021208b71ac80a -->
|
||||
<Gui name="ContinueResponse"/>
|
||||
</Response>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17, pattern://271d024334021208b71ac80a -->
|
||||
<property name="script" value="file:///var/opt/nevisauth/default/conf/prepare_done.groovy"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_AuditError" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false" resumeState="false">
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<Arg name="ch.nevis.isiweb4.response.status" value="403"/>
|
||||
</Response>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="scriptTraceGroup" value="AGOVOP-ACCT"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="script" value=" def user = session['ch.adnovum.nevisidm.user.extId'] ?: 'unknown'; def sourceIp = request.getLoginContext()['connection.HttpHeader.X-Real-IP'] ?: 'unknown'; def userAgent = request.getLoginContext()['connection.HttpHeader.user-agent'] ?: request.getLoginContext()['connection.HttpHeader.User-Agent'] ?: 'unknown'; LOG.error("Event='USERUPDATE', User=${user}, SourceIp=${sourceIp}, UserAgent='${userAgent}', error='failed to update user in IDM', lasterrorinfo='${lasterrorinfo}'"); response.setStatus(ch.nevis.esauth.auth.engine.AuthResponse.AUTH_ERROR); "/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_AuditUpdate" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false" resumeState="false">
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="default" next="SAML_SP_nevisidm_operations_Realm_Prepare_Done"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<Response value="AUTH_CONTINUE"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="scriptTraceGroup" value="AGOVOP-ACCT"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="script" value=" def user = session['ch.adnovum.nevisidm.user.extId'] ?: 'unknown'; def sourceIp = request.getLoginContext()['connection.HttpHeader.X-Real-IP'] ?: 'unknown'; def userAgent = request.getLoginContext()['connection.HttpHeader.user-agent'] ?: request.getLoginContext()['connection.HttpHeader.User-Agent'] ?: 'unknown'; LOG.info("Event='USERUPDATE', User=${user}, SourceIp=${sourceIp}, UserAgent='${userAgent}'"); "/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_Redirect_RelayState" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false">
|
||||
<ResultCond name="default" next="SAML_SP_nevisidm_operations_Realm_Auth_Done"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Response value="AUTH_DONE">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Gui name="ContinueResponse"/>
|
||||
</Response>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<property name="script" value="file:///var/opt/nevisauth/default/conf/redirect_relay_state.groovy"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_Auth_Done" class="ch.nevis.esauth.auth.states.standard.AuthDone" final="false">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17, pattern://271d024334021208b71ac80a -->
|
||||
<Response value="AUTH_DONE">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17, pattern://271d024334021208b71ac80a -->
|
||||
<Gui name="ContinueResponse"/>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="IDENT-AuthenticationRealm_Selector" class="ch.nevis.esauth.auth.states.standard.ConditionalDispatcherState" final="false">
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<ResultCond name="nomatch" next="IDENT-AuthenticationRealm_Prepare_Done"/>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<Arg name="ch.nevis.isiweb4.response.status" value="403"/>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="OP-ONBRDNG-AuthenticationRealm_OP-ONBRDNG-PreProcessing" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false" resumeState="true">
|
||||
<!-- source: pattern://2787b678d9cce5310a335419 -->
|
||||
<ResultCond name="processResponse" next="OP-ONBRDNG-AuthenticationRealm_OP-ONBRDNG-SamlServiceProvider-ProcessResponse"/>
|
||||
|
@ -261,59 +742,6 @@
|
|||
<!-- source: pattern://fd3912c7af7a88b6342a4c78 -->
|
||||
<property name="script" value="file:///var/opt/nevisauth/default/conf/OpOnbrdng-PostProcessing.groovy"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_SAML_IDP_op_Connector_Connector" class="ch.nevis.esauth.auth.states.saml.ServiceProviderState" final="false" resumeState="true">
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<ResultCond name="LogoutFailed" next="SAML_SP_nevisidm_operations_Realm_Logout_Fail"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<ResultCond name="logout" next="SAML_SP_nevisidm_operations_Realm_Logout_Done"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<ResultCond name="logoutCompleted" next="SAML_SP_nevisidm_operations_Realm_Logout_Redirect"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<ResultCond name="ok" next="SAML_SP_nevisidm_operations_Realm_Restore_Level"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<Arg name="ch.nevis.isiweb4.response.status" value="403"/>
|
||||
</Response>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="idpURL" value="https://trustbroker.agov-d.azure.adnovum.net/adfs/ls"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="in.binding" value="auto"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="in.map_issuer_certificate" value="true"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="in.verify" value="Response Assertion"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="in.max_age" value="60"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="in.audienceRegex" value="^https://op.agov-w.azure.adnovum.net/SAML2/ACS/.*$"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="in.tolerance" value="5"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="out.binding" value="http-post"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="out.ttl" value="60"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="out.signatureKeyInfo" value="Certificate"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="relayState" value="#{inargs.containsKey('RelayState') ? inargs.get('RelayState') : request['currentResource']}"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="logoutType" value="NONE"/>
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<property name="out.sign" value="AuthnRequest,LogoutRequest"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<property name="out.authnContextClassRef" value="urn:qa.agov.ch:names:tc:ac:classes:100"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<property name="consumerURL" value="${request:currentResource:(http.?.//[^/]+)/.*:$1/SAML2/ACS/}"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<property name="out.issuer" value="https://op.agov-w.azure.adnovum.net/SAML2/ACS/"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<property name="in.keystoreref" value="Store_SAML_SP_nevisidm_operations_Realm"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<property name="out.keystoreref" value="Store_SAML_SP_nevisidm_operations_Realm"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<property name="out.keyobjectref" value="Signer_SAML_SP_nevisidm_operations_Realm"/>
|
||||
</AuthState>
|
||||
<AuthState name="OP-ONBRDNG-AuthenticationRealm_OP-ONBRDNG-PreProcessing_VerifyURLTicket_Failed" class="ch.nevis.esauth.auth.states.standard.TransformAttributes" final="false" resumeState="false">
|
||||
<!-- source: pattern://2787b678d9cce5310a335419 -->
|
||||
<ResultCond name="default" next="OP-ONBRDNG-AuthenticationRealm_OP-ONBRDNG-PreProcessing"/>
|
||||
|
@ -367,12 +795,6 @@
|
|||
<!-- source: pattern://2787b678d9cce5310a335419 -->
|
||||
<property name="user.cred.saml_federation3.subjectNameId" value="true"/>
|
||||
</AuthState>
|
||||
<AuthState name="nevisIDM_Connector" class="ch.nevis.esauth.auth.states.standard.AuthGeneric" final="false">
|
||||
<!-- source: pattern://12c979b6af0f15f1328656a4 -->
|
||||
<property name="login.service.connection.0" value="https://idm:8989/nevisidm/services/v1/LoginService"/>
|
||||
<!-- source: pattern://12c979b6af0f15f1328656a4 -->
|
||||
<property name="admin.service.connection.0" value="https://idm:8989/nevisidm/services/v1/AdminService"/>
|
||||
</AuthState>
|
||||
<AuthState name="OP-ONBRDNG-AuthenticationRealm_OP-ONBRDNG-PostProcessing_SamlFedCredential" class="ch.nevis.idm.authstate.IdmCreateCredentialState" final="false" resumeState="false">
|
||||
<!-- source: pattern://fd3912c7af7a88b6342a4c78 -->
|
||||
<ResultCond name="credentialExists" next="OP-ONBRDNG-AuthenticationRealm_OP-ONBRDNG-PostProcessing_SamlFedCredential_Failed"/>
|
||||
|
@ -415,47 +837,6 @@
|
|||
</Gui>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_Logout_Fail" class="ch.nevis.esauth.auth.states.standard.AuthGeneric" final="true">
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://36af90d50b0d6ba66136dbde -->
|
||||
<Gui name="empty"/>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_Logout_Done" class="ch.nevis.esauth.auth.states.standard.AuthDone" final="false">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Gui name="ContinueResponse"/>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_Logout_Redirect" class="ch.nevis.esauth.auth.states.standard.AuthGeneric" final="true">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Gui name="AuthDoneDialog">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<GuiElem name="lasterror" type="error" label="${notes:lasterrorinfo}" value="${notes:lasterror}"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<GuiElem name="continue" type="button" label="continue.button.label" value="true"/>
|
||||
</Gui>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Arg name="nevis.transfer.type" value="redirect"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Arg name="nevis.transfer.destination" value="/loggedout"/>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_Restore_Level" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<ResultCond name="ok" next="SAML_SP_nevisidm_operations_Realm_set_userExtId_Groovy_Script_Step"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Arg name="ch.nevis.isiweb4.response.status" value="403"/>
|
||||
</Response>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<property name="script" value="file:///var/opt/nevisauth/default/conf/saml_sp_level.groovy"/>
|
||||
</AuthState>
|
||||
<AuthState name="OP-ONBRDNG-AuthenticationRealm_OP-ONBRDNG-PreProcessing_IdmPostProcessing_Failed" class="ch.nevis.esauth.auth.states.standard.TransformAttributes" final="false" resumeState="false">
|
||||
<!-- source: pattern://2787b678d9cce5310a335419 -->
|
||||
<ResultCond name="default" next="OP-ONBRDNG-AuthenticationRealm_OP-ONBRDNG-PreProcessing"/>
|
||||
|
@ -482,219 +863,6 @@
|
|||
<!-- source: pattern://fd3912c7af7a88b6342a4c78 -->
|
||||
<property name="notes:lasterrorinfo" value="Problem with creation of SamlFed credential: ${notes:lasttransition} - ${notes:lasterrorinfo}"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_set_userExtId_Groovy_Script_Step" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false">
|
||||
<!-- source: pattern://488949a743edb1f46f73f232 -->
|
||||
<ResultCond name="error" next="SAML_SP_nevisidm_operations_Realm_Authentication_Failed"/>
|
||||
<!-- source: pattern://488949a743edb1f46f73f232 -->
|
||||
<ResultCond name="ok" next="SAML_SP_nevisidm_operations_Realm_fetch_User_Authentication_Step"/>
|
||||
<!-- source: pattern://488949a743edb1f46f73f232 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://488949a743edb1f46f73f232 -->
|
||||
<Arg name="ch.nevis.isiweb4.response.status" value="403"/>
|
||||
</Response>
|
||||
<!-- source: pattern://488949a743edb1f46f73f232 -->
|
||||
<property name="script" value="file:///var/opt/nevisauth/default/conf/set_userextid_groovy_script_step.groovy"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_Authentication_Failed" class="ch.nevis.esauth.auth.states.standard.AuthError" final="false">
|
||||
<!-- source: pattern://700ec185425d8645fea2caf5 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://700ec185425d8645fea2caf5 -->
|
||||
<Gui name="Error">
|
||||
<!-- source: pattern://700ec185425d8645fea2caf5 -->
|
||||
<GuiElem name="info" type="error" label="error_99"/>
|
||||
<!-- source: pattern://700ec185425d8645fea2caf5 -->
|
||||
<GuiElem name="submit" type="button" label="continue.button.label"/>
|
||||
</Gui>
|
||||
<!-- source: pattern://700ec185425d8645fea2caf5 -->
|
||||
<Arg name="ch.nevis.isiweb4.response.status" value="403"/>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_fetch_User_Authentication_Step" class="ch.nevis.idm.authstate.IdmUserVerifyState" final="false" resumeState="true">
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="clientNotFound" next="SAML_SP_nevisidm_operations_Realm_Authentication_Failed"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="failed" next="SAML_SP_nevisidm_operations_Realm_Authentication_Failed"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="prospect" next="SAML_SP_nevisidm_operations_Realm_fetch_User_Authentication_Step_selectProfile"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<Gui name="AuthFailDialog"/>
|
||||
</Response>
|
||||
<propertyRef name="nevisIDM_Connector"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="user.loginid" value="unknown"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="userExtId" value="${sess:operationsExtId}"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="client.name" value="OPERATIONS"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.user" value="HIGH"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.profile" value="HIGH"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.role" value="HIGH"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.authorization" value="HIGH"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.dataroom" value="HIGH"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_fetch_User_Authentication_Step_selectProfile" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false" resumeState="true">
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="error" next="SAML_SP_nevisidm_operations_Realm_Authentication_Failed"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="ok" next="SAML_SP_nevisidm_operations_Realm_fetch_User_Authentication_Step_IdmGetPropertiesState"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<Response value="AUTH_CONTINUE">
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<Gui name="op_idmlogin_select_profile">
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<GuiElem name="lasterror" type="error" label="${notes:lasterrorinfo}" value="${notes:lasterror}" optional="true"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<GuiElem name="submit" type="button" label="submit.button.label" value="go"/>
|
||||
</Gui>
|
||||
</Response>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="script" value="file:///var/opt/nevisauth/default/conf/selectIdmProfile.groovy"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_fetch_User_Authentication_Step_IdmGetPropertiesState" class="ch.nevis.idm.authstate.IdmGetPropertiesState" final="false" resumeState="true">
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="clientNotFound" next="SAML_SP_nevisidm_operations_Realm_Authentication_Failed"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="default" next="SAML_SP_nevisidm_operations_Realm_Authentication_Failed"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="ok" next="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<ResultCond name="showGui" next="SAML_SP_nevisidm_operations_Realm_Authentication_Failed"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<Response value="AUTH_ERROR"/>
|
||||
<propertyRef name="nevisIDM_Connector"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="user.attributes" value="loginId,extId,firstName,name,email,language"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="chooseProfileFromSession" value="operationsProfileExtId"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="userExtId" value="${sess:operationsExtId}"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="client.name" value="OPERATIONS"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.user" value="HIGH"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.profile" value="HIGH"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.role" value="HIGH"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.authorization" value="HIGH"/>
|
||||
<!-- source: pattern://56955e7b6b92c254d7d1aae1 -->
|
||||
<property name="detaillevel.dataroom" value="HIGH"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded" class="ch.nevis.esauth.auth.states.standard.ConditionalDispatcherState" final="false" resumeState="false">
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="default" next="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_Update"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="emailaddressDidntChange,givennameDidntChange,surnameDidntChange,languageDidntChange" next="SAML_SP_nevisidm_operations_Realm_Prepare_Done"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<Response value="AUTH_ERROR"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="condition:emailaddressDidntChange" value="#{ !sess.containsKey('idp.email') or sess.get('idp.email').equals(sess.get('ch.nevis.idm.User.email')) }"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="condition:givennameDidntChange" value="#{ !sess.containsKey('idp.firstName') or sess.get('idp.firstName').equals(sess.get('ch.nevis.idm.User.firstName')) }"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="condition:surnameDidntChange" value="#{ !sess.containsKey('idp.lastName') or sess.get('idp.lastName').equals(sess.get('ch.nevis.idm.User.lastName')) }"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="condition:languageDidntChange" value="#{ !sess.containsKey('idp.language') or sess.get('idp.language').equals(sess.get('ch.nevis.idm.User.language')) }"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_Update" class="ch.nevis.idm.authstate.IdmSetPropertiesState" final="false" resumeState="false">
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="emailExists" next="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_AuditError"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="inputInvalid" next="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_AuditError"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="inputMissing" next="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_AuditError"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="loginIdExists" next="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_AuditError"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="ok" next="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_AuditUpdate"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="userIdExists" next="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_AuditError"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<Arg name="ch.nevis.isiweb4.response.status" value="403"/>
|
||||
</Response>
|
||||
<propertyRef name="nevisIDM_Connector"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.loginid" value="${sess:ch.adnovum.nevisidm.user.loginId}"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="client.name" value="${sess:ch.adnovum.nevisidm.clientName}"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.attributes.optional" value="email,firstName,name,language"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.attributes.mandatory" value="remarks"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.attribute.email" value="${notes|saml.attributes.http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress}"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.attribute.firstName" value="${notes|saml.attributes.http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname}"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.attribute.name" value="${notes|saml.attributes.http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname}"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.attribute.language" value="${notes|saml.attributes.http://schemas.agov.ch/ws/2023/05/identity/claims/languageOfCorrespondance}"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.attribute.remarks" value="Updated based on assertion '${sess:ch.nevis.auth.saml.assertion.id}' (Request-ID: ${inctx:connection.HttpHeader.X-Request-ID})"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="user.attributes.overwrite" value="email,firstName,name,language,remarks"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="allowInvalidUserEmails" value="true"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_Prepare_Done" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17, pattern://271d024334021208b71ac80a -->
|
||||
<ResultCond name="default" next="SAML_SP_nevisidm_operations_Realm_Redirect_RelayState"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17, pattern://271d024334021208b71ac80a -->
|
||||
<Response value="AUTH_DONE">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17, pattern://271d024334021208b71ac80a -->
|
||||
<Gui name="ContinueResponse"/>
|
||||
</Response>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17, pattern://271d024334021208b71ac80a -->
|
||||
<property name="script" value="file:///var/opt/nevisauth/default/conf/prepare_done.groovy"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_AuditError" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false" resumeState="false">
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<Response value="AUTH_ERROR">
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<Arg name="ch.nevis.isiweb4.response.status" value="403"/>
|
||||
</Response>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="scriptTraceGroup" value="AGOVOP-ACCT"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="script" value=" def user = session['ch.adnovum.nevisidm.user.extId'] ?: 'unknown'; def sourceIp = request.getLoginContext()['connection.HttpHeader.X-Real-IP'] ?: 'unknown'; def userAgent = request.getLoginContext()['connection.HttpHeader.user-agent'] ?: request.getLoginContext()['connection.HttpHeader.User-Agent'] ?: 'unknown'; LOG.error("Event='USERUPDATE', User=${user}, SourceIp=${sourceIp}, UserAgent='${userAgent}', error='failed to update user in IDM', lasterrorinfo='${lasterrorinfo}'"); response.setStatus(ch.nevis.esauth.auth.engine.AuthResponse.AUTH_ERROR); "/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_UpdateUserIfNeeded_AuditUpdate" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false" resumeState="false">
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<ResultCond name="default" next="SAML_SP_nevisidm_operations_Realm_Prepare_Done"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<Response value="AUTH_CONTINUE"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="scriptTraceGroup" value="AGOVOP-ACCT"/>
|
||||
<!-- source: pattern://24cbc652d3166c8374eda3cd -->
|
||||
<property name="script" value=" def user = session['ch.adnovum.nevisidm.user.extId'] ?: 'unknown'; def sourceIp = request.getLoginContext()['connection.HttpHeader.X-Real-IP'] ?: 'unknown'; def userAgent = request.getLoginContext()['connection.HttpHeader.user-agent'] ?: request.getLoginContext()['connection.HttpHeader.User-Agent'] ?: 'unknown'; LOG.info("Event='USERUPDATE', User=${user}, SourceIp=${sourceIp}, UserAgent='${userAgent}'"); "/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_Redirect_RelayState" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false">
|
||||
<ResultCond name="default" next="SAML_SP_nevisidm_operations_Realm_Auth_Done"/>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Response value="AUTH_DONE">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<Gui name="ContinueResponse"/>
|
||||
</Response>
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17 -->
|
||||
<property name="script" value="file:///var/opt/nevisauth/default/conf/redirect_relay_state.groovy"/>
|
||||
</AuthState>
|
||||
<AuthState name="SAML_SP_nevisidm_operations_Realm_Auth_Done" class="ch.nevis.esauth.auth.states.standard.AuthDone" final="false">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17, pattern://271d024334021208b71ac80a -->
|
||||
<Response value="AUTH_DONE">
|
||||
<!-- source: pattern://7518c6cc61e47eec6322ae17, pattern://271d024334021208b71ac80a -->
|
||||
<Gui name="ContinueResponse"/>
|
||||
</Response>
|
||||
</AuthState>
|
||||
<AuthState name="OP-ONBRDNG-AuthenticationRealm_Selector" class="ch.nevis.esauth.auth.states.standard.ConditionalDispatcherState" final="false">
|
||||
<!-- source: pattern://6df66943ca713eed2a25d935 -->
|
||||
<ResultCond name="nomatch" next="OP-ONBRDNG-AuthenticationRealm_Prepare_Done"/>
|
||||
|
|
|
@ -24,6 +24,8 @@ Configuration:
|
|||
level: "FATAL"
|
||||
- name: "AGOVOP-ACCT"
|
||||
level: "INFO"
|
||||
- name: "AGOVOP-IDENT"
|
||||
level: "INFO"
|
||||
- name: "AuthEngine"
|
||||
level: "INFO"
|
||||
- name: "AuthPerf"
|
||||
|
|
|
@ -44,7 +44,7 @@ spec:
|
|||
podDisruptionBudget:
|
||||
maxUnavailable: "50%"
|
||||
git:
|
||||
tag: "r-de679db35a5049f78feb4eca1e828eb6997985b5"
|
||||
tag: "r-030a0c32f7aa373371615e3c88c1e7e33eccfd82"
|
||||
dir: "DEFAULT-ADN-AGOV-ADMIN-PROJECT/DEFAULT-ADN-AGOV-ADMIN-INV/logrend"
|
||||
credentials: "git-credentials"
|
||||
podSecurity:
|
||||
|
|
|
@ -10,7 +10,7 @@ application.language.cookie.en=LANG:en:.agov-w.azure.adnovum.net
|
|||
application.language.cookie.fr=LANG:fr:.agov-w.azure.adnovum.net
|
||||
application.language.cookie.it=LANG:it:.agov-w.azure.adnovum.net
|
||||
application.loginapp.current=
|
||||
application.loginapp.default=OP-ONBRDNG-AuthenticationRealm
|
||||
application.loginapp.default=IDENT-AuthenticationRealm
|
||||
application.loginapp.override=header:channel
|
||||
application.package.name=nevislogrend
|
||||
application.render.content.type=text/html; charset=UTF-8
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
# source: pattern://3fd09bb6cfbd34874595c263
|
||||
application.countries.default=CH
|
||||
# source: pattern://3fd09bb6cfbd34874595c263
|
||||
cache.file.exempt=
|
||||
# source: pattern://3fd09bb6cfbd34874595c263
|
||||
cache.filefolder.exempt=
|
||||
# source: pattern://3fd09bb6cfbd34874595c263
|
||||
application.language.source.1=param:language
|
||||
# source: pattern://3fd09bb6cfbd34874595c263
|
||||
application.language.source.2=cookie:LANG
|
||||
# source: pattern://3fd09bb6cfbd34874595c263
|
||||
application.language.source.3=gui
|
||||
# source: pattern://3fd09bb6cfbd34874595c263
|
||||
application.language.source.4=browser
|
||||
# source: pattern://3fd09bb6cfbd34874595c263
|
||||
application.languages=en,de,fr,it
|
||||
# source: pattern://3fd09bb6cfbd34874595c263
|
||||
application.languages.default=en
|
||||
# source: pattern://8401da6318c6915d689cdfc9
|
||||
application.language.cookie.en=LANG:en
|
||||
# source: pattern://8401da6318c6915d689cdfc9
|
||||
application.language.cookie.de=LANG:de
|
||||
# source: pattern://8401da6318c6915d689cdfc9
|
||||
application.language.cookie.fr=LANG:fr
|
||||
# source: pattern://8401da6318c6915d689cdfc9
|
||||
application.language.cookie.it=LANG:it
|
|
@ -0,0 +1,219 @@
|
|||
|
||||
darkModeSwitch.aria.label=Dark mode toggle
|
||||
error_1=Please check your input.
|
||||
error_10=Please select the correct user account.
|
||||
error_100=Certificate upload not possible. Certificate already exists. Please contact your helpdesk.
|
||||
error_101=The entered email address is not valid.
|
||||
error_11=Please use another certficate or login with another credential type.
|
||||
error_2=Please select another login name.
|
||||
error_3=Your account will be locked if next authentication fails.
|
||||
error_4=Your new password does not comply with the security policy. Please choose a different password.
|
||||
error_5=Error in password confirmation.
|
||||
error_50=The new password is too short.
|
||||
error_55=The new password has to differ from old passwords.
|
||||
error_6=Password change required.
|
||||
error_7=Change of login ID required.
|
||||
error_8=Your account has been locked due to repeated authentication failures.
|
||||
error_81=No access card found, access from internet denied.
|
||||
error_83=Your access card is no longer valid. Please contact your advisor to get a new access card.
|
||||
error_9=Session take over failed.
|
||||
error_97=You are not authorized to access this resource.
|
||||
error_98=Your account has been locked.
|
||||
error_99=System problems. Please try later.
|
||||
error_9901=You need a valid on-boarding link to access this page.
|
||||
error_9902=The email used for authentication doesn't match the expected one in operations. Please ask for a new on-boarding link.
|
||||
error_9903=The used IdP didn't send us a valid assertion. Please make sure, you use the correct IdP. Ask the support for a new on-boarding link.
|
||||
error_9904=Your link is not valid anymore. Please make sure, that you are using the latest Link received from operations. Ask for a new link, if the problem persists.
|
||||
error_9905=There is a problem with your operations account. Please contact the support.
|
||||
error_9909=An internal error occured. Please ask the support for a new on-boarding link.
|
||||
errors.duplicateValue=Your account is already linked with another operations access.
|
||||
fido2_auth.cancel.fido=The security key authentication was interrupted. Please ensure your FIDO key is registered and your email is correct, then follow the steps below.
|
||||
fido2_auth.instruction1=Click on "Continue"
|
||||
fido2_auth.instruction2=An authentication window will appear
|
||||
fido2_auth.instruction3=Follow the instructions
|
||||
fido2_auth.skipInstructions=Skip instructions next time
|
||||
fido2_auth.switchLogin=SWITCH TO LOGIN WITH
|
||||
footer.link=https://agov.ch
|
||||
footer.link.label=Contact
|
||||
footer.text=Authentication service of Swiss authorities AGOV - a collaboration between cantons, their municipalities, and the federal administration. -
|
||||
general.AGOVAccessApp=AGOV access app
|
||||
general.accessApp=AGOV access app
|
||||
general.authenticate=Authenticate
|
||||
general.back=Back
|
||||
general.cancel=Cancel
|
||||
general.confirm=Confirm
|
||||
general.contactSupport=Contact Support
|
||||
general.continue=Continue
|
||||
general.edit=Edit
|
||||
general.email=Email
|
||||
general.email.address=Email address
|
||||
general.entryCode=Code entry
|
||||
general.fieldRequired=Field required.
|
||||
general.getStarted=Get started
|
||||
general.goAGOVHelp=Go to AGOV help
|
||||
general.goAccessApp=Login with AGOV access
|
||||
general.help=Help
|
||||
general.help.link=https://agov.ch/help
|
||||
general.login=Login
|
||||
general.loginSecurityKey=Start Security key login
|
||||
general.or=OR
|
||||
general.otherOptions=OTHER OPTIONS
|
||||
general.recovery=Recovery
|
||||
general.recovery.help.link=https://help.agov.ch/?c=100recovery
|
||||
general.recoveryCode.downloadPdf=Download as PDF
|
||||
general.recoveryCode.inputLabel=Recovery code
|
||||
general.recoveryCode.repeatCodeError=The code you entered was incorrect. Please ensure you have stored it correctly, then continue to resubmit.
|
||||
general.recoveryCode.repeatCodeModal.description=A lost or incorrectly stored recovery code can make it more difficult to recover your account. To ensure you have recorded your code correctly, please repeat it below.
|
||||
general.recoveryCode.repeatCodeModal.title=Repeat recovery code
|
||||
general.recoveryCode.reveal=Reveal recovery code
|
||||
general.recoveryOngoing=Ongoing recovery
|
||||
general.register=Register
|
||||
general.registerNow=Register now!
|
||||
general.registration=Registration
|
||||
general.securityKey=Security key
|
||||
general.skip.content=Skip to main content
|
||||
general.wrongPhoneNumber=Please enter a valid phone number
|
||||
generic.auth.error.message=There was a service interruption. We are working on it.
|
||||
generic.auth.error.next.steps=Please try again later. Please consult AGOV help if the problem persists.
|
||||
generic.auth.error.subtitle=Something went wrong
|
||||
generic.auth.error.title=Error
|
||||
language.de=Deutsch
|
||||
language.en=English
|
||||
language.fr=Français
|
||||
language.it=Italiano
|
||||
languageDropdown.aria.label=Select language
|
||||
loainfo.description.200=To access the application, we need to verify your data. The process can take up to 2 - 3 days.
|
||||
loainfo.description.300=To access the application we need to verify your data through one of two processes. You can choose your preferred process in the next step.
|
||||
loainfo.description.400=To access the application we need you to add your SSN (AHV) number.
|
||||
loainfo.helper=Your data needs to be verified!
|
||||
loainfo.later=Later
|
||||
loainfo.startNow=Do you want to start the process now?
|
||||
loainfo.startVerification=Start verification
|
||||
loainfo.title=Verify your data
|
||||
mauth_usernameless.EID=Continue with CH E-ID
|
||||
mauth_usernameless.banner.error=Authentication interrupted.<br>Please try again when the page reloads.
|
||||
mauth_usernameless.banner.info=Scan successful.<br>Please continue in the AGOV access app.
|
||||
mauth_usernameless.banner.success=Authentication successful!<br>Please wait to be logged in.
|
||||
mauth_usernameless.cannotLogin=Lost access to your app / security key?
|
||||
mauth_usernameless.hideQR=Hide QR code
|
||||
mauth_usernameless.instructions=Log in by scanning the QR code with your AGOV access app
|
||||
mauth_usernameless.noAccount=Don't have an AGOV-Login yet?
|
||||
mauth_usernameless.showQR=Show QR code
|
||||
mauth_usernameless.startRecovery=Start account recovery
|
||||
mauth_usernameless.useSecurityKey=Use a security key to log in
|
||||
mauth_usernameless.useSecurityKeyInfo=A physical security key offers a secure way to login without having to use a phone.
|
||||
op-admin.login=AGOV op admin
|
||||
op-admin.login.intro.message=Login with your username and password
|
||||
op-admin.login.loginid=LoginId
|
||||
op-admin.login.password=Passwort
|
||||
op-admin.login.title=Login
|
||||
op-admin.logout=AGOV op admin
|
||||
op-admin.logout.message=You have successfully logged out.
|
||||
op-admin.logout.title=Logout
|
||||
op-admin.pwchange.intro.message=Password change required
|
||||
op-admin.pwchange.newpassword=New password
|
||||
op-admin.pwchange.newpassword2=Repeat new password
|
||||
op-admin.pwchange.password=Current password
|
||||
op-admin.pwchange.title=Password Change
|
||||
op-idmlogin.role.accs-mgmt-idm=IDM accessrights management
|
||||
op-idmlogin.role.accs-mgmt-nonidm=Accessrights management
|
||||
op-idmlogin.role.idmcfg-mgmt=IDM set-up
|
||||
op-idmlogin.role.readonly-access=Default access (readonly)
|
||||
op-idmlogin.role.support-basic=Support cases (recovery, ...)
|
||||
op-idmlogin.role.support-priv=3rd level support (archiving, off-boarding)
|
||||
op-idmlogin.role.usr-mgmt=User management (operations)
|
||||
op-idmlogin.role.usr-unit-mgmt=User and organization management (operations)
|
||||
op-idmlogin.select=AGOV idm
|
||||
op-idmlogin.select.intro=Please select one of the profiles below...
|
||||
op-idmlogin.select.note=Profiles marked with a * should only be used if required for a specific support or release tasks.
|
||||
op-idmlogin.select.title=Profile selection
|
||||
op-onboarding.done.message=On-boarding was successfull. You can now use your AGOV operations access. Please close the browser, before accessing on of the operations application.
|
||||
op-onboarding.done.title=DONE
|
||||
op-onboarding.failed.title=ERROR
|
||||
op-onboarding.intro.message1=To complete your on-boarding for your AGOV operations access, you need either an AGOV or a FED-LOGIN account.
|
||||
op-onboarding.intro.message2=After clicking on "Continue", you will be redirected for authentication.
|
||||
op-onboarding.intro.message3=If you are using AGOV, and your account doesn't meet yet the required AGOVaq level, you will be given the possibility to start the required ID verification.
|
||||
op-onboarding.intro.title=START
|
||||
op-onboarding.onboarding=AGOV op on-boarding
|
||||
op-onboarding.process.message=During the processing something went wrong. Please contact AGOV support if necessary and ask also for a new on-boarding link.
|
||||
providePhoneNumber.banner=Phone number must be able to receive SMS.<br>This phone number will not be used to contact you.
|
||||
providePhoneNumber.description=AGOV now supports recovery with your phone number. This will allow you to continue with an SMS during recovery if you have lost access to your recovery code.
|
||||
providePhoneNumber.errorBanner=Phone numbers do not match. Please try again.
|
||||
providePhoneNumber.inputLabel=Phone number (optional)
|
||||
providePhoneNumber.laterModal.description1=Without a phone number, a recovery of your account might take up to 4 days if you lose access to your recovery code.
|
||||
providePhoneNumber.laterModal.description2=Adding a phone number helps you to recover your account in a matter of minutes.
|
||||
providePhoneNumber.laterModal.description3=This phone number will not be used to contact you.
|
||||
providePhoneNumber.laterModal.title=Continue without a phone number?
|
||||
providePhoneNumber.modal.description=An incorrectly stored phone number can make it more difficult to recover your account. To ensure you have recorded your phone number correctly, please repeat it below.
|
||||
providePhoneNumber.modal.inputLabel=Phone number
|
||||
providePhoneNumber.modal.title=Repeat phone number
|
||||
providePhoneNumber.saveButtonText=Save
|
||||
providePhoneNumber.title=Add phone number
|
||||
recovery_accessapp_auth.accessAppRegistered=AGOV access app already registered
|
||||
recovery_accessapp_auth.instruction1=You have already registered a new AGOV access app !!!ACCESS_APP_NAME!!! as part of the recovery process.
|
||||
recovery_accessapp_auth.instruction2=Please use !!!ACCESS_APP_NAME!!! to identify you.
|
||||
recovery_check_code.banner.lockedError=Too many invalid input attempts. Please try again in a few minutes.
|
||||
recovery_check_code.codeIncorrect=Code entered is incorrect. Please try again.
|
||||
recovery_check_code.enterRecoveryCode=Enter recovery code
|
||||
recovery_check_code.instruction=Please enter below your personal 12-digit recovery code. You will have received the recovery code as a PDF file during registration or in AGOV me.
|
||||
recovery_check_code.invalid.code=The code is invalid
|
||||
recovery_check_code.invalid.code.required=Code required
|
||||
recovery_check_code.invalid.code.tooLong=The code is too long
|
||||
recovery_check_code.noAccess=I do not have access to my code
|
||||
recovery_check_code.noCodeAccess=Are you sure you don't have access to your recovery code?
|
||||
recovery_check_code.noCodeAccessInstructions=If you have lost access to your recovery code please go to AGOV help in order to contact a AGOV support agent. They will be able to help you with the recovery process.
|
||||
recovery_check_code.too_many_tries.instruction1=The recovery code you have entered might have expired or you might have tried to enter it too many times.
|
||||
recovery_check_code.too_many_tries.instruction2=Please go to AGOV help in order to contact a support agent. They will be able to help you with the recovery process.
|
||||
recovery_check_noCode.banner.error=Too many attempts.
|
||||
recovery_check_noCode.instruction1=You might have tried to enter the recovery code too many times.
|
||||
recovery_check_noCode.instruction2=Please close the web browser and start the account recovery again in ten minutes from <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.
|
||||
recovery_code.banner.error=Please reveal your new code to be able to continue.
|
||||
recovery_code.instruction=Recovery codes help you gain access to your account in case you lost all of your login factors. Please store the recovery code in a safe place.
|
||||
recovery_code.newRecoveryCode=Introducing Recovery Code
|
||||
recovery_code.validUntil=Valid until:
|
||||
recovery_fidokey_auth.button=Start key authentication
|
||||
recovery_fidokey_auth.fidoInstruction=Click on "Start key authentication"
|
||||
recovery_fidokey_auth.instruction1=You have already registered a new security key !!!SECURITY_KEY_NAME!!! as part of the recovery process.
|
||||
recovery_fidokey_auth.instruction2=Please use !!!SECURITY_KEY_NAME!!! to follow the steps below to identify you.
|
||||
recovery_fidokey_auth.keyRegistered=Security key already registered
|
||||
recovery_intro_email.banner.error=The link you used has expired. Please enter your email address to receive a new link.
|
||||
recovery_intro_email.banner.info=Please enter your email address, so we can send you a link to start the recovery process.
|
||||
recovery_intro_email.important=Important:
|
||||
recovery_intro_email.process=The recovery process should only be used if you have lost access to your login factors (deleted AGOV access app, lost security key, lost phone, etc.).
|
||||
recovery_intro_email_sent.banner.button=Didn't receive the email?
|
||||
recovery_intro_email_sent.banner.success=Thank you! You will receive an email with a recovery link and instructions shortly.
|
||||
recovery_on_going.finishRecovery=Finish recovery
|
||||
recovery_on_going.instruction=You have an ongoing recovery process. Part of the recovery process can include an identity verification. To access applications with your AGOV-Login you need to finish the identity verification as well.
|
||||
recovery_on_going.title=Please finish your recovery process.
|
||||
recovery_questionnaire_instructions.banner.info=Please note that in certain cases you need access to your recovery code for a successful recovery.
|
||||
recovery_questionnaire_instructions.explanation=Based on your answers an AGOV-Login recovery seems to be necessary. Please click on continue and follow the instructions on the screen.
|
||||
recovery_questionnaire_instructions.instruction1=Provide your account email address so we can send you a link to begin the recovery process
|
||||
recovery_questionnaire_instructions.instruction2=Follow steps to recover your account (steps will vary depending on your account verification level)
|
||||
recovery_questionnaire_loginfactor.banner.error=Please select an answer.
|
||||
recovery_questionnaire_loginfactor.no=No
|
||||
recovery_questionnaire_loginfactor.question=Have you registered more than one login factor (AGOV access app or security key) to your account?
|
||||
recovery_questionnaire_loginfactor.yes=Yes
|
||||
recovery_questionnaire_no_recovery.explanation1=Based on your answers, the AGOV recovery option does not seem necessary right now.
|
||||
recovery_questionnaire_no_recovery.explanation2=Should you need further information, please visit <a class='link' href='https://agov.ch/help' target='_blank'>https://agov.ch/help</a> for support articles.
|
||||
recovery_questionnaire_no_recovery.instruction1=If you have issues logging in to an application, please visit <a class='link' href='https://agov.ch/me' target='_blank'>https://agov.ch/me</a> and test if you can log in successfully.
|
||||
recovery_questionnaire_no_recovery.instruction2=If you have several login factors registered but lost access to one of them, please visit <a class='link' href='https://agov.ch/me' target='_blank'>https://agov.ch/me</a> to remove the one you have lost access to.
|
||||
recovery_questionnaire_reason_selection.answer1=I have trouble logging in, even though I have my app / security key
|
||||
recovery_questionnaire_reason_selection.answer10=I lost one of my login factors (AGOV access app or security key)
|
||||
recovery_questionnaire_reason_selection.answer2=I was unable to finish my registration
|
||||
recovery_questionnaire_reason_selection.answer3=I have deleted, reinstalled, or reset my AGOV access app
|
||||
recovery_questionnaire_reason_selection.answer4=I have lost my phone / security key
|
||||
recovery_questionnaire_reason_selection.answer5=I have a new phone and forgot to transfer my AGOV access app
|
||||
recovery_questionnaire_reason_selection.answer6=I forgot my PIN for the AGOV access app
|
||||
recovery_questionnaire_reason_selection.answer7=I have my security keys or apps but had trouble logging in
|
||||
recovery_questionnaire_reason_selection.answer8=I lost access to all my security keys and AGOV access apps
|
||||
recovery_questionnaire_reason_selection.answer9=I have issues with one of my login factors (deleted, reset, forgotten PIN)
|
||||
recovery_questionnaire_reason_selection.banner.error=Please select a reason.
|
||||
recovery_questionnaire_reason_selection.instruction=Please select the reason you are starting the recovery process:
|
||||
recovery_start_info.banner.warning=You will not be able to use your account until the recovery process has been concluded.
|
||||
recovery_start_info.instruction=During the recovery process you will register a new login factor. If your account contains any verified information you might also have to go through a verification process to finish the recovery.
|
||||
recovery_start_info.title=You are about to start the recovery process
|
||||
title=NEVIS SSO Portal
|
||||
title.login=Login
|
||||
user_input.invalid.email=Please enter a valid email address
|
||||
user_input.invalid.email.required=Field required
|
||||
user_input.invalid.email.tooLong=Input is too long
|
|
@ -0,0 +1,219 @@
|
|||
|
||||
darkModeSwitch.aria.label=Dark-Mode-Schalter
|
||||
error_1=Bitte überprüfen Sie Ihre Eingaben.
|
||||
error_10=Bitte wählen Sie das richtige Benutzerkonto aus.
|
||||
error_100=Zertifikat-Upload nicht möglich. Das Zertifikat existiert bereits. Wenden Sie sich an Ihr Helpdesk.
|
||||
error_101=Die eingegebene E-Mail-Adresse ist ungültig.
|
||||
error_11=Bitte verwenden Sie ein anderes Zertifikat oder melden Sie sich mit einer anderen Art von Credential an.
|
||||
error_2=Bitte wählen Sie einen anderen Login-Namen.
|
||||
error_3=Wenn die nächste Authentifizierung fehlschlägt, wird Ihr Konto gesperrt.
|
||||
error_4=Ihr neues Passwort verstösst gegen die Sicherheitsrichtlinien. Bitte wählen Sie ein anderes Passwort.
|
||||
error_5=Fehler bei der Passwortbestätigung.
|
||||
error_50=Das neue Passwort ist zu kurz.
|
||||
error_55=Das neue Passwort muss sich von alten Passwörtern unterscheiden.
|
||||
error_6=Passwortänderung erforderlich.
|
||||
error_7=Änderung der Login-ID erforderlich.
|
||||
error_8=Ihr Konto wurde aufgrund wiederholter fehlgeschlagener Authentifizierungsversuche gesperrt.
|
||||
error_81=Keine Zugangskarte gefunden, Zugang über das Internet verweigert.
|
||||
error_83=Ihre Zugangskarte ist nicht mehr gültig. Bitte wenden Sie sich an Ihre Beratungsperson, um eine neue Zugangskarte zu erhalten.
|
||||
error_9=Übernahme der Sitzung fehlgeschlagen.
|
||||
error_97=Sie sind nicht berechtigt, auf diese Ressource zuzugreifen.
|
||||
error_98=Ihr Konto wurde gesperrt.
|
||||
error_99=Systemprobleme: Bitte versuchen Sie es später noch einmal.
|
||||
error_9901=Sie benötigen einen gültigen Onboarding-Link, um auf diese Seite zuzugreifen.
|
||||
error_9902=Die für die Authentifizierung verwendete E-Mail-Adresse stimmt nicht mit der erwarteten E-Mail-Adresse in Operations überein. Bitte fordern Sie einen neuen Onboarding-Link an.
|
||||
error_9903=Der verwendete IdP hat uns keine gültige Assertion gesendet. Bitte stellen Sie sicher, dass Sie den richtigen IdP verwenden. Fordern Sie beim Support einen neuen Onboarding-Link an.
|
||||
error_9904=Ihr Link ist nicht mehr gültig. Bitte stellen Sie sicher, dass Sie den neuesten Link verwenden, den Sie von Operations erhalten haben. Fordern Sie einen neuen Link an, falls das Problem weiterhin besteht.
|
||||
error_9905=Es gibt ein Problem mit Ihrem Operations-Konto. Kontaktieren Sie bitte den Support.
|
||||
error_9909=Es ist ein interner Fehler aufgetreten. Bitten Sie den Support um einen neuen Onboarding-Link.
|
||||
errors.duplicateValue=Ihr Konto ist bereits mit einem anderen Operations-Zugang verknüpft.
|
||||
fido2_auth.cancel.fido=Die Authentifizierung mit dem Sicherheitsschlüssel wurde unterbrochen. Bitte vergewissern Sie sich, dass Ihr FIDO-Schlüssel registriert ist und Ihre E-Mail korrekt ist.
|
||||
fido2_auth.instruction1=Klicken Sie auf "Weiter"
|
||||
fido2_auth.instruction2=Ein Authentifizierungsfenster wird erscheinen
|
||||
fido2_auth.instruction3=Folgen Sie den Anweisungen
|
||||
fido2_auth.skipInstructions=Anweisungen nächstes Mal überspringen
|
||||
fido2_auth.switchLogin=WECHSEL ZU LOGIN MIT
|
||||
footer.link=https://agov.ch
|
||||
footer.link.label=Kontakt
|
||||
footer.text=Authentifizierungsdienst der Schweizer Behörden AGOV – eine Zusammenarbeit zwischen den Kantonen, deren Gemeinden und der Bundesverwaltung. -
|
||||
general.AGOVAccessApp=AGOV access App
|
||||
general.accessApp=AGOV access App
|
||||
general.authenticate=Authentifizieren
|
||||
general.back=Zurück
|
||||
general.cancel=Abbrechen
|
||||
general.confirm=Bestätigen
|
||||
general.contactSupport=Support kontaktieren
|
||||
general.continue=Weiter
|
||||
general.edit=Ändern
|
||||
general.email=E-Mail
|
||||
general.email.address=E-Mail-Adresse
|
||||
general.entryCode=Code-Eingabe
|
||||
general.fieldRequired=Erforderliches Feld.
|
||||
general.getStarted=Los geht's
|
||||
general.goAGOVHelp=Weiter zur AGOV help
|
||||
general.goAccessApp=Login mit AGOV access
|
||||
general.help=Hilfe
|
||||
general.help.link=https://agov.ch/help
|
||||
general.login=Login
|
||||
general.loginSecurityKey=Sicherheitsschlüssel-Login starten
|
||||
general.or=ODER
|
||||
general.otherOptions=WEITERE OPTIONEN
|
||||
general.recovery=Wiederherstellung
|
||||
general.recovery.help.link=https://help.agov.ch/?c=100recovery
|
||||
general.recoveryCode.downloadPdf=Als PDF herunterladen
|
||||
general.recoveryCode.inputLabel=Wiederherstellungscode
|
||||
general.recoveryCode.repeatCodeError=Der von Ihnen eingegebene Code war nicht korrekt. Bitte vergewissern Sie sich, dass Sie ihn richtig abgespeichert haben, und fahren Sie dann mit der erneuten Eingabe fort.
|
||||
general.recoveryCode.repeatCodeModal.description=Ein verlorener oder falsch gespeicherter Wiederherstellungscode kann die Wiederherstellung Ihres Kontos erschweren. Um sicherzustellen, dass Sie Ihren Code richtig gespeichert haben, wiederholen Sie ihn bitte unten.
|
||||
general.recoveryCode.repeatCodeModal.title=Wiederherstellungscode wiederholen
|
||||
general.recoveryCode.reveal=Wiederherstellungscode enthüllen
|
||||
general.recoveryOngoing=Wiederherstellung nicht abgeschlossen
|
||||
general.register=Registrieren
|
||||
general.registerNow=Jetzt registrieren!
|
||||
general.registration=Registrierung
|
||||
general.securityKey=Sicherheitsschlüssel
|
||||
general.skip.content=Direkt zum Hauptteil
|
||||
general.wrongPhoneNumber=Bitte geben Sie eine gültige Telefonnummer ein
|
||||
generic.auth.error.message=Es gab eine Service-Unterbrechung. Wir arbeiten daran.
|
||||
generic.auth.error.next.steps=Versuchen Sie es bitte später noch einmal. Bitte besuchen Sie die AGOV-Hilfe, wenn das Problem weiterhin besteht.
|
||||
generic.auth.error.subtitle=Etwas ist schiefgegangen
|
||||
generic.auth.error.title=Fehler
|
||||
language.de=Deutsch
|
||||
language.en=English
|
||||
language.fr=Français
|
||||
language.it=Italiano
|
||||
languageDropdown.aria.label=Sprache wählen
|
||||
loainfo.description.200=Um auf diese Applikation zuzugreifen, müssen wir Ihre Angaben verifizieren. Der Vorgang kann bis zu 2 - 3 Tage dauern.
|
||||
loainfo.description.300=Um auf diese Applikation zuzugreifen, müssen wir Ihre Angaben durch einen von zwei Vorgängen verifizieren. Sie können die bevorzugte Methode im nächsten Schritt auswählen.
|
||||
loainfo.description.400=Bitte AHV-Nummer angeben, um auf die Applikation zuzugreifen.
|
||||
loainfo.helper=Ihre persönlichen Daten müssen überprüft werden!
|
||||
loainfo.later=Später
|
||||
loainfo.startNow=Möchten Sie den Prozess jetzt starten?
|
||||
loainfo.startVerification=Verifikation starten
|
||||
loainfo.title=Verifizieren Sie Ihre Daten
|
||||
mauth_usernameless.EID=Mit Schweizer E-ID fortfahren
|
||||
mauth_usernameless.banner.error=Authentifizierung unterbrochen.<br>Bitte versuchen Sie es erneut, nachdem die Seite neu geladen wurde.
|
||||
mauth_usernameless.banner.info=Scan erfolgreich.<br>Bitte fahren Sie in der AGOV access App fort.
|
||||
mauth_usernameless.banner.success=Authentifizierung erfolgreich!<br>Bitte warten Sie, bis Sie eingeloggt werden.
|
||||
mauth_usernameless.cannotLogin=Zugriff auf App / Sicherheitsschlüssel verloren?
|
||||
mauth_usernameless.hideQR=QR-Code ausblenden
|
||||
mauth_usernameless.instructions=Melden Sie sich an, indem Sie den QR-Code mit Ihrer AGOV access App scannen
|
||||
mauth_usernameless.noAccount=Haben Sie noch kein AGOV-Login?
|
||||
mauth_usernameless.showQR=QR-Code anzeigen
|
||||
mauth_usernameless.startRecovery=Kontowiederherstellung starten
|
||||
mauth_usernameless.useSecurityKey=Verwenden Sie einen Sicherheitsschlüssel, um sich anzumelden
|
||||
mauth_usernameless.useSecurityKeyInfo=Ein physischer Sicherheitsschlüssel bietet eine sichere Möglichkeit, sich ohne Telefon anzumelden.
|
||||
op-admin.login=AGOV-op-Admin
|
||||
op-admin.login.intro.message=Login mit Ihrem Benutzernamen und Passwort
|
||||
op-admin.login.loginid=LoginID
|
||||
op-admin.login.password=Passwort
|
||||
op-admin.login.title=Login
|
||||
op-admin.logout=AGOV-op-Admin
|
||||
op-admin.logout.message=Sie haben sich erfolgreich ausgeloggt.
|
||||
op-admin.logout.title=Logout
|
||||
op-admin.pwchange.intro.message=Passwortänderung erforderlich
|
||||
op-admin.pwchange.newpassword=Neues Passwort
|
||||
op-admin.pwchange.newpassword2=Neues Passwort wiederholen
|
||||
op-admin.pwchange.password=Aktuelles Passwort
|
||||
op-admin.pwchange.title=Änderung des Passworts
|
||||
op-idmlogin.role.accs-mgmt-idm=IDM accessrights management
|
||||
op-idmlogin.role.accs-mgmt-nonidm=Accessrights management
|
||||
op-idmlogin.role.idmcfg-mgmt=IDM set-up
|
||||
op-idmlogin.role.readonly-access=Standardzugriff (Nur Leseberechtigung)
|
||||
op-idmlogin.role.support-basic=Supportfälle (Wiederherstellung, ...)
|
||||
op-idmlogin.role.support-priv=3rd Level Support (Archivierung, Abmeldungen, ...)
|
||||
op-idmlogin.role.usr-mgmt=Benutzerverwaltung (Betrieb)
|
||||
op-idmlogin.role.usr-unit-mgmt=Benutzer- und Organisationsverwaltung (Betrieb)
|
||||
op-idmlogin.select=AGOV idm
|
||||
op-idmlogin.select.intro=Bitte wählen Sie ein Profil aus...
|
||||
op-idmlogin.select.note=Mit * markierte Profile sollten nur für bestimmte Support oder Release Aufgaben genutzt werden.
|
||||
op-idmlogin.select.title=Profilauswahl
|
||||
op-onboarding.done.message=Das Onboarding war erfolgreich. Sie können nun Ihren AGOV-Operations-Zugang verwenden. Bitte schliessen Sie den Browser, bevor Sie auf eine der Operations-Applikationen zugreifen.
|
||||
op-onboarding.done.title=FERTIG
|
||||
op-onboarding.failed.title=FEHLER
|
||||
op-onboarding.intro.message1=Um das Onboarding für Ihren AGOV-Operations-Zugang abzuschliessen, benötigen Sie entweder ein AGOV- oder ein FED-LOGIN-Konto.
|
||||
op-onboarding.intro.message2=Wenn Sie auf «Weiter» klicken, werden Sie zur Authentifizierung weitergeleitet.
|
||||
op-onboarding.intro.message3=Wenn Sie AGOV verwenden und Ihr Konto noch nicht der erforderlichen AGOVaq-Stufe entspricht, erhalten Sie die Möglichkeit, die erforderliche Identitätsprüfung zu starten.
|
||||
op-onboarding.intro.title=START
|
||||
op-onboarding.onboarding=AGOV-op-Onboarding
|
||||
op-onboarding.process.message=Bei der Bearbeitung ist etwas schiefgegangen. Wenden Sie sich wenn nötig an den AGOV-Support und fordern Sie einen neuen Onboarding-Link an.
|
||||
providePhoneNumber.banner=Die Mobilnummer muss für den Empfang von SMS geeignet sein.<br>Diese Mobilnummer wird nicht verwendet, um Sie zu kontaktieren.
|
||||
providePhoneNumber.description=AGOV erlaubt nun die Wiederherstellung mittels Mobilnummer. So können Sie während der Wiederherstellung mit einer SMS fortfahren, wenn Sie Ihren Wiederherstellungscode verloren haben.
|
||||
providePhoneNumber.errorBanner=Die Mobilnummern stimmen nicht überein. Bitte versuchen Sie es erneut.
|
||||
providePhoneNumber.inputLabel=Mobilnummer (optional)
|
||||
providePhoneNumber.laterModal.description1=Ohne Mobilnummer kann die Wiederherstellung Ihres Kontos bis zu 4 Tage dauern, wenn Sie Ihren Wiederherstellungscode verlieren.
|
||||
providePhoneNumber.laterModal.description2=Durch Hinzufügen einer Mobilnummer können Sie Ihr Konto in wenigen Minuten wiederherstellen.
|
||||
providePhoneNumber.laterModal.description3=Diese Mobilnummer wird nicht verwendet, um Sie zu kontaktieren.
|
||||
providePhoneNumber.laterModal.title=Ohne Mobilnummer weiterfahren?
|
||||
providePhoneNumber.modal.description=Eine falsch gespeicherte Mobilnummer kann die Wiederherstellung Ihres Kontos erschweren. Um sicherzustellen, dass Sie Ihre Mobilnummer richtig gespeichert haben, wiederholen Sie sie bitte unten.
|
||||
providePhoneNumber.modal.inputLabel=Mobilnummer
|
||||
providePhoneNumber.modal.title=Mobilnummer wiederholen
|
||||
providePhoneNumber.saveButtonText=Speichern
|
||||
providePhoneNumber.title=Mobilnummer angeben
|
||||
recovery_accessapp_auth.accessAppRegistered=AGOV access app schon registriert
|
||||
recovery_accessapp_auth.instruction1=Sie haben bereits eine neue AGOV access App !!!ACCESS_APP_NAME!!! im Rahmen des Wiederherstellungsprozesses registriert.
|
||||
recovery_accessapp_auth.instruction2=Verwenden Sie !!!ACCESS_APP_NAME!!! um sich zu identifizieren.
|
||||
recovery_check_code.banner.lockedError=Zu viele Fehlversuche. Bitte versuchen Sie es in ein paar Minuten noch einmal.
|
||||
recovery_check_code.codeIncorrect=Der eingegebene Code ist nicht korrekt. Bitte versuchen Sie es erneut.
|
||||
recovery_check_code.enterRecoveryCode=Wiederherstellungscode eingeben
|
||||
recovery_check_code.instruction=Bitte geben Sie unten Ihren persönlichen 12-stelligen Wiederherstellungscode ein. Sie haben den Wiederherstellungscode in einer PDF-Datei bei der Registrierung oder in AGOV me erhalten.
|
||||
recovery_check_code.invalid.code=Code ist ungültig
|
||||
recovery_check_code.invalid.code.required=Code erforderlich
|
||||
recovery_check_code.invalid.code.tooLong=Eingegebener Code ist zu lang
|
||||
recovery_check_code.noAccess=Ich kann auf meinen Code nicht zugreifen
|
||||
recovery_check_code.noCodeAccess=Sind Sie sicher, dass Sie auf Ihren Wiederherstellungscode nicht zugreifen können?
|
||||
recovery_check_code.noCodeAccessInstructions=Wenn Sie auf Ihren Wiederherstellungscode nicht mehr zugreifen können, gehen Sie bitte zur AGOV-Hilfe, um jemanden vom AGOV-Support zu kontaktieren. Die Person wird Sie beim Wiederherstellungsprozess unterstützen.
|
||||
recovery_check_code.too_many_tries.instruction1=Der von Ihnen eingegebene Wiederherstellungscode ist möglicherweise abgelaufen oder Sie haben zu oft versucht, einen Code einzugeben.
|
||||
recovery_check_code.too_many_tries.instruction2=Gehen Sie bitte zur AGOV-Hilfe, um jemanden vom Support zu kontaktieren. Die Person wird Sie beim Wiederherstellungsprozess unterstützen.
|
||||
recovery_check_noCode.banner.error=Zu viele Versuche.
|
||||
recovery_check_noCode.instruction1=Möglicherweise haben Sie zu oft versucht, den Wiederherstellungscode einzugeben.
|
||||
recovery_check_noCode.instruction2=Bitte schliessen Sie den Webbrowser und starten Sie die Kontowiederherstellung in zehn Minuten erneut auf <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.
|
||||
recovery_code.banner.error=Bitte enthüllen Sie den Code, um fortfahren zu können.
|
||||
recovery_code.instruction=Der Wiederherstellungscode hilft Ihnen, Zugriff auf Ihr AGOV-Login zu erhalten, falls Sie alle Ihre Login-Faktoren verloren haben. Bitte bewahren Sie den Wiederherstellungscode an einem sicheren Ort auf.
|
||||
recovery_code.newRecoveryCode=Einführung von Wiederherstellungscode
|
||||
recovery_code.validUntil=Gültig bis:
|
||||
recovery_fidokey_auth.button=Schlüsselauthentifizierung starten
|
||||
recovery_fidokey_auth.fidoInstruction=Klicken Sie auf "Schlüsselauthentifizierung starten"
|
||||
recovery_fidokey_auth.instruction1=Sie haben bereits einen neuen Sicherheitsschlüssel !!!SECURITY_KEY_NAME!!! im Rahmen des Wiederherstellungsprozesses registriert.
|
||||
recovery_fidokey_auth.instruction2=Bitte verwenden Sie !!!SECURITY_KEY_NAME!!! und befolgen Sie die untenstehenden Schritte, um sich zu identifizieren.
|
||||
recovery_fidokey_auth.keyRegistered=Sicherheitsschlüssel schon registriert
|
||||
recovery_intro_email.banner.error=Der von Ihnen verwendete Link ist abgelaufen. Bitte geben Sie Ihre E-Mail-Adresse ein, um einen neuen Link zu erhalten.
|
||||
recovery_intro_email.banner.info=Bitte geben Sie Ihre E-Mail-Adresse ein, damit wir Ihnen einen Link schicken können, mit dem Sie den Wiederherstellungsprozess starten.
|
||||
recovery_intro_email.important=Wichtig:
|
||||
recovery_intro_email.process=Der Wiederherstellungsprozess sollte nur verwendet werden, wenn Sie den Zugriff auf Ihre Login-Faktoren verloren haben (gelöschte AGOV access App, verlorener Sicherheitsschlüssel, verlorenes Telefon usw.).
|
||||
recovery_intro_email_sent.banner.button=Keine E-Mail erhalten?
|
||||
recovery_intro_email_sent.banner.success=Vielen Dank! Sie werden in Kürze eine E-Mail mit einem Wiederherstellungslink und Anweisungen erhalten.
|
||||
recovery_on_going.finishRecovery=Wiederherstellung abschliessen
|
||||
recovery_on_going.instruction=Sie haben einen laufenden Wiederherstellungsprozess. Der Wiederherstellungsprozess kann eine Identitätsprüfung umfassen. Um mit Ihrem AGOV-Login auf Applikationen zugreifen zu können, müssen Sie auch die Identitätsprüfung abschliessen.
|
||||
recovery_on_going.title=Bitte schliessen Sie Ihren Wiederherstellungsprozess ab.
|
||||
recovery_questionnaire_instructions.banner.info=Bitte beachten Sie, dass Sie in bestimmten Fällen für eine erfolgreiche Wiederherstellung Zugang zu Ihrem Wiederherstellungscode benötigen.
|
||||
recovery_questionnaire_instructions.explanation=Aufgrund Ihrer Antworten scheint eine Wiederherstellung Ihres AGOV-Logins erforderlich zu sein. Bitte klicken Sie auf Weiter und folgen Sie den Anweisungen auf dem Bildschirm.
|
||||
recovery_questionnaire_instructions.instruction1=Geben Sie die E-Mail-Adresse Ihres AGOV-Logins an, damit wir Ihnen einen Link senden können, um den Wiederherstellungsprozess zu beginnen
|
||||
recovery_questionnaire_instructions.instruction2=Folgen Sie den Schritten zur Wiederherstellung Ihres Kontos (die Schritte variieren je nach Verifizierungsstufe Ihres Kontos)
|
||||
recovery_questionnaire_loginfactor.banner.error=Bitte wählen Sie eine Antwort.
|
||||
recovery_questionnaire_loginfactor.no=Nein
|
||||
recovery_questionnaire_loginfactor.question=Haben Sie mehr als einen Loginfaktor (AGOV Access App oder Sicherheitsschlüssel) für Ihren AGOV-Login registriert?
|
||||
recovery_questionnaire_loginfactor.yes=Ja
|
||||
recovery_questionnaire_no_recovery.explanation1=Ausgehend von Ihren Antworten scheint eine Wiederherstellung Ihres AGOV-Logins im Moment nicht notwendig zu sein.
|
||||
recovery_questionnaire_no_recovery.explanation2=Falls Sie weitere Informationen benötigen, besuchen Sie bitte <a class='link' href='https://agov.ch/help' target='_blank'>https://agov.ch/help</a> für Support-Artikel.
|
||||
recovery_questionnaire_no_recovery.instruction1=Wenn Sie Probleme haben, sich bei einer Anwendung anzumelden, besuchen Sie bitte <a class='link' href='https://agov.ch/me' target='_blank'>https://agov.ch/me</a> und testen Sie, ob Sie sich erfolgreich anmelden können.
|
||||
recovery_questionnaire_no_recovery.instruction2=Wenn Sie mehrere Loginfaktoren registriert haben, aber den Zugriff zu einem von ihnen verloren haben, besuchen Sie bitte <a class='link' href='https://agov.ch/me' target='_blank'>https://agov.ch/me</a>, um den verlorenen Loginfaktor zu entfernen.
|
||||
recovery_questionnaire_reason_selection.answer1=Ich habe Probleme mich anzumelden, obwohl ich meine App / meinen Sicherheitsschlüssel habe
|
||||
recovery_questionnaire_reason_selection.answer10=Ich habe einen meiner Loginfaktoren verloren (AGOV access App oder Sicherheitsschlüssel)
|
||||
recovery_questionnaire_reason_selection.answer2=Ich konnte meine Registrierung nicht abschliessen
|
||||
recovery_questionnaire_reason_selection.answer3=Ich habe meine AGOV access App gelöscht, neu installiert oder zurückgesetzt
|
||||
recovery_questionnaire_reason_selection.answer4=Ich habe mein Telefon / Sicherheitsschlüssel verloren
|
||||
recovery_questionnaire_reason_selection.answer5=Ich habe ein neues Telefon und habe vergessen, meine AGOV access App zu übertragen
|
||||
recovery_questionnaire_reason_selection.answer6=Ich habe die PIN für meine AGOV access App vergessen
|
||||
recovery_questionnaire_reason_selection.answer7=Ich habe meine Sicherheitsschlüssel oder AGOV access Apps, hatte aber Probleme beim Einloggen
|
||||
recovery_questionnaire_reason_selection.answer8=Ich habe den Zugriff auf alle meine Sicherheitsschlüssel und Apps verloren
|
||||
recovery_questionnaire_reason_selection.answer9=Ich habe Probleme mit einem meiner Loginfaktoren (gelöscht, zurückgesetzt, vergessene PIN)
|
||||
recovery_questionnaire_reason_selection.banner.error=Bitte wählen Sie einen Grund aus.
|
||||
recovery_questionnaire_reason_selection.instruction=Bitte wählen Sie einen Grund wieso Sie den AGOV recovery Prozess starten:
|
||||
recovery_start_info.banner.warning=Sie können Ihr Konto nicht nutzen, bis der Wiederherstellungsprozess abgeschlossen ist.
|
||||
recovery_start_info.instruction=Während des Wiederherstellungsprozesses werden Sie einen neuen Login-Faktor registrieren. Wenn Ihr Konto verifizierte Informationen enthält, müssen Sie zum Abschluss des Wiederherstellungsprozesses möglicherweise auch einen Verifikationsprozess durchlaufen.
|
||||
recovery_start_info.title=Sie sind dabei, den Wiederherstellungsprozess zu starten
|
||||
title=NEVIS SSO Portal
|
||||
title.login=Login
|
||||
user_input.invalid.email=Bitte geben Sie eine gültige E-Mail ein
|
||||
user_input.invalid.email.required=Erforderliches Feld
|
||||
user_input.invalid.email.tooLong=Eingabe zu lang
|
|
@ -0,0 +1,219 @@
|
|||
|
||||
darkModeSwitch.aria.label=Dark mode toggle
|
||||
error_1=Please check your input.
|
||||
error_10=Please select the correct user account.
|
||||
error_100=Certificate upload not possible. Certificate already exists. Please contact your helpdesk.
|
||||
error_101=The entered email address is not valid.
|
||||
error_11=Please use another certficate or login with another credential type.
|
||||
error_2=Please select another login name.
|
||||
error_3=Your account will be locked if next authentication fails.
|
||||
error_4=Your new password does not comply with the security policy. Please choose a different password.
|
||||
error_5=Error in password confirmation.
|
||||
error_50=The new password is too short.
|
||||
error_55=The new password has to differ from old passwords.
|
||||
error_6=Password change required.
|
||||
error_7=Change of login ID required.
|
||||
error_8=Your account has been locked due to repeated authentication failures.
|
||||
error_81=No access card found, access from internet denied.
|
||||
error_83=Your access card is no longer valid. Please contact your advisor to get a new access card.
|
||||
error_9=Session take over failed.
|
||||
error_97=You are not authorized to access this resource.
|
||||
error_98=Your account has been locked.
|
||||
error_99=System problems. Please try later.
|
||||
error_9901=You need a valid on-boarding link to access this page.
|
||||
error_9902=The email used for authentication doesn't match the expected one in operations. Please ask for a new on-boarding link.
|
||||
error_9903=The used IdP didn't send us a valid assertion. Please make sure, you use the correct IdP. Ask the support for a new on-boarding link.
|
||||
error_9904=Your link is not valid anymore. Please make sure, that you are using the latest Link received from operations. Ask for a new link, if the problem persists.
|
||||
error_9905=There is a problem with your operations account. Please contact the support.
|
||||
error_9909=An internal error occured. Please ask the support for a new on-boarding link.
|
||||
errors.duplicateValue=Your account is already linked with another operations access.
|
||||
fido2_auth.cancel.fido=The security key authentication was interrupted. Please ensure your FIDO key is registered and your email is correct, then follow the steps below.
|
||||
fido2_auth.instruction1=Click on "Continue"
|
||||
fido2_auth.instruction2=An authentication window will appear
|
||||
fido2_auth.instruction3=Follow the instructions
|
||||
fido2_auth.skipInstructions=Skip instructions next time
|
||||
fido2_auth.switchLogin=SWITCH TO LOGIN WITH
|
||||
footer.link=https://agov.ch
|
||||
footer.link.label=Contact
|
||||
footer.text=Authentication service of Swiss authorities AGOV - a collaboration between cantons, their municipalities, and the federal administration. -
|
||||
general.AGOVAccessApp=AGOV access app
|
||||
general.accessApp=AGOV access app
|
||||
general.authenticate=Authenticate
|
||||
general.back=Back
|
||||
general.cancel=Cancel
|
||||
general.confirm=Confirm
|
||||
general.contactSupport=Contact Support
|
||||
general.continue=Continue
|
||||
general.edit=Edit
|
||||
general.email=Email
|
||||
general.email.address=Email address
|
||||
general.entryCode=Code entry
|
||||
general.fieldRequired=Field required.
|
||||
general.getStarted=Get started
|
||||
general.goAGOVHelp=Go to AGOV help
|
||||
general.goAccessApp=Login with AGOV access
|
||||
general.help=Help
|
||||
general.help.link=https://agov.ch/help
|
||||
general.login=Login
|
||||
general.loginSecurityKey=Start Security key login
|
||||
general.or=OR
|
||||
general.otherOptions=OTHER OPTIONS
|
||||
general.recovery=Recovery
|
||||
general.recovery.help.link=https://help.agov.ch/?c=100recovery
|
||||
general.recoveryCode.downloadPdf=Download as PDF
|
||||
general.recoveryCode.inputLabel=Recovery code
|
||||
general.recoveryCode.repeatCodeError=The code you entered was incorrect. Please ensure you have stored it correctly, then continue to resubmit.
|
||||
general.recoveryCode.repeatCodeModal.description=A lost or incorrectly stored recovery code can make it more difficult to recover your account. To ensure you have recorded your code correctly, please repeat it below.
|
||||
general.recoveryCode.repeatCodeModal.title=Repeat recovery code
|
||||
general.recoveryCode.reveal=Reveal recovery code
|
||||
general.recoveryOngoing=Ongoing recovery
|
||||
general.register=Register
|
||||
general.registerNow=Register now!
|
||||
general.registration=Registration
|
||||
general.securityKey=Security key
|
||||
general.skip.content=Skip to main content
|
||||
general.wrongPhoneNumber=Please enter a valid phone number
|
||||
generic.auth.error.message=There was a service interruption. We are working on it.
|
||||
generic.auth.error.next.steps=Please try again later. Please consult AGOV help if the problem persists.
|
||||
generic.auth.error.subtitle=Something went wrong
|
||||
generic.auth.error.title=Error
|
||||
language.de=Deutsch
|
||||
language.en=English
|
||||
language.fr=Français
|
||||
language.it=Italiano
|
||||
languageDropdown.aria.label=Select language
|
||||
loainfo.description.200=To access the application, we need to verify your data. The process can take up to 2 - 3 days.
|
||||
loainfo.description.300=To access the application we need to verify your data through one of two processes. You can choose your preferred process in the next step.
|
||||
loainfo.description.400=To access the application we need you to add your SSN (AHV) number.
|
||||
loainfo.helper=Your data needs to be verified!
|
||||
loainfo.later=Later
|
||||
loainfo.startNow=Do you want to start the process now?
|
||||
loainfo.startVerification=Start verification
|
||||
loainfo.title=Verify your data
|
||||
mauth_usernameless.EID=Continue with CH E-ID
|
||||
mauth_usernameless.banner.error=Authentication interrupted.<br>Please try again when the page reloads.
|
||||
mauth_usernameless.banner.info=Scan successful.<br>Please continue in the AGOV access app.
|
||||
mauth_usernameless.banner.success=Authentication successful!<br>Please wait to be logged in.
|
||||
mauth_usernameless.cannotLogin=Lost access to your app / security key?
|
||||
mauth_usernameless.hideQR=Hide QR code
|
||||
mauth_usernameless.instructions=Log in by scanning the QR code with your AGOV access app
|
||||
mauth_usernameless.noAccount=Don't have an AGOV-Login yet?
|
||||
mauth_usernameless.showQR=Show QR code
|
||||
mauth_usernameless.startRecovery=Start account recovery
|
||||
mauth_usernameless.useSecurityKey=Use a security key to log in
|
||||
mauth_usernameless.useSecurityKeyInfo=A physical security key offers a secure way to login without having to use a phone.
|
||||
op-admin.login=AGOV op admin
|
||||
op-admin.login.intro.message=Login with your username and password
|
||||
op-admin.login.loginid=LoginId
|
||||
op-admin.login.password=Passwort
|
||||
op-admin.login.title=Login
|
||||
op-admin.logout=AGOV op admin
|
||||
op-admin.logout.message=You have successfully logged out.
|
||||
op-admin.logout.title=Logout
|
||||
op-admin.pwchange.intro.message=Password change required
|
||||
op-admin.pwchange.newpassword=New password
|
||||
op-admin.pwchange.newpassword2=Repeat new password
|
||||
op-admin.pwchange.password=Current password
|
||||
op-admin.pwchange.title=Password Change
|
||||
op-idmlogin.role.accs-mgmt-idm=IDM accessrights management
|
||||
op-idmlogin.role.accs-mgmt-nonidm=Accessrights management
|
||||
op-idmlogin.role.idmcfg-mgmt=IDM set-up
|
||||
op-idmlogin.role.readonly-access=Default access (readonly)
|
||||
op-idmlogin.role.support-basic=Support cases (recovery, ...)
|
||||
op-idmlogin.role.support-priv=3rd level support (archiving, off-boarding)
|
||||
op-idmlogin.role.usr-mgmt=User management (operations)
|
||||
op-idmlogin.role.usr-unit-mgmt=User and organization management (operations)
|
||||
op-idmlogin.select=AGOV idm
|
||||
op-idmlogin.select.intro=Please select one of the profiles below...
|
||||
op-idmlogin.select.note=Profiles marked with a * should only be used if required for a specific support or release tasks.
|
||||
op-idmlogin.select.title=Profile selection
|
||||
op-onboarding.done.message=On-boarding was successfull. You can now use your AGOV operations access. Please close the browser, before accessing on of the operations application.
|
||||
op-onboarding.done.title=DONE
|
||||
op-onboarding.failed.title=ERROR
|
||||
op-onboarding.intro.message1=To complete your on-boarding for your AGOV operations access, you need either an AGOV or a FED-LOGIN account.
|
||||
op-onboarding.intro.message2=After clicking on "Continue", you will be redirected for authentication.
|
||||
op-onboarding.intro.message3=If you are using AGOV, and your account doesn't meet yet the required AGOVaq level, you will be given the possibility to start the required ID verification.
|
||||
op-onboarding.intro.title=START
|
||||
op-onboarding.onboarding=AGOV op on-boarding
|
||||
op-onboarding.process.message=During the processing something went wrong. Please contact AGOV support if necessary and ask also for a new on-boarding link.
|
||||
providePhoneNumber.banner=Phone number must be able to receive SMS.<br>This phone number will not be used to contact you.
|
||||
providePhoneNumber.description=AGOV now supports recovery with your phone number. This will allow you to continue with an SMS during recovery if you have lost access to your recovery code.
|
||||
providePhoneNumber.errorBanner=Phone numbers do not match. Please try again.
|
||||
providePhoneNumber.inputLabel=Phone number (optional)
|
||||
providePhoneNumber.laterModal.description1=Without a phone number, a recovery of your account might take up to 4 days if you lose access to your recovery code.
|
||||
providePhoneNumber.laterModal.description2=Adding a phone number helps you to recover your account in a matter of minutes.
|
||||
providePhoneNumber.laterModal.description3=This phone number will not be used to contact you.
|
||||
providePhoneNumber.laterModal.title=Continue without a phone number?
|
||||
providePhoneNumber.modal.description=An incorrectly stored phone number can make it more difficult to recover your account. To ensure you have recorded your phone number correctly, please repeat it below.
|
||||
providePhoneNumber.modal.inputLabel=Phone number
|
||||
providePhoneNumber.modal.title=Repeat phone number
|
||||
providePhoneNumber.saveButtonText=Save
|
||||
providePhoneNumber.title=Add phone number
|
||||
recovery_accessapp_auth.accessAppRegistered=AGOV access app already registered
|
||||
recovery_accessapp_auth.instruction1=You have already registered a new AGOV access app !!!ACCESS_APP_NAME!!! as part of the recovery process.
|
||||
recovery_accessapp_auth.instruction2=Please use !!!ACCESS_APP_NAME!!! to identify you.
|
||||
recovery_check_code.banner.lockedError=Too many invalid input attempts. Please try again in a few minutes.
|
||||
recovery_check_code.codeIncorrect=Code entered is incorrect. Please try again.
|
||||
recovery_check_code.enterRecoveryCode=Enter recovery code
|
||||
recovery_check_code.instruction=Please enter below your personal 12-digit recovery code. You will have received the recovery code as a PDF file during registration or in AGOV me.
|
||||
recovery_check_code.invalid.code=The code is invalid
|
||||
recovery_check_code.invalid.code.required=Code required
|
||||
recovery_check_code.invalid.code.tooLong=The code is too long
|
||||
recovery_check_code.noAccess=I do not have access to my code
|
||||
recovery_check_code.noCodeAccess=Are you sure you don't have access to your recovery code?
|
||||
recovery_check_code.noCodeAccessInstructions=If you have lost access to your recovery code please go to AGOV help in order to contact a AGOV support agent. They will be able to help you with the recovery process.
|
||||
recovery_check_code.too_many_tries.instruction1=The recovery code you have entered might have expired or you might have tried to enter it too many times.
|
||||
recovery_check_code.too_many_tries.instruction2=Please go to AGOV help in order to contact a support agent. They will be able to help you with the recovery process.
|
||||
recovery_check_noCode.banner.error=Too many attempts.
|
||||
recovery_check_noCode.instruction1=You might have tried to enter the recovery code too many times.
|
||||
recovery_check_noCode.instruction2=Please close the web browser and start the account recovery again in ten minutes from <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.
|
||||
recovery_code.banner.error=Please reveal your new code to be able to continue.
|
||||
recovery_code.instruction=Recovery codes help you gain access to your account in case you lost all of your login factors. Please store the recovery code in a safe place.
|
||||
recovery_code.newRecoveryCode=Introducing Recovery Code
|
||||
recovery_code.validUntil=Valid until:
|
||||
recovery_fidokey_auth.button=Start key authentication
|
||||
recovery_fidokey_auth.fidoInstruction=Click on "Start key authentication"
|
||||
recovery_fidokey_auth.instruction1=You have already registered a new security key !!!SECURITY_KEY_NAME!!! as part of the recovery process.
|
||||
recovery_fidokey_auth.instruction2=Please use !!!SECURITY_KEY_NAME!!! to follow the steps below to identify you.
|
||||
recovery_fidokey_auth.keyRegistered=Security key already registered
|
||||
recovery_intro_email.banner.error=The link you used has expired. Please enter your email address to receive a new link.
|
||||
recovery_intro_email.banner.info=Please enter your email address, so we can send you a link to start the recovery process.
|
||||
recovery_intro_email.important=Important:
|
||||
recovery_intro_email.process=The recovery process should only be used if you have lost access to your login factors (deleted AGOV access app, lost security key, lost phone, etc.).
|
||||
recovery_intro_email_sent.banner.button=Didn't receive the email?
|
||||
recovery_intro_email_sent.banner.success=Thank you! You will receive an email with a recovery link and instructions shortly.
|
||||
recovery_on_going.finishRecovery=Finish recovery
|
||||
recovery_on_going.instruction=You have an ongoing recovery process. Part of the recovery process can include an identity verification. To access applications with your AGOV-Login you need to finish the identity verification as well.
|
||||
recovery_on_going.title=Please finish your recovery process.
|
||||
recovery_questionnaire_instructions.banner.info=Please note that in certain cases you need access to your recovery code for a successful recovery.
|
||||
recovery_questionnaire_instructions.explanation=Based on your answers an AGOV-Login recovery seems to be necessary. Please click on continue and follow the instructions on the screen.
|
||||
recovery_questionnaire_instructions.instruction1=Provide your account email address so we can send you a link to begin the recovery process
|
||||
recovery_questionnaire_instructions.instruction2=Follow steps to recover your account (steps will vary depending on your account verification level)
|
||||
recovery_questionnaire_loginfactor.banner.error=Please select an answer.
|
||||
recovery_questionnaire_loginfactor.no=No
|
||||
recovery_questionnaire_loginfactor.question=Have you registered more than one login factor (AGOV access app or security key) to your account?
|
||||
recovery_questionnaire_loginfactor.yes=Yes
|
||||
recovery_questionnaire_no_recovery.explanation1=Based on your answers, the AGOV recovery option does not seem necessary right now.
|
||||
recovery_questionnaire_no_recovery.explanation2=Should you need further information, please visit <a class='link' href='https://agov.ch/help' target='_blank'>https://agov.ch/help</a> for support articles.
|
||||
recovery_questionnaire_no_recovery.instruction1=If you have issues logging in to an application, please visit <a class='link' href='https://agov.ch/me' target='_blank'>https://agov.ch/me</a> and test if you can log in successfully.
|
||||
recovery_questionnaire_no_recovery.instruction2=If you have several login factors registered but lost access to one of them, please visit <a class='link' href='https://agov.ch/me' target='_blank'>https://agov.ch/me</a> to remove the one you have lost access to.
|
||||
recovery_questionnaire_reason_selection.answer1=I have trouble logging in, even though I have my app / security key
|
||||
recovery_questionnaire_reason_selection.answer10=I lost one of my login factors (AGOV access app or security key)
|
||||
recovery_questionnaire_reason_selection.answer2=I was unable to finish my registration
|
||||
recovery_questionnaire_reason_selection.answer3=I have deleted, reinstalled, or reset my AGOV access app
|
||||
recovery_questionnaire_reason_selection.answer4=I have lost my phone / security key
|
||||
recovery_questionnaire_reason_selection.answer5=I have a new phone and forgot to transfer my AGOV access app
|
||||
recovery_questionnaire_reason_selection.answer6=I forgot my PIN for the AGOV access app
|
||||
recovery_questionnaire_reason_selection.answer7=I have my security keys or apps but had trouble logging in
|
||||
recovery_questionnaire_reason_selection.answer8=I lost access to all my security keys and AGOV access apps
|
||||
recovery_questionnaire_reason_selection.answer9=I have issues with one of my login factors (deleted, reset, forgotten PIN)
|
||||
recovery_questionnaire_reason_selection.banner.error=Please select a reason.
|
||||
recovery_questionnaire_reason_selection.instruction=Please select the reason you are starting the recovery process:
|
||||
recovery_start_info.banner.warning=You will not be able to use your account until the recovery process has been concluded.
|
||||
recovery_start_info.instruction=During the recovery process you will register a new login factor. If your account contains any verified information you might also have to go through a verification process to finish the recovery.
|
||||
recovery_start_info.title=You are about to start the recovery process
|
||||
title=NEVIS SSO Portal
|
||||
title.login=Login
|
||||
user_input.invalid.email=Please enter a valid email address
|
||||
user_input.invalid.email.required=Field required
|
||||
user_input.invalid.email.tooLong=Input is too long
|
|
@ -0,0 +1,219 @@
|
|||
|
||||
darkModeSwitch.aria.label=Activer l'apparence sombre
|
||||
error_1=Veuillez vérifier votre saisie.
|
||||
error_10=Veuillez sélectionner le compte d’utilisateur correct.
|
||||
error_100=Le téléchargement du certificat est impossible. Le certificat existe déjà. Veuillez contacter votre service d’assistance.
|
||||
error_101=L’adresse e-mail saisie n’est pas valable.
|
||||
error_11=Veuillez utiliser un autre certificat ou vous connecter au moyen d’un autre type de facteur d’authentification.
|
||||
error_2=Veuillez sélectionner un autre nom d’utilisateur.
|
||||
error_3=Votre compte sera bloqué si la prochaine tentative d’authentification échoue.
|
||||
error_4=Votre nouveau mot de passe n’est pas conforme à la politique de sécurité. Veuillez choisir un autre mot de passe.
|
||||
error_5=Erreur de confirmation du mot de passe
|
||||
error_50=Le nouveau mot de passe est trop court.
|
||||
error_55=Le nouveau mot de passe doit être différent des précédents.
|
||||
error_6=Changement de mot de passe requis.
|
||||
error_7=Changement d’identifiant de connexion requis.
|
||||
error_8=Votre compte a été bloqué en raison de plusieurs échecs d’authentification.
|
||||
error_81=Aucune carte d’accès n’a été trouvée, l’accès depuis Internet est refusé.
|
||||
error_83=Votre carte d’accès n’est plus valable. Veuillez contacter votre conseiller pour obtenir une nouvelle carte d’accès.
|
||||
error_9=La reprise de session a échoué.
|
||||
error_97=Vous n’êtes pas autorisé à accéder à cette ressource.
|
||||
error_98=Votre compte a été bloqué.
|
||||
error_99=Problèmes de système. Veuillez réessayer plus tard.
|
||||
error_9901=Vous devez disposer d’un lien d’enregistrement valable pour accéder à cette page.
|
||||
error_9902=L’adresse e-mail utilisée pour l’authentification ne correspond pas à celle qui est renseignée dans AGOV operations. Veuillez demander un nouveau lien d’enregistrement.
|
||||
error_9903=Le fournisseur d’identité utilisé ne nous a pas envoyé d’assertion valide. Assurez-vous d’utiliser le bon fournisseur d’identité. Demandez un nouveau lien d’enregistrement au service d’assistance.
|
||||
error_9904=Le lien que vous avez suivi n’est plus valable. Veuillez vous assurer que vous utilisez le dernier lien que vous avez reçu d’AGOV operations. Demandez un nouveau lien si le problème persiste.
|
||||
error_9905=Il y a un problème avec votre compte AGOV operations. Veuillez contacter le service d’assistance.
|
||||
error_9909=Un problème interne s’est produit. Veuillez demander un nouveau lien d’enregistrement au service d’assistance.
|
||||
errors.duplicateValue=Votre compte est déjà lié à un autre accès à AGOV operations.
|
||||
fido2_auth.cancel.fido=L'authentification avec la clé de sécurité a été interrompue. Veuillez vous assurer que votre clé FIDO est enregistrée et que votre adresse e-mail est correcte, puis suivez les étapes ci-dessous.
|
||||
fido2_auth.instruction1=Cliquez sur "Continuer"
|
||||
fido2_auth.instruction2=Une fenêtre d'authentification s'affichera
|
||||
fido2_auth.instruction3=Suivez les instructions
|
||||
fido2_auth.skipInstructions=Passer les instructions la fois suivante
|
||||
fido2_auth.switchLogin=S'AUTHENTIFIER AVEC
|
||||
footer.link=https://agov.ch
|
||||
footer.link.label=Contact
|
||||
footer.text=Service d'authentification des autorités suisses AGOV - une collaboration entre les cantons, leurs communes et l'administration fédérale. -
|
||||
general.AGOVAccessApp=Application AGOV access
|
||||
general.accessApp=Application AGOV access
|
||||
general.authenticate=Authentification
|
||||
general.back=Retour
|
||||
general.cancel=Annuler
|
||||
general.confirm=Confirmer
|
||||
general.contactSupport=Contacter le service d'assistance
|
||||
general.continue=Continuer
|
||||
general.edit=Editer
|
||||
general.email=E-mail
|
||||
general.email.address=Adresse e-mail
|
||||
general.entryCode=Entrer le code
|
||||
general.fieldRequired=Champ requis.
|
||||
general.getStarted=Démarrer
|
||||
general.goAGOVHelp=Rendez-vous sur AGOV help
|
||||
general.goAccessApp=Login avec AGOV access
|
||||
general.help=Aide
|
||||
general.help.link=https://agov.ch/help
|
||||
general.login=Login
|
||||
general.loginSecurityKey=Démarrer la connexion avec la clé de sécurité
|
||||
general.or=OU
|
||||
general.otherOptions=AUTRES OPTIONS
|
||||
general.recovery=Récupération
|
||||
general.recovery.help.link=https://help.agov.ch/?c=100recovery
|
||||
general.recoveryCode.downloadPdf=Télécharger en format PDF
|
||||
general.recoveryCode.inputLabel=Code de récupération
|
||||
general.recoveryCode.repeatCodeError=Le code que vous avez saisi est incorrect. Veuillez vous assurer que vous l'avez enregistré correctement, puis essayer de le soumettre à nouveau.
|
||||
general.recoveryCode.repeatCodeModal.description=Un code de récupération perdu ou mal enregistré peut rendre la récupération de votre compte plus difficile. Pour vous assurer que vous avez correctement enregistré votre code, veuillez le répéter ci-dessous.
|
||||
general.recoveryCode.repeatCodeModal.title=Répéter le code de récupération
|
||||
general.recoveryCode.reveal=Révéler le code de récupération
|
||||
general.recoveryOngoing=Récupération en cours
|
||||
general.register=Créer un compte
|
||||
general.registerNow=Enregistrez-vous dès maintenant!
|
||||
general.registration=Enregistrement
|
||||
general.securityKey=Clé de sécurité
|
||||
general.skip.content=Passer au contenu principal
|
||||
general.wrongPhoneNumber=Veuillez saisir un numéro de téléphone valable
|
||||
generic.auth.error.message=Une interruption de service s’est produite. Nous nous employons à résoudre le problème.
|
||||
generic.auth.error.next.steps=Veuillez réessayer plus tard. Veuillez vous rendre sur AGOV help si le problème persiste.
|
||||
generic.auth.error.subtitle=Un problème s’est produit
|
||||
generic.auth.error.title=Erreur
|
||||
language.de=Deutsch
|
||||
language.en=English
|
||||
language.fr=Français
|
||||
language.it=Italiano
|
||||
languageDropdown.aria.label=Sélectionner la langue
|
||||
loainfo.description.200=Pour accéder à l'application, nous devons vérifier vos données. Ce processus peut prendre jusqu'à 2 ou 3 jours.
|
||||
loainfo.description.300=Pour accéder à l'application, nous devons vérifier vos données par le biais de l'une des deux procédures suivantes. Vous pouvez choisir la procédure que vous préférez à l'étape suivante.
|
||||
loainfo.description.400=Veuillez saisir votre numéro AVS pour accéder à l'application.
|
||||
loainfo.helper=Vos données doivent être vérifiées!
|
||||
loainfo.later=Plus tard
|
||||
loainfo.startNow=Voulez-vous commencer le processus maintenant?
|
||||
loainfo.startVerification=Démarrer la vérification
|
||||
loainfo.title=Vérifiez vos données
|
||||
mauth_usernameless.EID=Continuer avec l'e-ID suisse
|
||||
mauth_usernameless.banner.error=Authentification interrompue.<br>Veuillez réessayer lorsque la page sera rechargée.
|
||||
mauth_usernameless.banner.info=Scan réussi!<br> Veuillez continuer dans l'application AGOV access.
|
||||
mauth_usernameless.banner.success=Authentification réussie!<br>Veuillez attendre d'être connecté.
|
||||
mauth_usernameless.cannotLogin=Avez-vous perdu l'accès à votre application / votre clé de sécurité ?
|
||||
mauth_usernameless.hideQR=Cacher le code QR
|
||||
mauth_usernameless.instructions=Connectez-vous en scannant le code QR avec l'application AGOV access
|
||||
mauth_usernameless.noAccount=Vous n'avez pas encore d'AGOV-Login ?
|
||||
mauth_usernameless.showQR=Afficher le code QR
|
||||
mauth_usernameless.startRecovery=Commencer la récupération du compte
|
||||
mauth_usernameless.useSecurityKey=Utiliser une clé de sécurité pour se connecter
|
||||
mauth_usernameless.useSecurityKeyInfo=Une clé de sécurité physique offre un moyen sûr de se connecter sans devoir utiliser son téléphone.
|
||||
op-admin.login=Administration de l’accès à AGOV op
|
||||
op-admin.login.intro.message=Connectez-vous avec votre nom d’utilisateur et votre mot de passe
|
||||
op-admin.login.loginid=Identifiant de connexion
|
||||
op-admin.login.password=Mot de passe
|
||||
op-admin.login.title=Connexion
|
||||
op-admin.logout=Administration de l’accès à AGOV op
|
||||
op-admin.logout.message=Vous vous êtes déconnecté avec succès.
|
||||
op-admin.logout.title=Déconnexion
|
||||
op-admin.pwchange.intro.message=Changement de mot de passe requis
|
||||
op-admin.pwchange.newpassword=Nouveau mot de passe
|
||||
op-admin.pwchange.newpassword2=Répéter le nouveau mot de passe
|
||||
op-admin.pwchange.password=Mot de passe actuel
|
||||
op-admin.pwchange.title=Changer de mot de passe
|
||||
op-idmlogin.role.accs-mgmt-idm=Gestion des droits d'accès IDM
|
||||
op-idmlogin.role.accs-mgmt-nonidm=Gestion des droits d'accès
|
||||
op-idmlogin.role.idmcfg-mgmt=Mise en place de l'IDM
|
||||
op-idmlogin.role.readonly-access=Accès par défaut (lecture seule)
|
||||
op-idmlogin.role.support-basic=Cas de support (récupération, ...)
|
||||
op-idmlogin.role.support-priv=Support de 3ème niveau (archivage, désinscription)
|
||||
op-idmlogin.role.usr-mgmt=Gestion des utilisateurs (opérations)
|
||||
op-idmlogin.role.usr-unit-mgmt=Gestion des utilisateurs et des organisations (opérations)
|
||||
op-idmlogin.select=AGOV idm
|
||||
op-idmlogin.select.intro=Veuillez sélectionner l’un des profils ci-dessous...
|
||||
op-idmlogin.select.note=Les profils marqués d'un * ne doivent être utilisés que s'ils sont nécessaires pour des tâches spécifiques de support ou de mise en production.
|
||||
op-idmlogin.select.title=Séléction du profil
|
||||
op-onboarding.done.message=L’enregistrement a été effectué avec succès. Vous disposez maintenant d’un accès à AGOV operations. Veuillez fermer le navigateur avant d’accéder à AGOV operations.
|
||||
op-onboarding.done.title=TERMINÉ
|
||||
op-onboarding.failed.title=ERREUR
|
||||
op-onboarding.intro.message1=Pour terminer l’enregistrement de votre accès à AGOV operations, vous devez disposer d’un compte AGOV ou d’un compte FED-LOGIN.
|
||||
op-onboarding.intro.message2=Après avoir cliqué sur "Continuer", vous serez redirigé vers l’authentification.
|
||||
op-onboarding.intro.message3=Si vous utilisez AGOV et que votre compte n’a pas encore atteint le niveau de qualité d’authentification requis, vous aurez la possibilité de démarrer la vérification d’identité nécessaire pour l’atteindre.
|
||||
op-onboarding.intro.title=DÉMARRER
|
||||
op-onboarding.onboarding=Enregistrement de l’accès à AGOV op
|
||||
op-onboarding.process.message=Un problème s’est produit. Veuillez contacter le service d’assistance AGOV afin de demander un nouveau lien d’enregistrement.
|
||||
providePhoneNumber.banner=Ce numéro de téléphone doit pouvoir recevoir des SMS.<br>Ce numéro de téléphone ne sera pas utilisé pour vous contacter.
|
||||
providePhoneNumber.description=AGOV prend désormais en charge la récupération avec votre numéro de téléphone. Cela vous permettra de vous envoyer un SMS pendant la récupération si vous avez perdu l'accès à votre code de récupération.
|
||||
providePhoneNumber.errorBanner=Les numéros de téléphone fournies ne correspondent pas. Veuillez réessayer.
|
||||
providePhoneNumber.inputLabel=Numéro de téléphone (facultatif)
|
||||
providePhoneNumber.laterModal.description1=Sans numéro de téléphone, la récupération de votre compte peut prendre jusqu'à 4 jours si vous perdez l'accès à votre code de récupération.
|
||||
providePhoneNumber.laterModal.description2=Ajouter un numéro de téléphone vous permet de récupérer votre compte en quelques minutes.
|
||||
providePhoneNumber.laterModal.description3=Ce numéro de téléphone ne sera pas utilisé pour vous contacter.
|
||||
providePhoneNumber.laterModal.title=Continuer sans numéro de téléphone ?
|
||||
providePhoneNumber.modal.description=Un numéro de téléphone mal enregistré peut rendre plus difficile la récupération de votre compte. Pour vous assurer que vous avez correctement enregistré votre numéro de téléphone, veuillez le répéter ci-dessous.
|
||||
providePhoneNumber.modal.inputLabel=Numéro de téléphone
|
||||
providePhoneNumber.modal.title=Répéter votre numéro de téléphone
|
||||
providePhoneNumber.saveButtonText=Sauvegarder
|
||||
providePhoneNumber.title=Ajouter le numéro de téléphone
|
||||
recovery_accessapp_auth.accessAppRegistered=L'application AGOV access est déjà enregistrée
|
||||
recovery_accessapp_auth.instruction1=Vous avez déjà enregistré une nouvelle AGOV access app !!!ACCESS_APP_NAME!!! dans le cadre du processus de récupération.
|
||||
recovery_accessapp_auth.instruction2=Veuillez utiliser !!!ACCESS_APP_NAME!!! pour vous identifier.
|
||||
recovery_check_code.banner.lockedError=Trop de saisies erronées. Veuillez réessayer dans quelques minutes.
|
||||
recovery_check_code.codeIncorrect=Le code saisi est incorrect. Veuillez réessayer.
|
||||
recovery_check_code.enterRecoveryCode=Saisir le code de récupération
|
||||
recovery_check_code.instruction=Veuillez saisir votre code de récupération à douze chiffres. Lors de votre inscription, vous avez reçu le code de récupération sous la forme d’un fichier PDF ou dans AGOV me.
|
||||
recovery_check_code.invalid.code=Le code est invalide
|
||||
recovery_check_code.invalid.code.required=Code requis
|
||||
recovery_check_code.invalid.code.tooLong=Le code est trop long
|
||||
recovery_check_code.noAccess=Je n’ai pas accès à mon code de récupération
|
||||
recovery_check_code.noCodeAccess=Êtes-vous sûr de ne pas avoir accès à votre code de récupération ?
|
||||
recovery_check_code.noCodeAccessInstructions=En cas de perte de votre code de récupération, veuillez vous rendre sur AGOV help et contacter le service d’assistance AGOV. Un agent pourra vous aider dans le processus de récupération.
|
||||
recovery_check_code.too_many_tries.instruction1=Le code de récupération que vous avez saisi a peut-être expiré ou vous avez peut-être essayé de le saisir trop de fois.
|
||||
recovery_check_code.too_many_tries.instruction2=Veuillez vous rendre sur AGOV help et contacter le service d’assistance. Un agent pourra vous aider dans le processus de récupération.
|
||||
recovery_check_noCode.banner.error=Trop de tentatives.
|
||||
recovery_check_noCode.instruction1=Vous avez peut-être essayé de saisir le code de récupération trop de fois.
|
||||
recovery_check_noCode.instruction2=Veuillez fermer le navigateur web et recommencer la récupération du compte dans dix minutes à partir de <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.
|
||||
recovery_code.banner.error=Veuillez indiquer votre nouveau code pour pouvoir continuer.
|
||||
recovery_code.instruction=Les codes de récupération vous permettent d'accéder à votre compte au cas où vous auriez perdu tous vos identifiants. Conservez le code de récupération en lieu sûr.
|
||||
recovery_code.newRecoveryCode=Introduction du code de récupération
|
||||
recovery_code.validUntil=Valable jusqu'au:
|
||||
recovery_fidokey_auth.button=Démarrer l'authentification par clé de sécurité
|
||||
recovery_fidokey_auth.fidoInstruction=Cliquez sur "Démarrer l'enregistrement de la clé"
|
||||
recovery_fidokey_auth.instruction1=Vous avez déjà enregistré une nouvelle clé de sécurité !!!SECURITY_KEY_NAME!!! dans le cadre du processus de récupération.
|
||||
recovery_fidokey_auth.instruction2=Veuillez utiliser !!!SECURITY_KEY_NAME!!! pour suivre les étapes ci-dessous afin de vous identifier.
|
||||
recovery_fidokey_auth.keyRegistered=Clé de sécurité déjà enregistrée
|
||||
recovery_intro_email.banner.error=Le lien que vous avez utilisé a expiré. Veuillez saisir votre adresse e-mail pour recevoir un nouveau lien.
|
||||
recovery_intro_email.banner.info=Veuillez saisir votre adresse e-mail. Nous vous enverrons un e-mail vous permettant de démarrer le processus de récupération.
|
||||
recovery_intro_email.important=Important:
|
||||
recovery_intro_email.process=Le processus de récupération ne doit être utilisé que si vous avez perdu l'accès à vos facteurs de connexion (application AGOV access supprimée, clé de sécurité perdue, téléphone perdu, etc.).
|
||||
recovery_intro_email_sent.banner.button=Vous n’avez pas reçu l'email?
|
||||
recovery_intro_email_sent.banner.success=Merci! Vous recevrez dans un instant un e-mail contenant un lien de récupération et des instructions.
|
||||
recovery_on_going.finishRecovery=Terminer la récupération
|
||||
recovery_on_going.instruction=Vous n’avez pas encore terminé le processus de récupération. Dans le cadre du processus de récupération, votre identité peut faire l’objet d’une vérification. Pour accéder à des applications au moyen de votre identifiant AGOV, vous devez terminer la vérification d’identité.
|
||||
recovery_on_going.title=Veuillez terminer le processus de récupération.
|
||||
recovery_questionnaire_instructions.banner.info=Veuillez noter que dans certains cas, vous devez avoir accès à votre code de récupération pour que la récupération soit réussie.
|
||||
recovery_questionnaire_instructions.explanation=D'après vos réponses, une récupération de l'identifiant AGOV-Login semble nécessaire. Veuillez cliquer sur continuer et suivre les instructions à l'écran.
|
||||
recovery_questionnaire_instructions.instruction1=Fournissez l'adresse électronique de votre compte afin que nous puissions vous envoyer un lien pour commencer le processus de récupération
|
||||
recovery_questionnaire_instructions.instruction2=Suivez les étapes pour récupérer votre compte (les étapes varient en fonction du niveau de vérification de votre compte)
|
||||
recovery_questionnaire_loginfactor.banner.error=Veuillez choisir une réponse.
|
||||
recovery_questionnaire_loginfactor.no=Non
|
||||
recovery_questionnaire_loginfactor.question=Avez-vous enregistré plus d'un facteur d'authentification (application AGOV access ou clé de sécurité) sur votre compte ?
|
||||
recovery_questionnaire_loginfactor.yes=Oui
|
||||
recovery_questionnaire_no_recovery.explanation1=D'après vos réponses, l'option de récupération d'AGOV ne semble pas nécessaire pour l'instant.
|
||||
recovery_questionnaire_no_recovery.explanation2=Si vous avez besoin de plus amples informations, veuillez consulter <a class='link' href='https://agov.ch/help' target='_blank'>https://agov.ch/help</a> pour obtenir des articles de soutien.
|
||||
recovery_questionnaire_no_recovery.instruction1=Si vous rencontrez des difficultés pour vous connecter à une application, visitez <a class='link' href='https://agov.ch/me' target='_blank'>https://agov.ch/me</a> et vérifiez si vous pouvez vous connecter avec succès.
|
||||
recovery_questionnaire_no_recovery.instruction2=Si vous avez enregistré plusieurs facteurs de connexion mais que vous avez perdu l'accès à l'un d'entre eux, veuillez consulter <a class='link' href='https://agov.ch/me' target='_blank'>https://agov.ch/me</a> pour supprimer celui auquel vous avez perdu l'accès.
|
||||
recovery_questionnaire_reason_selection.answer1=Je n'arrive pas à me connecter, même si j'ai mon application / ma clé de sécurité
|
||||
recovery_questionnaire_reason_selection.answer10=J'ai perdu l'un de mes facteurs d'authentification (application AGOV access ou clé de sécurité)
|
||||
recovery_questionnaire_reason_selection.answer2=Je n'ai pas pu terminer mon inscription
|
||||
recovery_questionnaire_reason_selection.answer3=J'ai supprimé, réinstallé ou réinitialisé mon application d'accès AGOV
|
||||
recovery_questionnaire_reason_selection.answer4=J'ai perdu mon téléphone / clé de sécurité
|
||||
recovery_questionnaire_reason_selection.answer5=J'ai un nouveau téléphone et j'ai oublié de transférer mon application AGOV access
|
||||
recovery_questionnaire_reason_selection.answer6=J'ai oublié mon PIN pour l'application AGOV access
|
||||
recovery_questionnaire_reason_selection.answer7=J'ai mes clés de sécurité ou mes applications, mais j'ai du mal à me connecter
|
||||
recovery_questionnaire_reason_selection.answer8=J'ai perdu l'accès à toutes mes clés de sécurité et aux applications AGOV access
|
||||
recovery_questionnaire_reason_selection.answer9=J'ai des problèmes avec l'un de mes facteurs d'authentification (effacé, réinitialisé, PIN oublié)
|
||||
recovery_questionnaire_reason_selection.banner.error=Veuillez sélectionner un motif.
|
||||
recovery_questionnaire_reason_selection.instruction=Veuillez sélectionner la raison pour laquelle vous entamez le processus de récupération :
|
||||
recovery_start_info.banner.warning=Vous ne pourrez pas utiliser votre compte tant que le processus de récupération n'aura pas été terminé.
|
||||
recovery_start_info.instruction=Le processus de récupération nécessitera l’enregistrement d’un nouveau facteur d’authentification. Si votre compte contient des informations ayant déjà été vérifiées, il se peut que vous deviez les faire vérifier à nouveau pour terminer la récupération.
|
||||
recovery_start_info.title=Vous êtes sur le point de démarrer le processus de récupération.
|
||||
title=NEVIS SSO Portal
|
||||
title.login=Login
|
||||
user_input.invalid.email=Veuillez saisir un e-mail valable.
|
||||
user_input.invalid.email.required=Champ requis
|
||||
user_input.invalid.email.tooLong=La saisie est trop longue
|
|
@ -0,0 +1,219 @@
|
|||
|
||||
darkModeSwitch.aria.label=Attivare la modalità scura
|
||||
error_1=Verificare i dati inseriti.
|
||||
error_10=Scegliere l’account utente corretto.
|
||||
error_100=Impossibile caricare il certificato. Il certificato esiste già. Contattare l’help desk.
|
||||
error_101=L’e-mail inserita non è valida.
|
||||
error_11=Utilizzare un altro certificato o accedere con altre credenziali.
|
||||
error_2=Selezionare un altro nome di accesso.
|
||||
error_3=Se la prossima autenticazione fallisce, l’account sarà bloccato.
|
||||
error_4=La nuova password non rispetta le norme di sicurezza. Scegliere un’altra password.
|
||||
error_5=Errore nella conferma della password.
|
||||
error_50=La nuova password è troppo corta.
|
||||
error_55=La nuova password deve differire da quelle precedenti.
|
||||
error_6=È richiesta la modifica della password.
|
||||
error_7=È richiesta la modifica dell’ID di accesso.
|
||||
error_8=A causa dei ripetuti tentativi di autenticazione falliti, l’account è stato bloccato.
|
||||
error_81=Non è stata trovata alcuna carta di accesso; l’accesso da Internet è negato.
|
||||
error_83=La carta di accesso non è più valida. Per richiedere una nuova carta di accesso, contattare il responsabile.
|
||||
error_9=Takeover di sessione fallito.
|
||||
error_97=Accesso non autorizzato a questa risorsa.
|
||||
error_98=L’account è stato bloccato.
|
||||
error_99=Ci sono problemi di sistema. Riprovare più tardi.
|
||||
error_9901=Per accedere a questa pagina, è necessario un link di registrazione valido.
|
||||
error_9902=L’e-mail utilizzata per l’autenticazione non corrisponde a quella di AGOV operations. Richiedere un nuovo link di registrazione.
|
||||
error_9903=L’IdP utilizzato non ha inviato un’asserzione valida. Assicurarsi di utilizzare l’IdP corretto. Richiedere al supporto un nuovo link di registrazione.
|
||||
error_9904=Il link non è più valido. Assicurarsi di utilizzare il link più recente ricevuto in AGOV operations. Se il problema persiste, richiedere un nuovo link.
|
||||
error_9905=Si è verificato un problema con l’account AGOV operations. Contattare il supporto.
|
||||
error_9909=Si è verificato un errore interno. Richiedere al supporto un nuovo link di registrazione.
|
||||
errors.duplicateValue=Il suo account è già collegato ad un altro accesso operativo.
|
||||
fido2_auth.cancel.fido=L'autenticazione con la chiave di sicurezza è stata interrotta. Assicurarsi che la chiave FIDO sia registrata e che l'indirizzo e-mail sia corretto, poi seguire le istruzioni.
|
||||
fido2_auth.instruction1=Cliccare su "Continua"
|
||||
fido2_auth.instruction2=A breve si aprirà una finestra per l'autenticazione.
|
||||
fido2_auth.instruction3=Seguire le istruzioni.
|
||||
fido2_auth.skipInstructions=Non mostrare più le istruzioni
|
||||
fido2_auth.switchLogin=ACCEDERE CON
|
||||
footer.link=https://agov.ch
|
||||
footer.link.label=Contatto
|
||||
footer.text=Servizio di autenticazione delle autorità Svizzere AGOV - una collaborazione tra Cantoni, Comuni e l'Amministrazione federale. -
|
||||
general.AGOVAccessApp=App AGOV access
|
||||
general.accessApp=App AGOV access
|
||||
general.authenticate=Autentifica
|
||||
general.back=Indietro
|
||||
general.cancel=Annullare
|
||||
general.confirm=Confermare
|
||||
general.contactSupport=Contattare il supporto
|
||||
general.continue=Continuare
|
||||
general.edit=Modificare
|
||||
general.email=e-mail
|
||||
general.email.address=Indirizzo e-mail
|
||||
general.entryCode=Codice
|
||||
general.fieldRequired=Campo obbligatorio.
|
||||
general.getStarted=Iniziare
|
||||
general.goAGOVHelp=Vai ad AGOV help
|
||||
general.goAccessApp=Login con AGOV access
|
||||
general.help=Aiuto
|
||||
general.help.link=https://agov.ch/help
|
||||
general.login=Accedere
|
||||
general.loginSecurityKey=Iniziare il login con la chiave di sicurezza
|
||||
general.or=O
|
||||
general.otherOptions=ALTRE OPZIONI
|
||||
general.recovery=Ripristino
|
||||
general.recovery.help.link=https://help.agov.ch/?c=100recovery
|
||||
general.recoveryCode.downloadPdf=Salva come PDF
|
||||
general.recoveryCode.inputLabel=Codice di ripristino
|
||||
general.recoveryCode.repeatCodeError=Il codice inserito non è corretto. Assicurati di averlo memorizzato correttamente, quindi riprova a inviarlo.
|
||||
general.recoveryCode.repeatCodeModal.description=Un codice di ripristino perso o memorizzato in modo errato può rendere più difficile il recupero del tuo account. Per assicurarti di aver registrato correttamente il codice, inseriscilo di nuovo qui sotto.
|
||||
general.recoveryCode.repeatCodeModal.title=Ripeti il codice di ripristino
|
||||
general.recoveryCode.reveal=Mostri il codice di ripristino
|
||||
general.recoveryOngoing=Ripristino in corso
|
||||
general.register=Registrarsi
|
||||
general.registerNow=Si registri ora!
|
||||
general.registration=Registrazione
|
||||
general.securityKey=Chiave di sicurezza
|
||||
general.skip.content=Vai al contenuto principale
|
||||
general.wrongPhoneNumber=Inserire un numero di cellulare valido
|
||||
generic.auth.error.message=Si è verificata un’interruzione. Stiamo lavorando per ripristinare l’esercizio.
|
||||
generic.auth.error.next.steps=Riprovare più tardi. Se il problema persiste, consultare AGOV help.
|
||||
generic.auth.error.subtitle=Qualcosa non ha funzionato.
|
||||
generic.auth.error.title=Errore
|
||||
language.de=Deutsch
|
||||
language.en=English
|
||||
language.fr=Français
|
||||
language.it=Italiano
|
||||
languageDropdown.aria.label=Selezionare la lingua
|
||||
loainfo.description.200=Per accedere all'app è necessaria una verifica dei dati. La procedura può richiedere fino a 2–3 giorni lavorativi.
|
||||
loainfo.description.300=Per accedere all'app dobbiamo verificare i suoi dati tramite uno dei due processi. Al prossimo passaggio, può selezionare la procedura di verifica desiderata.
|
||||
loainfo.description.400=Per accedere all'applicazione è necessario inserire il numero AVS.
|
||||
loainfo.helper=I dati devono essere verificati!
|
||||
loainfo.later=Più tardi
|
||||
loainfo.startNow=Iniziare la procedura?
|
||||
loainfo.startVerification=Iniziare la verifica
|
||||
loainfo.title=Verificare i dati.
|
||||
mauth_usernameless.EID=Continuare con CH e-ID
|
||||
mauth_usernameless.banner.error=Autenticazione interrotta.<br>Riprovare dopo che la pagina si sarà ricaricata.
|
||||
mauth_usernameless.banner.info=La scansione è stata eseguita.<br>Continuare nell'app AGOV access.
|
||||
mauth_usernameless.banner.success=Autenticazione riuscita!<br>Aspettare di essere connessi.
|
||||
mauth_usernameless.cannotLogin=Ha perso l'accesso alla sua app/chiave di sicurezza?
|
||||
mauth_usernameless.hideQR=Nascondi il codice QR
|
||||
mauth_usernameless.instructions=Per accedere, scansionare il codice QR con l'app AGOV access.
|
||||
mauth_usernameless.noAccount=Non ha ancora un AGOV-Login ?
|
||||
mauth_usernameless.showQR=Visualizza il codice QR
|
||||
mauth_usernameless.startRecovery=Inizia il recupero dell'account
|
||||
mauth_usernameless.useSecurityKey=Accedere utilizzando una chiave di sicurezza.
|
||||
mauth_usernameless.useSecurityKeyInfo=Una chiave di sicurezza fisica permette di accedere in modo sicuro senza utilizzare un telefono.
|
||||
op-admin.login=AGOV op admin
|
||||
op-admin.login.intro.message=Accedere con nome utente e password
|
||||
op-admin.login.loginid=ID di accesso
|
||||
op-admin.login.password=Password
|
||||
op-admin.login.title=Accedere
|
||||
op-admin.logout=AGOV op admin
|
||||
op-admin.logout.message=La sessione è terminata.
|
||||
op-admin.logout.title=Disconnessione
|
||||
op-admin.pwchange.intro.message=È richiesta la modifica della password.
|
||||
op-admin.pwchange.newpassword=Nuova password
|
||||
op-admin.pwchange.newpassword2=Ripetere la nuova password
|
||||
op-admin.pwchange.password=Password attuale
|
||||
op-admin.pwchange.title=Modificare password
|
||||
op-idmlogin.role.accs-mgmt-idm=Gestione dei diritti di accesso IDM
|
||||
op-idmlogin.role.accs-mgmt-nonidm=Gestione dei diritti di accesso
|
||||
op-idmlogin.role.idmcfg-mgmt=Configurazione dell'IDM
|
||||
op-idmlogin.role.readonly-access=Accesso predefinito (sola lettura)
|
||||
op-idmlogin.role.support-basic=Casi di supporto (ripristino, ...)
|
||||
op-idmlogin.role.support-priv=Supporto di terzo livello (archiviazione, off-boarding)
|
||||
op-idmlogin.role.usr-mgmt=Gestione utenti (operazioni)
|
||||
op-idmlogin.role.usr-unit-mgmt=Gestione utenti e organizzazione (operazioni)
|
||||
op-idmlogin.select=AGOV idm
|
||||
op-idmlogin.select.intro=Si prega di selezionare uno dei seguenti profili...
|
||||
op-idmlogin.select.note=I profili contrassegnati con * devono essere utilizzati solo se richiesti per attività di supporto o rilascio specifiche.
|
||||
op-idmlogin.select.title=Selezione del profilo
|
||||
op-onboarding.done.message=La registrazione è riuscita. Ora l’accesso AGOV operations è pronto. Prima di accedere ad AGOV operations, chiudere il browser.
|
||||
op-onboarding.done.title=FINITO
|
||||
op-onboarding.failed.title=ERRORE
|
||||
op-onboarding.intro.message1=Per completare la registrazione per l'accesso AGOV operations, è necessario avere un account AGOV o FED-LOGIN.
|
||||
op-onboarding.intro.message2=Dopo aver cliccato su "Continua", si è reindirizzati al servizio di autenticazione.
|
||||
op-onboarding.intro.message3=Se utilizza AGOV e l’account non soddisfa ancora il livello richiesto AGOVaq, potrà avviare la verifica dell’identità richiesta.
|
||||
op-onboarding.intro.title=INIZIARE
|
||||
op-onboarding.onboarding=Registrazione AGOV op
|
||||
op-onboarding.process.message=Qualcosa non ha funzionato. Contattare il supporto AGOV e, se necessario, richiedere un nuovo link di registrazione.
|
||||
providePhoneNumber.banner=Il numero di telefono deve essere in grado di ricevere SMS.<br>Questo numero di telefono non sarà utilizzato per contattarti.
|
||||
providePhoneNumber.description=AGOV ora supporta il ripristino tramite il tuo numero di telefono. Questo ti permetterà di continuare con un SMS durante il ripristino se hai perso l'accesso al tuo codice di ripristino.
|
||||
providePhoneNumber.errorBanner=Il numero di telefono non corrispondono. Si prega di riprovare.
|
||||
providePhoneNumber.inputLabel=Numero di telefono (facoltativo)
|
||||
providePhoneNumber.laterModal.description1=Senza un numero di telefono, il recupero del tuo account potrebbe richiedere fino a 4 giorni se perdi l'accesso al codice di ripristino.
|
||||
providePhoneNumber.laterModal.description2=Aggiungere un numero di telefono ti aiuta a recuperare il tuo account in pochi minuti.
|
||||
providePhoneNumber.laterModal.description3=Questo numero di telefono non sarà utilizzato per contattarti.
|
||||
providePhoneNumber.laterModal.title=Continuare senza un numero di telefono?
|
||||
providePhoneNumber.modal.description=Un numero di telefono memorizzato in modo errato può rendere più difficile il recupero del tuo account. Per assicurarti di aver registrato correttamente il tuo numero di telefono, inseriscilo di nuovo qui sotto.
|
||||
providePhoneNumber.modal.inputLabel=Numero di telefono
|
||||
providePhoneNumber.modal.title=Ripetere il numero di telefono
|
||||
providePhoneNumber.saveButtonText=Salva
|
||||
providePhoneNumber.title=Aggiungi numero di telefono
|
||||
recovery_accessapp_auth.accessAppRegistered=App di accesso AGOV già registrata
|
||||
recovery_accessapp_auth.instruction1=Ha già registrato una nuova app AGOV access !!!SECURITY_KEY_NAME!!! come parte del processo di recupero.
|
||||
recovery_accessapp_auth.instruction2=Si prega di usare !!!ACCESS_APP_NAME!!! per l'identificazione.
|
||||
recovery_check_code.banner.lockedError=Troppi tentativi di inserimento non validi. Riprovare tra qualche minuto.
|
||||
recovery_check_code.codeIncorrect=Il codice inserito non è corretto. Riprovare.
|
||||
recovery_check_code.enterRecoveryCode=Inserisca il codice di recupero
|
||||
recovery_check_code.instruction=Inserire qui sotto il codice di ripristino a 12 caratteri alfanumerici. Ha ricevuto questo codice in un file PDF al momento della registration o in AGOV me.
|
||||
recovery_check_code.invalid.code=Il codice non è valido
|
||||
recovery_check_code.invalid.code.required=Codice richiesto
|
||||
recovery_check_code.invalid.code.tooLong=Il codice è troppo lungo
|
||||
recovery_check_code.noAccess=Non ho il mio codice.
|
||||
recovery_check_code.noCodeAccess=Conferma di non avere il codice di ripristino?
|
||||
recovery_check_code.noCodeAccessInstructions=Se non ha più il codice di ripristino, acceda ad AGOV help per contattare il supporto AGOV, che la assisterà nel processo di ripristino.
|
||||
recovery_check_code.too_many_tries.instruction1=Il codice di ripristino inserito può essere scaduto o è stato inserito troppe volte.
|
||||
recovery_check_code.too_many_tries.instruction2=Si prega di andare alla guida di AGOV aiuto per contattare un agente dell'assistenza. Saranno in grado di aiutarla con il processo di recupero.
|
||||
recovery_check_noCode.banner.error=Troppi tentativi.
|
||||
recovery_check_noCode.instruction1=Potresti aver tentato di inserire il codice di ripristino troppe volte.
|
||||
recovery_check_noCode.instruction2=Chiudi il browser web e inizia nuovamente il processo di ripristino dell'account tra dieci minuti da <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.
|
||||
recovery_code.banner.error=La preghiamo di rivelare il suo nuovo codice per poter continuare.
|
||||
recovery_code.instruction=Il codice di ripristino le aiuta ad accedere al suo conto in caso in cui lei abbia perso le credentiali di accesso. Per favore, conservi il codice di ripristino in un luogo sicuro.
|
||||
recovery_code.newRecoveryCode=Introduzione del codice di ripristino
|
||||
recovery_code.validUntil=Valido fino a:
|
||||
recovery_fidokey_auth.button=Iniziare l'authenticazione della chiave
|
||||
recovery_fidokey_auth.fidoInstruction=Cliccare su "Iniziare l'authenticazione della chiave"
|
||||
recovery_fidokey_auth.instruction1=Ha già registrato una nuova chiave di sicurezza !!!SECURITY_KEY_NAME!!! come parte del processo di recupero.
|
||||
recovery_fidokey_auth.instruction2=Si prega di usare !!!SECURITY_KEY_NAME!!! per poter seguire i passaggi seguenti per identificarti.
|
||||
recovery_fidokey_auth.keyRegistered=Chiave di sicurezza già registrata
|
||||
recovery_intro_email.banner.error=Il link utilizzato è scaduto. Per ricevere un nuovo link, inserire l’indirizzo e-mail.
|
||||
recovery_intro_email.banner.info=Per ricevere il link e avviare il processo di ripristino, inserire l’indirizzo e-mail.
|
||||
recovery_intro_email.important=Importante:
|
||||
recovery_intro_email.process=Il processo di ripristino deve essere utilizzato solo se ha perso l'accesso ai suoi fattori di accesso (app AGOV access eliminata, chiave di sicurezza persa, telefono smarrito, ecc.).
|
||||
recovery_intro_email_sent.banner.button=Non avete ricevuto l'e-mail?
|
||||
recovery_intro_email_sent.banner.success=Grazie! È stata inviata un’e-mail contenente il codice di ripristino e le istruzioni.
|
||||
recovery_on_going.finishRecovery=Completare il ripristino
|
||||
recovery_on_going.instruction=È in corso un processo di ripristino. Il processo di ripristino può includere una verifica dell’identità. Per accedere alle applicazioni con il proprio AGOV-Login, è necessario completare la verifica dell’identità.
|
||||
recovery_on_going.title=Completare il processo di ripristino.
|
||||
recovery_questionnaire_instructions.banner.info=Tenga presente che in alcuni casi è necessario utilizzare il codice di ripristino per un ripristino riuscito.
|
||||
recovery_questionnaire_instructions.explanation=In base alle sue risposte sembra essere necessario un ripristino AGOV-Login. Fare clic su Continua e seguire le istruzioni visualizzate sullo schermo.
|
||||
recovery_questionnaire_instructions.instruction1=Si prega di fornire l'indirizzo email del suo account in modo di poter inviarle un link per iniziare il processo di recupero
|
||||
recovery_questionnaire_instructions.instruction2=Si prega di seguire i passaggi per recuperare il suo account (i passaggi varieranno a seconda del livello di verifica dell'account)
|
||||
recovery_questionnaire_loginfactor.banner.error=Si prega di selezionare una risposta.
|
||||
recovery_questionnaire_loginfactor.no=No
|
||||
recovery_questionnaire_loginfactor.question=Ha registrato più di un fattore di accesso (app AGOV access o chiave di sicurezza) al suo account?
|
||||
recovery_questionnaire_loginfactor.yes=Si
|
||||
recovery_questionnaire_no_recovery.explanation1=In base alle sue risposte, l'opzione di ripristino AGOV non sembra necessaria al momento.
|
||||
recovery_questionnaire_no_recovery.explanation2=Se ha bisogno di ulteriori informazioni, visiti <a class='link' href='https://agov.ch/help' target='_blank'>https://agov.ch/help</a> per articoli di supporto.
|
||||
recovery_questionnaire_no_recovery.instruction1=Se riscontra problemi di accesso a un'applicazione, visiti <a class='link' href='https://agov.ch/me' target='_blank'>https://agov.ch/me</a> e verifichi se può accedere con successo.
|
||||
recovery_questionnaire_no_recovery.instruction2=Se ha registrato più fattori di accesso ma ha perso l'accesso a uno di essi, visit <a class='link' href='https://agov.ch/me' target='_blank'>https://agov.ch/me</a> per rimuovere quello a cui ha perso l'accesso.
|
||||
recovery_questionnaire_reason_selection.answer1=Ho problemi ad accedere, anche se ho la mia app/chiave di sicurezza
|
||||
recovery_questionnaire_reason_selection.answer10=Ho perso uno dei miei fattori di accesso (app AGOV access o chiave di sicurezza)
|
||||
recovery_questionnaire_reason_selection.answer2=Non sono riuscito a completare la registrazione
|
||||
recovery_questionnaire_reason_selection.answer3=Ho eliminato, reinstallato o reimpostato la mia app AGOV access
|
||||
recovery_questionnaire_reason_selection.answer4=Ho perso il telefono/la chiave di sicurezza
|
||||
recovery_questionnaire_reason_selection.answer5=Ho un nuovo telefono e ho dimenticato di trasferire la mia app AGOV access
|
||||
recovery_questionnaire_reason_selection.answer6=Ho dimenticato il PIN dell'app AGOV access
|
||||
recovery_questionnaire_reason_selection.answer7=Ho i miei token di sicurezza o le mie app, ma ho avuto problemi ad accedere
|
||||
recovery_questionnaire_reason_selection.answer8=Ho perso l'accesso a tutte le mie chiavi di sicurezza e alle app AGOV access
|
||||
recovery_questionnaire_reason_selection.answer9=Ho problemi con uno dei miei fattori di accesso (PIN cancellato, reimpostato, dimenticato)
|
||||
recovery_questionnaire_reason_selection.banner.error=Si prega di selezionare il motivo.
|
||||
recovery_questionnaire_reason_selection.instruction=Si prega di selezionare il motivo per cui sta avviando il processo di recupero:
|
||||
recovery_start_info.banner.warning=Non è possibile utilizzare l’account finché il processo di ripristino non sarà concluso.
|
||||
recovery_start_info.instruction=Durante il processo di ripristino sarà registrato un nuovo fattore di accesso. Se l’account contiene informazioni verificate, potrebbe essere necessario avviare un processo di verifica per completare il ripristino.
|
||||
recovery_start_info.title=Il processo di ripristino sta per iniziare.
|
||||
title=NEVIS SSO Portal
|
||||
title.login=Login
|
||||
user_input.invalid.email=Inserire un'e-mail valida.
|
||||
user_input.invalid.email.required=Campo obbligatorio
|
||||
user_input.invalid.email.tooLong=Il testo inserito è troppo lungo.
|
|
@ -0,0 +1,165 @@
|
|||
let baseURL; // base URL
|
||||
let statusToken; // used to check progress
|
||||
let dispatcherElement; // to display link or QR code
|
||||
let infoElement; // to display info text
|
||||
let errorElement; // to display error text
|
||||
|
||||
function addInput(form, name, value) {
|
||||
const input = document.createElement("input");
|
||||
input.name = name;
|
||||
input.value = value;
|
||||
form.appendChild(input);
|
||||
}
|
||||
|
||||
function submitStatus(status) {
|
||||
// we have to do a form POST instead of AJAX
|
||||
const form = document.createElement("form");
|
||||
form.method = "POST";
|
||||
form.style.display = "none";
|
||||
addInput(form, "status", status);
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
}
|
||||
|
||||
const Status = {
|
||||
_pollInterval: 2 * 1000, // Check every 2 seconds
|
||||
latest: null,
|
||||
|
||||
startPolling: function (token, uiCallback) {
|
||||
let interval = setInterval(async () => {
|
||||
await this._check(token).then(function (resp) {
|
||||
console.log("Polling status: %o", resp);
|
||||
uiCallback && uiCallback(resp, false);
|
||||
return Status.latest = resp;
|
||||
})
|
||||
.catch(function (err) {
|
||||
console.error("Error during polling: %o", err);
|
||||
return false;
|
||||
});
|
||||
if (Status.latest && (Status.latest.status === 'succeeded' || Status.latest.status === 'failed' || Status.latest.status === 'unknown')) {
|
||||
// Done!
|
||||
console.log('Latest status is: %o', this.latest);
|
||||
uiCallback && uiCallback(this.latest, true);
|
||||
clearInterval(interval);
|
||||
}
|
||||
}, this._pollInterval);
|
||||
},
|
||||
|
||||
_check: async function (token) {
|
||||
const payload = { statusToken: token };
|
||||
const response = await fetch(baseURL + 'api/v1/status', {
|
||||
method: 'POST',
|
||||
mode: 'cors',
|
||||
cache: 'no-cache',
|
||||
credentials: 'omit',
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json;charset=utf-8'
|
||||
},
|
||||
body: JSON.stringify(payload),
|
||||
redirect: 'follow',
|
||||
referrerPolicy: 'no-referrer'
|
||||
});
|
||||
|
||||
return await response.json();
|
||||
}
|
||||
};
|
||||
|
||||
function setDeepLinkLabel(button) {
|
||||
const text = document.getElementsByName('info.deeplink')[0].value;
|
||||
button.innerHTML = text;
|
||||
}
|
||||
|
||||
function messageScanQR() {
|
||||
const text = document.getElementsByName('info.qrcode')[0].value;
|
||||
infoElement.innerHTML = text;
|
||||
}
|
||||
|
||||
function messageCheckPhone() {
|
||||
const text = document.getElementsByName('info.check.phone')[0].value;
|
||||
infoElement.innerHTML = text;
|
||||
}
|
||||
|
||||
const Element = {
|
||||
|
||||
_elem: null, // QR code or deep link depending on device
|
||||
|
||||
show: function (appLink) {
|
||||
const userAgent = navigator.userAgent || navigator.vendor || window.opera;
|
||||
const isIphone = 'iPhone' === navigator.platform;
|
||||
const isAndroid = /android/i.test(userAgent) && /mobile/i.test(userAgent);
|
||||
if (isAndroid || isIphone) {
|
||||
this._elem = document.createElement('a');
|
||||
this._elem.setAttribute('href', appLink);
|
||||
this._elem.setAttribute('class', 'btn btn-primary');
|
||||
this._elem.setAttribute('target', '_blank');
|
||||
dispatcherElement.appendChild(this._elem);
|
||||
setDeepLinkLabel(this._elem);
|
||||
}
|
||||
else {
|
||||
const authenticationType = document.getElementsByName('authenticationType')[0].value;
|
||||
if (authenticationType == 'push') {
|
||||
messageCheckPhone();
|
||||
}
|
||||
else {
|
||||
messageScanQR();
|
||||
this._elem = document.createElement('canvas');
|
||||
dispatcherElement.appendChild(this._elem);
|
||||
var qrcode = new QRious({
|
||||
element: this._elem,
|
||||
foreground: "#168CA9",
|
||||
level: "M",
|
||||
size: 280,
|
||||
value: appLink
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
hide: function() {
|
||||
// hide the element which was shown
|
||||
if (this._elem != null) {
|
||||
this._elem.style.display = "none";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function authenticateUser(appLink) {
|
||||
Element.show(appLink);
|
||||
console.log('Starting Authentication Cloud status polling...');
|
||||
Status.startPolling(statusToken, (st, done) => {
|
||||
if (st.status === 'succeeded') {
|
||||
console.log('Authentication Cloud login done.');
|
||||
submitStatus('succeeded')
|
||||
}
|
||||
else if (st.status === 'failed') {
|
||||
// failed: The transaction failed, either by timeout or because the user did not accept.
|
||||
console.warn('Authentication Cloud login failed. User abort or timeout.');
|
||||
submitStatus('failed')
|
||||
}
|
||||
else if (st.status === 'unknown') {
|
||||
console.error('Authentication Cloud login failed. Unknown status.');
|
||||
submitStatus('unknown')
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function init() {
|
||||
|
||||
const form = document.getElementById('authcloud_login');
|
||||
|
||||
baseURL = form.url.value;
|
||||
statusToken = form.statusToken.value;
|
||||
|
||||
infoElement = document.getElementById('authcloud_info');
|
||||
errorElement = document.getElementById('authcloud_error');
|
||||
|
||||
dispatcherElement = document.getElementById('authcloud_dispatch');
|
||||
|
||||
const appLink = form.appLink.value;
|
||||
authenticateUser(appLink);
|
||||
}
|
||||
|
||||
window.onload = function() {
|
||||
init();
|
||||
};
|
|
@ -0,0 +1,154 @@
|
|||
let baseURL; // base URL
|
||||
let statusToken; // used to check progress
|
||||
let dispatcherElement; // to display link or QR code
|
||||
let infoElement; // to display info text
|
||||
let errorElement; // to display error text
|
||||
|
||||
function addInput(form, name, value) {
|
||||
const input = document.createElement("input");
|
||||
input.name = name;
|
||||
input.value = value;
|
||||
form.appendChild(input);
|
||||
}
|
||||
|
||||
function submitStatus(status) {
|
||||
// we have to do a form POST instead of AJAX
|
||||
const form = document.createElement("form");
|
||||
form.method = "POST";
|
||||
form.style.display = "none";
|
||||
addInput(form, "status", status);
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
}
|
||||
|
||||
const Status = {
|
||||
_pollInterval: 2 * 1000, // Check every 2 seconds
|
||||
latest: null,
|
||||
|
||||
startPolling: function (token, uiCallback) {
|
||||
let interval = setInterval(async () => {
|
||||
await this._check(token).then(function (resp) {
|
||||
console.log("Polling status: %o", resp);
|
||||
uiCallback && uiCallback(resp, false);
|
||||
return Status.latest = resp;
|
||||
})
|
||||
.catch(function (err) {
|
||||
console.error("Error during polling: %o", err);
|
||||
return false;
|
||||
});
|
||||
if (Status.latest && (Status.latest.status === 'succeeded' || Status.latest.status === 'failed' || Status.latest.status === 'unknown')) {
|
||||
// Done!
|
||||
console.log('Latest status is: %o', this.latest);
|
||||
uiCallback && uiCallback(this.latest, true);
|
||||
clearInterval(interval);
|
||||
}
|
||||
}, this._pollInterval);
|
||||
},
|
||||
|
||||
_check: async function (token) {
|
||||
const payload = { statusToken: token };
|
||||
const response = await fetch(baseURL + 'api/v1/status', {
|
||||
method: 'POST',
|
||||
mode: 'cors',
|
||||
cache: 'no-cache',
|
||||
credentials: 'omit',
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json;charset=utf-8'
|
||||
},
|
||||
body: JSON.stringify(payload),
|
||||
redirect: 'follow',
|
||||
referrerPolicy: 'no-referrer'
|
||||
});
|
||||
|
||||
return await response.json();
|
||||
}
|
||||
};
|
||||
|
||||
function setDeepLinkLabel(button) {
|
||||
const text = document.getElementsByName('info.deeplink')[0].value;
|
||||
button.innerHTML = text;
|
||||
}
|
||||
|
||||
function messageScanQR() {
|
||||
const text = document.getElementsByName('info.qrcode')[0].value;
|
||||
infoElement.innerHTML = text;
|
||||
}
|
||||
|
||||
const Element = {
|
||||
|
||||
_elem: null, // QR code or deep link depending on device
|
||||
|
||||
show: function (appLink) {
|
||||
const userAgent = navigator.userAgent || navigator.vendor || window.opera;
|
||||
const isIphone = 'iPhone' === navigator.platform;
|
||||
const isAndroid = /android/i.test(userAgent) && /mobile/i.test(userAgent);
|
||||
if (isAndroid || isIphone) {
|
||||
this._elem = document.createElement('a');
|
||||
this._elem.setAttribute('href', appLink);
|
||||
this._elem.setAttribute('class', 'btn btn-primary');
|
||||
this._elem.setAttribute('target', '_blank');
|
||||
dispatcherElement.appendChild(this._elem);
|
||||
setDeepLinkLabel(this._elem);
|
||||
}
|
||||
else {
|
||||
messageScanQR();
|
||||
this._elem = document.createElement('canvas');
|
||||
dispatcherElement.appendChild(this._elem);
|
||||
var qrcode = new QRious({
|
||||
element: this._elem,
|
||||
foreground: "#168CA9",
|
||||
level: "M",
|
||||
size: 280,
|
||||
value: appLink
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
hide: function() {
|
||||
// hide the element which was shown
|
||||
if (this._elem != null) {
|
||||
this._elem.style.display = "none";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function onboardUser(appLink) {
|
||||
Element.show(appLink);
|
||||
console.log('Starting Authentication Cloud status polling...');
|
||||
Status.startPolling(statusToken, (st, done) => {
|
||||
if (st.status === 'succeeded') {
|
||||
console.log('Authentication Cloud onboarding done.');
|
||||
submitStatus('succeeded')
|
||||
}
|
||||
else if (st.status === 'failed') {
|
||||
// failed: The transaction failed, either by timeout or because the user did not accept.
|
||||
console.warn('Authentication Cloud onboarding failed. User abort or timeout.');
|
||||
submitStatus('failed')
|
||||
}
|
||||
else if (st.status === 'unknown') {
|
||||
console.error('Authentication Cloud onboarding failed. Unknown status.');
|
||||
submitStatus('unknown')
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function init() {
|
||||
|
||||
const form = document.getElementById('authcloud_onboard');
|
||||
|
||||
baseURL = form.url.value;
|
||||
statusToken = form.statusToken.value;
|
||||
|
||||
infoElement = document.getElementById('authcloud_info');
|
||||
errorElement = document.getElementById('authcloud_error');
|
||||
|
||||
dispatcherElement = document.getElementById('authcloud_dispatch');
|
||||
|
||||
const appLink = form.appLink.value;
|
||||
onboardUser(appLink);
|
||||
}
|
||||
|
||||
window.onload = function() {
|
||||
init();
|
||||
};
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
* Base64URL-ArrayBuffer
|
||||
* https://github.com/herrjemand/Base64URL-ArrayBuffer
|
||||
*
|
||||
* Copyright (c) 2017 Yuriy Ackermann <ackermann.yuriy@gmail.com>
|
||||
* Copyright (c) 2012 Niklas von Hertzen
|
||||
* Licensed under the MIT license.
|
||||
*
|
||||
*/
|
||||
(function() {
|
||||
"use strict";
|
||||
|
||||
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
||||
|
||||
// Use a lookup table to find the index.
|
||||
var lookup = new Uint8Array(256);
|
||||
for (var i = 0; i < chars.length; i++) {
|
||||
lookup[chars.charCodeAt(i)] = i;
|
||||
}
|
||||
|
||||
var encode = function(arraybuffer) {
|
||||
var bytes = new Uint8Array(arraybuffer),
|
||||
i, len = bytes.length, base64 = "";
|
||||
|
||||
for (i = 0; i < len; i+=3) {
|
||||
base64 += chars[bytes[i] >> 2];
|
||||
base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];
|
||||
base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];
|
||||
base64 += chars[bytes[i + 2] & 63];
|
||||
}
|
||||
|
||||
if ((len % 3) === 2) {
|
||||
base64 = base64.substring(0, base64.length - 1);
|
||||
} else if (len % 3 === 1) {
|
||||
base64 = base64.substring(0, base64.length - 2);
|
||||
}
|
||||
|
||||
return base64;
|
||||
};
|
||||
|
||||
var decode = function(base64) {
|
||||
var bufferLength = base64.length * 0.75,
|
||||
len = base64.length, i, p = 0,
|
||||
encoded1, encoded2, encoded3, encoded4;
|
||||
|
||||
var arraybuffer = new ArrayBuffer(bufferLength),
|
||||
bytes = new Uint8Array(arraybuffer);
|
||||
|
||||
for (i = 0; i < len; i+=4) {
|
||||
encoded1 = lookup[base64.charCodeAt(i)];
|
||||
encoded2 = lookup[base64.charCodeAt(i+1)];
|
||||
encoded3 = lookup[base64.charCodeAt(i+2)];
|
||||
encoded4 = lookup[base64.charCodeAt(i+3)];
|
||||
|
||||
bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);
|
||||
bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
|
||||
bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);
|
||||
}
|
||||
|
||||
return arraybuffer;
|
||||
};
|
||||
|
||||
/**
|
||||
* Exporting and stuff
|
||||
*/
|
||||
if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
|
||||
module.exports = {
|
||||
'encode': encode,
|
||||
'decode': decode
|
||||
}
|
||||
|
||||
} else {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define([], function() {
|
||||
return {
|
||||
'encode': encode,
|
||||
'decode': decode
|
||||
}
|
||||
});
|
||||
} else {
|
||||
window.base64url = {
|
||||
'encode': encode,
|
||||
'decode': decode
|
||||
}
|
||||
}
|
||||
}
|
||||
})();
|
|
@ -0,0 +1,222 @@
|
|||
/********************************************************
|
||||
* Layout
|
||||
********************************************************/
|
||||
|
||||
html { /* magic to position footer */
|
||||
position: relative;
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
margin-bottom: 76px; /* == footer height */
|
||||
}
|
||||
|
||||
.container, .container-fluid {
|
||||
padding-left: 36px;
|
||||
padding-right: 36px;
|
||||
}
|
||||
|
||||
nav {
|
||||
min-height: 100px;
|
||||
padding: 36px;
|
||||
}
|
||||
|
||||
header {
|
||||
margin-bottom: 16px; /* h1.logintitle adds 20px => 36px */
|
||||
}
|
||||
|
||||
.container {
|
||||
min-width: 260px;
|
||||
max-width: 700px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
|
||||
footer {
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
padding: 0 36px;
|
||||
}
|
||||
|
||||
img {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/********************************************************
|
||||
* Header
|
||||
********************************************************/
|
||||
|
||||
header .logo {
|
||||
/* width: 20%;*/
|
||||
/*max-width: 600px;*/
|
||||
max-height: 150px;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
/********************************************************
|
||||
* Dropdown
|
||||
********************************************************/
|
||||
a.dropdown-toggle {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.dropdown-toggle:hover {
|
||||
color: #168CA9;
|
||||
border-bottom: 3px solid #168CA9;
|
||||
}
|
||||
|
||||
.dropdown-menu {
|
||||
padding: 5px 0;
|
||||
}
|
||||
|
||||
.dropdown-menu li > a {
|
||||
padding: 6px 28px;
|
||||
}
|
||||
|
||||
.dropdown-menu a > .prefix {
|
||||
display: inline-block;
|
||||
min-width: 22px;
|
||||
margin-right: 28px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
/********************************************************
|
||||
* Form
|
||||
********************************************************/
|
||||
|
||||
/* Labels should not be bold */
|
||||
label {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
/* Make error messages bold */
|
||||
.has-error .help-block {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Change button size, by default 116px in width */
|
||||
.btn {
|
||||
min-width: 116px;
|
||||
padding: 3px 12px;
|
||||
}
|
||||
|
||||
/* Disable gradient in buttons, ughhhh */
|
||||
.btn.btn-primary {
|
||||
border-color: transparent;
|
||||
background-image: none;
|
||||
text-shadow: none;
|
||||
box-shadow: none;
|
||||
-webkit-box-shadow: none;
|
||||
}
|
||||
|
||||
.help-block a, .help-block a:visited {
|
||||
color: #168CA9;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.help-block a:hover {
|
||||
color: #168CA9;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/********************************************************
|
||||
* Footer
|
||||
********************************************************/
|
||||
footer .row {
|
||||
margin: 36px 0 0 0;
|
||||
height: 40px;
|
||||
padding-top: 14px;
|
||||
line-height: 26px; /* to center text: height - padding-top = 26px */
|
||||
border-top: 1px solid #168CA9;
|
||||
}
|
||||
|
||||
footer .row > div { /* Fix alignment between border + text on Bootstrap grid */
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
footer .logo-round-container {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
footer .logo-round {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: -33px; /* found visually with Chrome Dev Tools */
|
||||
height: 36px;
|
||||
width: 36px;
|
||||
border: 1px solid #00868c;
|
||||
border-radius: 18px;
|
||||
background: #fff;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
footer .logo-round > img {
|
||||
display: block;
|
||||
}
|
||||
|
||||
#dispatchTargets {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
/********************************************************
|
||||
* Social login
|
||||
********************************************************/
|
||||
.btn.line {
|
||||
background-color: transparent;
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin: 1.5em 0 1em;
|
||||
border: 0.5px solid #ccc;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.btn.socialLogin {
|
||||
background-color: #fff;
|
||||
border: thin solid #ccc;
|
||||
color: #000;
|
||||
font-weight: 600;
|
||||
position: relative;
|
||||
margin: 5px;
|
||||
min-width: 140px;
|
||||
width: 210px;
|
||||
border-radius: 8px;
|
||||
padding: 8px 12px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.socialLogin img {
|
||||
width: 1.5em;
|
||||
height: 108%;
|
||||
margin-right: 0.5em;
|
||||
}
|
||||
|
||||
.btn.apple img {
|
||||
width: 1.2em;
|
||||
}
|
||||
|
||||
/********************************************************
|
||||
* Show password
|
||||
********************************************************/
|
||||
.icon-inside {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.icon-inside input {
|
||||
padding-right: calc(0.75rem + 1.25rem + 0.75rem);
|
||||
}
|
||||
|
||||
.icon-inside button {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
margin-top: 0.45rem;
|
||||
margin-right: 0.45rem;
|
||||
background: #FFFFFF;
|
||||
border: #FFFFFF;
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
(function() {
|
||||
var closeDropdownTimeout;
|
||||
|
||||
function closeDropdown(event) {
|
||||
var dropdowns = document.querySelectorAll('.dropdown');
|
||||
for (var i = 0; i < dropdowns.length; i++) {
|
||||
var dropdownMenu = dropdowns[i].querySelector('.dropdown-menu');
|
||||
if (dropdownMenu.style.display !== 'none' && !dropdowns[i].contains(event.target)) {
|
||||
dropdownMenu.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
// remove event listener till we have a new dropdown menu open
|
||||
if (document.querySelector('.dropdown-menu:not([style*="display: none"])') === null) {
|
||||
document.removeEventListener('click', closeDropdown);
|
||||
}
|
||||
}
|
||||
|
||||
var dropdowns = document.querySelectorAll('.dropdown');
|
||||
for (var i = 0; i < dropdowns.length; i++) {
|
||||
var dropdownMenu = dropdowns[i].querySelector('.dropdown-menu');
|
||||
dropdownMenu.style.display = 'none'; // ensure menu is initially hidden
|
||||
|
||||
dropdowns[i].addEventListener('click', function(e) {
|
||||
// show dropdown menu
|
||||
var dropdownMenu = this.querySelector('.dropdown-menu');
|
||||
dropdownMenu.style.display = 'block';
|
||||
|
||||
// handle clicking away
|
||||
clearTimeout(closeDropdownTimeout);
|
||||
closeDropdownTimeout = setTimeout(function() {
|
||||
document.addEventListener('click', closeDropdown);
|
||||
}, 10);
|
||||
});
|
||||
}
|
||||
}());
|
|
@ -0,0 +1,98 @@
|
|||
var e2eenc = function() {
|
||||
|
||||
this.encryptForm = function(algoString, formId) {
|
||||
// TODO: in case of an error we should return false, to prevent the for to be submitted
|
||||
// or replace the fields with dummy values, just to prevent the the transmission
|
||||
// of unencrypted values
|
||||
|
||||
|
||||
// create the array of input fields to encrypt (needs to be done before setting the form
|
||||
// invisible
|
||||
var fieldsToEncrypt = new Array();
|
||||
$.each($("form input:visible"), function(index, _inputField) { fieldsToEncrypt.push($(_inputField));});
|
||||
|
||||
// hide the form, and display the splash screen
|
||||
$('#loginform').css('display','none');
|
||||
$('#e2eeSplashScreen').css('display','block');
|
||||
|
||||
// encryption logic
|
||||
var pubKey = $("input[name='e2eenc.publicKey']").val();
|
||||
|
||||
var kemSessionKey = readPublicKeyAndGenerateSessionKey(pubKey)
|
||||
var iv = forge.random.getBytesSync(16);
|
||||
keyB64 = forge.util.encode64(kemSessionKey.key);
|
||||
encapsulationB64 = forge.util.encode64(kemSessionKey.encapsulation);
|
||||
ivB64 = forge.util.encode64(iv);
|
||||
|
||||
//console.log("Encrypting form " + formId + " (" + algoString + ")");
|
||||
var fields = "";
|
||||
$.each(fieldsToEncrypt, function(index, _inputField) {
|
||||
var inputField = $(_inputField);
|
||||
if (inputField.attr("type") == "text" || inputField.attr("type") == "password") {
|
||||
//console.log("Encrypting field " + JSON.stringify(inputField));
|
||||
var plainValue = inputField.val();
|
||||
|
||||
var encryptedValueB64 = encrypt(kemSessionKey, iv, plainValue);
|
||||
//console.log("Setting encrypted value in b64: " + encryptedValueB64);
|
||||
inputField.val(encryptedValueB64);
|
||||
if (fields.length > 0) {
|
||||
fields = fields + ","
|
||||
}
|
||||
fields = fields + inputField.attr("name");
|
||||
}
|
||||
});
|
||||
$("input[name='e2eenc.iv']").val(ivB64);
|
||||
$("input[name='e2eenc.encapsulation']").val(encapsulationB64);
|
||||
$("input[name='e2eenc.fields']").val(fields);
|
||||
}
|
||||
|
||||
function getRSApublicKey(pem) {
|
||||
//console.log("PEM: " + pem);
|
||||
|
||||
var msg = forge.pem.decode(pem)[0];
|
||||
|
||||
//console.log("msg type: " + msg.type);
|
||||
|
||||
if(msg.procType && msg.procType.type === 'ENCRYPTED') {
|
||||
throw new Error('Could not retrieve RSA public key from PEM; PEM is encrypted.');
|
||||
}
|
||||
|
||||
// convert DER to ASN.1 object
|
||||
var asn1obj = forge.asn1.fromDer(msg.body);
|
||||
//console.log("ASN.1 obj: " + JSON.stringify(asn1obj))
|
||||
|
||||
var pubKey = forge.pki.publicKeyFromAsn1(asn1obj)
|
||||
//console.log("PubKey: " + JSON.stringify(pubKey))
|
||||
return pubKey;
|
||||
}
|
||||
|
||||
function generateKEMSessionKey(rsaPublicKey) {
|
||||
// generate key-derivation-function and initializes it with sha1
|
||||
var kdf1 = new forge.kem.kdf1(forge.md.sha1.create());
|
||||
// creates a KEM function based on the key-derivation-function created above
|
||||
var kem = forge.kem.rsa.create(kdf1);
|
||||
// generate and encapsulate a 16-byte secret key.
|
||||
// The secret key is generated using the kdf defined above.
|
||||
var kemSessionKey = kem.encrypt(rsaPublicKey, 16);
|
||||
// kemSessionKey has 'encapsulation' (= pub key) and 'key' (= generated secret key)
|
||||
return kemSessionKey;
|
||||
}
|
||||
|
||||
function readPublicKeyAndGenerateSessionKey(pem) {
|
||||
var rsaPublicKey = getRSApublicKey(pem);
|
||||
//console.log("PubKey: " + JSON.stringify(rsaPublicKey))
|
||||
var kemSessionKey = generateKEMSessionKey(rsaPublicKey);
|
||||
//console.log("KEM session key: " + JSON.stringify(kemSessionKey))
|
||||
return kemSessionKey;
|
||||
}
|
||||
|
||||
function encrypt(kemSessionKey, iv, msg) {
|
||||
var cipher = forge.cipher.createCipher('AES-CBC', kemSessionKey.key);
|
||||
cipher.start({iv: iv});
|
||||
cipher.update(forge.util.createBuffer(msg, 'utf-8'));
|
||||
cipher.finish();
|
||||
var encrypted = cipher.output.getBytes();
|
||||
encryptedB64 = forge.util.encode64(encrypted);
|
||||
return encryptedB64;
|
||||
}
|
||||
};
|
|
@ -0,0 +1,3 @@
|
|||
<svg width="22" height="20" viewBox="0 0 22 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M2 1L5.58916 4.58916M20 19L16.4112 15.4112M12.8749 16.8246C12.2677 16.9398 11.6411 17 11.0005 17C6.52281 17 2.73251 14.0571 1.45825 9.99997C1.80515 8.8955 2.33851 7.87361 3.02143 6.97118M8.87868 7.87868C9.42157 7.33579 10.1716 7 11 7C12.6569 7 14 8.34315 14 10C14 10.8284 13.6642 11.5784 13.1213 12.1213M8.87868 7.87868L13.1213 12.1213M8.87868 7.87868L5.58916 4.58916M13.1213 12.1213L5.58916 4.58916M13.1213 12.1213L16.4112 15.4112M5.58916 4.58916C7.14898 3.58354 9.00656 3 11.0004 3C15.4781 3 19.2684 5.94291 20.5426 10C19.8357 12.2507 18.3545 14.1585 16.4112 15.4112" stroke="#6D7C80" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
After Width: | Height: | Size: 769 B |
|
@ -0,0 +1,4 @@
|
|||
<svg width="22" height="16" viewBox="0 0 22 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M14 8C14 9.65685 12.6569 11 11 11C9.34315 11 8 9.65685 8 8C8 6.34315 9.34315 5 11 5C12.6569 5 14 6.34315 14 8Z" stroke="#6D7C80" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M1.45825 7.99997C2.73253 3.94288 6.52281 1 11.0004 1C15.4781 1 19.2684 3.94291 20.5426 8.00004C19.2684 12.0571 15.4781 15 11.0005 15C6.52281 15 2.73251 12.0571 1.45825 7.99997Z" stroke="#6D7C80" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
After Width: | Height: | Size: 585 B |
|
@ -0,0 +1,61 @@
|
|||
(function() {
|
||||
'use strict'
|
||||
|
||||
async function assertion(options) {
|
||||
let credential;
|
||||
try {
|
||||
credential = await navigator.credentials.get({ "publicKey": options });
|
||||
}
|
||||
// Cancel and timeout can occur besides error
|
||||
catch (error) {
|
||||
console.error(`Failed to get WebAuthn credential: ${error}`);
|
||||
throw error;
|
||||
}
|
||||
// as this is the last call we have to do a top-level request instead of AJAX
|
||||
const form = document.createElement("form");
|
||||
form.method = "POST";
|
||||
form.style.display = "none";
|
||||
addInput(form, "path", "/nevisfido/fido2/assertion/result")
|
||||
addInput(form, "id", credential.id);
|
||||
addInput(form, "type", credential.type);
|
||||
addInput(form, "response.clientDataJSON", base64url.encode(credential.response.clientDataJSON));
|
||||
addInput(form, "response.authenticatorData", base64url.encode(credential.response.authenticatorData));
|
||||
addInput(form, "response.signature", base64url.encode(credential.response.signature));
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
}
|
||||
|
||||
function authenticate() {
|
||||
// WebAuthn feature detection
|
||||
if (!isWebAuthnSupportedByTheBrowser()) {
|
||||
cancelFido2();
|
||||
return;
|
||||
};
|
||||
|
||||
const request = {};
|
||||
request.path = "/nevisfido/fido2/attestation/options";
|
||||
|
||||
// calling nevisFIDO through nevisAuth on current URL using AJAX
|
||||
fetch("", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(request)
|
||||
})
|
||||
.then(res => res.json())
|
||||
.then(options => {
|
||||
options.challenge = base64url.decode(options.challenge);
|
||||
options.allowCredentials = options.allowCredentials.map((c) => {
|
||||
c.id = base64url.decode(c.id);
|
||||
return c;
|
||||
});
|
||||
return assertion(options);
|
||||
}).catch((error) => {
|
||||
console.error(`Error during FIDO2 authentication: ${error}`);
|
||||
cancelFido2();
|
||||
});
|
||||
}
|
||||
|
||||
authenticate();
|
||||
})();
|
|
@ -0,0 +1,175 @@
|
|||
(function() {
|
||||
'use strict'
|
||||
|
||||
async function authenticate(username, params) {
|
||||
|
||||
try {
|
||||
const { authenticationOptionsEndpoint, authenticationEndpoint, statusServiceEndpoint, userVerification, originalResource, nevisAuthEndpoint } = params;
|
||||
const { startAuthentication } = SimpleWebAuthnBrowser;
|
||||
|
||||
// fetch authentication options from nevisFIDO and save the returned fido2SessionId for later use
|
||||
const authOptRespJson = await getAuthenticationOptions(username, userVerification, nevisAuthEndpoint);
|
||||
const fido2SessionId = authOptRespJson.fido2SessionId;
|
||||
|
||||
// do the client side authentication using the SimpleWebAuthn JS library
|
||||
const authRespJson = await startAuthentication(authOptRespJson);
|
||||
|
||||
// in case the authentication response does not contain a userHandle (e.g. virtual authenticators used in system tests)
|
||||
// then we have to obtain it (in our case it is the IDM extId) using the Status Service since at the moment nevisFIDO always expects it
|
||||
if (!authRespJson.response.userHandle) {
|
||||
const statusRespJson = await getFido2SessionStatus(fido2SessionId, statusServiceEndpoint);
|
||||
|
||||
if (statusRespJson && statusRespJson.userId) {
|
||||
console.log("adding userHandle: " + statusRespJson.userId);
|
||||
authRespJson.response.userHandle = btoa(statusRespJson.userId); // add missing userHandle
|
||||
}
|
||||
else {
|
||||
throw new Error('userHandle is missing and could not determine it using the status service');
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.log("userHandle already set: " + authRespJson.response.userHandle);
|
||||
}
|
||||
|
||||
// send the assertion response created by the authenticator to nevisFIDO
|
||||
const serverRespJson = await submitAssertion(authRespJson, authenticationEndpoint);
|
||||
|
||||
// checking the server response of nevisFIDO
|
||||
if ((!serverRespJson) || (serverRespJson && serverRespJson.status !== 'ok')) {
|
||||
let errorMessage = (serverRespJson && serverRespJson.errorMessage) ? serverRespJson.errorMessage : 'unexpected error';
|
||||
throw new Error('authentication failed: ' + errorMessage);
|
||||
}
|
||||
|
||||
// send a request to nevisAuth with the fido2SessionId in the header to trigger the synchronisation of the
|
||||
// nevisFIDO and nevisAuth sessions (FIDO2 AuthState -> SyncFido2SessionStatusHandler) to reach AUTH_DONE
|
||||
await updateNevisAuth(fido2SessionId, nevisAuthEndpoint);
|
||||
|
||||
console.log('authentication was successful');
|
||||
|
||||
console.log('reloading page...');
|
||||
window.location.reload();
|
||||
}
|
||||
catch (error) {
|
||||
console.error(`Error during FIDO2 authentication: ${error}`);
|
||||
cancelFido2();
|
||||
}
|
||||
};
|
||||
|
||||
async function getAuthenticationOptions(username, userVerification, authenticationOptionsEndpoint) {
|
||||
|
||||
const authOptReqJson = {
|
||||
'username': username,
|
||||
'userVerification': userVerification,
|
||||
};
|
||||
|
||||
const authOptReq = JSON.stringify(authOptReqJson);
|
||||
console.log('authOptReq ==> ' + authOptReq);
|
||||
|
||||
const authOptResp = await fetch(authenticationOptionsEndpoint, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: authOptReq,
|
||||
});
|
||||
|
||||
if (!authOptResp.ok) {
|
||||
throw new Error('authOptResp error: HTTP ' + authOptResp.status + ' ' + authOptResp.statusText);
|
||||
}
|
||||
|
||||
const authOptRespJson = await authOptResp.json()
|
||||
console.log('authOptResp <== ' + JSON.stringify(authOptRespJson));
|
||||
|
||||
return authOptRespJson;
|
||||
};
|
||||
|
||||
async function getFido2SessionStatus(fido2SessionId, statusServiceEndpoint) {
|
||||
|
||||
const statusReqJson = {
|
||||
'fido2SessionId': fido2SessionId,
|
||||
};
|
||||
|
||||
const statusReq = JSON.stringify(statusReqJson);
|
||||
console.log('statusReq ==> ' + statusReq);
|
||||
|
||||
const statusResp = await fetch(statusServiceEndpoint, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: statusReq,
|
||||
});
|
||||
|
||||
if (!statusResp.ok) {
|
||||
throw new Error('statusResp error: HTTP ' + statusResp.status + ' ' + statusResp.statusText);
|
||||
}
|
||||
|
||||
const statusRespJson = await statusResp.json();
|
||||
console.log('statusResp <== ' + JSON.stringify(statusRespJson));
|
||||
|
||||
return statusRespJson;
|
||||
}
|
||||
|
||||
async function submitAssertion(authRespJson, authenticationEndpoint) {
|
||||
|
||||
console.log("submitting assertion for userHandle: " + authRespJson.response.userHandle);
|
||||
|
||||
// TODO koenig 20230504: read btoa once nevisFIDO is adapted
|
||||
let encodedAuthResp = {
|
||||
"id": authRespJson.id,
|
||||
"response": {
|
||||
"authenticatorData": authRespJson.response.authenticatorData,
|
||||
"signature": authRespJson.response.signature,
|
||||
"userHandle": authRespJson.response.userHandle,
|
||||
"clientDataJSON": authRespJson.response.clientDataJSON
|
||||
},
|
||||
"type": authRespJson.type
|
||||
}
|
||||
|
||||
const authResp = JSON.stringify(encodedAuthResp);
|
||||
console.log('authResp ==> ' + authResp);
|
||||
|
||||
const serverResp = await fetch(authenticationEndpoint, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: authResp,
|
||||
});
|
||||
|
||||
if (!serverResp.ok) {
|
||||
throw new Error('submitAssertion error: HTTP ' + submitAssertion.status + ' ' + submitAssertion.statusText);
|
||||
}
|
||||
|
||||
const serverRespJson = await serverResp.json();
|
||||
console.log('serverResp <== ' + JSON.stringify(serverRespJson));
|
||||
|
||||
return serverRespJson;
|
||||
};
|
||||
|
||||
async function updateNevisAuth(fido2SessionId, nevisAuthEndpoint) {
|
||||
|
||||
console.log('updateNevisAuth ==> ' + fido2SessionId);
|
||||
|
||||
const updateNevisAuthResponse = await fetch(nevisAuthEndpoint, {
|
||||
method: 'GET',
|
||||
credentials: 'same-origin',
|
||||
headers: {
|
||||
'nevis-fido2-session-id': fido2SessionId,
|
||||
}
|
||||
});
|
||||
|
||||
if (!updateNevisAuthResponse.ok) {
|
||||
throw new Error('updateNevisAuthResponse error: HTTP ' + updateNevisAuthResponse.status + ' ' + updateNevisAuthResponse.statusText);
|
||||
}
|
||||
|
||||
console.log('updateNevisAuth <== OK');
|
||||
|
||||
return;
|
||||
};
|
||||
|
||||
// TODO koenig 20230206: we don't generate IDs into the HTML yet
|
||||
let username = document.getElementsByName("username")[0].value;
|
||||
params.nevisAuthEndpoint = window.location.href;
|
||||
authenticate(username, params);
|
||||
})();
|
|
@ -0,0 +1,70 @@
|
|||
function dispatch(name) {
|
||||
// we have to do a top-level request instead of AJAX
|
||||
const form = document.createElement("form");
|
||||
form.method = "POST";
|
||||
form.style.display = "none";
|
||||
addInput(form, name, "true");
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
}
|
||||
|
||||
async function attestation(options) {
|
||||
let credential;
|
||||
try {
|
||||
credential = await navigator.credentials.create({ "publicKey": options });
|
||||
}
|
||||
// cancel and timeout can occur besides error
|
||||
catch (error) {
|
||||
console.error(`Failed to create WebAuthn credential: ${error}`);
|
||||
throw error;
|
||||
}
|
||||
// as this is the last call we have to do a top-level request instead of AJAX
|
||||
const form = document.createElement("form");
|
||||
form.method = "POST";
|
||||
form.style.display = "none";
|
||||
addInput(form, "path", "/nevisfido/fido2/attestation/result")
|
||||
addInput(form, "id", credential.id);
|
||||
addInput(form, "type", credential.type);
|
||||
addInput(form, "response.clientDataJSON", base64url.encode(credential.response.clientDataJSON));
|
||||
addInput(form, "response.attestationObject", base64url.encode(credential.response.attestationObject));
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
}
|
||||
|
||||
function start() {
|
||||
|
||||
if (!isWebAuthnSupportedByTheBrowser()) {
|
||||
dispatch("unsupported");
|
||||
return;
|
||||
};
|
||||
|
||||
const request = {};
|
||||
request.path = "/nevisfido/fido2/attestation/options";
|
||||
|
||||
// calling nevisFIDO through nevisAuth on current URL using AJAX
|
||||
fetch("", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(request)
|
||||
})
|
||||
.then(res => res.json())
|
||||
.then(options => {
|
||||
options.user.id = base64url.decode(options.user.id);
|
||||
options.challenge = base64url.decode(options.challenge);
|
||||
if (options.excludeCredentials != null) {
|
||||
options.excludeCredentials = options.excludeCredentials.map((c) => {
|
||||
c.id = base64url.decode(c.id);
|
||||
return c;
|
||||
});
|
||||
}
|
||||
if (options.authenticatorSelection.authenticatorAttachment === null) {
|
||||
options.authenticatorSelection.authenticatorAttachment = undefined;
|
||||
}
|
||||
return attestation(options);
|
||||
}).catch((error) => {
|
||||
console.log('Error during FIDO2 onboarding: ' + error);
|
||||
dispatch("failed");
|
||||
});
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
function addInput(form, name, value) {
|
||||
const input = document.createElement("input");
|
||||
input.name = name;
|
||||
input.value = value;
|
||||
form.appendChild(input);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether WebAuthn is supported by the browser or not.
|
||||
* @return true if supported, false if it is not supported or not in secure context
|
||||
*/
|
||||
function isWebAuthnSupportedByTheBrowser() {
|
||||
if (window.isSecureContext) {
|
||||
// This feature is available only in secure contexts in some or all supporting browsers.
|
||||
if ('credentials' in navigator) {
|
||||
return true;
|
||||
}
|
||||
console.warn('Oh no! This browser does not support WebAuthn.');
|
||||
return false;
|
||||
}
|
||||
console.warn('WebAuthn feature is available only in secure contexts. For testing over HTTP, you can use the origin "localhost".');
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Trigger on cancel pattern of the FIDO2 authentication step.
|
||||
*
|
||||
* Provides an alternative when the user decides to
|
||||
* cancel the fido2 credential operation(create or fetch) or
|
||||
* the operation fails and the error cannot be handled.
|
||||
*/
|
||||
function cancelFido2() {
|
||||
// we have to do a top-level request instead of AJAX
|
||||
const form = document.createElement("form");
|
||||
form.method = "POST";
|
||||
form.style.display = "none";
|
||||
addInput(form, "cancel_fido2", "true");
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
<svg width="842" height="1e3" xmlns="http://www.w3.org/2000/svg"><path d="M702 960c-54.2 52.6-114 44.4-171 19.6-60.6-25.3-116-26.9-180 0-79.7 34.4-122 24.4-170-19.6-271-279-231-704 77-720 74.7 4 127 41.3 171 44.4 65.4-13.3 128-51.4 198-46.4 84.1 6.8 147 40 189 99.7-173 104-132 332 26.9 396-31.8 83.5-72.6 166-141 227zM423 237C414.9 113 515.4 11 631 1c15.9 143-130 250-208 236z"/></svg>
|
After Width: | Height: | Size: 386 B |
After Width: | Height: | Size: 2.4 KiB |
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg viewBox="0 0 24 24" width="24" height="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="matrix(1, 0, 0, 1, 27.009001, -39.238998)">
|
||||
<path fill="#4285F4" d="M -3.264 51.509 C -3.264 50.719 -3.334 49.969 -3.454 49.239 L -14.754 49.239 L -14.754 53.749 L -8.284 53.749 C -8.574 55.229 -9.424 56.479 -10.684 57.329 L -10.684 60.329 L -6.824 60.329 C -4.564 58.239 -3.264 55.159 -3.264 51.509 Z"/>
|
||||
<path fill="#34A853" d="M -14.754 63.239 C -11.514 63.239 -8.804 62.159 -6.824 60.329 L -10.684 57.329 C -11.764 58.049 -13.134 58.489 -14.754 58.489 C -17.884 58.489 -20.534 56.379 -21.484 53.529 L -25.464 53.529 L -25.464 56.619 C -23.494 60.539 -19.444 63.239 -14.754 63.239 Z"/>
|
||||
<path fill="#FBBC05" d="M -21.484 53.529 C -21.734 52.809 -21.864 52.039 -21.864 51.239 C -21.864 50.439 -21.724 49.669 -21.484 48.949 L -21.484 45.859 L -25.464 45.859 C -26.284 47.479 -26.754 49.299 -26.754 51.239 C -26.754 53.179 -26.284 54.999 -25.464 56.619 L -21.484 53.529 Z"/>
|
||||
<path fill="#EA4335" d="M -14.754 43.989 C -12.984 43.989 -11.404 44.599 -10.154 45.789 L -6.734 42.369 C -8.804 40.429 -11.514 39.239 -14.754 39.239 C -19.444 39.239 -23.494 41.939 -25.464 45.859 L -21.484 48.949 C -20.534 46.099 -17.884 43.989 -14.754 43.989 Z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" aria-label="Microsoft" role="img" viewBox="0 0 512 512"><rect width="512" height="512" rx="15%" fill="#fff"/><path d="M75 75v171h171v-171z" fill="#f25022"/><path d="M266 75v171h171v-171z" fill="#7fba00"/><path d="M75 266v171h171v-171z" fill="#00a4ef"/><path d="M266 266v171h171v-171z" fill="#ffb900"/></svg>
|
After Width: | Height: | Size: 347 B |
|
@ -0,0 +1,31 @@
|
|||
<svg width="38" height="38" viewBox="0 0 38 38" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<linearGradient x1="8.042%" y1="0%" x2="65.682%" y2="23.865%" id="a">
|
||||
<stop stop-color="#168CA9" stop-opacity="0" offset="0%"/>
|
||||
<stop stop-color="#168CA9" stop-opacity=".631" offset="63.146%"/>
|
||||
<stop stop-color="#168CA9" offset="100%"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<g transform="translate(1 1)">
|
||||
<path d="M36 18c0-9.94-8.06-18-18-18" id="Oval-2" stroke="url(#a)" stroke-width="2">
|
||||
<animateTransform
|
||||
attributeName="transform"
|
||||
type="rotate"
|
||||
from="0 18 18"
|
||||
to="360 18 18"
|
||||
dur="0.9s"
|
||||
repeatCount="indefinite" />
|
||||
</path>
|
||||
<circle fill="#fff" cx="36" cy="18" r="1">
|
||||
<animateTransform
|
||||
attributeName="transform"
|
||||
type="rotate"
|
||||
from="0 18 18"
|
||||
to="360 18 18"
|
||||
dur="0.9s"
|
||||
repeatCount="indefinite" />
|
||||
</circle>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 9.5 KiB |
After Width: | Height: | Size: 68 KiB |
|
@ -0,0 +1,142 @@
|
|||
(function () {
|
||||
|
||||
function createForm() {
|
||||
const form = document.createElement("form");
|
||||
form.method = "POST";
|
||||
form.style.display = "none";
|
||||
return form;
|
||||
}
|
||||
|
||||
function addInput(form, name, value) {
|
||||
const input = document.createElement("input");
|
||||
input.name = name;
|
||||
input.value = value;
|
||||
form.appendChild(input);
|
||||
}
|
||||
|
||||
let statusPolling;
|
||||
|
||||
let isPolling = false;
|
||||
let pollingTimeout = null;
|
||||
|
||||
const POLLING_INTERVAL = 2000;
|
||||
const REQUEST_TIMEOUT = 3000;
|
||||
|
||||
function dispatchLink() {
|
||||
|
||||
document.getElementById("mauth_started").style.display = "block"; // show
|
||||
|
||||
const request = {};
|
||||
|
||||
// calling nevisFIDO through nevisAuth on current URL using AJAX
|
||||
fetch("", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(request)
|
||||
}).then(res => {
|
||||
res.json().then(o => {
|
||||
// example response: {"dispatchResult":"..."}
|
||||
if (o.dispatchResult == 'dispatched') {
|
||||
// example response: {..., "dispatcherInformation":{..., "response":"admin4testing://authenticate?dispatchTokenResponse=ey..."}}
|
||||
var link = o.dispatcherInformation.response;
|
||||
console.log("received link: " + link);
|
||||
var linkElem = document.getElementById("mauth_link");
|
||||
linkElem.href = link; // custom scheme link does not work in Android 13
|
||||
const isMobile = !!/(iPhone|iPad|Android)/.test(window.navigator.userAgent);
|
||||
if (isMobile) {
|
||||
document.getElementById("mauth_link_parent").style.display = "inline"; // show
|
||||
}
|
||||
var url = new URL(link);
|
||||
var dispatchTokenResponse = url.searchParams.get("dispatchTokenResponse");
|
||||
// render QR code
|
||||
var qrCodeElem = document.getElementById("mauth_qrcode");
|
||||
var qrcode = new QRious({
|
||||
element: qrCodeElem,
|
||||
foreground: "#168CA9",
|
||||
level: "M",
|
||||
size: 256,
|
||||
value: link
|
||||
});
|
||||
var sessionId = o.sessionId;
|
||||
console.log("started polling for session ID: " + sessionId);
|
||||
poll(sessionId);
|
||||
}
|
||||
else {
|
||||
console.log("authentication failed: " + o.dispatchResult);
|
||||
const form = createForm();
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
}
|
||||
});
|
||||
}).catch((err) => console.error("error: ", err));
|
||||
}
|
||||
|
||||
function poll(sessionId) {
|
||||
if (isPolling) {
|
||||
return; // Exit if a polling request is already ongoing
|
||||
}
|
||||
|
||||
isPolling = true;
|
||||
|
||||
const request = { fidoUafSessionId: sessionId };
|
||||
|
||||
const fetchRequest = fetch("", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(request)
|
||||
});
|
||||
|
||||
// Set up the timeout for the fetch request
|
||||
const timeoutPromise = new Promise((_, reject) => {
|
||||
pollingTimeout = setTimeout(() => {
|
||||
reject(new Error('Request timed out'));
|
||||
}, REQUEST_TIMEOUT);
|
||||
});
|
||||
|
||||
Promise.race([fetchRequest, timeoutPromise])
|
||||
.then(res => res.json())
|
||||
.then(o => {
|
||||
clearTimeout(pollingTimeout);
|
||||
var status = o.status;
|
||||
console.log("status: " + status);
|
||||
|
||||
if (status == 'clientAuthenticating') {
|
||||
// show process icon
|
||||
document.getElementById("mauth_loading").style.display = 'block';
|
||||
// hide QR-code and information
|
||||
document.getElementById("mauth_qrcode").style.display = 'none';
|
||||
document.getElementById("mauth_qrcode_info").style.display = 'none';
|
||||
}
|
||||
if (status == 'succeeded') {
|
||||
clearInterval(statusPolling);
|
||||
// as this is the last call we have to do a top-level request instead of AJAX
|
||||
const form = createForm();
|
||||
addInput(form, "continue", "true"); // required for custom dispatching in usernameless
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
} else if (status == 'failed' || status == 'unknown') {
|
||||
clearInterval(statusPolling);
|
||||
console.error("authentication failed with status: " + status);
|
||||
// as this is the last call we have to do a top-level request instead of AJAX
|
||||
const form = createForm();
|
||||
addInput(form, "fidoUafSessionId", sessionId);
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error("error:", err);
|
||||
})
|
||||
.finally(() => {
|
||||
isPolling = false;
|
||||
// Schedule the next poll if needed
|
||||
setTimeout(() => poll(sessionId), POLLING_INTERVAL);
|
||||
});
|
||||
}
|
||||
|
||||
dispatchLink();
|
||||
})();
|
|
@ -0,0 +1,128 @@
|
|||
(function () {
|
||||
|
||||
function createForm() {
|
||||
const form = document.createElement("form");
|
||||
form.method = "POST";
|
||||
form.style.display = "none";
|
||||
return form;
|
||||
}
|
||||
|
||||
function addInput(form, name, value) {
|
||||
const input = document.createElement("input");
|
||||
input.name = name;
|
||||
input.value = value;
|
||||
form.appendChild(input);
|
||||
}
|
||||
|
||||
let statusPolling;
|
||||
|
||||
let isPolling = false;
|
||||
let pollingTimeout = null;
|
||||
|
||||
const POLLING_INTERVAL = 2000;
|
||||
const REQUEST_TIMEOUT = 3000;
|
||||
|
||||
function renderEnrollment() {
|
||||
|
||||
// link is provided by a hidden GuiElem
|
||||
var link = document.getElementsByName("mauth_dispatcher_link")[0].value;
|
||||
console.log("received dispatcher link: " + link);
|
||||
|
||||
const isMobile = !!/(iPhone|iPad|Android)/.test(window.navigator.userAgent);
|
||||
if (isMobile) {
|
||||
var linkElem = document.getElementById("mauth_link");
|
||||
linkElem.href = link;
|
||||
document.getElementById("mauth_link_parent").style.display = "inline"; // show
|
||||
}
|
||||
|
||||
var url = new URL(link);
|
||||
var dispatchTokenResponse = url.searchParams.get("dispatchTokenResponse");
|
||||
|
||||
// render QR code into mauth_qrcode element
|
||||
var qrCodeElem = document.getElementById("mauth_qrcode");
|
||||
var qrcode = new QRious({
|
||||
element: qrCodeElem,
|
||||
foreground: "#168CA9",
|
||||
level: "M",
|
||||
size: 256,
|
||||
value: link
|
||||
});
|
||||
|
||||
// show entire element
|
||||
document.getElementById("mauth_started").style.display = "block";
|
||||
|
||||
console.log("scheduling status polling (2s interval)");
|
||||
statusPolling = window.setInterval(function () {
|
||||
poll();
|
||||
}, 2000);
|
||||
}
|
||||
|
||||
function poll() {
|
||||
if (isPolling) {
|
||||
return; // Exit if a polling request is already ongoing
|
||||
}
|
||||
|
||||
isPolling = true;
|
||||
|
||||
// state is held on backend side
|
||||
const request = {};
|
||||
|
||||
const fetchRequest = fetch("", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(request)
|
||||
});
|
||||
|
||||
// Set up the timeout for the fetch request
|
||||
const timeoutPromise = new Promise((_, reject) => {
|
||||
pollingTimeout = setTimeout(() => {
|
||||
reject(new Error('Request timed out'));
|
||||
}, REQUEST_TIMEOUT);
|
||||
});
|
||||
|
||||
Promise.race([fetchRequest, timeoutPromise])
|
||||
.then(res => res.json())
|
||||
.then(o => {
|
||||
clearTimeout(pollingTimeout);
|
||||
var status = o.status;
|
||||
console.log("status: " + status);
|
||||
|
||||
if (status == 'clientRegistering') {
|
||||
// show process icon
|
||||
document.getElementById("mauth_loading").style.display = 'block';
|
||||
|
||||
// hide QR-code and information
|
||||
document.getElementById("mauth_qrcode").style.display = 'none';
|
||||
document.getElementById("mauth_qrcode_info").style.display = 'none';
|
||||
} else if (status == 'succeeded') {
|
||||
clearInterval(statusPolling);
|
||||
console.log("onboarding successful");
|
||||
|
||||
// as this is the last call we have to do a top-level request instead of AJAX
|
||||
const form = createForm();
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
} else if (status == 'failed' || status == 'unknown') {
|
||||
clearInterval(statusPolling);
|
||||
console.error("onboarding failed with status: " + status);
|
||||
|
||||
// as this is the last call we have to do a top-level request instead of AJAX
|
||||
const form = createForm();
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error("error:", err);
|
||||
})
|
||||
.finally(() => {
|
||||
isPolling = false;
|
||||
// Schedule the next poll if needed
|
||||
setTimeout(() => poll(), POLLING_INTERVAL);
|
||||
});
|
||||
}
|
||||
|
||||
renderEnrollment();
|
||||
})();
|
|
@ -0,0 +1,193 @@
|
|||
(function () {
|
||||
|
||||
function createForm() {
|
||||
const form = document.createElement("form");
|
||||
form.method = "POST";
|
||||
form.style.display = "none";
|
||||
return form;
|
||||
}
|
||||
|
||||
function addInput(form, name, value) {
|
||||
const input = document.createElement("input");
|
||||
input.name = name;
|
||||
input.value = value;
|
||||
form.appendChild(input);
|
||||
}
|
||||
|
||||
let statusPolling;
|
||||
|
||||
let isPolling = false;
|
||||
let pollingTimeout = null;
|
||||
|
||||
const POLLING_INTERVAL = 2000;
|
||||
const REQUEST_TIMEOUT = 3000;
|
||||
|
||||
function dispatch(id) {
|
||||
|
||||
document.getElementById("mauth_devices").style.display = "none"; // hide selection menu
|
||||
document.getElementById("mauth_started").style.display = "block"; // show
|
||||
|
||||
const request = {};
|
||||
request.dispatchTargetId = id;
|
||||
request.dispatcher = "firebase-cloud-messaging";
|
||||
|
||||
// calling nevisFIDO through nevisAuth on current URL using AJAX
|
||||
fetch("", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(request)
|
||||
}).then(res => {
|
||||
res.json().then(o => {
|
||||
console.log("dispatch response: " + JSON.stringify(o));
|
||||
// example response: {"dispatchResult":"..."}
|
||||
if (o.dispatchResult == 'dispatched') {
|
||||
// example response: {"token":"...","sessionId":"...","dispatchResult":"dispatched","dispatcherInformation":{"name":"firebase-cloud-messaging","response":"..."}}
|
||||
console.log("push dispatching successful");
|
||||
// set numbers for number matching
|
||||
if (o.channelLinking) {
|
||||
document.getElementById('mauth_match_numbers').innerHTML = o.channelLinking.content;
|
||||
}
|
||||
// preparing content for QR-code
|
||||
var token = o.token;
|
||||
console.log("found token: " + token);
|
||||
// hidden GuiElem
|
||||
var redeemUrl = document.querySelector('input[name=redeem_url]').value;
|
||||
console.log("found redeem URL: " + redeemUrl);
|
||||
let qrCodeContents = {
|
||||
nma_data_version: "1",
|
||||
nma_data_content_type: "application/json",
|
||||
nma_data: {
|
||||
token: token,
|
||||
redeem_url: redeemUrl
|
||||
}
|
||||
};
|
||||
var qrCodeValue = window.btoa(JSON.stringify(qrCodeContents));
|
||||
// render QR code
|
||||
var qrCodeElem = document.getElementById("mauth_qrcode");
|
||||
console.log("rendering QR code");
|
||||
var qrcode = new QRious({
|
||||
element: qrCodeElem,
|
||||
foreground: "#168CA9",
|
||||
level: "M",
|
||||
size: 256,
|
||||
value: qrCodeValue
|
||||
});
|
||||
var sessionId = o.sessionId;
|
||||
console.log("started polling for session ID: " + sessionId);
|
||||
poll(sessionId);
|
||||
}
|
||||
else {
|
||||
console.log("authentication failed: " + o.dispatchResult);
|
||||
const form = createForm();
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
}
|
||||
});
|
||||
}).catch((err) => console.error("error: ", err));
|
||||
}
|
||||
|
||||
function renderDeviceList() {
|
||||
|
||||
const request = {};
|
||||
|
||||
// calling nevisFIDO through nevisAuth on current URL using AJAX
|
||||
fetch("", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(request)
|
||||
}).then(res => {
|
||||
res.json().then(o => {
|
||||
// example response: {"dispatchTargets":[{"id":"40a41ac7-0189-4c0b-8db9-cafcaa3e3f11","name":"Android Google Pixel 4 23.11.2022 07:26:25"}]}
|
||||
var devices = o.dispatchTargets;
|
||||
if (devices.length > 1) {
|
||||
console.log("multiple devices found, selection menu required.");
|
||||
let list = document.getElementById("mauth_devices");
|
||||
for (let i = 0; i < devices.length; i++) {
|
||||
let device = devices[i];
|
||||
var item = document.createElement("li");
|
||||
item.class = "list-group-item list-group-item-action";
|
||||
item.onclick = function() { dispatch(device.id) };
|
||||
item.innerHTML += device.name;
|
||||
list.appendChild(item);
|
||||
}
|
||||
list.style.display = "block"; // show selection menu
|
||||
}
|
||||
else if (devices.length == 1) {
|
||||
console.log("user has only 1 device, no selection required.");
|
||||
dispatch(devices[0].id);
|
||||
}
|
||||
else {
|
||||
console.error("user has no device.");
|
||||
// TODO koenig 20221124: design this case
|
||||
}
|
||||
});
|
||||
}).catch((err) => console.error("error: ", err));
|
||||
}
|
||||
|
||||
function poll(sessionId) {
|
||||
if (isPolling) {
|
||||
return; // Exit if a polling request is already ongoing
|
||||
}
|
||||
isPolling = true;
|
||||
|
||||
const request = { fidoUafSessionId: sessionId };
|
||||
|
||||
const fetchRequest = fetch("", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(request)
|
||||
});
|
||||
|
||||
// Set up the timeout for the fetch request
|
||||
const timeoutPromise = new Promise((_, reject) => {
|
||||
pollingTimeout = setTimeout(() => {
|
||||
reject(new Error('Request timed out'));
|
||||
}, REQUEST_TIMEOUT);
|
||||
});
|
||||
|
||||
Promise.race([fetchRequest, timeoutPromise])
|
||||
.then(res => res.json())
|
||||
.then(o => {
|
||||
clearTimeout(pollingTimeout);
|
||||
var status = o.status;
|
||||
console.log("status: " + status);
|
||||
|
||||
if (status == 'clientAuthenticating') {
|
||||
document.getElementById("mauth_qrcode").style.display = 'none';
|
||||
document.getElementById("mauth_qrcode_info").style.display = 'none';
|
||||
document.getElementById("mauth_match_numbers").style.display = 'block';
|
||||
document.getElementById("mauth_loading").style.display = 'block';
|
||||
}
|
||||
|
||||
if (status == 'succeeded') {
|
||||
clearInterval(statusPolling);
|
||||
const form = createForm();
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
} else if (status == 'failed' || status == 'unknown') {
|
||||
clearInterval(statusPolling);
|
||||
console.error("authentication failed with status: " + status);
|
||||
const form = createForm();
|
||||
addInput(form, "fidoUafSessionId", sessionId);
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error("error:", err);
|
||||
})
|
||||
.finally(() => {
|
||||
isPolling = false;
|
||||
// Schedule the next poll if needed
|
||||
setTimeout(() => poll(sessionId), POLLING_INTERVAL);
|
||||
});
|
||||
}
|
||||
|
||||
renderDeviceList();
|
||||
})();
|
|
@ -0,0 +1,143 @@
|
|||
(function () {
|
||||
|
||||
function createForm() {
|
||||
const form = document.createElement("form");
|
||||
form.method = "POST";
|
||||
form.style.display = "none";
|
||||
return form;
|
||||
}
|
||||
|
||||
function addInput(form, name, value) {
|
||||
const input = document.createElement("input");
|
||||
input.name = name;
|
||||
input.value = value;
|
||||
form.appendChild(input);
|
||||
}
|
||||
|
||||
let statusPolling;
|
||||
|
||||
let isPolling = false;
|
||||
let pollingTimeout = null;
|
||||
|
||||
const POLLING_INTERVAL = 2000;
|
||||
const REQUEST_TIMEOUT = 3000;
|
||||
|
||||
function dispatch() {
|
||||
|
||||
console.log("initiating usernameless mobile authentication...");
|
||||
|
||||
document.getElementById("mauth_started").style.display = "block"; // show
|
||||
|
||||
const request = {};
|
||||
|
||||
// calling nevisFIDO through nevisAuth on current URL using AJAX
|
||||
fetch("", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(request)
|
||||
}).then(res => {
|
||||
res.json().then(o => {
|
||||
console.log(o);
|
||||
// example response: {"dispatchResult":"..."}
|
||||
if (o.dispatchResult == 'dispatched') {
|
||||
// example response: {..., "dispatcherInformation":{..., "response":"admin4testing://authenticate?dispatchTokenResponse=ey..."}}
|
||||
var link = o.dispatcherInformation.response;
|
||||
console.log("received link: " + link);
|
||||
var linkElem = document.getElementById("mauth_link");
|
||||
linkElem.href = link; // custom scheme link does not work in Android 13
|
||||
const isMobile = !!/(iPhone|iPad|Android)/.test(window.navigator.userAgent);
|
||||
if (isMobile) {
|
||||
document.getElementById("mauth_link_parent").style.display = "inline"; // show
|
||||
}
|
||||
var url = new URL(link);
|
||||
var dispatchTokenResponse = url.searchParams.get("dispatchTokenResponse");
|
||||
// render QR code
|
||||
var qrCodeElem = document.getElementById("mauth_qrcode");
|
||||
var qrcode = new QRious({
|
||||
element: qrCodeElem,
|
||||
foreground: "#168CA9",
|
||||
level: "M",
|
||||
size: 256,
|
||||
value: link
|
||||
});
|
||||
var sessionId = o.sessionId;
|
||||
console.log("started polling for session ID: " + sessionId);
|
||||
poll(sessionId);
|
||||
}
|
||||
else {
|
||||
console.log("authentication failed: " + o.dispatchResult);
|
||||
const form = createForm();
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
}
|
||||
});
|
||||
}).catch((err) => console.error("error: ", err));
|
||||
}
|
||||
|
||||
function poll(sessionId) {
|
||||
if (isPolling) {
|
||||
return; // Exit if a polling request is already ongoing
|
||||
}
|
||||
|
||||
isPolling = true;
|
||||
|
||||
const request = { fidoUafSessionId: sessionId };
|
||||
|
||||
const fetchRequest = fetch("", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(request)
|
||||
});
|
||||
|
||||
// Set up the timeout for the fetch request
|
||||
const timeoutPromise = new Promise((_, reject) => {
|
||||
pollingTimeout = setTimeout(() => {
|
||||
reject(new Error('Request timed out'));
|
||||
}, REQUEST_TIMEOUT);
|
||||
});
|
||||
|
||||
Promise.race([fetchRequest, timeoutPromise])
|
||||
.then(res => res.json())
|
||||
.then(o => {
|
||||
clearTimeout(pollingTimeout);
|
||||
var status = o.status;
|
||||
console.log("status: " + status);
|
||||
|
||||
if (status == 'clientAuthenticating') {
|
||||
// show process icon
|
||||
document.getElementById("mauth_loading").style.display = 'block';
|
||||
document.getElementById("mauth_qrcode").style.display = 'none';
|
||||
}
|
||||
if (status == 'succeeded') {
|
||||
clearInterval(statusPolling);
|
||||
// as this is the last call we have to do a top-level request instead of AJAX
|
||||
const form = createForm();
|
||||
addInput(form, "continue", "true"); // required for custom dispatching in usernameless
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
} else if (status == 'failed' || status == 'unknown') {
|
||||
clearInterval(statusPolling);
|
||||
console.error("authentication failed with status: " + status);
|
||||
// as this is the last call we have to do a top-level request instead of AJAX
|
||||
const form = createForm();
|
||||
addInput(form, "fidoUafSessionId", sessionId);
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error("error:", err);
|
||||
})
|
||||
.finally(() => {
|
||||
isPolling = false;
|
||||
// Schedule the next poll if needed
|
||||
setTimeout(() => poll(sessionId), POLLING_INTERVAL);
|
||||
});
|
||||
}
|
||||
|
||||
dispatch();
|
||||
})();
|
|
@ -0,0 +1,43 @@
|
|||
// display oauth scopes listed in input field 'consentInformation'
|
||||
// change 'consentInformation' and 'scope_name' to the values used in your configuration.
|
||||
$(function() {
|
||||
|
||||
var consentInformationFieldName = "consentInformation"; // name of the input field from which to parse the value as the consent information JSON
|
||||
var scopeDescriptionSource = "scope_name"; // key of the field in the consent information JSON of which to get the value as the scope description
|
||||
|
||||
function displayOAuthScopesConsent() {
|
||||
var jsonData = parseJson();
|
||||
if (jsonData !== undefined) {
|
||||
mapJsonToHtml(jsonData)
|
||||
}
|
||||
}
|
||||
|
||||
function mapJsonToHtml(jsonData) {
|
||||
mapJsonToHtmlScopeList("listOfRequestedScopesWithExistingConsent", jsonData.requestedScopesWithExistingConsent, "Already accepted scopes:");
|
||||
mapJsonToHtmlScopeList("listOfRequestedScopes", jsonData.requestedScopesRequiringConsent, "Requested scopes that require a consent:");
|
||||
}
|
||||
|
||||
function mapJsonToHtmlScopeList(elementId, scopeInformation, title) {
|
||||
if (scopeInformation !== undefined && Object.keys(scopeInformation).length > 0) {
|
||||
$("input[name=" + consentInformationFieldName +"]").after("<p style='margin-top: 0.5em'>" + title + "</p><div class='scopeinfobox'><ul id='" + elementId + "' /> </div>");
|
||||
jQuery.each(scopeInformation, function(key,value) {
|
||||
var scopeDescription = value[scopeDescriptionSource];
|
||||
if (scopeDescription) {
|
||||
$("#" + elementId).append('<li>' + scopeDescription + '</li>');
|
||||
} else {
|
||||
$("#" + elementId).append('<li>' + key + '</li>');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function parseJson() {
|
||||
var consentInformationField = $("input[name=" +consentInformationFieldName +"]");
|
||||
if (consentInformationField.length > 0) {
|
||||
return JSON.parse(consentInformationField.val());
|
||||
}
|
||||
}
|
||||
|
||||
displayOAuthScopesConsent();
|
||||
});
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
function toggleInputType(passwordInputId, eyeIconId, resourcePath) {
|
||||
const passwordInput = document.getElementById(passwordInputId);
|
||||
const eyeIcon = document.getElementById(eyeIconId);
|
||||
if (passwordInput.type === 'text') {
|
||||
passwordInput.type = 'password';
|
||||
eyeIcon.src = resourcePath + '/resources/eye.svg';
|
||||
return;
|
||||
}
|
||||
passwordInput.type = 'text';
|
||||
eyeIcon.src = resourcePath + '/resources/eye-off.svg';
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
#set($jsValidation = 1) ## enable JS validation, client-side
|
||||
|
||||
#set($useFormEncryption = $gui.encryption && ($gui.encryption.length() > 0))
|
||||
|
||||
#set($encryptionParamsOk = true)
|
||||
|
||||
#if ($useFormEncryption)
|
||||
#* check the mandatory e2eenc.publicKey GuiElem *#
|
||||
#set($encryptionParamsOk = $gui.getGuiElem("e2eenc.publicKey") && ($gui.getGuiElem("e2eenc.publicKey") != "" ))
|
||||
#end
|
||||
|
||||
#if (!$encryptionParamsOk)
|
||||
$response.setStatus(502)
|
||||
|
||||
#else
|
||||
#set($isAjaxRequest = "XMLHttpRequest" == $login.requestHeaders.get("X-Requested-With"))
|
||||
|
||||
#set($acceptHeader = $login.requestHeaders.accept)
|
||||
#if (!$acceptHeader)
|
||||
#set($acceptHeader = $login.requestHeaders.Accept)
|
||||
#end
|
||||
#if ($acceptHeader)
|
||||
#set($isHtmlRequest = $acceptHeader.contains("text/html") || $acceptHeader.contains("*/*"))
|
||||
#set($isJsonRequest = $acceptHeader.contains("application/json"))
|
||||
#set($isSoapRequest = $acceptHeader.contains("application/soap+xml"))
|
||||
#set($isXmlRequest = $acceptHeader.contains("application/xml")||$acceptHeader.contains("text/xml"))
|
||||
#set($isCssRequest = $acceptHeader.contains("text/css"))
|
||||
#else
|
||||
#set($isHtmlRequest = true)
|
||||
#set($isSoapRequest = false)
|
||||
#set($isXmlRequest = false)
|
||||
#set($isCssRequest = false)
|
||||
#end
|
||||
|
||||
## sending the query parameter render=form will render only the inner form
|
||||
#set($isFormRequest = "form" == $login.requestParameters.render && $isHtmlRequest)
|
||||
|
||||
#parse("${templatePath}/macros.vm")
|
||||
|
||||
#if ($isHtmlRequest)
|
||||
#if ($isFormRequest)
|
||||
#parse("${templatePath}/form.vm")
|
||||
#else
|
||||
## html.vm is generated from html provided via pattern
|
||||
#parse("${templatePath}/html.vm")
|
||||
#end
|
||||
#end
|
||||
|
||||
## AJAX requests: signal to JS-Client that login is required
|
||||
#if ($isAjaxRequest)
|
||||
$response.setStatus(401)
|
||||
$response.setHeader("WWW-Authenticate","$gui.domain")
|
||||
#end
|
||||
|
||||
#if (!$isHtmlRequest && $isXmlRequest)
|
||||
$response.setHeader("Content-Type","text/xml")
|
||||
## emit custom XML here, use $utils.escapeXml to sanitize values coming from clients
|
||||
#end
|
||||
|
||||
#if (!$isHtmlRequest && $isJsonRequest)
|
||||
$response.setHeader("Content-Type","application/json")
|
||||
#parse("${templatePath}/json.vm")
|
||||
## emit custom JSON here, use $utils.escapeJs to sanitize values coming from clients
|
||||
#end
|
||||
#end
|
|
@ -0,0 +1,11 @@
|
|||
<footer id="footer" class="text-primary">
|
||||
<div class="row small">
|
||||
<div class="col-md-4 hidden-xs hidden-sm">Copyright © 2023 NEVIS Security AG</div>
|
||||
<div class="col-xs-12 col-md-4 text-center text-uppercase logo-round-container">
|
||||
<div class="logo-round center-block">
|
||||
<img src="${login.appDataPath}/resources/logo.png" alt="NEVIS Security Suite">
|
||||
</div>
|
||||
<strong>NEVIS Security Suite</strong>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
|
@ -0,0 +1,127 @@
|
|||
## if only form, then we include javascript here (start of body)
|
||||
#if ($isFormRequest)
|
||||
#parse("${templatePath}/js_start.vm")
|
||||
#end
|
||||
|
||||
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
|
||||
|
||||
#if ($useFormEncryption)
|
||||
<div id="e2eeSplashScreen" style="display:none;">
|
||||
<h2 class="logintitle text-center">$gui.label</h2>
|
||||
<div class="field info" id="info">$text.get("e2ee.splashscreen.msg")</div>
|
||||
</div>
|
||||
#end
|
||||
|
||||
<div id="loginform">
|
||||
|
||||
<form id="$gui.name" name="$gui.name"
|
||||
#if ($useFormEncryption) onsubmit="new e2eenc().encryptForm('$gui.encryption','$gui.name')" #end
|
||||
method="POST" target="_self" action="$formTarget" autocomplete="off" accept-charset="UTF-8" class="form-horizontal">
|
||||
|
||||
<h1 class="logintitle text-center">$gui.label</h1>
|
||||
|
||||
#set ($tabindex = 0)
|
||||
#set ($policyFailureOpen = false)
|
||||
#set ($policyInfoOpen = false)
|
||||
|
||||
#foreach ($guiElem in $gui.getGuiElems())
|
||||
#set ($tabindex = $tabindex+1)
|
||||
#if ($guiElem.name.startsWith("policyInfo") && $guiElem.label && $guiElem.label.length() > 0)
|
||||
#if (!$policyInfoOpen)
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-3 col-sm-6">
|
||||
#set ($policyInfoOpen = true)
|
||||
#end
|
||||
<span class="help-block small" id="$guiElem.name">$guiElem.label</span>
|
||||
#elseif ($guiElem.name.startsWith("policyFailure") && $guiElem.label && $guiElem.label.length() > 0)
|
||||
#if (!$policyFailureOpen)
|
||||
<div class="form-group has-error">
|
||||
<div class="col-sm-offset-3 col-sm-6">
|
||||
#set ($policyFailureOpen = true)
|
||||
#end
|
||||
<span class="help-block small" id="$guiElem.name">$guiElem.label</span>
|
||||
#else
|
||||
#if (!$guiElem.name.startsWith("policyInfo") && $policyInfoOpen) ## close
|
||||
</div>
|
||||
</div>
|
||||
#set ($policyInfoOpen = false)
|
||||
#end
|
||||
#if (!$guiElem.name.startsWith("policyFailure") && $policyFailureOpen) ## close
|
||||
</div>
|
||||
</div>
|
||||
#set ($policyFailureOpen = false)
|
||||
#end
|
||||
#renderFormField($guiElem, $gui, $tabindex)
|
||||
#end
|
||||
#end
|
||||
|
||||
## this block applies when Channel is set to Push / Link
|
||||
#if ($gui.name == "mauth_link_qr" || $gui.name == "mauth_onboard")
|
||||
<!-- shown after dispatching -->
|
||||
<center id="mauth_started">
|
||||
<img id="mauth_loading" style="width: 60px; height: 60px; display: none;" src="${login.appDataPath}/resources/loading.svg"/>
|
||||
<br><br>
|
||||
<p id="mauth_qrcode_info">$text.get("mobile_auth.scan")</p>
|
||||
<canvas id="mauth_qrcode" style="width: 256px; height: 256px;">
|
||||
</canvas>
|
||||
<div id="mauth_link_parent" class="form-group" style="display: none">
|
||||
$text.get("mobile_auth.link")
|
||||
</div>
|
||||
</center>
|
||||
#end
|
||||
|
||||
## this block applies when Channel is set to Push / QR-code (in-app)
|
||||
#if ($gui.name == "mauth_push_qr")
|
||||
<!-- shown if the user has multiple devices -->
|
||||
<ul id="mauth_devices" style="display: none">
|
||||
</ul>
|
||||
<!-- shown after selecting the device -->
|
||||
<center id="mauth_started" style="display: none">
|
||||
<img id="mauth_loading" style="width: 60px; height: 60px; display: none;" src="${login.appDataPath}/resources/loading.svg"/>
|
||||
<p id="mauth_match_numbers" style="font-size: 64px; display: none;"></p>
|
||||
<p id="mauth_qrcode_info">$text.get("mobile_auth.push-or-scan")</p>
|
||||
<canvas id="mauth_qrcode" style="width: 256px; height: 256px;">
|
||||
</canvas>
|
||||
</center>
|
||||
#end
|
||||
|
||||
## this block applies for usernameless mobile authentication
|
||||
#if ($gui.name == "mauth_usernameless")
|
||||
<center id="mauth_started" style="display: none">
|
||||
<img id="mauth_loading" style="width: 60px; height: 60px; display: none;" src="${login.appDataPath}/resources/loading.svg"/>
|
||||
<br><br>
|
||||
<p id="mauth_qrcode_info">$text.get("mobile_auth.scan")</p>
|
||||
<canvas id="mauth_qrcode" style="width: 256px; height: 256px;">
|
||||
</canvas>
|
||||
<div id="mauth_link_parent" class="form-group" style="display: none">
|
||||
<a href="" id="mauth_link">$text.get("mobile_auth.link")</a>
|
||||
</div>
|
||||
</center>
|
||||
#end
|
||||
|
||||
#if ($useFormEncryption)
|
||||
<input type="hidden" name="e2eenc.fields" value="not-set">
|
||||
<input type="hidden" name="e2eenc.iv" value="not-set">
|
||||
<input type="hidden" name="e2eenc.encapsulation" value="not-set">
|
||||
#end
|
||||
|
||||
#renderFormControls($gui)
|
||||
#renderFormLinks($gui)
|
||||
</form>
|
||||
|
||||
<!-- position input focus into first element of form -->
|
||||
<script type="text/javascript">
|
||||
const form = document.forms['$gui.name'];
|
||||
if (form) {
|
||||
const input = form.elements[0];
|
||||
if (input) {
|
||||
input.focus();
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
## if only form, then we include javascript here (end of body)
|
||||
#if ($isFormRequest)
|
||||
#parse("${templatePath}/js_end.vm")
|
||||
#end
|
||||
</div>
|
|
@ -0,0 +1,3 @@
|
|||
<header id="header" class="container-fluid">
|
||||
<img class="logo center-block" src="${login.appDataPath}/resources/logo_animated.gif" alt="NEVIS Security Suite">
|
||||
</header>
|
|
@ -0,0 +1,32 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="${utils.escapeHtml($login.localeCode)}">
|
||||
|
||||
<head>
|
||||
<title>$text.get('title')</title>
|
||||
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
|
||||
<link href="${login.appDataPath}/resources/bootstrap.min.css" rel="stylesheet" type="text/css">
|
||||
<link href="${login.appDataPath}/resources/bootstrap-theme.min.css" rel="stylesheet" type="text/css" media="all">
|
||||
<link href="${login.appDataPath}/resources/default.css" rel="stylesheet" type="text/css" media="all">
|
||||
|
||||
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
|
||||
|
||||
#parse("${templatePath}/js_start.vm")
|
||||
</head>
|
||||
|
||||
<body>
|
||||
#parse("${templatePath}/lang.vm")
|
||||
|
||||
#parse("${templatePath}/header.vm")
|
||||
|
||||
<main id="content" class="container">
|
||||
#parse("${templatePath}/form.vm")
|
||||
</main>
|
||||
|
||||
#parse("${templatePath}/footer.vm")
|
||||
|
||||
#parse("${templatePath}/js_end.vm")
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,76 @@
|
|||
<script src="${login.appDataPath}/resources/dropdown.js"></script>
|
||||
<script src="${login.appDataPath}/resources/show-password.js"></script>
|
||||
|
||||
#if ($gui.name == "oauth_consent")
|
||||
<script src="${login.appDataPath}/resources/oauth_consent.js"></script>
|
||||
#end
|
||||
|
||||
#if ($gui.name == "authcloud")
|
||||
<script src="${login.appDataPath}/resources/qrious.min.js"></script>
|
||||
<script src="${login.appDataPath}/resources/authcloud.js"></script>
|
||||
#end
|
||||
|
||||
#if ($gui.name == "authcloud_onboard")
|
||||
<script src="${login.appDataPath}/resources/qrious.min.js"></script>
|
||||
<script src="${login.appDataPath}/resources/authcloud_onboard.js"></script>
|
||||
#end
|
||||
|
||||
#if ($gui.name == "authcloud_login")
|
||||
<script src="${login.appDataPath}/resources/qrious.min.js"></script>
|
||||
<script src="${login.appDataPath}/resources/authcloud_login.js"></script>
|
||||
#end
|
||||
|
||||
#if ($gui.name == "mauth_onboard")
|
||||
<script src="${login.appDataPath}/resources/qrious.min.js"></script>
|
||||
<script src="${login.appDataPath}/resources/mauth_onboard.js"></script>
|
||||
#end
|
||||
|
||||
#if ($gui.name == "mauth_link_qr")
|
||||
<script src="${login.appDataPath}/resources/qrious.min.js"></script>
|
||||
<script src="${login.appDataPath}/resources/mauth_link_qr.js"></script>
|
||||
#end
|
||||
|
||||
#if ($gui.name == "mauth_push_qr")
|
||||
<script src="${login.appDataPath}/resources/qrious.min.js"></script>
|
||||
<script src="${login.appDataPath}/resources/mauth_push_qr.js"></script>
|
||||
#end
|
||||
|
||||
#if ($gui.name == "mauth_usernameless")
|
||||
<script src="${login.appDataPath}/resources/qrious.min.js"></script>
|
||||
<script src="${login.appDataPath}/resources/mauth_usernameless.js"></script>
|
||||
#end
|
||||
|
||||
#if ($gui.name == "fido2_auth")
|
||||
<script src="${login.appDataPath}/resources/base64.js"></script>
|
||||
<script src="${login.appDataPath}/resources/fido2_utils.js"></script>
|
||||
<script src="${login.appDataPath}/resources/fido2_auth.js"></script>
|
||||
#end
|
||||
|
||||
#if ($gui.name == "fido2_auth_std")
|
||||
#set ($authenticationOptionsPath = $login.requestHeaders["fido2AuthenticationOptionsPath"])
|
||||
#set ($authenticationPath = $login.requestHeaders["fido2AuthenticationPath"])
|
||||
#set ($statusServicePath = $login.requestHeaders["fido2StatusServicePath"])
|
||||
#set ($userVerification = $login.requestHeaders["fido2UserVerification"])
|
||||
<script>
|
||||
let params = {
|
||||
authenticationOptionsEndpoint: "$authenticationOptionsPath",
|
||||
authenticationEndpoint: "$authenticationPath",
|
||||
statusServiceEndpoint: "$statusServicePath",
|
||||
userVerification: "$userVerification",
|
||||
};
|
||||
</script>
|
||||
<script src="${login.appDataPath}/resources/simplewebauthn-browser@7.1.0.min.js"></script>
|
||||
<script src="${login.appDataPath}/resources/fido2_utils.js"></script>
|
||||
<script src="${login.appDataPath}/resources/fido2_auth_std.js"></script>
|
||||
#end
|
||||
|
||||
#if ($gui.name == "fido2_onboard")
|
||||
<script src="${login.appDataPath}/resources/base64.js"></script>
|
||||
<script src="${login.appDataPath}/resources/fido2_utils.js"></script>
|
||||
<script src="${login.appDataPath}/resources/fido2_onboard.js"></script>
|
||||
#end
|
||||
|
||||
#if ($useFormEncryption)
|
||||
<script src="${login.appDataPath}/resources/forge.bundle.js"></script>
|
||||
<script src="${login.appDataPath}/resources/e2eenc.js"></script>
|
||||
#end
|
|
@ -0,0 +1 @@
|
|||
<script src="${login.appDataPath}/resources/jquery-3.6.0.min.js"></script>
|
|
@ -0,0 +1,88 @@
|
|||
## This template is used to respond with a JSON format
|
||||
## In this case, the client is supposed to parse and show the data
|
||||
## The JSON data is close to the XML format of the GuiDesc
|
||||
|
||||
#set ($target = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
|
||||
{
|
||||
"name" : "$gui.name" ,
|
||||
"target" : "$target" #if ($gui.label || $gui.language || $gui.domain || $gui.getGuiElems().size() > 0 || $gui.getGuiGroup().size() > 0), #end ## if
|
||||
|
||||
#if ($gui.label) "label" : "$gui.label" #if ($gui.language || $gui.domain || $gui.getGuiElems().size() > 0 || $gui.getGuiGroup().size() > 0), #end ## if
|
||||
#end ## if
|
||||
|
||||
#if ($gui.language) "language" : "$gui.language" #if ($gui.domain || $gui.getGuiElems().size() > 0 || $gui.getGuiGroup().size() > 0), #end ## if
|
||||
#end ## if ($gui.language)
|
||||
#if ($gui.domain) "domain" : "$gui.domain" #if ($gui.getGuiElems().size() > 0 || $gui.getGuiGroup().size() > 0), #end ## if
|
||||
#end ## if ($gui.domain)
|
||||
|
||||
#if ($gui.getGuiElems().size() > 0)
|
||||
"elements" : [
|
||||
#set ($i = 0)
|
||||
#foreach ($guiElem in $gui.getGuiElems())
|
||||
{
|
||||
"name" : "$guiElem.name",
|
||||
"type" : "$guiElem.type",
|
||||
"optional" : "$guiElem.optional",
|
||||
"label" : "$guiElem.label" #if ($guiElem['validation-failed'] || $guiElem.value || $guiElem.length || $guiElem.format), #end
|
||||
#if ($guiElem['validation-failed']) "validation-failed" : "$guiGroup.validationFailed" #if ($guiElem.value || $guiElem.length || $guiElem.format), #end
|
||||
#end ## if ($guiElem['validation-failed'])
|
||||
|
||||
#if ($guiElem.value) "value" : "$guiElem.value.replaceAll('\\\\','_ESCAPED_BACKSLASH_').replaceAll('\\"','_ESCAPED_QUOTE_').replaceAll('\\','\\\\').replaceAll('"','\\"').replaceAll('_ESCAPED_BACKSLASH_','\\\\').replaceAll('_ESCAPED_QUOTE_','\\"')" #if ($guiElem.length || $guiElem.format), #end
|
||||
#end ## if ($guiElem.value)
|
||||
|
||||
#if ($guiElem.length) "max-length" : "$guiElem.length" #if ($guiElem.format), #end
|
||||
#end ## if ($guiElem.length)
|
||||
|
||||
#if ($guiElem.format) "format" : "$guiElem.format"
|
||||
#end
|
||||
|
||||
}
|
||||
#set ($i = $i + 1)
|
||||
#if ($i < ($gui.getGuiElems().size())), #end
|
||||
|
||||
#end ## loop
|
||||
] #if ($gui.getGuiGroup() && $gui.getGuiGroup().size() > 0), #end
|
||||
#end ## if ($gui.getGuiGroup() && $gui.getGuiElem().size() > 0)
|
||||
#if ($gui.getGuiGroup() && $gui.getGuiGroup().size() > 0)
|
||||
"groups" : [
|
||||
#set ($j = 0)
|
||||
#foreach ($guiGroup in $gui.getGuiGroup())
|
||||
"name" : "$guiGroup.name",
|
||||
"type" : "$guiGroup.type",
|
||||
"label" : "$guiGroup.label",
|
||||
"multiple" : "$guiGroup.multiple",
|
||||
"format" : "$guiGroup.format",
|
||||
"optional" : "$guiGroup.optional",
|
||||
"validation-failed" : "$guiGroup.validationFailed" #if ($gui.getGuiElems().length() > 0), #end
|
||||
#if ($gui.getGuiElems() && $gui.getGuiElems().length() > 0)
|
||||
"elements" : [
|
||||
#set ($i = 0)
|
||||
#foreach ($guiElem in $gui.getGuiElems())
|
||||
{
|
||||
"name" : "$guiElem.name",
|
||||
"type" : "$guiElem.type",
|
||||
"optional" : "$guiElem.optional",
|
||||
"validation-failed" : "$guiGroup.validationFailed",
|
||||
"label" : "$guiElem.label" #if ($guiElem.value || $guiElem.length || $guiElem.format), #end
|
||||
#if ($guiElem.value)
|
||||
"value" : "$guiElem.value.replaceAll('\\\\','_ESCAPED_BACKSLASH_').replaceAll('\\"','_ESCAPED_QUOTE_').replaceAll('\\','\\\\').replaceAll('"','\\"').replaceAll('_ESCAPED_BACKSLASH_','\\\\').replaceAll('_ESCAPED_QUOTE_','\\"')" #if ($guiElem.length || $guiElem.format), #end
|
||||
#end ## if ($guiElem.value)
|
||||
#if ($guiElem.length)
|
||||
"max-length" : "$guiElem.length" #if ($guiElem.format), #end
|
||||
#end ## if ($guiElem.length)
|
||||
#if ($guiElem.format)
|
||||
"format" : "$guiElem.format"
|
||||
#end ## if ($guiElem.format)
|
||||
}
|
||||
#set ($i = $i + 1)
|
||||
#if ($i < ($gui.getGuiElems().size())), #end
|
||||
|
||||
#end ## loop
|
||||
] #if ($foreach.hasNext), #end
|
||||
#set ($j = $j + 1)
|
||||
#if ($j < ($gui.getGuiGroup().size())), #end
|
||||
#end ## foreach ($guiGroup in $gui.getGuiGroup())
|
||||
#end ## if ($gui.getGuiElem() && $gui.getGuiElem().size() > 0)
|
||||
]
|
||||
#end ## if ($gui.getGuiGroup() && $gui.getGuiGroup().length() > 0)
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
## Nav =================================================================
|
||||
<nav id="language-switch" class="container-fluid">
|
||||
<div class="dropdown pull-right">
|
||||
<a id="language-switch-btn" class="dropdown-toggle text-uppercase small" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<strong id="language">$login.localeCode</strong>
|
||||
<span class="caret"></span>
|
||||
</a>
|
||||
<ul class="dropdown-menu" aria-labelledby="language-switch-btn">
|
||||
## loop over all defined languages/locales....
|
||||
#foreach ($locale in $login.locales)
|
||||
## find translated label of current locale
|
||||
#if ($text.contains("language.$locale"))
|
||||
#set ($langLabel = $text.get("language.$locale"))
|
||||
#elseif ($locale.length() > 2)
|
||||
#set ($langLabel = $text.get("language.${locale.substring(0,2).toLowercase()}"))
|
||||
#else
|
||||
#set ($langLabel = $locale)
|
||||
#end
|
||||
## emit link or text for each language
|
||||
#if ($login.localeCode != $locale && $login.language != $locale)
|
||||
#set ($langTarget = $utils.escapeHtmlAttribute($gui.target('language', $locale)))
|
||||
<li>
|
||||
<a class="lang" href="$langTarget">
|
||||
<strong class="prefix text-primary text-uppercase">$locale</strong>
|
||||
<span>$langLabel</span>
|
||||
</a>
|
||||
</li>
|
||||
#end
|
||||
#end ## end foreach
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
|
@ -0,0 +1,295 @@
|
|||
|
||||
#macro(renderFormField $guiElem, $gui, $tabindex)
|
||||
|
||||
#if ($guiElem.type == "submit" || $guiElem.type == "button" || $guiElem.type == "reset" || $guiElem.type == "link")
|
||||
## do nothing, will be rendered in renderFormControls nd renderFormLinks
|
||||
|
||||
|
||||
#elseif ($guiElem.type == "info" || $guiElem.type == "error")
|
||||
#if ($guiElem.label && $guiElem.label.length() > 0)
|
||||
## special fields: display some text only
|
||||
#set ($class = "form-group")
|
||||
#if ($guiElem.type == "error")
|
||||
#set ($class = "$class has-error")
|
||||
#end
|
||||
<div class="$class">
|
||||
<div class="col-sm-offset-3 col-sm-6">
|
||||
<span class="help-block small" id="$guiElem.name">
|
||||
$guiElem.label
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
#end
|
||||
|
||||
#elseif ($guiElem.type == "hidden" && $guiElem.name == "saml.logoutURLs")
|
||||
<script>
|
||||
var sp_urls = '$guiElem.value'.split(',');
|
||||
var final_url = '$gui.getGuiElem("saml.logoutURL").value';
|
||||
function kill_session() {
|
||||
var current_url = window.location.href;
|
||||
if (current_url.indexOf('?logout') == -1 && current_url.indexOf('&logout') == -1) {
|
||||
console.log("current URL does not terminate the IDP session");
|
||||
var logout_url = '';
|
||||
if (current_url.indexOf('?') > 0) {
|
||||
logout_url = current_url + "&logout";
|
||||
}
|
||||
else {
|
||||
logout_url = current_url + "?logout";
|
||||
}
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
url: logout_url,
|
||||
async: false,
|
||||
xhrFields: {
|
||||
withCredentials: true
|
||||
},
|
||||
dataType: "text",
|
||||
success: function() {},
|
||||
error: function() {}
|
||||
});
|
||||
}
|
||||
}
|
||||
var request_urls = sp_urls.filter(function(current_url) {
|
||||
return current_url.indexOf('SAMLRequest') > 0;
|
||||
});
|
||||
var response_urls = sp_urls.filter(function(current_url) {
|
||||
return current_url.indexOf('SAMLResponse') > 0;
|
||||
});
|
||||
function end_logout() {
|
||||
if (response_urls.length == 0) {
|
||||
console.log('IDP-initiated SAML logout detected');
|
||||
kill_session(); // required to terminate IDP session
|
||||
window.location.href = final_url;
|
||||
}
|
||||
else {
|
||||
console.log('SP-initiated SAML logout detected');
|
||||
kill_session(); // required to terminate IDP session
|
||||
window.location.href = response_urls[0]; // only 1 such URL allowed. process ends on SP
|
||||
}
|
||||
}
|
||||
var requests = [];
|
||||
for (var i = 0; i < request_urls.length; i++) {
|
||||
var current_url = request_urls[i];
|
||||
requests.push($.ajax({
|
||||
type: "GET",
|
||||
url: current_url,
|
||||
xhrFields: {
|
||||
withCredentials: true
|
||||
},
|
||||
crossDomain: true,
|
||||
dataType: 'jsonp',
|
||||
error: function() {}
|
||||
})
|
||||
);
|
||||
}
|
||||
// send out the requests in parallel and afterwards terminate the logout process
|
||||
// we have to terminate the logout no mather if the requests were successful or if there were failed requests
|
||||
$.when.apply($, requests).then(function() { end_logout(); }, function() { end_logout(); });
|
||||
</script>
|
||||
|
||||
#elseif ($guiElem.type == "hidden")
|
||||
<input type="hidden" name="$guiElem.name" value="$utils.escapeHtml($guiElem.value)">
|
||||
|
||||
|
||||
#else ## not info, error, button, submit, reset or hidden -> normal visual element
|
||||
|
||||
## define CSS class of representation in form
|
||||
#set ($class = "form-group")
|
||||
#if ($guiElem.optional)
|
||||
#set ($class = "$class optional")
|
||||
#else
|
||||
#set ($class = "$class required")
|
||||
#end
|
||||
|
||||
## highlight failed input validation, if flagged
|
||||
|
||||
#if ($guiElem.validationFailed && $guiElem.value && $guiElem.value.length() > 0)
|
||||
#set ($class = "$class has-error")
|
||||
#end
|
||||
|
||||
#if ($guiElem.validationFailed && (!$guiElem.value || $guiElem.value.length() == 0))
|
||||
#set ($class = "$class has-error")
|
||||
#end
|
||||
|
||||
|
||||
## the form field's container, a label, and optionally a validation-related message
|
||||
|
||||
<div class="$class">
|
||||
## Special handling required for radios + checkboxes
|
||||
#if ($guiElem.type != "radio" && $guiElem.type != "checkbox")
|
||||
|
||||
<label class="col-sm-3 control-label" for="$guiElem.name">
|
||||
#if ($guiElem.name.startsWith("inputField") && !$guiElem.optional)
|
||||
$guiElem.label<span style="color: red">*</span>
|
||||
#else
|
||||
$guiElem.label
|
||||
#end
|
||||
</label>
|
||||
|
||||
<div class="col-sm-6">
|
||||
#if ($guiElem.type == "text")
|
||||
<input class="form-control" type="text" name="$guiElem.name" id="$guiElem.name"
|
||||
maxlength="$guiElem.length"
|
||||
value="$utils.escapeHtml($guiElem.value)" tabindex="$tabindex">
|
||||
|
||||
#elseif ($guiElem.type == "pw-text")
|
||||
<div class="icon-inside">
|
||||
<input name="${guiElem.name}" type="password" class="form-control" id="${guiElem.name}" value="$utils.escapeHtml($guiElem.value)" tabindex="$tabindex">
|
||||
<button class="icon-button" type="button" onclick="toggleInputType('${guiElem.name}', '${guiElem.name}eye-icon', '${login.appDataPath}')">
|
||||
<img id="${guiElem.name}eye-icon" src="${login.appDataPath}/resources/eye.svg">
|
||||
</button>
|
||||
</div>
|
||||
|
||||
#elseif ($guiElem.type == "select")
|
||||
#set ($scrollSize = $guiElem.getGuiElems().size())
|
||||
#set ($scrollSize = $math.min($scrollSize,4))
|
||||
#if ($guiElem.multiple)
|
||||
<select name="$guiElem.name" class="form-control" size="$scrollSize" multiple>
|
||||
#else
|
||||
<select name="$guiElem.name" class="form-control">
|
||||
#end
|
||||
#foreach ($option in $guiElem.getGuiElems())
|
||||
#if ($option.selected)
|
||||
<option value="$utils.escapeHtml($option.value)" selected>$option.label</option>
|
||||
#else
|
||||
<option value="$utils.escapeHtml($option.value)">$option.label</option>
|
||||
#end
|
||||
#end ## foreach option
|
||||
</select>
|
||||
|
||||
#elseif ($guiElem.type == "image" )
|
||||
<img src="$utils.escapeHtml($guiElem.value)" alt="$guiElem.label" />
|
||||
#end
|
||||
|
||||
#if ($guiElem.validationMessage && $guiElem.validationMessage.length() > 0)
|
||||
<span class="help-block small">$guiElem.validationMessage</span>
|
||||
#end
|
||||
|
||||
#if ($jsValidation)
|
||||
#renderElementValidation($guiElem, $gui)
|
||||
#end
|
||||
</div>
|
||||
#else
|
||||
## Special handling for checkboxes and radios
|
||||
<div class="col-sm-offset-3 col-sm-6">
|
||||
<label>
|
||||
<input type="$guiElem.type" name="$guiElem.name"
|
||||
value="$utils.escapeHtml($guiElem.value)"
|
||||
#if ($guiElem.checked || $guiElem.value == 'true')
|
||||
checked
|
||||
#end
|
||||
tabindex="$tabindex">
|
||||
$guiElem.label
|
||||
</label>
|
||||
|
||||
#if ($guiElem.validationMessage && $guiElem.validationMessage.length() > 0)
|
||||
<span class="help-block small">$guiElem.validationMessage</span>
|
||||
#end
|
||||
|
||||
#if ($jsValidation)
|
||||
#renderElementValidation($guiElem, $gui)
|
||||
#end
|
||||
</div>
|
||||
#end
|
||||
</div>
|
||||
#end
|
||||
|
||||
#end ## end macro
|
||||
|
||||
|
||||
|
||||
|
||||
#macro(renderElementValidation $guiElem, $gui)
|
||||
#if (($guiElem.validation && $guiElem.validation.length() > 0)||($guiElem.format && $guiElem.format.length() > 0))
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
#if ($guiElem.validation && $guiElem.validation.length() > 0)
|
||||
#if ($guiElem.validation.indexof('return ') > 0)
|
||||
#set ($validationFunc="function () { $guiElem.validation }")
|
||||
#else
|
||||
#set ($validationFunc="function () { return $guiElem.validation ; }")
|
||||
#end
|
||||
#else
|
||||
#set ($validationFunc="function () { return true; }")
|
||||
#end
|
||||
|
||||
var form = document.getElementById('${gui.name}');
|
||||
var formInput = form.elements["${guiElem.name}"];
|
||||
formInput.onchange = function () {
|
||||
var valid = ${validationFunc}.call(this);
|
||||
#if ($guiElem.format && $guiElem.format.length() > 0)
|
||||
valid = valid && (/${guiElem.format}/).test(this.value);
|
||||
#end
|
||||
var parent = this.parentNode;
|
||||
if (!valid) {
|
||||
parent.className += " has-error";
|
||||
} else {
|
||||
parent.className = parent.className.replace(/ has-error/g, '');
|
||||
}
|
||||
|
||||
#if (!$guiElem.optional)
|
||||
if (!this.value) {
|
||||
parent.className += " has-warning";
|
||||
} else {
|
||||
parent.className = parent.className.replace(/ has-warning/g,'');
|
||||
}
|
||||
#end
|
||||
};
|
||||
</script>
|
||||
|
||||
#end
|
||||
#end ## macro
|
||||
|
||||
|
||||
#macro(renderFormLinks $gui)
|
||||
#set ($noLinks = true)
|
||||
#foreach ($guiElem in $gui.getGuiElems())
|
||||
#if ($guiElem.type == "link")
|
||||
#if ($noLinks)
|
||||
<div class="form-group text-center">
|
||||
#set ($noLinks = false)
|
||||
#end
|
||||
<a class="link" title="${utils.escapeHtml($guiElem.label)}" href="$utils.escapeHtml($guiElem.value)">${utils.escapeHtml($guiElem.label)}</a>
|
||||
#end
|
||||
#end
|
||||
#if (!$noLinks)
|
||||
</div>
|
||||
#end
|
||||
#end
|
||||
|
||||
#macro(renderFormControls $gui)
|
||||
<div class="form-group text-center">
|
||||
#set ($buttonClass = "btn")
|
||||
#if ($isFormRequest)
|
||||
#set ($buttonClass = "$buttonClass btn-default")
|
||||
#else
|
||||
#set ($buttonClass = "$buttonClass btn-primary")
|
||||
#end
|
||||
#foreach ($guiElem in $gui.getGuiElems())
|
||||
#if ($guiElem.type == "submit" || $guiElem.type == "button" || $guiElem.type == "reset")
|
||||
<button class="$buttonClass $guiElem.cssClass"
|
||||
## special handling for button which execute a JS
|
||||
#if ($guiElem.name == 'onclick')
|
||||
type="button"
|
||||
onClick="start()"
|
||||
#else
|
||||
name="$guiElem.name"
|
||||
value="$utils.escapeHtml($guiElem.value)"
|
||||
#end
|
||||
>
|
||||
#if ($guiElem.icon != "")
|
||||
#if ($guiElem.icon.contains("http"))
|
||||
<img src="$guiElem.icon" class="$guiElem.iconCssClass" />
|
||||
#else
|
||||
<img src="${login.appDataPath}/resources/$guiElem.icon" class="$guiElem.iconCssClass" />
|
||||
#end
|
||||
#end
|
||||
$utils.escapeHtml($guiElem.label)
|
||||
</button>
|
||||
#end
|
||||
#end ## foreach
|
||||
</div>
|
||||
|
||||
#end ## end macro
|
|
@ -46,14 +46,18 @@ spec:
|
|||
podDisruptionBudget:
|
||||
maxUnavailable: "50%"
|
||||
git:
|
||||
tag: "r-26364fed1751c3f2fa25a6fe1de353169db0e5c8"
|
||||
tag: "r-030a0c32f7aa373371615e3c88c1e7e33eccfd82"
|
||||
dir: "DEFAULT-ADN-AGOV-ADMIN-PROJECT/DEFAULT-ADN-AGOV-ADMIN-INV/proxy-sp"
|
||||
credentials: "git-credentials"
|
||||
keystores:
|
||||
- "proxy-sp-816a1456192f974b57418ca9"
|
||||
- "proxy-sp-39ecde9a0d101628fed3e3be"
|
||||
- "proxy-sp-ident-authenticationrealm-identity"
|
||||
- "proxy-sp-op-onbrdng-authenticationrealm-identity"
|
||||
- "proxy-sp-saml-sp-nevisidm-operations-realm-identity"
|
||||
truststores:
|
||||
- "proxy-sp-ident-authenticationrealm-tls-trust"
|
||||
- "proxy-sp-ident-authenticationrealm-signer-trust"
|
||||
- "proxy-sp-nevisidm-sectoken-truststore"
|
||||
- "proxy-sp-op-onbrdng-authenticationrealm-tls-trust"
|
||||
- "proxy-sp-saml-sp-nevisidm-operations-realm-tls-trust"
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
apiVersion: "operator.nevis-security.ch/v1"
|
||||
kind: "NevisKeyStore"
|
||||
metadata:
|
||||
name: "proxy-sp-816a1456192f974b57418ca9"
|
||||
namespace: "adn-agov-nevisidm-admin-01-uat"
|
||||
labels:
|
||||
deploymentTarget: "proxy-sp"
|
||||
annotations:
|
||||
projectKey: "DEFAULT-ADN-AGOV-ADMIN-PROJECT"
|
||||
patternId: "bd83dfbd467e8211ffe71d28"
|
||||
spec:
|
||||
cn: "ident.agov-w.azure.adnovum.net"
|
||||
usage: "<reserved for future use>"
|
||||
san:
|
||||
dns:
|
||||
- "proxy-sp"
|
||||
- "proxy-sp.adn-agov-nevisidm-admin-01-uat"
|
||||
- "ident.agov-w.azure.adnovum.net"
|
||||
email: []
|
|
@ -0,0 +1,18 @@
|
|||
apiVersion: "operator.nevis-security.ch/v1"
|
||||
kind: "NevisKeyStore"
|
||||
metadata:
|
||||
name: "proxy-sp-ident-authenticationrealm-identity"
|
||||
namespace: "adn-agov-nevisidm-admin-01-uat"
|
||||
labels:
|
||||
deploymentTarget: "proxy-sp"
|
||||
annotations:
|
||||
projectKey: "DEFAULT-ADN-AGOV-ADMIN-PROJECT"
|
||||
patternId: "bd83dfbd467e8211ffe71d28"
|
||||
spec:
|
||||
cn: "proxy-sp"
|
||||
usage: "<reserved for future use>"
|
||||
san:
|
||||
dns:
|
||||
- "proxy-sp"
|
||||
- "proxy-sp.adn-agov-nevisidm-admin-01-uat"
|
||||
email: []
|
|
@ -0,0 +1,14 @@
|
|||
apiVersion: "operator.nevis-security.ch/v1"
|
||||
kind: "NevisTrustStore"
|
||||
metadata:
|
||||
name: "proxy-sp-ident-authenticationrealm-signer-trust"
|
||||
namespace: "adn-agov-nevisidm-admin-01-uat"
|
||||
labels:
|
||||
deploymentTarget: "proxy-sp"
|
||||
annotations:
|
||||
projectKey: "DEFAULT-ADN-AGOV-ADMIN-PROJECT"
|
||||
patternId: "bd83dfbd467e8211ffe71d28"
|
||||
spec:
|
||||
keystores:
|
||||
- name: "auth-sh4r3d-nevisidm-sectoken-signer"
|
||||
namespace: "adn-agov-nevisidm-admin-01-uat"
|
|
@ -0,0 +1,14 @@
|
|||
apiVersion: "operator.nevis-security.ch/v1"
|
||||
kind: "NevisTrustStore"
|
||||
metadata:
|
||||
name: "proxy-sp-ident-authenticationrealm-tls-trust"
|
||||
namespace: "adn-agov-nevisidm-admin-01-uat"
|
||||
labels:
|
||||
deploymentTarget: "proxy-sp"
|
||||
annotations:
|
||||
projectKey: "DEFAULT-ADN-AGOV-ADMIN-PROJECT"
|
||||
patternId: "bd83dfbd467e8211ffe71d28"
|
||||
spec:
|
||||
keystores:
|
||||
- name: "auth-default-identity"
|
||||
namespace: "adn-agov-nevisidm-admin-01-uat"
|
|
@ -10,6 +10,10 @@ metadata:
|
|||
patternId: "bd83dfbd467e8211ffe71d28"
|
||||
spec:
|
||||
hosts:
|
||||
- host: "ident.agov-w.azure.adnovum.net"
|
||||
protocol: "HTTPS"
|
||||
servicePort: 8443
|
||||
serviceName: "proxy-sp"
|
||||
- host: "op.agov-w.azure.adnovum.net"
|
||||
protocol: "HTTPS"
|
||||
servicePort: 8443
|
||||
|
|
|
@ -13,6 +13,7 @@ instance:
|
|||
ports:
|
||||
- "0.0.0.0:11080"
|
||||
- "0.0.0.0:8443"
|
||||
- "0.0.0.0:8443"
|
||||
control:
|
||||
start: "systemctl restart nevisproxy@default"
|
||||
stop: "systemctl stop nevisproxy@default"
|
||||
|
|
|
@ -11,8 +11,13 @@
|
|||
<Server User="nevis" Group="root" ServerName="proxy-sp" Timeout="30" MaxClients="600" MaxRequestsPerChild="0" KeepAlive="on" KeepAliveTimeout="5" MaxKeepAliveRequests="100" LimitRequestLine="5120" LimitRequestBody="512000" LimitRequestFields="50" LimitRequestFieldsize="5120" ServerRoot="/var/opt/nevisproxy/default" CoreDumpDirectory="" ErrorLog=""|/bin/sed -u s/^/[apache.log]\ /g"" LogLevel="notice" TransferLog=""|/bin/stdbuf -oL /bin/egrep -v GET./.....?ness"" LogFormat=""[access.log] %h %l %u %t \"%r\" %>s %b %{content-length}i %T %v \"%{Referer}i\" \"%{User-Agent}i\" trID=%{UNIQUE_ID}e"" SSLPassPhraseDialog="builtin" SSLSessionCache="shmcb:/var/opt/nevisproxy/default/run/apache_shmcb"/>
|
||||
<!-- source: pattern://bd83dfbd467e8211ffe71d28 -->
|
||||
<Connector port="11080" name="management" listen="0.0.0.0:11080"/>
|
||||
<!-- source: pattern://816a1456192f974b57418ca9 -->
|
||||
<Connector port="443" name="ident.agov-w.azure.adnovum.net" listen="0.0.0.0:8443">
|
||||
<!-- source: pattern://816a1456192f974b57418ca9, pattern://816a1456192f974b57418ca9#keystore -->
|
||||
<SSL SSLCipherSuite="ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256" SSLOptions="+OptRenegotiate +StdEnvVars +ExportCertData" SSLProtocol="-all +TLSv1.2 -TLSv1.3" SSLCertificateFile="/var/opt/keys/own/proxy-sp-816a1456192f974b57418ca9/cert.pem" SSLCertificateKeyFile="/var/opt/keys/own/proxy-sp-816a1456192f974b57418ca9/key.pem" SSLCertificateChainFile="/var/opt/keys/own/proxy-sp-816a1456192f974b57418ca9/ca-chain.pem" SSLInsecureRenegotiation="off" SSLHonorCipherOrder="on"/>
|
||||
</Connector>
|
||||
<!-- source: pattern://39ecde9a0d101628fed3e3be -->
|
||||
<Connector port="443" name="op.agov-w.azure.adnovum.net" listen="0.0.0.0:8443">
|
||||
<Connector port="443" name="op.agov-w.azure.adnovum.net" nameVirtualHost="0.0.0.0:8443">
|
||||
<!-- source: pattern://39ecde9a0d101628fed3e3be, pattern://39ecde9a0d101628fed3e3be#keystore -->
|
||||
<SSL SSLCipherSuite="ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256" SSLOptions="+OptRenegotiate +StdEnvVars +ExportCertData" SSLProtocol="-all +TLSv1.2 -TLSv1.3" SSLCertificateFile="/var/opt/keys/own/proxy-sp-39ecde9a0d101628fed3e3be/cert.pem" SSLCertificateKeyFile="/var/opt/keys/own/proxy-sp-39ecde9a0d101628fed3e3be/key.pem" SSLCertificateChainFile="/var/opt/keys/own/proxy-sp-39ecde9a0d101628fed3e3be/ca-chain.pem" SSLInsecureRenegotiation="off" SSLHonorCipherOrder="on"/>
|
||||
</Connector>
|
||||
|
@ -24,6 +29,11 @@
|
|||
<Context docBase="/var/opt/nevisproxy/default/host-management"/>
|
||||
</Host>
|
||||
<!-- source: pattern://bd83dfbd467e8211ffe71d28 -->
|
||||
<Host name="ident.agov-w.azure.adnovum.net">
|
||||
<!-- source: pattern://816a1456192f974b57418ca9 -->
|
||||
<Context entryURI="/" unsecureConnection="allow" trailingSlashRedirect="true" filePreload="false" docBase="/var/opt/nevisproxy/default/host-ident.agov-w.azure.adnovum.net" path="" allowedMethods="ALL-HTTP ALL-WEBDAV -TRACE -CONNECT"/>
|
||||
</Host>
|
||||
<!-- source: pattern://bd83dfbd467e8211ffe71d28 -->
|
||||
<Host name="op.agov-w.azure.adnovum.net">
|
||||
<!-- source: pattern://39ecde9a0d101628fed3e3be -->
|
||||
<Context entryURI="/" unsecureConnection="allow" trailingSlashRedirect="true" filePreload="false" docBase="/var/opt/nevisproxy/default/host-op.agov-w.azure.adnovum.net" path="" allowedMethods="ALL-HTTP ALL-WEBDAV -TRACE -CONNECT"/>
|
||||
|
|
|
@ -0,0 +1,398 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "/opt/nevisproxy/dtd/web-app_2_3.dtd">
|
||||
<web-app>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<context-param>
|
||||
<param-name>SectokenVerifierCert</param-name>
|
||||
<param-value>/var/opt/keys/trust/proxy-sp-ident-authenticationrealm-signer-trust/truststore.pem</param-value>
|
||||
</context-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<filter>
|
||||
<filter-name>AuthenticationService_IDENT-AuthenticationRealm</filter-name>
|
||||
<filter-class>ch::nevis::isiweb4::filter::auth::IdentityCreationFilter</filter-class>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>AuthenticationServlet</param-name>
|
||||
<param-value>Connector_IDENT-AuthenticationRealm</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>BodyReadSize</param-name>
|
||||
<param-value>32768</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>EntryPointID</param-name>
|
||||
<param-value>ident.agov-w.azure.adnovum.net</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>InactiveInterval</param-name>
|
||||
<param-value>7200</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>InterceptionRedirect</param-name>
|
||||
<param-value>never</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>LoginRendererServlet</param-name>
|
||||
<param-value>LoginRenderer_nevisLogrend</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>Realm</param-name>
|
||||
<param-value>IDENT-AuthenticationRealm</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>RecheckAuthentication</param-name>
|
||||
<param-value>On</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>RenewIdentification</param-name>
|
||||
<param-value>true</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>StateKey</param-name>
|
||||
<param-value>IDENT-AuthenticationRealm</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>StoreInterceptedRequest</param-name>
|
||||
<param-value>false</param-value>
|
||||
</init-param>
|
||||
</filter>
|
||||
<!-- source: pattern://58ece0328f5bf4d78e1a82d2, pattern://58ece0328f5bf4d78e1a82d2#filters -->
|
||||
<filter>
|
||||
<filter-name>DefaultErrorFilter</filter-name>
|
||||
<filter-class>ch::nevis::isiweb4::filter::error::ErrorFilter</filter-class>
|
||||
<!-- source: pattern://58ece0328f5bf4d78e1a82d2#filters -->
|
||||
<init-param>
|
||||
<param-name>CheckAcceptHeader</param-name>
|
||||
<param-value>true</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://58ece0328f5bf4d78e1a82d2#filters -->
|
||||
<init-param>
|
||||
<param-name>PlaceHolders</param-name>
|
||||
<param-value>
|
||||
TransferIdHolder:TRANSFER_ID
|
||||
TimestampHolder:TIMESTAMP
|
||||
</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://58ece0328f5bf4d78e1a82d2#filters -->
|
||||
<init-param>
|
||||
<param-name>StatusCode</param-name>
|
||||
<param-value>
|
||||
400:file:/resources/errorPages/404.html:reset-header:reset-status-code
|
||||
403:file:/resources/errorPages/403.html:reset-header:reset-status-code
|
||||
404:file:/resources/errorPages/404.html:reset-header:reset-status-code
|
||||
500:file:/resources/errorPages/500.html:reset-header:reset-status-code
|
||||
502:file:/resources/errorPages/502.html:reset-header:reset-status-code
|
||||
</param-value>
|
||||
</init-param>
|
||||
</filter>
|
||||
<!-- source: pattern://816a1456192f974b57418ca9 -->
|
||||
<filter>
|
||||
<filter-name>ErrorHandler_Default</filter-name>
|
||||
<filter-class>ch::nevis::isiweb4::filter::error::ErrorFilter</filter-class>
|
||||
<!-- source: pattern://816a1456192f974b57418ca9 -->
|
||||
<init-param>
|
||||
<param-name>PlaceHolders</param-name>
|
||||
<param-value>
|
||||
TRANSFER_ID:TRANSFER_ID
|
||||
TIMESTAMP:TIMESTAMP
|
||||
</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://816a1456192f974b57418ca9 -->
|
||||
<init-param>
|
||||
<param-name>StatusCode</param-name>
|
||||
<param-value>
|
||||
403:Hosting_Default:/errorpages/403.html:reset-header:keep-status-code
|
||||
404:Hosting_Default:/errorpages/404.html:keep-header:keep-status-code
|
||||
500:Hosting_Default:/errorpages/500.html:reset-header:keep-status-code
|
||||
502:Hosting_Default:/errorpages/502.html:keep-header:keep-status-code
|
||||
</param-value>
|
||||
</init-param>
|
||||
</filter>
|
||||
<!-- source: pattern://816a1456192f974b57418ca9 -->
|
||||
<filter>
|
||||
<filter-name>Qos</filter-name>
|
||||
<filter-class>ch:nevis:navajo:apglue:httpd_2_4_x:servlet:ApacheConfigFilter</filter-class>
|
||||
<filter-lib>libApache2_4_Servlet.so.1</filter-lib>
|
||||
<!-- source: pattern://816a1456192f974b57418ca9 -->
|
||||
<init-param>
|
||||
<param-name>ServerConfig</param-name>
|
||||
<param-value>
|
||||
QS_SrvMaxConnClose 85%
|
||||
QS_SrvMaxConnPerIP 75 500
|
||||
QS_SrvMinDataRate 120 1500 500
|
||||
</param-value>
|
||||
</init-param>
|
||||
</filter>
|
||||
<!-- source: pattern://816a1456192f974b57418ca9 -->
|
||||
<filter>
|
||||
<filter-name>Redirect_Default</filter-name>
|
||||
<filter-class>ch::nevis::isiweb4::filter::rewrite::RewriteFilter</filter-class>
|
||||
<!-- source: pattern://816a1456192f974b57418ca9 -->
|
||||
<init-param>
|
||||
<param-name>RequestURI</param-name>
|
||||
<param-value>^/$:/process:R</param-value>
|
||||
</init-param>
|
||||
</filter>
|
||||
<!-- source: pattern://36886a1934993d1f69690e1d -->
|
||||
<filter>
|
||||
<filter-name>ResponseHeader_Base_Security_Response_Headers</filter-name>
|
||||
<filter-class>ch::nevis::isiweb4::filter::delegation::HeaderDelegationFilter</filter-class>
|
||||
<!-- source: pattern://36886a1934993d1f69690e1d -->
|
||||
<init-param>
|
||||
<param-name>DelegateToFrontend</param-name>
|
||||
<param-value>
|
||||
Cross-Origin-Embedder-Policy:require-corp
|
||||
Cross-Origin-Opener-Policy:same-origin
|
||||
Cross-Origin-Resource-Policy:same-site
|
||||
Permissions-Policy:geolocation=(), camera=(), microphone=(), interest-cohort=()
|
||||
Referrer-Policy:strict-origin-when-cross-origin
|
||||
Strict-Transport-Security:max-age=63072000; includeSubDomains;
|
||||
X-Content-Type-Options:nosniff
|
||||
X-Frame-Options:DENY
|
||||
</param-value>
|
||||
</init-param>
|
||||
</filter>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<filter>
|
||||
<filter-name>SessionHandler_IDENT-AuthenticationRealm</filter-name>
|
||||
<filter-class>ch::nevis::nevisproxy::filter::session::SessionManagementFilter</filter-class>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>Cookie.ExtraAttributes</param-name>
|
||||
<param-value>SameSite=None</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>Cookie.Name</param-name>
|
||||
<param-value>Session_IDENT-AuthenticationRealm</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>Cookie.Secure</param-name>
|
||||
<param-value>true</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>Identification</param-name>
|
||||
<param-value>COOKIE</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>MaxInactiveInterval</param-name>
|
||||
<param-value>600</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>MaxLifetime</param-name>
|
||||
<param-value>28800</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>Servlet</param-name>
|
||||
<param-value>LocalSessionStoreServlet</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>UpdateTimeStampMinInterval</param-name>
|
||||
<param-value>120</param-value>
|
||||
</init-param>
|
||||
</filter>
|
||||
<!-- source: pattern://816a1456192f974b57418ca9 -->
|
||||
<filter-mapping>
|
||||
<filter-name>Redirect_Default</filter-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</filter-mapping>
|
||||
<!-- source: pattern://58ece0328f5bf4d78e1a82d2 -->
|
||||
<filter-mapping>
|
||||
<filter-name>DefaultErrorFilter</filter-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</filter-mapping>
|
||||
<!-- source: pattern://816a1456192f974b57418ca9 -->
|
||||
<filter-mapping>
|
||||
<filter-name>ErrorHandler_Default</filter-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</filter-mapping>
|
||||
<!-- source: pattern://36886a1934993d1f69690e1d -->
|
||||
<filter-mapping>
|
||||
<filter-name>ResponseHeader_Base_Security_Response_Headers</filter-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</filter-mapping>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<filter-mapping>
|
||||
<filter-name>SessionHandler_IDENT-AuthenticationRealm</filter-name>
|
||||
<url-pattern>/process/*</url-pattern>
|
||||
</filter-mapping>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<filter-mapping>
|
||||
<filter-name>AuthenticationService_IDENT-AuthenticationRealm</filter-name>
|
||||
<url-pattern>/process/*</url-pattern>
|
||||
</filter-mapping>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<listener>
|
||||
<listener-class>ch::nevis::isiweb4::listener::SessionListener</listener-class>
|
||||
</listener>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<servlet>
|
||||
<servlet-name>Connector_IDENT-AuthenticationRealm</servlet-name>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<servlet-class>ch::nevis::isiweb4::servlet::connector::soap::esauth4::Esauth4ConnectorServlet</servlet-class>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>Transport.DNSCache.ttl</param-name>
|
||||
<param-value>60</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>Transport.InetAddress</param-name>
|
||||
<param-value>auth:8991</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>Transport.KeepAlive.LifeTime</param-name>
|
||||
<param-value>30</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>Transport.RequestTimeout</param-name>
|
||||
<param-value>90000</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>Transport.ResourceManager.RetryTimeout</param-name>
|
||||
<param-value>0</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>Transport.SSLCACertificateFile</param-name>
|
||||
<param-value>/var/opt/keys/trust/proxy-sp-ident-authenticationrealm-tls-trust/truststore.pem</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>Transport.SSLCheckPeerHostname</param-name>
|
||||
<param-value>false</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>Transport.SSLClientCertificateFile</param-name>
|
||||
<param-value>/var/opt/keys/own/proxy-sp-ident-authenticationrealm-identity/cert.pem</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>Transport.SSLClientKeyFile</param-name>
|
||||
<param-value>/var/opt/keys/own/proxy-sp-ident-authenticationrealm-identity/key.pem</param-value>
|
||||
</init-param>
|
||||
</servlet>
|
||||
<!-- source: pattern://6977f8a683f63744bbd56d69 -->
|
||||
<servlet>
|
||||
<servlet-name>Hosting_Default</servlet-name>
|
||||
<!-- source: pattern://6977f8a683f63744bbd56d69 -->
|
||||
<servlet-class>ch::nevis::isiweb4::servlet::defaults::DefaultServlet</servlet-class>
|
||||
</servlet>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<servlet>
|
||||
<servlet-name>LocalSessionStoreServlet</servlet-name>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<servlet-class>ch::nevis::nevisproxy::servlet::cache::local::LocalSessionStoreServlet</servlet-class>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>MaxInactiveInterval</param-name>
|
||||
<param-value>600</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>MaxLifetime</param-name>
|
||||
<param-value>28800</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://3fd09bb6cfbd34874595c263 -->
|
||||
<init-param>
|
||||
<param-name>MemorySize</param-name>
|
||||
<param-value>512000000</param-value>
|
||||
</init-param>
|
||||
</servlet>
|
||||
<!-- source: pattern://8401da6318c6915d689cdfc9 -->
|
||||
<servlet>
|
||||
<servlet-name>LoginRenderer_nevisLogrend</servlet-name>
|
||||
<!-- source: pattern://8401da6318c6915d689cdfc9 -->
|
||||
<servlet-class>ch::nevis::isiweb4::servlet::rendering::LoginRendererServlet</servlet-class>
|
||||
<!-- source: pattern://8401da6318c6915d689cdfc9 -->
|
||||
<init-param>
|
||||
<param-name>PropagateRemoteHeaders</param-name>
|
||||
<param-value>Set-Cookie</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://8401da6318c6915d689cdfc9 -->
|
||||
<init-param>
|
||||
<param-name>RenderingProvider</param-name>
|
||||
<param-value>remote:NevisLogrendConnector_nevisLogrend:/nevislogrend/index.vm?logrendresourcepath=/nevislogrend</param-value>
|
||||
</init-param>
|
||||
</servlet>
|
||||
<!-- source: pattern://8401da6318c6915d689cdfc9 -->
|
||||
<servlet>
|
||||
<servlet-name>NevisLogrendConnector_nevisLogrend</servlet-name>
|
||||
<!-- source: pattern://8401da6318c6915d689cdfc9 -->
|
||||
<servlet-class>ch::nevis::isiweb4::servlet::connector::http::HttpConnectorServlet</servlet-class>
|
||||
<!-- source: pattern://8401da6318c6915d689cdfc9 -->
|
||||
<init-param>
|
||||
<param-name>InetAddress</param-name>
|
||||
<param-value>logrend:8988</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://8401da6318c6915d689cdfc9 -->
|
||||
<init-param>
|
||||
<param-name>MappingType</param-name>
|
||||
<param-value>pathinfo</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://8401da6318c6915d689cdfc9 -->
|
||||
<init-param>
|
||||
<param-name>ResourceManager.RetryTimeout</param-name>
|
||||
<param-value>0</param-value>
|
||||
</init-param>
|
||||
<!-- source: pattern://8401da6318c6915d689cdfc9 -->
|
||||
<init-param>
|
||||
<param-name>URIPrefix</param-name>
|
||||
<param-value>/nevislogrend</param-value>
|
||||
</init-param>
|
||||
</servlet>
|
||||
<!-- source: pattern://8401da6318c6915d689cdfc9 -->
|
||||
<servlet-mapping>
|
||||
<servlet-name>NevisLogrendConnector_nevisLogrend</servlet-name>
|
||||
<url-pattern>/nevislogrend/*</url-pattern>
|
||||
</servlet-mapping>
|
||||
<!-- source: pattern://6977f8a683f63744bbd56d69 -->
|
||||
<servlet-mapping>
|
||||
<servlet-name>Hosting_Default</servlet-name>
|
||||
<url-pattern>/process/*</url-pattern>
|
||||
</servlet-mapping>
|
||||
<servlet-mapping>
|
||||
<servlet-name>Hosting_Default</servlet-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</servlet-mapping>
|
||||
<!-- source: pattern://816a1456192f974b57418ca9 -->
|
||||
<mime-mapping>
|
||||
<extension>css</extension>
|
||||
<mime-type>text/css</mime-type>
|
||||
</mime-mapping>
|
||||
<!-- source: pattern://816a1456192f974b57418ca9 -->
|
||||
<mime-mapping>
|
||||
<extension>ico</extension>
|
||||
<mime-type>image/x-icon</mime-type>
|
||||
</mime-mapping>
|
||||
<!-- source: pattern://816a1456192f974b57418ca9 -->
|
||||
<mime-mapping>
|
||||
<extension>png</extension>
|
||||
<mime-type>image/png</mime-type>
|
||||
</mime-mapping>
|
||||
<!-- source: pattern://816a1456192f974b57418ca9 -->
|
||||
<mime-mapping>
|
||||
<extension>html</extension>
|
||||
<mime-type>text/html</mime-type>
|
||||
</mime-mapping>
|
||||
</web-app>
|
|
@ -0,0 +1,50 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Nevis - Forbidden</title>
|
||||
<meta charset="utf-8">
|
||||
<link href="/resources/bootstrap.min.css" rel="stylesheet" type="text/css">
|
||||
<link href="/resources/default.css" rel="stylesheet" type="text/css" media="all">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
|
||||
</head>
|
||||
<body>
|
||||
<br/><br/><br/><br/><br/><br/><br/><br/><br/>
|
||||
<header id="header" class="container-fluid">
|
||||
<img class="logo center-block" src="/resources/logo.png" alt="NEVIS Security Suite">
|
||||
</header>
|
||||
<main id="content" class="container">
|
||||
<div id="loginform">
|
||||
<h1 align="center">Forbidden</h1>
|
||||
<div align="center"><br>
|
||||
<br>
|
||||
<table border="0">
|
||||
<tr>
|
||||
<td>You are not authorized for this application. Contact the person responsible for the access infrastructure.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Sie sind nicht berechtigt für diese Applikation. Kontaktieren Sie den Verantwortlichen der Zugangsinfrastruktur.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Vous n'êtes pas autorisé pour cette application. Contactez la personne responsable de l'infrastructure d'accès.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Non è autorizzato per questa applicazione. Contatta il leader delle infrastrutture di accesso.</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
<footer id="footer" class="text-primary">
|
||||
<div class="row small">
|
||||
<div class="col-md-4 hidden-xs hidden-sm">Copyright © 2023 NEVIS Security AG</div>
|
||||
<div class="col-xs-12 col-md-4 text-center text-uppercase logo-round-container">
|
||||
<div class="logo-round center-block">
|
||||
<img src="/resources/logo.png" alt="NEVIS Security Suite">
|
||||
</div>
|
||||
<strong>NEVIS Security Suite</strong>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,50 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Nevis - Page Not Found</title>
|
||||
<meta charset="utf-8">
|
||||
<link href="/resources/bootstrap.min.css" rel="stylesheet" type="text/css">
|
||||
<link href="/resources/default.css" rel="stylesheet" type="text/css" media="all">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
|
||||
</head>
|
||||
<body>
|
||||
<br/><br/><br/><br/><br/><br/><br/><br/><br/>
|
||||
<header id="header" class="container-fluid">
|
||||
<img class="logo center-block" src="/resources/logo.png" alt="NEVIS Security Suite">
|
||||
</header>
|
||||
<main id="content" class="container">
|
||||
<div id="loginform">
|
||||
<h1 align="center">Page Not Found</h1>
|
||||
<div align="center"><br>
|
||||
<br>
|
||||
<table border="0">
|
||||
<tr>
|
||||
<td>The application you selected was not found on this server.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Die von Ihnen angewählte Applikation existiert nicht auf diesem Server.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>L'application que vous avez sélectionnée n'existe pas sur ce serveur.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>L'applicazione che ha selezionato non è stata trovata su questo server.</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
<footer id="footer" class="text-primary">
|
||||
<div class="row small">
|
||||
<div class="col-md-4 hidden-xs hidden-sm">Copyright © 2023 NEVIS Security AG</div>
|
||||
<div class="col-xs-12 col-md-4 text-center text-uppercase logo-round-container">
|
||||
<div class="logo-round center-block">
|
||||
<img src="/resources/logo.png" alt="NEVIS Security Suite">
|
||||
</div>
|
||||
<strong>NEVIS Security Suite</strong>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,50 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Nevis - Server Error</title>
|
||||
<meta charset="utf-8">
|
||||
<link href="/resources/bootstrap.min.css" rel="stylesheet" type="text/css">
|
||||
<link href="/resources/default.css" rel="stylesheet" type="text/css" media="all">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
|
||||
</head>
|
||||
<body>
|
||||
<br/><br/><br/><br/><br/><br/><br/><br/><br/>
|
||||
<header id="header" class="container-fluid">
|
||||
<img class="logo center-block" src="/resources/logo.png" alt="NEVIS Security Suite">
|
||||
</header>
|
||||
<main id="content" class="container">
|
||||
<div id="loginform">
|
||||
<h1 align="center">Server Error</h1>
|
||||
<div align="center"><br>
|
||||
<br>
|
||||
<table border="0">
|
||||
<tr>
|
||||
<td>An application error has occurred. Try again and contact the system administrator.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Es ist ein Applikationsfehler aufgetreten. Probieren Sie es nochmals und verständigen Sie den System-Administrator.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Une erreur d'application s'est produite. Essayez à nouveau et contactez l'administrateur système.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Si è verificato un errore nell'applicazione. Provi nuovamente e contatti l'amministratore di sistema.</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
<footer id="footer" class="text-primary">
|
||||
<div class="row small">
|
||||
<div class="col-md-4 hidden-xs hidden-sm">Copyright © 2023 NEVIS Security AG</div>
|
||||
<div class="col-xs-12 col-md-4 text-center text-uppercase logo-round-container">
|
||||
<div class="logo-round center-block">
|
||||
<img src="/resources/logo.png" alt="NEVIS Security Suite">
|
||||
</div>
|
||||
<strong>NEVIS Security Suite</strong>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,50 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Nevis - Server Error</title>
|
||||
<meta charset="utf-8">
|
||||
<link href="/resources/bootstrap.min.css" rel="stylesheet" type="text/css">
|
||||
<link href="/resources/default.css" rel="stylesheet" type="text/css" media="all">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
|
||||
</head>
|
||||
<body>
|
||||
<br/><br/><br/><br/><br/><br/><br/><br/><br/>
|
||||
<header id="header" class="container-fluid">
|
||||
<img class="logo center-block" src="/resources/logo.png" alt="NEVIS Security Suite">
|
||||
</header>
|
||||
<main id="content" class="container">
|
||||
<div id="loginform">
|
||||
<h1 align="center">Server Error</h1>
|
||||
<div align="center"><br>
|
||||
<br>
|
||||
<table border="0">
|
||||
<tr>
|
||||
<td>An application error has occurred. Try again and contact the system administrator.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Es ist ein Applikationsfehler aufgetreten. Probieren Sie es nochmals und verständigen Sie den System-Administrator.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Une erreur d'application s'est produite. Essayez à nouveau et contactez l'administrateur système.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Si è verificato un errore nell'applicazione. Provi nuovamente e contatti l'amministratore di sistema.</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
<footer id="footer" class="text-primary">
|
||||
<div class="row small">
|
||||
<div class="col-md-4 hidden-xs hidden-sm">Copyright © 2023 NEVIS Security AG</div>
|
||||
<div class="col-xs-12 col-md-4 text-center text-uppercase logo-round-container">
|
||||
<div class="logo-round center-block">
|
||||
<img src="/resources/logo.png" alt="NEVIS Security Suite">
|
||||
</div>
|
||||
<strong>NEVIS Security Suite</strong>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
After Width: | Height: | Size: 1.2 KiB |
|
@ -0,0 +1,50 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Nevis - Welcome</title>
|
||||
<meta charset="utf-8">
|
||||
<link href="/resources/bootstrap.min.css" rel="stylesheet" type="text/css">
|
||||
<link href="/resources/default.css" rel="stylesheet" type="text/css" media="all">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
|
||||
</head>
|
||||
<body>
|
||||
<br/><br/><br/><br/><br/><br/><br/><br/><br/>
|
||||
<header id="header" class="container-fluid">
|
||||
<img class="logo center-block" src="/resources/logo.png" alt="NEVIS Security Suite">
|
||||
</header>
|
||||
<main id="content" class="container">
|
||||
<div id="loginform">
|
||||
<h1 align="center">Welcome</h1>
|
||||
<div align="center"><br>
|
||||
<br>
|
||||
<table border="0">
|
||||
<tr>
|
||||
<td>The application you selected was not found on this server.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Die von Ihnen angewählte Applikation existiert nicht auf diesem Server.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>L'application que vous avez sélectionnée n'existe pas sur ce serveur.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>L'applicazione che ha selezionato non è stata trovata su questo server.</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
<footer id="footer" class="text-primary">
|
||||
<div class="row small">
|
||||
<div class="col-md-4 hidden-xs hidden-sm">Copyright © 2023 NEVIS Security AG</div>
|
||||
<div class="col-xs-12 col-md-4 text-center text-uppercase logo-round-container">
|
||||
<div class="logo-round center-block">
|
||||
<img src="/resources/logo.png" alt="NEVIS Security Suite">
|
||||
</div>
|
||||
<strong>NEVIS Security Suite</strong>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,158 @@
|
|||
/********************************************************
|
||||
* Layout
|
||||
********************************************************/
|
||||
|
||||
html { /* magic to position footer */
|
||||
position: relative;
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
margin-bottom: 76px; /* == footer height */
|
||||
}
|
||||
|
||||
.container, .container-fluid {
|
||||
padding-left: 36px;
|
||||
padding-right: 36px;
|
||||
}
|
||||
|
||||
nav {
|
||||
min-height: 100px;
|
||||
padding: 36px;
|
||||
}
|
||||
|
||||
header {
|
||||
margin-bottom: 16px; /* h1.logintitle adds 20px => 36px */
|
||||
}
|
||||
|
||||
.container {
|
||||
min-width: 260px;
|
||||
max-width: 700px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin-bottom: 100px;
|
||||
}
|
||||
|
||||
footer {
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
padding: 0 36px;
|
||||
}
|
||||
|
||||
img {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/********************************************************
|
||||
* Header
|
||||
********************************************************/
|
||||
|
||||
header .logo {
|
||||
width: 20%;
|
||||
max-width: 124px;
|
||||
}
|
||||
|
||||
/********************************************************
|
||||
* Dropdown
|
||||
********************************************************/
|
||||
a.dropdown-toggle {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.dropdown-toggle:hover {
|
||||
color: #00868C;
|
||||
border-bottom: 3px solid #00868C;
|
||||
}
|
||||
|
||||
.dropdown-menu {
|
||||
padding: 5px 0;
|
||||
}
|
||||
|
||||
.dropdown-menu li > a {
|
||||
padding: 6px 28px;
|
||||
}
|
||||
|
||||
.dropdown-menu a > .prefix {
|
||||
display: inline-block;
|
||||
min-width: 22px;
|
||||
margin-right: 28px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
/********************************************************
|
||||
* Form
|
||||
********************************************************/
|
||||
|
||||
/* Labels should not be bold */
|
||||
label {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
/* Make error messages bold */
|
||||
.has-error .help-block {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Change button size, by default 116px in width */
|
||||
.btn {
|
||||
min-width: 116px;
|
||||
padding: 3px 12px;
|
||||
}
|
||||
|
||||
/* Disable gradient in buttons, ughhhh */
|
||||
.btn.btn-primary {
|
||||
border-color: transparent;
|
||||
background-image: none;
|
||||
text-shadow: none;
|
||||
box-shadow: none;
|
||||
-webkit-box-shadow: none;
|
||||
}
|
||||
|
||||
.help-block a, .help-block a:visited {
|
||||
color: #00868C;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.help-block a:hover {
|
||||
color: #65B6B9;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/********************************************************
|
||||
* Footer
|
||||
********************************************************/
|
||||
footer .row {
|
||||
margin: 36px 0 0 0;
|
||||
height: 40px;
|
||||
padding-top: 14px;
|
||||
line-height: 26px; /* to center text: height - padding-top = 26px */
|
||||
border-top: 1px solid #00868c;
|
||||
}
|
||||
|
||||
footer .row > div { /* Fix alignment between border + text on Bootstrap grid */
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
footer .logo-round-container {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
footer .logo-round {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: -33px; /* found visually with Chrome Dev Tools */
|
||||
height: 36px;
|
||||
width: 36px;
|
||||
border: 1px solid #00868c;
|
||||
border-radius: 18px;
|
||||
background: #fff;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
footer .logo-round > img {
|
||||
display: block;
|
||||
}
|
After Width: | Height: | Size: 9.5 KiB |
|
@ -236,21 +236,6 @@
|
|||
</init-param>
|
||||
</filter>
|
||||
<!-- source: pattern://39ecde9a0d101628fed3e3be -->
|
||||
<filter>
|
||||
<filter-name>Qos</filter-name>
|
||||
<filter-class>ch:nevis:navajo:apglue:httpd_2_4_x:servlet:ApacheConfigFilter</filter-class>
|
||||
<filter-lib>libApache2_4_Servlet.so.1</filter-lib>
|
||||
<!-- source: pattern://39ecde9a0d101628fed3e3be -->
|
||||
<init-param>
|
||||
<param-name>ServerConfig</param-name>
|
||||
<param-value>
|
||||
QS_SrvMaxConnClose 85%
|
||||
QS_SrvMaxConnPerIP 75 500
|
||||
QS_SrvMinDataRate 120 1500 500
|
||||
</param-value>
|
||||
</init-param>
|
||||
</filter>
|
||||
<!-- source: pattern://39ecde9a0d101628fed3e3be -->
|
||||
<filter>
|
||||
<filter-name>Redirect_Default</filter-name>
|
||||
<filter-class>ch::nevis::isiweb4::filter::rewrite::RewriteFilter</filter-class>
|
||||
|
|
|
@ -25,4 +25,17 @@ else
|
|||
echo "up: https://0.0.0.0:8443"
|
||||
fi
|
||||
|
||||
# service at "https://0.0.0.0:8443"
|
||||
SSL=`echo | openssl s_client -connect 0.0.0.0:8443`
|
||||
HC=`curl --insecure --silent --output /dev/null --write-out "%{http_code}" https://0.0.0.0:8443`
|
||||
CON=$?
|
||||
if [[ $SSL = *"Acceptable client certificate CA names"* ]]; then
|
||||
echo "skipped: https://0.0.0.0:8443"
|
||||
elif [ "$CON" -ne 0 ]; then
|
||||
echo "down: https://0.0.0.0:8443 (exit code $CON)"
|
||||
EXIT_CODE=$CON
|
||||
else
|
||||
echo "up: https://0.0.0.0:8443"
|
||||
fi
|
||||
|
||||
exit $EXIT_CODE
|
||||
|
|