コード例 #1
0
ファイル: TenantRepository.cs プロジェクト: adkl/nsi
        /// <summary>
        /// Update Tenant
        /// </summary>
        /// <param name="tenant"></param>
        /// <returns></returns>
        public void Update(TenantDomain tenant)
        {
            var tenantDb = _context.Tenant.FirstOrDefault(x => x.TenantId == tenant.Id);

            tenantDb.FromDomainModel(tenant);
            _context.SaveChanges();
        }
コード例 #2
0
        public TenantDomains RemoveTenantDomain(TenantDomain tenantDomain, bool secureUrls)
        {
            ValidateTenant(tenantDomain.TenantUid);

            var tenantHome = nodeHelper.GetTenantRoot(tenantDomain.TenantUid);
            var domains    = nodeHelper.GetTenantDomains(tenantDomain.TenantUid);

            if (domains.AlternateDomains == null)
            {
                throw new TenantException(ExceptionCode.DomainDoesNotExist.CodeToString(), ExceptionCode.DomainDoesNotExist, tenantDomain.TenantUid, tenantDomain.Domain);
            }
            if (domains.AlternateDomains.SingleOrDefault(x => x == tenantDomain.Domain) == null)
            {
                throw new TenantException(ExceptionCode.DomainDoesNotExist.CodeToString(), ExceptionCode.DomainDoesNotExist, tenantDomain.TenantUid, tenantDomain.Domain);
            }

            var domainList = nodeHelper.GetTenantDomainsString(tenantDomain.TenantUid);

            domainList = domainList.Replace($"{tenantDomain.Domain}", string.Empty);
            var array = domainList.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

            domainList = string.Join(",", array);
            nodeHelper.SetNodeContent(tenantHome, "alternateDomains", domainList, false);
            nodeHelper.SaveNode(tenantHome);

            languageDictionaryService.RemoveCultureAndHostname(tenantDomain, secureUrls);
            nodeHelper.TryPublishSite(tenantHome.Id);

            return(nodeHelper.GetTenantDomains(tenantDomain.TenantUid));
        }
コード例 #3
0
        public JsonRpcResponseData RemoveTenantDomain(TenantDomain payload, ApiAuthorization authorization)
        {
            SetupAuth();
            IsValidRequest(authorization.AppId, authorization.ApiKey);
            var apiController = new ControllerService();

            try
            {
                var tenantDomains = apiController.RemoveTenantDomain(payload);
                return(new JsonRpcResponseData
                {
                    Message = $"Domain {payload.Domain} for Tenant {payload.TenantUid} has been removed",
                    Status = JsonRpcResponseData.OK,
                    TenantUid = payload.TenantUid,
                    Data = new
                    {
                        tenantDomains
                    }
                });
            }
            catch (System.Exception ex)
            {
                throw HandleException(ex);
            }
        }
コード例 #4
0
        public TenantDomains AddTenantDomain(TenantDomain tenantDomain, bool setupLocalUrls, bool secureUrls)
        {
            ValidateTenant(tenantDomain.TenantUid);

            var tenantHome = nodeHelper.GetTenantRoot(tenantDomain.TenantUid);

            string domainList = nodeHelper.GetTenantDomainsString(tenantDomain.TenantUid);

            if (tenantDomain.isPrimary)
            {
                nodeHelper.SetNodeContent(tenantHome, "domain", tenantDomain.Domain, false);
                nodeHelper.SaveNode(tenantHome);

                languageDictionaryService.AddCultureAndHostnameDomain(tenantDomain, secureUrls);
                nodeHelper.TryPublishSite(tenantHome.Id);
                return(nodeHelper.GetTenantDomains(tenantDomain.TenantUid));
            }

            if (DomainAlreadyExists(tenantDomain.TenantUid, tenantDomain.Domain))
            {
                throw new TenantException(ExceptionCode.DomainAlreadyAssigned.CodeToString(), ExceptionCode.DomainAlreadyAssigned, tenantDomain.TenantUid, tenantDomain.Domain);
            }

            domainList += string.IsNullOrEmpty(domainList) ? tenantDomain.Domain : $",{tenantDomain.Domain}";
            nodeHelper.SetNodeContent(tenantHome, "alternateDomains", domainList, false);
            nodeHelper.SaveNode(tenantHome);

            languageDictionaryService.AddCultureAndHostnameDomain(tenantDomain, secureUrls);
            nodeHelper.TryPublishSite(tenantHome.Id);

            return(nodeHelper.GetTenantDomains(tenantDomain.TenantUid));
        }
