RELEASE 0.9.1

This commit is contained in:
Deon George 2009-06-30 18:07:14 +10:00
parent 763843c16a
commit ed7caca53b
64 changed files with 4356 additions and 1389 deletions

39
INSTALL
View File

@ -2,39 +2,48 @@ These instructions assume that you have a working install of:
a. A web server (Apache, IIS, etc).
b. PHP (with LDAP support)
Installing phpLDAPAdmin in 4 easy steps:
* Installing phpLDAPadmin in 4 easy steps:
1. Untar the archive (if you're reading this, you've already done that).
2. Put the resulting phpldapadmin directory somewhere in your webroot.
1. Untar 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.
4. Then, point your browser to the phpldapadmin directory.
Browsers
* Browser Notes
phpLDAPAdmin was developed on Mozilla, and will most likely run best thereon.
phpLDAPadmin was developed on Mozilla, and will most likely run best thereon.
However, testing has been done on Internet Explorer, and it should work
well also. No testing has been done on either Konqueror (or any khtml-based
browser like Safari) or Opera. If you find a browser incompatibility,
please report it.
Contributors (thank you!)
* Contributors (thank you!)
Project Developers:
- David Smith Maintainer
- Xavier Renard LDIF master
- Nate Rotschafer Release manager
Patch writers:
- Mario Valdez jpegPhoto support, localization (not yet in 0.8.x), html fixes
- Bayu Irawan userPassword encryption support, html fixes, ldap_modify fixes
- Uwe Ebel short_open_tags fix-it script
- Philippe Broussard form auth_type bug report
- Andrew Tipton SUP support in schema-fetching
- 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
- Chric Jackson Blowfish and md5crypt passwords
- Marius Rieder Enhanced schema parser
- Nick Burch Many realpath() fixes
Bug reporters:
Translators:
- Colin Tinker (short_open_tags bug report)
- Greg Felix (multi-value update bug report)
- Moritz Mertinkat (creation bug report)
- Uwe Ebel German
- Xavier Renard French
- Dave Smith English ;)
If you can help translate, please join the phpldapadmin-devel mailing list:
https://lists.sourceforge.net/mailman/listinfo/phpldapadmin-devel

View File

@ -1 +1 @@
0.9.0
0.9.1

View File

@ -14,17 +14,19 @@
* - new_attrs (array, if any)
*/
require 'config.php';
require 'functions.php';
require 'common.php';
$dn = stripslashes( rawurldecode( $_POST['dn'] ) );
$dn = rawurldecode( $_POST['dn'] );
$encoded_dn = rawurlencode( $dn );
$new_oclass = stripslashes( $_POST['new_oclass'] );
$new_oclass = $_POST['new_oclass'];
$server_id = $_POST['server_id'];
$new_attrs = $_POST['new_attrs'];
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
if( is_server_read_only( $server_id ) )
pla_error( $lang['no_updates_in_read_only_mode'] );
check_server_id( $server_id ) or pla_error( $lang['bad_server_id'] );
have_auth_info( $server_id ) or pla_error( $lang['not_enough_login_info'] );
$new_entry = array();
$new_entry['objectClass'] = $new_oclass;
@ -40,12 +42,12 @@ if( is_array( $new_attrs ) && count( $new_attrs ) > 0 )
//print_r( $new_entry );
//exit;
$ds = pla_ldap_connect( $server_id ) or pla_error( "Could not connect to LDAP server." );
$ds = pla_ldap_connect( $server_id ) or pla_error( $lang['could_not_connect'] );
$add_res = @ldap_mod_add( $ds, $dn, $new_entry );
if( ! $add_res )
{
pla_error( "Could not perform ldap_mod_add operation", ldap_error( $ds ), ldap_errno( $ds ) );
pla_error( $lang['could_not_perform_ldap_mod_add'], ldap_error( $ds ), ldap_errno( $ds ) );
}
else
{

View File

@ -15,16 +15,18 @@
* - new_oclass
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$dn = stripslashes( rawurldecode( $_POST['dn'] ) );
$dn = rawurldecode( $_POST['dn'] );
$encoded_dn = rawurlencode( $dn );
$new_oclass = stripslashes( $_POST['new_oclass'] );
$new_oclass = $_POST['new_oclass'];
$server_id = $_POST['server_id'];
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
if( is_server_read_only( $server_id ) )
pla_error( $lang['no_updates_in_read_only_mode'] );
check_server_id( $server_id ) or pla_error( $lang['bad_server_id'] );
have_auth_info( $server_id ) or pla_error( $lang['not_enough_login_info'] );
/* 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
@ -47,19 +49,19 @@ foreach( $must_attrs as $attr )
if( count( $needed_attrs ) > 0 )
{
?>
<?php include 'header.php'; ?>
include 'header.php'; ?>
<body>
<h3 class="title">New Required Attributes</h3>
<h3 class="subtitle">This action requires you to add <?php echo count($needed_attrs); ?> new attribute<?php echo (count($needed_attrs)>1?'s':''); ?></h3>
<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>
Instrucitons: In order to add the objectClass <b><?php echo $new_oclass; ?></b> to the object <b><?php echo htmlspecialchars($dn); ?></b>,
you must specify <?php echo count( $needed_attrs ); ?> new attribute<?php echo (count($needed_atts)>1?'s':''); ?> that this
objectClass requires. You can do so in this form.</small>
<?php
echo $lang['new_required_attrs_instructions'];
echo ' ' . count( $needed_attrs ) . ' ' . $lang['new_attributes'] . ' ';
echo $lang['that_this_oclass_requires']; ?>
</small>
<br />
<br />
@ -70,7 +72,7 @@ if( count( $needed_attrs ) > 0 )
<input type="hidden" name="server_id" value="<?php echo $server_id; ?>" />
<table class="edit_dn" cellspacing="0">
<tr><th colspan="2">New Required Attributes</th></tr>
<tr><th colspan="2"><?php echo $lang['new_required_attrs']; ?></th></tr>
<?php foreach( $needed_attrs as $count => $attr ) { ?>
<?php if( $count % 2 == 0 ) { ?>
@ -86,7 +88,7 @@ if( count( $needed_attrs ) > 0 )
</table>
<br />
<br />
<center><input type="submit" value="Add ObjectClass and Attributes" /></center>
<center><input type="submit" value="<?php echo $lang['add_oclass_and_attrs']; ?>" /></center>
</form>
</body>

View File

@ -8,36 +8,40 @@
* - attr (rawurlencoded) the attribute to which we are adding a value
* - server_id
* - new_value (form element)
* - binary
*
* On success, redirect to the edit_dn page.
* On failure, echo an error.
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$dn = stripslashes( rawurldecode( $_POST['dn'] ) );
$dn = rawurldecode( $_POST['dn'] );
$encoded_dn = rawurlencode( $dn );
$attr = stripslashes( $_POST['attr'] );
$attr = $_POST['attr'];
$encoded_attr = rawurlencode( $attr );
$server_id = $_POST['server_id'];
$new_value = stripslashes( $_POST['new_value'] );
$new_value = $_POST['new_value'];
$new_value = utf8_encode($new_value);
$is_binary_val = isset( $_POST['binary'] ) ? true : false;
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
if( is_server_read_only( $server_id ) )
pla_error( $lang['no_updates_in_read_only_mode'] );
$ds = pla_ldap_connect( $server_id ) or pla_error( "Could not connect to LDAP server" );
check_server_id( $server_id ) or pla_error( $lang['bad_server_id'] );
have_auth_info( $server_id ) or pla_error( $lang['not_enough_login_info'] );
// special case for jpegPhoto attributes:
$ds = pla_ldap_connect( $server_id ) or pla_error( $lang['could_not_connect'] );
// special case for binary attributes:
// we must go read the data from the file.
if( 0 == strcasecmp( $attr, 'jpegPhoto' ) )
if( $is_binary_val )
{
$file = $_FILES['jpeg_photo_file']['tmp_name'];
$file = $_FILES['new_value']['tmp_name'];
$f = fopen( $file, 'r' );
$jpeg_data = fread( $f, filesize( $file ) );
$binary_value = fread( $f, filesize( $file ) );
fclose( $f );
$new_value = $jpeg_data;
$new_value = $binary_value;
}
$new_entry = array( $attr => $new_value );
@ -45,7 +49,7 @@ $new_entry = array( $attr => $new_value );
$add_result = @ldap_mod_add( $ds, $dn, $new_entry );
if( ! $add_result )
pla_error( "Could not perform ldap_mod_add operation.", ldap_error( $ds ), ldap_errno( $ds ) );
pla_error( $lang['could_not_perform_ldap_mod_add'], ldap_error( $ds ), ldap_errno( $ds ) );
header( "Location: edit.php?server_id=$server_id&dn=$encoded_dn&updated_attr=$encoded_attr" );

View File

@ -11,34 +11,36 @@
*
*/
require 'common.php';
require 'config.php';
require_once 'functions.php';
$dn = stripslashes( $_GET['dn'] );
$dn = $_GET['dn'];
$encoded_dn = rawurlencode( $dn );
$server_id = $_GET['server_id'];
$rdn = ldap_explode_dn( $dn, 0 );
$rdn = pla_explode_dn( $dn );
$rdn = $rdn[0];
$server_name = $servers[$server_id]['name'];
$attr = stripslashes( $_GET['attr'] );
$attr = $_GET['attr'];
$encoded_attr = rawurlencode( $attr );
$current_values = get_object_attr( $server_id, $dn, $attr );
$num_current_values = ( is_array($current_values) ? count($current_values) : 1 );
$is_object_class = ( 0 == strcasecmp( $attr, 'objectClass' ) ) ? true : false;
$is_jpeg_photo = ( 0 == strcasecmp( $attr, 'jpegPhoto' ) ) ? true : false;
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
if( is_server_read_only( $server_id ) )
pla_error( $lang['no_updates_in_read_only_mode'] );
check_server_id( $server_id ) or pla_error( $lang['bad_server_id'] );
have_auth_info( $server_id ) or pla_error( $lang['not_enough_login_info'] );
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( $server_id );
if( ! is_array( $current_values ) )
$current_values = array( $current_values );
foreach( $current_values as $oclass )
unset( $schema_oclasses[ strtolower( $oclass ) ] );
} else {
$schema_attrs = get_schema_attributes( $server_id );
$schema_attr = get_schema_attribute( $server_id, $attr );
}
?>
@ -47,11 +49,18 @@ if( $is_object_class ) {
<body>
<h3 class="title">New <b><?php echo htmlspecialchars($attr); ?></b> value for <b><?php echo htmlentities($rdn); ?></b></h3>
<h3 class="subtitle">Server: <b><?php echo $server_name; ?></b> &nbsp;&nbsp;&nbsp; Distinguished Name: <b><?php echo $dn; ?></b></h3>
<h3 class="title">
<?php echo $lang['add_new']; ?>
<b><?php echo htmlspecialchars($attr); ?></b>
<?php echo $lang['value_to']; ?>
<b><?php echo htmlentities($rdn); ?></b></h3>
<h3 class="subtitle">
<?php echo $lang['server']; ?>:
<b><?php echo $server_name; ?></b> &nbsp;&nbsp;&nbsp;
<?php echo $lang['distinguished_name']; ?>: <b><?php echo htmlspecialchars( $dn ); ?></b></h3>
Current list of <b><?php echo $num_current_values; ?></b> value<?php echo $num_current_values>1?'s':''; ?>
for attribute <b><?php echo htmlspecialchars($attr); ?></b>:
<?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( $is_jpeg_photo ) { ?>
@ -61,8 +70,23 @@ Current list of <b><?php echo $num_current_values; ?></b> value<?php echo $num_c
<!-- Temporary warning until we find a way to add jpegPhoto values without an INAPROPRIATE_MATCHING error -->
<p><small>
Note: You will get an "inappropriate matching" error if you have not<br />
setup an <tt>EQUALITY</tt> rule on your LDAP server for <tt>jpegPhoto</tt> attributes.
<?php echo $lang['inappropriate_matching_note']; ?>
</small></p>
<!-- End of temporary warning -->
<?php } else if( is_attr_binary( $server_id, $attr ) ) { ?>
<ul>
<?php if( is_array( $vals ) ) { for( $i=1; $i<=count($vals); $i++ ) {
$href = "download_binary_attr.php?server_id=$server_id&amp;dn=$encoded_dn&amp;attr=$attr&amp;value_num=" . ($i-1); ?>
<li><a href="<?php echo $href; ?>"><img src="images/save.png" /> <?php echo $lang['download_value'] . ' ' . $i; ?>)</a></li>
<?php } } else {
$href = "download_binary_attr.php?server_id=$server_id&amp;dn=$encoded_dn&amp;attr=$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 -->
@ -84,7 +108,8 @@ Current list of <b><?php echo $num_current_values; ?></b> value<?php echo $num_c
<?php } ?>
Enter the value you would like to add:<br />
<?php echo $lang['enter_value_to_add']; ?>
<br />
<br />
<?php if( $is_object_class ) { ?>
@ -102,29 +127,31 @@ Enter the value you would like to add:<br />
</select> <input type="submit" value="Add new objectClass" />
<br /><small>Note: you may be required to enter new attributes<br />
that this objectClass requires (MUST attrs)</small>
<?php } elseif( $is_jpeg_photo ) { ?>
<form action="add_value.php" method="post" class="new_value" enctype="multipart/form-data">
<input type="hidden" name="server_id" value="<?php echo $server_id; ?>" />
<input type="hidden" name="dn" value="<?php echo $encoded_dn; ?>" />
<input type="hidden" name="attr" value="<?php echo $encoded_attr; ?>" />
<input type="file" name="jpeg_photo_file" value="" /><br />
<br />
<input type="submit" name="submit" value="Add new jpeg &gt;&gt;" />
<br /><small><?php echo $lang['new_required_attrs_note']; ?></small>
<?php } else { ?>
<form action="add_value.php" method="post" class="new_value">
<form action="add_value.php" method="post" class="new_value" <?php
if( is_attr_binary( $server_id, $attr ) ) echo "enctype=\"multipart/form-data\""; ?>>
<input type="hidden" name="server_id" value="<?php echo $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( $server_id, $attr ) ) { ?>
<input type="file" name="new_value" />
<input type="hidden" name="binary" value="true" />
<?php } else { ?>
<input type="text" name="new_value" size="40" value="" />
<?php } ?>
<input type="submit" name="submit" value="Add New Value" />
<br />
<small>Syntax: <?php echo $schema_attrs[ strtolower($attr) ]['type']; ?></small>
<small><?php echo $lang['syntax']; ?>: <?php echo $schema_attr->getType(); ?></small><br />
<?php if( $schema_attr->getMaxLength() ) { ?>
<small>Max length: <?php echo number_format( $schema_attr->getMaxLength() ); ?>
characters</small>
<?php } ?>
</form>
<?php } ?>

View File

@ -12,18 +12,20 @@
* Note: this script is equal and opposite to expand.php
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$dn = stripslashes( $_GET['dn'] );
$dn = $_GET['dn'];
$encoded_dn = rawurlencode( $dn );
$server_id = $_GET['server_id'];
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
session_start();
session_is_registered( 'tree' ) or pla_error( "Your session tree is not registered. That's weird. Shouldn't ever happen".
". Just go back and it should be fixed automagically." );
// dave commented this out since it was being triggered for weird reasons
//session_is_registered( 'tree' ) or pla_error( "Your session tree is not registered. That's weird. Shouldn't ever happen".
// ". Just go back and it should be fixed automagically." );
$tree = $_SESSION['tree'];
// and remove this instance of the dn as well
@ -38,6 +40,12 @@ session_write_close();
$time = gettimeofday();
$random_junk = md5( strtotime( 'now' ) . $time['usec'] );
header( "Location: tree.php?foo=$random_junk#{$server_id}_{$encoded_dn}" );
// 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( "Location:tree.php?foo=$random_junk%23{$server_id}_{$encoded_dn}$id_session_param" );
?>

53
common.php Normal file
View File

@ -0,0 +1,53 @@
<?php
/*
* common.php
* Contains code to be executed at the top of each phpLDAPadmin page.
* include this file at the top of every PHP file.
*/
if( file_exists( realpath( 'config.php' ) ) ) {
require realpath( 'config.php' );
}
require_once realpath( 'functions.php' );
require_once realpath( 'schema_functions.php' );
// grab the language file configured in config.php
if( ! isset( $language ) )
$language = 'english';
if( file_exists( realpath( "lang/$language.php" ) ) )
include realpath( "lang/$language.php" );
// Turn off notices about referencing arrays and such, but leave everything else on.
error_reporting( E_ALL ^ E_NOTICE );
if( ! isset( $templates ) || ! is_array( $templates ) )
$tempaltes = 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 ) ) {
if( ! function_exists( "array_stripslashes" ) ) {
function array_stripslashes(&$array) {
if( is_array( $array ) )
while ( list( $key ) = each( $array ) )
if ( is_array( $array[$key] ) && $key != $array )
array_stripslashes( $array[$key] );
else
$array[$key] = stripslashes( $array[$key] );
}
}
array_stripslashes($_POST);
array_stripslashes($_GET);
array_stripslashes($_COOKIES);
$slashes_stripped = true;
}
?>

View File

@ -1,14 +1,16 @@
<?php
/*
* The phpLDAPAdmin config file
* This is where you customize phpLDAPAdmin. The most important
* The phpLDAPadmin config file
*
* This is where you customize phpLDAPadmin. The most important
* part is immediately below: The "LDAP Servers" section.
* You must specify at least one LDAP server there.
* 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.
*
*/
// Required Configuration
// Your LDAP servers
$i=0;
$servers = array();
@ -16,7 +18,7 @@ $servers[$i]['name'] = 'My LDAP Server'; /* A convenient name that will appear
$servers[$i]['host'] = 'ldap.example.com'; /* Examples: 'ldap.example.com', 'ldaps://ldap.example.com/'
Note: Leave blank to remove it from the list of servers in the
tree viewer*/
$servers[$i]['base'] = 'dc=example,dc=com';/* The base DN of your LDAP server. Leave this blank to have phpLDAPAdmin
$servers[$i]['base'] = 'dc=example,dc=com';/* The base DN of your LDAP server. Leave this blank to have phpLDAPadmin
auto-detect it for you. */
$servers[$i]['port'] = 389; /* The port your LDAP server listens on (no quotes) */
$servers[$i]['auth_type'] = 'config'; /* 2 options: 'form': you will be prompted, and a cookie stored
@ -26,8 +28,17 @@ $servers[$i]['login_dn'] = 'cn=Manager,dc=example,dc=com'; /* For anonymous bind
login_pass blank */
$servers[$i]['login_pass'] = 'secret'; /* Your password (only if you specified 'config' for 'auth_type' */
$servers[$i]['tls'] = false; /* Use TLS to connect. Requires PHP 4.2 or greater */
$servers[$i]['default_hash'] = 'crypt'; /* Default password hashing algorith: one of md5, sha, md5crpyt, blowfish or
leave blank for now default algorithm. */
$servers[$i]['login_attr'] = 'dn'; /* If you specified 'form' as the auth_type above, you can optionally
specify here an attribute to use when logging in. If you enter 'uid',
then login as 'dsmith', phpLDAPadmin will search for uid=dsmith and
log in as such. Leave blank or specify 'dn' to use full DN for logging in .*/
$servers[$i]['read_only'] = false; /* Specify true If you want phpLDAPadmin to not display or permit any
modification to the LDAP server. */
/* If you want to configure an additional LDAP server, do so below. */
/* If you want to configure additional LDAP servers, do so below. */
$i++;
$servers[$i]['name'] = 'Another server';
$servers[$i]['host'] = '';
@ -37,68 +48,56 @@ $servers[$i]['auth_type'] = 'config';
$servers[$i]['login_dn'] = '';
$servers[$i]['login_pass'] = '';
$servers[$i]['tls'] = false;
$servers[$i]['default_hash'] = 'crypt';
$servers[$i]['login_attr'] = '';
$servers[$i]['read_only'] = false;
$i++;
$servers[$i]['name'] = 'Another server';
$servers[$i]['host'] = '';
$servers[$i]['base'] = 'dc=example,dc=com';
$servers[$i]['port'] = 389;
$servers[$i]['auth_type'] = 'config';
$servers[$i]['login_dn'] = '';
$servers[$i]['login_pass'] = '';
$servers[$i]['tls'] = false;
/* If you want to configure more LDAP servers, copy and paste the sections above (including the "$i++;") */
// If you want to configure more LDAP servers, copy and paste the above (including the "$i++;")
// The temporary storage directory where we will put jpegPhoto data
// This directory must be readable and writable by your web server
$jpeg_temp_dir = "/tmp"; // for Unix systems
//$jpeg_temp_dir = "c:\\temp"; // for Windows systems
// Optional Configuration Below
$jpeg_temp_dir = "/tmp"; // Example for Unix systems
//$jpeg_temp_dir = "c:\\temp"; // Example for Windows systems
/** **/
/** Appearance and Behavior **/
/** **/
// The language setting. Right now, 'english', 'german' and 'french' are available
// Localization is not complete yet, but most strings have been translated.
// Please help by writing language files. See lang/english.php for an example.
$language = 'english';
// 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
$anonymous_bind_implies_read_only = true;
// 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)
$cookie_time = 0;
$cookie_time = 0; // seconds
// How many pixels wide do you want your left frame view (for the tree browser)
$tree_width = 300;
$tree_width = 300; // pixels
// Do you want phpLDAPAdmin to check the schema of the server when you edit a DN and draw
// specialized for elements based on that schema (ie, for booleans, draw a true/false
// drop-down instead of a text box). This may cause a performance slow-down.
// Note:
// This will have problems with non-LDAP compliant servers that do not properly represent
// their schema.
$edit_dn_schema_lookup = true;
// How long to keep jpegPhoto temporary files around (in seconds)
$jpeg_tmp_keep_time = 120;
// How long to keep jpegPhoto temporary files in the jpeg_temp_dir directory (in seconds)
$jpeg_tmp_keep_time = 120; // seconds
/** **/
/** Simple Search Form Config **/
/** **/
// Which attributes to include in the drop-down menu of the simple search form (comma-separated)
$search_attributes = "uid, cn, gidNumber";
// Change this to suit your needs for convenient searching. Be sure to change the correlating
// list below ($search_attributes_display)
$search_attributes = "uid, cn, gidNumber, objectClass";
// This list correlates to the list directly above. If you want to present more readable names
// for your search attributes, do so here. Both lists must have the same number of entries.
$search_attributes_display = "User Name, Full Name, Group ID";
$search_attributes_display = "User Name, Common Name, Group ID, objectClass";
// The list of attributes to display in each search result entry summary
$search_result_attributes = "dn, cn";
// Search methods in the drop down box for the simple search form
// (if you change this, you will also have to edit search.php to properly handle the new option)
$search_criteria_options = "equals, starts with, contains, ends with, sounds like";
/** **/
/** Templates for entry creation **/
/** **/
@ -106,17 +105,17 @@ $search_criteria_options = "equals, starts with, contains, ends with, sounds lik
$templates = array();
// Fill in this array with templates that you can create to suit your needs.
// Each entry defines a description (for display in the template list) and
// Each entry defines a description (to be displayed in the template list) and
// a handler, which is a file that will be executed with certain POST vars set.
// See the templates provided here for an example of how to make your own template.
// See the templates provided here for examples of how to make your own template.
$templates[] =
array( 'desc' => 'User',
array( 'desc' => 'User Account',
'icon' => 'images/user.png',
'handler' => 'new_user_template.php' );
$templates[] =
array( 'desc' => 'inetOrgPerson',
array( 'desc' => 'Address Book Entry (inetOrgPerson)',
'icon' => 'images/user.png',
'handler' => 'new_address_template.php' );
@ -125,16 +124,32 @@ $templates[] =
'icon' => 'images/ou.png',
'handler' => 'new_ou_template.php' );
$templates[] =
array( 'desc' => 'Posix Group',
'icon' => 'images/ou.png',
'handler' => 'new_posix_group_template.php' );
$templates[] =
array( 'desc' => 'Samba NT Machine',
'icon' => 'images/terminal.png',
'icon' => 'images/nt.png',
'handler' => 'new_nt_machine.php' );
$templates[] =
array( 'desc' => 'Samba User',
'icon' => 'images/user.png',
'handler' => 'new_smbuser_template.php' );
$templates[] =
array( 'desc' => 'DNS Entry',
'icon' => 'images/dc.png',
'handler' => 'new_dns_entry.php' );
$templates[] =
array( 'desc' => 'Posix Group',
'icon' => 'images/ou.png',
'handler' => 'new_posix_group_template.php' );
/** **/
/** User-friendly attribute translation **/
/** **/
@ -148,16 +163,14 @@ $friendly_attrs[ 'facsimileTelephoneNumber' ] = 'Fax';
$friendly_attrs[ 'telephoneNumber' ] = 'Phone';
/** **/
/** Some phpLDAPAdmin code to be executed. No touchy. **/
/** Hidden attributes **/
/** **/
// Turn off notices about referencing arrays and such, but leave everything else on.
error_reporting( E_ALL ^ E_NOTICE );
// 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:
// Always including the 'custom' template (the most generic and flexible)
$templates['custom'] =
array( 'desc' => 'Custom',
'icon' => 'images/object.png',
'handler' => 'custom.php' );
//$hidden_attrs = array( 'jpegPhoto', 'objectClass' );
?>

View File

@ -10,17 +10,19 @@
* - server_id
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
session_start();
$source_dn = stripslashes( rawurldecode( $_POST['old_dn'] ) );
$dest_dn = stripslashes( $_POST['new_dn'] );
$source_dn = rawurldecode( $_POST['old_dn'] );
$dest_dn = utf8_encode( $_POST['new_dn'] );
$encoded_dn = rawurlencode( $old_dn );
$source_server_id = $_POST['server_id'];
$dest_server_id = $_POST['dest_server_id'];
$do_recursive = $_POST['recursive'] == 'on' ? true : false;
$do_recursive = ( isset( $_POST['recursive'] ) && $_POST['recursive'] == 'on' ) ? true : false;
if( is_server_read_only( $dest_server_id ) )
pla_error( "You cannot perform updates while server is in read-only mode" );
check_server_id( $source_server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $source_server_id ) );
have_auth_info( $source_server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
@ -72,6 +74,7 @@ if( $copy_result )
if( isset( $tree[$dest_server_id][$container] ) )
{
$tree[$dest_server_id][$container][] = $dest_dn;
sort( $tree[ $dest_server_id ][ $container ] );
$tree_icons[$dest_server_id][$dest_dn] = get_icon( $dest_server_id, $dest_dn );
$_SESSION['tree'] = $tree;
$_SESSION['tree_icons'] = $tree_icons;
@ -102,7 +105,7 @@ else
function r_copy_dn( $source_server_id, $dest_server_id, &$tree, $root_dn, $dest_dn )
{
echo "<nobr>Copying " . htmlspecialchars( utf8_decode( $root_dn ) ) . "...";
echo "<nobr>Copying " . htmlspecialchars( $root_dn ) . "...";
flush();
$copy_result = copy_dn( $source_server_id, $root_dn, $dest_server_id, $dest_dn );

View File

@ -8,13 +8,12 @@
* - server_id
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$dn = stripslashes( rawurldecode( $_GET['dn'] ) );
$dn = rawurldecode( $_GET['dn'] );
$encoded_dn = rawurlencode( $dn );
$server_id = $_GET['server_id'];
$rdn = ldap_explode_dn( $dn, 0 );
$rdn = pla_explode_dn( $dn );
$container = $rdn[ 1 ];
for( $i=2; $i<count($rdn)-1; $i++ )
$container .= ',' . $rdn[$i];
@ -42,11 +41,11 @@ $children = get_container_contents( $server_id, $dn );
<?php include 'header.php'; ?>
<body>
<h3 class="title">Copy <?php echo $rdn; ?></h3>
<h3 class="title">Copy <?php echo utf8_decode( $rdn ); ?></h3>
<h3 class="subtitle">Server: <b><?php echo $server_name; ?></b> &nbsp;&nbsp;&nbsp; Distinguished Name: <b><?php echo $dn; ?></b></h3>
<center>
Copy <b><?php echo htmlspecialchars($rdn); ?></b> to a new object:<br />
Copy <b><?php echo htmlspecialchars( utf8_decode( $rdn )); ?></b> to a new object:<br />
<br />
<form action="copy.php" method="post" name="copy_form">
<input type="hidden" name="old_dn" value="<?php echo $encoded_dn; ?>" />
@ -56,7 +55,7 @@ Copy <b><?php echo htmlspecialchars($rdn); ?></b> to a new object:<br />
<tr>
<td>Destination DN:</td>
<td>
<input type="text" name="new_dn" size="45" value="<?php echo htmlspecialchars($dn); ?>" />
<input type="text" name="new_dn" size="45" value="<?php echo htmlspecialchars( utf8_decode( $dn ) ); ?>" />
<?php draw_chooser_link( 'copy_form.new_dn' ); ?></td>
</td>
</tr>

View File

@ -14,19 +14,21 @@
* - server_id
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$new_dn = stripslashes( $_POST['new_dn'] );
$new_dn = utf8_encode( $new_dn );
$new_dn = $_POST['new_dn'];
//$new_dn = utf8_encode( $new_dn );
$encoded_dn = rawurlencode( $new_dn );
$server_id = $_POST['server_id'];
$vals = $_POST['vals'];
$attrs = $_POST['attrs'];
$required_attrs = $_POST['required_attrs'];
$required_attrs = isset( $_POST['required_attrs'] ) ? $_POST['required_attrs'] : false;
$object_classes = unserialize( rawurldecode( $_POST['object_classes'] ) );
$container = get_container( $new_dn );
if( is_server_read_only( $server_id ) )
pla_error( "You cannot perform updates while server is in read-only mode" );
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
@ -40,8 +42,6 @@ if( isset( $required_attrs ) && is_array( $required_attrs ) )
pla_error( "Error, you left the value for required attribute <b>" .
htmlspecialchars( $attr ) . "</b> blank." );
$attr = stripslashes( $attr );
$val = stripslashes( $val );
$new_entry[ $attr ][] = utf8_encode( $val );
}
}
@ -50,18 +50,39 @@ if( isset( $vals ) && is_array( $vals ) )
{
foreach( $vals as $i => $val )
{
$val = stripslashes( $val );
$attr = $attrs[$i];
$attr = stripslashes( $attr );
if( is_attr_binary( $server_id, $attr ) ) {
if( $_FILES['vals']['name'][$i] != '' ) {
// read in the data from the file
$file = $_FILES['vals']['tmp_name'][$i];
//echo "Reading in file $file...\n";
$f = fopen( $file, 'r' );
$binary_data = fread( $f, filesize( $file ) );
fclose( $f );
$val = $binary_data;
$new_entry[ $attr ][] = $val;
}
} else {
if( trim($val) )
$new_entry[ $attr ][] = utf8_encode( $val );
}
}
}
$new_entry['objectClass'] = $object_classes;
if( ! in_array( 'top', $new_entry['objectClass'] ) )
$new_entry['objectClass'][] = 'top';
// UTF-8 magic. Must decode the values that have been passed to us
foreach( $new_entry as $attr => $vals )
if( is_array( $vals ) )
foreach( $vals as $i => $v )
$new_entry[ $attr ][ $i ] = utf8_decode( $v );
else
$new_entry[ $attr ] = utf8_decode( $vals );
//echo "<pre>"; var_dump( $new_dn );print_r( $new_entry ); echo "</pre>";
$ds = pla_ldap_connect( $server_id );
$add_result = @ldap_add( $ds, $new_dn, $new_entry );
if( $add_result )
@ -77,6 +98,7 @@ if( $add_result )
if( isset( $tree[$server_id][$container] ) ) {
$tree[$server_id][$container][] = $new_dn;
sort( $tree[$server_id][$container] );
$tree_icons[$server_id][$new_dn] = get_icon( $server_id, $new_dn );
}

View File

@ -10,12 +10,14 @@
* - container (rawurlencoded) (optional)
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$server_id = $_REQUEST['server_id'];
$step = $_REQUEST['step'] ? $_REQUEST['step'] : 1; // defaults to 1
$container = stripslashes( $_REQUEST['container'] );
$step = isset( $_REQUEST['step'] ) ? $_REQUEST['step'] : 1; // defaults to 1
$container = $_REQUEST['container'];
if( is_server_read_only( $server_id ) )
pla_error( "You cannot perform updates while server is in read-only mode" );
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );

View File

@ -10,17 +10,18 @@
* template
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$template = stripslashes( $_POST['template'] );
$template = $_POST['template'];
$template = $templates[$template];
$server_id = $_POST['server_id'];
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
$server_name = $servers[ $server_id ][ 'name' ];
if( is_server_read_only( $server_id ) )
pla_error( "You cannot perform updates while server is in read-only mode" );
include 'header.php';
?>
@ -36,6 +37,7 @@ if( ! isset( $_POST['template'] ) )
pla_error( "No template specified in POST variables.\n" );
$handler = 'templates/creation/' . $template['handler'];
$handler = realpath( $handler );
if( file_exists( $handler ) )
include $handler;
else

