537 lines
16 KiB
PHP
537 lines
16 KiB
PHP
|
<?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
|
||
|
*/
|
||
|
|
||
|
/** 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
|
||
|
session_save_path("../../sess");
|
||
|
@session_start();
|
||
|
|
||
|
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>
|
||
|
</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==''?'clear':$enc_type); ?>" />
|
||
|
|
||
|
<br />
|
||
|
<input style="width: 260px"
|
||
|
type="password"
|
||
|
name="new_values[userpassword]"
|
||
|
value="<?php echo htmlspecialchars( $user_password ); ?>" />
|
||
|
|
||
|
<select name="enc_type">
|
||
|
<option>clear</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=='md5crypt'?' selected="true"':''; ?>>md5crypt</option>
|
||
|
<option<?php echo $enc_type=='blowfish'?' selected="true"':''; ?>>blowfish</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 ($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>";
|
||
|
?>
|