Prevented creation of circular fall-back language paths. Allowed for update to no fall-back language.

This commit is contained in:
AndyButland
2018-07-06 15:51:13 +02:00
parent 53e96b25f6
commit 8a34ec8864
2 changed files with 35 additions and 0 deletions

View File

@@ -112,6 +112,11 @@
if (formHelper.submitForm({ scope: $scope })) {
vm.page.saveButtonState = "busy";
// Handle selection of no fall-back language (should pass null)
if (!vm.language.fallbackLanguage.id) {
vm.language.fallbackLanguage = null;
}
// We need to attach the ISO code to the fall-back language to pass
// server-side validation.
if (vm.language.fallbackLanguage) {

View File

@@ -148,6 +148,13 @@ namespace Umbraco.Web.Editors
found.Mandatory = language.Mandatory;
found.IsDefaultVariantLanguage = language.IsDefaultVariantLanguage;
AssociateFallbackLanguage(language, found);
if (UpdatedFallbackLanguageCreatesCircularPath(found))
{
ModelState.AddModelError("FallbackLanguage", "The selected fall back language '" + found.FallbackLanguage.CultureName + "' would create a circular path.");
throw new HttpResponseException(Request.CreateValidationErrorResponse(ModelState));
}
Services.LocalizationService.Save(found);
return Mapper.Map<Language>(found);
}
@@ -156,6 +163,7 @@ namespace Umbraco.Web.Editors
{
if (submittedLanguage.FallbackLanguage == null)
{
languageToCreateOrUpdate.FallbackLanguage = null;
return;
}
@@ -166,5 +174,27 @@ namespace Umbraco.Web.Editors
CultureName = fallbackLanguageCulture.DisplayName
};
}
private bool UpdatedFallbackLanguageCreatesCircularPath(ILanguage language)
{
if (language.FallbackLanguage == null)
{
return false;
}
var languages = Services.LocalizationService.GetAllLanguages().ToArray();
var fallbackLanguage = language.FallbackLanguage;
while (fallbackLanguage != null)
{
if (fallbackLanguage.Id == language.Id)
{
return true;
}
fallbackLanguage = languages.Single(x => x.Id == fallbackLanguage.Id).FallbackLanguage;
}
return false;
}
}
}