View File

@ -9,16 +9,18 @@
* - server_id
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$encoded_dn = $_POST['dn'];
$dn = stripslashes( rawurldecode( $encoded_dn ) );
$dn = rawurldecode( $encoded_dn );
$server_id = $_POST['server_id'];
if( $dn === null )
pla_error( "You must specify a DN." );
if( is_server_read_only( $server_id ) )
pla_error( "You cannot perform updates while server is in read-only mode" );
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );

42
delete_attr.php Normal file
View File

@ -0,0 +1,42 @@
<?php
/*
* delete_attr.php
* Deletes an attribute from an entry with NO confirmation.
*
* On success, redirect to edit.php
* On failure, echo an error.
*/
require 'common.php';
if( is_server_read_only( $server_id ) )
pla_error( "You cannot perform updates while server is in read-only mode" );
$server_id = $_POST['server_id'];
$dn = rawurldecode( $_POST['dn'] );
$encoded_dn = rawurlencode( $dn );
$attr = $_POST['attr'];
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
if( ! $attr ) pla_error( "No attribute name specified in POST variables" );
if( ! $dn ) pla_error( "No DN name specified in POST variables" );
$update_array = array();
$update_array[$attr] = array();
$ds = pla_ldap_connect( $server_id );
$res = @ldap_modify( $ds, $dn, $update_array );
if( $res )
{
$redirect_url = "edit.php?server_id=$server_id&dn=$encoded_dn";
foreach( $update_array as $attr => $junk )
$redirect_url .= "&modified_attrs[]=$attr";
header( "Location: $redirect_url" );
}
else
{
pla_error( "Could not perform ldap_modify operation.", ldap_error( $ds ), ldap_errno( $ds ) );
}
?>

View File

@ -9,16 +9,18 @@
* - server_id
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$dn = stripslashes( $_GET['dn'] );
$dn = $_GET['dn'];
$encoded_dn = rawurlencode( $dn );
$server_id = $_GET['server_id'];
$rdn = ldap_explode_dn( $dn, 0 );
$rdn = pla_explode_dn( $dn );
$rdn = $rdn[0];
$server_name = $servers[$server_id]['name'];
if( is_server_read_only( $server_id ) )
pla_error( "You cannot perform updates while server is in read-only mode" );
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
@ -61,7 +63,7 @@ if( $has_children ) {
<p>This object is the root of a sub-tree containing <a href="search.php?search=true&amp;server_id=<?php echo $server_id; ?>&amp;filter=<?php echo rawurlencode('objectClass=*'); ?>&amp;base_dn=<?php echo $encoded_dn; ?>&amp;form=advanced&amp;scope=sub"><?php echo ($sub_tree_count); ?> objects</a>
phpLDAPAdmin can recursively delete this object and all <?php echo ($sub_tree_count-1); ?> of its children. See below for a list of DNs
phpLDAPadmin can recursively delete this object and all <?php echo ($sub_tree_count-1); ?> of its children. See below for a list of DNs
that this will delete. Do you want to do this?<br />
<br />
<small>Note: This is potentially very dangerous and you do this at your own risk. This operation cannot be undone.

28
download_binary_attr.php Normal file
View File

@ -0,0 +1,28 @@
<?php
require 'common.php';
$server_id = $_GET['server_id'];
$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;
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
$ds = pla_ldap_connect( $server_id ) or pla_error( "Coult not connect to LDAP server." );
$search = ldap_read( $ds, $dn, "(objectClass=*)", array( $attr ), 0, 200, 0, LDAP_DEREF_ALWAYS );
$entry = ldap_first_entry( $ds, $search );
$attrs = ldap_get_attributes( $ds, $entry );
$attr = ldap_first_attribute( $ds, $entry, $attrs );
$values = ldap_get_values_len( $ds, $entry, $attr );
$count = $values['count'];
unset( $values['count'] );
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];
?>

421
edit.php
View File

