2016-12-07 19:03:22 +03:00
/*
2002-01-30 09:08:46 +03:00
Unix SMB / CIFS implementation .
1996-05-04 11:50:46 +04:00
Test validity of smb . conf
1998-01-22 16:27:43 +03:00
Copyright ( C ) Karl Auer 1993 , 1994 - 1998
1996-05-04 11:50:46 +04:00
Extensively modified by Andrew Tridgell , 1995
2002-07-15 14:35:28 +04:00
Converted to popt by Jelmer Vernooij ( jelmer @ nl . linux . org ) , 2002
2016-12-07 19:03:22 +03:00
1996-05-04 11:50:46 +04:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-09 23:25:36 +04:00
the Free Software Foundation ; either version 3 of the License , or
1996-05-04 11:50:46 +04:00
( at your option ) any later version .
2016-12-07 19:03:22 +03:00
1996-05-04 11:50:46 +04:00
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
2016-12-07 19:03:22 +03:00
1996-05-04 11:50:46 +04:00
You should have received a copy of the GNU General Public License
2007-07-10 04:52:41 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
1996-05-04 11:50:46 +04:00
*/
/*
* Testbed for loadparm . c / params . c
*
* This module simply loads a specified configuration file and
* if successful , dumps it ' s contents to stdout . Note that the
* operation is performed with DEBUGLEVEL at 3.
*
* Useful for a quick ' syntax check ' of a configuration file .
*
*/
# include "includes.h"
2011-02-26 01:20:06 +03:00
# include "system/filesys.h"
2010-08-05 12:49:53 +04:00
# include "popt_common.h"
2011-06-29 09:33:54 +04:00
# include "lib/param/loadparm.h"
2019-11-04 19:26:48 +03:00
# include "lib/crypto/gnutls_helpers.h"
2018-08-21 02:11:11 +03:00
# include "cmdline_contexts.h"
1996-05-04 11:50:46 +04:00
2016-12-07 20:19:53 +03:00
# include <regex.h>
2009-11-27 15:19:30 +03:00
/*******************************************************************
Check if a directory exists .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2011-06-02 01:51:55 +04:00
static bool directory_exist_stat ( const char * dname , SMB_STRUCT_STAT * st )
2009-11-27 15:19:30 +03:00
{
SMB_STRUCT_STAT st2 ;
bool ret ;
if ( ! st )
st = & st2 ;
if ( sys_stat ( dname , st , false ) ! = 0 )
return ( False ) ;
ret = S_ISDIR ( st - > st_ex_mode ) ;
if ( ! ret )
errno = ENOTDIR ;
return ret ;
}
2016-12-07 20:19:53 +03:00
struct idmap_config {
const char * domain_name ;
const char * backend ;
uint32_t high ;
uint32_t low ;
} ;
struct idmap_domains {
struct idmap_config * c ;
uint32_t count ;
uint32_t size ;
} ;
static bool lp_scan_idmap_found_domain ( const char * string ,
regmatch_t matches [ ] ,
void * private_data )
{
bool ok = false ;
if ( matches [ 1 ] . rm_so = = - 1 ) {
fprintf ( stderr , " Found match, but no name - invalid idmap config " ) ;
return false ;
}
if ( matches [ 1 ] . rm_eo < = matches [ 1 ] . rm_so ) {
fprintf ( stderr , " Invalid match - invalid idmap config " ) ;
return false ;
}
{
struct idmap_domains * d = private_data ;
struct idmap_config * c = & d - > c [ d - > count ] ;
regoff_t len = matches [ 1 ] . rm_eo - matches [ 1 ] . rm_so ;
char domname [ len + 1 ] ;
if ( d - > count > = d - > size ) {
return false ;
}
memcpy ( domname , string + matches [ 1 ] . rm_so , len ) ;
domname [ len ] = ' \0 ' ;
c - > domain_name = talloc_strdup_upper ( d - > c , domname ) ;
if ( c - > domain_name = = NULL ) {
return false ;
}
c - > backend = talloc_strdup ( d - > c , lp_idmap_backend ( domname ) ) ;
if ( c - > backend = = NULL ) {
return false ;
}
2017-08-18 11:35:55 +03:00
if ( lp_server_role ( ) ! = ROLE_ACTIVE_DIRECTORY_DC ) {
ok = lp_idmap_range ( domname , & c - > low , & c - > high ) ;
if ( ! ok ) {
fprintf ( stderr ,
" ERROR: Invalid idmap range for domain "
" %s! \n \n " ,
c - > domain_name ) ;
return false ;
}
2016-12-07 20:19:53 +03:00
}
d - > count + + ;
}
return false ; /* Keep scanning */
}
static bool do_idmap_check ( void )
{
struct idmap_domains * d ;
uint32_t i ;
bool ok = false ;
int rc ;
d = talloc_zero ( talloc_tos ( ) , struct idmap_domains ) ;
if ( d = = NULL ) {
return false ;
}
d - > count = 0 ;
d - > size = 32 ;
d - > c = talloc_array ( d , struct idmap_config , d - > size ) ;
if ( d - > c = = NULL ) {
goto done ;
}
rc = lp_wi_scan_global_parametrics ( " idmapconfig \\ (.* \\ ):backend " ,
2 ,
lp_scan_idmap_found_domain ,
d ) ;
if ( rc ! = 0 ) {
fprintf ( stderr ,
" FATAL: wi_scan_global_parametrics failed: %d " ,
rc ) ;
}
for ( i = 0 ; i < d - > count ; i + + ) {
struct idmap_config * c = & d - > c [ i ] ;
uint32_t j ;
for ( j = 0 ; j < d - > count & & j ! = i ; j + + ) {
struct idmap_config * x = & d - > c [ j ] ;
if ( ( c - > low > = x - > low & & c - > low < = x - > high ) | |
( c - > high > = x - > low & & c - > high < = x - > high ) ) {
/* Allow overlapping ranges for idmap_ad */
ok = strequal ( c - > backend , x - > backend ) ;
if ( ok ) {
ok = strequal ( c - > backend , " ad " ) ;
if ( ok ) {
fprintf ( stderr ,
" NOTE: The idmap_ad "
" range for the domain "
" %s overlaps with the "
" range of %s. \n \n " ,
c - > domain_name ,
x - > domain_name ) ;
continue ;
}
}
fprintf ( stderr ,
" ERROR: The idmap range for the domain "
" %s (%s) overlaps with the range of "
" %s (%s)! \n \n " ,
c - > domain_name ,
c - > backend ,
x - > domain_name ,
x - > backend ) ;
ok = false ;
goto done ;
}
}
}
ok = true ;
done :
TALLOC_FREE ( d ) ;
return ok ;
}
1998-05-22 05:51:14 +04:00
/***********************************************
Here we do a set of ' hard coded ' checks for bad
configuration settings .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static int do_global_checks ( void )
1998-05-22 05:51:14 +04:00
{
1999-12-13 16:27:58 +03:00
int ret = 0 ;
1998-09-02 00:11:54 +04:00
SMB_STRUCT_STAT st ;
2013-11-04 15:32:46 +04:00
const char * socket_options ;
2019-11-05 13:13:30 +03:00
const struct loadparm_substitution * lp_sub =
loadparm_s3_global_substitution ( ) ;
1999-12-13 16:27:58 +03:00
2014-02-04 06:09:10 +04:00
if ( lp_security ( ) > = SEC_DOMAIN & & ! lp_encrypt_passwords ( ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: in 'security=domain' mode the "
" 'encrypt passwords' parameter must always be "
" set to 'true'. \n \n " ) ;
1999-12-13 16:27:58 +03:00
ret = 1 ;
1998-11-10 23:51:25 +03:00
}
2011-07-01 09:14:08 +04:00
if ( lp_we_are_a_wins_server ( ) & & lp_wins_server_list ( ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: both 'wins support = true' and "
" 'wins server = <server list>' cannot be set in "
" the smb.conf file. nmbd will abort with this "
" setting. \n \n " ) ;
1999-12-13 16:27:58 +03:00
ret = 1 ;
1998-08-20 07:11:46 +04:00
}
2011-06-09 09:31:03 +04:00
if ( strequal ( lp_workgroup ( ) , lp_netbios_name ( ) ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " WARNING: 'workgroup' and 'netbios name' "
" must differ. \n \n " ) ;
2010-03-24 16:55:15 +03:00
}
2017-06-02 17:50:48 +03:00
if ( lp_client_ipc_signing ( ) = = SMB_SIGNING_IF_REQUIRED
| | lp_client_ipc_signing ( ) = = SMB_SIGNING_OFF ) {
fprintf ( stderr , " WARNING: The 'client ipc signing' value "
" %s SMB signing is not used when contacting a "
" domain controller or other server. "
" This setting is not recommended; please be "
" aware of the security implications when using "
" this configuration setting. \n \n " ,
lp_client_ipc_signing ( ) = = SMB_SIGNING_OFF ?
" ensures " : " may mean " ) ;
}
2015-04-27 17:18:38 +03:00
if ( strlen ( lp_netbios_name ( ) ) > 15 ) {
fprintf ( stderr , " WARNING: The 'netbios name' is too long "
" (max. 15 chars). \n \n " ) ;
}
2014-02-03 06:46:08 +04:00
if ( ! directory_exist_stat ( lp_lock_directory ( ) , & st ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: lock directory %s does not exist \n \n " ,
2014-02-03 06:46:08 +04:00
lp_lock_directory ( ) ) ;
1999-12-13 16:27:58 +03:00
ret = 1 ;
2009-05-14 17:34:42 +04:00
} else if ( ( st . st_ex_mode & 0777 ) ! = 0755 ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " WARNING: lock directory %s should have "
" permissions 0755 for browsing to work \n \n " ,
2014-02-03 06:46:08 +04:00
lp_lock_directory ( ) ) ;
1999-12-13 16:27:58 +03:00
}
2014-01-15 06:59:54 +04:00
if ( ! directory_exist_stat ( lp_state_directory ( ) , & st ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: state directory %s does not exist \n \n " ,
2014-01-15 06:59:54 +04:00
lp_state_directory ( ) ) ;
2009-01-08 22:18:13 +03:00
ret = 1 ;
2009-05-14 17:34:42 +04:00
} else if ( ( st . st_ex_mode & 0777 ) ! = 0755 ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " WARNING: state directory %s should have "
" permissions 0755 for browsing to work \n \n " ,
2014-01-15 06:59:54 +04:00
lp_state_directory ( ) ) ;
2009-01-08 22:18:13 +03:00
}
2014-01-15 06:59:54 +04:00
if ( ! directory_exist_stat ( lp_cache_directory ( ) , & st ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: cache directory %s does not exist \n \n " ,
2014-01-15 06:59:54 +04:00
lp_cache_directory ( ) ) ;
2009-01-08 22:18:13 +03:00
ret = 1 ;
2009-05-14 17:34:42 +04:00
} else if ( ( st . st_ex_mode & 0777 ) ! = 0755 ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " WARNING: cache directory %s should have "
" permissions 0755 for browsing to work \n \n " ,
2014-01-15 06:59:54 +04:00
lp_cache_directory ( ) ) ;
2009-01-08 22:18:13 +03:00
}
2014-02-03 06:57:21 +04:00
if ( ! directory_exist_stat ( lp_pid_directory ( ) , & st ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: pid directory %s does not exist \n \n " ,
2014-02-03 06:57:21 +04:00
lp_pid_directory ( ) ) ;
2002-07-15 14:35:28 +04:00
ret = 1 ;
}
2005-12-01 17:46:56 +03:00
if ( lp_passdb_expand_explicit ( ) ) {
fprintf ( stderr , " WARNING: passdb expand explicit = yes is "
2013-11-04 15:32:45 +04:00
" deprecated \n \n " ) ;
2005-12-01 17:46:56 +03:00
}
2013-11-04 15:32:46 +04:00
/*
* Socket options .
*/
socket_options = lp_socket_options ( ) ;
if ( socket_options ! = NULL & &
( strstr ( socket_options , " SO_SNDBUF " ) | |
strstr ( socket_options , " SO_RCVBUF " ) | |
strstr ( socket_options , " SO_SNDLOWAT " ) | |
2013-11-20 10:03:15 +04:00
strstr ( socket_options , " SO_RCVLOWAT " ) ) )
{
2013-11-04 15:32:46 +04:00
fprintf ( stderr ,
" WARNING: socket options = %s \n "
" This warning is printed because you set one of the \n "
" following options: SO_SNDBUF, SO_RCVBUF, SO_SNDLOWAT, \n "
2013-11-20 10:03:15 +04:00
" SO_RCVLOWAT \n "
2013-11-04 15:32:46 +04:00
" Modern server operating systems are tuned for \n "
" high network performance in the majority of situations; \n "
" when you set 'socket options' you are overriding those \n "
" settings. \n "
" Linux in particular has an auto-tuning mechanism for \n "
" buffer sizes (SO_SNDBUF, SO_RCVBUF) that will be \n "
" disabled if you specify a socket buffer size. This can \n "
" potentially cripple your TCP/IP stack. \n \n "
" Getting the 'socket options' correct can make a big \n "
" difference to your performance, but getting them wrong \n "
" can degrade it by just as much. As with any other low \n "
" level setting, if you must make changes to it, make \n "
" small changes and test the effect before making any \n "
" large changes. \n \n " ,
socket_options ) ;
}
1999-12-13 16:27:58 +03:00
/*
* Password server sanity checks .
*/
2014-02-03 06:52:14 +04:00
if ( ( lp_security ( ) > = SEC_DOMAIN ) & & ! * lp_password_server ( ) ) {
2007-12-04 05:48:41 +03:00
const char * sec_setting ;
2012-05-12 14:00:00 +04:00
if ( lp_security ( ) = = SEC_DOMAIN )
2007-12-04 05:48:41 +03:00
sec_setting = " domain " ;
2011-05-18 05:53:34 +04:00
else if ( lp_security ( ) = = SEC_ADS )
sec_setting = " ads " ;
2007-12-04 05:48:41 +03:00
else
sec_setting = " " ;
1999-12-13 16:27:58 +03:00
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: The setting 'security=%s' requires the "
" 'password server' parameter be set to the "
" default value * or a valid password server. \n \n " ,
sec_setting ) ;
2011-05-18 05:53:34 +04:00
ret = 1 ;
}
2014-02-03 06:52:14 +04:00
if ( ( lp_security ( ) > = SEC_DOMAIN ) & & ( strcmp ( lp_password_server ( ) , " * " ) ! = 0 ) ) {
2011-05-18 05:53:34 +04:00
const char * sec_setting ;
if ( lp_security ( ) = = SEC_DOMAIN )
sec_setting = " domain " ;
else if ( lp_security ( ) = = SEC_ADS )
sec_setting = " ads " ;
else
sec_setting = " " ;
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " WARNING: The setting 'security=%s' should NOT "
" be combined with the 'password server' "
" parameter. \n "
" (by default Samba will discover the correct DC "
" to contact automatically). \n \n " ,
sec_setting ) ;
1999-12-13 16:27:58 +03:00
}
/*
* Password chat sanity checks .
*/
if ( lp_security ( ) = = SEC_USER & & lp_unix_password_sync ( ) ) {
/*
2001-05-10 10:53:19 +04:00
* Check that we have a valid lp_passwd_program ( ) if not using pam .
1999-12-13 16:27:58 +03:00
*/
2001-05-10 10:53:19 +04:00
# ifdef WITH_PAM
if ( ! lp_pam_password_change ( ) ) {
# endif
2019-11-18 20:28:27 +03:00
if ( ( lp_passwd_program ( talloc_tos ( ) , lp_sub ) = = NULL ) | |
( strlen ( lp_passwd_program ( talloc_tos ( ) , lp_sub ) ) = = 0 ) )
2008-03-18 17:49:31 +03:00
{
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" ERROR: the 'unix password sync' "
" parameter is set and there is no valid "
" 'passwd program' parameter. \n \n " ) ;
1999-12-13 16:27:58 +03:00
ret = 1 ;
2001-05-10 10:53:19 +04:00
} else {
2007-12-04 05:48:41 +03:00
const char * passwd_prog ;
char * truncated_prog = NULL ;
2002-11-13 02:20:50 +03:00
const char * p ;
2001-05-10 10:53:19 +04:00
2019-11-18 20:28:27 +03:00
passwd_prog = lp_passwd_program ( talloc_tos ( ) , lp_sub ) ;
2001-05-10 10:53:19 +04:00
p = passwd_prog ;
2007-12-04 05:48:41 +03:00
next_token_talloc ( talloc_tos ( ) ,
& p ,
& truncated_prog , NULL ) ;
if ( truncated_prog & & access ( truncated_prog , F_OK ) = = - 1 ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" ERROR: the 'unix password sync' "
" parameter is set and the "
" 'passwd program' (%s) cannot be "
" executed (error was %s). \n \n " ,
truncated_prog ,
strerror ( errno ) ) ;
2001-05-10 10:53:19 +04:00
ret = 1 ;
}
2008-03-18 17:33:25 +03:00
}
2001-05-10 10:53:19 +04:00
# ifdef WITH_PAM
1999-12-13 16:27:58 +03:00
}
2001-05-10 10:53:19 +04:00
# endif
1999-12-13 16:27:58 +03:00
2019-11-05 13:13:30 +03:00
if ( lp_passwd_chat ( talloc_tos ( ) , lp_sub ) = = NULL ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" ERROR: the 'unix password sync' parameter is "
" set and there is no valid 'passwd chat' "
" parameter. \n \n " ) ;
1999-12-13 16:27:58 +03:00
ret = 1 ;
2008-03-18 17:50:27 +03:00
}
2019-11-18 20:28:27 +03:00
if ( ( lp_passwd_program ( talloc_tos ( ) , lp_sub ) ! = NULL ) & &
( strlen ( lp_passwd_program ( talloc_tos ( ) , lp_sub ) ) > 0 ) )
2008-03-18 17:50:27 +03:00
{
/* check if there's a %u parameter present */
2019-11-18 20:28:27 +03:00
if ( strstr_m ( lp_passwd_program ( talloc_tos ( ) , lp_sub ) , " %u " ) = = NULL ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" ERROR: the 'passwd program' (%s) "
" requires a '%%u' parameter. \n \n " ,
2019-11-18 20:28:27 +03:00
lp_passwd_program ( talloc_tos ( ) , lp_sub ) ) ;
2008-03-18 17:50:27 +03:00
ret = 1 ;
}
1999-12-13 16:27:58 +03:00
}
/*
* Check that we have a valid script and that it hasn ' t
* been written to expect the old password .
*/
2014-02-04 06:09:10 +04:00
if ( lp_encrypt_passwords ( ) ) {
2019-11-05 13:13:30 +03:00
if ( strstr_m ( lp_passwd_chat ( talloc_tos ( ) , lp_sub ) , " %o " ) ! = NULL ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" ERROR: the 'passwd chat' script [%s] "
" expects to use the old plaintext "
" password via the %%o substitution. With "
" encrypted passwords this is not "
" possible. \n \n " ,
2019-11-05 13:13:30 +03:00
lp_passwd_chat ( talloc_tos ( ) , lp_sub ) ) ;
1999-12-13 16:27:58 +03:00
ret = 1 ;
}
}
}
2002-04-14 16:20:10 +04:00
if ( strlen ( lp_winbind_separator ( ) ) ! = 1 ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: the 'winbind separator' parameter must "
" be a single character. \n \n " ) ;
2002-04-14 16:20:10 +04:00
ret = 1 ;
}
if ( * lp_winbind_separator ( ) = = ' + ' ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " 'winbind separator = +' might cause problems "
" with group membership. \n \n " ) ;
2002-04-14 16:20:10 +04:00
}
2002-11-05 10:20:27 +03:00
if ( lp_algorithmic_rid_base ( ) < BASE_RID ) {
/* Try to prevent admin foot-shooting, we can't put algorithmic
rids below 1000 , that ' s the ' well known RIDs ' on NT */
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " 'algorithmic rid base' must be equal to or "
" above %lu \n \n " , BASE_RID ) ;
2002-11-05 10:20:27 +03:00
}
if ( lp_algorithmic_rid_base ( ) & 1 ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " 'algorithmic rid base' must be even. \n \n " ) ;
2002-11-05 10:20:27 +03:00
}
2016-12-07 19:44:25 +03:00
if ( lp_server_role ( ) ! = ROLE_STANDALONE ) {
const char * default_backends [ ] = {
" tdb " , " tdb2 " , " ldap " , " autorid " , " hash "
} ;
const char * idmap_backend ;
bool valid_backend = false ;
uint32_t i ;
bool ok ;
idmap_backend = lp_idmap_default_backend ( ) ;
for ( i = 0 ; i < ARRAY_SIZE ( default_backends ) ; i + + ) {
ok = strequal ( idmap_backend , default_backends [ i ] ) ;
if ( ok ) {
valid_backend = true ;
}
}
if ( ! valid_backend ) {
ret = 1 ;
fprintf ( stderr , " ERROR: Do not use the '%s' backend "
" as the default idmap backend! \n \n " ,
idmap_backend ) ;
}
2016-12-07 20:19:53 +03:00
ok = do_idmap_check ( ) ;
if ( ! ok ) {
ret = 1 ;
}
2016-12-07 19:44:25 +03:00
}
2003-04-15 02:23:02 +04:00
# ifndef HAVE_DLOPEN
2003-04-15 20:01:14 +04:00
if ( lp_preload_modules ( ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " WARNING: 'preload modules = ' set while loading "
" plugins not supported. \n \n " ) ;
2003-04-15 20:01:14 +04:00
}
2003-04-15 02:23:02 +04:00
# endif
2003-04-15 20:01:14 +04:00
2003-06-20 21:41:04 +04:00
if ( ! lp_passdb_backend ( ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: passdb backend must have a value or be "
" left out \n \n " ) ;
2003-06-20 21:41:04 +04:00
}
2016-12-07 19:03:22 +03:00
2007-09-04 17:21:24 +04:00
if ( lp_os_level ( ) > 255 ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " WARNING: Maximum value for 'os level' is "
" 255! \n \n " ) ;
2007-09-04 17:21:24 +04:00
}
2003-06-20 21:41:04 +04:00
2011-05-18 05:51:37 +04:00
if ( strequal ( lp_dos_charset ( ) , " UTF8 " ) | | strequal ( lp_dos_charset ( ) , " UTF-8 " ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: 'dos charset' must not be UTF8 \n \n " ) ;
2011-05-18 05:51:37 +04:00
ret = 1 ;
}
1999-12-13 16:27:58 +03:00
return ret ;
2016-12-07 19:03:22 +03:00
}
1998-05-22 05:51:14 +04:00
2008-07-15 15:01:54 +04:00
/**
* per - share logic tests
*/
static void do_per_share_checks ( int s )
{
2019-11-07 13:01:05 +03:00
const struct loadparm_substitution * lp_sub =
loadparm_s3_global_substitution ( ) ;
2014-02-02 17:21:12 +04:00
const char * * deny_list = lp_hosts_deny ( s ) ;
2014-02-02 17:14:09 +04:00
const char * * allow_list = lp_hosts_allow ( s ) ;
2016-03-09 15:53:09 +03:00
const char * * vfs_objects = NULL ;
2008-07-15 15:01:54 +04:00
int i ;
2016-03-09 15:53:09 +03:00
static bool uses_fruit ;
static bool doesnt_use_fruit ;
static bool fruit_mix_warned ;
2008-07-15 15:01:54 +04:00
if ( deny_list ) {
for ( i = 0 ; deny_list [ i ] ; i + + ) {
char * hasstar = strchr_m ( deny_list [ i ] , ' * ' ) ;
char * hasquery = strchr_m ( deny_list [ i ] , ' ? ' ) ;
if ( hasstar | | hasquery ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" Invalid character %c in hosts deny list "
" (%s) for service %s. \n \n " ,
hasstar ? * hasstar : * hasquery ,
deny_list [ i ] ,
2019-11-07 13:01:05 +03:00
lp_servicename ( talloc_tos ( ) , lp_sub , s ) ) ;
2008-07-15 15:01:54 +04:00
}
}
}
if ( allow_list ) {
for ( i = 0 ; allow_list [ i ] ; i + + ) {
char * hasstar = strchr_m ( allow_list [ i ] , ' * ' ) ;
char * hasquery = strchr_m ( allow_list [ i ] , ' ? ' ) ;
if ( hasstar | | hasquery ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" Invalid character %c in hosts allow "
" list (%s) for service %s. \n \n " ,
hasstar ? * hasstar : * hasquery ,
allow_list [ i ] ,
2019-11-07 13:01:05 +03:00
lp_servicename ( talloc_tos ( ) , lp_sub , s ) ) ;
2008-07-15 15:01:54 +04:00
}
}
}
if ( lp_level2_oplocks ( s ) & & ! lp_oplocks ( s ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " Invalid combination of parameters for service "
" %s. Level II oplocks can only be set if oplocks "
" are also set. \n \n " ,
2019-11-07 13:01:05 +03:00
lp_servicename ( talloc_tos ( ) , lp_sub , s ) ) ;
2008-07-15 15:01:54 +04:00
}
2011-07-06 17:10:27 +04:00
if ( ! lp_store_dos_attributes ( s ) & & lp_map_hidden ( s )
& & ! ( lp_create_mask ( s ) & S_IXOTH ) )
{
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" Invalid combination of parameters for service %s. Map "
" hidden can only work if create mask includes octal "
" 01 (S_IXOTH). \n \n " ,
2019-11-07 13:01:05 +03:00
lp_servicename ( talloc_tos ( ) , lp_sub , s ) ) ;
2008-07-15 15:01:54 +04:00
}
2011-07-06 17:10:27 +04:00
if ( ! lp_store_dos_attributes ( s ) & & lp_map_hidden ( s )
& & ( lp_force_create_mode ( s ) & S_IXOTH ) )
{
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" Invalid combination of parameters for service "
2011-07-06 17:10:27 +04:00
" %s. Map hidden can only work if force create mode "
2013-11-04 15:32:45 +04:00
" excludes octal 01 (S_IXOTH). \n \n " ,
2019-11-07 13:01:05 +03:00
lp_servicename ( talloc_tos ( ) , lp_sub , s ) ) ;
2008-07-15 15:01:54 +04:00
}
2011-07-06 17:10:27 +04:00
if ( ! lp_store_dos_attributes ( s ) & & lp_map_system ( s )
& & ! ( lp_create_mask ( s ) & S_IXGRP ) )
{
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" Invalid combination of parameters for service "
2011-07-06 17:10:27 +04:00
" %s. Map system can only work if create mask includes "
2013-11-04 15:32:45 +04:00
" octal 010 (S_IXGRP). \n \n " ,
2019-11-07 13:01:05 +03:00
lp_servicename ( talloc_tos ( ) , lp_sub , s ) ) ;
2008-07-15 15:01:54 +04:00
}
2011-07-06 17:10:27 +04:00
if ( ! lp_store_dos_attributes ( s ) & & lp_map_system ( s )
& & ( lp_force_create_mode ( s ) & S_IXGRP ) )
{
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" Invalid combination of parameters for service "
2011-07-06 17:10:27 +04:00
" %s. Map system can only work if force create mode "
2013-11-04 15:32:45 +04:00
" excludes octal 010 (S_IXGRP). \n \n " ,
2019-11-07 13:01:05 +03:00
lp_servicename ( talloc_tos ( ) , lp_sub , s ) ) ;
2008-07-15 15:01:54 +04:00
}
2019-10-31 14:46:38 +03:00
if ( lp_printing ( s ) = = PRINT_CUPS & & * ( lp_print_command ( s ) ) ! = ' \0 ' ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" Warning: Service %s defines a print command, but "
" parameter is ignored when using CUPS libraries. \n \n " ,
2019-11-07 13:01:05 +03:00
lp_servicename ( talloc_tos ( ) , lp_sub , s ) ) ;
2008-07-15 15:01:54 +04:00
}
2016-03-09 15:53:09 +03:00
vfs_objects = lp_vfs_objects ( s ) ;
if ( vfs_objects & & str_list_check ( vfs_objects , " fruit " ) ) {
uses_fruit = true ;
} else {
doesnt_use_fruit = true ;
}
if ( uses_fruit & & doesnt_use_fruit & & ! fruit_mix_warned ) {
fruit_mix_warned = true ;
fprintf ( stderr ,
" WARNING: some services use vfs_fruit, others don't. Mounting them "
" in conjunction on OS X clients results in undefined behaviour. \n \n " ) ;
}
2008-07-15 15:01:54 +04:00
}
2003-04-14 07:59:04 +04:00
int main ( int argc , const char * argv [ ] )
1999-12-13 16:27:58 +03:00
{
2007-12-10 22:30:37 +03:00
const char * config_file = get_dyn_CONFIGFILE ( ) ;
2019-11-07 13:01:05 +03:00
const struct loadparm_substitution * lp_sub =
loadparm_s3_global_substitution ( ) ;
2002-07-15 14:35:28 +04:00
int s ;
2007-10-19 22:38:36 +04:00
static int silent_mode = False ;
static int show_all_parameters = False ;
2002-07-15 14:35:28 +04:00
int ret = 0 ;
poptContext pc ;
2005-06-12 20:00:29 +04:00
static char * parameter_name = NULL ;
2005-09-30 21:13:37 +04:00
static const char * section_name = NULL ;
2002-07-15 14:35:28 +04:00
const char * cname ;
const char * caddr ;
2002-09-25 19:19:00 +04:00
static int show_defaults ;
2008-07-15 14:52:25 +04:00
static int skip_logic_checks = 0 ;
2019-11-04 19:26:48 +03:00
const char * weak_crypo_str = " " ;
1999-12-13 16:27:58 +03:00
2002-07-15 14:35:28 +04:00
struct poptOption long_options [ ] = {
POPT_AUTOHELP
2019-01-14 12:46:27 +03:00
{
. longName = " suppress-prompt " ,
. shortName = ' s ' ,
. argInfo = POPT_ARG_VAL ,
. arg = & silent_mode ,
. val = 1 ,
. descrip = " Suppress prompt for enter " ,
} ,
{
. longName = " verbose " ,
. shortName = ' v ' ,
. argInfo = POPT_ARG_NONE ,
. arg = & show_defaults ,
. val = 1 ,
. descrip = " Show default options too " ,
} ,
{
. longName = " skip-logic-checks " ,
. shortName = ' l ' ,
. argInfo = POPT_ARG_NONE ,
. arg = & skip_logic_checks ,
. val = 1 ,
. descrip = " Skip the global checks " ,
} ,
{
. longName = " show-all-parameters " ,
. shortName = ' \0 ' ,
. argInfo = POPT_ARG_VAL ,
. arg = & show_all_parameters ,
. val = True ,
. descrip = " Show the parameters, type, possible "
" values " ,
} ,
{
. longName = " parameter-name " ,
. shortName = ' \0 ' ,
. argInfo = POPT_ARG_STRING ,
. arg = & parameter_name ,
. val = 0 ,
. descrip = " Limit testparm to a named parameter " ,
} ,
{
. longName = " section-name " ,
. shortName = ' \0 ' ,
. argInfo = POPT_ARG_STRING ,
. arg = & section_name ,
. val = 0 ,
. descrip = " Limit testparm to a named section " ,
} ,
2003-04-14 07:59:04 +04:00
POPT_COMMON_VERSION
2008-07-15 13:26:43 +04:00
POPT_COMMON_DEBUGLEVEL
2011-02-09 15:45:22 +03:00
POPT_COMMON_OPTION
2003-04-14 07:59:04 +04:00
POPT_TABLEEND
2002-07-15 14:35:28 +04:00
} ;
1999-12-13 16:27:58 +03:00
2007-08-31 13:15:57 +04:00
TALLOC_CTX * frame = talloc_stackframe ( ) ;
2015-03-21 22:00:06 +03:00
smb_init_locale ( ) ;
2008-07-15 13:26:43 +04:00
/*
2018-11-23 11:41:45 +03:00
* Set the default debug level to 1.
2008-07-15 13:26:43 +04:00
* Allow it to be overridden by the command line ,
* not by smb . conf .
*/
2018-11-23 11:41:45 +03:00
lp_set_cmdline ( " log level " , " 1 " ) ;
2005-12-29 01:48:54 +03:00
2016-12-07 19:03:22 +03:00
pc = poptGetContext ( NULL , argc , argv , long_options ,
2002-09-25 19:19:00 +04:00
POPT_CONTEXT_KEEP_FIRST ) ;
2002-11-09 19:57:45 +03:00
poptSetOtherOptionHelp ( pc , " [OPTION...] <config-file> [host-name] [host-ip] " ) ;
2002-07-15 14:35:28 +04:00
2003-04-14 07:59:04 +04:00
while ( poptGetNextOpt ( pc ) ! = - 1 ) ;
2002-07-15 14:35:28 +04:00
2005-06-12 20:00:29 +04:00
if ( show_all_parameters ) {
show_parameter_list ( ) ;
exit ( 0 ) ;
}
2010-10-29 07:19:32 +04:00
setup_logging ( poptGetArg ( pc ) , DEBUG_STDERR ) ;
2002-07-15 14:35:28 +04:00
2016-12-07 19:03:22 +03:00
if ( poptPeekArg ( pc ) )
2002-07-15 14:35:28 +04:00
config_file = poptGetArg ( pc ) ;
cname = poptGetArg ( pc ) ;
caddr = poptGetArg ( pc ) ;
2003-09-29 06:39:41 +04:00
2008-09-28 00:10:05 +04:00
poptFreeContext ( pc ) ;
2003-09-29 06:39:41 +04:00
if ( cname & & ! caddr ) {
printf ( " ERROR: You must specify both a machine name and an IP address. \n " ) ;
2008-09-28 00:10:44 +04:00
ret = 1 ;
goto done ;
2003-09-29 06:39:41 +04:00
}
2003-10-20 08:51:40 +04:00
fprintf ( stderr , " Load smb config files from %s \n " , config_file ) ;
2002-07-15 14:35:28 +04:00
2015-04-21 16:24:42 +03:00
if ( ! lp_load_with_registry_shares ( config_file ) ) {
2003-10-20 08:51:40 +04:00
fprintf ( stderr , " Error loading services. \n " ) ;
2008-09-28 00:10:44 +04:00
ret = 1 ;
goto done ;
2002-07-15 14:35:28 +04:00
}
2003-10-20 08:51:40 +04:00
fprintf ( stderr , " Loaded services file OK. \n " ) ;
2002-07-15 14:35:28 +04:00
2019-11-04 19:26:48 +03:00
if ( samba_gnutls_weak_crypto_allowed ( ) ) {
weak_crypo_str = " allowed " ;
} else {
weak_crypo_str = " disallowed " ;
}
fprintf ( stderr , " Weak crypto is %s \n " , weak_crypo_str ) ;
2008-07-15 14:52:25 +04:00
if ( skip_logic_checks = = 0 ) {
2008-07-15 02:17:58 +04:00
ret = do_global_checks ( ) ;
}
2002-07-15 14:35:28 +04:00
for ( s = 0 ; s < 1000 ; s + + ) {
2008-07-15 14:55:57 +04:00
if ( VALID_SNUM ( s ) & & ( skip_logic_checks = = 0 ) ) {
2008-07-15 15:01:54 +04:00
do_per_share_checks ( s ) ;
2002-07-15 14:35:28 +04:00
}
}
2003-02-21 01:09:54 +03:00
2006-01-25 18:43:15 +03:00
if ( ! section_name & & ! parameter_name ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" Server role: %s \n \n " ,
server_role_str ( lp_server_role ( ) ) ) ;
2003-02-21 01:09:54 +03:00
}
2002-07-15 14:35:28 +04:00
if ( ! cname ) {
if ( ! silent_mode ) {
2003-10-20 08:51:40 +04:00
fprintf ( stderr , " Press enter to see a dump of your service definitions \n " ) ;
2002-07-15 14:35:28 +04:00
fflush ( stdout ) ;
getc ( stdin ) ;
}
2005-06-12 20:00:29 +04:00
if ( parameter_name | | section_name ) {
2007-10-19 04:40:25 +04:00
bool isGlobal = False ;
2005-06-12 20:00:29 +04:00
s = GLOBAL_SECTION_SNUM ;
if ( ! section_name ) {
section_name = GLOBAL_NAME ;
isGlobal = True ;
} else if ( ( isGlobal = ! strwicmp ( section_name , GLOBAL_NAME ) ) = = 0 & &
( s = lp_servicenumber ( section_name ) ) = = - 1 ) {
fprintf ( stderr , " Unknown section %s \n " ,
section_name ) ;
2008-09-28 00:10:44 +04:00
ret = 1 ;
goto done ;
2005-06-12 20:00:29 +04:00
}
if ( parameter_name ) {
if ( ! dump_a_parameter ( s , parameter_name , stdout , isGlobal ) ) {
fprintf ( stderr , " Parameter %s unknown for section %s \n " ,
parameter_name , section_name ) ;
2008-09-28 00:10:44 +04:00
ret = 1 ;
goto done ;
2005-06-12 20:00:29 +04:00
}
} else {
if ( isGlobal = = True )
lp_dump ( stdout , show_defaults , 0 ) ;
else
lp_dump_one ( stdout , show_defaults , s ) ;
}
2008-09-28 00:10:44 +04:00
goto done ;
2005-06-12 20:00:29 +04:00
}
2002-09-25 19:19:00 +04:00
lp_dump ( stdout , show_defaults , lp_numservices ( ) ) ;
2002-07-15 14:35:28 +04:00
}
if ( cname & & caddr ) {
/* this is totally ugly, a real `quick' hack */
for ( s = 0 ; s < 1000 ; s + + ) {
2003-09-29 06:39:41 +04:00
if ( VALID_SNUM ( s ) ) {
2014-02-02 17:21:12 +04:00
if ( allow_access ( lp_hosts_deny ( - 1 ) , lp_hosts_allow ( - 1 ) , cname , caddr )
& & allow_access ( lp_hosts_deny ( s ) , lp_hosts_allow ( s ) , cname , caddr ) ) {
2003-10-20 08:51:40 +04:00
fprintf ( stderr , " Allow connection from %s (%s) to %s \n " ,
2019-11-07 13:01:05 +03:00
cname , caddr , lp_servicename ( talloc_tos ( ) , lp_sub , s ) ) ;
2002-07-15 14:35:28 +04:00
} else {
2003-10-20 08:51:40 +04:00
fprintf ( stderr , " Deny connection from %s (%s) to %s \n " ,
2019-11-07 13:01:05 +03:00
cname , caddr , lp_servicename ( talloc_tos ( ) , lp_sub , s ) ) ;
2002-07-15 14:35:28 +04:00
}
}
}
}
2008-09-28 00:10:44 +04:00
done :
gfree_loadparm ( ) ;
2008-10-18 16:51:25 +04:00
TALLOC_FREE ( frame ) ;
2008-09-28 00:10:44 +04:00
return ret ;
1996-05-04 11:50:46 +04:00
}
2004-10-06 02:18:32 +04:00