a580e1 | 2000-09-27 | Fredrik Hübinette (Hubbe) | | #pike __REAL_VERSION__
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | |
|
aa370a | 1999-04-24 | Johan Schön | |
|
cec093 | 2005-03-11 | Martin Stjernholm | |
|
aa370a | 1999-04-24 | Johan Schön | |
|
ffaf45 | 2004-04-14 | Martin Nilsson | | #if constant(Standards.ASN1.Types)
|
aa370a | 1999-04-24 | Johan Schön | |
|
cec093 | 2005-03-11 | Martin Stjernholm | | import Protocols.LDAP;
|
aa370a | 1999-04-24 | Johan Schön | | #include "ldap_globals.h"
#include "ldap_errors.h"
int next_id = 1;
int ldap_version = LDAP_DEFAULT_VERSION;
|
cec093 | 2005-03-11 | Martin Stjernholm | | string ldap_rem_errstr = ldap_errlist[LDAP_SUCCESS];
|
aa370a | 1999-04-24 | Johan Schön | | int ldap_errno = LDAP_SUCCESS;
string readbuf="";
private int ok;
string writebuf="";
private function con_ok, con_fail;
object conthread;
array extra_args;
int connected = 0;
|
4cb56b | 2004-10-13 | H. William Welliver III | | object low_fd = Stdio.File();
|
066861 | 2001-09-14 | Honza Petrous | | object ldapfd;
|
aa370a | 1999-04-24 | Johan Schön | |
int seterr(int errno) {
ldap_errno = errno;
|
665945 | 2003-09-01 | Martin Nilsson | | return errno;
|
aa370a | 1999-04-24 | Johan Schön | | }
|
0b5e39 | 2002-07-22 | H. William Welliver III | |
|
665945 | 2003-09-01 | Martin Nilsson | | int error_number() { return ldap_errno; }
|
aa370a | 1999-04-24 | Johan Schön | |
|
0b5e39 | 2002-07-22 | H. William Welliver III | |
|
665945 | 2003-09-01 | Martin Nilsson | | string error_string() { return ldap_errlist[ldap_errno]; }
|
aa370a | 1999-04-24 | Johan Schön | |
|
665945 | 2003-09-01 | Martin Nilsson | | array error() { return ({error_number(), error_string()}); }
|
aa370a | 1999-04-24 | Johan Schön | |
static void read_answer() {
int msglen = 0, ix, ofs;
string s, shlp;
|
ead972 | 2003-01-20 | Martin Nilsson | | if(sizeof(readbuf) < 2)
|
066861 | 2001-09-14 | Honza Petrous | | readbuf = ldapfd->read(2);
|
ead972 | 2003-01-20 | Martin Nilsson | | if (intp(readbuf) || (sizeof(readbuf) < 2)) {
|
aa370a | 1999-04-24 | Johan Schön | | seterr (LDAP_TIMEOUT);
|
864867 | 2004-06-18 | Henrik Grubbström (Grubba) | | DWRITE_HI("protocol.read_answer: ERROR: connection closed.\n");
THROW(({"LDAP: connection closed.\n",backtrace()}));
|
665945 | 2003-09-01 | Martin Nilsson | |
|
aa370a | 1999-04-24 | Johan Schön | | return;
}
if (readbuf[0] != '0') {
seterr (LDAP_PROTOCOL_ERROR);
|
864867 | 2004-06-18 | Henrik Grubbström (Grubba) | | DWRITE_HI("protocol.read_answer: ERROR: retv=<"+sprintf("%O",readbuf)+">\n");
|
aa370a | 1999-04-24 | Johan Schön | | THROW(({"LDAP: Protocol mismatch.\n",backtrace()}));
|
665945 | 2003-09-01 | Martin Nilsson | |
|
aa370a | 1999-04-24 | Johan Schön | | return;
}
|
864867 | 2004-06-18 | Henrik Grubbström (Grubba) | | DWRITE(sprintf("protocol.read_answer: sizeof = %d\n", sizeof(readbuf)));
|
aa370a | 1999-04-24 | Johan Schön | |
msglen = readbuf[1];
ofs = 2;
if (msglen & 0x80) {
if (msglen == 0x80) {
seterr (LDAP_PROTOCOL_ERROR);
THROW(({"LDAP: Protocol mismatch.\n",backtrace()}));
|
665945 | 2003-09-01 | Martin Nilsson | |
|
aa370a | 1999-04-24 | Johan Schön | | return;
}
ofs = (msglen & 0x7f) + 2;
|
ead972 | 2003-01-20 | Martin Nilsson | | ix = ofs - sizeof(readbuf);
|
aa370a | 1999-04-24 | Johan Schön | | if(ix > 0)
|
066861 | 2001-09-14 | Honza Petrous | | s = ldapfd->read(ix);
|
ead972 | 2003-01-20 | Martin Nilsson | | if (!s || (sizeof(s) < ix)) {
|
aa370a | 1999-04-24 | Johan Schön | | seterr (LDAP_PROTOCOL_ERROR);
THROW(({"LDAP: Protocol mismatch.\n",backtrace()}));
|
665945 | 2003-09-01 | Martin Nilsson | |
|
aa370a | 1999-04-24 | Johan Schön | | return;
}
readbuf += s;
msglen = 0;
shlp = reverse(readbuf[2..ofs]);
|
ead972 | 2003-01-20 | Martin Nilsson | | for (ix=0; ix<sizeof(shlp); ix++) {
|
aa370a | 1999-04-24 | Johan Schön | | msglen += shlp[ix]*(1<<(ix*8));
}
}
|
ead972 | 2003-01-20 | Martin Nilsson | | ix = (ofs + msglen) - sizeof(readbuf);
|
aa370a | 1999-04-24 | Johan Schön | | if(ix > 0)
|
066861 | 2001-09-14 | Honza Petrous | | s = ldapfd->read(ix);
|
ead972 | 2003-01-20 | Martin Nilsson | | if (!s || (sizeof(s) < ix)) {
|
aa370a | 1999-04-24 | Johan Schön | | seterr (LDAP_SERVER_DOWN);
THROW(({"LDAP: connection closed by server.\n",backtrace()}));
|
665945 | 2003-09-01 | Martin Nilsson | |
|
aa370a | 1999-04-24 | Johan Schön | | return;
}
readbuf += s;
|
864867 | 2004-06-18 | Henrik Grubbström (Grubba) | |
DWRITE("protocol.read_answer: ok=1.\n");
|
aa370a | 1999-04-24 | Johan Schön | | ok = 1;
if(con_ok)
|
563bd7 | 2004-01-11 | Martin Nilsson | | con_ok(this, @extra_args);
|
aa370a | 1999-04-24 | Johan Schön | | }
static int is_whole_pdu() {
int msglen, ix, ofs;
string shlp;
|
ead972 | 2003-01-20 | Martin Nilsson | | if (sizeof(readbuf) < 3)
|
665945 | 2003-09-01 | Martin Nilsson | | return 0;
|
aa370a | 1999-04-24 | Johan Schön | |
if (readbuf[0] != '0')
|
665945 | 2003-09-01 | Martin Nilsson | | return 1;
|
aa370a | 1999-04-24 | Johan Schön | |
msglen = readbuf[1];
if (msglen & 0x80) {
if (msglen == 0x80)
|
665945 | 2003-09-01 | Martin Nilsson | | return 1;
|
aa370a | 1999-04-24 | Johan Schön | | ofs = (msglen & 0x7f) + 2;
|
ead972 | 2003-01-20 | Martin Nilsson | | ix = ofs - sizeof(readbuf);
|
aa370a | 1999-04-24 | Johan Schön | | if(ix > 0)
|
665945 | 2003-09-01 | Martin Nilsson | | return 0;
|
aa370a | 1999-04-24 | Johan Schön | | msglen = 0;
shlp = reverse(readbuf[2..ofs]);
|
ead972 | 2003-01-20 | Martin Nilsson | | for (ix=0; ix<sizeof(shlp); ix++) {
|
aa370a | 1999-04-24 | Johan Schön | | msglen += shlp[ix]*(1<<(ix*8));
}
}
|
ead972 | 2003-01-20 | Martin Nilsson | | ix = (ofs + msglen) - sizeof(readbuf);
|
aa370a | 1999-04-24 | Johan Schön | | if(ix > 0)
|
665945 | 2003-09-01 | Martin Nilsson | | return 0;
|
aa370a | 1999-04-24 | Johan Schön | |
|
665945 | 2003-09-01 | Martin Nilsson | | return 1;
|
aa370a | 1999-04-24 | Johan Schön | | }
|
066861 | 2001-09-14 | Honza Petrous | | void create(object fd) {
ldapfd = fd;
|
aa370a | 1999-04-24 | Johan Schön | | }
|
d83c72 | 2004-05-25 | Henrik Grubbström (Grubba) | | string|int do_op(object msgop, object|void controls) {
|
aa370a | 1999-04-24 | Johan Schön | |
object msgval;
object msgid;
int rv = 0, msgnum;
string s;
msgnum = next_id++;
msgid = Standards.ASN1.Types.asn1_integer(msgnum);
|
d83c72 | 2004-05-25 | Henrik Grubbström (Grubba) | | if (controls) {
msgval = Standards.ASN1.Types.asn1_sequence(({msgid, msgop, controls}));
} else {
msgval = Standards.ASN1.Types.asn1_sequence(({msgid, msgop}));
}
|
aa370a | 1999-04-24 | Johan Schön | |
if (objectp(msgval)) {
DWRITE(sprintf("protocol.do_op: msg = [%d]\n",sizeof(msgval->get_der())));
} else
DWRITE("protocol.do_op: msg is null!\n");
writebuf = msgval->get_der();
|
066861 | 2001-09-14 | Honza Petrous | | rv = ldapfd->write(writebuf);
|
aa370a | 1999-04-24 | Johan Schön | |
if (rv < 2) {
seterr (LDAP_SERVER_DOWN);
THROW(({"LDAP: connection closed by server.\n",backtrace()}));
|
665945 | 2003-09-01 | Martin Nilsson | | return -ldap_errno;
|
aa370a | 1999-04-24 | Johan Schön | | }
DWRITE(sprintf("protocol.do_op: write OK [%d bytes].\n",rv));
msgval = 0; msgid = 0;
writebuf= "";
readbuf= "";
read_answer();
|
665945 | 2003-09-01 | Martin Nilsson | | return readbuf;
|
aa370a | 1999-04-24 | Johan Schön | |
}
string|int readmsg(int msgid) {
int msglen = 0, ix;
|
89cbf8 | 1999-12-30 | Henrik Grubbström (Grubba) | | string|int retv;
|
149805 | 1999-12-30 | Henrik Grubbström (Grubba) | | string s, shlp;
|
aa370a | 1999-04-24 | Johan Schön | |
|
066861 | 2001-09-14 | Honza Petrous | | retv = ldapfd->read(2);
|
864867 | 2004-06-18 | Henrik Grubbström (Grubba) | | if (retv == -1) {
|
aa370a | 1999-04-24 | Johan Schön | | seterr (LDAP_TIMEOUT);
DWRITE_HI("protocol.readmsg: ERROR: connection timeout.\n");
THROW(({"LDAP: connection timeout.\n",backtrace()}));
|
665945 | 2003-09-01 | Martin Nilsson | | return -ldap_errno;
|
aa370a | 1999-04-24 | Johan Schön | | }
if (!retv || (sizeof(retv) != 2) || (retv[0] != '0')) {
seterr (LDAP_PROTOCOL_ERROR);
DWRITE_HI("protocol.readmsg: ERROR: retv=<"+sprintf("%O",retv)+">\n");
THROW(({"LDAP: Protocol mismatch.\n",backtrace()}));
|
665945 | 2003-09-01 | Martin Nilsson | | return -ldap_errno;
|
aa370a | 1999-04-24 | Johan Schön | | }
DWRITE(sprintf("protocol.readmsg: sizeof = %d\n", sizeof(retv)));
msglen = retv[1];
if (msglen & 0x80) {
|
864867 | 2004-06-18 | Henrik Grubbström (Grubba) | | if (msglen == 0x80) {
|
aa370a | 1999-04-24 | Johan Schön | | seterr (LDAP_PROTOCOL_ERROR);
THROW(({"LDAP: Protocol mismatch.\n",backtrace()}));
|
665945 | 2003-09-01 | Martin Nilsson | | return -ldap_errno;
|
aa370a | 1999-04-24 | Johan Schön | | }
|
066861 | 2001-09-14 | Honza Petrous | | s = ldapfd->read(msglen & 0x7f);
|
aa370a | 1999-04-24 | Johan Schön | | if (!s) {
seterr (LDAP_PROTOCOL_ERROR);
THROW(({"LDAP: Protocol mismatch.\n",backtrace()}));
|
665945 | 2003-09-01 | Martin Nilsson | | return -ldap_errno;
|
aa370a | 1999-04-24 | Johan Schön | | }
retv += s;
msglen = 0;
shlp = reverse(s);
for (ix=0; ix<sizeof(shlp); ix++) {
msglen += shlp[ix]*(1<<(ix*8));
}
}
|
864867 | 2004-06-18 | Henrik Grubbström (Grubba) | | DWRITE(sprintf("protocol.readmsg: reading %d bytes.\n", msglen));
|
066861 | 2001-09-14 | Honza Petrous | | s = ldapfd->read(msglen);
|
aa370a | 1999-04-24 | Johan Schön | | if (!s | (sizeof(s) < msglen)) {
seterr (LDAP_SERVER_DOWN);
THROW(({"LDAP: connection closed by server.\n",backtrace()}));
|
665945 | 2003-09-01 | Martin Nilsson | | return -ldap_errno;
|
aa370a | 1999-04-24 | Johan Schön | | }
retv += s;
DWRITE(sprintf("protocol.readmsg: %s\n", .ldap_privates.ldap_der_decode(retv)->debug_string()));
|
665945 | 2003-09-01 | Martin Nilsson | | return retv;
|
aa370a | 1999-04-24 | Johan Schön | | }
int writemsg(object msgop) {
object msgval;
object msgid;
int rv = 0, msgnum;
string s;
msgnum = next_id++;
msgid = Standards.ASN1.Types.asn1_integer(msgnum);
msgval = Standards.ASN1.Types.asn1_sequence(({msgid, msgop}));
if (objectp(msgval)) {
DWRITE(sprintf("protocol.writemsg: msg = [%d]\n",sizeof(msgval->get_der())));
} else
DWRITE("protocol.writemsg: msg is null!\n");
|
066861 | 2001-09-14 | Honza Petrous | | rv = ldapfd->write(msgval->get_der());
|
aa370a | 1999-04-24 | Johan Schön | |
if (rv < 2) {
seterr (LDAP_SERVER_DOWN);
THROW(({"LDAP: connection closed by server.\n",backtrace()}));
|
665945 | 2003-09-01 | Martin Nilsson | | return -ldap_errno;
|
aa370a | 1999-04-24 | Johan Schön | | }
DWRITE(sprintf("protocol.writemsg: write OK [%d bytes].\n",rv));
msgval = 0; msgid = 0;
|
665945 | 2003-09-01 | Martin Nilsson | | return msgnum;
|
aa370a | 1999-04-24 | Johan Schön | | }
|
ffaf45 | 2004-04-14 | Martin Nilsson | | #else
constant this_program_does_not_exist=1;
|
92dbd3 | 1999-08-24 | Fredrik Hübinette (Hubbe) | | #endif
|