@ -7,20 +7,22 @@
* Variables that come in as GET vars:
* - dn (rawurlencoded)
* - server_id
* - modified_attrs (optional) an array of attributes to highlight as
* they were changed by the last operation
*/
/** If an entry has more children than this, stop searching and display this amount with a '+' */
$max_children = 100;
require 'config.php';
require_once 'functions.php';
require 'common.php';
$dn = stripslashes( rawurldecode( $_GET['dn'] ) );
$encoded_dn = rawurlencode( $dn );
$updated_attr = stripslashes( $_GET['updated_attr'] );
$dn= $_GET['dn'];
$decoded_dn = rawurldecode( $dn );
$encoded_dn = rawurlencode( $decoded_dn );
$modified_attrs = isset( $_GET['modified_attrs'] ) ? $_GET['modified_attrs'] : false;
$server_id = $_GET['server_id'];
$show_internal_attrs = isset( $_GET['show_internal_attrs'] ) ? true : false;
$rdn = ldap_explode_dn( $dn, 0 );
$rdn = pla_explode_dn( $dn );
$rdn = $rdn[0];
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
@ -42,19 +44,24 @@ if( ! is_array( $oclasses ) )
$oclasses = array( $oclasses );
$avail_attrs = array();
$schema_oclasses = get_schema_objectclasses( $server_id, true );
foreach( $oclasses as $oclass )
$avail_attrs = array_merge( $schema_oclasses[ strtolower( $oclass ) ]['must_attrs'],
$schema_attrs = get_schema_attributes( $server_id );
foreach( $oclasses as $oclass ) {
$avail_attrs = array_merge(
$schema_oclasses[ strtolower( $oclass ) ]['must_attrs'],
$schema_oclasses[ strtolower( $oclass ) ]['may_attrs'],
$avail_attrs );
}
$avail_attrs = array_unique( $avail_attrs );
$avail_attrs = array_filter( $avail_attrs, "not_an_attr" );
sort( $avail_attrs );
/* A boolean flag to indicate whether this entry has a jpegPhoto associated with it.
* TODO If it does, the jpegPhotos will be drawn at the bottom of the form */
$has_jpeg_photo = false;
$avail_binary_attrs = array();
foreach( $avail_attrs as $i => $attr ) {
if( is_attr_binary( $server_id, $attr ) ) {
$avail_binary_attrs[] = $attr;
unset( $avail_attrs[ $i ] );
}
}
?>
@ -71,36 +78,42 @@ $has_jpeg_photo = false;
<td><img src="images/refresh.png" /></td>
<td><a href="edit.php?server_id=<?php echo $server_id; ?>&amp;dn=<?php echo $encoded_dn; ?>&amp;random=<?php
echo $random_junk; ?>"
title="Refresh this entry">Refresh</a></td>
title="<?php echo $lang['refresh_this_entry']; ?>"><?php echo $lang['refresh']; ?></a></td>
</tr>
<?php if( 0 != strcasecmp( $dn, $servers[$server_id]['base'] ) ) { ?>
<?php if( ! is_server_read_only( $server_id ) && 0 != strcasecmp( $dn, $servers[$server_id]['base'] ) ) { ?>
<?php /* We won't allow them to delete the base dn of the server */ ?>
<tr>
<td><img src="images/trash.png" /></td>
<td><a href="delete_form.php?server_id=<?php echo $server_id; ?>&amp;dn=<?php echo $encoded_dn; ?>"
title="You will be prompted to confirm this decision">Delete this entry</a></td>
title="<?php echo $lang['delete_this_entry_tooltip']; ?>"><?php echo $lang['delete_this_entry']; ?></a></td>
</tr>
<?php } ?>
<tr>
<td><img src="images/cut.png" /></td>
<td><a href="copy_form.php?server_id=<?php echo $server_id; ?>&amp;dn=<?php echo $encoded_dn?>"
title="Copy this object to another location, a new DN, or another server">Copy this entry</a></td>
title="<?php echo $lang['copy_this_entry_tooltip']; ?>"><?php echo $lang['copy_this_entry']; ?></a></td>
</tr>
<tr>
<td><img src="images/save.png" /></td>
<?php $ldif_url = "ldif_export.php?server_id=$server_id&amp;dn=$encoded_dn&amp;scope=base"; ?>
<td><a href="<?php echo $ldif_url; ?>" title="Save an LDIF dump of this object">Export to LDIF</a>
(<a href="<?php echo $ldif_url; ?>&amp;format=mac" title="Macintosh style carriage returns">mac</a>)
(<a href="<?php echo $ldif_url; ?>&amp;format=win" title="Windows style carriage returns">win</a>)
(<a href="<?php echo $ldif_url; ?>&amp;format=unix" title="Unix style carriage returns">unix</a>)
<td><a href="<?php echo $ldif_url; ?>" title="<?php echo $lang['export_to_ldif_tooltip']; ?>"><?php echo $lang['export_to_ldif']; ?></a>
(<a href="<?php echo $ldif_url; ?>&amp;format=mac"
title="<?php echo $lang['export_to_ldif_mac']; ?>">mac</a>)
(<a href="<?php echo $ldif_url; ?>&amp;format=win"
title="<?php echo $lang['export_to_ldif_win']; ?>">win</a>)
(<a href="<?php echo $ldif_url; ?>&amp;format=unix"
title="<?php echo $lang['export_to_ldif_unix']; ?>">unix</a>)
</td>
</tr>
<?php if( ! is_server_read_only( $server_id ) ) { ?>
<tr>
<td><img src="images/star.png" /></td>
<td><a href="<?php echo "create_form.php?server_id=$server_id&amp;container=$encoded_dn"; ?>">Create a child entry</a></td>
<td><a href="<?php echo "create_form.php?server_id=$server_id&amp;container=$encoded_dn"; ?>"><?php echo $lang['create_a_child_entry']; ?></a></td>
</tr>
<?php } ?>
<?php flush(); ?>
<?php $children = get_container_contents( $server_id, $dn, $max_children );
@ -113,67 +126,73 @@ if( ($children_count = count( $children ) ) > 0 ) {
<tr>
<td><img src="images/children.png" /></td>
<td><a href="search.php?search=true&amp;server_id=<?php echo $server_id; ?>&amp;filter=<?php echo rawurlencode('objectClass=*'); ?>&amp;base_dn=<?php echo $encoded_dn; ?>&amp;form=advanced&amp;scope=one">View <?php echo $children_count; ?> <?php echo ($children_count==1?'child':'children');?></a></td>
<td><a href="search.php?search=true&amp;server_id=<?php echo $server_id; ?>&amp;filter=<?php echo rawurlencode('objectClass=*'); ?>&amp;base_dn=<?php echo $encoded_dn; ?>&amp;form=advanced&amp;scope=one"><?php echo $lang['view']; ?> <?php echo $children_count; ?> <?php echo ($children_count==1?'child':'children');?></a></td>
</tr>
<?php } ?>
<?php if( $children_count > 0 ) { ?>
<tr>
<td><img src="images/save.png" /></td>
<?php $ldif_url = "ldif_export.php?server_id=$server_id&amp;dn=$encoded_dn&amp;scope=sub"; ?>
<td><a href="<?php echo $ldif_url; ?>" title="Save an LDIF dump of this object and all of its children">Export subtree to LDIF</a>
(<a href="<?php echo $ldif_url; ?>&amp;format=mac" title="Macintosh style carriage returns">mac</a>)
(<a href="<?php echo $ldif_url; ?>&amp;format=win" title="Windows style carriage returns">win</a>)
(<a href="<?php echo $ldif_url; ?>&amp;format=unix" title="Unix style carriage returns">unix</a>)
<td><a href="<?php echo $ldif_url; ?>"
title="<?php echo $lang['export_subtree_to_ldif_tooltip']; ?>"><?php echo $lang['export_subtree_to_ldif']; ?></a>
(<a href="<?php echo $ldif_url; ?>&amp;format=mac" title="<?php echo $lang['export_to_ldif_mac'];?>">mac</a>)
(<a href="<?php echo $ldif_url; ?>&amp;format=win" title="<?php echo $lang['export_to_ldif_win'];?>">win</a>)
(<a href="<?php echo $ldif_url; ?>&amp;format=unix" title="<?php echo $lang['export_to_ldif_unix'];?>">unix</a>)
</td>
</tr>
<?php } ?>
<?php if( in_array( 'jpegPhoto', $avail_attrs ) ) { ?>
<?php $new_jpeg_href = "new_jpeg_photo_form.php?server_id=$server_id&amp;dn=$encoded_dn&amp;attr=jpegPhoto"; ?>
<?php if( ! is_server_read_only( $server_id ) ) { ?>
<tr>
<td><img src="images/photo.png" /></td>
<td><a href="<?php echo $new_jpeg_href; ?>">Add a jpegPhoto</a></td>
<td><img src="images/light.png" /></td>
<td><?php echo $lang['delete_hint']; ?></td>
</tr>
<?php } ?>
<?php if( is_server_read_only( $server_id ) ) { ?>
<tr>
<td><img src="images/light.png" /></td>
<td><?php echo $lang['viewing_read_only']; ?></td>
</tr>
<?php } ?>
</table>
<br />
<table class="edit_dn" cellspacing="0">
<?php if( ! is_server_read_only( $server_id ) ) { ?>
<!-- Form to rename this entry -->
<tr class="row1">
<td class="heading"><acronym title="Change this entry's RDN">Rename Entry</acronym></td>
<td class="heading"><acronym title="<?php echo $lang['change_entry_rdn']; ?> "><?php echo $lang['rename_entry']; ?></acronym></td>
<td class="heading" align="right">
<nobr>
<form action="rename.php" method="post" class="edit_dn" />
<input type="hidden" name="server_id" value="<?php echo $server_id; ?>" />
<input type="hidden" name="dn" value="<?php echo $encoded_dn; ?>" />
<input type="text" name="new_rdn" size="40" value="<?php echo htmlspecialchars( utf8_decode( $rdn ) ); ?>" />
<input class="update_dn" type="submit" value="Rename" />
<input type="text" name="new_rdn" size="30" value="<?php echo htmlspecialchars( utf8_decode( $rdn ) ); ?>" />
<input class="update_dn" type="submit" value="<?php echo $lang['rename']; ?>" />
</form>
</nobr>
</td>
<?php } ?>
<?php if( ! is_server_read_only( $server_id ) ) { ?>
<!-- Form to add a new attribute to this entry -->
<tr class="spacer"><td colspan="2"></td></tr>
<form action="new_attr.php" method="post">
<input type="hidden" name="server_id" value="<?php echo $server_id; ?>" />
<input type="hidden" name="dn" value="<?php echo $encoded_dn; ?>" />
<!-- Form to add a new attribute to this entry -->
<tr class="row1">
<td class="heading">
<nobr>
<acronym title="Add a new attribute/value to this entry">Add New Attribute</acronym>
<acronym title="<?php echo $lang['add_new_attribute_tooltip']; ?>"><?php echo $lang['add_new_attribute']; ?></acronym>
</nobr>
</td>
<td class="heading" align="right"><nobr>
<?php if( is_array( $avail_attrs ) && count( $avail_attrs ) > 0 ) { ?>
<select name="attr">
@ -192,35 +211,75 @@ if( ($children_count = count( $children ) ) > 0 ) {
} ?>
</select>
<input type="text" name="val" size="20" />
<input type="submit" name="submit" value="Add" class="update_dn" />
<input type="submit" name="submit" value="<?php echo $lang['add']; ?>" class="update_dn" />
<?php } else { ?>
<small>(no new attributes available for this entry)</small>
<small>(<?php echo $lang['no_new_attrs_available']; ?>)</small>
<?php } ?>
</nobr></td>
</form>
</tr>
<?php } ?>
<?php flush(); ?>
<tr class="spacer"><td colspan="2"></td></tr>
<?php if( ! is_server_read_only( $server_id ) && count( $avail_binary_attrs ) > 0 ) { ?>
<!-- Form to add a new BINARY attribute to this entry -->
<tr class="spacer"><td colspan="2"></td></tr>
<form action="new_attr.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="server_id" value="<?php echo $server_id; ?>" />
<input type="hidden" name="dn" value="<?php echo $encoded_dn; ?>" />
<input type="hidden" name="binary" value="true" />
<tr class="row1">
<td class="heading">
<nobr>
<acronym title="<?php echo $lang['add_new_binary_attr_tooltip']; ?>">
<?php echo $lang['add_new_binary_attr']; ?></acronym>
</nobr>
</td>
<td class="heading" align="right"><nobr>
<select name="attr">
<?php 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" />
</nobr></td>
</form>
</tr>
<?php } ?>
<tr class="spacer"><td colspan="2"></td></tr>
<tr class="row1">
<td class="heading" colspan="2">
<nobr>
<?php if( $show_internal_attrs ) { ?>
<a href="edit.php?server_id=<?php echo $server_id; ?>&amp;dn=<?php echo $encoded_dn; ?>"
><img src="images/minus.png" title="Hide internal attributes" /></a>
<acronym title="Attributes set automatically by the system">Internal Attriubtes</acronym>
><img src="images/minus.png" title="<?php echo $lang['hide_internal_attrs']; ?>" /></a>
<acronym title="<?php echo $lang['internal_attrs_tooltip'];?>"><?php echo $lang['internal_attributes']; ?></acronym>
<?php } else { ?>
<a href="edit.php?server_id=<?php echo $server_id; ?>&amp;dn=<?php echo $encoded_dn; ?>&amp;show_internal_attrs=true">
<img src="images/plus.png" title="Show internal attributes" /></a>
<acronym title="Attributes set automatically by the system (click + to display)">Internal Attriubtes</acronym>
<small>(hidden)</small>
<img src="images/plus.png" title="<?php echo $lang['show_internal_attrs']; ?>" /></a>
<acronym title="<?php echo $lang['internal_attrs_tooltip']; ?> (<?php echo $lang['click_to_display']; ?>)"><?php echo $lang['internal_attributes']; ?></acronym>
<small>(<?php echo $lang['hidden']; ?>)</small>
<?php } ?>
@ -230,16 +289,20 @@ if( ($children_count = count( $children ) ) > 0 ) {
<?php
if( $show_internal_attrs ) {
$counter = 0;
foreach( get_entry_system_attrs( $server_id, $dn ) as $attr => $val ) {
foreach( get_entry_system_attrs( $server_id, $dn ) as $attr => $vals ) {
$counter++
?>
<tr class="<?php echo ($counter%2==0?'row1':'row2');?>">
<td class="attr"><b><?php echo htmlspecialchars( $attr ); ?></b></td>
<td class="val"><?php echo htmlspecialchars( $val ); ?></td>
<td class="val">
<?php foreach( $vals as $v ) {?>
<?php echo htmlspecialchars( $v ); ?><br />
<?php } ?>
</td>
</tr>
<?php }
if( $counter == 0 )
echo "<tr class=\"row2\"><td colspan=\"2\"><center>(none)</center></td></tr>\n";
echo "<tr class=\"row2\"><td colspan=\"2\"><center>(" . $lang['none'] . ")</center></td></tr>\n";
}
?>
@ -250,27 +313,41 @@ if( $show_internal_attrs ) {
<!-- Table of attributes/values to edit -->
<tr class="row1">
<td class="heading" colspan="2">
<nobr>
<acronym title="Edit the contents of the form below and click Save.">Modify Attributes</acronym>
</nobr>
<nobr><?php echo $lang['entry_attributes']; ?></nobr>
</td>
</tr>
<?php if( ! is_server_read_only( $server_id ) ) { ?>
<form action="update_confirm.php" method="post">
<input type="hidden" name="server_id" value="<?php echo $server_id; ?>" />
<input type="hidden" name="dn" value="<?php echo rawurlencode($dn); ?>" />
<?php if( $edit_dn_schema_lookup ) $schema_attrs = get_schema_attributes( $server_id ); ?>
<input type="hidden" name="dn" value="<?php echo $dn; ?>" />
<?php } ?>
<?php $counter=0; ?>
<?php /* Prepare the hidden_attrs array by lower-casing it. */
if( isset( $hidden_attrs ) && is_array( $hidden_attrs ) && count( $hidden_attrs ) > 0 )
foreach( $hidden_attrs as $i => $attr_name )
$hidden_attrs[$i] = strtolower( $attr_name );
else
$hidden_attrs = array();
?>
<?php foreach( $attrs as $attr => $vals ) {
if( isset( $schema_attrs[ strtolower($attr) ] ) )
$attr_syntax = $schema_attrs[ strtolower( $attr ) ]->getSyntaxOID();
flush();
if( $attr == 'dn' )
if( 0 == strcasecmp( $attr, 'dn' ) )
continue;
// has the config.php specified that this attribute is to be hidden?
if( in_array( strtolower( $attr ), $hidden_attrs ) )
continue;
// is there a user-friendly translation available for this attribute?
if( isset( $friendly_attrs[ strtolower( $attr ) ] ) ) {
$attr_display = "<acronym title=\"Alias for $attr\">" .
$attr_display = "<acronym title=\"" . $lang['alias_for'] . "$attr\">" .
$friendly_attrs[ strtolower( $attr ) ] . "</acronym>";
} else {
$attr_display = $attr;
@ -278,7 +355,7 @@ if( $show_internal_attrs ) {
?>
<?php if( $attr == $updated_attr ) { ?>
<?php if( is_array( $modified_attrs ) && in_array( $attr, $modified_attrs ) ) { ?>
<tr class="updated_attr">
<?php } else { ?>
<?php if( $counter++ % 2 == 0 ) { ?>
@ -288,83 +365,105 @@ if( $show_internal_attrs ) {
<?php } ?>
<?php } ?>
<?php $add_href = "add_value_form.php?server_id=$server_id&amp;dn=$encoded_dn&amp;attr=" . rawurlencode( $attr ); ?>
<?php
if( ! is_server_read_only( $server_id ) ) {
$add_href = "add_value_form.php?server_id=$server_id&amp;dn=$encoded_dn&amp;attr=" . rawurlencode( $attr );
} ?>
<td class="attr">
<b><?php echo $attr_display; ?></b><br />
<?php if( ! is_server_read_only( $server_id ) ) { ?>
<small>(<a href="<?php echo $add_href; ?>"
title="Add an additional value to this attribute">add value</a>)</small>
title="<?php echo $lang['add_value_tooltip']; ?>"><?php echo $lang['add_value']; ?></a>)</small>
<?php } ?>
</td>
<td class="val">
<?php if( 0==strcasecmp( $attr, 'jpegPhoto' ) ) {
<?php
$has_jpeg_photo = true;
/*
* Is this attribute a jpegPhoto?
*/
if( is_jpeg_photo( $server_id, $attr ) ) {
// Don't draw the delete buttons if there is more than one jpegPhoto
// (phpLDAPAdmin can't handle this case yet)
if( is_array( $vals ) )
// (phpLDAPadmin can't handle this case yet)
if( is_server_read_only( $server_id ) )
draw_jpeg_photos( $server_id, $dn, false );
else
draw_jpeg_photos( $server_id, $dn, true );
// proceed to the next attribute
continue;
}
} ?>
<?php /*
* This is next IF statement is a KLUGE!! If anyone knows a better way to check for
* binary data that works with UTF-8 encoded strings, please help
/*
* Is this attribute binary?
*/
if( is_attr_binary( $server_id, $attr ) ) {
$href = "download_binary_attr.php?server_id=$server_id&amp;dn=$encoded_dn&amp;attr=$attr";
?>
<?php if( 0==strcasecmp( $attr, 'networkAddress' ) ) { ?>
<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 } ?>
<small>This attribute contains binary data,<br />
which cannot be safely displayed<br />
or edited in a web-browser.</small>
<?php if( ! is_server_read_only( $server_id ) ) { ?>
<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; ?>
<?php continue;
}
<?php } ?>
/*
* Note: at this point, the attribute must be text-based (not binary or jpeg)
*/
<?php /* is this a multi-valued attribute? */ ?>
<?php if( is_array( $vals ) ) { ?>
<?php foreach( $vals as $i => $val ) { ?>
/*
* If we are in read-only mode, simply draw the attribute values and continue.
*/
if( is_server_read_only( $server_id ) ) {
if( is_array( $vals ) ) {
foreach( $vals as $i => $val ) {
$val = utf8_decode( $val );
echo $val . "<br />";
}
} else {
echo utf8_decode( $vals ) . "<br />";
}
continue;
}
<?php $val = utf8_decode( $val ); ?>
/*
* Is this a userPassword attribute?
*/
if( 0 == strcasecmp( $attr, 'userpassword' ) ) {
$user_password = $vals[0];
<nobr>
<!-- 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); ?>" />
/* Capture the stuff in the { } to determine if this is crypt, md5, etc. */
preg_match( "/{([^}]+)}/", $user_password, $enc_type);
$enc_type = strtolower($enc_type[1]);
<input type="text"
size="60"
name="new_values[<?php echo htmlspecialchars( $attr ); ?>][<?php echo $i; ?>]"
value="<?php echo htmlspecialchars($val); ?>" /></nobr><br />
<?php } ?>
<?php /* this a single-valued attribute */ ?>
<?php } else { ?>
<?php $val = $vals; ?>
<?php $val = utf8_decode( $val ); ?>
<nobr>
<?php /* This series of if/elseif/else is for special cases of attributes (userPassword, boolean, etc) */ ?>
<?php if( 0 == strcasecmp( $attr, 'userpassword' ) ) { ?>
<?php /* Capture the stuff in the { } if any */
preg_match( "/{([^}]+)}/", $val, $enc_type); $enc_type = strtolower($enc_type[1]); ?>
// Set the default hashing type if the password is blank (must be newly created)
if( $val == '' ) {
$enc_type = $servers[$server_id]['default_hash'];
} ?>
<?php /* handle crypt types */
if($enc_type == "crypt") {
preg_match( '/{[^}]+}\$(.)\$/', $val, $salt);
preg_match( "/{[^}]+}\\$(.)\\$/", $user_password, $salt);
switch( $salt[1] ) {
case '': // CRYPT_STD_DES
$enc_type = "crypt";
@ -380,15 +479,20 @@ if( $show_internal_attrs ) {
}
} ?>
<input type="hidden"
name="old_values[userpassword]"
value="<?php echo htmlspecialchars($val); ?>" />
value="<?php echo htmlspecialchars($user_password); ?>" />
<input size="48"
<!-- 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); ?>" />
<input size="38"
type="text"
name="new_values[userpassword]"
value="<?php echo htmlspecialchars($val); ?>" />
value="<?php echo htmlspecialchars($user_password); ?>" />
<select name="enc_type">
<option>clear</option>
@ -399,41 +503,70 @@ if( $show_internal_attrs ) {
<option<?php echo $enc_type=='sha'?' selected':''; ?>>sha</option>
</select>
<?php } elseif( $edit_dn_schema_lookup &&
'Boolean' == $schema_attrs[ strtolower($attr) ]['type'] ) { ?>
<?php continue;
}
/*
* Is this a boolean attribute?
*/
if( 0 == strcasecmp( 'boolean', $schema_attrs[ strtolower($attr) ]->getType() ) ) {
$val = $vals[0];
?>
<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' : ''); ?>>TRUE</option>
<option value="FALSE"<?php echo ($val=='FALSE' ? ' selected' : ''); ?>>FALSE</option>
<option value="">(none -- remove value)</option>
<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 } else { ?>
<?php
continue;
}
/*
* End of special case attributes.
*/
/*
* This is a normal attribute, to be displayed and edited in plain text.
*/
foreach( $vals as $i => $val ) {
$val = utf8_decode( $val ); ?>
<nobr>
<!-- 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 ); ?>]"
value="<?php echo htmlspecialchars($val); ?>" />
<input size="60"
type="text"
name="new_values[<?php echo htmlspecialchars( $attr ); ?>]"
name="old_values[<?php echo htmlspecialchars( $attr ); ?>][<?php echo $i; ?>]"
value="<?php echo htmlspecialchars($val); ?>" />
<?php if( $attr_syntax == '1.3.6.1.4.1.1466.115.121.1.40' ) { ?>
<textarea
cols="37" rows="3"
name="new_values[<?php echo htmlspecialchars( $attr ); ?>][<?php echo $i; ?>]"
><?php echo htmlspecialchars($val); ?></textarea><br />
<?php } else { ?>
<input type="text"
size="50"
name="new_values[<?php echo htmlspecialchars( $attr ); ?>][<?php echo $i; ?>]"
value="<?php echo htmlspecialchars($val); ?>" /></nobr><br />
<?php } ?>
</nobr>
<?php } ?>
<?php } /* end foreach value */ ?>
</td>
</tr>
<?php } ?>
<?php } /* End foreach( $attrs as $attr => $vals ) */ ?>
<tr><td colspan="2"><center><input type="submit" value="Save Changes" /></center></form></td></tr>
<?php if( ! is_server_read_only( $server_id ) ) { ?>
<tr><td colspan="2"><center><input type="submit" value="<?php echo $lang['save_changes']; ?>" /></center></form></td></tr>
<?php } ?>
<?php
?>
@ -441,32 +574,40 @@ if( $show_internal_attrs ) {
</table>
<?php /* If this entry has a jpegPhoto, we need to provide a form for it to submit when deleting it. */ ?>
<?php if( $has_jpeg_photo ) { ?>
<?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 deleteJpegPhoto()
//<!--
function deleteAttribute( attrName )
{
if( confirm( "Really delete jpegPhoto?" ) )
document.delete_jpeg_photo_form.submit();
if( confirm( "<?php echo $lang['really_delete_attribute']; ?> '" + attrName + "'?" ) ) {
document.delete_attribute_form.attr.value = attrName;
document.delete_attribute_form.submit();
}
-->
}
//-->
</script>
<!-- TODO: Go to update_confirm.php instead of directly to update.php -->
<form name="delete_jpeg_photo_form" action="update.php" method="post">
<!-- 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 $server_id; ?>" />
<input type="hidden" name="dn" value="<?php echo $encoded_dn; ?>" />
<input type="hidden" name="update_array[jpegPhoto]" value="" />
<input type="hidden" name="attr" value="FILLED IN BY JAVASCRIPT" />
</form>
<?php } ?>
<?php
/**
* Given an attribute $x, this returns true if it is NOT already specified
* in the current entry, returns false otherwise.
*/
function not_an_attr( $x )
{
global $attrs;
return ! isset( $attrs[ strtolower( $x ) ] );
//return ! isset( $attrs[ strtolower( $x ) ] );
foreach( $attrs as $attr => $values )
if( 0 == strcasecmp( $attr, $x ) )
return false;
return true;
}
?>

View File

@ -1,7 +1,7 @@
<?php
require 'config.php';
require_once 'functions.php';
require 'common.php';
$container = isset( $_GET['container'] ) ? rawurldecode( $_GET['container'] ) : false;
$server_id = isset( $_GET['server_id'] ) ? $_GET['server_id'] : false;
$return_form_element = $_GET['form_element'];
@ -15,6 +15,7 @@ if( $container ) {
echo "Looking in: <b>" . htmlspecialchars( $container ) . "</b><br />\n";
}
/* Has the use already begun to descend into a specific server tree? */
if( $server_id !== false && $container !== false )
{
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
@ -43,24 +44,47 @@ if( $server_id !== false && $container !== false )
else
foreach( $dn_list as $dn ) {
$href = "javascript:returnDN( '$dn' )";
echo "&nbsp;&nbsp;&nbsp;<a href=\"entry_chooser.php?form_element=$return_form_element&amp;server_id=$server_id&amp;container=" .
echo "&nbsp;&nbsp;&nbsp;<a href=\"entry_chooser.php?form_element=$return_form_element".
"&amp;server_id=$server_id&amp;container=" .
rawurlencode( $dn ) . "\"><img src=\"images/plus.png\" /></a> " .
"<a href=\"$href\">" . htmlspecialchars( $dn ) . "</a><br />\n";
}
}
/* draw the root of the selection tree (ie, list all the servers) */
else
{
foreach( $servers as $id => $server ) {
if( $server['host'] ) {
echo htmlspecialchars( $server['name'] ) . "<br />\n";
echo "<b>" . htmlspecialchars( $server['name'] ) . "</b><br />\n";
if( ! have_auth_info( $id ) )
echo "<small>&nbsp;&nbsp;&nbsp;(Not logged in)</small><br />";
else {
$dn = ( $server['base'] ? $server['base'] : try_to_get_root_dn( $id ) );
if( ! $dn ) {
echo "<small>&nbsp;&nbsp;&nbsp;(Could not determine base DN)</small><br />";
} else {
$href = "javascript:returnDN( '$dn' )";
echo "&nbsp;&nbsp;&nbsp;<a href=\"entry_chooser.php?form_element=$return_form_element&amp;server_id=$id&amp;container=" .
echo "&nbsp;&nbsp;&nbsp;<a href=\"entry_chooser.php?form_element=" .
"$return_form_element&amp;server_id=$id&amp;container=" .
rawurlencode( $dn ) . "\"><img src=\"images/plus.png\" /></a> " .
"<a href=\"$href\">" . htmlspecialchars( $dn ) . "</a><br />\n";
}
}
}
}
}
// added by PD. 14082003,
// adding the element access allows it to work with javascript arrays
// the name of the form extracted from the first part of the URL variable.
$formpart=substr($return_form_element,0,strpos($return_form_element,"."));
// the name of the element extracted from the last part of the URL variable (after the dot)
$elmpart =substr($return_form_element,strpos($return_form_element,".")+1);
// rebuilt return value
$return_form_element = $formpart . ".elements[\"" . $elmpart . "\"]";
?>

View File

@ -12,8 +12,7 @@
* Note: this script is equal and opposite to collapse.php
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
// no expire header stuff
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
@ -22,7 +21,7 @@ header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
$dn = stripslashes( $_GET['dn'] );
$dn = $_GET['dn'];
$encoded_dn = rawurlencode( $dn );
$server_id = $_GET['server_id'];
@ -31,14 +30,20 @@ have_auth_info( $server_id ) or pla_error( "Not enough information to login to s
session_start();
session_is_registered( 'tree' ) or pla_error( "Your session tree is not registered. That's weird. Shouldn't ever happen".
". Just go back and it should be fixed automagically." );
// dave commented this out since it was being triggered without reason in rare cases
//session_is_registered( 'tree' ) or pla_error( "Your session tree is not registered. That's weird. Should never happen".
// ". Just go back and it should be fixed automagically." );
$tree = $_SESSION['tree'];
$tree_icons = $_SESSION['tree_icons'];
pla_ldap_connect( $server_id ) or pla_error( "Could not connect to LDAP server" );
$contents = get_container_contents( $server_id, $dn );
//echo "<pre>";
//var_dump( $contents );
//exit;
sort( $contents );
$tree[$server_id][$dn] = $contents;
@ -55,6 +60,12 @@ session_write_close();
$time = gettimeofday();
$random_junk = md5( strtotime( 'now' ) . $time['usec'] );
header( "Location: tree.php?foo=$random_junk#{$server_id}_{$encoded_dn}" );
// 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( "Location:tree.php?foo=$random_junk%23{$server_id}_{$encoded_dn}$id_session_param" );
?>

View File

@ -2,38 +2,119 @@
/*
* functions.php
* A collection of functions used throughout phpLDAPAdmin.
* A collection of functions used throughout phpLDAPadmin.
*/
@include 'config.php';
/*
* Used to determine if the specified attribute is indeed a jpegPhoto
*/
function is_jpeg_photo( $server_id, $attr_name )
{
// easy quick check
if( 0 == strcasecmp( $attr_name, 'jpegPhoto' ) ||
0 == strcasecmp( $attr_name, 'photo' ) )
return true;
// go to the schema and get the Syntax OID
require_once realpath( 'schema_functions.php' );
$schema_attr = get_schema_attribute( $server_id, $attr_name );
if( ! $schema_attr )
return false;
$oid = $schema_attr->getSyntaxOID();
$type = $schema_attr->getType();
if( 0 == strcasecmp( $type, 'JPEG' ) )
return true;
if( $oid == '1.3.6.1.4.1.1466.115.121.1.28' )
return true;
return false;
}
/*
* Given an attribute name and server id number, this function returns
* whether the attrbiute may contain binary data.
*/
function is_attr_binary( $server_id, $attr_name )
{
require_once realpath( 'schema_functions.php' );
$schema_attrs = get_schema_attributes( $server_id );
if( 0 == strcasecmp( substr( $attr_name, strlen( $attr_name ) - 7 ), ";binary" ) )
return true;
if( isset( $schema_attrs[ strtolower( $attr_name ) ] ) ) {
$type = $schema_attrs[ strtolower( $attr_name ) ]->getType();
$syntax = $schema_attrs[ strtolower( $attr_name ) ]->getSyntaxOID();
if( 0 == strcasecmp( substr( $attr_name, strlen( $attr_name ) - 7 ), ";binary" ) ||
0 == strcasecmp( $type, 'Certificate' ) ||
0 == strcasecmp( $type, 'Binary' ) ||
0 == strcasecmp( $attr_name, 'networkAddress' ) ||
0 == strcasecmp( $attr_name, 'userCertificate' ) ||
0 == strcasecmp( $attr_name, 'userSMIMECertificate' ) ||
$syntax == '1.3.6.1.4.1.1466.115.121.1.10' ||
$syntax == '1.3.6.1.4.1.1466.115.121.1.28' ||
$syntax == '1.3.6.1.4.1.1466.115.121.1.5' ||
$syntax == '1.3.6.1.4.1.1466.115.121.1.8' ||
$syntax == '1.3.6.1.4.1.1466.115.121.1.9' )
return true;
else
return false;
}
return false;
}
/*
* Returns true if the specified server is configured to be displayed
* in read only mode. If a user has logged in via anonymous bind, and
* config.php specifies anonymous_bind_implies_read_only as true, then
* this also returns true.
*/
function is_server_read_only( $server_id )
{
global $servers;
if( isset( $servers[$server_id]['read_only'] ) &&
$servers[$server_id]['read_only'] == true )
return true;
global $anonymous_bind_implies_read_only;
if( 0 == strcasecmp( "anonymous", get_logged_in_dn( $server_id ) ) &&
isset( $anonymous_bind_implies_read_only ) &&
$anonymous_bind_implies_read_only == true )
return true;
return false;
}
/*
* Given a DN and server ID, this function reads the DN's objectClasses and
* determines which icon best represents the entry.
* determines which icon best represents the entry. The results of this query
* are cached in a session variable so it is not run *every* time the tree
* browser changes, just when exposing new DNs that were not displayed
* previously. That means we can afford a little bit of inefficiency here
* in favor of coolness. :)
*/
function get_icon( $server_id, $dn )
{
// fetch and lowercase all the objectClasses in an array
$object_classes = get_object_attr( $server_id, $dn, 'objectClass' );
$object_classes = get_object_attr( $server_id, $dn, 'objectClass', true );
if( $object_classes === null )
if( $object_classes === null || $object_classes === false)
return 'object.png';
// If there is only one objectClass, make it an array with one element instead
if( ! is_array( $object_classes ) )
$object_classes = array( $object_classes );
foreach( $object_classes as $i => $class )
$object_classes[$i] = strtolower( $class );
// get the prefix (ie: dc, ou, cn, uid)
$exploded_dn = ldap_explode_dn( $dn, 0 );
$rdn = $dn[0];
$prefix = explode( '=', $rdn );
$prefix = $prefix[0];
$rdn = get_rdn( $dn );
// Is it a samba NT machine (is sambaAccount and ends with '$')
if( in_array( 'sambaaccount', $object_classes ) &&
'$' == $rdn{ strlen($rdn) - 1 } )
return 'nt.png';
// Is it a person or some type of account/user?
if( in_array( 'person', $object_classes ) ||
elseif( in_array( 'person', $object_classes ) ||
in_array( 'organizationalperson', $object_classes ) ||
in_array( 'inetorgperson', $object_classes ) ||
in_array( 'account', $object_classes ) ||
@ -55,6 +136,8 @@ function get_icon( $server_id, $dn )
return 'mail.png';
elseif( in_array( 'locality', $object_classes ) )
return 'locality.png';
elseif( in_array( 'posixgroup', $object_classes ) )
return 'ou.png';
// Oh well, I don't know what it is. Use a generic icon.
else
return 'object.png';
@ -112,7 +195,11 @@ function get_logged_in_pass( $server_id )
function get_logged_in_dn( $server_id )
{
global $_COOKIE;
$dn = $_COOKIE[ 'pla_login_dn_' . $server_id ];
$cookie_name = 'pla_login_dn_' . $server_id;
if( isset( $_COOKIE[ $cookie_name ] ) )
$dn = $_COOKIE[ $cookie_name ];
else
return false;
if( $dn == '0' )
return 'Anonymous';
@ -139,7 +226,7 @@ function pla_ldap_connect( $server_id )
// times, we don't have to reauthenticate with the LDAP server
static $conns;
if( $conns[$server_id] )
if( isset( $conns[$server_id] ) && $conns[$server_id] )
return $conns[$server_id];
$host = $servers[$server_id]['host'];
@ -204,9 +291,7 @@ function get_container_contents( $server_id, $dn, $size_limit=0 )
$search = ldap_get_entries( $con, $search );
$return = array();
for( $i=0; $i<$search['count']; $i++ )
{
for( $i=0; $i<$search['count']; $i++ ) {
$entry = $search[$i];
$dn = $entry['dn'];
$return[] = $dn;
@ -273,12 +358,15 @@ function get_entry_system_attrs( $server_id, $dn )
$entry = ldap_first_entry( $conn, $search );
$attrs = ldap_get_attributes( $conn, $entry );
foreach( $attrs as $name => $vals )
if( is_numeric( $name ) || $name == 'count' )
unset( $attrs[$name] );
else
$attrs[$name] = $vals[0];
return $attrs;
$count = $attrs['count'];
unset( $attrs['count'] );
//echo "<pre>"; print_r( $attrs );
for( $i=0; $i<$count; $i++ ) {
$attr_name = $attrs[$i];
unset( $attrs[$attr_name]['count'] );
$return_attrs[$attr_name] = $attrs[$attr_name];
}
return $return_attrs;
}
/*
@ -305,22 +393,22 @@ function get_object_attrs( $server_id, $dn, $lower_case_attr_names = false )
$conn = pla_ldap_connect( $server_id );
if( ! $conn ) return false;
$search = @ldap_read( $conn, $dn, '(objectClass=*)' );
$search = @ldap_read( $conn, $dn, '(objectClass=*)', array( ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( ! $search )
return false;
$entry = ldap_first_entry( $conn, $search );
$attrs = ldap_get_attributes( $conn, $entry );
//$attrs = ldap_get_entries( $conn, $search );
if( ! $attrs || $attrs['count'] == 0 )
if( ! $attrs || $attrs['count'] == 0 ) {
return false;
}
//$attrs = $attrs[0];
$num_attrs = $attrs['count'];
unset( $attrs['count'] );
// strip numerical inices
for( $i=0; $i<$num_attrs; $i++ )
unset( $attrs[$i] );
@ -330,9 +418,6 @@ function get_object_attrs( $server_id, $dn, $lower_case_attr_names = false )
$attr = strtolower( $attr );
$count = $vals['count'];
unset( $vals['count'] );
if( $count == 1 )
$return_array[ $attr ] = $vals[0];
else
$return_array[ $attr ] = $vals;
}
@ -374,352 +459,6 @@ function get_object_attr( $server_id, $dn, $attr )
return false;
}
/*
* Returns true if $var is not white space only, and false otherwise.
*/
function not_white( $var )
{
return trim($var) != "" ? true : false;
}
/*
* Returns an associative array of objectClasses for the specified
* $server_id. Each array entry's key is the name of the objectClass
* in lower-case.
* The sub-entries consist of sub-arrays called 'must_attrs' and
* 'may_attrs', and sub-entries called 'oid', 'name' and 'description'.
*
* The bulk of this function came from the good code in the
* GPL'ed LDAP Explorer project. Thank you.
*/
function get_schema_objectclasses( $server_id )
{
$ds = pla_ldap_connect( $server_id );
if( ! $ds )
return false;
// get all the objectClasses
$result = @ldap_read($ds, 'cn=subschema', '(objectClass=*)',
array( 'objectclasses' ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( ! $result )
$result = @ldap_read($ds, 'cn=schema', '(objectClass=*)',
array( 'objectclasses' ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( ! $result ) return false;
if( $result ) $raw_oclasses = ldap_get_entries($ds,$result );
// build the array of objectClasses
$oclasses = array();
for( $att=0; $att < count( $raw_oclasses[0]["objectclasses"] ); $att++ )
{
$class = $raw_oclasses[0]["objectclasses"][$att];
preg_match( "/[\s]+NAME[\s'\(]+([a-zA-Z0-9\-_]+)[\s'\)]/" , $class, $name);
preg_match( "/[\s]+([\d\.]+)[\s]+NAME/", $class, $oid );
preg_match( "/[\s]+DESC[\s]+'([a-zA-Z0-9\-_ ]+)'/", $class, $description );
preg_match( "/[\s]+SUP[\s]+([a-zA-Z0-9\-_]+)[\s]/", $class, $sup );
$key = strtolower( trim( $name[1] ) );
$oclass_name = trim( $name[1] );
if( ! $key ) continue;
$oclasses[$key] = array();
$oclasses[$key]['oid'] = trim( $oid[1] );
$oclasses[$key]['description'] = trim( $description[1] );
$oclasses[$key]['sup'] = trim( $sup[1] );
unset( $name );
unset( $syntax );
unset( $desription );
// get all the required attributes
preg_match( "/MUST[\s\(]+([a-zA-Z0-9\s$]+)(MAY|\))/" , $class, $must_attrs );
$must_attrs = str_replace( ' ', '', $must_attrs[1] );
$oclasses[$key]['must_attrs'] = array_filter( explode( '$', $must_attrs ), "not_white" );
// get all the optional attributes
preg_match( "/MAY[\s\(]+([a-zA-Z0-9\s$]+)(MUST|\))/" , $class, $may_attrs );
$may_attrs = str_replace( ' ', '', $may_attrs[1] );
$oclasses[$key]['may_attrs'] = array_filter( array_merge( $oclasses[$key]['must_attrs'], explode( '$', $may_attrs) ), "not_white" );
unset( $must_attrs );
unset( $may_attrs );
$oclasses[$key]['name'] = $oclass_name;
}
// go back and add any inherited MUST/MAY attrs to each objectClass
foreach( $oclasses as $oclass => $attrs )
{
$new_must = $attrs['must_attrs'];
$new_may = $attrs['may_attrs'];
$sup_attr = $attrs['sup'];
while( $sup_attr && $sup_attr != "top" ) {
$new_must = array_merge( $new_must, $oclasses[strtolower($sup_attr)]['must_attrs'] );
$new_may = array_merge( $new_may, $oclasses[strtolower($sup_attr)]['may_attrs'] );
$sup_attr = $oclasses[strtolower($sup_attr)]['sup'];
}
$oclasses[$oclass]['must_attrs'] = array_unique( $new_must );
$oclasses[$oclass]['may_attrs'] = array_unique( $new_may );
}
ksort( $oclasses );
return $oclasses;
}
/*
* Returns an associate array of the server's schema matching rules
*/
function get_schema_matching_rules( $server_id )
{
static $cache;
if( isset( $cache[$server_id] ) )
return $cache[$server_id];
$ds = pla_ldap_connect( $server_id );
if( ! $ds )
return false;
// get all the attributeTypes
$result = @ldap_read($ds, 'cn=subschema', '(objectClass=*)',
array( 'matchingRules', 'matchingRuleUse' ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( ! $result )
$result = @ldap_read($ds, 'cn=schema', '(objectClass=*)',
array( 'matchingRules', 'matchingRuleUse' ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( $result )
$raw = ldap_get_entries( $ds, $result );
else
return( array() );
// build the array of attributes
$rules = array();
for( $i=0; $i < $raw[0]['matchingrules']['count']; $i++ )
{
$rule = $raw[0]['matchingrules'][$i];
preg_match( "/[\s]+([\d\.]+)[\s]+/", $rule, $oid);
preg_match( "/[\s]+NAME[\s]+'([\)\(:?\.a-zA-Z0-9\-_ ]+)'/", $rule, $name );
$key = strtolower( trim( $oid[1] ) );
if( ! $key ) continue;
$rules[$key] = $name[1];
//$rules[$key]['name'] = $name[1];
}
ksort( $rules );
$cache[$server_id] = $rules;
return $rules;
}
/*
* Returns an associate array of the syntax OIDs that this LDAP server uses mapped to
* their descriptions.
*/
function get_schema_syntaxes( $server_id )
{
static $cache;
if( isset( $cache[$server_id] ) )
return $cache[$server_id];
$ds = pla_ldap_connect( $server_id );
if( ! $ds )
return false;
// get all the attributeTypes
$result = @ldap_read($ds, 'cn=subschema', '(objectClass=*)',
array( 'ldapSyntaxes' ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( ! $result )
$result = @ldap_read($ds, 'cn=schema', '(objectClass=*)',
array( 'ldapSyntaxes' ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( $result )
$raw = ldap_get_entries( $ds, $result );
else
return( array() );
// build the array of attributes
$syntaxes = array();
for( $i=0; $i < $raw[0]['ldapsyntaxes']['count']; $i++ )
{
$syntax = $raw[0]['ldapsyntaxes'][$i];
preg_match( "/[\s]+([\d\.]+)[\s]+/", $syntax, $oid);
preg_match( "/[\s]+DESC[\s]+'([\)\(:?\.a-zA-Z0-9\-_ ]+)'/", $syntax, $description );
$key = strtolower( trim( $oid[1] ) );
if( ! $key ) continue;
$syntaxes[$key] = array();
$syntaxes[$key]['description'] = $description[1];
}
ksort( $syntaxes );
$cache[$server_id] = $syntaxes;
return $syntaxes;
}
/*
* Returns an associative array of attributes for the specified
* $server_id. Each array entry's key is the name of the attribute,
* in lower-case.
* The sub-entries are 'oid', 'syntax', 'equality', 'substr', 'name',
* and 'single_value'.
*
* The bulk of this function came from the good code in the
* GPL'ed LDAP Explorer project. Thank you. It was extended
* considerably for application here.
*/
function get_schema_attributes( $server_id )
{
$ds = pla_ldap_connect( $server_id );
if( ! $ds )
return false;
// get all the attributeTypes
$result = @ldap_read($ds, 'cn=subschema', '(objectClass=*)',
array( 'attributeTypes' ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( ! $result )
$result = @ldap_read($ds, 'cn=schema', '(objectClass=*)',
array( 'attributeTypes' ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( $result )
$raw_attrs = ldap_get_entries( $ds, $result );
else
$raw_attrs = array();
$syntaxes = get_schema_syntaxes( $server_id );
// build the array of attributes
$attrs = array();
for( $i=0; $i < $raw_attrs[0]['attributetypes']['count']; $i++ )
{
$attr = $raw_attrs[0]['attributetypes'][$i];
preg_match( "/[\s]+NAME[\s'\(]+([a-zA-Z0-9\-_]+)[\s'\)]/" , $attr, $name);
preg_match( "/\s+NAME\s+'([a-zA-Z0-9\-_]+)'\s/" , $attr, $name);
preg_match( "/[\s]+([\d\.]+)[\s]+NAME/", $attr, $oid );
preg_match( "/[\s]+DESC[\s]+'([\)\(:?\.a-zA-Z0-9\-_ ]+)'/", $attr, $description );
preg_match( "/[\s]+SYNTAX[\s]+([\d\.]+)/", $attr, $syntax);
preg_match( "/[\s]+EQUALITY[\s]+([a-zA-Z]+)/", $attr, $equality);
preg_match( "/[\s]+SUBSTR[\s]+([a-zA-Z]+)/", $attr, $substr);
preg_match( "/[\s]+SUP[\s]+([a-zA-Z0-9\-_]+)/", $attr, $sup );
if( preg_match( "/[\s]+SINGLE-VALUE[\s]+/", $attr, $single_value ) )
$single_value = 'Yes';
else
$single_value = 'No';
// If this schema attribute has multiple names (like: "NAME ( 'uid' 'userid' )"), then we need
// to create a matching attribute entry for each name it bares.
if( preg_match( "/\s+NAME\s+\(\s*['\sa-zA-Z0-9\-_]+\s*\)/", $attr, $multi_name ) ) {
$multi_name = $multi_name[0];
preg_match_all( "/'([a-zA-Z0-9\-_]+)'/", $multi_name, $multiple_names );
$multiple_names = $multiple_names[1];
//print_r( $multiple_names );
foreach( $multiple_names as $name ) {
$key = strtolower( trim( $name ) );
$attr_name = trim( $name );
if( ! $key ) continue;
$attrs[$key] = array();
$attrs[$key]['oid'] = trim( $oid[1] );
$attrs[$key]['description'] = trim( $description[1] );
$attrs[$key]['syntax'] = trim( $syntax[1] );
$attrs[$key]['type'] = $syntaxes[ trim($syntax[1]) ]['description'];
$attrs[$key]['equality'] = trim( $equality[1] );
$attrs[$key]['substr'] = trim( $substr[1] );
$attrs[$key]['single_value'] = $single_value;
$attrs[$key]['sup'] = trim( $sup[1] );
$attrs[$key]['name'] = $attr_name;
$count = 1;
for( $j=0; $j<count($multiple_names); $j++ ) {
$alias_name = $multiple_names[$j];
if( $alias_name != $name ) {
$attrs[$key]['alias' . $count] = $alias_name;
$count++;
}
}
}
} else {
// this attribute bares only a single name.
$key = strtolower( trim( $name[1] ) );
$attr_name = trim( $name[1] );
if( ! $key ) continue;
$attrs[$key] = array();
$attrs[$key]['oid'] = trim( $oid[1] );
$attrs[$key]['description'] = trim( $description[1] );
$attrs[$key]['syntax'] = trim( $syntax[1] );
$attrs[$key]['type'] = $syntaxes[ trim($syntax[1]) ]['description'];
$attrs[$key]['equality'] = trim( $equality[1] );
$attrs[$key]['substr'] = trim( $substr[1] );
$attrs[$key]['single_value'] = $single_value;
$attrs[$key]['sup'] = trim( $sup[1] );
$attrs[$key]['name'] = $attr_name;
}
}
// go back and add any inherited descriptions from parent attributes (ie, cn inherits name)
foreach( $attrs as $attr => $desc )
{
$sup_attr = $desc['sup'];
while( $sup_attr ) {
if( ! $attrs[ $sup_attr ]['sup'] ) {
$attrs[ $attr ][ 'syntax' ] = $attrs[ $sup_attr ]['syntax'];
$attrs[ $attr ][ 'equality' ] = $attrs[ $sup_attr ]['equality'];
$attrs[ $attr ][ 'substr' ] = $attrs[ $sup_attr ]['substr'];
$attrs[ $attr ][ 'single_value' ] = $attrs[ $sup_attr ]['single_value'];
break;
} else {
$sup_attr = $attrs[ $sup_attr ]['sup'];
}
}
}
ksort( $attrs );
return $attrs;
}
/*
* A wrapper function to save you from having to call get_schema_objectclasses()
* and get_schema_attributes(). Returns an array with two indexes: 'oclasses'
* and 'attributes', as defined by their respective functions above.
*/
function get_schema( $server_id )
{
$ds = pla_ldap_connect( $server_id );
if( ! $ds )
return false;
$attrs = get_schema_attributes($server_id, $lower_case_all );
$oclasses = get_schema_objectclasses($server_id, $lower_case_all );
if( ! $oclasses )
return false;
$schema = array( 'attrs' => $attrs,
'oclasses' => $oclasses );
return $schema;
}
/*
* A do-it-all ldap_search function. You can even specify the search scope. Other than
* that, it's pretty much the same as the PHP ldap_search() call, except it returns
@ -729,7 +468,7 @@ function pla_ldap_search( $server_id, $filter, $base_dn=null, $attrs=array(), $s
{
global $servers;
if( ! isset($servers[$server_id]) || $servers[$server_id]['host'] == '' )
if( ! check_server_id( $server_id ) )
return false;
if( $base_dn == null )
@ -741,42 +480,62 @@ function pla_ldap_search( $server_id, $filter, $base_dn=null, $attrs=array(), $s
switch( $scope ) {
case 'base':
$search = @ldap_read( $ds, $base_dn, $filter, $attrs );
$search = @ldap_read( $ds, $base_dn, $filter, $attrs, 0, 200, 0, LDAP_DEREF_ALWAYS );
break;
case 'one':
$search = @ldap_list( $ds, $base_dn, $filter, $attrs );
$search = @ldap_list( $ds, $base_dn, $filter, $attrs, 0, 200, 0, LDAP_DEREF_ALWAYS );
break;
case 'sub':
default:
$search = @ldap_search( $ds, $base_dn, $filter, $attrs );
$search = @ldap_search( $ds, $base_dn, $filter, $attrs, 0, 200, 0, LDAP_DEREF_ALWAYS );
break;
}
if( ! $search )
return array();
$search = ldap_get_entries( $ds, $search );
//get the first entry identifier
if( $entry_id = ldap_first_entry($ds,$search) )
$return = array();
foreach( $search as $id => $attrs ) {
if( ! is_array( $attrs ) )
continue;
for( $i=0; $i<$attrs['count']; $i++ )
unset( $attrs[$i] );
$dn = $attrs['dn'];
foreach( $attrs as $attr => $vals ) {
$count = $vals['count'];
unset( $vals['count'] );
if( $count == 1 )
$return[$dn][$attr] = $vals[0];
//iterate over the entries
while($entry_id) {
//get the distinguished name of the entry
$dn = ldap_get_dn($ds,$entry_id);
//get the attributes of the entry
$attrs = ldap_get_attributes($ds,$entry_id);
$return[$dn]['dn'] = $dn;
//get the first attribute of the entry
if($attr = ldap_first_attribute($ds,$entry_id,$attrs))
//iterate over the attributes
while($attr){
if( is_attr_binary($server_id,$attr))
$values = ldap_get_values_len($ds,$entry_id,$attr);
else
$return[$dn][$attr] = $vals;
}
}
$values = ldap_get_values($ds,$entry_id,$attr);
//get the number of values for this attribute
$count = $values['count'];
unset($values['count']);
if($count==1)
$return[$dn][$attr] = $values[0];
else
$return[$dn][$attr] = $values;
$attr = ldap_next_attribute($ds,$entry_id,$attrs);
}// end while attr
$entry_id = ldap_next_entry($ds,$entry_id);
} // end while entry_id
if( $sort_results && is_array( $return ) )
ksort( $return );
if( $sort_results ) ksort( $return );
return $return;
}
/*
@ -798,10 +557,6 @@ function process_config()
global $search_attributes;
$search_attributes= explode( ",", $search_attributes);
array_walk( $search_attributes, "trim_it" );
global $search_criteria_options;
$search_criteria_options= explode( ",", $search_criteria_options);
array_walk( $search_criteria_options, "trim_it" );
}
/*
@ -871,9 +626,15 @@ function get_avail_server_id()
* For example. given 'cn=Manager,dc=example,dc=com', this function returns
* 'cn=Manager' (it is really the exact opposite of get_container()).
*/
function get_rdn( $dn )
function get_rdn( $dn, $include_attrs=0 )
{
$rdn = ldap_explode_dn( $dn, 0 );
if( $dn == null )
return null;
$rdn = pla_explode_dn( $dn, $include_attrs );
if( $rdn['count'] == 0 )
return null;
if( ! isset( $rdn[0] ) )
return null;
$rdn = $rdn[0];
return $rdn;
}
@ -885,7 +646,7 @@ function get_rdn( $dn )
*/
function get_container( $dn )
{
$rdn = ldap_explode_dn( $dn, 0 );
$rdn = pla_explode_dn( $dn );
$container = $rdn[ 1 ];
for( $i=2; $i<count($rdn)-1; $i++ )
$container .= ',' . $rdn[$i];
@ -906,11 +667,11 @@ function pla_verbose_error( $err_no )
$err_codes_file = 'ldap_error_codes.txt';
if( ! file_exists( $err_codes_file ) )
if( ! file_exists( realpath( $err_codes_file ) ) )
return false;
if( ! is_readable( $err_codes_file ) )
if( ! is_readable( realpath( $err_codes_file ) ) )
return false;
if( ! ($f = fopen( $err_codes_file, 'r' )) )
if( ! ($f = fopen( realpath( $err_codes_file ), 'r' ) ) )
return false;
$contents = fread( $f, filesize( $err_codes_file ) );
@ -938,31 +699,42 @@ function pla_error( $msg, $ldap_err_msg=null, $ldap_err_no=-1 )
{
include_once 'header.php';
echo "<center>";
echo "<div class=\"error\">\n\n";
echo "<center><h3>Error</h3></center>\n\n";
echo "<center>$msg</center>";
echo "<br /><br />\n";
?>
<center>
<table class="error"><tr><td class="img"><img src="images/warning.png" /></td>
<td><center><h2>Error</h2></center>
<?php echo $msg; ?>
<br />
<?php
if( $ldap_err_msg )
echo "LDAP Server Said: <tt>" . htmlspecialchars( $ldap_err_msg ) . "</tt><br /><br />\n";
echo "<b>LDAP said</b>: " . htmlspecialchars( $ldap_err_msg ) . "<br /><br />\n";
if( $ldap_err_no != -1 ) {
$ldap_err_no = ( '0x' . str_pad( dechex( $ldap_err_no ), 2, 0, STR_PAD_LEFT ) );
$verbose_error = pla_verbose_error( $ldap_err_no );
if( $verbose_error ) {
echo "Error number: <tt>$ldap_err_no (" .
$verbose_error['title'] . ")</tt><br /><br />\n";
echo "Description: <tt>" . $verbose_error['desc'] . "</tt><br /><br />\n\n";
echo "<b>Error number</b>: $ldap_err_no <small>(" .
$verbose_error['title'] . ")</small><br /><br />\n";
echo "<b>Description</b>: " . $verbose_error['desc'] . "<br /><br />\n\n";
} else {
echo "Error number: <tt>$ldap_err_no</tt><br /><br />\n";
echo "Description: (no description available)<br />\n\n";
echo "<b>Error number</b>: $ldap_err_no<br /><br />\n";
echo "<b>Description</b>: (no description available)<br />\n\n";
}
}
echo "</div>\n";
echo "</center>";
?>
<br />
<br />
<center>
<small>
Is this a phpLDAPadmin bug? If so, please
<a href="<?php echo get_href( 'add_bug' ); ?>">report it</a>.
</small>
</center>
</td></tr></table>
</center>
<?php
die();
}
@ -1031,13 +803,14 @@ function draw_jpeg_photos( $server_id, $dn, $draw_delete_buttons=false )
for( $i=0; $i<$jpeg_data['count']; $i++ )
{
$jpeg_filename = $jpeg_temp_dir . '/' . basename( tempnam ('.', 'djp') );
$jpeg_filename = realpath( $jpeg_filename );
$outjpeg = fopen($jpeg_filename, "wb");
fwrite($outjpeg, $jpeg_data[$i]);
fclose ($outjpeg);
$jpeg_data_size = filesize( $jpeg_filename );
if( $jpeg_data_size < 6 ) {
echo "jpegPhoto contains errors<br />";
echo '<a href="javascript:deleteJpegPhoto();" style="color:red; font-size: 75%">Delete Photo</a>';
echo '<a href="javascript:deleteAttribute( \'jpegPhoto\' );" style="color:red; font-size: 75%">Delete Photo</a>';
continue;
}
@ -1060,7 +833,7 @@ function draw_jpeg_photos( $server_id, $dn, $draw_delete_buttons=false )
if( $draw_delete_buttons )
{ ?>
<!-- JavaScript function deleteJpegPhoto() to be defined later by calling script -->
<a href="javascript:deleteJpegPhoto();" style="color:red; font-size: 75%">Delete Photo</a>
<a href="javascript:deleteAttribute( 'jpegPhoto' );" style="color:red; font-size: 75%">Delete Photo</a>
<?php }
}
echo "</center></td></table>\n\n";
@ -1129,9 +902,13 @@ function password_hash( $password_clear, $enc_type )
$new_value = '{md5}' . base64_encode( pack( 'H*' , md5( $password_clear) ) );
break;
case 'md5crypt':
if( ! defined( 'CRYPT_MD5' ) || 0 == CRYPT_MD5 )
pla_error( "Your PHP install does not support blowfish encryption." );
$new_value = '{crypt}' . crypt( $password_clear , '$1$' . random_salt(9) );
break;
case 'blowfish':
if( ! defined( 'CRYPT_BLOWFISH' ) || 0 == CRYPT_BLOWFISH )
pla_error( "Your PHP install does not support blowfish encryption." );
$new_value = '{crypt}' . crypt( $password_clear , '$2$' . random_salt(13) );
break;
case 'sha':
@ -1155,20 +932,99 @@ function password_hash( $password_clear, $enc_type )
*/
function pla_version()
{
if( ! file_exists( 'VERSION' ) )
if( ! file_exists( realpath( 'VERSION' ) ) )
return 'unknown version';
$f = fopen( 'VERSION', 'r' );
$version = fread( $f, filesize( 'VERSION' ) );
$f = fopen( realpath( 'VERSION' ), 'r' );
$version = fread( $f, filesize( realpath( 'VERSION' ) ) );
fclose( $f );
return $version;
}
function draw_chooser_link( $form_element )
{
global $lang;
$href = "javascript:dnChooserPopup('$form_element');";
echo "<a href=\"$href\"><img src=\"images/find.png\" /></a>";
echo "<a href=\"$href\">browse</a>\n";
$title = $lang['chooser_link_tooltip'];
echo "<a href=\"$href\" title=\"$title\"><img src=\"images/find.png\" /></a>";
echo "<a href=\"$href\" title=\"$title\">browse</a>\n";
}
function get_values($link_id,$entry_id,$attr){
if( 0 == strcasecmp( $attr, 'jpegPhoto' ) ) {
$values = ldap_get_values_len($link_id,$entry_id,$attr);
} else {
$values = ldap_get_values($link_id,$entry_id,$attr);
unset($values['count']);
}
return $values;
}
/*
function utf8_decode($str)
{
global $code_page;
if( ! $code_page )
$code_page = "ISO-8859-1";
return iconv("UTF8", $code_page, $str);
}
function utf8_encode($str)
{
global $code_page;
if( ! $code_page )
$code_page = "ISO-8859-1";
return iconv( $code_page, "UTF8", $str);
}
*/
function get_code_page()
{
global $code_page;
if( ! $code_page )
$code_page = "ISO-8859-1";
return $code_page;
}
/**
* Convert the string to the configured codepage and replace HTML chars
* with their &-encoded equivelants, then echo to browser.
*/
function pla_echo( $str )
{
if( function_exists( "iconv" ) )
$str = iconv( "UTF8", get_code_page(), $str );
$str = htmlspecialchars( $str );
echo $str;
}
/*
* UTF-8 safe method for exploding a DN into its RDN parts.
*/
function pla_explode_dn( $dn, $with_attributes=0 )
{
$dn = addcslashes( $dn, "<>" );
$result = ldap_explode_dn( $dn, $with_attributes );
//translate hex code into ascii again
foreach( $result as $key => $value )
$result[$key] = preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $value);
return $result;
}
/*
* Convenience function for fetching project HREFs (like bugs)
*/
function get_href( $type ) {
$group_id = "61828";
$bug_atid = "498546";
$rfe_atid = "498549";
switch( $type ) {
case 'open_bugs': return "http://sourceforge.net/tracker/?group_id=$group_id&amp;atid=$bug_atid";
case 'add_bug': return "http://sourceforge.net/tracker/?func=add&amp;group_id=$group_id&amp;atid=$bug_atid";
case 'open_rfes': return "http://sourceforge.net/tracker/?atid=$rfe_atid&group_id=$group_id&amp;func=browse";
case 'add_rfe': return "http://sourceforge.net/tracker/?func=add&amp;group_id=$group_id&amp;atid=$rfe_atid";
default: return null;
}
}
?>

View File

@ -1,11 +1,12 @@
<?php echo "<?xml version=\"1.0\" encoding=\"utf-8\?>\n"; ?>
<?php echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; ?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN"
"http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="no-NO">
<head>
<title>phpLDAPAdmin</title>
<title>phpLDAPadmin</title>
<link rel="stylesheet" href="style.css" />
<script src="entry_chooser.js"></script>
<script src="search_util.js"></script>
</head>

BIN
images/logo.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
images/nt.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 957 B

BIN
images/warning.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -1,26 +1,32 @@
<?php/*
<?php
/*******************************************
<pre>
If you are seeing this in your browser,
PHP is not installed on your web server!!!
*/?>
</pre>
*******************************************/
<?php require_once( 'functions.php' ); ?>
@require 'common.php';
<?php if( ! file_exists( 'config.php' ) ) { ?>
?>
<?php if( ! file_exists(realpath( 'config.php' )) ) { ?>
<html>
<head>
<title>phpLDAPAdmin - <?php echo pla_version(); ?></title>
<title>phpLDAPadmin - <?php echo pla_version(); ?></title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<h3 class="title">Configure phpLDAPAdmin</h1>
<h3 class="title">Configure phpLDAPadmin</h1>
<br />
<br />
<center>
You need to configure phpLDAPAdmin. Edit the file 'config.php' to do so.<br />
You need to configure phpLDAPadmin. Edit the file 'config.php' to do so.<br />
<br />
An example config file is provided in 'config.php.example'
@ -30,7 +36,7 @@ An example config file is provided in 'config.php.example'
<?php } elseif( check_config() ) {
require 'config.php';
echo "<?xml version=\"1.0\" encoding=\"utf-8\?>\n";
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
?>
@ -38,11 +44,11 @@ echo "<?xml version=\"1.0\" encoding=\"utf-8\?>\n";
PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN"
"http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="no-NO">
<head><title>phpLDAPAdmin - <?php echo pla_version(); ?></title></head>
<head><title>phpLDAPadmin - <?php echo pla_version(); ?></title></head>
<frameset cols="<?php echo $tree_width; ?>,*">
<frame src="tree.php" name="left_frame" id="left_frame" />
<frame src="search.php" name="right_frame" id="right_frame" />
<frame src="welcome.php" name="right_frame" id="right_frame" />
</frameset>
</html>
@ -66,17 +72,35 @@ function check_config()
if( ! extension_loaded( 'ldap' ) )
{
pla_error( "Your install of PHP appears to be missing LDAP support. Please install " .
"LDAP support before using phpLDAPAdmin." );
"LDAP support before using phpLDAPadmin." );
return false;
}
/* Make sure they have all the functions we will need */
$required_functions = array( 'utf8_encode', 'utf8_decode', 'htmlspecialchars' );
foreach( $required_functions as $function ) {
if( ! function_exists( $function ) ) {
pla_error( "Your install of PHP appears to be missing the function '<b>$function()</b>' " .
"phpLDAPadmin requires this function to work properly." );
return false;
}
}
/* Make sure the config file is readable */
if( ! is_readable( 'config.php' ) )
//if( ! is_readable( 'config.php' ) )
if( ! is_readable(realpath( 'config.php' )) )
{
echo "The config file 'config.php' is not readable. Please check its permissions.";
return false;
}
/* Make sure their PHP install is up to snuff */
if( version_compare( phpversion(), "4.1.0" ) < 0 )
{
echo "You are using php version " . phpversion() . ". phpLDAPadmin requires version 4.1 or greater.";
return false;
}
/* check for syntax errors in config.php */
// capture the result of including the file with output buffering
ob_start();
@ -92,7 +116,7 @@ function check_config()
?>
<html>
<head>
<title>phpLDAPAdmin Config File Error</title>
<title>phpLDAPadmin Config File Error</title>
<link rel="stylesheet" href="style.css" />
</head>
@ -151,7 +175,7 @@ function check_config()
if( $count == 0 )
{
echo "None of the " . count($servers) . " servers in your \$servers array is ";
echo "active in config.php. phpLDAPAdmin cannot proceed util you correct this.";
echo "active in config.php. phpLDAPadmin cannot proceed util you correct this.";
return false;
}

142
lang/english.php Normal file
View File

@ -0,0 +1,142 @@
<?php
$lang = array();
// Search form
$lang['simple_search_form_str'] = 'Simple Search Form';
$lang['advanced_search_form_str'] = 'Advanced Search Form';
$lang['server'] = 'Server';
$lang['search_for_entries_whose'] = 'Search for entries whose';
$lang['base_dn'] = 'Base DN';
$lang['search_scope'] = 'Search Scope';
$lang['search_ filter'] = 'Search Filter';
$lang['show_attributes'] = 'Show Attributtes';
$lang['Search'] = 'Search';
$lang['equals'] = 'equals';
$lang['starts_with'] = 'starts with';
$lang['contains'] = 'contains';
$lang['ends_with'] = 'ends with';
$lang['sounds_like'] = 'sounds like';
// Tree browser
$lang['request_new_feature'] = 'Request a new feature';
$lang['see_open_requests'] = 'see open requests';
$lang['report_bug'] = 'Report a bug';
$lang['see_open_bugs'] = 'see open bugs';
$lang['schema'] = 'schema';
$lang['search'] = 'search';
$lang['refresh'] = 'refresh';
$lang['create'] = 'create';
$lang['info'] = 'info';
$lang['import'] = 'import';
$lang['logout'] = 'logout';
$lang['create_new'] = 'Create New';
$lang['view_schema_for'] = 'View schema for';
$lang['refresh_expanded_containers'] = 'Refresh all expanded containers for';
$lang['create_new_entry_on'] = 'Create a new entry on';
$lang['view_server_info'] = 'View server-supplied information';
$lang['import_from_ldif'] = 'Import entries from an LDIF file';
$lang['logout_of_this_server'] = 'Logout of this server';
$lang['logged_in_as'] = 'Logged in as: ';
$lang['read_only'] = 'read only';
$lang['could_not_determine_root'] = 'Could not determin the root of your LDAP tree.';
$lang['ldap_refuses_to_give_root'] = 'It appears that the LDAP server has been configured to not reveal its root.';
$lang['please_specify_in_config'] = 'Please specify it in config.php';
$lang['create_new_entry_in'] = 'Create a new entry in';
// Entry display
$lang['delete_this_entry'] = 'Delete this entry';
$lang['delete_this_entry_tooltip'] = 'You will be prompted to confirm this decision';
$lang['copy_this_entry'] = 'Copy this entry';
$lang['copy_this_entry_tooltip'] = 'Copy this object to another location, a new DN, or another server';
$lang['export_to_ldif'] = 'Export to LDIF';
$lang['export_to_ldif_tooltip'] = 'Save an LDIF dump of this object';
$lang['export_subtree_to_ldif_tooltip'] = 'Save an LDIF dump of this object and all of its children';
$lang['export_subtree_to_ldif'] = 'Export subtree to LDIF';
$lang['export_to_ldif_mac'] = 'Macintosh style line ends';
$lang['export_to_ldif_win'] = 'Windows style line ends';
$lang['export_to_ldif_unix'] = 'Unix style line ends';
$lang['create_a_child_entry'] = 'Create a child entry';
$lang['add_a_jpeg_photo'] = 'Add a jpegPhoto';
$lang['rename_entry'] = 'Rename Entry';
$lang['rename'] = 'Rename';
$lang['add'] = 'Add';
$lang['view'] = 'View';
$lang['add_new_attribute'] = 'Add New Attribute';
$lang['add_new_attribute_tooltip'] = 'Add a new attribute/value to this entry';
$lang['internal_attributes'] = 'Internal Attributes';
$lang['hide_internal_attrs'] = 'Hide internal attributes';
$lang['show_internal_attrs'] = 'Show internal attributes';
$lang['internal_attrs_tooltip'] = 'Attributes set automatically by the system';
$lang['entry_attributes'] = 'Entry Attributes';
$lang['click_to_display'] = 'click to display';
$lang['hidden'] = 'hidden';
$lang['none'] = 'none';
$lang['save_changes'] = 'Save Changes';
$lang['add_value'] = 'add value';
$lang['add_value_tooltip'] = 'Add an additional value to this attribute';
$lang['refresh'] = 'refresh';
$lang['refresh_this_entry'] = 'Refresh this entry';
$lang['delete_hint'] = 'Hint: <b>To delete an attribute</b>, empty the text field and click save.';
$lang['viewing_read_only'] = 'Viewing entry in read-only mode.';
$lang['change_entry_rdn'] = 'Change this entry\'s RDN';
$lang['no_new_attrs_available'] = 'no new attributes available for this entry';
$lang['binary_value'] = 'Binary value';
$lang['add_new_binary_attr'] = 'Add New Binary Attribute';
$lang['add_new_binary_attr_tooltip'] = 'Add a new binary attribute/value from a file';
$lang['alias_for'] = 'Alias for';
$lang['download_value'] = 'download value';
$lang['delete_attribute'] = 'delete attribute';
$lang['true'] = 'true';
$lang['false'] = 'false';
$lang['none_remove_value'] = 'none, remove value';
$lang['really_delete_attribute'] = 'Really delete attribute';
// Schema browser
$lang['the_following_objectclasses'] = 'The following <b>objectClasses</b> are supported by this LDAP server.';
$lang['the_following_attributes'] = 'The following <b>attributeTypes</b> are supported by this LDAP server.';
$lang['the_following_matching'] = 'The following <b>matching rules</b> are supported by this LDAP server.';
$lang['the_following_syntaxes'] = 'The following <b>syntaxes</b> are supported by this LDAP server.';
$lang['jump_to_objectclass'] = 'Jump to an objectClass';
$lang['jump_to_attr'] = 'Jump to an attribute';
$lang['schema_for_server'] = 'Schema for server';
$lang['required_attrs'] = 'Required Attributes';
$lang['optional_attrs'] = 'Optional Attributes';
$lang['OID'] = 'OID';
$lang['desc'] = 'Description';
$lang['is_obsolete'] = 'This objectClass is <b>obsolete</b>';
$lang['inherits'] = 'Inherits';
$lang['jump_to_this_oclass'] = 'Jump to this objectClass definition';
$lang['matching_rule_oid'] = 'Matching Rule OID';
$lang['syntax_oid'] = 'Syntax OID';
// Adding objectClass form
$lang['new_required_attrs'] = 'New Required Attributes';
$lang['requires_to_add'] = 'This action requires you to add';
$lang['new_attributes'] = 'new attributes';
$lang['new_required_attrs_instructions'] = 'Instructions: In order to add this objectClass to this entry, you must specify';
$lang['that_this_oclass_requires'] = 'that this objectClass requires. You can do so in this form.';
$lang['add_oclass_and_attrs'] = 'Add ObjectClass and Attributes';
// General
$lang['chooser_link_tooltip'] = 'Click to popup a dialog to select an entry (DN) graphically';
$lang['no_updates_in_read_only_mode'] = 'You cannot perform updates while server is in read-only mode';
$lang['bad_server_id'] = 'Bad server id';
$lang['not_enough_login_info'] = 'Not enough information to login to server. Please check your configuration.';
$lang['could_not_connect'] = 'Could not connect to LDAP server.';
$lang['could_not_perform_ldap_mod_add'] = 'Could not perform ldap_mod_add operation.';
// Add value form
$lang['add_new'] = 'Add new';
$lang['value_to'] = 'value to';
$lang['server'] = 'Server';
$lang['distinguished_name'] = 'Distinguished Name';
$lang['current_list_of'] = 'Current list of';
$lang['values_for_attribute'] = 'values for attribute';
$lang['inappropriate_matching_note'] = 'Note: You will get an "inappropriate matching" error if you have not<br />' .
'setup an <tt>EQUALITY</tt> rule on your LDAP server for this attribute.';
$lang['enter_value_to_add'] = 'Enter the value you would like to add:';
$lang['new_required_attrs_note'] = 'Note: you may be required to enter new attributes<br />that this objectClass requires.';
$lang['syntax'] = 'Syntax';
?>

70
lang/french.php Normal file
View File

@ -0,0 +1,70 @@
<?php
$lang = array();
// Advanced/simple search form
$lang['simple_search_form_str'] = 'Recherche Simple';
$lang['advanced_search_form_str'] = 'Recherche avancée';
$lang['server'] = 'Serveur';
$lang['search_for_entries_whose'] = 'Chercher les entrées dont';
$lang['base_dn'] = 'Base DN';
$lang['search_scope'] = 'Portée de la recherche';
$lang['search_ filter'] = 'Filtre de la recherche';
$lang['show_attributes'] = 'Montrer les attributs';
$lang['Search'] = 'Chercher';
$lang['equals'] = 'est égal à';
$lang['starts_with'] = 'commence par';
$lang['contains'] = 'contient';
$lang['ends_with'] = 'finit par';
$lang['sounds_like'] = 'ressemble à';
// tree.php
$lang['request_new_feature'] = 'Demander une nouvelle fonctionnalité';
$lang['see_open_requests'] = 'voir les demandes en cours';
$lang['report_bug'] = 'Signaler un bogue';
$lang['see_open_bugs'] = 'voir les bogues en cours';
$lang['schema'] = 'schema';
$lang['search'] = 'chercher';
$lang['refresh'] = 'rafraîchir';
$lang['create'] = 'créer';
$lang['info'] = 'info';
$lang['import'] = 'importer';
$lang['logout'] = 'logout (FIXME)';
$lang['create_new'] = 'Créer';
// entry display
$lang['delete_this_entry'] = 'Supprimer cette entrée';
$lang['delete_this_entry_tooltip'] = 'Il vous sera demander confirmation';
$lang['copy_this_entry'] = 'Copier cette entrée';
$lang['copy_this_entry_tooltip'] = 'Copier cet objet vers un autre endroit, un nouveau DN ou un autre serveur';
$lang['export_to_ldif'] = 'Exporter au format LDIF';
$lang['export_to_ldif_tooltip'] = 'Sauvegarder cet objet au format ldif';
$lang['export_subtree_to_ldif_tooltip'] = 'Sauvegarder cet objet ainsi que tous les sous-objets au format ldif';
$lang['export_subtree_to_ldif'] = 'Exporter l\'arborescence au format ldif';
$lang['export_to_ldif_mac'] = 'Fins de ligne Macintosh';
$lang['export_to_ldif_win'] = 'Fins de lignes Windows';
$lang['export_to_ldif_unix'] = 'Fins de ligne Unix ';
$lang['create_a_child_entry'] = 'Créer une sous-entrée';
$lang['add_a_jpeg_photo'] = 'Ajouter une jpegPhoto';
$lang['rename_entry'] = 'Renommer l\'entrée';
$lang['rename'] = 'Renommer';
$lang['add'] = 'Ajouter';
$lang['view'] = 'Ajouter';
$lang['add_new_attribute'] = 'Ajouter un nouvel attribut';
$lang['add_new_attribute_tooltip'] = 'Ajouter un nouvel attribut/une nouvelle valeur à cette entrée';
$lang['internal_attributes'] = 'Attributs Internes';
$lang['hide_internal_attrs'] = 'Cacher les attributs internes';
$lang['show_internal_attrs'] = 'Montrer les attributs internes';
$lang['internal_attrs_tooltip'] = 'Attributs établis automatiquement par le système';
$lang['entry_attributes'] = 'Attributs de l\'entrée';
$lang['click_to_display'] = 'Cliquer pour afficher';
$lang['hidden'] = 'caché';
$lang['none'] = 'aucun';
$lang['save_changes'] = 'Sauver les modifications';
$lang['add_value'] = 'ajouter une valeur';
// Repeat above for *every* string in phpLDAPadmin
?>

103
lang/german.php Normal file
View File

@ -0,0 +1,103 @@
<?php
$lang = array();
// Search form
$lang['simple_search_form_str'] = 'Einfache Suche';//'Simple Search Form';
$lang['advanced_search_form_str'] = 'Experten Suche';//'Advanced Search Form';
$lang['server'] = 'Server';//'Server';
$lang['search_for_entries_whose'] = 'Suche nach Eintr&auml;gen die';//'Search for entries whose';
$lang['base_dn'] = 'Base DN';//'Base DN';
$lang['search_scope'] = 'Suchart';//'Search Scope';
$lang['search_ filter'] = 'Suchfilter';//'Search Filter';
$lang['show_attributes'] = 'Zeige Attribute';//'Show Attributtes';
$lang['Search'] = 'Suchen';//'Search';
$lang['equals'] = 'gleich';//'equals';
$lang['starts_with'] = 'beginnt mit';//'starts with';
$lang['contains'] = 'enth&auml;';//'contains';
$lang['ends_with'] = 'endet mit';//'ends with';
$lang['sounds_like'] = '&auml;nlich wie';//'sounds like';
// Tree browser
$lang['request_new_feature'] = 'Anfragen von neuen M&ouml;glichkeiten';//'Request a new feature';
$lang['see_open_requests'] = 'Siehe offene Anfragen';//'see open requests';
$lang['report_bug'] = 'Einen Fehler berichten';//'Report a bug';
$lang['see_open_bugs'] = 'Siehe offene Fehler';//'see open bugs';
$lang['schema'] = 'schema';//'schema';
$lang['search'] = 'suche';//'search';
$lang['refresh'] = 'aktualisieren';//'refresh';
$lang['create'] = 'Neu';//'create';
$lang['info'] = 'info';//'info';
$lang['import'] = 'import';//'import';
$lang['logout'] = 'logout';// 'Abmelden' 'logout';
$lang['create_new'] = 'Neuen erzeugen';//'Create New';
// Entry display
$lang['delete_this_entry'] = 'Diesen Eintrag l&ouml;schen';//'Delete this entry';
$lang['delete_this_entry_tooltip'] = 'You will be prompted to confirm this decision';
$lang['copy_this_entry'] = 'Diesen Eintrag kopieren';//'Copy this entry';
$lang['copy_this_entry_tooltip'] = 'Copy this object to another location, a new DN, or another server';
$lang['export_to_ldif'] = 'Exportieren nach LDIF';//'Export to LDIF';
$lang['export_to_ldif_tooltip'] = 'Speichere einen LDIF-Abzug diese Objektes';//'Save an LDIF dump of this object';
$lang['export_subtree_to_ldif_tooltip'] = 'Speicher eine LDIF-Abzug ab diesem Objekt und alle seine Untereintr&auml;ge';//'Save an LDIF dump of this object and all of its children';
$lang['export_subtree_to_ldif'] = 'Export Unterbaum nach LDIF';//'Export subtree to LDIF';
$lang['export_to_ldif_mac'] = 'Zeilenende f&uuml;r Macintosh';//'Macintosh style line ends';
$lang['export_to_ldif_win'] = 'Zeilenende f&uuml;r Windows';//'Windows style line ends';
$lang['export_to_ldif_unix'] = 'Zeilenende f&uuml;r Unix';//'Unix style line ends';
$lang['create_a_child_entry'] = 'Erzeuge einen Untereintrag';//'Create a child entry';
$lang['add_a_jpeg_photo'] = 'Ein JPEG-Foto hinzuf&uuml;gen';//'Add a jpegPhoto';
$lang['rename_entry'] = 'Eintrag umbenennen';//'Rename Entry';
$lang['rename'] = 'Umbenennen';//'Rename';
$lang['add'] = 'Hinzuf&uuml;gen';//'Add';
$lang['view'] = 'Ansehen';//'View';
$lang['add_new_attribute'] = 'Neues Attribut hinz&uuml;gen';//'Add New Attribute';
$lang['add_new_attribute_tooltip'] = 'F&uuml;ge ein neues Attribut/Wert zu diesem Eintrag hinzu';// 'Add a new attribute/value to this entry';
$lang['internal_attributes'] = 'Interne Attribute';//'Internal Attributes';
$lang['hide_internal_attrs'] = 'Verdecke interne Attribute';//'Hide internal attributes';
$lang['show_internal_attrs'] = 'Zeige interne Attribute';//'Show internal attributes';
$lang['internal_attrs_tooltip'] = 'Attribute werden automatisch vom System erzeugt.';//'Attributes set automatically by the system';
$lang['entry_attributes'] = 'Attribute des Eintrages';//'Entry Attributes';
$lang['click_to_display'] = 'Klicken zum Ansehen';//'click to display';
$lang['hidden'] = 'verdeckt';//'hidden';
$lang['none'] = 'Keine';//'none';
$lang['save_changes'] = '&Auml;nderungen speichern';//'Save Changes';
$lang['add_value'] = 'Wert hinzuf&uuml;gen';//'add value';
$lang['add_value_tooltip'] = 'F&uuml;g einen weiteren Wert zu dem Attribut hinzu';//'Add an additional value to this attribute';
//$lang['refresh'] = 'Refresh';
$lang['refresh_this_entry'] = 'Aktualisiere den Entrag';//'Refresh this entry';
$lang['delete_hint'] = 'Hinweis: Um ein Attribute zu l&ouml;schen, leeren Sie den Inhalt des Wertes.';//'Hint: <b>To delete an attribute</b>, empty the text field and click save.';
$lang['viewing_read_only'] = 'Zeige Eintrag im Nurlesemodus';//'Viewing entry in read-only mode.';
$lang['change_entry_rdn'] = '&Auml;ndere den RDN des Eintrages';//'Change this entry\'s RDN';
$lang['no_new_attrs_available'] = 'Keine weiteren Attribute verf&uuml;gbar f&uuml;r diesen Eintrag';//'no new attributes available for this entry';
$lang['binary_value'] = 'Bin&auml;rwert';//'Binary value';
$lang['add_new_binary_attr'] = 'Neuen Bin&auml;rwert hinzuf&uuml;gen';//'Add New Binary Attribute';
$lang['add_new_binary_attr_tooltip'] = 'ABCDEFGH';//'Add a new binary attribute/value from a file';
$lang['alias_for'] = 'Alias f&uuml;r';//'Alias for';
$lang['download_value'] = 'Wert herunterladen';//'download value';
$lang['delete_attribute'] = 'L&ouml;sche Attribut';//'delete attribute';
$lang['true'] = 'Wahr';//'true';
$lang['false'] = 'Falsch';//'false';
$lang['none_remove_value'] = 'nichts, entferne den Wert';//?? //'none, remove value';
$lang['really_delete_attribute'] = 'L&ouml;sche das Attribut wirklich';//'Really delete attribute';
// Schema browser
$lang['the_following_objectclasses'] = 'Die folgenden objectClass werden vom LDAP-Server unterst&uuml;tzt.';//'The following <b>objectClasses</b> are supported by this LDAP server.';
$lang['the_following_attributes'] = 'Die folgenden Attribute werden vom LDAP-Server unterst&uuml;tzt.';//'The following <b>attributeTypes</b> are supported by this LDAP server.';
$lang['the_following_matching'] = 'Die folgenden Suchregeln werden vom LDAP-Server unterst&uuml;tzt.';//'The following <b>matching rules</b> are supported by this LDAP server.';
$lang['the_following_syntaxes'] = 'Die folgenden Syntaxe werden vom LDAP-Server unterst&uuml;tzt.';//'The following <b>syntaxes</b> are supported by this LDAP server.';
$lang['jump_to_objectclass'] = 'Gehe zur objectClass';//'Jump to an objectClass';
$lang['jump_to_attr'] = 'Gehe zum Attribut';//'Jump to an attribute';
$lang['schema_for_server'] = 'Schema f&uuml;r Server';//'Schema for server';
$lang['required_attrs'] = 'Notwendige Attribute';//'Required Attributes';
$lang['optional_attrs'] = 'Optionale Attribute';//'Optional Attributes';
$lang['OID'] = 'OID';//'OID';
$lang['desc'] = 'Beschreibung';//'Description';
$lang['is_obsolete'] = 'Diese objectClass ist veraltet';//'This objectClass is <b>obsolete</b>';
$lang['inherits'] = 'Abgeleitet von';//'Inherits';
$lang['jump_to_this_oclass'] = 'Gehe zur objectClass Definition';//'Jump to this objectClass definition';
// General
$lang['chooser_link_tooltip'] = "Click to popup a dialog to select an entry (DN) graphically";
?>

View File

@ -18,9 +18,11 @@
0x10 LDAP_NO_SUCH_ATTRIBUTE "That entry does not contain the attribute specified."
0x11 LDAP_UNDEFINED_TYPE "The attribute type specified is invalid."
0x12 LDAP_INAPPROPRIATE_MATCHING "This usually means that your LDAP server has not defined an equality rule
for the attribute you are trying to alter. This is not phpLDAPAdmin's fault as the
for the attribute you are trying to alter. This is not phpLDAPadmin's fault as the
LDAP server has refused to perform the operation (as well it should if there is
no equality rule for it to use for the operation)."
no equality rule for it to use for the operation). This generally applies when
adding a new value to a binary attribute, or removing a single value from a
multi-valued binary attribute."
0x13 LDAP_CONSTRAINT_VIOLATION "Some constraint would be violated by performing the action. This can happen when
you try to add a second value to a single-valued attribute, for example."
0x14 LDAP_TYPE_OR_VALUE_EXISTS "An attribute type or attribute value
@ -51,7 +53,8 @@
to exist or that would remove a required attribute, given the current list
of ObjectClasses."
0x42 LDAP_NOT_ALLOWED_ON_NONLEAF "The entry you tried to operate on has children. (usually this means you
tried to delete the entry, which you cannot do to an entry with children)."
tried to delete or rename the entry, which you cannot do to an entry
with children)."
0x43 LDAP_NOT_ALLOWED_ON_RDN "You cannot preform that operation on a the relative distinguished name
(RDN) of an object."
0x44 LDAP_ALREADY_EXISTS "The object already exists (usually you are trying to create a new object

View File

@ -11,10 +11,9 @@
* - scope (one of 'sub', 'base', or 'one')
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$dn = stripslashes( rawurldecode( $_GET['dn'] ) );
$dn = rawurldecode( $_GET['dn'] );
$server_id = $_GET['server_id'];
$format = $_GET['format'];
$scope = $_GET['scope'] ? $_GET['scope'] : 'base';
@ -23,12 +22,15 @@ check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
$objects = pla_ldap_search( $server_id, 'objectClass=*', $dn, array(), $scope, false );
$server_name = $servers[ $server_id ][ 'name' ];
$server_host = $servers[ $server_id ][ 'host' ];
//echo "<pre>";
//print_r( $objects );
//exit;
$rdn = get_rdn( $dn );
$friendly_rdn = get_rdn( $dn, 1 );
switch( $format ) {
case 'win': $br = "\r\n"; break;
@ -40,44 +42,62 @@ switch( $format ) {
if( ! $objects )
pla_error( "Search on dn (" . htmlspecialchars($dn) . ") came back empty" );
header( "Content-type: text/plain" );
header( "Content-disposition: attachment; filename=\"$rdn.ldif\"" );
// define the max length of a ldif line to 76
// as it is suggested (implicitely) for (some) binary
// attributes in rfc 2849 (see note 10)
define("MAX_LDIF_LINE_LENGTH",76);
header( "Content-type: application/download" );
header( "Content-Disposition: filename=$friendly_rdn.ldif" );
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 );
header( "Pragma: no-cache" );
echo "version: 1$br$br";
echo "# LDIF Export for: $rdn$br";
echo "# Scope: $scope, " . count( $objects ) . " entries$br";
echo "# Generated by phpLDAPAdmin on " . date("F j, Y g:i a") . "$br";
echo "# LDIF Export for: " . utf8_decode( $dn ) . "$br";
echo "# Generated by phpLDAPadmin on " . date("F j, Y g:i a") . "$br";
echo "# Server: " . utf8_decode( $server_name ) . " ($server_host)$br";
echo "# Search Scope: $scope$br";
echo "# Total entries: " . count( $objects ) . "$br";
echo $br;
$counter = 0;
foreach( $objects as $dn => $attrs )
{
$counter++;
unset( $attrs['dn'] );
unset( $attrs['count'] );
if( is_safe_ascii( $dn ) )
echo "dn: $dn$br";
else
echo "dn:: " . base64_encode( $dn ) . $br;
// display "# Entry 3: cn=test,dc=example,dc=com..."
$title_string = "# Entry $counter: " . utf8_decode( $dn );
if( strlen( $title_string ) > MAX_LDIF_LINE_LENGTH-3 )
$title_string = substr( $title_string, 0, MAX_LDIF_LINE_LENGTH-3 ) . "...";
echo "$title_string$br";
// display the DN
if( is_safe_ascii( $dn ) )
multi_lines_display("dn: $dn");
else
multi_lines_display("dn:: " . base64_encode( $dn ));
// display all the attrs/values
foreach( $attrs as $attr => $val ) {
if( is_array( $val ) ) {
foreach( $val as $v ) {
if( is_safe_ascii( $v ) ) {
echo "$attr: $v$br";
multi_lines_display("$attr: $v");
} else {
echo "$attr:: " . base64_encode( $v ) . $br;
multi_lines_display("$attr:: " . base64_encode( $v ));
}
}
} else {
$v = $val;
if( is_safe_ascii( $v ) ) {
echo "$attr: $v$br";
multi_lines_display("$attr: $v");
} else {
echo "$attr:: " . base64_encode( $v ) . $br;
multi_lines_display("$attr:: " . base64_encode( $v ));
}
}
}
@ -91,3 +111,26 @@ function is_safe_ascii( $str )
return false;
return true;
}
function multi_lines_display($str){
global $br;
$length_string = strlen($str);
$max_length = MAX_LDIF_LINE_LENGTH;
while ($length_string > $max_length){
echo substr($str,0,$max_length).$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 = MAX_LDIF_LINE_LENGTH-1;
}
echo $str."".$br;
}
?>

418
ldif_functions.php Normal file
View File

@ -0,0 +1,418 @@
<?php
/**
* file: ldif_functions.php
* ------------------------
* Declare the functions for handling ldif file
* this is considered as beta version, there is some things to improve:
* -change some method
* -make it more modular
* -review error message
* -handle the number version
* -review regexp
* -make a class ?
* -handle base64 for modrdn
*/
//warning flag;
$warning=0;
// warning message if any
$warning_message;
// boolean flag in case of error
$error=0;
// the error mesage if any
$error_message;
// to keep track of the line number while parsing the file
$line_number = 0;
// keep track of the current line while parsing the file
$current_line;
$fp;
function ldif_open_file($file_name){
global $fp;
$fp=fopen($file_name,"r");
}
function ldif_eof(){
global $fp;
return feof($fp);
}
/**
* Check if the current line is a comment line
*
* @return true if the current line is a ldif comment,false otherwise
*/
function ldif_is_comment_line(){
global $current_line;
return substr(trim($current_line),0,1)=="#"?1:0;
}
/**
* Check if is the curent line is a blank line
*
* @return true if it is a blank line,false otherwise
*/
function ldif_is_blank_line(){
global $current_line;
return(trim($current_line)=="")?1:0;
}
/**
* Check if the current line is a line with a dn
*
* @return true if the line contains a dn line, false otherwise.
*/
function ldif_is_dn_line(){
global $current_line;
return ereg("^dn:",$current_line)?1:0;
}
/**
* Fetch the next line of the ldif file
*/
function ldif_next_line(){
global $line_number;
global $current_line;
global $fp;
$current_line = fgets($fp,1024);
while(!ereg("\n|\r\n",$current_line)&&!ldif_eof()){
$current_line.=fgets($fp,1024);
}
$line_number++;
}
/**
* Get the version of the ldif file
*
**/
function ldif_check_version(){
global $warning;
global $warning_message;
global $error_message;
global $error;
global $line_number;
global $current_line;
// boolean flag to see if any valid ldif line is found
$ldif_line_found=0;
while(!ldif_eof()&&!$ldif_line_found &&!$warning){
//get the first line
ldif_next_line();
// skip line with comment and blank line
if(ldif_is_comment_line()||ldif_is_blank_line()){
//debug usage
//echo "$line_number -".(ldif_is_comment_line()?"comment":"blank line")."<br/>";
}
elseif(ereg("^version",trim($current_line))){
$ldif_line_found=1;
ldif_next_line();
// TODO: handle the version number here
}
// not valid ldif line was found
else{
//set the flag warning
$warning=1;
$warning_message = "No version found - assuming 1";
}
}//end while
$warning?0:1;
}// end get_version() method
/**
* Return a warning message
*
* @return a warning message
*/
function ldif_warning_message(){
global $warning_message;
return $warning_message;
}
function ldif_error_message(){
global $error_message;
return $error_message;
}
/**
* Check if the file is valie
*
*
*/
function is_valid_file($path_to_file){
return file_exists($path_to_file)&&is_file($path_to_file)&&is_readable($path_to_file);
}
/**
* Close the file
*
*
*/
function ldif_close(){
global $fp;
@fclose($fp);
}
/**
* Return the action that the ldap server should do with an entry
* The default action is add.
*
* @return the action the server should do.
*/
function ldif_get_action(){
global $current_line;
// default action is add
$action ="add";
if(ereg("changetype:[ ]*(delete|add|modrdn|moddn|modify)",$current_line,$arr)){
$action = $arr[1];
ldif_next_line();
}
return $action;
}
/**
* Retrieve the dn of an entry
* @return the dn value of an entry
*/
function ldif_fetch_dn_entry(){
global $error;
global $current_line;
global $error_message;
global $line_number;
global $number_of_lines;
// the value of the dn
$current_dn_value;
//boolean flag to see if any dn was found
$dn_found=0;
while(!ldif_eof()&&!$dn_found&&!$error){
//skip comment and blank line
if(ldif_is_blank_line()||ldif_is_comment_line()){
//debug
//echo "$line_number - comment\n<br>";
ldif_next_line();
}
// case where the dn is found
elseif(ldif_is_dn_line()){
$current_dn=$current_line;
//debug
//echo "$line_number - $current_line<br>";
$dn_found=1;
}
else{
$error=1;
$error_message = "Error: Line ".$line_number." - a valid dn is required";
return false;
}
}//fin while
// if mainly to hanlde the case
//where a dn was found and is written on several lines
// could be use to test if any white line appears after
if($dn_found&&!ldif_eof()){
//boolean flag to see if the dn is written on more than one line
$dn_has_next=0;
//keeping track of the line number of the dn when first encountered
$dn_line_number = $line_number;
// empty string to store the possible following lines
while(!$dn_has_next){
ldif_next_line();
//if next line begin with a space and is not empty
// append to the previous line
if((substr($current_line,0,1)==" ")){
ereg_replace("\n|\r|\r\n","",$current_dn =trim($current_dn).trim($current_line));
}
//else leaving the while loop
else{
$dn_has_next=1;
}
}//end while
//debug
//echo $dn_line_number." - ".$current_dn."\r\n<br>";
// handle base 64 case here
if(ereg("^dn::",$current_dn)){
$current_dn = base64_decode(trim(substr($current_dn,4,strlen($current_dn)-1)));
}else{
$current_dn = trim(substr($current_dn,3,strlen($current_dn)-1));
}
// echo $dn_line_number."-".$current_dn."<br />";
}
return $current_dn;
}
/**
* functions which will return a array of attributes
* for this entry
*
* @return attrs the array of attributes
*/
function ldif_fetch_attributes_for_entry(){
global $error;
global $current_line;
global $line_number;
global $error_message;
global $server_id;
$attribute_value="";
//array to store the attribute
$attrs = array();
// while we dont find any empty line or any error occur
while(trim($current_line)!=""&&$error!=1){
//1 - we need to check if it's a valid ldif line.
//-----------------------------------------------
if(ereg(":",trim($current_line),$arr)&&substr($current_line,0,1)!=" "){
//get the position of the character ":"
$pos = strpos($current_line,":");
//get the name of the attribute
$attribute_name = substr($current_line,0, $pos);
// get the value part of the attribute
$attribute_value_part = trim(substr($current_line,$pos+1,strlen($current_line)));
//2 - we get the description and the "value" part
// now check if it's split over several lines
$att_has_next = 0;
$attr_line_number=$line_number;
while(!$att_has_next){
ldif_next_line();
//if there is a another line for the attribute value,it should:
// 1 - begin with a white space
// 2 - have a length > 1
// 3 - not have the character :
if((substr($current_line,0,1)==" ")&&!ereg(":",trim($current_line))){
ereg_replace("\n|\r|\r\n","",$attribute_value_part =trim($attribute_value_part).trim($current_line));
}
else{
$att_has_next=1;
}
}
//3 - need to see if the value is base 64 encoded,an url
//-------------------------------------------------------
$attribute_value="";
//if the next character in the value part is ":";it's it base 64 encoded
if(substr($attribute_value_part,0,1)==":"){
// it is binary data,so we just decode it
$attribute_value = base64_decode(trim(substr($attribute_value_part,1)));
}
//else if the next charachter is <, we have to handle an url
elseif(substr($attribute_value_part,0,1)=="<"){
// we need to handle the case for the scheme "file://" as it
//doesn't seem to be supported by fopen
$file_path_with_scheme= trim(substr($attribute_value_part,1));
if(ereg("^file://",$file_path_with_scheme)){
$file_path = substr(trim($file_path_with_scheme),7);
if($handle = @fopen($file_path, "rb")){
$attribute_value = @fread($handle,filesize($file_path));
@fclose($handle);
}
else{
$error=1;
$error_message = "Line: ".$attr_line_number. " - Unable to open file ".
$file_path_with_scheme;
return false;
}
}
else{
$error=1;
$error_message = "Line: ".$attr_line_number. " - the URL seems no to be well formed ";
return false;
}
}
//it's a string
else{
$attribute_value = trim($attribute_value_part);
}
$attrs[$attribute_name][] = $attribute_value;
//debug
// echo $attr_line_number."- ".$attribute_name.":".$attribute_value."\r\n<br>";
}
// the attribute line contains the charachter ":" or there is
// at least a white space at the begining
else{
$error_message = "Line ". $line_number. " - Attribute not well formed";
$error=1;
return false;
}
}
return $attrs;
}

119
ldif_import.php Normal file
View File

@ -0,0 +1,119 @@
<?php
/*
* ldif_import.php
* Imports an LDIF file to the specified server_id.
*
* Variables that come in as POST vars:
* - ldif_file (as an uploaded file)
* - server_id
*/
require 'common.php';
$debug = true;
$server_id = $_POST['server_id'];
$server_name = $servers[$server_id]['name'];
$file = $_FILES['ldif_file']['tmp_name'];
$remote_file = $_FILES['ldif_file']['name'];
$file_len = $_FILES['ldif_file']['size'];
is_array( $_FILES['ldif_file'] ) or pla_error( "Missing uploaded file." );
file_exists( $file ) or pla_error( "No LDIF file specified. Please try again." );
$file_len > 0 or pla_error( "Uploaded file is empty." );
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
include 'header.php'; ?>
<body>
<h3 class="title">Import LDIF File</h3>
<h3 class="subtitle">
Server: <b><?php echo htmlspecialchars( $server_name ); ?></b>
File: <b><?php echo htmlspecialchars( $remote_file ); ?>
(<?php echo number_format( $file_len ); ?> bytes)</b>
</h3>
<br />
<br />
<center><i>This is an experimental and untested feature. Proceed at your own risk.</i><br />
<i>The add and delete operations are the only operations currently supported.</i>
</center>
<br />
<?php
include("ldif_functions.php");
@set_time_limit( 0 );
ldif_open_file($file);
$ds = pla_ldap_connect( $server_id ) or pla_error( "Could not connect to LDAP server" );
if(!ldif_check_version()){
display_warning(ldif_warning_message());
}
while($dn_entry= ldif_fetch_dn_entry() ){
$action = ldif_get_action();
if($action=="add"){
echo "Adding dn:".utf8_decode($dn_entry) ."... ";
flush();
if($attributes = ldif_fetch_attributes_for_entry()){
if(@ldap_add($ds,$dn_entry,$attributes)){
echo "<span style=\"color:green;\">Success</span><br>";
}
else{
echo "<span style=\"color:red;\">failed</span><br><br>";
pla_error( "Could not add object: " . htmlspecialchars( utf8_decode( $dn ) ), ldap_error( $ds ), ldap_errno( $ds ) );
}
}
else{
echo "<span style=\"color:red;\">failed</span><br><br>";
echo "<div style=\"color:red\">".display_error_message(ldif_error_message())."</div>";
flush();
}
}
elseif($action=="delete"){
echo "Deleting dn: ".$dn_entry." ";
if(@ldap_delete($ds,$dn_entry)){
echo "<span style=\"color:green;\">Success</span><br>";
flush();
}
else{
echo "<span style=\"color:red;\">Failed</span><br><br>";
flush();
pla_error( "Could not delete object: " . htmlspecialchars( utf8_decode( $dn ) ), ldap_error( $ds ), ldap_errno( $ds ) );
}
}
}
reload_left_frame();
function reload_left_frame(){
global $server_id;
echo "<script>\r\n";
echo "parent.left_frame.document.location='refresh.php?server_id=".$server_id."';\r\n";
echo "</script>\r\n";
}
function display_error_message($error_message){
echo "<div style=\"color:red;\">".$error_message."</div>";
}
function display_warning($warning){
echo "<div style=\"color:orange\">".$warning."</div>";
}
?>
</script>
</body>
</html>

48
ldif_import_form.php Normal file
View File

@ -0,0 +1,48 @@
<?php
/*
* ldif_import_form.php
* Displays a form to allow the user to upload and import
* an LDIF file.
*
* Variables expected as GET vars:
* - server_id
*/
require 'common.php';
$server_id = $_GET['server_id'];
$server_name = $servers[$server_id]['name'];
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
include 'header.php'; ?>
<body>
<h3 class="title">Import LDIF File</h3>
<h3 class="subtitle">Server: <b><?php echo htmlspecialchars( $server_name ); ?></b></h3>
<br />
<br />
<center><i>This is an experimental and untested feature. Proceed at your own risk.</i>
<br />
<i>The add operation is the only operation currently supported.</i>
</center>
<br />
<br />
Select an LDIF file:<br />
<br />
<form action="ldif_import.php" method="post" class="new_value" enctype="multipart/form-data">
<input type="hidden" name="server_id" value="<?php echo $server_id; ?>" />
<input type="file" name="ldif_file" /><br />
<br />
<input type="submit" value="Proceed &gt;&gt;" />
</form>
</body>
</html>

View File

@ -15,12 +15,12 @@
* - server_id
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$server_id = $_POST['server_id'];
$dn = stripslashes( $_POST['login_dn'] );
$pass = stripslashes( $_POST['login_pass'] );
$dn = $_POST['login_dn'];
$uid = $_POST['uid'];
$pass = $_POST['login_pass'];
$redirect = rawurldecode( $_POST['redirect'] );
$anon_bind = $_POST['anonymous_bind'] == 'on' ? true : false;
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
@ -37,6 +37,22 @@ if( $anon_bind ) {
$host = $servers[$server_id]['host'];
$port = $servers[$server_id]['port'];
if ( isset( $servers[$server_id]['login_attr'] ) &&
$servers[$server_id]['login_attr'] != "dn" &&
$servers[$server_id]['login_attr'] != "") {
// search for the "uid" first
$ds = ldap_connect ( $host, $port );
$ds or pla_error( "Could not contact '" . htmlspecialchars( $host ) . "' on port '" . htmlentities( $port ) . "'" );
@ldap_bind ($ds) or pla_error( "Could not bind anonymously to server. " .
"Unless your server accepts anonymous binds, " .
"the login_attr feature will not work properly.");
$sr=@ldap_search($ds,$servers[$server_id]['base'],$servers[$server_id]['login_attr'] ."=". $uid, array("dn"), 0, 1);
$result = @ldap_get_entries($ds,$sr);
$dn = $result[0]["dn"];
@ldap_unbind ($ds);
}
// verify that the login is good
$ds = @ldap_connect( $host, $port );
$ds or pla_error( "Could not connect to '" . htmlspecialchars( $host ) . "' on port '" . htmlentities( $port ) . "'" );
@ -49,6 +65,8 @@ $bind_result = @ldap_bind( $ds, $dn, $pass );
if( ! $bind_result )
pla_error( "Bad username/password. Try again" );
if( ! isset( $cookie_time ) )
$cookie_time = 0;
$expire = $cookie_time == 0 ? null : time()+$cookie_time;
if( $anon_bind ) {
// we set the cookie val to 0 for anonymous binds.

View File

@ -9,8 +9,7 @@
* - server_id
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$server_id = $_GET['server_id'];
$server = $servers[$server_id];
@ -43,9 +42,9 @@ check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars
<?php if( $_SERVER['SERVER_PORT'] != 443 ) { ?>
<span style="color:red">Warning: this is an insecure (non-SSL) connection!<br />
SSL is recommended when transmitting sensitive passwords.</span>
<br />
<center>
<span style="color:red">Warning: This web connection is <acronym title="Your login and password will be transmitted in clear text">unencrypted</acronym> (not https).<br />
</span>
<?php } ?>
@ -64,8 +63,12 @@ check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars
<td colspan="2"><small>Anonymous Bind</small> <input type="checkbox" name="anonymous_bind" onclick="toggle_disable_login_fields(this)" /></td>
</tr>
<tr>
<!--
<td><small>Login <acronym title="Distinguished Name">DN</acronym></small></td>
<td><input type="text" name="login_dn" size="40" value="<?php echo $servers[$server_id]['login_dn']; ?>" name="login_dn" /></td>
-->
<td><small>Login <?php if ( $servers[$server_id]['login_attr'] == "dn" || $servers[$server_id]['login_attr'] == "") { echo '<acronym title="Distinguished Name">DN</acronym>';} ?></small></td>
<td><input type="text" name="<?php if ( $servers[$server_id]['login_attr'] == "dn" || $servers[$server_id]['login_attr'] == "" ) {echo 'login_dn';} else {echo 'uid';} ?>" size="40" value="<?php echo $servers[$server_id]['login_dn']; ?>" /></td>
</tr>
<tr>
<td><small>Password</small></td>

View File

@ -9,8 +9,7 @@
* - server_id
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$server_id = $_GET['server_id'];
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );

View File

@ -9,33 +9,52 @@
* - server_id
* - attr
* - val
* - binary
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$dn = stripslashes( rawurldecode( $_POST['dn'] ) );
$dn = rawurldecode( $_POST['dn'] );
$server_id = $_POST['server_id'];
$attr = stripslashes( $_POST['attr'] );
$val = stripslashes( $_POST['val'] );
$attr = $_POST['attr'];
$val = $_POST['val'];
$val = utf8_encode( $val );
$encoded_dn = rawurlencode( $dn );
$encoded_attr = rawurlencode( $attr );
$is_binary_val = isset( $_POST['binary'] ) ? true : false;
if( ! $is_binary_val && $val == "" ) {
pla_error( "You left the attribute value blank. Please go back and try again." );
}
if( is_server_read_only( $server_id ) )
pla_error( "You cannot perform updates while server is in read-only mode" );
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
// special case for jpegPhoto attributes:
// we must go read the data from the file.
if( 0 == strcasecmp( $attr, 'jpegPhoto' ) )
{
$file = $_FILES['jpeg_photo_file']['tmp_name'];
// 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
if( $is_binary_val ) {
$file = $_FILES['val']['tmp_name'];
$f = fopen( $file, 'r' );
$jpeg_data = fread( $f, filesize( $file ) );
$binary_data = fread( $f, filesize( $file ) );
fclose( $f );
$val = $jpeg_data;
$val = $binary_data;
}
// Automagically hash new userPassword attributes according to the
// chosen in config.php.
if( 0 == strcasecmp( $attr, 'userpassword' ) )
{
if( $servers[$server_id]['default_hash'] != '' ) {
$enc_type = $servers[$server_id]['default_hash'];
$new_val = password_hash( $new_val, $enc_type );
$val = $new_val;
}
}
$ds = pla_ldap_connect( $server_id ) or pla_error( "Could not connect to LDAP server" );
$new_entry = array( $attr => $val );
$result = @ldap_mod_add( $ds, $dn, $new_entry );

View File

@ -1,46 +0,0 @@
<?php
/*
* new_jpeg_photo_form.php
* Displays a form to allow the user to a jpegPhoto to an object.
* - dn (rawurlencoded)
* - server_id
*/
require 'config.php';
require_once 'functions.php';
$dn = stripslashes( rawurldecode( $_GET['dn'] ) );
$encoded_dn = rawurlencode( $dn );
$server_id = $_GET['server_id'];
$rdn = ldap_explode_dn( $dn, 0 );
$rdn = $rdn[0];
$server_name = $servers[$server_id]['name'];
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
include 'header.php'; ?>
<body>
<h3 class="title">Add a <b>jpegPhoto</b> to <b><?php echo htmlspecialchars($rdn); ?></b></h3>
<h3 class="subtitle">Server2: <b><?php echo $server_name; ?></b> &nbsp;&nbsp;&nbsp; Distinguished Name: <b><?php echo $dn; ?>
</b></h3>
Select a jpeg file:<br />
<br />
<form action="new_attr.php" method="post" class="new_value" enctype="multipart/form-data">
<input type="hidden" name="server_id" value="<?php echo $server_id; ?>" />
<input type="hidden" name="dn" value="<?php echo $encoded_dn; ?>" />
<input type="hidden" name="attr" value="jpegPhoto" />
<input type="file" name="jpeg_photo_file" /><br />
<br />
<input type="submit" value="Proceed &gt;&gt;" />
</form>
</body>
</html>

View File

@ -9,16 +9,18 @@
* - server_id
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$encoded_dn = $_POST['dn'];
$dn = stripslashes( rawurldecode( $encoded_dn ) );
$dn = rawurldecode( $encoded_dn );
$server_id = $_POST['server_id'];
if( ! $dn )
pla_error( "You must specify a DN." );
if( is_server_read_only( $server_id ) )
pla_error( "You cannot perform updates while server is in read-only mode" );
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
pla_ldap_connect( $server_id ) or pla_error( "Could not connect to LDAP server" );
@ -66,7 +68,7 @@ if( $del_result )
parent.left_frame.location.reload();
</script>
Object <b><?php echo htmlspecialchars( utf8_decode( $dn ) ); ?></b> and sub-tree deleted successfully.
Object <b><?php echo htmlspecialchars( $dn ); ?></b> and sub-tree deleted successfully.
<?php
@ -86,7 +88,7 @@ function pla_rdelete( $server_id, $dn )
$ds = pla_ldap_connect( $server_id );
if( ! is_array( $children ) || count( $children ) == 0 ) {
echo "<nobr>Deleting " . htmlspecialchars( utf8_decode( $dn ) ) . "...";
echo "<nobr>Deleting " . htmlspecialchars( $dn ) . "...";
flush();
if( ldap_delete( $ds, $dn ) ) {
echo " <span style=\"color:green\">Success</span></nobr><br />\n";
@ -99,7 +101,7 @@ function pla_rdelete( $server_id, $dn )
foreach( $children as $child_dn ) {
pla_rdelete( $server_id, $child_dn );
}
echo "<nobr>Deleting " . htmlspecialchars( utf8_decode( $dn ) ) . "...";
echo "<nobr>Deleting " . htmlspecialchars( $dn ) . "...";
flush();
if( ldap_delete( $ds, $dn ) ) {
echo " <span style=\"color:green\">Success</span></nobr><br />\n";

View File

@ -9,8 +9,7 @@
* - server_id
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$server_id = $_GET['server_id'];

View File

@ -10,21 +10,26 @@
* - new_rdn
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$dn = rawurldecode( stripslashes( $_POST['dn'] ) );
$dn = rawurldecode( $_POST['dn'] );
$server_id = $_POST['server_id'];
$new_rdn = stripslashes( $_POST['new_rdn'] );
$new_rdn = $_POST['new_rdn'];
$new_rdn = utf8_encode($new_rdn);
if( is_server_read_only( $server_id ) )
pla_error( "You cannot perform updates while server is in read-only mode" );
if( is_server_read_only( $server_id ) )
pla_error( "You cannot perform updates while server is in read-only mode" );
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
$ds = pla_ldap_connect( $server_id ) or pla_error( "Could not connect to LDAP sever" );
// build the container string
$old_rdn = ldap_explode_dn( $dn, 0 );
$old_rdn = pla_explode_dn( $dn );
$container = $old_rdn[ 1 ];
for( $i=2; $i<count($old_rdn)-1; $i++ )
$container .= ',' . $old_rdn[$i];

View File

@ -10,8 +10,7 @@
* - attr (optional)
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$server_id = $_GET['server_id'];
$view = isset( $_GET['view'] ) ? $_GET['view'] : 'objectClasses';
@ -23,31 +22,26 @@ have_auth_info( $server_id ) or
pla_ldap_connect( $server_id ) or
pla_error( "Coult not connect to LDAP server." );
$schema = get_schema( $server_id );
include 'header.php';
$schema_error_str = "Could not retrieve schema from <b>" . htmlspecialchars($servers[$server_id]['name']) . "</b>.<br />
<br />
</center>
This could happen for several reasons, the most probable of which are:
<ul>
<li>The server does not fully support the LDAP protocol.</li>
<li>Your version of PHP does not correctly perform the query.</li>
<li>Or lastly, phpLDAPadmin doesn't know how to fetch the schema for your server.</li>
</ul>
Please <a href=\"https://sourceforge.net/tracker/?func=add&group_id=61828&atid=498546\" target=\"new\">
report this as a bug</a>";
?>
<body>
<?php if( ! $schema ) {
pla_error( "Could not retrieve schema from <b>" . htmlspecialchars($servers[$server_id]['name']) . "</b>.<br />
<br />
This could happen for several reasons, the most probable of which are:
<ul>
<li>The server does not fully support the LDAP protocol.</li>
<li>Your version of PHP does not correctly perform the query.</li>
<li>Or lastly, phpLDAPAdmin doesn't know how to fetch the schema for your server.</li>
</ul>
Please <a href=\"http://sourceforge.net/tracker/?func=add&group_id=80217&atid=559082\">report this</a>
as a bug.
" );
} else { ?>
<h3 class="title">Schema for server <b><?php echo htmlspecialchars($servers[$server_id]['name']); ?></b></h3>
<h3 class="title"><?php echo $lang['schema_for_server']; ?>
<b><?php echo htmlspecialchars($servers[$server_id]['name']); ?></b></h3>
<br />
<center>
@ -55,14 +49,14 @@ include 'header.php';
'objectClasses' :
'<a href="schema.php?server_id=' . $server_id . '&amp;view=objectClasses">objectClasses</a>' ); ?>
|
<?php echo ( $view=='syntaxes' ?
'Syntaxes' :
'<a href="schema.php?server_id=' . $server_id . '&amp;view=syntaxes">Syntaxes</a>' ); ?>
|
<?php echo ( $view=='attributes' ?
'Attributes' :
'<a href="schema.php?server_id=' . $server_id . '&amp;view=attributes">Attributes</a>' ); ?>
|
<?php echo ( $view=='syntaxes' ?
'Syntaxes' :
'<a href="schema.php?server_id=' . $server_id . '&amp;view=syntaxes">Syntaxes</a>' ); ?>
|
<?php echo ( $view=='matching_rules' ?
'Matching Rules' :
'<a href="schema.php?server_id=' . $server_id . '&amp;view=matching_rules">Matching Rules</a>' ); ?>
@ -71,79 +65,185 @@ include 'header.php';
<?php flush(); ?>
<?php
if( $view == 'attr' )
{
$attr = $_GET['attr'];
if( ! isset( $_GET['attr'] ) )
pla_error( "No attribute specified in the query string." );
//echo '<pre>'; print_r( $schema['attrs'] );
?>
<center>
Attribute definition for <b><?php echo htmlspecialchars( $attr ); ?></b><br /><br />
<table class="schema_attr">
<?php
if( is_array( $schema['attrs'][strtolower($attr)] ) )
{
$counter = 0;
foreach( $schema['attrs'][strtolower($attr)] as $key => $val )
{
if( $key != 'val' && $val != null ) {
$counter++;
echo "<tr class=\"" . ($counter%2==0 ? 'even' : 'odd') . "\"><td>$key</td><td>$val</td></tr>\n";
}
}
}
else
pla_error( "Bad schema entry for attribute: " . htmlspecialchars( $attr ) );
?>
</table>
</center>
<?php
} elseif( $view == 'syntaxes' ) {
echo "<center>The following <b>syntaxes</b> are supported by this LDAP server</center><br />\n\n";
if( $view == 'syntaxes' ) {
$highlight_oid = isset( $_GET['highlight_oid'] ) ? $_GET['highlight_oid'] : false;
echo "<center>" . $lang['the_following_syntaxes'] . "</center><br />\n\n";
echo "\n\n<table class=\"schema_attr\" width=\"100%\">\n";
echo "<tr><th>Syntax OID</th><th>Description</th></tr>\n";
echo "<tr><th>" . $lang['syntax_oid'] . "</th><th>" . $lang['desc'] . "</th></tr>\n";
flush();
$counter=1;
foreach( get_schema_syntaxes( $server_id ) as $oid => $desc ) {
$schema_syntaxes = get_schema_syntaxes( $server_id );
if( ! $schema_syntaxes ) pla_error( $schema_error_str );
foreach( $schema_syntaxes as $oid => $desc ) {
$counter++;
$oid = htmlspecialchars( $oid );
$desc = htmlspecialchars( $desc['description'] );
echo "<tr class=\"" . ($counter%2==0?'even':'odd'). "\"><td>$oid</td><td>$desc</td></tr>\n";
if( $highlight_oid && $highlight_oid == $oid )
echo "<tr class=\"highlight\">";
else
echo "<tr class=\"" . ($counter%2==0?'even':'odd'). "\">";
echo "<td><a name=\"$oid\">$oid</a></td><td>$desc</td></tr>\n\n";
}
echo "</table>\n";
} elseif( $view == 'attributes' ) {
echo "<center>The following <b>attributes</b> are supported by this LDAP server</center><br />\n\n";
echo "<table class=\"schema_attr\" width=\"100%\">\n";
foreach( get_schema_attributes( $server_id ) as $attr ) {
echo "<tr><th colspan=\"2\">" . $attr['name'] . "</th></tr>\n";
echo "<center>" . $lang['the_following_attributes'] . "</center><br />\n";
flush();
$schema_attrs = get_schema_attributes( $server_id );
$schema_object_classes = get_schema_objectclasses( $server_id );
if( ! $schema_attrs || ! $schema_object_classes )
pla_error( $schema_error_str );
// do a reverse-mapping to add in which objectClasses each attributeType is used
foreach( $schema_object_classes as $object_class ) {
if( isset( $object_class['must_attrs'] ) && is_array( $object_class['must_attrs'] ) )
$must_attrs = $object_class['must_attrs'];
else
$must_attrs = array();
if( isset( $object_class['may_attrs'] ) && is_array( $object_class['may_attrs'] ) )
$may_attrs = $object_class['may_attrs'];
else
$may_attrs = array();
$attrs = array_unique( array_merge( $must_attrs, $may_attrs ) );
foreach( $attrs as $attr_name )
if( isset( $schema_attrs[ strtolower( $attr_name ) ] ) )
$schema_attrs[ strtolower( $attr_name ) ]->addUsedInObjectClass( $object_class['name'] );
}
//echo "<pre>";
//print_r( $schema_attrs );
//echo "</pre>";
?>
<small><?php echo $lang['jump_to_attr']; ?>:</small>
<select name="oclass_jumper"
onChange="window.location.href='schema.php?server_id=<?php echo $server_id; ?>&amp;view=attributes#'+this.value">
<?php foreach( $schema_attrs as $attr ) { ?>
<option value="<?php echo strtolower( $attr->getName() ); ?>"><?php echo $attr->getName(); ?></option>
<?php } ?>
</select>
<br />
<table class="schema_attr" width="100%">
<?php foreach( $schema_attrs as $attr ) {
echo "<tr><th colspan=\"2\"><a name=\"" . strtolower( $attr->getName() ) . "\">";
echo $attr->getName() . "</a></th></tr>\n\n";
$counter = 0;
foreach( $attr as $key => $val )
{
if( $key != 'val' && $val != null ) {
$counter++;
echo "<tr class=\"" . ($counter%2==0 ? 'even' : 'odd') . "\">";
echo "<td>$key</td><td>$val</td></tr>\n";
}
echo "<tr class=\"" . (++$counter%2==0?'even':'odd') . "\">\n";
echo "<td>Description</td>\n";
echo "<td>" . ( $attr->getDescription() == null ? '(no description)' : $attr->getDescription() ). "</td>\n";
echo "</tr>\n\n";
echo "<tr class=\"" . (++$counter%2==0?'even':'odd') . "\">\n";
echo "<td><acronym title=\"Object Identier\">OID</acronym></td>\n";
echo "<td>" . $attr->getOID() . "</td>\n";
echo "</tr>\n\n";
echo "<tr class=\"" . (++$counter%2==0?'even':'odd') . "\">\n";
echo "<td>Obsolete?</td>\n";
echo "<td>" . ( $attr->getIsObsolete() ? '<b>Yes</b>' : 'No' ) . "</td>\n";
echo "</tr>\n\n";
echo "<tr class=\"" . (++$counter%2==0?'even':'odd') . "\">\n";
echo "<td>Inherits</td>\n";
echo "<td>" . ( $attr->getSupAttribute()==null? '(none)' : $attr->getSupAttribute() ) . "</td>\n";
echo "</tr>\n\n";
echo "<tr class=\"" . (++$counter%2==0?'even':'odd') . "\">\n";
echo "<td>Equality</td>\n";
echo "<td>" . ( $attr->getEquality() == null ? '(not specified)' : $attr->getEquality() ) . "</td>\n";
echo "</tr>\n\n";
echo "<tr class=\"" . (++$counter%2==0?'even':'odd') . "\">\n";
echo "<td>Ordering</td>\n";
echo "<td>" . ( $attr->getOrdering()==null? '(not specified)' : $attr->getOrdering() ) . "</td>\n";
echo "</tr>\n\n";
echo "<tr class=\"" . (++$counter%2==0?'even':'odd') . "\">\n";
echo "<td>Substring Rule</td>\n";
echo "<td>" . ( $attr->getSubstr()==null? '(not specified)' : $attr->getSubstr() ) . "</td>\n";
echo "</tr>\n\n";
echo "<tr class=\"" . (++$counter%2==0?'even':'odd') . "\">\n";
echo "<td>Syntax</td>\n";
echo "<td>";
if( null != $attr->getType() ) {
echo "<a href=\"schema.php?server_id=$server_id&amp;view=syntaxes&amp;highlight_oid=";
echo $attr->getSyntaxOID() . "#" . $attr->getSyntaxOID();
echo "\">" . $attr->getType() . " (" . $attr->getSyntaxOID() . ")</a>";
} else {
echo $attr->getSyntaxOID();
}
echo "</td>\n";
echo "</tr>\n\n";
echo "<tr class=\"" . (++$counter%2==0?'even':'odd') . "\">\n";
echo "<td>Single Valued</td>\n";
echo "<td>" . ( $attr->getIsSingleValue() ? 'Yes' : 'No' ) . "</td>\n";
echo "</tr>\n\n";
echo "<tr class=\"" . (++$counter%2==0?'even':'odd') . "\">\n";
echo "<td>Collective?</td>\n";
echo "<td>" . ( $attr->getIsCollective() ? 'Yes' : 'No' ) . "</td>\n";
echo "</tr>\n\n";
echo "<tr class=\"" . (++$counter%2==0?'even':'odd') . "\">\n";
echo "<td>User Modification</td>\n";
echo "<td>" . ( $attr->getIsNoUserModification() ? 'No' : 'Yes' ) . "</td>\n";
echo "</tr>\n\n";
echo "<tr class=\"" . (++$counter%2==0?'even':'odd') . "\">\n";
echo "<td>Usage</td>\n";
echo "<td>" . ( $attr->getUsage() ? $attr->getUsage() : '(not specified)' ) . "</td>\n";
echo "</tr>\n\n";
echo "<tr class=\"" . (++$counter%2==0?'even':'odd') . "\">\n";
echo "<td>Maximum Length</td>\n";
echo "<td>" . ( $attr->getMaxLength() === null ?
'(not applicable)' :
number_format( $attr->getMaxLength() ) . ' characters' ) . "</td>\n";
echo "</tr>\n\n";
echo "<tr class=\"" . (++$counter%2==0?'even':'odd') . "\">\n";
echo "<td>Aliases</td>\n";
echo "<td>";
if( count( $attr->getAliases() ) == 0 )
echo "(none)";
else
foreach( $attr->getAliases() as $alias_attr_name )
echo "<a href=\"#" . strtolower($alias_attr_name) . "\">$alias_attr_name</a> ";
echo "</td>";
echo "</tr>\n\n";
echo "<tr class=\"" . (++$counter%2==0?'even':'odd') . "\">\n";
echo "<td>Used by objectClasses</td>\n";
echo "<td>";
if( count( $attr->getUsedInObjectClasses() ) == 0 )
echo "(none)";
else
foreach( $attr->getUsedInObjectClasses() as $used_in_oclass)
echo "<a href=\"schema.php?server_id=$server_id&amp;view=objectClasses#" .
strtolower($used_in_oclass) . "\">$used_in_oclass</a> ";
echo "</td>";
echo "</tr>\n\n";
flush();
}
echo "</table>\n";
} elseif( $view == 'matching_rules' ) {
echo "<center>The following <b>matching rules</b> are supported by this LDAP server</center><br />\n\n";
echo "<center>" . $lang['the_following_matching'] . "</center><br />\n\n";
echo "\n\n<table class=\"schema_attr\" width=\"100%\">\n";
echo "<tr><th>Matching Rule OID</th><th>Description</th></tr>\n";
echo "<tr><th>" . $lang['matching_rule_oid'] . "</th><th>" . $lang['desc'] . "</th></tr>\n";
flush();
$counter=1;
foreach( get_schema_matching_rules( $server_id ) as $oid => $attr ) {
$schema_matching_rules = get_schema_matching_rules( $server_id );
if( ! $schema_matching_rules ) pla_error( $schema_error_str );
foreach( $schema_matching_rules as $oid => $attr ) {
$counter++;
$oid = htmlspecialchars( $oid );
$desc = htmlspecialchars( $attr );
@ -151,65 +251,72 @@ include 'header.php';
}
echo "</table>\n";
} else { ?>
<small>Jump to an objectClass:</small>
} else {
echo "<center>" . $lang['the_following_objectclasses'] . "</center><br />\n";
flush();
$schema_oclasses = get_schema_objectclasses( $server_id );
if( ! $schema_oclasses ) pla_error( $schema_error_str );
?>
<small><?php echo $lang['jump_to_objectclass']; ?>:</small>
<select name="oclass_jumper"
onChange="window.location.href='schema.php?server_id=<?php echo $server_id; ?>#'+this.value">
<?php foreach( $schema['oclasses'] as $oclass => $desc ) { ?>
<?php foreach( $schema_oclasses as $oclass => $desc ) { ?>
<option value="<?php echo $oclass; ?>"><?php echo $desc['name']; ?></option>
<?php } ?>
</select>
<br />
<?php foreach( $schema['oclasses'] as $oclass => $attrs ) { ?>
<small>[<a name="<?php echo $oclass; ?>" href="#" title="Head on up to the top.">top</a>]</small>
<h4 class="oclass">objectClass <b><?php echo $attrs['name']; ?></b></h4>
<h4 class="oclass_sub">OID <b><?php echo $attrs['oid']; ?></b></h4>
<?php foreach( $schema_oclasses as $oclass => $attrs ) { ?>
<!--<small>[<a name="<?php echo $oclass; ?>" href="#" title="Head on up to the top.">top</a>]</small>-->
<h4 class="oclass"><a name="<?php echo $oclass; ?>"><?php echo $attrs['name']; ?></a></h4>
<h4 class="oclass_sub"><?php echo $lang['OID']; ?>: <b><?php echo $attrs['oid']; ?></b></h4>
<?php if( $attrs['description'] ) { ?>
<h4 class="oclass_sub">Description <b><?php echo $attrs['description']; ?></b></h4>
<h4 class="oclass_sub"><?php echo $lang['desc']; ?>: <b><?php echo $attrs['description']; ?></b></h4>
<?php } ?>
<h4 class="oclass_sub">Inherits <b><?php echo $attrs['sup']; ?></b></h4>
<br />
<h4 class="oclass_sub">Type: <b><?php echo $attrs['type']; ?></b></h4>
<?php if( isset( $attrs['is_obsolete'] ) && $attrs['is_obsolete'] == true ) { ?>
<h4 class="oclass_sub"><?php echo $lang['is_obsolete']; ?></h4>
<?php } ?>
<h4 class="oclass_sub"><?php echo $lang['inherits']; ?>: <b><?php
if( count( $attrs['sup'] ) == 0 )
echo "(" . $lang['none'] . ")";
else
foreach( $attrs['sup'] as $i => $object_class ) {
echo '<a title="' . $lang['jump_to_this_oclass'] . ' "
href="#' . strtolower( htmlspecialchars( $object_class ) );
echo '">' . htmlspecialchars( $object_class ) . '</a>';
if( $i < count( $attrs['sup'] ) - 1 )
echo ', ';
}
?></b></h4>
<table width="100%" class="schema_oclasses">
<tr>
<th width="50%"><b>Required Attributes</b></th>
<th width="50%"><b>Optional Attributes</b></th>
<th width="50%"><b><?php echo $lang['required_attrs']; ?></b></th>
<th width="50%"><b><?php echo $lang['optional_attrs']; ?></b></th>
</tr>
<tr>
<td>
<?php
if( count( $attrs['must_attrs'] ) > 0 ) {
<?php if( count( $attrs['must_attrs'] ) > 0 ) {
echo '<ul class="schema">';
foreach( $attrs['must_attrs'] as $attr )
echo "<li><a href=\"schema.php?server_id=$server_id&amp;view=attr&amp;attr=" .
rawurlencode( $attr ) . "\">" . htmlspecialchars($attr) . "</a></li>\n";
}
else
echo "<center>(none)</center>\n";
echo "<li><a href=\"schema.php?server_id=$server_id&amp;view=attributes#" .
strtolower( rawurlencode( $attr ) ). "\">" . htmlspecialchars($attr) . "</a></li>\n";
} else
echo "<center>(" . $lang['none'] . ")</center>\n";
?>
</ul>
</td>
<td width="50%">
<?php
if( count( $attrs['may_attrs'] ) > 0 ) {
echo '<ul class="schema">';
foreach( $attrs['may_attrs'] as $attr )
echo "<li><a href=\"schema.php?server_id=$server_id&amp;view=attr&amp;attr=" .
rawurlencode( $attr ) . "\">" . htmlspecialchars($attr) . "</a></li>\n";
echo "<li><a href=\"schema.php?server_id=$server_id&amp;view=attributes#" .
strtolower( rawurlencode( $attr ) ) . "\">" . htmlspecialchars($attr) . "</a></li>\n";
}
else
echo "<center>(none)</center>\n";
echo "<center>(" . $lang['none'] . ")</center>\n";
?>
</ul>
@ -219,7 +326,6 @@ include 'header.php';
<?php } /* End foreach objectClass */ ?>
<?php } /* End else (displaying objectClasses */ ?>
<?php } /* End else (schema _is_ available) */ ?>
</body>

910
schema_functions.php Normal file
View File

@ -0,0 +1,910 @@
<?php
/*
* Represents an LDAP objectClass
*/
class ObjectClass
{
/* This objectClass' OID, ie "2.16.840.1.113730.3.2.2" */
var $oid;
/* This objectClass' name, ie "inetOrgPerson" */
var $name;
/* This objectClass' description */
var $description;
/* array of objectClass names from which this objectClass inherits */
var $sup_classes;
/* one of STRUCTURAL, ABSTRACT, or AUXILIARY */
var $type;
/* arrays of attribute names that this objectClass requires */
var $must_attrs;
/* arrays of attribute names that this objectClass allows, but does not require */
var $may_attrs;
/* boolean value indicating whether this objectClass is obsolete */
var $is_obsolete;
/* Initialize the class' member variables */
function initVars()
{
$this->oid = null;
$this->name = null;
$this->description = null;
$this->sup_classes = array();
$this->type = null;
$this->must_attrs = array();
$this->may_attrs = array();
$this->is_obsolete = false;
}
/*
* Parses a raw LDAP objectClass string into this object's $this vars
*/
function ObjectClass( $raw_ldap_schema_string )
{
$this->initVars();
$class = $raw_ldap_schema_string;
$strings = preg_split ("/[\s,]+/", $class, -1,PREG_SPLIT_DELIM_CAPTURE);
for($i=0; $i<count($strings); $i++) {
switch($strings[$i]) {
case '(':
break;
case 'NAME':
if($strings[$i+1]!="(") {
do {
$i++;
if(strlen($this->name)==0)
$this->name = $strings[$i];
else
$this->name .= " " . $strings[$i];
}while(!preg_match("/\'$/s", $strings[$i]));
} else {
$i++;
do {
$i++;
if(strlen($this->name) == 0)
$this->name = $strings[$i];
else
$this->name .= " " . $strings[$i];
} while(!preg_match("/\'$/s", $strings[$i]));
do {
$i++;
}while($strings[$i]!=")");
}
break;
case 'DESC':
do {
$i++;
if(strlen($this->description)==0)
$this->description=$this->description . $strings[$i];
else
$this->description=$this->description . " " . $strings[$i];
}while(!preg_match("/\'$/s", $strings[$i]));
break;
case 'OBSOLETE':
$this->is_obsolete = TRUE;
break;
case 'SUP':
if($strings[$i+1]!="(") {
$i++;
array_push ($this->sup_classes, $strings[$i]);
}else{
$i++;
do {
$i++;
if($strings[$i]!="$")
array_push( $this->sup_classes, $strings[$i] );
}while($strings[$i+1]!=")");
}
break;
case 'ABSTRACT':
$this->type='abstract';
break;
case 'STRUCTURAL':
$this->type='structural';
break;
case 'AUXILIARY':
$this->type='auxiliary';
break;
case 'MUST':
if($strings[$i+1]!="(") {
$i++;
array_push ($this->must_attrs, $strings[$i]);
}else{
$i++;
do {
$i++;
if($strings[$i]!="$")
array_push ($this->must_attrs, $strings[$i]);
}while($strings[$i+1]!=")");
}
sort($this->must_attrs);
break;
case 'MAY':
if($strings[$i+1]!="(") {
$i++;
array_push ($this->may_attrs, $strings[$i]);
}else{
$i++;
do
{
$i++;
if($strings[$i]!="$")
array_push ($this->may_attrs, $strings[$i]);
}while($strings[$i+1]!=")");
}
sort($this->may_attrs);
break;
default:
if(preg_match ("/[\d\.]+/i",$strings[$i]))
$this->oid = $strings[$i];
}
}
$this->name = preg_replace("/^\'/", "", $this->name);
$this->name = preg_replace("/\'$/", "", $this->name);
$this->description = preg_replace("/^\'/", "", $this->description);
$this->description = preg_replace("/\'$/", "", $this->description);
}
/* Getters */
function getMustAttrs()
{
return $this->must_attrs;
}
function getMayAttrs()
{
return $this->may_attrs;
}
function getName()
{
return $this->name;
}
function getDescription()
{
return $this->description;
}
function getSupClasses()
{
return $this->sup_classes;
}
function getType()
{
return $this->type;
}
function getIsObsolete()
{
return $this->is_obsolete;
}
/*
* Adds the specified array of attributes to this objectClass' list of
* MUST attributes. The resulting array of must attributes will contain
* unique members.
*/
function addMustAttrs( $new_must_attrs )
{
if( ! is_array( $new_must_attrs ) )
return;
if( 0 == count( $new_must_attrs ) )
return;
$this->must_attrs = array_values( array_unique( array_merge( $this->must_attrs, $new_must_attrs ) ) );
}
/*
* Behaves identically to addMustAttrs, but it operates on the MAY
* attributes of this objectClass.
*/
function addMayAttrs( $new_may_attrs )
{
if( ! is_array( $new_may_attrs ) )
return;
if( 0 == count( $new_may_attrs ) )
return;
$this->may_attrs = array_values( array_unique( array_merge( $this->may_attrs, $new_may_attrs ) ) );
}
/*
* Returns an associative array of this objectClass.
* This exists for backwards compatibility for portions of PLA
* that have not yet been made aware of the new object oriented
* ObjectClass code.
*/
function toAssoc()
{
return array (
'oid' => $this->oid,
'name' => $this->name,
'description' => $this->description,
'sup' => $this->sup_classes,
'type' => $this->type,
'must_attrs' => $this->must_attrs,
'may_attrs' => $this->may_attrs,
'is_obsolete' => $this->is_obsolete );
}
}
/*
* Represents an LDAP AttributeType
*/
class AttributeType
{
/* The OID of this attributeType: ie, 1.2.3.4*/
var $oid;
/* The name of this attributeType */
var $name;
/* string: the description */
var $description;
/* boolean: is it obsoloete */
var $is_obsolete;
/* The attribute from which this attribute inherits (if any) */
var $sup_attribute;
/* The equality rule used */
var $equality;
/* The ordering of the attributeType */
var $ordering;
/* Boolean: supports substring matching? */
var $sub_str;
/* The full syntax string, ie 1.2.3.4{16} */
var $syntax;
/* boolean: is single valued only? */
var $is_single_value;
/* boolean: is collective? */
var $is_collective;
/* boolean: can use modify? */
var $is_no_user_modification;
/* The usage string set by the LDAP schema */
var $usage;
/* An array of alias attribute names, strings */
var $aliases;
/* The max number of characters this attribute can be */
var $max_length;
/* A string description of the syntax type (taken from the LDAPSyntaxes) */
var $type;
/* An array of objectClasses which use this attributeType (must be set by caller) */
var $used_in_object_classes;
/*
* Initialize the class' member variables
*/
function initVars()
{
$this->oid = null;
$this->name = null;
$this->description = null;
$this->is_obsolete = false;
$this->sup_attribute = null;
$this->equality = null;
$this->ordering = null;
$this->sub_str = null;
$this->syntax_oid = null;
$this->syntax = null;
$this->max_length = null;
$this->is_single_value= false;
$this->is_collective = false;
$this->is_no_user_modification = false;
$this->usage = null;
$this->aliases = array();
$this->type = null;
$this->used_in_object_classes = array();
}
/*
* Parses a raw LDAP objectClass string into this object's $this vars
*/
function AttributeType( $raw_ldap_attr_string )
{
//echo "<nobr>$raw_ldap_attr_string</nobr><Br />";
$this->initVars();
$attr = $raw_ldap_attr_string;
$strings = preg_split ("/[\s,]+/", $attr, -1,PREG_SPLIT_DELIM_CAPTURE);
for($i=0; $i<count($strings); $i++) {
switch($strings[$i]) {
case '(':
break;
case 'NAME':
if($strings[$i+1]!="(") {
do {
$i++;
if(strlen($this->name)==0)
$this->name = $strings[$i];
else
$this->name .= " " . $strings[$i];
}while(!preg_match("/\'$/s", $strings[$i]));
// this attribute has no aliases
$this->aliases = array();
} else {
$i++;
do {
$i++;
if(strlen($this->name) == 0)
$this->name = $strings[$i];
else
$this->name .= " " . $strings[$i];
} while(!preg_match("/\'$/s", $strings[$i]));
// add alias names for this attribute
while($strings[++$i]!=")") {
$alias = $strings[$i];
$alias = preg_replace("/^\'/", "", $alias );
$alias = preg_replace("/\'$/", "", $alias );
$this->aliases[] = $alias;
}
}
break;
case 'DESC':
do {
$i++;
if(strlen($this->description)==0)
$this->description=$this->description . $strings[$i];
else
$this->description=$this->description . " " . $strings[$i];
}while(!preg_match("/\'$/s", $strings[$i]));
break;
case 'OBSOLETE':
$this->is_obsolete = TRUE;
break;
case 'SUP':
$i++;
$this->sup_attribute = $strings[$i];
break;
case 'EQUALITY':
$i++;
$this->equality = $strings[$i];
break;
case 'ORDERING':
$i++;
$this->ordering = $strings[$i];
break;
case 'SUBSTR':
$i++;
$this->sub_str = $strings[$i];
break;
case 'SYNTAX':
$i++;
$this->syntax = $strings[$i];
$this->syntax_oid = preg_replace( "/{\d+}$/", "", $this->syntax );
// does this SYNTAX string specify a max length (ie, 1.2.3.4{16})
if( preg_match( "/{(\d+)}$/", $this->syntax, $this->max_length ) )
$this->max_length = $this->max_length[1];
else
$this->max_length = null;
if($strings[$i+1]=="{") {
do {
$i++;
$this->name .= " " . $strings[$i];
} while($strings[$i]!="}");
}
break;
case 'SINGLE-VALUE':
$this->is_single_value = TRUE;
break;
case 'COLLECTIVE':
$this->is_collective = TRUE;
break;
case 'NO-USER-MODIFICATION':
$this->is_no_user_modification = TRUE;
break;
case 'USAGE':
$i++;
$this->usage = $strings[$i];
break;
default:
if(preg_match ("/[\d\.]+/i",$strings[$i]))
$this->oid = $strings[$i];
}
}
$this->name = preg_replace("/^\'/", "", $this->name);
$this->name = preg_replace("/\'$/", "", $this->name);
$this->description = preg_replace("/^\'/", "", $this->description);
$this->description = preg_replace("/\'$/", "", $this->description);
}
/* Getters */
function getOID()
{
return $this->oid;
}
function getName()
{
return $this->name;
}
function getDescription()
{
return $this->description;
}
function getIsObsolete()
{
return $this->is_obsolete;
}
function getUsage()
{
return $this->usage;
}
function getSupAttribute()
{
return $this->sup_attribute;
}
function getEquality()
{
return $this->equality;
}
function getOrdering()
{
return $this->ordering;
}
function getSubstr()
{
return $this->sub_str;
}
function getAliases()
{
return $this->aliases;
}
/*
* Returns the entire raw syntax string for this attr, for example: 1.2.3.4{16}
*/
function getSyntaxString()
{
return $this->syntax;
}
/*
* Differs from getSyntaxString() in that it only returns the actual OID with any length
* specification removed. Ie, if the syntax string is 1.2.3.4{16}, this retruns
* 1.2.3.4.
*/
function getSyntaxOID()
{
return $this->syntax_oid;
}
/*
* Returns the maximum length specified by this attribute (ie, "16" in 1.2.3.4{16})
*/
function getMaxLength()
{
return $this->max_length;
}
function getIsSingleValue()
{
return $this->is_single_value;
}
function getIsCollective()
{
return $this->is_collective;
}
function getIsNoUserModification()
{
return $this->is_no_user_modification;
}
function getType()
{
return $this->type;
}
/*
* Removes an attribute name from the alias array.
*/
function removeAlias( $remove_alias_name )
{
foreach( $this->aliases as $i => $alias_name ) {
if( 0 == strcasecmp( $alias_name, $remove_alias_name ) ) {
unset( $this->aliases[ $i ] );
$this->aliases = array_values( $this->aliases );
return true;
}
}
return false;
}
/*
* Adds an attribute name to the alias array.
*/
function addAlias( $new_alias_name )
{
$this->aliases[] = $new_alias_name;
}
function setName( $new_name )
{
$this->name = $new_name;
}
function setDescription( $new_desc )
{
$this->description = $new_desc;
}
function setSupAttribute( $new_sup_attr )
{
$this->sup_attribute = $new_sup_attr;
}
function setAliases( $new_aliases )
{
$this->aliases = $new_aliases;
}
function setType( $new_type )
{
$this->type = $new_type;
}
function addUsedInObjectClass( $object_class_name )
{
if( ! in_array( $object_class_name, $this->used_in_object_classes ) ) {
$this->used_in_object_classes[] = $object_class_name;
}
}
function getUsedInObjectClasses()
{
return $this->used_in_object_classes;
}
}
/*
* Returns an associative array of objectClasses for the specified
* $server_id. Each array entry's key is the name of the objectClass
* in lower-case.
* The sub-entries consist of sub-arrays called 'must_attrs' and
* 'may_attrs', and sub-entries called 'oid', 'name' and 'description'.
*
* The bulk of this function came from the good code in the
* GPL'ed LDAP Explorer project. Thank you.
*/
function get_schema_objectclasses( $server_id )
{
// cache the schema to prevent multiple schema fetches from LDAP server
static $cache = array();
if( isset( $cache[$server_id] ) ) {
//echo "Using oclass cache.<br />";
return $cache[$server_id];
}
$ds = pla_ldap_connect( $server_id );
if( ! $ds )
return false;
// try with the standard DN
$result = @ldap_read($ds, 'cn=subschema', '(objectClass=*)',
array( 'objectclasses' ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( ! $result )
// try again, with a different schema DN
$result = @ldap_read($ds, 'cn=schema', '(objectClass=*)',
array( 'objectclasses' ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( ! $result )
// give up
return false;
$raw_oclasses = @ldap_get_entries($ds,$result );
// build the array of objectClasses
$object_classes = array();
for( $i=0; $i < $raw_oclasses[0]['objectclasses']['count']; $i++ ) {
$class_string = $raw_oclasses[0]["objectclasses"][$i];
if( $class_string == null || 0 == strlen( $class_string ) )
continue;
$object_class = new ObjectClass( $class_string );
$name = $object_class->getName();
$key = strtolower( $name );
$object_classes[ $key ] = $object_class->toAssoc();
}
// go back and add any inherited MUST/MAY attrs to each objectClass
foreach( $object_classes as $name => $object_class ) {
$sup_classes = $object_class['sup'];
$must = $object_class['must_attrs'];
$may = $object_class['may_attrs'];
foreach( $sup_classes as $sup_class )
add_sup_class_attrs( $name, $sup_class, $object_classes, $must, $may );
$object_classes[ $name ][ 'must_attrs' ] = $must;
$object_classes[ $name ][ 'may_attrs' ] = $may;
}
ksort( $object_classes );
// cache the schema to prevent multiple schema fetches from LDAP server
$cache[ $server_id ] = $object_classes;
return( $object_classes );
}
/*
* Helper function for get_schema_objectclasses. This is a recursive function that
* will add MUST and MAY attributes based on an objectclas' inherited objectclasses.
*/
function add_sup_class_attrs( $oclass, $sup_class, &$oclasses, &$must_attrs, &$may_attrs )
{
//echo "add_sup_class_attrs( $oclass, $sup_class )<br />";
// base cases
if( 0 == strcasecmp( $sup_class, 'top' ) ) return;
if( ! isset( $oclasses[ strtolower( $sup_class ) ] ) ) return;
// recursive case
$new_must = $oclasses[ strtolower( $sup_class ) ]['must_attrs'];
$new_may = $oclasses[ strtolower( $sup_class ) ]['may_attrs'];
$must_attrs = array_unique( array_merge( $new_must, $must_attrs ) );
$may_attrs = array_unique( array_merge( $new_may, $may_attrs ) );
$sup_classes = $oclasses[ strtolower( $sup_class ) ]['sup'];
if( is_array( $sup_classes ) && count( $sup_classes ) > 0 )
foreach( $sup_classes as $sup_sup_class )
add_sup_class_attrs( $sup_class, $sup_sup_class, $oclasses, $must_attrs, $may_attrs );
}
/*
* Retrieves the schema for a single attribute.
*/
function get_schema_attribute( $server_id, $attr_name )
{
$attr_name = preg_replace( "/;.*$/U", "", $attr_name );
$schema_attrs = get_schema_attributes( $server_id );
$attr_name = strtolower( $attr_name );
$schema_attr = isset( $schema_attrs[ $attr_name ] ) ?
$schema_attrs[ $attr_name ] :
null;
return $schema_attr;
}
/*
* Returns an associative array of attributes for the specified
* $server_id. Each array entry's key is the name of the attribute,
* in lower-case.
* The sub-entries are 'oid', 'syntax', 'equality', 'substr', 'name',
* and 'single_value'.
*
* The bulk of this function came from the good code in the
* GPL'ed LDAP Explorer project. Thank you. It was extended
* considerably for application here.
*/
function get_schema_attributes( $server_id, $lower_case_keys = false )
{
// Cache gets filled in later (bottom). each subsequent call uses
// the cache which has the attributes already fetched and parsed
static $cache = null;
if( isset( $cache[ $server_id ] ) ) {
//echo "Using attr cache<br />";
return $cache[ $server_id ];
}
$ds = pla_ldap_connect( $server_id );
if( ! $ds )
return false;
// get all the attributeTypes
$result = @ldap_read($ds, 'cn=subschema', '(objectClass=*)',
array( 'attributeTypes' ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( ! $result )
$result = @ldap_read($ds, 'cn=schema', '(objectClass=*)',
array( 'attributeTypes' ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( $result )
$raw_attrs = ldap_get_entries( $ds, $result );
else
$raw_attrs = array();
$syntaxes = get_schema_syntaxes( $server_id );
// build the array of attribueTypes
$attrs = array();
for( $i=0; $i < $raw_attrs[0]['attributetypes']['count']; $i++ ) {
$attr_string = $raw_attrs[0]['attributetypes'][$i];
if( $attr_string == null || 0 == strlen( $attr_string ) )
continue;
$attr = new AttributeType( $attr_string );
if( isset( $syntaxes[ $attr->getSyntaxOID() ] ) )
$attr->setType( $syntaxes[ $attr->getSyntaxOID() ]['description'] );
$name = $attr->getName();
$key = strtolower( $name );
$attrs[ $key ] = $attr;
}
add_aliases_to_attrs( $attrs );
add_sup_to_attrs( $attrs );
ksort( $attrs );
// cache the schema to prevent multiple schema fetches from LDAP server
$cache[ $server_id ] = $attrs;
return( $attrs );
}
/*
* For each attribute that has multiple names, this function adds unique entries to
* the attrs array for those names. Ie, attributeType has name 'gn' and 'givenName'.
* This function will create a unique entry for 'gn' and 'givenName'.
*/
function add_aliases_to_attrs( &$attrs )
{
// go back and add data from aliased attributeTypes
foreach( $attrs as $name => $attr ) {
$aliases = $attr->getAliases();
if( is_array( $aliases ) && count( $aliases ) > 0 ) {
// foreach of the attribute's aliases, create a new entry in the attrs array
// with its name set to the alias name, and all other data copied
foreach( $aliases as $i => $alias_attr_name ) {
$new_attr = $attr;
$new_attr->setName( $alias_attr_name );
$new_attr->addAlias( $attr->getName() );
$new_attr->removeAlias( $alias_attr_name );
$new_attr_key = strtolower( $alias_attr_name );
$attrs[ $new_attr_key ] = $new_attr;
}
}
}
}
/*
* Adds inherited values to each attributeType specified by the SUP directive.
* Supports infinite levels of inheritance.
*/
function add_sup_to_attrs( &$attrs )
{
// go back and add any inherited descriptions from parent attributes (ie, cn inherits name)
foreach( $attrs as $key => $attr ) {
$sup_attr = $attr->getSupAttribute();
while( $sup_attr != null ) {
if( ! isset( $attrs[ strtolower( $sup_attr ) ] ) ){
pla_error( "Warning: attributeType '" . $attr->getName() . "' inherits from
'" . $sup_attr . "', but attributeType '" . $sup_attr . "' does not
exist." );
return;
}
$sup_attr = $attrs[ strtolower( $sup_attr ) ];
// if the inhertied attriute does not inherit any furth attributes,
// copy its values and move on to the next attributeType
if( null == $sup_attr->getSupAttribute() ) {
// only three values are allowed to be set when an attributeType SUPs another
// attributeType: NAME, DESC, and SUP
$tmp_name = $attr->getName();
$tmp_desc = $attr->getDescription();
$tmp_sup = $attr->getSupAttribute();
$tmp_aliases = $attr->getAliases();
$attr = $sup_attr;
$attr->setName( $tmp_name );
$attr->setDescription( $tmp_desc );
$attr->setSupAttribute( $tmp_sup);
$attr->setAliases( $tmp_aliases );
// replace this attribute in the attrs array now that we have populated
// new values therein
$attrs[$key] = $attr;
$sup_attr = null;
} else {
// set the sup_attr to the name of the attributeType from which
// this attributeType inherits and move up the inheritance chain.
$sup_attr = $sup_attr->getSupAttribute();
}
}
}
}
/*
* Returns an associate array of the server's schema matching rules
*/
function get_schema_matching_rules( $server_id )
{
static $cache;
// cache the schema to prevent multiple schema fetches from LDAP server
if( isset( $cache[$server_id] ) ) {
//echo "Using matching rules cache.<br />";
return $cache[$server_id];
}
$ds = pla_ldap_connect( $server_id );
if( ! $ds )
return false;
// get all the attributeTypes
$result = @ldap_read($ds, 'cn=subschema', '(objectClass=*)',
array( 'matchingRules', 'matchingRuleUse' ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( ! $result )
$result = @ldap_read($ds, 'cn=schema', '(objectClass=*)',
array( 'matchingRules', 'matchingRuleUse' ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( $result )
$raw = ldap_get_entries( $ds, $result );
else
return( array() );
// build the array of attributes
$rules = array();
for( $i=0; $i < $raw[0]['matchingrules']['count']; $i++ )
{
$rule = $raw[0]['matchingrules'][$i];
preg_match( "/[\s]+([\d\.]+)[\s]+/", $rule, $oid);
preg_match( "/[\s]+NAME[\s]+'([\)\(:?\.a-zA-Z0-9\-_ ]+)'/", $rule, $name );
$key = strtolower( trim( $oid[1] ) );
if( ! $key ) continue;
$rules[$key] = $name[1];
//$rules[$key]['name'] = $name[1];
}
ksort( $rules );
// cache the schema to prevent multiple schema fetches from LDAP server
$cache[$server_id] = $rules;
return $rules;
}
/*
* Returns an associate array of the syntax OIDs that this LDAP server uses mapped to
* their descriptions.
*/
function get_schema_syntaxes( $server_id )
{
static $cache;
// cache the schema to prevent multiple schema fetches from LDAP server
if( isset( $cache[$server_id] ) ) {
//echo "Using syntax cache.<br />";
return $cache[$server_id];
}
$ds = pla_ldap_connect( $server_id );
if( ! $ds )
return false;
// get all the attributeTypes
$result = @ldap_read($ds, 'cn=subschema', '(objectClass=*)',
array( 'ldapSyntaxes' ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( ! $result )
$result = @ldap_read($ds, 'cn=schema', '(objectClass=*)',
array( 'ldapSyntaxes' ), 0, 200, 0, LDAP_DEREF_ALWAYS );
if( $result )
$raw = ldap_get_entries( $ds, $result );
else
return( array() );
// build the array of attributes
$syntaxes = array();
for( $i=0; $i < $raw[0]['ldapsyntaxes']['count']; $i++ )
{
$syntax = $raw[0]['ldapsyntaxes'][$i];
preg_match( "/[\s]+([\d\.]+)[\s]+/", $syntax, $oid);
preg_match( "/[\s]+DESC[\s]+'([\)\(:?\.a-zA-Z0-9\-_ ]+)'/", $syntax, $description );
$key = strtolower( trim( $oid[1] ) );
if( ! $key ) continue;
$syntaxes[$key] = array();
$syntaxes[$key]['description'] = $description[1];
}
ksort( $syntaxes );
// cache the schema to prevent multiple schema fetches from LDAP server
$cache[$server_id] = $syntaxes;
return $syntaxes;
}
?>

View File

@ -13,8 +13,7 @@
* - base_dn, scope, filter
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$server_id = $_GET['server_id'];
@ -27,25 +26,33 @@ else
{
check_server_id( $server_id ) or pla_error( "Bad server_id: " . var_dump( htmlspecialchars( $server_id ) ) );
}
$js_on_change_string ='';
if( $_GET['form'] == 'advanced' ) {
$js_on_change_string = 'onChange="document.forms[0].base_dn.value=servers[document.forms[0].server_id.value].getBaseDn()"';
}
// build the server drop-down html and JavaScript array (for base_dns)
$server_menu_html = '<select name="server_id" onChange="base_dn.value = server_base_dns[ this.value ]">';
$js_dn_list = '';
$server_menu_html = '<select name="server_id" '.$js_on_change_string.'>';
$server_info_list =array();
foreach( $servers as $id => $server ) {
$base_dn = $server['base'] ? $server['base'] : try_to_get_root_dn( $id );
$js_dn_list .= '"' . $server['base'] . '",';
$server_info_list[$id]['id'] = $id;
$server_info_list[$id]['name'] = $server['name'];
$server_info_list[$id]['base_dn'] = $base_dn;
if( $server['host'] ) {
$server_menu_html .= '<option value="'.$id.'"' . ( $id==$server_id? ' selected' : '' ) . '>';
$server_menu_html .= $server['name'] . '</option>';
}
}
// trim off the trailing comma
$js_dn_list = substr( $js_dn_list, 0, strlen($js_dn_list)-1 );
$server_menu_html .= '</select>';
$filter = stripslashes( $_GET['filter'] );
$filter = $_GET['filter'];
$filter = utf8_encode($filter);
$attr = stripslashes( $_GET['attribute'] );
$attr = $_GET['attribute'];
// grab the base dn for the search
if( isset( $_GET['base_dn'] ) )
@ -55,8 +62,8 @@ elseif( '' != $servers[$server_id]['base'] )
else
$base_dn = try_to_get_root_dn( $server_id );
$criterion = stripslashes( $_GET['criterion'] );
$form = stripslashes( $_GET['form'] );
$criterion = $_GET['criterion'];
$form = $_GET['form'];
$scope = $_GET['scope'] ? $_GET['scope'] : 'sub';
//echo "<PRE>";print_r( $_GET );echo "</pre>";
?>
@ -88,7 +95,7 @@ if( $_GET['search'] )
if( $form == 'advanced' ) {
$search_result_attributes = isset( $_GET['display_attrs'] ) ?
stripslashes( $_GET['display_attrs'] ) :
$_GET['display_attrs'] :
$search_result_attributes;
process_config();
}
@ -117,12 +124,22 @@ if( $_GET['search'] )
{
switch( $criterion ) {
case 'starts with':
// to fix bug 789113
if( $filter == "*" )
$filter = "";
$filter = "($attr=$filter*)";
break;
case 'contains':
// to fix bug 789113
if( $filter == "*" )
$filter = "($attr=*)";
else
$filter = "($attr=*$filter*)";
break;
case 'ends with':
// to fix bug 789113
if( $filter == "*" )
$filter = "";
$filter = "($attr=*$filter)";
break;
case 'equals':
@ -139,12 +156,11 @@ if( $_GET['search'] )
}
$time_start = utime();
$results = pla_ldap_search( $server_id, $filter, $base_dn,
array_merge( $search_result_attributes, array( $search_result_title_attribute ) ),
$scope );
$results = pla_ldap_search( $server_id, $filter, $base_dn, $search_result_attributes, $scope );
$time_end = utime();
$time_elapsed = round( $time_end - $time_start, 2 );
$count = count( $results );
?>
<br />
@ -159,25 +175,27 @@ if( $_GET['search'] )
<?php flush(); ?>
<?php if( $results ) foreach( $results as $dn => $attrs ) { ?>
<?php $encoded_dn = rawurlencode($attrs['dn']); ?>
<?php $rdn = utf8_decode( get_rdn( $attrs['dn'] ) ); ?>
<?php $encoded_dn = rawurlencode( $dn ); ?>
<?php $rdn = utf8_decode( get_rdn( $dn ) ); ?>
<div class="search_result">
<a href="edit.php?server_id=<?php echo $server_id; ?>&amp;dn=<?php echo $encoded_dn; ?>">
<?php echo htmlspecialchars($rdn); ?>
</a>
</div>
<table class="attrs">
<?php if( is_array( $search_result_attributes ) ) foreach( $search_result_attributes as $attr ) { ?>
<?php foreach( $attrs as $attr => $values ) { ?>
<tr>
<td class="attr" valign="top"><?php echo htmlspecialchars( $attr ); ?></td>
<td class="val">
<?php if( is_array( $attrs[strtolower($attr)] ) ) { ?>
<?php foreach( $attrs[strtolower($attr)] as $a ) { ?>
<?php echo str_replace( ' ', '&nbsp;', htmlspecialchars(utf8_decode($a))); ?><br />
<?php if( is_array( $values ) ) { ?>
<?php foreach( $values as $value ) { ?>
<?php echo str_replace( ' ', '&nbsp;',
htmlspecialchars( utf8_decode( $value ) ) ); ?><br />
<?php } ?>
<?php } else { ?>
<?php echo str_replace( ' ', '&nbsp;', htmlspecialchars(utf8_decode($attrs[strtolower($attr)]))); ?>
<?php echo str_replace( ' ', '&nbsp;',
htmlspecialchars( utf8_decode( $values ) ) ); ?>
<?php } ?>
</td>
</tr>
@ -188,7 +206,7 @@ if( $_GET['search'] )
<?php } ?>
<br /><br />
<div class="search_result"><center><span style="font-weight:normal;font-size:75%;">Search happily performed by phpLDAPAdmin in
<div class="search_result"><center><span style="font-weight:normal;font-size:75%;">Search happily performed by phpLDAPadmin in
<b><?php echo $time_elapsed; ?></b> seconds.</small></center></div>
<?php
}

View File

@ -1,9 +1,20 @@
<script>
<?
$num_server = count($server_info_list);
for($i=0;$i<$num_server;$i++){
?>
addToServersList(new server(<?=$i?>,"<?=$server_info_list[$i]['name']?>","<?=$server_info_list[$i]['base_dn']?>"));
<?
}
?>
</script>
<form action="search.php" method="get" class="search">
<input type="hidden" name="search" value="true" />
<input type="hidden" name="form" value="advanced" />
<center><b>Advanced Search Form</b></center>
<small>(<a href="search.php?server_id=<?php echo $server_id; ?>&amp;form=simple">Simple Search Form</a>)</small><br />
<center><b><?php echo $lang['advanced_search_form_str']; ?></b></center>
<small>(<a href="search.php?server_id=<?php echo $server_id; ?>&amp;form=simple"><?php echo $lang['simple_search_form_str']; ?></a>)</small><br />
<br />
<table>

View File

@ -5,8 +5,8 @@
<table>
<td>
<center><b>Simple Search Form</b><br />
<small>(<a href="search.php?server_id=<?php echo $server_id; ?>&amp;form=advanced">Advanced Search Form</a>)</small><br />
<center><b><?php echo $lang['simple_search_form_str']; ?></b><br />
<small>(<a href="search.php?server_id=<?php echo $server_id; ?>&amp;form=advanced"><?php echo $lang['advanced_search_form_str']; ?></a>)</small><br />
<br />
</center>
@ -24,7 +24,11 @@
</select>
<select name="criterion">
<?php foreach( $search_criteria_options as $c ) { ?>
<?php
$search_criteria_options = array( "equals", "starts with", "contains", "ends with", "sounds like" );
foreach( $search_criteria_options as $c ) { ?>
<option value="<?php echo $c; ?>"<?php echo $c==$criterion?' selected':''; ?>>
<?php echo htmlspecialchars($c); ?>
</option>

76
search_util.js Normal file
View File

@ -0,0 +1,76 @@
// File: search_util.js
// Purpose:
// This JavaScript file defines some functions used by the two search forms for
// auto-populating the base DN dynamically when a server is selected from the
// drop-down.
//
//the array to store the server
var servers = new Array();
//---------------------------------------------------------------------
// Definition of the object server
//---------------------------------------------------------------------
//constructor of the server
//param id the id of the server
//param name the name of the server
//param base_dn the base dn of the server
function server(id,name,base_dn){
//the properties of the object
this.id =id;
this.name = name;
this.base_dn = base_dn;
// the method of the server
this.getId=getId;
this.setId=setId;
this.getName = getName;
this.setName = setName;
this.setBaseDn = setBaseDn;
this.getBaseDn = getBaseDn;
}
// set the id of the server
function setId(id){
this.id = id;
}
//return the id of the server
function getId(){
return this.id;
}
// set the name of the server
function setName(name){
this.name = name;
}
// return the name of the server
function getName(){
return this.name;
}
// return the base dn of the server
function getBaseDn(){
return this.base_dn;
}
// set the base dn of the server
function setBaseDn(base_dn){
this.base_dn = base_dn;
}
//-----------------------------------------------------------------------
// End of the definition of the server
//-----------------------------------------------------------------------
// add a server object to the array of server
function addToServersList(obj_server){
servers[servers.length] = obj_server;
}

View File

@ -8,8 +8,7 @@
* - server_id
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
$server_id = $_GET['server_id'];
$server_name = $servers[$server_id]['name'];

View File

@ -1,17 +1,29 @@
table.schema_oclasses {
border-left: 1px solid black;
border-right: 1px solid black;
border-bottom: 1px solid black;
border-top: 0;
margin-bottom: 10px;
background-color: #eee;
}
table.schema_oclasses td {
vertical-align: top;
text-align: left;
padding-left: 5px;
}
table.schema_attr th {
background-color: #016;
padding: 5px;
color: white;
font-weight: normal;
font-weight: bold;
font-size: 125%;
}
table.schema_attr td {
padding: 5px;
vertical-align: top;
}
table.schema_attr tr.even {
@ -22,13 +34,32 @@ table.schema_attr tr.odd {
background-color: #ccc;
}
div.error {
background-color: #eec;
border: solid black 1px;
padding: 15px;
padding-top: 0px;
width: 380px;
table.schema_attr tr.highlight{
background-color: #bcd;
font-weight: Bold;
}
table.error {
width: 500px;
border: 2px solid black;
}
table.error tr td {
vertical-align: top;
text-align: left;
padding: 15px;
border: 0px;
}
table.error tr td h2 {
margin: 5px;
margin-bottom: 20px;
}
table.error tr td.img {
vertical-align: center;
text-align: center;
width: 20px;
}
table.confirm th {
@ -79,6 +110,20 @@ body {
font-size: 12pt;
}
table.tree tr.login td {
}
table.tree td.links {
padding: 0px;
font-size: 10px;
padding-left: 12px;
font-size: 10px;
}
table.tree td.links a {
font-size: 10px;
}
table.tree {
border: 0px;
}
@ -95,14 +140,27 @@ table.tree td {
table.tree tr {
}
table.tree tr.server {
table.tree tr.server td.icon {
width: 14px;
}
table.tree tr.server td {
padding-top: 15px;
padding-bottom: 0px;
vertical-align: top;
font-size: 20px;
text-align: left;
}
table.tree td.icon {
text-align: center;
padding: 0px;
width: 22px;
width: 14px;
font-size: 1px;
}
table.tree td.rdn {
width: 500px;
}
table.tree td.rdn a {
@ -115,6 +173,9 @@ table.tree td.rdn a:hover {
color: blue;
}
table.tree td.create {
}
table.tree td.create a {
text-decoration: none;
color: black;
@ -133,6 +194,7 @@ table.tree td.spacer {
table.tree td.expander {
text-align: center;
width: 22px;
max-width: 22px;
min-width: 22px;
}
@ -167,7 +229,7 @@ h3.subtitle {
}
table.edit_dn tr.spacer td {
height: 20px;
height: 10px;
}
table.edit_dn {
@ -200,6 +262,7 @@ table.edit_dn tr td.val {
vertical-align: center;
}
/* When an attr is updated, it is displayed in light blue to indicate such */
table.edit_dn tr.updated_attr {
background: #def;
}
@ -210,6 +273,12 @@ table.edit_dn tr.updated_attr td {
color: #005;
}
/* Neede to prevent sub-tables (like the one in which jpegPhotos are displayed)
* from drawing borders as well. */
table.edit_dn tr.updated_attr td table td {
border: 0px;
}
table.edit_dn tr.updated_attr a {
}
@ -239,7 +308,7 @@ form.edit_dn {
}
h4.oclass {
background: #88b;
background: #016;
padding: 5px;
margin: 0px;
margin-top: 8px;

View File

@ -1,14 +1,14 @@
<?php
require 'config.php';
require 'common.php';
// Common to all templates
$rdn = stripslashes( $_POST['rdn'] );
$container = stripslashes( $_POST['container'] );
$rdn = isset( $_POST['rdn'] ) ? $_POST['rdn'] : null;
$container = $_POST['container'];
$server_id = $_POST['server_id'];
// Unique to this template
$step = $_POST['step'];
$step = isset( $_POST['step'] ) ? $_POST['step'] : null;
if( ! $step )
$step = 1;
@ -74,20 +74,30 @@ if( $step == 2 )
// build a list of required attributes:
$dn = $rdn . ',' . $container;
$schema = get_schema( $server_id );
$attrs = $schema['attrs'];
//$attrs = get_schema_attributes( $server_id );
$schema_oclasses = get_schema_objectclasses( $server_id );
$required_attrs = array();
$all_attrs = array();
foreach( $oclasses as $oclass ) {
$required_attrs = array_merge( $required_attrs, $schema['oclasses'][strtolower($oclass)]['must_attrs'] );
$all_attrs = array_merge( $all_attrs, $schema['oclasses'][strtolower($oclass)]['must_attrs'],
$schema['oclasses'][strtolower($oclass)]['may_attrs'] );
$required_attrs = array_merge( $required_attrs, $schema_oclasses[strtolower($oclass)]['must_attrs'] );
$all_attrs = array_merge( $all_attrs, $schema_oclasses[strtolower($oclass)]['must_attrs'],
$schema_oclasses[strtolower($oclass)]['may_attrs'] );
}
$required_attrs = array_unique( $required_attrs );
$all_attrs = array_unique( $all_attrs );
sort( $required_attrs );
sort( $all_attrs );
// remove binary attributes and add them to the binary_attrs array
$binary_attrs = array();
foreach( $all_attrs as $i => $attr_name ) {
if( is_attr_binary( $server_id, $attr_name ) ) {
unset( $all_attrs[ $i ] );
$binary_attrs[] = $attr_name;
}
}
$attr_select_html = "";
foreach( $all_attrs as $a ) {
// is there a user-friendly translation available for this attribute?
@ -98,8 +108,21 @@ if( $step == 2 )
$attr_display = htmlspecialchars( $a );
}
echo $attr_display;
$attr_select_html .= "<option>$attr_display</option>\n";
$attr_select_html .= "<option value=\"$a\">$attr_display</option>\n";
}
$binary_select_html = "";
if( count( $binary_attrs ) > 0 ) {
foreach( $binary_attrs as $a ) {
if( isset( $friendly_attrs[ strtolower( $a ) ] ) ) {
$attr_display = htmlspecialchars( $friendly_attrs[ strtolower( $a ) ] ) . " (" .
htmlspecialchars( $a ) . ")";
} else {
$attr_display = htmlspecialchars( $a );
}
$binary_attr_select_html .= "<option>$attr_display</option>\n";
}
}
// add the required attribute based on the RDN provided by the user
@ -107,29 +130,19 @@ if( $step == 2 )
// in the list of required attributes.
$rdn_attr = trim( substr( $rdn, 0, strpos( $rdn, '=' ) ) );
$rdn_value = trim( substr( $rdn, strpos( $rdn, '=' ) + 1 ) );
if( ! in_array( $rdn_attr, $required_attrs ) )
if( in_array( $rdn_attr, $all_attrs ) && ! in_array( $rdn_attr, $required_attrs ) )
$required_attrs[] = $rdn_attr;
?>
<h4>Step 2 of 2: Specify attributes and values</h4>
<table>
<tr>
<td style="padding-right:10px">
<small>Creating entry with <acronym title="Distinguished Name">DN</acronym>:
<b><?php echo htmlspecialchars( $dn ); ?></b></small></td>
<small><b>Instructions</b>:
Enter values for the <?php echo count($required_attrs); ?> required attributes.<br/>
Then specify any optional attributes. <?php if( count( $binary_attrs ) > 0 ) { ?>
Finally, you may<br />specify optional binary attributes from a file if needed. <?php } ?>
</small>
<td>
<small><b>Instrucions</b>: Enter values for the <?php echo count($required_attrs); ?>
required attributes. Then create any optional attributes. You
can specify multi-valued attributes as well.</small><br />
</td>
</tr>
</table>
<form action="create.php" method="post">
<form action="create.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="step" value="2" />
<input type="hidden" name="new_dn" value="<?php echo htmlspecialchars( $dn ); ?>" />
<input type="hidden" name="new_rdn" value="<?php echo htmlspecialchars( $rdn ); ?>" />
@ -139,7 +152,11 @@ if( $step == 2 )
<table class="edit_dn" cellspacing="0">
<tr><th colspan="2">Required Attributes</th></tr>
<?php foreach( $required_attrs as $count => $attr ) { ?>
<?php if( count( $required_attrs ) == 0 ) {
echo "<tr class=\"row1\"><td colspan=\"2\"><center>(none)</center></td></tr>\n";
} else
foreach( $required_attrs as $count => $attr ) { ?>
<?php if( $count % 2 == 0 ) { ?>
<tr class="row1">
<?php } else { ?>
@ -158,7 +175,7 @@ if( $step == 2 )
echo $attr_display;
?></b></td>
<td class="val"><input type="text"
<td class="val"><input type="<?php echo (is_attr_binary( $server_id, $attr ) ? "file" : "text"); ?>"
name="required_attrs[<?php echo htmlspecialchars($attr); ?>]"
value="<?php echo $attr == $rdn_attr ? $rdn_value : '' ?>" size="40" />
</tr>
@ -166,7 +183,10 @@ if( $step == 2 )
<tr><th colspan="2">Optional Attributes</th></tr>
<?php for($i=0; $i<10; $i++ ) { ?>
<?php if( count( $all_attrs ) == 0 ) { ?>
<tr class="row1"><td colspan="2"><center>(none)</center></td></tr>
<?php } else { ?>
<?php for($i=0; $i<min( count( $all_attrs ), 10 ); $i++ ) { ?>
<?php if( $i % 2 == 0 ) { ?>
<tr class="row1">
<?php } else { ?>
@ -176,6 +196,20 @@ if( $step == 2 )
<td class="val"><input type="text" name="vals[<?php echo $i; ?>]" value="" size="40" />
</tr>
<?php } ?>
<?php } ?>
<?php if( count( $binary_attrs ) > 0 ) { ?>
<tr><th colspan="2">Optional Binary Attributes</th></tr>
<?php for( $k=$i; $k<$i+count($binary_attrs); $k++ ) { $attr = $binary_attrs[$k]; ?>
<?php if( $i % 2 == 0 ) { ?>
<tr class="row1">
<?php } else { ?>
<tr class="row2">
<?php } ?>
<td class="attr"><select name="attrs[<?php echo $k; ?>]"><?php echo $binary_attr_select_html;?></select></td>
<td class="val"><input type="file" name="vals[<?php echo $k; ?>]" value="" size="40" />
<?php } ?>
<?php } ?>
</table>
<center>

View File

@ -1,12 +1,12 @@
<?php
require 'config.php';
require 'common.php';
// customize this to your needs
$default_container = "ou=Addresses";
// Common to all templates
$container = stripslashes( $_POST['container'] );
$container = $_POST['container'];
$server_id = $_POST['server_id'];
// Unique to this template
@ -65,8 +65,10 @@ function autoFillCommonName( form )
<td><img src="images/uid.png" /></td>
<td class="heading">Name:</td>
<td>
<input type="text" name="first_name" id="first_name" value="first" onChange="autoFillCommonName(this.form)" />
<input type="text" name="last_name" id="last_name" value="last" onChange="autoFillCommonName(this.form)" />
<input type="text" name="first_name"
id="first_name" value="first" onChange="autoFillCommonName(this.form)" />
<input type="text" name="last_name"
id="last_name" value="last" onChange="autoFillCommonName(this.form)" />
</td>
</tr>
<tr>
@ -136,18 +138,18 @@ function autoFillCommonName( form )
<?php } elseif( $step == 2 ) {
$common_name = trim( stripslashes( $_POST['common_name'] ) );
$first_name = trim( stripslashes( $_POST['first_name'] ) );
$last_name = trim( stripslashes( $_POST['last_name'] ) );
$organization = trim( stripslashes( $_POST['organization'] ) );
$city = trim( stripslashes( $_POST['city'] ) );
$postal_code = trim( stripslashes( $_POST['postal_code'] ) );
$street = trim( stripslashes( $_POST['street'] ) );
$telephone_number = trim( stripslashes( $_POST['telephone_number'] ) );
$fax_number = trim( stripslashes( $_POST['fax_number'] ) );
$mobile_number = trim( stripslashes( $_POST['mobile_number'] ) );
$email_address = trim( stripslashes( $_POST['email_address'] ) );
$container = trim( stripslashes( $_POST['container'] ) );
$common_name = trim( $_POST['common_name'] );
$first_name = trim( $_POST['first_name'] );
$last_name = trim( $_POST['last_name'] );
$organization = trim( $_POST['organization'] );
$city = trim( $_POST['city'] );
$postal_code = trim( $_POST['postal_code'] );
$street = trim( $_POST['street'] );
$telephone_number = trim( $_POST['telephone_number'] );
$fax_number = trim( $_POST['fax_number'] );
$mobile_number = trim( $_POST['mobile_number'] );
$email_address = trim( $_POST['email_address'] );
$container = trim( $_POST['container'] );
/* Critical assertions */
0 != strlen( $common_name ) or
@ -191,20 +193,60 @@ function autoFillCommonName( form )
<center>
<table class="confirm">
<tr class="even"><td class="heading">Common name:</td><td><b><?php echo htmlspecialchars( $common_name ); ?></b></td></tr>
<tr class="odd"><td class="heading">First name:</td><td><b><?php echo htmlspecialchars( $first_name ); ?></b></td></tr>
<tr class="even"><td class="heading">Last name:</td><td><b><?php echo htmlspecialchars( $last_name ); ?></b></td></tr>
<tr class="odd"><td class="heading">Organization:</td><td><?php echo htmlspecialchars( $organization ); ?></td></tr>
<tr class="even"><td class="heading">City:</td><td><?php echo htmlspecialchars( $city ); ?></td></tr>
<tr class="odd"><td class="heading">Postal code:</td><td><?php echo htmlspecialchars( $postal_code ); ?></td></tr>
<tr class="even"><td class="heading">Street:</td><td><?php echo htmlspecialchars( $street ); ?></td></tr>
<tr class="odd"><td class="heading">Work phone:</td><td><?php echo htmlspecialchars( $telephone_number ); ?></td></tr>
<tr class="even"><td class="heading">Fax:</td><td><?php echo htmlspecialchars( $fax_number ); ?></td></tr>
<tr class="odd"><td class="heading">Mobile:</td><td><?php echo htmlspecialchars( $mobile_number ); ?></td></tr>
<tr class="even"><td class="heading">Email:</td><td><?php echo htmlspecialchars( $email_address ); ?></td></tr>
<tr class="odd"><td class="heading">Container:</td><td><?php echo htmlspecialchars( $container ); ?></td></tr>
<tr class="even">
<td class="heading">Common name:</td>
<td><b><?php echo htmlspecialchars( $common_name ); ?></b></td>
</tr>
<tr class="odd">
<td class="heading">First name:</td>
<td><b><?php echo htmlspecialchars( $first_name ); ?></b></td>
</tr>
<tr class="even">
<td class="heading">Last name:</td>
<td><b><?php echo htmlspecialchars( $last_name ); ?></b></td>
</tr>
<tr class="odd">
<td class="heading">Organization:</td>
<td><?php echo htmlspecialchars( $organization ); ?></td>
</tr>
<tr class="even">
<td class="heading">City:</td>
<td><?php echo htmlspecialchars( $city ); ?></td>
</tr>
<tr class="odd">
<td class="heading">Postal code:</td>
<td><?php echo htmlspecialchars( $postal_code ); ?></td>
</tr>
<tr class="even">
<td class="heading">Street:</td>
<td><?php echo htmlspecialchars( $street ); ?></td>
</tr>
<tr class="odd">
<td class="heading">Work phone:</td>
<td><?php echo htmlspecialchars( $telephone_number ); ?></td>
</tr>
<tr class="even">
<td class="heading">Fax:</td>
<td><?php echo htmlspecialchars( $fax_number ); ?></td>
</tr>
<tr class="odd">
<td class="heading">Mobile:</td>
<td><?php echo htmlspecialchars( $mobile_number ); ?></td>
</tr>
<tr class="even">
<td class="heading">Email:</td>
<td><?php echo htmlspecialchars( $email_address ); ?></td>
</tr>
<tr class="odd">
<td class="heading">Container:</td>
<td><?php echo htmlspecialchars( $container ); ?></td>
</tr>
</table>
<br /><input type="submit" value="Create Address" />
</center>
</form>
<?php } ?>
</body>
</html>

View File

@ -1,9 +1,9 @@
<?php
require 'config.php';
require 'common.php';
// Common to all templates
$container = stripslashes( $_POST['container'] );
$container = $_POST['container'];
$server_id = $_POST['server_id'];
// Unique to this template
@ -40,7 +40,7 @@ if( ! $step )
<tr>
<td></td>
<td class="heading">Container <acronym title="Distinguished Name">DN</acronym>:</td>
<td><input type="text" name="container" size="40" value="<?php echo htmlspecialchars( utf8_decode( $container ) ); ?>" />
<td><input type="text" name="container" size="40" value="<?php echo htmlspecialchars( $container ); ?>" />
<?php draw_chooser_link( 'dns_form.container' ); ?></td>
</td>
</tr>
@ -52,9 +52,9 @@ if( ! $step )
<?php } elseif( $step == 2 ) {
$dc_name = trim( stripslashes( $_POST['dc_name'] ) );
$container = trim( stripslashes( $_POST['container'] ) );
$associateddomain = trim( stripslashes( $_POST['associateddomain'] ) );
$dc_name = trim( $_POST['dc_name'] );
$container = trim( $_POST['container'] );
$associateddomain = trim( $_POST['associateddomain'] );
dn_exists( $server_id, $container ) or
pla_error( "The container you specified (" . htmlspecialchars( $container ) . ") does not exist. " .

View File

@ -1,9 +1,9 @@
<?php
require 'config.php';
require 'common.php';
// Common to all templates
$container = stripslashes( $_POST['container'] );
$container = $_POST['container'];
$server_id = $_POST['server_id'];
@ -48,7 +48,7 @@ have_auth_info( $server_id ) or pla_error( "Not enough information to login to s
<tr>
<td></td>
<td class="heading">Container:</td>
<td><input type="text" size="40" name="container" value="<?php echo htmlspecialchars( utf8_decode( $container ) ); ?>" />
<td><input type="text" size="40" name="container" value="<?php echo htmlspecialchars( $container ); ?>" />
<?php draw_chooser_link( 'machine_form.container' ); ?></td>
</td>
</tr>
@ -81,8 +81,8 @@ have_auth_info( $server_id ) or pla_error( "Not enough information to login to s
<?php } elseif( $step == 2 ) {
$machine_name = trim( stripslashes( $_POST['machine_name'] ) );
$uid_number = trim( stripslashes( $_POST['uid_number'] ) );
$machine_name = trim( $_POST['machine_name'] );
$uid_number = trim( $_POST['uid_number'] );
dn_exists( $server_id, $container ) or
pla_error( "The container you specified (" . htmlspecialchars( $container ) . ") does not exist. " .
@ -94,7 +94,7 @@ have_auth_info( $server_id ) or pla_error( "Not enough information to login to s
<input type="hidden" name="new_dn" value="<?php echo htmlspecialchars( 'uid=' . $machine_name . '$,' . $container ); ?>" />
<!-- ObjectClasses -->
<?php $object_classes = rawurlencode( serialize( array( 'top', 'sambaAccount', 'posixAccount' ) ) ); ?>
<?php $object_classes = rawurlencode( serialize( array( 'top', 'sambaAccount', 'posixAccount', 'account' ) ) ); ?>
<input type="hidden" name="object_classes" value="<?php echo $object_classes; ?>" />

View File

@ -1,9 +1,9 @@
<?php
require 'config.php';
require 'common.php';
// Common to all templates
$container = stripslashes( $_POST['container'] );
$container = $_POST['container'];
$server_id = $_POST['server_id'];
// Unique to this template
@ -35,7 +35,7 @@ have_auth_info( $server_id ) or pla_error( "Not enough information to login to s
<tr>
<td></td>
<td class="heading">Container <acronym title="Distinguished Name">DN</acronym>:</td>
<td><input type="text" name="container" size="40" value="<?php echo htmlspecialchars( utf8_decode( $container ) ); ?>" />
<td><input type="text" name="container" size="40" value="<?php echo htmlspecialchars( $container ); ?>" />
<?php draw_chooser_link( 'ou_form.container' ); ?></td>
</td>
</tr>
@ -47,8 +47,8 @@ have_auth_info( $server_id ) or pla_error( "Not enough information to login to s
<?php } elseif( $step == 2 ) {
$ou_name = trim( stripslashes( $_POST['ou_name'] ) );
$container = trim( stripslashes( $_POST['container'] ) );
$ou_name = trim( $_POST['ou_name'] );
$container = trim( $_POST['container'] );
dn_exists( $server_id, $container ) or
pla_error( "The container you specified (" . htmlspecialchars( $container ) . ") does not exist. " .

View File

@ -0,0 +1,117 @@
<?php
require 'common.php';
// Common to all templates
$container = $_POST['container'];
$server_id = $_POST['server_id'];
// Change this to suit your needs
$default_number_of_users = 10;
$step = $_POST['step'];
if( ! $step )
$step = 1;
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
?>
<center><h2>New Posix Group</h2></center>
<?php if( $step == 1 ) { ?>
<form action="creation_template.php" method="post" name="posix_group_form">
<input type="hidden" name="step" value="2" />
<input type="hidden" name="server_id" value="<?php echo $server_id; ?>" />
<input type="hidden" name="template" value="<?php echo htmlspecialchars( $_POST['template'] ); ?>" />
<center>
<table class="confirm">
<tr>
<td></td>
<td class="heading">Posix Group Name:</td>
<td><input type="text" name="posix_group_name" value="" /> <small>(example: MyGroup, do not include "cn=")</small></td>
</tr>
<tr>
<td></td>
<td class="heading"><acronym title="Group Identification">GID</acronym> Number:</td>
<td><input type="text" name="gid_number" value="" /> <small>(example: 2000)</small></td>
</tr>
<tr>
<td></td>
<td class="heading">Container <acronym title="Distinguished Name">DN</acronym>:</td>
<td><input type="text" name="container" size="40" value="<?php echo htmlspecialchars( $container ); ?>" />
<?php draw_chooser_link( 'posix_group_form.container' ); ?></td>
</td>
</tr>
<tr>
<td></td>
<td class="heading">Users:</td>
<td><input type="text" name="member_uids[]" value="" /> <small>(example: dsmith)</small><br />
<?php for( $i=1; $i<$default_number_of_users; $i++ ) { ?>
<input type="text" name="member_uids[]" value="" /><br />
<?php } ?>
</td>
</tr>
<tr>
<td colspan="3"><center><br /><input type="submit" value="Proceed &gt;&gt;" /></td>
</tr>
</table>
</center>
<?php } elseif( $step == 2 ) {
$group_name = trim( $_POST['posix_group_name'] );
$container = trim( $_POST['container'] );
$gid_number = trim( $_POST['gid_number'] );
$uids = $_POST['member_uids'];
$member_uids = array();
foreach( $uids as $uid )
if( '' != trim( $uid ) && ! in_array( $uid, $member_uids ) )
$member_uids[] = $uid;
dn_exists( $server_id, $container ) or
pla_error( "The container you specified (" . htmlspecialchars( $container ) . ") does not exist. " .
"Please go back and try again." );
?>
<form action="create.php" method="post">
<input type="hidden" name="server_id" value="<?php echo $server_id; ?>" />
<input type="hidden" name="new_dn" value="<?php echo htmlspecialchars( 'cn='.$group_name.','.$container ); ?>" />
<!-- ObjectClasses -->
<?php $object_classes = rawurlencode( serialize( array( 'top', 'posixGroup' ) ) ); ?>
<input type="hidden" name="object_classes" value="<?php echo $object_classes; ?>" />
<!-- The array of attributes/values -->
<input type="hidden" name="attrs[]" value="cn" />
<input type="hidden" name="vals[]" value="<?php echo htmlspecialchars($posix_group_name);?>" />
<input type="hidden" name="attrs[]" value="gidNumber" />
<input type="hidden" name="vals[]" value="<?php echo htmlspecialchars($gid_number);?>" />
<?php foreach( $member_uids as $uid ) { ?>
<input type="hidden" name="attrs[]" value="memberUid" />
<input type="hidden" name="vals[]" value="<?php echo htmlspecialchars($uid);?>" />
<?php } ?>
<center>
Really create this new Posix Group entry?<br />
<br />
<table class="confirm">
<tr class="even"><td>Name</td><td><b><?php echo htmlspecialchars($group_name); ?></b></td></tr>
<tr class="odd"><td>Container</td><td><b><?php echo htmlspecialchars( $container ); ?></b></td></tr>
<tr class="even"><td>gidNumber</td><td><b><?php echo htmlspecialchars( $gid_number ); ?></b></td></tr>
<tr class="odd"><td>Member UIDs</td><td><b>
<?php foreach( $member_uids as $i => $uid )
echo htmlspecialchars($uid) . "<br />"; ?>
</b></td></tr>
</table>
<br /><input type="submit" value="Create Group" />
</center>
</form>
<?php } ?>

View File

@ -0,0 +1,276 @@
<?php
require realpath( 'common.php' );
// customize this to your needs
$default_samba_sid = "S-1-5-21-3509297442-4087397136-3591104989";
$default_container = "ou=Users";
$default_home = "/export/home";
$mkntpwdCommand = "./templates/creation/mkntpwd";
// Common to all templates
$server_id = $_POST['server_id'];
// Unique to this template
$step = $_POST['step'];
if( ! $step )
$step = 1;
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
?>
<script language="javascript">
<!--
function autoFillUserName( form ) {
var first_name;
var last_name;
var user_name;
first_name = form.first_name.value.toLowerCase();
last_name = form.last_name.value.toLowerCase();
if( last_name == '' ) {
return false;
}
user_name = first_name.substr( 0,1 ) + last_name;
user_name = first_name.substr( 0,8 );
form.user_name.value = user_name;
autoFillHomeDir( form );
}
function autoFillHomeDir( form ){
var user_name;
var home_dir;
user_name = form.user_name.value.toLowerCase();
home_dir = '<?php echo $default_home; ?>/';
home_dir += user_name;
form.home_dir.value = home_dir;
}
function autoFillSambaSID( form ){
var sambaSID;
var uidNumber;
uidNumber = form.uid_number.value;
sambaSID = '<?php echo $default_samba_sid; ?>-'+(2*uidNumber+1000);
form.samba_sid.value = sambaSID;
}
-->
</script>
<center><h2>New Samba3-User Account</h2></center>
<?php if( $step == 1 ) { ?>
<form action="creation_template.php" method="post" id="user_form" name="user_form">
<input type="hidden" name="step" value="2" />
<input type="hidden" name="server_id" value="<?php echo $server_id; ?>" />
<input type="hidden" name="template" value="<?php echo $_POST['template']; ?>" />
<center>
<table class="confirm">
<tr class="spacer"><td colspan="3"></tr>
<tr>
<td></td>
<td class="heading">UID Number:</td>
<td><input type="text" name="uid_number" value="" onChange="autoFillSambaSID(this.form)" /></td>
</tr>
<tr>
<td></td>
<td class="heading"><i>Samba SID:</i></td>
<td><input type="text" name="samba_sid" value="" id="samba_sid" readonly=""/></td>
</tr>
<tr class="spacer"><td colspan="3"></tr>
<tr>
<td><img src="images/uid.png" /></td>
<td class="heading">First name:</td>
<td><input type="text" name="first_name" id="first_name" value="" onChange="autoFillUserName(this.form)" /></td>
</tr>
<tr>
<td></td>
<td class="heading">Last name:</td>
<td><input type="text" name="last_name" id="last_name" value="" onChange="autoFillUserName(this.form)" /></td>
</tr>
<tr>
<td></td>
<td class="heading">User name:</td>
<td><input type="text" name="user_name" id="user_name" value=""
onChange="autoFillHomeDir(this.form)" onExit="autoFillHomeDir(this.form)" /></td>
</tr>
<tr class="spacer"><td colspan="3"></tr>
<tr>
<td><img src="images/lock.png" /></td>
<td class="heading">Password:</td>
<td><input type="password" name="user_pass1" value="" /></td>
</tr>
<tr>
<td></td>
<td class="heading">Password:</td>
<td><input type="password" name="user_pass2" value="" /></td>
</tr>
<tr>
<td></td>
<td class="heading">Encryption:</td>
<td>
<input type="hidden" name="encryption" value="crypt"/>
<i>crypt</i>
</td>
</tr>
<tr class="spacer"><td colspan="3"></tr>
<tr>
<td><img src="images/nt.png" /></td>
<td class="heading">Login Shell:</td>
<td>
<input type="hidden" name="login_shell" value="/bin/csh"/>
<i>/bin/csh</i>
</td>
</tr>
<tr>
<td></td>
<td class="heading">Container:</td>
<td><input type="text" name="container" size="40"
value="<?php if( isset( $container ) )
echo htmlspecialchars( $container );
else
echo htmlspecialchars( $default_container . ',' . $servers[$server_id]['base'] ); ?>" />
<?php draw_chooser_link( 'user_form.container' ); ?></td>
</td>
</tr>
<tr>
<td></td>
<td class="heading">Unix Group:</td>
<td><select name="group">
<option value="1000">admins (1000)</option>
<option value="2000">users (2000)</option>
<option value="3000">staff (3000)</option>
<option value="5000">guest (5000)</option>
</select></td>
</tr>
<tr>
<td></td>
<td class="heading">Windows Group:</td>
<td><select name="sambaPrimaryGroupSID">
<option value="S-1-5-32-547">Local Power Users</option>
<option value="S-1-5-32-544">Local Administrator</option>
<option value="S-1-5-32-545">Local Users</option>
<option value="<?php echo $default_samba_sid; ?>-512">Domain Admins</option>
<option value="<?php echo $default_samba_sid; ?>-513">Domain Users</option>
<option value="<?php echo $default_samba_sid; ?>-514">Domain Guests</option>
</select></td>
</tr>
<tr>
<td></td>
<td class="heading">Home Directory:</td>
<td><input type="text" name="home_dir" value="<?php echo $default_home ?>" id="home_dir" /></td>
</tr>
<tr>
<td colspan="3"><center><br /><input type="submit" value="Proceed &gt;&gt;" /></td>
</tr>
</table>
</center>
<?php } elseif( $step == 2 ) {
$user_name = trim( stripslashes( $_POST['user_name'] ) );
$first_name = trim( stripslashes( $_POST['first_name'] ) );
$last_name = trim( stripslashes( $_POST['last_name'] ) );
$password1 = stripslashes( $_POST['user_pass1'] );
$password2 = stripslashes( $_POST['user_pass2'] );
$encryption = stripslashes( $_POST['encryption'] );
$login_shell = trim( stripslashes( $_POST['login_shell'] ) );
$uid_number = trim( stripslashes( $_POST['uid_number'] ) );
$gid_number = trim( stripslashes( $_POST['group'] ) );
$container = trim( stripslashes( $_POST['container'] ) );
$home_dir = trim( stripslashes( $_POST['home_dir'] ) );
$samba_sid = trim( stripslashes( $_POST['samba_sid'] ) );
/* Critical assertions */
$password1 == $password2 or
pla_error( "Your passwords don't match. Please go back and try again." );
0 != strlen( $uid_number ) or
pla_error( "You cannot leave the UID number blank. Please go back and try again." );
is_numeric( $uid_number ) or
pla_error( "You can only enter numeric values for the UID number field. Please go back and try again." );
dn_exists( $server_id, $container ) or
pla_error( "The container you specified (" . htmlspecialchars( $container ) . ") does not exist. " .
"Please go back and try again." );
$password = password_hash( $password1, $encryption );
$sambaPassCommand = $mkntpwdCommand . " " . $password1;
$sambaPassCommandOutput = shell_exec($sambaPassCommand);
$sambaLMPassword = substr($sambaPassCommandOutput,0,strPos($sambaPassCommandOutput,':'));
$sambaNTPassword = substr($sambaPassCommandOutput,strPos($sambaPassCommandOutput,':')+1);
?>
<center><h3>Confirm account creation:</h3></center>
<form action="create.php" method="post">
<input type="hidden" name="server_id" value="<?php echo $server_id; ?>" />
<input type="hidden" name="new_dn" value="<?php echo htmlspecialchars( 'uid=' . $user_name . ',' . $container ); ?>" />
<!-- ObjectClasses -->
<?php $object_classes = rawurlencode( serialize( array( 'top', 'account', 'posixAccount', 'shadowAccount' , 'sambaSamAccount' ) ) ); ?>
<input type="hidden" name="object_classes" value="<?php echo $object_classes; ?>" />
<!-- The array of attributes/values -->
<input type="hidden" name="attrs[]" value="cn" />
<input type="hidden" name="vals[]" value="<?php echo htmlspecialchars($first_name);?>" />
<input type="hidden" name="attrs[]" value="displayName" />
<input type="hidden" name="vals[]" value="<?php echo htmlspecialchars($first_name . ' ' . $last_name);?>" />
<input type="hidden" name="attrs[]" value="gecos" />
<input type="hidden" name="vals[]" value="<?php echo htmlspecialchars($first_name . ' ' . $last_name);?>" />
<input type="hidden" name="attrs[]" value="gidNumber" />
<input type="hidden" name="vals[]" value="<?php echo htmlspecialchars($gid_number);?>" />
<input type="hidden" name="attrs[]" value="homeDirectory" />
<input type="hidden" name="vals[]" value="<?php echo htmlspecialchars($home_dir);?>" />
<input type="hidden" name="attrs[]" value="loginShell" />
<input type="hidden" name="vals[]" value="<?php echo htmlspecialchars($login_shell);?>" />
<input type="hidden" name="attrs[]" value="sambaAcctFlags" />
<input type="hidden" name="vals[]" value="[U ]" />
<input type="hidden" name="attrs[]" value="sambaLMPassword" />
<input type="hidden" name="vals[]" value="<?php echo htmlspecialchars($sambaLMPassword);?>" />
<input type="hidden" name="attrs[]" value="sambaNTPassword" />
<input type="hidden" name="vals[]" value="<?php echo htmlspecialchars($sambaNTPassword);?>" />
<input type="hidden" name="attrs[]" value="sambaPrimaryGroupSID" />
<input type="hidden" name="vals[]" value="<?php echo htmlspecialchars($sambaPrimaryGroupSID);?>" />
<input type="hidden" name="attrs[]" value="sambaPwdCanChange" />
<input type="hidden" name="vals[]" value="0" />
<input type="hidden" name="attrs[]" value="sambaPwdLastSet" />
<input type="hidden" name="vals[]" value="0" />
<input type="hidden" name="attrs[]" value="sambaPwdMustChange" />
<input type="hidden" name="vals[]" value="2147483647" />
<input type="hidden" name="attrs[]" value="sambaSID" />
<input type="hidden" name="vals[]" value="<?php echo htmlspecialchars($samba_sid); ?>" />
<input type="hidden" name="attrs[]" value="shadowLastChange" />
<input type="hidden" name="vals[]" value="11778" />
<input type="hidden" name="attrs[]" value="uid" />
<input type="hidden" name="vals[]" value="<?php echo htmlspecialchars($user_name);?>" />
<input type="hidden" name="attrs[]" value="uidNumber" />
<input type="hidden" name="vals[]" value="<?php echo htmlspecialchars($uid_number);?>" />
<input type="hidden" name="attrs[]" value="userPassword" />
<input type="hidden" name="vals[]" value="<?php echo htmlspecialchars($password);?>" />
<center>
<table class="confirm">
<tr class="even"><td class="heading">User name:</td><td><b><?php echo htmlspecialchars( $user_name ); ?></b></td></tr>
<tr class="odd"><td class="heading">First name:</td><td><b><?php echo htmlspecialchars( $first_name ); ?></b></td></tr>
<tr class="even"><td class="heading">Last name:</td><td><b><?php echo htmlspecialchars( $last_name ); ?></b></td></tr>
<tr class="odd"><td class="heading">Password:</td><td>[secret]</td></tr>
<tr class="even"><td class="heading">Login Shell:</td><td><?php echo htmlspecialchars( $login_shell); ?></td></tr>
<tr class="odd"><td class="heading">UID Number:</td><td><?php echo htmlspecialchars( $uid_number ); ?></td></tr>
<tr class="even"><td class="heading">GID Number:</td><td><?php echo htmlspecialchars( $gid_number ); ?></td></tr>
<tr class="odd"><td class="heading">Container:</td><td><?php echo htmlspecialchars( $container ); ?></td></tr>
<tr class="even"><td class="heading">Home dir:</td><td><?php echo htmlspecialchars( $home_dir ); ?></td></tr>
</table>
<br /><input type="submit" value="Create Account" />
</center>
<?php } ?>

View File

@ -1,12 +1,12 @@
<?php
require 'config.php';
require 'common.php';
// customize this to your needs
$default_container = "ou=People";
// Common to all templates
$container = stripslashes( $_POST['container'] );
$container = $_POST['container'];
$server_id = $_POST['server_id'];
// Unique to this template

149
tree.php
View File

@ -11,8 +11,7 @@
* tree.php#3_dc%3Dexample%2Cdc%3Dcom
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
// no expire header stuff
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
@ -42,29 +41,26 @@ $tree_icons = $_SESSION['tree_icons'];
<body>
<?php
$group_id = "61828";
$bug_atid = "498546";
$rfe_atid = "498549";
$bug_href = "http://sourceforge.net/tracker/?func=add&amp;group_id=$group_id&amp;atid=$bug_atid";
$open_bugs_href = "http://sourceforge.net/tracker/?group_id=$group_id&amp;atid=$bug_atid";
$feature_href = "http://sourceforge.net/tracker/?func=add&amp;group_id=$group_id&amp;atid=$rfe_atid";
$open_features_href = "http://sourceforge.net/tracker/?atid=$rfe_atid&group_id=$group_id&amp;func=browse";
$bug_href = get_href( 'add_bug' );
$open_bugs_href = get_href( 'open_bugs' );
$feature_href = get_href( 'add_rfe' );
$open_features_href = get_href( 'open_rfes' );
?>
<h3 class="subtitle" style="margin:0px">phpLDAPAdmin - <?php echo pla_version(); ?></h3>
<h3 class="subtitle" style="margin:0px">phpLDAPadmin - <?php echo pla_version(); ?></h3>
<table class="edit_dn_menu">
<tr>
<td><img src="images/light.png" /></td>
<td><a href="<?php echo $feature_href; ?>" target="new">Request a new feature</a>
(<a href="<?php echo $open_features_href; ?>" target="new">see open requests</a>)</td>
<td><nobr><a href="<?php echo $feature_href; ?>" target="new"><?php echo $lang['request_new_feature']; ?></a>
(<a href="<?php echo $open_features_href; ?>" target="new"><?php echo $lang['see_open_requests']; ?></a>)</nobr></td>
</tr>
<tr>
<td><img src="images/bug.png" /></td>
<td><a href="<?php echo $bug_href; ?>" target="new">Report a bug</a>
(<a href="<?php echo $open_bugs_href; ?>" target="new">see open bugs</a>)</td>
<td><nobr><a href="<?php echo $bug_href; ?>" target="new"><?php echo $lang['report_bug']; ?></a>
(<a href="<?php echo $open_bugs_href; ?>" target="new"><?php echo $lang['see_open_bugs']; ?></a>)</nobr></td>
</tr>
</table>
<br />
<table class="tree" cellspacing="0">
<?php
@ -76,8 +72,9 @@ foreach( $servers as $server_id => $server_tree ) {
$server_name = $servers[$server_id]['name'];
echo '<tr class="server">';
echo '<td class="icon"><img src="images/server.png" alt="server"/></td>';
echo '<td colspan="99"><b><a name="' . $id . '">' . htmlspecialchars( $server_name ) . '</a></b><br />';
echo '<td colspan="99"><a name="' . $server_id . '"></a>';
echo '<nobr>' . htmlspecialchars( $server_name ) . '</nobr></td>';
echo '</tr>';
// do we have what it takes to authenticate here, or do we need to
// present the user with a login link (for 'form' auth_types)?
@ -90,28 +87,40 @@ foreach( $servers as $server_id => $server_tree ) {
rawurlencode( $servers[$server_id]['base'] );
$logout_href = 'logout.php?server_id=' . $server_id;
$info_href = 'server_info.php?server_id=' . $server_id;
if( $servers[$server_id]['auth_type'] == 'form' && have_auth_info( $server_id ) )
echo "<small><nobr>Logged in as: " . htmlspecialchars(get_logged_in_dn($server_id)) . "</small></nobr><br />";
$import_href = 'ldif_import_form.php?server_id=' . $server_id;
// Draw the quick-links below the server name:
// ( schema | search | refresh | create )
echo '<small>(';
echo '<a title="View schema for ' . $server_name . '"'.
' href="' . $schema_href . '">schema</a> | ';
echo '<a title="Search ' . $server_name . ' for entries"'.
' href="' . $search_href . '">search</a> | ';
echo '<a title="Re-query ' . $server_name . ' to refresh all expanded containers"'.
' href="' . $refresh_href . '">refresh</a> | ';
echo '<a title="Create a new entry on ' . $server_name . '"'.
echo '<tr><td colspan="100" class="links">';
echo '<nobr>';
echo '( ';
echo '<a title="' . $lang['view_schema_for'] . ' ' . $server_name . '"'.
' href="' . $schema_href . '">' . $lang['schema'] . '</a> | ';
echo '<a title="' . $lang['search'] . ' ' . $server_name . '"' .
' href="' . $search_href . '">' . $lang['search'] . '</a> | ';
echo '<a title="' . $lang['refresh_expanded_containers'] . ' ' . $server_name . '"'.
' href="' . $refresh_href . '">' . $lang['refresh'] . '</a> | ';
echo '<a title="' . $lang['create_new_entry_on'] . ' ' . $server_name . '"'.
' href="' . $create_href . '" target="right_frame">create</a> | ';
echo '<a title="View server-supplied information" target="right_frame"'.
'href="' . $info_href . '">info</a>';
echo '<a title="' . $lang['view_server_info'] . '" target="right_frame"'.
'href="' . $info_href . '">' . $lang['info'] . '</a> | ';
echo '<a title="' . $lang['import_from_ldif'] . '" target="right_frame"' .
'href="' . $import_href .'">' . $lang['import'] . '</a>';
if( $servers[ $server_id ][ 'auth_type' ] == 'form' )
echo ' | <a title="Logout of this server" href="' . $logout_href . '" target="right_frame">logout</a>';
echo ')</small></td></tr>';
echo ' | <a title="' . $lang['logout_of_this_server'] . '" href="' . $logout_href .
'" target="right_frame">' . $lang['logout'] . '</a>';
echo ' )</nobr></td></tr>';
$rdn = utf8_decode( $dn );
if( $servers[$server_id]['auth_type'] == 'form' && have_auth_info( $server_id ) )
echo "<tr><td class=\"links\" colspan=\"100\"><nobr>" .
$lang['logged_in_as'] . htmlspecialchars(get_logged_in_dn($server_id)) .
"</nobr></td></tr>";
if( is_server_read_only( $server_id ) )
echo "<tr><td class=\"links\" colspan=\"100\"><nobr>" .
"(" . $lang['read_only'] . ")</nobr></td></tr>";
// Fetch and display the base DN for this server
//$rdn = utf8_decode( $dn );
if( null == $servers[ $server_id ]['base'] ) {
$base_dn = try_to_get_root_dn( $server_id );
} else {
@ -134,26 +143,32 @@ foreach( $servers as $server_id => $server_tree ) {
$edit_href = "edit.php?server_id=$server_id&amp;dn=" . rawurlencode( $base_dn );
$icon = get_icon( $server_id, $base_dn );
echo "<tr><td class=\"spacer\"></td>\n";
echo "<td class=\"expander\"><a href=\"$expand_href\"><img src=\"$expand_img\" /></td>";
echo "<td class=\"icon\"><a href=\"$edit_href\" target=\"right_frame\"><img src=\"images/$icon\" /></a></td>\n";
echo "<td class=\"rdn\" colspan=\"99\"><nobr><a href=\"$edit_href\" " .
"target=\"right_frame\">$base_dn</nobr></td>\n";
echo "<td class=\"expander\" style=\"text-align: right\">";
echo "<a href=\"$expand_href\"><img src=\"$expand_img\" /></td>";
echo "<td class=\"icon\"><a href=\"$edit_href\" target=\"right_frame\">";
echo "<img src=\"images/$icon\" /></a></td>\n";
echo "<td class=\"rdn\" colspan=\"98\"><nobr><a href=\"$edit_href\" ";
echo " target=\"right_frame\">$base_dn</nobr></td>\n";
echo "</tr>\n";
} else {
if( "" === $base_dn || null === $base_dn ) {
// The server refuses to give out the base dn
echo "<tr><td class=\"spacer\"></td><td colspan=\"99\"><small>Could not determine ";
echo "the root of your LDAP tree.<br />It appears that the LDAP server has ";
echo "been <b>configured to not give it out</b>. Please specify it in config.php";
echo "</small></td></tr>";
echo "<tr><td class=\"spacer\"></td><td colspan=\"98\"><small><nobr>";
echo $lang['could_not_determine_root'];
echo '<br />';
echo $lang['ldap_refuses_to_give_root'];
echo '<br />';
echo $lang['please_specify_in_config'];
echo "</small></nobr></td></tr>";
// Proceed to the next server. We cannot draw anything else for this server.
continue;
} else {
// For some unknown reason, we couldn't determine the base dn
echo "<tr><td class=\"spacer\"></td><td colspan=\"99\"><small>Could not determine ";
echo "the root of your LDAP tree.<br />Please specify it in config.php";
echo "</small></td></tr>";
echo "<tr><td class=\"spacer\"></td><td colspan=\"99\"><small><nobr>";
echo $lang['could_not_determine_root'];
echo '<br />';
echo $lang['please_specify_in_config'];
echo "</small></nobr></td></tr>";
// Proceed to the next server. We cannot draw anything else for this server.
continue;
}
@ -164,31 +179,38 @@ foreach( $servers as $server_id => $server_tree ) {
// Is the root of the tree expanded already?
if( isset( $tree[$server_id][$base_dn] ) ) {
foreach( $tree[ $server_id ][ $base_dn ] as $child_dn )
draw_tree_html( $child_dn, $server_id, 1 );
echo '<td class="spacer"></td>';
draw_tree_html( $child_dn, $server_id, 0 );
if( ! is_server_read_only( $server_id ) ) {
echo '<td class="spacer"></td>';
echo '<td class="icon"><a href="' . $create_href .
'" target="right_frame"><img src="images/star.png" /></a></td>';
echo '<td class="create" colspan="99"><a href="' . $create_href .
'" target="right_frame" title="Create a new object in '. $base_dn.'">Create New</a></td></tr>';
echo '<td class="create" colspan="100"><a href="' . $create_href .
'" target="right_frame" title="' . $lang['create_new_entry_in'] . ' ' .
$base_dn.'">' . $lang['create_new'] . '</a></td></tr>';
}
}
}
else // have_auth_info() returned false.
{
// We don't have enough information to login to this server
// Draw the "login..." link
$login_href = "login_form.php?server_id=$server_id";
echo '<tr class="login"><td colspan="100">';
echo '&nbsp;&nbsp;&nbsp;<a href="' . $login_href . '" target="right_frame">';
echo '<img src="images/uid.png" align="top" alt="login"/></a> ';
echo '<a href="' . $login_href . '" target="right_frame">login...</a>';
echo '</td></tr>';
}
}
}
?>
</table>
<?php
//echo "<pre>"; print_r( $tree );
?>
</body>
</html>
@ -201,7 +223,7 @@ exit;
*/
function draw_tree_html( $dn, $server_id, $level=0 )
{
global $servers, $tree, $tree_icons;
global $servers, $tree, $tree_icons, $lang;
$id = $server_id;
$encoded_dn = rawurlencode( $dn );
@ -214,41 +236,41 @@ function draw_tree_html( $dn, $server_id, $level=0 )
$tree_icons[ $server_id ][ $dn ] = get_icon( $server_id, $dn );
$img_src = 'images/' . $tree_icons[ $server_id ][ $dn ];
$rdn = ldap_explode_dn( $dn, 0 );
$rdn = utf8_decode( $rdn[0] );
$rdn = pla_explode_dn( $dn );
$rdn = $rdn[0];
echo '<tr>';
for( $i=0; $i<=$level; $i++ ) {
echo '<td class="spacer"></td>';
echo '<td class="spacer"></td>' . "\n";
}
// is this node expanded?
// is this node expanded? (deciding whether to draw "+" or "-")
if( isset( $tree[$server_id][$dn] ) ) { ?>
<td class="expander">
<nobr>
<a href="<?php echo $collapse_href; ?>"><img src="images/minus.png" alt="plus" /></a>
</nobr>
</td>
<?php $object_count = ' <span class="count">(' . count( $tree[$server_id][$dn] ) . ')</span>'; ?>
<?php } else { ?>
<?php $object_count = ' <span class="count">(' . count( $tree[$server_id][$dn] ) . ')</span>';
} else { ?>
<td class="expander">
<nobr>
<a href="<?php echo $expand_href; ?>"><img src="images/plus.png" alt="minus" /></a>
</nobr>
</td>
<?php $object_count = ''; ?>
<?php } ?>
<?php $object_count = '';
} ?>
<td class="icon">
<a href="<?php echo $edit_href; ?>"
target="right_frame"
name="<?php echo $server_id; ?>_<?php echo $encoded_dn; ?>"><img src="<?php echo $img_src; ?>" /></a>
</td>
<td class="rdn" colspan="99">
<td class="rdn" colspan="<?php echo (97-$level); ?>">
<nobr>
<a href="<?php echo $edit_href; ?>"
target="right_frame"><?php echo htmlspecialchars($rdn); ?></a>
target="right_frame"><?php echo htmlspecialchars( utf8_decode( $rdn ) ); ?></a>
<?php echo $object_count; ?>
</nobr>
</td>
@ -270,8 +292,9 @@ function draw_tree_html( $dn, $server_id, $level=0 )
echo '<td class="spacer"></td>';
echo '<td class="icon"><a href="' . $create_href .
'" target="right_frame"><img src="images/star.png" /></a></td>';
echo '<td class="create" colspan="99"><a href="' . $create_href .
'" target="right_frame" title="Create a new object in '. $rdn.'">Create New</a></td></tr>';
echo '<td class="create" colspan="' . (97-$level) . '"><a href="' . $create_href .
'" target="right_frame" title="' . $lang['create_new_entry_in'] . ' ' . $rdn.'">' .
$lang['create_new'] . '</a></td></tr>';
}
echo '</tr>';

View File

@ -7,30 +7,45 @@
* Variables that come in on the query string:
* - dn (rawurlencoded)
* - server_id
* - update_array (an array in the form expected by PHP's ldap_modify)
* - update_array (an array in the form expected by PHP's ldap_modify, except for deletions)
* (will never be empty: update_confirm.php ensures that)
*
* Attribute deletions:
* To specify that an attribute is to be deleted (whether multi- or single-valued),
* enter that attribute in the update array like this: attr => ''. For example, to
* delete the 'sn' attribute from an entry, the update array would look like this:
* Array (
* sn => ''
* )
*
* On success, redirect to edit.php
* On failure, echo an error.
*/
require 'config.php';
require_once 'functions.php';
require 'common.php';
if( is_server_read_only( $server_id ) )
pla_error( "You cannot perform updates while server is in read-only mode" );
$server_id = $_POST['server_id'];
$dn = stripslashes( rawurldecode( $_POST['dn'] ) );
$dn = rawurldecode( $_POST['dn'] );
$encoded_dn = rawurlencode( $dn );
$update_array = $_POST['update_array'];
//echo "<pre>"; print_r( $update_array ); echo "</pre>";
check_server_id( $server_id ) or pla_error( "Bad server_id: " . htmlspecialchars( $server_id ) );
have_auth_info( $server_id ) or pla_error( "Not enough information to login to server. Please check your configuration." );
is_array( $update_array ) or pla_error( "update_array is malformed. This might be a phpLDAPAdmin bug. Please report it." );
is_array( $update_array ) or pla_error( "update_array is malformed. This might be a phpLDAPadmin bug. Please report it." );
// check for delete attributes (indicated by the attribute entry appearing like this: attr => ''
foreach( $update_array as $attr => $val )
if( ! is_array( $val ) )
if( $val == '' )
$update_array[ $attr ] = array();
else
$update_array[ $attr ] = $val;
else
foreach( $val as $i => $v )
$update_array[ $attr ][ $i ] = $v;
$ds = pla_ldap_connect( $server_id );
$res = @ldap_modify( $ds, $dn, $update_array );

View File

@ -9,8 +9,8 @@
* makes the change.
*
*/
include 'config.php';
include 'functions.php';
require 'common.php';
include 'header.php';
@ -21,7 +21,8 @@ $rdn = get_rdn( $dn );
$old_values = $_POST['old_values'];
$new_values = $_POST['new_values'];
$update_array = array();
if( is_server_read_only( $server_id ) )
pla_error( "You cannot perform updates while server is in read-only mode" );
?>
<body>
@ -36,17 +37,37 @@ foreach( $new_values as $attr => $new_val )
if( $new_val != $old_values[ $attr ] ) {
// special case for userPassword attributes
if( 0 == strcasecmp( $attr, 'userPassword' ) )
{
$enc_type = $_POST['enc_type'];
$new_val = password_hash( $new_val, $enc_type );
}
if( 0 == strcasecmp( $attr, 'userPassword' ) && $new_val != '' )
$new_val = password_hash( $new_val, $_POST['enc_type'] );
$update_array[ $attr ] = $new_val;
}
}
//echo "<pre>"; print_r( $update_array ); echo "</pre>";
// special case check for a new enc_type for userPassword (not otherwise detected)
if( $_POST['enc_type'] != $_POST['old_enc_type'] && $_POST['new_values']['userpassword'] != '' ) {
$new_password = password_hash( $_POST['new_values']['userpassword'], $_POST['enc_type'] );
$update_array[ 'userpassword' ] = $new_password;
}
// strip empty vals from update_array and ensure consecutive indices for each attribute
foreach( $update_array as $attr => $val ) {
if( is_array( $val ) ) {
foreach( $val as $i => $v )
if( null == $v || 0 == strlen( $v ) )
unset( $update_array[$attr][$i] );
$update_array[$attr] = array_values( $update_array[$attr] );
}
}
// at this point, the update_array should look like this (example):
// Array (
// cn => Array(
// [0] => 'Dave',
// [1] => 'Bob' )
// sn => 'Smith',
// telephoneNumber => '555-1234' )
// This array should be ready to be passed to ldap_modify()
?>
<?php if( count( $update_array ) > 0 ) { ?>
@ -67,21 +88,36 @@ foreach( $new_values as $attr => $new_val )
<?php
if( is_array( $old_values[ $attr ] ) )
foreach( $old_values[ $attr ] as $v )
echo htmlspecialchars( $v ) . "<br />";
echo htmlspecialchars( utf8_encode( $v ) ) . "<br />";
else
echo htmlspecialchars( $old_values[ $attr ] ) . "<br />";
echo htmlspecialchars( utf8_encode( $old_values[ $attr ] ) ) . "<br />";
echo "</nobr></td><td><nobr>";
if( is_array( $new_val ) )
foreach( $new_val as $i => $v )
// is this a multi-valued attribute?
if( is_array( $new_val ) ) {
foreach( $new_val as $i => $v ) {
if( $v == '' ) {
// remove it from the update array if it's empty
unset( $update_array[ $attr ][ $i ] );
$update_array[ $attr ] = array_values( $update_array[ $attr ] );
} else
echo htmlspecialchars( $v ) . "<br />";
} else {
echo htmlspecialchars( utf8_encode( $v ) ) . "<br />";
}
}
// was this a multi-valued attribute deletion? If so,
// fix the $update_array to reflect that per update_confirm.php's
// expectations
if( $update_array[ $attr ] == array( 0 => '' ) || $update_array[ $attr ] == array() ) {
$update_array[ $attr ] = '';
echo '<span style="color: red">[attribute deleted]</span>';
}
}
else
if( $new_val != '' )
echo htmlspecialchars( $new_val ) . "<br />";
else
echo '<span style="color: red">[attribute deleted]</span>';
echo "</nobr></td></tr>\n\n";
}

View File

@ -1,7 +1,6 @@
<?php
require 'config.php';
require 'common.php';
$file = $_GET['file'];

10
welcome.php Normal file
View File

@ -0,0 +1,10 @@
<?php include 'header.php'; ?>
<center>
<br />
<br />
<br />
<img src="images/logo.jpg" /><br />
<br />
Use the menu to the left to navigate.
</center>