Compare commits
403 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ca0de5acd3 | |||
| 27168722ab | |||
| 6dbeba0763 | |||
| 00e0f83c8e | |||
| 136b3db098 | |||
| 21f46d0a3c | |||
| 7fafea2370 | |||
| 86c37c7f6d | |||
| 7dd9f3e766 | |||
| 1ccc8cc161 | |||
| c5e7e1e39e | |||
| db2a35dbce | |||
| 3d006f1e08 | |||
| e0c891719f | |||
| 89a14c13e5 | |||
| ca9aa21c7b | |||
| c0eaeb3168 | |||
| 74e16c0f8d | |||
| f8fac9f84e | |||
| 83ce359234 | |||
| 2c64f91b25 | |||
| e702fe2877 | |||
| 9d55656ae9 | |||
| d57de05453 | |||
| 11e4bf5de8 | |||
| 82661d9af4 | |||
| 56cff6bba8 | |||
| 6b289e1a7d | |||
| 91fa583f62 | |||
| 23d91fd350 | |||
| d4714e1580 | |||
| 2b22e6a784 | |||
| 59840926c8 | |||
| 338c7cc5a6 | |||
| 77850aea18 | |||
| 895f0a9dfe | |||
| ec03a3dc42 | |||
| 5a4dbba21b | |||
| 04546dd827 | |||
| 4ecf1f919e | |||
| bdc4e1ae6a | |||
| 3cb05870af | |||
| 95b0c342bb | |||
| 3a5584a1c1 | |||
| b425edbb45 | |||
| b403283368 | |||
| cb1d347769 | |||
| 4d0a2c85b7 | |||
| e1957b895f | |||
| c696c62185 | |||
| 0dfbb95033 | |||
| 17969e4537 | |||
| 374fdcf29e | |||
| bcb19eea35 | |||
| da00ad1444 | |||
| 7bc52b3948 | |||
| a77aec4156 | |||
| f7f3dccfc8 | |||
| ab3469d703 | |||
| c78ea90cf5 | |||
| 3de0b85ae3 | |||
| 87b51d1418 | |||
| 8ea1af56ab | |||
| 219eb61194 | |||
| 1d3279fe07 | |||
| 88bb796f4d | |||
| 97878ac25a | |||
| c87e880b64 | |||
| e28ba446a0 | |||
| c645a2cf15 | |||
| 5fb8d990f8 | |||
| 8626e4337f | |||
| 0f22c41eee | |||
| e73fda14b5 | |||
| a04df8070a | |||
| 60c1052db1 | |||
| dd041a6f09 | |||
| 733aab6eb5 | |||
| 1e6d50a86b | |||
| 0445588c6b | |||
| 4d316cf0ce | |||
| 864650193a | |||
| cfa7b0a092 | |||
| 5726420848 | |||
| ca752f74bc | |||
| b840a0992c | |||
| 51997d0651 | |||
| 9482104ec5 | |||
| 7053c175f8 | |||
| b2116480fc | |||
| caef6cc623 | |||
| 280ad246ab | |||
| 43e0ef2472 | |||
| 44cfe5da84 | |||
| d5fd266b19 | |||
| 5768992ccc | |||
| 81aae79b42 | |||
| 9edbb3fc26 | |||
| 7fdd2bcdfc | |||
| ba90fdeb56 | |||
| d6bae1b58f | |||
| ef53db52f7 | |||
| 863b97039c | |||
| 1a1adbf647 | |||
| 5c745565da | |||
| 5dec54badb | |||
| e5e725b376 | |||
| f0f25c67c6 | |||
| da8c0726b1 | |||
| 2fbb9721fa | |||
| de6ffd456c | |||
| 5b3ff58ad8 | |||
| 9a4c1972b2 | |||
| b993ce953b | |||
| dde0f1aa36 | |||
| 3fd6754057 | |||
| 8fbb459233 | |||
| cb6f934792 | |||
| 7adbecf9a1 | |||
| 2fdf148610 | |||
| 9d9e5e8274 | |||
| 89895dd592 | |||
| f9252372ea | |||
| 02a2178029 | |||
| ee775a2fde | |||
| 22af206626 | |||
| 67e109c0e6 | |||
| 8a4d85771b | |||
| 4688ac104e | |||
| 032dbe5bf5 | |||
| a7695163b9 | |||
| cb4569677e | |||
| 4be704b968 | |||
| b7a5cb046a | |||
| eb52dafb33 | |||
| af382c171b | |||
| 54fdfdd639 | |||
| c4c99ef0b8 | |||
| 0bd233815e | |||
| 4c9fd4029f | |||
| 3d65afabbf | |||
| ef9bf155ef | |||
| e947f661a9 | |||
| 0eb8ebd82e | |||
| bc76fa8687 | |||
| 8681d535f2 | |||
| 6d81705ece | |||
| b433af8611 | |||
| b0f4d0e16b | |||
| 2f24dfb8f0 | |||
| ad63050078 | |||
| 552c2ed4dc | |||
| d7e522132e | |||
| ca7c43d944 | |||
| c35e842391 | |||
| dae20cc986 | |||
| c466514e7f | |||
| 5e2aa7fa68 | |||
| 11ccc88bc8 | |||
| c83009c879 | |||
| d6b9b41776 | |||
| 508a4c32b4 | |||
| dbf2538aae | |||
| 5293b3bcc7 | |||
| 940caba2c4 | |||
| e31daef4fa | |||
| 7984626433 | |||
| ffa557b097 | |||
| 9236bcbcd8 | |||
| 1b875b0c67 | |||
| ecce68da0a | |||
| e27a882d2b | |||
| c7ae379fd1 | |||
| 8ad13f6853 | |||
| e4ae40c2fe | |||
| be61270e42 | |||
| bd00b532eb | |||
| ebc9478f2d | |||
| ab72808a10 | |||
| 068e82172a | |||
| 45988d4f0c | |||
| db330b3223 | |||
| 03fd06cfa7 | |||
| 775148d241 | |||
| 8e65ecdc4a | |||
| 6a43dd41c6 | |||
| 82ae6a1aef | |||
| a127683d92 | |||
| 06f3f4b191 | |||
| a2f45a38f7 | |||
| 4b966ebe91 | |||
| da9e87d0ab | |||
| 84a206ce5e | |||
| 3c3c31c36e | |||
| 585f8e07f7 | |||
| f7c0e02bfd | |||
| e767eaa08b | |||
| ef32eda874 | |||
| 01ccf8a6a6 | |||
| c27ca1fb0d | |||
| 68e287cf12 | |||
| ad6946aa26 | |||
| 42d7c83a6d | |||
| 1a435148d8 | |||
| de348a9946 | |||
| 791e6a5f92 | |||
| 1f6f8df5b5 | |||
| 7f5eff6e53 | |||
| d885265818 | |||
| be6140a38b | |||
| 8ee05063a2 | |||
| 7920383904 | |||
| 1a3d9e27f4 | |||
| 2654f9189f | |||
| d7453b5a6e | |||
| 5ed8ceb85e | |||
| b7ea0840a9 | |||
| 6b65f1c197 | |||
| bc7dc8629e | |||
| d3c2b0a247 | |||
| 464711d3c8 | |||
| b15fd4496a | |||
| b3ea0c83f9 | |||
| c1aefe0686 | |||
| 907dd8092a | |||
| 7b5568ecb4 | |||
| 2fd383960d | |||
| 33f76d25f7 | |||
| a2c5c35394 | |||
| c0616a37bf | |||
| da4be3be65 | |||
| 08c4a75af7 | |||
| 047eb893eb | |||
| 308c381e17 | |||
| e99309aa2f | |||
| 917a2b78dd | |||
| e559a6d485 | |||
| 160518e977 | |||
| f985725118 | |||
| 5ec67ab3fd | |||
| 993513b138 | |||
| 7f75802e4e | |||
| 5eb330b7d7 | |||
| ce618d289b | |||
| 2191d33844 | |||
| 92a507bc87 | |||
| 1b844421fc | |||
| df9c6baed7 | |||
| 53357b0582 | |||
| 1164f1cdbb | |||
| 7f05b80a22 | |||
| 20239a9b71 | |||
| c4b07cc3ae | |||
| 771935b8a5 | |||
| 73bb401f81 | |||
| 8ccbe4c1e4 | |||
| cf3343749f | |||
| 079df4a8b7 | |||
| 7612884705 | |||
| 74dc2d80fd | |||
| 647ebee34d | |||
| bc444847f4 | |||
| b5c2fc82bb | |||
| a50256d381 | |||
| 290f34f034 | |||
| 92f609ff71 | |||
| 7e6f7f8a2b | |||
| c5419e700b | |||
| cb09094632 | |||
| 72404e68a0 | |||
| 2c451c5cfe | |||
| af7f83f0f6 | |||
| 5b3c2178a2 | |||
| 145f789631 | |||
| e27e95cb1a | |||
| cdbc3fa8cd | |||
| 6feb7b222f | |||
| b0a739b4ac | |||
| 728dee070f | |||
| 4a735770e2 | |||
| d54b3a0cc3 | |||
| f962a3db20 | |||
| 39851d2475 | |||
| 28adbc17ef | |||
| 4b9a13078e | |||
| 17cce9a666 | |||
| 39da34e1c7 | |||
| 55dc927c8b | |||
| 6e3ff59dfb | |||
| 08eab00627 | |||
| c4fae9b272 | |||
| 8b299a070f | |||
| 51186bea24 | |||
| 5c5bacaab4 | |||
| 5a4e6df99c | |||
| 22f8a4c5dd | |||
| aaf7ae0331 | |||
| 8459a058c6 | |||
| dc5089a9d6 | |||
| 45a246d8b6 | |||
| 65bcd78872 | |||
| a0fd7001e9 | |||
| 09ceb15d08 | |||
| 25335446d0 | |||
| 63d8ef7560 | |||
| 27428bf545 | |||
| 782193b17a | |||
| b9c418e458 | |||
| c843e634ba | |||
| 8eb0d254da | |||
| 70921e88f6 | |||
| d9b71995e1 | |||
| f517e750b9 | |||
| 07d91ce9ac | |||
| ac8ee92bb8 | |||
| aee06c4574 | |||
| d0f69907db | |||
| 71db33f4cd | |||
| cec6322a84 | |||
| eb85e8cd78 | |||
| cf7c0dffb0 | |||
| 78d91a353a | |||
| 22d778ed28 | |||
| a3a2b6499e | |||
| 65ed69cf06 | |||
| c09cd95eb6 | |||
| 1d3490eb82 | |||
| b78c334589 | |||
| b41de9b623 | |||
| c51d29da52 | |||
| 54967e0150 | |||
| 73e47402cb | |||
| 4b945f355a | |||
| 3cf8ef9513 | |||
| 79844154fb | |||
| 067a1ba8e6 | |||
| 120cb964a5 | |||
| 147a1daf6d | |||
| 9badb35c05 | |||
| 765decf3b1 | |||
| eb35791003 | |||
| 65654de06a | |||
| 2334596bf3 | |||
| 1d664bce52 | |||
| 9a515de43f | |||
| 69775c369a | |||
| 3f25d3637a | |||
| 02136d3060 | |||
| 99d4b13bb0 | |||
| e7b007386a | |||
| 5dc3e0a3fc | |||
| d146df43e6 | |||
| 451826a329 | |||
| b55d065d45 | |||
| 83db63c5a8 | |||
| 1fb0b95428 | |||
| 53e23f09dc | |||
| 9e781173fc | |||
| fead30db38 | |||
| d8811d6b46 | |||
| 080150baa3 | |||
| dd40dd964c | |||
| bc51a98cfd | |||
| c6bc5ae6aa | |||
| f84d3b435b | |||
| 99855bce11 | |||
| d0b2f10a8c | |||
| 70507501bd | |||
| bbfd570b8a | |||
| 4a593a0814 | |||
| 3cc0df0273 | |||
| 712cd29fea | |||
| 3d21448f89 | |||
| 7b4912b1e7 | |||
| 8c6362d947 | |||
| 01dd28fc61 | |||
| 75e375ff54 | |||
| 1a29a3237d | |||
| b807b84466 | |||
| ab551b2c96 | |||
| 1520fa77d5 | |||
| 81354cea3c | |||
| b88e714050 | |||
| 58f9ff4b79 | |||
| 8d8bb4e237 | |||
| 6772b1de35 | |||
| ea13989b7e | |||
| 78bc38fe1b | |||
| edb0a934a1 | |||
| f726dd59bf | |||
| 9589500412 | |||
| 1c3b870ad2 | |||
| 6a5002495c | |||
| b3938cd7b2 | |||
| 1e73bb12ac | |||
| 662bf16a4f | |||
| 26d450ad9a | |||
| bab4c7715d | |||
| 27f121f25c | |||
| b199f4072c | |||
| 53928c02f8 | |||
| 756d554b47 | |||
| fb4de621c0 |
@@ -144,3 +144,4 @@ build/msbuild.log
|
||||
.vs/
|
||||
src/packages/
|
||||
build/tools/
|
||||
src/PrecompiledWeb/*
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
[](https://ci.appveyor.com/project/Umbraco/umbraco-cms-hs8dx/branch/dev-v7)
|
||||
|
||||
Umbraco CMS
|
||||
===========
|
||||
The friendliest, most flexible and fastest growing ASP.NET CMS used by more than 390,000 websites worldwide: [https://umbraco.com](https://umbraco.com)
|
||||
|
||||
@@ -57,6 +57,20 @@ $IndexPath = "../src/umbraco.web.ui.client/docs/api/index.html"
|
||||
|
||||
# Build the solution in debug mode
|
||||
$SolutionPath = Join-Path -Path $SolutionRoot -ChildPath "umbraco.sln"
|
||||
|
||||
# Go get nuget.exe if we don't hae it
|
||||
$NuGet = "$ToolsRoot\nuget.exe"
|
||||
$FileExists = Test-Path $NuGet
|
||||
If ($FileExists -eq $False) {
|
||||
Write-Host "Retrieving nuget.exe..."
|
||||
$SourceNugetExe = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
|
||||
Invoke-WebRequest $SourceNugetExe -OutFile $NuGet
|
||||
}
|
||||
|
||||
#restore nuget packages
|
||||
Write-Host "Restoring nuget packages..."
|
||||
& $NuGet restore $SolutionPath
|
||||
|
||||
& $MSBuild "$SolutionPath" /p:Configuration=Debug /maxcpucount /t:Clean
|
||||
if (-not $?)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
|
||||
<metadata>
|
||||
<metadata minClientVersion="3.4.4">
|
||||
<id>UmbracoCms.Core</id>
|
||||
<version>7.0.0</version>
|
||||
<title>Umbraco Cms Core Binaries</title>
|
||||
@@ -34,7 +34,7 @@
|
||||
<dependency id="ClientDependency-Mvc5" version="[1.8.0.0, 2.0.0)" />
|
||||
<dependency id="AutoMapper" version="[3.3.1, 4.0.0)" />
|
||||
<dependency id="Newtonsoft.Json" version="[10.0.2, 11.0.0)" />
|
||||
<dependency id="Examine" version="[0.1.82, 1.0.0)" />
|
||||
<dependency id="Examine" version="[0.1.83, 1.0.0)" />
|
||||
<dependency id="ImageProcessor" version="[2.5.3, 3.0.0)" />
|
||||
<dependency id="ImageProcessor.Web" version="[4.8.3, 5.0.0)" />
|
||||
<dependency id="semver" version="[1.1.2, 3.0.0)" />
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
|
||||
<metadata minClientVersion="2.8">
|
||||
<metadata minClientVersion="3.4.4">
|
||||
<id>UmbracoCms</id>
|
||||
<version>7.0.0</version>
|
||||
<title>Umbraco Cms</title>
|
||||
|
||||
@@ -332,6 +332,7 @@
|
||||
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='System.Net.Http.Formatting')" xdt:Transform="Remove" />
|
||||
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='Microsoft.CodeAnalysis.CSharp')" xdt:Transform="Remove" />
|
||||
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='log4net')" xdt:Transform="Remove" />
|
||||
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='System.Data.SqlServerCe')" xdt:Transform="Remove" />
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
|
||||
@@ -389,6 +390,10 @@
|
||||
<assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-2.0.8.0" newVersion="2.0.8.0"/>
|
||||
</dependentAssembly>
|
||||
<dependentAssembly xdt:Transform="Insert">
|
||||
<assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845DCD8080CC91" culture="neutral"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.0.1" newVersion="4.0.0.1"/>
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
# Usage: on line 2 put the release version, on line 3 put the version comment (example: beta)
|
||||
7.6.1
|
||||
7.6.5
|
||||
+2
-2
@@ -11,5 +11,5 @@ using System.Resources;
|
||||
|
||||
[assembly: AssemblyVersion("1.0.*")]
|
||||
|
||||
[assembly: AssemblyFileVersion("7.6.1")]
|
||||
[assembly: AssemblyInformationalVersion("7.6.1")]
|
||||
[assembly: AssemblyFileVersion("7.6.5")]
|
||||
[assembly: AssemblyInformationalVersion("7.6.5")]
|
||||
@@ -23,12 +23,12 @@ namespace Umbraco.Core
|
||||
: base(serviceProvider, logger, packageActions)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the <see cref="IPackageAction"/> implementations.
|
||||
/// </summary>
|
||||
public IEnumerable<IAction> Actions
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the <see cref="IAction"/> implementations.
|
||||
/// </summary>
|
||||
public IEnumerable<IAction> Actions
|
||||
{
|
||||
get
|
||||
{
|
||||
|
||||
@@ -48,7 +48,7 @@ namespace Umbraco.Core
|
||||
/// <param name="cache"></param>
|
||||
[Obsolete("Use the other constructor specifying a ProfilingLogger instead")]
|
||||
public ApplicationContext(DatabaseContext dbContext, ServiceContext serviceContext, CacheHelper cache)
|
||||
: this(dbContext, serviceContext, cache,
|
||||
: this(dbContext, serviceContext, cache,
|
||||
new ProfilingLogger(LoggerResolver.Current.Logger, ProfilerResolver.Current.Profiler))
|
||||
{
|
||||
}
|
||||
@@ -89,7 +89,7 @@ namespace Umbraco.Core
|
||||
/// <param name="replaceContext">If set to true and the singleton is already set, it will be replaced</param>
|
||||
/// <returns></returns>
|
||||
/// <remarks>
|
||||
/// This is NOT thread safe
|
||||
/// This is NOT thread safe
|
||||
/// </remarks>
|
||||
public static ApplicationContext EnsureContext(ApplicationContext appContext, bool replaceContext)
|
||||
{
|
||||
@@ -107,14 +107,14 @@ namespace Umbraco.Core
|
||||
/// </summary>
|
||||
/// <param name="cache"></param>
|
||||
/// <param name="replaceContext">
|
||||
/// If set to true will replace the current singleton instance - This should only be used for unit tests or on app
|
||||
/// If set to true will replace the current singleton instance - This should only be used for unit tests or on app
|
||||
/// startup if for some reason the boot manager is not the umbraco boot manager.
|
||||
/// </param>
|
||||
/// <param name="dbContext"></param>
|
||||
/// <param name="serviceContext"></param>
|
||||
/// <returns></returns>
|
||||
/// <remarks>
|
||||
/// This is NOT thread safe
|
||||
/// This is NOT thread safe
|
||||
/// </remarks>
|
||||
[Obsolete("Use the other method specifying an ProfilingLogger instead")]
|
||||
public static ApplicationContext EnsureContext(DatabaseContext dbContext, ServiceContext serviceContext, CacheHelper cache, bool replaceContext)
|
||||
@@ -135,14 +135,14 @@ namespace Umbraco.Core
|
||||
/// <param name="cache"></param>
|
||||
/// <param name="logger"></param>
|
||||
/// <param name="replaceContext">
|
||||
/// If set to true will replace the current singleton instance - This should only be used for unit tests or on app
|
||||
/// If set to true will replace the current singleton instance - This should only be used for unit tests or on app
|
||||
/// startup if for some reason the boot manager is not the umbraco boot manager.
|
||||
/// </param>
|
||||
/// <param name="dbContext"></param>
|
||||
/// <param name="serviceContext"></param>
|
||||
/// <returns></returns>
|
||||
/// <remarks>
|
||||
/// This is NOT thread safe
|
||||
/// This is NOT thread safe
|
||||
/// </remarks>
|
||||
public static ApplicationContext EnsureContext(DatabaseContext dbContext, ServiceContext serviceContext, CacheHelper cache, ProfilingLogger logger, bool replaceContext)
|
||||
{
|
||||
@@ -175,7 +175,7 @@ namespace Umbraco.Core
|
||||
public CacheHelper ApplicationCache { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Exposes the global ProfilingLogger - this should generally not be accessed via the UmbracoContext and should normally just be exposed
|
||||
/// Exposes the global ProfilingLogger - this should generally not be accessed via the UmbracoContext and should normally just be exposed
|
||||
/// on most base classes or injected with IoC
|
||||
/// </summary>
|
||||
public ProfilingLogger ProfilingLogger { get; private set; }
|
||||
@@ -213,7 +213,7 @@ namespace Umbraco.Core
|
||||
// GlobalSettings.CurrentVersion returns the hard-coded "current version"
|
||||
// the system is configured if they match
|
||||
// if they don't, install runs, updates web.config (presumably) and updates GlobalSettings.ConfiguredStatus
|
||||
|
||||
|
||||
public bool IsConfigured
|
||||
{
|
||||
get { return _configured.Value; }
|
||||
@@ -226,8 +226,8 @@ namespace Umbraco.Core
|
||||
{
|
||||
get
|
||||
{
|
||||
if (IsConfigured == false
|
||||
&& DatabaseContext != null
|
||||
if (IsConfigured == false
|
||||
&& DatabaseContext != null
|
||||
&& DatabaseContext.IsDatabaseConfigured)
|
||||
{
|
||||
var schemaresult = DatabaseContext.ValidateDatabaseSchema();
|
||||
@@ -274,12 +274,12 @@ namespace Umbraco.Core
|
||||
|
||||
private Lazy<bool> _configured;
|
||||
internal MainDom MainDom { get; private set; }
|
||||
|
||||
|
||||
private void Init()
|
||||
{
|
||||
MainDom = new MainDom(ProfilingLogger.Logger);
|
||||
MainDom.Acquire();
|
||||
|
||||
|
||||
//Create the lazy value to resolve whether or not the application is 'configured'
|
||||
_configured = new Lazy<bool>(() =>
|
||||
{
|
||||
@@ -289,7 +289,7 @@ namespace Umbraco.Core
|
||||
var currentVersion = UmbracoVersion.GetSemanticVersion();
|
||||
|
||||
var ok =
|
||||
//we are not configured if this is null
|
||||
//we are not configured if this is null
|
||||
string.IsNullOrWhiteSpace(configStatus) == false
|
||||
//they must match
|
||||
&& configStatus == currentVersion;
|
||||
@@ -303,7 +303,7 @@ namespace Umbraco.Core
|
||||
var found = Services.MigrationEntryService.FindEntry(Constants.System.UmbracoMigrationName, UmbracoVersion.GetSemanticVersion());
|
||||
if (found == null)
|
||||
{
|
||||
//we haven't executed this migration in this environment, so even though the config versions match,
|
||||
//we haven't executed this migration in this environment, so even though the config versions match,
|
||||
// this db has not been updated.
|
||||
ProfilingLogger.Logger.Debug<ApplicationContext>(string.Format("The migration for version: '{0} has not been executed, there is no record in the database", currentVersion.ToSemanticString()));
|
||||
ok = false;
|
||||
@@ -323,7 +323,7 @@ namespace Umbraco.Core
|
||||
return false;
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private string ConfigurationStatus
|
||||
@@ -338,7 +338,7 @@ namespace Umbraco.Core
|
||||
{
|
||||
return String.Empty;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void AssertIsNotReady()
|
||||
@@ -363,7 +363,7 @@ namespace Umbraco.Core
|
||||
}
|
||||
internal set { _databaseContext = value; }
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current ServiceContext
|
||||
/// </summary>
|
||||
@@ -417,7 +417,7 @@ namespace Umbraco.Core
|
||||
ResolverCollection.ResetAll();
|
||||
//reset resolution itself (though this should be taken care of by resetting any of the resolvers above)
|
||||
Resolution.Reset();
|
||||
|
||||
|
||||
//reset the instance objects
|
||||
this.ApplicationCache = null;
|
||||
if (_databaseContext != null) //need to check the internal field here
|
||||
@@ -430,14 +430,14 @@ namespace Umbraco.Core
|
||||
/*
|
||||
if (DatabaseContext.IsDatabaseConfigured && DatabaseContext.Database != null)
|
||||
{
|
||||
DatabaseContext.Database.Dispose();
|
||||
}
|
||||
*/
|
||||
DatabaseContext.Database.Dispose();
|
||||
}
|
||||
*/
|
||||
}
|
||||
this.DatabaseContext = null;
|
||||
this.Services = null;
|
||||
this._isReady = false; //set the internal field
|
||||
|
||||
|
||||
// Indicate that the instance has been disposed.
|
||||
_disposed = true;
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@ namespace Umbraco.Core.Cache
|
||||
public const string DataTypeCacheKey = "UmbracoDataTypeDefinition";
|
||||
public const string DataTypePreValuesCacheKey = "UmbracoPreVal";
|
||||
|
||||
public const string IdToKeyCacheKey = "UI2K";
|
||||
public const string KeyToIdCacheKey = "UK2I";
|
||||
public const string IdToKeyCacheKey = "UI2K__";
|
||||
public const string KeyToIdCacheKey = "UK2I__";
|
||||
}
|
||||
}
|
||||
@@ -139,6 +139,12 @@ namespace Umbraco.Core.Configuration.UmbracoSettings
|
||||
internal CommaDelimitedConfigurationElement DisallowedUploadFiles
|
||||
{
|
||||
get { return GetOptionalDelimitedElement("disallowedUploadFiles", new[] {"ashx", "aspx", "ascx", "config", "cshtml", "vbhtml", "asmx", "air", "axd"}); }
|
||||
}
|
||||
|
||||
[ConfigurationProperty("allowedUploadFiles")]
|
||||
internal CommaDelimitedConfigurationElement AllowedUploadFiles
|
||||
{
|
||||
get { return GetOptionalDelimitedElement("allowedUploadFiles", new string[0]); }
|
||||
}
|
||||
|
||||
[ConfigurationProperty("cloneXmlContent")]
|
||||
@@ -307,6 +313,11 @@ namespace Umbraco.Core.Configuration.UmbracoSettings
|
||||
IEnumerable<string> IContentSection.DisallowedUploadFiles
|
||||
{
|
||||
get { return DisallowedUploadFiles; }
|
||||
}
|
||||
|
||||
IEnumerable<string> IContentSection.AllowedUploadFiles
|
||||
{
|
||||
get { return AllowedUploadFiles; }
|
||||
}
|
||||
|
||||
bool IContentSection.CloneXmlContent
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
using System.Linq;
|
||||
|
||||
namespace Umbraco.Core.Configuration.UmbracoSettings
|
||||
{
|
||||
public static class ContentSectionExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Determines if file extension is allowed for upload based on (optional) white list and black list
|
||||
/// held in settings.
|
||||
/// Allow upload if extension is whitelisted OR if there is no whitelist and extension is NOT blacklisted.
|
||||
/// </summary>
|
||||
public static bool IsFileAllowedForUpload(this IContentSection contentSection, string extension)
|
||||
{
|
||||
return contentSection.AllowedUploadFiles.Any(x => x.InvariantEquals(extension)) ||
|
||||
(contentSection.AllowedUploadFiles.Any() == false &&
|
||||
contentSection.DisallowedUploadFiles.Any(x => x.InvariantEquals(extension)) == false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -52,7 +52,9 @@ namespace Umbraco.Core.Configuration.UmbracoSettings
|
||||
|
||||
MacroErrorBehaviour MacroErrorBehaviour { get; }
|
||||
|
||||
IEnumerable<string> DisallowedUploadFiles { get; }
|
||||
IEnumerable<string> DisallowedUploadFiles { get; }
|
||||
|
||||
IEnumerable<string> AllowedUploadFiles { get; }
|
||||
|
||||
bool CloneXmlContent { get; }
|
||||
|
||||
|
||||
@@ -12,6 +12,8 @@ namespace Umbraco.Core.Configuration.UmbracoSettings
|
||||
|
||||
bool ConvertUrlsToAscii { get; }
|
||||
|
||||
bool TryConvertUrlsToAscii { get; }
|
||||
|
||||
IEnumerable<IChar> CharCollection { get; }
|
||||
}
|
||||
}
|
||||
@@ -111,7 +111,12 @@ namespace Umbraco.Core.Configuration.UmbracoSettings
|
||||
|
||||
bool IRequestHandlerSection.ConvertUrlsToAscii
|
||||
{
|
||||
get { return UrlReplacing.ConvertUrlsToAscii; }
|
||||
get { return UrlReplacing.ConvertUrlsToAscii.InvariantEquals("true"); }
|
||||
}
|
||||
|
||||
bool IRequestHandlerSection.TryConvertUrlsToAscii
|
||||
{
|
||||
get { return UrlReplacing.ConvertUrlsToAscii.InvariantEquals("try"); }
|
||||
}
|
||||
|
||||
IEnumerable<IChar> IRequestHandlerSection.CharCollection
|
||||
|
||||
@@ -11,10 +11,10 @@ namespace Umbraco.Core.Configuration.UmbracoSettings
|
||||
get { return (bool) base["removeDoubleDashes"]; }
|
||||
}
|
||||
|
||||
[ConfigurationProperty("toAscii", DefaultValue = false)]
|
||||
internal bool ConvertUrlsToAscii
|
||||
[ConfigurationProperty("toAscii", DefaultValue = "false")]
|
||||
internal string ConvertUrlsToAscii
|
||||
{
|
||||
get { return (bool)base["toAscii"]; }
|
||||
get { return (string) base["toAscii"]; }
|
||||
}
|
||||
|
||||
[ConfigurationCollection(typeof(CharCollection), AddItemName = "char")]
|
||||
|
||||
@@ -6,7 +6,7 @@ namespace Umbraco.Core.Configuration
|
||||
{
|
||||
public class UmbracoVersion
|
||||
{
|
||||
private static readonly Version Version = new Version("7.6.1");
|
||||
private static readonly Version Version = new Version("7.6.5");
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current version of Umbraco.
|
||||
@@ -33,9 +33,9 @@ namespace Umbraco.Core.Configuration
|
||||
public static SemVersion GetSemanticVersion()
|
||||
{
|
||||
return new SemVersion(
|
||||
Current.Major,
|
||||
Current.Major,
|
||||
Current.Minor,
|
||||
Current.Build,
|
||||
Current.Build,
|
||||
CurrentComment.IsNullOrWhiteSpace() ? null : CurrentComment,
|
||||
Current.Revision > 0 ? Current.Revision.ToInvariantString() : null);
|
||||
}
|
||||
|
||||
@@ -212,6 +212,16 @@ namespace Umbraco.Core
|
||||
/// Guid for a Forms DataSource.
|
||||
/// </summary>
|
||||
public static readonly Guid FormsDataSourceGuid = new Guid(FormsDataSource);
|
||||
|
||||
/// <summary>
|
||||
/// Guid for a Language.
|
||||
/// </summary>
|
||||
public const string Language = "6B05D05B-EC78-49BE-A4E4-79E274F07A77";
|
||||
|
||||
/// <summary>
|
||||
/// Guid for a Forms DataSource.
|
||||
/// </summary>
|
||||
public static readonly Guid LanguageGuid = new Guid(Language);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ using Umbraco.Core.Packaging.Models;
|
||||
|
||||
namespace Umbraco.Core.Events
|
||||
{
|
||||
internal class ImportPackageEventArgs<TEntity> : CancellableEnumerableObjectEventArgs<TEntity>, IEquatable<ImportPackageEventArgs<TEntity>>
|
||||
public class ImportPackageEventArgs<TEntity> : CancellableEnumerableObjectEventArgs<TEntity>, IEquatable<ImportPackageEventArgs<TEntity>>
|
||||
{
|
||||
private readonly MetaData _packageMetaData;
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace Umbraco.Core.Events
|
||||
public bool Equals(ImportPackageEventArgs<TEntity> other)
|
||||
{
|
||||
if (ReferenceEquals(null, other)) return false;
|
||||
if (ReferenceEquals(this, other)) return true;
|
||||
if (ReferenceEquals(this, other)) return true;
|
||||
//TODO: MetaData for package metadata has no equality operators :/
|
||||
return base.Equals(other) && _packageMetaData.Equals(other._packageMetaData);
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ using Umbraco.Core.Packaging.Models;
|
||||
|
||||
namespace Umbraco.Core.Events
|
||||
{
|
||||
internal class UninstallPackageEventArgs<TEntity> : CancellableObjectEventArgs<IEnumerable<TEntity>>
|
||||
public class UninstallPackageEventArgs<TEntity> : CancellableObjectEventArgs<IEnumerable<TEntity>>
|
||||
{
|
||||
private readonly MetaData _packageMetaData;
|
||||
|
||||
|
||||
@@ -19,6 +19,8 @@ namespace Umbraco.Core.IO
|
||||
|
||||
private ShadowWrapper _macroPartialFileSystem;
|
||||
private ShadowWrapper _partialViewsFileSystem;
|
||||
private ShadowWrapper _macroScriptsFileSystem;
|
||||
private ShadowWrapper _userControlsFileSystem;
|
||||
private ShadowWrapper _stylesheetsFileSystem;
|
||||
private ShadowWrapper _scriptsFileSystem;
|
||||
private ShadowWrapper _xsltFileSystem;
|
||||
@@ -61,6 +63,8 @@ namespace Umbraco.Core.IO
|
||||
{
|
||||
var macroPartialFileSystem = new PhysicalFileSystem(SystemDirectories.MacroPartials);
|
||||
var partialViewsFileSystem = new PhysicalFileSystem(SystemDirectories.PartialViews);
|
||||
var macroScriptsFileSystem = new PhysicalFileSystem(SystemDirectories.MacroScripts);
|
||||
var userControlsFileSystem = new PhysicalFileSystem(SystemDirectories.UserControls);
|
||||
var stylesheetsFileSystem = new PhysicalFileSystem(SystemDirectories.Css);
|
||||
var scriptsFileSystem = new PhysicalFileSystem(SystemDirectories.Scripts);
|
||||
var xsltFileSystem = new PhysicalFileSystem(SystemDirectories.Xslt);
|
||||
@@ -69,6 +73,8 @@ namespace Umbraco.Core.IO
|
||||
|
||||
_macroPartialFileSystem = new ShadowWrapper(macroPartialFileSystem, "Views/MacroPartials", ScopeProvider);
|
||||
_partialViewsFileSystem = new ShadowWrapper(partialViewsFileSystem, "Views/Partials", ScopeProvider);
|
||||
_macroScriptsFileSystem = new ShadowWrapper(macroScriptsFileSystem, "macroScripts", ScopeProvider);
|
||||
_userControlsFileSystem = new ShadowWrapper(userControlsFileSystem, "usercontrols", ScopeProvider);
|
||||
_stylesheetsFileSystem = new ShadowWrapper(stylesheetsFileSystem, "css", ScopeProvider);
|
||||
_scriptsFileSystem = new ShadowWrapper(scriptsFileSystem, "scripts", ScopeProvider);
|
||||
_xsltFileSystem = new ShadowWrapper(xsltFileSystem, "xslt", ScopeProvider);
|
||||
@@ -85,6 +91,10 @@ namespace Umbraco.Core.IO
|
||||
|
||||
public IFileSystem2 MacroPartialsFileSystem { get { return _macroPartialFileSystem; } }
|
||||
public IFileSystem2 PartialViewsFileSystem { get { return _partialViewsFileSystem; } }
|
||||
// Legacy /macroScripts folder
|
||||
public IFileSystem2 MacroScriptsFileSystem { get { return _macroScriptsFileSystem; } }
|
||||
// Legacy /usercontrols folder
|
||||
public IFileSystem2 UserControlsFileSystem { get { return _userControlsFileSystem; } }
|
||||
public IFileSystem2 StylesheetsFileSystem { get { return _stylesheetsFileSystem; } }
|
||||
public IFileSystem2 ScriptsFileSystem { get { return _scriptsFileSystem; } }
|
||||
public IFileSystem2 XsltFileSystem { get { return _xsltFileSystem; } }
|
||||
@@ -252,13 +262,15 @@ namespace Umbraco.Core.IO
|
||||
internal ICompletable Shadow(Guid id)
|
||||
{
|
||||
var typed = _wrappers.ToArray();
|
||||
var wrappers = new ShadowWrapper[typed.Length + 7];
|
||||
var wrappers = new ShadowWrapper[typed.Length + 9];
|
||||
var i = 0;
|
||||
while (i < typed.Length) wrappers[i] = typed[i++];
|
||||
wrappers[i++] = _macroPartialFileSystem;
|
||||
wrappers[i++] = _macroScriptsFileSystem;
|
||||
wrappers[i++] = _partialViewsFileSystem;
|
||||
wrappers[i++] = _stylesheetsFileSystem;
|
||||
wrappers[i++] = _scriptsFileSystem;
|
||||
wrappers[i++] = _userControlsFileSystem;
|
||||
wrappers[i++] = _xsltFileSystem;
|
||||
wrappers[i++] = _masterPagesFileSystem;
|
||||
wrappers[i] = _mvcViewsFileSystem;
|
||||
|
||||
@@ -97,6 +97,8 @@ namespace Umbraco.Core.IO
|
||||
|
||||
public static string MapPath(string path, bool useHttpContext)
|
||||
{
|
||||
if (path == null) throw new ArgumentNullException("path");
|
||||
|
||||
// Check if the path is already mapped
|
||||
if ((path.Length >= 2 && path[1] == Path.VolumeSeparatorChar)
|
||||
|| path.StartsWith(@"\\")) //UNC Paths start with "\\". If the site is running off a network drive mapped paths will look like "\\Whatever\Boo\Bar"
|
||||
|
||||
@@ -159,7 +159,7 @@ namespace Umbraco.Core.IO
|
||||
|
||||
// ReSharper disable once AssignNullToNotNullAttribute
|
||||
var filepath = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories
|
||||
? Path.Combine(folder, filename)
|
||||
? Path.Combine(folder, filename).Replace('\\', '/')
|
||||
: folder + "-" + filename;
|
||||
|
||||
return filepath;
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
{
|
||||
public interface IPartialView : IFile
|
||||
{
|
||||
|
||||
PartialViewType ViewType { get; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Umbraco.Core.Models
|
||||
{
|
||||
public interface IUserControl : IFile
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -109,6 +109,30 @@ namespace Umbraco.Core.Models
|
||||
IsApproved = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Constructor for creating a Member object
|
||||
/// </summary>
|
||||
/// <param name="name"></param>
|
||||
/// <param name="email"></param>
|
||||
/// <param name="username"></param>
|
||||
/// <param name="rawPasswordValue">
|
||||
/// The password value passed in to this parameter should be the encoded/encrypted/hashed format of the member's password
|
||||
/// </param>
|
||||
/// <param name="contentType"></param>
|
||||
/// <param name="isApproved"></param>
|
||||
public Member(string name, string email, string username, string rawPasswordValue, IMemberType contentType, bool isApproved)
|
||||
: base(name, -1, contentType, new PropertyCollection())
|
||||
{
|
||||
Mandate.ParameterNotNull(contentType, "contentType");
|
||||
|
||||
_contentTypeAlias = contentType.Alias;
|
||||
_contentType = contentType;
|
||||
_email = email;
|
||||
_username = username;
|
||||
_rawPasswordValue = rawPasswordValue;
|
||||
IsApproved = isApproved;
|
||||
}
|
||||
|
||||
private static readonly Lazy<PropertySelectors> Ps = new Lazy<PropertySelectors>();
|
||||
|
||||
private class PropertySelectors
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
using System;
|
||||
using System.Runtime.Serialization;
|
||||
using Umbraco.Core.Services;
|
||||
|
||||
namespace Umbraco.Core.Models
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Represents a Partial View file
|
||||
/// </summary>
|
||||
@@ -12,14 +10,21 @@ namespace Umbraco.Core.Models
|
||||
[DataContract(IsReference = true)]
|
||||
public class PartialView : File, IPartialView
|
||||
{
|
||||
[Obsolete("Use the ctor that explicitely sets the view type.")]
|
||||
public PartialView(string path)
|
||||
: this(path, null)
|
||||
: this(PartialViewType.PartialView, path, null)
|
||||
{ }
|
||||
|
||||
internal PartialView(string path, Func<File, string> getFileContent)
|
||||
public PartialView(PartialViewType viewType, string path)
|
||||
: this(viewType, path, null)
|
||||
{ }
|
||||
|
||||
internal PartialView(PartialViewType viewType, string path, Func<File, string> getFileContent)
|
||||
: base(path, getFileContent)
|
||||
{ }
|
||||
{
|
||||
ViewType = viewType;
|
||||
}
|
||||
|
||||
internal PartialViewType ViewType { get; set; }
|
||||
public PartialViewType ViewType { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
namespace Umbraco.Core.Models
|
||||
{
|
||||
internal enum PartialViewType : byte
|
||||
public enum PartialViewType : byte
|
||||
{
|
||||
Unknown = 0, // default
|
||||
PartialView = 1,
|
||||
PartialViewMacro = 2
|
||||
PartialViewMacro = 2,
|
||||
MacroScript = 3
|
||||
}
|
||||
}
|
||||
|
||||
@@ -178,6 +178,13 @@ namespace Umbraco.Core.Models
|
||||
/// </summary>
|
||||
[UmbracoObjectType(Constants.ObjectTypes.FormsDataSource)]
|
||||
[FriendlyName("DataSource")]
|
||||
FormsDataSource
|
||||
FormsDataSource,
|
||||
|
||||
/// <summary>
|
||||
/// Language
|
||||
/// </summary>
|
||||
[UmbracoObjectType(Constants.ObjectTypes.Language)]
|
||||
[FriendlyName("Language")]
|
||||
Language
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
using System;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace Umbraco.Core.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a UserControl file
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
[DataContract(IsReference = true)]
|
||||
public class UserControl : File, IUserControl
|
||||
{
|
||||
public UserControl(string path)
|
||||
: this(path, (Func<File, string>)null)
|
||||
{ }
|
||||
|
||||
internal UserControl(string path, Func<File, string> getFileContent)
|
||||
: base(path, getFileContent)
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Indicates whether the current entity has an identity, which in this case is a path/name.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Overrides the default Entity identity check.
|
||||
/// </remarks>
|
||||
public override bool HasIdentity
|
||||
{
|
||||
get { return string.IsNullOrEmpty(Path) == false; }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@ namespace Umbraco.Core.Packaging.Models
|
||||
{
|
||||
[Serializable]
|
||||
[DataContract(IsReference = true)]
|
||||
internal class InstallationSummary
|
||||
public class InstallationSummary
|
||||
{
|
||||
public MetaData MetaData { get; set; }
|
||||
public IEnumerable<IDataTypeDefinition> DataTypesInstalled { get; set; }
|
||||
|
||||
@@ -5,7 +5,7 @@ namespace Umbraco.Core.Packaging.Models
|
||||
{
|
||||
[Serializable]
|
||||
[DataContract(IsReference = true)]
|
||||
internal class MetaData
|
||||
public class MetaData
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Version { get; set; }
|
||||
|
||||
@@ -4,7 +4,7 @@ using System.Xml.Linq;
|
||||
|
||||
namespace Umbraco.Core.Packaging.Models
|
||||
{
|
||||
internal enum ActionRunAt
|
||||
public enum ActionRunAt
|
||||
{
|
||||
Undefined = 0,
|
||||
Install,
|
||||
@@ -13,7 +13,7 @@ namespace Umbraco.Core.Packaging.Models
|
||||
|
||||
[Serializable]
|
||||
[DataContract(IsReference = true)]
|
||||
internal class PackageAction
|
||||
public class PackageAction
|
||||
{
|
||||
private ActionRunAt _runAt;
|
||||
private bool? _undo;
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace Umbraco.Core.Packaging.Models
|
||||
{
|
||||
[Serializable]
|
||||
[DataContract(IsReference = true)]
|
||||
internal class UninstallationSummary
|
||||
public class UninstallationSummary
|
||||
{
|
||||
public MetaData MetaData { get; set; }
|
||||
public IEnumerable<IDataTypeDefinition> DataTypesUninstalled { get; set; }
|
||||
|
||||
+34
-4
@@ -2,6 +2,7 @@
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Models.Rdbms;
|
||||
using Umbraco.Core.Persistence.DatabaseAnnotations;
|
||||
using Umbraco.Core.Persistence.SqlSyntax;
|
||||
|
||||
namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenThreeZero
|
||||
@@ -16,7 +17,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenThreeZe
|
||||
|
||||
public override void Up()
|
||||
{
|
||||
var exists = Context.Database.FirstOrDefault<RelationTypeDto>("WHERE alias=@alias", new {alias = Constants.Conventions.RelationTypes.RelateParentDocumentOnDeleteAlias});
|
||||
var exists = Context.Database.FirstOrDefault<RelationTypeDtoCapture>("WHERE alias=@alias", new {alias = Constants.Conventions.RelationTypes.RelateParentDocumentOnDeleteAlias});
|
||||
if (exists == null)
|
||||
{
|
||||
Insert.IntoTable("umbracoRelationType").Row(new
|
||||
@@ -28,13 +29,42 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenThreeZe
|
||||
alias = Constants.Conventions.RelationTypes.RelateParentDocumentOnDeleteAlias
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public override void Down()
|
||||
{ }
|
||||
|
||||
// need to capture the DTO as it is modified in later migrations
|
||||
|
||||
[TableName("umbracoRelationType")]
|
||||
[PrimaryKey("id")]
|
||||
[ExplicitColumns]
|
||||
internal class RelationTypeDtoCapture
|
||||
{
|
||||
public const int NodeIdSeed = 3;
|
||||
|
||||
[Column("id")]
|
||||
[PrimaryKeyColumn(IdentitySeed = NodeIdSeed)]
|
||||
public int Id { get; set; }
|
||||
|
||||
[Column("dual")]
|
||||
public bool Dual { get; set; }
|
||||
|
||||
[Column("parentObjectType")]
|
||||
public Guid ParentObjectType { get; set; }
|
||||
|
||||
[Column("childObjectType")]
|
||||
public Guid ChildObjectType { get; set; }
|
||||
|
||||
[Column("name")]
|
||||
[Index(IndexTypes.UniqueNonClustered, Name = "IX_umbracoRelationType_name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
[Column("alias")]
|
||||
[NullSetting(NullSetting = NullSettings.Null)]
|
||||
[Length(100)]
|
||||
[Index(IndexTypes.UniqueNonClustered, Name = "IX_umbracoRelationType_alias")]
|
||||
public string Alias { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
+11
-21
@@ -1,5 +1,4 @@
|
||||
using System.Linq;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
|
||||
using Umbraco.Core.Persistence.SqlSyntax;
|
||||
@@ -11,15 +10,11 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenThreeZe
|
||||
{
|
||||
public UpdateUniqueIdToHaveCorrectIndexType(ISqlSyntaxProvider sqlSyntax, ILogger logger)
|
||||
: base(sqlSyntax, logger)
|
||||
{
|
||||
}
|
||||
{ }
|
||||
|
||||
//see: http://issues.umbraco.org/issue/U4-6188, http://issues.umbraco.org/issue/U4-6187
|
||||
public override void Up()
|
||||
{
|
||||
|
||||
|
||||
var dbIndexes = SqlSyntax.GetDefinedIndexes(Context.Database)
|
||||
var indexes = SqlSyntax.GetDefinedIndexes(Context.Database)
|
||||
.Select(x => new DbIndexDefinition()
|
||||
{
|
||||
TableName = x.Item1,
|
||||
@@ -28,24 +23,19 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenThreeZe
|
||||
IsUnique = x.Item4
|
||||
}).ToArray();
|
||||
|
||||
//must be non-nullable
|
||||
// drop the index if it exists
|
||||
if (indexes.Any(x => x.IndexName.InvariantEquals("IX_umbracoNodeUniqueID")))
|
||||
Delete.Index("IX_umbracoNodeUniqueID").OnTable("umbracoNode");
|
||||
|
||||
// set uniqueID to be non-nullable
|
||||
// the index *must* be dropped else 'one or more objects access this column' exception
|
||||
Alter.Table("umbracoNode").AlterColumn("uniqueID").AsGuid().NotNullable();
|
||||
|
||||
//make sure it already exists
|
||||
if (dbIndexes.Any(x => x.IndexName.InvariantEquals("IX_umbracoNodeUniqueID")))
|
||||
{
|
||||
Delete.Index("IX_umbracoNodeUniqueID").OnTable("umbracoNode");
|
||||
}
|
||||
//make sure it doesn't already exist
|
||||
if (dbIndexes.Any(x => x.IndexName.InvariantEquals("IX_umbracoNode_uniqueID")) == false)
|
||||
{
|
||||
//must be a uniqe index
|
||||
Create.Index("IX_umbracoNode_uniqueID").OnTable("umbracoNode").OnColumn("uniqueID").Unique();
|
||||
}
|
||||
// create the index
|
||||
Create.Index("IX_umbracoNode_uniqueID").OnTable("umbracoNode").OnColumn("uniqueID").Unique();
|
||||
}
|
||||
|
||||
public override void Down()
|
||||
{
|
||||
}
|
||||
{ }
|
||||
}
|
||||
}
|
||||
@@ -81,7 +81,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
s.Where<DocumentDto>(x => x.Newest, SqlSyntax);
|
||||
return s;
|
||||
};
|
||||
|
||||
|
||||
var sqlBaseFull = GetBaseQuery(BaseQueryType.FullMultiple);
|
||||
var sqlBaseIds = GetBaseQuery(BaseQueryType.Ids);
|
||||
|
||||
@@ -107,7 +107,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
return ProcessQuery(translate(translatorFull), new PagingSqlQuery(translate(translatorIds)));
|
||||
}
|
||||
|
||||
#endregion
|
||||
#endregion
|
||||
|
||||
#region Overrides of PetaPocoRepositoryBase<IContent>
|
||||
|
||||
@@ -142,8 +142,8 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
{
|
||||
//The only reason we apply this left outer join is to be able to pull back the DocumentPublishedReadOnlyDto
|
||||
//information with the entire data set, so basically this will get both the latest document and also it's published
|
||||
//version if it has one. When performing a count or when retrieving Ids like in paging, this is unecessary
|
||||
//and causes huge performance overhead for the SQL server, especially when sorting the result.
|
||||
//version if it has one. When performing a count or when retrieving Ids like in paging, this is unecessary
|
||||
//and causes huge performance overhead for the SQL server, especially when sorting the result.
|
||||
//We also don't include this outer join when querying for multiple entities since it is much faster to fetch this information
|
||||
//in a separate query. For a single entity this is ok.
|
||||
|
||||
@@ -234,7 +234,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
};
|
||||
|
||||
var baseId = 0;
|
||||
|
||||
|
||||
while (true)
|
||||
{
|
||||
// get the next group of nodes
|
||||
@@ -284,7 +284,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
}
|
||||
|
||||
xmlIdsQuery.Where<NodeDto>(dto => dto.NodeObjectType == docObjectType, SqlSyntax);
|
||||
|
||||
|
||||
var allXmlIds = Database.Fetch<int>(xmlIdsQuery);
|
||||
|
||||
var toRemove = allXmlIds.Except(allContentIds).ToArray();
|
||||
@@ -293,9 +293,9 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
foreach (var idGroup in toRemove.InGroupsOf(2000))
|
||||
{
|
||||
Database.Execute("DELETE FROM cmsContentXml WHERE nodeId IN (@ids)", new { ids = idGroup });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public override IEnumerable<IContent> GetAllVersions(int id)
|
||||
@@ -308,7 +308,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
|
||||
var sqlFull = translate(GetBaseQuery(BaseQueryType.FullMultiple));
|
||||
var sqlIds = translate(GetBaseQuery(BaseQueryType.Ids));
|
||||
|
||||
|
||||
return ProcessQuery(sqlFull, new PagingSqlQuery(sqlIds), true, includeAllVersions:true);
|
||||
}
|
||||
|
||||
@@ -388,7 +388,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
|
||||
protected override void PersistDeletedItem(IContent entity)
|
||||
{
|
||||
//We need to clear out all access rules but we need to do this in a manual way since
|
||||
//We need to clear out all access rules but we need to do this in a manual way since
|
||||
// nothing in that table is joined to a content id
|
||||
var subQuery = new Sql()
|
||||
.Select("umbracoAccessRule.accessId")
|
||||
@@ -449,7 +449,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
entity.Level = level;
|
||||
|
||||
//Assign the same permissions to it as the parent node
|
||||
// http://issues.umbraco.org/issue/U4-2161
|
||||
// http://issues.umbraco.org/issue/U4-2161
|
||||
var permissionsRepo = new PermissionRepository<IContent>(UnitOfWork, _cacheHelper, SqlSyntax);
|
||||
var parentPermissions = permissionsRepo.GetPermissionsForEntity(entity.ParentId).ToArray();
|
||||
//if there are parent permissions then assign them, otherwise leave null and permissions will become the
|
||||
@@ -516,7 +516,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
VersionDate = dto.UpdateDate,
|
||||
Newest = true,
|
||||
NodeId = dto.NodeId,
|
||||
Published = true
|
||||
Published = true
|
||||
};
|
||||
((Content) entity).PublishedVersionGuid = dto.VersionId;
|
||||
((Content) entity).PublishedDate = dto.UpdateDate;
|
||||
@@ -636,9 +636,12 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
{
|
||||
//In order to update the ContentVersion we need to retrieve its primary key id
|
||||
var contentVerDto = Database.SingleOrDefault<ContentVersionDto>("WHERE VersionId = @Version", new { Version = entity.Version });
|
||||
contentVersionDto.Id = contentVerDto.Id;
|
||||
|
||||
Database.Update(contentVersionDto);
|
||||
if (contentVerDto != null)
|
||||
{
|
||||
contentVersionDto.Id = contentVerDto.Id;
|
||||
Database.Update(contentVersionDto);
|
||||
}
|
||||
|
||||
Database.Update(dto);
|
||||
}
|
||||
|
||||
@@ -742,7 +745,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
|
||||
return ProcessQuery(translate(translatorFull), new PagingSqlQuery(translate(translatorIds)), true);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// This builds the Xml document used for the XML cache
|
||||
/// </summary>
|
||||
@@ -841,7 +844,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <param name="permission"></param>
|
||||
/// <param name="userIds"></param>
|
||||
/// <param name="userIds"></param>
|
||||
public void AssignEntityPermission(IContent entity, char permission, IEnumerable<int> userIds)
|
||||
{
|
||||
var repo = new PermissionRepository<IContent>(UnitOfWork, _cacheHelper, SqlSyntax);
|
||||
@@ -899,9 +902,9 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
string orderBy, Direction orderDirection, bool orderBySystemField, IQuery<IContent> filter = null)
|
||||
{
|
||||
|
||||
//NOTE: This uses the GetBaseQuery method but that does not take into account the required 'newest' field which is
|
||||
//NOTE: This uses the GetBaseQuery method but that does not take into account the required 'newest' field which is
|
||||
// what we always require for a paged result, so we'll ensure it's included in the filter
|
||||
|
||||
|
||||
var filterSql = new Sql().Append("AND (cmsDocument.newest = 1)");
|
||||
if (filter != null)
|
||||
{
|
||||
@@ -910,7 +913,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
filterSql.Append(string.Format("AND ({0})", filterClaus.Item1), filterClaus.Item2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Func<Tuple<string, object[]>> filterCallback = () => new Tuple<string, object[]>(filterSql.SQL, filterSql.Arguments);
|
||||
|
||||
return GetPagedResultsByQuery<DocumentDto>(query, pageIndex, pageSize, out totalRecords,
|
||||
@@ -957,7 +960,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
/// </param>
|
||||
/// <param name="withCache"></param>
|
||||
/// <param name="includeAllVersions">
|
||||
/// Generally when querying for content we only want to return the most recent version of the content item, however in some cases like when
|
||||
/// Generally when querying for content we only want to return the most recent version of the content item, however in some cases like when
|
||||
/// we want to return all versions of a content item, we can't simply return the latest
|
||||
/// </param>
|
||||
/// <returns></returns>
|
||||
@@ -966,7 +969,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
// fetch returns a list so it's ok to iterate it in this method
|
||||
var dtos = Database.Fetch<DocumentDto, ContentVersionDto, ContentDto, NodeDto>(sqlFull);
|
||||
if (dtos.Count == 0) return Enumerable.Empty<IContent>();
|
||||
|
||||
|
||||
//Go and get all of the published version data separately for this data, this is because when we are querying
|
||||
//for multiple content items we don't include the outer join to fetch this data in the same query because
|
||||
//it is insanely slow. Instead we just fetch the published version data separately in one query.
|
||||
@@ -978,7 +981,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
if (parsedOriginalSql.InvariantContains("ORDER BY "))
|
||||
{
|
||||
parsedOriginalSql = parsedOriginalSql.Substring(0, parsedOriginalSql.LastIndexOf("ORDER BY ", StringComparison.Ordinal));
|
||||
}
|
||||
}
|
||||
|
||||
//order by update date DESC, if there is corrupted published flags we only want the latest!
|
||||
var publishedSql = new Sql(@"SELECT cmsDocument.nodeId, cmsDocument.published, cmsDocument.versionId, cmsDocument.updateDate, cmsDocument.newest
|
||||
@@ -1004,12 +1007,12 @@ ORDER BY cmsContentVersion.id DESC
|
||||
var content = new List<Tuple<IContent, bool>>();
|
||||
var defs = new DocumentDefinitionCollection(includeAllVersions);
|
||||
var templateIds = new List<int>();
|
||||
|
||||
|
||||
//track the looked up content types, even though the content types are cached
|
||||
// they still need to be deep cloned out of the cache and we don't want to add
|
||||
// the overhead of deep cloning them on every item in this loop
|
||||
var contentTypes = new Dictionary<int, IContentType>();
|
||||
|
||||
|
||||
foreach (var dto in dtos)
|
||||
{
|
||||
DocumentPublishedReadOnlyDto publishedDto;
|
||||
@@ -1145,7 +1148,7 @@ ORDER BY cmsContentVersion.id DESC
|
||||
|
||||
return currentName;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Dispose disposable properties
|
||||
/// </summary>
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
using System.IO;
|
||||
using Umbraco.Core.Models;
|
||||
|
||||
namespace Umbraco.Core.Persistence.Repositories
|
||||
{
|
||||
public interface IUserControlRepository : IRepository<string, UserControl>
|
||||
{
|
||||
bool ValidateUserControl(UserControl userControl);
|
||||
Stream GetFileContentStream(string filepath);
|
||||
void SetFileContent(string filepath, Stream content);
|
||||
long GetFileSize(string filepath);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using Umbraco.Core.IO;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Persistence.UnitOfWork;
|
||||
|
||||
namespace Umbraco.Core.Persistence.Repositories
|
||||
{
|
||||
internal class MacroScriptRepository : PartialViewRepository
|
||||
{
|
||||
public MacroScriptRepository(IUnitOfWork work, IFileSystem fileSystem)
|
||||
: base(work, fileSystem)
|
||||
{ }
|
||||
|
||||
protected override PartialViewType ViewType { get { return PartialViewType.MacroScript; } }
|
||||
}
|
||||
}
|
||||
@@ -30,7 +30,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
var updated = FileSystem.GetLastModified(path).UtcDateTime;
|
||||
//var content = GetFileContent(path);
|
||||
|
||||
var view = new PartialView(path, file => GetFileContent(file.OriginalPath))
|
||||
var view = new PartialView(ViewType, path, file => GetFileContent(file.OriginalPath))
|
||||
{
|
||||
//id can be the hash
|
||||
Id = path.GetHashCode(),
|
||||
@@ -38,8 +38,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
//Content = content,
|
||||
CreateDate = created,
|
||||
UpdateDate = updated,
|
||||
VirtualPath = FileSystem.GetUrl(id),
|
||||
ViewType = ViewType
|
||||
VirtualPath = FileSystem.GetUrl(id)
|
||||
};
|
||||
|
||||
//on initial construction we don't want to have dirty properties tracked
|
||||
|
||||
@@ -42,6 +42,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
//Construct and execute delete statements for all trashed items by 'nodeObjectType'
|
||||
var deletes = new List<string>
|
||||
{
|
||||
FormatDeleteStatement("cmsTask", "nodeId"),
|
||||
FormatDeleteStatement("umbracoUser2NodeNotify", "nodeId"),
|
||||
FormatDeleteStatement("umbracoUser2NodePermission", "nodeId"),
|
||||
@"DELETE FROM umbracoAccessRule WHERE umbracoAccessRule.accessId IN (
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Umbraco.Core.IO;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Persistence.UnitOfWork;
|
||||
|
||||
namespace Umbraco.Core.Persistence.Repositories
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents the UserControl Repository
|
||||
/// </summary>
|
||||
internal class UserControlRepository : FileRepository<string, UserControl>, IUserControlRepository
|
||||
{
|
||||
public UserControlRepository(IUnitOfWork work, IFileSystem fileSystem)
|
||||
: base(work, fileSystem)
|
||||
{
|
||||
}
|
||||
|
||||
public override UserControl Get(string id)
|
||||
{
|
||||
var path = FileSystem.GetRelativePath(id);
|
||||
|
||||
path = path.EnsureEndsWith(".ascx");
|
||||
|
||||
if (FileSystem.FileExists(path) == false)
|
||||
return null;
|
||||
|
||||
var created = FileSystem.GetCreated(path).UtcDateTime;
|
||||
var updated = FileSystem.GetLastModified(path).UtcDateTime;
|
||||
|
||||
var userControl = new UserControl(path, file => GetFileContent(file.OriginalPath))
|
||||
{
|
||||
Key = path.EncodeAsGuid(),
|
||||
CreateDate = created,
|
||||
UpdateDate = updated,
|
||||
Id = path.GetHashCode(),
|
||||
VirtualPath = FileSystem.GetUrl(path)
|
||||
};
|
||||
|
||||
//on initial construction we don't want to have dirty properties tracked
|
||||
// http://issues.umbraco.org/issue/U4-1946
|
||||
userControl.ResetDirtyProperties(false);
|
||||
|
||||
return userControl;
|
||||
}
|
||||
|
||||
public override void AddOrUpdate(UserControl entity)
|
||||
{
|
||||
base.AddOrUpdate(entity);
|
||||
|
||||
// ensure that from now on, content is lazy-loaded
|
||||
if (entity.GetFileContent == null)
|
||||
entity.GetFileContent = file => GetFileContent(file.OriginalPath);
|
||||
}
|
||||
|
||||
public override IEnumerable<UserControl> GetAll(params string[] ids)
|
||||
{
|
||||
ids = ids
|
||||
.Select(x => StringExtensions.EnsureEndsWith(x, ".ascx"))
|
||||
.Distinct()
|
||||
.ToArray();
|
||||
|
||||
if (ids.Any())
|
||||
{
|
||||
foreach (var id in ids)
|
||||
{
|
||||
yield return Get(id);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var files = FindAllFiles("", "*.ascx");
|
||||
foreach (var file in files)
|
||||
{
|
||||
yield return Get(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a list of all <see cref="UserControl"/> that exist at the relative path specified.
|
||||
/// </summary>
|
||||
/// <param name="rootPath">
|
||||
/// If null or not specified, will return the UserControl files at the root path relative to the IFileSystem
|
||||
/// </param>
|
||||
/// <returns></returns>
|
||||
public IEnumerable<UserControl> GetUserControlsAtPath(string rootPath = null)
|
||||
{
|
||||
return FileSystem.GetFiles(rootPath ?? string.Empty, "*.ascx").Select(Get);
|
||||
}
|
||||
|
||||
private static readonly List<string> ValidExtensions = new List<string> { "ascx" };
|
||||
|
||||
public bool ValidateUserControl(UserControl userControl)
|
||||
{
|
||||
// get full path
|
||||
string fullPath;
|
||||
try
|
||||
{
|
||||
// may throw for security reasons
|
||||
fullPath = FileSystem.GetFullPath(userControl.Path);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// validate path and extension
|
||||
var validDir = SystemDirectories.UserControls;
|
||||
var isValidPath = IOHelper.VerifyEditPath(fullPath, validDir);
|
||||
var isValidExtension = IOHelper.VerifyFileExtension(userControl.Path, ValidExtensions);
|
||||
return isValidPath && isValidExtension;
|
||||
}
|
||||
|
||||
public Stream GetFileContentStream(string filepath)
|
||||
{
|
||||
if (FileSystem.FileExists(filepath) == false) return null;
|
||||
|
||||
try
|
||||
{
|
||||
return FileSystem.OpenFile(filepath);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null; // deal with race conds
|
||||
}
|
||||
}
|
||||
|
||||
public void SetFileContent(string filepath, Stream content)
|
||||
{
|
||||
FileSystem.AddFile(filepath, content, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -231,6 +231,18 @@ namespace Umbraco.Core.Persistence
|
||||
return new PartialViewMacroRepository(uow, FileSystemProviderManager.Current.MacroPartialsFileSystem);
|
||||
}
|
||||
|
||||
[Obsolete("MacroScripts are obsolete - this is for backwards compatibility with upgraded sites.")]
|
||||
internal virtual IPartialViewRepository CreateMacroScriptRepository(IUnitOfWork uow)
|
||||
{
|
||||
return new MacroScriptRepository(uow, FileSystemProviderManager.Current.MacroScriptsFileSystem);
|
||||
}
|
||||
|
||||
[Obsolete("UserControls are obsolete - this is for backwards compatibility with upgraded sites.")]
|
||||
internal virtual IUserControlRepository CreateUserControlRepository(IUnitOfWork uow)
|
||||
{
|
||||
return new UserControlRepository(uow, FileSystemProviderManager.Current.UserControlsFileSystem);
|
||||
}
|
||||
|
||||
public virtual IStylesheetRepository CreateStylesheetRepository(IUnitOfWork uow)
|
||||
{
|
||||
return new StylesheetRepository(uow, FileSystemProviderManager.Current.StylesheetsFileSystem);
|
||||
|
||||
@@ -277,7 +277,7 @@ namespace Umbraco.Core
|
||||
uniqInfos.Add(info.FullName);
|
||||
hashCombiner.AddFileSystemItem(info);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ConvertHashToInt64(hashCombiner.GetCombinedHashCode());
|
||||
}
|
||||
@@ -336,6 +336,9 @@ namespace Umbraco.Core
|
||||
|
||||
#region Cache
|
||||
|
||||
private const int ListFileOpenReadTimeout = 4000; // milliseconds
|
||||
private const int ListFileOpenWriteTimeout = 2000; // milliseconds
|
||||
|
||||
/// <summary>
|
||||
/// Attemps to retrieve the list of types from the cache.
|
||||
/// </summary>
|
||||
@@ -381,7 +384,7 @@ namespace Umbraco.Core
|
||||
if (File.Exists(filePath) == false)
|
||||
return cache;
|
||||
|
||||
using (var stream = File.OpenRead(filePath))
|
||||
using (var stream = GetFileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, ListFileOpenReadTimeout))
|
||||
using (var reader = new StreamReader(stream))
|
||||
{
|
||||
while (true)
|
||||
@@ -451,7 +454,7 @@ namespace Umbraco.Core
|
||||
{
|
||||
var filePath = GetPluginListFilePath();
|
||||
|
||||
using (var stream = File.Open(filePath, FileMode.Create, FileAccess.ReadWrite))
|
||||
using (var stream = GetFileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None, ListFileOpenWriteTimeout))
|
||||
using (var writer = new StreamWriter(stream))
|
||||
{
|
||||
foreach (var typeList in _types.Values)
|
||||
@@ -471,7 +474,28 @@ namespace Umbraco.Core
|
||||
// at the moment we write the cache to disk every time we update it. ideally we defer the writing
|
||||
// since all the updates are going to happen in a row when Umbraco starts. that being said, the
|
||||
// file is small enough, so it is not a priority.
|
||||
WriteCache();
|
||||
WriteCache();
|
||||
}
|
||||
|
||||
private static Stream GetFileStream(string path, FileMode fileMode, FileAccess fileAccess, FileShare fileShare, int timeoutMilliseconds)
|
||||
{
|
||||
const int pauseMilliseconds = 250;
|
||||
var attempts = timeoutMilliseconds / pauseMilliseconds;
|
||||
while (true)
|
||||
{
|
||||
try
|
||||
{
|
||||
return new FileStream(path, fileMode, fileAccess, fileShare);
|
||||
}
|
||||
catch
|
||||
{
|
||||
if (--attempts == 0)
|
||||
throw;
|
||||
|
||||
LogHelper.Debug<PluginManager>(string.Format("Attempted to get filestream for file {0} failed, {1} attempts left, pausing for {2} milliseconds", path, attempts, pauseMilliseconds));
|
||||
Thread.Sleep(pauseMilliseconds);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -39,7 +39,6 @@ using System.Security.Permissions;
|
||||
[assembly: InternalsVisibleTo("UmbracoExamine")]
|
||||
|
||||
[assembly: InternalsVisibleTo("Concorde.Sync")]
|
||||
[assembly: InternalsVisibleTo("Umbraco.VisualStudio")]
|
||||
[assembly: InternalsVisibleTo("Umbraco.Courier.Core")]
|
||||
[assembly: InternalsVisibleTo("Umbraco.Courier.Persistence")]
|
||||
|
||||
@@ -52,4 +51,8 @@ using System.Security.Permissions;
|
||||
[assembly: InternalsVisibleTo("Umbraco.Forms.Web")]
|
||||
|
||||
//allow this to be mocked in our unit tests
|
||||
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
|
||||
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
|
||||
|
||||
//allow custom unit-testing code to access internals through custom adapters
|
||||
[assembly: InternalsVisibleTo("Umbraco.VisualStudio")] // backwards compat.
|
||||
[assembly: InternalsVisibleTo("Umbraco.UnitTesting.Adapter")] // new, more imperative name
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace Umbraco.Core.PropertyEditors
|
||||
|
||||
public PropertyEditorAttribute(string alias, string name)
|
||||
{
|
||||
Mandate.ParameterNotNullOrEmpty(alias, "id");
|
||||
Mandate.ParameterNotNullOrEmpty(alias, "alias");
|
||||
Mandate.ParameterNotNullOrEmpty(name, "name");
|
||||
|
||||
Alias = alias;
|
||||
@@ -82,4 +82,4 @@ namespace Umbraco.Core.PropertyEditors
|
||||
/// </summary>
|
||||
public string Group { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters
|
||||
if (sourceString != null)
|
||||
{
|
||||
decimal d;
|
||||
return (decimal.TryParse(sourceString, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out d)) ? d : 0M;
|
||||
return (decimal.TryParse(sourceString, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out d)) ? d : 0M;
|
||||
}
|
||||
|
||||
// in the database an a decimal is an a decimal
|
||||
|
||||
@@ -494,7 +494,7 @@ namespace Umbraco.Core.Security
|
||||
|
||||
//the stamp cannot be null, so if it is currently null then we'll just return a hash of the password
|
||||
return Task.FromResult(user.SecurityStamp.IsNullOrWhiteSpace()
|
||||
? user.PasswordHash.ToMd5()
|
||||
? user.PasswordHash.GenerateHash()
|
||||
: user.SecurityStamp);
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ namespace Umbraco.Core.Services
|
||||
private readonly EntityXmlSerializer _entitySerializer = new EntityXmlSerializer();
|
||||
private readonly IDataTypeService _dataTypeService;
|
||||
private readonly IUserService _userService;
|
||||
private readonly IdkMap _idkMap;
|
||||
|
||||
//Support recursive locks because some of the methods that require locking call other methods that require locking.
|
||||
//for example, the Move method needs to be locked but this calls the Save method which also needs to be locked.
|
||||
@@ -43,7 +44,8 @@ namespace Umbraco.Core.Services
|
||||
ILogger logger,
|
||||
IEventMessagesFactory eventMessagesFactory,
|
||||
IDataTypeService dataTypeService,
|
||||
IUserService userService)
|
||||
IUserService userService,
|
||||
IdkMap idkMap)
|
||||
: base(provider, repositoryFactory, logger, eventMessagesFactory)
|
||||
{
|
||||
if (dataTypeService == null) throw new ArgumentNullException("dataTypeService");
|
||||
@@ -51,6 +53,7 @@ namespace Umbraco.Core.Services
|
||||
_publishingStrategy = new PublishingStrategy(UowProvider.ScopeProvider, eventMessagesFactory, logger);
|
||||
_dataTypeService = dataTypeService;
|
||||
_userService = userService;
|
||||
_idkMap = idkMap;
|
||||
}
|
||||
|
||||
#region Static Queries
|
||||
@@ -382,13 +385,13 @@ namespace Umbraco.Core.Services
|
||||
/// <returns><see cref="IContent"/></returns>
|
||||
public IContent GetById(Guid key)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
{
|
||||
var repository = RepositoryFactory.CreateContentRepository(uow);
|
||||
var query = Query<IContent>.Builder.Where(x => x.Key == key);
|
||||
var contents = repository.GetByQuery(query);
|
||||
return contents.SingleOrDefault();
|
||||
}
|
||||
// the repository implements a cache policy on int identifiers, not guids,
|
||||
// and we are not changing it now, but we still would like to rely on caching
|
||||
// instead of running a full query against the database, so relying on the
|
||||
// id-key map, which is fast.
|
||||
|
||||
var a = _idkMap.GetIdForKey(key, UmbracoObjectTypes.Document);
|
||||
return a.Success ? GetById(a.Result) : null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -83,7 +83,7 @@ namespace Umbraco.Core.Services
|
||||
/// <returns></returns>
|
||||
public bool HasContainerInPath(string contentPath)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork())
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
{
|
||||
// can use same repo for both content and media
|
||||
var repository = RepositoryFactory.CreateContentTypeRepository(uow);
|
||||
|
||||
@@ -16,50 +16,26 @@ namespace Umbraco.Core.Services
|
||||
{
|
||||
public class EntityService : ScopeRepositoryService, IEntityService
|
||||
{
|
||||
private readonly IRuntimeCacheProvider _runtimeCache;
|
||||
private readonly Dictionary<string, Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>> _supportedObjectTypes;
|
||||
|
||||
private readonly IdkMap _idkMap;
|
||||
|
||||
public EntityService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory, ILogger logger, IEventMessagesFactory eventMessagesFactory,
|
||||
IContentService contentService, IContentTypeService contentTypeService, IMediaService mediaService, IDataTypeService dataTypeService,
|
||||
IMemberService memberService, IMemberTypeService memberTypeService, IRuntimeCacheProvider runtimeCache)
|
||||
IMemberService memberService, IMemberTypeService memberTypeService, IdkMap idkMap)
|
||||
: base(provider, repositoryFactory, logger, eventMessagesFactory)
|
||||
{
|
||||
_runtimeCache = runtimeCache;
|
||||
IContentTypeService contentTypeService1 = contentTypeService;
|
||||
_idkMap = idkMap;
|
||||
|
||||
_supportedObjectTypes = new Dictionary<string, Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>>
|
||||
{
|
||||
{typeof (IDataTypeDefinition).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.DataType, dataTypeService.GetDataTypeDefinitionById)},
|
||||
{typeof (IContent).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.Document, contentService.GetById)},
|
||||
{typeof (IContentType).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.DocumentType, contentTypeService1.GetContentType)},
|
||||
{typeof (IContentType).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.DocumentType, contentTypeService.GetContentType)},
|
||||
{typeof (IMedia).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.Media, mediaService.GetById)},
|
||||
{typeof (IMediaType).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.MediaType, contentTypeService1.GetMediaType)},
|
||||
{typeof (IMediaType).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.MediaType, contentTypeService.GetMediaType)},
|
||||
{typeof (IMember).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.Member, memberService.GetById)},
|
||||
{typeof (IMemberType).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.MemberType, memberTypeService.Get)},
|
||||
//{typeof (IUmbracoEntity).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.EntityContainer, id =>
|
||||
//{
|
||||
// using (var uow = UowProvider.GetUnitOfWork())
|
||||
// {
|
||||
// var found = uow.Database.FirstOrDefault<NodeDto>("SELECT * FROM umbracoNode WHERE id=@id", new { id = id });
|
||||
// return found == null ? null : new UmbracoEntity(found.Trashed)
|
||||
// {
|
||||
// Id = found.NodeId,
|
||||
// Name = found.Text,
|
||||
// Key = found.UniqueId,
|
||||
// SortOrder = found.SortOrder,
|
||||
// Path = found.Path,
|
||||
// NodeObjectTypeId = found.NodeObjectType.Value,
|
||||
// CreateDate = found.CreateDate,
|
||||
// CreatorId = found.UserId.Value,
|
||||
// Level = found.Level,
|
||||
// ParentId = found.ParentId
|
||||
// };
|
||||
// }
|
||||
|
||||
//})}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#region Static Queries
|
||||
@@ -68,6 +44,8 @@ namespace Umbraco.Core.Services
|
||||
|
||||
#endregion
|
||||
|
||||
internal IdkMap IdkMap { get { return _idkMap; } }
|
||||
|
||||
/// <summary>
|
||||
/// Returns the integer id for a given GUID
|
||||
/// </summary>
|
||||
@@ -76,23 +54,12 @@ namespace Umbraco.Core.Services
|
||||
/// <returns></returns>
|
||||
public Attempt<int> GetIdForKey(Guid key, UmbracoObjectTypes umbracoObjectType)
|
||||
{
|
||||
var result = _runtimeCache.GetCacheItem<int?>(CacheKeys.IdToKeyCacheKey + key, () =>
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly:true))
|
||||
{
|
||||
var nodeObjectType = GetNodeObjectTypeGuid(umbracoObjectType);
|
||||
return _idkMap.GetIdForKey(key, umbracoObjectType);
|
||||
}
|
||||
|
||||
var sql = new Sql()
|
||||
.Select("id")
|
||||
.From<NodeDto>()
|
||||
.Where<NodeDto>(
|
||||
dto =>
|
||||
dto.UniqueId == key &&
|
||||
dto.NodeObjectType == nodeObjectType);
|
||||
return uow.Database.ExecuteScalar<int?>(sql);
|
||||
}
|
||||
});
|
||||
return result.HasValue ? Attempt.Succeed(result.Value) : Attempt<int>.Fail();
|
||||
public Attempt<int> GetIdForUdi(Udi udi)
|
||||
{
|
||||
return _idkMap.GetIdForUdi(udi);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -103,32 +70,7 @@ namespace Umbraco.Core.Services
|
||||
/// <returns></returns>
|
||||
public Attempt<Guid> GetKeyForId(int id, UmbracoObjectTypes umbracoObjectType)
|
||||
{
|
||||
var result = _runtimeCache.GetCacheItem<Guid?>(CacheKeys.KeyToIdCacheKey + id, () =>
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly:true))
|
||||
{
|
||||
var nodeObjectType = GetNodeObjectTypeGuid(umbracoObjectType);
|
||||
|
||||
var sql = new Sql()
|
||||
.Select("uniqueID")
|
||||
.From<NodeDto>()
|
||||
.Where<NodeDto>(
|
||||
dto =>
|
||||
dto.NodeId == id &&
|
||||
dto.NodeObjectType == nodeObjectType);
|
||||
return uow.Database.ExecuteScalar<Guid?>(sql);
|
||||
}
|
||||
});
|
||||
return result.HasValue ? Attempt.Succeed(result.Value) : Attempt<Guid>.Fail();
|
||||
}
|
||||
|
||||
private static Guid GetNodeObjectTypeGuid(UmbracoObjectTypes umbracoObjectType)
|
||||
{
|
||||
var guid = umbracoObjectType.GetGuid();
|
||||
if (guid == Guid.Empty)
|
||||
throw new NotSupportedException("Unsupported object type (" + umbracoObjectType + ").");
|
||||
|
||||
return guid;
|
||||
return _idkMap.GetKeyForId(id, umbracoObjectType);
|
||||
}
|
||||
|
||||
public IUmbracoEntity GetByKey(Guid key, bool loadBaseType = true)
|
||||
@@ -394,7 +336,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="totalRecords"></param>
|
||||
/// <param name="orderBy"></param>
|
||||
/// <param name="orderDirection"></param>
|
||||
/// <param name="filter"></param>
|
||||
/// <param name="filter"></param>
|
||||
/// <returns></returns>
|
||||
public IEnumerable<IUmbracoEntity> GetPagedDescendants(int id, UmbracoObjectTypes umbracoObjectType, long pageIndex, int pageSize, out long totalRecords,
|
||||
string orderBy = "path", Direction orderDirection = Direction.Ascending, string filter = "")
|
||||
@@ -407,7 +349,7 @@ namespace Umbraco.Core.Services
|
||||
var query = Query<IUmbracoEntity>.Builder;
|
||||
//if the id is System Root, then just get all
|
||||
if (id != Constants.System.Root)
|
||||
query.Where(x => x.Path.SqlContains(string.Format(",{0},", id), TextColumnType.NVarchar));
|
||||
query.Where(x => x.Path.SqlContains(string.Format(",{0},", id), TextColumnType.NVarchar));
|
||||
|
||||
IQuery<IUmbracoEntity> filterQuery = null;
|
||||
if (filter.IsNullOrWhiteSpace() == false)
|
||||
|
||||
@@ -14,8 +14,7 @@ namespace Umbraco.Core.Services
|
||||
{
|
||||
public ExternalLoginService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory, ILogger logger, IEventMessagesFactory eventMessagesFactory)
|
||||
: base(provider, repositoryFactory, logger, eventMessagesFactory)
|
||||
{
|
||||
}
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Returns all user logins assigned
|
||||
@@ -23,30 +22,32 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public IEnumerable<IIdentityUserLogin> GetAll(int userId)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork())
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
{
|
||||
// ToList is important here, must evaluate within uow!
|
||||
var repo = RepositoryFactory.CreateExternalLoginRepository(uow);
|
||||
var ret = repo.GetByQuery(new Query<IIdentityUserLogin>().Where(x => x.UserId == userId));
|
||||
uow.Commit();
|
||||
return ret;
|
||||
return repo.GetByQuery(new Query<IIdentityUserLogin>()
|
||||
.Where(x => x.UserId == userId))
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns all logins matching the login info - generally there should only be one but in some cases
|
||||
/// Returns all logins matching the login info - generally there should only be one but in some cases
|
||||
/// there might be more than one depending on if an adminstrator has been editing/removing members
|
||||
/// </summary>
|
||||
/// <param name="login"></param>
|
||||
/// <returns></returns>
|
||||
public IEnumerable<IIdentityUserLogin> Find(UserLoginInfo login)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork())
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
{
|
||||
// ToList is important here, must evaluate within uow!
|
||||
var repo = RepositoryFactory.CreateExternalLoginRepository(uow);
|
||||
var ret = repo.GetByQuery(new Query<IIdentityUserLogin>().Where(x => x.ProviderKey == login.ProviderKey && x.LoginProvider == login.LoginProvider));
|
||||
uow.Commit();
|
||||
return ret;
|
||||
return repo.GetByQuery(new Query<IIdentityUserLogin>()
|
||||
.Where(x => x.ProviderKey == login.ProviderKey && x.LoginProvider == login.LoginProvider))
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,7 +79,5 @@ namespace Umbraco.Core.Services
|
||||
uow.Commit();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -621,6 +621,34 @@ namespace Umbraco.Core.Services
|
||||
}
|
||||
}
|
||||
|
||||
public Stream GetMacroScriptFileContentStream(string filepath)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
{
|
||||
var repository = RepositoryFactory.CreateMacroScriptRepository(uow);
|
||||
return repository.GetFileContentStream(filepath);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetMacroScriptFileContent(string filepath, Stream content)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork())
|
||||
{
|
||||
var repository = RepositoryFactory.CreateMacroScriptRepository(uow);
|
||||
repository.SetFileContent(filepath, content);
|
||||
uow.Commit();
|
||||
}
|
||||
}
|
||||
|
||||
public long GetMacroScriptFileSize(string filepath)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
{
|
||||
var repository = RepositoryFactory.CreateMacroScriptRepository(uow);
|
||||
return repository.GetFileSize(filepath);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public Stream GetStylesheetFileContentStream(string filepath)
|
||||
@@ -679,6 +707,34 @@ namespace Umbraco.Core.Services
|
||||
}
|
||||
}
|
||||
|
||||
public Stream GetUserControlFileContentStream(string filepath)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
{
|
||||
var repository = RepositoryFactory.CreateUserControlRepository(uow);
|
||||
return repository.GetFileContentStream(filepath);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetUserControlFileContent(string filepath, Stream content)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork())
|
||||
{
|
||||
var repository = RepositoryFactory.CreateUserControlRepository(uow);
|
||||
repository.SetFileContent(filepath, content);
|
||||
uow.Commit();
|
||||
}
|
||||
}
|
||||
|
||||
public long GetUserControlFileSize(string filepath)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
{
|
||||
var repository = RepositoryFactory.CreateUserControlRepository(uow);
|
||||
return repository.GetFileSize(filepath);
|
||||
}
|
||||
}
|
||||
|
||||
public Stream GetXsltFileContentStream(string filepath)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
@@ -783,6 +839,26 @@ namespace Umbraco.Core.Services
|
||||
}
|
||||
}
|
||||
|
||||
[Obsolete("MacroScripts are obsolete - this is for backwards compatibility with upgraded sites.")]
|
||||
public IPartialView GetMacroScript(string path)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
{
|
||||
var repository = RepositoryFactory.CreateMacroScriptRepository(uow);
|
||||
return repository.Get(path);
|
||||
}
|
||||
}
|
||||
|
||||
[Obsolete("UserControls are obsolete - this is for backwards compatibility with upgraded sites.")]
|
||||
public IUserControl GetUserControl(string path)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
{
|
||||
var repository = RepositoryFactory.CreateUserControlRepository(uow);
|
||||
return repository.Get(path);
|
||||
}
|
||||
}
|
||||
|
||||
public IEnumerable<IPartialView> GetPartialViewMacros(params string[] names)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
|
||||
@@ -28,7 +28,14 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="key"></param>
|
||||
/// <param name="umbracoObjectType"></param>
|
||||
/// <returns></returns>
|
||||
Attempt<int> GetIdForKey(Guid key, UmbracoObjectTypes umbracoObjectType);
|
||||
Attempt<int> GetIdForKey(Guid key, UmbracoObjectTypes umbracoObjectType);
|
||||
|
||||
/// <summary>
|
||||
/// Returns the integer id for a given Udi
|
||||
/// </summary>
|
||||
/// <param name="udi"></param>
|
||||
/// <returns></returns>
|
||||
Attempt<int> GetIdForUdi(Udi udi);
|
||||
|
||||
/// <summary>
|
||||
/// Returns the GUID for a given integer id
|
||||
|
||||
@@ -17,6 +17,10 @@ namespace Umbraco.Core.Services
|
||||
void DeletePartialViewMacroFolder(string folderPath);
|
||||
IPartialView GetPartialView(string path);
|
||||
IPartialView GetPartialViewMacro(string path);
|
||||
[Obsolete("MacroScripts are obsolete - this is for backwards compatibility with upgraded sites.")]
|
||||
IPartialView GetMacroScript(string path);
|
||||
[Obsolete("UserControls are obsolete - this is for backwards compatibility with upgraded sites.")]
|
||||
IUserControl GetUserControl(string path);
|
||||
IEnumerable<IPartialView> GetPartialViewMacros(params string[] names);
|
||||
IXsltFile GetXsltFile(string path);
|
||||
IEnumerable<IXsltFile> GetXsltFiles(params string[] names);
|
||||
@@ -263,6 +267,27 @@ namespace Umbraco.Core.Services
|
||||
/// <returns>The size of the template.</returns>
|
||||
long GetTemplateFileSize(string filepath);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the content of a macroscript as a stream.
|
||||
/// </summary>
|
||||
/// <param name="filepath">The filesystem path to the macroscript.</param>
|
||||
/// <returns>The content of the macroscript.</returns>
|
||||
Stream GetMacroScriptFileContentStream(string filepath);
|
||||
|
||||
/// <summary>
|
||||
/// Sets the content of a macroscript.
|
||||
/// </summary>
|
||||
/// <param name="filepath">The filesystem path to the macroscript.</param>
|
||||
/// <param name="content">The content of the macroscript.</param>
|
||||
void SetMacroScriptFileContent(string filepath, Stream content);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the size of a macroscript.
|
||||
/// </summary>
|
||||
/// <param name="filepath">The filesystem path to the macroscript.</param>
|
||||
/// <returns>The size of the macroscript.</returns>
|
||||
long GetMacroScriptFileSize(string filepath);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the content of a stylesheet as a stream.
|
||||
/// </summary>
|
||||
@@ -305,6 +330,27 @@ namespace Umbraco.Core.Services
|
||||
/// <returns>The size of the script file.</returns>
|
||||
long GetScriptFileSize(string filepath);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the content of a usercontrol as a stream.
|
||||
/// </summary>
|
||||
/// <param name="filepath">The filesystem path to the usercontrol.</param>
|
||||
/// <returns>The content of the usercontrol.</returns>
|
||||
Stream GetUserControlFileContentStream(string filepath);
|
||||
|
||||
/// <summary>
|
||||
/// Sets the content of a usercontrol.
|
||||
/// </summary>
|
||||
/// <param name="filepath">The filesystem path to the usercontrol.</param>
|
||||
/// <param name="content">The content of the usercontrol.</param>
|
||||
void SetUserControlFileContent(string filepath, Stream content);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the size of a usercontrol.
|
||||
/// </summary>
|
||||
/// <param name="filepath">The filesystem path to the usercontrol.</param>
|
||||
/// <returns>The size of the usercontrol.</returns>
|
||||
long GetUserControlFileSize(string filepath);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the content of a XSLT file as a stream.
|
||||
/// </summary>
|
||||
|
||||
@@ -72,6 +72,18 @@ namespace Umbraco.Core.Services
|
||||
/// <returns><see cref="IMembershipUser"/></returns>
|
||||
T CreateWithIdentity(string username, string email, string passwordValue, string memberTypeAlias);
|
||||
|
||||
/// <summary>
|
||||
/// Creates and persists a new <see cref="IMembershipUser"/>
|
||||
/// </summary>
|
||||
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
|
||||
/// <param name="username">Username of the <see cref="IMembershipUser"/> to create</param>
|
||||
/// <param name="email">Email of the <see cref="IMembershipUser"/> to create</param>
|
||||
/// <param name="passwordValue">This value should be the encoded/encrypted/hashed value for the password that will be stored in the database</param>
|
||||
/// <param name="memberTypeAlias">Alias of the Type</param>
|
||||
/// <param name="isApproved">IsApproved of the <see cref="IMembershipUser"/> to create</param>
|
||||
/// <returns><see cref="IMembershipUser"/></returns>
|
||||
T CreateWithIdentity(string username, string email, string passwordValue, string memberTypeAlias, bool isApproved);
|
||||
|
||||
/// <summary>
|
||||
/// Gets an <see cref="IMembershipUser"/> by its provider key
|
||||
/// </summary>
|
||||
|
||||
@@ -0,0 +1,171 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Persistence.UnitOfWork;
|
||||
|
||||
namespace Umbraco.Core.Services
|
||||
{
|
||||
public class IdkMap
|
||||
{
|
||||
private readonly IDatabaseUnitOfWorkProvider _uowProvider;
|
||||
private readonly ReaderWriterLockSlim _locker = new ReaderWriterLockSlim();
|
||||
private readonly Dictionary<int, Guid> _id2Key = new Dictionary<int, Guid>();
|
||||
private readonly Dictionary<Guid, int> _key2Id = new Dictionary<Guid, int>();
|
||||
|
||||
public IdkMap(IDatabaseUnitOfWorkProvider uowProvider)
|
||||
{
|
||||
_uowProvider = uowProvider;
|
||||
}
|
||||
|
||||
// note - no need for uow, scope would be enough, but a pain to wire
|
||||
// note - for pure read-only we might want to *not* enforce a transaction?
|
||||
|
||||
public Attempt<int> GetIdForKey(Guid key, UmbracoObjectTypes umbracoObjectType)
|
||||
{
|
||||
int id;
|
||||
try
|
||||
{
|
||||
_locker.EnterReadLock();
|
||||
if (_key2Id.TryGetValue(key, out id)) return Attempt.Succeed(id);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (_locker.IsReadLockHeld)
|
||||
_locker.ExitReadLock();
|
||||
}
|
||||
|
||||
int? val;
|
||||
using (var uow = _uowProvider.GetUnitOfWork())
|
||||
{
|
||||
val = uow.Database.ExecuteScalar<int?>("SELECT id FROM umbracoNode WHERE uniqueId=@id AND nodeObjectType=@nodeObjectType",
|
||||
new { id = key, nodeObjectType = GetNodeObjectTypeGuid(umbracoObjectType) });
|
||||
uow.Commit();
|
||||
}
|
||||
|
||||
if (val == null) return Attempt<int>.Fail();
|
||||
id = val.Value;
|
||||
|
||||
try
|
||||
{
|
||||
_locker.EnterWriteLock();
|
||||
_id2Key[id] = key;
|
||||
_key2Id[key] = id;
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (_locker.IsWriteLockHeld)
|
||||
_locker.ExitWriteLock();
|
||||
}
|
||||
|
||||
return Attempt.Succeed(id);
|
||||
}
|
||||
|
||||
public Attempt<int> GetIdForUdi(Udi udi)
|
||||
{
|
||||
var guidUdi = udi as GuidUdi;
|
||||
if (guidUdi == null)
|
||||
return Attempt<int>.Fail();
|
||||
|
||||
var umbracoType = Constants.UdiEntityType.ToUmbracoObjectType(guidUdi.EntityType);
|
||||
return GetIdForKey(guidUdi.Guid, umbracoType);
|
||||
}
|
||||
|
||||
public Attempt<Guid> GetKeyForId(int id, UmbracoObjectTypes umbracoObjectType)
|
||||
{
|
||||
Guid key;
|
||||
try
|
||||
{
|
||||
_locker.EnterReadLock();
|
||||
if (_id2Key.TryGetValue(id, out key)) return Attempt.Succeed(key);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (_locker.IsReadLockHeld)
|
||||
_locker.ExitReadLock();
|
||||
}
|
||||
|
||||
Guid? val;
|
||||
using (var uow = _uowProvider.GetUnitOfWork())
|
||||
{
|
||||
val = uow.Database.ExecuteScalar<Guid?>("SELECT uniqueId FROM umbracoNode WHERE id=@id AND nodeObjectType=@nodeObjectType",
|
||||
new { id, nodeObjectType = GetNodeObjectTypeGuid(umbracoObjectType) });
|
||||
uow.Commit();
|
||||
}
|
||||
|
||||
if (val == null) return Attempt<Guid>.Fail();
|
||||
key = val.Value;
|
||||
|
||||
try
|
||||
{
|
||||
_locker.EnterWriteLock();
|
||||
_id2Key[id] = key;
|
||||
_key2Id[key] = id;
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (_locker.IsWriteLockHeld)
|
||||
_locker.ExitWriteLock();
|
||||
}
|
||||
|
||||
return Attempt.Succeed(key);
|
||||
}
|
||||
|
||||
private static Guid GetNodeObjectTypeGuid(UmbracoObjectTypes umbracoObjectType)
|
||||
{
|
||||
var guid = umbracoObjectType.GetGuid();
|
||||
if (guid == Guid.Empty)
|
||||
throw new NotSupportedException("Unsupported object type (" + umbracoObjectType + ").");
|
||||
return guid;
|
||||
}
|
||||
|
||||
public void ClearCache()
|
||||
{
|
||||
try
|
||||
{
|
||||
_locker.EnterWriteLock();
|
||||
_id2Key.Clear();
|
||||
_key2Id.Clear();
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (_locker.IsWriteLockHeld)
|
||||
_locker.ExitWriteLock();
|
||||
}
|
||||
}
|
||||
|
||||
public void ClearCache(int id)
|
||||
{
|
||||
try
|
||||
{
|
||||
_locker.EnterWriteLock();
|
||||
Guid key;
|
||||
if (_id2Key.TryGetValue(id, out key) == false) return;
|
||||
_id2Key.Remove(id);
|
||||
_key2Id.Remove(key);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (_locker.IsWriteLockHeld)
|
||||
_locker.ExitWriteLock();
|
||||
}
|
||||
}
|
||||
|
||||
public void ClearCache(Guid key)
|
||||
{
|
||||
try
|
||||
{
|
||||
_locker.EnterWriteLock();
|
||||
int id;
|
||||
if (_key2Id.TryGetValue(key, out id) == false) return;
|
||||
_id2Key.Remove(id);
|
||||
_key2Id.Remove(key);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (_locker.IsWriteLockHeld)
|
||||
_locker.ExitWriteLock();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -35,14 +35,16 @@ namespace Umbraco.Core.Services
|
||||
private readonly IDataTypeService _dataTypeService;
|
||||
private readonly IUserService _userService;
|
||||
private readonly MediaFileSystem _mediaFileSystem = FileSystemProviderManager.Current.MediaFileSystem;
|
||||
private readonly IdkMap _idkMap;
|
||||
|
||||
public MediaService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory, ILogger logger, IEventMessagesFactory eventMessagesFactory, IDataTypeService dataTypeService, IUserService userService)
|
||||
public MediaService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory, ILogger logger, IEventMessagesFactory eventMessagesFactory, IDataTypeService dataTypeService, IUserService userService, IdkMap idkMap)
|
||||
: base(provider, repositoryFactory, logger, eventMessagesFactory)
|
||||
{
|
||||
if (dataTypeService == null) throw new ArgumentNullException("dataTypeService");
|
||||
if (userService == null) throw new ArgumentNullException("userService");
|
||||
_dataTypeService = dataTypeService;
|
||||
_userService = userService;
|
||||
_idkMap = idkMap;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -327,12 +329,15 @@ namespace Umbraco.Core.Services
|
||||
/// <returns><see cref="IMedia"/></returns>
|
||||
public IMedia GetById(Guid key)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
{
|
||||
var repository = RepositoryFactory.CreateMediaRepository(uow);
|
||||
var query = Query<IMedia>.Builder.Where(x => x.Key == key);
|
||||
return repository.GetByQuery(query).SingleOrDefault();
|
||||
}
|
||||
// the repository implements a cache policy on int identifiers, not guids,
|
||||
// and we are not changing it now, but we still would like to rely on caching
|
||||
// instead of running a full query against the database, so relying on the
|
||||
// id-key map, which is fast.
|
||||
//
|
||||
// we should inject the id-key map but ... breaking changes ... yada
|
||||
|
||||
var a = _idkMap.GetIdForKey(key, UmbracoObjectTypes.Media);
|
||||
return a.Success ? GetById(a.Result) : null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -692,11 +697,11 @@ namespace Umbraco.Core.Services
|
||||
}
|
||||
|
||||
Func<string, Sql> createSql = url => new Sql().Select("*")
|
||||
.From<PropertyDataDto>()
|
||||
.InnerJoin<PropertyTypeDto>()
|
||||
.On<PropertyDataDto, PropertyTypeDto>(left => left.PropertyTypeId, right => right.Id)
|
||||
.Where<PropertyTypeDto>(x => x.Alias == "umbracoFile")
|
||||
.Where<PropertyDataDto>(x => x.VarChar == url);
|
||||
.From<PropertyDataDto>()
|
||||
.InnerJoin<PropertyTypeDto>()
|
||||
.On<PropertyDataDto, PropertyTypeDto>(left => left.PropertyTypeId, right => right.Id)
|
||||
.Where<PropertyTypeDto>(x => x.Alias == "umbracoFile")
|
||||
.Where<PropertyDataDto>(x => x.VarChar == url);
|
||||
|
||||
var sql = createSql(umbracoFileValue);
|
||||
|
||||
@@ -900,7 +905,13 @@ namespace Umbraco.Core.Services
|
||||
}
|
||||
|
||||
var repository = RepositoryFactory.CreateMediaRepository(uow);
|
||||
media.CreatorId = userId;
|
||||
|
||||
//set the creator id if it's new
|
||||
if (media.HasIdentity == false)
|
||||
{
|
||||
media.CreatorId = userId;
|
||||
}
|
||||
|
||||
repository.AddOrUpdate(media);
|
||||
repository.AddOrUpdateContentXml(media, m => _entitySerializer.Serialize(this, _dataTypeService, _userService, m));
|
||||
// generate preview for blame history?
|
||||
@@ -1048,7 +1059,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="userId">Optional id of the user deleting the media</param>
|
||||
public void DeleteMediaOfType(int mediaTypeId, int userId = 0)
|
||||
{
|
||||
DeleteMediaOfTypes(new[] {mediaTypeId}, userId);
|
||||
DeleteMediaOfTypes(new[] { mediaTypeId }, userId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -826,6 +826,22 @@ namespace Umbraco.Core.Services
|
||||
return CreateMemberWithIdentity(username, email, username, passwordValue, memberType);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates and persists a new <see cref="IMember"/>
|
||||
/// </summary>
|
||||
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
|
||||
/// <param name="username">Username of the <see cref="IMembershipUser"/> to create</param>
|
||||
/// <param name="email">Email of the <see cref="IMembershipUser"/> to create</param>
|
||||
/// <param name="passwordValue">This value should be the encoded/encrypted/hashed value for the password that will be stored in the database</param>
|
||||
/// <param name="memberTypeAlias">Alias of the Type</param>
|
||||
/// <param name="isApproved">Is the member approved</param>
|
||||
/// <returns><see cref="IMember"/></returns>
|
||||
IMember IMembershipMemberService<IMember>.CreateWithIdentity(string username, string email, string passwordValue, string memberTypeAlias, bool isApproved)
|
||||
{
|
||||
var memberType = FindMemberTypeByAlias(memberTypeAlias);
|
||||
return CreateMemberWithIdentity(username, email, username, passwordValue, memberType, isApproved);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates and persists a Member
|
||||
/// </summary>
|
||||
@@ -836,12 +852,13 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="name">Name of the Member to create</param>
|
||||
/// <param name="passwordValue">This value should be the encoded/encrypted/hashed value for the password that will be stored in the database</param>
|
||||
/// <param name="memberType">MemberType the Member should be based on</param>
|
||||
/// <param name="isApproved">Optional IsApproved of the Member to create</param>
|
||||
/// <returns><see cref="IMember"/></returns>
|
||||
private IMember CreateMemberWithIdentity(string username, string email, string name, string passwordValue, IMemberType memberType)
|
||||
private IMember CreateMemberWithIdentity(string username, string email, string name, string passwordValue, IMemberType memberType, bool isApproved = true)
|
||||
{
|
||||
if (memberType == null) throw new ArgumentNullException("memberType");
|
||||
|
||||
var member = new Member(name, email.ToLower().Trim(), username, passwordValue, memberType);
|
||||
var member = new Member(name, email.ToLower().Trim(), username, passwordValue, memberType, isApproved);
|
||||
|
||||
using (var uow = UowProvider.GetUnitOfWork())
|
||||
{
|
||||
|
||||
@@ -89,18 +89,18 @@ namespace Umbraco.Core.Services
|
||||
/// <returns></returns>
|
||||
public string FetchPackageFile(Guid packageId, Version umbracoVersion, int userId)
|
||||
{
|
||||
var packageRepo = UmbracoConfig.For.UmbracoSettings().PackageRepositories.GetDefault();
|
||||
var packageRepo = UmbracoConfig.For.UmbracoSettings().PackageRepositories.GetDefault();
|
||||
|
||||
using (var httpClient = new HttpClient())
|
||||
using (var uow = _uowProvider.GetUnitOfWork())
|
||||
{
|
||||
{
|
||||
//includeHidden = true because we don't care if it's hidden we want to get the file regardless
|
||||
var url = string.Format("{0}/{1}?version={2}&includeHidden=true&asFile=true", packageRepo.RestApiUrl, packageId, umbracoVersion.ToString(3));
|
||||
byte[] bytes;
|
||||
try
|
||||
{
|
||||
bytes = httpClient.GetByteArrayAsync(url).GetAwaiter().GetResult();
|
||||
}
|
||||
try
|
||||
{
|
||||
bytes = httpClient.GetByteArrayAsync(url).GetAwaiter().GetResult();
|
||||
}
|
||||
catch (HttpRequestException ex)
|
||||
{
|
||||
throw new ConnectionException("An error occuring downloading the package from " + url, ex);
|
||||
@@ -109,20 +109,20 @@ namespace Umbraco.Core.Services
|
||||
//successfull
|
||||
if (bytes.Length > 0)
|
||||
{
|
||||
var packagePath = IOHelper.MapPath(SystemDirectories.Packages);
|
||||
var packagePath = IOHelper.MapPath(SystemDirectories.Packages);
|
||||
|
||||
// Check for package directory
|
||||
if (Directory.Exists(packagePath) == false)
|
||||
Directory.CreateDirectory(packagePath);
|
||||
|
||||
var packageFilePath = Path.Combine(packagePath, packageId + ".umb");
|
||||
var packageFilePath = Path.Combine(packagePath, packageId + ".umb");
|
||||
|
||||
using (var fs1 = new FileStream(packageFilePath, FileMode.Create))
|
||||
{
|
||||
fs1.Write(bytes, 0, bytes.Length);
|
||||
return "packages\\" + packageId + ".umb";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Audit(uow, AuditType.PackagerInstall, string.Format("Package {0} fetched from {1}", packageId, packageRepo.Id), userId, -1);
|
||||
return null;
|
||||
@@ -133,7 +133,7 @@ namespace Umbraco.Core.Services
|
||||
{
|
||||
var auditRepo = _repositoryFactory.CreateAuditRepository(uow);
|
||||
auditRepo.AddOrUpdate(new AuditItem(objectId, message, type, userId));
|
||||
}
|
||||
}
|
||||
|
||||
#region Content
|
||||
|
||||
@@ -285,6 +285,7 @@ namespace Umbraco.Core.Services
|
||||
var nodeName = element.Attribute("nodeName").Value;
|
||||
var path = element.Attribute("path").Value;
|
||||
var template = element.Attribute("template").Value;
|
||||
var key = Guid.Empty;
|
||||
|
||||
var properties = from property in element.Elements()
|
||||
where property.Attribute("isDoc") == null
|
||||
@@ -302,6 +303,12 @@ namespace Umbraco.Core.Services
|
||||
SortOrder = int.Parse(sortOrder)
|
||||
};
|
||||
|
||||
if (element.Attribute("key") != null && Guid.TryParse(element.Attribute("key").Value, out key))
|
||||
{
|
||||
// update the Guid (for UDI support)
|
||||
content.Key = key;
|
||||
}
|
||||
|
||||
foreach (var property in properties)
|
||||
{
|
||||
string propertyTypeAlias = isLegacySchema ? property.Attribute("alias").Value : property.Name.LocalName;
|
||||
@@ -520,7 +527,7 @@ namespace Umbraco.Core.Services
|
||||
{
|
||||
var foldersAttribute = documentType.Attribute("Folders");
|
||||
var infoElement = documentType.Element("Info");
|
||||
if (foldersAttribute != null && infoElement != null
|
||||
if (foldersAttribute != null && infoElement != null
|
||||
//don't import any folder if this is a child doc type - the parent doc type will need to
|
||||
//exist which contains it's folders
|
||||
&& ((string)infoElement.Element("Master")).IsNullOrWhiteSpace())
|
||||
@@ -1041,7 +1048,7 @@ namespace Umbraco.Core.Services
|
||||
{
|
||||
_logger.Error<PackagingService>("Could not create folder: " + rootFolder, tryCreateFolder.Exception);
|
||||
throw tryCreateFolder.Exception;
|
||||
}
|
||||
}
|
||||
current = _dataTypeService.GetContainer(tryCreateFolder.Result.Entity.Id);
|
||||
}
|
||||
|
||||
@@ -1091,14 +1098,14 @@ namespace Umbraco.Core.Services
|
||||
if (dataTypeDefinition != null)
|
||||
{
|
||||
var valuesWithoutKeys = prevaluesElement.Elements("PreValue")
|
||||
.Where(x => ((string) x.Attribute("Alias")).IsNullOrWhiteSpace())
|
||||
.Where(x => ((string)x.Attribute("Alias")).IsNullOrWhiteSpace())
|
||||
.Select(x => x.Attribute("Value").Value);
|
||||
|
||||
var valuesWithKeys = prevaluesElement.Elements("PreValue")
|
||||
.Where(x => ((string) x.Attribute("Alias")).IsNullOrWhiteSpace() == false)
|
||||
.Where(x => ((string)x.Attribute("Alias")).IsNullOrWhiteSpace() == false)
|
||||
.ToDictionary(
|
||||
key => (string) key.Attribute("Alias"),
|
||||
val => new PreValue((string) val.Attribute("Value")));
|
||||
key => (string)key.Attribute("Alias"),
|
||||
val => new PreValue((string)val.Attribute("Value")));
|
||||
|
||||
//save the values with keys
|
||||
_dataTypeService.SavePreValues(dataTypeDefinition, valuesWithKeys);
|
||||
@@ -1956,12 +1963,12 @@ namespace Umbraco.Core.Services
|
||||
/// <summary>
|
||||
/// Occurs after a package is imported
|
||||
/// </summary>
|
||||
internal static event TypedEventHandler<IPackagingService, ImportPackageEventArgs<InstallationSummary>> ImportedPackage;
|
||||
public static event TypedEventHandler<IPackagingService, ImportPackageEventArgs<InstallationSummary>> ImportedPackage;
|
||||
|
||||
/// <summary>
|
||||
/// Occurs after a package is uninstalled
|
||||
/// </summary>
|
||||
internal static event TypedEventHandler<IPackagingService, UninstallPackageEventArgs<UninstallationSummary>> UninstalledPackage;
|
||||
public static event TypedEventHandler<IPackagingService, UninstallPackageEventArgs<UninstallationSummary>> UninstalledPackage;
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -63,6 +63,8 @@ namespace Umbraco.Core.Services
|
||||
private Lazy<IExternalLoginService> _externalLoginService;
|
||||
private Lazy<IRedirectUrlService> _redirectUrlService;
|
||||
|
||||
internal IdkMap IdkMap { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// public ctor - will generally just be used for unit testing all items are optional and if not specified, the defaults will be used
|
||||
/// </summary>
|
||||
@@ -171,9 +173,11 @@ namespace Umbraco.Core.Services
|
||||
|
||||
EventMessagesFactory = eventMessagesFactory;
|
||||
|
||||
IdkMap = new IdkMap(provider);
|
||||
|
||||
BuildServiceCache(provider, cache,
|
||||
repositoryFactory,
|
||||
logger, eventMessagesFactory);
|
||||
logger, eventMessagesFactory, IdkMap);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -184,7 +188,8 @@ namespace Umbraco.Core.Services
|
||||
CacheHelper cache,
|
||||
RepositoryFactory repositoryFactory,
|
||||
ILogger logger,
|
||||
IEventMessagesFactory eventMessagesFactory)
|
||||
IEventMessagesFactory eventMessagesFactory,
|
||||
IdkMap idkMap)
|
||||
{
|
||||
EventMessagesFactory = eventMessagesFactory;
|
||||
|
||||
@@ -256,10 +261,10 @@ namespace Umbraco.Core.Services
|
||||
_memberService = new Lazy<IMemberService>(() => new MemberService(provider, repositoryFactory, logger, eventMessagesFactory, _memberGroupService.Value, _dataTypeService.Value));
|
||||
|
||||
if (_contentService == null)
|
||||
_contentService = new Lazy<IContentService>(() => new ContentService(provider, repositoryFactory, logger, eventMessagesFactory, _dataTypeService.Value, _userService.Value));
|
||||
_contentService = new Lazy<IContentService>(() => new ContentService(provider, repositoryFactory, logger, eventMessagesFactory, _dataTypeService.Value, _userService.Value, idkMap));
|
||||
|
||||
if (_mediaService == null)
|
||||
_mediaService = new Lazy<IMediaService>(() => new MediaService(provider, repositoryFactory, logger, eventMessagesFactory, _dataTypeService.Value, _userService.Value));
|
||||
_mediaService = new Lazy<IMediaService>(() => new MediaService(provider, repositoryFactory, logger, eventMessagesFactory, _dataTypeService.Value, _userService.Value, idkMap));
|
||||
|
||||
if (_contentTypeService == null)
|
||||
_contentTypeService = new Lazy<IContentTypeService>(() => new ContentTypeService(provider, repositoryFactory, logger, eventMessagesFactory, _contentService.Value, _mediaService.Value));
|
||||
@@ -277,8 +282,7 @@ namespace Umbraco.Core.Services
|
||||
_entityService = new Lazy<IEntityService>(() => new EntityService(
|
||||
provider, repositoryFactory, logger, eventMessagesFactory,
|
||||
_contentService.Value, _contentTypeService.Value, _mediaService.Value, _dataTypeService.Value, _memberService.Value, _memberTypeService.Value,
|
||||
//TODO: Consider making this an isolated cache instead of using the global one
|
||||
cache.RuntimeCache));
|
||||
idkMap));
|
||||
|
||||
if (_packagingService == null)
|
||||
_packagingService = new Lazy<IPackagingService>(() => new PackagingService(logger, _contentService.Value, _contentTypeService.Value, _mediaService.Value, _macroService.Value, _dataTypeService.Value, _fileService.Value, _localizationService.Value, _entityService.Value, _userService.Value, repositoryFactory, provider));
|
||||
|
||||
@@ -19,7 +19,6 @@ namespace Umbraco.Core.Services
|
||||
/// </summary>
|
||||
public class UserService : ScopeRepositoryService, IUserService
|
||||
{
|
||||
|
||||
//TODO: We need to change the isUpgrading flag to use an app state enum as described here: http://issues.umbraco.org/issue/U4-6816
|
||||
// in the meantime, we will use a boolean which we are currently using during upgrades to ensure that a user object is not persisted during this phase, otherwise
|
||||
// exceptions can occur if the db is not in it's correct state.
|
||||
@@ -113,6 +112,26 @@ namespace Umbraco.Core.Services
|
||||
return CreateUserWithIdentity(username, email, passwordValue, userType);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates and persists a new <see cref="IUser"/>
|
||||
/// </summary>
|
||||
/// <param name="username">Username of the <see cref="IUser"/> to create</param>
|
||||
/// <param name="email">Email of the <see cref="IUser"/> to create</param>
|
||||
/// <param name="passwordValue">This value should be the encoded/encrypted/hashed value for the password that will be stored in the database</param>
|
||||
/// <param name="memberTypeAlias">Alias of the Type</param>
|
||||
/// <param name="isApproved">Is the member approved</param>
|
||||
/// <returns><see cref="IUser"/></returns>
|
||||
IUser IMembershipMemberService<IUser>.CreateWithIdentity(string username, string email, string passwordValue, string memberTypeAlias, bool isApproved)
|
||||
{
|
||||
var userType = GetUserTypeByAlias(memberTypeAlias);
|
||||
if (userType == null)
|
||||
{
|
||||
throw new EntityNotFoundException("The user type " + memberTypeAlias + " could not be resolved");
|
||||
}
|
||||
|
||||
return CreateUserWithIdentity(username, email, passwordValue, userType, isApproved);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates and persists a Member
|
||||
/// </summary>
|
||||
@@ -122,8 +141,9 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="email">Email of the Member to create</param>
|
||||
/// <param name="passwordValue">This value should be the encoded/encrypted/hashed value for the password that will be stored in the database</param>
|
||||
/// <param name="userType">MemberType the Member should be based on</param>
|
||||
/// <param name="isApproved">Is the user approved</param>
|
||||
/// <returns><see cref="IUser"/></returns>
|
||||
private IUser CreateUserWithIdentity(string username, string email, string passwordValue, IUserType userType)
|
||||
private IUser CreateUserWithIdentity(string username, string email, string passwordValue, IUserType userType, bool isApproved = true)
|
||||
{
|
||||
if (userType == null) throw new ArgumentNullException("userType");
|
||||
|
||||
@@ -152,7 +172,7 @@ namespace Umbraco.Core.Services
|
||||
StartContentId = -1,
|
||||
StartMediaId = -1,
|
||||
IsLockedOut = false,
|
||||
IsApproved = true
|
||||
IsApproved = isApproved
|
||||
};
|
||||
//adding default sections content and media
|
||||
user.AddAllowedSection("content");
|
||||
|
||||
@@ -701,67 +701,72 @@ namespace Umbraco.Core
|
||||
return val;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Generates a hash of a string based on the FIPS compliance setting.
|
||||
/// </summary>
|
||||
/// <param name="str">Referrs to itself</param>
|
||||
/// <returns>The hashed string</returns>
|
||||
public static string GenerateHash(this string str)
|
||||
{
|
||||
return CryptoConfig.AllowOnlyFipsAlgorithms
|
||||
? str.ToSHA1()
|
||||
: str.ToMd5();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts the string to MD5
|
||||
/// </summary>
|
||||
/// <param name="stringToConvert">referrs to itself</param>
|
||||
/// <returns>the md5 hashed string</returns>
|
||||
/// <param name="stringToConvert">Referrs to itself</param>
|
||||
/// <returns>The MD5 hashed string</returns>
|
||||
public static string ToMd5(this string stringToConvert)
|
||||
{
|
||||
//create an instance of the MD5CryptoServiceProvider
|
||||
var md5Provider = new MD5CryptoServiceProvider();
|
||||
|
||||
//convert our string into byte array
|
||||
var byteArray = Encoding.UTF8.GetBytes(stringToConvert);
|
||||
|
||||
//get the hashed values created by our MD5CryptoServiceProvider
|
||||
var hashedByteArray = md5Provider.ComputeHash(byteArray);
|
||||
|
||||
//create a StringBuilder object
|
||||
var stringBuilder = new StringBuilder();
|
||||
|
||||
//loop to each each byte
|
||||
foreach (var b in hashedByteArray)
|
||||
{
|
||||
//append it to our StringBuilder
|
||||
stringBuilder.Append(b.ToString("x2").ToLower());
|
||||
}
|
||||
|
||||
//return the hashed value
|
||||
return stringBuilder.ToString();
|
||||
return stringToConvert.GenerateHash("MD5");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts the string to SHA1
|
||||
/// </summary>
|
||||
/// <param name="stringToConvert">referrs to itself</param>
|
||||
/// <returns>the md5 hashed string</returns>
|
||||
/// <returns>The SHA1 hashed string</returns>
|
||||
public static string ToSHA1(this string stringToConvert)
|
||||
{
|
||||
//create an instance of the SHA1CryptoServiceProvider
|
||||
var md5Provider = new SHA1CryptoServiceProvider();
|
||||
|
||||
//convert our string into byte array
|
||||
var byteArray = Encoding.UTF8.GetBytes(stringToConvert);
|
||||
|
||||
//get the hashed values created by our SHA1CryptoServiceProvider
|
||||
var hashedByteArray = md5Provider.ComputeHash(byteArray);
|
||||
|
||||
//create a StringBuilder object
|
||||
var stringBuilder = new StringBuilder();
|
||||
|
||||
//loop to each each byte
|
||||
foreach (var b in hashedByteArray)
|
||||
{
|
||||
//append it to our StringBuilder
|
||||
stringBuilder.Append(b.ToString("x2").ToLower());
|
||||
}
|
||||
|
||||
//return the hashed value
|
||||
return stringBuilder.ToString();
|
||||
return stringToConvert.GenerateHash("SHA1");
|
||||
}
|
||||
|
||||
|
||||
/// <summary>Generate a hash of a string based on the hashType passed in
|
||||
/// </summary>
|
||||
/// <param name="str">Referrs to itself</param>
|
||||
/// <param name="hashType">String with the hash type. See remarks section of the CryptoConfig Class in MSDN docs for a list of possible values.</param>
|
||||
/// <returns>The hashed string</returns>
|
||||
private static string GenerateHash(this string str, string hashType)
|
||||
{
|
||||
//create an instance of the correct hashing provider based on the type passed in
|
||||
var hasher = HashAlgorithm.Create(hashType);
|
||||
if (hasher == null) throw new InvalidOperationException("No hashing type found by name " + hashType);
|
||||
using (hasher)
|
||||
{
|
||||
//convert our string into byte array
|
||||
var byteArray = Encoding.UTF8.GetBytes(str);
|
||||
|
||||
//get the hashed values created by our selected provider
|
||||
var hashedByteArray = hasher.ComputeHash(byteArray);
|
||||
|
||||
//create a StringBuilder object
|
||||
var stringBuilder = new StringBuilder();
|
||||
|
||||
//loop to each each byte
|
||||
foreach (var b in hashedByteArray)
|
||||
{
|
||||
//append it to our StringBuilder
|
||||
stringBuilder.Append(b.ToString("x2").ToLower());
|
||||
}
|
||||
|
||||
//return the hashed value
|
||||
return stringBuilder.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Decodes a string that was encoded with UrlTokenEncode
|
||||
/// </summary>
|
||||
@@ -1465,10 +1470,84 @@ namespace Umbraco.Core
|
||||
/// <returns></returns>
|
||||
internal static Guid ToGuid(this string text)
|
||||
{
|
||||
var md5 = MD5.Create();
|
||||
byte[] myStringBytes = Encoding.ASCII.GetBytes(text);
|
||||
byte[] hash = md5.ComputeHash(myStringBytes);
|
||||
return new Guid(hash);
|
||||
return CreateGuidFromHash(UrlNamespace,
|
||||
text,
|
||||
CryptoConfig.AllowOnlyFipsAlgorithms
|
||||
? 5 // SHA1
|
||||
: 3); // MD5
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The namespace for URLs (from RFC 4122, Appendix C).
|
||||
///
|
||||
/// See <a href="http://www.ietf.org/rfc/rfc4122.txt">RFC 4122</a>
|
||||
/// </summary>
|
||||
internal static readonly Guid UrlNamespace = new Guid("6ba7b811-9dad-11d1-80b4-00c04fd430c8");
|
||||
|
||||
/// <summary>
|
||||
/// Creates a name-based UUID using the algorithm from RFC 4122 §4.3.
|
||||
///
|
||||
/// See <a href="https://github.com/LogosBible/Logos.Utility/blob/master/src/Logos.Utility/GuidUtility.cs#L34">GuidUtility.cs</a> for original implementation.
|
||||
/// </summary>
|
||||
/// <param name="namespaceId">The ID of the namespace.</param>
|
||||
/// <param name="name">The name (within that namespace).</param>
|
||||
/// <param name="version">The version number of the UUID to create; this value must be either
|
||||
/// 3 (for MD5 hashing) or 5 (for SHA-1 hashing).</param>
|
||||
/// <returns>A UUID derived from the namespace and name.</returns>
|
||||
/// <remarks>See <a href="http://code.logos.com/blog/2011/04/generating_a_deterministic_guid.html">Generating a deterministic GUID</a>.</remarks>
|
||||
internal static Guid CreateGuidFromHash(Guid namespaceId, string name, int version)
|
||||
{
|
||||
if (name == null)
|
||||
throw new ArgumentNullException("name");
|
||||
if (version != 3 && version != 5)
|
||||
throw new ArgumentOutOfRangeException("version", "version must be either 3 or 5.");
|
||||
|
||||
// convert the name to a sequence of octets (as defined by the standard or conventions of its namespace) (step 3)
|
||||
// ASSUME: UTF-8 encoding is always appropriate
|
||||
byte[] nameBytes = Encoding.UTF8.GetBytes(name);
|
||||
|
||||
// convert the namespace UUID to network order (step 3)
|
||||
byte[] namespaceBytes = namespaceId.ToByteArray();
|
||||
SwapByteOrder(namespaceBytes);
|
||||
|
||||
// comput the hash of the name space ID concatenated with the name (step 4)
|
||||
byte[] hash;
|
||||
using (HashAlgorithm algorithm = version == 3 ? (HashAlgorithm)MD5.Create() : SHA1.Create())
|
||||
{
|
||||
algorithm.TransformBlock(namespaceBytes, 0, namespaceBytes.Length, null, 0);
|
||||
algorithm.TransformFinalBlock(nameBytes, 0, nameBytes.Length);
|
||||
hash = algorithm.Hash;
|
||||
}
|
||||
|
||||
// most bytes from the hash are copied straight to the bytes of the new GUID (steps 5-7, 9, 11-12)
|
||||
byte[] newGuid = new byte[16];
|
||||
Array.Copy(hash, 0, newGuid, 0, 16);
|
||||
|
||||
// set the four most significant bits (bits 12 through 15) of the time_hi_and_version field to the appropriate 4-bit version number from Section 4.1.3 (step 8)
|
||||
newGuid[6] = (byte)((newGuid[6] & 0x0F) | (version << 4));
|
||||
|
||||
// set the two most significant bits (bits 6 and 7) of the clock_seq_hi_and_reserved to zero and one, respectively (step 10)
|
||||
newGuid[8] = (byte)((newGuid[8] & 0x3F) | 0x80);
|
||||
|
||||
// convert the resulting UUID to local byte order (step 13)
|
||||
SwapByteOrder(newGuid);
|
||||
return new Guid(newGuid);
|
||||
}
|
||||
|
||||
// Converts a GUID (expressed as a byte array) to/from network order (MSB-first).
|
||||
internal static void SwapByteOrder(byte[] guid)
|
||||
{
|
||||
SwapBytes(guid, 0, 3);
|
||||
SwapBytes(guid, 1, 2);
|
||||
SwapBytes(guid, 4, 5);
|
||||
SwapBytes(guid, 6, 7);
|
||||
}
|
||||
|
||||
private static void SwapBytes(byte[] guid, int left, int right)
|
||||
{
|
||||
byte temp = guid[left];
|
||||
guid[left] = guid[right];
|
||||
guid[right] = temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
|
||||
namespace Umbraco.Core
|
||||
{
|
||||
@@ -20,7 +21,7 @@ namespace Umbraco.Core
|
||||
/// <param name="entityType">The entity type part of the udi.</param>
|
||||
/// <param name="id">The string id part of the udi.</param>
|
||||
public StringUdi(string entityType, string id)
|
||||
: base(entityType, "umb://" + entityType + "/" + Uri.EscapeUriString(id))
|
||||
: base(entityType, "umb://" + entityType + "/" + EscapeUriString(id))
|
||||
{
|
||||
Id = id;
|
||||
}
|
||||
@@ -35,6 +36,19 @@ namespace Umbraco.Core
|
||||
Id = Uri.UnescapeDataString(uriValue.AbsolutePath.TrimStart('/'));
|
||||
}
|
||||
|
||||
private static string EscapeUriString(string s)
|
||||
{
|
||||
// Uri.EscapeUriString preserves / but also [ and ] which is bad
|
||||
// Uri.EscapeDataString does not preserve / which is bad
|
||||
|
||||
// reserved = : / ? # [ ] @ ! $ & ' ( ) * + , ; =
|
||||
// unreserved = alpha digit - . _ ~
|
||||
|
||||
// we want to preserve the / and the unreserved
|
||||
// so...
|
||||
return string.Join("/", s.Split('/').Select(Uri.EscapeDataString));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts the string representation of an entity identifier into the equivalent StringUdi instance.
|
||||
/// </summary>
|
||||
|
||||
@@ -68,7 +68,7 @@ namespace Umbraco.Core.Strings
|
||||
/// <summary>
|
||||
/// Flag mask for encoding.
|
||||
/// </summary>
|
||||
CodeMask = Unicode | Utf8 | Ascii,
|
||||
CodeMask = Unicode | Utf8 | Ascii | TryAscii,
|
||||
|
||||
/// <summary>
|
||||
/// Unicode encoding.
|
||||
@@ -86,6 +86,10 @@ namespace Umbraco.Core.Strings
|
||||
/// </summary>
|
||||
Ascii = 0x0400,
|
||||
|
||||
/// <summary>
|
||||
/// Ascii encoding, if possible.
|
||||
/// </summary>
|
||||
TryAscii = 0x0800,
|
||||
|
||||
// role values
|
||||
|
||||
|
||||
@@ -152,12 +152,18 @@ namespace Umbraco.Core.Strings
|
||||
/// <returns>The short string helper.</returns>
|
||||
public DefaultShortStringHelper WithDefaultConfig()
|
||||
{
|
||||
var urlSegmentConvertTo = CleanStringType.Utf8;
|
||||
if (_umbracoSettings.RequestHandler.ConvertUrlsToAscii)
|
||||
urlSegmentConvertTo = CleanStringType.Ascii;
|
||||
if (_umbracoSettings.RequestHandler.TryConvertUrlsToAscii)
|
||||
urlSegmentConvertTo = CleanStringType.TryAscii;
|
||||
|
||||
return WithConfig(CleanStringType.UrlSegment, new Config
|
||||
{
|
||||
PreFilter = ApplyUrlReplaceCharacters,
|
||||
PostFilter = x => CutMaxLength(x, 240),
|
||||
IsTerm = (c, leading) => char.IsLetterOrDigit(c) || c == '_', // letter, digit or underscore
|
||||
StringType = (_umbracoSettings.RequestHandler.ConvertUrlsToAscii ? CleanStringType.Ascii : CleanStringType.Utf8) | CleanStringType.LowerCase,
|
||||
StringType = urlSegmentConvertTo | CleanStringType.LowerCase,
|
||||
BreakTermsOnUpper = false,
|
||||
Separator = '-'
|
||||
}).WithConfig(CleanStringType.FileName, new Config
|
||||
@@ -542,9 +548,20 @@ function validateSafeAlias(input, value, immediate, callback) {{
|
||||
|
||||
// recode
|
||||
var codeType = stringType & CleanStringType.CodeMask;
|
||||
text = codeType == CleanStringType.Ascii
|
||||
? Utf8ToAsciiConverter.ToAsciiString(text)
|
||||
: RemoveSurrogatePairs(text);
|
||||
switch (codeType)
|
||||
{
|
||||
case CleanStringType.Ascii:
|
||||
text = Utf8ToAsciiConverter.ToAsciiString(text);
|
||||
break;
|
||||
case CleanStringType.TryAscii:
|
||||
const char ESC = (char) 27;
|
||||
var ctext = Utf8ToAsciiConverter.ToAsciiString(text, ESC);
|
||||
if (ctext.Contains(ESC) == false) text = ctext;
|
||||
break;
|
||||
default:
|
||||
text = RemoveSurrogatePairs(text);
|
||||
break;
|
||||
}
|
||||
|
||||
// clean
|
||||
text = CleanCodeString(text, stringType, separator.Value, culture, config);
|
||||
|
||||
@@ -17,8 +17,9 @@ namespace Umbraco.Core.Strings
|
||||
/// Converts an Utf8 string into an Ascii string.
|
||||
/// </summary>
|
||||
/// <param name="text">The text to convert.</param>
|
||||
/// <param name="fail">The character to used to replace characters that cannot properly be converted.</param>
|
||||
/// <returns>The converted text.</returns>
|
||||
public static string ToAsciiString(string text)
|
||||
public static string ToAsciiString(string text, char fail = '?')
|
||||
{
|
||||
var input = text.ToCharArray();
|
||||
|
||||
@@ -26,7 +27,7 @@ namespace Umbraco.Core.Strings
|
||||
// but... we should be filtering short strings only...
|
||||
|
||||
var output = new char[input.Length * 3]; // *3 because of things such as OE
|
||||
var len = ToAscii(input, output);
|
||||
var len = ToAscii(input, output, fail);
|
||||
return new string(output, 0, len);
|
||||
|
||||
//var output = new StringBuilder(input.Length + 16); // default is 16, start with at least input length + little extra
|
||||
@@ -38,8 +39,9 @@ namespace Umbraco.Core.Strings
|
||||
/// Converts an Utf8 string into an array of Ascii characters.
|
||||
/// </summary>
|
||||
/// <param name="text">The text to convert.</param>
|
||||
/// <param name="fail">The character to used to replace characters that cannot properly be converted.</param>
|
||||
/// <returns>The converted text.</returns>
|
||||
public static char[] ToAsciiCharArray(string text)
|
||||
public static char[] ToAsciiCharArray(string text, char fail = '?')
|
||||
{
|
||||
var input = text.ToCharArray();
|
||||
|
||||
@@ -47,7 +49,7 @@ namespace Umbraco.Core.Strings
|
||||
// but... we should be filtering short strings only...
|
||||
|
||||
var output = new char[input.Length * 3]; // *3 because of things such as OE
|
||||
var len = ToAscii(input, output);
|
||||
var len = ToAscii(input, output, fail);
|
||||
var array = new char[len];
|
||||
Array.Copy(output, array, len);
|
||||
return array;
|
||||
@@ -64,10 +66,11 @@ namespace Umbraco.Core.Strings
|
||||
/// </summary>
|
||||
/// <param name="input">The input array.</param>
|
||||
/// <param name="output">The output array.</param>
|
||||
/// <param name="fail">The character to used to replace characters that cannot properly be converted.</param>
|
||||
/// <returns>The number of characters in the output array.</returns>
|
||||
/// <remarks>The caller must ensure that the output array is big enough.</remarks>
|
||||
/// <exception cref="OverflowException">The output array is not big enough.</exception>
|
||||
private static int ToAscii(char[] input, char[] output)
|
||||
private static int ToAscii(char[] input, char[] output, char fail = '?')
|
||||
{
|
||||
var opos = 0;
|
||||
|
||||
@@ -75,10 +78,10 @@ namespace Umbraco.Core.Strings
|
||||
if (char.IsSurrogate(input[ipos])) // ignore high surrogate
|
||||
{
|
||||
ipos++; // and skip low surrogate
|
||||
output[opos++] = '?';
|
||||
output[opos++] = fail;
|
||||
}
|
||||
else
|
||||
ToAscii(input, ipos, output, ref opos);
|
||||
ToAscii(input, ipos, output, ref opos, fail);
|
||||
|
||||
return opos;
|
||||
}
|
||||
@@ -109,12 +112,13 @@ namespace Umbraco.Core.Strings
|
||||
/// <param name="ipos">The input position.</param>
|
||||
/// <param name="output">The output array.</param>
|
||||
/// <param name="opos">The output position.</param>
|
||||
/// <param name="fail">The character to used to replace characters that cannot properly be converted.</param>
|
||||
/// <remarks>
|
||||
/// <para>Adapted from various sources on the 'net including <c>Lucene.Net.Analysis.ASCIIFoldingFilter</c>.</para>
|
||||
/// <para>Input should contain Utf8 characters exclusively and NOT Unicode.</para>
|
||||
/// <para>Removes controls, normalizes whitespaces, replaces symbols by '?'.</para>
|
||||
/// </remarks>
|
||||
private static void ToAscii(char[] input, int ipos, char[] output, ref int opos)
|
||||
private static void ToAscii(char[] input, int ipos, char[] output, ref int opos, char fail = '?')
|
||||
{
|
||||
var c = input[ipos];
|
||||
|
||||
@@ -3583,7 +3587,7 @@ namespace Umbraco.Core.Strings
|
||||
// output[opos++] = c;
|
||||
|
||||
// strict ASCII
|
||||
output[opos++] = '?';
|
||||
output[opos++] = fail;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.Web;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Configuration.UmbracoSettings;
|
||||
using Umbraco.Core.IO;
|
||||
using Umbraco.Core.Logging;
|
||||
|
||||
namespace Umbraco.Core.Sync
|
||||
{
|
||||
@@ -40,8 +41,9 @@ namespace Umbraco.Core.Sync
|
||||
.ToList();
|
||||
|
||||
if (serversA.Length == 0)
|
||||
{
|
||||
{
|
||||
_serverRole = ServerRole.Unknown; // config error, actually
|
||||
LogHelper.Debug<ConfigServerRegistrar>(string.Format("Server Role Unknown: DistributedCalls are enabled but no servers are listed"));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -50,7 +52,10 @@ namespace Umbraco.Core.Sync
|
||||
var serverName = master.ServerName;
|
||||
|
||||
if (appId.IsNullOrWhiteSpace() && serverName.IsNullOrWhiteSpace())
|
||||
{
|
||||
_serverRole = ServerRole.Unknown; // config error, actually
|
||||
LogHelper.Debug<ConfigServerRegistrar>(string.Format("Server Role Unknown: Server Name or AppId missing from Server configuration in DistributedCalls settings"));
|
||||
}
|
||||
else
|
||||
_serverRole = IsCurrentServer(appId, serverName)
|
||||
? ServerRole.Master
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core.Models;
|
||||
|
||||
namespace Umbraco.Core
|
||||
@@ -70,6 +69,10 @@ namespace Umbraco.Core
|
||||
[UdiType(UdiType.StringUdi)]
|
||||
public const string AnyString = "any-string"; // that one is for tests
|
||||
|
||||
[UdiType(UdiType.StringUdi)]
|
||||
public const string Language = "language";
|
||||
[UdiType(UdiType.StringUdi)]
|
||||
public const string MacroScript = "macroscript";
|
||||
[UdiType(UdiType.StringUdi)]
|
||||
public const string MediaFile = "media-file";
|
||||
[UdiType(UdiType.StringUdi)]
|
||||
@@ -83,6 +86,8 @@ namespace Umbraco.Core
|
||||
[UdiType(UdiType.StringUdi)]
|
||||
public const string PartialViewMacro = "partial-view-macro";
|
||||
[UdiType(UdiType.StringUdi)]
|
||||
public const string UserControl = "usercontrol";
|
||||
[UdiType(UdiType.StringUdi)]
|
||||
public const string Xslt = "xslt";
|
||||
|
||||
public static string FromUmbracoObjectType(UmbracoObjectTypes umbracoObjectType)
|
||||
@@ -123,6 +128,8 @@ namespace Umbraco.Core
|
||||
return FormsPreValue;
|
||||
case UmbracoObjectTypes.FormsDataSource:
|
||||
return FormsDataSource;
|
||||
case UmbracoObjectTypes.Language:
|
||||
return Language;
|
||||
}
|
||||
throw new NotSupportedException(string.Format("UmbracoObjectType \"{0}\" does not have a matching EntityType.", umbracoObjectType));
|
||||
}
|
||||
@@ -165,6 +172,8 @@ namespace Umbraco.Core
|
||||
return UmbracoObjectTypes.FormsPreValue;
|
||||
case FormsDataSource:
|
||||
return UmbracoObjectTypes.FormsDataSource;
|
||||
case Language:
|
||||
return UmbracoObjectTypes.Language;
|
||||
}
|
||||
throw new NotSupportedException(
|
||||
string.Format("EntityType \"{0}\" does not have a matching UmbracoObjectType.", entityType));
|
||||
|
||||
@@ -97,7 +97,7 @@ namespace Umbraco.Core
|
||||
/// </summary>
|
||||
/// <param name="entity">The entity.</param>
|
||||
/// <returns>The entity identifier of the entity.</returns>
|
||||
public static GuidUdi GetUdi(this Umbraco.Core.Models.EntityContainer entity)
|
||||
public static GuidUdi GetUdi(this EntityContainer entity)
|
||||
{
|
||||
if (entity == null) throw new ArgumentNullException("entity");
|
||||
|
||||
@@ -190,6 +190,17 @@ namespace Umbraco.Core
|
||||
return new GuidUdi(Constants.UdiEntityType.Macro, entity.Key).EnsureClosed();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the entity identifier of the entity.
|
||||
/// </summary>
|
||||
/// <param name="entity">The entity.</param>
|
||||
/// <returns>The entity identifier of the entity.</returns>
|
||||
public static StringUdi GetUdi(this IUserControl entity)
|
||||
{
|
||||
if (entity == null) throw new ArgumentNullException("entity");
|
||||
return new StringUdi(Constants.UdiEntityType.UserControl, entity.Path.TrimStart('/')).EnsureClosed();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the entity identifier of the entity.
|
||||
/// </summary>
|
||||
@@ -198,7 +209,13 @@ namespace Umbraco.Core
|
||||
public static StringUdi GetUdi(this IPartialView entity)
|
||||
{
|
||||
if (entity == null) throw new ArgumentNullException("entity");
|
||||
return new StringUdi(Constants.UdiEntityType.PartialView, entity.Path.TrimStart('/')).EnsureClosed();
|
||||
|
||||
// we should throw on Unknown but for the time being, assume it means PartialView
|
||||
var entityType = entity.ViewType == PartialViewType.PartialViewMacro
|
||||
? Constants.UdiEntityType.PartialViewMacro
|
||||
: Constants.UdiEntityType.PartialView;
|
||||
|
||||
return new StringUdi(entityType, entity.Path.TrimStart('/')).EnsureClosed();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -240,6 +257,17 @@ namespace Umbraco.Core
|
||||
return new GuidUdi(Constants.UdiEntityType.RelationType, entity.Key).EnsureClosed();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the entity identifier of the entity.
|
||||
/// </summary>
|
||||
/// <param name="entity">The entity.</param>
|
||||
/// <returns>The entity identifier of the entity.</returns>
|
||||
public static StringUdi GetUdi(this ILanguage entity)
|
||||
{
|
||||
if (entity == null) throw new ArgumentNullException("entity");
|
||||
return new StringUdi(Constants.UdiEntityType.Language, entity.IsoCode).EnsureClosed();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the entity identifier of the entity.
|
||||
/// </summary>
|
||||
@@ -273,7 +301,7 @@ namespace Umbraco.Core
|
||||
var dataTypeComposition = entity as IDataTypeDefinition;
|
||||
if (dataTypeComposition != null) return dataTypeComposition.GetUdi();
|
||||
|
||||
var container = entity as Umbraco.Core.Models.EntityContainer;
|
||||
var container = entity as EntityContainer;
|
||||
if (container != null) return container.GetUdi();
|
||||
|
||||
var media = entity as IMedia;
|
||||
@@ -309,6 +337,9 @@ namespace Umbraco.Core
|
||||
var relationType = entity as IRelationType;
|
||||
if (relationType != null) return relationType.GetUdi();
|
||||
|
||||
var language = entity as ILanguage;
|
||||
if (language != null) return language.GetUdi();
|
||||
|
||||
throw new NotSupportedException(string.Format("Entity type {0} is not supported.", entity.GetType().FullName));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -237,6 +237,7 @@
|
||||
<Compile Include="Configuration\UmbracoSettings\ContentError404Collection.cs" />
|
||||
<Compile Include="Configuration\UmbracoSettings\ContentErrorPageElement.cs" />
|
||||
<Compile Include="Configuration\UmbracoSettings\ContentErrorsElement.cs" />
|
||||
<Compile Include="Configuration\UmbracoSettings\ContentSectionExtensions.cs" />
|
||||
<Compile Include="Configuration\UmbracoSettings\ImagingAutoFillPropertiesCollection.cs" />
|
||||
<Compile Include="Configuration\UmbracoSettings\ImagingAutoFillUploadFieldElement.cs" />
|
||||
<Compile Include="Configuration\UmbracoSettings\ContentImagingElement.cs" />
|
||||
@@ -343,7 +344,9 @@
|
||||
<Compile Include="HashCodeHelper.cs" />
|
||||
<Compile Include="IHttpContextAccessor.cs" />
|
||||
<Compile Include="Models\EntityBase\IDeletableEntity.cs" />
|
||||
<Compile Include="Models\IUserControl.cs" />
|
||||
<Compile Include="Models\PublishedContent\PublishedContentTypeConverter.cs" />
|
||||
<Compile Include="Models\UserControl.cs" />
|
||||
<Compile Include="OrderedHashSet.cs" />
|
||||
<Compile Include="Events\UninstallPackageEventArgs.cs" />
|
||||
<Compile Include="Models\GridValue.cs" />
|
||||
@@ -575,12 +578,15 @@
|
||||
<Compile Include="Persistence\Repositories\Interfaces\IRedirectUrlRepository.cs" />
|
||||
<Compile Include="Persistence\Repositories\Interfaces\IServerRegistrationRepository.cs" />
|
||||
<Compile Include="Persistence\Repositories\Interfaces\IDeleteMediaFilesRepository.cs" />
|
||||
<Compile Include="Persistence\Repositories\Interfaces\IUserControlRepository.cs" />
|
||||
<Compile Include="Persistence\Repositories\Interfaces\IXsltFileRepository.cs" />
|
||||
<Compile Include="Persistence\Repositories\Interfaces\ITaskRepository.cs" />
|
||||
<Compile Include="Persistence\Repositories\Interfaces\ITaskTypeRepository.cs" />
|
||||
<Compile Include="Persistence\Repositories\MacroScriptRepository.cs" />
|
||||
<Compile Include="Persistence\Repositories\MigrationEntryRepository.cs" />
|
||||
<Compile Include="Persistence\Repositories\PublicAccessRepository.cs" />
|
||||
<Compile Include="Persistence\Repositories\RedirectUrlRepository.cs" />
|
||||
<Compile Include="Persistence\Repositories\UserControlRepository.cs" />
|
||||
<Compile Include="Persistence\Repositories\XsltFileRepository.cs" />
|
||||
<Compile Include="Persistence\Repositories\TaskRepository.cs" />
|
||||
<Compile Include="Persistence\Repositories\TaskTypeRepository.cs" />
|
||||
@@ -649,6 +655,7 @@
|
||||
<Compile Include="Services\ContentTypeServiceExtensions.cs" />
|
||||
<Compile Include="Models\RedirectUrl.cs" />
|
||||
<Compile Include="Services\IContentServiceBase.cs" />
|
||||
<Compile Include="Services\IdkMap.cs" />
|
||||
<Compile Include="Services\RedirectUrlService.cs" />
|
||||
<Compile Include="Services\DomainService.cs" />
|
||||
<Compile Include="Services\ExternalLoginService.cs" />
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
</system.data>
|
||||
|
||||
<system.web>
|
||||
<httpRuntime targetFramework="4.5" />
|
||||
<compilation defaultLanguage="c#" debug="true" batch="false" targetFramework="4.0"></compilation>
|
||||
<machineKey validationKey="5E7B955FCE36F5F2A867C2A0D85DC61E7FEA9E15F1561E8386F78BFE9EE23FF18B21E6A44AA17300B3B9D5DBEB37AA61A2C73884A5BBEDA6D3B14BA408A7A8CD" decryptionKey="116B853D031219E404E088FCA0986D6CF2DFA77E1957B59FCC9404B8CA3909A1" validation="SHA1" decryption="AES" />
|
||||
<!--<trust level="Medium" originUrl=".*"/>-->
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core;
|
||||
@@ -177,6 +178,39 @@ namespace Umbraco.Tests.Configurations.UmbracoSettings
|
||||
public void DisallowedUploadFiles()
|
||||
{
|
||||
Assert.IsTrue(SettingsSection.Content.DisallowedUploadFiles.All(x => "ashx,aspx,ascx,config,cshtml,vbhtml,asmx,air,axd".Split(',').Contains(x)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AllowedUploadFiles()
|
||||
{
|
||||
Assert.IsTrue(SettingsSection.Content.AllowedUploadFiles.All(x => "jpg,gif,png".Split(',').Contains(x)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("png", true)]
|
||||
[TestCase("jpg", true)]
|
||||
[TestCase("gif", true)]
|
||||
// TODO: Why does it flip to TestingDefaults=true for these two tests on AppVeyor. WHY?
|
||||
//[TestCase("bmp", false)]
|
||||
//[TestCase("php", false)]
|
||||
[TestCase("ashx", false)]
|
||||
[TestCase("config", false)]
|
||||
public void IsFileAllowedForUpload_WithWhitelist(string extension, bool expected)
|
||||
{
|
||||
// Make really sure that defaults are NOT used
|
||||
TestingDefaults = false;
|
||||
|
||||
Debug.WriteLine("Extension being tested", extension);
|
||||
Debug.WriteLine("AllowedUploadFiles: {0}", SettingsSection.Content.AllowedUploadFiles);
|
||||
Debug.WriteLine("DisallowedUploadFiles: {0}", SettingsSection.Content.DisallowedUploadFiles);
|
||||
|
||||
var allowedContainsExtension = SettingsSection.Content.AllowedUploadFiles.Any(x => x.InvariantEquals(extension));
|
||||
var disallowedContainsExtension = SettingsSection.Content.DisallowedUploadFiles.Any(x => x.InvariantEquals(extension));
|
||||
|
||||
Debug.WriteLine("AllowedContainsExtension: {0}", allowedContainsExtension);
|
||||
Debug.WriteLine("DisallowedContainsExtension: {0}", disallowedContainsExtension);
|
||||
|
||||
Assert.AreEqual(SettingsSection.Content.IsFileAllowedForUpload(extension), expected);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
using System.Configuration;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Configuration.UmbracoSettings;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
|
||||
@@ -9,20 +9,17 @@ namespace Umbraco.Tests.Configurations.UmbracoSettings
|
||||
{
|
||||
public abstract class UmbracoSettingsTests
|
||||
{
|
||||
|
||||
protected virtual bool TestingDefaults
|
||||
{
|
||||
get { return false; }
|
||||
}
|
||||
protected virtual bool TestingDefaults { get; set; }
|
||||
|
||||
[SetUp]
|
||||
public void Init()
|
||||
{
|
||||
var config = new FileInfo(TestHelper.MapPathForTest("~/Configurations/UmbracoSettings/web.config"));
|
||||
|
||||
var fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = config.FullName };
|
||||
var configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
|
||||
|
||||
var fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = config.FullName };
|
||||
var configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
|
||||
|
||||
Debug.WriteLine("Testing defaults? {0}", TestingDefaults);
|
||||
if (TestingDefaults)
|
||||
{
|
||||
SettingsSection = configuration.GetSection("umbracoConfiguration/defaultSettings") as UmbracoSettingsSection;
|
||||
@@ -32,8 +29,6 @@ namespace Umbraco.Tests.Configurations.UmbracoSettings
|
||||
SettingsSection = configuration.GetSection("umbracoConfiguration/settings") as UmbracoSettingsSection;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Assert.IsNotNull(SettingsSection);
|
||||
}
|
||||
|
||||
|
||||
@@ -100,6 +100,9 @@
|
||||
<!-- These file types will not be allowed to be uploaded via the upload control for media and content -->
|
||||
<disallowedUploadFiles>ashx,aspx,ascx,config,cshtml,vbhtml,asmx,air,axd</disallowedUploadFiles>
|
||||
|
||||
<!-- If completed, only the file extensions listed below will be allowed to be uploaded. If empty, disallowedUploadFiles will apply to prevent upload of specific file extensions. -->
|
||||
<allowedUploadFiles>jpg,png,gif</allowedUploadFiles>
|
||||
|
||||
<!-- Defines the default document type property used when adding properties in the back-office (if missing or empty, defaults to Textstring -->
|
||||
<defaultDocumentTypeProperty>Textstring</defaultDocumentTypeProperty>
|
||||
</content>
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Specialized;
|
||||
using System.Configuration.Provider;
|
||||
using System.Collections.Specialized;
|
||||
using System.Web.Security;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
@@ -83,10 +81,10 @@ namespace Umbraco.Tests.Membership
|
||||
mServiceMock.Setup(service => service.GetByEmail("test@test.com")).Returns(() => null);
|
||||
mServiceMock.Setup(service => service.GetDefaultMemberType()).Returns("Member");
|
||||
mServiceMock.Setup(
|
||||
service => service.CreateWithIdentity(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
|
||||
.Callback((string u, string e, string p, string m) =>
|
||||
service => service.CreateWithIdentity(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>()))
|
||||
.Callback((string u, string e, string p, string m, bool isApproved) =>
|
||||
{
|
||||
createdMember = new Member("test", e, u, p, memberType);
|
||||
createdMember = new Member("test", e, u, p, memberType, isApproved);
|
||||
})
|
||||
.Returns(() => createdMember);
|
||||
var provider = new MembersMembershipProvider(mServiceMock.Object);
|
||||
@@ -114,10 +112,10 @@ namespace Umbraco.Tests.Membership
|
||||
mServiceMock.Setup(service => service.GetByEmail("test@test.com")).Returns(() => null);
|
||||
mServiceMock.Setup(service => service.GetDefaultMemberType()).Returns("Member");
|
||||
mServiceMock.Setup(
|
||||
service => service.CreateWithIdentity(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
|
||||
.Callback((string u, string e, string p, string m) =>
|
||||
service => service.CreateWithIdentity(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>()))
|
||||
.Callback((string u, string e, string p, string m, bool isApproved) =>
|
||||
{
|
||||
createdMember = new Member("test", e, u, p, memberType);
|
||||
createdMember = new Member("test", e, u, p, memberType, isApproved);
|
||||
})
|
||||
.Returns(() => createdMember);
|
||||
|
||||
@@ -147,10 +145,10 @@ namespace Umbraco.Tests.Membership
|
||||
mServiceMock.Setup(service => service.GetByEmail("test@test.com")).Returns(() => null);
|
||||
mServiceMock.Setup(service => service.GetDefaultMemberType()).Returns("Member");
|
||||
mServiceMock.Setup(
|
||||
service => service.CreateWithIdentity(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
|
||||
.Callback((string u, string e, string p, string m) =>
|
||||
service => service.CreateWithIdentity(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>()))
|
||||
.Callback((string u, string e, string p, string m, bool isApproved) =>
|
||||
{
|
||||
createdMember = new Member("test", e, u, p, memberType);
|
||||
createdMember = new Member("test", e, u, p, memberType, isApproved);
|
||||
})
|
||||
.Returns(() => createdMember);
|
||||
|
||||
|
||||
@@ -37,14 +37,14 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
var unitOfWork = provider.GetUnitOfWork();
|
||||
var repository = new PartialViewRepository(unitOfWork, _fileSystem);
|
||||
|
||||
var partialView = new PartialView("test-path-1.cshtml") { Content = "// partialView" };
|
||||
var partialView = new PartialView(PartialViewType.PartialView, "test-path-1.cshtml") { Content = "// partialView" };
|
||||
repository.AddOrUpdate(partialView);
|
||||
unitOfWork.Commit();
|
||||
Assert.IsTrue(_fileSystem.FileExists("test-path-1.cshtml"));
|
||||
Assert.AreEqual("test-path-1.cshtml", partialView.Path);
|
||||
Assert.AreEqual("/Views/Partials/test-path-1.cshtml", partialView.VirtualPath);
|
||||
|
||||
partialView = new PartialView("path-2/test-path-2.cshtml") { Content = "// partialView" };
|
||||
partialView = new PartialView(PartialViewType.PartialView, "path-2/test-path-2.cshtml") { Content = "// partialView" };
|
||||
repository.AddOrUpdate(partialView);
|
||||
unitOfWork.Commit();
|
||||
Assert.IsTrue(_fileSystem.FileExists("path-2/test-path-2.cshtml"));
|
||||
@@ -56,7 +56,7 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
Assert.AreEqual("path-2\\test-path-2.cshtml", partialView.Path);
|
||||
Assert.AreEqual("/Views/Partials/path-2/test-path-2.cshtml", partialView.VirtualPath);
|
||||
|
||||
partialView = new PartialView("path-2\\test-path-3.cshtml") { Content = "// partialView" };
|
||||
partialView = new PartialView(PartialViewType.PartialView, "path-2\\test-path-3.cshtml") { Content = "// partialView" };
|
||||
repository.AddOrUpdate(partialView);
|
||||
unitOfWork.Commit();
|
||||
Assert.IsTrue(_fileSystem.FileExists("path-2/test-path-3.cshtml"));
|
||||
@@ -73,7 +73,7 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
Assert.AreEqual("path-2\\test-path-3.cshtml", partialView.Path);
|
||||
Assert.AreEqual("/Views/Partials/path-2/test-path-3.cshtml", partialView.VirtualPath);
|
||||
|
||||
partialView = new PartialView("\\test-path-4.cshtml") { Content = "// partialView" };
|
||||
partialView = new PartialView(PartialViewType.PartialView, "\\test-path-4.cshtml") { Content = "// partialView" };
|
||||
Assert.Throws<FileSecurityException>(() => // fixed in 7.3 - 7.2.8 used to strip the \
|
||||
{
|
||||
repository.AddOrUpdate(partialView);
|
||||
|
||||
@@ -96,5 +96,25 @@ namespace Umbraco.Tests.PropertyEditors
|
||||
|
||||
Assert.AreEqual(expected, result);
|
||||
}
|
||||
|
||||
[TestCase(null, "1", false, 1)]
|
||||
[TestCase(null, "1", true, 1)]
|
||||
[TestCase(null, "0", false, 0)]
|
||||
[TestCase(null, "0", true, 0)]
|
||||
[TestCase(null, null, false, 0)]
|
||||
[TestCase(null, null, true, 0)]
|
||||
[TestCase(null, "-1", false, -1)]
|
||||
[TestCase(null, "-1", true, -1)]
|
||||
[TestCase(null, "1.65", false, 1.65)]
|
||||
[TestCase(null, "1.65", true, 1.65)]
|
||||
[TestCase(null, "-1.65", false, -1.65)]
|
||||
[TestCase(null, "-1.65", true, -1.65)]
|
||||
public void CanConvertDecimalAliasPropertyEditor(Core.Models.PublishedContent.PublishedPropertyType propertyType, object value, bool preview, double expected)
|
||||
{
|
||||
var converter = new DecimalValueConverter();
|
||||
var result = converter.ConvertDataToSource(propertyType, value, preview);
|
||||
|
||||
Assert.AreEqual(expected, result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Models.PublishedContent;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
using Umbraco.Web;
|
||||
|
||||
@@ -16,8 +17,16 @@ namespace Umbraco.Tests.PublishedContent
|
||||
private UmbracoContext ctx;
|
||||
private string xmlContent = "";
|
||||
private bool createContentTypes = true;
|
||||
|
||||
protected override string GetXmlContent(int templateId)
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
// make sure we get them from the content service
|
||||
PublishedContentType.GetPublishedContentTypeCallback = null;
|
||||
}
|
||||
|
||||
protected override string GetXmlContent(int templateId)
|
||||
{
|
||||
return xmlContent;
|
||||
}
|
||||
@@ -57,7 +66,7 @@ namespace Umbraco.Tests.PublishedContent
|
||||
var publishedContent = ctx.ContentCache.GetById(1100);
|
||||
Assert.That(publishedContent.IsDocumentType("base", true));
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void IsDocumentType_Recursive_InvalidBaseType_ReturnsFalse()
|
||||
{
|
||||
@@ -73,23 +82,23 @@ namespace Umbraco.Tests.PublishedContent
|
||||
if (createContentTypes)
|
||||
{
|
||||
var contentTypeService = ctx.Application.Services.ContentTypeService;
|
||||
var baseType = new ContentType(-1) {Alias = "base", Name = "Base"};
|
||||
var baseType = new ContentType(-1) { Alias = "base", Name = "Base" };
|
||||
const string contentTypeAlias = "inherited";
|
||||
var inheritedType = new ContentType(baseType, contentTypeAlias) {Alias = contentTypeAlias, Name = "Inherited"};
|
||||
var inheritedType = new ContentType(baseType, contentTypeAlias) { Alias = contentTypeAlias, Name = "Inherited" };
|
||||
contentTypeService.Save(baseType);
|
||||
contentTypeService.Save(inheritedType);
|
||||
createContentTypes = false;
|
||||
}
|
||||
#region setup xml content
|
||||
|
||||
xmlContent = @"<?xml version=""1.0"" encoding=""utf-8""?>
|
||||
<!DOCTYPE root[
|
||||
<!DOCTYPE root[
|
||||
<!ELEMENT inherited ANY>
|
||||
<!ATTLIST inherited id ID #REQUIRED>
|
||||
]>
|
||||
<root id=""-1"">
|
||||
<inherited id=""1100"" parentID=""-1"" level=""1"" writerID=""0"" creatorID=""0"" nodeType=""1044"" template=""1"" sortOrder=""1"" createDate=""2012-06-12T14:13:17"" updateDate=""2012-07-20T18:50:43"" nodeName=""Home"" urlName=""home"" writerName=""admin"" creatorName=""admin"" path=""-1,1046"" isDoc=""""/>
|
||||
</root>";
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,11 +44,11 @@ namespace Umbraco.Tests.PublishedContent
|
||||
var propertyTypes = new[]
|
||||
{
|
||||
// AutoPublishedContentType will auto-generate other properties
|
||||
new PublishedPropertyType("umbracoNaviHide", 0, Constants.PropertyEditors.TrueFalseAlias),
|
||||
new PublishedPropertyType("selectedNodes", 0, "?"),
|
||||
new PublishedPropertyType("umbracoUrlAlias", 0, "?"),
|
||||
new PublishedPropertyType("content", 0, Constants.PropertyEditors.TinyMCEAlias),
|
||||
new PublishedPropertyType("testRecursive", 0, "?"),
|
||||
new PublishedPropertyType("umbracoNaviHide", 0, Constants.PropertyEditors.TrueFalseAlias),
|
||||
new PublishedPropertyType("selectedNodes", 0, "?"),
|
||||
new PublishedPropertyType("umbracoUrlAlias", 0, "?"),
|
||||
new PublishedPropertyType("content", 0, Constants.PropertyEditors.TinyMCEAlias),
|
||||
new PublishedPropertyType("testRecursive", 0, "?"),
|
||||
};
|
||||
var compositionAliases = new[] {"MyCompositionAlias"};
|
||||
var type = new AutoPublishedContentType(0, "anything", compositionAliases, propertyTypes);
|
||||
@@ -73,7 +73,7 @@ namespace Umbraco.Tests.PublishedContent
|
||||
protected override string GetXmlContent(int templateId)
|
||||
{
|
||||
return @"<?xml version=""1.0"" encoding=""utf-8""?>
|
||||
<!DOCTYPE root[
|
||||
<!DOCTYPE root[
|
||||
<!ELEMENT Home ANY>
|
||||
<!ATTLIST Home id ID #REQUIRED>
|
||||
<!ELEMENT CustomDocument ANY>
|
||||
@@ -87,17 +87,17 @@ namespace Umbraco.Tests.PublishedContent
|
||||
<testRecursive><![CDATA[This is the recursive val]]></testRecursive>
|
||||
<Home id=""1173"" parentID=""1046"" level=""2"" writerID=""0"" creatorID=""0"" nodeType=""1044"" template=""" + templateId + @""" sortOrder=""1"" createDate=""2012-07-20T18:06:45"" updateDate=""2012-07-20T19:07:31"" nodeName=""Sub1"" urlName=""sub1"" writerName=""admin"" creatorName=""admin"" path=""-1,1046,1173"" isDoc="""">
|
||||
<content><![CDATA[<div>This is some content</div>]]></content>
|
||||
<umbracoUrlAlias><![CDATA[page2/alias, 2ndpagealias]]></umbracoUrlAlias>
|
||||
<umbracoUrlAlias><![CDATA[page2/alias, 2ndpagealias]]></umbracoUrlAlias>
|
||||
<testRecursive><![CDATA[]]></testRecursive>
|
||||
<Home id=""1174"" parentID=""1173"" level=""3"" writerID=""0"" creatorID=""0"" nodeType=""1044"" template=""" + templateId + @""" sortOrder=""1"" createDate=""2012-07-20T18:07:54"" updateDate=""2012-07-20T19:10:27"" nodeName=""Sub2"" urlName=""sub2"" writerName=""admin"" creatorName=""admin"" path=""-1,1046,1173,1174"" isDoc="""">
|
||||
<content><![CDATA[]]></content>
|
||||
<umbracoUrlAlias><![CDATA[only/one/alias]]></umbracoUrlAlias>
|
||||
<creatorName><![CDATA[Custom data with same property name as the member name]]></creatorName>
|
||||
<testRecursive><![CDATA[]]></testRecursive>
|
||||
</Home>
|
||||
</Home>
|
||||
<CustomDocument id=""1177"" parentID=""1173"" level=""3"" writerID=""0"" creatorID=""0"" nodeType=""1234"" template=""" + templateId + @""" sortOrder=""2"" createDate=""2012-07-16T15:26:59"" updateDate=""2012-07-18T14:23:35"" nodeName=""custom sub 1"" urlName=""custom-sub-1"" writerName=""admin"" creatorName=""admin"" path=""-1,1046,1173,1177"" isDoc="""" />
|
||||
<CustomDocument id=""1178"" parentID=""1173"" level=""3"" writerID=""0"" creatorID=""0"" nodeType=""1234"" template=""" + templateId + @""" sortOrder=""3"" createDate=""2012-07-16T15:26:59"" updateDate=""2012-07-16T14:23:35"" nodeName=""custom sub 2"" urlName=""custom-sub-2"" writerName=""admin"" creatorName=""admin"" path=""-1,1046,1173,1178"" isDoc="""" />
|
||||
<Home id=""1176"" parentID=""1173"" level=""3"" writerID=""0"" creatorID=""0"" nodeType=""1044"" template=""" + templateId + @""" sortOrder=""4"" createDate=""2012-07-20T18:08:08"" updateDate=""2012-07-20T19:10:52"" nodeName=""Sub 3"" urlName=""sub-3"" writerName=""admin"" creatorName=""admin"" path=""-1,1046,1173,1176"" isDoc="""">
|
||||
<Home id=""1176"" parentID=""1173"" level=""3"" writerID=""0"" creatorID=""0"" nodeType=""1044"" template=""" + templateId + @""" sortOrder=""4"" createDate=""2012-07-20T18:08:08"" updateDate=""2012-07-20T19:10:52"" nodeName=""Sub 3"" urlName=""sub-3"" writerName=""admin"" creatorName=""admin"" path=""-1,1046,1173,1176"" isDoc="""" key=""CDB83BBC-A83B-4BA6-93B8-AADEF67D3C09"">
|
||||
<content><![CDATA[]]></content>
|
||||
<umbracoNaviHide>1</umbracoNaviHide>
|
||||
</Home>
|
||||
@@ -211,8 +211,8 @@ namespace Umbraco.Tests.PublishedContent
|
||||
[PublishedContentModel("Home")]
|
||||
internal class Home : PublishedContentModel
|
||||
{
|
||||
public Home(IPublishedContent content)
|
||||
: base(content)
|
||||
public Home(IPublishedContent content)
|
||||
: base(content)
|
||||
{}
|
||||
}
|
||||
|
||||
@@ -659,6 +659,28 @@ namespace Umbraco.Tests.PublishedContent
|
||||
Assert.AreEqual((int)1178, (int)result.Id);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetKey()
|
||||
{
|
||||
var key = Guid.Parse("CDB83BBC-A83B-4BA6-93B8-AADEF67D3C09");
|
||||
|
||||
// doc is Home (a model) and GetKey unwraps and works
|
||||
var doc = GetNode(1176);
|
||||
Assert.IsInstanceOf<Home>(doc);
|
||||
Assert.AreEqual(key, doc.GetKey());
|
||||
|
||||
// wrapped is PublishedContentWrapped and WithKey unwraps
|
||||
var wrapped = new TestWrapped(doc);
|
||||
Assert.AreEqual(key, wrapped.GetKey());
|
||||
}
|
||||
|
||||
class TestWrapped : PublishedContentWrapped
|
||||
{
|
||||
public TestWrapped(IPublishedContent content)
|
||||
: base(content)
|
||||
{ }
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DetachedProperty1()
|
||||
{
|
||||
|
||||
@@ -15,7 +15,7 @@ namespace Umbraco.Tests.Scheduling
|
||||
[Timeout(30000)]
|
||||
public class BackgroundTaskRunnerTests
|
||||
{
|
||||
private ILogger _logger;
|
||||
private ILogger _logger;
|
||||
|
||||
[TestFixtureSetUp]
|
||||
public void InitializeFixture()
|
||||
@@ -93,7 +93,7 @@ namespace Umbraco.Tests.Scheduling
|
||||
{
|
||||
runner.Add(new MyTask());
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -242,7 +242,7 @@ namespace Umbraco.Tests.Scheduling
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
[Test]
|
||||
public void Create_IsNotRunning()
|
||||
{
|
||||
@@ -252,16 +252,18 @@ namespace Umbraco.Tests.Scheduling
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
[Test]
|
||||
public async void Create_AutoStart_IsRunning()
|
||||
{
|
||||
using (var runner = new BackgroundTaskRunner<IBackgroundTask>(new BackgroundTaskRunnerOptions
|
||||
{
|
||||
AutoStart = true
|
||||
AutoStart = true,
|
||||
KeepAlive = true // else stops!
|
||||
}, _logger))
|
||||
{
|
||||
Assert.IsTrue(runner.IsRunning); // because AutoStart is true
|
||||
runner.Stop(false); // keepalive = must be stopped
|
||||
await runner.StoppedAwaitable; // runner stops, within test's timeout
|
||||
}
|
||||
}
|
||||
@@ -296,7 +298,7 @@ namespace Umbraco.Tests.Scheduling
|
||||
// so that we don't have a runaway task in tests, etc - but it does NOT terminate
|
||||
// the runner - it really is NOT a nice way to end a runner - it's there for tests
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void Startup_KeepAlive_IsRunning()
|
||||
{
|
||||
@@ -359,7 +361,7 @@ namespace Umbraco.Tests.Scheduling
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
[Test]
|
||||
public async void WaitOnRunner_Tasks()
|
||||
{
|
||||
@@ -504,7 +506,7 @@ namespace Umbraco.Tests.Scheduling
|
||||
|
||||
//wait till the thread is done
|
||||
await tManager.CurrentThreadingTask;
|
||||
|
||||
|
||||
foreach (var task in tasks)
|
||||
{
|
||||
Assert.IsTrue(task.Ended != default(DateTime));
|
||||
@@ -516,7 +518,7 @@ namespace Umbraco.Tests.Scheduling
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
[Test]
|
||||
public void RecurringTaskTest()
|
||||
{
|
||||
@@ -532,7 +534,7 @@ namespace Umbraco.Tests.Scheduling
|
||||
};
|
||||
|
||||
var task = new MyRecurringTask(runner, 200, 500);
|
||||
|
||||
|
||||
runner.Add(task);
|
||||
|
||||
Assert.IsTrue(runner.IsRunning); // waiting on delay
|
||||
@@ -577,7 +579,7 @@ namespace Umbraco.Tests.Scheduling
|
||||
runner.Add(task);
|
||||
Assert.IsTrue(runner.IsRunning);
|
||||
Thread.Sleep(5000);
|
||||
Assert.IsTrue(runner.IsRunning); // still waiting for the task to release
|
||||
Assert.IsTrue(runner.IsRunning); // still waiting for the task to release
|
||||
Assert.IsFalse(task.HasRun);
|
||||
runner.Shutdown(false, false);
|
||||
await runner.StoppedAwaitable; // wait for the entire runner operation to complete
|
||||
@@ -585,7 +587,7 @@ namespace Umbraco.Tests.Scheduling
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
[Test]
|
||||
public void LatchedRecurring()
|
||||
{
|
||||
@@ -842,7 +844,7 @@ namespace Umbraco.Tests.Scheduling
|
||||
}
|
||||
|
||||
public override bool PerformRun()
|
||||
{
|
||||
{
|
||||
Thread.Sleep(_runMilliseconds);
|
||||
return true; // repeat
|
||||
}
|
||||
@@ -976,7 +978,7 @@ namespace Umbraco.Tests.Scheduling
|
||||
public virtual Task RunAsync(CancellationToken token)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
//return Task.Delay(500);
|
||||
//return Task.Delay(500);
|
||||
}
|
||||
|
||||
public virtual bool IsAsync
|
||||
|
||||
@@ -1403,6 +1403,7 @@ namespace Umbraco.Tests.Services
|
||||
}));
|
||||
Assert.IsTrue(ServiceContext.PublicAccessService.AddRule(content1, "test2", "test2").Success);
|
||||
|
||||
// how is that one even working since "test" is more than 1 char?
|
||||
Assert.IsNotNull(ServiceContext.NotificationService.CreateNotification(ServiceContext.UserService.GetUserById(0), content1, "test"));
|
||||
|
||||
ServiceContext.ContentService.AssignContentPermission(content1, 'A', new[] {0});
|
||||
@@ -1411,7 +1412,7 @@ namespace Umbraco.Tests.Services
|
||||
{
|
||||
RootContentId = content1.Id
|
||||
}).Success);
|
||||
|
||||
|
||||
// Act
|
||||
ServiceContext.ContentService.EmptyRecycleBin();
|
||||
var contents = ServiceContext.ContentService.GetContentInRecycleBin();
|
||||
@@ -1814,7 +1815,7 @@ namespace Umbraco.Tests.Services
|
||||
var c1 = MockedContent.CreateSimpleContent(contentType);
|
||||
ServiceContext.ContentService.Save(c1);
|
||||
}
|
||||
|
||||
|
||||
long total;
|
||||
var entities = service.GetPagedChildren(-1, 0, 6, out total).ToArray();
|
||||
Assert.That(entities.Length, Is.EqualTo(6));
|
||||
@@ -1834,7 +1835,7 @@ namespace Umbraco.Tests.Services
|
||||
|
||||
var contentType = MockedContentTypes.CreateSimpleContentType();
|
||||
ServiceContext.ContentTypeService.Save(contentType);
|
||||
// only add 9 as we also add a content with children
|
||||
// only add 9 as we also add a content with children
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
var c1 = MockedContent.CreateSimpleContent(contentType);
|
||||
|
||||
@@ -222,7 +222,7 @@ namespace Umbraco.Tests.Services
|
||||
var root = MockedContent.CreateSimpleContent(contentType1, "Root", -1);
|
||||
ServiceContext.ContentService.Save(root);
|
||||
ServiceContext.ContentService.Publish(root);
|
||||
|
||||
|
||||
var level1 = MockedContent.CreateSimpleContent(contentType2, "L1", root.Id);
|
||||
ServiceContext.ContentService.Save(level1);
|
||||
ServiceContext.ContentService.Publish(level1);
|
||||
@@ -520,7 +520,7 @@ namespace Umbraco.Tests.Services
|
||||
var deletedContent = cs.GetById(content.Id);
|
||||
var deletedChildContentType = cts.GetContentType(childContentType.Id);
|
||||
var deletedContentType = cts.GetContentType(contentType.Id);
|
||||
|
||||
|
||||
Assert.IsNull(deletedChildContentType);
|
||||
Assert.IsNull(deletedContent);
|
||||
Assert.IsNull(deletedContentType);
|
||||
@@ -980,7 +980,7 @@ namespace Umbraco.Tests.Services
|
||||
{
|
||||
// Arrange
|
||||
var contentType = MockedContentTypes.CreateSimpleContentType("contentType", string.Empty);
|
||||
|
||||
|
||||
// Act & Assert
|
||||
Assert.Throws<ArgumentException>(() => ServiceContext.ContentTypeService.Save(contentType));
|
||||
}
|
||||
@@ -1542,7 +1542,8 @@ namespace Umbraco.Tests.Services
|
||||
SortOrder = 1,
|
||||
DataTypeDefinitionId = -88
|
||||
};
|
||||
var authorAdded = basePage.AddPropertyType(authorPropertyType, "Content");
|
||||
Assert.IsTrue(basePage.AddPropertyType(authorPropertyType, "Content"));
|
||||
|
||||
var titlePropertyType = new PropertyType(Constants.PropertyEditors.TextboxAlias, DataTypeDatabaseType.Ntext, "title")
|
||||
{
|
||||
Name = "Title",
|
||||
@@ -1551,20 +1552,20 @@ namespace Umbraco.Tests.Services
|
||||
SortOrder = 1,
|
||||
DataTypeDefinitionId = -88
|
||||
};
|
||||
var titleAdded = basePage.AddPropertyType(authorPropertyType, "Meta");
|
||||
Assert.IsTrue(basePage.AddPropertyType(titlePropertyType, "Meta"));
|
||||
|
||||
service.Save(basePage);
|
||||
|
||||
basePage = service.GetContentType(basePage.Id);
|
||||
|
||||
var totalPt = basePage.PropertyTypes.Count();
|
||||
var count = basePage.PropertyTypes.Count();
|
||||
Assert.AreEqual(2, count);
|
||||
|
||||
basePage.RemovePropertyGroup("Content");
|
||||
service.Save(basePage);
|
||||
|
||||
service.Save(basePage);
|
||||
basePage = service.GetContentType(basePage.Id);
|
||||
|
||||
Assert.AreEqual(totalPt, basePage.PropertyTypes.Count());
|
||||
Assert.AreEqual(count, basePage.PropertyTypes.Count());
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -16,7 +16,7 @@ using Umbraco.Tests.TestHelpers;
|
||||
namespace Umbraco.Tests.Strings
|
||||
{
|
||||
[TestFixture]
|
||||
public class DefaultShortStringHelperTests
|
||||
public class DefaultShortStringHelperTests
|
||||
{
|
||||
private DefaultShortStringHelper _helper;
|
||||
|
||||
@@ -145,6 +145,33 @@ namespace Umbraco.Tests.Strings
|
||||
Assert.AreEqual("aeoa-and-aeoa-and-and-and-grosser-bbddzhzh-page", output);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void U4_4056_TryAscii()
|
||||
{
|
||||
var settings = SettingsForTests.GenerateMockSettings();
|
||||
var contentMock = Mock.Get(settings.RequestHandler);
|
||||
contentMock.Setup(x => x.CharCollection).Returns(Enumerable.Empty<IChar>());
|
||||
contentMock.Setup(x => x.ConvertUrlsToAscii).Returns(false);
|
||||
SettingsForTests.ConfigureSettings(settings);
|
||||
|
||||
const string input1 = "ÆØÅ and æøå and 中文测试 and אודות האתר and größer БбДдЖж page";
|
||||
const string input2 = "ÆØÅ and æøå and größer БбДдЖж page";
|
||||
|
||||
var helper = new DefaultShortStringHelper(settings).WithDefaultConfig(); // unicode
|
||||
Assert.AreEqual("æøå-and-æøå-and-中文测试-and-אודות-האתר-and-größer-ббдджж-page", helper.CleanStringForUrlSegment(input1));
|
||||
Assert.AreEqual("æøå-and-æøå-and-größer-ббдджж-page", helper.CleanStringForUrlSegment(input2));
|
||||
|
||||
helper = new DefaultShortStringHelper(SettingsForTests.GetDefault())
|
||||
.WithConfig(CleanStringType.UrlSegment, new DefaultShortStringHelper.Config
|
||||
{
|
||||
IsTerm = (c, leading) => char.IsLetterOrDigit(c) || c == '_',
|
||||
StringType = CleanStringType.LowerCase | CleanStringType.TryAscii, // try ascii
|
||||
Separator = '-'
|
||||
});
|
||||
Assert.AreEqual("æøå-and-æøå-and-中文测试-and-אודות-האתר-and-größer-ббдджж-page", helper.CleanStringForUrlSegment(input1));
|
||||
Assert.AreEqual("aeoa-and-aeoa-and-grosser-bbddzhzh-page", helper.CleanStringForUrlSegment(input2));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CleanStringUnderscoreInTerm()
|
||||
{
|
||||
@@ -339,7 +366,7 @@ namespace Umbraco.Tests.Strings
|
||||
Separator = '*'
|
||||
});
|
||||
Assert.AreEqual("house*2", helper.CleanString("house (2)", CleanStringType.Alias));
|
||||
|
||||
|
||||
// FIXME but for a filename we want to keep them!
|
||||
// FIXME and what about a url?
|
||||
}
|
||||
@@ -574,7 +601,7 @@ namespace Umbraco.Tests.Strings
|
||||
{
|
||||
var output = _helper.SplitPascalCasing(input, ' ');
|
||||
Assert.AreEqual(expected, output);
|
||||
|
||||
|
||||
output = _helper.SplitPascalCasing(input, '*');
|
||||
expected = expected.Replace(' ', '*');
|
||||
Assert.AreEqual(expected, output);
|
||||
|
||||
@@ -59,6 +59,29 @@ namespace Umbraco.Tests
|
||||
Assert.AreEqual("umb://" + Constants.UdiEntityType.AnyString + "/path%20to/this%20is%20a%20test.xyz", udi3.ToString());
|
||||
}
|
||||
|
||||
[Test, Ignore]
|
||||
public void StringEncodingTest2()
|
||||
{
|
||||
// reserved = : / ? # [ ] @ ! $ & ' ( ) * + , ; =
|
||||
// unreserved = alpha digit - . _ ~
|
||||
|
||||
Assert.AreEqual("%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2B%2C%3B%3D.-_~%25", Uri.EscapeDataString(":/?#[]@!$&'()+,;=.-_~%"));
|
||||
Assert.AreEqual(":/?#[]@!$&'()+,;=.-_~%25", Uri.EscapeUriString(":/?#[]@!$&'()+,;=.-_~%"));
|
||||
|
||||
// we cannot have reserved chars at random places
|
||||
// we want to keep the / in string udis
|
||||
|
||||
var r = string.Join("/", "path/to/View[1].cshtml".Split('/').Select(Uri.EscapeDataString));
|
||||
Assert.AreEqual("path/to/View%5B1%5D.cshtml", r);
|
||||
Assert.IsTrue(Uri.IsWellFormedUriString("umb://partial-view-macro/" + r, UriKind.Absolute));
|
||||
|
||||
// with the proper fix in StringUdi this should work:
|
||||
var udi1 = new StringUdi("partial-view-macro", "path/to/View[1].cshtml");
|
||||
Assert.AreEqual("umb://partial-view-macro/path/to/View%5B1%5D.cshtml", udi1.ToString());
|
||||
var udi2 = Udi.Parse("umb://partial-view-macro/path/to/View%5B1%5D.cshtml");
|
||||
Assert.AreEqual("path/to/View[1].cshtml", ((StringUdi) udi2).Id);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GuidEntityCtorTest()
|
||||
{
|
||||
|
||||
@@ -61,8 +61,9 @@
|
||||
<Reference Include="Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Castle.Core.4.0.0\lib\net45\Castle.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Examine, Version=0.1.82.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Examine.0.1.82\lib\net45\Examine.dll</HintPath>
|
||||
<Reference Include="Examine, Version=0.1.83.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Examine.0.1.83\lib\net45\Examine.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll</HintPath>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<package id="AspNetWebApi.SelfHost" version="4.0.20710.0" targetFramework="net45" />
|
||||
<package id="AutoMapper" version="3.3.1" targetFramework="net45" />
|
||||
<package id="Castle.Core" version="4.0.0" targetFramework="net45" />
|
||||
<package id="Examine" version="0.1.82" targetFramework="net45" />
|
||||
<package id="Examine" version="0.1.83" targetFramework="net45" />
|
||||
<package id="log4net" version="2.0.8" targetFramework="net45" />
|
||||
<package id="Log4Net.Async" version="2.0.4" targetFramework="net45" />
|
||||
<package id="Lucene.Net" version="2.9.4.1" targetFramework="net45" />
|
||||
@@ -21,6 +21,7 @@
|
||||
<package id="Moq" version="4.1.1309.0919" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="10.0.2" targetFramework="net45" />
|
||||
<package id="NUnit" version="2.6.2" targetFramework="net45" />
|
||||
<package id="NUnitTestAdapter" version="2.1.1" targetFramework="net45" />
|
||||
<package id="Owin" version="1.0" targetFramework="net45" />
|
||||
<package id="Selenium.WebDriver" version="2.32.0" targetFramework="net45" />
|
||||
<package id="semver" version="1.1.2" targetFramework="net45" />
|
||||
|
||||
@@ -382,6 +382,9 @@ module.exports = function (grunt) {
|
||||
html: {
|
||||
files: ['src/views/**/*.html', 'src/*.html'],
|
||||
tasks: ['watch-html', 'timestamp']
|
||||
},
|
||||
options: {
|
||||
interval: 500
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -0,0 +1,219 @@
|
||||
tinymce.addI18n('da',{
|
||||
"Cut": "Klip",
|
||||
"Heading 5": "Overskrift 5",
|
||||
"Header 2": "Overskrift 2",
|
||||
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Din browser underst\u00f8tter ikke direkte adgang til clipboard. Benyt Ctrl+X\/C\/ keybord shortcuts i stedet for.",
|
||||
"Heading 4": "Overskrift 4",
|
||||
"Div": "Div",
|
||||
"Heading 2": "Overskrift 2",
|
||||
"Paste": "Inds\u00e6t",
|
||||
"Close": "Luk",
|
||||
"Font Family": "Skrifttype",
|
||||
"Pre": "Pre",
|
||||
"Align right": "H\u00f8jrejusteret",
|
||||
"New document": "Nyt dokument",
|
||||
"Blockquote": "Indrykning",
|
||||
"Numbered list": "Nummerering",
|
||||
"Heading 1": "Overskrift 1",
|
||||
"Headings": "Overskrifter",
|
||||
"Increase indent": "For\u00f8g indrykning",
|
||||
"Formats": "Formater",
|
||||
"Headers": "Overskrifter",
|
||||
"Select all": "V\u00e6lg alle",
|
||||
"Header 3": "Overskrift 3",
|
||||
"Blocks": "Blokke",
|
||||
"Undo": "Fortryd",
|
||||
"Strikethrough": "Gennemstreg",
|
||||
"Bullet list": "Punkt tegn",
|
||||
"Header 1": "Overskrift 1",
|
||||
"Superscript": "H\u00e6vet",
|
||||
"Clear formatting": "Nulstil formattering",
|
||||
"Font Sizes": "Skriftst\u00f8rrelse",
|
||||
"Subscript": "S\u00e6nket",
|
||||
"Header 6": "Overskrift 6",
|
||||
"Redo": "Genopret",
|
||||
"Paragraph": "S\u00e6tning",
|
||||
"Ok": "Ok",
|
||||
"Bold": "Fed",
|
||||
"Code": "Code",
|
||||
"Italic": "Kursiv",
|
||||
"Align center": "Centreret",
|
||||
"Header 5": "Overskrift 5",
|
||||
"Heading 6": "Overskrift 6",
|
||||
"Heading 3": "Overskrift 3",
|
||||
"Decrease indent": "Formindsk indrykning",
|
||||
"Header 4": "Overskrift 4",
|
||||
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "S\u00e6t ind er indstillet til at inds\u00e6tte som ren tekst. Indhold bliver nu indsat uden formatering indtil du \u00e6ndrer indstillingen.",
|
||||
"Underline": "Understreg",
|
||||
"Cancel": "Fortryd",
|
||||
"Justify": "Justering",
|
||||
"Inline": "Inline",
|
||||
"Copy": "Kopier",
|
||||
"Align left": "Venstrejusteret",
|
||||
"Visual aids": "Visuel hj\u00e6lp",
|
||||
"Lower Greek": "Lower Gr\u00e6sk",
|
||||
"Square": "Kvadrat",
|
||||
"Default": "Standard",
|
||||
"Lower Alpha": "Lower Alpha",
|
||||
"Circle": "Cirkel",
|
||||
"Disc": "Disk",
|
||||
"Upper Alpha": "Upper Alpha",
|
||||
"Upper Roman": "Upper Roman",
|
||||
"Lower Roman": "Lower Roman",
|
||||
"Name": "Navn",
|
||||
"Anchor": "Anchor",
|
||||
"You have unsaved changes are you sure you want to navigate away?": "Du har ikke gemte \u00e6ndringer. Er du sikker p\u00e5 at du vil forts\u00e6tte?",
|
||||
"Restore last draft": "Genopret sidste kladde",
|
||||
"Special character": "Specielle tegn",
|
||||
"Source code": "Kildekode",
|
||||
"B": "B",
|
||||
"R": "R",
|
||||
"G": "G",
|
||||
"Color": "Farve",
|
||||
"Right to left": "H\u00f8jre til venstre",
|
||||
"Left to right": "Venstre til h\u00f8jre",
|
||||
"Emoticons": "Emot-ikoner",
|
||||
"Robots": "Robotter",
|
||||
"Document properties": "Dokument egenskaber",
|
||||
"Title": "Titel",
|
||||
"Keywords": "S\u00f8geord",
|
||||
"Encoding": "Kodning",
|
||||
"Description": "Beskrivelse",
|
||||
"Author": "Forfatter",
|
||||
"Fullscreen": "Fuldsk\u00e6rm",
|
||||
"Horizontal line": "Vandret linie",
|
||||
"Horizontal space": "Vandret afstand",
|
||||
"Insert\/edit image": "Inds\u00e6t\/ret billede",
|
||||
"General": "Generet",
|
||||
"Advanced": "Avanceret",
|
||||
"Source": "Kilde",
|
||||
"Border": "Kant",
|
||||
"Constrain proportions": "Behold propertioner",
|
||||
"Vertical space": "Lodret afstand",
|
||||
"Image description": "Billede beskrivelse",
|
||||
"Style": "Stil",
|
||||
"Dimensions": "Dimensioner",
|
||||
"Insert image": "Inds\u00e6t billede",
|
||||
"Zoom in": "Zoom ind",
|
||||
"Contrast": "Kontrast",
|
||||
"Back": "Tilbage",
|
||||
"Gamma": "Gamma",
|
||||
"Flip horizontally": "Flip horisontalt",
|
||||
"Resize": "Skaler",
|
||||
"Sharpen": "G\u00f8r skarpere",
|
||||
"Zoom out": "Zoom ud",
|
||||
"Image options": "Billede indstillinger",
|
||||
"Apply": "Anvend",
|
||||
"Brightness": "Lysstyrke",
|
||||
"Rotate clockwise": "Drej med urets retning",
|
||||
"Rotate counterclockwise": "Drej modsat urets retning",
|
||||
"Edit image": "Rediger billede",
|
||||
"Color levels": "Farve niveauer",
|
||||
"Crop": "Besk\u00e6r",
|
||||
"Orientation": "Retning",
|
||||
"Flip vertically": "Flip vertikalt",
|
||||
"Invert": "Inverter",
|
||||
"Insert date\/time": "Inds\u00e6t dato\/klokkeslet",
|
||||
"Remove link": "Fjern link",
|
||||
"Url": "Url",
|
||||
"Text to display": "Vis tekst",
|
||||
"Anchors": "Ankre",
|
||||
"Insert link": "Inds\u00e6t link",
|
||||
"New window": "Nyt vindue",
|
||||
"None": "Ingen",
|
||||
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "URLen som du angav ser ud til at v\u00e6re et eksternt link. \u00d8nsker du at tilf\u00f8je det kr\u00e6vede prefiks http:\/\/ ?",
|
||||
"Target": "Target",
|
||||
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "URLen som du angav ser ud til at v\u00e6re en email adresse. \u00d8nsker du at tilf\u00f8je det kr\u00e6vede prefiks mailto: ?",
|
||||
"Insert\/edit link": "Inds\u00e6t\/ret link",
|
||||
"Insert\/edit video": "Inds\u00e6t\/ret video",
|
||||
"Poster": "Poster",
|
||||
"Alternative source": "Alternativ kilde",
|
||||
"Paste your embed code below:": "Inds\u00e6t din embed kode herunder:",
|
||||
"Insert video": "Inds\u00e6t video",
|
||||
"Embed": "Integrer",
|
||||
"Nonbreaking space": "H\u00e5rdt mellemrum",
|
||||
"Page break": "Sideskift",
|
||||
"Paste as text": "Inds\u00e6t som ren tekst",
|
||||
"Preview": "Forh\u00e5ndsvisning",
|
||||
"Print": "Udskriv",
|
||||
"Save": "Gem",
|
||||
"Could not find the specified string.": "Kunne ikke finde s\u00f8getekst",
|
||||
"Replace": "Erstat",
|
||||
"Next": "N\u00e6ste",
|
||||
"Whole words": "Hele ord",
|
||||
"Find and replace": "Find og erstat",
|
||||
"Replace with": "Erstat med",
|
||||
"Find": "Find",
|
||||
"Replace all": "Erstat alt",
|
||||
"Match case": "STORE og sm\u00e5 bogstaver",
|
||||
"Prev": "Forrige",
|
||||
"Spellcheck": "Stavekontrol",
|
||||
"Finish": "F\u00e6rdig",
|
||||
"Ignore all": "Ignorer alt",
|
||||
"Ignore": "Ignorer",
|
||||
"Add to Dictionary": "Tilf\u00f8j til ordbog",
|
||||
"Insert row before": "Inds\u00e6t r\u00e6kke f\u00f8r",
|
||||
"Rows": "R\u00e6kker",
|
||||
"Height": "H\u00f8jde",
|
||||
"Paste row after": "Inds\u00e6t r\u00e6kke efter",
|
||||
"Alignment": "Tilpasning",
|
||||
"Border color": "Kant farve",
|
||||
"Column group": "Kolonne gruppe",
|
||||
"Row": "R\u00e6kke",
|
||||
"Insert column before": "Inds\u00e6t kolonne f\u00f8r",
|
||||
"Split cell": "Split celle",
|
||||
"Cell padding": "Celle padding",
|
||||
"Cell spacing": "Celle afstand",
|
||||
"Row type": "R\u00e6kke type",
|
||||
"Insert table": "Inds\u00e6t tabel",
|
||||
"Body": "Krop",
|
||||
"Caption": "Tekst",
|
||||
"Footer": "Sidefod",
|
||||
"Delete row": "Slet r\u00e6kke",
|
||||
"Paste row before": "Inds\u00e6t r\u00e6kke f\u00f8r",
|
||||
"Scope": "Anvendelsesomr\u00e5de",
|
||||
"Delete table": "Slet tabel",
|
||||
"H Align": "H juster",
|
||||
"Top": "Top",
|
||||
"Header cell": "Sidehoved celle",
|
||||
"Column": "Kolonne",
|
||||
"Row group": "R\u00e6kke gruppe",
|
||||
"Cell": "Celle",
|
||||
"Middle": "Midt",
|
||||
"Cell type": "Celle type",
|
||||
"Copy row": "Kopier r\u00e6kke",
|
||||
"Row properties": "R\u00e6kke egenskaber",
|
||||
"Table properties": "Tabel egenskaber",
|
||||
"Bottom": "Bund",
|
||||
"V Align": "V juster",
|
||||
"Header": "Sidehoved",
|
||||
"Right": "H\u00f8jre",
|
||||
"Insert column after": "Inds\u00e6t kolonne efter",
|
||||
"Cols": "Kolonne",
|
||||
"Insert row after": "Inds\u00e6t r\u00e6kke efter",
|
||||
"Width": "Bredde",
|
||||
"Cell properties": "Celle egenskaber",
|
||||
"Left": "Venstre",
|
||||
"Cut row": "Klip r\u00e6kke",
|
||||
"Delete column": "Slet kolonne",
|
||||
"Center": "Centrering",
|
||||
"Merge cells": "Flet celler",
|
||||
"Insert template": "Inds\u00e6t skabelon",
|
||||
"Templates": "Skabeloner",
|
||||
"Background color": "Baggrunds farve",
|
||||
"Custom...": "Brugerdefineret...",
|
||||
"Custom color": "Brugerdefineret farve",
|
||||
"No color": "Ingen farve",
|
||||
"Text color": "Tekst farve",
|
||||
"Show blocks": "Vis klokke",
|
||||
"Show invisible characters": "Vis usynlige tegn",
|
||||
"Words: {0}": "Ord: {0}",
|
||||
"Insert": "Inds\u00e6t",
|
||||
"File": "Fil",
|
||||
"Edit": "Rediger",
|
||||
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich Text omr\u00e5de. Tryk ALT-F9 for menu. Tryk ALT-F10 for toolbar. Tryk ALT-0 for hj\u00e6lp",
|
||||
"Tools": "V\u00e6rkt\u00f8j",
|
||||
"View": "Vis",
|
||||
"Table": "Tabel",
|
||||
"Format": "Format"
|
||||
});
|
||||
@@ -0,0 +1,219 @@
|
||||
tinymce.addI18n('de',{
|
||||
"Cut": "Ausschneiden",
|
||||
"Heading 5": "\u00dcberschrift 5",
|
||||
"Header 2": "\u00dcberschrift 2",
|
||||
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Ihr Browser unterst\u00fctzt leider keinen direkten Zugriff auf die Zwischenablage. Bitte benutzen Sie die Strg + X \/ C \/ V Tastenkombinationen.",
|
||||
"Heading 4": "\u00dcberschrift 4",
|
||||
"Div": "Textblock",
|
||||
"Heading 2": "\u00dcberschrift 2",
|
||||
"Paste": "Einf\u00fcgen",
|
||||
"Close": "Schlie\u00dfen",
|
||||
"Font Family": "Schriftart",
|
||||
"Pre": "Vorformatierter Text",
|
||||
"Align right": "Rechtsb\u00fcndig ausrichten",
|
||||
"New document": "Neues Dokument",
|
||||
"Blockquote": "Zitat",
|
||||
"Numbered list": "Nummerierte Liste",
|
||||
"Heading 1": "\u00dcberschrift 1",
|
||||
"Headings": "\u00dcberschriften",
|
||||
"Increase indent": "Einzug vergr\u00f6\u00dfern",
|
||||
"Formats": "Formate",
|
||||
"Headers": "\u00dcberschriften",
|
||||
"Select all": "Alles ausw\u00e4hlen",
|
||||
"Header 3": "\u00dcberschrift 3",
|
||||
"Blocks": "Absatzformate",
|
||||
"Undo": "R\u00fcckg\u00e4ngig",
|
||||
"Strikethrough": "Durchgestrichen",
|
||||
"Bullet list": "Aufz\u00e4hlung",
|
||||
"Header 1": "\u00dcberschrift 1",
|
||||
"Superscript": "Hochgestellt",
|
||||
"Clear formatting": "Formatierung entfernen",
|
||||
"Font Sizes": "Schriftgr\u00f6\u00dfe",
|
||||
"Subscript": "Tiefgestellt",
|
||||
"Header 6": "\u00dcberschrift 6",
|
||||
"Redo": "Wiederholen",
|
||||
"Paragraph": "Absatz",
|
||||
"Ok": "Ok",
|
||||
"Bold": "Fett",
|
||||
"Code": "Quelltext",
|
||||
"Italic": "Kursiv",
|
||||
"Align center": "Zentriert ausrichten",
|
||||
"Header 5": "\u00dcberschrift 5",
|
||||
"Heading 6": "\u00dcberschrift 6",
|
||||
"Heading 3": "\u00dcberschrift 3",
|
||||
"Decrease indent": "Einzug verkleinern",
|
||||
"Header 4": "\u00dcberschrift 4",
|
||||
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Einf\u00fcgen ist nun im einfachen Textmodus. Inhalte werden ab jetzt als unformatierter Text eingef\u00fcgt, bis Sie diese Einstellung wieder ausschalten!",
|
||||
"Underline": "Unterstrichen",
|
||||
"Cancel": "Abbrechen",
|
||||
"Justify": "Blocksatz",
|
||||
"Inline": "Zeichenformate",
|
||||
"Copy": "Kopieren",
|
||||
"Align left": "Linksb\u00fcndig ausrichten",
|
||||
"Visual aids": "Visuelle Hilfen",
|
||||
"Lower Greek": "Griechische Kleinbuchstaben",
|
||||
"Square": "Quadrat",
|
||||
"Default": "Standard",
|
||||
"Lower Alpha": "Kleinbuchstaben",
|
||||
"Circle": "Kreis",
|
||||
"Disc": "Punkt",
|
||||
"Upper Alpha": "Gro\u00dfbuchstaben",
|
||||
"Upper Roman": "R\u00f6mische Zahlen (Gro\u00dfbuchstaben)",
|
||||
"Lower Roman": "R\u00f6mische Zahlen (Kleinbuchstaben)",
|
||||
"Name": "Name",
|
||||
"Anchor": "Textmarke",
|
||||
"You have unsaved changes are you sure you want to navigate away?": "Die \u00c4nderungen wurden noch nicht gespeichert, sind Sie sicher, dass Sie diese Seite verlassen wollen?",
|
||||
"Restore last draft": "Letzten Entwurf wiederherstellen",
|
||||
"Special character": "Sonderzeichen",
|
||||
"Source code": "Quelltext",
|
||||
"B": "B",
|
||||
"R": "R",
|
||||
"G": "G",
|
||||
"Color": "Farbe",
|
||||
"Right to left": "Von rechts nach links",
|
||||
"Left to right": "Von links nach rechts",
|
||||
"Emoticons": "Emoticons",
|
||||
"Robots": "Robots",
|
||||
"Document properties": "Dokumenteigenschaften",
|
||||
"Title": "Titel",
|
||||
"Keywords": "Sch\u00fcsselw\u00f6rter",
|
||||
"Encoding": "Zeichenkodierung",
|
||||
"Description": "Beschreibung",
|
||||
"Author": "Verfasser",
|
||||
"Fullscreen": "Vollbild",
|
||||
"Horizontal line": "Horizontale Linie",
|
||||
"Horizontal space": "Horizontaler Abstand",
|
||||
"Insert\/edit image": "Bild einf\u00fcgen\/bearbeiten",
|
||||
"General": "Allgemein",
|
||||
"Advanced": "Erweitert",
|
||||
"Source": "Quelle",
|
||||
"Border": "Rahmen",
|
||||
"Constrain proportions": "Seitenverh\u00e4ltnis beibehalten",
|
||||
"Vertical space": "Vertikaler Abstand",
|
||||
"Image description": "Bildbeschreibung",
|
||||
"Style": "Stil",
|
||||
"Dimensions": "Abmessungen",
|
||||
"Insert image": "Bild einf\u00fcgen",
|
||||
"Zoom in": "Ansicht vergr\u00f6\u00dfern",
|
||||
"Contrast": "Kontrast",
|
||||
"Back": "Zur\u00fcck",
|
||||
"Gamma": "Gamma",
|
||||
"Flip horizontally": "Horizontal spiegeln",
|
||||
"Resize": "Skalieren",
|
||||
"Sharpen": "Sch\u00e4rfen",
|
||||
"Zoom out": "Ansicht verkleinern",
|
||||
"Image options": "Bildeigenschaften",
|
||||
"Apply": "Anwenden",
|
||||
"Brightness": "Helligkeit",
|
||||
"Rotate clockwise": "Im Uhrzeigersinn drehen",
|
||||
"Rotate counterclockwise": "Gegen den Uhrzeigersinn drehen",
|
||||
"Edit image": "Bild bearbeiten",
|
||||
"Color levels": "Farbwerte",
|
||||
"Crop": "Bescheiden",
|
||||
"Orientation": "Ausrichtung",
|
||||
"Flip vertically": "Vertikal spiegeln",
|
||||
"Invert": "Invertieren",
|
||||
"Insert date\/time": "Datum\/Uhrzeit einf\u00fcgen ",
|
||||
"Remove link": "Link entfernen",
|
||||
"Url": "URL",
|
||||
"Text to display": "Anzuzeigender Text",
|
||||
"Anchors": "Textmarken",
|
||||
"Insert link": "Link einf\u00fcgen",
|
||||
"New window": "Neues Fenster",
|
||||
"None": "Keine",
|
||||
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "Diese Adresse scheint ein externer Link zu sein. M\u00f6chten Sie das dazu ben\u00f6tigte \"http:\/\/\" voranstellen?",
|
||||
"Target": "Ziel",
|
||||
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "Diese Adresse scheint eine E-Mail-Adresse zu sein. M\u00f6chten Sie das dazu ben\u00f6tigte \"mailto:\" voranstellen?",
|
||||
"Insert\/edit link": "Link einf\u00fcgen\/bearbeiten",
|
||||
"Insert\/edit video": "Video einf\u00fcgen\/bearbeiten",
|
||||
"Poster": "Poster",
|
||||
"Alternative source": "Alternative Quelle",
|
||||
"Paste your embed code below:": "F\u00fcgen Sie Ihren Einbettungscode hier ein:",
|
||||
"Insert video": "Video einf\u00fcgen",
|
||||
"Embed": "Einbetten",
|
||||
"Nonbreaking space": "Gesch\u00fctztes Leerzeichen",
|
||||
"Page break": "Seitenumbruch",
|
||||
"Paste as text": "Als Text einf\u00fcgen",
|
||||
"Preview": "Vorschau",
|
||||
"Print": "Drucken",
|
||||
"Save": "Speichern",
|
||||
"Could not find the specified string.": "Die Zeichenfolge wurde nicht gefunden.",
|
||||
"Replace": "Ersetzen",
|
||||
"Next": "Weiter",
|
||||
"Whole words": "Nur ganze W\u00f6rter",
|
||||
"Find and replace": "Suchen und ersetzen",
|
||||
"Replace with": "Ersetzen durch",
|
||||
"Find": "Suchen",
|
||||
"Replace all": "Alles ersetzen",
|
||||
"Match case": "Gro\u00df-\/Kleinschreibung beachten",
|
||||
"Prev": "Zur\u00fcck",
|
||||
"Spellcheck": "Rechtschreibpr\u00fcfung",
|
||||
"Finish": "Ende",
|
||||
"Ignore all": "Alles Ignorieren",
|
||||
"Ignore": "Ignorieren",
|
||||
"Add to Dictionary": "Zum W\u00f6rterbuch hinzuf\u00fcgen",
|
||||
"Insert row before": "Neue Zeile davor einf\u00fcgen ",
|
||||
"Rows": "Zeilen",
|
||||
"Height": "H\u00f6he",
|
||||
"Paste row after": "Zeile danach einf\u00fcgen",
|
||||
"Alignment": "Ausrichtung",
|
||||
"Border color": "Rahmenfarbe",
|
||||
"Column group": "Spaltengruppe",
|
||||
"Row": "Zeile",
|
||||
"Insert column before": "Neue Spalte davor einf\u00fcgen",
|
||||
"Split cell": "Zelle aufteilen",
|
||||
"Cell padding": "Zelleninnenabstand",
|
||||
"Cell spacing": "Zellenabstand",
|
||||
"Row type": "Zeilentyp",
|
||||
"Insert table": "Tabelle einf\u00fcgen",
|
||||
"Body": "Inhalt",
|
||||
"Caption": "Beschriftung",
|
||||
"Footer": "Fu\u00dfzeile",
|
||||
"Delete row": "Zeile l\u00f6schen",
|
||||
"Paste row before": "Zeile davor einf\u00fcgen",
|
||||
"Scope": "G\u00fcltigkeitsbereich",
|
||||
"Delete table": "Tabelle l\u00f6schen",
|
||||
"H Align": "Horizontale Ausrichtung",
|
||||
"Top": "Oben",
|
||||
"Header cell": "Kopfzelle",
|
||||
"Column": "Spalte",
|
||||
"Row group": "Zeilengruppe",
|
||||
"Cell": "Zelle",
|
||||
"Middle": "Mitte",
|
||||
"Cell type": "Zellentyp",
|
||||
"Copy row": "Zeile kopieren",
|
||||
"Row properties": "Zeileneigenschaften",
|
||||
"Table properties": "Tabelleneigenschaften",
|
||||
"Bottom": "Unten",
|
||||
"V Align": "Vertikale Ausrichtung",
|
||||
"Header": "Kopfzeile",
|
||||
"Right": "Rechtsb\u00fcndig",
|
||||
"Insert column after": "Neue Spalte danach einf\u00fcgen",
|
||||
"Cols": "Spalten",
|
||||
"Insert row after": "Neue Zeile danach einf\u00fcgen",
|
||||
"Width": "Breite",
|
||||
"Cell properties": "Zelleneigenschaften",
|
||||
"Left": "Linksb\u00fcndig",
|
||||
"Cut row": "Zeile ausschneiden",
|
||||
"Delete column": "Spalte l\u00f6schen",
|
||||
"Center": "Zentriert",
|
||||
"Merge cells": "Zellen verbinden",
|
||||
"Insert template": "Vorlage einf\u00fcgen ",
|
||||
"Templates": "Vorlagen",
|
||||
"Background color": "Hintergrundfarbe",
|
||||
"Custom...": "Benutzerdefiniert...",
|
||||
"Custom color": "Benutzerdefinierte Farbe",
|
||||
"No color": "Keine Farbe",
|
||||
"Text color": "Textfarbe",
|
||||
"Show blocks": " Bl\u00f6cke anzeigen",
|
||||
"Show invisible characters": "Unsichtbare Zeichen anzeigen",
|
||||
"Words: {0}": "W\u00f6rter: {0}",
|
||||
"Insert": "Einf\u00fcgen",
|
||||
"File": "Datei",
|
||||
"Edit": "Bearbeiten",
|
||||
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich-Text- Area. Dr\u00fccken Sie ALT-F9 f\u00fcr das Men\u00fc. Dr\u00fccken Sie ALT-F10 f\u00fcr Symbolleiste. Dr\u00fccken Sie ALT-0 f\u00fcr Hilfe",
|
||||
"Tools": "Werkzeuge",
|
||||
"View": "Ansicht",
|
||||
"Table": "Tabelle",
|
||||
"Format": "Format"
|
||||
});
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,219 @@
|
||||
tinymce.addI18n('fi',{
|
||||
"Cut": "Leikkaa",
|
||||
"Heading 5": "Otsikko 5",
|
||||
"Header 2": "Otsikko 2",
|
||||
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Selaimesi ei tue leikep\u00f6yd\u00e4n suoraa k\u00e4ytt\u00e4mist\u00e4. Ole hyv\u00e4 ja k\u00e4yt\u00e4 n\u00e4pp\u00e4imist\u00f6n Ctrl+X\/C\/V n\u00e4pp\u00e4inyhdistelmi\u00e4.",
|
||||
"Heading 4": "Otsikko 4",
|
||||
"Div": "Div",
|
||||
"Heading 2": "Otsikko 2",
|
||||
"Paste": "Liit\u00e4",
|
||||
"Close": "Sulje",
|
||||
"Font Family": "Fontti",
|
||||
"Pre": "Esimuotoiltu",
|
||||
"Align right": "Tasaa oikealle",
|
||||
"New document": "Uusi dokumentti",
|
||||
"Blockquote": "Lainauslohko",
|
||||
"Numbered list": "J\u00e4rjestetty lista",
|
||||
"Heading 1": "Otsikko 1",
|
||||
"Headings": "Otsikot",
|
||||
"Increase indent": "Loitonna",
|
||||
"Formats": "Muotoilut",
|
||||
"Headers": "Otsikot",
|
||||
"Select all": "Valitse kaikki",
|
||||
"Header 3": "Otsikko 3",
|
||||
"Blocks": "Lohkot",
|
||||
"Undo": "Peru",
|
||||
"Strikethrough": "Yliviivaus",
|
||||
"Bullet list": "J\u00e4rjest\u00e4m\u00e4t\u00f6n lista",
|
||||
"Header 1": "Otsikko 1",
|
||||
"Superscript": "Yl\u00e4indeksi",
|
||||
"Clear formatting": "Poista muotoilu",
|
||||
"Font Sizes": "Fonttikoko",
|
||||
"Subscript": "Alaindeksi",
|
||||
"Header 6": "Otsikko 6",
|
||||
"Redo": "Tee uudelleen",
|
||||
"Paragraph": "Kappale",
|
||||
"Ok": "Ok",
|
||||
"Bold": "Lihavointi",
|
||||
"Code": "Koodi",
|
||||
"Italic": "Kursivointi",
|
||||
"Align center": "Keskit\u00e4",
|
||||
"Header 5": "Otsikko 5",
|
||||
"Heading 6": "Otsikko 6",
|
||||
"Heading 3": "Otsikko 3",
|
||||
"Decrease indent": "Sisenn\u00e4",
|
||||
"Header 4": "Otsikko 4",
|
||||
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Liitt\u00e4minen on nyt pelk\u00e4n tekstin -tilassa. Sis\u00e4ll\u00f6t liitet\u00e4\u00e4n nyt pelkk\u00e4n\u00e4 tekstin\u00e4, kunnes otat vaihtoehdon pois k\u00e4yt\u00f6st\u00e4.",
|
||||
"Underline": "Alleviivaus",
|
||||
"Cancel": "Peruuta",
|
||||
"Justify": "Tasaa",
|
||||
"Inline": "Samalla rivill\u00e4",
|
||||
"Copy": "Kopioi",
|
||||
"Align left": "Tasaa vasemmalle",
|
||||
"Visual aids": "Visuaaliset neuvot",
|
||||
"Lower Greek": "pienet kirjaimet: \u03b1, \u03b2, \u03b3",
|
||||
"Square": "Neli\u00f6",
|
||||
"Default": "Oletus",
|
||||
"Lower Alpha": "pienet kirjaimet: a, b, c",
|
||||
"Circle": "Pallo",
|
||||
"Disc": "Ympyr\u00e4",
|
||||
"Upper Alpha": "isot kirjaimet: A, B, C",
|
||||
"Upper Roman": "isot kirjaimet: I, II, III",
|
||||
"Lower Roman": "pienet kirjaimet: i, ii, iii",
|
||||
"Name": "Nimi",
|
||||
"Anchor": "Ankkuri",
|
||||
"You have unsaved changes are you sure you want to navigate away?": "Sinulla on tallentamattomia muutoksia, haluatko varmasti siirty\u00e4 toiselle sivulle?",
|
||||
"Restore last draft": "Palauta aiempi luonnos",
|
||||
"Special character": "Erikoismerkki",
|
||||
"Source code": "L\u00e4hdekoodi",
|
||||
"B": "B",
|
||||
"R": "R",
|
||||
"G": "G",
|
||||
"Color": "V\u00e4ri",
|
||||
"Right to left": "Oikealta vasemmalle",
|
||||
"Left to right": "Vasemmalta oikealle",
|
||||
"Emoticons": "Hymi\u00f6t",
|
||||
"Robots": "Robotit",
|
||||
"Document properties": "Dokumentin ominaisuudet",
|
||||
"Title": "Otsikko",
|
||||
"Keywords": "Avainsanat",
|
||||
"Encoding": "Merkist\u00f6",
|
||||
"Description": "Kuvaus",
|
||||
"Author": "Tekij\u00e4",
|
||||
"Fullscreen": "Koko ruutu",
|
||||
"Horizontal line": "Vaakasuora viiva",
|
||||
"Horizontal space": "Horisontaalinen tila",
|
||||
"Insert\/edit image": "Lis\u00e4\u00e4\/muokkaa kuva",
|
||||
"General": "Yleiset",
|
||||
"Advanced": "Lis\u00e4asetukset",
|
||||
"Source": "L\u00e4hde",
|
||||
"Border": "Reunus",
|
||||
"Constrain proportions": "S\u00e4ilyt\u00e4 mittasuhteet",
|
||||
"Vertical space": "Vertikaalinen tila",
|
||||
"Image description": "Kuvaus",
|
||||
"Style": "Tyyli",
|
||||
"Dimensions": "Mittasuhteet",
|
||||
"Insert image": "Lis\u00e4\u00e4 kuva",
|
||||
"Zoom in": "L\u00e4henn\u00e4",
|
||||
"Contrast": "Kontrasti",
|
||||
"Back": "Takaisin",
|
||||
"Gamma": "Gamma",
|
||||
"Flip horizontally": "K\u00e4\u00e4nn\u00e4 vaakasuunnassa",
|
||||
"Resize": "Kuvan koon muutos",
|
||||
"Sharpen": "Ter\u00e4vyys",
|
||||
"Zoom out": "Loitonna",
|
||||
"Image options": "Kuvan asetukset",
|
||||
"Apply": "Aseta",
|
||||
"Brightness": "Kirkkaus",
|
||||
"Rotate clockwise": "Kierr\u00e4 my\u00f6t\u00e4p\u00e4iv\u00e4\u00e4n",
|
||||
"Rotate counterclockwise": "Kierr\u00e4 vastap\u00e4iv\u00e4\u00e4n",
|
||||
"Edit image": "Muokkaa kuvaa",
|
||||
"Color levels": "V\u00e4ritasot",
|
||||
"Crop": "Rajaa valintaan",
|
||||
"Orientation": "Suunta",
|
||||
"Flip vertically": "K\u00e4\u00e4nn\u00e4 pystysuunnassa",
|
||||
"Invert": "K\u00e4\u00e4nteinen",
|
||||
"Insert date\/time": "Lis\u00e4\u00e4 p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4 tai aika",
|
||||
"Remove link": "Poista linkki",
|
||||
"Url": "Osoite",
|
||||
"Text to display": "N\u00e4ytett\u00e4v\u00e4 teksti",
|
||||
"Anchors": "Ankkurit",
|
||||
"Insert link": "Lis\u00e4\u00e4 linkki",
|
||||
"New window": "Uusi ikkuna",
|
||||
"None": "Ei mit\u00e4\u00e4n",
|
||||
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "Antamasi osoite n\u00e4ytt\u00e4\u00e4 olevan ulkoinen linkki. Haluatko lis\u00e4t\u00e4 osoitteeseen vaaditun http:\/\/ -etuliitteen?",
|
||||
"Target": "Kohde",
|
||||
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "Antamasi osoite n\u00e4ytt\u00e4\u00e4 olevan s\u00e4hk\u00f6postiosoite. Haluatko lis\u00e4t\u00e4 osoitteeseen vaaditun mailto: -etuliitteen?",
|
||||
"Insert\/edit link": "Lis\u00e4\u00e4\/muokkaa linkki",
|
||||
"Insert\/edit video": "Lis\u00e4\u00e4\/muokkaa video",
|
||||
"Poster": "L\u00e4hett\u00e4j\u00e4",
|
||||
"Alternative source": "Vaihtoehtoinen l\u00e4hde",
|
||||
"Paste your embed code below:": "Liit\u00e4 upotuskoodisi alapuolelle:",
|
||||
"Insert video": "Lis\u00e4\u00e4 video",
|
||||
"Embed": "Upota",
|
||||
"Nonbreaking space": "Sitova v\u00e4lily\u00f6nti",
|
||||
"Page break": "Sivunvaihto",
|
||||
"Paste as text": "Liit\u00e4 tekstin\u00e4",
|
||||
"Preview": "Esikatselu",
|
||||
"Print": "Tulosta",
|
||||
"Save": "Tallenna",
|
||||
"Could not find the specified string.": "Haettua merkkijonoa ei l\u00f6ytynyt.",
|
||||
"Replace": "Korvaa",
|
||||
"Next": "Seur.",
|
||||
"Whole words": "Koko sanat",
|
||||
"Find and replace": "Etsi ja korvaa",
|
||||
"Replace with": "Korvaa",
|
||||
"Find": "Etsi",
|
||||
"Replace all": "Korvaa kaikki",
|
||||
"Match case": "Erota isot ja pienet kirjaimet",
|
||||
"Prev": "Edel.",
|
||||
"Spellcheck": "Oikolue",
|
||||
"Finish": "Lopeta",
|
||||
"Ignore all": "\u00c4l\u00e4 huomioi mit\u00e4\u00e4n",
|
||||
"Ignore": "\u00c4l\u00e4 huomioi",
|
||||
"Add to Dictionary": "Lis\u00e4\u00e4 sanakirjaan",
|
||||
"Insert row before": "Lis\u00e4\u00e4 rivi ennen",
|
||||
"Rows": "Rivit",
|
||||
"Height": "Korkeus",
|
||||
"Paste row after": "Liit\u00e4 rivi j\u00e4lkeen",
|
||||
"Alignment": "Tasaus",
|
||||
"Border color": "Reunuksen v\u00e4ri",
|
||||
"Column group": "Sarakeryhm\u00e4",
|
||||
"Row": "Rivi",
|
||||
"Insert column before": "Lis\u00e4\u00e4 rivi ennen",
|
||||
"Split cell": "Jaa solu",
|
||||
"Cell padding": "Solun tyhj\u00e4 tila",
|
||||
"Cell spacing": "Solun v\u00e4li",
|
||||
"Row type": "Rivityyppi",
|
||||
"Insert table": "Lis\u00e4\u00e4 taulukko",
|
||||
"Body": "Runko",
|
||||
"Caption": "Seloste",
|
||||
"Footer": "Alaosa",
|
||||
"Delete row": "Poista rivi",
|
||||
"Paste row before": "Liit\u00e4 rivi ennen",
|
||||
"Scope": "Laajuus",
|
||||
"Delete table": "Poista taulukko",
|
||||
"H Align": "H tasaus",
|
||||
"Top": "Yl\u00e4reuna",
|
||||
"Header cell": "Otsikkosolu",
|
||||
"Column": "Sarake",
|
||||
"Row group": "Riviryhm\u00e4",
|
||||
"Cell": "Solu",
|
||||
"Middle": "Keskikohta",
|
||||
"Cell type": "Solun tyyppi",
|
||||
"Copy row": "Kopioi rivi",
|
||||
"Row properties": "Rivin ominaisuudet",
|
||||
"Table properties": "Taulukon ominaisuudet",
|
||||
"Bottom": "Alareuna",
|
||||
"V Align": "V tasaus",
|
||||
"Header": "Otsikko",
|
||||
"Right": "Oikea",
|
||||
"Insert column after": "Lis\u00e4\u00e4 rivi j\u00e4lkeen",
|
||||
"Cols": "Sarakkeet",
|
||||
"Insert row after": "Lis\u00e4\u00e4 rivi j\u00e4lkeen",
|
||||
"Width": "Leveys",
|
||||
"Cell properties": "Solun ominaisuudet",
|
||||
"Left": "Vasen",
|
||||
"Cut row": "Leikkaa rivi",
|
||||
"Delete column": "Poista sarake",
|
||||
"Center": "Keskell\u00e4",
|
||||
"Merge cells": "Yhdist\u00e4 solut",
|
||||
"Insert template": "Lis\u00e4\u00e4 pohja",
|
||||
"Templates": "Pohjat",
|
||||
"Background color": "Taustan v\u00e4ri",
|
||||
"Custom...": "Mukauta...",
|
||||
"Custom color": "Mukautettu v\u00e4ri",
|
||||
"No color": "Ei v\u00e4ri\u00e4",
|
||||
"Text color": "Tekstin v\u00e4ri",
|
||||
"Show blocks": "N\u00e4yt\u00e4 lohkot",
|
||||
"Show invisible characters": "N\u00e4yt\u00e4 n\u00e4kym\u00e4tt\u00f6m\u00e4t merkit",
|
||||
"Words: {0}": "Sanat: {0}",
|
||||
"Insert": "Lis\u00e4\u00e4",
|
||||
"File": "Tiedosto",
|
||||
"Edit": "Muokkaa",
|
||||
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rikastetun tekstin alue. Paina ALT-F9 valikkoon. Paina ALT-F10 ty\u00f6kaluriviin. Paina ALT-0 ohjeeseen.",
|
||||
"Tools": "Ty\u00f6kalut",
|
||||
"View": "N\u00e4yt\u00e4",
|
||||
"Table": "Taulukko",
|
||||
"Format": "Muotoilu"
|
||||
});
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,219 @@
|
||||
tinymce.addI18n('it',{
|
||||
"Cut": "Taglia",
|
||||
"Heading 5": "Intestazione 5",
|
||||
"Header 2": "Header 2",
|
||||
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Il tuo browser non supporta l'accesso diretto negli Appunti. Per favore usa i tasti di scelta rapida Ctrl+X\/C\/V.",
|
||||
"Heading 4": "Intestazione 4",
|
||||
"Div": "Div",
|
||||
"Heading 2": "Intestazione 2",
|
||||
"Paste": "Incolla",
|
||||
"Close": "Chiudi",
|
||||
"Font Family": "Famiglia font",
|
||||
"Pre": "Pre",
|
||||
"Align right": "Allinea a Destra",
|
||||
"New document": "Nuovo Documento",
|
||||
"Blockquote": "Blockquote",
|
||||
"Numbered list": "Elenchi Numerati",
|
||||
"Heading 1": "Intestazione 1",
|
||||
"Headings": "Intestazioni",
|
||||
"Increase indent": "Aumenta Rientro",
|
||||
"Formats": "Formattazioni",
|
||||
"Headers": "Intestazioni",
|
||||
"Select all": "Seleziona Tutto",
|
||||
"Header 3": "Intestazione 3",
|
||||
"Blocks": "Blocchi",
|
||||
"Undo": "Indietro",
|
||||
"Strikethrough": "Barrato",
|
||||
"Bullet list": "Elenchi Puntati",
|
||||
"Header 1": "Intestazione 1",
|
||||
"Superscript": "Apice",
|
||||
"Clear formatting": "Cancella Formattazione",
|
||||
"Font Sizes": "Dimensioni font",
|
||||
"Subscript": "Pedice",
|
||||
"Header 6": "Intestazione 6",
|
||||
"Redo": "Ripeti",
|
||||
"Paragraph": "Paragrafo",
|
||||
"Ok": "Ok",
|
||||
"Bold": "Grassetto",
|
||||
"Code": "Codice",
|
||||
"Italic": "Corsivo",
|
||||
"Align center": "Allinea al Cento",
|
||||
"Header 5": "Intestazione 5",
|
||||
"Heading 6": "Intestazione 6",
|
||||
"Heading 3": "Intestazione 3",
|
||||
"Decrease indent": "Riduci Rientro",
|
||||
"Header 4": "Intestazione 4",
|
||||
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Incolla \u00e8 in modalit\u00e0 testo normale. I contenuti sono incollati come testo normale se non disattivi l'opzione.",
|
||||
"Underline": "Sottolineato",
|
||||
"Cancel": "Annulla",
|
||||
"Justify": "Giustifica",
|
||||
"Inline": "Inlinea",
|
||||
"Copy": "Copia",
|
||||
"Align left": "Allinea a Sinistra",
|
||||
"Visual aids": "Elementi Visivi",
|
||||
"Lower Greek": "Greek Minore",
|
||||
"Square": "Quadrato",
|
||||
"Default": "Default",
|
||||
"Lower Alpha": "Alpha Minore",
|
||||
"Circle": "Cerchio",
|
||||
"Disc": "Disco",
|
||||
"Upper Alpha": "Alpha Superiore",
|
||||
"Upper Roman": "Roman Superiore",
|
||||
"Lower Roman": "Roman Minore",
|
||||
"Name": "Nome",
|
||||
"Anchor": "Fissa",
|
||||
"You have unsaved changes are you sure you want to navigate away?": "Non hai salvato delle modifiche, sei sicuro di andartene?",
|
||||
"Restore last draft": "Ripristina l'ultima bozza.",
|
||||
"Special character": "Carattere Speciale",
|
||||
"Source code": "Codice Sorgente",
|
||||
"B": "B",
|
||||
"R": "R",
|
||||
"G": "G",
|
||||
"Color": "Colore",
|
||||
"Right to left": "Da Destra a Sinistra",
|
||||
"Left to right": "Da Sinistra a Destra",
|
||||
"Emoticons": "Emoction",
|
||||
"Robots": "Robot",
|
||||
"Document properties": "Propriet\u00e0 Documento",
|
||||
"Title": "Titolo",
|
||||
"Keywords": "Parola Chiave",
|
||||
"Encoding": "Codifica",
|
||||
"Description": "Descrizione",
|
||||
"Author": "Autore",
|
||||
"Fullscreen": "Schermo Intero",
|
||||
"Horizontal line": "Linea Orizzontale",
|
||||
"Horizontal space": "Spazio Orizzontale",
|
||||
"Insert\/edit image": "Aggiungi\/Modifica Immagine",
|
||||
"General": "Generale",
|
||||
"Advanced": "Avanzato",
|
||||
"Source": "Fonte",
|
||||
"Border": "Bordo",
|
||||
"Constrain proportions": "Mantieni Proporzioni",
|
||||
"Vertical space": "Spazio Verticale",
|
||||
"Image description": "Descrizione Immagine",
|
||||
"Style": "Stile",
|
||||
"Dimensions": "Dimenzioni",
|
||||
"Insert image": "Inserisci immagine",
|
||||
"Zoom in": "Ingrandisci",
|
||||
"Contrast": "Contrasto",
|
||||
"Back": "Indietro",
|
||||
"Gamma": "Gamma",
|
||||
"Flip horizontally": "Rifletti orizzontalmente",
|
||||
"Resize": "Ridimensiona",
|
||||
"Sharpen": "Contrasta",
|
||||
"Zoom out": "Rimpicciolisci",
|
||||
"Image options": "Opzioni immagine",
|
||||
"Apply": "Applica",
|
||||
"Brightness": "Luminosit\u00e0",
|
||||
"Rotate clockwise": "Ruota in senso orario",
|
||||
"Rotate counterclockwise": "Ruota in senso antiorario",
|
||||
"Edit image": "Modifica immagine",
|
||||
"Color levels": "Livelli colore",
|
||||
"Crop": "Taglia",
|
||||
"Orientation": "Orientamento",
|
||||
"Flip vertically": "Rifletti verticalmente",
|
||||
"Invert": "Inverti",
|
||||
"Insert date\/time": "Inserisci Data\/Ora",
|
||||
"Remove link": "Rimuovi link",
|
||||
"Url": "Url",
|
||||
"Text to display": "Testo da Visualizzare",
|
||||
"Anchors": "Anchors",
|
||||
"Insert link": "Inserisci il Link",
|
||||
"New window": "Nuova Finestra",
|
||||
"None": "No",
|
||||
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "L'URL inserito sembra essere un collegamento esterno. Vuoi aggiungere il prefisso necessario http:\/\/?",
|
||||
"Target": "Target",
|
||||
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "L'URL inserito sembra essere un indirizzo email. Vuoi aggiungere il prefisso necessario mailto:?",
|
||||
"Insert\/edit link": "Inserisci\/Modifica Link",
|
||||
"Insert\/edit video": "Inserisci\/Modifica Video",
|
||||
"Poster": "Anteprima",
|
||||
"Alternative source": "Alternativo",
|
||||
"Paste your embed code below:": "Incolla il codice d'incorporamento qui:",
|
||||
"Insert video": "Inserisci Video",
|
||||
"Embed": "Incorporare",
|
||||
"Nonbreaking space": "Spazio unificatore",
|
||||
"Page break": "Interruzione di pagina",
|
||||
"Paste as text": "incolla come testo",
|
||||
"Preview": "Anteprima",
|
||||
"Print": "Stampa",
|
||||
"Save": "Salva",
|
||||
"Could not find the specified string.": "Impossibile trovare la parola specifica.",
|
||||
"Replace": "Sostituisci",
|
||||
"Next": "Successivo",
|
||||
"Whole words": "Parole Sbagliate",
|
||||
"Find and replace": "Trova e Sostituisci",
|
||||
"Replace with": "Sostituisci Con",
|
||||
"Find": "Trova",
|
||||
"Replace all": "Sostituisci Tutto",
|
||||
"Match case": "Maiuscole\/Minuscole ",
|
||||
"Prev": "Precedente",
|
||||
"Spellcheck": "Controllo ortografico",
|
||||
"Finish": "Termina",
|
||||
"Ignore all": "Ignora Tutto",
|
||||
"Ignore": "Ignora",
|
||||
"Add to Dictionary": "Aggiungi al Dizionario",
|
||||
"Insert row before": "Inserisci una Riga Prima",
|
||||
"Rows": "Righe",
|
||||
"Height": "Altezza",
|
||||
"Paste row after": "Incolla una Riga Dopo",
|
||||
"Alignment": "Allineamento",
|
||||
"Border color": "Colore bordo",
|
||||
"Column group": "Gruppo di Colonne",
|
||||
"Row": "Riga",
|
||||
"Insert column before": "Inserisci una Colonna Prima",
|
||||
"Split cell": "Dividi Cella",
|
||||
"Cell padding": "Padding della Cella",
|
||||
"Cell spacing": "Spaziatura della Cella",
|
||||
"Row type": "Tipo di Riga",
|
||||
"Insert table": "Inserisci Tabella",
|
||||
"Body": "Body",
|
||||
"Caption": "Didascalia",
|
||||
"Footer": "Footer",
|
||||
"Delete row": "Cancella Riga",
|
||||
"Paste row before": "Incolla una Riga Prima",
|
||||
"Scope": "Campo",
|
||||
"Delete table": "Cancella Tabella",
|
||||
"H Align": "Allineamento H",
|
||||
"Top": "In alto",
|
||||
"Header cell": "cella d'intestazione",
|
||||
"Column": "Colonna",
|
||||
"Row group": "Gruppo di Righe",
|
||||
"Cell": "Cella",
|
||||
"Middle": "In mezzo",
|
||||
"Cell type": "Tipo di Cella",
|
||||
"Copy row": "Copia Riga",
|
||||
"Row properties": "Propriet\u00e0 della Riga",
|
||||
"Table properties": "Propiet\u00e0 della Tabella",
|
||||
"Bottom": "In fondo",
|
||||
"V Align": "Allineamento V",
|
||||
"Header": "Header",
|
||||
"Right": "Destra",
|
||||
"Insert column after": "Inserisci una Colonna Dopo",
|
||||
"Cols": "Colonne",
|
||||
"Insert row after": "Inserisci una Riga Dopo",
|
||||
"Width": "Larghezza",
|
||||
"Cell properties": "Propiet\u00e0 della Cella",
|
||||
"Left": "Sinistra",
|
||||
"Cut row": "Taglia Riga",
|
||||
"Delete column": "Cancella Colonna",
|
||||
"Center": "Centro",
|
||||
"Merge cells": "Unisci Cella",
|
||||
"Insert template": "Inserisci Template",
|
||||
"Templates": "Template",
|
||||
"Background color": "Colore Background",
|
||||
"Custom...": "Personalizzato...",
|
||||
"Custom color": "Colore personalizzato",
|
||||
"No color": "Nessun colore",
|
||||
"Text color": "Colore Testo",
|
||||
"Show blocks": "Mostra Blocchi",
|
||||
"Show invisible characters": "Mostra Caratteri Invisibili",
|
||||
"Words: {0}": "Parole: {0}",
|
||||
"Insert": "Inserisci",
|
||||
"File": "File",
|
||||
"Edit": "Modifica",
|
||||
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich Text Area. Premi ALT-F9 per il men\u00f9. Premi ALT-F10 per la barra degli strumenti. Premi ALT-0 per l'aiuto.",
|
||||
"Tools": "Strumenti",
|
||||
"View": "Visualiza",
|
||||
"Table": "Tabella",
|
||||
"Format": "Formato"
|
||||
});
|
||||
@@ -0,0 +1,219 @@
|
||||
tinymce.addI18n('ja',{
|
||||
"Cut": "\u5207\u308a\u53d6\u308a",
|
||||
"Heading 5": "\u898b\u51fa\u3057 5",
|
||||
"Header 2": "\u30d8\u30c3\u30c0\u30fc 2",
|
||||
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u304a\u4f7f\u3044\u306e\u30d6\u30e9\u30a6\u30b6\u3067\u306f\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u6a5f\u80fd\u3092\u5229\u7528\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002\u30ad\u30fc\u30dc\u30fc\u30c9\u306e\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8\uff08Ctrl+X, Ctrl+C, Ctrl+V\uff09\u3092\u304a\u4f7f\u3044\u4e0b\u3055\u3044\u3002",
|
||||
"Heading 4": "\u898b\u51fa\u3057 4",
|
||||
"Div": "Div",
|
||||
"Heading 2": "\u898b\u51fa\u3057 2",
|
||||
"Paste": "\u8cbc\u308a\u4ed8\u3051",
|
||||
"Close": "\u9589\u3058\u308b",
|
||||
"Font Family": "\u30d5\u30a9\u30f3\u30c8\u30d5\u30a1\u30df\u30ea\u30fc",
|
||||
"Pre": "Pre",
|
||||
"Align right": "\u53f3\u5bc4\u305b",
|
||||
"New document": "\u65b0\u898f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8",
|
||||
"Blockquote": "\u5f15\u7528",
|
||||
"Numbered list": "\u756a\u53f7\u4ed8\u304d\u7b87\u6761\u66f8\u304d",
|
||||
"Heading 1": "\u898b\u51fa\u3057 1",
|
||||
"Headings": "\u898b\u51fa\u3057",
|
||||
"Increase indent": "\u30a4\u30f3\u30c7\u30f3\u30c8\u3092\u5897\u3084\u3059",
|
||||
"Formats": "\u66f8\u5f0f",
|
||||
"Headers": "\u30d8\u30c3\u30c0\u30fc",
|
||||
"Select all": "\u5168\u3066\u3092\u9078\u629e",
|
||||
"Header 3": "\u30d8\u30c3\u30c0\u30fc 3",
|
||||
"Blocks": "\u30d6\u30ed\u30c3\u30af",
|
||||
"Undo": "\u5143\u306b\u623b\u3059",
|
||||
"Strikethrough": "\u53d6\u308a\u6d88\u3057\u7dda",
|
||||
"Bullet list": "\u7b87\u6761\u66f8\u304d",
|
||||
"Header 1": "\u30d8\u30c3\u30c0\u30fc 1",
|
||||
"Superscript": "\u4e0a\u4ed8\u304d\u6587\u5b57",
|
||||
"Clear formatting": "\u66f8\u5f0f\u3092\u30af\u30ea\u30a2",
|
||||
"Font Sizes": "\u30d5\u30a9\u30f3\u30c8\u30b5\u30a4\u30ba",
|
||||
"Subscript": "\u4e0b\u4ed8\u304d\u6587\u5b57",
|
||||
"Header 6": "\u30d8\u30c3\u30c0\u30fc 6",
|
||||
"Redo": "\u3084\u308a\u76f4\u3059",
|
||||
"Paragraph": "\u6bb5\u843d",
|
||||
"Ok": "OK",
|
||||
"Bold": "\u592a\u5b57",
|
||||
"Code": "\u30b3\u30fc\u30c9",
|
||||
"Italic": "\u659c\u4f53",
|
||||
"Align center": "\u4e2d\u592e\u63c3\u3048",
|
||||
"Header 5": "\u30d8\u30c3\u30c0\u30fc 5",
|
||||
"Heading 6": "\u898b\u51fa\u3057 6",
|
||||
"Heading 3": "\u898b\u51fa\u3057 3",
|
||||
"Decrease indent": "\u30a4\u30f3\u30c7\u30f3\u30c8\u3092\u6e1b\u3089\u3059",
|
||||
"Header 4": "\u30d8\u30c3\u30c0\u30fc 4",
|
||||
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u8cbc\u308a\u4ed8\u3051\u306f\u73fe\u5728\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\u30e2\u30fc\u30c9\u3067\u3059\u3002\u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u30aa\u30d5\u306b\u3057\u306a\u3044\u9650\u308a\u5185\u5bb9\u306f\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\u3068\u3057\u3066\u8cbc\u308a\u4ed8\u3051\u3089\u308c\u307e\u3059\u3002",
|
||||
"Underline": "\u4e0b\u7dda",
|
||||
"Cancel": "\u30ad\u30e3\u30f3\u30bb\u30eb",
|
||||
"Justify": "\u4e21\u7aef\u63c3\u3048",
|
||||
"Inline": "\u30a4\u30f3\u30e9\u30a4\u30f3",
|
||||
"Copy": "\u30b3\u30d4\u30fc",
|
||||
"Align left": "\u5de6\u5bc4\u305b",
|
||||
"Visual aids": "\u8868\u306e\u67a0\u7dda\u3092\u70b9\u7dda\u3067\u8868\u793a",
|
||||
"Lower Greek": "\u5c0f\u6587\u5b57\u306e\u30ae\u30ea\u30b7\u30e3\u6587\u5b57",
|
||||
"Square": "\u56db\u89d2",
|
||||
"Default": "\u30c7\u30d5\u30a9\u30eb\u30c8",
|
||||
"Lower Alpha": "\u5c0f\u6587\u5b57\u306e\u30a2\u30eb\u30d5\u30a1\u30d9\u30c3\u30c8",
|
||||
"Circle": "\u5186",
|
||||
"Disc": "\u70b9",
|
||||
"Upper Alpha": "\u5927\u6587\u5b57\u306e\u30a2\u30eb\u30d5\u30a1\u30d9\u30c3\u30c8",
|
||||
"Upper Roman": "\u5927\u6587\u5b57\u306e\u30ed\u30fc\u30de\u6570\u5b57",
|
||||
"Lower Roman": "\u5c0f\u6587\u5b57\u306e\u30ed\u30fc\u30de\u6570\u5b57",
|
||||
"Name": "\u30a2\u30f3\u30ab\u30fc\u540d",
|
||||
"Anchor": "\u30a2\u30f3\u30ab\u30fc\uff08\u30ea\u30f3\u30af\u306e\u5230\u9054\u70b9\uff09",
|
||||
"You have unsaved changes are you sure you want to navigate away?": "\u307e\u3060\u4fdd\u5b58\u3057\u3066\u3044\u306a\u3044\u5909\u66f4\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u672c\u5f53\u306b\u3053\u306e\u30da\u30fc\u30b8\u3092\u96e2\u308c\u307e\u3059\u304b\uff1f",
|
||||
"Restore last draft": "\u524d\u56de\u306e\u4e0b\u66f8\u304d\u3092\u5fa9\u6d3b\u3055\u305b\u308b",
|
||||
"Special character": "\u7279\u6b8a\u6587\u5b57",
|
||||
"Source code": "\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9",
|
||||
"B": "B",
|
||||
"R": "R",
|
||||
"G": "G",
|
||||
"Color": "\u30ab\u30e9\u30fc",
|
||||
"Right to left": "\u53f3\u304b\u3089\u5de6",
|
||||
"Left to right": "\u5de6\u304b\u3089\u53f3",
|
||||
"Emoticons": "\u7d75\u6587\u5b57",
|
||||
"Robots": "\u30ed\u30dc\u30c3\u30c4",
|
||||
"Document properties": "\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u30d7\u30ed\u30d1\u30c6\u30a3",
|
||||
"Title": "\u30bf\u30a4\u30c8\u30eb",
|
||||
"Keywords": "\u30ad\u30fc\u30ef\u30fc\u30c9",
|
||||
"Encoding": "\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0",
|
||||
"Description": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u5185\u5bb9",
|
||||
"Author": "\u8457\u8005",
|
||||
"Fullscreen": "\u5168\u753b\u9762\u8868\u793a",
|
||||
"Horizontal line": "\u6c34\u5e73\u7f6b\u7dda",
|
||||
"Horizontal space": "\u6a2a\u65b9\u5411\u306e\u4f59\u767d",
|
||||
"Insert\/edit image": "\u753b\u50cf\u306e\u633f\u5165\u30fb\u7de8\u96c6",
|
||||
"General": "\u4e00\u822c",
|
||||
"Advanced": "\u8a73\u7d30\u8a2d\u5b9a",
|
||||
"Source": "\u753b\u50cf\u306e\u30bd\u30fc\u30b9",
|
||||
"Border": "\u67a0\u7dda",
|
||||
"Constrain proportions": "\u7e26\u6a2a\u6bd4\u3092\u4fdd\u6301\u3059\u308b",
|
||||
"Vertical space": "\u7e26\u65b9\u5411\u306e\u4f59\u767d",
|
||||
"Image description": "\u753b\u50cf\u306e\u8aac\u660e\u6587",
|
||||
"Style": "\u30b9\u30bf\u30a4\u30eb",
|
||||
"Dimensions": "\u753b\u50cf\u30b5\u30a4\u30ba\uff08\u6a2a\u30fb\u7e26\uff09",
|
||||
"Insert image": "\u753b\u50cf\u306e\u633f\u5165",
|
||||
"Zoom in": "\u30ba\u30fc\u30e0\u30a4\u30f3",
|
||||
"Contrast": "\u30b3\u30f3\u30c8\u30e9\u30b9\u30c8",
|
||||
"Back": "\u623b\u308b",
|
||||
"Gamma": "\u30ac\u30f3\u30de",
|
||||
"Flip horizontally": "\u6c34\u5e73\u306b\u53cd\u8ee2",
|
||||
"Resize": "\u30ea\u30b5\u30a4\u30ba",
|
||||
"Sharpen": "\u30b7\u30e3\u30fc\u30d7\u5316",
|
||||
"Zoom out": "\u30ba\u30fc\u30e0\u30a2\u30a6\u30c8",
|
||||
"Image options": "\u753b\u50cf\u30aa\u30d7\u30b7\u30e7\u30f3",
|
||||
"Apply": "\u9069\u7528",
|
||||
"Brightness": "\u660e\u308b\u3055",
|
||||
"Rotate clockwise": "\u6642\u8a08\u56de\u308a\u306b\u56de\u8ee2",
|
||||
"Rotate counterclockwise": "\u53cd\u6642\u8a08\u56de\u308a\u306b\u56de\u8ee2",
|
||||
"Edit image": "\u753b\u50cf\u306e\u7de8\u96c6",
|
||||
"Color levels": "\u30ab\u30e9\u30fc\u30ec\u30d9\u30eb",
|
||||
"Crop": "\u30af\u30ed\u30c3\u30d7",
|
||||
"Orientation": "\u5411\u304d",
|
||||
"Flip vertically": "\u4e0a\u4e0b\u306b\u53cd\u8ee2",
|
||||
"Invert": "\u53cd\u8ee2",
|
||||
"Insert date\/time": "\u65e5\u4ed8\u30fb\u6642\u523b",
|
||||
"Remove link": "\u30ea\u30f3\u30af\u306e\u524a\u9664",
|
||||
"Url": "\u30ea\u30f3\u30af\u5148URL",
|
||||
"Text to display": "\u30ea\u30f3\u30af\u5143\u30c6\u30ad\u30b9\u30c8",
|
||||
"Anchors": "\u30a2\u30f3\u30ab\u30fc\uff08\u30ea\u30f3\u30af\u306e\u5230\u9054\u70b9\uff09",
|
||||
"Insert link": "\u30ea\u30f3\u30af",
|
||||
"New window": "\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6",
|
||||
"None": "\u306a\u3057",
|
||||
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u5165\u529b\u3055\u308c\u305fURL\u306f\u5916\u90e8\u30ea\u30f3\u30af\u306e\u3088\u3046\u3067\u3059\u3002\u300chttp:\/\/\u300d\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u304b\uff1f",
|
||||
"Target": "\u30bf\u30fc\u30b2\u30c3\u30c8\u5c5e\u6027",
|
||||
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u5165\u529b\u3055\u308c\u305fURL\u306f\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u3088\u3046\u3067\u3059\u3002\u300cmailto:\u300d\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u304b\uff1f",
|
||||
"Insert\/edit link": "\u30ea\u30f3\u30af\u306e\u633f\u5165\u30fb\u7de8\u96c6",
|
||||
"Insert\/edit video": "\u52d5\u753b\u306e\u633f\u5165\u30fb\u7de8\u96c6",
|
||||
"Poster": "\u4ee3\u66ff\u753b\u50cf\u306e\u5834\u6240",
|
||||
"Alternative source": "\u4ee3\u66ff\u52d5\u753b\u306e\u5834\u6240",
|
||||
"Paste your embed code below:": "\u57cb\u3081\u8fbc\u307f\u7528\u30b3\u30fc\u30c9\u3092\u4e0b\u8a18\u306b\u8cbc\u308a\u4ed8\u3051\u3066\u304f\u3060\u3055\u3044\u3002",
|
||||
"Insert video": "\u52d5\u753b",
|
||||
"Embed": "\u57cb\u3081\u8fbc\u307f",
|
||||
"Nonbreaking space": "\u56fa\u5b9a\u30b9\u30da\u30fc\u30b9\uff08 \uff09",
|
||||
"Page break": "\u30da\u30fc\u30b8\u533a\u5207\u308a",
|
||||
"Paste as text": "\u30c6\u30ad\u30b9\u30c8\u3068\u3057\u3066\u8cbc\u308a\u4ed8\u3051",
|
||||
"Preview": "\u30d7\u30ec\u30d3\u30e5\u30fc",
|
||||
"Print": "\u5370\u5237",
|
||||
"Save": "\u4fdd\u5b58",
|
||||
"Could not find the specified string.": "\u304a\u63a2\u3057\u306e\u6587\u5b57\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002",
|
||||
"Replace": "\u7f6e\u304d\u63db\u3048",
|
||||
"Next": "\u6b21",
|
||||
"Whole words": "\u5358\u8a9e\u5358\u4f4d\u3067\u691c\u7d22\u3059\u308b",
|
||||
"Find and replace": "\u691c\u7d22\u3068\u7f6e\u304d\u63db\u3048",
|
||||
"Replace with": "\u7f6e\u304d\u63db\u3048\u308b\u6587\u5b57",
|
||||
"Find": "\u691c\u7d22",
|
||||
"Replace all": "\u5168\u3066\u3092\u7f6e\u304d\u63db\u3048\u308b",
|
||||
"Match case": "\u5927\u6587\u5b57\u30fb\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3059\u308b",
|
||||
"Prev": "\u524d",
|
||||
"Spellcheck": "\u30b9\u30da\u30eb\u30c1\u30a7\u30c3\u30af",
|
||||
"Finish": "\u7d42\u4e86",
|
||||
"Ignore all": "\u5168\u3066\u3092\u7121\u8996",
|
||||
"Ignore": "\u7121\u8996",
|
||||
"Add to Dictionary": "\u8f9e\u66f8\u306b\u8ffd\u52a0",
|
||||
"Insert row before": "\u4e0a\u5074\u306b\u884c\u3092\u633f\u5165",
|
||||
"Rows": "\u884c\u6570",
|
||||
"Height": "\u9ad8\u3055",
|
||||
"Paste row after": "\u4e0b\u5074\u306b\u884c\u3092\u8cbc\u308a\u4ed8\u3051",
|
||||
"Alignment": "\u914d\u7f6e",
|
||||
"Border color": "\u67a0\u7dda\u306e\u8272",
|
||||
"Column group": "\u5217\u30b0\u30eb\u30fc\u30d7",
|
||||
"Row": "\u884c",
|
||||
"Insert column before": "\u5de6\u5074\u306b\u5217\u3092\u633f\u5165",
|
||||
"Split cell": "\u30bb\u30eb\u306e\u5206\u5272",
|
||||
"Cell padding": "\u30bb\u30eb\u5185\u4f59\u767d\uff08\u30d1\u30c7\u30a3\u30f3\u30b0\uff09",
|
||||
"Cell spacing": "\u30bb\u30eb\u306e\u9593\u9694",
|
||||
"Row type": "\u884c\u30bf\u30a4\u30d7",
|
||||
"Insert table": "\u8868\u306e\u633f\u5165",
|
||||
"Body": "\u30dc\u30c7\u30a3\u30fc",
|
||||
"Caption": "\u8868\u984c",
|
||||
"Footer": "\u30d5\u30c3\u30bf\u30fc",
|
||||
"Delete row": "\u884c\u306e\u524a\u9664",
|
||||
"Paste row before": "\u4e0a\u5074\u306b\u884c\u3092\u8cbc\u308a\u4ed8\u3051",
|
||||
"Scope": "\u30b9\u30b3\u30fc\u30d7",
|
||||
"Delete table": "\u8868\u306e\u524a\u9664",
|
||||
"H Align": "\u6c34\u5e73\u65b9\u5411\u306e\u914d\u7f6e",
|
||||
"Top": "\u4e0a",
|
||||
"Header cell": "\u30d8\u30c3\u30c0\u30fc\u30bb\u30eb",
|
||||
"Column": "\u5217",
|
||||
"Row group": "\u884c\u30b0\u30eb\u30fc\u30d7",
|
||||
"Cell": "\u30bb\u30eb",
|
||||
"Middle": "\u4e2d\u592e",
|
||||
"Cell type": "\u30bb\u30eb\u30bf\u30a4\u30d7",
|
||||
"Copy row": "\u884c\u306e\u30b3\u30d4\u30fc",
|
||||
"Row properties": "\u884c\u306e\u8a73\u7d30\u8a2d\u5b9a",
|
||||
"Table properties": "\u8868\u306e\u8a73\u7d30\u8a2d\u5b9a",
|
||||
"Bottom": "\u4e0b",
|
||||
"V Align": "\u5782\u76f4\u65b9\u5411\u306e\u914d\u7f6e",
|
||||
"Header": "\u30d8\u30c3\u30c0\u30fc",
|
||||
"Right": "\u53f3\u5bc4\u305b",
|
||||
"Insert column after": "\u53f3\u5074\u306b\u5217\u3092\u633f\u5165",
|
||||
"Cols": "\u5217\u6570",
|
||||
"Insert row after": "\u4e0b\u5074\u306b\u884c\u3092\u633f\u5165",
|
||||
"Width": "\u5e45",
|
||||
"Cell properties": "\u30bb\u30eb\u306e\u8a73\u7d30\u8a2d\u5b9a",
|
||||
"Left": "\u5de6\u5bc4\u305b",
|
||||
"Cut row": "\u884c\u306e\u5207\u308a\u53d6\u308a",
|
||||
"Delete column": "\u5217\u306e\u524a\u9664",
|
||||
"Center": "\u4e2d\u592e\u63c3\u3048",
|
||||
"Merge cells": "\u30bb\u30eb\u306e\u7d50\u5408",
|
||||
"Insert template": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u633f\u5165",
|
||||
"Templates": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u540d",
|
||||
"Background color": "\u80cc\u666f\u8272",
|
||||
"Custom...": "\u30ab\u30b9\u30bf\u30e0...",
|
||||
"Custom color": "\u30ab\u30b9\u30bf\u30e0\u30ab\u30e9\u30fc",
|
||||
"No color": "\u30ab\u30e9\u30fc\u306a\u3057",
|
||||
"Text color": "\u30c6\u30ad\u30b9\u30c8\u306e\u8272",
|
||||
"Show blocks": "\u6587\u7ae0\u306e\u533a\u5207\u308a\u3092\u70b9\u7dda\u3067\u8868\u793a",
|
||||
"Show invisible characters": "\u4e0d\u53ef\u8996\u6587\u5b57\u3092\u8868\u793a",
|
||||
"Words: {0}": "\u5358\u8a9e\u6570: {0}",
|
||||
"Insert": "\u633f\u5165",
|
||||
"File": "\u30d5\u30a1\u30a4\u30eb",
|
||||
"Edit": "\u7de8\u96c6",
|
||||
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u66f8\u5f0f\u4ed8\u304d\u30c6\u30ad\u30b9\u30c8\u306e\u7de8\u96c6\u753b\u9762\u3002ALT-F9\u3067\u30e1\u30cb\u30e5\u30fc\u3001ALT-F10\u3067\u30c4\u30fc\u30eb\u30d0\u30fc\u3001ALT-0\u3067\u30d8\u30eb\u30d7\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002",
|
||||
"Tools": "\u30c4\u30fc\u30eb",
|
||||
"View": "\u8868\u793a",
|
||||
"Table": "\u8868",
|
||||
"Format": "\u66f8\u5f0f"
|
||||
});
|
||||
@@ -0,0 +1,219 @@
|
||||
tinymce.addI18n('nl',{
|
||||
"Cut": "Knippen",
|
||||
"Heading 5": "Kop 5",
|
||||
"Header 2": "Kop 2",
|
||||
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Uw browser ondersteunt geen toegang tot het clipboard. Gelieve ctrl+X\/C\/V sneltoetsen te gebruiken.",
|
||||
"Heading 4": "Kop 4",
|
||||
"Div": "Div",
|
||||
"Heading 2": "Kop 2",
|
||||
"Paste": "Plakken",
|
||||
"Close": "Sluiten",
|
||||
"Font Family": "Lettertype",
|
||||
"Pre": "Pre",
|
||||
"Align right": "Rechts uitlijnen",
|
||||
"New document": "Nieuw document",
|
||||
"Blockquote": "Quote",
|
||||
"Numbered list": "Nummering",
|
||||
"Heading 1": "Kop 1",
|
||||
"Headings": "Koppen",
|
||||
"Increase indent": "Inspringen vergroten",
|
||||
"Formats": "Opmaak",
|
||||
"Headers": "Kopteksten",
|
||||
"Select all": "Alles selecteren",
|
||||
"Header 3": "Kop 3",
|
||||
"Blocks": "Blok",
|
||||
"Undo": "Ongedaan maken",
|
||||
"Strikethrough": "Doorhalen",
|
||||
"Bullet list": "Opsommingsteken",
|
||||
"Header 1": "Kop 1",
|
||||
"Superscript": "Superscript",
|
||||
"Clear formatting": "Opmaak verwijderen",
|
||||
"Font Sizes": "Tekengrootte",
|
||||
"Subscript": "Subscript",
|
||||
"Header 6": "Kop 6",
|
||||
"Redo": "Opnieuw",
|
||||
"Paragraph": "Paragraaf",
|
||||
"Ok": "Ok\u00e9",
|
||||
"Bold": "Vet",
|
||||
"Code": "Code",
|
||||
"Italic": "Cursief",
|
||||
"Align center": "Centreren",
|
||||
"Header 5": "Kop 5",
|
||||
"Heading 6": "Kop 6",
|
||||
"Heading 3": "Kop 3",
|
||||
"Decrease indent": "Inspringen verkleinen",
|
||||
"Header 4": "Kop 4",
|
||||
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Plakken gebeurt nu als platte tekst. Tekst wordt nu ingevoegd zonder opmaak tot deze optie uitgeschakeld wordt.",
|
||||
"Underline": "Onderstreept",
|
||||
"Cancel": "Annuleren",
|
||||
"Justify": "Uitlijnen",
|
||||
"Inline": "Inlijn",
|
||||
"Copy": "Kopi\u00ebren",
|
||||
"Align left": "Links uitlijnen",
|
||||
"Visual aids": "Hulpmiddelen",
|
||||
"Lower Greek": "Griekse letters",
|
||||
"Square": "Vierkant",
|
||||
"Default": "Standaard",
|
||||
"Lower Alpha": "Kleine letters",
|
||||
"Circle": "Cirkel",
|
||||
"Disc": "Bolletje",
|
||||
"Upper Alpha": "Hoofdletters",
|
||||
"Upper Roman": "Romeinse cijfers groot",
|
||||
"Lower Roman": "Romeinse cijfers klein",
|
||||
"Name": "Naam",
|
||||
"Anchor": "Anker",
|
||||
"You have unsaved changes are you sure you want to navigate away?": "U hebt niet alles opgeslagen bent u zeker dat u de pagina wenst te verlaten?",
|
||||
"Restore last draft": "Herstel het laatste concept",
|
||||
"Special character": "Speciale karakters",
|
||||
"Source code": "Broncode",
|
||||
"B": "Blauw",
|
||||
"R": "Rood",
|
||||
"G": "Groen",
|
||||
"Color": "Kleur",
|
||||
"Right to left": "Rechts naar links",
|
||||
"Left to right": "Links naar rechts",
|
||||
"Emoticons": "Emoticons",
|
||||
"Robots": "Robots",
|
||||
"Document properties": "Document eigenschappen",
|
||||
"Title": "Titel",
|
||||
"Keywords": "Sleutelwoorden",
|
||||
"Encoding": "Codering",
|
||||
"Description": "Omschrijving",
|
||||
"Author": "Auteur",
|
||||
"Fullscreen": "Volledig scherm",
|
||||
"Horizontal line": "Horizontale lijn",
|
||||
"Horizontal space": "Horizontale ruimte",
|
||||
"Insert\/edit image": "Afbeelding invoegen\/bewerken",
|
||||
"General": "Algemeen",
|
||||
"Advanced": "Geavanceerd",
|
||||
"Source": "Bron",
|
||||
"Border": "Rand",
|
||||
"Constrain proportions": "Verhoudingen behouden",
|
||||
"Vertical space": "Verticale ruimte",
|
||||
"Image description": "Afbeelding omschrijving",
|
||||
"Style": "Stijl",
|
||||
"Dimensions": "Afmetingen",
|
||||
"Insert image": "Afbeelding invoegen",
|
||||
"Zoom in": "Inzoomen",
|
||||
"Contrast": "Contrast",
|
||||
"Back": "Terug",
|
||||
"Gamma": "Gamma",
|
||||
"Flip horizontally": "Horizontaal spiegelen",
|
||||
"Resize": "Formaat aanpassen",
|
||||
"Sharpen": "Scherpte",
|
||||
"Zoom out": "Uitzoomen",
|
||||
"Image options": "Afbeelding opties",
|
||||
"Apply": "Toepassen",
|
||||
"Brightness": "Helderheid",
|
||||
"Rotate clockwise": "Rechtsom draaien",
|
||||
"Rotate counterclockwise": "Linksom draaien",
|
||||
"Edit image": "Bewerk afbeelding",
|
||||
"Color levels": "Kleurniveau's",
|
||||
"Crop": "Uitsnijden",
|
||||
"Orientation": "Orientatie",
|
||||
"Flip vertically": "Verticaal spiegelen",
|
||||
"Invert": "Omkeren",
|
||||
"Insert date\/time": "Voeg datum\/tijd in",
|
||||
"Remove link": "Link verwijderen",
|
||||
"Url": "Url",
|
||||
"Text to display": "Linktekst",
|
||||
"Anchors": "Anker",
|
||||
"Insert link": "Hyperlink invoegen",
|
||||
"New window": "Nieuw venster",
|
||||
"None": "Geen",
|
||||
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "De ingegeven URL verwijst naar een extern adres. Wil je er \"http:\/\/\" aan toevoegen?",
|
||||
"Target": "Doel",
|
||||
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "De ingegeven URL lijkt op een e-mailadres. Wil je er \"mailto:\" aan toevoegen?",
|
||||
"Insert\/edit link": "Hyperlink invoegen\/bewerken",
|
||||
"Insert\/edit video": "Video invoegen\/bewerken",
|
||||
"Poster": "Poster",
|
||||
"Alternative source": "Alternatieve bron",
|
||||
"Paste your embed code below:": "Plak u in te sluiten code hieronder:",
|
||||
"Insert video": "Video invoegen",
|
||||
"Embed": "Insluiten",
|
||||
"Nonbreaking space": "Vaste spatie invoegen",
|
||||
"Page break": "Pagina einde",
|
||||
"Paste as text": "Plakken als tekst",
|
||||
"Preview": "Voorbeeld",
|
||||
"Print": "Print",
|
||||
"Save": "Opslaan",
|
||||
"Could not find the specified string.": "Geen resultaten gevonden",
|
||||
"Replace": "Vervangen",
|
||||
"Next": "Volgende",
|
||||
"Whole words": "Alleen hele woorden",
|
||||
"Find and replace": "Zoek en vervang",
|
||||
"Replace with": "Vervangen door",
|
||||
"Find": "Zoeken",
|
||||
"Replace all": "Alles vervangen",
|
||||
"Match case": "Identieke hoofd\/kleine letters",
|
||||
"Prev": "Vorige",
|
||||
"Spellcheck": "Spellingscontrole",
|
||||
"Finish": "Einde",
|
||||
"Ignore all": "Alles negeren",
|
||||
"Ignore": "Negeren",
|
||||
"Add to Dictionary": "Toevoegen aan woordenlijst",
|
||||
"Insert row before": "Voeg rij boven toe",
|
||||
"Rows": "Rijen",
|
||||
"Height": "Hoogte",
|
||||
"Paste row after": "Plak rij onder",
|
||||
"Alignment": "Uitlijning",
|
||||
"Border color": "Randkleur",
|
||||
"Column group": "Kolomgroep",
|
||||
"Row": "Rij",
|
||||
"Insert column before": "Voeg kolom in voor",
|
||||
"Split cell": "Cel splitsen",
|
||||
"Cell padding": "Ruimte binnen cel",
|
||||
"Cell spacing": "Celruimte",
|
||||
"Row type": "Rijtype",
|
||||
"Insert table": "Tabel invoegen",
|
||||
"Body": "Body",
|
||||
"Caption": "Onderschrift",
|
||||
"Footer": "Voettekst",
|
||||
"Delete row": "Verwijder rij",
|
||||
"Paste row before": "Plak rij boven",
|
||||
"Scope": "Bereik",
|
||||
"Delete table": "Verwijder tabel",
|
||||
"H Align": "Links uitlijnen",
|
||||
"Top": "Bovenaan",
|
||||
"Header cell": "Kopcel",
|
||||
"Column": "Kolom",
|
||||
"Row group": "Rijgroep",
|
||||
"Cell": "Cel",
|
||||
"Middle": "Centreren",
|
||||
"Cell type": "Celtype",
|
||||
"Copy row": "Kopieer rij",
|
||||
"Row properties": "Rij eigenschappen",
|
||||
"Table properties": "Tabel eigenschappen",
|
||||
"Bottom": "Onderaan",
|
||||
"V Align": "Boven uitlijnen",
|
||||
"Header": "Koptekst",
|
||||
"Right": "Rechts",
|
||||
"Insert column after": "Voeg kolom in na",
|
||||
"Cols": "Kolommen",
|
||||
"Insert row after": "Voeg rij onder toe",
|
||||
"Width": "Breedte",
|
||||
"Cell properties": "Cel eigenschappen",
|
||||
"Left": "Links",
|
||||
"Cut row": "Knip rij",
|
||||
"Delete column": "Verwijder kolom",
|
||||
"Center": "Midden",
|
||||
"Merge cells": "Cellen samenvoegen",
|
||||
"Insert template": "Sjabloon invoegen",
|
||||
"Templates": "Sjablonen",
|
||||
"Background color": "Achtergrondkleur",
|
||||
"Custom...": "Eigen...",
|
||||
"Custom color": "Eigen kleur",
|
||||
"No color": "Geen kleur",
|
||||
"Text color": "Tekstkleur",
|
||||
"Show blocks": "Blokken tonen",
|
||||
"Show invisible characters": "Onzichtbare karakters tonen",
|
||||
"Words: {0}": "Woorden: {0}",
|
||||
"Insert": "Invoegen",
|
||||
"File": "Bestand",
|
||||
"Edit": "Bewerken",
|
||||
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich Text Area. Druk ALT-F9 voor het menu. Druk ALT-F10 voor de toolbar. Druk ALT-0 voor help.",
|
||||
"Tools": "Gereedschap",
|
||||
"View": "Beeld",
|
||||
"Table": "Tabel",
|
||||
"Format": "Opmaak"
|
||||
});
|
||||
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user