Merge branch 'netcore/feature/move-mappings-after-httpcontext' into netcore/feature/executable-backoffice

This commit is contained in:
Bjarke Berg
2020-02-20 10:16:24 +01:00
51 changed files with 555 additions and 625 deletions

View File

@@ -0,0 +1,39 @@
using System;
using System.IO;
using Umbraco.Core.IO;
namespace Umbraco.Web.Install
{
public class FilePermissionDirectoryHelper
{
// tries to create a file
// if successful, the file is deleted
// creates the directory if needed - does not delete it
public static bool TryCreateDirectory(string dir, IIOHelper ioHelper)
{
try
{
var dirPath = ioHelper.MapPath(dir);
if (Directory.Exists(dirPath) == false)
Directory.CreateDirectory(dirPath);
var filePath = dirPath + "/" + CreateRandomFileName() + ".tmp";
File.WriteAllText(filePath, "This is an Umbraco internal test file. It is safe to delete it.");
File.Delete(filePath);
return true;
}
catch
{
return false;
}
}
public static string CreateRandomFileName()
{
return "umbraco-test." + Guid.NewGuid().ToString("N").Substring(0, 8);
}
}
}

View File

@@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Umbraco.Core.Models
{
public class InstallLog
{
public Guid InstallId { get; }
public bool IsUpgrade { get; set; }
public bool InstallCompleted { get; set; }
public DateTime Timestamp { get; set; }
public int VersionMajor { get; }
public int VersionMinor { get; }
public int VersionPatch { get; }
public string VersionComment { get; }
public string Error { get; }
public string UserAgent { get; }
public string DbProvider { get; set; }
public InstallLog(Guid installId, bool isUpgrade, bool installCompleted, DateTime timestamp, int versionMajor, int versionMinor, int versionPatch, string versionComment, string error, string userAgent, string dbProvider)
{
InstallId = installId;
IsUpgrade = isUpgrade;
InstallCompleted = installCompleted;
Timestamp = timestamp;
VersionMajor = versionMajor;
VersionMinor = versionMinor;
VersionPatch = versionPatch;
VersionComment = versionComment;
Error = error;
UserAgent = userAgent;
DbProvider = dbProvider;
}
}
}

View File

@@ -0,0 +1,11 @@
using System;
using System.Threading.Tasks;
using Umbraco.Core.Models;
namespace Umbraco.Core.Persistence.Repositories
{
public interface IInstallationRepository
{
Task SaveInstallLogAsync(InstallLog installLog);
}
}

View File

@@ -0,0 +1,11 @@
using System.Threading.Tasks;
using Semver;
using Umbraco.Core.Models;
namespace Umbraco.Core.Persistence.Repositories
{
public interface IUpgradeCheckRepository
{
Task<UpgradeResult> CheckUpgradeAsync(SemVersion version);
}
}

View File

@@ -0,0 +1,36 @@
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Umbraco.Core.Models;
using Umbraco.Core.Serialization;
namespace Umbraco.Core.Persistence.Repositories.Implement
{
public class InstallationRepository : IInstallationRepository
{
private readonly IJsonSerializer _jsonSerializer;
private static HttpClient _httpClient;
private const string RestApiInstallUrl = "https://our.umbraco.com/umbraco/api/Installation/Install";
public InstallationRepository(IJsonSerializer jsonSerializer)
{
_jsonSerializer = jsonSerializer;
}
public async Task SaveInstallLogAsync(InstallLog installLog)
{
try
{
if (_httpClient == null)
_httpClient = new HttpClient();
var content = new StringContent(_jsonSerializer.Serialize(installLog), Encoding.UTF8, "application/json");
await _httpClient.PostAsync(RestApiInstallUrl, content);
}
// this occurs if the server for Our is down or cannot be reached
catch (HttpRequestException)
{ }
}
}
}

View File

@@ -0,0 +1,58 @@
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Semver;
using Umbraco.Core.Models;
using Umbraco.Core.Serialization;
namespace Umbraco.Core.Persistence.Repositories.Implement
{
public class UpgradeCheckRepository : IUpgradeCheckRepository
{
private readonly IJsonSerializer _jsonSerializer;
private static HttpClient _httpClient;
private const string RestApiUpgradeChecklUrl = "https://our.umbraco.com/umbraco/api/UpgradeCheck/CheckUpgrade";
public UpgradeCheckRepository(IJsonSerializer jsonSerializer)
{
_jsonSerializer = jsonSerializer;
}
public async Task<UpgradeResult> CheckUpgradeAsync(SemVersion version)
{
try
{
if (_httpClient == null)
_httpClient = new HttpClient();
var content = new StringContent(_jsonSerializer.Serialize(new CheckUpgradeDto(version)), Encoding.UTF8, "application/json");
var task = await _httpClient.PostAsync(RestApiUpgradeChecklUrl,content);
var json = await task.Content.ReadAsStringAsync();
var result = _jsonSerializer.Deserialize<UpgradeResult>(json);
return result ?? new UpgradeResult("None", "", "");
}
catch (HttpRequestException)
{
// this occurs if the server for Our is down or cannot be reached
return new UpgradeResult("None", "", "");
}
}
private class CheckUpgradeDto
{
public CheckUpgradeDto(SemVersion version)
{
VersionMajor = version.Major;
VersionMinor = version.Minor;
VersionPatch = version.Patch;
VersionComment = version.Prerelease;
}
public int VersionMajor { get; }
public int VersionMinor { get; }
public int VersionPatch { get; }
public string VersionComment { get; }
}
}
}

View File

@@ -0,0 +1,11 @@
using System.Threading.Tasks;
using Semver;
using Umbraco.Core.Models;
namespace Umbraco.Core.Services
{
public interface IUpgradeService
{
Task<UpgradeResult> CheckUpgrade(SemVersion version);
}
}

View File

@@ -0,0 +1,23 @@
using System.Threading.Tasks;
using Semver;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Services;
namespace Umbraco.Core
{
public class UpgradeService : IUpgradeService
{
private readonly IUpgradeCheckRepository _upgradeCheckRepository;
public UpgradeService(IUpgradeCheckRepository upgradeCheckRepository)
{
_upgradeCheckRepository = upgradeCheckRepository;
}
public async Task<UpgradeResult> CheckUpgrade(SemVersion version)
{
return await _upgradeCheckRepository.CheckUpgradeAsync(version);
}
}
}

View File

@@ -0,0 +1,16 @@
namespace Umbraco.Core.Models
{
public class UpgradeResult
{
public string UpgradeType { get; }
public string Comment { get; }
public string UpgradeUrl { get; }
public UpgradeResult(string upgradeType, string comment, string upgradeUrl)
{
UpgradeType = upgradeType;
Comment = comment;
UpgradeUrl = upgradeUrl;
}
}
}

View File

@@ -47,6 +47,8 @@ namespace Umbraco.Core.Composing.CompositionExtensions
composition.RegisterUnique<IScriptRepository, ScriptRepository>();
composition.RegisterUnique<IStylesheetRepository, StylesheetRepository>();
composition.RegisterUnique<IContentTypeCommonRepository, ContentTypeCommonRepository>();
composition.RegisterUnique<IInstallationRepository, InstallationRepository>();
composition.RegisterUnique<IUpgradeCheckRepository, UpgradeCheckRepository>();
return composition;
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using Umbraco.Core.Models.Entities;

