Print this page
NEX-19057 All zfs/nfs/smb threads in door calls to idle idmap
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
1575 untangle libmlrpc from SMB server
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Toomas Soome <tsoome@me.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
NEX-16159 Time spent sharing SMB filesystems could be reduced by optimizing smb_getdataset for default mount points (build fix)
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
NEX-16159 Time spent sharing SMB filesystems could be reduced by optimizing smb_getdataset for default mount points
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Reviewed by: Matt Barden <matt.barden@nexenta.com>
NEX-15558 SMB logon fails during 1st second after service start
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-15558 SMB logon fails during 1st second after service start
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-15052 Need a way to add appliance local user/group ACE from Windows
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-15041 method to delete local SMB users
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-15052 Need a way to add appliance local user/group ACE from Windows
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-15041 method to delete local SMB users
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-9497 SMB should bypass ACL traverse checking
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-10019 SMB server min_protocol setting
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-5273 SMB 3 Encryption
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-4083 Upstream changes from illumos 5917 and 5995
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-3611 CLONE NEX-3550 Replace smb2_enable with max_protocol
Reviewed by: Yuri Pankov <Yuri.Pankov@nexenta.com>
NEX-2667 Wrong error when join domain with wrong password
Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com>
Reviewed by: Bayard Bell <bayard.bell@nexenta.com>
NEX-2225 Unable to join NexentaStor to 2008 AD
NEX-2346 SMB server debug logging cleanup after NEX-2314
NEX-2314 SMB server debug logging needs improvement
NEX-2286 smbadm join error messages are uninformative
NEX-1404 fixed malformed entries in zone_sun.tab
NEX-1799 Failure to authenticate domain account from Win2003 with NTLM(v1)
NEX-1638 Updated DC Locator
 Includes work by: matt.barden@nexenta.com, kevin.crowe@nexenta.com
SMB-126 Unable to map share from win2003/win2003R2 client ...
SMB-107 Unable to map network drive in workgroup mode using Windows XP...
SMB-68 NTLM(v1) inbound with Extended Session Security
NEX-1050 enable_smb2 should be smb2_enable
SMB-11 SMB2 message parse & dispatch
SMB-12 SMB2 Negotiate Protocol
SMB-13 SMB2 Session Setup
SMB-14 SMB2 Logoff
SMB-15 SMB2 Tree Connect
SMB-16 SMB2 Tree Disconnect
SMB-17 SMB2 Create
SMB-18 SMB2 Close
SMB-19 SMB2 Flush
SMB-20 SMB2 Read
SMB-21 SMB2 Write
SMB-22 SMB2 Lock/Unlock
SMB-23 SMB2 Ioctl
SMB-24 SMB2 Cancel
SMB-25 SMB2 Echo
SMB-26 SMB2 Query Dir
SMB-27 SMB2 Change Notify
SMB-28 SMB2 Query Info
SMB-29 SMB2 Set Info
SMB-30 SMB2 Oplocks
SMB-53 SMB2 Create Context options
(SMB2 code review cleanup 1, 2, 3)
SMB-70 Hang during boot after SMB-50
SMB-56 extended security NTLMSSP, inbound
SMB-50 User-mode SMB server
 Includes work by these authors:
 Thomas Keiser <thomas.keiser@nexenta.com>
 Albert Lee <trisk@nexenta.com>
