2007-11-26 04:25:20 +03:00
/*
Unix SMB / CIFS implementation .
Authentication utility functions
Copyright ( C ) Andrew Tridgell 1992 - 1998
2010-04-09 11:18:53 +04:00
Copyright ( C ) Andrew Bartlett 2001 - 2010
2007-11-26 04:25:20 +03:00
Copyright ( C ) Jeremy Allison 2000 - 2001
Copyright ( C ) Rafal Szczesniak 2002
Copyright ( C ) Stefan Metzmacher 2005
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
the Free Software Foundation ; either version 3 of the License , or
( at your option ) any later version .
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 .
You should have received a copy of the GNU General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# include "includes.h"
# include "libcli/security/security.h"
# include "auth/credentials/credentials.h"
# include "param/param.h"
2011-02-08 08:53:13 +03:00
# include "auth/auth.h" /* for auth_user_info_dc */
2007-11-26 04:25:20 +03:00
# include "auth/session.h"
# include "auth/system_session_proto.h"
2018-05-21 04:58:12 +03:00
# undef DBGC_CLASS
# define DBGC_CLASS DBGC_AUTH
2007-11-27 03:14:54 +03:00
2009-10-23 07:19:28 +04:00
/*
prevent the static system session being freed
*/
static int system_session_destructor ( struct auth_session_info * info )
{
return - 1 ;
}
2007-11-27 03:14:54 +03:00
2008-04-24 16:30:36 +04:00
/* Create a security token for a session SYSTEM (the most
2018-09-04 15:43:33 +03:00
* trusted / privileged account ) , including the local machine account as
2008-04-24 16:30:36 +04:00
* the off - host credentials
*/
2010-07-16 08:32:42 +04:00
_PUBLIC_ struct auth_session_info * system_session ( struct loadparm_context * lp_ctx )
2007-11-26 04:25:20 +03:00
{
2009-10-23 07:19:28 +04:00
static struct auth_session_info * static_session ;
2007-11-26 04:25:20 +03:00
NTSTATUS nt_status ;
2009-10-23 07:19:28 +04:00
if ( static_session ) {
return static_session ;
}
2017-05-09 23:28:49 +03:00
/*
* Use NULL here , not the autofree context for this
* static pointer . The destructor prevents freeing this
* memory anyway .
*/
nt_status = auth_system_session_info ( NULL ,
2007-12-03 17:53:28 +03:00
lp_ctx ,
2009-10-23 07:19:28 +04:00
& static_session ) ;
2007-11-26 04:25:20 +03:00
if ( ! NT_STATUS_IS_OK ( nt_status ) ) {
2018-09-04 15:45:05 +03:00
TALLOC_FREE ( static_session ) ;
2007-11-26 04:25:20 +03:00
return NULL ;
}
2009-10-23 07:19:28 +04:00
talloc_set_destructor ( static_session , system_session_destructor ) ;
return static_session ;
2007-11-26 04:25:20 +03:00
}
2010-08-14 11:45:57 +04:00
NTSTATUS auth_system_session_info ( TALLOC_CTX * parent_ctx ,
struct loadparm_context * lp_ctx ,
struct auth_session_info * * _session_info )
2007-11-26 04:25:20 +03:00
{
NTSTATUS nt_status ;
2011-02-08 08:53:13 +03:00
struct auth_user_info_dc * user_info_dc = NULL ;
2007-11-26 04:25:20 +03:00
struct auth_session_info * session_info = NULL ;
2018-09-04 15:46:03 +03:00
TALLOC_CTX * mem_ctx = NULL ;
2021-06-22 10:41:36 +03:00
bool ok ;
2018-09-04 15:46:03 +03:00
mem_ctx = talloc_new ( parent_ctx ) ;
if ( mem_ctx = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
2007-11-26 04:25:20 +03:00
2011-02-08 08:53:13 +03:00
nt_status = auth_system_user_info_dc ( mem_ctx , lpcfg_netbios_name ( lp_ctx ) ,
& user_info_dc ) ;
2007-11-26 04:25:20 +03:00
if ( ! NT_STATUS_IS_OK ( nt_status ) ) {
talloc_free ( mem_ctx ) ;
return nt_status ;
}
2011-02-08 08:53:13 +03:00
/* references the user_info_dc into the session_info */
2023-09-27 05:11:20 +03:00
nt_status = auth_generate_session_info ( parent_ctx ,
lp_ctx ,
NULL /* sam_ctx */ ,
user_info_dc ,
AUTH_SESSION_INFO_SIMPLE_PRIVILEGES ,
& session_info ) ;
2007-11-26 04:25:20 +03:00
talloc_free ( mem_ctx ) ;
NT_STATUS_NOT_OK_RETURN ( nt_status ) ;
session_info - > credentials = cli_credentials_init ( session_info ) ;
if ( ! session_info - > credentials ) {
2023-08-11 00:56:55 +03:00
talloc_free ( session_info ) ;
2007-11-26 04:25:20 +03:00
return NT_STATUS_NO_MEMORY ;
}
2021-06-22 10:41:36 +03:00
ok = cli_credentials_set_conf ( session_info - > credentials , lp_ctx ) ;
if ( ! ok ) {
2023-08-11 00:56:55 +03:00
talloc_free ( session_info ) ;
2021-06-22 10:41:36 +03:00
return NT_STATUS_INTERNAL_ERROR ;
}
2007-11-26 04:25:20 +03:00
2010-08-14 08:16:41 +04:00
cli_credentials_set_machine_account_pending ( session_info - > credentials , lp_ctx ) ;
2007-11-26 04:25:20 +03:00
* _session_info = session_info ;
return NT_STATUS_OK ;
}
2011-02-08 08:53:13 +03:00
NTSTATUS auth_system_user_info_dc ( TALLOC_CTX * mem_ctx , const char * netbios_name ,
struct auth_user_info_dc * * _user_info_dc )
2007-11-26 04:25:20 +03:00
{
2011-02-08 08:53:13 +03:00
struct auth_user_info_dc * user_info_dc ;
struct auth_user_info * info ;
2008-11-02 07:49:36 +03:00
2022-06-10 10:18:07 +03:00
user_info_dc = talloc_zero ( mem_ctx , struct auth_user_info_dc ) ;
2011-02-08 08:53:13 +03:00
NT_STATUS_HAVE_NO_MEMORY ( user_info_dc ) ;
2007-11-26 04:25:20 +03:00
2011-01-20 15:39:37 +03:00
/* This returns a pointer to a struct dom_sid, which is the
* same as a 1 element list of struct dom_sid */
2011-02-08 08:53:13 +03:00
user_info_dc - > num_sids = 1 ;
2022-09-27 05:13:12 +03:00
user_info_dc - > sids = talloc ( user_info_dc , struct auth_SidAttr ) ;
2023-08-03 01:47:42 +03:00
if ( user_info_dc - > sids = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
}
2007-11-26 04:25:20 +03:00
2022-09-27 05:13:12 +03:00
user_info_dc - > sids - > sid = global_sid_System ;
2022-12-15 01:58:11 +03:00
user_info_dc - > sids - > attrs = SE_GROUP_DEFAULT_FLAGS ;
2022-09-27 05:13:12 +03:00
2007-11-26 04:25:20 +03:00
/* annoying, but the Anonymous really does have a session key,
and it is all zeros ! */
2011-02-08 08:53:13 +03:00
user_info_dc - > user_session_key = data_blob_talloc ( user_info_dc , NULL , 16 ) ;
2023-08-03 01:47:42 +03:00
if ( user_info_dc - > user_session_key . data = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
}
2007-11-26 04:25:20 +03:00
2011-02-08 08:53:13 +03:00
user_info_dc - > lm_session_key = data_blob_talloc ( user_info_dc , NULL , 16 ) ;
2023-08-03 01:47:42 +03:00
if ( user_info_dc - > lm_session_key . data = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
}
2007-11-26 04:25:20 +03:00
2011-02-08 08:53:13 +03:00
data_blob_clear ( & user_info_dc - > user_session_key ) ;
data_blob_clear ( & user_info_dc - > lm_session_key ) ;
2007-11-26 04:25:20 +03:00
2011-02-08 08:53:13 +03:00
user_info_dc - > info = info = talloc_zero ( user_info_dc , struct auth_user_info ) ;
2023-08-03 01:47:42 +03:00
if ( user_info_dc - > info = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2007-11-26 04:25:20 +03:00
2011-02-08 08:53:13 +03:00
info - > account_name = talloc_strdup ( info , " SYSTEM " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > account_name = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2007-11-26 04:25:20 +03:00
2011-02-08 08:53:13 +03:00
info - > domain_name = talloc_strdup ( info , " NT AUTHORITY " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > domain_name = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2007-11-26 04:25:20 +03:00
2011-02-08 08:53:13 +03:00
info - > full_name = talloc_strdup ( info , " System " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > full_name = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2007-11-26 04:25:20 +03:00
2011-02-08 08:53:13 +03:00
info - > logon_script = talloc_strdup ( info , " " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > logon_script = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2007-11-26 04:25:20 +03:00
2011-02-08 08:53:13 +03:00
info - > profile_path = talloc_strdup ( info , " " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > profile_path = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2007-11-26 04:25:20 +03:00
2011-02-08 08:53:13 +03:00
info - > home_directory = talloc_strdup ( info , " " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > home_directory = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2007-11-26 04:25:20 +03:00
2011-02-08 08:53:13 +03:00
info - > home_drive = talloc_strdup ( info , " " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > home_drive = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2007-11-26 04:25:20 +03:00
2011-02-08 08:53:13 +03:00
info - > logon_server = talloc_strdup ( info , netbios_name ) ;
2023-08-03 01:47:42 +03:00
if ( info - > logon_server = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2007-11-26 04:25:20 +03:00
2011-02-08 08:53:13 +03:00
info - > last_logon = 0 ;
info - > last_logoff = 0 ;
info - > acct_expiry = 0 ;
info - > last_password_change = 0 ;
info - > allow_password_change = 0 ;
info - > force_password_change = 0 ;
2007-11-26 04:25:20 +03:00
2011-02-08 08:53:13 +03:00
info - > logon_count = 0 ;
info - > bad_password_count = 0 ;
2007-11-26 04:25:20 +03:00
2011-02-08 08:53:13 +03:00
info - > acct_flags = ACB_NORMAL ;
2007-11-26 04:25:20 +03:00
2022-12-12 00:50:01 +03:00
info - > user_flags = 0 ;
2011-02-08 08:53:13 +03:00
* _user_info_dc = user_info_dc ;
2007-11-26 04:25:20 +03:00
return NT_STATUS_OK ;
}
2011-02-08 08:53:13 +03:00
static NTSTATUS auth_domain_admin_user_info_dc ( TALLOC_CTX * mem_ctx ,
2009-09-03 15:39:40 +04:00
const char * netbios_name ,
const char * domain_name ,
struct dom_sid * domain_sid ,
2011-02-08 08:53:13 +03:00
struct auth_user_info_dc * * _user_info_dc )
2009-09-03 15:39:40 +04:00
{
2011-02-08 08:53:13 +03:00
struct auth_user_info_dc * user_info_dc ;
struct auth_user_info * info ;
2009-09-03 15:39:40 +04:00
2022-06-10 10:18:07 +03:00
user_info_dc = talloc_zero ( mem_ctx , struct auth_user_info_dc ) ;
2011-02-08 08:53:13 +03:00
NT_STATUS_HAVE_NO_MEMORY ( user_info_dc ) ;
2009-09-03 15:39:40 +04:00
2022-12-12 23:04:47 +03:00
user_info_dc - > num_sids = 8 ;
2022-09-27 05:13:12 +03:00
user_info_dc - > sids = talloc_array ( user_info_dc , struct auth_SidAttr , user_info_dc - > num_sids ) ;
user_info_dc - > sids [ PRIMARY_USER_SID_INDEX ] . sid = * domain_sid ;
sid_append_rid ( & user_info_dc - > sids [ PRIMARY_USER_SID_INDEX ] . sid , DOMAIN_RID_ADMINISTRATOR ) ;
2022-12-15 01:58:11 +03:00
user_info_dc - > sids [ PRIMARY_USER_SID_INDEX ] . attrs = SE_GROUP_DEFAULT_FLAGS ;
2022-09-27 05:13:12 +03:00
user_info_dc - > sids [ PRIMARY_GROUP_SID_INDEX ] . sid = * domain_sid ;
sid_append_rid ( & user_info_dc - > sids [ PRIMARY_GROUP_SID_INDEX ] . sid , DOMAIN_RID_USERS ) ;
2022-12-15 01:58:11 +03:00
user_info_dc - > sids [ PRIMARY_GROUP_SID_INDEX ] . attrs = SE_GROUP_DEFAULT_FLAGS ;
2022-09-27 05:13:12 +03:00
2022-12-12 23:04:47 +03:00
/* Add the primary group again. */
user_info_dc - > sids [ 2 ] = user_info_dc - > sids [ PRIMARY_GROUP_SID_INDEX ] ;
2022-09-27 05:13:12 +03:00
2022-12-12 23:04:47 +03:00
user_info_dc - > sids [ 3 ] . sid = global_sid_Builtin_Administrators ;
2022-12-15 01:58:11 +03:00
user_info_dc - > sids [ 3 ] . attrs = SE_GROUP_DEFAULT_FLAGS ;
2022-12-12 23:04:47 +03:00
2022-09-27 05:13:12 +03:00
user_info_dc - > sids [ 4 ] . sid = * domain_sid ;
2022-12-12 23:04:47 +03:00
sid_append_rid ( & user_info_dc - > sids [ 4 ] . sid , DOMAIN_RID_ADMINS ) ;
2022-12-15 01:58:11 +03:00
user_info_dc - > sids [ 4 ] . attrs = SE_GROUP_DEFAULT_FLAGS ;
2022-09-27 05:13:12 +03:00
user_info_dc - > sids [ 5 ] . sid = * domain_sid ;
2022-12-12 23:04:47 +03:00
sid_append_rid ( & user_info_dc - > sids [ 5 ] . sid , DOMAIN_RID_ENTERPRISE_ADMINS ) ;
2022-12-15 01:58:11 +03:00
user_info_dc - > sids [ 5 ] . attrs = SE_GROUP_DEFAULT_FLAGS ;
2022-09-27 05:13:12 +03:00
user_info_dc - > sids [ 6 ] . sid = * domain_sid ;
2022-12-12 23:04:47 +03:00
sid_append_rid ( & user_info_dc - > sids [ 6 ] . sid , DOMAIN_RID_POLICY_ADMINS ) ;
2022-12-15 01:58:11 +03:00
user_info_dc - > sids [ 6 ] . attrs = SE_GROUP_DEFAULT_FLAGS ;
2022-12-12 23:04:47 +03:00
user_info_dc - > sids [ 7 ] . sid = * domain_sid ;
sid_append_rid ( & user_info_dc - > sids [ 7 ] . sid , DOMAIN_RID_SCHEMA_ADMINS ) ;
user_info_dc - > sids [ 7 ] . attrs = SE_GROUP_DEFAULT_FLAGS ;
2009-09-03 15:39:40 +04:00
/* What should the session key be?*/
2011-02-08 08:53:13 +03:00
user_info_dc - > user_session_key = data_blob_talloc ( user_info_dc , NULL , 16 ) ;
2023-08-03 01:47:42 +03:00
if ( user_info_dc - > user_session_key . data = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2011-02-08 08:53:13 +03:00
user_info_dc - > lm_session_key = data_blob_talloc ( user_info_dc , NULL , 16 ) ;
2023-08-03 01:47:42 +03:00
if ( user_info_dc - > lm_session_key . data = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2009-09-03 15:39:40 +04:00
2011-02-08 08:53:13 +03:00
data_blob_clear ( & user_info_dc - > user_session_key ) ;
data_blob_clear ( & user_info_dc - > lm_session_key ) ;
2009-09-03 15:39:40 +04:00
2011-02-08 08:53:13 +03:00
user_info_dc - > info = info = talloc_zero ( user_info_dc , struct auth_user_info ) ;
2023-08-03 01:47:42 +03:00
if ( user_info_dc - > info = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2009-09-03 15:39:40 +04:00
2011-02-08 08:53:13 +03:00
info - > account_name = talloc_strdup ( info , " Administrator " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > account_name = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2009-09-03 15:39:40 +04:00
2011-02-08 08:53:13 +03:00
info - > domain_name = talloc_strdup ( info , domain_name ) ;
2023-08-03 01:47:42 +03:00
if ( info - > domain_name = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2009-09-03 15:39:40 +04:00
2011-02-08 08:53:13 +03:00
info - > full_name = talloc_strdup ( info , " Administrator " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > full_name = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2009-09-03 15:39:40 +04:00
2011-02-08 08:53:13 +03:00
info - > logon_script = talloc_strdup ( info , " " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > logon_script = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2009-09-03 15:39:40 +04:00
2011-02-08 08:53:13 +03:00
info - > profile_path = talloc_strdup ( info , " " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > profile_path = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2009-09-03 15:39:40 +04:00
2011-02-08 08:53:13 +03:00
info - > home_directory = talloc_strdup ( info , " " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > home_directory = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2009-09-03 15:39:40 +04:00
2011-02-08 08:53:13 +03:00
info - > home_drive = talloc_strdup ( info , " " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > home_drive = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2009-09-03 15:39:40 +04:00
2011-02-08 08:53:13 +03:00
info - > logon_server = talloc_strdup ( info , netbios_name ) ;
2023-08-03 01:47:42 +03:00
if ( info - > logon_server = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2009-09-03 15:39:40 +04:00
2011-02-08 08:53:13 +03:00
info - > last_logon = 0 ;
info - > last_logoff = 0 ;
info - > acct_expiry = 0 ;
info - > last_password_change = 0 ;
info - > allow_password_change = 0 ;
info - > force_password_change = 0 ;
2009-09-03 15:39:40 +04:00
2011-02-08 08:53:13 +03:00
info - > logon_count = 0 ;
info - > bad_password_count = 0 ;
2009-09-03 15:39:40 +04:00
2011-02-08 08:53:13 +03:00
info - > acct_flags = ACB_NORMAL ;
2009-09-03 15:39:40 +04:00
2022-12-12 00:50:01 +03:00
info - > user_flags = 0 ;
2009-09-03 15:39:40 +04:00
2011-02-08 08:53:13 +03:00
* _user_info_dc = user_info_dc ;
2009-09-03 15:39:40 +04:00
return NT_STATUS_OK ;
}
static NTSTATUS auth_domain_admin_session_info ( TALLOC_CTX * parent_ctx ,
struct loadparm_context * lp_ctx ,
struct dom_sid * domain_sid ,
2010-12-21 03:43:04 +03:00
struct auth_session_info * * session_info )
2009-09-03 15:39:40 +04:00
{
NTSTATUS nt_status ;
2011-02-08 08:53:13 +03:00
struct auth_user_info_dc * user_info_dc = NULL ;
2009-09-03 15:39:40 +04:00
TALLOC_CTX * mem_ctx = talloc_new ( parent_ctx ) ;
2011-03-21 12:25:09 +03:00
NT_STATUS_HAVE_NO_MEMORY ( mem_ctx ) ;
2023-09-27 05:11:20 +03:00
nt_status = auth_domain_admin_user_info_dc ( mem_ctx ,
lpcfg_netbios_name ( lp_ctx ) ,
lpcfg_workgroup ( lp_ctx ) ,
domain_sid ,
& user_info_dc ) ;
2009-09-03 15:39:40 +04:00
if ( ! NT_STATUS_IS_OK ( nt_status ) ) {
talloc_free ( mem_ctx ) ;
return nt_status ;
}
2023-09-27 05:11:20 +03:00
nt_status = auth_generate_session_info ( mem_ctx ,
lp_ctx ,
NULL /* sam_ctx */ ,
user_info_dc ,
2010-12-21 03:43:04 +03:00
AUTH_SESSION_INFO_SIMPLE_PRIVILEGES | AUTH_SESSION_INFO_AUTHENTICATED | AUTH_SESSION_INFO_DEFAULT_GROUPS ,
session_info ) ;
2023-05-09 05:06:23 +03:00
/* There is already a reference between the session_info and user_info_dc */
2010-12-21 03:43:04 +03:00
if ( NT_STATUS_IS_OK ( nt_status ) ) {
talloc_steal ( parent_ctx , * session_info ) ;
2009-09-03 15:39:40 +04:00
}
2010-12-21 03:43:04 +03:00
talloc_free ( mem_ctx ) ;
return nt_status ;
2009-09-03 15:39:40 +04:00
}
_PUBLIC_ struct auth_session_info * admin_session ( TALLOC_CTX * mem_ctx , struct loadparm_context * lp_ctx , struct dom_sid * domain_sid )
{
NTSTATUS nt_status ;
struct auth_session_info * session_info = NULL ;
nt_status = auth_domain_admin_session_info ( mem_ctx ,
lp_ctx ,
domain_sid ,
& session_info ) ;
if ( ! NT_STATUS_IS_OK ( nt_status ) ) {
return NULL ;
}
return session_info ;
}
2010-04-09 11:18:53 +04:00
_PUBLIC_ NTSTATUS auth_anonymous_session_info ( TALLOC_CTX * parent_ctx ,
struct loadparm_context * lp_ctx ,
struct auth_session_info * * _session_info )
{
NTSTATUS nt_status ;
2011-02-08 08:53:13 +03:00
struct auth_user_info_dc * user_info_dc = NULL ;
2010-04-09 11:18:53 +04:00
struct auth_session_info * session_info = NULL ;
TALLOC_CTX * mem_ctx = talloc_new ( parent_ctx ) ;
2021-06-22 10:41:36 +03:00
bool ok ;
2023-08-11 00:57:11 +03:00
if ( mem_ctx = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
2010-04-09 11:18:53 +04:00
2011-02-08 08:53:13 +03:00
nt_status = auth_anonymous_user_info_dc ( mem_ctx ,
2023-09-27 05:11:20 +03:00
lpcfg_netbios_name ( lp_ctx ) ,
& user_info_dc ) ;
2010-04-09 11:18:53 +04:00
if ( ! NT_STATUS_IS_OK ( nt_status ) ) {
talloc_free ( mem_ctx ) ;
return nt_status ;
}
2011-02-08 08:53:13 +03:00
/* references the user_info_dc into the session_info */
2023-09-27 05:11:20 +03:00
nt_status = auth_generate_session_info ( parent_ctx ,
lp_ctx ,
NULL /* sam_ctx */ ,
user_info_dc ,
AUTH_SESSION_INFO_SIMPLE_PRIVILEGES ,
& session_info ) ;
2010-04-09 11:18:53 +04:00
talloc_free ( mem_ctx ) ;
NT_STATUS_NOT_OK_RETURN ( nt_status ) ;
session_info - > credentials = cli_credentials_init ( session_info ) ;
if ( ! session_info - > credentials ) {
2023-08-11 00:56:55 +03:00
talloc_free ( session_info ) ;
2010-04-09 11:18:53 +04:00
return NT_STATUS_NO_MEMORY ;
}
2021-06-22 10:41:36 +03:00
ok = cli_credentials_set_conf ( session_info - > credentials , lp_ctx ) ;
if ( ! ok ) {
2023-08-11 00:56:55 +03:00
talloc_free ( session_info ) ;
2021-06-22 10:41:36 +03:00
return NT_STATUS_INTERNAL_ERROR ;
}
2010-04-09 11:18:53 +04:00
cli_credentials_set_anonymous ( session_info - > credentials ) ;
* _session_info = session_info ;
return NT_STATUS_OK ;
}
2011-02-08 08:53:13 +03:00
_PUBLIC_ NTSTATUS auth_anonymous_user_info_dc ( TALLOC_CTX * mem_ctx ,
2010-04-09 11:18:53 +04:00
const char * netbios_name ,
2011-02-08 08:53:13 +03:00
struct auth_user_info_dc * * _user_info_dc )
2010-04-09 11:18:53 +04:00
{
2011-02-08 08:53:13 +03:00
struct auth_user_info_dc * user_info_dc ;
struct auth_user_info * info ;
2022-06-10 10:18:07 +03:00
user_info_dc = talloc_zero ( mem_ctx , struct auth_user_info_dc ) ;
2011-02-08 08:53:13 +03:00
NT_STATUS_HAVE_NO_MEMORY ( user_info_dc ) ;
2010-04-09 11:18:53 +04:00
2011-01-20 15:39:37 +03:00
/* This returns a pointer to a struct dom_sid, which is the
* same as a 1 element list of struct dom_sid */
2011-02-08 08:53:13 +03:00
user_info_dc - > num_sids = 1 ;
2022-09-27 05:13:12 +03:00
user_info_dc - > sids = talloc ( user_info_dc , struct auth_SidAttr ) ;
2023-08-03 01:47:42 +03:00
if ( user_info_dc - > sids = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2010-04-09 11:18:53 +04:00
2022-09-27 05:13:12 +03:00
user_info_dc - > sids - > sid = global_sid_Anonymous ;
2022-12-15 01:58:11 +03:00
user_info_dc - > sids - > attrs = SE_GROUP_DEFAULT_FLAGS ;
2022-09-27 05:13:12 +03:00
2010-04-09 11:18:53 +04:00
/* annoying, but the Anonymous really does have a session key... */
2011-02-08 08:53:13 +03:00
user_info_dc - > user_session_key = data_blob_talloc ( user_info_dc , NULL , 16 ) ;
2023-08-03 01:47:42 +03:00
if ( user_info_dc - > user_session_key . data = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2010-04-09 11:18:53 +04:00
2011-02-08 08:53:13 +03:00
user_info_dc - > lm_session_key = data_blob_talloc ( user_info_dc , NULL , 16 ) ;
2023-08-03 01:47:42 +03:00
if ( user_info_dc - > lm_session_key . data = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2010-04-09 11:18:53 +04:00
/* and it is all zeros! */
2011-02-08 08:53:13 +03:00
data_blob_clear ( & user_info_dc - > user_session_key ) ;
data_blob_clear ( & user_info_dc - > lm_session_key ) ;
user_info_dc - > info = info = talloc_zero ( user_info_dc , struct auth_user_info ) ;
2023-08-03 01:47:42 +03:00
if ( user_info_dc - > info = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2010-04-09 11:18:53 +04:00
2011-02-08 08:53:13 +03:00
info - > account_name = talloc_strdup ( info , " ANONYMOUS LOGON " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > account_name = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2010-04-09 11:18:53 +04:00
2011-02-08 08:53:13 +03:00
info - > domain_name = talloc_strdup ( info , " NT AUTHORITY " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > domain_name = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2010-04-09 11:18:53 +04:00
2011-02-08 08:53:13 +03:00
info - > full_name = talloc_strdup ( info , " Anonymous Logon " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > full_name = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2010-04-09 11:18:53 +04:00
2011-02-08 08:53:13 +03:00
info - > logon_script = talloc_strdup ( info , " " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > logon_script = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2010-04-09 11:18:53 +04:00
2011-02-08 08:53:13 +03:00
info - > profile_path = talloc_strdup ( info , " " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > profile_path = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2010-04-09 11:18:53 +04:00
2011-02-08 08:53:13 +03:00
info - > home_directory = talloc_strdup ( info , " " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > home_directory = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2010-04-09 11:18:53 +04:00
2011-02-08 08:53:13 +03:00
info - > home_drive = talloc_strdup ( info , " " ) ;
2023-08-03 01:47:42 +03:00
if ( info - > home_drive = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2010-04-09 11:18:53 +04:00
2011-02-08 08:53:13 +03:00
info - > logon_server = talloc_strdup ( info , netbios_name ) ;
2023-08-03 01:47:42 +03:00
if ( info - > logon_server = = NULL ) {
talloc_free ( user_info_dc ) ;
return NT_STATUS_NO_MEMORY ;
} ;
2010-04-09 11:18:53 +04:00
2011-02-08 08:53:13 +03:00
info - > last_logon = 0 ;
info - > last_logoff = 0 ;
info - > acct_expiry = 0 ;
info - > last_password_change = 0 ;
info - > allow_password_change = 0 ;
info - > force_password_change = 0 ;
2010-04-09 11:18:53 +04:00
2011-02-08 08:53:13 +03:00
info - > logon_count = 0 ;
info - > bad_password_count = 0 ;
2010-04-09 11:18:53 +04:00
2011-02-08 08:53:13 +03:00
info - > acct_flags = ACB_NORMAL ;
2010-04-09 11:18:53 +04:00
2022-12-12 00:50:01 +03:00
/* The user is not authenticated. */
info - > user_flags = NETLOGON_GUEST ;
2010-04-09 11:18:53 +04:00
2011-02-08 08:53:13 +03:00
* _user_info_dc = user_info_dc ;
2010-04-09 11:18:53 +04:00
return NT_STATUS_OK ;
}