Compare commits

...

119 Commits

Author SHA1 Message Date
Deon George
a3ac658756 Release 1.2.0.3 2009-09-07 00:39:38 +10:00
Deon George
e83aba595c Merge translations from launchpad for PLA 1.2.0.3 2009-09-07 00:39:06 +10:00
Deon George
3ffe6878f3 Minor updates 2009-09-07 00:13:58 +10:00
Deon George
02e9f8477a Suppress more template warnings 2009-08-30 12:11:18 +10:00
Ethan Moore
259179a1b3 Enable SASL (GSSAPI) 2009-08-29 12:19:10 +10:00
Deon George
96bad27d64 Fix: clear passwords were being encoded with blowfish by default 2009-08-29 00:11:24 +10:00
Deon George
c69cd68fcb SF Bug #2828378 - fallback_dn config option no longer works in 1.2.0 2009-08-29 00:11:23 +10:00
Deon George
9cb27e3a70 Miscellaneous minor updates 2009-08-29 00:11:23 +10:00
Deon George
52fbd24b2c Merge PickList and MultiList functions (also fixes SF Bug #2844714) 2009-08-28 20:06:13 +10:00
Deon George
f83a922589 SF Bug #2845986 - Missing config/config.php file not detected in 1.2.0.2 2009-08-28 17:18:08 +10:00
Deon George
3e446fddf4 SF Bug #2845904 - session.autostart breaks 2009-08-28 17:01:15 +10:00
Deon George
bdb423d0d3 SF Bug #2844186 - fail to add and edit entries (delete work fine) 2009-08-28 16:31:19 +10:00
Deon George
2c99cc9016 Fix export only exports 500 entries 2009-08-28 15:03:24 +10:00
Deon George
b93b92f430 Rework javascript 2009-08-22 21:30:50 +10:00
Deon George
26fa2ba2c5 Only sort children after reading additional entries 2009-08-22 13:30:30 +10:00
Deon George
76ddeccf8c Release 1.2.0.2 2009-08-21 23:42:44 +10:00
Deon George
1336fc21b6 Merge translations from launchpad for PLA 1.2.0.2 2009-08-21 23:40:21 +10:00
Deon George
356f319291 Fix up calls with ldap_read 2009-08-21 18:32:52 +10:00
Deon George
6e6a7a6e4e Multiple fixes, changes and enhancements
* mass edit selection,
* child search during edit,
* attr login with bind_id,
* performance fix broke ldapservers that dont have havesubordinate attrs),
* enable "login,class",
* enable "login,base".
2009-08-21 15:02:12 +10:00
Deon George
95aedef718 Remove CVS tags 2009-08-20 12:25:48 +10:00
Deon George
b0f9fa8806 Fix URL to favicon 2009-08-20 09:25:34 +10:00
Deon George
ec482c70fe Fix list address 2009-08-19 22:30:19 +10:00
Deon George
9fda881a8e Add size_limit to default search 2009-08-19 22:26:33 +10:00
Deon George
46c100660b Fix query default sorting and query form when no templates 2009-08-19 22:18:00 +10:00
Deon George
4c56f3e678 Fix AJAX rendering of query results 2009-08-19 21:20:51 +10:00
Deon George
ebe2cb6eda Performance improvements for the tree. 2009-08-19 21:19:35 +10:00
Deon George
5669c92371 Improvements to debug_log 2009-08-19 13:39:37 +10:00
Harri
0eaf3bb67b SF Bug #2839213 - Few localization -related bugs 2009-08-18 19:16:36 +10:00
Deon George
9f1a207eba Ammendment for SF Feature #2837687 - Invalid method for Queries 2009-08-18 19:13:50 +10:00
Deon George
5706ad1b4a Ammendment for SF Feature #2837687, dont render the only template if it is invalid 2009-08-17 16:30:05 +10:00
Deon George
ba553353b0 SF Feature #2837687 - Automatic template selection from one of one valid templates 2009-08-17 16:13:55 +10:00
Aurélien Requiem
803a4c821a SF Feature #2827191 - warnings for missing objectClass could be disabled 2009-08-17 15:09:32 +10:00
Deon George
a5b9e43a57 Fix for when renaming entries only changes case (https://bugs.launchpad.net/bugs/384157) 2009-08-17 10:52:46 +10:00
Deon George
df404d435a login,attr only applies to user sessions 2009-08-17 10:46:22 +10:00
Deon George
cf4f339b5c Fix missing encoding SambaPasswordAttributes 2009-08-14 11:47:45 +10:00
Deon George
48faaba955 Merge translations from launchpad for PLA 1.2.0.1 2009-08-13 22:04:16 +10:00
Deon George
898eabaa11 Release 1.2.0.1 2009-08-13 21:40:59 +10:00
Deon George
9eca46d0cc Fixed display of Windows AD binary attributes 2009-08-13 21:39:43 +10:00
Deon George
8a21bbee12 Fix render of ReadOnly binary attributes 2009-08-13 21:22:41 +10:00
Aurélien Requiem
59c4e7896f SF Bug #2827012 - the modification tpl for inetOrgPerson is partially invalid 2009-08-13 09:00:04 +10:00
Deon George
cc3b67b71a More login processing fixes 2009-08-12 23:54:01 +10:00
Deon George
a0816d068c Sync menu/tree processing with other projects, variable/function naming 2009-08-12 23:53:14 +10:00
Deon George
fb48055d2d Fix for when method supplies null for login details 2009-07-27 19:17:40 +10:00
Deon George
86c8f13065 Fixed missing uid.png 2009-07-27 19:16:12 +10:00
Deon George
7dd52f8219 More issues for anon login to LDAP server to get user details 2009-07-27 17:19:53 +10:00
Deon George
29cb490571 Fixes for issues introduced by commit bbe87c6e2 2009-07-27 17:18:25 +10:00
Deon George
5938302012 Fix the simple ACL configuration 2009-07-26 01:21:23 +10:00
Deon George
196aa00218 Fix for when a root_dse query doesnt return any results 2009-07-26 01:21:23 +10:00
Deon George
dc3e477778 Improve getLogin() for multiple method logins and fix anonymous logout 2009-07-26 01:21:23 +10:00
Deon George
869b9be7e9 Fix IMGDIR/CSSDIR when no config.php yet and creating setting to disable remoteurls for sflogo 2009-07-26 01:21:23 +10:00
Deon George
a1cfa2f60c SF Bug #2826569 - missing information in config.php.example 2009-07-25 20:17:36 +10:00
Deon George
3ada58fb7d Fix version number detection 2009-07-22 00:01:20 +10:00
Deon George
22bcaf0136 Release 1.2.0 2009-07-21 23:22:43 +10:00
Deon George
008b463e8e Language import from launchpad 2009-07-21 23:22:00 +10:00
Deon George
0de55e552b New language from launchpad 2009-07-21 23:21:43 +10:00
Deon George
2725bb16da Updated to process launchpad exports 2009-07-21 23:21:25 +10:00
Deon George
bbe87c6e2f SF Bug #2820854 - ldap_first_attribute error 2009-07-14 19:07:43 +10:00
Deon George
45ca83411f Fix: Setting to null after getting the error messages 2009-07-12 23:49:39 +10:00
Deon George
3c9f63ae6b Initial language merge 2009-07-12 23:28:46 +10:00
Deon George
0171853f1d Fix tree was remembered empty with anonymous 2009-07-12 22:03:05 +10:00
Deon George
6627c7bea4 Fix spelling 2009-07-12 22:02:30 +10:00
Deon George
223086b58e Fix for when invalid objectclass entered 2009-07-12 22:02:19 +10:00
Deon George
5481f61ce3 Use calls to getRootDSE() 2009-07-12 12:28:39 +10:00
Deon George
57d405fe3b SF Feature #2073323 - Using Single Sign On authentication 2009-07-12 12:01:59 +10:00
Deon George
ed4784b1b6 Fix isLoggedIn() caching for multiple servers 2009-07-11 17:20:21 +10:00
Deon George
d364af141f Minor display change 2009-07-11 14:19:04 +10:00
Deon George
e2c74f9467 Comment fixes 2009-07-11 14:15:17 +10:00
Deon George
0d71a96e34 Display error if there is only 1 autoFill param 2009-07-11 10:19:30 +10:00
Deon George
4eed1d8982 Enabled HTTP auth 2009-07-11 10:18:48 +10:00
Deon George
899f83aa17 Release candidate 1.2.0-rc1 2009-07-08 21:29:57 +10:00
Deon George
775c7751ae Re-evaluate how we determine the version number now we are using GIT 2009-07-08 21:29:38 +10:00
Deon George
664c05decd Removed stylesheet from index 2009-07-08 20:17:35 +10:00
Deon George
ea0fdab6ba SF Feature #1954220 - New icon theme Tango 2009-07-08 20:11:58 +10:00
Deon George
1aa88e4dc3 Standardised some naming of the icons to allow for other themes 2009-07-08 20:10:57 +10:00
Deon George
7273ad292b New Feature: PLA icons and CSS can now be themeble 2009-07-08 16:14:50 +10:00
Deon George
b4653e84a2 SF Feature #1719978 - GetNextNumber with uid interval support 2009-07-07 21:54:18 +10:00
Deon George
4cab46a55e New Feature: Mass Edit 2009-07-07 20:16:28 +10:00
Deon George
e7ce1030c0 Enchanced getLDAPmodify() to allow multiple update calls 2009-07-07 20:16:28 +10:00
Deon George
6270967ec0 Improve processing in drawSubTitle() 2009-07-07 20:16:28 +10:00
Deon George
d501393d49 Enabled Feature: Mass Delete 2009-07-07 20:16:28 +10:00
Deon George
08199e67e0 Fixed failed copy message 2009-07-07 20:16:28 +10:00
Deon George
03bc1ce70e Fix query to find children, add size_limit to query to ensure we get all children 2009-07-07 20:16:28 +10:00
Deon George
fcaa4d8db6 Fix server_id used in URL 2009-07-07 20:16:28 +10:00
Deon George
ee9533c770 Merge branch 'master' of ssh://wurley@phpldapadmin.git.sf.net/gitroot/phpldapadmin 2009-07-06 18:01:26 +10:00
Deon George
07b40c1c34 Ackownledge source for our icons 2009-07-06 17:50:06 +10:00
Deon George
84bf604cba Enabled inetOrgPerson in modification 2009-07-06 17:50:06 +10:00
Deon George
4f6d661c12 Added posixGroup modification template 2009-07-06 17:50:06 +10:00
Deon George
97fcaed8f7 Added .gitignore 2009-07-06 17:50:06 +10:00
Deon George
d601121dba Fix added detection of password already encode when submitting updates 2009-07-06 17:50:06 +10:00
Deon George
aa2719f8fe Template modifications now add/remove attributes as per the template definition 2009-07-06 17:50:06 +10:00
Deon George
54df56bb1a Fixed invalid return variable 2009-07-06 17:50:06 +10:00
Deon George
db2e8861fa Enabled a param so that some calls to getValue() are not fatal 2009-07-06 17:50:05 +10:00
Deon George
c230058d3f Added .gitignore 2009-07-06 10:57:58 +10:00
Deon George
a0ae7bf111 Fix added detection of password already encode when submitting updates 2009-07-05 23:40:09 +10:00
Deon George
7591eefb70 Template modifications now add/remove attributes as per the template definition 2009-07-05 22:13:17 +10:00
Deon George
20bdaa4663 Fixed invalid return variable 2009-07-05 13:55:53 +10:00
Deon George
640abcbf3b Enabled a param so that some calls to getValue() are not fatal 2009-07-05 13:55:27 +10:00
Deon George
8e8db2e4ed Improved layout 2009-07-02 18:35:59 +10:00
Deon George
ea17aadef4 Latest SANDPIT - MERGE from CVS (MERGE-GIT) 2009-07-01 16:09:17 +10:00
Deon George
388783fc84 RELEASE 1.1.0.7 2009-06-30 22:05:31 +10:00
Deon George
647f86562f RELEASE 1.1.0.6 2009-06-30 21:52:55 +10:00
Deon George
d5f4f91f1b RELEASE 1.1.0.5 2009-06-30 21:51:50 +10:00
Deon George
d5b4aa54ea RELEASE 1.1.0.4 2009-06-30 21:50:46 +10:00
Deon George
23a33eef99 RELEASE 1.1.0.3 2009-06-30 21:48:22 +10:00
Deon George
5c88e0a098 RELEASE 1.1.0.2 2009-06-30 21:46:44 +10:00
Deon George
f990f72eb5 RELEASE 1.1.0.1 2009-06-30 20:46:41 +10:00
Deon George
dd581eb5c8 RELEASE 1.1.0 2009-06-30 20:46:00 +10:00
Deon George
a08bc4e9e1 RELEASE 1.0.2 2009-06-30 20:41:18 +10:00
Deon George
5f261ded38 RELEASE 1.0.1 2009-06-30 20:40:33 +10:00
Deon George
eccabca011 RELEASE 1.0.0 2009-06-30 20:40:03 +10:00
Deon George
c3713350e2 RELEASE 0.9.8.5 2009-06-30 20:28:51 +10:00
Deon George
c131e8b479 RELEASE 0.9.8.4 2009-06-30 20:28:19 +10:00
Deon George
a01f7c8289 RELEASE 0.9.8.3 2009-06-30 20:27:56 +10:00
Deon George
7741110caf RELEASE 0.9.8.2 2009-06-30 20:27:11 +10:00
Deon George
abc62c7fdc RELEASE 0.9.8.1 2009-06-30 20:26:45 +10:00
Deon George
fdee1bdbd1 RELEASE 0.9.8 2009-06-30 20:26:08 +10:00
Deon George
1f7f96122f RELEASE 0.9.7.2 2009-06-30 19:41:11 +10:00
Deon George
b443271175 RELEASE 0.9.7.1 2009-06-30 19:40:37 +10:00
Deon George
bbcd2cb3b6 Moved files 2009-06-30 19:39:45 +10:00
785 changed files with 111001 additions and 46731 deletions

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
config/config.php
queries/custom_*
templates/*/custom_*

28
INSTALL
View File

@@ -1,37 +1,23 @@
For install instructions in non-English languages, see the files
in the "doc" directory.
For install instructions in non-English languages, see the wiki:
http://phpldapadmin.sourceforge.net
* Requirements
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
1. Unpack the archive (if you're reading this, you already did that).
2. Put the resulting 'phpldapadmin' directory somewhere in your webroot.
3. Copy 'config.php.example' to 'config.php' and edit to taste.
3. Copy 'config.php.example' to 'config.php' and edit to taste (this is in the config/ directory).
4. Then, point your browser to the phpldapadmin directory.
* For additional help
See the files in the "doc" directory.
See the wiki:
http://phpldapadmin.sourceforge.net
Join our mailing list:
https://lists.sourceforge.net/lists/listinfo/phpldapadmin-devel
* Platform specific notes
* OpenBSD with chroot'ed Apache:
For jpeg photos to work properly, you must do this:
# mkdir /var/www/tmp, and then
# chown root:daemon /var/www/tmp
# chmod 1755 /var/www/tmp
Where tmp is the $config->custom->tmpdir['jpeg'] configured in config.php
* Windows
For jpeg photos to work properly, be sure to change $config->custom->tmpdir['jpeg']
from "/tmp" to "c:\\temp" or similar.

View File

@@ -1 +1 @@
0.9.7
RELEASE-1.2.0.3

View File

@@ -1,163 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/add_attr.php,v 1.15 2005/09/25 16:11:44 wurley Exp $
/**
* Adds an attribute/value pair to an object
*
* Variables that come in via common.php
* - server_id
* Variables that come in as POST vars:
* - dn
* - attr
* - val
* - binary
*
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
require TMPLDIR.'template_config.php';
if( $ldapserver->isReadOnly() )
pla_error( $lang['no_updates_in_read_only_mode'] );
if( ! $ldapserver->haveAuthInfo())
pla_error( $lang['not_enough_login_info'] );
$attr = $_POST['attr'];
$val = isset( $_POST['val'] ) ? $_POST['val'] : false;;
$dn = $_POST['dn'] ;
$is_binary_val = isset( $_POST['binary'] ) ? true : false;
$encoded_dn = rawurlencode( $dn );
$encoded_attr = rawurlencode( $attr );
if( ! $is_binary_val && $val == "" ) {
pla_error( $lang['left_attr_blank'] );
}
// 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 = checkUniqueAttr( $ldapserver, $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( $lang['unique_attr_failed'],$attr,$badattr,$dn,$search_href ) );
}
if( $is_binary_val ) {
if( 0 == $_FILES['val']['size'] )
pla_error( $lang['file_empty'] );
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( $lang['invalid_file'] );
break;
case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini
pla_error( $lang['uploaded_file_too_big'] );
break;
case 2: //uploaded file exceeds the MAX_FILE_SIZE directive specified in the html form
pla_error( $lang['uploaded_file_too_big'] );
break;
case 3: //uploaded file was only partially uploaded
pla_error( $lang['uploaded_file_partial'] );
break;
case 4: //no file was uploaded
pla_error( $lang['left_attr_blank'] );
break;
default: //a default error, just in case! :)
pla_error( $lang['invalid_file'] );
break;
}
else
pla_error( $lang['invalid_file'] );
}
$file = $_FILES['val']['tmp_name'];
$f = fopen( $file, 'r' );
$binary_data = fread( $f, filesize( $file ) );
fclose( $f );
$val = $binary_data;
if( is_binary_option_required( $ldapserver, $attr ) )
$attr .= ";binary";
}
/* Automagically hash new userPassword attributes according to the
chosen in config.php. */
if( 0 == strcasecmp( $attr, 'userpassword' ) ) {
if (trim($ldapserver->default_hash) != '' ) {
$enc_type = $ldapserver->default_hash;
$val = password_hash( $val, $enc_type );
}
}
elseif( in_array( $attr,array('sambantpassword','sambalmpassword') ) ){
$mkntPassword = new MkntPasswdUtil();
$mkntPassword->createSambaPasswords( $val );
$val = $mkntPassword->valueOf($attr);
}
$new_entry = array( $attr => $val );
$result = @ldap_mod_add( $ldapserver->connect(), $dn, $new_entry );
if ($result)
header(sprintf('Location: edit.php?server_id=%s&dn=%s&modified_attrs[]=%s',
$ldapserver->server_id,$encoded_dn,$encoded_attr));
else
pla_error( $lang['failed_to_add_attr'],ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect()) );
/**
* Check if we need to append the ;binary option to the name
* of some binary attribute
*
* @param object $ldapserver Server Object that the attribute is in.
* @param attr $attr Attribute to test to see if it requires ;binary added to it.
* @return bool
*/
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"
);
// 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 = get_schema_attribute( $ldapserver, $attr );
if( ! $schema_attr )
return false;
$syntax = $schema_attr->getSyntaxOID();
if( isset( $binary_attributes_with_options[ $syntax ] ) )
return true;
return false;
}
?>

View File

@@ -1,197 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/add_attr_form.php,v 1.12 2005/07/22 05:42:18 wurley Exp $
/**
* Displays a form for adding an attribute/value to an LDAP entry.
*
* Variables that come in via common.php
* - server_id
* Variables that come in as GET vars:
* - dn (rawurlencoded)
*
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
if( $ldapserver->isReadOnly() )
pla_error( $lang['no_updates_in_read_only_mode'] );
if( ! $ldapserver->haveAuthInfo())
pla_error( $lang['not_enough_login_info'] );
$dn = $_GET['dn'];
$encoded_dn = rawurlencode( $dn );
$rdn = get_rdn( $dn );
$friendly_attrs = process_friendly_attr_table();
include './header.php'; ?>
<body>
<h3 class="title"><?php echo sprintf( $lang['add_new_attribute'], htmlspecialchars( $rdn ) ); ?></b></h3>
<h3 class="subtitle"><?php echo $lang['server']; ?>: <b><?php echo $ldapserver->name; ?></b> &nbsp;&nbsp;&nbsp; <?php echo $lang['distinguished_name']; ?>: <b><?php echo htmlspecialchars( ( $dn ) ); ?></b></h3>
<?php $attrs = get_object_attrs( $ldapserver, $dn );
$oclasses = get_object_attr( $ldapserver, $dn, 'objectClass' );
if( ! is_array( $oclasses ) )
$oclasses = array( $oclasses );
$avail_attrs = array();
$schema_oclasses = get_schema_objectclasses( $ldapserver, $dn );
foreach( $oclasses as $oclass ) {
$schema_oclass = get_schema_objectclass( $ldapserver, $oclass, $dn );
if( $schema_oclass && 0 == strcasecmp( 'objectclass', get_class( $schema_oclass ) ) )
$avail_attrs = array_merge( $schema_oclass->getMustAttrNames( $schema_oclasses ),
$schema_oclass->getMayAttrNames( $schema_oclasses ),
$avail_attrs );
}
$avail_attrs = array_unique( $avail_attrs );
$avail_attrs = array_filter( $avail_attrs, "not_an_attr" );
sort( $avail_attrs );
$avail_binary_attrs = array();
foreach( $avail_attrs as $i => $attr ) {
if( is_attr_binary( $ldapserver, $attr ) ) {
$avail_binary_attrs[] = $attr;
unset( $avail_attrs[ $i ] );
}
}
?>
<br />
<center>
<?php echo $lang['add_new_attribute'];
if( is_array( $avail_attrs ) && count( $avail_attrs ) > 0 ) { ?>
<br />
<br />
<form action="add_attr.php" method="post">
<input type="hidden" name="server_id" value="<?php echo $ldapserver->server_id; ?>" />
<input type="hidden" name="dn" value="<?php echo htmlspecialchars($dn); ?>" />
<select name="attr">
<?php $attr_select_html = '';
usort($avail_attrs,"sortAttrs");
foreach( $avail_attrs as $a ) {
// is there a user-friendly translation available for this attribute?
if( isset( $friendly_attrs[ strtolower( $a ) ] ) ) {
$attr_display = htmlspecialchars( $friendly_attrs[ strtolower( $a ) ] ) . " (" .
htmlspecialchars($a) . ")";
} else {
$attr_display = htmlspecialchars( $a );
}
echo $attr_display;
$attr_select_html .= "<option>$attr_display</option>\n";
echo "<option value=\"" . htmlspecialchars($a) . "\">$attr_display</option>";
} ?>
</select>
<input type="text" name="val" size="20" />
<input type="submit" name="submit" value="<?php echo $lang['add']; ?>" class="update_dn" />
</form>
<?php } else { ?>
<br />
<br />
<small>(<?php echo $lang['no_new_attrs_available']; ?>)</small>
<br />
<br />
<?php } ?>
<?php echo $lang['add_new_binary_attr'];
if( count( $avail_binary_attrs ) > 0 ) { ?>
<!-- Form to add a new BINARY attribute to this entry -->
<form action="add_attr.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="server_id" value="<?php echo $ldapserver->server_id; ?>" />
<input type="hidden" name="dn" value="<?php echo $dn; ?>" />
<input type="hidden" name="binary" value="true" />
<br />
<select name="attr">
<?php $attr_select_html = '';
usort($avail_binary_attrs,"sortAttrs");
foreach( $avail_binary_attrs as $a ) {
// is there a user-friendly translation available for this attribute?
if( isset( $friendly_attrs[ strtolower( $a ) ] ) ) {
$attr_display = htmlspecialchars( $friendly_attrs[ strtolower( $a ) ] ) . " (" .
htmlspecialchars($a) . ")";
} else {
$attr_display = htmlspecialchars( $a );
}
echo $attr_display;
$attr_select_html .= "<option>$attr_display</option>\n";
echo "<option value=\"" . htmlspecialchars($a) . "\">$attr_display</option>";
} ?>
</select>
<input type="file" name="val" size="20" />
<input type="submit" name="submit" value="<?php echo $lang['add']; ?>" class="update_dn" />
<?php if( ! ini_get( 'file_uploads' ) )
echo "<br><small><b>" . $lang['warning_file_uploads_disabled'] . "</b></small><br>";
else
echo "<br><small><b>" . sprintf( $lang['max_file_size'], ini_get( 'upload_max_filesize' ) ) . "</b></small><br>";
?>
</form>
<?php } else { ?>
<br />
<br />
<small>(<?php echo $lang['no_new_binary_attrs_available']; ?>)</small>
<?php } ?>
</center>
</body>
</html>
<?php
/**
* Given an attribute $x, this returns true if it is NOT already specified
* in the current entry, returns false otherwise.
*
* @param attr $x
* @return bool
* @ignore
*/
function not_an_attr( $x ) {
global $attrs;
//return ! isset( $attrs[ strtolower( $x ) ] );
foreach( $attrs as $attr => $values )
if( 0 == strcasecmp( $attr, $x ) )
return false;
return true;
}
?>

View File

@@ -1,64 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/add_oclass.php,v 1.16 2005/07/22 06:34:55 wurley Exp $
/**
* Adds an objectClass to the specified dn.
*
* Note, this does not do any schema violation checking. That is
* performed in add_oclass_form.php.
*
* Variables that come in via common.php
* - server_id
* Variables that come in as POST vars:
* - dn (rawurlencoded)
* - new_oclass
* - new_attrs (array, if any)
*
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
if( $ldapserver->isReadOnly() )
pla_error( $lang['no_updates_in_read_only_mode'] );
if( ! $ldapserver->haveAuthInfo())
pla_error( $lang['not_enough_login_info'] );
$dn = rawurldecode( $_POST['dn'] );
$new_oclass = unserialize( rawurldecode( $_POST['new_oclass'] ) );
$new_attrs = $_POST['new_attrs'];
$encoded_dn = rawurlencode( $dn );
if( is_attr_read_only( $ldapserver, 'objectClass' ) )
pla_error( "ObjectClasses are flagged as read only in the phpLDAPadmin configuration." );
$new_entry = array();
$new_entry['objectClass'] = $new_oclass;
$new_attrs_entry = array();
$new_oclass_entry = array( 'objectClass' => $new_oclass );
if( is_array( $new_attrs ) && count( $new_attrs ) > 0 )
foreach( $new_attrs as $attr => $val ) {
// Check to see if this is a unique Attribute
if( $badattr = checkUniqueAttr( $ldapserver, $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( $lang['unique_attr_failed'],$attr,$badattr,$dn,$search_href ) );
}
$new_entry[ $attr ] = $val;
}
$add_res = @ldap_mod_add( $ldapserver->connect(), $dn, $new_entry );
if (! $add_res)
pla_error($lang['could_not_perform_ldap_mod_add'],ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect()));
else
header(sprintf('Location: edit.php?server_id=%s&dn=%s&modified_attrs[]=objectclass',$ldapserver->server_id,$encoded_dn));
?>

View File

@@ -1,133 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/add_oclass_form.php,v 1.20 2005/07/22 06:34:55 wurley Exp $
/**
* This page may simply add the objectClass and take you back to the edit page,
* but, in one condition it may prompt the user for input. That condition is this:
*
* If the user has requested to add an objectClass that requires a set of
* attributes with 1 or more not defined by the object. In that case, we will
* present a form for the user to add those attributes to the object.
*
* Variables that come in via common.php
* - server_id
* Variables that come in as REQUEST vars:
* - dn (rawurlencoded)
* - new_oclass
*
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
if( $ldapserver->isReadOnly() )
pla_error( $lang['no_updates_in_read_only_mode'] );
if( ! $ldapserver->haveAuthInfo())
pla_error( $lang['not_enough_login_info'] );
$new_oclass = $_REQUEST['new_oclass'];
$dn = rawurldecode( $_REQUEST['dn'] );
$encoded_dn = rawurlencode( $dn );
/* Ensure that the object has defined all MUST attrs for this objectClass.
* If it hasn't, present a form to have the user enter values for all the
* newly required attrs. */
$entry = get_object_attrs( $ldapserver, $dn, true );
$current_attrs = array();
foreach( $entry as $attr => $junk )
$current_attrs[] = strtolower($attr);
// grab the required attributes for the new objectClass
$schema_oclasses = get_schema_objectclasses( $ldapserver );
$must_attrs = array();
foreach( $new_oclass as $oclass_name ) {
$oclass = get_schema_objectclass( $ldapserver, $oclass_name );
if( $oclass )
$must_attrs = array_merge( $must_attrs, $oclass->getMustAttrNames( $schema_oclasses ) );
}
$must_attrs = array_unique( $must_attrs );
// We don't want any of the attr meta-data, just the string
//foreach( $must_attrs as $i => $attr )
//$must_attrs[$i] = $attr->getName();
// build a list of the attributes that this new objectClass requires,
// but that the object does not currently contain
$needed_attrs = array();
foreach( $must_attrs as $attr ) {
$attr = get_schema_attribute( $ldapserver, $attr );
//echo "<pre>"; var_dump( $attr ); echo "</pre>";
// First, check if one of this attr's aliases is already an attribute of this entry
foreach( $attr->getAliases() as $alias_attr_name )
if( in_array( strtolower( $alias_attr_name ), $current_attrs ) )
// Skip this attribute since it's already in the entry
continue;
if( in_array( strtolower($attr->getName()), $current_attrs ) )
continue;
// We made it this far, so the attribute needs to be added to this entry in order
// to add this objectClass
$needed_attrs[] = $attr;
}
if( count( $needed_attrs ) > 0 ) {
include './header.php'; ?>
<body>
<h3 class="title"><?php echo $lang['new_required_attrs']; ?></h3>
<h3 class="subtitle"><?php echo $lang['requires_to_add'] . ' ' . count($needed_attrs) .
' ' . $lang['new_attributes']; ?></h3>
<small>
<?php echo $lang['new_required_attrs_instructions'];
echo ' ' . count( $needed_attrs ) . ' ' . $lang['new_attributes'] . ' ';
echo $lang['that_this_oclass_requires']; ?>
</small>
<br />
<br />
<form action="add_oclass.php" method="post">
<input type="hidden" name="new_oclass" value="<?php echo rawurlencode( serialize( $new_oclass ) ); ?>" />
<input type="hidden" name="dn" value="<?php echo $encoded_dn; ?>" />
<input type="hidden" name="server_id" value="<?php echo $ldapserver->server_id; ?>" />
<table class="edit_dn" cellspacing="0">
<tr><th colspan="2"><?php echo $lang['new_required_attrs']; ?></th></tr>
<?php foreach( $needed_attrs as $count => $attr ) { ?>
<tr><td class="attr"><b><?php echo htmlspecialchars($attr->getName()); ?></b></td></tr>
<tr><td class="val"><input type="text" name="new_attrs[<?php echo htmlspecialchars($attr->getName()); ?>]" value="" size="40" /></tr>
<?php } ?>
</table>
<br />
<br />
<center><input type="submit" value="<?php echo $lang['add_oclass_and_attrs']; ?>" /></center>
</form>
</body>
</html>
<?php } else {
$add_res = @ldap_mod_add( $ldapserver->connect(), $dn, array( 'objectClass' => $new_oclass ) );
if (! $add_res)
pla_error("Could not perform ldap_mod_add operation.",
ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect()));
else
header(sprintf('Location: edit.php?server_id=%s&dn=%s&modified_attrs[]=objectClass',
$ldapserver->server_id,$encoded_dn));
}
?>

View File

@@ -1,74 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/add_value.php,v 1.18 2005/07/22 05:42:18 wurley Exp $
/**
* Adds a value to an attribute for a given dn.
*
* Variables that come in via common.php
* - server_id
* Variables that come in as POST vars:
* - dn (rawurlencoded)
* - attr (rawurlencoded) the attribute to which we are adding a value
* - new_value (form element)
* - binary
*
* On success, redirect to the edit_dn page. On failure, echo an error.
*
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
if( $ldapserver->isReadOnly() )
pla_error( $lang['no_updates_in_read_only_mode'] );
if( ! $ldapserver->haveAuthInfo())
pla_error( $lang['not_enough_login_info'] );
$attr = $_POST['attr'];
$new_value = $_POST['new_value'];
$dn = rawurldecode( $_POST['dn'] );
$is_binary_val = isset( $_POST['binary'] ) ? true : false;
$encoded_dn = rawurlencode( $dn );
$encoded_attr = rawurlencode( $attr );
if( is_attr_read_only( $ldapserver, $attr ) )
pla_error(sprintf($lang['attr_is_read_only'],htmlspecialchars( $attr )));
// special case for binary attributes:
// we must go read the data from the file.
if( $is_binary_val ) {
$file = $_FILES['new_value']['tmp_name'];
$f = fopen( $file, 'r' );
$binary_value = fread( $f, filesize( $file ) );
fclose( $f );
$new_value = $binary_value;
}
$new_entry = array( $attr => $new_value );
// Check to see if this is a unique Attribute
if( $badattr = checkUniqueAttr( $ldapserver, $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( $lang['unique_attr_failed'],$attr,$badattr,$dn,$search_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 ) ) ) {
$add_result = @ldap_mod_add( $ldapserver->connect(), $dn, $new_entry );
if (! $add_result)
pla_error($lang['could_not_perform_ldap_mod_add'],
ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect()));
}
header(sprintf('Location: edit.php?server_id=%s&dn=%s&modified_attrs[]=%s',
$ldapserver->server_id,$encoded_dn,$encoded_attr));
?>

View File

@@ -1,211 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/add_value_form.php,v 1.32 2005/07/22 06:34:55 wurley Exp $
/**
* Displays a form to allow the user to enter a new value to add
* to the existing list of values for a multi-valued attribute.
*
* Variables that come in via common.php
* - server_id
* Variables that come in as GET vars:
* - dn (rawurlencoded)
* - attr (rawurlencoded) the attribute to which we are adding a value
*
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
if( $ldapserver->isReadOnly() )
pla_error( $lang['no_updates_in_read_only_mode'] );
if( ! $ldapserver->haveAuthInfo())
pla_error( $lang['not_enough_login_info'] );
$attr = $_GET['attr'];
$dn = isset( $_GET['dn'] ) ? $_GET['dn'] : null;
$encoded_dn = rawurlencode( $dn );
$encoded_attr = rawurlencode( $attr );
if (! is_null($dn))
$rdn = get_rdn( $dn );
else
$rdn = null;
$current_values = get_object_attr( $ldapserver, $dn, $attr );
$num_current_values = ( is_array($current_values) ? count($current_values) : 0 );
$is_object_class = ( 0 == strcasecmp( $attr, 'objectClass' ) ) ? true : false;
$is_jpeg_photo = is_jpeg_photo( $ldapserver, $attr ); //( 0 == strcasecmp( $attr, 'jpegPhoto' ) ) ? true : false;
if( $is_object_class ) {
// fetch all available objectClasses and remove those from the list that are already defined in the entry
$schema_oclasses = get_schema_objectclasses( $ldapserver );
foreach( $current_values as $oclass )
unset( $schema_oclasses[ strtolower( $oclass ) ] );
} else {
$schema_attr = get_schema_attribute( $ldapserver, $attr );
}
include './header.php'; ?>
<body>
<h3 class="title">
<?php echo $lang['add_new']; ?>
<b><?php echo htmlspecialchars($attr); ?></b>
<?php echo $lang['value_to']; ?>
<b><?php echo htmlspecialchars($rdn); ?></b></h3>
<h3 class="subtitle">
<?php echo $lang['server']; ?>:
<b><?php echo $ldapserver->name; ?></b> &nbsp;&nbsp;&nbsp;
<?php echo $lang['distinguished_name']; ?>: <b><?php echo htmlspecialchars( $dn ); ?></b></h3>
<?php echo $lang['current_list_of']; ?> <b><?php echo $num_current_values; ?></b>
<?php echo $lang['values_for_attribute']; ?> <b><?php echo htmlspecialchars($attr); ?></b>:
<?php if ($num_current_values) { ?>
<?php if( $is_jpeg_photo ) { ?>
<table><tr><td>
<?php draw_jpeg_photos( $ldapserver, $dn, $attr, false ); ?>
</td></tr></table>
<!-- Temporary warning until we find a way to add jpegPhoto values without an INAPROPRIATE_MATCHING error -->
<p><small>
<?php echo $lang['inappropriate_matching_note']; ?>
</small></p>
<!-- End of temporary warning -->
<?php } else if( is_attr_binary( $ldapserver, $attr ) ) { ?>
<ul>
<?php if( is_array( $vals ) ) {
for( $i=1; $i<=count($vals); $i++ ) {
$href = sprintf('download_binary_attr.php?server_id=%s&amp;dn=%s&amp;attr=%s&amp;value_num=%s',
$ldapserver->server_id,$encoded_dn,$attr,$i-1); ?>
<li><a href="<?php echo $href; ?>"><img src="images/save.png" /> <?php echo $lang['download_value'] . ' ' . $i; ?>)</a></li>
<?php }
} else {
$href = sprintf('download_binary_attr.php?server_id=%s&amp;dn=%s&amp;attr=%s',$ldapserver->server_id,$encoded_dn,$attr); ?>
<li><a href="<?php echo $href; ?>"><img src="images/save.png" /> <?php echo $lang['download_value']; ?></a></li>
<?php } ?>
</ul>
<!-- Temporary warning until we find a way to add jpegPhoto values without an INAPROPRIATE_MATCHING error -->
<p><small>
<?php echo $lang['inappropriate_matching_note']; ?>
</small></p>
<!-- End of temporary warning -->
<?php } else { ?>
<ul class="current_values">
<?php if( is_array( $current_values ) ) /*$num_current_values > 1 )*/ {
foreach( $current_values as $val ) { ?>
<li><nobr><?php echo htmlspecialchars(($val)); ?></nobr></li>
<?php } ?>
<?php } else { ?>
<li><nobr><?php echo htmlspecialchars(($current_values)); ?></nobr></li>
<?php } ?>
</ul>
<?php } ?>
<?php } else { ?>
<br />
<br />
<?php } ?>
<?php echo $lang['enter_value_to_add']; ?>
<br />
<br />
<?php if( $is_object_class ) { ?>
<form action="add_oclass_form.php" method="post" class="new_value">
<input type="hidden" name="server_id" value="<?php echo $ldapserver->server_id; ?>" />
<input type="hidden" name="dn" value="<?php echo $encoded_dn; ?>" />
<select name="new_oclass[]" multiple="true" size="15">
<?php foreach( $schema_oclasses as $name => $oclass ) {
// exclude any structural ones, as they'll only generate an LDAP_OBJECT_CLASS_VIOLATION
if ($oclass->type == "structural") continue; ?>
<option value="<?php echo $oclass->getName(); ?>"><?php echo $oclass->getName(); ?></option>
<?php } ?>
</select>
<br />
<input type="submit" value="<?php echo $lang['add_new_objectclass']; ?>" />
<br />
<?php if ($config->GetValue('appearance','show_hints')) { ?>
<small>
<br />
<img src="images/light.png" /><span class="hint"><?php echo $lang['new_required_attrs_note']; ?></span>
</small>
<?php }
} else { ?>
<form action="add_value.php" method="post" class="new_value" name="new_value_form"<?php
if( is_attr_binary( $ldapserver, $attr ) ) echo "enctype=\"multipart/form-data\""; ?>>
<input type="hidden" name="server_id" value="<?php echo $ldapserver->server_id; ?>" />
<input type="hidden" name="dn" value="<?php echo $encoded_dn; ?>" />
<input type="hidden" name="attr" value="<?php echo $encoded_attr; ?>" />
<?php if( is_attr_binary( $ldapserver, $attr ) ) { ?>
<input type="file" name="new_value" />
<input type="hidden" name="binary" value="true" />
<?php } else {
if( is_multi_line_attr( $attr, $ldapserver->server_id ) ) { ?>
<textarea name="new_value" rows="3" cols="30"></textarea>
<?php } else { ?>
<input type="text" <?php if( $schema_attr->getMaxLength() ) echo "maxlength=\"" . $schema_attr->getMaxLength() . "\" "; ?>name="new_value" size="40" value="" />
<?php // draw the "browse" button next to this input box if this attr houses DNs:
if( is_dn_attr( $ldapserver, $attr ) )
draw_chooser_link( "new_value_form.new_value", false ); ?>
<?php }
} ?>
<input type="submit" name="submit" value="<?php echo $lang['add_new_value']; ?>" />
<br />
<?php if( $schema_attr->getDescription() ) { ?>
<small><b><?php echo $lang['desc']; ?>:</b> <?php echo $schema_attr->getDescription(); ?></small><br />
<?php } ?>
<?php if( $schema_attr->getType() ) { ?>
<small><b><?php echo $lang['syntax']; ?>:</b> <?php echo $schema_attr->getType(); ?></small><br />
<?php } ?>
<?php if( $schema_attr->getMaxLength() ) { ?>
<small><b><?php echo $lang['maximum_length']; ?>:</b> <?php echo number_format( $schema_attr->getMaxLength() ); ?> <?php echo $lang['characters']; ?></small><br />
<?php } ?>
</form>
<?php } ?>
</body>
</html>

View File

@@ -1,86 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/check_lang_files.php,v 1.11 2005/02/25 13:44:05 wurley Exp $
/**
* Test script to check that $lang variables in each language file.
* @package phpLDAPadmin
*/
/**
*/
echo "<html><head><title>phpldapadmin - check of translation</title></head><body>";
$CHECKLANG=$_REQUEST['CHECKLANG'];
include realpath( './lang/en.php' );
$english_lang = $lang;
unset( $lang );
$lang_dir = realpath( './lang/recoded' );
$dir = opendir( $lang_dir );
// First, detect any unused strings from the english language:
echo "<h1>Checking English language file for unused strings</h1>\n";
echo "<ol>\n";
$unused_keys = false;
// special case keys that do not occur hard-coded but are dynamically generated
$ignore_keys['equals'] = 1;
$ignore_keys['starts with'] = 1;
$ignore_keys['ends with'] = 1;
$ignore_keys['sounds like'] = 1;
$ignore_keys['contains'] = 1;
foreach( $english_lang as $key => $string ) {
if( isset( $ignore_keys[$key] ) )
continue;
$grep_cmd = "grep -r \"lang\[['\\\"]$key\" *.php templates/";
$used = `$grep_cmd`;
if( ! $used ) {
$unused_keys = true;
echo "<li>Unused English key: <tt>$key</tt> <br />&nbsp;&nbsp;&nbsp;&nbsp;(<small><tt>" . htmlspecialchars( $grep_cmd ) . "</tt></small>)</li>\n";
flush();
}
}
if( false === $unused_keys )
echo "No unused English strings.";
echo "</ol>\n";
echo "<h1>Incomplete or Erroneous Language Files</h1>\n\n";
if ($CHECKLANG)
printf("<h1>Checking language files %s</h1>\n\n",$CHECKLANG);
echo "<h1><A HREF='?'>check all languages</A></h1>\n";
flush();
while( ( $file = readdir( $dir ) ) !== false ) {
// skip the devel languages, english, and auto
if( $file == "zz.php" || $file == "zzz.php" || $file == "auto.php" || $file == "en.php" )
continue;
// Sanity check. Is this really a PHP file?
if( ! preg_match( "/\.php$/", $file ) )
continue;
unset( $lang );
$lang = array();
include realpath( $lang_dir.'/'.$file );
$has_errors = false;
if ($CHECKLANG=="" || $file===$CHECKLANG ){
echo "<h2><A HREF='?CHECKLANG=$file'>$file</A></h2>\n";
echo "<ol>\n";
foreach( $english_lang as $key => $string )
if( ! isset( $lang[ $key ] ) ) {
$has_errors = true;
echo "<li>missing entry: <tt>$key</tt></li>\n";
}
foreach( $lang as $key => $string )
if( ! isset( $english_lang[ $key ] ) ){
$has_errors = true;
echo "<li>extra entry: <tt>$key</tt></li>\n";
}
if( ! $has_errors )
echo "(No errors)\n";
}
echo "</ol>\n";
}
echo "</body></html>";
?>

View File

@@ -1,42 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/collapse.php,v 1.13 2005/07/22 05:55:19 wurley Exp $
/**
* This script alters the session variable 'tree', collapsing it
* at the dn specified in the query string.
*
* Variables that come in via common.php
* - server_id
* Variables that come in as GET vars:
* - dn (rawurlencoded)
*
* Note: this script is equal and opposite to expand.php
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
$dn = $_GET['dn'];
$encoded_dn = rawurlencode($dn);
initialize_session_tree();
if (array_key_exists($dn,$_SESSION['tree'][$ldapserver->server_id]))
unset($_SESSION['tree'][$ldapserver->server_id][$dn]);
/* This is for Opera. By putting "random junk" in the query string, it thinks
that it does not have a cached version of the page, and will thus
fetch the page rather than display the cached version */
$time = gettimeofday();
$random_junk = md5(strtotime('now') . $time['usec']);
/* 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 = "&".session_name()."=".session_id();
header(sprintf('Location:tree.php?foo=%s#%s_%s%s',$random_junk,$ldapserver->server_id,$encoded_dn,$id_session_param));
?>

View File

@@ -1,154 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/common.php,v 1.68 2005/09/25 16:11:44 wurley Exp $
/**
* Contains code to be executed at the top of each phpLDAPadmin page.
* include this file at the top of every PHP file.
*
* This file will "pre-initialise" a PLA environment so that any PHP file will have a consistent
* environment with other PLA PHP files.
*
* This code WILL NOT check that all required functions are usable/readable, etc. This process has
* been moved to index.php (which really is only called once when a browser hits PLA for the first time).
*
* The list of ADDITIONAL function files is now defined in functions.php.
*
* @package phpLDAPadmin
*/
@DEFINE(LIBDIR,'./');
# Turn on all notices and warnings. This helps us write cleaner code (we hope at least)
if (phpversion() >= "5") {
# Work-around to get PLA to work in PHP5
ini_set( "zend.ze1_compatibility_mode", 1 );
# E_DEBUG is PHP5 specific and prevents warnings about using 'var' to declar class members
error_reporting( 'E_DEBUG' );
} else
# For PHP4
error_reporting( E_ALL );
# For PHP5 backward/forward compatibility
if (! defined('E_STRICT'))
define('E_STRICT',2048);
# General functions needed to proceed (pla_ldap_search(), pla_error(), get_object_attrs(), etc.)
ob_start();
require_once realpath(LIBDIR.'functions.php');
ob_end_clean();
/* Our custom error handler receives all error notices that pass the error_reporting()
level set above. */
set_error_handler('pla_error_handler');
/* Creates the language array which will be populated with localized strings
based on the user-configured language. */
$lang = array();
/*
* functions.php should have defined our pla_function_files array, listing all our
* required functions (order IS important).
* index.php should have checked they exist and are usable - we'll assume that the user
* has been via index.php, and fixed any problems already.
*/
ob_start();
foreach ($pla_function_files as $file_name) {
require_once realpath ($file_name);
}
# Now read in config_default.php, which also reads in config.php
require_once realpath(LIBDIR.'config_default.php');
ob_end_clean();
/**
* At this point we have read all our additional function PHP files and our configuration.
*/
# Check our custom variables.
$config->CheckCustom();
if (pla_session_start())
run_hook('post_session_init',array());
/*
* Language configuration. Auto or specified?
* Shall we attempt to auto-determine the language?
*/
$language = $config->GetValue('appearance','language');
if ($language == "auto") {
# Make sure their browser correctly reports language. If not, skip this.
if( isset( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) ) {
# get the languages which are spetcified in the HTTP header
$HTTP_LANGS1 = preg_split ("/[;,]+/", $_SERVER['HTTP_ACCEPT_LANGUAGE'] );
$HTTP_LANGS2 = preg_split ("/[;,]+/", $_SERVER['HTTP_ACCEPT_LANGUAGE'] );
foreach( $HTTP_LANGS2 as $key => $value ) {
$value=preg_split ("/[-]+/", $value );
$HTTP_LANGS2[$key]=$value[0];
}
$HTTP_LANGS = array_merge ($HTTP_LANGS1, $HTTP_LANGS2);
foreach( $HTTP_LANGS as $HTTP_LANG) {
# try to grab one after the other the language file
if( file_exists( realpath( "lang/recoded/$HTTP_LANG.php" ) ) &&
is_readable( realpath( "lang/recoded/$HTTP_LANG.php" ) ) ) {
ob_start();
include realpath( "lang/recoded/$HTTP_LANG.php" );
ob_end_clean();
break;
}
}
}
} else {
# grab the language file configured in config.php
if( $language != null ) {
if( 0 == strcmp( $language, 'english' ) )
$language = 'en';
if( file_exists( realpath( "lang/recoded/$language.php" ) ) &&
is_readable( realpath( "lang/recoded/$language.php" ) ) ) {
ob_start();
include realpath( "lang/recoded/$language.php" );
ob_end_clean();
} else {
pla_error( "Could not read language file 'lang/recoded/$language.php'. Either the file
does not exist, or its permissions do not allow phpLDAPadmin to read it." );
}
}
}
# 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()
*/
if (get_magic_quotes_gpc() && (! isset($slashes_stripped) || ! $slashes_stripped)) {
array_stripslashes($_REQUEST);
array_stripslashes($_GET);
array_stripslashes($_POST);
array_stripslashes($_COOKIE);
array_stripslashes($_FILES);
$slashes_stripped = true;
}
/*
* 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);
}
?>

View File

@@ -1,579 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/compare.php,v 1.10 2005/09/25 16:11:44 wurley Exp $
/**
* Compare two DNs - the destination DN is editable.
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
$dn_src = isset($_POST['dn_src']) ? $_POST['dn_src'] : null;
$dn_dst = isset($_POST['dn_dst']) ? $_POST['dn_dst'] : null;
$encoded_dn_src = rawurlencode($dn_src);
$encoded_dn_dst = rawurlencode($dn_dst);
$server_id_src = (isset($_POST['server_id_src']) ? $_POST['server_id_src'] : '');
$server_id_dst = (isset($_POST['server_id_dst']) ? $_POST['server_id_dst'] : '');
$ldapserver_src = $ldapservers->Instance($server_id_src);
if ( ! $ldapserver_src->haveAuthInfo())
pla_error($lang['not_enough_login_info']);
$ldapserver_dst = $ldapservers->Instance($server_id_dst);
if ( ! $ldapserver_src->haveAuthInfo())
pla_error($lang['not_enough_login_info']);
dn_exists($ldapserver_src,$dn_src) or pla_error(sprintf($lang['no_such_entry'],pretty_print_dn($dn_src)));
dn_exists($ldapserver_dst,$dn_dst) or pla_error(sprintf($lang['no_such_entry'],pretty_print_dn($dn_dst)));
$friendly_attrs = process_friendly_attr_table();
$attrs_src = get_object_attrs($ldapserver_src,$dn_src,false,$config->GetValue('deref','view'));
$attrs_dst = get_object_attrs($ldapserver_dst,$dn_dst,false,$config->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';
?>
<body>
<table class="comp_dn" border=0>
<tr><td colspan=6>
<h3 class="title"><?php echo $lang['comparing']; ?></h3>
</td></tr>
<tr>
<td colspan=2 width=20%>
<h3 class="subtitle"><?php echo $lang['attribute']; ?><br />&nbsp;</h3>
</td>
<td colspan=2 width=40%>
<h3 class="subtitle"><?php echo $lang['server']; ?>: <b><?php echo $ldapserver_src->name; ?></b><br /><?php echo $lang['distinguished_name'];?>: <b><?php echo htmlspecialchars(($dn_src)); ?></b></h3>
</td>
<td colspan=2 width=40%>
<h3 class="subtitle"><?php echo $lang['server']; ?>: <b><?php echo $ldapserver_dst->name; ?></b><br /><?php echo $lang['distinguished_name'];?>: <b><?php echo htmlspecialchars(($dn_dst)); ?></b></h3>
</td>
</tr>
<tr>
<td colspan=6 align=right>
<form action="compare.php" method="post" name="compare_form">
<input type="hidden" name="server_id_src" value="<?php echo $ldapserver_dst->server_id; ?>" />
<input type="hidden" name="server_id_dst" value="<?php echo $ldapserver_src->server_id; ?>" />
<input type="hidden" name="dn_src" value="<?php echo htmlspecialchars( $dn_dst ); ?>" />
<input type="hidden" name="dn_dst" value="<?php echo htmlspecialchars( $dn_src ); ?>" />
<input type="submit" value="<?php echo $lang['switch_entry']; ?>" />
</form>
</td>
</tr>
<?php
if(! $attrs_all || ! is_array($attrs_all)) {
printf('<tr><td colspan="2">(%s)</td></tr>',$lang['no_attributes']);
print '</table>';
print '</html>';
die();
}
sort($attrs_all);
# Work through each of the attributes.
foreach ($attrs_all as $attr) {
flush();
# If this is the DN, get the next attribute.
if (! strcasecmp($attr,'dn'))
continue;
# Has the config.php specified that this attribute is to be hidden or shown?
if (is_attr_hidden($ldapserver_src,$attr) || is_attr_hidden($ldapserver_dst,$attr))
continue;
?>
<!-- Begin Attribute -->
<tr>
<?php foreach (array('src','dst') as $side) { ?>
<?php
if ($side == 'dst' && ! $ldapserver_dst->isReadOnly()) { ?>
<form action="update_confirm.php" method="post" name="edit_form">
<input type="hidden" name="server_id" value="<?php echo $ldapserver_dst->server_id; ?>" />
<input type="hidden" name="dn" value="<?php echo $dn_dst; ?>" />
<?php }
$schema_attr_src = get_schema_attribute($ldapserver_src,$attr,$dn_src);
$schema_attr_dst = get_schema_attribute($ldapserver_dst,$attr,$dn_dst);
# Setup the $attr_note, which will be displayed to the right of the attr name (if any)
$attr_note = '';
$required_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 = sprintf('<acronym title="%s">alias</acronym>',sprintf($lang['alias_for'],$attr_display,$attr));
} else {
$attr_note = '';
$attr_display = $attr;
}
# is this attribute required by an objectClass?
$required_by = '';
switch ($side) {
case 'src':
$ldapserver = $ldapserver_src;
if ($schema_attr_src)
foreach ($schema_attr_src->getRequiredByObjectClasses() as $required)
if (isset($attrs_src['objectClass']) && in_array(strtolower($required),arrayLower($attrs_src['objectClass'])))
$required_by .= $required . ' ';
# It seems that some LDAP servers (Domino) returns attributes in lower case?
elseif( isset($attrs_src['objectclass']) && in_array(strtolower($required),arrayLower($attrs_src['objectclass'])))
$required_by .= $required . ' ';
break;
case 'dst':
$ldapserver = $ldapserver_dst;
if ($schema_attr_dst)
foreach ($schema_attr_dst->getRequiredByObjectClasses() as $required)
if (isset($attrs_dst['objectClass']) && in_array(strtolower($required),arrayLower($attrs_dst['objectClass'])))
$required_by .= $required . ' ';
# It seems that some LDAP servers (Domino) returns attributes in lower case?
elseif (isset($attrs_dst['objectclass']) && in_array(strtolower($required),arrayLower($attrs_dst['objectclass'])))
$required_by .= $required . ' ';
break;
}
if ($side == 'src') { ?>
<td class="attr">
<?php $schema_href="schema.php?server_id=$server_id_src&amp;view=attributes&amp;viewvalue=".real_attr_name($attr); ?>
<b><a title="<?php echo sprintf($lang['attr_name_tooltip'],$attr) ?>" href="<?php echo $schema_href; ?>"><?php echo $attr_display; ?></a></b>
</td>
<td class="attr_note">
<sup><small><?php echo $attr_note; ?></small></sup>
</td>
<?php }
if ($required_by) {
$required_note .= sprintf('<acronym title="%s">%s</acronym>',sprintf($lang['required_for'],$required_by),$lang['required']);
?>
<td colspan=2 class="attr_note">
<sup><small><?php echo $required_note; ?></small></sup>
</td>
<?php } else { ?>
<td colspan=2 class="attr_note">&nbsp;</td>
<?php } ?>
<?php if (is_attr_read_only($ldapserver,$attr)) { ?>
<small>(<acronym title="<?php echo $lang['read_only_tooltip']; ?>"><?php echo $lang['read_only']; ?></acronym>)</small>
<?php } ?>
</td>
<?php } ?>
</tr>
<!-- End of Attribute -->
<!-- Begin Values -->
<tr>
<?php
foreach (array('src','dst') as $side) {
$vals = null; ?>
<?php
# If this attribute isnt set, then show a blank.
$toJump = 0;
switch ($side) {
case 'src':
print '<td colspan=2>&nbsp</td><td class="attr">';
if (! isset($attrs_src[$attr])) {
echo "<small>&lt;". $lang['no_value']."&gt;</small></td>";
$toJump = 1;
continue;
} else
$vals = $attrs_src[$attr];
$ldapserver = $ldapserver_src;
break;
case 'dst':
print '<td colspan=2>&nbsp</td><td class="val">';
if (! isset($attrs_dst[$attr])) {
echo "<small>&lt;". $lang['no_value']."&gt;</small></td>";
$toJump = 1;
continue;
} else
$vals = $attrs_dst[$attr];
$ldapserver = $ldapserver_dst;
break;
}
if ($toJump) continue;
/*
* Is this attribute a jpegPhoto?
*/
if (is_jpeg_photo($ldapserver,$attr)) {
switch ($side) {
case 'src':
// Don't draw the delete buttons if there is more than one jpegPhoto
// (phpLDAPadmin can't handle this case yet)
draw_jpeg_photos( $ldapserver, $dn_src, $attr, false );
break;
case 'dst':
if( $ldapserver_dst->isReadOnly() || is_attr_read_only( $ldapserver_dst, $attr ) )
draw_jpeg_photos( $ldapserver, $dn_dst, $attr, false );
else
draw_jpeg_photos( $ldapserver, $dn_dst, $attr, true );
break;
}
// proceed to the next attribute
echo "</td>\n";
continue;
}
/*
* Is this attribute binary?
*/
if( is_attr_binary( $ldapserver, $attr ) ) {
switch ($side) {
case 'src':
$href = sprintf("download_binary_attr.php?server_id=%s&dn=%s&attr=%s",$ldapserver->server_id,$encoded_dn_src,$attr);
break;
case 'dst':
$href = sprintf("download_binary_attr.php?server_id=%s&dn=%s&attr=%s",$ldapserver->server_id,$encoded_dn_dst,$attr);
break;
}
?>
<small>
<?php echo $lang['binary_value']; ?><br />
<?php if( count( $vals ) > 1 ) { for( $i=1; $i<=count($vals); $i++ ) { ?>
<a href="<?php echo $href . "&amp;value_num=$i"; ?>"><img
src="images/save.png" /> <?php echo $lang['download_value']; ?>(<?php echo $i; ?>)</a><br />
<?php } } else { ?>
<a href="<?php echo $href; ?>"><img src="images/save.png" /> <?php echo $lang['download_value']; ?></a><br />
<?php }
if( $side == 'dst' && ! $ldapserver_dst->isReadOnly() && ! is_attr_read_only( $ldapserver, $attr ) ) { ?>
<a href="javascript:deleteAttribute( '<?php echo $attr; ?>' );" style="color:red;"><img src="images/trash.png" /> <?php echo $lang['delete_attribute']; ?></a>
<?php } ?>
</small>
</td>
<?php continue;
}
/*
* Note: at this point, the attribute must be text-based (not binary or jpeg)
*/
/*
* If this server is in read-only mode or this attribute is configured as read_only,
* simply draw the attribute values and continue.
*/
if( $side == 'dst' && ($ldapserver->isReadOnly() || is_attr_read_only( $ldapserver, $attr )) ) {
if( is_array( $vals ) ) {
foreach( $vals as $i => $val ) {
if( trim( $val ) == "" )
echo "<span style=\"color:red\">[" . $lang['empty'] . "]</span><br />\n";
elseif( 0 == strcasecmp( $attr, 'userPassword' ) && $config->GetValue('appearance','obfuscate_password_display'))
echo preg_replace( '/./', '*', $val ) . "<br />";
else
echo htmlspecialchars( $val ) . "<br />";
}
} else {
if( 0 == strcasecmp( $attr, 'userPassword' ) && $config->GetValue('appearance','obfuscate_password_display'))
echo preg_replace( '/./', '*', $vals ) . "<br />";
else
echo $vals . "<br />";
}
echo "</td>";
continue;
}
/*
* Is this a userPassword attribute?
*/
if( ! strcasecmp( $attr, 'userpassword' ) ) {
$user_password = $vals[0];
$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( $server_id );
}
if ($side == 'dst') { ?>
<input type="hidden" name="old_values[userpassword]" value="<?php echo htmlspecialchars($user_password); ?>" />
<!-- Special case of enc_type to detect changes when user changes enc_type but not the password value -->
<input size="38" type="hidden" name="old_enc_type" value="<?php echo ($enc_type==''?'clear':$enc_type); ?>" />
<?php }
if( $config->GetValue('appearance','obfuscate_password_display') || is_null( $enc_type ) ) {
echo htmlspecialchars( preg_replace( "/./", "*", $user_password ) );
} else {
echo htmlspecialchars( $user_password );
} ?>
<br />
<?php if ($side == 'dst') { ?>
<input style="width: 260px" type="password" name="new_values[userpassword]" value="<?php echo htmlspecialchars( $user_password ); ?>" />
<?php echo enc_type_select_list($enc_type);
} ?>
<br />
<script language="javascript">
<!--
function passwordComparePopup()
{
mywindow = open( 'password_checker.php', 'myname', 'resizable=no,width=450,height=200,scrollbars=1' );
mywindow.location.href = 'password_checker.php?hash=<?php echo base64_encode($user_password); ?>&base64=true';
if( mywindow.opener == null )
mywindow.opener = self;
}
-->
</script>
<small><a href="javascript:passwordComparePopup()"><?php echo $lang['t_check_pass']; ?></a></small>
</td>
<?php continue;
}
/*
* Is this a boolean attribute?
*/
if( is_attr_boolean( $ldapserver, $attr) ) {
$val = $vals[0];
if ($side = 'dst') {?>
<input type="hidden" name="old_values[<?php echo htmlspecialchars( $attr ); ?>]" value="<?php echo htmlspecialchars($val); ?>" />
<select name="new_values[<?php echo htmlspecialchars( $attr ); ?>]">
<option value="TRUE"<?php echo ($val=='TRUE' ? ' selected' : ''); ?>><?php echo $lang['true']; ?></option>
<option value="FALSE"<?php echo ($val=='FALSE' ? ' selected' : ''); ?>><?php echo $lang['false']; ?></option>
<option value="">(<?php echo $lang['none_remove_value']; ?>)</option>
</select>
<?php } ?>
</td>
<?php continue;
}
/*
* End of special case attributes (non plain text).
*/
foreach( $vals as $i => $val ) {
if ($side == 'dst') {
$input_name = "new_values[" . 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 = "new_values_" . 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. -->
<input type="hidden" name="old_values[<?php echo htmlspecialchars( $attr ); ?>][<?php echo $i; ?>]" value="<?php echo htmlspecialchars($val); ?>" />
<?php }
// Is this value is a structural objectClass, make it read-only
if( 0 == strcasecmp( $attr, 'objectClass' ) ) { ?>
<a title="<?php echo $lang['view_schema_for_oclass']; ?>" href="schema.php?server_id=<?php echo $ldapserver->server_id; ?>&amp;view=objectClasses&amp;viewvalue=<?php echo htmlspecialchars( $val ); ?>"><img src="images/info.png" /></a>
<?php $schema_object = get_schema_objectclass( $ldapserver, $val);
if ($schema_object->type == 'structural') {
echo "$val <small>(<acronym title=\"" . sprintf( $lang['structural_object_class_cannot_remove'] ) . "\">" . $lang['structural'] . "</acronym>)</small><br />";
if ($side == 'dst') {?>
<input type="hidden" name="<?php echo $input_name; ?>" id="<?php echo $input_id; ?>" value="<?php echo htmlspecialchars($val); ?>" />
<?php }
continue;
}
}
if( is_dn_string( $val ) || is_dn_attr( $ldapserver, $attr ) ) { ?>
<a title="<?php echo sprintf( $lang['go_to_dn'], htmlspecialchars($val) ); ?>" href="edit.php?server_id=<?php echo $ldapserver->server_id; ?>&amp;dn=<?php echo rawurlencode($val); ?>"><img style="vertical-align: top" src="images/go.png" /></a>
<?php } elseif( is_mail_string( $val ) ) { ?>
<a href="mailto:<?php echo htmlspecialchars($val); ?>"><img style="vertical-align: center" src="images/mail.png" /></a>
<?php } elseif( is_url_string( $val ) ) { ?>
<a href="<?php echo htmlspecialchars($val); ?>" target="new"><img style="vertical-align: center" src="images/dc.png" /></a>
<?php }
if( is_multi_line_attr( $attr, $val, $ldapserver->server_id ) ) {
if ($side == 'dst') {?>
<textarea class="val" rows="3" cols="30" name="<?php echo $input_name; ?>" id="<?php echo $input_id; ?>"><?php echo htmlspecialchars($val); ?></textarea>
<?php } else {
echo htmlspecialchars($val);
}
} else {
if ($side == 'dst') {?>
<input type="text" class="val" name="<?php echo $input_name; ?>" id="<?php echo $input_id; ?>" value="<?php echo htmlspecialchars($val); ?>" />
<?php } else {
echo htmlspecialchars($val);
}
}
// draw a link for popping up the entry browser if this is the type of attribute
// that houses DNs.
if( is_dn_attr( $ldapserver, $attr ) )
draw_chooser_link( "edit_form.$input_id", false ); ?>
<br />
<?php } ?>
</td>
<?php } /* end foreach value */ ?>
</tr>
<?php
/* Draw the "add value" link under the list of values for this attributes */
if (! $ldapserver_dst->isReadOnly()) {
// First check if the required objectClass is in this DN
$isOK = 0;
$src_oclass = array();
$attr_object = get_schema_attribute( $ldapserver_dst, $attr, $dn_dst );
foreach ($attr_object->used_in_object_classes as $oclass) {
if (in_array(strtolower($oclass),arrayLower($attrs_dst['objectClass']))) {
$isOK = 1;
break;
} else {
// Find oclass that the source has that provides this attribute.
if (in_array($oclass,$attrs_src['objectClass']))
$src_oclass[] = $oclass;
}
}
print "<tr><td colspan=2></td><td colspan=2>&nbsp</td><td>&nbsp;</td><td>";
if (! $isOK) {
if (count($src_oclass) == 1) {
$add_href = "add_oclass_form.php?server_id=$ldapserver_dst->server_id&dn=$encoded_dn_dst&new_oclass=$src_oclass[0]";
} else {
$add_href = "add_value_form.php?server_id=$ldapserver_dst->server_id&dn=$encoded_dn_dst&attr=objectClass";
}
if ($attr == 'objectClass')
printf('<div class="add_oclass">(<a href="%s" title="%s">%s</a>)</div>',$add_href,$lang['add_oclass_and_attrs'],$lang['add_value']);
else
printf('<div class="add_oclass">(<a href="%s" title="%s">%s</a>)</div>',$add_href,sprintf($lang['need_oclass'], implode(" ",$src_oclass)),$lang['add_new_objectclass']);
} else {
if(! $schema_attr_dst->getIsSingleValue() || (! isset($vals))) {
$add_href = "add_value_form.php?server_id=$ldapserver_dst->server_id&dn=$encoded_dn_dst&attr=" . rawurlencode( $attr );
printf('<div class="add_value">(<a href="%s" title="%s">%s</a>)</div>',
$add_href,sprintf($lang['add_value_tooltip'],$attr),$lang['add_value']);
}
}
}
print "</td></tr>"; ?>
</td>
<?php flush(); ?>
</tr>
<?php } /* End foreach( $attrs as $attr => $vals ) */
if( ! $ldapserver_dst->isReadOnly( ) ) { ?>
<td colspan="2">&nbsp</td><td colspan=2><center><input type="submit" value="<?php echo $lang['save_changes']; ?>" /></center></td></tr></form>
<?php } ?>
</table>
<?php /* If this entry has a binary attribute, we need to provide a form for it to submit when deleting it. */ ?>
<script language="javascript">
//<!--
function deleteAttribute( attrName )
{
if( confirm( "<?php echo $lang['really_delete_attribute']; ?> '" + attrName + "'?" ) ) {
document.delete_attribute_form.attr.value = attrName;
document.delete_attribute_form.submit();
}
}
//-->
</script>
<!-- This form is submitted by JavaScript when the user clicks "Delete attribute" on a binary attribute -->
<form name="delete_attribute_form" action="delete_attr.php" method="post">
<input type="hidden" name="server_id" value="<?php echo $ldapserver_dst->server_id; ?>" />
<input type="hidden" name="dn" value="<?php echo $dn_dst; ?>" />
<input type="hidden" name="attr" value="FILLED IN BY JAVASCRIPT" />
</form>
</body>
</html>

View File

@@ -1,79 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/compare_form.php,v 1.2 2005/07/22 05:47:43 wurley Exp $
/**
* Compares to DN entries side by side.
*
* - dn (rawurlencoded)
* - server_id
*
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
if( ! $ldapserver->haveAuthInfo())
pla_error( $lang['not_enough_login_info'] );
$dn = (isset($_GET['dn']) ? $_GET['dn'] : '');
$encoded_dn = rawurlencode( $dn );
$rdn = get_rdn( $dn );
$container = get_container( $dn );
$attrs = get_object_attrs( $ldapserver, $dn );
$select_server_html = server_select_list($ldapserver->server_id,true,'server_id_dst');
include './header.php'; ?>
<body>
<h3 class="title"><?php echo $lang['compare_dn']. '&nbsp;' . $rdn; ?></h3>
<h3 class="subtitle"><?php echo $lang['server']; ?>: <b><?php echo $ldapserver->name; ?></b>
<?php if ($dn) { ?>
&nbsp;&nbsp;&nbsp; <?php echo $lang['distinguished_name']?>: <b><?php echo $dn; ?></b>
<?php } ?>
</h3>
<center>
<?php echo $lang['compare']; ?> <b><?php echo htmlspecialchars( $rdn ); ?></b> <?php echo $lang['with']; ?>:<br />
<br />
<form action="compare.php" method="post" name="compare_form">
<input type="hidden" name="server_id_src" value="<?php echo $ldapserver->server_id; ?>" />
<table style="border-spacing: 10px">
<tr>
<?php if (! $dn) { ?>
<td><acronym title="<?php echo $lang['compf_dn_tooltip']; ?>"><?php echo $lang['compf_source_dn']; ?></acronym>:</td>
<td>
<input type="text" name="dn_src" size="45" value="<?php echo htmlspecialchars( $dn ); ?>" />
<?php draw_chooser_link( 'compare_form.dn_src', 'true', $rdn ); ?></td>
</td>
<?php } else { ?>
<input type="hidden" name="dn_src" value="<?php echo htmlspecialchars( $dn ); ?>" />
<?php } ?>
</tr>
<tr>
<td><acronym title="<?php echo $lang['compf_dn_tooltip']; ?>"><?php echo $lang['copyf_dest_dn']; ?></acronym>:</td>
<td>
<input type="text" name="dn_dst" size="45" value="" />
<?php draw_chooser_link( 'compare_form.dn_dst', 'true', '' ); ?></td>
</td>
</tr>
<tr>
<td><?php echo $lang['copyf_dest_server']?>:</td>
<td><?php echo $select_server_html; ?></td>
</tr>
<tr>
<td colspan="2" align="right"><input type="submit" value="<?php echo $lang['compare']; ?>" /></td>
</tr>
</table>
</form>
</center>
</body>
</html>

View File

@@ -1,340 +0,0 @@
<?php
/**
* The phpLDAPadmin config file
*
* This is where you can customise some of the phpLDAPadmin defaults
* that are defined in config_default.php.
*
* To override a default, use the $config->custom variable to do so.
* For example, the default for defining the language in config_default.php
*
* $this->default->appearance['lang'] = array(
* 'desc'=>'Language',
* 'default'=>'auto');
*
* to override this, use $config->custom->appearance['lang'] = 'en';
*
* This file is also used to configure your LDAP server connections.
*
* You must specify at least one LDAP server there. You may add
* as many as you like. You can also specify your language, and
* many other options.
*/
/** **/
/** Miscellaneous Configuration overrides **/
/** **/
/* If you are asked to put pla in debug mode, this is how you do it: */
// $config->custom->debug['level'] = 2;
// $config->custom->debug['syslog'] = true;
/* phpLDAPadmin can encrypt the content of sensitive cookies if you set this
to a big random string. */
$config->custom->session['blowfish'] = '';
/* The language setting. If you set this to 'auto', phpLDAPadmin will
attempt to determine your language automatically. Otherwise, available
lanaguages are: 'ct', 'de', 'en', 'es', 'fr', 'it', 'nl', and 'ru'
Localization is not complete yet, but most strings have been translated.
Please help by writing language files. See lang/en.php for an example. */
// $config->custom->appearance['language'] = 'auto';
/* The temporary storage directory where we will put jpegPhoto data
This directory must be readable and writable by your web server. */
// $config->custom->jpeg['tmpdir'] = "c:\\temp"; // Example for Windows systems
$config->custom->jpeg['tmpdir'] = "/tmp"; // Example for Unix systems
/** **/
/** Your LDAP servers **/
/** **/
$i=0;
$ldapservers = new LDAPServers;
/* A convenient name that will appear in the tree viewer and throughout phpLDAPadmin to
identify this LDAP server to users. */
$ldapservers->SetValue($i,'server','name','My LDAP Server');
/* Examples:
'ldap.example.com',
'ldaps://ldap.example.com/',
'ldapi://%2fusr%local%2fvar%2frun%2fldapi' (Unix socket at /usr/local/var/run/ldap) */
// $ldapservers->SetValue($i,'server','host','127.0.0.1');
/* The port your LDAP server listens on (no quotes). 389 is standard. */
// $ldapservers->SetValue($i,'server','port','389');
/* Array of base DNs of your LDAP server. Leave this blank to have phpLDAPadmin auto-detect it for you. */
// $ldapservers->SetValue($i,'server','base',array(''));
/* Three 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 login will be
required to use phpLDAPadmin for this server.
Choose wisely to protect your authentication information appropriately for your situation. If
you choose 'cookie', your cookie contents will be encrypted using blowfish and the secret your specify
above as session['blowfish']. */
// $ldapservers->SetValue($i,'server','auth_type','cookie');
/* The DN of the user for phpLDAPadmin to bind with. For anonymous binds or 'cookie' or 'session' auth_types,
leave the login_dn and login_pass blank. If you specify a login_attr in conjunction with a cookie or
session auth_type, then you can also specify the login_dn/login_pass here for searching the directory for
users (ie, if your LDAP server does not allow anonymous binds. */
// $ldapservers->SetValue($i,'login','dn','cn=Manager,dc=example,dc=com');
/* Your LDAP password. If you specified an empty login_dn above, this MUST also be blank. */
// $ldapservers->SetValue($i,'login','pass','secret');
/* Use TLS (Transport Layer Security) to connect to the LDAP server. */
// $ldapservers->SetValue($i,'server','tls',false);
/* If the link between your web server and this LDAP server is slow, it is recommended that you set
'low_bandwidth' to true. This will cause phpLDAPadmin to forego some "fancy" features to conserve bandwidth. */
// $ldapservers->SetValue($i,'server','low_bandwidth',false);
/* Default password hashing algorithm. One of md5, ssha, sha, md5crpyt, smd5, blowfish, crypt or
leave blank for now default algorithm. */
// $ldapservers->SetValue($i,'appearance','password_hash','md5');
/* If you specified 'cookie' or 'session' as the auth_type above, you can optionally specify here an attribute
to use when logging in. If you enter 'uid' and login as 'dsmith', phpLDAPadmin will search for (uid=dsmith)
and log in as that user. Leave blank or specify 'dn' to use full DN for logging in. Note also that if your
LDAP server requires you to login to perform searches, you can enter the DN to use when searching in 'login_dn'
and 'login_pass' above. You may also specify 'string', in which case you can provide a string to use for
logging users in. See 'login_string' directly below. */
// $ldapservers->SetValue($i,'login','attr','uid');
/* 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 "uid=dsmith,ou=People,dc=example,dc=com", then I can specify a string
"uid=<username>,ou=People,dc=example,dc=com" and my users can login with their user names alone, ie: "dsmith"
in this case. */
// $ldapservers->SetValue($i,'login','string','uid=<username>,ou=People,dc=example,dc=com');
/* If 'login_attr' is used above such that phpLDAPadmin will search for your DN at login, you may restrict the
search to a specific objectClass. E.g., set this to 'posixAccount' or 'inetOrgPerson', depending upon your setup. */
// $ldapservers->SetValue($i,'login','class','');
/* Specify true If you want phpLDAPadmin to not display or permit any modification to the LDAP server. */
// $ldapservers->SetValue($i,'server','read_only',false);
/* Specify false if you do not want phpLDAPadmin to draw the 'Create new' links in the tree viewer. */
// $ldapservers->SetValue($i,'appearance','show_create',true);
/* This feature allows phpLDAPadmin to automatically determine the next available uidNumber for a new entry. */
// $ldapservers->SetValue($i,'auto_number','enable',true);
/* The mechanism to use when finding the next available uidNumber. Two possible values: 'uidpool' or 'search'.
The 'uidpool' mechanism uses an existing uidPool entry in your LDAP server to blindly lookup the next available
uidNumber. The 'search' mechanism searches for entries with a uidNumber value and finds the first available
uidNumber (slower). */
// $ldapservers->SetValue($i,'auto_number','mechanism','search');
/* The DN of the search base when the 'search' mechanism is used above. */
// $ldapservers->SetValue($i,'auto_number','search_base','ou=People,dc=example,dc=com');
/* The minimum number to use when searching for the next available UID number (only when 'search' is used for
auto_uid_number_mechanism' */
// $ldapservers->SetValue($i,'auto_number','min','1000');
/* The DN of the uidPool entry when 'uidpool' mechanism is used above. */
// $servers[$i]['auto_uid_number_uid_pool_dn'] = 'cn=uidPool,dc=example,dc=com';
/* If you set this, then phpldapadmin will bind to LDAP with this user ID when searching for the uidnumber. The
idea is, this user id would have full (readonly) access to uidnumber in your ldap directory (the logged in user
may not), so that you can be guaranteed to get a unique uidnumber for your directory. */
// $ldapservers->SetValue($i,'auto_number','dn','');
/* The password for the dn above. */
// $ldapservers->SetValue($i,'auto_number','pass','');
/* Disable the anonymous login. */
// $ldapservers->SetValue($i,'login','anon_bind',true);
/* Use customized page with prefix when available. */
// $ldapservers->SetValue($i,'custom','pages_prefix','custom_');
/* If you set this, then phpldapadmin will bind to LDAP with this user when testing for unique attributes (as set
in unique_attrs array). If you want to enforce unique attributes, than this id should have full (readonly) access
to the attributes in question (the logged in user may not have enough access) */
// $ldapservers->SetValue($i,'unique_attrs','dn','');
/* The password for the dn above */
// $ldapservers->SetValue($i,'unique_attrs','pass','');
/* If you set this, then only these DNs are allowed to log in. This array can contain individual users, groups or
ldap search filter(s). Keep in mind that the user has not authenticated yet, so this will be an anonymous search
to the LDAP server, so make your ACLs allow these searches to return results! */
// $ldapservers->SetValue($i,'login','allowed_dns',array(
// 'uid=stran,ou=People,dc=example,dc=com',
// '(&(gidNumber=811)(objectClass=groupOfNames))',
// '(|(uidNumber=200)(uidNumber=201))',
// 'cn=callcenter,ou=Group,dc=example,dc=com'));
/* Set this if you dont want this LDAP server to show in the tree */
// $ldapservers->SetValue($i,'appearance','visible',true);
/* This is the time out value in minutes for the server. After as many minutes of inactivity you will be
automatically logged out. If not set, the default value will be ( session_cache_expire()-1 ) */
// $ldapservers->SetValue($i,'login','timeout',30);
/* Set this if you want phpldapadmin to perform rename operation on entry which has children. Certain servers are known
to allow it, certain are not */
// $ldapservers->SetValue($i,'server','branch_rename',false);
/* If you want to configure additional LDAP servers, do so below. */
$i++;
$ldapservers->SetValue($i,'server','name','LDAP Server');
$ldapservers->SetValue($i,'server','host','127.0.0.1');
$ldapservers->SetValue($i,'server','port','389');
$ldapservers->SetValue($i,'server','base',array(''));
$ldapservers->SetValue($i,'server','auth_type','cookie');
$ldapservers->SetValue($i,'login','dn','');
$ldapservers->SetValue($i,'login','pass','');
$ldapservers->SetValue($i,'server','tls',false);
$ldapservers->SetValue($i,'server','low_bandwidth',false);
$ldapservers->SetValue($i,'appearance','password_hash','md5');
$ldapservers->SetValue($i,'login','attr','uid');
$ldapservers->SetValue($i,'login','string','');
$ldapservers->SetValue($i,'login','class','');
$ldapservers->SetValue($i,'server','read_only',false);
$ldapservers->SetValue($i,'appearance','show_create',true);
$ldapservers->SetValue($i,'auto_number','enable',true);
$ldapservers->SetValue($i,'auto_number','mechanism','search');
$ldapservers->SetValue($i,'auto_number','search_base','');
$ldapservers->SetValue($i,'auto_number','min','1000');
$ldapservers->SetValue($i,'auto_number','dn','');
$ldapservers->SetValue($i,'auto_number','pass','');
$ldapservers->SetValue($i,'login','anon_bind',true);
$ldapservers->SetValue($i,'custom','pages_prefix','custom_');
$ldapservers->SetValue($i,'unique_attrs','dn','');
$ldapservers->SetValue($i,'unique_attrs','pass','');
$ldapservers->SetValue($i,'appearance','visible',false);
/* If you want to configure more LDAP servers, copy and paste the above (including the "$i++;")
Dont forget to change 'visible' to true! */
/** **/
/** User-friendly attribute translation **/
/** **/
/* Use this array to map attribute names to user friendly names. For example, if you
don't want to see "facsimileTelephoneNumber" but rather "Fax". */
$friendly_attrs = array();
$friendly_attrs[ 'facsimileTelephoneNumber' ] = 'Fax';
$friendly_attrs[ 'telephoneNumber' ] = 'Phone';
/** **/
/** Support for attrs display order **/
/** **/
/* Use this array if you want to have your attributes displayed in a specific order.
You can use default attribute names or their fridenly names.
For example, "sn" will be displayed right after "givenName". All the other attributes
that are not specified in this array will be displayed after in alphabetical order. */
// $attrs_display_order = array(
// "givenName",
// "sn",
// "cn",
// "displayName",
// "uid",
// "uidNumber",
// "gidNumber",
// "homeDirectory",
// "mail",
// "userPassword"
// );
/** **/
/** Hidden attributes **/
/** **/
/* You may want to hide certain attributes from being displayed in the editor screen
Do this by adding the desired attributes to this list (and uncomment it). This
only affects the editor screen. Attributes will still be visible in the schema
browser and elsewhere. An example is provided below:
NOTE: The user must be able to read the hidden_except_dn entry to be excluded. */
//$hidden_attrs = array( 'jpegPhoto', 'objectClass' );
//$hidden_except_dn = "cn=PLA UnHide,ou=Groups,c=AU";
/* Hidden attributes in read-only mode. If undefined, it will be equal to $hidden_attrs. */
// $hidden_attrs_ro = array( 'objectClass','shadowWarning', 'shadowLastChange', 'shadowMax',
// 'shadowFlag', 'shadowInactive', 'shadowMin', 'shadowExpire');
/** **/
/** Read-only attributes **/
/** **/
/* You may want to phpLDAPadmin to display certain attributes as read only, meaning
that users will not be presented a form for modifying those attributes, and they
will not be allowed to be modified on the "back-end" either. You may configure
this list here:
NOTE: The user must be able to read the read_only_except_dn entry to be excluded. */
//$read_only_attrs = array( 'objectClass' );
//$read_only_except_dn = "cn=PLA ReadWrite,ou=Groups,c=AU";
/* An example of how to specify multiple read-only attributes: */
// $read_only_attrs = array( 'jpegPhoto', 'objectClass', 'someAttribute' );
/** **/
/** Unique attributes **/
/** **/
/* You may want phpLDAPadmin to enforce some attributes to have unique values (ie:
not belong to other entries in your tree. This (together with "unique_attrs_dn"
and "unique_attrs_dn_pass" option will not let updates to occur with other attributes
have the same value.
NOTE: Currently the unique_attrs is NOT enforced when copying a dn. (Need to present a user with
the option of changing the unique attributes. */
//$unique_attrs = array('uid','uidNumber','mail');
/** **/
/** Predefined Queries (canned views) **/
/** **/
/* To make searching easier, you may setup predefined queries below: */
$q=0;
$queries = array();
/* The name that will appear in the simple search form */
$queries[$q]['name'] = 'User List';
/* The base to search on */
$queries[$q]['base'] = 'dc=example,dc=com';
/* The search scope (sub, base, one) */
$queries[$q]['scope'] = 'sub';
/* The LDAP filter to use */
$queries[$q]['filter'] = '(&(objectClass=posixAccount)(uid=*))';
/* The attributes to return */
$queries[$q]['attributes'] = 'cn, uid, homeDirectory';
/* If you want to configure more pre-defined queries, copy and paste the above (including the "$q++;") */
$q++;
$queries[$q]['name'] = 'Samba Users';
$queries[$q]['base'] = 'dc=example,dc=com';
$queries[$q]['scope'] = 'sub';
$queries[$q]['filter'] = '(&(|(objectClass=sambaAccount)(objectClass=sambaSamAccount))(objectClass=posixAccount)(!(uid=*$)))';
$queries[$q]['attributes'] = 'uid, smbHome, uidNumber';
$q++;
$queries[$q]['name'] = 'Samba Computers';
$queries[$q]['base'] = 'dc=example,dc=com';
$queries[$q]['scope'] = 'sub';
$queries[$q]['filter'] = '(&(objectClass=sambaAccount)(uid=*$))';
$queries[$q]['attributes'] = 'uid, homeDirectory';
?>

547
config/config.php.example Normal file
View File

@@ -0,0 +1,547 @@
<?php
/** NOTE **
** Make sure that <?php is the FIRST line of this file!
** IE: There should NOT be any blank lines or spaces BEFORE <?php
**/
/**
* The phpLDAPadmin config file
*
* This is where you can customise some of the phpLDAPadmin defaults
* that are defined in config_default.php.
*
* To override a default, use the $config->custom variable to do so.
* For example, the default for defining the language in config_default.php
*
* $this->default->appearance['language'] = array(
* 'desc'=>'Language',
* 'default'=>'auto');
*
* to override this, use $config->custom->appearance['language'] = 'en_EN';
*
* This file is also used to configure your LDAP server connections.
*
* You must specify at least one LDAP server there. You may add
* as many as you like. You can also specify your language, and
* many other options.
*
* NOTE: Commented out values in this file prefixed by //, represent the
* defaults that have been defined in config_default.php.
* Commented out values prefixed by #, dont reflect their default value, you can
* check config_default.php if you want to see what the default is.
*
* DONT change config_default.php, you changes will be lost by the next release
* of PLA. Instead change this file - as it will NOT be replaced by a new
* version of phpLDAPadmin.
*/
/*********************************************/
/* Useful important configuration overrides */
/*********************************************/
/* If you are asked to put PLA in debug mode, this is how you do it: */
# $config->custom->debug['level'] = 255;
# $config->custom->debug['syslog'] = true;
# $config->custom->debug['file'] = '/tmp/pla_debug.log';
/* phpLDAPadmin can encrypt the content of sensitive cookies if you set this
to a big random string. */
// $config->custom->session['blowfish'] = null;
/* The language setting. If you set this to 'auto', phpLDAPadmin will attempt
to determine your language automatically. Otherwise, available lanaguages
are: 'ct', 'de', 'en', 'es', 'fr', 'it', 'nl', and 'ru'
Localization is not complete yet, but most strings have been translated.
Please help by writing language files. See lang/en.php for an example. */
// $config->custom->appearance['language'] = 'auto';
/* The temporary storage directory where we will put jpegPhoto data
This directory must be readable and writable by your web server. */
// $config->custom->jpeg['tmpdir'] = '/tmp'; // Example for Unix systems
# $config->custom->jpeg['tmpdir'] = 'c:\\temp'; // Example for Windows systems
/* Set this to (bool)true if you do NOT want a random salt used when
calling crypt(). Instead, use the first two letters of the user's
password. This is insecure but unfortunately needed for some older
environments. */
# $config->custom->password['no_random_crypt_salt'] = true;
/* PHP script timeout control. If php runs longer than this many seconds then
PHP will stop with an Maximum Execution time error. Increase this value from
the default if queries to your LDAP server are slow. The default is either
30 seconds or the setting of max_exection_time if this is null. */
// $config->custom->session['timelimit'] = 30;
/* Our local timezone
This is to make sure that when we ask the system for the current time, we
get the right local time. If this is not set, all time() calculations will
assume UTC if you have not set PHP date.timezone. */
// $config->custom->appearance['timezone'] = null;
# $config->custom->appearance['timezone'] = 'Australia/Melbourne';
/*********************************************/
/* 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['cmd'] = array(
'entry_internal_attributes_show' => true,
'entry_refresh' => true,
'oslinks' => true,
'switch_template' => true
);
$config->custom->commands['script'] = array(
'add_attr_form' => true,
'add_oclass_form' => true,
'add_value_form' => true,
'collapse' => true,
'compare' => true,
'compare_form' => true,
'copy' => true,
'copy_form' => true,
'create' => true,
'create_confirm' => true,
'delete' => true,
'delete_attr' => true,
'delete_form' => true,
'draw_tree_node' => true,
'expand' => true,
'export' => true,
'export_form' => true,
'import' => true,
'import_form' => true,
'login' => true,
'logout' => true,
'login_form' => true,
'mass_delete' => true,
'mass_edit' => true,
'mass_update' => true,
'modify_member_form' => true,
'monitor' => true,
'purge_cache' => true,
'query_engine' => true,
'rename' => true,
'rename_form' => true,
'rdelete' => true,
'refresh' => true,
'schema' => true,
'server_info' => true,
'show_cache' => true,
'template_engine' => true,
'update_confirm' => true,
'update' => 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'] = 'AJAXTree';
# $config->custom->appearance['tree'] = 'HTMLTree';
/* Just show your custom templates. */
// $config->custom->appearance['custom_templates_only'] = false;
/* Disable the default template. */
// $config->custom->appearance['disable_default_template'] = false;
/* Hide the warnings for invalid objectClasses/attributes in templates. */
// $config->custom->appearance['hide_template_warning'] = false;
/* Configure what objects are shown in left hand tree */
// $config->custom->appearance['tree_filter'] = '(objectclass=*)';
/* The height and width of the tree. If these values are not set, then
no tree scroll bars are provided. */
// $config->custom->appearance['tree_height'] = null;
# $config->custom->appearance['tree_height'] = 600;
// $config->custom->appearance['tree_width'] = null;
# $config->custom->appearance['tree_width'] = 250;
/*********************************************/
/* User-friendly attribute translation */
/*********************************************/
/* Use this array to map attribute names to user friendly names. For example, if
you don't want to see "facsimileTelephoneNumber" but rather "Fax". */
// $config->custom->appearance['friendly_attrs'] = array();
$config->custom->appearance['friendly_attrs'] = array(
'facsimileTelephoneNumber' => 'Fax',
'gid' => 'Group',
'mail' => 'Email',
'telephoneNumber' => 'Telephone',
'uid' => 'User Name',
'userPassword' => 'Password'
);
/*********************************************/
/* Hidden attributes */
/*********************************************/
/* You may want to hide certain attributes from being edited. If you want to
hide attributes from the user, you should use your LDAP servers ACLs.
NOTE: The user must be able to read the hide_attrs_exempt entry to be
excluded. */
// $config->custom->appearance['hide_attrs'] = array();
# $config->custom->appearance['hide_attrs'] = array('objectClass');
/* Members of this list will be exempt from the hidden attributes.*/
// $config->custom->appearance['hide_attrs_exempt'] = null;
# $config->custom->appearance['hide_attrs_exempt'] = 'cn=PLA UnHide,ou=Groups,c=AU';
/*********************************************/
/* Read-only attributes */
/*********************************************/
/* You may want to phpLDAPadmin to display certain attributes as read only,
meaning that users will not be presented a form for modifying those
attributes, and they will not be allowed to be modified on the "back-end"
either. You may configure this list here:
NOTE: The user must be able to read the readonly_attrs_exempt entry to be
excluded. */
// $config->custom->appearance['readonly_attrs'] = array();
/* Members of this list will be exempt from the readonly attributes.*/
// $config->custom->appearance['readonly_attrs_exempt'] = null;
# $config->custom->appearance['readonly_attrs_exempt'] = 'cn=PLA ReadWrite,ou=Groups,c=AU';
/*********************************************/
/* Group attributes */
/*********************************************/
/* Add "modify group members" link to the attribute. */
// $config->custom->modify_member['groupattr'] = array('member','uniqueMember','memberUid');
/* Configure filter for member search. This only applies to "modify group members" feature */
// $config->custom->modify_member['filter'] = '(objectclass=Person)';
/* Attribute that is added to the group member attribute. */
// $config->custom->modify_member['attr'] = 'dn';
/* For Posix attributes */
// $config->custom->modify_member['posixattr'] = 'uid';
// $config->custom->modify_member['posixfilter'] = '(uid=*)';
// $config->custom->modify_member['posixgroupattr'] = 'memberUid';
/*********************************************/
/* Support for attrs display order */
/*********************************************/
/* Use this array if you want to have your attributes displayed in a specific
order. You can use default attribute names or their fridenly names.
For example, "sn" will be displayed right after "givenName". All the other
attributes that are not specified in this array will be displayed after in
alphabetical order. */
// $config->custom->appearance['attr_display_order'] = array();
# $config->custom->appearance['attr_display_order'] = array(
# 'givenName',
# 'sn',
# 'cn',
# 'displayName',
# 'uid',
# 'uidNumber',
# 'gidNumber',
# 'homeDirectory',
# 'mail',
# 'userPassword'
# );
/*********************************************/
/* Define your LDAP servers in this section */
/*********************************************/
$servers = new Datastore();
/* $servers->NewServer('ldap_pla') must be called before each new LDAP server
declaration. */
$servers->newServer('ldap_pla');
/* A convenient name that will appear in the tree viewer and throughout
phpLDAPadmin to identify this LDAP server to users. */
$servers->setValue('server','name','My LDAP Server');
/* Examples:
'ldap.example.com',
'ldaps://ldap.example.com/',
'ldapi://%2fusr%local%2fvar%2frun%2fldapi'
(Unix socket at /usr/local/var/run/ldap) */
// $servers->setValue('server','host','127.0.0.1');
/* The port your LDAP server listens on (no quotes). 389 is standard. */
// $servers->setValue('server','port',389);
/* Array of base DNs of your LDAP server. Leave this blank to have phpLDAPadmin
auto-detect it for you. */
// $servers->setValue('server','base',array(''));
/* 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. '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
your situation. If you choose 'cookie', your cookie contents will be
encrypted using blowfish and the secret your specify above as
session['blowfish']. */
// $servers->setValue('login','auth_type','session');
/* The DN of the user for phpLDAPadmin to bind with. For anonymous binds or
'cookie' or 'session' auth_types, LEAVE THE LOGIN_DN AND LOGIN_PASS BLANK. If
you specify a login_attr in conjunction with a cookie or session auth_type,
then you can also specify the bind_id/bind_pass here for searching the
directory for users (ie, if your LDAP server does not allow anonymous binds. */
// $servers->setValue('login','bind_id','');
# $servers->setValue('login','bind_id','cn=Manager,dc=example,dc=com');
/* Your LDAP password. If you specified an empty bind_id above, this MUST also
be blank. */
// $servers->setValue('login','bind_pass','');
# $servers->setValue('login','bind_pass','secret');
/* Use TLS (Transport Layer Security) to connect to the LDAP server. */
// $servers->setValue('server','tls',false);
/************************************
* SASL Authentication *
************************************/
/* Enable SASL authentication LDAP SASL authentication requires PHP 5.x
configured with --with-ldap-sasl=DIR. If this option is disabled (ie, set to
false), then all other sasl options are ignored. */
// $servers->setValue('server','sasl_auth',false);
/* SASL auth mechanism */
// $servers->setValue('server','sasl_mech','PLAIN');
/* SASL authentication realm name */
// $servers->setValue('server','sasl_realm','');
# $servers->setValue('server','sasl_realm','example.com');
/* SASL authorization ID name
If this option is undefined, authorization id will be computed from bind DN,
using sasl_authz_id_regex and sasl_authz_id_replacement. */
// $servers->setValue('server','sasl_authz_id', null);
/* SASL authorization id regex and replacement
When sasl_authz_id property is not set (default), phpLDAPAdmin will try to
figure out authorization id by itself from bind distinguished name (DN).
This procedure is done by calling preg_replace() php function in the
following way:
$authz_id = preg_replace($sasl_authz_id_regex,$sasl_authz_id_replacement,
$bind_dn);
For info about pcre regexes, see:
- pcre(3), perlre(3)
- http://www.php.net/preg_replace */
// $servers->setValue('server','sasl_authz_id_regex',null);
// $servers->setValue('server','sasl_authz_id_replacement',null);
# $servers->setValue('server','sasl_authz_id_regex','/^uid=([^,]+)(.+)/i');
# $servers->setValue('server','sasl_authz_id_replacement','$1');
/* SASL auth security props.
See http://beepcore-tcl.sourceforge.net/tclsasl.html#anchor5 for explanation. */
// $servers->setValue('server','sasl_props',null);
/* Default password hashing algorithm. One of md5, ssha, sha, md5crpyt, smd5,
blowfish, crypt or leave blank for now default algorithm. */
// $servers->setValue('appearance','password_hash','md5');
/* If you specified 'cookie' or 'session' as the auth_type above, you can
optionally specify here an attribute to use when logging in. If you enter
'uid' and login as 'dsmith', phpLDAPadmin will search for (uid=dsmith)
and log in as that user.
Leave blank or specify 'dn' to use full DN for logging in. Note also that if
your LDAP server requires you to login to perform searches, you can enter the
DN to use when searching in 'bind_id' and 'bind_pass' above.
// $servers->setValue('login','attr','dn');
/* Base DNs to used for logins. If this value is not set, then the LDAP server
Base DNs are used. */
// $servers->setValue('login','base',array());
/* If 'login,attr' is used above such that phpLDAPadmin will search for your DN
at login, you may restrict the search to a specific objectClasses. EG, set this
to array('posixAccount') or array('inetOrgPerson',..), depending upon your
setup. */
// $servers->setValue('login','class',array());
/* 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.
When using this feature, login_class is ignored. */
// $servers->setValue('login','fallback_dn',false);
/* Specify true If you want phpLDAPadmin to not display or permit any
modification to the LDAP server. */
// $servers->setValue('server','read_only',false);
/* Specify false if you do not want phpLDAPadmin to draw the 'Create new' links
in the tree viewer. */
// $servers->setValue('appearance','show_create',true);
/* This feature allows phpLDAPadmin to automatically determine the next
available uidNumber for a new entry. */
// $servers->setValue('auto_number','enable',true);
/* The mechanism to use when finding the next available uidNumber. Two possible
values: 'uidpool' or 'search'.
The 'uidpool' mechanism uses an existing uidPool entry in your LDAP server to
blindly lookup the next available uidNumber. The 'search' mechanism searches
for entries with a uidNumber value and finds the first available uidNumber
(slower). */
// $servers->setValue('auto_number','mechanism','search');
/* The DN of the search base when the 'search' mechanism is used above. */
# $servers->setValue('auto_number','search_base','ou=People,dc=example,dc=com');
/* The minimum number to use when searching for the next available number
(only when 'search' is used for auto_number */
// $servers->setValue('auto_number','min',array('uidNumber'=>1000,'gidNumber'=>500));
/* If you set this, then phpldapadmin will bind to LDAP with this user ID when
searching for the uidnumber. The idea is, this user id would have full
(readonly) access to uidnumber in your ldap directory (the logged in user
may not), so that you can be guaranteed to get a unique uidnumber for your
directory. */
// $servers->setValue('auto_number','dn',null);
/* The password for the dn above. */
// $servers->setValue('auto_number','pass',null);
/* Enable anonymous bind login. */
// $servers->setValue('login','anon_bind',true);
/* Use customized page with prefix when available. */
# $servers->setValue('custom','pages_prefix','custom_');
/* If you set this, then only these DNs are allowed to log in. This array can
contain individual users, groups or ldap search filter(s). Keep in mind that
the user has not authenticated yet, so this will be an anonymous search to
the LDAP server, so make your ACLs allow these searches to return results! */
# $servers->setValue('login','allowed_dns',array(
# 'uid=stran,ou=People,dc=example,dc=com',
# '(&(gidNumber=811)(objectClass=groupOfNames))',
# '(|(uidNumber=200)(uidNumber=201))',
# 'cn=callcenter,ou=Group,dc=example,dc=com'));
/* Set this if you dont want this LDAP server to show in the tree */
// $servers->setValue('server','visible',true);
/* This is the time out value in minutes for the server. After as many minutes
of inactivity you will be automatically logged out. If not set, the default
value will be ( session_cache_expire()-1 ) */
# $servers->setValue('login','timeout',30);
/* Set this if you want phpldapadmin to perform rename operation on entry which
has children. Certain servers are known to allow it, certain are not */
// $servers->setValue('server','branch_rename',false);
/* If you set this, then phpldapadmin will show these attributes as
internal attributes, even if they are not defined in your schema. */
// $servers->setValue('server','custom_sys_attrs',array(''));
# $servers->setValue('server','custom_sys_attrs',array('passwordExpirationTime','passwordAllowChangeTime'));
/* If you set this, then phpldapadmin will show these attributes on
objects, even if they are not defined in your schema. */
// $servers->setValue('server','custom_attrs',array(''));
# $servers->setValue('server','custom_attrs',array('nsRoleDN','nsRole','nsAccountLock'));
/* These attributes will be forced to MAY attributes and become option in the
templates. If they are not defined in the templates, then they wont appear
as per normal template processing. You may want to do this becuase your LDAP
server may automatically calculate a default value.
In Fedora Directory Server using the DNA Plugin one could ignore uidNumber,
gidNumber and sambaSID. */
// $servers->setValue('force_may','attrs',array(''));
# $servers->setValue('force_may','attrs',array('uidNumber','gidNumber','sambaSID'));
/*********************************************/
/* Unique attributes */
/*********************************************/
/* You may want phpLDAPadmin to enforce some attributes to have unique values
(ie: not belong to other entries in your tree. This (together with
'unique','dn' and 'unique','pass' option will not let updates to
occur with other attributes have the same value. */
# $servers->setValue('unique','attrs',array('mail','uid','uidNumber'));
/* If you set this, then phpldapadmin will bind to LDAP with this user ID when
searching for attribute uniqueness. The idea is, this user id would have full
(readonly) access to your ldap directory (the logged in user may not), so
that you can be guaranteed to get a unique uidnumber for your directory. */
// $servers->setValue('unique','dn',null);
/* The password for the dn above. */
// $servers->setValue('unique','pass',null);
/**************************************************************************
* If you want to configure additional LDAP servers, do so below. *
* Remove the commented lines and use this section as a template for all *
* your other LDAP servers. *
**************************************************************************/
/*
$servers->newServer('ldap_pla');
$servers->setValue('server','name','LDAP Server');
$servers->setValue('server','host','127.0.0.1');
$servers->setValue('server','port',389);
$servers->setValue('server','base',array(''));
$servers->setValue('login','auth_type','cookie');
$servers->setValue('login','bind_id','');
$servers->setValue('login','bind_pass','');
$servers->setValue('server','tls',false);
# SASL auth
$servers->setValue('server','sasl_auth',true);
$servers->setValue('server','sasl_mech','PLAIN');
$servers->setValue('server','sasl_realm','EXAMPLE.COM');
$servers->setValue('server','sasl_authz_id',null);
$servers->setValue('server','sasl_authz_id_regex','/^uid=([^,]+)(.+)/i');
$servers->setValue('server','sasl_authz_id_replacement','$1');
$servers->setValue('server','sasl_props',null);
$servers->setValue('appearance','password_hash','md5');
$servers->setValue('login','attr','dn');
$servers->setValue('login','fallback_dn',false);
$servers->setValue('login','class',null);
$servers->setValue('server','read_only',false);
$servers->setValue('appearance','show_create',true);
$servers->setValue('auto_number','enable',true);
$servers->setValue('auto_number','mechanism','search');
$servers->setValue('auto_number','search_base',null);
$servers->setValue('auto_number','min',array('uidNumber'=>1000,'gidNumber'=>500));
$servers->setValue('auto_number','dn',null);
$servers->setValue('auto_number','pass',null);
$servers->setValue('login','anon_bind',true);
$servers->setValue('custom','pages_prefix','custom_');
$servers->setValue('unique','attrs',array('mail','uid','uidNumber'));
$servers->setValue('unique','dn',null);
$servers->setValue('unique','pass',null);
$servers->setValue('server','visible',true);
$servers->setValue('login','timeout',30);
$servers->setValue('server','branch_rename',false);
$servers->setValue('server','custom_sys_attrs',array('passwordExpirationTime','passwordAllowChangeTime'));
$servers->setValue('server','custom_attrs',array('nsRoleDN','nsRole','nsAccountLock'));
$servers->setValue('force_may','attrs',array('uidNumber','gidNumber','sambaSID'));
*/
?>

View File

@@ -1,376 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/config_default.php,v 1.11 2005/09/25 16:11:44 wurley Exp $
/**
* Configuration processing and defaults.
* @author The phpLDAPadmin development team
* @package phpLDAPadmin
* @todo Add validation of set variables to enforce limits or particular values.
*/
# The minimum version of PHP required to run phpLDAPadmin.
@define( 'REQUIRED_PHP_VERSION', '4.1.0' );
class Config {
var $custom;
var $default;
function Config() {
$this->custom = new stdClass;
$this->default = new stdClass;
## Appearance Attributes
/** Anonymous implies read only
* Set to true if you want LDAP data to be displayed read-only (without input fields)
* when a user logs in to a server anonymously
*/
$this->default->appearance['anonymous_bind_implies_read_only'] = array(
'desc'=>'Display as read only if user logs in with anonymous bind',
'default'=>true);
//$anonymous_bind_implies_read_only = true;
/* Anonymous redirect
* 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.
*/
$this->default->appearance['anonymous_bind_redirect_no_tree'] = array(
'desc'=>'Redirect user to search form if anonymous',
'default'=>false);
//$anonymous_bind_redirect_no_tree = false;
$this->default->appearance['date'] = array(
'desc'=>'Date format whenever dates are shown',
'default'=>'%A %e %B %Y');
//$date_format = "%A %e %B %Y";
$this->default->appearance['hide_configuration_management'] = array(
'desc'=>'Hide the Sourceforge related links',
'default'=>false);
//$hide_configuration_management = false;
/** Language
* The language setting. If you set this to 'auto', phpLDAPadmin will
* attempt to determine your language automatically. Otherwise, available
* lanaguages are: 'ct', 'de', 'en', 'es', 'fr', 'it', 'nl', and 'ru'
* Localization is not complete yet, but most strings have been translated.
* Please help by writing language files. See lang/en.php for an example.
*/
$this->default->appearance['language'] = array(
'desc'=>'Language',
'default'=>'auto');
//$language = '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);
//$enable_mass_delete = 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"));
//$multi_line_attributes = array( "postalAddress", "homePostalAddress", "personalSignature" );
/**
* A list of syntax OIDs which support multi-line attribute values:
*/
$this->default->appearance['multi_line_syntax_oids'] = array(
'desc'=>'Attributes to show as multiline attributes',
'default'=>array(
// octet string syntax OID:
"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"));
//$multi_line_syntax_oids ...
/** Obfuscate Password
* If true, display all password hash values as "******". Note that clear-text
* passwords will always be displayed as "******", regardless of this setting.
*/
$this->default->appearance['obfuscate_password_display'] = array(
'desc'=>'Obfuscate the display of passwords',
'default'=>false);
//$obfuscate_password_display = false;
$this->default->appearance['show_clear_password'] = array(
'desc'=>'Whether to show clear passwords if we dont obfuscate them',
'default'=>false);
$this->default->appearance['page_title'] = array(
'desc'=>'Change the page title to this text',
'default'=>'');
$this->default->appearance['show_hints'] = array(
'desc'=>'Show helpful hints',
'default'=>true);
//$show_hints = true; // set to false to disable hints
/** Tree display
* A format string used to display enties in the tree viewer (left-hand side)
* You can use special tokens to draw the entries as you wish. You can even mix in HTML to format the string
* Here are all the tokens you can use:
* %rdn - draw the RDN of the entry (ie, "cn=Dave")
* %dn - draw the DN of the entry (ie, "cn=Dave,ou=People,dc=example,dc=com"
* %rdnValue - draw the value of the RDN (ie, instead of "cn=Dave", just draw "Dave")
* %[attrname]- draw the value (or values) of the specified attribute.
* example: %gidNumber
*
* Examples:
*
* To draw the gidNumber and uidNumber to the right of the RDN in a small, gray font:
* '%rdn <small style="color:gray">( %gidNumber / %uidNumber )</span>'
* To draw the full DN of each entry:
* '%dn'
* To draw the objectClasses to the right in parenthesis:
* '%rdn <small style="color: gray">( %objectClass )</small>'
* To draw the user-friendly RDN value (ie, instead of "cn=Dave", just draw "Dave"):
* '%rdnValue'
*/
$this->default->appearance['tree_display_format'] = array(
'desc'=>'LDAP attribute to show in the tree',
'default'=>'%rdn');
//$tree_display_format = '%rdn';
$this->default->appearance['tree_width'] = array(
'desc'=>'Pixel width of the left frame view (tree browser)',
'default'=>320);
//$tree_width = 320; // pixels
/** Caching
*/
$this->default->cache['schema'] = array(
'desc'=>'Cache schema activity',
'default'=>true);
$this->default->cache['template'] = array(
'desc'=>'Cache Template configuration',
'default'=>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)
*/
$this->default->deref['export'] = array(
'desc'=>'',
'default'=>LDAP_DEREF_NEVER);
//$export_deref = LDAP_DEREF_NEVER;
$this->default->deref['search'] = array(
'desc'=>'',
'default'=>LDAP_DEREF_ALWAYS);
//$search_deref = LDAP_DEREF_ALWAYS;
$this->default->deref['tree'] = array(
'desc'=>'',
'default'=>LDAP_DEREF_NEVER);
//$tree_deref = LDAP_DEREF_NEVER;
$this->default->deref['view'] = array(
'desc'=>'',
'default'=>LDAP_DEREF_NEVER);
//$view_deref = LDAP_DEREF_NEVER;
## Debug Attributes
$this->default->debug['level'] = array(
'desc'=>'Debug level verbosity',
'default'=>0);
//$debug_level
$this->default->debug['syslog'] = array(
'desc'=>'Whether to send debug messages to syslog',
'default'=>false);
//$use_syslog
/** Temp Directories
* This directory must be readable and writable by your web server
*/
$this->default->jpeg['tmpdir'] = array(
'desc'=>'Temporary directory for jpegPhoto data',
'default'=>'/tmp');
//$jpeg_temp_dir = "/tmp";
$this->default->jpeg['tmp_keep_time'] = array(
'desc'=>'Time in seconds to keep jpegPhoto temporary files in the temp directory',
'default'=>120);
//$jpeg_tmp_keep_time = 120; // seconds
## Session Attributes
/** Cookie Encryption
* phpLDAPadmin can encrypt the content of sensitive cookies if you set this to a big random string.
*/
$this->default->session['blowfish'] = array(
'desc'=>'Blowfish key to encrypt cookie details',
'default'=>null);
//$blowfish_secret = '';
/** 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)
*/
$this->default->session['cookie_time'] = array(
'desc'=>'Time in seconds for the life of cookies',
'default'=>0);
//$cookie_time = 0;
## Password Generation
$this->default->password['length'] = array(
'desc'=>'Length of autogenerated password',
'default'=>8);
$this->default->password['numbers'] = array(
'desc'=>'Number of numbers required in the password',
'default'=>2);
$this->default->password['lowercase'] = array(
'desc'=>'Number of lowercase letters required in the password',
'default'=>2);
$this->default->password['uppercase'] = array(
'desc'=>'Number of uppercase letters required in the password',
'default'=>2);
$this->default->password['punctuation'] = array(
'desc'=>'Number of punctuation letters required in the password',
'default'=>2);
$this->default->password['use_similar'] = array(
'desc'=>'Whether to use similiar characters',
'default'=>true);
## Template Engine Configuration
$this->default->template_engine['enable'] = array(
'desc'=>'Use templates from parsed by the template engine',
'default'=>true);
$this->default->template_engine['disable_old'] = array(
'desc'=>'Disable access to old templates',
'default'=>true);
/** Search display
* By default, when searching you may display a list or a table of results.
* Set this to 'table' to see table formatted results.
* Set this to 'list' to see "Google" style formatted search results.
*/
$this->default->search['display'] = array(
'desc'=>'Display a list or table of search results',
'default'=>'list');
//$default_search_display = 'list';
$this->default->search['size_limit'] = array(
'desc'=>'Limit the size of searchs on the search page',
'default'=>50);
//$search_result_size_limit = 50;
/**
* Which attributes to include in the drop-down menu of the simple search form (comma-separated)
* Change this to suit your needs for convenient searching. Be sure to change the corresponding
* list below ($search_attributes_display)
*/
$this->default->search['attributes'] = array(
'desc'=>'Attributes to include in the drop down menu of the simple search form (comma separated)',
'default'=>array('uid','cn','gidNumber','objectClass','telephoneNumber','mail','street'));
//$search_attributes ...
/**
* You can re-arrange the order of the search criteria on the simple search form by modifying this array
* You cannot however change the names of the criteria. Criteria names will be translated at run-time.
*/
$this->default->search['criteria_options'] = array(
'desc'=>'Rearrange the order of the search criteria',
'default'=>array("equals","starts with","contains","ends with","sounds like"));
//$search_criteria_options ...
/**
* The list of attributes to display in each search result entry.
* Note that you can add * to the list to display all attributes
*/
$this->default->search['result_attributes'] = array(
'desc'=>'List of attributes to display in each search result entry',
'default'=>array('cn','sn','uid','postalAddress','telephoneNumber'));
//$search_result_attributes ...
}
function GetValue($key,$index) {
$value = null;
if (! isset($this->default->$key))
pla_error("A call was made to GetValue requesting [$key] that isnt predefined.");
else
$default = $this->default->$key;
if (! isset($default[$index]))
pla_error("Requesting a index [$index] that isnt predefined.");
else
$default = $default[$index];
if (isset($default['default']))
$value = $default['default'];
if (isset($this->custom->$key)) {
$custom = $this->custom->$key;
if (isset($custom[$index]))
$value = $custom[$index];
}
//print "Returning [$value] for key [$key], index [$index]<BR>";
return $value;
}
/**
* Function to check and warn about any unusual defined variables.
*/
function CheckCustom() {
if (isset($this->custom)) {
foreach ($this->custom as $masterkey => $masterdetails) {
if (isset($this->default->$masterkey)) {
if (! is_array($masterdetails))
pla_error("Error in configuration file, [$masterdetails] should be an ARRAY.");
foreach ($masterdetails as $key => $value) {
# Test that the key is correct.
if (! in_array($key,array_keys($this->default->$masterkey)))
pla_error("Error in configuration file, [$key] has not been defined as a PLA configurable variable.");
# Test if its should be an array or not.
if (is_array($this->default->{$masterkey}[$key]['default']) && ! is_array($value))
pla_error("Error in configuration file, {$masterkey}['$key'] SHOULD be an array of values.");
if (! is_array($this->default->{$masterkey}[$key]['default']) && is_array($value))
pla_error("Error in configuration file, {$masterkey}['$key'] should NOT be an array of values.");
}
} else {
pla_error("Error in configuration file, [$masterkey] has not been defined as a PLA MASTER configurable variable.");
}
}
}
}
}
# Define our configuration variable.
$config = new Config;
require (CONFDIR.'config.php');
?>

220
copy.php
View File

@@ -1,220 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/copy.php,v 1.35 2005/09/25 16:11:44 wurley Exp $
/**
* Copies a given object to create a new one.
*
* Vars that come in as POST vars
* - source_dn (rawurlencoded)
* - new_dn (form element)
* - server_id
*
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
$server_id_src = (isset($_POST['server_id']) ? $_POST['server_id'] : '');
$server_id_dst = (isset($_POST['dest_server_id']) ? $_POST['dest_server_id'] : '');
$ldapserver_src = $ldapservers->Instance($server_id_src);
$ldapserver_dst = $ldapservers->Instance($server_id_dst);
if ($ldapserver_dst->isReadOnly())
pla_error($lang['copy_server_read_only']);
if (! $ldapserver_src->haveAuthInfo() || ! $ldapserver_dst->haveAuthInfo())
pla_error($lang['not_enough_login_info']);
$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;
$encoded_dn = rawurlencode($dn_src);
include './header.php';
# Error checking
if (0 == strlen(trim($dn_dst)))
pla_error($lang['copy_dest_dn_blank']);
if (pla_compare_dns($dn_src,$dn_dst) == 0 && $server_id_src == $server_id_dst)
pla_error($lang['copy_source_dest_dn_same']);
if (dn_exists($ldapserver_dst,$dn_dst))
pla_error(sprintf($lang['copy_dest_already_exists'],pretty_print_dn($dn_dst)));
if (! dn_exists($ldapserver_dst,get_container($dn_dst)))
pla_error(sprintf($lang['copy_dest_container_does_not_exist'],pretty_print_dn(get_container($dn_dst))));
if ($do_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 '<body>';
printf('<h3 class="title">%s%s</h3>',$lang['copy_copying'],htmlspecialchars($dn_src));
printf('<h3 class="subtitle">%s</h3>',$lang['copy_recursive_copy_progress']);
print '<br /><br />';
print '<small>';
print $lang['copy_building_snapshot'];
flush();
$snapshot_tree = build_tree($ldapserver_src,$dn_src,array(),$filter);
printf('<span style="color:green">%s</span><br />',$lang['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);
print '</small>';
} else {
$copy_result = copy_dn($ldapserver_src,$ldapserver_dst,$dn_src,$dn_dst);
}
if ($copy_result) {
$edit_url = sprintf('edit.php?server_id=%s&dn=%s',$server_id_dst,rawurlencode($dn_dst));
$new_rdn = get_rdn($dn_dst);
$container = get_container($dn_dst);
if (array_key_exists('tree',$_SESSION)) {
# do we not have a tree and tree icons yet? Build a new ones.
initialize_session_tree();
$tree = $_SESSION['tree'];
$tree_icons = $_SESSION['tree_icons'];
if (isset($tree[$server_id_dst][$container])) {
$tree[$server_id_dst][$container][] = $dn_dst;
sort($tree[$server_id_dst][$container]);
$tree_icons[$server_id_dst][$dn_dst] = get_icon($ldapserver_dst,$dn_dst);
$_SESSION['tree'] = $tree;
$_SESSION['tree_icons'] = $tree_icons;
session_write_close();
}
}
?>
<center>
<?php printf('%s<a href="%s">%s</a>',$lang['copy_successful_like_to'],$edit_url,$lang['copy_view_new_entry']) ?>
</center>
<!-- refresh the tree view (with the new DN renamed)
and redirect to the edit_dn page -->
<script language="javascript">
parent.left_frame.location.reload();
</script>
</body>
</html>
<?php
if ($do_remove) {
sleep(2);
$delete_url = sprintf('delete_form.php?server_id=%s&dn=%s',$server_id_dst,rawurlencode($dn_src));
?>
<!-- redirect to the delete form -->
<script language="javascript">
parent.right_frame.location="<?php echo $delete_url; ?>"
</script>
<?php }
} else {
exit;
}
function r_copy_dn($ldapserver_src,$ldapserver_dst,$tree,$root_dn,$dn_dst) {
debug_log(sprintf('r_copy_dn: Entered with (%s,%s,%s,%s,%s)',
$ldapserver_src->server_id,$ldapserver_dst->server_id,serialize($tree),$root_dn,$dn_dst),2);
global $lang;
printf('<nobr>%s %s...',$lang['copy_copying'],htmlspecialchars($root_dn));
flush();
$copy_result = copy_dn($ldapserver_src,$ldapserver_dst,$root_dn,$dn_dst);
if (! $copy_result)
return false;
printf('<span style="color:green">%s</span></nobr><br />',$lang['success']);
flush();
$children = isset($tree[$root_dn]) ? $tree[$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,$tree,$child_dn,$new_dest_dn);
}
} else {
return true;
}
return true;
}
function copy_dn($ldapserver_src,$ldapserver_dst,$dn_src,$dn_dst) {
debug_log(sprintf('copy_dn: Entered with (%s,%s,%s,%s)',
$ldapserver_src->server_id,$ldapserver_dst->server_id,$dn_src,$dn_dst),2);
global $lang;
$new_entry = get_object_attrs($ldapserver_src,$dn_src);
# modify the prefix-value (ie "bob" in cn=bob) to match the destination DN's value.
$rdn_attr = substr($dn_dst,0,strpos($dn_dst,'='));
$rdn_value = get_rdn($dn_dst);
$rdn_value = substr($rdn_value,strpos($rdn_value,'=') + 1);
$new_entry[$rdn_attr] = $rdn_value;
# don't need a dn attribute in the new entry
unset($new_entry['dn']);
# Check the user-defined custom call back first
if (true === run_hook('pre_entry_create',
array ('server_id'=>$ldapserver_dst->server_id,'dn'=>$dn_dst,'attrs'=>$new_entry))) {
$add_result = @ldap_add($ldapserver_dst->connect(),$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));
print '</small><br /><br />';
pla_error($lang['copy_failed'] . $dn_dst,ldap_error($ldapserver_dst->connect()),ldap_errno($ldapserver_dst->connect()));
}
return $add_result;
} else {
return false;
}
}
/**
* @param object $ldapserver
* @param dn $dn
* @param array $tree
* @param string $filter
*/
function build_tree($ldapserver,$dn,$tree,$filter='(objectClass=*)') {
debug_log(sprintf('build_tree: Entered with (%s,%s,%s,%s)',
$ldapserver->server_id,$dn,serialize($tree),$filter),2);
$children = get_container_contents($ldapserver,$dn,0,$filter);
if (is_array($children) && count($children) > 0) {
$tree[$dn] = $children;
foreach ($children as $child_dn)
$tree = build_tree($ldapserver,$child_dn,$tree,$filter);
}
debug_log(sprintf('build_tree: Returning (%s)',serialize($tree)),1);
return $tree;
}
?>

View File

@@ -1,124 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/copy_form.php,v 1.24 2005/07/22 05:47:43 wurley Exp $
/**
* Copies a given object to create a new one.
*
* Variables that come in via common.php
* - server_id
* Variables that come in via GET variables
* - dn (rawurlencoded)
*
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
if ($ldapserver->isReadOnly())
pla_error($lang['no_updates_in_read_only_mode']);
if (! $ldapserver->haveAuthInfo())
pla_error($lang['not_enough_login_info']);
$dn = $_GET['dn'] ;
$encoded_dn = rawurlencode( $dn );
$rdn = get_rdn( $dn );
$container = get_container( $dn );
$attrs = get_object_attrs( $ldapserver, $dn );
$select_server_html = server_select_list($ldapserver->server_id,true,'dest_server_id');
$children = get_container_contents( $ldapserver, $dn );
include './header.php';
// Draw some javaScrpt to enable/disable the filter field if this may be a recursive copy
if( is_array( $children ) && count( $children ) > 0 ) { ?>
<script language="javascript">
//<!--
function toggle_disable_filter_field( recursive_checkbox )
{
if( recursive_checkbox.checked ) {
recursive_checkbox.form.remove.disabled = false;
recursive_checkbox.form.filter.disabled = false;
} else {
recursive_checkbox.form.remove.disabled = true;
recursive_checkbox.form.remove.checked = false;
recursive_checkbox.form.filter.disabled = true;
}
}
//-->
</script>
<?php } ?>
<body>
<h3 class="title"><?php echo $lang['copyf_title_copy'] . $rdn; ?></h3>
<h3 class="subtitle"><?php echo $lang['server']; ?>: <b><?php echo $ldapserver->name; ?></b> &nbsp;&nbsp;&nbsp; <?php echo $lang['distinguished_name']?>: <b><?php echo $dn; ?></b></h3>
<center>
<?php echo $lang['copyf_title_copy'] ?><b><?php echo htmlspecialchars( $rdn ); ?></b> <?php echo $lang['copyf_to_new_object']?>:<br />
<br />
<form action="copy.php" method="post" name="copy_form">
<input type="hidden" name="old_dn" value="<?php echo $dn; ?>" />
<input type="hidden" name="server_id" value="<?php echo $ldapserver->server_id; ?>" />
<table style="border-spacing: 10px">
<tr>
<td><acronym title="<?php echo $lang['copyf_dest_dn_tooltip']; ?>"><?php echo $lang['copyf_dest_dn']?></acronym>:</td>
<td>
<input type="text" name="new_dn" size="45" value="<?php echo htmlspecialchars( $dn ); ?>" />
<?php draw_chooser_link( 'copy_form.new_dn', 'true', $rdn ); ?></td>
</td>
</tr>
<tr>
<td><?php echo $lang['copyf_dest_server']?>:</td>
<td><?php echo $select_server_html; ?></td>
</tr>
<?php if( is_array( $children ) && count( $children ) > 0 ) { ?>
<tr>
<td><label for="recursive"><?php echo $lang['recursive_copy']; ?></label>:</td>
<td><input type="checkbox" id="recursive" name="recursive" onClick="toggle_disable_filter_field(this)" />
<small>(<?php echo $lang['copyf_recursive_copy']?>)</small></td>
</tr>
<tr>
<td><acronym title="<?php echo $lang['filter_tooltip']; ?>"><?php echo $lang['filter']; ?></acronym>:</td>
<td><input type="text" name="filter" value="(objectClass=*)" size="45" disabled />
</tr>
<tr>
<td><?php echo $lang['delete_after_copy']; ?></td>
<td><input type="checkbox" name="remove" value="yes"/ disabled>
<small>(<?php echo $lang['delete_after_copy_warn']; ?>)</small)</td>
</tr>
<?php } else { ?>
<tr>
<td><?php echo $lang['delete_after_copy']; ?></td>
<td><input type="checkbox" name="remove" value="yes"/></td>
</tr>
<?php } ?>
<tr>
<td colspan="2" align="right"><input type="submit" value="<?php echo $lang['copyf_title_copy']; ?>" /></td>
</tr>
</table>
</form>
<script language="javascript">
//<!--
/* If the user uses the back button, this way we draw the filter field properly. */
toggle_disable_filter_field( document.copy_form.recursive );
//-->
</script>
<?php if ($config->GetValue('appearance','show_hints')) {?>
<small><img src="images/light.png" /><span class="hint"><?php echo $lang['copyf_note']?></span></small>
<?php } ?>
</center>
</body>
</html>

View File

@@ -1,190 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/create.php,v 1.43 2005/09/25 16:11:44 wurley Exp $
/**
* Creates a new object.
*
* Variables that come in via common.php
* - server_id
* Variables that come in as POST vars:
* - new_dn
* - attrs (an array of attributes)
* - vals (an array of values for the above attrs)
* - required_attrs (an array with indices being the attributes,
* and the values being their respective values)
* - object_classes (rawurlencoded, and serialized array of objectClasses)
*
* @package phpLDAPadmin
*/
/**
* @todo: posixgroup with empty memberlist generates an error.
*/
require './common.php';
if ($ldapserver->isReadOnly())
pla_error($lang['no_updates_in_read_only_mode']);
if (! $ldapserver->haveAuthInfo())
pla_error($lang['not_enough_login_info']);
$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;
$encoded_dn = rawurlencode( $new_dn );
$container = get_container( $new_dn );
// 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->GetTemplate($_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( $lang['create_required_attribute'], htmlspecialchars( $attr ) ) );
$new_entry[ $attr ][] = $val;
}
}
if( isset( $attrs ) && is_array( $attrs ) ) {
foreach( $attrs as $i => $attr ) {
if( is_attr_binary( $ldapserver, $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;
}
} else {
if (is_array($vals[$i])) {
# If the array has blank entries, then ignore them.
foreach ($vals[$i] as $value) {
# $new_entry[$attr] = $vals[$i];
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'] ) )
$new_entry['objectClass'][] = 'top';
foreach( $new_entry as $attr => $vals ) {
// Check to see if this is a unique Attribute
if( $badattr = checkUniqueAttr( $ldapserver, $new_dn, $attr, $vals ) ) {
$search_href = sprintf('search.php?search=true&amp;form=advanced&amp;server_id=%s&amp;filter=%s=%s',
$ldapserver->server_id,$attr,$badattr);
pla_error(sprintf( $lang['unique_attr_failed'],$attr,$badattr,$new_dn,$search_href ) );
}
if( ! is_attr_binary( $ldapserver, $attr ) )
if( is_array( $vals ) )
foreach( $vals as $i => $v )
$new_entry[ $attr ][ $i ] = $v;
else
$new_entry[ $attr ] = $vals;
}
//echo "<pre>"; var_dump( $new_dn );print_r( $new_entry ); echo "</pre>";
// Check the user-defined custom call back first
if( true === run_hook ( 'pre_entry_create', array ( 'server_id' => $ldapserver->server_id,'dn' => $new_dn,'attrs' => $new_entry ) ) )
$add_result = @ldap_add( $ldapserver->connect(), $new_dn, $new_entry );
else {
pla_error( $lang['create_could_not_add'] );
exit;
}
if( $add_result ) {
run_hook ( 'post_entry_create', array ( 'server_id' => $ldapserver->server_id, 'dn' => $new_dn, 'attrs' => $new_entry ) );
if ($redirect)
$redirect_url = $redirect;
else
$redirect_url = sprintf('edit.php?server_id=%s&dn=%s',$ldapserver->server_id,rawurlencode($new_dn));
if( array_key_exists( 'tree', $_SESSION ) ) {
$tree = $_SESSION['tree'];
$tree_icons = $_SESSION['tree_icons'];
if( isset( $tree[$ldapserver->server_id][$container] ) ) {
$tree[$ldapserver->server_id][$container][] = $new_dn;
sort( $tree[$ldapserver->server_id][$container] );
$tree_icons[$ldapserver->server_id][$new_dn] = get_icon( $ldapserver, $new_dn );
}
$_SESSION['tree'] = $tree;
$_SESSION['tree_icons'] = $tree_icons;
session_write_close();
}
?>
<html>
<head>
<?php if (isset($tree[$ldapserver->server_id][$container]) || in_array($new_dn,$ldapserver->getBaseDN())) { ?>
<!-- refresh the tree view (with the new DN renamed)
and redirect to the edit_dn page -->
<script language="javascript">
parent.left_frame.location.reload();
location.href='<?php echo $redirect_url; ?>';
</script>
<?php } ?>
<meta http-equiv="refresh" content="0; url=<?php echo $redirect_url; ?>" />
</head>
<body>
<?php echo $lang['redirecting'] ?> <a href="<?php echo $redirect_url; ?>"><?php echo $lang['here']?></a>.
</body>
</html>
<?php } else {
pla_error( $lang['create_could_not_add'], ldap_error( $ldapserver->connect() ), ldap_errno( $ldapserver->connect() ) );
}
?>

View File

@@ -1,175 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/create_form.php,v 1.30 2005/09/25 16:11:44 wurley Exp $
/**
* The menu where the user chooses an RDN, Container, and Template for creating a new entry.
* After submitting this form, the user is taken to their chosen Template handler.
*
* Variables that come in via common.php
* - server_id
* Variables that come in as GET vars
* - container (rawurlencoded) (optional)
*
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
require TMPLDIR.'template_config.php';
if( $ldapserver->isReadOnly() )
pla_error( $lang['no_updates_in_read_only_mode'] );
if( ! $ldapserver->haveAuthInfo())
pla_error( $lang['not_enough_login_info'] );
$step = isset( $_REQUEST['step'] ) ? $_REQUEST['step'] : 1; // defaults to 1
$container = $_REQUEST['container'];
$server_menu_html = server_select_list($ldapserver->server_id,true);
include './header.php'; ?>
<body>
<h3 class="title"><?php echo $lang['createf_create_object']?></h3>
<h3 class="subtitle"><?php echo $lang['createf_choose_temp']?></h3>
<center><h3><?php echo $lang['createf_select_temp']?></h3></center>
<form action="creation_template.php" method="post">
<input type="hidden" name="container" value="<?php echo htmlspecialchars( $container ); ?>" />
<table class="create">
<tr>
<td class="heading"><?php echo $lang['server']; ?>:</td>
<td><?php echo $server_menu_html; ?></td>
</tr>
<tr>
<td class="heading"><?php echo $lang['template']; ?>:</td>
<td>
<table class="template_display">
<tr>
<td>
<table class="templates">
<?php
$i = -1;
if ($config->GetValue('template_engine','enable')) {
$template_xml = new Templates($ldapserver->server_id);
if ($config->GetValue('template_engine','disable_old'))
$templates = $template_xml->_template;
else
$templates = array_merge($template_xml->_template,$templates);
}
# 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 "</table></td><td><table class=\"templates\">";
# 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;
} ?>
</td>
</tr>
<tr>
<?php
if (isset($template['invalid']) && $template['invalid'] || (isset($template['handler']) && ! file_exists(TMPLDIR.'creation/'.$template['handler']))) {
?>
<td class="icon">
<img src="images/error.png" />
</td>
<?php
} else {
?>
<td>
<input type="radio" name="template" value="<?php echo htmlspecialchars($name);?>"
id="<?php echo htmlspecialchars($name); ?>"
<?php
if( 0 == strcasecmp( 'Custom', $name ) ) echo ' checked';
if( ! $isValid ) echo ' disabled';
?> />
</td>
<?php
}
?>
<td class="icon">
<label for="<?php echo htmlspecialchars($name);?>">
<img src="<?php echo $template['icon']; ?>" />
</label>
</td>
<td>
<label for="<?php echo htmlspecialchars($name);?>">
<?php if( 0 == strcasecmp( 'Custom', $template['desc'] ) ) echo '<b>';
if( ! $isValid )
if (isset($template['invalid']) && $template['invalid'])
printf('<span style="color: gray"><acronym title="%s">',$lang['template_invalid']);
else
printf('<span style="color: gray"><acronym title="%s">',$lang['template_restricted']);
echo htmlspecialchars( $template['desc'] );
if( ! $isValid ) echo "</acronym></span>";
if( 0 == strcasecmp( 'Custom', $template['desc'] ) ) echo '</b>'; ?>
</label>
</td>
</tr>
<?php } // end foreach ?>
</table>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan="2"><center><input type="submit" name="submit" value="<?php echo $lang['proceed_gt']?>" /></center></td>
</tr>
</table>
</form>
</body>
</html>

View File

@@ -1,71 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/creation_template.php,v 1.29 2005/09/25 16:11:44 wurley Exp $
/**
* This file simply acts as a plugin grabber for the creator templates in
* the directory templates/creation/
*
* Variables that come in via common.php
* server_id
* Expected POST vars:
* template
*
* @package phpLDAPadmin
* @deprecated This file is no longer need when the template engine is up and running.
*/
/**
*/
require './common.php';
if ($config->GetValue('template_engine','enable') && (! is_numeric($_REQUEST['template']))) {
require './template_engine.php';
die();
}
require TMPLDIR.'template_config.php';
if ($ldapserver->isReadOnly())
pla_error($lang['no_updates_in_read_only_mode']);
if (! $ldapserver->haveAuthInfo())
pla_error($lang['not_enough_login_info']);
$template = (isset($_REQUEST['template']) ? $_REQUEST['template'] : null);
! is_null($template) or pla_error($lang['ctemplate_no_template']);
if ($template == 'custom') {
foreach ($templates as $id => $template) {
if ($template['handler'] == 'custom.php') {
$template = $id;
break;
}
}
}
isset($templates[$template]) or pla_error(sprintf($lang['invalid_template'], htmlspecialchars($template)));
$template_id = $template;
$template = isset($templates[$template]) ? $templates[$template_id] : null;
if (! array_key_exists('no_header',$template)) {
include './header.php';
?>
<body>
<h3 class="title"><?php echo $lang['createf_create_object']?></h3>
<h3 class="subtitle"><?php echo $lang['ctemplate_on_server']?> '<?php echo htmlspecialchars($ldapserver->name); ?>', <?php echo $lang['using_template']?> '<?php echo htmlspecialchars($template['desc']); ?>'</h3>
<?php }
$handler = TMPLDIR.'creation/' . $template['handler'];
if (! file_exists($handler))
pla_error(sprintf($lang['template_does_not_exist'],htmlspecialchars($template['handler'])));
if (! is_readable($handler))
pla_error(sprintf($lang['template_not_readable'],htmlspecialchars($template['handler'])));
include $handler;
if (! array_key_exists('no_header',$template))
echo "</body>\n</html>";
?>

View File

@@ -1,200 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/custom_functions.php,v 1.8 2005/03/05 06:27:06 wurley Exp $
/**
* CUSTOM_FUCTIONS has been DEPRECIATED, please use the hooks functions now.
* Let the phpLDAPadmin developers know if you REALLY need this - it will be removed
* in future releases.
*
* custom_functions.php:
*
* This file is full of functions (callbacks really) that are
* meant to be filled in by users of phpLDAPadmin (you). These functions
* are called as the result of a phpLDAPadmin event, like adding
* a new entry, deleting an entry, changing an attribute value, etc.
* Consider this concept an attempt to provide something like SQL
* triggers for LDAP users.
*
* This can be very handy, for example, for system administrators
* who want to execute custom code after a user is created or deleted.
*
* These functions generally have 2 parameters, $server_id and $dn:
*
* 1. $server_id.
* The $server_id can be used to connect to the server using
* pla_ldap_connect( $server_id ) to fetch additional information about
* the entry being deleted. It can also be used to call
* get_object_attrs( $server_id, $dn ) to fetch the entry's attributes.
*
* 2. $dn
* The dn is provided so users can determine where in the LDAP tree
* this entry resides and act accordingly. For example, if the DN
* contains "ou=development", you may want to act differently than
* if it contains "ou=accounting".
*
* Types of callback functions:
*
* These callbacks generally fall into two categories: "pre" and "post",
* "pre" callbacks run before an event has occurred and their return
* value (true or false) is used to decide whether to allow the event
* to proceed. "post" callbacks run after an event has occurred and
* their return value (void) is ignored.
*
* NOTE: These custom callbacks are NOT executed for LDIF imports.
*
* ALSO NOTE: These callbacks are responsible for printing out error
* messages. The calling code will die silently without notifying
* the user why. YOU are responsible for creating output here.
*
* TODO: This section outlines events that phpLDAPadmin does not yet
* support. This list includes:
* - ldap_mod_add (ie, adding a new value to a multi-valued attribute)
* - ldap_mod_del (ie, deleting a value from a multi-valued attribute
* or deleting an attribute from an entry)
* - ldap_rename (ie, renaming an entry's RDN)
*
* DONE: This section lists events that phpLDAPadmin *does* support.
* This list includes:
* - ldap_add (ie, creating new entries)
* - ldap_delete (ie, removing entries)
* - ldap_modify (ie, changing the value of an attribute, for both
* multi- and single-valued attributes)
* @deprecated
* @see hooks.php
* @package phpLDAPadmin
*/
/*
* This function is executed before modifying an entry's
* attribute. Unlike preAttrModify, this function's
* return value is ignored. In addition to the standard
* $server_id and $dn paramaters, this function also
* gives you the attribute name ($attr_name), and the new
* value that the attribute will have ($new_value). $new_value
* may be a string or an array of strings.
*/
function postAttrModify( $server_id, $dn, $attr_name, $new_value )
{
// Fill me in
//
// A very simple (and lame) example:
// if( 0 == strcasecmp( $attr_name, "userPassword" ) ) {
// mail( "user@example.com", "Password change notification",
// "User '$dn' has changed their password." );
// }
}
/*
* This function is executed before modifying an entry's
* attribute. If it returns true, the entry is modified.
* If it returns false, the entry is not modified.
* In addition to the standard $server_id and $dn params,
* this function also gives you the attribute name ($attr_name)
* and the new value that the attribute will have ($new_value).
* $new_value may be a string or an array of strings.
* @deprecated
*/
function preAttrModify( $server_id, $dn, $attr_name, $new_value )
{
// Fill me in
return true;
}
/*
* This function is executed before adding an entry's
* attribute. If it returns true, the entry is added.
* If it returns false, the entry is not added.
* In addition to the standard $server_id and $dn params,
* this function also gives you the attribute name ($attr_name)
* and the new value that the attribute will have ($new_value).
* $new_value may be a string or an array of strings.
* @deprecated
*/
function preAttrAdd( $server_id, $dn, $attr_name, $new_value )
{
// Fill me in
return true;
}
/*
* This function is executed after an entry is created.
* Unlike preEntryCreate(), this function's return
* value is ignored. This is very handy for executing
* custom code after creating a user account. For example,
* one may wish to create the user's home directory.
* See the documentation for preEntryCreate() below for
* the description of the $attrs parameter.
* @deprecated
*/
function postEntryCreate( $server_id, $dn, $attrs )
{
// Fill me in
//
// A very simple example:
// if( preg_match( "/^uid=(\w+),/", $dn, $user_name ) ) {
// $user_name = $user_name[1];
// mkdir( "/home/$user_name" );
// } else {
// // not a user account
// }
}
/*
* This function is executed before an entry is created.
* If it returns true, the entry is created, if false is
* returned, the entry is not created. This function has
* the additional parameters, $attrs, which is an assoc-
* iative array of attribute/vale pairs of the same form
* expected by ldap_add(), example:
*
* Array (
* [objectClass] => Array (
* [0] => top
* [1] => person
* [2] => inetOrgPerson
* )
* [cn] => John
* [sn] => Doe
* ...
* )
*
* @deprecated
*/
function preEntryCreate( $server_id, $dn, $attrs )
{
// Fill me in
return true;
}
/*
* This function is executed before an entry is deleted.
* If it returns true, the entry is deleted, if false
* is returned, the entry is not deleted.
* @deprecated
*/
function preEntryDelete( $server_id, $dn )
{
// Fill me in
return true;
}
/*
* This function is executed after an entry is deleted.
* Unlike preEntryDelete(), this function's return
* value is ignored.
* @deprecated
*/
function postEntryDelete( $server_id, $dn )
{
// Fill me in
}
/**
* This function is called, after a new session is initilaized
* @deprecated
*/
function postSessionInit()
{
// Fill me in
}
?>

View File

@@ -1,81 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/delete.php,v 1.23 2005/09/25 16:11:44 wurley Exp $
/**
* Deletes a DN and presents a "job's done" message.
*
* Variables that come in via common.php
* - server_id
* Variables that come in as POST vars:
* - dn (rawurlencoded)
*
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
if ($ldapserver->isReadOnly())
pla_error($lang['no_updates_in_read_only_mode']);
if (! $ldapserver->haveAuthInfo())
pla_error($lang['not_enough_login_info']);
$dn = $_POST['dn'];
$encoded_dn = rawurlencode($dn);
if (is_null($dn))
pla_error($lang['you_must_specify_a_dn']);
dn_exists($ldapserver,$dn) or pla_error(sprintf($lang['no_such_entry'], '<b>' . pretty_print_dn($dn) . '</b>'));
// Check the user-defined custom callback first.
if (run_hook('pre_entry_delete',array('server_id' => $ldapserver->server_id,'dn' => $dn)))
$del_result = @ldap_delete($ldapserver->connect(), $dn);
else
pla_error(sprintf($lang['could_not_delete_entry'],'<b>'.pretty_print_dn($dn).'</b>'));
if ($del_result) {
# Custom callback
run_hook('post_entry_delete',array('server_id' => $ldapserver->server_id,'dn' => $dn));
# kill the DN from the tree browser session variable and
# refresh the tree viewer frame (left_frame)
if (array_key_exists('tree', $_SESSION)) {
$tree = $_SESSION['tree'];
if (isset($tree[$ldapserver->server_id]) && is_array($tree[$ldapserver->server_id])) {
# does it have children? (it shouldn't, but hey, you never know)
if (isset($tree[$ldapserver->server_id][$dn]))
unset($tree[$ldapserver->server_id][$dn]);
# search and destroy
foreach ($tree[$ldapserver->server_id] as $tree_dn => $subtree)
foreach ($subtree as $key => $sub_tree_dn)
if (0 == strcasecmp($sub_tree_dn, $dn))
unset($tree[$ldapserver->server_id][$tree_dn][$key]);
$_SESSION['tree'] = $tree;
}
session_write_close();
}
include './header.php'; ?>
<script language="javascript">
parent.left_frame.location.reload();
</script>
<br />
<br />
<center><?php echo sprintf($lang['entry_deleted_successfully'],'<b>'.pretty_print_dn($dn).'</b>'); ?></center>
<?php
} else {
pla_error(sprintf($lang['could_not_delete_entry'], '<b>' . pretty_print_dn($dn) . '</b>'),
ldap_error($ldapserver->connect()), ldap_errno($ldapserver->connect()));
}
?>

View File

@@ -1,54 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/delete_attr.php,v 1.13 2005/09/17 20:04:29 wurley Exp $
/**
* Deletes an attribute from an entry with NO confirmation.
*
* Variables that come in via common.php
* - server_id
*
* On success, redirect to edit.php
* On failure, echo an error.
*
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
if ($ldapserver->isReadOnly())
pla_error($lang['no_updates_in_read_only_mode']);
if (! $ldapserver->haveAuthInfo())
pla_error($lang['not_enough_login_info']);
$dn = isset($_POST['dn']) ? $_POST['dn'] : null;
$attr = isset($_POST['attr']) ? $_POST['attr'] : null;
if (! $dn)
pla_error($lang['no_dn_specified']);
if (! $attr)
pla_error($lang['no_attr_specified']);
$encoded_dn = rawurlencode($dn);
if (is_attr_read_only($ldapserver,$attr))
pla_error(sprintf($lang['attr_is_read_only'],htmlspecialchars($attr)));
$update_array = array();
$update_array[$attr] = array();
$res = @ldap_modify($ldapserver->connect(),$dn,$update_array);
if ($res) {
$redirect_url = sprintf("edit.php?server_id=%s&dn=%s",$ldapserver->server_id,$encoded_dn);
foreach($update_array as $attr => $junk)
$redirect_url .= "&modified_attrs[]=$attr";
header("Location: $redirect_url");
} else {
pla_error($lang['could_not_perform_ldap_modify'],ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect()));
}
?>

View File

@@ -1,153 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/delete_form.php,v 1.20 2005/07/22 05:47:44 wurley Exp $
/**
* delete_form.php
* Displays a last chance confirmation form to delete a dn.
*
* Variables that come in via common.php
* - server_id
* Variables that come in as GET vars:
* - dn (rawurlencoded)
*
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
if ($ldapserver->isReadOnly())
pla_error($lang['no_updates_in_read_only_mode']);
if (! $ldapserver->haveAuthInfo())
pla_error($lang['not_enough_login_info']);
$dn = $_GET['dn'];
$encoded_dn = rawurlencode( $dn );
$rdn = pla_explode_dn( $dn );
$rdn = $rdn[0];
$children = get_container_contents( $ldapserver,$dn,0,'(objectClass=*)',LDAP_DEREF_NEVER );
$has_children = count($children) > 0 ? true : false;
include './header.php'; ?>
<body>
<h3 class="title"><?php echo sprintf( $lang['delete_dn'], htmlspecialchars( $rdn ) ); ?></b></h3>
<h3 class="subtitle"><?php echo $lang['server']; ?>: <b><?php echo $ldapserver->name; ?></b> &nbsp;&nbsp;&nbsp; <?php echo $lang['distinguished_name']; ?>: <b><?php echo htmlspecialchars( ( $dn ) ); ?></b></h3>
<?php if( $has_children ) { ?>
<center><b><?php echo $lang['permanently_delete_children']; ?></b><br /><br />
<?php
flush();
# get the total number of child objects (whole sub-tree)
$s = pla_ldap_search( $ldapserver, 'objectClass=*', $dn, array('dn'), 'sub' );
$sub_tree_count = count( $s );
?>
<table class="delete_confirm">
<tr>
<td>
<p>
<?php echo sprintf( $lang['entry_is_root_sub_tree'], $sub_tree_count ); ?>
<small>(<a href="search.php?search=true&amp;server_id=<?php echo $ldapserver->server_id; ?>&amp;filter=<?php echo rawurlencode('objectClass=*'); ?>&amp;base_dn=<?php echo $encoded_dn; ?>&amp;form=advanced&amp;scope=sub"><?php echo $lang['view_entries']; ?></a>)</small>
<br />
<br />
<?php echo sprintf( $lang['confirm_recursive_delete'], ($sub_tree_count-1) ); ?><br />
<br />
<small><?php echo $lang['confirm_recursive_delete_note']; ?></small>
<br />
<br />
<table width="100%">
<tr>
<td>
<center>
<form action="rdelete.php" method="post">
<input type="hidden" name="dn" value="<?php echo $dn; ?>" />
<input type="hidden" name="server_id" value="<?php echo $ldapserver->server_id; ?>" />
<input type="submit" class="scary" value="<?php echo sprintf( $lang['delete_all_x_objects'], $sub_tree_count ); ?>" />
</form>
</center>
</td>
<td>
<center>
<form action="edit.php" method="get">
<input type="hidden" name="dn" value="<?php echo htmlspecialchars($dn); ?>" />
<input type="hidden" name="server_id" value="<?php echo $ldapserver->server_id; ?>" />
<input type="submit" name="submit" value="<?php echo $lang['cancel']; ?>" class="cancel" />
</form>
</center>
</td>
</tr>
</table>
</td>
</tr>
</table>
<?php flush(); ?>
<br />
<br />
<?php echo $lang['list_of_entries_to_be_deleted']; ?><br />
<select size="<?php echo min( 10, $sub_tree_count );?>" multiple disabled style="background:white; color:black;width:500px" >
<?php $i=0;
foreach( $s as $dn => $junk ) {
$i++; ?>
<option><?php echo $i; ?>. <?php echo htmlspecialchars( ( $dn ) ); ?></option>
<?php } ?>
</select>
<br />
<?php } else { ?>
<center>
<table class="delete_confirm">
<tr>
<td>
<?php echo $lang['sure_permanent_delete_object']; ?><br />
<br />
<nobr><acronym title="<?php echo $lang['distinguished_name']; ?>"><?php echo $lang['dn']; ?></acronym>: <b><?php echo pretty_print_dn( $dn ); ?></b><nobr><br />
<nobr><?php echo $lang['server']; ?>: <b><?php echo htmlspecialchars($ldapserver->name); ?></b></nobr><br />
<br />
<table width="100%">
<tr>
<td>
<center>
<form action="delete.php" method="post">
<input type="hidden" name="dn" value="<?php echo htmlspecialchars($dn); ?>" />
<input type="hidden" name="server_id" value="<?php echo $ldapserver->server_id; ?>" />
<input type="submit" name="submit" value="<?php echo $lang['delete']; ?>" class="scary" />
</form>
</center>
</td>
<td>
<center>
<form action="edit.php" method="get">
<input type="hidden" name="dn" value="<?php echo $dn; ?>" />
<input type="hidden" name="server_id" value="<?php echo $ldapserver->server_id; ?>" />
<input type="submit" name="submit" value="<?php echo $lang['cancel']; ?>" class="cancel" />
</form>
</center>
</td>
</tr>
</table>
</td>
</tr>
</table>
</center>
<?php } ?>
</body>
</html>

View File

@@ -1,59 +0,0 @@
* Project Creator:
- David Smith
* Project Developers:
- Deon George Maintainer
- Xavier Renard Import/Export and Samba
- Uwe Ebel I18n
* Patch writers:
- Bayu Irawan userPassword hash, html fixes, ldap_modify fixes
- Uwe Ebel short_open_tags fix
- Andrew Tipton SUP support in schema parser
- Eigil Bjørgum UTF-8 support
- Brandon Lederer DNS entry template
Nathan Rotschafer
- Steve Rigler Password hash patch
- Chris Jackson Blowfish and md5crypt passwords
- Marius Rieder Perfected schema parser
- Nick Burch realpath() fixes for *BSD
- Matt Perlman Fix for IBM LDAP schema support
- K Yoder Predefined searches
- Piotr Tarnowski i18n fixes
- Deon George Auto-uidNumber enhancements and many fixes
- Pierre Belanger Speed-ups to auto-uidNumber
- Benjamin Drieu Syslog, Hooks and other fixes
- Samuel Tran User login restriction
- Daniel van Eeden Unicode, CSS fixes
- Piotr Tarnowski More locatisation fixes
- Tomas Kuliavas Improved password encoding functions
- Alessandro De Zorzi Enhancement with the new template engine and others
- Matt Harrington Fixes
- Jonathan Thurman Add Multiple objectClasses
- And many others, whose names are lost in the changelog. Thank you.
* Translators:
- Marius Reider, German
Uwe Ebel,
Dieter Kluenter
- Xavier Renard French
- Dave Smith English ;)
- Richard Lucassen Dutch
- Andreu Sanchez Spanish and Català
- Dmitry Gorpinenko, Russian
Aleksey Soldatov
Sergey Saukh
- Unknown Italian, Tain, Simplified Chinese
- Alexandre Maciel Portuguese (Brasilian)
Elton Schroeder Fenner (CLeGi)
- Piotr Tarnowski (DrFugazi) Polish
- Gunnar Nystrom Swedish
- VOROSBARANYI Zoltan, Hungarian
SIPOS Agnes
- Tadashi Jokagi (elf2000) Japanese
If you can help translate, please join the phpldapadmin-devel mailing list:
https://lists.sourceforge.net/mailman/listinfo/phpldapadmin-devel

View File

@@ -1,418 +0,0 @@
* Version 0.9.7, 2005-09-11
* Summary:
- Now fully supporting PHP5 - this will be the last version developed on PHP4.
- Revamped how you configure PLA - now using a config object and some checking,
- Revamped how you define LDAP servers - extending the LDAPServer object and adding some checking.
- Fixed all functions so that they now use the LDAPServer object.
- Introduced the template engine and configuration by XML files. (The old templates are still in this
version, unchanged from 0.9.6. They will be removed after this version is released.)
- Changed dependancy checking to just index.php, so that common.php executes faster.
- Minor improvements to compare.php
- Much improved debug logging
- Much improved caching
- Improved LDAP server info display
- Some code readability cleanup
- Add other fixes as per the ChangeLog (ChangeLogCVS.txt).
Thank you for everybody who has submitted fixes/enhancements/recommendations and feedback for this version.
* Version 0.9.6, 2005-04-03
* Summary:
The main goals for this version was to close all the outstanding bugs and apply all the submitted patchs
on sourceforge. All the sourceforge easy to do RFE's where also included.
* Notes:
- Added support for mulpiple Base DN's
- Added support to log for syslog (Benjamin Drieu)
- Added hooks feature to replace custom functions (Benjamin Drieu)
- Entry chooser now auto adds rdn entry for copy/move operations (wigi2)
- Initial support for AD Schema Retrieval
- Added login restriction (Samuel Tran)
- Added support to move objects (aka Copy then Delete) (wigi2)
- No longer show + next to objects that have no children in tree viewer (when hide_configuration_management=true)
- Added date evaluation to shadow attributes (shadowAccount)
- Added Enhancement to show attributes in a specifc order (Samuel Tran)
- Added Server Info OID descriptions
- Added new feature to compare two DNs
- Binary SID to text SID feature for MSAD objectSid entries.
- Added session timeout feature (Samuel Tran)
* New Languages:
- Taiwan (Anonymous)
- Simplfied Chinese (Anonymous)
* Changes:
- LDAP server configuration is being moved into an Object LDAPServer, all future interactions should
use this object class from now on.
- Some more conversions of english static text into language files.
- Some code cleanup, excess whitespace removal, etc...
- Tags for phpdoc updated.
- Added cvs header to files missing the header.
- LDIF Import function improvements (Xavier Renard)
- UniqueAttrs fix, now showing actual value (in multi value attribs) that breaches uniqueness
- Fixed check_lang_files when register_globals=off
- css fixes (Daniel van Eeden)
- More locatisation fixes (Piotr Tarnowski)
- Schema functions all use cached entries now by default
- Improved password encoding functions (Tomas Kuliavas)
- If auth_type = session, then dn and password is also blowfish encrypted
- Prettied up the icon index (Dave Smith)
- Make the rdn not editable in the default template.
* Fixes:
- password_check when magic_quotes_gpc is on.
- Misc fixes (Benjamin Drieu)
- Fix searchs when searching for values with brackets
- Unicode fixes (Daniel van Eeden)
- View jpeg photo minor security fix (Dave Smith)
- Check password link missing in read-only mode
* Sourceforge bug fixes:
1117099 1117316 1120048 1150947 1152962 1153360 1055401 1158148 1161425
* Version 0.9.5, 2004-12-17
* Notes:
This version adds substantial new features and several minor bug fixes as well as PHP5 support!
* Changes:
- Added PHP5 support using Zend1 compatibility options.
- Users can now specify a format string for custom display of DNs in the tree viewer
(see $tree_display_format in config.php.example)
- If using http auth_type, DNs and passwords are now encrypted int he cookie using blowfish.
- If base entry is missing, phpLDAPadmin will prompt you to create it and give you some
sane default values to get started.
- Added index file for viewing of all PLA icons (see phpldapadmin/images/index.php)
- Added custom country flag icons for DNs in the form "c=us"
- Added more custom icons (ipNetwork, Device, Room)
- Made it easier to create the base entry of an empty tree.
- Fixed bug related to predefined search queries with patch from Olivier Mounier
- Added a template for mozillaOrgPerson
- Improved error handling for non-existent or unreadable template files.
- "Create new" now displays at the top *and* bottom of the tree viewer list if there are
more than 10 entries in the container (make it easier for users by reducing scrolling)
- Optimized several pages by closing the session early if not needed.
- By request, reversed the order of first name / last name in the inetOrgPerson template.
- Added a login_string feature for admins who have all their users in a single container,
so they can specify a string like "uid=<username>,ou=People,dc=example,dc=com" instead
of setting up the painful login_attr stuff.
- Changed the delete button to be red (like phpMyAdmin) to make it more obvious.
- Consolidated the links at the top of the tree viewer to make better use of real estate.
- New logo!
- Patch from Dimitre to fix unique attrs enforcement.
- Templates can now redirect wherever they want using a hidden form input.
- Added a "Home" button in the tree viewer to get back to the main PLA page if desired.
- PLA now looks up the gidNumber to display group description and name in user accounst.
- Improved the hint about structural objectClasses in the custom creation template
- Added ability to purge caches (mostly just schema objects) and caches are auto-purged
when the schema is viewed in the schema browser.
- Changed the arrow icon next to objectClass values to be an information button.
- Search results can be displayed in table format now.
- Fixes to LDIF import.
- Added support for exporting to VCard 2.1 format.
- Lots of little session fixes.
- Structural objectClasses are now shown in bold in the custom creation template.
- Fixed lots of bugs, some big some minor:
1025353 1037715 1029103 1026427 1025353 1020606
1020376 1010576 1009410 1007281 1007132 1004042
1002794 1001941 1000185 999605 999170 996842
995362 995297 995296 994343 993875 992419
991891 989219 984587 983375 981283 979395
977598 974369 973520 973323 965165 964410
962074 959950 958372 957284 954453
* Version 0.9.4b, 2004-05-11
* Notes:
This follow-on release fixes one critical bug contained in 0.9.4
relating to session.auto_start and schema caching.
* Changes
- Fixed bugs (all duplicates of single bug):
947981
951003
951140
- Fixed binary attribute creation (create.php)
* Version 0.9.4a, 2004-05-08
* Notes:
This follow-on release fixes several critical bugs contained in 0.9.4.
* Changes:
- Fixed bugs:
949500 Error while adding New User Account
949500 Creating a new uid under ou=People
948695 is_executable() error using phpldapadmin - windows
948741 Level: E_WARNING
948413 Undefined variable: lang (E_NOTICE) after install
* Version 0.9.4, 2004-05-04
* Notes:
This release adds many new features and fixes many minor bugs.
General performance has improved, especially for handling large data
sets. Of particular note is that users can page through search results,
flag individual attributes as read-only, view in-line jpegPhotos in
search results, export DSML, all from the comfort of their own language.
phpLDAPadmin is now availble in 11 languages.
* Changes:
- Fixed bug 936223 by adding more robust error-handling to the binary
attr viewing code.
- Improved support for Microsoft Active Direcotry
Added many new icons and logic to detect "special" Active Directory
objects.
Fixed a bug which prevented phpLDAPadmin's tree viewer from
properly browsing an Active Directory.
- Improved support for Novell eDirectory
Added many new icons and logic to detect Novell eDirectory (NDS)
entries.
- Enhanced export form
Users can specify the type of export, line ends, search scope, and more
from one handy form similar in appearance to phpMyAdmin export forms (though
more simple). As a result, I cleaned up the links at the top of the default
mod template (removed mac | win | unix links, for example).
- Cleaned up the entry browser link
It now better aligns itself with neighboring form elements.
- Fixed several E_NOTICE bugs
- Added paging to search results Search results are now paged into groups
of 50 entries and users can step through the pages like Google. This is not
only a nicety, but with large searches users may have waited for hours for
their browser to render all the entries. That problem is fixed by paging.
- DNs are pretty-printed
DNs in the tree viewer and else-where are now "syntax-highlighted".
- Faster schema surfing
You can "jump to" schema elements without rendering all other elements in
the schema browser. This is a major speed enhancement.
- Configurable: hide "Create new"
Thanks to a patch from Deon George, users can hide the "create new" link in the
tree viewer if desired.
- DSML exports
- Various XHTML fixes supplied by Uwe Ebel.
- More binary safety:
get_object_attrs() is now completely binary safe. Developers can use it to
fetch jpegPhotos and any other binary data.
- Re-order the search criteria menu
Users can re-order the search criteria drop-down box (for simple search
form) as desired from the config.
- Obfuscated passwords with ****
Users can configure PLA to display userPasswords as ****** if desired.
- Tree browser displays child counts
We found a fast solution to display child counts below each node without
having to expand the node in the tree viewer. Works great.
- "Used by" hyperlinks
The "used by" list in matching rules are now hyper-linked to attributes in
the schema viewer.
- jpegPhotos in the search results.
When a search result includes jpegPhotos, they will be displayed inline
with other attributes. Very handy for address books!
- We can draw any jpeg now
Modified the infrastrucutre to draw any jpegPhoto attribute, regardless of
its name.
- Added a groupOfNames template
For editing groupOfNames and groupOfUniqueNames
- Fixes to the entry browser
The entry browser can be clicked and closed before it's finished loading
- Read-only attributes
Users can now mark certain attributes as read-only, and PLA will refuse to
modify them (ie, objectClasses) and display them without form input fields.
- Configurable handling of aliases and referrals
Admins can configure how phpLDAPadmin should handle aliases and
referrals with fine-grained control.
- Schema caching
Network traffic between the web server and LDAP server has been reduced
drastically and user page loads should run much faster thanks to a
two-level session-based and memory-based schema cache.
- Low bandwidth mode
Users who have a slow link between their LDAP server and web server can
run phpLDAPadmin in low-bandwidth mode to discourage excessive network
traffic.
- Fixed DN explosion
A bug in PHP's LDAP API caused common segmentation faults in
ldap_explode_dn(). We have re-implemented this function in PHP and have
eliminated all segmentation faults.
- Almost complete localization
phpLDAPadmin is 100% internationalized with the exception of creation
templates, available in 11 languages.
- Added support for IBM LDAP and ISODE M-Vault LDAP servers.
- Linkable displayed DNs
When a user views an attribute that contains a DN, an arrow will appear
to the left side. When clicked, the user is taken to the referenced DN.
- Recursive copy fliters
When users copy a sub-tree, they may apply a filter to the copy such
that only entries that match the filter will be copied.
- Auto uidNumber enhancements
Admins can now specify a DN to bind with when auto-searching for the next
available uidNumber.
- Schema code cleanups
Applied object-oriented inheritance to schema items and cleaned up
access functions. No affect on end user, just a developers' itch.
- Custom creation template usability enhancements
- Fixed session bugs
If PHP is auto-starting sessions, we will not throw errors anymore.
- Added new auth_type: http
Users can now use http auth_types for form-based logins. Their
DN/password will be stored on the server in memory rather than in
a cookie on the client.
- TLS fixes
More robust coverage. If users have configured 'tls' = true in
config.php, we use TLS for all transactions with the LDAP
server.
- Error handling fixes
pla_verbose_error() is more tolerant of crappy input (ie, bad LDAP
error codes).
- Cleaned up default mod template
Editing entries is now much cleaner-looking. Buttons at the top are
in two columns. The browser doesn't have to be full-screen anymore
to edit an entry.
- Minor cosmetic fixes to custom creation template
- Added phpDoc commentary to all functions in functions.php and
schema_functions.php, and export_functions.php. This allows us to
auto-doc the code using phpDocumentor.
* Version 0.9.3, 2003-12-19
* Notes:
This release focused almost entirely on finding and fixing bugs.
The schema viewer has also been streamlined to save bandwidth (and several
endangered species), while template configuration has been moved to its
own file located in the templates directory. Over all, phpLDAPadmin has
been made more solid thanks to testing and reporting by hundreds of users.
Thansk for all your reports! Special thanks goes out to Matt Perlman for
the IBM work-around and Uwe Ebel for the enhanced schema viewer.
* Changes:
As this was primarily a bug-fix release, here's the list of significant
fixes:
862225 an E_NOTICE on delete fixed
861730 (and many duplicates of it) an E_NOTICE on determining the
language in 'auto' lanuage mode for browsers who don't
set HTTP_ACCEPT_LANGUAGE (like Opera).
861491 (and many duplicates of it) Anonymous form-based logins
often failed due to several E_NOTICE problems.
856832 IBM LDAP servers refernece SUP attributes by OID, not name.
A patch was provided to accomodate this circumstance.
860179 Another anonymous form-based login bug.
858611 (lots of dups of this one) Fixed the error handler so that
it will not cause a "cannot send header information" message.
844547 A coulpe E_NOTICE bugs in the posix group creation template.
841816 An E_NOTICE bug during creation of an entry.
844340 A sprintf error during login
- Many many more bug fixes.
- The schema viewer was also streamlined.
- Support work-around for IBM LDAP Server was added.
* Version 0.9.2, 2003-11-14
* Notes:
This release has undergone major code hardening as we've subjected it to
the most stringent standard of PHP error reporting. The result is
fewer unhandled errors, improved usability, and better performance.
We've given more attention to internationalization as well,
and that effort is nearly 80% complete. Translators and coders are still
needed to help complete the localization effort. We've added a whole new
custom callback infrastructure that is event driven. Users can write their
own custom code to be executed as the result of LDAP events. Events include
entry creation, entry deletion, and entry modification. Users can define
custom code to execute automatically before and after each of these events.
See "custom_functions.php" for details and documentation. Lots of other new
features and bug fixes are outlined in the ChangeLog. phpLDAPadmin finally
has a roadmap included with each release. Find it in the file called "ROADMAP"
in the root of the install. This roadmap will be constantly updated to
list our goals for each release. Enjoy 0.9.2! As always, your feedback
is most welcome on the development mailing list and on the SourceForge
bug tracker.
* Changes:
- Localization work continues. About 80% complete.
- New languages: Ialian, German, Catala
- Fixed major encoding bugs. All pages are now true UTF-8 encoded
- Support for auto-determining user's language based on the browser
- Custom event callbacks infrastructure (see custom_functions.php). Users can now
define custom code to execute as a result of LDAP events (ie, new entries,
modifications, etc).
- Major code cleanup. Removed all E_NOTICE messages and enabled E_ALL error_reporting.
- Added support for smd5 and ssha passwords
- Added configurable hints throughout the application
- Added template-based entry editing. The infrastructure is now in place to use custom
templates for editing LDAP entries. No templates are being shipped with 0.9.2, but
they are on the way for 0.9.3.
- Added photo display support for non-jpegPhoto photo attributes.
- Added mass deletion. If enabled in the configuration, users can mass-delete multiple
entries from the tree browser with checkboxes.
- Much improved schema retrieval code. Now PLA uses the Root DSE (or any relevant DN)
to fetch the schema based on the RFC-complian subSchemaSubEntry value.
- Added support for viewing schema for attributes with ";" in their names (like
userCertificate;binary or sn;lang-fr)
- Schema code is 100% object oriented.
- Enhanced search code can handle large searches without running out of memory.
- Fixed minor XSS vulnerabilities in several creation templates.
- Enhanced the server information viewer to actively retrieve attributes that the server
may not give voluntarily.
- Made the tree viewer more intelligent for failed binds.
- Added better caching of the base DN for the tree viewer, which speeds up page loads
considerably with multiple servers all configured to auto-determine the base DN.
- Added intelligence around password updates on the currently logged-in user entry.
* Version 0.9.1, 2003-09-24
* Notes:
We fixed a mountain of bugs for this release and implemented the
most popular feature requests. The result is a much more robust LDAP
management tool that supports a wider range of harsh environments and spoken
languages. This release was over a month in the making and it shows. We've
had great feed back from users. Special thanks to Nick Burch, Xavier
Renard, Uwe Ebel, Schuller Tom, and Marius Reider for their code
contributions. Thanks to everyone who contributed code and bug reports!
* Changes:
- Preliminary support for LDIF imports.
- Binary attribute support for viewing, deleting, and adding.
- Users can specify attributes to hide while editing entries.
- Schema browser now displays which objectClasses each attribute is used in.
- Preliminary multi-language support (some localization, infrastructure in place).
- New template for creating posixGroup entries.
- Optional read-only mode of operation.
- Error dialog beautified.
- Localization effort begun, now available in German and French.
- New samba user template.
* Bugs fixed:
- I18n support was made more robust (UTF-8 problems fixed in *many* places).
- Improved LDIF exports with better LDIF comments and cleaner IE support.
- Cleaned up code in edit.php.
- After updates, modified attribute(s) now highlighted properly.
- Many realpath() fixes to allow symlink installs with multiple configs.
- Simple search form 'Starts with' '*' searches produced PHP error.
- Entry creation now adds the new entry to the tree browser in sorted order.
- Complete re-work of schema browser, much more efficient parser.
- Began effort to remove all E_NOTICE notices.
* Version 0.9.0, 2003-08-12
* Notes:
This is the first release of phpLDAPAdmin. It should be stable enough and
ready for use on your production LDAP servers. This is still a beta release
and the paranoid may want to wait. phpLDAPAdmin is based on an improved
version of DaveDAP 0.8.4.
* Changes:
phpLDAPAdmin was DaveDAP. Changes since DaveDAP 0.8.4 include:
- Better LDAP compliance when copying entries.
- Fixed boolean attribute support.
- jpegPhoto scaling when necessary.
- More robust schema browser.
- Added internal attributes support.
- Slightly improved look and feel.

View File

@@ -1,68 +0,0 @@
Installationsanleitung von phpldapadmin auf Deutsch
===================================================
$Header: /cvsroot/phpldapadmin/phpldapadmin/doc/INSTALL-de.txt,v 1.3 2004/03/01 19:48:58 i18phpldapadmin Exp $
Die Installationsanweisung geht davon aus das:
a) Ein Webserver (Apache, IIS, etc.)
b) PHP 4.1.0 oder neuer (mit LDAP-Support)
installiert sind und auch funktionieren
* Installation von phpLDAPadmin in vier einfachen Schritten:
1. Entpacken des Archives (wenn man diesen Text lesen kann,
dann ist das schon geschehen)
2. Das entpackte Verzeichnis phpldapadmin sollte vom webroot
aus erreicht werden
3. Kopieren der 'config.php.example' nach 'config.php'
und anpassen.
4. Mit einem Browser auf das phpldapadmin-Verzeichnis zugreifen
(wenn Sie das Verzeichnis sehen, dann bitte noch ein index.php
anhaengen)
* Browser Hinweise
phpLDAPadmin wird unter Mozilla entwickelt und sollte auch am
Besten darunter laufen. Andere Browser (bspw. Internet Explorer)
sollten ebenfalls funktionieren.
Keine Tests wurden mit dem Konqueror (oder jeder andere khtml-basierende
Browser wie Safari) oder Opera vorgenommen. Falls es zu Browser
Inkompatibilitaet kommen sollten, dann bitte einen Fehlerreport senden.
* Lizenz
Die Verwendete Lizenz ist in der Datei LICENCE zu finden
* Mitwirkende:
Projektentwickler:
Bitte in der Datei INSTALL unter 'Project Developers:' nachsehen
Patches:
Bitte in der Datei INSTALL unter 'Patch writers:' nachsehen
Uebersetzungen:
Bitte in der Datei INSTALL unter 'Translators:' nachsehen
Wer in der Uebersetzung helfen moechte sollte an der Mailingliste
phpldapadmin-devel teilnehmen:
https://lists.sourceforge.net/mailman/listinfo/phpldapadmin-devel
* Hinweise zur Konfiguration von config.php
Wer eine Benuetzerfuehrung auf Deutsch haben moechte sollte in der
config.php die Zeile
$language = 'en';
mit
$language = 'de';
abaendern. Weitere Sprachen sieht man im Unterverzeichnis 'lang'

View File

@@ -1,56 +0,0 @@
$Header: /cvsroot/phpldapadmin/phpldapadmin/doc/INSTALL-es.txt,v 1.4 2005/02/06 00:37:15 wurley Exp $
Estas instrucciones dejan por sentado que tienes una instalación
funcionando de:
a. Servidor Web (Apache, IIS, etc).
b. PHP 4.1.0 o mas nuevo (con soporte LDAP)
* Instalando phpLDAPadmin en 4 pasos muy simples:
1. Desempaqueta el archivo (si estás leyendo esto, ya lo has hecho).
2. Pon el directorio resultante 'phpldapadmin' en algún lugar de tu
directorio web raiz.
3. Copia 'config.php.example' a 'config.php' y edítalo para que se
acomode a tu configuración y tu gusto.
4. Entonces, con el navegador ve a la dirección que contiene los archivos
del directorio phpldapadmin.
* Notas del navegador
phpLDAP se desarrolló bajo Mozilla, y será donde seguramente corra mejor.
Aún así, las pruebas se han hecho bajo Internet Explorer, y tendría que funcionar
bien también. No se ha hecho ninguna prueba con Konqueror (o cualquier navegador
basado en kthml como Safari) o Opera. Si encuentras alguna incompatibilidad, por favor
háznoslo saber.
* Contribuidores
Desarrolladores del proyecto:
- David Smith Mantenedor
- Xavier Renard Master de LDIF
- Marius Rieder Master de los Esquemas
- Nate Rotschafer Encargado de los lanzamientos
Escribidores de los parches:
- Bayu Irawan userPassword hash, arreglos html, arreglos ldap_modify
- Uwe Ebel arreglo short_open_tags
- Andrew Tipton soporte SUP en el parseador del esquema
- Eigil Bjørgum soporte UTF-8
- Brandon Lederer plantilla de entrada de DNS
Nathan Rotschafer
- Steve Rigler Parche para Password hash
- Chris Jackson Contraseñas Blowfish y md5crypt
- Marius Rieder Parseador avanzado de esquema
- Nick Burch Un montón de arreglos de realpath()
Traductores:
- Uwe Ebel Alemán
- Xavier Renard Francés
- Dave Smith Inglés ;)
Si puedes ayudar a traducir, por favor apúntate a la lista de correo phpldapadmin:
https://lists.sourceforge.net/mailman/listinfo/phpldapadmin-devel

View File

@@ -1,57 +0,0 @@
$Header: /cvsroot/phpldapadmin/phpldapadmin/doc/INSTALL-fr.txt,v 1.4 2005/02/06 00:37:15 wurley Exp $
Les instructions suivantes supposent une installation en état de marche de:
a. Un serveur web (Apache, IIS, etc).
b. PHP 4.1.0 ou une version plus récente (avec le support LDAP).
* Installer phpLDAPadmin en quatre étapes simples:
1. Dé-tarrer l'archive (si vous lisez ceci, c'est que vous l'avez déjà fait).
2. Mettre le répertoire 'phpldapadmin' ainsi obtenu quelque part sous
la racine de votre serveur web.
3. Copier 'config.php.example' vers 'config.php' et éditer selon vos besoins.
4. Ensuite, pointer votre navigateur vers le répertoire phpldapadmin.
* Notes sur les navigateurs
phpLDAPadmin a été developpé avec Mozilla et fonctionnera vraisemblablement
mieux avec celui-ci. Cependant, des tests ont été effectué avec Internet Explorer
et cela devrait fonctionner également. Aucun test n'a été réalisé ni avec Konqueror
(ou un navigateur basé sur khtml comme Safari par exemple) ni avec Opera. Si
vous trouvez une incompatibilité avec votre navigateur, merci de la reporter.
* Contributions:
Developeurs:
- David Smith Maintenance
- Xavier Renard Responsable LDIF
- Marius Rieder Responsable pour les schéma LDAP
- Nate Rotschafer Directeur des releases
Auteurs de patchs:
- Bayu Irawan hachage pour le mot de passe utilisateur,
corrections html, corrections pour ldap_modiy
- Uwe Ebel Corrections pour short_open_tags
- Andrew Tipton Support pour SUP dans le parseur de schémas
- Eigil Bjørgum Support pour UTF-8
- Brandon Lederer Patron pour les entrées DNS
Nathan Rotschafer
- Steve Rigler Correction pour les hachages des mots de passe
- Chris Jackson Mots de passe Blowfish et md5crypt
- Marius Rieder Amélioration du parseur de schémas
- Nick Burch Corrections multiples pour realpath()
Traducteurs:
- Uwe Ebel & Marius Reider Allemand
- Xavier Renard Français
- Dave Smith Anglais ;)
- Richard Lucassen Néerlandais
- Andreu Sanchez Espagnol et Catalan
- Dmitry Gorpinenko Russe
- Unknown Italien
Si vous pouvez aider à traduire phpLDAPAdmin, veuillez s'il vous plaît vous abonner
à la liste de diffusion phpldapadmin-devel:
https://lists.sourceforge.net/mailman/listinfo/phpldapadmin-devel

View File

@@ -1,101 +1,2 @@
README-translation
==================
$Header: /cvsroot/phpldapadmin/phpldapadmin/doc/README-translation.txt,v 1.3 2004/06/03 12:45:21 uugdave Exp $
This readme is for translators.
phpLDAPadmin currently supports the following languages:
- en, of course
- de, german
- es, spanish
- fr, french
- it, italien
- nl, netherland
- pl, polish
- pt-br, portuguese (brazilian)
- ru, russian
- sv, swedish
* Where are the files located?
All files are in the directory:
phpldapadmin/lang/
* How are the files named?
Every language is named by its local representation. For example English is "en" and
British English is "en_GB" (though phpLDAPadmin does not have an "en_GB" translation).
* Is the location phpldapadmin/lang/ used in the application?
No, there is a Makefile in phpldapadmin/lang/ that converts the
native encoding of the language file to utf8 into the directory
phpldapadmin/lang/recoded. For example the file
phpldapadmin/lang/de.php is converted via the programm iconv to the
the encoding utf8 to the file phpldapadmin/lang/recoded/de.php.
* Is there a rule for the form of the translation?
Yes, all translation is stored in an array called lang[].
The "mother" of all translation is english (en.php).
Use your native encoding like iso8859-1 for european
or iso8859-2 for polish.
Every translated string is in single quotes "'"
Don't use html-code in the translation.
If you need to enclose text in quotes, use a double quote '"' (no escaping required).
* Why shouldn't I use html-code?
To avoid problemens wich htmlspecialchars (which coverts "<" to "&lt;", for example).
To avoid JavaScript problems.
To keep the way open for other targets like xml.
To keep the output well formed.
* How could I start?
First, the base for translation is the CVS version.
Checkout the CVS version and start your translation.
Create a file that contains your translation.
For me the easiest way was to copy the file phpldapadmin/lang/en.php
to the phpldapadmin/lang/[new-langage].php
That gives the way to put the original translation at the end
as a comment. Look at the de.php and you can see what I mean.
Add a target to Makefile so that your langugage is also converted.
* How could I verify that my translation is complete?
phpLDAPadmin contains the file phpldapadmin/check_lang_files.php
Open it in your browser and it will tell you if your lang file has any
omissions or extraneous strings.
- extra entries: if entry is not in the en.php, maybe the value was
changed in en.php or you type in a wrong key.
- missing entries: the entry is present in en.php but is missing in
the translated langugage.
* What is zz.php and the zzz.php in the phpldapadmin/lang/ directory?
Well that is not really a language. That is only for developers
and translators to make sure that all strings are translated in the
application.
The zz.php replace all characters in the lang[] to Z. That helps
in finding hardcoding translation in the the source.
The ZZZ.php helps you to find the used "key".
* How could I enable the zz and zzz language?
Well, one is to set $language to 'zz' or 'zzz' in the config.php file. That is not the
best way - but the way that always works.
Mozilla users do this:
* Click Edit->Preferences
* Option Navigator->Lanugages
Klick the button "add" and type into "Other" the
language "zz"
* With Move up / Move down you can change your priority.
* With the Button "OK" you can activate your choice.
Do the same if you want to activate/test your translation.
Please see http://phpldapadmin.sourceforge.net/Translate now for information on
translating PLA.

4567
doc/certs/ca-bundle.crt Normal file

File diff suppressed because it is too large Load Diff

17
doc/certs/slapd.crt Normal file
View File

@@ -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-----

15
doc/certs/slapd.key Normal file
View File

@@ -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-----

13
doc/demo-reset.sh Executable file
View File

@@ -0,0 +1,13 @@
#!/bin/sh
for i in $(grep directory phpldapadmin-demo.conf|awk '{print $2}'); do
rm -f $i/*.dbb $i/*.bdb $i/__db.??? $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

File diff suppressed because it is too large Load Diff

461
doc/ldif-Simpsons Normal file
View File

@@ -0,0 +1,461 @@
# extended LDIF
#
# LDAPv3
# base <o=Simpsons> 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

588
doc/ldif-example-com Normal file
View File

@@ -0,0 +1,588 @@
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=com> 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:: 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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, 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

215
doc/ldif-example.com Normal file
View File

@@ -0,0 +1,215 @@
# extended LDIF
#
# LDAPv3
# base <dc=example.com> 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: angle<left
objectClass: inetOrgPerson
# angle\3Eright, Bad DNs, example.com
dn: uid=angle\3Eright,ou=Bad DNs,dc=example.com
cn: Test
sn: Test
uid: angle>right
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

View File

@@ -0,0 +1,77 @@
include /etc/openldap/schema/uidpool.schema
TLSCACertificateFile /etc/openldap/pla/ca-bundle.crt
TLSCertificateFile /etc/openldap/pla/slapd.crt
TLSCertificateKeyFile /etc/openldap/pla/slapd.key
access to dn.regex="o=Simpsons$" attrs=userpassword
by anonymous auth
by self write
by * none
access to dn.base="" by * read
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=Pets,o=Simpsons" write
by * read
access to *
by * read
authz-policy any
database bdb
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 bdb
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 bdb
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
database monitor
access to * by * read
database config
access to * by * read
rootdn cn=admin,cn=config
rootpw password

View File

@@ -1,4 +1,3 @@
# $Header: /cvsroot/phpldapadmin/phpldapadmin/doc/pla-test-i18n.ldif,v 1.4 2004/03/19 20:22:54 i18phpldapadmin Exp $
# This is a Test-File for characters / encoding
# 1. Change the
# ,dc=example,dc=com

View File

@@ -1,15 +0,0 @@
#!/bin/sh
# $Header: /cvsroot/phpldapadmin/phpldapadmin/doc/test_encoding.sh,v 1.1 2005/02/06 00:37:15 wurley Exp $
# $Id: test_encoding.sh,v 1.1 2005/02/06 00:37:15 wurley Exp $
# Written by: Daniel van Eeden <daniel_e@dds.nl>
# Purpose: test utf-8 encoding
for file in `find . -type f ! -name \*png ! -name \*jpg | egrep -v "^./lang/"`
do
output=`iconv ${file} -o /dev/null 2>&1`
err=$?
output=`echo ${output} | cut -d: -f2`
if [ ${err} != "0" ]; then
echo "${file}:${output}"
fi
done

11
doc/uidpool.schema Executable file
View File

@@ -0,0 +1,11 @@
##
## Used for storing the next gid and next uid in the the directory
##
objectclass ( 1.3.6.1.4.1.7165.1.2.2.3 NAME 'uidPool' SUP top AUXILIARY
DESC 'Pool for allocating UNIX uids'
MUST ( uidNumber $ cn ) )
objectclass ( 1.3.6.1.4.1.7165.1.2.2.4 NAME 'gidPool' SUP top AUXILIARY
DESC 'Pool for allocating UNIX gids'
MUST ( gidNumber $ cn ) )

View File

@@ -1,52 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/documentation.php,v 1.9 2005/09/25 16:11:44 wurley Exp $
/**
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
//include './header.php';
echo "<body>";
$view = isset( $_GET['view'] ) ? $_GET['view'] : false;
switch( $view ) {
case 'credits':
echo "<h3 class=\"title\">phpLDAPadmin Credits</h3>";
echo "<pre>";
echo "<small>";
include DOCDIR.'CREDITS';
echo "</small>";
echo "</pre>";
echo "</body>";
echo "</html>";
exit;
break;
case 'changelog':
echo "<h3 class=\"title\">phpLDAPadmin ChangeLog</h3>";
echo "<pre>";
echo "<small>";
include DOCDIR.'ChangeLog';
echo "</small>";
echo "</pre>";
echo "</body>";
echo "</html>";
exit;
break;
}
?>
<h3 class="title">phpLDAPadmin documentation</h3>
<h3 class="subtitle">Stuff you wish you already knew.</h3>
<h2 class="doc">Extending phpLDAPadmin</h2>
<h3 class="doc">Creation Templates</h3>
<p class="doc">TODO: Write me.</p>
<h3 class="doc">Modification Templates</h3>
<p class="doc">TODO: Write me.</p>

View File

@@ -1,52 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/donate.php,v 1.7 2005/02/26 12:35:05 wurley Exp $
/**
* @package phpLDAPadmin
*/
/**
*/
include './common.php';
include './header.php';
$donate_base_href="https://sourceforge.net/donate/index.php?group_id=61828&amp;type=0";
$amounts = array( 10, 20, 50, 100 );
?>
<body>
<h3 class="title">Donate</h3>
<br />
<br />
<br />
<p style="text-align: center"><?php echo $lang['donation_instructions']; ?></p>
<br />
<table style="width: 100%; font-size: 12px">
<tr>
<?php foreach( $amounts as $amount ) { ?>
<td align="center">
<a href="<?php echo $donate_base_href; ?>&amp;amt=<?php echo $amount; ?>" target="new">
<img src="images/paypal-donate.png"
alt="[<?php echo sprintf( $lang['donate_amount'], '$US ' . $amount ); ?>]"
title="<?php echo sprintf( $lang['donate_amount'], '$US ' . $amount ); ?>" /></a>
</td>
<?php } ?>
</tr>
<tr>
<?php foreach( $amounts as $amount ) { ?>
<td align="center"><?php echo sprintf( $lang['donate_amount'], '$' . $amount ); ?></td>
<?php } ?>
</tr>
</table>
<br />
<br />
</body>
</html>

View File

@@ -1,44 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/download_binary_attr.php,v 1.12 2005/07/22 05:47:44 wurley Exp $
/**
* @package phpLDAPadmin
* Variables that come in via common.php
* - server_id
*/
/**
*/
require './common.php';
if ($ldapserver->isReadOnly())
pla_error($lang['no_updates_in_read_only_mode']);
if (! $ldapserver->haveAuthInfo())
pla_error($lang['not_enough_login_info']);
$dn = rawurldecode($_GET['dn']);
$attr = $_GET['attr'];
# if there are multiple values in this attribute, which one do you want to see?
$value_num = isset($_GET['value_num']) ? $_GET['value_num'] : 0;
dn_exists($ldapserver,$dn) or
pla_error(sprintf($lang['no_such_entry'],pretty_print_dn($dn)));
$search = @ldap_read($ldapserver->connect(),$dn,"(objectClass=*)",array($attr),0,0,0,$config->GetValue('deref','view'));
if (! $search)
pla_error($lang['error_performing_search'],ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect()));
$entry = ldap_first_entry($ldapserver->connect(),$search);
$attrs = ldap_get_attributes($ldapserver->connect(),$entry);
$attr = ldap_first_attribute($ldapserver->connect(),$entry,$attrs);
$values = ldap_get_values_len($ldapserver->connect(),$entry,$attr);
$count = $values['count'];
// Dump the binary data to the browser
header("Content-type: octet-stream");
header("Content-disposition: attachment; filename=$attr");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
echo $values[$value_num];
?>

View File

@@ -1,59 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/edit.php,v 1.56 2005/09/25 16:11:44 wurley Exp $
/**
* Displays the specified dn from the specified server for editing
* in its template as determined by get_template(). This is a simple
* shell for displaying entries. The real work is done by the templates
* found in tempaltes/modification/
*
* Variables that come in via common.php
* - server_id
* Variables that come in as GET vars:
* - dn (rawurlencoded)
* - use_default_template (optional) If set, use the default template no matter what
* - Other vars may be set and used by the modification templates
*
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
require TMPLDIR.'template_config.php';
if( ! $ldapserver->haveAuthInfo())
pla_error( $lang['not_enough_login_info'] );
$dn = isset($_GET['dn']) ? $_GET['dn'] : false;
$dn !== false or pla_error($lang['missing_dn_in_query_string']);
$decoded_dn = rawurldecode($dn);
$encoded_dn = rawurlencode($decoded_dn);
/* Template authors may wish to present the user with a link back to the default, generic
template for editing. They may use this as the target of the href to do so.
@deprectated
*/
$default_href = sprintf("edit.php?server_id=%s&amp;dn=%s&amp;use_default_template=true",$ldapserver->server_id,$encoded_dn);
$use_default_template = isset( $_GET['use_default_template'] ) || $config->GetValue('template_engine','enable');
if( $use_default_template ) {
if ($config->GetValue('template_engine','enable'))
require './template_engine.php';
else
require TMPLDIR.'modification/default.php';
} else {
$template = get_template($ldapserver,$dn);
$template_file = TMPLDIR."modification/$template.php";
if (file_exists($template_file))
require $template_file;
else {
printf('%s <b>%s</b> %s<br />',$lang['missing_template_file'],$template_file,$lang['using_default']);
require TMPLDIR.'modification/default.php';
}
}
?>

View File

@@ -1,114 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/entry_chooser.php,v 1.26 2005/08/24 15:14:39 wurley Exp $
/**
* Display a selection (popup window) to pick a DN.
*
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
$container = isset($_GET['container']) ? rawurldecode($_GET['container']) : false;
$return_form_element = isset($_GET['form_element']) ? htmlspecialchars($_GET['form_element']) : null;
$rdn = isset($_GET['rdn']) ? htmlspecialchars($_GET['rdn']) : null;
include "./header.php";
printf('<h3 class="subtitle">%s</h3>',$lang['entry_chooser_title']);
flush();
?>
<script language="javascript">
function returnDN( dn ) {
opener.document.<?php echo $return_form_element; ?>.value = dn;
close();
}
</script>
<?php
if ($container) {
printf('%s<b>%s</b>',$lang['server_colon_pare'],htmlspecialchars($ldapserver->name));
print '<br />';
printf('%s<b>%s</b>',$lang['look_in'],htmlspecialchars($container));
print '<br />';
}
/* Has the use already begun to descend into a specific server tree? */
if (isset($ldapserver) && $container !== false) {
if (! $ldapserver->haveAuthInfo())
pla_error($lang['not_enough_login_info']);
$dn_list = get_container_contents($ldapserver,$container,0,'(objectClass=*)',$config->GetValue('deref','tree'));
sort($dn_list);
foreach ($ldapserver->getBaseDN() as $base_dn) {
debug_log(sprintf('%s: Comparing BaseDN [%s] with container [%s]','entry_chooser.php',$base_dn,$container),9);
if (! pla_compare_dns($container,$base_dn)) {
$parent_container = false;
$up_href = sprintf('entry_chooser.php?form_element=%s&rdn=%s',$return_form_element,$rdn);
break;
} else {
$parent_container = get_container($container);
$up_href = sprintf('entry_chooser.php?form_element=%s&rdn=%s&amp;server_id=%s&amp;container=%s',
$return_form_element,$rdn,$ldapserver->server_id,rawurlencode($parent_container));
}
}
print '&nbsp;';
printf('<a href="%s" style="text-decoration:none"><img src="images/up.png"> %s</a>',$up_href,$lang['back_up_p']);
print '<br />';
if (! count($dn_list))
printf('&nbsp;&nbsp;&nbsp;(%s)<br />',$lang['no_entries']);
else
foreach ($dn_list as $dn) {
$href = sprintf("javascript:returnDN('%s%s')",($rdn ? "$rdn," : ''),$dn);
print '&nbsp;&nbsp;&nbsp;';
printf('<a href="entry_chooser.php?server_id=%s&amp;form_element=%s&rdn=%s&amp;container=%s"><img src="images/plus.png" /></a>',
$ldapserver->server_id,$return_form_element,$rdn,rawurlencode($dn));
printf('<a href="%s">%s</a>',$href,htmlspecialchars($dn));
print '<br />';
}
/* draw the root of the selection tree (ie, list all the servers) */
} else {
foreach ($ldapservers->GetServerList() as $id) {
$ldapserver = $ldapservers->Instance($id);
if ($ldapserver->isVisible()) {
if (! $ldapserver->haveAuthInfo())
continue;
else {
printf('<b>%s</b>',htmlspecialchars($ldapserver->name));
print '<br />';
foreach ($ldapserver->getBaseDN() as $dn) {
if (! $dn) {
printf('<small>&nbsp;&nbsp;&nbsp;(%s)</small><br />',$lang['could_not_det_base_dn']);
} else {
$href = sprintf("javascript:returnDN('%s%s')",($rdn ? "$rdn," : ''),$dn);
print '&nbsp;&nbsp;&nbsp;';
printf('<a href="entry_chooser.php?server_id=%s&amp;form_element=%s&rdn=%s&amp;container=%s"><img src="images/plus.png" /></a> ',
$ldapserver->server_id,$return_form_element,$rdn,rawurlencode($dn));
printf('<a href="%s">%s</a>',$href,htmlspecialchars($dn));
print '<br />';
}
}
}
}
}
}
?>

View File

@@ -1,69 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/expand.php,v 1.22 2005/07/22 05:47:44 wurley Exp $
/**
* This script alters the session variable 'tree', expanding it
* at the dn specified in the query string.
*
* Variables that come in via common.php
* - server_id
* Variables that come in as GET vars:
* - dn (rawurlencoded)
*
* Note: this script is equal and opposite to collapse.php
* @package phpLDAPadmin
* @see collapse.php
*/
/**
*/
require './common.php';
if (! $ldapserver->haveAuthInfo())
pla_error($lang['not_enough_login_info']);
# no expire header stuff
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: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
# This allows us to display large sub-trees without running out of time.
@set_time_limit( 0 );
$dn = $_GET['dn'];
$encoded_dn = rawurlencode( $dn );
initialize_session_tree();
$tree = $_SESSION['tree'];
$tree_icons = $_SESSION['tree_icons'];
$contents = get_container_contents( $ldapserver, $dn, 0, '(objectClass=*)', $config->GetValue('deref','tree'));
usort( $contents, 'pla_compare_dns' );
$tree[$ldapserver->server_id][$dn] = $contents;
foreach( $contents as $dn )
$tree_icons[$ldapserver->server_id][$dn] = get_icon( $ldapserver, $dn );
$_SESSION['tree'] = $tree;
$_SESSION['tree_icons'] = $tree_icons;
// This is for Opera. By putting "random junk" in the query string, it thinks
// that it does not have a cached version of the page, and will thus
// fetch the page rather than display the cached version
$time = gettimeofday();
$random_junk = md5( strtotime( 'now' ) . $time['usec'] );
// 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 = "&".session_name()."=".session_id();
session_write_close();
header(sprintf('Location:tree.php?foo=%s#%s_%s%s',$random_junk,$ldapserver->server_id,$encoded_dn,$id_session_param));
?>

View File

@@ -1,106 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/export.php,v 1.15 2005/09/25 16:11:44 wurley Exp $
/**
* @package phpLDAPadmin
*/
/**
*/
# Fix a bug with IE:
ini_set('session.cache_limiter','');
require './common.php';
require LIBDIR.'export_functions.php';
// get the POST parameters
$server_id = (isset($_POST['server_id']) ? $_POST['server_id'] : '');
if( ! $ldapserver->haveAuthInfo())
pla_error( $lang['not_enough_login_info'] );
$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';
// add system attributes if needed
$attributes = array();
if( isset( $_POST['sys_attr'] ) ){
array_push($attributes,'*');
array_push($attributes,'+');
}
isset($_POST['exporter_id']) or pla_error( $lang['must_choose_export_format'] );
$exporter_id = $_POST['exporter_id'];
isset($exporters[$exporter_id]) or pla_error( $lang['invalid_export_format'] );
// Initialisation of other variables
$rdn = get_rdn( $base_dn );
$friendly_rdn = get_rdn( $base_dn, 1 );
$extension = $exporters[$exporter_id]['extension'];
//set the default CRLN to Unix format
$br = "\n";
// default case not really needed
switch( $format ) {
case 'win':
$br = "\r\n";
break;
case 'mac':
$br = "\r";
break;
case 'unix':
default:
$br = "\n";
}
// get the decoree,ie the source
$plaLdapExporter = new PlaLdapExporter($server_id,$filter,$base_dn,$scope,$attributes);
// the decorator
// do it that way for the moment
$exporter = NULL;
switch($exporter_id){
case 0:
$exporter = new PlaLdifExporter($plaLdapExporter);
break;
case 1:
$exporter = new PlaDsmlExporter($plaLdapExporter);
break;
case 2:
$exporter = new PlaVcardExporter($plaLdapExporter);
break;
case 3:
$exporter = new PlaCSVExporter($plaLdapExporter);
break;
default:
// truly speaking,this default case will never be reached. See check at the bottom.
$plaLdapExporter->pla_close();
pla_error( $lang['no_exporter_found'] );
}
// set the CLRN
$exporter->setOutputFormat($br);
// prevent script from bailing early for long search
@set_time_limit( 0 );
// send the header
if( $save_as_file )
header( "Content-type: application/download" );
else
header( "Content-type: text/plain" );
header( "Content-Disposition: filename=$friendly_rdn.".$exporters[$exporter_id]['extension'] );
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();
?>

View File

@@ -1,150 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/export_form.php,v 1.22 2005/09/25 16:11:44 wurley Exp $
/**
* export_form.php
* --------------------
*
* Html form to choose an export format(ldif,...)
*
* @package phpLDAPadmin
*/
/**
*/
require './common.php';
require LIBDIR.'export_functions.php';
$server_id = isset( $_GET['server_id'] ) ? $_GET['server_id']:NULL ;
$format = isset( $_GET['format'] ) ? $_GET['format'] : get_line_end_format();
$scope = isset( $_GET['scope'] ) ? $_GET['scope'] : 'base' ;
$exporter_id = isset( $_GET['exporter_id'] ) ? $_GET['exporter_id'] : 0 ;
$dn = isset( $_GET['dn'] ) ? $_GET['dn'] : null;
$filter = isset( $_GET['filter'] ) ? $_GET['filter'] : '(objectClass=*)';
$attributes = isset( $_GET['attributes'] ) ? $_GET['attributes'] : '*';
$sys_attr = isset( $_GET['sys_attr'] ) && $_GET['sys_attr'] == 'true' ? true : false;
$available_formats = array(
'unix' => 'UNIX (Linux, BSD)',
'mac' => 'Macintosh',
'win' => 'Windows'
);
$available_scopes = array(
'base' => $lang['scope_base'],
'one' => $lang['scope_one'],
'sub' => $lang['scope_sub']
);
include './header.php'; ?>
<body>
<h3 class="title"><?php echo $lang['export']; ?></h3>
<br />
<center>
<form name="export_form" action="export.php" method="POST">
<table class="export_form">
<tr>
<td>
<fieldset>
<legend><?php echo $lang['export']; ?></legend>
<table>
<tr>
<td><?php echo $lang['server']; ?></td>
<td><?php print server_select_list(); ?></td>
</tr>
<tr>
<td style="white-space:nowrap"><?php echo $lang['base_dn']; ?></td>
<td><nobr><input type="text" name="dn" id="dn" style="width:230px" value="<?php echo htmlspecialchars( $dn ); ?>" /> <?php draw_chooser_link( 'export_form.dn' ); ?></nobr></td>
</tr>
<tr>
<td><span style="white-space: nowrap"><?php echo $lang['search_scope']; ?></span></td>
<td>
<?php foreach( $available_scopes as $id => $desc ) {
$id = htmlspecialchars( $id );
$desc = htmlspecialchars( $desc ); ?>
<input type="radio" name="scope" value="<?php echo $id; ?>" id="<?php echo $id; ?>"<?php if($id==$scope) echo ' checked="true"';?> /><label for="<?php echo $id; ?>"><?php echo $desc; ?></label><br />
<?php } ?>
</td>
</tr>
<tr>
<td><?php echo $lang['search_filter']; ?></td>
<td><input type="text" name="filter" style="width:300px" value="<?php echo htmlspecialchars($filter); ?>" /></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type="checkbox" name="sys_attr" id="sys_attr" <?php if( $sys_attr ) echo 'checked="true" '; ?>/> <label for="sys_attr"><?php echo $lang['include_system_attrs']; ?></label></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type="checkbox" id="save_as_file" name="save_as_file" /><label for="save_as_file"><?php echo $lang['save_as_file']; ?></label></td>
</tr>
</table>
</fieldset>
</td>
</tr>
<tr>
<td>
<table style="width: 100%">
<tr><td style="width: 50%">
<fieldset style="height: 100px">
<legend><?php echo $lang['export_format']; ?></legend>
<?php foreach($exporters as $index => $exporter){?>
<input type="radio" name="exporter_id" value="<?php echo htmlspecialchars($index); ?>" id="<?php echo htmlspecialchars($index); ?>" <?php if($index==$exporter_id) echo ' checked="true"'; ?> />
<label for="<?php echo htmlspecialchars( $index ); ?>"><?php echo htmlspecialchars( $exporter['desc'] ); ?></label><br />
<?php } ?>
</fieldset>
</td>
<td style="width: 50%">
<fieldset style="height: 100px">
<legend><?php echo $lang['line_ends']; ?></legend>
<?php foreach( $available_formats as $id => $desc ) {
$id = htmlspecialchars( $id );
$desc = htmlspecialchars( $desc );
?>
<input type="radio" name="format" value="<?php echo $id; ?>" id="<?php echo $id; ?>"<?php if($format==$id) echo ' checked="true"'; ?> /><label for="<?php echo $id; ?>"><?php echo $desc; ?></label><br />
<?php } ?>
</fieldset>
</td></tr>
</table>
</td>
</tr>
<tr>
<td colspan="2">
<center>
<input type="submit" name="target" value="<?php echo $lang['proceed_gt']; ?>" />
</center>
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
<?php
/**
* Helper functoin for fetching the line end format.
* @return String 'win', 'unix', or 'mac' based on the user's browser..
*/
function get_line_end_format()
{
if( is_browser_os_windows() )
return 'win';
elseif( is_browser_os_unix() )
return 'unix';
elseif( is_browser_os_mac() )
return 'mac';
else
return 'unix';
}

View File

@@ -1,875 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/export_functions.php,v 1.30 2005/09/04 16:17:08 wurley Exp $
/**
* Fuctions and classes for exporting ldap entries to others formats
* (LDIF,DSML,..)
* An example is provided at the bottom of this file if you want implement yours. *
* @package phpLDAPadmin
* @author The phpLDAPadmin development team
* @see export.php and export_form.php
*/
/**
*/
// include common configuration definitions
include('./common.php');
// registry for the exporters
$exporters = array();
$exporters[] = array(
'output_type'=>'ldif',
'desc' => 'LDIF',
'extension' => 'ldif'
);
$exporters[] = array(
'output_type'=>'dsml',
'desc' => 'DSML V.1',
'extension' => 'xml'
);
$exporters[] = array(
'output_type'=>'vcard',
'desc' => 'VCARD 2.1',
'extension' => 'vcf'
);
$exporters[] = array(
'output_type'=>'csv',
'desc' => $lang['csv_spreadsheet'],
'extension' => 'csv'
);
/**
* This class encapsulate informations about the ldap server
* from which the export is done.
* The following info are provided within this class:
*
* $server_id: the id of the server.
* $base_dn: if the source of the export is the ldap server,
* it indicates the base dn of the search.
* $query_filter: if the source of the export is the ldap server,
* it indicates the query filter for the search.
* $scope: if the source of the export is the ldap server,
* it indicates the scope of the search.
*
* @package phpLDAPadmin
*/
class LdapExportInfo {
var $base_dn;
var $query_filter;
var $scope;
/**
* Create a new LdapExportInfo object
*
* @param int $server_id the server id
* @param String $base_dn the base_dn for the search in a ldap server
* @param String $query_filter the query filter for the search
* @param String $scope the scope of the search in a ldap server
*/
function LdapExportInfo($server_id,$base_dn = NULL,$query_filter = NULL,$scope = NULL){
global $ldapservers;
$this->ldapserver = $ldapservers->Instance($server_id);
$this->ldapserver->base_dn = $base_dn;
$this->ldapserver->query_filter = $query_filter;
$this->ldapserver->scope = $scope;
}
}
/**
* This class represents the base class of all exporters
* It can be subclassed directly if your intend is to write
* a source exporter(ie. it will act only as a decoree
* which will be wrapped by an another exporter.)
* If you consider writting an exporter for filtering data
* or directly display entries, please consider subclass
* the PlaExporter
*
* @see PlaExporter
* @package phpLDAPadmin
*/
class PlaAbstractExporter{
/**
* Return the number of entries
* @return int the number of entries to be exported
*/
function pla_num_entries(){}
/**
* Return true if there is some more entries to be processed
* @return bool if there is some more entries to be processed
*/
function pla_has_entry(){}
/**
* Return the entry as an array
* @return array an entry as an array
*/
function pla_fetch_entry_array(){}
/**
* Return the entry as an Entry object
* @return Entry an entry as an Entry Object
*/
function pla_fetch_entry_object(){}
/**
* Return a PlaLdapInfo Object
* @return LdapInfo Object with info from the ldap serveur
*/
function pla_get_ldap_info(){}
/**
* May be call when the processing is finished
* and to free some ressources.
* @return bool true or false if any errors is encountered
*/
function pla_close(){}
}// end PlaAbstractExporter
/**
* PlaExporter acts a wrapper around another exporter.
* In other words, it will act as a decorator for another decorator
*
* @package phpLDAPadmin
*/
class PlaExporter extends PlaAbstractExporter{
// the default CRLN
var $br="\n";
// the wrapped $exporter
var $exporter;
/**
* Constructor
* @param source $source the decoree for this exporter
*/
function PlaExporter( $source ){
$this->exporter = $source;
}
/**
* Return the number of entries
* @return int the number of entries to be exported
*/
function pla_num_entries(){
return $this->exporter->pla_num_entries();
}
/**
* Return true if there is some more entries to be processed
* @return bool if there is some more entries to be processed
*/
function pla_has_entry(){
return $this->exporter->pla_has_entry();
}
/**
* Return the entry as an array
* @return array an entry as an array
*/
function pla_fetch_entry_array(){
return $this->exporter->pla_fetch_entry_array();
}
/**
* Return the entry as an Entry object
* @return Entry an entry as an Entry Object
*/
function pla_fetch_entry_object(){
return $this->exporter->pla_fetch_entry_object();
}
/**
* Return a PlaLdapInfo Object
* @return LdapInfo Object with info from the ldap serveur
*/
function pla_get_ldap_info(){
return $this->exporter->pla_get_ldap_info();
}
/**
* May be call when the processing is finished
* and to free some ressources.
* @return bool false if any errors are encountered,false otherwise
*/
function pla_close(){
return $this->exporter->pla_close();
}
/**
* Helper method to check if the attribute value should be base 64 encoded.
* @param String $str the string to check.
* @return bool true if the string is safe ascii, false otherwise.
*/
function is_safe_ascii( $str ){
for( $i=0; $i<strlen($str); $i++ )
if( ord( $str{$i} ) < 32 || ord( $str{$i} ) > 127 )
return false;
return true;
}
/**
* Abstract method use to export data.
* Must be implemented in a sub-class if you write an exporter
* which export data.
* Leave it empty if you write a sub-class which do only some filtering.
*/
function export(){}
/**
* Set the carriage return /linefeed for the export
* @param String $br the CRLF to be set
*/
function setOutputFormat( $br ){
$this->br = $br;
}
}// end PlaExporter
/**
* Export data from a ldap server
* @extends PlaAbstractExporter
* @package phpLDAPadmin
*/
class PlaLdapExporter extends PlaAbstractExporter{
var $entry_id;
var $results;
var $server_id;
var $scope;
var $entry_array;
var $num_entries;
var $ldap_info;
var $queryFilter;
var $hasNext;
var $attributes;
/**
* Create a PlaLdapExporter object.
* @param int $server_id the server id
* @param String $queryFilter the queryFilter for the export
* @param String $base_dn the base_dn for the data to export
* @param String $scope the scope for export
*/
function PlaLdapExporter( $server_id , $queryFilter , $base_dn , $scope, $attributes){
global $lang, $config;
$this->scope = $scope;
$this->base_dn = $base_dn;
$this->server_id = $server_id;
$this->queryFilter = $queryFilter;
// infos for the server
$this->ldap_info = new LdapExportInfo($server_id,$base_dn,$queryFilter,$scope);
// boolean to check if there is more entries
$this->hasNext = 0;
// boolean to check the state of the connection
$this->attributes = $attributes;
// connect to the server
$this->ds = $this->ldap_info->ldapserver->connect();
// @todo test whether we need to call pla_ldap_connection_is_error here.
//pla_ldap_connection_is_error( $this->ds );
// get the data to be exported
if( $this->scope == 'base' )
$this->results = @ldap_read( $this->ds, $this->base_dn, $this->queryFilter,$this->attributes,
0, 0, 0, $config->GetValue('deref','export'));
elseif( $this->scope == 'one' )
$this->results = @ldap_list( $this->ds, $this->base_dn, $this->queryFilter, $this->attributes,
0, 0, 0, $config->GetValue('deref','export'));
else // scope == 'sub'
$this->results = @ldap_search( $this->ds, $this->base_dn, $this->queryFilter, $this->attributes,
0, 0, 0, $config->GetValue('deref','export'));
// if no result, there is a something wrong
if( ! $this->results )
pla_error( $lang['error_performing_search'], ldap_error( $this->ds ), ldap_errno( $this->ds ) );
// get the number of entries to be exported
$this->num_entries = @ldap_count_entries( $this->ds,$this->results );
if( $this->entry_id = @ldap_first_entry( $this->ds,$this->results ) ){
$this->hasNext = 1;
}
}//end constructor
/**
* Return the entry as an array
* @return array an entry as an array
*/
function pla_fetch_entry_array(){
return $this->entry_array;
}
/**
* Return the entry as an Entry object
* @return Entry an entry as an Entry Object
*/
function pla_fetch_entry_object(){
// to do
}
/**
* Return a PlaLdapInfo Object
* @return LdapInfo Object with info from the ldap serveur
*/
function pla_get_ldap_info(){
return $this->ldap_info->ldapserver;
}
/**
* Return the number of entries
* @return int the number of entries to be exported
*/
function pla_num_entries(){
return $this->num_entries;
}
/**
* Return true if there is some more entries to be processed
* @return bool if there is some more entries to be processed
*/
function pla_has_entry(){
if( $this->hasNext ){
unset( $this->entry_array );
$dn = @ldap_get_dn( $this->ds,$this->entry_id );
$this->entry_array['dn'] = $dn;
//get the attributes of the entry
$attrs = @ldap_get_attributes($this->ds,$this->entry_id);
if( $attr = @ldap_first_attribute( $this->ds,$this->entry_id,$attrs ) ){
//iterate over the attributes
while( $attr ){
if( is_attr_binary( $this,$attr ) ){
$this->entry_array[$attr] = @ldap_get_values_len( $this->ds,$this->entry_id,$attr );
}
else{
$this->entry_array[$attr] = @ldap_get_values( $this->ds,$this->entry_id,$attr );
}
unset( $this->entry_array[$attr]['count'] );
$attr = @ldap_next_attribute( $this->ds,$this->entry_id,$attrs );
}// end while attr
if(!$this->entry_id = @ldap_next_entry( $this->ds,$this->entry_id ) ){
$this->hasNext = 0;
}
}// end if attr
return true;
}
else{
$this->pla_close();
return false;
}
}
/**
* May be call when the processing is finished
* and to free some ressources.
* @return bool true or false if any errors is encountered
* @todo This could break something, so need to add a method to LDAPServer to close connection and reset $connected.
*/
function pla_close(){
// if($this->ldap_info->connected){
// return @ldap_close( $this->ds );
// }
// else{
// return true;
// }
}
} // end PlaLdapExporter
/**
* Export entries to ldif format
* @extends PlaExporter
* @package phpLDAPadmin
*/
class PlaLdifExporter extends PlaExporter{
// variable to keep the count of the entries
var $counter = 0;
// the maximum length of the ldif line
var $MAX_LDIF_LINE_LENGTH = 76;
/**
* Create a PlaLdifExporter object
* @param PlaAbstractExporter $exporter the source exporter
*/
function PlaLdifExporter( $exporter ){
$this->exporter = $exporter;
}
/**
* Export entries to ldif format
*/
function export(){
$pla_ldap_info = $this->pla_get_ldap_info();
$this->displayExportInfo($pla_ldap_info);
//While there is an entry, fecth the entry as an array
while($this->pla_has_entry()){
$entry = $this->pla_fetch_entry_array();
$this->counter++;
// display comment before each entry
global $lang;
$title_string = "# " . $lang['entry'] . " " . $this->counter . ": " . $entry['dn'] ;
if( strlen( $title_string ) > $this->MAX_LDIF_LINE_LENGTH-3 )
$title_string = substr( $title_string, 0, $this->MAX_LDIF_LINE_LENGTH-3 ) . "...";
echo "$title_string$this->br";
// display dn
if( $this->is_safe_ascii( $entry['dn'] ))
$this->multi_lines_display("dn: ". $entry['dn']);
else
$this->multi_lines_display("dn:: " . base64_encode( $entry['dn'] ));
array_shift($entry);
// display the attributes
foreach( $entry as $key => $attr ){
foreach( $attr as $value ){
if( !$this->is_safe_ascii($value) || is_attr_binary($pla_ldap_info,$key ) ){
$this->multi_lines_display( $key.":: " . base64_encode( $value ) );
}
else{
$this->multi_lines_display( $key.": ".$value );
}
}
}// end foreach $entry
echo $this->br;
// flush every 5th entry (sppeds things up a bit)
if( 0 == $this->counter % 5 )
flush();
}
}
// display info related to this export
function displayExportInfo($pla_ldap_info){
global $lang;
echo "version: 1$this->br$this->br";
echo "# " . sprintf( $lang['ldif_export_for_dn'], $pla_ldap_info->base_dn ) . $this->br;
echo "# " . sprintf( $lang['generated_on_date'], date("F j, Y g:i a") ) . $this->br;
echo "# " . $lang['server'] . ": " .$pla_ldap_info->name . " (" . $pla_ldap_info->host . ")" . $this->br;
echo "# " . $lang['search_scope'] . ": " . $pla_ldap_info->scope . $this->br;
echo "# " . $lang['search_filter'] . ": " . $pla_ldap_info->query_filter . $this->br;
echo "# " . $lang['total_entries'] . ": " . $this->pla_num_entries() . $this->br;
echo $this->br;
}
/**
* Helper method to wrap ldif lines
* @param String $str the line to be wrapped if needed.
*/
function multi_lines_display( $str ){
$length_string = strlen($str);
$max_length = $this->MAX_LDIF_LINE_LENGTH;
while ($length_string > $max_length){
echo substr($str,0,$max_length).$this->br." ";
$str= substr($str,$max_length,$length_string);
$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
$max_length = $this->MAX_LDIF_LINE_LENGTH-1;
}
echo $str."".$this->br;
}
}
/**
* Export entries to DSML v.1
* @extends PlaExporter
* @package phpLDAPadmin
*/
class PlaDsmlExporter extends PlaExporter{
//not in use
var $indent_step = 2;
var $counter = 0;
/**
* Create a PlaDsmlExporter object
* @param PlaAbstractExporter $exporter the decoree exporter
*/
function PlaDsmlExporter( $exporter ){
$this->exporter = $exporter;
}
/**
* Export the entries to DSML
*/
function export(){
global $lang;
$pla_ldap_info = $this->pla_get_ldap_info();
// not very elegant, but do the job for the moment as we have just 4 level
$directory_entries_indent = " ";
$entry_indent= " ";
$attr_indent = " ";
$attr_value_indent = " ";
// print declaration
echo "<?xml version=\"1.0\"?>$this->br";
// print root element
echo "<dsml>$this->br";
// print info related to this export
echo "<!-- " . $this->br;
echo "# " . sprintf( $lang['dsml_export_for_dn'], $pla_ldap_info->base_dn ) . $this->br;
echo "# " . sprintf( $lang['generated_on_date'], date("F j, Y g:i a") ) . $this->br;
echo "# " . $lang['server'] . ": " . $pla_ldap_info->name . " (" . $pla_ldap_info->host . ")" . $this->br;
echo "# " . $lang['search_scope'] . ": " . $pla_ldap_info->scope . $this->br;
echo "# " . $lang['search_filter'] . ": " . $pla_ldap_info->query_filter . $this->br;
echo "# " . $lang['total_entries'] . ": " . $this->pla_num_entries() . $this->br;
echo "-->" . $this->br;
echo $directory_entries_indent."<directory-entries>$this->br";
//While there is an entry, fetch the entry as an array
while($this->pla_has_entry()){
$entry = $this->pla_fetch_entry_array();
$this->counter++;
// display dn
echo $entry_indent."<entry dn=\"". htmlspecialchars( $entry['dn'] ) ."\">".$this->br;
array_shift($entry);
// echo the objectclass attributes first
if(isset($entry['objectClass'])){
echo $attr_indent."<objectClass>".$this->br;
foreach($entry['objectClass'] as $ocValue){
echo $attr_value_indent."<oc-value>$ocValue</oc-value>".$this->br;
}
echo $attr_indent."</objectClass>".$this->br;
unset($entry['objectClass']);
}
$binary_mode = 0;
// display the attributes
foreach($entry as $key=>$attr){
echo $attr_indent."<attr name=\"$key\">".$this->br;
// if the attribute is binary, set the flag $binary_mode to true
$binary_mode = is_attr_binary($pla_ldap_info,$key)?1:0;
foreach($attr as $value){
echo $attr_value_indent."<value>".($binary_mode?base64_encode( $value): htmlspecialchars( $value ) )."</value>".$this->br;
}
echo $attr_indent."</attr>".$this->br;
}// end foreach $entry
echo $entry_indent."</entry>".$this->br;
// flush every 5th entry (speeds things up a bit)
if( 0 == $this->counter % 5 )
flush();
}
echo $directory_entries_indent."</directory-entries>$this->br";
echo "</dsml>".$this->br;
}
}
/**
* @package phpLDAPadmin
*/
class PlaVcardExporter extends PlaExporter{
// mappping one to one attribute
var $vcardMapping = array('cn' => 'FN',
'title' => 'TITLE',
'homePhone' => 'TEL;HOME',
'mobile' => 'TEL;CELL',
'mail' => 'EMAIL;Internet',
'labeledURI' =>'URL',
'o' => 'ORG',
'audio' => 'SOUND',
'facsmileTelephoneNumber' =>'TEL;WORK;HOME;VOICE;FAX',
'jpegPhoto' => 'PHOTO;ENCODING=BASE64',
'businessCategory' => 'ROLE',
'description' => 'NOTE'
);
var $deliveryAddress = array("postOfficeBox",
"street",
"l",
"st",
"postalCode",
"c");
function PlaVcardExporter($exporter){
$this->exporter = $exporter;
}
/**
* When doing an exporter, the method export need to be overriden.
* A basic implementation is provided here. Customize to your need
**/
function export(){
// With the method pla->get_ldap_info,
// you have access to some values related
// to you ldap server
$ldap_info = $this->pla_get_ldap_info();
$base_dn = $ldap_info->base_dn;
$server_id = $ldap_info->server_id;
$scope = $ldap_info->scope;
$server_name = $ldap_info->name;
$server_host = $ldap_info->host;
while( $this->pla_has_entry() ){
$entry = $this->pla_fetch_entry_array();
//fetch the dn
$dn = $entry['dn'];
unset( $entry['dn'] );
// check the attributes needed for the delivery address
// field
$addr = "ADR:";
foreach( $this->deliveryAddress as $attr_name ){
if( isset( $entry[$attr_name] ) ){
$addr .= $entry[$attr_name][0];
unset($entry[$attr_name]);
}
$addr .= ';';
}
echo "BEGIN:VCARD$this->br";
// loop for the attributes
foreach( $entry as $attr_name=>$attr_values ){
// if an attribute of the ldap entry exist
// in the mapping array for vcard
if( isset( $this->vcardMapping[$attr_name] ) ){
// case of organisation. Need to append the
// possible ou attribute
if( 0 == strcasecmp( $attr_name , 'o' )){
echo $this->vcardMapping[$attr_name].":$attr_values[0]";
if( isset($entry['ou'] ) )
foreach( $entry['ou'] as $ou_value ){
echo ";$ou_value";
}
}
// the attribute is binary. (to do : need to fold the line)
else if( 0 == strcasecmp( $attr_name,'audio') || 0 == strcasecmp( $attr_name,'jpegPhoto') ){
echo $this->vcardMapping[$attr_name].":$this->br";
echo " ".base64_encode( $attr_values[0]);
}
/* else if( $attr_name == "sn"){
echo $this->vcardMapping[$attr_name].":$attr_values[0]";
}
elseif( $attr_name == "homePostalAddress"){
}*/
// else just print the value with the relevant attribute name
else{
echo $this->vcardMapping[$attr_name].":$attr_values[0]";
}
echo $this->br;
}
}
// need to check
echo "UID:$dn";
echo $this->br;
echo "VERSION:2.1";
echo $this->br;
echo $addr;
echo $this->br;
echo "END:VCARD";
echo $this->br;
}// end while
}
}
/**
* Export to cvs format
*
* @author Glen Ogilvie
* @package phpLDAPadmin
*/
class PlaCSVExporter extends PlaExporter{
function PlaCSVExporter($exporter){
$this->exporter = $exporter;
}
/**
* 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 = '"';
function export(){
// With the method pla->get_ldap_info,
// you have access to some values related
// to you ldap server
$ldap_info = $this->pla_get_ldap_info();
$base_dn = $ldap_info->base_dn;
$server_id = $ldap_info->server_id;
$scope = $ldap_info->scope;
$server_name = $ldap_info->name;
$server_host = $ldap_info->host;
$entries = array();
$headers = array();
// 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
while( $this->pla_has_entry() ) {
$entry = $this->pla_fetch_entry_array();
foreach (array_keys($entry) as $key) {
if (!in_array($key, $headers))
array_push($headers,$key);
}
array_push($entries, $entry);
}
$num_headers = count($headers);
// print out the headers
for ($i = 0; $i < $num_headers; $i++) {
echo $this->qualifier. $headers[$i].$this->qualifier;
if ($i < $num_headers-1)
echo $this->separator;
}
array_shift($headers);
$num_headers--;
echo $this->br;
// loop on every entry
foreach ($entries as $entry) {
//print the dn
$dn = $entry['dn'];
unset( $entry['dn'] );
echo $this->qualifier. $this->LdapEscape($dn).$this->qualifier.$this->separator;
// print the attributes
for($j=0;$j<$num_headers;$j++){
$attr_name = $headers[$j];
echo $this->qualifier;
if (key_exists($attr_name, $entry)) {
$binary_attribute = is_attr_binary( $ldap_info, $attr_name )?1:0;
$attr_values = $entry[$attr_name];
$num_attr_values = count( $attr_values );
for( $i=0 ; $i<$num_attr_values; $i++){
if($binary_attribute)
echo base64_encode($attr_values[$i]);
else
echo $this->LdapEscape($attr_values[$i]);
if($i < $num_attr_values - 1)
echo $this->multivalue_separator;
}
}// end if key
echo $this->qualifier;
if( $j < $num_headers - 1 )
echo $this->separator;
}
echo $this->br;
}
}//end export
// function to escape data, where the qualifier happens to also
// be in the data.
function LdapEscape ($var) {
return str_replace($this->qualifier, $this->escapeCode.$this->qualifier, $var);
}
}
/**
* @package phpLDAPadmin
*/
class MyCustomExporter extends PlaExporter{
function MyCutsomExporter($exporter){
$this->exporter = $exporter;
}
/**
* When doing an exporter, the method export need to be overriden.
* A basic implementation is provided here. Customize to your need
**/
function export(){
// With the method pla->get_ldap_info,
// you have access to some values related
// to you ldap server
$ldap_info = $this->pla_get_ldap_info();
$base_dn = $ldap_info->base_dn;
$server_id = $ldap_info->server_id;
$scope = $ldap_info->scope;
$server_name = $ldap_info->name;
$server_host = $ldap_info->host;
// Just a simple loop. For each entry
// do your custom export
// see PlaLdifExporter or PlaDsmlExporter as an example
while( $this->pla_has_entry() ){
$entry = $this->pla_fetch_entry_array();
//fetch the dn
$dn = $entry['dn'];
unset( $entry['dn'] );
// loop for the attributes
foreach( $entry as $attr_name=>$attr_values ){
foreach( $attr_values as $value ){
// simple example
// echo "Attribute Name:".$attr_name;
// echo " - value:".$value;
// echo $this->br;
}
}
}// end while
}
}
?>

File diff suppressed because it is too large Load Diff

View File

@@ -1,21 +0,0 @@
function trim(inputString) {
// Removes leading and trailing spaces from the passed string. Also removes
// consecutive spaces and replaces it with one space. If something besides
// a string is passed in (null, custom object, etc.) then return the input.
if (typeof inputString != "string") { return inputString; }
var retValue = inputString;
var ch = retValue.substring(0, 1);
while (ch == " ") { // Check for spaces at the beginning of the string
retValue = retValue.substring(1, retValue.length);
ch = retValue.substring(0, 1);
}
ch = retValue.substring(retValue.length-1, retValue.length);
while (ch == " ") { // Check for spaces at the end of the string
retValue = retValue.substring(0, retValue.length-1);
ch = retValue.substring(retValue.length-1, retValue.length);
}
while (retValue.indexOf(" ") != -1) { // Note that there are two spaces in the string - look for multiple spaces within the string
retValue = retValue.substring(0, retValue.indexOf(" ")) + retValue.substring(retValue.indexOf(" ")+1, retValue.length); // Again, there are two spaces in each of the strings
}
return retValue; // Return the trimmed string back to the user
}

View File

@@ -1,44 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/header.php,v 1.19 2005/09/25 16:11:44 wurley Exp $
/**
* @package phpLDAPadmin
*/
// We want to get $language into scope in case we were included
// from within a function
global $config;
$language = isset($config) ? $language = $config->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\"" );
@header( "Content-type: text/html; charset=\"UTF-8\"" );
// XML version and encoding for well-behaved browsers
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $language; ?>" lang="<?php echo $language; ?>" dir="ltr">
<head>
<?php if (isset($config) && $pagetitle = $config->GetValue('appearance','page_title')) { ?>
<title>phpLDAPadmin - <?php echo $pagetitle; ?></title>
<?php } else { ?>
<title>phpLDAPadmin</title>
<?php } ?>
<link rel="stylesheet" href="<?php echo CSSDIR ?>style.css" media="screen" />
<?php if( isset( $server_id ) ) {
$custom_file = get_custom_file( $server_id, 'style.css',CSSDIR );
if( strcmp( $custom_file, 'style.css' ) != 0 ) { ?>
<link rel="stylesheet" href="<?php echo $custom_file ?>" media="screen" />
<?php }
} ?>
<script src="<?php echo JSDIR; ?>entry_chooser.js" type="text/javascript"></script>
<script src="<?php echo JSDIR; ?>ie_png_work_around.js" type="text/javascript"></script>
<script src="<?php echo JSDIR; ?>search_util.js" type="text/javascript"></script>
<script src="<?php echo JSDIR; ?>generic_utils.js" type="text/javascript"></script>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>

View File

@@ -1,28 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/help.php,v 1.5 2005/02/26 12:35:05 wurley Exp $
/**
* @package phpLDAPadmin
*/
/**
*/
include './common.php';
include './header.php';
$forum_href = get_href( 'forum' );
?>
<body>
<h3 class="title">Help</h3>
<br />
<center>
<p>Do you have a problem or question?</p>
<p>Perhaps you are new to LDAP and need a little guidance?</p>
<p>Help is only one click away. Visit the online <a href="<?php echo $forum_href; ?>">phpLDAPadmin support forum</a>.</p>
<br />
</center>
</body>
</html>

186
hooks.php
View File

@@ -1,186 +0,0 @@
<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/hooks.php,v 1.6 2005/04/15 13:16:59 wurley Exp $
/**
* Functions related to hooks management.
*
* @author Benjamin Drieu <benjamin.drieu@fr.alcove.com> and Alcôve
* @package phpLDAPadmin
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* 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.
*
* @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.
*/
function sort_array_by_priority ( $a, $b ) {
return ( ( $a['priority'] < $b['priority'] ) ? -1 : 1 );
}
/**
* Runs procedures attached to a hook.
*
* @param hook_name Name of hook to run.
* @param args Array of optional arguments set by
* phpldapadmin. It is normally in a form known
* by call_user_func_array() :
* <pre>[ 'server_id' => 0,
* 'dn' => 'uid=epoussa,ou=tech,o=corp,o=fr' ]</pre>
*
* @return true if all procedures returned true, false otherwise.
*/
function run_hook ( $hook_name, $args ) {
global $hooks;
$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;
}
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" );
/** 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" );
while ( $rollbacks ) {
$rollback = array_pop ( $rollbacks );
if ( $rollback != false ) {
syslog_debug ( "Executing rollback $rollback\n" );
call_user_func_array ( $rollback, $args );
}
}
return false;
}
}
return true;
}
/**
* Adds a procedure to a hook for later execution.
*
* @param hook_name Name of the hook.
* @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;
if ( ! array_key_exists ( $hook_name, $hooks ) ) {
$hooks[$hook_name] = array();
}
array_push ( $hooks[$hook_name], array ( 'priority' => $priority, 'hook_function' => $hook_function,
'rollback_function' => $rollback_function ) );
uasort ( $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
* procedures of that priority will be
* removed.
* @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
* procedures that call this function
* as a rollback will be removed.
*/
function remove_hook ( $hook_name, $priority, $hook_function, $rollback_function ) {
global $hooks;
if ( array_key_exists ( $hook_name, $hooks ) ) {
reset ( $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] );
}
}
}
}
/**
* Removes all procedures from a hook.
*
* @param hook_name Name of hook to clear.
*/
function clear_hooks ( $hook_name ) {
global $hooks;
if ( array_key_exists ( $hook_name, $hooks ) ) {
unset ( $hooks[$hook_name] );
}
}
/* Evaluating user-made hooks */
if ( is_dir('hooks') ) {
$dir = dir ('hooks');
while (false !== ($entry = $dir -> read() ) ) {
if ( is_file ("hooks/$entry") and eregi ('php[0-9]?$', $entry) ) {
require_once "hooks/$entry";
}
}
$dir -> close();
}
?>

3
hooks/classes/README Normal file
View File

@@ -0,0 +1,3 @@
Put your hook class files here.
A file wich contains "class MyClass" definition must be called "MyClass.php".

1
hooks/functions/README Normal file
View File

@@ -0,0 +1 @@
Put your hook function files here.

402
hooks/functions/example.php Normal file
View File

@@ -0,0 +1,402 @@
<?php
/**
* An example of a hooks implementation.
*
* Functions should return true on success and false on failure.
* If a function returns false it will trigger the rollback to be executed.
*
* @author The phpLDAPadmin development team
* @package phpLDAPadmin
*/
/**
* This example hooks implementation will just show system_messages after each hooks is called.
*
* @package phpLDAPadmin
* @subpackage Functions
*/
# If you want to see this example in action, just comment out the return.
return false;
/**
* The post_session_init function is called after lib/common.php has completed its processing.
* This can be used to further initialise the session.
*
* No arguments are passed to post_session_init.
*/
function example_post_session_init() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Global Vars</i>: <small>%s</small>',join('| ',array_keys($GLOBALS))),
'type'=>'info','special'=>true));
return true;
}
add_hook('post_session_init','example_post_session_init');
/**
* This pre_connect function is called before making a connection to the LDAP server.
* While PLA makes many calls to connect to the LDAP server, this is called only once
* when caching is turned on.
*
* Arguments available are:
* @param int Server ID of the server to be connected to
* @param string Method. The user connection method, normally 'user'.
* @see post_connect
*/
function example_pre_connect() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Arguments</i>:<ul><li>Server ID: <small>%s</small></li><li>Method: <small>%s</small></li></ul>',$args[0],$args[1]),
'type'=>'info','special'=>true));
return true;
}
add_hook('pre_connect','example_pre_connect');
/**
* This post_connect function is called after making a connection to the LDAP server.
* While PLA makes many calls to connect to the LDAP server, this is called only once
* when caching is turned on.
*
* Arguments available are:
* @param int Server ID of the server to be connected to
* @param string Method. The user connection method, normally 'user'.
* @param string User ID of the user who successfully made the connection.
* @see pre_connect
*/
function example_post_connect() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Arguments</i>:<ul><li>Server ID: <small>%s</small></li><li>Method: <small>%s</small></li><li>User DN: <small>%s</small></li></ul>',$args[0],$args[1],$args[2]),
'type'=>'info','special'=>true));
return true;
}
add_hook('post_connect','example_post_connect');
/**
* This pre_entry_create function is called before an entry is created in ds_ldap_pla::add().
*
* Arguments available are:
* @param int Server ID of the server to be connected to
* @param string Method. The user connection method, normally 'user'.
* @param string DN of the entry created
* @param array Attributes for the new DN
* @see post_entry_create
*/
function example_pre_entry_create() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Arguments</i>:<ul><li>Server ID: <small>%s</small></li><li>Method: <small>%s</small></li><li>DN: <small>%s</small></li><li>Attributes: <small>%s</small></li></ul>',$args[0],$args[1],$args[2],join(',',(array_keys($args[3])))),
'type'=>'info','special'=>true));
return true;
}
add_hook('pre_entry_create','example_pre_entry_create');
/**
* This post_entry_create function is called after an entry is created in ds_ldap_pla::add().
*
* Arguments available are:
* @param int Server ID of the server to be connected to
* @param string Method. The user connection method, normally 'user'.
* @param string DN of the entry created
* @param array Attributes for the new DN
* @see pre_entry_create
*/
function example_post_entry_create() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Arguments</i>:<ul><li>Server ID: <small>%s</small></li><li>Method: <small>%s</small></li><li>DN: <small>%s</small></li><li>Attributes: <small>%s</small></li></ul>',$args[0],$args[1],$args[2],join(',',(array_keys($args[3])))),
'type'=>'info','special'=>true));
return true;
}
add_hook('post_entry_create','example_post_entry_create');
/**
* This pre_entry_delete function is called before an entry is deleted in ds_ldap_pla::delete().
*
* Arguments available are:
* @param int Server ID of the server to be connected to
* @param string Method. The user connection method, normally 'user'.
* @param string DN of the entry deleted
* @see post_entry_delete
*/
function example_pre_entry_delete() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Arguments</i>:<ul><li>Server ID: <small>%s</small></li><li>Method: <small>%s</small></li><li>DN: <small>%s</small></li></ul>',$args[0],$args[1],$args[2]),
'type'=>'info','special'=>true));
return true;
}
add_hook('pre_entry_delete','example_pre_entry_delete');
/**
* This post_entry_delete function is called after an entry is deleted in ds_ldap_pla::delete().
*
* Arguments available are:
* @param int Server ID of the server to be connected to
* @param string Method. The user connection method, normally 'user'.
* @param string DN of the entry deleted
* @see pre_entry_delete
*/
function example_post_entry_delete() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Arguments</i>:<ul><li>Server ID: <small>%s</small></li><li>Method: <small>%s</small></li><li>DN: <small>%s</small></li></ul>',$args[0],$args[1],$args[2]),
'type'=>'info','special'=>true));
return true;
}
add_hook('post_entry_delete','example_post_entry_delete');
/**
* This pre_entry_rename function is called before an entry is renamed in ds_ldap_pla::rename().
*
* Arguments available are:
* @param int Server ID of the server to be connected to
* @param string Method. The user connection method, normally 'user'.
* @param string Old DN of the entry to be renamed
* @param string New RDN for the new entry
* @param string Container for the new entry
* @see post_entry_rename
*/
function example_pre_entry_rename() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Arguments</i>:<ul><li>Server ID: <small>%s</small></li><li>Method: <small>%s</small></li><li>DN: <small>%s</small></li><li>New RDN: <small>%s</small></li><li>New Container: <small>%s</small></li></ul>',$args[0],$args[1],$args[2],$args[3],$args[4]),
'type'=>'info','special'=>true));
return true;
}
add_hook('pre_entry_rename','example_pre_entry_rename');
/**
* This post_entry_rename function is called after an entry is renamed in ds_ldap_pla::rename().
*
* Arguments available are:
* @param int Server ID of the server to be connected to
* @param string Method. The user connection method, normally 'user'.
* @param string Old DN of the entry to be renamed
* @param string New RDN for the new entry
* @param string Container for the new entry
* @see pre_entry_rename
*/
function example_post_entry_rename() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Arguments</i>:<ul><li>Server ID: <small>%s</small></li><li>Method: <small>%s</small></li><li>DN: <small>%s</small></li><li>New RDN: <small>%s</small></li><li>New Container: <small>%s</small></li></ul>',$args[0],$args[1],$args[2],$args[3],$args[4]),
'type'=>'info','special'=>true));
return true;
}
add_hook('post_entry_rename','example_post_entry_rename');
/**
* This pre_entry_modify function is called before an entry is modified in ds_ldap_pla::modify().
*
* Arguments available are:
* @param int Server ID of the server to be connected to
* @param string Method. The user connection method, normally 'user'.
* @param string DN of the entry to be modified
* @param array Attributes to be modified
* @see post_entry_modify
*/
function example_pre_entry_modify() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Arguments</i>:<ul><li>Server ID: <small>%s</small></li><li>Method: <small>%s</small></li><li>DN: <small>%s</small></li><li>Attributes: <small>%s</small></li></ul>',$args[0],$args[1],$args[2],join('|',array_keys($args[3]))),
'type'=>'info','special'=>true));
return true;
}
add_hook('pre_entry_modify','example_pre_entry_modify');
/**
* This post_entry_modify function is called after an entry is modified in ds_ldap_pla::modify().
*
* Arguments available are:
* @param int Server ID of the server to be connected to
* @param string Method. The user connection method, normally 'user'.
* @param string DN of the entry to be modified
* @param array Attributes to be modified
* @see pre_entry_modify
*/
function example_post_entry_modify() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Arguments</i>:<ul><li>Server ID: <small>%s</small></li><li>Method: <small>%s</small></li><li>DN: <small>%s</small></li><li>Attributes: <small>%s</small></li></ul>',$args[0],$args[1],$args[2],join('|',array_keys($args[3]))),
'type'=>'info','special'=>true));
return true;
}
add_hook('post_entry_modify','example_post_entry_modify');
// pre_attr_add
// post_attr_add
/**
* This pre_attr_add function is called before an attribute is deleted in ds_ldap_pla::modify().
*
* Arguments available are:
* @param int Server ID of the server to be connected to
* @param string Method. The user connection method, normally 'user'.
* @param string DN of the attribute to be deleted
* @param string Attribute to be deleted
* @param array Old values
* @see post_attr_add
*/
function example_pre_attr_add() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Arguments</i>:<ul><li>Server ID: <small>%s</small></li><li>Method: <small>%s</small></li><li>DN: <small>%s</small></li><li>Attribute: <small>%s</small></li><li>New Values: <small>%s</small></li></ul>',$args[0],$args[1],$args[2],$args[3],join('|',$args[4])),
'type'=>'info','special'=>true));
return true;
}
add_hook('pre_attr_add','example_pre_attr_add');
/**
* This post_attr_add function is called after an attribute is added in ds_ldap_pla::modify().
*
* Arguments available are:
* @param int Server ID of the server to be connected to
* @param string Method. The user connection method, normally 'user'.
* @param string DN of the attribute to be added
* @param string Attribute to be added
* @param array New values
* @see pre_attr_add
*/
function example_post_attr_add() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Arguments</i>:<ul><li>Server ID: <small>%s</small></li><li>Method: <small>%s</small></li><li>DN: <small>%s</small></li><li>Attribute: <small>%s</small></li><li>New Values: <small>%s</small></li></ul>',$args[0],$args[1],$args[2],$args[3],join('|',$args[4])),
'type'=>'info','special'=>true));
return true;
}
add_hook('post_attr_add','example_post_attr_add');
// pre_attr_modify
// post_attr_modify
/**
* This pre_attr_modify function is called before an attribute is modified in ds_ldap_pla::modify().
*
* Arguments available are:
* @param int Server ID of the server to be connected to
* @param string Method. The user connection method, normally 'user'.
* @param string DN of the attribute to be modified
* @param string Attribute to be modified
* @param array New values
* @see post_attr_modify
*/
function example_pre_attr_modify() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Arguments</i>:<ul><li>Server ID: <small>%s</small></li><li>Method: <small>%s</small></li><li>DN: <small>%s</small></li><li>Attribute: <small>%s</small></li><li>Old Values: <small>%s</small></li><li>New Values: <small>%s</small></li></ul>',$args[0],$args[1],$args[2],$args[3],join('|',$args[4]),join('|',$args[5])),
'type'=>'info','special'=>true));
return true;
}
add_hook('pre_attr_modify','example_pre_attr_modify');
/**
* This post_attr_modify function is called after an attribute is deleted in ds_ldap_pla::modify().
*
* Arguments available are:
* @param int Server ID of the server to be connected to
* @param string Method. The user connection method, normally 'user'.
* @param string DN of the attribute to be deleted
* @param string Attribute to be deleted
* @param array Old values
* @see pre_attr_modify
*/
function example_post_attr_modify() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Arguments</i>:<ul><li>Server ID: <small>%s</small></li><li>Method: <small>%s</small></li><li>DN: <small>%s</small></li><li>Attribute: <small>%s</small></li><li>Old Values: <small>%s</small></li><li>New Values: <small>%s</small></li></ul>',$args[0],$args[1],$args[2],$args[3],join('|',$args[4]),join('|',$args[5])),
'type'=>'info','special'=>true));
return true;
}
add_hook('post_attr_modify','example_post_attr_modify');
/**
* This pre_attr_delete function is called before an attribute is deleted in ds_ldap_pla::modify().
*
* Arguments available are:
* @param int Server ID of the server to be connected to
* @param string Method. The user connection method, normally 'user'.
* @param string DN of the attribute to be deleted
* @param string Attribute to be deleted
* @param array Old values
* @see post_attr_delete
*/
function example_pre_attr_delete() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Arguments</i>:<ul><li>Server ID: <small>%s</small></li><li>Method: <small>%s</small></li><li>DN: <small>%s</small></li><li>Attribute: <small>%s</small></li><li>Old Values: <small>%s</small></li></ul>',$args[0],$args[1],$args[2],$args[3],join('|',$args[4])),
'type'=>'info','special'=>true));
return true;
}
add_hook('pre_attr_delete','example_pre_attr_delete');
/**
* This post_attr_delete function is called after an attribute is deleted in ds_ldap_pla::modify().
*
* Arguments available are:
* @param int Server ID of the server to be connected to
* @param string Method. The user connection method, normally 'user'.
* @param string DN of the attribute to be deleted
* @param string Attribute to be deleted
* @param array Old values
* @see pre_attr_delete
*/
function example_post_attr_delete() {
$args = func_get_args();
system_message(array(
'title'=>sprintf('Hook called [%s]',__METHOD__),
'body'=>sprintf('<i>Arguments</i>:<ul><li>Server ID: <small>%s</small></li><li>Method: <small>%s</small></li><li>DN: <small>%s</small></li><li>Attribute: <small>%s</small></li><li>Old Values: <small>%s</small></li></ul>',$args[0],$args[1],$args[2],$args[3],join('|',$args[4])),
'type'=>'info','special'=>true));
return true;
}
add_hook('post_attr_delete','example_post_attr_delete');
?>

181
htdocs/add_attr_form.php Normal file
View File

@@ -0,0 +1,181 @@
<?php
/**
* Displays a form for adding an attribute/value to an LDAP entry.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require './common.php';
# The DN we are working with
$request = array();
$request['dn'] = get_request('dn','GET');
# Check if the entry exists.
if (! $request['dn'] || ! $app['server']->dnExists($request['dn']))
error(sprintf(_('The entry (%s) does not exist.'),$request['dn']),'error','index.php');
$request['page'] = new TemplateRender($app['server']->getIndex(),get_request('template','REQUEST',false,'none'));
$request['page']->setDN($request['dn']);
$request['page']->accept(true);
$request['template'] = $request['page']->getTemplate();
# Render the form
if (get_request('meth','REQUEST') != 'ajax') {
$request['page']->drawTitle(sprintf('%s <b>%s</b>',_('Add new attribute'),get_rdn($request['dn'])));
$request['page']->drawSubTitle();
echo '<center>';
if (count($request['template']->getAvailAttrs())) {
# If we have more than the configured entries, we'll separate our input to the old ways.
if (count($request['template']->getAvailAttrs()) > $_SESSION[APPCONFIG]->getValue('appearance','max_add_attrs')) {
$attr = array();
$attr['avail'] = array();
$attr['binary'] = array();
foreach ($request['template']->getAvailAttrs() as $attribute)
if ($app['server']->isAttrBinary($attribute->getName()))
array_push($attr['binary'],$attribute);
else
array_push($attr['avail'],$attribute);
if (count($attr['avail']) > 0) {
echo '<br />';
echo _('Add new attribute');
echo '<br />';
echo '<br />';
echo '<form action="cmd.php" method="post">';
if ($_SESSION[APPCONFIG]->getValue('confirm','update'))
echo '<input type="hidden" name="cmd" value="update_confirm" />';
else
echo '<input type="hidden" name="cmd" value="update" />';
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="dn" value="%s" />',htmlspecialchars($request['dn']));
echo '<select name="single_item_attr">';
foreach ($attr['avail'] as $attribute) {
# Is there a user-friendly translation available for this attribute?
if ($attribute->haveFriendlyName())
$attr_display = sprintf('%s (%s)',$attribute->getFriendlyName(),$attribute->getName(false));
else
$attr_display = $attribute->getName(false);
printf('<option value="%s">%s</option>',htmlspecialchars($attribute->getName()),$attr_display);
}
echo '</select>';
echo '<input type="text" name="single_item_value" size="20" />';
printf('<input type="submit" name="submit" value="%s" class="update_dn" />',_('Add'));
echo '</form>';
} else {
echo '<br />';
printf('<small>(%s)</small>',_('no new attributes available for this entry'));
}
if (count($attr['binary']) > 0) {
echo '<br />';
echo _('Add new binary attribute');
echo '<br />';
echo '<br />';
echo '<!-- Form to add a new BINARY attribute to this entry -->';
echo '<form action="cmd.php" method="post" enctype="multipart/form-data">';
if ($_SESSION[APPCONFIG]->getValue('confirm','update'))
echo '<input type="hidden" name="cmd" value="update_confirm" />';
else
echo '<input type="hidden" name="cmd" value="update" />';
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="dn" value="%s" />',$request['dn']);
echo '<input type="hidden" name="binary" value="true" />';
echo '<select name="single_item_attr">';
foreach ($attr['binary'] as $attribute) {
# Is there a user-friendly translation available for this attribute?
if ($attribute->haveFriendlyName())
$attr_display = sprintf('%s (%s)',$attribute->getFriendlyName(),$attribute->getName(false));
else
$attr_display = $attribute->getName(false);
printf('<option value="%s">%s</option>',htmlspecialchars($attribute->getName()),$attr_display);
}
echo '</select>';
echo '<input type="file" name="single_item_value" size="20" />';
printf('<input type="submit" name="submit" value="%s" class="update_dn" />',_('Add'));
if (! ini_get('file_uploads'))
printf('<br /><small><b>%s</b></small><br />',
_('Your PHP configuration has disabled file uploads. Please check php.ini before proceeding.'));
else
printf('<br /><small><b>%s: %s</b></small><br />',_('Maximum file size'),ini_get('upload_max_filesize'));
echo '</form>';
} else {
echo '<br />';
printf('<small>(%s)</small>',_('no new binary attributes available for this entry'));
}
} else {
echo '<br />';
$request['page']->drawFormStart();
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="dn" value="%s" />',htmlspecialchars($request['dn']));
echo '<table class="entry" cellspacing="0" align="center" border=0>';
foreach ($request['template']->getAvailAttrs() as $attribute)
$request['page']->draw('Template',$attribute);
$request['page']->drawFormSubmitButton();
echo '</table>';
$request['page']->drawFormEnd();
}
} else {
printf('<small>(%s)</small>',_('no new attributes available for this entry'));
}
echo '</center>';
# The ajax addition (it is going into an existing TemplateRendered page
} else {
# Put our DIV there for the callback
echo '<fieldset>';
printf('<legend>%s</legend>',_('Add Attribute'));
echo '<div id="ajADDATTR">';
echo '<table class="entry" cellspacing="0" align="center" border=0>';
echo '<td valign="top" align="center">';
printf('<select name="attr" onChange="ajDISPLAY(\'%s\',\'cmd=add_value_form&server_id=%s&dn=%s&meth=ajax&attr=\'+this.value,\'%s\',\'append\');">',
'ADDATTR',$app['server']->getIndex(),rawurlencode(get_request('dn','REQUEST')),_('Please Wait'));
printf('<option value="%s">%s</option>','','');
foreach ($request['template']->getAvailAttrs() as $attribute)
printf('<option value="%s">%s</option>',htmlspecialchars($attribute->getName()),$attribute->getFriendlyName());
echo '</select>';
echo '</td>';
echo '</table>';
echo '</div>';
echo '</fieldset>';
}
?>

115
htdocs/add_oclass_form.php Normal file
View File

@@ -0,0 +1,115 @@
<?php
/**
* This page will allow the adding of additional ObjectClasses to an item.
* + If the ObjectClass to be added requires additional MUST attributes to be
* defined, then they will be prompted for.
* + If the ObjectClass doesnt need any additional MUST attributes, then it
* will be silently added to the object.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require './common.php';
# The DN and OBJECTCLASS we are working with.
$request = array();
$request['dn'] = get_request('dn','REQUEST',true);
# Check if the entry exists.
if (! $request['dn'] || ! $app['server']->dnExists($request['dn']))
error(sprintf(_('The entry (%s) does not exist.'),$request['dn']),'error','index.php');
$request['page'] = new TemplateRender($app['server']->getIndex(),get_request('template','REQUEST',false,'none'));
$request['page']->setDN($request['dn']);
$request['page']->accept(true);
$request['template'] = $request['page']->getTemplate();
$attribute_factory = new AttributeFactory();
# Grab the required attributes for the new objectClass
$ldap = array();
$ldap['attrs']['must'] = array();
foreach ($request['template']->getAttribute('objectclass')->getValues() as $oclass_name) {
# Exclude "top" if its there.
if (! strcasecmp('top',$oclass_name))
continue;
if ($soc = $app['server']->getSchemaObjectClass($oclass_name))
$ldap['attrs']['must'] = array_merge($ldap['attrs']['must'],$soc->getMustAttrNames(true));
}
$ldap['attrs']['must'] = array_unique($ldap['attrs']['must']);
/* Build a list of the attributes that this new objectClass requires,
* but that the object does not currently contain */
$ldap['attrs']['need'] = array();
foreach ($ldap['attrs']['must'] as $attr)
if (is_null($request['template']->getAttribute($attr)))
array_push($ldap['attrs']['need'],$attribute_factory->newAttribute($attr,array('values'=>array()),$app['server']->getIndex()));
# Mark all the need attributes as shown
foreach ($ldap['attrs']['need'] as $index => $values)
$ldap['attrs']['need'][$index]->show();
if (count($ldap['attrs']['need']) > 0) {
$request['page']->drawTitle(sprintf('%s <b>%s</b>',_('Add new objectClass to'),get_rdn($request['dn'])));
$request['page']->drawSubTitle();
echo '<center>';
printf('<small><b>%s: </b>%s <b>%s</b> %s %s</small>',
_('Instructions'),
_('In order to add these objectClass(es) to this entry, you must specify'),
count($ldap['attrs']['need']),_('new attributes'),
_('that this objectClass requires.'));
echo '<br /><br />';
echo '<form action="cmd.php" method="post" name="entry_form">';
if ($_SESSION[APPCONFIG]->getValue('confirm','update'))
echo '<input type="hidden" name="cmd" value="update_confirm" />';
else
echo '<input type="hidden" name="cmd" value="update" />';
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="dn" value="%s" />',htmlspecialchars($request['dn']));
echo '<table class="entry" cellspacing="0">';
printf('<tr><th colspan="2">%s</th></tr>',_('New Required Attributes'));
$counter = 0;
foreach ($request['template']->getAttribute('objectclass')->getValues() as $value) {
echo '<tr><td colspan=2>';
$request['page']->draw('HiddenValue',$request['template']->getAttribute('objectclass'),$counter++);
echo '</td></tr>';
}
foreach ($ldap['attrs']['need'] as $count => $attr)
$request['page']->draw('Template',$attr);
echo '</table>';
echo '<br />';
printf('<center><input type="submit" value="%s" /></center>',_('Add ObjectClass and Attributes'));
echo '</form>';
echo '</center>';
# There are no other required attributes, so we just need to add the objectclass to the DN.
} else {
$result = $app['server']->modify($request['dn'],$request['template']->getLDAPmodify());
if ($result) {
$href = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s&modified_attrs[]=objectclass',
$app['server']->getIndex(),rawurlencode($request['dn']));
header(sprintf('Location: %s',$href));
die();
}
}
?>

170
htdocs/add_value_form.php Normal file
View File

@@ -0,0 +1,170 @@
<?php
/**
* Displays a form to allow the user to enter a new value to add
* to the existing list of values for a multi-valued attribute.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require './common.php';
# The DN and ATTR we are working with.
$request = array();
$request['dn'] = get_request('dn','GET',true);
$request['attr'] = get_request('attr','GET',true);
# Check if the entry exists.
if (! $request['dn'] || ! $app['server']->dnExists($request['dn']))
error(sprintf(_('The entry (%s) does not exist.'),$request['dn']),'error','index.php');
$request['page'] = new TemplateRender($app['server']->getIndex(),get_request('template','REQUEST',false,'none'));
$request['page']->setDN($request['dn']);
$request['page']->accept(true);
$request['template'] = $request['page']->getTemplate();
/*
if ($request['attribute']->isReadOnly())
error(sprintf(_('The attribute (%s) is in readonly mode.'),$request['attr']),'error','index.php');
*/
# Render the form
if (get_request('meth','REQUEST') != 'ajax') {
# Render the form.
$request['page']->drawTitle(sprintf('%s <b>%s</b> %s <b>%s</b>',_('Add new'),$request['attr'],_('value to'),get_rdn($request['dn'])));
$request['page']->drawSubTitle();
if (! strcasecmp($request['attr'],'objectclass')) {
echo '<form action="cmd.php" method="post" class="new_value" name="entry_form">';
echo '<input type="hidden" name="cmd" value="add_oclass_form" />';
} else {
echo '<form action="cmd.php" method="post" class="new_value" name="entry_form" enctype="multipart/form-data" onSubmit="return submitForm(this)">';
if ($_SESSION[APPCONFIG]->getValue('confirm','update'))
echo '<input type="hidden" name="cmd" value="update_confirm" />';
else
echo '<input type="hidden" name="cmd" value="update" />';
}
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="dn" value="%s" />',htmlspecialchars($request['dn']));
echo '<center>';
echo '<table class="forminput" border=0>';
echo '<tr>';
$request['attribute'] = $request['template']->getAttribute($request['attr']);
$request['count'] = $request['attribute']->getValueCount();
if ($request['count']) {
printf('<td class="top">%s <b>%s</b> %s <b>%s</b>:</td>',
_('Current list of'),$request['count'],_('values for attribute'),$request['attribute']->getFriendlyName());
echo '<td>';
# Display current attribute values
echo '<table border=0><tr><td>';
for ($i=0;$i<$request['count'];$i++) {
if ($i > 0)
echo '<br/>';
$request['page']->draw('CurrentValue',$request['attribute'],$i);
$request['page']->draw('HiddenValue',$request['attribute'],$i);
}
echo '</td></tr></table>';
echo '</td>';
} else {
printf('<td>%s <b>%s</b>.</td>',
_('No current value for attribute'),$request['attribute']->getFriendlyName());
echo '<td><br /><br /></td>';
}
echo '</tr>';
echo '<tr>';
printf('<td class="top">%s</td>',_('Enter the value(s) you would like to add:'));
echo '<td>';
if (! strcasecmp($request['attr'],'objectclass')) {
# If our attr is an objectClass, fetch all available objectClasses and remove those from the list that are already defined in the entry
$socs = $app['server']->SchemaObjectClasses();
foreach ($request['attribute']->getValues() as $oclass)
unset($socs[strtolower($oclass)]);
# Draw objectClass selection
echo '<table border=0>';
echo '<tr><td>';
echo '<select name="new_values[objectclass][]" multiple="true" size="15">';
foreach ($socs as $name => $oclass) {
# Exclude any structural ones, that are not in the heirachy, as they'll only generate an LDAP_OBJECT_CLASS_VIOLATION
if (($oclass->getType() == 'structural') && ! $oclass->isRelated($request['attribute']->getValues()))
continue;
printf('<option value="%s">%s</option>',$oclass->getName(false),$oclass->getName(false));
}
echo '</select>';
echo '</td></tr><tr><td>';
echo '<br />';
printf('<input id="save_button" type="submit" value="%s" />',_('Add new ObjectClass'));
echo '</td></tr></table>';
echo '</td>';
echo '</tr>';
if ($_SESSION[APPCONFIG]->getValue('appearance','show_hints'))
printf('<tr><td colspan=2><small><br /><img src="%s/light.png" alt="Hint" /><span class="hint">%s</span></small></td></tr>',
IMGDIR,_('Note: You may be required to enter new attributes that these objectClass(es) require'));
echo '</table>';
echo '</center>';
echo '</form>';
} else {
# Draw a blank field
echo '<table border=0><tr><td>';
$request['page']->draw('FormValue',$request['attribute'],$request['count']);
echo '</td></tr><tr><td>';
$sattr = $app['server']->getSchemaAttribute($request['attr']);
if ($sattr->getDescription())
printf('<small><b>%s:</b> %s</small><br />',_('Description'),$sattr->getDescription());
if ($sattr->getType())
printf('<small><b>%s:</b> %s</small><br />',_('Syntax'),$sattr->getType());
if ($sattr->getMaxLength())
printf('<small><b>%s:</b> %s %s</small><br />',
_('Maximum Length'),number_format($sattr->getMaxLength()),_('characters'));
echo '<br />';
printf('<input type="submit" id="save_button" name="submit" value="%s" />',_('Add New Value'));
echo '</td></tr></table>';
echo '</td></tr>';
echo '</table>';
echo '</center>';
echo '</form>';
}
} else {
if (is_null($attribute = $request['template']->getAttribute($request['attr']))) {
$request['template']->addAttribute($request['attr'],array('values'=>array()));
$attribute = $request['template']->getAttribute($request['attr']);
$attribute->show();
echo '<table class="entry" cellspacing="0" align="center" border=0>';
$request['page']->draw('Template',$attribute);
echo '</table>';
} else {
$request['count'] = $attribute->getValueCount();
$request['page']->draw('FormReadWriteValue',$attribute,$request['count']);
}
}
?>

80
htdocs/cmd.php Normal file
View File

@@ -0,0 +1,80 @@
<?php
/**
* Main command page for phpLDAPadmin
* All pages are rendered through this script.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require_once './common.php';
$www = array();
$www['cmd'] = get_request('cmd','REQUEST');
$www['meth'] = get_request('meth','REQUEST');
ob_start();
switch ($www['cmd']) {
case '_debug':
debug_dump($_REQUEST,1);
break;
default:
if (defined('HOOKSDIR') && file_exists(HOOKSDIR.$www['cmd'].'.php'))
$app['script_cmd'] = HOOKSDIR.$www['cmd'].'.php';
elseif (defined('HTDOCDIR') && file_exists(HTDOCDIR.$www['cmd'].'.php'))
$app['script_cmd'] = HTDOCDIR.$www['cmd'].'.php';
elseif (file_exists('welcome.php'))
$app['script_cmd'] = 'welcome.php';
else
$app['script_cmd'] = null;
}
if (DEBUG_ENABLED)
debug_log('Ready to render page for command [%s,%s].',128,0,__FILE__,__LINE__,__METHOD__,$www['cmd'],$app['script_cmd']);
# Create page.
# Set the index so that we render the right server tree.
$www['page'] = new page($app['server']->getIndex());
# See if we can render the command
if (trim($www['cmd'])) {
# If this is a READ-WRITE operation, the LDAP server must not be in READ-ONLY mode.
if ($app['server']->isReadOnly() && ! in_array(get_request('cmd','REQUEST'),$app['readwrite_cmds']))
error(_('You cannot perform updates while server is in read-only mode'),'error','index.php');
# If this command has been disabled by the config.
if (! $_SESSION[APPCONFIG]->isCommandAvailable('script',$www['cmd']))
system_message(array('title'=>_('Command disabled by the server configuration'),
_('Error'),'body'=>sprintf('%s: <b>%s</b>.',_('The command could not be run'),$www['cmd']),'type'=>'error'),'index.php');
}
if ($app['script_cmd'])
include $app['script_cmd'];
# Refresh a frame - this is so that one frame can trigger another frame to be refreshed.
if (isAjaxEnabled() && get_request('refresh','REQUEST') && get_request('refresh','REQUEST') != get_request('frame','REQUEST')) {
echo '<script type="text/javascript" language="javascript">';
printf("ajDISPLAY('%s','cmd=refresh&server_id=%s&meth=ajax&noheader=%s','%s');",
get_request('refresh','REQUEST'),$app['server']->getIndex(),get_request('noheader','REQUEST',false,0),_('Auto refresh'));
echo '</script>';
}
# Capture the output and put into the body of the page.
$www['body'] = new block();
$www['body']->SetBody(ob_get_contents());
$www['page']->block_add('body',$www['body']);
ob_end_clean();
if ($www['meth'] == 'ajax')
$www['page']->show(get_request('frame','REQUEST',false,'BODY'),true,get_request('raw','REQUEST',false,false));
else
$www['page']->display();
?>

27
htdocs/collapse.php Normal file
View File

@@ -0,0 +1,27 @@
<?php
/**
* This script alters the session variable 'tree', collapsing it
* at the dn specified in the query string.
*
* Note: this script is equal and opposite to expand.php
*
* @package phpLDAPadmin
* @subpackage Tree
* @see expand.php
*/
/**
*/
require './common.php';
$dn = get_request('dn','GET',true);
$tree = get_cached_item($app['server']->getIndex(),'tree');
$entry = $tree->getEntry($dn);
$entry->close();
set_cached_item($app['server']->getIndex(),'tree','null',$tree);
header(sprintf('Location:index.php?server_id=%s&junk=%s#%s%s',
$app['server']->getIndex(),random_junk(),htmlid($app['server']->getIndex(),$dn),app_session_param()));
die();
?>

14
htdocs/common.php Normal file
View File

@@ -0,0 +1,14 @@
<?php
/**
* This script provides a convienent method to call the proper common.php
*
* @package phpLDAPadmin
*/
/**
*/
if (! defined('LIBDIR'))
define('LIBDIR',sprintf('%s/',realpath('../lib/')));
require_once LIBDIR.'common.php';
?>

187
htdocs/compare.php Normal file
View File

@@ -0,0 +1,187 @@
<?php
/**
* Compares two DN entries side by side.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require './common.php';
# The DNs we are working with
$request = array();
$request['dnSRC'] = get_request('dn_src');
$request['dnDST'] = get_request('dn_dst');
$ldap = array();
$ldap['SRC'] = $_SESSION[APPCONFIG]->getServer(get_request('server_id_src'));
$ldap['DST'] = $_SESSION[APPCONFIG]->getServer(get_request('server_id_dst'));
if (! $ldap['SRC']->dnExists($request['dnSRC']))
error(sprintf('%s (%s)',_('No such entry.'),pretty_print_dn($request['dnSRC'])),'error','index.php');
if (! $ldap['DST']->dnExists($request['dnDST']))
error(sprintf('%s (%s)',_('No such entry.'),pretty_print_dn($request['dnDST'])),'error','index.php');
$request['pageSRC'] = new PageRender($ldap['SRC']->getIndex(),get_request('template','REQUEST',false,'none'));
$request['pageSRC']->setDN($request['dnSRC']);
$request['pageSRC']->accept();
$request['templateSRC'] = $request['pageSRC']->getTemplate();
$request['pageDST'] = new PageRender($ldap['DST']->getIndex(),get_request('template','REQUEST',false,'none'));
$request['pageDST']->setDN($request['dnDST']);
$request['pageDST']->accept();
$request['templateDST'] = $request['pageDST']->getTemplate();
# Get a list of all attributes.
$attrs_all = array_unique(array_merge($request['templateSRC']->getAttributeNames(),$request['templateDST']->getAttributeNames()));
$request['pageSRC']->drawTitle(_('Comparing the following DNs'));
echo '<br/>';
echo '<table class="entry" width=100% border=0>';
echo '<tr class="heading">';
$href = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s',
$ldap['SRC']->getIndex(),rawurlencode($request['dnSRC']));
printf('<td colspan=2 width=40%%>%s: <b>%s</b><br />%s: <b><a href="%s">%s</a></b></td>',
_('Server'),$ldap['SRC']->getName(),_('Distinguished Name'),
htmlspecialchars($href),$request['dnSRC']);
$href = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s',
$ldap['DST']->getIndex(),rawurlencode($request['dnDST']));
printf('<td colspan=2 width=40%%>%s: <b>%s</b><br />%s: <b><a href="%s">%s</a></b></td>',
_('Server'),$ldap['DST']->getName(),_('Distinguished Name'),
htmlspecialchars($href),$request['dnDST']);
echo '</tr>';
echo '<tr>';
echo '<td colspan=4 align=right>';
echo '<form action="cmd.php?cmd=compare" method="post" name="compare_form">';
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="server_id_src" value="%s" />',$ldap['DST']->getIndex());
printf('<input type="hidden" name="server_id_dst" value="%s" />',$ldap['SRC']->getIndex());
printf('<input type="hidden" name="dn_src" value="%s" />',htmlspecialchars($request['dnDST']));
printf('<input type="hidden" name="dn_dst" value="%s" />',htmlspecialchars($request['dnSRC']));
printf('<input type="submit" value="%s" />',_('Switch Entry'));
echo '</form>';
echo '</td>';
echo '</tr>';
if (! is_array($attrs_all) || ! count($attrs_all)) {
printf('<tr><td colspan="4">(%s)</td></tr>',_('This entry has no attributes'));
print '</table>';
return;
}
sort($attrs_all);
# Work through each of the attributes.
foreach ($attrs_all as $attr) {
# Has the config.php specified that this attribute is to be hidden or shown?
if ($ldap['SRC']->isAttrHidden($attr) || $ldap['DST']->isAttrHidden($attr))
continue;
$attributeSRC = $request['templateSRC']->getAttribute($attr);
$attributeDST = $request['templateDST']->getAttribute($attr);
# Get the values and see if they are the same.
if ($attributeSRC && $attributeDST && ($attributeSRC->getValues() == $attributeDST->getValues()))
echo '<tr>';
else
echo '<tr>';
foreach (array('src','dst') as $side) {
# If we are on the source side, show the attribute name.
switch ($side) {
case 'src':
if ($attributeSRC) {
echo '<td class="title">';
$request['pageSRC']->draw('Name',$attributeSRC);
echo '</td>';
if ($request['pageSRC']->getServerID() == $request['pageDST']->getServerID())
echo '<td class="title">&nbsp;</td>';
else {
echo '<td class="note" align="right">';
$request['pageSRC']->draw('Notes',$attributeSRC);
echo '</td>';
}
} else {
echo '<td colspan=2>&nbsp;</td>';
}
break;
case 'dst':
if ($attributeDST) {
if ($attributeSRC && ($request['pageSRC']->getServerID() == $request['pageDST']->getServerID()))
echo '<td class="title">&nbsp;</td>';
else {
echo '<td class="title" >';
$request['pageDST']->draw('Name',$attributeDST);
echo '</td>';
}
echo '<td class="note" align="right">';
$request['pageDST']->draw('Notes',$attributeDST);
echo '</td>';
} else {
echo '<td colspan=2>&nbsp;</td>';
}
break;
}
}
echo '</tr>';
echo "\n\n";
# Get the values and see if they are the same.
if ($attributeSRC && $attributeDST && ($attributeSRC->getValues() == $attributeDST->getValues()))
echo '<tr style="background-color: #F0F0F0;">';
else
echo '<tr>';
foreach (array('src','dst') as $side) {
switch ($side) {
case 'src':
echo '<td class="value" colspan=2><table border=0>';
if ($attributeSRC && count($attributeSRC->getValues()))
$request['pageSRC']->draw('CurrentValues',$attributeSRC);
else
echo '<tr><td>&nbsp;</td></tr>';
echo '</table></td>';
break;
case 'dst':
echo '<td class="value" colspan=2><table>';
if ($attributeDST && count($attributeDST->getValues()))
$request['pageDST']->draw('CurrentValues',$attributeDST);
else
echo '<tr><td>&nbsp;</td></tr>';
echo '</table></td>';
break;
}
}
echo '</tr>';
}
echo '</table>';
?>

63
htdocs/compare_form.php Normal file
View File

@@ -0,0 +1,63 @@
<?php
/**
* Compares two DN entries side by side.
* This is the entry form to determine which DN to compare this DN with.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require './common.php';
# The DN we are working with
$request = array();
$request['dn'] = get_request('dn','GET');
# Check if the entry exists.
if (! $request['dn'] || ! $app['server']->dnExists($request['dn']))
error(sprintf(_('The entry (%s) does not exist.'),$request['dn']),'error','index.php');
$request['page'] = new PageRender($app['server']->getIndex(),get_request('template','REQUEST',false,'none'));
$request['page']->setDN($request['dn']);
$request['page']->accept();
# Render the form
$request['page']->drawTitle(sprintf('%s <b>%s</b>',_('Compare another DN with'),get_rdn($request['dn'])));
$request['page']->drawSubTitle();
printf('<script type="text/javascript" language="javascript" src="%sdnChooserPopup.js"></script>',JSDIR);
echo '<center>';
printf('%s <b>%s</b> %s<br />',_('Compare'),get_rdn($request['dn']),_('with '));
echo '<form action="cmd.php" method="post" name="compare_form">';
echo '<input type="hidden" name="cmd" value="compare" />';
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="server_id_src" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="dn_src" value="%s" />',htmlspecialchars($request['dn']));
echo "\n";
echo '<table style="border-spacing: 10px">';
echo '<tr>';
printf('<td><acronym title="%s">%s</acronym>:</td>',
_('Compare this DN with another'),_('Destination DN'));
echo '<td>';
echo '<input type="text" name="dn_dst" size="45" value="" />';
draw_chooser_link('compare_form.dn_dst','true','');
echo '</td>';
echo '</tr>';
echo "\n";
printf('<tr><td>%s:</td><td>%s</td></tr>',_('Destination Server'),server_select_list($app['server']->getIndex(),true,'server_id_dst'));
echo "\n";
printf('<tr><td colspan="2" align="right"><input type="submit" value="%s" /></td></tr>',_('Compare'));
echo "\n";
echo '</table>';
echo '</form>';
echo '</center>';
?>

182
htdocs/copy.php Normal file
View File

@@ -0,0 +1,182 @@
<?php
/**
* Copies a given object to create a new one.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require './common.php';
# The DNs we are working with
$request = array();
$request['dnSRC'] = get_request('dn_src');
$request['dnDST'] = get_request('dn_dst');
$ldap = array();
$ldap['SRC'] = $_SESSION[APPCONFIG]->getServer(get_request('server_id_src'));
$ldap['DST'] = $_SESSION[APPCONFIG]->getServer(get_request('server_id_dst'));
# Error checking
if (! trim($request['dnDST']))
error(_('You left the destination DN blank.'),'error','index.php');
if ($ldap['DST']->isReadOnly())
error(_('Destination server is currently READ-ONLY.'),'error','index.php');
if ($ldap['DST']->dnExists($request['dnDST']))
error(sprintf(_('The destination entry (%s) already exists.'),pretty_print_dn($request['dnDST'])),'error','index.php');
if (! $ldap['DST']->dnExists($ldap['DST']->getContainer($request['dnDST'])))
error(sprintf(_('The destination container (%s) does not exist.'),
pretty_print_dn($ldap['DST']->getContainer($request['dnDST']))),'error','index.php');
if (pla_compare_dns($request['dnSRC'],$request['dnDST']) == 0 && $ldap['SRC']->getIndex() == $ldap['DST']->getIndex())
error(_('The source and destination DN are the same.'),'error','index.php');
$request['recursive'] = (get_request('recursive') == 'on') ? true : false;
$request['remove'] = (get_request('remove') == 'yes') ? true : false;
if ($request['recursive']) {
$filter = get_request('filter','POST',false,'(objectClass=*)');
# Build a tree similar to that of the tree browser to give to r_copy_dn
$ldap['tree'] = array();
printf('<h3 class="title">%s%s</h3>',_('Copying '),$request['dnSRC']);
printf('<h3 class="subtitle">%s</h3>',_('Recursive copy progress'));
print '<br /><br />';
print '<small>';
printf ('%s...',_('Building snapshot of tree to copy'));
$ldap['tree'] = build_tree($ldap['SRC'],$request['dnSRC'],array(),$filter);
printf('<span style="color:green">%s</span><br />',_('Success'));
# Prevent script from bailing early on a long delete
@set_time_limit(0);
$copy_result = r_copy_dn($ldap['SRC'],$ldap['DST'],$ldap['tree'],$request['dnSRC'],$request['dnDST'],$request['remove']);
$copy_message = $copy_result;
print '</small>';
} else {
$copy_result = copy_dn($ldap['SRC'],$ldap['DST'],$request['dnSRC'],$request['dnDST'],$request['remove']);
if ($copy_result)
$copy_message = sprintf('%s %s: <b>%s</b> %s',
$request['remove'] ? _('Move successful') : _('Copy successful'),
_('DN'),$request['dnDST'],_('has been created.'));
else
$copy_message = sprintf('%s %s: <b>%s</b> %s',
$request['remove'] ? _('Move NOT successful') : _('Copy NOT successful'),
_('DN'),$request['dnDST'],_('has NOT been created.'));
}
if ($copy_result) {
$redirect_url = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s&refresh=SID_%s_nodes&noheader=1',
$ldap['DST']->getIndex(),rawurlencode($request['dnDST']),$ldap['DST']->getIndex());
system_message(array(
'title'=>_('Copy Entry'),
'body'=>$copy_message,
'type'=>'info'),
$redirect_url);
}
function r_copy_dn($serverSRC,$serverDST,$snapshottree,$dnSRC,$dnDST,$remove) {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',1,0,__FILE__,__LINE__,__METHOD__,$fargs);
$copy_message = array();
$children = isset($snapshottree[$dnSRC]) ? $snapshottree[$dnSRC] : null;
# If we have children, then we need to copy, then delete for a move
if (is_array($children) && count($children)) {
$copy_result = copy_dn($serverSRC,$serverDST,$dnSRC,$dnDST,false);
if (! $copy_result)
return false;
array_push($copy_message,sprintf('%s %s: <b>%s</b> %s',_('Copy successful'),_('DN'),$dnDST,_('has been created.')));
$hadError = false;
foreach ($children as $child_dn) {
$dnDST_new = sprintf('%s,%s',get_rdn($child_dn),$dnDST);
$copy_result = r_copy_dn($serverSRC,$serverDST,$snapshottree,$child_dn,$dnDST_new,$remove);
$copy_message = array_merge($copy_message,array_values($copy_result));
if (! $copy_result)
$hadError = true;
}
if (! $hadError && $remove) {
$delete_result = $serverSRC->delete($dnSRC);
if ($delete_result)
array_push($copy_message,sprintf('%s %s: <b>%s</b> %s',_('Delete successful'),_('DN'),$dnDST,_('has been deleted.')));
}
} else {
$copy_result = copy_dn($serverSRC,$serverDST,$dnSRC,$dnDST,$remove);
if ($copy_result)
array_push($copy_message,sprintf('%s %s: <b>%s</b> %s',
$remove ? _('Move successful') : _('Copy successful'),
_('DN'),$dnDST,_('has been created.')));
else
array_push($copy_message,sprintf('%s %s: <b>%s</b> %s',
$remove ? _('Move NOT successful') : _('Copy NOT successful'),
_('DN'),$dnDST,_('has NOT been created.')));
}
return $copy_message;
}
function copy_dn($serverSRC,$serverDST,$dnSRC,$dnDST,$remove) {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',1,0,__FILE__,__LINE__,__METHOD__,$fargs);
$request = array();
$request['pageSRC'] = new PageRender($serverSRC->getIndex(),get_request('template','REQUEST',false,'none'));
$request['pageSRC']->setDN($dnSRC);
$request['pageSRC']->accept();
$request['pageDST'] = new PageRender($serverDST->getIndex(),get_request('template','REQUEST',false,'none'));
$request['pageDST']->setContainer($serverDST->getContainer($dnDST));
$request['pageDST']->accept();
$request['templateSRC'] = $request['pageSRC']->getTemplate();
$request['templateDST'] = $request['pageDST']->getTemplate();
$request['templateDST']->copy($request['pageSRC']->getTemplate(),get_rdn($dnDST,0));
# Create of move the entry
if ($remove)
return $serverDST->rename($request['templateSRC']->getDN(),$request['templateDST']->getRDN(),$serverDST->getContainer($dnDST),true);
else
return $serverDST->add($request['templateDST']->getDN(),$request['templateDST']->getLDAPadd());
}
function build_tree($server,$dn,$buildtree) {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',1,0,__FILE__,__LINE__,__METHOD__,$fargs);
# We search all children, not only the visible children in the tree
$children = $server->getContainerContents($dn,null,0);
if (count($children)) {
$buildtree[$dn] = $children;
foreach ($children as $child_dn)
$buildtree = build_tree($server,$child_dn,$buildtree);
}
if (DEBUG_ENABLED)
debug_log('Returning (%s)',1,0,__FILE__,__LINE__,__METHOD__,$buildtree);
return $buildtree;
}
?>

101
htdocs/copy_form.php Normal file
View File

@@ -0,0 +1,101 @@
<?php
/**
* Copies a given object to create a new one.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require './common.php';
# The DN we are working with
$request = array();
$request['dn'] = get_request('dn','GET');
# Check if the entry exists.
if (! $request['dn'] || ! $app['server']->dnExists($request['dn']))
error(sprintf(_('The entry (%s) does not exist.'),$request['dn']),'error','index.php');
$request['page'] = new PageRender($app['server']->getIndex(),get_request('template','REQUEST',false,'none'));
$request['page']->setDN($request['dn']);
$request['page']->accept();
# Render the form
$request['page']->drawTitle(sprintf('%s <b>%s</b>',_('Copy'),get_rdn($request['dn'])));
$request['page']->drawSubTitle();
printf('<script type="text/javascript" language="javascript" src="%sdnChooserPopup.js"></script>',JSDIR);
echo '<center>';
printf('%s <b>%s</b> %s:<br /><br />',_('Copy'),get_rdn($request['dn']),_('to a new object'));
echo '<form action="cmd.php" method="post" name="copy_form">';
echo '<input type="hidden" name="cmd" value="copy" />';
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="server_id_src" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="dn_src" value="%s" />',htmlspecialchars($request['dn']));
echo "\n";
echo '<table style="border-spacing: 10px">';
echo '<tr>';
printf('<td><acronym title="%s">%s</acronym>:</td>',
_('The full DN of the new entry to be created when copying the source entry'),_('Destination DN'));
echo '<td>';
printf('<input type="text" name="dn_dst" size="45" value="%s" />',htmlspecialchars($request['dn']));
draw_chooser_link('copy_form.dn_dst','true',get_rdn($request['dn']));
echo '</td>';
echo '</tr>';
echo "\n";
printf('<tr><td>%s:</td><td>%s</td></tr>',_('Destination Server'),server_select_list($app['server']->getIndex(),true,'server_id_dst'));
echo "\n";
# We search all children, not only the visible children in the tree
$request['children'] = $app['server']->getContainerContents($request['dn']);
if (count($request['children']) > 0) {
echo '<tr>';
printf('<td><label for="recursive">%s</label>:</td>',_('Recursive copy'));
echo '<td><input type="checkbox" id="recursive" name="recursive" onClick="copy_field_toggle(this)" />';
printf('<small>(%s)</small></td>',_('Recursively copy all children of this object as well.'));
echo '</tr>';
echo "\n";
echo '<tr>';
printf('<td><acronym title="%s">%s</acronym>:</td>',
_('When performing a recursive copy, only copy those entries which match this filter'),_('Filter'));
echo '<td><input type="text" name="filter" value="(objectClass=*)" size="45" disabled />';
echo '</tr>';
echo "\n";
echo '<tr>';
printf('<td>%s</td>',_('Delete after copy (move):'));
echo '<td><input type="checkbox" name="remove" value="yes" disabled />';
printf('<small>(%s)</small)</td>',_('Make sure your filter (above) will select all child records.'));
echo '</tr>';
echo "\n";
} else {
printf('<tr><td>%s</td><td><input type="checkbox" name="remove" value="yes"/></td></tr>',_('Delete after copy (move):'));
}
echo "\n";
printf('<tr><td colspan="2" align="right"><input type="submit" value="%s" /></td></tr>',_('Copy '));
echo "\n";
echo '</table>';
echo '</form>';
if ($_SESSION[APPCONFIG]->getValue('appearance','show_hints'))
printf('<small><img src="%s/light.png" alt="Light" /><span class="hint">%s</span></small>',
IMGDIR,_('Hint: Copying between different servers only works if there are no schema violations'));
echo '</center>';
# Draw the javascrpt to enable/disable the filter field if this may be a recursive copy
if (count($request['children']) > 0)
printf('<script type="text/javascript" language="javascript" src="%sform_field_toggle_enable.js"></script>',JSDIR);
?>

106
htdocs/create.php Normal file
View File

@@ -0,0 +1,106 @@
<?php
/**
* Creates a new object in LDAP.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require './common.php';
# If cancel was selected, we'll redirect
if (get_request('cancel','REQUEST')) {
header('Location: index.php');
die();
}
$request = array();
$request['redirect'] = get_request('redirect','POST',false,false);
$request['page'] = new PageRender($app['server']->getIndex(),get_request('template','REQUEST',false,'none'));
$request['page']->setContainer(get_request('container','REQUEST',true));
$request['page']->accept();
$request['template'] = $request['page']->getTemplate();
if (! $request['template']->getContainer() || ! $app['server']->dnExists($request['template']->getContainer()))
error(sprintf(_('The container you specified (%s) does not exist. Please try again.'),$request['template']->getContainer()),'error','index.php');
# Check if the container is a leaf - we shouldnt really return a hit here, the template engine shouldnt have allowed a user to attempt to create an entry...
$tree = get_cached_item($app['server']->getIndex(),'tree');
$request['container'] = $tree->getEntry($request['template']->getContainer());
if (! $request['container'])
$tree->addEntry($request['template']->getContainer());
$request['container'] = $tree->getEntry($request['template']->getContainer());
if ($request['container']->isLeaf())
error(sprintf(_('The container (%s) is a leaf.'),$request['template']->getContainer()),'error','index.php');
# Check our RDN
if (! count($request['template']->getRDNAttrs()))
error(_('The were no attributes marked as an RDN attribute.'),'error','index.php');
if (! $request['template']->getRDN())
error(_('The RDN field is empty?'),'error','index.php');
# Some other attribute checking...
foreach ($request['template']->getAttributes() as $attribute) {
# Check that our Required Attributes have a value - we shouldnt really return a hit here, the template engine shouldnt have allowed this to slip through.
# @todo this isIgnoredAttr() function is missing?
if ($attribute->isRequired() && ! count($attribute->getValues()) && ! $app['server']->isIgnoredAttr($attr->getName()))
error(sprintf(_('You left the value blank for required attribute (%s).'),
$attribute->getName(false)),'error','index.php');
}
# Create the entry
$add_result = $app['server']->add($request['template']->getDN(),$request['template']->getLDAPadd());
if ($add_result) {
$action_number = $_SESSION[APPCONFIG]->getValue('appearance','action_after_creation');
$href = sprintf('cmd=template_engine&server_id=%s',$app['server']->getIndex());
if ($request['redirect'])
$redirect_url = $request['redirect'];
else if ($action_number == 2)
$redirect_url = sprintf('cmd.php?%s&template=%s&container=%s',
$href,$request['template']->getID(),rawurlencode($request['template']->getContainer()));
else
$redirect_url = sprintf('cmd.php?%s&template=%s&dn=%s',
$href,$request['template']->getID(),rawurlencode($request['template']->getDN()));
if ($action_number == 1 || $action_number == 2)
printf('<meta http-equiv="refresh" content="0; url=%s" />',$redirect_url);
if ($action_number == 1 || $action_number == 2) {
$create_message = sprintf('%s %s: <b>%s</b> %s',
_('Creation successful!'),_('DN'),$request['template']->getDN(),_('has been created.'));
if (isAjaxEnabled())
$redirect_url .= sprintf('&refresh=SID_%s_nodes&noheader=1',$app['server']->getIndex());
system_message(array(
'title'=>_('Create Entry'),
'body'=>$create_message,
'type'=>'info'),
$redirect_url);
} else {
$request['page']->drawTitle(_('Entry created'));
$request['page']->drawSubTitle(sprintf('%s: <b>%s</b>&nbsp;&nbsp;&nbsp;%s: <b>%s</b>',
_('Server'),$app['server']->getName(),_('Distinguished Name'),$request['template']->getDN()));
echo '<br />';
echo '<center>';
printf('<a href="cmd.php?%s&amp;dn=%s">%s</a>.',
htmlspecialchars($href),rawurlencode($request['template']->getDN()),_('Display the new created entry'));
echo '<br />';
printf('<a href="cmd.php?%s&amp;container=%s">%s</a>.',
htmlspecialchars($href),rawurlencode($request['template']->getContainer()),_('Create another entry'));
echo '</center>';
}
}
?>

129
htdocs/create_confirm.php Normal file
View File

@@ -0,0 +1,129 @@
<?php
/**
* Creates a new object in LDAP.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require './common.php';
$request = array();
$request['redirect'] = get_request('redirect','POST',false,false);
$request['page'] = new PageRender($app['server']->getIndex(),get_request('template','REQUEST',false,'none'));
$request['page']->setContainer(get_request('container','REQUEST',true));
$request['page']->accept();
$request['template'] = $request['page']->getTemplate();
if (! $request['template']->getContainer() || ! $app['server']->dnExists($request['template']->getContainer()))
error(sprintf(_('The container you specified (%s) does not exist. Please try again.'),$request['template']->getContainer()),'error','index.php');
# Check if the container is a leaf - we shouldnt really return a hit here, the template engine shouldnt have allowed a user to attempt to create an entry...
$tree = get_cached_item($app['server']->getIndex(),'tree');
$request['container'] = $tree->getEntry($request['template']->getContainer());
if (! $request['container'])
$tree->addEntry($request['template']->getContainer());
$request['container'] = $tree->getEntry($request['template']->getContainer());
if ($request['container']->isLeaf())
error(sprintf(_('The container (%s) is a leaf.'),$request['template']->getContainer()),'error','index.php');
# Check our RDN
if (! count($request['template']->getRDNAttrs()))
error(_('The were no attributes marked as an RDN attribute.'),'error','index.php');
if (! $request['template']->getRDN())
error(_('The RDN field is empty?'),'error','index.php');
# Some other attribute checking...
foreach ($request['template']->getAttributes() as $attribute) {
# Check that our Required Attributes have a value - we shouldnt really return a hit here, the template engine shouldnt have allowed this to slip through.
# @todo this isIgnoredAttr() function is missing?
if ($attribute->isRequired() && ! count($attribute->getValues()) && ! $app['server']->isIgnoredAttr($attr->getName()))
error(sprintf(_('You left the value blank for required attribute (%s).'),
$attribute->getName(false)),'error','index.php');
}
# Check for unique attributes
$app['server']->checkUniqueAttrs($request['template']->getDN(),$request['template']->getLDAPadd());
$request['page']->drawTitle(_('Create LDAP Entry'));
$request['page']->drawSubTitle(sprintf('%s: <b>%s</b>&nbsp;&nbsp;&nbsp;%s: <b>%s</b>',
_('Server'),$app['server']->getName(),_('Container'),$request['template']->getContainer()));
# Confirm the creation
if (count($request['template']->getLDAPadd(true))) {
echo '<center>';
echo _('Do you want to create this entry?');
echo '<br /><br />';
echo "\n\n";
echo '<form action="cmd.php" method="post">';
echo '<input type="hidden" name="cmd" value="create" />';
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="container" value="%s" />',htmlspecialchars($request['template']->getContainer()));
printf('<input type="hidden" name="template" value="%s" />',$request['template']->getID());
foreach ($request['template']->getRDNAttrs() as $rdn)
printf('<input type="hidden" name="rdn_attribute[]" value="%s" />',htmlspecialchars($rdn));
echo "\n";
$request['page']->drawHiddenAttributes();
echo '<table class="result_table">';
echo "\n";
printf('<tr class="heading"><td>%s</td><td>%s</td><td>%s</td></tr>',
_('Attribute'),_('New Value'),_('Skip'));
echo "\n\n";
$counter = 0;
printf('<tr class="%s"><td colspan=3><center><b>%s</b></center></td><tr>',$counter%2 ? 'even' : 'odd',$request['template']->getDN());
foreach ($request['template']->getLDAPadd(true) as $attribute) {
$counter++;
printf('<tr class="%s">',$counter%2 ? 'even' : 'odd');
printf('<td><b>%s</b></td>',$attribute->getFriendlyName());
# Show NEW Values
echo '<td><span style="white-space: nowrap;">';
$request['page']->draw('CurrentValues',$attribute);
echo '</span></td>';
# Show SKIP Option
$input_disabled = '';
$input_onclick = '';
if ($attribute->isRequired())
$input_disabled = 'disabled="disabled"';
printf('<td><input name="skip_array[%s]" id="skip_array_%s" type="checkbox" %s %s/></td>',
htmlspecialchars($attribute->getName()),htmlspecialchars($attribute->getName()),$input_disabled,$input_onclick);
echo '</tr>';
echo "\n\n";
}
echo '</table>';
echo '<br />';
printf('<input type="submit" value="%s" />',_('Commit'));
printf('<input type="submit" name="cancel" value="%s" />',_('Cancel'));
echo '</form>';
echo '<br />';
echo '</center>';
} else {
echo '<center>';
echo _('You made no changes');
$href = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s',
$app['server']->getIndex(),rawurlencode($request['dn']));
printf(' <a href="%s">%s</a>.',htmlspecialchars($href),_('Go back'));
echo '</center>';
}
?>

View File

@@ -0,0 +1,925 @@
/* $Header$ */
/* Global Page */
table.page {
font-weight: normal;
color: #000000;
font-family: "bitstream vera sans","luxi sans",verdana,geneva,arial,helvetica,sans-serif;
background-color: #FFFFFF;
font-size: 13px;
empty-cells: hide;
}
/* Global Page - Defaults */
/* A HREF Links */
table.page a {
color: #0000AA;
text-decoration: none;
}
table.page a:hover {
text-decoration: none;
}
table.page a img {
border: 0px;
}
/* Global Page - Logo & Title */
table.page tr.head {
text-align: center;
color: #FFFFFF;
background-color: #001188;
font-weight: bold;
font-size: 11px;
height: 25px;
}
table.page tr.head img.logo {
vertical-align: middle;
text-align: center;
width: 100px;
height: 60px;
}
table.page tr.pagehead {
}
table.page tr.pagehead td.imagetop {
width: 100%;
vertical-align: bottom;
text-align: right;
}
/* 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 td {
border-top: 0px;
border-bottom: 0px;
padding: 0px;
padding-top: 2px;
padding-bottom: 2px;
text-align: left;
vertical-align: top;
font-size: 11px;
font-weight: bold;
}
table.page table.control img {
width: 24px;
height: 24px;
}
table.page table.control a {
color: #000000;
}
table.page table.control a:hover {
text-decoration: none;
background-color: #FFFFFF;
color: #0000AA;
}
table.page table.control td.spacer {
width: 20%;
}
table.page table.control td.logo {
text-align: right;
width: 10%;
}
table.page table.control td.logo img.logo {
vertical-align: middle;
text-align: right;
width: 100px;
height: 50px;
}
/* Global Page - LDAP Tree */
table.page td.tree {
border-right: 1px solid #AAAACC;
vertical-align: top;
background-color: #FCFCFE;
width: 10%;
}
/* 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: #FFFFFF;
background-color: #000088;
border: 1px solid #000000;
font-weight: normal;
font-size: 150%;
}
table.page table.body h3.subtitle {
text-align: center;
margin: 0px;
margin-bottom: 15px;
font-size: 75%;
color: #FFFFFF;
border-bottom: 1px solid #000000;
border-left: 1px solid #000000;
border-right: 1px solid #000000;
background: #000088;
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: 12px;
text-align: right;
}
/* Global Page - Other Layouts */
/* Server Select */
table.page table.server_select {
font-weight: bold;
font-size: 13px;
color: #000000;
}
/* 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 {
white-space: nowrap;
}
table.tree td.server_links {
vertical-align: top;
text-align: center;
padding-top: 0px;
padding-bottom: 0px;
padding-left: 3px;
padding-right: 3px;
}
table.tree td.server_links img {
height: 22px;
width: 22px;
}
table.tree td.server_links a {
color: #000000;
text-decoration: none;
font-size: 11px;
}
table.tree td.server_links a:hover {
text-decoration: none;
background-color: #FFFFFF;
color: #000000;
}
table.tree tr.option td.expander {
text-align: center;
width: 22px;
max-width: 22px;
min-width: 22px;
white-space: nowrap;
}
table.tree tr.option td.icon {
text-align: center;
width: 22px;
max-width: 22px;
min-width: 22px;
white-space: nowrap;
}
table.tree td.rdn a {
font-size: 13px;
color: #000000;
}
table.tree td.rdn a:hover {
font-size: 13px;
color: #841212;
background-color: #FFF0C0;
text-decoration: none;
}
table.tree td.rdn span.count {
font-size: 13px;
color: #000000;
}
table.tree td.links a {
color: #0000AA;
text-align: center;
}
table.tree td.link a {
font-size: 13px;
color: #000000;
}
table.tree td.link a:hover {
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 td.logged_in {
font-size: 10px;
white-space: nowrap;
}
table.tree td.logged_in a {
font-size: 11px;
}
table.tree td.logged_in a:hover {
color: #841212;
background-color: #FFF0C0;
text-decoration: none;
}
/* Tree Global Defaults */
table.tree tr td {
padding: 0px;
}
table.tree a {
text-decoration: none;
color: #000000;
}
table.tree a:hover {
text-decoration: underline;
color: blue;
}
table.tree span.dnicon img {
width: 16px;
padding-bottom: 0px;
}
/* Tree */
table.tree .treemenudiv {
display: block;
white-space: nowrap;
padding-top: 1px;
padding-bottom: 1px;
}
table.tree .phplmnormal {
font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif;
font-size: 13px;
color: #000000;
text-decoration: none;
}
table.tree a.phplmnormal:hover {
font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif;
font-size: 13px;
color: #000000;
background-color: #fff0c0;
text-decoration: none;
}
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;
}
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;
}
table.tree a.phplm: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 a.phplm:active {
font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif;
font-size: 13px;
color: #ff0000;
text-decoration: none;
}
table.tree a.phplmselected:link {
font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif;
font-size: 13px;
color: #dd0000;
background-color: #ffdd76;
text-decoration: none;
}
table.tree a.phplmselected:visited {
font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif;
font-size: 13px;
color: #dd0000;
background-color: #ffdd76;
text-decoration: none;
}
table.tree a.phplmselected: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 a.phplmselected:active {
font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif;
font-size: 13px;
color: #ff0000;
text-decoration: none;
}
/* Standard Form */
table.forminput {
background-color: #F9F9FA;
padding: 10px;
border: 1px solid #AAAACC;
}
table.forminput td.title {
text-align: center;
font-weight: bold;
}
table.forminput td.subtitle {
text-align: center;
font-weight: normal;
font-size: small;
}
table.forminput tr td.heading {
font-weight: bold;
}
table.forminput td.small {
font-size: 80%;
}
table.forminput td.top {
vertical-align: top;
}
table.forminput input.val {
width: 350px;
border: 1px solid #AAAACC;
}
table.forminput input.roval {
width: 350px;
border: none;
}
table.forminput td.icon {
width: 16px;
text-align: center;
}
table.forminput td.icon img {
border: 0px;
}
table.forminput td.label {
text-align: left;
font-size: 13px;
}
/* Menu on top of entry form */
table.menu {
font-size: 14px;
}
table.menu td.icon {
width: 16px;
text-align: center;
}
/* Edit DN */
div.add_value {
font-size: 12px;
margin: 0px;
padding: 0px;
}
/* Edit Entry */
table.entry {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
}
table.entry input {
margin: 1px;
}
table.entry input.value {
color: #000000;
font-size: 14px;
width: 350px;
background-color: #FFFFFF;
}
table.entry div.helper {
text-align: left;
white-space: nowrap;
background-color: #FFFFFF;
color: #888;
font-size: 14px;
font-weight: normal;
}
table.entry input.roval {
font-size: 14px;
width: 350px;
background-color: #FFFFFF;
color: #000000;
border: none;
}
table.entry textarea.value {
font-size: 14px;
width: 350px;
background-color: #FFFFFF;
color: #000000;
}
table.entry textarea.roval {
font-size: 14px;
width: 350px;
background-color: #FFFFFF;
color: #000000;
border: none;
}
table.entry tr td {
padding: 4px;
padding-right: 0px;
}
table.entry tr td.heading {
border-top: 3px solid #C0C0C0;
font-weight: bold;
}
table.entry tr td.note {
text-align: right;
background-color: #E0E0E0;
}
table.entry tr td.title {
background-color: #E0E0E0;
vertical-align: top;
font-weight: bold;
}
table.entry tr td.title a {
text-decoration: none;
color: #000000;
}
table.entry tr td.title a:hover {
text-decoration: underline;
color: #016;
}
table.entry tr td.value {
text-align: left;
vertical-align: middle;
padding-bottom: 10px;
padding-left: 50px;
}
/** When an attr is updated, it is highlighted to indicate such */
table.entry tr.updated td.title {
border-top: 1px dashed #AAAA88;
border-left: 1px dashed #AAAA88;
background-color: #999988;
}
table.entry tr.updated td.note {
border-top: 1px dashed #AAAA88;
border-right: 1px dashed #AAAA88;
background-color: #999988;
}
/** An extra row that sits at the bottom of recently modified attrs to encase them in dashes */
table.entry tr.updated td.bottom {
border-top: 1px dashed #AAAA88;
}
/** Formatting for the value cell when it is the attribute that has been recently modified */
table.entry tr.updated td.value {
border-left: 1px dashed #AAAA88;
border-right: 1px dashed #AAAA88;
}
/* Need to prevent sub-tables (like the one in which jpegPhotos are displayed)
* from drawing borders as well. */
table.entry tr.updated td table td {
border: 0px;
}
table.entry tr.noinput {
background: #E0E0E0;
}
span.hint {
font-size: small;
font-weight: normal;
color: #888;
}
/* Login Box */
#login {
background: url('../../images/default/ldap-uid.png') no-repeat 0 1px;
background-color: #FAFAFF;
color: #000000;
padding-left: 17px;
}
#login:focus {
background-color: #F0F0FF;
color: #000000;
}
#login:disabled {
background-color: #DDDDFF;
color: #000000;
}
#password {
background: url('../../images/default/key.png') no-repeat 0 1px;
background-color: #FAFAFF;
color: #000000;
padding-left: 17px;
}
#password:focus {
background-color: #F0F0FF;
color: #000000;
}
#password:disabled {
background-color: #DDDDFF;
color: #000000;
}
#generic {
background-color: #FAFAFF;
color: #000000;
padding-left: 17px;
}
#generic:focus {
background-color: #F0F0FF;
color: #000000;
}
#generic:disabled {
background-color: #DDDDFF;
color: #000000;
}
/* After input results */
div.execution_time {
font-size: 75%;
font-weight: normal;
text-align: left;
}
table.result {
width: 100%;
vertical-align: top;
empty-cells: show;
border: 1px solid #AAAACC;
border-spacing: 0px;
background-color: #F2F2FF;
}
table.result tr.heading {
vertical-align: top;
}
table.result tr.list_title {
background-color: #FFFFFF;
}
table.result tr.list_title td.icon {
text-align: center;
vertical-align: top;
}
table.result tr.list_item {
background-color: #FFFFFF;
}
table.result tr.list_item td.blank {
width: 25px;
}
table.result tr.list_item td.heading {
vertical-align: top;
color: gray;
width: 10%;
font-size: 12px;
}
table.result tr.list_item td.value {
color: #000000;
font-size: 12px;
}
table.result_box {
border: 1px solid #AAAACC;
border-collapse: collapse;
empty-cells: show;
}
table.result_table {
border: 1px solid #AAAACC;
border-collapse: collapse;
empty-cells: show;
}
table.result_table td {
font-size: 12px;
vertical-align: top;
border: 1px solid #AAAACC;
padding: 4px;
}
table.result_table th {
border: 1px solid #AAAACC;
padding: 10px;
padding-left: 20px;
padding-right: 20px;
}
table.result_table tr.highlight {
background-color: #EEEBBB;
}
table.result_table tr.highlight td {
border: 1px solid #AAAACC;
font-weight: bold;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 10px;
padding-right: 10px;
}
table.result_table td.heading {
color: #FFFFFF;
background-color: #000088;
font-size: 12px;
}
table.result_table td.value {
color: #000000;
background-color: #E0E0E0;
}
table.result_table tr.heading {
color: #FFFFFF;
background-color: #000088;
font-size: 12px;
font-weight: bold;
}
table.result_table tr.heading a {
color: #FFFFFF;
font-size: 12px;
font-weight: bold;
}
table.result_table tr.heading td {
border: 1px solid #AAAACC;
font-weight: normal;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 10px;
padding-right: 10px;
}
table.result_table tr.even {
background-color: #E0E0E0;
}
table.result_table tr.even td {
border: 1px solid #AAAACC;
font-weight: normal;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 10px;
padding-right: 10px;
}
table.result_table tr.even td.title {
font-weight: bold;
}
table.result_table tr.odd {
background-color: #F0F0F0;
}
table.result_table tr.odd td {
border: 1px solid #AAAACC;
font-weight: normal;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 10px;
padding-right: 10px;
}
table.result_table tr.odd td.title {
font-weight: bold;
}
table.result_table ul.list {
margin: 5px;
margin-left: 0px;
padding-left: 20px;
}
table.result_table ul.list li {
margin-left: 0px;
padding-left: 0px;
}
table.result_table ul.list li small {
font-size: 75%;
color: #707070;
}
table.result_table ul.list li small a {
color: #7070C0;
}
/* Error Dialog Box */
table.error {
width: 500px;
border: 1px solid #AA0000;
background-color: #FFF0F0;
}
table.error th {
background-color: #AA0000;
border: 0px;
color: #FFFFFF;
font-size: 14px;
font-weight: bold;
text-align: center;
vertical-align: middle;
width: 100%;
}
table.error th.img {
vertical-align: middle;
text-align: center;
}
table.error td {
border: 0px;
background-color: #FFF0F0;
padding: 2px;
text-align: left;
vertical-align: top;
}
/* Popup Window */
div.popup h3.subtitle {
text-align: center;
margin: 0px;
margin-bottom: 15px;
color: #FFFFFF;
border-bottom: 1px solid #000000;
border-left: 1px solid #000000;
border-right: 1px solid #000000;
background: #000088;
padding: 4px;
font-weight: normal;
}
span.good {
color: green;
}
span.bad {
color: red;
}

952
htdocs/css/tango/style.css Normal file
View File

@@ -0,0 +1,952 @@
/* $Header$ */
/* Global Page */
table.page {
font-weight: normal;
color: #2E3436;
font-family: "bitstream vera sans","luxi sans",verdana,geneva,arial,helvetica,sans-serif;
background-color: #FFFFFF;
font-size: 13px;
empty-cells: hide;
}
/* Global Page - Defaults */
/* A HREF Links */
table.page a {
color: #204A87;
text-decoration: none;
}
table.page a:hover {
text-decoration: none;
}
table.page a img {
border: 0px;
}
/* Global Page - Logo & Title */
table.page tr.head {
text-align: center;
color: #FFFFFF;
background-color: #3465A4;
font-weight: bold;
font-size: 11px;
height: 25px;
}
table.page tr.head img.logo {
vertical-align: middle;
text-align: center;
width: 100px;
height: 60px;
}
table.page tr.pagehead {
}
table.page tr.pagehead td.imagetop {
width: 100%;
vertical-align: bottom;
text-align: right;
}
/* Global Page - Control Line */
table.page tr.control td {
border-top: 1px solid #BABDB6;
border-bottom: 1px solid #BABDB6;
}
/* Global Page - Control Line Menu Items */
table.page table.control {
table-layout: fixed;
width: 100%;
}
table.page table.control td {
border-top: 0px;
border-bottom: 0px;
padding: 0px;
padding-top: 5px;
text-align: left;
vertical-align: top;
font-size: 11px;
}
table.page table.control img {
width: 24px;
height: 24px;
}
table.page table.control a {
color: #2E3436;
}
table.page table.control a:hover {
text-decoration: none;
background-color: #EEEEEC;
color: #CC0000;
}
table.page table.control td.spacer {
width: 20%;
}
table.page table.control td.logo {
text-align: right;
width: 10%;
}
table.page 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 #BABDB6;
vertical-align: top;
background-color: #FFFFFF;
width: 10%;
}
/* Global Page - Main Body */
table.page td.body {
vertical-align: top;
width: 100%;
background-color: #FFFFFF;
}
/* Global Page - Main Body System Message */
table.page table.sysmsg {
border-bottom: 2px solid #BABDB6;
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: #FFFFFF;
width: 100%;
}
table.page table.body h3.title {
text-align: center;
margin: 0px;
padding: 10px;
color: #FFFFFF;
background-color: #3465A4;
border: 1px solid #EEEEEC;
font-weight: normal;
font-size: 150%;
}
table.page table.body h3.subtitle {
text-align: center;
margin: 0px;
margin-bottom: 15px;
font-size: 75%;
color: #FFFFFF;
border-bottom: 1px solid #EEEEEC;
border-left: 1px solid #EEEEEC;
border-right: 1px solid #EEEEEC;
background: #3465A4;
padding: 4px;
font-weight: normal;
}
table.page table.body td.spacer {
border-top: 2px solid #BABDB6;
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 #BABDB6;
border-bottom: 1px solid #BABDB6;
}
/* Global Page Footer */
table.page tr.foot td {
border-top: 1px solid #BABDB6;
font-weight: bold;
font-size: 12px;
text-align: right;
}
/* Global Page - Other Layouts */
/* Server Select */
table.page table.server_select {
font-weight: bold;
font-size: 13px;
color: #2E3436;
}
/* 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 {
white-space: nowrap;
}
table.tree td.server_links {
vertical-align: top;
text-align: center;
padding-top: 0px;
padding-bottom: 0px;
padding-left: 3px;
padding-right: 3px;
}
table.tree td.server_links img {
height: 22px;
width: 22px;
}
table.tree td.server_links a {
color: #2E3436;
text-decoration: none;
font-size: 11px;
}
table.tree td.server_links a:hover {
text-decoration: none;
background-color: #EEEEEC;
color: #CC0000;
}
table.tree tr.option td.expander {
text-align: center;
width: 22px;
max-width: 22px;
min-width: 22px;
white-space: nowrap;
}
table.tree tr.option td.icon {
text-align: center;
width: 22px;
max-width: 22px;
min-width: 22px;
white-space: nowrap;
}
table.tree td.rdn a {
font-size: 13px;
color: #2E3436;
}
table.tree td.rdn a:hover {
font-size: 13px;
color: #CC0000;
background-color: #EEEEEC;
}
table.tree td.rdn span.count {
font-size: 13px;
color: #2E3436;
}
table.tree td.links a {
color: #204A87;
text-align: center;
}
table.tree td.link a {
font-size: 13px;
color: #2E3436;
}
table.tree td.link a:hover {
font-size: 13px;
color: #CC0000;
background-color: #EEEEEC;
text-decoration: none;
}
table.tree td.rdn a:hover {
font-size: 13px;
color: #CC0000;
background-color: #EEEEEC;
text-decoration: none;
}
table.tree td.links a:hover {
text-decoration: none;
color: #204A87;
}
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 td.logged_in {
font-size: 10px;
white-space: nowrap;
}
table.tree td.logged_in a {
font-size: 11px;
}
table.tree td.logged_in a:hover {
color: #CC0000;
background-color: #EEEEEC;
text-decoration: none;
}
/* Tree Global Defaults */
table.tree tr td {
padding: 0px;
}
table.tree a {
text-decoration: none;
color: #2E3436;
}
table.tree a:hover {
text-decoration: underline;
color: #204A87;
}
/* Tree */
table.tree .treemenudiv {
display: block;
white-space: nowrap;
padding-top: 1px;
padding-bottom: 1px;
}
table.tree .phplmnormal {
font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif;
font-size: 13px;
color: #000000;
text-decoration: none;
}
table.tree a.phplmnormal:hover {
font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif;
font-size: 13px;
color: #000000;
background-color: #fff0c0;
text-decoration: none;
}
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;
}
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;
}
table.tree a.phplm: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 a.phplm:active {
font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif;
font-size: 13px;
color: #ff0000;
text-decoration: none;
}
table.tree a.phplmselected:link {
font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif;
font-size: 13px;
color: #dd0000;
background-color: #ffdd76;
text-decoration: none;
}
table.tree a.phplmselected:visited {
font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif;
font-size: 13px;
color: #dd0000;
background-color: #ffdd76;
text-decoration: none;
}
table.tree a.phplmselected: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 a.phplmselected:active {
font-family: bitstream vera sans, luxi sans, verdana, geneva, arial, helvetica, sans-serif;
font-size: 13px;
color: #ff0000;
text-decoration: none;
}
/* Standard Form */
table.forminput {
background-color: #EEEEEC;
padding: 10px;
border: 1px solid #BABDB6;
}
table.forminput td.title {
text-align: center;
font-weight: bold;
}
table.forminput td.subtitle {
text-align: center;
font-weight: normal;
font-size: small;
}
table.forminput tr td.heading {
font-weight: bold;
}
table.forminput td.small {
font-size: 80%;
}
table.forminput td.top {
vertical-align: top;
}
table.forminput input.val {
width: 350px;
border: 1px solid #BABDB6;
}
table.forminput input.roval {
width: 350px;
border: none;
}
table.forminput td.icon {
width: 16px;
text-align: center;
}
table.forminput td.icon img {
border: 0px;
}
table.forminput td.label {
text-align: left;
font-size: 13px;
}
/* Menu on top of entry form */
table.menu {
font-size: 14px;
}
table.menu td.icon {
width: 16px;
text-align: center;
}
/* Edit DN */
div.add_value {
font-size: 12px;
margin: 0px;
padding: 0px;
}
/* Edit Entry */
table.entry {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
}
table.entry input {
margin: 1px;
}
table.entry input.value {
font-size: 14px;
width: 350px;
background-color: #FFFFFF;
}
table.entry div.helper {
text-align: left;
white-space: nowrap;
background-color: #FFFFFF;
font-size: 14px;
font-weight: normal;
color: #888;
}
table.entry input.roval {
font-size: 14px;
width: 350px;
background-color: #FFFFFF;
border: none;
}
table.entry textarea.value {
font-size: 14px;
width: 350px;
background-color: #FFFFFF;
}
table.entry textarea.roval {
font-size: 14px;
width: 350px;
background-color: #FFFFFF;
border: none;
}
table.entry tr td {
padding: 4px;
padding-right: 0px;
}
table.entry tr td.heading {
border-top: 3px solid #D3D7CF;
font-weight: bold;
}
table.entry tr td.note {
text-align: right;
background-color: #EEEEEC;
}
table.entry tr td.title {
background-color: #EEEEEC;
vertical-align: top;
font-weight: bold;
}
table.entry tr td.title a {
text-decoration: none;
color: #2E3436;
}
table.entry tr td.title a:hover {
text-decoration: underline;
color: #204A87;
}
table.entry tr td.value {
text-align: left;
vertical-align: middle;
padding-bottom: 10px;
padding-left: 50px;
}
/** When an attr is updated, it is highlighted to indicate such */
table.entry tr.updated td.title {
border-top: 1px dashed #BABDB6;
border-left: 1px dashed #BABDB6;
background-color: #888A85;
}
table.entry tr.updated td.note {
border-top: 1px dashed #BABDB6;
border-right: 1px dashed #BABDB6;
background-color: #888A85;
}
/** An extra row that sits at the bottom of recently modified attrs to encase them in dashes */
table.entry tr.updated td.bottom {
border-top: 1px dashed #BABDB6;
}
/** Formatting for the value cell when it is the attribute that has been recently modified */
table.entry tr.updated td.value {
border-left: 1px dashed #BABDB6;
border-right: 1px dashed #BABDB6;
}
/* Need to prevent sub-tables (like the one in which jpegPhotos are displayed)
* from drawing borders as well. */
table.entry tr.updated td table td {
border: 0px;
}
table.entry tr.noinput {
background: #EEEEEC;
}
span.hint {
font-size: small;
font-weight: normal;
color: #888;
}
/* Edit DN - EntryWriter2 */
table.entry tr.spacer {
background-color: #D3D7CF;
}
table.entry tr td.ew2_icon {
vertical-align: top;
}
table.entry tr td.ew2_attr {
vertical-align: top;
text-align: right;
font-size: 75%;
background-color: #FFFFFF;
font-weight: bold;
}
table.entry tr td.ew2_attr a {
text-decoration: none;
color: #2E3436;
}
table.entry tr td.ew2_attr a:hover {
text-decoration: underline;
color: #204A87;
}
table.entry tr td.ew2_val {
text-align: left;
vertical-align: top;
padding-bottom: 10px;
padding-left: 50px;
}
table.entry tr.updated 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.entry tr.updated td.ew2_val {
border-top: 1px dashed green;
border-left: 1px dashed green;
border-right: 1px dashed green;
border-bottom: 1px dashed green;
}
/* Login Box */
#login {
background: url('../../images/tango/ldap-uid.png') no-repeat 0 1px;
background-color: #FFFFFF;
padding-left: 17px;
}
#login:focus {
background-color: #EEEEEC;
}
#login:disabled {
background-color: #D3D7CF;
}
#password {
background: url('../../images/tango/key.png') no-repeat 0 1px;
background-color: #FFFFFF;
padding-left: 17px;
}
#password:focus {
background-color: #EEEEEC;
}
#password:disabled {
background-color: #D3D7CF;
}
#generic {
background-color: #FFFFFF;
padding-left: 17px;
}
#generic:focus {
background-color: #EEEEEC;
}
#generic:disabled {
background-color: #D3D7CF;
}
/* After input results */
div.execution_time {
font-size: 75%;
font-weight: normal;
text-align: center;
}
table.result {
width: 100%;
vertical-align: top;
empty-cells: show;
border: 1px solid #BABDB6;
border-spacing: 0px;
background-color: #EEEEEC;
}
table.result tr.heading {
vertical-align: top;
}
table.result tr.list_title {
background-color: #FFFFFF;
}
table.result tr.list_title td.icon {
text-align: center;
vertical-align: top;
}
table.result tr.list_item {
background-color: #FFFFFF;
}
table.result tr.list_item td.blank {
width: 25px;
}
table.result tr.list_item td.heading {
vertical-align: top;
color: gray;
width: 10%;
font-size: 12px;
}
table.result tr.list_item td.value {
color: #2E3436;
font-size: 12px;
}
table.result_table {
border: 1px solid #BABDB6;
border-collapse: collapse;
empty-cells: show;
}
table.result_table td {
vertical-align: top;
border: 1px solid #BABDB6;
padding: 4px;
}
table.result_table th {
border: 1px solid #BABDB6;
padding: 10px;
padding-left: 20px;
padding-right: 20px;
}
table.result_table tr.highlight {
background-color: #FCE94F;
}
table.result_table tr.highlight td {
border: 1px solid #BABDB6;
font-weight: bold;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 10px;
padding-right: 10px;
}
table.result_table td.heading {
color: #FFFFFF;
background-color: #3465A4;
font-size: 15px;
}
table.result_table td.value {
color: #2E3436;
background-color: #EEEEEC;
}
table.result_table tr.heading {
color: #FFFFFF;
background-color: #3465A4;
font-size: 15px;
}
table.result_table tr.heading a {
color: #FFFFFF;
font-size: 20px;
}
table.result_table tr.heading td {
border: 1px solid #BABDB6;
font-weight: normal;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 10px;
padding-right: 10px;
}
table.result_table tr.even {
background-color: #EEEEEC;
}
table.result_table tr.even td {
border: 1px solid #BABDB6;
font-weight: normal;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 10px;
padding-right: 10px;
}
table.result_table tr.even td.title {
font-weight: bold;
}
table.result_table tr.odd {
background-color: #EEEEEC;
}
table.result_table tr.odd td {
border: 1px solid #BABDB6;
font-weight: normal;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 10px;
padding-right: 10px;
}
table.result_table tr.odd td.title {
font-weight: bold;
}
table.result_table ul.list {
margin: 5px;
margin-left: 0px;
padding-left: 20px;
}
table.result_table ul.list li {
margin-left: 0px;
padding-left: 0px;
}
table.result_table ul.list li small {
font-size: 75%;
color: #707070;
}
table.result_table ul.list li small a {
color: #7070C0;
}
/* Error Dialog Box */
table.error {
width: 500px;
border: 1px solid #AA0000;
background-color: #FFF0F0;
}
table.error th {
background-color: #AA0000;
border: 0px;
color: #FFFFFF;
font-size: 14px;
font-weight: bold;
text-align: center;
vertical-align: middle;
width: 100%;
}
table.error th.img {
vertical-align: middle;
text-align: center;
}
table.error td {
border: 0px;
background-color: #FFF0F0;
padding: 2px;
text-align: left;
vertical-align: top;
}
/* Popup Window */
div.popup h3.subtitle {
text-align: center;
margin: 0px;
margin-bottom: 15px;
color: #FFFFFF;
border-bottom: 1px solid #2E3436;
border-left: 1px solid #2E3436;
border-right: 1px solid #2E3436;
background: #3465A4;
padding: 4px;
font-weight: normal;
}
span.good {
color: green;
}
span.bad {
color: red;
}

35
htdocs/delete.php Normal file
View File

@@ -0,0 +1,35 @@
<?php
/**
* Deletes a DN and presents a "job's done" message.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require './common.php';
# The DNs we are working with
$request = array();
$request['dn'] = get_request('dn','REQUEST',true);
if (! $app['server']->dnExists($request['dn']))
error(sprintf('%s (%s)',_('No such entry.'),'<b>'.pretty_print_dn($request['dn']).'</b>'),'error','index.php');
# Delete the entry.
$result = $app['server']->delete($request['dn']);
if ($result)
system_message(array(
'title'=>_('Delete DN'),
'body'=>_('Successfully deleted DN ').sprintf('<b>%s</b>',$request['dn']),
'type'=>'info'),
sprintf('index.php?server_id=%s',$app['server']->getIndex()));
else
system_message(array(
'title'=>_('Could not delete the entry.').sprintf(' (%s)',pretty_print_dn($request['dn'])),
'body'=>ldap_error_msg($app['server']->getErrorMessage(null),$app['server']->getErrorNum(null)),
'type'=>'error'));
?>

49
htdocs/delete_attr.php Normal file
View File

@@ -0,0 +1,49 @@
<?php
/**
* Deletes an attribute from an entry with NO confirmation.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require './common.php';
$request = array();
$request['dn'] = get_request('dn','REQUEST',true);
$request['attr'] = get_request('attr','REQUEST',true);
$request['index'] = get_request('index','REQUEST',true);
if ($app['server']->isAttrReadOnly($request['attr']))
error(sprintf(_('The attribute "%s" is flagged as read-only in the phpLDAPadmin configuration.'),$request['attr']),'error','index.php');
$update_array = array();
$update_array[$request['attr']] = $app['server']->getDNAttrValue($request['dn'],$request['attr']);
$redirect_url = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s',
$app['server']->getIndex(),rawurlencode($request['dn']));
if (! isset($update_array[$request['attr']][$request['index']]))
system_message(array(
'title'=>_('Could not delete attribute value.'),
'body'=>sprintf('%s. %s/%s',_('The attribute value does not exist'),$request['attr'],$request['index']),
'type'=>'warn'),$redirect_url);
else {
unset($update_array[$request['attr']][$request['index']]);
foreach ($update_array as $key => $values)
$update_array[$key] = array_values($values);
$result = $app['server']->modify($request['dn'],$update_array);
if ($result) {
foreach ($update_array as $attr => $junk)
$redirect_url .= sprintf('&modified_attrs[]=%s',$attr);
header("Location: $redirect_url");
die();
}
}
?>

142
htdocs/delete_form.php Normal file
View File

@@ -0,0 +1,142 @@
<?php
/**
* Displays a last chance confirmation form to delete a DN.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require './common.php';
# The DN we are working with
$request = array();
$request['dn'] = get_request('dn','GET');
# Check if the entry exists.
if (! $request['dn'] || ! $app['server']->dnExists($request['dn']))
system_message(array(
'title'=>_('Entry does not exist'),
'body'=>sprintf('%s (%s)',_('The entry does not exist'),$request['dn']),
'type'=>'error'),'index.php');
# We search all children, not only the visible children in the tree
$request['children'] = $app['server']->getContainerContents($request['dn'],null,0,'(objectClass=*)',LDAP_DEREF_NEVER);
printf('<h3 class="title">%s %s</h3>',_('Delete'),get_rdn($request['dn']));
printf('<h3 class="subtitle">%s: <b>%s</b> &nbsp;&nbsp;&nbsp; %s: <b>%s</b></h3>',
_('Server'),$app['server']->getName(),_('Distinguished Name'),$request['dn']);
echo "\n";
echo '<center>';
if (count($request['children'])) {
printf('<b>%s</b><br /><br />',_('Permanently delete all children also?'));
$search['href'] = htmlspecialchars(sprintf('cmd.php?cmd=query_engine&server_id=%s&filter=%s&base=%s&scope=sub&query=none&format=list',
$app['server']->getIndex(),rawurlencode('objectClass=*'),rawurlencode($request['dn'])));
$query = array();
$query['base'] = $request['dn'];
$query['scope'] = 'sub';
$query['attrs'] = array('dn');
$query['size_limit'] = 0;
$query['deref'] = LDAP_DEREF_NEVER;
$request['search'] = $app['server']->query($query,null);
echo '<table class="forminput" border=0>';
echo '<tr>';
echo '<td colspan=2>';
printf(_('This entry is the root of a sub-tree containing %s entries.'),count($request['search']));
printf(' <small>(<a href="%s">%s</a>)</small>',
$search['href'],_('view entries'));
echo '</td></tr>';
echo '<tr><td colspan=2>&nbsp;</td></tr>';
printf('<tr><td colspan=2>%s</td></tr>',
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?'),count($request['search'])));
echo '<tr><td colspan=2>&nbsp;</td></tr>';
printf('<tr><td colspan=2><small>%s</small></td></tr>',
_('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 "\n";
echo '<tr>';
echo '<td width=50%><center>';
echo '<form action="cmd.php" method="post">';
echo '<input type="hidden" name="cmd" value="rdelete" />';
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="dn" value="%s" />',htmlspecialchars($request['dn']));
printf('<input type="submit" value="%s" />',sprintf(_('Delete all %s objects'),count($request['search'])));
echo '</form>';
echo '</center></td>';
echo '<td width=50%><center>';
echo '<form action="cmd.php" method="get">';
echo '<input type="hidden" name="cmd" value="template_engine" />';
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="dn" value="%s" />',htmlspecialchars($request['dn']));
printf('<input type="submit" name="submit" value="%s" />',_('Cancel'));
echo '</form>';
echo '</center></td>';
echo '</tr>';
echo "\n";
echo '</table>';
echo "\n";
echo '<br /><br />';
echo _('List of entries to be deleted:');
echo '<br />';
$i = 0;
printf('<select size="%s" multiple disabled style="background:white; color:black;width:500px" >',min(10,count($request['search'])));
foreach ($request['search'] as $key => $value)
printf('<option>%s. %s</option>',++$i,dn_unescape($value['dn']));
echo '</select>';
echo "\n";
} else {
echo '<table class="forminput" border=0>';
printf('<tr><td colspan=4>%s</td></tr>',_('Are you sure you want to permanently delete this object?'));
echo '<tr><td colspan=4>&nbsp;</td></tr>';
printf('<tr><td width=10%%>%s:</td><td colspan=3 width=75%%><b>%s</b></td></tr>',_('Server'),$app['server']->getName());
printf('<tr><td width=10%%><acronym title="%s">%s</acronym></td><td colspan=3 width=75%%><b>%s</b></td></tr>',
_('Distinguished Name'),_('DN'),$request['dn']);
echo '<tr><td colspan=4>&nbsp;</td></tr>';
echo "\n";
echo '<tr>';
echo '<td colspan=2 width=50%><center>';
echo '<form action="cmd.php" method="post">';
echo '<input type="hidden" name="cmd" value="delete" />';
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="dn" value="%s" />',htmlspecialchars($request['dn']));
printf('<input type="submit" name="submit" value="%s" />',_('Delete'));
echo '</form>';
echo '</center></td>';
echo '<td colspan=2 width=50%><center>';
echo '<form action="cmd.php" method="get">';
echo '<input type="hidden" name="cmd" value="template_engine" />';
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="dn" value="%s" />',htmlspecialchars($request['dn']));
printf('<input type="submit" name="submit" value="%s" />',_('Cancel'));
echo '</form>';
echo '</center></td>';
echo '</tr>';
echo '</table>';
echo "\n";
}
echo '</center>';
echo '<br />';
?>

View File

@@ -0,0 +1,49 @@
<?php
/**
* Download a binary value attribute to the user.
* A server ID, DN and Attribute must be provided in the GET attributes.
* Optionally an index, type and filename can be supplied.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require './common.php';
$request = array();
$request['dn'] = get_request('dn','GET');
$request['attr'] = strtolower(get_request('attr','GET',true));
$request['index'] = get_request('index','GET',false,0);
$request['type'] = get_request('type','GET',false,'octet-stream');
$request['filename'] = get_request('filename','GET',false,sprintf('%s:%s.bin',get_rdn($request['dn'],true),$request['attr']));
if (! $app['server']->dnExists($request['dn']))
error(sprintf(_('The entry (%s) does not exist.'),$request['dn']),'error','index.php');
$search = $app['server']->getDNAttrValues($request['dn'],null,LDAP_DEREF_NEVER,array($request['attr']));
# Dump the binary data to the browser
$obStatus = ob_get_status();
if (isset($obStatus['type']) && $obStatus['type'] && $obStatus['status'])
ob_end_clean();
if (! isset($search[$request['attr']][$request['index']])) {
# We cant display an error, but we can set a system message, which will be display on the next page render.
system_message(array(
'title'=>_('No binary data available'),
'body'=>sprintf(_('Could not fetch binary data from LDAP server for attribute [%s].'),$request['attr']),
'type'=>'warn'));
die();
}
header(sprintf('Content-type: %s',$request['type']));
header(sprintf('Content-disposition: attachment; filename="%s"',$request['filename']));
header(sprintf('Expires: Mon, 26 Jul 1997 05:00:00 GMT',gmdate('r')));
header(sprintf('Last-Modified: %s',gmdate('r')));
echo $search[$request['attr']][$request['index']];
die();
?>

61
htdocs/draw_tree_node.php Normal file
View File

@@ -0,0 +1,61 @@
<?php
/**
* Draw a portion of the LDAP tree.
*
* @package phpLDAPadmin
* @subpackage Tree
*/
/**
*/
$request = array();
$request['dn'] = get_request('dn','REQUEST');
$request['server_id'] = get_request('server_id','REQUEST');
$request['code'] = get_request('code','REQUEST');
$request['action'] = get_request('action','REQUEST');
$request['noheader'] = get_request('noheader','REQUEST',false,0);
$tree = Tree::getInstance($request['server_id']);
if (! $tree)
die();
$treesave = false;
if ($request['dn']) {
$dnentry = $tree->getEntry($request['dn']);
if (! $dnentry) {
$tree->addEntry($request['dn']);
$dnentry = $tree->getEntry($request['dn']);
$treesave = true;
}
switch ($request['action']) {
case 0:
$dnentry->close();
break;
case 2:
default:
if ($dnentry->isSizeLimited()) {
$tree->readChildren($request['dn'],true);
$treesave = true;
}
$dnentry->open();
}
}
if ($treesave)
set_cached_item($app['server']->getIndex(),'tree','null',$tree);
if ($request['dn'])
echo $tree->draw_children($dnentry,$request['code']);
else
$tree->draw($request['noheader']);
die();
?>

121
htdocs/entry_chooser.php Normal file
View File

@@ -0,0 +1,121 @@
<?php
/**
* Display a selection (popup window) to pick a DN.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
include './common.php';
$www['page'] = new page();
$request = array();
$request['container'] = get_request('container','GET');
$request['element'] = get_request('form_element','GET');
$request['rdn'] = get_request('rdn','GET');
echo '<div class="popup">';
printf('<h3 class="subtitle">%s</h3>',_('Entry Chooser'));
echo '<script type="text/javascript" language="javascript">';
echo ' function returnDN(dn) {';
printf(' opener.document.%s.value = dn;',$request['element']);
echo ' close();';
echo ' }';
echo '</script>';
echo '<table class="forminput" width=100% border=0>';
if ($request['container']) {
printf('<tr><td class="heading" colspan=3>%s:</td><td>%s</td></tr>',_('Server'),$app['server']->getName());
printf('<tr><td class="heading" colspan=3>%s:</td><td>%s</td></tr>',_('Looking in'),$request['container']);
echo '<tr><td class="blank" colspan=4>&nbsp;</td></tr>';
}
# Has the user already begun to descend into a specific server tree?
if (isset($app['server']) && ! is_null($request['container'])) {
$request['children'] = $app['server']->getContainerContents($request['container'],null,0,'(objectClass=*)',$_SESSION[APPCONFIG]->getValue('deref','tree'));
sort($request['children']);
foreach ($app['server']->getBaseDN() as $base) {
if (DEBUG_ENABLED)
debug_log('Comparing BaseDN [%s] with container [%s]',64,0,__FILE__,__LINE__,__METHOD__,$base,$request['container']);
if (! pla_compare_dns($request['container'],$base)) {
$parent_container = false;
$href['up'] = sprintf('entry_chooser.php?form_element=%s&rdn=%s',$request['element'],rawurlencode($request['rdn']));
break;
} else {
$parent_container = $app['server']->getContainer($request['container']);
$href['up'] = sprintf('entry_chooser.php?form_element=%s&rdn=%s&server_id=%s&container=%s',
$request['element'],$request['rdn'],$app['server']->getIndex(),rawurlencode($parent_container));
}
}
echo '<tr>';
echo '<td class="blank">&nbsp;</td>';
printf('<td class="icon"><a href="%s"><img src="%s/up.png" alt="Up" /></a></td>',$href['up'],IMGDIR);
printf('<td colspan=2><a href="%s">%s...</a></td>',$href['up'],_('Back Up'));
echo '</tr>';
if (! count($request['children']))
printf('<td class="blank" colspan=2>&nbsp;</td><td colspan=2">(%s)</td>',_('no entries'));
else
foreach ($request['children'] as $dn) {
$href['return'] = sprintf("javascript:returnDN('%s%s')",($request['rdn'] ? sprintf('%s,',$request['rdn']) : ''),rawurlencode($dn));
$href['expand'] = sprintf('entry_chooser.php?server_id=%s&form_element=%s&rdn=%s&container=%s',
$app['server']->getIndex(),$request['element'],$request['rdn'],rawurlencode($dn));
echo '<tr>';
echo '<td class="blank">&nbsp;</td>';
printf('<td class="icon"><a href="%s"><img src="%s/plus.png" alt="Plus" /></a></td>',$href['expand'],IMGDIR);
printf('<td colspan=2><a href="%s">%s</a></td>',$href['return'],$dn);
echo '</tr>';
echo "\n\n";
}
# Draw the root of the selection tree (ie, list all the servers)
} else {
foreach ($_SESSION[APPCONFIG]->getServerList() as $index => $server) {
if ($server->isLoggedIn(null)) {
printf('<tr><td class="heading" colspan=3>%s:</td><td class="heading">%s</td></tr>',_('Server'),$server->getName());
foreach ($server->getBaseDN() as $dn) {
if (! $dn) {
printf('<tr><td class="blank">&nbsp;</td><td colspan=3>(%s)</td></tr>',_('Could not determine base DN'));
} else {
$href['return'] = sprintf("javascript:returnDN('%s%s')",($request['rdn'] ? sprintf('%s,',$request['rdn']) : ''),rawurlencode($dn));
$href['expand'] = htmlspecialchars(sprintf('entry_chooser.php?server_id=%s&form_element=%s&rdn=%s&container=%s',
$server->getIndex(),$request['element'],$request['rdn'],rawurlencode($dn)));
echo '<tr>';
echo '<td class="blank">&nbsp;</td>';
printf('<td colspan=2 class="icon"><a href="%s"><img src="%s/plus.png" alt="Plus" /></a></td>',$href['expand'],IMGDIR);
printf('<td colspan=2><a href="%s">%s</a></td>',$href['return'],$dn);
}
}
echo '<tr><td class="blank" colspan=4>&nbsp;</td></tr>';
}
}
}
echo '</table>';
echo '</div>';
# Capture the output and put into the body of the page.
$www['body'] = new block();
$www['body']->SetBody(ob_get_contents());
$www['page']->block_add('body',$www['body']);
ob_end_clean();
# Render the popup.
$www['page']->display(array('CONTROL'=>false,'FOOT'=>false,'HEAD'=>false,'TREE'=>false));
?>

27
htdocs/expand.php Normal file
View File

@@ -0,0 +1,27 @@
<?php
/**
* This script alters the session variable 'tree', expanding it
* at the dn specified in the query string.
*
* Note: this script is equal and opposite to collapse.php
*
* @package phpLDAPadmin
* @subpackage Tree
* @see collapse.php
*/
/**
*/
require './common.php';
$dn = get_request('dn','GET',true);
$tree = get_cached_item($app['server']->getIndex(),'tree');
$entry = $tree->getEntry($dn);
$entry->open();
set_cached_item($app['server']->getIndex(),'tree','null',$tree);
header(sprintf('Location:index.php?server_id=%s&junk=%s#%s%s',
$app['server']->getIndex(),random_junk(),htmlid($app['server']->getIndex(),$dn),app_session_param()));
die();
?>

40
htdocs/export.php Executable file
View File

@@ -0,0 +1,40 @@
<?php
/**
* Performs the export of data from the LDAP server
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require './common.php';
require LIBDIR.'export_functions.php';
# Prevent script from bailing early for long search
@set_time_limit(0);
$request = array();
$request['file'] = get_request('save_as_file') ? true : false;
$request['exporter'] = new Exporter($app['server']->getIndex(),get_request('exporter_id','REQUEST'));
$request['export'] = $request['exporter']->getTemplate();
$types = $request['export']->getType();
# send the header
if ($request['file']) {
$obStatus = ob_get_status();
if (isset($obStatus['type']) && $obStatus['type'] && $obStatus['status'])
ob_end_clean();
header('Content-type: application/download');
header(sprintf('Content-Disposition: inline; filename="%s.%s"','export',$types['extension'].($request['export']->isCompressed() ? '.gz' : '')));
$request['export']->export();
die();
} else {
print '<span style="font-size: 14px; font-family: courier;"><pre>';
$request['export']->export();
print '</pre></span>';
}
?>

213
htdocs/export_form.php Executable file
View File

@@ -0,0 +1,213 @@
<?php
/**
* Export entries from the LDAP server.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require './common.php';
require LIBDIR.'export_functions.php';
$request = array();
$request['dn'] = get_request('dn','GET');
$request['format'] = get_request('format','GET',false,get_line_end_format());
$request['scope'] = get_request('scope','GET',false,'base');
$request['exporter_id'] = get_request('exporter_id','GET',false,'LDIF');
$request['filter'] = get_request('filter','GET',false,'(objectClass=*)');
$request['attr'] = get_request('attributes','GET',false,'*');
$request['sys_attr'] = get_request('sys_attr','GET') ? true: false;
$available_formats = array(
'mac' => 'Macintosh',
'unix' => 'UNIX (Linux, BSD)',
'win' => 'Windows'
);
$available_scopes = array(
'base' => _('Base (base dn only)'),
'one' => _('One (one level beneath base)'),
'sub' => _('Sub (entire subtree)')
);
$request['page'] = new PageRender($app['server']->getIndex(),get_request('template','REQUEST',false,'none'));
$request['page']->drawTitle(sprintf('<b>%s</b>',_('Export')));
printf('<script type="text/javascript" language="javascript" src="%sdnChooserPopup.js"></script>',JSDIR);
printf('<script type="text/javascript" language="javascript" src="%sform_field_toggle_enable.js"></script>',JSDIR);
echo '<br />';
echo '<center>';
echo '<form name="export_form" action="cmd.php" method="post">';
echo '<input type="hidden" name="cmd" value="export" />';
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
echo '<table class="forminput">';
echo '<tr>';
echo '<td>';
echo '<fieldset>';
printf('<legend>%s</legend>',_('Export'));
echo '<table>';
printf('<tr><td>%s</td><td>%s</td></tr>',_('Server'),$app['server']->getName());
echo '<tr>';
printf('<td style="white-space:nowrap">%s</td>',_('Base DN'));
echo '<td><span style="white-space: nowrap;">';
printf('<input type="text" name="dn" id="dn" style="width:230px" value="%s" />&nbsp;',htmlspecialchars($request['dn']));
draw_chooser_link('export_form.dn');
echo '</span></td>';
echo '</tr>';
echo '<tr>';
printf('<td><span style="white-space: nowrap">%s</span></td>',_('Search Scope'));
echo '<td>';
foreach ($available_scopes as $id => $desc)
printf('<input type="radio" name="scope" value="%s" id="%s"%s /><label for="%s">%s</label><br />',
htmlspecialchars($id),$id,($id == $request['scope']) ? 'checked="true"' : '',
htmlspecialchars($id),$desc);
echo '</td>';
echo '</tr>';
printf('<tr><td>%s</td><td><input type="text" name="filter" style="width:300px" value="%s" /></td></tr>',
_('Search Filter'),htmlspecialchars($request['filter']));
printf('<tr><td>%s</td><td><input type="text" name="attributes" style="width:300px" value="%s" /></td></tr>',
_('Show Attributtes'),htmlspecialchars($request['attr']));
printf('<tr><td>&nbsp;</td><td><input type="checkbox" name="sys_attr" id="sys_attr" %s/> <label for="sys_attr">%s</label></td></tr>',
$request['sys_attr'] ? 'checked="true" ' : '',_('Include system attributes'));
printf('<tr><td>&nbsp;</td><td><input type="checkbox" id="save_as_file" name="save_as_file" onclick="export_field_toggle(this)" /> <label for="save_as_file">%s</label></td></tr>',
_('Save as file'));
printf('<tr><td>&nbsp;</td><td><input type="checkbox" id="compress" name="compress" disabled /> <label for="compress">%s</label></td></tr>',
_('Compress'));
echo '</table>';
echo '</fieldset>';
echo '</td>';
echo '</tr>';
echo '<tr>';
echo '<td>';
echo '<table style="width: 100%">';
echo '<tr>';
echo '<td style="width: 50%">';
echo '<fieldset style="height: 100px">';
printf('<legend>%s</legend>',_('Export format'));
foreach (Exporter::types() as $index => $exporter) {
printf('<input type="radio" name="exporter_id" id="exporter_id_%s" value="%s"%s/>',
htmlspecialchars($exporter['type']),htmlspecialchars($exporter['type']),($exporter['type'] === $request['exporter_id']) ? ' checked="true"' : '');
printf('<label for="%s">%s</label><br />',
htmlspecialchars($exporter['type']),$exporter['type']);
}
echo '</fieldset>';
echo '</td>';
echo '<td style="width: 50%">';
echo '<fieldset style="height: 100px">';
printf('<legend>%s</legend>',_('Line ends'));
foreach ($available_formats as $id => $desc)
printf('<input type="radio" name="format" value="%s" id="%s"%s /><label for="%s">%s</label><br />',
htmlspecialchars($id),htmlspecialchars($id),($request['format']==$id) ? ' checked="true"' : '',
htmlspecialchars($id),$desc);
echo '</fieldset>';
echo '</td></tr>';
echo '</table>';
echo '</td>';
echo '</tr>';
printf('<tr><td colspan="2"><center><input type="submit" name="target" value="%s" /></center></td></tr>',
htmlspecialchars(_('Proceed >>')));
echo '</table>';
echo '</form>';
echo '</center>';
/**
* Helper function for fetching the line end format.
*
* @return String 'win', 'unix', or 'mac' based on the user's browser..
*/
function get_line_end_format() {
if (is_browser('win'))
return 'win';
elseif (is_browser('unix'))
return 'unix';
elseif (is_browser('mac'))
return 'mac';
else
return 'unix';
}
/**
* Gets the USER_AGENT string from the $_SERVER array, all in lower case in
* an E_NOTICE safe manner.
*
* @return string|false The user agent string as reported by the browser.
*/
function get_user_agent_string() {
if (isset($_SERVER['HTTP_USER_AGENT']))
return strtolower($_SERVER['HTTP_USER_AGENT']);
else
return '';
}
/**
* Determine the OS for the browser
*/
function is_browser($type) {
$agents = array();
$agents['unix'] = array(
'sunos','sunos 4','sunos 5',
'i86',
'irix','irix 5','irix 6','irix6',
'hp-ux','09.','10.',
'aix','aix 1','aix 2','aix 3','aix 4',
'inux',
'sco',
'unix_sv','unix_system_v','ncr','reliant','dec','osf1',
'dec_alpha','alphaserver','ultrix','alphastation',
'sinix',
'freebsd','bsd',
'x11','vax','openvms'
);
$agents['win'] = array(
'win','win95','windows 95',
'win16','windows 3.1','windows 16-bit','windows','win31','win16','winme',
'win2k','winxp',
'win98','windows 98','win9x',
'winnt','windows nt','win32',
'32bit'
);
$agents['mac'] = array(
'mac','68000','ppc','powerpc'
);
if (isset($agents[$type]))
return in_array(get_user_agent_string(),$agents[$type]);
else
return false;
}
?>

6
htdocs/images/INFO Normal file
View File

@@ -0,0 +1,6 @@
PLA's icons come from http://jimmac.musichall.cz/ikony.php3, or the projects that
he drew them for.
They are open source, either licensed under the GPL or a CC license.
They are great icons so be sure to let Jakub know :)

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Some files were not shown because too many files have changed in this diff Show More