View File

@@ -1,25 +1,24 @@
using System;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Dtos;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Services;
using Umbraco.Core.Strings;
namespace Umbraco.Core.Persistence.Factories
{
internal static class DataTypeFactory
{
public static IDataType BuildEntity(DataTypeDto dto, PropertyEditorCollection editors, ILogger logger, IIOHelper ioHelper, IDataTypeService dataTypeService, ILocalizedTextService localizedTextService, ILocalizationService localizationService, IShortStringHelper shortStringHelper)
public static IDataType BuildEntity(DataTypeDto dto, PropertyEditorCollection editors, ILogger logger)
{
// Check we have an editor for the data type.
if (!editors.TryGet(dto.EditorAlias, out var editor))
{
logger.Warn(typeof(DataType), "Could not find an editor with alias {EditorAlias}, treating as Label."
+" The site may fail to boot and / or load data types and run.", dto.EditorAlias);
//convert to label
editor = new LabelPropertyEditor(logger, ioHelper,dataTypeService , localizedTextService, localizationService, shortStringHelper);
logger.Warn(typeof(DataType), "Could not find an editor with alias {EditorAlias}, treating as Label. " +
"The site may fail to boot and/or load data types and run.", dto.EditorAlias);
// Create as special type, which downstream can be handled by converting to a LabelPropertyEditor to make clear
// the situation to the user.
editor = new MissingPropertyEditor();
}
var dataType = new DataType(editor);

View File

@@ -7,7 +7,6 @@ using NPoco;
using Umbraco.Core.Cache;
using Umbraco.Core.Events;
using Umbraco.Core.Exceptions;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Entities;
@@ -17,7 +16,6 @@ using Umbraco.Core.Persistence.Querying;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Scoping;
using Umbraco.Core.Services;
using Umbraco.Core.Strings;
using static Umbraco.Core.Persistence.SqlExtensionsStatics;
namespace Umbraco.Core.Persistence.Repositories.Implement
@@ -28,22 +26,11 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
internal class DataTypeRepository : NPocoRepositoryBase<int, IDataType>, IDataTypeRepository
{
private readonly Lazy<PropertyEditorCollection> _editors;
private readonly IIOHelper _ioHelper;
private readonly Lazy<IDataTypeService> _dataTypeService;
private readonly ILocalizedTextService _localizedTextService;
private readonly ILocalizationService _localizationService;
private readonly IShortStringHelper _shortStringHelper;
// TODO: https://github.com/umbraco/Umbraco-CMS/issues/4237 - get rid of Lazy injection and fix circular dependencies
public DataTypeRepository(IScopeAccessor scopeAccessor, AppCaches cache, Lazy<PropertyEditorCollection> editors, ILogger logger, IIOHelper ioHelper, Lazy<IDataTypeService> dataTypeService, ILocalizedTextService localizedTextService, ILocalizationService localizationService, IShortStringHelper shortStringHelper)
public DataTypeRepository(IScopeAccessor scopeAccessor, AppCaches cache, Lazy<PropertyEditorCollection> editors, ILogger logger)
: base(scopeAccessor, cache, logger)
{
_editors = editors;
_ioHelper = ioHelper;
_dataTypeService = dataTypeService;
_localizedTextService = localizedTextService;
_localizationService = localizationService;
_shortStringHelper = shortStringHelper;
}
#region Overrides of RepositoryBase<int,DataTypeDefinition>
@@ -67,7 +54,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
}
var dtos = Database.Fetch<DataTypeDto>(dataTypeSql);
return dtos.Select(x => DataTypeFactory.BuildEntity(x, _editors.Value, Logger,_ioHelper, _dataTypeService.Value, _localizedTextService, _localizationService, _shortStringHelper)).ToArray();
return dtos.Select(x => DataTypeFactory.BuildEntity(x, _editors.Value, Logger)).ToArray();
}
protected override IEnumerable<IDataType> PerformGetByQuery(IQuery<IDataType> query)
@@ -78,7 +65,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
var dtos = Database.Fetch<DataTypeDto>(sql);
return dtos.Select(x => DataTypeFactory.BuildEntity(x, _editors.Value, Logger, _ioHelper, _dataTypeService.Value, _localizedTextService, _localizationService, _shortStringHelper)).ToArray();
return dtos.Select(x => DataTypeFactory.BuildEntity(x, _editors.Value, Logger)).ToArray();
}
#endregion

View File

@@ -543,6 +543,16 @@ ORDER BY colName";
}
}
// If userlogin or the email has changed then need to reset security stamp
if (changedCols.Contains("userLogin") || changedCols.Contains("userEmail"))
{
userDto.EmailConfirmedDate = null;
userDto.SecurityStampToken = entity.SecurityStamp = Guid.NewGuid().ToString();
changedCols.Add("emailConfirmedDate");
changedCols.Add("securityStampToken");
}
//only update the changed cols
if (changedCols.Count > 0)
{

View File

@@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
namespace Umbraco.Core.PropertyEditors
{
/// <summary>
/// Represents a temporary representation of an editor for cases where a data type is created but not editor is available.
/// </summary>
public class MissingPropertyEditor : IDataEditor
{
public string Alias => "Umbraco.Missing";
public EditorType Type => EditorType.Nothing;
public string Name => "Missing property editor";
public string Icon => string.Empty;
public string Group => string.Empty;
public bool IsDeprecated => false;
public IDictionary<string, object> DefaultConfiguration => throw new NotImplementedException();
public IPropertyIndexValueFactory PropertyIndexValueFactory => throw new NotImplementedException();
public IConfigurationEditor GetConfigurationEditor()
{
return new ConfigurationEditor();
}
public IDataValueEditor GetValueEditor()
{
throw new NotImplementedException();
}
public IDataValueEditor GetValueEditor(object configuration)
{
throw new NotImplementedException();
}
}
}

View File

@@ -19,11 +19,13 @@ using Umbraco.Core.PropertyEditors.Validators;
using Umbraco.Core.Scoping;
using Umbraco.Core.Serialization;
using Umbraco.Core.Services;
using Umbraco.Core.Services.Implement;
using Umbraco.Core.Strings;
using Umbraco.Core.Sync;
using Umbraco.Web.Models.PublishedContent;
using Umbraco.Web.PublishedCache;
using Umbraco.Web;
using Umbraco.Web.Migrations.PostMigrations;
using Umbraco.Web.Install;
using Umbraco.Web.Trees;
using Umbraco.Web.PropertyEditors;
@@ -147,8 +149,8 @@ namespace Umbraco.Core.Runtime
// by default, register a noop factory
composition.RegisterUnique<IPublishedModelFactory, NoopPublishedModelFactory>();
// by default, register a noop rebuilder
composition.RegisterUnique<IPublishedSnapshotRebuilder, NoopPublishedSnapshotRebuilder>();
// by default
composition.RegisterUnique<IPublishedSnapshotRebuilder, PublishedSnapshotRebuilder>();
composition.SetCultureDictionaryFactory<DefaultCultureDictionaryFactory>();
composition.Register(f => f.GetInstance<ICultureDictionaryFactory>().CreateDictionary(), Lifetime.Singleton);
@@ -164,6 +166,10 @@ namespace Umbraco.Core.Runtime
// register core CMS dashboards and 3rd party types - will be ordered by weight attribute & merged with package.manifest dashboards
composition.Dashboards()
.Add(composition.TypeLoader.GetTypes<IDashboard>());
// will be injected in controllers when needed to invoke rest endpoints on Our
composition.RegisterUnique<IInstallationService, InstallationService>();
composition.RegisterUnique<IUpgradeService, UpgradeService>();
}
}
}

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Events;
using Umbraco.Core.Exceptions;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Dtos;
@@ -10,6 +11,7 @@ using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Persistence.Repositories.Implement;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Scoping;
using Umbraco.Core.Strings;
namespace Umbraco.Core.Services.Implement
{
@@ -23,10 +25,15 @@ namespace Umbraco.Core.Services.Implement
private readonly IContentTypeRepository _contentTypeRepository;
private readonly IAuditRepository _auditRepository;
private readonly IEntityRepository _entityRepository;
private readonly IIOHelper _ioHelper;
private readonly ILocalizedTextService _localizedTextService;
private readonly ILocalizationService _localizationService;
private readonly IShortStringHelper _shortStringHelper;
public DataTypeService(IScopeProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory,
IDataTypeRepository dataTypeRepository, IDataTypeContainerRepository dataTypeContainerRepository,
IAuditRepository auditRepository, IEntityRepository entityRepository, IContentTypeRepository contentTypeRepository)
IAuditRepository auditRepository, IEntityRepository entityRepository, IContentTypeRepository contentTypeRepository,
IIOHelper ioHelper, ILocalizedTextService localizedTextService, ILocalizationService localizationService, IShortStringHelper shortStringHelper)
: base(provider, logger, eventMessagesFactory)
{
_dataTypeRepository = dataTypeRepository;
@@ -34,6 +41,10 @@ namespace Umbraco.Core.Services.Implement
_auditRepository = auditRepository;
_entityRepository = entityRepository;
_contentTypeRepository = contentTypeRepository;
_ioHelper = ioHelper;
_localizedTextService = localizedTextService;
_localizationService = localizationService;
_shortStringHelper = shortStringHelper;
}
#region Containers
@@ -227,7 +238,9 @@ namespace Umbraco.Core.Services.Implement
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
return _dataTypeRepository.Get(Query<IDataType>().Where(x => x.Name == name)).FirstOrDefault();
var dataType = _dataTypeRepository.Get(Query<IDataType>().Where(x => x.Name == name)).FirstOrDefault();
ConvertMissingEditorOfDataTypeToLabel(dataType);
return dataType;
}
}
@@ -240,7 +253,9 @@ namespace Umbraco.Core.Services.Implement
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
return _dataTypeRepository.Get(id);
var dataType = _dataTypeRepository.Get(id);
ConvertMissingEditorOfDataTypeToLabel(dataType);
return dataType;
}
}
@@ -254,7 +269,9 @@ namespace Umbraco.Core.Services.Implement
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
var query = Query<IDataType>().Where(x => x.Key == id);
return _dataTypeRepository.Get(query).FirstOrDefault();
var dataType = _dataTypeRepository.Get(query).FirstOrDefault();
ConvertMissingEditorOfDataTypeToLabel(dataType);
return dataType;
}
}
@@ -268,7 +285,9 @@ namespace Umbraco.Core.Services.Implement
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
var query = Query<IDataType>().Where(x => x.EditorAlias == propertyEditorAlias);
return _dataTypeRepository.Get(query);
var dataType = _dataTypeRepository.Get(query);
ConvertMissingEditorsOfDataTypesToLabels(dataType);
return dataType;
}
}
@@ -281,7 +300,31 @@ namespace Umbraco.Core.Services.Implement
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
return _dataTypeRepository.GetMany(ids);
var dataTypes = _dataTypeRepository.GetMany(ids);
ConvertMissingEditorsOfDataTypesToLabels(dataTypes);
return dataTypes;
}
}
private void ConvertMissingEditorOfDataTypeToLabel(IDataType dataType)
{
if (dataType == null)
{
return;
}
ConvertMissingEditorsOfDataTypesToLabels(new[] { dataType });
}
private void ConvertMissingEditorsOfDataTypesToLabels(IEnumerable<IDataType> dataTypes)
{
// Any data types that don't have an associated editor are created of a specific type.
// We convert them to labels to make clear to the user why the data type cannot be used.
var dataTypesWithMissingEditors = dataTypes
.Where(x => x.Editor is MissingPropertyEditor);
foreach (var dataType in dataTypesWithMissingEditors)
{
dataType.Editor = new LabelPropertyEditor(Logger, _ioHelper, this, _localizedTextService, _localizationService, _shortStringHelper);
}
}

