예제 #1
0
        // Constructor

        public PermissionsController(ApplicationContext db, ILogger <PermissionsController> logger,
                                     IStringLocalizer <PermissionsController> localizer, IMapper mapper, ITenantUserInfoAccessor tenantInfo)
        {
            _db         = db;
            _logger     = logger;
            _tenantInfo = tenantInfo;
        }
예제 #2
0
 public DynamicModelMetadataProvider(ICompositeMetadataDetailsProvider detailsProvider, IOptions <MvcOptions> optionsAccessor,
                                     IHttpContextAccessor contextAccessor, ITenantUserInfoAccessor tenantInfo, IStringLocalizer <DynamicModelMetadataProvider> localizer) : base(detailsProvider, optionsAccessor)
 {
     _contextAccessor = contextAccessor;
     _tenantInfo      = tenantInfo;
     _localizer       = localizer;
 }
예제 #3
0
 public ViewsController(ApplicationContext db, IModelMetadataProvider metadataProvider, ILogger <ViewsController> logger,
                        IStringLocalizer <ViewsController> localizer, IMapper mapper, ITenantUserInfoAccessor accessor) : base(logger, localizer, mapper)
 {
     _db = db;
     _metadataProvider = metadataProvider;
     _logger           = logger;
     _localizer        = localizer;
     _mapper           = mapper;
     _accessor         = accessor;
 }
예제 #4
0
        // Constructor

        public SettingsController(ApplicationContext db, ILogger <SettingsController> logger,
                                  IStringLocalizer <SettingsController> localizer, IMapper mapper, ITenantUserInfoAccessor tenantInfo)
        {
            _db           = db;
            _logger       = logger;
            _localizer    = localizer;
            _mapper       = mapper;
            _tenantInfo   = tenantInfo;
            _culturesRepo = new CulturesRepository();
        }
예제 #5
0
        public RolesController(ILogger <RolesController> logger,
                               IStringLocalizer <RolesController> localizer, IServiceProvider serviceProvider, ITenantUserInfoAccessor tenantInfoAccessor) : base(logger, localizer, serviceProvider)
        {
            _db = serviceProvider.GetRequiredService <ApplicationContext>();
            _metadataProvider   = serviceProvider.GetRequiredService <IModelMetadataProvider>();
            _tenantInfoAccessor = serviceProvider.GetRequiredService <ITenantUserInfoAccessor>();

            _logger    = logger;
            _localizer = localizer;
        }
예제 #6
0
        // Constructor

        public SettingsController(ApplicationContext db, ILogger <SettingsController> logger, IGlobalSettingsCache globalSettingsCache,
                                  IStringLocalizer <SettingsController> localizer, IMapper mapper, ITenantUserInfoAccessor tenantInfo)
        {
            _db     = db;
            _logger = logger;
            _globalSettingsCache = globalSettingsCache;
            _localizer           = localizer;
            _mapper     = mapper;
            _tenantInfo = tenantInfo;
        }
예제 #7
0
 public AgentsController(ApplicationContext db, IModelMetadataProvider metadataProvider, ILogger <AgentsController> logger,
                         IStringLocalizer <AgentsController> localizer, IMapper mapper, ITenantUserInfoAccessor tenantInfo) : base(logger, localizer, mapper)
 {
     _db = db;
     _metadataProvider = metadataProvider;
     _logger           = logger;
     _localizer        = localizer;
     _mapper           = mapper;
     _tenantInfo       = tenantInfo;
 }
예제 #8
0
        public ViewsRepository(ApplicationContext db, IStringLocalizer localizer, ITenantUserInfoAccessor accessor)
        {
            _db = db;

            // Initialize localizer 1 and localizer 2 based on the company languages
            var tenantInfo = accessor.GetCurrentInfo();

            _localizer = localizer.WithCulture(new CultureInfo(tenantInfo.PrimaryLanguageId));
            if (tenantInfo.SecondaryLanguageId != null)
            {
                _localizer2 = localizer.WithCulture(new CultureInfo(tenantInfo.SecondaryLanguageId)); // TODO
            }
        }
