Exemplo n.º 1
0
static NTSTATUS share_sanity_checks(const struct tsocket_address *remote_address,
				    const char *rhost,
				    int snum,
				    fstring dev)
{
	char *raddr;

	raddr = tsocket_address_inet_addr_string(remote_address,
						 talloc_tos());
	if (raddr == NULL) {
		return NT_STATUS_NO_MEMORY;
	}

	if (!lp_snum_ok(snum) ||
	    !allow_access(lp_hosts_deny(snum), lp_hosts_allow(snum),
			  rhost, raddr)) {
		return NT_STATUS_ACCESS_DENIED;
	}

	if (dev[0] == '?' || !dev[0]) {
		if (lp_printable(snum)) {
			fstrcpy(dev,"LPT1:");
		} else if (strequal(lp_fstype(snum), "IPC")) {
			fstrcpy(dev, "IPC");
		} else {
			fstrcpy(dev,"A:");
		}
	}

	if (!strupper_m(dev)) {
		DEBUG(2,("strupper_m %s failed\n", dev));
		return NT_STATUS_INVALID_PARAMETER;
	}

	if (lp_printable(snum)) {
		if (!strequal(dev, "LPT1:")) {
			return NT_STATUS_BAD_DEVICE_TYPE;
		}
	} else if (strequal(lp_fstype(snum), "IPC")) {
		if (!strequal(dev, "IPC")) {
			return NT_STATUS_BAD_DEVICE_TYPE;
		}
	} else if (!strequal(dev, "A:")) {
		return NT_STATUS_BAD_DEVICE_TYPE;
	}

	/* Behave as a printer if we are supposed to */
	if (lp_printable(snum) && (strcmp(dev, "A:") == 0)) {
		fstrcpy(dev, "LPT1:");
	}

	return NT_STATUS_OK;
}
Exemplo n.º 2
0
static NTSTATUS share_sanity_checks(int snum, fstring dev) 
{
	
	if (!lp_snum_ok(snum) || 
	    !check_access(smbd_server_fd(), 
			  lp_hostsallow(snum), lp_hostsdeny(snum))) {    
		return NT_STATUS_ACCESS_DENIED;
	}

	if (dev[0] == '?' || !dev[0]) {
		if (lp_print_ok(snum)) {
			fstrcpy(dev,"LPT1:");
		} else if (strequal(lp_fstype(snum), "IPC")) {
			fstrcpy(dev, "IPC");
		} else {
			fstrcpy(dev,"A:");
		}
	}

	strupper_m(dev);

	if (lp_print_ok(snum)) {
		if (!strequal(dev, "LPT1:")) {
			return NT_STATUS_BAD_DEVICE_TYPE;
		}
	} else if (strequal(lp_fstype(snum), "IPC")) {
		if (!strequal(dev, "IPC")) {
			return NT_STATUS_BAD_DEVICE_TYPE;
		}
	} else if (!strequal(dev, "A:")) {
		return NT_STATUS_BAD_DEVICE_TYPE;
	}

	/* Behave as a printer if we are supposed to */
	if (lp_print_ok(snum) && (strcmp(dev, "A:") == 0)) {
		fstrcpy(dev, "LPT1:");
	}

	return NT_STATUS_OK;
}
Exemplo n.º 3
0
static uint32 _srv_SMBtcon_NT1(PSESS_HND sess_hnd, uint16 *conn_tid,
				Q_TCON_ANDX_4 *q4,
				Q_TCON_ANDX_D_4 *qd4,
				R_TCON_ANDX_3 *r3,
				R_TCON_ANDX_D_3 *rd3)
{
	PCONN_HND conn_hnd = NULL;
	int snum = -1;
	SMBSTR *dir_path = NULL;
	const char *path = smbstrA(&qd4->path);
	const char *dev = smbstrA(&qd4->device);
	char *service;
	struct vfs_connection_struct *vfs_conn;
	struct smb_connection_struct *conn;
	BOOL is_ipc;
	BOOL is_print;
	uint32 err = NT_STATUS_NOPROBLEMO;

	conn_hnd = find_conn_hnd_by_index(sess_hnd, *conn_tid);
	if (conn_hnd != NULL)
	{
		DEBUG(10,("close connection %d\n", *conn_tid));
		conn_close_hnd(conn_hnd); 
	}

	if (path == NULL || dev == NULL)
		return ERRDOS|ERRnosuchshare;

	DEBUG(10,("path: [%s] device: [%s]\n", path, dev));

	service = strchr(path+2, '\\') + 1;

	snum = lp_servicenumber(service);
	if (snum < 0)
	{
		err = ERRDOS|ERRnosuchshare;
		goto end;
	}

	if (!create_conn_hnd(sess_hnd, &conn_hnd, NULL) ||
	    conn_hnd == NULL ||
	    !get_conn_index(conn_hnd, conn_tid))
	{
		err = NT_STATUS_INVALID_HANDLE;
		goto end;
	}

	is_ipc = strequal(dev, "IPC") || strequal(service, "IPC$");
	is_print = strequal(dev, "LPT:");

	vfs_conn = g_new(struct vfs_connection_struct, 1);
	if (vfs_conn == NULL)
	{
		err = NT_STATUS_NO_MEMORY;
		goto end;
	}

	conn = g_new(struct smb_connection_struct, 1);
	if (conn == NULL)
	{
		err = NT_STATUS_NO_MEMORY;
		goto end;
	}

	if (is_ipc)
	{
		rd3->service = "IPC";
		smbstr_initA(&rd3->nativefs, "", 0);
		dir_path = NULL;
		vfs_init_ipc(vfs_conn, snum);
		smbvfs_init_ipc(conn, snum);
	}
	else if (is_print)
	{
		rd3->service = "LPT:";
		smbstr_initA(&rd3->nativefs, "", 0);
		dir_path = smbstr_setA("", 0);
		vfs_init_print(vfs_conn, snum);
		smbvfs_init_print(conn, snum);
	}
	else
	{
		rd3->service = "A:";
		smbstr_initA(&rd3->nativefs, lp_fstype(snum), 0);
		dir_path = smbstr_setA(lp_pathname(snum), 0);
		vfs_init_fs(vfs_conn, snum);
		smbvfs_init_fs(conn, snum);
	}

	vfs_conn->connectpath = smbstr_dup(dir_path);

	if (!set_conn_info(conn_hnd, vfs_conn, conn,
				smbstr_dup(&qd4->path), dir_path))
	{
		err = NT_STATUS_INVALID_HANDLE;
		goto end;
	}

	DEBUG(10,("service: [%s] snum: [%d] tid: [%d]\n",
				dir_path ? smbstrA(dir_path) : "",
				snum, *conn_tid));

end:
	if (err)
	{
		DEBUG(10,("error:[%x]\n", err));
		conn_close_hnd(conn_hnd);
	}
	return err;
}