View File

@@ -0,0 +1,10 @@
using System.Threading.Tasks;
using Umbraco.Core.Models;
namespace Umbraco.Core.Services
{
public interface IInstallationService
{
Task LogInstall(InstallLog installLog);
}
}

View File

@@ -0,0 +1,21 @@
using System.Threading.Tasks;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Repositories;
namespace Umbraco.Core.Services.Implement
{
public class InstallationService : IInstallationService
{
private readonly IInstallationRepository _installationRepository;
public InstallationService(IInstallationRepository installationRepository)
{
_installationRepository = installationRepository;
}
public async Task LogInstall(InstallLog installLog)
{
await _installationRepository.SaveInstallLogAsync(installLog);
}
}
}

View File

@@ -364,7 +364,7 @@ namespace Umbraco.Web.PublishedCache.NuCache
public override bool EnsureEnvironment(out IEnumerable<string> errors)
{
// must have app_data and be able to write files into it
var ok = FilePermissionHelper.TryCreateDirectory(GetLocalFilesPath(), _ioHelper);
var ok = FilePermissionDirectoryHelper.TryCreateDirectory(GetLocalFilesPath(), _ioHelper);
errors = ok ? Enumerable.Empty<string>() : new[] { "NuCache local files." };
return ok;
}

View File

@@ -13,7 +13,6 @@
<ItemGroup>
<ProjectReference Include="..\Umbraco.Abstractions\Umbraco.Abstractions.csproj" />
<ProjectReference Include="..\Umbraco.Infrastructure\Umbraco.Infrastructure.csproj" />
<ProjectReference Include="..\Umbraco.Web\Umbraco.Web.csproj" />
</ItemGroup>
<ItemGroup>

View File

@@ -99,7 +99,7 @@ namespace Umbraco.Tests.Cache.PublishedCache
//var publishedMedia = PublishedMediaTests.GetNode(mRoot.Id, GetUmbracoContext("/test", 1234));
var umbracoContext = GetUmbracoContext("/test");
var cache = new PublishedMediaCache(new XmlStore((XmlDocument)null, null, null, null, HostingEnvironment), Current.Services.MediaService, Current.Services.UserService, new DictionaryAppCache(), ContentTypesCache, Factory.GetInstance<IEntityXmlSerializer>(), Factory.GetInstance<IUmbracoContextAccessor>(), VariationContextAccessor);
var cache = new PublishedMediaCache(new XmlStore((XmlDocument)null, null, null, null, HostingEnvironment), ServiceContext.MediaService, ServiceContext.UserService, new DictionaryAppCache(), ContentTypesCache, Factory.GetInstance<IEntityXmlSerializer>(), Factory.GetInstance<IUmbracoContextAccessor>(), VariationContextAccessor);
var publishedMedia = cache.GetById(mRoot.Id);
Assert.IsNotNull(publishedMedia);

