diff --git a/csharp/src/UserDetails.cs b/csharp/src/UserDetails.cs index 213d3f1d762..6e07d03f17c 100644 --- a/csharp/src/UserDetails.cs +++ b/csharp/src/UserDetails.cs @@ -1,31 +1,31 @@ -/* - * Copyright (c) Citrix Systems, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1) Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2) Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. +/* + * Copyright (c) Citrix Systems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1) Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2) Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. */ using System; @@ -36,13 +36,10 @@ namespace XenAPI { public class UserDetails { - // Very large group memberships cause us to hang on connection time as the get subject info call can take some time. - private static readonly int MAX_GROUP_LOOKUP = 40; - /// /// Mapping of SIDS to UserDetails. /// - private static Dictionary sid_To_UserDetails = new Dictionary(); + private static Dictionary sid_To_UserDetails = new Dictionary(); public static void UpdateDetails(string SID, Session session) { lock (UserDetails.sid_To_UserDetails) @@ -67,6 +64,7 @@ public static Dictionary Sid_To_UserDetails private string userName = null; private string[] groupMembershipNames = null; private string[] groupMembershipSids = null; + private readonly Session _session; /// /// The Active Directory SID of this subject. @@ -88,7 +86,10 @@ public static Dictionary Sid_To_UserDetails /// /// The Active Directory group names the subject belongs to. /// - public string[] GroupMembershipNames { get { return groupMembershipNames; } } + public string[] GroupMembershipNames + { + get { return groupMembershipNames ?? (groupMembershipNames = GetGroupMembershipNames(_session)); } + } /// /// The Active Directory group sids the subject belongs to. @@ -99,80 +100,62 @@ public static Dictionary Sid_To_UserDetails /// Makes server calls, call off the event thread. /// /// - /// private UserDetails(Session session) { + _session = session; userSid = session.UserSid; - userDisplayName = GetDisplayName(session); - userName = GetName(session); - GetGroupMembership(session); - } - private void GetGroupMembership(Session session) - { - try - { - groupMembershipSids = Auth.get_group_membership(session, userSid); - - if (groupMembershipSids.Length > MAX_GROUP_LOOKUP) - return; - - string[] output = new string[groupMembershipSids.Length]; - - - for (int i = 0; i < groupMembershipSids.Length; i++) - { - string sid = groupMembershipSids[i]; - Dictionary info = Auth.get_subject_information_from_identifier(session, sid); - string name = ""; - - if (info.TryGetValue("subject-displayname", out name)) - { - output[i] = name; - continue; - } - if (info.TryGetValue("subject-name", out name)) - { - output[i] = name; - continue; - } - - output[i] = sid; - - } - groupMembershipNames = output; - } - catch (Failure) - { - } - } - - private string GetDisplayName(Session session) - { try { Subject subj = new Subject(); subj.other_config = Auth.get_subject_information_from_identifier(session, userSid); - return subj.DisplayName; + userDisplayName = subj.DisplayName; + userName = subj.SubjectName; + groupMembershipSids = Auth.get_group_membership(session, userSid); } - catch (Failure) + catch(Failure) { - return null; } } - private string GetName(Session session) + /// + /// Gets Active Directory group names the subject belongs to. + /// Makes server calls. This could take some time for very large group memberships. + /// + private string[] GetGroupMembershipNames(Session session) { try { - Subject subj = new Subject(); - subj.other_config = Auth.get_subject_information_from_identifier(session, userSid); - return subj.SubjectName; + if (groupMembershipSids != null) + { + var output = new string[groupMembershipSids.Length]; + + for (int i = 0; i < groupMembershipSids.Length; i++) + { + string sid = groupMembershipSids[i]; + Dictionary info = Auth.get_subject_information_from_identifier(session, sid); + string name = ""; + + if (info.TryGetValue("subject-displayname", out name)) + { + output[i] = name; + continue; + } + if (info.TryGetValue("subject-name", out name)) + { + output[i] = name; + continue; + } + + output[i] = sid; + } + return output; + } } catch (Failure) { - return null; } + return null; } } }