Commit ec9d6970 by unknown

Composivujen luontia

2 parents 90b66102 52a2f10c
Showing with 2443 additions and 474 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
-----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;
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!