View File

@@ -275,7 +275,7 @@ AnotherContentFinder
public void GetDataEditors()
{
var types = _typeLoader.GetDataEditors();
Assert.AreEqual(38, types.Count());
Assert.AreEqual(39, types.Count());
}
/// <summary>

View File

@@ -545,7 +545,7 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache
// was library.GetMedia which had its own cache, but MediaService *also* caches
// so, library.GetMedia is gone and now we directly work with MediaService
// (code below copied from what library was doing)
var media = Current.Services.MediaService.GetById(parentId);
var media = _mediaService.GetById(parentId);
if (media == null)
{
return Enumerable.Empty<IPublishedContent>();

View File

@@ -50,7 +50,7 @@ namespace Umbraco.Tests.Persistence.Repositories
TemplateRepository tr;
var ctRepository = CreateRepository(scopeAccessor, out contentTypeRepository, out tr);
var editors = new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty<IDataEditor>()));
dtdRepository = new DataTypeRepository(scopeAccessor, appCaches, new Lazy<PropertyEditorCollection>(() => editors), Logger, IOHelper, new Lazy<IDataTypeService>(() => DataTypeService), LocalizedTextService, LocalizationService, ShortStringHelper);
dtdRepository = new DataTypeRepository(scopeAccessor, appCaches, new Lazy<PropertyEditorCollection>(() => editors), Logger);
return ctRepository;
}

View File

