1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  24  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
  25  * Copyright (c) 2016 by Delphix. All rights reserved.
  26  */
  27 
  28 #ifndef _SMB_SHARE_H
  29 #define _SMB_SHARE_H
  30 
  31 #include <sys/param.h>
  32 #include <smbsrv/string.h>
  33 #include <smbsrv/smb_inet.h>
  34 #include <smbsrv/hash_table.h>
  35 #include <smbsrv/wintypes.h>
  36 #include <smb/lmerr.h>
  37 
  38 #if !defined(_KERNEL) && !defined(_FAKE_KERNEL)
  39 #include <libshare.h>
  40 #endif
  41 
  42 #ifdef __cplusplus
  43 extern "C" {
  44 #endif
  45 
  46 #define SMB_CVOL                "/var/smb/cvol"
  47 #define SMB_SYSROOT             SMB_CVOL "/windows"
  48 #define SMB_SYSTEM32            SMB_SYSROOT "/system32"
  49 #define SMB_VSS                 SMB_SYSTEM32 "/vss"
  50 
  51 /* Exported named pipes are in... */
  52 #define SMB_PIPE_DIR            "/var/smb/pipe"
  53 
  54 /*
  55  * Share Properties:
  56  *
  57  * name                 Advertised name of the share
  58  *
  59  * ad-container         Active directory container in which the share
  60  *                      will be published
  61  *
  62  * abe                  Determines whether Access Based Enumeration is applied
  63  *                      to a share
  64  *
  65  * csc                  Client-side caching (CSC) options applied to this share
  66  *      disabled        The client MUST NOT cache any files
  67  *      manual          The client should not automatically cache every file
  68  *                      that it opens
  69  *      auto            The client may cache every file that it opens
  70  *      vdo             The client may cache every file that it opens
  71  *                      and satisfy file requests from its local cache.
  72  *
  73  * catia                CATIA character substitution
  74  *
  75  * guestok              Determines whether guest access is allowed
  76  *
  77  * next three properties use access-list a al NFS
  78  *
  79  * ro                   list of hosts that will have read-only access
  80  * rw                   list of hosts that will have read/write access
  81  * none                 list of hosts that won't be allowed access
  82  */
  83 #define SHOPT_AD_CONTAINER      "ad-container"
  84 #define SHOPT_ABE               "abe"
  85 #define SHOPT_NAME              "name"
  86 #define SHOPT_CSC               "csc"
  87 #define SHOPT_CATIA             "catia"
  88 #define SHOPT_GUEST             "guestok"
  89 #define SHOPT_RO                "ro"
  90 #define SHOPT_RW                "rw"
  91 #define SHOPT_NONE              "none"
  92 #define SHOPT_DFSROOT           "dfsroot"
  93 #define SHOPT_DESCRIPTION       "description"
  94 
  95 #define SMB_DEFAULT_SHARE_GROUP "smb"
  96 #define SMB_PROTOCOL_NAME       "smb"
  97 
  98 /*
  99  * RAP protocol share related commands only understand
 100  * share names in OEM format and there is a 13 char size
 101  * limitation
 102  */
 103 #define SMB_SHARE_OEMNAME_MAX           13
 104 #define SMB_SHARE_NTNAME_MAX            81
 105 #define SMB_SHARE_CMNT_MAX              (64 * MTS_MB_CHAR_MAX)
 106 
 107 /*
 108  *      struct SHARE_INFO_1 {
 109  *              char            shi1_netname[13]
 110  *              char            shi1_pad;
 111  *              unsigned short  shi1_type
 112  *              char            *shi1_remark;
 113  *      }
 114  */
 115 #define SHARE_INFO_1_SIZE       (SMB_SHARE_OEMNAME_MAX + 1 + 2 + 4)
 116 
 117 /*
 118  * Share flags:
 119  *
 120  * There are two types of flags:
 121  *
 122  *   - flags that represent a share property
 123  *   - other flags set at runtime
 124  *
 125  * Property flags:
 126  *
 127  * SMB_SHRF_CSC_DISABLED        Client-side caching is disabled for this share
 128  * SMB_SHRF_CSC_MANUAL  Manual client-side caching is allowed
 129  * SMB_SHRF_CSC_AUTO    Automatic client-side caching (CSC) is allowed
 130  * SMB_SHRF_CSC_VDO     Automatic CSC and local cache lookup is allowed
 131  * SMB_SHRF_ACC_OPEN    No restrictions set
 132  * SMB_SHRF_ACC_NONE    "none" property set
 133  * SMB_SHRF_ACC_RO      "ro" (readonly) property set
 134  * SMB_SHRF_ACC_RW      "rw" (read/write) property set
 135  * SMB_SHRF_ACC_ALL     All of the access bits
 136  * SMB_SHRF_CATIA       CATIA character translation on/off
 137  * SMB_SHRF_GUEST_OK    Guest access on/off
 138  * SMB_SHRF_ABE         Access Based Enumeration on/off
 139  * SMB_SHRF_DFSROOT     Share is a standalone DFS root
 140  *
 141  * Runtime flags:
 142  *
 143  * SMB_SHRF_TRANS       Transient share
 144  * SMB_SHRF_PERM        Permanent share
 145  * SMB_SHRF_AUTOHOME    Autohome share.
 146  * SMB_SHRF_ADMIN       Admin share
 147  *
 148  * All autohome shares are transient but not all transient shares are autohome.
 149  * IPC$ and drive letter shares (e.g. d$, e$, etc) are transient but
 150  * not autohome.
 151  */
 152 
 153 /*
 154  * Property flags
 155  */
 156 #define SMB_SHRF_DFSROOT        0x0001
 157 #define SMB_SHRF_CATIA          0x0002
 158 #define SMB_SHRF_GUEST_OK       0x0004
 159 #define SMB_SHRF_ABE            0x0008
 160 
 161 #define SMB_SHRF_CSC_DISABLED   0x0010
 162 #define SMB_SHRF_CSC_MANUAL     0x0020
 163 #define SMB_SHRF_CSC_AUTO       0x0040
 164 #define SMB_SHRF_CSC_VDO        0x0080
 165 #define SMB_SHRF_CSC_MASK       0x00F0
 166 
 167 #define SMB_SHRF_ACC_OPEN       0x0000
 168 #define SMB_SHRF_ACC_NONE       0x0100
 169 #define SMB_SHRF_ACC_RO         0x0200
 170 #define SMB_SHRF_ACC_RW         0x0400
 171 #define SMB_SHRF_ACC_ALL        0x0F00
 172 
 173 /*
 174  * Runtime flags
 175  */
 176 #define SMB_SHRF_ADMIN          0x01000000
 177 #define SMB_SHRF_TRANS          0x10000000
 178 #define SMB_SHRF_PERM           0x20000000
 179 #define SMB_SHRF_AUTOHOME       0x40000000
 180 
 181 #define SMB_SHARE_PRINT         "print$"
 182 #define SMB_SHARE_PRINT_LEN     6
 183 /*
 184  * refcnt is currently only used for autohome.  autohome needs a refcnt
 185  * because a user can map their autohome share from more than one client
 186  * at the same time and the share should only be removed when the last
 187  * one is disconnected
 188  */
 189 typedef struct smb_share {
 190         char            shr_name[MAXNAMELEN];
 191         char            shr_path[MAXPATHLEN];
 192         char            shr_cmnt[SMB_SHARE_CMNT_MAX];
 193         char            shr_container[MAXPATHLEN];
 194         uint32_t        shr_flags;
 195         uint32_t        shr_type;
 196         uint32_t        shr_refcnt;
 197         uint32_t        shr_access_value;       /* host return access value */
 198         uid_t           shr_uid;                /* autohome only */
 199         gid_t           shr_gid;                /* autohome only */
 200         char            shr_access_none[MAXPATHLEN];
 201         char            shr_access_ro[MAXPATHLEN];
 202         char            shr_access_rw[MAXPATHLEN];
 203 } smb_share_t;
 204 
 205 typedef struct smb_shriter {
 206         smb_share_t     si_share;
 207         HT_ITERATOR     si_hashiter;
 208         boolean_t       si_first;
 209 } smb_shriter_t;
 210 
 211 #define LMSHARES_PER_REQUEST  10
 212 typedef struct smb_shrlist {
 213         int             sl_cnt;
 214         smb_share_t     sl_shares[LMSHARES_PER_REQUEST];
 215 } smb_shrlist_t;
 216 
 217 typedef struct smb_shr_execinfo {
 218         char            *e_sharename;
 219         char            *e_winname;
 220         char            *e_userdom;
 221         smb_inaddr_t    e_srv_ipaddr;
 222         smb_inaddr_t    e_cli_ipaddr;
 223         char            *e_cli_netbiosname;
 224         uid_t           e_uid;
 225         int             e_type;
 226 } smb_shr_execinfo_t;
 227 
 228 /*
 229  * LanMan share API (for both SMB kernel module and GUI/CLI sub-system)
 230  *
 231  * NOTE: If any error is encounted by either the door server or client,
 232  * NERR_InternalError will be returned by most functions, smb_share_count
 233  * will return -1.
 234  */
 235 
 236 #if !defined(_KERNEL) && !defined(_FAKE_KERNEL)
 237 
 238 /*
 239  * CIFS share management functions exported by libmlsvc
 240  */
 241 int smb_shr_start(void);
 242 void smb_shr_stop(void);
 243 void *smb_shr_load(void *);
 244 void smb_shr_iterinit(smb_shriter_t *);
 245 smb_share_t *smb_shr_iterate(smb_shriter_t *);
 246 void smb_shr_list(int, smb_shrlist_t *);
 247 int smb_shr_count(void);
 248 uint32_t smb_shr_add(smb_share_t *);
 249 uint32_t smb_shr_remove(char *);
 250 uint32_t smb_shr_rename(char *, char *);
 251 uint32_t smb_shr_get(char *, smb_share_t *);
 252 uint32_t smb_shr_modify(smb_share_t *);
 253 uint32_t smb_shr_get_realpath(const char *, char *, int);
 254 uint32_t smb_shr_hostaccess(smb_inaddr_t *, char *, char *, char *, uint32_t);
 255 int smb_shr_exec(smb_shr_execinfo_t *);
 256 
 257 boolean_t smb_shr_exists(char *);
 258 int smb_shr_is_special(char *);
 259 boolean_t smb_shr_is_restricted(char *);
 260 boolean_t smb_shr_is_admin(char *);
 261 char smb_shr_drive_letter(const char *);
 262 
 263 sa_handle_t smb_shr_sa_enter(void);
 264 void smb_shr_sa_exit(void);
 265 void smb_shr_sa_csc_option(const char *, smb_share_t *);
 266 char *smb_shr_sa_csc_name(const smb_share_t *);
 267 void smb_shr_sa_setflag(const char *, smb_share_t *, uint32_t);
 268 
 269 /*
 270  * CIFS share management API exported for other processes
 271  */
 272 uint32_t smb_share_list(int, smb_shrlist_t *);
 273 int smb_share_count(void);
 274 uint32_t smb_share_delete(char *);
 275 uint32_t smb_share_rename(char *, char *);
 276 uint32_t smb_share_create(smb_share_t *);
 277 uint32_t smb_share_modify(smb_share_t *);
 278 
 279 #endif  /* _KERNEL */
 280 
 281 #ifdef __cplusplus
 282 }
 283 #endif
 284 
 285 #endif /* _SMB_SHARE_H */