Commit 9870d3fe by Antti Tonkyra

Merge branch 'master' of dev.insomnia.fi:/data/bortal

2 parents 2693c2d5 df5c63e1
Showing with 2131 additions and 486 deletions
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 0 (0x0)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=FI, ST=Tampere, O=Bortal, CN=CA
Validity
Not Before: Jan 1 00:00:00 1970 GMT
Not After : Mar 23 16:55:49 2072 GMT
Subject: C=FI, ST=Tampere, O=Bortal, CN=CA
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
00:f7:fa:8f:54:32:02:aa:16:91:a2:25:6f:33:ed:
9e:83:7f:2c:01:9c:d2:8a:90:73:14:b0:01:ec:e0:
49:16:a0:fa:9a:d7:e9:bf:af:79:ac:ad:06:59:c1:
df:c3:5c:8a:4e:63:c0:55:5c:df:14:f7:f4:39:46:
ff:4f:ff:a4:43:97:67:db:b8:4f:fc:92:ed:8b:de:
0b:78:d7:fe:56:94:a5:64:3d:60:4c:01:73:54:87:
b6:6c:10:2c:37:dd:2d:6b:5c:c9:28:e8:6d:2b:58:
3d:f7:ec:00:a2:0a:92:55:c8:10:cf:85:67:dc:10:
0e:bb:5e:b9:df:0c:72:5e:28:48:33:42:e6:6c:3e:
e8:62:50:fe:f3:40:9f:6a:5d:30:ef:f1:60:b3:a6:
02:46:32:78:51:94:bd:8b:80:50:8f:e2:ca:60:07:
66:29:52:68:5a:08:a8:8c:74:70:20:3d:50:d4:29:
90:56:73:48:19:75:ef:23:ae:ba:7f:59:66:a2:8b:
73:c8:31:2b:01:04:7a:99:d6:21:f0:38:01:7b:f2:
b1:0a:a9:d0:64:dd:86:f7:95:0a:07:4e:90:1c:91:
28:3f:44:7d:6f:47:46:25:83:a7:6e:88:af:20:64:
4c:16:37:1f:20:3d:c9:02:0b:f8:b3:f9:a2:42:71:
df:25
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
Bortal Certificate
X509v3 Subject Key Identifier:
A4:0A:2A:12:07:EC:CE:10:E4:4C:5E:B6:79:83:18:3B:15:3F:50:DB
X509v3 Authority Key Identifier:
keyid:A4:0A:2A:12:07:EC:CE:10:E4:4C:5E:B6:79:83:18:3B:15:3F:50:DB
Signature Algorithm: sha1WithRSAEncryption
f7:cc:50:5a:f9:fe:d4:69:1a:6e:90:fb:dd:ec:4d:42:e8:c1:
2c:08:69:b5:8d:69:ad:2e:63:94:33:93:35:69:37:73:87:18:
f1:27:68:54:69:63:18:21:3f:0a:9c:6d:da:cb:e6:fc:5e:0a:
21:db:d1:19:7e:4a:28:3c:d8:32:23:c8:3f:86:0b:40:bb:df:
a8:3c:c7:97:95:bc:26:bf:68:ae:d7:39:a8:fd:2f:58:82:d2:
be:6d:2e:1a:66:05:dd:76:af:8e:50:da:c1:a9:83:46:6f:c8:
30:ea:0a:f3:06:f2:73:f1:81:1c:eb:35:c5:3f:8c:0a:2c:ef:
ed:f5:53:d0:5c:4d:01:da:51:fc:95:26:9b:3a:93:ac:90:61:
35:f3:b4:2f:ee:3c:9b:0b:e7:b7:01:dc:d3:7a:aa:4e:43:d3:
d9:a5:59:a0:5c:7d:df:1a:a0:01:cf:0f:f5:ec:69:17:af:4d:
e3:da:ac:04:c3:ea:30:78:91:09:1b:55:af:ef:f6:61:4b:14:
e7:5b:5a:fc:55:26:f4:72:86:fa:46:6f:2b:73:4f:ba:da:af:
dd:92:3f:d4:2d:71:e4:64:11:8f:3b:9f:7d:17:22:b6:a4:e6:
88:03:df:f6:10:2f:b3:6d:bb:05:52:c8:cf:12:49:a4:a1:28:
6c:67:ca:16
-----BEGIN CERTIFICATE-----
MIIDZzCCAk+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyMzE2NTU0OVowPTELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDELMAkGA1UEAxMCQ0Ew
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD3+o9UMgKqFpGiJW8z7Z6D
fywBnNKKkHMUsAHs4EkWoPqa1+m/r3msrQZZwd/DXIpOY8BVXN8U9/Q5Rv9P/6RD
l2fbuE/8ku2L3gt41/5WlKVkPWBMAXNUh7ZsECw33S1rXMko6G0rWD337ACiCpJV
yBDPhWfcEA67XrnfDHJeKEgzQuZsPuhiUP7zQJ9qXTDv8WCzpgJGMnhRlL2LgFCP
4spgB2YpUmhaCKiMdHAgPVDUKZBWc0gZde8jrrp/WWaii3PIMSsBBHqZ1iHwOAF7
8rEKqdBk3Yb3lQoHTpAckSg/RH1vR0Ylg6duiK8gZEwWNx8gPckCC/iz+aJCcd8l
AgMBAAGjcDBuMAkGA1UdEwQCMAAwIQYJYIZIAYb4QgENBBQWEkJvcnRhbCBDZXJ0
aWZpY2F0ZTAdBgNVHQ4EFgQUpAoqEgfszhDkTF62eYMYOxU/UNswHwYDVR0jBBgw
FoAUpAoqEgfszhDkTF62eYMYOxU/UNswDQYJKoZIhvcNAQEFBQADggEBAPfMUFr5
/tRpGm6Q+93sTULowSwIabWNaa0uY5QzkzVpN3OHGPEnaFRpYxghPwqcbdrL5vxe
CiHb0Rl+Sig82DIjyD+GC0C736g8x5eVvCa/aK7XOaj9L1iC0r5tLhpmBd12r45Q
2sGpg0ZvyDDqCvMG8nPxgRzrNcU/jAos7+31U9BcTQHaUfyVJps6k6yQYTXztC/u
PJsL57cB3NN6qk5D09mlWaBcfd8aoAHPD/XsaRevTeParATD6jB4kQkbVa/v9mFL
FOdbWvxVJvRyhvpGbytzT7rar92SP9QtceRkEY87n30XIrak5ogD3/YQL7NtuwVS
yM8SSaShKGxnyhY=
-----END CERTIFICATE-----
No preview for this file type
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=FI, ST=Tampere, O=Bortal, CN=CA
Validity
Not Before: Jan 1 00:00:00 1970 GMT
Not After : Mar 23 16:55:50 2072 GMT
Subject: C=FI, ST=Tampere, O=Bortal, CN=bortal-server
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
00:b9:02:7a:17:2e:51:7e:ae:f4:c8:63:f0:f2:cb:
48:55:26:15:ce:9c:f3:92:ed:24:73:6f:77:54:60:
14:4b:85:52:e3:b4:8a:94:5c:1c:a8:dc:6b:98:6d:
4d:bc:fc:76:24:20:e6:fc:54:49:c9:16:79:86:b1:
74:2f:0e:d2:13:16:64:3a:fc:b4:3e:95:94:34:87:
a9:f4:95:cb:96:d4:86:31:e9:10:be:b5:05:18:39:
f2:90:d2:59:52:87:90:2b:dc:88:a7:24:f3:55:48:
f9:93:66:93:85:84:61:ac:85:27:4c:79:bd:47:5f:
0d:67:e5:c7:ee:ce:16:35:c9:ba:d2:16:1e:22:01:
83:4a:50:21:c2:63:cb:b2:19:ad:e2:1a:f5:28:01:
18:65:dc:93:1a:68:66:45:5b:73:d2:f7:23:bb:1d:
e0:6a:8e:3b:44:db:8c:9f:07:36:fc:38:dd:f5:a8:
a6:b1:c4:c6:77:f8:be:ec:2e:f9:58:9c:e8:66:7d:
58:bc:c8:41:e0:9b:bd:32:4e:b8:31:b3:e9:2d:30:
e1:1a:2c:04:45:65:4d:3c:0f:60:61:9c:5c:74:d7:
df:fc:0d:05:32:f9:fb:a7:21:38:05:3b:07:58:a6:
81:20:80:b2:0b:23:bc:05:05:7f:d7:66:33:9c:12:
b1:9b
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Server
Netscape Comment:
Server certificate
X509v3 Subject Key Identifier:
53:BF:90:D6:8C:E7:D1:FA:33:AF:D3:DE:B2:55:3C:73:17:FA:50:8A
X509v3 Authority Key Identifier:
keyid:A4:0A:2A:12:07:EC:CE:10:E4:4C:5E:B6:79:83:18:3B:15:3F:50:DB
Signature Algorithm: sha1WithRSAEncryption
7d:a2:a3:b2:b0:7f:37:df:8a:7d:75:62:e7:1e:89:a8:7f:58:
cc:84:c2:00:2c:f7:e1:37:8f:4d:b0:0e:ab:ef:51:c7:b8:07:
24:95:18:98:a7:69:fc:d7:ee:57:82:aa:0c:c4:e4:e2:dc:88:
02:47:58:de:cf:2a:f2:11:8c:5a:79:f6:ce:33:40:93:01:f1:
18:7e:6b:07:c0:10:37:a5:a4:bd:5e:8d:b2:c5:ab:50:19:27:
8a:3c:d3:6e:08:ec:27:de:7d:39:1e:20:b8:20:75:f4:41:dd:
5c:6c:c5:75:18:e4:62:ab:c8:84:92:db:66:a8:dc:69:29:d3:
aa:06:cf:86:7d:12:f0:20:66:9a:f7:8e:d8:77:62:47:9a:d4:
37:49:5c:80:eb:f4:5b:04:2e:60:d3:dd:96:00:db:09:5d:2a:
eb:25:95:48:6b:3d:e1:57:ad:e9:ba:26:d6:fb:c3:31:13:48:
a4:4e:47:9d:c1:40:64:39:64:35:4b:52:6f:ea:51:28:65:3d:
32:e2:6f:38:1d:2d:ec:f9:69:aa:92:8b:66:a8:00:4e:dc:f2:
81:ea:ff:94:b3:2d:bd:a4:cf:1c:6c:42:7d:e4:c5:24:27:0d:
c2:0d:b5:b0:46:89:df:08:76:94:86:64:64:90:a3:95:79:5a:
d2:0d:70:3a
-----BEGIN CERTIFICATE-----
MIIDhzCCAm+gAwIBAgIBATANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyMzE2NTU1MFowSDELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDEWMBQGA1UEAxMNYm9y
dGFsLXNlcnZlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALkCehcu
UX6u9Mhj8PLLSFUmFc6c85LtJHNvd1RgFEuFUuO0ipRcHKjca5htTbz8diQg5vxU
SckWeYaxdC8O0hMWZDr8tD6VlDSHqfSVy5bUhjHpEL61BRg58pDSWVKHkCvciKck
81VI+ZNmk4WEYayFJ0x5vUdfDWflx+7OFjXJutIWHiIBg0pQIcJjy7IZreIa9SgB
GGXckxpoZkVbc9L3I7sd4GqOO0TbjJ8HNvw43fWoprHExnf4vuwu+Vic6GZ9WLzI
QeCbvTJOuDGz6S0w4RosBEVlTTwPYGGcXHTX3/wNBTL5+6chOAU7B1imgSCAsgsj
vAUFf9dmM5wSsZsCAwEAAaOBhDCBgTAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQE
AwIGQDAhBglghkgBhvhCAQ0EFBYSU2VydmVyIGNlcnRpZmljYXRlMB0GA1UdDgQW
BBRTv5DWjOfR+jOv096yVTxzF/pQijAfBgNVHSMEGDAWgBSkCioSB+zOEORMXrZ5
gxg7FT9Q2zANBgkqhkiG9w0BAQUFAAOCAQEAfaKjsrB/N9+KfXVi5x6JqH9YzITC
ACz34TePTbAOq+9Rx7gHJJUYmKdp/NfuV4KqDMTk4tyIAkdY3s8q8hGMWnn2zjNA
kwHxGH5rB8AQN6WkvV6NssWrUBknijzTbgjsJ959OR4guCB19EHdXGzFdRjkYqvI
hJLbZqjcaSnTqgbPhn0S8CBmmveO2HdiR5rUN0lcgOv0WwQuYNPdlgDbCV0q6yWV
SGs94Vet6bom1vvDMRNIpE5HncFAZDlkNUtSb+pRKGU9MuJvOB0t7PlpqpKLZqgA
Ttzyger/lLMtvaTPHGxCfeTFJCcNwg21sEaJ3wh2lIZkZJCjlXla0g1wOg==
-----END CERTIFICATE-----
No preview for this file type
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 2 (0x2)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=FI, ST=Tampere, O=Bortal, CN=CA
Validity
Not Before: Jan 1 00:00:00 1970 GMT
Not After : Mar 23 16:55:51 2072 GMT
Subject: C=FI, ST=Tampere, O=Bortal, CN=terminal
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
00:c9:1d:16:b7:d3:f9:07:84:a8:e1:82:4c:e1:13:
c8:cf:58:fe:23:b6:8f:73:3c:90:df:b8:24:8b:b6:
d4:89:39:69:71:10:9e:1b:57:16:8a:ec:c0:78:b2:
a2:c5:ad:30:5e:b0:74:43:9b:56:3c:b6:4d:37:65:
d4:05:82:27:4c:c5:7d:0c:bb:8c:bf:d4:f2:46:de:
f6:c9:e7:5e:f2:27:48:a7:2d:3a:ed:8a:55:09:4f:
3a:45:cc:b6:b5:c1:b1:61:a2:74:b5:3d:8b:2a:cf:
e1:a0:4f:86:c4:99:63:bb:ec:5c:27:ef:20:a5:de:
1d:20:9a:b3:19:94:5c:1c:1d:25:ac:26:ac:4a:3f:
48:a3:30:76:4f:c1:81:99:59:0a:af:e4:cd:f6:bb:
ba:2e:97:32:1d:e9:ea:59:49:ad:99:5d:a5:d7:8a:
db:8a:41:33:dd:4e:54:ef:f8:ca:80:15:22:c6:e9:
d5:33:15:7c:fe:f2:21:3f:a2:b7:7f:1a:96:c2:82:
75:19:2a:28:c5:11:72:cc:f3:eb:2d:ca:31:e8:59:
c4:09:79:38:01:dc:fa:75:6e:23:be:e8:a7:bd:cd:
aa:3f:0f:c7:71:26:2c:48:b5:41:8e:91:91:61:2d:
39:98:f1:b1:9c:ce:b1:0d:9b:d0:c8:7e:15:d1:d4:
28:07
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client
Netscape Comment:
Client certificate
X509v3 Subject Key Identifier:
0E:D4:56:4E:A6:62:B1:29:36:A0:12:50:4B:FC:B9:3E:92:54:59:52
X509v3 Authority Key Identifier:
keyid:A4:0A:2A:12:07:EC:CE:10:E4:4C:5E:B6:79:83:18:3B:15:3F:50:DB
Signature Algorithm: sha1WithRSAEncryption
73:84:1b:a8:2f:de:7d:22:d4:fa:3a:8a:1c:6e:01:73:fa:6e:
6c:8c:64:95:fa:89:34:c4:ad:83:4a:72:da:0c:bc:4d:86:ba:
5e:a9:c6:73:c9:50:27:ca:31:6a:e8:1d:1b:a6:32:f3:53:f8:
c1:a7:c7:58:e2:4c:64:65:33:ce:78:56:cf:13:75:6d:9d:7f:
d0:3e:a9:08:05:f2:d5:3d:6b:9c:bb:9f:12:96:e3:2a:76:98:
0c:e1:ee:1d:87:93:be:50:66:3f:20:17:93:67:68:b9:54:46:
ba:20:8e:5f:3a:f1:03:16:22:80:4f:90:97:fc:5b:2e:1f:a6:
b0:5b:a2:31:50:90:83:86:86:77:26:a1:19:c8:a0:30:ec:ef:
35:6b:b1:ed:e0:4b:b4:17:31:e6:e1:72:16:9e:24:01:6c:fe:
a2:9e:ad:6d:7c:57:c4:4e:9e:25:bd:ee:bc:e9:78:05:5a:16:
a3:e0:22:4a:66:cf:2c:4a:05:fe:24:ae:78:5d:1e:52:9e:07:
aa:de:bf:7d:31:1c:cc:86:1f:a4:a2:3a:6c:22:60:5a:fc:86:
47:c6:b3:73:9d:37:82:a5:15:ab:04:a7:4d:8a:94:58:27:d0:
7c:f8:e8:98:b6:95:c7:21:e3:17:2a:ce:dc:98:6a:90:07:7d:
63:df:27:62
-----BEGIN CERTIFICATE-----
MIIDgjCCAmqgAwIBAgIBAjANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyMzE2NTU1MVowQzELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDERMA8GA1UEAxMIdGVy
bWluYWwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDJHRa30/kHhKjh
gkzhE8jPWP4jto9zPJDfuCSLttSJOWlxEJ4bVxaK7MB4sqLFrTBesHRDm1Y8tk03
ZdQFgidMxX0Mu4y/1PJG3vbJ517yJ0inLTrtilUJTzpFzLa1wbFhonS1PYsqz+Gg
T4bEmWO77Fwn7yCl3h0gmrMZlFwcHSWsJqxKP0ijMHZPwYGZWQqv5M32u7oulzId
6epZSa2ZXaXXituKQTPdTlTv+MqAFSLG6dUzFXz+8iE/ord/GpbCgnUZKijFEXLM
8+styjHoWcQJeTgB3Pp1biO+6Ke9zao/D8dxJixItUGOkZFhLTmY8bGczrENm9DI
fhXR1CgHAgMBAAGjgYQwgYEwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCB4Aw
IQYJYIZIAYb4QgENBBQWEkNsaWVudCBjZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUDtRW
TqZisSk2oBJQS/y5PpJUWVIwHwYDVR0jBBgwFoAUpAoqEgfszhDkTF62eYMYOxU/
UNswDQYJKoZIhvcNAQEFBQADggEBAHOEG6gv3n0i1Po6ihxuAXP6bmyMZJX6iTTE
rYNKctoMvE2Gul6pxnPJUCfKMWroHRumMvNT+MGnx1jiTGRlM854Vs8TdW2df9A+
qQgF8tU9a5y7nxKW4yp2mAzh7h2Hk75QZj8gF5NnaLlURrogjl868QMWIoBPkJf8
Wy4fprBbojFQkIOGhncmoRnIoDDs7zVrse3gS7QXMebhchaeJAFs/qKerW18V8RO
niW97rzpeAVaFqPgIkpmzyxKBf4krnhdHlKeB6rev30xHMyGH6SiOmwiYFr8hkfG
s3OdN4KlFasEp02KlFgn0Hz46Ji2lcch4xcqztyYapAHfWPfJ2I=
-----END CERTIFICATE-----
No preview for this file type
V 20720323165549Z 00 unknown /C=FI/ST=Tampere/O=Bortal/CN=CA
V 20720323165550Z 01 unknown /C=FI/ST=Tampere/O=Bortal/CN=bortal-server
V 20720323165551Z 02 unknown /C=FI/ST=Tampere/O=Bortal/CN=terminal
unique_subject = yes
V 20720323165549Z 00 unknown /C=FI/ST=Tampere/O=Bortal/CN=CA
V 20720323165550Z 01 unknown /C=FI/ST=Tampere/O=Bortal/CN=bortal-server
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 0 (0x0)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=FI, ST=Tampere, O=Bortal, CN=CA
Validity
Not Before: Jan 1 00:00:00 1970 GMT
Not After : Mar 23 16:55:49 2072 GMT
Subject: C=FI, ST=Tampere, O=Bortal, CN=CA
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
00:f7:fa:8f:54:32:02:aa:16:91:a2:25:6f:33:ed:
9e:83:7f:2c:01:9c:d2:8a:90:73:14:b0:01:ec:e0:
49:16:a0:fa:9a:d7:e9:bf:af:79:ac:ad:06:59:c1:
df:c3:5c:8a:4e:63:c0:55:5c:df:14:f7:f4:39:46:
ff:4f:ff:a4:43:97:67:db:b8:4f:fc:92:ed:8b:de:
0b:78:d7:fe:56:94:a5:64:3d:60:4c:01:73:54:87:
b6:6c:10:2c:37:dd:2d:6b:5c:c9:28:e8:6d:2b:58:
3d:f7:ec:00:a2:0a:92:55:c8:10:cf:85:67:dc:10:
0e:bb:5e:b9:df:0c:72:5e:28:48:33:42:e6:6c:3e:
e8:62:50:fe:f3:40:9f:6a:5d:30:ef:f1:60:b3:a6:
02:46:32:78:51:94:bd:8b:80:50:8f:e2:ca:60:07:
66:29:52:68:5a:08:a8:8c:74:70:20:3d:50:d4:29:
90:56:73:48:19:75:ef:23:ae:ba:7f:59:66:a2:8b:
73:c8:31:2b:01:04:7a:99:d6:21:f0:38:01:7b:f2:
b1:0a:a9:d0:64:dd:86:f7:95:0a:07:4e:90:1c:91:
28:3f:44:7d:6f:47:46:25:83:a7:6e:88:af:20:64:
4c:16:37:1f:20:3d:c9:02:0b:f8:b3:f9:a2:42:71:
df:25
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
Bortal Certificate
X509v3 Subject Key Identifier:
A4:0A:2A:12:07:EC:CE:10:E4:4C:5E:B6:79:83:18:3B:15:3F:50:DB
X509v3 Authority Key Identifier:
keyid:A4:0A:2A:12:07:EC:CE:10:E4:4C:5E:B6:79:83:18:3B:15:3F:50:DB
Signature Algorithm: sha1WithRSAEncryption
f7:cc:50:5a:f9:fe:d4:69:1a:6e:90:fb:dd:ec:4d:42:e8:c1:
2c:08:69:b5:8d:69:ad:2e:63:94:33:93:35:69:37:73:87:18:
f1:27:68:54:69:63:18:21:3f:0a:9c:6d:da:cb:e6:fc:5e:0a:
21:db:d1:19:7e:4a:28:3c:d8:32:23:c8:3f:86:0b:40:bb:df:
a8:3c:c7:97:95:bc:26:bf:68:ae:d7:39:a8:fd:2f:58:82:d2:
be:6d:2e:1a:66:05:dd:76:af:8e:50:da:c1:a9:83:46:6f:c8:
30:ea:0a:f3:06:f2:73:f1:81:1c:eb:35:c5:3f:8c:0a:2c:ef:
ed:f5:53:d0:5c:4d:01:da:51:fc:95:26:9b:3a:93:ac:90:61:
35:f3:b4:2f:ee:3c:9b:0b:e7:b7:01:dc:d3:7a:aa:4e:43:d3:
d9:a5:59:a0:5c:7d:df:1a:a0:01:cf:0f:f5:ec:69:17:af:4d:
e3:da:ac:04:c3:ea:30:78:91:09:1b:55:af:ef:f6:61:4b:14:
e7:5b:5a:fc:55:26:f4:72:86:fa:46:6f:2b:73:4f:ba:da:af:
dd:92:3f:d4:2d:71:e4:64:11:8f:3b:9f:7d:17:22:b6:a4:e6:
88:03:df:f6:10:2f:b3:6d:bb:05:52:c8:cf:12:49:a4:a1:28:
6c:67:ca:16
-----BEGIN CERTIFICATE-----
MIIDZzCCAk+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyMzE2NTU0OVowPTELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDELMAkGA1UEAxMCQ0Ew
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD3+o9UMgKqFpGiJW8z7Z6D
fywBnNKKkHMUsAHs4EkWoPqa1+m/r3msrQZZwd/DXIpOY8BVXN8U9/Q5Rv9P/6RD
l2fbuE/8ku2L3gt41/5WlKVkPWBMAXNUh7ZsECw33S1rXMko6G0rWD337ACiCpJV
yBDPhWfcEA67XrnfDHJeKEgzQuZsPuhiUP7zQJ9qXTDv8WCzpgJGMnhRlL2LgFCP
4spgB2YpUmhaCKiMdHAgPVDUKZBWc0gZde8jrrp/WWaii3PIMSsBBHqZ1iHwOAF7
8rEKqdBk3Yb3lQoHTpAckSg/RH1vR0Ylg6duiK8gZEwWNx8gPckCC/iz+aJCcd8l
AgMBAAGjcDBuMAkGA1UdEwQCMAAwIQYJYIZIAYb4QgENBBQWEkJvcnRhbCBDZXJ0
aWZpY2F0ZTAdBgNVHQ4EFgQUpAoqEgfszhDkTF62eYMYOxU/UNswHwYDVR0jBBgw
FoAUpAoqEgfszhDkTF62eYMYOxU/UNswDQYJKoZIhvcNAQEFBQADggEBAPfMUFr5
/tRpGm6Q+93sTULowSwIabWNaa0uY5QzkzVpN3OHGPEnaFRpYxghPwqcbdrL5vxe
CiHb0Rl+Sig82DIjyD+GC0C736g8x5eVvCa/aK7XOaj9L1iC0r5tLhpmBd12r45Q
2sGpg0ZvyDDqCvMG8nPxgRzrNcU/jAos7+31U9BcTQHaUfyVJps6k6yQYTXztC/u
PJsL57cB3NN6qk5D09mlWaBcfd8aoAHPD/XsaRevTeParATD6jB4kQkbVa/v9mFL
FOdbWvxVJvRyhvpGbytzT7rar92SP9QtceRkEY87n30XIrak5ogD3/YQL7NtuwVS
yM8SSaShKGxnyhY=
-----END CERTIFICATE-----
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=FI, ST=Tampere, O=Bortal, CN=CA
Validity
Not Before: Jan 1 00:00:00 1970 GMT
Not After : Mar 23 16:55:50 2072 GMT
Subject: C=FI, ST=Tampere, O=Bortal, CN=bortal-server
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
00:b9:02:7a:17:2e:51:7e:ae:f4:c8:63:f0:f2:cb:
48:55:26:15:ce:9c:f3:92:ed:24:73:6f:77:54:60:
14:4b:85:52:e3:b4:8a:94:5c:1c:a8:dc:6b:98:6d:
4d:bc:fc:76:24:20:e6:fc:54:49:c9:16:79:86:b1:
74:2f:0e:d2:13:16:64:3a:fc:b4:3e:95:94:34:87:
a9:f4:95:cb:96:d4:86:31:e9:10:be:b5:05:18:39:
f2:90:d2:59:52:87:90:2b:dc:88:a7:24:f3:55:48:
f9:93:66:93:85:84:61:ac:85:27:4c:79:bd:47:5f:
0d:67:e5:c7:ee:ce:16:35:c9:ba:d2:16:1e:22:01:
83:4a:50:21:c2:63:cb:b2:19:ad:e2:1a:f5:28:01:
18:65:dc:93:1a:68:66:45:5b:73:d2:f7:23:bb:1d:
e0:6a:8e:3b:44:db:8c:9f:07:36:fc:38:dd:f5:a8:
a6:b1:c4:c6:77:f8:be:ec:2e:f9:58:9c:e8:66:7d:
58:bc:c8:41:e0:9b:bd:32:4e:b8:31:b3:e9:2d:30:
e1:1a:2c:04:45:65:4d:3c:0f:60:61:9c:5c:74:d7:
df:fc:0d:05:32:f9:fb:a7:21:38:05:3b:07:58:a6:
81:20:80:b2:0b:23:bc:05:05:7f:d7:66:33:9c:12:
b1:9b
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Server
Netscape Comment:
Server certificate
X509v3 Subject Key Identifier:
53:BF:90:D6:8C:E7:D1:FA:33:AF:D3:DE:B2:55:3C:73:17:FA:50:8A
X509v3 Authority Key Identifier:
keyid:A4:0A:2A:12:07:EC:CE:10:E4:4C:5E:B6:79:83:18:3B:15:3F:50:DB
Signature Algorithm: sha1WithRSAEncryption
7d:a2:a3:b2:b0:7f:37:df:8a:7d:75:62:e7:1e:89:a8:7f:58:
cc:84:c2:00:2c:f7:e1:37:8f:4d:b0:0e:ab:ef:51:c7:b8:07:
24:95:18:98:a7:69:fc:d7:ee:57:82:aa:0c:c4:e4:e2:dc:88:
02:47:58:de:cf:2a:f2:11:8c:5a:79:f6:ce:33:40:93:01:f1:
18:7e:6b:07:c0:10:37:a5:a4:bd:5e:8d:b2:c5:ab:50:19:27:
8a:3c:d3:6e:08:ec:27:de:7d:39:1e:20:b8:20:75:f4:41:dd:
5c:6c:c5:75:18:e4:62:ab:c8:84:92:db:66:a8:dc:69:29:d3:
aa:06:cf:86:7d:12:f0:20:66:9a:f7:8e:d8:77:62:47:9a:d4:
37:49:5c:80:eb:f4:5b:04:2e:60:d3:dd:96:00:db:09:5d:2a:
eb:25:95:48:6b:3d:e1:57:ad:e9:ba:26:d6:fb:c3:31:13:48:
a4:4e:47:9d:c1:40:64:39:64:35:4b:52:6f:ea:51:28:65:3d:
32:e2:6f:38:1d:2d:ec:f9:69:aa:92:8b:66:a8:00:4e:dc:f2:
81:ea:ff:94:b3:2d:bd:a4:cf:1c:6c:42:7d:e4:c5:24:27:0d:
c2:0d:b5:b0:46:89:df:08:76:94:86:64:64:90:a3:95:79:5a:
d2:0d:70:3a
-----BEGIN CERTIFICATE-----
MIIDhzCCAm+gAwIBAgIBATANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyMzE2NTU1MFowSDELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDEWMBQGA1UEAxMNYm9y
dGFsLXNlcnZlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALkCehcu
UX6u9Mhj8PLLSFUmFc6c85LtJHNvd1RgFEuFUuO0ipRcHKjca5htTbz8diQg5vxU
SckWeYaxdC8O0hMWZDr8tD6VlDSHqfSVy5bUhjHpEL61BRg58pDSWVKHkCvciKck
81VI+ZNmk4WEYayFJ0x5vUdfDWflx+7OFjXJutIWHiIBg0pQIcJjy7IZreIa9SgB
GGXckxpoZkVbc9L3I7sd4GqOO0TbjJ8HNvw43fWoprHExnf4vuwu+Vic6GZ9WLzI
QeCbvTJOuDGz6S0w4RosBEVlTTwPYGGcXHTX3/wNBTL5+6chOAU7B1imgSCAsgsj
vAUFf9dmM5wSsZsCAwEAAaOBhDCBgTAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQE
AwIGQDAhBglghkgBhvhCAQ0EFBYSU2VydmVyIGNlcnRpZmljYXRlMB0GA1UdDgQW
BBRTv5DWjOfR+jOv096yVTxzF/pQijAfBgNVHSMEGDAWgBSkCioSB+zOEORMXrZ5
gxg7FT9Q2zANBgkqhkiG9w0BAQUFAAOCAQEAfaKjsrB/N9+KfXVi5x6JqH9YzITC
ACz34TePTbAOq+9Rx7gHJJUYmKdp/NfuV4KqDMTk4tyIAkdY3s8q8hGMWnn2zjNA
kwHxGH5rB8AQN6WkvV6NssWrUBknijzTbgjsJ959OR4guCB19EHdXGzFdRjkYqvI
hJLbZqjcaSnTqgbPhn0S8CBmmveO2HdiR5rUN0lcgOv0WwQuYNPdlgDbCV0q6yWV
SGs94Vet6bom1vvDMRNIpE5HncFAZDlkNUtSb+pRKGU9MuJvOB0t7PlpqpKLZqgA
Ttzyger/lLMtvaTPHGxCfeTFJCcNwg21sEaJ3wh2lIZkZJCjlXla0g1wOg==
-----END CERTIFICATE-----
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 2 (0x2)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=FI, ST=Tampere, O=Bortal, CN=CA
Validity
Not Before: Jan 1 00:00:00 1970 GMT
Not After : Mar 23 16:55:51 2072 GMT
Subject: C=FI, ST=Tampere, O=Bortal, CN=terminal
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
00:c9:1d:16:b7:d3:f9:07:84:a8:e1:82:4c:e1:13:
c8:cf:58:fe:23:b6:8f:73:3c:90:df:b8:24:8b:b6:
d4:89:39:69:71:10:9e:1b:57:16:8a:ec:c0:78:b2:
a2:c5:ad:30:5e:b0:74:43:9b:56:3c:b6:4d:37:65:
d4:05:82:27:4c:c5:7d:0c:bb:8c:bf:d4:f2:46:de:
f6:c9:e7:5e:f2:27:48:a7:2d:3a:ed:8a:55:09:4f:
3a:45:cc:b6:b5:c1:b1:61:a2:74:b5:3d:8b:2a:cf:
e1:a0:4f:86:c4:99:63:bb:ec:5c:27:ef:20:a5:de:
1d:20:9a:b3:19:94:5c:1c:1d:25:ac:26:ac:4a:3f:
48:a3:30:76:4f:c1:81:99:59:0a:af:e4:cd:f6:bb:
ba:2e:97:32:1d:e9:ea:59:49:ad:99:5d:a5:d7:8a:
db:8a:41:33:dd:4e:54:ef:f8:ca:80:15:22:c6:e9:
d5:33:15:7c:fe:f2:21:3f:a2:b7:7f:1a:96:c2:82:
75:19:2a:28:c5:11:72:cc:f3:eb:2d:ca:31:e8:59:
c4:09:79:38:01:dc:fa:75:6e:23:be:e8:a7:bd:cd:
aa:3f:0f:c7:71:26:2c:48:b5:41:8e:91:91:61:2d:
39:98:f1:b1:9c:ce:b1:0d:9b:d0:c8:7e:15:d1:d4:
28:07
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client
Netscape Comment:
Client certificate
X509v3 Subject Key Identifier:
0E:D4:56:4E:A6:62:B1:29:36:A0:12:50:4B:FC:B9:3E:92:54:59:52
X509v3 Authority Key Identifier:
keyid:A4:0A:2A:12:07:EC:CE:10:E4:4C:5E:B6:79:83:18:3B:15:3F:50:DB
Signature Algorithm: sha1WithRSAEncryption
73:84:1b:a8:2f:de:7d:22:d4:fa:3a:8a:1c:6e:01:73:fa:6e:
6c:8c:64:95:fa:89:34:c4:ad:83:4a:72:da:0c:bc:4d:86:ba:
5e:a9:c6:73:c9:50:27:ca:31:6a:e8:1d:1b:a6:32:f3:53:f8:
c1:a7:c7:58:e2:4c:64:65:33:ce:78:56:cf:13:75:6d:9d:7f:
d0:3e:a9:08:05:f2:d5:3d:6b:9c:bb:9f:12:96:e3:2a:76:98:
0c:e1:ee:1d:87:93:be:50:66:3f:20:17:93:67:68:b9:54:46:
ba:20:8e:5f:3a:f1:03:16:22:80:4f:90:97:fc:5b:2e:1f:a6:
b0:5b:a2:31:50:90:83:86:86:77:26:a1:19:c8:a0:30:ec:ef:
35:6b:b1:ed:e0:4b:b4:17:31:e6:e1:72:16:9e:24:01:6c:fe:
a2:9e:ad:6d:7c:57:c4:4e:9e:25:bd:ee:bc:e9:78:05:5a:16:
a3:e0:22:4a:66:cf:2c:4a:05:fe:24:ae:78:5d:1e:52:9e:07:
aa:de:bf:7d:31:1c:cc:86:1f:a4:a2:3a:6c:22:60:5a:fc:86:
47:c6:b3:73:9d:37:82:a5:15:ab:04:a7:4d:8a:94:58:27:d0:
7c:f8:e8:98:b6:95:c7:21:e3:17:2a:ce:dc:98:6a:90:07:7d:
63:df:27:62
-----BEGIN CERTIFICATE-----
MIIDgjCCAmqgAwIBAgIBAjANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyMzE2NTU1MVowQzELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDERMA8GA1UEAxMIdGVy
bWluYWwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDJHRa30/kHhKjh
gkzhE8jPWP4jto9zPJDfuCSLttSJOWlxEJ4bVxaK7MB4sqLFrTBesHRDm1Y8tk03
ZdQFgidMxX0Mu4y/1PJG3vbJ517yJ0inLTrtilUJTzpFzLa1wbFhonS1PYsqz+Gg
T4bEmWO77Fwn7yCl3h0gmrMZlFwcHSWsJqxKP0ijMHZPwYGZWQqv5M32u7oulzId
6epZSa2ZXaXXituKQTPdTlTv+MqAFSLG6dUzFXz+8iE/ord/GpbCgnUZKijFEXLM
8+styjHoWcQJeTgB3Pp1biO+6Ke9zao/D8dxJixItUGOkZFhLTmY8bGczrENm9DI
fhXR1CgHAgMBAAGjgYQwgYEwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCB4Aw
IQYJYIZIAYb4QgENBBQWEkNsaWVudCBjZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUDtRW
TqZisSk2oBJQS/y5PpJUWVIwHwYDVR0jBBgwFoAUpAoqEgfszhDkTF62eYMYOxU/
UNswDQYJKoZIhvcNAQEFBQADggEBAHOEG6gv3n0i1Po6ihxuAXP6bmyMZJX6iTTE
rYNKctoMvE2Gul6pxnPJUCfKMWroHRumMvNT+MGnx1jiTGRlM854Vs8TdW2df9A+
qQgF8tU9a5y7nxKW4yp2mAzh7h2Hk75QZj8gF5NnaLlURrogjl868QMWIoBPkJf8
Wy4fprBbojFQkIOGhncmoRnIoDDs7zVrse3gS7QXMebhchaeJAFs/qKerW18V8RO
niW97rzpeAVaFqPgIkpmzyxKBf4krnhdHlKeB6rev30xHMyGH6SiOmwiYFr8hkfG
s3OdN4KlFasEp02KlFgn0Hz46Ji2lcch4xcqztyYapAHfWPfJ2I=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA9/qPVDICqhaRoiVvM+2eg38sAZzSipBzFLAB7OBJFqD6mtfp
v695rK0GWcHfw1yKTmPAVVzfFPf0OUb/T/+kQ5dn27hP/JLti94LeNf+VpSlZD1g
TAFzVIe2bBAsN90ta1zJKOhtK1g99+wAogqSVcgQz4Vn3BAOu1653wxyXihIM0Lm
bD7oYlD+80Cfal0w7/Fgs6YCRjJ4UZS9i4BQj+LKYAdmKVJoWgiojHRwID1Q1CmQ
VnNIGXXvI666f1lmootzyDErAQR6mdYh8DgBe/KxCqnQZN2G95UKB06QHJEoP0R9
b0dGJYOnboivIGRMFjcfID3JAgv4s/miQnHfJQIDAQABAoIBAQCT3fWvh+6sy65l
mJrZxRxbXu63u3KUK5RjxpwvSoJqmu00fgElSxZrz/TUetXaIYlbOwIKJMnlMAGS
UfKWGmMx5suIajxP6LD7URlYIrvHlvWUc0DDsa26vv4ZK/+iBCI8PeS5nvbR/Nle
x3yNI26k9hqIFA2dXHncYpzFEx/zYjdGBswfbUsQF47lK1QU8qDpGtnaanptxpi9
0mg1Y1RyDXIlKsKV6PUt7Fp4vavKZb8v/5OZEtjpTfP9m9XScv98ttupn0Sfc8ee
0Sskzk+Chqa0J9yhpLLe2BaKUAeGqP1mz5WFbeyzK3BoSvRoYQsfEqT4cyQIR33q
k7QzewuBAoGBAP2JSQgBgzwoILq234JrhJf8Vk4PGDaX4XHBoRFhKX5W7bjyBQTT
i5lpm0e4g/efKOvYILM87KdZw1eUbhbztaZnq9HJao4n6VmdHfPRcVgWhVeP+ATg
naJ7XlAs8XqNiSjHIp4D3J1UPqhQIcFzvdJD/kepZ234RQnY8pNuCN4hAoGBAPpj
cwaGtX+o0k0t9aHRgMwuS9WPooldfFETRoHyVSHVDsxn+FU2LamS8YGFwRQZYgz+
0f1v2Y/C8p4xH+1+9wg0s06xEf+BZOxrXUmgmPKrGB15k8EXRjlLmADa1o0CNg5y
HmYLsWT9UQAdwflOd0zPRObF2/rIt6KzoiMi13iFAoGBAKvO64GUXNVYMA23PTFJ
IPpJkkalbfgY5jpLR5XabN7jk4af4wzJOjGE4igw/qS/42Am/snXgFtLtddUi2Hc
Vv1kBYhNYHriyvviP9jo1lEmOcgDlMPhXpEr3tagDifJX+gVQf0oisjGvQsb+jP4
9epWDyuKvb9E3av1qzSC/VlhAoGAFMisg54q8q3QxxdJjGUXi9tL8C48D6ry5sfy
0laLOoO09sKqmmgk4i6QXW/81u5EdU+xnpfqN0S3Xuo0/EHNv6CgQafxFoRnHDjN
RY9PItWQ6uFsolqMObVMqMWBibLlSc2vOElAMGHWl2vg7hDVVkreLUm/ONHwbFD8
5G2/9QECgYEAqz3caaV3WeXE5iLMZIoAgfvLrgeiTNcw7soLvxjqm+BInXoY31hi
EHgI9tTqePmpDKLVZ+xOZYFt+uUM4DJHZ/dQ519YEcssvzdfYxeYMw5qgDPa6UTP
269332Ur+ci2Bn4vZoWTmKWOCTNDWLhbFcLzkZAMv5Q2nW2KCxvll1g=
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAuQJ6Fy5Rfq70yGPw8stIVSYVzpzzku0kc293VGAUS4VS47SK
lFwcqNxrmG1NvPx2JCDm/FRJyRZ5hrF0Lw7SExZkOvy0PpWUNIep9JXLltSGMekQ
vrUFGDnykNJZUoeQK9yIpyTzVUj5k2aThYRhrIUnTHm9R18NZ+XH7s4WNcm60hYe
IgGDSlAhwmPLshmt4hr1KAEYZdyTGmhmRVtz0vcjux3gao47RNuMnwc2/Djd9aim
scTGd/i+7C75WJzoZn1YvMhB4Ju9Mk64MbPpLTDhGiwERWVNPA9gYZxcdNff/A0F
Mvn7pyE4BTsHWKaBIICyCyO8BQV/12YznBKxmwIDAQABAoIBAQCw2qVLM4PDzgtA
5AiYj6p9ewKtl2tfsEF/97XielXsO26ZLSSr3cGnyc0w0IvXdJ6aurkTzJ8cEtfo
4glmUoyOooD9wkOq7+HUtTrKC8eqT05Yt6rCItjT59Dwj6PDOMOgqhgXb0MM681o
Ek5C++FCwaZnfJhreXmfMBCHP4oLr0M45Wl+Fnh6vrNHr1LxR0QZNP6Y+gKlojMT
AbzuQ3GPUyHxkh+1HLXRAyoZpUbvaKG7wybiVSDBQake0gJQHFD8zXRuDrMausNK
HzQMvSG8cCrJqWdzZQUFdBWMvyJt51DQSjb2B42ZqgxeByPb6cuyMdu9mCl4mG6n
ofdTKYGBAoGBAN2367lVvvoD2zqB7NeyKtKzVZSeuW8f2QQP/Gyngey4NbgtDzHI
w54NadgwvmhPFPY5WUxKwzNG4jsFoGYe/dmWBe7iD+eX1G8N4VyCtzqlaUCq5ZY1
o87ThYmx3+UAKKh4gZfnVV5QkfYtOM6EE84oazoe+UOe+PKwC9j59G0jAoGBANWd
i+Zm2pYFA3E+0coe4cppFigFw2FbC/1ywB7zAdYCHs/c9LAbL650LeRNh+40HxhU
GugX+gLFde3qCsMTUEThRpn15+mozKyyOpB+1DeQG61nxZd+XM4ZECbn4SYZ3OQO
b0AudNa84fCTHYLL88qvpslbZWHv5cAu96H50t0pAoGAXcNA0aDcYZit5mE5isIS
8AXdBDvXiZH7UYd9JWn1POlt9lQ/37raVwWvJDkA3NXMtI/uHqBjSlUIqRMpEOa8
TX7vRWWeej8wHELPcjLpT8jR6QIck1hdzMKQ73kkiRB3IT/M9jNjW75Q672WD2e1
hHJ9XhfpK9qXxvICIKEb5+cCgYEAnkKMpXRKOZ8ZP8tUzjQ3ACj++0PZzsUPiwR7
BfLvx0fm4AVJWzepCcyVO3GdZYNEDlgxXwZ0eZ0lk9AzjPdAHufv0Jz45oniqYea
D/eG7mtbtgsNvwElbKPw7YIZsoqytltjXN+OPJHPqtazpHXJ9r5QCRoncHm1c77Y
RC68ZJECgYB9TO+pwciBn931UxWlZGCt0HGSnpSP6RHR0rM42NAEUV0p1hcsgRMF
2fKKg00TEcMfZbRA89NeYG56plFZ89G3SlkH3alUkv827fwjlTokPKs3KulOBqJe
HBNRc1VK0MfJjkXgsik6n4JbiYx1df35lvqn8OcNDI33RGQp1LduNQ==
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAyR0Wt9P5B4So4YJM4RPIz1j+I7aPczyQ37gki7bUiTlpcRCe
G1cWiuzAeLKixa0wXrB0Q5tWPLZNN2XUBYInTMV9DLuMv9TyRt72yede8idIpy06
7YpVCU86Rcy2tcGxYaJ0tT2LKs/hoE+GxJlju+xcJ+8gpd4dIJqzGZRcHB0lrCas
Sj9IozB2T8GBmVkKr+TN9ru6LpcyHenqWUmtmV2l14rbikEz3U5U7/jKgBUixunV
MxV8/vIhP6K3fxqWwoJ1GSooxRFyzPPrLcox6FnECXk4Adz6dW4jvuinvc2qPw/H
cSYsSLVBjpGRYS05mPGxnM6xDZvQyH4V0dQoBwIDAQABAoIBACdLdLXkR+MNK4Ys
VGMh33mL9NP7hpnIerILo7Bcv7g0LIL38Tx8Tp5EVfL/TEh9Z1cI+R6AimAAaqPp
VHzjClS4vY8wUfblX5UzWVrnxyhfPpXTg5EIF0djYIpkzkpDFypxeIY1CS0LQxV0
lGtzYQZFz1fKJEHkXSKSt23HDBw9yO2N3j9Mk/VQGD/Ncwulvkc+yooZ4FKfbZkq
XSx2v4aiS5f4YOIpsnbdageXkP6VNqPS9Kxj1NLUZSEvYGWIZf3BW+8uN7SA7xKY
HVRUy1eqBxPuVj/w/tl6O/e7jeoLLoT5y7ffOU0i6Favpix7hlEImzl3+LiTibUg
mfbRDikCgYEA7U+RxE8U/Q7lHPmvjMRiE2hYmDLdWACyIx5E6BP3R8oc/z1KZHFk
EavGWcE7495DmiBU2Lu+5tc7vxbfAxi2WJsk5CYIZaGkwPIOzLyAi9q2Un2XcelV
4XE/HbsnC3dQ8rg0AEQUnT/INSvUeTjt8pONijJi74TV49n6Sa4opEsCgYEA2PO/
J1VA5riKA2RPg+8eZFtrJbGMKsp6hAqARsR5SF+ZiBG0qaqin7aU5fNjn8G96sBr
gy/GrbFVlQH9T4BOOI2J4AcuVvI7JH/tQdwaflwPd2zJKOlhmLeNTDpYMt1Tiq5g
c8uWe7w2NdZvBxTNAY6ZY1SvfFmvtWFNxtVCnbUCgYAmz2KJdl16XVs+996r6NoZ
TnFewsLMR6DaeXLPeaRxSy6e14k5EApLkYoo159RzuHDbRIzN9Eqs3yD7dufCAWa
TBUmcsngxSTKoUumVBW5yZUTvJJuALkY24p09EyYZXUJnPJ0MK4mYW3+tCJViOfx
SgxV05O2lETetKFoN2FSLQKBgAREXwkeAyXGkWhZq7qzlExzA9t8733T967rKfS6
XoxO3Q0xE/WWVpZ/l9QiAl6dB+g7GqI86VJ3P3Cr1lie9GrmVcTjP0UUhJdGMNtv
wdGka+V0bUxxsqq3SX8rUprFgaQjo+ADLBWI8SQD8LEZ9qJGNLwgaUcv2GXf4RC9
Fw9VAoGABiVn59gFCJ5vDiv/TnNC5YZHyJ0xLRHsSaAilpEcKh4A3oLMRH61Qi9X
AdjtgF3zvJZ4wvvGaIGwhjD2Rr+VZalCxy9+7AqRQ5rS2pkjMVJXo4xr+BUT1zeX
H1gmAJGwsMxVij/skcPsQ8VYLsJk4KGTogUFNx+673ZRI+AFdkA=
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE REQUEST-----
MIIClDCCAXwCAQAwTzELMAkGA1UEBhMCRkkxEDAOBgNVBAgTB1RhbXBlcmUxEDAO
BgNVBAcTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDELMAkGA1UEAxMCQ0EwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD3+o9UMgKqFpGiJW8z7Z6DfywB
nNKKkHMUsAHs4EkWoPqa1+m/r3msrQZZwd/DXIpOY8BVXN8U9/Q5Rv9P/6RDl2fb
uE/8ku2L3gt41/5WlKVkPWBMAXNUh7ZsECw33S1rXMko6G0rWD337ACiCpJVyBDP
hWfcEA67XrnfDHJeKEgzQuZsPuhiUP7zQJ9qXTDv8WCzpgJGMnhRlL2LgFCP4spg
B2YpUmhaCKiMdHAgPVDUKZBWc0gZde8jrrp/WWaii3PIMSsBBHqZ1iHwOAF78rEK
qdBk3Yb3lQoHTpAckSg/RH1vR0Ylg6duiK8gZEwWNx8gPckCC/iz+aJCcd8lAgMB
AAGgADANBgkqhkiG9w0BAQUFAAOCAQEAAf2HBdd7TU4VpCaKCGnY8+lg722L+7qF
6fcm7GYpuvayBLW2W++HT1vbDAu62qOJS4sKGV+Z0iBKCdSocIxjTuQfND7s5lYB
wSFlEBq5HYurVibmGwIH8953TypYg5jL4NnAkd3VGAeoBD1jW3GRen3Vor5S5Ewl
R4nW3FqUT6KUUkKE1upv8lcC/YVYp9vOuDwvNPbmx9EBE2sgBjinl4dw1/c1d6Zb
sNg+5t8UK7dWP32qU13pPQIE3XZmlp04flYligR23D6wAXCk3p7GXlgjxNWzUeLy
9cRvJnwMD/Fxk/0OI7iI1373voPawKS3N5piEHyQHJCX3suE/GGLSQ==
-----END CERTIFICATE REQUEST-----
-----BEGIN CERTIFICATE REQUEST-----
MIICnzCCAYcCAQAwWjELMAkGA1UEBhMCRkkxEDAOBgNVBAgTB1RhbXBlcmUxEDAO
BgNVBAcTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDEWMBQGA1UEAxMNYm9ydGFs
LXNlcnZlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALkCehcuUX6u
9Mhj8PLLSFUmFc6c85LtJHNvd1RgFEuFUuO0ipRcHKjca5htTbz8diQg5vxUSckW
eYaxdC8O0hMWZDr8tD6VlDSHqfSVy5bUhjHpEL61BRg58pDSWVKHkCvciKck81VI
+ZNmk4WEYayFJ0x5vUdfDWflx+7OFjXJutIWHiIBg0pQIcJjy7IZreIa9SgBGGXc
kxpoZkVbc9L3I7sd4GqOO0TbjJ8HNvw43fWoprHExnf4vuwu+Vic6GZ9WLzIQeCb
vTJOuDGz6S0w4RosBEVlTTwPYGGcXHTX3/wNBTL5+6chOAU7B1imgSCAsgsjvAUF
f9dmM5wSsZsCAwEAAaAAMA0GCSqGSIb3DQEBBQUAA4IBAQBIulavAguqK3yx7Weq
CwcQiQuQHmYLhfu6GAM2YvhEhVmlLVDvSVeW6bpLIeRwJ6exYuY8OnZ7IelffCP+
A61tLq09f45N4OzHvsOOpUbn7O0hm1gtGaM0xjWvlRciNuqOmMVqucqp5ku3Ql9t
9a5DcaQPdhGMybGT96zIxRmOEAfsjmuCVEzUG/kxJwtCtiLMqGdVrovbCLOcoJuZ
CXlBNtpqcPuV9CYO/+0Z72lQbuUU/PaBhpBvy9c1psXDA5ClVSV8Nj9F4DQFIdkc
TPATu7TYhBcuoWmrFQ4fCiL6F/oYX/TjDEcncttG4NrXipsvSjlhqjVMjg/zuHOI
UBkx
-----END CERTIFICATE REQUEST-----
-----BEGIN CERTIFICATE REQUEST-----
MIICmjCCAYICAQAwVTELMAkGA1UEBhMCRkkxEDAOBgNVBAgTB1RhbXBlcmUxEDAO
BgNVBAcTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDERMA8GA1UEAxMIdGVybWlu
YWwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDJHRa30/kHhKjhgkzh
E8jPWP4jto9zPJDfuCSLttSJOWlxEJ4bVxaK7MB4sqLFrTBesHRDm1Y8tk03ZdQF
gidMxX0Mu4y/1PJG3vbJ517yJ0inLTrtilUJTzpFzLa1wbFhonS1PYsqz+GgT4bE
mWO77Fwn7yCl3h0gmrMZlFwcHSWsJqxKP0ijMHZPwYGZWQqv5M32u7oulzId6epZ
Sa2ZXaXXituKQTPdTlTv+MqAFSLG6dUzFXz+8iE/ord/GpbCgnUZKijFEXLM8+st
yjHoWcQJeTgB3Pp1biO+6Ke9zao/D8dxJixItUGOkZFhLTmY8bGczrENm9DIfhXR
1CgHAgMBAAGgADANBgkqhkiG9w0BAQUFAAOCAQEAJq7FLdxkyq00S/9ePGJxcGZf
QfSiMK2IJLodHZPgnT3q0X4cz4mt6rSlDp/Pf7B0i1ptSy12ul0JLfL6f4JzuQgh
BP3/1wvrad87WRUtlNJxDGagBuD4TcMvi+tU7+ZwAoIHrZ9TbWWbPrctjR+5709D
Jqfl2VOMKkJRO4sBNQH2TSFVm9eVvtduUxydzmAXyAnSURbiJYTOahAcjejPDq/R
RzuXApS35ObVeBJRnVfVzzRzOZ0X/6D+8b48A1N1jdEeolnPlrN2g5UtPGqsRsIt
crIAOciA/Zha7B30nrbLmn12EoV4SkXfZLhCLAZ0Lj5WY/v2S9D/3eLR/El1Kg==
-----END CERTIFICATE REQUEST-----
No preview for this file type
#!/bin/sh
#
# Commands
#
openssl_req () {
echo openssl req -config openssl.cnf $@
openssl req -config openssl.cnf $@
}
openssl_ca () {
echo openssl ca -config openssl.cnf -batch -startdate 700101000000Z -days 21900 $@
openssl ca -config openssl.cnf -batch -startdate 700101000000Z -days 21900 $@
}
#
# CA directory structure
#
ca_dir () {
test -d "$1" && return
mkdir $1 $1/certs $1/private $1/crl $1/newcerts $1/req
touch $1/index.txt
echo 00 > $1/serial
echo 00 > $1/crlnumber
}
ca_dir ca-master
#
# The CA
#
test -f ca-master/ca-master.crt || {
# Make key and request
openssl_req -extensions v3_ca -new -newkey rsa:2048 -nodes \
-keyout ca-master/private/ca-master.key -out ca-master/req/ca-master.csr \
-subj "/C=FI/ST=Tampere/L=Tampere/O=Bortal/CN=CA"
# Make self signed CA
openssl ca -config openssl.cnf -batch -startdate 700101000000Z -days 21900 \
-selfsign -in ca-master/req/ca-master.csr -out ca-master/ca-master.crt \
-keyfile ca-master/private/ca-master.key || exit 1
# Make CA bundle keystore
rm -f cacerts.jks
openssl x509 -outform der -in ca-master/ca-master.crt -out ca-master/ca-master.der
keytool -import -keystore cacerts.jks -storepass changeit -file ca-master/ca-master.der -noprompt -trustcacerts -alias bortalca
}
#
# Certificates signed by CA
#
master_signed_cert () {
_base=$1 ; shift
test -f ca-master/certs/$_base.crt && return
# Create
openssl_req -new -newkey rsa:2048 -nodes \
-keyout ca-master/private/$_base.key \
-out ca-master/req/$_base.csr \
-subj "/C=FI/ST=Tampere/L=Tampere/O=Bortal/CN=$_base"
# Sign
openssl_ca -name CA_master $@ \
-in ca-master/req/$_base.csr \
-out ca-master/certs/$_base.crt
# Convert to PKCS#12 for import to keystore/browser
openssl pkcs12 -export -passout pass:changeit \
-in ca-master/certs/$_base.crt \
-inkey ca-master/private/$_base.key \
-out ca-master/certs/$_base.p12
}
#Certificates signed by master CA - with custom common name
#also create a .pem file for both private key and cert
master_signed_cert_cn () {
_base=$1 ; shift
_cn=$1 ; shift
test -f ca-master/private/$_base.pem && return
# Generate key and certificate request
openssl_req -new -newkey rsa:2048 -nodes \
-keyout ca-master/private/$_base.key \
-out ca-master/req/$_base.csr \
-subj "/C=FI/ST=Tampere/L=Tampere/O=Bortal/CN=$_cn"
# Sign with CA
openssl_ca -name CA_master $@ \
-in ca-master/req/$_base.csr \
-out ca-master/certs/$_base.crt
# Convert to PKCS#12 for import to keystore/browser
openssl pkcs12 -export -passout pass:changeit -in ca-master/certs/$_base.crt -inkey ca-master/private/$_base.key -out ca-master/certs/$_base.p12
}
master_signed_cert_cn s1as bortal-server -extensions srv_cert
rm -f keystore.jks
keytool -importkeystore -srckeystore ca-master/certs/s1as.p12 -destkeystore keystore.jks -srcstorepass changeit -deststorepass changeit -srcstoretype pkcs12 -alias 1 -destalias s1as
master_signed_cert terminal -extensions client_cert
No preview for this file type
-----BEGIN CERTIFICATE-----
MIIDZzCCAk+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyMzE2MjIwNFowPTELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDELMAkGA1UEAxMCQ0Ew
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDseFQdsJKlAZDbaT7rwgHo
ThDXPCM2ynl3QXDUsoS9pNqtEePu8zHgMLnzbehQ1qNDAbrMc3DOr49vXkqBETAx
bu4J+AvpgmU3bb3CYb38vgLY6s9NwS6BKjW7Rn9pjnKVJcOfcR4h+No5mEuxz80H
f4DhQXIfDK2pK6+tQdyXAMCxp0qAW/HAZVJ6PYskoHw5MwqQ1pa+Qclyu3c4xyTh
QnHF71YO5KagBMkYrvgziqIZm/JGQ5GCgPmSEahXDzL9HWgcf6tL/pDjRz+TN3tj
4shK8/r/6QV6FwgtzNbkBY4exzwyiMw7aSHguECjRM0jiaTfSXJRGy80Nan8RO6Z
AgMBAAGjcDBuMAkGA1UdEwQCMAAwIQYJYIZIAYb4QgENBBQWEkJvcnRhbCBDZXJ0
aWZpY2F0ZTAdBgNVHQ4EFgQUlozbkSE+SlWHlrDgrFfc1Mq6OHswHwYDVR0jBBgw
FoAUlozbkSE+SlWHlrDgrFfc1Mq6OHswDQYJKoZIhvcNAQEFBQADggEBALQ2fOOf
Q5iGsHkYh7A+X/hFEQqgWEBtbZjEsuvAjgZSkufa9xzls2nA6h9v3rfgb6CBIkFs
b1RWsuz9ewYBsT8RfqKkp0eVaUFA1dZ8df+f7lQvOMK3l+JINXUqh7TAlJsfTwlW
EXID+OOU2/su6kuOBnajveitPU57RU4Oy1U7hB4U7STeyvmZod/CrHi6hlrMd/KJ
7CwWU5mP06hC6JzoE3t7BngSVj9QKpUHDhOiOLUsa919/Y8rmCsE098PjsRleuk9
LowqJh+Qyu6bJyZn6xvE5IcF2jg9AzqFi/tLRMr3uSPGzs9KqgAz3SXyKF7wYvLG
HsLclVSa3+Dos8I=
-----END CERTIFICATE-----
No preview for this file type
-----BEGIN CERTIFICATE-----
MIIDhzCCAm+gAwIBAgIBATANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyMzE2NTU1MFowSDELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDEWMBQGA1UEAxMNYm9y
dGFsLXNlcnZlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALkCehcu
UX6u9Mhj8PLLSFUmFc6c85LtJHNvd1RgFEuFUuO0ipRcHKjca5htTbz8diQg5vxU
SckWeYaxdC8O0hMWZDr8tD6VlDSHqfSVy5bUhjHpEL61BRg58pDSWVKHkCvciKck
81VI+ZNmk4WEYayFJ0x5vUdfDWflx+7OFjXJutIWHiIBg0pQIcJjy7IZreIa9SgB
GGXckxpoZkVbc9L3I7sd4GqOO0TbjJ8HNvw43fWoprHExnf4vuwu+Vic6GZ9WLzI
QeCbvTJOuDGz6S0w4RosBEVlTTwPYGGcXHTX3/wNBTL5+6chOAU7B1imgSCAsgsj
vAUFf9dmM5wSsZsCAwEAAaOBhDCBgTAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQE
AwIGQDAhBglghkgBhvhCAQ0EFBYSU2VydmVyIGNlcnRpZmljYXRlMB0GA1UdDgQW
BBRTv5DWjOfR+jOv096yVTxzF/pQijAfBgNVHSMEGDAWgBSkCioSB+zOEORMXrZ5
gxg7FT9Q2zANBgkqhkiG9w0BAQUFAAOCAQEAfaKjsrB/N9+KfXVi5x6JqH9YzITC
ACz34TePTbAOq+9Rx7gHJJUYmKdp/NfuV4KqDMTk4tyIAkdY3s8q8hGMWnn2zjNA
kwHxGH5rB8AQN6WkvV6NssWrUBknijzTbgjsJ959OR4guCB19EHdXGzFdRjkYqvI
hJLbZqjcaSnTqgbPhn0S8CBmmveO2HdiR5rUN0lcgOv0WwQuYNPdlgDbCV0q6yWV
SGs94Vet6bom1vvDMRNIpE5HncFAZDlkNUtSb+pRKGU9MuJvOB0t7PlpqpKLZqgA
Ttzyger/lLMtvaTPHGxCfeTFJCcNwg21sEaJ3wh2lIZkZJCjlXla0g1wOg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDgjCCAmqgAwIBAgIBAjANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyMzE2NTU1MVowQzELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDERMA8GA1UEAxMIdGVy
bWluYWwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDJHRa30/kHhKjh
gkzhE8jPWP4jto9zPJDfuCSLttSJOWlxEJ4bVxaK7MB4sqLFrTBesHRDm1Y8tk03
ZdQFgidMxX0Mu4y/1PJG3vbJ517yJ0inLTrtilUJTzpFzLa1wbFhonS1PYsqz+Gg
T4bEmWO77Fwn7yCl3h0gmrMZlFwcHSWsJqxKP0ijMHZPwYGZWQqv5M32u7oulzId
6epZSa2ZXaXXituKQTPdTlTv+MqAFSLG6dUzFXz+8iE/ord/GpbCgnUZKijFEXLM
8+styjHoWcQJeTgB3Pp1biO+6Ke9zao/D8dxJixItUGOkZFhLTmY8bGczrENm9DI
fhXR1CgHAgMBAAGjgYQwgYEwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCB4Aw
IQYJYIZIAYb4QgENBBQWEkNsaWVudCBjZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUDtRW
TqZisSk2oBJQS/y5PpJUWVIwHwYDVR0jBBgwFoAUpAoqEgfszhDkTF62eYMYOxU/
UNswDQYJKoZIhvcNAQEFBQADggEBAHOEG6gv3n0i1Po6ihxuAXP6bmyMZJX6iTTE
rYNKctoMvE2Gul6pxnPJUCfKMWroHRumMvNT+MGnx1jiTGRlM854Vs8TdW2df9A+
qQgF8tU9a5y7nxKW4yp2mAzh7h2Hk75QZj8gF5NnaLlURrogjl868QMWIoBPkJf8
Wy4fprBbojFQkIOGhncmoRnIoDDs7zVrse3gS7QXMebhchaeJAFs/qKerW18V8RO
niW97rzpeAVaFqPgIkpmzyxKBf4krnhdHlKeB6rev30xHMyGH6SiOmwiYFr8hkfG
s3OdN4KlFasEp02KlFgn0Hz46Ji2lcch4xcqztyYapAHfWPfJ2I=
-----END CERTIFICATE-----
#!/bin/sh
_base=glassfish
openssl pkcs12 -export -passout pass:changeit -in ca-master/certs/$_base.crt -inkey ca-master/private/$_base.key -out ca-master/certs/$_base.p12
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
<project>LanBortalBeans</project> <project>LanBortalBeans</project>
<project>LanBortalBeansClient</project> <project>LanBortalBeansClient</project>
<project>LanBortalAuthModuleClient</project> <project>LanBortalAuthModuleClient</project>
<project>LanBortalTerminalWeb</project>
</projects> </projects>
<buildSpec> <buildSpec>
<buildCommand> <buildCommand>
......
...@@ -22,5 +22,9 @@ ...@@ -22,5 +22,9 @@
<dependent-module archiveName="LanBortalAuthModuleClient.jar" deploy-path="/lib" handle="module:/resource/LanBortalAuthModuleClient/LanBortalAuthModuleClient"> <dependent-module archiveName="LanBortalAuthModuleClient.jar" deploy-path="/lib" handle="module:/resource/LanBortalAuthModuleClient/LanBortalAuthModuleClient">
<dependency-type>uses</dependency-type> <dependency-type>uses</dependency-type>
</dependent-module> </dependent-module>
<dependent-module archiveName="LanBortalTerminalWeb.war" deploy-path="/" handle="module:/resource/LanBortalTerminalWeb/LanBortalTerminalWeb">
<dependent-object/>
<dependency-type>uses</dependency-type>
</dependent-module>
</wb-module> </wb-module>
</project-modules> </project-modules>
package fi.insomnia.bortal;
import java.util.StringTokenizer;
import javax.security.auth.login.LoginException;
import com.sun.appserv.security.AppservCertificateLoginModule;
public class BortalCertificateLoginModule extends AppservCertificateLoginModule {
@Override
protected void authenticateUser() throws LoginException {
// Get the distinguished name from the X500Principal.
String dname = getX500Principal().getName();
log("BortalCertificateLoginModule: " + dname);
StringTokenizer st = new StringTokenizer(dname, " \t\n\r\f,");
while (st.hasMoreTokens()) {
String next = st.nextToken();
if (next.startsWith("CN=")) {
String cn = next.substring(3);
log("Committing user auth: " + cn);
commitUserAuthentication(new String[] { cn });
return;
}
}
throw new LoginException("No CN found.");
}
private void log(String s) {
System.out.println("BortalCertificateLoginModule: " + s);
}
}
...@@ -38,8 +38,6 @@ package fi.insomnia.bortal; ...@@ -38,8 +38,6 @@ package fi.insomnia.bortal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.List;
import java.util.Set;
import javax.security.auth.login.LoginException; import javax.security.auth.login.LoginException;
...@@ -81,9 +79,6 @@ public class BortalLoginModule extends AppservPasswordLoginModule { ...@@ -81,9 +79,6 @@ public class BortalLoginModule extends AppservPasswordLoginModule {
throw new LoginException("Realm not SampleRealm"); throw new LoginException("Realm not SampleRealm");
} }
// find cert
log("Trying to find certificates");
RealmBeanRemote authbean = BortalRealm.getAuthBean(); RealmBeanRemote authbean = BortalRealm.getAuthBean();
if (authbean == null) { if (authbean == null) {
throw new LoginException( throw new LoginException(
...@@ -139,8 +134,7 @@ public class BortalLoginModule extends AppservPasswordLoginModule { ...@@ -139,8 +134,7 @@ public class BortalLoginModule extends AppservPasswordLoginModule {
} }
private void log(String s) { private void log(String s) {
System.out.println((new StringBuilder()).append("BortalLoginModule::") System.out.println("BortalLoginModule: " + s);
.append(s).toString());
} }
} }
package fi.insomnia.bortal.beans;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.User;
@Stateless
@LocalBean
public class BootstrapBean implements BootstrapBeanLocal {
@EJB
UserFacade userFacade;
public BootstrapBean() {
}
public void saneDefaults() {
User adminUser = userFacade.findByLogin("admin");
if (adminUser == null) {
adminUser = new User();
adminUser.setLogin("admin");
adminUser.setSuperadmin(true);
adminUser.resetPassword("admin");
userFacade.create(adminUser);
}
}
}
...@@ -32,8 +32,6 @@ public class EventBean implements EventBeanLocal { ...@@ -32,8 +32,6 @@ public class EventBean implements EventBeanLocal {
@EJB @EJB
private EventOrganiserFacade eventOrganiserFacade; private EventOrganiserFacade eventOrganiserFacade;
@EJB
private EventStatusBeanLocal eventStatusBean;
@PersistenceContext @PersistenceContext
private EntityManager em; private EntityManager em;
@EJB @EJB
...@@ -59,7 +57,6 @@ public class EventBean implements EventBeanLocal { ...@@ -59,7 +57,6 @@ public class EventBean implements EventBeanLocal {
ret.setName(DEFAULT_EVENT_NAME); ret.setName(DEFAULT_EVENT_NAME);
ret.setOrganiser(findOrCreateDefaultEventOrganisation()); ret.setOrganiser(findOrCreateDefaultEventOrganisation());
ret.setStatus(eventStatusBean.findOrCreateDefaultEventStatus());
eventFacade.create(ret); eventFacade.create(ret);
em.flush(); em.flush();
} }
......
...@@ -7,14 +7,17 @@ import javax.annotation.security.RolesAllowed; ...@@ -7,14 +7,17 @@ import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import fi.insomnia.bortal.enums.apps.SpecialPermission;
import fi.insomnia.bortal.facade.EventFacade;
import fi.insomnia.bortal.facade.EventOrganiserFacade; import fi.insomnia.bortal.facade.EventOrganiserFacade;
import fi.insomnia.bortal.model.EventOrganiser; import fi.insomnia.bortal.model.EventOrganiser;
import fi.insomnia.bortal.model.LanEvent;
/** /**
* Session Bean implementation class EventOrganiserBean * Session Bean implementation class EventOrganiserBean
*/ */
@Stateless @Stateless
@DeclareRoles({ "SUPERADMIN" }) @DeclareRoles({ SpecialPermission.S_SUPERADMIN })
public class EventOrganiserBean implements EventOrganiserBeanLocal { public class EventOrganiserBean implements EventOrganiserBeanLocal {
@EJB @EJB
...@@ -24,6 +27,8 @@ public class EventOrganiserBean implements EventOrganiserBeanLocal { ...@@ -24,6 +27,8 @@ public class EventOrganiserBean implements EventOrganiserBeanLocal {
private LoggingBeanLocal loggingbean; private LoggingBeanLocal loggingbean;
@EJB @EJB
private PermissionBeanLocal permbean; private PermissionBeanLocal permbean;
@EJB
private EventFacade eventfacade;
/** /**
* Default constructor. * Default constructor.
...@@ -58,4 +63,9 @@ public class EventOrganiserBean implements EventOrganiserBeanLocal { ...@@ -58,4 +63,9 @@ public class EventOrganiserBean implements EventOrganiserBeanLocal {
public EventOrganiser find(Integer orgId) { public EventOrganiser find(Integer orgId) {
return eventorgfacade.find(orgId); return eventorgfacade.find(orgId);
} }
@Override
public LanEvent findEvent(Integer eventid) {
return eventfacade.find(eventid);
}
} }
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package fi.insomnia.bortal.beans;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import fi.insomnia.bortal.enums.EventStatusEnum;
import fi.insomnia.bortal.facade.EventStatusFacade;
import fi.insomnia.bortal.model.EventStatus;
/**
*
* @author tuukka
*/
@Stateless
public class EventStatusBean implements EventStatusBeanLocal {
@EJB
private EventStatusFacade eventStatusFacade;
public EventStatus findEventStatus(EventStatusEnum eventStatusEnum) {
EventStatus status = eventStatusFacade.findEventStatus(eventStatusEnum);
if (status == null) {
status = new EventStatus(eventStatusEnum);
eventStatusFacade.create(status);
}
return status;
}
@Override
public EventStatus findOrCreateDefaultEventStatus() {
return findEventStatus(EventStatusEnum.getDefaultEventStatusEnum());
}
}
...@@ -48,7 +48,6 @@ public class Menubean implements MenubeanLocal { ...@@ -48,7 +48,6 @@ public class Menubean implements MenubeanLocal {
@Override @Override
public MenuNavigation getMenuNavigation(String url) { public MenuNavigation getMenuNavigation(String url) {
MenuNavigation ret = navifacade.find(url, eventbean.getCurrentEvent()); MenuNavigation ret = navifacade.find(url, eventbean.getCurrentEvent());
logger.warn("Children at bean: {}", ret.getChildren());
return ret; return ret;
} }
......
...@@ -63,7 +63,8 @@ import fi.insomnia.bortal.model.User; ...@@ -63,7 +63,8 @@ import fi.insomnia.bortal.model.User;
SpecialPermission.S_SUPERADMIN, SpecialPermission.S_SUPERADMIN,
SpecialPermission.S_USER, SpecialPermission.S_USER,
SpecialPermission.S_ANONYMOUS SpecialPermission.S_ANONYMOUS,
"terminal"
}) })
public class PermissionBean implements PermissionBeanLocal { public class PermissionBean implements PermissionBeanLocal {
...@@ -161,4 +162,12 @@ public class PermissionBean implements PermissionBeanLocal { ...@@ -161,4 +162,12 @@ public class PermissionBean implements PermissionBeanLocal {
} }
return defaultUser; return defaultUser;
} }
public String getPrincipal() {
Principal principal = context.getCallerPrincipal();
logger.debug("Principal: {}", principal);
String principalName = principal.getName();
logger.debug("Principal is {}", principalName);
return principalName;
}
} }
package fi.insomnia.bortal.beans; package fi.insomnia.bortal.beans;
import java.util.Calendar; import java.util.Calendar;
import java.util.List;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.exceptions.BortalCatchableException;
import fi.insomnia.bortal.facade.GroupMembershipFacade;
import fi.insomnia.bortal.facade.PrintedCardFacade; import fi.insomnia.bortal.facade.PrintedCardFacade;
import fi.insomnia.bortal.facade.ReaderEventFacade; import fi.insomnia.bortal.facade.ReaderEventFacade;
import fi.insomnia.bortal.facade.ReaderFacade; import fi.insomnia.bortal.facade.ReaderFacade;
import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.PrintedCard; import fi.insomnia.bortal.model.PrintedCard;
import fi.insomnia.bortal.model.Reader; import fi.insomnia.bortal.model.Reader;
import fi.insomnia.bortal.model.ReaderEvent; import fi.insomnia.bortal.model.ReaderEvent;
...@@ -25,97 +20,152 @@ import fi.insomnia.bortal.model.ReaderEvent; ...@@ -25,97 +20,152 @@ import fi.insomnia.bortal.model.ReaderEvent;
* Session Bean implementation class ReaderBean * Session Bean implementation class ReaderBean
*/ */
@Stateless @Stateless
@DeclareRoles("GAME/EXECUTE")
public class ReaderBean implements ReaderBeanLocal { public class ReaderBean implements ReaderBeanLocal {
@EJB @EJB
private ReaderFacade readerfacade; private ReaderFacade readerfacade;
@EJB @EJB
private EventBeanLocal eventbean;
@EJB
private PrintedCardFacade cardfacade; private PrintedCardFacade cardfacade;
@EJB @EJB
private ReaderEventFacade readerEventFacade;
@EJB
private GroupMembershipFacade gmfacade;
@EJB
private CardTemplateBeanLocal cardtemplatebean; private CardTemplateBeanLocal cardtemplatebean;
@EJB
private ReaderEventFacade readerEventFacade;
private static final Logger logger = LoggerFactory.getLogger(ReaderBean.class); private static final Logger logger = LoggerFactory.getLogger(ReaderBean.class);
@Override @Override
public ReaderEvent checkTag(String ident, String tag, String hash) { public ReaderEvent checkTag(String readerIdent, String tag, String hash) {
PrintedCard card = cardfacade.findByRfid(tag); PrintedCard card = cardfacade.findByRfid(tag);
Reader reader = readerfacade.findOrCreateByIdent(readerIdent);
// RfidEvent revent = reventcontainer.foundTag(reader, tag);
List<ReaderEvent> lastevents = readerEventFacade.findLastEvents(reader, 1);
ReaderEvent ret = null; ReaderEvent ret = null;
logger.debug("Found card by rfid: {}", card); if (!lastevents.isEmpty())
if (card != null) { {
ReaderEvent lastevent = lastevents.get(0);
if (card == null)
{
if (lastevent.getPrintedCard() == null && tag.equals(lastevent.getValue()))
{
ret = lastevent;
}
ret = createReaderEvent(ident, card); } else if (card.equals(lastevent.getPrintedCard())) {
ret = lastevent;
}
} }
if (ret == null)
{
ret = createReaderEvent(reader, card);
} else {
ret.setUpdatetime(Calendar.getInstance());
}
if (card == null)
{
ret.setValue(tag);
}
return ret; return ret;
//
// if (revent.getEvent() != null) {
// ret = readerEventFacade.find(revent.getEvent().getId());
// revent.setEvent(ret);
// }
// else if (card != null) {
//
// revent.setEvent(ret);
// }
//
// return ret;
} }
@Override //
public ReaderEvent assocTagToPlacecode(String tag, String readerIdent, String placecode) throws BortalCatchableException, PermissionDeniedException { // @Override
// public ReaderEvent assocTagToPlacecode(String tag, String readerIdent,
GroupMembership gm = gmfacade.findByToken(placecode); // String placecode) throws BortalCatchableException,
if (gm == null) { // PermissionDeniedException {
throw new BortalCatchableException("Token" + placecode + " not found!", "readerbean.tokenNotFound"); //
} // GroupMembership gm = gmfacade.findByToken(placecode);
if (gm.getUser() == null) { // if (gm == null) {
throw new BortalCatchableException("Token " + placecode + "found but not assoc to user!", "readerbean.userNotAssociateToMembership"); // throw new BortalCatchableException("Token" + placecode + " not found!",
} // "readerbean.tokenNotFound");
// }
// if (gm.getUser() == null) {
// throw new BortalCatchableException("Token " + placecode +
// "found but not assoc to user!",
// "readerbean.userNotAssociateToMembership");
// }
//
// PrintedCard card = cardtemplatebean.setRfidUid(tag, gm.getUser());
//
// Reader reader = readerfacade.findOrCreateByIdent(readerIdent);
//
// return createReaderEvent(reader, card);
//
// }
private ReaderEvent createReaderEvent(Reader reader, PrintedCard card) {
PrintedCard card = cardtemplatebean.setRfidUid(tag, gm.getUser()); ReaderEvent ret = new ReaderEvent(Calendar.getInstance(), card, reader);
return createReaderEvent(readerIdent, card); Integer gamepoints = reader.getGamepoints();
} if (gamepoints > 0 && card != null) {
int awardedCount = 0;
private ReaderEvent createReaderEvent(String readerIdent, PrintedCard card) { for (ReaderEvent oldRe : reader.getEvents()) {
if (oldRe.getGamePoint() > 0)
{
++awardedCount;
LanEvent ev = eventbean.getCurrentEvent(); // User has been already awarded points from this reader.
// Not awarding again...
if (oldRe.getPrintedCard().equals(card)) {
gamepoints = 0;
break;
}
}
}
// if points can be awarded only limited times...
if (reader.getMaxEvents() > 0 && reader.getMaxEvents() > awardedCount) {
gamepoints = 0;
}
Reader reader = readerfacade.findOrCreateByIdent(ev, readerIdent);
logger.debug("Creating new readerevent for reader {} and events {}", reader, reader.getMaxEvents());
logger.debug("maxevents for reder {}. readerevents at the moment {}", reader.getMaxEvents(), reader.getEvents().size());
if (reader.getMaxEvents() > 0 && reader.getMaxEvents() <= reader.getEvents().size()) {
logger.debug("Max events {} found. returning null");
return null;
} }
if (reader.getGamepoints() > 0 && card.getUser() != null) {
logger.debug("Checking if user has been here");
for (ReaderEvent oldRe : card.getReaderEvents()) { ret.setGamePoint(gamepoints);
if (oldRe.getReader().getId().equals(reader.getId())) {
logger.debug("Found already an event for user! returning null");
return null;
}
}
}
ReaderEvent ret = new ReaderEvent(Calendar.getInstance(), card, reader);
ret.setGamePoint(reader.getGamepoints());
ret.setReader(reader);
reader.getEvents().add(ret); reader.getEvents().add(ret);
card.getReaderEvents().add(ret); if (card != null)
cardfacade.merge(card); {
card.getReaderEvents().add(ret);
}
return ret; return ret;
} }
@Override @Override
public ReaderEvent assocTagToCard(String tag, String readerIdent, PrintedCard card) { public ReaderEvent assocTagToCard(String tag, String readerIdent, PrintedCard card) {
Reader reader = readerfacade.findOrCreateByIdent(readerIdent);
card = cardtemplatebean.setRfidUid(tag, card); card = cardtemplatebean.setRfidUid(tag, card);
return createReaderEvent(readerIdent, card); return createReaderEvent(reader, card);
} }
@Override @Override
@RolesAllowed("GAME/EXECUTE") public List<Reader> getReaders() {
public ReaderEvent merge(ReaderEvent e) { return readerfacade.findAllForEvent();
return readerEventFacade.merge(e);
} }
@Override
public List<ReaderEvent> getReaderEvents(Integer readerId) {
Reader reader = readerfacade.find(readerId);
return readerEventFacade.findLastEvents(reader, 20);
}
} }
package fi.insomnia.bortal.beans;
import javax.ejb.LocalBean;
import javax.ejb.Singleton;
@Singleton
@LocalBean
public class RfidContainerBean implements RfidContainerBeanLocal {
// private static final Logger logger =
// LoggerFactory.getLogger(RfidContainerBean.class);
//
// // -------------- EventId ---- Reader Id --- Rfidevent
// private final Map<Integer, Map<Integer, List<RfidEvent>>> events =
// Collections.synchronizedMap(new HashMap<Integer, Map<Integer,
// List<RfidEvent>>>());
//
// @EJB
// private EventBeanLocal evbean;
//
// public synchronized RfidEvent foundTag(Reader reader, String tag) {
// LanEvent currEv = evbean.getCurrentEvent();
//
// if (!events.containsKey(currEv.getId())) {
// events.put(currEv.getId(), new HashMap<Integer, List<RfidEvent>>());
// }
//
// Map<Integer, List<RfidEvent>> eventMap = events.get(currEv.getId());
//
// if (!eventMap.containsKey(reader)) {
// eventMap.put(reader.getId(), new LinkedList<RfidEvent>());
// }
//
// List<RfidEvent> readerevents = eventMap.get(reader);
// while (readerevents.size() > 20) {
// readerevents.remove(readerevents.size() - 1);
// logger.debug("Cleaning readerevents from reader {}", reader);
// }
//
// RfidEvent ret = null;
// if (readerevents.size() > 0 && readerevents.get(0).getTag().equals(tag))
// {
// ret = readerevents.get(0);
// readerevents.get(0).seen();
// } else {
// ret = new RfidEvent(reader, tag);
// readerevents.add(0, ret);
// }
//
// return ret;
// }
//
// @Override
// public List<RfidEvent> getReaderEvents(String readername) {
// LanEvent currEv = evbean.getCurrentEvent();
// List<RfidEvent> ret = null;
// if (events.containsKey(currEv.getId())) {
// ret = events.get(currEv.getId()).get(readername);
// }
// return ret;
//
// }
}
package fi.insomnia.bortal.facade;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import fi.insomnia.bortal.enums.EventStatusEnum;
import fi.insomnia.bortal.model.EventStatus;
import fi.insomnia.bortal.model.EventStatus_;
@Stateless
@LocalBean
public class EventStatusFacade extends GenericFacade<Integer, EventStatus> {
@PersistenceContext
private EntityManager em;
public EventStatusFacade() {
super(EventStatus.class);
}
@Override
protected EntityManager getEm() {
return em;
}
public EventStatus findEventStatus(EventStatusEnum eventStatusEnum) {
// @NamedQuery(name = "EventStatus.findByStatusName", query =
// "SELECT e FROM EventStatus e WHERE e.name = :name") })
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<EventStatus> cq = cb.createQuery(EventStatus.class);
Root<EventStatus> root = cq.from(EventStatus.class);
cq.where(cb.equal(root.get(EventStatus_.name), eventStatusEnum));
// TypedQuery<EventStatus> q =
// em.createNamedQuery("EventStatus.findByStatusName",
// EventStatus.class);
// q.setParameter("name", eventStatusEnum.name());
return getSingleNullableResult(em.createQuery(cq));
}
}
package fi.insomnia.bortal.facade; package fi.insomnia.bortal.facade;
import java.util.List;
import javax.ejb.LocalBean; import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import fi.insomnia.bortal.model.Reader;
import fi.insomnia.bortal.model.ReaderEvent; import fi.insomnia.bortal.model.ReaderEvent;
import fi.insomnia.bortal.model.ReaderEvent_;
@Stateless @Stateless
@LocalBean @LocalBean
...@@ -23,4 +31,16 @@ public class ReaderEventFacade extends GenericFacade<Integer, ReaderEvent> { ...@@ -23,4 +31,16 @@ public class ReaderEventFacade extends GenericFacade<Integer, ReaderEvent> {
return em; return em;
} }
public List<ReaderEvent> findLastEvents(Reader reader, int count) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<ReaderEvent> cq = cb.createQuery(ReaderEvent.class);
Root<ReaderEvent> root = cq.from(ReaderEvent.class);
cq.where(cb.equal(root.get(ReaderEvent_.reader), reader));
cq.orderBy(cb.desc(root.get(ReaderEvent_.time)));
TypedQuery<ReaderEvent> q = em.createQuery(cq);
q.setMaxResults(count);
return q.getResultList();
}
} }
package fi.insomnia.bortal.facade; package fi.insomnia.bortal.facade;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.LocalBean; import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
...@@ -9,6 +12,7 @@ import javax.persistence.criteria.CriteriaBuilder; ...@@ -9,6 +12,7 @@ import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root; import javax.persistence.criteria.Root;
import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.model.LanEvent; import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Reader; import fi.insomnia.bortal.model.Reader;
import fi.insomnia.bortal.model.Reader_; import fi.insomnia.bortal.model.Reader_;
...@@ -20,6 +24,9 @@ public class ReaderFacade extends GenericFacade<Integer, Reader> { ...@@ -20,6 +24,9 @@ public class ReaderFacade extends GenericFacade<Integer, Reader> {
@PersistenceContext @PersistenceContext
private EntityManager em; private EntityManager em;
@EJB
private EventBeanLocal eventbean;
public ReaderFacade() { public ReaderFacade() {
super(Reader.class); super(Reader.class);
} }
...@@ -44,10 +51,11 @@ public class ReaderFacade extends GenericFacade<Integer, Reader> { ...@@ -44,10 +51,11 @@ public class ReaderFacade extends GenericFacade<Integer, Reader> {
return getSingleNullableResult(q); return getSingleNullableResult(q);
} }
public Reader findOrCreateByIdent(LanEvent ev, String ident) { public Reader findOrCreateByIdent(String ident) {
Reader ret = findByIdent(ev, ident); LanEvent event = eventbean.getCurrentEvent();
Reader ret = findByIdent(event, ident);
if (ret == null) { if (ret == null) {
ret = createIdent(this, ev, ident); ret = createIdent(this, event, ident);
} }
return ret; return ret;
} }
...@@ -61,4 +69,12 @@ public class ReaderFacade extends GenericFacade<Integer, Reader> { ...@@ -61,4 +69,12 @@ public class ReaderFacade extends GenericFacade<Integer, Reader> {
} }
return ret; return ret;
} }
public List<Reader> findAllForEvent() {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Reader> cq = cb.createQuery(Reader.class);
Root<Reader> root = cq.from(Reader.class);
cq.where(cb.equal(root.get(Reader_.event), eventbean.getCurrentEvent()));
return em.createQuery(cq).getResultList();
}
} }
package fi.insomnia.bortal.beans;
import javax.ejb.Local;
@Local
public interface BootstrapBeanLocal {
void saneDefaults();
}
...@@ -5,11 +5,12 @@ import java.util.List; ...@@ -5,11 +5,12 @@ import java.util.List;
import javax.ejb.Local; import javax.ejb.Local;
import fi.insomnia.bortal.model.EventOrganiser; import fi.insomnia.bortal.model.EventOrganiser;
import fi.insomnia.bortal.model.LanEvent;
@Local @Local
public interface EventOrganiserBeanLocal { public interface EventOrganiserBeanLocal {
void save(EventOrganiser eventorg) throws PermissionDeniedException; void save(EventOrganiser eventorg);
List<EventOrganiser> getEventOrganisers(); List<EventOrganiser> getEventOrganisers();
...@@ -17,4 +18,6 @@ public interface EventOrganiserBeanLocal { ...@@ -17,4 +18,6 @@ public interface EventOrganiserBeanLocal {
EventOrganiser find(Integer orgId); EventOrganiser find(Integer orgId);
LanEvent findEvent(Integer eventid);
} }
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package fi.insomnia.bortal.beans;
import fi.insomnia.bortal.model.EventStatus;
import javax.ejb.Local;
/**
*
* @author tuukka
*/
@Local
public interface EventStatusBeanLocal {
public EventStatus findOrCreateDefaultEventStatus();
}
...@@ -24,6 +24,8 @@ public interface PermissionBeanLocal { ...@@ -24,6 +24,8 @@ public interface PermissionBeanLocal {
User getAnonUser(); User getAnonUser();
String getPrincipal();
// boolean hasPermission(String perm); // boolean hasPermission(String perm);
} }
package fi.insomnia.bortal.beans; package fi.insomnia.bortal.beans;
import java.util.List;
import javax.ejb.Local; import javax.ejb.Local;
import fi.insomnia.bortal.exceptions.BortalCatchableException;
import fi.insomnia.bortal.model.PrintedCard; import fi.insomnia.bortal.model.PrintedCard;
import fi.insomnia.bortal.model.Reader;
import fi.insomnia.bortal.model.ReaderEvent; import fi.insomnia.bortal.model.ReaderEvent;
@Local @Local
...@@ -11,10 +13,14 @@ public interface ReaderBeanLocal { ...@@ -11,10 +13,14 @@ public interface ReaderBeanLocal {
ReaderEvent checkTag(String reader, String tag, String hash); ReaderEvent checkTag(String reader, String tag, String hash);
ReaderEvent assocTagToPlacecode(String tag, String readerIdent, String placecode) throws BortalCatchableException, PermissionDeniedException; // WAT!
// ReaderEvent assocTagToPlacecode(String tag, String readerIdent, String
// placecode) throws BortalCatchableException, PermissionDeniedException;
ReaderEvent assocTagToCard(String tag, String readerIdent, PrintedCard card); ReaderEvent assocTagToCard(String tag, String readerIdent, PrintedCard card);
ReaderEvent merge(ReaderEvent e); List<Reader> getReaders();
List<ReaderEvent> getReaderEvents(Integer readerId);
} }
package fi.insomnia.bortal.beans;
import javax.ejb.Local;
@Local
public interface RfidContainerBeanLocal {
// List<RfidEvent> getReaderEvents(String readername);
}
...@@ -33,6 +33,17 @@ ...@@ -33,6 +33,17 @@
</entity> </entity>
<entity> <entity>
<entity-name>fi.insomnia.bortal.model.ActionLogMessage</entity-name>
<entity-width>120</entity-width>
<entity-height>30</entity-height>
<entity-X-Coordinate>-200</entity-X-Coordinate>
<entity-Y-Coordinate>880</entity-Y-Coordinate>
<primary-collapsed>false</primary-collapsed>
<relation-collapsed>false</relation-collapsed>
<basic-collapsed>false</basic-collapsed>
</entity>
<entity>
<entity-name>fi.insomnia.bortal.model.Bill</entity-name> <entity-name>fi.insomnia.bortal.model.Bill</entity-name>
<entity-width>120</entity-width> <entity-width>120</entity-width>
<entity-height>30</entity-height> <entity-height>30</entity-height>
...@@ -66,17 +77,6 @@ ...@@ -66,17 +77,6 @@
</entity> </entity>
<entity> <entity>
<entity-name>fi.insomnia.bortal.model.EventStatus</entity-name>
<entity-width>120</entity-width>
<entity-height>30</entity-height>
<entity-X-Coordinate>364</entity-X-Coordinate>
<entity-Y-Coordinate>580</entity-Y-Coordinate>
<primary-collapsed>false</primary-collapsed>
<relation-collapsed>false</relation-collapsed>
<basic-collapsed>false</basic-collapsed>
</entity>
<entity>
<entity-name>fi.insomnia.bortal.model.CompoEntryParticipant</entity-name> <entity-name>fi.insomnia.bortal.model.CompoEntryParticipant</entity-name>
<entity-width>120</entity-width> <entity-width>120</entity-width>
<entity-height>30</entity-height> <entity-height>30</entity-height>
...@@ -132,6 +132,17 @@ ...@@ -132,6 +132,17 @@
</entity> </entity>
<entity> <entity>
<entity-name>fi.insomnia.bortal.model.Menuitem</entity-name>
<entity-width>120</entity-width>
<entity-height>30</entity-height>
<entity-X-Coordinate>-161</entity-X-Coordinate>
<entity-Y-Coordinate>1545</entity-Y-Coordinate>
<primary-collapsed>false</primary-collapsed>
<relation-collapsed>false</relation-collapsed>
<basic-collapsed>false</basic-collapsed>
</entity>
<entity>
<entity-name>fi.insomnia.bortal.model.CompoEntry</entity-name> <entity-name>fi.insomnia.bortal.model.CompoEntry</entity-name>
<entity-width>120</entity-width> <entity-width>120</entity-width>
<entity-height>30</entity-height> <entity-height>30</entity-height>
...@@ -146,8 +157,8 @@ ...@@ -146,8 +157,8 @@
<entity-name>fi.insomnia.bortal.model.ReaderEvent</entity-name> <entity-name>fi.insomnia.bortal.model.ReaderEvent</entity-name>
<entity-width>120</entity-width> <entity-width>120</entity-width>
<entity-height>30</entity-height> <entity-height>30</entity-height>
<entity-X-Coordinate>364</entity-X-Coordinate> <entity-X-Coordinate>302</entity-X-Coordinate>
<entity-Y-Coordinate>1696</entity-Y-Coordinate> <entity-Y-Coordinate>1698</entity-Y-Coordinate>
<primary-collapsed>false</primary-collapsed> <primary-collapsed>false</primary-collapsed>
<relation-collapsed>false</relation-collapsed> <relation-collapsed>false</relation-collapsed>
<basic-collapsed>false</basic-collapsed> <basic-collapsed>false</basic-collapsed>
...@@ -198,6 +209,17 @@ ...@@ -198,6 +209,17 @@
</entity> </entity>
<entity> <entity>
<entity-name>fi.insomnia.bortal.model.MenuNavigation</entity-name>
<entity-width>120</entity-width>
<entity-height>30</entity-height>
<entity-X-Coordinate>-207</entity-X-Coordinate>
<entity-Y-Coordinate>1409</entity-Y-Coordinate>
<primary-collapsed>false</primary-collapsed>
<relation-collapsed>false</relation-collapsed>
<basic-collapsed>false</basic-collapsed>
</entity>
<entity>
<entity-name>fi.insomnia.bortal.model.LanEvent</entity-name> <entity-name>fi.insomnia.bortal.model.LanEvent</entity-name>
<entity-width>120</entity-width> <entity-width>120</entity-width>
<entity-height>30</entity-height> <entity-height>30</entity-height>
...@@ -244,7 +266,7 @@ ...@@ -244,7 +266,7 @@
<entity> <entity>
<entity-name>fi.insomnia.bortal.model.Reader</entity-name> <entity-name>fi.insomnia.bortal.model.Reader</entity-name>
<entity-width>120</entity-width> <entity-width>120</entity-width>
<entity-height>268</entity-height> <entity-height>30</entity-height>
<entity-X-Coordinate>413</entity-X-Coordinate> <entity-X-Coordinate>413</entity-X-Coordinate>
<entity-Y-Coordinate>1877</entity-Y-Coordinate> <entity-Y-Coordinate>1877</entity-Y-Coordinate>
<primary-collapsed>false</primary-collapsed> <primary-collapsed>false</primary-collapsed>
...@@ -267,8 +289,8 @@ ...@@ -267,8 +289,8 @@
<entity-name>fi.insomnia.bortal.model.Location</entity-name> <entity-name>fi.insomnia.bortal.model.Location</entity-name>
<entity-width>120</entity-width> <entity-width>120</entity-width>
<entity-height>30</entity-height> <entity-height>30</entity-height>
<entity-X-Coordinate>194</entity-X-Coordinate> <entity-X-Coordinate>63</entity-X-Coordinate>
<entity-Y-Coordinate>1841</entity-Y-Coordinate> <entity-Y-Coordinate>1712</entity-Y-Coordinate>
<primary-collapsed>false</primary-collapsed> <primary-collapsed>false</primary-collapsed>
<relation-collapsed>false</relation-collapsed> <relation-collapsed>false</relation-collapsed>
<basic-collapsed>false</basic-collapsed> <basic-collapsed>false</basic-collapsed>
...@@ -286,6 +308,28 @@ ...@@ -286,6 +308,28 @@
</entity> </entity>
<entity> <entity>
<entity-name>fi.insomnia.bortal.model.PageContent</entity-name>
<entity-width>120</entity-width>
<entity-height>30</entity-height>
<entity-X-Coordinate>-38</entity-X-Coordinate>
<entity-Y-Coordinate>1478</entity-Y-Coordinate>
<primary-collapsed>false</primary-collapsed>
<relation-collapsed>false</relation-collapsed>
<basic-collapsed>false</basic-collapsed>
</entity>
<entity>
<entity-name>fi.insomnia.bortal.model.SitePage</entity-name>
<entity-width>120</entity-width>
<entity-height>30</entity-height>
<entity-X-Coordinate>-65</entity-X-Coordinate>
<entity-Y-Coordinate>1281</entity-Y-Coordinate>
<primary-collapsed>false</primary-collapsed>
<relation-collapsed>false</relation-collapsed>
<basic-collapsed>false</basic-collapsed>
</entity>
<entity>
<entity-name>fi.insomnia.bortal.model.PossibleAnswer</entity-name> <entity-name>fi.insomnia.bortal.model.PossibleAnswer</entity-name>
<entity-width>120</entity-width> <entity-width>120</entity-width>
<entity-height>30</entity-height> <entity-height>30</entity-height>
...@@ -343,7 +387,7 @@ ...@@ -343,7 +387,7 @@
<entity> <entity>
<entity-name>fi.insomnia.bortal.model.NewsGroup</entity-name> <entity-name>fi.insomnia.bortal.model.NewsGroup</entity-name>
<entity-width>120</entity-width> <entity-width>120</entity-width>
<entity-height>208</entity-height> <entity-height>30</entity-height>
<entity-X-Coordinate>663</entity-X-Coordinate> <entity-X-Coordinate>663</entity-X-Coordinate>
<entity-Y-Coordinate>1150</entity-Y-Coordinate> <entity-Y-Coordinate>1150</entity-Y-Coordinate>
<primary-collapsed>false</primary-collapsed> <primary-collapsed>false</primary-collapsed>
...@@ -355,8 +399,8 @@ ...@@ -355,8 +399,8 @@
<entity-name>fi.insomnia.bortal.model.CardTemplate</entity-name> <entity-name>fi.insomnia.bortal.model.CardTemplate</entity-name>
<entity-width>120</entity-width> <entity-width>120</entity-width>
<entity-height>30</entity-height> <entity-height>30</entity-height>
<entity-X-Coordinate>156</entity-X-Coordinate> <entity-X-Coordinate>40</entity-X-Coordinate>
<entity-Y-Coordinate>1205</entity-Y-Coordinate> <entity-Y-Coordinate>1091</entity-Y-Coordinate>
<primary-collapsed>false</primary-collapsed> <primary-collapsed>false</primary-collapsed>
<relation-collapsed>false</relation-collapsed> <relation-collapsed>false</relation-collapsed>
<basic-collapsed>false</basic-collapsed> <basic-collapsed>false</basic-collapsed>
...@@ -374,22 +418,22 @@ ...@@ -374,22 +418,22 @@
</entity> </entity>
<entity> <entity>
<entity-name>fi.insomnia.bortal.model.User</entity-name> <entity-name>fi.insomnia.bortal.model.PollAnswer</entity-name>
<entity-width>120</entity-width> <entity-width>120</entity-width>
<entity-height>30</entity-height> <entity-height>30</entity-height>
<entity-X-Coordinate>1132</entity-X-Coordinate> <entity-X-Coordinate>1236</entity-X-Coordinate>
<entity-Y-Coordinate>994</entity-Y-Coordinate> <entity-Y-Coordinate>1323</entity-Y-Coordinate>
<primary-collapsed>false</primary-collapsed> <primary-collapsed>false</primary-collapsed>
<relation-collapsed>false</relation-collapsed> <relation-collapsed>false</relation-collapsed>
<basic-collapsed>false</basic-collapsed> <basic-collapsed>false</basic-collapsed>
</entity> </entity>
<entity> <entity>
<entity-name>fi.insomnia.bortal.model.PollAnswer</entity-name> <entity-name>fi.insomnia.bortal.model.User</entity-name>
<entity-width>120</entity-width> <entity-width>120</entity-width>
<entity-height>30</entity-height> <entity-height>30</entity-height>
<entity-X-Coordinate>1236</entity-X-Coordinate> <entity-X-Coordinate>1132</entity-X-Coordinate>
<entity-Y-Coordinate>1323</entity-Y-Coordinate> <entity-Y-Coordinate>994</entity-Y-Coordinate>
<primary-collapsed>false</primary-collapsed> <primary-collapsed>false</primary-collapsed>
<relation-collapsed>false</relation-collapsed> <relation-collapsed>false</relation-collapsed>
<basic-collapsed>false</basic-collapsed> <basic-collapsed>false</basic-collapsed>
......
package fi.insomnia.bortal.model;
import java.io.IOException;
import java.io.Serializable;
import java.io.StringReader;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import org.bouncycastle.openssl.PEMReader;
import org.eclipse.persistence.annotations.OptimisticLocking;
import org.eclipse.persistence.annotations.OptimisticLockingType;
/**
* Entity implementation class for Entity: Certificate
*
*/
@Entity
@Table(name = "certificate")
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class Certificate extends GenericEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "common_name")
private String commonName;
private String certificate;
public Certificate() {
super();
}
public String getCommonName() {
return this.commonName;
}
public void setCommonName(String commonName) {
this.commonName = commonName;
}
public String getCertificate() {
return this.certificate;
}
public X509Certificate getX509Certificate() throws CertificateException, IOException {
StringReader sr = new StringReader(this.certificate);
PEMReader pemReader = new PEMReader(sr);
X509Certificate cert = (X509Certificate) pemReader.readObject();
return cert;
}
public void setCertificate(String certificate) {
this.certificate = certificate;
}
public void set509Certificate(X509Certificate cert) {
}
}
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package fi.insomnia.bortal.model;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.eclipse.persistence.annotations.OptimisticLocking;
import org.eclipse.persistence.annotations.OptimisticLockingType;
import fi.insomnia.bortal.enums.EventStatusEnum;
/**
*
*/
@Entity
@Table(name = "event_status")
// , uniqueConstraints = { @UniqueConstraint(columnNames = { "status_name" }) })
// @NamedQueries({
// @NamedQuery(name = "EventStatus.findAll", query =
// "SELECT e FROM EventStatus e"),
// @NamedQuery(name = "EventStatus.findByStatusName", query =
// "SELECT e FROM EventStatus e WHERE e.name = :name") })
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class EventStatus extends GenericEntity {
private static final long serialVersionUID = 1L;
@Column(name = "status_name", nullable = false, unique = true)
@Enumerated(EnumType.STRING)
private EventStatusEnum name;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "status")
private List<LanEvent> events;
public EventStatus() {
super();
};
public EventStatus(EventStatusEnum name) {
super();
this.name = name;
}
public EventStatusEnum getName() {
return name;
}
public void setName(EventStatusEnum statusName) {
this.name = statusName;
}
public List<LanEvent> getEvents() {
return events;
}
public void setEvents(List<LanEvent> eventList) {
this.events = eventList;
}
}
...@@ -19,7 +19,6 @@ public class GenericEntity extends EntityEquals implements ModelInterface<Intege ...@@ -19,7 +19,6 @@ public class GenericEntity extends EntityEquals implements ModelInterface<Intege
@Id @Id
@Column(name = ID_COLUMN, nullable = false) @Column(name = ID_COLUMN, nullable = false)
// @ReturnInsert(returnOnly=true)
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id; private Integer id;
......
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package fi.insomnia.bortal.model; package fi.insomnia.bortal.model;
import java.util.Calendar; import java.util.Calendar;
...@@ -10,6 +6,8 @@ import java.util.List; ...@@ -10,6 +6,8 @@ import java.util.List;
import javax.persistence.CascadeType; import javax.persistence.CascadeType;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne; import javax.persistence.ManyToOne;
import javax.persistence.OneToMany; import javax.persistence.OneToMany;
...@@ -21,25 +19,17 @@ import javax.persistence.TemporalType; ...@@ -21,25 +19,17 @@ import javax.persistence.TemporalType;
import org.eclipse.persistence.annotations.OptimisticLocking; import org.eclipse.persistence.annotations.OptimisticLocking;
import org.eclipse.persistence.annotations.OptimisticLockingType; import org.eclipse.persistence.annotations.OptimisticLockingType;
import fi.insomnia.bortal.enums.EventStatus;
import fi.insomnia.bortal.model.salespoint.Salespoint;
/** /**
* *
*/ */
@Entity @Entity
@Table(name = "events") @Table(name = "events")
// @NamedQueries({
// @NamedQuery(name = "LanEvent.findAll", query = "SELECT e FROM LanEvent e"),
// @NamedQuery(name = "LanEvent.findByStartTime", query =
// "SELECT e FROM LanEvent e WHERE e.startTime = :startTime"),
// @NamedQuery(name = "LanEvent.findByEndTime", query =
// "SELECT e FROM LanEvent e WHERE e.endTime = :endTime"),
// @NamedQuery(name = "LanEvent.findByName", query =
// "SELECT e FROM LanEvent e WHERE e.name = :name") })
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS) @OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class LanEvent extends GenericEntity { public class LanEvent extends GenericEntity {
/**
*
*/
private static final long serialVersionUID = 179811358211927126L; private static final long serialVersionUID = 179811358211927126L;
@Column(name = "start_time") @Column(name = "start_time")
...@@ -71,9 +61,9 @@ public class LanEvent extends GenericEntity { ...@@ -71,9 +61,9 @@ public class LanEvent extends GenericEntity {
@ManyToOne(optional = false) @ManyToOne(optional = false)
private EventOrganiser organiser; private EventOrganiser organiser;
@JoinColumn(name = "event_status_id", referencedColumnName = "id", nullable = false) @Column(name = "status", nullable = false)
@ManyToOne(optional = false) @Enumerated(EnumType.STRING)
private EventStatus status; private EventStatus status = EventStatus.INACTIVE;
@OneToMany(mappedBy = "parentEvent") @OneToMany(mappedBy = "parentEvent")
private List<LogEntry> logEntries; private List<LogEntry> logEntries;
...@@ -103,6 +93,9 @@ public class LanEvent extends GenericEntity { ...@@ -103,6 +93,9 @@ public class LanEvent extends GenericEntity {
@OneToMany(mappedBy = "event", cascade = CascadeType.ALL) @OneToMany(mappedBy = "event", cascade = CascadeType.ALL)
private List<Poll> polls; private List<Poll> polls;
@OneToMany(mappedBy = "event", cascade = CascadeType.ALL)
private List<Salespoint> salespoints;
public LanEvent() { public LanEvent() {
} }
...@@ -264,4 +257,12 @@ public class LanEvent extends GenericEntity { ...@@ -264,4 +257,12 @@ public class LanEvent extends GenericEntity {
this.polls = polls; this.polls = polls;
} }
public List<Salespoint> getSalespoints() {
return salespoints;
}
public void setSalespoints(List<Salespoint> salespoints) {
this.salespoints = salespoints;
}
} }
...@@ -33,16 +33,6 @@ import org.eclipse.persistence.annotations.OptimisticLockingType; ...@@ -33,16 +33,6 @@ import org.eclipse.persistence.annotations.OptimisticLockingType;
@Table(name = "printed_cards", uniqueConstraints = { @Table(name = "printed_cards", uniqueConstraints = {
@UniqueConstraint(columnNames = { "event_id", "rfid_uid", }), @UniqueConstraint(columnNames = { "event_id", "rfid_uid", }),
@UniqueConstraint(columnNames = { "event_id", "barcode" }) }) @UniqueConstraint(columnNames = { "event_id", "barcode" }) })
// @NamedQueries({
// @NamedQuery(name = "PrintedCard.findAll", query =
// "SELECT p FROM PrintedCard p"),
//
// @NamedQuery(name = "PrintedCard.findByPrintTime", query =
// "SELECT p FROM PrintedCard p WHERE p.printTime = :printTime"),
// @NamedQuery(name = "PrintedCard.findByEnabled", query =
// "SELECT p FROM PrintedCard p WHERE p.enabled = :enabled"),
// @NamedQuery(name = "PrintedCard.findByRfidUid", query =
// "SELECT p FROM PrintedCard p WHERE p.rfidUid = :rfidUid") })
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS) @OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class PrintedCard extends GenericEntity { public class PrintedCard extends GenericEntity {
...@@ -70,7 +60,7 @@ public class PrintedCard extends GenericEntity { ...@@ -70,7 +60,7 @@ public class PrintedCard extends GenericEntity {
private String rfidUid; private String rfidUid;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "printedCard") @OneToMany(cascade = CascadeType.ALL, mappedBy = "printedCard")
private List<ReaderEvent> readerEvents; private List<ReaderEvent> readerEvents = new ArrayList<ReaderEvent>();
@Column(name = "print_count", nullable = false) @Column(name = "print_count", nullable = false)
private int printCount = 0; private int printCount = 0;
......
...@@ -4,6 +4,11 @@ ...@@ -4,6 +4,11 @@
*/ */
package fi.insomnia.bortal.model; package fi.insomnia.bortal.model;
import static javax.persistence.CascadeType.DETACH;
import static javax.persistence.CascadeType.MERGE;
import static javax.persistence.CascadeType.PERSIST;
import static javax.persistence.CascadeType.REFRESH;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -13,12 +18,15 @@ import javax.persistence.JoinColumn; ...@@ -13,12 +18,15 @@ import javax.persistence.JoinColumn;
import javax.persistence.Lob; import javax.persistence.Lob;
import javax.persistence.ManyToOne; import javax.persistence.ManyToOne;
import javax.persistence.OneToMany; import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table; import javax.persistence.Table;
import javax.persistence.UniqueConstraint; import javax.persistence.UniqueConstraint;
import org.eclipse.persistence.annotations.OptimisticLocking; import org.eclipse.persistence.annotations.OptimisticLocking;
import org.eclipse.persistence.annotations.OptimisticLockingType; import org.eclipse.persistence.annotations.OptimisticLockingType;
import fi.insomnia.bortal.model.salespoint.SalesEntity;
/** /**
* *
*/ */
...@@ -58,6 +66,9 @@ public class Reader extends GenericEntity { ...@@ -58,6 +66,9 @@ public class Reader extends GenericEntity {
@Column(nullable = false) @Column(nullable = false)
private Integer maxEvents = 0; private Integer maxEvents = 0;
@OneToOne(mappedBy = "reader")
private SalesEntity salesEntity;
/** /**
* *
*/ */
...@@ -83,7 +94,7 @@ public class Reader extends GenericEntity { ...@@ -83,7 +94,7 @@ public class Reader extends GenericEntity {
@Column(name = "map_y") @Column(name = "map_y")
private Integer mapY; private Integer mapY;
@OneToMany(mappedBy = "reader") @OneToMany(mappedBy = "reader", cascade = { PERSIST, MERGE, REFRESH, DETACH })
private List<ReaderEvent> events = new ArrayList<ReaderEvent>(); private List<ReaderEvent> events = new ArrayList<ReaderEvent>();
public String getIdentification() { public String getIdentification() {
...@@ -186,4 +197,12 @@ public class Reader extends GenericEntity { ...@@ -186,4 +197,12 @@ public class Reader extends GenericEntity {
public void setEvent(LanEvent event) { public void setEvent(LanEvent event) {
this.event = event; this.event = event;
} }
public SalesEntity getSalesEntity() {
return salesEntity;
}
public void setSalesEntity(SalesEntity salesEntity) {
this.salesEntity = salesEntity;
}
} }
...@@ -29,13 +29,17 @@ public class ReaderEvent extends GenericEntity { ...@@ -29,13 +29,17 @@ public class ReaderEvent extends GenericEntity {
@Temporal(TemporalType.TIMESTAMP) @Temporal(TemporalType.TIMESTAMP)
private Calendar time; private Calendar time;
@Column(name = "event_updated")
@Temporal(TemporalType.TIMESTAMP)
private Calendar updatetime;
@Column(name = "value") @Column(name = "value")
private String value; private String value;
@Column(nullable = false) @Column(nullable = false)
private Integer gamePoint = 0; private Integer gamePoint = 0;
@JoinColumn(name = "printed_cards_id", referencedColumnName = "id", nullable = false, updatable = false) @JoinColumn(name = "printed_cards_id", referencedColumnName = "id", nullable = true, updatable = false)
@ManyToOne(optional = false) @ManyToOne(optional = false)
private PrintedCard printedCard; private PrintedCard printedCard;
...@@ -93,4 +97,34 @@ public class ReaderEvent extends GenericEntity { ...@@ -93,4 +97,34 @@ public class ReaderEvent extends GenericEntity {
return gamePoint; return gamePoint;
} }
public Calendar getUpdatetime() {
return updatetime;
}
public void setUpdatetime(Calendar updatetime) {
this.updatetime = updatetime;
}
public String getSeenSince() {
Calendar comptime = updatetime;
if (comptime == null)
{
comptime = time;
}
long diffSec = (Calendar.getInstance().getTimeInMillis() - comptime.getTimeInMillis()) / 1000;
long secs = diffSec % 60;
long diffMin = diffSec / 60;
long mins = diffMin % 60;
long hours = diffMin / 60;
StringBuilder ret = new StringBuilder();
if (hours > 0) {
ret.append(hours).append(" h ");
}
if (hours > 0 || mins > 0) {
ret.append(mins).append(" min ");
}
ret.append(secs).append(" sec");
return ret.toString();
}
} }
package fi.insomnia.bortal.model.salespoint;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import fi.insomnia.bortal.model.GenericEntity;
import fi.insomnia.bortal.model.Reader;
@Entity
@Table(name = "sales_entity")
public class SalesEntity extends GenericEntity {
private static final long serialVersionUID = -1071792777020210982L;
@Lob
private String certificate;
private String name;
@Lob
private String secret;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private SalesEntityType type;
@OneToOne()
private Reader reader;
@ManyToOne()
@JoinColumn(nullable = false)
private Salespoint point;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public SalesEntityType getType() {
return type;
}
public void setType(SalesEntityType type) {
this.type = type;
}
public Salespoint getPoint() {
return point;
}
public void setPoint(Salespoint point) {
this.point = point;
}
public String getSecret() {
return secret;
}
public void setSecret(String secret) {
this.secret = secret;
}
public String getCertificate() {
return certificate;
}
public void setCertificate(String certificate) {
this.certificate = certificate;
}
public Reader getReader() {
return reader;
}
public void setReader(Reader reader) {
this.reader = reader;
}
}
package fi.insomnia.bortal.model.salespoint;
public enum SalesEntityType {
CASHIER, CLIENT
}
package fi.insomnia.bortal.model.salespoint;
import fi.insomnia.bortal.model.GenericEntity_;
import fi.insomnia.bortal.model.Reader;
import javax.annotation.Generated;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@Generated(value="Dali", date="2012-04-08T02:57:31.378+0300")
@StaticMetamodel(SalesEntity.class)
public class SalesEntity_ extends GenericEntity_ {
public static volatile SingularAttribute<SalesEntity, String> certificate;
public static volatile SingularAttribute<SalesEntity, String> name;
public static volatile SingularAttribute<SalesEntity, SalesEntityType> type;
public static volatile SingularAttribute<SalesEntity, Salespoint> point;
public static volatile SingularAttribute<SalesEntity, String> secret;
public static volatile SingularAttribute<SalesEntity, Reader> reader;
}
package fi.insomnia.bortal.model.salespoint;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.eclipse.persistence.annotations.PrivateOwned;
import fi.insomnia.bortal.model.GenericEntity;
import fi.insomnia.bortal.model.LanEvent;
@Entity
@Table(name = "salespoint")
public class Salespoint extends GenericEntity {
private static final long serialVersionUID = -4659193907997736818L;
@ManyToOne
@JoinColumn(nullable = false, updatable = false)
private LanEvent event;
@Column(nullable = false)
private String name;
@Lob
private String description;
@OneToMany(mappedBy = "point", cascade = CascadeType.ALL)
@PrivateOwned
private List<SalesEntity> entities;
public LanEvent getEvent() {
return event;
}
public void setEvent(LanEvent event) {
this.event = event;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public List<SalesEntity> getEntities() {
return entities;
}
public void setEntities(List<SalesEntity> entities) {
this.entities = entities;
}
}
package fi.insomnia.bortal.model.salespoint;
import fi.insomnia.bortal.model.GenericEntity_;
import fi.insomnia.bortal.model.LanEvent;
import javax.annotation.Generated;
import javax.persistence.metamodel.ListAttribute;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
@Generated(value="Dali", date="2012-04-06T18:38:59.377+0300")
@StaticMetamodel(Salespoint.class)
public class Salespoint_ extends GenericEntity_ {
public static volatile SingularAttribute<Salespoint, LanEvent> event;
public static volatile SingularAttribute<Salespoint, String> name;
public static volatile SingularAttribute<Salespoint, String> description;
public static volatile ListAttribute<Salespoint, SalesEntity> entities;
}
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/Java SE 6 (MacOS X Default)">
<attributes>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish 3.1.2">
<attributes>
<attribute name="owner.project.facets" value="jst.web"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry kind="output" path="build/classes"/>
</classpath>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>LanBortalTerminalWeb</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
</natures>
</projectDescription>
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="WebContent"/>
<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
<attributes>
<attribute name="hide" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
<classpathentry kind="output" path=""/>
</classpath>
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.6
<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId" project-version="1.5.0">
<wb-module deploy-name="LanBortalTerminalWeb">
<wb-resource deploy-path="/" source-path="/WebContent" tag="defaultRootSource"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/>
<property name="context-root" value="LanBortalTerminalWeb"/>
<property name="java-output-path" value="/LanBortalTerminalWeb/build/classes"/>
</wb-module>
</project-modules>
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<runtime name="GlassFish 3.1.2"/>
<fixed facet="wst.jsdt.web"/>
<fixed facet="jst.web"/>
<fixed facet="java"/>
<installed facet="java" version="1.6"/>
<installed facet="jst.web" version="3.0"/>
<installed facet="sun.facet" version="9"/>
<installed facet="wst.jsdt.web" version="1.0"/>
</faceted-project>
org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<application>
<resource-bundle>
<base-name>fi.insomnia.bortal.terminal.resources.i18n</base-name>
<var>i18n</var>
</resource-bundle>
<message-bundle>fi.insomnia.bortal.terminal.resources.i18n</message-bundle>
<!-- Legal Country codes: http://www.iso.org/iso/country_codes/iso_3166_code_lists/english_country_names_and_code_elements.htm -->
<!-- Assigned Country codes: -->
<!-- Insomnia: IN (INDIA) -->
<!-- Stream: ST (SAO TOME AND PRINCIPE ) -->
<!-- Vector VE (VENEZUELA, BOLIVARIAN REPUBLIC OF) -->
<locale-config>
<default-locale>fi_FI</default-locale>
<supported-locale>fi_fi_XII</supported-locale>
<supported-locale>en_ST_v7</supported-locale>
</locale-config>
</application>
<factory>
<exception-handler-factory>fi.insomnia.bortal.terminal.exceptions.BortalTerminalExceptionHandlerFactory</exception-handler-factory>
</factory>
</faces-config>
<glassfish-web-app error-url="">
<!--
<security-role-mapping>
<role-name>allusers</role-name>
<group-name>allusers</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>terminal</role-name>
<group-name>terminal</group-name>
</security-role-mapping>
-->
</glassfish-web-app>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Servlet 2.5//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd">
<sun-web-app error-url="">
<context-root>/LanBortalTerminalWeb</context-root>
<class-loader delegate="true"/>
<jsp-config>
<property name="keepgenerated" value="true">
<description>Keep a copy of the generated servlet class java code.</description>
</property>
</jsp-config>
</sun-web-app>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>LanBortalTerminalWeb</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.wtf</welcome-file>
</welcome-file-list>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.wtf</url-pattern>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
<!--param-value>Production</param-value -->
</context-param>
<context-param>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<filter>
<display-name>PrimefacesFileupload</display-name>
<filter-name>PrimeFacesFileupload</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFacesFileupload</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>certificate</realm-name>
</login-config>
<security-constraint>
<display-name>Resource that needs cert auth</display-name>
<web-resource-collection>
<web-resource-name>BortalTerminalWebResource</web-resource-name>
<url-pattern>/faces/*</url-pattern>
<url-pattern>*.wtf</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>terminal</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<!--
<security-role>
<description>All authenticated users</description>
<role-name>allusers</role-name>
</security-role>
<security-role>
<description>Sales Terminal</description>
<role-name>terminal</role-name>
</security-role>
-->
<persistence-unit-ref>
<persistence-unit-ref-name>BortalEMF</persistence-unit-ref-name>
</persistence-unit-ref>
</web-app>
\ No newline at end of file
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title></title>
</h:head>
<h:body>
<h1>Hurrdurr</h1>
<p>abba #{request.contextPath} beef</p>
<p>foo #{testView5.getDummy()} baz</p>
</h:body>
</html>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:tools="http://java.sun.com/jsf/composite/cditools"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<f:view locale="fi_FI">
<ui:insert name="metadata" />
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title><h:outputText value="#{i18n['global.eventname']}" />
</title>
<link rel="stylesheet" type="text/css"
href="#{request.contextPath}/resources/style/insomnia1/style.css" />
</h:head>
<h:body>
<div id="wrapper">
<div id="content">
<div id="cwrap">
<h:messages globalOnly="true" />
<ui:insert name="content" />
</div>
</div>
<div id="footer">#{i18n['global.copyright']}</div>
</div>
</h:body>
</f:view>
</html>
\ No newline at end of file
package fi.insomnia.bortal.terminal.exceptions;
import java.util.Iterator;
import java.util.Map;
import javax.ejb.AccessLocalException;
import javax.ejb.EJBAccessException;
import javax.faces.FacesException;
import javax.faces.application.NavigationHandler;
import javax.faces.application.ViewExpiredException;
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerWrapper;
import javax.faces.context.FacesContext;
import javax.faces.event.ExceptionQueuedEvent;
import javax.faces.event.ExceptionQueuedEventContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.PermissionDeniedException;
public class BortalTerminalExceptionHandler extends ExceptionHandlerWrapper {
private static final Logger logger = LoggerFactory
.getLogger(BortalTerminalExceptionHandler.class);
private final ExceptionHandler wrapped;
public BortalTerminalExceptionHandler(ExceptionHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public ExceptionHandler getWrapped() {
return wrapped;
}
@Override
public void handle() throws FacesException {
Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents()
.iterator();
while (i.hasNext()) {
ExceptionQueuedEvent event = i.next();
ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event
.getSource();
Throwable t = context.getException();
logger.debug("Found exception! handing it: {}", t.getClass()
.toString());
if (t instanceof ViewExpiredException) {
errorpage(i, t, "viewExpired");
}
Throwable cause = t.getCause();
for (int loop = 0; loop < 20 && cause != null; ++loop) {
logger.debug(
"Cause not null, but {}: {}, checking"
+ cause.getClass(), cause.getMessage());
if (cause instanceof PermissionDeniedException
|| cause instanceof EJBAccessException
|| cause instanceof AccessLocalException) {
logger.debug("Found Permission Denied cause: {}, {}",
cause.getClass(), cause.getMessage());
// errorpage(i, t, "permissionDenied");
}
cause = cause.getCause();
}
}
// At this point, the queue will not contain any ViewExpiredEvents.
// Therefore, let the parent handle them.
getWrapped().handle();
}
private void errorpage(Iterator<ExceptionQueuedEvent> i, Throwable t,
String navigateTo) {
logger.info("navigating to {} because root exception: {}", navigateTo,
t.getClass());
ViewExpiredException vee = null;
if (t instanceof ViewExpiredException) {
vee = (ViewExpiredException) t;
}
FacesContext fc = FacesContext.getCurrentInstance();
Map<String, Object> requestMap = fc.getExternalContext()
.getRequestMap();
NavigationHandler nav = fc.getApplication().getNavigationHandler();
try {
// Push some useful stuff to the request scope for
// use in the page
if (vee != null) {
requestMap.put("currentViewId", vee.getViewId());
}
nav.handleNavigation(fc, null, navigateTo);
fc.renderResponse();
} finally {
i.remove();
}
}
}
package fi.insomnia.bortal.terminal.exceptions;
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerFactory;
public class BortalTerminalExceptionHandlerFactory extends ExceptionHandlerFactory {
private ExceptionHandlerFactory parent;
public BortalTerminalExceptionHandlerFactory(ExceptionHandlerFactory parent) {
this.parent = parent;
}
@Override
public ExceptionHandler getExceptionHandler() {
ExceptionHandler result = parent.getExceptionHandler();
result = new BortalTerminalExceptionHandler(result);
return result;
}
}
package fi.insomnia.bortal.terminal.handler;
import java.io.IOException;
import java.io.Serializable;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ConversationScoped
public class NavigationHandler implements Serializable {
private static final long serialVersionUID = -5985927646178070598L;
private static final Logger logger = LoggerFactory
.getLogger(NavigationHandler.class);
private String destNavi;
@Inject
private transient Conversation conversation;
public void saveDestination(String pageid) {
if (conversation.isTransient()) {
conversation.begin();
}
this.destNavi = pageid;
}
public void redirectToSaved() {
if (destNavi == null || destNavi.isEmpty()) {
HttpServletRequest req = (HttpServletRequest) FacesContext
.getCurrentInstance().getExternalContext().getRequest();
destNavi = req.getContextPath();
}
redirectNavigation(destNavi);
}
public void redirectNavigation(String destinationUrl) {
try {
FacesContext.getCurrentInstance().getExternalContext()
.redirect(destinationUrl);
} catch (IOException e) {
logger.warn("Redirect failed!", e);
}
}
public void forward(String navigation) {
FacesContext fcont = FacesContext.getCurrentInstance();
javax.faces.application.NavigationHandler navihand = fcont
.getApplication().getNavigationHandler();
navihand.handleNavigation(fcont, null, navigation);
}
}
package fi.insomnia.bortal.terminal.handler;
import java.util.TimeZone;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.beans.PermissionBeanLocal;
import fi.insomnia.bortal.beans.RoleBeanLocal;
import fi.insomnia.bortal.clientutils.BortalLocalContextHolder;
import fi.insomnia.bortal.enums.apps.IAppPermission;
import fi.insomnia.bortal.model.User;
@Named()
@RequestScoped
public class SessionHandler {
private static final Logger logger = LoggerFactory
.getLogger(SessionHandler.class);
@Inject
private HttpServletRequest httprequest;
@EJB
private RoleBeanLocal rolebean;
@EJB
private EventBeanLocal eventbean;
@EJB
private PermissionBeanLocal permbean;
public TimeZone getTimezone() {
return TimeZone.getTimeZone("Europe/Helsinki");
}
public String getLocale() {
// TODO: Locale selection code missing
// return "en_ST_v7";
//return "fi_IN_XIII";
return "fi_FI";
}
public String getLayout() {
// TODO: layout selection code missing!!
// return "stream1";
return "insomnia2";
}
public String getDateFormat() {
return "dd.MM.yyyy";
}
public String getDatetimeFormat() {
return "dd.MM.yyyy HH:mm";
}
public boolean hasPermission(IAppPermission permission) {
if (permission == null) {
logger.warn("permission is null");
throw new RuntimeException("Empty target or permission!");
}
boolean ret = permbean.hasPermission(permission);
return ret;
}
public boolean isLoggedIn() {
boolean ret = permbean.isLoggedIn();
return ret;
}
public boolean isSuperadmin() {
return permbean.getCurrentUser().isSuperadmin();
}
public User getCurrentUser() {
return permbean.getCurrentUser();
}
public String flushCache() {
return eventbean.flushCache();
}
private String preurlString = null;
public String getRequestPreUrl() {
if (preurlString == null) {
Object ext = FacesContext.getCurrentInstance().getExternalContext()
.getRequest();
if (ext instanceof HttpServletRequest) {
StringBuffer url = ((HttpServletRequest) ext).getRequestURL();
preurlString = url.substring(0, url.indexOf("/", 8));
} else {
preurlString = "";
}
}
return preurlString;
}
public boolean isInDevelopmentMode() {
return BortalLocalContextHolder.isInDevelopmentMode();
}
}
global.copyright=Copyright left right
\ No newline at end of file
package fi.insomnia.bortal.terminal.view;
import java.io.Serializable;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.PermissionBeanLocal;
@Named("testView5")
@RequestScoped
public class TestView implements Serializable {
private static final long serialVersionUID = -2872232867536069020L;
private static final Logger logger = LoggerFactory.getLogger(TestView.class);
@EJB
private PermissionBeanLocal permissionBean;
public String getPrincipal() {
logger.debug("PermissionBean: {}", permissionBean);
return permissionBean.getPrincipal();
}
public String getDummy() {
return "bar";
}
}
...@@ -9,7 +9,7 @@ package fi.insomnia.bortal.enums; ...@@ -9,7 +9,7 @@ package fi.insomnia.bortal.enums;
* *
* @author tuukka * @author tuukka
*/ */
public enum EventStatusEnum { public enum EventStatus {
INACTIVE, // Not yet public INACTIVE, // Not yet public
TICKET_SALES, // Site is public with ticket sales TICKET_SALES, // Site is public with ticket sales
PRE_EVENT, // Upcoming event... PRE_EVENT, // Upcoming event...
...@@ -18,11 +18,11 @@ public enum EventStatusEnum { ...@@ -18,11 +18,11 @@ public enum EventStatusEnum {
// cannot be modified. // cannot be modified.
ARCHIVED; // Past events are archived ARCHIVED; // Past events are archived
public static EventStatusEnum getEventStatusEnum(String name) { public static EventStatus getEventStatusEnum(String name) {
return EventStatusEnum.valueOf(name); return EventStatus.valueOf(name);
} }
public static EventStatusEnum getDefaultEventStatusEnum() { public static EventStatus getDefaultEventStatusEnum() {
return INACTIVE; return INACTIVE;
} }
} }
package fi.insomnia.bortal.enums;
@Deprecated
public enum OldRolePermission {
READ, WRITE, EXECUTE
}
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:users="http://java.sun.com/jsf/composite/tools/user" xmlns:tools="http://java.sun.com/jsf/composite/tools"
xmlns:account="http://java.sun.com/jsf/composite/tools/account" xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.account.edit" />
<ui:define name="content">
<tools:canWrite target="ACCOUNT_MANAGEMENT">
<h:form id="placeEdit">
<h:inputHidden value="#{accountView.account.id.id}" />
<h:panelGrid columns="2">
<h:outputLabel value="#{i18n['accountEvent.total']}:" />
<h:outputText value="#{accountView.account.total}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2" />
</h:outputText>
<h:outputLabel value="#{i18n['accountEvent.quantity']}:" />
<h:inputText value="#{accountView.account.quantity}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2" />
</h:inputText>
<h:outputLabel value="#{i18n['accountEvent.unitPrice']}:" />
<h:inputText value="#{accountView.account.unitPrice}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2" />
</h:inputText>
<h:outputLabel value="#{i18n['accountEvent.eventTime']}:" />
<h:inputText value="#{accountView.account.eventTime.time}">
<f:convertDateTime type="both" timeZone="#{sessionHandler.timezone}" />
</h:inputText>
<h:outputLabel value="#{i18n['accountEvent.delivered']}:" />
<h:inputText value="#{accountView.account.delivered.time}">
<f:convertDateTime type="both" timeZone="#{sessionHandler.timezone}" />
</h:inputText>
<h:outputLabel value="#{i18n['accountEvent.seller']}:" />
<h:outputText value="#{accountView.account.seller.wholeName}">
</h:outputText>
</h:panelGrid>
<h:commandButton rendered="#{sessionHandler.canWrite('ACCOUNT_MANAGEMENT')}" id="commitbtn"
action="#{accountView.merge()}" value="#{i18n['accountEvent.commit']}" />
<br />
<h:commandButton rendered="#{sessionHandler.canWrite('ACCOUNT_MANAGEMENT')}" id="deletebtn"
action="#{accountView.delete()}" value="#{i18n['accountEvent.delete']}" />
</h:form>
<h:dataTable border="0" id="discountlist" value="#{accountView.account.discountInstances}" var="discount">
<h:column>
<f:facet name="header">
<h:outputText value="${i18n['discount.percentage']}" />
</f:facet>
<h:outputText value="#{discount.discount.percentage}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="${i18n['discount.code']}" />
</f:facet>
<h:outputText value="#{discount.discount.code}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="${i18n['discount.details']}" />
</f:facet>
<h:outputText value="#{discount.discount.details}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="${i18n['discount.shortdesc']}" />
</f:facet>
<h:outputText value="#{discount.discount.shortdesc}" />
</h:column>
</h:dataTable>
</tools:canWrite>
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
<f:metadata> <f:metadata>
<f:event type="preRenderView" listener="#{authView.executeLogin}" /> <f:event type="preRenderView" listener="#{authView.executeLogin}" />
</f:metadata> </f:metadata>
<ui:param name="thispage" value="page.auth.login" />
<ui:define name="content"> <ui:define name="content">
<h1>#{i18n['login.login']}</h1> <h1>#{i18n['login.login']}</h1>
......
...@@ -9,7 +9,6 @@ xmlns:login="http://java.sun.com/jsf/composite/cditools/login" ...@@ -9,7 +9,6 @@ xmlns:login="http://java.sun.com/jsf/composite/cditools/login"
xmlns:c="http://java.sun.com/jsp/jstl/core"> xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.auth.loginerror" />
<ui:define name="content"> <ui:define name="content">
<h1>#{i18n['loginerror.header']}</h1> <h1>#{i18n['loginerror.header']}</h1>
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
<f:metadata> <f:metadata>
<f:event type="preRenderView" listener="#{authView.executeLogin}" /> <f:event type="preRenderView" listener="#{authView.executeLogin}" />
</f:metadata> </f:metadata>
<ui:param name="thispage" value="page.auth.login" />
<ui:define name="content"> <ui:define name="content">
<h1>#{i18n['login.login']}</h1> <h1>#{i18n['login.login']}</h1>
</ui:define> </ui:define>
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
> >
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.auth.logout" />
<f:metadata> <f:metadata>
<f:event type="preRenderView" listener="#{authView.executeLogout}" /> <f:event type="preRenderView" listener="#{authView.executeLogout}" />
</f:metadata> </f:metadata>
......
...@@ -14,7 +14,6 @@ xmlns:c="http://java.sun.com/jsp/jstl/core"> ...@@ -14,7 +14,6 @@ xmlns:c="http://java.sun.com/jsp/jstl/core">
</h:head> </h:head>
<h:body> <h:body>
<ui:composition template="/layout/${sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/${sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.auth.notauthorized" />
<ui:define name="content"> <ui:define name="content">
<h:outputText value="#{i18n['global.notauthorized'] }" /> <h:outputText value="#{i18n['global.notauthorized'] }" />
</ui:define> </ui:define>
......
...@@ -9,7 +9,6 @@ xmlns:login="http://java.sun.com/jsf/composite/tools/login" ...@@ -9,7 +9,6 @@ xmlns:login="http://java.sun.com/jsf/composite/tools/login"
xmlns:c="http://java.sun.com/jsp/jstl/core"> xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.auth.loginerror" />
<ui:define name="content"> <ui:define name="content">
<h1>#{i18n['passwordChanged.header']}</h1> <h1>#{i18n['passwordChanged.header']}</h1>
......
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
</h:head> </h:head>
<h:body> <h:body>
<ui:composition template="/layout/${sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/${sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.auth.resetPassword" />
<f:metadata> <f:metadata>
<f:viewParam name="id" value="#{pwdResetView.id}" /> <f:viewParam name="id" value="#{pwdResetView.id}" />
<f:viewParam name="hash" value="#{pwdResetView.hash}" /> <f:viewParam name="hash" value="#{pwdResetView.hash}" />
......
...@@ -9,7 +9,6 @@ xmlns:login="http://java.sun.com/jsf/composite/tools/login" ...@@ -9,7 +9,6 @@ xmlns:login="http://java.sun.com/jsf/composite/tools/login"
xmlns:c="http://java.sun.com/jsp/jstl/core"> xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.auth.loginerror" />
<ui:define name="content"> <ui:define name="content">
<h1>#{i18n['resetmailSent.header']}</h1> <h1>#{i18n['resetmailSent.header']}</h1>
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!