@@ -423,6 +423,35 @@ namespace Umbraco.Tests.Persistence.Repositories
}
}
[Test]
public void Can_Invalidate_SecurityStamp_On_Username_Change()
{
// Arrange
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = provider.CreateScope())
{
var repository = CreateRepository(provider);
var userGroupRepository = CreateUserGroupRepository(provider);
var user = CreateAndCommitUserWithGroup(repository, userGroupRepository);
var originalSecurityStamp = user.SecurityStamp;
// Ensure when user generated a security stamp is present
Assert.That(user.SecurityStamp, Is.Not.Null);
Assert.That(user.SecurityStamp, Is.Not.Empty);
// Update username
user.Username = user.Username + "UPDATED";
repository.Save(user);
// Get the user
var updatedUser = repository.Get(user.Id);
// Ensure the Security Stamp is invalidated & no longer the same
Assert.AreNotEqual(originalSecurityStamp, updatedUser.SecurityStamp);
}
}
private void AssertPropertyValues(IUser updatedItem, IUser originalUser)
{
Assert.That(updatedItem.Id, Is.EqualTo(originalUser.Id));

View File

@@ -158,7 +158,7 @@ namespace Umbraco.Tests.TestHelpers
var localizationService = GetLazyService<ILocalizationService>(factory, c => new LocalizationService(scopeProvider, logger, eventMessagesFactory, GetRepo<IDictionaryRepository>(c), GetRepo<IAuditRepository>(c), GetRepo<ILanguageRepository>(c)));
var userService = GetLazyService<IUserService>(factory, c => new UserService(scopeProvider, logger, eventMessagesFactory, runtimeState, GetRepo<IUserRepository>(c), GetRepo<IUserGroupRepository>(c),globalSettings));
var dataTypeService = GetLazyService<IDataTypeService>(factory, c => new DataTypeService(scopeProvider, logger, eventMessagesFactory, GetRepo<IDataTypeRepository>(c), GetRepo<IDataTypeContainerRepository>(c), GetRepo<IAuditRepository>(c), GetRepo<IEntityRepository>(c), GetRepo<IContentTypeRepository>(c)));
var dataTypeService = GetLazyService<IDataTypeService>(factory, c => new DataTypeService(scopeProvider, logger, eventMessagesFactory, GetRepo<IDataTypeRepository>(c), GetRepo<IDataTypeContainerRepository>(c), GetRepo<IAuditRepository>(c), GetRepo<IEntityRepository>(c), GetRepo<IContentTypeRepository>(c), ioHelper, localizedTextService.Value, localizationService.Value, TestHelper.ShortStringHelper));
var propertyValidationService = new Lazy<IPropertyValidationService>(() => new PropertyValidationService(propertyEditorCollection, dataTypeService.Value));
var contentService = GetLazyService<IContentService>(factory, c => new ContentService(scopeProvider, logger, eventMessagesFactory, GetRepo<IDocumentRepository>(c), GetRepo<IEntityRepository>(c), GetRepo<IAuditRepository>(c), GetRepo<IContentTypeRepository>(c), GetRepo<IDocumentBlueprintRepository>(c), GetRepo<ILanguageRepository>(c), propertyValidationService));
var notificationService = GetLazyService<INotificationService>(factory, c => new NotificationService(scopeProvider, userService.Value, contentService.Value, localizationService.Value, logger, ioHelper, GetRepo<INotificationsRepository>(c), globalSettings, umbracoSettings.Content));

View File

@@ -569,10 +569,6 @@
<Project>{0fad7d2a-d7dd-45b1-91fd-488bb6cdacea}</Project>
<Name>Umbraco.Examine.Lucene</Name>
</ProjectReference>
<ProjectReference Include="..\Umbraco.Examine\Umbraco.Examine.csproj">
<Project>{f9b7fe05-0f93-4d0d-9c10-690b33ecbbd8}</Project>
<Name>Umbraco.Examine</Name>
</ProjectReference>
<ProjectReference Include="..\Umbraco.Infrastructure\Umbraco.Infrastructure.csproj">
<Project>{3ae7bf57-966b-45a5-910a-954d7c554441}</Project>
<Name>Umbraco.Infrastructure</Name>

View File

@@ -1109,9 +1109,9 @@
"integrity": "sha512-kU/fHIGf2a4a3bH7E1tzALTHk+QfoUSCK9fEcMFisd6ZWvNDwPzXWAilItqOC3EDiAXPmGHaNc9/aXiD9xrAxQ=="
},
"angular-aria": {
"version": "1.7.5",
"resolved": "https://registry.npmjs.org/angular-aria/-/angular-aria-1.7.5.tgz",
"integrity": "sha512-X2dGRw+PK7hrV7/X1Ns4e5P3KC/OBFi1l7z//D/v7zbZObsAx48qBoX7unsck+s4+mnO+ikNNkHG5N49VfAyRw=="
"version": "1.7.9",
"resolved": "https://registry.npmjs.org/angular-aria/-/angular-aria-1.7.9.tgz",
"integrity": "sha512-luI3Jemd1AbOQW0krdzfEG3fM0IFtLY0bSSqIDEx3POE0XjKIC1MkrO8Csyq9PPgueLphyAPofzUwZ8YeZ88SA=="
},
"angular-chart.js": {
"version": "1.1.1",

View File

@@ -13,7 +13,7 @@
"ace-builds": "1.4.2",
"angular": "1.7.9",
"angular-animate": "1.7.5",
"angular-aria": "1.7.5",
"angular-aria": "1.7.9",
"angular-chart.js": "^1.1.1",
"angular-cookies": "1.7.5",
"angular-dynamic-locale": "0.1.37",

View File

@@ -71,6 +71,7 @@
templateUrl: 'views/components/forms/umb-checkbox.html',
controller: UmbCheckboxController,
controllerAs: 'vm',
transclude: true,
bindings: {
model: "=",
inputId: "@",

View File

@@ -69,6 +69,7 @@
templateUrl: 'views/components/forms/umb-radiobutton.html',
controller: UmbRadiobuttonController,
controllerAs: 'vm',
transclude: true,
bindings: {
model: "=",
inputId: "@",

View File

@@ -169,6 +169,7 @@ When building a custom infinite editor view you can use the same components as a
let editorsKeyboardShorcuts = [];
var editors = [];
var isEnabled = true;
var lastElementInFocus = null;
// events for backdrop
@@ -261,6 +262,12 @@ When building a custom infinite editor view you can use the same components as a
*/
unbindKeyboardShortcuts();
// if this is the first editor layer, save the currently focused element
// so we can re-apply focus to it once all the editor layers are closed
if (editors.length === 0) {
lastElementInFocus = document.activeElement;
}
// set flag so we know when the editor is open in "infinite mode"
editor.infiniteMode = true;
@@ -301,6 +308,10 @@ When building a custom infinite editor view you can use the same components as a
$timeout(function() {
// rebind keyboard shortcuts for the new editor in focus
rebindKeyboardShortcuts();
if (editors.length === 0 && lastElementInFocus) {
lastElementInFocus.focus();
}
}, 0);
}

View File

@@ -3,15 +3,21 @@
.umb-form-check {
display: flex;
flex-wrap: wrap;
align-items: center;
position: relative;
padding: 0 0 0 26px !important;
padding-left: 0px;
margin: 0;
min-height: 22px;
line-height: 22px;
cursor: pointer !important;
.umb-form-check__symbol {
margin-top: 1px;
margin-right: 10px;
}
.umb-form-check__info {
}
&.-small-text{
font-size: 13px;
}
@@ -22,7 +28,6 @@
&__text {
position: relative;
top: 1px;
user-select: none;
}
@@ -90,10 +95,6 @@
&__state {
display: flex;
height: 18px;
margin-top: 2px;
position: absolute;
top: 0;
left: 0;
}
&__check {
@@ -101,6 +102,7 @@
position: relative;
background: @white;
border: 1px solid @inputBorder;
border-radius: @baseBorderRadius;
width: @checkboxWidth;
height: @checkboxHeight;

View File

@@ -4,16 +4,21 @@
.icon {
position: absolute;
padding: 5px 8px;
width: 30px;
height: 30px;
display: flex;
justify-content: center;
align-items: center;
margin: 1px;
padding: 0;
pointer-events: none;
top: 2px;
color: @ui-action-discreet-type;
transition: color .1s linear;
}
input {
width: 0px;
padding-left:24px;
padding-left: 24px;
margin-bottom: 0px;
background-color: transparent;
border-color: @ui-action-discreet-border;

View File

@@ -1,22 +1,28 @@
<label class="checkbox umb-form-check umb-form-check--checkbox {{vm.cssClass}}" ng-class="{ 'umb-form-check--disabled': vm.disabled }">
<input type="checkbox"
id="{{vm.inputId}}"
name="{{vm.name}}"
value="{{vm.value}}"
class="umb-form-check__input"
val-server-field="{{vm.serverValidationField}}"
ng-model="vm.model"
ng-disabled="vm.disabled"
ng-required="vm.required"
ng-change="vm.change()"/>
<span class="umb-form-check__state" aria-hidden="true">
<span class="umb-form-check__check">
<i class="umb-form-check__icon icon-check"></i>
<div class="umb-form-check__symbol">
<input type="checkbox"
id="{{vm.inputId}}"
name="{{vm.name}}"
value="{{vm.value}}"
class="umb-form-check__input"
val-server-field="{{vm.serverValidationField}}"
ng-model="vm.model"
ng-disabled="vm.disabled"
ng-required="vm.required"
ng-change="vm.change()"/>
<span class="umb-form-check__state" aria-hidden="true">
<span class="umb-form-check__check">
<i class="umb-form-check__icon icon-check"></i>
</span>
</span>
</span>
</div>
<div class="umb-form-check__info" ng-transclude>
<i ng-if="vm.iconClass.length" class="{{vm.iconClass}}" aria-hidden="true"></i>
<i ng-if="vm.iconClass.length" class="{{vm.iconClass}}" aria-hidden="true"></i>
<span ng-if="vm.text.length" class="umb-form-check__text">{{vm.text}}</span>
<span ng-if="vm.text.length" class="umb-form-check__text">{{vm.text}}</span>
</div>
</label>

View File

@@ -1,16 +1,20 @@
<label class="radio umb-form-check umb-form-check--radiobutton" ng-class="{ 'umb-form-check--disabled': vm.disabled }">
<input type="radio"
id="{{vm.inputId}}"
name="{{vm.name}}"
value="{{vm.value}}"
class="umb-form-check__input"
ng-model="vm.model"
ng-disabled="vm.disabled"
ng-required="vm.required"
ng-change="vm.change()" />
<div class="umb-form-check__symbol">
<input type="radio"
id="{{vm.inputId}}"
name="{{vm.name}}"
value="{{vm.value}}"
class="umb-form-check__input"
ng-model="vm.model"
ng-disabled="vm.disabled"
ng-required="vm.required"
ng-change="vm.change()" />
<span class="umb-form-check__state" aria-hidden="true">
<span class="umb-form-check__check"></span>
</span>
<span class="umb-form-check__text">{{vm.text}}</span>
<span class="umb-form-check__state" aria-hidden="true">
<span class="umb-form-check__check"></span>
</span>
</div>
<div class="umb-form-check__info" ng-transclude>
<span class="umb-form-check__text">{{vm.text}}</span>
</div>
</label>

View File

@@ -1,4 +1,4 @@
<div>
<umb-load-indicator ng-if="isLoading"></umb-load-indicator>
<div class="umb-rte" id="{{textAreaHtmlId}}" ng-style="{ visibility : isLoading ? 'hidden' : 'visible' }"></div>
<div disable-hotkeys class="umb-rte" id="{{textAreaHtmlId}}" ng-style="{ visibility : isLoading ? 'hidden' : 'visible' }"></div>
</div>

View File

@@ -1,5 +1,5 @@
<ng-form class="umb-mini-search" ng-class="{'--has-value': vm.model !== null && vm.model !== ''}" novalidate>
<i class="icon icon-search"></i>
<i class="icon icon-search" aria-hidden="true"></i>
<input
class="form-control search-input"
type="text"

View File

@@ -2,11 +2,14 @@
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Web.Http.Filters;
using Semver;
using Umbraco.Core;
using Umbraco.Web.Composing;
using Umbraco.Core.Configuration;
using Umbraco.Core.Models;
using Umbraco.Core.Services;
using Umbraco.Web.Models;
using Umbraco.Web.Mvc;
@@ -15,15 +18,19 @@ namespace Umbraco.Web.Editors
[PluginController("UmbracoApi")]
public class UpdateCheckController : UmbracoAuthorizedJsonController
{
private readonly IUpgradeService _upgradeService;
private readonly IUmbracoVersion _umbracoVersion;
public UpdateCheckController (IUmbracoVersion umbracoVersion)
public UpdateCheckController() { }
public UpdateCheckController(IUpgradeService upgradeService, IUmbracoVersion umbracoVersion)
{
_upgradeService = upgradeService;
_umbracoVersion = umbracoVersion;
}
[UpdateCheckResponseFilter]
public UpgradeCheckResponse GetCheck()
public async Task<UpgradeCheckResponse> GetCheck()
{
var updChkCookie = Request.Headers.GetCookies("UMB_UPDCHK").FirstOrDefault();
var updateCheckCookie = updChkCookie != null ? updChkCookie["UMB_UPDCHK"].Value : "";
@@ -31,23 +38,15 @@ namespace Umbraco.Web.Editors
{
try
{
var check = new org.umbraco.update.CheckForUpgrade { Timeout = 2000 };
var version = new SemVersion(_umbracoVersion.Current.Major, _umbracoVersion.Current.Minor,
_umbracoVersion.Current.Build, _umbracoVersion.Comment);
var result = await _upgradeService.CheckUpgrade(version);
var result = check.CheckUpgrade(_umbracoVersion.Current.Major,
_umbracoVersion.Current.Minor,
_umbracoVersion.Current.Build,
_umbracoVersion.Comment);
return new UpgradeCheckResponse(result.UpgradeType.ToString(), result.Comment, result.UpgradeUrl, _umbracoVersion);
return new UpgradeCheckResponse(result.UpgradeType, result.Comment, result.UpgradeUrl, _umbracoVersion);
}
catch (System.Net.WebException)
catch
{
//this occurs if the server is down or cannot be reached
return null;
}
catch (System.Web.Services.Protocols.SoapException)
{
//this occurs if the server has a timeout
//We don't want to crash due to this
return null;
}
}

View File

@@ -1,4 +1,4 @@
using System.IO;
using System;
using System.Web;
namespace Umbraco.Web
@@ -9,7 +9,7 @@ namespace Umbraco.Web
{
var httpContext = httpContextAccessor.HttpContext;
if(httpContext is null) throw new IOException("HttpContext is null");
if(httpContext is null) throw new InvalidOperationException("HttpContext is null");
return httpContext;
}

View File

@@ -141,7 +141,7 @@ namespace Umbraco.Web.Install
{
try
{
var path = _ioHelper.MapPath(dir + "/" + CreateRandomName());
var path = _ioHelper.MapPath(dir + "/" + FilePermissionDirectoryHelper.CreateRandomFileName());
Directory.CreateDirectory(path);
Directory.Delete(path);
return true;
@@ -152,29 +152,6 @@ namespace Umbraco.Web.Install
}
}
// tries to create a file
// if successful, the file is deleted
// creates the directory if needed - does not delete it
public static bool TryCreateDirectory(string dir, IIOHelper ioHelper)
{
try
{
var dirPath = ioHelper.MapPath(dir);
if (Directory.Exists(dirPath) == false)
Directory.CreateDirectory(dirPath);
var filePath = dirPath + "/" + CreateRandomName() + ".tmp";
File.WriteAllText(filePath, "This is an Umbraco internal test file. It is safe to delete it.");
File.Delete(filePath);
return true;
}
catch
{
return false;
}
}
// tries to create a file
// if successful, the file is deleted
//
@@ -194,7 +171,7 @@ namespace Umbraco.Web.Install
if (canWrite)
{
var filePath = dirPath + "/" + CreateRandomName() + ".tmp";
var filePath = dirPath + "/" + FilePermissionDirectoryHelper.CreateRandomFileName() + ".tmp";
File.WriteAllText(filePath, "This is an Umbraco internal test file. It is safe to delete it.");
File.Delete(filePath);
return true;
@@ -261,10 +238,5 @@ namespace Umbraco.Web.Install
return false;
}
}
private static string CreateRandomName()
{
return "umbraco-test." + Guid.NewGuid().ToString("N").Substring(0, 8);
}
}
}

View File

@@ -2,14 +2,17 @@
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using Umbraco.Core;
using Umbraco.Core.Configuration;
using Umbraco.Core.Cookie;
using Umbraco.Core.Logging;
using Umbraco.Core.Migrations.Install;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.SqlSyntax;
using Umbraco.Core.Services;
using Umbraco.Web.Composing;
using Umbraco.Web.Install.Models;
@@ -24,12 +27,18 @@ namespace Umbraco.Web.Install
private readonly IGlobalSettings _globalSettings;
private readonly IUmbracoVersion _umbracoVersion;
private readonly IConnectionStrings _connectionStrings;
private readonly IInstallationService _installationService;
private readonly ICookieManager _cookieManager;
private InstallationType? _installationType;
public InstallHelper(IHttpContextAccessor httpContextAccessor,
DatabaseBuilder databaseBuilder,
ILogger logger, IGlobalSettings globalSettings, IUmbracoVersion umbracoVersion, IConnectionStrings connectionStrings, ICookieManager cookieManager)
ILogger logger,
IGlobalSettings globalSettings,
IUmbracoVersion umbracoVersion,
IConnectionStrings connectionStrings,
IInstallationService installationService,
ICookieManager cookieManager)
{
_httpContextAccessor = httpContextAccessor;
_logger = logger;
@@ -37,6 +46,7 @@ namespace Umbraco.Web.Install
_umbracoVersion = umbracoVersion;
_databaseBuilder = databaseBuilder;
_connectionStrings = connectionStrings ?? throw new ArgumentNullException(nameof(connectionStrings));
_installationService = installationService;
_cookieManager = cookieManager;
}
@@ -45,7 +55,7 @@ namespace Umbraco.Web.Install
return _installationType ?? (_installationType = IsBrandNewInstall ? InstallationType.NewInstall : InstallationType.Upgrade).Value;
}
public void InstallStatus(bool isCompleted, string errorMsg)
public async Task InstallStatus(bool isCompleted, string errorMsg)
{
var httpContext = _httpContextAccessor.GetRequiredHttpContext();
@@ -65,9 +75,13 @@ namespace Umbraco.Web.Install
if (installId == Guid.Empty)
installId = Guid.NewGuid();
}
else
{
installId = Guid.NewGuid(); // Guid.TryParse will have reset installId to Guid.Empty
}
}
_cookieManager.SetCookieValue(Constants.Web.InstallerCookieName, "1");
_cookieManager.SetCookieValue(Constants.Web.InstallerCookieName, installId.ToString());
var dbProvider = string.Empty;
if (IsBrandNewInstall == false)
@@ -77,18 +91,13 @@ namespace Umbraco.Web.Install
dbProvider = GetDbProviderString(Current.SqlContext);
}
var check = new org.umbraco.update.CheckForUpgrade();
check.Install(installId,
IsBrandNewInstall == false,
isCompleted,
DateTime.Now,
_umbracoVersion.Current.Major,
_umbracoVersion.Current.Minor,
_umbracoVersion.Current.Build,
_umbracoVersion.Comment,
errorMsg,
userAgent,
dbProvider);
var installLog = new InstallLog(installId: installId, isUpgrade: IsBrandNewInstall == false,
installCompleted: isCompleted, timestamp: DateTime.Now, versionMajor: _umbracoVersion.Current.Major,
versionMinor: _umbracoVersion.Current.Minor, versionPatch: _umbracoVersion.Current.Build,
versionComment: _umbracoVersion.Comment, error: errorMsg, userAgent: userAgent,
dbProvider: dbProvider);
await _installationService.LogInstall(installLog);
}
catch (Exception ex)
{

View File

@@ -571,11 +571,6 @@
</Compile>
<Compile Include="UmbracoApplication.cs" />
<Compile Include="UmbracoInjectedModule.cs" />
<Compile Include="Web References\org.umbraco.update\Reference.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Reference.map</DependentUpon>
</Compile>
<Compile Include="UmbracoHttpHandler.cs" />
<Compile Include="UmbracoWebService.cs">
<SubType>Component</SubType>
@@ -598,30 +593,18 @@
<EmbeddedResource Include="JavaScript\JsInitialize.js" />
<EmbeddedResource Include="JavaScript\ServerVariables.js" />
</ItemGroup>
<ItemGroup>
<WebReferences Include="Web References\" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="JavaScript\PreviewInitialize.js" />
<None Include="JavaScript\TinyMceInitialize.js" />
<!--<Content Include="umbraco.presentation\umbraco\users\PermissionEditor.aspx" />-->
</ItemGroup>
<ItemGroup>
<None Include="Web References\org.umbraco.update\checkforupgrade.disco" />
<None Include="Web References\org.umbraco.update\checkforupgrade.wsdl" />
<None Include="Web References\org.umbraco.update\Reference.map">
<Generator>MSDiscoCodeGenerator</Generator>
<LastGenOutput>Reference.cs</LastGenOutput>
<SubType>Designer</SubType>
</None>
<None Include="..\Umbraco.Web.UI\Views\web.config">
<Link>Mvc\web.config</Link>
</None>
<None Include="Web References\org.umbraco.update\UpgradeResult.datasource">
<DependentUpon>Reference.map</DependentUpon>
</None>
<None Include="Web References\org.umbraco.update\UpgradeResult1.datasource">
<DependentUpon>Reference.map</DependentUpon>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>

View File

@@ -1,286 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
//
// This source code was auto-generated by Microsoft.VSDesigner, Version 4.0.30319.42000.
//
#pragma warning disable 1591
namespace Umbraco.Web.org.umbraco.update {
using System;
using System.Web.Services;
using System.Diagnostics;
using System.Web.Services.Protocols;
using System.Xml.Serialization;
using System.ComponentModel;
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.7.3062.0")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name="CheckForUpgradeSoap", Namespace="http://update.umbraco.org/")]
public partial class CheckForUpgrade : System.Web.Services.Protocols.SoapHttpClientProtocol {
private System.Threading.SendOrPostCallback InstallOperationCompleted;
private System.Threading.SendOrPostCallback CheckUpgradeOperationCompleted;
private bool useDefaultCredentialsSetExplicitly;
/// <remarks/>
public CheckForUpgrade() {
this.Url = "http://update.umbraco.org/checkforupgrade.asmx";
if ((this.IsLocalFileSystemWebService(this.Url) == true)) {
this.UseDefaultCredentials = true;
this.useDefaultCredentialsSetExplicitly = false;
}
else {
this.useDefaultCredentialsSetExplicitly = true;
}
}
public new string Url {
get {
return base.Url;
}
set {
if ((((this.IsLocalFileSystemWebService(base.Url) == true)
&& (this.useDefaultCredentialsSetExplicitly == false))
&& (this.IsLocalFileSystemWebService(value) == false))) {
base.UseDefaultCredentials = false;
}
base.Url = value;
}
}
public new bool UseDefaultCredentials {
get {
return base.UseDefaultCredentials;
}
set {
base.UseDefaultCredentials = value;
this.useDefaultCredentialsSetExplicitly = true;
}
}
/// <remarks/>
public event InstallCompletedEventHandler InstallCompleted;
/// <remarks/>
public event CheckUpgradeCompletedEventHandler CheckUpgradeCompleted;
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://update.umbraco.org/Install", RequestNamespace="http://update.umbraco.org/", ResponseNamespace="http://update.umbraco.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public void Install(System.Guid installId, bool isUpgrade, bool installCompleted, System.DateTime timestamp, int versionMajor, int versionMinor, int versionPatch, string versionComment, string error, string userAgent, string dbProvider) {
this.Invoke("Install", new object[] {
installId,
isUpgrade,
installCompleted,
timestamp,
versionMajor,
versionMinor,
versionPatch,
versionComment,
error,
userAgent,
dbProvider});
}
/// <remarks/>
public void InstallAsync(System.Guid installId, bool isUpgrade, bool installCompleted, System.DateTime timestamp, int versionMajor, int versionMinor, int versionPatch, string versionComment, string error, string userAgent, string dbProvider) {
this.InstallAsync(installId, isUpgrade, installCompleted, timestamp, versionMajor, versionMinor, versionPatch, versionComment, error, userAgent, dbProvider, null);
}
/// <remarks/>
public void InstallAsync(System.Guid installId, bool isUpgrade, bool installCompleted, System.DateTime timestamp, int versionMajor, int versionMinor, int versionPatch, string versionComment, string error, string userAgent, string dbProvider, object userState) {
if ((this.InstallOperationCompleted == null)) {
this.InstallOperationCompleted = new System.Threading.SendOrPostCallback(this.OnInstallOperationCompleted);
}
this.InvokeAsync("Install", new object[] {
installId,
isUpgrade,
installCompleted,
timestamp,
versionMajor,
versionMinor,
versionPatch,
versionComment,
error,
userAgent,
dbProvider}, this.InstallOperationCompleted, userState);
}
private void OnInstallOperationCompleted(object arg) {
if ((this.InstallCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.InstallCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://update.umbraco.org/CheckUpgrade", RequestNamespace="http://update.umbraco.org/", ResponseNamespace="http://update.umbraco.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public UpgradeResult CheckUpgrade(int versionMajor, int versionMinor, int versionPatch, string versionComment) {
object[] results = this.Invoke("CheckUpgrade", new object[] {
versionMajor,
versionMinor,
versionPatch,
versionComment});
return ((UpgradeResult)(results[0]));
}
/// <remarks/>
public void CheckUpgradeAsync(int versionMajor, int versionMinor, int versionPatch, string versionComment) {
this.CheckUpgradeAsync(versionMajor, versionMinor, versionPatch, versionComment, null);
}
/// <remarks/>
public void CheckUpgradeAsync(int versionMajor, int versionMinor, int versionPatch, string versionComment, object userState) {
if ((this.CheckUpgradeOperationCompleted == null)) {
this.CheckUpgradeOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCheckUpgradeOperationCompleted);
}
this.InvokeAsync("CheckUpgrade", new object[] {
versionMajor,
versionMinor,
versionPatch,
versionComment}, this.CheckUpgradeOperationCompleted, userState);
}
private void OnCheckUpgradeOperationCompleted(object arg) {
if ((this.CheckUpgradeCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.CheckUpgradeCompleted(this, new CheckUpgradeCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
public new void CancelAsync(object userState) {
base.CancelAsync(userState);
}
private bool IsLocalFileSystemWebService(string url) {
if (((url == null)
|| (url == string.Empty))) {
return false;
}
System.Uri wsUri = new System.Uri(url);
if (((wsUri.Port >= 1024)
&& (string.Compare(wsUri.Host, "localHost", System.StringComparison.OrdinalIgnoreCase) == 0))) {
return true;
}
return false;
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.7.3062.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://update.umbraco.org/")]
public partial class UpgradeResult {
private string commentField;
private UpgradeType upgradeTypeField;
private string upgradeUrlField;
/// <remarks/>
public string Comment {
get {
return this.commentField;
}
set {
this.commentField = value;
}
}
/// <remarks/>
public UpgradeType UpgradeType {
get {
return this.upgradeTypeField;
}
set {
this.upgradeTypeField = value;
}
}
/// <remarks/>
public string UpgradeUrl {
get {
return this.upgradeUrlField;
}
set {
this.upgradeUrlField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.7.3062.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://update.umbraco.org/")]
public enum UpgradeType {
/// <remarks/>
None,
/// <remarks/>
Patch,
/// <remarks/>
Minor,
/// <remarks/>
Major,
/// <remarks/>
Critical,
/// <remarks/>
Error,
/// <remarks/>
OutOfSync,
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.7.3062.0")]
public delegate void InstallCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.7.3062.0")]
public delegate void CheckUpgradeCompletedEventHandler(object sender, CheckUpgradeCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.7.3062.0")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class CheckUpgradeCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal CheckUpgradeCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public UpgradeResult Result {
get {
this.RaiseExceptionIfNecessary();
return ((UpgradeResult)(this.results[0]));
}
}
}
}
#pragma warning restore 1591

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<DiscoveryClientResultsFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Results>
<DiscoveryClientResult referenceType="System.Web.Services.Discovery.ContractReference" url="http://update.umbraco.org/checkforupgrade.asmx?wsdl" filename="checkforupgrade.wsdl" />
<DiscoveryClientResult referenceType="System.Web.Services.Discovery.DiscoveryDocumentReference" url="http://update.umbraco.org/checkforupgrade.asmx?disco" filename="checkforupgrade.disco" />
</Results>
</DiscoveryClientResultsFile>

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is automatically generated by Visual Studio .Net. It is
used to store generic object data source configuration information.
Renaming the file extension or editing the content of this file may
cause the file to be unrecognizable by the program.
-->
<GenericObjectDataSource DisplayName="UpgradeResult" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
<TypeInfo>umbraco.presentation.org.umbraco.update.UpgradeResult, Web References.org.umbraco.update.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
</GenericObjectDataSource>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<discovery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/disco/">
<contractRef ref="http://update.umbraco.org/checkforupgrade.asmx?wsdl" docRef="http://update.umbraco.org/checkforupgrade.asmx" xmlns="http://schemas.xmlsoap.org/disco/scl/" />
<soap address="http://update.umbraco.org/checkforupgrade.asmx" xmlns:q1="http://update.umbraco.org/" binding="q1:CheckForUpgradeSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
<soap address="http://update.umbraco.org/checkforupgrade.asmx" xmlns:q2="http://update.umbraco.org/" binding="q2:CheckForUpgradeSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
</discovery>

View File

@@ -1,142 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://update.umbraco.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s1="http://microsoft.com/wsdl/types/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://update.umbraco.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://update.umbraco.org/">
<s:import namespace="http://microsoft.com/wsdl/types/" />
<s:element name="Install">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="installId" type="s1:guid" />
<s:element minOccurs="1" maxOccurs="1" name="isUpgrade" type="s:boolean" />
<s:element minOccurs="1" maxOccurs="1" name="installCompleted" type="s:boolean" />
<s:element minOccurs="1" maxOccurs="1" name="timestamp" type="s:dateTime" />
<s:element minOccurs="1" maxOccurs="1" name="versionMajor" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="versionMinor" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="versionPatch" type="s:int" />
<s:element minOccurs="0" maxOccurs="1" name="versionComment" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="error" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="userAgent" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="dbProvider" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="InstallResponse">
<s:complexType />
</s:element>
<s:element name="CheckUpgrade">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="versionMajor" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="versionMinor" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="versionPatch" type="s:int" />
<s:element minOccurs="0" maxOccurs="1" name="versionComment" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="CheckUpgradeResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="CheckUpgradeResult" type="tns:UpgradeResult" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="UpgradeResult">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Comment" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="UpgradeType" type="tns:UpgradeType" />
<s:element minOccurs="0" maxOccurs="1" name="UpgradeUrl" type="s:string" />
</s:sequence>
</s:complexType>
<s:simpleType name="UpgradeType">
<s:restriction base="s:string">
<s:enumeration value="None" />
<s:enumeration value="Patch" />
<s:enumeration value="Minor" />
<s:enumeration value="Major" />
<s:enumeration value="Critical" />
<s:enumeration value="Error" />
<s:enumeration value="OutOfSync" />
</s:restriction>
</s:simpleType>
</s:schema>
<s:schema elementFormDefault="qualified" targetNamespace="http://microsoft.com/wsdl/types/">
<s:simpleType name="guid">
<s:restriction base="s:string">
<s:pattern value="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}" />
</s:restriction>
</s:simpleType>
</s:schema>
</wsdl:types>
<wsdl:message name="InstallSoapIn">
<wsdl:part name="parameters" element="tns:Install" />
</wsdl:message>
<wsdl:message name="InstallSoapOut">
<wsdl:part name="parameters" element="tns:InstallResponse" />
</wsdl:message>
<wsdl:message name="CheckUpgradeSoapIn">
<wsdl:part name="parameters" element="tns:CheckUpgrade" />
</wsdl:message>
<wsdl:message name="CheckUpgradeSoapOut">
<wsdl:part name="parameters" element="tns:CheckUpgradeResponse" />
</wsdl:message>
<wsdl:portType name="CheckForUpgradeSoap">
<wsdl:operation name="Install">
<wsdl:input message="tns:InstallSoapIn" />
<wsdl:output message="tns:InstallSoapOut" />
</wsdl:operation>
<wsdl:operation name="CheckUpgrade">
<wsdl:input message="tns:CheckUpgradeSoapIn" />
<wsdl:output message="tns:CheckUpgradeSoapOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="CheckForUpgradeSoap" type="tns:CheckForUpgradeSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="Install">
<soap:operation soapAction="http://update.umbraco.org/Install" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="CheckUpgrade">
<soap:operation soapAction="http://update.umbraco.org/CheckUpgrade" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="CheckForUpgradeSoap12" type="tns:CheckForUpgradeSoap">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="Install">
<soap12:operation soapAction="http://update.umbraco.org/Install" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="CheckUpgrade">
<soap12:operation soapAction="http://update.umbraco.org/CheckUpgrade" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="CheckForUpgrade">
<wsdl:port name="CheckForUpgradeSoap" binding="tns:CheckForUpgradeSoap">
<soap:address location="http://update.umbraco.org/checkforupgrade.asmx" />
</wsdl:port>
<wsdl:port name="CheckForUpgradeSoap12" binding="tns:CheckForUpgradeSoap12">
<soap12:address location="http://update.umbraco.org/checkforupgrade.asmx" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>