コード例 #5
0
ファイル: TenantRepository.cs プロジェクト: adkl/nsi
        /// <summary>
        /// Adds new tenant to the database
        /// </summary>
        /// <param name="tenant">Tenant information to be added. Instance of <see cref="TenantDomain"/></param>
        /// <returns>TenantId of the newly created tenant</returns>
        public int Add(TenantDomain tenant)
        {
            var tenantDb = new Tenant().FromDomainModel(tenant);

            _context.Tenant.Add(tenantDb);
            _context.SaveChanges();
            return(tenantDb.TenantId);
        }
コード例 #6
0
ファイル: TenantManipulation.cs プロジェクト: adkl/nsi
 private void ValidateTenantModel(TenantDomain tenant)
 {
     ValidationHelper.NotNull(tenant, MembershipMessages.TenantNotProvided);
     ValidationHelper.GreaterThanZero(tenant.DefaultLanguageId, MembershipMessages.LanguageIdInvalid);
     ValidationHelper.NotNull(_languageRepository.GetById(tenant.DefaultLanguageId), MembershipMessages.LanguageWithIdDoesNotExist);
     ValidationHelper.MaxLength(tenant.Name, 100, MembershipMessages.TenantNameLengthExceeded);
     ValidationHelper.NotNullOrWhitespace(tenant.Name, MembershipMessages.TenantNameInvalid);
 }
コード例 #7
0
ファイル: TenantManipulation.cs プロジェクト: adkl/nsi
        /// <summary>
        /// Update Tenant
        /// </summary>
        /// <param name="tenant"></param>
        /// <returns></returns>
        public void UpdateTenant(TenantDomain tenant)
        {
            ValidateTenantModel(tenant);
            ValidationHelper.GreaterThanZero(tenant.Id, MembershipMessages.TenantIdInvalid);
            ValidationHelper.NotNull(_tenantRepository.GetById(tenant.Id), MembershipMessages.TenantWithIdDoesNotExist);


            _tenantRepository.Update(tenant);
        }
コード例 #8
0
        public void AddTenant_Fail_NameInvalid()
        {
            TenantDomain tenant = new TenantDomain()
            {
                Name = "",
                DefaultLanguageId = 1,
                IsActive          = true,
                Id = 1
            };

            _tenantManipulation.AddTenant(tenant);
        }
コード例 #9
0
        public void AddTenant_Fail_NameLengthExceeded()
        {
            TenantDomain tenant = new TenantDomain()
            {
                Name = "LejlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLejlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
                DefaultLanguageId = 1,
                IsActive          = true,
                Id = 1
            };

            _tenantManipulation.AddTenant(tenant);
        }
