diff --git a/INSTALL b/INSTALL index 7618b9a..0e965b7 100644 --- a/INSTALL +++ b/INSTALL @@ -5,7 +5,7 @@ For install instructions in non-English languages, see the wiki: phpLDAPadmin requires the following: a. A web server (Apache, IIS, etc). - b. PHP 4.1.0 or newer (with LDAP support) + b. PHP 5.0.0 or newer (with LDAP support) * To install diff --git a/VERSION b/VERSION index 11e7b29..88205e3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -$Name: RELEASE-1_0_0 $ +$Name: RELEASE-1_1_0 $ diff --git a/config/config.php.example b/config/config.php.example index d119537..79cbde4 100644 --- a/config/config.php.example +++ b/config/config.php.example @@ -66,6 +66,67 @@ $config->custom->session['blowfish'] = ''; environments. */ # $config->custom->password['no_random_crypt_salt'] = true; +/*********************************************/ +/* Commands */ +/*********************************************/ + +/* Command availability ; if you don't authorize a command the command + links will not be shown and the command action will not be permitted. + For better security, set also ACL in your ldap directory. */ + +/* +$config->custom->commands['all'] = array( + 'home' => true, + 'external_links' => array('feature' => true, + 'bug' => true, + 'donation' => true, + 'help' => true, + 'credits' => true), + 'purge' => true, + 'schema' => true, + 'import' => false, + 'export' => true, + 'search' => array('simple_search' => true, + 'predefined_search' => false, + 'advanced_search' => false), + 'server_refresh' => false, + 'server_info' => false, + 'entry_refresh' => true, + 'entry_move' => true, + 'entry_internal_attributes_show' => true, + 'entry_delete' => array('simple_delete' => true, + 'mass_delete' => false), + 'entry_rename' => true, + 'entry_compare' => true, + 'entry_create' => true, + 'attribute_add' => true, + 'attribute_add_value' => true, + 'attribute_delete' => true, + 'attribute_delete_value' => true); +*/ + +/*********************************************/ +/* Appearance */ +/*********************************************/ + +/* If you want to choose the appearance of the tree, specify a class name which + inherits from the Tree class. */ +// $config->custom->appearance['tree'] = "HTMLTree"; +# $config->custom->appearance['tree'] = "PLMTree"; + +/* If you want to customise the entry view/edition, specify your factory name which + inherits from the EntryFactory class. + The 'DefaultEntryFactory' draws all the attributes of an entry according this + config file and the ldap schema definition ; the 'TemplateEntryFactory' draws + an entry according to the template whose regexp matches with the dn. */ +# $config->custom->appearance['entry_factory'] = "DefaultEntryFactory"; +// $config->custom->appearance['entry_factory'] = "TemplateEntryFactory"; + +/* If you want to customise an attribute view/edition, specify your factory name which + inherits from the AttributeFactory class. + An AttributeFactory defines which class to use to represent a given attribute */ +// $config->custom->appearance['attribute_factory'] = "AttributeFactory"; + /* Configure what objects are shown in left hand tree */ // $config->custom->appearance['tree_filter'] = '(objectclass=*)'; @@ -94,12 +155,14 @@ $ldapservers->SetValue($i,'server','name','My LDAP Server'); auto-detect it for you. */ // $ldapservers->SetValue($i,'server','base',array('')); -/* Three options for auth_type: +/* Four options for auth_type: 1. 'cookie': you will login via a web form, and a client-side cookie will store your login dn and password. 2. 'session': same as cookie but your login dn and password are stored on the web server in a persistent session variable. - 3. 'config': specify your login dn and password here in this config file. No + 3. 'http': same as session but your login dn and password are retrieved via + HTTP authentication. + 4. 'config': specify your login dn and password here in this config file. No login will be required to use phpLDAPadmin for this server. Choose wisely to protect your authentication information appropriately for @@ -188,6 +251,14 @@ $ldapservers->SetValue($i,'server','name','My LDAP Server'); users in. See 'login_string' directly below. */ // $ldapservers->SetValue($i,'login','attr','dn'); +/* If you specified something different from 'dn', for example 'uid', as the + login_attr above, you can optionally specify here to fall back to + authentication with dn. + This is useful, when users should be able to log in with their uid, but + the ldap administrator wants to log in with his root-dn, that does not + necessarily have the uid attribute. */ +// $ldapservers->SetValue($i,'login','fallback_dn',false); + /* If you specified 'cookie' or 'session' as the auth_type above, and you specified 'string' for 'login_attr' above, you must provide a string here for logging users in. If, for example, I have a lot of user entries with DNs like diff --git a/doc/certs/ca-bundle.crt b/doc/certs/ca-bundle.crt new file mode 100644 index 0000000..dea4c9f --- /dev/null +++ b/doc/certs/ca-bundle.crt @@ -0,0 +1,4567 @@ +## +## Extracted from the mod_ssl-2.7.1-1.3.14 source tree 25 October 2000. +## +## ca-bundle.crt -- Bundle of CA Root Certificates +## Last Modified: Thu Mar 2 09:32:46 CET 2000 +## +## This is a bundle of X.509 certificates of public +## Certificate Authorities (CA). These were automatically +## extracted from Netscape Communicator 4.72's certificate database +## (the file `cert7.db'). It contains the certificates in both +## plain text and PEM format and therefore can be directly used +## with an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## (SKIPME) +## + +ABAecom (sub., Am. Bankers Assn.) Root CA +========================================= +MD5 Fingerprint: 82:12:F7:89:E1:0B:91:60:A4:B6:22:9F:94:68:11:92 +PEM Data: +-----BEGIN CERTIFICATE----- +MIID+DCCAuCgAwIBAgIRANAeQJAAACdLAAAAAQAAAAQwDQYJKoZIhvcNAQEFBQAw +gYwxCzAJBgNVBAYTAlVTMQ0wCwYDVQQIEwRVdGFoMRcwFQYDVQQHEw5TYWx0IExh +a2UgQ2l0eTEYMBYGA1UEChMPWGNlcnQgRVogYnkgRFNUMRgwFgYDVQQDEw9YY2Vy +dCBFWiBieSBEU1QxITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAe +Fw05OTA3MTQxNjE0MThaFw0wOTA3MTExNjE0MThaMIGMMQswCQYDVQQGEwJVUzEN +MAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxGDAWBgNVBAoT +D1hjZXJ0IEVaIGJ5IERTVDEYMBYGA1UEAxMPWGNlcnQgRVogYnkgRFNUMSEwHwYJ +KoZIhvcNAQkBFhJjYUBkaWdzaWd0cnVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCtVBjetL/3reh0qu2LfI/C1HUa1YS5tmL8ie/kl2GS+x24 +4VpHNJ6eBiL70+o4y7iLB/caoBd3B1owHNQpOCDXJ0DYUJNDv9IYoil2BXKqa7Zp +mKt5Hhxl9WqL/MUWqqJy2mDtTm4ZJXoKHTDjUJtCPETrobAgHtsCfv49H7/QAIrb +QHamGKUVp1e2UsIBF5h3j4qBxhq0airmr6nWAKzP2BVJfNsbof6B+of505DBAsD5 +0ELpkWglX8a/hznplQBgKL+DLMDnXrbXNhbnYId26OcnsiUNi3rlqh3lWc3OCw5v +xsic4xDZhTnTt5v6xrp8dNJddVardKSiUb9SfO5xAgMBAAGjUzBRMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAUCCBsZuuBCmxc1bWmPEHdHJaRJ3cwHQYDVR0O +BBYEFAggbGbrgQpsXNW1pjxB3RyWkSd3MA0GCSqGSIb3DQEBBQUAA4IBAQBah1iP +Lat2IWtUDNnxQfZOzSue4x+boy1/2St9WMhnpCn16ezVvZY/o3P4xFs2fNBjLDQ5 +m0i4PW/2FMWeY+anNG7T6DOzxzwYbiOuQ5KZP5jFaTDxNjutuTCC1rZZFpYCCykS +YbQRifcML5SQhZgonFNsfmPdc/QZ/0qB0bJSI/08SjTOWhvgUIrtT4GV2GDn5MQN +u1g+WPdOaG8+Z8nLepcWJ+xCYRR2uwDF6wg9FX9LtiJdhzuQ9PPA/jez6dliDMDD +Wa9gvR8N26E0HzDEPYutsB0Ek+1f1eS/IDAE9EjpMwHRLpAnUrOb3jocq6mXf5vr +wo3CbezcE9NGxXl8 +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: + d0:1e:40:90:00:00:27:4b:00:00:00:01:00:00:00:04 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, ST=Utah, L=Salt Lake City, O=Xcert EZ by DST, CN=Xcert EZ by DST/Email=ca@digsigtrust.com + Validity + Not Before: Jul 14 16:14:18 1999 GMT + Not After : Jul 11 16:14:18 2009 GMT + Subject: C=US, ST=Utah, L=Salt Lake City, O=Xcert EZ by DST, CN=Xcert EZ by DST/Email=ca@digsigtrust.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:ad:54:18:de:b4:bf:f7:ad:e8:74:aa:ed:8b:7c: + 8f:c2:d4:75:1a:d5:84:b9:b6:62:fc:89:ef:e4:97: + 61:92:fb:1d:b8:e1:5a:47:34:9e:9e:06:22:fb:d3: + ea:38:cb:b8:8b:07:f7:1a:a0:17:77:07:5a:30:1c: + d4:29:38:20:d7:27:40:d8:50:93:43:bf:d2:18:a2: + 29:76:05:72:aa:6b:b6:69:98:ab:79:1e:1c:65:f5: + 6a:8b:fc:c5:16:aa:a2:72:da:60:ed:4e:6e:19:25: + 7a:0a:1d:30:e3:50:9b:42:3c:44:eb:a1:b0:20:1e: + db:02:7e:fe:3d:1f:bf:d0:00:8a:db:40:76:a6:18: + a5:15:a7:57:b6:52:c2:01:17:98:77:8f:8a:81:c6: + 1a:b4:6a:2a:e6:af:a9:d6:00:ac:cf:d8:15:49:7c: + db:1b:a1:fe:81:fa:87:f9:d3:90:c1:02:c0:f9:d0: + 42:e9:91:68:25:5f:c6:bf:87:39:e9:95:00:60:28: + bf:83:2c:c0:e7:5e:b6:d7:36:16:e7:60:87:76:e8: + e7:27:b2:25:0d:8b:7a:e5:aa:1d:e5:59:cd:ce:0b: + 0e:6f:c6:c8:9c:e3:10:d9:85:39:d3:b7:9b:fa:c6: + ba:7c:74:d2:5d:75:56:ab:74:a4:a2:51:bf:52:7c: + ee:71 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Authority Key Identifier: + keyid:08:20:6C:66:EB:81:0A:6C:5C:D5:B5:A6:3C:41:DD:1C:96:91:27:77 + + X509v3 Subject Key Identifier: + 08:20:6C:66:EB:81:0A:6C:5C:D5:B5:A6:3C:41:DD:1C:96:91:27:77 + Signature Algorithm: sha1WithRSAEncryption + 5a:87:58:8f:2d:ab:76:21:6b:54:0c:d9:f1:41:f6:4e:cd:2b: + 9e:e3:1f:9b:a3:2d:7f:d9:2b:7d:58:c8:67:a4:29:f5:e9:ec: + d5:bd:96:3f:a3:73:f8:c4:5b:36:7c:d0:63:2c:34:39:9b:48: + b8:3d:6f:f6:14:c5:9e:63:e6:a7:34:6e:d3:e8:33:b3:c7:3c: + 18:6e:23:ae:43:92:99:3f:98:c5:69:30:f1:36:3b:ad:b9:30: + 82:d6:b6:59:16:96:02:0b:29:12:61:b4:11:89:f7:0c:2f:94: + 90:85:98:28:9c:53:6c:7e:63:dd:73:f4:19:ff:4a:81:d1:b2: + 52:23:fd:3c:4a:34:ce:5a:1b:e0:50:8a:ed:4f:81:95:d8:60: + e7:e4:c4:0d:bb:58:3e:58:f7:4e:68:6f:3e:67:c9:cb:7a:97: + 16:27:ec:42:61:14:76:bb:00:c5:eb:08:3d:15:7f:4b:b6:22: + 5d:87:3b:90:f4:f3:c0:fe:37:b3:e9:d9:62:0c:c0:c3:59:af: + 60:bd:1f:0d:db:a1:34:1f:30:c4:3d:8b:ad:b0:1d:04:93:ed: + 5f:d5:e4:bf:20:30:04:f4:48:e9:33:01:d1:2e:90:27:52:b3: + 9b:de:3a:1c:ab:a9:97:7f:9b:eb:c2:8d:c2:6d:ec:dc:13:d3: + 46:c5:79:7c + +ANX Network CA by DST +===================== +MD5 Fingerprint: A8:ED:DE:EB:93:88:66:D8:2F:C3:BD:1D:BE:45:BE:4D +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDTTCCAragAwIBAgIENm6ibzANBgkqhkiG9w0BAQUFADBSMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMR0wGwYDVQQL +ExREU1QgKEFOWCBOZXR3b3JrKSBDQTAeFw05ODEyMDkxNTQ2NDhaFw0xODEyMDkx +NjE2NDhaMFIxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy +ZSBUcnVzdCBDby4xHTAbBgNVBAsTFERTVCAoQU5YIE5ldHdvcmspIENBMIGdMA0G +CSqGSIb3DQEBAQUAA4GLADCBhwKBgQC0SBGAWKDVpZkP9jcsRLZu0XzzKmueEbaI +IwRccSWeahJ3EW6/aDllqPay9qIYsokVoGe3eowiSGv2hDQftsr3G3LL8ltI04ce +InYTBLSsbJZ/5w4IyTJRMC3VgOghZ7rzXggkLAdZnZAa7kbJtaQelrRBkdR/0o04 +JrBvQ24JfQIBA6OCATAwggEsMBEGCWCGSAGG+EIBAQQEAwIABzB0BgNVHR8EbTBr +MGmgZ6BlpGMwYTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjEdMBsGA1UECxMURFNUIChBTlggTmV0d29yaykgQ0ExDTAL +BgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxNTQ2NDhagQ8yMDE4MTIw +OTE1NDY0OFowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFIwWVXDMFgpTZMKlhKqz +ZBdDP4I2MB0GA1UdDgQWBBSMFlVwzBYKU2TCpYSqs2QXQz+CNjAMBgNVHRMEBTAD +AQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +AEklyWCxDF+pORDTxTRVfc95wynr3vnCQPnoVsXwL+z02exIUbhjOF6TbhiWhbnK +UJykuOpmJmiThW9vTHHQvnoLPDG5975pnhDX0UDorBZxq66rOOFwscqSFuBdhaYY +gAYAnOGmGEJRp2hoWe8mlF+tMQz+KR4XAYQ3W+gSMqNd +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 913220207 (0x366ea26f) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Digital Signature Trust Co., OU=DST (ANX Network) CA + Validity + Not Before: Dec 9 15:46:48 1998 GMT + Not After : Dec 9 16:16:48 2018 GMT + Subject: C=US, O=Digital Signature Trust Co., OU=DST (ANX Network) CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:b4:48:11:80:58:a0:d5:a5:99:0f:f6:37:2c:44: + b6:6e:d1:7c:f3:2a:6b:9e:11:b6:88:23:04:5c:71: + 25:9e:6a:12:77:11:6e:bf:68:39:65:a8:f6:b2:f6: + a2:18:b2:89:15:a0:67:b7:7a:8c:22:48:6b:f6:84: + 34:1f:b6:ca:f7:1b:72:cb:f2:5b:48:d3:87:1e:22: + 76:13:04:b4:ac:6c:96:7f:e7:0e:08:c9:32:51:30: + 2d:d5:80:e8:21:67:ba:f3:5e:08:24:2c:07:59:9d: + 90:1a:ee:46:c9:b5:a4:1e:96:b4:41:91:d4:7f:d2: + 8d:38:26:b0:6f:43:6e:09:7d + Exponent: 3 (0x3) + X509v3 extensions: + Netscape Cert Type: + SSL CA, S/MIME CA, Object Signing CA + X509v3 CRL Distribution Points: + DirName:/C=US/O=Digital Signature Trust Co./OU=DST (ANX Network) CA/CN=CRL1 + + X509v3 Private Key Usage Period: + Not Before: Dec 9 15:46:48 1998 GMT, Not After: Dec 9 15:46:48 2018 GMT + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:8C:16:55:70:CC:16:0A:53:64:C2:A5:84:AA:B3:64:17:43:3F:82:36 + + X509v3 Subject Key Identifier: + 8C:16:55:70:CC:16:0A:53:64:C2:A5:84:AA:B3:64:17:43:3F:82:36 + X509v3 Basic Constraints: + CA:TRUE + 1.2.840.113533.7.65.0: + 0 +..V4.0.... + Signature Algorithm: sha1WithRSAEncryption + 49:25:c9:60:b1:0c:5f:a9:39:10:d3:c5:34:55:7d:cf:79:c3: + 29:eb:de:f9:c2:40:f9:e8:56:c5:f0:2f:ec:f4:d9:ec:48:51: + b8:63:38:5e:93:6e:18:96:85:b9:ca:50:9c:a4:b8:ea:66:26: + 68:93:85:6f:6f:4c:71:d0:be:7a:0b:3c:31:b9:f7:be:69:9e: + 10:d7:d1:40:e8:ac:16:71:ab:ae:ab:38:e1:70:b1:ca:92:16: + e0:5d:85:a6:18:80:06:00:9c:e1:a6:18:42:51:a7:68:68:59: + ef:26:94:5f:ad:31:0c:fe:29:1e:17:01:84:37:5b:e8:12:32: + a3:5d + +American Express CA +=================== +MD5 Fingerprint: 1C:D5:8E:82:BE:70:55:8E:39:61:DF:AD:51:DB:6B:A0 +PEM Data: +-----BEGIN CERTIFICATE----- +MIICkDCCAfkCAgCNMA0GCSqGSIb3DQEBBAUAMIGPMQswCQYDVQQGEwJVUzEnMCUG +A1UEChMeQW1lcmljYW4gRXhwcmVzcyBDb21wYW55LCBJbmMuMSYwJAYDVQQLEx1B +bWVyaWNhbiBFeHByZXNzIFRlY2hub2xvZ2llczEvMC0GA1UEAxMmQW1lcmljYW4g +RXhwcmVzcyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNOTgwODE0MjIwMTAwWhcN +MDYwODE0MjM1OTAwWjCBjzELMAkGA1UEBhMCVVMxJzAlBgNVBAoTHkFtZXJpY2Fu +IEV4cHJlc3MgQ29tcGFueSwgSW5jLjEmMCQGA1UECxMdQW1lcmljYW4gRXhwcmVz +cyBUZWNobm9sb2dpZXMxLzAtBgNVBAMTJkFtZXJpY2FuIEV4cHJlc3MgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJ8kmS +hcr9FSm1BrZE7PyIo/KGzv8UTyQckvnCI8HOQ99dNMi4FOzVKnCRSZXXVs2U8amT +0Ggi3E19oApyKkfqJfCFAF82VGHPC/k3Wmed6R/pZD9wlWGn0DAC3iYopGYDBOkw ++48zB/lvYYeictvzaHhjZlmpybdm4RWySDYs+QIDAQABMA0GCSqGSIb3DQEBBAUA +A4GBAGgXYrhzi0xs60qlPqvlnS7SzYoHV/PGWZd2Fxf4Uo4nk9hY2Chs9KIEeorC +diSxArTfKPL386infiNIYYj0EWiuJl32oUtTJWrYKhQCDuCHIG6eGVxzkAsj4jGX +Iz/VIqLTBnvaN/XXtUFEF3pFAtmFRWbWjsfwegyZYiJpW+3S +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: 141 (0x8d) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=US, O=American Express Company, Inc., OU=American Express Technologies, CN=American Express Certificate Authority + Validity + Not Before: Aug 14 22:01:00 1998 GMT + Not After : Aug 14 23:59:00 2006 GMT + Subject: C=US, O=American Express Company, Inc., OU=American Express Technologies, CN=American Express Certificate Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:c9:f2:49:92:85:ca:fd:15:29:b5:06:b6:44:ec: + fc:88:a3:f2:86:ce:ff:14:4f:24:1c:92:f9:c2:23: + c1:ce:43:df:5d:34:c8:b8:14:ec:d5:2a:70:91:49: + 95:d7:56:cd:94:f1:a9:93:d0:68:22:dc:4d:7d:a0: + 0a:72:2a:47:ea:25:f0:85:00:5f:36:54:61:cf:0b: + f9:37:5a:67:9d:e9:1f:e9:64:3f:70:95:61:a7:d0: + 30:02:de:26:28:a4:66:03:04:e9:30:fb:8f:33:07: + f9:6f:61:87:a2:72:db:f3:68:78:63:66:59:a9:c9: + b7:66:e1:15:b2:48:36:2c:f9 + Exponent: 65537 (0x10001) + Signature Algorithm: md5WithRSAEncryption + 68:17:62:b8:73:8b:4c:6c:eb:4a:a5:3e:ab:e5:9d:2e:d2:cd: + 8a:07:57:f3:c6:59:97:76:17:17:f8:52:8e:27:93:d8:58:d8: + 28:6c:f4:a2:04:7a:8a:c2:76:24:b1:02:b4:df:28:f2:f7:f3: + a8:a7:7e:23:48:61:88:f4:11:68:ae:26:5d:f6:a1:4b:53:25: + 6a:d8:2a:14:02:0e:e0:87:20:6e:9e:19:5c:73:90:0b:23:e2: + 31:97:23:3f:d5:22:a2:d3:06:7b:da:37:f5:d7:b5:41:44:17: + 7a:45:02:d9:85:45:66:d6:8e:c7:f0:7a:0c:99:62:22:69:5b: + ed:d2 + +American Express Global CA +========================== +MD5 Fingerprint: 63:1B:66:93:8C:F3:66:CB:3C:79:57:DC:05:49:EA:DB +PEM Data: +-----BEGIN CERTIFICATE----- +MIIEBDCCAuygAwIBAgICAIUwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAlVT +MScwJQYDVQQKEx5BbWVyaWNhbiBFeHByZXNzIENvbXBhbnksIEluYy4xJjAkBgNV +BAsTHUFtZXJpY2FuIEV4cHJlc3MgVGVjaG5vbG9naWVzMTYwNAYDVQQDEy1BbWVy +aWNhbiBFeHByZXNzIEdsb2JhbCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNOTgw +ODE0MTkwNjAwWhcNMTMwODE0MjM1OTAwWjCBljELMAkGA1UEBhMCVVMxJzAlBgNV +BAoTHkFtZXJpY2FuIEV4cHJlc3MgQ29tcGFueSwgSW5jLjEmMCQGA1UECxMdQW1l +cmljYW4gRXhwcmVzcyBUZWNobm9sb2dpZXMxNjA0BgNVBAMTLUFtZXJpY2FuIEV4 +cHJlc3MgR2xvYmFsIENlcnRpZmljYXRlIEF1dGhvcml0eTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAPAkJmYu++tKc3FTiUfLJjxTkpRMysKFtQ34w1e9 +Lyofahi3V68MABb6oLaQpvcaoS5mJsdoo4qTaWa1RlYtHYLqkAwKIsKJUI0F89Sr +c0HwzxKsKLRvFJSWWUuekHWG3+JH6+HpT0N+h8onGGaetcFAZX38YW+tm3LPqV7Y +8/nabpEQ+ky16n4g3qk5L/WI5IpvNcYgnCuGRjMK/DFVpWusFkDpzTVZbzIEw3u1 +D3t3cPNIuypSgs6vKW3xEW9t5gcAAe+a8yYNpnkTZ6/4qxx1rJG1a75AsN6cDLFp +hRlxkRNFyt/R/eayypaDedvFuKpbepALeFY+xteflEgR9a0CAwEAAaNaMFgwEgYD +VR0TAQH/BAgwBgEB/wIBBTAOBgNVHQ8BAf8EBAMCAQYwFwYDVR0gBBAwDjAMBgoq +hkiG+Q8KAQUBMBkGA1UdDgQSBBBXRzV7NicRqAj8L0Yl6yRpMA0GCSqGSIb3DQEB +BQUAA4IBAQDHYUWoinG5vjTpIXshzVYTmNUwY+kYqkuSFb8LHbvskmnFLsNhi+gw +RcsQRsFzOFyLGdIr80DrfHKzLh4n43WVihybLsSVBYZy0FX0oZJSeVzb9Pjc5dcS +sUDHPIbkMWVKyjfG3nZXGWlMRmn8Kq0WN3qTrPchSy3766lQy8HRQAjaA2mHpzde +VcHF7cTjjgwml5tcV0ty4/IDBdACOyYDQJCevgtbSQx48dVMVSng9v1MA6lUAjLR +V1qFrEPtWzsWX6C/NdtLnnvo/+cNPDuom0lBRvVzTv+SZSGDE1Vx60k8f4gawhIo +JaFGS0E3l3/sjvHUoZbCILZerakcHhGg +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 133 (0x85) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=American Express Company, Inc., OU=American Express Technologies, CN=American Express Global Certificate Authority + Validity + Not Before: Aug 14 19:06:00 1998 GMT + Not After : Aug 14 23:59:00 2013 GMT + Subject: C=US, O=American Express Company, Inc., OU=American Express Technologies, CN=American Express Global Certificate Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:f0:24:26:66:2e:fb:eb:4a:73:71:53:89:47:cb: + 26:3c:53:92:94:4c:ca:c2:85:b5:0d:f8:c3:57:bd: + 2f:2a:1f:6a:18:b7:57:af:0c:00:16:fa:a0:b6:90: + a6:f7:1a:a1:2e:66:26:c7:68:a3:8a:93:69:66:b5: + 46:56:2d:1d:82:ea:90:0c:0a:22:c2:89:50:8d:05: + f3:d4:ab:73:41:f0:cf:12:ac:28:b4:6f:14:94:96: + 59:4b:9e:90:75:86:df:e2:47:eb:e1:e9:4f:43:7e: + 87:ca:27:18:66:9e:b5:c1:40:65:7d:fc:61:6f:ad: + 9b:72:cf:a9:5e:d8:f3:f9:da:6e:91:10:fa:4c:b5: + ea:7e:20:de:a9:39:2f:f5:88:e4:8a:6f:35:c6:20: + 9c:2b:86:46:33:0a:fc:31:55:a5:6b:ac:16:40:e9: + cd:35:59:6f:32:04:c3:7b:b5:0f:7b:77:70:f3:48: + bb:2a:52:82:ce:af:29:6d:f1:11:6f:6d:e6:07:00: + 01:ef:9a:f3:26:0d:a6:79:13:67:af:f8:ab:1c:75: + ac:91:b5:6b:be:40:b0:de:9c:0c:b1:69:85:19:71: + 91:13:45:ca:df:d1:fd:e6:b2:ca:96:83:79:db:c5: + b8:aa:5b:7a:90:0b:78:56:3e:c6:d7:9f:94:48:11: + f5:ad + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:5 + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Certificate Policies: + Policy: 1.2.840.113807.10.1.5.1 + + X509v3 Subject Key Identifier: + 57:47:35:7B:36:27:11:A8:08:FC:2F:46:25:EB:24:69 + Signature Algorithm: sha1WithRSAEncryption + c7:61:45:a8:8a:71:b9:be:34:e9:21:7b:21:cd:56:13:98:d5: + 30:63:e9:18:aa:4b:92:15:bf:0b:1d:bb:ec:92:69:c5:2e:c3: + 61:8b:e8:30:45:cb:10:46:c1:73:38:5c:8b:19:d2:2b:f3:40: + eb:7c:72:b3:2e:1e:27:e3:75:95:8a:1c:9b:2e:c4:95:05:86: + 72:d0:55:f4:a1:92:52:79:5c:db:f4:f8:dc:e5:d7:12:b1:40: + c7:3c:86:e4:31:65:4a:ca:37:c6:de:76:57:19:69:4c:46:69: + fc:2a:ad:16:37:7a:93:ac:f7:21:4b:2d:fb:eb:a9:50:cb:c1: + d1:40:08:da:03:69:87:a7:37:5e:55:c1:c5:ed:c4:e3:8e:0c: + 26:97:9b:5c:57:4b:72:e3:f2:03:05:d0:02:3b:26:03:40:90: + 9e:be:0b:5b:49:0c:78:f1:d5:4c:55:29:e0:f6:fd:4c:03:a9: + 54:02:32:d1:57:5a:85:ac:43:ed:5b:3b:16:5f:a0:bf:35:db: + 4b:9e:7b:e8:ff:e7:0d:3c:3b:a8:9b:49:41:46:f5:73:4e:ff: + 92:65:21:83:13:55:71:eb:49:3c:7f:88:1a:c2:12:28:25:a1: + 46:4b:41:37:97:7f:ec:8e:f1:d4:a1:96:c2:20:b6:5e:ad:a9: + 1c:1e:11:a0 + +BelSign Object Publishing CA +============================ +MD5 Fingerprint: 8A:02:F8:DF:B8:E1:84:9F:5A:C2:60:24:65:D1:73:FB +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDAzCCAmygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBuzELMAkGA1UEBhMCQkUx +ETAPBgNVBAcTCEJydXNzZWxzMRMwEQYDVQQKEwpCZWxTaWduIE5WMTgwNgYDVQQL +Ey9CZWxTaWduIE9iamVjdCBQdWJsaXNoaW5nIENlcnRpZmljYXRlIEF1dGhvcml0 +eTElMCMGA1UEAxMcQmVsU2lnbiBPYmplY3QgUHVibGlzaGluZyBDQTEjMCEGCSqG +SIb3DQEJARYUd2VibWFzdGVyQGJlbHNpZ24uYmUwHhcNOTcwOTE5MjIwMzAwWhcN +MDcwOTE5MjIwMzAwWjCBuzELMAkGA1UEBhMCQkUxETAPBgNVBAcTCEJydXNzZWxz +MRMwEQYDVQQKEwpCZWxTaWduIE5WMTgwNgYDVQQLEy9CZWxTaWduIE9iamVjdCBQ +dWJsaXNoaW5nIENlcnRpZmljYXRlIEF1dGhvcml0eTElMCMGA1UEAxMcQmVsU2ln +biBPYmplY3QgUHVibGlzaGluZyBDQTEjMCEGCSqGSIb3DQEJARYUd2VibWFzdGVy +QGJlbHNpZ24uYmUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMQuH7a/7oJA +3fm3LkHVngWxWtAmfGJVA5v8y2HeS+/+6Jn+h7mIz5DaDwk8dt8Xl7bLPyVF/bS8 +WAC+sFq2FIeP7mdkrR2Ig7tnn2VhAFgIgFCfgMkx9iqQHC33SmwQ9iNDXTgJYIhX +As0WbBj8zfuSKnfQnpOjXYhk0Mj4XVRRAgMBAAGjFTATMBEGCWCGSAGG+EIBAQQE +AwIABzANBgkqhkiG9w0BAQQFAAOBgQBjdhd8lvBTpV0BHFPOKcJ+daxMDaIIc7Rq +Mf0CBhSZ3FQEpL/IloafMUMyJVf2hfYluze+oXkjyVcGJXFrRU/49AJAFoIir1Tq +Mij2De6ZuksIUQ9uhiMhTC0liIHELg7xEyw4ipUCJMM6lWPkk45IuwhHcl+u5jpa +R9Zxxp6aUg== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=BE, L=Brussels, O=BelSign NV, OU=BelSign Object Publishing Certificate Authority, CN=BelSign Object Publishing CA/Email=webmaster@belsign.be + Validity + Not Before: Sep 19 22:03:00 1997 GMT + Not After : Sep 19 22:03:00 2007 GMT + Subject: C=BE, L=Brussels, O=BelSign NV, OU=BelSign Object Publishing Certificate Authority, CN=BelSign Object Publishing CA/Email=webmaster@belsign.be + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:c4:2e:1f:b6:bf:ee:82:40:dd:f9:b7:2e:41:d5: + 9e:05:b1:5a:d0:26:7c:62:55:03:9b:fc:cb:61:de: + 4b:ef:fe:e8:99:fe:87:b9:88:cf:90:da:0f:09:3c: + 76:df:17:97:b6:cb:3f:25:45:fd:b4:bc:58:00:be: + b0:5a:b6:14:87:8f:ee:67:64:ad:1d:88:83:bb:67: + 9f:65:61:00:58:08:80:50:9f:80:c9:31:f6:2a:90: + 1c:2d:f7:4a:6c:10:f6:23:43:5d:38:09:60:88:57: + 02:cd:16:6c:18:fc:cd:fb:92:2a:77:d0:9e:93:a3: + 5d:88:64:d0:c8:f8:5d:54:51 + Exponent: 65537 (0x10001) + X509v3 extensions: + Netscape Cert Type: + SSL CA, S/MIME CA, Object Signing CA + Signature Algorithm: md5WithRSAEncryption + 63:76:17:7c:96:f0:53:a5:5d:01:1c:53:ce:29:c2:7e:75:ac: + 4c:0d:a2:08:73:b4:6a:31:fd:02:06:14:99:dc:54:04:a4:bf: + c8:96:86:9f:31:43:32:25:57:f6:85:f6:25:bb:37:be:a1:79: + 23:c9:57:06:25:71:6b:45:4f:f8:f4:02:40:16:82:22:af:54: + ea:32:28:f6:0d:ee:99:ba:4b:08:51:0f:6e:86:23:21:4c:2d: + 25:88:81:c4:2e:0e:f1:13:2c:38:8a:95:02:24:c3:3a:95:63: + e4:93:8e:48:bb:08:47:72:5f:ae:e6:3a:5a:47:d6:71:c6:9e: + 9a:52 + +BelSign Secure Server CA +======================== +MD5 Fingerprint: 3D:5E:82:C6:D9:AD:D9:8B:93:6B:0C:10:B9:49:0A:B1 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIC8zCCAlygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBszELMAkGA1UEBhMCQkUx +ETAPBgNVBAcTCEJydXNzZWxzMRMwEQYDVQQKEwpCZWxTaWduIE5WMTQwMgYDVQQL +EytCZWxTaWduIFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSEw +HwYDVQQDExhCZWxTaWduIFNlY3VyZSBTZXJ2ZXIgQ0ExIzAhBgkqhkiG9w0BCQEW +FHdlYm1hc3RlckBiZWxzaWduLmJlMB4XDTk3MDcxNjIyMDA1NFoXDTA3MDcxNjIy +MDA1NFowgbMxCzAJBgNVBAYTAkJFMREwDwYDVQQHEwhCcnVzc2VsczETMBEGA1UE +ChMKQmVsU2lnbiBOVjE0MDIGA1UECxMrQmVsU2lnbiBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRlIEF1dGhvcml0eTEhMB8GA1UEAxMYQmVsU2lnbiBTZWN1cmUgU2Vy +dmVyIENBMSMwIQYJKoZIhvcNAQkBFhR3ZWJtYXN0ZXJAYmVsc2lnbi5iZTCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1gESeJL4BEJ/yccig/x8R3AwK0kLPjZA +kCjaIXODU/LE0RZAwFP/rqbGJLMnbaWzPTl3XagG9ubpvGMRTgZlcAqdk/miQIt/ +SoQOjRax1swIZBIM4ChLyKWEkBf7EUYu1qeFGMsYrmOasFgG9ADP+MQJGjUMofnu +Sv1t3v4mpTsCAwEAAaMVMBMwEQYJYIZIAYb4QgEBBAQDAgCgMA0GCSqGSIb3DQEB +BAUAA4GBAGw9mcMF4h3K5S2qaIWLQDEgZhNo5lg6idCNdbLFYth9go/32TKBd/Y1 +W4UpzmeyubwrGXjP84f9RvGVdbIJVwMwwXrNckdxgMp9ncllPEcRIn36BwsoeKGT +6AVFSOIyMko96FMcELfHc4wHUOH5yStTQfWDjeUJOUqOA2KqQGOL +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=BE, L=Brussels, O=BelSign NV, OU=BelSign Secure Server Certificate Authority, CN=BelSign Secure Server CA/Email=webmaster@belsign.be + Validity + Not Before: Jul 16 22:00:54 1997 GMT + Not After : Jul 16 22:00:54 2007 GMT + Subject: C=BE, L=Brussels, O=BelSign NV, OU=BelSign Secure Server Certificate Authority, CN=BelSign Secure Server CA/Email=webmaster@belsign.be + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:d6:01:12:78:92:f8:04:42:7f:c9:c7:22:83:fc: + 7c:47:70:30:2b:49:0b:3e:36:40:90:28:da:21:73: + 83:53:f2:c4:d1:16:40:c0:53:ff:ae:a6:c6:24:b3: + 27:6d:a5:b3:3d:39:77:5d:a8:06:f6:e6:e9:bc:63: + 11:4e:06:65:70:0a:9d:93:f9:a2:40:8b:7f:4a:84: + 0e:8d:16:b1:d6:cc:08:64:12:0c:e0:28:4b:c8:a5: + 84:90:17:fb:11:46:2e:d6:a7:85:18:cb:18:ae:63: + 9a:b0:58:06:f4:00:cf:f8:c4:09:1a:35:0c:a1:f9: + ee:4a:fd:6d:de:fe:26:a5:3b + Exponent: 65537 (0x10001) + X509v3 extensions: + Netscape Cert Type: + SSL Client, S/MIME + Signature Algorithm: md5WithRSAEncryption + 6c:3d:99:c3:05:e2:1d:ca:e5:2d:aa:68:85:8b:40:31:20:66: + 13:68:e6:58:3a:89:d0:8d:75:b2:c5:62:d8:7d:82:8f:f7:d9: + 32:81:77:f6:35:5b:85:29:ce:67:b2:b9:bc:2b:19:78:cf:f3: + 87:fd:46:f1:95:75:b2:09:57:03:30:c1:7a:cd:72:47:71:80: + ca:7d:9d:c9:65:3c:47:11:22:7d:fa:07:0b:28:78:a1:93:e8: + 05:45:48:e2:32:32:4a:3d:e8:53:1c:10:b7:c7:73:8c:07:50: + e1:f9:c9:2b:53:41:f5:83:8d:e5:09:39:4a:8e:03:62:aa:40: + 63:8b + +Deutsche Telekom AG Root CA +=========================== +MD5 Fingerprint: 77:DE:04:94:77:D0:0C:5F:A7:B1:F4:30:18:87:FB:55 +PEM Data: +-----BEGIN CERTIFICATE----- +MIICjjCCAfegAwIBAgIBBjANBgkqhkiG9w0BAQQFADBtMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEdMBsGA1UECxMUVGVsZVNlYyBU +cnVzdCBDZW50ZXIxITAfBgNVBAMTGERldXRzY2hlIFRlbGVrb20gUm9vdCBDQTAe +Fw05ODEyMDkwOTExMDBaFw0wNDEyMDkyMzU5MDBaMG0xCzAJBgNVBAYTAkRFMRww +GgYDVQQKExNEZXV0c2NoZSBUZWxla29tIEFHMR0wGwYDVQQLExRUZWxlU2VjIFRy +dXN0IENlbnRlcjEhMB8GA1UEAxMYRGV1dHNjaGUgVGVsZWtvbSBSb290IENBMIGf +MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDdBSz5BbO5EtdpcffqVjAIVxRDe7sa +nG0vV2HX4vVEa+42QZb2ZM7hwbK5pBQEmFDocPiONZp9ScFhHVmu2gYYlX2tzuyp +vtEYD0CRdiqj5f3+iRX0V/fgVdp1rQD0LME1zLRDJlViRC4BJZyKW/DB0AA1eP41 +3pRAZHiDocw5iQIDAQABoz4wPDAPBgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQE +AwIBBjAZBgNVHQ4EEgQQLIdZH4sTgLL5hp0+En5YljANBgkqhkiG9w0BAQQFAAOB +gQAP/nO1B4hvoAuJ6spQH5TelCsLJ15P9RyVJtqMllStGZE3Q12ryYuzzW+YOT3t +3TXjcbftE5OD6IblKTMTE7w1e/0oL3BZ1dO0jSgTWTvI1XT5RcIHYKq4GFT5pWj/ +1wXVj7YFMS5BSvQQH2BHGguLGU2SVyDS71AZ6M3QcLy8Ng== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 6 (0x6) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=DE, O=Deutsche Telekom AG, OU=TeleSec Trust Center, CN=Deutsche Telekom Root CA + Validity + Not Before: Dec 9 09:11:00 1998 GMT + Not After : Dec 9 23:59:00 2004 GMT + Subject: C=DE, O=Deutsche Telekom AG, OU=TeleSec Trust Center, CN=Deutsche Telekom Root CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:dd:05:2c:f9:05:b3:b9:12:d7:69:71:f7:ea:56: + 30:08:57:14:43:7b:bb:1a:9c:6d:2f:57:61:d7:e2: + f5:44:6b:ee:36:41:96:f6:64:ce:e1:c1:b2:b9:a4: + 14:04:98:50:e8:70:f8:8e:35:9a:7d:49:c1:61:1d: + 59:ae:da:06:18:95:7d:ad:ce:ec:a9:be:d1:18:0f: + 40:91:76:2a:a3:e5:fd:fe:89:15:f4:57:f7:e0:55: + da:75:ad:00:f4:2c:c1:35:cc:b4:43:26:55:62:44: + 2e:01:25:9c:8a:5b:f0:c1:d0:00:35:78:fe:35:de: + 94:40:64:78:83:a1:cc:39:89 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:TRUE, pathlen:5 + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + 2C:87:59:1F:8B:13:80:B2:F9:86:9D:3E:12:7E:58:96 + Signature Algorithm: md5WithRSAEncryption + 0f:fe:73:b5:07:88:6f:a0:0b:89:ea:ca:50:1f:94:de:94:2b: + 0b:27:5e:4f:f5:1c:95:26:da:8c:96:54:ad:19:91:37:43:5d: + ab:c9:8b:b3:cd:6f:98:39:3d:ed:dd:35:e3:71:b7:ed:13:93: + 83:e8:86:e5:29:33:13:13:bc:35:7b:fd:28:2f:70:59:d5:d3: + b4:8d:28:13:59:3b:c8:d5:74:f9:45:c2:07:60:aa:b8:18:54: + f9:a5:68:ff:d7:05:d5:8f:b6:05:31:2e:41:4a:f4:10:1f:60: + 47:1a:0b:8b:19:4d:92:57:20:d2:ef:50:19:e8:cd:d0:70:bc: + bc:36 + +Digital Signature Trust Co. Global CA 1 +======================================= +MD5 Fingerprint: 25:7A:BA:83:2E:B6:A2:0B:DA:FE:F5:02:0F:08:D7:AD +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg +bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ +j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV +Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw +MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 +fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i ++DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN +QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ +gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 913315222 (0x36701596) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Digital Signature Trust Co., OU=DSTCA E1 + Validity + Not Before: Dec 10 18:10:23 1998 GMT + Not After : Dec 10 18:40:23 2018 GMT + Subject: C=US, O=Digital Signature Trust Co., OU=DSTCA E1 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:a0:6c:81:a9:cf:34:1e:24:dd:fe:86:28:cc:de: + 83:2f:f9:5e:d4:42:d2:e8:74:60:66:13:98:06:1c: + a9:51:12:69:6f:31:55:b9:49:72:00:08:7e:d3:a5: + 62:44:37:24:99:8f:d9:83:48:8f:99:6d:95:13:bb: + 43:3b:2e:49:4e:88:37:c1:bb:58:7f:fe:e1:bd:f8: + bb:61:cd:f3:47:c0:99:a6:f1:f3:91:e8:78:7c:00: + cb:61:c9:44:27:71:69:55:4a:7e:49:4d:ed:a2:a3: + be:02:4c:00:ca:02:a8:ee:01:02:31:64:0f:52:2d: + 13:74:76:36:b5:7a:b4:2d:71 + Exponent: 3 (0x3) + X509v3 extensions: + Netscape Cert Type: + SSL CA, S/MIME CA, Object Signing CA + X509v3 CRL Distribution Points: + DirName:/C=US/O=Digital Signature Trust Co./OU=DSTCA E1/CN=CRL1 + + X509v3 Private Key Usage Period: + Not Before: Dec 10 18:10:23 1998 GMT, Not After: Dec 10 18:10:23 2018 GMT + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:6A:79:7E:91:69:46:18:13:0A:02:77:A5:59:5B:60:98:25:0E:A2:F8 + + X509v3 Subject Key Identifier: + 6A:79:7E:91:69:46:18:13:0A:02:77:A5:59:5B:60:98:25:0E:A2:F8 + X509v3 Basic Constraints: + CA:TRUE + 1.2.840.113533.7.65.0: + 0 +..V4.0.... + Signature Algorithm: sha1WithRSAEncryption + 22:12:d8:7a:1d:dc:81:06:b6:09:65:b2:87:c8:1f:5e:b4:2f: + e9:c4:1e:f2:3c:c1:bb:04:90:11:4a:83:4e:7e:93:b9:4d:42: + c7:92:26:a0:5c:34:9a:38:72:f8:fd:6b:16:3e:20:ee:82:8b: + 31:2a:93:36:85:23:88:8a:3c:03:68:d3:c9:09:0f:4d:fc:6c: + a4:da:28:72:93:0e:89:80:b0:7d:fe:80:6f:65:6d:18:33:97: + 8b:c2:6b:89:ee:60:3d:c8:9b:ef:7f:2b:32:62:73:93:cb:3c: + e3:7b:e2:76:78:45:bc:a1:93:04:bb:86:9f:3a:5b:43:7a:c3: + 8a:65 + +Digital Signature Trust Co. Global CA 2 +======================================= +MD5 Fingerprint: 6C:C9:A7:6E:47:F1:0C:E3:53:3B:78:4C:4D:C2:6A:C5 +PEM Data: +-----BEGIN CERTIFICATE----- +MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGpMQsw +CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp +dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE +CxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0B +CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDExODE4NTVaFw0wODExMjgx +ODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO +U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0 +IENvLjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx +ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdf +WvnTLnUv2Chi0ZMv/E3Uq4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uK +xBmd9LIO/BZsubEFkoPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBE +zUNKcI5YhZXhTizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F +5X5yP4WdlGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMv +OnNn7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG +9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+Legz +ZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvVWlHG4VME +lo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX8ngvYzZAOONG +Dx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn86Oawde3uPclwx12q +gUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsTF7ANUkz+/m9c4pFuHf2k +Ytdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + d0:1e:40:8b:00:00:02:7c:00:00:00:02:00:00:00:01 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=us, ST=Utah, L=Salt Lake City, O=Digital Signature Trust Co., OU=DSTCA X1, CN=DST RootCA X1/Email=ca@digsigtrust.com + Validity + Not Before: Dec 1 18:18:55 1998 GMT + Not After : Nov 28 18:18:55 2008 GMT + Subject: C=us, ST=Utah, L=Salt Lake City, O=Digital Signature Trust Co., OU=DSTCA X1, CN=DST RootCA X1/Email=ca@digsigtrust.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:d2:c6:26:b6:e7:a5:3d:c1:c4:68:d5:50:6f:53: + c5:6f:49:13:09:b8:af:2c:48:8d:14:6a:a3:17:5f: + 5a:f9:d3:2e:75:2f:d8:28:62:d1:93:2f:fc:4d:d4: + ab:87:e5:08:c7:99:e7:92:3f:75:bd:eb:25:b4:15: + c1:9b:19:3d:d2:44:8d:d7:74:20:6d:37:02:8f:69: + 93:5b:8a:c4:19:9d:f4:b2:0e:fc:16:6c:b9:b1:05: + 92:83:d1:85:2c:60:94:3e:45:55:a0:d9:ab:08:21: + e6:60:e8:3b:74:f2:99:50:51:68:d0:03:2d:b1:80: + be:a3:d8:52:b0:44:cd:43:4a:70:8e:58:85:95:e1: + 4e:2c:d6:2d:41:6f:d6:84:e7:c8:98:44:ca:47:db: + 2c:24:a5:69:26:cf:6b:b8:27:62:c3:f4:c9:7a:92: + 23:ed:13:67:82:ae:45:2e:45:e5:7e:72:3f:85:9d: + 94:62:10:e6:3c:91:a1:ad:77:00:e0:15:ec:f3:84: + 80:72:7a:8e:6e:60:97:c7:24:59:10:34:83:5b:e1: + a5:a4:69:b6:57:35:1c:78:59:c6:d3:2f:3a:73:67: + ee:94:ca:04:13:05:62:06:70:23:b3:f4:7c:ee:45: + d9:64:0b:5b:49:aa:a4:43:ce:26:c4:44:12:6c:b8: + dd:79 + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + a2:37:b2:3f:69:fb:d7:86:79:54:49:31:95:33:2b:f3:d1:09: + 14:49:62:60:86:a5:b0:11:e2:50:c2:1d:06:57:3e:2d:e8:33: + 64:be:9b:aa:ad:5f:1b:4d:d4:99:95:a2:8b:9a:c9:62:72:b5: + 69:ea:d9:58:ab:35:ed:15:a2:43:d6:b6:bc:07:79:65:64:73: + 7d:d7:79:ca:7b:d5:5a:51:c6:e1:53:04:96:8d:38:cf:a3:17: + ac:39:71:6b:01:c3:8b:53:3c:63:e9:ee:79:c0:e4:be:92:32: + 64:7a:b3:1f:97:94:62:bd:ea:b2:20:15:95:fb:97:f2:78:2f: + 63:36:40:38:e3:46:0f:1d:dd:ac:95:ca:e7:4b:90:7b:b1:4b: + a9:d4:c5:eb:9a:da:aa:d5:a3:94:14:46:8d:2d:1f:f3:3a:d6: + 93:3a:f6:3e:79:fc:e8:e6:b0:75:ed:ee:3d:c9:70:c7:5d:aa: + 81:4b:46:25:1c:c7:6c:15:e3:95:4e:0f:aa:32:37:94:0a:17: + 24:92:13:84:58:d2:63:6f:2b:f7:e6:5b:62:0b:13:17:b0:0d: + 52:4c:fe:fe:6f:5c:e2:91:6e:1d:fd:a4:62:d7:68:fa:8e:7a: + 4f:d2:08:da:93:dc:f0:92:11:7a:d0:dc:72:93:0c:73:93:62: + 85:68:d0:f4 + +Digital Signature Trust Co. Global CA 3 +======================================= +MD5 Fingerprint: 93:C2:8E:11:7B:D4:F3:03:19:BD:28:75:13:4A:45:4A +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ +k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso +LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o +TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 +MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C +TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 +WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR +xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL +B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 913232846 (0x366ed3ce) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Digital Signature Trust Co., OU=DSTCA E2 + Validity + Not Before: Dec 9 19:17:26 1998 GMT + Not After : Dec 9 19:47:26 2018 GMT + Subject: C=US, O=Digital Signature Trust Co., OU=DSTCA E2 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:bf:93:8f:17:92:ef:33:13:18:eb:10:7f:4e:16: + bf:ff:06:8f:2a:85:bc:5e:f9:24:a6:24:88:b6:03: + b7:c1:c3:5f:03:5b:d1:6f:ae:7e:42:ea:66:23:b8: + 63:83:56:fb:28:2d:e1:38:8b:b4:ee:a8:01:e1:ce: + 1c:b6:88:2a:22:46:85:fb:9f:a7:70:a9:47:14:3f: + ce:de:65:f0:a8:71:f7:4f:26:6c:8c:bc:c6:b5:ef: + de:49:27:ff:48:2a:7d:e8:4d:03:cc:c7:b2:52:c6: + 17:31:13:3b:b5:4d:db:c8:c4:f6:c3:0f:24:2a:da: + 0c:9d:e7:91:5b:80:cd:94:9d + Exponent: 3 (0x3) + X509v3 extensions: + Netscape Cert Type: + SSL CA, S/MIME CA, Object Signing CA + X509v3 CRL Distribution Points: + DirName:/C=US/O=Digital Signature Trust Co./OU=DSTCA E2/CN=CRL1 + + X509v3 Private Key Usage Period: + Not Before: Dec 9 19:17:26 1998 GMT, Not After: Dec 9 19:17:26 2018 GMT + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:1E:82:4D:28:65:80:3C:C9:41:6E:AC:35:2E:5A:CB:DE:EE:F8:39:5B + + X509v3 Subject Key Identifier: + 1E:82:4D:28:65:80:3C:C9:41:6E:AC:35:2E:5A:CB:DE:EE:F8:39:5B + X509v3 Basic Constraints: + CA:TRUE + 1.2.840.113533.7.65.0: + 0 +..V4.0.... + Signature Algorithm: sha1WithRSAEncryption + 47:8d:83:ad:62:f2:db:b0:9e:45:22:05:b9:a2:d6:03:0e:38: + 72:e7:9e:fc:7b:e6:93:b6:9a:a5:a2:94:c8:34:1d:91:d1:c5: + d7:f4:0a:25:0f:3d:78:81:9e:0f:b1:67:c4:90:4c:63:dd:5e: + a7:e2:ba:9f:f5:f7:4d:a5:31:7b:9c:29:2d:4c:fe:64:3e:ec: + b6:53:fe:ea:9b:ed:82:db:74:75:4b:07:79:6e:1e:d8:19:83: + 73:de:f5:3e:d0:b5:de:e7:4b:68:7d:43:2e:2a:20:e1:7e:a0: + 78:44:9e:08:f5:98:f9:c7:7f:1b:1b:d6:06:20:02:58:a1:c3: + a2:03 + +Digital Signature Trust Co. Global CA 4 +======================================= +MD5 Fingerprint: CD:3B:3D:62:5B:09:B8:09:36:87:9E:12:2F:71:64:BA +PEM Data: +-----BEGIN CERTIFICATE----- +MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGpMQsw +CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp +dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE +CxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0B +CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAyMjQ2MTZaFw0wODExMjcy +MjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO +U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0 +IENvLjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx +ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbV +p9oaBBg5kkp4o4HC9Xd6ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWw +BZoPFflrWXJW8vo5/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl +5WJp3OXuAFK9MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi +3sOP17ihYqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+ +QVCvbK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG +9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWogWxyQ +2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6HE3K1GjN +I3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV6YyDfFk/xPEL +553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8PzGn0EdzMzkbzE5q +10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30sPDst2yC7S8xmUJMqbIN +uBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + d0:1e:40:8b:00:00:77:6d:00:00:00:01:00:00:00:04 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=us, ST=Utah, L=Salt Lake City, O=Digital Signature Trust Co., OU=DSTCA X2, CN=DST RootCA X2/Email=ca@digsigtrust.com + Validity + Not Before: Nov 30 22:46:16 1998 GMT + Not After : Nov 27 22:46:16 2008 GMT + Subject: C=us, ST=Utah, L=Salt Lake City, O=Digital Signature Trust Co., OU=DSTCA X2, CN=DST RootCA X2/Email=ca@digsigtrust.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:dc:75:f0:8c:c0:75:96:9a:c0:62:1f:26:f7:c4: + e1:9a:ea:e0:56:73:5b:99:cd:01:44:a8:08:b6:d5: + a7:da:1a:04:18:39:92:4a:78:a3:81:c2:f5:77:7a: + 50:b4:70:ff:9a:ab:c6:c7:ca:6e:83:4f:42:98:fb: + 26:0b:da:dc:6d:d6:a9:99:55:52:67:e9:28:03:92: + dc:e5:b0:05:9a:0f:15:f9:6b:59:72:56:f2:fa:39: + fc:aa:68:ee:0f:1f:10:83:2f:fc:9d:fa:17:96:dd: + 82:e3:e6:45:7d:c0:4b:80:44:1f:ed:2c:e0:84:fd: + 91:5c:92:54:69:25:e5:62:69:dc:e5:ee:00:52:bd: + 33:0b:ad:75:02:85:a7:64:50:2d:c5:19:19:30:c0: + 26:db:c9:d3:fd:2e:99:ad:59:b5:0b:4d:d4:41:ae: + 85:48:43:59:dc:b7:a8:e2:a2:de:c3:8f:d7:b8:a1: + 62:a6:68:50:52:e4:cf:31:a7:94:85:da:9f:46:32: + 17:56:e5:f2:eb:66:3d:12:ff:43:db:98:ef:77:cf: + cb:81:8d:34:b1:c6:50:4a:26:d1:e4:3e:41:50:af: + 6c:ae:22:34:2e:d5:6b:6e:83:ba:79:b8:76:65:48: + da:09:29:64:63:22:b9:fb:47:76:85:8c:86:44:cb: + 09:db + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + b5:36:0e:5d:e1:61:28:5a:11:65:c0:3f:83:03:79:4d:be:28: + a6:0b:07:02:52:85:cd:f8:91:d0:10:6c:b5:6a:20:5b:1c:90: + d9:30:3c:c6:48:9e:8a:5e:64:f9:a1:71:77:ef:04:27:1f:07: + eb:e4:26:f7:73:74:c9:44:18:1a:66:d3:e0:43:af:91:3b:d1: + cb:2c:d8:74:54:3a:1c:4d:ca:d4:68:cd:23:7c:1d:10:9e:45: + e9:f6:00:6e:a6:cd:19:ff:4f:2c:29:8f:57:4d:c4:77:92:be: + e0:4c:09:fb:5d:44:86:66:21:a8:b9:32:a2:56:d5:e9:8c:83: + 7c:59:3f:c4:f1:0b:e7:9d:ec:9e:bd:9c:18:0e:3e:c2:39:79: + 28:b7:03:0d:08:cb:c6:e7:d9:01:37:50:10:ec:cc:61:16:40: + d4:af:31:74:7b:fc:3f:31:a7:d0:47:73:33:39:1b:cc:4e:6a: + d7:49:83:11:06:fe:eb:82:58:33:32:4c:f0:56:ac:1e:9c:2f: + 56:9a:7b:c1:4a:1c:a5:fd:55:36:ce:fc:96:4d:f4:b0:f0:ec: + b7:6c:82:ed:2f:31:99:42:4c:a9:b2:0d:b8:15:5d:f1:df:ba: + c9:b5:4a:d4:64:98:b3:26:a9:30:c8:fd:a6:ec:ab:96:21:ad: + 7f:c2:78:b6 + +Entrust Worldwide by DST +======================== +MD5 Fingerprint: B4:65:22:0A:7C:AD:DF:41:B7:D5:44:D5:AD:FA:9A:75 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDRzCCArCgAwIBAgIENm3FGDANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRswGQYDVQQL +ExJEU1QtRW50cnVzdCBHVEkgQ0EwHhcNOTgxMjA5MDAwMjI0WhcNMTgxMjA5MDAz +MjI0WjBQMQswCQYDVQQGEwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUg +VHJ1c3QgQ28uMRswGQYDVQQLExJEU1QtRW50cnVzdCBHVEkgQ0EwgZ0wDQYJKoZI +hvcNAQEBBQADgYsAMIGHAoGBALYd90uNDxPjEvUJ/gYyDq9MQfV91Ec9KgrfgwXe +3n3mAxb2UTrLRxpKrX7E/R20vnSKeN0Lg460hBPE+/htKa6h4Q8PQ+O1XmBp+oOU +/Hnm3Hbt0UQrjv0Su/4XdxcMie2n71F9xO04wzujevviTaBgtfL9E2XTxuw/vjWc +PSLvAgEDo4IBLjCCASowEQYJYIZIAYb4QgEBBAQDAgAHMHIGA1UdHwRrMGkwZ6Bl +oGOkYTBfMQswCQYDVQQGEwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUg +VHJ1c3QgQ28uMRswGQYDVQQLExJEU1QtRW50cnVzdCBHVEkgQ0ExDTALBgNVBAMT +BENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkwMDAyMjRagQ8yMDE4MTIwOTAwMDIy +NFowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFJOaRMrQeFOAKUkE38evMz+ZdV+u +MB0GA1UdDgQWBBSTmkTK0HhTgClJBN/HrzM/mXVfrjAMBgNVHRMEBTADAQH/MBkG +CSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GBAGSJzAOn +3AryWCDn/RegKHLNh7DNmLUkR2MzMRAQsu+KV3KuTAPgZ5+sYEOEIsGpo+Wxp94J +1M8NeEYjW49Je/4TIpeU6nJI4SwgeJbpZkUZywllY2E/0UmYsXYQVdVjSmZLpAdr +3nt/ueaTWxoCW4AO3Y0Y1Iqjwmjxo+AY0U5M +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 913163544 (0x366dc518) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Digital Signature Trust Co., OU=DST-Entrust GTI CA + Validity + Not Before: Dec 9 00:02:24 1998 GMT + Not After : Dec 9 00:32:24 2018 GMT + Subject: C=US, O=Digital Signature Trust Co., OU=DST-Entrust GTI CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:b6:1d:f7:4b:8d:0f:13:e3:12:f5:09:fe:06:32: + 0e:af:4c:41:f5:7d:d4:47:3d:2a:0a:df:83:05:de: + de:7d:e6:03:16:f6:51:3a:cb:47:1a:4a:ad:7e:c4: + fd:1d:b4:be:74:8a:78:dd:0b:83:8e:b4:84:13:c4: + fb:f8:6d:29:ae:a1:e1:0f:0f:43:e3:b5:5e:60:69: + fa:83:94:fc:79:e6:dc:76:ed:d1:44:2b:8e:fd:12: + bb:fe:17:77:17:0c:89:ed:a7:ef:51:7d:c4:ed:38: + c3:3b:a3:7a:fb:e2:4d:a0:60:b5:f2:fd:13:65:d3: + c6:ec:3f:be:35:9c:3d:22:ef + Exponent: 3 (0x3) + X509v3 extensions: + Netscape Cert Type: + SSL CA, S/MIME CA, Object Signing CA + X509v3 CRL Distribution Points: + DirName:/C=US/O=Digital Signature Trust Co./OU=DST-Entrust GTI CA/CN=CRL1 + + X509v3 Private Key Usage Period: + Not Before: Dec 9 00:02:24 1998 GMT, Not After: Dec 9 00:02:24 2018 GMT + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:93:9A:44:CA:D0:78:53:80:29:49:04:DF:C7:AF:33:3F:99:75:5F:AE + + X509v3 Subject Key Identifier: + 93:9A:44:CA:D0:78:53:80:29:49:04:DF:C7:AF:33:3F:99:75:5F:AE + X509v3 Basic Constraints: + CA:TRUE + 1.2.840.113533.7.65.0: + 0 +..V4.0.... + Signature Algorithm: sha1WithRSAEncryption + 64:89:cc:03:a7:dc:0a:f2:58:20:e7:fd:17:a0:28:72:cd:87: + b0:cd:98:b5:24:47:63:33:31:10:10:b2:ef:8a:57:72:ae:4c: + 03:e0:67:9f:ac:60:43:84:22:c1:a9:a3:e5:b1:a7:de:09:d4: + cf:0d:78:46:23:5b:8f:49:7b:fe:13:22:97:94:ea:72:48:e1: + 2c:20:78:96:e9:66:45:19:cb:09:65:63:61:3f:d1:49:98:b1: + 76:10:55:d5:63:4a:66:4b:a4:07:6b:de:7b:7f:b9:e6:93:5b: + 1a:02:5b:80:0e:dd:8d:18:d4:8a:a3:c2:68:f1:a3:e0:18:d1: + 4e:4c + +Entrust.net Premium 2048 Secure Server CA +========================================= +MD5 Fingerprint: BA:21:EA:20:D6:DD:DB:8F:C1:57:8B:40:AD:A1:FC:FC +PEM Data: +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy +MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA +vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G +CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA +WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ +h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 +f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN +B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy +vUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 946059622 (0x3863b966) + Signature Algorithm: sha1WithRSAEncryption + Issuer: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048) + Validity + Not Before: Dec 24 17:50:51 1999 GMT + Not After : Dec 24 18:20:51 2019 GMT + Subject: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048) + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:ad:4d:4b:a9:12:86:b2:ea:a3:20:07:15:16:64: + 2a:2b:4b:d1:bf:0b:4a:4d:8e:ed:80:76:a5:67:b7: + 78:40:c0:73:42:c8:68:c0:db:53:2b:dd:5e:b8:76: + 98:35:93:8b:1a:9d:7c:13:3a:0e:1f:5b:b7:1e:cf: + e5:24:14:1e:b1:81:a9:8d:7d:b8:cc:6b:4b:03:f1: + 02:0c:dc:ab:a5:40:24:00:7f:74:94:a1:9d:08:29: + b3:88:0b:f5:87:77:9d:55:cd:e4:c3:7e:d7:6a:64: + ab:85:14:86:95:5b:97:32:50:6f:3d:c8:ba:66:0c: + e3:fc:bd:b8:49:c1:76:89:49:19:fd:c0:a8:bd:89: + a3:67:2f:c6:9f:bc:71:19:60:b8:2d:e9:2c:c9:90: + 76:66:7b:94:e2:af:78:d6:65:53:5d:3c:d6:9c:b2: + cf:29:03:f9:2f:a4:50:b2:d4:48:ce:05:32:55:8a: + fd:b2:64:4c:0e:e4:98:07:75:db:7f:df:b9:08:55: + 60:85:30:29:f9:7b:48:a4:69:86:e3:35:3f:1e:86: + 5d:7a:7a:15:bd:ef:00:8e:15:22:54:17:00:90:26: + 93:bc:0e:49:68:91:bf:f8:47:d3:9d:95:42:c1:0e: + 4d:df:6f:26:cf:c3:18:21:62:66:43:70:d6:d5:c0: + 07:e1 + Exponent: 65537 (0x10001) + X509v3 extensions: + Netscape Cert Type: + SSL CA, S/MIME CA, Object Signing CA + X509v3 Authority Key Identifier: + keyid:55:E4:81:D1:11:80:BE:D8:89:B9:08:A3:31:F9:A1:24:09:16:B9:70 + + X509v3 Subject Key Identifier: + 55:E4:81:D1:11:80:BE:D8:89:B9:08:A3:31:F9:A1:24:09:16:B9:70 + 1.2.840.113533.7.65.0: + 0...V5.0:4.0.... + Signature Algorithm: sha1WithRSAEncryption + 59:47:ac:21:84:8a:17:c9:9c:89:53:1e:ba:80:85:1a:c6:3c: + 4e:3e:b1:9c:b6:7c:c6:92:5d:18:64:02:e3:d3:06:08:11:61: + 7c:63:e3:2b:9d:31:03:70:76:d2:a3:28:a0:f4:bb:9a:63:73: + ed:6d:e5:2a:db:ed:14:a9:2b:c6:36:11:d0:2b:eb:07:8b:a5: + da:9e:5c:19:9d:56:12:f5:54:29:c8:05:ed:b2:12:2a:8d:f4: + 03:1b:ff:e7:92:10:87:b0:3a:b5:c3:9d:05:37:12:a3:c7:f4: + 15:b9:d5:a4:39:16:9b:53:3a:23:91:f1:a8:82:a2:6a:88:68: + c1:79:02:22:bc:aa:a6:d6:ae:df:b0:14:5f:b8:87:d0:dd:7c: + 7f:7b:ff:af:1c:cf:e6:db:07:ad:5e:db:85:9d:d0:2b:0d:33: + db:04:d1:e6:49:40:13:2b:76:fb:3e:e9:9c:89:0f:15:ce:18: + b0:85:78:21:4f:6b:4f:0e:fa:36:67:cd:07:f2:ff:08:d0:e2: + de:d9:bf:2a:af:b8:87:86:21:3c:04:ca:b7:94:68:7f:cf:3c: + e9:98:d7:38:ff:ec:c0:d9:50:f0:2e:4b:58:ae:46:6f:d0:2e: + c3:60:da:72:55:72:bd:4c:45:9e:61:ba:bf:84:81:92:03:d1: + d2:69:7c:c5 + +Entrust.net Secure Personal CA +============================== +MD5 Fingerprint: 0C:41:2F:13:5B:A0:54:F5:96:66:2D:7E:CD:0E:03:F4 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u +ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh +Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU +MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D +bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq +RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G +CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo +6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux +5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm +AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC +ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 +cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m +by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp +IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg +Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg +KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV +HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E +BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE +FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7 +pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz +wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a +EkP/TOYGJqibGapEPHayXOw= +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 939758062 (0x380391ee) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=US, O=Entrust.net, OU=www.entrust.net/Client_CA_Info/CPS incorp. by ref. limits liab., OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Client Certification Authority + Validity + Not Before: Oct 12 19:24:30 1999 GMT + Not After : Oct 12 19:54:30 2019 GMT + Subject: C=US, O=Entrust.net, OU=www.entrust.net/Client_CA_Info/CPS incorp. by ref. limits liab., OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Client Certification Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:c8:3a:99:5e:31:17:df:ac:27:6f:90:7b:e4:19: + ff:45:a3:34:c2:db:c1:a8:4f:f0:68:ea:84:fd:9f: + 75:79:cf:c1:8a:51:94:af:c7:57:03:47:64:9e:ad: + 82:1b:5a:da:7f:37:78:47:bb:37:98:12:96:ce:c6: + 13:7d:ef:d2:0c:30:51:a9:39:9e:55:f8:fb:b1:e7: + 30:de:83:b2:ba:3e:f1:d5:89:3b:3b:85:ba:aa:74: + 2c:fe:3f:31:6e:af:91:95:6e:06:d4:07:4d:4b:2c: + 56:47:18:04:52:da:0e:10:93:bf:63:90:9b:e1:df: + 8c:e6:02:a4:e6:4f:5e:f7:8b + Exponent: 3 (0x3) + X509v3 extensions: + Netscape Cert Type: + SSL CA, S/MIME CA, Object Signing CA + X509v3 CRL Distribution Points: + DirName:/C=US/O=Entrust.net/OU=www.entrust.net/Client_CA_Info/CPS incorp. by ref. limits liab./OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Client Certification Authority/CN=CRL1 + URI:http://www.entrust.net/CRL/Client1.crl + + X509v3 Private Key Usage Period: + Not Before: Oct 12 19:24:30 1999 GMT, Not After: Oct 12 19:24:30 2019 GMT + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:C4:FB:9C:29:7B:97:CD:4C:96:FC:EE:5B:B3:CA:99:74:8B:95:EA:4C + + X509v3 Subject Key Identifier: + C4:FB:9C:29:7B:97:CD:4C:96:FC:EE:5B:B3:CA:99:74:8B:95:EA:4C + X509v3 Basic Constraints: + CA:TRUE + 1.2.840.113533.7.65.0: + 0 +..V4.0.... + Signature Algorithm: md5WithRSAEncryption + 3f:ae:8a:f1:d7:66:03:05:9e:3e:fa:ea:1c:46:bb:a4:5b:8f: + 78:9a:12:48:99:f9:f4:35:de:0c:36:07:02:6b:10:3a:89:14: + 81:9c:31:a6:7c:b2:41:b2:6a:e7:07:01:a1:4b:f9:9f:25:3b: + 96:ca:99:c3:3e:a1:51:1c:f3:c3:2e:44:f7:b0:67:46:aa:92: + e5:3b:da:1c:19:14:38:30:d5:e2:a2:31:25:2e:f1:ec:45:38: + ed:f8:06:58:03:73:62:b0:10:31:8f:40:bf:64:e0:5c:3e:c5: + 4f:1f:da:12:43:ff:4c:e6:06:26:a8:9b:19:aa:44:3c:76:b2: + 5c:ec + +Entrust.net Secure Server CA +============================ +MD5 Fingerprint: DF:F2:80:73:CC:F1:E6:61:73:FC:F5:42:E9:C5:7C:EE +PEM Data: +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 927650371 (0x374ad243) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority + Validity + Not Before: May 25 16:09:40 1999 GMT + Not After : May 25 16:39:40 2019 GMT + Subject: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:cd:28:83:34:54:1b:89:f3:0f:af:37:91:31:ff: + af:31:60:c9:a8:e8:b2:10:68:ed:9f:e7:93:36:f1: + 0a:64:bb:47:f5:04:17:3f:23:47:4d:c5:27:19:81: + 26:0c:54:72:0d:88:2d:d9:1f:9a:12:9f:bc:b3:71: + d3:80:19:3f:47:66:7b:8c:35:28:d2:b9:0a:df:24: + da:9c:d6:50:79:81:7a:5a:d3:37:f7:c2:4a:d8:29: + 92:26:64:d1:e4:98:6c:3a:00:8a:f5:34:9b:65:f8: + ed:e3:10:ff:fd:b8:49:58:dc:a0:de:82:39:6b:81: + b1:16:19:61:b9:54:b6:e6:43 + Exponent: 3 (0x3) + X509v3 extensions: + Netscape Cert Type: + SSL CA, S/MIME CA, Object Signing CA + X509v3 CRL Distribution Points: + DirName:/C=US/O=Entrust.net/OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Secure Server Certification Authority/CN=CRL1 + URI:http://www.entrust.net/CRL/net1.crl + + X509v3 Private Key Usage Period: + Not Before: May 25 16:09:40 1999 GMT, Not After: May 25 16:09:40 2019 GMT + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A + + X509v3 Subject Key Identifier: + F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A + X509v3 Basic Constraints: + CA:TRUE + 1.2.840.113533.7.65.0: + 0 +..V4.0.... + Signature Algorithm: sha1WithRSAEncryption + 90:dc:30:02:fa:64:74:c2:a7:0a:a5:7c:21:8d:34:17:a8:fb: + 47:0e:ff:25:7c:8d:13:0a:fb:e4:98:b5:ef:8c:f8:c5:10:0d: + f7:92:be:f1:c3:d5:d5:95:6a:04:bb:2c:ce:26:36:65:c8:31: + c6:e7:ee:3f:e3:57:75:84:7a:11:ef:46:4f:18:f4:d3:98:bb: + a8:87:32:ba:72:f6:3c:e2:3d:9f:d7:1d:d9:c3:60:43:8c:58: + 0e:22:96:2f:62:a3:2c:1f:ba:ad:05:ef:ab:32:78:87:a0:54: + 73:19:b5:5c:05:f9:52:3e:6d:2d:45:0b:f7:0a:93:ea:ed:06: + f9:b2 + +Equifax Premium CA +================== +MD5 Fingerprint: A9:E9:A8:9D:0E:73:E3:B1:2F:37:0D:E8:48:3F:86:ED +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDIzCCAoygAwIBAgIENeHvHjANBgkqhkiG9w0BAQUFADBPMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEuMCwGA1UECxMlRXF1aWZheCBQcmVtaXVtIENl +cnRpZmljYXRlIEF1dGhvcml0eTAeFw05ODA4MjQyMjU0MjNaFw0xODA4MjQyMjU0 +MjNaME8xCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFcXVpZmF4MS4wLAYDVQQLEyVF +cXVpZmF4IFByZW1pdW0gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDOoQaOBswIC8GGqN4g1Q0O0Q3En+pq2bPCMkdAb4qI +pAm9OCwd5svmpPM269rrvPxkswf2Lbyqzp8ZSGhK/PWiRX4JEPWPs0lcIwY56hOL +uAvNkR12X9k3oUT7X5DyZ7PNGJlDH3YSawLylYM4Q8L2YjTKyXhdX9LYupr/vhBg +WwIDAQABo4IBCjCCAQYwcQYDVR0fBGowaDBmoGSgYqRgMF4xCzAJBgNVBAYTAlVT +MRAwDgYDVQQKEwdFcXVpZmF4MS4wLAYDVQQLEyVFcXVpZmF4IFByZW1pdW0gQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIw +MTgwODI0MjI1NDIzWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUFe6yKFmrbuX4 +z4uB9CThrj91G5gwHQYDVR0OBBYEFBXusihZq27l+M+LgfQk4a4/dRuYMAwGA1Ud +EwQFMAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEB +BQUAA4GBAL0LnCepA9so3JipS9DRjqeoGlqR4Jzx9xh8LiKeNh/JqLXNRkpu+jUH +G4YI65/iqPmdQS06rlxctl80BOv8KmCw+3TkhellOJbuFcfGd2MSvYpoH6tsfdrK +XBPO6snrCVzFc+cSAdXZUwee4A+W8Iu0u0VIn4bFGVWgy5bFA/xI +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 903999262 (0x35e1ef1e) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Equifax, OU=Equifax Premium Certificate Authority + Validity + Not Before: Aug 24 22:54:23 1998 GMT + Not After : Aug 24 22:54:23 2018 GMT + Subject: C=US, O=Equifax, OU=Equifax Premium Certificate Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:ce:a1:06:8e:06:cc:08:0b:c1:86:a8:de:20:d5: + 0d:0e:d1:0d:c4:9f:ea:6a:d9:b3:c2:32:47:40:6f: + 8a:88:a4:09:bd:38:2c:1d:e6:cb:e6:a4:f3:36:eb: + da:eb:bc:fc:64:b3:07:f6:2d:bc:aa:ce:9f:19:48: + 68:4a:fc:f5:a2:45:7e:09:10:f5:8f:b3:49:5c:23: + 06:39:ea:13:8b:b8:0b:cd:91:1d:76:5f:d9:37:a1: + 44:fb:5f:90:f2:67:b3:cd:18:99:43:1f:76:12:6b: + 02:f2:95:83:38:43:c2:f6:62:34:ca:c9:78:5d:5f: + d2:d8:ba:9a:ff:be:10:60:5b + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 CRL Distribution Points: + DirName:/C=US/O=Equifax/OU=Equifax Premium Certificate Authority/CN=CRL1 + + X509v3 Private Key Usage Period: + Not After: Aug 24 22:54:23 2018 GMT + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:15:EE:B2:28:59:AB:6E:E5:F8:CF:8B:81:F4:24:E1:AE:3F:75:1B:98 + + X509v3 Subject Key Identifier: + 15:EE:B2:28:59:AB:6E:E5:F8:CF:8B:81:F4:24:E1:AE:3F:75:1B:98 + X509v3 Basic Constraints: + CA:TRUE + 1.2.840.113533.7.65.0: + 0...V3.0c.... + Signature Algorithm: sha1WithRSAEncryption + bd:0b:9c:27:a9:03:db:28:dc:98:a9:4b:d0:d1:8e:a7:a8:1a: + 5a:91:e0:9c:f1:f7:18:7c:2e:22:9e:36:1f:c9:a8:b5:cd:46: + 4a:6e:fa:35:07:1b:86:08:eb:9f:e2:a8:f9:9d:41:2d:3a:ae: + 5c:5c:b6:5f:34:04:eb:fc:2a:60:b0:fb:74:e4:85:e9:65:38: + 96:ee:15:c7:c6:77:63:12:bd:8a:68:1f:ab:6c:7d:da:ca:5c: + 13:ce:ea:c9:eb:09:5c:c5:73:e7:12:01:d5:d9:53:07:9e:e0: + 0f:96:f0:8b:b4:bb:45:48:9f:86:c5:19:55:a0:cb:96:c5:03: + fc:48 + +Equifax Secure CA +================= +MD5 Fingerprint: 67:CB:9D:C0:13:24:8A:82:9B:B2:17:1E:D1:1B:EC:D4 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 903804111 (0x35def4cf) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority + Validity + Not Before: Aug 22 16:41:51 1998 GMT + Not After : Aug 22 16:41:51 2018 GMT + Subject: C=US, O=Equifax, OU=Equifax Secure Certificate Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:c1:5d:b1:58:67:08:62:ee:a0:9a:2d:1f:08:6d: + 91:14:68:98:0a:1e:fe:da:04:6f:13:84:62:21:c3: + d1:7c:ce:9f:05:e0:b8:01:f0:4e:34:ec:e2:8a:95: + 04:64:ac:f1:6b:53:5f:05:b3:cb:67:80:bf:42:02: + 8e:fe:dd:01:09:ec:e1:00:14:4f:fc:fb:f0:0c:dd: + 43:ba:5b:2b:e1:1f:80:70:99:15:57:93:16:f1:0f: + 97:6a:b7:c2:68:23:1c:cc:4d:59:30:ac:51:1e:3b: + af:2b:d6:ee:63:45:7b:c5:d9:5f:50:d2:e3:50:0f: + 3a:88:e7:bf:14:fd:e0:c7:b9 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 CRL Distribution Points: + DirName:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority/CN=CRL1 + + X509v3 Private Key Usage Period: + Not After: Aug 22 16:41:51 2018 GMT + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:48:E6:68:F9:2B:D2:B2:95:D7:47:D8:23:20:10:4F:33:98:90:9F:D4 + + X509v3 Subject Key Identifier: + 48:E6:68:F9:2B:D2:B2:95:D7:47:D8:23:20:10:4F:33:98:90:9F:D4 + X509v3 Basic Constraints: + CA:TRUE + 1.2.840.113533.7.65.0: + 0...V3.0c.... + Signature Algorithm: sha1WithRSAEncryption + 58:ce:29:ea:fc:f7:de:b5:ce:02:b9:17:b5:85:d1:b9:e3:e0: + 95:cc:25:31:0d:00:a6:92:6e:7f:b6:92:63:9e:50:95:d1:9a: + 6f:e4:11:de:63:85:6e:98:ee:a8:ff:5a:c8:d3:55:b2:66:71: + 57:de:c0:21:eb:3d:2a:a7:23:49:01:04:86:42:7b:fc:ee:7f: + a2:16:52:b5:67:67:d3:40:db:3b:26:58:b2:28:77:3d:ae:14: + 77:61:d6:fa:2a:66:27:a0:0d:fa:a7:73:5c:ea:70:f1:94:21: + 65:44:5f:fa:fc:ef:29:68:a9:a2:87:79:ef:79:ef:4f:ac:07: + 77:38 + +GTE CyberTrust Global Root +========================== +MD5 Fingerprint: CA:3D:D3:68:F1:03:5C:D0:32:FA:B8:2B:59:E8:5A:DB +PEM Data: +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: 421 (0x1a5) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=GTE CyberTrust Global Root + Validity + Not Before: Aug 13 00:29:00 1998 GMT + Not After : Aug 13 23:59:00 2018 GMT + Subject: C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=GTE CyberTrust Global Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:95:0f:a0:b6:f0:50:9c:e8:7a:c7:88:cd:dd:17: + 0e:2e:b0:94:d0:1b:3d:0e:f6:94:c0:8a:94:c7:06: + c8:90:97:c8:b8:64:1a:7a:7e:6c:3c:53:e1:37:28: + 73:60:7f:b2:97:53:07:9f:53:f9:6d:58:94:d2:af: + 8d:6d:88:67:80:e6:ed:b2:95:cf:72:31:ca:a5:1c: + 72:ba:5c:02:e7:64:42:e7:f9:a9:2c:d6:3a:0d:ac: + 8d:42:aa:24:01:39:e6:9c:3f:01:85:57:0d:58:87: + 45:f8:d3:85:aa:93:69:26:85:70:48:80:3f:12:15: + c7:79:b4:1f:05:2f:3b:62:99 + Exponent: 65537 (0x10001) + Signature Algorithm: md5WithRSAEncryption + 6d:eb:1b:09:e9:5e:d9:51:db:67:22:61:a4:2a:3c:48:77:e3: + a0:7c:a6:de:73:a2:14:03:85:3d:fb:ab:0e:30:c5:83:16:33: + 81:13:08:9e:7b:34:4e:df:40:c8:74:d7:b9:7d:dc:f4:76:55: + 7d:9b:63:54:18:e9:f0:ea:f3:5c:b1:d9:8b:42:1e:b9:c0:95: + 4e:ba:fa:d5:e2:7c:f5:68:61:bf:8e:ec:05:97:5f:5b:b0:d7: + a3:85:34:c4:24:a7:0d:0f:95:93:ef:cb:94:d8:9e:1f:9d:5c: + 85:6d:c7:aa:ae:4f:1f:22:b5:cd:95:ad:ba:a7:cc:f9:ab:0b: + 7a:7f + + +GTE CyberTrust Root 2 +===================== +MD5 Fingerprint: BA:ED:17:57:9A:4B:FF:7C:F9:C9:1F:A2:CD:1A:D6:87 +PEM Data: +-----BEGIN CERTIFICATE----- +MIICUDCCAbkCAgGbMA0GCSqGSIb3DQEBBAUAMHAxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEeMBwGA1UEAxMVR1RFIEN5YmVyVHJ1c3QgUm9vdCAyMB4X +DTk4MDgxMTExMzUwN1oXDTA4MDgxMTExMjIxNlowcDELMAkGA1UEBhMCVVMxGDAW +BgNVBAoTD0dURSBDb3Jwb3JhdGlvbjEnMCUGA1UECxMeR1RFIEN5YmVyVHJ1c3Qg +U29sdXRpb25zLCBJbmMuMR4wHAYDVQQDExVHVEUgQ3liZXJUcnVzdCBSb290IDIw +gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANksTE4vaRoj41a6886EwAnAefFE +XzMfFZF/iogouCRFzI8YzR900bWPcUzWMfZzloSUQMWpg2Akfa9vNLdLTMIJgDtF +BJ7EPMQndXsADKFkR7UUXYJLUTpYu0RMPdPlBjjoYVyYeLuAs5zacoJioN+cX+v5 +T3fCzGAYAGs0giWzAgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAo2SRbxDt526iQkCU +eM74FAjR+kOF60bNkhTQ7y4tNjkY2brJJ4gp6UgXb/jBqshhbS39QC11QzCXOfgU +ZL1v72OoK0LfsloNJex7N9jOkSmCFvnoYqLhdsQCfd0li5jh9g1gjPZZkEBRRNHC ++xkkHhc5a3QhFTPWVdeCHnAsJ6g= +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: 411 (0x19b) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=GTE CyberTrust Root 2 + Validity + Not Before: Aug 11 11:35:07 1998 GMT + Not After : Aug 11 11:22:16 2008 GMT + Subject: C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=GTE CyberTrust Root 2 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:d9:2c:4c:4e:2f:69:1a:23:e3:56:ba:f3:ce:84: + c0:09:c0:79:f1:44:5f:33:1f:15:91:7f:8a:88:28: + b8:24:45:cc:8f:18:cd:1f:74:d1:b5:8f:71:4c:d6: + 31:f6:73:96:84:94:40:c5:a9:83:60:24:7d:af:6f: + 34:b7:4b:4c:c2:09:80:3b:45:04:9e:c4:3c:c4:27: + 75:7b:00:0c:a1:64:47:b5:14:5d:82:4b:51:3a:58: + bb:44:4c:3d:d3:e5:06:38:e8:61:5c:98:78:bb:80: + b3:9c:da:72:82:62:a0:df:9c:5f:eb:f9:4f:77:c2: + cc:60:18:00:6b:34:82:25:b3 + Exponent: 65537 (0x10001) + Signature Algorithm: md5WithRSAEncryption + a3:64:91:6f:10:ed:e7:6e:a2:42:40:94:78:ce:f8:14:08:d1: + fa:43:85:eb:46:cd:92:14:d0:ef:2e:2d:36:39:18:d9:ba:c9: + 27:88:29:e9:48:17:6f:f8:c1:aa:c8:61:6d:2d:fd:40:2d:75: + 43:30:97:39:f8:14:64:bd:6f:ef:63:a8:2b:42:df:b2:5a:0d: + 25:ec:7b:37:d8:ce:91:29:82:16:f9:e8:62:a2:e1:76:c4:02: + 7d:dd:25:8b:98:e1:f6:0d:60:8c:f6:59:90:40:51:44:d1:c2: + fb:19:24:1e:17:39:6b:74:21:15:33:d6:55:d7:82:1e:70:2c: + 27:a8 + +GTE CyberTrust Root 3 +===================== +MD5 Fingerprint: DB:81:96:57:AE:64:61:EF:77:A7:83:C4:51:24:3C:87 +PEM Data: +-----BEGIN CERTIFICATE----- +MIICUDCCAbkCAgGXMA0GCSqGSIb3DQEBBQUAMHAxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEeMBwGA1UEAxMVR1RFIEN5YmVyVHJ1c3QgUm9vdCAzMB4X +DTk4MDgxMDE5NTkwOFoXDTA4MDgxMDE5MzYzOVowcDELMAkGA1UEBhMCVVMxGDAW +BgNVBAoTD0dURSBDb3Jwb3JhdGlvbjEnMCUGA1UECxMeR1RFIEN5YmVyVHJ1c3Qg +U29sdXRpb25zLCBJbmMuMR4wHAYDVQQDExVHVEUgQ3liZXJUcnVzdCBSb290IDMw +gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOHzsSsLztwU2TSXYlASVmOETFP6 +wIXP+sHdD955E39T+6oOYN3iYr/G7k6ZNKpoQzWZ+KP982O9AVRqnrI6lix7eCjG +WrWNGhUY/eOMLqJQCVtx1g21GB8ZjgQpk5N4q18U53NC8gMMV6IbUDsLu1ngoDoD +7icbWky5sAjKuRqJAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAheutlCAG6bKiazvy +ZuvjS7gSJgXl9JGo3IfcmPSUwfRhvdWcbFFzlV7QvdfmRdw8z0aE1ee57ORnY24A +KHdxXUoF6bl8hszCRLveKUja6t29F58dUQGo6BResVf3/9qPzpX+Le0yEnf/fGph +la4xcgYI8PnzDY7i76hTXZEDg94= +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: 407 (0x197) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=GTE CyberTrust Root 3 + Validity + Not Before: Aug 10 19:59:08 1998 GMT + Not After : Aug 10 19:36:39 2008 GMT + Subject: C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=GTE CyberTrust Root 3 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:e1:f3:b1:2b:0b:ce:dc:14:d9:34:97:62:50:12: + 56:63:84:4c:53:fa:c0:85:cf:fa:c1:dd:0f:de:79: + 13:7f:53:fb:aa:0e:60:dd:e2:62:bf:c6:ee:4e:99: + 34:aa:68:43:35:99:f8:a3:fd:f3:63:bd:01:54:6a: + 9e:b2:3a:96:2c:7b:78:28:c6:5a:b5:8d:1a:15:18: + fd:e3:8c:2e:a2:50:09:5b:71:d6:0d:b5:18:1f:19: + 8e:04:29:93:93:78:ab:5f:14:e7:73:42:f2:03:0c: + 57:a2:1b:50:3b:0b:bb:59:e0:a0:3a:03:ee:27:1b: + 5a:4c:b9:b0:08:ca:b9:1a:89 + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 85:eb:ad:94:20:06:e9:b2:a2:6b:3b:f2:66:eb:e3:4b:b8:12: + 26:05:e5:f4:91:a8:dc:87:dc:98:f4:94:c1:f4:61:bd:d5:9c: + 6c:51:73:95:5e:d0:bd:d7:e6:45:dc:3c:cf:46:84:d5:e7:b9: + ec:e4:67:63:6e:00:28:77:71:5d:4a:05:e9:b9:7c:86:cc:c2: + 44:bb:de:29:48:da:ea:dd:bd:17:9f:1d:51:01:a8:e8:14:5e: + b1:57:f7:ff:da:8f:ce:95:fe:2d:ed:32:12:77:ff:7c:6a:61: + 95:ae:31:72:06:08:f0:f9:f3:0d:8e:e2:ef:a8:53:5d:91:03: + 83:de + +GTE CyberTrust Root 4 +===================== +MD5 Fingerprint: 33:43:02:B1:B9:E0:73:B1:B1:20:CA:CB:C7:84:03:50 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDVTCCAj0CAgGoMA0GCSqGSIb3DQEBBQUAMHAxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEeMBwGA1UEAxMVR1RFIEN5YmVyVHJ1c3QgUm9vdCA0MB4X +DTk4MDgxMzEzNTEwMFoXDTEzMDgxMzIzNTkwMFowcDELMAkGA1UEBhMCVVMxGDAW +BgNVBAoTD0dURSBDb3Jwb3JhdGlvbjEnMCUGA1UECxMeR1RFIEN5YmVyVHJ1c3Qg +U29sdXRpb25zLCBJbmMuMR4wHAYDVQQDExVHVEUgQ3liZXJUcnVzdCBSb290IDQw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6nSJuf9pmPDlCsaMqb9P3 +vK6sMVrXEZBHuZ0ZLvnzGyKgw+GnusT8XgqUS5haSybkH/Tc8/6OiNxsLXx3hyZQ +wF5OqCih6hdpT03GAQ7amg0GViYVtqRdejWvje14Uob5OKuzAdPaBZaxtlCrwKGu +F1P6QzkgcWUj223Etu2YRYPX0vbiqWv7+XXM78WrcZY16N+OkZuoEHUft84Tjmuz +lneXGpEvxyxpmfAPKmgAmHZEG4wo0uuO9IO0f6QlXmw72cZo1WG41F4xB7VbkDVS +V3sXIO0tuB6OiDk+Usvf8FyxZbulErSQY79xnTLB2r9QSpW+BjrEK+vNmHZETQvl +AgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAEOvHIfJSbpliTRJPOoHO0eiedSgO5Bs +3n+oVMPoTEAyvMjsHOXZrEC6/Iw/wnOc9GTq36ntTlvIAWDuOW1DJ/N/qgjS/k5v +FDJNfeQ0gKU1xNZGULQ7oC1lH09lfjQoLcCndn0xyQ0zFvYgGSARULsDzHBtlrfv +TKfaNhXPu03UltyITWyY7blz/ihXoO1k+AqBKXP29pcyhzm0ge/ZTRoHNPe6QjXe +V9xc1vfF6wonDIGmwtBoTv2SW0iD9haKjzZb7TFsP0F6cfeSPzGkCkBM84biYcE8 +SYEtpbjvupcPvCsdm4ny0o4eTYbywqv2LZnAGyoNobZP+SxYTT19Nwo= +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: 424 (0x1a8) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=GTE CyberTrust Root 4 + Validity + Not Before: Aug 13 13:51:00 1998 GMT + Not After : Aug 13 23:59:00 2013 GMT + Subject: C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=GTE CyberTrust Root 4 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:ba:9d:22:6e:7f:da:66:3c:39:42:b1:a3:2a:6f: + d3:f7:bc:ae:ac:31:5a:d7:11:90:47:b9:9d:19:2e: + f9:f3:1b:22:a0:c3:e1:a7:ba:c4:fc:5e:0a:94:4b: + 98:5a:4b:26:e4:1f:f4:dc:f3:fe:8e:88:dc:6c:2d: + 7c:77:87:26:50:c0:5e:4e:a8:28:a1:ea:17:69:4f: + 4d:c6:01:0e:da:9a:0d:06:56:26:15:b6:a4:5d:7a: + 35:af:8d:ed:78:52:86:f9:38:ab:b3:01:d3:da:05: + 96:b1:b6:50:ab:c0:a1:ae:17:53:fa:43:39:20:71: + 65:23:db:6d:c4:b6:ed:98:45:83:d7:d2:f6:e2:a9: + 6b:fb:f9:75:cc:ef:c5:ab:71:96:35:e8:df:8e:91: + 9b:a8:10:75:1f:b7:ce:13:8e:6b:b3:96:77:97:1a: + 91:2f:c7:2c:69:99:f0:0f:2a:68:00:98:76:44:1b: + 8c:28:d2:eb:8e:f4:83:b4:7f:a4:25:5e:6c:3b:d9: + c6:68:d5:61:b8:d4:5e:31:07:b5:5b:90:35:52:57: + 7b:17:20:ed:2d:b8:1e:8e:88:39:3e:52:cb:df:f0: + 5c:b1:65:bb:a5:12:b4:90:63:bf:71:9d:32:c1:da: + bf:50:4a:95:be:06:3a:c4:2b:eb:cd:98:76:44:4d: + 0b:e5 + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 43:af:1c:87:c9:49:ba:65:89:34:49:3c:ea:07:3b:47:a2:79: + d4:a0:3b:90:6c:de:7f:a8:54:c3:e8:4c:40:32:bc:c8:ec:1c: + e5:d9:ac:40:ba:fc:8c:3f:c2:73:9c:f4:64:ea:df:a9:ed:4e: + 5b:c8:01:60:ee:39:6d:43:27:f3:7f:aa:08:d2:fe:4e:6f:14: + 32:4d:7d:e4:34:80:a5:35:c4:d6:46:50:b4:3b:a0:2d:65:1f: + 4f:65:7e:34:28:2d:c0:a7:76:7d:31:c9:0d:33:16:f6:20:19: + 20:11:50:bb:03:cc:70:6d:96:b7:ef:4c:a7:da:36:15:cf:bb: + 4d:d4:96:dc:88:4d:6c:98:ed:b9:73:fe:28:57:a0:ed:64:f8: + 0a:81:29:73:f6:f6:97:32:87:39:b4:81:ef:d9:4d:1a:07:34: + f7:ba:42:35:de:57:dc:5c:d6:f7:c5:eb:0a:27:0c:81:a6:c2: + d0:68:4e:fd:92:5b:48:83:f6:16:8a:8f:36:5b:ed:31:6c:3f: + 41:7a:71:f7:92:3f:31:a4:0a:40:4c:f3:86:e2:61:c1:3c:49: + 81:2d:a5:b8:ef:ba:97:0f:bc:2b:1d:9b:89:f2:d2:8e:1e:4d: + 86:f2:c2:ab:f6:2d:99:c0:1b:2a:0d:a1:b6:4f:f9:2c:58:4d: + 3d:7d:37:0a + +GTE CyberTrust Root 5 +===================== +MD5 Fingerprint: 7D:6C:86:E4:FC:4D:D1:0B:00:BA:22:BB:4E:7C:6A:8E +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgICAbYwDQYJKoZIhvcNAQEFBQAwcDELMAkGA1UEBhMCVVMx +GDAWBgNVBAoTD0dURSBDb3Jwb3JhdGlvbjEnMCUGA1UECxMeR1RFIEN5YmVyVHJ1 +c3QgU29sdXRpb25zLCBJbmMuMR4wHAYDVQQDExVHVEUgQ3liZXJUcnVzdCBSb290 +IDUwHhcNOTgwODE0MTQ1MDAwWhcNMTMwODE0MjM1OTAwWjBwMQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xHjAcBgNVBAMTFUdURSBDeWJlclRydXN0IFJv +b3QgNTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALwSbj+KfHqXAewe +uzlaAvR4RKJIG457SVJ6uHtHs6+Um2+7lvoramVcuByUc76/iQoigO5X/IwFu3Cf +lzkE2qOHXKjlyq/AM5rVN1xLrOSA0KYjYPv9ci6UncfOwgQy73hgXe2thw9FZR48 +mgqavl0dmezn8tHGehfZrZtUln/EfGC/haoVNR1A2hG87FQhKC0joajwzy3N3fx+ +D17hZQdWywe00lboXjHMGGPEhtIthc+Tkqtt/mg5+95zvYb45EZ66p8My/QZ/mO8 +0Sx7iDM29uThnAxTgWAc2i6rlqkWiBNQmbK9Vd8VMH7o5Zj7cH5stQf8/Ea30O03 +ln4y/iECAwEAAaNaMFgwEgYDVR0TAQH/BAgwBgEB/wIBBTAOBgNVHQ8BAf8EBAMC +AQYwFwYDVR0gBBAwDjAMBgoqhkiG+GMBAgEDMBkGA1UdDgQSBBB2CkkhOEyf3vjE +ScdxcZGdMA0GCSqGSIb3DQEBBQUAA4IBAQBBOtQYW9q43iEc4Y4J5fFoNP/elvQH +9ac886xKsZv6kvqb7eYyIapKdsXcTzjl39WG5NXIdn2Y17HNj021kSNsi4rr6nzv +FJTExvAfSi0ycWMrY5EmAgm2gB3t4sy4f9uHY8jh0GwmsTUdQGYQG82VVBgzYewT +T9oT95mvPtDPjqZyorPDBZrJJ32SzH5SjbOrcG2eiZ9N6xp1wpiq1QIW1wyKvyXk +6y28mOlYOBl8uTf+2+KZCHMGx5eDan0QAS8yuRcFSmXmL86+XlOmgumaUwqEdC2D +ysiUFnZflGEo8IWnObvXi9moshMdVAk0JH0ggX1mfqKQdFwQxr3sqxvC +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 438 (0x1b6) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=GTE CyberTrust Root 5 + Validity + Not Before: Aug 14 14:50:00 1998 GMT + Not After : Aug 14 23:59:00 2013 GMT + Subject: C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=GTE CyberTrust Root 5 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:bc:12:6e:3f:8a:7c:7a:97:01:ec:1e:bb:39:5a: + 02:f4:78:44:a2:48:1b:8e:7b:49:52:7a:b8:7b:47: + b3:af:94:9b:6f:bb:96:fa:2b:6a:65:5c:b8:1c:94: + 73:be:bf:89:0a:22:80:ee:57:fc:8c:05:bb:70:9f: + 97:39:04:da:a3:87:5c:a8:e5:ca:af:c0:33:9a:d5: + 37:5c:4b:ac:e4:80:d0:a6:23:60:fb:fd:72:2e:94: + 9d:c7:ce:c2:04:32:ef:78:60:5d:ed:ad:87:0f:45: + 65:1e:3c:9a:0a:9a:be:5d:1d:99:ec:e7:f2:d1:c6: + 7a:17:d9:ad:9b:54:96:7f:c4:7c:60:bf:85:aa:15: + 35:1d:40:da:11:bc:ec:54:21:28:2d:23:a1:a8:f0: + cf:2d:cd:dd:fc:7e:0f:5e:e1:65:07:56:cb:07:b4: + d2:56:e8:5e:31:cc:18:63:c4:86:d2:2d:85:cf:93: + 92:ab:6d:fe:68:39:fb:de:73:bd:86:f8:e4:46:7a: + ea:9f:0c:cb:f4:19:fe:63:bc:d1:2c:7b:88:33:36: + f6:e4:e1:9c:0c:53:81:60:1c:da:2e:ab:96:a9:16: + 88:13:50:99:b2:bd:55:df:15:30:7e:e8:e5:98:fb: + 70:7e:6c:b5:07:fc:fc:46:b7:d0:ed:37:96:7e:32: + fe:21 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:5 + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Certificate Policies: + Policy: 1.2.840.113763.1.2.1.3 + + X509v3 Subject Key Identifier: + 76:0A:49:21:38:4C:9F:DE:F8:C4:49:C7:71:71:91:9D + Signature Algorithm: sha1WithRSAEncryption + 41:3a:d4:18:5b:da:b8:de:21:1c:e1:8e:09:e5:f1:68:34:ff: + de:96:f4:07:f5:a7:3c:f3:ac:4a:b1:9b:fa:92:fa:9b:ed:e6: + 32:21:aa:4a:76:c5:dc:4f:38:e5:df:d5:86:e4:d5:c8:76:7d: + 98:d7:b1:cd:8f:4d:b5:91:23:6c:8b:8a:eb:ea:7c:ef:14:94: + c4:c6:f0:1f:4a:2d:32:71:63:2b:63:91:26:02:09:b6:80:1d: + ed:e2:cc:b8:7f:db:87:63:c8:e1:d0:6c:26:b1:35:1d:40:66: + 10:1b:cd:95:54:18:33:61:ec:13:4f:da:13:f7:99:af:3e:d0: + cf:8e:a6:72:a2:b3:c3:05:9a:c9:27:7d:92:cc:7e:52:8d:b3: + ab:70:6d:9e:89:9f:4d:eb:1a:75:c2:98:aa:d5:02:16:d7:0c: + 8a:bf:25:e4:eb:2d:bc:98:e9:58:38:19:7c:b9:37:fe:db:e2: + 99:08:73:06:c7:97:83:6a:7d:10:01:2f:32:b9:17:05:4a:65: + e6:2f:ce:be:5e:53:a6:82:e9:9a:53:0a:84:74:2d:83:ca:c8: + 94:16:76:5f:94:61:28:f0:85:a7:39:bb:d7:8b:d9:a8:b2:13: + 1d:54:09:34:24:7d:20:81:7d:66:7e:a2:90:74:5c:10:c6:bd: + ec:ab:1b:c2 + +GTE CyberTrust Root CA +====================== +MD5 Fingerprint: C4:D7:F0:B2:A3:C5:7D:61:67:F0:04:CD:43:D3:BA:58 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRydXN0IFJv +b3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQDExNHVEUgQ3liZXJU +cnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC45k+625h8cXyv +RLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8KDPufpz+iCWaEVh43KRuH6X4M +ypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPwKfWVWgkWYXcKIiXUT0Wqx73llt/5 +1KiOQswkwB6RJ0q1bQaAYznEol44AwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABKz +dcZfHeFhVYAA1IFLezEPI2PnPfMD+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWl +IjeaY8JIILTbcuPI9tl8vrGvU9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9Apy +bW1EDp3zdHSo1TRJ6V6e6bR64eVaH4QwnNOfpSXY +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: 419 (0x1a3) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=US, O=GTE Corporation, CN=GTE CyberTrust Root + Validity + Not Before: Feb 23 23:01:00 1996 GMT + Not After : Feb 23 23:59:00 2006 GMT + Subject: C=US, O=GTE Corporation, CN=GTE CyberTrust Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:b8:e6:4f:ba:db:98:7c:71:7c:af:44:b7:d3:0f: + 46:d9:64:e5:93:c1:42:8e:c7:ba:49:8d:35:2d:7a: + e7:8b:bd:e5:05:31:59:c6:b1:2f:0a:0c:fb:9f:a7: + 3f:a2:09:66:84:56:1e:37:29:1b:87:e9:7e:0c:ca: + 9a:9f:a5:7f:f5:15:94:a3:d5:a2:46:82:d8:68:4c: + d1:37:15:06:68:af:bd:f8:b0:b3:f0:29:f5:95:5a: + 09:16:61:77:0a:22:25:d4:4f:45:aa:c7:bd:e5:96: + df:f9:d4:a8:8e:42:cc:24:c0:1e:91:27:4a:b5:6d: + 06:80:63:39:c4:a2:5e:38:03 + Exponent: 65537 (0x10001) + Signature Algorithm: md5WithRSAEncryption + 12:b3:75:c6:5f:1d:e1:61:55:80:00:d4:81:4b:7b:31:0f:23: + 63:e7:3d:f3:03:f9:f4:36:a8:bb:d9:e3:a5:97:4d:ea:2b:29: + e0:d6:6a:73:81:e6:c0:89:a3:d3:f1:e0:a5:a5:22:37:9a:63: + c2:48:20:b4:db:72:e3:c8:f6:d9:7c:be:b1:af:53:da:14:b4: + 21:b8:d6:d5:96:e3:fe:4e:0c:59:62:b6:9a:4a:f9:42:dd:8c: + 6f:81:a9:71:ff:f4:0a:72:6d:6d:44:0e:9d:f3:74:74:a8:d5: + 34:49:e9:5e:9e:e9:b4:7a:e1:e5:5a:1f:84:30:9c:d3:9f:a5: + 25:d8 + +GlobalSign Partners CA +====================== +MD5 Fingerprint: 3C:75:CD:4C:BD:A9:D0:8A:79:4F:50:16:37:84:F4:2B +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDnjCCAoagAwIBAgILAgAAAAAA1ni50a8wDQYJKoZIhvcNAQEEBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05OTAxMjgxMjAw +MDBaFw0wOTAxMjgxMjAwMDBaMF8xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRQwEgYDVQQLEwtQYXJ0bmVycyBDQTEfMB0GA1UEAxMWR2xv +YmFsU2lnbiBQYXJ0bmVycyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBANIs+DKsShJ6N8gpkaWujG4eDsA0M4jlM3EWHHiEaMMYNFAuFj6xlIJPsZqf +APjGETXGaXuYAq0ABohs50wzKACIJ0Yfh7NxdWO8MruI3mYYDlAGk7T2vBQ3MD0i +3z3/dX7ZChrFn7P80KyzCHqJ0wHoAFznSgs9TXsmordiBovaRt2TFz8/WwJLC7aI +IBGSAK27xy7U40Wu9YlafI2krYVkMsAnjMbyioCShiRWWY10aKKDQrOePVBBhm8g +bvb9ztMZ4zLMj+2aXm0fKPVSrG4YXvg90ZLlumwBiEsK8i3eZTMFQqBMqjF2vv2/ +gXj5cRxGXi0VlS0wWY5MQdFiqz0CAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgAGMB0G +A1UdDgQWBBRDJI1wFQhiVZxPDEAXXYZeD6JM+zAfBgNVHSMEGDAWgBRge2YaRQ2X +yolQL30EzTSo//z9SzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IB +AQBm7bSIaRGZgiGDrKFti5uErQ8tyB6Mynt+rarUjt4H1p5Fx6W4nAc5YCVVGsBP +GeXPFylJiRg1ZuXrKEBOV8mvs+S4IAWjO5VQkUmUKX0s5YhBpUWIXp2CJ/fS71u1 +T5++/jVlLFVkn+FR2iJhd7pYTo/GeVlZbjCAok+QbiELrdBoOZAQm+0iZW8eETjm +f4zS8zltR9Uh6Op1OkHRrfYWnV0LIb3zH2MGJR3BHzVxLOsgGdXBsOw95W/tAgc/ +E3tmktZEwZj3X1CLelvCb22w0fjldKBAN6MlD+Q9ymQxk5BcMHu5OTGaXkzNuUFP +UOQ9OK7IZtnHO11RR6ybq/Kt +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: + 02:00:00:00:00:00:d6:78:b9:d1:af + Signature Algorithm: md5WithRSAEncryption + Issuer: C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA + Validity + Not Before: Jan 28 12:00:00 1999 GMT + Not After : Jan 28 12:00:00 2009 GMT + Subject: C=BE, O=GlobalSign nv-sa, OU=Partners CA, CN=GlobalSign Partners CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:d2:2c:f8:32:ac:4a:12:7a:37:c8:29:91:a5:ae: + 8c:6e:1e:0e:c0:34:33:88:e5:33:71:16:1c:78:84: + 68:c3:18:34:50:2e:16:3e:b1:94:82:4f:b1:9a:9f: + 00:f8:c6:11:35:c6:69:7b:98:02:ad:00:06:88:6c: + e7:4c:33:28:00:88:27:46:1f:87:b3:71:75:63:bc: + 32:bb:88:de:66:18:0e:50:06:93:b4:f6:bc:14:37: + 30:3d:22:df:3d:ff:75:7e:d9:0a:1a:c5:9f:b3:fc: + d0:ac:b3:08:7a:89:d3:01:e8:00:5c:e7:4a:0b:3d: + 4d:7b:26:a2:b7:62:06:8b:da:46:dd:93:17:3f:3f: + 5b:02:4b:0b:b6:88:20:11:92:00:ad:bb:c7:2e:d4: + e3:45:ae:f5:89:5a:7c:8d:a4:ad:85:64:32:c0:27: + 8c:c6:f2:8a:80:92:86:24:56:59:8d:74:68:a2:83: + 42:b3:9e:3d:50:41:86:6f:20:6e:f6:fd:ce:d3:19: + e3:32:cc:8f:ed:9a:5e:6d:1f:28:f5:52:ac:6e:18: + 5e:f8:3d:d1:92:e5:ba:6c:01:88:4b:0a:f2:2d:de: + 65:33:05:42:a0:4c:aa:31:76:be:fd:bf:81:78:f9: + 71:1c:46:5e:2d:15:95:2d:30:59:8e:4c:41:d1:62: + ab:3d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + 43:24:8D:70:15:08:62:55:9C:4F:0C:40:17:5D:86:5E:0F:A2:4C:FB + X509v3 Authority Key Identifier: + keyid:60:7B:66:1A:45:0D:97:CA:89:50:2F:7D:04:CD:34:A8:FF:FC:FD:4B + + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: md5WithRSAEncryption + 66:ed:b4:88:69:11:99:82:21:83:ac:a1:6d:8b:9b:84:ad:0f: + 2d:c8:1e:8c:ca:7b:7e:ad:aa:d4:8e:de:07:d6:9e:45:c7:a5: + b8:9c:07:39:60:25:55:1a:c0:4f:19:e5:cf:17:29:49:89:18: + 35:66:e5:eb:28:40:4e:57:c9:af:b3:e4:b8:20:05:a3:3b:95: + 50:91:49:94:29:7d:2c:e5:88:41:a5:45:88:5e:9d:82:27:f7: + d2:ef:5b:b5:4f:9f:be:fe:35:65:2c:55:64:9f:e1:51:da:22: + 61:77:ba:58:4e:8f:c6:79:59:59:6e:30:80:a2:4f:90:6e:21: + 0b:ad:d0:68:39:90:10:9b:ed:22:65:6f:1e:11:38:e6:7f:8c: + d2:f3:39:6d:47:d5:21:e8:ea:75:3a:41:d1:ad:f6:16:9d:5d: + 0b:21:bd:f3:1f:63:06:25:1d:c1:1f:35:71:2c:eb:20:19:d5: + c1:b0:ec:3d:e5:6f:ed:02:07:3f:13:7b:66:92:d6:44:c1:98: + f7:5f:50:8b:7a:5b:c2:6f:6d:b0:d1:f8:e5:74:a0:40:37:a3: + 25:0f:e4:3d:ca:64:31:93:90:5c:30:7b:b9:39:31:9a:5e:4c: + cd:b9:41:4f:50:e4:3d:38:ae:c8:66:d9:c7:3b:5d:51:47:ac: + 9b:ab:f2:ad + +GlobalSign Primary Class 1 CA +============================= +MD5 Fingerprint: 5C:AC:59:01:A4:86:53:CB:10:66:B5:D6:D6:71:FF:01 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDrDCCApSgAwIBAgILAgAAAAAA1ni4N88wDQYJKoZIhvcNAQEEBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MTUxMjAw +MDBaFw0wOTAxMjgxMjAwMDBaMG0xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRswGQYDVQQLExJQcmltYXJ5IENsYXNzIDEgQ0ExJjAkBgNV +BAMTHUdsb2JhbFNpZ24gUHJpbWFyeSBDbGFzcyAxIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAvSA1R9Eo1gijEjkjRw29cCFSDlcxlaY0V2vsfkN5 +wwZSSM28taGZvdgfMrzP125ybS53IpCCTkuPmgwBQprZcFm2nR/mY9EMrR1O+IWB ++a7vn6ZSYUR5GnVF4GFWRW1CjD1yy6akErea9dZg0GBQs46mpuy09BLNf6jO77Ph +hTD+csTm53eznlhB1lGDiAfGtmlPNt7RC0g/vdafIXRkbycGPkv9Dqabv6RIV4yQ +7okYCwKBGL5n/lNgiCe6o3M0S1pWtN5zBe2Yll3sSudA/EsJYuvQ4zFPhdF6q1ln +K/uID+uqg701/WEn7GYOQlf3acIM7/xqwm5J2o9BOK5IqQIDAQABo2MwYTAOBgNV +HQ8BAf8EBAMCAAYwHQYDVR0OBBYEFPzgZvZaNZnrQB7SuB5DvJiOH4rDMB8GA1Ud +IwQYMBaAFGB7ZhpFDZfKiVAvfQTNNKj//P1LMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQEEBQADggEBAJujCETO8pCdcfMyswVqterPKZjeVT6gFn0GekTWr9L6 +E1iM+BzHqx20G+9paJhcCDmP4Pf7SMwh57gz2wWqNCRsSuXpe2Deg7MfCr5BdfzM +MEi3wSYdBDOqtnjtKsu6VpcybvcxlS5G8hTuJ8f3Yom5XFrTOIpk9Te08bM0ctXV +IT1L13iT1zFmNR6j2EdJbxyt4YB/+JgkbHOsDsIadwKjJge3x2tdvILVKkgdY89Q +Mqb7HBhHFQpbDFw4JJoEmKgISF98NIdjqy2NTAB3lBt2uvUWGKMVry+U9ikAdsEV +F9PpN0121MtLKVkkrNpKoOpj3l9Usfrz0UXLxWS0cyE= +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: + 02:00:00:00:00:00:d6:78:b8:37:cf + Signature Algorithm: md5WithRSAEncryption + Issuer: C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA + Validity + Not Before: Sep 15 12:00:00 1998 GMT + Not After : Jan 28 12:00:00 2009 GMT + Subject: C=BE, O=GlobalSign nv-sa, OU=Primary Class 1 CA, CN=GlobalSign Primary Class 1 CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:bd:20:35:47:d1:28:d6:08:a3:12:39:23:47:0d: + bd:70:21:52:0e:57:31:95:a6:34:57:6b:ec:7e:43: + 79:c3:06:52:48:cd:bc:b5:a1:99:bd:d8:1f:32:bc: + cf:d7:6e:72:6d:2e:77:22:90:82:4e:4b:8f:9a:0c: + 01:42:9a:d9:70:59:b6:9d:1f:e6:63:d1:0c:ad:1d: + 4e:f8:85:81:f9:ae:ef:9f:a6:52:61:44:79:1a:75: + 45:e0:61:56:45:6d:42:8c:3d:72:cb:a6:a4:12:b7: + 9a:f5:d6:60:d0:60:50:b3:8e:a6:a6:ec:b4:f4:12: + cd:7f:a8:ce:ef:b3:e1:85:30:fe:72:c4:e6:e7:77: + b3:9e:58:41:d6:51:83:88:07:c6:b6:69:4f:36:de: + d1:0b:48:3f:bd:d6:9f:21:74:64:6f:27:06:3e:4b: + fd:0e:a6:9b:bf:a4:48:57:8c:90:ee:89:18:0b:02: + 81:18:be:67:fe:53:60:88:27:ba:a3:73:34:4b:5a: + 56:b4:de:73:05:ed:98:96:5d:ec:4a:e7:40:fc:4b: + 09:62:eb:d0:e3:31:4f:85:d1:7a:ab:59:67:2b:fb: + 88:0f:eb:aa:83:bd:35:fd:61:27:ec:66:0e:42:57: + f7:69:c2:0c:ef:fc:6a:c2:6e:49:da:8f:41:38:ae: + 48:a9 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + FC:E0:66:F6:5A:35:99:EB:40:1E:D2:B8:1E:43:BC:98:8E:1F:8A:C3 + X509v3 Authority Key Identifier: + keyid:60:7B:66:1A:45:0D:97:CA:89:50:2F:7D:04:CD:34:A8:FF:FC:FD:4B + + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: md5WithRSAEncryption + 9b:a3:08:44:ce:f2:90:9d:71:f3:32:b3:05:6a:b5:ea:cf:29: + 98:de:55:3e:a0:16:7d:06:7a:44:d6:af:d2:fa:13:58:8c:f8: + 1c:c7:ab:1d:b4:1b:ef:69:68:98:5c:08:39:8f:e0:f7:fb:48: + cc:21:e7:b8:33:db:05:aa:34:24:6c:4a:e5:e9:7b:60:de:83: + b3:1f:0a:be:41:75:fc:cc:30:48:b7:c1:26:1d:04:33:aa:b6: + 78:ed:2a:cb:ba:56:97:32:6e:f7:31:95:2e:46:f2:14:ee:27: + c7:f7:62:89:b9:5c:5a:d3:38:8a:64:f5:37:b4:f1:b3:34:72: + d5:d5:21:3d:4b:d7:78:93:d7:31:66:35:1e:a3:d8:47:49:6f: + 1c:ad:e1:80:7f:f8:98:24:6c:73:ac:0e:c2:1a:77:02:a3:26: + 07:b7:c7:6b:5d:bc:82:d5:2a:48:1d:63:cf:50:32:a6:fb:1c: + 18:47:15:0a:5b:0c:5c:38:24:9a:04:98:a8:08:48:5f:7c:34: + 87:63:ab:2d:8d:4c:00:77:94:1b:76:ba:f5:16:18:a3:15:af: + 2f:94:f6:29:00:76:c1:15:17:d3:e9:37:4d:76:d4:cb:4b:29: + 59:24:ac:da:4a:a0:ea:63:de:5f:54:b1:fa:f3:d1:45:cb:c5: + 64:b4:73:21 + +GlobalSign Primary Class 2 CA +============================= +MD5 Fingerprint: A9:A9:42:59:7E:BE:5A:94:E4:2C:C6:8B:1C:2A:44:B6 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDrDCCApSgAwIBAgILAgAAAAAA1ni4jY0wDQYJKoZIhvcNAQEEBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05OTAxMjgxMjAw +MDBaFw0wOTAxMjgxMjAwMDBaMG0xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRswGQYDVQQLExJQcmltYXJ5IENsYXNzIDIgQ0ExJjAkBgNV +BAMTHUdsb2JhbFNpZ24gUHJpbWFyeSBDbGFzcyAyIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAkoz+7/RFjhdBbvzYvyFvqwadUsEsAJ0/joW4f0qP +vaBjKspJJ65agvR04lWS/8LRqnmitvrVnYIET8ayxl5jpzq62O7rim+ftrsoQcAi ++05IGgaS17/Xz7nZvThPOw1EblVB/vwJ29i/844h8egStfYTpdPGTJMisAL/7h0M +xKhrT3VoVujcKBJQ96gknS4kOfsJBd7lo2RJIdBofnEwkbFg4Dn0UPh6TZgAa3x5 +uk7OSuK6Nh23xTYVlZxkQupfxLr1QAW+4TpZvYSnGbjeTVNQzgfR0lHT7w2BbObn +bctdfD98zOxPgycl/3BQ9oNZdYQGZlgs3omNAKZJ+aVDdwIDAQABo2MwYTAOBgNV +HQ8BAf8EBAMCAAYwHQYDVR0OBBYEFHznsrEs3rGna+l2DOGj/U5sx7n2MB8GA1Ud +IwQYMBaAFGB7ZhpFDZfKiVAvfQTNNKj//P1LMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQEEBQADggEBAGPdWc6KeaqYnU7FiWQ3foqTZy8Q6m8nw413bfJcVpQZ +GmlgMEZdj/JtRTyONZd8L7hR4uiJvYjPJxwINFyIwWgk25GF5M/7+0ON6CUBG8QO +9wBCSIYfJAhYWoyN8mtHLGiRsWlC/Q2NySbmkoamZG6Sxc4+PH1x4yOkq8fVqKnf +gqc76IbVw08Y40TQ4NzzxWgu/qUvBYTIfkdCU2uHSv4y/14+cIy3qBXMF8L/RuzQ +7C20bhIoqflA6evUZpdTqWlVwKmqsi7N0Wn0vvi7fGnuVKbbnvtapj7+mu+UUUt1 +7tjU4ZrxAlYTiQ6nQouWi4UMG4W+Jq6rppm8IvFz30I= +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: + 02:00:00:00:00:00:d6:78:b8:8d:8d + Signature Algorithm: md5WithRSAEncryption + Issuer: C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA + Validity + Not Before: Jan 28 12:00:00 1999 GMT + Not After : Jan 28 12:00:00 2009 GMT + Subject: C=BE, O=GlobalSign nv-sa, OU=Primary Class 2 CA, CN=GlobalSign Primary Class 2 CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:92:8c:fe:ef:f4:45:8e:17:41:6e:fc:d8:bf:21: + 6f:ab:06:9d:52:c1:2c:00:9d:3f:8e:85:b8:7f:4a: + 8f:bd:a0:63:2a:ca:49:27:ae:5a:82:f4:74:e2:55: + 92:ff:c2:d1:aa:79:a2:b6:fa:d5:9d:82:04:4f:c6: + b2:c6:5e:63:a7:3a:ba:d8:ee:eb:8a:6f:9f:b6:bb: + 28:41:c0:22:fb:4e:48:1a:06:92:d7:bf:d7:cf:b9: + d9:bd:38:4f:3b:0d:44:6e:55:41:fe:fc:09:db:d8: + bf:f3:8e:21:f1:e8:12:b5:f6:13:a5:d3:c6:4c:93: + 22:b0:02:ff:ee:1d:0c:c4:a8:6b:4f:75:68:56:e8: + dc:28:12:50:f7:a8:24:9d:2e:24:39:fb:09:05:de: + e5:a3:64:49:21:d0:68:7e:71:30:91:b1:60:e0:39: + f4:50:f8:7a:4d:98:00:6b:7c:79:ba:4e:ce:4a:e2: + ba:36:1d:b7:c5:36:15:95:9c:64:42:ea:5f:c4:ba: + f5:40:05:be:e1:3a:59:bd:84:a7:19:b8:de:4d:53: + 50:ce:07:d1:d2:51:d3:ef:0d:81:6c:e6:e7:6d:cb: + 5d:7c:3f:7c:cc:ec:4f:83:27:25:ff:70:50:f6:83: + 59:75:84:06:66:58:2c:de:89:8d:00:a6:49:f9:a5: + 43:77 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + 7C:E7:B2:B1:2C:DE:B1:A7:6B:E9:76:0C:E1:A3:FD:4E:6C:C7:B9:F6 + X509v3 Authority Key Identifier: + keyid:60:7B:66:1A:45:0D:97:CA:89:50:2F:7D:04:CD:34:A8:FF:FC:FD:4B + + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: md5WithRSAEncryption + 63:dd:59:ce:8a:79:aa:98:9d:4e:c5:89:64:37:7e:8a:93:67: + 2f:10:ea:6f:27:c3:8d:77:6d:f2:5c:56:94:19:1a:69:60:30: + 46:5d:8f:f2:6d:45:3c:8e:35:97:7c:2f:b8:51:e2:e8:89:bd: + 88:cf:27:1c:08:34:5c:88:c1:68:24:db:91:85:e4:cf:fb:fb: + 43:8d:e8:25:01:1b:c4:0e:f7:00:42:48:86:1f:24:08:58:5a: + 8c:8d:f2:6b:47:2c:68:91:b1:69:42:fd:0d:8d:c9:26:e6:92: + 86:a6:64:6e:92:c5:ce:3e:3c:7d:71:e3:23:a4:ab:c7:d5:a8: + a9:df:82:a7:3b:e8:86:d5:c3:4f:18:e3:44:d0:e0:dc:f3:c5: + 68:2e:fe:a5:2f:05:84:c8:7e:47:42:53:6b:87:4a:fe:32:ff: + 5e:3e:70:8c:b7:a8:15:cc:17:c2:ff:46:ec:d0:ec:2d:b4:6e: + 12:28:a9:f9:40:e9:eb:d4:66:97:53:a9:69:55:c0:a9:aa:b2: + 2e:cd:d1:69:f4:be:f8:bb:7c:69:ee:54:a6:db:9e:fb:5a:a6: + 3e:fe:9a:ef:94:51:4b:75:ee:d8:d4:e1:9a:f1:02:56:13:89: + 0e:a7:42:8b:96:8b:85:0c:1b:85:be:26:ae:ab:a6:99:bc:22: + f1:73:df:42 + +GlobalSign Primary Class 3 CA +============================= +MD5 Fingerprint: 98:12:A3:4B:95:A9:96:64:94:E7:50:8C:3E:E1:83:5A +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDrDCCApSgAwIBAgILAgAAAAAA1ni41sMwDQYJKoZIhvcNAQEEBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05OTAxMjgxMjAw +MDBaFw0wOTAxMjgxMjAwMDBaMG0xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRswGQYDVQQLExJQcmltYXJ5IENsYXNzIDMgQ0ExJjAkBgNV +BAMTHUdsb2JhbFNpZ24gUHJpbWFyeSBDbGFzcyAzIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAkV5WZdbAwAScv0fEXHt6MQH5WJaZ4xyEL9xWj631 +WYHVQ2ZdWpOMdcqp5xHBURAUYMks1HuvxneGq3onrm+VuQvKtkb7fhr0DRRt0slO +sq7wVPZcQEw2SHToVIxlZhCnvSu3II0FSa14fdIkI1Dj8LR5mwE5/6870y3u4UmN +jS88akFFL5vjPeES5JF1ns+gPjySgW+KLhjc4PKMjP2H2Qf0QJTJTk9D32dWb70D +UHyZZ6S5PJFsAm6E1vxG98xvGD4X8O8LZBZX5qyG8UiqQ8HJJ3hzREXihX26/7Ph ++xsFpEs7mRIlAVAUaq9d6sgM7uTa7EuLXGgTldzDtTA61wIDAQABo2MwYTAOBgNV +HQ8BAf8EBAMCAAYwHQYDVR0OBBYEFMw2zBe0RZEv7c87MEh3+7UUmb7jMB8GA1Ud +IwQYMBaAFGB7ZhpFDZfKiVAvfQTNNKj//P1LMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQEEBQADggEBAFeyVMy9lRdkYIm2U5EMRZLDPahsw8yyGPV4QXTYfaMn +r3cNWT6UHWn6idMMvRoB9D/o4Hcagiha5mLXt+M2yQ6feuPC08xZiQzvFovwNnci +yqS2t8FCZwFAY8znOGSHWxSWZnstFO69SW3/d9DiTlvTgMJND8q4nYGXpzRux+Oc +SOW0qkX19mVMSPISwtKTjMIVJPMrUv/jCK64btYsEs85yxIq56l7X5g9o+HMpmOJ +XH0xdfnV1l3y0NQ9355xqA7c5CCXeOZ/U6QNUU+OOwOuow1aTcN55zVYcELJXqFe +tNkio0RTNaTQz3OAxc+fVph2+RRMd4eCydx+XTTVNnU= +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: + 02:00:00:00:00:00:d6:78:b8:d6:c3 + Signature Algorithm: md5WithRSAEncryption + Issuer: C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA + Validity + Not Before: Jan 28 12:00:00 1999 GMT + Not After : Jan 28 12:00:00 2009 GMT + Subject: C=BE, O=GlobalSign nv-sa, OU=Primary Class 3 CA, CN=GlobalSign Primary Class 3 CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:91:5e:56:65:d6:c0:c0:04:9c:bf:47:c4:5c:7b: + 7a:31:01:f9:58:96:99:e3:1c:84:2f:dc:56:8f:ad: + f5:59:81:d5:43:66:5d:5a:93:8c:75:ca:a9:e7:11: + c1:51:10:14:60:c9:2c:d4:7b:af:c6:77:86:ab:7a: + 27:ae:6f:95:b9:0b:ca:b6:46:fb:7e:1a:f4:0d:14: + 6d:d2:c9:4e:b2:ae:f0:54:f6:5c:40:4c:36:48:74: + e8:54:8c:65:66:10:a7:bd:2b:b7:20:8d:05:49:ad: + 78:7d:d2:24:23:50:e3:f0:b4:79:9b:01:39:ff:af: + 3b:d3:2d:ee:e1:49:8d:8d:2f:3c:6a:41:45:2f:9b: + e3:3d:e1:12:e4:91:75:9e:cf:a0:3e:3c:92:81:6f: + 8a:2e:18:dc:e0:f2:8c:8c:fd:87:d9:07:f4:40:94: + c9:4e:4f:43:df:67:56:6f:bd:03:50:7c:99:67:a4: + b9:3c:91:6c:02:6e:84:d6:fc:46:f7:cc:6f:18:3e: + 17:f0:ef:0b:64:16:57:e6:ac:86:f1:48:aa:43:c1: + c9:27:78:73:44:45:e2:85:7d:ba:ff:b3:e1:fb:1b: + 05:a4:4b:3b:99:12:25:01:50:14:6a:af:5d:ea:c8: + 0c:ee:e4:da:ec:4b:8b:5c:68:13:95:dc:c3:b5:30: + 3a:d7 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + CC:36:CC:17:B4:45:91:2F:ED:CF:3B:30:48:77:FB:B5:14:99:BE:E3 + X509v3 Authority Key Identifier: + keyid:60:7B:66:1A:45:0D:97:CA:89:50:2F:7D:04:CD:34:A8:FF:FC:FD:4B + + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: md5WithRSAEncryption + 57:b2:54:cc:bd:95:17:64:60:89:b6:53:91:0c:45:92:c3:3d: + a8:6c:c3:cc:b2:18:f5:78:41:74:d8:7d:a3:27:af:77:0d:59: + 3e:94:1d:69:fa:89:d3:0c:bd:1a:01:f4:3f:e8:e0:77:1a:82: + 28:5a:e6:62:d7:b7:e3:36:c9:0e:9f:7a:e3:c2:d3:cc:59:89: + 0c:ef:16:8b:f0:36:77:22:ca:a4:b6:b7:c1:42:67:01:40:63: + cc:e7:38:64:87:5b:14:96:66:7b:2d:14:ee:bd:49:6d:ff:77: + d0:e2:4e:5b:d3:80:c2:4d:0f:ca:b8:9d:81:97:a7:34:6e:c7: + e3:9c:48:e5:b4:aa:45:f5:f6:65:4c:48:f2:12:c2:d2:93:8c: + c2:15:24:f3:2b:52:ff:e3:08:ae:b8:6e:d6:2c:12:cf:39:cb: + 12:2a:e7:a9:7b:5f:98:3d:a3:e1:cc:a6:63:89:5c:7d:31:75: + f9:d5:d6:5d:f2:d0:d4:3d:df:9e:71:a8:0e:dc:e4:20:97:78: + e6:7f:53:a4:0d:51:4f:8e:3b:03:ae:a3:0d:5a:4d:c3:79:e7: + 35:58:70:42:c9:5e:a1:5e:b4:d9:22:a3:44:53:35:a4:d0:cf: + 73:80:c5:cf:9f:56:98:76:f9:14:4c:77:87:82:c9:dc:7e:5d: + 34:d5:36:75 + +GlobalSign Root CA +================== +MD5 Fingerprint: AB:BF:EA:E3:6B:29:A6:CC:A6:78:35:99:EF:AD:2B:80 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQU +YHtmGkUNl8qJUC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B +AQQFAAOCAQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq7 +5bCdPTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q +gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT2iHR +rH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlDNPYPhyk7 +ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBgHcl5JLL2bP2o +Zg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: + 02:00:00:00:00:00:d6:78:b7:94:05 + Signature Algorithm: md5WithRSAEncryption + Issuer: C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA + Validity + Not Before: Sep 1 12:00:00 1998 GMT + Not After : Jan 28 12:00:00 2014 GMT + Subject: C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:da:0e:e6:99:8d:ce:a3:e3:4f:8a:7e:fb:f1:8b: + 83:25:6b:ea:48:1f:f1:2a:b0:b9:95:11:04:bd:f0: + 63:d1:e2:67:66:cf:1c:dd:cf:1b:48:2b:ee:8d:89: + 8e:9a:af:29:80:65:ab:e9:c7:2d:12:cb:ab:1c:4c: + 70:07:a1:3d:0a:30:cd:15:8d:4f:f8:dd:d4:8c:50: + 15:1c:ef:50:ee:c4:2e:f7:fc:e9:52:f2:91:7d:e0: + 6d:d5:35:30:8e:5e:43:73:f2:41:e9:d5:6a:e3:b2: + 89:3a:56:39:38:6f:06:3c:88:69:5b:2a:4d:c5:a7: + 54:b8:6c:89:cc:9b:f9:3c:ca:e5:fd:89:f5:12:3c: + 92:78:96:d6:dc:74:6e:93:44:61:d1:8d:c7:46:b2: + 75:0e:86:e8:19:8a:d5:6d:6c:d5:78:16:95:a2:e9: + c8:0a:38:eb:f2:24:13:4f:73:54:93:13:85:3a:1b: + bc:1e:34:b5:8b:05:8c:b9:77:8b:b1:db:1f:20:91: + ab:09:53:6e:90:ce:7b:37:74:b9:70:47:91:22:51: + 63:16:79:ae:b1:ae:41:26:08:c8:19:2b:d1:46:aa: + 48:d6:64:2a:d7:83:34:ff:2c:2a:c1:6c:19:43:4a: + 07:85:e7:d3:7c:f6:21:68:ef:ea:f2:52:9f:7f:93: + 90:cf + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + 60:7B:66:1A:45:0D:97:CA:89:50:2F:7D:04:CD:34:A8:FF:FC:FD:4B + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: md5WithRSAEncryption + ae:aa:9f:fc:b7:d2:cb:1f:5f:39:29:28:18:9e:34:c9:6c:4f: + 6f:1a:f0:64:a2:70:4a:4f:13:86:9b:60:28:9e:e8:81:49:98: + 7d:0a:bb:e5:b0:9d:3d:36:db:8f:05:51:ff:09:31:2a:1f:dd: + 89:77:9e:0f:2e:6c:95:04:ed:86:cb:b4:00:3f:84:02:4d:80: + 6a:2a:2d:78:0b:ae:6f:2b:a2:83:44:83:1f:cd:50:82:4c:24: + af:bd:f7:a5:b4:c8:5a:0f:f4:e7:47:5e:49:8e:37:96:fe:9a: + 88:05:3a:d9:c0:db:29:87:e6:19:96:47:a7:3a:a6:8c:8b:3c: + 77:fe:46:63:a7:53:da:21:d1:ac:7e:49:a2:4b:e6:c3:67:59: + 2f:b3:8a:0e:bb:2c:bd:a9:aa:42:7c:35:c1:d8:7f:d5:a7:31: + 3a:4e:63:43:39:af:08:b0:61:34:8c:d3:98:a9:43:34:f6:0f: + 87:29:3b:9d:c2:56:58:98:77:c3:f7:1b:ac:f6:9d:f8:3e:aa: + a7:54:45:f0:f5:f9:d5:31:65:fe:6b:58:9c:71:b3:1e:d7:52: + ea:32:17:fc:40:60:1d:c9:79:24:b2:f6:6c:fd:a8:66:0e:82: + dd:98:cb:da:c2:44:4f:2e:a0:7b:f2:f7:6b:2c:76:11:84:46: + 8a:78:a3:e3 + +National Retail Federation by DST +================================= +MD5 Fingerprint: AD:8E:0F:9E:01:6B:A0:C5:74:D5:0C:D3:68:65:4F:1E +PEM Data: +-----BEGIN CERTIFICATE----- +MIIEAjCCAuoCEQDQHkCKAAACfAAAAAMAAAABMA0GCSqGSIb3DQEBBQUAMIG+MQsw +CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp +dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjEjMCEGA1UE +CxMaTmF0aW9uYWwgUmV0YWlsIEZlZGVyYXRpb24xGTAXBgNVBAMTEERTVCAoTlJG +KSBSb290Q0ExITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05 +ODEyMTExNjE0MTZaFw0wODEyMDgxNjE0MTZaMIG+MQswCQYDVQQGEwJ1czENMAsG +A1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp +Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjEjMCEGA1UECxMaTmF0aW9uYWwgUmV0 +YWlsIEZlZGVyYXRpb24xGTAXBgNVBAMTEERTVCAoTlJGKSBSb290Q0ExITAfBgkq +hkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBANmsm3f6UNPM3LlArLlyagCHI/wPliHQJq/k4rVf+tOmfSEw +LswXgo+YdPxnpKbfiJeiQin1p9sRk/teIzDCqrwi50Eb5e0l3sg/295XRXhARoOy +1Ro93w9FbdVjAnXYL8Zuq5WRdDcNy00JXNHUWzra3Q7Ia5nY1TnM34VVxJJTAqPh +94DJcKPa3DPEf6JHCBw1lh+hAxwwg/TEzP+Yw7BGRKLAv63b0oH2TJgsp14k84bK +Y9W6ffCawErQG1ju7Klnz2kCbCLAYCws0cgg6sgt+92cu8tRTNznVwQ7VJsRpTJ0 +7HQB85AVWy98LJNluWZntIGINeWekRh/gahByMsCAwEAATANBgkqhkiG9w0BAQUF +AAOCAQEAhF4LO+ygjRyb0DwdcWnkGn9kvoFlYcWMatd8AHTgemJV7SR84GHj8t0U +5hFugw7h6qmegK2aIL/gV37V0LWEYy3ZGOS9GzUsXq5hdqpnhTs44TGBHzF/5tf4 +W9K7Y3mGxIzF3gqu19H8AXT/trYNYoFnHLsm+CSA4Fxe2KSKOo99y/+So/18qTJp +B1hYYUKZUgOxOD3GcW9s8uh9BqrBfFPLGi2IT8mpp6xpb/ekH9h0gfVKv7FVt9N3 +OKdvwkrI4nOJ01dy4UMvcjz2H7f4BEpuwemUF+SXF/QOE4ZvjavoXy20/2zWorQf +7LmUaqoSTxrd9Xe1JYzyigrx/FJbWA== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + d0:1e:40:8a:00:00:02:7c:00:00:00:03:00:00:00:01 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=us, ST=Utah, L=Salt Lake City, O=Digital Signature Trust Co., OU=National Retail Federation, CN=DST (NRF) RootCA/Email=ca@digsigtrust.com + Validity + Not Before: Dec 11 16:14:16 1998 GMT + Not After : Dec 8 16:14:16 2008 GMT + Subject: C=us, ST=Utah, L=Salt Lake City, O=Digital Signature Trust Co., OU=National Retail Federation, CN=DST (NRF) RootCA/Email=ca@digsigtrust.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:d9:ac:9b:77:fa:50:d3:cc:dc:b9:40:ac:b9:72: + 6a:00:87:23:fc:0f:96:21:d0:26:af:e4:e2:b5:5f: + fa:d3:a6:7d:21:30:2e:cc:17:82:8f:98:74:fc:67: + a4:a6:df:88:97:a2:42:29:f5:a7:db:11:93:fb:5e: + 23:30:c2:aa:bc:22:e7:41:1b:e5:ed:25:de:c8:3f: + db:de:57:45:78:40:46:83:b2:d5:1a:3d:df:0f:45: + 6d:d5:63:02:75:d8:2f:c6:6e:ab:95:91:74:37:0d: + cb:4d:09:5c:d1:d4:5b:3a:da:dd:0e:c8:6b:99:d8: + d5:39:cc:df:85:55:c4:92:53:02:a3:e1:f7:80:c9: + 70:a3:da:dc:33:c4:7f:a2:47:08:1c:35:96:1f:a1: + 03:1c:30:83:f4:c4:cc:ff:98:c3:b0:46:44:a2:c0: + bf:ad:db:d2:81:f6:4c:98:2c:a7:5e:24:f3:86:ca: + 63:d5:ba:7d:f0:9a:c0:4a:d0:1b:58:ee:ec:a9:67: + cf:69:02:6c:22:c0:60:2c:2c:d1:c8:20:ea:c8:2d: + fb:dd:9c:bb:cb:51:4c:dc:e7:57:04:3b:54:9b:11: + a5:32:74:ec:74:01:f3:90:15:5b:2f:7c:2c:93:65: + b9:66:67:b4:81:88:35:e5:9e:91:18:7f:81:a8:41: + c8:cb + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 84:5e:0b:3b:ec:a0:8d:1c:9b:d0:3c:1d:71:69:e4:1a:7f:64: + be:81:65:61:c5:8c:6a:d7:7c:00:74:e0:7a:62:55:ed:24:7c: + e0:61:e3:f2:dd:14:e6:11:6e:83:0e:e1:ea:a9:9e:80:ad:9a: + 20:bf:e0:57:7e:d5:d0:b5:84:63:2d:d9:18:e4:bd:1b:35:2c: + 5e:ae:61:76:aa:67:85:3b:38:e1:31:81:1f:31:7f:e6:d7:f8: + 5b:d2:bb:63:79:86:c4:8c:c5:de:0a:ae:d7:d1:fc:01:74:ff: + b6:b6:0d:62:81:67:1c:bb:26:f8:24:80:e0:5c:5e:d8:a4:8a: + 3a:8f:7d:cb:ff:92:a3:fd:7c:a9:32:69:07:58:58:61:42:99: + 52:03:b1:38:3d:c6:71:6f:6c:f2:e8:7d:06:aa:c1:7c:53:cb: + 1a:2d:88:4f:c9:a9:a7:ac:69:6f:f7:a4:1f:d8:74:81:f5:4a: + bf:b1:55:b7:d3:77:38:a7:6f:c2:4a:c8:e2:73:89:d3:57:72: + e1:43:2f:72:3c:f6:1f:b7:f8:04:4a:6e:c1:e9:94:17:e4:97: + 17:f4:0e:13:86:6f:8d:ab:e8:5f:2d:b4:ff:6c:d6:a2:b4:1f: + ec:b9:94:6a:aa:12:4f:1a:dd:f5:77:b5:25:8c:f2:8a:0a:f1: + fc:52:5b:58 + +TC TrustCenter, Germany, Class 1 CA +=================================== +MD5 Fingerprint: 64:3F:F8:3E:52:14:4A:59:BA:93:56:04:0B:23:02:D1 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIENTCCA56gAwIBAgIBAjANBgkqhkiG9w0BAQQFADCBvDELMAkGA1UEBhMCREUx +EDAOBgNVBAgTB0hhbWJ1cmcxEDAOBgNVBAcTB0hhbWJ1cmcxOjA4BgNVBAoTMVRD +IFRydXN0Q2VudGVyIGZvciBTZWN1cml0eSBpbiBEYXRhIE5ldHdvcmtzIEdtYkgx +IjAgBgNVBAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDEgQ0ExKTAnBgkqhkiG9w0B +CQEWGmNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlMB4XDTk4MDMwOTEzNTYzM1oX +DTA1MTIzMTEzNTYzM1owgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQIEwdIYW1idXJn +MRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig +U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVz +dENlbnRlciBDbGFzcyAxIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0 +cnVzdGNlbnRlci5kZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAsCnrtHaz +rte2W7Re573jsZxJBFdboavZfxMb/bphq9jncd8tAJRdUUh9I+91YoSQPAofWRF0 +L46Apf0wAj0pUs1yGkkhnLzLUo5IoWOWyBCFMGlXdEXAWobG1T3gaFd9MWokjUWX +PjF+aGYybiRt7DI2yUHK8DFEyKNhyhugNh8CAwEAAaOCAUMwggE/MEAGCWCGSAGG ++EIBAwQzFjFodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL2NoZWNr +LXJldi5jZ2k/MEAGCWCGSAGG+EIBBAQzFjFodHRwczovL3d3dy50cnVzdGNlbnRl +ci5kZS9jZ2ktYmluL2NoZWNrLXJldi5jZ2k/MDwGCWCGSAGG+EIBBwQvFi1odHRw +czovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL1JlbmV3LmNnaT8wPgYJYIZI +AYb4QgEIBDEWL2h0dHA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvZ3VpZGVsaW5lcy9p +bmRleC5odG1sMCgGCWCGSAGG+EIBDQQbFhlUQyBUcnVzdENlbnRlciBDbGFzcyAx +IENBMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQQFAAOBgQAFQlImpAwn +AUSsXCUowkRCVAi5HcU+bFlmxLNOUKf4+JZ1oZZ16BY4oM1dbvp5pxt7HR7DALlm +vlrWYg/n8nu470zgwD9Zrjm3hAmeq/GpLmtp4q3M8up4CQUgOEJxGH7Hspfm1QIF +BlajX/GqwsRP/vfvFg+d7KqFzz0pJPEEzQ== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=DE, ST=Hamburg, L=Hamburg, O=TC TrustCenter for Security in Data Networks GmbH, OU=TC TrustCenter Class 1 CA/Email=certificate@trustcenter.de + Validity + Not Before: Mar 9 13:56:33 1998 GMT + Not After : Dec 31 13:56:33 2005 GMT + Subject: C=DE, ST=Hamburg, L=Hamburg, O=TC TrustCenter for Security in Data Networks GmbH, OU=TC TrustCenter Class 1 CA/Email=certificate@trustcenter.de + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:b0:29:eb:b4:76:b3:ae:d7:b6:5b:b4:5e:e7:bd: + e3:b1:9c:49:04:57:5b:a1:ab:d9:7f:13:1b:fd:ba: + 61:ab:d8:e7:71:df:2d:00:94:5d:51:48:7d:23:ef: + 75:62:84:90:3c:0a:1f:59:11:74:2f:8e:80:a5:fd: + 30:02:3d:29:52:cd:72:1a:49:21:9c:bc:cb:52:8e: + 48:a1:63:96:c8:10:85:30:69:57:74:45:c0:5a:86: + c6:d5:3d:e0:68:57:7d:31:6a:24:8d:45:97:3e:31: + 7e:68:66:32:6e:24:6d:ec:32:36:c9:41:ca:f0:31: + 44:c8:a3:61:ca:1b:a0:36:1f + Exponent: 65537 (0x10001) + X509v3 extensions: + Netscape Revocation Url: + https://www.trustcenter.de/cgi-bin/check-rev.cgi? + Netscape CA Revocation Url: + https://www.trustcenter.de/cgi-bin/check-rev.cgi? + Netscape Renewal Url: + https://www.trustcenter.de/cgi-bin/Renew.cgi? + Netscape CA Policy Url: + http://www.trustcenter.de/guidelines/index.html + Netscape Comment: + TC TrustCenter Class 1 CA + Netscape Cert Type: + SSL CA, S/MIME CA, Object Signing CA + Signature Algorithm: md5WithRSAEncryption + 05:42:52:26:a4:0c:27:01:44:ac:5c:25:28:c2:44:42:54:08: + b9:1d:c5:3e:6c:59:66:c4:b3:4e:50:a7:f8:f8:96:75:a1:96: + 75:e8:16:38:a0:cd:5d:6e:fa:79:a7:1b:7b:1d:1e:c3:00:b9: + 66:be:5a:d6:62:0f:e7:f2:7b:b8:ef:4c:e0:c0:3f:59:ae:39: + b7:84:09:9e:ab:f1:a9:2e:6b:69:e2:ad:cc:f2:ea:78:09:05: + 20:38:42:71:18:7e:c7:b2:97:e6:d5:02:05:06:56:a3:5f:f1: + aa:c2:c4:4f:fe:f7:ef:16:0f:9d:ec:aa:85:cf:3d:29:24:f1: + 04:cd + +TC TrustCenter, Germany, Class 2 CA +=================================== +MD5 Fingerprint: E1:E9:96:53:77:E1:F0:38:A0:02:AB:94:C6:95:7B:FC +PEM Data: +-----BEGIN CERTIFICATE----- +MIIENTCCA56gAwIBAgIBAzANBgkqhkiG9w0BAQQFADCBvDELMAkGA1UEBhMCREUx +EDAOBgNVBAgTB0hhbWJ1cmcxEDAOBgNVBAcTB0hhbWJ1cmcxOjA4BgNVBAoTMVRD +IFRydXN0Q2VudGVyIGZvciBTZWN1cml0eSBpbiBEYXRhIE5ldHdvcmtzIEdtYkgx +IjAgBgNVBAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExKTAnBgkqhkiG9w0B +CQEWGmNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlMB4XDTk4MDMwOTEzNTc0NFoX +DTA1MTIzMTEzNTc0NFowgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQIEwdIYW1idXJn +MRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig +U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVz +dENlbnRlciBDbGFzcyAyIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0 +cnVzdGNlbnRlci5kZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA2jjo7TIA +KXGDAQ2/jAHc2satOaSpii/Vi1xoX1DGYvVmvcqRIuyqHVHXPbNRsoNOXctJsPBM +VeVrLceFCzAckk6C1MoC7fdvvtzg4xS4BVPymvRWi1qehZPRtIJWrk27qEtXFrz+ ++Fie+CmNsHvNeMlPrItnDPGc+/xXm1dcTw0CAwEAAaOCAUMwggE/MEAGCWCGSAGG ++EIBAwQzFjFodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL2NoZWNr +LXJldi5jZ2k/MEAGCWCGSAGG+EIBBAQzFjFodHRwczovL3d3dy50cnVzdGNlbnRl +ci5kZS9jZ2ktYmluL2NoZWNrLXJldi5jZ2k/MDwGCWCGSAGG+EIBBwQvFi1odHRw +czovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL1JlbmV3LmNnaT8wPgYJYIZI +AYb4QgEIBDEWL2h0dHA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvZ3VpZGVsaW5lcy9p +bmRleC5odG1sMCgGCWCGSAGG+EIBDQQbFhlUQyBUcnVzdENlbnRlciBDbGFzcyAy +IENBMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQQFAAOBgQCJG/Tv6Tji +bAz2zW9JzinM+6YP+Y0+lUbW/EcyibLIBmF60ucNEwKUC9mLVkf0u+fFX3v0Y0yu +fDTqDaKpsyyF8+P+J1QQkrCPksGYQhhwSNtOLOsNJGjk0fe+Cakph7vo2tw+o4hC +MfXR43+u2I4AWnSYsE/G/yN7XHMAeMnbTg== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 3 (0x3) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=DE, ST=Hamburg, L=Hamburg, O=TC TrustCenter for Security in Data Networks GmbH, OU=TC TrustCenter Class 2 CA/Email=certificate@trustcenter.de + Validity + Not Before: Mar 9 13:57:44 1998 GMT + Not After : Dec 31 13:57:44 2005 GMT + Subject: C=DE, ST=Hamburg, L=Hamburg, O=TC TrustCenter for Security in Data Networks GmbH, OU=TC TrustCenter Class 2 CA/Email=certificate@trustcenter.de + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:da:38:e8:ed:32:00:29:71:83:01:0d:bf:8c:01: + dc:da:c6:ad:39:a4:a9:8a:2f:d5:8b:5c:68:5f:50: + c6:62:f5:66:bd:ca:91:22:ec:aa:1d:51:d7:3d:b3: + 51:b2:83:4e:5d:cb:49:b0:f0:4c:55:e5:6b:2d:c7: + 85:0b:30:1c:92:4e:82:d4:ca:02:ed:f7:6f:be:dc: + e0:e3:14:b8:05:53:f2:9a:f4:56:8b:5a:9e:85:93: + d1:b4:82:56:ae:4d:bb:a8:4b:57:16:bc:fe:f8:58: + 9e:f8:29:8d:b0:7b:cd:78:c9:4f:ac:8b:67:0c:f1: + 9c:fb:fc:57:9b:57:5c:4f:0d + Exponent: 65537 (0x10001) + X509v3 extensions: + Netscape Revocation Url: + https://www.trustcenter.de/cgi-bin/check-rev.cgi? + Netscape CA Revocation Url: + https://www.trustcenter.de/cgi-bin/check-rev.cgi? + Netscape Renewal Url: + https://www.trustcenter.de/cgi-bin/Renew.cgi? + Netscape CA Policy Url: + http://www.trustcenter.de/guidelines/index.html + Netscape Comment: + TC TrustCenter Class 2 CA + Netscape Cert Type: + SSL CA, S/MIME CA, Object Signing CA + Signature Algorithm: md5WithRSAEncryption + 89:1b:f4:ef:e9:38:e2:6c:0c:f6:cd:6f:49:ce:29:cc:fb:a6: + 0f:f9:8d:3e:95:46:d6:fc:47:32:89:b2:c8:06:61:7a:d2:e7: + 0d:13:02:94:0b:d9:8b:56:47:f4:bb:e7:c5:5f:7b:f4:63:4c: + ae:7c:34:ea:0d:a2:a9:b3:2c:85:f3:e3:fe:27:54:10:92:b0: + 8f:92:c1:98:42:18:70:48:db:4e:2c:eb:0d:24:68:e4:d1:f7: + be:09:a9:29:87:bb:e8:da:dc:3e:a3:88:42:31:f5:d1:e3:7f: + ae:d8:8e:00:5a:74:98:b0:4f:c6:ff:23:7b:5c:73:00:78:c9: + db:4e + +TC TrustCenter, Germany, Class 3 CA +=================================== +MD5 Fingerprint: 62:AB:B6:15:4A:B4:B0:16:77:FF:AE:CF:16:16:2B:8C +PEM Data: +-----BEGIN CERTIFICATE----- +MIIENTCCA56gAwIBAgIBBDANBgkqhkiG9w0BAQQFADCBvDELMAkGA1UEBhMCREUx +EDAOBgNVBAgTB0hhbWJ1cmcxEDAOBgNVBAcTB0hhbWJ1cmcxOjA4BgNVBAoTMVRD +IFRydXN0Q2VudGVyIGZvciBTZWN1cml0eSBpbiBEYXRhIE5ldHdvcmtzIEdtYkgx +IjAgBgNVBAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExKTAnBgkqhkiG9w0B +CQEWGmNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlMB4XDTk4MDMwOTEzNTg0OVoX +DTA1MTIzMTEzNTg0OVowgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQIEwdIYW1idXJn +MRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig +U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVz +dENlbnRlciBDbGFzcyAzIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0 +cnVzdGNlbnRlci5kZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAtrTBNQUu +DY3soEBqHA4nplCSa1AbB94u53bM4Nr8hKhejGNqK03ZTgJ2EcEL8o15ygC28bAO +1/ukFz2vq2l6lie/rzOhmipZqsS1NwjyEqUxtkP1MpZxKCirjSiG37vu4wx9MNbD +UquPXSeca8Cj5wVrV0lEs27qZM/SjnpQd3cCAwEAAaOCAUMwggE/MEAGCWCGSAGG ++EIBAwQzFjFodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL2NoZWNr +LXJldi5jZ2k/MEAGCWCGSAGG+EIBBAQzFjFodHRwczovL3d3dy50cnVzdGNlbnRl +ci5kZS9jZ2ktYmluL2NoZWNrLXJldi5jZ2k/MDwGCWCGSAGG+EIBBwQvFi1odHRw +czovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL1JlbmV3LmNnaT8wPgYJYIZI +AYb4QgEIBDEWL2h0dHA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvZ3VpZGVsaW5lcy9p +bmRleC5odG1sMCgGCWCGSAGG+EIBDQQbFhlUQyBUcnVzdENlbnRlciBDbGFzcyAz +IENBMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQQFAAOBgQCEhlBieaAn +4SW6CbE0DxMJ7S3Ko+aV+TCszRelzj2Xnex8jyZ/wGHKIveR3Tw2WZqbdfe85Mjt +7AK2IqfzLPHIknhttu7FKOyAIE+5awjnL6eGHn2xCJ9UuQA3PKDYGsiWHPQyFJw5 +lbfu8ENJwl7oy3lvU7/7SYos2EvZVfIScA== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 4 (0x4) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=DE, ST=Hamburg, L=Hamburg, O=TC TrustCenter for Security in Data Networks GmbH, OU=TC TrustCenter Class 3 CA/Email=certificate@trustcenter.de + Validity + Not Before: Mar 9 13:58:49 1998 GMT + Not After : Dec 31 13:58:49 2005 GMT + Subject: C=DE, ST=Hamburg, L=Hamburg, O=TC TrustCenter for Security in Data Networks GmbH, OU=TC TrustCenter Class 3 CA/Email=certificate@trustcenter.de + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:b6:b4:c1:35:05:2e:0d:8d:ec:a0:40:6a:1c:0e: + 27:a6:50:92:6b:50:1b:07:de:2e:e7:76:cc:e0:da: + fc:84:a8:5e:8c:63:6a:2b:4d:d9:4e:02:76:11:c1: + 0b:f2:8d:79:ca:00:b6:f1:b0:0e:d7:fb:a4:17:3d: + af:ab:69:7a:96:27:bf:af:33:a1:9a:2a:59:aa:c4: + b5:37:08:f2:12:a5:31:b6:43:f5:32:96:71:28:28: + ab:8d:28:86:df:bb:ee:e3:0c:7d:30:d6:c3:52:ab: + 8f:5d:27:9c:6b:c0:a3:e7:05:6b:57:49:44:b3:6e: + ea:64:cf:d2:8e:7a:50:77:77 + Exponent: 65537 (0x10001) + X509v3 extensions: + Netscape Revocation Url: + https://www.trustcenter.de/cgi-bin/check-rev.cgi? + Netscape CA Revocation Url: + https://www.trustcenter.de/cgi-bin/check-rev.cgi? + Netscape Renewal Url: + https://www.trustcenter.de/cgi-bin/Renew.cgi? + Netscape CA Policy Url: + http://www.trustcenter.de/guidelines/index.html + Netscape Comment: + TC TrustCenter Class 3 CA + Netscape Cert Type: + SSL CA, S/MIME CA, Object Signing CA + Signature Algorithm: md5WithRSAEncryption + 84:86:50:62:79:a0:27:e1:25:ba:09:b1:34:0f:13:09:ed:2d: + ca:a3:e6:95:f9:30:ac:cd:17:a5:ce:3d:97:9d:ec:7c:8f:26: + 7f:c0:61:ca:22:f7:91:dd:3c:36:59:9a:9b:75:f7:bc:e4:c8: + ed:ec:02:b6:22:a7:f3:2c:f1:c8:92:78:6d:b6:ee:c5:28:ec: + 80:20:4f:b9:6b:08:e7:2f:a7:86:1e:7d:b1:08:9f:54:b9:00: + 37:3c:a0:d8:1a:c8:96:1c:f4:32:14:9c:39:95:b7:ee:f0:43: + 49:c2:5e:e8:cb:79:6f:53:bf:fb:49:8a:2c:d8:4b:d9:55:f2: + 12:70 + +TC TrustCenter, Germany, Class 4 CA +=================================== +MD5 Fingerprint: BF:AF:EC:C4:DA:F9:30:F9:CA:35:CA:25:E4:3F:8D:89 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIENTCCA56gAwIBAgIBBTANBgkqhkiG9w0BAQQFADCBvDELMAkGA1UEBhMCREUx +EDAOBgNVBAgTB0hhbWJ1cmcxEDAOBgNVBAcTB0hhbWJ1cmcxOjA4BgNVBAoTMVRD +IFRydXN0Q2VudGVyIGZvciBTZWN1cml0eSBpbiBEYXRhIE5ldHdvcmtzIEdtYkgx +IjAgBgNVBAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDQgQ0ExKTAnBgkqhkiG9w0B +CQEWGmNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlMB4XDTk4MDMwOTE0MDAyMFoX +DTA1MTIzMTE0MDAyMFowgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQIEwdIYW1idXJn +MRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig +U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVz +dENlbnRlciBDbGFzcyA0IENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0 +cnVzdGNlbnRlci5kZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvy9j1jZ7 +sg3TVfVkbOYlXca0yBS6JTiD61ZipVWpZaP0I5nCS7nQzVRnpqOgo6kzK3bkva13 +su1cEnTDxbYPUppyk0OQYmYVD0Wl3eDduG9AblfBeXKjYKq6dh0SiVNa/AK+4QkT +xUov3D2LGa3XiyRF+0z0zVw1HSlMUfPybFUCAwEAAaOCAUMwggE/MEAGCWCGSAGG ++EIBAwQzFjFodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL2NoZWNr +LXJldi5jZ2k/MEAGCWCGSAGG+EIBBAQzFjFodHRwczovL3d3dy50cnVzdGNlbnRl +ci5kZS9jZ2ktYmluL2NoZWNrLXJldi5jZ2k/MDwGCWCGSAGG+EIBBwQvFi1odHRw +czovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL1JlbmV3LmNnaT8wPgYJYIZI +AYb4QgEIBDEWL2h0dHA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvZ3VpZGVsaW5lcy9p +bmRleC5odG1sMCgGCWCGSAGG+EIBDQQbFhlUQyBUcnVzdENlbnRlciBDbGFzcyA0 +IENBMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQQFAAOBgQCUaBQbJZ4p +mbGyI9JEs5Wf0Z5VBN3jL4IzVZZ3GZ0rnmUc+orjx48l/LEeVUYPj/9PNy+kdlmm +ZOvVFnC93ZUzDKQNJOtkULRDEfJDvg1xmCLsAa/s98dcccN1kVgZ6N2g9LTxvBBK +85O0Bkm7H2bSvXRH4Zr569erbR+64R0s2g== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 5 (0x5) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=DE, ST=Hamburg, L=Hamburg, O=TC TrustCenter for Security in Data Networks GmbH, OU=TC TrustCenter Class 4 CA/Email=certificate@trustcenter.de + Validity + Not Before: Mar 9 14:00:20 1998 GMT + Not After : Dec 31 14:00:20 2005 GMT + Subject: C=DE, ST=Hamburg, L=Hamburg, O=TC TrustCenter for Security in Data Networks GmbH, OU=TC TrustCenter Class 4 CA/Email=certificate@trustcenter.de + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:bf:2f:63:d6:36:7b:b2:0d:d3:55:f5:64:6c:e6: + 25:5d:c6:b4:c8:14:ba:25:38:83:eb:56:62:a5:55: + a9:65:a3:f4:23:99:c2:4b:b9:d0:cd:54:67:a6:a3: + a0:a3:a9:33:2b:76:e4:bd:ad:77:b2:ed:5c:12:74: + c3:c5:b6:0f:52:9a:72:93:43:90:62:66:15:0f:45: + a5:dd:e0:dd:b8:6f:40:6e:57:c1:79:72:a3:60:aa: + ba:76:1d:12:89:53:5a:fc:02:be:e1:09:13:c5:4a: + 2f:dc:3d:8b:19:ad:d7:8b:24:45:fb:4c:f4:cd:5c: + 35:1d:29:4c:51:f3:f2:6c:55 + Exponent: 65537 (0x10001) + X509v3 extensions: + Netscape Revocation Url: + https://www.trustcenter.de/cgi-bin/check-rev.cgi? + Netscape CA Revocation Url: + https://www.trustcenter.de/cgi-bin/check-rev.cgi? + Netscape Renewal Url: + https://www.trustcenter.de/cgi-bin/Renew.cgi? + Netscape CA Policy Url: + http://www.trustcenter.de/guidelines/index.html + Netscape Comment: + TC TrustCenter Class 4 CA + Netscape Cert Type: + SSL CA, S/MIME CA, Object Signing CA + Signature Algorithm: md5WithRSAEncryption + 94:68:14:1b:25:9e:29:99:b1:b2:23:d2:44:b3:95:9f:d1:9e: + 55:04:dd:e3:2f:82:33:55:96:77:19:9d:2b:9e:65:1c:fa:8a: + e3:c7:8f:25:fc:b1:1e:55:46:0f:8f:ff:4f:37:2f:a4:76:59: + a6:64:eb:d5:16:70:bd:dd:95:33:0c:a4:0d:24:eb:64:50:b4: + 43:11:f2:43:be:0d:71:98:22:ec:01:af:ec:f7:c7:5c:71:c3: + 75:91:58:19:e8:dd:a0:f4:b4:f1:bc:10:4a:f3:93:b4:06:49: + bb:1f:66:d2:bd:74:47:e1:9a:f9:eb:d7:ab:6d:1f:ba:e1:1d: + 2c:da + +Thawte Personal Basic CA +======================== +MD5 Fingerprint: E6:0B:D2:C9:CA:2D:88:DB:1A:71:0E:4B:78:EB:02:41 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj +IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X +DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw +EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE +ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy +dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD +QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53 +dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK +wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7 +G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF +AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 +c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P +9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 0 (0x0) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting, OU=Certification Services Division, CN=Thawte Personal Basic CA/Email=personal-basic@thawte.com + Validity + Not Before: Jan 1 00:00:00 1996 GMT + Not After : Dec 31 23:59:59 2020 GMT + Subject: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting, OU=Certification Services Division, CN=Thawte Personal Basic CA/Email=personal-basic@thawte.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:bc:bc:93:53:6d:c0:50:4f:82:15:e6:48:94:35: + a6:5a:be:6f:42:fa:0f:47:ee:77:75:72:dd:8d:49: + 9b:96:57:a0:78:d4:ca:3f:51:b3:69:0b:91:76:17: + 22:07:97:6a:c4:51:93:4b:e0:8d:ef:37:95:a1:0c: + 4d:da:34:90:1d:17:89:97:e0:35:38:57:4a:c0:f4: + 08:70:e9:3c:44:7b:50:7e:61:9a:90:e3:23:d3:88: + 11:46:27:f5:0b:07:0e:bb:dd:d1:7f:20:0a:88:b9: + 56:0b:2e:1c:80:da:f1:e3:9e:29:ef:14:bd:0a:44: + fb:1b:5b:18:d1:bf:23:93:21 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: md5WithRSAEncryption + 2d:e2:99:6b:b0:3d:7a:89:d7:59:a2:94:01:1f:2b:dd:12:4b: + 53:c2:ad:7f:aa:a7:00:5c:91:40:57:25:4a:38:aa:84:70:b9: + d9:80:0f:a5:7b:5c:fb:73:c6:bd:d7:8a:61:5c:03:e3:2d:27: + a8:17:e0:84:85:42:dc:5e:9b:c6:b7:b2:6d:bb:74:af:e4:3f: + cb:a7:b7:b0:e0:5d:be:78:83:25:94:d2:db:81:0f:79:07:6d: + 4f:f4:39:15:5a:52:01:7b:de:32:d6:4d:38:f6:12:5c:06:50: + df:05:5b:bd:14:4b:a1:df:29:ba:3b:41:8d:f7:63:56:a1:df: + 22:b1 + +Thawte Personal Freemail CA +=========================== +MD5 Fingerprint: 1E:74:C3:86:3C:0C:35:C5:3E:C2:7F:EF:3C:AA:3C:D9 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt +YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu +Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa +MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG +cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh +d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY +DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E +rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq +uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN +BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP +MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa +/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei +gQ== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 0 (0x0) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting, OU=Certification Services Division, CN=Thawte Personal Freemail CA/Email=personal-freemail@thawte.com + Validity + Not Before: Jan 1 00:00:00 1996 GMT + Not After : Dec 31 23:59:59 2020 GMT + Subject: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting, OU=Certification Services Division, CN=Thawte Personal Freemail CA/Email=personal-freemail@thawte.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:d4:69:d7:d4:b0:94:64:5b:71:e9:47:d8:0c:51: + b6:ea:72:91:b0:84:5e:7d:2d:0d:8f:7b:12:df:85: + 25:75:28:74:3a:42:2c:63:27:9f:95:7b:4b:ef:7e: + 19:87:1d:86:ea:a3:dd:b9:ce:96:64:1a:c2:14:6e: + 44:ac:7c:e6:8f:e8:4d:0f:71:1f:40:38:a6:00:a3: + 87:78:f6:f9:94:86:5e:ad:ea:c0:5e:76:eb:d9:14: + a3:5d:6e:7a:7c:0c:a5:4b:55:7f:06:19:29:7f:9e: + 9a:26:d5:6a:bb:38:24:08:6a:98:c7:b1:da:a3:98: + 91:fd:79:db:e5:5a:c4:1c:b9 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: md5WithRSAEncryption + c7:ec:92:7e:4e:f8:f5:96:a5:67:62:2a:a4:f0:4d:11:60:d0: + 6f:8d:60:58:61:ac:26:bb:52:35:5c:08:cf:30:fb:a8:4a:96: + 8a:1f:62:42:23:8c:17:0f:f4:ba:64:9c:17:ac:47:29:df:9d: + 98:5e:d2:6c:60:71:5c:a2:ac:dc:79:e3:e7:6e:00:47:1f:b5: + 0d:28:e8:02:9d:e4:9a:fd:13:f4:a6:d9:7c:b1:f8:dc:5f:23: + 26:09:91:80:73:d0:14:1b:de:43:a9:83:25:f2:e6:9c:2f:15: + ca:fe:a6:ab:8a:07:75:8b:0c:dd:51:84:6b:e4:f8:d1:ce:77: + a2:81 + +Thawte Personal Premium CA +========================== +MD5 Fingerprint: 3A:B2:DE:22:9A:20:93:49:F9:ED:C8:D2:8A:E7:68:0D +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p +dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv +bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa +QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY +BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u +IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl +bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu +Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs +Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI +Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD +ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH +b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh +KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 0 (0x0) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting, OU=Certification Services Division, CN=Thawte Personal Premium CA/Email=personal-premium@thawte.com + Validity + Not Before: Jan 1 00:00:00 1996 GMT + Not After : Dec 31 23:59:59 2020 GMT + Subject: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting, OU=Certification Services Division, CN=Thawte Personal Premium CA/Email=personal-premium@thawte.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:c9:66:d9:f8:07:44:cf:b9:8c:2e:f0:a1:ef:13: + 45:6c:05:df:de:27:16:51:36:41:11:6c:6c:3b:ed: + fe:10:7d:12:9e:e5:9b:42:9a:fe:60:31:c3:66:b7: + 73:3a:48:ae:4e:d0:32:37:94:88:b5:0d:b6:d9:f3: + f2:44:d9:d5:88:12:dd:76:4d:f2:1a:fc:6f:23:1e: + 7a:f1:d8:98:45:4e:07:10:ef:16:42:d0:43:75:6d: + 4a:de:e2:aa:c9:31:ff:1f:00:70:7c:66:cf:10:25: + 08:ba:fa:ee:00:e9:46:03:66:27:11:15:3b:aa:5b: + f2:98:dd:36:42:b2:da:88:75 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: md5WithRSAEncryption + 69:36:89:f7:34:2a:33:72:2f:6d:3b:d4:22:b2:b8:6f:9a:c5: + 36:66:0e:1b:3c:a1:b1:75:5a:e6:fd:35:d3:f8:a8:f2:07:6f: + 85:67:8e:de:2b:b9:e2:17:b0:3a:a0:f0:0e:a2:00:9a:df:f3: + 14:15:6e:bb:c8:85:5a:98:80:f9:ff:be:74:1d:3d:f3:fe:30: + 25:d1:37:34:67:fa:a5:71:79:30:61:29:72:c0:e0:2c:4c:fb: + 56:e4:3a:a8:6f:e5:32:59:52:db:75:28:50:59:0c:f8:0b:19: + e4:ac:d9:af:96:8d:2f:50:db:07:c3:ea:1f:ab:33:e0:f5:2b: + 31:89 + +Thawte Premium Server CA +======================== +MD5 Fingerprint: 06:9F:69:79:16:66:90:02:1B:8C:8C:A2:C3:07:6F:3A +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Premium Server CA/Email=premium-server@thawte.com + Validity + Not Before: Aug 1 00:00:00 1996 GMT + Not After : Dec 31 23:59:59 2020 GMT + Subject: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Premium Server CA/Email=premium-server@thawte.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:d2:36:36:6a:8b:d7:c2:5b:9e:da:81:41:62:8f: + 38:ee:49:04:55:d6:d0:ef:1c:1b:95:16:47:ef:18: + 48:35:3a:52:f4:2b:6a:06:8f:3b:2f:ea:56:e3:af: + 86:8d:9e:17:f7:9e:b4:65:75:02:4d:ef:cb:09:a2: + 21:51:d8:9b:d0:67:d0:ba:0d:92:06:14:73:d4:93: + cb:97:2a:00:9c:5c:4e:0c:bc:fa:15:52:fc:f2:44: + 6e:da:11:4a:6e:08:9f:2f:2d:e3:f9:aa:3a:86:73: + b6:46:53:58:c8:89:05:bd:83:11:b8:73:3f:aa:07: + 8d:f4:42:4d:e7:40:9d:1c:37 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: md5WithRSAEncryption + 26:48:2c:16:c2:58:fa:e8:16:74:0c:aa:aa:5f:54:3f:f2:d7: + c9:78:60:5e:5e:6e:37:63:22:77:36:7e:b2:17:c4:34:b9:f5: + 08:85:fc:c9:01:38:ff:4d:be:f2:16:42:43:e7:bb:5a:46:fb: + c1:c6:11:1f:f1:4a:b0:28:46:c9:c3:c4:42:7d:bc:fa:ab:59: + 6e:d5:b7:51:88:11:e3:a4:85:19:6b:82:4c:a4:0c:12:ad:e9: + a4:ae:3f:f1:c3:49:65:9a:8c:c5:c8:3e:25:b7:94:99:bb:92: + 32:71:07:f0:86:5e:ed:50:27:a6:0d:a6:23:f9:bb:cb:a6:07: + 14:42 + +Thawte Server CA +================ +MD5 Fingerprint: C5:70:C4:A2:ED:53:78:0C:C8:10:53:81:64:CB:D0:1D +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Server CA/Email=server-certs@thawte.com + Validity + Not Before: Aug 1 00:00:00 1996 GMT + Not After : Dec 31 23:59:59 2020 GMT + Subject: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Server CA/Email=server-certs@thawte.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:d3:a4:50:6e:c8:ff:56:6b:e6:cf:5d:b6:ea:0c: + 68:75:47:a2:aa:c2:da:84:25:fc:a8:f4:47:51:da: + 85:b5:20:74:94:86:1e:0f:75:c9:e9:08:61:f5:06: + 6d:30:6e:15:19:02:e9:52:c0:62:db:4d:99:9e:e2: + 6a:0c:44:38:cd:fe:be:e3:64:09:70:c5:fe:b1:6b: + 29:b6:2f:49:c8:3b:d4:27:04:25:10:97:2f:e7:90: + 6d:c0:28:42:99:d7:4c:43:de:c3:f5:21:6d:54:9f: + 5d:c3:58:e1:c0:e4:d9:5b:b0:b8:dc:b4:7b:df:36: + 3a:c2:b5:66:22:12:d6:87:0d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + Signature Algorithm: md5WithRSAEncryption + 07:fa:4c:69:5c:fb:95:cc:46:ee:85:83:4d:21:30:8e:ca:d9: + a8:6f:49:1a:e6:da:51:e3:60:70:6c:84:61:11:a1:1a:c8:48: + 3e:59:43:7d:4f:95:3d:a1:8b:b7:0b:62:98:7a:75:8a:dd:88: + 4e:4e:9e:40:db:a8:cc:32:74:b9:6f:0d:c6:e3:b3:44:0b:d9: + 8a:6f:9a:29:9b:99:18:28:3b:d1:e3:40:28:9a:5a:3c:d5:b5: + e7:20:1b:8b:ca:a4:ab:8d:e9:51:d9:e2:4c:2c:59:a9:da:b9: + b2:75:1b:f6:42:f2:ef:c7:f2:18:f9:89:bc:a3:ff:8a:23:2e: + 70:47 + +Thawte Universal CA Root +======================== +MD5 Fingerprint: 17:AF:71:16:52:7B:73:65:22:05:29:28:84:71:9D:13 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIRIjCCCQoCAQAwDQYJKoZIhvcNAQEFBQAwVzEPMA0GA1UEChMGVGhhd3RlMSEw +HwYDVQQLExhUaGF3dGUgVW5pdmVyc2FsIENBIFJvb3QxITAfBgNVBAMTGFRoYXd0 +ZSBVbml2ZXJzYWwgQ0EgUm9vdDAeFw05OTEyMDUxMzU2MDVaFw0zNzA0MDMxMzU2 +MDVaMFcxDzANBgNVBAoTBlRoYXd0ZTEhMB8GA1UECxMYVGhhd3RlIFVuaXZlcnNh +bCBDQSBSb290MSEwHwYDVQQDExhUaGF3dGUgVW5pdmVyc2FsIENBIFJvb3Qwgggi +MA0GCSqGSIb3DQEBAQUAA4IIDwAwgggKAoIIAQDiiQVtw3+tpok6/7vHzZ03seHS +IR6bYSoV53tXT1U80Lv52T0+przstK1TmhYC6wty/Yryj0QFxevT5b22RDnm+0e/ +ap4KlRjiaOLWltYhrYj99Rf109pCpZDtKZWWdTrah6HU9dOH3gVipuNmdJLPpby7 +32j/cXVWQVk16zNaZlHy0qMKwYzOc1wRby2MlYyRsf3P5a1WlcyFkoOQVUHJwnft ++aN0QgpoCPPQ0WX9Zyw0/yR/53nIBzslV92kDJg9vuDMGWXb8lSir0LUneKuhCMl +CTMStWoedsSL2UkAbF66H/Ib2mfKJ6qjRCMbg4LO8qsz7VSk3MmrWWXROA7BPhtn +j9Z1AeBVIt12d+yO3fTPeSJtuVcD9ZkIpzw+NPvEF64jWM0k8yPKagIolAGBNLRs +a66LGsOj0gk8FlT1Nl8k459KoeJkxhbDpoF6JDZHjsFeDvv5FXgE1g5Z2Z1YZmLS +lCkyMsh4uWb2tVbhbMYUS5ZSWZECJGpVR9c/tiMaYHeXLuJAr54EV56tEcXJQ3Dv +SLRerBxpLi6C1VuLvoK+GRRe5w0ix1Eb/x6b8TCPcTEGszQnj196ZoJPii0Tq0LP +IVael45mNg+Wm+Ur9AKpKmqMLMTDuHAsLSkeP1B3Hm0qVORVCpE4ocW1ZqJ2Wu4P +v7Rn4ShuD+E2oYLRv9R34cRnMpN4yOdUU/4jeeZozCaQ9hBjXSpvkS2kczJRIfK7 +Fd+qJAhIBt6hnia/uoO/fKTIoIy90v+8hGknEyQYxEUYIyZeGBTKLoiHYqNT5iG3 +uIV7moW7FSZy+Ln3anQPST+SvqkFt5knv78JF0uZTK0REHzfdDH2jyZfqoiuOFfI +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 +yJTuQFv5QgLC/7DYLOsof17JJgGZpw== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: 0 (0x0) + Signature Algorithm: sha1WithRSAEncryption + Issuer: O=Thawte, OU=Thawte Universal CA Root, CN=Thawte Universal CA Root + Validity + Not Before: Dec 5 13:56:05 1999 GMT + Not After : Apr 3 13:56:05 2037 GMT + Subject: O=Thawte, OU=Thawte Universal CA Root, CN=Thawte Universal CA Root + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (16384 bit) + Modulus (16384 bit): + 00:e2:89:05:6d:c3:7f:ad:a6:89:3a:ff:bb:c7:cd: + 9d:37:b1:e1:d2:21:1e:9b:61:2a:15:e7:7b:57:4f: + 55:3c:d0:bb:f9:d9:3d:3e:a6:bc:ec:b4:ad:53:9a: + 16:02:eb:0b:72:fd:8a:f2:8f:44:05:c5:eb:d3:e5: + bd:b6:44:39:e6:fb:47:bf:6a:9e:0a:95:18:e2:68: + e2:d6:96:d6:21:ad:88:fd:f5:17:f5:d3:da:42:a5: + 90:ed:29:95:96:75:3a:da:87:a1:d4:f5:d3:87:de: + 05:62:a6:e3:66:74:92:cf:a5:bc:bb:df:68:ff:71: + 75:56:41:59:35:eb:33:5a:66:51:f2:d2:a3:0a:c1: + 8c:ce:73:5c:11:6f:2d:8c:95:8c:91:b1:fd:cf:e5: + ad:56:95:cc:85:92:83:90:55:41:c9:c2:77:ed:f9: + a3:74:42:0a:68:08:f3:d0:d1:65:fd:67:2c:34:ff: + 24:7f:e7:79:c8:07:3b:25:57:dd:a4:0c:98:3d:be: + e0:cc:19:65:db:f2:54:a2:af:42:d4:9d:e2:ae:84: + 23:25:09:33:12:b5:6a:1e:76:c4:8b:d9:49:00:6c: + 5e:ba:1f:f2:1b:da:67:ca:27:aa:a3:44:23:1b:83: + 82:ce:f2:ab:33:ed:54:a4:dc:c9:ab:59:65:d1:38: + 0e:c1:3e:1b:67:8f:d6:75:01:e0:55:22:dd:76:77: + ec:8e:dd:f4:cf:79:22:6d:b9:57:03:f5:99:08:a7: + 3c:3e:34:fb:c4:17:ae:23:58:cd:24:f3:23:ca:6a: + 02:28:94:01:81:34:b4:6c:6b:ae:8b:1a:c3:a3:d2: + 09:3c:16:54:f5:36:5f:24:e3:9f:4a:a1:e2:64:c6: + 16:c3:a6:81:7a:24:36:47:8e:c1:5e:0e:fb:f9:15: + 78:04:d6:0e:59:d9:9d:58:66:62:d2:94:29:32:32: + c8:78:b9:66:f6:b5:56:e1:6c:c6:14:4b:96:52:59: + 91:02:24:6a:55:47:d7:3f:b6:23:1a:60:77:97:2e: + e2:40:af:9e:04:57:9e:ad:11:c5:c9:43:70:ef:48: + b4:5e:ac:1c:69:2e:2e:82:d5:5b:8b:be:82:be:19: + 14:5e:e7:0d:22:c7:51:1b:ff:1e:9b:f1:30:8f:71: + 31:06:b3:34:27:8f:5f:7a:66:82:4f:8a:2d:13:ab: + 42:cf:21:56:9e:97:8e:66:36:0f:96:9b:e5:2b:f4: + 02:a9:2a:6a:8c:2c:c4:c3:b8:70:2c:2d:29:1e:3f: + 50:77:1e:6d:2a:54:e4:55:0a:91:38:a1:c5:b5:66: + a2:76:5a:ee:0f:bf:b4:67:e1:28:6e:0f:e1:36:a1: + 82:d1:bf:d4:77:e1:c4:67:32:93:78:c8:e7:54:53: + fe:23:79:e6:68:cc:26:90:f6:10:63:5d:2a:6f:91: + 2d:a4:73:32:51:21:f2:bb:15:df:aa:24:08:48:06: + de:a1:9e:26:bf:ba:83:bf:7c:a4:c8:a0:8c:bd:d2: + ff:bc:84:69:27:13:24:18:c4:45:18:23:26:5e:18: + 14:ca:2e:88:87:62:a3:53:e6:21:b7:b8:85:7b:9a: + 85:bb:15:26:72:f8:b9:f7:6a:74:0f:49:3f:92:be: + a9:05:b7:99:27:bf:bf:09:17:4b:99:4c:ad:11:10: + 7c:df:74:31:f6:8f:26:5f:aa:88:ae:38:57:c8:55: + 2d:d3:fb:d8:1b:51:99:be:25:1b:3a:ba:c0:7d:1b: + ed:ce:d2:49:b9:cf:f3:c5:7d:89:90:81:d8:69:48: + 20:10:a3:f8:ef:92:51:18:32:8b:11:18:c0:3f:1b: + 85:56:ce:57:c9:f2:82:64:c6:df:02:09:2e:4a:11: + 2f:b1:27:6d:37:52:f0:f0:16:61:f1:67:8d:df:87: + 72:af:87:da:cf:fb:50:94:6e:d4:94:85:eb:8a:2c: + ea:21:f5:96:4a:44:d5:e0:ce:6a:74:44:4d:d0:05: + d3:87:15:ed:36:d0:a4:8b:66:55:70:93:ee:47:06: + c1:7e:2e:a5:18:79:67:f3:28:85:f1:70:f7:0e:83: + a4:7e:54:9e:5a:76:32:cb:65:1b:b8:cd:fb:c8:28: + 03:d2:54:91:d1:a7:c5:85:43:08:17:76:a5:e6:2f: + 67:08:d8:a1:a2:82:2d:0c:f8:c1:af:63:d4:50:77: + 6d:6b:46:4a:41:85:d5:90:5f:79:2d:c4:ec:d7:11: + 87:40:8a:e1:68:e2:64:f8:55:32:fb:6f:93:2c:da: + 77:d9:21:c1:17:e5:36:2c:4e:7e:90:7f:ac:94:2b: + 32:67:be:38:50:76:b8:ae:41:b9:d7:21:c5:09:4c: + 60:c8:a3:51:c4:34:9b:57:37:df:cb:c9:33:57:8b: + eb:fb:76:9f:19:4d:c5:6a:1f:2a:45:ae:2b:ed:2f: + 8d:a7:a5:00:cb:04:fa:25:62:2e:74:48:1b:ca:2a: + 8c:ba:db:b6:7e:f6:bb:02:7c:a9:c3:db:58:78:a1: + bf:f0:fe:1a:10:55:11:ce:e8:69:4e:96:65:c6:17: + 03:d6:07:68:8c:54:82:ae:1c:22:55:3f:f1:f4:09: + 97:28:c0:46:f7:4e:0b:25:1d:f7:07:d7:09:1d:3a: + 18:57:38:3b:e8:33:06:e7:8f:78:46:1e:5b:f5:06: + b6:ec:b8:a6:0d:f1:ba:13:4b:d6:18:20:dd:69:33: + 4a:33:15:ae:b8:c8:98:8a:27:2c:93:bc:2d:fb:ee: + 33:bf:66:e6:4d:ba:b6:9b:06:55:60:97:4b:bc:44: + cd:7e:f4:a1:d8:aa:2f:c0:02:28:21:16:62:78:db: + 08:54:f2:fc:f4:34:e3:c6:8f:1c:43:57:ce:90:1a: + 4b:dc:2e:3b:28:91:89:3f:7a:da:35:1d:8e:2c:ee: + 49:ec:f4:33:ad:c9:53:a8:8c:9f:04:53:3e:24:1c: + 52:c9:12:f9:62:57:a3:bc:ee:2c:eb:40:7c:20:23: + 70:2b:95:f9:73:17:8a:d1:c1:1c:69:a6:b7:38:9a: + 67:f7:70:1d:7a:5a:0c:40:cf:62:0f:85:3c:c2:02: + 4e:7e:b5:f6:c5:2a:29:84:b3:1f:37:2a:e1:aa:72: + 42:c4:ed:6b:1a:8f:92:1c:5d:be:d1:f2:5b:f2:ab: + aa:a9:d2:f5:b8:a4:41:2b:2b:91:6e:12:48:ca:98: + d8:37:8d:c8:ed:00:30:b5:b6:04:4e:7e:9c:da:84: + ec:c0:fa:7b:e5:1d:88:a4:53:46:b0:94:e4:5c:1b: + a1:25:2c:0f:48:52:77:97:09:6c:ec:5b:18:33:83: + 02:e5:82:7e:cd:85:21:30:11:fd:27:4f:cf:e4:1e: + ec:3f:a5:57:6c:e9:2a:30:19:2a:88:e5:c3:69:38: + ab:6f:39:71:7f:84:e1:41:c3:e1:cc:2a:89:20:52: + 2e:83:0f:6c:39:3f:4b:2d:16:ac:2d:f0:24:ac:00: + 73:f4:9b:b3:06:3f:05:b8:14:85:1f:ab:9e:5c:3c: + 9e:62:9d:0e:6d:3b:80:09:fc:02:ea:a2:97:74:ca: + c7:f9:e3:56:e1:c3:ca:a5:a6:9a:c0:90:e0:24:12: + 53:d2:c2:8b:da:be:ed:02:43:5e:67:e1:89:98:79: + ee:cb:aa:ca:c3:1b:dc:e7:a5:46:a5:7c:6b:16:87: + b6:5a:28:d7:db:27:3c:5e:a5:bd:b6:51:dd:1f:43: + cf:3b:26:c8:3a:8d:25:61:c1:49:f4:3c:1b:c9:44: + ea:af:1c:c2:2b:94:01:2a:0e:30:d1:5b:8b:2b:47: + e5:c3:d1:04:03:9b:0e:39:2c:d6:27:d4:e6:70:5a: + d9:75:cf:2a:d8:c9:00:05:e4:13:88:ec:c3:39:fb: + 87:61:30:36:43:03:c8:9e:9c:a2:06:c2:2f:c5:fc: + f0:80:63:b1:54:04:a0:4c:a9:2e:c6:f5:76:7a:d8: + d0:e4:d4:94:11:e5:15:b5:78:06:dc:b8:80:8f:99: + a9:20:33:3d:10:85:4c:65:09:ca:3e:58:5e:60:93: + 9a:aa:62:5d:c0:51:06:1c:5d:60:a0:0d:9c:4b:43: + f6:a7:16:21:a4:87:aa:f2:c1:2e:ee:92:30:b8:9e: + df:df:10:01:8b:86:09:70:d8:6c:a8:b7:50:1e:16: + 96:b4:f7:67:fd:35:3a:21:90:2a:32:c7:00:7b:4d: + 07:10:09:b9:2f:73:d8:18:7e:67:99:04:4f:06:fc: + 50:c7:85:9b:9d:40:9d:b3:96:37:fa:a5:dc:b2:72: + 4e:ef:4e:09:2c:fd:91:fd:4d:f7:bb:a6:a1:3e:ab: + 7b:a2:03:40:a6:a9:55:27:e2:fa:f9:19:ce:87:75: + aa:f1:75:36:f3:f3:b8:91:f8:91:c3:8b:75:13:8e: + 4c:65:9a:16:39:6a:e5:34:e8:7a:96:59:7f:35:b0: + 00:fd:5b:69:fc:43:26:fa:f5:28:6e:fe:87:d9:7e: + 24:fb:b4:a0:82:6e:54:a2:ff:ae:bf:62:b4:f4:72: + 01:c2:cb:98:47:98:e1:4c:b5:17:80:80:ce:8f:a6: + 28:ee:1e:45:6a:fb:df:f1:1d:fc:5a:3b:d6:ea:f4: + 6c:1d:62:49:57:3b:8a:8f:86:ea:f0:53:04:ce:9c: + 16:68:ff:ba:b9:fc:88:0f:47:f7:02:44:72:40:b8: + ca:3b:2d:53:9d:dc:3c:56:8c:59:7b:68:1a:2c:8d: + 71:bb:6c:00:c7:1a:ce:6f:40:92:b1:a3:2f:0f:d9: + 44:f2:a3:70:2e:9e:ee:0e:ae:32:d0:3b:3e:8b:07: + ea:e6:79:b3:5c:29:e2:7d:6b:a8:5e:f9:5a:31:e8: + 08:96:a2:8c:03:98:46:f1:b8:7d:90:54:26:ed:76: + 62:fe:9e:e9:9a:6e:5e:c9:49:c7:5c:34:53:29:54: + d9:ec:e4:46:e1:80:3b:75:d9:df:fb:79:d5:87:f1: + ba:9e:eb:19:ce:4c:52:73:e6:5b:87:ae:25:4f:39: + 79:cc:c6:b8:f9:10:7b:ec:f0:9b:71:a4:05:a0:d3: + 29:d3:4e:7f:1f:f4:2d:28:78:cc:55:95:7b:1e:91: + 2f:cc:56:18:73:8b:b2:db:bc:69:07:e6:d0:d8:4f: + ed:a2:ff:58:85:a3:6d:e0:4a:53:b7:67:7d:8d:0c: + 5c:5b:7b:77:28:02:35:44:7a:04:d3:28:43:c8:6b: + 30:17:5d:32:b8:29:35:ba:76:da:3b:14:4a:76:18: + 58:a4:f8:92:3c:9e:4d:33:6f:46:6b:08:d9:31:48: + 68:dd:f4:fb:24:56:34:b2:cf:69:66:be:48:d2:8a: + 66:22:cd:f2:69:cd:c2:53:13:45:29:41:22:d6:5d: + 98:1f:b6:a4:b2:a3:c2:ee:02:2f:51:1b:dc:83:a4: + ec:70:25:a8:d4:08:61:32:6f:e4:a1:81:2e:7c:63: + 72:fa:29:65:bc:70:44:cf:5d + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 55:9a:34:6a:22:06:69:09:45:33:c7:ae:a9:5c:c7:09:4e:9b: + 86:bc:41:90:d4:94:52:f6:cd:23:29:94:4b:22:cd:e8:bd:fe: + 9d:cd:52:f2:bd:ed:ab:87:c9:ab:ab:46:04:b4:bd:a2:3f:22: + 30:47:50:c0:4b:8c:76:0f:03:f5:92:d2:b1:2d:c4:7a:35:9c: + c9:73:87:eb:a6:9f:de:0f:73:8d:d3:7f:99:d8:ba:8f:6f:c4: + f3:be:1a:ae:8b:a2:94:36:90:e2:e5:eb:8d:05:f4:fc:65:df: + 95:f1:c4:94:4d:17:56:d7:9f:3c:8f:50:3c:e7:77:bf:95:86: + 26:64:fb:6a:ff:c6:da:e9:8c:ae:42:bb:69:e5:33:c6:d8:e9: + 0d:c6:55:21:49:c1:0c:b4:a3:f9:9b:4b:5c:de:83:4f:41:03: + ce:2a:79:68:38:7d:f0:54:49:20:f5:b6:10:ff:08:dc:33:66: + 96:9b:ff:06:de:00:9e:d7:ce:56:43:9a:51:fc:70:cd:f6:f0: + 51:a3:b7:cd:b4:5c:85:62:cd:71:b7:c6:2b:23:2b:dd:c3:6e: + 40:42:fa:37:ff:37:1c:f6:7a:57:94:87:85:23:d7:d4:c9:c7: + 5f:c1:4d:2f:c9:0d:d7:5c:ec:9c:25:ee:9e:30:82:91:96:72: + b8:75:1d:f8:09:68:57:97:b2:2d:4b:ee:25:ec:7a:24:29:ee: + 72:d4:9c:13:db:ab:dc:03:0a:d8:4a:14:c9:08:57:44:5d:a1: + b5:53:80:34:f2:14:97:cf:52:de:a2:0e:8a:10:e9:14:ef:d0: + 60:be:61:a1:f1:25:5d:d5:18:73:3f:93:10:ca:96:ee:b3:40: + d2:db:a3:55:cf:57:5a:a5:0e:4f:75:47:df:ea:f7:90:9a:6d: + f5:70:2e:1d:14:1c:37:64:04:59:50:b0:dc:72:86:6f:9c:37: + 3d:5d:28:af:73:55:ef:d2:ee:24:74:74:13:ef:dc:db:31:49: + fb:3f:63:f5:d3:08:3e:33:a5:e7:9d:0a:de:53:2c:51:8e:67: + db:9b:41:65:41:50:bd:d4:a4:96:6c:87:bc:12:e0:94:c7:d3: + c0:e4:cb:73:58:00:83:e1:ac:27:85:d6:9d:53:9d:5c:bd:0a: + 3e:03:43:9c:0c:91:f5:6d:7b:f8:40:72:75:ab:11:76:91:2b: + e1:c6:aa:1f:70:69:76:70:15:09:fe:93:d0:d6:2d:b7:15:6a: + 9b:67:5c:b4:69:9f:25:a6:7d:8a:fb:7d:22:a9:71:f2:ce:4e: + 8c:b8:21:2d:de:fe:41:71:0d:ff:9d:ec:73:a6:bb:07:4f:88: + 0e:58:47:2e:7e:a9:c2:c7:78:dd:ba:7a:9e:4e:e0:30:4e:63: + 6f:85:d4:20:41:e9:fa:fe:43:45:e7:fb:af:7a:b2:ce:a4:05: + 1d:22:9a:58:86:df:e4:ce:4c:a9:fe:d8:16:a5:6f:fb:d8:ce: + 56:7b:f5:d6:20:ef:e4:47:cd:63:24:ff:b9:be:f1:48:a3:c1: + 01:72:e6:bd:c0:ad:ed:26:0d:ca:34:9f:fc:02:2d:20:4f:05: + 20:ae:21:3d:0c:c2:20:3c:3f:f0:04:84:dc:cf:89:fd:b9:25: + 91:8e:d0:43:e6:b3:20:ab:5c:2d:d5:40:9e:a0:4b:d8:f4:b2: + cc:7d:f1:58:0a:8e:87:ed:88:ac:36:96:e4:56:a0:11:8a:f2: + 9a:d0:b3:57:a3:34:bb:19:ab:38:e1:74:6b:22:c4:31:ce:01: + d5:1b:36:e3:1e:38:4c:33:93:df:40:e3:59:57:4e:ac:6e:7b: + 1e:5a:3d:c5:1d:5b:ac:c8:10:82:35:02:22:b2:fc:75:e8:10: + 91:8d:c4:7d:78:93:47:9e:1c:9d:ac:6b:62:02:58:8c:d6:1c: + 23:d6:af:78:c2:80:9c:a4:aa:24:54:14:b5:14:98:c6:f8:2b: + 1a:24:cb:71:32:0a:e2:9b:0e:69:6b:dd:7e:8c:64:d1:2e:63: + ef:0e:7f:b1:3e:88:4c:9d:55:e5:c9:6e:17:04:b7:41:ff:bd: + 8a:41:cb:25:31:6f:44:77:3f:47:b1:fc:81:88:07:8e:05:49: + 20:b7:11:d9:69:03:2a:03:9d:b9:33:84:9a:df:df:7a:e3:46: + 73:a3:d8:a2:8c:53:19:88:55:4c:74:b8:f6:44:84:2b:d1:14: + 2d:4e:39:2e:92:68:ff:69:fc:85:62:1b:eb:55:4f:ef:25:84: + 62:45:99:d6:d8:4e:6f:3f:53:08:7d:1d:06:95:81:80:7f:4f: + 4e:74:36:98:b5:e2:87:70:98:dc:d7:f5:dc:52:15:e6:c6:d6: + 79:96:39:7f:8f:95:cf:ab:80:53:ad:1b:0b:45:40:0e:d4:18: + bd:2c:de:8a:77:76:fd:f2:44:47:c6:21:d0:e4:74:f0:d8:18: + 05:c8:7c:30:72:c7:df:f1:bb:fc:02:30:a9:f4:42:26:59:0d: + 93:05:82:a1:73:ed:34:e5:38:5d:cd:50:90:fe:94:fc:13:bc: + bd:fc:a8:a2:88:a7:73:c4:b2:a8:d1:5d:88:c4:02:a2:7a:f1: + 04:c9:fe:8c:74:c9:ef:1d:64:41:9f:ac:1e:96:67:64:ac:ab: + 28:41:c7:9d:f7:c0:98:1b:6e:07:c2:64:7d:5a:83:66:56:28: + 36:9c:e7:fb:1c:77:0e:28:a0:c4:f7:6b:79:39:04:20:84:c7: + 57:93:bc:1b:a0:ea:bc:eb:42:e5:a8:11:fe:fc:ac:65:cc:fd: + f8:28:88:f4:a5:9a:e5:73:51:e0:a8:9b:0d:03:77:4e:e5:e0: + 98:b3:88:da:7d:e6:c6:9e:7c:14:66:c1:2e:53:4a:92:07:37: + a0:7e:e9:3d:09:e4:15:7c:cf:fd:b8:41:a5:ef:9e:66:9d:c4: + 5e:07:1d:87:f8:41:ad:ea:e7:2f:d2:41:63:18:37:f9:14:e3: + 4d:d0:e5:f7:43:fd:15:e3:f9:36:73:06:26:df:01:4f:a9:c3: + 4e:de:20:46:77:98:b4:7a:24:2b:3b:75:2b:4e:58:8d:9b:5d: + a4:c7:16:a0:bc:32:88:3f:a1:83:f3:00:c8:f8:d8:58:e9:63: + 5d:4c:2b:b5:f0:72:41:d8:ab:77:37:d6:72:74:ae:b6:36:9c: + c8:a6:83:49:4b:e0:c9:56:0b:29:be:00:30:cb:dd:d6:c8:42: + 8a:00:d9:ec:15:d1:34:71:f2:5b:64:87:f6:27:d2:b7:eb:86: + b0:90:bf:29:db:21:9e:36:8c:e3:20:2f:95:23:51:6c:1b:c2: + a4:d5:e6:d8:02:43:67:a0:fe:9b:50:03:44:7f:bb:e4:72:d5: + d1:e4:da:8f:92:14:64:fb:5d:14:10:12:4a:95:06:c9:65:08: + 29:ca:21:a3:26:38:11:c9:27:df:70:67:04:fd:ca:48:32:7f: + 63:b2:45:74:31:50:4f:87:d9:20:70:d2:21:70:b1:d6:10:9d: + 33:5d:78:83:91:6d:55:82:ec:da:e4:62:63:c7:81:46:d7:19: + 65:72:2a:43:19:90:b8:d7:23:4d:4c:1c:e0:44:a9:66:67:ac: + ee:71:79:27:26:78:6d:72:0e:f5:5d:4b:23:b5:7c:7c:65:e9: + 17:c6:3a:0b:0d:dd:5e:1e:51:c3:86:b8:ec:7f:c7:27:4a:a5: + 46:e8:6a:2d:19:c1:87:a3:cb:99:93:87:64:a2:55:14:4c:b7: + 43:a5:93:d7:e7:d2:4e:79:40:ca:65:99:46:3d:3f:7a:80:7a: + 88:6a:cc:1e:e5:6b:33:46:f4:50:c0:d5:1f:09:b8:cd:8a:2e: + a1:27:eb:5d:73:a7:e8:6b:0a:e5:57:82:2a:b0:fc:e2:54:52: + 56:f0:ab:a9:12:c6:23:96:07:24:9c:e0:bc:46:a5:b4:20:04: + da:09:93:63:e5:d4:2e:c2:7e:c5:31:ed:b5:15:74:86:17:b9: + b3:f3:26:8a:1d:02:6a:da:1a:3f:e8:ba:f1:04:6d:94:51:54: + e2:5a:b4:59:83:1d:60:d0:2d:73:cc:07:b5:26:8c:f9:d7:c6: + 88:91:ef:80:cf:5d:0f:a1:60:cb:45:d4:42:22:d1:b1:70:1d: + fd:d0:b7:30:90:3a:c6:48:6d:67:e5:32:da:8f:db:e3:a8:e3: + 1d:20:25:a2:1c:e1:4c:b9:a4:f6:c6:3f:5c:58:0d:bb:c6:b2: + 77:01:16:91:9f:17:06:0d:b7:40:3e:cc:8f:8e:9c:4b:e0:9d: + 7e:9b:1e:05:ab:88:22:fa:d3:28:1b:57:14:64:4a:3e:24:2c: + 38:4d:21:69:00:73:2e:d0:55:2d:74:f2:15:e8:94:43:3e:40: + 2a:c6:c6:b9:6a:5b:de:a2:cc:18:50:54:5d:4e:2a:85:6c:f6: + 92:8b:29:19:7e:e7:ea:4a:e0:22:2b:25:bc:f7:66:cf:77:9a: + 41:74:f2:3c:14:0d:74:69:f5:50:83:cd:cd:2f:21:db:22:46: + 8a:d0:f7:51:1a:95:57:f2:05:8b:1a:19:ed:3b:45:e8:36:c2: + 6e:7e:fb:57:22:00:1f:06:53:a9:ae:93:c6:8f:71:2a:31:45: + 92:e7:8e:6d:e6:99:22:c0:83:fc:ef:dc:57:66:77:4f:a2:36: + 31:fb:a1:13:8d:e5:ca:a3:95:7d:01:0c:64:70:3b:53:42:68: + 80:c7:bb:9d:a8:00:35:69:98:0c:a8:67:d8:43:e5:aa:cf:95: + e0:51:95:a4:17:3f:42:9d:b8:04:ce:d3:79:79:c8:d3:8a:16: + 32:92:e0:d7:a2:ee:d7:37:4c:2f:ac:b8:7b:be:45:f6:f1:18: + 33:9c:7b:37:a6:24:d9:bc:40:ab:00:e9:c3:37:8b:ab:d8:b6: + f3:5e:81:4e:b0:14:6b:07:3e:1f:ec:c2:f6:44:22:95:bb:b3: + e6:6f:d6:f9:70:65:ba:0a:83:65:aa:0e:13:2f:83:13:23:53: + 8b:40:16:fa:ce:2f:fc:4d:04:f8:eb:d8:ac:c5:36:c2:15:57: + 48:38:ec:55:b3:b4:1e:ba:ad:d2:42:06:17:0d:73:c8:57:a6: + be:96:4d:a9:f2:c0:fb:7a:21:1c:f5:c9:70:a9:82:90:b5:f1: + 0c:d4:79:10:be:81:a6:e9:5c:61:9c:77:79:9a:a4:c3:37:26: + 57:37:c9:52:2c:fa:08:ff:d0:5f:c6:61:c0:f4:76:be:fc:de: + 4e:cf:ab:51:99:71:c7:df:7e:f4:d6:cf:06:56:19:13:53:0b: + 6d:74:59:48:19:9b:53:05:2d:9d:32:54:d3:e5:2c:53:8b:64: + 3e:d4:64:7b:e3:80:09:14:cc:fe:16:46:63:6b:71:69:f8:f9: + cb:27:f6:88:54:bc:45:b3:ce:02:c8:94:ee:40:5b:f9:42:02: + c2:ff:b0:d8:2c:eb:28:7f:5e:c9:26:01:99:a7 + +UPS Document Exchange by DST +============================ +MD5 Fingerprint: 78:A5:FB:10:4B:E4:63:2E:D2:6B:FB:F2:B6:C2:4B:8E +PEM Data: +-----BEGIN CERTIFICATE----- +MIID+DCCAuACEQDQHkCLAAACfAAAAAcAAAABMA0GCSqGSIb3DQEBBQUAMIG5MQsw +CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp +dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjEeMBwGA1UE +CxMVVW5pdGVkIFBhcmNlbCBTZXJ2aWNlMRkwFwYDVQQDExBEU1QgKFVQUykgUm9v +dENBMSEwHwYJKoZIhvcNAQkBFhJjYUBkaWdzaWd0cnVzdC5jb20wHhcNOTgxMjEw +MDAyNTQ2WhcNMDgxMjA3MDAyNTQ2WjCBuTELMAkGA1UEBhMCdXMxDTALBgNVBAgT +BFV0YWgxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xHjAcBgNVBAsTFVVuaXRlZCBQYXJjZWwgU2Vy +dmljZTEZMBcGA1UEAxMQRFNUIChVUFMpIFJvb3RDQTEhMB8GCSqGSIb3DQEJARYS +Y2FAZGlnc2lndHJ1c3QuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA7xfsrynm2SsnwNt7JJ9m9ASjwq0KyrDNhCuqN/OAoWDvQo/lXXdfV0JU3Svb +YbJxXpN7b1/rJCvnpPLr8XOzC431Wdcy36yQjk4xuiVNtgym8eWvDOHlb1IDFcHf +vn5KpqYYRnA/76dNqNz1dNlhekA8oZQo6sKUiMs3FQUZPJViuhwt+yiM0ciekjxb +EVQ7eNlHO5stSuY+e2vf9PYFzyj2upg2AJ48N4UKnN63pIXFY/23YhRtFx7MioCF +QjIRsCHinXfJgBZBnuvlFIl/t8O8T8Gfh5uW7GP2+ZBWDpWjIwqMZNqbuxx3sExd +5sjo9X15LVckP8zjPSyYzxKfFwIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQC7OI4E +IiZYDiFEVsy9WXwpaMtcD8iGVD+BeKetj8xG9xxUuHktW3IFaugh0OwdHf6kNFG+ +7u3OzJwWaOJddXMIQzGRahArEMJLafjJrZio/bjv9qvwXyHvy4VrCe0vSGa1YHLA +6KDHmNsO9xtzjTQICnvFd2KqMCObsB6LgJhU3AWHs6liWfyLtxWarETszzUa9w8u +XZJLAch77qA37eQdgg2ZQUMXrdTVyuP5fReiAdAwD0C53LkEgmmDtvkP+gaS96j0 +1hcc8F5/xCnI5uHi/zZoIVGu/6m6hJKtinsz2JDSwXltMzM5dKwbOHGfLAeQ6h3g +04lfy+8UjSdUpb1G +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + d0:1e:40:8b:00:00:02:7c:00:00:00:07:00:00:00:01 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=us, ST=Utah, L=Salt Lake City, O=Digital Signature Trust Co., OU=United Parcel Service, CN=DST (UPS) RootCA/Email=ca@digsigtrust.com + Validity + Not Before: Dec 10 00:25:46 1998 GMT + Not After : Dec 7 00:25:46 2008 GMT + Subject: C=us, ST=Utah, L=Salt Lake City, O=Digital Signature Trust Co., OU=United Parcel Service, CN=DST (UPS) RootCA/Email=ca@digsigtrust.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:ef:17:ec:af:29:e6:d9:2b:27:c0:db:7b:24:9f: + 66:f4:04:a3:c2:ad:0a:ca:b0:cd:84:2b:aa:37:f3: + 80:a1:60:ef:42:8f:e5:5d:77:5f:57:42:54:dd:2b: + db:61:b2:71:5e:93:7b:6f:5f:eb:24:2b:e7:a4:f2: + eb:f1:73:b3:0b:8d:f5:59:d7:32:df:ac:90:8e:4e: + 31:ba:25:4d:b6:0c:a6:f1:e5:af:0c:e1:e5:6f:52: + 03:15:c1:df:be:7e:4a:a6:a6:18:46:70:3f:ef:a7: + 4d:a8:dc:f5:74:d9:61:7a:40:3c:a1:94:28:ea:c2: + 94:88:cb:37:15:05:19:3c:95:62:ba:1c:2d:fb:28: + 8c:d1:c8:9e:92:3c:5b:11:54:3b:78:d9:47:3b:9b: + 2d:4a:e6:3e:7b:6b:df:f4:f6:05:cf:28:f6:ba:98: + 36:00:9e:3c:37:85:0a:9c:de:b7:a4:85:c5:63:fd: + b7:62:14:6d:17:1e:cc:8a:80:85:42:32:11:b0:21: + e2:9d:77:c9:80:16:41:9e:eb:e5:14:89:7f:b7:c3: + bc:4f:c1:9f:87:9b:96:ec:63:f6:f9:90:56:0e:95: + a3:23:0a:8c:64:da:9b:bb:1c:77:b0:4c:5d:e6:c8: + e8:f5:7d:79:2d:57:24:3f:cc:e3:3d:2c:98:cf:12: + 9f:17 + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + bb:38:8e:04:22:26:58:0e:21:44:56:cc:bd:59:7c:29:68:cb: + 5c:0f:c8:86:54:3f:81:78:a7:ad:8f:cc:46:f7:1c:54:b8:79: + 2d:5b:72:05:6a:e8:21:d0:ec:1d:1d:fe:a4:34:51:be:ee:ed: + ce:cc:9c:16:68:e2:5d:75:73:08:43:31:91:6a:10:2b:10:c2: + 4b:69:f8:c9:ad:98:a8:fd:b8:ef:f6:ab:f0:5f:21:ef:cb:85: + 6b:09:ed:2f:48:66:b5:60:72:c0:e8:a0:c7:98:db:0e:f7:1b: + 73:8d:34:08:0a:7b:c5:77:62:aa:30:23:9b:b0:1e:8b:80:98: + 54:dc:05:87:b3:a9:62:59:fc:8b:b7:15:9a:ac:44:ec:cf:35: + 1a:f7:0f:2e:5d:92:4b:01:c8:7b:ee:a0:37:ed:e4:1d:82:0d: + 99:41:43:17:ad:d4:d5:ca:e3:f9:7d:17:a2:01:d0:30:0f:40: + b9:dc:b9:04:82:69:83:b6:f9:0f:fa:06:92:f7:a8:f4:d6:17: + 1c:f0:5e:7f:c4:29:c8:e6:e1:e2:ff:36:68:21:51:ae:ff:a9: + ba:84:92:ad:8a:7b:33:d8:90:d2:c1:79:6d:33:33:39:74:ac: + 1b:38:71:9f:2c:07:90:ea:1d:e0:d3:89:5f:cb:ef:14:8d:27: + 54:a5:bd:46 + +ValiCert Class 1 VA +=================== +MD5 Fingerprint: 65:58:AB:15:AD:57:6C:1E:A8:A7:B5:69:AC:BF:FF:EB +PEM Data: +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: 1 (0x1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: L=ValiCert Validation Network, O=ValiCert, Inc., OU=ValiCert Class 1 Policy Validation Authority, CN=http://www.valicert.com//Email=info@valicert.com + Validity + Not Before: Jun 25 22:23:48 1999 GMT + Not After : Jun 25 22:23:48 2019 GMT + Subject: L=ValiCert Validation Network, O=ValiCert, Inc., OU=ValiCert Class 1 Policy Validation Authority, CN=http://www.valicert.com//Email=info@valicert.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:d8:59:82:7a:89:b8:96:ba:a6:2f:68:6f:58:2e: + a7:54:1c:06:6e:f4:ea:8d:48:bc:31:94:17:f0:f3: + 4e:bc:b2:b8:35:92:76:b0:d0:a5:a5:01:d7:00:03: + 12:22:19:08:f8:ff:11:23:9b:ce:07:f5:bf:69:1a: + 26:fe:4e:e9:d1:7f:9d:2c:40:1d:59:68:6e:a6:f8: + 58:b0:9d:1a:8f:d3:3f:f1:dc:19:06:81:a8:0e:e0: + 3a:dd:c8:53:45:09:06:e6:0f:70:c3:fa:40:a6:0e: + e2:56:05:0f:18:4d:fc:20:82:d1:73:55:74:8d:76: + 72:a0:1d:9d:1d:c0:dd:3f:71 + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 50:68:3d:49:f4:2c:1c:06:94:df:95:60:7f:96:7b:17:fe:4f: + 71:ad:64:c8:dd:77:d2:ef:59:55:e8:3f:e8:8e:05:2a:21:f2: + 07:d2:b5:a7:52:fe:9c:b1:b6:e2:5b:77:17:40:ea:72:d6:23: + cb:28:81:32:c3:00:79:18:ec:59:17:89:c9:c6:6a:1e:71:c9: + fd:b7:74:a5:25:45:69:c5:48:ab:19:e1:45:8a:25:6b:19:ee: + e5:bb:12:f5:7f:f7:a6:8d:51:c3:f0:9d:74:b7:a9:3e:a0:a5: + ff:b6:49:03:13:da:22:cc:ed:71:82:2b:99:cf:3a:b7:f5:2d: + 72:c8 + +ValiCert Class 2 VA +=================== +MD5 Fingerprint: A9:23:75:9B:BA:49:36:6E:31:C2:DB:F2:E7:66:BA:87 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: 1 (0x1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: L=ValiCert Validation Network, O=ValiCert, Inc., OU=ValiCert Class 2 Policy Validation Authority, CN=http://www.valicert.com//Email=info@valicert.com + Validity + Not Before: Jun 26 00:19:54 1999 GMT + Not After : Jun 26 00:19:54 2019 GMT + Subject: L=ValiCert Validation Network, O=ValiCert, Inc., OU=ValiCert Class 2 Policy Validation Authority, CN=http://www.valicert.com//Email=info@valicert.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:ce:3a:71:ca:e5:ab:c8:59:92:55:d7:ab:d8:74: + 0e:f9:ee:d9:f6:55:47:59:65:47:0e:05:55:dc:eb: + 98:36:3c:5c:53:5d:d3:30:cf:38:ec:bd:41:89:ed: + 25:42:09:24:6b:0a:5e:b3:7c:dd:52:2d:4c:e6:d4: + d6:7d:5a:59:a9:65:d4:49:13:2d:24:4d:1c:50:6f: + b5:c1:85:54:3b:fe:71:e4:d3:5c:42:f9:80:e0:91: + 1a:0a:5b:39:36:67:f3:3f:55:7c:1b:3f:b4:5f:64: + 73:34:e3:b4:12:bf:87:64:f8:da:12:ff:37:27:c1: + b3:43:bb:ef:7b:6e:2e:69:f7 + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 3b:7f:50:6f:6f:50:94:99:49:62:38:38:1f:4b:f8:a5:c8:3e: + a7:82:81:f6:2b:c7:e8:c5:ce:e8:3a:10:82:cb:18:00:8e:4d: + bd:a8:58:7f:a1:79:00:b5:bb:e9:8d:af:41:d9:0f:34:ee:21: + 81:19:a0:32:49:28:f4:c4:8e:56:d5:52:33:fd:50:d5:7e:99: + 6c:03:e4:c9:4c:fc:cb:6c:ab:66:b3:4a:21:8c:e5:b5:0c:32: + 3e:10:b2:cc:6c:a1:dc:9a:98:4c:02:5b:f3:ce:b9:9e:a5:72: + 0e:4a:b7:3f:3c:e6:16:68:f8:be:ed:74:4c:bc:5b:d5:62:1f: + 43:dd + +ValiCert Class 3 VA +=================== +MD5 Fingerprint: A2:6F:53:B7:EE:40:DB:4A:68:E7:FA:18:D9:10:4B:72 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: 1 (0x1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: L=ValiCert Validation Network, O=ValiCert, Inc., OU=ValiCert Class 3 Policy Validation Authority, CN=http://www.valicert.com//Email=info@valicert.com + Validity + Not Before: Jun 26 00:22:33 1999 GMT + Not After : Jun 26 00:22:33 2019 GMT + Subject: L=ValiCert Validation Network, O=ValiCert, Inc., OU=ValiCert Class 3 Policy Validation Authority, CN=http://www.valicert.com//Email=info@valicert.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:e3:98:51:96:1c:e8:d5:b1:06:81:6a:57:c3:72: + 75:93:ab:cf:9e:a6:fc:f3:16:52:d6:2d:4d:9f:35: + 44:a8:2e:04:4d:07:49:8a:38:29:f5:77:37:e7:b7: + ab:5d:df:36:71:14:99:8f:dc:c2:92:f1:e7:60:92: + 97:ec:d8:48:dc:bf:c1:02:20:c6:24:a4:28:4c:30: + 5a:76:6d:b1:5c:f3:dd:de:9e:10:71:a1:88:c7:5b: + 9b:41:6d:ca:b0:b8:8e:15:ee:ad:33:2b:cf:47:04: + 5c:75:71:0a:98:24:98:29:a7:49:59:a5:dd:f8:b7: + 43:62:61:f3:d3:e2:d0:55:3f + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 56:bb:02:58:84:67:08:2c:df:1f:db:7b:49:33:f5:d3:67:9d: + f4:b4:0a:10:b3:c9:c5:2c:e2:92:6a:71:78:27:f2:70:83:42: + d3:3e:cf:a9:54:f4:f1:d8:92:16:8c:d1:04:cb:4b:ab:c9:9f: + 45:ae:3c:8a:a9:b0:71:33:5d:c8:c5:57:df:af:a8:35:b3:7f: + 89:87:e9:e8:25:92:b8:7f:85:7a:ae:d6:bc:1e:37:58:2a:67: + c9:91:cf:2a:81:3e:ed:c6:39:df:c0:3e:19:9c:19:cc:13:4d: + 82:41:b5:8c:de:e0:3d:60:08:20:0f:45:7e:6b:a2:7f:a3:8c: + 15:ee + +VeriSign Class 4 Primary CA +=========================== +MD5 Fingerprint: 1B:D1:AD:17:8B:7F:22:13:24:F5:26:E2:5D:4E:B9:10 +PEM Data: +-----BEGIN CERTIFICATE----- +MIICMTCCAZoCBQKmAAABMA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgNCBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NjAxMjkwMDAwMDBa +Fw05OTEyMzEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2ln +biwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0LJ1 +9njQrlpQ9OlQqZ+M1++RlHDo0iSQdomF1t+s5gEXMoDwnZNHvJplnR+Xrr/phnVj +IIm9gFidBAydqMEk6QvlMXi9/C0MN2qeeIDpRnX57aP7E3vIwUzSo+/1PLBij0pd +O92VZ48TucE81qcmm+zDO3rZTbxtm+gVAePwR6kCAwEAATANBgkqhkiG9w0BAQIF +AAOBgQBT3dPwnCR+QKri/AAa19oM/DJhuBUNlvP6Vxt/M3yv6ZiaYch6s7f/sdyZ +g9ysEvxwyR84Qu1E9oAuW2szaayc01znX1oYx7EteQSWQZGZQbE8DbqEOcY7l/Am +yY7uvcxClf8exwI/VAx49byqYHwCaejcrOICdmHEPgPq0ook0Q== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + 02:a6:00:00:01 + Signature Algorithm: md2WithRSAEncryption + Issuer: C=US, O=VeriSign, Inc., OU=Class 4 Public Primary Certification Authority + Validity + Not Before: Jan 29 00:00:00 1996 GMT + Not After : Dec 31 23:59:59 1999 GMT + Subject: C=US, O=VeriSign, Inc., OU=Class 4 Public Primary Certification Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:d0:b2:75:f6:78:d0:ae:5a:50:f4:e9:50:a9:9f: + 8c:d7:ef:91:94:70:e8:d2:24:90:76:89:85:d6:df: + ac:e6:01:17:32:80:f0:9d:93:47:bc:9a:65:9d:1f: + 97:ae:bf:e9:86:75:63:20:89:bd:80:58:9d:04:0c: + 9d:a8:c1:24:e9:0b:e5:31:78:bd:fc:2d:0c:37:6a: + 9e:78:80:e9:46:75:f9:ed:a3:fb:13:7b:c8:c1:4c: + d2:a3:ef:f5:3c:b0:62:8f:4a:5d:3b:dd:95:67:8f: + 13:b9:c1:3c:d6:a7:26:9b:ec:c3:3b:7a:d9:4d:bc: + 6d:9b:e8:15:01:e3:f0:47:a9 + Exponent: 65537 (0x10001) + Signature Algorithm: md2WithRSAEncryption + 53:dd:d3:f0:9c:24:7e:40:aa:e2:fc:00:1a:d7:da:0c:fc:32: + 61:b8:15:0d:96:f3:fa:57:1b:7f:33:7c:af:e9:98:9a:61:c8: + 7a:b3:b7:ff:b1:dc:99:83:dc:ac:12:fc:70:c9:1f:38:42:ed: + 44:f6:80:2e:5b:6b:33:69:ac:9c:d3:5c:e7:5f:5a:18:c7:b1: + 2d:79:04:96:41:91:99:41:b1:3c:0d:ba:84:39:c6:3b:97:f0: + 26:c9:8e:ee:bd:cc:42:95:ff:1e:c7:02:3f:54:0c:78:f5:bc: + aa:60:7c:02:69:e8:dc:ac:e2:02:76:61:c4:3e:03:ea:d2:8a: + 24:d1 + +Verisign Class 1 Public Primary Certification Authority +======================================================= +MD5 Fingerprint: 97:60:E8:57:5F:D3:50:47:E5:43:0C:94:36:8A:B0:62 +PEM Data: +-----BEGIN CERTIFICATE----- +MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05 +NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD +VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp +bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N +H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR +4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN +BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo +EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5 +FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx +lA== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + cd:ba:7f:56:f0:df:e4:bc:54:fe:22:ac:b3:72:aa:55 + Signature Algorithm: md2WithRSAEncryption + Issuer: C=US, O=VeriSign, Inc., OU=Class 1 Public Primary Certification Authority + Validity + Not Before: Jan 29 00:00:00 1996 GMT + Not After : Aug 1 23:59:59 2028 GMT + Subject: C=US, O=VeriSign, Inc., OU=Class 1 Public Primary Certification Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:e5:19:bf:6d:a3:56:61:2d:99:48:71:f6:67:de: + b9:8d:eb:b7:9e:86:80:0a:91:0e:fa:38:25:af:46: + 88:82:e5:73:a8:a0:9b:24:5d:0d:1f:cc:65:6e:0c: + b0:d0:56:84:18:87:9a:06:9b:10:a1:73:df:b4:58: + 39:6b:6e:c1:f6:15:d5:a8:a8:3f:aa:12:06:8d:31: + ac:7f:b0:34:d7:8f:34:67:88:09:cd:14:11:e2:4e: + 45:56:69:1f:78:02:80:da:dc:47:91:29:bb:36:c9: + 63:5c:c5:e0:d7:2d:87:7b:a1:b7:32:b0:7b:30:ba: + 2a:2f:31:aa:ee:a3:67:da:db + Exponent: 65537 (0x10001) + Signature Algorithm: md2WithRSAEncryption + 4c:3f:b8:8b:c6:68:df:ee:43:33:0e:5d:e9:a6:cb:07:84:4d: + 7a:33:ff:92:1b:f4:36:ad:d8:95:22:36:68:11:6c:7c:42:cc: + f3:9c:2e:c4:07:3f:14:b0:0f:4f:ff:90:92:76:f9:e2:bc:4a: + e9:8f:cd:a0:80:0a:f7:c5:29:f1:82:22:5d:b8:b1:dd:81:23: + a3:7b:25:15:46:30:79:16:f8:ea:05:4b:94:7f:1d:c2:1c:c8: + e3:b7:f4:10:40:3c:13:c3:5f:1f:53:e8:48:e4:86:b4:7b:a1: + 35:b0:7b:25:ba:b8:d3:8e:ab:3f:38:9d:00:34:00:98:f3:d1: + 71:94 + +Verisign Class 1 Public Primary Certification Authority - G2 +============================================================ +MD5 Fingerprint: F2:7D:E9:54:E4:A3:22:0D:76:9F:E7:0B:BB:B3:24:2B +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEDnKVIn+UCIy/jLZ2/sbhBkwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTE4MDUxODIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK +VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm +Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAIv3GhDOdlwHq4OZ3BeAbzQ5XZg+a3Is4cei +e0ApuXiIukzFo2penm574/ICQQxmvq37rqIUzpLzojSLtLK2JPLl1eDI5WJthHvL +vrsDi3xXyvA3qZCviu4Dvh0onNkmdqDNxJ1O8K4HFtW+r1cIatCgQkJCHvQgzKV4 +gpUmOIpH +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + 39:ca:54:89:fe:50:22:32:fe:32:d9:db:fb:1b:84:19 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=VeriSign, Inc., OU=Class 1 Public Primary Certification Authority - G2, OU=(c) 1998 VeriSign, Inc. - For authorized use only, OU=VeriSign Trust Network + Validity + Not Before: May 18 00:00:00 1998 GMT + Not After : May 18 23:59:59 2018 GMT + Subject: C=US, O=VeriSign, Inc., OU=Class 1 Public Primary Certification Authority - G2, OU=(c) 1998 VeriSign, Inc. - For authorized use only, OU=VeriSign Trust Network + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:aa:d0:ba:be:16:2d:b8:83:d4:ca:d2:0f:bc:76: + 31:ca:94:d8:1d:93:8c:56:02:bc:d9:6f:1a:6f:52: + 36:6e:75:56:0a:55:d3:df:43:87:21:11:65:8a:7e: + 8f:bd:21:de:6b:32:3f:1b:84:34:95:05:9d:41:35: + eb:92:eb:96:dd:aa:59:3f:01:53:6d:99:4f:ed:e5: + e2:2a:5a:90:c1:b9:c4:a6:15:cf:c8:45:eb:a6:5d: + 8e:9c:3e:f0:64:24:76:a5:cd:ab:1a:6f:b6:d8:7b: + 51:61:6e:a6:7f:87:c8:e2:b7:e5:34:dc:41:88:ea: + 09:40:be:73:92:3d:6b:e7:75 + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 8b:f7:1a:10:ce:76:5c:07:ab:83:99:dc:17:80:6f:34:39:5d: + 98:3e:6b:72:2c:e1:c7:a2:7b:40:29:b9:78:88:ba:4c:c5:a3: + 6a:5e:9e:6e:7b:e3:f2:02:41:0c:66:be:ad:fb:ae:a2:14:ce: + 92:f3:a2:34:8b:b4:b2:b6:24:f2:e5:d5:e0:c8:e5:62:6d:84: + 7b:cb:be:bb:03:8b:7c:57:ca:f0:37:a9:90:af:8a:ee:03:be: + 1d:28:9c:d9:26:76:a0:cd:c4:9d:4e:f0:ae:07:16:d5:be:af: + 57:08:6a:d0:a0:42:42:42:1e:f4:20:cc:a5:78:82:95:26:38: + 8a:47 + +Verisign Class 1 Public Primary Certification Authority - G3 +============================================================ +MD5 Fingerprint: B1:47:BC:18:57:D1:18:A0:78:2D:EC:71:E8:2A:95:73 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 +nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO +8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV +ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb +PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 +6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr +n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a +qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 +wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs +pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 +E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + 8b:5b:75:56:84:54:85:0b:00:cf:af:38:48:ce:b1:a4 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 1999 VeriSign, Inc. - For authorized use only, CN=VeriSign Class 1 Public Primary Certification Authority - G3 + Validity + Not Before: Oct 1 00:00:00 1999 GMT + Not After : Jul 16 23:59:59 2036 GMT + Subject: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 1999 VeriSign, Inc. - For authorized use only, CN=VeriSign Class 1 Public Primary Certification Authority - G3 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:dd:84:d4:b9:b4:f9:a7:d8:f3:04:78:9c:de:3d: + dc:6c:13:16:d9:7a:dd:24:51:66:c0:c7:26:59:0d: + ac:06:08:c2:94:d1:33:1f:f0:83:35:1f:6e:1b:c8: + de:aa:6e:15:4e:54:27:ef:c4:6d:1a:ec:0b:e3:0e: + f0:44:a5:57:c7:40:58:1e:a3:47:1f:71:ec:60:f6: + 6d:94:c8:18:39:ed:fe:42:18:56:df:e4:4c:49:10: + 78:4e:01:76:35:63:12:36:dd:66:bc:01:04:36:a3: + 55:68:d5:a2:36:09:ac:ab:21:26:54:06:ad:3f:ca: + 14:e0:ac:ca:ad:06:1d:95:e2:f8:9d:f1:e0:60:ff: + c2:7f:75:2b:4c:cc:da:fe:87:99:21:ea:ba:fe:3e: + 54:d7:d2:59:78:db:3c:6e:cf:a0:13:00:1a:b8:27: + a1:e4:be:67:96:ca:a0:c5:b3:9c:dd:c9:75:9e:eb: + 30:9a:5f:a3:cd:d9:ae:78:19:3f:23:e9:5c:db:29: + bd:ad:55:c8:1b:54:8c:63:f6:e8:a6:ea:c7:37:12: + 5c:a3:29:1e:02:d9:db:1f:3b:b4:d7:0f:56:47:81: + 15:04:4a:af:83:27:d1:c5:58:88:c1:dd:f6:aa:a7: + a3:18:da:68:aa:6d:11:51:e1:bf:65:6b:9f:96:76: + d1:3d + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + ab:66:8d:d7:b3:ba:c7:9a:b6:e6:55:d0:05:f1:9f:31:8d:5a: + aa:d9:aa:46:26:0f:71:ed:a5:ad:53:56:62:01:47:2a:44:e9: + fe:3f:74:0b:13:9b:b9:f4:4d:1b:b2:d1:5f:b2:b6:d2:88:5c: + b3:9f:cd:cb:d4:a7:d9:60:95:84:3a:f8:c1:37:1d:61:ca:e7: + b0:c5:e5:91:da:54:a6:ac:31:81:ae:97:de:cd:08:ac:b8:c0: + 97:80:7f:6e:72:a4:e7:69:13:95:65:1f:c4:93:3c:fd:79:8f: + 04:d4:3e:4f:ea:f7:9e:ce:cd:67:7c:4f:65:02:ff:91:85:54: + 73:c7:ff:36:f7:86:2d:ec:d0:5e:4f:ff:11:9f:72:06:d6:b8: + 1a:f1:4c:0d:26:65:e2:44:80:1e:c7:9f:e3:dd:e8:0a:da:ec: + a5:20:80:69:68:a1:4f:7e:e1:6b:cf:07:41:fa:83:8e:bc:38: + dd:b0:2e:11:b1:6b:b2:42:cc:9a:bc:f9:48:22:79:4a:19:0f: + b2:1c:3e:20:74:d9:6a:c3:be:f2:28:78:13:56:79:4f:6d:50: + ea:1b:b0:b5:57:b1:37:66:58:23:f3:dc:0f:df:0a:87:c4:ef: + 86:05:d5:38:14:60:99:a3:4b:de:06:96:71:2c:f2:db:b6:1f: + a4:ef:3f:ee + +Verisign Class 2 Public Primary Certification Authority +======================================================= +MD5 Fingerprint: B3:9C:25:B1:C3:2E:32:53:80:15:30:9D:4D:02:77:3E +PEM Data: +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh +YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 +FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg +J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc +r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + 2d:1b:fc:4a:17:8d:a3:91:eb:e7:ff:f5:8b:45:be:0b + Signature Algorithm: md2WithRSAEncryption + Issuer: C=US, O=VeriSign, Inc., OU=Class 2 Public Primary Certification Authority + Validity + Not Before: Jan 29 00:00:00 1996 GMT + Not After : Aug 1 23:59:59 2028 GMT + Subject: C=US, O=VeriSign, Inc., OU=Class 2 Public Primary Certification Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:b6:5a:8b:a3:0d:6a:23:83:80:6b:cf:39:87:f4: + 21:13:33:06:4c:25:a2:ed:55:12:97:c5:a7:80:b9: + fa:83:c1:20:a0:fa:2f:15:0d:7c:a1:60:6b:7e:79: + 2c:fa:06:0f:3a:ae:f6:1b:6f:b1:d2:ff:2f:28:52: + 5f:83:7d:4b:c4:7a:b7:f8:66:1f:80:54:fc:b7:c2: + 8e:59:4a:14:57:46:d1:9a:93:be:41:91:03:bb:15: + 80:93:5c:eb:e7:cc:08:6c:3f:3e:b3:4a:fc:ff:4b: + 6c:23:d5:50:82:26:44:19:8e:23:c3:71:ea:19:24: + 47:04:9e:75:bf:c8:a6:00:1f + Exponent: 65537 (0x10001) + Signature Algorithm: md2WithRSAEncryption + 8a:1b:2b:fa:39:c1:74:d7:5e:d8:19:64:a2:58:4a:2d:37:e0: + 33:47:0f:ac:ed:f7:aa:db:1e:e4:8b:06:5c:60:27:ca:45:52: + ce:16:ef:3f:06:64:e7:94:68:7c:60:33:15:11:69:af:9d:62: + 8d:a3:03:54:6b:a6:be:e5:ee:05:18:60:04:bf:42:80:fd:d0: + a8:a8:1e:01:3b:f7:a3:5c:af:a3:dc:e6:26:80:23:3c:b8:44: + 74:f7:0a:ae:49:8b:61:78:cc:24:bf:88:8a:a7:0e:ea:73:19: + 41:fd:4d:03:f0:88:d1:e5:78:8d:a5:2a:4f:f6:97:0d:17:77: + ca:d8 + +Verisign Class 2 Public Primary Certification Authority - G2 +============================================================ +MD5 Fingerprint: 2D:BB:E5:25:D3:D1:65:82:3A:B7:0E:FA:E6:EB:E2:E1 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns +YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe +Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj +IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx +KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM +HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw +DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC +AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji +nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX +rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn +jBJ7xUS0rg== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + b9:2f:60:cc:88:9f:a1:7a:46:09:b8:5b:70:6c:8a:af + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=VeriSign, Inc., OU=Class 2 Public Primary Certification Authority - G2, OU=(c) 1998 VeriSign, Inc. - For authorized use only, OU=VeriSign Trust Network + Validity + Not Before: May 18 00:00:00 1998 GMT + Not After : Aug 1 23:59:59 2028 GMT + Subject: C=US, O=VeriSign, Inc., OU=Class 2 Public Primary Certification Authority - G2, OU=(c) 1998 VeriSign, Inc. - For authorized use only, OU=VeriSign Trust Network + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:a7:88:01:21:74:2c:e7:1a:03:f0:98:e1:97:3c: + 0f:21:08:f1:9c:db:97:e9:9a:fc:c2:04:06:13:be: + 5f:52:c8:cc:1e:2c:12:56:2c:b8:01:69:2c:cc:99: + 1f:ad:b0:96:ae:79:04:f2:13:39:c1:7b:98:ba:08: + 2c:e8:c2:84:13:2c:aa:69:e9:09:f4:c7:a9:02:a4: + 42:c2:23:4f:4a:d8:f0:0e:a2:fb:31:6c:c9:e6:6f: + 99:27:07:f5:e6:f4:4c:78:9e:6d:eb:46:86:fa:b9: + 86:c9:54:f2:b2:c4:af:d4:46:1c:5a:c9:15:30:ff: + 0d:6c:f5:2d:0e:6d:ce:7f:77 + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 72:2e:f9:7f:d1:f1:71:fb:c4:9e:f6:c5:5e:51:8a:40:98:b8: + 68:f8:9b:1c:83:d8:e2:9d:bd:ff:ed:a1:e6:66:ea:2f:09:f4: + ca:d7:ea:a5:2b:95:f6:24:60:86:4d:44:2e:83:a5:c4:2d:a0: + d3:ae:78:69:6f:72:da:6c:ae:08:f0:63:92:37:e6:bb:c4:30: + 17:ad:77:cc:49:35:aa:cf:d8:8f:d1:be:b7:18:96:47:73:6a: + 54:22:34:64:2d:b6:16:9b:59:5b:b4:51:59:3a:b3:0b:14:f4: + 12:df:67:a0:f4:ad:32:64:5e:b1:46:72:27:8c:12:7b:c5:44: + b4:ae + +Verisign Class 2 Public Primary Certification Authority - G3 +============================================================ +MD5 Fingerprint: F8:BE:C4:63:22:C9:A8:46:74:8B:B8:1D:1E:4A:2B:F6 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy +aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp +Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp +Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g +Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU +J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO +JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY +wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o +koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN +qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E +Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe +xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u +7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI +sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP +cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + 61:70:cb:49:8c:5f:98:45:29:e7:b0:a6:d9:50:5b:7a + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 1999 VeriSign, Inc. - For authorized use only, CN=VeriSign Class 2 Public Primary Certification Authority - G3 + Validity + Not Before: Oct 1 00:00:00 1999 GMT + Not After : Jul 16 23:59:59 2036 GMT + Subject: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 1999 VeriSign, Inc. - For authorized use only, CN=VeriSign Class 2 Public Primary Certification Authority - G3 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:af:0a:0d:c2:d5:2c:db:67:b9:2d:e5:94:27:dd: + a5:be:e0:b0:4d:8f:b3:61:56:3c:d6:7c:c3:f4:cd: + 3e:86:cb:a2:88:e2:e1:d8:a4:69:c5:b5:e2:bf:c1: + a6:47:50:5e:46:39:8b:d5:96:ba:b5:6f:14:bf:10: + ce:27:13:9e:05:47:9b:31:7a:13:d8:1f:d9:d3:02: + 37:8b:ad:2c:47:f0:8e:81:06:a7:0d:30:0c:eb:f7: + 3c:0f:20:1d:dc:72:46:ee:a5:02:c8:5b:c3:c9:56: + 69:4c:c5:18:c1:91:7b:0b:d5:13:00:9b:bc:ef:c3: + 48:3e:46:60:20:85:2a:d5:90:b6:cd:8b:a0:cc:32: + dd:b7:fd:40:55:b2:50:1c:56:ae:cc:8d:77:4d:c7: + 20:4d:a7:31:76:ef:68:92:8a:90:1e:08:81:56:b2: + ad:69:a3:52:d0:cb:1c:c4:23:3d:1f:99:fe:4c:e8: + 16:63:8e:c6:08:8e:f6:31:f6:d2:fa:e5:76:dd:b5: + 1c:92:a3:49:cd:cd:01:cd:68:cd:a9:69:ba:a3:eb: + 1d:0d:9c:a4:20:a6:c1:a0:c5:d1:46:4c:17:6d:d2: + ac:66:3f:96:8c:e0:84:d4:36:ff:22:59:c5:f9:11: + 60:a8:5f:04:7d:f2:1a:f6:25:42:61:0f:c4:4a:b8: + 3e:89 + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 34:26:15:3c:c0:8d:4d:43:49:1d:bd:e9:21:92:d7:66:9c:b7: + de:c5:b8:d0:e4:5d:5f:76:22:c0:26:f9:84:3a:3a:f9:8c:b5: + fb:ec:60:f1:e8:ce:04:b0:c8:dd:a7:03:8f:30:f3:98:df:a4: + e6:a4:31:df:d3:1c:0b:46:dc:72:20:3f:ae:ee:05:3c:a4:33: + 3f:0b:39:ac:70:78:73:4b:99:2b:df:30:c2:54:b0:a8:3b:55: + a1:fe:16:28:cd:42:bd:74:6e:80:db:27:44:a7:ce:44:5d:d4: + 1b:90:98:0d:1e:42:94:b1:00:2c:04:d0:74:a3:02:05:22:63: + 63:cd:83:b5:fb:c1:6d:62:6b:69:75:fd:5d:70:41:b9:f5:bf: + 7c:df:be:c1:32:73:22:21:8b:58:81:7b:15:91:7a:ba:e3:64: + 48:b0:7f:fb:36:25:da:95:d0:f1:24:14:17:dd:18:80:6b:46: + 23:39:54:f5:8e:62:09:04:1d:94:90:a6:9b:e6:25:e2:42:45: + aa:b8:90:ad:be:08:8f:a9:0b:42:18:94:cf:72:39:e1:b1:43: + e0:28:cf:b7:e7:5a:6c:13:6b:49:b3:ff:e3:18:7c:89:8b:33: + 5d:ac:33:d7:a7:f9:da:3a:55:c9:58:10:f9:aa:ef:5a:b6:cf: + 4b:4b:df:2a + +Verisign Class 3 Public Primary Certification Authority +======================================================= +MD5 Fingerprint: 10:FC:63:5D:F6:26:3E:0D:F3:25:BE:5F:79:CD:67:67 +PEM Data: +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + 70:ba:e4:1d:10:d9:29:34:b6:38:ca:7b:03:cc:ba:bf + Signature Algorithm: md2WithRSAEncryption + Issuer: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority + Validity + Not Before: Jan 29 00:00:00 1996 GMT + Not After : Aug 1 23:59:59 2028 GMT + Subject: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:c9:5c:59:9e:f2:1b:8a:01:14:b4:10:df:04:40: + db:e3:57:af:6a:45:40:8f:84:0c:0b:d1:33:d9:d9: + 11:cf:ee:02:58:1f:25:f7:2a:a8:44:05:aa:ec:03: + 1f:78:7f:9e:93:b9:9a:00:aa:23:7d:d6:ac:85:a2: + 63:45:c7:72:27:cc:f4:4c:c6:75:71:d2:39:ef:4f: + 42:f0:75:df:0a:90:c6:8e:20:6f:98:0f:f8:ac:23: + 5f:70:29:36:a4:c9:86:e7:b1:9a:20:cb:53:a5:85: + e7:3d:be:7d:9a:fe:24:45:33:dc:76:15:ed:0f:a2: + 71:64:4c:65:2e:81:68:45:a7 + Exponent: 65537 (0x10001) + Signature Algorithm: md2WithRSAEncryption + bb:4c:12:2b:cf:2c:26:00:4f:14:13:dd:a6:fb:fc:0a:11:84: + 8c:f3:28:1c:67:92:2f:7c:b6:c5:fa:df:f0:e8:95:bc:1d:8f: + 6c:2c:a8:51:cc:73:d8:a4:c0:53:f0:4e:d6:26:c0:76:01:57: + 81:92:5e:21:f1:d1:b1:ff:e7:d0:21:58:cd:69:17:e3:44:1c: + 9c:19:44:39:89:5c:dc:9c:00:0f:56:8d:02:99:ed:a2:90:45: + 4c:e4:bb:10:a4:3d:f0:32:03:0e:f1:ce:f8:e8:c9:51:8c:e6: + 62:9f:e6:9f:c0:7d:b7:72:9c:c9:36:3a:6b:9f:4e:a8:ff:64: + 0d:64 + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ +MD5 Fingerprint: A2:33:9B:4C:74:78:73:D4:6C:E7:C1:F3:8D:CB:5C:E9 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + 7d:d9:fe:07:cf:a8:1e:b7:10:79:67:fb:a7:89:34:c6 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority - G2, OU=(c) 1998 VeriSign, Inc. - For authorized use only, OU=VeriSign Trust Network + Validity + Not Before: May 18 00:00:00 1998 GMT + Not After : Aug 1 23:59:59 2028 GMT + Subject: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority - G2, OU=(c) 1998 VeriSign, Inc. - For authorized use only, OU=VeriSign Trust Network + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:cc:5e:d1:11:5d:5c:69:d0:ab:d3:b9:6a:4c:99: + 1f:59:98:30:8e:16:85:20:46:6d:47:3f:d4:85:20: + 84:e1:6d:b3:f8:a4:ed:0c:f1:17:0f:3b:f9:a7:f9: + 25:d7:c1:cf:84:63:f2:7c:63:cf:a2:47:f2:c6:5b: + 33:8e:64:40:04:68:c1:80:b9:64:1c:45:77:c7:d8: + 6e:f5:95:29:3c:50:e8:34:d7:78:1f:a8:ba:6d:43: + 91:95:8f:45:57:5e:7e:c5:fb:ca:a4:04:eb:ea:97: + 37:54:30:6f:bb:01:47:32:33:cd:dc:57:9b:64:69: + 61:f8:9b:1d:1c:89:4f:5c:67 + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 51:4d:cd:be:5c:cb:98:19:9c:15:b2:01:39:78:2e:4d:0f:67: + 70:70:99:c6:10:5a:94:a4:53:4d:54:6d:2b:af:0d:5d:40:8b: + 64:d3:d7:ee:de:56:61:92:5f:a6:c4:1d:10:61:36:d3:2c:27: + 3c:e8:29:09:b9:11:64:74:cc:b5:73:9f:1c:48:a9:bc:61:01: + ee:e2:17:a6:0c:e3:40:08:3b:0e:e7:eb:44:73:2a:9a:f1:69: + 92:ef:71:14:c3:39:ac:71:a7:91:09:6f:e4:71:06:b3:ba:59: + 57:26:79:00:f6:f8:0d:a2:33:30:28:d4:aa:58:a0:9d:9d:69: + 91:fd + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +MD5 Fingerprint: CD:68:B6:A7:C7:C4:CE:75:E0:1D:4F:57:44:61:92:09 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + 9b:7e:06:49:a3:3e:62:b9:d5:ee:90:48:71:29:ef:57 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 1999 VeriSign, Inc. - For authorized use only, CN=VeriSign Class 3 Public Primary Certification Authority - G3 + Validity + Not Before: Oct 1 00:00:00 1999 GMT + Not After : Jul 16 23:59:59 2036 GMT + Subject: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 1999 VeriSign, Inc. - For authorized use only, CN=VeriSign Class 3 Public Primary Certification Authority - G3 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:cb:ba:9c:52:fc:78:1f:1a:1e:6f:1b:37:73:bd: + f8:c9:6b:94:12:30:4f:f0:36:47:f5:d0:91:0a:f5: + 17:c8:a5:61:c1:16:40:4d:fb:8a:61:90:e5:76:20: + c1:11:06:7d:ab:2c:6e:a6:f5:11:41:8e:fa:2d:ad: + 2a:61:59:a4:67:26:4c:d0:e8:bc:52:5b:70:20:04: + 58:d1:7a:c9:a4:69:bc:83:17:64:ad:05:8b:bc:d0: + 58:ce:8d:8c:f5:eb:f0:42:49:0b:9d:97:27:67:32: + 6e:e1:ae:93:15:1c:70:bc:20:4d:2f:18:de:92:88: + e8:6c:85:57:11:1a:e9:7e:e3:26:11:54:a2:45:96: + 55:83:ca:30:89:e8:dc:d8:a3:ed:2a:80:3f:7f:79: + 65:57:3e:15:20:66:08:2f:95:93:bf:aa:47:2f:a8: + 46:97:f0:12:e2:fe:c2:0a:2b:51:e6:76:e6:b7:46: + b7:e2:0d:a6:cc:a8:c3:4c:59:55:89:e6:e8:53:5c: + 1c:ea:9d:f0:62:16:0b:a7:c9:5f:0c:f0:de:c2:76: + ce:af:f7:6a:f2:fa:41:a6:a2:33:14:c9:e5:7a:63: + d3:9e:62:37:d5:85:65:9e:0e:e6:53:24:74:1b:5e: + 1d:12:53:5b:c7:2c:e7:83:49:3b:15:ae:8a:68:b9: + 57:97 + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 11:14:96:c1:ab:92:08:f7:3f:2f:c9:b2:fe:e4:5a:9f:64:de: + db:21:4f:86:99:34:76:36:57:dd:d0:15:2f:c5:ad:7f:15:1f: + 37:62:73:3e:d4:e7:5f:ce:17:03:db:35:fa:2b:db:ae:60:09: + 5f:1e:5f:8f:6e:bb:0b:3d:ea:5a:13:1e:0c:60:6f:b5:c0:b5: + 23:22:2e:07:0b:cb:a9:74:cb:47:bb:1d:c1:d7:a5:6b:cc:2f: + d2:42:fd:49:dd:a7:89:cf:53:ba:da:00:5a:28:bf:82:df:f8: + ba:13:1d:50:86:82:fd:8e:30:8f:29:46:b0:1e:3d:35:da:38: + 62:16:18:4a:ad:e6:b6:51:6c:de:af:62:eb:01:d0:1e:24:fe: + 7a:8f:12:1a:12:68:b8:fb:66:99:14:14:45:5c:ae:e7:ae:69: + 17:81:2b:5a:37:c9:5e:2a:f4:c6:e2:a1:5c:54:9b:a6:54:00: + cf:f0:f1:c1:c7:98:30:1a:3b:36:16:db:a3:6e:ea:fd:ad:b2: + c2:da:ef:02:47:13:8a:c0:f1:b3:31:ad:4f:1c:e1:4f:9c:af: + 0f:0c:9d:f7:78:0d:d8:f4:35:56:80:da:b7:6d:17:8f:9d:1e: + 81:64:e1:fe:c5:45:ba:ad:6b:b9:0a:7a:4e:4f:4b:84:ee:4b: + f1:7d:dd:11 + +Verisign Class 4 Public Primary Certification Authority - G2 +============================================================ +MD5 Fingerprint: 26:6D:2C:19:98:B6:70:68:38:50:54:19:EC:90:34:60 +PEM Data: +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM +HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK +qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj +cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y +cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP +T8qAkbYp +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + 32:88:8e:9a:d2:f5:eb:13:47:f8:7f:c4:20:37:25:f8 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=VeriSign, Inc., OU=Class 4 Public Primary Certification Authority - G2, OU=(c) 1998 VeriSign, Inc. - For authorized use only, OU=VeriSign Trust Network + Validity + Not Before: May 18 00:00:00 1998 GMT + Not After : Aug 1 23:59:59 2028 GMT + Subject: C=US, O=VeriSign, Inc., OU=Class 4 Public Primary Certification Authority - G2, OU=(c) 1998 VeriSign, Inc. - For authorized use only, OU=VeriSign Trust Network + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:ba:f0:e4:cf:f9:c4:ae:85:54:b9:07:57:f9:8f: + c5:7f:68:11:f8:c4:17:b0:44:dc:e3:30:73:d5:2a: + 62:2a:b8:d0:cc:1c:ed:28:5b:7e:bd:6a:dc:b3:91: + 24:ca:41:62:3c:fc:02:01:bf:1c:16:31:94:05:97: + 76:6e:a2:ad:bd:61:17:6c:4e:30:86:f0:51:37:2a: + 50:c7:a8:62:81:dc:5b:4a:aa:c1:a0:b4:6e:eb:2f: + e5:57:c5:b1:2b:40:70:db:5a:4d:a1:8e:1f:bd:03: + 1f:d8:03:d4:8f:4c:99:71:bc:e2:82:cc:58:e8:98: + 3a:86:d3:86:38:f3:00:29:1f + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 85:8c:12:c1:a7:b9:50:15:7a:cb:3e:ac:b8:43:8a:dc:aa:dd: + 14:ba:89:81:7e:01:3c:23:71:21:88:2f:82:dc:63:fa:02:45: + ac:45:59:d7:2a:58:44:5b:b7:9f:81:3b:92:68:3d:e2:37:24: + f5:7b:6c:8f:76:35:96:09:a8:59:9d:b9:ce:23:ab:74:d6:83: + fd:32:73:27:d8:69:3e:43:74:f6:ae:c5:89:9a:e7:53:7c:e9: + 7b:f6:4b:f3:c1:65:83:de:8d:8a:9c:3c:88:8d:39:59:fc:aa: + 3f:22:8d:a1:c1:66:50:81:72:4c:ed:22:64:4f:4f:ca:80:91: + b6:29 + +Verisign Class 4 Public Primary Certification Authority - G3 +============================================================ +MD5 Fingerprint: DB:C8:F2:27:2E:B1:EA:6A:29:23:5D:FE:56:3E:33:DF +PEM Data: +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 +GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ ++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd +U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm +NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ +ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 +CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq +g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c +2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ +bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + ec:a0:a7:8b:6e:75:6a:01:cf:c4:7c:cc:2f:94:5e:d7 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 1999 VeriSign, Inc. - For authorized use only, CN=VeriSign Class 4 Public Primary Certification Authority - G3 + Validity + Not Before: Oct 1 00:00:00 1999 GMT + Not After : Jul 16 23:59:59 2036 GMT + Subject: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 1999 VeriSign, Inc. - For authorized use only, CN=VeriSign Class 4 Public Primary Certification Authority - G3 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:ad:cb:a5:11:69:c6:59:ab:f1:8f:b5:19:0f:56: + ce:cc:b5:1f:20:e4:9e:26:25:4b:e0:73:65:89:59: + de:d0:83:e4:f5:0f:b5:bb:ad:f1:7c:e8:21:fc:e4: + e8:0c:ee:7c:45:22:19:76:92:b4:13:b7:20:5b:09: + fa:61:ae:a8:f2:a5:8d:85:c2:2a:d6:de:66:36:d2: + 9b:02:f4:a8:92:60:7c:9c:69:b4:8f:24:1e:d0:86: + 52:f6:32:9c:41:58:1e:22:bd:cd:45:62:95:08:6e: + d0:66:dd:53:a2:cc:f0:10:dc:54:73:8b:04:a1:46: + 33:33:5c:17:40:b9:9e:4d:d3:f3:be:55:83:e8:b1: + 89:8e:5a:7c:9a:96:22:90:3b:88:25:f2:d2:53:88: + 02:0c:0b:78:f2:e6:37:17:4b:30:46:07:e4:80:6d: + a6:d8:96:2e:e8:2c:f8:11:b3:38:0d:66:a6:9b:ea: + c9:23:5b:db:8e:e2:f3:13:8e:1a:59:2d:aa:02:f0: + ec:a4:87:66:dc:c1:3f:f5:d8:b9:f4:ec:82:c6:d2: + 3d:95:1d:e5:c0:4f:84:c9:d9:a3:44:28:06:6a:d7: + 45:ac:f0:6b:6a:ef:4e:5f:f8:11:82:1e:38:63:34: + 66:50:d4:3e:93:73:fa:30:c3:66:ad:ff:93:2d:97: + ef:03 + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 8f:fa:25:6b:4f:5b:e4:a4:4e:27:55:ab:22:15:59:3c:ca:b5: + 0a:d4:4a:db:ab:dd:a1:5f:53:c5:a0:57:39:c2:ce:47:2b:be: + 3a:c8:56:bf:c2:d9:27:10:3a:b1:05:3c:c0:77:31:bb:3a:d3: + 05:7b:6d:9a:1c:30:8c:80:cb:93:93:2a:83:ab:05:51:82:02: + 00:11:67:6b:f3:88:61:47:5f:03:93:d5:5b:0d:e0:f1:d4:a1: + 32:35:85:b2:3a:db:b0:82:ab:d1:cb:0a:bc:4f:8c:5b:c5:4b: + 00:3b:1f:2a:82:a6:7e:36:85:dc:7e:3c:67:00:b5:e4:3b:52: + e0:a8:eb:5d:15:f9:c6:6d:f0:ad:1d:0e:85:b7:a9:9a:73:14: + 5a:5b:8f:41:28:c0:d5:e8:2d:4d:a4:5e:cd:aa:d9:ed:ce:dc: + d8:d5:3c:42:1d:17:c1:12:5d:45:38:c3:38:f3:fc:85:2e:83: + 46:48:b2:d7:20:5f:92:36:8f:e7:79:0f:98:5e:99:e8:f0:d0: + a4:bb:f5:53:bd:2a:ce:59:b0:af:6e:7f:6c:bb:d2:1e:00:b0: + 21:ed:f8:41:62:82:b9:d8:b2:c4:bb:46:50:f3:31:c5:8f:01: + a8:74:eb:f5:78:27:da:e7:f7:66:43:f3:9e:83:3e:20:aa:c3: + 35:60:91:ce + +Verisign/RSA Commercial CA +========================== +MD5 Fingerprint: 5A:0B:DD:42:9E:B2:B4:62:97:32:7F:7F:0A:AA:9A:39 +PEM Data: +-----BEGIN CERTIFICATE----- +MIICIzCCAZACBQJBAAAWMA0GCSqGSIb3DQEBAgUAMFwxCzAJBgNVBAYTAlVTMSAw +HgYDVQQKExdSU0EgRGF0YSBTZWN1cml0eSwgSW5jLjErMCkGA1UECxMiQ29tbWVy +Y2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NDExMDQxODU4MzRaFw05 +OTExMDMxODU4MzRaMFwxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdSU0EgRGF0YSBT +ZWN1cml0eSwgSW5jLjErMCkGA1UECxMiQ29tbWVyY2lhbCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTCBmzANBgkqhkiG9w0BAQEFAAOBiQAwgYUCfgCk+4Fie84QJ93o +975sbsZwmdu41QUDaSiCnHJ/lj+O7Kwpkj+KFPhCdr69XQO5kNTQvAayUTNfxMK/ +touPmbZiImDd298ggrTKoi8tUO2UMt7gVY3UaOLgTNLNBRYulWZcYVI4HlGogqHE +7yXpCuaLK44xZtn42f29O2nZ6wIDAQABMA0GCSqGSIb3DQEBAgUAA34AdrW2EP4j +9/dZYkuwX5zBaLxJu7NJbyFHXSudVMQAKD+YufKKg5tgf+tQx6sFEC097TgCwaVI +0v5loMC86qYjFmZsGySp8+x5NRhPJsjjr1BKx6cxa9B8GJ1Qv6km+iYrRpwUqbtb +MJhCKLVLU7tDCZJAuqiqWqTGtotXTcU= +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + 02:41:00:00:16 + Signature Algorithm: md2WithRSAEncryption + Issuer: C=US, O=RSA Data Security, Inc., OU=Commercial Certification Authority + Validity + Not Before: Nov 4 18:58:34 1994 GMT + Not After : Nov 3 18:58:34 1999 GMT + Subject: C=US, O=RSA Data Security, Inc., OU=Commercial Certification Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1000 bit) + Modulus (1000 bit): + 00:a4:fb:81:62:7b:ce:10:27:dd:e8:f7:be:6c:6e: + c6:70:99:db:b8:d5:05:03:69:28:82:9c:72:7f:96: + 3f:8e:ec:ac:29:92:3f:8a:14:f8:42:76:be:bd:5d: + 03:b9:90:d4:d0:bc:06:b2:51:33:5f:c4:c2:bf:b6: + 8b:8f:99:b6:62:22:60:dd:db:df:20:82:b4:ca:a2: + 2f:2d:50:ed:94:32:de:e0:55:8d:d4:68:e2:e0:4c: + d2:cd:05:16:2e:95:66:5c:61:52:38:1e:51:a8:82: + a1:c4:ef:25:e9:0a:e6:8b:2b:8e:31:66:d9:f8:d9: + fd:bd:3b:69:d9:eb + Exponent: 65537 (0x10001) + Signature Algorithm: md2WithRSAEncryption + 76:b5:b6:10:fe:23:f7:f7:59:62:4b:b0:5f:9c:c1:68:bc:49: + bb:b3:49:6f:21:47:5d:2b:9d:54:c4:00:28:3f:98:b9:f2:8a: + 83:9b:60:7f:eb:50:c7:ab:05:10:2d:3d:ed:38:02:c1:a5:48: + d2:fe:65:a0:c0:bc:ea:a6:23:16:66:6c:1b:24:a9:f3:ec:79: + 35:18:4f:26:c8:e3:af:50:4a:c7:a7:31:6b:d0:7c:18:9d:50: + bf:a9:26:fa:26:2b:46:9c:14:a9:bb:5b:30:98:42:28:b5:4b: + 53:bb:43:09:92:40:ba:a8:aa:5a:a4:c6:b6:8b:57:4d:c5 + +Verisign/RSA Secure Server CA +============================= +MD5 Fingerprint: 74:7B:82:03:43:F0:00:9E:6B:B3:EC:47:BF:85:A5:93 +PEM Data: +-----BEGIN CERTIFICATE----- +MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD +VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0 +MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV +BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy +dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ +ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII +0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI +uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI +hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3 +YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc +1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 1 (0x0) + Serial Number: + 02:ad:66:7e:4e:45:fe:5e:57:6f:3c:98:19:5e:dd:c0 + Signature Algorithm: md2WithRSAEncryption + Issuer: C=US, O=RSA Data Security, Inc., OU=Secure Server Certification Authority + Validity + Not Before: Nov 9 00:00:00 1994 GMT + Not After : Jan 7 23:59:59 2010 GMT + Subject: C=US, O=RSA Data Security, Inc., OU=Secure Server Certification Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1000 bit) + Modulus (1000 bit): + 00:92:ce:7a:c1:ae:83:3e:5a:aa:89:83:57:ac:25: + 01:76:0c:ad:ae:8e:2c:37:ce:eb:35:78:64:54:03: + e5:84:40:51:c9:bf:8f:08:e2:8a:82:08:d2:16:86: + 37:55:e9:b1:21:02:ad:76:68:81:9a:05:a2:4b:c9: + 4b:25:66:22:56:6c:88:07:8f:f7:81:59:6d:84:07: + 65:70:13:71:76:3e:9b:77:4c:e3:50:89:56:98:48: + b9:1d:a7:29:1a:13:2e:4a:11:59:9c:1e:15:d5:49: + 54:2c:73:3a:69:82:b1:97:39:9c:6d:70:67:48:e5: + dd:2d:d6:c8:1e:7b + Exponent: 65537 (0x10001) + Signature Algorithm: md2WithRSAEncryption + 65:dd:7e:e1:b2:ec:b0:e2:3a:e0:ec:71:46:9a:19:11:b8:d3: + c7:a0:b4:03:40:26:02:3e:09:9c:e1:12:b3:d1:5a:f6:37:a5: + b7:61:03:b6:5b:16:69:3b:c6:44:08:0c:88:53:0c:6b:97:49: + c7:3e:35:dc:6c:b9:bb:aa:df:5c:bb:3a:2f:93:60:b6:a9:4b: + 4d:f2:20:f7:cd:5f:7f:64:7b:8e:dc:00:5c:d7:fa:77:ca:39: + 16:59:6f:0e:ea:d3:b5:83:7f:4d:4d:42:56:76:b4:c9:5f:04: + f8:38:f8:eb:d2:5f:75:5f:cd:7b:fc:e5:8e:80:7c:fc:50 + + +UTN-USERFirst-Network Applications +================================== +MD5 Fingerprint: BF:60:59:A3:5B:BA:F6:A7:76:42:DA:6F:1A:7B:50:CF +PEM Data: +-----BEGIN CERTIFICATE----- +MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB +ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt +TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1 +NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD +VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS +Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2 +N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH +iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe +YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1 +axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g +yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD +AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh +ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V +VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB +BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y +IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs +QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4 +ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM +YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb +QErNaLly7HF27FSOH4UMAWr6pjisH8SE +-----END CERTIFICATE----- +Certificate Ingredients: + Data: + Version: 3 (0x2) + Serial Number: + 44:be:0c:8b:50:00:24:b4:11:d3:36:30:4b:c0:33:77 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, ST=UT, L=Salt Lake City, O=The USERTRUST Network, OU=http://www.usertrust.com, CN=UTN-USERFirst-Network Applications + Validity + Not Before: Jul 9 18:48:39 1999 GMT + Not After : Jul 9 18:57:49 2019 GMT + Subject: C=US, ST=UT, L=Salt Lake City, O=The USERTRUST Network, OU=http://www.usertrust.com, CN=UTN-USERFirst-Network Applications + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:b3:fb:91:a1:e4:36:55:85:ac:06:34:5b:a0:9a: + 58:b2:f8:b5:0f:05:77:83:ae:32:b1:76:92:68:ec: + 23:4a:c9:76:3f:e3:9c:b6:37:79:03:b9:ab:69:8d: + 07:25:b6:19:67:e4:b0:1b:18:73:61:4a:e8:7e:cd: + d3:2f:64:e3:a6:7c:0c:fa:17:80:a3:0d:47:89:4f: + 51:71:2f:ee:fc:3f:f9:b8:16:80:87:89:93:25:20: + 9a:43:82:69:24:76:28:59:35:a1:1d:c0:7f:83:06: + 64:16:20:2c:d3:49:a4:85:b4:c0:61:7f:51:08:f8: + 68:15:91:80:cb:a5:d5:ee:3b:3a:f4:84:04:5e:60: + 59:a7:8c:34:72:ee:b8:78:c5:d1:3b:12:4a:6f:7e: + 65:27:b9:a4:55:c5:b9:6f:43:a4:c5:1d:2c:99:c0: + 52:a4:78:4c:15:b3:40:98:08:6b:43:c6:01:b0:7a: + 7b:f5:6b:1c:22:3f:cb:ef:ff:a8:d0:3a:4b:76:15: + 9e:d2:d1:c6:2e:e3:db:57:1b:32:a2:b8:6f:e8:86: + a6:3f:70:ab:e5:70:92:ab:44:1e:40:50:fb:9c:a3: + 62:e4:6c:6e:a0:c8:de:e2:80:42:fa:e9:2f:e8:ce: + 32:04:8f:7c:8d:b7:1c:a3:35:3c:15:dd:9e:c3:ae: + 97:a5 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: + Digital Signature, Non Repudiation, Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Subject Key Identifier: + FA:86:C9:DB:E0:BA:E9:78:F5:4B:A8:D6:15:DF:F0:D3:E1:6A:14:3C + X509v3 CRL Distribution Points: + URI:http://crl.usertrust.com/UTN-USERFirst-NetworkApplications.crl + + Signature Algorithm: sha1WithRSAEncryption + a4:f3:25:cc:d1:d4:91:83:22:d0:cc:32:ab:9b:96:4e:34:91: + 54:20:25:34:61:5f:2a:02:15:e1:8b:aa:ff:7d:64:51:cf:0a: + ff:bc:7d:d8:21:6a:78:cb:2f:51:6f:f8:42:1d:33:bd:eb:b5: + 7b:94:c3:c3:a9:a0:2d:df:d1:29:1f:1d:fe:8f:3f:bb:a8:45: + 2a:7f:d1:6e:55:24:e2:bb:02:fb:31:3f:be:e8:bc:ec:40:2b: + f8:01:d4:56:38:e4:ca:44:82:b5:61:20:21:67:65:f6:f0:0b: + e7:34:f8:a5:c2:9c:a3:5c:40:1f:85:93:95:06:de:4f:d4:27: + a9:b6:a5:fc:16:cd:73:31:3f:b8:65:27:cf:d4:53:1a:f0:ac: + 6e:9f:4f:05:0c:03:81:a7:84:29:c4:5a:bd:64:57:72:ad:3b: + cf:37:18:a6:98:c6:ad:06:b4:dc:08:a3:04:d5:29:a4:96:9a: + 12:67:4a:8c:60:45:9d:f1:23:9a:b0:00:9c:68:b5:98:50:d3: + ef:8e:2e:92:65:b1:48:3e:21:be:15:30:2a:0d:b5:0c:a3:6b: + 3f:ae:7f:57:f5:1f:96:7c:df:6f:dd:82:30:2c:65:1b:40:4a: + cd:68:b9:72:ec:71:76:ec:54:8e:1f:85:0c:01:6a:fa:a6:38: + ac:1f:c4:84 +# +# RHNS CA certificate. Appended to the ca-bundle at package build-time. +# +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 0 (0x0) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=US, ST=North Carolina, L=Research Triangle Park, O=Red Hat, Inc., OU=Red Hat Network Services, CN=RHNS Certificate Authority/Email=rhns@redhat.com + Validity + Not Before: Aug 23 22:45:55 2000 GMT + Not After : Aug 28 22:45:55 2003 GMT + Subject: C=US, ST=North Carolina, L=Research Triangle Park, O=Red Hat, Inc., OU=Red Hat Network Services, CN=RHNS Certificate Authority/Email=rhns@redhat.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:c0:68:2b:12:30:e2:21:2d:22:c6:72:71:5b:bf: + 17:a0:93:10:e9:9b:e3:c9:8d:3b:2d:ac:c4:bb:95: + 3b:e0:ca:55:32:dc:95:c2:10:b3:04:b2:51:fb:e8: + 85:61:16:34:a5:b4:1d:67:5c:a7:77:f4:f0:92:da: + b4:8b:af:95:93:62:f3:66:29:ae:c0:88:b7:64:84: + 0e:48:90:60:f8:60:3e:00:7f:54:dd:17:a6:ac:18: + e0:42:de:7c:be:90:81:f7:f4:05:85:0a:08:cc:d5: + f2:9f:fc:24:8b:77:a5:3d:e9:48:a9:ef:0f:3b:63: + a3:fe:a6:83:4c:e8:dc:0b:77 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 54:15:CD:9F:2C:F7:EC:0D:1F:D2:A8:BE:4C:07:AC:88:3E:FB:9B:0A + X509v3 Authority Key Identifier: + keyid:54:15:CD:9F:2C:F7:EC:0D:1F:D2:A8:BE:4C:07:AC:88:3E:FB:9B:0A + DirName:/C=US/ST=North Carolina/L=Research Triangle Park/O=Red Hat, Inc./OU=Red Hat Network Services/CN=RHNS Certificate Authority/Email=rhns@redhat.com + serial:00 + + X509v3 Basic Constraints: + CA:TRUE + Signature Algorithm: md5WithRSAEncryption + 93:01:88:88:67:67:91:8c:9e:d0:12:14:90:71:12:87:55:0a: + f2:52:1b:ad:f2:d3:07:1d:af:70:99:bb:b0:cd:80:23:c9:ed: + 2b:73:e9:63:b1:d0:b3:8c:60:c5:42:64:a6:c1:95:56:90:c5: + 35:06:03:58:f5:8e:2b:d9:f9:a9:a0:10:a9:99:f7:15:42:92: + a5:50:d7:11:07:f1:02:d5:e0:70:e4:55:6e:2a:ce:25:f8:5d: + cd:0b:2f:10:61:f8:f6:20:42:cc:c3:89:f8:8a:4f:82:24:12: + cf:39:7f:21:a8:2c:8d:52:97:52:c5:f7:5f:42:a5:87:09:66: + b0:cc +-----BEGIN CERTIFICATE----- +MIIEMDCCA5mgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBxzELMAkGA1UEBhMCVVMx +FzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMR8wHQYDVQQHExZSZXNlYXJjaCBUcmlh +bmdsZSBQYXJrMRYwFAYDVQQKEw1SZWQgSGF0LCBJbmMuMSEwHwYDVQQLExhSZWQg +SGF0IE5ldHdvcmsgU2VydmljZXMxIzAhBgNVBAMTGlJITlMgQ2VydGlmaWNhdGUg +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9yaG5zQHJlZGhhdC5jb20wHhcNMDAw +ODIzMjI0NTU1WhcNMDMwODI4MjI0NTU1WjCBxzELMAkGA1UEBhMCVVMxFzAVBgNV +BAgTDk5vcnRoIENhcm9saW5hMR8wHQYDVQQHExZSZXNlYXJjaCBUcmlhbmdsZSBQ +YXJrMRYwFAYDVQQKEw1SZWQgSGF0LCBJbmMuMSEwHwYDVQQLExhSZWQgSGF0IE5l +dHdvcmsgU2VydmljZXMxIzAhBgNVBAMTGlJITlMgQ2VydGlmaWNhdGUgQXV0aG9y +aXR5MR4wHAYJKoZIhvcNAQkBFg9yaG5zQHJlZGhhdC5jb20wgZ8wDQYJKoZIhvcN +AQEBBQADgY0AMIGJAoGBAMBoKxIw4iEtIsZycVu/F6CTEOmb48mNOy2sxLuVO+DK +VTLclcIQswSyUfvohWEWNKW0HWdcp3f08JLatIuvlZNi82YprsCIt2SEDkiQYPhg +PgB/VN0XpqwY4ELefL6Qgff0BYUKCMzV8p/8JIt3pT3pSKnvDztjo/6mg0zo3At3 +AgMBAAGjggEoMIIBJDAdBgNVHQ4EFgQUVBXNnyz37A0f0qi+TAesiD77mwowgfQG +A1UdIwSB7DCB6YAUVBXNnyz37A0f0qi+TAesiD77mwqhgc2kgcowgccxCzAJBgNV +BAYTAlVTMRcwFQYDVQQIEw5Ob3J0aCBDYXJvbGluYTEfMB0GA1UEBxMWUmVzZWFy +Y2ggVHJpYW5nbGUgUGFyazEWMBQGA1UEChMNUmVkIEhhdCwgSW5jLjEhMB8GA1UE +CxMYUmVkIEhhdCBOZXR3b3JrIFNlcnZpY2VzMSMwIQYDVQQDExpSSE5TIENlcnRp +ZmljYXRlIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPcmhuc0ByZWRoYXQuY29t +ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAkwGIiGdnkYye0BIU +kHESh1UK8lIbrfLTBx2vcJm7sM2AI8ntK3PpY7HQs4xgxUJkpsGVVpDFNQYDWPWO +K9n5qaAQqZn3FUKSpVDXEQfxAtXgcORVbirOJfhdzQsvEGH49iBCzMOJ+IpPgiQS +zzl/IagsjVKXUsX3X0KlhwlmsMw= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 0 (0x0) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=US, ST=North Carolina, L=Raleigh, O=Red Hat, Inc., OU=Red Hat Network, CN=RHN Certificate Authority/Email=rhn-noc@redhat.com + Validity + Not Before: Sep 5 20:45:16 2002 GMT + Not After : Sep 9 20:45:16 2007 GMT + Subject: C=US, ST=North Carolina, L=Raleigh, O=Red Hat, Inc., OU=Red Hat Network, CN=RHN Certificate Authority/Email=rhn-noc@redhat.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:b3:16:b7:c5:f5:b9:69:51:1f:cd:b4:3d:70:cf: + 60:57:85:a4:2a:a7:5d:28:22:0e:ec:19:e2:92:f7: + 48:97:a6:a6:1f:51:95:83:11:8f:9a:98:a2:90:e0: + cb:4a:24:19:94:a8:8a:4b:88:b4:06:6c:ce:77:d7: + 15:3b:3c:cd:66:83:cf:23:1d:0d:bc:0a:0c:cb:1f: + cb:40:fb:f3:d9:fe:2a:b4:85:2c:7b:c9:a1:fe:f3: + 8f:68:1d:f2:12:b1:a4:16:19:ce:0f:b8:9a:9c:d9: + bc:5f:49:62:b2:95:93:ce:5d:2e:dd:79:3c:f1:5b: + a6:b7:a2:b5:39:0d:8e:12:31 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 7F:1B:64:A1:2E:02:C5:A8:7D:B8:D1:B1:8B:06:9D:A3:A9:50:63:92 + X509v3 Authority Key Identifier: + keyid:7F:1B:64:A1:2E:02:C5:A8:7D:B8:D1:B1:8B:06:9D:A3:A9:50:63:92 + DirName:/C=US/ST=North Carolina/L=Raleigh/O=Red Hat, Inc./OU=Red Hat Network/CN=RHN Certificate Authority/Email=rhn-noc@redhat.com + serial:00 + + X509v3 Basic Constraints: + CA:TRUE + Signature Algorithm: md5WithRSAEncryption + 28:4d:42:e5:34:22:dd:c6:86:63:04:75:52:67:17:45:72:f2: + 3b:21:2b:45:59:72:73:f7:59:36:9d:57:43:c6:dc:94:0f:0e: + ff:13:5c:4f:50:37:85:b2:e4:c2:1f:35:9f:74:f4:e7:53:fb: + a1:06:b8:39:ce:e4:0a:86:7b:5f:28:5d:c7:11:9e:12:a5:d6: + b9:6c:e9:18:09:d5:f0:42:e7:54:b5:91:9e:23:ad:12:7a:aa: + 72:7c:39:3c:83:f8:75:a4:7b:03:92:ff:2a:d4:c5:76:19:12: + fa:b4:3b:b0:89:2c:95:8c:01:90:0d:d8:ba:06:05:61:00:ac: + 95:da +-----BEGIN CERTIFICATE----- +MIID7jCCA1egAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsTELMAkGA1UEBhMCVVMx +FzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRAwDgYDVQQHEwdSYWxlaWdoMRYwFAYD +VQQKEw1SZWQgSGF0LCBJbmMuMRgwFgYDVQQLEw9SZWQgSGF0IE5ldHdvcmsxIjAg +BgNVBAMTGVJITiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEW +EnJobi1ub2NAcmVkaGF0LmNvbTAeFw0wMjA5MDUyMDQ1MTZaFw0wNzA5MDkyMDQ1 +MTZaMIGxMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExEDAO +BgNVBAcTB1JhbGVpZ2gxFjAUBgNVBAoTDVJlZCBIYXQsIEluYy4xGDAWBgNVBAsT +D1JlZCBIYXQgTmV0d29yazEiMCAGA1UEAxMZUkhOIENlcnRpZmljYXRlIEF1dGhv +cml0eTEhMB8GCSqGSIb3DQEJARYScmhuLW5vY0ByZWRoYXQuY29tMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCzFrfF9blpUR/NtD1wz2BXhaQqp10oIg7sGeKS +90iXpqYfUZWDEY+amKKQ4MtKJBmUqIpLiLQGbM531xU7PM1mg88jHQ28CgzLH8tA ++/PZ/iq0hSx7yaH+849oHfISsaQWGc4PuJqc2bxfSWKylZPOXS7deTzxW6a3orU5 +DY4SMQIDAQABo4IBEjCCAQ4wHQYDVR0OBBYEFH8bZKEuAsWofbjRsYsGnaOpUGOS +MIHeBgNVHSMEgdYwgdOAFH8bZKEuAsWofbjRsYsGnaOpUGOSoYG3pIG0MIGxMQsw +CQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExEDAOBgNVBAcTB1Jh +bGVpZ2gxFjAUBgNVBAoTDVJlZCBIYXQsIEluYy4xGDAWBgNVBAsTD1JlZCBIYXQg +TmV0d29yazEiMCAGA1UEAxMZUkhOIENlcnRpZmljYXRlIEF1dGhvcml0eTEhMB8G +CSqGSIb3DQEJARYScmhuLW5vY0ByZWRoYXQuY29tggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEEBQADgYEAKE1C5TQi3caGYwR1UmcXRXLyOyErRVlyc/dZNp1X +Q8bclA8O/xNcT1A3hbLkwh81n3T051P7oQa4Oc7kCoZ7XyhdxxGeEqXWuWzpGAnV +8ELnVLWRniOtEnqqcnw5PIP4daR7A5L/KtTFdhkS+rQ7sIkslYwBkA3YugYFYQCs +ldo= +-----END CERTIFICATE----- + +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 0 (0x0) + Signature Algorithm: md5WithRSAEncryption + Issuer: C=US, ST=North Carolina, L=Raleigh, O=Red Hat, Inc., OU=Red Hat Network, CN=RHN Certificate Authority/emailAddress=rhn-noc@redhat.com + Validity + Not Before: Aug 29 02:10:55 2003 GMT + Not After : Aug 26 02:10:55 2013 GMT + Subject: C=US, ST=North Carolina, L=Raleigh, O=Red Hat, Inc., OU=Red Hat Network, CN=RHN Certificate Authority/emailAddress=rhn-noc@redhat.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:bf:61:63:eb:3d:8b:2b:45:48:e6:c2:fb:7c:d2: + 21:21:b8:ec:90:93:41:30:7c:2c:8d:79:d5:14:e9: + 0e:7e:3f:ef:d6:0a:9b:0a:a6:02:52:01:2d:26:96: + a4:ed:bd:a9:9e:aa:08:03:c1:61:0a:41:80:ea:ae: + 74:cc:61:26:d0:05:91:55:3e:66:14:a2:20:b3:d6: + 9d:71:0c:ab:77:cc:f4:f0:11:b5:25:33:8a:4e:22: + 9a:10:36:67:fa:11:6d:48:76:3a:1f:d2:e3:44:7b: + 89:66:be:b4:85:fb:2f:a6:aa:13:fa:9a:6d:c9:bb: + 18:c4:04:af:4f:15:69:89:9b + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 69:44:27:05:DC:2E:ED:A5:F4:81:C4:D7:78:45:E7:44:5D:F8:87:47 + X509v3 Authority Key Identifier: + keyid:69:44:27:05:DC:2E:ED:A5:F4:81:C4:D7:78:45:E7:44:5D:F8:87:47 + DirName:/C=US/ST=North Carolina/L=Raleigh/O=Red Hat, Inc./OU=Red Hat Network/CN=RHN Certificate Authority/emailAddress=rhn-noc@redhat.com + serial:00 + + X509v3 Basic Constraints: + CA:TRUE + Signature Algorithm: md5WithRSAEncryption + 23:c9:ca:07:9f:5e:96:39:83:e0:4e:da:dd:47:84:30:ca:d4: + d5:38:86:f9:de:88:83:ca:2c:47:26:36:ab:f4:14:1e:28:29: + de:7d:10:4a:5e:91:3e:5a:99:07:0c:a9:2e:e3:fb:78:44:49: + c5:32:d6:e8:7a:97:ff:29:d0:33:ae:26:ba:76:06:7e:79:97: + 17:0c:4f:2d:2a:8b:8a:ac:41:59:ae:e9:c4:55:2d:b9:88:df: + 9b:7b:41:f8:32:2e:ee:c9:c0:59:e2:30:57:5e:37:47:29:c0: + 2d:78:33:d3:ce:a3:2b:dc:84:da:bf:3b:2e:4b:b6:b3:b6:4e: + 9e:80 +-----BEGIN CERTIFICATE----- +MIID7jCCA1egAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsTELMAkGA1UEBhMCVVMx +FzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRAwDgYDVQQHEwdSYWxlaWdoMRYwFAYD +VQQKEw1SZWQgSGF0LCBJbmMuMRgwFgYDVQQLEw9SZWQgSGF0IE5ldHdvcmsxIjAg +BgNVBAMTGVJITiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEW +EnJobi1ub2NAcmVkaGF0LmNvbTAeFw0wMzA4MjkwMjEwNTVaFw0xMzA4MjYwMjEw +NTVaMIGxMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExEDAO +BgNVBAcTB1JhbGVpZ2gxFjAUBgNVBAoTDVJlZCBIYXQsIEluYy4xGDAWBgNVBAsT +D1JlZCBIYXQgTmV0d29yazEiMCAGA1UEAxMZUkhOIENlcnRpZmljYXRlIEF1dGhv +cml0eTEhMB8GCSqGSIb3DQEJARYScmhuLW5vY0ByZWRoYXQuY29tMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQC/YWPrPYsrRUjmwvt80iEhuOyQk0EwfCyNedUU +6Q5+P+/WCpsKpgJSAS0mlqTtvameqggDwWEKQYDqrnTMYSbQBZFVPmYUoiCz1p1x +DKt3zPTwEbUlM4pOIpoQNmf6EW1Idjof0uNEe4lmvrSF+y+mqhP6mm3JuxjEBK9P +FWmJmwIDAQABo4IBEjCCAQ4wHQYDVR0OBBYEFGlEJwXcLu2l9IHE13hF50Rd+IdH +MIHeBgNVHSMEgdYwgdOAFGlEJwXcLu2l9IHE13hF50Rd+IdHoYG3pIG0MIGxMQsw +CQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExEDAOBgNVBAcTB1Jh +bGVpZ2gxFjAUBgNVBAoTDVJlZCBIYXQsIEluYy4xGDAWBgNVBAsTD1JlZCBIYXQg +TmV0d29yazEiMCAGA1UEAxMZUkhOIENlcnRpZmljYXRlIEF1dGhvcml0eTEhMB8G +CSqGSIb3DQEJARYScmhuLW5vY0ByZWRoYXQuY29tggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEEBQADgYEAI8nKB59eljmD4E7a3UeEMMrU1TiG+d6Ig8osRyY2 +q/QUHigp3n0QSl6RPlqZBwypLuP7eERJxTLW6HqX/ynQM64munYGfnmXFwxPLSqL +iqxBWa7pxFUtuYjfm3tB+DIu7snAWeIwV143RynALXgz086jK9yE2r87Lku2s7ZO +noA= +-----END CERTIFICATE----- diff --git a/doc/certs/slapd.crt b/doc/certs/slapd.crt new file mode 100644 index 0000000..f7a511d --- /dev/null +++ b/doc/certs/slapd.crt @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICtTCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQQFADBMMQswCQYDVQQGEwJHQjES +MBAGA1UECBMJQmVya3NoaXJlMRAwDgYDVQQHEwdOZXdidXJ5MRcwFQYDVQQKEw5N +eSBDb21wYW55IEx0ZDAeFw0wNTA5MTUwMjAyMTNaFw0yMTA3MjYxNjM2NTNaMEwx +CzAJBgNVBAYTAkdCMRIwEAYDVQQIEwlCZXJrc2hpcmUxEDAOBgNVBAcTB05ld2J1 +cnkxFzAVBgNVBAoTDk15IENvbXBhbnkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQCr6PfdngYTUobwJDwIqY7ywDCWd/IJ+SL2hbe46558oVI7Vw2GbqWn +VZ1fJa0wV2pcy/e10HzZX+RpIwKOZUQvbH1jHJyZ/0bt7on8jmI5o+p+rLVspci5 +yVNcgu1tQttpyKnTrDSDkLVbQ6VX8FKLnKnZ7+dk8SNibt0KbzKnOQIDAQABo4Gm +MIGjMB0GA1UdDgQWBBQ4xLvszjgfXgWht8V6s1eRAZS/OjB0BgNVHSMEbTBrgBQ4 +xLvszjgfXgWht8V6s1eRAZS/OqFQpE4wTDELMAkGA1UEBhMCR0IxEjAQBgNVBAgT +CUJlcmtzaGlyZTEQMA4GA1UEBxMHTmV3YnVyeTEXMBUGA1UEChMOTXkgQ29tcGFu +eSBMdGSCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAgzaIKI03l +lZmX7IpLN3vqC/PL6QQTUQkdDRXJYGH+DdURx7v0nE/kkb3R3X92BpNxe5jywhHg +A5NaUhjAR76+F3Guk/4XFaWPctJ2PvfJWolS/VrY+KGc3N4zz9A2i8B6SHBzE6V8 +EHkcGJtGXkFvCVp1ZbCyejJhw4PUEYawsQ== +-----END CERTIFICATE----- diff --git a/doc/certs/slapd.key b/doc/certs/slapd.key new file mode 100644 index 0000000..4edd557 --- /dev/null +++ b/doc/certs/slapd.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICWwIBAAKBgQCr6PfdngYTUobwJDwIqY7ywDCWd/IJ+SL2hbe46558oVI7Vw2G +bqWnVZ1fJa0wV2pcy/e10HzZX+RpIwKOZUQvbH1jHJyZ/0bt7on8jmI5o+p+rLVs +pci5yVNcgu1tQttpyKnTrDSDkLVbQ6VX8FKLnKnZ7+dk8SNibt0KbzKnOQIDAQAB +AoGAdfKYpag3WOiFhpwFyJe1aV5tt79CBI+36lZicHDQw4fXqLkYoYSnCYFXQSHT +ithfNJ4JLeiG0InXaD9KELLwLU2C7rr7mgOBczzmVBGCYUDNuV3bMcNDOQk/drum +GLGqHhxU6W0dlCUnoBZoEHK6dvtDZnxCa+cUBozvFbuLOTUCQQDZJf+Mz7vc78nn +Cc7nnHFfO+79NQi9h0ydW6kb2LLSGB/f3oqwary8eqCs7RVinG21PMWbjrh0lGOJ +DjYP6dLDAkEAyqrs8pgxcxSTcJiaU4/sxGCeaS4fvoeCbYvKLlS5k5Km6DmA3nY+ +KwxQyLHg64g1ImDSuLy3P/E2lZGCPhZGUwJAMVUxpqL3Mi2D+CpBSFtBYnpyRDJN +Rwm6/TD6zWnAznxOmYSsi4HkWQmfAUpnhly1i+w/lKSrAUlJB7Uj0R+1EwJAOADv +pUIFOCXRcGXbD4hQBxwj6jDCuOW9VwQwBImJFoyJ7tYlFFRcbYzjrfHpk2x6MlvL +Hx2XDeZcDQy+juWc3QJAHOpmlHuWqS07i5UIXVl5ohhoWkFd9Qs7/TowyFQF3zpO +BqnwfHZRpySjSUlNE0QpoJRJQPq7p3BWtS3PWMj0/A== +-----END RSA PRIVATE KEY----- diff --git a/doc/demo-reset.sh b/doc/demo-reset.sh new file mode 100755 index 0000000..74e6218 --- /dev/null +++ b/doc/demo-reset.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +for i in $(grep directory phpldapadmin-demo.conf|awk '{print $2}'); do + rm -f $i/*dbb $i/alock $i/log.* +done + +slapadd -b "dc=example.com" -l ldif-example.com +slapadd -b "dc=example,dc=com" -l ldif-example-com +slapadd -b "o=Simpsons" -l ldif-Simpsons + +for i in $(grep directory phpldapadmin-demo.conf|awk '{print $2}'); do + chown -R ldap:ldap $i +done diff --git a/doc/ldif-Simpsons b/doc/ldif-Simpsons new file mode 100644 index 0000000..68d55fb --- /dev/null +++ b/doc/ldif-Simpsons @@ -0,0 +1,461 @@ +# extended LDIF +# +# LDAPv3 +# base with scope subtree +# filter: (objectclass=*) +# requesting: ALL +# + +# Simpsons +dn: o=Simpsons +o: Simpsons +objectClass: organization +objectClass: top + +# People, Simpsons +dn: ou=People,o=Simpsons +ou: People +objectClass: organizationalUnit +objectClass: top + +# Pets, Simpsons +dn: ou=Pets,o=Simpsons +ou: Pets +objectClass: organizationalUnit +objectClass: top + +# Santas Little Helper, Pets, Simpsons +dn: cn=Santas Little Helper,ou=Pets,o=Simpsons +givenName: Santas Little Helper +sn: Simpson +objectClass: inetOrgPerson +objectClass: top +jpegPhoto:: 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 + 6vb0rJcGRsMDnOT1q10pXgAAwJ6SScmf//Z +o: The Simpsons +cn: Santas Little Helper + +# Bart Simpson, People, Simpsons +dn: cn=Bart Simpson,ou=People,o=Simpsons +cn: Bart Simpson +gidNumber: 1000 +givenName: Bart +homeDirectory: /home/users/simpsons/bart +jpegPhoto:: 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 + JJJJPJJoopOc5xu43SZGyMWYLDuXRRRRTU9f//Z +mail: bart.simpson@example.com +o: The Simpsons +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: top +objectClass: shadowAccount +roomNumber: 45 +sn: Simpson +telephoneNumber: +15551234567 +uid: bart +uidNumber: 1000 +userPassword:: ZWF0bXlzaG9ydHM= + +# Homer Simpson, People, Simpsons +dn: cn=Homer Simpson,ou=People,o=Simpsons +cn: Homer Simpson +gidNumber: 1000 +givenName: Homer +homeDirectory: /home/users/simpsons/homer +jpegPhoto:: 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 + k= +mail: homer.simpson@example.com +o: The Simpsons +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: top +objectClass: shadowAccount +roomNumber: 45 +sn: Simpson +telephoneNumber: +15551234567 +uid: homer +uidNumber: 1001 +userPassword:: ZWF0bXlzaG9ydHM= + +# Lisa Simpson, People, Simpsons +dn: cn=Lisa Simpson,ou=People,o=Simpsons +cn: Lisa Simpson +gidNumber: 1000 +givenName: Lisa +homeDirectory: /home/users/simpsons/lisa +jpegPhoto:: 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 +mail: lisa.simpson@example.com +o: The Simpsons +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: top +objectClass: shadowAccount +roomNumber: 45 +sn: Simpson +telephoneNumber: +15551234567 +uid: lisa +uidNumber: 1002 +userPassword:: YnJhaW5z + +# Maggie Simpson, People, Simpsons +dn: cn=Maggie Simpson,ou=People,o=Simpsons +cn: Maggie Simpson +gidNumber: 1000 +givenName: Maggie +homeDirectory: /home/users/simpsons/maggie +jpegPhoto:: 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 + CgYAGAKKKqexnO2O5oqorpGqxqf//Z +mail: maggie.simpson@example.com +o: The Simpsons +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: top +objectClass: shadowAccount +roomNumber: 45 +sn: Simpson +telephoneNumber: +15551234567 +uid: maggie +uidNumber: 1003 +userPassword:: ZHVtbXk= + +# Marge Simpson, People, Simpsons +dn: cn=Marge Simpson,ou=People,o=Simpsons +gidNumber: 1000 +givenName: Marg +homeDirectory: /home/users/simpsons/marg +mail: marg.simpson@example.com +o: The Simpsons +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: top +objectClass: shadowAccount +roomNumber: 45 +sn: Simpson +telephoneNumber: +15551234567 +uid: marg +uidNumber: 1004 +userPassword:: Ymx1ZWhhaXI= +cn: Marge Simpson +jpegPhoto:: R0lGODlhhABwAIcAAAAAAAICBQIEAgUFAQUFBAICCwYICw4EBAsJAgkJCAgJDQ4NCA + 0NDQECEgEDGwsMEA4QDhMEAhILAhANARANBBYODhwCARoJARMQAhIQBBURARQRBBcVAhIQCBEQDRQ + SDhgSABkUARwTARwVAB0YARISERsbGwIEIgIEKgEENAAEPAQINAQIOiMBASwCAiIbATUDAz0CAicg + AiogASsjBCskAS0jAS0kAS4oBTEnATQqAjkuATswAz0xATwxBj80BCIiIikpKS8vLzQ0NDk5OT09P + QIFQwEGTAQJRAMITQEFUQEGWwMIUwMIWgIIYwIIbAAGcQAGfwEIdAEIfEICAksBAVIBAV8AAEAzAU + E1AUU2AUU3BEU4AUw8AVA+AWEBAWsCAnIBAXwBAU5ABFRDAlhGAVxHAltJAWFNAWBNBGJQBGVRAmp + UAW1YAW1YBHFZAHFaBHFcAnRaAnVdAXVeBHleAHdgAntiAURERElJSU1NTVJSUllZWV1dXWFhYWVl + ZWxsbHJycnV1dXt7ewAIg4QBAYwBAZIAAJsCAqICAqsCArQDA7sCAoFlAYRpAohqAIptAIxuAo1wA + pN0AZZ5Bph3AJp7AaB/AYF/f8ECAssBAdMEBNwBAeICAuwBAfIBAf4AAJ6AAqGAAaODBKaCAKSCBK + aEAKqGAayHAK2JAbKMAraRAruTAcKZAcOaBMadAMidAMqgAsugBM2hAc6iBM6kAtGlAdOoAdqsAdy + uAd6wAOCuAOCxAOK0AOS1AOi3AOm5AO27AO+9AIKCgoWFhYuLi42NjZKSkpycnIyapI6cpZCdp5Gf + qJajrJyosKOjo6qqqqWwt6WwuK23vrS0tLm5ub6+vrnCyLzEysPDw8DHzcjIyM3NzcTL0MXM0cjO0 + 8nQ1NPT09DW2tfb39fc39jY2N3d3dzg497i5d/k5uHh4eDj5uDk5uXl5eHl6OTn6eXo6ufq7Onp6e + rs7uzs7Ovt8O3u8O3w8fHx8fHz9PP19vX19ff4+Pn5+f39/QAAACH5BAAAAP8ALAAAAACEAHAAAAj + /AAEIHEiwoMGDCBMqXMiwocOHDf1JnEixosWL/p41mEKoo8ePIEOKHEmyZEgUgzCqXIlRIMuXF/2g + MEmzpk2TUhjQg8nzosuePPGVcHKzqNGaKI4BXervJ9OV+BJwPEq1qkcmeJ72dKr1IjUHVsNSlVKiX + 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 + +# search result +search: 2 +result: 0 Success + +# numResponses: 10 +# numEntries: 9 diff --git a/doc/ldif-example-com b/doc/ldif-example-com new file mode 100644 index 0000000..17bd231 --- /dev/null +++ b/doc/ldif-example-com @@ -0,0 +1,588 @@ +# extended LDIF +# +# LDAPv3 +# base with scope subtree +# filter: (objectclass=*) +# requesting: ALL +# + +# example.com +dn: dc=example,dc=com +dc: example +objectClass: dNSDomain + +# AU, example.com +dn: c=AU,dc=example,dc=com +c: AU +objectClass: country +objectClass: top +description: Australia + +# DE, example.com +dn: c=DE,dc=example,dc=com +c: DE +objectClass: country +objectClass: top +description: Germany + +# GB, example.com +dn: c=GB,dc=example,dc=com +c: GB +objectClass: country +objectClass: top +description: Great Britain + +# FR, example.com +dn: c=FR,dc=example,dc=com +c: FR +objectClass: country +objectClass: top +description: France + +# NO, example.com +dn: c=NO,dc=example,dc=com +c: NO +description: Norway +objectClass: country +objectClass: top + +# SE, example.com +dn: c=SE,dc=example,dc=com +c: SE +objectClass: country +objectClass: top + +# US, example.com +dn: c=US,dc=example,dc=com +c: US +description: United States of America +objectClass: country +objectClass: top + +# RU, example.com +dn: c=RU,dc=example,dc=com +c: RU +objectClass: country +objectClass: top + +# \D0\A7\D0\B5\D0\BB\D0\BE\D0\B2\D0\B5\D0\BA\D0\B8, RU, example.com +dn:: Y2490KfQtdC70L7QstC10LrQuCxjPVJVLGRjPWV4YW1wbGUsZGM9Y29t +cn:: 0KfQtdC70L7QstC10LrQuA== +objectClass: inetOrgPerson +objectClass: top +sn:: 0KfQtdC70L7QstC10LrQuA== + +# \D0\94\D0\B5\D0\B4 \D0\9B\D0\BE\D0\B3\D0\BE\D0\BF\D0\B5\D0\B4, \D0\A7\D0\B5 + \D0\BB\D0\BE\D0\B2\D0\B5\D0\BA\D0\B8, RU, example.com +dn:: Y2490JTQtdC0INCb0L7Qs9C+0L/QtdC0LGNuPdCn0LXQu9C+0LLQtdC60LgsYz1SVSxkYz1le + GFtcGxlLGRjPWNvbQ== +cn:: 0JTQtdC0INCb0L7Qs9C+0L/QtdC0 +givenName:: 0JTQtdC0 +jpegPhoto:: /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBw + YIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQs + NFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAw + AEADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEA + wUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKS + o0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqK + jpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QA + HwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEB + SExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSE + lKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba + 3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9A/gj + 8Nx8IvhN4V8KPKsr6PpkNnJIv3WZV+Y/QnNc/wCINDutR1Q/Mux2yxHTFeTaP+17d+IfDN94w02OD + W/ANsF+0apZKZHtHOMxyKPmDDK8Ed69G8IfEHR/ij4aTxD4cv4760VMkxEjacdGBAKn2IoA5Txn4K + uIzO0v+rToyDjmvlL486HBb2jhdzEdNvrzXtvxB+NsNjeXdpFM7JFlQpbv6GvlD4qfE6/1Ca4nktW + kgI24Tkd+goA+b/ESSRXkoJIwejCuWuZFfOQAfUV1HiC9vNVuGmj064RJOjvC4HHpxXGXwntZT50T + p6FlIoAy9UQLE5A7VzDJ5h/Guj1aUi1ZvXisTyTGuDwR1oA/cX/gnT8CPFfwl/Z21nR/Gugpo9/rO + pSXS6df7XdrdoUQCZATtJKt8p5xjPWvefh98HdE8D3d3qcNnb2lzPGYXisVaO2EI6IIySOPWvRulY + XjjWYvD/hLVdQmfy4oLd3ZvQAUAfjx+0H42kHxR8TLajybdb2VY4lPAAY4FefeGbx9Q1yzlu7f+0r + bdmSEt8x9QAeK1PiQi614n1LUlbi4neXn3Ymud0m9l0G6jlVC6E5OOoPqKAIPFPhq88O+Mr7V9J1i + /trC4kMyWaiRHyf4Sn3BjpnJGKpT6yNe0lk1W0jN2DgTBAN49T716NqOrXXiC1807dm3rIcV5j4mb + 7KrZYbsHkUAeW+JIEt7hIYwCqtvwPb/ACKwXBySec1v39nPc3DTshCNwmR1HrVGfT2jIJHFAH9Gkf + xQspdds7KKOWaGZtr3CITHEMcMzdAM4/OuR/aP1qLXPhtqOiaVdQzXV4hQ/PhQMcknFeXeAdRnSzR + xG88UxGx9mVJPTnHGcGuk1+4h1LSnijRHkYlVjk4kVvQHHrQB+f8A4m/Zy8Y380kOnapokEZGS91c + vk+wAQ1zq/svfEC5/cp4i0O2KHaR5UzsT/3yM19ea9aW8R3y3ElndKSWhdBtkB6HBxj6g1w+tarcx + RRXLxS3mmxuE3ohCA9SNwwwP1oA8Ksv2WvHGAl143s40xjba6cznn/eYVFrX7LRuYUjbxa817nkTW + B2MPqrEj9a9jXxZqt4DEkqoVb93DKN3b+8MEHjjI9Kq6j421mwSNL64ESSqytuYOj+gYdvqKAPAvF + /wOv9EtR5z2tyEG3fDuX9GUYryPXfB15axs62ryxhtu+Ebxn6rmvpXW9cilF00+piYDO17cOVK9Mc + 9vqO1eQ+LNVSOd3g3NAvJMmUJ+vP9aAP/9k= +objectClass: inetOrgPerson +objectClass: top +sn:: 0JvQvtCz0L7Qv9C10LQ= + +# IT, example.com +dn: c=IT,dc=example,dc=com +c: IT +objectClass: country +objectClass: top + +# ES, example.com +dn: c=ES,dc=example,dc=com +c: ES +objectClass: country +objectClass: top + +# Simpsons, US, example.com +dn: o=Simpsons,c=US,dc=example,dc=com +o: Simpsons +objectClass: organization +objectClass: top + +# People, Simpsons, US, example.com +dn: ou=People,o=Simpsons,c=US,dc=example,dc=com +objectClass: organizationalUnit +objectClass: top +ou: People + +# Bart Simpson, People, Simpsons, US, example.com +dn: cn=Bart Simpson,ou=People,o=Simpsons,c=US,dc=example,dc=com +cn: Bart Simpson +gidNumber: 1000 +givenName: Bart +homeDirectory: /home/users/simpsons/bart +jpegPhoto:: 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 + JJJJPJJoopOc5xu43SZGyMWYLDuXRRRRTU9f//Z +mail: bart.simpson@example.com +o: The Simpsons +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: top +objectClass: shadowAccount +roomNumber: 45 +sn: Simpson +telephoneNumber: +15551234567 +uid: bart +uidNumber: 1000 +userPassword:: ZWF0bXlzaG9ydHM= + +# Homer Simpson, People, Simpsons, US, example.com +dn: cn=Homer Simpson,ou=People,o=Simpsons,c=US,dc=example,dc=com +cn: Homer Simpson +gidNumber: 1000 +givenName: Homer +homeDirectory: /home/users/simpsons/homer +jpegPhoto:: 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 + k= +mail: homer.simpson@example.com +o: The Simpsons +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: top +objectClass: shadowAccount +roomNumber: 45 +sn: Simpson +telephoneNumber: +15551234567 +uid: homer +uidNumber: 1001 +userPassword:: ZWF0bXlzaG9ydHM= + +# Lisa Simpson, People, Simpsons, US, example.com +dn: cn=Lisa Simpson,ou=People,o=Simpsons,c=US,dc=example,dc=com +cn: Lisa Simpson +gidNumber: 1000 +givenName: Lisa +homeDirectory: /home/users/simpsons/lisa +jpegPhoto:: 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 +mail: lisa.simpson@example.com +o: The Simpsons +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: top +objectClass: shadowAccount +roomNumber: 45 +sn: Simpson +telephoneNumber: +15551234567 +uid: lisa +uidNumber: 1002 +userPassword:: YnJhaW5z + +# Maggie Simpson, People, Simpsons, US, example.com +dn: cn=Maggie Simpson,ou=People,o=Simpsons,c=US,dc=example,dc=com +cn: Maggie Simpson +gidNumber: 1000 +givenName: Maggie +homeDirectory: /home/users/simpsons/maggie +jpegPhoto:: /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFh + EYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCI + oOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCABm + AE0DASIAAhEBAxEB/8QAGwAAAgIDAQAAAAAAAAAAAAAAAAUEBgIDBwH/xAA8EAACAQMDAgUCBAIGC + wAAAAABAgMABBEFEiExQQYTUWFxIoEUMpGhQoIHFRYkkqIjM0NEUlVicpSx0//EABoBAAIDAQEAAA + AAAAAAAAAAAAUGAgMEAAH/xAAwEQACAgIABAMGBQUAAAAAAAABAgADBBEFEiExE1GBIjJBcbHBFBV + SYfAjkaHR8f/aAAwDAQACEQMRAD8A7LRRRXToUV4x2qWwTgZwOpqtx+Jb+4iSaGwthHIoZd9y27BG + ecIRWbIyqccA2trcmlbP7ojHXNRlsooYbZlFxcPhWYZ2KBlmx37D5YfBh2mvzwsE1JIzGf8AeYgVC + /8Acpzge4J9wBUCaa5vb03d0kUZEYjSONywAySTkgdfp7fw+9FK+XxyxcrdB2g/z95vrxQa/b7zPU + btdZuN3W0hYiEA/nYEgyZHx9JHTk9xhppGrB4GgvplWeDYDI5C+aGOFb0yTkY9fYiqjePcJqzLHO8 + QSGNo1z9B5cNlehHC+/oRSm71FtTjnaXylKWrmONDkxucqVY92BwO2M9O9GOHUZ9ty5TEeFYD8fd1 + vQ+fy9YKys7GqDUgHnUj4d9zrlFUya61O2gZodTumlOFRX8tgzk4Ucr3JA7detXJc7RuxnHOK2Yeb + VmKWr3oec0WVNWdNPaKKK2yqFUuNEgnurSMhktp2RCvTacMAPgNt/lpjrt1cy3psJQ0NswBXbn+8c + cjd0AHOV6nGenWEiJGgSNFRFGAqjAH2pR4/mVtrHCnYO9/zvCOJWR7e+k9rF3SNNzsFXIGScDk4FZ + UQ24vtQt7F/8AVSB3mGcbo1ABH3LKPjNLmNQ2RctS9zNruEUsYuv3sZ72G2kuxBchXZGWRQwXIDDn + 147fw+1ZrLpsNvbBljihA3wmVdoXaAM5bocH5xn3q2WL6NdJd6fYi0kW1k8q4giVdqPgHBUcZxj9P + aoCQabod/ezzQosNvbfiVkKljAgzuVRyQOMgD1x2FNbcCsKLX4x5Rvp5b8huDRkIGLhBsxNHci4e1 + vbOaF1jlbasgysrDcvBB7YJHXoD2q26VfnUrFbkw+USWXAbcDgkZBwMjjg4FKNQs9N1Iadq9ugMd0 + 6b2RdjXEUi8A5GepUnodoYeoqxIqogVVCqowABgAUR4fg2YfMhfa/Aa+squtFmjrrPaKKKKyiQ9W/ + BjTJ3v4hJAi7mXGTkdMf9WemOc4qsQCRYEExzJj6uc49s9/njPXA6VZtV0/+srLyBN5TB1kVtu4ZU + gjI4yMgdxVdu7a9065giuTbyJMWCvGWU5Az+U5x/iNLXH8e61VZF9ldknpubsR1UkE9TItzqMFtOk + LBmdiBhSvGenUjJ9hk+3SpOZIporiAgTQtuXPQ5GCp9iP3we1Lbq3Ftei6UW5aVxtM03lkNgKQDg7 + gQoyvt+jGNXWJVkcO4H1MFxk/FKisaStlZ0R9Zv1zbVoyj8RpGGJ0i4WVzl/LMZVmwBnduBPAHJGc + DpSW7vwb+S5uLuWC6kUKUtWdtiDkKdozjLE5IGSeMdKX+LNSm03RS1u5jlnlESuvVcgkn9FIz71zS + 3vHs9Tingl8uSJwyFcYz3B7nPQ/PzTFXlZmdVsty68uhPrL8XhIsQ2Kf2G/P+fGd50L8RqUEV/fTC + XymdYBt2kYJXc4/wCPGRjAxzwMmndJfCM0Vz4btbqLd/eN0rhh0csdw+AcgfFOqaqubw15u+hF1xp + iIUUUVZIwqFqemRanFEkkkkRik3o8ZAIOCp6gjoxqbRUWUMCrDYM9B11EqHibT7bTrG3gtkI/GSmK + 4kZy0kibGbaXJztJA4Bx26E0lFxqCDC3quPWaAMf1Ur+9N/Fk5l1uGD+G3t9/XqXYj9hH/mpFcyOP + KiiOJJXwDjOFHLH9OPkiiFXDsS+gC6sEDt07fKLmdn5FWURS5HQb+v3kfVoZrqwuFurkPG+HkzHjy + wvO5ADwQM8HOelTrb+iCNJm8/W3aHdlVjtwrAZOeSTz9vtWFxH51tLFjO9GXHrkYroWl3P4zS7W53 + hzLCrFh3JHP71nyuHY2OR4SAA/aFuC8XzSjr4h/7MrCxt9NsYbK1j8uCBAiL14Hqe59+9SKKKpmwn + fUwooorp0Kj397Fp1jNdzZ2RLuIHVvQD1JOAPc1Iqs+OJpVsbSCIZMk5bBPDbUZgD/NtP2qaLzMFl + V1nh1s/kJWpLy41DVr65uAoZmQBU/KgC/lz3xnr79hgDRF/pb+eQ/7HbEo9MgOT99yj+Wi1bRliL3 + 1sHnk82R3mhVmwmQT9OdvCEAAknaepr2yj8lHjAkKq3EkoIeTjq2STngDP7DoNPDuJrlWtQtbKF7E + joepHp6mLnEMFqUF7uGLd9en9/QSTT3wfcsl5d2JYbGVZ0BPckq+P0U/Le9IqbeEkR9cnkZ9rxW+1 + FPBbcwLEeoG1Bx0J56iiOaAaTuUcKJGUAP3lyooooFG+FFa5p4baJpp5UijXq7sFUfc0qbxZoqkgX + TyY6GOCRw3wQuD9q9Ck9hIs6r7x1HDMFBLEAepNc/1G+k1LUp55GJSOV4oV7IqttOPclck/A7Csta + vl1u+MjIWtIwFhjmTGT/ExU9DzjnsvvUUKqqFUBVAwAOABRbExiv8AUaLfEs8WA019t9/OaXsrdwQ + YwNxJbBIznIIOOxycjpyfWt9FFEAiqdgQMXZhomRpGaK/hO47JlaMjPG4DcD+gf8Ab2rc1w1kUvUO + GtWE2R6Lyw+65H3rXNG8lzbsB9EbM5Oe+0qB/mJ+1biMgg96iV5gVPxklcoyuO4/3OkA5AINe1UtF + 8SfgoYLK/jVYI1EaXKHAUAYG8Hp0/MDjuQoq2jnkGl2ytqzphHem+u5eas7ErfiDw/falfpdW0kEw + VAqxXDlBEeclSFbrnnjPHXtSLU9M1LSbdbi9itdjPsHlXDOc4J6FB6HvRRWmi6xQFB6TBl4lLsXYd + fmZX38UWEbsjx3G5Tg4RSM/4q3W2uW94GMEUmF67wF/8ARNFFEDa4HeA66ay+iJjceIbS0k8uaObd + jP0KCP3IqZot5/aG7NrpyYkAyTcHYAPtuz+1FFRe5whIMsqx62vCEdNyzJ4OuTGWk1VVk9Et/oHzl + sn7EfasP7H3v/Nbf/wm/wDrRRQ38Td+qMH5fi/oE2w+DBJlb7UWljPDRwwiMMO4JJY889CPtVoUBV + CgYAGAKKKqexnO2O5oqorpGqxqf//Z +mail: maggie.simpson@example.com +o: The Simpsons +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: top +objectClass: shadowAccount +roomNumber: 45 +sn: Simpson +telephoneNumber: +15551234567 +uid: maggie +uidNumber: 1003 +userPassword:: ZHVtbXk= + +# Marge Simpson, People, Simpsons, US, example.com +dn: cn=Marge Simpson,ou=People,o=Simpsons,c=US,dc=example,dc=com +cn: Marge Simpson +gidNumber: 1000 +givenName: Marg +homeDirectory: /home/users/simpsons/marg +jpegPhoto:: R0lGODlhhABwAIcAAAAAAAICBQIEAgUFAQUFBAICCwYICw4EBAsJAgkJCAgJDQ4NCA + 0NDQECEgEDGwsMEA4QDhMEAhILAhANARANBBYODhwCARoJARMQAhIQBBURARQRBBcVAhIQCBEQDRQ + SDhgSABkUARwTARwVAB0YARISERsbGwIEIgIEKgEENAAEPAQINAQIOiMBASwCAiIbATUDAz0CAicg + AiogASsjBCskAS0jAS0kAS4oBTEnATQqAjkuATswAz0xATwxBj80BCIiIikpKS8vLzQ0NDk5OT09P + QIFQwEGTAQJRAMITQEFUQEGWwMIUwMIWgIIYwIIbAAGcQAGfwEIdAEIfEICAksBAVIBAV8AAEAzAU + E1AUU2AUU3BEU4AUw8AVA+AWEBAWsCAnIBAXwBAU5ABFRDAlhGAVxHAltJAWFNAWBNBGJQBGVRAmp + UAW1YAW1YBHFZAHFaBHFcAnRaAnVdAXVeBHleAHdgAntiAURERElJSU1NTVJSUllZWV1dXWFhYWVl + ZWxsbHJycnV1dXt7ewAIg4QBAYwBAZIAAJsCAqICAqsCArQDA7sCAoFlAYRpAohqAIptAIxuAo1wA + pN0AZZ5Bph3AJp7AaB/AYF/f8ECAssBAdMEBNwBAeICAuwBAfIBAf4AAJ6AAqGAAaODBKaCAKSCBK + aEAKqGAayHAK2JAbKMAraRAruTAcKZAcOaBMadAMidAMqgAsugBM2hAc6iBM6kAtGlAdOoAdqsAdy + uAd6wAOCuAOCxAOK0AOS1AOi3AOm5AO27AO+9AIKCgoWFhYuLi42NjZKSkpycnIyapI6cpZCdp5Gf + qJajrJyosKOjo6qqqqWwt6WwuK23vrS0tLm5ub6+vrnCyLzEysPDw8DHzcjIyM3NzcTL0MXM0cjO0 + 8nQ1NPT09DW2tfb39fc39jY2N3d3dzg497i5d/k5uHh4eDj5uDk5uXl5eHl6OTn6eXo6ufq7Onp6e + rs7uzs7Ovt8O3u8O3w8fHx8fHz9PP19vX19ff4+Pn5+f39/QAAACH5BAAAAP8ALAAAAACEAHAAAAj + /AAEIHEiwoMGDCBMqXMiwocOHDf1JnEixosWL/p41mEKoo8ePIEOKHEmyZEgUgzCqXIlRIMuXF/2g + MEmzpk2TUhjQg8nzosuePPGVcHKzqNGaKI4BXervJ9OV+BJwPEq1qkcmeJ72dKr1IjUHVsNSlVKiX + 9eXXM9SDKRCrNuiAdqpXZl2rr8hTqK83WsygDm7LQEAnhh1Kt/DIQuoG2yxrlp1CRBL/igFwj7GFR + 2fpUdA72TJTYZgziwYM5AnnyWnSDl6ouazgNqmPtwAU2vXpRlzK2B4ttsnBrLdbpqbsR7Zvt8eEX3 + 79Vl1D1Anf9vAWvPijJE1kDLdrZE/14cD/zrRu/tRJ8xHO1fbb08K81ahmDCrHjvmPUbgV5VPH/P6 + s/IYwJ1+56Xnn32DPXMCgVSpAEh4t/mRH4NFRdGAcK391xURS1BY1BQFWJchgoCd5mFRShDRH2Maa + gUEFASWZ1MD1KwIWItPEUHUYZ6NJMUJDTRx1BFFjDicH0ccxkIDKjjR2xRNpIDAHars0IARO340xY + AgRVFAOfUN9wxYb0WRAg6rtEEDAgU00EAAGGTxSC7C1NlKGzMQcAIKKqSAQgAThpTCMGHeJo8CXFr + 1Ixe81CnML7rwImkwjlZaJy6rWFJJJS+gIGNHSxBRaITIVdVEA3MAY+mqrK7aSxsJpP9whBNQ9DgF + AZexSCJg5iBKVRROOHADK5be4kiryFaaCyRk7DDBEj0W8Jeuw0k0yEw2PcGEESgUkIMlqlrKSwisU + Josq77QEO4dbU2BWgPcHFitP/sAoYRNSbwghyW1OErLqpPoYO65q4ZgS52pLNgECl7KRW215ghokx + M5WArMC6lY/C3BrNqwSp3AhOCEESo8AQQ/8lZLzAo3UbzqKS/0UikvdIRwxx2SpEInxy/EEu4lDTj + AxAnGjHobHkJO3AOrZmwBDDCWYJGAEHsEEggfQyywwyThWqpLJFyMEAABE+jgxiyhDFDAHjbahaNW + JiRqUhJlsAqMFlu8MAQyO1X/hA80RJAgSqW/1LFAHsiYs08/7VADSAlaJGAMffs47PaugJUgd0kpQ + MLqL2iYAM1L1Jhwxi/B2GIDHuFgRI8gDIwu0TB5DPb2Uyba5ACxFo9BhOUs0ZPHD7SMMEjbFVVTwj + P+ZFNCvDdibhceTNgkhQaqRiKJuW0QgQ9Q/RSBAGsvZcPAMyUg8/BwxLxX0xFn1AmLDjukokoJwPN + EjwnM80QMAEpZ323CUYAelaQB5apTMCZxgwGo7ynQOBlP9mECaqSsWkW4l0mcQIKB1YkVJsjVU4JQ + I54Mow8TkUcAz3K7p1SjAQYUCYhUIYyu1eFBXRkECnmSjRBa4w8M2IMI/7XSwqfgIVAkaYIOgIEDO + TRKC/3TSjWC0BN5CIABQABE6+ZSRKaUIzo0KcAtZlEGDLAhBBiqCD2mxZJylOAi0DhG3wgDAOhFb1 + 4TKYYDYniSwQkjFnJAQBonUg0GAACHK3GjRYwhECFUxBwMQF5XusgUamzEJCpwxMCwIDuK8EEgAvj + eSqxBxYrsAZSilAg0DHQ5PEpED0mgiQrqUCk4BMIixxCIqFgyDD5YxHkCEERF+GAbAQ4HHwzYnKCO + 5ShWAKFt1UBGKlUihChSBB/5gyQb74jHbJDJJCjwowJn0MmlVAMAxNhGO+iBj8VdpB94QKTtpAeYZ + 2DLJAWIhaVOAf+E/MEEH0FwgxdkgAEMaCABWNwDNPoDCCFMk5vzOob7SvIEDnRNgWXIgyQx0h4vuC + oXrHiEDPDATj4EYTFGGw4y7kmSI6DBgyDzgR7myJJ98GEHvkjWL8hQBBPUEULz2kYDaOIAGrKqF2Q + AwiAxsg0haCGn57rFAFBBhmKm9Db7KAGMRCIFJahgAKmAKqsmsYE8lLAi/bDGHjYAiYsmCwC9aAX+ + jOTKP7BAJCyYgBkewQYddAGmM3NEDUoQz2EMIxB5KIEM7oALjtUpFwhQlRryMESIzqtXckvBD3amQ + I7VghJ3iIMc7mAJWQQDsMlqBBlApgMhXhCPw/gmIZ4wgkb/Ofa2jk1FCPpVJ190YQjb5CI9BwPPia + agEZTKhStUwVvcOlcYwWDFGULwsUoFgw4mWCoLhzsYegCheoTYnTDsgAAE6AANzyUYMObwhjeQQQc + aeAEddNEqSnxAu0Tk7mD4oMEG6PMXqRBYejlmiUlMohKqONi5KGEClKqFklrZgwbFK4xcbKAWqB2w + huvUhj200pUT4W9HUnAHR5niFhne8IB1kYHgPgXCT2FLR55Agl6kWMUqzkI58wviiazUIyvYgswUm + Ipf4PjIObDgg/ULGHXwBsgaQMMb0kACHcziyCqeBBAe+mImAyYPSIRCEpBghIphWcO5OIMJ7LjdHk + +E/xsKyJJHpBCCM6f3F42ggB/kYdkeP8MASuhNEzTAsV5gwchnxsUdQoCHbRizx9kgQgFO4KcGAAE + AvrixMB4xBizzIhReWMAeHP1aN0vEHHFExjb2IYAhI2sXEyDAC7rQBkkk2K3ICkYsRPEGHSSgCMfw + Z59NXZF9wPVca0jDL14RijuUQQckmAAGasCDLpChDe1tLxm60IMXLMAERRgENfhcLRgzhtWu/hwPO + FspX+CCFawghYENnAUiHOMZ1QgHTfFo7u4iQKxYPgUr3dxvXoHAznVaxcB7XHC7bOMFmn5uI3ZIbO + JUHCPU6EHEcQsLDlTj4hYHuUT6YY52IGO1WP/2xRw6sMKKN1wrEbTAAUywho0TjBc50AOYRP5yplQ + jAowAxSdgEAksl8GXIpdIz5eSh0SA4ukxyBiObeEBcid96UAJgiaeDooI/AvHkPBw0pXu5fsUYhEx + OAAAtFDdDZOh5TwvO2O2QYAWKOITnkBECyxxWg33AA+CwK+psd6TarTAE1wHBScugGLo2rxSLxBDG + Czwh426kvA8+UMhEv/0L0iCFDxAAAWyIHXHgoAToPCEC+A+eLkPRg9O57wYOGB3T3QiERbwnKN64V + ZdpIIUtjj90xVRJJBjHiaDAAPnQUGFwye+ExZ4BTAa8YIETKALr6CUIxAQgypEAACoB0X/Jkp58eO + /RB0MWETiEQEARCy/EGjwAhW27glDSIAVjXBB+D/xhSo8XQwU53KuBxjWgAEhYAWIcAgxIAMIsAnL + lwkCQAWctwgvQAHhx3UuoAiHUAFbVH4DOBf7Iwq8MAlrwAaW8As4kAnLpwgAoIKc5wISyHmFQACNd + nUfqBZ9ED+rQgfKx3lWAH7LZwUxmHiH4AdjF3LERg0hYFuWkgsi4H5cVwgv8AOxl3gWEAGIl3hVwA + CkFncVtz+ogCywIAMwIHkukAO2oAoWcIGgEAZccAZX8AlchwgjIAlBUFnEZn4Y4QcohyzAcAqN4Ah + GJQyQEAFiwAiJEAM4kAu/0AUu/yAGhlAFJKABvsAF5OOBxJYNGMBuuOUKbGBtlWAuwbAKdfAGJ0gD + q2ALFMBmeXiDTNEPQjAJj5dec+AGwuAIKmJ8rrgUx2BmCGcprCADwcBErMdwu9gT9FACvPOLlvICH + 9MKH+BgredmgWAGzMgqcNAGlMIGYteKPWYOC6Bg11gpsQACquILIaBk0whifsAGs6hiPWAJdXIJQI + CH/HaML1EOFNBY47gqo5AD5tIDxOCNrtQHb9CPrVIDplAnr+ABwlZu+LgS5kABnIiQdVIKMoBoa2C + EBBeRKhEI6GWRqxIMclInurABrDgveohM+iSSq/IKGIALlNIIGmWMeGQMWizwjnbWBnUjDL7AASJy + eR55EUEQhi6JLiMACf0SCbsklBDxlFAZlVI5lVIZEAA7 +mail: marg.simpson@example.com +o: The Simpsons +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: top +objectClass: shadowAccount +roomNumber: 45 +sn: Simpson +telephoneNumber: +15551234567 +uid: marg +uidNumber: 1004 +userPassword:: Ymx1ZWhhaXI= + +# Pets, Simpsons, US, example.com +dn: ou=Pets,o=Simpsons,c=US,dc=example,dc=com +objectClass: organizationalUnit +objectClass: top +ou: Pets + +# Santas Little Helper, Pets, Simpsons, US, example.com +dn: cn=Santas Little Helper,ou=Pets,o=Simpsons,c=US,dc=example,dc=com +cn: Santas Little Helper +givenName: Santas Little Helper +jpegPhoto:: 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 + 6vb0rJcGRsMDnOT1q10pXgAAwJ6SScmf//Z +o: The Simpsons +objectClass: inetOrgPerson +objectClass: top +sn: Simpson + +# simpsons, Simpsons, US, example.com +dn: cn=simpsons,o=Simpsons,c=US,dc=example,dc=com +cn: simpsons +objectClass: groupOfUniqueNames +objectClass: top +uniqueMember: cn=Bart Simpson,ou=People,o=Simpsons +uniqueMember: cn=Homer Simpson,ou=People,o=Simpsons +uniqueMember: cn=Lisa Simpson,ou=People,o=Simpsons +uniqueMember: cn=Maggie Simpson,ou=People,o=Simpsons +uniqueMember: cn=Marge Simpson,ou=People,o=Simpsons + +# search result +search: 2 +result: 0 Success + +# numResponses: 24 +# numEntries: 23 diff --git a/doc/ldif-example.com b/doc/ldif-example.com new file mode 100644 index 0000000..ae79974 --- /dev/null +++ b/doc/ldif-example.com @@ -0,0 +1,215 @@ +# extended LDIF +# +# LDAPv3 +# base with scope subtree +# filter: (objectclass=*) +# requesting: ALL +# + +# example.com +dn: dc=example.com +dc: example.com +objectClass: dNSDomain + +# Bad DNs, example.com +dn: ou=Bad DNs,dc=example.com +ou: Bad DNs +objectClass: organizationalUnit + +# double plus \2B\2B, Bad DNs, example.com +dn: c=double plus \2B\2B,ou=Bad DNs,dc=example.com +c: double plus ++ +objectClass: country + +# end dollar$, Bad DNs, example.com +dn: c=end dollar$,ou=Bad DNs,dc=example.com +c: end dollar$ +objectClass: country + +# multi + value, Bad DNs, example.com +dn: uid=multi+uid=value,ou=Bad DNs,dc=example.com +cn: Test +sn: Test +uid: multi +uid: value +objectClass: inetOrgPerson + +# quote\22double, Bad DNs, example.com +dn: uid=quote\22double,ou=Bad DNs,dc=example.com +cn: Test +sn: Test +uid: quote"double +objectClass: inetOrgPerson + +# quote'single, Bad DNs, example.com +dn: uid=quote'single,ou=Bad DNs,dc=example.com +cn: Test +sn: Test +uid: quote'single +objectClass: inetOrgPerson + +# angle\3Cleft, Bad DNs, example.com +dn: uid=angle\3Cleft,ou=Bad DNs,dc=example.com +cn: Test +sn: Test +uid: angleright +objectClass: inetOrgPerson + +# sign@at, Bad DNs, example.com +dn: uid=sign@at,ou=Bad DNs,dc=example.com +cn: Test +sn: Test +uid: sign@at +objectClass: inetOrgPerson + +# sign\3Bsemicolon@at, Bad DNs, example.com +dn: uid=sign\3Bsemicolon@at,ou=Bad DNs,dc=example.com +cn: Test +sn: Test +uid: sign;semicolon@at +objectClass: inetOrgPerson + +# sign?question, Bad DNs, example.com +dn: uid=sign?question,ou=Bad DNs,dc=example.com +cn: Test +sn: Test +uid: sign?question +objectClass: inetOrgPerson + +# sign\2Ccomma, Bad DNs, example.com +dn: uid=sign\2Ccomma,ou=Bad DNs,dc=example.com +cn: Test +sn: Test +uid: sign,comma +objectClass: inetOrgPerson + +# brace(left, Bad DNs, example.com +dn: uid=brace(left,ou=Bad DNs,dc=example.com +cn: Test +sn: Test +uid: brace(left +objectClass: inetOrgPerson + +# brace)right, Bad DNs, example.com +dn: uid=brace)right,ou=Bad DNs,dc=example.com +cn: Test +sn: Test +uid: brace)right +objectClass: inetOrgPerson + +# sign%percent, Bad DNs, example.com +dn: uid=sign%percent,ou=Bad DNs,dc=example.com +cn: Test +sn: Test +uid: sign%percent +objectClass: inetOrgPerson + +# sign\3Dequal, Bad DNs, example.com +dn: uid=sign\3Dequal,ou=Bad DNs,dc=example.com +uid: sign=equal +cn: Test +sn: Test +objectClass: inetOrgPerson + +# sign\2Bplus, Bad DNs, example.com +dn: uid=sign\2Bplus,ou=Bad DNs,dc=example.com +cn: Test +sn: Test +uid: sign+plus +objectClass: inetOrgPerson + +# colon\3Bsemi, Bad DNs, example.com +dn: uid=colon\3Bsemi,ou=Bad DNs,dc=example.com +cn: Test +sn: Test +uid: colon;semi +objectClass: inetOrgPerson + +# colon:full, Bad DNs, example.com +dn: uid=colon:full,ou=Bad DNs,dc=example.com +cn: Test +sn: Test +uid: colon:full +objectClass: inetOrgPerson + +# multi + sign@at, Bad DNs, example.com +dn: uid=multi+uid=sign@at,ou=Bad DNs,dc=example.com +cn: Test +sn: Test +uid: multi +uid: sign@at +objectClass: inetOrgPerson + +# sign@at + multi-mixed, Bad DNs, example.com +dn: sn=sign@at+uid=multi-mixed,ou=Bad DNs,dc=example.com +cn: Test +uid: multi-mixed +sn: sign@at +objectClass: inetOrgPerson + +# Non English Chars, example.com +dn: ou=Non English Chars,dc=example.com +ou: Non English Chars +objectClass: organizationalUnit +objectClass: top + +# \D0\A7\D0\B5\D0\BB\D0\BE\D0\B2\D0\B5\D0\BA\D0\B8, Non English Chars, exampl + e.com +dn:: Y2490KfQtdC70L7QstC10LrQuCxvdT1Ob24gRW5nbGlzaCBDaGFycyxkYz1leGFtcGxlLmNvb + Q== +cn:: 0KfQtdC70L7QstC10LrQuA== +objectClass: inetOrgPerson +objectClass: top +sn:: 0KfQtdC70L7QstC10LrQuA== + +# \D0\94\D0\B5\D0\B4 \D0\9B\D0\BE\D0\B3\D0\BE\D0\BF\D0\B5\D0\B4, \D0\A7\D0\B5 + \D0\BB\D0\BE\D0\B2\D0\B5\D0\BA\D0\B8, Non English Chars, example.com +dn:: Y2490JTQtdC0INCb0L7Qs9C+0L/QtdC0LGNuPdCn0LXQu9C+0LLQtdC60Lgsb3U9Tm9uIEVuZ + 2xpc2ggQ2hhcnMsZGM9ZXhhbXBsZS5jb20= +cn:: 0JTQtdC0INCb0L7Qs9C+0L/QtdC0 +givenName:: 0JTQtdC0 +jpegPhoto:: /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBw + YIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQs + NFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAw + AEADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEA + wUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKS + o0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqK + jpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QA + HwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEB + SExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSE + lKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba + 3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9A/gj + 8Nx8IvhN4V8KPKsr6PpkNnJIv3WZV+Y/QnNc/wCINDutR1Q/Mux2yxHTFeTaP+17d+IfDN94w02OD + W/ANsF+0apZKZHtHOMxyKPmDDK8Ed69G8IfEHR/ij4aTxD4cv4760VMkxEjacdGBAKn2IoA5Txn4K + uIzO0v+rToyDjmvlL486HBb2jhdzEdNvrzXtvxB+NsNjeXdpFM7JFlQpbv6GvlD4qfE6/1Ca4nktW + kgI24Tkd+goA+b/ESSRXkoJIwejCuWuZFfOQAfUV1HiC9vNVuGmj064RJOjvC4HHpxXGXwntZT50T + p6FlIoAy9UQLE5A7VzDJ5h/Guj1aUi1ZvXisTyTGuDwR1oA/cX/gnT8CPFfwl/Z21nR/Gugpo9/rO + pSXS6df7XdrdoUQCZATtJKt8p5xjPWvefh98HdE8D3d3qcNnb2lzPGYXisVaO2EI6IIySOPWvRulY + XjjWYvD/hLVdQmfy4oLd3ZvQAUAfjx+0H42kHxR8TLajybdb2VY4lPAAY4FefeGbx9Q1yzlu7f+0r + bdmSEt8x9QAeK1PiQi614n1LUlbi4neXn3Ymud0m9l0G6jlVC6E5OOoPqKAIPFPhq88O+Mr7V9J1i + /trC4kMyWaiRHyf4Sn3BjpnJGKpT6yNe0lk1W0jN2DgTBAN49T716NqOrXXiC1807dm3rIcV5j4mb + 7KrZYbsHkUAeW+JIEt7hIYwCqtvwPb/ACKwXBySec1v39nPc3DTshCNwmR1HrVGfT2jIJHFAH9Gkf + xQspdds7KKOWaGZtr3CITHEMcMzdAM4/OuR/aP1qLXPhtqOiaVdQzXV4hQ/PhQMcknFeXeAdRnSzR + xG88UxGx9mVJPTnHGcGuk1+4h1LSnijRHkYlVjk4kVvQHHrQB+f8A4m/Zy8Y380kOnapokEZGS91c + vk+wAQ1zq/svfEC5/cp4i0O2KHaR5UzsT/3yM19ea9aW8R3y3ElndKSWhdBtkB6HBxj6g1w+tarcx + RRXLxS3mmxuE3ohCA9SNwwwP1oA8Ksv2WvHGAl143s40xjba6cznn/eYVFrX7LRuYUjbxa817nkTW + B2MPqrEj9a9jXxZqt4DEkqoVb93DKN3b+8MEHjjI9Kq6j421mwSNL64ESSqytuYOj+gYdvqKAPAvF + /wOv9EtR5z2tyEG3fDuX9GUYryPXfB15axs62ryxhtu+Ebxn6rmvpXW9cilF00+piYDO17cOVK9Mc + 9vqO1eQ+LNVSOd3g3NAvJMmUJ+vP9aAP/9k= +objectClass: inetOrgPerson +objectClass: top +sn:: 0JvQvtCz0L7Qv9C10LQ= + +# search result +search: 2 +result: 0 Success + +# numResponses: 26 +# numEntries: 25 diff --git a/doc/phpldapadmin-demo.conf b/doc/phpldapadmin-demo.conf new file mode 100644 index 0000000..91d602c --- /dev/null +++ b/doc/phpldapadmin-demo.conf @@ -0,0 +1,59 @@ +TLSCACertificateFile /etc/openldap/pla/ca-bundle.crt +TLSCertificateFile /etc/openldap/pla/slapd.crt +TLSCertificateKeyFile /etc/openldap/pla/slapd.key + +access to dn.regex="dc=example.com$" + by * write +access to dn.regex="dc=example,dc=com$" + by * write +access to dn.regex="o=Simpsons$" + by self write + by dn.regex="cn=.*,ou=People,o=Simpsons" write + by * read +access to * + by * read + +database ldbm +suffix "dc=example.com" +rootdn "cn=Manager,dc=example.com" +rootpw NotAllowed +directory /var/lib/ldap/pla-1 +dirtyread +cachesize 2000 +checkpoint 32 1 +# Indices to maintain for this database +index objectClass eq,pres +index ou,cn,mail,surname,givenname eq,pres,sub +index uidNumber,gidNumber,loginShell eq,pres +index uid,memberUid eq,pres,sub +index nisMapName,nisMapEntry eq,pres,sub + +database ldbm +suffix "dc=example,dc=com" +rootdn "cn=Manager,dc=example,dc=com" +rootpw NotAllowed +directory /var/lib/ldap/pla-2 +dirtyread +cachesize 2000 +checkpoint 32 1 +# Indices to maintain for this database +index objectClass eq,pres +index ou,cn,mail,surname,givenname eq,pres,sub +index uidNumber,gidNumber,loginShell eq,pres +index uid,memberUid eq,pres,sub +index nisMapName,nisMapEntry eq,pres,sub + +database ldbm +suffix "o=Simpsons" +rootdn "cn=Manager,o=Simpsons" +rootpw NotAllowed +directory /var/lib/ldap/pla-3 +dirtyread +cachesize 2000 +checkpoint 32 1 +# Indices to maintain for this database +index objectClass eq,pres +index ou,cn,mail,surname,givenname eq,pres,sub +index uidNumber,gidNumber,loginShell eq,pres +index uid,memberUid eq,pres,sub +index nisMapName,nisMapEntry eq,pres,sub diff --git a/hooks/classes/README b/hooks/classes/README new file mode 100644 index 0000000..1a0f343 --- /dev/null +++ b/hooks/classes/README @@ -0,0 +1,3 @@ +Put your hook class files here. + +A file wich contains "class MyClass" definition must be called "MyClass.php". diff --git a/hooks/functions/README b/hooks/functions/README new file mode 100644 index 0000000..e5b29d7 --- /dev/null +++ b/hooks/functions/README @@ -0,0 +1 @@ +Put your hook function files here. \ No newline at end of file diff --git a/htdocs/add_attr.php b/htdocs/add_attr.php index 5157089..7443ccc 100644 --- a/htdocs/add_attr.php +++ b/htdocs/add_attr.php @@ -1,11 +1,9 @@ isReadOnly() ) - pla_error( _('You cannot perform updates while server is in read-only mode') ); -if( ! $ldapserver->haveAuthInfo()) - pla_error( _('Not enough information to login to server. Please check your configuration.') ); +if ($ldapserver->isReadOnly()) + pla_error(_('You cannot perform updates while server is in read-only mode')); -$attr = $_POST['attr']; -$val = isset( $_POST['val'] ) ? $_POST['val'] : false;; -$dn = $_POST['dn'] ; -$is_binary_val = isset( $_POST['binary'] ) ? true : false; +if (! $_SESSION['plaConfig']->isCommandAvailable('attribute_add')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('add attribute'))); -$encoded_dn = rawurlencode( $dn ); -$encoded_attr = rawurlencode( $attr ); +$entry['val'] = get_request('val','POST'); +$entry['binary'] = get_request('binary','POST'); -if( ! $is_binary_val && $val == "" ) { - pla_error( _('You left the attribute value blank. Please go back and try again.') ); +$entry['dn']['string'] = get_request('dn','POST'); +$entry['dn']['encode'] = rawurlencode($entry['dn']['string']); + +$entry['attr']['string'] = get_request('attr','POST'); +$entry['attr']['encode'] = rawurlencode($entry['attr']['string']); + +if ((strlen($entry['binary']) <= 0) && (strlen($entry['val']) <= 0)) + pla_error(_('You left the attribute value blank. Please go back and try again.')); + +/* + * Special case for binary attributes (like jpegPhoto and userCertificate): + * we must go read the data from the file and override $val with the binary data + * Secondly, we must check if the ";binary" option has to be appended to the name + * of the attribute. + */ + +# Check to see if this is a unique Attribute +if ($badattr = $ldapserver->checkUniqueAttr($entry['dn']['string'],$entry['attr']['string'],array($entry['val']))) { + $href = htmlspecialchars(sprintf('cmd.php?cmd=search&search=true&form=advanced&server_id=%s&filter=%s=%s', + $ldapserver->server_id,$entry['attr']['string'],$badattr)); + + pla_error(sprintf(_('Your attempt to add %s (%s) to
%s
is NOT allowed. That attribute/value belongs to another entry.

You might like to search for that entry.'),$entry['attr']['string'],$badattr,$entry['dn']['string'],$href)); } -// special case for binary attributes (like jpegPhoto and userCertificate): -// we must go read the data from the file and override $val with the binary data -// Secondly, we must check if the ";binary" option has to be appended to the name -// of the attribute. +if (strlen($entry['binary']) > 0) { + if ($_FILES['val']['size'] == 0) + pla_error(_('The file you chose is either empty or does not exist. Please go back and try again.')); -// Check to see if this is a unique Attribute -if ($badattr = $ldapserver->checkUniqueAttr($dn,$attr,array($val))) { - $search_href = sprintf('search.php?search=true&form=advanced&server_id=%s&filter=%s=%s',$ldapserver->server_id,$attr,$badattr); - pla_error(sprintf( _('Your attempt to add %s (%s) to
%s
is NOT allowed. That attribute/value belongs to another entry.

You might like to search for that entry.'),$attr,$badattr,$dn,$search_href ) ); -} - -if( $is_binary_val ) { - if( 0 == $_FILES['val']['size'] ) - pla_error( _('The file you chose is either empty or does not exist. Please go back and try again.') ); - - if( ! is_uploaded_file( $_FILES['val']['tmp_name'] ) ) { - - if( isset( $_FILES['val']['error'] ) ) + if (! is_uploaded_file($_FILES['val']['tmp_name'])) { + if (isset($_FILES['val']['error'])) switch($_FILES['val']['error']) { - case 0: //no error; possible file attack! - pla_error( _('Security error: The file being uploaded may be malicious.') ); + case 0: # No error; possible file attack! + pla_error(_('Security error: The file being uploaded may be malicious.')); break; - case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini - pla_error( _('The file you uploaded is too large. Please check php.ini, upload_max_size setting') ); + case 1: # Uploaded file exceeds the upload_max_filesize directive in php.ini + pla_error(_('The file you uploaded is too large. Please check php.ini, upload_max_size setting')); break; - case 2: //uploaded file exceeds the MAX_FILE_SIZE directive specified in the html form - pla_error( _('The file you uploaded is too large. Please check php.ini, upload_max_size setting') ); + case 2: # Uploaded file exceeds the MAX_FILE_SIZE directive specified in the html form + pla_error(_('The file you uploaded is too large. Please check php.ini, upload_max_size setting')); break; - case 3: //uploaded file was only partially uploaded - pla_error( _('The file you selected was only partially uploaded, likley due to a network error.') ); + case 3: # Uploaded file was only partially uploaded + pla_error(_('The file you selected was only partially uploaded, likley due to a network error.')); break; - case 4: //no file was uploaded - pla_error( _('You left the attribute value blank. Please go back and try again.') ); + case 4: # No file was uploaded + pla_error(_('You left the attribute value blank. Please go back and try again.')); break; - default: //a default error, just in case! :) - pla_error( _('Security error: The file being uploaded may be malicious.') ); + default: # A default error, just in case! :) + pla_error(_('Security error: The file being uploaded may be malicious.')); break; } else - pla_error( _('Security error: The file being uploaded may be malicious.') ); + pla_error(_('Security error: The file being uploaded may be malicious.')); } - $file = $_FILES['val']['tmp_name']; - $f = fopen( $file, 'r' ); - $binary_data = fread( $f, filesize( $file ) ); - fclose( $f ); + $binaryfile['name'] = $_FILES['val']['tmp_name']; + $binaryfile['handle'] = fopen($binaryfile['name'],'r'); + $binaryfile['data'] = fread($binaryfile['handle'],filesize($binaryfile['name'])); + fclose($binaryfile['handle']); - $val = $binary_data; + $entry['val'] = $binaryfile['data']; - if( is_binary_option_required( $ldapserver, $attr ) ) - $attr .= ";binary"; + if (is_binary_option_required($ldapserver,$entry['attr']['string'])) + $entry['attr']['string'] .= ';binary'; } /* Automagically hash new userPassword attributes according to the chosen in config.php. */ -if( 0 == strcasecmp( $attr, 'userpassword' ) ) { +if (strcasecmp($entry['attr']['string'],'userpassword') == 0) { if (trim($ldapserver->default_hash) != '' ) { $enc_type = $ldapserver->default_hash; - $val = password_hash( $val, $enc_type ); + $entry['val'] = password_hash($entry['val'],$enc_type); } -} -elseif (strcasecmp($attr,'sambaNTPassword') == 0) { +} elseif (strcasecmp($entry['attr']['string'],'sambaNTPassword') == 0) { $sambapassword = new smbHash; - $val = $sambapassword->nthash($val); -} + $entry['val'] = $sambapassword->nthash($entry['val']); -elseif (strcasecmp($attr,'sambaLMPassword') == 0) { +} elseif (strcasecmp($entry['attr']['string'],'sambaLMPassword') == 0) { $sambapassword = new smbHash; - $val = $sambapassword->lmhash($val); + $entry['val'] = $sambapassword->lmhash($entry['val']); } -$new_entry = array( $attr => $val ); -$result = $ldapserver->attrModify($dn,$new_entry); +$new_entry = array($entry['attr']['string'] => $entry['val']); +$result = $ldapserver->attrModify($entry['dn']['string'],$new_entry); -if ($result) - header(sprintf('Location: template_engine.php?server_id=%s&dn=%s&modified_attrs[]=%s', - $ldapserver->server_id,$encoded_dn,$encoded_attr)); +if ($result) { + header(sprintf('Location: cmd.php?cmd=template_engine&server_id=%s&dn=%s&modified_attrs[]=%s', + $ldapserver->server_id,$entry['dn']['encode'],$entry['attr']['encode'])); + die(); -else - pla_error( _('Failed to add the attribute.'),$ldapserver->error(),$ldapserver->errno() ); +} else { + pla_error(_('Failed to add the attribute.'),$ldapserver->error(),$ldapserver->errno()); +} /** * Check if we need to append the ;binary option to the name @@ -135,31 +137,25 @@ else * @return bool */ -function is_binary_option_required( $ldapserver, $attr ) { - - // list of the binary attributes which need the ";binary" option +function is_binary_option_required($ldapserver,$attr) { + # List of the binary attributes which need the ";binary" option $binary_attributes_with_options = array( - // Superior: Ldapv3 Syntaxes (1.3.6.1.4.1.1466.115.121.1) - '1.3.6.1.4.1.1466.115.121.1.8' => "userCertificate", - '1.3.6.1.4.1.1466.115.121.1.8' => "caCertificate", - '1.3.6.1.4.1.1466.115.121.1.10' => "crossCertificatePair", - '1.3.6.1.4.1.1466.115.121.1.9' => "certificateRevocationList", - '1.3.6.1.4.1.1466.115.121.1.9' => "authorityRevocationList", - // Superior: Netscape Ldap attributes types (2.16.840.1.113730.3.1) - '2.16.840.1.113730.3.1.40' => "userSMIMECertificate" + # Superior: Ldapv3 Syntaxes (1.3.6.1.4.1.1466.115.121.1) + '1.3.6.1.4.1.1466.115.121.1.8' => 'userCertificate', + '1.3.6.1.4.1.1466.115.121.1.8' => 'caCertificate', + '1.3.6.1.4.1.1466.115.121.1.10' => 'crossCertificatePair', + '1.3.6.1.4.1.1466.115.121.1.9' => 'certificateRevocationList', + '1.3.6.1.4.1.1466.115.121.1.9' => 'authorityRevocationList', + # Superior: Netscape Ldap attributes types (2.16.840.1.113730.3.1) + '2.16.840.1.113730.3.1.40' => 'userSMIMECertificate' ); - // quick check by attr name (short circuits the schema check if possible) - //foreach( $binary_attributes_with_options as $oid => $name ) - //if( 0 == strcasecmp( $attr, $name ) ) - //return true; - $schema_attr = $ldapserver->getSchemaAttribute($attr); - if( ! $schema_attr ) + if (! $schema_attr) return false; $syntax = $schema_attr->getSyntaxOID(); - if( isset( $binary_attributes_with_options[ $syntax ] ) ) + if (isset($binary_attributes_with_options[$syntax])) return true; return false; diff --git a/htdocs/add_attr_form.php b/htdocs/add_attr_form.php index b3e967a..1ba7710 100644 --- a/htdocs/add_attr_form.php +++ b/htdocs/add_attr_form.php @@ -1,11 +1,9 @@ isReadOnly()) pla_error(_('You cannot perform updates while server is in read-only mode')); -if (! $ldapserver->haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); -$dn = $_GET['dn']; -$encoded_dn = rawurlencode($dn); -$rdn = get_rdn($dn); +$entry['dn']['string'] = get_request('dn','GET'); +$entry['rdn'] = get_rdn($entry['dn']['string']); -$friendly_attrs = process_friendly_attr_table(); - -include './header.php'; - -echo ''; - -printf('

%s %s

',_('Add new attribute'),htmlspecialchars($rdn)); +printf('

%s %s

',_('Add new attribute'),htmlspecialchars($entry['rdn'])); printf('

%s: %s     %s: %s

', - _('Server'),$ldapserver->name,_('Distinguished Name'),htmlspecialchars($dn)); + _('Server'),$ldapserver->name,_('Distinguished Name'),htmlspecialchars($entry['dn']['string'])); -$attrs = $ldapserver->getDNAttrs($dn); +$dn['attrs'] = $ldapserver->getDNAttrs($entry['dn']['string']); +$dn['oclasses'] = $ldapserver->getDNAttr($entry['dn']['string'],'objectClass'); -$oclasses = $ldapserver->getDNAttr($dn,'objectClass'); -if (! is_array($oclasses)) - $oclasses = array($oclasses); +if (! is_array($dn['oclasses'])) + $dn['oclasses'] = array($dn['oclasses']); -$avail_attrs = array(); +$ldap['attrs']['avail'] = array(); -if (array_search('extensibleObject',$oclasses) !== FALSE) { - $schema_attrs = $ldapserver->SchemaAttributes(); +if (array_search('extensibleObject',$dn['oclasses']) !== false) { + $ldap['attrs']['ldap'] = $ldapserver->SchemaAttributes(); - foreach ($schema_attrs as $attr) - $avail_attrs[]=$attr->getName(); + foreach ($ldap['attrs']['ldap'] as $attr) + $ldap['attrs']['avail'][] = $attr->getName(); } else { - $schema_oclasses = $ldapserver->SchemaObjectClasses($dn); + $ldap['oclasses'] = $ldapserver->SchemaObjectClasses($entry['dn']['string']); - foreach ($oclasses as $oclass) { - $schema_oclass = $ldapserver->getSchemaObjectClass($oclass,$dn); + foreach ($dn['oclasses'] as $oclass) { + $ldap['oclass'] = $ldapserver->getSchemaObjectClass($oclass,$entry['dn']['string']); - if ($schema_oclass && strcasecmp('objectclass',get_class($schema_oclass)) == 0) - $avail_attrs = array_merge($schema_oclass->getMustAttrNames($schema_oclasses), - $schema_oclass->getMayAttrNames($schema_oclasses), - $avail_attrs); + if ($ldap['oclass'] && strcasecmp('objectclass',get_class($ldap['oclass'])) == 0) + $ldap['attrs']['avail'] = array_merge($ldap['oclass']->getMustAttrNames($ldap['oclasses']), + $ldap['oclass']->getMayAttrNames($ldap['oclasses']), + $ldap['attrs']['avail']); } } -$avail_attrs = array_unique($avail_attrs); -$avail_attrs = array_filter($avail_attrs,'not_an_attr'); -sort($avail_attrs); +$ldap['attrs']['avail'] = array_unique($ldap['attrs']['avail']); +$ldap['attrs']['avail'] = array_filter($ldap['attrs']['avail'],'not_an_attr'); +sort($ldap['attrs']['avail']); -$avail_binary_attrs = array(); - -foreach ($avail_attrs as $i => $attr) { +$ldap['binattrs']['avail'] = array(); +foreach ($ldap['attrs']['avail'] as $i => $attr) { if ($ldapserver->isAttrBinary($attr)) { - $avail_binary_attrs[] = $attr; - unset($avail_attrs[$i]); + $ldap['binattrs']['avail'][] = $attr; + unset($ldap['attrs']['avail'][$i]); } } echo '
'; -if (is_array($avail_attrs) && count($avail_attrs) > 0) { +if (is_array($ldap['attrs']['avail']) && count($ldap['attrs']['avail']) > 0) { echo '
'; echo _('Add new attribute'); echo '
'; echo '
'; - echo '
'; + echo ''; + echo ''; printf('',$ldapserver->server_id); - printf('',htmlspecialchars($dn)); + printf('',htmlspecialchars($entry['dn']['string'])); echo ''; printf('',$ldapserver->server_id); - printf('',$dn); + printf('',$entry['dn']['string']); echo ''; echo ''; + printf('',rawurlencode(serialize($entry['oclass']['new']))); + printf('',rawurlencode($entry['dn']['string'])); + printf('',$ldapserver->server_id); - + echo ''; + printf('',_('New Required Attributes')); -
-
+ foreach ($ldap['attrs']['need'] as $count => $attr) { + printf('',htmlspecialchars($attr->getName())); + printf('',htmlspecialchars($attr->getName())); + } - - - - + echo '
%s
%s
'; - - + echo '

'; - $attr ) { ?> + printf('
',_('Add ObjectClass and Attributes')); + echo ''; - - - +} else { + $result = $ldapserver->attrModify($entry['dn']['string'],array('objectClass'=>$entry['oclass']['new'])); -
getName()); ?>
-
-
-
- + if (! $result) + pla_error('Could not perform ldap_mod_add operation.',$ldapserver->error(),$ldapserver->errno()); - - - -attrModify($dn,array('objectClass'=>$new_oclass)); - if (! $add_res) - pla_error("Could not perform ldap_mod_add operation.", - $ldapserver->error(),$ldapserver->errno()); - else - header(sprintf('Location: template_engine.php?server_id=%s&dn=%s&modified_attrs[]=objectClass', - $ldapserver->server_id,$encoded_dn)); + else { + $href = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s&modified_attrs[]=objectClass', + $ldapserver->server_id,rawurlencode($entry['dn']['string'])); + header(sprintf('Location: %s',$href)); + die(); + } } ?> diff --git a/htdocs/add_value.php b/htdocs/add_value.php index 91feb92..a98e12a 100644 --- a/htdocs/add_value.php +++ b/htdocs/add_value.php @@ -1,11 +1,9 @@ isReadOnly()) + pla_error(_('You cannot perform updates while server is in read-only mode')); -if( $ldapserver->isReadOnly() ) - pla_error( _('You cannot perform updates while server is in read-only mode') ); -if( ! $ldapserver->haveAuthInfo()) - pla_error( _('Not enough information to login to server. Please check your configuration.') ); +if (! $_SESSION['plaConfig']->isCommandAvailable('attribute_add_value')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('add attribute value'))); -$attr = $_POST['attr']; -$new_value = $_POST['new_value']; -$dn = rawurldecode( $_POST['dn'] ); -$is_binary_val = isset( $_POST['binary'] ) ? true : false; +# The DN and ATTR we are working with. +$entry['dn']['encode'] = get_request('dn','POST',true); +$entry['dn']['string'] = rawurldecode($entry['dn']['encode']); +$entry['attr']['encode'] = get_request('attr','POST',true); +$entry['attr']['string'] = rawurldecode($entry['attr']['encode']); +$entry['attr']['html'] = htmlspecialchars($entry['attr']['string']); -$encoded_dn = rawurlencode( $dn ); -$encoded_attr = rawurlencode( $attr ); +$entry['value']['string'] = get_request('new_value','POST',true); +$entry['value']['bin'] = get_request('binary','POST') ? true : false; -if ($ldapserver->isAttrReadOnly($attr)) - pla_error(sprintf(_('The attribute "%s" is flagged as read-only in the phpLDAPadmin configuration.'),htmlspecialchars( $attr ))); +if ($ldapserver->isAttrReadOnly($entry['attr']['string'])) + pla_error(sprintf(_('The attribute "%s" is flagged as read-only in the phpLDAPadmin configuration.'),$entry['attr']['html'])); -// special case for binary attributes: -// we must go read the data from the file. -if( $is_binary_val ) { - $file = $_FILES['new_value']['tmp_name']; +/* + * Special case for binary attributes: + * we must go read the data from the file. + */ +if ($entry['value']['bin']) { + $binaryfile['name'] = $_FILES['new_value']['tmp_name']; + $binaryfile['handle'] = fopen($binaryfile['name'],'r'); + $binaryfile['data'] = fread($binaryfile['handle'],filesize($binaryfile['name'])); + fclose($binaryfile['handle']); - $f = fopen( $file, 'r' ); - $binary_value = fread( $f, filesize( $file ) ); - fclose( $f ); - - $new_value = $binary_value; + $entry['value']['string'] = $binaryfile['data']; } -$new_entry = array( $attr => $new_value ); +$new_entry = array($entry['attr']['string']=>$entry['value']['string']); -// Check to see if this is a unique Attribute -if ($badattr = $ldapserver->checkUniqueAttr($dn,$attr,$new_entry)) { - $search_href = sprintf('search.php?search=true&form=advanced&server_id=%s&filter=%s=%s',$ldapserver->server_id,$attr,$badattr); - pla_error(sprintf( _('Your attempt to add %s (%s) to
%s
is NOT allowed. That attribute/value belongs to another entry.

You might like to search for that entry.'),$attr,$badattr,$dn,$search_href ) ); +# Check to see if this is a unique Attribute +if ($badattr = $ldapserver->checkUniqueAttr($entry['dn']['string'],$entry['attr']['string'],$new_entry)) { + $href = htmlspecialchars(sprintf('cmd.php?cmd=search&search=true&form=advanced&server_id=%s&filter=%s=%s', + $ldapserver->server_id,$entry['attr']['string'],$badattr)); + + pla_error(sprintf(_('Your attempt to add %s (%s) to
%s
is NOT allowed. That attribute/value belongs to another entry.

You might like to search for that entry.'),$entry['attr']['string'],$badattr,$entry['dn']['string'],$href)); } -// Call the custom callback for each attribute modification -// and verify that it should be modified. -if( run_hook ( 'pre_attr_add', array ( 'server_id' => $ldapserver->server_id, 'dn' => $dn, 'attr_name' => $attr, - 'new_value' => $new_entry ) ) ) { +# Call the custom callback for each attribute modification and verify that it should be modified. +if (run_hook('pre_attr_add', + array('server_id'=>$ldapserver->server_id,'dn'=> $entry['dn']['string'],'attr_name'=>$entry['attr']['string'],'new_value'=>$new_entry))) { - $add_result = $ldapserver->attrModify($dn,$new_entry); + if (run_hook('pre_attr_modify', + array('server_id'=>$ldapserver->server_id,'dn'=>$entry['dn']['string'],'attr_name'=>$entry['attr']['string'],'new_value'=>$new_entry))) { - if (! $add_result) - pla_error(_('Could not perform ldap_mod_add operation.'), - $ldapserver->error(),$ldapserver->errno()); + $add_result = $ldapserver->attrModify($entry['dn']['string'],$new_entry); + + if (! $add_result) { + pla_error(_('Could not perform ldap_mod_add operation.'), + $ldapserver->error(),$ldapserver->errno()); + } else { + run_hook('post_attr_modify', + array('server_id'=>$ldapserver->server_id,'dn'=>$entry['dn']['string'],'attr_name'=>$entry['attr']['string'],'new_value'=>$new_entry)); + } + } } -header(sprintf('Location: template_engine.php?server_id=%s&dn=%s&modified_attrs[]=%s', - $ldapserver->server_id,$encoded_dn,$encoded_attr)); +header(sprintf('Location: cmd.php?cmd=template_engine&server_id=%s&dn=%s&modified_attrs[]=%s', + $ldapserver->server_id,$entry['dn']['encode'],$entry['attr']['encode'])); +die(); ?> diff --git a/htdocs/add_value_form.php b/htdocs/add_value_form.php index d5cd81d..f6baee2 100644 --- a/htdocs/add_value_form.php +++ b/htdocs/add_value_form.php @@ -1,16 +1,10 @@ isReadOnly()) pla_error(_('You cannot perform updates while server is in read-only mode')); -if (! $ldapserver->haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); -$attr = $_GET['attr']; -$dn = isset($_GET['dn']) ? $_GET['dn'] : null; -$encoded_dn = rawurlencode($dn); -$encoded_attr = rawurlencode($attr); +# The DN and ATTR we are working with. +$entry['dn']['encode'] = get_request('dn','GET',true); +$entry['dn']['string'] = urldecode($entry['dn']['encode']); +$entry['dn']['html'] = htmlspecialchars($entry['dn']['string']); +$entry['attr']['string'] = get_request('attr','GET',true); +$entry['attr']['encode'] = rawurlencode($entry['attr']['string']); +$entry['attr']['html'] = htmlspecialchars($entry['attr']['string']); -if (! is_null($dn)) - $rdn = get_rdn($dn); +if (! is_null($entry['dn']['string'])) + $entry['rdn']['string'] = get_rdn($entry['dn']['string']); else - $rdn = null; + $entry['rdn']['string'] = null; +$entry['rdn']['html'] = htmlspecialchars($entry['rdn']['string']); -$current_values = $ldapserver->getDNAttr($dn,$attr); -if ($current_values) { - if (! is_array($current_values)) - $current_values = array($current_values); +/***************/ +/* get entry */ +/***************/ + +if (! $entry['dn']['string'] || ! $ldapserver->dnExists($entry['dn']['string'])) + pla_error(sprintf(_('The entry (%s) does not exist.'),$entry['dn']['html']),null,-1,true); - $num_current_values = count($current_values); +$tree = get_cached_item($ldapserver->server_id,'tree'); +$entry['ldap'] = null; +if ($tree) { + $entry['ldap'] = $tree->getEntry($entry['dn']['string']); -} else { - $current_values = array(); - $num_current_values = 0; + if (! $entry['ldap']) + $tree->addEntry($entry['dn']['string']); + + $entry['ldap'] = $tree->getEntry($entry['dn']['string']); } -$is_object_class = (strcasecmp($attr, 'objectClass') == 0) ? true : false; +// define the template of the entry if possible +eval('$reader = new '.$_SESSION['plaConfig']->GetValue('appearance','entry_reader').'($ldapserver);'); +$reader->visit('Start', $entry['ldap']); -if ($is_object_class) { - # fetch all available objectClasses and remove those from the list that are already defined in the entry - $schema_oclasses = $ldapserver->SchemaObjectClasses(); +if (! $entry['ldap'] || $entry['ldap']->isReadOnly()) + pla_error(sprintf(_('The entry (%s) is in readonly mode.'),$entry['dn']['html']),null,-1,true); - foreach($current_values as $oclass) - unset($schema_oclasses[strtolower($oclass)]); +/*********************/ +/* attribute values */ +/*********************/ +eval('$writer = new '.$_SESSION['plaConfig']->GetValue('appearance','entry_writer').'($ldapserver);'); + +$ldap['attr'] = $entry['ldap']->getAttribute($entry['attr']['string']); +if (!$ldap['attr']) { + // define a new attribute for the entry + $attributefactoryclass = $_SESSION['plaConfig']->GetValue('appearance','attribute_factory'); + eval('$attribute_factory = new '.$attributefactoryclass.'();'); + $ldap['attr'] = $attribute_factory->newAttribute($entry['attr']['string'], array()); + $ldap['attr']->setEntry($entry['ldap']); +} +$ldap['count'] = $ldap['attr']->getValueCount(); + +if ($ldap['attr']->isReadOnly()) + pla_error(sprintf(_('The attribute (%s) is in readonly mode.'),$entry['attr']['html']),null,-1,true); +if (! $_SESSION['plaConfig']->isCommandAvailable('attribute_add_value')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('add attribute value'))); +if (($ldap['attr']->getValueCount() == 0) && ! $_SESSION['plaConfig']->isCommandAvailable('attribute_add')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('add attribute'))); + +/* +$ldap['attrs'] = $ldapserver->getDNAttr($entry['dn']['string'],$entry['attr']['string']); +$ldap['count'] = count($ldap['attrs']); +*/ + +$entry['attr']['oclass'] = (strcasecmp($entry['attr']['string'],'objectClass') == 0) ? true : false; + +if ($entry['attr']['oclass']) { + # Fetch all available objectClasses and remove those from the list that are already defined in the entry + $ldap['oclasses'] = $ldapserver->SchemaObjectClasses(); + + foreach($ldap['attr']->getValues() as $oclass) + unset($ldap['oclasses'][strtolower($oclass)]); } else { - $schema_attr = $ldapserver->getSchemaAttribute($attr); + $ldap['schema'] = $ldapserver->getSchemaAttribute($entry['attr']['string']); } -include './header.php'; - -echo ''; printf('

%s %s %s %s

', - _('Add new'),htmlspecialchars($attr),_('value to'),htmlspecialchars($rdn)); + _('Add new'),$entry['attr']['html'],_('value to'),$entry['rdn']['html']); printf('

%s %s     %s: %s

', - _('Server'),$ldapserver->name,_('Distinguished Name'),htmlspecialchars($dn)); + _('Server'),$ldapserver->name,_('Distinguished Name'),$entry['dn']['html']); -printf('%s %s %s %s:', - _('Current list of'),$num_current_values,_('values for attribute'),htmlspecialchars($attr)); +if ($ldap['count']) { + printf('%s %s %s %s%s', + _('Current list of'),$ldap['count'],_('values for attribute'),$ldap['attr']->getFriendlyName(),_(':')); +} else { + printf('%s %s.', + _('No current value for attribute'),$ldap['attr']->getFriendlyName()); +} -if ($num_current_values) { - if ($ldapserver->isJpegPhoto($attr)) { +if ($entry['attr']['oclass']) { + echo '
'; + echo ''; +} else { + echo ''; + echo ''; - echo '"; @@ -315,7 +311,7 @@ foreach ($attrs_all as $attr) { if (trim($val) == "") echo "[" . _('empty') . "]
\n"; - elseif (0 == strcasecmp($attr,'userPassword') && $config->GetValue('appearance','obfuscate_password_display')) + elseif (0 == strcasecmp($attr,'userPassword') && $_SESSION['plaConfig']->GetValue('appearance','obfuscate_password_display')) echo preg_replace('/./','*',$val) . "
"; else @@ -324,7 +320,7 @@ foreach ($attrs_all as $attr) { // @todo: redundant - $vals is always an array. } else { - if (0 == strcasecmp($attr,'userPassword') && $config->GetValue('appearance','obfuscate_password_display')) + if (0 == strcasecmp($attr,'userPassword') && $_SESSION['plaConfig']->GetValue('appearance','obfuscate_password_display')) echo preg_replace('/./','*',$vals) . "
"; else echo $vals . "
"; @@ -434,7 +430,7 @@ foreach ($attrs_all as $attr) { // Is this value is a structural objectClass, make it read-only if (0 == strcasecmp($attr,'objectClass')) { ?> - + getSchemaObjectClass($val); @@ -452,7 +448,7 @@ foreach ($attrs_all as $attr) { if (is_dn_string($val) || $ldapserver->isDNAttr($attr)) { ?> - + @@ -500,7 +496,6 @@ foreach ($attrs_all as $attr) { isReadOnly()) { // First check if the required objectClass is in this DN @@ -522,10 +517,10 @@ foreach ($attrs_all as $attr) { if (! $isOK) { if (count($src_oclass) == 1) { - $add_href = sprintf('add_oclass_form.php?server_id=%s&dn=%s&new_oclass=%s', + $add_href = sprintf('cmd.php?cmd=add_oclass_form&server_id=%s&dn=%s&new_oclass=%s', $ldapserver_dst->server_id,$encoded_dn_dst,$src_oclass[0]); } else { - $add_href = sprintf('add_value_form.php?server_id=%s&dn=%s&attr=objectClass', + $add_href = sprintf('cmd.php?cmd=add_value_form&server_id=%s&dn=%s&attr=objectClass', $ldapserver_dst->server_id,$encoded_dn_dst); } @@ -537,7 +532,7 @@ foreach ($attrs_all as $attr) { } else { if (! $schema_attr_dst->getIsSingleValue() || (! isset($vals))) { - $add_href = sprintf('add_value_form.php?server_id=%s&dn=%s&attr=%s', + $add_href = sprintf('cmd.php?cmd=add_value_form&server_id=%s&dn=%s&attr=%s', $ldapserver_dst->server_id,$encoded_dn_dst,rawurlencode($attr)); printf('
(%s)
', @@ -550,8 +545,6 @@ foreach ($attrs_all as $attr) { - - $vals) */ @@ -565,6 +558,7 @@ if (! $ldapserver_dst->isReadOnly()) { ?>
'; - draw_jpeg_photos($ldapserver, $dn, $attr, false); + //printf('',$entry['attr']['encode']); + +} +printf('',$ldapserver->server_id); +printf('',$entry['dn']['encode']); + +if ($ldap['count']) { + // display current attribute values + echo '
'; + for ($i = 0; $i < $ldap['count']; $i++) { + $writer->draw('OldValue', $ldap['attr'], $i); + $writer->draw('ReadOnlyValue', $ldap['attr'], $i); + } echo '
'; + /* + if ($ldapserver->isJpegPhoto($entry['attr']['string'])) { + printf('
%s
', + draw_jpeg_photos($ldapserver,$entry['dn']['string'],$entry['attr']['string'],false)); - # - printf('

%s

', - _('Note: You will get an "inappropriate matching" error if you have not setup an EQUALITY rule on your LDAP server for this attribute.')); - # + # + printf('

%s

', + _('Note: You will get an "inappropriate matching" error if you have not setup an EQUALITY rule on your LDAP server for this attribute.')); + # - } elseif ($ldapserver->isAttrBinary($attr)) { + } elseif ($ldapserver->isAttrBinary($entry['attr']['string'])) { echo '
    '; + for ($i=1; $i<=count($vals); $i++) { + $href = sprintf('download_binary_attr.php?server_id=%s&dn=%s&attr=%s&value_num=%s', + $ldapserver->server_id,$entry['dn']['encode'],$entry['attr']['string'],$i-1); - if (is_array($vals)) { - for ($i=1; $i<=count($vals); $i++) { - $href = sprintf('download_binary_attr.php?server_id=%s&dn=%s&attr=%s&value_num=%s', - $ldapserver->server_id,$encoded_dn,$attr,$i-1); - - printf('
  • %s (%s)
  • ', - $href,_('download value'),$i); - } - - } else { - $href = sprintf('download_binary_attr.php?server_id=%s&dn=%s&attr=%s', - $ldapserver->server_id,$encoded_dn,$attr); - printf('
  • %s
  • ', - $href,_('download value')); + printf('
  • Save%s (%s)
  • ', + $href,_('download value'),$i); } - echo '
'; + # printf('

%s

', _('Note: You will get an "inappropriate matching" error if you have not setup an EQUALITY rule on your LDAP server for this attribute.')); @@ -108,27 +156,21 @@ if ($num_current_values) { } else { echo '
    '; - - if (is_array($current_values)) { - if (strcasecmp($attr,'userPassword') == 0) { - foreach ($current_values as $key => $value) { - if (obfuscate_password_display(get_enc_type($value))) - echo '
  • '.preg_replace('/./','*',$value).'
  • '; - else - echo '
  • '.htmlspecialchars($value).'
  • '; - } - - } else { - foreach ($current_values as $val) - printf('
  • %s
  • ',htmlspecialchars($val)); + if (strcasecmp($entry['attr']['string'],'userPassword') == 0) { + foreach ($ldap['attrs'] as $key => $value) { + if (obfuscate_password_display(get_enc_type($value))) + echo '
  • '.preg_replace('/./','*',$value).'
  • '; + else + echo '
  • '.htmlspecialchars($value).'
  • '; } } else { - printf('
  • %s
  • ',htmlspecialchars($current_values)); + foreach ($ldap['attrs'] as $val) + printf('
  • %s
  • ',htmlspecialchars($val)); } - echo '
'; } + */ } else { echo '

'; } @@ -136,13 +178,11 @@ if ($num_current_values) { echo _('Enter the value you would like to add:'); echo '

'; -if ($is_object_class) { - echo ''; - printf('',$ldapserver->server_id); - printf('',$encoded_dn); - +if ($entry['attr']['oclass']) { + // draw objectClass selection + echo '
'; echo ''; + echo '
'; echo '
'; - printf('',_('Add new ObjectClass')); + printf('',_('Add new ObjectClass')); + echo '
'; echo '
'; - if ($config->GetValue('appearance','show_hints')) - printf('
%s
', + if ($_SESSION['plaConfig']->GetValue('appearance','show_hints')) + printf('
Hint%s
', _('Note: You may be required to enter new attributes that these objectClass(es) require')); + echo ''; } else { - echo '
'; - - if ($ldapserver->isAttrBinary($attr)) - echo 'enctype="multipart/form-data"'; - - printf('',$ldapserver->server_id); - printf('',$encoded_dn); - printf('',$encoded_attr); - - if ($ldapserver->isAttrBinary($attr)) { + // draw a blank field + echo '
'; + $writer->draw('BlankValue', $ldap['attr'], $ldap['count']); + echo '
'; + /* + if ($ldapserver->isAttrBinary($entry['attr']['string'])) { echo ''; echo ''; } else { - if ($ldapserver->isMultiLineAttr($attr)) { + if ($ldapserver->isMultiLineAttr($entry['attr']['string'])) { echo ''; } else { printf('', - ($schema_attr->getMaxLength() ? sprintf(' maxlength="%s"',$schema_attr->getMaxLength()) : '')); + ($ldap['attr']->getMaxLength() ? sprintf(' maxlength="%s"',$ldap['attr']->getMaxLength()) : '')); - # draw the "browse" button next to this input box if this attr houses DNs: - if ($ldapserver->isDNAttr($attr)) + # Draw the "browse" button next to this input box if this attr houses DNs: + if ($ldapserver->isDNAttr($entry['attr']['string'])) draw_chooser_link("new_value_form.new_value", false); } } + */ - printf('',_('Add New Value')); - echo '
'; + if ($ldap['schema']->getDescription()) + printf('%s: %s
',_('Description'),$ldap['schema']->getDescription()); - if ($schema_attr->getDescription()) - printf('%s: %s
',_('Description'),$schema_attr->getDescription()); + if ($ldap['schema']->getType()) + printf('%s: %s
',_('Syntax'),$ldap['schema']->getType()); - if ($schema_attr->getType()) - printf('%s: %s
',_('Syntax'),$schema_attr->getType()); - - if ($schema_attr->getMaxLength()) + if ($ldap['schema']->getMaxLength()) printf('%s: %s %s
', - _('Maximum Length'),number_format($schema_attr->getMaxLength()),_('characters')); + _('Maximum Length'),number_format($ldap['schema']->getMaxLength()),_('characters')); + + echo '
'; + printf('',_('Add New Value')); + echo '
'; echo '
'; + + // javascript + echo ''; + + echo ''; + + echo ''; + + echo ''; + + echo ''; + + $writer->draw('Javascript', $ldap['attr']); + + echo ''; } -echo ''; ?> diff --git a/htdocs/cmd.php b/htdocs/cmd.php new file mode 100644 index 0000000..4c9a579 --- /dev/null +++ b/htdocs/cmd.php @@ -0,0 +1,52 @@ +SetBody(ob_get_contents()); +ob_end_clean(); + +if (DEBUG_ENABLED) + debug_log('Ready to render page for command [%s,%s].',128,__FILE__,__LINE__,__METHOD__,$cmd,$file); + +$www = new page($ldapserver->server_id); +$www->block_add('body',$body); + +if ($meth == 'get_body') + $www->body(true); +else + $www->display(); +?> diff --git a/htdocs/collapse.php b/htdocs/collapse.php index d3e1fc8..c8125a9 100644 --- a/htdocs/collapse.php +++ b/htdocs/collapse.php @@ -1,33 +1,26 @@ server_id,'tree'); -$tree['browser'][$dn]['open'] = false; +$entry = $tree->getEntry($dn); +$entry->close(); set_cached_item($ldapserver->server_id,'tree','null',$tree); -/* If cookies were disabled, build the url parameter for the session id. - It will be append to the url to be redirect */ -$id_session_param = ''; -if (SID != '') - $id_session_param = sprintf('&%s=%s',session_name(),session_id()); - -header(sprintf('Location:tree.php?foo=%s#%s_%s%s',random_junk(),$ldapserver->server_id,rawurlencode($dn),$id_session_param)); +header(sprintf('Location:index.php?server_id=%s&junk=%s#%s%s', + $ldapserver->server_id,random_junk(),htmlid($ldapserver->server_id,$dn),pla_session_param())); +die(); ?> diff --git a/htdocs/common.php b/htdocs/common.php index 38ac4ee..ce6a032 100644 --- a/htdocs/common.php +++ b/htdocs/common.php @@ -1,5 +1,5 @@ diff --git a/htdocs/compare.php b/htdocs/compare.php index f4b9944..c05a049 100644 --- a/htdocs/compare.php +++ b/htdocs/compare.php @@ -1,5 +1,5 @@ Instance($server_id_src); +$ldapserver_src = $_SESSION['plaConfig']->ldapservers->Instance($server_id_src); if (! $ldapserver_src->haveAuthInfo()) pla_error(_('Not enough information to login to server. Please check your configuration.')); -$ldapserver_dst = $ldapservers->Instance($server_id_dst); +$ldapserver_dst = $_SESSION['plaConfig']->ldapservers->Instance($server_id_dst); if (! $ldapserver_src->haveAuthInfo()) pla_error(_('Not enough information to login to server. Please check your configuration.')); @@ -33,22 +33,18 @@ if (! $ldapserver_src->dnExists($dn_src)) if (! $ldapserver_dst->dnExists($dn_dst)) pla_error(sprintf(_('No such entry: %s'),pretty_print_dn($dn_dst))); -$friendly_attrs = process_friendly_attr_table(); +$_SESSION['plaConfig']->friendly_attrs = process_friendly_attr_table(); -$attrs_src = $ldapserver_src->getDNAttrs($dn_src,false,$config->GetValue('deref','view')); -$attrs_dst = $ldapserver_dst->getDNAttrs($dn_dst,false,$config->GetValue('deref','view')); +$attrs_src = $ldapserver_src->getDNAttrs($dn_src,false,$_SESSION['plaConfig']->GetValue('deref','view')); +$attrs_dst = $ldapserver_dst->getDNAttrs($dn_dst,false,$_SESSION['plaConfig']->GetValue('deref','view')); # Get a list of all attributes. $attrs_all = array_keys($attrs_src); foreach ($attrs_dst as $key => $val) if (! in_array($key,$attrs_all)) $attrs_all[] = $key; - -include './header.php'; ?> - - ',_('This entry has no attributes')); print '

@@ -67,7 +63,8 @@ include './header.php';
-
+ + @@ -81,8 +78,7 @@ include './header.php'; if (! $attrs_all || ! is_array($attrs_all)) { printf('
(%s)
'; - print ''; - die(); + return; } sort($attrs_all); @@ -108,7 +104,7 @@ foreach ($attrs_all as $attr) { isReadOnly()) { ?> - + @@ -122,8 +118,8 @@ foreach ($attrs_all as $attr) { $required_note = ''; # is there a user-friendly translation available for this attribute? - if (isset($friendly_attrs[strtolower($attr)])) { - $attr_display = $friendly_attrs[strtolower($attr)]; + if (isset($_SESSION['plaConfig']->friendly_attrs[strtolower($attr)])) { + $attr_display = $_SESSION['plaConfig']->friendly_attrs[strtolower($attr)]; $attr_note = sprintf('alias',sprintf(_('Note: \'%s\' is an alias for \'%s\''),$attr_display,$attr)); } else { @@ -162,8 +158,8 @@ foreach ($attrs_all as $attr) { if ($side == 'src') { ?>
- - + + @@ -204,7 +200,7 @@ foreach ($attrs_all as $attr) { $toJump = 0; switch ($side) { case 'src': - print ' '; + print ' '; if (! isset($attrs_src[$attr])) { echo "<". _('No Value').">
+ - + - - - diff --git a/htdocs/compare_form.php b/htdocs/compare_form.php index c95fee6..7eaafb9 100644 --- a/htdocs/compare_form.php +++ b/htdocs/compare_form.php @@ -1,5 +1,5 @@ haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); +require_once './common.php'; $dn = (isset($_GET['dn']) ? $_GET['dn'] : ''); $rdn = get_rdn($dn); $select_server_html = server_select_list($ldapserver->server_id,true,'server_id_dst'); -include './header.php'; - -echo ''; - printf('

%s %s

',_('Compare another DN with'),htmlspecialchars($rdn)); printf('

%s: %s',_('Server'),$ldapserver->name); if ($dn) @@ -35,7 +28,8 @@ echo "\n"; echo '
'; printf('%s %s %s
',_('Compare'),htmlspecialchars($rdn),_('with ')); -echo '
'; +echo ''; +printf('',$ldapserver->server_id); printf('',$ldapserver->server_id); echo "\n"; @@ -73,6 +67,4 @@ echo "\n"; echo ''; echo '
'; echo '
'; -echo ''; -echo ''; ?> diff --git a/htdocs/copy.php b/htdocs/copy.php index 4b707f4..f69b6fa 100644 --- a/htdocs/copy.php +++ b/htdocs/copy.php @@ -1,13 +1,13 @@ isCommandAvailable('entry_move')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('copy entry'))); -$ldapserver_src = $ldapservers->Instance($server_id_src); -$ldapserver_dst = $ldapservers->Instance($server_id_dst); +$entry['src']['id'] = get_request('server_id'); +$entry['dst']['id'] = get_request('dest_server_id'); -if ($ldapserver_dst->isReadOnly()) +$entry['src']['ldapserver'] = $_SESSION['plaConfig']->ldapservers->Instance($entry['src']['id']); +$entry['dst']['ldapserver'] = $_SESSION['plaConfig']->ldapservers->Instance($entry['dst']['id']); + +if ($entry['dst']['ldapserver']->isReadOnly()) pla_error(_('Destination server is currently READ-ONLY.')); -if (! $ldapserver_src->haveAuthInfo() || ! $ldapserver_dst->haveAuthInfo()) +if (! $entry['src']['ldapserver']->haveAuthInfo() || ! $entry['dst']['ldapserver']->haveAuthInfo()) pla_error(_('Not enough information to login to server. Please check your configuration.')); -$dn_src = $_POST['old_dn']; -$dn_dst = $_POST['new_dn']; -$do_recursive = (isset($_POST['recursive']) && $_POST['recursive'] == 'on') ? true : false; -$do_remove = (isset($_POST['remove']) && $_POST['remove'] == 'yes') ? true : false; - -include './header.php'; +$entry['src']['dn'] = get_request('old_dn'); +$entry['dst']['dn'] = get_request('new_dn'); +$entry['src']['recursive'] = (get_request('recursive') == 'on') ? true : false; +$entry['src']['remove'] = (get_request('remove') == 'yes') ? true : false; # Error checking -if (0 == strlen(trim($dn_dst))) +if (strlen(trim($entry['dst']['dn'])) == 0) pla_error(_('You left the destination DN blank.')); -if (pla_compare_dns($dn_src,$dn_dst) == 0 && $server_id_src == $server_id_dst) +if (pla_compare_dns($entry['src']['dn'],$entry['dst']['dn']) == 0 && $entry['src']['id'] == $entry['dst']['id']) pla_error(_('The source and destination DN are the same.')); -if ($ldapserver_dst->dnExists($dn_dst)) - pla_error(sprintf(_('The destination entry (%s) already exists.'),pretty_print_dn($dn_dst))); +if ($entry['dst']['ldapserver']->dnExists($entry['dst']['dn'])) + pla_error(sprintf(_('The destination entry (%s) already exists.'),pretty_print_dn($entry['dst']['dn']))); -if (! $ldapserver_dst->dnExists(get_container($dn_dst))) - pla_error(sprintf(_('The destination container (%s) does not exist.'),pretty_print_dn(get_container($dn_dst)))); +if (! $entry['dst']['ldapserver']->dnExists(get_container($entry['dst']['dn']))) + pla_error(sprintf(_('The destination container (%s) does not exist.'),pretty_print_dn(get_container($entry['dst']['dn'])))); -if ($do_recursive) { +if ($entry['src']['recursive']) { $filter = isset($_POST['filter']) ? $_POST['filter'] : '(objectClass=*)'; # Build a tree similar to that of the tree browser to give to r_copy_dn $snapshot_tree = array(); - print ''; - printf('

%s%s

',_('Copying '),htmlspecialchars($dn_src)); + printf('

%s%s

',_('Copying '),htmlspecialchars($entry['src']['dn'])); printf('

%s

',_('Recursive copy progress')); print '

'; print ''; print _('Building snapshot of tree to copy... '); - flush(); - - $snapshot_tree = build_tree($ldapserver_src,$dn_src,array(),$filter); + $snapshot_tree = build_tree($entry['src']['ldapserver'],$entry['src']['dn'],array(),$filter); printf('%s
',_('Success')); - flush(); # Prevent script from bailing early on a long delete @set_time_limit(0); - $copy_result = r_copy_dn($ldapserver_src,$ldapserver_dst,$snapshot_tree,$dn_src,$dn_dst); + $copy_result = r_copy_dn($entry['src']['ldapserver'],$entry['dst']['ldapserver'],$snapshot_tree,$entry['src']['dn'],$entry['dst']['dn']); + # @todo: This is not showing the complete results - only the children of the dst - need to look at. + $copy_message = $copy_result; print '
'; } else { - $copy_result = copy_dn($ldapserver_src,$ldapserver_dst,$dn_src,$dn_dst); + $copy_result = copy_dn($entry['src']['ldapserver'],$entry['dst']['ldapserver'],$entry['src']['dn'],$entry['dst']['dn']); + $copy_message = sprintf('%s DN%s %s %s',_('Copy successful!'),_(':'),htmlspecialchars($entry['dst']['dn']),_('has been created.')); } if ($copy_result) { - $edit_url = sprintf('template_engine.php?server_id=%s&dn=%s',$server_id_dst,rawurlencode($dn_dst)); - $new_rdn = get_rdn($dn_dst); - $container = get_container($dn_dst); + $redirect_url = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s',$entry['dst']['id'],rawurlencode($entry['dst']['dn'])); + $new_rdn = get_rdn($entry['dst']['dn']); + $container = get_container($entry['dst']['dn']); - printf('
%s%s
',_('Copy successful! Would you like to '),$edit_url,_('view the new entry')); - echo ''; - echo ''; - echo ''; + if ($entry['src']['remove']) + $redirect_url = sprintf('cmd.php?cmd=delete_form&server_id=%s&dn=%s',$entry['src']['id'],rawurlencode($entry['src']['dn'])); - if ($do_remove) { - sleep(2); - $delete_url = sprintf('delete_form.php?server_id=%s&dn=%s',$server_id_src,rawurlencode($dn_src)); - echo ''; - printf('',$delete_url); - } + system_message(array( + 'title'=>_('Copy Entry'), + 'body'=>$copy_message, + 'type'=>'info'), + $redirect_url); } function r_copy_dn($ldapserver_src,$ldapserver_dst,$snapshottree,$root_dn,$dn_dst) { - if (DEBUG_ENABLED) - debug_log('r_copy_dn: Entered with (%s,%s,%s,%s,%s)',1, + if (DEBUG_ENABLED) + debug_log('Entered with (%s,%s,%s,%s,%s)',1,__FILE__,__LINE__,__METHOD__, $ldapserver_src->server_id,$ldapserver_dst->server_id,$snapshottree,$root_dn,$dn_dst); - printf('%s %s...',_('Copying'),htmlspecialchars($root_dn)); - flush(); + $copy_message = array(); $copy_result = copy_dn($ldapserver_src,$ldapserver_dst,$root_dn,$dn_dst); if (! $copy_result) return false; - printf('%s
',_('Success')); - flush(); + $copy_message[] = sprintf('%s DN: %s %s',_('Copy successful!'),htmlspecialchars($dn_dst),_('has been created.')); $children = isset($snapshottree[$root_dn]) ? $snapshottree[$root_dn] : null; if (is_array($children) && count($children) > 0) { foreach($children as $child_dn) { $child_rdn = get_rdn($child_dn); $new_dest_dn = sprintf('%s,%s',$child_rdn,$dn_dst); - r_copy_dn($ldapserver_src,$ldapserver_dst,$snapshottree,$child_dn,$new_dest_dn); + $copy_result = r_copy_dn($ldapserver_src,$ldapserver_dst,$snapshottree,$child_dn,$new_dest_dn); + $copy_message[] = array_shift($copy_result); } - - } else { - return true; } - return true; + return $copy_message; } function copy_dn($ldapserver_src,$ldapserver_dst,$dn_src,$dn_dst) { - if (DEBUG_ENABLED) - debug_log('copy_dn: Entered with (%s,%s,%s,%s)',17, + if (DEBUG_ENABLED) + debug_log('Entered with (%s,%s,%s,%s)',17,__FILE__,__LINE__,__METHOD__, $ldapserver_src->server_id,$ldapserver_dst->server_id,$dn_src,$dn_dst); $new_entry = $ldapserver_src->getDNAttrs($dn_src); @@ -147,11 +140,11 @@ function copy_dn($ldapserver_src,$ldapserver_dst,$dn_src,$dn_dst) { $add_result = $ldapserver_dst->add($dn_dst,$new_entry); if (! $add_result) { - run_hook('post_entry_create', - array('server_id'=>$ldapserver_dst->server_id,'dn'=>$dn_dst,'attrs'=>$new_entry)); - echo '

'; pla_error(_('Failed to copy DN: ').$dn_dst,$ldapserver_dst->error(),$ldapserver_dst->errno()); + } else { + run_hook('post_entry_create', + array('server_id'=>$ldapserver_dst->server_id,'dn'=>$dn_dst,'attrs'=>$new_entry)); } return $add_result; @@ -169,7 +162,7 @@ function copy_dn($ldapserver_src,$ldapserver_dst,$dn_src,$dn_dst) { */ function build_tree($ldapserver,$dn,$buildtree) { if (DEBUG_ENABLED) - debug_log('build_tree: Entered with (%s,%s,%s)',1, + debug_log('Entered with (%s,%s,%s)',1,__FILE__,__LINE__,__METHOD__, $ldapserver->server_id,$dn,$buildtree); # we search all children, not only the visible children in the tree @@ -182,7 +175,7 @@ function build_tree($ldapserver,$dn,$buildtree) { } if (DEBUG_ENABLED) - debug_log('build_tree: Returning (%s)',1,$buildtree); + debug_log('Returning (%s)',1,__FILE__,__LINE__,__METHOD__,$buildtree); return $buildtree; } diff --git a/htdocs/copy_form.php b/htdocs/copy_form.php index c94b035..27569d3 100644 --- a/htdocs/copy_form.php +++ b/htdocs/copy_form.php @@ -1,11 +1,9 @@ isReadOnly()) pla_error(_('You cannot perform updates while server is in read-only mode')); -if (! $ldapserver->haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); -$dn = $_GET['dn'] ; -$rdn = get_rdn($dn); -$attrs = $ldapserver->getDNAttrs($dn); -$select_server_html = server_select_list($ldapserver->server_id,true,'dest_server_id'); -$children = $ldapserver->getContainerContents($dn); +$entry['dn'] = get_request('dn','GET'); +$entry['rdn'] = get_rdn($entry['dn']); -include './header.php'; +# We search all children, not only the visible children in the tree +$entry['children'] = $ldapserver->getContainerContents($entry['dn']); # Draw some javaScrpt to enable/disable the filter field if this may be a recursive copy -if (is_array($children) && count($children) > 0) { ?> +if (is_array($entry['children']) && count($entry['children']) > 0) { ?> -'; - -printf('

%s %s

',_('Copy'),htmlspecialchars($rdn)); +printf('

%s %s

',_('Copy'),htmlspecialchars($entry['rdn'])); printf('

%s: %s     %s: %s

',_('Server'),$ldapserver->name, - _('Distinguished Name'),htmlspecialchars($dn)); + _('Distinguished Name'),htmlspecialchars($entry['dn'])); echo "\n"; echo '
'; -printf('%s %s %s:

',_('Copy'),htmlspecialchars($rdn),_('to a new object')); +printf('%s %s %s:

',_('Copy'),htmlspecialchars($entry['rdn']),_('to a new object')); -echo '
'; -printf('',htmlspecialchars($dn)); +echo ''; +echo ''; +printf('',htmlspecialchars($entry['dn'])); printf('',$ldapserver->server_id); echo "\n"; @@ -72,15 +62,15 @@ echo "\n"; echo ''; printf('%s:', _('The full DN of the new entry to be created when copying the source entry'),_('Destination DN')); -printf('',htmlspecialchars($dn)); -draw_chooser_link('copy_form.new_dn','true',htmlspecialchars($rdn)); +printf('',htmlspecialchars($entry['dn'])); +draw_chooser_link('copy_form.new_dn','true',htmlspecialchars($entry['rdn'])); echo ''; echo "\n"; -printf('%s%s',_('Destination Server'),$select_server_html); +printf('%s%s',_('Destination Server'),server_select_list($ldapserver->server_id,true,'dest_server_id')); echo "\n"; -if (is_array($children) && count($children) > 0) { +if (is_array($entry['children']) && count($entry['children']) > 0) { echo ''; printf(':',_('Recursive copy')); echo ''; @@ -94,7 +84,7 @@ if (is_array($children) && count($children) > 0) { echo ''; printf('%s',_('Delete after copy (move):')); - echo ''; + echo ''; printf('(%s)',_('Make sure your filter (above) will select all child records.')); echo ''; @@ -108,15 +98,8 @@ echo "\n"; echo ''; echo "\n"; -echo ''; - -if ($config->GetValue('appearance','show_hints')) +if ($_SESSION['plaConfig']->GetValue('appearance','show_hints')) printf('Light%s',_('Hint: Copying between different servers only works if there are no schema violations')); -echo '
'; +echo '
'; ?> diff --git a/htdocs/create.php b/htdocs/create.php index 1b6a625..070b2ac 100644 --- a/htdocs/create.php +++ b/htdocs/create.php @@ -1,15 +1,11 @@ isReadOnly()) - pla_error(_('You cannot perform updates while server is in read-only mode')); -if (! $ldapserver->haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); + pla_error(_('You cannot perform updates while server is in read-only mode'), null, -1, true); + +if (! $_SESSION['plaConfig']->isCommandAvailable('entry_create')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('create entry'))); + +$rdn_attr = isset($_POST['rdn_attribute']) ? $_POST['rdn_attribute'] : null; + +$entryfactoryclass = $_SESSION['plaConfig']->GetValue('appearance','entry_factory'); +eval('$entry_factory = new '.$entryfactoryclass.'();'); +$entry = $entry_factory->newCreatingEntry(''); + +eval('$reader = new '.$_SESSION['plaConfig']->GetValue('appearance', 'entry_reader').'($ldapserver);'); +$entry->accept($reader); + +$container = $entry->getContainer(); + +if (!$container || !$ldapserver->dnExists($container)) + pla_error(sprintf(_('The container you specified (%s) does not exist. Please try again.'),htmlspecialchars($container)),null,-1,true); + +$tree = get_cached_item($ldapserver->server_id,'tree'); +if ($tree) { + $container_entry = $tree->getEntry($container); + if (!$container_entry) + $tree->addEntry($container); + + $container_entry = $tree->getEntry($container); + if ($container_entry->isLeaf()) + pla_error(sprintf(_('The container (%s) is a leaf.'), htmlspecialchars($container)), null, -1, true); +} + +$entry->setRdnAttributeName($rdn_attr); +if (!$entry->getRdnAttribute()) + pla_error(sprintf(_('The Rdn attribute (%s) does not exist.'), htmlspecialchars($rdn_attr)), null, -1, true); + +$new_dn = $entry->getDn(); +if (! $new_dn) + pla_error(_('You left the RDN field blank.')); -$new_dn = isset($_POST['new_dn']) ? $_POST['new_dn'] : null; -$required_attrs = isset($_POST['required_attrs']) ? $_POST['required_attrs'] : false; -$object_classes = unserialize(rawurldecode($_POST['object_classes'])); $redirect = isset($_POST['redirect']) ? $_POST['redirect'] : false; -# See if there are any presubmit values to work out. -if (isset($_POST['presubmit']) && count($_POST['presubmit']) && isset($_POST['template'])) { - $templates = new Templates($ldapserver->server_id); - $template = $templates->getCreationTemplate($_POST['template']); - - foreach ($_POST['presubmit'] as $attr) { - $_POST['attrs'][] = $attr; - $_POST['form'][$attr] = $templates->EvaluateDefault($ldapserver,$template['attribute'][$attr]['presubmit'],$_POST['container']); - $_POST['vals'][] = $_POST['form'][$attr]; - } - - # @todo: This section needs to be cleaned up, and will be when the old templates are removed. In the mean time... - # Rebuild the $_POST['attrs'] & $_POST['vals'], as they can be inconsistent. - unset($_POST['attrs']); - unset($_POST['vals']); - foreach ($_POST['form'] as $attr => $val) { - $_POST['attrs'][] = $attr; - $_POST['vals'][] = $val; - } -} - -$vals = isset($_POST['vals']) ? $_POST['vals'] : array(); -$attrs = isset($_POST['attrs']) ? $_POST['attrs'] : array(); - -# build the new entry $new_entry = array(); -if (isset($required_attrs) && is_array($required_attrs)) { - foreach ($required_attrs as $attr => $val) { - if ($val == '') - pla_error(sprintf(_('You left the value blank for required attribute (%s).'),htmlspecialchars($attr))); - - $new_entry[$attr][] = $val; +$attrs = $entry->getAttributes(); +foreach ($attrs as $attr) { + $vals = $attr->getValues(); + $new_vals = array(); + foreach ($vals as $val) { + if (strlen($val) > 0) + $new_vals[] = $val; } + + if ($attr->isRequired() && !$new_vals) + pla_error(sprintf(_('You left the value blank for required attribute (%s).'), htmlspecialchars($attr->getName()))); + + if ($new_vals) + $new_entry[$attr->getName()] = $new_vals; } -if (isset($attrs) && is_array($attrs)) { - foreach ($attrs as $i => $attr) { - - if ($ldapserver->isAttrBinary($attr)) { - if (isset($_FILES['vals']['name'][$i]) && $_FILES['vals']['name'][$i] != '' ) { - - # read in the data from the file - $file = $_FILES['vals']['tmp_name'][$i]; - $f = fopen($file,'r'); - $binary_data = fread($f,filesize($file)); - fclose($f); - - $val = $binary_data; - $new_entry[$attr][] = $val; - - } elseif (isset($_SESSION['submitform'][$attr])) { - $new_entry[$attr][] = $_SESSION['submitform'][$attr]; - unset($_SESSION['submitform'][$attr]); - } - - } else { - if (is_array($vals[$i])) { - - # If the array has blank entries, then ignore them. - foreach ($vals[$i] as $value) { - if (trim($value)) - $new_entry[$attr][] = $value; - } - - } else { - $val = isset($vals[$i]) ? $vals[$i] : ''; - - if ('' !== trim($val)) - $new_entry[$attr][] = $val; - } - } - } -} - -$new_entry['objectClass'] = $object_classes; -if (! in_array('top',$new_entry['objectClass'])) +if (! in_array('top', $new_entry['objectClass'])) $new_entry['objectClass'][] = 'top'; foreach ($new_entry as $attr => $vals) { # Check to see if this is a unique Attribute if ($badattr = $ldapserver->checkUniqueAttr($new_dn,$attr,$vals)) { - $search_href = sprintf('search.php?search=true&form=advanced&server_id=%s&filter=%s=%s', - $ldapserver->server_id,$attr,$badattr); + $search_href = sprintf('?cmd=search&search=true&form=advanced&server_id=%s&filter=%s=%s', $ldapserver->server_id,$attr,$badattr); pla_error(sprintf(_('Your attempt to add %s (%s) to
%s
is NOT allowed. That attribute/value belongs to another entry.

You might like to search for that entry.'),$attr,$badattr,$new_dn,$search_href)); } - - if (! $ldapserver->isAttrBinary($attr)) - if (is_array($vals)) - foreach ($vals as $i => $v) - $new_entry[$attr][$i] = $v; - else - $new_entry[$attr] = $vals; } # Check the user-defined custom call back first @@ -133,26 +94,39 @@ if (run_hook('pre_entry_create',array('server_id'=>$ldapserver->server_id,'dn'=> if ($add_result) { run_hook('post_entry_create',array('server_id'=>$ldapserver->server_id,'dn'=>$new_dn,'attrs'=>$new_entry)); - if ($redirect) + $action_number = $_SESSION['plaConfig']->GetValue('appearance', 'action_after_creation'); + + $container = get_container($new_dn,false); + //$container_container = get_container($container); + + if ($redirect) { $redirect_url = $redirect; - else - $redirect_url = sprintf('template_engine.php?server_id=%s&dn=%s',$ldapserver->server_id,rawurlencode($new_dn)); - - echo ''; - $tree = get_cached_item($ldapserver->server_id,'tree'); - $container = get_container($new_dn); - - if ((isset($tree['browser'][$container]['open']) && $tree['browser'][$container]['open']) || - in_array($new_dn,$ldapserver->getBaseDN())) { - - echo ''; - printf('',$redirect_url); + } else if ($action_number == 2) { + $redirect_url = sprintf('cmd.php?cmd=template_engine&server_id=%s&container=%s', $ldapserver->server_id, rawurlencode($container)); + } else { + $redirect_url = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s', $ldapserver->server_id, rawurlencode($new_dn)); } - printf('',$redirect_url); - echo ''; - printf('%s %s.',_('Redirecting...'),$redirect_url,_('here')); - echo ''; + if ($action_number == 1 || $action_number == 2) + printf('',$redirect_url); + + if ($action_number == 1 || $action_number == 2) { + $create_message = sprintf('%s DN%s %s %s',_('Creation successful!'),_(':'),htmlspecialchars($new_dn),_('has been created.')); + + system_message(array( + 'title'=>_('Create Entry'), + 'body'=>$create_message, + 'type'=>'info'), + $redirect_url); + } else { + printf('

%s

',_('Entry created')); + echo '
'; + echo '
'; + printf('%s.',$ldapserver->server_id,rawurlencode($new_dn),_('Display the new created entry')); + echo '
'; + printf('%s.',$ldapserver->server_id,rawurlencode($container),_('Create another entry')); + echo '
'; + } } else { pla_error(_('Could not add the object to the LDAP server.'),$ldapserver->error(),$ldapserver->errno()); diff --git a/htdocs/create_form.php b/htdocs/create_form.php deleted file mode 100644 index 80638ee..0000000 --- a/htdocs/create_form.php +++ /dev/null @@ -1,134 +0,0 @@ -isReadOnly()) - pla_error(_('You cannot perform updates while server is in read-only mode')); -if (! $ldapserver->haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); - -$container = $_REQUEST['container']; -$server_menu_html = server_select_list($ldapserver->server_id,true); - -include './header.php'; - -echo ''; - -printf('

%s

',_('Create Object')); -printf('

%s

',_('Choose a template')); -printf('

%s

',_('Select a template for the creation process')); - -echo '
'; -printf('',htmlspecialchars($container)); - -echo ''; -printf('',_('Server'),$server_menu_html); - -echo ''; -printf('',_('Template')); -echo ''; - -printf('', - htmlspecialchars(_('Proceed >>'))); - -echo '
%s:%s
%s:'; - -echo ''; -echo '
'; - -echo ''; - -$i = -1; - -$template_xml = new Templates($ldapserver->server_id); -$templates = $template_xml->getCreationTemplates(); - -# Remove non-visable templates. -foreach ($templates as $index => $template) - if (isset($template['visible']) && (! $template['visible'])) - unset ($templates[$index]); - -$templates['custom']['title'] = 'Custom'; -$templates['custom']['icon'] = 'images/object.png'; - -$count = count($templates); -foreach ($templates as $name => $template) { - $i++; - - # If the template doesnt have a title, we'll use the desc field. - $template['desc'] = isset($template['title']) ? $template['title'] : $template['desc']; - - # Balance the columns properly - if ((count($templates) % 2 == 0 && $i == intval($count / 2)) || - (count($templates) % 2 == 1 && $i == intval($count / 2) + 1)) - - echo '
'; - - # Check and see if this template should be shown in the list - $isValid = false; - - if (isset($template['regexp'])) { - if (@preg_match('/'.$template['regexp'].'/i',$container)) - $isValid = true; - } else - $isValid = true; - - if (isset($template['invalid']) && $template['invalid']) - $isValid = false; - - echo ''; - if (! $isValid || (isset($template['handler']) && ! file_exists(TMPLDIR.'creation/'.$template['handler']))) - echo ''; - else - printf('', - htmlspecialchars($name),htmlspecialchars($name), - ! $isValid ? 'disabled' : (strcasecmp('Custom',$name) ? '' : 'checked')); - - printf('', - htmlspecialchars($name),$template['icon']); - - printf(''; - -} - -echo '
'; -echo '
'; -echo '
'; -echo '
'; -?> diff --git a/htdocs/css/style.css b/htdocs/css/style.css index c389a0c..1ccfdf1 100644 --- a/htdocs/css/style.css +++ b/htdocs/css/style.css @@ -1,113 +1,799 @@ -/* $Header: /cvsroot/phpldapadmin/phpldapadmin/htdocs/css/style.css,v 1.47 2006/10/29 11:44:36 wurley Exp $ */ +/* $Header: /cvsroot/phpldapadmin/phpldapadmin/htdocs/css/style.css,v 1.48 2007/12/15 07:50:30 wurley Exp $ */ + +/* Global Page */ +table.page { + font-weight: normal; + color: black; + + font-family: arial, helvetica, sans-serif; + background-color: white; + font-size: 12pt; + empty-cells: hide; +} + +/* Global Page - Defaults */ +/* A HREF Links */ +table.page a { + border: 0px; + color: #000066; + text-decoration: none; +} + +table.page a:hover { + text-decoration: underline; + color: blue; +} + +table.page a img { + border: 0px; +} + +/* Global Page - Logo & Title */ +table.page tr.head { + text-align: center; + color: white; + background-color: #001188; + font-weight: bold; + font-size: 12px; + height: 25px; +} + +table.page tr.head img.logo { + vertical-align: middle; + text-align: center; + + width: 100px; + height: 60px; +} + +/* Global Page - Control Line */ +table.page tr.control td { + border-top: 1px solid #aaaacc; + border-bottom: 1px solid #aaaacc; +} + +/* Global Page - Control Line Menu Items */ +table.page table.control { + table-layout: fixed; + width: 100%; +} + +table.page table.control tr { + width: 100%; +} + +table.page table.control tr td { + border-top: 0px; + border-bottom: 0px; + width: 30px; + padding: 0px; + padding-top: 5px; + text-align: center; + vertical-align: top; + font-size: 11px; +} + +table.page table.control tr td img { + width: 24px; + height: 24px; +} + +table.page table.control a:hover { + text-decoration: none; +} + +table.page table.control tr td.logo { + text-align: right; + width: 20%; +} + +table.control td.logo img.logo { + vertical-align: middle; + text-align: right; + + width: 100px; + height: 60px; +} + +/* Global Page - LDAP Tree */ +table.page td.tree { + border-right: 1px solid #aaaacc; + vertical-align: top; + background-color: #fcfcfe; + width: 10%; +} + +/* @todo: check that this is still used */ +table.page table.tree { +} + +table.page table.tree td.head { + font-weight: bold; + color: #af0000; +} + +table.page table.tree td.body { + color: #bf0000; +} + +table.page table.tree td.foot { + font-size: small; + color: #cf0000; + border-top: 1px solid #aaaacc; + border-bottom: 1px solid #aaaacc; +} + +/* Global Page - Main Body */ +table.page td.body { + vertical-align: top; + width: 100%; + background-color: #fcfcfe; +} + +/* Global Page - Main Body System Message */ +table.page table.sysmsg { + border-bottom: 2px solid #aaaacc; + width: 100%; +} + +table.page table.sysmsg td.head { + font-size: small; + text-align: left; + font-weight: bold; +} + +table.page table.sysmsg td.body { + font-weight: normal; +} + +table.page table.sysmsg td.icon { + text-align: center; + vertical-align: top; +} + +/* Global Page - Main Body */ +table.page table.body { + font-weight: normal; + background-color: #fcfcfe; + width: 100%; +} + +table.page table.body h3.title { + text-align: center; + margin: 0px; + padding: 10px; + color: white; + background-color: #018; + border: 1px solid black; + font-weight: normal; + font-size: 150%; +} + +table.page table.body h3.subtitle { + text-align: center; + margin: 0px; + margin-bottom: 15px; + font-size: 75%; + color: white; + border-bottom: 1px solid black; + border-left: 1px solid black; + border-right: 1px solid black; + background: #018; + padding: 4px; + font-weight: normal; +} + +table.page table.body td.spacer { + border-top: 2px solid #aaaacc; + padding: 0px; + font-size: 5px; +} + +table.page table.body td.head { + font-weight: bold; +} + +table.page table.body td.foot { + font-size: small; + border-top: 1px solid #aaaacc; + border-bottom: 1px solid #aaaacc; +} + +/* Global Page Footer */ +table.page tr.foot td { + border-top: 1px solid #aaaacc; + font-weight: bold; + font-size: 10pt; + text-align: right; +} + +/* Global Page - Other Layouts */ +/* Server Select */ +table.page table.server_select { + font-weight: bold; + font-size: 13px; + color: black; +} + +/* Individual table layouts */ +/* LDAP Tree */ +table.tree { +} + +table.tree tr.server td.icon { + vertical-align: top; +} + +table.tree tr.server td.name { + padding-right: 10px; + vertical-align: top; +} + +table.tree tr.server td { + padding-top: 5px; + font-size: 18px; + text-align: left; + padding-right: 0px; + white-space: nowrap; +} + +table.tree td.expander { + text-align: center; + width: 22px; + max-width: 22px; + min-width: 22px; + white-space: nowrap; +} + +table.tree td.icon { + text-align: center; + width: 22px; + max-width: 22px; + min-width: 22px; + white-space: nowrap; +} + +table.tree td.server_links { + vertical-align: top; + text-align: center; + padding-left: 3px; + padding-right: 3px; +} + +table.tree td.server_links a { + font-size: 10px; +} + +table.tree td.links { + vertical-align: top; + font-size: 10px; +} + +table.tree td.links a { + color: #0000AA; + text-align: center; +} + +table.tree td.rdn span.count { + font-family: bitstream vera sans,luxi sans,verdana,geneva,arial,helvetica,sans-serif; + font-size: 13px; + color: #000000; +} + +table.tree td.create a { + font-family: bitstream vera sans,luxi sans,verdana,geneva,arial,helvetica,sans-serif; + font-size: 13px; + color: #000000; +} + +table.tree td.create a:hover { + font-family: bitstream vera sans,luxi sans,verdana,geneva,arial,helvetica,sans-serif; + font-size: 13px; + color: #841212; + background-color: #fff0c0; + text-decoration: none; +} + +table.tree td.rdn a { + font-family: bitstream vera sans,luxi sans,verdana,geneva,arial,helvetica,sans-serif; + font-size: 13px; + color: #000000; +} + +table.tree td.rdn a:hover { + font-family: bitstream vera sans,luxi sans,verdana,geneva,arial,helvetica,sans-serif; + font-size: 13px; + color: #841212; + background-color: #fff0c0; + text-decoration: none; +} + +table.tree td.links a:hover { + text-decoration: none; + color: blue; +} + +table.tree td.links a img { + width: 22px; + height: 22px; +} + +table.tree td.blank { + font-size: 1px; +} + +table.tree td.spacer { + width: 22px; +} + +table.tree a.logged_in_dn { + font-size: 11px; +} + +/* Tree Global Defaults */ +table.tree tr td { + padding: 0px; +} + +table.tree a { + text-decoration: none; + color: black; + font-size: 16px; +} + +table.tree a:hover { + text-decoration: underline; + color: blue; +} + +/* Delete */ +table.delete { + background-color: #eeeeff; + padding: 10px; + border: 1px solid #aaaacc; +} + +/* Create */ +table.create { + background-color: #eeeeff; + padding: 10px; + border: 1px solid #aaaacc; +} + +table.create td.heading { + font-size: 12px; + vertical-align: top; +} + +/* Confirm */ +table.confirm { +} + +table.confirm tr.heading { + color: white; + background-color: #018; + font-size: 18px; +} + +table.confirm tr.heading td { + border: 1px solid #aaaacc; + font-weight: bold; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 10px; + padding-right: 10px; +} + +table.confirm tr.even { + background-color: #eee; +} + +table.confirm tr.even td { + border: 1px solid #aaaacc; + font-weight: normal; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 10px; + padding-right: 10px; +} + +table.confirm tr.odd { + background-color: #ccc; +} + +table.confirm tr.odd td { + border: 1px solid #aaaacc; + font-weight: normal; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 10px; + padding-right: 10px; +} + +/* Create - Templates */ +table.template_display { + font-size: 13px; + text-align: left; +} + +table.template_display tr { + vertical-align: top; +} + +table.templates { + vertical-align: top; + text-align: left; +} + +table.templates td.icon { + width: 16px; + text-align: center; +} + +table.templates td.selector { + width: 12px; + text-align: left; +} + +table.templates td.name { + text-align: left; + white-space: nowrap; +} + +/* Edit DN */ +/* @todo: whats this? */ +div.add_value { + font-size: 10pt; + margin: 0px; + padding: 0px; +} + +/* Edit DN - EntryWriter1 */ +table.edit_dn { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + width: 600px; +} + +table.edit_dn input { + margin: 1px; +} + +table.edit_dn input.val { + font-size: 14px; + width: 350px; + font-family: arial, helvetica, sans-serif; + background-color: white; +} + +table.edit_dn div.helper { + text-align: left; + white-space: nowrap; + font-family: arial, helvetica, sans-serif; + background-color: white; + font-size: 14px; + font-weight: normal; + color: #888; +} + +table.edit_dn input.roval { + font-size: 14px; + width: 350px; + font-family: arial, helvetica, sans-serif; + background-color: white; + border: none; +} + +table.edit_dn textarea.val { + font-size: 14px; + width: 350px; + font-family: arial, helvetica, sans-serif; + background-color: white; +} + +table.edit_dn textarea.roval { + font-size: 14px; + width: 350px; + font-family: arial, helvetica, sans-serif; + background-color: white; + border: none; +} + +table.edit_dn tr td { + padding: 4px; + padding-right: 0px; +} + +table.edit_dn tr td.attr { + background-color: #eee; + vertical-align: top; + font-weight: bold; +} + +table.edit_dn tr td.heading { + border-top: 3px solid #ccc; + font-weight: bold; +} + +table.edit_dn tr td.attr_note { + text-align: right; + background-color: #eee; +} + +table.edit_dn tr td.attr a { + text-decoration: none; + color: black; +} + +table.edit_dn tr td.attr a:hover { + text-decoration: underline; + color: #016; +} + +table.edit_dn tr td.val { + text-align: left; + vertical-align: middle; + padding-bottom: 10px; + padding-left: 50px; +} + +/** When an attr is updated, it is highlighted to indicate such */ +table.edit_dn tr.updated_attr td.attr { + border-top: 1px dashed green; + border-left: 1px dashed green; + background-color: #ded; +} + +table.edit_dn tr.updated_attr td.attr_note { + border-top: 1px dashed green; + border-right: 1px dashed green; + background-color: #ded; +} + +/** An extra row that sits at the bottom of recently modified attrs to encase them in dashes */ +table.edit_dn tr.updated_attr td.bottom { + border-top: 1px dashed green; +} + +/** Formatting for the value cell when it is the attribute that has been recently modified */ +table.edit_dn tr.updated_attr td.val { + border-left: 1px dashed green; + border-right: 1px dashed green; +} + +/* Need to prevent sub-tables (like the one in which jpegPhotos are displayed) + * from drawing borders as well. */ +table.edit_dn tr.updated_attr td table td { + border: 0px; +} + +table.edit_dn tr.updated_attr a { +} + +table.edit_dn tr.mod_dn { + background: #def; +} + +table.edit_dn tr.row1 { + background: #eee; +} + +table.edit_dn tr.row2 { + background: #ccc; +} + +table.edit_dn_menu { + font-size: 14px; +} + +table.edit_dn_menu td.icon { + width: 16px; + text-align: center; +} + +/* Edit DN - EntryWriter2 */ span.hint { font-size: small; font-weight: normal; color: #888; } -span.warning { - font-size: small; +table.edit_dn tr.spacer { + background-color: #ddd; +} + +table.edit_dn tr td.ew2_icon { + vertical-align: top; +} + +table.edit_dn tr td.ew2_attr { + vertical-align: top; + text-align: right; + font-size: 75%; + background-color: #fff; + font-weight: bold; +} + +table.edit_dn tr td.ew2_attr a { + text-decoration: none; + color: black; +} + +table.edit_dn tr td.ew2_attr a:hover { + text-decoration: underline; + color: #016; +} + +table.edit_dn tr td.ew2_val { + text-align: left; + vertical-align: top; + padding-bottom: 10px; + padding-left: 50px; +} + +table.edit_dn tr.updated_attr td.ew2_attr { + text-align: right; + font-size: 75%; + border-top: 1px dashed green; + border-left: 1px dashed green; + border-bottom: 1px dashed green; + background-color: #ded; +} + +table.edit_dn tr.updated_attr td.ew2_val { + border-top: 1px dashed green; + border-left: 1px dashed green; + border-right: 1px dashed green; + border-bottom: 1px dashed green; +} + +/* Compare */ +table.comp_dn { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + font-size: 80%; +} + +table.comp_dn tr { + width: 200px; +} +table.comp_dn tr td.attr { + background-color: #eee; + vertical-align: top; + font-weight: bold; +} + +table.comp_dn tr td.attr_note { + text-align: right; + background-color: #eee; + padding-right: 50px; +} + +/* Login Box */ +table.login { + background-color: #eeeeff; + padding: 10px; + border: 1px solid #aaaacc; +} + +#pla_login { + background: url('../images/uid.png') no-repeat 0 1px; + background-color: #fafaff; + padding-left: 17px; +} + +#pla_login:focus { + background-color: #ffffba; +} + +#pla_login:disabled { + background-color: #ddddff; +} + +#pla_pass { + background: url('../images/key.png') no-repeat 0 1px; + background-color: #fafaff; + padding-left: 17px; +} + +#pla_pass:focus { + background-color: #ffffba; +} + +#pla_pass:disabled { + background-color: #ddddff; +} + +/* Search Box */ +table.search { + background-color: #eeeeff; + padding: 10px; + border: 1px solid #aaaacc; +} + +table.search td.title { + text-align: center; + font-weight: bold; +} + +table.search td.subtitle { + text-align: center; font-weight: normal; - color: #f00; + font-size: small; } -span.x-small { - font-size: x-small; -} - -table.schema_oclasses { - border-left: 1px solid black; - border-right: 1px solid black; - border-bottom: 1px solid black; - border-top: 0; - margin-bottom: 10px; - background-color: #eee; -} - -table.schema_oclasses td { - vertical-align: top; - text-align: left; - padding-left: 5px; -} - -table.schema_attr th { - background-color: #016; - padding: 5px; - color: white; - font-weight: bold; - font-size: 125%; -} - -table.schema_attr td { - padding: 5px; - vertical-align: top; -} - -table.schema_attr tr.even { - background-color: #eee; -} - -table.schema_attr tr.odd { - background-color: #ccc; -} - -table.schema_attr tr.highlight{ - background-color: #bcd; - font-weight: Bold; -} - -table.modify_members { - border-left: 1px solid black; - border-right: 1px solid black; - border-bottom: 1px solid black; - border-top: 1px solid black; - margin-bottom: 10px; - background-color: #eee; - width: 80%; -} - -table.modify_members td { - vertical-align: top; - text-align: left; - padding-left: 5px; -} - -table.modify_members th { - background-color: #016; - padding: 5px; - color: white; - font-weight: bold; - font-size: 125%; -} - -table.modify_members td { - padding: 5px; - vertical-align: top; -} - -table.modify_members tr.even { - background-color: #eee; -} - -table.modify_members tr.odd { - background-color: #ccc; -} - -table.modify_members tr.highlight { - background-color: #bcd; - font-weight: Bold; -} - -table.modify_members select { +/* Search Results */ +table.search_result { width: 100%; + vertical-align: top; + empty-cells: show; + border: 1px solid #aaaacc; + border-spacing: 0px; + background-color: #ddf; } -/* Bug Notice */ -table.notice tr td { - font-size: 9pt; - padding: 2px; - margin: 0px; - background-color: #eeeeee; +table.search_result tr.header { + vertical-align: top; +} + +table.search_result tr.list_dn { + background-color: white; +} + +table.search_result tr.list_dn td.icon { + text-align: center; + vertical-align: top; +} + +table.search_result tr.list_attr { + background-color: white; +} + +table.search_result tr.list_attr td.blank { + width: 25px; +} + +table.search_result tr.list_attr td.attr { + color: gray; + width: 10%; + font-size: 12px; +} + +table.search_result tr.list_attr td.val { + color: black; + font-size: 12px; +} + +table.search_result_table { + border: 1px solid #aaaacc; + border-collapse: collapse; + empty-cells: show; +} + +table.search_result_table td { + vertical-align: top; + border: 1px solid #aaaacc; + padding: 4px; +} + +table.search_result_table th { + border: 1px solid #aaaacc; + padding: 10px; + padding-left: 20px; + padding-right: 20px; +} + +table.search_result_table tr.highlight { + background-color: #eee; +} + +/* Export Box */ +table.export { + background-color: #eeeeff; + padding: 10px; + border: 1px solid #aaaacc; } /* Error Dialog Box */ @@ -141,341 +827,51 @@ table.error td { vertical-align: top; } -table.confirm th { +/* Schema Viewer */ +table.schema { + width: 100%; + empty-cells: show; +} + +table.schema tr.name { background-color: #016; padding: 5px; color: white; - font-weight: normal; + font-weight: bold; + font-size: 125%; + text-align: center; } -table.confirm tr td { - padding: 4px; +table.schema tr.name a { + color: white; } -table.confirm tr.spacer { - background-color: #ddd; +table.schema tr.even { + background-color: #eee; } -table.confirm tr.even { +table.schema tr.odd { background-color: #ccc; } -table.confirm tr.odd { - background-color: #eee; +table.schema td.type { + width: 20%; + padding: 5px; } -table.confirm tr td.heading { - text-align: right; - font-size: 75%; -} - -table.confirm td.icon { - text-align: center; -} - -table.browse tr td { - border: 0; - margin: 0; - padding: 0; -} - -table.template_display tr td { - vertical-align: top; -} - -table.templates tr td { - text-align: left; - vertical-align: middle; -} - -table.templates tr { - height: 25px; -} - -table.templates td.icon { - text-align: center; -} - -table.exporters tr td { - text-align: left; - vertical-align: middle; -} - -table.exporters tr { - height: 25px; -} - -a img { - border: 0px; -} - -body { - font-family: arial, helvetica, sans-serif; - background-color: white; - font-size: 12pt; -} - -table.tree tr.login td { -} - -table.tree td.links { - padding: 0px; - font-size: 10px; - padding-left: 12px; - font-size: 10px; -} - -table.tree td.links a { - font-size: 10px; -} - -table.tree { - border: 0px; -} - -table.tree img { - border: 0px; -} - -table.tree td { - padding: 2px; - border: 0px solid black; -} - -table.tree tr { -} - -table.tree tr.server td.icon { - width: 14px; -} - -table.tree tr.server td { - padding-top: 15px; - padding-bottom: 0px; - vertical-align: top; - font-size: 20px; - text-align: left; -} - -table.tree td.icon { - text-align: center; - padding: 0px; - width: 14px; - font-size: 1px; -} - -table.tree td.rdn { - width: 500px; -} - -table.tree td.rdn a { - text-decoration: none; - color: black; -} - -table.tree td.rdn a:hover { - text-decoration: underline; - color: blue; -} - -table.tree td.create { -} - -table.tree td.create a { - text-decoration: none; - color: black; -} - -table.tree td.create a:hover { - text-decoration: underline; - color: blue; -} - - -table.tree td.spacer { - width: 22px; -} - -table.tree td.expander { - text-align: center; - width: 22px; - max-width: 22px; - min-width: 22px; -} - -table.tree td span.count { - color: gray; - font-size: 85%; -} - -h3.title { - text-align: center; - margin: 0px; - padding: 10px; - color: white; - background-color: #018; - border: 1px solid black; - font-weight: normal; - font-size: 150%; -} - -h3.subtitle { - text-align: center; - margin: 0px; - margin-bottom: 15px; - font-size: 75%; - color: white; - border-bottom: 1px solid black; - border-left: 1px solid black; - border-right: 1px solid black; - background: #018; - padding: 4px; - font-weight: normal; -} - -table.comp_dn { - border-collapse: collapse; - border-spacing: 0px; - empty-cells: show; - font-size: 80%; -} - -table.comp_dn tr { - width: 200px; -} -table.comp_dn tr td.attr { - background-color: #eee; - vertical-align: top; -} - -table.comp_dn tr td.attr_note { - text-align: right; - background-color: #eee; - padding-right: 50px; -} - -table.edit_dn { - border-collapse: collapse; - border-spacing: 0px; - empty-cells: show; - width: 600px; -} - -table.edit_dn input { - margin: 1px; -} - -table.edit_dn input.val { - font-size: 14px; - width: 350px; - font-family: arial, helvetica, sans-serif; - background-color: white; -} - -table.edit_dn textarea.val { - font-size: 14px; - width: 350px; - font-family: arial, helvetica, sans-serif; - background-color: white; -} - -table.edit_dn tr td { - padding: 4px; - padding-right: 0px; -} - -table.edit_dn tr td.attr { - background-color: #eee; - vertical-align: top; -} - -table.edit_dn tr td.heading { - border-top: 3px solid #ccc; +table.schema tr.highlight{ + background-color: #bcd; font-weight: bold; + padding: 5px; } -table.edit_dn tr td.attr_note { - text-align: right; - background-color: #eee; +/* Schema Viewer - ObjectClasses*/ +table.schema_oclass { + width: 100%; + border-spacing: 0px; } -table.edit_dn tr td.attr a { - text-decoration: none; - color: black; -} - -table.edit_dn tr td.attr a:hover { - text-decoration: underline; - color: #016; -} - -table.edit_dn tr td.val { - text-align: left; - vertical-align: middle; - padding-bottom: 10px; - padding-left: 50px; -} - - -/** When an attr is updated, it is highlighted to indicate such */ -table.edit_dn tr.updated_attr td.attr { - border-top: 1px dashed green; - border-left: 1px dashed green; - background-color: #ded; -} - -table.edit_dn tr.updated_attr td.attr_note { - border-top: 1px dashed green; - border-right: 1px dashed green; - background-color: #ded; -} - -/** An extra row that sits at the bottom of recently modified attrs to encase them in dashes */ -table.edit_dn tr.updated_attr td.bottom { - border-top: 1px dashed green; -} - -/** Formatting for the value cell when it is the attribute that has been recently modified */ -table.edit_dn tr.updated_attr td.val { - border-left: 1px dashed green; - border-right: 1px dashed green; -} - -/* Neede to prevent sub-tables (like the one in which jpegPhotos are displayed) - * from drawing borders as well. */ -table.edit_dn tr.updated_attr td table td { - border: 0px; -} - -table.edit_dn tr.updated_attr a { -} - -table.edit_dn tr.mod_dn { - background: #def; -} - -table.edit_dn tr.row1 { - background: #eee; -} - -table.edit_dn tr.row2 { - background: #ccc; -} - -input.update_dn { - font-size: 65%; -} - -small { - font-size: 10pt; -} - -form.edit_dn { - margin: 0px; - padding: 0px; -} - -h4.oclass { +table.schema_oclass tr.name td { background: #016; padding: 5px; margin: 0px; @@ -483,10 +879,18 @@ h4.oclass { font-weight: normal; border: 1px solid black; font-size: 140%; +} + +table.schema_oclass tr.name a { color: white; } -h4.oclass_sub { +table.schema_oclass tr.name a:hover { + color: #acacae; + text-decoration: none; +} + +table.schema_oclass tr.detail td { background: #dde; border: 1px solid black; border-top: 0px; @@ -497,243 +901,146 @@ h4.oclass_sub { font-size: 80%; } -ul.schema { +table.schema_oclass tr.attrshead { + background-color: #eee; +} + +table.schema_oclass tr.attrshead td.left { + border-left: 1px solid black; + width: 0px; +} + +table.schema_oclass tr.attrshead td.right { + border-right: 1px solid black; + width: 0px; +} + +table.schema_oclass tr.attrshead td { + vertical-align: top; + text-align: left; + padding-left: 5px; + width: 50%; +} + +table.schema_oclass tr.attrs { + vertical-align: top; + background-color: #eee; +} + +table.schema_oclass tr.attrs td.left { + border-left: 1px solid black; + width: 0px; +} + +table.schema_oclass tr.attrs td.right { + border-right: 1px solid black; + width: 0px; +} + +table.schema_oclass tr.attrs td { + border-bottom: 1px solid black; + padding-left: 5px; +} + +table.schema_oclass tr.attrs ul.schema { margin: 5px; margin-left: 0px; padding-left: 20px; } -ul.schema li { +table.schema_oclass tr.attrs ul.schema li { margin-left: 0px; padding-left: 0px; } -ul.schema li small { +table.schema_oclass tr.attrs ul.schema li small { font-size: 75%; color: #777; } -ul.schema li small a { +table.schema_oclass tr.attrs ul.schema li small a { color: #77c; } -ul.current_values { - padding: 5px; - padding-left: 25px; - width: 200px; - margin-left: 50px; -} - -form.new_value { - margin-left: 70px; -} - -table.search_result_table { - border-spacing: 0; - border-collapse: collapse; - empty-cells: show; -} - -table.search_result_table td { - vertical-align: top; - border: 1px solid gray; - padding: 4px; -} - -table.search_result_table th { - border: 1px solid gray; - padding: 10px; - padding-left: 20px; - padding-right: 20px; -} - -table.search_result_table tr.highlight { - background-color: #eee; -} - - -ul.search { - font-weight: bold; -} - -table.search_header { - background-color: #ddf; - width: 100%; - vertical-align: top; -} - -div.search_result { - list-style-type: none; - padding: 6px; - padding-left: 20px; - margin-right: 40px; -} - -table.attrs { - font-weight: normal; - font-size: 75%; - margin: 0px; - margin-left: 35px; -} - -table.attrs td { - padding-right: 10px; -} - -table.attrs td.attr { - color: #aaa; - padding-left: 15px; -} - -form.search { - width: 500px; - background-color: #ddf; - padding: 5px; -} - -table.edit_dn_menu { - font-size: 75%; -} - -table.edit_dn_menu td.icon { - width: 16px; +/* Password Checker */ +div.password_checker h3 { text-align: center; -} - -input.scary { - background: red; - font-weight: bold; + margin: 0px; + padding: 0px; color: white; -} - -input.cancel { - padding-left: 10px; - padding-right: 10px; + background-color: #018; font-weight: bold; + font-size: 18px; } -input.happy { - background: green; - font-weight: bold; - color: white; -} - -table.delete_confirm { - width: 76%; - background-color: #ddf; - padding: 20px; - text-align: left; -} - -/* Login Box */ -#pla_login { - background: url('../images/uid.png') no-repeat 0 1px; - background-color: #fafaff; - padding-left: 17px; -} - -#pla_login:focus { - background-color: #ffffba; -} - -#pla_login:disabled { - background-color: #ddddff; -} - -#pla_pass { - background: url('../images/key.png') no-repeat 0 1px; - background-color: #fafaff; - padding-left: 17px; -} - -#pla_pass:focus { - background-color: #ffffba; -} - -#pla_pass:disabled { - background-color: #ddddff; -} - -table.login { +table.password_checker { background-color: #eeeeff; padding: 10px; border: 1px solid #aaaacc; } -table.create { - font-size: 75%; -} - -table.create td.heading { - vertical-align: top; - padding: 10px; -} - -table.create td.name { +table.password_checker td.head { font-size: 13px; - width: 350px; + font-weight: bold; + width: 10%; + white-space: nowrap; } -div.add_value { - font-size: 10pt; +table.password_checker td.body { + width: 300px; +} + +span.good { + color: green; +} + +span.bad { + color: red; +} + +/* Entry Chooser */ +div.entry_chooser h3 { + text-align: center; margin: 0px; padding: 0px; + color: white; + background-color: #018; + font-weight: bold; + font-size: 18px; } -a.logged_in_dn { - text-decoration: none; - color: black; -} - -a.logged_in_dn:hover { - text-decoration: underline; - color: blue; -} - -a:hover { - color: red; -} - - -/* Styles for formatting the documentation page */ - -h3.doc { - margin-left: 60px; -} - -h2.doc { - margin-left: 20px; -} - -p.doc { - margin-left: 100px; -} - -table.export_form { - font-size: 75%; - width: 400px; - border-spacing: 10px; - border-collapse: separate; -} - -table.export_form tr td { +table.entry_chooser td.head { font-size: 13px; - text-align: left; - vertical-align: top; - padding: 4px; + width: 10%; + white-space: nowrap; } -table.form tr td { - vertical-align: top; - padding: 4px; +table.entry_chooser td.value { + font-size: 15px; + font-weight: bold; + width: 100%; } - -.attribute_failed { - color: red; +table.entry_chooser td.body { + font-size: 14px; + font-weight: normal; + width: 100%; + padding: 1px; } -img.chooser { - /* This makes the chooser image line up properly when placed next to a form element in a table cell*/ - vertical-align: bottom; +table.entry_chooser td.icon { + text-align: center; + padding: 0px; + width: 15px; +} + +table.entry_chooser td.icon img { + border: 0px; +} + +table.entry_chooser td.spacer { + width: 10px; + text-align: center; + padding: 0px; + font-size: 0px; } diff --git a/htdocs/delete.php b/htdocs/delete.php index 5bdc8fe..bc9562c 100644 --- a/htdocs/delete.php +++ b/htdocs/delete.php @@ -1,11 +1,9 @@ isReadOnly()) pla_error(_('You cannot perform updates while server is in read-only mode')); -if (! $ldapserver->haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); -$dn = $_POST['dn']; +if (! $_SESSION['plaConfig']->isCommandAvailable('entry_delete', 'simple_delete')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('delete entry'))); -if (is_null($dn)) +$entry['dn'] = get_request('dn'); + +if (! $entry['dn']) pla_error(_('You must specify a DN')); -if (! $ldapserver->dnExists($dn)) - pla_error(sprintf(_('No such entry: %s'),''.pretty_print_dn($dn).'')); +if (! $ldapserver->dnExists($entry['dn'])) + pla_error(sprintf(_('No such entry: %s'),''.pretty_print_dn($entry['dn']).'')); # Check the user-defined custom callback first. -if (run_hook('pre_entry_delete',array('server_id'=>$ldapserver->server_id,'dn'=>$dn))) - $del_result = $ldapserver->delete($dn); +if (run_hook('pre_entry_delete',array('server_id'=>$ldapserver->server_id,'dn'=>$entry['dn']))) + $result = $ldapserver->delete($entry['dn']); else - pla_error(sprintf(_('Could not delete the entry: %s'),''.pretty_print_dn($dn).'')); + pla_error(sprintf(_('Could not delete the entry: %s'),''.pretty_print_dn($entry['dn']).'')); -if ($del_result) { +if ($result) { # Custom callback - run_hook('post_entry_delete',array('server_id'=>$ldapserver->server_id,'dn'=>$dn)); + run_hook('post_entry_delete', + array('server_id'=>$ldapserver->server_id,'dn'=>$entry['dn'])); - include './header.php'; - echo ''; - - echo ''; - echo '

'; - printf('
'._('Entry %s deleted successfully.').'
',''.pretty_print_dn($dn).''); - echo ''; + system_message(array( + 'title'=>_('Delete DN'), + 'body'=>_('Successfully deleted DN ').sprintf('%s',$entry['dn']), + 'type'=>'info'), + 'index.php'); } else { - pla_error(sprintf(_('Could not delete the entry: %s'),''.pretty_print_dn($dn).''), - $ldapserver->error(),$ldapserver->errno()); + pla_error(sprintf(_('Could not delete the entry: %s'),''.pretty_print_dn($entry['dn']).''), + $ldapserver->error(),$ldapserver->errno()); } -echo ''; ?> diff --git a/htdocs/delete_attr.php b/htdocs/delete_attr.php index 2d5e0e5..346ca6f 100644 --- a/htdocs/delete_attr.php +++ b/htdocs/delete_attr.php @@ -1,12 +1,9 @@ isReadOnly()) pla_error(_('You cannot perform updates while server is in read-only mode')); -if (! $ldapserver->haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); -$dn = isset($_POST['dn']) ? $_POST['dn'] : null; -$attr = isset($_POST['attr']) ? $_POST['attr'] : null; +if (! $_SESSION['plaConfig']->isCommandAvailable('attribute_delete')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('delete attribute'))); -if (! $dn) +$entry['dn']['string'] = get_request('dn'); +$entry['dn']['encode'] = rawurlencode($entry['dn']['string']); +$entry['attr'] = get_request('attr'); + +if (! $entry['dn']['string']) pla_error(_('No DN specified')); -if (! $attr) +if (! $entry['attr']) pla_error(_('No attribute name specified.')); -$encoded_dn = rawurlencode($dn); - -if ($ldapserver->isAttrReadOnly($attr)) - pla_error(sprintf(_('The attribute "%s" is flagged as read-only in the phpLDAPadmin configuration.'),htmlspecialchars($attr))); +if ($ldapserver->isAttrReadOnly($entry['attr'])) + pla_error(sprintf(_('The attribute "%s" is flagged as read-only in the phpLDAPadmin configuration.'),htmlspecialchars($entry['attr']))); $update_array = array(); -$update_array[$attr] = array(); +$update_array[$entry['attr']] = array(); -$res = $ldapserver->modify($dn,$update_array); -if ($res) { - $redirect_url = sprintf('template_engine.php?server_id=%s&dn=%s',$ldapserver->server_id,$encoded_dn); +$result = $ldapserver->modify($entry['dn']['string'],$update_array); +if ($result) { + $redirect_url = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s',$ldapserver->server_id,$entry['dn']['encode']); - foreach($update_array as $attr => $junk) + foreach ($update_array as $attr => $junk) $redirect_url .= "&modified_attrs[]=$attr"; header("Location: $redirect_url"); + die(); } else { pla_error(_('Could not perform ldap_modify operation.'),$ldapserver->error(),$ldapserver->errno()); diff --git a/htdocs/delete_form.php b/htdocs/delete_form.php index 01229a7..b129f93 100644 --- a/htdocs/delete_form.php +++ b/htdocs/delete_form.php @@ -1,12 +1,10 @@ isReadOnly()) pla_error(_('You cannot perform updates while server is in read-only mode')); -if (! $ldapserver->haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); -$dn = $_GET['dn']; -$children = $ldapserver->getContainerContents($dn,0,'(objectClass=*)',LDAP_DEREF_NEVER); -$has_children = count($children) > 0 ? true : false; +$entry['dn']['string'] = get_request('dn','GET'); +$entry['dn']['html'] = htmlspecialchars($entry['dn']['string']); -include './header.php'; +# We search all children, not only the visible children in the tree +$entry['children'] = $ldapserver->getContainerContents($entry['dn']['string'],0,'(objectClass=*)',LDAP_DEREF_NEVER); -echo ''; -printf('

'._('Delete %s').'

',htmlspecialchars(get_rdn($dn))); +printf('

'._('Delete %s').'

',htmlspecialchars(get_rdn($entry['dn']['string']))); printf('

%s: %s     %s: %s

', - _('Server'),$ldapserver->name,_('Distinguished Name'),htmlspecialchars($dn)); + _('Server'),$ldapserver->name,_('Distinguished Name'),$entry['dn']['html']); echo "\n"; echo '
'; -if ($has_children) { +if (count($entry['children'])) { printf('%s

',_('Permanently delete all children also?')); - flush(); - # get the total number of child objects (whole sub-tree) - $s = $ldapserver->search(null,dn_escape($dn),'objectClass=*',array('dn')); - $sub_tree_count = count($s); + # Get the total number of child objects (whole sub-tree) + $search['entries'] = $ldapserver->search(null,dn_escape($entry['dn']['string']),'objectClass=*',array('dn')); + $search['count'] = count($search['entries']); + $search['href'] = htmlspecialchars(sprintf('cmd.php?cmd=search&search=true&;server_id=%s&filter=%s&base_dn=%s&form=advanced&scope=sub', + $ldapserver->server_id,rawurlencode('objectClass=*'),rawurlencode($entry['dn']['string']))); - echo ''; + echo '
'; echo ''; - echo ''; - printf(_('phpLDAPadmin can recursively delete this entry and all %s of its children. See below for a list of all the entries that this action will delete. Do you want to do this?'),($sub_tree_count-1)); - echo '

'; + echo ''; - printf('%s', + printf('', + sprintf(_('phpLDAPadmin can recursively delete this entry and all %s of its children. See below for a list of all the entries that this action will delete. Do you want to do this?'),$search['count']-1)); + + echo ''; + + printf('', _('Note: this is potentially very dangerous and you do this at your own risk. This operation cannot be undone. Take into consideration aliases, referrals, and other things that may cause problems.')); - echo '

'; echo "\n"; - echo '

'; - printf(_('This entry is the root of a sub-tree containing %s entries.'),$sub_tree_count); - printf('(%s)', - $ldapserver->server_id,rawurlencode('objectClass=*'),rawurlencode($dn),_('view entries')); - echo '

'; + echo '

'; + printf(_('This entry is the root of a sub-tree containing %s entries.'),$search['count']); + printf(' (%s)', + $search['href'],_('view entries')); + echo '
 
%s
 
%s
'; echo ''; - echo ''; - echo ''; echo ''; - echo '
'; - echo '
'; - printf('',htmlspecialchars($dn)); + echo '
'; + echo ''; + echo ''; + printf('',htmlspecialchars($entry['dn']['string'])); printf('',$ldapserver->server_id); - printf('',sprintf(_('Delete all %s objects'),$sub_tree_count)); + printf('',sprintf(_('Delete all %s objects'),$search['count'])); echo ''; echo '
'; - echo '
'; - printf('',htmlspecialchars($dn)); + echo '
'; + echo ''; + echo ''; + printf('',htmlspecialchars($entry['dn']['string'])); printf('',$ldapserver->server_id); printf('',_('Cancel')); echo ''; echo '
'; echo "\n"; - echo ''; - echo ''; echo ''; echo "\n"; - flush(); - echo '

'; echo _('List of entries to be deleted:'); echo '
'; - printf('',min(10,$search['count'])); + $i = 0; + foreach ($search['entries'] as $dn => $junk) { $i++; printf('',$i,htmlspecialchars(dn_unescape($dn))); } @@ -102,34 +97,32 @@ if ($has_children) { echo "\n"; } else { - echo ''; - echo ''; + echo '
'; - echo '',_('Are you sure you want to permanently delete this object?')); + echo ''; - printf('%s: %s',_('Distinguished Name'),_('DN'),pretty_print_dn($dn)); - echo '
'; - printf('%s: %s',_('Server'),htmlspecialchars($ldapserver->name)); - echo '

'; + printf('',_('Server'),htmlspecialchars($ldapserver->name)); + printf('', + _('Distinguished Name'),_('DN'),$entry['dn']['string']); + echo ''; echo "\n"; - echo '
'; - echo _('Are you sure you want to permanently delete this object?'); - echo '

'; + printf('
%s
 
%s:%s
%s%s
 
'; echo ''; - - echo ''; + echo ''; echo '
'; - echo '
'; - printf('',htmlspecialchars($dn)); + echo '
'; + echo ''; + echo ''; + printf('',htmlspecialchars($entry['dn']['string'])); printf('',$ldapserver->server_id); printf('',_('Delete')); echo ''; echo '
'; - echo '
'; - echo '
'; - printf('',htmlspecialchars($dn)); + echo ''; + echo ''; + printf('',htmlspecialchars($entry['dn']['string'])); printf('',$ldapserver->server_id); printf('',_('Cancel')); echo '
'; @@ -138,16 +131,8 @@ if ($has_children) { echo '
'; echo "\n"; - - echo ''; - echo ''; - echo ''; - echo "\n"; - } echo '
'; echo '
'; -echo ''; -echo ''; ?> diff --git a/htdocs/download_binary_attr.php b/htdocs/download_binary_attr.php index 49e40b7..eb58903 100644 --- a/htdocs/download_binary_attr.php +++ b/htdocs/download_binary_attr.php @@ -1,5 +1,5 @@ dnExists($dn)) pla_error(sprintf(_('No such entry: %s'),pretty_print_dn($dn))); -$search = $ldapserver->search(null,$dn,'(objectClass=*)',array($attr),'base',false,$config->GetValue('deref','view')); +$search = $ldapserver->search(null,$dn,'(objectClass=*)',array($attr),'base',false,$_SESSION['plaConfig']->GetValue('deref','view')); # Dump the binary data to the browser +if (ob_get_level()) ob_end_clean(); header('Content-type: octet-stream'); header("Content-disposition: attachment; filename=$attr"); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); diff --git a/htdocs/draw_tree_node.php b/htdocs/draw_tree_node.php new file mode 100644 index 0000000..cf3620e --- /dev/null +++ b/htdocs/draw_tree_node.php @@ -0,0 +1,35 @@ +getEntry($entry['dn']); + if (! $dnentry) { + $tree->addEntry($entry['dn']); + $dnentry = $this->getEntry($entry['dn']); + } + + if (! $dnentry) + die(); + + if ($entry['action'] == 0) { + $dnentry->close(); + + } elseif ($entry['action'] == 2) { + $dnentry->open(); + + } else { + $dnentry->open(); + if ($entry['dn']) { + echo $tree->draw_children($dnentry,$entry['code']); + } else { + $tree->draw(true); + } + } + die(); +?> diff --git a/htdocs/entry_chooser.php b/htdocs/entry_chooser.php index 92f16a7..9b0bea7 100644 --- a/htdocs/entry_chooser.php +++ b/htdocs/entry_chooser.php @@ -1,89 +1,93 @@ %s',_('Entry Chooser')); -flush(); +echo ''; +echo '
'; +printf('

%s

',_('Entry Chooser')); ?> %s',_('Server: '),htmlspecialchars($ldapserver->name)); - echo '
'; - printf('%s%s',_('Looking in: '),htmlspecialchars($container)); - echo '
'; +echo ''; +if ($entry['container']) { + printf('',_('Server'),htmlspecialchars($ldapserver->name)); + printf('',_('Looking in'),htmlspecialchars($entry['container'])); + echo ''; } /* Has the use already begun to descend into a specific server tree? */ -if (isset($ldapserver) && $container !== false) { +if (isset($ldapserver) && ! is_null($entry['container'])) { if (! $ldapserver->haveAuthInfo()) pla_error(_('Not enough information to login to server. Please check your configuration.')); - $dn_list = $ldapserver->getContainerContents($container,0,'(objectClass=*)',$config->GetValue('deref','tree')); - sort($dn_list); + $entry['children'] = $ldapserver->getContainerContents($entry['container'],0,'(objectClass=*)',$_SESSION['plaConfig']->GetValue('deref','tree')); + sort($entry['children']); foreach ($ldapserver->getBaseDN() as $base_dn) { - if (DEBUG_ENABLED) - debug_log('entry_chooser.php: Comparing BaseDN [%s] with container [%s]',64,$base_dn,$container); + if (DEBUG_ENABLED) + debug_log('entry_chooser.php: Comparing BaseDN [%s] with container [%s]',64,$base_dn,$entry['container']); - if (! pla_compare_dns($container,$base_dn)) { + if (! pla_compare_dns($entry['container'],$base_dn)) { $parent_container = false; - $up_href = sprintf('entry_chooser.php?form_element=%s&rdn=%s',$return_form_element,$rdn); + $href['up'] = htmlspecialchars(sprintf('entry_chooser.php?form_element=%s&rdn=%s',$entry['element'],$entry['rdn'])); break; } else { - $parent_container = get_container($container); - $up_href = sprintf('entry_chooser.php?form_element=%s&rdn=%s&server_id=%s&container=%s', - $return_form_element,$rdn,$ldapserver->server_id,rawurlencode($parent_container)); + $parent_container = get_container($entry['container']); + $href['up'] = htmlspecialchars(sprintf('entry_chooser.php?form_element=%s&rdn=%s&server_id=%s&container=%s', + $entry['element'],$entry['rdn'],$ldapserver->server_id,rawurlencode($parent_container))); } } - echo ' '; - printf(' %s',$up_href,_('Back Up...')); - echo '
'; + echo ''; + echo ''; + printf('',$href['up']); + printf('',$href['up'],_('Back Up...')); + echo ''; - if (! count($dn_list)) - printf('   (%s)
',_('no entries')); + if (! count($entry['children'])) + printf('',_('no entries')); else - foreach ($dn_list as $dn) { - $href = sprintf("javascript:returnDN('%s%s')",($rdn ? "$rdn," : ''),$dn); - echo '   '; - printf('', - $ldapserver->server_id,$return_form_element,$rdn,rawurlencode($dn)); + foreach ($entry['children'] as $dn) { + $href['return'] = sprintf("javascript:returnDN('%s%s')",($entry['rdn'] ? sprintf('%s,',$entry['rdn']) : ''),rawurlencode($dn)); + $href['expand'] = htmlspecialchars(sprintf('entry_chooser.php?server_id=%s&form_element=%s&rdn=%s&container=%s', + $ldapserver->server_id,$entry['element'],$entry['rdn'],rawurlencode($dn))); - printf('%s',$href,htmlspecialchars($dn)); - echo '
'; + echo ''; + echo ''; + printf('',$href['expand']); + + printf('',$href['return'],htmlspecialchars($dn)); + echo ''; + echo "\n\n"; } /* draw the root of the selection tree (ie, list all the servers) */ } else { - foreach ($ldapservers->GetServerList() as $id) { + foreach ($_SESSION['plaConfig']->ldapservers->GetServerList() as $id) { - $ldapserver = $ldapservers->Instance($id); + $ldapserver = $_SESSION['plaConfig']->ldapservers->Instance($id); if ($ldapserver->isVisible()) { @@ -91,25 +95,30 @@ if (isset($ldapserver) && $container !== false) { continue; else { - printf('%s',htmlspecialchars($ldapserver->name)); - echo '
'; + printf('',_('Server'),htmlspecialchars($ldapserver->name)); foreach ($ldapserver->getBaseDN() as $dn) { if (! $dn) { - printf('   (%s)
',_('Could not determine base DN')); + printf('',_('Could not determine base DN')); } else { - $href = sprintf("javascript:returnDN('%s%s')",($rdn ? "$rdn," : ''),$dn); + $href['return'] = sprintf("javascript:returnDN('%s%s')",($entry['rdn'] ? sprintf('%s,',$entry['rdn']) : ''),rawurlencode($dn)); + $href['expand'] = htmlspecialchars(sprintf('entry_chooser.php?server_id=%s&form_element=%s&rdn=%s&container=%s', + $ldapserver->server_id,$entry['element'],$entry['rdn'],rawurlencode($dn))); - echo '   '; - printf(' ', - $ldapserver->server_id,$return_form_element,$rdn,rawurlencode($dn)); - - printf('%s',$href,htmlspecialchars($dn)); - echo '
'; + echo ''; + echo ''; + printf('',$href['expand']); + printf('',$href['return'],htmlspecialchars($dn)); } } + + echo ''; } } } } + +echo '
%s:%s
%s:%s
 
 Up%s
 (%s)
 Plus%s
%s:%s
 (%s)
 Plus%s
 
'; +echo '
'; +echo ''; ?> diff --git a/htdocs/expand.php b/htdocs/expand.php index 0a79db9..710f16e 100644 --- a/htdocs/expand.php +++ b/htdocs/expand.php @@ -1,15 +1,10 @@ haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); - -# This allows us to display large sub-trees without running out of time. -@set_time_limit(0); - -$dn = $_GET['dn']; - -# We dont need this result, as we'll use the SESSION value when we call tree.php -$ldapserver->getContainerContents($dn,0,$config->GetValue('appearance','tree_filter'),$config->GetValue('deref','tree')); +$dn = get_request('dn','GET',true); $tree = get_cached_item($ldapserver->server_id,'tree'); -$tree['browser'][$dn]['open'] = true; +$entry = $tree->getEntry($dn); +$entry->open(); set_cached_item($ldapserver->server_id,'tree','null',$tree); -/* If cookies were disabled, build the url parameter for the session id. - It will be append to the url to be redirect */ -$id_session_param = ''; -if (SID != '') - $id_session_param = sprintf('&%s=%s',session_name(),session_id()); - -header(sprintf('Location:tree.php?foo=%s#%s_%s%s',random_junk(),$ldapserver->server_id,rawurlencode($dn),$id_session_param)); +header(sprintf('Location:index.php?server_id=%s&junk=%s#%s%s', + $ldapserver->server_id,random_junk(),htmlid($ldapserver->server_id,$dn),pla_session_param())); +die(); ?> diff --git a/htdocs/export.php b/htdocs/export.php index a378be5..fbbbe95 100755 --- a/htdocs/export.php +++ b/htdocs/export.php @@ -1,5 +1,5 @@ haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); +if (! $_SESSION['plaConfig']->isCommandAvailable('export')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('export'))); -$base_dn = isset($_POST['dn']) ? $_POST['dn']:NULL; -$format = isset($_POST['format']) ? $_POST['format'] : 'unix'; -$scope = isset($_POST['scope']) ? $_POST['scope'] : 'base'; -$filter = isset($_POST['filter']) ? $_POST['filter'] : 'objectclass=*'; -$target = isset($_POST['target']) ? $_POST['target'] : 'display'; -$save_as_file = isset($_POST['save_as_file']) && $_POST['save_as_file'] == 'on'; +$entry['base_dn'] = get_request('dn'); +$entry['format'] = get_request('format','POST',false,'unix'); +$entry['scope'] = get_request('scope','POST',false,'base'); +$entry['filter'] = get_request('filter','POST',false,'objectclass=*'); +$entry['attr'] = get_request('attributes'); +$entry['sys_attr'] = get_request('sys_attr'); +$entry['file'] = get_request('save_as_file') ? true : false; +$entry['exporter_id'] = get_request('exporter_id'); -if (isset($_POST['filter'])) { - preg_replace('/\s+/','',$_POST['filter']); - $attributes = split(',',preg_replace('/\s+/','',$_POST['attributes'])); +if ($entry['filter']) { + $entry['filter'] = preg_replace('/\s+/','',$entry['filter']); + $attributes = split(',',preg_replace('/\s+/','',$entry['attr'])); } else { $attributes = array(); } -# add system attributes if needed -if (isset($_POST['sys_attr'])) { +# Add system attributes if needed +if ($entry['sys_attr']) { array_push($attributes,'*'); array_push($attributes,'+'); } -isset($_POST['exporter_id']) or pla_error(_('You must choose an export format.')); -$exporter_id = $_POST['exporter_id']; -isset($exporters[$exporter_id]) or pla_error(_('Invalid export format')); +(! is_null($entry['exporter_id'])) or pla_error(_('You must choose an export format.')); +isset($exporters[$entry['exporter_id']]) or pla_error(_('Invalid export format')); # Initialisation of other variables -$friendly_rdn = get_rdn($base_dn,1); -$extension = $exporters[$exporter_id]['extension']; +$friendly_rdn = get_rdn($entry['base_dn'],1); +$extension = $exporters[$entry['exporter_id']]['extension']; # default case not really needed -switch ($format) { +switch ($entry['format']) { case 'win': $br = "\r\n"; break; @@ -59,12 +61,12 @@ switch ($format) { } # get the decoree,ie the source -$plaLdapExporter = new PlaLdapExporter($ldapserver->server_id,$filter,$base_dn,$scope,$attributes); +$plaLdapExporter = new PlaLdapExporter($ldapserver->server_id,$entry['filter'],$entry['base_dn'],$entry['scope'],$attributes); # the decorator do it that way for the moment $exporter = null; -switch ($exporter_id) { +switch ($entry['exporter_id']) { case 0: $exporter = new PlaLdifExporter($plaLdapExporter); break; @@ -96,16 +98,16 @@ if (isset($_REQUEST['compress']) && $_REQUEST['compress'] = 'on') @set_time_limit(0); # send the header -if ($save_as_file) +if ($entry['file']) { + if (ob_get_level()) ob_end_clean(); header('Content-type: application/download'); -else - header('Content-type: text/plain'); + header(sprintf('Content-Disposition: filename="%s.%s"',$friendly_rdn,$exporters[$entry['exporter_id']]['extension'].($exporter->isCompressed()?'.gz':''))); + $exporter->export(); + die(); -header(sprintf('Content-Disposition: filename="%s.%s"',$friendly_rdn,$exporters[$exporter_id]['extension'].($exporter->isCompressed()?'.gz':''))); -header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); -header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); -header('Cache-Control: post-check=0, pre-check=0', false); - -# and export -$exporter->export(); +} else { + print '
';
+	$exporter->export();
+	print '
'; +} ?> diff --git a/htdocs/export_form.php b/htdocs/export_form.php index b0604ee..f49b11d 100755 --- a/htdocs/export_form.php +++ b/htdocs/export_form.php @@ -1,5 +1,5 @@ 'UNIX (Linux, BSD)', @@ -32,15 +33,12 @@ $available_scopes = array ( 'sub' => _('Sub (entire subtree)') ); - -include './header.php'; - -echo ''; printf('

%s

',_('Export')); echo '
'; echo '
'; -echo '
'; -echo ''; +echo ''; +echo ''; +echo '
'; echo ''; echo '
'; @@ -48,11 +46,11 @@ echo '
'; printf('%s',_('Export')); echo ''; -printf('',_('Server'),server_select_list()); +printf('',_('Server'),server_select_list($ldapserver->server_id)); echo ''; printf('',_('Base DN')); -printf(''; echo ''; @@ -64,20 +62,20 @@ echo ''; echo ''; printf('', - _('Search Filter'),htmlspecialchars($filter)); + _('Search Filter'),htmlspecialchars($entry['filter'])); printf('', - _('Show Attributtes'),htmlspecialchars($attributes)); + _('Show Attributtes'),htmlspecialchars($entry['attr'])); printf('', - $sys_attr ? 'checked="true" ' : '',_('Include system attributes')); + $entry['sys_attr'] ? 'checked="true" ' : '',_('Include system attributes')); printf('', _('Save as file')); @@ -100,7 +98,7 @@ printf('%s',_('Export format')); foreach ($exporters as $index => $exporter) { printf('', - htmlspecialchars($index),htmlspecialchars($index),($index==$exporter_id) ? ' checked="true"' : ''); + htmlspecialchars($index),htmlspecialchars($index),($index==$entry['id']) ? ' checked="true"' : ''); printf('
', htmlspecialchars($index),htmlspecialchars($exporter['desc'])); } @@ -113,7 +111,7 @@ echo '
'; printf('%s',_('Line ends')); foreach ($available_formats as $id => $desc) printf('
', - htmlspecialchars($id),htmlspecialchars($id),($format==$id) ? ' checked="true"' : '', + htmlspecialchars($id),htmlspecialchars($id),($entry['format']==$id) ? ' checked="true"' : '', htmlspecialchars($id),htmlspecialchars($desc)); echo '
'; @@ -161,5 +159,3 @@ function get_line_end_format() { } --> - - diff --git a/htdocs/header.php b/htdocs/header.php index 74a30cd..c23efcf 100644 --- a/htdocs/header.php +++ b/htdocs/header.php @@ -1,13 +1,15 @@ GetValue('appearance','language') : 'auto'; +$language = isset($_SESSION['plaConfig']) ? $language = $_SESSION['plaConfig']->GetValue('appearance','language') : 'auto'; # text/xml won't work with MSIE, but is very useful for debugging xhtml code. # header('Content-type: text/xml; charset="UTF-8"'); @@ -24,32 +26,39 @@ echo "\n\n"; echo ''; -if (isset($config) && $pagetitle = $config->GetValue('appearance','page_title')) +if (isset($_SESSION['plaConfig']) && $pagetitle = $_SESSION['plaConfig']->GetValue('appearance','page_title')) printf('phpLDAPadmin - %s',$pagetitle); else echo 'phpLDAPadmin'; -printf('',CSSDIR); +if (isset($_SESSION['plaConfig'])) + $css = $_SESSION['plaConfig']->GetValue('appearance','stylesheet'); +else + $css = 'style.css'; +printf('','../htdocs/'.CSSDIR,$css); if (isset($server_id)) { - $custom_file = get_custom_file($server_id,'style.css',CSSDIR); + $custom_file = get_custom_file($server_id,'style.css','../htdocs/'.CSSDIR); if (strcmp($custom_file,'style.css') != 0) printf('',$custom_file); } -printf('',JSDIR); -printf('',JSDIR); -printf('',JSDIR); -printf('',JSDIR); -printf('',JSDIR); -printf('',JSDIR); -printf('',JSDIR); -printf('',JSDIR); -printf('',JSDIR); -printf('',JSDIR); -printf('',JSDIR); -printf('',JSDIR); +printf('','../htdocs/'.JSDIR); +printf('','../htdocs/'.JSDIR); +printf('','../htdocs/'.JSDIR); +printf('','../htdocs/'.JSDIR); +printf('','../htdocs/'.JSDIR); +printf('','../htdocs/'.JSDIR); + +echo "\n\n"; + +printf('','../htdocs/'.JSDIR); if (isset($meta_refresh_variable)) printf('',$meta_refresh_variable); diff --git a/htdocs/help.php b/htdocs/help.php deleted file mode 100644 index 8aa6af6..0000000 --- a/htdocs/help.php +++ /dev/null @@ -1,28 +0,0 @@ - - - - -

Help

-
-
-

Do you have a problem or question?

-

Perhaps you are new to LDAP and need a little guidance?

-

Help is only one click away. Visit the online phpLDAPadmin support forum.

-
-
- - - diff --git a/htdocs/images/ajax-progress.gif b/htdocs/images/ajax-progress.gif new file mode 100644 index 0000000..994bfab Binary files /dev/null and b/htdocs/images/ajax-progress.gif differ diff --git a/htdocs/images/ajax-spinner.gif b/htdocs/images/ajax-spinner.gif new file mode 100644 index 0000000..1ed786f Binary files /dev/null and b/htdocs/images/ajax-spinner.gif differ diff --git a/htdocs/images/bug-big.png b/htdocs/images/bug-big.png new file mode 100644 index 0000000..0758a85 Binary files /dev/null and b/htdocs/images/bug-big.png differ diff --git a/htdocs/images/debug-cache.png b/htdocs/images/debug-cache.png new file mode 100644 index 0000000..87243bc Binary files /dev/null and b/htdocs/images/debug-cache.png differ diff --git a/htdocs/images/export.png b/htdocs/images/export.png new file mode 100644 index 0000000..6bb2ec6 Binary files /dev/null and b/htdocs/images/export.png differ diff --git a/htdocs/images/favicon.ico b/htdocs/images/favicon.ico new file mode 100644 index 0000000..2b2ba32 Binary files /dev/null and b/htdocs/images/favicon.ico differ diff --git a/htdocs/images/help-big.png b/htdocs/images/help-big.png new file mode 100644 index 0000000..bbda895 Binary files /dev/null and b/htdocs/images/help-big.png differ diff --git a/htdocs/images/home-big.png b/htdocs/images/home-big.png new file mode 100644 index 0000000..d40900d Binary files /dev/null and b/htdocs/images/home-big.png differ diff --git a/htdocs/images/import.png b/htdocs/images/import.png new file mode 100644 index 0000000..ed62d53 Binary files /dev/null and b/htdocs/images/import.png differ diff --git a/htdocs/images/info-big.png b/htdocs/images/info-big.png new file mode 100644 index 0000000..5a2cd96 Binary files /dev/null and b/htdocs/images/info-big.png differ diff --git a/htdocs/images/light-big.png b/htdocs/images/light-big.png new file mode 100644 index 0000000..8f4ca30 Binary files /dev/null and b/htdocs/images/light-big.png differ diff --git a/htdocs/images/logout.png b/htdocs/images/logout.png new file mode 100644 index 0000000..393598b Binary files /dev/null and b/htdocs/images/logout.png differ diff --git a/htdocs/images/notice.png b/htdocs/images/notice.png new file mode 100644 index 0000000..f32a55a Binary files /dev/null and b/htdocs/images/notice.png differ diff --git a/htdocs/images/refresh-big.png b/htdocs/images/refresh-big.png new file mode 100644 index 0000000..22fabff Binary files /dev/null and b/htdocs/images/refresh-big.png differ diff --git a/htdocs/images/request-feature.png b/htdocs/images/request-feature.png new file mode 100644 index 0000000..b7b1241 Binary files /dev/null and b/htdocs/images/request-feature.png differ diff --git a/htdocs/images/schema.png b/htdocs/images/schema.png new file mode 100644 index 0000000..6248d56 Binary files /dev/null and b/htdocs/images/schema.png differ diff --git a/htdocs/images/search.png b/htdocs/images/search.png new file mode 100644 index 0000000..904b1a8 Binary files /dev/null and b/htdocs/images/search.png differ diff --git a/htdocs/images/smile-big.png b/htdocs/images/smile-big.png new file mode 100644 index 0000000..32f3af4 Binary files /dev/null and b/htdocs/images/smile-big.png differ diff --git a/htdocs/images/trash-big.png b/htdocs/images/trash-big.png new file mode 100644 index 0000000..6b638c5 Binary files /dev/null and b/htdocs/images/trash-big.png differ diff --git a/htdocs/index.php b/htdocs/index.php index 7f54a22..b9f25cf 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -1,5 +1,5 @@ *******************************************/ -/** +/* * We will perform some sanity checking here, since this file is normally loaded first when users * first setup PLA. */ -define('LIBDIR','../lib/'); +define('LIBDIR',sprintf('%s/',realpath('../lib/'))); ini_set('display_errors',1); error_reporting(E_ALL); # General functions needed to proceed. ob_start(); if (! file_exists(LIBDIR.'functions.php')) { - ob_end_clean(); - die("Fatal error: Required file 'functions.php' does not exist."); + if (ob_get_level()) ob_end_clean(); + die(sprintf("Fatal error: Required file '%sfunctions.php' does not exist.",LIBDIR)); } if (! is_readable(LIBDIR.'functions.php')) { - ob_end_clean(); - die("Cannot read the file 'functions.php' its permissions are too strict."); + if (ob_get_level()) ob_end_clean(); + die(sprintf("Cannot read the file '%sfunctions.php' its permissions may be too strict.",LIBDIR)); } +if (ob_get_level()) ob_end_clean(); require LIBDIR.'functions.php'; $config_file = CONFDIR.'config.php'; -ob_end_clean(); # Make sure this PHP install has gettext, we use it for language translation if (! extension_loaded('gettext')) - die('Your install of PHP appears to be missing GETTEXT support. GETTEXT is used for language translation. Please install GETTEXT support before using phpLDAPadmin. (Dont forget to restart your web server afterwards)'); + pla_error('

Your install of PHP appears to be missing GETTEXT support.

GETTEXT is used for language translation.

Please install GETTEXT support before using phpLDAPadmin.
(Dont forget to restart your web server afterwards)

'); -/* Helper functions. +/* + * Helper functions. * Our required helper functions are defined in functions.php */ foreach ($pla_function_files as $file_name ) { @@ -50,11 +51,11 @@ foreach ($pla_function_files as $file_name ) { pla_error(sprintf('Fatal error: Required file "%s" does not exist.',$file_name)); if (! is_readable($file_name)) - pla_error(sprintf('Fatal error: Cannot read the file "%s", its permissions are too strict.',$file_name)); + pla_error(sprintf('Fatal error: Cannot read the file "%s", its permissions may be too strict.',$file_name)); ob_start(); require $file_name; - ob_end_clean(); + if (ob_get_level()) ob_end_clean(); } # Configuration File check @@ -81,136 +82,18 @@ if (! file_exists($config_file)) { die(); } elseif (! is_readable($config_file)) { - pla_error(sprintf('Fatal error: Cannot read your configuration file "%s", its permissions are too strict.',$config_file)); + pla_error(sprintf('Fatal error: Cannot read your configuration file "%s", its permissions may be too strict.',$config_file)); } -if (! check_config()) { +# If our config file fails the sanity check, then stop now. +if (! check_config($config_file)) { + $www = new page(); + $body = new block(); + $www->block_add('body',$body); + $www->display(); + exit; } -echo ''."\n"; -echo ''."\n"; -echo "\n"; - -echo ''; - -if ($pagetitle = $config->GetValue('appearance','page_title')) - printf('phpLDAPadmin (%s) - %s',pla_version(),$pagetitle); -else - printf('phpLDAPadmin - %s',pla_version()); - -printf('',$config->GetValue('appearance','tree_width')); -echo ''; -echo ''; -echo ''; - -echo ''; - -/* - * Makes sure that the config file is properly setup and - * that your install of PHP can handle LDAP stuff. - */ -function check_config() { - global $config_file,$config; - - /* Check for syntax errors in config.php - As of php 4.3.5, this NO longer catches fatal errors :( */ - ob_start(); - include $config_file; - $str = ob_get_contents(); - ob_end_clean(); - - if ($str) { - $str = strip_tags($str); - $matches = array(); - preg_match('/(.*):\s+(.*):.*\s+on line (\d+)/',$str,$matches); - $error_type = $matches[1]; - $error = $matches[2]; - $line_num = $matches[3]; - - $file = file($config_file); - - echo ''."\n"; - echo ''."\n"; - echo "\n"; - - echo ''; - echo ''; - echo 'phpLDAPadmin Config File Error'; - echo ''; - echo ''; - - echo ''; - echo '

Config File ERROR

'; - printf('

%s (%s) on line %s

',$error_type,$error,$line_num); - - echo '
'; - printf('Looks like your config file has an ERROR on line %s.
',$line_num); - echo 'Here is a snippet around that line
'; - echo '
'."\n"; - - echo '
'; - - for ($i = $line_num-9; $i<$line_num+5; $i++) { - if ($i+1 == $line_num) - echo '
'; - - if ($i < 0) - continue; - - printf('%s: %s
',$i+1,htmlspecialchars($file[$i])); - - if ($i+1 == $line_num) - echo '
'; - } - - echo '
'; - echo '
'; - echo 'Hint: Sometimes these errors are caused by lines preceding the line reported.'; - echo '
'; - echo ''; - echo ''; - - return false; - } - - # Now read in config_default.php, which also reads in config.php - require LIBDIR.'config_default.php'; - - # Make sure their PHP version is current enough - if (strcmp(phpversion(),REQUIRED_PHP_VERSION) < 0) { - pla_error(sprintf('phpLDAPadmin requires PHP version %s or greater. You are using %s', - REQUIRED_PHP_VERSION,phpversion())); - } - - # Make sure this PHP install has all our required extensions - if (! extension_loaded('ldap')) { - pla_error('Your install of PHP appears to be missing LDAP support. Please install LDAP support before using phpLDAPadmin. (Dont forget to restart your web server afterwards)'); - return false; - } - - # Make sure that we have php-xml loaded. - if (! function_exists('xml_parser_create')) { - pla_error('Your install of PHP appears to be missing XML support. Please install XML support before using phpLDAPadmin. (Dont forget to restart your web server afterwards)'); - return false; - } - - # Make sure their session save path is writable, if they are using a file system session module, that is. - if ( ! strcasecmp('Files',session_module_name() && ! is_writable(realpath(session_save_path())))) { - pla_error('Your PHP session configuration is incorrect. Please check the value of session.save_path - in your php.ini to ensure that the directory specified there exists and is writable. - The current setting of "'.session_save_path().'" is un-writable by the web server.'); - return false; - } - - if (! isset($ldapservers) || count($ldapservers->GetServerList()) == 0) { - pla_error('Your config.php is missing Server Definitions. - Please see the sample file config/config.php.example.',false); - return false; - } - - return true; -} +include './cmd.php'; ?> diff --git a/htdocs/js/date_selector.js b/htdocs/js/date_selector.js index 51b13b7..40c54f7 100644 --- a/htdocs/js/date_selector.js +++ b/htdocs/js/date_selector.js @@ -1,15 +1,17 @@ function dateSelector(id) { - var el = document.getElementById('f_date_'+id); + var el = document.getElementById('f_date_'+id); var format = gettype(el.id); var epoch; var parse = false; - var cal = new Calendar(0, null, onSelect, onClose); + var cal = new Calendar(0, null, onSelect, onClose); + if (defaults['f_time_'+id]) { cal.showsTime = true; } else { cal.showsTime = false; } + cal.weekNumbers = true; cal.showsOtherMonths = true; cal.create(); diff --git a/htdocs/js/phplayersmenu/layerstreemenu.css b/htdocs/js/phplayersmenu/layerstreemenu.css index 664cd18..f59cd29 100644 --- a/htdocs/js/phplayersmenu/layerstreemenu.css +++ b/htdocs/js/phplayersmenu/layerstreemenu.css @@ -1,18 +1,18 @@ -.treemenudiv { +table.tree .treemenudiv { display: block; white-space: nowrap; padding-top: 1px; padding-bottom: 1px; } -.phplmnormal { +table.tree .phplmnormal { font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif; font-size: 13px; color: #000000; text-decoration: none; } -a.phplmnormal:hover { +table.tree a.phplmnormal:hover { font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif; font-size: 13px; color: #000000; @@ -20,21 +20,21 @@ a.phplmnormal:hover { text-decoration: none; } -a.phplm:link { +table.tree a.phplm:link { font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif; font-size: 13px; color: #000000; text-decoration: none; } -a.phplm:visited { +table.tree a.phplm:visited { font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif; font-size: 13px; color: #000000; text-decoration: none; } -a.phplm:hover { +table.tree a.phplm:hover { font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif; font-size: 13px; color: #841212; @@ -42,14 +42,14 @@ a.phplm:hover { text-decoration: none; } -a.phplm:active { +table.tree a.phplm:active { font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif; font-size: 13px; color: #ff0000; text-decoration: none; } -a.phplmselected:link { +table.tree a.phplmselected:link { font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif; font-size: 13px; color: #dd0000; @@ -57,7 +57,7 @@ a.phplmselected:link { text-decoration: none; } -a.phplmselected:visited { +table.tree a.phplmselected:visited { font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif; font-size: 13px; color: #dd0000; @@ -65,7 +65,7 @@ a.phplmselected:visited { text-decoration: none; } -a.phplmselected:hover { +table.tree a.phplmselected:hover { font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif; font-size: 13px; color: #841212; @@ -73,7 +73,7 @@ a.phplmselected:hover { text-decoration: none; } -a.phplmselected:active { +table.tree a.phplmselected:active { font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif; font-size: 13px; color: #ff0000; diff --git a/htdocs/js/phplayersmenu/lib/layersmenu-common.inc.php b/htdocs/js/phplayersmenu/lib/layersmenu-common.inc.php index 6c0e795..b06b1ec 100644 --- a/htdocs/js/phplayersmenu/lib/layersmenu-common.inc.php +++ b/htdocs/js/phplayersmenu/lib/layersmenu-common.inc.php @@ -315,7 +315,9 @@ function setLibjsdir($libjsdir) if ($libjsdir != '' && substr($libjsdir, -1) != '/') { $libjsdir .= '/'; } - if ($libjsdir == '' || substr($libjsdir, 0, 1) != '/') { + if ($libjsdir == '' || (substr($libjsdir, 0, 1) != '/' && substr($libjsdir, 1, 1) != ':')) { + // libjsdir != /.../... + // and libjsdir != C:\...\... $foobar = strpos($libjsdir, $this->dirroot); if ($foobar === false || $foobar != 0) { $libjsdir = $this->dirroot . $libjsdir; @@ -339,7 +341,7 @@ function setImgdir($imgdir) if ($imgdir != '' && substr($imgdir, -1) != '/') { $imgdir .= '/'; } - if ($imgdir == '' || substr($imgdir, 0, 1) != '/') { + if ($imgdir == '' || (substr($imgdir, 0, 1) != '/' && substr($imgdir, 1, 1) != ':')) { $foobar = strpos($imgdir, $this->dirroot); if ($foobar === false || $foobar != 0) { $imgdir = $this->dirroot . $imgdir; @@ -376,7 +378,7 @@ function setIcondir($icondir) if ($icondir != '' && substr($icondir, -1) != '/') { $icondir .= '/'; } - if ($icondir == '' || substr($icondir, 0, 1) != '/') { + if ($icondir == '' || (substr($icondir, 0, 1) != '/' && substr($icondir, 1, 1) != ':')) { $foobar = strpos($icondir, $this->dirroot); if ($foobar === false || $foobar != 0) { $icondir = $this->dirroot . $icondir; @@ -437,7 +439,7 @@ function setTpldirCommon($tpldir) if ($tpldir != '' && substr($tpldir, -1) != '/') { $tpldir .= '/'; } - if ($tpldir == '' || substr($tpldir, 0, 1) != '/') { + if ($tpldir == '' || (substr($tpldir, 0, 1) != '/' && substr($tpldir, 1, 1) != ':')) { $foobar = strpos($tpldir, $this->dirroot); if ($foobar === false || $foobar != 0) { $tpldir = $this->dirroot . $tpldir; diff --git a/htdocs/js/phplayersmenu/lib/treemenu.inc.php b/htdocs/js/phplayersmenu/lib/treemenu.inc.php index 56c7d41..3fe5016 100644 --- a/htdocs/js/phplayersmenu/lib/treemenu.inc.php +++ b/htdocs/js/phplayersmenu/lib/treemenu.inc.php @@ -203,15 +203,25 @@ function newTreeMenu( // corner at end of subtree or t-split if ($not_a_leaf) { if ($cnt == $this->_firstItem[$menu_name]) { - $img = $img_collapse_corner_first; - $alt = $alt_collapse_corner_first; - $this->_treeMenu[$menu_name] .= '' . $alt . ''; + if ($this->tree[$cnt]['last_item'] && $this->tree[$cnt]['children']) { + // Xavier Bruyet : 2006.09.28 + // Display for the first time the tree without the root node expanded + $img = $img_expand_corner_first; + $alt = $alt_expand_corner_first; + // @todo: nasty hack, should really do this better. + $parsed_href = preg_replace('/template_engine/','expand',$this->tree[$cnt]['parsed_href']); + $this->_treeMenu[$menu_name] .= '' . $alt . ''; + } else { + $img = $img_collapse_corner_first; + $alt = $alt_collapse_corner_first; + $this->_treeMenu[$menu_name] .= '' . $alt . ''; + } } else { if ($this->tree[$cnt]['last_item'] && $this->tree[$cnt]['children']) { $img = $img_expand_corner; $alt = $alt_expand_corner; // @todo: nasty hack, should really do this better. - $parsed_href = preg_replace('/template_engine.php/','expand.php',$this->tree[$cnt]['parsed_href']); + $parsed_href = preg_replace('/template_engine/','expand',$this->tree[$cnt]['parsed_href']); $this->_treeMenu[$menu_name] .= '' . $alt . ''; } else { $img = $img_collapse_corner; @@ -235,7 +245,7 @@ function newTreeMenu( $img = $img_expand; $alt = $alt_expand; // @todo: nasty hack, should really do this better. - $parsed_href = preg_replace('/template_engine.php/','expand.php',$this->tree[$cnt]['parsed_href']); + $parsed_href = preg_replace('/template_engine/','expand',$this->tree[$cnt]['parsed_href']); $this->_treeMenu[$menu_name] .= '' . $alt . ''; } else { @@ -331,6 +341,11 @@ function newTreeMenu( 'img_folder_closed' => $img_folder_closed, 'img_folder_open' => $img_folder_open )); + + $inc = ' + + '; + $toggle_function = $t->parse('out', 'tplfile'); $toggle_function = '' . "\n"; - $this->_treeMenu[$menu_name] = $toggle_function . "\n" . $this->_treeMenu[$menu_name] . "\n" . $toggle; + $this->_treeMenu[$menu_name] = $inc . "\n" . $toggle_function . "\n" . $this->_treeMenu[$menu_name] . "\n" . $toggle; return $this->_treeMenu[$menu_name]; } diff --git a/htdocs/js/pla_ajax.js b/htdocs/js/pla_ajax.js new file mode 100644 index 0000000..9e20296 --- /dev/null +++ b/htdocs/js/pla_ajax.js @@ -0,0 +1,113 @@ +// $Header: /cvsroot/phpldapadmin/phpldapadmin/htdocs/js/pla_ajax.js,v 1.2 2007/12/15 07:50:31 wurley Exp $ + +/** + * @package phpLDAPadmin + * @author The phpLDAPadmin development team + * @author Xavier Bruyet + */ + +// current request +var http_request = null; +var http_request_success_callback = ''; +var http_request_error_callback = ''; + +// include html into a component +function includeHTML(component, html) { + if (typeof(component) != 'object' || typeof(html) != 'string') return; + component.innerHTML = html; + + var scripts = component.getElementsByTagName('script'); + if (!scripts) return; + + // load scripts + for (var i = 0; i < scripts.length; i++) { + var scriptclone = document.createElement('script'); + if (scripts[i].attributes.length > 0) { + for (var j in scripts[i].attributes) { + if (typeof(scripts[i].attributes[j]) != 'undefined' + && typeof(scripts[i].attributes[j].nodeName) != 'undefined' + && scripts[i].attributes[j].nodeValue != null + && scripts[i].attributes[j].nodeValue != '') { + scriptclone.setAttribute(scripts[i].attributes[j].nodeName, scripts[i].attributes[j].nodeValue); + } + } + } + scriptclone.text = scripts[i].text; + scripts[i].parentNode.replaceChild(scriptclone, scripts[i]); + eval(scripts[i].innerHTML); + } +} + +// callback function +function alertHttpRequest() { + if (http_request && (http_request.readyState == 4)) { + if (http_request.status == 200) { + response = http_request.responseText; + http_request = null; + //alert(response); + if (http_request_success_callback) { + eval(http_request_success_callback + '(response)'); + } + } else { + alert('There was a problem with the request.'); + cancelHttpRequest(); + } + } +} + +function cancelHttpRequest() { + if (http_request) { + http_request = null; + if (http_request_error_callback) { + eval(http_request_error_callback + '()'); + } + } +} + +// resquest +function makeGETRequest(url, parameters, successCallbackFunctionName, errorCallbackFunctionName) { + makeHttpRequest(url, parameters, 'GET', successCallbackFunctionName, errorCallbackFunctionName); +} + +function makePOSTRequest(url, parameters, successCallbackFunctionName, errorCallbackFunctionName) { + makeHttpRequest(url, parameters, 'POST', successCallbackFunctionName, errorCallbackFunctionName); +} + +function makeHttpRequest(url, parameters, meth, successCallbackFunctionName, errorCallbackFunctionName) { + cancelHttpRequest(); + + http_request_success_callback = successCallbackFunctionName; + http_request_error_callback = errorCallbackFunctionName; + + if (window.XMLHttpRequest) { // Mozilla, Safari,... + http_request = new XMLHttpRequest(); + if (http_request.overrideMimeType) { + http_request.overrideMimeType('text/html'); + } + } else if (window.ActiveXObject) { // IE + try { + http_request = new ActiveXObject("Msxml2.XMLHTTP"); + } catch (e) { + try { + http_request = new ActiveXObject("Microsoft.XMLHTTP"); + } catch (e) {} + } + } + + if (!http_request) { + alert('Cannot create XMLHTTP instance.'); + return false; + } + + http_request.onreadystatechange = window['alertHttpRequest']; + if (meth == 'GET') url = url + '?' + parameters; + http_request.open(meth, url, true); + + http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + http_request.setRequestHeader("Content-length", parameters.length); + http_request.setRequestHeader("Connection", "close"); + + if (meth == 'GET') parameters = null; + http_request.send(parameters); +} + diff --git a/htdocs/js/tree_hide.js b/htdocs/js/tree_hide.js new file mode 100644 index 0000000..cbf94c0 --- /dev/null +++ b/htdocs/js/tree_hide.js @@ -0,0 +1,27 @@ +var current; + +function tree_unhide(whichLayer,old) { + if (current == null) current = old; + var oldtree = document.getElementById('SID_'+current).style; + oldtree.display = 'none'; + + if (document.getElementById) { + // this is the way the standards work + var newtree = document.getElementById(whichLayer).value; + var newtree_div = document.getElementById('SID_'+newtree).style; + newtree_div.display = 'block'; + +/* + } else if (document.all) { + // this is the way old msie versions work + var style2 = document.all[whichLayer].style; + style2.display = style2.display ? '':'block'; + + } else if (document.layers) { + // this is the way nn4 works + var style2 = document.layers[whichLayer].style; + style2.display = style2.display ? '':'block'; +*/ + } + current = newtree; +} diff --git a/htdocs/ldif_import.php b/htdocs/ldif_import.php index 964a3d9..b13c3da 100644 --- a/htdocs/ldif_import.php +++ b/htdocs/ldif_import.php @@ -1,5 +1,5 @@ haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); +if (! $_SESSION['plaConfig']->isCommandAvailable('import')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('import'))); -$continuous_mode = isset($_POST['continuous_mode']) ? 1 : 0; +$entry['continuous_mode'] = get_request('continuous_mode') ? true : false; +$entry['ldif'] = get_request('ldif'); -if (isset($_REQUEST['ldif']) && trim($_REQUEST['ldif'])) { - $textarealdif = $_REQUEST['ldif']; - $remote_file = 'STDIN'; - $file_len = strlen($textarealdif); +if ($entry['ldif']) { + $entry['remote_file'] = 'STDIN'; + $entry['size'] = strlen($entry['ldif']); } elseif (isset($_FILES['ldif_file'])) { $file = $_FILES['ldif_file']['tmp_name']; - $remote_file = $_FILES['ldif_file']['name']; - $file_len = $_FILES['ldif_file']['size']; + $entry['remote_file'] = $_FILES['ldif_file']['name']; + $entry['size'] = $_FILES['ldif_file']['size']; - is_array($_FILES['ldif_file']) or pla_error(_('Missing uploaded file.')); - file_exists($file) or pla_error(_('No LDIF file specified. Please try again.')); - $file_len > 0 or pla_error(_('Uploaded LDIF file is empty.')); + if (! is_array($_FILES['ldif_file'])) { + pla_error(_('Missing uploaded file.'),null,-1,false); + return; + } + if (! file_exists($file)) { + pla_error(_('No LDIF file specified. Please try again.'),null,-1,false); + return; + } + if ($entry['size'] <= 0) { + pla_error(_('Uploaded LDIF file is empty.'),null,-1,false); + return; + } } else { - pla_error(_('You must either upload a file or provide an LDIF in the text box.')); + pla_error(_('You must either upload a file or provide an LDIF in the text box.'),null,-1,false); + return; } -include './header.php'; - -echo ''; printf('

%s

',_('Import LDIF File')); printf('

%s: %s %s: %s (%s %s)

', _('Server'),htmlspecialchars($ldapserver->name), - _('File'),htmlspecialchars($remote_file),number_format($file_len),_('bytes')); + _('File'),htmlspecialchars($entry['remote_file']),number_format($entry['size']),_('bytes')); echo '

'; require LIBDIR.'ldif_functions.php'; @@ -67,10 +74,10 @@ $actionErrorMsg['moddn']= _('Could not rename object:'); $actionErrorMsg['modify']= _('Could not modify object:'); # instantiate the reader -if (isset($textarealdif)) - $ldifReader = new LdifReaderStdIn($textarealdif,$continuous_mode); +if (isset($entry['ldif'])) + $ldifReader = new LdifReaderStdIn($entry['ldif'],$entry['continuous_mode']); else - $ldifReader = new LdifReader($file,$continuous_mode); + $ldifReader = new LdifReader($file,$entry['continuous_mode']); # instantiate the writer $ldapWriter = new LdapWriter($ldapserver); @@ -81,16 +88,16 @@ if (!$ldifReader->hasVersionNumber()) $i=0; # if .. else not mandatory but should be easier to maintain -if ($continuous_mode) { +if ($entry['continuous_mode']) { while ($ldifReader->readEntry()) { $i++; # get the entry. $currentEntry = $ldifReader->fetchEntryObject(); - $edit_href = sprintf('template_engine.php?server_id=%s&dn=%s',$ldapserver->server_id, + $edit_href = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s',$ldapserver->server_id, rawurlencode($currentEntry->dn)); $changeType = $currentEntry->getChangeType(); - printf('%s %s',$actionString[$changeType],$edit_href,$entry->dn); + printf('%s %s',$actionString[$changeType],$edit_href,$currentEntry->dn); if ($ldifReader->hasRaisedException()) { printf(' %s
',_('Failed')); @@ -113,9 +120,6 @@ if ($continuous_mode) { _('Description'),$ldapserver->error()); } } - - if ($i % 5 == 0) - flush(); } # end while } else { @@ -123,7 +127,7 @@ if ($continuous_mode) { while ($entry = $ldifReader->readEntry()) { $i++; - $edit_href = sprintf('template_engine.php?server_id=%s&dn=%s',$ldapserver->server_id, + $edit_href = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s',$ldapserver->server_id, rawurlencode($entry->dn)); $changeType = $entry->getChangeType(); printf('%s %s',$actionString[$changeType],$edit_href,$entry->dn); @@ -131,14 +135,20 @@ if ($continuous_mode) { if ($ldapWriter->ldapModify($entry)) { printf(' %s
',_('Success')); - if ($i % 5 == 0) - flush(); - } else { printf(' %s


',_('Failed')); - reload_left_frame(); - pla_error($actionErrorMsg[$changeType].' '.htmlspecialchars($entry->dn), - $ldapserver->error(),$ldapserver->errno()); + $ldap_err_no = ('0x'.str_pad(dechex($ldapserver->errno()),2,0,STR_PAD_LEFT)); + $verbose_error = pla_verbose_error($ldap_err_no); + + $errormsg = sprintf('%s %s',$actionErrorMsg[$changeType],htmlspecialchars($entry->dn)); + $errormsg .= sprintf('
%s: %s',_('LDAP said'),$verbose_error['title']); + $errormsg .= sprintf('
%s',$verbose_error['desc']); + system_message(array( + 'title'=>_('LDIF text import'), + 'body'=>$errormsg, + 'type'=>'warn')); + + break; } } @@ -161,21 +171,12 @@ if ($continuous_mode) { # close the file $ldifReader->done(); -reload_left_frame(); - -function reload_left_frame(){ - echo ''; -} - -function display_error_message($error_message){ - printf('
%s
',$error_message); -} function display_warning($warning){ printf('
%s
',$warning); } -function display_pla_parse_error($exception,$faultyEntry){ +function display_pla_parse_error($exception,$faultyEntry) { global $actionErrorMsg; $errorMessage = $actionErrorMsg[$faultyEntry->getChangeType()]; @@ -197,6 +198,4 @@ function display_pla_parse_error($exception,$faultyEntry){ echo ''; echo '
'; } - -echo ''; ?> diff --git a/htdocs/ldif_import_form.php b/htdocs/ldif_import_form.php index 22b64fd..4d1174d 100644 --- a/htdocs/ldif_import_form.php +++ b/htdocs/ldif_import_form.php @@ -1,13 +1,10 @@ isReadOnly()) pla_error(_('You cannot perform updates while server is in read-only mode')); -if (! $ldapserver->haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); - -include './header.php'; - -echo ''; printf('

%s

',_('Import LDIF File')); printf('

%s: %s

',_('Server'),htmlspecialchars($ldapserver->name)); @@ -34,21 +25,23 @@ echo '

'; echo _('Select an LDIF file'); echo '

'; -echo ''; +echo ''; +echo ''; printf('',$ldapserver->server_id); echo '
'; -printf('
%s
',_("Don't stop on errors")); +printf('
%s
', + _("Don't stop on errors")); printf('
',_('Proceed >>')); printf('
%s %s
',_('Maximum file size'),ini_get('upload_max_filesize')); echo ''; echo '

'; echo _('Paste your LDIF here'); -echo '
'; +echo ''; +echo ''; echo ''; printf('',$ldapserver->server_id); printf('
%s
',_("Don't stop on errors")); printf('
',_('Proceed >>')); echo ''; -echo ''; ?> diff --git a/htdocs/login.php b/htdocs/login.php index 2b4c5fd..6a9367f 100644 --- a/htdocs/login.php +++ b/htdocs/login.php @@ -1,17 +1,11 @@ isAnonBindAllowed()) - $anon_bind = isset($_POST['anonymous_bind']) && $_POST['anonymous_bind'] == 'on' ? true : false; + $anon_bind = get_request('anonymous_bind') == 'on' ? true : false; else $anon_bind = false; -if (! $anon_bind) - strlen($pass) or pla_error(_('You left the password blank.')); +if (! $anon_bind && ! strlen($pass)) + system_message(array( + 'title'=>_('Authenticate to server'), + 'body'=>_('You left the password blank.'), + 'type'=>'warn'), + 'cmd.php?cmd=login_form'); $save_auth_type = $ldapserver->auth_type; @@ -63,14 +57,11 @@ if ($anon_bind) { the DN to use when searching for the login_attr user. */ $ldapserver->auth_type = 'config'; - set_error_handler('temp_login_error_handler'); if ($ldapserver->login_dn) - $ldapserver->connect(true,'user'); + $ldapserver->connect(); else $ldapserver->connect(true,'anonymous'); - restore_error_handler(); - if (! empty($ldapserver->login_class)) $filter = sprintf('(&(objectClass=%s)(%s=%s))',$ldapserver->login_class,$ldapserver->login_attr,$uid); else @@ -92,12 +83,18 @@ if ($anon_bind) { } } - # If we got here then we werent able to find a DN for the login filter. if (! $dn) - pla_error(_('Bad username or password. Please try again.')); + if ($ldapserver->login_fallback_dn) + $dn = $uid; + else + system_message(array( + 'title'=>_('Authenticate to server'), + 'body'=>_('Bad username or password. Please try again.'), + 'type'=>'error'), + 'cmd.php?cmd=login_form'); - # restore the original auth_type + # Restore the original auth_type $ldapserver->auth_type = $save_auth_type; } } @@ -113,25 +110,38 @@ $ldapserver->login_pass = $pass; # Verify that dn is allowed to login if (! $ldapserver->userIsAllowedLogin($dn)) - pla_error(_('Sorry, you are not allowed to use phpLDAPadmin with this LDAP server.')); + system_message(array( + 'title'=>_('Authenticate to server'), + 'body'=>_('Sorry, you are not allowed to use phpLDAPadmin with this LDAP server.'), + 'type'=>'error'), + 'cmd.php?cmd=login_form'); if (DEBUG_ENABLED) debug_log('User is not prohibited from logging in - now bind with DN [%s]',64,$dn); -# verify that the login is good +# Verify that the login is good if (is_null($dn) && is_null($pass)) - $ds = $ldapserver->connect(true,'anonymous',true); + $ds = $ldapserver->connect(false,'anonymous',true); else - $ds = $ldapserver->connect(true,'user',true); + $ds = $ldapserver->connect(false,'user',true); if (DEBUG_ENABLED) debug_log('Connection returned [%s]',64,$ds); if (! is_resource($ds)) { if ($anon_bind) - pla_error(_('Could not bind anonymously to server.'),null,null,true); + system_message(array( + 'title'=>_('Authenticate to server'), + 'body'=>_('Could not bind anonymously to server.'), + 'type'=>'error'), + 'cmd.php?cmd=login_form'); + else - pla_error(_('Bad username or password. Please try again.'),null,null,true); + system_message(array( + 'title'=>_('Authenticate to server'), + 'body'=>_('Bad username or password. Please try again.'), + 'type'=>'error'), + 'cmd.php?cmd=login_form'); syslog_notice("Authentification FAILED for $dn"); } @@ -144,34 +154,12 @@ if (! $anon_bind) { syslog_notice("Authentification successful for $dn"); } -pla_session_close(); +# Since we were successful, clear the cache so that it will be refreshed with the new creditentials. +del_cached_item($ldapserver->server_id,'tree','null'); -include './header.php'; -echo ''; - -echo ''; - -echo '



'; -printf(_('Successfully logged into server %s').'
',htmlspecialchars($ldapserver->name)); - -if ($anon_bind) - printf('(%s)',_('Anonymous Bind')); - -echo '
'; -echo ''; - -/** - * Only gets called when we fail to login. - */ -function temp_login_error_handler($errno,$errstr,$file,$lineno) { - if (ini_get('error_reporting') == 0 || error_reporting() == 0) - return; - - pla_error(_('Could not connect to LDAP server.').'

'.htmlspecialchars($errstr)); -} +system_message(array( + 'title'=>_('Authenticate to server'), + 'body'=>_('Successfully logged into server.').($anon_bind ? sprintf(' (%s)',_('Anonymous Bind')) : ''), + 'type'=>'info'), + 'index.php'); ?> diff --git a/htdocs/login_form.php b/htdocs/login_form.php index 1ce916c..5315962 100644 --- a/htdocs/login_form.php +++ b/htdocs/login_form.php @@ -1,12 +1,9 @@ auth_type, array('cookie','session'))) pla_error(sprintf(_('Unknown auth_type: %s'),htmlspecialchars($ldapserver->auth_type))); -include './header.php'; - -echo ''; printf('

%s %s

',_('Authenticate to server'),$ldapserver->name); # Check for a secure connection @@ -38,7 +32,8 @@ if (! isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on') { } # Login form. -echo '
'; +echo ''; +echo ''; printf('',$ldapserver->server_id); if (isset($_GET['redirect'])) @@ -47,14 +42,14 @@ if (isset($_GET['redirect'])) echo '
'; echo '
%s%s
%s%s
%s ',htmlspecialchars($dn)); +printf(' ',htmlspecialchars($entry['dn'])); draw_chooser_link('export_form.dn'); echo '
'; foreach ($available_scopes as $id => $desc) printf('
', - htmlspecialchars($id),htmlspecialchars($id),($id == $scope) ? 'checked="true"' : '', + htmlspecialchars($id),htmlspecialchars($id),($id == $entry['scope']) ? 'checked="true"' : '', htmlspecialchars($id),htmlspecialchars($desc)); echo '
%s
%s
 
 
'; -printf('',$ldapserver->isLoginAttrEnabled() ? _('Login Name') : _('Login DN')); +printf('',$ldapserver->isLoginAttrEnabled() ? _('Login Name') : _('Login DN')); printf('', $ldapserver->isLoginAttrEnabled() ? 'uid' : 'login_dn', $ldapserver->isLoginAttrEnabled() ? '' : $ldapserver->login_dn); echo ''; -printf('',_('Password')); +printf('',_('Password')); echo ''; echo ''; @@ -70,6 +65,8 @@ echo ''; echo ''; echo ''; +echo ''; + if( $ldapserver->isAnonBindAllowed() ) { ?> '; -echo ''; -?> diff --git a/htdocs/logout.php b/htdocs/logout.php index 4e62c79..62557ce 100644 --- a/htdocs/logout.php +++ b/htdocs/logout.php @@ -1,5 +1,5 @@ haveAuthInfo()) pla_error(_('No one is logged in to that server.')); -if (in_array($ldapserver->auth_type, array('cookie','session'))) { +if (in_array($ldapserver->auth_type, array('cookie','session','http'))) { syslog_notice (sprintf('Logout for %s',$ldapserver->getLoggedInDN())); - $ldapserver->unsetLoginDN() or pla_error(_('Could not logout.')); + if($ldapserver->auth_type!='http') + $ldapserver->unsetLoginDN() or pla_error(_('Could not logout.')); unset_lastactivity($ldapserver); - if (isset($_SESSION['cache'][$ldapserver->server_id]['tree'])) { - unset($_SESSION['cache'][$ldapserver->server_id]['tree']); - } - pla_session_close(); + @session_destroy(); } else pla_error(sprintf(_('Unknown auth_type: %s'), htmlspecialchars($ldapserver->auth_type))); -include './header.php'; +system_message(array( + 'title'=>_('Logout'), + 'body'=>('Logged out successfully from server.'), + 'type'=>'info'), + 'index.php'); ?> - - - - -
-
-
- %s'),htmlspecialchars($ldapserver->name)); ?>
-
- - - diff --git a/htdocs/mass_delete.php b/htdocs/mass_delete.php index 5447f56..f3ed25e 100644 --- a/htdocs/mass_delete.php +++ b/htdocs/mass_delete.php @@ -1,17 +1,16 @@ on - * [cn=bob,dc=example,dc=com] => on - * etc. + * - mass_delete - an array of DNs to delete in this form: + * Array ( + * [o=myorg,dc=example,dc=com] => on + * [cn=bob,dc=example,dc=com] => on + * ) + * etc. * * @package phpLDAPadmin */ @@ -22,8 +21,9 @@ require './common.php'; if( $ldapserver->isReadOnly() ) pla_error(_('Unable to delete, server is in READY-ONLY mode.')); -if( ! $ldapserver->haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); + +if (! $_SESSION['plaConfig']->isCommandAvailable('entry_delete', 'mass_delete')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('delete mass entries'))); $confirmed = isset($_POST['confirmed']) ? true : false; isset($_POST['mass_delete']) or @@ -37,9 +37,6 @@ is_array($mass_delete) or $ldapserver->isMassDeleteEnabled() or pla_error(_('Mass deletion is not enabled. Please enable it in config.php before proceeding.')); -require './header.php'; - -echo ''; printf('

%s

',_('Mass Deleting')); if ($confirmed == true) { @@ -56,19 +53,18 @@ if ($confirmed == true) { if (count($mass_delete) == 0) { echo '
'; printf('
%s
',_('You did not select any entries to delete.')); - die(); + return; } // @todo: Should sort these entries, so that they are deleted in order, if a user selects children. foreach ($mass_delete as $dn => $junk) { printf(_('Deleting %s'),htmlspecialchars($dn)); - flush(); if(run_hook('pre_entry_delete',array('server_id'=>$ldapserver->server_id,'dn'=>$dn))) { $success = $ldapserver->delete($dn); if ($success) { - run_hook('post_entry_delete',array('server_id'=>$ldapserver->server_id,'dn'=>$dn)); + run_hook('post_entry_delete',array('server_id'=>$ldapserver->server_id,'dn'=>$dn)); printf(' %s.
',_('Success')); $successfully_delete_dns[] = $dn; @@ -78,8 +74,6 @@ if ($confirmed == true) { $failed_dns[] = $dn; } } - - flush(); } echo '
'; @@ -93,8 +87,6 @@ if ($confirmed == true) { else printf('%s',_('All entries deleted successfully.')); - echo ''; - } else { $n = count($mass_delete); printf('

'._('Confirm mass delete of %s entries on server %s').'

',$n,$ldapserver->name); @@ -103,7 +95,7 @@ if ($confirmed == true) { printf(_('Do you really want to delete %s %s %s'), ($n == 1? _('this') : _('these')),$n,($n == 1 ? _('entry') : _('entries'))); - echo '
'; + echo ''; echo ''; printf('',$ldapserver->server_id); diff --git a/htdocs/modify_member_form.php b/htdocs/modify_member_form.php index d5b85e7..7738a03 100644 --- a/htdocs/modify_member_form.php +++ b/htdocs/modify_member_form.php @@ -1,5 +1,5 @@ getBaseDN() as $base_dn) { # Get all entries that can be added to the group - if (preg_match("/^$attr$/i",$config->GetValue('modify_member','posixgroupattr'))) + + if (preg_match("/^$attr$/i",$_SESSION['plaConfig']->GetValue('modify_member','posixgroupattr'))) $possible_values = array_merge($ldapserver->search(null,$base_dn, - $config->GetValue('modify_member','posixfilter'),array($config->GetValue('modify_member','posixattr')))); + $_SESSION['plaConfig']->GetValue('modify_member','posixfilter'), + array($_SESSION['plaConfig']->GetValue('modify_member','posixattr')))); else $possible_values = array_merge($ldapserver->search(null,$base_dn, - $config->GetValue('modify_member','filter'),array($config->GetValue('modify_member','attr')))); + $_SESSION['plaConfig']->GetValue('modify_member','filter'), + array($_SESSION['plaConfig']->GetValue('modify_member','attr')))); } if ($possible_values) @@ -79,10 +75,10 @@ printf('%s %s %s %s:', _('There are'),$num_current_members,_('members in group'),htmlspecialchars($rdn)); for ($i=0; $iGetValue('modify_member','posixgroupattr'))) - $possible_members[$i] = $possible_values[$i][$config->GetValue('modify_member','posixattr')]; + if (preg_match("/^$attr$/i",$_SESSION['plaConfig']->GetValue('modify_member','posixgroupattr'))) + $possible_members[$i] = $possible_values[$i][$_SESSION['plaConfig']->GetValue('modify_member','posixattr')]; else - $possible_members[$i] = $possible_values[$i][$config->GetValue('modify_member','attr')]; + $possible_members[$i] = $possible_values[$i][$_SESSION['plaConfig']->GetValue('modify_member','attr')]; } sort($possible_members); @@ -108,7 +104,8 @@ foreach ($possible_members as $pkey => $possible) { # Modifications will be sent to update_confirm which takes care of rest of the processing echo '
'; echo '
'; -echo ''; +echo ''; +echo ''; echo ''; @@ -166,7 +163,6 @@ printf('',$encoded_attr); for ($i=0; $i<$num_current_members; $i++) printf('', htmlspecialchars($attr),$i,htmlspecialchars($current_members[$i])); - /* * Javascript generates array of input text boxes from new members. * update_confirm.php will see this as new_values[member-attribute][item] diff --git a/htdocs/password_checker.php b/htdocs/password_checker.php index 269e6d7..149631e 100644 --- a/htdocs/password_checker.php +++ b/htdocs/password_checker.php @@ -1,5 +1,5 @@ '; +printf('

%s

',_('Password Checker Tool')); + +echo ''; +echo ''; + +echo '
'; + +echo ''; +printf('',_('Compare')); +printf('', + $entry['enc_type'] ? 'text' : 'password',htmlspecialchars($entry['hash'])); +echo ''; + +echo ''; +printf('',_('To')); +printf('', + htmlspecialchars($entry['password'])); +echo ''; + +echo ''; +echo ''; + +echo ''; +echo ''; +echo '
%s
%s
 '; + +if ($entry['action'] == 'compare') { + echo '    '; + + if (password_check($entry['hash'],$entry['password'])) + printf('%s',_('Passwords match!')); + else + printf('%s',_('Passwords do not match!')); + + echo ''; +} + +echo '
'; +echo ''; +echo ''; + +if (isset($_REQUEST['componentid'])) { + echo ''; +} ?> - -

- -
- - - - - - - - - - - - - -
- - "; - if( password_check( $hash, $check_password) ) - echo "" . _('Passwords match!') . ""; - else - echo "" . _('Passwords do not match!') . ""; - echo ""; - } ?> -
-
diff --git a/htdocs/purge_cache.php b/htdocs/purge_cache.php index e5f112d..68b866a 100644 --- a/htdocs/purge_cache.php +++ b/htdocs/purge_cache.php @@ -1,5 +1,5 @@ isCommandAvailable('purge')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('purge'))); $purge_session_keys = array('cache'); -echo ''; -echo '

Purging Caches




'; - $size = 0; foreach ($purge_session_keys as $key) { if (isset($_SESSION[$key])) { @@ -22,17 +21,15 @@ foreach ($purge_session_keys as $key) { unset($_SESSION[$key]); } } -pla_session_close(); -echo '
'; if (! $size) - echo _('No cache to purge.'); + $body = _('No cache to purge.'); else - printf(_('Purged %s bytes of cache.'),number_format($size)); + $body = sprintf(_('Purged %s bytes of cache.'),number_format($size)); -echo '
'; - -echo ''; -echo ''; -echo ''; +system_message(array( + 'title'=>_('Purge cache'), + 'body'=>$body, + 'type'=>'info'), + 'index.php'); ?> diff --git a/htdocs/rdelete.php b/htdocs/rdelete.php index ee676cb..5bc5bd0 100644 --- a/htdocs/rdelete.php +++ b/htdocs/rdelete.php @@ -1,11 +1,9 @@ isReadOnly()) pla_error(_('You cannot perform updates while server is in read-only mode')); -if (! $ldapserver->haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); -$dn = $_POST['dn']; -if (! $dn) +if (! $_SESSION['plaConfig']->isCommandAvailable('entry_delete', 'simple_delete')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('delete entry'))); + +$entry['dn'] = $_POST['dn']; +if (! $entry['dn']) pla_error(_('You must specify a DN')); -if (! $ldapserver->dnExists($dn)) - pla_error(sprintf(_('No such entry: %s'),htmlspecialchars($dn))); +if (! $ldapserver->dnExists($entry['dn'])) + pla_error(sprintf(_('No such entry: %s'),htmlspecialchars($entry['dn']))); -include './header.php'; - -echo ''; -printf('

'._('Deleting %s').'

',htmlspecialchars(get_rdn($dn))); +printf('

'._('Deleting %s').'

',htmlspecialchars(get_rdn($entry['dn']))); printf('

%s

',_('Recursive delete progress')); echo '

'; echo ''; -flush(); - -# prevent script from bailing early on a long delete +# Prevent script from bailing early on a long delete @set_time_limit(0); -$del_result = pla_rdelete($ldapserver,$dn); +$result = pla_rdelete($ldapserver,$entry['dn']); echo '
'; -if ($del_result) { - echo ''; - printf(_('Entry %s and sub-tree deleted successfully.'),''.htmlspecialchars($dn).''); +if ($result) { + printf(_('Entry %s and sub-tree deleted successfully.'),''.htmlspecialchars($entry['dn']).''); } else { - pla_error(sprintf(_('Could not delete the entry: %s'),htmlspecialchars($dn)), - $ldapserver->error(),$ldapserver->errno()); + pla_error(sprintf(_('Could not delete the entry: %s'),htmlspecialchars($entry['dn'])), + $ldapserver->error(),$ldapserver->errno()); } function pla_rdelete($ldapserver,$dn) { + # we delete all children, not only the visible children in the tree $children = $ldapserver->getContainerContents($dn); if (! is_array($children) || count($children) == 0) { printf('%s %s...',_('Deleting'),htmlspecialchars($dn)); - flush(); if (run_hook('pre_entry_delete',array('server_id'=>$ldapserver->server_id,'dn'=>$dn))) if ($ldapserver->delete($dn)) { - run_hook('post_entry_delete',array('server_id'=>$ldapserver->server_id,'dn'=>$dn)); + run_hook('post_entry_delete',array('server_id'=>$ldapserver->server_id,'dn'=>$dn)); printf(' %s
',_('Success')); return true; } else { - pla_error(sprintf(_('Failed to delete entry %s'),htmlspecialchars($dn)), - $ldapserver->error(),$ldapserver->errno()); + pla_error(sprintf(_('Failed to delete entry %s'),htmlspecialchars($dn)), + $ldapserver->error(),$ldapserver->errno()); } + } else { foreach ($children as $child_dn) pla_rdelete($ldapserver,$child_dn); printf('%s %s...',_('Deleting'),htmlspecialchars($dn)); - flush(); if (run_hook('pre_entry_delete',array('server_id'=>$ldapserver->server_id,'dn'=>$dn))) if ($ldapserver->delete($dn)) { - run_hook('post_entry_delete',array('server_id'=>$ldapserver->server_id,'dn'=>$dn)); + run_hook('post_entry_delete',array('server_id'=>$ldapserver->server_id,'dn'=>$dn)); printf(' %s
',_('Success')); return true; } else { - pla_error(sprintf(_('Failed to delete entry %s'),htmlspecialchars($dn)), - $ldapserver->error(),$ldapserver->errno()); + pla_error(sprintf(_('Failed to delete entry %s'),htmlspecialchars($dn)), + $ldapserver->error(),$ldapserver->errno()); } } } diff --git a/htdocs/refresh.php b/htdocs/refresh.php index 1fcae71..ba4dd3a 100644 --- a/htdocs/refresh.php +++ b/htdocs/refresh.php @@ -1,13 +1,10 @@ isCommandAvailable('server_refresh')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('refresh server'))); unset($_SESSION['cache'][$ldapserver->server_id]['tree']); -pla_session_close(); -header(sprintf('Location: tree.php#%s',$ldapserver->server_id)); +header(sprintf('Location: cmd.php?server_id=%s',$ldapserver->server_id)); +die(); ?> diff --git a/htdocs/rename.php b/htdocs/rename.php index b0b2492..c140438 100644 --- a/htdocs/rename.php +++ b/htdocs/rename.php @@ -1,5 +1,5 @@ isReadOnly()) pla_error(_('You cannot perform updates while server is in read-only mode')); -if (! $ldapserver->haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); + +if (! $_SESSION['plaConfig']->isCommandAvailable('entry_rename')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('rename entry'))); $dn = ($_POST['dn']); if (! $ldapserver->isBranchRenameEnabled()) { + # we search all children, not only the visible children in the tree $children = $ldapserver->getContainerContents($dn); if (count($children) > 0) pla_error(_('You cannot rename an entry which has children entries (eg, the rename operation is not allowed on non-leaf entries)')); @@ -62,16 +64,13 @@ if ($success) { if ($success) { run_hook('post_rename_entry',array('server_id'=>$ldapserver->server_id,'old_dn'=>$dn,'new_dn'=>$new_dn_value)); - $edit_url = sprintf('template_engine.php?server_id=%s&dn=%s',$ldapserver->server_id,rawurlencode($new_dn)); + $rename_message = sprintf('%s',_('Rename successful!')); + $redirect_url = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s',$ldapserver->server_id,rawurlencode($new_dn)); - echo ''; - echo ''; - printf('',$edit_url); - echo ""; - printf('',$edit_url); - echo ''; - - printf('%s %s',_('Redirecting...'),$edit_url,_('here')); - echo ''; + system_message(array( + 'title'=>_('Rename Entry'), + 'body'=>$rename_message, + 'type'=>'info'), + $redirect_url); } ?> diff --git a/htdocs/rename_form.php b/htdocs/rename_form.php index 45eedb8..f87b04c 100644 --- a/htdocs/rename_form.php +++ b/htdocs/rename_form.php @@ -1,5 +1,5 @@ haveAuthInfo()) $dn = $_GET['dn']; $rdn = get_rdn($dn); -include './header.php'; - -echo ''; printf('

%s %s

',_('Rename Entry'),htmlspecialchars($rdn)); printf('

%s: %s     %s: %s

', _('Server'),$ldapserver->name,_('Distinguished Name'),htmlspecialchars($dn)); -echo '
'; +echo '
'; printf('',$ldapserver->server_id); printf('',htmlspecialchars($dn)); printf('',htmlspecialchars($rdn)); printf('',_('Rename')); echo '
'; -echo ''; ?> diff --git a/htdocs/schema.php b/htdocs/schema.php index 3566d72..53110dc 100644 --- a/htdocs/schema.php +++ b/htdocs/schema.php @@ -1,11 +1,9 @@ haveAuthInfo()) - pla_error( _('Not enough information to login to server. Please check your configuration.') ); +if (! $_SESSION['plaConfig']->isCommandAvailable('schema')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('view schema'))); -$view = isset($_GET['view']) ? $_GET['view'] : 'objectClasses'; -$viewvalue = isset($_GET['viewvalue']) ? $_GET['viewvalue'] : null; +$entry['view'] = get_request('view','GET','false','objectClasses'); +$entry['value'] = get_request('viewvalue','GET'); -if (trim($viewvalue) == "") - $viewvalue = null; -if (! is_null($viewvalue)) - $viewed = false; - -include './header.php'; +if (! is_null($entry['value'])) { + $entry['viewed'] = false; + $entry['value'] = strtolower($entry['value']); +} $schema_error_str = sprintf('%s %s.

%s
  • %s
  • %s
  • %s
  • %s
', _('Could not retrieve schema from'),htmlspecialchars($ldapserver->name), _('This could happen for several reasons, the most probable of which are:'),_('The server does not fully support the LDAP protocol.'), _('Your version of PHP does not correctly perform the query.'),_('phpLDAPadmin doesn\'t know how to fetch the schema for your server.'), _('Or lastly, your LDAP server doesnt provide this information.')); -?> - +printf('

%s %s

', + _('Schema for server'), + htmlspecialchars($ldapserver->name)); -

- name); ?>

+$entry['schema_types'] = array( + 'objectClasses'=>'ObjectClasses', + 'attributes'=>'Attribute Types', + 'syntaxes'=>'Syntaxes', + 'matching_rules'=>'Matching Rules'); -
+echo '
'; +echo '
'; -
- %s', - $ldapserver->server_id,'objectClasses',_('ObjectClasses'))); ?> - | - %s', - $ldapserver->server_id,'attributes',_('Attribute Types'))); ?> - | - %s', - $ldapserver->server_id,'syntaxes',_('Syntaxes'))); ?> - | - %s', - $ldapserver->server_id,'matching_rules',_('Matching Rules'))); ?> -
-
+$counter = 0; +foreach ($entry['schema_types'] as $item => $value) { + if ($counter++) + echo ' | '; -server_id,$item); -switch($view) { + $href = htmlspecialchars(sprintf($entry['href'][$item],'')); + echo ($entry['view'] == $item ? _($value) : sprintf('%s',$href,_($value))); +} + +echo '
'; +echo '
'; + +switch($entry['view']) { case 'syntaxes': $highlight_oid = isset($_GET['highlight_oid']) ? $_GET['highlight_oid'] : false; - print ''; - printf('',_('Syntax OID'),_('Description')); + print '
%s%s
'; + printf('',_('Syntax OID'),_('Description')); $counter = 1; @@ -95,13 +85,30 @@ switch($view) { else printf('',$counter%2==0?'even':'odd'); - printf('',$oid,$desc); + printf('',$oid,$desc); } print '
%s%s
%s%s
%s%s
'; break; case 'attributes': + $entry['attr_types'] = array( + 'desc' => _('Description'), + 'obsolete' => _('Obsolete'), + 'inherits' => _('Inherits from'), + 'equality' => _('Equality'), + 'ordering' => _('Ordering'), + 'substring_rule' => _('Substring Rule'), + 'syntax' => _('Syntax'), + 'single_valued' => _('Single Valued'), + 'collective' => _('Collective'), + 'user_modification' => _('User Modification'), + 'usage' => _('Usage'), + 'maximum_length' => _('Maximum Length'), + 'aliases' => _('Aliases'), + 'used_by_objectclasses' => _('Used by objectClasses') + ); + $schema_attrs = $ldapserver->SchemaAttributes(); $schema_object_classes = $ldapserver->SchemaObjectClasses(); @@ -109,135 +116,125 @@ switch($view) { pla_error($schema_error_str); printf('%s:',_('Jump to an attribute type')); - echo '
'; - printf('',$view); + echo ''; + echo ''; + printf('',$entry['view']); printf('',$ldapserver->server_id); echo ''; printf('
',_('Go')); echo '
'; - echo ''; foreach ($schema_attrs as $attr) { - if (is_null($viewvalue) || ! strcasecmp($viewvalue,$attr->getName())) { - if (! is_null($viewvalue)) - $viewed = true; + if (is_null($entry['value']) || ! strcasecmp($entry['value'],$attr->getName())) { + if (! is_null($entry['value'])) + $entry['viewed'] = true; - printf('', + echo '
%s
'; + printf('', strtolower($attr->getName()),$attr->getName()); $counter = 0; - foreach ( - array('desc','obsolete','inherits','equality','ordering','substring_rule','syntax', - 'single_valued','collective','user_modification','usage','maximum_length', - 'aliases','used_by_objectclasses' - ) as $item) { + foreach ($entry['attr_types'] as $item => $value) { printf('',++$counter%2 ? 'odd' : 'even'); + printf('',$value); switch ($item) { case 'desc': - printf('',_('Description')); printf('', is_null($attr->getDescription()) ? '('._('no description').')' : $attr->getDescription()); print ''; printf('',++$counter%2 ? 'odd' : 'even'); - echo ''; + echo ''; printf('',$attr->getOID()); break; case 'obsolete': - printf('',_('Obsolete')); printf('',$attr->getIsObsolete() ? ''._('Yes').'' : _('No')); break; case 'inherits': - printf('',_('Inherits from')); print ''; break; case 'equality': - printf('',_('Equality')); - printf('', - is_null($attr->getEquality()) ? '('._('not specified').')' : - sprintf('%s', - $ldapserver->server_id,$attr->getEquality(),$attr->getEquality())); + print ''; break; case 'ordering': - printf('',_('Ordering')); printf('', is_null($attr->getOrdering()) ? '('._('not specified').')' : $attr->getOrdering()); break; case 'substring_rule': - printf('',_('Substring Rule')); printf('', is_null($attr->getSubstr()) ? '('._('not specified').')' : $attr->getSubstr()); break; case 'syntax': - printf('',_('Syntax')); print ''; break; case 'single_valued': - printf('',_('Single Valued')); printf('',$attr->getIsSingleValue() ? _('Yes') : _('No')); break; case 'collective': - printf('',_('Collective')); printf('',$attr->getIsCollective() ? _('Yes') : _('No')); break; case 'user_modification': - printf('',_('User Modification')); printf('',$attr->getIsNoUserModification() ? _('No') : _('Yes')); break; case 'usage': - printf('',_('Usage')); printf('',$attr->getUsage() ? $attr->getUsage() : '('._('not specified').')'); break; case 'maximum_length': - printf('',_('Maximum Length')); print '',_('Aliases')); print ''; break; case 'used_by_objectclasses': - printf('',_('Used by objectClasses')); print ''; break; @@ -283,12 +280,11 @@ switch($view) { } print ''; } - - flush(); + print '
%s
%s%s%s
OIDOID%s%s%s%s'; if (is_null($attr->getSupAttribute())) printf('(%s)',_('none')); - else - printf('%s', - $ldapserver->server_id,$view, - strtolower($attr->getSupAttribute()),$attr->getSupAttribute()); + else { + $href = htmlspecialchars(sprintf($entry['href']['attributes'],strtolower($attr->getSupAttribute()))); + printf('%s',$href,$attr->getSupAttribute()); + } print '%s%s'; + + if (is_null($attr->getEquality())) + printf('(%s)',_('not specified')); + + else { + $href = htmlspecialchars(sprintf($entry['href']['matching_rules'],$attr->getEquality())); + printf('%s',$href,$attr->getEquality()); + } + + print '%s%s%s%s%s'; if (is_null($attr->getType())) { echo $attr->getSyntaxOID(); } else { - printf('%s (%s)', - $ldapserver->server_id, - $attr->getSyntaxOID(),$attr->getSyntaxOID(), - $attr->getType(),$attr->getSyntaxOID()); + $href = htmlspecialchars(sprintf($entry['href']['syntaxes'].'&highlight_oid=%s#%s','', + $attr->getSyntaxOID(),$attr->getSyntaxOID())); + printf('%s (%s)',$href,$attr->getType(),$attr->getSyntaxOID()); } print '%s%s%s%s%s%s%s%s%s'; if ( is_null($attr->getMaxLength())) @@ -251,31 +248,31 @@ switch($view) { break; case 'aliases': - printf('%s'; if (count($attr->getAliases()) == 0) - echo '('._('none').')'; + printf('(%s)',_('none')); else - foreach ($attr->getAliases() as $alias_attr_name) - printf('%s', - $ldapserver->server_id,strtolower($alias_attr_name),$alias_attr_name); + foreach ($attr->getAliases() as $alias_attr_name) { + $href = htmlspecialchars(sprintf($entry['href']['attributes'],strtolower($alias_attr_name))); + printf('%s',$href,$alias_attr_name); + } print '%s'; if (count($attr->getUsedInObjectClasses()) == 0) - echo '('._('none').')'; + printf('(%s)',_('none')); else - foreach ($attr->getUsedInObjectClasses() as $used_in_oclass) - printf('%s ', - $ldapserver->server_id,strtolower($used_in_oclass),$used_in_oclass); + foreach ($attr->getUsedInObjectClasses() as $used_in_oclass) { + $href = htmlspecialchars(sprintf($entry['href']['objectClasses'],strtolower($used_in_oclass))); + printf('%s ',$href,$used_in_oclass); + } print '
'; + echo '
'; } } - print '
'; break; case 'matching_rules': @@ -298,26 +294,25 @@ switch($view) { printf('%s
',_('Jump to a matching rule')); - print '
'; + print ''; + print ''; printf('',$ldapserver->server_id); print ''; print ''; printf('',_('Go')); print '
'; - print ''; - printf('', + print '
%s%s%s
'; + printf('', _('Matching Rule OID'),_('Name'),_('Used by Attributes')); $counter = 1; @@ -327,10 +322,10 @@ switch($view) { $oid = htmlspecialchars($rule->getOID()); $desc = htmlspecialchars($rule->getName()); - if ( is_null($viewvalue) || $viewvalue == ($rule->getName())) { + if ( is_null($entry['value']) || $entry['value'] == strtolower($rule->getName())) { - if (! is_null($viewvalue)) - $viewed = true; + if (! is_null($entry['value'])) + $entry['viewed'] = true; if (null != $rule->getDescription()) $desc .= sprintf(' (%s)',$rule->getDescription()); @@ -339,25 +334,26 @@ switch($view) { $desc .= sprintf(' %s',_('Obsolete')); printf('',$counter%2 ? 'odd' : 'even'); - printf('',$oid); - printf('',$desc); + printf('',$oid); + printf('',$desc); - print '
%s%s%s
%s%s%s%s'; + print ''; if (count($rule->getUsedByAttrs()) == 0) { printf('
(%s)


',_('none')); } else { - print ''; } -echo '
'; - print '
'; + print '
'; + print ''; + print ''; printf('',$ldapserver->server_id); print ''; print '
'; + printf('',_('Go')); print ''; print '
'; @@ -377,17 +373,16 @@ switch($view) { printf('%s:',_('Jump to an objectClass')); - echo '
'; - printf('',$view); + echo ''; + echo ''; + printf('',$entry['view']); printf('',$ldapserver->server_id); echo ''; printf('',_('Go')); @@ -395,124 +390,117 @@ switch($view) { echo '
'; - flush(); - foreach ($schema_oclasses as $name => $oclass) { - if (is_null($viewvalue) || ($viewvalue == $name)) { - if (! is_null($viewvalue)) - $viewed = true; + if (is_null($entry['value']) || ($entry['value'] == $name)) { + if (! is_null($entry['value'])) + $entry['viewed'] = true; - printf('

%s

',$name,$oclass->getName()); - printf('

%s: %s

',_('OID'),$oclass->getOID()); + echo ''; + printf('',$name,$oclass->getName()); + printf('',_('OID'),$oclass->getOID()); if ($oclass->getDescription()) - printf('

%s: %s

',_('Description'),$oclass->getDescription()); + printf('',_('Description'),$oclass->getDescription()); - printf('

%s: %s

',_('Type'),$oclass->getType()); + printf('',_('Type'),$oclass->getType()); if ($oclass->getIsObsolete()) - printf('

%s

',_('This objectClass is obsolete.')); + printf('',_('This objectClass is obsolete.')); - printf('

%s: ',_('Inherits from')); + printf('

'; - printf('

%s: ',_('Parent to')); - if (strcasecmp($oclass->getName(),'top') == 0) - printf('(all)',$ldapserver->server_id); + printf('

'; - echo '
%s
%s: %s
%s: %s
%s: %s
%s
%s: ',_('Inherits from')); if (count($oclass->getSupClasses()) == 0) printf('(%s)',_('none')); else foreach ($oclass->getSupClasses() as $i => $object_class) { - printf('%s', - _('Jump to this objectClass definition'), - $ldapserver->server_id,$view,strtolower(htmlspecialchars($object_class)), - htmlspecialchars($object_class)); + $href = htmlspecialchars(sprintf($entry['href']['objectClasses'],strtolower($object_class))); + + printf('%s', + _('Jump to this objectClass definition'),$href,$object_class); if ($i < count($oclass->getSupClasses()) - 1) echo ', '; } - echo ''; + echo '
%s: ',_('Parent to')); + if (strcasecmp($oclass->getName(),'top') == 0) { + $href = htmlspecialchars(sprintf($entry['href']['objectClasses'],'')); + printf('(all)',$href); - elseif (count($oclass->getChildObjectClasses()) == 0) + } elseif (count($oclass->getChildObjectClasses()) == 0) printf('(%s)',_('none')); else foreach ($oclass->getChildObjectClasses() as $i => $object_class) { - printf('%s', - _('Jump to this objectClass definition'), - $ldapserver->server_id,$view,strtolower(htmlspecialchars($object_class)), - htmlspecialchars($object_class)); + $href = htmlspecialchars(sprintf($entry['href']['objectClasses'],strtolower($object_class))); + printf('%s',_('Jump to this objectClass definition'),$href,$object_class); if ( $i < count($oclass->getChildObjectClasses()) - 1) echo ', '; } - echo ''; + echo '
'; - echo ''; - printf('',_('Required Attributes')); - printf('',_('Optional Attributes')); - echo ''; + printf('', + _('Required Attributes'),_('Optional Attributes')); - echo ''; + echo ''; + echo ''; echo ''; - - echo ''; + echo ''; echo ''; echo '
%s%s
 %s%s 
 '; - if (count($oclass->getMustAttrs($schema_oclasses)) > 0) { - echo '
    '; + if (count($oclass->getMustAttrs($schema_oclasses)) > 0) { + + echo '
      '; foreach ($oclass->getMustAttrs($schema_oclasses) as $attr) { echo '
    • '; - printf('%s', - $ldapserver->server_id,rawurlencode(strtolower($attr->getName())),htmlspecialchars($attr->getName())); + $href = htmlspecialchars(sprintf($entry['href']['attributes'],strtolower($attr->getName()))); + printf('%s',$href,$attr->getName()); if ($attr->getSource() != $oclass->getName()) { echo '
      '; - printf('  (%s %s)', - _('Inherited from'),$ldapserver->server_id,strtolower($attr->getSource()),$attr->getSource()); + $href = htmlspecialchars(sprintf($entry['href']['objectClasses'],strtolower($attr->getSource()))); + printf('(%s %s)',_('Inherited from'),$href,$attr->getSource()); } echo '
    • '; } - echo '
    '; } else - printf('
    (%s)
    ',_('none')); - + printf('(%s)',_('none')); echo '
'; + echo ''; if (count($oclass->getMayAttrs($schema_oclasses)) > 0) { - echo '
    '; + echo '
      '; foreach ($oclass->getMayAttrs($schema_oclasses) as $attr) { echo '
    • '; - printf('%s', - $ldapserver->server_id,rawurlencode(strtolower($attr->getName())),htmlspecialchars($attr->getName())); + $href = htmlspecialchars(sprintf($entry['href']['attributes'],strtolower($attr->getName()))); + printf('%s',$href,$attr->getName()); if ($attr->getSource() != $oclass->getName()) { echo '
      '; - printf('   (%s %s)', - _('Inherited from'),$ldapserver->server_id,strtolower($attr->getSource()),$attr->getSource()); + $href = htmlspecialchars(sprintf($entry['href']['objectClasses'],strtolower($attr->getSource()))); + printf('(%s %s)',_('Inherited from'),$href,$attr->getSource()); } echo '
    • '; } - echo '
    '; } else - printf('
    (%s)
    ',_('none')); + printf('(%s)',_('none')); echo '
 
'; + echo '
'; } } /* End foreach objectClass */ break; } -if (! is_null($viewvalue) && ! $viewed) - pla_error(sprintf(_('No such schema item: "%s"'),htmlspecialchars($viewvalue))); - -echo ''; -echo ''; +if (! is_null($entry['value']) && ! $entry['viewed']) + pla_error(sprintf(_('No such schema item: "%s"'),htmlspecialchars($entry['value']))); +?> diff --git a/htdocs/search.php b/htdocs/search.php index a74518a..91dd72f 100644 --- a/htdocs/search.php +++ b/htdocs/search.php @@ -1,11 +1,10 @@ haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); # Output format, table or list? $result_formats = array('list','table'); -$format = isset($_GET['format']) ? $_GET['format'] : $config->GetValue('search','display'); -if (! in_array($format,$result_formats)) - $format = 'list'; +# Our incoming variables +$entry['format'] = get_request('format','GET','false',$_SESSION['plaConfig']->GetValue('search','display')); +$entry['form'] = get_request('form','GET',false,get_request('form','SESSION')); + +$entry['orderby']['raw'] = get_request('orderby','GET'); +$entry['orderby']['string'] = rawurldecode($entry['orderby']['raw']); +$entry['orderby']['array'] = $entry['orderby']['raw'] ? explode(',',preg_replace('/\s+/','',$entry['orderby']['string'])) : true; + +$entry['display']['raw'] = get_request('display_attrs','GET'); +$entry['display']['string'] = rawurldecode($entry['display']['raw']); +$entry['display']['array'] = $entry['display']['raw'] ? explode(',',preg_replace('/\s+/','',$entry['display']['string'])) : array(); + +$entry['filter']['string'] = get_request('filter','GET'); +$entry['filter']['clean'] = $entry['filter']['string'] ? clean_search_vals($entry['filter']['string']) : null; + +$entry['attr'] = get_request('attribute','GET'); +$entry['base_dn']['string'] = get_request('base_dn','GET'); +$entry['criterion'] = get_request('criterion','GET'); +$entry['scope'] = get_request('scope','GET','false','sub'); +$entry['search'] = get_request('search','GET'); +$entry['predefined'] = get_request('predefined','GET'); +$entry['page'] = get_request('page','GET',false,0); + +if (! in_array($entry['format'],$result_formats)) + $entry['format'] = 'list'; + +$_SESSION['form'] = $entry['form']; # build the server drop-down html and JavaScript array (for base_dns) $js_on_change_string = ''; -if (isset($_GET['form']) && $_GET['form'] == 'advanced') - $js_on_change_string = - 'onChange="document.forms[0].base_dn.value=servers[document.forms[0].server_id.value].base_dn"'; +if ($entry['form'] == 'advanced') + $js_on_change_string = 'onChange="document.forms[0].base_dn.value=servers[document.forms[0].server_id.value].base_dn"'; if (isset($ldapserver)) { $server_menu_html = server_select_list($ldapserver->server_id,true,'server_id',$js_on_change_string); $server_info_list = server_info_list(); } -$filter = isset($_GET['filter']) ? clean_search_vals($_GET['filter']) : null; -$orderby = isset($_GET['orderby']) ? clean_search_vals($_GET['orderby']) : null; -$attr = isset($_GET['attribute']) ? $_GET['attribute'] : null; - # grab the base dn for the search -if (isset($_GET['base_dn']) && $_GET['base_dn']) { - $base_dn = $_GET['base_dn']; - $base_dn_is_invalid = false; - $base_dn_does_not_exist = false; +if ($entry['base_dn']['string']) { + $entry['base_dn']['invalid'] = false; + $entry['base_dn']['exist'] = false; - if (trim($base_dn)) - if (! is_dn_string($base_dn)) - $base_dn_is_invalid = true; + if (! is_dn_string($entry['base_dn']['string'])) + $entry['base_dn']['invalid'] = true; - elseif (! $ldapserver->dnExists($base_dn)) - $base_dn_does_not_exist = true; + elseif (! $ldapserver->dnExists($entry['base_dn']['string'])) + $entry['base_dn']['exist'] = true; - $base_dns = array($base_dn); + $base_dns = array($entry['base_dn']['string']); } else if (isset($ldapserver)) $base_dns = $ldapserver->getBaseDN(); -$criterion = isset($_GET['criterion']) ? $_GET['criterion'] : null; +printf('','../htdocs/'.JSDIR); +echo '
'; -if (isset($_GET['form'])) - $_SESSION['form'] = $_GET['form']; -$form = isset($_SESSION['form']) ? $_SESSION['form'] : null; -$scope = isset($_GET['scope']) ? $_GET['scope'] : 'sub'; +$entry['command']['as'] = $_SESSION['plaConfig']->isCommandAvailable('search','advanced_search'); +$entry['command']['ps'] = $_SESSION['plaConfig']->isCommandAvailable('search','predefined_search'); +$entry['command']['ss'] = $_SESSION['plaConfig']->isCommandAvailable('search','simple_search'); -include './header.php'; +if ($entry['form'] == 'advanced') { + if ($entry['command']['as']) + require LIBDIR.'search_form_advanced.php'; -echo '
'; +} elseif ($entry['form'] == 'predefined') { + if ($entry['command']['ps']) + require LIBDIR.'search_form_predefined.php'; -if ($form == 'advanced') +} elseif ($entry['form'] == 'simple') { + # Draw simple search form + if ($entry['command']['ss']) + require LIBDIR.'search_form_simple.php'; + +} elseif ($entry['command']['as']) { require LIBDIR.'search_form_advanced.php'; -elseif ($form == 'predefined') - require LIBDIR.'search_form_predefined.php'; - -# Draw simple search form -else +} elseif ($entry['command']['ss']) { require LIBDIR.'search_form_simple.php'; +} elseif ($entry['command']['ps']) { + require LIBDIR.'search_form_predefined.php'; + +} else { + echo _('Searching is not permitted'); +} + echo '
'; +echo '
'; -flush(); +if ($entry['search']) { + if ($entry['form'] == 'advanced') { + if (! $_SESSION['plaConfig']->isCommandAvailable('search','advanced_search')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('advanced search'))); -if (isset($_GET['search'])) { - if ($form == 'advanced') { - if (isset($_GET['display_attrs'])) - $search_result_attributes = explode(',',rawurldecode(preg_replace('/\s+/','',rawurldecode($_GET['display_attrs'])))); + } elseif ($entry['form'] == 'predefined') { + if (! $_SESSION['plaConfig']->isCommandAvailable('search','predefined_search')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('predefined search'))); + + } elseif ($entry['form'] == 'simple') { + if (! $_SESSION['plaConfig']->isCommandAvailable('search','simple_search')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('simple search'))); + } + + if ($entry['form'] == 'advanced') { + if ($entry['display']) + $search_result_attributes = $entry['display']['array']; else - $search_result_attributes = $config->GetValue('search','result_attributes'); + $search_result_attributes = $_SESSION['plaConfig']->GetValue('search','result_attributes'); } else { - $search_result_attributes = $config->GetValue('search','result_attributes'); + $search_result_attributes = $_SESSION['plaConfig']->GetValue('search','result_attributes'); } # do we have enough authentication information for the specified server_id + # @todo: redirect isnt working if (! $ldapserver->haveAuthInfo()) { - $login_url = sprintf('login_form.php?server_id=%s&redirect=%s', + $login_url = sprintf('cmd.php?cmd=login_form&server_id=%s&redirect=%s', $ldapserver->server_id,rawurlencode($_SERVER['REQUEST_URI'])); - printf('

%s
%s.
', - _('You have not logged into the selected server yet, so you cannot perform searches on it.'),$login_url,_('Click here to go to the login form')); - exit; + system_message(array( + 'title'=>_('Search'), + 'body'=>_('You have not logged into the selected server yet, so you cannot perform searches on it.'), + 'type'=>'warn'), + 'cmd.php?cmd=login_form'); } - if (isset($_GET['predefined'])) { - $predefined = $_GET['predefined']; + if (is_numeric($entry['predefined'])) { + $query = get_cleaned_up_predefined_search($entry['predefined']); - if (is_numeric($predefined)) { - $query = get_cleaned_up_predefined_search($predefined); + $search_result_attributes = explode(', ',$query['attributes']); + $search_attributes_display = $search_result_attributes; + $search_attributes = $search_result_attributes; - $search_result_attributes = explode(', ',$query['attributes']); - $search_attributes_display = $search_result_attributes; - $search_attributes = $search_result_attributes; + $entry['filter']['clean'] = $query['filter']; + $entry['scope'] = $query['scope']; - $filter = $query['filter']; - $scope = $query['scope']; + if (! trim($query['base'])) + $query['base'] = $ldapserver->getBaseDN(); - if (! trim($query['base'])) - $query['base'] = $ldapserver->getBaseDN(); + elseif (is_array($query['base'])) + $base_dns = $query['base']; - elseif (is_array($query['base'])) - $base_dns = $query['base']; - - else - $base_dns = array($query['base']); - } + else + $base_dns = array($query['base']); } else { - $predefined = ''; + $entry['predefined'] = ''; } - if ($filter) { + if ($entry['filter']['clean']) { # if they are using the simple search form, build an LDAP search filter from their input - if ($form == 'simple' & ! is_numeric($predefined)) { + if ($entry['form'] == 'simple' & ! is_numeric($entry['predefined'])) { - switch ($criterion) { + switch ($entry['criterion']) { case 'starts with': - if ($filter == '*') - $filter = ''; + if ($entry['filter']['clean'] == '*') + $entry['filter']['clean'] = ''; - $filter = "($attr=$filter*)"; + $entry['filter']['clean'] = sprintf('(%s=%s*)',$entry['attr'],$entry['filter']['clean']); break; case 'contains': - if ($filter == '*') - $filter = "($attr=*)"; + if ($entry['filter']['clean'] == '*') + $entry['filter']['clean'] = sprintf('(%s=*)',$entry['attr']); else - $filter = "($attr=*$filter*)"; + $entry['filter']['clean'] = sprintf('(%s=*%s*)',$entry['attr'],$entry['filter']['clean']); break; case 'ends with': - if ($filter == '*') - $filter = ''; + if ($entry['filter']['clean'] == '*') + $entry['filter']['clean'] = ''; - $filter = "($attr=*$filter)"; + $entry['filter']['clean'] = sprintf('(%s=*%s)',$entry['attr'],$entry['filter']['clean']); break; case 'equals': - $filter = "($attr=$filter)"; + $entry['filter']['clean'] = sprintf('(%s=%s)',$entry['attr'],$entry['filter']['clean']); break; case 'sounds like': - $filter = "($attr~=$filter)"; + $entry['filter']['clean'] = sprintf('(%s~=%s)',$entry['attr'],$entry['filter']['clean']); break; default: - pla_error(_('Unrecognized criteria option: ').htmlspecialchars($criterion)._('If you want to add your own criteria to the list. Be sure to edit search.php to handle them. Quitting.')); + system_message(array( + 'title'=>_('Unrecognized criteria option: ').htmlspecialchars($entry['criterion']), + 'body'=>_('If you want to add your own criteria to the list. Be sure to edit search.php to handle them. Quitting.'), + 'type'=>'warn'), + 'cmd.php?cmd=search'); } } - printf('
%s
',_('Searching...')); - flush(); - # prevent script from bailing early on a long delete @set_time_limit(0); - $size_limit = $config->GetValue('search','size_limit'); + $size_limit = $_SESSION['plaConfig']->GetValue('search','size_limit'); # Sanity check if ($size_limit < 1) $size_limit = 1; - $page = isset($_GET['page']) ? $_GET['page'] : 0; - $time_start = utime(); $time_elapsed = 0; @@ -208,8 +243,8 @@ if (isset($_GET['search'])) { debug_log('Search with base DN [%s]',64,$base_dn); } - $results = $ldapserver->search(null,dn_escape($base_dn),$filter, - $search_result_attributes,$scope,$orderby,$config->GetValue('deref','search')); + $results = $ldapserver->search(null,dn_escape($base_dn),$entry['filter']['clean'],$search_result_attributes, + $entry['scope'],$entry['orderby']['array'],$_SESSION['plaConfig']->GetValue('deref','search')); if ((! $results) && $ldapserver->errno()) pla_error(_('Encountered an error while performing search.'),$ldapserver->error(),$ldapserver->errno()); @@ -220,58 +255,57 @@ if (isset($_GET['search'])) { $time_elapsed += round($time_end-$time_start,2); $count = count($results); - $start_entry = $page * $size_limit; + $start_entry = $entry['page'] * $size_limit; $end_entry = min($start_entry+$size_limit+1,$count+1); -?> - - - - '; + echo ''; + echo '
- ' . number_format($count) ?>  - ( ) - + # Search Results Table + echo ''; - - - Save %s ]', - $ldapserver->server_id,htmlspecialchars($scope),urlencode($base_dn),urlencode($filter), - urlencode(join(', ',$search_result_attributes)),_('export results')); + echo ''; + printf('',_('Entries found'),_(':'), + number_format($count),$time_elapsed,_('seconds')); - printf('[ %s:',_('Format')); + if ($_SESSION['plaConfig']->isCommandAvailable('export')) { + $href = htmlspecialchars(sprintf('cmd.php?cmd=export_form&server_id=%s&scope=%s&dn=%s&filter=%s&attributes=%s', + $ldapserver->server_id,$entry['scope'],$base_dn,rawurlencode($entry['filter']['clean']),rawurlencode(join(', ',$search_result_attributes)))); + + printf(' - -
%s%s %s (%s %s)[ Save %s ]', + $href,_('export results')); + } + + printf('[ rename %s%s',_('Format'),_(':')); foreach ($result_formats as $f) { echo ' '; - if ($format == $f) { + if ($entry['format'] == $f) { printf('%s',_($f)); } else { - $query_string = array_to_query_string($_GET,array('format')); - $query_string .= "&format=$f"; - printf('%s',$query_string,_($f)); + $query_string = array_to_query_string($_GET,array('format','cmd')); + $query_string .= sprintf('&format=%s',$f); + printf('%s',$query_string,_($f)); } } -?> - ] - - - -
- -
- - + echo ' ]'; -
+ if ($_SESSION['plaConfig']->isCommandAvailable('schema')) { + echo '
'; + printf('%s%s %s',_('Base DN'),_(':'),htmlspecialchars($base_dn)); - '; + printf('%s%s %s',_('Filter performed'),_(':'),htmlspecialchars($entry['filter']['clean'])); + } + } + + echo '
'; # The LDAP error code for the size limit exceeded error. + # @todo: test this with system_message if ($errno && $errno == SIZE_LIMIT_EXCEEDED) printf('
%s

',_('Notice, search size limit exceeded.')); @@ -284,48 +318,48 @@ if (isset($_GET['search'])) { printf(_('Showing results %s through %s.').'
', ''.number_format($start_entry+1).'',''.number_format($end_entry-1).''); - if ($page != 0) { - $query_string = array_to_query_string($_GET,array('page')); - $query_string .= '&page=' . ($page-1); - $pager_html .= sprintf('‹‹',$page,$query_string); + if ($entry['page'] != 0) { + $query_string = array_to_query_string($_GET,array('page','cmd')); + $query_string .= '&page=' . ($entry['page']-1); + $pager_html .= sprintf('‹‹',$entry['page'],$query_string); } else { - $pager_html .= "‹‹"; + $pager_html .= '‹‹'; } $pager_html .= '  '; - // for large search results where we page beyone the first 20 pages, - // print elipsis instead of making the pager be super wide. + /* For large search results where we page beyond the first 20 pages, + * print elipsis instead of making the pager be super wide. */ $elipsis_printed = false; for ($i=0;$i<$count;$i+=$size_limit) { $page_num = $i/$size_limit; - if ($count > $size_limit * 20 && abs($page_num-$page) > 10) { + if ($count > $size_limit * 20 && abs($page_num-$entry['page']) > 10) { if (! $elipsis_printed) { $pager_html .= '...  '; $elipsis_printed = true; } - } elseif ($page == $page_num) { + } elseif ($entry['page'] == $page_num) { $pager_html .= '' . ($page_num + 1) . ''; $pager_html .= '  '; $elipsis_printed = false; } else { - $query_string = array_to_query_string($_GET,array('page')); + $query_string = array_to_query_string($_GET,array('page','cmd')); $query_string .= '&page=' . $page_num; - $pager_html .= "" . ($page_num+1) . ""; + $pager_html .= "" . ($page_num+1) . ""; $pager_html .= '  '; $elipsis_printed = false; } } - if ($page+1 < $total_pages) { - $query_string = array_to_query_string($_GET,array('page')); - $query_string .= '&page=' . ($page+1); - $pager_html .= "››"; + if ($entry['page']+1 < $total_pages) { + $query_string = array_to_query_string($_GET,array('page','cmd')); + $query_string .= '&page=' . ($entry['page']+1); + $pager_html .= "››"; } else { $pager_html .= "››"; @@ -340,14 +374,13 @@ if (isset($_GET['search'])) { if (trim($pager_html)) printf('
%s
',$pager_html); echo '
'; - flush(); - if ($format == 'list') + if ($entry['format'] == 'list') require LIBDIR.'search_results_list.php'; - elseif ($format == 'table') + elseif ($entry['format'] == 'table') require LIBDIR.'search_results_table.php'; else - pla_error(sprintf(_('Unrecognized search result format: %s'),htmlspecialchars($format))); + pla_error(sprintf(_('Unrecognized search result format: %s'),htmlspecialchars($entry['format']))); echo '
'; if (trim($pager_html)) @@ -360,5 +393,4 @@ if (isset($_GET['search'])) { } } -echo ''; ?> diff --git a/htdocs/server_info.php b/htdocs/server_info.php index 29d905e..ee71759 100644 --- a/htdocs/server_info.php +++ b/htdocs/server_info.php @@ -1,5 +1,5 @@ isCommandAvailable('server_info')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('view server informations'))); # The attributes we'll examine when searching the LDAP server's RootDSE $root_dse_attributes = array( @@ -46,9 +47,6 @@ $root_dse_attributes = array( '*' ); -if (! $ldapserver->haveAuthInfo()) - pla_error( _('Not enough information to login to server. Please check your configuration.') ); - # Fetch basic RootDSE attributes using the + and *. $attrs = $ldapserver->search(null,'','objectClass=*',array('+','*'),'base'); $attrs = array_pop($attrs); @@ -65,16 +63,13 @@ if (is_array($attrs2)) if (! isset($attrs[$attr])) $attrs[$attr] = $attrs2[$attr]; -include './header.php'; - -echo ''; printf('

%s%s

',_('Server info for: '),htmlspecialchars($ldapserver->name)); printf('

%s

',_('Server reports the following information about itself')); if (count($attrs) == 0) { echo '

'; printf('
%s
',_('This server has nothing to report.')); - exit; + return; } echo ''; @@ -85,7 +80,7 @@ foreach ($attrs as $attr => $values) { $schema_href = sprintf('schema.php?server_id=%s&view=attributes&viewvalue=%s',$ldapserver->server_id,$attr); echo ''; @@ -99,8 +94,8 @@ foreach ($attrs as $attr => $values) { print ''; if (preg_match('/^[0-9]+\.[0-9]+/',$value)) { - printf('', - htmlspecialchars($value)); + printf('', + htmlspecialchars($value), htmlspecialchars($value)); if ($oidtext = support_oid_to_text($value)) if (isset($oidtext['ref'])) @@ -109,7 +104,7 @@ foreach ($attrs as $attr => $values) { printf('',$oidtext['title']); else - if ($value) + if (strlen($value) > 0) printf('',$value); } else { @@ -128,5 +123,5 @@ foreach ($attrs as $attr => $values) { echo '
'; - printf('%s', + printf('%s', $attr,$schema_href,htmlspecialchars($attr)); echo '
%s%s%s
'; echo '
'; +echo '
'; ?> diff --git a/htdocs/show_cache.php b/htdocs/show_cache.php new file mode 100644 index 0000000..1918890 --- /dev/null +++ b/htdocs/show_cache.php @@ -0,0 +1,90 @@ +GetValue('appearance','hide_debug_info')) { + echo '
    '; + foreach (array_keys($_SESSION) as $key) { + if (($key == 'cache') && is_array($_SESSION[$key])) + foreach (array_keys($_SESSION['cache']) as $server) { + foreach (array_keys($_SESSION['cache'][$server]) as $x) { + $index = sprintf('%s:%s',$server,$x); + + printf('
  • %s
  • ', + $key.$index,$key,$index,$key.'.'.$index,$key.$index,$key.$index); + } + } + else + printf('
  • %s
  • ', + $key,$key,$key,$key); + } + echo '
'; +} +?> + + diff --git a/htdocs/template_engine.php b/htdocs/template_engine.php index 16fb11a..92e60c5 100644 --- a/htdocs/template_engine.php +++ b/htdocs/template_engine.php @@ -1,5 +1,5 @@ haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); - -$friendly_attrs = process_friendly_attr_table(); // @todo might not need this. -$pjs = array(); - -# REMOVE THSE @todo -$today = date('U'); -$shadow_before_today_attrs = arrayLower(array('shadowLastChange','shadowMin')); -$shadow_after_today_attrs = arrayLower(array('shadowMax','shadowExpire','shadowWarning','shadowInactive')); -$shadow_format_attrs = array_merge($shadow_before_today_attrs,$shadow_after_today_attrs); -# END REMOVE +$entry['dn']['encode'] = get_request('dn','REQUEST'); +$entry['dn']['string'] = rawurldecode($entry['dn']['encode']); +$entry['template'] = get_request('template','REQUEST',false,''); # If we have a DN, then this is to edit the entry. -if (isset($_REQUEST['dn'])) { - $dn = $_GET['dn']; - $decoded_dn = rawurldecode($dn); - $encoded_dn = rawurlencode($decoded_dn); +if ($entry['dn']['string']) { + $ldapserver->dnExists($entry['dn']['string']) + or pla_error(sprintf(_('No such entry: %s'),pretty_print_dn($entry['dn']['string']))); - if (! $ldapserver->haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); + $tree = get_cached_item($ldapserver->server_id,'tree'); - $ldapserver->dnExists($dn) - or pla_error(sprintf(_('No such entry: %s'),pretty_print_dn($dn))); + if ($tree) { + $entry['dn']['tree'] = $tree->getEntry($entry['dn']['string']); - $rdn = get_rdn($dn); - $attrs = $ldapserver->getDNAttrs($dn,false,$config->GetValue('deref','view')); + if (! $entry['dn']['tree']) { + /* + * The entry doesn't exists in the tree because it + * may be filtered ; as we ask for its display, we + * add all the same the entry in the tree + */ + $tree->addEntry($entry['dn']['string']); + $entry['dn']['tree'] = $tree->getEntry($entry['dn']['string']); - $modified_attrs = isset($_REQUEST['modified_attrs']) ? $_REQUEST['modified_attrs'] : false; - $show_internal_attrs = isset($_REQUEST['show_internal_attrs']) ? true : false; + } - # If an entry has more children than this, stop searching and display this amount with a '+' - $max_children = 100; + if ($entry['dn']['tree']) { + eval('$reader = new '.$_SESSION['plaConfig']->GetValue('appearance', 'entry_reader').'($ldapserver);'); + $entry['dn']['tree']->accept($reader); + + eval('$writer = new '.$_SESSION['plaConfig']->GetValue('appearance', 'entry_writer').'($ldapserver);'); + $entry['dn']['tree']->accept($writer); + } + } } else { + if ($ldapserver->isReadOnly()) + pla_error(_('You cannot perform updates while server is in read-only mode')); - $dn = ''; - $rdn = ''; - $encoded_dn = ''; + # Create a new empty entry + $entryfactoryclass = $_SESSION['plaConfig']->GetValue('appearance','entry_factory'); + eval('$entry_factory = new '.$entryfactoryclass.'();'); + $entry['dn']['tree'] = $entry_factory->newCreatingEntry(''); - if ($_REQUEST['template'] == 'custom') { - include TMPLDIR.'template_header.php'; - require TMPLDIR.'creation/custom.php'; - die(); + # Init the entry with incoming data + eval('$reader = new '.$_SESSION['plaConfig']->GetValue('appearance', 'entry_reader').'($ldapserver);'); + $entry['dn']['tree']->accept($reader); - } else { - $templates = new Templates($ldapserver->server_id); - $template = $templates->getCreationTemplate($_REQUEST['template']); - } + # Display the creating entry + eval('$writer = new '.$_SESSION['plaConfig']->GetValue('appearance', 'entry_writer').'($ldapserver);'); + $entry['dn']['tree']->accept($writer); } - -include TMPLDIR.'template_header.php'; - -/* - * When we get here, (either a new entry, or modifying an existing entry), if the - * empty_attrs array has content, then we need to ask the user for this information. - */ - -if (isset($template['empty_attrs'])) { - masort($template['empty_attrs'],'page,order',1); - - # What page are we working on. - $page = isset($_REQUEST['page']) ? $_REQUEST['page'] : 1; - - printf('

%s

',$template['description']); - echo "\n\n"; - - if (isset($_REQUEST['nextpage']) && ! $_REQUEST['nextpage']) { - - /* - * destinationcontainer is an otherride of dn. - * needed for such "actions" other than create.php - */ - if (!isset($template['destinationcontainer'])) - $new_dn = sprintf('%s=%s,%s',$template['rdn'],$_REQUEST['form'][$template['rdn']],$_REQUEST['container']); - else - $new_dn = sprintf('%s',$template['destinationcontainer']); - - /* - * default action is create.php - * you can change this behavior by setting myscript.php in template header - */ - if (!isset($template['action'])) - echo ''; - else - printf ('',rawurlencode($template['action'])); - - printf('',htmlspecialchars($new_dn)); - - } else { - echo ''; - } - - if (isset($_REQUEST['form'])) { - foreach ($_REQUEST['form'] as $attr => $value) { - - # Check for any with post actions. - if (isset($template['attribute'][$attr]['post']) && $_REQUEST['page'] == $template['attribute'][$attr]['page']+1) { - if (preg_match('/^=php\.(\w+)\((.*)\)$/',$template['attribute'][$attr]['post'],$matches)) { - switch ($matches[1]) { - case 'Password' : - preg_match_all('/%(\w+)(\|.+)?(\/[lU])?%/U',$matches[2],$matchall); - - $enc = $_REQUEST[$matchall[1][0]]; - $password = $_REQUEST['form'][$matchall[1][1]]; - if (trim($password)) { - $value = password_hash($password,$enc); - $_REQUEST['form'][$attr] = $value; - } - break; - - case 'SambaPassword' : - $matchall = explode(',',$matches[2]); - $attr = preg_replace('/%/','',$matchall[1]); - - # If we have no password, then dont hash nothing! - if (! trim($_REQUEST['form'][$attr])) - break; - - $sambapassword = new smbHash; - - switch ($matchall[0]) { - case 'LM' : $value = $sambapassword->lmhash($_REQUEST['form'][$attr]); - break; - case 'NT' : $value = $sambapassword->nthash($_REQUEST['form'][$attr]); - break; - default : - $value = null; - } - - $_REQUEST['form'][$attr] = $value; - break; - - case 'Join' : - preg_match_all('/%(\w+)(\|.+)?(\/[lU])?%/U',$matches[2],$matchall); - $matchattrs = explode(',',$matches[2]); - $char = $matchattrs[0]; - - $values = array(); - foreach ($matchall[1] as $joinattr) { - if (isset($_REQUEST['form'][$joinattr])) - $values[] = $_REQUEST['form'][$joinattr]; - - else if (isset($_REQUEST[$joinattr])) - $values[] = $_REQUEST[$joinattr]; - - else - pla_error(sprintf(_('Your template is missing variable (%s)'),$joinattr)); - } - - $value = implode($char,$values); - $_REQUEST['form'][$attr] = $value; - break; - - default: - pla_error(sprintf(_('Your template has an unknown post function (%s).'),$matches[1])); - } - } - } - - if (is_array($value)) - foreach ($value as $item) - printf('',$attr,$item); - else - printf('',$attr,$value); - } - - # Have we got a Binary Attribute? - if (isset($_FILES['form']['name']) && is_array($_FILES['form']['name'])) { - foreach ($_FILES['form']['name'] as $attr => $details) { - if (is_uploaded_file($_FILES['form']['tmp_name'][$attr])) { - $file = $_FILES['form']['tmp_name'][$attr]; - $f = fopen($file,'r'); - $binary_data = fread($f,filesize($file)); - fclose($f); - - // @todo: This may need to be implemented. - //if (is_binary_option_required($ldapserver,$attr)) - // $attr .= ';binary'; - - $_SESSION['submitform'][$attr] = $binary_data; - printf('',$attr); - } - } - } - } - - printf('',$ldapserver->server_id); - printf('',htmlspecialchars($_REQUEST['template'])); - printf('',rawurlencode(serialize(array_values($template['objectclass'])))); - printf('',$page+1); - - echo "\n\n"; - echo '
'; - echo ''; - - echo ''; - echo "\n\n"; - echo ''; - - if (isset($template['askcontainer']) && $template['askcontainer'] && $page == 1) { - if (! (isset($template['regexp']) && isset($template['regexp']))) { - - echo ''; - echo ''; - printf(''; - - echo ''; - - } else { - echo ''; - echo ''; - printf('',htmlspecialchars($_REQUEST['container'])); - echo ''; - } - - } else { - printf('',htmlspecialchars($_REQUEST['container'])); - } - - $count = 0; - $nextpage = 0; - $mustitems = 0; - - foreach ($template['empty_attrs'] as $attr => $detail) { - - $mustitem = false; - $verifyitem = false; - $type = isset($detail['type']) ? $detail['type'] : 'text'; - - if (! isset($detail['page'])) - $detail['page'] = 1; - - $size = isset($detail['size']) ? $detail['size'] : 20; - $maxlength = isset($detail['maxlength']) ? $detail['maxlength'] : null; - $rows = isset($detail['rows']) ? $detail['rows'] : null; - $cols = isset($detail['cols']) ? $detail['cols'] : null; - - # Check that the page number is correct. - if ($detail['page'] < $page && ! isset($attr[$attr])) { - # ERROR: This attribute should be set by now. - print "We should have set [$attr] by now.
"; - - } elseif ($detail['page'] == $page) { - - $count++; - echo ''; - - # Some conditional checking. - # $detail['must'] & $detail['disable'] cannot be set at the same time. - # except when "action" is other than create.php - if (isset($detail['must']) && $detail['must'] && isset($detail['disable']) && $detail['disable'] - && (!isset($template['action']) || ($template['action']) == 'create.php')) - pla_error(sprintf(_('Attribute [%s] is a MUST attribute, so it cannot be disabled.'),$attr)); - - # If this attribute is disabled, go to the next one. - if (isset($detail['disable']) && $detail['disable']) - continue; - - # Evaluate our Default Value, if its a function call result. - if (isset($detail['value'])) { - - if (is_array($detail['value'])) { - - # If value is an array, then it must a select list. - $type = 'select'; - $defaultresult = sprintf(''; - $detail['value'] = $defaultresult; - - } else { - $detail['value'] = $templates->EvaluateDefault($ldapserver,$detail['value'],$_REQUEST['container'],null, - (isset($detail['default']) ? $detail['default'] : null)); - } - - #if the default has a select list, then change the type to select - if (preg_match('/','hidden',$attr,$attr,$detail['value']); - continue; - - } else { - pla_error(sprintf(_('Attribute [%s] is a HIDDEN attribute, however, it is missing a VALUE in your template.'),$attr)); - } - } - - # This is a displayed attribute. - # Flag it as a must attribute so that we do get a value. - if (isset($detail['must']) && $detail['must'] && - ! isset($detail['presubmit']) && - $type != 'select') { - - $mustitems++; - $mustitem = true; - } - - # Display the icon if one is required. - if (isset($detail['icon']) && trim($detail['icon'])) - printf('',$detail['icon']); - else - printf(''); - - echo ''; - - # Calculate the events. - # @todo: Need to change js so that if a must attr is auto populated, it decrements the total and enables the submit. - if (isset($detail['onchange'])) { - if (is_array($detail['onchange'])) { - foreach ($detail['onchange'] as $value) - $templates->OnChangeAdd($ldapserver,$attr,$value); - } else { - $templates->OnChangeAdd($ldapserver,$attr,$detail['onchange']); - } - } - - # Display the input box. - echo '',$detail['hint']); - else - echo ''; - - echo ''."\n"; - - # Do we have a verify attribute? - if (isset($detail['verify']) && ($detail['verify'])) { - - $verifyitems = true; - - echo ''."\n"; - } - - # Is this a multiarray input? - if (isset($detail['array']) && ($detail['array'])) { - for ($i=2; $i <= $detail['array']; $i++) { - echo ''; - - printf(''."\n"; - } - } - - # Do we have a helper. - # Side helpers are handled above. - # @todo: Helpers must have an onchange or onsubmit. - # @todo: Helpers must have an id field. - # @todo: Helpers must have an post field. - - if (isset($detail['helper']) && (! isset($detail['helper']['location']) || $detail['helper']['location'] != 'side')) { - - echo ''; - echo ''; - - printf('',$templates->HelperValue($detail['helper']['value'],$detail['helper']['id'])); - } - - if (isset($detail['spacer']) && $detail['spacer']) - echo ''; - - # See if there are any future ones - if there are and we dont ask any this round, then thats an error. - } elseif ($detail['page'] > $page) { - $nextpage++; - } - } - - # @todo: Proper error message required. - if ($nextpage && ! $count) - pla_error(sprintf(_('We are missing a page for [%s] attributes.'),$nextpage)); - - # If there is no count, display the summary - if (! $count) { - printf('', - $template['icon'],_('Create Object'),htmlspecialchars($new_dn)); - - echo ''; - - $counter = 0; - foreach ($_REQUEST['form'] as $attr => $value) { - - # Remove blank attributes. - if (! is_array($_REQUEST['form'][$attr]) && trim($_REQUEST['form'][$attr]) == '') { - unset($_REQUEST['form'][$attr]); - continue; - } - - $attrs[] = $attr; - printf('',$attr,htmlspecialchars($item)); - } - } - - else { - $display = $value; - if (isset($template['attribute'][$attr]['type']) && $template['attribute'][$attr]['type'] == 'password') { - - $enc = (isset($_REQUEST['enc'])) ? $_REQUEST['enc'] : get_enc_type($value); - if (obfuscate_password_display($enc)) - $display = '********'; - } - - printf('',$value); - printf('%s',$attr,htmlspecialchars($display)); - } - - } - - if (isset($_SESSION['submitform'])) { - echo ''; - foreach (array_keys($_SESSION['submitform']) as $attr) { - - printf('',$attr); - } - } - } - - echo ''; - - if (! $nextpage && isset($_REQUEST['nextpage']) && ! $_REQUEST['nextpage']) { - - # Look for any presubmit functions. - foreach ($template['empty_attrs'] as $attr => $detail) { - if (isset($template['attribute'][$attr]['presubmit']) && ! isset($_REQUEST['form'][$attr])) { - printf('', - ($counter++%2==0?'even':'odd'),$attr,htmlspecialchars(_('(Auto evaluated on submission.)'))); - printf('',$attr); - } - } - - printf('', - _('Create Object'),$mustitems ? 'disabled' : ''); - - } elseif ($nextpage) { - printf('', - _('Next Page'),$mustitems ? 'disabled' : ''); - - } else { - printf('', - _('Proceed >>'),$mustitems ? 'disabled' : ''); - } - - echo '
 
 Container DN: ', - htmlspecialchars($_REQUEST['container'])); - draw_chooser_link('template_form.container'); - echo '
 Container DN:', - htmlspecialchars($_REQUEST['container'])); - printf('
Icon '; - - # Display the label. - if (isset($detail['description']) && (trim($detail['description']))) - printf('%s:',$detail['description'],$detail['display']); - - elseif (isset($detail['display'])) - printf('%s:',$detail['display']); - - else - printf('%s:',_('No DISPLAY/DESCRIPTION attribute in template file')); - - echo ''; - - # Is this a binary attribute - if ($ldapserver->isAttrBinary($attr)) { - printf('',$attr); - - if (! ini_get('file_uploads')) - printf('
%s
', - _('Your PHP configuration has disabled file uploads. Please check php.ini before proceeding.')); - - else - printf('
%s: %s
', - _('Maximum file size'),ini_get('upload_max_filesize')); - - } elseif (in_array($type,array('text','password'))) { - printf('', - $type,$size,$attr,(isset($detail['array']) && ($detail['array'] > 1) ? '[]' : ''),$attr, - (isset($detail['value']) ? $detail['value'] : ''), - "onBlur=\"fill('$attr', this.value);\"", - (isset($detail['disable']) ? 'disabled' : ''), - ($maxlength ? sprintf(' maxlength="%s" ',$maxlength) : '')); - - } elseif ($type == 'textarea') { - printf('', - $size,$attr,(isset($detail['array']) && ($detail['array'] > 1) ? '[]' : ''),$attr, - (isset($detail['value']) ? $detail['value'] : ''), - ($cols ? $cols : 35), - ($rows ? $rows : 4), - "onBlur=\"fill('$attr', this.value);\"", - (isset($detail['disable']) ? 'disabled' : '')); - - } elseif ($type == 'select') { - printf($detail['value'],$attr, - "onBlur=\"fill('$attr', this.value);\"", - (isset($detail['disable']) ? 'disabled' : ' ')); - } - - # Disabled items dont get submitted. - # @todo need to add some js to enable them on submit, or add them as hidden items. - - if ($mustitem) - echo ' *'; - - # Do we have a helper, and is it configured for the side. - if (isset($detail['helper']) && isset($detail['helper']['location']) - && $detail['helper']['location'] == 'side' && isset($detail['helper']['value'])) { - - printf(' %s',$templates->HelperValue($detail['helper']['value'], - (isset($detail['helper']['id']) ? $detail['helper']['id'] : ''),$_REQUEST['container'],$ldapserver,null, - isset($detail['helper']['default']) ? $detail['helper']['default'] : '')); - } - - if (isset($detail['hint']) && (trim($detail['hint']))) - printf(' (hint: %s)
 '; - - # Display the label. - if (isset($detail['description']) && (trim($detail['description']))) - printf('%s %s:',_('Verify'),$detail['description'],$detail['display']); - else - printf('%s %s:',_('Verify'),$detail['display']); - - echo ''; - - if (in_array($type,array('text','password'))) { - printf('', - $type,$attr."V",$attr."V",(isset($detail['value']) ? $detail['value'] : ''), - sprintf('onBlur="check(form.%s,form.%sV)"',$attr,$attr)); - } - - echo '
  ', - $type,$attr,$attr.$i,(isset($detail['value']) ? $detail['value'] : ''), - '', - isset($detail['disable']) ? 'disabled' : ''); - - if (isset($detail['helper']) && isset($detail['helper']['location']) - && $detail['helper']['location'] == 'side' && isset($detail['helper']['value'])) { - - printf(' %s',$templates->HelperValue($detail['helper']['value'], - (isset($detail['helper']['id']) ? $detail['helper']['id'] : ''),$_REQUEST['container'],$ldapserver,$i)); - } - echo '
 '; - - # Display the label. - if (isset($detail['helper']['description']) && (trim($detail['helper']['description']))) - printf('%s:',$detail['helper']['description'],$detail['helper']['display']); - else - printf('%s:',$detail['helper']['display']); - - echo '%s
Create%s :%s
',($counter++%2==0?'even':'odd')); - printf('',$attr); - - $countitems = false; - if (is_array($value)) - foreach ($value as $item) { - - if (($item || $item == '0') && ! isset($unique[$item])) { - $unique[$item] = 1; - if ($countitems) - printf ('
',($counter++%2==0?'even':'odd')); - - $countitems = true; - - printf('', - array_search($attr,$attrs),$item); - - printf('%s%s
%s
%s%s', - ($counter++%2==0?'even':'odd'),$attr,_('Binary value not displayed')); - printf('
%s%s



'; - echo '
'; - - if ($mustitems) - printf('',$mustitems); - - printf('',$nextpage); - echo ''."\n\n"; - printf(''._('Page %d').'',$page); - echo "\n\n"; - - if ($mustitems) { - $jstext = ' -'; - $pjs[] = $jstext; - } - - if (isset($verifyitems) && $verifyitems) { - //@todo: Return focus to the first item. - $pjs[] = ' -'; - } - - # User needs to submit form to continue. - foreach ($pjs as $script) - echo $script; - - die(); -} - -if (! isset($template)) - $template['attrs'] = $attrs; - -# If we get here - we are displaying/editing the entry. -# Sort these entries. -uksort($template['attrs'],'sortAttrs'); - -$js_date_attrs = $config->GetValue('appearance','date_attrs'); -$js[] = sprintf('',$config->GetValue('appearance','date')); - -foreach ($template['attrs'] as $attr => $vals) { - if (! is_array($vals)) - $vals = array($vals); - - flush(); - - $schema_attr = $ldapserver->getSchemaAttribute($attr,$dn); - if ($schema_attr) - $attr_syntax = $schema_attr->getSyntaxOID(); - else - $attr_syntax = null; - - if (! strcasecmp($attr,'dn')) - continue; - - # has the config.php specified that this attribute is to be hidden or shown? - if ($ldapserver->isAttrHidden($attr)) - continue; - - # Setup the $attr_note, which will be displayed to the right of the attr name (if any) - $attr_note = ''; - - # is there a user-friendly translation available for this attribute? - if (isset($friendly_attrs[ strtolower($attr) ])) { - $attr_display = $friendly_attrs[ strtolower($attr) ]; - $attr_note = "alias"; - - } else { - $attr_display = $attr; - } - - # is this attribute required by an objectClass? - $required_by = ''; - if ($schema_attr) - foreach ($schema_attr->getRequiredByObjectClasses() as $required) { - if (isset($attrs['objectClass']) && ! is_array($attrs['objectClass'])) - $attrs['objectClass'] = array($attrs['objectClass']); - - if (isset($attrs['objectClass']) && in_array(strtolower($required),arrayLower($attrs['objectClass']))) - $required_by .= $required . ' '; - - # It seems that some LDAP servers (Domino) returns attributes in lower case? - elseif (isset($attrs['objectclass']) && in_array(strtolower($required),arrayLower($attrs['objectclass']))) - $required_by .= $required . ' '; - } - - if ($required_by) { - if (trim($attr_note)) - $attr_note .= ', '; - - $attr_note .= "" . _('required') . " "; - } - - # is this attribute required because its the RDN - if (preg_match("/^${attr}=/",$rdn)) { - if (trim($attr_note)) - $attr_note .= ', '; - - $attr_note .= " " . 'rdn' . " "; - } - - if (is_array($modified_attrs) && in_array($attr,$modified_attrs)) - $is_modified_attr = true; - else - $is_modified_attr = false; - - if ($is_modified_attr) - echo ''; - else - echo ''; - - echo ''; - if ($config->GetValue('appearance','show_schema_link')) { - $schema_href = sprintf('schema.php?server_id=%s&view=attributes&viewvalue=%s', - $ldapserver->server_id,real_attr_name($attr)); - printf('%s',$attr,$schema_href,$attr_display); - } else { - printf('%s',$attr_display); - } - echo ''; - - if ($config->GetValue('appearance','show_attribute_notes')) { - echo ''; - if ($attr_note) - printf('%s',$attr_note); - - if ($ldapserver->isAttrReadOnly($attr)) - printf('(%s)',_('This attribute has been flagged as read only by the phpLDAPadmin administrator'),_('read only')); - - echo ''; - } - echo ''; - - if ($is_modified_attr) - echo ''; - else - echo ''; - - echo ''; - - /* - * Is this attribute a jpegPhoto? - */ - if ($ldapserver->isJpegPhoto($attr)) { - - /* Don't draw the delete buttons if there is more than one jpegPhoto - (phpLDAPadmin can't handle this case yet) */ - if ($ldapserver->isReadOnly() || $ldapserver->isAttrReadOnly($attr)) - draw_jpeg_photos($ldapserver,$dn,$attr,false); - else - draw_jpeg_photos($ldapserver,$dn,$attr,true); - - # proceed to the next attribute - echo ''; - - if ($is_modified_attr) - echo ''; - - continue; - } - - /* - * Is this attribute binary? - */ - if ($ldapserver->isAttrBinary($attr)) { - $href = sprintf('download_binary_attr.php?server_id=%s&dn=%s&attr=%s', - $ldapserver->server_id,$encoded_dn,$attr); - - echo ''; - echo _('Binary value'); - - if (! strcasecmp($attr,'objectSid')) - printf(' (%s)',binSIDtoText($vals[0])); - - echo '
'; - - if (count($vals) > 1) { - for ($i=1; $i<=count($vals); $i++) - printf('Save %s(%s)
', - $href,$i,_('download value'),$i); - - } else { - printf('Save %s
',$href,_('download value')); - } - - if (! $ldapserver->isReadOnly() && ! $ldapserver->isAttrReadOnly($attr)) - printf('Trash %s', - $attr,_('delete attribute')); - - echo '
'; - echo ''; - echo ''; - - if ($is_modified_attr) - echo ''; - - continue; - } - - /* - * Note: at this point,the attribute must be text-based (not binary or jpeg) - */ - - # If this is the userPassword attribute, add the javascript so we can call check password later. - if (! strcasecmp($attr,'userPassword')) { - $js[] = ' - '; - - } - - /* - * If this server is in read-only mode or this attribute is configured as read_only, - * simply draw the attribute values and continue. - */ - if ($ldapserver->isReadOnly() || $ldapserver->isAttrReadOnly($attr) || (preg_match("/^${attr}=/",$rdn))) { - if (is_array($vals)) { - foreach ($vals as $i => $val) { - if (trim($val) == '') - printf('[%s]
',_('empty')); - - elseif (! strcasecmp($attr,'userPassword') && $config->GetValue('appearance','obfuscate_password_display')) { - $user_password = $val; - echo preg_replace('/./','*',$val).'
'; - - } elseif (in_array(strtolower($attr),$shadow_format_attrs)) { - $shadow_date = shadow_date($attrs,$attr); - echo htmlspecialchars($val).' '; - echo ''; - - if (($today < $shadow_date) && in_array(strtolower($attr),$shadow_before_today_attrs)) - echo ''.htmlspecialchars("(".strftime($config->GetValue('appearance','date'),$shadow_date).")").''; - elseif ($today > $shadow_date && in_array(strtolower($attr),$shadow_after_today_attrs)) - echo ''.htmlspecialchars("(".strftime($config->GetValue('appearance','date'),$shadow_date).")").''; - else - echo htmlspecialchars("(".strftime($config->GetValue('appearance','date'),shadow_date($attrs,$attr)).")"); - - echo ''; - - } else - echo htmlspecialchars($val).'
'; - } - } - - if (! strcasecmp($attr,'userPassword') && isset($user_password)) - printf('%s',base64_encode($user_password),_('Check password...')); - - if (preg_match("/^${attr}=/",$rdn)) - printf('(%s)',$rename_href,_('rename')); - - echo ''; - echo ''; - - if ($is_modified_attr) - echo ''; - - continue; - } - - /* - * Is this a userPassword attribute? - */ - if (0 == strcasecmp($attr,'userpassword')) { - foreach ($vals as $user_password) { - $enc_type = get_enc_type($user_password); - - # Set the default hashing type if the password is blank (must be newly created) - if ($user_password == '') - $enc_type = get_default_hash($ldapserver->server_id); - - printf('',htmlspecialchars($user_password)); - echo ''; - printf('',($enc_type == '' ? 'clear' : $enc_type)); - - if (obfuscate_password_display($enc_type)) - echo htmlspecialchars(preg_replace('/./','*',$user_password)); - else - echo htmlspecialchars($user_password); - - echo '
'; - printf('', - (obfuscate_password_display($enc_type) ? 'password' : 'text'),htmlspecialchars($user_password)); - - echo enc_type_select_list($enc_type); - - echo '
'; - printf('%s',base64_encode($user_password),_('Check password...')); - echo '
'; - } - - /* Draw the "add value" link under the list of values for this attributes */ - if (! $ldapserver->isReadOnly() && ($schema_attr = $ldapserver->getSchemaAttribute($attr,$dn)) && - ! $schema_attr->getIsSingleValue()) { - - $add_href = sprintf('add_value_form.php?server_id=%s&dn=%s&attr=%s', - $ldapserver->server_id,$encoded_dn,rawurlencode($attr)); - - printf('
(%s)
', - $add_href,sprintf(_('Add an additional value to attribute \'%s\''),$attr),_('add value')); - } - - echo ''; - echo ''; - - if ($is_modified_attr) - echo ''; - - continue; - } - - /* - * Is this a boolean attribute? - */ - if ($ldapserver->isAttrBoolean($attr)) { - $val = $vals[0]; - - printf('',htmlspecialchars($attr),htmlspecialchars($val)); - - printf(''; - echo ''; - echo ''; - - if ($is_modified_attr) - echo ''; - - continue; - } - - /* - * Is this a date type attribute? - */ - if (in_array_ignore_case($attr,array_keys($js_date_attrs))) { - $val = $vals[0]; - - printf('',htmlspecialchars($attr),htmlspecialchars($val)); - printf(' ', - $attr,htmlspecialchars($attr),htmlspecialchars($val)); - draw_date_selector_link($attr); - echo ''; - echo ''; - $js[] = sprintf('',$attr,$js_date_attrs[$attr]); - - $js_datetime_attrs = $config->GetValue('appearance','date_attrs_showtime'); - if (in_array_ignore_case($attr,array_keys($js_datetime_attrs)) && ($js_datetime_attrs[$attr])) - $js[] = sprintf('',$attr,'true'); - - if ($is_modified_attr) - echo ''; - - continue; - } - - /* - * End of special case attributes (non plain text). - */ - - /* - * This is a plain text attribute, to be displayed and edited in plain text. - */ - foreach ($vals as $i => $val) { - - $input_name = sprintf('new_values[%s][%s]',htmlspecialchars($attr),$i); - /* We smack an id="..." tag in here that doesn't have [][] in it to allow the - draw_chooser_link() to identify it after the user clicks. */ - $input_id = sprintf('new_values_%s_%s',htmlspecialchars($attr),$i); - - /* The old_values array will let update.php know if the entry contents changed - between the time the user loaded this page and saved their changes. */ - - printf('', - htmlspecialchars($attr),$i,htmlspecialchars($val)); - - # Is this value is a structural objectClass, make it read-only - if (! strcasecmp($attr,'objectClass')) { - - printf('Info ', - _('View the schema description for this objectClass'),$ldapserver->server_id,strtolower(htmlspecialchars($val))); - - $schema_object = $ldapserver->getSchemaObjectClass($val); - - # This should be an object, but we'll test it anyway - if (is_object($schema_object) && $schema_object->getType() == 'structural') { - printf(' %s (%s)
', - $val,_('This is a structural ObjectClass and cannot be removed.'),_('structural')); - printf('',$input_name,$input_id,htmlspecialchars($val)); - - continue; - } - } - - if (is_dn_string($val) || $ldapserver->isDNAttr($attr)) - - if ($ldapserver->dnExists($val)) { - printf('Go ', - htmlspecialchars($val),$ldapserver->server_id,rawurlencode($val)); - } else { - printf('N/E ', - htmlspecialchars($val),$ldapserver->server_id,rawurlencode($val)); - } - - elseif (is_mail_string($val)) - printf('Mail ',htmlspecialchars($val)); - - elseif (is_url_string($val)) - printf('URL ',htmlspecialchars($val)); - - if ($ldapserver->isMultiLineAttr($attr,$val)) - printf('',$input_name,$input_id,htmlspecialchars($val)); - else - printf(' ',$input_name,$input_id,htmlspecialchars($val)); - - /* draw a link for popping up the entry browser if this is the type of attribute - that houses DNs. */ - if ($ldapserver->isDNAttr($attr)) - draw_chooser_link("edit_form.$input_id",false); - - echo '
'; - - # If this is a gidNumber on a non-PosixGroup entry, lookup its name and description for convenience - if (! strcasecmp($attr,'gidNumber') && - ! in_array_ignore_case('posixGroup',$ldapserver->getDNAttr($dn,'objectClass'))) { - - $gid_number = $val; - $search_group_filter = "(&(objectClass=posixGroup)(gidNumber=$val))"; - $group = $ldapserver->search(null,null,$search_group_filter,array('dn','description')); - - if (count($group) > 0) { - echo '
'; - - $group = array_pop($group); - $group_dn = $group['dn']; - $group_name = explode('=',get_rdn($group_dn)); - $group_name = $group_name[1]; - $href = sprintf('template_engine.php?server_id=%s&dn=%s',$ldapserver->server_id,urlencode($group_dn)); - - echo ''; - printf('%s',$href,htmlspecialchars($group_name)); - - $description = isset($group['description']) ? $group['description'] : null; - - if ($description) - printf(' (%s)',htmlspecialchars($description)); - - echo ''; - } - } - - # Show the dates for all the shadow attributes. - if (in_array(strtolower($attr),$shadow_format_attrs)) { - if (($shadow_date = shadow_date($attrs,$attr)) !== false) { - echo '
'; - echo ''; - - if (($today < $shadow_date) && in_array(strtolower($attr),$shadow_before_today_attrs)) - echo ''.htmlspecialchars(strftime($config->GetValue('appearance','date'),$shadow_date)).''; - elseif ($today > $shadow_date && in_array(strtolower($attr),$shadow_after_today_attrs)) - echo ''.htmlspecialchars(strftime($config->GetValue('appearance','date'),$shadow_date)).''; - else - echo htmlspecialchars(strftime($config->GetValue('appearance','date'),$shadow_date)); - - echo ''; - } - } - - } /* end foreach value */ - - /* Draw the "add value" link under the list of values for this attributes */ - if (! $ldapserver->isReadOnly() && ($schema_attr = $ldapserver->getSchemaAttribute($attr,$dn)) && - ! $schema_attr->getIsSingleValue()) { - - $add_href = sprintf('add_value_form.php?server_id=%s&dn=%s&attr=%s', - $ldapserver->server_id,$encoded_dn,rawurlencode($attr)); - - printf('
(%s)
', - $add_href,sprintf(_('Add an additional value to attribute \'%s\''),$attr),_('add value')); - - if (in_array($schema_attr->name,$config->GetValue('modify_member','groupattr'))) { - $add_href = sprintf('modify_member_form.php?server_id=%s&dn=%s&attr=%s', - $ldapserver->server_id,$encoded_dn,rawurlencode($attr)); - - printf('
(%s)
', - $add_href,sprintf('%s %s',_('Modify members for'),$dn),_('modify group members')); - } - } - - echo ''; - echo ''; - - if ($is_modified_attr) - echo ''; - - echo "\n"; - flush(); - -} /* End foreach ($attrs as $attr => $vals) */ - -if (! $ldapserver->isReadOnly()) - printf('
', - _('Save Changes')); -else - printf(''); ?> - - -
- - - -
- - - - - - - - diff --git a/htdocs/timeout.php b/htdocs/timeout.php index 5b9e440..73ba493 100644 --- a/htdocs/timeout.php +++ b/htdocs/timeout.php @@ -13,8 +13,10 @@ require './common.php'; -if (! isset($ldapserver)) +if (! isset($ldapserver)) { header("Location: index.php"); + die(); +} include './header.php'; @@ -30,7 +32,7 @@ $session_timeout = $ldapserver->session_timeout ? $ldapserver->session_timeout :


- +
diff --git a/htdocs/tree.php b/htdocs/tree.php deleted file mode 100644 index b75326c..0000000 --- a/htdocs/tree.php +++ /dev/null @@ -1,125 +0,0 @@ -_, so - * if I wanted to scroll to dc=example,dc=com for server 3, the URL would be: - * - * tree.php#3_dc%3Dexample%2Cdc%3Dcom - * - * @package phpLDAPadmin - * @author The phpLDAPadmin development team - */ -/** - */ - -require './common.php'; -no_expire_header(); - -# This allows us to display large sub-trees without running out of time. -@set_time_limit( 0 ); - -$recently_timed_out_servers = array(); -if (isset($_SESSION['activity']['rightframe_server_id'])) - $rightframe_server_id = $_SESSION['activity']['rightframe_server_id']; -$rightframerefresh = false; - -foreach ($ldapservers->GetServerList() as $server_id) { - $ldapserver = $ldapservers->Instance($server_id); - - # Test to see if we should log out the user due to the timeout. - if ($ldapserver->haveAuthInfo() && $ldapserver->auth_type != 'config') { - /* If time out value has been reached: - - log out user - - put $server_id in array of recently timed out servers */ - if (session_timed_out($ldapserver)) { - array_push($recently_timed_out_servers, $server_id); - - # If $ldapserver->server_id equal $rightframe_server_id load timeout page on right frame - if ($ldapserver->server_id == $rightframe_server_id) - $rightframerefresh = true; - - /* Otherwise calculate a new refresh value. If the timeout value is less than the previous - $meta_refresh_variable value set $meta_refresh_variable to $ldapserver->session_timeout */ - } else - $meta_refresh_variable = $ldapserver->session_timeout*60; - } -} - -include './header.php'; - -echo ''; - -if ($rightframerefresh) { -?> - - - - - - - -phpLDAPadmin - %s',pla_version()); - -echo "\n\n"; -echo ''; -echo ''; -printf('',_('Home')); -printf('',_('Home')); -printf('',_('Purge caches')); -printf('',_('Purge all cached data in phpLDAPadmin, including server schemas.'),_('Purge caches')); -echo ''; - -if (! $config->GetValue('appearance','hide_configuration_management')) { - printf('',_('light')); - printf('',get_href('add_rfe'),_('Request feature')); - printf('',_('bug')); - printf('',get_href('add_bug'),_('Report a bug')); - echo ''; - - printf('',_('Donate')); - printf('',get_href('donate'),_('Donate')); -} - -printf('',_('Help')); -printf('',_('Help')); -echo '
%s%s%s%s
%s%s%s%s
%s%s%s%s
'; - -echo "\n\n"; - -# We want the std tree function as a fallback -require LIBDIR.'tree_functions.php'; - -# Are we going to use the PLM tree? -if ($config->GetValue('appearance','tree_plm')) { - require JSDIR.'phplayersmenu/lib/PHPLIB.php'; - require JSDIR.'phplayersmenu/lib/layersmenu-common.inc.php'; - require JSDIR.'phplayersmenu/lib/treemenu.inc.php'; -} - -# For each of the configured servers -foreach( $ldapservers->GetServerList() as $server_id ) { - $ldapserver = $ldapservers->Instance($server_id); - - if ($ldapserver->isVisible()) { - $filename = get_custom_file($server_id,'tree_functions.php',LIBDIR); - require_once($filename); - - call_custom_function($server_id,'draw_server_tree'); - } -} - -echo ''; -?> diff --git a/htdocs/update.php b/htdocs/update.php index 3caacd0..3c522f9 100644 --- a/htdocs/update.php +++ b/htdocs/update.php @@ -1,11 +1,9 @@ server_id,$encoded_dn)); + header(sprintf('Location: cmd.php?cmd=template_engine&server_id=%s&dn=%s',$ldapserver->server_id,$entry['dn']['encode'])); die(); } if ($ldapserver->isReadOnly()) pla_error(_('You cannot perform updates while server is in read-only mode')); -if (! $ldapserver->haveAuthInfo()) - pla_error(_('Not enough information to login to server. Please check your configuration.')); -$update_array = isset($_POST['update_array']) ? $_POST['update_array'] : array(); -$skip_array = isset($_POST['skip_array']) ? $_POST['skip_array'] : array(); +$entry['update'] = get_request('update_array','POST',false,array()); +$entry['skip'] = get_request('skip_array','POST',false,array()); $failed_attrs = array(); -if (! is_array($update_array)) +if (! is_array($entry['update'])) pla_error(_('update_array is malformed. This might be a phpLDAPadmin bug. Please report it.')); -run_hook ('pre_update',array('server_id'=>$ldapserver->server_id,'dn'=>$dn,'update_array'=>$update_array)); +run_hook ('pre_update', + array('server_id'=>$ldapserver->server_id,'dn'=>$entry['dn']['string'],'update_array'=>$entry['update'])); # Check for delete attributes (indicated by the attribute entry appearing like this: attr => '' -foreach ($update_array as $attr => $val) - if (! is_array($val)) - if (array_key_exists($attr,$skip_array)) - unset($update_array[$attr]); +foreach ($entry['update'] as $attr => $val) { + if (! is_array($val)) { + if (array_key_exists($attr,$entry['skip'])) { + unset($entry['update'][$attr]); - elseif ($val == '') - $update_array[$attr] = array(); + } elseif ($val == '') { + $entry['update'][$attr] = array(); - # Skip change - else - $update_array[$attr] = $val; + if (! $_SESSION['plaConfig']->isCommandAvailable('attribute_delete')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('delete attribute'))); + } else { # Skip change + $entry['update'][$attr] = $val; - else - if (array_key_exists($attr,$skip_array)) - unset($update_array[$attr]); + if (! $_SESSION['plaConfig']->isCommandAvailable('attribute_add_value') + && ! $_SESSION['plaConfig']->isCommandAvailable('attribute_delete_value')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('modify attribute values'))); + } - else + } else { + if (array_key_exists($attr,$entry['skip'])) { + unset($entry['update'][$attr]); + + } else { foreach ($val as $i => $v) - $update_array[$attr][$i] = $v; + $entry['update'][$attr][$i] = $v; -/* Call the custom callback for each attribute modification - and verify that it should be modified.*/ -foreach ($update_array as $attr_name => $val) { + if (! $_SESSION['plaConfig']->isCommandAvailable('attribute_add_value') + && ! $_SESSION['plaConfig']->isCommandAvailable('attribute_delete_value')) + pla_error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('modify attribute values'))); + } + } +} + +# Call the custom callback for each attribute modification and verify that it should be modified. +foreach ($entry['update'] as $attr_name => $val) { # Check to see if this is a unique Attribute - if ($badattr = $ldapserver->checkUniqueAttr($dn,$attr_name,$val)) { - $search_href = sprintf('search.php?search=true&form=advanced&server_id=%s&filter=%s=%s', + if ($badattr = $ldapserver->checkUniqueAttr($entry['dn']['string'],$attr_name,$val)) { + $href['search'] = sprintf('cmd.php?cmd=search&search=true&form=advanced&server_id=%s&filter=%s=%s', $ldapserver->server_id,$attr_name,$badattr); pla_error(sprintf(_('Your attempt to add %s (%s) to
%s
is NOT allowed. That attribute/value belongs to another entry.

You might like to search for that entry.'), - $attr_name,$badattr,$dn,$search_href)); + $attr_name,$badattr,$entry['dn']['string'],$href['search'])); } if (run_hook('pre_attr_modify', - array('server_id'=>$ldapserver->server_id,'dn'=>$dn,'attr_name'=>$attr_name,'new_value'=>$val)) !== true) { + array('server_id'=>$ldapserver->server_id,'dn'=>$entry['dn']['string'],'attr_name'=>$attr_name,'new_value'=>$val)) !== true) { - unset($update_array[$attr_name]); + unset($entry['update'][$attr_name]); $failed_attrs[$attr_name] = $val; - } elseif ($ldapserver->isAttrReadOnly($attr)) + } elseif ($ldapserver->isAttrReadOnly($attr)) { pla_error(sprintf(_('The attribute "%s" is flagged as read-only in the phpLDAPadmin configuration.'), htmlspecialchars($attr_name))); + } else { + // binary values + if (isset($_SESSION['submitform'][$attr_name])) { + foreach ($val as $i => $v) { + if (isset($_SESSION['submitform'][$attr_name][$v])) { + foreach ($_SESSION['submitform'][$attr_name][$v] as $file) { + foreach ($file as $data) { + $entry['update'][$attr_name][$i] = $data; + } + } + } + } + } + } } # Perform the modification -$res = $ldapserver->modify($dn,$update_array); -if ($res) { +$result = $ldapserver->modify($entry['dn']['string'],$entry['update']); +if ($result) { # Fire the post modification event to the user's custom callback function. $mustRelogin = false; - foreach ($update_array as $attr_name => $val) { + foreach ($entry['update'] as $attr_name => $val) { run_hook('post_attr_modify', - array('server_id'=>$ldapserver->server_id,'dn'=>$dn,'attr_name'=>$attr_name,'new_value'=>$val)); + array('server_id'=>$ldapserver->server_id,'dn'=>$entry['dn']['string'],'attr_name'=>$attr_name,'new_value'=>$val)); /* Was this a user's password modification who is currently - logged in? If so, they need to logout and log back in - with the new password. */ + * logged in? If so, they need to logout and log back in + * with the new password. + */ if (0 === strcasecmp($attr_name,'userPassword') && in_array($ldapserver->auth_type,array('cookie','session')) && - pla_compare_dns($ldapserver->getLoggedInDN(),$dn) === 0) + pla_compare_dns($ldapserver->getLoggedInDN(),$entry['dn']['string']) === 0) $mustRelogin = true; } - run_hook ('post_update',array ('server_id' => $ldapserver->server_id,'dn' => $dn,'update_array' => $update_array)); + run_hook('post_update', + array('server_id'=>$ldapserver->server_id,'dn'=>$entry['dn']['string'],'update_array'=>$entry['update'])); # If the user password was changed, not tell the to relogin. if ($mustRelogin) { @@ -123,9 +148,6 @@ if ($res) { include './header.php'; echo ''; - echo ''."\n\n"; echo '
'; echo '

'; @@ -133,7 +155,7 @@ if ($res) { echo '

'; echo _('Since you changed your password, you must now login again with your new password.'); echo '
'; - printf('%s...',$ldapserver->server_id, _('Login')); + printf('%s...',$ldapserver->server_id, _('Login')); echo '
'; echo ''; echo ''; @@ -141,15 +163,16 @@ if ($res) { exit; } - $redirect_url = sprintf('template_engine.php?server_id=%s&dn=%s',$ldapserver->server_id,$encoded_dn); + $redirect_url = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s',$ldapserver->server_id,$entry['dn']['encode']); - foreach ($update_array as $attr => $junk) + foreach ($entry['update'] as $attr => $junk) $redirect_url .= "&modified_attrs[]=$attr"; foreach ($failed_attrs as $attr => $junk) $redirect_url .= "&failed_attrs[]=$attr"; header("Location: $redirect_url"); + die(); } else { pla_error(_('Could not perform ldap_modify operation.'),$ldapserver->error(),$ldapserver->errno()); diff --git a/htdocs/update_confirm.php b/htdocs/update_confirm.php index bbdc84a..891e6f0 100644 --- a/htdocs/update_confirm.php +++ b/htdocs/update_confirm.php @@ -1,5 +1,5 @@ isReadOnly()) pla_error(_('You cannot perform updates while server is in read-only mode')); -$dn = $_POST['dn']; -$old_values = $_POST['old_values']; -$new_values = $_POST['new_values']; -$encoded_dn = rawurlencode($dn); -$rdn = get_rdn($dn); +/***************/ +/* get entry */ +/***************/ + +$entry['dn']['string'] = get_request('dn'); +$entry['dn']['encode'] = rawurlencode($entry['dn']['string']); -echo ''; -printf('

%s

',htmlspecialchars($rdn)); -printf('

%s: %s     %s: %s

', - _('Server'),$ldapserver->name,_('Distinguished Name'),htmlspecialchars($dn)); -echo "\n\n"; +if (! $entry['dn']['string'] || ! $ldapserver->dnExists($entry['dn']['string'])) + pla_error(sprintf(_('The entry (%s) does not exist.'),htmlspecialchars($entry['dn']['string'])),null,-1,true); -run_hook('pre_update_array_processing',array('server_id'=>$ldapserver->server_id, - 'dn'=>$dn,'old_values'=>$old_values,'new_values'=>$new_values)); +$tree = get_cached_item($ldapserver->server_id,'tree'); +$entry['ldap'] = null; +if ($tree) { + $entry['ldap'] = $tree->getEntry($entry['dn']['string']); -$update_array = array(); -foreach ($old_values as $attr => $old_val) { - # Did the user delete the field? - if (! isset($new_values[$attr])) - $update_array[$attr] = ''; + if (! $entry['ldap']) + $tree->addEntry($entry['dn']['string']); - # Did the user change the field? - elseif ($old_val !== $new_values[$attr]) { - $new_val = $new_values[$attr]; + $entry['ldap'] = $tree->getEntry($entry['dn']['string']); +} - # Special case for userPassword attributes - if (strcasecmp($attr,'userPassword') == 0) { - foreach ($new_val as $key => $userpassword) { - if (trim($userpassword)) - $new_val[$key] = password_hash($userpassword,$_POST['enc_type'][$key]); - else - unset($new_val[$key]); +if (! $entry['ldap'] || $entry['ldap']->isReadOnly()) + pla_error(sprintf(_('The entry (%s) is in readonly mode.'),htmlspecialchars($entry['dn']['string'])),null,-1,true); + +/***************/ +/* old values */ +/***************/ + +$entry['values']['old'] = array(); +foreach ($entry['ldap']->getAttributes() as $old_attr) { + $name = $old_attr->getName(); + $entry['values']['old'][$name] = array(); + + foreach ($old_attr->getValues() as $old_val) { + if (strlen($old_val) > 0) + $entry['values']['old'][$name][] = $old_val; + } +} + +/***************/ +/* new values */ +/***************/ + +eval('$reader = new '.$_SESSION['plaConfig']->GetValue('appearance','entry_reader').'($ldapserver);'); +$entry['ldap']->accept($reader); + +$entry['values']['new'] = array(); +foreach ($entry['ldap']->getAttributes() as $new_attr) { + if ($new_attr->hasBeenModified()) { + $name = $new_attr->getName(); + + if (!isset($entry['values']['old'][$name])) + $entry['values']['old'][$name] = array(); + + $entry['values']['new'][$name] = array(); + + foreach ($new_attr->getValues() as $i => $new_val) { + if ($new_attr instanceof BinaryAttribute) { + $n = $new_attr->getFileName($i); + $p = $new_attr->getFilePath($i); + $new_val = md5("$n|$p"); } - $password_already_hashed = true; - - # Special case for samba password - } elseif (strcasecmp($attr,'sambaNTPassword') == 0 && trim($new_val[0])) { - $sambapassword = new smbHash; - $new_val[0] = $sambapassword->nthash($new_val[0]); - - # Special case for samba password - } elseif (strcasecmp($attr,'sambaLMPassword') == 0 && trim($new_val[0])) { - $sambapassword = new smbHash; - $new_val[0] = $sambapassword->lmhash($new_val[0]); - } - - # Retest in case our now encoded password is the same. - if ($new_val === $old_val) - continue; - - if ($new_val) - $update_array[$attr] = $new_val; - } -} - -# Check user password with new encoding. -if (isset($new_values['userpassword']) && is_array($new_values['userpassword'])) { - foreach ($new_values['userpassword'] as $key => $userpassword) { - if ($userpassword) { - if ($old_values['userpassword'][$key] == $new_values['userpassword'][$key] && - get_enc_type($old_values['userpassword'][$key]) == $_POST['enc_type'][$key]) - continue; - - $new_values['userpassword'][$key] = password_hash($userpassword,$_POST['enc_type'][$key]); + if (strlen($new_val) > 0) + $entry['values']['new'][$name][] = $new_val; } } - - if ($old_values['userpassword'] != $new_values['userpassword']) - $update_array['userpassword'] = $new_values['userpassword']; } -# strip empty vals from update_array and ensure consecutive indices for each attribute -foreach ($update_array as $attr => $val) { - if (is_array($val)) { - foreach($val as $i => $v) - if (null == $v || 0 == strlen($v)) - unset($update_array[$attr][$i]); +/************************/ +/* objectClass deletion */ +/************************/ - $update_array[$attr] = array_values($update_array[$attr]); +$oc_to_delete = array(); +$attr_to_delete = array(); + +// if objectClass attribute is modified +if (isset($entry['values']['new']['objectClass'])) { + if (!isset($entry['values']['old']['objectClass'])) { + pla_error(_('An entry should have one structural objectClass.')); + } + // deleted objectClasses + foreach ($entry['values']['old']['objectClass'] as $oldOC) { + if (!in_array($oldOC, $entry['values']['new']['objectClass'])) { + $oc_to_delete[] = $oldOC; + } + } + // search the attributes used by each deleted objecClass + // we must maybe delete these attributes + foreach ($oc_to_delete as $oc) { + $soc = $ldapserver->getSchemaObjectClass($oc); + if ($soc) { + $ocs = $ldapserver->SchemaObjectClasses(); + $ma = $soc->getMustAttrs($ocs); + foreach ($ma as $a) { + if (!isset($attr_to_delete[$a->getName()])) { + $attr_to_delete[$a->getName()] = $a; + } + } + $ma = $soc->getMayAttrs($ocs); + foreach ($ma as $a) { + if (!isset($attr_to_delete[$a->getName()])) { + $attr_to_delete[$a->getName()] = $a; + } + } + } + } + // if an attribute is still used by an objectClass we don't delete, + // we don't delete this attribute + foreach ($attr_to_delete as $name => $ad) { + $found = false; + $at = $ldapserver->getSchemaAttribute($name); + foreach ($at->getUsedInObjectClasses() as $oc) { + if (in_array($oc, $entry['values']['new']['objectClass'])) { + $found = true; + break; + } + } + if (!$found) { + foreach ($at->getRequiredByObjectClasses() as $oc) { + if (in_array($oc, $entry['values']['new']['objectClass'])) { + $found = true; + break; + } + } + } + if ($found) { + unset($attr_to_delete[$name]); + } else { + if (isset($entry['values']['old'][$name]) && (count($entry['values']['old'][$name]) > 0)) { + $found = true; + } else { + foreach ($entry['values']['new'] as $attr_name => $attr_values) { + if ($name == $attr_name) { + $found = true; + break; + } + } + } + if (!$found) { + unset($attr_to_delete[$name]); + } else { + $entry['values']['new'][$name] = array(); + $attr_to_delete[$name] = $name; + } + } } } -/* At this point, the update_array should look like this (example): - Array( - cn => Array( - [0] => 'Dave', - [1] => 'Bob') - sn => 'Smith', - telephoneNumber => '555-1234') - This array should be ready to be passed to ldap_modify() */ +/****************/ +/* update array */ +/****************/ -run_hook('post_update_array_processing',array('server_id'=>$ldapserver->server_id, - 'dn'=>$dn,'update_array'=>$update_array)); +eval('$writer = new '.$_SESSION['plaConfig']->GetValue('appearance','entry_writer').'($ldapserver);'); +$writer->draw('Title',$entry['ldap']); +$writer->draw('Subtitle',$entry['ldap']); -if (count($update_array) > 0) { +echo "\n\n"; + +run_hook('pre_update_array_processing', + array('server_id'=>$ldapserver->server_id,'dn'=>$entry['dn']['string'],'old_values'=>$entry['values']['old'],'new_values'=>$entry['values']['new'])); + +/***************/ +/* confirm */ +/***************/ + +if (count($entry['values']['new']) > 0) { echo '
'; echo '
'; echo _('Do you want to make these changes?'); @@ -122,44 +192,47 @@ if (count($update_array) > 0) { # echo "\n\n"; - echo '
'; + echo ''; + echo ''; echo "\n"; echo ''; echo "\n"; - printf('', + printf('', _('Attribute'),_('Old Value'),_('New Value'),_('Skip')); echo "\n\n"; $counter = 0; - run_hook('pre_display_update_array',array('server_id'=>$ldapserver->server_id,'dn'=>$dn, - 'update_array'=>$update_array)); - - foreach ($update_array as $attr => $new_val) { + $friendly_attrs = $_SESSION['plaConfig']->friendly_attrs; + foreach ($entry['values']['new'] as $attr => $new_val) { $counter++; - if (! array_key_exists($attr,$old_values) or ! array_key_exists($attr,$new_values)) - continue; - printf('',$counter%2 ? 'even' : 'odd'); - printf('',htmlspecialchars($attr)); + echo ''; echo ''; echo ''; - printf('',htmlspecialchars($attr)); + $input_disabled = ''; + if (in_array($attr, $attr_to_delete)) $input_disabled = 'disabled="disabled"'; + $input_onclick = ''; + if ($attr == 'objectClass' && (count($attr_to_delete) > 0)) { + $input_onclick = 'onclick="if (this.checked) {'; + foreach ($attr_to_delete as $ad_name) { + $input_onclick .= "document.forms[0].elements['skip_array[$ad_name]'].disabled = false;"; + $input_onclick .= "document.forms[0].elements['skip_array[$ad_name]'].checked = true;"; + } + $input_onclick .= '} else {'; + foreach ($attr_to_delete as $ad_name) { + $input_onclick .= "document.forms[0].elements['skip_array[$ad_name]'].checked = false;"; + $input_onclick .= "document.forms[0].elements['skip_array[$ad_name]'].disabled = true;"; + } + $input_onclick .= '}"'; + } + printf('',htmlspecialchars($attr),$input_disabled,$input_onclick); echo ''."\n\n"; } - run_hook('post_display_update_array',array('server_id'=>$ldapserver->server_id,'dn'=>$dn, - 'update_array'=>$update_array,'index'=>$counter)); - echo '
%s%s%s%s
%s%s%s%s
%s'; + $attr_display = isset($friendly_attrs[strtolower($attr)]) ? $friendly_attrs[strtolower($attr)] : $attr; + if (strcmp($attr,$attr_display) && $_SESSION['plaConfig']->isCommandAvailable('schema')) { + printf('%s',$attr,htmlspecialchars($attr_display)); + } else { + echo htmlspecialchars($attr_display); + } + echo ''; if (strcasecmp($attr,'userPassword') == 0) { - foreach ($old_values[$attr] as $key => $value) { - if (obfuscate_password_display(get_enc_type($old_values[$attr][$key]))) - echo preg_replace('/./','*',$old_values[$attr][$key]).'
'; + foreach ($entry['values']['old'][$attr] as $key => $value) { + if (obfuscate_password_display(get_enc_type($entry['values']['old'][$attr][$key]))) + echo preg_replace('/./','*',$entry['values']['old'][$attr][$key]).'
'; else - echo nl2br(htmlspecialchars($old_values[$attr][$key])).'
'; + echo nl2br(htmlspecialchars($entry['values']['old'][$attr][$key])).'
'; } - } elseif (is_array($old_values[$attr])) - foreach ($old_values[$attr] as $v) + } elseif (is_array($entry['values']['old'][$attr])) + foreach ($entry['values']['old'][$attr] as $v) echo nl2br(htmlspecialchars($v)).'
'; else - echo nl2br(htmlspecialchars($old_values[$attr])).'
'; + echo nl2br(htmlspecialchars($entry['values']['old'][$attr])).'
'; echo '
'; @@ -167,7 +240,7 @@ if (count($update_array) > 0) { # Is this a multi-valued attribute? if (is_array($new_val)) { if (strcasecmp($attr,'userPassword') == 0) { - foreach ($new_values[$attr] as $key => $value) { + foreach ($entry['values']['new'][$attr] as $key => $value) { if (isset($new_val[$key])) { if (obfuscate_password_display(get_enc_type($new_val[$key]))) echo preg_replace('/./','*',$new_val[$key]).'
'; @@ -179,51 +252,59 @@ if (count($update_array) > 0) { } else { foreach ($new_val as $i => $v) { - if ($v == '') { - # Remove it from the update array if it's empty - unset($update_array[$attr][$i]); - $update_array[$attr] = array_values($update_array[$attr]); - - } else { echo nl2br(htmlspecialchars($v)).'
'; - } } } - /* was this a multi-valued attribute deletion? If so, - fix the $update_array to reflect that per update_confirm.php's - expectations */ - if ($update_array[$attr] == array(0=>'') || $update_array[$attr] == array()) { - $update_array[$attr] = ''; + if (! $new_val) { printf('%s',_('[attribute deleted]')); } - } elseif ($new_val != '') + } elseif ($new_val == '') printf('%s',_('[attribute deleted]')); echo '
'; echo ''; echo ''; echo '
'; printf('',$ldapserver->server_id); - printf('',$dn); + printf('',$entry['dn']['string']); - foreach ($update_array as $attr => $val) { - if (is_array($val)) - foreach($val as $i => $v) - printf('', - htmlspecialchars($attr),$i,htmlspecialchars($v)); - else - printf('', - htmlspecialchars($attr),htmlspecialchars($val)); + foreach ($entry['values']['new'] as $attr => $val) { + if (count($val) > 0) { + if (is_array($val)) { + foreach($val as $i => $v) + printf('', + htmlspecialchars($attr),$i,htmlspecialchars($v)); + } else { + printf('', + htmlspecialchars($attr),htmlspecialchars($val)); + } + } else { + printf('', + htmlspecialchars($attr)); + } } printf('',_('Commit')); @@ -234,15 +315,39 @@ if (count($update_array) > 0) { echo '
'; echo '
'; + + if (count($attr_to_delete) > 0) { + echo '

'; + echo _('The deletion of objectClass(es)'); + echo _(':'); + echo ' '; + echo implode(', ', $oc_to_delete); + echo '
'; + echo _('will delete the attribute(s)'); + echo _(':'); + echo ' '; + $i = 0; + foreach ($attr_to_delete as $attr) { + if ($i++ != 0) echo ', '; + $attr_display = isset($friendly_attrs[strtolower($attr)]) ? $friendly_attrs[strtolower($attr)] : $attr; + if (strcmp($attr,$attr_display) && $_SESSION['plaConfig']->isCommandAvailable('schema')) { + printf('%s',$attr,htmlspecialchars($attr_display)); + } else { + echo htmlspecialchars($attr_display); + } + } + echo '
'; + } + echo '
'; } else { echo '
'; echo _('You made no changes'); - printf(' %s.', - $ldapserver->server_id,$encoded_dn,_('Go back')); + $href = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s', + $ldapserver->server_id,$entry['dn']['encode']); + + printf(' %s.',htmlspecialchars($href),_('Go back')); echo '
'; } - -echo ''; ?> diff --git a/htdocs/view_jpeg_photo.php b/htdocs/view_jpeg_photo.php index bafccb0..acdb826 100644 --- a/htdocs/view_jpeg_photo.php +++ b/htdocs/view_jpeg_photo.php @@ -1,5 +1,5 @@ GetValue('jpeg','tmpdir'),$file); -if (! file_exists($file)) - pla_error(sprintf('%s %s',_('No such file: '),htmlspecialchars($_GET['file']))); +$file['name'] = basename(addcslashes($file['name'],'/\\')); +$file['name'] = sprintf('%s/%s',$_SESSION['plaConfig']->GetValue('jpeg','tmpdir'),$file['name']); +if (! file_exists($file['name'])) + pla_error(sprintf('%s%s %s',_('No such file'),_(':'),htmlspecialchars($file['name']))); -$f = fopen($file,'r'); -$jpeg = fread($f,filesize($file)); -fclose($f); +$file['handle'] = fopen($file['name'],'r'); +$file['data'] = fread($file['handle'],filesize($file['name'])); +fclose($file['handle']); + +if (ob_get_level()) + ob_clean(); Header('Content-type: image/jpeg'); Header('Content-disposition: inline; filename=jpeg_photo.jpg'); -echo $jpeg; +echo $file['data']; ?> diff --git a/htdocs/welcome.php b/htdocs/welcome.php index 6540a2f..7282000 100644 --- a/htdocs/welcome.php +++ b/htdocs/welcome.php @@ -1,38 +1,47 @@ '; +echo '

'; + +printf('%s', + _('phpLDAPadmin logo'), + _('phpLDAPadmin logo')); + +echo '

'; +echo _('Use the menu to the left to navigate'); +echo '

'; + +$links = ''; + +if ($_SESSION['plaConfig']->isCommandAvailable('external_links')) { + if ($_SESSION['plaConfig']->isCommandAvailable('external_links', 'credits')) { + $links .= sprintf('%s',get_href('credits'),_('Credits')); + } + + if ($_SESSION['plaConfig']->isCommandAvailable('external_links', 'help')) { + if ($links) $links .= ' | '; + $links .= sprintf('%s',get_href('documentation'),_('Documentation')); + } + + if ($_SESSION['plaConfig']->isCommandAvailable('external_links', 'donation')) { + if ($links) $links .= ' | '; + $links .= sprintf('%s',get_href('donate'),_('Donate')); + } +} + +if ($links) { + echo $links; + echo '

'; +} + +echo ''; ?> - - -
-
-
-
-<?php echo _('phpLDAPadmin logo'); ?> -
-
- -
-
-
-
- -GetValue('appearance','hide_configuration_management')) { ?> - | - | - - - -
- - diff --git a/index.php b/index.php index a76f01d..3e836dd 100644 --- a/index.php +++ b/index.php @@ -1,4 +1,5 @@ diff --git a/lib/AJAXTree.php b/lib/AJAXTree.php new file mode 100644 index 0000000..b4a2e8c --- /dev/null +++ b/lib/AJAXTree.php @@ -0,0 +1,375 @@ +" + * @param $first_child is this the first child ? + * @param $last_child is this the last child ? + */ + protected function draw_dn($dn,$level=0,$first_child=true,$last_child=true) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s,%s)',33,__FILE__,__LINE__,__METHOD__,$dn,$level); + + $ldapserver = $this->getLdapServer(); + + # level pre-treatment + $code = ''; + if (is_string($level)) { + for ($i=0; $i 0) { + $code = '0' * $level; + } + $level = strlen($code); + + # get entry to display as node + $entry = $this->getEntry($dn); + if (! $entry) { + $this->addEntry($dn); + $entry = $this->getEntry($dn); + } + + if (! $entry) + return ''; + + # some informations + $rdn = $entry->getRdn(); + $encoded_dn = rawurlencode($dn); + $formatted_dn = $this->get_formatted_dn($entry,$level-1); + $child_count = $this->get_children_number($entry); + + $nb = 0; + if ($first_child) $nb += 1; + if ($last_child) $nb += 2; + + # informations array[$nb] + # nb == 1 => the node is the first child + # nb == 2 => the node is the last child + # nb == 3 => the node is the unique child + # nb == 0 => the node is a child + $expand_imgs = array('js/phplayersmenu/menuimages/tree_expand.png', 'js/phplayersmenu/menuimages/tree_expand.png', 'js/phplayersmenu/menuimages/tree_expand_corner.png', ($level > 0) ? 'js/phplayersmenu/menuimages/tree_expand_corner.png' : 'js/phplayersmenu/menuimages/tree_expand_corner_first.png'); + $collapse_imgs = array('js/phplayersmenu/menuimages/tree_collapse.png', 'js/phplayersmenu/menuimages/tree_collapse.png', 'js/phplayersmenu/menuimages/tree_collapse_corner.png', ($level > 0) ? 'js/phplayersmenu/menuimages/tree_collapse_corner.png' : 'js/phplayersmenu/menuimages/tree_collapse_corner_first.png'); + $tree_imgs = array('js/phplayersmenu/menuimages/tree_split.png', 'js/phplayersmenu/menuimages/tree_split.png', 'js/phplayersmenu/menuimages/tree_corner.png', 'js/phplayersmenu/menuimages/tree_corner.png'); + $new_code = array('1', '1', '0', '0'); + + # links + $edit_href_params = htmlspecialchars(sprintf('cmd=template_engine&server_id=%s&dn=%s',$this->server_id,$encoded_dn)); + $edit_href = "cmd.php?$edit_href_params"; + $openclose_params = htmlspecialchars(sprintf('server_id=%s&dn=%s&code=%s',$this->server_id,$encoded_dn,$code.$new_code[$nb])); + + # each node has a unique id based on dn + $node_id = 'node'.base64_encode($ldapserver->server_id.'-'.$dn); + $node_id = str_replace('=','_',$node_id); + + if ($level == 0) + printf('',$this->getDepth()+3-1); + + printf('
',$node_id); + echo $this->get_indentation($code); + + if ($entry->isOpened()) { + if (! $child_count) { + echo '--'; + } else { + echo ''; + echo '+-'; + echo ''; + } + + } else { + if (($child_count !== false) && (!$child_count)/* && (!$ldapserver->isShowCreateEnabled())*/) { + echo '--'; + } else { + echo ''; + echo '+-'; + echo ''; + } + } + + echo ''; + echo '->'; + echo ''; + echo ' '; + echo ''; + echo $formatted_dn; + echo ($child_count ? ' ('.$child_count.')' : ''); + echo ''; + echo '
'; + echo '
'; + if ($entry->isOpened()) { + $this->draw_children($entry,$code.$new_code[$nb]); + } + echo '
'; + + if ($level == 0) { + echo ''; + } + } + + public function draw_children($parent_entry,$code) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s,%s)',33,__FILE__,__LINE__,__METHOD__,$parent_entry,$code); + + $children = array(); + foreach($parent_entry->getChildren() as $childDn) + $children[] = $this->getEntry($childDn); + + $first_child = $this->get_plm_before_first_child($parent_entry,$code); + $last_child = $this->get_plm_after_last_child($parent_entry,$code); + + echo $first_child; + + for ($i=0; $idraw_dn($children[$i]->getDn(),$code,$first,$last); + } + + echo $last_child; + } + + /** + * return the indentation bafore a node + * @param $code a string of 0 and 1 ; $code == "000101" will return " | |" + */ + protected function get_indentation($code) { + $indent = ''; + for ($i=0; $i + '; + } + + protected function get_plm_before_first_child($entry,$level) { + if (strlen($level) == 0) return ''; + + $ldapserver = $this->getLdapServer(); + $output = ''; + + if (!$ldapserver->isReadOnly() && ($entry->getChildrenNumber() > 10) && ($ldapserver->isShowCreateEnabled())) { + $encoded_dn = rawurlencode($entry->getDn()); + $href = sprintf('cmd.php?cmd=template_engine&server_id=%s&container=%s',$ldapserver->server_id,$encoded_dn); + + $output .= $this->get_indentation($level); + $output .= '--'; + $output .= ''; + $output .= '->'; + $output .= ''; + $output .= ' '; + $output .= ''; + $output .= _('Create new entry here'); + $output .= ''; + } + + return $output; + } + + protected function get_plm_after_last_child($entry,$level) { + if (strlen($level) == 0) return ''; + + $ldapserver = $this->getLdapServer(); + $output = ''; + + if (!$ldapserver->isReadOnly() && !$entry->isLeaf() && $ldapserver->isShowCreateEnabled()) { + $encoded_dn = rawurlencode($entry->getDn()); + $href = sprintf('cmd.php?cmd=template_engine&server_id=%s&container=%s',$ldapserver->server_id,$encoded_dn); + + $output .= $this->get_indentation($level); + $output .= '--'; + $output .= ''; + $output .= '->'; + $output .= ''; + $output .= ' '; + $output .= ''; + $output .= _('Create new entry here'); + $output .= ''; + } + + return $output; + } +} +?> diff --git a/lib/Attribute.php b/lib/Attribute.php new file mode 100644 index 0000000..6907e1d --- /dev/null +++ b/lib/Attribute.php @@ -0,0 +1,280 @@ +name = $name; + + if (is_string($values) && (strlen($values) > 0)) $this->values = array($values); + elseif (is_array($values)) $this->values = $values; + else $this->values = array(); + + $this->min_value_count = -1; + $this->max_value_count = -1; + + $this->entry = null; + $this->internal = false; + $this->modified = false; + $this->visible = true; + $this->readonly = false; + + $this->friendly_name = ''; + $this->description = ''; + $this->icon = ''; + $this->hint = ''; + + $this->size = 0; + $this->maxlength = 0; + + $this->properties = array(); + } + + public function getName() { + return $this->name; + } + + public function getValues() { + return $this->values; + } + + public function getValueCount() { + return count($this->values); + } + + public function addValue($new_val, $i = -1) { + if ($i < 0) $i = $this->getValueCount(); + $old_val = $this->getValue($i); + if (is_null($old_val) || ($old_val != $new_val)) $this->justModified(); + $this->values[$i] = $new_val; + } + + public function getValue($i) { + if (isset($this->values[$i])) return ''.$this->values[$i]; + else return null; + } + + public function getMinValueCount() { + return $this->min_value_count; + } + + public function setMinValueCount($min) { + $this->min_value_count = $min; + } + + public function getMaxValueCount() { + return $this->max_value_count; + } + + public function setMaxValueCount($max) { + $this->max_value_count = $max; + } + + public function getEntry() { + return $this->entry; + } + + public function setEntry($entry) { + $this->entry = $entry; + + global $ldapserver; + $schema_attr = null; + if ($entry) { + $schema_attr = $ldapserver->getSchemaAttribute($this->getName(), $entry->getDn()); + } + if ($schema_attr && $schema_attr->getIsSingleValue()) { + $this->setMaxValueCount(1); + } + } + + public function justModified() { + $this->modified = true; + } + + public function hasBeenModified() { + return $this->modified; + } + + public function isInternal() { + return $this->internal; + } + + public function setInternal() { + $this->internal = true; + } + + public function isRequired() { + if ($this->getMinValueCount() > 0) { + return true; + } elseif ($this->isRdn()) { + return true; + } else { + return false; + } + } + + public function setRequired() { + if ($this->getMinValueCount() <= 0) { + $this->setMinValueCount(1); + } + } + + public function setOptional() { + $this->setMinValueCount(0); + } + + public function isReadOnly() { + return $this->readonly; + } + + public function setReadOnly() { + $this->readonly = true; + } + + public function isVisible() { + return $this->visible; + } + + public function hide() { + $this->visible = false; + } + + public function show() { + $this->visible = true; + } + + public function setFriendlyName($name) { + if ($name != $this->name) { + $this->friendly_name = $name; + } + } + + public function getFriendlyName() { + $friendly_attrs = $_SESSION['plaConfig']->friendly_attrs; + $name = real_attr_name($this->name); + + if ($this->friendly_name) { + return $this->friendly_name; + } elseif (isset($friendly_attrs[$name])) { + return $friendly_attrs[$name]; + } elseif (isset($friendly_attrs[strtolower($name)])) { + return $friendly_attrs[strtolower($name)]; + } else { + return $name; + } + } + + public function setDescription($description) { + $this->description = $description; + } + + public function getDescription() { + return $this->description; + } + + public function setIcon($icon) { + $this->icon = $icon; + } + + public function getIcon() { + return $this->icon; + } + + public function getHint() { + return $this->hint; + } + + public function setHint($hint) { + $this->hint = $hint; + } + + public function getMaxLength() { + return $this->maxlength; + } + + public function setMaxLength($maxlength) { + $this->maxlength = $maxlength; + } + + public function getSize() { + return $this->size; + } + + public function setSize($size) { + $this->size = $size; + } + + public function setProperty($name, $value) { + $this->properties[$name] = $value; + } + + public function delProperty($name) { + if ($this->hasProperty($name)) unset($this->properties[$name]); + } + + public function hasProperty($name) { + return isset($this->properties[$name]); + } + + public function getProperty($name) { + if ($this->hasProperty($name)) return $this->properties[$name]; + else return null; + } + + public function isRdn() { + if ($this->entry) { + //$rdn = get_rdn($this->entry->getDn()); + //$attr = $this->name; + //return preg_match("/^${attr}=/", $rdn); + return ($this->name == $this->entry->getRdnAttributeName()); + } else { + return false; + } + } + + /** + * Visit the attribute + */ + public function accept($visitor) { + $visitor->visit('', $this); + } +} +?> diff --git a/lib/AttributeFactory.php b/lib/AttributeFactory.php new file mode 100644 index 0000000..8498fb0 --- /dev/null +++ b/lib/AttributeFactory.php @@ -0,0 +1,104 @@ +newObjectClassAttribute($name,$values); + + } elseif ($ldapserver->isJpegPhoto($name)) { + return $this->newJpegAttribute($name,$values); + + } else if ($ldapserver->isAttrBinary($name)) { + return $this->newBinaryAttribute($name,$values); + + } else if (! strcasecmp($name,'userPassword')) { + return $this->newPasswordAttribute($name,$values); + + } else if (! strcasecmp($name,'sambaLMPassword') || ! strcasecmp($name,'sambaNTPassword')) { + return $this->newSambaPasswordAttribute($name,$values); + + } elseif (in_array_ignore_case($name,array_keys($_SESSION['plaConfig']->GetValue('appearance','date_attrs')))) { + return $this->newDateAttribute($name,$values); + + } elseif (in_array(strtolower($name),array('shadowlastchange','shadowmin', + 'shadowmax','shadowexpire','shadowwarning','shadowinactive'))) { + return $this->newShadowAttribute($name,$values); + + } elseif ($ldapserver->isAttrBoolean($name)) { + $attribute = $this->newSelectionAttribute($name,$values); + $attribute->addOption('TRUE',_('true')); + $attribute->addOption('FALSE',_('false')); + return $attribute; + + } elseif ($ldapserver->isDNAttr($name)) { + return $this->newDnAttribute($name,$values); + + } elseif ($ldapserver->isMultiLineAttr($name)) { + return $this->newMultiLineAttribute($name,$values); + + } elseif (! strcasecmp($name,'gidNumber')) { + return $this->newGidAttribute($name,$values); + + } else { + return new Attribute($name,$values); + } + } + + public function newJpegAttribute($name,$values) { + return new JpegAttribute($name,$values); + } + + public function newBinaryAttribute($name,$values) { + return new BinaryAttribute($name,$values); + } + + public function newPasswordAttribute($name,$values) { + return new PasswordAttribute($name,$values); + } + + public function newSambaPasswordAttribute($name,$values) { + return new SambaPasswordAttribute($name,$values); + } + + public function newRandomPasswordAttribute($name,$values) { + return new RandomPasswordAttribute($name,$values); + } + + public function newShadowAttribute($name,$values) { + return new ShadowAttribute($name,$values); + } + + public function newSelectionAttribute($name,$values) { + return new SelectionAttribute($name,$values); + } + + public function newMultiLineAttribute($name,$values) { + return new MultiLineAttribute($name,$values); + } + + public function newDateAttribute($name,$values) { + return new DateAttribute($name,$values); + } + + public function newObjectClassAttribute($name,$values) { + return new ObjectClassAttribute($name,$values); + } + + public function newDnAttribute($name,$values) { + return new DnAttribute($name,$values); + } + + public function newGidAttribute($name,$values) { + return new GidAttribute($name,$values); + } +} +?> diff --git a/lib/BinaryAttribute.php b/lib/BinaryAttribute.php new file mode 100644 index 0000000..1aa138c --- /dev/null +++ b/lib/BinaryAttribute.php @@ -0,0 +1,55 @@ +filepaths = array(); + $this->filenames = array(); + } + + public function getFileNames() { + return $this->filenames; + } + + public function getFileName($i) { + if (isset($this->filenames[$i])) return $this->filenames[$i]; + else return null; + } + + public function addFileName($name, $i = -1) { + if ($i < 0) { + $this->filenames[] = $name; + } else { + $this->filenames[$i] = $name; + } + } + + public function getFilePaths() { + return $this->filepaths; + } + + public function getFilePath($i) { + if (isset($this->filepaths[$i])) return $this->filepaths[$i]; + else return null; + } + + public function addFilePath($path, $i = -1) { + if ($i < 0) { + $this->filepaths[] = $path; + } else { + $this->filepaths[$i] = $path; + } + } +} +?> diff --git a/lib/DateAttribute.php b/lib/DateAttribute.php new file mode 100644 index 0000000..ab74ab8 --- /dev/null +++ b/lib/DateAttribute.php @@ -0,0 +1,12 @@ + diff --git a/lib/DefaultCreatingEntry.php b/lib/DefaultCreatingEntry.php new file mode 100644 index 0000000..a318a48 --- /dev/null +++ b/lib/DefaultCreatingEntry.php @@ -0,0 +1,210 @@ +objectClasses = array(); + $this->mustattrs = array(); + $this->mayattrs = array(); + $this->container = ''; + $this->rdn = null; + } + + public function addObjectClass($objectClass) { + global $ldapserver; + + if (!$objectClass || in_array($objectClass,$this->objectClasses)) return; + + $this->objectClasses[] = $objectClass; + + /* add the required and optional attributes of the objectclass */ + + $schema_oclass = $ldapserver->getSchemaObjectClass($objectClass); + assert($schema_oclass); + + // get the required attributes + $schema_oclasses = $ldapserver->SchemaObjectClasses(); + $schema_attrs = $schema_oclass->getMustAttrs($schema_oclasses); + if (!$schema_attrs) $schema_attrs = array(); + elseif (!is_array($schema_attrs)) $schema_attrs = array($schema_attrs); + + // for each required attribute + foreach ($schema_attrs as $schema_attr) { + $attr_name = $schema_attr->getName(); + + if (isset($this->mustattrs[$attr_name])) { + $this->mustattrs[$attr_name][] = $objectClass; + continue; + } + + if (isset($this->mayattrs[$attr_name])) { + unset($this->mayattrs[$attr_name]); + $this->mustattrs[$attr_name] = array($objectClass); + continue; + } + + // get attribute aliases + $aliases = ($schema_attr = $ldapserver->getSchemaAttribute($attr_name)) ? $schema_attr->aliases : null; + if (!$aliases) $aliases = array(); + if (!is_array($aliases)) $aliases = array($aliases); + + // check if we doesn't already add the alias + $found = false; + foreach ($aliases as $alias) { + if (isset($this->mustattrs[$alias])) { + $this->mustattrs[$alias][] = $objectClass; + $found = true; + break; + } elseif (isset($this->mayattrs[$alias])) { + unset($this->mayattrs[$alias]); + $this->mustattrs[$alias] = array($objectClass); + $found = true; + break; + } + } + if ($found) continue; + + $this->mustattrs[$attr_name] = array($objectClass); + } + + // get the optional attributes + $schema_attrs = $schema_oclass->getMayAttrs($schema_oclasses); + if (!$schema_attrs) $schema_attrs = array(); + elseif (!is_array($schema_attrs)) $schema_attrs = array($schema_attrs); + + // for each optional attribute + foreach ($schema_attrs as $schema_attr) { + $attr_name = $schema_attr->getName(); + + if (isset($this->mustattrs[$attr_name])) { + continue; + } + if (isset($this->mayattrs[$attr_name])) { + $this->mayattrs[$attr_name][] = $objectClass; + continue; + } + + // get attribute aliases + $aliases = ($schema_attr = $ldapserver->getSchemaAttribute($attr_name)) ? $schema_attr->aliases : null; + if (!$aliases) $aliases = array(); + if (!is_array($aliases)) $aliases = array($aliases); + + // check if we doesn't already add the alias + $found = false; + foreach ($aliases as $alias) { + if (isset($this->mustattrs[$alias])) { + $found = true; + break; + } elseif (isset($this->mayattrs[$alias])) { + $this->mayattrs[$alias][] = $objectClass; + $found = true; + break; + } + } + if ($found) continue; + + $this->mayattrs[$attr_name] = array($objectClass); + } + } + + public function setContainer($dn) { + $this->container = $dn; + } + + public function getContainer() { + return $this->container; + } + + public function setRdnAttributeName($attribute_name) { + $this->rdn = null; + if (!$attribute_name) return; + + $attrs = $this->getAttributes(); + foreach ($attrs as $attr) { + if ($attr->getName() == $attribute_name) { + $this->rdn = $attr; + return; + } + } + } + + public function getRdnAttributeName() { + $attr = $this->getRdnAttribute(); + if ($attr) return $attr->getName(); + else return ''; + } + + public function getRdnAttribute() { + return $this->rdn; + } + + public function getDn() { + if (!$this->container || !$this->rdn) return ''; + $vals = $this->rdn->getValues(); + $val = ($vals && $vals[0]) ? $vals[0] : ''; + if (strlen($val) <= 0) return ''; + return $this->rdn->getName()."=$val,".$this->container; + } + + public function getAttributes() { + global $ldapserver; + + # we can use a static variable if there is only one instance of this class + static $attrs = null; + + if (DEBUG_ENABLED) debug_log('%s[%s]::getAttributes()',1,get_class($this),$this->getDn()); + + if (! $attrs) { + $attrs = array(); + + $attributefactoryclass = $_SESSION['plaConfig']->GetValue('appearance','attribute_factory'); + eval('$attribute_factory = new '.$attributefactoryclass.'();'); + + if ($this->objectClasses) { + $attribute = $attribute_factory->newAttribute('objectClass',$this->objectClasses); + $attribute->setEntry($this); + $attribute->setRequired(); + $attribute->hide(); + $attrs[] = $attribute; + } + + foreach ($this->mustattrs as $attr_name => $objectclasses) { + if ($attr_name == 'objectClass') continue; + + $attribute = $attribute_factory->newAttribute($attr_name,null); + $attribute->setEntry($this); + $attribute->setRequired(); + $attrs[] = $attribute; + } + + foreach ($this->mayattrs as $attr_name => $objectclasses) { + if ($attr_name == 'objectClass') continue; + + $attribute = $attribute_factory->newAttribute($attr_name,null); + $attribute->setEntry($this); + $attrs[] = $attribute; + } + + usort($attrs,'attrcmp'); # Sort optional attributes + } + + return $attrs; + } +} + +?> diff --git a/lib/DefaultEditingEntry.php b/lib/DefaultEditingEntry.php new file mode 100644 index 0000000..b0e8261 --- /dev/null +++ b/lib/DefaultEditingEntry.php @@ -0,0 +1,90 @@ +getDn(); + + if (DEBUG_ENABLED) debug_log('%s[%s]::getAttributes()',1,get_class($this),$dn); + + if (! isset($attrs[$dn])) { + $attrs[$dn] = array(); + + $attributefactoryclass = $_SESSION['plaConfig']->GetValue('appearance','attribute_factory'); + eval('$attribute_factory = new '.$attributefactoryclass.'();'); + + $int_attrs_vals = $ldapserver->getDNSysAttrs($this->getDn()); + if (!$int_attrs_vals) $int_attrs_vals = array(); + elseif (!is_array($int_attrs_vals)) $int_attrs_vals = array($int_attrs_vals); + + $attrs_vals = $ldapserver->getDNAttrs($this->getDn(),false,$_SESSION['plaConfig']->GetValue('deref','view')); + if (! $attrs_vals) $attrs_vals = array(); + elseif (! is_array($attrs_vals)) $attrs_vals = array($attrs_vals); + + $attrs_vals = array_merge($attrs_vals, $int_attrs_vals); + uksort($attrs_vals,'sortAttrs'); # Sort these entries + + $objectclasses = null; + + foreach ($attrs_vals as $attr => $vals) { + $attribute = $attribute_factory->newAttribute($attr,$vals); + $attribute->setEntry($this); + + if (isset($int_attrs_vals[$attr])) { + $attribute->setInternal(); + $attribute->setReadOnly(); + } + + if ($attr == 'objectClass') $objectclasses = $attribute->getValues(); + + if ($this->isReadOnly() || $ldapserver->isAttrReadOnly($attr)) { + $attribute->setReadOnly(); + } + if ($ldapserver->isAttrHidden($attr)/* || ! strcasecmp($attr,'dn')*/) { + $attribute->hide(); + } + + $attrs[$dn][] = $attribute; + } + + if ($objectclasses) { + $schema_oclasses = $ldapserver->SchemaObjectClasses(); + foreach ($objectclasses as $oclass) { + $schema_oclass = $ldapserver->getSchemaObjectClass($oclass); + assert($schema_oclass); + + $mustattrs = $schema_oclass->getMustAttrs($schema_oclasses); + if (!$mustattrs) $mustattrs = array(); + if (!is_array($mustattrs)) $mustattrs = array($mustattrs); + + foreach ($mustattrs as $mustattr) { + foreach ($attrs[$dn] as $attr) { + if ($attr->getName() == $mustattr->getName()) { + $attr->setRequired(); + break; + } + } + } + } + } + } + + return $attrs[$dn]; + } +} + +?> diff --git a/lib/DefaultEntryFactory.php b/lib/DefaultEntryFactory.php new file mode 100644 index 0000000..0228e5d --- /dev/null +++ b/lib/DefaultEntryFactory.php @@ -0,0 +1,19 @@ + diff --git a/lib/DnAttribute.php b/lib/DnAttribute.php new file mode 100644 index 0000000..8ec3c18 --- /dev/null +++ b/lib/DnAttribute.php @@ -0,0 +1,12 @@ + diff --git a/lib/Entry.php b/lib/Entry.php new file mode 100644 index 0000000..892d1ce --- /dev/null +++ b/lib/Entry.php @@ -0,0 +1,289 @@ +dn = $dn; + $this->leaf = false; + $this->open = false; + $this->children = array(); + $this->reading_children = false; + $this->size_limited = true; + $this->readonly = false; + $this->icon = ''; + $this->properties = array(); + } + + public function getDn() { + return $this->dn; + } + + public function getRdn() { + return get_rdn($this->getDn(), 0, true); + } + + public function getRdnAttributeName() { + $attr = ''; + if ($this->dn) { + $i = strpos($this->dn, '='); + if ($i !== false) $attr = substr($this->dn, 0, $i); + } + return $attr; + } + + public function setTree($tree) { + $this->tree = $tree; + } + + private function readChildren($nolimit=false) { + if (DEBUG_ENABLED) + debug_log('Entered with ()',1,__FILE__,__LINE__,__METHOD__); + + $ldapserver = ($this->tree ? $this->tree->getLdapServer() : null); + if (DEBUG_ENABLED) + debug_log('LdapServer (%s)',1,__FILE__,__LINE__,__METHOD__, $ldapserver ? $ldapserver->server_id : -1); + + $ldap['child_limit'] = $nolimit ? 0 : $_SESSION['plaConfig']->GetValue('search','size_limit'); + $ldap['filter'] = $_SESSION['plaConfig']->GetValue('appearance','tree_filter'); + $ldap['deref'] = $_SESSION['plaConfig']->GetValue('deref','view'); + $ldap['children'] = $ldapserver->getContainerContents($this->getDn(),$ldap['child_limit'],$ldap['filter'],$ldap['deref']); + + if (DEBUG_ENABLED) + debug_log('Children of (%s) are (%s)',64,__FILE__,__LINE__,__METHOD__,$this->getDn(),$ldap['children']); + + if ($this->tree) { + $this->reading_children = true; + foreach ($ldap['children'] as $dn) { + if (DEBUG_ENABLED) + debug_log('Adding (%s)',64,__FILE__,__LINE__,__METHOD__,$dn); + + if (! $this->tree->getEntry($dn)) + $this->tree->addEntry($dn); + } + usort($this->children,'pla_compare_dns'); + $this->reading_children = false; + } + if (count($this->children) == $ldap['child_limit']) + $this->size_limited = true; + else + $this->size_limited = false; + + if (DEBUG_ENABLED) + debug_log('Entered with (), Returning ()',1,__FILE__,__LINE__,__METHOD__); + } + + /** + * Returns null if the children have never be defined + * or an array of the dn of the children + */ + public function getChildren() { + if (! $this->children) + $this->readChildren(); + + return $this->children; + } + + public function getChildrenNumber() { + if (! $this->children) + $this->readChildren(); + + if ($this->children) + return count($this->children); + else + return 0; + } + + /** + * Called by Tree::addEntry() only + */ + public function addChild($dn) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$dn); + + if (! $this->children) { + if (DEBUG_ENABLED) + debug_log('this->children is FALSE',64,__FILE__,__LINE__,__METHOD__); + + if (! $this->reading_children) { + if (DEBUG_ENABLED) + debug_log('this->reading_children is FALSE',64,__FILE__,__LINE__,__METHOD__,$dn); + + $this->readChildren(); + }else { + $this->children = array(); + } + } + + $index = array_search($dn,$this->children); + if (DEBUG_ENABLED) + debug_log('array_search of (%s) in (%s) returned (%s)',64,__FILE__,__LINE__,__METHOD__,$dn,$this->children,$index); + + if ($index === false) { + $this->children[] = $dn; + if (! $this->reading_children) usort($this->children,'pla_compare_dns'); + } + + if (DEBUG_ENABLED) + debug_log('Entered with (%s), Leaving ()',1,__FILE__,__LINE__,__METHOD__,$dn); + } + + /** + * Called by Tree::delEntry() only + */ + public function delChild($dn) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$dn); + + if ($this->children) { + # If the parent hasnt been opened in the tree, then there wont be any children. + $index = array_search($dn,$this->children); + if ($index !== false) unset($this->children[$index]); + } + } + + public function rename($newDn) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$newDn); + $this->dn = $newDn; + } + + public function isOpened() { + return $this->open; + } + + public function close() { + if (DEBUG_ENABLED) + debug_log('Entered with ()',1,__FILE__,__LINE__,__METHOD__); + + $this->open = false; + } + + /** + * Opens the node ; the children of the node must have been defined + */ + public function open() { + if (DEBUG_ENABLED) + debug_log('Entered with ()',1,__FILE__,__LINE__,__METHOD__); + + $this->open = true; + + if ($this->isSizeLimited()) { + $this->readChildren(true); + } + } + + public function setLeaf($is_leaf) { + $this->leaf = $is_leaf; + } + + public function isLeaf() { + return $this->leaf; + } + + public function isReadOnly() { + return $this->readonly; + } + + public function setReadOnly() { + $this->readonly = true; + } + + public function setReadWrite() { + $this->readonly = false; + } + + /** + * Returns the path of the icon file used to represent this node ; + * returns the result of get_icon() function + */ + public function getIcon($ldapserver) { + if ($this->icon) return $this->icon; + else return get_icon($ldapserver,$this->dn); + } + + public function isSizeLimited() { + return $this->size_limited; + } + + public function setProperty($name, $value) { + $this->properties[$name] = $value; + } + + public function delProperty($name) { + if ($this->hasProperty($name)) unset($this->properties[$name]); + } + + public function hasProperty($name) { + return isset($this->properties[$name]); + } + + public function getProperty($name) { + if ($this->hasProperty($name)) return $this->properties[$name]; + else return null; + } + + /** + * Visit the entry and its attributes + * + * The visitor must implement these methods : + * - visitStart($entry) + * - visitEnd($entry) + * where is the entry class name. + */ + public function accept($visitor) { + $visitor->visit('Start', $this); + $attrs = $this->getAttributes(); + foreach ($attrs as $attribute) { + $attribute->accept($visitor); + } + $visitor->visit('End', $this); + } + + public function getAttribute($name) { + foreach ($this->getAttributes() as $attr) { + if ($attr->getName() == $name) return $attr; + } + return null; + } + + /** + * Return an array of Attribute objects + */ + abstract public function getAttributes(); +} +?> diff --git a/lib/EntryFactory.php b/lib/EntryFactory.php new file mode 100644 index 0000000..6fa7306 --- /dev/null +++ b/lib/EntryFactory.php @@ -0,0 +1,24 @@ +dnExists($dn)) { + return $this->newEditingEntry($dn); + } else { + return $this->newCreatingEntry($dn); + } + } + + abstract public function newEditingEntry($dn); + abstract public function newCreatingEntry($dn); +} +?> diff --git a/lib/EntryReader.php b/lib/EntryReader.php new file mode 100644 index 0000000..de3e649 --- /dev/null +++ b/lib/EntryReader.php @@ -0,0 +1,395 @@ +ldapserver = $ldapserver; + $this->context = 0; + } + + /**************************/ + /* Visit an Entry */ + /**************************/ + + public function visitEntryStart($entry) { + if (DEBUG_ENABLED) debug_log('%s::visitEntryStart(%s)',1,get_class($this),$entry->getDn()); + } + + public function visitEntryEnd($entry) { + if (DEBUG_ENABLED) debug_log('%s::visitEntryEnd(%s)',1,get_class($this),$entry->getDn()); + } + + /**************************/ + /* Visit a EditingEntry */ + /**************************/ + + public function visitDefaultEditingEntryStart($entry) { + if (DEBUG_ENABLED) debug_log('%s::visitDefaultEditingEntryStart()',1,get_class($this)); + + $this->context = ENTRY_READER_EDITING_CONTEXT; + $this->visit('Entry::Start', $entry); + } + + public function visitTemplateEditingEntryStart($entry) { + if (DEBUG_ENABLED) debug_log('%s::visitTemplateEditingEntryStart()',1,get_class($this)); + + $this->visit('DefaultEditingEntry::Start', $entry); + + if (isset($_REQUEST['template'])) { + $entry->setSelectedTemplateName(trim($_REQUEST['template'])); + } elseif (($entry->getTemplatesCount() == 1) && !$entry->hasDefaultTemplate()) { + $templates = &$entry->getTemplates(); + $template_names = array_keys($templates); + $entry->setSelectedTemplateName($template_names[0]); + } + } + + /**************************/ + /* Visit a CreatingEntry */ + /**************************/ + + public function visitDefaultCreatingEntryStart($entry) { + if (DEBUG_ENABLED) debug_log('%s::visitDefaultCreatingEntryStart()',1,get_class($this)); + + $this->context = ENTRY_READER_CREATION_CONTEXT; + $this->visit('Entry::Start', $entry); + + if (isset($_POST['new_values']['objectClass'])) { + $ocs = $_POST['new_values']['objectClass']; + if (is_string($ocs) && (strlen($ocs) > 0)) $ocs = array($ocs); + elseif (!$ocs) $ocs = array(); + + foreach ($ocs as $oc) $entry->addObjectClass(trim($oc)); + } + + if (isset($_REQUEST['container'])) { + $entry->setContainer(trim($_REQUEST['container'])); + } + } + + public function visitTemplateCreatingEntryStart($entry) { + if (DEBUG_ENABLED) debug_log('%s::visitTemplateCreatingEntryStart()',1,get_class($this)); + + $this->visit('DefaultCreatingEntry::Start', $entry); + + if (isset($_REQUEST['template'])) { + $entry->setSelectedTemplateName(trim($_REQUEST['template'])); + } elseif (($entry->getTemplatesCount() == 1) && !$entry->hasDefaultTemplate()) { + $templates = &$entry->getTemplates(); + $template_names = array_keys($templates); + $entry->setSelectedTemplateName($template_names[0]); + } + } + + /**************************/ + /* Visit an Attribute */ + /**************************/ + + public function visitAttribute($attribute) { + if (DEBUG_ENABLED) debug_log('%s::visitAttribute(%s)',1,get_class($this),$attribute->getName()); + + $name = $attribute->getName(); + // @todo editing objectclasses + if (($this->context == ENTRY_READER_CREATION_CONTEXT) && ($name == 'objectClass')) return; + + $old_vals = $this->get('OldValues', $attribute); + $new_vals = $this->get('NewValues', $attribute); + + if (isset($_POST['old_values'][$name])) { + $post_old_vals = $_POST['old_values'][$name]; + if (is_string($post_old_vals) && (strlen($post_old_vals) > 0)) $post_old_vals = array($post_old_vals); + elseif (!$post_old_vals) $post_old_vals = array(); + + // delete last empty values + for ($i = count($post_old_vals)-1; $i >= 0; $i--) { + if (! strlen($post_old_vals[$i])) unset($post_old_vals[$i]); + else break; + } + + // attribute modified by someone else ? + if (count($old_vals) != count($post_old_vals)) { + $attribute->justModified(); + } else { + foreach ($post_old_vals as $i => $old_val) { + if (!isset($old_vals[$i]) || ($old_vals[$i] != $old_val)) { + $attribute->justModified(); + break; + } + } + } + } + + foreach ($new_vals as $i => $new_val) { + //$new_val = trim($new_val); // no trim if binary value + + // if the attribute has not been already modified by a post of a previous page + if (!$attribute->hasBeenModified()) { + // if the value has changed (added or modified/deleted) + if ((!isset($old_vals[$i]) && (strlen($new_val) > 0)) || (isset($old_vals[$i]) && ($old_vals[$i] != $new_val))) { + $new_val = $this->get('PostValue', $attribute, $i, $new_val); + } + } + + if ((!isset($old_vals[$i]) && (strlen($new_val) > 0)) || (isset($old_vals[$i]) && ($old_vals[$i] != $new_val))) { + $attribute->justModified(); + $attribute->addValue($new_val, $i); + } + } + + // old value deletion + //if (($this->context == ENTRY_READER_EDITING_CONTEXT) && !$attribute->isInternal()) { + if (isset($_POST['old_values'][$name]) && !$attribute->isInternal()) { + for ($i = count($new_vals); $i < count($old_vals); $i++) { + $attribute->addValue('', $i); + } + } + + // modified attributes + $modified_attrs = isset($_REQUEST['modified_attrs']) ? $_REQUEST['modified_attrs'] : false; + if (is_array($modified_attrs) && in_array($name, $modified_attrs)) { + $attribute->justModified(); + } + } + + public function getAttributeOldValues($attribute) { + $old_vals = $attribute->getValues(); + return $old_vals; + } + + public function getAttributeNewValues($attribute) { + $name = $attribute->getName(); + + $new_vals = isset($_POST['new_values'][$name]) ? $_POST['new_values'][$name] : null; + if (is_string($new_vals) && (strlen($new_vals) > 0)) $new_vals = array($new_vals); + elseif (!$new_vals) $new_vals = array(); + + $i = count($new_vals) - 1; + $j = $attribute->getValueCount(); + while (($i >= 0) && ($i >= $j) && !$new_vals[$i]) { + if ($i > $j) unset($new_vals[$i]); + $i--; + } + + return $new_vals; + } + + public function getAttributeRequestValue($attribute, $i, $val, $request) { + if ($request == $attribute->getName()) return $val; + + $val = null; + $entry = $attribute->getEntry(); + $request_attribute = ($entry ? $entry->getAttribute($request) : null); + + if ($request_attribute) { + $val = $request_attribute->getValue($i); + } elseif (isset($_REQUEST[$request][$attribute->getName()][$i])) { + $val = $_REQUEST[$request][$attribute->getName()][$i]; + } + + if (is_null($val)) { + pla_error(sprintf(_('Your template is missing variable (%s)'), $request)); + } + + return $val; + } + + public function getAttributePostValue($attribute, $i, $val) { + if (!$attribute->hasProperty('post')) return trim($val); + + if (preg_match('/^=php\.(\w+)\((.*)\)$/', $attribute->getProperty('post'), $matches)) { + switch ($matches[1]) { + case 'Password' : + preg_match_all('/%(\w+)(\|.+)?(\/[lU])?%/U',$matches[2],$matchall); + //if (!isset($_POST['enc_type'][$i]) || !$_POST['enc_type'][$i]) { + // pla_error(sprintf(_('Your template is missing variable (%s)'),'enc_type')); + //} + //$enc = $_POST['enc_type'][$i]; //$_REQUEST[$matchall[1][0]]; + $enc = $this->get('RequestValue', $attribute, $i, $val, $matchall[1][0]); + $password = $val; //$_REQUEST['form'][$matchall[1][1]]; + if ($password) { + $val = password_hash($password, $enc); + } + break; + case 'SambaPassword' : + $matchall = explode(',',$matches[2]); + //$attr = preg_replace('/%/','',$matchall[1]); + + # If we have no password, then dont hash nothing! + if (strlen($val) <= 0) //if (! trim($_REQUEST['form'][$attr])) + break; + + $sambapassword = new smbHash; + + switch ($matchall[0]) { + case 'LM' : $val = $sambapassword->lmhash($val); break; + case 'NT' : $val = $sambapassword->nthash($val); break; + default : $val = ''; + } + break; + case 'Join' : + preg_match_all('/%(\w+)(\|.+)?(\/[lU])?%/U',$matches[2],$matchall); + $matchattrs = explode(',',$matches[2]); + $char = $matchattrs[0]; + + $values = array(); + foreach ($matchall[1] as $joinattr) { + //$joinattribute = null; + //if ($attribute->getEntry()) { + // $joinattribute = $attribute->getEntry()->getAttribute($joinattr); + //} + //if ($joinattribute) { + // $values = array_merge($values, $joinattribute->getValues()); + //} else { + // pla_error(sprintf(_('Your template is missing variable (%s)'),$joinattr)); + //} + $values[] = $this->get('RequestValue', $attribute, $i, $val, $joinattr); + } + + $val = implode($char, $values); + break; + default : + if (function_exists($matches[1])) { + $val = call_user_func($matches[1], $matches[2], $attribute, $i, $val); + } else { + pla_error(sprintf(_('Your template has an unknown post function (%s).'), $matches[1])); + } + } + } + + return $val; + } + + /*******************************/ + /* Visit a BinaryAttribute */ + /*******************************/ + + public function getBinaryAttributeOldValues($attribute) { + $old_vals = array(); + return $old_vals; + } + + /** + * If there is binary post data, save them in + * $_SESSION['submitform'][$attribute_name][$key][$file_name][$file_path] + * with key = md5("$file_name|$file_path") + * + * return binary values + */ + public function getBinaryAttributeNewValues($attribute) { + $name = $attribute->getName(); + $new_vals = $this->get('Attribute::NewValues', $attribute); + + $i = 0; + $vals = array(); + foreach ($new_vals as $new_val) { + if (isset($_SESSION['submitform'][$name][$new_val])) { + $bin = ''; + foreach ($_SESSION['submitform'][$name][$new_val] as $filename => $file) { + $attribute->addFileName($filename, $i); + foreach ($file as $filepath => $binaries) { + $attribute->addFilePath($filepath, $i); + //$attribute->addValue($binaries, $i); + $bin = $binaries; + } + } + $vals[] = $bin; //$new_val; + $i++; + } + } + + $new_files = isset($_FILES['new_values']['name'][$name]) ? $_FILES['new_values']['name'][$name] : null; + if (!$new_files) $new_files = array(); + elseif (!is_array($new_files)) $new_files = array($new_files); + + foreach ($new_files as $j => $file_name) { + $file_path = $_FILES['new_values']['tmp_name'][$name][$j]; + if (is_uploaded_file($file_path)) { + $f = fopen($file_path, 'r'); + $binary_data = fread($f, filesize($file_path)); + fclose($f); + + $attribute->addFileName($file_name, $i); + $attribute->addFilePath($file_path, $i); + + $key = md5("$file_name|$file_path"); + $_SESSION['submitform'][$name][$key][$file_name][$file_path] = $binary_data; + $vals[] = $binary_data; //$key; + $i++; + } + } + + return $vals; + } + + public function getBinaryAttributePostValue($attribute, $i, $val) { + return $val; + } + + /*********************************/ + /* Visit a PasswordAttribute */ + /*********************************/ + + public function getPasswordAttributePostValue($attribute, $i, $val) { + $name = $attribute->getName(); + + if ($attribute->hasProperty('verify') && $attribute->getProperty('verify')) { + $verif_val = isset($_POST['new_values_verify'][$name][$i]) ? $_POST['new_values_verify'][$name][$i] : null; + if (!$verif_val || ($verif_val != $val)) { + system_message(array( + 'title'=>_('Checking passwords'), + 'body'=>_('You have specified two different passwords'), + 'type'=>'error')); + return $attribute->getValue($i); + } + } + + if ($attribute->hasProperty('post')) { + $val = $this->get('Attribute::PostValue', $attribute, $i, $val); + } elseif (strlen($val) > 0) { + $val = password_hash($val, get_default_hash($this->ldapserver->server_id)); + } + return $val; + } + + public function getSambaPasswordAttributePostValue($attribute, $i, $val) { + $name = $attribute->getName(); + + if ($attribute->hasProperty('verify') && $attribute->getProperty('verify')) { + $verif_val = isset($_POST['new_values_verify'][$name][$i]) ? $_POST['new_values_verify'][$name][$i] : null; + if (!$verif_val || ($verif_val != $val)) { + system_message(array( + 'title'=>_('Checking passwords'), + 'body'=>_('You have specified two different passwords'), + 'type'=>'error')); + return $attribute->getValue($i); + } + } + + if ($attribute->hasProperty('post')) { + $val = $this->get('Attribute::PostValue', $attribute, $i, $val); + } elseif (strlen($val) > 0) { + $sambapassword = new smbHash; + + if ($name == 'sambaLMPassword') + $val = $sambapassword->lmhash($val); + elseif ($name == 'sambaNTPassword') + $val = $sambapassword->nthash($val); + } + return $val; + } +} + +?> diff --git a/lib/EntryWriter.php b/lib/EntryWriter.php new file mode 100644 index 0000000..1666341 --- /dev/null +++ b/lib/EntryWriter.php @@ -0,0 +1,100 @@ +ldapserver = $ldapserver; + $this->visit_attributes = true; + $this->context = 0; + } + + /**************************/ + /* Paint an Entry */ + /**************************/ + + public function visitEntryStart($entry) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$entry->getDn()); + + // init + $this->init('Visit', $entry); + } + + public function visitEntryEnd($entry) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$entry->getDn()); + } + + protected function initEntryVisit($entry) { + $this->internal_attributes = array(); + $this->shown_attributes = array(); + $this->hidden_attributes = array(); + } + + /********************************/ + /* Paint a DefaultCreatingEntry */ + /********************************/ + + protected function initDefaultCreatingEntryVisit($entry) { + $this->context = ENTRY_WRITER_CREATION_CONTEXT; + $this->init('Entry::Visit', $entry); + } + + /*******************************/ + /* Paint a DefaultEditingEntry */ + /*******************************/ + + protected function initDefaultEditingEntryVisit($entry) { + $this->context = ENTRY_WRITER_EDITING_CONTEXT; + $this->init('Entry::Visit', $entry); + } + + /*********************************/ + /* Paint a TemplateCreatingEntry */ + /*********************************/ + + /********************************/ + /* Paint a TemplateEditingEntry */ + /********************************/ + + /**************************/ + /* Paint an Attribute */ + /**************************/ + + public function visitAttribute($attribute) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s,%s)',1,__FILE__,__LINE__,__METHOD__,$attribute->getName(),$this->visit_attributes); + + if (!$this->visit_attributes) return; + + if ($attribute->isInternal()) $this->internal_attributes[] = $attribute; + elseif ($attribute->isVisible()) $this->shown_attributes[] = $attribute; + else $this->hidden_attributes[] = $attribute; + } +} + +?> diff --git a/lib/EntryWriter1.php b/lib/EntryWriter1.php new file mode 100644 index 0000000..511822f --- /dev/null +++ b/lib/EntryWriter1.php @@ -0,0 +1,2648 @@ +draw('Title', $entry); + $this->draw('Subtitle', $entry); + echo "\n"; + + // menu + $this->draw('Menu', $entry); + } + + protected function drawEntryTitle($entry) {} + protected function drawEntrySubtitle($entry) {} + protected function drawEntryMenu($entry) {} + + protected function drawEntryJavascript($entry) { + if (isset($_SESSION['plaConfig'])) { + echo ''; + } + + echo ''; + + echo ''; + + echo ''; + + echo ''; + + for ($i = 0; $i < count($this->shown_attributes); $i++) { + $this->draw('Javascript', $this->shown_attributes[$i]); + } + + echo ''; + } + + /********************************/ + /* Paint a DefaultCreatingEntry */ + /********************************/ + + public function visitDefaultCreatingEntryStart($entry) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$entry->getDn()); + + // init + $this->visit('Entry::Start', $entry); + + // check + $container = $entry->getContainer(); + $container_ok = true; + $objectclasses_ok = true; + + if ($this->step != 1) { + if (!$container || !$this->ldapserver->dnExists($container)) { + $container_ok = false; + $this->step = 1; + } + if (!$entry->getAttributes()) { + $objectclasses_ok = false; + $this->step = 1; + } + } + + // header + $this->draw('Header', $entry); + + // errors + if (!$container_ok) { + pla_error(sprintf(_('The container you specified (%s) does not exist.'),htmlspecialchars($container)), null, -1, false); + echo '
'; + } + + if (!$objectclasses_ok) { + pla_error(_('You did not select any objectClasses for this object.'), null, -1, false); + echo '
'; + } + } + + public function visitDefaultCreatingEntryEnd($entry) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$entry->getDn()); + + $this->draw('StepTitle', $entry, $this->step); + $this->draw('StepFormStart', $entry, $this->step); + $this->draw('StepForm', $entry, $this->step); + $this->draw('StepFormEnd', $entry, $this->step); + } + + protected function initDefaultCreatingEntryVisit($entry) { + parent::initDefaultCreatingEntryVisit($entry); + + $this->step = 1; + $step = get_request('step','REQUEST'); + if ($step) $this->step = $step; + } + + protected function drawDefaultCreatingEntryTitle($entry) { + printf('

%s

',_('Create Object')); + } + + protected function drawDefaultCreatingEntrySubtitle($entry) { + printf('

%s%s %s

', + _('Server'),_(':'),$this->ldapserver->name); + } + + protected function drawDefaultCreatingEntryStepTitle($entry, $step) { + if ($step == 1) { + echo '

'; + printf(_('Step %s of %s'), '1', '2'); + echo _(':'); + echo ' '; + echo _('Container and ObjectClass(es)'); + echo '

'; + } else { + echo '

'; + printf(_('Step %s of %s'), '2', '2'); + echo _(':'); + echo ' '; + echo _('Specify attributes and values'); + echo '

'; + } + } + + public function drawDefaultCreatingEntryStepFormStart($entry, $step) { + if ($step == 1) { + echo '
'; + } else { + echo ''; + } + } + + public function drawDefaultCreatingEntryStepForm($entry, $step) { + $container = $entry->getContainer(); + + if ($step == 1) { + printf('', $this->ldapserver->server_id); + printf('', $step + 1); + echo ''; + + $this->draw('ContainerChooser', $entry, $container); + $this->draw('ObjectClassChooser', $entry); + $this->draw('StepFormSubmitButton', $entry, $step); + + echo '
'; + } else { + printf('', htmlspecialchars($container)); + printf('', $this->ldapserver->server_id); + printf('', $step + 1); + echo ''; + + $this->draw('RdnChooser', $entry); + $this->draw('ShownAttributes', $entry); + $this->draw('StepFormSubmitButton', $entry, $step); + + echo '
'; + + $this->draw('HiddenAttributes', $entry); + } + } + + public function drawDefaultCreatingEntryStepFormSubmitButton($entry, $step) { + if ($step == 1) { + echo ' '; + printf('', _('Proceed >>')); + echo ''; + + } else { + echo '
'; + printf('', _('Create Object')); + echo '
'; + } + } + + public function drawDefaultCreatingEntryStepFormEnd($entry, $step) { + echo '
'; + + // javascript + $this->draw('Javascript', $entry); + } + + protected function drawDefaultCreatingEntryContainerChooser($entry, $default_container) { + echo ''; + printf('%s', _('Container')); + printf('', htmlspecialchars($default_container)); + draw_chooser_link('entry_form.container'); + echo ''; + echo ''; + } + + protected function drawDefaultCreatingEntryObjectClassChooser($entry) { + $oclasses = $this->ldapserver->SchemaObjectClasses(); + if (!$oclasses) $oclasses = array(); + elseif (!is_array($oclasses)) $oclasses = array($oclasses); + + echo ''; + printf('%s', _('ObjectClasses')); + echo ''; + echo ''; + echo ''; + + if ($_SESSION['plaConfig']->GetValue('appearance', 'show_hints')) { + echo ' Hint'; + echo _('Hint: You must choose exactly one structural objectClass (shown in bold above)'); + echo '
'; + } + } + + protected function drawDefaultCreatingEntryRdnChooser($entry) { + $attrs = $entry->getAttributes(); + $rdn_attr = $entry->getRdnAttribute(); + + printf('%s', 'RDN'); + echo ''; + } + + protected function drawDefaultCreatingEntryShownAttributes($entry) { + $attrs = array(); + + // put required attributes first + foreach ($this->shown_attributes as $sa) { + if ($sa->isRequired()) $attrs[] = $sa; + } + foreach ($this->shown_attributes as $sa) { + if (!$sa->isRequired()) $attrs[] = $sa; + } + + $has_required_attrs = false; + $has_optional_attrs = false; + foreach ($attrs as $attr) { + if ($attr->isRequired()) { + if (!$has_required_attrs) { + printf('%s', _('Required Attributes')); + $has_required_attrs = true; + } + + } else { + if (!$has_optional_attrs) { + if (!$has_required_attrs) { + printf('%s', _('Required Attributes')); + printf('
(%s)
', _('none')); + } + printf('%s', _('Optional Attributes')); + $has_optional_attrs = true; + } + } + + $this->draw('', $attr); + echo "\n"; + } + + if (!$has_optional_attrs) { + printf('%s', _('Optional Attributes')); + printf('
(%s)
', _('none')); + } + } + + protected function drawDefaultCreatingEntryHiddenAttributes($entry) { + foreach ($this->hidden_attributes as $attr) { + $this->draw('', $attr); + echo "\n"; + } + } + + protected function drawDefaultCreatingEntryJavascript($entry) { + $this->draw('Entry::Javascript', $entry); + } + + /*******************************/ + /* Paint a DefaultEditingEntry */ + /*******************************/ + + public function visitDefaultEditingEntryStart($entry) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$entry->getDn()); + + // init + $this->visit('Entry::Start', $entry); + + // header + $this->draw('Header', $entry); + + // form start + if (! $entry->isReadOnly()) { + echo '
'; + printf('',$this->ldapserver->server_id); + printf('',htmlspecialchars($entry->getDn())); + } + + echo '
'."\n\n"; + echo ''; + } + + public function visitDefaultEditingEntryEnd($entry) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$entry->getDn()); + + // draw internal attributes + if (get_request('show_internal_attrs','REQUEST')) { + $this->draw('InternalAttributes', $entry); + echo "\n\n"; + } + + // draw visible attributes + $this->draw('ShownAttributes', $entry); + + // form end + if (! $entry->isReadOnly()) { + $this->draw('FormSubmitButton', $entry); + echo '
'; + + // draw hidden attributes + $this->draw('HiddenAttributes', $entry); + + printf('
'); + + } else { + printf(''); + } + + // javascript + $this->draw('Javascript', $entry); + } + + protected function initDefaultEditingEntryVisit($entry) { + parent::initDefaultEditingEntryVisit($entry); + + $this->url_base = sprintf('cmd.php?server_id=%s&dn=%s', $this->ldapserver->server_id, rawurlencode($entry->getDn())); + $this->hint_layout = ''._('Hint').'%s'; + $this->action_layout = '%s%s'; + } + + protected function drawDefaultEditingEntryTitle($entry) { + $dn = $entry->getDn(); + $rdn = get_rdn($dn); + + printf('

%s

',htmlspecialchars($rdn)); + } + + protected function drawDefaultEditingEntrySubtitle($entry) { + echo '

'; + echo _('Server'); + echo _(':'); + echo ' '; + echo $this->ldapserver->name; + echo '     '; + echo _('Distinguished Name'); + echo _(':'); + echo ' '; + echo htmlspecialchars($entry->getDn()); + echo '

'; + } + + protected function drawDefaultEditingEntryMenu($entry) { + $i = 0; + $item = ''; + + echo ''; + echo ''; + $menuitem_number = 0; + + while (($item = $this->get('MenuItem', $entry, $i)) !== false) { + if ($item) { + $endofrow = 0; + $it = ''; // menu item + $ms = ''; // item message + + if (is_array($item)) { + if (count($item) > 0) { + $it = $item[0]; + if (count($item) > 1) $ms = $item[1]; + } + } else { + $it = $item; + } + + if ($it) { + $menuitem_number++; + echo $it; + + if ($ms) { + if (($menuitem_number % 2) == 1) { + $menuitem_number++; + echo ''; + $endofrow = 0; + } + if ($endofrow) + print $ms; + else + echo "$ms"; + echo ""; + $endofrow = 1; + + } else { + if ($menuitem_number > 1 && ($menuitem_number % 2) == 0) { + echo ''; + $endofrow = 1; + } + } + + } elseif ($ms) { + if (($menuitem_number % 2) == 1) { + $menuitem_number++; + echo ''; + $endofrow = 0; + } + + if ($endofrow) + print $ms; + else + echo "$ms"; + echo ""; + $endofrow = 1; + } + } + $i++; + } + + if (($menuitem_number % 2) == 1) echo ''; + else echo ''; + echo ''; + echo '
  
  
      
'; + } + + protected function getDefaultEditingEntryMenuItem($entry, $i) { + $config = $_SESSION['plaConfig']; + + switch ($i) { + case IdEntryRefreshMenuItem : + if ($config->isCommandAvailable('entry_refresh')) + return $this->get('RefreshMenuItem', $entry); + else return ''; + + case IdEntryExportBaseMenuItem : + if ($config->isCommandAvailable('export')) + return $this->get('ExportBaseMenuItem', $entry); + else return ''; + + case IdEntryMoveMenuItem : + if (!$entry->isReadOnly() && $config->isCommandAvailable('entry_move')) + return $this->get('MoveMenuItem', $entry); + else return ''; + + case IdEntryInternalAttributesMenuItem : + if ($config->isCommandAvailable('entry_internal_attributes_show')) + return $this->get('InternalAttributesMenuItem', $entry); + else return ''; + + case IdEntryDeleteMenuItem : + if (!$entry->isReadOnly() && $config->isCommandAvailable('entry_delete', 'simple_delete')) + return $this->get('DeleteMenuItem', $entry); + else return ''; + + case IdEntryRenameMenuItem : + if (!$entry->isReadOnly() && $config->isCommandAvailable('entry_rename')) { + $rdnAttr = $entry->getAttribute($entry->getRdnAttributeName()); + if ($rdnAttr && $rdnAttr->isVisible() && !$rdnAttr->isReadOnly()) { + return $this->get('RenameMenuItem', $entry); + } else { + return ''; + } + } else return ''; + + case IdEntryDeleteAttributeMessage : + if ($config->GetValue('appearance', 'show_hints') + && $config->isCommandAvailable('attribute_delete')) + return array('', $this->get('DeleteAttributeMessage', $entry)); + else return ''; + + case IdEntryCompareMenuItem : + if (!$entry->isReadOnly() && $config->isCommandAvailable('entry_compare')) + return $this->get('CompareMenuItem', $entry); + else return ''; + + case IdEntryCreateMenuItem : + if (!$entry->isReadOnly() && !$entry->isLeaf() + && $config->isCommandAvailable('entry_create')) + return $this->get('CreateMenuItem', $entry); + else return ''; + + case IdEntryAddAttributeMenuItem : + if (!$entry->isReadOnly() && $config->isCommandAvailable('attribute_add')) + return $this->get('AddAttributeMenuItem', $entry); + else return ''; + + case IdEntryShowChildrenMenuItem : + case IdEntryExportSubMenuItem : + static $children_count = false; + static $more_children = false; + if ($children_count === false) { + // visible children in the tree + $children_count = $entry->getChildrenNumber(); + // is there filtered children ? + $more_children = $entry->isSizeLimited(); + if (!$more_children) { + // all children in ldap + $all_children = $this->ldapserver->getContainerContents( + $entry->getDn(), $children_count + 1, + '(objectClass=*)', $config->GetValue('deref','view')); + $more_children = (count($all_children) > $children_count); + } + } + + if ($children_count > 0 || $more_children) { + if ($children_count <= 0) $children_count = ''; + if ($more_children) $children_count .= '+'; + + if ($i == IdEntryShowChildrenMenuItem) { + return $this->get('ShowChildrenMenuItem', $entry, $children_count); + } elseif ($i == IdEntryExportSubMenuItem && $config->isCommandAvailable('export')) { + return $this->get('ExportSubMenuItem', $entry); + } else { + return ''; + } + } else { + return ''; + } + + case IdEntryViewSchemaMessage : + if ($config->GetValue('appearance', 'show_hints') && $config->isCommandAvailable('schema')) + return array('', $this->get('ViewSchemaMessage', $entry)); + else return ''; + + case IdEntryReadOnlyMessage : + if ($entry->isReadOnly()) + return array('', $this->get('ReadOnlyMessage', $entry)); + else return ''; + + case IdEntryModifiedAttributesMessage : + $modified_attrs = array(); + foreach ($entry->getAttributes() as $attr) { + if ($attr->hasBeenModified()) + $modified_attrs[] = $attr->getFriendlyName(); + } + if ($modified_attrs) { + return array('', $this->get('ModifiedAttributesMessage', $entry, $modified_attrs)); + } else return ''; + + default : + return false; + } + } + + protected function getDefaultEditingEntryRefreshMenuItem($entry) { + $href = $this->url_base.'&cmd=template_engine&junk='.random_junk(); + + return sprintf($this->action_layout,'refresh.png',_('Refresh'), + htmlspecialchars($href),_('Refresh this entry'),_('Refresh')); + } + + protected function getDefaultEditingEntryExportBaseMenuItem($entry) { + $href = $this->url_base.'&cmd=export_form&scope=base'; + + return sprintf($this->action_layout,'save.png',_('Save'), + htmlspecialchars($href),_('Save a dump of this object'),_('Export')); + } + + protected function getDefaultEditingEntryMoveMenuItem($entry) { + $href = $this->url_base.'&cmd=copy_form'; + + return sprintf($this->action_layout,'cut.png',_('Cut'),htmlspecialchars($href), + _('Copy this object to another location,a new DN, or another server'), + _('Copy or move this entry')); + } + + protected function getDefaultEditingEntryInternalAttributesMenuItem($entry) { + if (get_request('show_internal_attrs','REQUEST')) { + $href = $this->url_base.'&cmd=template_engine&junk='.random_junk(); + + return sprintf($this->action_layout,'tools-no.png',_('Hide'), + htmlspecialchars($href),'',_('Hide internal attributes')); + + } else { + $href = $this->url_base.'&cmd=template_engine&show_internal_attrs=true'; + + return sprintf($this->action_layout,'tools.png',_('Show'), + htmlspecialchars($href),'',_('Show internal attributes')); + } + } + + protected function getDefaultEditingEntryDeleteMenuItem($entry) { + $href = $this->url_base.'&cmd=delete_form'; + + return sprintf($this->action_layout,'trash.png',_('Trash'),htmlspecialchars($href), + _('You will be prompted to confirm this decision'),_('Delete this entry')); + } + + protected function getDefaultEditingEntryRenameMenuItem($entry) { + $href = $this->url_base.'&cmd=rename_form'; + + return sprintf($this->action_layout,'rename.png',_('Rename'),htmlspecialchars($href),'',_('Rename')); + } + + protected function getDefaultEditingEntryCompareMenuItem($entry) { + $href = $this->url_base.'&cmd=compare_form'; + + return sprintf($this->action_layout,'compare.png',_('Compare'), + htmlspecialchars($href),'',_('Compare with another entry')); + } + + protected function getDefaultEditingEntryCreateMenuItem($entry) { + $href = sprintf('cmd.php?cmd=template_engine&server_id=%s&container=%s', + $this->ldapserver->server_id,rawurlencode($entry->getDn())); + + return sprintf($this->action_layout,'star.png',_('Create'),htmlspecialchars($href),'',_('Create a child entry')); + } + + protected function getDefaultEditingEntryAddAttributeMenuItem($entry) { + $href = $this->url_base.'&cmd=add_attr_form'; + + return sprintf($this->action_layout,'add.png',_('Add'),htmlspecialchars($href),'',_('Add new attribute')); + } + + protected function getDefaultEditingEntryShowChildrenMenuItem($entry,$children_count) { + $href = sprintf('cmd.php?cmd=search&server_id=%s&search=true&filter=%s&base_dn=%s&form=advanced&scope=one', + $this->ldapserver->server_id,rawurlencode('objectClass=*'),rawurlencode($entry->getDn())); + + return sprintf($this->action_layout,'children.png',_('Children'),htmlspecialchars($href),'', + ($children_count == 1) ? _('View 1 child') : sprintf(_('View %s children'),$children_count)); + } + + protected function getDefaultEditingEntryExportSubMenuItem($entry) { + $href = sprintf('%s&cmd=export_form&scope=%s',$this->url_base,'sub'); + + return sprintf($this->action_layout,'save.png',_('Save'),htmlspecialchars($href), + _('Save a dump of this object and all of its children'),_('Export subtree')); + } + + protected function getDefaultEditingEntryDeleteAttributeMessage($entry) { + if ($_SESSION['plaConfig']->isCommandAvailable('attribute_delete_value')) + return sprintf($this->hint_layout,_('Hint: To delete an attribute, empty the text field and click save.')); + else + return ''; + } + + protected function getDefaultEditingEntryViewSchemaMessage($entry) { + return sprintf($this->hint_layout,_('Hint: To view the schema for an attribute, click the attribute name.')); + } + + protected function getDefaultEditingEntryReadOnlyMessage($entry) { + return sprintf($this->hint_layout,_('Viewing entry in read-only mode.')); + } + + protected function getDefaultEditingEntryModifiedAttributesMessage($entry,&$modified_attributes) { + return sprintf($this->hint_layout, + (count($modified_attributes) == 1) + ? sprintf(_('An attribute (%s) was modified and is highlighted below.'),implode('',$modified_attributes)) + : sprintf(_('Some attributes (%s) were modified and are highlighted below.'),implode(', ',$modified_attributes))); + } + + protected function drawDefaultEditingEntryInternalAttributes($entry) { + $counter = 0; + + foreach ($this->internal_attributes as $attr) { + $this->draw('',$attr); + $counter++; + echo "\n"; + } + + if ($counter == 0) { + echo '('; + echo _('No internal attributes'); + echo ')'; + } + } + + protected function drawDefaultEditingEntryShownAttributes($entry) { + foreach ($this->shown_attributes as $attr) { + $this->draw('',$attr); + echo "\n"; + } + } + + protected function drawDefaultEditingEntryHiddenAttributes($entry) { + foreach ($this->hidden_attributes as $attr) { + $this->draw('',$attr); + echo "\n"; + } + } + + protected function drawDefaultEditingEntryFormSubmitButton($entry) { + echo '
'; + } + + protected function drawDefaultEditingEntryJavascript($entry) { + $this->draw('Entry::Javascript', $entry); + } + + /*********************************/ + /* Paint a TemplateCreatingEntry */ + /*********************************/ + + public function visitTemplateCreatingEntryStart($entry) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$entry->getDn()); + + $template = get_request('template','REQUEST'); + $step = get_request('step','REQUEST'); + + if ($template) { + if ($template == 'none') { + $this->visit('DefaultCreatingEntry::Start', $entry); + return; + } else { + $entry->setSelectedTemplateName($template); + } + + } elseif ($step && $step > 0) { + $this->visit('DefaultCreatingEntry::Start', $entry); + return; + } + + if ($entry->getSelectedTemplateName()) { + # if we already choose an creation template, use it to display the entry + $this->visit('DefaultCreatingEntry::Start', $entry); + + } elseif ($entry->getTemplatesCount() <= 0) { + # if no template is available for this entry, draws it + # to the parent manner + $this->visit('DefaultCreatingEntry::Start', $entry); + + } elseif (($entry->getTemplatesCount() == 1) && !$entry->hasDefaultTemplate()) { + $templates = &$entry->getTemplates(); + $template_names = array_keys($templates); + $entry->setSelectedTemplateName($template_names[0]); + $this->visit('DefaultCreatingEntry::Start', $entry); + + } else { + $this->visit_attributes = false; + + # propose the template choice + $this->draw('TemplateChoice', $entry); + } + } + + public function visitTemplateCreatingEntryEnd($entry) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$entry->getDn()); + + if ($this->visit_attributes) { + foreach ($this->shown_attributes as $attr) { + $page = 1; + if ($attr->hasProperty('page')) { + $page = $attr->getProperty('page'); + } else { + $attr->setProperty('page', 1); + } + if ($page && $page > $this->laststep) { + $this->laststep = $page; + } + } + $this->visit('DefaultCreatingEntry::End', $entry); + $entry->setSelectedTemplateName(''); + } + } + + protected function initTemplateCreatingEntryVisit($entry) { + $this->init('DefaultCreatingEntry::Visit', $entry); + $this->laststep = 1; + } + + protected function drawTemplateCreatingEntryRdnChooser($entry) { + $rdn_attr = $entry->getRdnAttribute(); + + if (!$rdn_attr) { + $this->draw('DefaultCreatingEntry::RdnChooser', $entry); + } else { + printf('', htmlspecialchars($rdn_attr->getName())); + } + } + + protected function drawTemplateCreatingEntryStepTitle($entry, $step) { + if (!$entry->getSelectedTemplateName()) { + $this->draw('DefaultCreatingEntry::StepTitle', $entry, $step); + + } else if ($entry->hasProperty('description')) { + echo '

'; + echo $entry->getProperty('description'); + echo ' '; + echo _('('); + printf(_('step %s of %s'), $step, $this->laststep); + echo _(')'); + echo '

'; + } + } + + public function drawTemplateCreatingEntryStepFormStart($entry, $step) { + if ($entry->getSelectedTemplateName()) { + if ($step < $this->laststep) { + echo '
'; + + } else { + // Patch 1539633 + // default action is create.php + // you can change this behavior by setting myscript.php in template header + echo ''; + printf('', + $entry->hasProperty('action') ? rawurlencode($entry->getProperty('action')) : 'create'); + } + } else { + $this->draw('DefaultCreatingEntry::StepFormStart', $entry, $step); + } + } + + public function drawTemplateCreatingEntryStepForm($entry, $step) { + if (!$entry->getSelectedTemplateName()) { + $this->draw('DefaultCreatingEntry::StepForm', $entry, $step); + return; + } + + $container = $entry->getContainer(); + + printf('', htmlspecialchars($container)); + printf('', $this->ldapserver->server_id); + printf('', $entry->getSelectedTemplateName()); + printf('', $step + 1); + echo ''; + + $this->draw('RdnChooser', $entry); + + // draw attributes + $this->draw('ShownAttributes', $entry); + + $this->draw('StepFormSubmitButton', $entry, $step); + + echo '
'; + + $this->draw('HiddenAttributes', $entry); + } + + protected function drawTemplateCreatingEntryStepFormSubmitButton($entry, $step) { + if ($step < $this->laststep) $this->draw('DefaultCreatingEntry::StepFormSubmitButton', $entry, 1); + else $this->draw('DefaultCreatingEntry::StepFormSubmitButton', $entry, 2); + } + + protected function drawTemplateCreatingEntryTemplateChoice($entry) { + $this->draw('Title', $entry); + $this->draw('Subtitle', $entry); + echo "\n"; + + printf('

%s

',_('Select a template for the creation process')); + + $href = sprintf('cmd.php?%s', array_to_query_string($_GET,array('meth'),false)); + echo ''; + + foreach ($_POST as $p => $v) { + echo ""; + } + + echo ''; + + $server_menu_html = server_select_list($this->ldapserver->server_id, true); + printf('', _('Server'), _(':'), $server_menu_html); + + echo ''; + printf('', _('Templates'), _(':')); + echo ''; + + echo '
%s%s%s
%s%s'; + echo ''; + echo '
'; + echo ''; + + $i = -1; + $templates = &$entry->getTemplates(); + $nb_templates = count($templates); + if ($entry->hasDefaultTemplate()) $nb_templates++; + + foreach ($templates as $template_name => $template_attrs) { + $i++; + + # If the template doesnt have a title, we'll use the desc field. + $template_attrs['desc'] = isset($template_attrs['title']) ? $template_attrs['title'] : $template_attrs['desc']; + + # Balance the columns properly + if (($nb_templates % 2 == 0 && $i == intval($nb_templates / 2)) || + ($nb_templates % 2 == 1 && $i == intval($nb_templates / 2) + 1)) { + echo '
'; + } + + echo ''; + + if (isset($template_attrs['invalid']) && $template_attrs['invalid']) { + echo ''; + } else { + printf('', + htmlspecialchars($template_name), htmlspecialchars($template_name)); + } + + printf('', + htmlspecialchars($template_name), $template_attrs['icon']); + printf(''; + } + + # Default template + if ($entry->hasDefaultTemplate()) { + $i++; + if (($nb_templates % 2 == 0 && $i == intval($nb_templates / 2)) || + ($nb_templates % 2 == 1 && $i == intval($nb_templates / 2) + 1)) { + echo '
Error
'; + } + echo '' + .'' + .'' + .''; + } + + echo '
'; + echo '
'; + echo '
'; + echo '
'; + } + + protected function drawTemplateCreatingEntryShownAttributes($entry) { + if (!$entry->getSelectedTemplateName()) { + $this->draw('DefaultCreatingEntry::ShownAttributes', $entry); + return; + } + + foreach ($this->shown_attributes as $attr) { + $page = $attr->getProperty('page'); + if ($page == $this->step) { + $this->draw('', $attr); + echo "\n"; + //} elseif ($page < $this->step) { + } else { + // the displayed attributes are the visible attributes in shown_attributes list + $attr->hide(); + $this->hidden_attributes[] = $attr; + } + } + } + + protected function drawTemplateCreatingEntryHiddenAttributes($entry) { + if (!$entry->getSelectedTemplateName()) { + $this->draw('DefaultCreatingEntry::HiddenAttributes', $entry); + return; + } + + foreach ($this->hidden_attributes as $attr) { + //$page = $attr->hasProperty('page') ? $attr->getProperty('page') : -1; + //if ($page <= $this->step) { + $this->draw('', $attr); + echo "\n"; + //} + } + } + + protected function drawTemplateCreatingEntryJavascript($entry) { + $this->draw('DefaultCreatingEntry::Javascript', $entry); + + $templates = new Templates($this->ldapserver->server_id); + foreach ($entry->getAttributes() as $attribute) { + if ($attribute->hasProperty('onchange')) { + $onchange = $attribute->getProperty('onchange'); + if (is_array($onchange)) { + foreach ($onchange as $value) + $templates->OnChangeAdd($this->ldapserver,$attribute->getName(),$value); + } else { + $templates->OnChangeAdd($this->ldapserver,$attribute->getName(),$onchange); + } + } + } + $hash = $templates->getJsHash(); + + echo ''; + } + + /********************************/ + /* Paint a TemplateEditingEntry */ + /********************************/ + + public function visitTemplateEditingEntryStart($entry) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$entry->getDn()); + + $template = get_request('template','REQUEST'); + + if ($template) { + if ($template == 'none') { + $this->visit('DefaultEditingEntry::Start', $entry); + return; + } else { + $entry->setSelectedTemplateName($template); + } + } + + if ($entry->getSelectedTemplateName()) { + # if we already choose an editing template, use it to display the entry + $this->visit('DefaultEditingEntry::Start', $entry); + } elseif ($entry->getTemplatesCount() <= 0) { + # if no template is available for this entry, draws it + # to the parent manner + $this->visit('DefaultEditingEntry::Start', $entry); + } elseif (($entry->getTemplatesCount() == 1) && !$entry->hasDefaultTemplate()) { + $templates = &$entry->getTemplates(); + $template_names = array_keys($templates); + $entry->setSelectedTemplateName($template_names[0]); + $this->visit('DefaultEditingEntry::Start', $entry); + } else { + $this->visit_attributes = false; + + # propose the template choice + $this->draw('TemplateChoice', $entry); + } + } + + public function visitTemplateEditingEntryEnd($entry) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$entry->getDn()); + + if ($this->visit_attributes) { + $this->visit('DefaultEditingEntry::End', $entry); + $entry->setSelectedTemplateName(''); + } + } + + protected function drawTemplateEditingEntryTemplateChoice($entry) { + $this->draw('Title', $entry); + $this->draw('Subtitle', $entry); + echo "\n"; + + printf('

%s

',_('Select a template to edit the entry')); + + $href = sprintf('cmd.php?%s', array_to_query_string($_GET,array('meth'),false)); + echo '
'; + + foreach ($_POST as $p => $v) { + echo ""; + } + + echo ''; + echo ''; + printf('',_('Templates'), _(':')); + echo ''; + + echo '
%s%s'; + echo ''; + echo '
'; + echo ''; + + $i = -1; + $templates = &$entry->getTemplates(); + $nb_templates = count($templates); + if ($entry->hasDefaultTemplate()) $nb_templates++; + + foreach ($templates as $template_name => $template_attrs) { + $i++; + + # If the template doesnt have a title, we'll use the desc field. + $template_attrs['desc'] = isset($template_attrs['title']) ? $template_attrs['title'] : $template_attrs['desc']; + + # Balance the columns properly + if (($nb_templates % 2 == 0 && $i == intval($nb_templates / 2)) || + ($nb_templates % 2 == 1 && $i == intval($nb_templates / 2) + 1)) { + echo '
'; + } + + echo ''; + + printf('', + htmlspecialchars($template_name), htmlspecialchars($template_name)); + + printf('', + htmlspecialchars($template_name), $template_attrs['icon']); + printf(''; + } + + # Default template + if ($entry->hasDefaultTemplate()) { + $i++; + if (($nb_templates % 2 == 0 && $i == intval($nb_templates / 2)) || + ($nb_templates % 2 == 1 && $i == intval($nb_templates / 2) + 1)) { + echo '
'; + } + echo '' + .'' + .'' + .''; + } + + echo '
'; + echo '
'; + echo '
'; + echo '
'; + } + + protected function drawTemplateEditingEntryShownAttributes($entry) { + foreach ($this->shown_attributes as $attr) { + // @todo if this->page == attr->page + $this->draw('', $attr); + echo "\n"; + } + } + + protected function drawTemplateEditingEntryHiddenAttributes($entry) { + printf('', $entry->getSelectedTemplateName()); + $this->draw('DefaultEditingEntry::HiddenAttributes', $entry); + } + + protected function drawTemplateEditingEntryJavascript($entry) { + $this->draw('DefaultEditingEntry::Javascript', $entry); + + $templates = new Templates($this->ldapserver->server_id); + foreach ($entry->getAttributes() as $attribute) { + if ($attribute->hasProperty('onchange')) { + $onchange = $attribute->getProperty('onchange'); + if (is_array($onchange)) { + foreach ($onchange as $value) + $templates->OnChangeAdd($this->ldapserver,$attribute->getName(),$value); + } else { + $templates->OnChangeAdd($this->ldapserver,$attribute->getName(),$onchange); + } + } + } + $hash = $templates->getJsHash(); + + echo ''; + } + + /**************************/ + /* Paint an Attribute */ + /**************************/ + + protected function drawAttribute($attribute) { + if ($attribute->isVisible()) $this->draw('Informations', $attribute); + $this->draw('Values', $attribute); + } + + protected function drawAttributeJavascript($attribute) { + echo ''; + } + + protected function drawAttributeFocusJavascript($attribute, $component) { + $entry = $attribute->getEntry(); + + if ($entry) + echo $this->get('AttributeFocusJavascript', $entry, $attribute, $component); + } + + protected function drawAttributeBlurJavascript($attribute, $component) { + $entry = $attribute->getEntry(); + + if ($entry) + echo $this->get('AttributeBlurJavascript', $entry, $attribute, $component); + } + + protected function drawAttributeValidateJavascript($attribute, $component, $silence, $var_valid) { + if ($attribute->isRequired()) { + echo 'var vals = getAttributeValues("new", "'.$attribute->getName().'"); + if (vals.length <= 0) { + '.$var_valid.' = false; + alertError("'._('This attribute is required')._(':').' '.$attribute->getFriendlyName().'", '.$silence.'); + }'; + echo 'var comp = getAttributeComponents("new", "'.$attribute->getName().'"); + for (var i = 0; i < comp.length; i++) { + comp[i].style.backgroundColor = '.$var_valid.' ? "white" : \'#ffffba\'; + }'; + } + } + + protected function getEntryAttributeFocusJavascript($entry, $attribute, $component) { + return ''; + } + + protected function getEntryAttributeBlurJavascript($entry, $attribute, $component) { + return ''; + } + + protected function getDefaultCreatingEntryAttributeBlurJavascript($entry, $attribute, $component) { + return "\n\t\t\t\t\t\t".'validate_'.$attribute->getName().'('.$component.', false);'."\n"; + } + + protected function getTemplateCreatingEntryAttributeBlurJavascript($entry, $attribute, $component) { + $j = 'fill('.$component.'.id, pla_getComponentValue('.$component.'));'; + //$j .= $this->get('DefaultCreatingEntry::AttributeBlurJavascript',$entry, $attribute, $component); + return $j; + } + + protected function getDefaultEditingEntryAttributeBlurJavascript($entry, $attribute, $component) { + return "\n\t\t\t\t\t\t".'validate_'.$attribute->getName().'('.$component.', false);'."\n"; + } + + protected function getTemplateEditingEntryAttributeBlurJavascript($entry, $attribute, $component) { + $j = 'fill('.$component.'.id, pla_getComponentValue('.$component.'));'; + //$j .= $this->get('DefaultEditingEntry::AttributeBlurJavascript',$entry, $attribute, $component); + return $j; + } + + protected function drawAttributeFillJavascript($attribute, $component_id, $component_value) { + echo "\n\t\t\t\t\t\t".'validate_'.$attribute->getName().'(pla_getComponentById('.$component_id.'), false);'."\n"; + } + + protected function drawAttributeInformations($attribute) { + if (($this->context == ENTRY_WRITER_EDITING_CONTEXT) && $attribute->hasBeenModified()) echo ''; + else echo ''; + + echo ''; + $this->draw('Name', $attribute); + echo ''; + + echo ''; + + # Setup the $attr_note, which will be displayed to the right of the attr name (if any) + if ($_SESSION['plaConfig']->GetValue('appearance', 'show_attribute_notes')) { + $this->draw('Notes', $attribute); + } + + echo ''; + echo ''; + } + + protected function drawAttributeNotes($attribute) { + $attr_note = ''; + + $alias_note = $this->get('AliasNote', $attribute); + if ($alias_note) { + if (trim($attr_note)) $attr_note .= ', '; + $attr_note .= $alias_note; + } + + $required_note = $this->get('RequiredNote', $attribute); + if ($required_note) { + if (trim($attr_note)) $attr_note .= ', '; + $attr_note .= $required_note; + } + + $rdn_note = $this->get('RdnNote', $attribute); + if ($rdn_note) { + if (trim($attr_note)) $attr_note .= ', '; + $attr_note .= $rdn_note; + } + + if ($attr_note) printf('%s', $attr_note); + + if ($attribute->isReadOnly() && $this->ldapserver->isAttrReadOnly($attribute->getName())) { + printf('(%s)', + _('This attribute has been flagged as read only by the phpLDAPadmin administrator'), + _('read only')); + } + } + + protected function drawAttributeValues($attribute) { + if ($attribute->isVisible()) $this->draw('StartValueLine', $attribute); + + # draws values + $value_count = $attribute->getValueCount(); + $i = 0; + for (; $i < $value_count; $i++) { + $this->draw('Value', $attribute, $i); + } + + if ($this->context == ENTRY_WRITER_CREATION_CONTEXT) { + $blankvalue_count = $attribute->getMaxValueCount(); + if ($blankvalue_count < 0) $blankvalue_count = 1; + else $blankvalue_count -= $value_count; + + for ($j = 0; $j < $blankvalue_count; $j++) { + $this->draw('BlankValue', $attribute, $i + $j); + } + } + + if ($attribute->isVisible()) { + $this->draw('Menu', $attribute); + $this->draw('EndValueLine', $attribute); + } + } + + protected function drawAttributeMenu($attribute) { + $i = 0; + $item = ''; + + while (($item = $this->get('MenuItem', $attribute, $i)) !== false) { + if ($item) { + echo '
'.$item.'
'; + } + $i++; + } + } + + protected function getAttributeMenuItem($attribute, $i) { + if ($this->context != ENTRY_WRITER_EDITING_CONTEXT) + return false; + + switch ($i) { + case IdAttributeAddValueMenuItem : + if ($attribute->isVisible() && !$attribute->isReadOnly() + && !$attribute->isRdn() && $_SESSION['plaConfig']->isCommandAvailable('attribute_add_value')) { + if ($attribute->getMaxValueCount() < 0 || $attribute->getValueCount() < $attribute->getMaxValueCount()) { + return $this->get('AddValueMenuItem', $attribute); + } + } + return ''; + + case IdAttributeModifyMemberMenuItem : + if (in_array($attribute->getName(), $_SESSION['plaConfig']->GetValue('modify_member','groupattr'))) { + if ($attribute->isVisible() && !$attribute->isReadOnly() && !$attribute->isRdn() + && ($_SESSION['plaConfig']->isCommandAvailable('attribute_add_value') + || $_SESSION['plaConfig']->isCommandAvailable('attribute_delete_value'))) { + return $this->get('ModifyMemberMenuItem', $attribute); + } + } + return ''; + + case IdAttributeRenameMenuItem : + if ($attribute->isVisible() && $attribute->isRdn() && !$attribute->isReadOnly() + && $_SESSION['plaConfig']->isCommandAvailable('entry_rename')) { + return $this->get('RenameMenuItem', $attribute); + } + return ''; + + default : + return false; + } + } + + protected function drawAttributeStartValueLine($attribute) { + if (($this->context == ENTRY_WRITER_EDITING_CONTEXT) && $attribute->hasBeenModified()) { + echo ''; + } else { + echo ''; + } + echo ''; + } + + protected function drawAttributeEndValueLine($attribute) { + echo ''; + echo ''; + + if (($this->context == ENTRY_WRITER_EDITING_CONTEXT) && $attribute->hasBeenModified()) { + echo ''; + } + } + + protected function drawAttributeValue($attribute, $i) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s, %d)',1,__FILE__,__LINE__,__METHOD__,$attribute->getName(),$i); + + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + + if ($attribute->isVisible()) { + echo '
'; + $this->draw('Icon', $attribute, $val); + echo ''; + } + + $this->draw('OldValue', $attribute, $i); + + $this->draw('NewValue', $attribute, $i); + + if ($attribute->isVisible()) { + echo ''; + if (($i == 0) && $attribute->isRequired() && $attribute->getEntry() && !$attribute->getEntry()->isReadOnly()) { + echo ' '; + $this->draw('RequiredSymbol', $attribute); + } + echo '
'; + } + } + + /** + * Save the current value to detect changes + */ + protected function drawAttributeOldValue($attribute, $i) { + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + if ($i < 0) $i = 0; + + printf('', + htmlspecialchars($attribute->getName()), $i, htmlspecialchars($val)); + } + + /** + * Display the current value + */ + protected function drawAttributeNewValue($attribute, $i) { + if (!$attribute->isVisible()) { + $this->draw('HiddenValue', $attribute, $i); + + } elseif ($attribute->isReadOnly() || ($attribute->getEntry() && $attribute->getEntry()->getDn() && $attribute->isRdn())) { + $this->draw('ReadOnlyValue', $attribute, $i); + + } else { + $this->draw('ReadWriteValue', $attribute, $i); + } + } + + protected function drawAttributeBlankValue($attribute, $i) { + $this->draw('Value', $attribute, $i); + } + + protected function drawAttributeHiddenValue($attribute, $i) { + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + if ($i < 0) $i = 0; + + printf('', + htmlspecialchars($attribute->getName()), $i, htmlspecialchars($attribute->getName()), $i, + htmlspecialchars($val)); + } + + protected function drawAttributeReadOnlyValue($attribute, $i) { + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + if ($i < 0) $i = 0; + + printf('
', + htmlspecialchars($attribute->getName()), $i, htmlspecialchars($attribute->getName()), + $i, htmlspecialchars($val), ($attribute->getSize() > 0) ? 'size="'.$attribute->getSize().'"' : ''); + } + + protected function drawAttributeReadWriteValue($attribute, $i) { + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + if ($i < 0) $i = 0; + + if ($attribute->hasProperty('helper')) { + echo '
'; + } + + /* We smack an id="..." tag in here that doesn't have [][] in it to allow the + * draw_chooser_link() to identify it after the user clicks. */ + $id = sprintf('new_values_%s_%s', htmlspecialchars($attribute->getName()), $i); + + printf('', + htmlspecialchars($attribute->getName()), $i, $id, + htmlspecialchars($val), $attribute->getName(), $attribute->getName(), + ($attribute->getSize() > 0) ? 'size="'.$attribute->getSize().'"' : '', + ($attribute->getMaxLength() > 0) ? 'maxlength="'.$attribute->getMaxLength().'"' : ''); + + if ($attribute->hasProperty('helper')) { + echo ''; + $this->draw('Helper', $attribute, $i); + echo '
'; + } + } + + protected function drawAttributeHelper($attribute, $i) { + $params = $attribute->getProperty('helper'); + if (!$params) $params = array(); + elseif (!is_array($params)) $params = array($params); + + $id = isset($params['id']) ? $params['id'] : ''; + if (is_array($id)) $id = (count($id) > 0 ? $id[0] : ''); + + $display = isset($params['display']) ? $params['display'] : ''; + if (is_array($display)) $display = (count($display) > 0 ? $display[0] : ''); + + $vals = isset($params['value']) ? $params['value'] : array(); + if (!is_array($vals)) $vals = array($vals); + + $opts = isset($params['option']) ? $params['option'] : array(); + if (!is_array($opts)) $opts = array($opts); + + $dn = ''; + if ($attribute->getEntry()) { + if ($this->context == ENTRY_WRITER_CREATION_CONTEXT) { + $dn = $attribute->getEntry()->getContainer(); + } else { + $dn = $attribute->getEntry()->getDn(); + } + } + + $arr1 = array(); + foreach ($vals as $id_parval => $parval) { + $arr2 = Templates::EvaluateDefault($this->ldapserver, $parval, $dn, null, null); + if (is_array($arr2)) $arr1 = array_merge($arr1,$arr2); + else $arr1[$id_parval] = $arr2; + } + $vals = $arr1; + + $arr1 = array(); + foreach ($opts as $id_parval => $parval) { + $arr2 = Templates::EvaluateDefault($this->ldapserver, $parval, $dn, null, null); + if (is_array($arr2)) $arr1 = array_merge($arr1,$arr2); + else $arr1[$id_parval] = $arr2; + } + $opts = $arr1; + + $default = (count($vals) > 0 ? $vals[0] : ''); + if (!is_string($default)) $default = ''; + if (!is_null($attribute->getValue($i)) || (strlen($default) <= 0)) { + $default = $this->get('DefaultValueHelper', $attribute, $i); + } + + if (count($opts) > 0) { + $found = false; + + printf(''; + } else { + printf('', + $id, htmlspecialchars($attribute->getName()), $i, + $id, htmlspecialchars($attribute->getName()), $i, + htmlspecialchars($default)); + } + + if ($display) { + echo '
'; + echo ''.$display.''; + echo '
'; + } + } + + protected function getAttributeDefaultValueHelper($attribute, $i) { + return ''; + } + + protected function getAttributeRenameMenuItem($attribute) { + $encoded_dn = ''; + if ($attribute->getEntry()) $encoded_dn = rawurlencode($attribute->getEntry()->getDn()); + if (!$encoded_dn) return; // creating entry + + $url_base = sprintf('cmd.php?server_id=%s&dn=%s', $this->ldapserver->server_id, $encoded_dn); + $href = sprintf('%s&cmd=rename_form', $url_base); + + return sprintf('(%s)', htmlspecialchars($href), _('rename')); + } + + protected function getAttributeAddValueMenuItem($attribute) { + /* Draw the "add value" link under the list of values for this attributes */ + $encoded_dn = ''; + $template = ''; + if ($attribute->getEntry()) { + $encoded_dn = rawurlencode($attribute->getEntry()->getDn()); + if (method_exists($attribute->getEntry(), 'getSelectedTemplateName')) + $template = $attribute->getEntry()->getSelectedTemplateName(); + } + if (!$encoded_dn) return; // creating entry + + $href = sprintf('cmd.php?cmd=add_value_form&server_id=%s&dn=%s%s&attr=%s', + $this->ldapserver->server_id, $encoded_dn, $template ? "&template=$template" : '', rawurlencode($attribute->getName())); + + return sprintf('(%s)', + htmlspecialchars($href), sprintf(_('Add an additional value to attribute \'%s\''), + $attribute->getName()), _('add value')); + } + + protected function getAttributeModifyMemberMenuItem($attribute) { + $dn = ($attribute->getEntry()) ? $attribute->getEntry()->getDn() : ''; + $encoded_dn = ($dn) ? rawurlencode($dn) : ''; + if (!$encoded_dn) return; // creating entry + + $href = sprintf('cmd.php?cmd=modify_member_form&server_id=%s&dn=%s&attr=%s', + $this->ldapserver->server_id, $encoded_dn, rawurlencode($attribute->getName())); + + return sprintf('(%s)', + htmlspecialchars($href), sprintf(_('Modify members for \'%s\''), $dn), _('modify group members')); + } + + protected function drawAttributeIcon($attribute, $val) { + if (is_dn_string($val) || $this->ldapserver->isDNAttr($attribute->getName())) { + $this->draw('DnValueIcon', $attribute, $val); + } elseif (is_mail_string($val)) { + $this->draw('MailValueIcon', $attribute, $val); + } elseif (is_url_string($val)) { + $this->draw('UrlValueIcon', $attribute, $val); + } else { + $icon = $attribute->getIcon(); + if ($icon) printf('Icon ', $icon); + } + } + + protected function drawAttributeDnValueIcon($attribute, $val) { + if (strlen($val) <= 0) { + echo 'Go '; + + } elseif ($this->ldapserver->dnExists($val)) { + $href = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s',$this->ldapserver->server_id,$val); + printf('Go ',_('Go to'), + htmlspecialchars($val), htmlspecialchars($href)); + + } else { + printf('Go ',_('DN not available'),htmlspecialchars($val)); + } + } + + protected function drawAttributeMailValueIcon($attribute, $val) { + $img = ''._('Mail').''; + if (strlen($val) <= 0) echo $img; + else printf(''.$img.'', htmlspecialchars($val)); + echo ' '; + } + + protected function drawAttributeUrlValueIcon($attribute, $val) { + $img = ''._('URL').''; + if (strlen($val) <= 0) echo $img; + else printf(''.$img.'', htmlspecialchars($val)); + echo ' '; + } + + protected function drawAttributeName($attribute) { + $config = $_SESSION['plaConfig']; + + $attr_display = $attribute->getFriendlyName(); + + if ($attribute->getEntry() && $attribute->getEntry()->getDn() // if not creating attribute + && $config->isCommandAvailable('schema') ) { + $href = sprintf('cmd.php?cmd=schema&server_id=%s&view=attributes&viewvalue=%s', + $this->ldapserver->server_id, real_attr_name($attribute->getName())); + printf('%s', $attribute->getName(), htmlspecialchars($href), $attr_display); + } else { + printf('%s', $attr_display); + } + } + + protected function getAttributeAliasNote($attribute) { + # is there a user-friendly translation available for this attribute? + $friendly_name = $attribute->getFriendlyName(); + + if ($friendly_name != $attribute->getName()) { + return "getName()) . "\">alias"; + } else { + return ''; + } + } + + protected function getAttributeRequiredNote($attribute) { + # is this attribute required by an objectClass ? + $required_by = ''; + + if ($attribute->getEntry()) { + $schema_attr = $this->ldapserver->getSchemaAttribute($attribute->getName(),$attribute->getEntry()->getDn()); + if ($schema_attr) { + $entry_attributes = $attribute->getEntry()->getAttributes(); + $objectclass_attribute = null; + foreach ($entry_attributes as $entry_attribute) { + # It seems that some LDAP servers (Domino) returns attributes in lower case? + if ($entry_attribute->getName() == 'objectClass' + || $entry_attribute->getName() == 'objectclass') { + $objectclass_attribute = $entry_attribute; + break; + } + } + + if ($objectclass_attribute) { + $classes = arrayLower($objectclass_attribute->getValues()); + foreach ($schema_attr->getRequiredByObjectClasses() as $required) { + if (in_array(strtolower($required), $classes)) { + $required_by .= $required . ' '; + } + } + } + } + } + + if ($required_by) { + return "" . _('required') . ""; + } else { + return ''; + } + } + + protected function getAttributeRdnNote($attribute) { + # is this attribute required because its the RDN + if ($attribute->isRdn()) { + return "" . 'rdn' . " "; + } else { + return ''; + } + } + + protected function drawAttributeRequiredSymbol($attribute) { + echo '*'; + } + + /***************************/ + /* Paint a BinaryAttribute */ + /***************************/ + + protected function drawBinaryAttributeValues($attribute) { + $valcount = $attribute->getValueCount(); + + if ($attribute->isVisible()) { + $this->draw('StartValueLine', $attribute); + + echo ''; + echo _('Binary value'); + + if ($valcount > 0) { + if (strcasecmp($attribute->getName(), 'objectSid') == 0) { + printf(' (%s)', binSIDtoText($attribute->getValue(0))); + } + } + + echo '
'; + + if ($valcount > 0) { + if ($attribute->getEntry() && $attribute->getEntry()->getDn()) { + $href = sprintf('download_binary_attr.php?server_id=%s&dn=%s&attr=%s', + $this->ldapserver->server_id, rawurlencode($attribute->getEntry()->getDn()), + $attribute->getName()); + + if ($valcount > 1) { + for ($i=1; $i<=$valcount; $i++) { + printf('Save %s(%s)
', + htmlspecialchars($href), $i, _('download value'), $i); + } + } else { + printf('Save %s
', + htmlspecialchars($href),_('download value')); + } + } + + if (! $attribute->isReadOnly() && $_SESSION['plaConfig']->isCommandAvailable('attribute_delete')) { + printf(''. + 'Trash %s', + $attribute->getName(), $attribute->getFriendlyName(), _('delete attribute')); + } + } elseif ($attribute->isReadOnly() || ! $_SESSION['plaConfig']->isCommandAvailable('attribute_add_value')) { + printf('
', + _("[no value]")); + } else { + $i = 0; + $val = ''; + $id = sprintf('new_values_%s_%s', htmlspecialchars($attribute->getName()), $i); + printf('
', + htmlspecialchars($attribute->getName()), $i, $id, + htmlspecialchars($val), $attribute->getName(), $attribute->getName(), + ($attribute->getSize() > 0) ? 'size="'.$attribute->getSize().'"' : '', + ($attribute->getMaxLength() > 0) ? 'maxlength="'.$attribute->getMaxLength().'"' : ''); + } + + echo '
'; + + $this->draw('EndValueLine', $attribute); + } else { + for ($i=0; $i<$valcount; $i++) { + $n = $attribute->getFileName($i); + $p = $attribute->getFilePath($i); + if ($n && $p) { + printf('', + htmlspecialchars($attribute->getName()), $i, md5("$n|$p")); + printf('', + htmlspecialchars($attribute->getName()), $i, md5("$n|$p")); + } + } + } + } + + protected function drawBinaryAttributeJavascript($attribute) { + $this->draw('Attribute::Javascript', $attribute); + + $dn = ''; + if ($attribute->getEntry()) $dn = $attribute->getEntry()->getDn(); + if (!$dn) return; + + static $already_draw = false; + if ($already_draw) return; + else $already_draw = true; + + echo ' + +
+ + + +
'; + + echo ' + '; + } + + protected function drawBinaryAttributeBlurJavascript($attribute, $component) { + } + + /***************************/ + /* Paint a DateAttribute */ + /***************************/ + + protected function drawDateAttributeReadWriteValue($attribute, $i) { + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + + printf(' ', + $attribute->getName(), $i, htmlspecialchars($attribute->getName()), $i, htmlspecialchars($val), + $attribute->getName(), $attribute->getName(), + ($attribute->getSize() > 0) ? 'size="'.$attribute->getSize().'"' : '', + ($attribute->getMaxLength() > 0) ? 'maxlength="'.$attribute->getMaxLength().'"' : ''); + draw_date_selector_link($attribute->getName().'_'.$i); + echo ''; + } + + protected function drawDateAttributeJavascript($attribute) { + $this->draw('Attribute::Javascript', $attribute); + + $entry['date'] = $_SESSION['plaConfig']->GetValue('appearance','date_attrs'); + $entry['time'] = $_SESSION['plaConfig']->GetValue('appearance','date_attrs_showtime'); + $entry['format'] = $_SESSION['plaConfig']->GetValue('appearance', 'date'); + + if (isset($entry['date'][$attribute->getName()])) + $entry['format'] = $entry['date'][$attribute->getName()]; + + //included in class page to avoid multiple inclusions + //printf('','../htdocs/'.JSDIR); + printf('','../htdocs/'.JSDIR); + printf('','../htdocs/'.JSDIR); + printf('','../htdocs/'.JSDIR); + + for ($i = 0; $i <= $attribute->getValueCount(); $i++) { + printf('',$attribute->getName(),$i,$entry['format']); + + if (in_array_ignore_case($attribute->getName(),array_keys($entry['time'])) && ($entry['time'][$attribute->getName()])) + printf('',$attribute->getName(),$i,'true'); + } + } + + /***************************/ + /* Paint a DnAttribute */ + /***************************/ + + protected function drawDnAttributeReadWriteValue($attribute, $i) { + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + if ($i < 0) $i = 0; + + if ($attribute->hasProperty('helper')) { + echo '
'; + } + + $input_name = sprintf('new_values[%s][%s]', htmlspecialchars($attribute->getName()), $i); + $input_id = sprintf('new_values_%s_%s', htmlspecialchars($attribute->getName()), $i); + + printf(' ', + $input_name, $input_id, htmlspecialchars($val), + $attribute->getName(), $attribute->getName(), + ($attribute->getSize() > 0) ? 'size="'.$attribute->getSize().'"' : '', + ($attribute->getMaxLength() > 0) ? 'maxlength="'.$attribute->getMaxLength().'"' : ''); + + /* draw a link for popping up the entry browser if this is the type of attribute + * that houses DNs. */ + draw_chooser_link("entry_form.$input_id", false); + echo ''; + + if ($attribute->hasProperty('helper')) { + echo ''; + $this->draw('Helper', $attribute, $i); + echo '
'; + } + } + + protected function drawDnAttributeIcon($attribute, $val) { + $this->draw('DnValueIcon', $attribute, $val); + } + + /***************************/ + /* Paint a GidAttribute */ + /***************************/ + + protected function drawGidAttributeReadWriteValue($attribute, $i) { + $this->draw('Attribute::ReadWriteValue', $attribute, $i); + + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + + $dn = ''; + if ($attribute->getEntry()) $dn = $attribute->getEntry()->getDn(); + + # If this is a gidNumber on a non-PosixGroup entry, lookup its name and description for convenience + if (! in_array_ignore_case('posixGroup', $this->ldapserver->getDNAttr($dn, 'objectClass'))) { + $gid_number = $val; + $search_group_filter = "(&(objectClass=posixGroup)(gidNumber=$val))"; + $group = $this->ldapserver->search(null, null, $search_group_filter,array('dn','description')); + + if (count($group) > 0) { + echo '
'; + + $group = array_pop($group); + $group_dn = $group['dn']; + $group_name = explode('=',get_rdn($group_dn)); + $group_name = $group_name[1]; + $href = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s', + $this->ldapserver->server_id, rawurlencode($group_dn)); + + echo ''; + printf('%s', htmlspecialchars($href), htmlspecialchars($group_name)); + + $description = isset($group['description']) ? $group['description'] : null; + + if (is_array($description)) { + foreach ($description as $item) + printf(' (%s)',htmlspecialchars($item)); + } else { + printf(' (%s)',htmlspecialchars($description)); + } + + echo ''; + } + } + } + + /***************************/ + /* Paint a JpegAttribute */ + /***************************/ + + protected function drawJpegAttributeValues($attribute) { + if ($attribute->isVisible()) { + $this->draw('StartValueLine', $attribute); + + $value_count = $attribute->getValueCount(); + if ($value_count > 0) { + /* Don't draw the delete buttons if there is more than one jpegPhoto + * (phpLDAPadmin can't handle this case yet) */ + if ($attribute->getEntry() && $attribute->getEntry()->getDn()) { + draw_jpeg_photos($this->ldapserver, $attribute->getEntry()->getDn(), + $attribute->getName(), ! $attribute->isReadOnly() + && $_SESSION['plaConfig']->isCommandAvailable('attribute_delete')); + } + } elseif ($attribute->isReadOnly() || ! $_SESSION['plaConfig']->isCommandAvailable('attribute_add_value')) { + printf('
',_('[no value]')); + } else { + $i = 0; + $val = ''; + $id = sprintf('new_values_%s_%s', htmlspecialchars($attribute->getName()), $i); + printf('
', + htmlspecialchars($attribute->getName()), $i, $id, + htmlspecialchars($val), $attribute->getName(), $attribute->getName(), + ($attribute->getSize() > 0) ? 'size="'.$attribute->getSize().'"' : '', + ($attribute->getMaxLength() > 0) ? 'maxlength="'.$attribute->getMaxLength().'"' : ''); + } + + $this->draw('EndValueLine', $attribute); + } else { + $this->draw('BinaryAttribute::Values', $attribute); + } + } + + /******************************/ + /* Paint a MultiLineAttribute */ + /******************************/ + + protected function drawMultiLineAttributeReadOnlyValue($attribute, $i) { + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + if ($i < 0) $i = 0; + + printf('
', + ($attribute->getRows() > 0) ? 'rows="'.$attribute->getRows().'"' : '', + ($attribute->getCols() > 0) ? 'cols="'.$attribute->getCols().'"' : '', + htmlspecialchars($attribute->getName()), $i, + htmlspecialchars($attribute->getName()), $i, + htmlspecialchars($val)); + } + + protected function drawMultiLineAttributeReadWriteValue($attribute, $i) { + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + if ($i < 0) $i = 0; + + printf('', + ($attribute->getRows() > 0) ? 'rows="'.$attribute->getRows().'"' : '', + ($attribute->getCols() > 0) ? 'cols="'.$attribute->getCols().'"' : '', + htmlspecialchars($attribute->getName()), $i, + htmlspecialchars($attribute->getName()), $i, + $attribute->getName(), $attribute->getName(), + htmlspecialchars($val)); + } + + /********************************/ + /* Paint a ObjectClassAttribute */ + /********************************/ + + protected function drawObjectClassAttributeNewValue($attribute, $i) { + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + if ($i < 0) $i = 0; + + $schema_object = ($val) ? $this->ldapserver->getSchemaObjectClass($val) : false; + $structural = (is_object($schema_object) && $schema_object->getType() == 'structural'); + + if (!$attribute->isVisible()) { + $this->draw('HiddenValue', $attribute, $i); + } elseif ($structural) { + # Is this value is a structural objectClass, make it read-only + printf('', + htmlspecialchars($attribute->getName()), $i, + htmlspecialchars($attribute->getName()), $i, htmlspecialchars($val)); + + printf(' (%s)
', + _('This is a structural ObjectClass and cannot be removed.'), + _('structural')); + } else { + $this->draw('Attribute::NewValue', $attribute, $i); + } + } + + protected function drawObjectClassAttributeIcon($attribute, $val) { + if (strlen($val) > 0) { + $href = htmlspecialchars(sprintf('cmd.php?cmd=schema&server_id=%s&view=objectClasses&viewvalue=%s', + $this->ldapserver->server_id, $val)); + printf('Info ', + _('View the schema description for this objectClass'), htmlspecialchars($href)); + } + } + + /*****************************/ + /* Paint a PasswordAttribute */ + /*****************************/ + + protected function drawPasswordAttributeOldValue($attribute, $i) { + //if ($this->context == ENTRY_WRITER_CREATION_CONTEXT) { + $this->draw('Attribute::OldValue', $attribute, $i); + //} + } + + protected function drawPasswordAttributeHiddenValue($attribute, $i) { + if ($this->context == ENTRY_WRITER_CREATION_CONTEXT) { + $this->draw('Attribute::HiddenValue', $attribute, $i); + } + } + + protected function drawPasswordAttributeReadOnlyValue($attribute, $i) { + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + if ($i < 0) $i = 0; + + $enc_type = get_enc_type($val); + if ($val == '') $enc_type = get_default_hash($this->ldapserver->server_id); + $obfuscate_password = obfuscate_password_display($enc_type); + + printf('
', + ($obfuscate_password ? 'password' : 'text'), + htmlspecialchars($attribute->getName()), $i, htmlspecialchars($attribute->getName()), + $i, htmlspecialchars($val), ($attribute->getSize() > 0) ? 'size="'.$attribute->getSize().'"' : ''); + if ($val != '') $this->draw('CheckLink', $attribute, 'new_values_'.htmlspecialchars($attribute->getName()).'_'.$i); + } + + protected function drawPasswordAttributeReadWriteValue($attribute, $i) { + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + if ($i < 0) $i = 0; + + $enc_type = get_enc_type($val); + + # Set the default hashing type if the password is blank (must be newly created) + if ($val == '') { + $enc_type = get_default_hash($this->ldapserver->server_id); + } + + //printf('', $attribute->getName(), $i, htmlspecialchars($val)); + + //if (strlen($val) > 0) { + // if (obfuscate_password_display($enc_type)) { + // echo htmlspecialchars(preg_replace('/./','*', $val)); + // } else { + // echo htmlspecialchars($val); + // } + // echo '
'; + //} + + echo '
'; + + $obfuscate_password = obfuscate_password_display($enc_type); + $id = sprintf('new_values_%s_%s', htmlspecialchars($attribute->getName()), $i); + printf('', + ($obfuscate_password ? 'password' : 'text'), + htmlspecialchars($attribute->getName()), $i, $id, + htmlspecialchars($val), + $attribute->getName(), $attribute->getName(), + ($attribute->getSize() > 0) ? 'size="'.$attribute->getSize().'"' : '', + ($attribute->getMaxLength() > 0) ? 'maxlength="'.$attribute->getMaxLength().'"' : ''); + + echo ''; + if ($attribute->hasProperty('helper')) { + $this->draw('Helper', $attribute, $i); + } + echo '
'; + + if ($attribute->hasProperty('verify') && $attribute->getProperty('verify') && $obfuscate_password) { + $id_v = sprintf('new_values_verify_%s_%s', htmlspecialchars($attribute->getName()), $i); + printf('', + htmlspecialchars($attribute->getName()), $i, $id_v, + ($attribute->getSize() > 0) ? 'size="'.$attribute->getSize().'"' : '', + ($attribute->getMaxLength() > 0) ? 'maxlength="'.$attribute->getMaxLength().'"' : ''); + echo ''; + printf('(%s)', _('confirm')); + echo '
'; + } + + $this->draw('CheckLink', $attribute, $id); + echo '
'; + } + + protected function getPasswordAttributeDefaultValueHelper($attribute, $i) { + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + $enc_type = get_enc_type($val); + + # Set the default hashing type if the password is blank (must be newly created) + if ($val == '') { + $enc_type = get_default_hash($this->ldapserver->server_id); + } + + return $enc_type; + } + + protected function drawPasswordAttributeCheckLink($attribute, $component_id) { + printf('%s
', + $component_id/*base64_encode($val)*/, _('Check password...')); + } + + protected function drawPasswordAttributeJavascript($attribute) { + $this->draw('Attribute::Javascript', $attribute); + + static $already_draw = false; + if ($already_draw) return; + else $already_draw = true; + + # add the javascript so we can call check password later. + echo ' + '; + } + + /***********************************/ + /* Paint a RandomPasswordAttribute */ + /***********************************/ + + protected function drawRandomPasswordAttributeJavascript($attribute) { + $this->draw('PasswordAttribute::Javascript', $attribute); + + $pwd = password_generate(); + $pwd = str_replace("\\", "\\\\", $pwd); + $pwd = str_replace("'", "\\'", $pwd); + + echo ''; + } + + /******************************/ + /* Paint a SelectionAttribute */ + /******************************/ + + protected function drawSelectionAttributeValues($attribute) { + if (!$attribute->isVisible() || !$attribute->isMultiple() || ($attribute->getValueCount() > 0)) { + $this->draw('Attribute::Values', $attribute); + } else { + $this->draw('StartValueLine', $attribute); + $this->draw('Value', $attribute, 0); + $this->draw('Menu', $attribute); + $this->draw('EndValueLine', $attribute); + } + } + + protected function drawSelectionAttributeReadOnlyValue($attribute, $i) { + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + if ($i < 0) $i = 0; + + printf('', + htmlspecialchars($attribute->getName()), $i, + htmlspecialchars($attribute->getName()), $i, + htmlspecialchars($val)); + + $select = $attribute->getSelection(); + if (isset($select[$val])) $val = $select[$val]; + echo htmlspecialchars($val).'
'; + } + + protected function drawSelectionAttributeReadWriteValue($attribute, $i) { + if ($attribute->isMultiple()) { + // for multiple selection, we draw the component only one time + if ($i > 0) return; + + if (($attribute->getSize() > 0) && ($attribute->getSize() < $attribute->getOptionCount())) { + $selected = array(); + printf(''; + } else { + $selected = array(); + $vals = $attribute->getValues(); + $j = 0; + + echo ''; + foreach ($attribute->getSelection() as $value => $description) { + if (in_array($value, $vals)) $selected[$value] = true; + $id = 'new_values_'.htmlspecialchars($attribute->getName()).'_'.($j++); + printf('', + $id, htmlspecialchars($attribute->getName()), $value, + $attribute->getName(), $attribute->getName(), + isset($selected[$value]) ? 'checked' : '', + " $description"); + } + foreach ($vals as $val) { + if (!isset($selected[$val])) { + $id = 'new_values_'.htmlspecialchars($attribute->getName()).'_'.($j++); + printf('', + $id, htmlspecialchars($attribute->getName()), $val, + $attribute->getName(), $attribute->getName(), + " $val"); + } + } + echo '
%s
%s
'; + } + } else { + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + if ($i < 0) $i = 0; + + if ($attribute->hasProperty('helper')) { + echo '
'; + } + + $found = false; + $empty_value = false; + + $id = 'new_values_'.htmlspecialchars($attribute->getName()).'_'.$i; + printf(''; + + if ($attribute->hasProperty('helper')) { + echo ''; + $this->draw('Helper', $attribute, $i); + echo '
'; + } + } + } + + protected function getSelectionAttributeMenuItem($attribute, $i) { + switch ($i) { + case IdAttributeAddValueMenuItem : + if (!$attribute->isMultiple()) { + return $this->get('Attribute::MenuItem', $attribute, $i); + } + return ''; + case IdAttributeModifyMemberMenuItem : + return ''; + default : + return $this->get('Attribute::MenuItem', $attribute, $i); + } + } + + protected function drawSelectionAttributeIcon($attribute, $val) { + if (!$attribute->isMultiple() || $attribute->isReadOnly()) { + $this->draw('Attribute::Icon', $attribute, $val); + } + } + + /***************************/ + /* Paint a ShadowAttribute */ + /***************************/ + + protected function drawShadowAttributeReadOnlyValue($attribute, $i) { + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + if ($i < 0) $i = 0; + + printf('', + htmlspecialchars($attribute->getName()), $i, + htmlspecialchars($attribute->getName()), $i, + htmlspecialchars($val)); + + $today = date('U'); + $shadow_date = $today; + if ($attribute->getEntry()) { + $shadow_date = shadow_date($attribute->getEntry()->getAttributes(),$attribute->getName()); + } + + echo htmlspecialchars($val).' '; + echo ''; + $this->draw('ShadowDate', $attribute, $shadow_date); + echo '
'; + } + + protected function drawShadowAttributeReadWriteValue($attribute, $i) { + $this->draw('Attribute::ReadWriteValue', $attribute, $i); + + $val = $attribute->getValue($i); + if (!is_string($val) || (strlen($val) <= 0)) return; + + $today = date('U'); + $shadow_date = $today; + if ($attribute->getEntry()) { + $shadow_date = shadow_date($attribute->getEntry()->getAttributes(),$attribute->getName()); + } + + # Show the dates for all the shadow attributes. + if ($shadow_date !== false) { + echo ''; + $this->draw('ShadowDate', $attribute, $shadow_date); + echo ''; + echo '
'; + } + } + + protected function drawShadowAttributeShadowDate($attribute, $shadow_date) { + $config = $_SESSION['plaConfig']; + + //$shadow_format_attrs = array_merge($shadow_before_today_attrs,$shadow_after_today_attrs); + $shadow_before_today_attrs = arrayLower($attribute->shadow_before_today_attrs); + $shadow_after_today_attrs = arrayLower($attribute->shadow_after_today_attrs); + $today = date('U'); + + if (($today < $shadow_date) && in_array(strtolower($attribute->getName()),$shadow_before_today_attrs)) { + echo '('; + echo htmlspecialchars(strftime($config->GetValue('appearance', 'date'), $shadow_date)); + echo ')'; + + } elseif (($today > $shadow_date) && in_array(strtolower($attribute->getName()),$shadow_after_today_attrs)) { + echo '('; + echo htmlspecialchars(strftime($config->GetValue('appearance', 'date'), $shadow_date)); + echo ')'; + + } else { + echo '('; + echo htmlspecialchars(strftime($config->GetValue('appearance', 'date'), $shadow_date)); + echo ')'; + } + } +} +?> diff --git a/lib/EntryWriter2.php b/lib/EntryWriter2.php new file mode 100644 index 0000000..0a39d80 --- /dev/null +++ b/lib/EntryWriter2.php @@ -0,0 +1,301 @@ +getAttributes(); + $rdn_attr = $entry->getRdnAttribute(); + + echo ' '; + printf(' %s%s','RDN',_(':')); + echo ''; + } + + protected function drawDefaultCreatingEntryShownAttributes($entry) { + $attrs = array(); + + // put required attributes first + foreach ($this->shown_attributes as $sa) { + if ($sa->isRequired()) $attrs[] = $sa; + } + foreach ($this->shown_attributes as $sa) { + if (!$sa->isRequired()) $attrs[] = $sa; + } + + $has_required_attrs = false; + $has_optional_attrs = false; + foreach ($attrs as $attr) { + if ($attr->isRequired()) { + if (!$has_required_attrs) { + echo ' '; + $has_required_attrs = true; + } + } else { + if (!$has_optional_attrs) { + if (!$has_required_attrs) { + // no required attributes + } + echo ' '; + $has_optional_attrs = true; + } + } + + $this->draw('', $attr); + echo "\n"; + } + + if (!$has_optional_attrs) { + // no optional attributes + } + } + + public function drawDefaultCreatingEntryStepFormSubmitButton($entry, $step) { + echo ' '; + if ($step == 1) { + echo '
'; + printf('', _('Proceed >>')); + echo '
'; + } else { + echo '
'; + printf('', _('Create Object')); + echo '
'; + } + } + + /*******************************/ + /* Paint a DefaultEditingEntry */ + /*******************************/ + + protected function drawDefaultEditingEntryInternalAttributes($entry) { + $counter = 0; + + echo ' '; + + foreach ($this->internal_attributes as $attr) { + $this->draw('', $attr); + $counter++; + echo "\n"; + } + + if ($counter == 0) { + echo '('; + echo _('No internal attributes'); + echo ')'; + } + } + + protected function drawDefaultEditingEntryShownAttributes($entry) { + echo ' '; + parent::drawDefaultEditingEntryShownAttributes($entry); + } + + protected function drawDefaultEditingEntryFormSubmitButton($entry) { + echo ' '; + echo '
'; + } + + /*********************************/ + /* Paint a TemplateCreatingEntry */ + /*********************************/ + + protected function drawTemplateCreatingEntryShownAttributes($entry) { + if ($entry->getSelectedTemplateName()) { + echo ' '; + } + parent::drawTemplateCreatingEntryShownAttributes($entry); + } + + /********************************/ + /* Paint a TemplateEditingEntry */ + /********************************/ + + protected function drawTemplateEditingEntryShownAttributes($entry) { + echo ' '; + parent::drawTemplateEditingEntryShownAttributes($entry); + } + + /**************************/ + /* Paint an Attribute */ + /**************************/ + + protected function drawAttribute($attribute) { + if ($attribute->isVisible()) { + if (($this->context == ENTRY_WRITER_EDITING_CONTEXT) && $attribute->hasBeenModified()) { + echo ''; + } else { + echo ''; + } + $this->draw('Informations', $attribute); + } + + $this->draw('Values', $attribute); + + if ($attribute->isVisible()) { + echo ''; + if (($this->context == ENTRY_WRITER_EDITING_CONTEXT) && $attribute->hasBeenModified()) { + //echo ''; + } + if ($attribute->hasProperty('spacer') && $attribute->getProperty('spacer')) { + echo ' '; + } + } + } + + protected function drawAttributeInformations($attribute) { + echo ''; + $this->draw('Icon', $attribute, ''); + echo ''; + + echo ''; + $this->draw('Name', $attribute); + echo _(':'); + + echo '
'; + if ($_SESSION['plaConfig']->GetValue('appearance', 'show_attribute_notes')) { + $this->draw('Notes', $attribute); + } + + echo ''; + } + + protected function drawAttributeNotes($attribute) { + $attr_note = ''; + + $alias_note = $this->get('AliasNote', $attribute); + if ($alias_note) { + if (trim($attr_note)) $attr_note .= ', '; + $attr_note .= $alias_note; + } + + $required_note = $this->get('RequiredNote', $attribute); + if ($required_note) { + if (trim($attr_note)) $attr_note .= ', '; + $attr_note .= $required_note; + } + + $rdn_note = $this->get('RdnNote', $attribute); + if ($rdn_note) { + if (trim($attr_note)) $attr_note .= ', '; + $attr_note .= $rdn_note; + } + + if ($attr_note) printf('%s', $attr_note); + + if ($attribute->isReadOnly() && $this->ldapserver->isAttrReadOnly($attribute->getName())) { + printf('(%s)', + _('This attribute has been flagged as read only by the phpLDAPadmin administrator'), + _('read only')); + } + } + + protected function drawAttributeStartValueLine($attribute) { + echo ''; + } + + protected function drawAttributeEndValueLine($attribute) { + echo ''; + } + + protected function drawAttributeValue($attribute, $i) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s, %d)',1,__FILE__,__LINE__,__METHOD__,$attribute->getName(),$i); + + $val = $attribute->getValue($i); + if (!is_string($val)) $val = ''; + + if ($attribute->isVisible()) { + echo '
'; + } + + $this->draw('OldValue', $attribute, $i); + + $this->draw('NewValue', $attribute, $i); + + if ($attribute->isVisible()) { + echo ''; + if (($i == 0) && $attribute->isRequired() && $attribute->getEntry() && !$attribute->getEntry()->isReadOnly()) { + echo ' '; + $this->draw('RequiredSymbol', $attribute); + } + echo '
'; + } + } + + protected function drawAttributeMenu($attribute) { + if ($attribute->getHint() /*&& $_SESSION['plaConfig']->GetValue('appearance', 'show_hints')*/) { + echo 'Hint '.$attribute->getHint().''; + } + parent::drawAttributeMenu($attribute); + } + + /***************************/ + /* Paint a BinaryAttribute */ + /***************************/ + + /***************************/ + /* Paint a DateAttribute */ + /***************************/ + + /***************************/ + /* Paint a DnAttribute */ + /***************************/ + + /***************************/ + /* Paint a GidAttribute */ + /***************************/ + + /***************************/ + /* Paint a JpegAttribute */ + /***************************/ + + /******************************/ + /* Paint a MultiLineAttribute */ + /******************************/ + + /********************************/ + /* Paint a ObjectClassAttribute */ + /********************************/ + + /*****************************/ + /* Paint a PasswordAttribute */ + /*****************************/ + + /***********************************/ + /* Paint a RandomPasswordAttribute */ + /***********************************/ + + /******************************/ + /* Paint a SelectionAttribute */ + /******************************/ + + /***************************/ + /* Paint a ShadowAttribute */ + /***************************/ + +} + +?> diff --git a/lib/GidAttribute.php b/lib/GidAttribute.php new file mode 100644 index 0000000..d34b9b4 --- /dev/null +++ b/lib/GidAttribute.php @@ -0,0 +1,12 @@ + diff --git a/lib/HTMLTree.php b/lib/HTMLTree.php new file mode 100644 index 0000000..2bcc34b --- /dev/null +++ b/lib/HTMLTree.php @@ -0,0 +1,529 @@ +getLdapServer(); + + $this->draw_mass_deletion_start_form(); + + echo ''; + $this->draw_server_name(); + + $this->javascript = ''; + $javascript_id = 0; + + /* Do we have what it takes to authenticate here, or do we need to + * present the user with a login link (for 'cookie' and 'session' auth_types)? + */ + if ($ldapserver->haveAuthInfo()) { + if ($ldapserver->connect(false)) { + $this->draw_menu(); + + if ($ldapserver->auth_type != 'config') + $this->draw_logged_in_dn(); + else + printf('',$this->getDepth()+3); + + if ($ldapserver->isReadOnly()) + printf('',$this->getDepth()+3-1,_('read only')); + else + printf('',$this->getDepth()+3); + + foreach ($ldapserver->getBaseDN() as $base_dn) { + # Did we get a base_dn for this server somehow? + if ($base_dn) { + /* Check if the LDAP server is not yet initialized + * (ie, the base DN configured in config.php does not exist) + */ + if (! $ldapserver->dnExists($base_dn)) { + $javascript_id++; + + printf('',$this->getDepth()+3-3,pretty_print_dn($base_dn)); + + /* Move this form and add it to the end of the html - otherwise the javascript + * doesnt work when isMassDeleteEnabled returning true. + */ +#@todo: move to new format and test. + $this->javascript .= sprintf('',$javascript_id); + $this->javascript .= sprintf('',$ldapserver->server_id); + $this->javascript .= sprintf('',htmlspecialchars(get_container($base_dn))); + $this->javascript .= sprintf('',get_rdn($base_dn)); + $this->javascript .= sprintf(''); + + printf('',$this->getDepth()+3-3,_('This base entry does not exist.'),$javascript_id,_('Create it?')); + + continue; + + } else { + $this->draw_dn($base_dn,-1); + } + + } else { // end if ($base_dn) + # The server refuses to give out the base dn + printf('', + $this->getDepth()+3-2, + _('Could not determine the root of your LDAP tree.'), + _('It appears that the LDAP server has been configured to not reveal its root.'), + _('Please specify it in config.php')); + + # Proceed to the Base DN. We cannot draw anything else for this Base DN. + continue; + } + } + + } else { // end if( $ldapserver->connect(false) ) + # @todo: need this message to display the LDAP server name, so we know which one is the problematic one. + system_message(array( + 'title'=>_('Authenticate to server'), + 'body'=>_('Could not connect to LDAP server'), + 'type'=>'warn')); + + $this->draw_logout_link(); + + # Proceed to the next server in the list. We cannot do anything mroe here. + //return; + } + } else { // end if $ldapserver->haveAuthInfo() + /* We don't have enough information to login to this server + * Draw the "login..." link + */ + $this->draw_login_link(); + } + + $this->draw_mass_deletion_submit_button(); + + # Tree Footer. + # @todo: Need to implement a mechanism to have a footer, but not display it if it is blank. + #printf('',$this->getDepth()+3,' '); + echo '
 
 
%s
%s%s
%s
%s
%s
%s
'; + $this->draw_mass_deletion_end_form(); + echo "\n\n"; + + $this->draw_javascript(); + } + + protected function draw_mass_deletion_start_form() { + $ldapserver = $this->getLdapServer(); + + # Does this server want mass deletion available? + if ($ldapserver->isMassDeleteEnabled()) { + echo '
'; + printf('',$ldapserver->server_id); + echo "\n\n"; + } + } + + protected function draw_mass_deletion_submit_button() { + $ldapserver = $this->getLdapServer(); + + if ($ldapserver->isMassDeleteEnabled()) { + printf('', + $this->getDepth()+3,_('Delete Checked Entries')); + } + } + + protected function draw_mass_deletion_end_form() { + $ldapserver = $this->getLdapServer(); + + if ($ldapserver->isMassDeleteEnabled()) { + echo ''; + echo '
'; + } + } + + protected function draw_server_name() { + $ldapserver = $this->getLdapServer(); + + echo ''; + printf('%s',_('Server')); + printf('',$this->getDepth()+3-1); + printf('%s',htmlspecialchars($ldapserver->name)); + + if ($ldapserver->haveAuthInfo() && $ldapserver->auth_type != 'config') { + $m = sprintf(_('Inactivity will log you off at %s'), + strftime('%H:%M',time() + ($ldapserver->session_timeout*60))); + printf(' %s',$m,$m); + } + echo ''; + } + + protected function draw_menu() { + $links = ''; + $link = ''; + $i = 0; + + while (($link = $this->get_menu_item($i)) !== false) { + if ($link) { + //if ($links) $links .= ' | '; + $links .= ''.$link.''; + } + $i++; + } + + # Draw the quick-links below the server name: + if ($links) { + printf('',$this->getDepth()+3-1); + printf('%s
',$links); + echo ''; + } + } + + protected function get_menu_item($i) { + $ldapserver = $this->getLdapServer(); + + switch($i) { + case 0 : + if ($_SESSION['plaConfig']->isCommandAvailable('schema')) return $this->get_schema_menu_item(); + else return ''; + case 1 : + if ($_SESSION['plaConfig']->isCommandAvailable('search')) return $this->get_search_menu_item(); + else return ''; + case 2 : + if ($_SESSION['plaConfig']->isCommandAvailable('server_refresh')) return $this->get_refresh_menu_item(); + else return ''; + case 3 : + if ($_SESSION['plaConfig']->isCommandAvailable('server_info')) return $this->get_info_menu_item(); + else return ''; + case 4 : + if (!$ldapserver->isReadOnly() && $_SESSION['plaConfig']->isCommandAvailable('import')) return $this->get_import_menu_item(); + else return ''; + case 5 : + if ($_SESSION['plaConfig']->isCommandAvailable('export')) return $this->get_export_menu_item(); + else return ''; + case 6 : + if ($ldapserver->auth_type != 'config') return $this->get_logout_menu_item(); + else return ''; + default : + return false; + } + } + + protected function get_schema_menu_item() { + $ldapserver = $this->getLdapServer(); + $href = sprintf('cmd.php?cmd=schema&server_id=%s',$ldapserver->server_id); + + return sprintf('%s
%s
', + _('View schema for'),$ldapserver->name,htmlspecialchars($href),'images/schema.png',_('schema'),_('schema')); + } + + protected function get_search_menu_item() { + $ldapserver = $this->getLdapServer(); + $href = sprintf('cmd.php?cmd=search&server_id=%s&form=undefined"',$ldapserver->server_id); + + return sprintf('%s
%s
', + _('search'),$ldapserver->name,htmlspecialchars($href),'images/search.png',_('search'),_('search')); + } + + protected function get_refresh_menu_item() { + $ldapserver = $this->getLdapServer(); + $href = sprintf('cmd.php?cmd=refresh&server_id=%s',$ldapserver->server_id); + + return sprintf('%s
%s
', + _('Refresh all expanded containers for'),$ldapserver->name,htmlspecialchars($href),'images/refresh-big.png',_('refresh'),_('refresh')); + } + + protected function get_info_menu_item() { + $ldapserver = $this->getLdapServer(); + $href = sprintf('cmd.php?cmd=server_info&server_id=%s',$ldapserver->server_id); + + return sprintf('%s
%s
', + _('View server-supplied information'),htmlspecialchars($href),'images/info.png',_('info'),_('info')); + } + + protected function get_import_menu_item() { + $ldapserver = $this->getLdapServer(); + $href = sprintf('cmd.php?cmd=ldif_import_form&server_id=%s',$ldapserver->server_id); + + return sprintf('%s
%s
', + _('Import entries from an LDIF file'),htmlspecialchars($href),'images/import.png',_('import'),_('import')); + } + + protected function get_export_menu_item() { + $ldapserver = $this->getLdapServer(); + $href = sprintf('cmd.php?cmd=export_form&server_id=%s',$ldapserver->server_id); + + return sprintf('%s
%s
', + _('Export entries'),htmlspecialchars($href),'images/export.png',_('export'),_('export')); + } + + protected function get_logout_menu_item() { + $ldapserver = $this->getLdapServer(); + $href = sprintf('cmd.php?cmd=logout&server_id=%s',$ldapserver->server_id); + + return sprintf('%s
%s
', + _('Logout of this server'),htmlspecialchars($href),'images/logout.png',_('logout'),_('logout')); + } + + protected function draw_logged_in_dn() { + $ldapserver = $this->getLdapServer(); + + $logged_in_dn = $ldapserver->getLoggedInDN(); + printf('%s%s ',$this->getDepth()+3-1,_('Logged in as'),_(':')); + + if ($ldapserver->getDNBase($logged_in_dn) == $logged_in_dn) { + $logged_in_branch = ''; + $logged_in_dn_array = array(); + } else { + $logged_in_branch = preg_replace('/,'.$ldapserver->getDNBase($logged_in_dn).'$/','',$logged_in_dn); + $logged_in_dn_array = pla_explode_dn($logged_in_branch); + } + + $bases = $ldapserver->getDNBase($logged_in_dn); + if (is_array($bases) && count($bases)) + $logged_in_dn_array[] = $bases; + + $rdn = $logged_in_dn; + + # Some sanity checking here, in case our DN doesnt look like a DN + if (! is_array($logged_in_dn_array)) + $logged_in_dn_array = array($logged_in_dn); + + if (strcasecmp('anonymous',$logged_in_dn)) { + foreach ($logged_in_dn_array as $rdn_piece) { + $href = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s',$ldapserver->server_id,rawurlencode($rdn)); + printf('%s',htmlspecialchars($href),pretty_print_dn($rdn_piece)); + + if ($rdn_piece != end($logged_in_dn_array)) + echo ','; + + $rdn = substr($rdn,(1 + strpos($rdn,','))); + } + + } else { + echo 'Anonymous'; + } + + echo ''; + } + + /** + * Recursively descend on the given dn and draw the tree in html + * + * @param dn $dn Current dn. + * @param int $level Level to start drawing (start to -1) + */ + protected function draw_dn($dn,$level) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s,%s)',33,__FILE__,__LINE__,__METHOD__,$dn,$level); + + $ldapserver = $this->getLdapServer(); + + $dnEntry = $this->getEntry($dn); + if (!$dnEntry) { + $this->addEntry($dn); + $dnEntry = $this->getEntry($dn); + } + if (!$dnEntry) + return; + + $encoded_dn = rawurlencode($dn); + $href['expand'] = sprintf('cmd.php?cmd=expand&server_id=%s&dn=%s',$ldapserver->server_id,$encoded_dn); + $href['collapse'] = sprintf('cmd.php?cmd=collapse&server_id=%s&dn=%s',$ldapserver->server_id,$encoded_dn); + $href['edit'] = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s',$ldapserver->server_id,$encoded_dn); + $img_src = sprintf('images/%s',$dnEntry->getIcon($ldapserver)); + $rdn = get_rdn($dn); + + echo ''; + $colspan = $this->getDepth()+3+$level+1; + + for ($i=0;$i<=$level;$i++) { + echo ''; + $colspan--; + } + + # Shall we draw the "mass-delete" checkbox? + if ($ldapserver->isMassDeleteEnabled()) { + printf('',htmlspecialchars($dn)); + } else { + echo ''; + } + $colspan--; + + $child_count = $this->get_children_number($dnEntry); + + # Is this node expanded? (deciding whether to draw "+" or "-") + if ($dnEntry->isOpened()) { + if (!$child_count && !$ldapserver->isShowCreateEnabled()) { + echo '-'; + } else { + printf('-',$href['collapse']); + } + } else { + if (($child_count !== false) && (!$child_count) && (!$ldapserver->isShowCreateEnabled())) { + echo '-'; + } else { + printf('+',$href['expand']); + } + } + $colspan--; + + printf('img',$href['edit'],$ldapserver->server_id,$encoded_dn,$img_src); + $colspan--; + + printf('',$colspan); + printf('%s',$href['edit'],$this->get_formatted_dn($dnEntry,$level)); + + if ($child_count) + printf(' (%s)',$child_count); + + echo ''; + + if ($dnEntry->isOpened()) { + /* Draw the "create new" link at the top of the tree list if there are more than 10 + * entries in the listing for this node. + */ + if (!$ldapserver->isReadOnly() && ($dnEntry->getChildrenNumber() > 10) + && ($ldapserver->isShowCreateEnabled())) { + + $this->draw_create_link($ldapserver->server_id,$rdn,$level,$encoded_dn); + } + + foreach ($dnEntry->getChildren() as $dnChildEntry) + $this->draw_dn($dnChildEntry,$level+1); + + # Always draw the "create new" link at the bottom of the listing + if (!$ldapserver->isReadOnly() && !$dnEntry->isLeaf() && $ldapserver->isShowCreateEnabled()) { + $this->draw_create_link($ldapserver->server_id,$rdn,$level,$encoded_dn); + } + } + + if (DEBUG_ENABLED) + debug_log('Leaving (%s,%s)',33,__FILE__,__LINE__,__METHOD__,$dn,$level); + } + + protected function get_formatted_dn($entry,$level) { + if ($level < 0) return pretty_print_dn($entry->getDn()); + else return draw_formatted_dn($this->getLdapServer(),$entry); + } + + protected function get_children_number($entry) { + if ($entry->isOpened()) { + $child_count = $entry->getChildrenNumber(true); + + if ($entry->isSizeLimited()) { + $child_count .= '...'; + } + + return $child_count; + + } else { + if ($this->getLdapServer()->isLowBandwidth()) { + return false; + + } else { + $child_count = $entry->getChildrenNumber(); + + if ($entry->isSizeLimited()) { + $child_count .= '+'; + } + + return $child_count; + } + } + } + + /** + * Print the HTML to show the "create new entry here". + * + * @param int $server_id + * @param dn $rdn + * @param int $level + * @param dn $encoded_dn + */ + protected function draw_create_link($server_id,$rdn,$level,$encoded_dn) { + # print the "Create New object" link. + $href = htmlspecialchars(sprintf('cmd.php?cmd=template_engine&server_id=%s&container=%s',$server_id,$encoded_dn)); + + echo ''; + for ($i=0;$i<=$level;$i++) + echo ''; + + echo ''; + echo ''; + printf('%s',$href,_('new')); + printf('%s', + $this->getDepth()+3-$level-1-3,$href,_('Create a new entry in'),$rdn,_('Create new entry here')); + echo ''; + } + + protected function draw_login_link() { + global $recently_timed_out_servers; + + $ldapserver = $this->getLdapServer(); + + $href = htmlspecialchars( + sprintf('cmd.php?cmd=%s&server_id=%s',get_custom_file($ldapserver->server_id,'login_form',''),$ldapserver->server_id)); + + echo ''; + printf('%s',$href,_('login')); + printf('%s',$this->getDepth()+3-2,$href,_('Login').'...'); + echo ''; + + printf(' ',$this->getDepth()+3); + printf(' ',$this->getDepth()+3); + + # If the server recently timed out display the message + if (is_array($recently_timed_out_servers) && in_array($ldapserver->server_id,$recently_timed_out_servers)) + printf('%s', + $this->getDepth()+3-1,_('(Session timed out. Automatically logged out.)')); + } + + protected function draw_logout_link() { + $ldapserver = $this->getLdapServer(); + + if ($ldapserver->auth_type != 'config') { + printf('%s', + $this->getDepth()+3-1,get_custom_file($ldapserver->server_id,'logout',''),$ldapserver->server_id,_('logout')); + } + } + + protected function draw_javascript() { + if ($this->javascript) { + echo "\n"; + echo $this->javascript; + echo "\n"; + } + } + + /* + * Work out how deep the "opened" tree is. + */ + public function getDepth() { + $ldapserver = $this->getLdapServer(); + + static $depths = array(); + + if (! isset($depths[$ldapserver->server_id])) { + $max = 0; # BaseDN are open, so we start at 1. + + foreach ($this->entries as $dn) { + $basedepth = count(pla_explode_dn($ldapserver->getContainerParent($dn->getDn(),'/'))); + $depth = 0; + + //if ($dn->isOpened()) + $depth = count(pla_explode_dn($dn->getDn()))+1-$basedepth; + + if ($depth > $max) + $max = $depth; + } + + $depths[$ldapserver->server_id] = $max; + } + + return $depths[$ldapserver->server_id]; + } +} +?> diff --git a/lib/JpegAttribute.php b/lib/JpegAttribute.php new file mode 100644 index 0000000..238ef64 --- /dev/null +++ b/lib/JpegAttribute.php @@ -0,0 +1,12 @@ + diff --git a/lib/MultiLineAttribute.php b/lib/MultiLineAttribute.php new file mode 100644 index 0000000..860ed95 --- /dev/null +++ b/lib/MultiLineAttribute.php @@ -0,0 +1,37 @@ +rows = 0; + $this->cols = 0; + } + + public function getRows() { + return $this->rows; + } + + public function setRows($rows) { + $this->rows = $rows; + } + + public function getCols() { + return $this->cols; + } + + public function setCols($cols) { + $this->cols = $cols; + } +} +?> diff --git a/lib/ObjectClassAttribute.php b/lib/ObjectClassAttribute.php new file mode 100644 index 0000000..7af2567 --- /dev/null +++ b/lib/ObjectClassAttribute.php @@ -0,0 +1,13 @@ + diff --git a/lib/PLMTree.php b/lib/PLMTree.php new file mode 100644 index 0000000..bdc253f --- /dev/null +++ b/lib/PLMTree.php @@ -0,0 +1,169 @@ + size_limit. + */ + protected function draw_dn($dn,$level) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s,%s)',33,__FILE__,__LINE__,__METHOD__,$dn,$level); + + static $tm = null; + + if (! isset($tm)) { + $tm = new TreeMenu(); + $tm->setDirroot(JSDIR.'phplayersmenu/'); + $tm->setIcondir(HTDOCDIR.'/images/'); + $tm->setIconwww('images/'); + $tm->setImgwww(JSDIR.'phplayersmenu/menuimages/'); + } + + $tree_plm = $this->to_plm($dn,$level); + + $tm->setMenuStructureString($tree_plm); + $tm->parseStructureForMenu('pla_tree_'.$this->server_id); + $tm->setTreeMenuTheme(''); + $tm->newTreeMenu('pla_tree_'.$this->server_id); + + echo sprintf('%s',$this->getDepth()+3-1,$tm->getTreeMenu('pla_tree_'.$this->server_id)); + } + + protected function to_plm($dn,$level) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s,%s)',33,__FILE__,__LINE__,__METHOD__,$dn,$level); + + $ldapserver = $this->getLdapServer(); + + $dnEntry = $this->getEntry($dn); + if (!$dnEntry) { + $this->addEntry($dn); + $dnEntry = $this->getEntry($dn); + } + if (!$dnEntry) { + if (DEBUG_ENABLED) + debug_log('Returning (%s)',33,__FILE__,__LINE__,__METHOD__,''); + return ''; + } + + $encoded_dn = rawurlencode($dn); + $edit_href = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s',$this->server_id,$encoded_dn); + $rdn = get_rdn($dn); + + $dots = ''; + for ($i=0;$i<=$level+1;$i++) $dots .= '.'; + + # Have we tranversed this part of the tree yet? + if ($dnEntry->isOpened()) { + $child_count = $this->get_children_number($dnEntry); + $tree_plm = sprintf("%s|%s|%s|%s|%s|%s|%s\n", + $dots, + ($this->get_formatted_dn($dnEntry, $level)).($child_count ? ' ('.$child_count.')' : ''), + $edit_href, $this->get_formatted_title($dnEntry, $level), $dnEntry->getIcon($ldapserver), '', + ($dnEntry->isOpened() ? 1 : 0)); + + $tree_plm .= $this->get_plm_before_first_child($dnEntry, $level); + + foreach ($dnEntry->getChildren() as $dn) { + $tree_plm .= $this->to_plm($dn,$level+1); + } + + $tree_plm .= $this->get_plm_after_last_child($dnEntry, $level); + } else { + $child_count = $this->get_children_number($dnEntry); + + if ($child_count) { + $tree_plm = sprintf("%s|%s|%s|%s|%s|%s|%s|%s\n", + $dots, + ($this->get_formatted_dn($dnEntry, $level)).($child_count ? ' ('.$child_count.')' : ''), + $edit_href, $this->get_formatted_title($dnEntry, $level), $dnEntry->getIcon($ldapserver), '', + ($dnEntry->isOpened() ? 1 : 0), + $child_count); + } else { + $tree_plm = sprintf("%s|%s|%s|%s|%s|%s|%s|%s\n", + $dots, + ($this->get_formatted_dn($dnEntry, $level)), + $edit_href, $this->get_formatted_title($dnEntry, $level), $dnEntry->getIcon($ldapserver), '', + ($dnEntry->isOpened() ? 1 : 0), + $child_count === false ? 1 : 0); + } + } + + if (DEBUG_ENABLED) + debug_log('Returning (%s)',33,__FILE__,__LINE__,__METHOD__,$tree_plm); + + return $tree_plm; + } + + protected function get_formatted_title($entry, $level) { + return $entry->getDn(); + } + + protected function get_plm_before_first_child($entry, $level) { + $ldapserver = $this->getLdapServer(); + + $plm = ''; + + if (!$ldapserver->isReadOnly() && ($entry->getChildrenNumber() > 10) && ($ldapserver->isShowCreateEnabled())) { + $encoded_dn = rawurlencode($entry->getDn()); + $create_href = sprintf('cmd.php?cmd=template_engine&server_id=%s&container=%s', $ldapserver->server_id, $encoded_dn); + + $dots = '.'; + for ($i=0;$i<=$level+1;$i++) $dots .= '.'; + + $plm = sprintf("%s|%s|%s|%s|%s|%s|%s\n", + $dots, _('Create new entry here'), + $create_href, $entry->getDn(), 'star.png', '', 0); + } + + return $plm; + } + + protected function get_plm_after_last_child($entry, $level) { + $ldapserver = $this->getLdapServer(); + + $plm = ''; + + if (!$ldapserver->isReadOnly() && !$entry->isLeaf() && $ldapserver->isShowCreateEnabled()) { + $encoded_dn = rawurlencode($entry->getDn()); + $create_href = sprintf('cmd.php?cmd=template_engine&server_id=%s&container=%s', $ldapserver->server_id, $encoded_dn); + + $dots = '.'; + for ($i=0;$i<=$level+1;$i++) $dots .= '.'; + + $plm = sprintf("%s|%s|%s|%s|%s|%s|%s\n", + $dots, _('Create new entry here'), + $create_href, $entry->getDn(), 'star.png', '', 0); + } + + return $plm; + } +} +?> diff --git a/lib/PasswordAttribute.php b/lib/PasswordAttribute.php new file mode 100644 index 0000000..c21ac7e --- /dev/null +++ b/lib/PasswordAttribute.php @@ -0,0 +1,12 @@ + diff --git a/lib/RandomPasswordAttribute.php b/lib/RandomPasswordAttribute.php new file mode 100644 index 0000000..0b7dba1 --- /dev/null +++ b/lib/RandomPasswordAttribute.php @@ -0,0 +1,13 @@ + diff --git a/lib/SambaPasswordAttribute.php b/lib/SambaPasswordAttribute.php new file mode 100644 index 0000000..66ca244 --- /dev/null +++ b/lib/SambaPasswordAttribute.php @@ -0,0 +1,12 @@ + diff --git a/lib/SelectionAttribute.php b/lib/SelectionAttribute.php new file mode 100644 index 0000000..418fa87 --- /dev/null +++ b/lib/SelectionAttribute.php @@ -0,0 +1,41 @@ +selection = array(); + $this->multiple = false; + } + + public function addOption($value, $description) { + $this->selection["$value"] = $description; + } + + public function getOptionCount() { + return count($this->selection); + } + + public function getSelection() { + return $this->selection; + } + + public function isMultiple() { + return $this->multiple; + } + + public function setMultiple() { + $this->multiple = true; + } +} +?> diff --git a/lib/ShadowAttribute.php b/lib/ShadowAttribute.php new file mode 100644 index 0000000..45bf2d3 --- /dev/null +++ b/lib/ShadowAttribute.php @@ -0,0 +1,14 @@ + diff --git a/lib/TemplateCreatingEntry.php b/lib/TemplateCreatingEntry.php new file mode 100644 index 0000000..2ae7cbe --- /dev/null +++ b/lib/TemplateCreatingEntry.php @@ -0,0 +1,339 @@ +templates = array(); + $this->default_template = true; + $this->selected_template = ''; + } + + protected function readCreationTemplates() { + global $ldapserver; + + if ($this->templates) return; + if (DEBUG_ENABLED) + debug_log('Entered',1,__FILE__,__LINE__,__METHOD__,1); + + $this->templates = array(); + + # read the available templates + $template_xml = new Templates($ldapserver->server_id); + $all_templates = $template_xml->getCreationTemplates(); + if (!$all_templates) $all_templates = array(); + + foreach ($all_templates as $template_name => $template_attrs) { + # don't select hidden templates + if (isset($template_attrs['visible']) && (! $template_attrs['visible'])) { + if (DEBUG_ENABLED) + debug_log('The template %s is not visible.',1,__FILE__,__LINE__,__METHOD__,1,$template_name); + continue; + } + # don't select invalid templates + if (isset($template_attrs['invalid']) && $template_attrs['invalid']) { + if (DEBUG_ENABLED) + debug_log('The template %s is invalid [%s].',1,__FILE__,__LINE__,__METHOD__,1, + $template_name,isset($template_attrs['invalid_reason']) ? $template_attrs['invalid_reason'] : ''); + continue; + } + # finally add the template to the list + if (DEBUG_ENABLED) + debug_log('The template %s is available for the entry.',1,__FILE__,__LINE__,__METHOD__,1, + $template_name); + $this->templates[$template_name] = $template_attrs; + } + } + + public function addDefaultTemplate() { + $this->default_template = true; + } + + public function delDefaultTemplate() { + $this->default_template = false; + } + + public function hasDefaultTemplate() { + return $this->default_template; + } + + public function getAttributes() { + global $ldapserver; + + # we can use a static variable if there is only one instance of this class + static $attrs = null; + static $tmpl = ''; + + if (DEBUG_ENABLED) + debug_log('Entered',1,__FILE__,__LINE__,__METHOD__,1); + + if (!$this->selected_template) { + return parent::getAttributes(); + } elseif (!$attrs || ($this->selected_template != $tmpl)) { + $attrs = array(); + $tmpl = $this->selected_template; + + # The selected template + $selected_tmpl = isset($this->templates[$this->selected_template]) + ? $this->templates[$this->selected_template] + : array(); + + # The objectclasses of the entry to create + if (isset($selected_tmpl['objectclass'])) { + $ocs = $selected_tmpl['objectclass']; + if (is_string($ocs) && (strlen($ocs) > 0)) $ocs = array($ocs); + elseif (!$ocs) $ocs = array(); + + foreach ($ocs as $oc) $this->addObjectClass($oc); + } + + $template_attrs = isset($selected_tmpl['empty_attrs']) + ? $selected_tmpl['empty_attrs'] + : array(); + masort($template_attrs,'page,order',1); + + $attributefactoryclass = $_SESSION['plaConfig']->GetValue('appearance','attribute_factory'); + eval('$attribute_factory = new '.$attributefactoryclass.'();'); + + if ($this->objectClasses) { + $attribute = $attribute_factory->newAttribute('objectClass',$this->objectClasses); + $attribute->setEntry($this); + $attribute->setRequired(); + $attribute->hide(); + $attrs[] = $attribute; + } + + # Template attributes + foreach ($template_attrs as $attr => $params) { + if ($attr == 'objectClass') continue; + if (! is_array($params)) continue; + $vals = array(); + + if (isset($params['value'])) { + if (! is_array($params['value'])) + $params['value'] = array($params['value']); + $arr1 = array(); + foreach ($params['value'] as $id_parval => $parval) { + $arr2 = Templates::EvaluateDefault($ldapserver,$parval, + $this->getContainer(),null,null); + if (is_array($arr2)) $arr1 = array_merge($arr1,$arr2); + else $arr1[$id_parval] = $arr2; + } + $params['value'] = $arr1; + foreach ($arr1 as $default_value) { + $vals[] = $default_value; + } + } + + if (isset($params['option']) + || ( isset($params['type']) && (($params['type'] == 'select') || ($params['type'] == 'multiselect')) )) { + + if (! isset($params['option'])) $params['option'] = array(); + elseif (! is_array($params['option'])) $params['option'] = array($params['option']); + $arr1 = array(); + foreach ($params['option'] as $id_parval => $parval) { + $arr2 = Templates::EvaluateDefault($ldapserver,$parval, + $this->getContainer(),null,null); + + if (is_array($arr2)) $arr1 = array_merge($arr1,$arr2); + else $arr1[$id_parval] = $arr2; + } + $params['option'] = $arr1; + } + + if (!isset($params['type'])) $params['type'] = 'text'; + + if ($params['type'] != 'text' && $params['type'] != 'password' && $params['type'] != 'textarea' + && $params['type'] != 'multiselect' && $params['type'] != 'select') { + + eval('$attribute = $attribute_factory->new'.$params['type'].'Attribute($attr,$vals);'); + + } else if ($params['type'] == 'password') { + $attribute = $attribute_factory->newPasswordAttribute($attr,$vals); + + } elseif ($params['type'] == 'textarea') { + $attribute = $attribute_factory->newMultiLineAttribute($attr,$vals); + if (isset($params['rows']) && $params['rows']) { + $attribute->setRows($params['rows']); + } + if (isset($params['cols']) && $params['cols']) { + $attribute->setCols($params['cols']); + } + + } elseif (isset($params['option']) && is_array($params['option'])) { + $attribute = $attribute_factory->newSelectionAttribute($attr,$vals); + if ($params['type'] == 'multiselect') { + $attribute->setMultiple(); + } + foreach ($params['option'] as $key => $value) { + if (preg_match('/^_KEY:/',$key)) { + $key = preg_replace('/^_KEY:/','',$key); + } else { + $key = $value; + } + $attribute->addOption($key,$value); + } + + } else { + $attribute = $attribute_factory->newAttribute($attr,$vals); + } + + $attribute->setEntry($this); + + foreach ($params as $param_name => $param_value) { + switch ($param_name) { + case 'minvalnb': + $attribute->setMinValueCount($param_value); + break; + case 'maxvalnb': + $attribute->setMaxValueCount($param_value); + break; + case 'icon': + if ($param_value) $attribute->setIcon($param_value); + break; + case 'description': + if ($param_value) $attribute->setDescription($param_value); + break; + case 'display': + if ($param_value) $attribute->setFriendlyName($param_value); + break; + case 'hint': + if ($param_value) $attribute->setHint($param_value); + break; + case 'size': + if ($param_value) $attribute->setSize($param_value); + break; + case 'maxlength': + if ($param_value) $attribute->setMaxLength($param_value); + break; + case 'option': + case 'type': + case 'rows': + case 'cols': + case 'readonly': + case 'disable': + case 'hidden': + break; + default: + // page, post, spacer, onchange + $attribute->setProperty($param_name, $param_value); + break; + } + } + + if ($this->isReadOnly() + || (isset($params['readonly']) && $params['readonly']) + || (!isset($params['readonly']) && $ldapserver->isAttrReadOnly($attr))) { + + $attribute->setReadOnly(); + } + + # has the config.php or the template specified + # that this attribute is to be hidden or shown ? + if ((isset($params['disable']) && $params['disable']) + || (isset($params['hidden']) && $params['hidden']) + || (!isset($params['hidden']) && $ldapserver->isAttrHidden($attr))) { + + $attribute->hide(); + } + + if (isset($this->mustattrs[$attr])) { + $attribute->setRequired(); + } + + $attrs[] = $attribute; + } + + // hide attributes not in template + foreach ($this->mustattrs as $attr_name => $objectclasses) { + if (isset($template_attrs[$attr_name])) continue; + if ($attr_name == 'objectClass') continue; + $vals = array(); + + $attribute = $attribute_factory->newAttribute($attr_name,$vals); + $attribute->setEntry($this); + $attribute->setReadOnly(); + $attribute->setRequired(); + $attribute->hide(); // should not be hidden because it is required + $attrs[] = $attribute; + } + foreach ($this->mayattrs as $attr_name => $objectclasses) { + if (isset($template_attrs[$attr_name])) continue; + if ($attr_name == 'objectClass') continue; + $vals = array(); + + $attribute = $attribute_factory->newAttribute($attr_name,$vals); + $attribute->setEntry($this); + $attribute->setReadOnly(); + $attribute->hide(); + $attrs[] = $attribute; + } + } + + return $attrs; + } + + public function &getTemplates() { + $this->readCreationTemplates(); + return $this->templates; + } + + public function getTemplatesCount() { + $this->readCreationTemplates(); + return count($this->templates); + } + + public function setSelectedTemplateName($name) { + $this->readCreationTemplates(); + $this->setLeaf(false); + if (!$name || isset($this->templates[$name])) { + $this->selected_template = $name; + if (isset($this->templates[$name]['leaf']) && $this->templates[$name]['leaf']) + $this->setLeaf(true); + if (isset($this->templates[$name]['rdn']) && $this->templates[$name]['rdn']) + $this->setRdnAttributeName($this->templates[$name]['rdn']); + if (isset($this->templates[$name]['handler']) && $this->templates[$name]['handler']) + $this->setProperty('handler',$this->templates[$name]['handler']); + if (isset($this->templates[$name]['action']) && $this->templates[$name]['action']) + $this->setProperty('action',$this->templates[$name]['action']); + if (isset($this->templates[$name]['description']) && $this->templates[$name]['description']) + $this->setProperty('description',$this->templates[$name]['description']); + if (isset($this->templates[$name]['destinationcontainer'])) + $this->setContainer($this->templates[$name]['destinationcontainer']); + } + } + + public function getSelectedTemplateName() { + return $this->selected_template; + } + + public function setContainer($dn) { + parent::setContainer($dn); + + $this->readCreationTemplates(); + foreach ($this->templates as $template_name => $template_attrs) { + # check the template filter + if (isset($template_attrs['regexp'])) { + if (! @preg_match('/'.$template_attrs['regexp'].'/i',$dn)) { + if (DEBUG_ENABLED) + debug_log('The container %s doesn\'t match the template %s regexp',1,__FILE__,__LINE__,__METHOD__, + $dn,$template_name); + $this->templates[$template_name]['invalid'] = true; + } + } + } + } +} +?> diff --git a/lib/TemplateEditingEntry.php b/lib/TemplateEditingEntry.php new file mode 100644 index 0000000..8a22829 --- /dev/null +++ b/lib/TemplateEditingEntry.php @@ -0,0 +1,317 @@ +templates = array(); + $this->valid = false; + $this->default_template = false; + $this->selected_template = ''; + } + + protected function readEditingTemplates() { + global $ldapserver; + + if (DEBUG_ENABLED) + debug_log('TemplateEditingEntry::readEditingTemplates()',1); + + if ($this->valid) { + if (DEBUG_ENABLED) + debug_log('TemplateEditingEntry::readEditingTemplates() : all templates [%s] are valid',1,count($this->templates)); + return; + } + + $this->templates = array(); + $this->valid = true; + + # read the available templates + $template_xml = new Templates($ldapserver->server_id); + $all_templates = $template_xml->getEditingTemplates(); + if (!$all_templates) $all_templates = array(); + + foreach ($all_templates as $template_name => $template_attrs) { + # don't select hidden templates + if (isset($template_attrs['visible']) && (! $template_attrs['visible'])) { + if (DEBUG_ENABLED) debug_log('TemplateEditingEntry::readEditingTemplates() : the template %s is not visible',1,$template_name); + continue; + } + # don't select invalid templates + if (isset($template_attrs['invalid']) && $template_attrs['invalid']) { + if (DEBUG_ENABLED) debug_log('TemplateEditingEntry::readEditingTemplates() : the template %s is invalid [%s]',1,$template_name,isset($template_attrs['invalid_reason']) ? $template_attrs['invalid_reason'] : ''); + $this->valid = false; + continue; + } + # check the template filter + if (isset($template_attrs['regexp'])) { + if (! @preg_match('/'.$template_attrs['regexp'].'/i',$this->getDn())) { + if (DEBUG_ENABLED) debug_log('TemplateEditingEntry::readEditingTemplates() : the entry dn doesn\'t match the template %s regexp',1,$template_name); + continue; + } + } + # finally add the template to the list + if (DEBUG_ENABLED) debug_log('TemplateEditingEntry::readEditingTemplates() : the template %s is available for the entry',1,$template_name); + $this->templates[$template_name] = $template_attrs; + } + } + + public function addDefaultTemplate() { + $this->default_template = true; + } + + public function delDefaultTemplate() { + $this->default_template = false; + } + + public function hasDefaultTemplate() { + return $this->default_template; + } + + public function getAttributes() { + global $ldapserver; + + static $tmpl = array(); + static $attrs = array(); + $dn = $this->getDn(); + + if (DEBUG_ENABLED) debug_log('%s[%s]::getAttributes()',1,get_class($this),$dn); + + if (!$this->selected_template) { + return parent::getAttributes(); + } elseif (!isset($attrs[$dn]) || !isset($tmpl[$dn]) || ($this->selected_template != $tmpl[$dn])) { + $attrs[$dn] = array(); + $tmpl[$dn] = $this->selected_template; + + $attributefactoryclass = $_SESSION['plaConfig']->GetValue('appearance','attribute_factory'); + eval('$attribute_factory = new '.$attributefactoryclass.'();'); + + $int_attrs_vals = $ldapserver->getDNSysAttrs($this->getDn()); + if (! $int_attrs_vals) $attrs_vals = array(); + elseif (! is_array($int_attrs_vals)) $int_attrs_vals = array($attrs_vals); + + $attrs_vals = $ldapserver->getDNAttrs($this->getDn(),false,$_SESSION['plaConfig']->GetValue('deref','view')); + if (! $attrs_vals) $attrs_vals = array(); + elseif (! is_array($attrs_vals)) $attrs_vals = array($attrs_vals); + + $attrs_vals = array_merge($attrs_vals,$int_attrs_vals); + + $selected_tmpl = isset($this->templates[$this->selected_template]) + ? $this->templates[$this->selected_template] + : array(); + $template_attrs = isset($selected_tmpl['empty_attrs']) + ? $selected_tmpl['empty_attrs'] + : array(); + masort($template_attrs,'page,order',1); + + $objectclasses = null; + + // template attributes + foreach ($template_attrs as $attr => $params) { + $vals = (isset($attrs_vals[$attr]) && $attrs_vals[$attr]) ? $attrs_vals[$attr] : array(); + if (! is_array($vals)) $vals = array($vals); + + if (isset($params['option']) + || ( isset($params['type']) && (($params['type'] == 'select') || ($params['type'] == 'multiselect')) )) { + + if (! isset($params['option'])) $params['option'] = array(); + elseif (! is_array($params['option'])) $params['option'] = array($params['option']); + + $arr1 = array(); + foreach ($params['option'] as $id_parval => $parval) { + $arr2 = Templates::EvaluateDefault($ldapserver,$parval,$this->getDn(),null,null); + if (is_array($arr2)) $arr1 = array_merge($arr1,$arr2); + else $arr1[$id_parval] = $arr2; + } + $params['option'] = $arr1; + } + + if (!isset($params['type'])) $params['type'] = 'text'; + + if ($params['type'] != 'text' && $params['type'] != 'password' && $params['type'] != 'textarea' + && $params['type'] != 'multiselect' && $params['type'] != 'select') { + + eval('$attribute = $attribute_factory->new'.$params['type'].'Attribute($attr,$vals);'); + + } else if ($params['type'] == 'password') { + $attribute = $attribute_factory->newPasswordAttribute($attr,$vals); + + } elseif ($params['type'] == 'textarea') { + $attribute = $attribute_factory->newMultiLineAttribute($attr,$vals); + + if (isset($params['rows']) && $params['rows']) { + $attribute->setRows($params['rows']); + } + + if (isset($params['cols']) && $params['cols']) { + $attribute->setCols($params['cols']); + } + + } elseif (isset($params['option']) && is_array($params['option'])) { + $attribute = $attribute_factory->newSelectionAttribute($attr,$vals); + + if ($params['type'] == 'multiselect') { + $attribute->setMultiple(); + } + + foreach ($params['option'] as $key => $value) { + if (preg_match('/^_KEY:/',$key)) { + $key = preg_replace('/^_KEY:/','',$key); + } else { + $key = $value; + } + $attribute->addOption($key,$value); + } + + } else { + $attribute = $attribute_factory->newAttribute($attr,$vals); + } + + if ($attr == 'objectClass') $objectclasses = $attribute->getValues(); + $attribute->setEntry($this); + + if (isset($int_attrs_vals[$attr])) { + $attribute->setInternal(); + } + + foreach ($params as $param_name => $param_value) { + switch ($param_name) { + case 'minvalnb': + $attribute->setMinValueCount($param_value); + break; + case 'maxvalnb': + $attribute->setMaxValueCount($param_value); + break; + case 'icon': + if ($param_value) $attribute->setIcon($param_value); + break; + case 'description': + if ($param_value) $attribute->setDescription($param_value); + break; + case 'display': + if ($param_value) $attribute->setFriendlyName($param_value); + break; + case 'hint': + if ($param_value) $attribute->setHint($param_value); + break; + case 'size': + if ($param_value) $attribute->setSize($param_value); + break; + case 'maxlength': + if ($param_value) $attribute->setMaxLength($param_value); + break; + case 'option': + case 'type': + case 'rows': + case 'cols': + case 'readonly': + case 'disable': + case 'hidden': + break; + default: + # page, post, spacer, onchange + $attribute->setProperty($param_name,$param_value); + break; + } + } + + if ($this->isReadOnly() + || (isset($params['readonly']) && $params['readonly']) + || (!isset($params['readonly']) && $ldapserver->isAttrReadOnly($attr))) { + $attribute->setReadOnly(); + } + + # has the config.php or the template specified + # that this attribute is to be hidden or shown ? + if ((isset($params['disable']) && $params['disable']) + || (isset($params['hidden']) && $params['hidden']) + || (!isset($params['hidden']) && $ldapserver->isAttrHidden($attr))) { + $attribute->hide(); + } + + $attrs[$dn][] = $attribute; + } + + # Hidden attributes + foreach ($attrs_vals as $attr => $vals) { + if (isset($template_attrs[$attr])) continue; + + $attribute = $attribute_factory->newAttribute($attr,$vals); + $attribute->setEntry($this); + + if (isset($int_attrs_vals[$attr])) { + $attribute->setInternal(); + } + if ($attr == 'objectClass') { + $objectclasses = $attribute->getValues(); + } + + $attribute->setReadOnly(); + if (!$attribute->isInternal()) { # internal attributes are visible by default + $attribute->hide(); + } + $attrs[$dn][] = $attribute; + } + + # Required attributes + if ($objectclasses) { + $schema_oclasses = $ldapserver->SchemaObjectClasses(); + foreach ($objectclasses as $oclass) { + $schema_oclass = $ldapserver->getSchemaObjectClass($oclass); + assert($schema_oclass); + + $mustattrs = $schema_oclass->getMustAttrs($schema_oclasses); + if (!$mustattrs) $mustattrs = array(); + if (!is_array($mustattrs)) $mustattrs = array($mustattrs); + + foreach ($mustattrs as $mustattr) { + foreach ($attrs[$dn] as $attr) { + if ($attr->getName() == $mustattr->getName()) { + $attr->setRequired(); + break; + } + } + } + } + } + } + + return $attrs[$dn]; + } + + public function &getTemplates() { + $this->readEditingTemplates(); + return $this->templates; + } + + public function getTemplatesCount() { + $this->readEditingTemplates(); + return count($this->templates); + } + + public function setSelectedTemplateName($name) { + $this->readEditingTemplates(); + $this->setLeaf(false); + if (!$name || isset($this->templates[$name])) { + $this->selected_template = $name; + if (isset($this->templates[$name]['leaf']) && $this->templates[$name]['leaf']) $this->setLeaf(true); + } + } + + public function getSelectedTemplateName() { + return $this->selected_template; + } +} +?> diff --git a/lib/TemplateEntryFactory.php b/lib/TemplateEntryFactory.php new file mode 100644 index 0000000..9f961be --- /dev/null +++ b/lib/TemplateEntryFactory.php @@ -0,0 +1,19 @@ + diff --git a/lib/Tree.php b/lib/Tree.php new file mode 100644 index 0000000..b71bd1e --- /dev/null +++ b/lib/Tree.php @@ -0,0 +1,206 @@ + Entry + protected $entries = array(); + + // list of entries which are not visible in the tree view + // array : dn -> (true|false) + protected $misses = array(); + + // ldap server id represented by this tree + protected $server_id = -1; + + protected function __construct($server_id) { + $this->server_id = $server_id; + } + + static public function getInstance($server_id) { + $tree = get_cached_item($server_id,'tree'); + if (!$tree) { + $ldapserver = $_SESSION['plaConfig']->ldapservers->Instance($server_id); + if (!$ldapserver) return null; + + $treeclass = $_SESSION['plaConfig']->GetValue('appearance','tree'); + eval('$tree = new '.$treeclass.'($server_id);'); + + foreach ($ldapserver->getBaseDN() as $baseDn) + if ($baseDn) + $tree->addEntry($baseDn); + + set_cached_item($server_id,'tree','null',$tree); + } + return $tree; + } + + public function getLdapServer() { + return $_SESSION['plaConfig']->ldapservers->Instance($this->server_id); + } + + /** + * This function will take the DN, convert it to lowercase and strip unnessary + * commas. This result will be used as the index for the tree object. + * Any display of a DN should use the object->dn entry, not the index. + * The reason we need to do this is because: + * uid=User A,ou=People,c=AU and + * uid=User B, ou=PeOpLe, c=au + * are infact in the same branch, but PLA will show them inconsistently. + */ + public function indexDN($dn) { + $index = strtolower(join(',',pla_explode_dn($dn))); + + if (DEBUG_ENABLED) + debug_log('Entered with (%s), Result (%s)',1,__FILE__,__LINE__,__METHOD__,$dn,$index); + + return $index; + } + + /** + * Add an entry in the tree view ; the entry is added in the + * children array of its parent + * + * The added entry is created using the factory class defined + * in $_SESSION['plaConfig']->custom->appearance['entry_factory'] + * + * @param $dn the dn of the entry to create + */ + public function addEntry($dn) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$dn); + + $ldapserver = $_SESSION['plaConfig']->ldapservers->Instance($this->server_id); + + # We need to convert the DN to lower case, to avoid any case problems and strip any unnessary spaces after commas. + $dnlower = $this->indexDN($dn); + + # If the parent entry is not in the tree, we add it + $bases = $ldapserver->getBaseDN(); + + if (! $bases) + $bases = array(''); + elseif (! is_array($bases)) + $bases = array($bases); + + if (DEBUG_ENABLED) + debug_log('Got BaseDNs (%s)',64,__FILE__,__LINE__,__METHOD__,$bases); + + $parent_entry = null; + if (! in_array_ignore_case($dn,$bases)) { + $parent_dn = get_container($dn); + + if (DEBUG_ENABLED) + debug_log('Parent DNs (%s)',64,__FILE__,__LINE__,__METHOD__,$parent_dn); + + if ($parent_dn) { + $parent_entry = $this->getEntry($parent_dn); + if (! $parent_entry) { + $this->addEntry($parent_dn); + $parent_entry = $this->getEntry($parent_dn); + } + } else { + if (DEBUG_ENABLED) + debug_log('NO parent, entry (%s) ignored.',64,__FILE__,__LINE__,__METHOD__,$dn); + } + } + + if (isset($this->entries[$dnlower])) + unset($this->entries[$dnlower]); + + # If this DN is in our miss list, we can remove it now. + if (isset($this->misses[$dnlower])) + unset($this->misses[$dnlower]); + + $entryfactoryclass = $_SESSION['plaConfig']->GetValue('appearance','entry_factory'); + eval('$entry_factory = new '.$entryfactoryclass.'();'); + if (DEBUG_ENABLED) + debug_log('New ENTRY (%s) for (%s).',64,__FILE__,__LINE__,__METHOD__,$dnlower,$dn); + $this->entries[$dnlower] = $entry_factory->newEditingEntry($dn); + + $this->entries[$dnlower]->setTree($this); + if ($ldapserver->isReadOnly()) + $this->entries[$dnlower]->setReadOnly(); + + # Update this DN's parent's children list as well. + if ($parent_entry) + $parent_entry->addChild($dn); + + if (DEBUG_ENABLED) + debug_log('Leaving (%s)',1,__FILE__,__LINE__,__METHOD__,$dn); + } + + /** + * Delete an entry from the tree view ; the entry is deleted from the + * children array of its parent + */ + public function delEntry($dn) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$dn); + + $dnlower = $this->indexDN($dn); + if (isset($this->entries[$dnlower])) unset($this->entries[$dnlower]); + + # Delete entry from parent's children as well. + $parent_dn = get_container($dn); + $parent_entry = $this->getEntry($parent_dn); + if ($parent_entry) $parent_entry->delChild($dn); + + # Might be worthwhile adding it to our miss list, while we are here. + $this->misses[$dnlower] = true; + } + + public function renameEntry($oldDn, $newDn) { + if (DEBUG_ENABLED) + debug_log('Entered with (%s,%s)',1,__FILE__,__LINE__,__METHOD__,$oldDn,$newDn); + + $olddnlower = $this->indexDN($oldDn); + $newdnlower = $this->indexDN($newDn); + + $this->entries[$newdnlower] = $this->entries[$olddnlower]; + unset($this->entries[$olddnlower]); + $this->entries[$newdnlower]->rename($newDn); + + # Might be worthwhile adding it to our miss list, while we are here. + $this->misses[$olddnlower] = true; + if (isset($this->misses[$newdnlower])) unset($this->misses[$newdnlower]); + + # Update the parent's children + $parent_dn = get_container($newDn); + $parent_entry = $this->getEntry($parent_dn); + if ($parent_entry) { + $parent_entry->delChild($oldDn); + $parent_entry->addChild($newDn); + } + } + + public function getEntry($dn) { + $dnlower = $this->indexDN($dn); + + if (isset($this->entries[$dnlower])) + return $this->entries[$dnlower]; + else + return null; + } + + public function isMissed($dn) { + $dnlower = $this->indexDN($dn); + + return isset($this->misses[$dnlower]) && $this->misses[$dnlower]; + } + + /** + * Displays the LDAP tree + */ + abstract public function draw(); +} +?> diff --git a/lib/Visitor.php b/lib/Visitor.php new file mode 100644 index 0000000..3e65035 --- /dev/null +++ b/lib/Visitor.php @@ -0,0 +1,67 @@ +'.$call); + + if (isset($r)) return $r; + else return; + + } elseif (DEBUG_ENABLED) { + debug_log('Doesnt exist param (%s,%s,%s)',1,__FILE__,__LINE__,__METHOD__,$method,$c,$fnct); + } + } +} +?> diff --git a/lib/blowfish.php b/lib/blowfish.php index 8d2199c..90f423d 100644 --- a/lib/blowfish.php +++ b/lib/blowfish.php @@ -1,5 +1,5 @@ - * @version $Revision: 1.3 $ + * @version $Revision: 1.4 $ * @since Horde 2.2 * @package horde.cipher */ @@ -26,7 +26,7 @@ class Horde_Cipher_blowfish { /* Pi Array */ - var $p = array( + public $p = array( 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89, 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, @@ -34,7 +34,7 @@ class Horde_Cipher_blowfish { 0x9216D5D9, 0x8979FB1B); /* S Boxes */ - var $s1 = array( + public $s1 = array( 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99, 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, @@ -99,7 +99,7 @@ class Horde_Cipher_blowfish { 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664, 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A); - var $s2 = array( + public $s2 = array( 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266, 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1, @@ -164,7 +164,7 @@ class Horde_Cipher_blowfish { 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340, 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20, 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7); - var $s3 = array( + public $s3 = array( 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068, 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF, @@ -229,7 +229,7 @@ class Horde_Cipher_blowfish { 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C, 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837, 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0); - var $s4 = array( + public $s4 = array( 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE, 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B, @@ -296,7 +296,7 @@ class Horde_Cipher_blowfish { 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6); /* The number of rounds to do */ - var $_rounds = 16; + public $_rounds = 16; /* Constructor */ function Cipher_blowfish($params = null) @@ -437,7 +437,14 @@ class Horde_Cipher_blowfish { $this->setKey($key); } - list($L, $R) = array_values(unpack('N*', $block)); + $unpack = unpack('N*', $block); + + if (! is_array($unpack)) + pla_error( + sprintf('BLOWFISH: decryptBock()
We expected unpack to produce an array, but instead it produced [%s]. This function was entered with (%s,%s). If you think that this is a bug, then please tell the PLA developers how you got here. You are using PLA [%s,%s]', + serialize($unpack),rawurlencode($block),$key,pla_version(),phpversion())); + + list($L, $R) = array_values($unpack); $L ^= $this->p[17]; $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[16]; diff --git a/lib/common.php b/lib/common.php index 0b6b41e..5dc98a6 100644 --- a/lib/common.php +++ b/lib/common.php @@ -1,5 +1,5 @@ For a PHP4 application, please use a 0.9.x version.'); - -/* Our custom error handler receives all error notices that pass the error_reporting() - level set above. */ +/* Turn on all notices and warnings. This helps us write cleaner code (we hope at least) + * Our custom error handler receives all error notices that pass the error_reporting() + * level set above. + */ set_error_handler('pla_error_handler'); # Disable error reporting until all our required functions are loaded. error_reporting(0); @@ -50,32 +95,91 @@ foreach ($pla_function_files as $file_name) { require_once realpath ($file_name); } -# Now read in config_default.php, which also reads in config.php +# Now read in config_default.php require_once realpath(LIBDIR.'config_default.php'); -ob_end_clean(); +if (ob_get_level()) ob_end_clean(); # We are now ready for error reporting. -error_reporting(E_DEBUG); +error_reporting(E_ALL); -/** - * At this point we have read all our additional function PHP files and our configuration. - */ +pla_session_start(); -# Check our custom variables. -$config->CheckCustom(); +# Check we have the correct version of the SESSION cache +if (isset($_SESSION['cache'])) { + if (!is_array($_SESSION[pla_session_id_init])) $_SESSION[pla_session_id_init] = array(); -if (pla_session_start()) - run_hook('post_session_init',array()); + if (!isset($_SESSION[pla_session_id_init]['version']) || !isset($_SESSION[pla_session_id_init]['config']) + || $_SESSION[pla_session_id_init]['version'] !== pla_version() + || $_SESSION[pla_session_id_init]['config'] != filemtime(CONFDIR.'config.php')) { + + $_SESSION[pla_session_id_init]['version'] = pla_version(); + $_SESSION[pla_session_id_init]['config'] = filemtime(CONFDIR.'config.php'); + + unset($_SESSION['cache']); + unset($_SESSION['plaConfig']); + + # Our configuration information has changed, so we'll redirect to index.php to get it reloaded again. + system_message(array( + 'title'=>_('Configuration cache stale.'), + 'body'=>_('Your configuration has been automatically refreshed.'), + 'type'=>'info')); + + $config_file = CONFDIR.'config.php'; + check_config($config_file); + + } else { + # Sanity check, specially when upgrading from a previous release. + foreach (array_keys($_SESSION['cache']) as $id) + if (isset($_SESSION['cache'][$id]['tree']['null']) && ! is_object($_SESSION['cache'][$id]['tree']['null'])) + unset($_SESSION['cache'][$id]); + } +} + +# If we came via index.php, then set our $config. +if (! isset($_SESSION['plaConfig']) && isset($config)) + $_SESSION['plaConfig'] = $config; + +# If we get here, and plaConfig is not set, then redirect the user to the index. +if (! isset($_SESSION['plaConfig'])) { + header('Location: index.php'); + die(); + +} else { + # Check our custom variables. + # @todo: Change this so that we dont process a cached session. + $_SESSION['plaConfig']->CheckCustom(); +} + +# If we are here, $_SESSION is set - so enabled DEBUGing if it has been configured. +if (($_SESSION['plaConfig']->GetValue('debug','syslog') || $_SESSION['plaConfig']->GetValue('debug','file')) + && $_SESSION['plaConfig']->GetValue('debug','level')) + define('DEBUG_ENABLED',1); +else + define('DEBUG_ENABLED',0); + +# Since DEBUG_ENABLED is set later, as $config may not be set, we'll +if (DEBUG_ENABLED) + debug_log('PLA (%s) initialised and starting with (%s).',1,pla_version(),$_REQUEST); + +# Set our PHP timelimit. +if ($_SESSION['plaConfig']->GetValue('session','timelimit')) + set_time_limit($_SESSION['plaConfig']->GetValue('session','timelimit')); + +# If debug mode is set, increase the time_limit, since we probably need it. +if (DEBUG_ENABLED && $_SESSION['plaConfig']->GetValue('session','timelimit')) + set_time_limit($_SESSION['plaConfig']->GetValue('session','timelimit') * 5); + +# @todo: Change this so that we dont process a cached session. +$_SESSION['plaConfig']->friendly_attrs = process_friendly_attr_table(); /* * Language configuration. Auto or specified? * Shall we attempt to auto-determine the language? */ -$language = $config->GetValue('appearance','language'); +$language = $_SESSION['plaConfig']->GetValue('appearance','language'); if ($language == 'auto') { - # Make sure their browser correctly reports language. If not, skip this. if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { @@ -131,20 +235,10 @@ if ($language == 'auto') { bindtextdomain('messages',LANGDIR); bind_textdomain_codeset('messages','UTF-8'); textdomain('messages'); - header('Content-type: text/html; charset=UTF-8', true); + header('Content-type: text/html; charset=UTF-8',true); } } -# If config.php doesn't create the templates array, create it here. -if (! isset($templates) || ! is_array($templates)) - $templates = array(); - -# Always including the 'custom' template (the most generic and flexible) -$templates['custom'] = - array('desc' => 'Custom', - 'icon' => 'images/object.png', - 'handler' => 'custom.php'); - /* * Strip slashes from GET, POST, and COOKIE variables if this * PHP install is configured to automatically addslashes() @@ -157,45 +251,34 @@ if (get_magic_quotes_gpc() && (! isset($slashes_stripped) || ! $slashes_stripped $slashes_stripped = true; } +if (isset($_REQUEST['server_id'])) { + $ldapserver = $_SESSION['plaConfig']->ldapservers->Instance($_REQUEST['server_id']); +} else { + $ldapserver = $_SESSION['plaConfig']->ldapservers->Instance(null); +} + +# Test to see if we should log out the user due to the timeout. +if ($ldapserver->haveAuthInfo() && $ldapserver->auth_type != 'config') { + /* If time out value has been reached: + - log out user + - put $server_id in array of recently timed out servers */ + if (session_timed_out($ldapserver)) { + $timeout_url = 'cmd.php?cmd=timeout&server_id='.$ldapserver->server_id; + echo ''; + die(); + } +} + /* * Update $_SESSION['activity'] * for timeout and automatic logout feature */ -if (isset($_REQUEST['server_id'])) { - $ldapserver = $ldapservers->Instance($_REQUEST['server_id']); - if ($ldapserver->haveAuthInfo()) - set_lastactivity($ldapserver); -} +if ($ldapserver->haveAuthInfo()) + set_lastactivity($ldapserver); /** - * Timer stopwatch, used to instrument PLA + * At this point we have read all our additional function PHP files and our configuration. */ -function stopwatch() { - static $mt_previous = 0; +run_hook('post_session_init',array()); - list($usec, $sec) = explode(' ',microtime()); - $mt_current = (float)$usec + (float)$sec; - - if (! $mt_previous) { - $mt_previous = $mt_current; - return 0; - - } else { - $mt_diff = ($mt_current - $mt_previous); - $mt_previous = $mt_current; - return sprintf('%.5f',$mt_diff); - } -} - -/** - * This function will convert the browser two character language into the - * default 5 character language, where the country portion should NOT be - * assumed to be upper case characters of the first two characters. - */ -function auto_lang($lang) { - switch ($lang) { - case 'ja': return 'ja_JP'; - default: return sprintf('%s_%s',$lang,strtoupper($lang)); - } -} ?> diff --git a/lib/config_default.php b/lib/config_default.php index 10c5b98..a492b50 100644 --- a/lib/config_default.php +++ b/lib/config_default.php @@ -1,5 +1,5 @@ custom = new stdClass; $this->default = new stdClass; @@ -33,11 +45,16 @@ class Config { * Set to true if you want phpLDAPadmin to redirect anonymous * users to a search form with no tree viewer on the left after * logging in. + * @todo: With the new no-frames PLA, this code is broken, and needs to be fixed. */ $this->default->appearance['anonymous_bind_redirect_no_tree'] = array( 'desc'=>'Redirect user to search form if anonymous', 'default'=>false); + $this->default->appearance['compress'] = array( + 'desc'=>'Compress Output', + 'default'=>false); + $this->default->appearance['date'] = array( 'desc'=>'Date format whenever dates are shown', 'default'=>'%A %e %B %Y'); @@ -50,9 +67,9 @@ class Config { 'desc'=>'Array of attributes that should show a the time when showing the jscalendar', 'default'=>array('')); - $this->default->appearance['hide_configuration_management'] = array( - 'desc'=>'Hide the Sourceforge related links', - 'default'=>false); + $this->default->appearance['hide_debug_info'] = array( + 'desc'=>'Hide the features that may provide sensitive debugging information to the browser', + 'default'=>true); /** Language * The language setting. If you set this to 'auto', phpLDAPadmin will @@ -65,21 +82,13 @@ class Config { 'desc'=>'Language', 'default'=>'auto'); - /** Mass Delete - * Set to true if you want to draw a checkbox next to each entry in the tree viewer - * to be able to delete multiple entries at once - */ - $this->default->appearance['mass_delete'] = array( - 'desc'=>'Enable mass delete in tree viewer', - 'default'=>false); - /** * If you want certain attributes to be editable as multi-line, include them in this list * A multi-line textarea will be drawn instead of a single-line text field */ $this->default->appearance['multi_line_attributes'] = array( 'desc'=>'Attributes to show as multiline attributes', - 'default'=>array("postalAddress","homePostalAddress","personalSignature")); + 'default'=>array('postalAddress','homePostalAddress','personalSignature','description','mailReplyText')); /** * A list of syntax OIDs which support multi-line attribute values: @@ -88,9 +97,9 @@ class Config { 'desc'=>'Attributes to show as multiline attributes', 'default'=>array( // octet string syntax OID: - "1.3.6.1.4.1.1466.115.121.1.40", + '1.3.6.1.4.1.1466.115.121.1.40', // postal address syntax OID: - "1.3.6.1.4.1.1466.115.121.1.41")); + '1.3.6.1.4.1.1466.115.121.1.41')); /** Obfuscate Password * If true, display all password hash values as "******". Note that clear-text @@ -116,13 +125,27 @@ class Config { 'desc'=>'Show a additional create link on the top of the list if there are more than 10 entries', 'default'=>true); + /* + * What to do after entry creation : + * 2 : display the creation form again + * 1 : display the new created entry + * 0 : display the choice between 1 and 2 + */ + $this->default->appearance['action_after_creation'] = array( + 'desc'=>'Display the new created entry', + 'default'=>1); + $this->default->appearance['show_schema_link'] = array( 'desc'=>'Show the schema link for each attribute', 'default'=>true); $this->default->appearance['show_attribute_notes'] = array( 'desc'=>'Show notes for each attribute', - 'default'=>true); + 'default'=>true); + + $this->default->appearance['stylesheet'] = array( + 'desc'=>'Style sheet to use', + 'default'=>'style.css'); /** Tree display * A format string used to display enties in the tree viewer (left-hand side) @@ -153,10 +176,6 @@ class Config { 'desc'=>'Pixel width of the left frame view (tree browser)', 'default'=>320); - $this->default->appearance['tree_plm'] = array( - 'desc'=>'Whether to enable the PHPLayersMenu for the tree', - 'default'=>false); - /** * Tree display filter * LDAP filter used to search entries for the tree viewer (left-hand side) @@ -165,6 +184,26 @@ class Config { 'desc'=>'LDAP search filter for the tree entries', 'default'=>'(objectClass=*)'); + $this->default->appearance['tree'] = array( + 'desc'=>'Class name which inherits from Tree class and implements the draw() method', + 'default'=>'HTMLTree'); + + $this->default->appearance['entry_factory'] = array( + 'desc'=>'Class name which inherits from EntryFactory class', + 'default'=>'TemplateEntryFactory'); + + $this->default->appearance['attribute_factory'] = array( + 'desc'=>'Class name which inherits from AttributeFactory class', + 'default'=>'AttributeFactory'); + + $this->default->appearance['entry_reader'] = array( + 'desc'=>'Class name which inherits from EntryReader class', + 'default'=>'EntryReader'); + + $this->default->appearance['entry_writer'] = array( + 'desc'=>'Class name which inherits from EntryWriter class', + 'default'=>'EntryWriter1'); + /** Caching */ $this->default->cache['schema'] = array( @@ -179,19 +218,56 @@ class Config { 'desc'=>'Cache Browser Tree', 'default'=>true); + /** + * Define command availability ; if the value of a command is true, + * the command will be available. + */ + $this->default->commands['all'] = array( + 'desc'=>'Define command availability', + 'default'=> array( + 'home' => true, + 'external_links' => array('feature' => true, + 'bug' => true, + 'donation' => true, + 'help' => true, + 'credits' => true), + 'purge' => true, + 'schema' => true, + 'import' => true, + 'export' => true, + 'logout' => true, + 'search' => array('simple_search' => true, + 'predefined_search' => true, + 'advanced_search' => true), + 'server_refresh' => true, + 'server_info' => true, + 'entry_refresh' => true, + 'entry_move' => true, + 'entry_internal_attributes_show' => true, + 'entry_delete' => array('simple_delete' => true, + 'mass_delete' => false), + 'entry_rename' => true, + 'entry_compare' => true, + 'entry_create' => true, + 'attribute_add' => true, + 'attribute_add_value' => true, + 'attribute_delete' => true, + 'attribute_delete_value' => true + )); + /** Aliases and Referrrals * Similar to ldapsearch's -a option, the following options allow you to configure * how phpLDAPadmin will treat aliases and referrals in the LDAP tree. * For the following four settings, avaialable options include: * - * LDAP_DEREF_NEVER - aliases are never dereferenced (eg, the contents of - * the alias itself are shown and not the referenced entry). - * LDAP_DEREF_SEARCHING - aliases should be dereferenced during the search but - * not when locating the base object of the search. - * LDAP_DEREF_FINDING - aliases should be dereferenced when locating the base - * object but not during the search. - * LDAP_DEREF_ALWAYS - aliases should be dereferenced always (eg, the contents - * of the referenced entry is shown and not the aliasing entry) + * LDAP_DEREF_NEVER - aliases are never dereferenced (eg, the contents of + * the alias itself are shown and not the referenced entry). + * LDAP_DEREF_SEARCHING - aliases should be dereferenced during the search but + * not when locating the base object of the search. + * LDAP_DEREF_FINDING - aliases should be dereferenced when locating the base + * object but not during the search. + * LDAP_DEREF_ALWAYS - aliases should be dereferenced always (eg, the contents + * of the referenced entry is shown and not the aliasing entry) */ @$this->default->deref['export'] = array( 'desc'=>'', @@ -222,6 +298,14 @@ class Config { 'desc'=>'Name of file to send debug output to', 'default'=>null); + $this->default->debug['addr'] = array( + 'desc'=>'IP address of PLA client to provide debugging info.', + 'default'=>null); + + $this->default->debug['append'] = array( + 'desc'=>'Whether to append to the debug file, or create it fresh each time', + 'default'=>true); + /** Temp Directories * This directory must be readable and writable by your web server */ @@ -291,6 +375,14 @@ class Config { 'desc'=>'Blowfish key to encrypt cookie details', 'default'=>null); + $this->default->session['memorylimit'] = array( + 'desc'=>'Set the PHP memorylimit warning threshold.', + 'default'=>24); + + $this->default->session['timelimit'] = array( + 'desc'=>'Set the PHP timelimit.', + 'default'=>30); + /** Cookie Time * If you used auth_type 'form' in the servers list, you can adjust how long the cookie will last * (default is 0 seconds, which expires when you close the browser) @@ -427,14 +519,42 @@ class Config { } } } + + /** + * The parameter number is variable. + * For example : isCommandAvailable('search', 'simple_search') + */ + public function isCommandAvailable() { + $a = func_get_args(); + if (count($a) == 1 && is_array($a[0])) + $a = $a[0]; + $i = 0; + + # Command availability list + $cmd = $this->GetValue('commands','all'); + # Search for the command + while ($i < count($a)) { + if (! is_array($cmd)) + return $cmd; + if (! isset($cmd[$a[$i]])) + return false; + + $cmd = $cmd[$a[$i]]; + $i++; + } + + # If this is a leaf command, return its availability + if (! is_array($cmd)) + return $cmd; + + # Else the command is available, if one of its sub-command is available + $a[] = ''; + foreach ($cmd as $c => $v) { + $a[$i] = $c; + if ($this->isCommandAvailable($a)) + return true; + } + return false; + } } - -# Define our configuration variable. -$config = new Config; -require (CONFDIR.'config.php'); - -if (($config->GetValue('debug','syslog') || $config->GetValue('debug','file')) && $config->GetValue('debug','level')) - define('DEBUG_ENABLED',1); -else - define('DEBUG_ENABLED',0); ?> diff --git a/lib/createlm.php b/lib/createlm.php index 9631cf4..e92eb4d 100644 --- a/lib/createlm.php +++ b/lib/createlm.php @@ -1,9 +1,9 @@ dohash($inb, $keyb, $forw); + $outb = $this->doHash($inb, $keyb, $forw); for ($i = 0; $i < 8; $i++) { $out[$i] = 0; } - for ($i = 0; $i < 65; $i++) { - if ( isset($outb[$i]) && $outb[$i] ) { + for ($i = 0; $i < 64; $i++) { + if ( $outb[$i] ) { $out[$i/8] |= (1<<(7-($i%8))); } } @@ -329,193 +329,7 @@ var $sbox = array(array(array(14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5 * @return string hash value */ function nthash($password = "") { - $password = substr($password,0,128); - $password2 = ""; - for ($i = 0; $i < strlen($password); $i++) $password2 .= $password[$i] . chr(0); - $password = $password2; - $hex = $this->mdfour($password); - for ($i = 0; $i < sizeof($hex); $i++) { - $hex[$i] = sprintf("%02X", $hex[$i]); - } - return join("", $hex); - } - - # Support functions - # Ported from SAMBA/source/lib/md4.c:F,G and H respectfully - function F($X, $Y, $Z) { - $ret = (($X&$Y) | ((~((int)$X))&$Z)); - if ($this->x($ret) > 4294967296) { - $ret = (2*4294967296) - $this->x($ret); - } - return $ret; - } - - function G($X, $Y, $Z) { - return ($X&$Y) | ($X&$Z) | ($Y&$Z); - } - - function H($X, $Y, $Z) { - return $X^$Y^$Z; - } - - # Ported from SAMBA/source/lib/md4.c:mdfour - function mdfour($in) { - $in = unpack("C*",$in); - $in = array_values($in); - $b = sizeof($in) * 8; - $A = array(0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476); - while (sizeof($in) > 64 ) { - $M = $this->copy64($in); - $this->mdfour64($A[0], $A[1], $A[2], $A[3], $M); - $new_in = array(); - for ($i = 64; $i < sizeof($in); $i++) $new_in[] = $in[$i]; - $in = $new_in; - } - $buf = $in; - $buf[] = 0x80; - for ($i = sizeof($buf) - 1; $i < 127; $i++) $buf[] = 0; - if ( sizeof($in) <= 55 ) { - $temp = $this->copy4($b); - $buf[56] = $temp[0]; - $buf[57] = $temp[1]; - $buf[58] = $temp[2]; - $buf[59] = $temp[3]; - $M = $this->copy64($buf); - $this->mdfour64($A[0], $A[1], $A[2], $A[3], $M); - } - else { - $temp = $this->copy4($b); - $buf[120] = $temp[0]; - $buf[121] = $temp[1]; - $buf[122] = $temp[2]; - $buf[123] = $temp[3]; - $M = $this->copy64($buf); - $this->mdfour64($A[0], $A[1], $A[2], $A[3], $M); - $temp = array(); - for ($i = 64; $i < sizeof($buf); $i++) $temp[] = $buf[$i]; - $M = $this->copy64($temp); - $this->mdfour64($A[0], $A[1], $A[2], $A[3], $M); - } - $out = array(); - $temp = $this->copy4($A[0]); - for ($i = 0; $i < 4; $i++) $out[] = $temp[$i]; - $temp = $this->copy4($A[1]); - for ($i = 0; $i < 4; $i++) $out[] = $temp[$i]; - $temp = $this->copy4($A[2]); - for ($i = 0; $i < 4; $i++) $out[] = $temp[$i]; - $temp = $this->copy4($A[3]); - for ($i = 0; $i < 4; $i++) $out[] = $temp[$i]; - return $out; - } - - # Ported from SAMBA/source/lib/md4.c:copy4 - function copy4($x) { - $out = array(); - $out[0] = $x&0xFF; - $out[1] = $this->unsigned_shift_r($x, 8)&0xFF; - $out[2] = $this->unsigned_shift_r($x, 16)&0xFF; - $out[3] = $this->unsigned_shift_r($x, 24)&0xFF; - return $out; - } - - # Ported from SAMBA/source/lib/md4.c:copy64 - function copy64($in) { - for ($i = 0; $i < 16; $i++) { - $M[$i] = ($in[$i*4+3]<<24) | ($in[$i*4+2]<<16) | ($in[$i*4+1]<<8) | ($in[$i*4+0]<<0); - } - return $M; - } - - # Ported from SAMBA/source/lib/md4.c:mdfour64 - function mdfour64(&$A, &$B, &$C, &$D, $M) { - $X = array(); - for ($i = 0; $i < 16; $i++) $X[] = $M[$i]; - $AA=$A; - $BB=$B; - $CC=$C; - $DD=$D; - $this->ROUND1($A,$B,$C,$D, 0, 3, $X); - $this->ROUND1($D,$A,$B,$C, 1, 7, $X); - $this->ROUND1($C,$D,$A,$B, 2, 11, $X); - $this->ROUND1($B,$C,$D,$A, 3, 19, $X); - $this->ROUND1($A,$B,$C,$D, 4, 3, $X); $this->ROUND1($D,$A,$B,$C, 5, 7, $X); - $this->ROUND1($C,$D,$A,$B, 6, 11, $X); $this->ROUND1($B,$C,$D,$A, 7, 19, $X); - $this->ROUND1($A,$B,$C,$D, 8, 3, $X); $this->ROUND1($D,$A,$B,$C, 9, 7, $X); - $this->ROUND1($C,$D,$A,$B, 10, 11, $X); $this->ROUND1($B,$C,$D,$A, 11, 19, $X); - $this->ROUND1($A,$B,$C,$D, 12, 3, $X); $this->ROUND1($D,$A,$B,$C, 13, 7, $X); - $this->ROUND1($C,$D,$A,$B, 14, 11, $X); $this->ROUND1($B,$C,$D,$A, 15, 19, $X); - $this->ROUND2($A,$B,$C,$D, 0, 3, $X); $this->ROUND2($D,$A,$B,$C, 4, 5, $X); - $this->ROUND2($C,$D,$A,$B, 8, 9, $X); $this->ROUND2($B,$C,$D,$A, 12, 13, $X); - $this->ROUND2($A,$B,$C,$D, 1, 3, $X); $this->ROUND2($D,$A,$B,$C, 5, 5, $X); - $this->ROUND2($C,$D,$A,$B, 9, 9, $X); $this->ROUND2($B,$C,$D,$A, 13, 13, $X); - $this->ROUND2($A,$B,$C,$D, 2, 3, $X); $this->ROUND2($D,$A,$B,$C, 6, 5, $X); - $this->ROUND2($C,$D,$A,$B, 10, 9, $X); $this->ROUND2($B,$C,$D,$A, 14, 13, $X); - $this->ROUND2($A,$B,$C,$D, 3, 3, $X); $this->ROUND2($D,$A,$B,$C, 7, 5, $X); - $this->ROUND2($C,$D,$A,$B, 11, 9, $X); $this->ROUND2($B,$C,$D,$A, 15, 13, $X); - $this->ROUND3($A,$B,$C,$D, 0, 3, $X); $this->ROUND3($D,$A,$B,$C, 8, 9, $X); - $this->ROUND3($C,$D,$A,$B, 4, 11, $X); $this->ROUND3($B,$C,$D,$A, 12, 15, $X); - $this->ROUND3($A,$B,$C,$D, 2, 3, $X); $this->ROUND3($D,$A,$B,$C, 10, 9, $X); - $this->ROUND3($C,$D,$A,$B, 6, 11, $X); $this->ROUND3($B,$C,$D,$A, 14, 15, $X); - $this->ROUND3($A,$B,$C,$D, 1, 3, $X); $this->ROUND3($D,$A,$B,$C, 9, 9, $X); - $this->ROUND3($C,$D,$A,$B, 5, 11, $X); $this->ROUND3($B,$C,$D,$A, 13, 15, $X); - $this->ROUND3($A,$B,$C,$D, 3, 3, $X); $this->ROUND3($D,$A,$B,$C, 11, 9, $X); - $this->ROUND3($C,$D,$A,$B, 7, 11, $X); $this->ROUND3($B,$C,$D,$A, 15, 15, $X); - - $A = $this->add32(array($A, $AA)); $B = $this->add32(array($B, $BB)); - $C = $this->add32(array($C, $CC)); $D = $this->add32(array($D, $DD)); - } - - # Needed? because perl seems to choke on overflowing when doing bitwise - # operations on numbers larger than 32 bits. Well, it did on my machine =) - function add32($v) { - $sum = array(); - for ($i = 0; $i < sizeof($v); $i++) { - $v[$i] = array($this->unsigned_shift_r(($v[$i]&0xffff0000), 16), ($v[$i]&0xffff)); - } - for ($i = 0; $i < sizeof($v); $i++) { - @$sum[0] += $v[$i][0]; - @$sum[1] += $v[$i][1]; - } - $sum[0] += ($sum[1]&0xffff0000)>>16; - $sum[1] &= 0xffff; - $sum[0] &= 0xffff; - $ret = ($sum[0]<<16) | $sum[1]; - if ($this->x($ret) > 4294967296) { - $ret = (2*4294967296) - $this->x($ret); - } - return $ret; - } - - # Ported from SAMBA/source/lib/md4.c:ROUND1 - function ROUND1(&$a,$b,$c,$d,$k,$s,$X) { - $a = $this->md4lshift($this->add32(array($a, $this->F($b,$c,$d), $X[$k])), $s); - return $a; - } - - # Ported from SAMBA/source/lib/md4.c:ROUND2 - function ROUND2(&$a,$b,$c,$d,$k,$s,$X) { - $a = $this->md4lshift($this->add32(array($a, $this->G($b,$c,$d), $X[$k] + 0x5A827999)), $s); - return $a; - } - - # Ported from SAMBA/source/lib/md4.c:ROUND3 - function ROUND3(&$a,$b,$c,$d,$k,$s,$X) { - $a = $this->md4lshift($this->add32(array($a + $this->H($b,$c,$d) + $X[$k] + 0x6ED9EBA1)), $s); - return $a; - } - - # Ported from SAMBA/source/lib/md4.c:lshift - # Renamed to prevent clash with SAMBA/source/libsmb/smbdes.c:lshift - function md4lshift($x, $s) { - $x &= 0xFFFFFFFF; - if ($this->x($x) > 4294967296) { - $x = (2*4294967296) - $this->x($x); - } - $ret = ((($x<<$s)&0xFFFFFFFF) | $this->unsigned_shift_r($x, (32-$s))); - if ($this->x($ret) > 4294967296) { - $ret = (2*4294967296) - $this->x($ret); - } - return $ret; + return strtoupper(bin2hex(hash('md4', iconv("UTF-8","UTF-16LE",$password),true))); } /** diff --git a/lib/export_functions.php b/lib/export_functions.php index af0ab42..b244f0e 100755 --- a/lib/export_functions.php +++ b/lib/export_functions.php @@ -1,5 +1,5 @@ ldapserver = $ldapservers->Instance($server_id); + $this->ldapserver = $_SESSION['plaConfig']->ldapservers->Instance($server_id); $this->ldapserver->base_dn = $base_dn; $this->ldapserver->query_filter = $query_filter; $this->ldapserver->scope = $scope; @@ -120,11 +118,11 @@ class PlaAbstractExporter { */ class PlaExporter extends PlaAbstractExporter { # Default CRLN - var $br = "\n"; + public $br = "\n"; # The wrapped $exporter - var $exporter; + public $exporter; - var $compress = false; + public $compress = false; /** * Constructor @@ -219,14 +217,14 @@ class PlaExporter extends PlaAbstractExporter { * @package phpLDAPadmin */ class PlaLdapExporter extends PlaAbstractExporter { - var $scope; - var $base_dn; - var $server_id; - var $queryFilter; - var $attributes; - var $ldap_info; - var $results; - var $num_entries; + public $scope; + public $base_dn; + public $server_id; + public $queryFilter; + public $attributes; + public $ldap_info; + public $results; + public $num_entries; /** * Create a PlaLdapExporter object. @@ -236,8 +234,6 @@ class PlaLdapExporter extends PlaAbstractExporter { * @param String $scope the scope for export */ function PlaLdapExporter($server_id,$queryFilter,$base_dn,$scope,$attributes) { - global $config; - $this->scope = $scope; $this->base_dn = $base_dn; $this->server_id = $server_id; @@ -249,7 +245,7 @@ class PlaLdapExporter extends PlaAbstractExporter { # get the data to be exported $this->results = $this->ldap_info->ldapserver->search(null,$this->base_dn,$this->queryFilter,$this->attributes, - $this->scope,true,$config->GetValue('deref','export')); + $this->scope,true,$_SESSION['plaConfig']->GetValue('deref','export')); # if no result, there is a something wrong if (! $this->results && $this->ldap_info->ldapserver->errno()) @@ -292,10 +288,10 @@ class PlaLdapExporter extends PlaAbstractExporter { */ class PlaLdifExporter extends PlaExporter { # variable to keep the count of the entries - var $counter = 0; + public $counter = 0; # the maximum length of the ldif line - var $MAX_LDIF_LINE_LENGTH = 76; + public $MAX_LDIF_LINE_LENGTH = 76; /** * Create a PlaLdifExporter object @@ -369,8 +365,8 @@ class PlaLdifExporter extends PlaExporter { $length_string = strlen($str); /* need to do minus one to align on the right - the first line with the possible following lines - as these will have an extra space. */ + * the first line with the possible following lines + * as these will have an extra space. */ $max_length = $this->MAX_LDIF_LINE_LENGTH-1; } $output .= $str.$this->br; @@ -385,7 +381,7 @@ class PlaLdifExporter extends PlaExporter { * @package phpLDAPadmin */ class PlaDsmlExporter extends PlaExporter { - var $counter = 0; + public $counter = 0; /** * Create a PlaDsmlExporter object @@ -478,7 +474,7 @@ class PlaDsmlExporter extends PlaExporter { */ class PlaVcardExporter extends PlaExporter { # mappping one to one attribute - var $vcardMapping = array('cn' => 'FN', + public $vcardMapping = array('cn' => 'FN', 'title' => 'TITLE', 'homePhone' => 'TEL;HOME', 'mobile' => 'TEL;CELL', @@ -492,7 +488,7 @@ class PlaVcardExporter extends PlaExporter { 'description' => 'NOTE' ); - var $deliveryAddress = array('postOfficeBox', + public $deliveryAddress = array('postOfficeBox', 'street', 'l', 'st', @@ -508,9 +504,9 @@ class PlaVcardExporter extends PlaExporter { * A basic implementation is provided here. Customize to your need **/ function export() { + $output = ''; # Sift through the entries. - foreach ($this->pla_results() as $dn => $dndetails) { - unset($dndetails['dn']); + foreach ($this->pla_results() as $id => $dndetails) { # check the attributes needed for the delivery address field $addr = 'ADR:'; @@ -522,7 +518,7 @@ class PlaVcardExporter extends PlaExporter { $addr .= ';'; } - $output = 'BEGIN:VCARD'.$this->br; + $output .= 'BEGIN:VCARD'.$this->br; # loop for the attributes foreach ($dndetails as $key => $attr) { @@ -530,11 +526,11 @@ class PlaVcardExporter extends PlaExporter { $attr = array($attr); /* if an attribute of the ldap entry exist - in the mapping array for vcard */ + * in the mapping array for vcard */ if (isset($this->vcardMapping[$key])) { /* case of organisation. Need to append the - possible ou attribute*/ + * possible ou attribute*/ if (strcasecmp($key ,'o') == 0) { $output .= sprintf('%s:%s',$this->vcardMapping[$key],$attr[0]); @@ -556,7 +552,7 @@ class PlaVcardExporter extends PlaExporter { } } - $output .= sprintf('UID:%s'."%s",$dn,$this->br); + $output .= sprintf('UID:%s'."%s",isset($dndetails['entryUUID']) ? $dndetails['entryUUID'] : $dndetails['dn'],$this->br); $output .= 'VERSION:2.1'.$this->br; $output .= $addr.$this->br; $output .= 'END:VCARD'.$this->br; @@ -584,10 +580,10 @@ class PlaCSVExporter extends PlaExporter { * When doing an exporter, the method export need to be overriden. * A basic implementation is provided here. Customize to your need **/ - var $separator = ','; - var $qualifier = '"'; - var $multivalue_separator = ' | '; - var $escapeCode = '"'; + public $separator = ','; + public $qualifier = '"'; + public $multivalue_separator = ' | '; + public $escapeCode = '"'; function export() { $entries = array(); @@ -596,8 +592,8 @@ class PlaCSVExporter extends PlaExporter { $ldap_info = $this->pla_get_ldap_info(); $output = ''; - /* go thru and find all the attribute names first. This is needed, because, otherwise we have - no idea as to which search attributes were actually populated with data */ + /* go thru and find all the attribute names first. This is needed, because, otherwise we have + * no idea as to which search attributes were actually populated with data */ foreach ($this->pla_results() as $dn => $dndetails) { foreach (array_keys($dndetails) as $key) { if (!in_array($key,$headers)) @@ -667,7 +663,7 @@ class PlaCSVExporter extends PlaExporter { } #end export /* function to escape data, where the qualifier happens to also - be in the data. */ + * be in the data. */ function LdapEscape ($var) { return str_replace($this->qualifier,$this->escapeCode.$this->qualifier,$var); } @@ -688,13 +684,13 @@ class MyCustomExporter extends PlaExporter { function export() { /* With the method pla->get_ldap_info, - you have access to some values related - to you ldap server */ + * you have access to some values related + * to you ldap server */ $ldap_info = $this->pla_get_ldap_info(); /* Just a simple loop. For each entry - do your custom export - see PlaLdifExporter or PlaDsmlExporter as an example */ + * do your custom export + * see PlaLdifExporter or PlaDsmlExporter as an example */ foreach ($this->pla_results() as $dn => $dndetails) { unset($dndetails['dn']); diff --git a/lib/functions.php b/lib/functions.php index 739e5ef..8c5651a 100644 --- a/lib/functions.php +++ b/lib/functions.php @@ -1,5 +1,5 @@ GetValue('appearance','obfuscate_password_display')) + if ($_SESSION['plaConfig']->GetValue('appearance','obfuscate_password_display')) $return = true; - elseif (! $config->GetValue('appearance','show_clear_password') && (is_null($enc) || $enc == 'clear')) + elseif (! $_SESSION['plaConfig']->GetValue('appearance','show_clear_password') && (is_null($enc) || $enc == 'clear')) $return = true; else $return = false; if (DEBUG_ENABLED) - debug_log('obfuscate_password_display(): Entered with (%s), Returning (%s)',1,$enc,$return); + debug_log('Entered with (%s), Returning (%s)',1,__FILE__,__LINE__,__METHOD__, + $enc,$return); return $return; } @@ -81,20 +95,27 @@ function obfuscate_password_display($enc=null) { * @param string $dn The DN to pretty-print. * @return string */ -function pretty_print_dn( $dn ) { +function pretty_print_dn($dn) { if (DEBUG_ENABLED) - debug_log('pretty_print_dn(): Entered with (%s)',1,$dn); + debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$dn); - if (! is_dn_string($dn)) - pla_error(sprintf(_('DN "%s" is not an LDAP distinguished name.'),htmlspecialchars($dn))); +# @todo: Disabled, as it is affecting the special chars being displayed. +# if (! is_dn_string($dn)) +# return $dn; - $dn = pla_explode_dn( $dn ); - foreach( $dn as $i => $element ) { + $dn_save = $dn; + $dn = pla_explode_dn($dn); + + if (! $dn) + return $dn_save; + + foreach ($dn as $i => $element) { $element = htmlspecialchars($element); $element = explode('=',$element,2); $element = implode('=',$element); $dn[$i] = $element; } + $dn = implode(',',$dn); return $dn; @@ -128,7 +149,7 @@ function is_dn_string($str) { if (! strpos($part,"=")) return false; - $sub_parts = explode("=",$part,2); + $sub_parts = explode('=',$part,2); $left = $sub_parts[0]; $right = $sub_parts[1]; @@ -196,13 +217,11 @@ function is_url_string($str) { * @return bool */ function pla_set_cookie( $name, $val, $expire=null, $dir=null ) { - global $config; - # Set default return $return = false; if ($expire == null) { - $cookie_time = $config->GetValue('session','cookie_time'); + $cookie_time = $_SESSION['plaConfig']->GetValue('session','cookie_time'); $expire = $cookie_time == 0 ? null : time() + $cookie_time; } @@ -230,12 +249,10 @@ function pla_set_cookie( $name, $val, $expire=null, $dir=null ) { * @return string The customized filename, if exists, or the standard one */ function get_custom_file($server_id,$filename,$path) { - global $ldapservers; - # Set default return $return = $path.$filename; - $custom = $ldapservers->GetValue($server_id,'custom','pages_prefix'); + $custom = $_SESSION['plaConfig']->ldapservers->GetValue($server_id,'custom','pages_prefix'); if (! is_null($custom) && is_file(realpath($path.$custom.$filename))) $return = $path.$custom.$filename; @@ -254,12 +271,10 @@ function get_custom_file($server_id,$filename,$path) { * @return any The result of the called function */ function call_custom_function( $server_id, $function ) { - global $ldapservers; - # Set default return $return = $function; - $custom = $ldapservers->GetValue($server_id,'custom','pages_prefix'); + $custom = $_SESSION['plaConfig']->ldapservers->GetValue($server_id,'custom','pages_prefix'); if (! is_null($custom) && function_exists($custom.$function)) $return = $custom.$filename; @@ -405,19 +420,17 @@ function get_next_number(&$ldapserver,$startbase='',$type='uid',$increment=false debug_log('get_next_number(): Entered with (%s,%s,%s,%s)',1, $ldapserver->server_id,$startbase,$type,$filter); - global $config,$ldapservers; - - if (! $ldapservers->GetValue($ldapserver->server_id,'auto_number','enable')) + if (! $_SESSION['plaConfig']->ldapservers->GetValue($ldapserver->server_id,'auto_number','enable')) return false; # Based on the configured mechanism, go get the next available uidNumber! - $mechanism = $ldapservers->GetValue($ldapserver->server_id,'auto_number','mechanism'); + $mechanism = $_SESSION['plaConfig']->ldapservers->GetValue($ldapserver->server_id,'auto_number','mechanism'); switch ($mechanism) { case 'search' : if (! $startbase) { - $base_dn = $ldapservers->GetValue($ldapserver->server_id,'auto_number','search_base'); + $base_dn = $_SESSION['plaConfig']->ldapservers->GetValue($ldapserver->server_id,'auto_number','search_base'); if (is_null($base_dn)) pla_error(sprintf(_('You specified the "auto_uid_number_mechanism" as "search" in your @@ -436,14 +449,14 @@ function get_next_number(&$ldapserver,$startbase='',$type='uid',$increment=false $results = array(); # Check see and use our alternate uid_dn and password if we have it. - $con = $ldapserver->connect(false,'auto_search',false, - $ldapservers->GetValue($ldapserver->server_id,'auto_number','dn'), - $ldapservers->GetValue($ldapserver->server_id,'auto_number','pass')); + $con = $ldapserver->connect(false,'auto_search',false,true, + $_SESSION['plaConfig']->ldapservers->GetValue($ldapserver->server_id,'auto_number','dn'), + $_SESSION['plaConfig']->ldapservers->GetValue($ldapserver->server_id,'auto_number','pass')); if (! $con) pla_error(sprintf(_('Unable to bind to %s with your with auto_uid credentials. Please check your configuration file.'),$ldapserver->name)); - $search = $ldapserver->search($con,$base_dn,$filter,array('uidNumber','gidNumber'),'sub',false,$config->GetValue('deref','search')); + $search = $ldapserver->search($con,$base_dn,$filter,array('uidNumber','gidNumber'),'sub',false,$_SESSION['plaConfig']->GetValue('deref','search')); if (! is_array($search)) pla_error('Untrapped error.'); @@ -486,8 +499,8 @@ function get_next_number(&$ldapserver,$startbase='',$type='uid',$increment=false $uid_hash[$uid] = 1; # start with the least existing autoNumber and add 1 - if ($ldapservers->GetValue($ldapserver->server_id,'auto_number','min')) - $minNumber = $ldapservers->GetValue($ldapserver->server_id,'auto_number','min'); + if ($_SESSION['plaConfig']->ldapservers->GetValue($ldapserver->server_id,'auto_number','min')) + $minNumber = $_SESSION['plaConfig']->ldapservers->GetValue($ldapserver->server_id,'auto_number','min'); else $minNumber = intval($autonum[0]) + 1; @@ -500,16 +513,16 @@ function get_next_number(&$ldapserver,$startbase='',$type='uid',$increment=false break; case 'uidpool': - $con = $ldapserver->connect(false,'auto_search',false, - $ldapservers->GetValue($ldapserver->server_id,'auto_number','dn'), - $ldapservers->GetValue($ldapserver->server_id,'auto_number','pass')); + $con = $ldapserver->connect(false,'auto_search',false,true, + $_SESSION['plaConfig']->ldapservers->GetValue($ldapserver->server_id,'auto_number','dn'), + $_SESSION['plaConfig']->ldapservers->GetValue($ldapserver->server_id,'auto_number','pass')); if (! $con) pla_error(sprintf(_('Unable to bind to %s with your with auto_uid credentials. Please check your configuration file.'),$ldapserver->name)); # assume that uidpool dn is set in config file if no filter given if (empty($filter)) - $uidpool_dn = $ldapservers->GetValue($ldapserver->server_id,'auto_number','uidpool_dn'); + $uidpool_dn = $_SESSION['plaConfig']->ldapservers->GetValue($ldapserver->server_id,'auto_number','uidpool_dn'); else { $filter = str_replace(array('&',':::'),array('&',','),$filter); @@ -534,26 +547,9 @@ function get_next_number(&$ldapserver,$startbase='',$type='uid',$increment=false if (empty($uidpool_dn)) pla_error(_('uidpool_dn not found. Please check filter (arg 3) or set up uidpool_dn in config file')); - switch ($type) { - case 'uid': - $attrs = array('sambaNextUserRid'); - $key = 'sambanextuserrid'; - $realkey = 'sambaNextUserRid'; - break; - - case 'gid': - $attrs = array('sambaNextGroupRid'); - $key = 'sambanextgrouprid'; - $realkey = 'sambaNextGroupRid'; - break; - - default: - // It might exists other attributes types... - $attrs = array($type); - $key = strtolower($type); - $realkey = $type; - break; - } + $attrs = array($type); + $key = strtolower($type); + $realkey = $type; $number = $ldapserver->search($con,$uidpool_dn,$filter,$attrs,'base'); list($rkey,$number) = each($number); @@ -812,11 +808,10 @@ function expand_dn_with_base( $base,$sub_dn ) { * automated method for setting up the initial structure for the tree viewer. */ function build_initial_tree() { - global $ldapservers; $return = array(); - foreach ($ldapservers->GetServerList() as $id) { - if (! trim($ldapservers->GetValue($id,'server','host'))) + foreach ($_SESSION['plaConfig']->ldapservers->GetServerList() as $id) { + if (! trim($_SESSION['plaConfig']->ldapservers->GetValue($id,'server','host'))) continue; $return[$id] = array(); @@ -858,12 +853,10 @@ function get_cleaned_up_predefined_search($query_id) { if (DEBUG_ENABLED) debug_log('get_cleaned_up_predefined_search(): Entered with (%s)',1,$query_id); - global $queries; - - if (! isset($queries[$query_id])) + if (! isset($_SESSION['plaConfig']->queries[$query_id])) return null; - $query = $queries[$query_id]; + $query = $_SESSION['plaConfig']->queries[$query_id]; $base = (isset($query['base'])) ? $query['base'] : null; @@ -930,18 +923,21 @@ function random_salt( $length ) { * @return string The RDN * @see get_container */ -function get_rdn($dn,$include_attrs=0) { +function get_rdn($dn,$include_attrs=0,$decode=false) { if (DEBUG_ENABLED) - debug_log('get_rdn(): Entered with (%s,%s)',1,$dn,$include_attrs); + debug_log('Entered with (%s,%s,%s)',1,__FILE__,__LINE__,__METHOD__,$dn,$include_attrs,$decode); - if( $dn == null ) + if (is_null($dn)) return null; $rdn = pla_explode_dn($dn,$include_attrs); if (! count($rdn) || ! isset($rdn[0])) return $dn; - $rdn = $rdn[0]; + if ($decode) + $rdn = dn_unescape($rdn[0]); + else + $rdn = $rdn[0]; return $rdn; } @@ -952,11 +948,12 @@ function get_rdn($dn,$include_attrs=0) { * 'dc=example,dc=com'. * * @param string $dn The DN whose container string to return. + * @param boolean $lower The DN returned will be in lower case. * * @return string The container * @see get_rdn */ -function get_container( $dn ) { +function get_container($dn,$lower=true) { $parts = pla_explode_dn($dn); if (count($parts) <= 1) @@ -968,6 +965,9 @@ function get_container( $dn ) { $container .= ',' . $parts[$i]; } + if ($lower) + $container = strtolower($container); + if (DEBUG_ENABLED) debug_log('get_container(): Entered with (%s), Returning (%s)',1,$dn,$container); @@ -1062,6 +1062,23 @@ function support_oid_to_text($oid_id) { return null; } +function error($msg,$type='note',$fatal=false,$backtrace=false) { + global $www; + + # if the error is fatal, we'll need to stop here. + if (! isset($www) && $fatal) + $www = new page(null); + + # Just a check to see that we are called right. + if (! isset($www) && ! $fatal) + pla_error('Function error called incorrectly',null,-1,true,true); + + $www->setsysmsg(array('title'=>_('Error'),'body'=>$msg,'type'=>$type)); + + if ($fatal) + $www->display(array('tree'=>false)); +} + /** * Prints an HTML-formatted error string. If you specify the optional * parameters $ldap_err_msg and $ldap_err_no, this function will @@ -1081,9 +1098,12 @@ function pla_error($msg,$ldap_err_msg=null,$ldap_err_no=-1,$fatal=true,$backtrac if (defined('DEBUG_ENABLED') && (DEBUG_ENABLED)) debug_log('pla_error(): Entered with (%s,%s,%s,%s)',1,$msg,$ldap_err_msg,$ldap_err_no,$fatal); - include_once HTDOCDIR.'header.php'; $server = isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : 'undefined'; - global $config; + + if ($fatal) { + include_once HTDOCDIR.'header.php'; + echo ''; + } echo '
'; echo ''; @@ -1091,7 +1111,7 @@ function pla_error($msg,$ldap_err_msg=null,$ldap_err_no=-1,$fatal=true,$backtrac printf('',_('Error')); echo ''; - echo ''; + echo ''; printf('',$msg); echo ''; @@ -1138,9 +1158,10 @@ function pla_error($msg,$ldap_err_msg=null,$ldap_err_no=-1,$fatal=true,$backtrac echo ''; foreach ($backtrace as $error => $line) { - printf('',_('File'),$line['file'],$line['line']); + printf('', + _('File'),isset($line['file']) ? $line['file'] : '',isset($line['line']) ? $line['line'] : ''); printf(''; } @@ -1184,7 +1205,7 @@ function pla_error($msg,$ldap_err_msg=null,$ldap_err_no=-1,$fatal=true,$backtrac * @see set_error_handler */ function pla_error_handler($errno,$errstr,$file,$lineno) { - if (DEBUG_ENABLED) + if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) debug_log('pla_error_handler(): Entered with (%s,%s,%s,%s)',1,$errno,$errstr,$file,$lineno); /* error_reporting will be 0 if the error context occurred @@ -1220,24 +1241,23 @@ function pla_error_handler($errno,$errstr,$file,$lineno) { $errstr = preg_replace('/\s+/',' ',$errstr); if ($errno == E_NOTICE) { - echo '
'; - - echo '
%s
WarningWarning%s
 
 %s%s (%s)
 %s%s (%s)
%s%s
',_('Function'),$line['function']);
-			print_r($line['args']);
+			if (isset($line['args'])) print_r($line['args']);
 			echo '
'; - printf('', - _('You found a non-fatal phpLDAPadmin bug!')); - - printf('',_('Error'),$errstr,$errtype); - printf('',_('File'),$file,_('line'),$lineno,_('caller'),$caller); - printf('', + $body = '
Warning %s
%s:%s (%s)
%s:%s %s %s, %s %s
Versions:PLA: %s, PHP: %s, SAPI: %s
'; + $body .= sprintf('',_('Error'),$errstr,$errtype); + $body .= sprintf('', + _('File'),$file,_('line'),$lineno,_('caller'),$caller); + $body .= sprintf('', pla_version(),phpversion(),php_sapi_name()); - printf('',$_SERVER['SERVER_SOFTWARE']); + $body .= sprintf('',$_SERVER['SERVER_SOFTWARE']); - printf('', + $body .= sprintf('', get_href('search_bug',"&summary_keyword=".htmlspecialchars($errstr)), _('Please check and see if this bug has been reported')); - echo '
%s:%s (%s)
%s:%s %s %s, %s %s
Versions:PLA: %s, PHP: %s, SAPI: %s
Web server:%s
Web server:%s
%s.
%s.
'; + $body .= ''; - echo '
'; + system_message(array( + 'title'=>_('You found a non-fatal phpLDAPadmin bug!'), + 'body'=>$body, + 'type'=>'error')); return; } @@ -1255,11 +1275,9 @@ function process_friendly_attr_table() { if (DEBUG_ENABLED) debug_log('process_friendly_attr_table(): Entered with ()',1); - // require 'config.php'; - global $friendly_attrs; $attrs_table = array(); - if( isset( $friendly_attrs ) && is_array( $friendly_attrs ) ) - foreach( $friendly_attrs as $old_name => $new_name ) + if( isset( $_SESSION['plaConfig']->friendly_attrs ) && is_array( $_SESSION['plaConfig']->friendly_attrs ) ) + foreach( $_SESSION['plaConfig']->friendly_attrs as $old_name => $new_name ) $attrs_table[ strtolower( $old_name ) ] = $new_name; else return array(); @@ -1296,8 +1314,6 @@ function draw_jpeg_photos($ldapserver,$dn,$attr_name='jpegPhoto',$draw_delete_bu $ldapserver->server_id,$dn,$attr_name,$draw_delete_buttons, $draw_bytes_and_size,$table_html_attrs,$img_html_attrs); - global $config; - $fixed_width = false; $fixed_height = false; if (eregi(' width',$img_html_attrs) || eregi('^width',$img_html_attrs)) @@ -1315,7 +1331,7 @@ function draw_jpeg_photos($ldapserver,$dn,$attr_name='jpegPhoto',$draw_delete_bu return; } - $jpeg_temp_dir = realpath($config->GetValue('jpeg','tmpdir').'/'); + $jpeg_temp_dir = realpath($_SESSION['plaConfig']->GetValue('jpeg','tmpdir').'/'); if (! is_writable($jpeg_temp_dir)) pla_error(_('Please set $jpeg_temp_dir to a writable directory in the phpLDAPadmin config.php') ); @@ -1333,8 +1349,7 @@ function draw_jpeg_photos($ldapserver,$dn,$attr_name='jpegPhoto',$draw_delete_bu $jpeg_data_size = filesize($jpeg_filename); if ($jpeg_data_size < 6 && $draw_delete_buttons) { echo _('jpegPhoto contains errors
'); - printf('%s', - $attr_name,_('Delete Photo')); + printf('%s',$attr_name,_('Delete Photo')); continue; } @@ -1364,7 +1379,7 @@ function draw_jpeg_photos($ldapserver,$dn,$attr_name='jpegPhoto',$draw_delete_bu ($img_html_attrs ? $img_html_attrs : ''),basename($jpeg_filename)); if ($draw_bytes_and_size) - printf('%s bytes. %s x %s pixels.
',number_format($jpeg_data_size),$width,$height); + printf('%s %s. %s x %s pixels.
',number_format($jpeg_data_size),_('bytes'),$width,$height); if ($draw_delete_buttons) # @@ -1377,15 +1392,19 @@ function draw_jpeg_photos($ldapserver,$dn,$attr_name='jpegPhoto',$draw_delete_bu # Delete old jpeg files. $jpegtmp_wildcard = "/^pla/"; - $handle = opendir($jpeg_temp_dir); - while (($file = readdir($handle)) != false) { - if (preg_match($jpegtmp_wildcard,$file)) { - $file = "$jpeg_temp_dir/$file"; - if ((time() - filemtime($file)) > $config->GetValue('jpeg','tmp_keep_time')) - @unlink($file); + $handle = @opendir($jpeg_temp_dir); + if ($handle !== false) { + while (($file = readdir($handle)) != false) { + if (preg_match($jpegtmp_wildcard,$file)) { + $file = "$jpeg_temp_dir/$file"; + if ((time() - filemtime($file)) > $_SESSION['plaConfig']->GetValue('jpeg','tmp_keep_time')) + @unlink($file); + } } + closedir($handle); + } else { + pla_error(sprintf('failed to open dir %s : permission denied', $jpeg_temp_dir), null, -1, false, false); } - closedir($handle); } /** @@ -1404,13 +1423,10 @@ function password_hash( $password_clear, $enc_type ) { switch( $enc_type ) { case 'crypt': - global $config; - - if ($config->GetValue('password','no_random_crypt_salt') == true) + if ($_SESSION['plaConfig']->GetValue('password', 'no_random_crypt_salt')) $new_value = '{CRYPT}' . crypt($password_clear,substr($password_clear,0,2)); else $new_value = '{CRYPT}' . crypt($password_clear,random_salt(2)); - break; case 'ext_des': @@ -1495,7 +1511,6 @@ function password_check( $cryptedpassword, $plainpassword ) { if (DEBUG_ENABLED) debug_log('password_check(): Entered with (%s,%s)',1,$cryptedpassword,$plainpassword); - //echo "password_check( $cryptedpassword, $plainpassword )\n"; if( preg_match( "/{([^}]+)}(.*)/", $cryptedpassword, $cypher ) ) { $cryptedpassword = $cypher[2]; $_cypher = strtolower($cypher[1]); @@ -1675,8 +1690,7 @@ function get_default_hash($server_id) { if (DEBUG_ENABLED) debug_log('get_default_hash(): Entered with (%s)',1,$server_id); - global $ldapservers; - return $ldapservers->GetValue($server_id,'appearance','password_hash'); + return $_SESSION['plaConfig']->ldapservers->GetValue($server_id,'appearance','password_hash'); } /** @@ -1686,7 +1700,7 @@ function get_default_hash($server_id) { * @return string The current version as read from the VERSION file. */ function pla_version() { - $version_file = realpath('../VERSION'); + $version_file = realpath(LIBDIR.'../VERSION'); if (! file_exists($version_file)) $return = 'UNKNOWN'; @@ -1705,6 +1719,10 @@ function pla_version() { if (preg_match('/^'.$cvs_prefix.'?\s*\$$/',$return)) $return = 'CVS'; + # Check if we are special CVS branch + elseif (preg_match('/^'.$cvs_prefix.'?\s*([a-zA-Z]+)?\s*\$$/',$return,$match)) + $return = $match[1]; + # If return is still the same as version, then the tag is not one we expect. elseif ($return == $version) $return = 'UNKNOWN'; @@ -1759,28 +1777,53 @@ function draw_chooser_link( $form_element, $include_choose_text=true, $rdn="none * [3] => dc=com * ) * + * + * NOTE: When a multivalue RDN is passed to ldap_explode_dn, the results returns with 'value + value'; */ function pla_explode_dn($dn,$with_attributes=0) { + global $CACHE; + if (DEBUG_ENABLED) - debug_log('pla_explode_dn(): Entered with (%s,%s)',1,$dn,$with_attributes); - $dn = addcslashes(dn_escape($dn),'<>'); + debug_log('Entered with (%s,%s)',1,__FILE__,__LINE__,__METHOD__,$dn,$with_attributes); + + if (isset($CACHE['explode'][$dn][$with_attributes])) { + if (DEBUG_ENABLED) + debug_log('Return CACHED result (%s) for (%s)',1,__FILE__,__LINE__,__METHOD__, + $CACHE['explode'][$dn][$with_attributes],$dn); + + return $CACHE['explode'][$dn][$with_attributes]; + } + + $dn = addcslashes($dn,'<>+";'); # split the dn - $result = ldap_explode_dn($dn,$with_attributes); - if (! $result) + $result[0] = ldap_explode_dn(dn_escape($dn),0); + $result[1] = ldap_explode_dn(dn_escape($dn),1); + if (! $result[$with_attributes]) { + if (DEBUG_ENABLED) + debug_log('Returning NULL - NO result.',1,__FILE__,__LINE__,__METHOD__); + return null; + } # Remove our count value that ldap_explode_dn returns us. - unset($result['count']); + unset($result[0]['count']); + unset($result[1]['count']); - # translate hex code into ascii for display - foreach ($result as $key => $value) - $result[$key] = preg_replace('/\\\([0-9A-Fa-f]{2})/e',"''.chr(hexdec('\\1')).''",$value); + # Record the forward and reverse entries in the cache. + foreach ($result as $key => $value) { + # translate hex code into ascii for display + $result[$key] = dn_unescape($value); + + $CACHE['explode'][join(',',$result[0])][$key] = $result[$key]; + $CACHE['explode'][join(',',array_reverse($result[0]))][$key] = array_reverse($result[$key]); + } if (DEBUG_ENABLED) - debug_log('pla_explode_dn(): Entered with (%s,%s), Returning (%s)',1,$dn,$with_attributes,$result); + debug_log('Entered with (%s,%s), Returning (%s)',1,__FILE__,__LINE__,__METHOD__, + $dn,$with_attributes,$result[$with_attributes]); - return $result; + return $result[$with_attributes]; } /** @@ -1805,7 +1848,15 @@ function dn_escape($dn) { * Parse a DN and unescape any special characters */ function dn_unescape($dn) { - return preg_replace('/\\\([0-9A-Fa-f]{2})/e',"''.chr(hexdec('\\1')).''",$dn); + if (is_array($dn)) { + $a = array(); + foreach ($dn as $key => $rdn) { + $a[$key] = preg_replace('/\\\([0-9A-Fa-f]{2})/e',"''.chr(hexdec('\\1')).''",$rdn); + } + return $a; + } else { + return preg_replace('/\\\([0-9A-Fa-f]{2})/e',"''.chr(hexdec('\\1')).''",$dn); + } } /** @@ -1889,21 +1940,30 @@ function array_to_query_string( $array, $exclude_vars=array(), $url_encode_amper debug_log('array_to_query_string(): Entered with (%s,%s,%s)',1, count($array),count($exclude_vars),$url_encode_ampersands); - if( ! is_array( $array ) ) + if (! is_array($array)) return ''; - if( ! $array ) + if (! $array) return ''; + $str = ''; - $i=0; - foreach( $array as $name => $val ) { - if( ! in_array( $name, $exclude_vars ) ) { - if( $i>0 ) - if( $url_encode_ampersands ) - $str .= '&'; - else - $str .= '&'; - $str .= urlencode( $name ) . '=' . urlencode( $val ); - $i++; + $i = 0; + foreach($array as $name => $val) { + if(! in_array($name, $exclude_vars)) { + if (is_array($val)) { + foreach($val as $v) { + if ($i > 0) + if($url_encode_ampersands) $str .= '&'; + else $str .= '&'; + $str .= rawurlencode($name) . '[]=' . rawurlencode($v); + $i++; + } + } else { + if ($i > 0) + if($url_encode_ampersands) $str .= '&'; + else $str .= '&'; + $str .= rawurlencode($name) . '=' . rawurlencode($val); + $i++; + } } } return $str; @@ -1922,27 +1982,16 @@ function array_to_query_string( $array, $exclude_vars=array(), $url_encode_amper * This makes it possible to sort lists of DNs such that they are grouped by container. * * @param string $dn The DN to reverse - * * @return string The reversed DN * * @see pla_compare_dns + * @see pla_explode_dns */ function pla_reverse_dn($dn) { if (DEBUG_ENABLED) debug_log('pla_reverse_dn(): Entered with (%s)',1,$dn); - foreach (pla_explode_dn($dn) as $key => $branch) { - - // pla_expode_dn returns the array with an extra count attribute, we can ignore that. - if ( $key === "count" ) continue; - - if (isset($rev)) { - $rev = $branch.",".$rev; - } else { - $rev = $branch; - } - } - return $rev; + return (join(',',array_reverse(pla_explode_dn($dn)))); } /** @@ -1952,11 +2001,7 @@ function sortAttrs($a,$b) { if (DEBUG_ENABLED) debug_log('sortAttrs(): Entered with (%s,%s)',1,$a,$b); - global $friendly_attrs, $attrs_display_order; - - # If $attrs_display_order is not set, make it a blank array. - if (! isset($attrs_display_order)) - $attrs_display_order = array(); + $attrs_display_order = isset($_SESSION['plaConfig']->attrs_display_order) ? $_SESSION['plaConfig']->attrs_display_order : array(); if ($a == $b) return 0; @@ -1967,8 +2012,8 @@ function sortAttrs($a,$b) { # If not, check if its friendly name is $attrs_display_order, get its key # If not, assign one greater than number of elements. if ( $a_key === false ) { - if (isset($friendly_attrs[strtolower($a)])) { - $a_key = array_search($friendly_attrs[strtolower($a)],$attrs_display_order); + if (isset($_SESSION['plaConfig']->friendly_attrs[strtolower($a)])) { + $a_key = array_search($_SESSION['plaConfig']->friendly_attrs[strtolower($a)],$attrs_display_order); if ($a_key == '') $a_key = count($attrs_display_order)+1; @@ -1979,8 +2024,8 @@ function sortAttrs($a,$b) { $b_key = array_search($b,$attrs_display_order); if ($b_key === false) { - if (isset($friendly_attrs[strtolower($b)])) { - $b_key = array_search($friendly_attrs[strtolower($b)],$attrs_display_order); + if (isset($_SESSION['plaConfig']->friendly_attrs[strtolower($b)])) { + $b_key = array_search($_SESSION['plaConfig']->friendly_attrs[strtolower($b)],$attrs_display_order); if ($b_key == '') $b_key = count($attrs_display_order)+1; @@ -1992,8 +2037,8 @@ function sortAttrs($a,$b) { # Case where neither $a, nor $b are in $attrs_display_order, $a_key = $b_key = one greater than num elements. # So we sort them alphabetically if ($a_key === $b_key) { - $a = strtolower((isset($friendly_attrs[strtolower($a)]) ? $friendly_attrs[strtolower($a)] : $a)); - $b = strtolower((isset($friendly_attrs[strtolower($b)]) ? $friendly_attrs[strtolower($b)] : $b)); + $a = strtolower((isset($_SESSION['plaConfig']->friendly_attrs[strtolower($a)]) ? $_SESSION['plaConfig']->friendly_attrs[strtolower($a)] : $a)); + $b = strtolower((isset($_SESSION['plaConfig']->friendly_attrs[strtolower($b)]) ? $_SESSION['plaConfig']->friendly_attrs[strtolower($b)] : $b)); return strcmp($a,$b); } @@ -2002,6 +2047,13 @@ function sortAttrs($a,$b) { return ($a_key < $b_key) ? -1 : 1; } +/** + * Compare the names of two Atrribute objects + */ +function attrcmp($a1, $a2) { + return strcmp(strtolower($a1->getFriendlyName()), strtolower($a2->getFriendlyName())); +} + /** * Reads an array and returns the array values back in lower case * @param array $array The array to convert the values to lowercase. @@ -2154,20 +2206,29 @@ function get_default_search_display() { * @param array $haystack The array that you think it is in. * @return bool True if its there, false if its not. */ -function in_array_ignore_case( $needle, $haystack ) { +function in_array_ignore_case($needle,$haystack) { if (DEBUG_ENABLED) - debug_log('in_array_ignore_case(): Entered with (%s,%s)',1,$needle,$haystack); + debug_log('Entered with (%s,%s)',1,__FILE__,__LINE__,__METHOD__,$needle,$haystack); - if( ! is_array( $haystack ) ) - return false; - if( ! is_string( $needle ) ) + if (! is_array($haystack)) return false; - foreach( $haystack as $element ) - if( is_string( $element ) && 0 == strcasecmp( $needle, $element ) ) - return true; + if (! is_string($needle)) + return false; - return false; + $return = false; + foreach ($haystack as $element) { + if (DEBUG_ENABLED) + debug_log('Comparing (%s) with (%s)',64,__FILE__,__LINE__,__METHOD__,$needle,$element); + + if (is_string($element) && 0 == strcasecmp($needle,$element)) + $return = true; + } + + if (DEBUG_ENABLED) + debug_log('Entered with (%s,%s), Returning (%s)',1,__FILE__,__LINE__,__METHOD__,$needle,$haystack,$return); + + return $return; } /** @@ -2246,11 +2307,9 @@ function pla_blowfish_encrypt( $data, $secret=null ) { if (DEBUG_ENABLED) debug_log('pla_blowfish_encrypt(): Entered with (%s,%s)',1,$data,$secret); - global $config; - # If our secret is null or blank, get the default. if( $secret === null || ! trim($secret)) - $secret = $config->GetValue('session','blowfish'); + $secret = $_SESSION['plaConfig']->GetValue('session','blowfish'); # If the secret isnt set, then just return the data. if (! trim($secret)) @@ -2288,8 +2347,6 @@ function pla_blowfish_decrypt( $encdata, $secret=null ) { if (DEBUG_ENABLED) debug_log('pla_blowfish_decrypt(): Entered with (%s,%s)',1,$encdata,$secret); - global $config; - // This cache gives major speed up for stupid callers :) static $cache = array(); @@ -2298,7 +2355,7 @@ function pla_blowfish_decrypt( $encdata, $secret=null ) { # If our secret is null or blank, get the default. if( $secret === null || ! trim($secret)) - $secret = $config->GetValue('session','blowfish'); + $secret = $_SESSION['plaConfig']->GetValue('session','blowfish'); # If the secret isnt set, then just return the data. if (! trim($secret)) @@ -2322,56 +2379,79 @@ function pla_blowfish_decrypt( $encdata, $secret=null ) { /** * Gets a DN string using the user-configured tree_display_format string to format it. */ -function draw_formatted_dn( $ldapserver, $dn ) { +function draw_formatted_dn($ldapserver,$entry) { + $dn = $entry->getDn(); + if (DEBUG_ENABLED) - debug_log('draw_formatted_dn(): Entered with (%s,%s)',1,$ldapserver->server_id,$dn); + debug_log('Entered with (%s,%s)',1,$ldapserver->server_id,$dn); - global $config; - - $format = $config->GetValue('appearance','tree_display_format'); - preg_match_all( "/%[a-zA-Z_0-9]+/", $format, $tokens ); + $format = $_SESSION['plaConfig']->GetValue('appearance','tree_display_format'); + preg_match_all('/%[a-zA-Z_0-9]+/',$format,$tokens); $tokens = $tokens[0]; - foreach( $tokens as $token ) { - if( 0 == strcasecmp( $token, '%dn' ) ) - $format = str_replace( $token, pretty_print_dn( $dn ), $format ); - elseif( 0 == strcasecmp( $token, '%rdn' ) ) - $format = str_replace( $token, pretty_print_dn( get_rdn( $dn ) ), $format ); + if (DEBUG_ENABLED) + debug_log('The tokens are (%s)',1,$tokens); - elseif( 0 == strcasecmp( $token, '%rdnvalue' ) ) { - $rdn = get_rdn( $dn ); - $rdn_value = explode( '=', $rdn, 2 ); + foreach ($tokens as $token) { + if (strcasecmp($token,'%dn') == 0) + $format = str_replace($token,pretty_print_dn($dn),$format); + + elseif (strcasecmp($token,'%rdn') == 0) + $format = str_replace($token,pretty_print_dn($entry->getRdn()),$format); + + elseif (strcasecmp($token,'%rdnvalue') == 0) { + $rdn = get_rdn($dn,0,true); + $rdn_value = explode('=',$rdn,2); $rdn_value = $rdn_value[1]; - $format = str_replace( $token, $rdn_value, $format ); + $format = str_replace($token,$rdn_value,$format); } else { - $attr_name = str_replace( '%', '', $token ); + $attr_name = str_replace('%','',$token); $attr_values = $ldapserver->getDNAttr($dn,$attr_name); - if( null == $attr_values ) - $display = 'none'; + if (is_null($attr_values) || (count($attr_values) <= 0)) + $display = '<'._('none').'>'; - elseif( is_array( $attr_values ) ) - $display = htmlspecialchars( implode( ', ', $attr_values ) ); + elseif (is_array($attr_values)) + $display = htmlspecialchars(implode(', ',$attr_values)); else - $display = htmlspecialchars( $attr_values ); + $display = htmlspecialchars($attr_values); - $format = str_replace( $token, $display, $format ); + $format = str_replace($token,$display,$format); } } + return $format; } /** * Takes a shadow* attribute and returns the date as an integer. + * @param $attrs array of Attribute objects + * @param $attr a shadow attribute name */ function shadow_date( $attrs, $attr) { if (DEBUG_ENABLED) debug_log('shadow_date(): Entered with (%s,%s)',1,$attrs,$attr); - $shadowLastChange = isset($attrs['shadowLastChange']) ? $attrs['shadowLastChange'][0] : null; - $shadowMax = isset($attrs['shadowMax']) ? $attrs['shadowMax'][0] : null; + $shadowlastchange_attribute = null; + $shadowmax_attribute = null; + $shadowdate_attribute = null; + foreach ($attrs as $attribute) { + if ($attribute->getName() == 'shadowLastChange' || $attribute->getName() == 'shadowlastchange') { + $shadowlastchange_attribute = $attribute; + } elseif ($attribute->getName() == 'shadowMax' || $attribute->getName() == 'shadowmax') { + $shadowmax_attribute = $attribute; + } elseif ($attribute->getName() == $attr || $attribute->getName() == $attr) { + $shadowdate_attribute = $attribute; + } + if ($shadowlastchange_attribute && $shadowmax_attribute && $shadowdate_attribute) { + break; + } + } + + $shadowLastChange = $shadowlastchange_attribute ? $shadowlastchange_attribute->getValue(0) : null; + $shadowMax = $shadowmax_attribute ? $shadowmax_attribute->getValue(0) : null; if( 0 == strcasecmp( $attr, 'shadowLastChange' ) && $shadowLastChange) $shadow_date = $shadowLastChange; @@ -2379,17 +2459,20 @@ function shadow_date( $attrs, $attr) { elseif ( 0 == strcasecmp( $attr, 'shadowMax' ) && ($shadowMax > 0) && $shadowLastChange ) $shadow_date = $shadowLastChange+$shadowMax; - elseif ( 0 == strcasecmp( $attr, 'shadowWarning' ) && ($attrs[$attr][0] > 0) && $shadowLastChange && $shadowMax && $shadowMax > 0) - $shadow_date = $shadowLastChange+$shadowMax-$attrs[$attr][0]; + elseif (0 == strcasecmp($attr, 'shadowWarning') && ($shadowdate_attribute->getValue(0) > 0) + && $shadowLastChange && $shadowMax && $shadowMax > 0) + $shadow_date = $shadowLastChange+$shadowMax-$shadowdate_attribute->getValue(0); - elseif ( 0 == strcasecmp( $attr, 'shadowInactive' ) && ($attrs[$attr][0] > 0) && $shadowLastChange && $shadowMax && $shadowMax > 0) - $shadow_date = $shadowLastChange+$shadowMax+$attrs[$attr][0]; + elseif (0 == strcasecmp($attr, 'shadowInactive') && ($shadowdate_attribute->getValue(0) > 0) + && $shadowLastChange && $shadowMax && $shadowMax > 0) + $shadow_date = $shadowLastChange+$shadowMax+$shadowdate_attribute->getValue(0); - elseif ( 0 == strcasecmp( $attr, 'shadowMin' ) && ($attrs[$attr][0] > 0) && $shadowLastChange) - $shadow_date = $shadowLastChange+$attrs[$attr][0]; + elseif (0 == strcasecmp($attr, 'shadowMin') && ($shadowdate_attribute->getValue(0) > 0) + && $shadowLastChange) + $shadow_date = $shadowLastChange+$shadowdate_attribute->getValue(0); - elseif ( 0 == strcasecmp( $attr, 'shadowExpire' ) && ($attrs[$attr][0] > 0)) - $shadow_date = $attrs[$attr][0]; + elseif (0 == strcasecmp($attr, 'shadowExpire') && ($shadowdate_attribute->getValue(0) > 0)) + $shadow_date = $shadowdate_attribute->getValue(0); else // Couldn't interpret the shadow date (could be 0 or -1 or something) return false; @@ -2425,14 +2508,12 @@ function server_select_list ($select_id=null,$only_logged_on=true,$select_name=' if (DEBUG_ENABLED) debug_log('server_select_list(): Entered with (%s,%s,%s,%s)',1,$select_id,$only_logged_on,$select_name,$js_script); - global $ldapservers; - $count = 0; - $server_menu_html = sprintf('',$select_name,$select_name,$js_script); - foreach ($ldapservers->GetServerList() as $id) { + foreach ($_SESSION['plaConfig']->ldapservers->GetServerList() as $id) { - $ldapserver = $ldapservers->Instance($id); + $ldapserver = $_SESSION['plaConfig']->ldapservers->Instance($id); if ($ldapserver->isVisible()) { @@ -2443,7 +2524,7 @@ function server_select_list ($select_id=null,$only_logged_on=true,$select_name=' $server = $ldapserver; $server_menu_html .= sprintf('', - $ldapserver->server_id,( $ldapserver->server_id == $select_id ? 'selected' : '' ),$ldapserver->name); + $ldapserver->server_id,($ldapserver->server_id == $select_id ? 'selected' : ''),$ldapserver->name); } } @@ -2460,23 +2541,26 @@ function server_select_list ($select_id=null,$only_logged_on=true,$select_name=' return null; } -function server_info_list() { - global $ldapservers; - +function server_info_list($visible=false) { $server_info_list = array(); - foreach ($ldapservers->GetServerList() as $id) { - $ldapserver = $ldapservers->Instance($id); + if (isset($_SESSION['plaConfig'])) { + foreach ($_SESSION['plaConfig']->ldapservers->GetServerList() as $id) { + $ldapserver = $_SESSION['plaConfig']->ldapservers->Instance($id); - if (! $ldapserver->haveAuthInfo() || ! $ldapserver->isValidServer($id)) - continue; + if (! $ldapserver->isValidServer($id)) + continue; - $server_info_list[$id]['id'] = $id; - $server_info_list[$id]['name'] = $ldapserver->name; - $server_info_list[$id]['base_dns'] = $ldapserver->getBaseDN(); + if ($visible && ! $ldapserver->visible) + continue; + + $server_info_list[$id]['id'] = $id; + $server_info_list[$id]['name'] = $ldapserver->name; + $server_info_list[$id]['base_dns'] = $ldapserver->getBaseDN(); + } } - if (DEBUG_ENABLED) + if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) debug_log('server_info_list(): Entered with (), Returning (%s)',1,$server_info_list); return $server_info_list; @@ -2507,28 +2591,60 @@ function server_info_list() { * 4( 16) = LDAP Server Communication * 5( 32) = Tree Processing * 7( 64) = Other non generic messages + * 8(128) = Page Processing * @param string $msg Message to send to syslog * @param int $level Log bit number for this message. * @see syslog.php */ function debug_log($msg,$level=0) { - global $config,$debug_file,$timer; + global $debug_file,$timer; + + # Temporary, to catch when these are not set in the function arguments. + $file = __FILE__; + $line = __LINE__; + $method = __METHOD__; # In case we are called before we are fully initialised or if debugging is not set. - if (! isset($config) || ! ($config->GetValue('debug','file') || $config->GetValue('debug','syslog'))) + if (! isset($_SESSION['plaConfig']) || ! ($_SESSION['plaConfig']->GetValue('debug','file') + || $_SESSION['plaConfig']->GetValue('debug','syslog'))) return false; - $debug_level = $config->GetValue('debug','level'); + $debug_level = $_SESSION['plaConfig']->GetValue('debug','level'); if (! $debug_level || (! ($level & $debug_level))) return; + $debugaddr = false; + if ($_SESSION['plaConfig']->GetValue('debug','addr')) { + if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] == $_SESSION['plaConfig']->GetValue('debug','addr')) + $debugaddr = true; + + elseif ($_SERVER['REMOTE_ADDR'] == $_SESSION['plaConfig']->GetValue('debug','addr')) + $debugaddr = true; + } else $debugaddr = true; + + if (! $debugaddr) + return; + + # If we are limiting debug to a browser, then check that $caller = basename( $_SERVER['PHP_SELF'] ); if (func_num_args() > 2) { $args = func_get_args(); array_shift($args); array_shift($args); + + # This is temporary, until we change all the debug_log statements. + if (is_string($args[0]) && preg_match('/.php$/',$args[0])) { + $file = array_shift($args); + +# if (is_numeric($args[0])) + $line = array_shift($args); + +# if (is_string($args[0])) + $method = array_shift($args); + } + $fargs = array(); foreach ($args as $key) { if (is_array($key) || is_object($key)) @@ -2544,16 +2660,17 @@ function debug_log($msg,$level=0) { else $timer = null; - $debug_message = sprintf('[%2.3f] %s(%s): %s',$timer,basename($_SERVER['PHP_SELF']),$level,substr($msg,0,200)); + $debug_message = sprintf('[%2.3f] %3s-%s(%04s): %s: %s',$timer,$level,basename($file),$line,$method,substr($msg,0,200)); - if ($debug_file || $config->GetValue('debug','file')) { + if ($debug_file || $_SESSION['plaConfig']->GetValue('debug','file')) { if (! $debug_file) - $debug_file = fopen($config->GetValue('debug','file'),'a'); + $debug_file = fopen($_SESSION['plaConfig']->GetValue('debug','file'), + $_SESSION['plaConfig']->GetValue('debug','append') ? 'a' : 'w'); fwrite($debug_file,$debug_message."\n"); } - if ($config->GetValue('debug','syslog')) + if ($_SESSION['plaConfig']->GetValue('debug','syslog')) syslog_notice($debug_message); return syslog_notice( sprintf('%s(%s): %s',$caller,$level,$msg) ); @@ -2616,8 +2733,12 @@ function binSIDtoText($binsid) { */ function masort(&$data,$sortby,$rev=0) { if (DEBUG_ENABLED) - debug_log('masort(): Entered with (%s,%s,%s)',1,$data,$sortby,$rev); + debug_log('Entered with (%s,%s,%s)',1,__FILE__,__LINE__,__METHOD__, + $data,$sortby,$rev); + # if the array to sort is null or empty + if (! $data) return; + static $sort_funcs = array(); if (empty($sort_funcs[$sortby])) { @@ -2672,33 +2793,61 @@ function masort(&$data,$sortby,$rev=0) { * @param string $filter LDAP Query filter. * @param string $key LDAP attribute to use as key. * @param array $attrs LDAP attributes to use as values. + * @param bool $sort Specify false to not sort results by DN + * or true to have the returned array sorted by DN (uses ksort) + * or an array of attribute names to sort by attribute values * @return array $results Array of values keyed by $key. */ -function return_ldap_hash($ldapserver,$base_dn,$filter,$key,$attrs,$sort=null) { +function return_ldap_hash($ldapserver,$base_dn,$filter,$key,$attrs,$sort=true) { if (DEBUG_ENABLED) debug_log('return_ldap_hash(): Entered with (%s,%s,%s,%s,%s)',0, $ldapserver->server_id,$base_dn,$filter,$key,count($attrs)); - if (is_array($sort)) - $ldapquery = $ldapserver->search(null,$base_dn,$filter,$attrs,'sub',false,LDAP_DEREF_NEVER,0,$sort); - else - $ldapquery = $ldapserver->search(null,$base_dn,$filter,$attrs); + $ldapquery = $ldapserver->search(null,$base_dn,$filter,$attrs,'sub',$sort,LDAP_DEREF_NEVER,0); $results = array(); foreach ($ldapquery as $dn => $dnattrs) { - foreach ($attrs as $attr) { - if (isset($dnattrs[$attr])) - $results[$dnattrs[$key]][$attr] = $dnattrs[$attr]; + if (isset($dnattrs[$key])) { + if (is_array($dnattrs[$key])) { + foreach ($dnattrs[$key] as $i => $k) { + foreach ($attrs as $attr) { + if (isset($dnattrs[$attr])) { + $v = ''; + if (is_array($dnattrs[$attr]) && isset($dnattrs[$attr][$i])) + $v = $dnattrs[$attr][$i]; + if (is_string($v) && (strlen($v) > 0)) + $results[$k][$attr] = $v; + } + } + } + } else { + foreach ($attrs as $attr) { + if (isset($dnattrs[$attr])) + $results[$dnattrs[$key]][$attr] = $dnattrs[$attr]; + } + } } } return $results; } -// @todo: document this function -function debug_dump($variable,$die=false) { - print "
";
+/**
+ * This function dumps the $variable for debugging purposes
+ * @param string|array Variable to dump
+ * @param boolean Whether to stop execution or not.
+ */
+function debug_dump($variable,$die=false,$onlydebugaddr=false) {
+	if ($onlydebugaddr &&
+		$_SESSION['plaConfig']->GetValue('debug','addr') &&
+		$_SERVER['HTTP_X_FORWARDED_FOR'] != $_SESSION['plaConfig']->GetValue('debug','addr') &&
+		$_SERVER['REMOTE_ADDR'] != $_SESSION['plaConfig']->GetValue('debug','addr'))
+		return;
+
+	print '
';
 	print_r($variable);
+	print '
'; + if ($die) die(); } @@ -2708,14 +2857,12 @@ function debug_dump($variable,$die=false) { * based on the criteria defined in the array $criteria in config.php */ function password_generate() { - global $config; - - $no_use_similiar = ! $config->GetValue('password','use_similar'); - $lowercase = $config->GetValue('password','lowercase'); - $uppercase = $config->GetValue('password','uppercase'); - $digits = $config->GetValue('password','numbers'); - $punctuation = $config->GetValue('password','punctuation'); - $length = $config->GetValue('password','length'); + $no_use_similiar = ! $_SESSION['plaConfig']->GetValue('password','use_similar'); + $lowercase = $_SESSION['plaConfig']->GetValue('password','lowercase'); + $uppercase = $_SESSION['plaConfig']->GetValue('password','uppercase'); + $digits = $_SESSION['plaConfig']->GetValue('password','numbers'); + $punctuation = $_SESSION['plaConfig']->GetValue('password','punctuation'); + $length = $_SESSION['plaConfig']->GetValue('password','length'); $outarray = array(); @@ -2828,13 +2975,11 @@ function a_array_rand($input,$num_req) { * or null if there is nothing cached.. */ function get_cached_item($server_id,$item,$subitem='null') { - global $config; - # Set default return $return = null; # Check config to make sure session-based caching is enabled. - if ($config->GetValue('cache',$item)) { + if ($_SESSION['plaConfig']->GetValue('cache',$item)) { global $cache; if (isset($cache[$server_id][$item][$subitem])) { @@ -2869,10 +3014,8 @@ function set_cached_item($server_id,$item,$subitem='null',$data) { if (DEBUG_ENABLED) debug_log('set_cached_item(): Entered with (%s,%s,%s,%s)',1,$server_id,$item,$subitem,$data); - global $config; - # Check config to make sure session-based caching is enabled. - if ($config->GetValue('cache',$item)) { + if ($_SESSION['plaConfig']->GetValue('cache',$item)) { global $cache; $cache[$server_id][$item][$subitem] = $data; @@ -2883,6 +3026,20 @@ function set_cached_item($server_id,$item,$subitem='null',$data) { return false; } +/** + * Deletes the cache for a specified $item for the specified $server_id + * + * @return: void + */ +function del_cached_item($server_id,$item,$subitem='null') { + if (DEBUG_ENABLED) + debug_log('del_cached_item(): Entered with (%s,%s,%s)',1,$server_id,$item,$subitem); + + # Check config to make sure session-based caching is enabled. + if (isset($_SESSION['cache'][$server_id][$item][$subitem])) + unset($_SESSION['cache'][$server_id][$item][$subitem]); +} + /** * Draws an HTML date selector button which, when clicked, pops up a date selector dialog. * @param string $attr The name of the date type attribute @@ -2912,4 +3069,224 @@ function random_junk() { $time = gettimeofday(); return md5(strtotime('now').$time['usec']); } + +/** + * This function will convert the browser two character language into the + * default 5 character language, where the country portion should NOT be + * assumed to be upper case characters of the first two characters. + */ +function auto_lang($lang) { + switch ($lang) { + case 'ja': return 'ja_JP'; + case 'cs': return 'cs_CZ'; + default: return sprintf('%s_%s',$lang,strtoupper($lang)); + } +} + +function get_request($attr,$type='POST',$die=false,$default=null) { + switch($type) { + case 'GET': + $value = isset($_GET[$attr]) ? $_GET[$attr] : $default; + break; + + case 'REQUEST': + $value = isset($_REQUEST[$attr]) ? $_REQUEST[$attr] : $default; + break; + + case 'SESSION': + $value = isset($_SESSION[$attr]) ? $_SESSION[$attr] : $default; + break; + + case 'POST': + default: + $value = isset($_POST[$attr]) ? $_POST[$attr] : $default; + break; + } + + if (! is_array($value) && trim($value) == "") + $value = $default; + + if ($die && is_null($value)) + system_message(array( + 'title'=>_('Generic Error'), + 'body'=>sprintf('%s: Called "%s" without "%s" using "%s"',basename($_SERVER['PHP_SELF']),get_request('cmd','REQUEST'),$attr,$type), + 'type'=>'error'),'index.php'); + + return $value; +} + +function system_message($msg,$redirect=null,$noserverid=false) { + global $ldapserver; + + if (! is_array($msg)) + return null; + + $_SESSION['sysmsg'][] = $msg; + + if ($redirect) { + if ($noserverid || ! $ldapserver) { + header("Location: $redirect"); + + } else { + if (preg_match('/\?/',$redirect)) + header(sprintf('Location: %s&server_id=%s',$redirect,$ldapserver->server_id)); + else + header(sprintf('Location: %s?server_id=%s',$redirect,$ldapserver->server_id)); + } + exit; + } +} + +/** + * Returns a HTML id that can be used in the URL after the #. + * + * @param string $dn The DN to pretty-print. + * @return string + */ +function htmlid($sid,$dn) { + return sprintf('SID%s:%s',$sid,preg_replace('/[\ =,]/','_',$dn)); +} + +/* + * Makes sure that the config file is properly setup and + * that your install of PHP can handle LDAP stuff. + */ + +function check_config($config_file) { + global $config,$ldapservers; + global $friendly_attrs, $queries, $attrs_display_order; + global $hidden_attrs, $hidden_except_dn, $hidden_attrs_ro; + global $read_only_attrs, $read_only_except_dn, $unique_attrs; + + # Read in config_default.php + require_once LIBDIR.'config_default.php'; + + # Make sure their PHP version is current enough + if (strcmp(phpversion(),REQUIRED_PHP_VERSION) < 0) + pla_error(sprintf('phpLDAPadmin requires PHP version %s or greater.
(You are using %s)', + REQUIRED_PHP_VERSION,phpversion())); + + # Make sure this PHP install has all our required extensions + if (! extension_loaded('ldap')) + system_message(array( + 'title'=>_('Missing required extension'), + 'body'=> 'Your install of PHP appears to be missing LDAP support.

Please install LDAP support before using phpLDAPadmin.
(Dont forget to restart your web server afterwards)', + 'type'=>'error')); + + # Make sure that we have php-xml loaded. + if (! function_exists('xml_parser_create')) + system_message(array( + 'title'=>_('Missing required extension'), + 'body'=> 'Your install of PHP appears to be missing XML support.

Please install XML support before using phpLDAPadmin.
(Dont forget to restart your web server afterwards)', + 'type'=>'error')); + + # Make sure their session save path is writable, if they are using a file system session module, that is. + if ( ! strcasecmp('Files',session_module_name() && ! is_writable(realpath(session_save_path())))) + system_message(array( + 'title'=>_('Missing required extension'), + 'body'=> 'Your PHP session configuration is incorrect. Please check the value of session.save_path in your php.ini to ensure that the directory specified there exists and is writable. The current setting of "'.session_save_path().'" is un-writable by the web server.', + 'type'=>'error')); + + $config = new Config; + + /* Check for syntax errors in config.php + As of php 4.3.5, this NO longer catches fatal errors :( */ + + ob_start(); + require_once $config_file; + $str = ''; + if (ob_get_level()) { + $str = ob_get_contents(); + ob_end_clean(); + } + + if ($str) { + $str = strip_tags($str); + $matches = array(); + preg_match('/(.*):\s+(.*):.*\s+on line (\d+)/',$str,$matches); + + if (isset($matches[1]) && isset($matches[2]) && isset($matches[3])) { + $error_type = $matches[1]; + $error = $matches[2]; + $line_num = $matches[3]; + + $file = file($config_file); + + echo ''."\n"; + echo ''."\n"; + echo "\n"; + + echo ''; + echo ''; + echo 'phpLDAPadmin Config File Error'; + echo ''; + echo ''; + + echo ''; + echo '

Config File ERROR

'; + printf('

%s (%s) on line %s

',$error_type,$error,$line_num); + + echo '
'; + printf('Looks like your config file has an ERROR on line %s.
',$line_num); + echo 'Here is a snippet around that line
'; + echo '
'."\n"; + + echo '
'; + + for ($i = $line_num-9; $i<$line_num+5; $i++) { + if ($i+1 == $line_num) + echo '
'; + + if ($i < 0) + continue; + + printf('%s: %s
',$i+1,htmlspecialchars($file[$i])); + if ($i+1 == $line_num) + echo '
'; + } + + echo '
'; + echo '
'; + echo 'Hint: Sometimes these errors are caused by lines preceding the line reported.'; + echo '
'; + echo ''; + echo ''; + + return false; + } + } + + # Check for server definitions. + if (! isset($ldapservers) || count($ldapservers->GetServerList()) == 0) + system_message(array( + 'title'=>_('Missing required extension'), + 'body'=> 'Your config.php is missing Server Definitions. Please see the sample file config/config.php.example.', + 'type'=>'error')); + + $config->ldapservers = $ldapservers; + + if (isset($friendly_attrs)) $config->friendly_attrs = $friendly_attrs; + if (isset($queries)) $config->queries = $queries; + if (isset($attrs_display_order)) $config->attrs_display_order = $attrs_display_order; + if (isset($hidden_attrs)) $config->hidden_attrs = $hidden_attrs; + if (isset($hidden_except_dn)) $config->hidden_except_dn = $hidden_except_dn; + if (isset($hidden_attrs_ro)) $config->hidden_attrs_ro = $hidden_attrs_ro; + if (isset($read_only_attrs)) $config->read_only_attrs = $read_only_attrs; + if (isset($read_only_except_dn)) $config->read_only_except_dn = $read_only_except_dn; + if (isset($unique_attrs)) $config->unique_attrs = $unique_attrs; + + # Check the memory limit parameter. + if (ini_get('memory_limit') < $config->GetValue('session','memorylimit')) + system_message(array( + 'title'=>_('Memory Limit low.'), + 'body'=> sprintf('Your php memory limit is low - currently %s',ini_get('memory_limit'),false), + 'type'=>'error')); + + # if $_SESSION['sysmsg'] is set, then there were problems. + if (isset($_SESSION['sysmsg'])) + return false; + + return true; +} ?> diff --git a/lib/hooks.php b/lib/hooks.php index 17790ad..6bd8e83 100644 --- a/lib/hooks.php +++ b/lib/hooks.php @@ -1,10 +1,10 @@ and Alc么ve + * @author Benjamin Drieu and Alc?ve * @package phpLDAPadmin * * This program is free software; you can redistribute it and/or @@ -14,7 +14,7 @@ * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License @@ -23,23 +23,18 @@ * USA */ -if ( ! isset($hooks) ) { - /** This variable contains all hooks that are defined. */ - $hooks = array(); -} - /** * Compares two arrays by numerically comparing their 'prority' - * value. Standard `cmp-like' function. + * value. Standard `cmp-like' function. * * @param a First element to compare. * @param b Second element to compare. * * @return -1 if priority of first element is smaller than second - * element priority. 1 otherwise. + * element priority. 1 otherwise. */ -function sort_array_by_priority ( $a, $b ) { - return ( ( $a['priority'] < $b['priority'] ) ? -1 : 1 ); +function sort_array_by_priority($a,$b) { + return (($a['priority'] < $b['priority']) ? -1 : 1 ); } /** @@ -47,114 +42,116 @@ function sort_array_by_priority ( $a, $b ) { * * @param hook_name Name of hook to run. * @param args Array of optional arguments set by - * phpldapadmin. It is normally in a form known + * phpldapadmin. It is normally in a form known * by call_user_func_array() : *
[ 'server_id' => 0,
- *   'dn' => 'uid=epoussa,ou=tech,o=corp,o=fr' ]
+ * 'dn' => 'uid=epoussa,ou=tech,o=corp,o=fr' ]
* * @return true if all procedures returned true, false otherwise. */ -function run_hook ( $hook_name, $args ) { - global $hooks; +function run_hook($hook_name,$args) { + $hooks = isset($_SESSION['plaConfig']) ? $_SESSION['plaConfig']->hooks : array(); - $debug = 0; - syslog_debug ( "Running hook $hook_name." ); + $debug = 0; + syslog_debug("Running hook $hook_name."); - if ( ! array_key_exists ( $hook_name, $hooks ) ) { - syslog_notice ( "Hook '$hook_name' not defined !\n" ); - return true; - } + if (! array_key_exists($hook_name,$hooks)) { + syslog_notice("Hook '$hook_name' not defined !\n"); + return true; + } - unset ( $rollbacks ); - $rollbacks = array (); - reset ( $hooks[$hook_name] ); + unset($rollbacks); + $rollbacks = array (); + reset($hooks[$hook_name]); - /** Execution of procedures attached is done using a numeric order - * since all procedures have been attached to the hook with a - * numerical weight. */ - while ( list ( $key, $hook ) = each ( $hooks[$hook_name] ) ) { - array_push ( $rollbacks, $hook['rollback_function'] ); - syslog_debug ( "Calling " . $hook['hook_function'] . "\n" ); - $result = call_user_func_array ( $hook['hook_function'], $args ); - syslog_notice ( "Called " . $hook['hook_function'] . "\n" ); + /* Execution of procedures attached is done using a numeric order + * since all procedures have been attached to the hook with a + * numerical weight. */ + while (list($key,$hook) = each($hooks[$hook_name])) { + array_push($rollbacks,$hook['rollback_function']); + syslog_debug("Calling ".$hook['hook_function']."\n"); - /** If a procedure fails, its optional rollback is executed with - * the same arguments. After that, all rollbacks from - * previously executed procedures are executed in the reverse - * order. */ - if ( $result != true ) { - syslog_debug ( "Function " . $hook['hook_function'] . " returned $result\n" ); + $result = call_user_func_array($hook['hook_function'],$args); + syslog_notice("Called ".$hook['hook_function']."\n"); - while ( $rollbacks ) { - $rollback = array_pop ( $rollbacks ); + /* If a procedure fails, its optional rollback is executed with + * the same arguments. After that, all rollbacks from + * previously executed procedures are executed in the reverse + * order. */ + if ($result != true) { + syslog_debug("Function ".$hook['hook_function']." returned $result\n"); - if ( $rollback != false ) { - syslog_debug ( "Executing rollback $rollback\n" ); - call_user_func_array ( $rollback, $args ); + while ($rollbacks) { + $rollback = array_pop($rollbacks); + + if ($rollback != false) { + syslog_debug("Executing rollback $rollback\n"); + call_user_func_array($rollback,$args); + } + } + + return false; } - } + } - return false; - } - } - - return true; + return true; } /** * Adds a procedure to a hook for later execution. * * @param hook_name Name of the hook. - * @param priority Numeric priority. Lowest means + * @param priority Numeric priority. Lowest means * procedure will be executed before. * @param hook_function Name of the php function called upon * hook trigger. * @param rollback_function Name of the php rollback function * called upon failure. */ -function add_hook ( $hook_name, $priority, $hook_function, $rollback_function ) { - global $hooks; +function add_hook($hook_name,$priority,$hook_function,$rollback_function) { + global $config; - if ( ! array_key_exists ( $hook_name, $hooks ) ) { - $hooks[$hook_name] = array(); - } + if (! array_key_exists($hook_name,$config->hooks)) { + $config->hooks[$hook_name] = array(); + } - array_push ( $hooks[$hook_name], array ( 'priority' => $priority, 'hook_function' => $hook_function, - 'rollback_function' => $rollback_function ) ); + remove_hook($hook_name,-1,$hook_function,''); - uasort ( $hooks[$hook_name], "sort_array_by_priority" ); + array_push($config->hooks[$hook_name],array('priority' => $priority,'hook_function' => $hook_function,'rollback_function' => $rollback_function)); + + uasort($config->hooks[$hook_name],"sort_array_by_priority"); } /** * Removes a procedure from a hook, based on a filter. * * @param hook_name Name of the hook. - * @param priority Numeric priority. If set, all + * @param priority Numeric priority. If set, all * procedures of that priority will be * removed. - * @param hook_function Name of the procedure function. If + * @param hook_function Name of the procedure function. If * set, all procedures that call this * function will be removed. * @param rollback_function Name of the php rollback function - * called upon failure. If set, all + * called upon failure. If set, all * procedures that call this function * as a rollback will be removed. */ -function remove_hook ( $hook_name, $priority, $hook_function, $rollback_function ) { - global $hooks; +function remove_hook($hook_name,$priority,$hook_function,$rollback_function) { + global $config; - if ( array_key_exists ( $hook_name, $hooks ) ) { - reset ( $hooks[$hook_name] ); + if (array_key_exists($hook_name,$config->hooks)) { + reset($config->hooks[$hook_name]); - while ( list ( $key, $hook ) = each ( $hooks[$hook_name] ) ) { - if ( ( $priority >= 0 && $priority == $hook['priority'] ) || - ( $hook_function && $hook_function == $hook['hook_function'] ) || - ( $rollback_function && $rollback_function == $hook['rollback_function'] ) ) { - unset ( $hooks[$hook_name][$key] ); - } + while (list($key,$hook) = each($config->hooks[$hook_name])) { + if (($priority >= 0 && $priority == $hook['priority']) || + ($hook_function && $hook_function == $hook['hook_function']) || + ($rollback_function && $rollback_function == $hook['rollback_function'])) { - } - } + unset($config->hooks[$hook_name][$key]); + } + } + } } /** @@ -162,25 +159,26 @@ function remove_hook ( $hook_name, $priority, $hook_function, $rollback_function * * @param hook_name Name of hook to clear. */ -function clear_hooks ( $hook_name ) { - global $hooks; +function clear_hooks($hook_name) { + global $config; + if (!isset($config) && isset($_SESSION['plaConfig'])) + $config = $_SESSION['plaConfig']; - if ( array_key_exists ( $hook_name, $hooks ) ) { - unset ( $hooks[$hook_name] ); - } + if (array_key_exists($hook_name,$config->hooks)) + unset($config->hooks[$hook_name]); } -/* Evaluating user-made hooks */ -if (is_dir(HOOKSDIR)) { - $dir = dir(HOOKSDIR); +# Evaluating user-made hooks +if (is_dir(HOOKSDIR.'functions')) { + $dir = dir(HOOKSDIR.'functions'); + + while (false !== ($entry = $dir->read())) { + $filename = sprintf('%s/%s/%s',HOOKSDIR,'functions',$entry); - while (false !== ($entry = $dir->read())) { - $filename = sprintf('%s/%s',HOOKSDIR,$entry); if (is_file($filename) and eregi('php[0-9]?$',$entry)) - require_once "hooks/$entry"; - } + require_once "$filename"; + } - $dir -> close(); + $dir -> close(); } - ?> diff --git a/lib/ldap_supported_oids.txt b/lib/ldap_supported_oids.txt index f4078c2..692f577 100644 --- a/lib/ldap_supported_oids.txt +++ b/lib/ldap_supported_oids.txt @@ -1,4 +1,4 @@ -# $Header: /cvsroot/phpldapadmin/phpldapadmin/lib/ldap_supported_oids.txt,v 1.3 2005/09/11 14:59:47 wurley Exp $ +# $Header: /cvsroot/phpldapadmin/phpldapadmin/lib/ldap_supported_oids.txt,v 1.4 2007/12/15 07:50:32 wurley Exp $ # If you find some reliable and more meaningful descriptions to this OIDS, # then please let the phpldapadmin development know so that this file can be @@ -46,7 +46,12 @@ 1.3.6.1.1.7.2 "LCUP Sync Update Control. RFC 3928 control" 1.3.6.1.1.7.3 "LCUP Sync Done Control. RFC 3928 control" 1.3.6.1.1.8 "Cancel Operation. RFC 3909 extension" +1.3.6.1.1.12 "Assertion Control" "RFC 4511" "The assertion control allows the client to specify a condition that must be true for the operation to be processed normally." +1.3.6.1.1.13.1 "Pre-Read Controls" "" "The Pre-Read request control, indicates that a copy of the entry before application of update is to be returned." +1.3.6.1.1.13.2 "Post-Read Controls" "" "The Pre-Read request control, indicates that a copy of the entry before application of update is to be returned." +1.3.6.1.1.14 "Modify-Increment Extension" "RFC 4525" "An extension to the Lightweight Directory Access Protocol (LDAP) Modify operation to support an increment capability." 1.3.6.1.4.1.42.2.27.8.5.1 "passwordPolicyRequest" +1.3.6.1.4.1.42.2.27.9.5.2 "GetEffectiveRights control" "" "May be used to determine what operations a given user may perform on a specified entry." 1.3.6.1.4.1.1466.101.119.1 "Dynamic Directory Services Refresh Request RFC2589" 1.3.6.1.4.1.1466.20036 "LDAP_NOTICE_OF_DISCONNECTION" 1.3.6.1.4.1.1466.20037 "Transport Layer Security Extension" "RFC 2830" "This operation provides for TLS establishment in an LDAP association and is defined in terms of an LDAP extended request." @@ -62,6 +67,7 @@ 1.3.6.1.4.1.4203.1.5.3 "LDAP Absolute True and False Filters" "draft-zeilenga-ldap-t-f-10.txt" "Implementations of this extension SHALL allow 'and' and 'or' choices with zero filter elements." 1.3.6.1.4.1.4203.1.5.4 "Language Tags" "RFC 3866" "Supports storing attributes with language tag options in the DIT" 1.3.6.1.4.1.4203.1.5.5 "Language Ranges" "RFC 3866" "Supports language range matching of attributes with language tag options stored in the DIT" +1.3.6.1.4.1.4203.1.9.1.1 "LDAP Content Synchronization Control" "draft=zeilenga-ldup-sync-06.txt" "The operation allows a client to maintain a copy of a fragment of directory information tree. It supports both polling for changes and listening for changes. The operation is defined as an extension of the LDAP Search Operation." 1.3.6.1.4.1.4203.1.10.1 "Subentries in LDAP" "RFC 3672" "The subentries control MAY be sent with a searchRequest to control the visibility of entries and subentries which are within scope. Non-visible entries or subentries are not returned in response to the request." 1.3.6.1.4.1.4203.1.10.2 "LDAP No-Op Control" "draft-zeilenga-ldap-noop-02.txt" "The No-Op control can be used to disable the normal effect of an operation. The control can be used to discover how a server might react to a particular update request without updating the directory." 1.3.6.1.4.1.4203.1.11.1 "LDAP Password Modify Extended Operation" "RFC 3062" "An LDAP extended operation to allow modification of user passwords which is not dependent upon the form of the authentication identity nor the password storage mechanism used." @@ -171,6 +177,8 @@ 2.16.840.1.113730.3.4.16 "Authentication Request Control" 2.16.840.1.113730.3.4.17 "Real Attributes Only Request Control" 2.16.840.1.113730.3.4.18 "LDAP Proxied Authorization Control" "draft-weltman-ldapv3-proxy-06.txt" "The Proxied Authorization Control allows a client to request that an operation be processed under a provided authorization identity [AUTH] instead of as the current authorization identity associated with the connection. " +2.16.840.1.113730.3.4.19 "Virtual Attributes Only Request Control" +2.16.840.1.113730.3.4.20 "Use One Backend" 2.16.840.1.113730.3.4.999 "iPlanet Replication Modrdn Extra Mods Control" 2.16.840.1.113730.3.5.3 "iPlanet Start Replication Request Extended Operation" 2.16.840.1.113730.3.5.4 "iPlanet Replication Response Extended Operation" @@ -178,3 +186,4 @@ 2.16.840.1.113730.3.5.6 "iPlanet Replication Entry Request Extended Operation" 2.16.840.1.113730.3.5.7 "iPlanet Bulk Import Start Extended Operation" 2.16.840.1.113730.3.5.8 "iPlanet Bulk Import Finished Extended Operation" +2.16.840.1.113730.3.5.9 "iPlanet Digest authentication calculation" diff --git a/lib/ldif_functions.php b/lib/ldif_functions.php index 6132f96..bb1ffef 100644 --- a/lib/ldif_functions.php +++ b/lib/ldif_functions.php @@ -1,5 +1,5 @@ + private $_head; + + # Settings for this application + private $_app; + + # Default values array. + private $_default; + + public function __construct($server_id=null) { + if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) + debug_log('Entered with [%s]',129,__FILE__,__LINE__,__METHOD__,$server_id); + + # To be defined in a configuration file. + $this->_app['title'] = 'phpLDAPadmin'; + + # Default Values for configurable items. + $this->_default['stylecss'] = CSSDIR.'style.css'; + $this->_default['logo'] = 'images/logo_small.jpg'; + $this->_default['sysmsg']['error'] = 'images/warning.png'; + $this->_default['sysmsg']['warn'] = 'images/notice.png'; + $this->_default['sysmsg']['info'] = 'images/light-big.png'; + + # Capture any output so far (in case we send some headers below) - there shouldnt be any output anyway. + $preOutput = ''; + if (ob_get_level()) { + $preOutput = ob_get_contents(); + ob_end_clean(); + } + + //header('Content-type: text/html; charset="UTF-8"'); @todo: Something is sending output to the browser. + if (isset($_SESSION['plaConfig']) + && $_SESSION['plaConfig']->GetValue('appearance','compress') + && eregi('gzip',$_SERVER['HTTP_ACCEPT_ENCODING'])) { + + header('Content-Encoding: gzip'); + + if (DEBUG_ENABLED) + debug_log('Sent COMPRESSED header to browser and discarded (%s)',129,__FILE__,__LINE__,__METHOD__,$preOutput); + } + + # Turn back on output buffering. + ob_start(); + + # Initial Values + $this->_pageheader[] .= ''."\n"; + $this->_pageheader[] .= '_pageheader[] .= '"http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">'."\n"; + $this->_pageheader[] .= "\n"; + $this->_pageheader[] .= ''."\n"; + $this->_pageheader[] .= "\n"; + + $this->_app['logo'] = $this->_default['logo']; + + if (! is_null($server_id)) + $this->_app['urlcss'] = sprintf('%s%s',CSSDIR,$_SESSION['plaConfig']->GetValue('appearance','stylesheet')); + else + $this->_app['urlcss'] = sprintf('%s%s',CSSDIR,'style.css'); + + $this->server_id = $server_id; + } + + /* Add to the HTML Header */ + public function head_add($html) { + $this->_head[] .= $html; + } + + /* Print out the HTML header */ + private function pageheader_print() { + if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) + debug_log('Entered with ()',129,__FILE__,__LINE__,__METHOD__); + + # HTML prepage requirements. + foreach ($this->_pageheader as $line) + echo $line."\n"; + + # Page Title + echo ''; + + if (isset($_SESSION['plaConfig'])) + printf('%s (%s) - %s', + $this->_app['title'],pla_version(),$_SESSION['plaConfig']->GetValue('appearance','page_title')); + else + printf('%s - %s',$this->_app['title'],pla_version()); + + # Style sheet. + printf('',$this->_app['urlcss']); + printf('',JSDIR); + printf('','../htdocs/'.JSDIR); + printf('','../htdocs/'); + echo "\n"; + printf('',JSDIR); + printf('',JSDIR); + printf('',JSDIR); + printf('','../htdocs/'.JSDIR); + printf('','../htdocs/'.JSDIR); + echo "\n"; + + # HTML head requirements. + if (is_array($this->_head) && count ($this->_head)) + foreach ($this->_head as $line) + echo $line."\n"; + + echo ''; + echo "\n"; + } + + private function head_print() { + if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) + debug_log('Entered with ()',129,__FILE__,__LINE__,__METHOD__); + + if (isset($_SESSION['plaConfig'])) + $pagetitle = $_SESSION['plaConfig']->GetValue('appearance','page_title') ? ' - '.$_SESSION['plaConfig']->GetValue('appearance','page_title') : ''; + else + $pagetitle = ''; + + echo ''; + + if (is_null($this->server_id)) + printf('%s',' '); + else + printf('%s %s',$this->_app['title'],$pagetitle); + + echo ''; + } + + private function control_print() { + if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) + debug_log('Entered with ()',129,__FILE__,__LINE__,__METHOD__); + + if (! isset($this->server_id) || is_null($this->server_id)) { + echo ' '; + return; + } + + echo ''; + echo ''; + + $empty = true; + + if ($_SESSION['plaConfig']->isCommandAvailable('home')) { + printf('', + _('Home'),_('Home'),_('Home')); + $empty = false; + } + + if ($_SESSION['plaConfig']->isCommandAvailable('purge')) { + printf('', + _('Purge caches'),_('Purge all cached data in phpLDAPadmin, including server schemas.'),_('Purge caches')); + $empty = false; + } + + if ($_SESSION['plaConfig']->isCommandAvailable('external_links', 'feature')) { + printf('', + get_href('add_rfe'),_('Request feature'),_('light'),_('Request feature')); + $empty = false; + } + + if ($_SESSION['plaConfig']->isCommandAvailable('external_links', 'bug')) { + printf('', + get_href('add_bug'),_('Report a bug'),_('bug'),_('Report a bug')); + $empty = false; + } + + if ($_SESSION['plaConfig']->isCommandAvailable('external_links', 'donation')) { + printf('', + get_href('donate'),_('Donate'),_('Donate'),_('Donate')); + $empty = false; + } + + if (! $_SESSION['plaConfig']->GetValue('appearance','hide_debug_info')) { + printf('', + _('Show Cache'),_('Show Cache'),_('Show Cache')); + $empty = false; + } + + if ($_SESSION['plaConfig']->isCommandAvailable('external_links', 'help')) { + printf('', + get_href('documentation'),_('Help'),_('Help'),_('Help')); + $empty = false; + } + + if ($empty) { + echo ''; + } + + printf('',$this->_app['logo']); + + echo ''; + echo '
%s
%s
%s
%s
%s
%s
%s
%s
%s
%s
%s
%s
%s
%s
 
'; + } + + protected function tree() { + if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) + debug_log('Entered with ()',129,__FILE__,__LINE__,__METHOD__); + + if (! isset($_SESSION['plaConfig'])) + return; + + $server_id = is_null($this->server_id) ? min($_SESSION['plaConfig']->ldapservers->GetServerList()) : $this->server_id; + + echo ''; + if (count(server_info_list(true)) > 1) { + echo '
'; + echo '
'; + printf('%s%s
%s',_('Server Select'),_(':'), + server_select_list($server_id,false,'server_id',sprintf("onchange=\"tree_unhide('server_id',%s)\"",$server_id))); + echo '
'; + echo '
'; + echo "\n\n"; + } + + foreach ($_SESSION['plaConfig']->ldapservers->GetServerList() as $server_id) { + printf('
',$server_id,($server_id == $this->server_id) ? 'block': 'none'); + $ldapserver = $_SESSION['plaConfig']->ldapservers->Instance($server_id); + + $tree = Tree::getInstance($ldapserver->server_id); + + $tree->draw(); + echo '
'; + } + echo ''; + } + + public function block_add($side,$object) { + if (! is_object($object)) + error('not an object'); + + $this->_block[$side][] = $object; + } + + private function block_print($side) { + if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) + debug_log('Entered with ()',129,__FILE__,__LINE__,__METHOD__); + + if (! isset($this->_block[$side])) + return; + + printf('',$side); + foreach ($this->_block[$side] as $object) + echo $object->draw($side); + echo ''; + } + + private function sysmsg() { + if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) + debug_log('Entered with ()',129,__FILE__,__LINE__,__METHOD__); + + if (isset($this->sysmsg)) { + foreach ($this->sysmsg as $index => $details) { + switch ($details['type']) { + case 'error': + $icon = $this->_default['sysmsg']['error']; + break; + + case 'warn': + $icon = $this->_default['sysmsg']['warn']; + break; + + case 'info': + default: + $icon = $this->_default['sysmsg']['info']; + break; + } + + if (isset($details['title'])) + printf('%s%s', + $icon,$details['type'],$details['title']); + + if (isset($details['body'])) + if (is_array($details['body'])) { + echo ''; + foreach ($details['body'] as $line) + printf('%s
',$line); + echo ''; + + } else + printf('%s',$details['body']); + } + } + } + + public function body($compress=false) { + if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) + debug_log('Entered with (%s)',129,__FILE__,__LINE__,__METHOD__,$compress); + + # If the body is called via AJAX, and compression is enable, we need to compress the output + if ($compress && ob_get_level()) { + ob_end_clean(); + ob_start(); + } + + # System Message + if (isset($_SESSION['sysmsg']) && $_SESSION['sysmsg']) { + $this->setsysmsg($_SESSION['sysmsg']); + unset($_SESSION['sysmsg']); + } + + if (isset($this->sysmsg)) { + echo ''; + $this->sysmsg(); + echo '
'; + echo "\n"; + } + + if (isset($this->_block['body'])) { + foreach ($this->_block['body'] as $object) + echo $object->draw('body'); + } + + if ($compress && ob_get_level() && isset($_SESSION['plaConfig']) + && $_SESSION['plaConfig']->GetValue('appearance','compress') + && eregi('gzip',$_SERVER['HTTP_ACCEPT_ENCODING'])) { + + $output = ob_get_contents(); + ob_end_clean(); + + if (DEBUG_ENABLED) + debug_log('Sending COMPRESSED output to browser[(%s),%s]',129,__FILE__,__LINE__,__METHOD__, + strlen($output),$output); + + print gzencode($output); + } + } + + private function footer_print() { + if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) + debug_log('Entered with ()',129,__FILE__,__LINE__,__METHOD__); + + printf('%s',pla_version()); + } + + public function display($filter=array()) { + if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) + debug_log('Entered with [%s]',129,__FILE__,__LINE__,__METHOD__,$filter); + + # Control what is displayed. + $display = array( + 'tree'=>true + ); + + $display = array_merge($display,$filter); + + # HTML Header + $this->pageheader_print(); + echo "\n"; + + # Start of body + # Page Header + echo ''; + echo "\n"; + echo ''; + + $this->head_print(); + echo "\n"; + + # Control Line + echo ''; + echo "\n"; + + # Left Block + echo ''; + + if ($display['tree']) { +# $this->block_print('tree'); + $this->tree(); + echo "\n"; + } + + echo ''; + echo ''; + echo "\n"; + + # Page Footer + $this->footer_print(); + + # Finish HTML + echo '
'; + $this->control_print(); + echo '
'; + echo '
'; + echo "\n"; + $this->body(); + echo '
'; + echo '
'; + echo ''; + echo ''; + + # compress output + if (ob_get_level() && isset($_SESSION['plaConfig']) + && $_SESSION['plaConfig']->GetValue('appearance','compress') + && eregi('gzip',$_SERVER['HTTP_ACCEPT_ENCODING'])) { + + $output = ob_get_contents(); + ob_end_clean(); + + if (DEBUG_ENABLED) + debug_log('Sending COMPRESSED output to browser[(%s),%s]',129,__FILE__,__LINE__,__METHOD__, + strlen($output),$output); + + print gzencode($output); + } + } + + public function setsysmsg($data) { + if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) + debug_log('Entered with [%s]',129,__FILE__,__LINE__,__METHOD__,$data); + + if (! is_array($data)) + return; + + if (isset($this->sysmsg)) + $nummsg = count($this->sysmsg); + else + $nummsg = 1; + + foreach ($data as $msgno => $msgarray) { + $msgindex = $msgno + $nummsg; + + foreach (array('title','body','type') as $index) + if (isset($msgarray[$index])) + $this->sysmsg[$msgindex][$index] = $msgarray[$index]; + } + } +} + +class block { + private $title; + private $body; + private $foot; + + public function __construct() { + } + + public function setTitle($html) { + $this->title = $html; + } + + public function setBody($html) { + $this->body = $html; + } + + public function setFooter($html) { + $this->foot = $html; + } + + public function draw($side) { + $output = ''; + + $output .= sprintf('',$side); + if (isset($this->body['title'])) + $output .= sprintf('',$this->title); + + if (isset($this->body['body'])) + $output .= sprintf('',$this->body); + + if (isset($this->body['footer'])) + $output .= sprintf('',$this->foot); + $output .= '
%s
%s
%s
'; + + return $output; + } +} +?> diff --git a/lib/schema_functions.php b/lib/schema_functions.php index dbd0007..9ef3578 100644 --- a/lib/schema_functions.php +++ b/lib/schema_functions.php @@ -1,5 +1,5 @@ oid = null; $this->description = null; } - function setOID( $new_oid ) { + function setOID($new_oid) { $this->oid = $new_oid; } - function setDescription( $new_desc ) { + function setDescription($new_desc) { $this->description = $new_desc; } @@ -51,22 +51,22 @@ class SchemaItem { * @package phpLDAPadmin */ class ObjectClass extends SchemaItem { - /** This objectClass' name, ie "inetOrgPerson" */ + # This objectClass' name, ie "inetOrgPerson" var $name; - /** array of objectClass names from which this objectClass inherits */ + # Array of objectClass names from which this objectClass inherits var $sup_classes; - /** one of STRUCTURAL, ABSTRACT, or AUXILIARY */ + # One of STRUCTURAL, ABSTRACT, or AUXILIARY var $type; - /** arrays of attribute names that this objectClass requires */ + # Arrays of attribute names that this objectClass requires var $must_attrs; - /** arrays of attribute names that this objectClass allows, but does not require */ + # Arrays of attribute names that this objectClass allows, but does not require var $may_attrs; - /** boolean value indicating whether this objectClass is obsolete */ + # Boolean value indicating whether this objectClass is obsolete var $is_obsolete; - /** array of objectClasses which inherit from this one (must be set at runtime explicitly by the caller) */ + # Array of objectClasses which inherit from this one (must be set at runtime explicitly by the caller) var $children_objectclasses; - /** Initialize the class' member variables */ + # Initialize the class' member variables function initVars($ldapserver) { parent::initVars(); @@ -81,65 +81,62 @@ class ObjectClass extends SchemaItem { $this->children_objectclasses = array(); } - function _parse_list($i, $strings, &$attrs) { - /** - ** A list starts with a ( followed by a list of attributes separated by $ terminated by ) - ** The first token can therefore be a ( or a (NAME or a (NAME) - ** The last token can therefore be a ) or NAME) - ** The last token may be terminate by more than one bracket + function _parse_list($i,$strings,&$attrs) { + /* + * A list starts with a ( followed by a list of attributes separated by $ terminated by ) + * The first token can therefore be a ( or a (NAME or a (NAME) + * The last token can therefore be a ) or NAME) + * The last token may be terminate by more than one bracket */ if (DEBUG_ENABLED) - debug_log('%s::_parse_list(): Entered with (%d,%s,%s)',9, - get_class($this),$i,$strings,$attrs); + debug_log('Entered with (%d,%s,%s)',9,__FILE__,__LINE__,__METHOD__,$i,$strings,$attrs); $string = $strings[$i]; - if (!preg_match('/^\(/',$string)) { - // A bareword only - can be terminated by a ) if the last item + if (! preg_match('/^\(/',$string)) { + # A bareword only - can be terminated by a ) if the last item if (preg_match('/\)+$/',$string)) - $string = preg_replace('/\)+$/','',$string); + $string = preg_replace('/\)+$/','',$string); - array_push($attrs, $string); + array_push($attrs,$string); } elseif (preg_match('/^\(.*\)$/',$string)) { - $string = preg_replace('/^\(/','',$string); + $string = preg_replace('/^\(/','',$string); $string = preg_replace('/\)+$/','',$string); - array_push($attrs, $string); + array_push($attrs,$string); } else { - // Handle the opening cases first - - if ($string == '(') { - $i++; + # Handle the opening cases first + if ($string == '(') { + $i++; } elseif (preg_match('/^\(./',$string)) { - $string = preg_replace('/^\(/','',$string); - array_push ($attrs, $string); + $string = preg_replace('/^\(/','',$string); + array_push ($attrs,$string); $i++; } // Token is either a name, a $ or a ')' // NAME can be terminated by one or more ')' while (! preg_match('/\)+$/',$strings[$i])) { - $string = $strings[$i]; + $string = $strings[$i]; if ($string == '$') { - $i++; + $i++; continue; } if (preg_match('/\)$/',$string)) { - $string = preg_replace('/\)+$/','',$string); + $string = preg_replace('/\)+$/','',$string); } else { - $i++; + $i++; } - array_push ($attrs, $string); + array_push ($attrs,$string); } } sort($attrs); if (DEBUG_ENABLED) - debug_log('%s::_parse_list(): Returning (%d,[%s],[%s])',9, - get_class($this),$i,$strings,$attrs); + debug_log('Returning (%d,[%s],[%s])',9,__FILE__,__LINE__,__METHOD__,$i,$strings,$attrs); return $i; } @@ -148,8 +145,8 @@ class ObjectClass extends SchemaItem { * @todo: Unfortunately, some schemas are not well defined - eg: dNSDomain. Where the schema definition is not case consistent with the attribute definitions. This causes us some problems, which we need to resolve. */ function ObjectClass($raw_ldap_schema_string,$ldapserver) { - if (DEBUG_ENABLED) - debug_log('%s::__construct(): Entered with (%s)',9,get_class($this),$raw_ldap_schema_string); + if (DEBUG_ENABLED) + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$raw_ldap_schema_string); $this->initVars($ldapserver); $class = $raw_ldap_schema_string; @@ -167,65 +164,59 @@ class ObjectClass extends SchemaItem { if ($strings[$i+1]!='(') { do { $i++; - if(strlen($this->name)==0) - $this->name = $strings[$i]; - else - $this->name .= ' '.$strings[$i]; - - } while (!preg_match('/\'$/s', $strings[$i])); - - } else { - $i++; - - do { - $i++; - if(strlen($this->name) == 0) + if (strlen($this->name) == 0) $this->name = $strings[$i]; else $this->name .= ' ' . $strings[$i]; - } while (!preg_match('/\'$/s', $strings[$i])); + } while (! preg_match('/\'$/s',$strings[$i])); + + } else { + $i++; + do { + $i++; + if (strlen($this->name) == 0) + $this->name = $strings[$i]; + else + $this->name .= ' ' . $strings[$i]; + + } while (! preg_match('/\'$/s',$strings[$i])); do { $i++; } while (! preg_match('/\)+\)?/',$strings[$i])); } - $this->name = preg_replace('/^\'/', '', $this->name); - $this->name = preg_replace('/\'$/', '', $this->name); + $this->name = preg_replace('/^\'/','',$this->name); + $this->name = preg_replace('/\'$/','',$this->name); if (DEBUG_ENABLED) - debug_log('%s::__construct(): Case NAME returned (%s)',8, - get_class($this),$this->name); + debug_log('Case NAME returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->name); break; case 'DESC': do { $i++; - if (strlen($this->description)==0) + if (strlen($this->description) == 0) $this->description=$this->description . $strings[$i]; else $this->description=$this->description . ' ' . $strings[$i]; - } while (!preg_match('/\'$/s', $strings[$i])); + } while (! preg_match('/\'$/s',$strings[$i])); if (DEBUG_ENABLED) - debug_log('%s::__construc(): Case DESC returned (%s)',8, - get_class($this),$this->description); - + debug_log('Case DESC returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->description); break; case 'OBSOLETE': $this->is_obsolete = TRUE; if (DEBUG_ENABLED) - debug_log('%s::__construct(): Case OBSOLETE returned (%s)',8, - get_class($this),$this->is_obsolete); - + debug_log('Case OBSOLETE returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->is_obsolete); break; case 'SUP': - if ($strings[$i+1]!='(') { + if ($strings[$i+1] != '(') { $i++; array_push($this->sup_classes,preg_replace("/'/",'',$strings[$i])); @@ -233,99 +224,88 @@ class ObjectClass extends SchemaItem { $i++; do { $i++; - if ($strings[$i]!='$') + if ($strings[$i] != '$') array_push($this->sup_classes,preg_replace("/'/",'',$strings[$i])); } while (! preg_match('/\)+\)?/',$strings[$i+1])); } if (DEBUG_ENABLED) - debug_log('%s::__construct(): Case SUP returned (%s)',8, - get_class($this),$this->sup_classes); - + debug_log('Case SUP returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->sup_classes); break; case 'ABSTRACT': - $this->type='abstract'; + $this->type = 'abstract'; if (DEBUG_ENABLED) - debug_log('%s::__construct(): Case ABSTRACT returned (%s)',8, - get_class($this),$this->type); - + debug_log('Case ABSTRACT returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->type); break; case 'STRUCTURAL': - $this->type='structural'; + $this->type = 'structural'; if (DEBUG_ENABLED) - debug_log('%s::__construct(): Case STRUCTURAL returned (%s)',8, - get_class($this),$this->type); + debug_log('Case STRUCTURAL returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->type); break; case 'AUXILIARY': - $this->type='auxiliary'; + $this->type = 'auxiliary'; if (DEBUG_ENABLED) - debug_log('%s::__construct(): Case AUXILIARY returned (%s)',8, - get_class($this),$this->type); + debug_log('Case AUXILIARY returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->type); break; case 'MUST': - $attrs = array(); + $attrs = array(); - $i = $this->_parse_list(++$i, $strings, $attrs); + $i = $this->_parse_list(++$i,$strings,$attrs); if (DEBUG_ENABLED) - debug_log('%s::__construct(): _parse_list returned %d (%s)',8, - get_class($this),$i,$attrs); + debug_log('_parse_list returned %d (%s)',8,__FILE__,__LINE__,__METHOD__,$i,$attrs); foreach ($attrs as $string) { - $attr = new ObjectClassAttribute($string, $this->name); - array_push ($this->must_attrs, $attr); + $attr = new ObjectClass_ObjectClassAttribute($string,$this->name); + array_push($this->must_attrs,$attr); } if (DEBUG_ENABLED) - debug_log('%s::__construct(): Case MUST returned (%s)',8, - get_class($this),$this->must_attrs); + debug_log('Case MUST returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->must_attrs); break; case 'MAY': - $attrs = array(); + $attrs = array(); - $i = $this->_parse_list(++$i, $strings, $attrs); + $i = $this->_parse_list(++$i,$strings,$attrs); if (DEBUG_ENABLED) - debug_log('%s::__construct(): _parse_list returned %d (%s)',8, - get_class($this),$i,$attrs); + debug_log('_parse_list returned %d (%s)',8,__FILE__,__LINE__,__METHOD__,$i,$attrs); foreach ($attrs as $string) { - $attr = new ObjectClassAttribute($string, $this->name); - array_push ($this->may_attrs, $attr); + $attr = new ObjectClass_ObjectClassAttribute($string,$this->name); + array_push ($this->may_attrs,$attr); } if (DEBUG_ENABLED) - debug_log('%s::__construct(): Case MAY returned (%s)',8, - get_class($this),$this->may_attrs); + debug_log('Case MAY returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->may_attrs); break; default: - if(preg_match ('/[\d\.]+/i',$strings[$i]) && $i == 1) { + if (preg_match('/[\d\.]+/i',$strings[$i]) && $i == 1) { $this->oid = $strings[$i]; if (DEBUG_ENABLED) - debug_log('%s::__construct(): Case default returned (%s)',8, - get_class($this),$this->oid); + debug_log('Case default returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->oid); } break; } } - $this->description = preg_replace("/^\'/", '', $this->description); - $this->description = preg_replace("/\'$/", '', $this->description); + $this->description = preg_replace("/^\'/",'',$this->description); + $this->description = preg_replace("/\'$/",'',$this->description); if (DEBUG_ENABLED) - debug_log('%s::__construct(): Returning () - NAME (%s), DESCRIPTION (%s), MUST (%s), MAY (%s)',9, - get_class($this),$this->name,$this->description,$this->must_attrs,$this->may_attrs); + debug_log('Returning () - NAME (%s), DESCRIPTION (%s), MUST (%s), MAY (%s)',9,__FILE__,__LINE__,__METHOD__, + $this->name,$this->description,$this->must_attrs,$this->may_attrs); } /** @@ -342,9 +322,9 @@ class ObjectClass extends SchemaItem { * @see getMayAttrs * @see getMayAttrNames */ - function getMustAttrs($oclasses = NULL) { + function getMustAttrs($oclasses=null) { if (DEBUG_ENABLED) - debug_log('%s::getMustAttrs(): Entered with (%s)',9,get_class($this),$oclasses); + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$oclasses); $all_must_attrs = array(); $all_must_attrs = $this->must_attrs; @@ -386,7 +366,7 @@ class ObjectClass extends SchemaItem { */ function getMayAttrs($oclasses=null) { if (DEBUG_ENABLED) - debug_log('%s::getMayAttrs(): Entered with (%s)',9,get_class($this),$oclasses); + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$oclasses); $all_may_attrs = array(); $all_may_attrs = $this->may_attrs; @@ -427,14 +407,14 @@ class ObjectClass extends SchemaItem { * @see getMayAttrs * @see getMayAttrNames */ - function getMustAttrNames( $oclasses = null ) { + function getMustAttrNames($oclasses=null) { if (DEBUG_ENABLED) - debug_log('%s::getMustAttrNames(): Entered with (%s)',9,get_class($this),$oclasses); + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$oclasses); - $attrs = $this->getMustAttrs( $oclasses ); + $attrs = $this->getMustAttrs($oclasses); $attr_names = array(); - foreach( $attrs as $attr ) + foreach ($attrs as $attr) $attr_names[] = $attr->getName(); return $attr_names; @@ -455,14 +435,14 @@ class ObjectClass extends SchemaItem { * @see getMayAttrs * @see getMustAttrNames */ - function getMayAttrNames( $oclasses = null ) { + function getMayAttrNames($oclasses=null) { if (DEBUG_ENABLED) - debug_log('%s::getMayAttrNames(): Entered with (%s)',9,get_class($this),$oclasses); + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$oclasses); - $attrs = $this->getMayAttrs( $oclasses ); + $attrs = $this->getMayAttrs($oclasses); $attr_names = array(); - foreach( $attrs as $attr ) + foreach ($attrs as $attr) $attr_names[] = $attr->getName(); return $attr_names; @@ -474,16 +454,16 @@ class ObjectClass extends SchemaItem { * @param String $object_class_name The name of the objectClass to add * @return bool Returns true on success or false on failure (objectclass already existed for example) */ - function addChildObjectClass( $object_class_name ) { + function addChildObjectClass($object_class_name) { if (DEBUG_ENABLED) - debug_log('%s::addChildObjectClass(): Entered with (%s)',9,get_class($this),$object_class_name); + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$object_class_name); - $object_class_name = trim( $object_class_name ); - if( ! is_array( $this->children_objectclasses ) ) + $object_class_name = trim($object_class_name); + if (! is_array($this->children_objectclasses)) $this->children_objectclasses = array(); - foreach( $this->children_objectclasses as $existing_objectclass ) - if( 0 == strcasecmp( $object_class_name, $existing_objectclass ) ) + foreach ($this->children_objectclasses as $existing_objectclass) + if (strcasecmp($object_class_name,$existing_objectclass) == 0) return false; $this->children_objectclasses[] = $object_class_name; @@ -536,15 +516,17 @@ class ObjectClass extends SchemaItem { * * @param array $new_must_attrs An array of attribute names (strings) to add. */ - function addMustAttrs( $new_must_attrs ) { + function addMustAttrs($new_must_attrs) { if (DEBUG_ENABLED) - debug_log('%s::addMustAttrs(): Entered with (%s)',9,get_class($this),$new_must_attrs); + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$new_must_attrs); - if( ! is_array( $new_must_attrs ) ) + if (! is_array($new_must_attrs)) return; - if( 0 == count( $new_must_attrs ) ) + + if (count($new_must_attrs) == 0) return; - $this->must_attrs = array_values( array_unique( array_merge( $this->must_attrs, $new_must_attrs ) ) ); + + $this->must_attrs = array_values(array_unique(array_merge($this->must_attrs,$new_must_attrs))); } /** @@ -553,15 +535,17 @@ class ObjectClass extends SchemaItem { * * @param array $new_may_attrs An array of attribute names (strings) to add. */ - function addMayAttrs( $new_may_attrs ) { + function addMayAttrs($new_may_attrs) { if (DEBUG_ENABLED) - debug_log('%s::addMayAttrs(): Entered with (%s)',9,get_class($this),$new_may_attrs); + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$new_may_attrs); - if( ! is_array( $new_may_attrs ) ) + if (! is_array($new_may_attrs)) return; - if( 0 == count( $new_may_attrs ) ) + + if (count($new_may_attrs) == 0) return; - $this->may_attrs = array_values( array_unique( array_merge( $this->may_attrs, $new_may_attrs ) ) ); + + $this->may_attrs = array_values(array_unique(array_merge($this->may_attrs,$new_may_attrs))); } } @@ -576,32 +560,32 @@ class ObjectClass extends SchemaItem { * inheritance. * @package phpLDAPadmin */ -class ObjectClassAttribute { - /** This Attribute's name */ +class ObjectClass_ObjectClassAttribute { + # This Attribute's name var $name; - /** This Attribute's root */ + # This Attribute's root var $source; /** - * Creates a new ObjectClassAttribute with specified name and source objectClass. + * Creates a new ObjectClass_ObjectClassAttribute with specified name and source objectClass. * @param string $name the name of the new attribute. * @param string $source the name of the ObjectClass which * specifies this attribute. */ - function ObjectClassAttribute($name,$source) { + function ObjectClass_ObjectClassAttribute($name,$source) { if (DEBUG_ENABLED) - debug_log('%s::__construct(): Entered with name (%s), source (%s)',9,get_class($this),$name,$source); + debug_log('Entered with name (%s), source (%s)',9,__FILE__,__LINE__,__METHOD__,$name,$source); $this->name = $name; $this->source = $source; } - /** Gets this attribute's name */ + # Gets this attribute's name function getName () { return $this->name; } - /** Gets the name of the ObjectClass which originally specified this attribute. */ + # Gets the name of the ObjectClass which originally specified this attribute. function getSource () { return $this->source; } @@ -612,37 +596,37 @@ class ObjectClassAttribute { * @package phpLDAPadmin */ class AttributeType extends SchemaItem { - /** The name of this attributeType */ + # The name of this attributeType var $name; - /** string: the description */ + # string: the description var $is_obsolete; - /** The attribute from which this attribute inherits (if any) */ + # The attribute from which this attribute inherits (if any) var $sup_attribute; - /** The equality rule used */ + # The equality rule used var $equality; - /** The ordering of the attributeType */ + # The ordering of the attributeType var $ordering; - /** Boolean: supports substring matching? */ + # Boolean: supports substring matching? var $sub_str; - /** The full syntax string, ie 1.2.3.4{16} */ + # The full syntax string, ie 1.2.3.4{16} var $syntax; - /** boolean: is single valued only? */ + # boolean: is single valued only? var $is_single_value; - /** boolean: is collective? */ + # boolean: is collective? var $is_collective; - /** boolean: can use modify? */ + # boolean: can use modify? var $is_no_user_modification; - /** The usage string set by the LDAP schema */ + # The usage string set by the LDAP schema var $usage; - /** An array of alias attribute names, strings */ + # An array of alias attribute names, strings var $aliases; - /** The max number of characters this attribute can be */ + # The max number of characters this attribute can be var $max_length; - /** A string description of the syntax type (taken from the LDAPSyntaxes) */ + # A string description of the syntax type (taken from the LDAPSyntaxes) var $type; - /** An array of objectClasses which use this attributeType (must be set by caller) */ + # An array of objectClasses which use this attributeType (must be set by caller) var $used_in_object_classes; - /** A list of object class names that require this attribute type. */ + # A list of object class names that require this attribute type. var $required_by_object_classes; /** @@ -675,9 +659,9 @@ class AttributeType extends SchemaItem { /** * Creates a new AttributeType objcet from a raw LDAP AttributeType string. */ - function AttributeType( $raw_ldap_attr_string ) { + function AttributeType($raw_ldap_attr_string) { if (DEBUG_ENABLED) - debug_log('%s::__construct(): Entered with (%s)',9,get_class($this),$raw_ldap_attr_string); + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$raw_ldap_attr_string); $this->initVars(); $attr = $raw_ldap_attr_string; @@ -690,7 +674,7 @@ class AttributeType extends SchemaItem { break; case 'NAME': - if ($strings[$i+1]!='(') { + if ($strings[$i+1] != '(') { do { $i++; if (strlen($this->name)==0) @@ -698,7 +682,7 @@ class AttributeType extends SchemaItem { else $this->name .= ' ' . $strings[$i]; - } while (!preg_match("/\'$/s", $strings[$i])); + } while (! preg_match("/\'$/s",$strings[$i])); // this attribute has no aliases $this->aliases = array(); @@ -711,20 +695,19 @@ class AttributeType extends SchemaItem { else $this->name .= ' ' . $strings[$i]; - } while (!preg_match("/\'$/s", $strings[$i])); + } while (! preg_match("/\'$/s",$strings[$i])); // add alias names for this attribute - while ($strings[++$i]!=')') { + while ($strings[++$i] != ')') { $alias = $strings[$i]; - $alias = preg_replace("/^\'/", '', $alias ); - $alias = preg_replace("/\'$/", '', $alias ); + $alias = preg_replace("/^\'/",'',$alias); + $alias = preg_replace("/\'$/",'',$alias); $this->aliases[] = $alias; } } if (DEBUG_ENABLED) - debug_log('%s::AttributeType(): Case NAME returned (%s) (%s)',8, - get_class($this),$this->name,$this->aliases); + debug_log('Case NAME returned (%s) (%s)',8,__FILE__,__LINE__,__METHOD__,$this->name,$this->aliases); break; case 'DESC': @@ -734,19 +717,17 @@ class AttributeType extends SchemaItem { $this->description=$this->description . $strings[$i]; else $this->description=$this->description . ' ' . $strings[$i]; - } while (!preg_match("/\'$/s", $strings[$i])); + } while (! preg_match("/\'$/s",$strings[$i])); if (DEBUG_ENABLED) - debug_log('%s::AttributeType(): Case DESC returned (%s)',8, - get_class($this),$this->description); + debug_log('Case DESC returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->description); break; case 'OBSOLETE': $this->is_obsolete = TRUE; if (DEBUG_ENABLED) - debug_log('%s::AttributeType(): Case OBSOLETE returned (%s)',8, - get_class($this),$this->is_obsolete); + debug_log('Case OBSOLETE returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->is_obsolete); break; case 'SUP': @@ -754,8 +735,7 @@ class AttributeType extends SchemaItem { $this->sup_attribute = $strings[$i]; if (DEBUG_ENABLED) - debug_log('%s::AttributeType(): Case SUP returned (%s)',8, - get_class($this),$this->sup_attribute); + debug_log('Case SUP returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->sup_attribute); break; case 'EQUALITY': @@ -763,8 +743,7 @@ class AttributeType extends SchemaItem { $this->equality = $strings[$i]; if (DEBUG_ENABLED) - debug_log('%s::AttributeType(): Case EQUALITY returned (%s)',8, - get_class($this),$this->equality); + debug_log('Case EQUALITY returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->equality); break; case 'ORDERING': @@ -772,8 +751,7 @@ class AttributeType extends SchemaItem { $this->ordering = $strings[$i]; if (DEBUG_ENABLED) - debug_log('%s::AttributeType(): Case ORDERING returned (%s)',8, - get_class($this),$this->ordering); + debug_log('Case ORDERING returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->ordering); break; case 'SUBSTR': @@ -781,54 +759,50 @@ class AttributeType extends SchemaItem { $this->sub_str = $strings[$i]; if (DEBUG_ENABLED) - debug_log('%s::AttributeType(): Case SUBSTR returned (%s)',8, - get_class($this),$this->sub_str); + debug_log('Case SUBSTR returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->sub_str); break; case 'SYNTAX': $i++; $this->syntax = $strings[$i]; - $this->syntax_oid = preg_replace('/{\d+}$/', '', $this->syntax); + $this->syntax_oid = preg_replace('/{\d+}$/','',$this->syntax); // does this SYNTAX string specify a max length (ie, 1.2.3.4{16}) - if (preg_match( '/{(\d+)}$/', $this->syntax, $this->max_length)) + if (preg_match('/{(\d+)}$/',$this->syntax,$this->max_length)) $this->max_length = $this->max_length[1]; else $this->max_length = null; - if ($i < count($strings) - 1 && $strings[$i+1]=='{') { + if ($i < count($strings) - 1 && $strings[$i+1] == '{') { do { $i++; $this->name .= ' ' . $strings[$i]; - } while ($strings[$i]!='}'); + } while ($strings[$i] != '}'); } if (DEBUG_ENABLED) - debug_log('%s::AttributeType(): Case SYNTAX returned (%s) (%s) (%s)',8, - get_class($this),$this->syntax,$this->syntax_oid,$this->max_length); + debug_log('Case SYNTAX returned (%s) (%s) (%s)',8,__FILE__,__LINE__,__METHOD__, + $this->syntax,$this->syntax_oid,$this->max_length); break; case 'SINGLE-VALUE': $this->is_single_value = TRUE; if (DEBUG_ENABLED) - debug_log('%s::AttributeType(): Case SINGLE-VALUE returned (%s)',8, - get_class($this),$this->is_single_value); + debug_log('Case SINGLE-VALUE returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->is_single_value); break; case 'COLLECTIVE': $this->is_collective = TRUE; if (DEBUG_ENABLED) - debug_log('%s::AttributeType(): Case COLLECTIVE returned (%s)',8, - get_class($this),$this->is_collective); + debug_log('Case COLLECTIVE returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->is_collective); break; case 'NO-USER-MODIFICATION': $this->is_no_user_modification = TRUE; if (DEBUG_ENABLED) - debug_log('%s::AttributeType(): Case NO-USER-MODIFICATION returned (%s)',8, - get_class($this),$this->is_no_user_modification); + debug_log('Case NO-USER-MODIFICATION returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->is_no_user_modification); break; case 'USAGE': @@ -836,33 +810,32 @@ class AttributeType extends SchemaItem { $this->usage = $strings[$i]; if (DEBUG_ENABLED) - debug_log('%s::AttributeType(): Case USAGE returned (%s)',8, - get_class($this),$this->usage); + debug_log('Case USAGE returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->usage); break; default: - if(preg_match ('/[\d\.]+/i',$strings[$i]) && $i == 1) { + if (preg_match('/[\d\.]+/i',$strings[$i]) && $i == 1) { $this->oid = $strings[$i]; + if (DEBUG_ENABLED) - debug_log('%s::AttributeType(): Case default returned (%s)',8, - get_class($this),$this->oid); + debug_log('Case default returned (%s)',8,__FILE__,__LINE__,__METHOD__,$this->oid); } } } - $this->name = preg_replace("/^\'/", '', $this->name); - $this->name = preg_replace("/\'$/", '', $this->name); - $this->description = preg_replace("/^\'/", '', $this->description); - $this->description = preg_replace("/\'$/", '', $this->description); - $this->syntax = preg_replace("/^\'/", '', $this->syntax ); - $this->syntax = preg_replace("/\'$/", '', $this->syntax ); - $this->syntax_oid = preg_replace("/^\'/", '', $this->syntax_oid ); - $this->syntax_oid = preg_replace("/\'$/", '', $this->syntax_oid ); - $this->sup_attribute = preg_replace("/^\'/", '', $this->sup_attribute ); - $this->sup_attribute = preg_replace("/\'$/", '', $this->sup_attribute ); + $this->name = preg_replace("/^\'/",'',$this->name); + $this->name = preg_replace("/\'$/",'',$this->name); + $this->description = preg_replace("/^\'/",'',$this->description); + $this->description = preg_replace("/\'$/",'',$this->description); + $this->syntax = preg_replace("/^\'/",'',$this->syntax); + $this->syntax = preg_replace("/\'$/",'',$this->syntax); + $this->syntax_oid = preg_replace("/^\'/",'',$this->syntax_oid); + $this->syntax_oid = preg_replace("/\'$/",'',$this->syntax_oid); + $this->sup_attribute = preg_replace("/^\'/",'',$this->sup_attribute); + $this->sup_attribute = preg_replace("/\'$/",'',$this->sup_attribute); if (DEBUG_ENABLED) - debug_log('%s::AttributeType(): Returning ()',9,get_class($this)); + debug_log('Returning ()',9,__FILE__,__LINE__,__METHOD__); } /** @@ -895,7 +868,10 @@ class AttributeType extends SchemaItem { * @return string */ function getSupAttribute() { - return $this->sup_attribute; + if ($this->sup_attribute) + return $this->sup_attribute; + else + return null; } /** @@ -936,13 +912,14 @@ class AttributeType extends SchemaItem { * @param string $attr_name The name of the attribute to check. * @return bool True if the specified attribute is an alias for this one, or false otherwise. */ - function isAliasFor( $attr_name ) { + function isAliasFor($attr_name) { if (DEBUG_ENABLED) - debug_log('%s::isAliasFor(): Entered with (%s)',9,get_class($this),$attr_name); + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$attr_name); - foreach( $this->aliases as $alias_attr_name ) - if( 0 == strcasecmp( $alias_attr_name, $attr_name ) ) + foreach ($this->aliases as $alias_attr_name) + if (strcasecmp($alias_attr_name,$attr_name) == 0) return true; + return false; } @@ -986,7 +963,7 @@ class AttributeType extends SchemaItem { * Sets whether this attribute is single-valued. * @param bool $is_single_value */ - function setIsSingleValue( $is_single_value ) { + function setIsSingleValue($is_single_value) { $this->is_single_value = $is_single_value; } @@ -1020,18 +997,18 @@ class AttributeType extends SchemaItem { * @return bool true on success or false on failure (ie, if the specified * attribute name is not found in this attribute's list of aliases) */ - function removeAlias( $remove_alias_name ) { + function removeAlias($remove_alias_name) { if (DEBUG_ENABLED) - debug_log('%s::removeAlias(): Entered with (%s)',9,get_class($this),$remove_alias_name); + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$remove_alias_name); - foreach( $this->aliases as $i => $alias_name ) { + foreach ($this->aliases as $i => $alias_name) { - if( 0 == strcasecmp( $alias_name, $remove_alias_name ) ) { - unset( $this->aliases[ $i ] ); - $this->aliases = array_values( $this->aliases ); + if (strcasecmp($alias_name,$remove_alias_name) == 0) { + unset($this->aliases[$i]); + + $this->aliases = array_values($this->aliases); return true; } - } return false; } @@ -1040,7 +1017,7 @@ class AttributeType extends SchemaItem { * Adds an attribute name to the alias array. * @param string $new_alias_name The name of a new attribute to add to this attribute's list of aliases. */ - function addAlias( $new_alias_name ) { + function addAlias($new_alias_name) { $this->aliases[] = $new_alias_name; } @@ -1048,7 +1025,7 @@ class AttributeType extends SchemaItem { * Sets this attriute's name. * @param string $new_name The new name to give this attribute. */ - function setName( $new_name ) { + function setName($new_name) { $this->name = $new_name; } @@ -1056,7 +1033,7 @@ class AttributeType extends SchemaItem { * Sets this attriute's SUP attribute (ie, the attribute from which this attribute inherits). * @param string $new_sup_attr The name of the new parent (SUP) attribute */ - function setSupAttribute( $new_sup_attr ) { + function setSupAttribute($new_sup_attr) { $this->sup_attribute = $new_sup_attr; } @@ -1064,7 +1041,7 @@ class AttributeType extends SchemaItem { * Sets this attribute's list of aliases. * @param array $new_aliases The array of alias names (strings) */ - function setAliases( $new_aliases ) { + function setAliases($new_aliases) { $this->aliases = $new_aliases; } @@ -1072,7 +1049,7 @@ class AttributeType extends SchemaItem { * Sets this attribute's type. * @param string $new_type The new type. */ - function setType( $new_type ) { + function setType($new_type) { $this->type = $new_type; } @@ -1081,13 +1058,18 @@ class AttributeType extends SchemaItem { * that is the list of objectClasses which provide this attribute. * @param string $object_class_name The name of the objectClass to add. */ - function addUsedInObjectClass( $object_class_name ) { + function addUsedInObjectClass($object_class_name) { if (DEBUG_ENABLED) - debug_log('%s::addUsedInObjectClass(): Entered with (%s)',9,get_class($this),$object_class_name); + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$object_class_name); - foreach( $this->used_in_object_classes as $used_in_object_class ) - if( 0 == strcasecmp( $used_in_object_class, $object_class_name ) ) + foreach ($this->used_in_object_classes as $used_in_object_class) { + if (DEBUG_ENABLED) + debug_log('Checking (%s) with (%s)',8,__FILE__,__LINE__,__METHOD__,$used_in_object_class,$object_class_name); + + if (strcasecmp($used_in_object_class,$object_class_name) == 0) return false; + } + $this->used_in_object_classes[] = $object_class_name; return true; } @@ -1106,13 +1088,14 @@ class AttributeType extends SchemaItem { * that is the list of objectClasses which must have this attribute. * @param string $object_class_name The name of the objectClass to add. */ - function addRequiredByObjectClass( $object_class_name ) { + function addRequiredByObjectClass($object_class_name) { if (DEBUG_ENABLED) - debug_log('%s::addRequiredByObjectClass(): Entered with (%s)',9,get_class($this),$object_class_name); + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$object_class_name); - foreach( $this->required_by_object_classes as $required_by_object_class ) - if( 0 == strcasecmp( $required_by_object_class, $object_class_name ) ) + foreach ($this->required_by_object_classes as $required_by_object_class) + if (strcasecmp($required_by_object_class,$object_class_name) == 0) return false; + $this->required_by_object_classes[] = $object_class_name; return true; } @@ -1133,7 +1116,7 @@ class AttributeType extends SchemaItem { */ class Syntax extends SchemaItem { /** Initializes the class' member variables */ - function initVars() { + function initVars() { parent::initVars(); $this->oid = null; @@ -1143,34 +1126,38 @@ class Syntax extends SchemaItem { /** * Creates a new Syntax object from a raw LDAP syntax string. */ - function Syntax ( $raw_ldap_syntax_string ) { + function Syntax($raw_ldap_syntax_string) { if (DEBUG_ENABLED) - debug_log('%s::__construct(): Entered with (%s)',9,get_class($this),$raw_ldap_syntax_string); + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$raw_ldap_syntax_string); $this->initVars(); $class = $raw_ldap_syntax_string; - $strings = preg_split ('/[\s,]+/', $class, -1,PREG_SPLIT_DELIM_CAPTURE); + $strings = preg_split('/[\s,]+/',$class,-1,PREG_SPLIT_DELIM_CAPTURE); + for($i=0; $idescription)==0) + if (strlen($this->description) == 0) $this->description=$this->description . $strings[$i]; else $this->description=$this->description . ' ' . $strings[$i]; - }while(!preg_match("/\'$/s", $strings[$i])); + } while (! preg_match("/\'$/s",$strings[$i])); break; + default: - if(preg_match ('/[\d\.]+/i',$strings[$i]) && $i == 1) + if (preg_match('/[\d\.]+/i',$strings[$i]) && $i == 1) $this->oid = $strings[$i]; } } - $this->description = preg_replace("/^\'/", '', $this->description); - $this->description = preg_replace("/\'$/", '', $this->description); + + $this->description = preg_replace("/^\'/",'',$this->description); + $this->description = preg_replace("/\'$/",'',$this->description); } } @@ -1203,52 +1190,55 @@ class MatchingRule extends SchemaItem { /** * Creates a new MatchingRule object from a raw LDAP MatchingRule string. */ - function MatchingRule( $raw_ldap_matching_rule_string ) { + function MatchingRule($raw_ldap_matching_rule_string) { if (DEBUG_ENABLED) - debug_log('%s::__construct(): Entered with (%s)',9,get_class($this),$raw_ldap_matching_rule_string); + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$raw_ldap_matching_rule_string); $this->initVars(); - $strings = preg_split ('/[\s,]+/', $raw_ldap_matching_rule_string, -1,PREG_SPLIT_DELIM_CAPTURE); - for($i=0; $iname)==0) + if (strlen($this->name) == 0) $this->name = $strings[$i]; else $this->name .= ' ' . $strings[$i]; - }while(!preg_match("/\'$/s", $strings[$i])); + } while (! preg_match("/\'$/s",$strings[$i])); + } else { $i++; do { $i++; - if(strlen($this->name) == 0) + if (strlen($this->name) == 0) $this->name = $strings[$i]; else $this->name .= ' ' . $strings[$i]; - } while(!preg_match("/\'$/s", $strings[$i])); + } while (! preg_match("/\'$/s",$strings[$i])); + do { $i++; } while (! preg_match('/\)+\)?/',$strings[$i])); } - $this->name = preg_replace("/^\'/", '', $this->name); - $this->name = preg_replace("/\'$/", '', $this->name); + + $this->name = preg_replace("/^\'/",'',$this->name); + $this->name = preg_replace("/\'$/",'',$this->name); break; case 'DESC': do { $i++; - if(strlen($this->description)==0) + if (strlen($this->description)==0) $this->description=$this->description . $strings[$i]; else $this->description=$this->description . ' ' . $strings[$i]; - }while(!preg_match("/\'$/s", $strings[$i])); + } while (! preg_match("/\'$/s",$strings[$i])); break; case 'OBSOLETE': @@ -1260,19 +1250,19 @@ class MatchingRule extends SchemaItem { break; default: - if(preg_match ('/[\d\.]+/i',$strings[$i]) && $i == 1) + if (preg_match('/[\d\.]+/i',$strings[$i]) && $i == 1) $this->oid = $strings[$i]; } } - $this->description = preg_replace("/^\'/", '', $this->description); - $this->description = preg_replace("/\'$/", '', $this->description); + $this->description = preg_replace("/^\'/",'',$this->description); + $this->description = preg_replace("/\'$/",'',$this->description); } /** * Sets the list of used_by_attrs to the array specified by $attrs; * @param array $attrs The array of attribute names (strings) which use this MatchingRule */ - function setUsedByAttrs( $attrs ) { + function setUsedByAttrs($attrs) { $this->used_by_attrs = $attrs; } @@ -1280,13 +1270,14 @@ class MatchingRule extends SchemaItem { * Adds an attribute name to the list of attributes who use this MatchingRule * @return true if the attribute was added and false otherwise (already in the list) */ - function addUsedByAttr( $new_attr_name ) { + function addUsedByAttr($new_attr_name) { if (DEBUG_ENABLED) - debug_log('%s::addUsedByAttr(): Entered with (%s)',9,get_class($this),$new_attr_name); + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$new_attr_name); - foreach( $this->used_by_attrs as $attr_name ) - if( 0 == strcasecmp( $attr_name, $new_attr_name ) ) + foreach ($this->used_by_attrs as $attr_name) + if (strcasecmp($attr_name,$new_attr_name) == 0) return false; + $this->used_by_attrs[] = $new_attr_name; return true; @@ -1345,60 +1336,64 @@ class MatchingRuleUse extends SchemaItem { $this->used_by_attrs = array(); } - function MatchingRuleUse( $raw_matching_rule_use_string ) { + function MatchingRuleUse($raw_matching_rule_use_string) { if (DEBUG_ENABLED) - debug_log('%s::__construct(): Entered with (%s)',9,get_class($this),$raw_matching_rule_use_string); + debug_log('Entered with (%s)',9,__FILE__,__LINE__,__METHOD__,$raw_matching_rule_use_string); $this->initVars(); - $strings = preg_split ('/[\s,]+/', $raw_matching_rule_use_string, -1,PREG_SPLIT_DELIM_CAPTURE); + $strings = preg_split('/[\s,]+/',$raw_matching_rule_use_string,-1,PREG_SPLIT_DELIM_CAPTURE); for($i=0; $iname ) || strlen( $this->name ) ==0 ) + if (! isset($this->name) || strlen($this->name) == 0) $this->name = $strings[$i]; - else + else $this->name .= ' ' . $strings[$i]; - }while(!preg_match("/\'$/s", $strings[$i])); + + } while (! preg_match("/\'$/s",$strings[$i])); + } else { $i++; do { $i++; - if(strlen($this->name) == 0) + if (strlen($this->name) == 0) $this->name = $strings[$i]; else $this->name .= ' ' . $strings[$i]; - } while(!preg_match("/\'$/s", $strings[$i])); + } while (! preg_match("/\'$/s",$strings[$i])); + do { $i++; } while (! preg_match('/\)+\)?/',$strings[$i])); } - $this->name = preg_replace("/^\'/", '', $this->name); - $this->name = preg_replace("/\'$/", '', $this->name); + + $this->name = preg_replace("/^\'/",'',$this->name); + $this->name = preg_replace("/\'$/",'',$this->name); break; case 'APPLIES': - // TODO - if($strings[$i+1]!='(') { - // has a single attribute name + # @TODO + if ($strings[$i+1] != '(') { + # Has a single attribute name $i++; - $this->used_by_attrs = array( $strings[$i] ); + $this->used_by_attrs = array($strings[$i]); //echo "Adding single: " . $strings[$i] . "
"; + } else { - // has multiple attribute names + # Has multiple attribute names $i++; - while($strings[$i]!=')') { + while ($strings[$i] != ')') { $i++; $new_attr = $strings[$i]; - $new_attr = preg_replace("/^\'/", '', $new_attr ); - $new_attr = preg_replace("/\'$/", '', $new_attr ); + $new_attr = preg_replace("/^\'/",'',$new_attr); + $new_attr = preg_replace("/\'$/",'',$new_attr); $this->used_by_attrs[] = $new_attr; //echo "Adding $new_attr
"; $i++; @@ -1407,11 +1402,11 @@ class MatchingRuleUse extends SchemaItem { break; default: - if(preg_match ('/[\d\.]+/i',$strings[$i]) && $i == 1) + if (preg_match('/[\d\.]+/i',$strings[$i]) && $i == 1) $this->oid = $strings[$i]; } } - sort( $this->used_by_attrs ); + sort($this->used_by_attrs); } /** diff --git a/lib/search_form_advanced.php b/lib/search_form_advanced.php index 5bffae9..fd418fd 100644 --- a/lib/search_form_advanced.php +++ b/lib/search_form_advanced.php @@ -1,5 +1,5 @@ - $ignore) { - foreach ($server_info_list[$i]['base_dns'] as $base_dn) { ?> - -addToServersList(new server(,"","")); - - + $ignore) { + foreach ($server_info_list[$i]['base_dns'] as $base_dn) { ?> + addToServersList(new server(,"","")); + function focus_filter() { - document.advanced_search_form.filter.focus(); + document.advanced_search_form.filter.focus(); } - diff --git a/lib/search_form_predefined.php b/lib/search_form_predefined.php index e9550b6..772e921 100644 --- a/lib/search_form_predefined.php +++ b/lib/search_form_predefined.php @@ -1,45 +1,53 @@ '; +echo ''; +echo ''; ?> diff --git a/lib/search_form_simple.php b/lib/search_form_simple.php index 783e022..8445a46 100644 --- a/lib/search_form_simple.php +++ b/lib/search_form_simple.php @@ -1,5 +1,5 @@ -