<?php /* $Id$ This code is part of LDAP Account Manager (http://www.sourceforge.net/projects/lam) This code is based on phpLDAPadmin. Copyright (C) 2004 David Smith and phpLDAPadmin developers The original code was modified to fit for LDAP Account Manager by Roland Gruber. Copyright (C) 2005 Roland Gruber This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /** * Displays the specified dn from the specified server for editing * * Variables that come in as GET vars: * - dn (rawurlencoded) * - modified_attrs (optional) an array of attributes to highlight as * they were changed by the last operation * * @package lists * @subpackage tree * @author David Smith * @author Roland Gruber */ /** security functions */ include_once('../../lib/security.inc'); /** tree functions */ include_once('../../lib/tree.inc'); /** access to configuration */ include_once('../../lib/config.inc'); /** LDAP functions */ include_once('../../lib/ldap.inc'); /** status messages */ include_once('../../lib/status.inc'); // start session startSecureSession(); setlanguage(); /** If an entry has more children than this, stop searching and display this amount with a '+' */ $max_children = 100; $dn = $_GET['dn']; $encoded_dn = rawurlencode( $dn ); $modified_attrs = isset( $_GET['modified_attrs'] ) ? $_GET['modified_attrs'] : false; $show_internal_attrs = isset( $_GET['show_internal_attrs'] ) ? true : false; if( null != $dn ) { $rdn = pla_explode_dn( $dn ); if( isset( $rdn[0] ) ) $rdn = $rdn[0]; else $rdn = null; } else { $rdn = null; } $attrs = get_object_attrs( $dn, false ); $system_attrs = get_entry_system_attrs( $dn ); dn_exists( $dn ) or StatusMessage('ERROR', _('No such entry!'), $dn); echo $_SESSION['header']; echo "<title>LDAP Account Manager</title>\n"; echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"../../style/layout.css\">\n"; echo "</head>\n"; ?> <body> <h3 class="tree_title"><?php echo htmlspecialchars( ( $rdn ) ); ?></h3> <h3 class="tree_subtitle"></b><?php echo _('DN');?>: <b><?php echo htmlspecialchars( ( $dn ) ); ?></b></h3> <table class="tree_edit_dn_menu"> <tr> <?php $time = gettimeofday(); $random_junk = md5( strtotime( 'now' ) . $time['usec'] ); ?> <td class="icon"><img src="../../graphics/refresh.png" /></td> <td><a href="edit.php?dn=<?php echo $encoded_dn; ?>&random=<?php echo $random_junk; ?>" title="<?php echo _('Refresh'); ?>"><?php echo _('Refresh'); ?></a></td> <?php if( $show_internal_attrs ) { ?> <td class="icon"><img src="../../graphics/tools-no.png" /></td> <td><a href="edit.php?dn=<?php echo $encoded_dn; ?>"><?php echo _('Hide internal attributes'); ?></a></td> <?php } else { ?> <td class="icon"><img src="../../graphics/tools.png" /></td> <td><a href="edit.php?dn=<?php echo $encoded_dn; ?>&show_internal_attrs=true"><?php echo _('Show internal attributes'); ?></a></td> <?php } ?> </tr> <tr> <td class="icon"><img src="../../graphics/delete.gif" /></td> <td><a style="color: red" href="delete_form.php?dn=<?php echo $encoded_dn; ?>"> <?php echo _('Delete'); ?></a></td> <td class="icon"><img src="../../graphics/save.png" /></td> <td><a href="export_form.php?dn=<?php echo $encoded_dn; ?>"> <?php echo _('Export'); ?></a></td> </tr> <tr> <td class="icon"><img src="../../graphics/light.png" /></td> <td colspan="3"><span class="tree_hint"><?php echo _('Hint: To delete an attribute, empty the text field and click save.'); ?></span></td> </tr> <tr> <td class="icon"><img src="../../graphics/star.png" /></td> <td><a href="<?php echo "create_form.php?container=$encoded_dn"; ?>"><?php echo _('Create new entry'); ?></a></td> <td class="icon"><img src="../../graphics/add.png" /></td> <td><a href="<?php echo "add_attr_form.php?dn=$encoded_dn"; ?>"><?php echo _('Add new attribute'); ?></a></td> </tr> <?php flush(); ?> <?php if( $modified_attrs ) { ?> <tr> <td class="icon"><img src="../../graphics/light.png" /></td> <?php if( count( $modified_attrs ) > 1 ) { ?> <td colspan="3"><?php echo sprintf( _('Some attributes (%s) were modified and are highlighted below.'), implode( ', ', $modified_attrs ) ); ?></td> <?php } else { ?> <td colspan="3"><?php echo sprintf( _('An attribute (%s) was modified and is highlighted below.'), implode( '', $modified_attrs ) ); ?></td> <?php } ?> </tr> <?php // lower-case all the modified attrs to remove ambiguity when searching the array later foreach( $modified_attrs as $i => $attr ) { $modified_attrs[$i] = strtolower( $attr ); } } ?> </table> <?php flush(); ?> <br /> <table class="tree_edit_dn"> <?php if( $show_internal_attrs ) { $counter = 0; foreach( get_entry_system_attrs( $dn ) as $attr => $vals ) { $counter++; $schema_href = "../schema/schema.php?view=attributes&viewvalue=" . real_attr_name($attr); ?> <tr> <td class="val"> <?php if( is_attr_binary( $attr ) ) { $href = "download_binary_attr.php?dn=$encoded_dn&attr=$attr"; ?> <small> <?php echo _('Binary value'); ?><br /> <?php if( count( $vals ) > 1 ) { for( $i=1; $i<=count($vals); $i++ ) { ?> <a href="<?php echo $href . "&value_num=$i"; ?>"><img src="../../graphics/save.png" /> <?php echo _('download value'); ?>(<?php echo $i; ?>)</a><br /> <?php } } else { ?> <a href="<?php echo $href; ?>"><img src="../../graphics/save.png" /> <?php echo _('download value'); ?></a><br /> <?php } } else { foreach( $vals as $v ) { echo htmlspecialchars( $v ); echo "<br />\n"; } } ?> </td> </tr> <?php } if( $counter == 0 ) echo "<tr><td colspan=\"2\">(" . _('No internal attributes') . ")</td></tr>\n"; } ?> <?php flush(); ?> <!-- Table of attributes/values to edit --> <form action="update_confirm.php" method="post" name="edit_form"> <input type="hidden" name="dn" value="<?php echo $dn; ?>" /> <?php $counter=0; ?> <?php if( ! $attrs || ! is_array( $attrs ) ) { echo "<tr><td colspan=\"2\">(" . _('This entry has no attributes') . ")</td></tr>\n"; echo "</table>"; echo "</html>"; die(); } uksort( $attrs, 'sortAttrs' ); foreach( $attrs as $attr => $vals ) { flush(); $schema_attr = get_schema_attribute( $attr, $dn ); if( $schema_attr ) $attr_syntax = $schema_attr->getSyntaxOID(); else $attr_syntax = null; if( 0 == strcasecmp( $attr, 'dn' ) ) continue; // Setup the $attr_note, which will be displayed to the right of the attr name (if any) $attr_note = ''; $attr_note = ""; $attr_display = $attr; // is this attribute required by an objectClass? $required_by = ''; if( $schema_attr ) foreach( $schema_attr->getRequiredByObjectClasses() as $required ) if( in_array( strtolower( $required ), arrayLower( $attrs['objectClass'] ) ) ) { $required_by .= $required . ' '; } if( $required_by ) { if( trim( $attr_note ) ) $attr_note .= ', '; $attr_note .= "<acronym title=\"" . sprintf( _('Required attribute for objectClass(es) %s'), $required_by ) . "\">" . _('required') . "</acronym> "; } ?> <?php if( is_array( $modified_attrs ) && in_array( strtolower($attr), $modified_attrs ) ) $is_modified_attr = true; else $is_modified_attr = false; ?> <?php if( $is_modified_attr ) { ?> <tr class="updated_attr"> <?php } else { ?> <tr> <?php } ?> <td class="attr"> <?php $schema_href="../schema/schema.php?view=attributes&viewvalue=" . real_attr_name($attr); ?> <b> <a href="<?php echo $schema_href; ?>"><?php echo $attr_display; ?></a></b> </td> <td class="attr_note"> <sup><small><?php echo $attr_note; ?></small></sup> </td> </tr> <?php if( $is_modified_attr ) { ?> <tr class="updated_attr"> <?php } else { ?> <tr> <?php } ?> <td class="val" colspan="2"> <?php /* * Is this attribute a jpegPhoto? */ if( is_jpeg_photo( $attr ) ) { draw_jpeg_photos( $dn, $attr, true ); // proceed to the next attribute echo "</td></tr>\n"; if( $is_modified_attr ) echo '<tr class="updated_attr"><td class="bottom" colspan="2"></td></tr>'; continue; } /* * Is this attribute binary? */ if( is_attr_binary( $attr ) ) { $href = "download_binary_attr.php?dn=$encoded_dn&attr=$attr"; ?> <small> <?php echo _('Binary value'); ?><br /> <?php if( count( $vals ) > 1 ) { for( $i=1; $i<=count($vals); $i++ ) { ?> <a href="<?php echo $href . "&value_num=$i"; ?>"><img src="../../graphics/save.png" /> <?php echo _('download value'); ?>(<?php echo $i; ?>)</a><br /> <?php } } else { ?> <a href="<?php echo $href; ?>"><img src="../../graphics/save.png" /> <?php echo _('download value'); ?></a><br /> <?php } ?> <a href="javascript:deleteAttribute( '<?php echo $attr; ?>' );" style="color:red;"><img src="../../graphics/delete.gif" /> <?php echo _('delete attribute'); ?></a> </small> </td> </tr> <?php if( $is_modified_attr ) echo '<tr class="updated_attr"><td class="bottom" colspan="2"></td></tr>'; continue; } /* * Note: at this point, the attribute must be text-based (not binary or jpeg) */ /* * Is this a userPassword attribute? */ if( 0 == strcasecmp( $attr, 'userpassword' ) ) { $user_password = $vals[0]; $enc_type = get_enc_type( $user_password ); ?> <input type="hidden" name="old_values[userpassword]" value="<?php echo htmlspecialchars($user_password); ?>" /> <!-- Special case of enc_type to detect changes when user changes enc_type but not the password value --> <input size="38" type="hidden" name="old_enc_type" value="<?php echo ($enc_type==''?'PLAIN':$enc_type); ?>" /> <br /> <input style="width: 260px" type="password" name="new_values[userpassword]" value="<?php echo htmlspecialchars( $user_password ); ?>" /> <select name="enc_type"> <option>PLAIN</option> <option<?php echo $enc_type=='CRYPT'?' selected="true"':''; ?>>CRYPT</option> <option<?php echo $enc_type=='MD5'?' selected="true"':''; ?>>MD5</option> <option<?php echo $enc_type=='SMD5'?' selected="true"':''; ?>>SMD5</option> <option<?php echo $enc_type=='SHA'?' selected="true"':''; ?>>SHA</option> <option<?php echo $enc_type=='SSHA'?' selected="true"':''; ?>>SSHA</option> </select> <br /> </td></tr> <?php if( $is_modified_attr ) echo '<tr class="updated_attr"><td class="bottom" colspan="2"></td></tr>'; continue; } /* * Is this a boolean attribute? */ if( is_attr_boolean( $attr) ) { $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' : ''); ?>> <?php echo _('true'); ?></option> <option value="FALSE"<?php echo ($val=='FALSE' ? ' selected' : ''); ?>> <?php echo _('false'); ?></option> <option value="">(<?php echo _('none, remove value'); ?>)</option> </select> </td> </tr> <?php if( $is_modified_attr ) echo '<tr class="updated_attr"><td class="bottom" colspan="2"></td></tr>'; continue; } /* * End of special case attributes (non plain text). */ /* * This is a plain text attribute, to be displayed and edited in plain text. */ foreach( $vals as $i => $val ) { $input_name = "new_values[" . htmlspecialchars( $attr ) . "][$i]"; // We smack an id="..." tag in here that doesn't have [][] in it to allow the // draw_chooser_link() to identify it after the user clicks. $input_id = "new_values_" . htmlspecialchars($attr) . "_" . $i; ?> <!-- The old_values array will let update.php know if the entry contents changed between the time the user loaded this page and saved their changes. --> <input type="hidden" name="old_values[<?php echo htmlspecialchars( $attr ); ?>][<?php echo $i; ?>]" value="<?php echo htmlspecialchars($val); ?>" /> <?php // Is this value is a structural objectClass, make it read-only if( 0 == strcasecmp( $attr, 'objectClass' ) ) { ?> <a href="../schema/schema.php?view=objectClasses&viewvalue=<?php echo htmlspecialchars( $val ); ?>"><img src="../../graphics/tree_info.png" /></a> <?php $schema_object = get_schema_objectclass( $val); if (is_object($schema_object) && $schema_object->type == 'structural') { echo "$val <small>(<acronym>" . _('structural') . "</acronym>)</small><br />"; ?> <input type="hidden" name="<?php echo $input_name; ?>" id="<?php echo $input_id; ?>" value="<?php echo htmlspecialchars($val); ?>" /> <?php continue; } } ?> <?php if( is_mail_string( $val ) ) { ?> <a href="mailto:<?php echo htmlspecialchars($val); ?>"><img style="vertical-align: center" src="../../graphics/mail.png" /></a> <?php } elseif( is_url_string( $val ) ) { ?> <a href="<?php echo htmlspecialchars($val); ?>" target="new"><img style="vertical-align: center" src="../../graphics/dc.png" /></a> <?php } ?> <?php if( is_multi_line_attr( $attr, $val ) ) { ?> <textarea class="val" rows="3" cols="50" name="<?php echo $input_name; ?>" id="<?php echo $input_id; ?>"><?php echo htmlspecialchars($val); ?></textarea> <?php } else { ?> <input type="text" class="val" name="<?php echo $input_name; ?>" id="<?php echo $input_id; ?>" value="<?php echo htmlspecialchars($val); ?>" /> <?php } ?> <?php ?> <br /> <?php } /* end foreach value */ ?> <?php /* Draw the "add value" link under the list of values for this attributes */ if( ( $schema_attr = get_schema_attribute( $attr, $dn ) ) && ! $schema_attr->getIsSingleValue() ) { $add_href = "add_value_form.php?dn=$encoded_dn&attr=" . rawurlencode( $attr ); echo "<div class=\"add_value\">(<a href=\"$add_href\">" . _('add value') . "</a>)</div>\n"; } ?> </td> </tr> <?php if( $is_modified_attr ) { ?> <tr class="updated_attr"><td class="bottom" colspan="2"></td></tr> <?php } ?> <?php flush(); } /* End foreach( $attrs as $attr => $vals ) */ ?> <tr><td colspan="2"><center><input type="submit" value="<?php echo _('Save'); ?>" /></center></td></tr></form> <?php ?> </table> <?php /* If this entry has a binary attribute, we need to provide a form for it to submit when deleting it. */ ?> <script language="javascript"> //<!-- function deleteAttribute( attrName ) { if( confirm( "<?php echo _('Really delete attribute?'); ?> '" + attrName + "'" ) ) { document.delete_attribute_form.attr.value = attrName; document.delete_attribute_form.submit(); } } //--> </script> <!-- This form is submitted by JavaScript when the user clicks "Delete attribute" on a binary attribute --> <form name="delete_attribute_form" action="delete_attr.php" method="post"> <input type="hidden" name="dn" value="<?php echo $dn; ?>" /> <input type="hidden" name="attr" value="FILLED IN BY JAVASCRIPT" /> </form> <?php echo "</body>\n</html>"; ?>