Update contrib software.

This commit is contained in:
Kurt Zeilenga 1998-11-29 22:20:20 +00:00
parent 241c1e405d
commit 1b01c41401
33 changed files with 1175 additions and 79 deletions

View file

@ -0,0 +1,32 @@
ChangeLog for gtk-tool
28/11/1998 - Pele
* Fixes, enhancements, started using ldap utility api
* It now traverses the whole tree at startup, not sure if it's smart
but I did it because of something that has no relevance to network
traffic
27/11/1998 - Pele
* Added viewports, both sides now scroll automatically
* Brought back the "cache" stuff, now data gets reused if it's allready
available without redundant searches/listings.
* Editing pixmaps by hand is so much, er, fun!
* Miniscule fixes
26/11/1998 - Pele
* Added nice icons in the browser pane - looks decent now.
* Fixed scrolling in the data (right) pane - now scrolls if there is
a long tab
* removed class My_Scroller
* removed file Gtk_LdapItem.cc (useless)
* commented-out the part where data gets reused instead of re-querying
the server, stupid I know, but for the time being if resolves some
problems with replacement of right pane.
* Misc. fixes
26/11/1998 - Pele
* First appearance of ChangeLog
* Fixed removal of scrolled window on the right hand side
thus making gtk-tool a viable project to be worked on
* added command-line parameter parsing - now accepts
-s for server, -p for port, -b for baseDN

View file

