2020-10-21 03:22:33 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright ( C ) 2020 , Microsoft Corporation .
*
* Author ( s ) : Steve French < stfrench @ microsoft . com >
* David Howells < dhowells @ redhat . com >
*/
2020-10-21 03:37:11 +03:00
# include "cifsglob.h"
# include "cifs_debug.h"
# include "fs_context.h"
2020-10-21 05:10:44 +03:00
static const match_table_t cifs_smb_version_tokens = {
{ Smb_1 , SMB1_VERSION_STRING } ,
{ Smb_20 , SMB20_VERSION_STRING } ,
{ Smb_21 , SMB21_VERSION_STRING } ,
{ Smb_30 , SMB30_VERSION_STRING } ,
{ Smb_302 , SMB302_VERSION_STRING } ,
{ Smb_302 , ALT_SMB302_VERSION_STRING } ,
{ Smb_311 , SMB311_VERSION_STRING } ,
{ Smb_311 , ALT_SMB311_VERSION_STRING } ,
{ Smb_3any , SMB3ANY_VERSION_STRING } ,
{ Smb_default , SMBDEFAULT_VERSION_STRING } ,
{ Smb_version_err , NULL }
} ;
int
2020-12-10 08:07:12 +03:00
cifs_parse_smb_version ( char * value , struct smb3_fs_context * ctx , bool is_smb3 )
2020-10-21 05:10:44 +03:00
{
substring_t args [ MAX_OPT_ARGS ] ;
switch ( match_token ( value , cifs_smb_version_tokens , args ) ) {
# ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
case Smb_1 :
if ( disable_legacy_dialects ) {
cifs_dbg ( VFS , " mount with legacy dialect disabled \n " ) ;
return 1 ;
}
if ( is_smb3 ) {
cifs_dbg ( VFS , " vers=1.0 (cifs) not permitted when mounting with smb3 \n " ) ;
return 1 ;
}
cifs_dbg ( VFS , " Use of the less secure dialect vers=1.0 is not recommended unless required for access to very old servers \n " ) ;
2020-12-10 08:07:12 +03:00
ctx - > ops = & smb1_operations ;
ctx - > vals = & smb1_values ;
2020-10-21 05:10:44 +03:00
break ;
case Smb_20 :
if ( disable_legacy_dialects ) {
cifs_dbg ( VFS , " mount with legacy dialect disabled \n " ) ;
return 1 ;
}
if ( is_smb3 ) {
cifs_dbg ( VFS , " vers=2.0 not permitted when mounting with smb3 \n " ) ;
return 1 ;
}
2020-12-10 08:07:12 +03:00
ctx - > ops = & smb20_operations ;
ctx - > vals = & smb20_values ;
2020-10-21 05:10:44 +03:00
break ;
# else
case Smb_1 :
cifs_dbg ( VFS , " vers=1.0 (cifs) mount not permitted when legacy dialects disabled \n " ) ;
return 1 ;
case Smb_20 :
cifs_dbg ( VFS , " vers=2.0 mount not permitted when legacy dialects disabled \n " ) ;
return 1 ;
# endif /* CIFS_ALLOW_INSECURE_LEGACY */
case Smb_21 :
2020-12-10 08:07:12 +03:00
ctx - > ops = & smb21_operations ;
ctx - > vals = & smb21_values ;
2020-10-21 05:10:44 +03:00
break ;
case Smb_30 :
2020-12-10 08:07:12 +03:00
ctx - > ops = & smb30_operations ;
ctx - > vals = & smb30_values ;
2020-10-21 05:10:44 +03:00
break ;
case Smb_302 :
2020-12-10 08:07:12 +03:00
ctx - > ops = & smb30_operations ; /* currently identical with 3.0 */
ctx - > vals = & smb302_values ;
2020-10-21 05:10:44 +03:00
break ;
case Smb_311 :
2020-12-10 08:07:12 +03:00
ctx - > ops = & smb311_operations ;
ctx - > vals = & smb311_values ;
2020-10-21 05:10:44 +03:00
break ;
case Smb_3any :
2020-12-10 08:07:12 +03:00
ctx - > ops = & smb30_operations ; /* currently identical with 3.0 */
ctx - > vals = & smb3any_values ;
2020-10-21 05:10:44 +03:00
break ;
case Smb_default :
2020-12-10 08:07:12 +03:00
ctx - > ops = & smb30_operations ; /* currently identical with 3.0 */
ctx - > vals = & smbdefault_values ;
2020-10-21 05:10:44 +03:00
break ;
default :
cifs_dbg ( VFS , " Unknown vers= option specified: %s \n " , value ) ;
return 1 ;
}
return 0 ;
}
2020-10-21 03:37:11 +03:00
static const match_table_t cifs_secflavor_tokens = {
{ Opt_sec_krb5 , " krb5 " } ,
{ Opt_sec_krb5i , " krb5i " } ,
{ Opt_sec_krb5p , " krb5p " } ,
{ Opt_sec_ntlmsspi , " ntlmsspi " } ,
{ Opt_sec_ntlmssp , " ntlmssp " } ,
{ Opt_ntlm , " ntlm " } ,
{ Opt_sec_ntlmi , " ntlmi " } ,
{ Opt_sec_ntlmv2 , " nontlm " } ,
{ Opt_sec_ntlmv2 , " ntlmv2 " } ,
{ Opt_sec_ntlmv2i , " ntlmv2i " } ,
{ Opt_sec_lanman , " lanman " } ,
{ Opt_sec_none , " none " } ,
{ Opt_sec_err , NULL }
} ;
2020-12-10 08:07:12 +03:00
int cifs_parse_security_flavors ( char * value , struct smb3_fs_context * ctx )
2020-10-21 03:37:11 +03:00
{
substring_t args [ MAX_OPT_ARGS ] ;
/*
* With mount options , the last one should win . Reset any existing
* settings back to default .
*/
2020-12-10 08:07:12 +03:00
ctx - > sectype = Unspecified ;
ctx - > sign = false ;
2020-10-21 03:37:11 +03:00
switch ( match_token ( value , cifs_secflavor_tokens , args ) ) {
case Opt_sec_krb5p :
cifs_dbg ( VFS , " sec=krb5p is not supported! \n " ) ;
return 1 ;
case Opt_sec_krb5i :
2020-12-10 08:07:12 +03:00
ctx - > sign = true ;
2020-10-21 03:37:11 +03:00
fallthrough ;
case Opt_sec_krb5 :
2020-12-10 08:07:12 +03:00
ctx - > sectype = Kerberos ;
2020-10-21 03:37:11 +03:00
break ;
case Opt_sec_ntlmsspi :
2020-12-10 08:07:12 +03:00
ctx - > sign = true ;
2020-10-21 03:37:11 +03:00
fallthrough ;
case Opt_sec_ntlmssp :
2020-12-10 08:07:12 +03:00
ctx - > sectype = RawNTLMSSP ;
2020-10-21 03:37:11 +03:00
break ;
case Opt_sec_ntlmi :
2020-12-10 08:07:12 +03:00
ctx - > sign = true ;
2020-10-21 03:37:11 +03:00
fallthrough ;
case Opt_ntlm :
2020-12-10 08:07:12 +03:00
ctx - > sectype = NTLM ;
2020-10-21 03:37:11 +03:00
break ;
case Opt_sec_ntlmv2i :
2020-12-10 08:07:12 +03:00
ctx - > sign = true ;
2020-10-21 03:37:11 +03:00
fallthrough ;
case Opt_sec_ntlmv2 :
2020-12-10 08:07:12 +03:00
ctx - > sectype = NTLMv2 ;
2020-10-21 03:37:11 +03:00
break ;
# ifdef CONFIG_CIFS_WEAK_PW_HASH
case Opt_sec_lanman :
2020-12-10 08:07:12 +03:00
ctx - > sectype = LANMAN ;
2020-10-21 03:37:11 +03:00
break ;
# endif
case Opt_sec_none :
2020-12-10 08:07:12 +03:00
ctx - > nullauth = 1 ;
2020-10-21 03:37:11 +03:00
break ;
default :
cifs_dbg ( VFS , " bad security option: %s \n " , value ) ;
return 1 ;
}
return 0 ;
}
2020-10-21 04:30:35 +03:00
static const match_table_t cifs_cacheflavor_tokens = {
{ Opt_cache_loose , " loose " } ,
{ Opt_cache_strict , " strict " } ,
{ Opt_cache_none , " none " } ,
{ Opt_cache_ro , " ro " } ,
{ Opt_cache_rw , " singleclient " } ,
{ Opt_cache_err , NULL }
} ;
int
2020-12-10 08:07:12 +03:00
cifs_parse_cache_flavor ( char * value , struct smb3_fs_context * ctx )
2020-10-21 04:30:35 +03:00
{
substring_t args [ MAX_OPT_ARGS ] ;
switch ( match_token ( value , cifs_cacheflavor_tokens , args ) ) {
case Opt_cache_loose :
2020-12-10 08:07:12 +03:00
ctx - > direct_io = false ;
ctx - > strict_io = false ;
ctx - > cache_ro = false ;
ctx - > cache_rw = false ;
2020-10-21 04:30:35 +03:00
break ;
case Opt_cache_strict :
2020-12-10 08:07:12 +03:00
ctx - > direct_io = false ;
ctx - > strict_io = true ;
ctx - > cache_ro = false ;
ctx - > cache_rw = false ;
2020-10-21 04:30:35 +03:00
break ;
case Opt_cache_none :
2020-12-10 08:07:12 +03:00
ctx - > direct_io = true ;
ctx - > strict_io = false ;
ctx - > cache_ro = false ;
ctx - > cache_rw = false ;
2020-10-21 04:30:35 +03:00
break ;
case Opt_cache_ro :
2020-12-10 08:07:12 +03:00
ctx - > direct_io = false ;
ctx - > strict_io = false ;
ctx - > cache_ro = true ;
ctx - > cache_rw = false ;
2020-10-21 04:30:35 +03:00
break ;
case Opt_cache_rw :
2020-12-10 08:07:12 +03:00
ctx - > direct_io = false ;
ctx - > strict_io = false ;
ctx - > cache_ro = false ;
ctx - > cache_rw = true ;
2020-10-21 04:30:35 +03:00
break ;
default :
cifs_dbg ( VFS , " bad cache= option: %s \n " , value ) ;
return 1 ;
}
return 0 ;
}