extern int DEBUGLEVEL;
+/*
+ * set the port that will be used for connections by the client
+ */
+
+int cli_set_port(struct cli_state *cli, int port)
+{
+
+ if (port != 0)
+ cli -> port = port;
+
+ return cli -> port; /* return it incase caller wants it */
+
+}
/****************************************************************************
recv an smb
int total_data=0;
int total_param=0;
int this_data,this_param;
+ uint8 eclass;
+ uint32 num;
*data_len = *param_len = 0;
return(False);
}
- if (cli_error(cli, NULL, NULL))
+ /* DOS error "more data" is an acceptable error code */
+ if (cli_error(cli, &eclass, &num) && !(eclass == ERRDOS && num == ERRmoredata))
{
return(False);
}
CVAL(cli->inbuf,smb_com)));
return(False);
}
- if (cli_error(cli, NULL, NULL))
+ /* DOS error "more data" is an acceptable error code */
+ if (cli_error(cli, &eclass, &num) && eclass != ERRDOS && num != ERRmoredata)
{
return(False);
}
fstring pword, ntpword;
if (cli->protocol < PROTOCOL_LANMAN1)
+ {
return True;
+ }
- if (passlen > sizeof(pword)-1 || ntpasslen > sizeof(ntpword)-1) {
+ if (passlen > sizeof(pword)-1 || ntpasslen > sizeof(ntpword)-1)
+ {
return False;
}
- if (((passlen == 0) || (passlen == 1)) && (pass[0] == '\0')) {
- /* Null session connect. */
- pword[0] = '\0';
- ntpword[0] = '\0';
- } else {
- if ((cli->sec_mode & 2) && passlen != 24) {
- passlen = 24;
- ntpasslen = 24;
- SMBencrypt((uchar *)pass,(uchar *)cli->cryptkey,(uchar *)pword);
- SMBNTencrypt((uchar *)ntpass,(uchar *)cli->cryptkey,(uchar *)ntpword);
- } else {
- fstrcpy(pword, pass);
- fstrcpy(ntpword, "");
- ntpasslen = 0;
- }
- }
-
- /* if in share level security then don't send a password now */
- if (!(cli->sec_mode & 1)) {
+ if (!IS_BITS_SET_ALL(cli->sec_mode, 1))
+ {
+ /* if in share level security then don't send a password now */
fstrcpy(pword, "");
passlen=1;
fstrcpy(ntpword, "");
ntpasslen=1;
}
+ else if ((passlen == 0 || passlen == 1) && (pass[0] == '\0'))
+ {
+ /* Null session connect. */
+ pword [0] = '\0';
+ ntpword[0] = '\0';
+ }
+ else if (passlen == 24 && ntpasslen == 24)
+ {
+ if (IS_BITS_SET_ALL(cli->sec_mode, 2))
+ {
+ /* encrypted password, implicit from 24-byte lengths */
+ memcpy(pword , pass , 24);
+ memcpy(ntpword, ntpass, 24);
+ }
+ else
+ {
+ DEBUG(0,("cli_session_setup: encrypted passwords not supported by server\n"));
+ return False;
+ }
+ }
+ else if (ntpasslen == 0 || !IS_BITS_SET_ALL(cli->sec_mode, 2))
+ {
+ /* plain-text password: server doesn't support encrypted. */
+ fstrcpy(pword, pass);
+ fstrcpy(ntpword, "");
+ ntpasslen = 0;
+ }
+ else /* passlen != 0 && ntpasslen != 0 && server supports encryption */
+ {
+ /* plain-text password requesting to be encrypted */
+ uchar *key = (uchar *)cli->cryptkey;
+ SMBencrypt ((uchar *)pass , key,(uchar *)pword );
+ SMBNTencrypt((uchar *)ntpass, key,(uchar *)ntpword);
+ passlen = 24;
+ ntpasslen = 24;
+ }
/* send a session setup command */
bzero(cli->outbuf,smb_size);
}
+ if (cli -> port == 0) cli -> port = 139;
+
cli->fd = open_socket_out(SOCK_STREAM, &cli->dest_ip,
- 139, cli->timeout);
+ cli -> port, cli->timeout);
if (cli->fd == -1)
return False;
ZERO_STRUCTP(cli);
+ cli -> port = 0;
cli->fd = -1;
cli->cnum = -1;
cli->pid = (uint16)getpid();
extern pstring scope;
fstring remote_machine;
struct in_addr dest_ip;
- struct nmb_name calling, called;
+ struct nmb_name calling, called, stupid_smbserver_called;
BOOL connected_ok = False;
- ZERO_STRUCTP(cli);
-
- if (!cli_initialise(cli))
- {
- DEBUG(0,("cli_connect_serverlist: unable to initialize client connection.\n"));
- return False;
- }
-
/*
* Treat each name in the 'password server =' line as a potential
* PDC/BDC. Contact each in turn and try and authenticate.
while(p && next_token(&p,remote_machine,LIST_SEP,sizeof(remote_machine)))
{
+ ZERO_STRUCTP(cli);
+
+ if (!cli_initialise(cli))
+ {
+ DEBUG(0,("cli_connect_serverlist: unable to initialize client connection.\n"));
+ return False;
+ }
+
standard_sub_basic(remote_machine);
strupper(remote_machine);
continue;
}
- if (ismyip(dest_ip))
+ if ((lp_security() != SEC_USER) && (ismyip(dest_ip)))
{
DEBUG(1,("cli_connect_serverlist: Password server loop - not using password server %s\n", remote_machine));
continue;
make_nmb_name(&calling, global_myname , 0x0 , scope);
make_nmb_name(&called , remote_machine, 0x20, scope);
+ /* stupid microsoft destruction of the ability of netbios
+ * to provide multiple netbios servers on one host.
+ */
+ make_nmb_name(&stupid_smbserver_called , "*SMBSERVER", 0x20, scope);
pwd_set_nullpwd(&cli->pwd);
if (!cli_establish_connection(cli, remote_machine, &dest_ip,
&calling, &called,
"IPC$", "IPC",
+ False, True) &&
+ !cli_establish_connection(cli, remote_machine, &dest_ip,
+ &calling, &stupid_smbserver_called,
+ "IPC$", "IPC",
False, True))
{
cli_shutdown(cli);
continue;
}
- if (!IS_BITS_SET_ALL(cli->sec_mode, 1))
+ if (cli->protocol < PROTOCOL_LANMAN2 ||
+ !IS_BITS_SET_ALL(cli->sec_mode, 1))
{
DEBUG(1,("cli_connect_serverlist: machine %s isn't in user level security mode\n",
remote_machine));