SFR-56 Identity Management for UNIX (IDMU) authentication support
re #12435 rb3958 r10 is added 2 times to panic info
re #12393 rb3935 Kerberos and smbd disagree about who is our AD server
re #6813 rb1757 port 2976 Child folder visibility through shares


   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) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  24  * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
  25  */
  26 
  27 #ifndef _LIBSMB_H
  28 #define _LIBSMB_H
  29 
  30 #ifdef  __cplusplus
  31 extern "C" {
  32 #endif
  33 
  34 #include <sys/types.h>

  35 #include <sys/list.h>
  36 #include <sys/avl.h>
  37 #include <arpa/inet.h>
  38 #include <net/if.h>       /* LIFNAMSIZ */
  39 #include <netdb.h>
  40 #include <stdlib.h>
  41 #include <libscf.h>
  42 #include <libshare.h>
  43 #include <uuid/uuid.h>
  44 #include <synch.h>
  45 #include <stdarg.h>
  46 




  47 #include <smbsrv/string.h>
  48 #include <smbsrv/smb_idmap.h>
  49 #include <smbsrv/netbios.h>
  50 #include <smbsrv/smb_share.h>
  51 #include <smb/nterror.h>
  52 #include <smb/ntstatus.h>
  53 #include <smbsrv/smb_door.h>
  54 #include <smbsrv/alloc.h>
  55 #include <smbsrv/hash_table.h>
  56 #include <smbsrv/msgbuf.h>
  57 #include <smbsrv/wintypes.h>
  58 #include <smbsrv/smb_xdr.h>
  59 #include <smbsrv/smbinfo.h>
  60 #include <smbsrv/ntifs.h>
  61 
  62 #define SMB_VARSMB_DIR "/var/smb"
  63 #define SMB_VARRUN_DIR "/var/run/smb"
  64 #define SMB_CCACHE_FILE "ccache"
  65 #define SMB_CCACHE_PATH SMB_VARRUN_DIR "/" SMB_CCACHE_FILE
  66 
  67 
  68 /* Max value length of all SMB properties */
  69 #define MAX_VALUE_BUFLEN        512
  70 
  71 #define SMBD_FMRI_PREFIX                "network/smb/server"
  72 #define SMBD_DEFAULT_INSTANCE_FMRI      "svc:/network/smb/server:default"
  73 #define SMBD_PG_NAME                    "smbd"
  74 #define SMBD_PROTECTED_PG_NAME          "read"
  75 #define SMBD_EXEC_PG_NAME               "exec"
  76 
  77 #define SMBD_SMF_OK             0


 138 
 139         SMB_CI_DYNDNS_ENABLE,
 140 
 141         SMB_CI_MACHINE_PASSWD,
 142         SMB_CI_MACHINE_UUID,
 143         SMB_CI_KPASSWD_SRV,
 144         SMB_CI_KPASSWD_DOMAIN,
 145         SMB_CI_KPASSWD_SEQNUM,
 146         SMB_CI_NETLOGON_SEQNUM,
 147         SMB_CI_IPV6_ENABLE,
 148         SMB_CI_PRINT_ENABLE,
 149         SMB_CI_MAP,
 150         SMB_CI_UNMAP,
 151         SMB_CI_DISPOSITION,
 152         SMB_CI_DFS_STDROOT_NUM,
 153         SMB_CI_TRAVERSE_MOUNTS,
 154         SMB_CI_SMB2_ENABLE_OLD, /* obsolete */
 155         SMB_CI_INITIAL_CREDITS,
 156         SMB_CI_MAXIMUM_CREDITS,
 157         SMB_CI_MAX_PROTOCOL,



 158 
 159         SMB_CI_MAX
 160 } smb_cfg_id_t;
 161 
 162 /* SMF helper functions */
 163 extern smb_scfhandle_t *smb_smf_scf_init(char *);
 164 extern void smb_smf_scf_fini(smb_scfhandle_t *);
 165 extern int smb_smf_start_transaction(smb_scfhandle_t *);
 166 extern int smb_smf_end_transaction(smb_scfhandle_t *);
 167 extern int smb_smf_set_string_property(smb_scfhandle_t *, char *, char *);
 168 extern int smb_smf_get_string_property(smb_scfhandle_t *, char *,
 169     char *, size_t);
 170 extern int smb_smf_set_integer_property(smb_scfhandle_t *, char *, int64_t);
 171 extern int smb_smf_get_integer_property(smb_scfhandle_t *, char *, int64_t *);
 172 extern int smb_smf_set_boolean_property(smb_scfhandle_t *, char *, uint8_t);
 173 extern int smb_smf_get_boolean_property(smb_scfhandle_t *, char *, uint8_t *);
 174 extern int smb_smf_set_opaque_property(smb_scfhandle_t *, char *,
 175     void *, size_t);
 176 extern int smb_smf_get_opaque_property(smb_scfhandle_t *, char *,
 177     void *, size_t);
 178 extern int smb_smf_create_service_pgroup(smb_scfhandle_t *, char *);
 179 extern int smb_smf_delete_property(smb_scfhandle_t *, char *);
 180 extern int smb_smf_restart_service(void);
 181 extern int smb_smf_maintenance_mode(void);
 182 
 183 /* ZFS interface */
 184 int smb_getdataset(const char *, char *, size_t);

 185 
 186 /* Configuration management functions  */
 187 extern int smb_config_get(smb_cfg_id_t, char *, int);
 188 extern char *smb_config_getname(smb_cfg_id_t);
 189 extern int smb_config_getstr(smb_cfg_id_t, char *, int);
 190 extern int smb_config_getnum(smb_cfg_id_t, int64_t *);
 191 extern boolean_t smb_config_getbool(smb_cfg_id_t);
 192 
 193 extern int smb_config_set(smb_cfg_id_t, char *);
 194 extern int smb_config_setstr(smb_cfg_id_t, char *);
 195 extern int smb_config_setnum(smb_cfg_id_t, int64_t);
 196 extern int smb_config_setbool(smb_cfg_id_t, boolean_t);
 197 
 198 extern boolean_t smb_config_get_ads_enable(void);
 199 extern int smb_config_get_debug(void);
 200 extern uint8_t smb_config_get_fg_flag(void);
 201 extern char *smb_config_get_localsid(void);
 202 extern int smb_config_get_localuuid(uuid_t);
 203 extern int smb_config_secmode_fromstr(char *);
 204 extern char *smb_config_secmode_tostr(int);
 205 extern int smb_config_get_secmode(void);
 206 extern int smb_config_set_secmode(int);
 207 extern int smb_config_set_idmap_domain(char *);
 208 extern int smb_config_refresh_idmap(void);
 209 extern int smb_config_getip(smb_cfg_id_t, smb_inaddr_t *);
 210 extern void smb_config_get_version(smb_version_t *);
 211 uint32_t smb_config_get_execinfo(char *, char *, size_t);
 212 extern void smb_config_get_negtok(uchar_t *, uint32_t *);
 213 
 214 extern int smb_config_check_protocol(char *);
 215 extern uint32_t smb_config_get_max_protocol(void);

 216 extern void smb_config_upgrade(void);
 217 


 218 extern void smb_load_kconfig(smb_kmod_cfg_t *kcfg);
 219 extern uint32_t smb_crc_gen(uint8_t *, size_t);
 220 
 221 extern boolean_t smb_match_netlogon_seqnum(void);
 222 extern int smb_setdomainprops(char *, char *, char *);
 223 extern void smb_update_netlogon_seqnum(void);
 224 
 225 /* maximum password length on Windows 2000 and above */
 226 #define SMB_PASSWD_MAXLEN       127
 227 #define SMB_USERNAME_MAXLEN     40
 228 
 229 /* See also: smb_joininfo_xdr() */
 230 typedef struct smb_joininfo {
 231         char domain_name[MAXHOSTNAMELEN];
 232         char domain_username[SMB_USERNAME_MAXLEN + 1];
 233         char domain_passwd[SMB_PASSWD_MAXLEN + 1];
 234         uint32_t mode;
 235 } smb_joininfo_t;
 236 
 237 /* See also: smb_joinres_xdr() */


 432  */
 433 
 434 #define SMB_PWF_LM      0x01    /* LM hash is present */
 435 #define SMB_PWF_NT      0x02    /* NT hash is present */
 436 #define SMB_PWF_DISABLE 0x04    /* Account is disabled */
 437 
 438 typedef struct smb_passwd {
 439         uid_t           pw_uid;
 440         uint32_t        pw_flags;
 441         char            pw_name[SMB_USERNAME_MAXLEN];
 442         uint8_t         pw_lmhash[SMBAUTH_HASH_SZ];
 443         uint8_t         pw_nthash[SMBAUTH_HASH_SZ];
 444 } smb_passwd_t;
 445 
 446 /*
 447  * Control flags passed to smb_pwd_setcntl
 448  */
 449 #define SMB_PWC_DISABLE 0x01
 450 #define SMB_PWC_ENABLE  0x02
 451 #define SMB_PWC_NOLM    0x04

 452 
 453 #define SMB_PWE_SUCCESS         0
 454 #define SMB_PWE_USER_UNKNOWN    1
 455 #define SMB_PWE_USER_DISABLE    2
 456 #define SMB_PWE_CLOSE_FAILED    3
 457 #define SMB_PWE_OPEN_FAILED     4
 458 #define SMB_PWE_WRITE_FAILED    6
 459 #define SMB_PWE_UPDATE_FAILED   7
 460 #define SMB_PWE_STAT_FAILED     8
 461 #define SMB_PWE_BUSY            9
 462 #define SMB_PWE_DENIED          10
 463 #define SMB_PWE_SYSTEM_ERROR    11
 464 #define SMB_PWE_INVALID_PARAM   12
 465 #define SMB_PWE_NO_MEMORY       13
 466 #define SMB_PWE_MAX             14
 467 
 468 typedef struct smb_pwditer {
 469         void *spi_next;
 470 } smb_pwditer_t;
 471 


 644         smb_trusted_domains_t   d_trusted;
 645 } smb_domainex_t;
 646 
 647 int smb_domain_init(uint32_t);
 648 void smb_domain_fini(void);
 649 void smb_domain_show(void);
 650 void smb_domain_save(void);
 651 boolean_t smb_domain_lookup_name(char *, smb_domain_t *);
 652 boolean_t smb_domain_lookup_sid(smb_sid_t *, smb_domain_t *);
 653 boolean_t smb_domain_lookup_type(smb_domain_type_t, smb_domain_t *);
 654 boolean_t smb_domain_getinfo(smb_domainex_t *);
 655 void smb_domain_update(smb_domainex_t *);
 656 uint32_t smb_domain_start_update(void);
 657 void smb_domain_end_update(void);
 658 void smb_domain_set_basic_info(char *, char *, char *, smb_domain_t *);
 659 void smb_domain_set_dns_info(char *, char *, char *, char *, char *,
 660     smb_domain_t *);
 661 void smb_domain_set_trust_info(char *, char *, char *,
 662     uint32_t, uint32_t, uint32_t, smb_domain_t *);
 663 void smb_domain_current_dc(smb_dcinfo_t *);

 664 
 665 typedef struct smb_gsid {
 666         smb_sid_t *gs_sid;
 667         uint16_t gs_type;
 668 } smb_gsid_t;
 669 
 670 struct sqlite_vm;
 671 struct sqlite;
 672 
 673 typedef struct smb_giter {
 674         struct sqlite_vm        *sgi_vm;
 675         struct sqlite           *sgi_db;
 676         uint32_t                sgi_nerr;
 677 } smb_giter_t;
 678 
 679 typedef struct smb_group {
 680         char                    *sg_name;
 681         char                    *sg_cmnt;
 682         uint32_t                sg_attr;
 683         uint32_t                sg_rid;


 694 int smb_lgrp_rename(char *, char *);
 695 int smb_lgrp_delete(char *);
 696 int smb_lgrp_setcmnt(char *, char *);
 697 int smb_lgrp_getcmnt(char *, char **);
 698 int smb_lgrp_getpriv(char *, uint8_t, boolean_t *);
 699 int smb_lgrp_setpriv(char *, uint8_t, boolean_t);
 700 int smb_lgrp_add_member(char *, smb_sid_t *, uint16_t);
 701 int smb_lgrp_del_member(char *, smb_sid_t *, uint16_t);
 702 int smb_lgrp_getbyname(char *, smb_group_t *);
 703 int smb_lgrp_getbyrid(uint32_t, smb_domain_type_t, smb_group_t *);
 704 void smb_lgrp_free(smb_group_t *);
 705 uint32_t smb_lgrp_err_to_ntstatus(uint32_t);
 706 boolean_t smb_lgrp_is_member(smb_group_t *, smb_sid_t *);
 707 char *smb_lgrp_strerror(int);
 708 int smb_lgrp_iteropen(smb_giter_t *);
 709 void smb_lgrp_iterclose(smb_giter_t *);
 710 boolean_t smb_lgrp_itererror(smb_giter_t *);
 711 int smb_lgrp_iterate(smb_giter_t *, smb_group_t *);
 712 
 713 int smb_lookup_sid(const char *, lsa_account_t *);

 714 int smb_lookup_name(const char *, sid_type_t, lsa_account_t *);

 715 
 716 #define SMB_LGRP_SUCCESS                0
 717 #define SMB_LGRP_INVALID_ARG            1
 718 #define SMB_LGRP_INVALID_MEMBER         2
 719 #define SMB_LGRP_INVALID_NAME           3
 720 #define SMB_LGRP_NOT_FOUND              4
 721 #define SMB_LGRP_EXISTS                 5
 722 #define SMB_LGRP_NO_SID                 6
 723 #define SMB_LGRP_NO_LOCAL_SID           7
 724 #define SMB_LGRP_SID_NOTLOCAL           8
 725 #define SMB_LGRP_WKSID                  9
 726 #define SMB_LGRP_NO_MEMORY              10
 727 #define SMB_LGRP_DB_ERROR               11
 728 #define SMB_LGRP_DBINIT_ERROR           12
 729 #define SMB_LGRP_INTERNAL_ERROR         13
 730 #define SMB_LGRP_MEMBER_IN_GROUP        14
 731 #define SMB_LGRP_MEMBER_NOT_IN_GROUP    15
 732 #define SMB_LGRP_NO_SUCH_PRIV           16
 733 #define SMB_LGRP_NO_SUCH_DOMAIN         17
 734 #define SMB_LGRP_PRIV_HELD              18


 841 /*
 842  * Well-known account interfaces
 843  */
 844 smb_wka_t *smb_wka_lookup_builtin(const char *);
 845 smb_wka_t *smb_wka_lookup_name(const char *);
 846 smb_wka_t *smb_wka_lookup_sid(smb_sid_t *);
 847 smb_sid_t *smb_wka_get_sid(const char *);
 848 char *smb_wka_get_domain(int);
 849 uint32_t smb_wka_token_groups(uint32_t, smb_ids_t *);
 850 
 851 /*
 852  * In memory account representation
 853  */
 854 typedef struct smb_account {
 855         char            *a_name;
 856         char            *a_domain;
 857         uint16_t        a_type;
 858         smb_sid_t       *a_sid;
 859         smb_sid_t       *a_domsid;
 860         uint32_t        a_rid;

 861 } smb_account_t;
 862 
 863 uint32_t smb_sam_lookup_name(char *, char *, uint16_t, smb_account_t *);
 864 uint32_t smb_sam_lookup_sid(smb_sid_t *, smb_account_t *);
 865 int smb_sam_usr_cnt(void);
 866 uint32_t smb_sam_usr_groups(smb_sid_t *, smb_ids_t *);
 867 int smb_sam_grp_cnt(smb_domain_type_t);
 868 void smb_account_free(smb_account_t *);
 869 boolean_t smb_account_validate(smb_account_t *);
 870 
 871 /*
 872  * Security Descriptor functions.
 873  */
 874 uint32_t smb_sd_read(char *path, smb_sd_t *, uint32_t);
 875 uint32_t smb_sd_write(char *path, smb_sd_t *, uint32_t);
 876 uint32_t smb_sd_fromfs(smb_fssd_t *, smb_sd_t *);
 877 
 878 /* Kernel Module Interface */
 879 int smb_kmod_bind(void);
 880 boolean_t smb_kmod_isbound(void);




   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) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  24  * Copyright 2019 Nexenta Systems, Inc.  All rights reserved.
  25  */
  26 
  27 #ifndef _LIBSMB_H
  28 #define _LIBSMB_H
  29 
  30 #ifdef  __cplusplus
  31 extern "C" {
  32 #endif
  33 
  34 #include <sys/types.h>
  35 #include <sys/inttypes.h>
  36 #include <sys/list.h>
  37 #include <sys/avl.h>
  38 #include <arpa/inet.h>
  39 #include <net/if.h>       /* LIFNAMSIZ */
  40 #include <netdb.h>
  41 #include <stdlib.h>
  42 #include <libscf.h>
  43 #include <libshare.h>
  44 #include <uuid/uuid.h>
  45 #include <synch.h>
  46 #include <stdarg.h>
  47 
  48 #include <smb/nterror.h>
  49 #include <smb/ntstatus.h>
  50 #include <smb/wintypes.h>
  51 
  52 #include <smbsrv/string.h>
  53 #include <smbsrv/smb_idmap.h>
  54 #include <smbsrv/netbios.h>
  55 #include <smbsrv/smb_share.h>


  56 #include <smbsrv/smb_door.h>
  57 #include <smbsrv/alloc.h>
  58 #include <smbsrv/hash_table.h>
  59 #include <smbsrv/msgbuf.h>

  60 #include <smbsrv/smb_xdr.h>
  61 #include <smbsrv/smbinfo.h>
  62 #include <smbsrv/ntifs.h>
  63 
  64 #define SMB_VARSMB_DIR "/var/smb"
  65 #define SMB_VARRUN_DIR "/var/run/smb"
  66 #define SMB_CCACHE_FILE "ccache"
  67 #define SMB_CCACHE_PATH SMB_VARRUN_DIR "/" SMB_CCACHE_FILE
  68 
  69 
  70 /* Max value length of all SMB properties */
  71 #define MAX_VALUE_BUFLEN        512
  72 
  73 #define SMBD_FMRI_PREFIX                "network/smb/server"
  74 #define SMBD_DEFAULT_INSTANCE_FMRI      "svc:/network/smb/server:default"
  75 #define SMBD_PG_NAME                    "smbd"
  76 #define SMBD_PROTECTED_PG_NAME          "read"
  77 #define SMBD_EXEC_PG_NAME               "exec"
  78 
  79 #define SMBD_SMF_OK             0


 140 
 141         SMB_CI_DYNDNS_ENABLE,
 142 
 143         SMB_CI_MACHINE_PASSWD,
 144         SMB_CI_MACHINE_UUID,
 145         SMB_CI_KPASSWD_SRV,
 146         SMB_CI_KPASSWD_DOMAIN,
 147         SMB_CI_KPASSWD_SEQNUM,
 148         SMB_CI_NETLOGON_SEQNUM,
 149         SMB_CI_IPV6_ENABLE,
 150         SMB_CI_PRINT_ENABLE,
 151         SMB_CI_MAP,
 152         SMB_CI_UNMAP,
 153         SMB_CI_DISPOSITION,
 154         SMB_CI_DFS_STDROOT_NUM,
 155         SMB_CI_TRAVERSE_MOUNTS,
 156         SMB_CI_SMB2_ENABLE_OLD, /* obsolete */
 157         SMB_CI_INITIAL_CREDITS,
 158         SMB_CI_MAXIMUM_CREDITS,
 159         SMB_CI_MAX_PROTOCOL,
 160         SMB_CI_ENCRYPT,
 161         SMB_CI_MIN_PROTOCOL,
 162         SMB_CI_BYPASS_TRAVERSE_CHECKING,
 163 
 164         SMB_CI_MAX
 165 } smb_cfg_id_t;
 166 
 167 /* SMF helper functions */
 168 extern smb_scfhandle_t *smb_smf_scf_init(char *);
 169 extern void smb_smf_scf_fini(smb_scfhandle_t *);
 170 extern int smb_smf_start_transaction(smb_scfhandle_t *);
 171 extern int smb_smf_end_transaction(smb_scfhandle_t *);
 172 extern int smb_smf_set_string_property(smb_scfhandle_t *, char *, char *);
 173 extern int smb_smf_get_string_property(smb_scfhandle_t *, char *,
 174     char *, size_t);
 175 extern int smb_smf_set_integer_property(smb_scfhandle_t *, char *, int64_t);
 176 extern int smb_smf_get_integer_property(smb_scfhandle_t *, char *, int64_t *);
 177 extern int smb_smf_set_boolean_property(smb_scfhandle_t *, char *, uint8_t);
 178 extern int smb_smf_get_boolean_property(smb_scfhandle_t *, char *, uint8_t *);
 179 extern int smb_smf_set_opaque_property(smb_scfhandle_t *, char *,
 180     void *, size_t);
 181 extern int smb_smf_get_opaque_property(smb_scfhandle_t *, char *,
 182     void *, size_t);
 183 extern int smb_smf_create_service_pgroup(smb_scfhandle_t *, char *);
 184 extern int smb_smf_delete_property(smb_scfhandle_t *, char *);
 185 extern int smb_smf_restart_service(void);
 186 extern int smb_smf_maintenance_mode(void);
 187 
 188 /* ZFS interface */
 189 struct libzfs_handle;
 190 int smb_getdataset(struct libzfs_handle *, const char *, char *, size_t);
 191 
 192 /* Configuration management functions  */
 193 extern int smb_config_get(smb_cfg_id_t, char *, int);
 194 extern char *smb_config_getname(smb_cfg_id_t);
 195 extern int smb_config_getstr(smb_cfg_id_t, char *, int);
 196 extern int smb_config_getnum(smb_cfg_id_t, int64_t *);
 197 extern boolean_t smb_config_getbool(smb_cfg_id_t);
 198 
 199 extern int smb_config_set(smb_cfg_id_t, char *);
 200 extern int smb_config_setstr(smb_cfg_id_t, char *);
 201 extern int smb_config_setnum(smb_cfg_id_t, int64_t);
 202 extern int smb_config_setbool(smb_cfg_id_t, boolean_t);
 203 
 204 extern boolean_t smb_config_get_ads_enable(void);
 205 extern int smb_config_get_debug(void);
 206 extern uint8_t smb_config_get_fg_flag(void);
 207 extern char *smb_config_get_localsid(void);
 208 extern int smb_config_get_localuuid(uuid_t);
 209 extern int smb_config_secmode_fromstr(char *);
 210 extern char *smb_config_secmode_tostr(int);
 211 extern int smb_config_get_secmode(void);
 212 extern int smb_config_set_secmode(int);
 213 extern int smb_config_set_idmap_domain(char *);
 214 extern int smb_config_refresh_idmap(void);
 215 extern int smb_config_getip(smb_cfg_id_t, smb_inaddr_t *);
 216 extern void smb_config_get_version(smb_version_t *);
 217 uint32_t smb_config_get_execinfo(char *, char *, size_t);
 218 extern void smb_config_get_negtok(uchar_t *, uint32_t *);
 219 
 220 extern int smb_config_check_protocol(char *);
 221 extern uint32_t smb_config_get_max_protocol(void);
 222 extern uint32_t smb_config_get_min_protocol(void);
 223 extern void smb_config_upgrade(void);
 224 
 225 extern smb_cfg_val_t smb_config_get_require(smb_cfg_id_t);
 226 
 227 extern void smb_load_kconfig(smb_kmod_cfg_t *kcfg);
 228 extern uint32_t smb_crc_gen(uint8_t *, size_t);
 229 
 230 extern boolean_t smb_match_netlogon_seqnum(void);
 231 extern int smb_setdomainprops(char *, char *, char *);
 232 extern void smb_update_netlogon_seqnum(void);
 233 
 234 /* maximum password length on Windows 2000 and above */
 235 #define SMB_PASSWD_MAXLEN       127
 236 #define SMB_USERNAME_MAXLEN     40
 237 
 238 /* See also: smb_joininfo_xdr() */
 239 typedef struct smb_joininfo {
 240         char domain_name[MAXHOSTNAMELEN];
 241         char domain_username[SMB_USERNAME_MAXLEN + 1];
 242         char domain_passwd[SMB_PASSWD_MAXLEN + 1];
 243         uint32_t mode;
 244 } smb_joininfo_t;
 245 
 246 /* See also: smb_joinres_xdr() */


 441  */
 442 
 443 #define SMB_PWF_LM      0x01    /* LM hash is present */
 444 #define SMB_PWF_NT      0x02    /* NT hash is present */
 445 #define SMB_PWF_DISABLE 0x04    /* Account is disabled */
 446 
 447 typedef struct smb_passwd {
 448         uid_t           pw_uid;
 449         uint32_t        pw_flags;
 450         char            pw_name[SMB_USERNAME_MAXLEN];
 451         uint8_t         pw_lmhash[SMBAUTH_HASH_SZ];
 452         uint8_t         pw_nthash[SMBAUTH_HASH_SZ];
 453 } smb_passwd_t;
 454 
 455 /*
 456  * Control flags passed to smb_pwd_setcntl
 457  */
 458 #define SMB_PWC_DISABLE 0x01
 459 #define SMB_PWC_ENABLE  0x02
 460 #define SMB_PWC_NOLM    0x04
 461 #define SMB_PWC_DELETE  0x08
 462 
 463 #define SMB_PWE_SUCCESS         0
 464 #define SMB_PWE_USER_UNKNOWN    1
 465 #define SMB_PWE_USER_DISABLE    2
 466 #define SMB_PWE_CLOSE_FAILED    3
 467 #define SMB_PWE_OPEN_FAILED     4
 468 #define SMB_PWE_WRITE_FAILED    6
 469 #define SMB_PWE_UPDATE_FAILED   7
 470 #define SMB_PWE_STAT_FAILED     8
 471 #define SMB_PWE_BUSY            9
 472 #define SMB_PWE_DENIED          10
 473 #define SMB_PWE_SYSTEM_ERROR    11
 474 #define SMB_PWE_INVALID_PARAM   12
 475 #define SMB_PWE_NO_MEMORY       13
 476 #define SMB_PWE_MAX             14
 477 
 478 typedef struct smb_pwditer {
 479         void *spi_next;
 480 } smb_pwditer_t;
 481 


 654         smb_trusted_domains_t   d_trusted;
 655 } smb_domainex_t;
 656 
 657 int smb_domain_init(uint32_t);
 658 void smb_domain_fini(void);
 659 void smb_domain_show(void);
 660 void smb_domain_save(void);
 661 boolean_t smb_domain_lookup_name(char *, smb_domain_t *);
 662 boolean_t smb_domain_lookup_sid(smb_sid_t *, smb_domain_t *);
 663 boolean_t smb_domain_lookup_type(smb_domain_type_t, smb_domain_t *);
 664 boolean_t smb_domain_getinfo(smb_domainex_t *);
 665 void smb_domain_update(smb_domainex_t *);
 666 uint32_t smb_domain_start_update(void);
 667 void smb_domain_end_update(void);
 668 void smb_domain_set_basic_info(char *, char *, char *, smb_domain_t *);
 669 void smb_domain_set_dns_info(char *, char *, char *, char *, char *,
 670     smb_domain_t *);
 671 void smb_domain_set_trust_info(char *, char *, char *,
 672     uint32_t, uint32_t, uint32_t, smb_domain_t *);
 673 void smb_domain_current_dc(smb_dcinfo_t *);
 674 void smb_domain_bad_dc(void);
 675 
 676 typedef struct smb_gsid {
 677         smb_sid_t *gs_sid;
 678         uint16_t gs_type;
 679 } smb_gsid_t;
 680 
 681 struct sqlite_vm;
 682 struct sqlite;
 683 
 684 typedef struct smb_giter {
 685         struct sqlite_vm        *sgi_vm;
 686         struct sqlite           *sgi_db;
 687         uint32_t                sgi_nerr;
 688 } smb_giter_t;
 689 
 690 typedef struct smb_group {
 691         char                    *sg_name;
 692         char                    *sg_cmnt;
 693         uint32_t                sg_attr;
 694         uint32_t                sg_rid;


 705 int smb_lgrp_rename(char *, char *);
 706 int smb_lgrp_delete(char *);
 707 int smb_lgrp_setcmnt(char *, char *);
 708 int smb_lgrp_getcmnt(char *, char **);
 709 int smb_lgrp_getpriv(char *, uint8_t, boolean_t *);
 710 int smb_lgrp_setpriv(char *, uint8_t, boolean_t);
 711 int smb_lgrp_add_member(char *, smb_sid_t *, uint16_t);
 712 int smb_lgrp_del_member(char *, smb_sid_t *, uint16_t);
 713 int smb_lgrp_getbyname(char *, smb_group_t *);
 714 int smb_lgrp_getbyrid(uint32_t, smb_domain_type_t, smb_group_t *);
 715 void smb_lgrp_free(smb_group_t *);
 716 uint32_t smb_lgrp_err_to_ntstatus(uint32_t);
 717 boolean_t smb_lgrp_is_member(smb_group_t *, smb_sid_t *);
 718 char *smb_lgrp_strerror(int);
 719 int smb_lgrp_iteropen(smb_giter_t *);
 720 void smb_lgrp_iterclose(smb_giter_t *);
 721 boolean_t smb_lgrp_itererror(smb_giter_t *);
 722 int smb_lgrp_iterate(smb_giter_t *, smb_group_t *);
 723 
 724 int smb_lookup_sid(const char *, lsa_account_t *);
 725 int smb_lookup_lsid(const char *, lsa_account_t *);
 726 int smb_lookup_name(const char *, sid_type_t, lsa_account_t *);
 727 int smb_lookup_lname(const char *, sid_type_t, lsa_account_t *);
 728 
 729 #define SMB_LGRP_SUCCESS                0
 730 #define SMB_LGRP_INVALID_ARG            1
 731 #define SMB_LGRP_INVALID_MEMBER         2
 732 #define SMB_LGRP_INVALID_NAME           3
 733 #define SMB_LGRP_NOT_FOUND              4
 734 #define SMB_LGRP_EXISTS                 5
 735 #define SMB_LGRP_NO_SID                 6
 736 #define SMB_LGRP_NO_LOCAL_SID           7
 737 #define SMB_LGRP_SID_NOTLOCAL           8
 738 #define SMB_LGRP_WKSID                  9
 739 #define SMB_LGRP_NO_MEMORY              10
 740 #define SMB_LGRP_DB_ERROR               11
 741 #define SMB_LGRP_DBINIT_ERROR           12
 742 #define SMB_LGRP_INTERNAL_ERROR         13
 743 #define SMB_LGRP_MEMBER_IN_GROUP        14
 744 #define SMB_LGRP_MEMBER_NOT_IN_GROUP    15
 745 #define SMB_LGRP_NO_SUCH_PRIV           16
 746 #define SMB_LGRP_NO_SUCH_DOMAIN         17
 747 #define SMB_LGRP_PRIV_HELD              18


 854 /*
 855  * Well-known account interfaces
 856  */
 857 smb_wka_t *smb_wka_lookup_builtin(const char *);
 858 smb_wka_t *smb_wka_lookup_name(const char *);
 859 smb_wka_t *smb_wka_lookup_sid(smb_sid_t *);
 860 smb_sid_t *smb_wka_get_sid(const char *);
 861 char *smb_wka_get_domain(int);
 862 uint32_t smb_wka_token_groups(uint32_t, smb_ids_t *);
 863 
 864 /*
 865  * In memory account representation
 866  */
 867 typedef struct smb_account {
 868         char            *a_name;
 869         char            *a_domain;
 870         uint16_t        a_type;
 871         smb_sid_t       *a_sid;
 872         smb_sid_t       *a_domsid;
 873         uint32_t        a_rid;
 874         uint32_t        a_flags;
 875 } smb_account_t;
 876 
 877 uint32_t smb_sam_lookup_name(char *, char *, uint16_t, smb_account_t *);
 878 uint32_t smb_sam_lookup_sid(smb_sid_t *, smb_account_t *);
 879 int smb_sam_usr_cnt(void);
 880 uint32_t smb_sam_usr_groups(smb_sid_t *, smb_ids_t *);
 881 int smb_sam_grp_cnt(smb_domain_type_t);
 882 void smb_account_free(smb_account_t *);
 883 boolean_t smb_account_validate(smb_account_t *);
 884 
 885 /*
 886  * Security Descriptor functions.
 887  */
 888 uint32_t smb_sd_read(char *path, smb_sd_t *, uint32_t);
 889 uint32_t smb_sd_write(char *path, smb_sd_t *, uint32_t);
 890 uint32_t smb_sd_fromfs(smb_fssd_t *, smb_sd_t *);
 891 
 892 /* Kernel Module Interface */
 893 int smb_kmod_bind(void);
 894 boolean_t smb_kmod_isbound(void);