Line data Source code
1 : /* 2 : Unix SMB/CIFS implementation. 3 : 4 : session_info utility functions 5 : 6 : Copyright (C) Andrew Bartlett 2008-2010 7 : 8 : This program is free software; you can redistribute it and/or modify 9 : it under the terms of the GNU General Public License as published by 10 : the Free Software Foundation; either version 3 of the License, or 11 : (at your option) any later version. 12 : 13 : This program is distributed in the hope that it will be useful, 14 : but WITHOUT ANY WARRANTY; without even the implied warranty of 15 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 : GNU General Public License for more details. 17 : 18 : You should have received a copy of the GNU General Public License 19 : along with this program. If not, see <http://www.gnu.org/licenses/>. 20 : */ 21 : 22 : #include "replace.h" 23 : #include "libcli/security/security.h" 24 : #include "libcli/util/werror.h" 25 : #include "librpc/gen_ndr/auth.h" 26 : 27 85380095 : enum security_user_level security_session_user_level(const struct auth_session_info *session_info, 28 : const struct dom_sid *domain_sid) 29 : { 30 85380095 : struct security_token *token = NULL; 31 85380095 : bool authenticated = false; 32 85380095 : bool guest = false; 33 : 34 85380095 : if (!session_info) { 35 956887 : return SECURITY_ANONYMOUS; 36 : } 37 84423059 : token = session_info->security_token; 38 : 39 84423059 : if (security_token_is_system(token)) { 40 53315577 : return SECURITY_SYSTEM; 41 : } 42 : 43 28542407 : if (security_token_is_anonymous(token)) { 44 953329 : return SECURITY_ANONYMOUS; 45 : } 46 : 47 27543266 : authenticated = security_token_has_nt_authenticated_users(token); 48 27543266 : guest = security_token_has_builtin_guests(token); 49 27543266 : if (!authenticated) { 50 10583 : if (guest) { 51 209 : return SECURITY_GUEST; 52 : } 53 10374 : return SECURITY_ANONYMOUS; 54 : } 55 : 56 27532683 : if (security_token_has_builtin_administrators(token)) { 57 24666432 : return SECURITY_ADMINISTRATOR; 58 : } 59 : 60 659908 : if (domain_sid) { 61 3796 : struct dom_sid rodc_dcs = { .num_auths = 0 }; 62 3796 : sid_compose(&rodc_dcs, domain_sid, DOMAIN_RID_READONLY_DCS); 63 : 64 3796 : if (security_token_has_sid(token, &rodc_dcs)) { 65 1944 : return SECURITY_RO_DOMAIN_CONTROLLER; 66 : } 67 : } 68 : 69 657964 : if (security_token_has_enterprise_dcs(token)) { 70 73100 : return SECURITY_DOMAIN_CONTROLLER; 71 : } 72 : 73 584174 : return SECURITY_USER; 74 : }