@ -1,14 +1,67 @@
#include "Gtk_LdapTreeItem.h"
#include <gtk--/base.h>
Gtk_LdapTreeItem::Gtk_LdapTreeItem() : Gtk_TreeItem() {
this->objectClass = NULL;
}
Gtk_LdapTreeItem::Gtk_LdapTreeItem(char *c, My_Window *w) : Gtk_TreeItem(c) {
Gtk_LdapTreeItem::Gtk_LdapTreeItem(char *c, My_Window *w) : Gtk_TreeItem() {
this->rdn = c;
this->par = w;
this->objectClass = NULL;
}
Gtk_LdapTreeItem::Gtk_LdapTreeItem(GtkTreeItem *t) : Gtk_TreeItem(t) {
}
int Gtk_LdapTreeItem::search() {
Gtk_LdapTreeItem::~Gtk_LdapTreeItem() {
cout << "Bye" << endl;
delete this;
}
void Gtk_LdapTreeItem::setType(int t) {
cout << "Gtk_LdapTreeItem::setType(" << t << ")" << endl;
Gtk_Pixmap *xpm_icon;
Gtk_Label *label;
if (this->getchild() != NULL) {
xpm_label = new Gtk_HBox(GTK_HBOX(this->getchild()->gtkobj()));
xpm_label->remove_c(xpm_label->children()->nth_data(0));
xpm_label->remove_c(xpm_label->children()->nth_data(0));
}
else xpm_label = new Gtk_HBox();
if (strcasecmp(this->objectClass,"organization") == 0)
xpm_icon=new Gtk_Pixmap(*xpm_label, root_node);
else if (strcasecmp(this->objectClass,"organizationalunit") == 0)
xpm_icon=new Gtk_Pixmap(*xpm_label, branch_node);
else if (strcasecmp(this->objectClass,"person") == 0)
xpm_icon=new Gtk_Pixmap(*xpm_label, leaf_node);
else xpm_icon=new Gtk_Pixmap(*xpm_label, general_node);
label = new Gtk_Label(this->rdn);
xpm_label->pack_start(*xpm_icon, false, false, 1);
xpm_label->pack_start(*label, false, false, 1);
if (this->getchild() == NULL) this->add(xpm_label);
label->show();
xpm_label->show();
xpm_icon->show();
}
int Gtk_LdapTreeItem::showDetails() {
cout << "Gtk_LdapTreeItem::showDetails()" << endl;
if (this->notebook != NULL) {
if (par->viewport->getchild() != NULL) {
par->viewport->remove_c(par->viewport->getchild()->gtkobj());
}
par->viewport->add(this->notebook);
this->notebook->show();
par->viewport->show();
return 0;
}
else this->getDetails();
this->showDetails();
}
int Gtk_LdapTreeItem::getDetails() {
cout << "Gtk_LdapTreeItem::getDetails()" << endl;
int error, entriesCount;
BerElement *ber;
LDAPMessage *entry;
@ -17,49 +70,36 @@ int Gtk_LdapTreeItem::search() {
Gtk_Label *label;
GList *child_list;
Gtk_Notebook *g;
if (this->notebook != NULL) {
if (par->scroller2->children != NULL) {
par->scroller2->remove_child(0);
}
par->scroller2->add_child(this->notebook);
// par->scroller2->remove((Gtk_Object)par->scroller2->children()->first());
this->notebook->reparent(par->scroller2);
this->notebook->show();
par->scroller2->show();
return 0;
}
Gtk_Viewport *viewport;
error = ldap_search_s(this->ld, this->dn, LDAP_SCOPE_BASE, "objectclass=*", NULL, 0, &result_identifier);
entriesCount = ldap_count_entries(ld, result_identifier);
if (entriesCount == 0) return 0;
notebook = new Gtk_Notebook();
notebook->set_tab_pos(GTK_POS_LEFT);
gchar *titles[] = { "values" };
const gchar *titles[] = { "values" };
for (entry = ldap_first_entry(ld, result_identifier); entry != NULL; entry = ldap_next_entry(ld, result_identifier)) {
for (attribute = ldap_first_attribute(ld, entry, &ber); attribute != NULL; attribute = ldap_next_attribute(ld, entry, ber)) {
table = new Gtk_CList(1, titles);
values = ldap_get_values(ld, entry, attribute);
if (strcasecmp(attribute, "objectclass") == 0) {
if (strcasecmp(values[0],"top") == 0)
this->objectClass = strdup(values[1]);
else this->objectClass = values[0];
}
table = new Gtk_CList(1, titles);
for (int i=0; i<ldap_count_values(values); i++) {
gchar *t[] = { values[i] };
const gchar *t[] = { values[i] };
table->append(t);
}
ldap_value_free(values);
label = new Gtk_Label(attribute);
notebook->append_page(table, label);
notebook->append_page(*table, *label);
table->show();
label->show();
}
}
if (par->scroller2 != NULL) {
cout << "Scroller2 exists" << endl;
if (par->scroller2->children[0] != NULL) {
cout << "There are children in scroller2" << endl;
par->scroller2->remove_child(0);
}
par->scroller2->add_child(this->notebook);
this->notebook->show();
par->scroller2->show();
}
this->setType(1);
cout << ".";
return 0;
}
void Gtk_LdapTreeItem::select_impl() {
@ -68,16 +108,19 @@ void Gtk_LdapTreeItem::select_impl() {
Gtk_c_signals_Item *sig=(Gtk_c_signals_Item *)internal_getsignalbase();
if (!sig->select) return;
sig->select(GTK_ITEM(gtkobj()));
this->search();
this->showDetails();
}
void Gtk_LdapTreeItem::collapse_impl() {
cout << this->dn << " collapsed" << endl;
// cout << this->dn << " collapsed" << endl;
Gtk_c_signals_TreeItem *sig=(Gtk_c_signals_TreeItem *)internal_getsignalbase();
if (!sig->collapse) return;
sig->collapse(GTK_TREE_ITEM(gtkobj()));
// gtk_widget_hide(GTK_WIDGET(GTK_TREE(GTK_TREE_ITEM (this->gtkobj())->subtree)));
}
void Gtk_LdapTreeItem::expand_impl() {
// cout << this->dn << " expanded" << endl;
Gtk_c_signals_TreeItem *sig=(Gtk_c_signals_TreeItem *)internal_getsignalbase();
if (!sig->expand) return;
sig->expand(GTK_TREE_ITEM(gtkobj()));

View file

@ -4,6 +4,15 @@
#include <My_Window.h>
#include <lber.h>
#include <ldap.h>
/*#include "XPMLabelBox.h"*/
#include "icons/root_node.h"
#include "icons/branch_node.h"
#include "icons/leaf_node.h"
#include "icons/general_node.h"
#define ROOT_NODE 1
#define BRANCH_NODE 2
#define LEAF_NODE 3
class My_Window;
@ -11,14 +20,19 @@ class Gtk_LdapTreeItem : public Gtk_TreeItem {
public:
char *dn;
char *rdn;
char *objectClass;
LDAP *ld;
LDAPMessage *result_identifier;
My_Window *par;
Gtk_Notebook *notebook;
Gtk_HBox *xpm_label;
Gtk_LdapTreeItem();
Gtk_LdapTreeItem(char *c, My_Window *w);
Gtk_LdapTreeItem(GtkTreeItem *t);
int search();
~Gtk_LdapTreeItem();
void setType(int t);
int getDetails();
int showDetails();
void select_impl();
void collapse_impl();
void expand_impl();

View file

@ -2,14 +2,14 @@ HOME_LOCATION=$(shell pwd)
CC= gcc
CPLUS= g++
OPTS=-g -DmyDEBUG
INCLUDES=`gtkmm-config --cflags` -I/usr/include -I/usr/local/gnome/include -I.
LDFLAGS=`gtkmm-config --libs` -L/usr/lib -L/usr/X11/lib -L/usr/local/gnome/lib -L/usr/local/ldap/lib -lldap -llber
INCLUDES=`gtkmm-config --cflags` -I.
LDFLAGS=`gtkmm-config --libs` -L/usr/lib -L/usr/X11/lib -L/usr/local/gnome/lib -L/usr/local/ldap/lib -lldap -llber -L/usr/local/kerberos/lib -lkrb5 -lkrb4
LIBS=-lXext -lgtkmm -lX11 -lXt -lXxf86dga
.EXPORT_ALL_VARIABLES:
SOURCES= My_Window.cc My_Scroller.cc Gtk_LdapTreeItem.cc main.cc
OBJECTS= My_Window.o My_Scroller.o Gtk_LdapTreeItem.o main.o
SOURCES= My_Window.cc Gtk_LdapTreeItem.cc main.cc
OBJECTS= My_Window.o Gtk_LdapTreeItem.o main.o
################################################################################

View file

@ -9,31 +9,40 @@ My_Window::My_Window(GtkWindowType t) : Gtk_Window(t) {
this->scroller = new Gtk_ScrolledWindow();
this->scroller->set_policy(GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
// this->scroller->set_usize(this->height(), 400);
pane->add1(this->scroller);
pane->add1(*this->scroller);
this->scroller->show();
this->scroller2 = new My_Scroller();
// this->scroller2 = new My_Scroller();
this->scroller2 = new Gtk_ScrolledWindow();
this->viewport = new Gtk_Viewport();
this->scroller2->set_policy(GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
pane->add2(this->scroller2);
this->scroller2->add(*this->viewport);
pane->add2(*this->scroller2);
this->scroller2->show();
top_hbox = new Gtk_HBox();
this->urlfield = new Gtk_Entry();
top_hbox->pack_start(this->urlfield, TRUE, TRUE, 1);
top_hbox->pack_start(*this->urlfield, TRUE, TRUE, 1);
this->urlfield->show();
this->display_button = new Gtk_Button("Display");
connect_to_method(this->display_button->clicked, this, &do_display);
top_hbox->pack_end(this->display_button, FALSE, FALSE, 1);
top_hbox->pack_end(*this->display_button, FALSE, FALSE, 1);
this->display_button->show();
main_hbox = new Gtk_VBox();
main_hbox->pack_start(top_hbox, FALSE, TRUE, 1);
main_hbox->pack_end(pane, TRUE, TRUE, 1);
main_hbox->pack_start(*top_hbox, FALSE, TRUE, 1);
main_hbox->pack_end(*pane, TRUE, TRUE, 1);
top_hbox->show();
pane->show();
this->add(main_hbox);
main_hbox->show();
}
My_Window::~My_Window() {
cout << "~My_Window()" << endl;
delete this;
}
void My_Window::do_display() {
cout << this->urlfield->get_text() << endl;
}
@ -72,7 +81,9 @@ Gtk_LdapItem* My_Window::make_tree(My_Window *p, LDAP* l_i, char* b_d) {
treeitem = new Gtk_LdapTreeItem(c, p);
treeitem->dn = b_d; treeitem->ld = l_i;
treeresult = new Gtk_LdapItem();
treeitem->getDetails();
if (entriesCount == 0) {
// treeitem->setType(LEAF_NODE);
treeresult->treeitem = new Gtk_LdapTreeItem(*treeitem);
treeresult->tree = NULL;
return treeresult;
@ -86,19 +97,20 @@ Gtk_LdapItem* My_Window::make_tree(My_Window *p, LDAP* l_i, char* b_d) {
s = ldap_explode_dn(ldap_get_dn(l_i, entry), 1);
subtreeresult = make_tree(p, l_i, ldap_get_dn(l_i, entry));
subtreeitem = new Gtk_LdapTreeItem(*subtreeresult->treeitem);
subtree->append(subtreeitem);
printf("inserting %s into %s", s[0], c);
// printf("inserting %s into %s", s[0], c);
subtree->append(*subtreeitem);
if (subtreeresult->tree != NULL) {
printf(".");
// printf(".");
subsubtree = new Gtk_Tree(*subtreeresult->tree);
printf(".");
subtreeitem->set_subtree(subsubtree);
printf(".");
// printf(".");
subtreeitem->set_subtree(*subsubtree);
// printf(".");
}
subtreeitem->show();
printf("\n");
// printf("\n");
entry = ldap_next_entry(l_i, entry);
}
// treeitem->setType(BRANCH_NODE);
treeresult->treeitem = new Gtk_LdapTreeItem(*treeitem);
treeresult->tree = new Gtk_Tree(*subtree);
return treeresult;

View file

@ -4,7 +4,7 @@
#include "gtk.h"
#include <lber.h>
#include <ldap.h>
#include "My_Scroller.h"
/*#include "My_Scroller.h"*/
#include "Gtk_LdapItem.h"
#include "Gtk_LdapTreeItem.h"
class Gtk_LdapTreeItem;
@ -13,12 +13,14 @@ class My_Scroller;
class My_Window : public Gtk_Window {
public:
Gtk_ScrolledWindow *scroller;
My_Scroller *scroller2;
Gtk_ScrolledWindow *scroller, *scroller2;
Gtk_Viewport *viewport;
// My_Scroller *scroller2;
Gtk_Entry *urlfield;
Gtk_Button *display_button;
Gtk_Paned *pane;
My_Window(GtkWindowType t);
~My_Window();
void do_display();
void expand(Gtk_TreeItem *t);
gint delete_event_impl(GdkEventAny *);

View file

@ -1,13 +1,33 @@
This is the first version of this README
gtk-tool v0.5delta
README for gtk-tool v0.6
This package has been tested and run with the latest Gtk+/Gtk--
OpenLDAP 1.1-devel. This thing doesn't run as it should, please
read TODO!
Just type 'make' to compile and if you have all the necessary stuff it'll do so.
You do need the latest version of Gtk+ and Gtk-- (which may be tricky to build).
After that, hopefully all goes well, you start the thing by doing:
./main
It will default to base of o=University of Michigan, c=US", localhost, and
LDAP_PORT (389). This is because OpenLDAP comes with the UMICH ldif and the
assumption is that many of you have actually created a test db with that data
(to see that people don't lie when they say OpenLDAP actually works or
something). If you want to change any of these do ./main -h and it will give
you a list of supported parameters.
In short this is what you can do:
./main -h ldap-server.somewhere.net -p 28345 -b "o=OpenLDAP Foundation, c=US"
I really couldn't think of anything else to put here (at the moment
that is). But please feel free to add whatever else you consider
neccessary to understanding how this thing works. Enjoy, and I hope
this can be useful to you in some miniscule way.
All emails to -devel list, and plase make sure you put "GTK-TOOL"
in the subject line, so other people who are not interested don't
have to read our garbage.
Pele
pele@openldap.org

View file

@ -1,22 +1,14 @@
LOADS!!!
Someone please figure out how to _remove_ a widget from a container
in Gtk+/Gtk--. As far as I know, and from my discussion with a
certain person, it can't due to a design flaw of Gtk+ people. We
need that first to be able to continue. The bug is reproducable
when you start the thing, it automatically goes to the top node,
i.e. University of Michigan, if you expand the tree a bit, then
click on any one of the items available, it'll blow. That's because
it needs to remove the contents in the right side of the browser
window to be able to insert new things about the current node. And
I didn't want to be an idiot and do it by some other means, because,
as they've taught me in school, OO programming is meant to be used
in a black-box fashion. If all else fails, then we'll start thinking
about stupid solutions and their consenquences. No pun intended.
Priorities:
Make it useful!
Implement searches
port to autoconf (anyone? it should be easy)
All emails to -devel list, and plase make sure you put "GTK-TOOL"
in the subject line, so other people who are not interested don't
have to read our garbage.
Optional:
comments in the source code
port it to NT so we can use it with the NT port of OpenLDAP
(is there a NT port of Gtk+?)
Pele
pele@openldap.org

View file

@ -11,37 +11,65 @@ int main(int argc, char **argv) {
Gtk_LdapItem *treeresult;
Gtk_Tree *tree, *subtree;
Gtk_LdapTreeItem *treeitem;
Gtk_Viewport *viewport;
LDAPMessage **thing;
LDAP *ld;
char *base_dn;
char *host = NULL;
char *base_dn = NULL;
int c, port = 0;
while ((c = getopt(argc, argv, "b:s:p:h")) != -1) {
switch (c) {
case 'b':
base_dn = optarg; break;
case 's':
host = strdup(optarg); break;
case 'p':
port = atoi(optarg); break;
case 'h':
default:
fprintf(stderr, "Usage: %s [-s server] [-p port] [-b base_dn]\n", argv[0]);
exit(-1);
}
}
// if (base_dn == NULL) base_dn = ldap_get_option(NULL, LDAP_OPT_BASE);
if (base_dn == NULL) base_dn = "o=University of Michigan, c=US";
if (host == NULL) ldap_get_option(NULL, LDAP_OPT_HOST_NAME, host);
//host = "localhost";
if (port == 0) port = LDAP_PORT;
Gtk_Main m(&argc, &argv);
window = new My_Window(GTK_WINDOW_TOPLEVEL);
if ((ld = ldap_open("localhost", LDAP_PORT))==NULL) {
if ((ld = ldap_open(host, port)) == NULL) {
perror("connection");
}
tree = new Gtk_Tree();
base_dn = "o=University of Michigan, c=US";
treeresult = window->make_tree(window, ld, base_dn);
treeitem = new Gtk_LdapTreeItem(*treeresult->treeitem);
tree->append(treeitem);
// treeresult->treeitem->setType(ROOT_NODE);
tree->append(*treeitem);
if (treeresult->tree != NULL) {
subtree = new Gtk_Tree(*treeresult->tree);
printf("inserting %s into root\n", base_dn);
treeitem->set_subtree(subtree);
// cout << "Inserting " << base_dn << " into root" << endl;
treeitem->set_subtree(*subtree);
}
treeitem->show();
window->scroller->add(tree);
viewport = new Gtk_Viewport();
viewport->add(tree);
window->scroller->add(viewport);
tree->show();
viewport->show();
window->scroller->show();
treeitem->search();
treeitem->showDetails();
// treeitem->select();
window->set_title("Hello");
window->activate();
window->set_usize(450, 450);
window->set_usize(600, 500);
window->show();

View file

@ -31,7 +31,7 @@ naminglink,Naming Link,TRUE
nobatchupdates,No Batch Updates,FALSE
notice,Notice,TRUE
o,Organization,TRUE
objectclass,Object Class,FALSE
objectclass,Object Class,TRUE
onvacation,On Vacation,TRUE
ou,Organizational Unit,TRUE
owner,Owner,TRUE

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 850 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 857 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 923 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 981 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,017 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,020 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 837 B

View file

@ -0,0 +1,105 @@
<?
include 'include/ldap_entry_attribute.inc';
class ldap_entry {
var $attributes;
var $dn;
var $parent;
var $attributeCount;
var $link_identifier;
var $r_e_i;
cfunction ldap_entry($l_i) {
// echo "creating new ldap_entry<br>\n";
$this->link_identifier = $l_i;
}
cfunction getAttributes() {
$i=0;
$attrib = new ldap_entry_attribute($this->dn);
$n = ldap_first_attribute($this->link_identifier, $this->r_e_i, &$ber);
while ($n) {
$attrib->name = $n;
$attrib->getValues($this->link_identifier,$this->r_e_i);
$this->attributes[$i] = $attrib;
$i++;
$attrib = new ldap_entry_attribute($this->dn);
$n = ldap_next_attribute($this->link_identifier, $this->r_e_i, $ber);
}
}
cfunction formatHTMLDN($dn) {
global $FILE, $host;
$string = "";
$attribs = ldap_explode_dn($dn, 0);
$names = ldap_explode_dn($dn, 1);
for ($i=0; $i<$attribs["count"]; $i++) {
$s = $attribs[$i];
for ($j=$i+1; $j<$attribs["count"]; $j++) {
$s .= ",".$attribs[$j];
}
if (($s[0] == "c") && ($s[1] == "n")) {
$string .= "<a href=".$FILE."?ldap_action=read&base_dn=".urlencode($s).">".$names[$i]."</a>";
}
else {
$string .= "<a href=".$FILE."?ldap_action=list&base_dn=".urlencode($s).">".$names[$i]."</a>";
}
if ($i<$attribs["count"]-1) { $string .= ", "; }
}
return $string;
}
cfunction formatHTMLAttributes() {
global $FILE, $host;
$s = "";
$s .= "<tr>\n\t";
$s .= '<td colspan=2 bgcolor="#9380DB" align="center" valign="middle">';
$s .= "\n\t\t<h3 class=head>".$this->formatHTMLDN($this->dn)."</h3>\n";
$s .= "\t\t</td>\n\t</tr>\n";
$c = count($this->attributes);
for ($i=0; $i<$c; $i++) {
$attrib = $this->attributes[$i];
if ($attrib->isVisible($attrib->name) == "TRUE") {
$s .= $attrib->formatHTMLValues();
}
}
$a = $this->attributes[0];
$v = $a->values[1];
if ($v == "organizationalUnit" || $v == "organization") {
$s .= "<tr>\n\t<td colspan=2>\n";
$s .= "\t\t<a href=".$FILE."?host=".urlencode($host)."&ldap_action=list&base_dn=".urlencode($this->dn).">Browse</a>\n";
$s .= "\t\t</td>\n\t</tr>\n";
}
else if ($v == "person") {
$s .= "<tr>\n\t<td colspan=2>\n";
$s .= "\t\t<a href=".$FILE."?host=".urlencode($host)."&ldap_action=read&admin_action=modify&base_dn=".urlencode($this->dn).">Modify</a>\n";
$s .= "\t\t</td>\n\t</tr>\n";
}
else {
$s .= "<tr>\n\t<td colspan=2>\n\t\t&nbsp;\n\t\t</td>\n\t</tr>\n";
}
return $s;
}
cfunction display() {
global $FILE, $host;
echo "<tr><td colspan=2 bgcolor=gray>";
echo "<h3>".ldap_dn2ufn($this->dn)."</h3>";
echo "</td></tr>";
$c = count($this->attributes);
for ($i=0; $i<$c; $i++) {
$attrib = $this->attributes[$i];
$attrib->display();
}
$a = $this->attributes[0];
$v = $a->values[1];
if ($v == "organizationalUnit" || $v == "organization") {
echo "<tr><td colspan=2>";
echo "<a href=".$FILE."?host=".urlencode($host)."&ldap_action=list&base_dn=".urlencode($this->dn).">Browse</a>";
echo "</td></tr>";
}
else {
echo "<tr><td colspan=2>&nbsp;</td></tr>";
}
}
}
?>

View file

@ -0,0 +1,169 @@
<?
class ldap_entry_attribute {
var $name, $values, $parent;
cfunction ldap_entry_attribute($d) {
// echo "creating new ldap_entry_attribtute<br>\n";
$this->dn = $d;
$a = ldap_explode_dn($this->dn, 1);
$this->cn = $a[0];
}
cfunction getAttributeName($string) {
global $prefs;
for ($i=0; $i<count($prefs->attribute_names); $i++) {
if ($prefs->attribute_names[$i][0] == $string) {
return $prefs->attribute_names[$i][1];
}
}
return $string;
}
cfunction isVisible($string) {
global $prefs;
for ($i=0; $i<count($prefs->attribute_names); $i++) {
if ($prefs->attribute_names[$i][0] == $string) {
return $prefs->attribute_names[$i][2];
}
}
return "FALSE";
}
cfunction getValues($l_i, $r_e_i) {
//echo "My name is ".$this->name."<br>\n";
$this->values = ldap_get_values($l_i, $r_e_i, $this->name);
}
cfunction display() {
echo "<tr>\n\t<td valign=top bgcolor=white>\n";
echo "\t\t".$this->name."\n\t\t</td>\n\t<td valign=top bgcolor=lightyellow>\n";
echo "<ul type=square>\n";
for($i=0; $i<$this->values["count"]; $i++) {
//echo "Displaying value ".$i."<br>\n";
echo "<li>";
$this->displayValue($i);
echo "<br>\n";
}
echo "</ul>\n";
echo "</td>\n</tr>\n";
}
cfunction formatHTMLValues() {
$ct = $this->values["count"];
$str = "";
$str .= "<tr>\n\t<td valign=top bgcolor=white>\n";
$n = $this->getAttributeName($this->name);
$str .= "\t\t".$n."\n\t\t</td>\n\t<td valign=top bgcolor=lightyellow>\n\t\t<ul type=square>\n";
// if ($ct > 1) {
// $str .= "\t\t<ul type=square>\n";
// }
for ($i=0; $i<$this->values["count"]; $i++) {
$str .= "\t\t\t<li>";
$str .= $this->formatHTMLValue($i);
$str .= "<br>\n";
}
//if ($ct > 1) { $str .= "\t\t\t</ul>\n"; }
$str .= "\t\t\t</ul>\n\t\t</td>\n\t</tr>\n";
return $str;
}
cfunction formatHTMLValue($index) {
global $prefs, $FILE, $host;
$p = "";
switch ($this->name) {
case "cn":
$p .= "<a href=".$FILE."?host=".urlencode($host)."&ldap_action=read&base_dn=".urlencode($this->dn).">".$this->values[$index]."</a>";
break;
case "ou":
$p .= "<a href=".$FILE."?ldap_action=list&host=".urlencode($host)."&base_dn=".urlencode($this->dn).">".$this->values[$index]."</a>";
break;
case "seealso":
case "member":
case "requeststo":
case "errorsto":
case "owner":
case "lastmodifiedby":
case "modifiersname":
$p .= "<a href=".$FILE."?host=".urlencode($host)."&ldap_action=read&base_dn=".urlencode($this->values[$index]).">".ldap_dn2ufn($this->values[$index])."</a>";
break;
case "mail":
$p .= "<a href=mailto:".$this->values[$index].">".$this->values[$index]."</a>";
break;
case "postaladdress":
case "homepostaladdress":
$i=0;
$tok = strtok($this->values[$index], "$");
while ($tok) {
$p .= $i." ".$tok."<br>\n";
$tok = strtok("$");
$i++;
}
break;
case "labeledurl":
$tok = strtok($this->values[$index], " ");
$tok2 = strtok("\0");
$p .= '<a href='.$tok.'>'.$tok2.'</a>';
break;
case "lastmodifiedtime":
case "modifytimestamp":
$t = $this->values[$index];
$hour = (int) $t[6].$t[7];
$minute = (int) $t[8].$t[9];
$second = (int) $t[10].$t[11];
$month = (int) $t[2].$t[3];
$day = (int) $t[4].$t[5];
$year = (int) $t[0].$t[1];
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
$date = date("h:i:sa, on l, dS of F Y", $timestamp);
$p .= $date;
break;
case "jpegphoto":
$p .= '<a href="'.$prefs->get("PATH.photo").'?base_dn='.urlencode($this->dn).'"><img src="'.$prefs->get("PATH.photo").'?base_dn='.urlencode($this->dn).'" alt="Image of '.$this->cn.'" border=0></a>';
break;
default:
$p .= $this->values[$index];
break;
}
return $p;
}
cfunction displayValue($index) {
//echo "ldap_entry_attribute.displayValue(".$index.")<br>\n";
global $FILE, $host;
if ($this->name == "cn") {
print "<a href=".$FILE."?host=".urlencode($host)."&ldap_action=read&base_dn=".urlencode($this->dn).">".$this->values[$index]."</a>";
}
else if ($this->name == "ou") {
print "<a href=".$FILE."?ldap_action=list&host=".urlencode($host)."&base_dn=".urlencode($this->dn).">".$this->values[$index]."</a>";
}
else if ($this->name == "seealso" || $this->name == "member" || $this->name == "requeststo" || $this->name == "errorsto" || $this->name == "owner" || $this->name == "lastmodifiedby" || $this->name == "modifiersname") {
print "<a href=".$FILE."?host=".urlencode($host)."&ldap_action=read&base_dn=".urlencode($this->values[$index]).">".ldap_dn2ufn($this->values[$index])."</a>";
}
else if ($this->name == "mail") {
print "<a href=mailto:".$this->values[$index].">".$this->values[$index]."</a>";
}
else if ($this->name == "labeledurl") {
$tok = strtok($this->values[$index], " ");
$tok2 = strtok("\0");
print '<a href='.$tok.'>'.$tok2.'</a>';
}
else if ($this->name == "lastmodifiedtime" || $this->name == "modifytimestamp") {
$t = $this->values[$index];
$hour = (int) $t[6].$t[7];
$minute = (int) $t[8].$t[9];
$second = (int) $t[10].$t[11];
$month = (int) $t[2].$t[3];
$day = (int) $t[4].$t[5];
$year = (int) $t[0].$t[1];
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
$date = date("h:i:sa, on l, dS of F Y", $timestamp);
// $date = getdate($timestamp);
// $date = getdate($this->values[$index]);
// echo "".$date["hours"].":".$date["minutes"].",
// ".$date["weekday"].",".$date["month"]." ".$date["mday"].", ".$date["year"]."<br>\n";
print $date;
}
else {
print $this->values[$index];
}
}
}
?>

View file

@ -0,0 +1,115 @@
<?
include 'include/ldap_entry.inc';
class ldap_manager {
var $entries;
var $result_identifier, $search_filter, $base_dn;
var $ldap_action, $host;
var $link_identifier;
var $entriesCount;
function connect($host) {
$this->link_identifier = ldap_connect($host);
if ($this->link_identifier) return 1;
return 0;
}
function disconnect() {
ldap_close($this->link_identifier);
}
function ldapTakeAction($a = "search") {
$func_ptr = "ldap_".$a;
if ($this->result_identifier = $func_ptr($this->link_identifier, $this->base_dn, $this->search_filter)) {
$this->entriesCount = ldap_count_entries($this->link_identifier, $this->result_identifier);
return 1;
}
return 0;
}
cfunction getEntries() {
$i=0;
$entry = new ldap_entry($this->link_identifier);
$entry->r_e_i = ldap_first_entry($this->link_identifier, $this->result_identifier);
while($entry->r_e_i) {
$entry->dn = ldap_get_dn($this->link_identifier, $entry->r_e_i);
$entry->getAttributes();
$this->entries[$i] = $entry;
$i++;
$r = $entry->r_e_i;
$entry = new ldap_entry($this->link_identifier);
$entry->r_e_i = ldap_next_entry($this->link_identifier, $r);
}
// ldap_free_result($this->result_identifier);
}
cfunction displayEntries() {
echo $this->formatHTMLEntries();
}
cfunction formatHTMLBaseDN($dn) {
global $FILE, $host;
$string = "";
$attribs = ldap_explode_dn($dn, 0);
$names = ldap_explode_dn($dn, 1);
for ($i=0; $i<$attribs["count"]; $i++) {
$s = $attribs[$i];
for ($j=$i+1; $j<$attribs["count"]; $j++) {
$s .= ",".$attribs[$j];
}
if (($s[0] == "c") && ($s[1] == "n")) {
$string .= "<a href=".$FILE."?ldap_action=read&base_dn=".urlencode($s).">".$names[$i]."</a>, ";
}
else {
$string .= "<a href=".$FILE."?ldap_action=list&base_dn=".urlencode($s).">".$names[$i]."</a>, ";
}
}
return $string;
}
cfunction formatHTMLEntries() {
$string = "";
$string .= '<table width="100%" border=1 cellpadding=0 cellspacing=0>';
$string .= "\n";
for ($i=0; $i<count($this->entries); $i++) {
$e = $this->entries[$i];
$string .= $e->formatHTMLAttributes();
}
$string .= "</table>\n";
return $string;
}
cfunction calculateTime($string, $s_t, $e_t) {
$tok1 = strtok($s_t, " ");
$msecs1 = $tok1;
$tok1 = strtok(" ");
$secs1 = $tok1;
$tok2 = strtok($e_t, " ");
$msecs2 = $tok2;
$tok2 = strtok(" ");
$secs2 = $tok2;
$t_t = (float) ($secs2 + $msecs2) - (float) ($secs1 + $msecs1);
echo "execution time for <b>".$string."</b> : <b>".$t_t."</b> seconds<br>\n";
// echo "start: ".$secs1."<br>\n";
// echo "end: ".$secs2."<br>\n";
return (float) $t_t;
}
cfunction stripString($string, $tokens) {
$s = $string;
for ($i=0; $i<count($tokens); $i++) {
$result = "";
$tok = strtok($s, $tokens[$i]);
while($tok) {
$result .= $tok;
// echo "result = ".$result."\n";
$tok = strtok($tokens[$i]);
}
$s = $result;
// echo "s = ".$s."\n";
}
// echo "result = ".$result."\n";
return $result;
}
}
?>

View file

@ -0,0 +1,155 @@
<?
class preferences {
var $name;
var $sections = array();
var $base_dn;
var $host;
var $attribute_names = array();
cfunction getSection($s) {
//// echo "getSection(".$s.")<br>";
$sect = array();
for ($i=0; $i<count($this->sections); $i++) {
$sect = $this->sections[$i];
// echo $sect[0]."<br>";
if ($sect[0] == $s) {
// echo "Found ".$sect[0]."<br>";
return $sect[1];
}
}
// echo "Didn't find ".$s."<br>";
}
cfunction get($s) {
$class = explode(".", $s);
$sect = $this->getSection($class[0]);
$values = array();
$values = $sect[1];
for ($i=0; $i<count($sect); $i++) {
$values = $sect[$i];
// echo $values[0]."<br>";
if ($values[0] == $class[1]) {
// echo "Found ".$values[0]."<br>";
return $values[1];
}
}
// echo "Didn't find ".$class[1]."<br>";
}
cfunction getName($s) {
$n = trim(strtok($s, "{"));
return $n;
}
cfunction getBody($s) {
$i = strpos($s, "{") + 1;
$j = strpos($s, "}") - 1;
$tok = substr($s, $i, $j-$i);
return $tok;
}
cfunction getValues($b) {
$t = '" ","\" ","\n"';
$av_pairs = array();
$pairs = array();
$av_pair = array();
$pairs = explode(";", $b);
for ($i=0; $i<count($pairs)-1; $i++) {
$av_pair = explode(":", $pairs[$i]);
$av_pair[0] = trim($av_pair[0]);
$av_pair[1] = trim($this->stripString($av_pair[1], $t));
// echo "<li>".$av_pair[0].":".$av_pair[1];
$av_pairs[$i] = $av_pair;
}
return $av_pairs;
}
cfunction getStatements($s) {
$i = 0;
$end = strpos($s, "}");
while($end != FALSE) {
$tok = substr($s, 0, $end+1);
$s = substr($s, $end+1, strlen($s));
// echo "<ul>";
$this->sections[$i] = $this->getStatement($tok);
// echo "</ul>\n";
$end = strpos($s, "}");
$i++;
}
// echo count($this->sections)." sections<br>";
}
cfunction getStatement($s) {
$values[0] = $this->getName($s);
// echo "<li>Name ".$values[0];
$body = $this->getBody($s);
// echo "<li>Values<ul>";
$values[1] = $this->getValues($body);
// echo "</ul></li>";
return $values;
}
cfunction loadPreferences() {
if (count($preferences) != 0) {
echo "I have got ".count($this->sections)." preferences here<br>\n";
}
else {
$fp = fopen("php3tool.conf", "r");
$i = 0;
$string = "";
while (!feof($fp)) {
$string .= fgets($fp, 80);
}
fclose($fp);
$this->getStatements($string);
}
$this->loadAttributeNames($this->get("PATH.attributes"));
}
cfunction loadAttributeNames($s = "at.conf") {
// global $attribute_names;
if (count($this->attribute_names) != 0) {
//This is bullshit here..how do we make php3
//preserve an array in memory between re-loads?
//And no, I'm not going to send it every time
//I make a subsequent request..
//If we don't fix these things it won't run
//on anything smaller than a StarFire 10000
//EVEN THOUGH this stuff is suprisingly fast.
echo "I have got attribute_names here<br>\n";
}
else {
//echo "I dont have attribute_names here<br>\n";
$fp = fopen($s, "r");
$i = 0;
while (!feof($fp)) {
$string = "";
$foo = "";
$string = fgets($fp, 80);
$foo = strtok($string, ",");
$this->attribute_names[$i][0] = $foo;
$foo = strtok(",");
$this->attribute_names[$i][1] = $foo;
$foo = strtok("\n");
$this->attribute_names[$i][2] = $foo;
$i++;
}
}
// echo "Hello world:<b>".count($this->attribute_names)."</b>\n";
// for ($i=0; $i<count($this->attribute_names)-1; $i++) {
// echo $this->attribute_names[$i][0]." - <strong>".$this->attribute_names[$i][1]."</strong> - ".$this->attribute_names[$i][2]."<br>\n";
// }
return $this->attribute_names;
}
cfunction stripString($string, $tokens) {
$s = $string;
for ($i=0; $i<count($tokens); $i++) {
$result = "";
$tok = strtok($s, $tokens[$i]);
while($tok) {
$result .= $tok;
// echo "result = ".$result."\n";
$tok = strtok($tokens[$i]);
}
$s = $result;
// echo "s = ".$s."\n";
}
// echo "result = ".$result."\n";
return $result;
}
}
?>

View file

@ -0,0 +1,141 @@
<?
class query_manager {
function get_action() {
global $ldap_action;
if (isset ($ldap_action)) {
$ldap_action = urldecode ($ldap_action);
}
else {
$ldap_action = "read";
}
return $ldap_action;
}
function get_base_dn() {
global $base_dn;
if (isset ($base_dn)) {
$base_dn = urldecode ($base_dn);
}
else {
$base_dn = "o=University of Michigan, c=US";
// $base_dn = "o=Balorda and Balorda, c=UK";
}
return $base_dn;
}
function get_host() {
global $host;
if (isset ($host)) {
$host = urldecode($host);
}
else {
$host = "localhost";
}
return $host;
}
function get_search_filter() {
global $objectclass, $attrib, $precision, $search_string;
// global $search_filter;
// if (isset ($search_filter)) {
// $search_filter = urldecode($search_filter);
// }
// else {
$search_filter = "(objectclass=";
switch(urldecode($objectclass)) {
case "People": $search_filter .= "person)";break;
case "Groups": $search_filter .= "organizationalUnit)"; break;
case "Joinable Groups": $search_filter .= "joinableGroup)"; break;
case "Organisations": $search_filter .= "organization)"; break;
default: $search_filter .= "*)"; break;
}
switch(urldecode($attrib)) {
case "Common Name": $search_filter .= "(cn"; break;
case "Surname": $search_filter .= "(sn"; break;
case "Business Phone": $search_filter .= "(telephone"; break;
case "E-mail Address": $search_filter .= "(mail"; break;
case "Title": $search_filter .= "(title"; break;
case "Distinguished Name": $search_filter .="(dn"; break;
case "Location": $search_filter .="(l"; break;
default: break;
}
switch(urldecode($precision)) {
case "exactly matches": $search_filter .= "=".$search_string.")"; break;
case "starts with": $search_filter .= "=".$search_string."*)"; break;
case "ends with": $search_filter .= "=*".$search_string.")"; break;
case "approximates": $search_filter .= "~=".$search_string.")"; break;
case "contains": $search_filter .= "=*".$search_string."*)"; break;
default: break;
}
$search_filter = "(&".$search_filter.")";
// echo $search_filter;
// }
return $search_filter;
}
cfunction get_mode() {
global $mode;
if (isset ($mode)) {
$mode = urldecode($mode);
}
else {
$mode = "tree";
}
return $mode;
}
function display_form() {
global $lm, $FILE;
?> <form method=get action=<? echo $FILE; ?>>
<input type=text name=search_filter size=25 value="<? echo $lm->search_filter; ?>"><br>
<input type=hidden name=ldap_action value=search>
<input type=submit value="Search">
<input type=reset value="Clear">
</form>
<?
}
cfunction makeForm($s) {
global $FILE;
echo "<table border=0 cellspacing=2 cellpadding=2 bgcolor=gray>\n";
for ($i=0; $i<count($s); $i++) {
$parameter = $s[$i];
echo "<form method=get action=".$FILE.">\n";
echo "<tr>\n\t<td colspan=2 align=left bgcolor=lightgrey>\n";
echo $parameter[0];
echo "\t\t</td>\n\t</tr>";
echo "<tr>\n\t<td align=left bgcolor=white>\n";
echo "\t\t<input type=submit width=80 height=30 value=".$parameter[1].">\n";
echo "\t\t</td>\n\t<td align=left bgcolor=lightyellow>\n";
echo "\t\t<input type=text size=25 name=".$parameter[2].">\n";
echo "\t\t</td>\n\t</tr>\n</form>\n";
}
echo "</table>\n";
}
cfunction display_console() {
echo '<table width="100%" border=0 cellspacing=2 cellpadding=2 bgcolor=gray><tr>';
echo '<td colspan=2 align=center valign=middle bgcolor=white><h2>LDAP Console</h2></td></tr><tr>';
echo '<td align=center valign=middle>';
$things = array(
0 => array("Bind (authenticate) to the directory.", "bind", "who"),
1 => array("Change the search base.", "cb", "where"),
2 => array("Change information associated with an entry","change","entry"),
3 => array("Create a new group entry","create","group"),
4 => array("Edit a complete Directory entry","vedit","entry"),
5 => array("Find an entry in the directory.","find","entry")
);
$this->makeForm($things);
echo '</td><td align=center valign=middle>';
$things = array(
0 => array("Change the group base.","groupbase","where"),
1 => array("Display detailed help for a function","help","command"),
2 => array("Subscribe to a group.","join","group"),
3 => array("List the groups owned by someone","list","who"),
4 => array("List out the groups in which someone is a member.", "memberships", "who"),
5 => array("Remove obsolete entries from a group.", "purge", "group")
);
$this->makeForm($things);
echo '</td></tr></table>';
}
}
?>

View file

@ -0,0 +1,80 @@
<?
function display_options($string) {
?>
<select name="precision">
<option>exactly matches</option>
<option selected>approximates</option>
<option>starts with</option>
<option>ends with</option>
<option>contains</option>
</select>
<?
}
function display_items($string) {
?>
<select name="objectclass">
<option selected>People</option>
<option>Groups</option>
<option>Joinable Groups</option>
<option>Services</option>
<option>Organisations</option>
<option>Documents</option>
</select>
<?
}
function display_attribs($string) {
?>
<select name="attrib">
<option selected>Common Name</option>
<option>Surname</option>
<option>Business Phone</option>
<option>E-mail Address</option>
<option>Distinguished Name</option>
<option>Title</option>
<option>Location</option>
</select>
<?
}
function display_base_dn($string) {
?>
<select name="base_dn">
<option value="c=US">US</option>
<option value="o=University of Michigan, c=US" selected>University of Michigan</option>
<option value="o=Balorda and Balorda, c=UK">Balorda and Balorda</option>
</select>
<?
}
function display_simple_form() {
global $lm, $FILE;
?> <form method=form action=<? echo $FILE; ?>>
<input type=text name=search_filter size=25 value="<? echo $lm->search_filter; ?>"><br>
<input type=hidden name=ldap_action value=search>
<input type=submit value="Search"><input type=reset value="Clear">
</form><?
}
function display_advanced_form() {
global $lm, $FILE;
?>
<table width="100%" border=1 cellspacing=0 cellpadding=0>
<tr>
<td colspan=2 bgcolor="lightyellow"> <!bgcolor=#9380DB>
<p class=form>
<form method=get action=<? echo $FILE; ?>>
Find <?display_items("objectclass")?>
within <?display_base_dn("base_dn")?>
whose <?display_attribs("attrib")?><br>
<?display_options("precision")?>
<input type=text name=search_string size=25 value="">
<input type=hidden name=ldap_action value=search>
<input type=submit value="Search">
</form>
</p>
</td>
</tr>
</table>
<?
}
?>

View file

@ -0,0 +1,133 @@
var bV=parseInt(navigator.appVersion);
NS4=(document.layers) ? true : false;
IE4=((document.all)&&(bV>=4))?true:false;
ver4 = (NS4 || IE4) ? true : false;
function expandIt(){return}
function expandAll(){return}
isExpanded = false;
function getIndex(el) {
ind = null;
for (i=0; i<document.layers.length; i++) {
whichEl = document.layers[i];
if (whichEl.id == el) {
ind = i;
break;
}
}
return ind;
}
function arrange() {
nextY = document.layers[firstInd].pageY + document.layers[firstInd].document.height;
for (i=firstInd+1; i<document.layers.length; i++) {
whichEl = document.layers[i];
if (whichEl.visibility != "hide") {
whichEl.pageY = nextY;
nextY += whichEl.document.height;
}
}
}
function initIt(){
if (NS4) {
for (i=0; i<document.layers.length; i++) {
whichEl = document.layers[i];
if (whichEl.id.indexOf("Child") != -1) whichEl.visibility = "hide";
}
arrange();
}
else {
tempColl = document.all.tags("div");
for (i=0; i<tempColl.length; i++) {
if (tempColl(i).className == "child") tempColl(i).style.display = "none";
}
}
}
function expandIt(el) {
if (!ver4) return;
if (IE4) {expandIE(el)} else {expandNS(el)}
}
function expandIE(el) {
whichEl = eval(el + "Child");
whichIm = event.srcElement;
if (whichEl.style.display == "none") {
whichEl.style.display = "block";
whichIm.src = "true.gif";
}
else {
whichEl.style.display = "none";
whichIm.src = "false.gif";
}
}
function expandNS(el) {
whichEl = eval("document." + el + "Child");
whichIm = eval("document." + el + "Parent.document.images['imEx']");
if (whichEl.visibility == "hide") {
whichEl.visibility = "show";
whichIm.src = "true.gif";
}
else {
whichEl.visibility = "hide";
whichIm.src = "false.gif";
}
arrange();
}
function showAll() {
for (i=firstInd; i<document.layers.length; i++) {
whichEl = document.layers[i];
whichEl.visibility = "show";
}
}
function expandAll(isBot) {
newSrc = (isExpanded) ? "false.gif" : "true.gif";
if (NS4) {
document.images["imEx"].src = newSrc;
for (i=firstInd; i<document.layers.length; i++) {
whichEl = document.layers[i];
if (whichEl.id.indexOf("Parent") != -1) {
whichEl.document.images["imEx"].src = newSrc;
}
if (whichEl.id.indexOf("Child") != -1) {
whichEl.visibility = (isExpanded) ? "hide" : "show";
}
}
arrange();
if (isBot && isExpanded) scrollTo(0,document.layers[firstInd].pageY);
}
else {
divColl = document.all.tags("div");
for (i=0; i<divColl.length; i++) {
if (divColl(i).className == "child") {
divColl(i).style.display = (isExpanded) ? "none" : "block";
}
}
imColl = document.images.item("imEx");
for (i=0; i<imColl.length; i++) {
imColl(i).src = newSrc;
}
}
isExpanded = !isExpanded;
}
with (document) {
write("<style type='text/css'>");
if (NS4) {
write(".parent {position:absolute; visibility:hidden}");
write(".child {position:absolute; visibility:hidden}");
write(".regular {position:absolute; visibility:hidden}")
}
else {
write(".child {display:none}")
}
write("</style>\n");
}
onload = initIt;

View file

@ -0,0 +1,21 @@
/**
* resize.js 0.3 970811
* by gary smith
* js component for "reloading page onResize"
*/
if(!window.saveInnerWidth) {
window.onresize = resize;
window.saveInnerWidth = window.innerWidth;
window.saveInnerHeight = window.innerHeight;
}
function resize() {
if (saveInnerWidth < window.innerWidth ||
saveInnerWidth > window.innerWidth ||
saveInnerHeight > window.innerHeight ||
saveInnerHeight < window.innerHeight )
{
window.history.go(0);
}
}

View file

@ -0,0 +1,10 @@
PATH {
attributes: "at.conf";
photo: "ldap-photo.php3";
}
BASE {
basedn: "o=University of Michigan, c=US";
other: "o=Balorda and Balorda, c=UK";
other: "o=Simpson Family, c=ES";
}

View file

@ -0,0 +1,24 @@
BODY,B,P,H2,H1 {
font-family: lucida sans unicode;
}
BODY,P {
font-weight: bold;
font-size: 12pt;
}
.form {
font-size: 10pt;
color: #003333;
}
H3 {
font-family: Verdana,Arial,Helvetica;
font-size: 12pt;
font-weight: bold;
}
.head {
font-size: 13pt;
color: #003333;
}
.subsection {
font-size: 12pt;
color: #003333;
}