예제 #9
0
 public LocalUsersController(ApplicationContext db, AdminContext adminDb,
                             IModelMetadataProvider metadataProvider, ILogger <LocalUsersController> logger,
                             IStringLocalizer <LocalUsersController> localizer, IMapper mapper, ITenantIdProvider tenantIdProvider,
                             ITenantUserInfoAccessor tenantInfo, IBlobService blobService) : base(logger, localizer, mapper)
 {
     _db               = db;
     _adminDb          = adminDb;
     _tenantIdProvider = tenantIdProvider;
     _metadataProvider = metadataProvider;
     _logger           = logger;
     _localizer        = localizer;
     _mapper           = mapper;
     _tenantInfo       = tenantInfo;
     _blobService      = blobService;
 }
예제 #10
0
        /// <summary>
        /// This trick makes it possible to injected the ApplicationContext into other components via DI as usual
        /// but it automatically configures itself with the correct options. Inspired from this Microsoft sample: https://bit.ly/2TIEFMA
        /// </summary>
        /// <param name="shardResolver">The service that resolves the shard connection string</param>
        /// <param name="tenantIdProvider">The service that retrieves tenants Ids from the headers</param>
        /// <returns></returns>
        private static DbContextOptions <ApplicationContext> CreateDbContextOptions(
            IShardResolver shardResolver, ITenantIdProvider tenantIdProvider,
            IUserProvider userService, ITenantUserInfoAccessor accessor)
        {
            // Prepare the options based on the connection created with the shard manager
            var    optionsBuilder   = new DbContextOptionsBuilder <ApplicationContext>();
            string connectionString = shardResolver.GetShardConnectionString();

            if (tenantIdProvider is DesignTimeTenantIdProvider)
            {
                // Only for design time when running "ef migrations" command from the CLI
                optionsBuilder = optionsBuilder.UseSqlServer(connectionString);
            }
            else
            {
                int tenantId = tenantIdProvider.GetTenantId() ?? throw new Controllers.Misc.BadRequestException("Tenant Id was not supplied");

                // Unless this is a fake design time resolver, apply row level security and pass context info
                SqlConnection sqlConnection = new SqlConnection(connectionString);

                SqlCommand cmd = sqlConnection.CreateCommand();
                cmd.CommandText = @"
    -- Set the global values of the session context
    EXEC sp_set_session_context @key=N'TenantId', @value=@TenantId;
    EXEC sp_set_session_context @key=N'Culture', @value=@Culture;
    EXEC sp_set_session_context @key=N'NeutralCulture', @value=@NeutralCulture;

    -- Get the User Id
    DECLARE 
        @UserId INT, 
        @ExternalId NVARCHAR(450), 
        @Email NVARCHAR(255), 
        @SettingsVersion UNIQUEIDENTIFIER, 
        @PermissionsVersion UNIQUEIDENTIFIER,
        @ViewsAndSpecsVersion UNIQUEIDENTIFIER,
        @UserSettingsVersion UNIQUEIDENTIFIER,
        @PrimaryLanguageId NVARCHAR(255),
        @PrimaryLanguageSymbol NVARCHAR(255),
        @SecondaryLanguageId NVARCHAR(255),
        @SecondaryLanguageSymbol NVARCHAR(255)
;

    SELECT
        @UserId = Id,
        @ExternalId = ExternalId,
        @Email = Email,
        @PermissionsVersion = PermissionsVersion,
        @UserSettingsVersion = UserSettingsVersion
    FROM [dbo].[LocalUsers] 
    WHERE TenantId = @TenantId AND IsActive = 1 AND (ExternalId = @ExternalUserId OR Email = @UserEmail);

    -- Set LastAccess (Works only if @UserId IS NOT NULL)
    UPDATE [dbo].[LocalUsers] SET LastAccess = SYSDATETIMEOFFSET() WHERE Id = @UserId;

    -- Get hashes
    SELECT 
        @SettingsVersion = SettingsVersion,
        @ViewsAndSpecsVersion = ViewsAndSpecsVersion,
        @PrimaryLanguageId = PrimaryLanguageId,
        @PrimaryLanguageSymbol = PrimaryLanguageSymbol,
        @SecondaryLanguageId = SecondaryLanguageId,
        @SecondaryLanguageSymbol = SecondaryLanguageSymbol
    FROM [dbo].[Settings]
    WHERE TenantId = @TenantId 

    -- Set the User Id
    EXEC sp_set_session_context @key=N'UserId', @value=@UserId;

    -- Return the user information
    SELECT 
        @UserId AS userId, 
        @ExternalId AS ExternalId, 
        @Email AS Email, 
        @SettingsVersion AS SettingsVersion, 
        @PermissionsVersion AS PermissionsVersion,
        @UserSettingsVersion AS UserSettingsVersion,
        @ViewsAndSpecsVersion AS ViewsAndSpecsVersion,
        @PrimaryLanguageId AS PrimaryLanguageId,
        @PrimaryLanguageSymbol AS PrimaryLanguageSymbol,
        @SecondaryLanguageId AS SecondaryLanguageId,
        @SecondaryLanguageSymbol AS SecondaryLanguageSymbol;
";
                cmd.Parameters.AddWithValue("@TenantId", tenantId);
                cmd.Parameters.AddWithValue("@ExternalUserId", userService.GetUserId());
                cmd.Parameters.AddWithValue("@UserEmail", userService.GetUserEmail());
                cmd.Parameters.AddWithValue("@Culture", CultureInfo.CurrentUICulture.Name);
                cmd.Parameters.AddWithValue("@NeutralCulture", CultureInfo.CurrentUICulture.IsNeutralCulture ? CultureInfo.CurrentUICulture.Name : CultureInfo.CurrentUICulture.Parent.Name);

                sqlConnection.Open();
                using (var reader = cmd.ExecuteReader())
                {
                    if (reader.Read())
                    {
                        int i    = 0;
                        var info = new TenantUserInfo
                        {
                            UserId                  = reader.IsDBNull(i) ? (int?)null : reader.GetInt32(i++),
                            ExternalId              = reader.IsDBNull(i) ? null : reader.GetString(i++),
                            Email                   = reader.IsDBNull(i) ? null : reader.GetString(i++),
                            SettingsVersion         = reader.IsDBNull(i) ? null : reader.GetGuid(i++).ToString(),
                            PermissionsVersion      = reader.IsDBNull(i) ? null : reader.GetGuid(i++).ToString(),
                            UserSettingsVersion     = reader.IsDBNull(i) ? null : reader.GetGuid(i++).ToString(),
                            ViewsAndSpecsVersion    = reader.IsDBNull(i) ? null : reader.GetGuid(i++).ToString(),
                            PrimaryLanguageId       = reader.IsDBNull(i) ? null : reader.GetString(i++),
                            PrimaryLanguageSymbol   = reader.IsDBNull(i) ? null : reader.GetString(i++),
                            SecondaryLanguageId     = reader.IsDBNull(i) ? null : reader.GetString(i++),
                            SecondaryLanguageSymbol = reader.IsDBNull(i) ? null : reader.GetString(i++),
                        };

                        // Provide the user throughout the current session
                        accessor.SetInfo(tenantId, info);
                    }
                    else
                    {
                        throw new Controllers.Misc.BadRequestException("Something went wrong while querying the user ID from the Database");
                    }
                }

                // Prepare the options based on the connection created with the shard manager
                optionsBuilder = optionsBuilder.UseSqlServer(sqlConnection);
            }

            return(optionsBuilder
                   .ReplaceService <IMigrationsSqlGenerator, CustomSqlServerMigrationsSqlGenerator>()
                   .Options);
        }
예제 #11
0
 // Constructor
 public ApplicationContext(IShardResolver shardProvider, ITenantIdProvider tenantIdProvider, IUserProvider userIdProvider, ITenantUserInfoAccessor accessor) :
     base(CreateDbContextOptions(shardProvider, tenantIdProvider, userIdProvider, accessor))
 {
     _tenantIdProvider = tenantIdProvider;
 }
예제 #12
0
 /// <summary>
 /// Returns the internal user Id of the currently signed in user according to the tenant database
 /// </summary>
 public static int UserId(this ITenantUserInfoAccessor @this)
 {
     return(@this.GetCurrentInfo().UserId.Value);
 }
예제 #13
0
 public FilterParser(ITenantUserInfoAccessor info)
 {
     _info = info;
 }