コード例 #10
0
        public void AddCultureAndHostname(TenantDomain tenant, bool secureUrl)
        {
            const string protocolBase = "http";
            var          protocol     = secureUrl ? $"{protocolBase}s" : protocolBase;

            try
            {
                var tenantRoot = nodeHelper.GetTenantRoot(tenant.TenantUid);
                var languages  = localizationService.GetAllLanguages();
                var subDomain  = tenantRoot.GetValue <string>("subDomain");

                string domainName     = $"{protocol}://{subDomain}.{tenant.Domain}/";
                var    existingDomain = domainService.GetByName(domainName);
                if (Uri.IsWellFormedUriString(domainName, UriKind.RelativeOrAbsolute))
                {
                    if (existingDomain == null)
                    {
                        var defaultLanguageId = localizationService.GetDefaultLanguageId();
                        existingDomain = new UmbracoDomain(domainName)
                        {
                            LanguageId    = defaultLanguageId,
                            RootContentId = tenantRoot.Id
                        };

                        domainService.Save(existingDomain);
                        ConnectorContext.AuditService.Add(AuditType.New, -1, existingDomain.Id, "Language", $"Domain '{domainName}' for Tenant '{tenant.TenantUid}' has been created");
                    }

                    foreach (var language in languages)
                    {
                        var localizedDomainName = $"{domainName}{language.IsoCode}";
                        var localizedDomain     = domainService.GetByName(localizedDomainName);
                        if (localizedDomain == null)
                        {
                            localizedDomain = new UmbracoDomain(localizedDomainName)
                            {
                                LanguageId    = language.Id,
                                RootContentId = tenantRoot.Id
                            };
                            domainService.Save(localizedDomain);
                            ConnectorContext.AuditService.Add(AuditType.New, -1, existingDomain.Id, "Language", $"Domain '{localizedDomainName}' for Tenant '{tenant.TenantUid}' has been created");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error(typeof(LanguageDictionaryService), ex.Message);
                logger.Error(typeof(LanguageDictionaryService), ex.StackTrace);
                throw;
            }
        }
コード例 #11
0
ファイル: TenantManipulation.cs プロジェクト: adkl/nsi
        /// <summary>
        /// Adds new tenant to the database
        /// </summary>
        /// <param name="tenant">Tenant information to be added. Instance of <see cref="TenantDomain"/></param>
        /// <returns>TenantId of the newly created tenant</returns>
        public int AddTenant(TenantDomain tenant)
        {
            ValidateTenantModel(tenant);
            tenant.Identifier = Guid.NewGuid();
            // Check if identifier exists
            var tenantWithProvidedIdentifier = _tenantRepository.GetByIdentifier(tenant.Identifier);

            if (tenantWithProvidedIdentifier != null)
            {
                throw new NsiArgumentException(MembershipMessages.TenantIdentifierAlreadyExists, Common.Enumerations.SeverityEnum.Warning);
            }

            return(_tenantRepository.Add(tenant));
        }
コード例 #12
0
        public static Tenant FromDomainModel(this Tenant obj, TenantDomain domain)
        {
            if (obj == null)
            {
                obj = new Tenant();
            }

            obj.TenantId   = domain.Id;
            obj.Name       = domain.Name;
            obj.Identifier = domain.Identifier;
            obj.LanguageId = domain.DefaultLanguageId;
            obj.IsActive   = domain.IsActive;

            return(obj);
        }
コード例 #13
0
        public IHttpActionResult AddTenant(AddTenantRequest request)
        {
            request.ValidateNotNull();
            TenantDomain tenantDomain = new TenantDomain()
            {
                //Identifier = request.Identifier,
                Name              = request.Name,
                IsActive          = request.IsActive,
                DefaultLanguageId = request.DefaultLanguageId
            };

            return(Ok(new AddTenantResponse()
            {
                Data = _tenantManipulation.AddTenant(tenantDomain),
                Success = Common.Enumerations.ResponseStatus.Succeeded
            }));
        }
コード例 #14
0
        public IHttpActionResult UpdateTenant(UpdateTenantRequest request)
        {
            request.ValidateNotNull();
            TenantDomain tenantDomain = _tenantManipulation.GetTenantById(request.Id);

            if (tenantDomain == null)
            {
                return(NotFound());
            }

            tenantDomain.Name              = request.Name;
            tenantDomain.IsActive          = request.IsActive;
            tenantDomain.DefaultLanguageId = request.DefaultLanguageId;

            _tenantManipulation.UpdateTenant(tenantDomain);

            return(Ok(new UpdateTenantResponse()
            {
                Success = Common.Enumerations.ResponseStatus.Succeeded
            }));
        }
コード例 #15
0
        public void RemoveCultureAndHostname(TenantDomain tenant, bool secureUrl)
        {
            const string protocolBase = "http";
            var          protocol     = secureUrl ? $"{protocolBase}s" : protocolBase;

            try
            {
                var tenantRoot = nodeHelper.GetTenantRoot(tenant.TenantUid);
                var languages  = localizationService.GetAllLanguages();
                //var subDomain = tenantRoot.GetValue<string>("subDomain");

                string domainName     = $"{protocol}://{tenant.Domain}/";
                var    existingDomain = domainService.GetByName(domainName);

                if (existingDomain != null)
                {
                    domainService.Delete(existingDomain);
                    ConnectorContext.AuditService.Add(AuditType.Delete, -1, existingDomain.Id, "Language", $"Domain '{domainName}' for Tenant '{tenant.TenantUid}' has been deleted");
                }

                foreach (var language in languages)
                {
                    var localizedDomainName = $"{domainName}{language.IsoCode}";
                    var localizedDomain     = domainService.GetByName(localizedDomainName);
                    if (localizedDomain != null)
                    {
                        domainService.Delete(localizedDomain);
                        ConnectorContext.AuditService.Add(AuditType.Delete, -1, localizedDomain.Id, "Language", $"Domain '{localizedDomainName}' for Tenant '{tenant.TenantUid}' has been deleted");
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error(typeof(LanguageDictionaryService), ex.Message);
                logger.Error(typeof(LanguageDictionaryService), ex.StackTrace);
                throw;
            }
        }
コード例 #16
0
 public TenantDomains RemoveTenantDomain(TenantDomain payload)
 {
     return(homeNode.RemoveTenantDomain(payload, SecureUrls));
 }
コード例 #17
0
        public void GetTenantById_Success()
        {
            TenantDomain tenant = _tenantManipulation.GetTenantById(1);

            Assert.AreEqual(1, tenant.Id);
        }
コード例 #18
0
        public void GetModuleByIdentifier_Success()
        {
            TenantDomain tenant = _tenantManipulation.GetTenantByIdentifier(Guid.Parse("81a130d2-502f-4cf1-a376-63edeb000e9f"));

            Assert.AreEqual(Guid.Parse("81a130d2-502f-4cf1-a376-63edeb000e9f"), tenant.Identifier);
        }
コード例 #19
0
 public TenantDomains AddTenantDomain(TenantDomain payload)
 {
     return(homeNode.AddTenantDomain(payload, SetupLocalUrls, SecureUrls));
 }
コード例 #20
0
        public void AddCultureAndHostnameDomain(TenantDomain tenant, bool secureUrl)
        {
            const string protocolBase = "http";
            var          protocol     = secureUrl ? $"{protocolBase}s" : protocolBase;

            try
            {
                var tenantRoot = nodeHelper.GetTenantRoot(tenant.TenantUid);
                var languages  = localizationService.GetAllLanguages();
                var subDomain  = tenantRoot.GetValue <string>("subDomain");

                var tenantHome = nodeHelper.GetTenantRoot(tenant.TenantUid);
                var domains    = nodeHelper.GetTenantDomains(tenant.TenantUid);


                string[] langs = new string[] { };
                if (tenantRoot.HasProperty("languages") && tenantRoot.GetValue("languages") != null)
                {
                    var languages_val = tenantRoot.GetValue("languages").ToString();
                    if (languages_val.Contains(","))
                    {
                        langs = languages_val.Split(',');
                    }
                    else
                    {
                        langs = new string[] { languages_val };
                    }
                }
                string defaultLang = tenantRoot.GetValue("defaultLanguage").ToString();

                string domainName     = $"{protocol}://{tenant.Domain}/";
                var    existingDomain = domainService.GetByName(domainName);
                if (Uri.IsWellFormedUriString(domainName, UriKind.RelativeOrAbsolute))
                {
                    if (existingDomain == null)
                    {
                        var defaultLanguageId = localizationService.GetLanguageIdByIsoCode(defaultLang);
                        existingDomain = new UmbracoDomain(domainName)
                        {
                            LanguageId    = defaultLanguageId,
                            RootContentId = tenantRoot.Id
                        };

                        domainService.Save(existingDomain);
                        ConnectorContext.AuditService.Add(AuditType.New, -1, existingDomain.Id, "Language", $"Domain '{domainName}' for Tenant '{tenant.TenantUid}' has been created");
                    }

                    foreach (var language in languages)
                    {
                        if (langs.Contains(language.IsoCode))
                        {
                            var localizedDomainName = $"{domainName}{language.IsoCode}";
                            var localizedDomain     = domainService.GetByName(localizedDomainName);
                            if (localizedDomain == null)
                            {
                                localizedDomain = new UmbracoDomain(localizedDomainName)
                                {
                                    LanguageId    = language.Id,
                                    RootContentId = tenantRoot.Id
                                };
                                domainService.Save(localizedDomain);
                                ConnectorContext.AuditService.Add(AuditType.New, -1, existingDomain.Id, "Language", $"Domain '{localizedDomainName}' for Tenant '{tenant.TenantUid}' has been created");
                            }
                        }
                    }
                }

                string domainWWW         = $"{protocol}://www.{tenant.Domain}/";
                var    existingDomainWWW = domainService.GetByName(domainWWW);
                if (Uri.IsWellFormedUriString(domainWWW, UriKind.RelativeOrAbsolute))
                {
                    if (existingDomainWWW == null)
                    {
                        var defaultLanguageId = localizationService.GetLanguageIdByIsoCode(defaultLang);
                        existingDomainWWW = new UmbracoDomain(domainWWW)
                        {
                            LanguageId    = defaultLanguageId,
                            RootContentId = tenantRoot.Id
                        };

                        domainService.Save(existingDomainWWW);
                        ConnectorContext.AuditService.Add(AuditType.New, -1, existingDomainWWW.Id, "Language", $"Domain '{domainWWW}' for Tenant '{tenant.TenantUid}' has been created");
                    }

                    foreach (var language in languages)
                    {
                        if (langs.Contains(language.IsoCode))
                        {
                            var localizedDomainName = $"{domainWWW}{language.IsoCode}";
                            var localizedDomain     = domainService.GetByName(localizedDomainName);
                            if (localizedDomain == null)
                            {
                                localizedDomain = new UmbracoDomain(localizedDomainName)
                                {
                                    LanguageId    = language.Id,
                                    RootContentId = tenantRoot.Id
                                };
                                domainService.Save(localizedDomain);
                                ConnectorContext.AuditService.Add(AuditType.New, -1, existingDomainWWW.Id, "Language", $"Domain '{localizedDomainName}' for Tenant '{tenant.TenantUid}' has been created");
                            }
                        }
                    }
                }

                string domainSubdomain         = $"{protocol}://{subDomain}.{tenant.Domain}/";
                var    existingDomainSubdomain = domainService.GetByName(domainSubdomain);
                if (Uri.IsWellFormedUriString(domainSubdomain, UriKind.RelativeOrAbsolute))
                {
                    if (existingDomainSubdomain == null)
                    {
                        var defaultLanguageId = localizationService.GetLanguageIdByIsoCode(defaultLang);
                        existingDomainSubdomain = new UmbracoDomain(domainSubdomain)
                        {
                            LanguageId    = defaultLanguageId,
                            RootContentId = tenantRoot.Id
                        };

                        domainService.Save(existingDomainSubdomain);
                        ConnectorContext.AuditService.Add(AuditType.New, -1, existingDomainSubdomain.Id, "Language", $"Domain '{domainSubdomain}' for Tenant '{tenant.TenantUid}' has been created");
                    }

                    foreach (var language in languages)
                    {
                        if (langs.Contains(language.IsoCode))
                        {
                            var localizedDomainName = $"{domainSubdomain}{language.IsoCode}";
                            var localizedDomain     = domainService.GetByName(localizedDomainName);
                            if (localizedDomain == null)
                            {
                                localizedDomain = new UmbracoDomain(localizedDomainName)
                                {
                                    LanguageId    = language.Id,
                                    RootContentId = tenantRoot.Id
                                };
                                domainService.Save(localizedDomain);
                                ConnectorContext.AuditService.Add(AuditType.New, -1, existingDomainSubdomain.Id, "Language", $"Domain '{localizedDomainName}' for Tenant '{tenant.TenantUid}' has been created");
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error(typeof(LanguageDictionaryService), ex.Message);
                logger.Error(typeof(LanguageDictionaryService), ex.StackTrace);
                throw;
            }
        }
コード例 #21
0
        static void Main(string[] args)
        {
            //****************************************
            //The EFDAL project is generated
            //The Installer project is generated
            //Teh API project is hand written containing a few utilities to create tenants
            //The Console app

            //For now this will store the tenant ID in a variable.
            //In production you would use a session variable or some other login management technique.
            var tenant1Id = 0;
            var tenant2Id = 0;

            //Connect to the database with the master connection string
            //There is no tenant information in this connection string
            using (var context = new MultiTenantEntities(DatabaseHelper.MasterConnectionString))
            {
                var tenant1Name = "Tenant1";
                var tenant2Name = "Tenant2";

                #region Create Tenants IF EMPTY
                if (!context.TenantMaster.Any())
                {
                    //Create Tenant 1
                    TenantDomain.CreateTenant(tenant1Name);
                    Console.WriteLine($"Created {tenant1Name}");

                    //Create Tenant 2
                    TenantDomain.CreateTenant(tenant2Name);
                    Console.WriteLine($"Created {tenant2Name}");
                }
                #endregion

                //Pull each Tenant ID from the database for testing
                tenant1Id = context.TenantMaster.FirstOrDefault(x => x.TenantName == tenant1Name).TenantId;
                tenant2Id = context.TenantMaster.FirstOrDefault(x => x.TenantName == tenant2Name).TenantId;
            }

            //Now connect with the connection string for Tenant1
            using (var context = new MultiTenantEntities(DatabaseHelper.GetTenantConnectionString(tenant1Id)))
            {
                //Add "Project 1" through "Project 10"
                for (var ii = 1; ii <= 10; ii++)
                {
                    var newProject = new Project
                    {
                        Name             = $"Project {ii}",
                        ProjectTypeValue = ProjectTypeConstants.CSharp
                    };
                    context.AddItem(newProject);
                }
                context.SaveChanges();
            }

            //Now connect with the connection string for Tenant2
            using (var context = new MultiTenantEntities(DatabaseHelper.GetTenantConnectionString(tenant2Id)))
            {
                //Add "Project 11" through "Project 20"
                for (var ii = 11; ii <= 20; ii++)
                {
                    var newProject = new Project
                    {
                        Name             = $"Project {ii}",
                        ProjectTypeValue = ProjectTypeConstants.Java
                    };
                    context.AddItem(newProject);
                }
                context.SaveChanges();
            }

            //Now select ALL Projects using the Tenant1 connection string
            using (var context = new MultiTenantEntities(DatabaseHelper.GetTenantConnectionString(tenant1Id)))
            {
                var list = context.Project.ToList();
                Console.WriteLine($"Tenant 1 Project Count={list.Count}");
                foreach (var item in list)
                {
                    Console.WriteLine($"Tenant 1, Project ={item.Name}");
                }

                //Notice that there are only 10 items even with no Where clause
                //The framework limits the selection to only items for Tenant 1.
                //There is never any data leak between tenants
            }

            //Now select ALL Projects using the Tenant2 connection string
            using (var context = new MultiTenantEntities(DatabaseHelper.GetTenantConnectionString(tenant2Id)))
            {
                var list = context.Project.ToList();
                Console.WriteLine($"Tenant 2 Project Count={list.Count}");
                foreach (var item in list)
                {
                    Console.WriteLine($"Tenant 2, Project ={item.Name}");
                }

                //Notice that there are only 10 items even with no Where clause
                //The framework limits the selection to only items for Tenant 2.
                //There is never any data leak between tenants
            }
        }