1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-24 21:34:56 +03:00

starting "connection reuse" system in smb-agent. added version number

which isn't actually used right now :-)
This commit is contained in:
Luke Leighton 0001-01-01 00:00:00 +00:00
parent a47cc64470
commit d54a64ae3a
6 changed files with 164 additions and 76 deletions

View File

@ -85,6 +85,7 @@ struct user_credentials
struct pwd_info pwd;
uint32 ntlmssp_flags;
BOOL reuse;
};
struct cli_state

View File

@ -1740,6 +1740,9 @@ struct field_info
char *str;
};
#define AGENT_CMD_CON 0
#define AGENT_CMD_CON_REUSE 1
#endif /* _SMB_H */
/* _SMB_H */

View File

@ -40,6 +40,7 @@ void copy_user_creds(struct user_credentials *to,
to->user_name[0] = 0;
pwd_set_nullpwd(&to->pwd);
to->ntlmssp_flags = 0;
to->reuse = False;
return;
}
@ -47,6 +48,7 @@ void copy_user_creds(struct user_credentials *to,
safe_strcpy(to->user_name, from->user_name, sizeof(from->user_name)-1);
memcpy(&to->pwd, &from->pwd, sizeof(from->pwd));
to->ntlmssp_flags = from->ntlmssp_flags;
to->reuse = from->reuse;
};
int cli_set_port(struct cli_state *cli, int port)
@ -785,6 +787,12 @@ BOOL cli_session_setup_x(struct cli_state *cli,
char *p;
BOOL esec = cli->capabilities & CAP_EXTENDED_SECURITY;
if (cli->usr.reuse)
{
DEBUG(3,("cli_session_setup_x: reuse enabled, skipping SMBsesssetupX\n"));
return True;
}
DEBUG(100,("cli_session_setup. extended security: %s\n",
BOOLSTR(esec)));
@ -1063,6 +1071,12 @@ BOOL cli_session_setup(struct cli_state *cli,
BOOL cli_ulogoff(struct cli_state *cli)
{
if (cli->usr.reuse)
{
DEBUG(3,("cli_ulogoff: reuse enabled, skipping SMBulogoff\n"));
return True;
}
bzero(cli->outbuf,smb_size);
set_message(cli->outbuf,2,0,True);
CVAL(cli->outbuf,smb_com) = SMBulogoffX;
@ -2981,6 +2995,12 @@ static int cli_init_redirect(struct cli_state *cli,
ZERO_STRUCT(data);
p = &data[4];
SSVAL(p, 0, 0);
p += 2;
SSVAL(p, 0, usr->reuse ? AGENT_CMD_CON_REUSE : AGENT_CMD_CON);
p += 2;
safe_strcpy(p, srv_name, 16);
p = skip_string(p, 1);
safe_strcpy(p, usr != NULL ? usr->user_name : "", 16);

View File

@ -156,7 +156,8 @@ static struct cli_use *cli_find(const char* srv_name,
{
continue;
}
if (!pwd_compare(&usr_creds->pwd, &c->cli->usr.pwd))
if (!usr_creds->reuse &&
!pwd_compare(&usr_creds->pwd, &c->cli->usr.pwd))
{
continue;
}
@ -221,6 +222,12 @@ struct cli_state *cli_net_use_add(const char* srv_name,
return cli->cli;
}
/* reuse an existing connection requested, and one was not found */
if (usr_creds != NULL && usr_creds->reuse)
{
return False;
}
/*
* allocate
*/

View File

@ -1362,6 +1362,7 @@ static void cmd_net(struct client_info *info, int argc, char *argv[])
pstrcpy(dest_host, cli_info.dest_host);
pstrcpy(u.user_name,optarg);
u.reuse = False;
if (argc <= 1)
{
@ -1567,6 +1568,8 @@ static void cmd_set(struct client_info *info, int argc, char *argv[])
*term_code = 0;
#endif /* KANJI */
usr.reuse = False;
if (argc > 1 && *argv[1] != '-')
{
if (argc > 1 && (*argv[1] != '-'))
@ -1579,10 +1582,16 @@ static void cmd_set(struct client_info *info, int argc, char *argv[])
}
}
while ((opt = getopt(argc, argv, "s:B:O:M:S:i:N:n:d:l:hI:EB:U:L:t:m:W:T:D:c:")) != EOF)
while ((opt = getopt(argc, argv, "Rs:B:O:M:S:i:N:n:d:l:hI:EB:U:L:t:m:W:T:D:c:")) != EOF)
{
switch (opt)
{
case 'R':
{
usr.reuse = True;
break;
}
case 'm':
{
/* FIXME ... max_protocol seems to be funny here */

View File

@ -99,6 +99,127 @@ static void agent_request(char *buf)
}
#define AGENT_CMD_CON 0
#define AGENT_CMD_CON_REUSE 1
static struct cli_state *init_client_connection(int c)
{
pstring buf;
uchar ntpw[16];
uchar lmpw[16];
fstring srv_name;
struct user_credentials usr;
char *p = buf;
int rl;
uint32 len;
uint16 version;
uint16 command;
BOOL new_con = False;
ZERO_STRUCT(usr);
DEBUG(10,("first request\n"));
rl = read(c, &buf, sizeof(len));
if (rl != sizeof(len))
{
DEBUG(0,("Unable to read length\n"));
dump_data(0, buf, sizeof(len));
return NULL;
}
len = IVAL(buf, 0);
if (len > sizeof(buf))
{
DEBUG(0,("length %d too long\n", len));
return NULL;
}
rl = read(c, buf, len);
if (rl < 0)
{
DEBUG(0,("Unable to read from connection\n"));
exit(1);
}
#ifdef DEBUG_PASSWORD
dump_data(100, buf, rl);
#endif
version = SVAL(p, 0);
p += 2;
command = SVAL(p, 0);
p += 2;
fstrcpy(srv_name, p);
p = skip_string(p, 1);
fstrcpy(usr.user_name, p);
p = skip_string(p, 1);
fstrcpy(usr.domain, p);
p = skip_string(p, 1);
if (PTR_DIFF(p, buf) < rl)
{
memcpy(ntpw, p, 16);
p += 16;
memcpy(lmpw, p, 16);
p += 16;
pwd_set_lm_nt_16(&usr.pwd, lmpw, ntpw);
}
else
{
pwd_set_nullpwd(&usr.pwd);
}
if (PTR_DIFF(p, buf) != rl)
{
DEBUG(0,("Buffer size %d %d!\n",
PTR_DIFF(p, buf), rl));
exit(1);
}
switch (command)
{
case AGENT_CMD_CON:
{
new_con = True;
break;
}
case AGENT_CMD_CON_REUSE:
{
new_con = True;
usr.reuse = True;
break;
}
default:
{
DEBUG(0,("unknown command %d\n", command));
return NULL;
}
}
if (new_con)
{
struct cli_state *s;
s = cli_net_use_add(srv_name, &usr, False);
if (s == NULL)
{
DEBUG(0,("Unable to connect to %s\n", srv_name));
return NULL;
}
if (write(c, s, sizeof(*s)) < 0)
{
DEBUG(0,("Could not write connection down pipe.\n"));
cli_net_use_del(srv_name, &usr, False, NULL);
return NULL;
}
return s;
}
return NULL;
}
static void agent_child(int c)
{
@ -132,82 +253,9 @@ static void agent_child(int c)
{
if (s == NULL)
{
pstring buf;
uchar ntpw[16];
uchar lmpw[16];
fstring srv_name;
struct user_credentials usr;
char *p = buf;
int rl;
uint32 len;
DEBUG(10,("first request\n"));
rl = read(c, &buf, sizeof(len));
if (rl != sizeof(len))
{
DEBUG(0,("Unable to read length\n"));
dump_data(0, buf, sizeof(len));
exit(1);
}
len = IVAL(buf, 0);
if (len > sizeof(buf))
{
DEBUG(0,("length %d too long\n", len));
exit(1);
}
rl = read(c, buf, len);
if (rl < 0)
{
DEBUG(0,("Unable to read from connection\n"));
exit(1);
}
#ifdef DEBUG_PASSWORD
dump_data(100, buf, rl);
#endif
fstrcpy(srv_name, p);
p = skip_string(p, 1);
fstrcpy(usr.user_name, p);
p = skip_string(p, 1);
fstrcpy(usr.domain, p);
p = skip_string(p, 1);
if (PTR_DIFF(p, buf) < rl)
{
memcpy(ntpw, p, 16);
p += 16;
memcpy(lmpw, p, 16);
p += 16;
pwd_set_lm_nt_16(&usr.pwd, lmpw, ntpw);
}
else
{
pwd_set_nullpwd(&usr.pwd);
}
if (PTR_DIFF(p, buf) != rl)
{
DEBUG(0,("Buffer size %d %d!\n",
PTR_DIFF(p, buf), rl));
exit(1);
}
s = cli_net_use_add(srv_name, &usr, False);
s = init_client_connection(c);
if (s == NULL)
{
DEBUG(0,("Unable to connect to %s\n", srv_name));
exit(1);
}
if (write(c, s, sizeof(*s)) < 0)
{
DEBUG(0,("Could not write ack\n"));
exit(1);
}
}