/DNN Platform/Library/Services/Search/Controllers/UserResultController.cs

https://github.com/VashJuan/Dnn.Platform · C# · 154 lines · 121 code · 24 blank · 9 comment · 33 complexity · b5efd0847a356a58b95731d037a3b789 MD5 · raw file

  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT license.
  3. // See the LICENSE file in the project root for more information
  4. namespace DotNetNuke.Services.Search.Controllers
  5. {
  6. using System;
  7. using System.Linq;
  8. using System.Text.RegularExpressions;
  9. using DotNetNuke.Common.Internal;
  10. using DotNetNuke.Common.Utilities;
  11. using DotNetNuke.Entities.Portals;
  12. using DotNetNuke.Entities.Profile;
  13. using DotNetNuke.Entities.Users;
  14. using DotNetNuke.Entities.Users.Social;
  15. using DotNetNuke.Services.Search.Entities;
  16. using Localization = DotNetNuke.Services.Localization.Localization;
  17. /// <summary>
  18. /// Search Result Controller for Tab Indexer.
  19. /// </summary>
  20. /// <remarks></remarks>
  21. [Serializable]
  22. public class UserResultController : BaseResultController
  23. {
  24. private const string LocalizedResxFile = "~/DesktopModules/Admin/SearchResults/App_LocalResources/SearchableModules.resx";
  25. private static readonly Regex SearchResultMatchRegex = new Regex(@"^(\d+)_", RegexOptions.Compiled);
  26. public override string LocalizedSearchTypeName => Localization.GetString("Crawler_user", LocalizedResxFile);
  27. private PortalSettings PortalSettings
  28. {
  29. get { return PortalController.Instance.GetCurrentPortalSettings(); }
  30. }
  31. public override bool HasViewPermission(SearchResult searchResult)
  32. {
  33. var userId = GetUserId(searchResult);
  34. if (userId == Null.NullInteger)
  35. {
  36. return false;
  37. }
  38. var userInSearchResult = UserController.GetUserById(this.PortalSettings.PortalId, userId);
  39. if (userInSearchResult == null || userInSearchResult.IsDeleted)
  40. {
  41. return false;
  42. }
  43. if (searchResult.UniqueKey.Contains("adminonly"))
  44. {
  45. var currentUser = UserController.Instance.GetCurrentUserInfo();
  46. return currentUser.IsSuperUser
  47. || currentUser.IsInRole("Administrators")
  48. || currentUser.UserID == userId;
  49. }
  50. if (searchResult.UniqueKey.Contains("friendsandgroups"))
  51. {
  52. var extendedVisibility = searchResult.UniqueKey.IndexOf("_") != searchResult.UniqueKey.LastIndexOf("_")
  53. ? searchResult.UniqueKey.Split('_')[2]
  54. : string.Empty;
  55. return this.HasSocialReplationship(userInSearchResult, UserController.Instance.GetCurrentUserInfo(), extendedVisibility);
  56. }
  57. if (searchResult.UniqueKey.Contains("membersonly"))
  58. {
  59. return UserController.Instance.GetCurrentUserInfo().UserID != Null.NullInteger;
  60. }
  61. if (searchResult.UniqueKey.Contains("allusers"))
  62. {
  63. var scopeForRoles =
  64. PortalController.GetPortalSetting("SearchResult_ScopeForRoles", searchResult.PortalId, string.Empty)
  65. .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
  66. if (scopeForRoles.Count > 0)
  67. {
  68. if (userInSearchResult.IsSuperUser)
  69. {
  70. return scopeForRoles.Contains("Superusers");
  71. }
  72. return scopeForRoles.Any(i => userInSearchResult.IsInRole(i));
  73. }
  74. return true;
  75. }
  76. return false;
  77. }
  78. public override string GetDocUrl(SearchResult searchResult)
  79. {
  80. var url = TestableGlobals.Instance.NavigateURL(this.PortalSettings.UserTabId, string.Empty, "userid=" + GetUserId(searchResult));
  81. return url;
  82. }
  83. private static int GetUserId(SearchDocumentToDelete searchResult)
  84. {
  85. var match = SearchResultMatchRegex.Match(searchResult.UniqueKey);
  86. return match.Success ? Convert.ToInt32(match.Groups[1].Value) : Null.NullInteger;
  87. }
  88. private bool HasSocialReplationship(UserInfo targetUser, UserInfo accessingUser, string extendedVisibility)
  89. {
  90. if (string.IsNullOrEmpty(extendedVisibility))
  91. {
  92. return false;
  93. }
  94. var profileVisibility = new ProfileVisibility(this.PortalSettings.PortalId, extendedVisibility);
  95. var isVisible = accessingUser.UserID == targetUser.UserID;
  96. if (!isVisible)
  97. {
  98. // Relationships
  99. foreach (var relationship in profileVisibility.RelationshipVisibilities)
  100. {
  101. switch (relationship.RelationshipTypeId)
  102. {
  103. case (int)DefaultRelationshipTypes.Followers:
  104. isVisible = targetUser.Social.Following != null && targetUser.Social.Following.Status == RelationshipStatus.Accepted;
  105. break;
  106. case (int)DefaultRelationshipTypes.Friends:
  107. isVisible = targetUser.Social.Friend != null && targetUser.Social.Friend.Status == RelationshipStatus.Accepted;
  108. break;
  109. default:
  110. isVisible = targetUser.Social.UserRelationships.Any(userRelationship =>
  111. (userRelationship.RelationshipId == relationship.RelationshipId
  112. && accessingUser.UserID == userRelationship.RelatedUserId
  113. && userRelationship.Status == RelationshipStatus.Accepted));
  114. break;
  115. }
  116. if (isVisible)
  117. {
  118. break;
  119. }
  120. }
  121. // Groups/Roles
  122. if (profileVisibility.RoleVisibilities.Any(role => accessingUser.IsInRole(role.RoleName)))
  123. {
  124. isVisible = true;
  125. }
  126. }
  127. return isVisible;
  128. }
  129. }
  130. }