Commit ec9d6970 by unknown

Composivujen luontia

2 parents 90b66102 52a2f10c
Showing with 4475 additions and 1620 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: 3 (0x3)
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 24 12:57:23 2072 GMT
Subject: C=FI, ST=Tampere, O=Bortal, OU=Cashier, CN=cashier-01
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
00:a6:5b:2f:3a:11:4e:da:f5:28:05:8f:8c:0d:a6:
cc:75:b6:99:ba:90:17:30:e9:ff:8c:dd:24:55:dc:
71:10:99:8c:20:db:dc:37:8d:bc:05:eb:59:f1:73:
ff:4f:97:f0:e8:ec:c1:20:fc:bf:68:ff:42:d7:71:
25:89:ac:58:56:d4:43:6c:29:85:30:b0:e0:a8:08:
bf:04:03:39:36:0c:6a:c6:da:4d:3d:46:e5:5a:b3:
eb:96:af:66:53:f5:3a:fe:4f:54:39:70:37:aa:f1:
1c:75:91:0c:97:0f:4d:dc:e5:f2:60:90:c3:8a:18:
ce:17:a3:7b:34:8e:e1:fa:bf:ca:5b:c8:50:0a:6c:
21:46:ad:9e:64:98:76:3d:f1:74:bf:5b:8c:9a:0a:
6b:a7:6f:d7:40:16:e9:57:0e:ae:c0:54:20:c7:44:
d0:ec:3e:ca:8a:e3:74:41:bf:1a:da:9b:09:ef:02:
27:02:52:4f:c7:f5:27:4e:68:fd:66:d3:ca:ea:41:
bc:fe:b6:cb:f0:fa:0a:fa:36:af:a7:d6:de:d6:13:
15:e2:49:2f:af:71:57:52:ac:36:e1:b9:ed:d9:57:
0a:75:b7:09:65:82:95:88:be:ba:2e:d1:8b:22:7d:
f4:54:71:bb:21:d2:d1:7c:c0:5a:a2:5f:76:c3:fa:
6b:69
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client
Netscape Comment:
Client certificate
X509v3 Subject Key Identifier:
DE:21:83:D3:C7:59:43:70:27:F7:D5:8E:C1:FD:10:1F:53:1F:9C:73
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
a1:af:05:95:9b:e3:4c:6e:b9:ae:af:5a:8c:12:51:74:51:a7:
dd:ee:5e:ba:c7:3b:c6:9a:09:97:93:d0:44:d9:3e:5f:0b:be:
3a:f6:d5:2e:12:79:b1:41:07:ef:d0:53:53:89:62:13:90:87:
04:52:db:8c:07:b8:f1:39:bf:fb:ec:a9:80:d9:35:98:d5:b2:
57:c9:db:ca:23:0c:c2:1d:f4:bf:86:21:6d:3f:96:0f:11:b6:
c3:cc:56:fc:33:63:50:5b:1b:96:31:09:17:ef:bf:60:8b:a0:
c5:69:47:3f:00:a9:34:cc:ad:fd:9f:e4:fd:cb:1e:e9:e6:b5:
83:f4:f2:5f:a0:d3:71:95:c1:d3:27:4e:4d:bd:83:50:11:7d:
fb:f2:e9:a0:7a:00:32:a5:8b:32:8e:ce:01:92:b1:e1:60:02:
e7:7e:d1:00:7b:f1:e6:bd:db:94:45:9b:70:14:9c:ad:22:ff:
33:03:da:ca:d6:c3:ba:6b:01:7b:56:26:dc:9e:92:9f:d1:23:
ff:87:27:0d:3b:f9:27:c5:7e:f9:8a:81:c7:84:25:b6:ac:cf:
ca:4c:35:f8:f7:58:47:7c:e1:63:d0:e2:7c:35:34:85:6d:ad:
ae:b7:a7:0e:2c:ab:3a:17:0d:04:b1:c4:5c:b6:fe:4b:9b:06:
bd:ba:1c:f7
-----BEGIN CERTIFICATE-----
MIIDljCCAn6gAwIBAgIBAzANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyNDEyNTcyM1owVzELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDEQMA4GA1UECxMHQ2Fz
aGllcjETMBEGA1UEAxMKY2FzaGllci0wMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAKZbLzoRTtr1KAWPjA2mzHW2mbqQFzDp/4zdJFXccRCZjCDb3DeN
vAXrWfFz/0+X8OjswSD8v2j/QtdxJYmsWFbUQ2wphTCw4KgIvwQDOTYMasbaTT1G
5Vqz65avZlP1Ov5PVDlwN6rxHHWRDJcPTdzl8mCQw4oYzhejezSO4fq/ylvIUAps
IUatnmSYdj3xdL9bjJoKa6dv10AW6VcOrsBUIMdE0Ow+yorjdEG/GtqbCe8CJwJS
T8f1J05o/WbTyupBvP62y/D6Cvo2r6fW3tYTFeJJL69xV1KsNuG57dlXCnW3CWWC
lYi+ui7RiyJ99FRxuyHS0XzAWqJfdsP6a2kCAwEAAaOBhDCBgTAJBgNVHRMEAjAA
MBEGCWCGSAGG+EIBAQQEAwIHgDAhBglghkgBhvhCAQ0EFBYSQ2xpZW50IGNlcnRp
ZmljYXRlMB0GA1UdDgQWBBTeIYPTx1lDcCf31Y7B/RAfUx+cczAfBgNVHSMEGDAW
gBSkCioSB+zOEORMXrZ5gxg7FT9Q2zANBgkqhkiG9w0BAQUFAAOCAQEAoa8FlZvj
TG65rq9ajBJRdFGn3e5eusc7xpoJl5PQRNk+Xwu+OvbVLhJ5sUEH79BTU4liE5CH
BFLbjAe48Tm/++ypgNk1mNWyV8nbyiMMwh30v4YhbT+WDxG2w8xW/DNjUFsbljEJ
F++/YIugxWlHPwCpNMyt/Z/k/cse6ea1g/TyX6DTcZXB0ydOTb2DUBF9+/LpoHoA
MqWLMo7OAZKx4WAC537RAHvx5r3blEWbcBScrSL/MwPaytbDumsBe1Ym3J6Sn9Ej
/4cnDTv5J8V++YqBx4QltqzPykw1+PdYR3zhY9DifDU0hW2trrenDiyrOhcNBLHE
XLb+S5sGvboc9w==
-----END CERTIFICATE-----
No preview for this file type
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 4 (0x4)
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 24 12:57:23 2072 GMT
Subject: C=FI, ST=Tampere, O=Bortal, OU=Client, CN=client-01
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
00:d0:5e:6f:af:4d:a1:1b:f5:94:be:b3:22:d1:fc:
54:69:0e:70:12:eb:b8:76:6f:d4:30:40:ee:d3:0f:
6e:15:cd:e9:b5:93:40:6c:ab:f8:74:30:e0:a3:8f:
9b:f9:63:8f:76:bd:f7:20:43:39:7a:2f:c4:5e:6d:
62:f8:2d:bd:b3:b2:c2:66:78:0c:d0:5b:5c:c0:9f:
e5:7f:33:15:f6:b1:cf:0f:0b:6b:c0:d1:d9:15:37:
72:98:85:eb:57:45:1e:5f:7f:89:21:96:5a:b7:88:
58:70:2c:52:5f:bd:09:08:ea:03:68:40:00:57:2e:
a9:93:cc:87:20:15:4e:17:7b:fc:48:2c:3a:af:8d:
a3:4c:83:9c:32:8d:fe:86:a1:47:f2:c9:eb:11:2a:
0b:ba:7c:e1:77:bd:20:42:ea:c8:df:69:0a:e9:6c:
7e:15:61:01:06:fa:0d:07:02:d6:44:86:c3:63:ae:
2e:71:67:a4:72:f7:09:60:c5:a3:a7:06:86:ba:c8:
59:bc:ba:5b:0e:84:af:4b:b8:57:45:3b:af:7f:e9:
43:f7:38:d2:3c:74:2b:56:61:a6:6a:61:f1:a5:66:
6c:62:9d:3f:25:e0:8b:a7:e0:37:38:f3:97:e7:2c:
89:64:f6:6d:7e:3f:42:22:9f:ee:d4:e2:c8:6b:6d:
3a:e7
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client
Netscape Comment:
Client certificate
X509v3 Subject Key Identifier:
12:26:D6:C4:D4:E0:2A:39:9F:7F:65:E8:1C:12:46:2A:94:03:8A:7C
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
dc:2e:40:4e:a1:98:c3:02:d3:4e:61:c1:13:9a:50:10:3a:f2:
84:a9:d0:99:a3:f5:fb:02:3b:58:f0:87:f2:c7:b4:e7:3b:04:
1e:70:64:b5:e7:29:10:4b:37:d8:cc:eb:d2:b9:39:cd:ea:fa:
bf:a2:d8:6c:40:aa:82:ac:0d:15:61:50:72:8a:ab:2f:15:dd:
90:9a:27:20:f0:61:8d:60:41:cc:78:ca:c5:f6:f1:2e:98:a4:
47:f2:cc:45:9e:08:43:f9:14:1c:d8:16:10:1e:74:3c:1f:7a:
68:59:a1:4c:b1:fc:95:7f:5c:6a:6f:fd:59:7d:c2:b7:79:73:
8f:0f:54:b8:d6:ee:f9:9f:40:1d:bb:dc:66:2c:7b:2a:2d:82:
1a:24:49:45:48:ae:61:b9:c0:46:e9:b4:52:06:db:da:b5:99:
04:60:d9:59:d8:74:91:ea:f9:36:18:60:d5:3d:c5:15:2e:6f:
53:41:f9:3d:8f:ff:ae:cf:62:59:e7:3b:c2:a2:d9:d7:63:12:
33:59:9f:a7:9a:8d:62:b7:e3:01:48:75:ce:3c:f4:83:7a:00:
5a:b3:af:3e:2f:3d:16:f9:ab:01:fb:67:17:c6:49:a2:3b:5c:
ab:08:e6:7d:9d:7b:f6:90:2c:e0:c1:b4:e2:e4:6a:bd:06:57:
4a:42:f9:e7
-----BEGIN CERTIFICATE-----
MIIDlDCCAnygAwIBAgIBBDANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyNDEyNTcyM1owVTELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDEPMA0GA1UECxMGQ2xp
ZW50MRIwEAYDVQQDEwljbGllbnQtMDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQDQXm+vTaEb9ZS+syLR/FRpDnAS67h2b9QwQO7TD24Vzem1k0Bsq/h0
MOCjj5v5Y492vfcgQzl6L8RebWL4Lb2zssJmeAzQW1zAn+V/MxX2sc8PC2vA0dkV
N3KYhetXRR5ff4khllq3iFhwLFJfvQkI6gNoQABXLqmTzIcgFU4Xe/xILDqvjaNM
g5wyjf6GoUfyyesRKgu6fOF3vSBC6sjfaQrpbH4VYQEG+g0HAtZEhsNjri5xZ6Ry
9wlgxaOnBoa6yFm8ulsOhK9LuFdFO69/6UP3ONI8dCtWYaZqYfGlZmxinT8l4Iun
4Dc485fnLIlk9m1+P0Iin+7U4shrbTrnAgMBAAGjgYQwgYEwCQYDVR0TBAIwADAR
BglghkgBhvhCAQEEBAMCB4AwIQYJYIZIAYb4QgENBBQWEkNsaWVudCBjZXJ0aWZp
Y2F0ZTAdBgNVHQ4EFgQUEibWxNTgKjmff2XoHBJGKpQDinwwHwYDVR0jBBgwFoAU
pAoqEgfszhDkTF62eYMYOxU/UNswDQYJKoZIhvcNAQEFBQADggEBANwuQE6hmMMC
005hwROaUBA68oSp0Jmj9fsCO1jwh/LHtOc7BB5wZLXnKRBLN9jM69K5Oc3q+r+i
2GxAqoKsDRVhUHKKqy8V3ZCaJyDwYY1gQcx4ysX28S6YpEfyzEWeCEP5FBzYFhAe
dDwfemhZoUyx/JV/XGpv/Vl9wrd5c48PVLjW7vmfQB273GYseyotghokSUVIrmG5
wEbptFIG29q1mQRg2VnYdJHq+TYYYNU9xRUub1NB+T2P/67PYlnnO8Ki2ddjEjNZ
n6eajWK34wFIdc489IN6AFqzrz4vPRb5qwH7ZxfGSaI7XKsI5n2de/aQLODBtOLk
ar0GV0pC+ec=
-----END CERTIFICATE-----
No preview for this file type
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 6 (0x6)
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 24 16:14:45 2072 GMT
Subject: C=FI, ST=Tampere, O=Bortal, OU=Customer, CN=customer-01
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
00:db:cc:51:60:bc:f0:1c:a5:0e:86:a5:5d:85:90:
db:13:c2:92:cb:84:7f:10:13:06:ff:36:83:0d:5c:
50:21:0e:6d:c6:0b:60:5b:8f:bd:9c:cc:ec:b4:a8:
3b:f5:66:9f:e2:47:4f:b9:30:c5:08:76:86:7f:6b:
b2:ef:cb:28:a1:82:66:14:1a:00:12:3b:2c:72:b5:
bc:ca:c3:e7:a8:b9:a1:cf:2e:52:86:63:82:bd:12:
78:d3:bd:04:b3:2b:52:ac:ee:aa:50:17:6a:01:fc:
f9:4d:cc:2f:05:e4:42:ea:9f:7c:1b:b0:49:0f:62:
1e:4d:b6:1e:fa:e3:10:15:c0:a6:4d:96:11:fe:16:
81:c6:d1:e2:cb:12:be:93:1a:ce:f5:e3:76:1b:dd:
b6:89:f1:65:e4:ba:e3:50:6b:79:0f:29:01:5b:b8:
e8:1f:ef:c0:d9:24:d1:d8:9b:20:32:2f:d0:35:7b:
74:14:ef:3a:1e:4e:3c:5c:6c:4e:7d:63:f3:71:d3:
ca:4a:ab:33:48:bd:b0:c3:b3:66:ec:19:93:c7:2c:
3e:83:45:6d:aa:63:62:48:2b:bc:27:b3:c0:d4:c8:
46:ce:05:46:0e:93:f7:d8:ee:1a:e1:7e:29:8b:8d:
60:80:57:2c:61:29:dd:02:cc:5f:68:77:b1:6c:d4:
05:19
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client
Netscape Comment:
Client certificate
X509v3 Subject Key Identifier:
BA:E4:50:FE:A8:48:8F:70:CF:00:7C:C2:7A:73:31:FC:B8:0D:C9:C2
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
38:2b:bb:d3:4d:aa:95:5e:f8:7b:a5:05:da:af:f4:25:e2:7f:
be:83:fd:75:5f:2e:09:16:29:f8:77:7c:4b:f8:0e:fb:99:db:
62:5d:c1:51:20:65:c5:8f:f1:31:5d:91:d4:af:5e:7c:94:e1:
eb:c9:ee:5e:a5:a5:74:46:de:8b:1d:65:38:86:fe:eb:54:85:
ab:82:92:b0:72:81:6c:de:41:bd:90:53:ce:25:93:0b:42:da:
a1:d4:03:69:4f:59:ef:c9:de:d1:ac:0d:31:1c:fb:84:6b:cf:
b1:f8:39:8e:f0:aa:d8:77:1a:bb:61:e9:2a:c8:96:b8:e0:f3:
19:b4:73:7e:33:51:79:41:d6:0a:29:e3:e9:12:85:8f:7c:21:
a6:a9:12:e7:cf:46:ba:38:5b:22:2f:8c:af:01:92:df:67:6f:
7a:d2:77:13:86:84:d8:43:4d:bf:60:c6:14:e1:12:81:ad:ac:
81:b6:eb:60:58:c3:d4:d9:c2:bc:47:b5:16:7e:1f:3b:aa:42:
75:8f:30:2d:f0:f7:24:6f:59:b5:d8:57:6b:27:0d:b5:60:af:
42:8c:ad:82:f6:f4:ae:72:36:53:e8:ae:f3:74:de:65:53:a6:
02:e4:26:65:c5:aa:b1:55:06:c8:6c:39:fb:82:f4:ea:bf:8a:
91:46:7c:6a
-----BEGIN CERTIFICATE-----
MIIDmDCCAoCgAwIBAgIBBjANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyNDE2MTQ0NVowWTELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDERMA8GA1UECxMIQ3Vz
dG9tZXIxFDASBgNVBAMTC2N1c3RvbWVyLTAxMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEA28xRYLzwHKUOhqVdhZDbE8KSy4R/EBMG/zaDDVxQIQ5txgtg
W4+9nMzstKg79Waf4kdPuTDFCHaGf2uy78sooYJmFBoAEjsscrW8ysPnqLmhzy5S
hmOCvRJ4070EsytSrO6qUBdqAfz5TcwvBeRC6p98G7BJD2IeTbYe+uMQFcCmTZYR
/haBxtHiyxK+kxrO9eN2G922ifFl5LrjUGt5DykBW7joH+/A2STR2JsgMi/QNXt0
FO86Hk48XGxOfWPzcdPKSqszSL2ww7Nm7BmTxyw+g0VtqmNiSCu8J7PA1MhGzgVG
DpP32O4a4X4pi41ggFcsYSndAsxfaHexbNQFGQIDAQABo4GEMIGBMAkGA1UdEwQC
MAAwEQYJYIZIAYb4QgEBBAQDAgeAMCEGCWCGSAGG+EIBDQQUFhJDbGllbnQgY2Vy
dGlmaWNhdGUwHQYDVR0OBBYEFLrkUP6oSI9wzwB8wnpzMfy4DcnCMB8GA1UdIwQY
MBaAFKQKKhIH7M4Q5ExetnmDGDsVP1DbMA0GCSqGSIb3DQEBBQUAA4IBAQA4K7vT
TaqVXvh7pQXar/Ql4n++g/11Xy4JFin4d3xL+A77mdtiXcFRIGXFj/ExXZHUr158
lOHrye5epaV0Rt6LHWU4hv7rVIWrgpKwcoFs3kG9kFPOJZMLQtqh1ANpT1nvyd7R
rA0xHPuEa8+x+DmO8KrYdxq7YekqyJa44PMZtHN+M1F5QdYKKePpEoWPfCGmqRLn
z0a6OFsiL4yvAZLfZ2960ncThoTYQ02/YMYU4RKBrayBtutgWMPU2cK8R7UWfh87
qkJ1jzAt8Pckb1m12FdrJw21YK9CjK2C9vSucjZT6K7zdN5lU6YC5CZlxaqxVQbI
bDn7gvTqv4qRRnxq
-----END CERTIFICATE-----
No preview for this file type
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 5 (0x5)
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 24 12:57:23 2072 GMT
Subject: C=FI, ST=Tampere, O=Bortal, OU=Selfhelp, CN=selfhelp-01
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
00:e3:af:df:11:71:2b:f6:57:24:52:ca:36:48:9c:
e9:e2:af:07:f8:cd:18:c9:00:56:b3:63:94:e8:73:
41:3d:e6:0e:01:53:80:5d:00:79:57:83:ee:a8:d6:
5d:f1:28:59:bd:e3:97:7b:90:e1:08:86:95:b4:44:
ee:2c:e9:ae:25:d0:d2:ed:ae:93:d8:73:c3:4b:9e:
2e:a6:51:35:cb:6c:e6:97:97:b7:47:93:6f:1d:e8:
07:98:f8:d4:0b:ce:9c:94:4e:d6:f4:0b:57:2e:c0:
d7:fb:a4:b4:d7:2b:b4:36:26:84:64:6d:f7:1e:f3:
31:d6:cd:46:43:28:55:1c:72:3a:dd:6e:98:9a:9f:
9f:13:78:a6:30:be:62:a0:9e:de:6d:0a:83:da:de:
3a:45:c3:59:14:7f:71:b0:05:67:c3:19:05:3c:28:
91:74:2a:9f:ef:af:a6:f5:4a:44:d2:d1:70:e1:60:
ba:f2:aa:03:97:63:52:7c:30:4d:67:54:80:7e:96:
65:dc:17:74:c3:b0:a4:a5:16:53:75:25:77:a2:f7:
17:9d:bc:ae:76:bb:00:46:a1:fc:39:32:43:df:3d:
08:46:28:3f:a2:59:5e:15:cf:cf:45:39:6a:5b:2e:
6c:b0:84:19:45:ab:ab:30:12:fc:97:ac:bf:18:1c:
d3:93
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client
Netscape Comment:
Client certificate
X509v3 Subject Key Identifier:
D4:4D:A3:2D:8F:B8:93:DD:13:3C:EF:C0:7E:02:19:91:B1:58:9A:B6
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
b2:dc:ce:b6:01:6a:e9:4e:bc:bc:a4:ee:34:f8:e4:07:73:be:
d4:ca:8d:1d:97:67:5d:a4:ae:26:eb:96:80:be:0a:d4:39:8c:
3c:16:e5:0b:d6:fb:a4:97:0a:40:04:cb:d2:c8:97:73:fa:fd:
bc:5b:33:72:0a:c4:7d:8d:b6:1f:b4:5e:95:ec:71:b6:05:8d:
45:47:7d:89:a8:ec:8c:b8:99:d9:00:48:11:df:74:8a:a2:ce:
7f:d5:10:1a:37:06:4e:0c:7d:c8:4a:29:c4:7b:45:97:c8:5e:
dc:a8:8b:9a:58:89:5d:eb:73:f1:6f:e3:51:0a:af:ea:61:9f:
cc:c7:8a:22:b1:23:3c:b8:c3:f5:7f:54:de:46:41:92:0a:a0:
b9:d5:65:f0:0e:6c:1c:ec:b0:7c:e4:7a:b9:da:b4:23:2d:6c:
36:66:65:16:d3:30:54:cb:c4:02:1e:14:b4:13:8d:f7:02:1e:
aa:44:87:a3:17:36:6b:8b:50:03:95:e4:f0:38:b1:b6:1d:86:
a1:84:47:7a:eb:43:2d:cf:e5:67:1b:fd:a0:5e:67:9f:a2:a0:
5d:51:3b:22:01:f1:91:3c:b3:8a:ed:ba:de:57:61:82:31:ce:
ea:c1:09:ea:6f:c7:c0:04:c9:8f:3c:3e:d8:2d:8a:ab:6e:ca:
d9:e3:0d:30
-----BEGIN CERTIFICATE-----
MIIDmDCCAoCgAwIBAgIBBTANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyNDEyNTcyM1owWTELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDERMA8GA1UECxMIU2Vs
ZmhlbHAxFDASBgNVBAMTC3NlbGZoZWxwLTAxMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEA46/fEXEr9lckUso2SJzp4q8H+M0YyQBWs2OU6HNBPeYOAVOA
XQB5V4PuqNZd8ShZveOXe5DhCIaVtETuLOmuJdDS7a6T2HPDS54uplE1y2zml5e3
R5NvHegHmPjUC86clE7W9AtXLsDX+6S01yu0NiaEZG33HvMx1s1GQyhVHHI63W6Y
mp+fE3imML5ioJ7ebQqD2t46RcNZFH9xsAVnwxkFPCiRdCqf76+m9UpE0tFw4WC6
8qoDl2NSfDBNZ1SAfpZl3Bd0w7CkpRZTdSV3ovcXnbyudrsARqH8OTJD3z0IRig/
olleFc/PRTlqWy5ssIQZRaurMBL8l6y/GBzTkwIDAQABo4GEMIGBMAkGA1UdEwQC
MAAwEQYJYIZIAYb4QgEBBAQDAgeAMCEGCWCGSAGG+EIBDQQUFhJDbGllbnQgY2Vy
dGlmaWNhdGUwHQYDVR0OBBYEFNRNoy2PuJPdEzzvwH4CGZGxWJq2MB8GA1UdIwQY
MBaAFKQKKhIH7M4Q5ExetnmDGDsVP1DbMA0GCSqGSIb3DQEBBQUAA4IBAQCy3M62
AWrpTry8pO40+OQHc77Uyo0dl2ddpK4m65aAvgrUOYw8FuUL1vuklwpABMvSyJdz
+v28WzNyCsR9jbYftF6V7HG2BY1FR32JqOyMuJnZAEgR33SKos5/1RAaNwZODH3I
SinEe0WXyF7cqIuaWIld63Pxb+NRCq/qYZ/Mx4oisSM8uMP1f1TeRkGSCqC51WXw
Dmwc7LB85Hq52rQjLWw2ZmUW0zBUy8QCHhS0E433Ah6qRIejFzZri1ADleTwOLG2
HYahhEd660Mtz+VnG/2gXmefoqBdUTsiAfGRPLOK7breV2GCMc7qwQnqb8fABMmP
PD7YLYqrbsrZ4w0w
-----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
V 20720324125723Z 03 unknown /C=FI/ST=Tampere/O=Bortal/OU=Cashier/CN=cashier-01
V 20720324125723Z 04 unknown /C=FI/ST=Tampere/O=Bortal/OU=Client/CN=client-01
V 20720324125723Z 05 unknown /C=FI/ST=Tampere/O=Bortal/OU=Selfhelp/CN=selfhelp-01
V 20720324161445Z 06 unknown /C=FI/ST=Tampere/O=Bortal/OU=Customer/CN=customer-01
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
V 20720323165551Z 02 unknown /C=FI/ST=Tampere/O=Bortal/CN=terminal
V 20720324125723Z 03 unknown /C=FI/ST=Tampere/O=Bortal/OU=Cashier/CN=cashier-01
V 20720324125723Z 04 unknown /C=FI/ST=Tampere/O=Bortal/OU=Client/CN=client-01
V 20720324125723Z 05 unknown /C=FI/ST=Tampere/O=Bortal/OU=Selfhelp/CN=selfhelp-01
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-----
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 3 (0x3)
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 24 12:57:23 2072 GMT
Subject: C=FI, ST=Tampere, O=Bortal, OU=Cashier, CN=cashier-01
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
00:a6:5b:2f:3a:11:4e:da:f5:28:05:8f:8c:0d:a6:
cc:75:b6:99:ba:90:17:30:e9:ff:8c:dd:24:55:dc:
71:10:99:8c:20:db:dc:37:8d:bc:05:eb:59:f1:73:
ff:4f:97:f0:e8:ec:c1:20:fc:bf:68:ff:42:d7:71:
25:89:ac:58:56:d4:43:6c:29:85:30:b0:e0:a8:08:
bf:04:03:39:36:0c:6a:c6:da:4d:3d:46:e5:5a:b3:
eb:96:af:66:53:f5:3a:fe:4f:54:39:70:37:aa:f1:
1c:75:91:0c:97:0f:4d:dc:e5:f2:60:90:c3:8a:18:
ce:17:a3:7b:34:8e:e1:fa:bf:ca:5b:c8:50:0a:6c:
21:46:ad:9e:64:98:76:3d:f1:74:bf:5b:8c:9a:0a:
6b:a7:6f:d7:40:16:e9:57:0e:ae:c0:54:20:c7:44:
d0:ec:3e:ca:8a:e3:74:41:bf:1a:da:9b:09:ef:02:
27:02:52:4f:c7:f5:27:4e:68:fd:66:d3:ca:ea:41:
bc:fe:b6:cb:f0:fa:0a:fa:36:af:a7:d6:de:d6:13:
15:e2:49:2f:af:71:57:52:ac:36:e1:b9:ed:d9:57:
0a:75:b7:09:65:82:95:88:be:ba:2e:d1:8b:22:7d:
f4:54:71:bb:21:d2:d1:7c:c0:5a:a2:5f:76:c3:fa:
6b:69
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client
Netscape Comment:
Client certificate
X509v3 Subject Key Identifier:
DE:21:83:D3:C7:59:43:70:27:F7:D5:8E:C1:FD:10:1F:53:1F:9C:73
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
a1:af:05:95:9b:e3:4c:6e:b9:ae:af:5a:8c:12:51:74:51:a7:
dd:ee:5e:ba:c7:3b:c6:9a:09:97:93:d0:44:d9:3e:5f:0b:be:
3a:f6:d5:2e:12:79:b1:41:07:ef:d0:53:53:89:62:13:90:87:
04:52:db:8c:07:b8:f1:39:bf:fb:ec:a9:80:d9:35:98:d5:b2:
57:c9:db:ca:23:0c:c2:1d:f4:bf:86:21:6d:3f:96:0f:11:b6:
c3:cc:56:fc:33:63:50:5b:1b:96:31:09:17:ef:bf:60:8b:a0:
c5:69:47:3f:00:a9:34:cc:ad:fd:9f:e4:fd:cb:1e:e9:e6:b5:
83:f4:f2:5f:a0:d3:71:95:c1:d3:27:4e:4d:bd:83:50:11:7d:
fb:f2:e9:a0:7a:00:32:a5:8b:32:8e:ce:01:92:b1:e1:60:02:
e7:7e:d1:00:7b:f1:e6:bd:db:94:45:9b:70:14:9c:ad:22:ff:
33:03:da:ca:d6:c3:ba:6b:01:7b:56:26:dc:9e:92:9f:d1:23:
ff:87:27:0d:3b:f9:27:c5:7e:f9:8a:81:c7:84:25:b6:ac:cf:
ca:4c:35:f8:f7:58:47:7c:e1:63:d0:e2:7c:35:34:85:6d:ad:
ae:b7:a7:0e:2c:ab:3a:17:0d:04:b1:c4:5c:b6:fe:4b:9b:06:
bd:ba:1c:f7
-----BEGIN CERTIFICATE-----
MIIDljCCAn6gAwIBAgIBAzANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyNDEyNTcyM1owVzELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDEQMA4GA1UECxMHQ2Fz
aGllcjETMBEGA1UEAxMKY2FzaGllci0wMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAKZbLzoRTtr1KAWPjA2mzHW2mbqQFzDp/4zdJFXccRCZjCDb3DeN
vAXrWfFz/0+X8OjswSD8v2j/QtdxJYmsWFbUQ2wphTCw4KgIvwQDOTYMasbaTT1G
5Vqz65avZlP1Ov5PVDlwN6rxHHWRDJcPTdzl8mCQw4oYzhejezSO4fq/ylvIUAps
IUatnmSYdj3xdL9bjJoKa6dv10AW6VcOrsBUIMdE0Ow+yorjdEG/GtqbCe8CJwJS
T8f1J05o/WbTyupBvP62y/D6Cvo2r6fW3tYTFeJJL69xV1KsNuG57dlXCnW3CWWC
lYi+ui7RiyJ99FRxuyHS0XzAWqJfdsP6a2kCAwEAAaOBhDCBgTAJBgNVHRMEAjAA
MBEGCWCGSAGG+EIBAQQEAwIHgDAhBglghkgBhvhCAQ0EFBYSQ2xpZW50IGNlcnRp
ZmljYXRlMB0GA1UdDgQWBBTeIYPTx1lDcCf31Y7B/RAfUx+cczAfBgNVHSMEGDAW
gBSkCioSB+zOEORMXrZ5gxg7FT9Q2zANBgkqhkiG9w0BAQUFAAOCAQEAoa8FlZvj
TG65rq9ajBJRdFGn3e5eusc7xpoJl5PQRNk+Xwu+OvbVLhJ5sUEH79BTU4liE5CH
BFLbjAe48Tm/++ypgNk1mNWyV8nbyiMMwh30v4YhbT+WDxG2w8xW/DNjUFsbljEJ
F++/YIugxWlHPwCpNMyt/Z/k/cse6ea1g/TyX6DTcZXB0ydOTb2DUBF9+/LpoHoA
MqWLMo7OAZKx4WAC537RAHvx5r3blEWbcBScrSL/MwPaytbDumsBe1Ym3J6Sn9Ej
/4cnDTv5J8V++YqBx4QltqzPykw1+PdYR3zhY9DifDU0hW2trrenDiyrOhcNBLHE
XLb+S5sGvboc9w==
-----END CERTIFICATE-----
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 4 (0x4)
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 24 12:57:23 2072 GMT
Subject: C=FI, ST=Tampere, O=Bortal, OU=Client, CN=client-01
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
00:d0:5e:6f:af:4d:a1:1b:f5:94:be:b3:22:d1:fc:
54:69:0e:70:12:eb:b8:76:6f:d4:30:40:ee:d3:0f:
6e:15:cd:e9:b5:93:40:6c:ab:f8:74:30:e0:a3:8f:
9b:f9:63:8f:76:bd:f7:20:43:39:7a:2f:c4:5e:6d:
62:f8:2d:bd:b3:b2:c2:66:78:0c:d0:5b:5c:c0:9f:
e5:7f:33:15:f6:b1:cf:0f:0b:6b:c0:d1:d9:15:37:
72:98:85:eb:57:45:1e:5f:7f:89:21:96:5a:b7:88:
58:70:2c:52:5f:bd:09:08:ea:03:68:40:00:57:2e:
a9:93:cc:87:20:15:4e:17:7b:fc:48:2c:3a:af:8d:
a3:4c:83:9c:32:8d:fe:86:a1:47:f2:c9:eb:11:2a:
0b:ba:7c:e1:77:bd:20:42:ea:c8:df:69:0a:e9:6c:
7e:15:61:01:06:fa:0d:07:02:d6:44:86:c3:63:ae:
2e:71:67:a4:72:f7:09:60:c5:a3:a7:06:86:ba:c8:
59:bc:ba:5b:0e:84:af:4b:b8:57:45:3b:af:7f:e9:
43:f7:38:d2:3c:74:2b:56:61:a6:6a:61:f1:a5:66:
6c:62:9d:3f:25:e0:8b:a7:e0:37:38:f3:97:e7:2c:
89:64:f6:6d:7e:3f:42:22:9f:ee:d4:e2:c8:6b:6d:
3a:e7
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client
Netscape Comment:
Client certificate
X509v3 Subject Key Identifier:
12:26:D6:C4:D4:E0:2A:39:9F:7F:65:E8:1C:12:46:2A:94:03:8A:7C
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
dc:2e:40:4e:a1:98:c3:02:d3:4e:61:c1:13:9a:50:10:3a:f2:
84:a9:d0:99:a3:f5:fb:02:3b:58:f0:87:f2:c7:b4:e7:3b:04:
1e:70:64:b5:e7:29:10:4b:37:d8:cc:eb:d2:b9:39:cd:ea:fa:
bf:a2:d8:6c:40:aa:82:ac:0d:15:61:50:72:8a:ab:2f:15:dd:
90:9a:27:20:f0:61:8d:60:41:cc:78:ca:c5:f6:f1:2e:98:a4:
47:f2:cc:45:9e:08:43:f9:14:1c:d8:16:10:1e:74:3c:1f:7a:
68:59:a1:4c:b1:fc:95:7f:5c:6a:6f:fd:59:7d:c2:b7:79:73:
8f:0f:54:b8:d6:ee:f9:9f:40:1d:bb:dc:66:2c:7b:2a:2d:82:
1a:24:49:45:48:ae:61:b9:c0:46:e9:b4:52:06:db:da:b5:99:
04:60:d9:59:d8:74:91:ea:f9:36:18:60:d5:3d:c5:15:2e:6f:
53:41:f9:3d:8f:ff:ae:cf:62:59:e7:3b:c2:a2:d9:d7:63:12:
33:59:9f:a7:9a:8d:62:b7:e3:01:48:75:ce:3c:f4:83:7a:00:
5a:b3:af:3e:2f:3d:16:f9:ab:01:fb:67:17:c6:49:a2:3b:5c:
ab:08:e6:7d:9d:7b:f6:90:2c:e0:c1:b4:e2:e4:6a:bd:06:57:
4a:42:f9:e7
-----BEGIN CERTIFICATE-----
MIIDlDCCAnygAwIBAgIBBDANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyNDEyNTcyM1owVTELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDEPMA0GA1UECxMGQ2xp
ZW50MRIwEAYDVQQDEwljbGllbnQtMDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQDQXm+vTaEb9ZS+syLR/FRpDnAS67h2b9QwQO7TD24Vzem1k0Bsq/h0
MOCjj5v5Y492vfcgQzl6L8RebWL4Lb2zssJmeAzQW1zAn+V/MxX2sc8PC2vA0dkV
N3KYhetXRR5ff4khllq3iFhwLFJfvQkI6gNoQABXLqmTzIcgFU4Xe/xILDqvjaNM
g5wyjf6GoUfyyesRKgu6fOF3vSBC6sjfaQrpbH4VYQEG+g0HAtZEhsNjri5xZ6Ry
9wlgxaOnBoa6yFm8ulsOhK9LuFdFO69/6UP3ONI8dCtWYaZqYfGlZmxinT8l4Iun
4Dc485fnLIlk9m1+P0Iin+7U4shrbTrnAgMBAAGjgYQwgYEwCQYDVR0TBAIwADAR
BglghkgBhvhCAQEEBAMCB4AwIQYJYIZIAYb4QgENBBQWEkNsaWVudCBjZXJ0aWZp
Y2F0ZTAdBgNVHQ4EFgQUEibWxNTgKjmff2XoHBJGKpQDinwwHwYDVR0jBBgwFoAU
pAoqEgfszhDkTF62eYMYOxU/UNswDQYJKoZIhvcNAQEFBQADggEBANwuQE6hmMMC
005hwROaUBA68oSp0Jmj9fsCO1jwh/LHtOc7BB5wZLXnKRBLN9jM69K5Oc3q+r+i
2GxAqoKsDRVhUHKKqy8V3ZCaJyDwYY1gQcx4ysX28S6YpEfyzEWeCEP5FBzYFhAe
dDwfemhZoUyx/JV/XGpv/Vl9wrd5c48PVLjW7vmfQB273GYseyotghokSUVIrmG5
wEbptFIG29q1mQRg2VnYdJHq+TYYYNU9xRUub1NB+T2P/67PYlnnO8Ki2ddjEjNZ
n6eajWK34wFIdc489IN6AFqzrz4vPRb5qwH7ZxfGSaI7XKsI5n2de/aQLODBtOLk
ar0GV0pC+ec=
-----END CERTIFICATE-----
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 5 (0x5)
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 24 12:57:23 2072 GMT
Subject: C=FI, ST=Tampere, O=Bortal, OU=Selfhelp, CN=selfhelp-01
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
00:e3:af:df:11:71:2b:f6:57:24:52:ca:36:48:9c:
e9:e2:af:07:f8:cd:18:c9:00:56:b3:63:94:e8:73:
41:3d:e6:0e:01:53:80:5d:00:79:57:83:ee:a8:d6:
5d:f1:28:59:bd:e3:97:7b:90:e1:08:86:95:b4:44:
ee:2c:e9:ae:25:d0:d2:ed:ae:93:d8:73:c3:4b:9e:
2e:a6:51:35:cb:6c:e6:97:97:b7:47:93:6f:1d:e8:
07:98:f8:d4:0b:ce:9c:94:4e:d6:f4:0b:57:2e:c0:
d7:fb:a4:b4:d7:2b:b4:36:26:84:64:6d:f7:1e:f3:
31:d6:cd:46:43:28:55:1c:72:3a:dd:6e:98:9a:9f:
9f:13:78:a6:30:be:62:a0:9e:de:6d:0a:83:da:de:
3a:45:c3:59:14:7f:71:b0:05:67:c3:19:05:3c:28:
91:74:2a:9f:ef:af:a6:f5:4a:44:d2:d1:70:e1:60:
ba:f2:aa:03:97:63:52:7c:30:4d:67:54:80:7e:96:
65:dc:17:74:c3:b0:a4:a5:16:53:75:25:77:a2:f7:
17:9d:bc:ae:76:bb:00:46:a1:fc:39:32:43:df:3d:
08:46:28:3f:a2:59:5e:15:cf:cf:45:39:6a:5b:2e:
6c:b0:84:19:45:ab:ab:30:12:fc:97:ac:bf:18:1c:
d3:93
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client
Netscape Comment:
Client certificate
X509v3 Subject Key Identifier:
D4:4D:A3:2D:8F:B8:93:DD:13:3C:EF:C0:7E:02:19:91:B1:58:9A:B6
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
b2:dc:ce:b6:01:6a:e9:4e:bc:bc:a4:ee:34:f8:e4:07:73:be:
d4:ca:8d:1d:97:67:5d:a4:ae:26:eb:96:80:be:0a:d4:39:8c:
3c:16:e5:0b:d6:fb:a4:97:0a:40:04:cb:d2:c8:97:73:fa:fd:
bc:5b:33:72:0a:c4:7d:8d:b6:1f:b4:5e:95:ec:71:b6:05:8d:
45:47:7d:89:a8:ec:8c:b8:99:d9:00:48:11:df:74:8a:a2:ce:
7f:d5:10:1a:37:06:4e:0c:7d:c8:4a:29:c4:7b:45:97:c8:5e:
dc:a8:8b:9a:58:89:5d:eb:73:f1:6f:e3:51:0a:af:ea:61:9f:
cc:c7:8a:22:b1:23:3c:b8:c3:f5:7f:54:de:46:41:92:0a:a0:
b9:d5:65:f0:0e:6c:1c:ec:b0:7c:e4:7a:b9:da:b4:23:2d:6c:
36:66:65:16:d3:30:54:cb:c4:02:1e:14:b4:13:8d:f7:02:1e:
aa:44:87:a3:17:36:6b:8b:50:03:95:e4:f0:38:b1:b6:1d:86:
a1:84:47:7a:eb:43:2d:cf:e5:67:1b:fd:a0:5e:67:9f:a2:a0:
5d:51:3b:22:01:f1:91:3c:b3:8a:ed:ba:de:57:61:82:31:ce:
ea:c1:09:ea:6f:c7:c0:04:c9:8f:3c:3e:d8:2d:8a:ab:6e:ca:
d9:e3:0d:30
-----BEGIN CERTIFICATE-----
MIIDmDCCAoCgAwIBAgIBBTANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyNDEyNTcyM1owWTELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDERMA8GA1UECxMIU2Vs
ZmhlbHAxFDASBgNVBAMTC3NlbGZoZWxwLTAxMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEA46/fEXEr9lckUso2SJzp4q8H+M0YyQBWs2OU6HNBPeYOAVOA
XQB5V4PuqNZd8ShZveOXe5DhCIaVtETuLOmuJdDS7a6T2HPDS54uplE1y2zml5e3
R5NvHegHmPjUC86clE7W9AtXLsDX+6S01yu0NiaEZG33HvMx1s1GQyhVHHI63W6Y
mp+fE3imML5ioJ7ebQqD2t46RcNZFH9xsAVnwxkFPCiRdCqf76+m9UpE0tFw4WC6
8qoDl2NSfDBNZ1SAfpZl3Bd0w7CkpRZTdSV3ovcXnbyudrsARqH8OTJD3z0IRig/
olleFc/PRTlqWy5ssIQZRaurMBL8l6y/GBzTkwIDAQABo4GEMIGBMAkGA1UdEwQC
MAAwEQYJYIZIAYb4QgEBBAQDAgeAMCEGCWCGSAGG+EIBDQQUFhJDbGllbnQgY2Vy
dGlmaWNhdGUwHQYDVR0OBBYEFNRNoy2PuJPdEzzvwH4CGZGxWJq2MB8GA1UdIwQY
MBaAFKQKKhIH7M4Q5ExetnmDGDsVP1DbMA0GCSqGSIb3DQEBBQUAA4IBAQCy3M62
AWrpTry8pO40+OQHc77Uyo0dl2ddpK4m65aAvgrUOYw8FuUL1vuklwpABMvSyJdz
+v28WzNyCsR9jbYftF6V7HG2BY1FR32JqOyMuJnZAEgR33SKos5/1RAaNwZODH3I
SinEe0WXyF7cqIuaWIld63Pxb+NRCq/qYZ/Mx4oisSM8uMP1f1TeRkGSCqC51WXw
Dmwc7LB85Hq52rQjLWw2ZmUW0zBUy8QCHhS0E433Ah6qRIejFzZri1ADleTwOLG2
HYahhEd660Mtz+VnG/2gXmefoqBdUTsiAfGRPLOK7breV2GCMc7qwQnqb8fABMmP
PD7YLYqrbsrZ4w0w
-----END CERTIFICATE-----
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 6 (0x6)
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 24 16:14:45 2072 GMT
Subject: C=FI, ST=Tampere, O=Bortal, OU=Customer, CN=customer-01
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
00:db:cc:51:60:bc:f0:1c:a5:0e:86:a5:5d:85:90:
db:13:c2:92:cb:84:7f:10:13:06:ff:36:83:0d:5c:
50:21:0e:6d:c6:0b:60:5b:8f:bd:9c:cc:ec:b4:a8:
3b:f5:66:9f:e2:47:4f:b9:30:c5:08:76:86:7f:6b:
b2:ef:cb:28:a1:82:66:14:1a:00:12:3b:2c:72:b5:
bc:ca:c3:e7:a8:b9:a1:cf:2e:52:86:63:82:bd:12:
78:d3:bd:04:b3:2b:52:ac:ee:aa:50:17:6a:01:fc:
f9:4d:cc:2f:05:e4:42:ea:9f:7c:1b:b0:49:0f:62:
1e:4d:b6:1e:fa:e3:10:15:c0:a6:4d:96:11:fe:16:
81:c6:d1:e2:cb:12:be:93:1a:ce:f5:e3:76:1b:dd:
b6:89:f1:65:e4:ba:e3:50:6b:79:0f:29:01:5b:b8:
e8:1f:ef:c0:d9:24:d1:d8:9b:20:32:2f:d0:35:7b:
74:14:ef:3a:1e:4e:3c:5c:6c:4e:7d:63:f3:71:d3:
ca:4a:ab:33:48:bd:b0:c3:b3:66:ec:19:93:c7:2c:
3e:83:45:6d:aa:63:62:48:2b:bc:27:b3:c0:d4:c8:
46:ce:05:46:0e:93:f7:d8:ee:1a:e1:7e:29:8b:8d:
60:80:57:2c:61:29:dd:02:cc:5f:68:77:b1:6c:d4:
05:19
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client
Netscape Comment:
Client certificate
X509v3 Subject Key Identifier:
BA:E4:50:FE:A8:48:8F:70:CF:00:7C:C2:7A:73:31:FC:B8:0D:C9:C2
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
38:2b:bb:d3:4d:aa:95:5e:f8:7b:a5:05:da:af:f4:25:e2:7f:
be:83:fd:75:5f:2e:09:16:29:f8:77:7c:4b:f8:0e:fb:99:db:
62:5d:c1:51:20:65:c5:8f:f1:31:5d:91:d4:af:5e:7c:94:e1:
eb:c9:ee:5e:a5:a5:74:46:de:8b:1d:65:38:86:fe:eb:54:85:
ab:82:92:b0:72:81:6c:de:41:bd:90:53:ce:25:93:0b:42:da:
a1:d4:03:69:4f:59:ef:c9:de:d1:ac:0d:31:1c:fb:84:6b:cf:
b1:f8:39:8e:f0:aa:d8:77:1a:bb:61:e9:2a:c8:96:b8:e0:f3:
19:b4:73:7e:33:51:79:41:d6:0a:29:e3:e9:12:85:8f:7c:21:
a6:a9:12:e7:cf:46:ba:38:5b:22:2f:8c:af:01:92:df:67:6f:
7a:d2:77:13:86:84:d8:43:4d:bf:60:c6:14:e1:12:81:ad:ac:
81:b6:eb:60:58:c3:d4:d9:c2:bc:47:b5:16:7e:1f:3b:aa:42:
75:8f:30:2d:f0:f7:24:6f:59:b5:d8:57:6b:27:0d:b5:60:af:
42:8c:ad:82:f6:f4:ae:72:36:53:e8:ae:f3:74:de:65:53:a6:
02:e4:26:65:c5:aa:b1:55:06:c8:6c:39:fb:82:f4:ea:bf:8a:
91:46:7c:6a
-----BEGIN CERTIFICATE-----
MIIDmDCCAoCgAwIBAgIBBjANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJGSTEQ
MA4GA1UECBMHVGFtcGVyZTEPMA0GA1UEChMGQm9ydGFsMQswCQYDVQQDEwJDQTAg
Fw03MDAxMDEwMDAwMDBaGA8yMDcyMDMyNDE2MTQ0NVowWTELMAkGA1UEBhMCRkkx
EDAOBgNVBAgTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDERMA8GA1UECxMIQ3Vz
dG9tZXIxFDASBgNVBAMTC2N1c3RvbWVyLTAxMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEA28xRYLzwHKUOhqVdhZDbE8KSy4R/EBMG/zaDDVxQIQ5txgtg
W4+9nMzstKg79Waf4kdPuTDFCHaGf2uy78sooYJmFBoAEjsscrW8ysPnqLmhzy5S
hmOCvRJ4070EsytSrO6qUBdqAfz5TcwvBeRC6p98G7BJD2IeTbYe+uMQFcCmTZYR
/haBxtHiyxK+kxrO9eN2G922ifFl5LrjUGt5DykBW7joH+/A2STR2JsgMi/QNXt0
FO86Hk48XGxOfWPzcdPKSqszSL2ww7Nm7BmTxyw+g0VtqmNiSCu8J7PA1MhGzgVG
DpP32O4a4X4pi41ggFcsYSndAsxfaHexbNQFGQIDAQABo4GEMIGBMAkGA1UdEwQC
MAAwEQYJYIZIAYb4QgEBBAQDAgeAMCEGCWCGSAGG+EIBDQQUFhJDbGllbnQgY2Vy
dGlmaWNhdGUwHQYDVR0OBBYEFLrkUP6oSI9wzwB8wnpzMfy4DcnCMB8GA1UdIwQY
MBaAFKQKKhIH7M4Q5ExetnmDGDsVP1DbMA0GCSqGSIb3DQEBBQUAA4IBAQA4K7vT
TaqVXvh7pQXar/Ql4n++g/11Xy4JFin4d3xL+A77mdtiXcFRIGXFj/ExXZHUr158
lOHrye5epaV0Rt6LHWU4hv7rVIWrgpKwcoFs3kG9kFPOJZMLQtqh1ANpT1nvyd7R
rA0xHPuEa8+x+DmO8KrYdxq7YekqyJa44PMZtHN+M1F5QdYKKePpEoWPfCGmqRLn
z0a6OFsiL4yvAZLfZ2960ncThoTYQ02/YMYU4RKBrayBtutgWMPU2cK8R7UWfh87
qkJ1jzAt8Pckb1m12FdrJw21YK9CjK2C9vSucjZT6K7zdN5lU6YC5CZlxaqxVQbI
bDn7gvTqv4qRRnxq
-----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-----
MIIEogIBAAKCAQEAplsvOhFO2vUoBY+MDabMdbaZupAXMOn/jN0kVdxxEJmMINvc
N428BetZ8XP/T5fw6OzBIPy/aP9C13EliaxYVtRDbCmFMLDgqAi/BAM5NgxqxtpN
PUblWrPrlq9mU/U6/k9UOXA3qvEcdZEMlw9N3OXyYJDDihjOF6N7NI7h+r/KW8hQ
CmwhRq2eZJh2PfF0v1uMmgprp2/XQBbpVw6uwFQgx0TQ7D7KiuN0Qb8a2psJ7wIn
AlJPx/UnTmj9ZtPK6kG8/rbL8PoK+javp9be1hMV4kkvr3FXUqw24bnt2VcKdbcJ
ZYKViL66LtGLIn30VHG7IdLRfMBaol92w/praQIDAQABAoIBABJaMOWZDzf8n8Ot
SGghJKE/2cnJJ6XPys+Bfgay4Q5RwjHFz4+ZZUrJ4gxPHbVsL7milNPMzlkJABjA
dMGxb7V0iVOfaQAsIzymalxI9sDNseHqJ2dBMQBGpRDknMdaYH25xrLnfFyxaNBX
hioMGCzseUbJ8aiEgAf/kxIDSU7eOCpdrlknIjDizCLV5YepVCYkd3ivmuYcvFJb
Sum8fmEXdAfrYkSn/wRZ9ZFbCA/ML2N5tQDxuUgLk/ukTfK2WJDkgLDfO914Ak/J
viU/fdkAGaxJumFQrc6GQ9Hrx+4BH1NVhY+yue1HwgFZ43l4HqXwZwV+grZ62rBI
K2yFe2ECgYEA09MqpWdgXd7yoisTUdKeGAgLH/obuICNlnqm7Xt2tJoCNIEVDVXQ
G3c0KuB8GTWcBT37ZbbHMy323rIwrAwLXoZsbwzH1XRxdlvbMeK2teh3FhWtBx9g
asNYyEuW6XSnwcA+LSYH59fSUeSuuvAvFOixD/EHi5efaK1Nr0/jOwUCgYEAyQyN
NkGxNnsHN8tCIykC6/7jKziAvLjZPndpbH1bx4fpE1DmiJiwaao0fpZIIDUrPIGu
trhuxv49BpEFWEIzBvAC2pucgcG5qfD/bsryBRPsNb9RWmFcX85HYYy7fUis1EVp
P8WqWdg8zxNB302WLiqQjPSwEoSxTDUgqTDIhBUCgYA0zbIW02NJYzdWx6gkQH2a
ff7P9NgOMTWaam7MSne346BjGD54OYkMH7YIbjdhTWTcRawymdKkZnPg5ciOSt5W
rOnA8Q2rn0Bdgd5tXBex1wZAohyk5uRxGMs7+uPexG7BNLwLIyzbVYifU4NfJFqI
Os1QrQP1f1GElZcE+cQqRQKBgHaLuxwZ4hdAtcHVTNsUjI+AzIwolegxio9Fs9jv
ldVyMyFbm4NBnQvA+5EEpeSv1R2pTc6Zs2AMewlLK36eEh5uGRCznrX397TX0JWQ
fuI1nBsZAywqqmAnbnl7lPXLi3TitKuQruCpGznyne3AfuQb3v3uLX/N1AkebnK0
vBb9AoGAab4WQTLYstHEpGK/WY4nHMJ3wH9Bk90dYn/+P+io8YHrmuyAZz6nOtjK
7xmfQIcBskG3SY3uHGF3T2McIup8TaE5f7kN6Fv5rRHBOkFQzOdMeKj5+RZqvhRg
omC4dxPOIO9hppo1wT7XTqL/2nIlKftkd00UKXO5yNNDymMpXp4=
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA0F5vr02hG/WUvrMi0fxUaQ5wEuu4dm/UMEDu0w9uFc3ptZNA
bKv4dDDgo4+b+WOPdr33IEM5ei/EXm1i+C29s7LCZngM0FtcwJ/lfzMV9rHPDwtr
wNHZFTdymIXrV0UeX3+JIZZat4hYcCxSX70JCOoDaEAAVy6pk8yHIBVOF3v8SCw6
r42jTIOcMo3+hqFH8snrESoLunzhd70gQurI32kK6Wx+FWEBBvoNBwLWRIbDY64u
cWekcvcJYMWjpwaGushZvLpbDoSvS7hXRTuvf+lD9zjSPHQrVmGmamHxpWZsYp0/
JeCLp+A3OPOX5yyJZPZtfj9CIp/u1OLIa2065wIDAQABAoIBAG4ifEXccluk4oop
hS4YgUVGLFbT4Rw4357hs1o7vaQowm8G9fZ6r0g6zYGmVnrq9Nl+bzDOV4MN3G1M
xBMJmktxIO+oZJ18rPnjihpBlkpekWMSVlIEmQlt1VRo9IucLQGtF355SlnX52bj
Bmc0M6JSjpp7ubJbJ6bHZGTA3hXqrbaj2hYp8N39/qhxQaza4nOBVqyFjSL8TA1+
W7RwkGzmAom41NHE898y27R5mRchazOHPJBZLTMl0//WST3bEYPnQdYXAbx5cEG1
F0q/kvjvYmTuu3jrfPg0cPPZlUnqGXKtugNADvYXyLno9tb//OhpWWI8SEoC7lrp
H1IFw4ECgYEA/NWPbHkdQKqNu3hLGj2xBhDZF2JHywBjYFox6DeFiRRu8LHfeoSJ
4oDxBxdKIjpi5Yh0bba2h7wecaAQpSnO7O/NLfissMM8NXTPS1LDPi1n1HNlvRUP
uGQ2WgswJ8XlLV54xVeRfhqHcVsdhnbbOsT2A1JUdi94JnyjSjORPW0CgYEA0vpY
kqlX201OO0FqbdFM2SEsdxz/Y09BPeFHwFwvLOR4ZFvEmYpDvpirDmVV/KLz9dLP
7E44DC/oB7BQLrPQfvV8A+/bWnP+tyBNA+hechZNNLcibAHbel48BXtgi8TJO34e
O7hb7N8BC0ODpVz+RTi6SESWpZeNDnrWpwxtCSMCgYAWO6VgEYpr/FN4T8yy4wfl
E6gzcTYE+OTEPUo0NGWutzhGPC39tRf27gXD7N1dAytdKdGrMCz+5KD8tumfzHxg
w3mUeFCfPpvVy47K/d0jY5TEztz8cpSuT0mkQ2WZqcJMaglOuTOXFjgg1LVU9LC0
i0ti4WOB/QygvccSKFS2RQKBgQCyfID6crGVIm2Qy+LSTUOKXfpUOwAEcERtqW0e
W969R/xiSxCkJMjzMg1k/G4mcWWbDmJBNFtOVCkkeBEdsZouDliArCcS+xb+riD5
sVhVhHCErHo+jcO0XozAxoQDOtRTtHq3Y1zBpFgpw1BYUbf7r+ZIxV39cZ0wJtP6
NxT3qQKBgA8GGiuN1t5X33lOlRiXZpjOyRMHxiw7Edxs1nau3LBJ8n618sJaX02g
iYphctAfg4hPXlvGYERvM8jqlitIOlh+CieUPQ6VUbS1Zb1RMppVGyA2QxMsgAXD
TsfeiwUQnJausJnodY7RhrUOXnoCwJcoRsf1EonVklUhgNJwVToc
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA28xRYLzwHKUOhqVdhZDbE8KSy4R/EBMG/zaDDVxQIQ5txgtg
W4+9nMzstKg79Waf4kdPuTDFCHaGf2uy78sooYJmFBoAEjsscrW8ysPnqLmhzy5S
hmOCvRJ4070EsytSrO6qUBdqAfz5TcwvBeRC6p98G7BJD2IeTbYe+uMQFcCmTZYR
/haBxtHiyxK+kxrO9eN2G922ifFl5LrjUGt5DykBW7joH+/A2STR2JsgMi/QNXt0
FO86Hk48XGxOfWPzcdPKSqszSL2ww7Nm7BmTxyw+g0VtqmNiSCu8J7PA1MhGzgVG
DpP32O4a4X4pi41ggFcsYSndAsxfaHexbNQFGQIDAQABAoIBABzXuvYO1RNtNXLF
0HfuglEdf1XllSbu2EQ1Sw09x+YOlqkeZQ6e1ir1WTp7uSKCzQhMg1Gx7KknpI6j
+18sMbDAA9UvdELwMOz8nEGfY47ojSs60OmBtW5KNkDS1QMN9FNtHjxUVjzcjXqA
CMulIILZWtfnUi8KmR9pfrc9hKbV2re7QOxO2aGAkqmPaNNRsL1vCM2ezya53wc5
vcZoirn+gGfbdIIGQb7FX5YIJo1LXqQ5ZgQcXXdzmhT3J5G+Fu5nc26sRABMUIzA
D7ldSEitxx+3IxQ8lCOTohiJcbaydAMdAbmvwZJdgt0JSamKvVC9AEiatM3oqxPs
Z01Bd2ECgYEA8lcFBLbjppeKE7RPH55/IltMGQvk7VW044taJLD5KlcD35tdKuMq
ozJWS30eLuWlQuvtj4w7wVWtujENDXUfIPswnHa+uu5rncm5cSbP8YP0MJipGIXm
ePQjwHPBPTm8+xdxTJJSkyHRVtOf2N+p2ILObxXbNJYqOaFxFJRvU5MCgYEA6DAE
xKiavxLgVRkVeEuxOV7TMGRI5Z2zpVKv5W9kdizL/wgpXKC0z2RkXQ7QoZkqOfNY
uI1kmcV/1nQ0uu7bi100Y7QFoiEoX90ksSTe5fRz1VBZGBQRBeZ+aGiXAGL1EXEC
zbTjeC34pq/q+aqRK0Ak7bUwur4nAAPEUFplCCMCgYAxcGNLtOv4fo3iuzQxJSqW
nb2GlpCbgpKmoTVAqwIKCzp1EcMODs4SASDtwZa4xozSfEM4t8kxBgOtKniZOD2j
gttF8Eu04xL9W7wDQ4HEqcDVcS9+G0MLhfMNPhA8J11QdFXe4zMJZSrJ5d6EZgzG
aNkofHL95Wyz2SWypx2XFQKBgQDHtdXEGYnQ47mVOJgg+mobgJaCPx/8cGK+xpqI
7AErLGjimfCJvakH4b/50u5csNODOO6M/wESyq+klBtu1lh8TNTtFUDrLT3/BsWy
oJYgkNy5E/0uGsRxoMoFoECRkoxcTiotKXOmQVRoe1PPH4jx/KBG3dxmI3yEJLlM
rBPOpQKBgHS4j0XgItZPW6paYfbS0zTtbx6GyA9y1d3Bo1DYfWzCRcsmXSxCWN7y
wzyJ3ElyMZxGcCPlQvk2h9RYW2OYWSK3S5kiatxsqAJ90ItVZDDsPoWT7P8OHZ6/
TApmKbpV0vZ5o4zxqU2zSPQr76HkQipib7Un9RNhmH8Md9wNhxDe
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEA5J/zg0dLgltg47+i7Rck8eop0zhv9QAERhE2rqUwjfO9e3nR
5J+NkYptHyLs0mXhY09igBUfRNGc7KK+AezXeeEj91LsjxyYiJRf47nwoD5i6yUu
12lSSaDPalsHrIH3PQmwkm+TkqNNH0o6GDGFjfUv2aJnVyHo1U5J1lC6qKqy/fO1
8EtOQgoChSN/pMTi9SyKAlNtn+BRELcHSFs5h7vRboe4+janlqyy3ov346/B/+FH
MX+SU8Lsl5HD5SQYnegokXsIPl7QEz0ZxDybMSL8IJDvN7wRjCAdtBxE8JG1I17X
ZjNoljgm4Yv3zW05z6cICNlyBXEFaeR8W+VSjQIDAQABAoIBAQDYUigdHQZrT377
v8WvQ+jnJUNx4cK9NMjWa08sLI0mo2u0O23IPte60Bm0Dl26Lj/2sZRn0JSHjzZG
CS5zr9+qKMbZK5M9Tjddc9bPKI5vcNgz2jjaBYOguxHGdl9qcIa5MEPsKrqdUvqU
Eq2pWqId0dL2v9276g/eVHc026niD+fwRoVNkR2KQAO4OKMUs0tDoBv9dgRMaGxE
tptykZbVV2kyVbqyH+5YSEs5cbHMlLoDfC5ngZEWgpEBSSC9ykx6OeKFj6HEoW5W
IyAoBgV2Kp/O59AD3L9ub9vBTIba+A9SglsxxRLgSeIWk53YCnKb4UQ+PJzLk/hb
WHkGlG5ZAoGBAPXPSiO5QBwmzwm/cIY89Lf0EyipWeGT5MECCSnkLgR9SbDfaGJn
hs7A5hD4TzuojagsMk9jKm8ao8HtkBVG/z7W4IrUO+uz6MP2EXR18UhK539aCN03
mgPc/yGXx8fz++ly4pfPeUB58z/k4u+3ej0xX3ABEEs9WMUiFMHUatA/AoGBAO4a
SGp5mXq8NrYfeR0rDOFAWSpEx18z5qdk+ZQREXvJ9bAP6Dhg9DoylDXpH5E+zAnb
hK+LWqRy7bX46EjGgb7/q2CK6bCqYoyXKnr157mYhyTZ/GdkmyZNACFmy90KEIn/
GVm4h3UqNi3Rzx4/i5452GRFYKAQYReecidOrKozAoGBAKJgGD2Y9fyitkleKNrE
EXQiyzUlCba1l3rX+W2uyac1jCRGsBGxCaAyVMgI/24NXeYlq+Y9P569HkfQwkkL
6Th9gT60DBEbeztXpRglgQmcUWgS9aAMRrUem3p5ZQN07Ie92GkoKJSq+kDO1go8
TYd2wfCfA0Bwed9fMA8KXrTJAoGBANU6EFPZ5cp2NwDOGqY2YWhvOeqSgYEOd6a8
1Iz25BNZf35WIH4sxUpA9V16Edz+wbaqMZ8LSvcuPRbTeyGBM7waNh1VCYY+b9a7
oT1Qbl5U6+HinRjyjca0+kLvTe37D2ilXMxuZlBUpwRNeg/6lEv0PYc+YhO1111R
daUh3ZrlAoGBAJw4V0vOb9k4MSI8xNU6KfzudT+Dvt5RJRwYlc99N6tXLmbHp3C+
caE1RP3YhWHnSA/DGBhx4L58BD3+9QoV4vDLBSc9V5pY6qc5kFE/zaVx1bbbKV65
PWrzxdjyNsVjNaAlBn3skLB5gcH4uK7YE4cwWHw3kFjqIbX76Pt61DbD
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA46/fEXEr9lckUso2SJzp4q8H+M0YyQBWs2OU6HNBPeYOAVOA
XQB5V4PuqNZd8ShZveOXe5DhCIaVtETuLOmuJdDS7a6T2HPDS54uplE1y2zml5e3
R5NvHegHmPjUC86clE7W9AtXLsDX+6S01yu0NiaEZG33HvMx1s1GQyhVHHI63W6Y
mp+fE3imML5ioJ7ebQqD2t46RcNZFH9xsAVnwxkFPCiRdCqf76+m9UpE0tFw4WC6
8qoDl2NSfDBNZ1SAfpZl3Bd0w7CkpRZTdSV3ovcXnbyudrsARqH8OTJD3z0IRig/
olleFc/PRTlqWy5ssIQZRaurMBL8l6y/GBzTkwIDAQABAoIBAQDfGsSAON8VIcqL
/W03tdpQr6YmHAK/Yr+SRG/zXox9dOIgVowflYlRQgwoEPY4iot1UIBtKkf3rLkg
zbJ8+/YTRA6LrFde8ABcJoIbotQNo4ZI4PdNAaEOMwDO2nQdpbU0dhSXSk2BmKGL
CZfSiBasQQ3VwxM1lqQtkTPaNrk/hq4TOYZbK122HvaLj1DznofC2qcU/hKXaNDy
rdGecrGP78FbtDyBC7Sx10F/29IGXX5lQIWFa/MKjLiVGGdiCv/85URnesWnlAru
OjXxq7aySvTrsf/WiK8jeDSRMC8mwYQ8nUXUvuBZq6dzQTRlz+tdKYMN2qJ6iHA2
c1YNkJlhAoGBAPMZGMbRbWwnd5QfRoOC2YE2Zfb1JPGW2NWpIXR9VpyJwtKSmvIJ
wAzmvlmlhXfwyfvNLN8v0+UW1PMqfdRscTWVAR9GwjtxSwUZPTUHjgQoC1/PRywc
4ZeszUK6By8P3UJBo16Bu+q2bZOYFVjuElYio5wdkH6KM2M1ozUGq8JZAoGBAO/F
Y6Vj7yLFXXcXDL8T4v5hAkFlXUdq6wWuhPN+dJeQvuZrkOQIZ8LPXOf239ASQj78
+VnDnKQd9wT0pnCNC2NPS65jAvi3bhaenp8WGVfarxh7iayjBZyA5P881Mw+1vq/
3/WaAbiCyoV6MRrk1i1yqX/UgRDl1f0o14YP6o/LAoGBANniwKZSx3SM20zTy2vM
OA7sJu/2QSqYPbkjYmz6ekrL3ubFqEMQIiZuGmZXSQ17sE4UVAem4pEOqcdZanae
y8luyBa0YRrOLKNhP87r+ooXKjqxmeUb7cb4hvErs4ym93WPR1JJjZiN8iC7y0Zt
+9lgKqyegwgn7m8ZgDLiy8fhAoGBAKwlbyaWumGfjDxtmyQxFf+HDMSBD1iwRe79
Xs0nlHQhYz4yKoPeGQlAMjcFA6nzAgcRP8GX9QXL0ceIE1upmGyDyRV6Vu7VW7/3
wHD9v9JY2u/b+nutS+ESldc/CJVf5J+BVT2ThfrARMFSeqERfUiCE3oIy2WjbmDl
it/g24rDAoGAA3+mzY6YH5C3YjxQUvi0TxEZ1KndclM8SSeMgzmxtOvnT/drPToz
LCi2NBWTJYmIRGoBJKuyQtOJPOxmga6n6dd2qBBQznYg/biXiHeXMyuw8C8pNOt1
DFqwuzh/kNA/T58PfqhfUZ1AI8Ce6XiGHiDs6dLmUPUyqoNTL46sfq4=
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAqL4wemLyy14DJg8w8+jTMPmnZ4TFnjhkZXJw33y7r7HT9RaQ
QLjvaMAV+wMoc6XBnJ9f5lMNgYKet7vORV1S4ZxA0d1RKIxTn/GywIc01Ro5wna6
GsVo80PkCs+Hriy293Vrbrlg4e2oT3fkT4I2UUCpmDCZN9S7YBLZWY941nUK5Bky
ukRQctXyB+nSh0MUGYTj+R1Yz707B/TiWz1NPzhzwUlz/i3AYP7QRUe3IcNBKZMZ
2xDQIkA6Gy/71afI0QcBjmsYdYFy8/WEq/bqnmVtj7jJluFPw+F+4sxfxeouAJjO
nM7cKw1SWkZFCBtQ2Whq2WV3ByrVppAagr1PpQIDAQABAoIBAFprFvTtgmYAqTVC
nJuF3Wx3ygEJPw8p7noBmYPXhYZ+hjHk9kUIE5kQnHaVWZ6mahlvuOZlCG6mPD/9
jWjTue6UWJNbwPo2PzUMQRkzGdc6p0qRbeWcdEEt1ssIKw7kfOIadAevo79MJoz2
lEsaXdqqCHY5TFCDWCgB0Z9Q5pIa5G5X/OFHHYhZcIMltBOymAskx67xRY89uDqK
yJVmHq1iasv7w5vgl/b6hNT7VhY8foR1bQHLdZmx04kkwUH/AKeNPsVGvrcqL1R5
zypD8vbZQ2SGbct3LolfzxV5f4e6UmR90jahMjdxFd+DddsxXkc2esQ5X9GLK9g5
l7BlmX0CgYEA1u1PCjEdjLMzn/ugcB9hPVRcXQorD0o52IA68IdKZUyfvqypm5Wb
lMvhHzFNA5mc2rV9GrCYKS0/bjletWnOaTywt/X4Ehu9E0WVpHXMNrULVwTJWaqx
SrZa3SCPC9GbeqeHKk+G3D1/LwhrvTz5oUFrgBSoeQYvGm3ppvHZMlcCgYEAyP10
93y8mlw+WPvU7SUBw2y0KM7ZaQvzqwTqfpwF1IJRCBSkZbCOs46f2sPzCgIIfdFn
kUiLzMaocr+eTRJOH7kX8vVVa6bo4qWgJ1TbRSoiv6BnyLqo+Vk1EaZM5FJ6ygN9
s8/A0Q5x8+5QjwyqkpF8s8DwbfaFugP8Enbg6GMCgYAavND9apjLfSup9mrCKBU3
xPvskyxCLbC+j01FyP7nVT32QZKkCVueijKKZ9612PFbgAJ9RITZcoiWlMqEdRI5
o1Q0voPK9OpzsE9qc0EheSpc+/p0jjiaG893/OnuxXe7LYYyLEyRr5DX8As/Mou3
lOTjvS4sSCmp9wx/OU0U5wKBgF3vx8kbrXJfhmxEVwH299oEZjdkZcxo35ugkpBW
D4uA1Kp4K1WzrR5SnHe8eUzGIn3bbxJB28T7XCM1V6Eh2w2Mjpro+uFzgwja6/01
9b1fshnpuFfilbLkdJ8pIGrd+bGM7CUsBiwvGictzMzu2JHkGWpR1I0wWNPVpOxk
Tz2NAoGAXaQgqgiq+U5q8wANarxQPZFFVaWgCcn9nRY561mbyOkSpL04Ap3ZF3nF
v3vx2ouyYAy4U0o0J2f7ZLza6PVQUURCN440Td9bLRxAypXbHpUW2xZXNXjto0/g
25L4kEpMcXHu/QloyWBPhcmBcAsxSZniRvqlUaqNyIluJHyHFZc=
-----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-----
MIICrjCCAZYCAQAwaTELMAkGA1UEBhMCRkkxEDAOBgNVBAgTB1RhbXBlcmUxEDAO
BgNVBAcTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDEQMA4GA1UECxMHQ2FzaGll
cjETMBEGA1UEAxMKY2FzaGllci0wMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBAKZbLzoRTtr1KAWPjA2mzHW2mbqQFzDp/4zdJFXccRCZjCDb3DeNvAXr
WfFz/0+X8OjswSD8v2j/QtdxJYmsWFbUQ2wphTCw4KgIvwQDOTYMasbaTT1G5Vqz
65avZlP1Ov5PVDlwN6rxHHWRDJcPTdzl8mCQw4oYzhejezSO4fq/ylvIUApsIUat
nmSYdj3xdL9bjJoKa6dv10AW6VcOrsBUIMdE0Ow+yorjdEG/GtqbCe8CJwJST8f1
J05o/WbTyupBvP62y/D6Cvo2r6fW3tYTFeJJL69xV1KsNuG57dlXCnW3CWWClYi+
ui7RiyJ99FRxuyHS0XzAWqJfdsP6a2kCAwEAAaAAMA0GCSqGSIb3DQEBBQUAA4IB
AQA4HCb9Sn38TlEIel5znd9yrHHBVe6C8CqkEgZ64Q3Tq+gc9rapvcWpnVhuD3GN
mUgkOvXpRPn8xZ+f9KhM0sPkumYw7Puq8RHAxF1Iip4lc8X1NTQs8Siij8om/e8T
e54ygKzRamrJQCO7ru9psg/qJmFoEF5V+zKBihOKk4bgjVC+K4WFbrt5ZrZXPUOu
7Ed979HucwDfw/81ZcZgyFaEKmleJZT4AaWo5f6SQVoro3R0wmd6v3UjJh2QSMvf
TVdChgeXfJ8dIGByZCOR4jw6BthNZ+o1YcOtezbv+5h/1O9/U005DgB7oTujMhSU
dqJ4JdN8Q2yZ2acfU4hPUIz3
-----END CERTIFICATE REQUEST-----
-----BEGIN CERTIFICATE REQUEST-----
MIICrDCCAZQCAQAwZzELMAkGA1UEBhMCRkkxEDAOBgNVBAgTB1RhbXBlcmUxEDAO
BgNVBAcTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDEPMA0GA1UECxMGQ2xpZW50
MRIwEAYDVQQDEwljbGllbnQtMDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDQXm+vTaEb9ZS+syLR/FRpDnAS67h2b9QwQO7TD24Vzem1k0Bsq/h0MOCj
j5v5Y492vfcgQzl6L8RebWL4Lb2zssJmeAzQW1zAn+V/MxX2sc8PC2vA0dkVN3KY
hetXRR5ff4khllq3iFhwLFJfvQkI6gNoQABXLqmTzIcgFU4Xe/xILDqvjaNMg5wy
jf6GoUfyyesRKgu6fOF3vSBC6sjfaQrpbH4VYQEG+g0HAtZEhsNjri5xZ6Ry9wlg
xaOnBoa6yFm8ulsOhK9LuFdFO69/6UP3ONI8dCtWYaZqYfGlZmxinT8l4Iun4Dc4
85fnLIlk9m1+P0Iin+7U4shrbTrnAgMBAAGgADANBgkqhkiG9w0BAQUFAAOCAQEA
MY1KdNa7q6Uv2ufvVWB0sdIfF69nBzriESHIi/CiFul7PbqgnDIkUN2eeOH/3iCJ
dS8tlQwxNVHPxkph7+j5L65m/hLMJX3cdxU0srMqWSwbaR62Yomz/QQOFD7DW1au
eQszmHoO+fOVf9/D/uEw5MqnJ/uIYcT6iLqtx+pciIa0x1L3wDoSLsDXvNZNhTag
pAaq8GG5egmSbzITrMpSUrTMtms3VVSCHnbJPJEr3AwqY1FlvRU4XPQad/CrHc22
SrGVBEdAkYATtG93MsllYqzZjYLjGM2LJFpVLbQ91tRfDb244bM92sLScVMvvIIP
AXVTQqm/9dkxllGAdRh4IA==
-----END CERTIFICATE REQUEST-----
-----BEGIN CERTIFICATE REQUEST-----
MIICsDCCAZgCAQAwazELMAkGA1UEBhMCRkkxEDAOBgNVBAgTB1RhbXBlcmUxEDAO
BgNVBAcTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDERMA8GA1UECxMIQ3VzdG9t
ZXIxFDASBgNVBAMTC2N1c3RvbWVyLTAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEA28xRYLzwHKUOhqVdhZDbE8KSy4R/EBMG/zaDDVxQIQ5txgtgW4+9
nMzstKg79Waf4kdPuTDFCHaGf2uy78sooYJmFBoAEjsscrW8ysPnqLmhzy5ShmOC
vRJ4070EsytSrO6qUBdqAfz5TcwvBeRC6p98G7BJD2IeTbYe+uMQFcCmTZYR/haB
xtHiyxK+kxrO9eN2G922ifFl5LrjUGt5DykBW7joH+/A2STR2JsgMi/QNXt0FO86
Hk48XGxOfWPzcdPKSqszSL2ww7Nm7BmTxyw+g0VtqmNiSCu8J7PA1MhGzgVGDpP3
2O4a4X4pi41ggFcsYSndAsxfaHexbNQFGQIDAQABoAAwDQYJKoZIhvcNAQEFBQAD
ggEBAClQwvOkm+lu74/ndo0AUmyvEC+3btAHtb9C25pAwfb6uG/B5Q8vw0w+Y5RI
yjTrsPhHv3NPoaZI8tJPBiGJWdQHLcFlsJx8Lp9vI9IEOg34q53jq+JeaLb/4/YJ
ECwjYbYFRm6yg9U54bMEQlA6+5KBNSzEPra3s/Htiom5aXhYUMzEaRkGqSFoZVr6
JONZU4f1RgRkOi/jPJuOuKV+MtOkN+k68aTbBtg9z0UwwbtLXCWIxJ6VegVhl66Y
g2hnTKtTlR4Xa+nuZVDUqu2+oacdCR///SA97U2eQiETrngWloZFz8uukrVPWNPo
rEjA/xUtD8Wr0qaiE+P3Bs1U8QE=
-----END CERTIFICATE REQUEST-----
-----BEGIN CERTIFICATE REQUEST-----
MIICnzCCAYcCAQAwWjELMAkGA1UEBhMCRkkxEDAOBgNVBAgTB1RhbXBlcmUxEDAO
BgNVBAcTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDEWMBQGA1UEAxMNYm9ydGFs
LXNlcnZlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOSf84NHS4Jb
YOO/ou0XJPHqKdM4b/UABEYRNq6lMI3zvXt50eSfjZGKbR8i7NJl4WNPYoAVH0TR
nOyivgHs13nhI/dS7I8cmIiUX+O58KA+YuslLtdpUkmgz2pbB6yB9z0JsJJvk5Kj
TR9KOhgxhY31L9miZ1ch6NVOSdZQuqiqsv3ztfBLTkIKAoUjf6TE4vUsigJTbZ/g
URC3B0hbOYe70W6HuPo2p5asst6L9+Ovwf/hRzF/klPC7JeRw+UkGJ3oKJF7CD5e
0BM9GcQ8mzEi/CCQ7ze8EYwgHbQcRPCRtSNe12YzaJY4JuGL981tOc+nCAjZcgVx
BWnkfFvlUo0CAwEAAaAAMA0GCSqGSIb3DQEBBQUAA4IBAQBFDMxQHUEHfeeW0RWd
yNa/2+h1PLeLuqGgs1jEmjfeZLas2m+41ok7PcCtifc8tKPoUnzU4eb3w9XgjZL6
mQzhaRiWOoLw6ABk036hffL3D9lnvtuIYdCtv5NzigQren+iAnlSiMeJrxt7G12k
z43J2UuILZNp7qbtgwBQ69qla1S2wgZ7nZaS0c9hZlP6GOcOHiQO6w8L1T617j/1
2mpiRCqAuBCaarEYMWkwgoBxeocmSLL8iYvOWs9TZbAABY61BodcByfTLswiIofS
oGihnpWtXMChb10EgNyuwgUTcnRv8PEZgoVn1FozX4u/sua+O6pjnxG+FCjtakYl
hFk4
-----END CERTIFICATE REQUEST-----
-----BEGIN CERTIFICATE REQUEST-----
MIICsDCCAZgCAQAwazELMAkGA1UEBhMCRkkxEDAOBgNVBAgTB1RhbXBlcmUxEDAO
BgNVBAcTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDERMA8GA1UECxMIU2VsZmhl
bHAxFDASBgNVBAMTC3NlbGZoZWxwLTAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEA46/fEXEr9lckUso2SJzp4q8H+M0YyQBWs2OU6HNBPeYOAVOAXQB5
V4PuqNZd8ShZveOXe5DhCIaVtETuLOmuJdDS7a6T2HPDS54uplE1y2zml5e3R5Nv
HegHmPjUC86clE7W9AtXLsDX+6S01yu0NiaEZG33HvMx1s1GQyhVHHI63W6Ymp+f
E3imML5ioJ7ebQqD2t46RcNZFH9xsAVnwxkFPCiRdCqf76+m9UpE0tFw4WC68qoD
l2NSfDBNZ1SAfpZl3Bd0w7CkpRZTdSV3ovcXnbyudrsARqH8OTJD3z0IRig/olle
Fc/PRTlqWy5ssIQZRaurMBL8l6y/GBzTkwIDAQABoAAwDQYJKoZIhvcNAQEFBQAD
ggEBAMdsgAjn1MR/kH5DJhFAkrA9qdn/8Qgx0Sh+aj+3LfprErVICHrssDVNDqah
MuWZH3J/qwTGOqzD6nzFzzXPaHzhY7O3cAN/GvK8AgmamNgFtUdByN3b91SMxigO
8ieOgmEnMdv0fBeoDTIRE9tT0rBmeQk7TfzVzKTNgC+waIiveuGKiJVrj1EBGKBE
+k+DQXfdC3ElPeLVdaM7mxXu+/fVsA5vgZt56vy9xVE9OAv7xuaXI86oHSyEzgmT
W6vWmzSknj68I2HTLq7G7JmV/1pral94N5ul22ZE0kNxMuF6O0SPk44lJiew0A27
tMny/UcRVSxHt8yaIbnD2Tp+VLw=
-----END CERTIFICATE REQUEST-----
-----BEGIN CERTIFICATE REQUEST-----
MIICmjCCAYICAQAwVTELMAkGA1UEBhMCRkkxEDAOBgNVBAgTB1RhbXBlcmUxEDAO
BgNVBAcTB1RhbXBlcmUxDzANBgNVBAoTBkJvcnRhbDERMA8GA1UEAxMIdGVybWlu
YWwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCovjB6YvLLXgMmDzDz
6NMw+adnhMWeOGRlcnDffLuvsdP1FpBAuO9owBX7AyhzpcGcn1/mUw2Bgp63u85F
XVLhnEDR3VEojFOf8bLAhzTVGjnCdroaxWjzQ+QKz4euLLb3dWtuuWDh7ahPd+RP
gjZRQKmYMJk31LtgEtlZj3jWdQrkGTK6RFBy1fIH6dKHQxQZhOP5HVjPvTsH9OJb
PU0/OHPBSXP+LcBg/tBFR7chw0EpkxnbENAiQDobL/vVp8jRBwGOaxh1gXLz9YSr
9uqeZW2PuMmW4U/D4X7izF/F6i4AmM6cztwrDVJaRkUIG1DZaGrZZXcHKtWmkBqC
vU+lAgMBAAGgADANBgkqhkiG9w0BAQUFAAOCAQEAp6MAla4wTeyzRxIhFSvY1+L8
zqnSzF7BpEC2iclTc7Ez9McAlAq8Fu67RSozXncRuFR0ks2v2dUi2atv4Es8kxpl
Db2sQCWKlbhqZkC+AY8TL5shk75dGpoL7ECbvr5cFmAR2b9bMkEDoiQi/XKWlHe7
G+5O+jk35T38Bn8EBYgq1+m11lBChpiXroIQeccsJHykFNW3CoMtzQ4kKuEb68ar
umxKFgNlaraZdWEXbF7hotycaphyoE8fsmNvblWPUt0vDZHefUvTjvC14D/aSbIq
rRJ7tleagX/k2Hy15ngCj7AqmHKOW0Hp8zg/tV5xtKKXW+xNnZi8jSVKb7Qi/w==
-----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
#
#Certificates signed by master CA - with custom common name
#also create a .pem file for both private key and cert
master_signed_cert_subj () {
_base=$1 ; shift
_subj=$1 ; shift
test -f ca-master/private/$_base.key && 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 "$_subj"
# 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_subj s1as "/C=FI/ST=Tampere/L=Tampere/O=Bortal/CN=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_subj terminal "/C=FI/ST=Tampere/L=Tampere/O=Bortal/CN=terminal" -extensions client_cert
master_signed_cert_subj cashier-01 "/C=FI/ST=Tampere/L=Tampere/O=Bortal/OU=Cashier/CN=cashier-01" -extensions client_cert
master_signed_cert_subj client-01 "/C=FI/ST=Tampere/L=Tampere/O=Bortal/OU=Client/CN=client-01" -extensions client_cert
master_signed_cert_subj selfhelp-01 "/C=FI/ST=Tampere/L=Tampere/O=Bortal/OU=Selfhelp/CN=selfhelp-01" -extensions client_cert
master_signed_cert_subj customer-01 "/C=FI/ST=Tampere/L=Tampere/O=Bortal/OU=Customer/CN=customer-01" -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
#
# Bortal CA
#
HOME = .
RANDFILE = $ENV::HOME/.rnd
# Extra OBJECT IDENTIFIER info:
#oid_file = $ENV::HOME/.oid
oid_section = new_oids
# To use this configuration file with the "-extfile" option of the
# "openssl x509" utility, name here the section containing the
# X.509v3 extensions to use:
# extensions =
# (Alternatively, use a configuration file that has only
# X.509v3 extensions in its main [= default] section.)
[ new_oids ]
# We can add new OIDs in here for use by 'ca' and 'req'.
# Add a simple OID like this:
# testoid1=1.2.3.4
# Or use config file substitution like this:
# testoid2=${testoid1}.5.6
####################################################################
[ ca ]
default_ca = CA_master # The default ca section
####################################################################
[ CA_master ]
dir = ./ca-master # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.
certificate = $dir/ca-master.crt # The CA certificate
serial = $dir/serial # The current serial number
crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/ca-master.key # The private key
RANDFILE = $dir/private/.rand # private random number file
x509_extensions = usr_cert # The extentions to add to the cert
# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options
# Extension copying option: use with caution.
# copy_extensions = copy
# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions = crl_ext
default_days = 3650 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = sha1 # which md to use.
preserve = no # keep passed DN ordering
# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy = policy_match
[ CA_tosibox ]
dir = ./ca-tosibox # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.
certificate = $dir/ca-tosibox.crt # The CA certificate
serial = $dir/serial # The current serial number
crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/ca-tosibox.key # The private key
RANDFILE = $dir/private/.rand # private random number file
x509_extensions = usr_cert # The extentions to add to the cert
# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options
# Extension copying option: use with caution.
# copy_extensions = copy
# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions = crl_ext
default_days = 3650 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = sha1 # which md to use.
preserve = no # keep passed DN ordering
# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy = policy_match
[ CA_tokens ]
dir = ./ca-tokens # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.
certificate = $dir/ca-tokens.crt # The CA certificate
serial = $dir/serial # The current serial number
crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/ca-tokens.key # The private key
RANDFILE = $dir/private/.rand # private random number file
x509_extensions = usr_cert # The extentions to add to the cert
# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options
# Extension copying option: use with caution.
# copy_extensions = copy
# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions = crl_ext
default_days = 3650 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = sha1 # which md to use.
preserve = no # keep passed DN ordering
# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy = policy_match
[ CA_vpnclient ]
dir = ./ca-vpnclient # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.
certificate = $dir/ca-vpnclient.crt # The CA certificate
serial = $dir/serial # The current serial number
crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/ca-vpnclient.key # The private key
RANDFILE = $dir/private/.rand # private random number file
x509_extensions = usr_cert # The extentions to add to the cert
# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options
# Extension copying option: use with caution.
# copy_extensions = copy
# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions = crl_ext
default_days = 3650 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = sha1 # which md to use.
preserve = no # keep passed DN ordering
# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy = policy_match
# For the CA policy
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
####################################################################
[ req ]
default_bits = 1024
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert
# Passwords for private keys if not present they will be prompted for
# input_password = secret
# output_password = secret
# This sets a mask for permitted string types. There are several options.
# default: PrintableString, T61String, BMPString.
# pkix : PrintableString, BMPString.
# utf8only: only UTF8Strings.
# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
# MASK:XXXX a literal mask value.
# WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings
# so use this option with caution!
string_mask = nombstr
# req_extensions = v3_req # The extensions to add to a certificate request
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = FI
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Tampere
localityName = Locality Name (eg, city)
localityName_default = Tampere
0.organizationName = Organization Name (eg, company)
0.organizationName_default = Bortal
# we can do this but it is not needed normally :-)
#1.organizationName = Second Organization Name (eg, company)
#1.organizationName_default = World Wide Web Pty Ltd
organizationalUnitName = Organizational Unit Name (eg, section)
#organizationalUnitName_default =
commonName = Common Name (eg, YOUR name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
# SET-ex3 = SET extension number 3
[ req_attributes ]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20
unstructuredName = An optional company name
[ srv_cert ]
basicConstraints=CA:FALSE
nsCertType = server
nsComment = "Server certificate"
# PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
[ sign_cert ]
basicConstraints=CA:FALSE
nsCertType = objsign
nsComment = "Software signing certificate"
# PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
[ client_cert ]
basicConstraints=CA:FALSE
nsCertType = client
nsComment = "Client certificate"
# PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
[ usr_cert ]
# These extensions are added when 'ca' signs a request.
# This goes against PKIX guidelines but some CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.
basicConstraints=CA:FALSE
# Here are some examples of the usage of nsCertType. If it is omitted
# the certificate can be used for anything *except* object signing.
# This is OK for an SSL server.
# nsCertType = server
# For an object signing certificate this would be used.
# nsCertType = objsign
# For normal client use this is typical
# nsCertType = client, email
# and for everything including object signing:
# nsCertType = client, email, objsign
# This is typical in keyUsage for a client certificate.
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
# This will be displayed in Netscape's comment listbox.
nsComment = "Bortal Certificate"
# PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
# This stuff is for subjectAltName and issuerAltname.
# Import the email address.
# subjectAltName=email:copy
# An alternative to produce certificates that aren't
# deprecated according to PKIX.
# subjectAltName=email:move
# Copy subject details
# issuerAltName=issuer:copy
#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem
#nsBaseUrl
#nsRevocationUrl
#nsRenewalUrl
#nsCaPolicyUrl
#nsSslServerName
[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
[ v3_ca ]
# Extensions for a typical CA
# PKIX recommendation.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
# This is what PKIX recommends but some broken software chokes on critical
# extensions.
#basicConstraints = critical,CA:true
# So we do this instead.
basicConstraints = CA:true
# Key usage: this is typical for a CA certificate. However since it will
# prevent it being used as an test self-signed certificate it is best
# left out by default.
# keyUsage = cRLSign, keyCertSign
# Some might want this also
# nsCertType = sslCA, emailCA
# Include email address in subject alt name: another PKIX recommendation
# subjectAltName=email:copy
# Copy issuer details
# issuerAltName=issuer:copy
# DER hex encoding of an extension: beware experts only!
# obj=DER:02:03
# Where 'obj' is a standard or added object
# You can even override a supported extension:
# basicConstraints= critical, DER:30:03:01:01:FF
[ crl_ext ]
# CRL extensions.
# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
# issuerAltName=issuer:copy
authorityKeyIdentifier=keyid:always,issuer:always
[ proxy_cert_ext ]
# These extensions should be added when creating a proxy certificate
# This goes against PKIX guidelines but some CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.
basicConstraints=CA:FALSE
# Here are some examples of the usage of nsCertType. If it is omitted
# the certificate can be used for anything *except* object signing.
# This is OK for an SSL server.
# nsCertType = server
# For an object signing certificate this would be used.
# nsCertType = objsign
# For normal client use this is typical
# nsCertType = client, email
# and for everything including object signing:
# nsCertType = client, email, objsign
# This is typical in keyUsage for a client certificate.
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
# This will be displayed in Netscape's comment listbox.
nsComment = "OpenSSL Generated Certificate"
# PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer:always
# This stuff is for subjectAltName and issuerAltname.
# Import the email address.
# subjectAltName=email:copy
# An alternative to produce certificates that aren't
# deprecated according to PKIX.
# subjectAltName=email:move
# Copy subject details
# issuerAltName=issuer:copy
#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem
#nsBaseUrl
#nsRevocationUrl
#nsRenewalUrl
#nsCaPolicyUrl
#nsSslServerName
# This really needs to be in place for it to be a proxy certificate.
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
-----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
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("OU=")) {
String ou = next.substring(3);
// E.g. TERMINAL/CASHIER, TERMINAL/CLIENT or TERMINAL/SELFHELP
String principal = "TERMINAL/" + ou.toUpperCase();
log("Committing user auth: " + principal);
commitUserAuthentication(new String[] { principal, "TERMINAL" });
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());
} }
} }
Manifest-Version: 1.0 Manifest-Version: 1.0
Class-Path: LanBortalBeansClient.jar Class-Path: lib/LanBortalBeansClient.jar
lib/LanBortalUtilities.jar lib/LanBortalUtilities.jar
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());
}
}
...@@ -14,10 +14,12 @@ import org.slf4j.LoggerFactory; ...@@ -14,10 +14,12 @@ import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.enums.apps.BillPermission; import fi.insomnia.bortal.enums.apps.BillPermission;
import fi.insomnia.bortal.enums.apps.MapPermission; import fi.insomnia.bortal.enums.apps.MapPermission;
import fi.insomnia.bortal.enums.apps.PollPermission; import fi.insomnia.bortal.enums.apps.PollPermission;
import fi.insomnia.bortal.enums.apps.ShopPermission;
import fi.insomnia.bortal.enums.apps.SpecialPermission; import fi.insomnia.bortal.enums.apps.SpecialPermission;
import fi.insomnia.bortal.enums.apps.UserPermission; import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.facade.MenuNavigationFacade; import fi.insomnia.bortal.facade.MenuNavigationFacade;
import fi.insomnia.bortal.facade.MenuitemFacade; import fi.insomnia.bortal.facade.MenuitemFacade;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.MenuNavigation; import fi.insomnia.bortal.model.MenuNavigation;
/** /**
...@@ -45,37 +47,6 @@ public class Menubean implements MenubeanLocal { ...@@ -45,37 +47,6 @@ public class Menubean implements MenubeanLocal {
private static final Logger logger = LoggerFactory.getLogger(Menubean.class); private static final Logger logger = LoggerFactory.getLogger(Menubean.class);
@Override
public MenuNavigation getMenuNavigation(String url) {
MenuNavigation ret = navifacade.find(url, eventbean.getCurrentEvent());
logger.warn("Children at bean: {}", ret.getChildren());
return ret;
}
@Override
public List<MenuNavigation> getTopnavigations() {
return navifacade.findToplevels();
// HashMap<Menuitem, MenuNavigation> ret = new HashMap<Menuitem,
// MenuNavigation>();
//
// for (MenuNavigation navi : )
// {
//
// ret.put(navi.getItem(), navi);
// }
// ArrayList<MenuNavigation> retlist = new
// ArrayList<MenuNavigation>(ret.values());
// if (retlist.isEmpty())
// {
// initializeMenu();
// }
// logger.info("Returning topmenus: {}", retlist);
// Collections.sort(retlist);
// return retlist;
}
@RolesAllowed(SpecialPermission.S_SUPERADMIN) @RolesAllowed(SpecialPermission.S_SUPERADMIN)
@Override @Override
public void flushDefaultmenu() public void flushDefaultmenu()
...@@ -84,20 +55,22 @@ public class Menubean implements MenubeanLocal { ...@@ -84,20 +55,22 @@ public class Menubean implements MenubeanLocal {
initializeMenu(); initializeMenu();
} }
public void initializeMenu() { private synchronized void initializeMenu() {
// Frontpage
LanEvent ev = eventbean.getCurrentEvent();
MenuNavigation usernavi = new MenuNavigation(ev, "supernavi.user");
MenuNavigation frontTopnavi = new MenuNavigation(); navifacade.create(usernavi);
MenuNavigation frontTopnavi = usernavi.addPage(null, null);
frontTopnavi.setKey("topnavi.frontpage"); frontTopnavi.setKey("topnavi.frontpage");
frontTopnavi.addPage(menuitemfacade.findOrCreate("/index"), UserPermission.ANYUSER); frontTopnavi.addPage(menuitemfacade.findOrCreate("/index"), UserPermission.ANYUSER);
frontTopnavi.addPage(menuitemfacade.findOrCreate("/user/create"), UserPermission.CREATE_NEW); frontTopnavi.addPage(menuitemfacade.findOrCreate("/user/create"), UserPermission.CREATE_NEW);
frontTopnavi.addPage(menuitemfacade.findOrCreate("/auth/sendResetMail"), UserPermission.LOGIN); frontTopnavi.addPage(menuitemfacade.findOrCreate("/auth/sendResetMail"), UserPermission.LOGIN);
navifacade.create(frontTopnavi);
// User MenuNavigation userTopnavi = usernavi.addPage(null, null);
MenuNavigation userTopnavi = new MenuNavigation();
userTopnavi.setKey("topnavi.user"); userTopnavi.setKey("topnavi.user");
userTopnavi.addPage(menuitemfacade.findOrCreate("/user/edit"), UserPermission.VIEW_SELF).setHeader("submenu.user.userlinks"); userTopnavi.addPage(menuitemfacade.findOrCreate("/user/edit"), UserPermission.VIEW_SELF).setHeader("submenu.user.userlinks");
userTopnavi.addPage(menuitemfacade.findOrCreate("/user/changePassword"), null); userTopnavi.addPage(menuitemfacade.findOrCreate("/user/changePassword"), null);
userTopnavi.addPage(menuitemfacade.findOrCreate("/user/accountEvents"), null); userTopnavi.addPage(menuitemfacade.findOrCreate("/user/accountEvents"), null);
...@@ -105,28 +78,65 @@ public class Menubean implements MenubeanLocal { ...@@ -105,28 +78,65 @@ public class Menubean implements MenubeanLocal {
userTopnavi.addPage(menuitemfacade.findOrCreate("/place/insertToken"), null); userTopnavi.addPage(menuitemfacade.findOrCreate("/place/insertToken"), null);
userTopnavi.addPage(menuitemfacade.findOrCreate("/user/sendPicture"), null); userTopnavi.addPage(menuitemfacade.findOrCreate("/user/sendPicture"), null);
userTopnavi.addPage(menuitemfacade.findOrCreate("/user/list"), UserPermission.VIEW_ALL).setHeader("submenu.user.manageuserlinks"); userTopnavi.addPage(menuitemfacade.findOrCreate("/user/list"), UserPermission.VIEW_ALL).setHeader("submenu.user.manageuserlinks");
userTopnavi.addPage(menuitemfacade.findOrCreate("/user/create"), UserPermission.VIEW_ALL); userTopnavi.addPage(menuitemfacade.findOrCreate("/user/adminCreate"), UserPermission.VIEW_ALL);
userTopnavi.addPage(menuitemfacade.findOrCreate("/role/list"), UserPermission.READ_ROLES).setHeader("submenu.user.rolelinks"); userTopnavi.addPage(menuitemfacade.findOrCreate("/role/list"), UserPermission.READ_ROLES).setHeader("submenu.user.rolelinks");
userTopnavi.addPage(menuitemfacade.findOrCreate("/role/create"), UserPermission.WRITE_ROLES); userTopnavi.addPage(menuitemfacade.findOrCreate("/role/create"), UserPermission.WRITE_ROLES);
userTopnavi.addPage(menuitemfacade.findOrCreate("/user/listCardTemplates"), UserPermission.READ_ROLES); userTopnavi.addPage(menuitemfacade.findOrCreate("/user/listCardTemplates"), UserPermission.READ_ROLES);
userTopnavi.addPage(menuitemfacade.findOrCreate("/user/createCardTemplate"), UserPermission.WRITE_ROLES); userTopnavi.addPage(menuitemfacade.findOrCreate("/user/createCardTemplate"), UserPermission.WRITE_ROLES);
navifacade.create(userTopnavi);
MenuNavigation placemapTopmenu = new MenuNavigation(); MenuNavigation placemapTopmenu = usernavi.addPage(null, null);
placemapTopmenu.setKey("topnavi.placemap"); placemapTopmenu.setKey("topnavi.placemap");
placemapTopmenu.addPage(menuitemfacade.findOrCreate("/place/placemap"), MapPermission.VIEW); placemapTopmenu.addPage(menuitemfacade.findOrCreate("/place/placemap"), MapPermission.VIEW);
navifacade.create(placemapTopmenu);
MenuNavigation shopTopmenu = new MenuNavigation(); MenuNavigation shopTopmenu = usernavi.addPage(null, null);
shopTopmenu.setKey("topnavi.shop"); shopTopmenu.setKey("topnavi.shop");
shopTopmenu.addPage(menuitemfacade.findOrCreate("/shop/createBill"), BillPermission.CREATE_BILL); shopTopmenu.addPage(menuitemfacade.findOrCreate("/shop/createBill"), BillPermission.CREATE_BILL);
shopTopmenu.addPage(menuitemfacade.findOrCreate("/bill/list"), BillPermission.VIEW_OWN); shopTopmenu.addPage(menuitemfacade.findOrCreate("/bill/list"), BillPermission.VIEW_OWN);
navifacade.create(shopTopmenu);
MenuNavigation pollTopmenu = new MenuNavigation(); MenuNavigation pollTopmenu = usernavi.addPage(null, null);
pollTopmenu.setKey("topnavi.poll"); pollTopmenu.setKey("topnavi.poll");
pollTopmenu.addPage(menuitemfacade.findOrCreate("/poll/index"), PollPermission.ANSWER); pollTopmenu.addPage(menuitemfacade.findOrCreate("/poll/index"), PollPermission.ANSWER);
navifacade.create(pollTopmenu);
MenuNavigation adminnavi = new MenuNavigation(ev, "supernavi.admin");
navifacade.create(adminnavi);
MenuNavigation billnavi = adminnavi.addPage(null, null);
billnavi.setKey("topnavi.billing");
billnavi.addPage(menuitemfacade.findOrCreate("/bill/billSummary"), BillPermission.READ_ALL);
billnavi.addPage(menuitemfacade.findOrCreate("/bill/listAll"), BillPermission.WRITE_ALL);
MenuNavigation mapnavi = adminnavi.addPage(null, null);
mapnavi.setKey("topnavi.maps");
mapnavi.addPage(menuitemfacade.findOrCreate("/map/list"), MapPermission.MANAGE_MAPS);
mapnavi.addPage(menuitemfacade.findOrCreate("/map/create"), MapPermission.MANAGE_MAPS);
mapnavi.addPage(menuitemfacade.findOrCreate("/map/edit"), null).setVisible(false);
MenuNavigation prodnavi = adminnavi.addPage(null, null);
prodnavi.setKey("topnavi.products");
prodnavi.addPage(menuitemfacade.findOrCreate("/product/list"), ShopPermission.LIST_ALL_PRODUCTS);
prodnavi.addPage(menuitemfacade.findOrCreate("/product/create"), ShopPermission.MANAGE_PRODUCTS);
prodnavi.addPage(menuitemfacade.findOrCreate("/product/createDiscount"), null).setVisible(false);
}
@Override
public MenuNavigation findNavigation(String pagename) {
return navifacade.find(pagename);
} }
@Override
public List<MenuNavigation> getTopmenus() {
List<MenuNavigation> ret = navifacade.findToplevels();
if (ret == null || ret.isEmpty())
{
initializeMenu();
navifacade.flush();
ret = navifacade.findToplevels();
}
logger.info("Returning topmenus: {}", ret);
return ret;
}
} }
...@@ -7,6 +7,7 @@ import javax.annotation.security.DeclareRoles; ...@@ -7,6 +7,7 @@ import javax.annotation.security.DeclareRoles;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.SessionContext; import javax.ejb.SessionContext;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.resource.spi.IllegalStateException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -16,6 +17,7 @@ import fi.insomnia.bortal.enums.apps.ContentPermission; ...@@ -16,6 +17,7 @@ import fi.insomnia.bortal.enums.apps.ContentPermission;
import fi.insomnia.bortal.enums.apps.IAppPermission; import fi.insomnia.bortal.enums.apps.IAppPermission;
import fi.insomnia.bortal.enums.apps.MapPermission; import fi.insomnia.bortal.enums.apps.MapPermission;
import fi.insomnia.bortal.enums.apps.PollPermission; import fi.insomnia.bortal.enums.apps.PollPermission;
import fi.insomnia.bortal.enums.apps.TerminalPermission;
import fi.insomnia.bortal.enums.apps.ShopPermission; import fi.insomnia.bortal.enums.apps.ShopPermission;
import fi.insomnia.bortal.enums.apps.SpecialPermission; import fi.insomnia.bortal.enums.apps.SpecialPermission;
import fi.insomnia.bortal.enums.apps.UserPermission; import fi.insomnia.bortal.enums.apps.UserPermission;
...@@ -63,7 +65,12 @@ import fi.insomnia.bortal.model.User; ...@@ -63,7 +65,12 @@ import fi.insomnia.bortal.model.User;
SpecialPermission.S_SUPERADMIN, SpecialPermission.S_SUPERADMIN,
SpecialPermission.S_USER, SpecialPermission.S_USER,
SpecialPermission.S_ANONYMOUS SpecialPermission.S_ANONYMOUS,
TerminalPermission.S_TERMINAL,
TerminalPermission.S_CASHIER_TERMINAL,
TerminalPermission.S_CUSTOMER_TERMINAL,
TerminalPermission.S_SELFHELP_TERMINAL
}) })
public class PermissionBean implements PermissionBeanLocal { public class PermissionBean implements PermissionBeanLocal {
...@@ -161,4 +168,31 @@ public class PermissionBean implements PermissionBeanLocal { ...@@ -161,4 +168,31 @@ 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;
}
@Override
public String getCommonName() throws IllegalStateException {
String dn = context.getCallerPrincipal().getName();
String[] parts = dn.split(",");
for (String part : parts) {
if (part.trim().toUpperCase().startsWith("CN=")) {
String cn = part.substring("CN=".length());
return cn;
}
}
throw new IllegalStateException("Current security principal has no CN");
}
} }
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);
ReaderEvent ret = null; Reader reader = readerfacade.findOrCreateByIdent(readerIdent);
logger.debug("Found card by rfid: {}", card);
if (card != null) {
ret = createReaderEvent(ident, card);
// RfidEvent revent = reventcontainer.foundTag(reader, tag);
List<ReaderEvent> lastevents = readerEventFacade.findLastEvents(reader, 1);
ReaderEvent ret = null;
if (!lastevents.isEmpty())
{
ReaderEvent lastevent = lastevents.get(0);
if (card == null)
{
if (lastevent.getPrintedCard() == null && tag.equals(lastevent.getValue()))
{
ret = lastevent;
} }
return ret; } else if (card.equals(lastevent.getPrintedCard())) {
ret = lastevent;
} }
@Override }
public ReaderEvent assocTagToPlacecode(String tag, String readerIdent, String placecode) throws BortalCatchableException, PermissionDeniedException {
GroupMembership gm = gmfacade.findByToken(placecode); if (ret == null)
if (gm == null) { {
throw new BortalCatchableException("Token" + placecode + " not found!", "readerbean.tokenNotFound"); ret = createReaderEvent(reader, card);
} else {
ret.setUpdatetime(Calendar.getInstance());
}
if (card == null)
{
ret.setValue(tag);
} }
if (gm.getUser() == null) { return ret;
throw new BortalCatchableException("Token " + placecode + "found but not assoc to user!", "readerbean.userNotAssociateToMembership"); //
// if (revent.getEvent() != null) {
// ret = readerEventFacade.find(revent.getEvent().getId());
// revent.setEvent(ret);
// }
// else if (card != null) {
//
// revent.setEvent(ret);
// }
//
// return ret;
} }
PrintedCard card = cardtemplatebean.setRfidUid(tag, gm.getUser()); //
// @Override
// public ReaderEvent assocTagToPlacecode(String tag, String readerIdent,
// String placecode) throws BortalCatchableException,
// PermissionDeniedException {
//
// GroupMembership gm = gmfacade.findByToken(placecode);
// if (gm == null) {
// 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) {
return createReaderEvent(readerIdent, card); ReaderEvent ret = new ReaderEvent(Calendar.getInstance(), card, reader);
} Integer gamepoints = reader.getGamepoints();
private ReaderEvent createReaderEvent(String readerIdent, PrintedCard card) { if (gamepoints > 0 && card != null) {
int awardedCount = 0;
LanEvent ev = eventbean.getCurrentEvent(); for (ReaderEvent oldRe : reader.getEvents()) {
if (oldRe.getGamePoint() > 0)
{
++awardedCount;
Reader reader = readerfacade.findOrCreateByIdent(ev, readerIdent); // User has been already awarded points from this reader.
logger.debug("Creating new readerevent for reader {} and events {}", reader, reader.getMaxEvents()); // Not awarding again...
logger.debug("maxevents for reder {}. readerevents at the moment {}", reader.getMaxEvents(), reader.getEvents().size()); if (oldRe.getPrintedCard().equals(card)) {
if (reader.getMaxEvents() > 0 && reader.getMaxEvents() <= reader.getEvents().size()) { gamepoints = 0;
logger.debug("Max events {} found. returning null"); break;
return null;
} }
if (reader.getGamepoints() > 0 && card.getUser() != null) {
logger.debug("Checking if user has been here");
for (ReaderEvent oldRe : card.getReaderEvents()) {
if (oldRe.getReader().getId().equals(reader.getId())) {
logger.debug("Found already an event for user! returning null");
return null;
} }
} }
// if points can be awarded only limited times...
if (reader.getMaxEvents() > 0 && reader.getMaxEvents() > awardedCount) {
gamepoints = 0;
} }
ReaderEvent ret = new ReaderEvent(Calendar.getInstance(), card, reader);
ret.setGamePoint(reader.getGamepoints()); }
ret.setReader(reader);
ret.setGamePoint(gamepoints);
reader.getEvents().add(ret); reader.getEvents().add(ret);
if (card != null)
{
card.getReaderEvents().add(ret); card.getReaderEvents().add(ret);
cardfacade.merge(card); }
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.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateful;
import javax.resource.spi.IllegalStateException;
import fi.insomnia.bortal.facade.SalesEntityFacade;
import fi.insomnia.bortal.model.salespoint.SalesEntity;
import fi.insomnia.bortal.model.salespoint.Salespoint;
import fi.insomnia.bortal.salespoint.SalespointSessionManager;
/**
* Session Bean implementation class SalesEntitySessionBean
*/
@Stateful
@LocalBean
public class SalesEntitySessionBean implements SalesEntitySessionBeanLocal {
@EJB
PermissionBeanLocal permissionBean;
@EJB
SalespointContainerBeanLocal salespointContainer;
@EJB
SalesEntityFacade salesEntityFacade;
private SalespointSessionManager sessionManager = null;
public SalesEntitySessionBean() {
}
public SalespointSessionManager getSessionManager()
throws IllegalStateException {
if (sessionManager == null) {
String cn = permissionBean.getCommonName();
sessionManager = getSessionManagerByCommonName(cn);
}
return sessionManager;
}
private SalespointSessionManager getSessionManagerByCommonName(String cn) {
SalesEntity salesEntity = salesEntityFacade.findByCN(cn);
if (salesEntity == null)
throw new IllegalArgumentException(
"There is no SalesEntity with CN=" + cn);
Salespoint salespoint = salesEntity.getPoint();
if (salespoint == null)
throw new IllegalArgumentException("SalesEntity (CN=" + cn
+ ") is not associated with Salespoint");
return salespointContainer.getSessionManagerBySalespointId(salespoint
.getId());
}
}
package fi.insomnia.bortal.beans;
import java.util.HashMap;
import javax.ejb.LocalBean;
import javax.ejb.Singleton;
import fi.insomnia.bortal.salespoint.SalespointSessionManager;
/**
* Keeps track of active Salespoint sessions
*/
@Singleton
@LocalBean
public class SalespointContainerBean implements SalespointContainerBeanLocal {
// Salespoint.Id -> SalespointSessionManager
HashMap<Integer, SalespointSessionManager> sessionManagers = new HashMap<Integer, SalespointSessionManager>();
@Override
public SalespointSessionManager getSessionManagerBySalespointId(Integer id) {
if (!sessionManagers.containsKey(id)) {
sessionManagers.put(id, new SalespointSessionManager(id));
}
return sessionManagers.get(id);
}
}
...@@ -11,20 +11,9 @@ import javax.persistence.criteria.CriteriaBuilder; ...@@ -11,20 +11,9 @@ 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.model.AccountEvent;
import fi.insomnia.bortal.model.AccountEvent_;
import fi.insomnia.bortal.model.ActionLogMessage; import fi.insomnia.bortal.model.ActionLogMessage;
import fi.insomnia.bortal.model.ActionLogMessageResponse; import fi.insomnia.bortal.model.ActionLogMessageResponse;
import fi.insomnia.bortal.model.ActionLogMessageResponse_; import fi.insomnia.bortal.model.ActionLogMessageResponse_;
import fi.insomnia.bortal.model.Bill;
import fi.insomnia.bortal.model.Bill_;
import fi.insomnia.bortal.model.EventPk;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.LogEntry;
import fi.insomnia.bortal.model.Product_;
import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.Role_;
import fi.insomnia.bortal.model.User;
@Stateless @Stateless
@LocalBean @LocalBean
......
package fi.insomnia.bortal.facade; package fi.insomnia.bortal.facade;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
...@@ -11,8 +10,6 @@ import javax.persistence.PersistenceContext; ...@@ -11,8 +10,6 @@ import javax.persistence.PersistenceContext;
import javax.persistence.Query; import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root; import javax.persistence.criteria.Root;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -20,10 +17,8 @@ import org.slf4j.LoggerFactory; ...@@ -20,10 +17,8 @@ import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.EventBean; import fi.insomnia.bortal.beans.EventBean;
import fi.insomnia.bortal.beans.PermissionBeanLocal; import fi.insomnia.bortal.beans.PermissionBeanLocal;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.MenuNavigation; import fi.insomnia.bortal.model.MenuNavigation;
import fi.insomnia.bortal.model.MenuNavigation_; import fi.insomnia.bortal.model.MenuNavigation_;
import fi.insomnia.bortal.model.Menuitem;
import fi.insomnia.bortal.model.Menuitem_; import fi.insomnia.bortal.model.Menuitem_;
@Stateless @Stateless
...@@ -53,8 +48,7 @@ public class MenuNavigationFacade extends GenericFacade<Integer, MenuNavigation> ...@@ -53,8 +48,7 @@ public class MenuNavigationFacade extends GenericFacade<Integer, MenuNavigation>
return em; return em;
} }
public MenuNavigation find(String url, LanEvent event) { public MenuNavigation find(String url) {
logger.debug("Finding MenuNavigation with url {}", url);
if (url == null || url.isEmpty()) if (url == null || url.isEmpty())
{ {
return null; return null;
...@@ -62,71 +56,37 @@ public class MenuNavigationFacade extends GenericFacade<Integer, MenuNavigation> ...@@ -62,71 +56,37 @@ public class MenuNavigationFacade extends GenericFacade<Integer, MenuNavigation>
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MenuNavigation> cq = cb.createQuery(MenuNavigation.class); CriteriaQuery<MenuNavigation> cq = cb.createQuery(MenuNavigation.class);
Root<MenuNavigation> root = cq.from(MenuNavigation.class); Root<MenuNavigation> root = cq.from(MenuNavigation.class);
Predicate eventFilter = null;
if (event == null)
{
eventFilter = cb.isNull(root.get(MenuNavigation_.event));
} else {
eventFilter = cb.equal(root.get(MenuNavigation_.event), event);
}
cq.where(cb.equal(root.get(MenuNavigation_.item).get(Menuitem_.url), url), eventFilter); cq.where(
cq.orderBy(cb.asc(root.get(MenuNavigation_.sort))); cb.equal(root.get(MenuNavigation_.item).get(Menuitem_.url), url),
List<MenuNavigation> results = em.createQuery(cq).getResultList(); cb.equal(root.get(MenuNavigation_.event), eventbean.getCurrentEvent())
);
MenuNavigation ret = null; return super.getSingleNullableResult(em.createQuery(cq));
for (MenuNavigation navi : results)
{
if (permbean.hasPermission(navi.getPermission()))
{
ret = navi;
}
}
if (ret == null && !results.isEmpty())
{
ret = results.get(0);
}
if (ret == null)
{
if (event != null)
{
return find(url, null);
} else {
Menuitem item = menuitemfacade.findOrCreate(url);
if (item.getNavigations() == null || item.getNavigations().isEmpty())
{
ret = new MenuNavigation();
ret.setItem(item);
ret.setEvent(null);
item.setNavigations(new ArrayList<MenuNavigation>());
item.getNavigations().add(ret);
}
}
}
return ret;
} }
/** /**
* Returns top level navigations for BOTH default and current event Results * Returns top level navigations
* have to be filtered for duplicates to get correct result!!
* *
* @param event * @param event
* @return * @return //
*/ */
public List<MenuNavigation> findToplevels() { public List<MenuNavigation> findToplevels() {
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MenuNavigation> cq = cb.createQuery(MenuNavigation.class); CriteriaQuery<MenuNavigation> cq = cb.createQuery(MenuNavigation.class);
Root<MenuNavigation> root = cq.from(MenuNavigation.class); Root<MenuNavigation> root = cq.from(MenuNavigation.class);
Path<LanEvent> eventpath = root.get(MenuNavigation_.event); cq.where(cb.isNull(root.get(MenuNavigation_.parent)),
cq.where(cb.isNull(root.get(MenuNavigation_.parent)), cb.or(cb.equal(eventpath, eventbean.getCurrentEvent()), cb.isNull(eventpath)), cb.isTrue(root.get(MenuNavigation_.visible))); cb.equal(root.get(MenuNavigation_.event), eventbean.getCurrentEvent()),
cb.isTrue(root.get(MenuNavigation_.visible)));
return em.createQuery(cq).getResultList(); return em.createQuery(cq).getResultList();
} }
public void deleteAllDefaults() { public void deleteAllDefaults() {
Query q = em.createQuery("delete from MenuNavigation where parent is null"); Query q = em.createQuery("delete from MenuNavigation where event = :event");
q.setParameter("event", eventbean.getCurrentEvent());
q.executeUpdate(); q.executeUpdate();
} }
......
...@@ -28,6 +28,9 @@ public class MenuitemFacade extends GenericFacade<Integer, Menuitem> { ...@@ -28,6 +28,9 @@ public class MenuitemFacade extends GenericFacade<Integer, Menuitem> {
} }
public Menuitem findOrCreate(String url) { public Menuitem findOrCreate(String url) {
if (url == null || url.isEmpty()) {
return null;
}
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Menuitem> cq = cb.createQuery(Menuitem.class); CriteriaQuery<Menuitem> cq = cb.createQuery(Menuitem.class);
Root<Menuitem> root = cq.from(Menuitem.class); Root<Menuitem> root = cq.from(Menuitem.class);
......
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();
}
} }
...@@ -4,23 +4,21 @@ import javax.ejb.LocalBean; ...@@ -4,23 +4,21 @@ 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.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import fi.insomnia.bortal.enums.EventStatusEnum; import fi.insomnia.bortal.model.salespoint.SalesEntity;
import fi.insomnia.bortal.model.EventStatus;
import fi.insomnia.bortal.model.EventStatus_;
/**
* Session Bean implementation class SalesEntityFacade
*/
@Stateless @Stateless
@LocalBean @LocalBean
public class EventStatusFacade extends GenericFacade<Integer, EventStatus> { public class SalesEntityFacade extends GenericFacade<Integer, SalesEntity>{
@PersistenceContext @PersistenceContext
private EntityManager em; private EntityManager em;
public EventStatusFacade() { public SalesEntityFacade() {
super(EventStatus.class); super(SalesEntity.class);
} }
@Override @Override
...@@ -28,19 +26,9 @@ public class EventStatusFacade extends GenericFacade<Integer, EventStatus> { ...@@ -28,19 +26,9 @@ public class EventStatusFacade extends GenericFacade<Integer, EventStatus> {
return em; return em;
} }
public EventStatus findEventStatus(EventStatusEnum eventStatusEnum) { public SalesEntity findByCN(String cn) {
// @NamedQuery(name = "EventStatus.findByStatusName", query = // TODO Auto-generated method stub
// "SELECT e FROM EventStatus e WHERE e.name = :name") }) return null;
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.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();
}
...@@ -9,9 +9,12 @@ import fi.insomnia.bortal.model.MenuNavigation; ...@@ -9,9 +9,12 @@ import fi.insomnia.bortal.model.MenuNavigation;
@Local @Local
public interface MenubeanLocal { public interface MenubeanLocal {
MenuNavigation getMenuNavigation(String url); // List<MenuNavigation> getTopnavigations();
List<MenuNavigation> getTopnavigations();
void flushDefaultmenu(); void flushDefaultmenu();
MenuNavigation findNavigation(String pagename);
List<MenuNavigation> getTopmenus();
} }
package fi.insomnia.bortal.beans; package fi.insomnia.bortal.beans;
import javax.ejb.Local; import javax.ejb.Local;
import javax.resource.spi.IllegalStateException;
import fi.insomnia.bortal.enums.apps.IAppPermission; import fi.insomnia.bortal.enums.apps.IAppPermission;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
...@@ -24,6 +25,15 @@ public interface PermissionBeanLocal { ...@@ -24,6 +25,15 @@ public interface PermissionBeanLocal {
User getAnonUser(); User getAnonUser();
String getPrincipal();
/**
* Get common name of the logged in cert like "customer-01"
* @return CN of the certificate
* @throws IllegalStateException Principal has no CN
*/
String getCommonName() throws IllegalStateException;
// 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;
import javax.resource.spi.IllegalStateException;
import fi.insomnia.bortal.salespoint.SalespointSessionManager;
@Local
public interface SalesEntitySessionBeanLocal {
SalespointSessionManager getSessionManager() throws IllegalStateException;
}
package fi.insomnia.bortal.beans;
import javax.ejb.Local;
import fi.insomnia.bortal.salespoint.SalespointSessionManager;
@Local
public interface SalespointContainerBeanLocal {
SalespointSessionManager getSessionManagerBySalespointId(Integer id);
}
package fi.insomnia.bortal.salespoint;
import java.util.ArrayList;
public class Cart {
ArrayList<CartItem> cartItems;
}
package fi.insomnia.bortal.salespoint;
import java.math.BigDecimal;
import fi.insomnia.bortal.model.Product;
public class CartItem {
Product product;
BigDecimal quantity;
public String getName() {
return "foo";
}
public BigDecimal getQuantity() {
return new BigDecimal(0);
}
public BigDecimal getUnitPrice() {
return new BigDecimal(0);
}
public BigDecimal getTotal() {
return getUnitPrice().multiply(getQuantity());
}
}
package fi.insomnia.bortal.salespoint;
import fi.insomnia.bortal.model.User;
public class SalesSession {
User cashierUser;
User customerUser;
Cart shoppingCart;
}
package fi.insomnia.bortal.salespoint;
import java.util.ArrayList;
import fi.insomnia.bortal.model.salespoint.SalesEntity;
import fi.insomnia.bortal.model.salespoint.Salespoint;
/**
* Manages sessions of one Salespoint
* @author jkj
*
*/
public class SalespointSessionManager {
Integer salespointId;
public SalespointSessionManager(Integer id) {
salespointId = id;
}
Salespoint salespoint;
SalesEntity cashier;
SalesEntity customer;
ArrayList<SalesSession> session;
}
...@@ -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>
......
...@@ -9,9 +9,11 @@ import javax.persistence.Column; ...@@ -9,9 +9,11 @@ import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.EnumType; import javax.persistence.EnumType;
import javax.persistence.Enumerated; import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne; import javax.persistence.ManyToOne;
import javax.persistence.OneToMany; import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table; import javax.persistence.Table;
import javax.persistence.Temporal; import javax.persistence.Temporal;
import javax.persistence.TemporalType; import javax.persistence.TemporalType;
...@@ -43,7 +45,8 @@ public class ActionLogMessage extends GenericEntity { ...@@ -43,7 +45,8 @@ public class ActionLogMessage extends GenericEntity {
@OneToMany(mappedBy = "actionLogMessage", cascade = CascadeType.ALL) @OneToMany(mappedBy = "actionLogMessage", cascade = CascadeType.ALL)
@PrivateOwned @PrivateOwned
private List<ActionLogMessageResponse> actionlogMessageResponses = new ArrayList<ActionLogMessageResponse>(); @OrderBy("id")
private List<ActionLogMessageResponse> actionLogMessageResponses = new ArrayList<ActionLogMessageResponse>();
@Column(name = "state", nullable = true) @Column(name = "state", nullable = true)
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
...@@ -89,4 +92,12 @@ public class ActionLogMessage extends GenericEntity { ...@@ -89,4 +92,12 @@ public class ActionLogMessage extends GenericEntity {
this.state = state; this.state = state;
} }
public List<ActionLogMessageResponse> getActionLogMessageResponses() {
return actionLogMessageResponses;
}
public void setActionLogMessageResponses(List<ActionLogMessageResponse> actionLogMessageResponses) {
this.actionLogMessageResponses = actionLogMessageResponses;
}
} }
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;
}
} }
...@@ -8,7 +8,6 @@ import java.util.List; ...@@ -8,7 +8,6 @@ import java.util.List;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.Lob; import javax.persistence.Lob;
import javax.persistence.ManyToOne; import javax.persistence.ManyToOne;
...@@ -16,6 +15,7 @@ import javax.persistence.OneToMany; ...@@ -16,6 +15,7 @@ import javax.persistence.OneToMany;
import javax.persistence.OrderBy; import javax.persistence.OrderBy;
import javax.persistence.Table; import javax.persistence.Table;
import javax.persistence.Transient; import javax.persistence.Transient;
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;
...@@ -25,16 +25,22 @@ import fi.insomnia.bortal.enums.BortalApplication; ...@@ -25,16 +25,22 @@ import fi.insomnia.bortal.enums.BortalApplication;
import fi.insomnia.bortal.enums.apps.IAppPermission; import fi.insomnia.bortal.enums.apps.IAppPermission;
@Entity @Entity
@Table(name = "menu_navigation") @Table(name = "menu_navigation",
// uniqueConstraints = { @UniqueConstraint(columnNames = { uniqueConstraints = { @UniqueConstraint(columnNames = {
// MenuNavigation.ITEM_COLUMN, MenuNavigation.EVENT_COLUMN }) }) MenuNavigation.ITEM_COLUMN,
MenuNavigation.EVENT_COLUMN })
})
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS) @OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class MenuNavigation extends GenericEntity implements Comparable<MenuNavigation> { public class MenuNavigation extends GenericEntity implements Comparable<MenuNavigation> {
private static final long serialVersionUID = 1404769998091479699L; private static final long serialVersionUID = 1404769998091479699L;
protected static final String EVENT_COLUMN = "event_id";
protected static final String ITEM_COLUMN = "item_id"; protected static final String ITEM_COLUMN = "item_id";
protected static final String EVENT_COLUMN = "event_id";
@ManyToOne
@JoinColumn(nullable = false, name = EVENT_COLUMN)
private LanEvent event;
@Lob @Lob
private String key; private String key;
...@@ -57,14 +63,10 @@ public class MenuNavigation extends GenericEntity implements Comparable<MenuNavi ...@@ -57,14 +63,10 @@ public class MenuNavigation extends GenericEntity implements Comparable<MenuNavi
private SitePage sitepage; private SitePage sitepage;
@ManyToOne @ManyToOne
@JoinColumn(nullable = true, name = EVENT_COLUMN)
private LanEvent event;
@ManyToOne
@JoinColumn(nullable = true) @JoinColumn(nullable = true)
private MenuNavigation parent; private MenuNavigation parent;
@OneToMany(mappedBy = "parent", cascade = ALL, fetch = FetchType.EAGER) @OneToMany(mappedBy = "parent", cascade = ALL)
@PrivateOwned @PrivateOwned
@OrderBy("sort") @OrderBy("sort")
private List<MenuNavigation> children = new ArrayList<MenuNavigation>(); private List<MenuNavigation> children = new ArrayList<MenuNavigation>();
...@@ -76,6 +78,17 @@ public class MenuNavigation extends GenericEntity implements Comparable<MenuNavi ...@@ -76,6 +78,17 @@ public class MenuNavigation extends GenericEntity implements Comparable<MenuNavi
private String application; private String application;
private String permission; private String permission;
private MenuNavigation() {
super();
}
public MenuNavigation(LanEvent ev, String keyString) {
super();
this.event = ev;
this.key = keyString;
this.visible = true;
}
public BortalApplication getApplication() { public BortalApplication getApplication() {
if (privateApp == null && application != null) { if (privateApp == null && application != null) {
privateApp = BortalApplication.valueOf(application); privateApp = BortalApplication.valueOf(application);
...@@ -123,14 +136,6 @@ public class MenuNavigation extends GenericEntity implements Comparable<MenuNavi ...@@ -123,14 +136,6 @@ public class MenuNavigation extends GenericEntity implements Comparable<MenuNavi
this.parent = parent; this.parent = parent;
} }
public LanEvent getEvent() {
return event;
}
public void setEvent(LanEvent event) {
this.event = event;
}
public Menuitem getItem() { public Menuitem getItem() {
return item; return item;
} }
...@@ -182,8 +187,12 @@ public class MenuNavigation extends GenericEntity implements Comparable<MenuNavi ...@@ -182,8 +187,12 @@ public class MenuNavigation extends GenericEntity implements Comparable<MenuNavi
children = new ArrayList<MenuNavigation>(); children = new ArrayList<MenuNavigation>();
} }
MenuNavigation add = new MenuNavigation(); MenuNavigation add = new MenuNavigation();
if (item != null)
{
add.setKey("submenu" + item.getUrl().replace("/", ".")); add.setKey("submenu" + item.getUrl().replace("/", "."));
}
add.setItem(item); add.setItem(item);
add.setEvent(event);
add.setPermission(permission); add.setPermission(permission);
add.setParent(this); add.setParent(this);
add.setVisible(true); add.setVisible(true);
...@@ -200,4 +209,12 @@ public class MenuNavigation extends GenericEntity implements Comparable<MenuNavi ...@@ -200,4 +209,12 @@ public class MenuNavigation extends GenericEntity implements Comparable<MenuNavi
this.sitepage = sitepage; this.sitepage = sitepage;
} }
public LanEvent getEvent() {
return event;
}
public void setEvent(LanEvent event) {
this.event = event;
}
} }
...@@ -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();
}
} }
...@@ -93,4 +93,9 @@ public class SitePage extends GenericEntity { ...@@ -93,4 +93,9 @@ public class SitePage extends GenericEntity {
this.allowedRoles = allowedRoles; this.allowedRoles = allowedRoles;
} }
public String getUrl()
{
return new StringBuilder("/page/?id=").append(getId()).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-08T13:33:11.092+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, String> secret;
public static volatile SingularAttribute<SalesEntity, SalesEntityType> type;
public static volatile SingularAttribute<SalesEntity, Reader> reader;
public static volatile SingularAttribute<SalesEntity, Salespoint> point;
}
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>
<!--
<navigation-rule>
<from-view-id>/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>redirect-to-cashier</from-outcome>
<to-view-id>cashier.wtf</to-view-id>
<redirect />
</navigation-case>
<navigation-case>
<from-outcome>redirect-to-client</from-outcome>
<to-view-id>customer.wtf</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
-->
<factory>
<exception-handler-factory>fi.insomnia.bortal.terminal.exceptions.BortalTerminalExceptionHandlerFactory</exception-handler-factory>
</factory>
</faces-config>
<?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>
<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"
xmlns:salespoint="http://java.sun.com/jsf/composite/salespoint">
<h:head>
<title></title>
</h:head>
<h:body>
<ui:composition template="/layout/#{sessionHandler.layout}.xhtml">
<f:metadata>
<f:event type="preRenderView" listener="#{cashierView.initCreateView}" />
</f:metadata>
<ui:define name="content">
<h1>Salespoint cashier mode</h1>
<p>#{testView.getPrincipal()}</p>
<salespoint:cart/>
</ui:define>
</ui:composition>
</h:body>
</html>
<!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"
xmlns:salespoint="http://java.sun.com/jsf/composite/salespoint">
<h:head>
<title></title>
</h:head>
<h:body>
<ui:composition template="/layout/#{sessionHandler.layout}.xhtml">
<f:metadata>
<f:event type="preRenderView"
listener="#{customerView.initCreateView}" />
</f:metadata>
<ui:define name="content">
<h1>Salespoint customer mode</h1>
<p>#{testView.getPrincipal()}</p>
<salespoint:cart/>
</ui:define>
</ui:composition>
</h:body>
</html>
<!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>
<!-- Just redirect to /cashier or /customer -->
<f:metadata>
<f:event type="preRenderView"
listener="#{redirectView.redirectByPermissions()}" />
</f:metadata>
<h1>What kind of certificate is that?</h1>
</h:body>
</html>
<?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/default.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
<!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:tools="http://java.sun.com/jsf/composite/tools"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title></title>
</h:head>
<h:body>
<ui:composition template="/layout/#{sessionHandler.layout}.xhtml">
<ui:param name="thispage" value="page.permissionDenied" />
<ui:define name="content">
<h1>#{i18n['permissiondenied.header']}</h1>
<p>
<h:outputText rendered="#{!sessionHandler.isLoggedIn()}"
value="#{i18n['permissiondenied.notLoggedIn']}" />
<h:outputText rendered="#{sessionHandler.isLoggedIn()}"
value="#{i18n['permissiondenied.alreadyLoggedIn']}" />
</p>
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<composite:interface>
</composite:interface>
<composite:implementation>
<h:dataTable styleClass="bordertable" id="items"
value="#{cartView.items}" var="cartItem">
<h:column>
<f:facet name="header">
<h:link value="#{i18n['cart.item']}" includeViewParams="true" />
</f:facet>
<h:outputText value="#{cartItem.name}" />
</h:column>
<h:column>
<f:facet name="header">
<h:link value="#{i18n['cart.item_quantity']}"
includeViewParams="true" />
</f:facet>
<h:outputText value="#{cartItem.quantity}" />
</h:column>
<h:column>
<f:facet name="header">
<h:link value="#{i18n['cart.item_unitprice']}"
includeViewParams="true" />
</f:facet>
<h:outputText value="#{cartItem.unitPrice}" />
</h:column>
<h:column>
<f:facet name="header">
<h:link value="#{i18n['cart.item_total']}"
includeViewParams="true" />
</f:facet>
<h:outputText value="#{cartItem.total}" />
</h:column>
</h:dataTable>
<div class="cart_total">
#{i18n['cart.total']} #{cartView.total}
</div>
</composite:implementation>
</html>
\ No newline at end of file
body {
background-color: pink;
}
\ 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";
return "default";
}
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=Lanisofta
cart.item=Aihe
cart.item_quantity=Mr
cart.item_unitprice=Yksikkhinta
cart.item_total=Summa
cart.total=Kokonaissumma
package fi.insomnia.bortal.terminal.view;
import java.io.Serializable;
import javax.ejb.EJB;
import javax.enterprise.context.Conversation;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
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.enums.apps.IAppPermission;
import fi.insomnia.bortal.model.EventPk;
import fi.insomnia.bortal.terminal.handler.NavigationHandler;
import fi.insomnia.bortal.utilities.I18n;
public abstract class AbstractView implements Serializable {
private static final long serialVersionUID = 4025432447507222251L;
@Inject
private Conversation conversation;
private static final Logger logger = LoggerFactory
.getLogger(AbstractView.class);
@Inject
protected NavigationHandler navihandler;
@EJB
protected PermissionBeanLocal permbean;
@EJB
private EventBeanLocal eventbean;
public void beginConversation() {
if (conversation.isTransient()) {
conversation.begin();
}
}
protected EventPk getPk(int id) {
return new EventPk(eventbean.getCurrentEvent().getId(), id);
}
public boolean hasPermission(IAppPermission perm) {
return permbean.hasPermission(perm);
}
protected boolean requirePermissions(IAppPermission perm,
boolean... externalChecks) {
boolean ret = requirePermissions(hasPermission(perm));
if (ret && externalChecks.length > 0) {
ret = requirePermissions(externalChecks);
}
if (!ret) {
logger.warn("Permission required failed for {}", perm.getFullName());
}
return ret;
}
protected boolean requirePermissions(boolean... externalChecks) {
boolean ret = true;
for (boolean check : externalChecks) {
if (!check) {
ret = false;
break;
}
}
if (!ret) {
FacesContext fcont = FacesContext.getCurrentInstance();
HttpServletRequest req = (HttpServletRequest) fcont
.getExternalContext().getRequest();
StringBuilder viewidbuilder = new StringBuilder().append(
req.getContextPath()).append(req.getServletPath());
if (req.getQueryString() != null) {
viewidbuilder.append("?").append(req.getQueryString());
}
navihandler.saveDestination(viewidbuilder.toString());
logger.debug("Permission denied. Saving navi {} for later use",
viewidbuilder.toString());
// navihandler.navigateTo("/permissionDenied");
fcont.getApplication().getNavigationHandler()
.handleNavigation(fcont, null, "/permissionDenied");
}
return ret;
}
protected void addFaceMessage(String string, Object... params) {
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(I18n.get(string, params)));
}
}
package fi.insomnia.bortal.terminal.view;
import java.math.BigDecimal;
import javax.ejb.EJB;
import javax.inject.Named;
import javax.resource.spi.IllegalStateException;
import fi.insomnia.bortal.beans.SalesEntitySessionBeanLocal;
import fi.insomnia.bortal.beans.SalespointContainerBeanLocal;
import fi.insomnia.bortal.salespoint.CartItem;
import fi.insomnia.bortal.salespoint.SalespointSessionManager;
@Named
public class CartView extends AbstractView {
private static final long serialVersionUID = 9041477262092320847L;
@EJB
SalesEntitySessionBeanLocal sessionBean;
public CartItem[] getItems() throws IllegalStateException {
SalespointSessionManager sessionManager = sessionBean.getSessionManager();
return new CartItem[] { new CartItem(), new CartItem() };
}
public BigDecimal getTotal() throws IllegalStateException {
CartItem[] cartItems = getItems();
BigDecimal result = new BigDecimal(0);
for (int i = 0; i < cartItems.length; i++) {
result = result.add(cartItems[i].getTotal());
}
return result;
}
}
package fi.insomnia.bortal.terminal.view;
import javax.inject.Named;
import fi.insomnia.bortal.enums.apps.TerminalPermission;
@Named
public class CashierView extends AbstractView {
private static final long serialVersionUID = -4415449134790807417L;
public void initCreateView() {
if (super.requirePermissions(TerminalPermission.CASHIER)) {
super.beginConversation();
}
}
}
package fi.insomnia.bortal.terminal.view;
import javax.inject.Named;
import fi.insomnia.bortal.enums.apps.TerminalPermission;
@Named
public class CustomerView extends AbstractView {
private static final long serialVersionUID = -8746462342138568821L;
public void initCreateView() {
if (super.requirePermissions(TerminalPermission.CUSTOMER)) {
super.beginConversation();
}
}
}
package fi.insomnia.bortal.terminal.view;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import fi.insomnia.bortal.beans.PermissionBeanLocal;
import fi.insomnia.bortal.enums.apps.TerminalPermission;
@Named
public class RedirectView {
@EJB
PermissionBeanLocal permissionBean;
public void redirectByPermissions() throws Exception {
FacesContext fcont = FacesContext.getCurrentInstance();
if (permissionBean.hasPermission(TerminalPermission.CASHIER)) {
fcont.getApplication().getNavigationHandler()
.handleNavigation(fcont, null, "/cashier");
} else if (permissionBean.hasPermission(TerminalPermission.CUSTOMER)) {
fcont.getApplication().getNavigationHandler()
.handleNavigation(fcont, null, "/customer");
} else {
throw new Exception("You have a funny type of client certificate");
}
}
}
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
@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();
}
}
...@@ -3,5 +3,10 @@ package fi.insomnia.bortal.enums; ...@@ -3,5 +3,10 @@ package fi.insomnia.bortal.enums;
public enum ActionLogMessageState { public enum ActionLogMessageState {
NEW, NEW,
PENDING, PENDING,
DONE DONE;
public String getKey(){
return "actionlog.messagestate." + name();
}
} }
...@@ -5,6 +5,7 @@ import fi.insomnia.bortal.enums.apps.ContentPermission; ...@@ -5,6 +5,7 @@ import fi.insomnia.bortal.enums.apps.ContentPermission;
import fi.insomnia.bortal.enums.apps.IAppPermission; import fi.insomnia.bortal.enums.apps.IAppPermission;
import fi.insomnia.bortal.enums.apps.MapPermission; import fi.insomnia.bortal.enums.apps.MapPermission;
import fi.insomnia.bortal.enums.apps.PollPermission; import fi.insomnia.bortal.enums.apps.PollPermission;
import fi.insomnia.bortal.enums.apps.TerminalPermission;
import fi.insomnia.bortal.enums.apps.ShopPermission; import fi.insomnia.bortal.enums.apps.ShopPermission;
import fi.insomnia.bortal.enums.apps.UserPermission; import fi.insomnia.bortal.enums.apps.UserPermission;
...@@ -18,7 +19,8 @@ public enum BortalApplication { ...@@ -18,7 +19,8 @@ public enum BortalApplication {
POLL("Poll stuff", PollPermission.class), POLL("Poll stuff", PollPermission.class),
MAP("Map management ", MapPermission.class), MAP("Map management ", MapPermission.class),
SHOP("Product & shop management", ShopPermission.class), SHOP("Product & shop management", ShopPermission.class),
CONTENT("News, pages and other dynamic content", ContentPermission.class), ; CONTENT("News, pages and other dynamic content", ContentPermission.class),
TERMINAL("Sales and self help terminal roles", TerminalPermission.class);
// BILL("View all bills(r), Mark paid & modify(w), and create own bills (x)", // BILL("View all bills(r), Mark paid & modify(w), and create own bills (x)",
// BillPermission.class) // BillPermission.class)
// USER_MANAGEMENT("View all users(r), modify users(w), execute actions for user(x) "), // USER_MANAGEMENT("View all users(r), modify users(w), execute actions for user(x) "),
......
...@@ -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
}
package fi.insomnia.bortal.enums.apps;
import fi.insomnia.bortal.enums.BortalApplication;
/**
* "Terminals" are computers that log in with certificate and provide Salespoint
* cashier or client functions or self help terminal functions.
*
* @author jkj
*
*/
public enum TerminalPermission implements IAppPermission {
CASHIER("Access cashier terminal functions"), CUSTOMER(
"Access client terminal functions"), SELFHELP("Self help terminal");
public static final String S_TERMINAL = "TERMINAL";
public static final String S_CASHIER_TERMINAL = "TERMINAL/CASHIER";
public static final String S_CUSTOMER_TERMINAL = "TERMINAL/CUSTOMER";
public static final String S_SELFHELP_TERMINAL = "TERMINAL/SELFHELP";
private final String description;
private final String fullName;
private TerminalPermission(String desc) {
this.description = desc;
fullName = new StringBuilder().append(getParent().toString())
.append(DELIMITER).append(toString()).toString();
}
@Override
public String getDescription() {
return this.description;
}
@Override
public BortalApplication getParent() {
return BortalApplication.TERMINAL;
}
@Override
public String getFullName() {
return fullName;
}
}
<!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
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
</tr> </tr>
<tr> <tr>
<td><h:outputText class="taskHeader" value="#{i18n['actionlog.state']}: " /></td> <td><h:outputText class="taskHeader" value="#{i18n['actionlog.state']}: " /></td>
<td><h:outputText value="#{taskModificationView.message.state}" /></td> <td><h:outputText value="#{i18n[taskModificationView.message.state.key]}" /></td>
</tr> </tr>
<tr> <tr>
<td><h:outputText class="taskHeader" value="#{i18n['actionlog.message']}: " /></td> <td><h:outputText class="taskHeader" value="#{i18n['actionlog.message']}: " /></td>
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
<f:facet name="header"> <f:facet name="header">
<h:outputText value="tilanvaihdos" /> <h:outputText value="tilanvaihdos" />
</f:facet> </f:facet>
<h:outputText value="#{response.stateChange}" /> <h:outputText value="#{i18n[response.stateChange.key]}" />
</h:column> </h:column>
</h:dataTable> </h:dataTable>
......
...@@ -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>
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,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" />
<ui:define name="content"> <ui:define name="content">
<h1><h:outputText value="#{i18n['resetMail.header']}" /></h1> <h1><h:outputText value="#{i18n['resetMail.header']}" /></h1>
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" <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:bills="http://java.sun.com/jsf/composite/tools/bills"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:bills="http://java.sun.com/jsf/composite/tools/bills"
xmlns:f="http://java.sun.com/jsf/core"> xmlns:f="http://java.sun.com/jsf/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.bill.billSummary" /> <f:metadata>
<f:event type="preRenderView" listener="#{billListView.initSummaryView}" />
</f:metadata>
<ui:define name="content"> <ui:define name="content">
<h:dataTable border="0" id="billSummary" value="#{billView.billLineSummary}" var="sumline"> <h:dataTable border="0" id="billSummary" value="#{billListView.billsummary}" var="sumline">
<h:column> <h:column>
<f:facet name="header"> <f:facet name="header">
<h:outputText value="${i18n['product.name']}" /> <h:outputText value="${i18n['product.name']}" />
...@@ -22,7 +20,7 @@ ...@@ -22,7 +20,7 @@
<f:facet name="header"> <f:facet name="header">
<h:outputText value="${i18n['product.boughtTotal']}" /> <h:outputText value="${i18n['product.boughtTotal']}" />
</f:facet> </f:facet>
<h:outputText value="#{sumline.total}" > <h:outputText value="#{sumline.total}">
<f:convertNumber /> <f:convertNumber />
</h:outputText> </h:outputText>
</h:column> </h:column>
...@@ -30,7 +28,7 @@ ...@@ -30,7 +28,7 @@
<f:facet name="header"> <f:facet name="header">
<h:outputText value="${i18n['product.paid']}" /> <h:outputText value="${i18n['product.paid']}" />
</f:facet> </f:facet>
<h:outputText value="#{sumline.paid}" > <h:outputText value="#{sumline.paid}">
<f:convertNumber /> <f:convertNumber />
</h:outputText> </h:outputText>
</h:column> </h:column>
......
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
<f:viewParam name="billid" value="#{billEditView.billid}" /> <f:viewParam name="billid" value="#{billEditView.billid}" />
<f:event type="preRenderView" listener="#{billEditView.initView}" /> <f:event type="preRenderView" listener="#{billEditView.initView}" />
</f:metadata> </f:metadata>
<ui:param name="thispage" value="page.bill.edit" />
<ui:define name="content"> <ui:define name="content">
<h:form id="billform"> <h:form id="billform">
......
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
<f:viewParam name="userid" value="#{userView.userid}" /> <f:viewParam name="userid" value="#{userView.userid}" />
<f:event type="preRenderView" listener="#{billListView.initUsersBills}" /> <f:event type="preRenderView" listener="#{billListView.initUsersBills}" />
</f:metadata> </f:metadata>
<ui:param name="thispage" value="page.bill.list" />
<ui:define name="content"> <ui:define name="content">
<bills:list /> <bills:list />
</ui:define> </ui:define>
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
<f:metadata> <f:metadata>
<f:event type="preRenderView" listener="#{billListView.initAllBills}" /> <f:event type="preRenderView" listener="#{billListView.initAllBills}" />
</f:metadata> </f:metadata>
<ui:param name="thispage" value="page.bill.listAll" />
<ui:define name="content"> <ui:define name="content">
<bills:list /> <bills:list />
</ui:define> </ui:define>
......
<!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:bills="http://java.sun.com/jsf/composite/tools/bills"
xmlns:f="http://java.sun.com/jsf/core">
<h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.bill.placemap" />
<ui:define name="content">
<img class="imgcenter"
src="#{request.contextPath}/resources/style/insomnia1/konepaikat.png"
alt="Konepaikat" />
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
<!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:c="http://java.sun.com/jsp/jstl/core">
<h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.eventorg.edit" />
<ui:define name="content">
<h:form id="orgform">
<h:inputHidden value="#{eventView.eventmap.id}" />
<h:panelGrid columns="2">
<h:outputLabel value="#{i18n['eventmap.name']}:" /><h:inputText value="#{eventView.eventmap.name}" />
<h:commandButton id="commitbtn" action="#{eventView.saveMap()}" value="#{i18n['eventmap.save']}" />
</h:panelGrid>
</h:form>
<h2>#{i18n['eventmap.places']}</h2>
<h:form id="eventmapPlacelist">
<h:dataTable border="1" id="places" value="#{eventView.mapPlaces}" var="place">
<h:column>
<f:facet name="header">
<h:outputText value="${i18n['place.name']}" />
</f:facet>
<h:outputText value="#{place.name}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="${i18n['place.description']}" />
</f:facet>
<h:outputText value="#{place.description}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="${i18n['place.details']}" />
</f:facet>
<h:outputText value="#{place.details}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="${i18n['place.mapX']}" />
</f:facet>
<h:outputText value="#{place.mapX}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="${i18n['place.mapY']}" />
</f:facet>
<h:outputText value="#{place.mapY}" />
</h:column>
<h:column >
<h:commandButton action="#{eventView.editPlace()}" value="#{i18n['place.edit']}" />
</h:column>
</h:dataTable>
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
<!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:c="http://java.sun.com/jsp/jstl/core">
<h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.eventorg.edit" />
<ui:define name="content">
<h:form id="orgform">
<h:inputHidden id="#{eventView.eventmap.id}" />
<h:panelGrid columns="2">
<h:outputLabel value="#{i18n['eventmap.name']}:" /><h:inputText value="#{eventView.eventmap.name}" />
<h:commandButton id="commitbtn" action="#{eventView.saveMap()}" value="#{i18n['eventmap.save']}" />
</h:panelGrid>
</h:form>
</h:dataTable>
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
<!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:c="http://java.sun.com/jsp/jstl/core">
<h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.eventorg.list" />
<ui:define name="content">
<h:form>
<h:dataTable border="1" id="maps" value="#{eventView.eventmaps}" var="maps">
<h:column>
<f:facet name="header">
<h:outputText value="${i18n['eventmap.name']}" />
</f:facet>
<h:outputText value="#{maps.name}" />
</h:column>
<h:column >
<h:commandButton action="#{eventView.editMap()}" value="#{i18n['eventmap.edit']}" />
</h:column>
</h:dataTable>
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" <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:ui="http://java.sun.com/jsf/facelets" xmlns:users="http://java.sun.com/jsf/composite/tools/user" xmlns:c="http://java.sun.com/jsp/jstl/core">
xmlns:h="http://java.sun.com/jsf/html" <h:body>
xmlns:f="http://java.sun.com/jsf/core" <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
xmlns:users="http://java.sun.com/jsf/composite/tools/user"
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.eventorg.create" /> <ui:param name="thispage" value="page.eventorg.create" />
<f:metadata>
<f:event type="preRenderView" listener="#{eventorgView.initCreate}" />
</f:metadata>
<ui:define name="content"> <ui:define name="content">
<h:form id="orgform"> <h:form id="orgform">
<h:panelGrid columns="2"> <h:panelGrid columns="2">
<h:outputLabel value="#{i18n['eventorg.organisation']}:" /><h:inputText value="#{eventorgView.createorgname}" /> <h:outputLabel value="#{i18n['eventorg.organisation']}:" />
<h:inputText value="#{eventorgView.createorgname}" />
<h:commandButton id="commitbtn" action="#{eventorgView.create()}" value="#{i18n['eventorg.create']}" /> <h:commandButton id="commitbtn" action="#{eventorgView.create()}" value="#{i18n['eventorg.create']}" />
</h:panelGrid> </h:panelGrid>
</h:form> </h:form>
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "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" <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: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:c="http://java.sun.com/jsp/jstl/core">
xmlns:users="http://java.sun.com/jsf/composite/tools/user" 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.eventorg.edit" /> <ui:param name="thispage" value="page.eventorg.edit" />
<f:metadata>
<f:viewParam name="id" value="#{eventorgView.orgId}" />
<f:event type="preRenderView" listener="#{eventorgView.initEdit}" />
</f:metadata>
<ui:define name="content"> <ui:define name="content">
<h:form id="orgform"> <h:form id="orgform">
<h:panelGrid columns="2"> <h:panelGrid columns="2">
<h:outputLabel value="#{i18n['eventorg.organisation']}:" /> <h:outputLabel value="#{i18n['eventorg.organisation']}:" />
<h:inputText value="#{eventorgView.eventorg.organisation}" /> <h:inputText value="#{eventorgView.eventorg.organisation}" />
<h:outputLabel value="#{i18n['eventorg.bundleCountry']}:" /> <h:outputLabel value="#{i18n['eventorg.bundleCountry']}:" />
<h:inputText value="#{eventorgView.eventorg.bundleCountry}" /> <h:inputText value="#{eventorgView.eventorg.bundleCountry}" />
<h:outputLabel value="#{i18n['eventorg.billAddress1']}:" /> <h:outputLabel value="#{i18n['eventorg.billAddress1']}:" />
<h:inputText value="#{eventorgView.eventorg.billAddress1}" /> <h:inputText value="#{eventorgView.eventorg.billAddress1}" />
<h:outputLabel value="#{i18n['eventorg.billAddress2']}:" /> <h:outputLabel value="#{i18n['eventorg.billAddress2']}:" />
<h:inputText value="#{eventorgView.eventorg.billAddress2}" /> <h:inputText value="#{eventorgView.eventorg.billAddress2}" />
<h:outputLabel value="#{i18n['eventorg.billAddress3']}:" /> <h:outputLabel value="#{i18n['eventorg.billAddress3']}:" />
<h:inputText value="#{eventorgView.eventorg.billAddress3}" /> <h:inputText value="#{eventorgView.eventorg.billAddress3}" />
<h:outputLabel value="#{i18n['eventorg.billAddress4']}:" /> <h:outputLabel value="#{i18n['eventorg.billAddress4']}:" />
<h:inputText value="#{eventorgView.eventorg.billAddress4}" /> <h:inputText value="#{eventorgView.eventorg.billAddress4}" />
<h:outputLabel value="#{i18n['eventorg.bankNumber1']}:" /> <h:outputLabel value="#{i18n['eventorg.bankNumber1']}:" />
<h:inputText value="#{eventorgView.eventorg.bankNumber1}" /> <h:inputText value="#{eventorgView.eventorg.bankNumber1}" />
<h:outputLabel value="#{i18n['eventorg.bankNumber2']}:" /> <h:outputLabel value="#{i18n['eventorg.bankNumber2']}:" />
<h:inputText value="#{eventorgView.eventorg.bankNumber2}" /> <h:inputText value="#{eventorgView.eventorg.bankNumber2}" />
<h:outputLabel value="#{i18n['eventorg.bankName1']}:" /> <h:outputLabel value="#{i18n['eventorg.bankName1']}:" />
<h:inputText value="#{eventorgView.eventorg.bankName1}" /> <h:inputText value="#{eventorgView.eventorg.bankName1}" />
<h:outputLabel value="#{i18n['eventorg.bankName2']}:" /> <h:outputLabel value="#{i18n['eventorg.bankName2']}:" />
<h:inputText value="#{eventorgView.eventorg.bankName2}" /> <h:inputText value="#{eventorgView.eventorg.bankName2}" />
<h:commandButton id="commitbtn" action="#{eventorgView.save()}" value="#{i18n['eventorg.save']}" /> <h:commandButton id="commitbtn" action="#{eventorgView.save()}" value="#{i18n['eventorg.save']}" />
</h:panelGrid> </h:panelGrid>
</h:form> </h:form>
<h2>#{i18n['eventorg.createevent']}</h2> <h2>#{i18n['eventorg.createevent']}</h2>
<h:form id="createevent"> <h:form id="createevent">
<h:outputLabel for="createEventName" value="#{i18n['event.name']}" /> <h:outputLabel for="createEventName" value="#{i18n['event.name']}" />
<h:inputText id="createEventName" value="#{eventorgView.eventname}" /> <h:inputText id="createEventName" value="#{eventorgView.eventname}" />
<h:commandButton action="#{eventorgView.createEvent()}" value="#{i18n['eventorg.createEvent']}" /> <h:commandButton action="#{eventorgView.createEvent()}" value="#{i18n['eventorg.createEvent']}" />
</h:form> </h:form>
<h2>#{i18n['eventorg.events']}</h2> <h2>#{i18n['eventorg.events']}</h2>
<h:form id="orgsEventlist"> <h:dataTable border="1" id="org" value="#{eventorgView.eventorg.events}" var="event">
<h:dataTable border="1" id="org" value="#{eventorgView.orgsEvents}" var="event">
<h:column> <h:column>
<f:facet name="header"> <f:facet name="header">
<h:outputText value="${i18n['event.name']}" /> <h:outputText value="${i18n['event.name']}" />
...@@ -50,13 +64,13 @@ ...@@ -50,13 +64,13 @@
<h:outputText value="#{event.name}" /> <h:outputText value="#{event.name}" />
</h:column> </h:column>
<h:column> <h:column>
<h:commandButton action="#{eventorgView.editEvent()}" value="#{i18n['eventorg.editEvent']}" /> <h:link outcome="/eventorg/editEvent" value="#{i18n['event.edit']}">
<f:param name="eventid" value="#{event.id}" />
</h:link>
</h:column> </h:column>
</h:dataTable> </h:dataTable>
</h:form>
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" <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:ui="http://java.sun.com/jsf/facelets" xmlns:users="http://java.sun.com/jsf/composite/tools/user" xmlns:c="http://java.sun.com/jsp/jstl/core">
xmlns:h="http://java.sun.com/jsf/html" <h:body>
xmlns:f="http://java.sun.com/jsf/core" <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
xmlns:users="http://java.sun.com/jsf/composite/tools/user" <f:metadata>
xmlns:c="http://java.sun.com/jsp/jstl/core"> <f:viewParam name="eventid" value="#{eventorgView.eventid}" />
<h:body> <f:event type="preRenderView" listener="#{eventorgView.initEditEvent}" />
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> </f:metadata>
<ui:param name="thispage" value="page.eventorg.editEvent" />
<ui:define name="content"> <ui:define name="content">
<h:messages />
<h:form id="orgform"> <h:form id="orgform">
<h:inputHidden value="#{eventorgView.event.id}" />
<h:panelGrid columns="2"> <h:panelGrid columns="2">
<h:outputLabel value="#{i18n['event.name']}:" /><h:inputText value="#{eventorgView.event.name}" /> <h:outputLabel value="#{i18n['event.name']}:" />
<h:outputLabel value="#{i18n['event.referer']}:" /><h:inputText value="#{eventorgView.event.referer}" /> <h:inputText value="#{eventorgView.event.name}" />
<h:outputLabel value="#{i18n['event.referenceNumberBase']}:" /><h:inputText value="#{eventorgView.event.referenceNumberBase}" />
<h:outputLabel value="#{i18n['event.nextBillNumber']}:" /><h:inputText value="#{eventorgView.event.nextBillNumber}" /> <h:outputLabel value="#{i18n['event.referer']}:" />
<h:inputText value="#{eventorgView.event.referer}" />
<h:outputLabel value="#{i18n['event.referenceNumberBase']}:" />
<h:inputText value="#{eventorgView.event.referenceNumberBase}" />
<h:outputLabel value="#{i18n['event.nextBillNumber']}:" />
<h:inputText value="#{eventorgView.event.nextBillNumber}" />
<h:outputLabel value="#{i18n['event.startTime']}:" /> <h:outputLabel value="#{i18n['event.startTime']}:" />
<h:inputText value="#{eventorgView.event.startTime}" > <h:inputText value="#{eventorgView.event.startTime}">
<f:convertDateTime /> <f:convertDateTime />
</h:inputText> </h:inputText>
<h:outputLabel value="#{i18n['event.endTime']}:" /> <h:outputLabel value="#{i18n['event.endTime']}:" />
<h:inputText value="#{eventorgView.event.endTime}" > <h:inputText value="#{eventorgView.event.endTime}">
<f:convertDateTime /> <f:convertDateTime />
</h:inputText> </h:inputText>
<h:outputLabel value="#{i18n['event.defaultRole']}:" /> <h:outputLabel value="#{i18n['event.defaultRole']}:" />
<h:selectOneMenu converter="#{roleConverter}" value="#{eventorgView.event.defaultRole}" > <h:selectOneMenu converter="#{roleConverter}" value="#{eventorgView.event.defaultRole}">
<f:selectItems var="role" itemLabel="#{role.name}" value="#{eventorgView.eventsRolelist}" /> <f:selectItems var="role" itemLabel="#{role.name}" value="#{eventorgView.event.roles}" />
</h:selectOneMenu> </h:selectOneMenu>
<h:commandButton id="commitbtn" action="#{eventorgView.saveEvent()}" value="#{i18n['event.save']}" /> <h:commandButton id="commitbtn" action="#{eventorgView.saveEvent()}" value="#{i18n['event.save']}" />
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" <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:ui="http://java.sun.com/jsf/facelets" xmlns:users="http://java.sun.com/jsf/composite/tools/user" xmlns:c="http://java.sun.com/jsp/jstl/core">
xmlns:h="http://java.sun.com/jsf/html" <h:body>
xmlns:f="http://java.sun.com/jsf/core" <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
xmlns:users="http://java.sun.com/jsf/composite/tools/user" <f:metadata>
xmlns:c="http://java.sun.com/jsp/jstl/core"> <f:event type="preRenderView" listener="#{eventorgView.initListView}" />
<h:body> </f:metadata>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.eventorg.list" />
<ui:define name="content"> <ui:define name="content">
<h:form> <h:form>
<h:dataTable border="1" id="eventorgs" value="#{eventorgView.organisations}" var="eventorg"> <h:dataTable border="1" id="eventorgs" value="#{eventorgView.organisations}" var="eventorg">
...@@ -19,14 +17,15 @@ ...@@ -19,14 +17,15 @@
</f:facet> </f:facet>
<h:outputText value="#{eventorg.organisation}" /> <h:outputText value="#{eventorg.organisation}" />
</h:column> </h:column>
<h:column > <h:column>
<h:commandButton action="#{eventorgView.edit()}" value="#{i18n['eventorg.edit']}" /> <h:link outcome="/eventorg/edit" value="#{i18n['eventorg.edit']}">
<f:param name="id" value="#{eventorg.id}" />
</h:link>
</h:column> </h:column>
</h:dataTable> </h:dataTable>
</h:form> </h:form>
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
</html> </html>
\ No newline at end of file
...@@ -28,34 +28,41 @@ ...@@ -28,34 +28,41 @@
</div> </div>
<div id="login"> <div id="login">
<h:outputText rendered="#{sessionHandler.loggedIn}" value="Olet kirjautunut käyttäjällä: #{sessionHandler.currentUser.nick}" /> <h:outputText rendered="#{sessionHandler.loggedIn}" value="Olet kirjautunut käyttäjällä: #{sessionHandler.currentUser.nick}" />
<tools:loginLogout /> <tools:loginLogout />
</div> </div>
<ui:fragment rendered="#{menuView.getMenu(0).size() > 1}">
<ul id="topmenu">
<li jsfc="ui:repeat" var="menuitem" value="#{menuView.getMenu(0)}">
<h:link outcome="#{menuitem.outcome}" value="#{i18n[menuitem.navigation.key]}"
styleClass="#{menuitem.selected?'active':''}" /></li>
</ul>
</ui:fragment>
</div> </div>
<div id="wrapper"> <div id="wrapper">
<div id="navigation"> <div id="navigation">
<ul class="menu" jsfc="ui:repeat" var="menuitem" value="#{menuView.topmenu}"> <ul class="menu">
<li><h:link outcome="#{menuitem.outcome}" value="#{i18n[menuitem.navigation.key]}" styleClass="#{menuitem.selected?'active':''}" /></li> <li jsfc="ui:repeat" var="menuitem" value="#{menuView.getMenu(1)}"><h:link outcome="#{menuitem.outcome}" value="#{i18n[menuitem.navigation.key]}"
styleClass="#{menuitem.selected?'active':''}" /></li>
</ul> </ul>
</div> </div>
<div id="container" class="top" /> <div id="container" class="top" />
<div id="container" class="clearfix"> <div id="container" class="clearfix">
<c:if test="#{menuView.submenu.size() > 1}"> <ui:fragment rendered="#{menuView.getMenu(2).size() > 1}">
<div id="right"> <div id="right">
<ul class="menu"> <ul class="menu">
<ui:repeat var="menuitem" value="#{menuView.submenu}"> <ui:repeat var="menuitem" value="#{menuView.getMenu(2)}">
<h:outputText rendered="#{!empty menuitem.header}" value="&lt;/ul>&lt;h1>#{i18n[menuitem.header]}&lt;/h1>&lt;ul>" escape="false" /> <h:outputText rendered="#{!empty menuitem.header}" value="&lt;/ul>&lt;h1>#{i18n[menuitem.header]}&lt;/h1>&lt;ul>" escape="false" />
<li> <li><h:link outcome="#{menuitem.outcome}" value="#{i18n[menuitem.navigation.key]}" styleClass="#{menuitem.selected?'active':''}" /></li>
<h:link outcome="#{menuitem.outcome}" value="#{i18n[menuitem.navigation.key]}" styleClass="#{menuitem.selected?'active':''}" />
</li>
</ui:repeat> </ui:repeat>
</ul> </ul>
</div> </div>
</c:if> </ui:fragment>
<div id="left"> <div id="left">
<ui:insert name="title" /> <ui:insert name="title" />
<h:messages globalOnly="true" /> <h:messages globalOnly="true" />
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "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" <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:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:map="http://java.sun.com/jsf/composite/cditools/map" xmlns:c="http://java.sun.com/jsp/jstl/core">
xmlns:map="http://java.sun.com/jsf/composite/cditools/map" 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.role.edit" /> <f:metadata>
<f:event type="preRenderView" listener="#{mapManageView.initCreate}" />
</f:metadata>
<ui:define name="content"> <ui:define name="content">
<h:form> <h:form>
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "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" <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:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:news="http://java.sun.com/jsf/composite/cditools/pages" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui">
xmlns:news="http://java.sun.com/jsf/composite/cditools/news" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui"
>
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<f:metadata> <f:metadata>
...@@ -18,7 +15,7 @@ ...@@ -18,7 +15,7 @@
<h:outputScript target="head" library="script" name="jquery.min.js" /> <h:outputScript target="head" library="script" name="jquery.min.js" />
<h:outputScript target="head" library="script" name="textinputs_jquery.js" /> <h:outputScript target="head" library="script" name="textinputs_jquery.js" />
<h:button onclick="var sel = $('#newsform:editor').getSelection(); alert(sel.start +', ' + sel.end);" value="Click me"/> <h:button onclick="var sel = $('#newsform:editor').getSelection(); alert(sel.start +', ' + sel.end);" value="Click me" />
<h:form id="newsform"> <h:form id="newsform">
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "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" <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:users="http://java.sun.com/jsf/composite/cditools/user"
xmlns:h="http://java.sun.com/jsf/html" xmlns:users="http://java.sun.com/jsf/composite/cditools/user" xmlns:tools="http://java.sun.com/jsf/composite/cditools" xmlns:f="http://java.sun.com/jsf/core">
xmlns:tools="http://java.sun.com/jsf/composite/cditools" xmlns:f="http://java.sun.com/jsf/core"
>
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<f:metadata> <f:metadata>
<f:event type="preRenderView" listener="#{siteListView.initView}" /> <f:event type="preRenderView" listener="#{newsListView.initView}" />
</f:metadata> </f:metadata>
<ui:param name="thispage" value="page.user.create" /> <ui:param name="thispage" value="page.user.create" />
...@@ -18,7 +16,7 @@ ...@@ -18,7 +16,7 @@
<h:dataTable styleClass="bordertable" id="user" value="#{newsListView.newsgroups}" var="newsgroup"> <h:dataTable styleClass="bordertable" id="user" value="#{newsListView.newsgroups}" var="newsgroup">
<h:column> <h:column>
<f:facet name="header"> <f:facet name="header">
ID #
</f:facet> </f:facet>
<h:outputText value="#{newsgroup.id}" /> <h:outputText value="#{newsgroup.id}" />
</h:column> </h:column>
......
<?xml version='1.0' encoding='UTF-8' ?> <?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.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" <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:composite="http://java.sun.com/jsf/composite"
xmlns:composite="http://java.sun.com/jsf/composite" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools">
xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools"
>
<composite:interface> <composite:interface>
</composite:interface> </composite:interface>
<composite:implementation> <composite:implementation>
<h1>#{readerView.readername}</h1>
<h:form> <h:form>
<h:dataTable border="1" id="event" value="#{readerView.readerEvents}" var="event"> <h:dataTable border="1" id="event" value="#{readerView.readerEvents}" var="event">
<h:column> <h:column>
<f:facet name="header"> <f:facet name="header">
<h:outputText value="${i18n['reader.tag']}" /> <h:outputText value="${i18n['readerevent.']}" />
</f:facet> </f:facet>
<h:outputText id="tag" value="#{event.tag}" />
<h:outputText rendered="#{!empty event.printedCard}" id="cardtag" value="#{event.printedCard.rfidUid}" />
<h:outputText rendered="#{empty event.printedCard}" id="newtag" value="#{event.value}" />
</h:column> </h:column>
<h:column> <h:column>
<f:facet name="header"> <f:facet name="header">
<h:outputText value="${i18n['reader.user']}" /> <h:outputText value="${i18n['reader.user']}" />
</f:facet> </f:facet>
<h:outputText rendered="#{!empty event.event}" <h:outputText rendered="#{!empty event.printedCard}" value="#{event.printedCard.user.wholeName} (#{event.printedCard.user.nick})" />
value="#{event.event.printedCard.user.wholeName} (#{event.event.printedCard.user.nick})"
/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="${i18n['reader.tag']}" />
</f:facet>
<h:dataTable value="#{event.actions}" var="action">
<h:column>
<h:outputText value="#{action}" />
</h:column>
</h:dataTable>
</h:column> </h:column>
<h:column> <h:column>
<f:facet name="header"> <f:facet name="header">
<h:outputText value="${i18n['readerevent.seenSince']}" /> <h:outputText value="${i18n['readerevent.seenSince']}" />
...@@ -50,33 +37,17 @@ ...@@ -50,33 +37,17 @@
<f:facet name="header"> <f:facet name="header">
<h:outputText value="${i18n['gamepoints']}" /> <h:outputText value="${i18n['gamepoints']}" />
</f:facet> </f:facet>
<h:outputText value="#{event.event.gamePoint}" /> <h:outputText value="#{event.gamePoint}" />
</h:column>
<h:column>
<h:link rendered="#{empty event.event}" outcome="/rfid/assocToUser" value="#{i18n['readerevent.associateToUser']}">
<f:param value="#{event.tag}" var="tag" />
</h:link>
<h:link rendered="#{!empty event.event}" outcome="/user/edit" value="#{i18n['user.edit']}">
<f:param value="#{event.event.printedCard.user.id}" var="userid" />
</h:link>
<!-- <h:commandButton rendered="#{!empty event.event}" action="#{readerView.editUser()}" value="#{i18n['user.edit']}" /> -->
<!-- <h:commandButton rendered="#{empty event.event}" action="#{readerView.selectEvent()}" -->
<!-- value="#{i18n['readerevent.associateToUser']}" -->
<!-- /> -->
<!-- <h:commandButton rendered="#{!empty event.event}" action="#{readerView.selectEvent()}" -->
<!-- value="#{i18n['readerevent.shopToUser']}" -->
<!-- /> -->
</h:column> </h:column>
<h:column> <h:column>
<h:commandButton rendered="#{empty event.printedCard}" action="#{readerView.selectEvent()}" value="#{i18n['readerevent.associateToUser']}" />
<h:commandButton rendered="#{!empty event.printedCard}" action="#{readerView.selectEvent()}" value="#{i18n['readerevent.shopToUser']}" />
</h:column> </h:column>
</h:dataTable> </h:dataTable>
</h:form> </h:form>
</composite:implementation> </composite:implementation>
</html> </html>
<?xml version='1.0' encoding='UTF-8' ?> <?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.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" <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:composite="http://java.sun.com/jsf/composite"
xmlns:composite="http://java.sun.com/jsf/composite" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools">
xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools"
>
<composite:interface> <composite:interface>
</composite:interface> </composite:interface>
<composite:implementation> <composite:implementation>
<h:dataTable border="1" id="reader" value="#{readerListDataView.readers}" var="rr">
<h:dataTable border="1" id="reader" value="#{rfidContainer.readers}" var="rr">
<h:column> <h:column>
<f:facet name="header"> <f:facet name="header">
<h:outputText value="${i18n['reader.name']}" /> <h:outputText value="${i18n['reader.name']}" />
</f:facet> </f:facet>
<h:outputText value="#{rr}" /> <h:outputText value="#{rr.identification}" />
</h:column> </h:column>
<h:column> <h:column>
<f:facet name="header">
<h:outputText value="${i18n['reader.description']}" />
</f:facet>
<h:outputText value="#{rr.description}" />
</h:column>
<h:column>
<h:link outcome="/shop/showReaderEvents" value="#{i18n['reader.select']}"> <h:link outcome="/shop/showReaderEvents" value="#{i18n['reader.select']}">
<f:param value="#{rr}" name="reader"/> <f:param value="#{rr.id}" name="readerId" />
</h:link> </h:link>
</h:column> </h:column>
</h:dataTable> </h:dataTable>
</composite:implementation> </composite:implementation>
</html> </html>
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
</h:link> </h:link>
</h:column> </h:column>
</h:dataTable> </h:dataTable>
</composite:implementation> </composite:implementation>
......
body, html {width: 100%; height: 100%; color: #343434; font-family: trebuchet ms; background:url('../img/tausta.png') repeat-x #fff; margin: 0px;} body,html {
#header {width: 970px; height: 52px; margin: 0 auto;} width: 100%;
#logo {width: 255px; height: 52px; float: left;} height: 100%;
#login {width: 400px; height: 23px; float: right; margin-top: 15px; color:#fff;} color: #343434;
.form {background:url('../img/input.png') no-repeat; width: 130px; height: 23px; color:#fff; border:0px;padding-left: 10px;} font-family: trebuchet ms;
.button {background:url('../img/button.png') no-repeat; width: 100px; text-align: center; border:0px; height:23px;color:#fff; padding:0px;} background: url('../img/tausta.png') repeat-x #fff;
.button:hover {background:url('../img/button2.png') no-repeat; cursor:pointer;} margin: 0px;
#wrapper {width: 970px; margin: 0 auto;} }
#navigation {margin: 15px 0px; height: 33px; width: 100%;}
#navigation ul {list-style-type:none; margin: 0px; padding: 0px;} #header {
#navigation ul li {float: left; margin-right: 10px;} width: 970px;
#navigation ul li a {display: block; height: 33px; padding: 0px 10px; line-height: 33px; text-decoration: none; font-weight: bold; color: #0073bc;} height: 52px;
#navigation ul li a:hover, .active {background:#fff; border-radius: 5px; border: 1px solid #c0c0c0; color:#7dac0c !important;} margin: 0 auto;
a {color: #0037bc;} }
a:hover {color: #7dac0c;}
#container {width: 100%; background:url(../img/container.png) repeat-y; font-size: 13px;} #logo {
#container #left {padding: 10px 20px;} width: 255px;
#left h1 {color:#7dac0c; font-size: 24px; padding-top:0px; margin-top: 0px;} height: 52px;
#left h2 {color:#7dac0c; font-size: 18px;} float: left;
#left h3 {color:#7dac0c; font-size: 16px;} }
#right {float:right; border-left: 1px dotted #c0c0c0; padding: 10px 20px; width: 200px;}
#right h1, #right h1 a {color:#7dac0c; font-size: 18px; padding-top: 0px; margin-top:0px; text-decoration:none;} #login {
width: 400px;
#container.top {width: 100%; background:url(../img/container-top.png) no-repeat; height: 15px;} height: 23px;
#container.bottom {width: 100%; background:url(../img/container-bottom.png) no-repeat; height: 16px;} float: right;
margin-top: 15px;
.clearfix:after {content: ".";display: block;clear: both;visibility: hidden;line-height: 0;height: 0;} color: #fff;
}
.form {
background: url('../img/input.png') no-repeat;
width: 130px;
height: 23px;
color: #fff;
border: 0px;
padding-left: 10px;
}
.button {
background: url('../img/button.png') no-repeat;
width: 100px;
text-align: center;
border: 0px;
height: 23px;
color: #fff;
padding: 0px;
}
.button:hover {
background: url('../img/button2.png') no-repeat;
cursor: pointer;
}
#wrapper {
width: 970px;
margin: 0 auto;
}
#navigation {
margin: 15px 0px;
height: 33px;
width: 100%;
}
#navigation ul {
list-style-type: none;
margin: 0px;
padding: 0px;
}
#navigation ul li {
float: left;
margin-right: 10px;
}
#navigation ul li a {
display: block;
height: 33px;
padding: 0px 10px;
line-height: 33px;
text-decoration: none;
font-weight: bold;
color: #0073bc;
}
#navigation ul li a:hover,#navigation ul li .active {
background: #fff;
border-radius: 5px;
border: 1px solid #c0c0c0;
color: #7dac0c !important;
}
a {
color: #0037bc;
}
a:hover {
color: #7dac0c;
}
#container {
width: 100%;
background: url(../img/container.png) repeat-y;
font-size: 13px;
}
#container #left {
padding: 10px 20px;
}
#left h1 {
color: #7dac0c;
font-size: 24px;
padding-top: 0px;
margin-top: 0px;
}
#left h2 {
color: #7dac0c;
font-size: 18px;
}
#left h3 {
color: #7dac0c;
font-size: 16px;
}
#right {
float: right;
border-left: 1px dotted #c0c0c0;
padding: 10px 20px;
width: 200px;
}
#right h1,#right h1 a {
color: #7dac0c;
font-size: 18px;
padding-top: 0px;
margin-top: 0px;
text-decoration: none;
}
#container.top {
width: 100%;
background: url(../img/container-top.png) no-repeat;
height: 15px;
}
#container.bottom {
width: 100%;
background: url(../img/container-bottom.png) no-repeat;
height: 16px;
}
.clearfix:after {
content: ".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
}
#topmenu {
font-size: 0.8em;
float: right;
list-style-type: none;
margin: 5px 15px 0 0;
padding: 0px;
}
#topmenu a {
color: #fff;
text-decoration:none;
display:block;
}
#topmenu li {
margin: 0 7px;
color: #fff;
float: left;
}
\ No newline at end of file
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "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" <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: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:c="http://java.sun.com/jsp/jstl/core"> xmlns:users="http://java.sun.com/jsf/composite/tools/user" 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.eventorg.list" /> <f:metadata>
<f:viewParam name="userid" value="#{userView.userid}" />
<f:event type="preRenderView" listener="#{productShopView.initView}" />
</f:metadata>
<ui:define name="content"> <ui:define name="content">
<h:outputText rendered="#{!empty readerView.rfidevent.event}" value="#{i18n['rfidevent.empty']}" /> <h:outputText rendered="#{!empty readerView.rfidevent.event}" value="#{i18n['rfidevent.empty']}" />
...@@ -18,8 +21,8 @@ ...@@ -18,8 +21,8 @@
<h:outputText value="#{readerView.rfidevent.tag}" /> <h:outputText value="#{readerView.rfidevent.tag}" />
<h:outputLabel value="#{i18n['rfidevent.insertplacecode']}" /> <h:outputLabel value="#{i18n['rfidevent.insertplacecode']}" />
<h:form id="placecodeform">
<h:form id="placecodeform">
<h:inputText value="#{readerView.placecode}" /> <h:inputText value="#{readerView.placecode}" />
<h:commandButton value="#{i18n['readerView.assocToPlacecode']}" action="#{readerView.assocToPlacecode()}" /> <h:commandButton value="#{i18n['readerView.assocToPlacecode']}" action="#{readerView.assocToPlacecode()}" />
</h:form> </h:form>
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" <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:ui="http://java.sun.com/jsf/facelets" xmlns:shop="http://java.sun.com/jsf/composite/cditools/shop" xmlns:c="http://java.sun.com/jsp/jstl/core">
xmlns:h="http://java.sun.com/jsf/html" <h:body>
xmlns:f="http://java.sun.com/jsf/core" <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
xmlns:shop="http://java.sun.com/jsf/composite/cditools/shop" <f:metadata>
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:body> <f:event type="preRenderView" listener="#{readerListDataView.initView}" />
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.shop.readerevents" /> </f:metadata>
<ui:define name="content"> <ui:define name="content">
<shop:readerlist /> <shop:readerlist />
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
</html> </html>
\ No newline at end of file
...@@ -8,14 +8,12 @@ ...@@ -8,14 +8,12 @@
</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.permissionDenied" />
<ui:define name="metadata"> <ui:define name="metadata">
<f:metadata> <f:metadata>
<f:viewParam name="reader" value="#{rfidView.reader}" /> <f:viewParam name="reader" value="#{rfidView.reader}" />
<f:viewParam name="tag" value="#{rfidView.tag}" /> <f:viewParam name="tag" value="#{rfidView.tag}" />
<f:viewParam name="hash" value="#{rfidView.hash}" /> <f:viewParam name="hash" value="#{rfidView.hash}" />
<f:event type="preRenderView" listener="#{rfidView.readTag}" /> <f:event type="preRenderView" listener="#{rfidView.readTag}" />
</f:metadata> </f:metadata>
</ui:define> </ui:define>
<ui:define name="content"> <ui:define name="content">
......
<!DOCTYPE html
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "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" <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:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:shop="http://java.sun.com/jsf/composite/cditools/shop" xmlns:c="http://java.sun.com/jsp/jstl/core"> xmlns:shop="http://java.sun.com/jsf/composite/cditools/shop" 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.shop.readerevents" />
<f:metadata> <f:metadata>
<f:viewParam name="reader" value="#{readerView.readername}" /> <f:viewParam name="readerId" value="#{readerNameContainer.readerId}" />
<f:event type="preRenderView" listener="#{readerView.initView}" /> <f:event type="preRenderView" listener="#{readerView.initReaderList}" />
</f:metadata><ui:define name="content"> </f:metadata>
<shop:readerevents rendered="#{!empty readerView.readername}" />
<shop:readerlist rendered="#{empty readerView.readername}" />
<ui:define name="content">
<shop:readerevents rendered="#{!empty readerNameContainer.readerId}" />
<shop:readerlist rendered="#{empty readerNameContainer.readerId}" />
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "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" <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:users="http://java.sun.com/jsf/composite/tools/user" xmlns:h="http://java.sun.com/jsf/html" xmlns:users="http://java.sun.com/jsf/composite/cditools/user"
xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core"
> >
<h:body> <h:body>
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "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" <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:users="http://java.sun.com/jsf/composite/cditools/user"
xmlns:h="http://java.sun.com/jsf/html" xmlns:users="http://java.sun.com/jsf/composite/cdiqtools/user" xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core">
xmlns:f="http://java.sun.com/jsf/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">
<f:metadata> <f:metadata>
<f:viewParam name="userid" value="#{userView.userid}" /> <f:viewParam name="userid" value="#{userView.userid}" />
<f:event type="preRenderView" listener="#{userView.initView}" /> <f:event type="preRenderView" listener="#{userView.initView}" />
</f:metadata> </f:metadata>
<ui:param name="thispage" value="page.user.create" />
<ui:define name="content"> <ui:define name="content">
<users:edit creating="true" commitaction="#{userView.createUser()}" commitvalue="#{i18n['user.create']}" /> <users:edit creating="true" commitaction="#{userView.createUser()}" commitvalue="#{i18n['user.create']}" />
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
......
...@@ -12,11 +12,9 @@ ...@@ -12,11 +12,9 @@
<f:event type="preRenderView" listener="#{userView.initView}" /> <f:event type="preRenderView" listener="#{userView.initView}" />
</f:metadata> </f:metadata>
<!-- <ui:param name="thispage" value="page.user.edit" /> -->
<ui:define name="title"> <ui:define name="title">
<h1>#{i18n['user.edit.title']}</h1> <h1>#{i18n['user.edit.title']}</h1>
<users:usertabs tabId="edit" /> <users:usertabs tabId="edit" />
</ui:define> </ui:define>
<ui:define name="content"> <ui:define name="content">
<users:edit commitaction="#{userView.saveUser()}" commitvalue="#{i18n['user.save']}" /> <users:edit commitaction="#{userView.saveUser()}" commitvalue="#{i18n['user.save']}" />
......
<!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:users="http://java.sun.com/jsf/composite/tools/user"
xmlns:f="http://java.sun.com/jsf/core"
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.user.create" />
<ui:define name="content">
<users:edit creating="true" commitaction="#{userView.createUser()}"
commitvalue="#{i18n['user.create']}" />
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
...@@ -20,7 +20,6 @@ import fi.insomnia.bortal.model.BillLine; ...@@ -20,7 +20,6 @@ import fi.insomnia.bortal.model.BillLine;
import fi.insomnia.bortal.util.MailMessage; import fi.insomnia.bortal.util.MailMessage;
import fi.insomnia.bortal.utilities.I18n; import fi.insomnia.bortal.utilities.I18n;
@ManagedBean(name = "billManageView")
@SessionScoped @SessionScoped
public class BillManageView extends GenericView { public class BillManageView extends GenericView {
......
...@@ -19,7 +19,8 @@ import fi.insomnia.bortal.enums.Permission; ...@@ -19,7 +19,8 @@ import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission; import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.model.Bill; import fi.insomnia.bortal.model.Bill;
@ManagedBean(name = "billView_olf")
@ManagedBean(name = "billView_old")
@SessionScoped @SessionScoped
public class BillView { public class BillView {
......
...@@ -13,6 +13,7 @@ import fi.insomnia.bortal.beans.EventBeanLocal; ...@@ -13,6 +13,7 @@ import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.model.CardTemplate; import fi.insomnia.bortal.model.CardTemplate;
import fi.insomnia.bortal.utilities.I18n; import fi.insomnia.bortal.utilities.I18n;
@ManagedBean(name = "cardView") @ManagedBean(name = "cardView")
@SessionScoped @SessionScoped
public class CardView { public class CardView {
......
...@@ -28,6 +28,7 @@ import fi.insomnia.bortal.model.Role; ...@@ -28,6 +28,7 @@ import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.web.converter.RoleConverter; import fi.insomnia.bortal.web.converter.RoleConverter;
@ManagedBean(name = "eventorgView") @ManagedBean(name = "eventorgView")
@SessionScoped @SessionScoped
public class EventOrganiserView { public class EventOrganiserView {
......
...@@ -10,6 +10,7 @@ import fi.insomnia.bortal.beans.EventMapBeanLocal; ...@@ -10,6 +10,7 @@ import fi.insomnia.bortal.beans.EventMapBeanLocal;
import fi.insomnia.bortal.model.EventMap; import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.Place; import fi.insomnia.bortal.model.Place;
@ManagedBean(name = "eventView") @ManagedBean(name = "eventView")
@SessionScoped @SessionScoped
public class EventView { public class EventView {
......
...@@ -21,6 +21,7 @@ import fi.insomnia.bortal.model.News; ...@@ -21,6 +21,7 @@ import fi.insomnia.bortal.model.News;
import fi.insomnia.bortal.model.PrintedCard; import fi.insomnia.bortal.model.PrintedCard;
import fi.insomnia.bortal.view.helpers.RfidEvent; import fi.insomnia.bortal.view.helpers.RfidEvent;
@ManagedBean(name = "gameView") @ManagedBean(name = "gameView")
@SessionScoped @SessionScoped
public class GameView extends GenericView { public class GameView extends GenericView {
......
...@@ -5,6 +5,7 @@ import javax.faces.context.FacesContext; ...@@ -5,6 +5,7 @@ import javax.faces.context.FacesContext;
import fi.insomnia.bortal.utilities.I18n; import fi.insomnia.bortal.utilities.I18n;
public abstract class GenericView { public abstract class GenericView {
protected void addFaceMessage(String string, Object ... params) { protected void addFaceMessage(String string, Object ... params) {
......
...@@ -146,16 +146,17 @@ public class MapManageView extends GenericView { ...@@ -146,16 +146,17 @@ public class MapManageView extends GenericView {
return mapname; return mapname;
} }
public void setMap(EventMap map) { public String getMapname() {
this.map = map; return mapname;
}p;
} }
public EventMap getMap() { public EventMap getMap() {
return map; return map;
} }
public int getWidth() { public EventMap getMap() {
return width; return map;
} }
public void setWidth(int width) { public void setWidth(int width) {
...@@ -166,8 +167,9 @@ public class MapManageView extends GenericView { ...@@ -166,8 +167,9 @@ public class MapManageView extends GenericView {
return height; return height;
} }
public void setHeight(int height) { public int getHeight() {
this.height = height; return height;
}ight = height;
} }
public int getStartX() { public int getStartX() {
...@@ -255,6 +257,6 @@ public class MapManageView extends GenericView { ...@@ -255,6 +257,6 @@ public class MapManageView extends GenericView {
} }
public String getBuyableLike() { public String getBuyableLike() {
public String getBuyableLike() {
return buyableLike; return buyableLike;
} }
\ No newline at end of file
}
...@@ -24,7 +24,7 @@ import fi.insomnia.bortal.model.User; ...@@ -24,7 +24,7 @@ import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.view.helpers.RfidEvent; import fi.insomnia.bortal.view.helpers.RfidEvent;
import fi.insomnia.bortal.web.cdiview.RfidContainer; import fi.insomnia.bortal.web.cdiview.RfidContainer;
@ManagedBean(name = "readerView") @Named(name = "readerView")
@SessionScoped @SessionScoped
public class ReaderView extends GenericView { public class ReaderView extends GenericView {
......
<<<<<<< HEAD
accountEvent.delivered=Toimitettu accountEvent.delivered=Toimitettu
accountEvent.edit=Muokkaa accountEvent.edit=Muokkaa
accountEvent.eventTime=Aika accountEvent.eventTime=Aika
...@@ -376,26 +375,26 @@ news.publish=Julkaise ...@@ -376,26 +375,26 @@ news.publish=Julkaise
news.expire=Lopeta julkaisu news.expire=Lopeta julkaisu
news.save=Tallenna news.save=Tallenna
usertitle.managingUser=Hallitaan kyttj usertitle.managingUser=Hallitaan k\u00e4ytt\u00e4j\u00e4\u00e4
actionlog.messagelist.header=ActionLog actionlog.messagelist.header=ActionLog
actionlog.messagelist.description=Voit seurata sek luoda uusia ActionMessageja tss nkymss. actionlog.messagelist.description=Voit seurata sek\u00e4 luoda uusia ActionMessageja tss n\u00e4kym\u00e4ss\u00e4.
actionlog.tasklist.header=Viestilista actionlog.tasklist.header=Viestilista
actionlog.create.header=Luo uusi ActionMessage actionlog.create.header=Luo uusi ActionMessage
actionlog.create.role=Kohderooli actionlog.create.role=Kohderooli
actionlog.create.message=Viesti actionlog.create.message=Viesti
actionlog.create.taskradio=Tehtv actionlog.create.taskradio=Teht\u00e4v\u00e4
actionlog.create.submitbutton=Lhet actionlog.create.submitbutton=L\u00e4het\u00e4
actionlog.time=Aika actionlog.time=Aika
actionlog.user=Tekij actionlog.user=Tekij\u00e4
actionlog.crew=Crew actionlog.crew=Crew
actionlog.message=Tapahtuma actionlog.message=Tapahtuma
actionlog.task=Taski actionlog.task=Taski
======= <<<<<<< .mine=======
accountEvent.delivered=Toimitettu accountEvent.delivered=Toimitettu
accountEvent.edit=Muokkaa accountEvent.edit=Muokkaa
accountEvent.eventTime=Aika accountEvent.eventTime=Aika
...@@ -807,3 +806,7 @@ voting.create.header=Compon luonti ...@@ -807,3 +806,7 @@ voting.create.header=Compon luonti
voting.create.description=Tll sivulla luot uuden compon voting.create.description=Tll sivulla luot uuden compon
>>>>>>> 0c03330e786bda2bb906720f174db192b180fced >>>>>>> 0c03330e786bda2bb906720f174db192b180fced
=======actionlog.messagestate.NEW=Uusi
actionlog.messagestate.PENDING=Ty\u00f6n alla
actionlog.messagestate.DONE=Tehty
actionlog.state=Tila>>>>>>> .theirs
\ No newline at end of file
...@@ -34,7 +34,8 @@ import fi.insomnia.bortal.model.PossibleAnswer; ...@@ -34,7 +34,8 @@ import fi.insomnia.bortal.model.PossibleAnswer;
@RequestScoped @RequestScoped
public class TestDataView { public class TestDataView {
private static final Logger logger = LoggerFactory.getLogger(TestDataView.class); private static final Logger logger = LoggerFactory
.getLogger(TestDataView.class);
@EJB @EJB
private TestDataBeanLocal testdatabean; private TestDataBeanLocal testdatabean;
...@@ -58,12 +59,16 @@ public class TestDataView { ...@@ -58,12 +59,16 @@ public class TestDataView {
utilbean.convertUsernames(); utilbean.convertUsernames();
} }
public String resetMenu() public String resetMenu() {
{
menubean.flushDefaultmenu(); menubean.flushDefaultmenu();
return null; return null;
} }
public String makeTestData() {
testdatabean.createAdmin();
return null;
}
// public void generateTestMap() { // public void generateTestMap() {
// EventMap map = testdatabean.generateTestMap(); // EventMap map = testdatabean.generateTestMap();
// //
...@@ -123,8 +128,7 @@ public class TestDataView { ...@@ -123,8 +128,7 @@ public class TestDataView {
// } // }
// //
public String generatePollData() public String generatePollData() {
{
createPalaute(); createPalaute();
createPrizz(); createPrizz();
return null; return null;
...@@ -139,45 +143,61 @@ public class TestDataView { ...@@ -139,45 +143,61 @@ public class TestDataView {
end.add(Calendar.MONTH, 1); end.add(Calendar.MONTH, 1);
poll.setEnd(end.getTime()); poll.setEnd(end.getTime());
createMulticoice(poll, 10, "Millä alustalla pelaat eniten?", createMulticoice(
poll,
10,
"Millä alustalla pelaat eniten?",
"Tietokone (perinteiset tietokonepelit, esim. Starcraft 2 tai Fallout 3)", "Tietokone (perinteiset tietokonepelit, esim. Starcraft 2 tai Fallout 3)",
"Pelikonsoli", "Pelikonsoli", "kännykkä",
"kännykkä",
"Nettiselain (esim. Facebook-pelit, Google+-pelit, Aapeli-palvelu ym.)"); "Nettiselain (esim. Facebook-pelit, Google+-pelit, Aapeli-palvelu ym.)");
createMulticoice(poll, 20, "Millaisia pelejä pelaat mieluiten?", createMulticoice(
poll,
20,
"Millaisia pelejä pelaat mieluiten?",
"Pieniä lyhytkestoisia pelejä (vaikkapa matopeli, pasianssi tai Angry Birds)", "Pieniä lyhytkestoisia pelejä (vaikkapa matopeli, pasianssi tai Angry Birds)",
"Tarinalla varustettuja seikkailu- tai räiskintäpelejä", "Tarinalla varustettuja seikkailu- tai räiskintäpelejä",
"Moninpelejä (esim. räiskintä- tai strategiapelit)", "Moninpelejä (esim. räiskintä- tai strategiapelit)",
"Pelihahmon kehittämistä korostavia pelejä (esim. World of Warcraft tai Fallout-sarjan pelit)"); "Pelihahmon kehittämistä korostavia pelejä (esim. World of Warcraft tai Fallout-sarjan pelit)");
createMulticoice(poll, 30, "Oletko koskaan ostanut mobiilipelejä (esim. Angry Birdsin maksulliset versiot)?", createMulticoice(
"Kyllä", poll,
"Ei", 30,
"Oletko koskaan ostanut mobiilipelejä (esim. Angry Birdsin maksulliset versiot)?",
"Kyllä", "Ei",
"Ei, mutta voisin kuvitella tekeväni niin tulevaisuudessa."); "Ei, mutta voisin kuvitella tekeväni niin tulevaisuudessa.");
createMulticoice(poll, 40, "Oletko maksanut pelaamisesta tai pelisisällöstä nettisivustolla (esim. Facebook tai Habbo Hotel)?", createMulticoice(
"Kyllä", poll,
"Ei", 40,
"Oletko maksanut pelaamisesta tai pelisisällöstä nettisivustolla (esim. Facebook tai Habbo Hotel)?",
"Kyllä", "Ei",
"Ei, mutta voisin kuvitella tekeväni niin tulevaisuudessa."); "Ei, mutta voisin kuvitella tekeväni niin tulevaisuudessa.");
createTextQuestion(poll, 50, createTextQuestion(
poll,
50,
"Koetko todellisuutta ja virtuaalimaailmaa sekoittavat pelit mielenkiintoisina, vai pelaatko mieluummin perinteisiä pelejä? Miksi?"); "Koetko todellisuutta ja virtuaalimaailmaa sekoittavat pelit mielenkiintoisina, vai pelaatko mieluummin perinteisiä pelejä? Miksi?");
createMulticoice(poll, 60, "Osallistuitko verkkopelitapahtuma Insomniassa järjestettyyn InsomniaGame 2.0 -peliin?", createMulticoice(
"Kyllä", poll,
"Ei"); 60,
"Osallistuitko verkkopelitapahtuma Insomniassa järjestettyyn InsomniaGame 2.0 -peliin?",
"Kyllä", "Ei");
createTextQuestion(poll, 70, "Käy tutustumassa peliin Zombies, Run! osoitteessa <a href='http://www.zombiesrungame.com/'> http://www.zombiesrungame.com/</a> Mitä pidät pelin ideasta? Entä keksitkö muita tapoja hyödyntää satelliittipaikannusta peleissä?"); createTextQuestion(
poll,
70,
"Käy tutustumassa peliin Zombies, Run! osoitteessa <a href='http://www.zombiesrungame.com/'> http://www.zombiesrungame.com/</a> Mitä pidät pelin ideasta? Entä keksitkö muita tapoja hyödyntää satelliittipaikannusta peleissä?");
createTextQuestion(poll, 80, "Tärkein kysymys: Millainen on mielestäsi paras peli ja miksi?"); createTextQuestion(poll, 80,
"Tärkein kysymys: Millainen on mielestäsi paras peli ja miksi?");
pollbean.createPoll(poll); pollbean.createPoll(poll);
} }
public void createPalaute() public void createPalaute() {
{
Poll poll = new Poll(); Poll poll = new Poll();
poll.setName("Tapahtumapalaute"); poll.setName("Tapahtumapalaute");
poll.setDescription("Verkkopelitapahtuma Insomnia järjestetään pelaajia varten ja pyrimme kehittämään tapahtumaa vuosi vuodelta. Palautteesi on meille ensiarvoisen tärkeää ja palautetta antaneiden kesken arvotaan pro-konepaikkoja ensi vuoden Insomniaan! Palautelomake on auki 6.11. asti ja konepaikka-arvonta suoritetaan 7.11. Voittajille ilmoitetaan henkilökohtaisesti."); poll.setDescription("Verkkopelitapahtuma Insomnia järjestetään pelaajia varten ja pyrimme kehittämään tapahtumaa vuosi vuodelta. Palautteesi on meille ensiarvoisen tärkeää ja palautetta antaneiden kesken arvotaan pro-konepaikkoja ensi vuoden Insomniaan! Palautelomake on auki 6.11. asti ja konepaikka-arvonta suoritetaan 7.11. Voittajille ilmoitetaan henkilökohtaisesti.");
...@@ -192,14 +212,11 @@ public class TestDataView { ...@@ -192,14 +212,11 @@ public class TestDataView {
createTextQuestion(poll, 20, createTextQuestion(poll, 20,
"Miten mielestäsi onnistuimme peliturnauksissa pelattavien pelien valinnassa?"); "Miten mielestäsi onnistuimme peliturnauksissa pelattavien pelien valinnassa?");
createTextQuestion(poll, 30, createTextQuestion(poll, 30, "Toimiko uusi nukkuma-alue?");
"Toimiko uusi nukkuma-alue?");
createTextQuestion(poll, 40, createTextQuestion(poll, 40, "Mitä pidit InsomniaGame2.0:sta?");
"Mitä pidit InsomniaGame2.0:sta?");
createTextQuestion(poll, 50, createTextQuestion(poll, 50, "Kanada, eli muu palaute tapahtumasta?");
"Kanada, eli muu palaute tapahtumasta?");
pollbean.createPoll(poll); pollbean.createPoll(poll);
...@@ -219,7 +236,9 @@ public class TestDataView { ...@@ -219,7 +236,9 @@ public class TestDataView {
createTextQuestion(poll, 10, createTextQuestion(poll, 10,
"Millainen oli yleinen fiilis tapahtumassa?"); "Millainen oli yleinen fiilis tapahtumassa?");
createTextQuestion(poll, 20, "Mitä pidit tapahtuman kilpailuista?"); createTextQuestion(poll, 20, "Mitä pidit tapahtuman kilpailuista?");
createTextQuestion(poll, 30, createTextQuestion(
poll,
30,
"Mitä mieltä olit tapahtuman kilpailujen aikataulusta ja oliko neljäpäiväinen tapahtuma hyvä juttu?"); "Mitä mieltä olit tapahtuman kilpailujen aikataulusta ja oliko neljäpäiväinen tapahtuma hyvä juttu?");
createTextQuestion(poll, 40, "Muu palaute tapahtumasta:"); createTextQuestion(poll, 40, "Muu palaute tapahtumasta:");
...@@ -246,35 +265,50 @@ public class TestDataView { ...@@ -246,35 +265,50 @@ public class TestDataView {
"Pelaan lähes viikottain", "Pelaan lähes päivittäin"); "Pelaan lähes viikottain", "Pelaan lähes päivittäin");
createMulticoice(poll2, 70, createMulticoice(poll2, 70,
"Miten usein pelaat pelikonsolilla tai tietokoneella?", "En pelaa", "Miten usein pelaat pelikonsolilla tai tietokoneella?",
"Pelaan harvoin", "Pelaan kerran, pari viikossa", "Pelaan päivittäin"); "En pelaa", "Pelaan harvoin", "Pelaan kerran, pari viikossa",
"Pelaan päivittäin");
createMulticoice(poll2, 80, createMulticoice(
poll2,
80,
"Oletko kokeillut opetuspelejä? Esimerkiksi nettiselaimella tai kännykällä?", "Oletko kokeillut opetuspelejä? Esimerkiksi nettiselaimella tai kännykällä?",
"En ole kokeillut", "Olen kokeillut", "Käytän usein"); "En ole kokeillut", "Olen kokeillut", "Käytän usein");
createTextQuestion(poll2, 90, createTextQuestion(poll2, 90,
"Millaisen opetuspelin kokisit sekä hyödyllisenä että hauskana?"); "Millaisen opetuspelin kokisit sekä hyödyllisenä että hauskana?");
createMulticoice(poll2, 95, createMulticoice(
poll2,
95,
"Kokisitko roolipeleistä tutut kokemuspisteet ja kokemustasojen tavoittelun motivaatiota kasvattanava asiana oppimispeleissä?", "Kokisitko roolipeleistä tutut kokemuspisteet ja kokemustasojen tavoittelun motivaatiota kasvattanava asiana oppimispeleissä?",
"Kyllä", "Ei"); "Kyllä", "Ei");
createMulticoice(poll2, 100, createMulticoice(
poll2,
100,
"Oletko käyttänyt sijaintitietoon perustuvia palveluja, kuten Google Latitude tai Foursquare?", "Oletko käyttänyt sijaintitietoon perustuvia palveluja, kuten Google Latitude tai Foursquare?",
"En ole kokeillut", "Olen kokeillut", "Käytän usein"); "En ole kokeillut", "Olen kokeillut", "Käytän usein");
createTextQuestion(poll2, 110, createTextQuestion(
poll2,
110,
"Millaisia käyttötapoja näkisit sijaintitietoon perustuvilla peleillä tai palveluilla oppimiskäytössä?"); "Millaisia käyttötapoja näkisit sijaintitietoon perustuvilla peleillä tai palveluilla oppimiskäytössä?");
createMulticoice(poll2, 120, createMulticoice(
poll2,
120,
"Käytätkö sosiaalisen median palveluita, kuten Facebookia tai IRC-Galleriaa?", "Käytätkö sosiaalisen median palveluita, kuten Facebookia tai IRC-Galleriaa?",
"En ole kokeillut", "Olen kokeillut", "Käytän usein"); "En ole kokeillut", "Olen kokeillut", "Käytän usein");
createTextQuestion(poll2, 130, createTextQuestion(
poll2,
130,
"Millaisia käyttötapoja näkisit sosiaalisen mediaan perustuvilla palveluilla oppimiskäytössä?"); "Millaisia käyttötapoja näkisit sosiaalisen mediaan perustuvilla palveluilla oppimiskäytössä?");
createTextQuestion(poll2, 140, createTextQuestion(
poll2,
140,
"Olet ehkä kuullut termin \"pilvipalvelut\". Miltä kuulostaisi ajatus siitä että pelikonsoli ei fyysisesti olisikaan kotonasi, vaan pelien sisältö tulisi suoraan verkkopalvelusta?"); "Olet ehkä kuullut termin \"pilvipalvelut\". Miltä kuulostaisi ajatus siitä että pelikonsoli ei fyysisesti olisikaan kotonasi, vaan pelien sisältö tulisi suoraan verkkopalvelusta?");
pollbean.createPoll(poll2); pollbean.createPoll(poll2);
...@@ -299,15 +333,14 @@ public class TestDataView { ...@@ -299,15 +333,14 @@ public class TestDataView {
} }
} }
private PollQuestion createTextQuestion(Poll poll, int sort, String private PollQuestion createTextQuestion(Poll poll, int sort, String string,
string, int chars) { int chars) {
PollQuestion ret = createTextQuestion(poll, sort, string); PollQuestion ret = createTextQuestion(poll, sort, string);
ret.setCharacters(chars); ret.setCharacters(chars);
return ret; return ret;
} }
private PollQuestion createTextQuestion(Poll poll, int sort, String private PollQuestion createTextQuestion(Poll poll, int sort, String question) {
question) {
PollQuestion q1 = new PollQuestion(poll); PollQuestion q1 = new PollQuestion(poll);
q1.setQuestion(question); q1.setQuestion(question);
q1.setSort(sort); q1.setSort(sort);
......
package fi.insomnia.bortal.web.cdiview.menu;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import javax.faces.context.FacesContext;
import fi.insomnia.bortal.beans.PermissionBeanLocal;
import fi.insomnia.bortal.beans.SitePageBeanLocal;
import fi.insomnia.bortal.enums.apps.BillPermission;
import fi.insomnia.bortal.enums.apps.MapPermission;
import fi.insomnia.bortal.enums.apps.PollPermission;
import fi.insomnia.bortal.enums.apps.UserPermission;
//@SessionScoped
//@Named
public class MenuDataView {
private ArrayList<JsfMenuitem> topmenu;
private ArrayList<JsfMenuitem> submenu;
private Integer pagegroupId;
private PageGroup currentPagegroup;
// @Inject
private FacesContext context;
// @EJB
private PermissionBeanLocal permbean;
// @EJB
private SitePageBeanLocal sitePageBean;
private ResourceBundle rb;
private static List<PageGroup> PAGEGROUPS;
private String localize(String key) {
String value = null;
try {
value = getResourcebundle().getString(key);
} catch (MissingResourceException e) {
value = null;
}
if (key == null) {
value = "########";
} else if (value == null) {
value = "???" + key + "???";
}
return value;
}
private ResourceBundle getResourcebundle() {
if (rb == null) {
rb = context.getApplication().getResourceBundle(context, "i18n");
}
return rb;
}
public List<PageGroup> getPagegroups()
{
return PAGEGROUPS;
}
static {
PageGroup userpages = new PageGroup("userpages");
PageGroup adminpages = new PageGroup("adminpages");
PAGEGROUPS = Collections.unmodifiableList(Arrays.asList(userpages, adminpages));
// Frontpage
userpages.initMenugroup("frontpage");
userpages.addPage("/index", UserPermission.ANYUSER);
userpages.addPage("/user/create", UserPermission.CREATE_NEW);
userpages.addPage("/auth/sendResetMail", UserPermission.LOGIN);
// User
userpages.initMenugroup("user");
userpages.addPage("/user/edit", UserPermission.VIEW_SELF).setHeader("submenu.user.userlinks");
userpages.addPage("/user/changePassword", null);
userpages.addPage("/user/accountEvents", null);
userpages.addPage("/place/myGroups", null);
userpages.addPage("/place/insertToken", null);
userpages.addPage("/user/sendPicture", null);
userpages.addPage("/user/list", UserPermission.VIEW_ALL).setHeader("submenu.user.manageuserlinks");
userpages.addPage("/user/create", UserPermission.VIEW_ALL);
userpages.addPage("/role/list", UserPermission.READ_ROLES).setHeader("submenu.user.rolelinks");
userpages.addPage("/role/create", UserPermission.WRITE_ROLES);
userpages.addPage("/user/listCardTemplates", UserPermission.READ_ROLES);
userpages.addPage("/user/createCardTemplate", UserPermission.WRITE_ROLES);
// Placemap
userpages.initMenugroup("placemap");
userpages.addPage("/place/placemap", MapPermission.VIEW);
// Shop
userpages.initMenugroup("shop");
userpages.addPage("/shop/createBill", BillPermission.CREATE_BILL);
userpages.addPage("/bill/list", BillPermission.VIEW_OWN);
// Poll
userpages.initMenugroup("poll");
userpages.addPage("/poll/index", PollPermission.ANSWER);
}
public void setContext(FacesContext context) {
this.context = context;
}
public FacesContext getContext() {
return context;
}
// public List<JsfMenuitem> getTopmenu() {
//
// if (topmenu == null) {
// topmenu = new ArrayList<JsfMenuitem>();
//
// Menuitem currentPage = PAGEGROUPS.get(getPagename());
// MenuGroup currentGroup = null;
// if (currentPage != null) {
// currentGroup = currentPage.getGroup();
// }
//
// for (MenuGroup m : PAGEGROUPS) {
// for (Menuitem item : m.getItems()) {
// if (permbean.hasPermission(item.getPermission())) {
// JsfMenuitem thisitem = new JsfMenuitem(item, this.localize(item,
// "menu"));
// topmenu.add(thisitem);
// if (m.equals(currentGroup)) {
// thisitem.setSelected();
// }
// break;
// }
// }
// }
//
// for (SitePage sitepage : sitePageBean.getPagerootsForUser())
// {
// topmenu.add(new JsfMenuitem(sitepage));
// }
// }
//
// return topmenu;
// }
private String localize(Menuitem item, String prefix) {
StringBuilder sb = new StringBuilder(prefix);
for (String part : item.getUrl().split("/")) {
if (!part.isEmpty()) {
sb.append(".").append(part);
}
}
return localize(sb.toString());
}
public void setSubmenu(ArrayList<JsfMenuitem> submenu) {
this.submenu = submenu;
}
// public ArrayList<JsfMenuitem> getSubmenu() {
// if (submenu == null) {
// Menuitem currentPage = PAGEGROUPS.get(getPagename());
// if (currentPage != null) {
// MenuGroup currentGroup = currentPage.getGroup();
//
// submenu = new ArrayList<JsfMenuitem>();
// for (Menuitem item : currentGroup.getItems()) {
// if (permbean.hasPermission(item.getPermission())) {
// JsfMenuitem thisitem = new JsfMenuitem(item, localize(item, "submenu"));
// submenu.add(thisitem);
// if (currentPage.equals(item)) {
// thisitem.setSelected();
// }
// }
// }
//
// }
// }
// return submenu;
// }
}
\ No newline at end of file
package fi.insomnia.bortal.web.cdiview.menu;
import java.util.ArrayList;
import java.util.List;
import fi.insomnia.bortal.enums.apps.IAppPermission;
public class MenuGroup {
private final List<Menuitem> items = new ArrayList<Menuitem>();
private final String groupname;
public MenuGroup(String name) {
groupname = name;
}
public String getGroupname() {
return groupname;
}
public List<Menuitem> getItems() {
return items;
}
public Menuitem addPage(String url, IAppPermission perm) {
Menuitem ret = new Menuitem(url, this, perm);
items.add(ret);
return ret;
}
}
package fi.insomnia.bortal.web.cdiview.menu;
import fi.insomnia.bortal.enums.apps.IAppPermission;
public class Menuitem {
private final String url;
private final MenuGroup group;
private final IAppPermission permission;
private String header;
public Menuitem(String url, MenuGroup group, IAppPermission perm) {
this.url = url;
this.permission = perm;
this.group = group;
}
public String getUrl() {
return url;
}
public MenuGroup getGroup() {
return group;
}
public IAppPermission getPermission() {
return permission;
}
public Menuitem setHeader(String string) {
header = string;
return this;
}
public String getHeader() {
return header;
}
}
package fi.insomnia.bortal.web.cdiview.menu;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import fi.insomnia.bortal.enums.apps.IAppPermission;
public class PageGroup {
private final String name;
private final List<MenuGroup> menugroups;
private MenuGroup currentMenugroup;
private final Map<String, Menuitem> pages;
public PageGroup(String name) {
this.name = name;
this.menugroups = new ArrayList<MenuGroup>();
pages = new HashMap<String, Menuitem>();
}
public String getName()
{
return name;
}
public Menuitem addPage(String url, IAppPermission perm) {
Menuitem ret = currentMenugroup.addPage(url, perm);
pages.put(url, ret);
return ret;
}
public void initMenugroup(String menuname) {
currentMenugroup = new MenuGroup(menuname);
menugroups.add(currentMenugroup);
}
}
package fi.insomnia.bortal.web.cdiview.shop;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class ReaderNameContainer implements Serializable {
private static final long serialVersionUID = 571747919767505523L;
private Integer readerId;
public Integer getReaderId() {
return readerId;
}
public void setReaderId(Integer readerId) {
this.readerId = readerId;
}
}
package fi.insomnia.bortal.web.cdiview.shop;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.ejb.EJB;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.ReaderEvent;
import fi.insomnia.bortal.web.helpers.RfidEvent;
@Named
@ApplicationScoped
public class RfidContainer {
private static final Logger logger = LoggerFactory.getLogger(RfidContainer.class);
private final Map<Integer, Map<String, List<RfidEvent>>> events = Collections.synchronizedMap(new HashMap<Integer, Map<String, List<RfidEvent>>>());
@EJB
private EventBeanLocal evbean;
public synchronized void foundTag(String reader, String tag, ReaderEvent revent) {
LanEvent currEv = evbean.getCurrentEvent();
if (!events.containsKey(currEv.getId())) {
events.put(currEv.getId(), Collections.synchronizedMap(new HashMap<String, List<RfidEvent>>()));
}
Map<String, List<RfidEvent>> eventMap = events.get(currEv.getId());
logger.debug("Found tag {} tag {}", reader, tag);
if (!eventMap.containsKey(reader)) {
eventMap.put(reader, new LinkedList<RfidEvent>());
}
List<RfidEvent> readerevents = eventMap.get(reader);
while (readerevents.size() > 20) {
readerevents.remove(readerevents.size() - 1);
logger.debug("Cleaning readerevents fro reader {}", reader);
}
if (readerevents.size() > 0 && readerevents.get(0).getTag().equals(tag)) {
readerevents.get(0).seen();
} else {
readerevents.add(0, new RfidEvent(reader, tag, revent));
logger.debug("Readerevents size {}", readerevents.size());
}
}
public List<String> getReaders() {
LanEvent currEv = evbean.getCurrentEvent();
if (events.containsKey(currEv.getId())) {
Set<String> retset = events.get(currEv.getId()).keySet();
ArrayList<String> ret = new ArrayList<String>();
ret.addAll(retset);
return ret;
}
return null;
}
public List<RfidEvent> getReaderEvents(String readername) {
LanEvent currEv = evbean.getCurrentEvent();
if (events.containsKey(currEv.getId())) {
return events.get(currEv.getId()).get(readername);
}
return null;
}
}
package fi.insomnia.bortal.web.cdiview.shop; package fi.insomnia.bortal.web.cdiview.shop;
import javax.ejb.EJB; imimport javax.ejb.EJB;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
......
...@@ -19,9 +19,9 @@ import fi.insomnia.bortal.web.cdiview.GenericCDIView; ...@@ -19,9 +19,9 @@ import fi.insomnia.bortal.web.cdiview.GenericCDIView;
@Named @Named
@RequestScoped @RequestScoped
public class AuthView extends GenericCDIView { public class AuthView exten AuthView extends GenericCDIView {
private static final long serialVersionUID = -124938035666457802L; priv long serialVersionUID = -124938035666457802L;
private static final Logger logger = LoggerFactory.getLogger(AuthView.class); private static final Logger logger = LoggerFactory.getLogger(AuthView.class);
......
...@@ -22,6 +22,7 @@ import fi.insomnia.bortal.utilities.I18n; ...@@ -22,6 +22,7 @@ import fi.insomnia.bortal.utilities.I18n;
import fi.insomnia.bortal.web.annotations.SelectedUser; import fi.insomnia.bortal.web.annotations.SelectedUser;
import fi.insomnia.bortal.web.cdiview.GenericCDIView; import fi.insomnia.bortal.web.cdiview.GenericCDIView;
@Named @Named
@ConversationScoped @ConversationScoped
public class CardView extends GenericCDIView { public class CardView extends GenericCDIView {
......
...@@ -14,6 +14,7 @@ import fi.insomnia.bortal.model.User; ...@@ -14,6 +14,7 @@ import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.utilities.PasswordFunctions; import fi.insomnia.bortal.utilities.PasswordFunctions;
import fi.insomnia.bortal.web.cdiview.GenericCDIView; import fi.insomnia.bortal.web.cdiview.GenericCDIView;
@Named("pwdResetView") @Named("pwdResetView")
@ConversationScoped @ConversationScoped
public class PasswordResetView extends GenericCDIView { public class PasswordResetView extends GenericCDIView {
...@@ -98,53 +99,38 @@ public class PasswordResetView extends GenericCDIView { ...@@ -98,53 +99,38 @@ public class PasswordResetView extends GenericCDIView {
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
public void setId(Integer id) {
public String getHash() { this.id = id;
return hash; }blic void setHash(String hash) {
} this.hash = hash;
public void setHash(String hash) { public void setHash(String hash) {
this.hash = hash; this.hash = hash;
} }
public void setPassword(String password) {
public String getPassword() {
return password;
}
public void setPassword(String password) { public void setPassword(String password) {
this.password = password; this.password = password;
}nfirm;
} }
public String getConfirm() { public void setConfirm(String confirm) {
return confirm;
}
public void setConfirm(String confirm) { public void setConfirm(String confirm) {
this.confirm = confirm; this.confirm = confirm;
} }
public User getUser() {
return user;
} }
public void setUser(User user) { public void setUser(User user) {
this.user = user; this.user = user;
} }
public String getMailuser() { public void setUser(User user) {
return mailuser; this.user = user;
} }ublic void setMailuser(String mailuser) {
public void setMailuser(String mailuser) { public void setMailuser(String mailuser) {
this.mailuser = mailuser; this.mailuser = mailuser;
} }eturn userbean;
public UserBeanLocal getUserbean() {
return userbean;
} }
public void setUserbean(UserBeanLocal userbean) { public void setUserbean(UserBeanLocal userbean) {
public void setUserbean(UserBeanLocal userbean) {
this.userbean = userbean; this.userbean = userbean;
} }
\ No newline at end of file
}
...@@ -12,6 +12,7 @@ import fi.insomnia.bortal.model.User; ...@@ -12,6 +12,7 @@ import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.web.annotations.SelectedUser; import fi.insomnia.bortal.web.annotations.SelectedUser;
import fi.insomnia.bortal.web.cdiview.GenericCDIView; import fi.insomnia.bortal.web.cdiview.GenericCDIView;
@Named @Named
@ConversationScoped @ConversationScoped
public class PasswordView extends GenericCDIView { public class PasswordView extends GenericCDIView {
......
...@@ -14,6 +14,7 @@ import fi.insomnia.bortal.beans.RoleBeanLocal; ...@@ -14,6 +14,7 @@ import fi.insomnia.bortal.beans.RoleBeanLocal;
import fi.insomnia.bortal.model.Role; import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.web.cdiview.GenericCDIView; import fi.insomnia.bortal.web.cdiview.GenericCDIView;
@Named @Named
@RequestScoped @RequestScoped
public class RoleDataView extends GenericCDIView { public class RoleDataView extends GenericCDIView {
......
...@@ -24,6 +24,7 @@ import fi.insomnia.bortal.web.cdiview.GenericCDIView; ...@@ -24,6 +24,7 @@ import fi.insomnia.bortal.web.cdiview.GenericCDIView;
import fi.insomnia.bortal.web.helpers.ApplicationPermissionWrapper; import fi.insomnia.bortal.web.helpers.ApplicationPermissionWrapper;
import fi.insomnia.bortal.web.helpers.BortalApplicationWrapper; import fi.insomnia.bortal.web.helpers.BortalApplicationWrapper;
@ConversationScoped @ConversationScoped
@Named @Named
public class RoleView extends GenericCDIView { public class RoleView extends GenericCDIView {
......
...@@ -22,7 +22,9 @@ public class UserCardView extends GenericCDIView { ...@@ -22,7 +22,9 @@ public class UserCardView extends GenericCDIView {
@SelectedUser @SelectedUser
private User user; private User user;
private ListDataModel<PrintedCard> printedCards; @Inject
@SelectedUser
private User user;rds;
public User getUser() { public User getUser() {
return user; return user;
...@@ -33,15 +35,13 @@ public class UserCardView extends GenericCDIView { ...@@ -33,15 +35,13 @@ public class UserCardView extends GenericCDIView {
} }
public ListDataModel<PrintedCard> getPrintedCards() { public ListDataModel<PrintedCard> getPrintedCards() {
public ListDataModel<PrintedCard> getPrintedCards() {
if (printedCards == null && user != null) if (printedCards == null && user != null)
{ {
printedCards = new ListDataModel<PrintedCard>(cardBean.getCards(user)); printedCards = new ListDataModel<PrintedCard>(cardBean.getCards(user));
} }
return printedCards; return printedCards;
} }
public void setPrintedCards(ListDataModel<PrintedCard> printedCards) {
this.printedCards = printedCards;
} }
} }
...@@ -58,16 +58,11 @@ public abstract class GenericIntegerEntityConverter<T extends ModelInterface<Int ...@@ -58,16 +58,11 @@ public abstract class GenericIntegerEntityConverter<T extends ModelInterface<Int
T ret = null; T ret = null;
Integer id = null; Integer id = null;
if (value != null) { if (value != null) {
try {
id = Integer.parseInt(value); id = Integer.parseInt(value);
if (id != null) { if (id != null && id > 0) {
ret = find(id); ret = find(id);
} }
} catch (NumberFormatException nfe) {
if (value == null || !value.equals("null")) {
throw nfe;
}
}
} }
logger.debug("Converted String {} to Integer {} became object {}", new Object[] { value, id, ret }); logger.debug("Converted String {} to Integer {} became object {}", new Object[] { value, id, ret });
return ret; return ret;
...@@ -86,7 +81,7 @@ public abstract class GenericIntegerEntityConverter<T extends ModelInterface<Int ...@@ -86,7 +81,7 @@ public abstract class GenericIntegerEntityConverter<T extends ModelInterface<Int
} }
if (ret == null) if (ret == null)
{ {
ret = "null"; ret = "0";
} }
return ret; return ret;
} }
......
package fi.insomnia.bortal.web.helper;
/**
* Copypaste from http://forums.sun.com/thread.jspa?threadID=5136965
*
*/
import java.util.HashMap;
import java.util.StringTokenizer;
import javax.faces.FactoryFinder;
import javax.faces.application.ApplicationFactory;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.NoneScoped;
import javax.faces.context.FacesContext;
@ManagedBean(name = "util")
@NoneScoped
public class ConcatMBean extends HashMap<Object, Object> {
/**
*
*/
private static final long serialVersionUID = -6232280680582906176L;
/**
* Concat the string separated by a comma Evaluate JSF EL expression if
* token begin by # or $
*
* @param inObject
* : is the list of string to concat separated by a comma. return
* a String exemple : <h:outputText
* value="#{lang[concat['mpr.canton.,#offer.canton']]}"/>
*/
public Object concat(Object a, Object b) {
return new StringBuilder().append(a).append(b).toString();
}
public Object get(Object inObject) {
StringBuffer resultBuffer = new StringBuffer();
try {
String inToken = (String) inObject;
StringTokenizer tok = new StringTokenizer((String) inToken, ",", false);
while (tok.hasMoreTokens()) {
String token = tok.nextToken().trim();
if (token.startsWith("#{")) {
Object tokenEvaluated = this.getElValue(token);
resultBuffer.append(String.valueOf(tokenEvaluated));
} else if (token.startsWith("${")) {
token = token.substring(2, token.length() - 1);
Object tokenEvaluated = this.getElValue(this.getJsfEl(token));
resultBuffer.append(String.valueOf(tokenEvaluated));
} else if (token.startsWith("#")) {
token = token.substring(1);
Object tokenEvaluated = this.getElValue(this.getJsfEl(token));
resultBuffer.append(String.valueOf(tokenEvaluated));
} else {
resultBuffer.append(token);
}
}
} catch (Exception e) {
System.out.println("ConcatenationBackingBean error: " + e.getMessage());
}
return resultBuffer.toString();
}
private Object getElValue(String el) {
ApplicationFactory appFactory = (ApplicationFactory) FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY);
return appFactory.getApplication().evaluateExpressionGet(FacesContext.getCurrentInstance(), el, java.lang.String.class);
}
private String getJsfEl(String value) {
return "#{" + value + "}";
}
}
package fi.insomnia.bortal.web.helpers;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import fi.insomnia.bortal.model.ReaderEvent;
public class RfidEvent {
public RfidEvent(String reader, String tag, ReaderEvent revent) {
this.reader = reader;
this.tag = tag;
this.event = revent;
}
public void seen() {
time = Calendar.getInstance();
}
public String getSeenSince() {
long diffSec = (Calendar.getInstance().getTimeInMillis() - time.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();
}
private Calendar time = Calendar.getInstance();
private String reader;
private String tag;
private ReaderEvent event;
private List<String> actions = new ArrayList<String>();
public Calendar getTime() {
return time;
}
public void setTime(Calendar time) {
this.time = time;
}
public String getReader() {
return reader;
}
public void setReader(String reader) {
this.reader = reader;
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
public ReaderEvent getEvent() {
return event;
}
public void setEvent(ReaderEvent event) {
this.event = event;
}
public List<String> getActions() {
return actions;
}
public void setActions(List<String> actions) {
this.actions = actions;
}
public void addMessage(String msg) {
this.actions.add(msg);
}
}
\ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!