This commit is contained in:
Timothy Warren 2019-02-08 13:44:52 -05:00
commit c985215714
615 changed files with 47872 additions and 0 deletions

3
.gitignore vendored Normal file
View File

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

23
INSTALL Normal file
View File

@ -0,0 +1,23 @@
For install instructions in non-English languages, see the wiki:
http://phpldapadmin.sourceforge.net
* Requirements
phpLDAPadmin requires the following:
a. A web server (Apache, IIS, etc).
b. PHP 5.0.0 or newer (with LDAP support)
* To install
1. Unpack the archive (if you're reading this, you already did that).
2. Put the resulting 'phpldapadmin' directory somewhere in your webroot.
3. Copy 'config.php.example' to 'config.php' and edit to taste (this is in the config/ directory).
4. Then, point your browser to the phpldapadmin directory.
* For additional help
See the wiki:
http://phpldapadmin.sourceforge.net
Join our mailing list:
https://lists.sourceforge.net/lists/listinfo/phpldapadmin-devel

341
LICENSE Normal file
View File

@ -0,0 +1,341 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

1
VERSION Normal file
View File

@ -0,0 +1 @@
RELEASE-1.2.3

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

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

View File

@ -0,0 +1,2 @@
Please see http://phpldapadmin.sourceforge.net/Translate now for information on
translating PLA.

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

File diff suppressed because it is too large Load Diff

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

@ -0,0 +1,17 @@
-----BEGIN CERTIFICATE-----
MIICtTCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQQFADBMMQswCQYDVQQGEwJHQjES
MBAGA1UECBMJQmVya3NoaXJlMRAwDgYDVQQHEwdOZXdidXJ5MRcwFQYDVQQKEw5N
eSBDb21wYW55IEx0ZDAeFw0wNTA5MTUwMjAyMTNaFw0yMTA3MjYxNjM2NTNaMEwx
CzAJBgNVBAYTAkdCMRIwEAYDVQQIEwlCZXJrc2hpcmUxEDAOBgNVBAcTB05ld2J1
cnkxFzAVBgNVBAoTDk15IENvbXBhbnkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GN
ADCBiQKBgQCr6PfdngYTUobwJDwIqY7ywDCWd/IJ+SL2hbe46558oVI7Vw2GbqWn
VZ1fJa0wV2pcy/e10HzZX+RpIwKOZUQvbH1jHJyZ/0bt7on8jmI5o+p+rLVspci5
yVNcgu1tQttpyKnTrDSDkLVbQ6VX8FKLnKnZ7+dk8SNibt0KbzKnOQIDAQABo4Gm
MIGjMB0GA1UdDgQWBBQ4xLvszjgfXgWht8V6s1eRAZS/OjB0BgNVHSMEbTBrgBQ4
xLvszjgfXgWht8V6s1eRAZS/OqFQpE4wTDELMAkGA1UEBhMCR0IxEjAQBgNVBAgT
CUJlcmtzaGlyZTEQMA4GA1UEBxMHTmV3YnVyeTEXMBUGA1UEChMOTXkgQ29tcGFu
eSBMdGSCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAgzaIKI03l
lZmX7IpLN3vqC/PL6QQTUQkdDRXJYGH+DdURx7v0nE/kkb3R3X92BpNxe5jywhHg
A5NaUhjAR76+F3Guk/4XFaWPctJ2PvfJWolS/VrY+KGc3N4zz9A2i8B6SHBzE6V8
EHkcGJtGXkFvCVp1ZbCyejJhw4PUEYawsQ==
-----END CERTIFICATE-----

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

@ -0,0 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCr6PfdngYTUobwJDwIqY7ywDCWd/IJ+SL2hbe46558oVI7Vw2G
bqWnVZ1fJa0wV2pcy/e10HzZX+RpIwKOZUQvbH1jHJyZ/0bt7on8jmI5o+p+rLVs
pci5yVNcgu1tQttpyKnTrDSDkLVbQ6VX8FKLnKnZ7+dk8SNibt0KbzKnOQIDAQAB
AoGAdfKYpag3WOiFhpwFyJe1aV5tt79CBI+36lZicHDQw4fXqLkYoYSnCYFXQSHT
ithfNJ4JLeiG0InXaD9KELLwLU2C7rr7mgOBczzmVBGCYUDNuV3bMcNDOQk/drum
GLGqHhxU6W0dlCUnoBZoEHK6dvtDZnxCa+cUBozvFbuLOTUCQQDZJf+Mz7vc78nn
Cc7nnHFfO+79NQi9h0ydW6kb2LLSGB/f3oqwary8eqCs7RVinG21PMWbjrh0lGOJ
DjYP6dLDAkEAyqrs8pgxcxSTcJiaU4/sxGCeaS4fvoeCbYvKLlS5k5Km6DmA3nY+
KwxQyLHg64g1ImDSuLy3P/E2lZGCPhZGUwJAMVUxpqL3Mi2D+CpBSFtBYnpyRDJN
Rwm6/TD6zWnAznxOmYSsi4HkWQmfAUpnhly1i+w/lKSrAUlJB7Uj0R+1EwJAOADv
pUIFOCXRcGXbD4hQBxwj6jDCuOW9VwQwBImJFoyJ7tYlFFRcbYzjrfHpk2x6MlvL
Hx2XDeZcDQy+juWc3QJAHOpmlHuWqS07i5UIXVl5ohhoWkFd9Qs7/TowyFQF3zpO
BqnwfHZRpySjSUlNE0QpoJRJQPq7p3BWtS3PWMj0/A==
-----END RSA PRIVATE KEY-----

18
doc/demo-reset.sh Normal file
View File

@ -0,0 +1,18 @@
#!/bin/sh
for i in $(grep directory phpldapadmin-demo.conf|awk '{print $2}'); do
if [ -d $i ]; then
rm -f $i/*.dbb $i/*.bdb $i/__db.??? $i/alock $i/log.*
else
mkdir $i
fi
done
slapadd -b "dc=example.com" -l ldif-example.com
slapadd -b "dc=example,dc=com" -l ldif-example-com
slapadd -b "o=Simpsons" -l ldif-Simpsons
slapadd -b "o=Flintstones" -l ldif-Flintstones
for i in $(grep directory phpldapadmin-demo.conf|awk '{print $2}'); do
chown -R ldap:ldap $i
done

992
doc/ldif-Flintstones Normal file
View File

@ -0,0 +1,992 @@
# LDIF Export for o=Flintstones
# Server: C5: OpenLDAP 2.3.27: config (c5dev.leenooks.vpn)
# Search Scope: sub
# Search Filter: (objectClass=*)
# Total Entries: 12
#
# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on April 26, 2011 9:03 pm
# Version: 1.2.0.5
#version: 1
# Entry 1: o=Flintstones
dn: o=Flintstones
o: Flintstones
objectclass: organization
objectclass: top
# Entry 2: cn=Flintstones-PG,o=Flintstones
dn: cn=Flintstones-PG,o=Flintstones
cn: flintstones-pg
gidnumber: 1001
objectclass: posixGroup
objectclass: top
# Entry 3: ou=People,o=Flintstones
dn: ou=People,o=Flintstones
objectclass: organizationalUnit
objectclass: top
ou: People
# Entry 4: cn=Bamm Bamm Rubble,ou=People,o=Flintstones
dn: cn=Bamm Bamm Rubble,ou=People,o=Flintstones
cn: Bamm Bamm Rubble
gidnumber: 1001
givenname: Bamm Bamm
homedirectory: /home/users/flintstones/bammbamm
jpegphoto:: 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
s9UUUV6eBRRRQH/9k=
l: Bedrock
loginshell: /bin/sh
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: Rubble
uid: bammbamm
uidnumber: 1105
userpassword: bammbamm
# Entry 5: cn=Barney Rubble,ou=People,o=Flintstones
dn: cn=Barney Rubble,ou=People,o=Flintstones
cn: Barney Rubble
gidnumber: 1001
givenname: Barney
homedirectory: /home/users/flintstones/barney
jpegphoto:: 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
l: Bedrock
loginshell: /bin/sh
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: Rubble
uid: barney
uidnumber: 1102
# Entry 6: cn=Betty Rubble,ou=People,o=Flintstones
dn: cn=Betty Rubble,ou=People,o=Flintstones
cn: Betty Rubble
gidnumber: 1001
givenname: Betty
homedirectory: /home/users/flintstones/betty
jpegphoto:: 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
l: Bedrock
loginshell: /bin/sh
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: Rubble
uid: betty
uidnumber: 1103
# Entry 7: cn=Fred Flintstone,ou=People,o=Flintstones
dn: cn=Fred Flintstone,ou=People,o=Flintstones
cn: Fred Flintstone
gidnumber: 1001
givenname: Fred
homedirectory: /home/users/flintstones/fred
jpegphoto:: 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
EFZAKtieQxViUpTVjGsGGjRQnOLjkpSlK9LC/9k=
l: Bedrock
loginshell: /bin/sh
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: Flintstone
st: 345 Stonecave Road
uid: fred
uidnumber: 1100
userpassword: yabbadabbado
# Entry 8: cn=Pebbles Flintstone,ou=People,o=Flintstones
dn: cn=Pebbles Flintstone,ou=People,o=Flintstones
cn: Pebbles Flintstone
gidnumber: 1001
givenname: Pebbles
homedirectory: /home/users/flintstones/pebbles
jpegphoto:: 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
l: Bedrock
loginshell: /bin/sh
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: Flintstone
st: 345 Stonecave Road
uid: pebbles
uidnumber: 1104
# Entry 9: cn=Wilma Flintstone,ou=People,o=Flintstones
dn: cn=Wilma Flintstone,ou=People,o=Flintstones
cn: Wilma Flintstone
gidnumber: 1001
givenname: Wilma
homedirectory: /home/users/flintstones/wilma
jpegphoto:: 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
pHOaGnZKUpWizSlKUIX//Z
l: Bedrock
loginshell: /bin/sh
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: Flintstone
st: 345 Stonecave Road
uid: wilma
uidnumber: 1101
userpassword: pebble
# Entry 10: ou=Pets,o=Flintstones
dn: ou=Pets,o=Flintstones
objectclass: organizationalUnit
objectclass: top
ou: Pets
# Entry 11: cn=Baby Puss Flintstone,ou=Pets,o=Flintstones
dn: cn=Baby Puss Flintstone,ou=Pets,o=Flintstones
cn: Baby Puss Flintstone
gidnumber: 1001
givenname: Baby Puss
homedirectory: /home/users/flintstones/babypuss
jpegphoto:: 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
zklF+QxU4BWaKltZeIooor1C//9k=
l: Bedrock
loginshell: /bin/sh
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: Flintstone
uid: babypuss
uidnumber: 1010
# Entry 12: cn=Hoppy Rubble,ou=Pets,o=Flintstones
dn: cn=Hoppy Rubble,ou=Pets,o=Flintstones
cn: Hoppy Rubble
gidnumber: 1001
givenname: Hoppy
homedirectory: /home/users/flintstones/hoppy
jpegphoto:: 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
iqfxArbpSvESlKURKUpRF//Z
l: Bedrock
loginshell: /bin/sh
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: Rubble
uid: hoppy
uidnumber: 1009

496
doc/ldif-Simpsons Normal file
View File

@ -0,0 +1,496 @@
# LDIF Export for o=Simpsons
# Server: C5: OpenLDAP 2.3.27: config (c5dev.leenooks.vpn)
# Search Scope: sub
# Search Filter: (objectClass=*)
# Total Entries: 11
#
# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on April 26, 2011 9:05 pm
# Version: 1.2.0.5
#version: 1
# Entry 1: o=Simpsons
dn: o=Simpsons
o: Simpsons
objectclass: organization
objectclass: top
# Entry 2: cn=Simpsons-GOUN,o=Simpsons
dn: cn=Simpsons-GOUN,o=Simpsons
cn: simpsons-goun
objectclass: groupOfUniqueNames
objectclass: top
uniquemember: cn=Bart Simpson,ou=People,o=Simpsons
uniquemember: cn=Homer Simpson,ou=People,o=Simpsons
uniquemember: cn=Lisa Simpson,ou=People,o=Simpsons
uniquemember: cn=Maggie Simpson,ou=People,o=Simpsons
uniquemember: cn=Marge Simpson,ou=People,o=Simpsons
# Entry 3: cn=Simpsons-PG,o=Simpsons
dn: cn=Simpsons-PG,o=Simpsons
cn: simpsons-pg
gidnumber: 1000
memberuid: maggie
memberuid: marg
memberuid: lisa
memberuid: homer
memberuid: bart
objectclass: posixGroup
objectclass: top
# Entry 4: ou=People,o=Simpsons
dn: ou=People,o=Simpsons
objectclass: organizationalUnit
objectclass: top
ou: People
# Entry 5: cn=Bart Simpson,ou=People,o=Simpsons
dn: cn=Bart Simpson,ou=People,o=Simpsons
cn: Bart Simpson
gidnumber: 1000
givenname: Bart
homedirectory: /home/users/simpsons/bart
jpegphoto:: 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
l: Springfield
mail: bart.simpson@example.com
o: The Simpsons
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
objectclass: shadowAccount
sn: Simpson
st: 742 Evergreen Terrace
telephonenumber: +1 939 555 3126
uid: bart
uidnumber: 1000
userpassword: eatmyshorts
# Entry 6: cn=Homer Simpson,ou=People,o=Simpsons
dn: cn=Homer Simpson,ou=People,o=Simpsons
cn: Homer Simpson
gidnumber: 1000
givenname: Homer
homedirectory: /home/users/simpsons/homer
jpegphoto:: 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
l: Springfield
mail: homer.simpson@example.com
o: The Simpsons
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
objectclass: shadowAccount
sn: Simpson
st: 742 Evergreen Terrace
telephonenumber: +1 939 555 3126
uid: homer
uidnumber: 1001
userpassword: mmm.beer
# Entry 7: cn=Lisa Simpson,ou=People,o=Simpsons
dn: cn=Lisa Simpson,ou=People,o=Simpsons
cn: Lisa Simpson
gidnumber: 1000
givenname: Lisa
homedirectory: /home/users/simpsons/lisa
jpegphoto:: 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
zt1Zj1J/wDtsTcHQxCJtll8Rr3105kOg4DkF//Z
l: Springfield
mail: lisa.simpson@example.com
o: The Simpsons
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
objectclass: shadowAccount
sn: Simpson
st: 742 Evergreen Terrace
telephonenumber: +1 939 555 3126
uid: lisa
uidnumber: 1002
userpassword: brains
# Entry 8: cn=Maggie Simpson,ou=People,o=Simpsons
dn: cn=Maggie Simpson,ou=People,o=Simpsons
cn: Maggie Simpson
gidnumber: 1000
givenname: Maggie
homedirectory: /home/users/simpsons/maggie
jpegphoto:: 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
l: Springfield
mail: maggie.simpson@example.com
o: The Simpsons
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
objectclass: shadowAccount
sn: Simpson
st: 742 Evergreen Terrace
telephonenumber: +1 939 555 3126
uid: maggie
uidnumber: 1003
userpassword: dummy
# Entry 9: cn=Marge Simpson,ou=People,o=Simpsons
dn: cn=Marge Simpson,ou=People,o=Simpsons
cn: Marge Simpson
gidnumber: 1000
givenname: Marge
homedirectory: /home/users/simpsons/marge
jpegphoto:: R0lGODlhhABwAIcAAAAAAAICBQIEAgUFAQUFBAICCwYICw4EBAsJAgkJCAgJDQ4N
CA0NDQECEgEDGwsMEA4QDhMEAhILAhANARANBBYODhwCARoJARMQAhIQBBURARQRBBcVAhIQCBE
QDRQSDhgSABkUARwTARwVAB0YARISERsbGwIEIgIEKgEENAAEPAQINAQIOiMBASwCAiIbATUDAz
0CAicgAiogASsjBCskAS0jAS0kAS4oBTEnATQqAjkuATswAz0xATwxBj80BCIiIikpKS8vLzQ0N
Dk5OT09PQIFQwEGTAQJRAMITQEFUQEGWwMIUwMIWgIIYwIIbAAGcQAGfwEIdAEIfEICAksBAVIB
AV8AAEAzAUE1AUU2AUU3BEU4AUw8AVA+AWEBAWsCAnIBAXwBAU5ABFRDAlhGAVxHAltJAWFNAWB
NBGJQBGVRAmpUAW1YAW1YBHFZAHFaBHFcAnRaAnVdAXVeBHleAHdgAntiAURERElJSU1NTVJSUl
lZWV1dXWFhYWVlZWxsbHJycnV1dXt7ewAIg4QBAYwBAZIAAJsCAqICAqsCArQDA7sCAoFlAYRpA
ohqAIptAIxuAo1wApN0AZZ5Bph3AJp7AaB/AYF/f8ECAssBAdMEBNwBAeICAuwBAfIBAf4AAJ6A
AqGAAaODBKaCAKSCBKaEAKqGAayHAK2JAbKMAraRAruTAcKZAcOaBMadAMidAMqgAsugBM2hAc6
iBM6kAtGlAdOoAdqsAdyuAd6wAOCuAOCxAOK0AOS1AOi3AOm5AO27AO+9AIKCgoWFhYuLi42NjZ
KSkpycnIyapI6cpZCdp5GfqJajrJyosKOjo6qqqqWwt6WwuK23vrS0tLm5ub6+vrnCyLzEysPDw
8DHzcjIyM3NzcTL0MXM0cjO08nQ1NPT09DW2tfb39fc39jY2N3d3dzg497i5d/k5uHh4eDj5uDk
5uXl5eHl6OTn6eXo6ufq7Onp6ers7uzs7Ovt8O3u8O3w8fHx8fHz9PP19vX19ff4+Pn5+f39/QA
AACH5BAAAAP8ALAAAAACEAHAAAAj/AAEIHEiwoMGDCBMqXMiwocOHDf1JnEixosWL/p41mEKoo8
ePIEOKHEmyZEgUgzCqXIlRIMuXF/2gMEmzpk2TUhjQg8nzosuePPGVcHKzqNGaKI4BXervJ9OV+
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
lBDxlFAZlVI5lVIZEAA7
l: Springfield
mail: marge.simpson@example.com
o: The Simpsons
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
objectclass: shadowAccount
sn: Simpson
st: 742 Evergreen Terrace
telephonenumber: +1 939 555 3126
uid: marge
uidnumber: 1004
userpassword: homie
# Entry 10: ou=Pets,o=Simpsons
dn: ou=Pets,o=Simpsons
objectclass: organizationalUnit
objectclass: top
ou: Pets
# Entry 11: cn=Santas Little Helper,ou=Pets,o=Simpsons
dn: cn=Santas Little Helper,ou=Pets,o=Simpsons
cn: Santas Little Helper
givenname: Santas Little Helper
jpegphoto:: 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
0rJcGRsMDnOT1q10pXgAAwJ6SScmf//Z
l: Springfield
o: The Simpsons
objectclass: inetOrgPerson
objectclass: top
sn: Simpson
st: 742 Evergreen Terrace
telephonenumber: +1 939 555 3126

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

@ -0,0 +1,139 @@
# LDIF Export for dc=example,dc=com
# Server: C5: OpenLDAP 2.3.27: config (c5dev.leenooks.vpn)
# Search Scope: sub
# Search Filter: (objectClass=*)
# Total Entries: 15
#
# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on April 26, 2011 9:25 pm
# Version: 1.2.0.5
#version: 1
# Entry 1: dc=example,dc=com
dn: dc=example,dc=com
dc: example
objectclass: dNSDomain
# Entry 2: c=AU,dc=example,dc=com
dn: c=AU,dc=example,dc=com
c: AU
description: Australia
objectclass: country
objectclass: top
# Entry 3: c=CN,dc=example,dc=com
dn: c=CN,dc=example,dc=com
c: CN
objectclass: country
objectclass: top
# Entry 4: cn=你好,c=CN,dc=example,dc=com
dn:: Y2495L2g5aW9LGM9Q04sZGM9ZXhhbXBsZSxkYz1jb20=
cn:: 5L2g5aW9
gidnumber: 200
objectclass: posixGroup
objectclass: top
# Entry 5: c=DE,dc=example,dc=com
dn: c=DE,dc=example,dc=com
c: DE
description: Germany
objectclass: country
objectclass: top
# Entry 6: c=ES,dc=example,dc=com
dn: c=ES,dc=example,dc=com
c: ES
objectclass: country
objectclass: top
# Entry 7: c=FR,dc=example,dc=com
dn: c=FR,dc=example,dc=com
c: FR
description: France
objectclass: country
objectclass: top
# Entry 8: c=GB,dc=example,dc=com
dn: c=GB,dc=example,dc=com
c: GB
description: Great Britain
objectclass: country
objectclass: top
# Entry 9: c=IT,dc=example,dc=com
dn: c=IT,dc=example,dc=com
c: IT
objectclass: country
objectclass: top
# Entry 10: c=NO,dc=example,dc=com
dn: c=NO,dc=example,dc=com
c: NO
description: Norway
objectclass: country
objectclass: top
# Entry 11: c=RU,dc=example,dc=com
dn: c=RU,dc=example,dc=com
c: RU
objectclass: country
objectclass: top
# Entry 12: cn=Человеки,c=RU,dc=example,dc=com
dn:: Y2490KfQtdC70L7QstC10LrQuCxjPVJVLGRjPWV4YW1wbGUsZGM9Y29t
cn:: 0KfQtdC70L7QstC10LrQuA==
objectclass: inetOrgPerson
objectclass: top
sn:: 0KfQtdC70L7QstC10LrQuA==
# Entry 13: cn=Дед Логопед,cn=Человеки,c=RU,dc=example,...
dn:: Y2490JTQtdC0INCb0L7Qs9C+0L/QtdC0LGNuPdCn0LXQu9C+0LLQtdC60LgsYz1SVSxkYz1
leGFtcGxlLGRjPWNvbQ==
cn:: 0JTQtdC0INCb0L7Qs9C+0L/QtdC0
givenname:: 0JTQtdC0
jpegphoto:: /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoH
BwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQk
UDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wA
ARCAAwAEADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAA
gEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcY
GRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipK
TlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8v
P09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFB
AQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygp
KjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJm
aoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9
oADAMBAAIRAxEAPwD9A/gj8Nx8IvhN4V8KPKsr6PpkNnJIv3WZV+Y/QnNc/wCINDutR1Q/Mux2y
xHTFeTaP+17d+IfDN94w02ODW/ANsF+0apZKZHtHOMxyKPmDDK8Ed69G8IfEHR/ij4aTxD4cv47
60VMkxEjacdGBAKn2IoA5Txn4KuIzO0v+rToyDjmvlL486HBb2jhdzEdNvrzXtvxB+NsNjeXdpF
M7JFlQpbv6GvlD4qfE6/1Ca4nktWkgI24Tkd+goA+b/ESSRXkoJIwejCuWuZFfOQAfUV1HiC9vN
VuGmj064RJOjvC4HHpxXGXwntZT50Tp6FlIoAy9UQLE5A7VzDJ5h/Guj1aUi1ZvXisTyTGuDwR1
oA/cX/gnT8CPFfwl/Z21nR/Gugpo9/rOpSXS6df7XdrdoUQCZATtJKt8p5xjPWvefh98HdE8D3d
3qcNnb2lzPGYXisVaO2EI6IIySOPWvRulYXjjWYvD/hLVdQmfy4oLd3ZvQAUAfjx+0H42kHxR8T
Lajybdb2VY4lPAAY4FefeGbx9Q1yzlu7f+0rbdmSEt8x9QAeK1PiQi614n1LUlbi4neXn3Ymud0
m9l0G6jlVC6E5OOoPqKAIPFPhq88O+Mr7V9J1i/trC4kMyWaiRHyf4Sn3BjpnJGKpT6yNe0lk1W
0jN2DgTBAN49T716NqOrXXiC1807dm3rIcV5j4mb7KrZYbsHkUAeW+JIEt7hIYwCqtvwPb/ACKw
XBySec1v39nPc3DTshCNwmR1HrVGfT2jIJHFAH9GkfxQspdds7KKOWaGZtr3CITHEMcMzdAM4/O
uR/aP1qLXPhtqOiaVdQzXV4hQ/PhQMcknFeXeAdRnSzRxG88UxGx9mVJPTnHGcGuk1+4h1LSnij
RHkYlVjk4kVvQHHrQB+f8A4m/Zy8Y380kOnapokEZGS91cvk+wAQ1zq/svfEC5/cp4i0O2KHaR5
UzsT/3yM19ea9aW8R3y3ElndKSWhdBtkB6HBxj6g1w+tarcxRRXLxS3mmxuE3ohCA9SNwwwP1oA
8Ksv2WvHGAl143s40xjba6cznn/eYVFrX7LRuYUjbxa817nkTWB2MPqrEj9a9jXxZqt4DEkqoVb
93DKN3b+8MEHjjI9Kq6j421mwSNL64ESSqytuYOj+gYdvqKAPAvF/wOv9EtR5z2tyEG3fDuX9GU
YryPXfB15axs62ryxhtu+Ebxn6rmvpXW9cilF00+piYDO17cOVK9Mc9vqO1eQ+LNVSOd3g3NAvJ
MmUJ+vP9aAP/9k=
objectclass: inetOrgPerson
objectclass: top
sn:: 0JvQvtCz0L7Qv9C10LQ=
# Entry 14: c=SE,dc=example,dc=com
dn: c=SE,dc=example,dc=com
c: SE
objectclass: country
objectclass: top
# Entry 15: c=US,dc=example,dc=com
dn: c=US,dc=example,dc=com
c: US
description: United States of America
objectclass: country
objectclass: top

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

@ -0,0 +1,165 @@
# LDIF Export for dc=example.com
# Server: C5: OpenLDAP 2.3.27: config (c5dev.leenooks.vpn)
# Search Scope: sub
# Search Filter: (objectClass=*)
# Total Entries: 23
#
# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on April 26, 2011 9:13 pm
# Version: 1.2.0.5
#version: 1
# Entry 1: dc=example.com
dn: dc=example.com
dc: example.com
objectclass: dNSDomain
# Entry 2: cn=group,dc=example.com
dn: cn=group,dc=example.com
cn: group
gidnumber: 100
objectclass: posixGroup
objectclass: top
# Entry 3: ou=Bad DNs,dc=example.com
dn: ou=Bad DNs,dc=example.com
objectclass: organizationalUnit
ou: Bad DNs
# Entry 4: c=double plus \2B\2B,ou=Bad DNs,dc=example.com
dn: c=double plus \2B\2B,ou=Bad DNs,dc=example.com
c: double plus ++
objectclass: country
# Entry 5: c=end dollar$,ou=Bad DNs,dc=example.com
dn: c=end dollar$,ou=Bad DNs,dc=example.com
c: end dollar$
objectclass: country
# Entry 6: sn=sign@at+uid=multi-mixed,ou=Bad DNs,dc=example.com
dn: sn=sign@at+uid=multi-mixed,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: sign@at
uid: multi-mixed
# Entry 7: uid=angle\3Cleft,ou=Bad DNs,dc=example.com
dn: uid=angle\3Cleft,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: angle<left
# Entry 8: uid=angle\3Eright,ou=Bad DNs,dc=example.com
dn: uid=angle\3Eright,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: angle>right
# Entry 9: uid=brace(left,ou=Bad DNs,dc=example.com
dn: uid=brace(left,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: brace(left
# Entry 10: uid=brace)right,ou=Bad DNs,dc=example.com
dn: uid=brace)right,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: brace)right
# Entry 11: uid=colon:full,ou=Bad DNs,dc=example.com
dn: uid=colon:full,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: colon:full
# Entry 12: uid=colon\3Bsemi,ou=Bad DNs,dc=example.com
dn: uid=colon\3Bsemi,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: colon;semi
# Entry 13: uid=multi+uid=sign@at,ou=Bad DNs,dc=example.com
dn: uid=multi+uid=sign@at,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: multi
uid: sign@at
# Entry 14: uid=multi+uid=value,ou=Bad DNs,dc=example.com
dn: uid=multi+uid=value,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: multi
uid: value
# Entry 15: uid=quote\22double,ou=Bad DNs,dc=example.com
dn: uid=quote\22double,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: quote"double
# Entry 16: uid=quote'single,ou=Bad DNs,dc=example.com
dn: uid=quote'single,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: quote'single
# Entry 17: uid=sign%percent,ou=Bad DNs,dc=example.com
dn: uid=sign%percent,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: sign%percent
# Entry 18: uid=sign\2Bplus,ou=Bad DNs,dc=example.com
dn: uid=sign\2Bplus,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: sign+plus
# Entry 19: uid=sign\2Ccomma,ou=Bad DNs,dc=example.com
dn: uid=sign\2Ccomma,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: sign,comma
# Entry 20: uid=sign\3Bsemicolon@at,ou=Bad DNs,dc=example.com
dn: uid=sign\3Bsemicolon@at,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: sign;semicolon@at
# Entry 21: uid=sign\3Dequal,ou=Bad DNs,dc=example.com
dn: uid=sign\3Dequal,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: sign=equal
# Entry 22: uid=sign?question,ou=Bad DNs,dc=example.com
dn: uid=sign?question,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: sign?question
# Entry 23: uid=sign@at,ou=Bad DNs,dc=example.com
dn: uid=sign@at,ou=Bad DNs,dc=example.com
cn: Test
objectclass: inetOrgPerson
sn: Test
uid: sign@at

107
doc/phpldapadmin-demo.conf Normal file
View File

@ -0,0 +1,107 @@
include /etc/openldap/schema/uidpool.schema
include /etc/openldap/schema/sudo.schema
include /etc/openldap/schema/autofs.schema
TLSCACertificateFile /etc/openldap/pla/ca-bundle.crt
TLSCertificateFile /etc/openldap/pla/slapd.crt
TLSCertificateKeyFile /etc/openldap/pla/slapd.key
access to dn.regex="o=Simpsons$" attrs=userpassword
by anonymous auth
by self write
by * none
access to dn.base="" by * read
access to dn.regex="dc=example.com$"
by dn.regex="o=Flintstones$" none
by dn.regex="o=Simpsons$" none
by * write
access to dn.regex="dc=example,dc=com$"
by dn.regex="o=Flintstones$" none
by dn.regex="o=Simpsons$" none
by * write
access to dn.regex="o=Flintstones$"
by dn.regex="o=Simpsons$" none
by self write
by dn.regex="cn=.*,ou=People,o=Flintstones" write
by * read
access to dn.regex="o=Simpsons$"
by dn.regex="o=Flintstones$" none
by self write
by dn.regex="cn=.*,ou=People,o=Simpsons" write
by * read
access to *
by * read
authz-policy any
database ldbm
suffix "dc=example.com"
rootdn "cn=Manager,dc=example.com"
rootpw NotAllowed
directory /var/lib/ldap/base-example.com
dirtyread
cachesize 2000
checkpoint 32 1
# Indices to maintain for this database
index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell eq,pres
index uid,memberUid eq,pres,sub
index nisMapName,nisMapEntry eq,pres,sub
database ldbm
suffix "dc=example,dc=com"
rootdn "cn=Manager,dc=example,dc=com"
rootpw NotAllowed
directory /var/lib/ldap/base-example-com
dirtyread
cachesize 2000
checkpoint 32 1
# Indices to maintain for this database
index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell eq,pres
index uid,memberUid eq,pres,sub
index nisMapName,nisMapEntry eq,pres,sub
database ldbm
suffix "o=Simpsons"
rootdn "cn=Manager,o=Simpsons"
rootpw NotAllowed
directory /var/lib/ldap/base-simpsons
dirtyread
cachesize 2000
checkpoint 32 1
# Indices to maintain for this database
index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell eq,pres
index uid,memberUid eq,pres,sub
index nisMapName,nisMapEntry eq,pres,sub
sasl-regexp uid=(.*),cn=(.*),cn=gssapi,cn=auth
ldap:///dc=example.com??sub?(&(uid=$1)(objectClass=inetOrgPerson))
database bdb
suffix "o=Flintstones"
rootdn "cn=Manager,o=Flintstones"
rootpw NotAllowed
directory /var/lib/ldap/base-flintstones
dirtyread
cachesize 2000
checkpoint 32 1
# Indices to maintain for this database
index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell eq,pres
index uid,memberUid eq,pres,sub
index nisMapName,nisMapEntry eq,pres,sub
database monitor
access to * by * read
database config
access to * by * read
rootdn cn=admin,cn=config
rootpw password

66
doc/pla-test-i18n.ldif Normal file
View File

@ -0,0 +1,66 @@
# This is a Test-File for characters / encoding
# 1. Change the
# ,dc=example,dc=com
# to avalue for your organisation
# 2. Import it with phpldapadmin
#
# pla-i18n, example.com
#
dn: ou=pla-i18n,dc=example,dc=com
ou: pla-i18n
objectClass: top
objectClass: organizationalUnit
# pl, pla-i18n, example.com
dn: ou=pl,ou=pla-i18n,dc=example,dc=com
description:: IGRvcMOza2k=
description:: xITFu8WaxbnEhsWDxYHDk8SYIMSFxbzFm8W6xIfFhMWCw7PEmQ==
description:: V3NrYXrDs3drYQ==
objectClass: top
objectClass: organizationalUnit
ou: pl
# ru, pla-i18n, example.com
dn: ou=ru,ou=pla-i18n,dc=example,dc=com
description:: 0LfQstGD0YfQuNGCINC/0L7QtNC+0LHQvdC+
description:: 0J/RgNC+0YHRgtCw0Y8g0YTQvtGA0LzQsCDQv9C+0LjRgdC6
objectClass: top
objectClass: organizationalUnit
ou: ru
# jp, pla-i18n, example.com
dn: ou=jp,ou=pla-i18n,dc=example,dc=com
ou: jp
objectClass: top
objectClass: organizationalUnit
description:: SVNPLTIwMjItSlDjga7lpJrlm73nsY3oqIDoqp7jgbjjga7mi6HlvLXmgKc=
# pt-br, pla-i18n, example.com
dn: ou=pt-br,ou=pla-i18n,dc=example,dc=com
ou: pt-br
objectClass: top
objectClass: organizationalUnit
description:: VmVyIGFzIHJlcXVpc2nDp8O1ZXMgZW0gYWJlcnRv
# de, pla-i18n, example.com
dn: ou=de,ou=pla-i18n,dc=example,dc=com
ou: de
objectClass: top
objectClass: organizationalUnit
description:: U29uZGVyemVpY2hlbiDDtsOkw7zDnyDDlsOEw5w=
description:: w5bDliDDnMOcIMOEw4Q=
# sv, pla-i18n, example.com
dn: ou=sv,ou=pla-i18n,dc=example,dc=com
ou: sv
objectClass: top
objectClass: organizationalUnit
description:: U8O2a29tZsOlbmc=
description:: bMOldGVyIHNvbQ==
# ca, pla-i18n, example.com
dn: ou=ca,ou=pla-i18n,dc=example,dc=com
ou: ca
objectClass: top
objectClass: organizationalUnit
description:: RXMgdGluZHLDoSBxdWUgY29uZmlybWFyIGFxdWVzdGEgZGVjaXNpw7M=

11
doc/uidpool.schema Normal file
View File

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

3
hooks/classes/README Normal file
View File

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

1
hooks/functions/README Normal file
View File

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

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

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

185
htdocs/add_attr_form.php Normal file
View File

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

117
htdocs/add_oclass_form.php Normal file
View File

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

173
htdocs/add_value_form.php Normal file
View File

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

79
htdocs/cmd.php Normal file
View File

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

27
htdocs/collapse.php Normal file
View File

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

14
htdocs/common.php Normal file
View File

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

188
htdocs/compare.php Normal file
View File

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

65
htdocs/compare_form.php Normal file
View File

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

209
htdocs/copy.php Normal file
View File

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

103
htdocs/copy_form.php Normal file
View File

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

104
htdocs/create.php Normal file
View File

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

143
htdocs/create_confirm.php Normal file
View File

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

View File

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

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

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

40
htdocs/delete.php Normal file
View File

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

49
htdocs/delete_attr.php Normal file
View File

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

157
htdocs/delete_form.php Normal file
View File

@ -0,0 +1,157 @@
<?php
/**
* Displays a last chance confirmation form to delete a DN.
*
* @package phpLDAPadmin
* @subpackage Page
*/
/**
*/
require './common.php';
# The DN we are working with
$request = array();
$request['dn'] = get_request('dn','GET');
$request['page'] = new PageRender($app['server']->getIndex(),get_request('template','REQUEST',false,'none'));
$request['page']->setDN($request['dn']);
$request['page']->accept();
$request['template'] = $request['page']->getTemplate();
# Check if the entry exists.
if (! $request['dn'] || ! $app['server']->dnExists($request['dn']))
system_message(array(
'title'=>_('Entry does not exist'),
'body'=>sprintf('%s (%s)',_('The entry does not exist'),$request['dn']),
'type'=>'error'),'index.php');
# We search all children, not only the visible children in the tree
$request['children'] = $app['server']->getContainerContents($request['dn'],null,0,'(objectClass=*)',LDAP_DEREF_NEVER);
printf('<h3 class="title">%s %s</h3>',_('Delete'),htmlspecialchars(get_rdn($request['dn'])));
printf('<h3 class="subtitle">%s: <b>%s</b> &nbsp;&nbsp;&nbsp; %s: <b>%s</b></h3>',
_('Server'),$app['server']->getName(),_('Distinguished Name'),$request['dn']);
echo "\n";
echo '<center>';
if (count($request['children'])) {
printf('<b>%s</b><br /><br />',_('Permanently delete all children also?'));
$search['href'] = htmlspecialchars(sprintf('cmd.php?cmd=query_engine&server_id=%s&filter=%s&base=%s&scope=sub&query=none&format=list',
$app['server']->getIndex(),rawurlencode('objectClass=*'),rawurlencode($request['dn'])));
$query = array();
$query['base'] = $request['dn'];
$query['scope'] = 'sub';
$query['attrs'] = array('dn');
$query['size_limit'] = 0;
$query['deref'] = LDAP_DEREF_NEVER;
$request['search'] = $app['server']->query($query,null);
echo '<table class="forminput" border="0">';
echo '<tr>';
echo '<td colspan="2">';
printf(_('This entry is the root of a sub-tree containing %s entries.'),count($request['search']));
printf(' <small>(<a href="%s">%s</a>)</small>',
$search['href'],_('view entries'));
echo '</td></tr>';
echo '<tr><td colspan="2">&nbsp;</td></tr>';
printf('<tr><td colspan="2">%s</td></tr>',
sprintf(_('phpLDAPadmin can recursively delete this entry and all %s of its children. See below for a list of all the entries that this action will delete. Do you want to do this?'),count($request['search'])));
echo '<tr><td colspan="2">&nbsp;</td></tr>';
printf('<tr><td colspan="2"><small>%s</small></td></tr>',
_('Note: this is potentially very dangerous and you do this at your own risk. This operation cannot be undone. Take into consideration aliases, referrals, and other things that may cause problems.'));
echo "\n";
echo '<tr>';
echo '<td style="width: 50%; text-align: center;">';
echo '<form action="cmd.php" method="post" id="delete_form">';
echo '<input type="hidden" name="cmd" value="rdelete" />';
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="dn" value="%s" />',$request['template']->getDNEncode(false));
//@todo need to refresh the tree after a delete
printf('<input type="submit" value="%s" %s />',
sprintf(_('Delete all %s objects'),count($request['search'])),
(isAjaxEnabled() ? sprintf('onclick="return ajSUBMIT(\'BODY\',document.getElementById(\'delete_form\'),\'%s\');"',_('Deleting Object(s)')) : ''));
echo '</form>';
echo '</td>';
echo '<td style="width: 50%; text-align: center;">';
echo '<form action="cmd.php" method="get">';
echo '<input type="hidden" name="cmd" value="template_engine" />';
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="dn" value="%s" />',$request['template']->getDNEncode(false));
printf('<input type="submit" name="submit" value="%s" %s />',
_('Cancel'),
(isAjaxEnabled() ? sprintf('onclick="return ajDISPLAY(\'BODY\',\'cmd=template_engine&server_id=%s&dn=%s\',\'%s\');"',$app['server']->getIndex(),$request['template']->getDNEncode(),_('Retrieving DN')) : ''));
echo '</form>';
echo '</td>';
echo '</tr>';
echo "\n";
echo '</table>';
echo "\n";
echo '<br /><br />';
echo _('List of entries to be deleted:');
echo '<br />';
$i = 0;
printf('<select size="%s" multiple disabled style="background:white; color:black;width:500px" >',min(10,count($request['search'])));
foreach ($request['search'] as $key => $value)
printf('<option>%s. %s</option>',++$i,dn_unescape($value['dn']));
echo '</select>';
echo "\n";
} else {
echo '<table class="forminput" border="0">';
printf('<tr><td colspan="4">%s</td></tr>',_('Are you sure you want to permanently delete this object?'));
echo '<tr><td colspan="4">&nbsp;</td></tr>';
printf('<tr><td style="width: 10%%;">%s:</td><td colspan="3" style="width: 75%%;"><b>%s</b></td></tr>',_('Server'),$app['server']->getName());
printf('<tr><td style="width: 10%%;"><acronym title="%s">%s</acronym></td><td colspan="3" style="width: 75%%;"><b>%s</b></td></tr>',
_('Distinguished Name'),_('DN'),$request['dn']);
echo '<tr><td colspan="4">&nbsp;</td></tr>';
echo "\n";
echo '<tr>';
echo '<td colspan="2" style="width: 50%; text-align: center;">';
echo '<form action="cmd.php" method="post" id="delete_form">';
echo '<input type="hidden" name="cmd" value="delete" />';
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="dn" value="%s" />',$request['template']->getDNEncode(false));
//@todo need to refresh the tree after a delete
printf('<input type="submit" name="submit" value="%s" %s />',
_('Delete'),
(isAjaxEnabled() ? sprintf('onclick="return ajSUBMIT(\'BODY\',document.getElementById(\'delete_form\'),\'%s\');"',_('Deleting Object(s)')) : ''));
echo '</form>';
echo '</td>';
echo '<td colspan="2" style="width: 50%; text-align: center;">';
echo '<form action="cmd.php" method="get">';
echo '<input type="hidden" name="cmd" value="template_engine" />';
printf('<input type="hidden" name="server_id" value="%s" />',$app['server']->getIndex());
printf('<input type="hidden" name="dn" value="%s" />',$request['template']->getDNEncode(false));
printf('<input type="submit" name="submit" value="%s" %s />',
_('Cancel'),
(isAjaxEnabled() ? sprintf('onclick="return ajDISPLAY(\'BODY\',\'cmd=template_engine&server_id=%s&dn=%s\',\'%s\');"',$app['server']->getIndex(),$request['template']->getDNEncode(),_('Retrieving DN')) : ''));
echo '</form>';
echo '</td>';
echo '</tr>';
echo '</table>';
echo "\n";
}
echo '</center>';
echo '<br />';
?>

View File

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

61
htdocs/draw_tree_node.php Normal file
View File

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

135
htdocs/entry_chooser.php Normal file
View File

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

27
htdocs/expand.php Normal file
View File

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

40
htdocs/export.php Normal file
View File

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

213
htdocs/export_form.php Normal file
View File

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

6
htdocs/images/INFO Normal file
View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 624 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

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