AbpUserConfigurationBuilder.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. using System.Collections.Generic;
  2. using System.Threading.Tasks;
  3. using Abp.Application.Features;
  4. using Abp.Application.Navigation;
  5. using Abp.Authorization;
  6. using Abp.Configuration;
  7. using Abp.Configuration.Startup;
  8. using Abp.Localization;
  9. using Abp.Runtime.Session;
  10. using Abp.Timing;
  11. using Abp.Timing.Timezone;
  12. using Abp.Web.Models.AbpUserConfiguration;
  13. using Abp.Web.Security.AntiForgery;
  14. using System.Linq;
  15. using Abp.Dependency;
  16. using Abp.Extensions;
  17. using System.Globalization;
  18. namespace Abp.Web.Configuration
  19. {
  20. public class AbpUserConfigurationBuilder : ITransientDependency
  21. {
  22. private readonly IAbpStartupConfiguration _startupConfiguration;
  23. protected IMultiTenancyConfig MultiTenancyConfig { get; }
  24. protected ILanguageManager LanguageManager { get; }
  25. protected ILocalizationManager LocalizationManager { get; }
  26. protected IFeatureManager FeatureManager { get; }
  27. protected IFeatureChecker FeatureChecker { get; }
  28. protected IPermissionManager PermissionManager { get; }
  29. protected IUserNavigationManager UserNavigationManager { get; }
  30. protected ISettingDefinitionManager SettingDefinitionManager { get; }
  31. protected ISettingManager SettingManager { get; }
  32. protected IAbpAntiForgeryConfiguration AbpAntiForgeryConfiguration { get; }
  33. protected IAbpSession AbpSession { get; }
  34. protected IPermissionChecker PermissionChecker { get; }
  35. protected Dictionary<string, object> CustomDataConfig { get; }
  36. private readonly IIocResolver _iocResolver;
  37. public AbpUserConfigurationBuilder(
  38. IMultiTenancyConfig multiTenancyConfig,
  39. ILanguageManager languageManager,
  40. ILocalizationManager localizationManager,
  41. IFeatureManager featureManager,
  42. IFeatureChecker featureChecker,
  43. IPermissionManager permissionManager,
  44. IUserNavigationManager userNavigationManager,
  45. ISettingDefinitionManager settingDefinitionManager,
  46. ISettingManager settingManager,
  47. IAbpAntiForgeryConfiguration abpAntiForgeryConfiguration,
  48. IAbpSession abpSession,
  49. IPermissionChecker permissionChecker,
  50. IIocResolver iocResolver,
  51. IAbpStartupConfiguration startupConfiguration)
  52. {
  53. MultiTenancyConfig = multiTenancyConfig;
  54. LanguageManager = languageManager;
  55. LocalizationManager = localizationManager;
  56. FeatureManager = featureManager;
  57. FeatureChecker = featureChecker;
  58. PermissionManager = permissionManager;
  59. UserNavigationManager = userNavigationManager;
  60. SettingDefinitionManager = settingDefinitionManager;
  61. SettingManager = settingManager;
  62. AbpAntiForgeryConfiguration = abpAntiForgeryConfiguration;
  63. AbpSession = abpSession;
  64. PermissionChecker = permissionChecker;
  65. _iocResolver = iocResolver;
  66. _startupConfiguration = startupConfiguration;
  67. CustomDataConfig = new Dictionary<string, object>();
  68. }
  69. public virtual async Task<AbpUserConfigurationDto> GetAll()
  70. {
  71. return new AbpUserConfigurationDto
  72. {
  73. MultiTenancy = GetUserMultiTenancyConfig(),
  74. Session = GetUserSessionConfig(),
  75. Localization = GetUserLocalizationConfig(),
  76. Features = await GetUserFeaturesConfig(),
  77. Auth = await GetUserAuthConfig(),
  78. Nav = await GetUserNavConfig(),
  79. Setting = await GetUserSettingConfig(),
  80. Clock = GetUserClockConfig(),
  81. Timing = await GetUserTimingConfig(),
  82. Security = GetUserSecurityConfig(),
  83. Custom = _startupConfiguration.GetCustomConfig()
  84. };
  85. }
  86. protected virtual AbpMultiTenancyConfigDto GetUserMultiTenancyConfig()
  87. {
  88. return new AbpMultiTenancyConfigDto
  89. {
  90. IsEnabled = MultiTenancyConfig.IsEnabled
  91. };
  92. }
  93. protected virtual AbpUserSessionConfigDto GetUserSessionConfig()
  94. {
  95. return new AbpUserSessionConfigDto
  96. {
  97. UserId = AbpSession.UserId,
  98. TenantId = AbpSession.TenantId,
  99. ImpersonatorUserId = AbpSession.ImpersonatorUserId,
  100. ImpersonatorTenantId = AbpSession.ImpersonatorTenantId,
  101. MultiTenancySide = AbpSession.MultiTenancySide
  102. };
  103. }
  104. protected virtual AbpUserLocalizationConfigDto GetUserLocalizationConfig()
  105. {
  106. var currentCulture = CultureInfo.CurrentUICulture;
  107. var languages = LanguageManager.GetLanguages();
  108. var config = new AbpUserLocalizationConfigDto
  109. {
  110. CurrentCulture = new AbpUserCurrentCultureConfigDto
  111. {
  112. Name = currentCulture.Name,
  113. DisplayName = currentCulture.DisplayName
  114. },
  115. Languages = languages.ToList()
  116. };
  117. if (languages.Count > 0)
  118. {
  119. config.CurrentLanguage = LanguageManager.CurrentLanguage;
  120. }
  121. var sources = LocalizationManager.GetAllSources().OrderBy(s => s.Name).ToArray();
  122. config.Sources = sources.Select(s => new AbpLocalizationSourceDto
  123. {
  124. Name = s.Name,
  125. Type = s.GetType().Name
  126. }).ToList();
  127. config.Values = new Dictionary<string, Dictionary<string, string>>();
  128. foreach (var source in sources)
  129. {
  130. var stringValues = source.GetAllStrings(currentCulture).OrderBy(s => s.Name).ToList();
  131. var stringDictionary = stringValues
  132. .ToDictionary(_ => _.Name, _ => _.Value);
  133. config.Values.Add(source.Name, stringDictionary);
  134. }
  135. return config;
  136. }
  137. protected virtual async Task<AbpUserFeatureConfigDto> GetUserFeaturesConfig()
  138. {
  139. var config = new AbpUserFeatureConfigDto()
  140. {
  141. AllFeatures = new Dictionary<string, AbpStringValueDto>()
  142. };
  143. var allFeatures = FeatureManager.GetAll().ToList();
  144. if (AbpSession.TenantId.HasValue)
  145. {
  146. var currentTenantId = AbpSession.GetTenantId();
  147. foreach (var feature in allFeatures)
  148. {
  149. var value = await FeatureChecker.GetValueAsync(currentTenantId, feature.Name);
  150. config.AllFeatures.Add(feature.Name, new AbpStringValueDto
  151. {
  152. Value = value
  153. });
  154. }
  155. }
  156. else
  157. {
  158. foreach (var feature in allFeatures)
  159. {
  160. config.AllFeatures.Add(feature.Name, new AbpStringValueDto
  161. {
  162. Value = feature.DefaultValue
  163. });
  164. }
  165. }
  166. return config;
  167. }
  168. protected virtual async Task<AbpUserAuthConfigDto> GetUserAuthConfig()
  169. {
  170. var config = new AbpUserAuthConfigDto();
  171. var allPermissionNames = PermissionManager.GetAllPermissions(false).Select(p => p.Name).ToList();
  172. var grantedPermissionNames = new List<string>();
  173. if (AbpSession.UserId.HasValue)
  174. {
  175. foreach (var permissionName in allPermissionNames)
  176. {
  177. if (await PermissionChecker.IsGrantedAsync(permissionName))
  178. {
  179. grantedPermissionNames.Add(permissionName);
  180. }
  181. }
  182. }
  183. config.AllPermissions = allPermissionNames.ToDictionary(permissionName => permissionName, permissionName => "true");
  184. config.GrantedPermissions = grantedPermissionNames.ToDictionary(permissionName => permissionName, permissionName => "true");
  185. return config;
  186. }
  187. protected virtual async Task<AbpUserNavConfigDto> GetUserNavConfig()
  188. {
  189. var userMenus = await UserNavigationManager.GetMenusAsync(AbpSession.ToUserIdentifier());
  190. return new AbpUserNavConfigDto
  191. {
  192. Menus = userMenus.ToDictionary(userMenu => userMenu.Name, userMenu => userMenu)
  193. };
  194. }
  195. protected virtual async Task<AbpUserSettingConfigDto> GetUserSettingConfig()
  196. {
  197. var config = new AbpUserSettingConfigDto
  198. {
  199. Values = new Dictionary<string, string>()
  200. };
  201. var settingDefinitions = SettingDefinitionManager
  202. .GetAllSettingDefinitions();
  203. using (var scope = _iocResolver.CreateScope())
  204. {
  205. foreach (var settingDefinition in settingDefinitions)
  206. {
  207. if (!await settingDefinition.ClientVisibilityProvider.CheckVisible(scope))
  208. {
  209. continue;
  210. }
  211. var settingValue = await SettingManager.GetSettingValueAsync(settingDefinition.Name);
  212. config.Values.Add(settingDefinition.Name, settingValue);
  213. }
  214. }
  215. return config;
  216. }
  217. protected virtual AbpUserClockConfigDto GetUserClockConfig()
  218. {
  219. return new AbpUserClockConfigDto
  220. {
  221. Provider = Clock.Provider.GetType().Name.ToCamelCase()
  222. };
  223. }
  224. protected virtual async Task<AbpUserTimingConfigDto> GetUserTimingConfig()
  225. {
  226. var timezoneId = await SettingManager.GetSettingValueAsync(TimingSettingNames.TimeZone);
  227. var timezone = TimezoneHelper.FindTimeZoneInfo(timezoneId);
  228. return new AbpUserTimingConfigDto
  229. {
  230. TimeZoneInfo = new AbpUserTimeZoneConfigDto
  231. {
  232. Windows = new AbpUserWindowsTimeZoneConfigDto
  233. {
  234. TimeZoneId = timezoneId,
  235. BaseUtcOffsetInMilliseconds = timezone.BaseUtcOffset.TotalMilliseconds,
  236. CurrentUtcOffsetInMilliseconds = timezone.GetUtcOffset(Clock.Now).TotalMilliseconds,
  237. IsDaylightSavingTimeNow = timezone.IsDaylightSavingTime(Clock.Now)
  238. },
  239. Iana = new AbpUserIanaTimeZoneConfigDto
  240. {
  241. TimeZoneId = TimezoneHelper.WindowsToIana(timezoneId)
  242. }
  243. }
  244. };
  245. }
  246. protected virtual AbpUserSecurityConfigDto GetUserSecurityConfig()
  247. {
  248. return new AbpUserSecurityConfigDto
  249. {
  250. AntiForgery = new AbpUserAntiForgeryConfigDto
  251. {
  252. TokenCookieName = AbpAntiForgeryConfiguration.TokenCookieName,
  253. TokenHeaderName = AbpAntiForgeryConfiguration.TokenHeaderName
  254. }
  255. };
  256. }
  257. }
  258. }