Compare commits

...

1103 Commits

Author SHA1 Message Date
Sebastiaan Janssen 39b1357a2a Ensure correct assembly redirects for System.Web.WebPages.Razor and HtmlAgilityPack 2016-01-15 15:07:53 +01:00
Claus e1ee8a1437 Fix to ensure config array is copied and not referenced. 2016-01-15 10:00:05 +01:00
Claus 21ba88a34d Fixes: U4-6297 Add Settings to Grid Controls
Reusing the existing code for calling the dialog instead of having a separate method for this.
2016-01-15 09:43:01 +01:00
Shannon b5abbc7c30 Adds some null checks 2016-01-14 18:11:48 +01:00
Shannon 7958b5fcb1 U4-7740 Speed up the current user's culture lookup 2016-01-14 16:43:31 +01:00
Shannon 44b22503e1 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2016-01-14 16:36:13 +01:00
Shannon bfa12856db Fixes issue with DefaultRepositoryCachePolicy when creating new items - we were generating the cache key before actually calling the method to create the item therefore there was no id assigned yet (it would be zero). 2016-01-14 16:36:03 +01:00
Sebastiaan Janssen d9542f4ca5 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2016-01-14 15:06:39 +01:00
Sebastiaan Janssen f057976f78 U4-7735 Localization fallback doesn't seem to work.
#U4-7735 Fixed
2016-01-14 15:06:16 +01:00
Claus 151c28a20f Merge pull request #642 from AussieInSeattle/U4-6297
U4 6297
2016-01-14 14:35:54 +01:00
Claus d2c8268fc4 Merge pull request #1014 from kvakulo/fix-media-item-without-image
Fix the media picker not rendering when a media item has no image
2016-01-14 13:46:12 +01:00
Claus 13a9f40815 Fixes: U4-7728 Folder view in media section gives an exception
Ensuring umbracoFile property isn't accessed if this is called on a folder.
2016-01-14 09:40:40 +01:00
Claus 67f8141015 Merge branch 'bjarnef-dev-v7-mediapicker-only-images' into dev-v7 2016-01-14 08:56:34 +01:00
bjarnef 06a098215b Add media picker config to restrict the editors to only pick images 2016-01-14 00:36:53 +01:00
bjarnef 051b320904 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2016-01-13 23:16:10 +01:00
Shannon 5aab50ba3b Ensures fcnMode and file size maximums are set for the debug web config transform and also for the nuget transform. 2016-01-13 17:27:56 +01:00
Shannon 5b9cbae860 Fixes: U4-7712 fcnMode = Single by default 2016-01-13 17:17:39 +01:00
Claus 59759c4919 Merge pull request #1018 from umbraco/temp-U4-5982
U4-5982 Webpages unpublishing by themselves
2016-01-13 14:29:37 +01:00
Shannon 68ddea2776 refactors a bit of code from the PR, adds more translations to the other english file. 2016-01-13 12:33:57 +01:00
Shannon 8857b2db59 Merge branch 'JJCLane-UKFest-6322' into temp-U4-5982 2016-01-13 12:24:00 +01:00
Shannon fae5618865 Merge branch 'UKFest-6322' of https://github.com/JJCLane/Umbraco-CMS into JJCLane-UKFest-6322 2016-01-13 12:23:26 +01:00
Shannon 40dbcbd7d9 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2016-01-13 12:10:22 +01:00
Shannon 074d894271 Fixes: U4-7706 Property Type UniqueIds do not stay consistent during package installation 2016-01-13 12:10:04 +01:00
Mads Rasmussen eb6ae95039 Merge pull request #1015 from umbraco/temp-U4-7561
U4-7561 Backoffice Media Section should provide information on physic…
2016-01-13 10:40:54 +01:00
Shannon 5e461b0cec adds packaging test 2016-01-13 10:29:44 +01:00
Shannon d6a49f275f adds test that fails - need to fix it now 2016-01-13 10:29:26 +01:00
Sebastiaan Janssen 8e024fccff Don't hardcode the umbracoFile constant 2016-01-12 20:05:22 +01:00
Sebastiaan Janssen 43227d4510 Support for multiple properties spawning a url - adding more uploadfields to umbracoSettings.config (autoFillImageProperties) 2016-01-12 19:46:05 +01:00
Sebastiaan Janssen 79cc4cd2fa Change "umbracoFile" to the constant for this value 2016-01-12 18:16:55 +01:00
Sebastiaan Janssen ff83d2e1f4 U4-7561 Backoffice Media Section should provide information on physical location of files 2016-01-12 17:41:53 +01:00
Regin Larsen cb7df58fdd Fix the media picker not rendering when a media item has no image 2016-01-12 16:25:29 +01:00
Sebastiaan Janssen 5cc274a580 Merge pull request #1004 from umbraco/temp-U4-7681
U4-7681 Legacy CMSNode.Parent uses old SqlHelper API and doesn't keep…
2016-01-12 14:48:54 +01:00
Sebastiaan Janssen 6c5b5ee637 Merge branch 'Phosworks-U4-7312-2' into dev-v7 2016-01-12 14:20:40 +01:00
Sebastiaan Janssen 9bfac0fdcd Still create the thumbnails upon upload (for backwards compatibility) 2016-01-12 14:20:25 +01:00
Sebastiaan Janssen bd5823f0de Merge branch 'U4-7312-2' of https://github.com/Phosworks/Umbraco-CMS into Phosworks-U4-7312-2 2016-01-12 13:24:42 +01:00
Sebastiaan Janssen 70035632b6 Update ImageProcessor and UrlRewritingNet dependencies 2016-01-12 11:22:49 +01:00
Stephan 20f5560767 Merge pull request #1002 from umbraco/temp-U4-7558-2
U4-7558 Fix GetAll repository level caching for repositories that return a query result based on the result of GetAll
2016-01-11 15:14:00 +01:00
Shannon ecd024c462 U4-7681 Legacy CMSNode.Parent uses old SqlHelper API and doesn't keep a reference 2016-01-08 13:59:40 +01:00
Shannon ba91bf0b9c missing a file save 2016-01-07 19:33:55 +01:00
Shannon 2b13297c36 Changes method name to be shorter and makes internal instead of protected. 2016-01-07 19:27:59 +01:00
Shannon fb5faa3db7 Fixes tests, adds LanguageId to the interface 2016-01-07 18:59:59 +01:00
Shannon d7a142e724 Refactors DictionaryItem and DictionaryTranslation so that the attached ILanguage entity is not cached nor cloned. This will save on lots of memory and cloning cycles especially if there are quire a few dictioanry items. Unfortunatley to achieve this requires a not so pretty hack where we need to assign an internal callback to the model so it knows how to retrieve the language when it needs it. In v8, the ILanguage entity will not be attached at all. This also fixes a cache refresher issue for when a language is deleted -> all dictionary cache must be removed. This commit also changes a method name: ClearAllIsolatedCacheByRepositoryEntityType 2016-01-07 18:44:04 +01:00
Shannon 63785ae70f Adds cache policy tests 2016-01-07 17:54:55 +01:00
Shannon 68aa6ff093 Moves repository caching logic into new CachePolicies. 2016-01-07 16:31:20 +01:00
Shannon 3e985acef1 ensures that the public access cache refresher is called when a public access item is deleted. 2016-01-07 12:18:57 +01:00
Shannon 6d13d33cfd Changes PublicAccessRepository to use GetAllCacheAsCollection option and return a single result by ID based on the cache of GetAll 2016-01-07 12:03:32 +01:00
Shannon Deminick ced0a852b1 Merge pull request #1000 from bjarnef/dev-v7-U4-7648
Set focus on input by clicking label
2016-01-07 10:14:07 +01:00
bjarnef ba0da15f7f Set focus on input by clicking label 2016-01-07 01:04:55 +01:00
bjarnef 2875cd10f3 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2016-01-06 22:01:33 +01:00
Shannon b91661cf65 fixes issue with RepositoryBase - it would cache all entities with a single key even if there were ids specified which is wrong. Updates TemplateRepository to use a single GetAll query as its base source and it uses the GetAllCacheAsCollection option, also massively simplifies its GetDescendants methods, obsoletes some unused code, 2016-01-06 19:27:15 +01:00
Shannon 827f7a7bc8 Updates DictionaryRepository(s) to have custom GetAll caching options - to basically disable it since there could be tons of these and currently an IDictionaryItem is a massive entity (need to fix that) 2016-01-06 18:34:07 +01:00
Shannon ff829d49a3 Updates all cache refreshers to reference the IsolatedRuntimeCache where required, refactors how IsolatedRuntimeCache is exposed on the CacheHelper, ensures that IsolatedRuntimeCache is used in all repositories instead of the global RuntimeCache, changes all obsolete usages of CacheHelper to the non obsolete equivalent, obsoletes many of the cache keys, obsoletes a couple cache refreshers that aren't used anymore in 7.3, simplifies CacheHelper with regards to it's 'disabled' cache state. 2016-01-06 18:08:14 +01:00
Sebastiaan Janssen d2483159bc Fixes unit tests, not all packages will have the sort order in there 2016-01-06 15:59:23 +01:00
Sebastiaan Janssen 48ab3f580c Fixes the build 2016-01-06 15:21:45 +01:00
Claus c524d67a37 Fixes: U4-7553 Importing Document Type doesn't respect property sort order
Handling sortOrder property in both import/export.

(cherry picked from commit 378479b4c1)

# Conflicts:
#	src/Umbraco.Core/Services/PackagingService.cs
2016-01-06 14:56:31 +01:00
Shannon 4f40fff5ee Moves DeepCloneRuntimeCacheProvider to Cache namespace. Creates DeepCloneableList + tests. Updates RepositoryBase to use DeepCloneableList when GetAllCacheAsCollection is used (so that all entries that get cached are deep cloned into and out-of the cache). Adds test for DeepCloneRuntimeCacheProvider for dealing with this list type. 2016-01-06 14:17:51 +01:00
Shannon b04d0fc886 Adds Isolated cache to the CacheHelper, adds cache option: GetAllCacheAsCollection, changes the default repository cache to be an isolated cache (instead of part of the single main dictionary cache), adds the logic for the cache option GetAllCacheAsCollection to RepositoryBase, updates Language and Domain repositories to use GetAllCacheAsCollection, updates RepositoryFactory to be the one responsible for injecting a DeepCloneRuntimeCacheProvider and to use a single _noCache instance. 2016-01-06 13:48:03 +01:00
Shannon 4c3258812c normalize culture for test 2016-01-06 12:50:41 +01:00
Shannon bc98f5e8fc code cleanup.
Conflicts:
	src/Umbraco.Core/ObjectExtensions.cs
2016-01-06 12:49:18 +01:00
Shannon 6f2f6c088b Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2016-01-06 12:48:36 +01:00
Shannon da91923577 Changes ObjectExtensions NormalizeNumberDecimalSeparator to use normal Culture (not UI Culture) 2016-01-06 12:48:26 +01:00
Sebastiaan Janssen fbc46d8046 Merge pull request #989 from umbraco/temp-U4-7643
U4-7643 DatabaseServerMessenger.cs causes lucene indexes to rebuild o…
2016-01-06 12:43:36 +01:00
Shannon e8a0fae557 adds notes 2016-01-06 12:24:09 +01:00
Shannon Deminick e0baf45247 Merge pull request #992 from umbraco/temp-U4-5168
U4-5168 Media Items label says "Document Type" instead of  "Media Type"
2016-01-06 12:22:53 +01:00
Sebastiaan Janssen 43e983e27a Corrects spelling of localStorateDir to localStorageDir 2016-01-06 12:17:48 +01:00
Sebastiaan Janssen b882806847 Merge pull request #980 from umbraco/temp-U4-7614
U4-7614 Allow Examine's local temp storage to exist in the current Us…
2016-01-06 12:09:31 +01:00
Shannon 58c30cd7a6 removes erroneous reverse call 2016-01-06 12:00:50 +01:00
Shannon Deminick ae1b6d95b8 Merge pull request #990 from umbraco/temp-PVS-Studio
Temp pvs studio
2016-01-06 12:00:28 +01:00
Sebastiaan Janssen 403af78ba9 U4-5168 Media Items label says "Document Type" instead of "Media Type" 2016-01-06 11:22:15 +01:00
Sebastiaan Janssen 59fe690a88 Code sample No.10 2016-01-05 23:34:30 +01:00
Sebastiaan Janssen a15b005d95 Code sample No.6, No.7 2016-01-05 23:22:16 +01:00
Sebastiaan Janssen b94c396d4e Code sample No.5 2016-01-05 23:20:47 +01:00
Sebastiaan Janssen 8afc4f5ad1 Code sample No.3 2016-01-05 23:15:25 +01:00
Sebastiaan Janssen f68b2de9e3 Code sample No.2 2016-01-05 23:13:37 +01:00
Sebastiaan Janssen f4e29d90e0 Code sample No.1 2016-01-05 23:12:09 +01:00
Sebastiaan Janssen 5ad5e945c4 Merge pull request #813 from TimGeyssens/dev-v7
Fixes U4-7249 Insert Macro split button, when selecting a macro that …
2016-01-05 19:49:14 +01:00
Sebastiaan Janssen 4ef7b7735e Fixes U4-6510 again as merging PR apparently went wrong 2016-01-05 17:04:11 +01:00
Sebastiaan Janssen db538d95ba Bumps version 2016-01-05 16:11:59 +01:00
Sebastiaan Janssen cef7cd1ca7 Merge pull request #981 from umbraco/temp-U4-7583
U4-7583
2016-01-05 16:02:51 +01:00
Shannon 726416fe0c Fixes: U4-7624 Datepicker Sql server error
Since we are not saving the formatted value, don't try parsing the date with formatting config.
Added in explicit parsing format compatible with the one used when saving the value, just to ensure parsing is done the same way.
2016-01-05 15:47:42 +01:00
Shannon Deminick 1957d8bb3b Merge pull request #928 from kiasyn/patch-1
U4-7400 - Datepicker is not updating scope model value in time for 3r…
2016-01-05 15:19:31 +01:00
Shannon fab30d353a U4-7223 GetCropUrl outputs html entities in url when used in css 2016-01-05 14:54:02 +01:00
Shannon 75990b5961 U4-7643 DatabaseServerMessenger.cs causes lucene indexes to rebuild on app startup 2016-01-05 14:20:13 +01:00
Shannon 18900d0e25 Fixes: U4-6659 Examine: Specific doctype not being indexed 2016-01-05 12:38:13 +01:00
Shannon d08f4230c8 U4-7538 GetRemainingTimeoutSeconds is double setting the cookie in 7.4 2016-01-05 12:35:06 +01:00
Shannon 15d06557e9 U4-7605 Colons/Parens Unnecessarily Removed From Data Type Names 2016-01-05 11:42:02 +01:00
Shannon 8d2e708d1c Adds exception handling for the BackOfficeUserStore - this will occur if the external OAuth provider doesn't return the Email or Name correctly, then an exception is swallowed at the service level and the user is not actually created, but the BackOfficeUserStore could not detect this, so it's detecting this now. 2016-01-05 11:36:52 +01:00
Shannon 280573be28 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2016-01-05 11:35:35 +01:00
Shannon 415aaf3e2b U4-7477 xss char stripping on data type names is being too agressive 2016-01-05 11:35:24 +01:00
Sebastiaan Janssen 5081027482 Improve batch files: SETLOCAL makes sure we don't change the user's actual path, so no need to revert changes any more either 2016-01-05 11:33:10 +01:00
Wincent 96b24d7ee0 Removes dependency to System.IO.File 2015-12-31 12:01:35 +01:00
Shannon ac1785bc08 U4-7583 2015-12-28 16:20:48 +01:00
Shannon 1da1a20734 ensures the setting is enabled for the searcher too 2015-12-28 13:43:47 +01:00
Shannon c765ab9112 U4-7614 Allow Examine's local temp storage to exist in the current User's temp storage location - useful for Azure 2015-12-28 13:37:56 +01:00
Shannon Deminick 664aa3842d Merge pull request #979 from robertjf/dev-v7
fix for issue U4-7609/U4-7610 - IE related problems
2015-12-28 10:09:29 +01:00
Robert Foster fbee58e445 Added json mimetype Mapping to web.config.template to support things like manifest.json in certain browsers (e.g. IE). 2015-12-26 19:05:44 +11:00
Robert Foster a5e87dcedf Fix for IE not being able to install packages in Umbraco backoffice. 2015-12-26 18:57:24 +11:00
Wincent 53f9e104ec Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into U4-7312-2
Conflicts:
	src/Umbraco.Web/Editors/ImagesController.cs - Removed changes from upstream
2015-12-19 11:16:30 +01:00
Robert Foster ffe41fe060 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' 2015-12-18 22:45:46 +11:00
Shannon Deminick e89cc24d51 Merge pull request #958 from lars-erik/overridable-domain-repository
Can't log into youtrack. Simple changes to repositoryfactory and umbr…
2015-12-16 10:19:25 +01:00
Claus 61f3b2ae4a Added CultureInvariant to regex. 2015-12-16 09:53:15 +01:00
Claus a752c7ee4b Merge branch 'rasmusjp-U4-7462' into dev-v7 2015-12-16 09:52:36 +01:00
Lars-Erik Aabech a14f0021bd Can't log into youtrack. Simple changes to repositoryfactory and umbraco.web.ui assemblyinfo. 2015-12-16 09:50:17 +01:00
Claus 5eb5549448 Merge branch 'U4-7462' of git://github.com/rasmusjp/Umbraco-CMS into rasmusjp-U4-7462 2015-12-16 09:36:49 +01:00
Claus f5e9151ffd Localized some texts on the slider configuration. 2015-12-15 15:42:14 +01:00
bjarnef 5a9dd11a7c Change margin-top for triangle and re-order config properties 2015-12-15 15:42:14 +01:00
bjarnef 9e6123abd3 Modify properties and styling 2015-12-15 15:42:13 +01:00
bjarnef 6c3ef2aaa9 Add more config properties 2015-12-15 15:42:13 +01:00
bjarnef 95ae504c9b Change "reversed" property to boolean 2015-12-15 15:42:12 +01:00
bjarnef 88fadcf74e Add slider bootstrap-slider v5.2.6
Add newer version of script and add addtional properties.
2015-12-15 15:42:12 +01:00
Sebastiaan Janssen bb4994f9fc Merge pull request #935 from torerikk/dev-v7
Update Norwegian translations
2015-12-15 15:10:46 +01:00
Claus c334f94d72 Fixed a few comments. 2015-12-15 14:47:19 +01:00
Claus ddf525db40 Merge branch 'AffinityID-u4-7522' into dev-v7 2015-12-15 14:43:22 +01:00
Claus 9c7ef46222 Merge pull request #941 from bugsancho/dev-v7
U4-7508 - IsChildOfListView should be populated for Media items
2015-12-15 14:18:27 +01:00
Sebastiaan Janssen eacc7f7fb3 Whoops, was supposed to be en-US by default 2015-12-15 13:50:19 +01:00
Sebastiaan Janssen 80f597a7eb U4-7424 - Also update all other errors displayed in the frontend 2015-12-15 12:51:45 +01:00
Sebastiaan Janssen d069da8a4f Make LocalizedTextService fall back to en-GB if the key is not found in the current file 2015-12-15 12:51:03 +01:00
Sebastiaan Janssen 44ebd8d9ea Proper formatting of this file, only whitespace changes 2015-12-15 12:18:23 +01:00
Sebastiaan Janssen 2fd6dc3603 Merge branch 'engern-U4-7424' into dev-v7 2015-12-15 12:14:07 +01:00
Sebastiaan Janssen 0629b49112 Merge branch 'U4-7424' of https://github.com/engern/Umbraco-CMS into engern-U4-7424 2015-12-15 12:13:35 +01:00
Sebastiaan Janssen 4958c5a59a Merge branch 'jamescoxhead-U4-7503-Disable-X-AspNetMvc-Version-Header' into dev-v7 2015-12-15 11:21:23 +01:00
Sebastiaan Janssen 523501db8c Merge branch 'U4-7503-Disable-X-AspNetMvc-Version-Header' of https://github.com/jamescoxhead/Umbraco-CMS into jamescoxhead-U4-7503-Disable-X-AspNetMvc-Version-Header 2015-12-15 11:21:11 +01:00
Sebastiaan Janssen 23cd2b09ca Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-12-15 11:13:22 +01:00
Sebastiaan Janssen a1ff1d4543 Merge branch 'TimoPerplex-dev-v7' into dev-v7 2015-12-15 11:12:57 +01:00
Sebastiaan Janssen 1bf2a3b1bf Merge branch 'dev-v7' of https://github.com/TimoPerplex/Umbraco-CMS into TimoPerplex-dev-v7
Conflicts:
	src/Umbraco.Web/Editors/ImagesController.cs
2015-12-15 11:12:13 +01:00
Shannon 8598ab565c Fixes: U4-7536 Sign-out in back office will call all ASP.Net identity middleware sign out methods
publicises a few things too.
2015-12-15 10:34:11 +01:00
Rasmus John Pedersen a56936b6f9 Fixes bug with macro multiline parameters 2015-12-14 13:44:57 +01:00
Andrey Shchekin b3e21e0827 U4-7522 Removed unnecessary exception from DeepCloneHelper. 2015-12-10 14:33:52 +13:00
James Coxhead 739ff33ce1 Removed X-AspNet-Version and X-AspNetMvc-Version headers 2015-12-08 21:44:40 +00:00
James Coxhead f27a726a6e Disabled the X-AspNetMvc-Version header 2015-12-08 21:19:41 +00:00
Alexander Todorov aed906e682 U4-7508 - IsChildOfListView should be populated for Media items, similarly to Content items 2015-12-08 18:41:59 +02:00
Sebastiaan Janssen 220446afec Adds some more dependencies so we upgrade those properly when necessary 2015-12-08 14:24:52 +01:00
Sebastiaan Janssen a101367292 This would've stayed here for years and be irrelevant, we can link to twitter profiles in the docs on Our 2015-12-08 14:02:43 +01:00
Sebastiaan Janssen e90fedb835 Bumps version 2015-12-08 13:54:57 +01:00
Sebastiaan Janssen d5f9dfecc4 U4-7496 Backoffice dropdowns quit working in Chrome after update to v47.0.2526.73
#U4-7496 Fixed
2015-12-08 13:54:56 +01:00
Claus cbb84f79d1 Merge pull request #799 from esn303/patch-1
Major revamp with keys added and texts fixed everywhere
2015-12-08 11:40:42 +01:00
Sebastiaan Janssen a7377d0686 Merge pull request #939 from hartvig/dev-v7
Fixing a little typo as reported by Chris Houston
2015-12-07 11:49:28 +01:00
hartvig 68a4749917 Fixing a little typo 2015-12-07 11:11:02 +01:00
Sebastiaan Janssen 81763bf4d8 Merge pull request #938 from hartvig/dev-v7
Adding number of countries to the installer faq
2015-12-07 10:25:09 +01:00
hartvig 0e0bc9fbef Adding number of countries to the installer faq 2015-12-07 10:11:35 +01:00
Claus 964d9a9328 Closing break tag. 2015-12-06 17:55:20 +01:00
Wincent e0ee786271 Re-enables support for non media thumbnails 2015-12-04 09:31:39 +01:00
Wincent 2664a75c84 Removed generation of old thumbnails 2015-12-03 17:33:40 +01:00
Wincent 5d9bde807e Changes GetBigThumbnail to image processor in mediahelper.service.js and fileupload.controller.js
Changed ImageController.GetBigThumbnail to redirect
Changed thumbnail paths to include rnd equal to UpdateDate
2015-12-03 17:27:47 +01:00
Tor-Erik Klausen 0370f9a1c8 Update Norwegian translations
Adds missing translations and removes some old ones. Based on current
en.xml
2015-12-02 20:09:06 +01:00
Sebastiaan Janssen 64dac39bae Merge branch 'temp-U4-7220' into dev-v7 2015-12-01 10:35:38 +01:00
Sebastiaan Janssen 6040d149ec Merge branch 'dev-v7' into temp-U4-7220 2015-12-01 09:57:44 +01:00
Claus bfbc6595fb Fixed a few more split separators. 2015-11-30 19:29:23 +01:00
Claus 25d8fc7a13 Fixing split separator for thumbnailSizes in FileUploadPropertyValueEditor. 2015-11-30 19:18:57 +01:00
Claus e11b5c3fdb Fixes: U4-7220 Upgrading 4.9.0 to 7.3.0 fails due to missing UniqueID field on cmsPropertyType table
Migration happening in 6.0.2 failing due to use of a PropertyTypeDto type where we have added UniqueId in 7.3.0.
2015-11-30 18:13:51 +01:00
Shannon 87100feb3d Fixes: U4-7467 Umbraco 7.3.2 Clean install, OWIN error after database creation and bumps version 2015-11-27 21:23:24 +01:00
Shannon Deminick eae74b0e20 Merge pull request #931 from lars-erik/fix-u4-7329
Actually save the domain
2015-11-27 16:56:07 +01:00
Shannon 610efe552d Bumps version 2015-11-27 16:54:02 +01:00
Shannon c4860a490f Ensures that GetUserSecondsMiddleWare uses the SystemClock for UTC Now, ensures that it only extends the ticket when necessary and not everytime this middleware is called - the same logic that OWIN normally renews tickets with, this means the cookie is not written everytime this request is made. 2015-11-27 16:43:02 +01:00
Shannon 8e6bbc3df9 Ensures that written cookies are done so consistently based on the UmbracoBackOfficeCookieAuthOptions. Ensures that when a webforms page requests token renewal that the token is not always renewed for the request, it checks if the tokens expiry correctly and only renews when necessary so the cookie is not written each time. Fixes the ForceRenewalCookieAuthenticationHandler to only write a cookie if the request is for a request that is not normally auth'd (i.e. is a webforms form that exists outside the normal /umbraco path ... legacy). 2015-11-27 16:25:39 +01:00
Lars-Erik Aabech c16d0b77c2 Actually save the domain 2015-11-27 12:59:15 +01:00
Sebastiaan Janssen 2c4403f892 Fixes image that was missing from the build 2015-11-26 13:08:59 +01:00
Shannon fd66f08520 Fixes setting auth cookie during install, removes some try/catch/swallow with some error messaging, converts some String -> string and == false updates. 2015-11-26 13:07:22 +01:00
Shannon 8e50f4968f Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-11-26 12:02:17 +01:00
Shannon 9acbe09449 fixes the tmh dynamic local version, the bower version the build server runs has an issue! 2015-11-26 12:02:08 +01:00
Sebastiaan Janssen 4baaafd006 Also remove change password dashboard from nuget package 2015-11-26 11:57:37 +01:00
Shannon 3f7293304d removes password change dashboard from release 2015-11-26 11:55:42 +01:00
Shannon f62581bd38 reverts more of the caps lock 2015-11-26 11:39:49 +01:00
Shannon 9782e3711e Revert "Update bower.json with ngCapsLock"
This reverts commit f0e1460550.

Conflicts:
	src/Umbraco.Web.UI.Client/bower.json
2015-11-26 10:54:43 +01:00
Shannon 1f4ba9cfdc ignores file that shouldn't be there 2015-11-26 10:36:15 +01:00
Shannon ba4f0cc6a4 remove file that shouldn't be checked in 2015-11-26 10:35:28 +01:00
Shannon fc84821e8b fixes U4-6340 Partial view macro with parameters not working in RTE - to use a Model to post with the same Action name 2015-11-26 10:32:43 +01:00
Shannon Deminick 0fcf0b505a Merge pull request #922 from engern/U4-6340
Fixes U4-6340 : Partial view macro with parameters not working in RTE and Grid (backend)
2015-11-26 09:54:24 +01:00
Shannon d300146cf6 trips content/media names, makes sure that the content type editor when rendering template names html encodes the names. 2015-11-25 20:44:53 +01:00
Shannon c8482b9f59 Revert "Merge pull request #875 from Phosworks/U4-7312"
This reverts commit 14265fc964, reversing
changes made to 18c3345e47.

Conflicts:
	src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js
	src/Umbraco.Web/Editors/ImagesController.cs
2015-11-25 20:27:58 +01:00
Shannon b7795e19ef Changes bigthumbnail pr to not cache per second, just minute 2015-11-25 20:21:24 +01:00
Shannon c97617f5b5 Fixes: U4-7461 xss vulnerability in content type editor 2015-11-25 20:15:28 +01:00
bjarnef b2d4eccf7b Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2015-11-25 20:13:15 +01:00
Shannon Deminick 14265fc964 Merge pull request #875 from Phosworks/U4-7312
Changed web api GetBigThumbnail to image processor
2015-11-25 19:52:14 +01:00
Shannon 18c3345e47 Fixes U4-7459 XSRF protection bypass - ensures tokens are checked for the non-editor api controllers 2015-11-25 19:39:24 +01:00
Shannon 924a016ffe Fixes U4-7457 Server side request forgery (xsrf) in feedproxy.aspx 2015-11-25 18:05:57 +01:00
Claus a02b41e9d2 Merge pull request #927 from umbraco/temp-U4-7307
U4-7307 Windows Authentication prompts for Windows login after Umbrac…
2015-11-25 15:22:36 +01:00
Shannon 068c4a0b16 Fixes PR for U4-7362 Add message to login screen if Caps Lock is on 2015-11-25 11:22:12 +01:00
Shannon Deminick f7d28d769a Merge pull request #886 from bjarnef/dev-v7-U4-7362
Add message to login screen if Caps Lock is on
2015-11-25 11:01:47 +01:00
Claus 9a07e206d8 Merge pull request #874 from andydale1982/U4-7323_(#871)‏
U4 7323 (#871)‏
2015-11-25 10:51:41 +01:00
Shannon Deminick 0edb71f4aa Merge pull request #917 from bjarnef/dev-v7-move-umb-version-in-dialog
Move Umbraco version label to header in user dialog
2015-11-25 10:51:36 +01:00
Shannon Deminick b376207ef6 Merge pull request #868 from opelpanfan/UKFest-U4-7324
U4-7324 Member Picker search results doesn't show correct icons
2015-11-25 10:33:59 +01:00
kiasyn dbece874dd U4-7400 - Datepicker is not updating scope model value in time for 3rd party plugins
Force set scope model value when the datetime changes, rather than just on formsubmit. This means that 3rd party plugins (such as grids) can use this editor.
2015-11-25 10:25:00 +13:00
Shannon 6d0aa824ad U4-7307 Windows Authentication prompts for Windows login after Umbraco login 2015-11-24 16:31:18 +01:00
Claus 89afacf161 Merge pull request #915 from umbraco/temp-U4-7380
U4-7380 Backoffice timeouts after 7.3.1  upgrade
2015-11-24 11:35:01 +01:00
Claus 0fa6940bb6 Merge branch 'arknu-U4-6657-mediapicker' into dev-v7 2015-11-24 10:37:11 +01:00
Claus 1353b0a592 Reordering flex properties - recess module crashes with out of memory exception if they are in the other order. 2015-11-24 10:35:54 +01:00
Claus 617fec171f Merge branch 'U4-6657-mediapicker' of git://github.com/arknu/Umbraco-CMS into arknu-U4-6657-mediapicker 2015-11-24 10:33:04 +01:00
Claus 2c63866cb3 Merge pull request #909 from umbraco/U4-7270-1
Creates an IAsyncRenderMvcController which can be used instead of IRe…
2015-11-24 10:09:45 +01:00
Sebastiaan Janssen 18d3aa9ee2 Merge pull request #926 from kiasyn/patch-1
Remove unnecessary ToLowerInvariant call from PreviewMode
2015-11-23 22:17:07 +01:00
kiasyn f83c966e55 Remove unnecessary ToLowerInvariant call from PreviewMode
Text was being set lowercase and then injected with the preview badge markup. This meant that things such as script tags were being lowercased, breaking the javascript.
2015-11-24 10:02:14 +13:00
Tommy Enger de41a1f1ca Clean up the code
DRY
2015-11-23 16:29:09 +01:00
Tommy Enger c9f57c6ce3 Split Get and Post
Split Get and Post into 2 separate methods to maintain backwards
compability
2015-11-23 15:52:36 +01:00
engern 54ab26e2ed Simplifying thge code even further
Realized that we don't need to convert the exisitng dictionary to a new
dictionary.
2015-11-21 14:00:58 +01:00
engern 31dc1b2cdb Fixes U46340 2015-11-21 13:20:13 +01:00
engern 07c714fd11 Fixes U4-7424
Add the possibilty to change the error message when a macro partial view
fails to render.
2015-11-21 11:33:46 +01:00
Claus d4b9a711c6 Merge pull request #919 from umbraco/temp-U4-4641
Fixes: U4-4641 Feature Request:  template and code editors should have insert Section, Define section buttons
2015-11-20 13:41:50 +01:00
Claus 9521742254 Fixes to MultiNodePicker when using media. 2015-11-20 13:17:28 +01:00
Claus 9fee3f5873 Merge pull request #918 from umbraco/temp-U4-5764
Related to: U4-5764 - adding in Open button on content/media picker
2015-11-20 12:09:21 +01:00
Claus cb10578e19 Merge branch 'Nicholas-Westby-feature/U4-5764-node-picker-info' into temp-U4-5764 2015-11-20 11:52:25 +01:00
Claus cdc4435f2d Merge branch 'feature/U4-5764-node-picker-info' of git://github.com/Nicholas-Westby/Umbraco-CMS into Nicholas-Westby-feature/U4-5764-node-picker-info 2015-11-20 11:47:48 +01:00
bjarnef a885840b9f Move Umbraco version label to header in user dialog 2015-11-19 21:55:54 +01:00
bjarnef 62173cef58 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2015-11-19 21:12:24 +01:00
Shannon Deminick e5b0a4d98c Merge pull request #854 from Spijkerboer/UKFest-U4-7322
Uk fest u4 7322
2015-11-19 19:26:53 +01:00
Shannon Deminick 9479d63cba Merge pull request #899 from Acentrage/U4-7219
Fixes U4-7219
2015-11-19 19:24:24 +01:00
Shannon 4c544acb42 fixes links so that working with vdirs works too. 2015-11-19 19:21:55 +01:00
Shannon Deminick c7c5f481f1 Merge pull request #879 from danieland/U4-4794--nodebug
U4 4794  nodebug
2015-11-19 19:10:35 +01:00
Shannon 5e8e62cbf7 missing csproj save 2015-11-19 18:29:11 +01:00
Shannon 555b520a0c Cleans up the usages of auth cookies. OWIN is in charge of auth cookies but because we have Webforms, WebApi, MVC and OWIN, they all like to deal with cookies differently. OWIN should still be solely in charge of the auth cookies, so the auth extensions are cleaned up, the renewal now works by queuing the renewal and we have custom middleware detect if a force renewal has been queued and we renew the auth cookie there. Have obsoleted a few methods that should not be used that write auth tickets directly (this is purely for backwards compat with webforms). All of these changes now ensure that the auth cookie is renewed consistently between Webforms, WebApi, MVC and OWIN. Some changes also include ensuring that OWIN is used to sign out. 2015-11-19 18:12:21 +01:00
Simon Busborg 8053db32b6 code comments 2015-11-19 15:40:38 +01:00
Sebastiaan Janssen 3e2d59e526 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-11-19 14:43:45 +01:00
Sebastiaan Janssen 9d3e967c2a Ignore test that keeps crapping out on build server 2015-11-19 14:43:35 +01:00
Shannon 71ec09486d Reverts the 'fix' from U4-7118 since it is incorrect. Updates the sliding expiration of the cookie/ticket when the user is supposed to be always logged in to 30 minutes in case the timeout is actually set very low in config. 2015-11-19 14:17:06 +01:00
Claus 8dadc92aa8 Fixed migration causing issues when upgrading from a site pre-migrations-table to version 7.3.2. 2015-11-19 12:01:46 +01:00
Shannon f472f5d950 Ensures that OWIN signout method is called - this ensures that any auth middleware configured for the current user is called for sign out. Updates our cookie middleware provider to also ensure that our custom cookies are cleared when signing out with OWIN. 2015-11-19 11:57:24 +01:00
Simon Busborg 775a6f80ea Added comments to support the changes 2015-11-19 11:47:49 +01:00
Simon Busborg 5bf8b8ecba Used less function 'fade' instead of random color 2015-11-19 11:44:33 +01:00
Simon Busborg 397ef32665 Added hover & active state to input-label--small 2015-11-19 11:40:29 +01:00
Simon Busborg 2634e33f51 Used @fontSizeLarge variable to determine font-size for panel-dialog--header 2015-11-19 11:27:56 +01:00
Simon Busborg 6e27caa547 Added comments and notes 2015-11-19 11:11:09 +01:00
Simon Busborg 9c027dcdbc some ui love for the panel dialogs 2015-11-19 10:32:17 +01:00
bjarnef f3876b86dc Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2015-11-19 00:38:32 +01:00
Shannon Deminick 58c3dfac1c Merge pull request #913 from Nicholas-Westby/feature/u4-7425-forms-constant-comment
Fixed typo for "forms": http://issues.umbraco.org/issue/U4-7425
2015-11-19 00:34:54 +01:00
Nicholas-Westby dcf59d2b17 Fixed typo for "forms": http://issues.umbraco.org/issue/U4-7425 2015-11-18 14:29:10 -08:00
bjarnef 71099514cb Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2015-11-18 22:00:33 +01:00
Sebastiaan Janssen 887111318f Update install facts 2015-11-18 20:35:36 +01:00
Sebastiaan Janssen bf9755b27c Don't end response so people can actually hook into PostRequestHandlerExecute 2015-11-18 19:41:20 +01:00
Sebastiaan Janssen aca181b32e U4-7410 Version issue with MySql.Data after upgrade to 7.3.1.
#U4-7410 Fixed
2015-11-18 19:39:10 +01:00
Shannon Deminick 886347e763 Merge pull request #912 from lars-erik/fix-u4-7268
Support generic CultureInfo as language culture
2015-11-18 18:26:09 +01:00
Shannon Deminick 9fa606e065 Merge pull request #907 from umbraco/temp-U4-7414
U4-7414 Deleted tab's properties should become generic properties
2015-11-18 17:01:02 +01:00
Shannon e40ac44afd updates test to reflect the instructions to replicate the original issue U4-7414 2015-11-18 17:00:27 +01:00
Shannon 48603fb840 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-11-18 16:07:10 +01:00
Shannon f824439180 Merge branch 'UKFest-U4-4792' of https://github.com/opelpanfan/Umbraco-CMS into opelpanfan-UKFest-U4-4792
Conflicts:
	src/Umbraco.Core/Services/ContentService.cs
2015-11-18 16:07:01 +01:00
Shannon Deminick b3616c9f8c Merge pull request #911 from umbraco/temp-U4-4792
Fixes: U4-4792 Ancestors() on IContent throws "Object reference not set to an instance of an object."
2015-11-18 16:04:22 +01:00
Shannon 48383f2e7a updaes null check and ensures the path isn't pre-set in the withidentity overload 2015-11-18 16:04:01 +01:00
Shannon cb98385242 updates content/media service methods - null checks for parent IContent, dosn't use Parent() syntactic sugar methods, removes path creation in the WithIdentity methods. 2015-11-18 15:52:32 +01:00
Shannon 916bad82df Ensures that the RenderActionInvoker isn't doing anything special so that MVC takes care of everything regarding async vs non-async and any controller descriptor/action descriptor lookups and cache. Creates a RenderIndexActionSelectorAttribute - this is used to decorate the underlying RenderMvcController.Index action. MVC will call into this method to check if the MethodInfo is valid, we then do a quick comparison of types, if the current type is the same as the reflected type, this means that the Index action has been overridden or there is no custom controller... lets use it. If the types don't match we'll do a simple reflected lookup to check if the reflected controller type (current controller) has more than one index action, if so, it means that a custom controller is in play and it has a custom index action... so we won't use the base class action and then it's up to MVC to find any other matching Index action based on the current request parameters. Added some tests for this too. 2015-11-18 14:59:29 +01:00
Claus 29ec8cb2d3 Merge pull request #857 from gerwinbouwhuis/UKFest-U4-5581
Uk fest u4 5581
2015-11-18 14:32:52 +01:00
Lars-Erik Aabech 04900337c7 Support generic CultureInfo as language culture 2015-11-18 14:13:32 +01:00
Claus 1433685160 MediaService assigns Path when creating media objects. 2015-11-18 09:26:45 +01:00
Stephan c5994ed54a Fix previous commit 2015-11-17 17:25:01 +01:00
Shannon 9fd80d791a Creates an IAsyncRenderMvcController which can be used instead of IRenderMvcController if developers want access to an async Index action. 2015-11-17 17:05:00 +01:00
Stephan f5f9cb676c Fix CultureInfo leak in UmbracoApplicationBase too. 2015-11-17 16:54:24 +01:00
Claus 04e2d2370a Fixes: U4-4792 Ancestors() on IContent throws "Object reference not set to an instance of an object." 2015-11-17 16:49:01 +01:00
Stephan 8d00d931b0 U4-7414 Deleted tab's properties should become generic properties 2015-11-17 16:36:57 +01:00
Shannon Deminick 2998ad8cea Merge pull request #873 from AffinityID/u4-7352
U4-7352 Fixed exception logging in UmbracoDatabase.
2015-11-17 16:21:18 +01:00
Shannon Deminick 46c15ef28f Merge pull request #877 from cheeseytoastie/UKFest-7341
Ukfest 7341
2015-11-17 16:19:35 +01:00
Claus 2b369a57d8 Merge pull request #864 from andycyberian/UKFest-U4-6980
Uk fest u4 6980
2015-11-17 14:25:38 +01:00
Claus c37a6bb928 Merge pull request #870 from JJCLane/UKFest-U4-6094
Adds a check to include users in the send to translation list that ha…
2015-11-17 13:48:01 +01:00
Claus 6e53291877 Fixed up a few things. 2015-11-17 13:42:00 +01:00
Claus bb78f756c7 Merge branch 'Jeavon-U4-4641' into temp-U4-4641 2015-11-17 12:47:18 +01:00
Claus ffb0de4050 Merge branch 'U4-4641' of git://github.com/Jeavon/Umbraco-CMS into Jeavon-U4-4641 2015-11-17 12:46:24 +01:00
Claus 0fecad9867 Merge pull request #906 from umbraco/temp-U4-6515
Fixes: U4-6515 Media picker does not set $dirty
2015-11-17 11:51:58 +01:00
Claus 3045068d68 Fixes: U4-6515 Media picker does not set $dirty
Included fix for member picker.
2015-11-17 10:59:21 +01:00
Claus 37a6668313 Merge branch 'U4-6515' of git://github.com/deepak4u/Umbraco-CMS into deepak4u-U4-6515 2015-11-17 10:50:07 +01:00
Sebastiaan Janssen 36814d746f Merge pull request #905 from GertyEngrie/dev-v7
U4-7297 - fixes <hr/>-button in tinymce
2015-11-17 10:34:37 +01:00
Claus a72f6edb6b Merge pull request #846 from OptimisticCoder/UKFest-U4-6732
U4-6732 - Added message on back office, when JS is disabled.
2015-11-17 10:23:06 +01:00
Sebastiaan Janssen e01cbcd405 Fix failing upgrade due to old dll being in bin folder 2015-11-17 09:24:22 +01:00
Claus 012ed6cf16 Merge pull request #862 from dampee/u4-7314
U4-7314 Change name of "Textbox Multiple" to "TextArea"
2015-11-17 08:57:49 +01:00
Gerty Engrie eb3ff12916 U4-7297 - fixes <hr/>-button 2015-11-17 00:35:10 +01:00
Claus 1ebff69358 Merge pull request #904 from umbraco/temp-U4-7393
Fixes: U4-7393 Actions menu placed behind publish button on mobile phone
2015-11-16 16:02:00 +01:00
Claus 5435c44ea9 Using a lower z-index to fix the issue at hand. 2015-11-16 16:00:43 +01:00
Claus 76fa477c35 Merge branch 'U4-7393' of git://github.com/Acentrage/Umbraco-CMS into Acentrage-U4-7393 2015-11-16 15:55:04 +01:00
Claus 1f6f36d8c8 Updated unit test after adding in TaskTypeMapper. 2015-11-16 15:53:58 +01:00
Claus Jensen c46ac11125 Merge pull request #849 from mzajkowski/UKFest-U4-6282
U4-6282  Add note to Register Partial Macro
2015-11-16 15:37:47 +01:00
Claus 73d5a3f993 Merge branch 'opelpanfan-UKFest-U4-6511' into dev-v7 2015-11-16 15:31:29 +01:00
Claus Jensen 5a99a6903d Merge pull request #888 from umbraco/temp-U4-7353
Fixes: U4-7353 OAuth providers for the back office require more flexi…
2015-11-13 14:47:11 +01:00
Shannon Deminick 775639da41 Merge pull request #848 from Khinrot/UKFest-U4-5560
Fixing "U4-5560 White space issue in content tree"
2015-11-13 14:06:40 +01:00
Shannon Deminick 2375ede161 Merge pull request #867 from jbreuer/U4-4028
U4-4028 Don't load the full images, but server side resized.
2015-11-13 13:41:53 +01:00
Shannon Deminick fcd00599da Merge pull request #858 from tompipe/U4-1959
Fixes U4-1959
2015-11-13 13:40:26 +01:00
Shannon d3f5090150 Fixes up a couple of missing path updates and incorrect icon resolution and fixed another issue with webservice path reference 2015-11-13 13:38:30 +01:00
Shannon 6a7faf457b Merge branch 'dev-uk-U4-1117' of https://github.com/JeffreyPerplex/Umbraco-CMS into JeffreyPerplex-dev-uk-U4-1117 2015-11-13 11:35:29 +01:00
Shannon ec247d2b27 ensures the migration table's seed is higher than 1 (have put it to 100). 2015-11-13 11:31:59 +01:00
Shannon f32479bb10 bumps version 2015-11-13 11:26:31 +01:00
Shannon Deminick 371269436f Merge pull request #891 from umbraco/temp-U4-7128
Fixes: U4-7128 Send to Translation gives YSOD
2015-11-13 10:23:41 +01:00
Claus ef13e4112f Merge branch 'UKFest-U4-6511' of git://github.com/opelpanfan/Umbraco-CMS into opelpanfan-UKFest-U4-6511 2015-11-12 16:40:01 +01:00
Claus Jensen ce5b6861bb Merge pull request #855 from ryanmcdonough/UKFest-U4-5617
UKFest-U4-5617 RTE now respects CSS Directory AppSetting.
2015-11-12 16:35:27 +01:00
Acentrage eaf64d1814 Increased timeout from 200 to 1000 ms so you can actually type something and added support for manually submit with enter without waiting for the timer. 2015-11-12 15:33:49 +01:00
Acentrage 6bf1ecdb11 Fixes U4-7393
Safe to use both for mobile and desktop.
2015-11-12 15:17:27 +01:00
Claus Jensen fdd0ff2c23 Merge pull request #897 from umbraco/temp-U4-7070
Fixes: U4-7070 UX - Mediapicker autofocus when creating a folder
2015-11-12 15:14:19 +01:00
Claus bade8e42ba Fixes to media picker when creating new folders.
Changed to ngShow to ensure input field hides when blur event is hit.
Clearing and switching visibility of input field on successful submit.
Fixed up focus directive to use $timeout. The focus event can trigger before the element is rendered by angular so its safer to have a timeout ensure it is done at the end of the digest cycle - using $timeout instead of setTimeout ensures it is handled by angular at the right time.
2015-11-12 15:12:59 +01:00
Claus cfdf2768e6 Merge branch 'UKFest-U4-7070' of git://github.com/JJCLane/Umbraco-CMS into JJCLane-UKFest-U4-7070 2015-11-12 14:05:10 +01:00
Claus Jensen c3ca006f14 Merge pull request #896 from umbraco/temp-U4-3774
Fixes: U4-3774 Change password UX
2015-11-12 13:36:36 +01:00
Claus 6c47c8f792 Added danish translation. 2015-11-12 13:36:13 +01:00
Claus 63160e2e2d Removing the Change Password tab from Content section. 2015-11-12 13:31:03 +01:00
Claus edc58fe8a5 Merge branch 'dev-uk-U4-3774' of git://github.com/JeffreyPerplex/Umbraco-CMS into JeffreyPerplex-dev-uk-U4-3774 2015-11-12 11:23:36 +01:00
Claus Jensen 23632dc0c3 Merge pull request #856 from tompipe/U7-6928
Fixes U4-6928 - Persist Creator ID of member
2015-11-12 11:07:57 +01:00
Claus Jensen d739b9fb31 Merge pull request #894 from umbraco/temp-U4-6167
Fixes: U4-6167 MNTP: show path of selected node
2015-11-12 10:58:24 +01:00
Claus 2ae4ede258 Showing path when hovering nodes should be configurable on the content picker. 2015-11-12 10:55:00 +01:00
Claus cacd08b57c Merge branch 'tompipe-U4-6167' into temp-U4-6167 2015-11-11 17:21:51 +01:00
Claus 4eddfb4cf5 Merge branch 'U4-6167' of git://github.com/tompipe/Umbraco-CMS into tompipe-U4-6167 2015-11-11 17:13:40 +01:00
Claus f2b3d7c041 Removed commented out line. 2015-11-11 12:07:45 +01:00
Claus 5d97a94dcb Fixed to use alias instead of hardcoded id.
Added mapper for TaskType.
2015-11-11 12:02:12 +01:00
Claus de6e7dd28d Merge branch 'U4-7128' of git://github.com/tompipe/Umbraco-CMS into tompipe-U4-7128 2015-11-11 11:14:38 +01:00
Claus Jensen 420c029bf7 Merge pull request #859 from Khinrot/UKFest-U4-6426
Fixing "U4-6426 CTRL click should open in a new window"
2015-11-11 11:12:22 +01:00
Claus 61441dd436 Fixes: U4-7370 Upgrading from 7.3.1 to 7.4 fails
cherrypicked from 7.4.0 branch.
Added migration for 7.3.2, ensuring the identity on the table is correct. It failed due to rows initially being inserted with identity disabled and therefore the seed of the table was zero even when the table had data.
2015-11-10 12:15:44 +01:00
bjarnef 5c24867925 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2015-11-09 23:52:27 +01:00
Wincent 0409cbe613 Changed ImageController.GetBigThumbnail to redirect
Changed thumbnail paths to include rnd equal to UpdateDate
2015-11-09 21:41:25 +01:00
Shannon bbbea99ced removes redundant null check. 2015-11-09 10:56:07 +01:00
Shannon 3d213342bf Fixes: U4-7353 OAuth providers for the back office require more flexibility with Challenge Results 2015-11-09 10:42:15 +01:00
Sebastiaan Janssen 48fdb75d96 Improves clean scripts for Claus 2015-11-09 09:25:59 +01:00
Sebastiaan Janssen a97094458d U4-7356 <siteMap><providers> element can only be added once, when using nuget update-packge
U4-7356 Fixed
2015-11-09 09:25:58 +01:00
Nicholas-Westby f81353af0b Amended last commit for detailed node info (so it plays nice when picking media): http://issues.umbraco.org/issue/U4-5764
Also added node path to title of "Open" button (so it shows the full path on hover).
More consistent quoting (namely, using apostrophes rather than double quotes).
2015-11-08 17:16:17 -08:00
bjarnef f0e1460550 Update bower.json with ngCapsLock 2015-11-09 00:34:34 +01:00
bjarnef d15c09ad2a Localize "Caps Lock is on" 2015-11-09 00:06:16 +01:00
Nicholas-Westby 5813202892 Finished implementation of detailed node info (added breadcrumb to content dialog): http://issues.umbraco.org/issue/U4-5764
Also moved the breadcrumb into a directive since it was used in multiple places.
2015-11-07 23:51:07 -08:00
bjarnef 82f6b6a66d Add ngCapsLock 2015-11-07 23:53:35 +01:00
bjarnef eec6ee79aa Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2015-11-07 00:25:49 +01:00
Nicholas-Westby 5ed4f262cd Partial implementation of detailed node info (changed button text to "Open" and styled a bit): http://issues.umbraco.org/issue/U4-5764 2015-11-04 22:25:37 -08:00
Nicholas-Westby e5d7f6fd04 Partial implementation of detailed node info (show node in "view" is clicked): http://issues.umbraco.org/issue/U4-5764 2015-11-03 22:39:36 -08:00
Daniel a9ad0ae8eb removed the debug check 2015-11-02 23:34:33 +01:00
Daniel Andreasen 9cd64a9061 Merge pull request #2 from umbraco/dev-v7
merge from umbraco/
2015-11-02 22:41:44 +01:00
Steve Morgan 839c0d011b Added ConfigureAwait(false)
ConfigureAwait(false) is recommended on async calls?
http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
Credit: @dampeebe
2015-11-02 10:26:25 +00:00
Nicholas-Westby 15c9aadcdc Partial implementation of detailed node info: http://issues.umbraco.org/issue/U4-5764 2015-11-01 22:43:27 -08:00
Wincent 36a1c0a9e0 Changed web api GetBigThumbnail to image processor in mediahelper.service.js and fileupload.controller.js 2015-10-31 16:31:19 +01:00
Stephan 30f0c96052 Fix AsyncLock finalizer throwing exceptions 2015-10-31 12:47:04 +01:00
Stephan cfab30a1ef Fix thread CultureInfo issue breaking PetaPoco 2015-10-31 12:47:03 +01:00
Stephan 1dd0086eb5 Revert "strange/crazy peta poco fix for cultures"
This reverts commit 0d29e1438c.
2015-10-31 12:47:02 +01:00
andydale1982 a7f06ebc56 Typo Correction 2015-10-30 10:38:05 +00:00
Andrey Shchekin 9498bc4bfd U4-7352 Fixed exception logging in UmbracoDatabase. 2015-10-30 11:24:18 +13:00
Jeavon Leopold 38b13bf6ce Basic implementation for U4-4641 2015-10-29 17:18:40 +00:00
Jeavon Leopold c8cb5b26b0 Basic implementation for U4-4641 Feature Request: template and code editors should have insert Section, Define section buttons 2015-10-29 17:14:45 +00:00
andydale1982 5749f80a7f Added instructions to manually install node_modules. 2015-10-29 17:10:39 +00:00
Jordan Lane 5d9a935621 Adds a check to include users in the send to translation list that have the translate permission for current page
http://issues.umbraco.org/issue/U4-6094#
2015-10-29 16:50:00 +00:00
Tom Pipe 1ff4fe26dd Fixes YSOD after send to translation 2015-10-29 16:43:54 +00:00
Benas Brazdziunas bd69820028 Member Picker search results doesn't show correct icons 2015-10-29 16:29:33 +00:00
Jeroen Breuer 3c9953979a U4-4028 Don't load the full images, but server side resized. 2015-10-29 17:00:23 +01:00
andydale1982 2f6189ae24 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2015-10-29 15:55:49 +00:00
deepak4u 5ff329778d fix for issue u4-6515 2015-10-29 15:53:11 +00:00
Andy Rose befb2b4d2f U4-6980: Fixing merge issue 2015-10-29 15:32:03 +00:00
Andy Rose f4ae45d8f2 U4-6980: Adding supporting unit tests for changes to the template repository 2015-10-29 15:29:23 +00:00
Andy Rose 7b73ed1796 U4-6980: Adding supporting unit tests for changes to the template repository 2015-10-29 15:29:22 +00:00
Andy Rose 0eacbcb7cb U4-6980: Only assume a masterpage template if a MVC hasn't already been created 2015-10-29 15:29:20 +00:00
Jeffrey Schoemaker f871de61d5 U4-1117 - Fixed any errors when renaming /umbraco to something else 2015-10-29 16:28:12 +01:00
Jeffrey Schoemaker e02693e46b U4-1117 - Fixed any errors when renaming /umbraco to something else 2015-10-29 16:27:33 +01:00
Jeffrey Schoemaker db62d14b1a U4-1117 - Fixed any errors when renaming /umbraco to something else 2015-10-29 16:27:05 +01:00
Jeffrey Schoemaker c096ab9e54 U4-1117 - Fixed any errors when renaming /umbraco to something else 2015-10-29 16:26:31 +01:00
Jeffrey Schoemaker ada5a031b4 U4-1117 - Fixed any errors when renaming /umbraco to something else 2015-10-29 16:26:06 +01:00
Jeffrey Schoemaker 9c8b9f8bb4 U4-1117 - Fixed any errors when renaming /umbraco to something else 2015-10-29 16:25:41 +01:00
Jeffrey Schoemaker a4bd3abfbe U4-1117 - Fixed any errors when renaming /umbraco to something else 2015-10-29 16:25:15 +01:00
Jeffrey Schoemaker a8a768a50f U4-1117 - Fixed any errors when renaming /umbraco to something else 2015-10-29 16:24:41 +01:00
Jeffrey Schoemaker 62b99ffc59 U4-1117 - Fixed any errors when renaming /umbraco to something else 2015-10-29 16:24:16 +01:00
Jordan Lane 8e6bac534a Fix a bug where PublishStatusType would fallback to FailedContentInvalid (and break) if it was expired or trashed and add error message for FailedHasExpired
TODO: Add error message to other languages
2015-10-29 15:23:40 +00:00
Jeffrey Schoemaker 6b0c94948e U4-1117 - Fixed any errors when renaming /umbraco to something else 2015-10-29 16:23:30 +01:00
Jeffrey Schoemaker 25f049e167 U4-1117 - Fixed any errors when renaming /umbraco to something else 2015-10-29 16:22:39 +01:00
Jeffrey Schoemaker f7979fa19d U4-1117 - Fixed any errors when renaming /umbraco to something else 2015-10-29 16:22:05 +01:00
Jeffrey Schoemaker 6fd1784337 U4-1117 - Fixed any errors when renaming /umbraco to something else 2015-10-29 16:21:25 +01:00
Jordan Lane c5cf1fa6b2 Checks if content has expired or is awaiting release before publishing 2015-10-29 15:21:15 +00:00
Jordan Lane 1e4c9c2505 Set the publish status of new content version to saved if validation of publication fails e.g. a release date of the future or past unpublish date 2015-10-29 15:20:35 +00:00
Jeffrey Schoemaker a7bb8e0d00 U4-1117 - Fixed any errors when renaming /umbraco to something else 2015-10-29 16:20:17 +01:00
Jeffrey Schoemaker ed4a9f84f0 U4-1117 - Fixed any errors when renaming /umbraco to something else
We removed the ~/umbraco from the reserved path settings key. We could'nt find the location where the same setting is set in the web.config.
The variable is no longer needed as the "umbracoPath" value is automatically inserted into the reserved path setting.
2015-10-29 16:18:14 +01:00
Jordan Lane a6b56db2f5 Fixes an issue with the contentService.RePublishAll() where it wouldn't publish an old published version if the newest version of the content wasn't published i.e had a scheduled date set because this would create a new version with status not published 2015-10-29 15:16:44 +00:00
Sebastiaan Janssen bbe4a87784 U4-6171 Continuous Deployment from Visual Studio Online to Azure Websites not working as expected
#U4-6171 Fixed
2015-10-29 16:07:07 +01:00
Sebastiaan Janssen cbd5c295bd Merge pull request #728 from vnbaaij/dev-v7
Fix for #U4-6171 Continuous Deployment from Visual Studio Online to A…
2015-10-29 16:05:20 +01:00
Shannon 0d29e1438c strange/crazy peta poco fix for cultures 2015-10-29 15:24:06 +01:00
Jeffrey Schoemaker 4796827f02 U4-1117 - Fixed any errors when renaming /umbraco to something else 2015-10-29 15:05:24 +01:00
Andy Rose c6f7ece764 Merge branch 'UKFest-U4-6980' of https://github.com/andycyberian/Umbraco-CMS into UKFest-U4-6980 2015-10-29 14:00:46 +00:00
Andy Rose e86aaefaaf U4-6980: Only assume a masterpage template if a MVC hasn't already been created 2015-10-29 13:59:09 +00:00
Andy Rose 97e9cd4be0 U4-6980: Only assume a masterpage template if a MVC hasn't already been created 2015-10-29 13:54:12 +00:00
Asbjørn Riis-Knudsen 63af822bad U4-6657: Use flexbox for mediapicker search field and upload button to allow button to scale for different translations 2015-10-29 14:52:18 +01:00
Tom Pipe b65f653c91 Fixes U4-1959 2015-10-29 13:08:37 +00:00
Damiaan 3b404a2f76 U4-7314 Change name of "Textbox Multiple" to "Large textbox" or "Textarea" 2015-10-29 13:54:16 +01:00
Tom Pipe e9567e7adc Fixes U4-6928 - Persist Creator ID of member 2015-10-29 12:52:36 +00:00
gerwin.bouwhuis 697daab4d7 change :get the correct alternative recursive field 2015-10-29 13:50:30 +01:00
Alejandro Ocampo 6c29ad854c Fixing "U4-6426 CTRL click should open in a new window" 2015-10-29 12:48:40 +00:00
gerwin.bouwhuis 93d89535aa undo 2015-10-29 13:32:50 +01:00
gerwin.bouwhuis eb093ca4a6 change : find the correct alternative recursive field 2015-10-29 13:23:43 +01:00
ryanmcdonough 1040f234dc Update grid.rte.directive.js 2015-10-29 12:09:29 +00:00
Sebastiaan Janssen 5a1ace9362 Revert "Fixes tests failing due to missing path"
This reverts commit 0c402310d9.
2015-10-29 13:00:51 +01:00
ryanmcdonough 3f835fe19c RTE now respects CSS Directory AppSetting.
Fixes #U4-5617
2015-10-29 12:00:43 +00:00
Dennis Spijkerboer bf43ce3281 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into UKFest-U4-7322 2015-10-29 12:57:27 +01:00
Dennis Spijkerboer c37ba0dc8a Checked if the trimmed value starts and ends with brackets. If so, use the trimmed value. 2015-10-29 12:56:07 +01:00
Jeffrey Schoemaker 7b5ad9a5c6 U4-3774 / U4-4752 - Added a change password form to the user dialog 2015-10-29 12:44:30 +01:00
Steve Morgan f0afa701bc Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2015-10-29 11:38:03 +00:00
Jeffrey Schoemaker 71dc1110d8 U4-3774 / U4-4752 - Added a change password form to the user dialog 2015-10-29 12:38:00 +01:00
Jeffrey Schoemaker 4de4eb9cc8 U4-3774 / U4-4752 - Added a change password form to the user dialog 2015-10-29 12:34:05 +01:00
Jeffrey Schoemaker 308d5ba344 U4-3774 / U4-4752 - Added a change password form to the user dialog 2015-10-29 12:32:57 +01:00
Tom Pipe 74dac71e8a Fixes U4-6167 - Show path of selected node 2015-10-29 11:31:53 +00:00
Jeffrey Schoemaker 64518774c6 U4-3774 / U4-4752 - Added a change password form to the user dialog 2015-10-29 12:29:24 +01:00
Jeffrey Schoemaker f65b0df3e2 U4-3774 / U4-4752 - Added a change password form to the user dialog 2015-10-29 12:28:23 +01:00
Jeffrey Schoemaker 5cfe9e85f8 U4-3774 / U4-4752 - Added a change password form to the user dialog 2015-10-29 12:27:32 +01:00
Jeffrey Schoemaker 61044b6018 U4-3774 / U4-4752 - Added a change password form to the user dialog 2015-10-29 12:23:47 +01:00
Jeffrey Schoemaker 00fc5a5bb2 U4-3774 / U4-4752 - Added a change password form to the user dialog 2015-10-29 12:22:20 +01:00
Stephan da85e4eb28 fixes list view ancestor check fix 2015-10-29 12:20:10 +01:00
Alejandro Ocampo 3f23865e0a Fixing "U4-5560 White space issue in content tree" 2015-10-29 11:06:31 +00:00
Shannon fbc08d66f1 fixes list view ancestor check 2015-10-29 12:05:46 +01:00
Shannon 79f04bf939 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-10-29 11:57:07 +01:00
Shannon 9ab90595e2 Adds a filter to the interceptor to ignore errors for certain requests. 2015-10-29 11:56:23 +01:00
Marcin Zajkowski aac208c0e8 U4-6282 Add note to Register Partial Macro 2015-10-29 10:53:29 +00:00
Benas Brazdziunas f8e101ec13 U4-6511 make MNTP icon clickable 2015-10-29 10:43:04 +00:00
OptimisticCoder 23fcc1ac55 Added message on back office, when JS is disabled.
" JAVASCRIPT IS DISABLED. PLEASE ENABLE TO CONTINUE!"
2015-10-29 10:28:49 +00:00
Jordan Lane 6356531207 Focus new folder input automatically
http://issues.umbraco.org/issue/U4-7070
2015-10-29 10:22:34 +00:00
Sebastiaan Janssen 51b618826c Merge pull request #844 from ryanmcdonough/UKFest-U4-7151
Update database placeholder to backslash for instance name.
2015-10-29 11:16:56 +01:00
ryanmcdonough 04c28e5006 Update database placeholder to backslash for instance name. 2015-10-29 09:56:22 +00:00
andydale1982 e9ef9b9d75 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2015-10-29 09:54:19 +00:00
Sebastiaan Janssen c160ce98c1 Merge pull request #794 from mstodd/dev-v7
Setting UMB_CONTEXT with Domain "FALSE"
2015-10-29 10:19:28 +01:00
Sebastiaan Janssen c3a60ea0e0 Merge pull request #838 from ryanmcdonough/U4-7302
Login overlay now higher than bootstrap datepicker
2015-10-29 09:19:42 +01:00
Stephan 3408efdee4 Merge pull request #842 from umbraco/temp-U4-7285
U4-7285 Fix DistributedCache.ClearXxxCacheOnCurrentServer
2015-10-28 19:38:04 +01:00
Shannon 1f0dc7e65d Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-10-28 18:26:44 +01:00
Shannon f89083c772 bumped version 2015-10-28 18:26:34 +01:00
Sebastiaan Janssen 752065e540 Merge pull request #835 from umbraco/temp-U4-7032
U4-7032 7.3.0 Custom backoffice login provider requires simpler implementation extensibility
2015-10-28 18:25:10 +01:00
Sebastiaan Janssen 82e4e50584 Merge pull request #841 from umbraco/temp-U4-7231
U4-7231 TryConvertTo<T> of ObjectExtensions doesn't do null checks (c…
2015-10-28 17:09:30 +01:00
Sebastiaan Janssen 775e63148d Merge branch 'temp-U4-5963' into dev-v7 2015-10-28 17:02:51 +01:00
Sebastiaan Janssen 4259b02b8d Merge branch 'dev-v7' into temp-U4-5963
Conflicts:
	src/Umbraco.Web.UI.Client/src/controllers/main.controller.js
2015-10-28 16:56:40 +01:00
Sebastiaan Janssen 0c402310d9 Fixes tests failing due to missing path 2015-10-28 16:07:54 +01:00
Stephan 8d92330ad6 Fix broken comments 2015-10-28 15:01:23 +01:00
Sebastiaan Janssen 44e76f741f Merge pull request #840 from umbraco/temp-U4-7021
Fixes: U4-7021 "Actions" dropdown not available to children in listvi…
2015-10-28 14:52:48 +01:00
Shannon ecbced5c62 Massively simplifies the RenderActionInvoker which will support the native MVC caching and both async and non async support. U4-7270 Async Index actions for controllers implementing IRenderMvcController do not render view correctly 2015-10-28 14:31:40 +01:00
Shannon e6773dafc1 Updates PR to only display the prop alias in the title attribute when in debug mode. U4-4794 Display the property alias for content properties & provide a link to the content type from the generic properties tab 2015-10-28 12:45:15 +01:00
Shannon Deminick 7b8b7ed170 Merge pull request #837 from digbyswift/dev-v7
U4-7270 - Addition of allowance for async/await Index actions
2015-10-28 12:33:32 +01:00
Shannon Deminick c0997e1b9f Merge pull request #817 from tobbbe/hooverpropforalias
Hoover a property in backend to get its alias
2015-10-28 12:31:20 +01:00
Shannon d4f862a44f Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-10-28 12:28:41 +01:00
Shannon 64c983eb07 Updates PR with fixes for code and implementation logic for the url list. 2015-10-28 12:28:29 +01:00
Shannon e25222162c Merge branch 'danieland-U4-7296-Link-to-each-items-doc-type-from-Properies-tab-in-Content-section' into dev-v7 2015-10-28 09:50:20 +01:00
Shannon e022687457 Merge branch 'U4-7296-Link-to-each-items-doc-type-from-Properies-tab-in-Content-section' of https://github.com/danieland/Umbraco-CMS into danieland-U4-7296-Link-to-each-items-doc-type-from-Properies-tab-in-Content-section 2015-10-28 09:49:55 +01:00
Shannon 84db2f4d85 U4-7285 Every server that reads a instruction from umbracoCacheInstruction will also write the same instruction to the database. Intentional ? 2015-10-27 19:24:56 +01:00
Shannon ef64409a9a U4-7231 TryConvertTo<T> of ObjectExtensions doesn't do null checks (causes handled errors on members after upgrade) 2015-10-27 18:29:46 +01:00
Shannon f0b68ac31e Fixes: U4-7021 "Actions" dropdown not available to children in listview nodes 2015-10-27 18:13:18 +01:00
Jeffrey Schoemaker dba7bcf60a Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2015-10-27 15:21:07 +01:00
Sebastiaan Janssen 6c80bd9eb9 U4-6385 Poor Handling of disallowedUploadFiles
#U4-6385 State: Review
2015-10-27 13:45:02 +01:00
TimoPerplex 43baba1733 Revert "Latest"
This reverts commit 95a9e4b5ff.
2015-10-27 13:10:25 +01:00
TimoPerplex 95a9e4b5ff Latest 2015-10-27 13:09:21 +01:00
TimoPerplex 9b0aa49d4d Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2015-10-27 13:08:32 +01:00
Sebastiaan Janssen c7b7bf1510 Merge pull request #839 from umbraco/temp-U4-7214
U4-7214 Culture is not supported. Parameter name: name en_us is an in…
2015-10-27 11:27:53 +01:00
Shannon d1805b1448 U4-7214 Culture is not supported. Parameter name: name en_us is an invalid culture identifier error selecting user with different language after upgrade to 7.3.0 2015-10-27 11:22:28 +01:00
ryanmcdonough 780937dae9 Login overlay now higher than bootstrap datepicker 2015-10-26 15:49:55 +00:00
Shannon 9b054eaa47 Adds native ability to be able to fallback to default password checking if specifying a custom IBackOfficeUserPasswordChecker 2015-10-26 14:51:19 +01:00
bjarnef 1584530615 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2015-10-25 18:40:45 +01:00
bjarnef 100ca5caa6 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2015-10-25 18:29:13 +01:00
Shannon Deminick badd9ae289 Merge pull request #833 from umbraco/temp-U4-7201
Fixes: U4-7201 Can only save once in some editors after upgrade to 7.3
2015-10-23 11:45:24 +02:00
Kieron McIntyre db6755a5bb Addition of allowance for async/await Index actions 2015-10-23 10:04:14 +01:00
Daniel 738815170c more nullchecks needed?
null check that we can access user
2015-10-23 00:21:42 +02:00
Daniel ef091e8c3a U4-7296
http://issues.umbraco.org/issue/U4-7296
2015-10-22 23:41:18 +02:00
Daniel 71b3810e9c Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2015-10-22 21:49:49 +02:00
Shannon Deminick a1e62dae5e Merge pull request #834 from Attackmonkey/Fix-U4-7257
Fixes issue where dictionary items are displayed in a random order
2015-10-22 18:43:23 +02:00
Shannon 96c087d00f adds a ctor to the BackOfficeUserManager to allow better inheritance so that all settings are initialized by default, changes init method to be protected so other devs can use it. Adds a new property for devs to use to more easily extend the logic to just validate the username/password. 2015-10-22 18:40:20 +02:00
Tim 0568bf51f0 Fixes issue where dictionary items are displayed in a random order (see issue U4-7257) 2015-10-22 17:17:29 +01:00
Shannon Deminick e3bade4d1a Merge pull request #816 from Jeavon/U4-7260
Fix for U4-7260
2015-10-22 18:08:23 +02:00
Shannon Deminick 633b0b0003 Merge pull request #830 from albinj/dev-v7
U4-7283 - Only Master/Single ServerRole should be removing old instru…
2015-10-22 18:06:53 +02:00
Shannon Deminick 82adf48699 Merge pull request #805 from umbraco/temp-7234
Fixes #7234
2015-10-22 18:06:14 +02:00
Shannon 63be12b9fe Merge branch 'dev-v7-U4-6967' of https://github.com/bjarnef/Umbraco-CMS into bjarnef-dev-v7-U4-6967
Conflicts:
	src/Umbraco.Web.UI.Client/src/controllers/main.controller.js
2015-10-22 18:03:03 +02:00
Shannon 33f7ed5129 Fixes: U4-7223 GetCropUrl outputs html entities in url when used in css
Adding in HtmlHelper extensions for GetCropUrl.
2015-10-22 17:52:58 +02:00
Shannon 79583c571c Fixes: U4-7201 Can only save once in some editors after upgrade to 7.3 2015-10-22 15:40:12 +02:00
Shannon Deminick a7e2c0b4dc Merge pull request #804 from rasmusjp/feature/copy-content-dialog
Added recursive option to copy dialog
2015-10-22 10:38:07 +02:00
Shannon da48e1b392 Fixes: U4-6962 Public access in multiple levels is broken in 7.3
Ensured the backoffice UI will look at protection for the specific node only (no inheritance) when specifying public access.
Added non-recursive method to Access class.
Fixed bug causing the tree (child nodes) not to update correctly after changing public access on nodes.
2015-10-21 18:43:30 +02:00
albinj f535ece685 U4-7283 - Only Master/Single ServerRole should be removing old instructions from the database 2015-10-21 14:29:18 +01:00
Claus Jensen 04e46c7cd1 Merge pull request #815 from umbraco/temp-U4-7198
Fixes: U4-7198 Change default log4net config to include machine name …
2015-10-21 12:20:45 +02:00
Claus Jensen 1089aef00a Merge pull request #825 from umbraco/temp-U4-7217
Fixes: U4-7217 umbracoReservedUrls do not always resolve correctly.
2015-10-21 11:52:39 +02:00
bjarnef 0288d6ec89 Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' into dev-v7 2015-10-20 22:28:50 +02:00
Shannon 8950d94b25 adds unit test showing deleting a property group does not delete the property types. 2015-10-20 14:51:08 +02:00
Shannon bb6299cc01 Fixes: U4-7217 umbracoReservedUrls do not always resolve correctly.
Verified that all tests in GlobalSettingsTests run correctly.
Removes the strange old legacy compare thing and replaces it with a more readable Linq solution that ensures that the strings compared are always consistent.
2015-10-20 09:48:58 +02:00
Shannon Deminick 2176f2a1c9 Merge pull request #802 from tmoxon/dev-v7
Null check to prevent object reference error with public properties on custom indexers
2015-10-19 18:05:33 +02:00
Shannon Deminick 6a351bede1 Merge pull request #823 from umbraco/tmp-6797
U4-6797 - clear domains cache when deleting content
2015-10-19 15:52:37 +02:00
Shannon Deminick efc1aae0ae Merge pull request #822 from umbraco/tmp-3642
U4-3642 - proper validation msg in hostnames dialog
2015-10-19 15:49:09 +02:00
Stephan df39e027fd U4-3642 - proper validation msg in hostnames dialog 2015-10-16 17:23:12 +02:00
Stephan 64f05e4c97 U4-6797 - clear domains cache when deleting content 2015-10-16 17:21:44 +02:00
Shannon 30bc89ba93 U4-7092 can't show avatar because in China all users can't access to some sites. - Fixes where and how the avatar gets loaded, we first check if it exist or that we can connect to the internet and then load it, removes the avatar loading from the user service.. not sure why it was even there. 2015-10-16 14:45:49 +02:00
Shannon 841c8d69fc removes unused avatar directive 2015-10-16 14:30:23 +02:00
Shannon aa780d2b8a updates the googlefontpicker to lazy load the required google font lib. 2015-10-16 14:09:54 +02:00
Shannon 59f15f1618 updates the canvas loader, ensures that there are no external dependencies and that paths are relative. 2015-10-16 14:09:27 +02:00
TOXIC\Tobbe b2f0a9f23d Hoover a property in backend to get its alias 2015-10-16 14:07:19 +02:00
Shannon 40cd07f3f4 removes wide setting from canvas designer since it does not exist. 2015-10-16 13:36:30 +02:00
Shannon 99e7f84f79 Moves EnableCanvasDesigner to HtmlHelperRenderExtensions because it's for rendering html, obsoletes the old ones and fixes up the canvasdesigner to use
the correct umbraco paths instead of hard coded absolute paths.
2015-10-16 13:36:10 +02:00
Stephan 3a5a32c65f U4-7255 - fix RefreshInstruction serialization 2015-10-16 12:28:14 +02:00
Shannon c2627f3a2a removes strange parse feed method, what the heck is this? it isn't used so its removed 2015-10-15 19:17:47 +02:00
Shannon 22b8d41aee U4-5963 There should be no external request dependencies - updates nonodes, removes the font references that is never used, replaces the open sans font-reference with the one that we already have locally and uses it. 2015-10-15 19:08:53 +02:00
Jeavon ee47ea2026 Fix for U4-7260 - Multi node tree picker with no selection can cause a error to display in the backoffice 2015-10-15 16:29:40 +01:00
Shannon 57622cef9a Fixes: U4-7198 Change default log4net config to include machine name in file name 2015-10-15 17:14:24 +02:00
Shannon 30ad3f5aa6 bumps version 2015-10-15 17:12:13 +02:00
Shannon 2c11f0be0f updates method to use the available request instance instead of using HttpContext.Current! no idea why it was using that. 2015-10-15 17:07:46 +02:00
Shannon c514ce8da3 Fixes: U4-7248 Can't update roles on public access, obsolete AddOrUpdateRule 2015-10-15 17:06:00 +02:00
Sebastiaan Janssen 65d421b619 Can_Update_Rule was wrong, it's not possible to "update" a rule, can only add or remove - added a test for removing 2015-10-14 11:32:55 +02:00
TimGeyssens 7eeb0c4966 Fixes U4-7249 Insert Macro split button, when selecting a macro that has parameters the dialog should immediately show those 2015-10-14 11:29:34 +02:00
Sebastiaan Janssen 62897f7064 Test was wrong, 2 rules were added and was expecting 1 to be returned, now that the code is fixed, this test needs to be corrected 2015-10-14 11:13:23 +02:00
Sebastiaan Janssen e0619edabb U4-6962 Public access in multiple levels is broken in 7.3
#U4-6962 Fixed
2015-10-14 10:19:39 +02:00
Sebastiaan Janssen 4142f47861 U4-6125 Installing MySQL Web Provider Breaks Page Publishing
#U4-6125 Fixed Due in version 7.3.1
2015-10-13 13:48:58 +02:00
Sebastiaan Janssen 7135f9a268 Removes message that is no longer correct 2015-10-13 13:12:28 +02:00
Niels Hartvig a75a58b719 Fixes #7234 2015-10-12 18:45:01 +02:00
Claus Jensen 7b969fc167 Merge pull request #790 from umbraco/U4-7075
Fixes: U4-7075 Enable Content and Media section by default for new ba…
2015-10-12 14:46:28 +02:00
Rasmus John Pedersen 78475b0686 Added recursive option to copy dialog 2015-10-09 20:25:51 +02:00
Shannon 4925d55e8f Fixes: U4-7197 open redirect vulnerability with ClientRedirect 2015-10-06 11:46:38 +02:00
Shannon 52d2306e17 Fixes: U4-7196 XSS vulnerability in BrowseRepository 2015-10-06 11:36:54 +02:00
Shannon 5e5207d4f3 Fixes: U4-7194 XSS issue with regexws page, U4-7195 XSS issue with editview.aspx 2015-10-06 10:56:16 +02:00
Sebastiaan Janssen 96d46c82fe U4-7193 NuGet install doesn't add all bindingRedirects
#U4-7193 Fixed Due in version 7.3.1
2015-10-06 08:58:19 +02:00
Per Ploug 86bf50db12 Merge pull request #803 from Tazer/dev-v7
Updated readme with working intro video , that is for umbraco v7
2015-10-05 14:28:08 +02:00
Patrik 14778422e6 Updated readme with working intro video , that is for umbraco v7 2015-10-05 14:22:57 +02:00
tmoxon 6a931273a6 The indexing api would break if an indexer was created with a public property defaulting to a null value. This would result in an object reference error in the admin system. Added null check and warning to the log. 2015-10-01 14:42:32 +01:00
Sebastiaan Janssen 5fab1ea436 U4-7164 Nuget Update-Package UmbracoCms fails if I have removed dashboard section
#U4-7164 Fixed Due in version 7.3.1
2015-10-01 08:52:40 +02:00
Shannon d50e49ad37 Fixes: U4-7120 SQL Fail upgrading om 7.2.4 to 7.3 - due to index on master col 2015-09-29 11:55:21 +02:00
Shannon c8dc10f2e3 Fixes: U4-7159 XSS issue with EditMacro.aspx 2015-09-29 11:44:22 +02:00
Shannon 0504663814 Fixes: U4-7158 Fix OrderBy query string parameter which can allow SQL Injection 2015-09-29 11:28:12 +02:00
Shannon 62611a7255 U4-7157 remove ~/umbraco/webservice.asmx 2015-09-29 10:54:56 +02:00
Daniel Andreasen 5310ce38fd Merge pull request #1 from umbraco/dev-v7
update original fork
2015-09-27 23:30:26 +02:00
Marc Stöcker 9a99ed655a Major revamp with keys added and texts fixed everywhere
Thanks to @merkledo and the others of the Stuttgart Umbraco Meetup, we pulled together all the bits and pieces for a single solid translation file. Even if not perfect it will still be better than everthing we had before and something we hopefully can keep current from now on.
2015-09-25 15:09:53 +02:00
Shannon 407cd0ca60 Streamlines TypeFinder with better lock and an error check on app_code which could otherwise bring down the app 2015-09-25 11:29:09 +02:00
Per Ploug b384f1b0c3 adds a private identifier validation method
Fixes issue with Umbraco Forms not being able to save
2015-09-24 11:39:43 +02:00
Shannon 14c4e9dda7 Fixes upgrade issue for when the same alias is used between content types and media types. 2015-09-23 11:29:29 +02:00
Sebastiaan Janssen 12fb549469 Merge pull request #798 from JimBobSquarePants/feature/update-imageprocessor
Update ImageProcessor dependency for core
2015-09-23 10:56:25 +02:00
James Jackson-South 2599fdb1d2 Fix missing project reference 2015-09-23 18:06:49 +10:00
Sebastiaan Janssen d05395075d Indentation 2015-09-23 08:34:55 +02:00
Sebastiaan Janssen 664ecd6bb7 Merge pull request #797 from JimBobSquarePants/feature/nuget-restore
Add custom repo package restore
2015-09-23 08:33:56 +02:00
James Jackson-South 6b639e940c Update ImageProcessor dependency for core
An update to U4-7053. Reduced memory usage plus web optimised images.
2015-09-23 16:05:07 +10:00
James Jackson-South 5b688d42ba Add custom repo package resotore
Adds the ability for contributors to pull the Umbraco specific Nuget
packages from the Myget repository using package restore.

https://docs.nuget.org/consume/nuget-config-file
2015-09-23 15:56:05 +10:00
Stephan 3124ea4e67 U4-7129 - BatchedDatabaseServerMessenger degraded non-batching mode when no context 2015-09-22 18:20:49 +02:00
Stephan e9afa78444 U4-7124 - add initial migration as part of BaseDataCreation 2015-09-22 18:16:35 +02:00
Stephan ef6fd54af3 Merge pull request #795 from Jeavon/U4-6784
Fix for U4-6784 Multiple Media Picker
2015-09-22 15:37:34 +02:00
Shannon 03f68cefb7 performs a fallback check for HttpContext in the batched server messengers in some cases where cache refreshers are executed on async threads... though there's not much we can do about when they are fired on background threads. 2015-09-22 14:39:55 +02:00
Shannon f8fa7df3f3 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-09-22 12:19:22 +02:00
Shannon 25cfe0193c adds detailed shutdown info to logs by default 2015-09-22 12:19:14 +02:00
Stephan 3612780d15 git-ignore loader.dev.js 2015-09-22 11:18:06 +02:00
Jeavon 7d8247047b Fix for U4-6784 Multiple Media Picker - Failed to retrieve entity data for ids 2015-09-21 14:23:36 +01:00
Robert Foster e9d0aa87bd Merge remote-tracking branch 'refs/remotes/umbraco/dev-v7' 2015-09-21 20:32:43 +10:00
m_stodd 7abbfbcfcc Setting UMB_CONTEXT with Domain "FALSE"
Running Umbraco on localhost, Chrome does not handle received 'Set Cookie's with no domain.  "FALSE" works as noted here:  http://stackoverflow.com/questions/1134290/cookies-on-localhost-with-explicit-domain
2015-09-18 02:13:12 -05:00
Sebastiaan Janssen 91a1955454 Make sure to redirect to the current version of HTML Agility Pack 2015-09-17 12:20:11 +02:00
Sebastiaan Janssen 1f3c396c5b Using protocol-relative URLs is an antipattern, just use https if you know it exists 2015-09-16 19:00:14 +02:00
Sebastiaan Janssen b9dd0ab1a9 Bump version 2015-09-16 18:58:45 +02:00
Shannon 779dd26527 Fixes: U4-6969 Property label localization in 7.3 always uses en-US locale 2015-09-16 15:22:40 +02:00
Shannon 65969e22a0 removes commented out code 2015-09-16 14:33:30 +02:00
Shannon 23f7a4e53f Set min password length is 8 characters by default for release 2015-09-16 14:32:56 +02:00
Stephan 5b1ed8bef5 U4-7108 - fix ContentTypeService.GetMediaType(guid) 2015-09-16 11:08:18 +02:00
Stephan 583ae2df11 Bugfix 2015-09-15 10:52:32 +02:00
Stephan 14cd1e7a76 Bugfix SqlSyntaxProvider date formatting 2015-09-15 10:49:41 +02:00
Sebastiaan Janssen 4572b55f98 U4-7029 Upgrading Umbraco will remove owin:startup key if configured differently
#U4-7029 Fixed
2015-09-15 10:17:31 +02:00
Vincent Baaij a22b97643a Merge remote-tracking branch 'umbraco/dev-v7' into dev-v7 2015-09-14 21:53:33 +02:00
Stephan af2dbc7cd9 U4-6811 - bugfix preview set 2015-09-14 12:43:05 +02:00
Shannon 5d7ba5c842 fixes tests 2015-09-14 12:30:32 +02:00
Shannon bee59e39a0 Streamlines migration classes and ctor dependencies... before there was issues because the current db provider was not set correctly so migrations couldn't actually rely onthe CurrentDatabaseProvider property! 2015-09-14 12:01:48 +02:00
Claus 80be614731 Fixes: U4-7075 Enable Content and Media section by default for new backoffice users 2015-09-14 11:06:03 +02:00
Shannon 8d24ac3651 Oops, fixes PK creation logic for MySQL (had the wrong boolean) 2015-09-14 10:33:37 +02:00
Shannon 7beb21ad66 Fixes upgrade issues with MySql, along with a few other things:
* All usages of getdate() are changed to the system value
* All usages of newid() are chagned to the system value
* Removes the hacks associated with the above
* Fixes the fluent migrations for table creation for mysql to not double create a PK
* Removes other system field values that actually don't do anthing and shouldn't be used
2015-09-11 17:49:47 +02:00
Shannon ed51dbaf85 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-09-11 13:55:21 +02:00
Shannon 488ba05eda Fixes upgrade issues with SQLCE and DateTime:
* DateTime's during migrations are formatted in a very explicit way
* Migration's that need to execute multiple statements are fixed in SQLCE by splitting on GO
2015-09-11 13:55:13 +02:00
Stephan 5dac5ed88b U4-7084 - fix XmlExtensions, publishing a package works 2015-09-11 13:17:07 +02:00
Shannon 4bb89c1827 Fixes: U4-7090 Upgrade error with dates 2015-09-11 11:49:37 +02:00
Shannon Deminick 647c7a6ce0 Merge pull request #788 from dampee/fixes/U4-7087
U4-7087 make pageId getter public to be able to unittest
2015-09-10 19:09:23 +02:00
Damiaan 6d5a8c0db7 U4-7087 make pageId getter public to be able to unittest 2015-09-10 18:11:18 +02:00
Stephan 3314ab026b U4-7083 - filesystems, polish, fix, and back-compat 2015-09-10 14:20:21 +02:00
Stephan 8b612a1047 Use SaveFileController for stylesheets too 2015-09-10 14:19:56 +02:00
Stephan 28ecf79643 files editor xss 2015-09-10 11:20:01 +02:00
Stephan 8f78ba8b97 Revert "TEMP move stylesheet..." (pushed by mistake)
This reverts commit 7e1a11373b.
2015-09-10 11:14:23 +02:00
Stephan 94b0870a53 U4-6992 - fix db migrations (for real) 2015-09-10 10:47:30 +02:00
Stephan b9ff056b61 Revert "U4-6992 - fix db migrations"
This reverts commit 406d172169.
2015-09-10 10:19:28 +02:00
Stephan 7e1a11373b TEMP move stylesheet editing to filesystem 2015-09-10 10:12:25 +02:00
Stephan 200625aa3a SaveFileController can also save stylesheets (not used at the moment) 2015-09-10 10:04:55 +02:00
Shannon f1e52c5ad8 fixes failing test 2015-09-10 00:18:58 +02:00
Shannon 1217e64532 Adds another migration to fix corrupted data very old dbs 2015-09-10 00:16:35 +02:00
Shannon c454d022dc changes code migration to use the db paramet in the lambda 2015-09-09 23:30:14 +02:00
Shannon c4b8dcd88b Fixes: U4-7079 Upgrade issue from an older version 2015-09-09 23:20:46 +02:00
Shannon 3a62fb5900 fixes script editor xss 2015-09-09 22:00:29 +02:00
Shannon d127856726 fixes script editor xss 2015-09-09 21:52:52 +02:00
Shannon 02e9866398 Fixes regression issue with xss 2015-09-09 21:41:06 +02:00
Robert Foster 803ca677c1 Merge remote-tracking branch 'umbraco/dev-v7' into dev-v7 2015-09-10 02:07:34 +10:00
Stephan ed8c9daa8a Merge pull request #787 from vnbaaij/patch-2
Remove duplicated code in UmbracoApplicationBase
2015-09-09 16:37:10 +02:00
Stephan 59ec709c69 U4-7048 - more filesystems cleanup 2015-09-09 16:32:45 +02:00
Vincent Baaij 68fa22ba9b Update UmbracoApplicationBase.cs
There were two (almost identical) unhandled exception handlers in the code. Think it was caused  by merge conflict
2015-09-09 15:56:00 +02:00
Vincent Baaij e25886180a Merge remote-tracking branch 'upstream/dev-v7' into dev-v7 2015-09-09 13:57:35 +02:00
Stephan e8b2f3cd0b U4-7078 - empty recycle bin with content with public access rules 2015-09-09 13:02:21 +02:00
Shannon 74eb69534d Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-09-09 10:20:26 +02:00
Shannon 710bc7ed7c fixes minor potential xss issue with stylesheets editor 2015-09-09 10:19:57 +02:00
Shannon Deminick be17a6e186 Merge pull request #756 from haileqsr/fixes
U4-6955: Issue with stripping modifiers with no trailing characters
2015-09-08 19:03:16 +02:00
Stephan b7eb6303ec U4-7076 - fix xml cache corruption when publishing with children 2015-09-08 18:38:52 +02:00
Shannon 4d012ee1e1 Ensures that any stale old temp upload files are removed any time media is uploaded. 2015-09-08 18:33:43 +02:00
Stephan e3a73465f7 U4-7048 - fix tests 2015-09-08 18:10:46 +02:00
Stephan 6b5057b870 U4-7048 - more filesystems cleanup 2015-09-08 17:48:26 +02:00
Stephan e577648efd U4-7048 - refresh IFile instances from disk 2015-09-08 11:34:34 +02:00
Shannon b3664d2391 Fixes: U4-7059 SQL problem upgrading from 7.2.8 to 7.3.0 RC 2015-09-07 23:45:55 +02:00
Shannon 3dc4059036 fixes: U4-6941 Can't edit masterpages templates in 7.3.0 beta3 2015-09-07 20:28:56 +02:00
Shannon 6d6b2f72b6 fixes open redirect issue for schema less Urls 2015-09-07 20:15:10 +02:00
Stephan a542cf56d4 U4-7063 - Umbraco.TypedContent(ints) should not return nulls 2015-09-04 10:43:42 +02:00
Shannon 1fdb813d1d Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-09-03 16:49:14 +02:00
Shannon 6c3b63cf55 fixes issue with legacy dialogs not closing the nav 2015-09-03 16:32:25 +02:00
Stephan 6b195587c1 U4-7042 - fix root path for tests 2015-09-03 16:24:43 +02:00
Stephan d323b3c5c9 U4-7042 - use IFileService when editing scripts 2015-09-03 15:12:37 +02:00
Stephan b03d7884bb U4-7042 - bugfix the physical filesystem 2015-09-03 15:11:49 +02:00
Stephan 37e6e61eff Manual-merge pull request #750 dealing with U4-7060 2015-09-02 16:42:43 +02:00
Stephan 42e5b4e867 U4-7055 - encodeURIComponent queries in Examine dashboard 2015-09-02 15:19:37 +02:00
Stephan fc8c92e922 U4-7056 - sync BatchedDatabaseServerMessenger on all requests 2015-09-02 14:44:02 +02:00
Stephan 5d7cbd3477 U4-7038 - fix bugs + tests 2015-09-01 16:11:26 +02:00
Stephan 42b689867e U4-6992,U4-7046 - more fixes & tests 2015-09-01 15:46:58 +02:00
Sebastiaan Janssen d4fb28607d U4-7053 Update ImageProcessor dependency for core
#U4-7053 Fixed
2015-09-01 15:35:42 +02:00
Stephan dfbdf99bbc U4-7038 - IPublishedContentWithKey for medias 2015-09-01 15:00:31 +02:00
Stephan 7848ea5ec0 U4-7038 - IPublishedContentWithKey for contents, members 2015-09-01 15:00:27 +02:00
Claus 62afc06f56 Fixes: COU-162 Revision Name is Lowercase After Transfer
Removed lowercasing of urls routed through legacy iframe injection controller.
Regex for javascript handlers changed to ignore casing.
2015-09-01 14:30:30 +02:00
Stephan dbe2257b47 U4-7046 - fix DatabaseServerRegistrar issues 2015-09-01 13:16:58 +02:00
Shannon Deminick 2029bef6eb Merge pull request #771 from Jeavon/GetCropUrlFixes
Fix for U4-6995 Image Cropper does not use predefined crop ratio when only width or height is supplied
2015-09-01 11:29:45 +02:00
Shannon Deminick ffddb8faa0 Merge pull request #772 from danbramall/dev-v7
Rounds grid widths to 8 decimal places (like Bootstrap)
2015-09-01 11:13:13 +02:00
Shannon Deminick 456c89a5d5 Merge pull request #784 from umbraco/U4-6193
Fixes: U4-6193 Inserting an image into grid layout ignores alternativ…
2015-09-01 11:12:06 +02:00
Claus 37986f0ed5 Fixes: U4-6193 Inserting an image into grid layout ignores alternative text
AltText is used for alt tag instead of caption text which is used below the media.
Ensured the altText set in the dialog is saved to the value object.
2015-09-01 10:28:35 +02:00
Shannon b883c7cb11 Fixes: U4-6947 Don't ship unnecessary js files 2015-08-31 18:51:36 +02:00
Shannon 23a7e515f8 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-08-31 18:04:23 +02:00
Shannon 05e17e1c7f Fixes: U4-6973 Given custom permissions user can create, but cannot save 2015-08-31 18:04:13 +02:00
Stephan 829942dcf9 Bugfix MediaService 2015-08-31 13:17:50 +02:00
Shannon 9ce1ea66dc Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-08-28 15:26:22 +02:00
Shannon d6d611d381 updates the data type view to be consistent with the rest 2015-08-28 15:25:35 +02:00
Shannon Deminick 7020e948b8 Merge pull request #780 from umbraco/COU-191
Fixes: COU-191 Creating a revision gives a reference not set error (7.3)
2015-08-28 13:35:07 +02:00
Stephan b96511d9d4 U4-6992 - fix tests 2015-08-28 13:28:03 +02:00
Stephan ed5ca49755 U4-6992 - update interfaces 2015-08-28 13:28:00 +02:00
Claus c1352e2ad6 Fixes: COU-191 Creating a revision gives a reference not set error (7.3)
If the typeInstance could not be cast to LegacyDialogTask, trying to set additionalValues caused a null exception.
Inserted a null check and then cast to ITaskReturnUrl instead to get the returnUrl.
2015-08-28 13:01:23 +02:00
Shannon 1a6988c2ea Fixes double event firing 2015-08-27 20:10:19 +02:00
Shannon 0cca63e646 Fixes up some unit tests 2015-08-27 19:19:05 +02:00
Shannon 05aa2aeb75 refactors new IDomainService to return attempt+status and raise events using event messages. 2015-08-27 18:43:54 +02:00
Shannon e3cc107bfa Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-08-27 18:33:48 +02:00
Shannon 4a59c27793 Refactors new IPublicAccessService to return Attempt+Result so we know what happened, also ensures events are firing with msgs (events were not firing at all before). 2015-08-27 18:33:38 +02:00
Shannon Deminick abde63ebee Merge pull request #768 from abryukhov/patch-3
ru.xml - newest 'member' and 'help' sections
2015-08-27 15:17:44 +02:00
Shannon Deminick 346fb471da Merge pull request #773 from bjarnef/dev-v7-additional-translations
Additional translations for members
2015-08-27 15:14:54 +02:00
Shannon d4c5a1ee1c Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-08-27 14:56:51 +02:00
Shannon e3598b99a5 Ensures tempdata is set on our member controllers in the correct place and ensures that the RegisterModel doesn't explicitly set the RedirectUrl because we want it to be empty by default. 2015-08-27 14:56:42 +02:00
Stephan ab32732f26 U4-6992 - cannot change app url provider once resolution is frozen 2015-08-27 13:18:18 +02:00
Stephan 3949cfa736 U4-6932 - cleanup 2015-08-27 13:11:16 +02:00
Stephan 406d172169 U4-6992 - fix db migrations 2015-08-27 13:08:50 +02:00
Stephan b550b9f9d1 U4-6932 - bugfix bulk processing in list view 2015-08-26 18:30:05 +02:00
Shannon Deminick 211268f210 Merge pull request #779 from SiroccoHub/dev-v7
Update Japanese resource XML for UI
2015-08-26 15:09:39 +02:00
arichika taniguchi 348a3e6692 Merge remote-tracking branch 'umbraco/dev-v7' into dev-v7 2015-08-26 21:54:43 +09:00
arichika taniguchi c3c63ce0e3 Update Japanese resource XML for UI
Update Japanese resource XML for UI
2015-08-26 21:33:35 +09:00
Stephan 20d8656237 U4-6992 - fix server registration for new LB 2015-08-26 14:00:56 +02:00
Stephan e114cbeeaf Persistence - add support for locking repositories 2015-08-26 14:00:53 +02:00
Stephan a6a6edb9f2 PetaPoco - add support for transaction level 2015-08-26 14:00:50 +02:00
Shannon Deminick 5cfb4f5122 Merge pull request #777 from umbraco/U4-6997
Fixes: U4-6997 Updating Public Access settings on a node should trigg…
2015-08-25 13:31:39 +02:00
Stephan eec11c8e5f U4-6990 - fix task scheduler 2015-08-25 11:59:56 +02:00
Claus 438dedd1ab Fixes: U4-6997 Updating Public Access settings on a node should trigger a re-render of the tree.
For some reason the ReloadActionNode does not work in this case. Updated to using SyncTree which works.
2015-08-25 11:26:43 +02:00
Stephan a950acbaba U4-7002 - ToAppRelative is too greedy 2015-08-24 17:28:04 +02:00
Claus f44875d072 Prevent internal member groups from showing up in group list on member properties.
Prevent internal member groups from showing up in the member group tree listing.
2015-08-24 16:14:29 +02:00
bjarnef d7360e7a41 Additional translations for members
Addtional translations for members, help dialog and a few updated in
da.xml
2015-08-23 16:49:53 +02:00
Sebastiaan Janssen add2f57397 Bump version 2015-08-21 13:30:29 +02:00
Shannon cd3c17d73f Obsoletes AllowAll on MemberAuthorizeAttribute 2015-08-21 12:15:45 +02:00
Shannon fe6d783222 auths member controllers 2015-08-21 12:11:22 +02:00
Shannon fc8b0f1822 Fixes: U4-6934 v7.3.0-beta3 ListView sorting by updateDate throws exception 2015-08-21 12:02:51 +02:00
Dan Bramall bd56117c80 Rounds grid widths to 8 decimal places (like Bootstrap) to fix U4-6569 and U4-6357. 2015-08-20 22:08:31 +01:00
Shannon 6102c970c8 ensures single tab displays show tab 2015-08-20 19:10:03 +02:00
Shannon 29903058a9 Fixes: U4-6937 Update all web.configs in all subfolders to use MVC4 / Razor 3, U4-6938 While upgrading, delete dlls that shouldn't be there after upgrade 2015-08-20 18:41:39 +02:00
Shannon b3940dea1b Fixes: U4-6982 TAG Group not working as it's expected, when there's more than 2 sets of tag group 2015-08-20 16:52:07 +02:00
Shannon 3dac630d05 Fixes: U4-6998 User language drop down is incorrect when default language is used 2015-08-20 16:07:46 +02:00
Shannon 10108d75b8 Fixes: U4-6953 DatePicker (with time?) seems to be misbehaving since 7.2.8 in Firefox 2015-08-20 15:22:10 +02:00
Shannon 24cb64579b make sure the time is not there for a non time picker when the pre-value is empty. 2015-08-20 12:48:33 +02:00
Shannon 86239cc777 fixes date time picker if the format is cleared from pre-values, it will revert to default. 2015-08-20 12:45:42 +02:00
Shannon 685aea1728 Fixes: U4-6879 Validation issues when creating new content and cancelling save event. 2015-08-20 11:50:32 +02:00
Jeavon Leopold 8ea99b9463 Adjust so that first crop isn't used for ratio when only a width or height parameter is passed into GetCropUrl 2015-08-20 10:22:15 +01:00
Jeavon Leopold bc20a48570 Tiny Stylecop bracket adjustment 2015-08-20 09:34:48 +01:00
Jeavon Leopold a17865683c Variable renaming 2015-08-20 09:33:12 +01:00
Jeavon Leopold 6f76ee384c Added some extra GetCropUrl tests as you can never have too many 2015-08-20 09:31:20 +01:00
Shannon eb4e041682 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-08-20 10:25:53 +02:00
Shannon 477aa754b3 uses non deprected methods 2015-08-20 10:14:07 +02:00
Shannon Deminick 48bff0aa6c Merge pull request #770 from bjarnef/dev-v7-missing-danish-translations
Add missing Danish translations
2015-08-20 10:12:26 +02:00
Bjarne Fyrstenborg 4ea9fec9e2 Add missing Danish translations
Added missing keys in da.xml and removed some duplicate keys.
2015-08-20 09:56:16 +02:00
Alexander Bryukhov 5167ba7aee ru.xml - newest 'member' and 'help' sections 2015-08-20 09:04:52 +06:00
Sebastiaan Janssen f3a965841b U4-6043 Error parsing package.manifest value Path line 0 position 0
Added a unit test and updated the logic as it was doing the wrong thing
#U4-6043 Fixed
2015-08-19 19:11:20 +02:00
Sebastiaan Janssen 08ddb5f4c4 Update NuGet dependency for Examine 2015-08-19 18:47:27 +02:00
Sebastiaan Janssen 4ec63ffd0d U4-6939 'html code' button is missing in the Rich Text Editor]
#U4-6939 Fixed
2015-08-19 18:40:04 +02:00
Sebastiaan Janssen 4cb3e82972 U4-6926 HTML tag in nodeName renders as HTML in tree
#U4-6926 Fixed
2015-08-19 18:33:11 +02:00
Shannon 0a20741f39 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-08-19 18:22:26 +02:00
Shannon 4575748f16 adds TODO and formatting 2015-08-19 18:22:06 +02:00
Sebastiaan Janssen 028ee831b8 U4-6043 Error parsing package.manifest value Path line 0 position 0
#U4-6043 Fixed
2015-08-19 18:11:18 +02:00
Jeavon Leopold 3595dd3339 Adding checks for predefined crops that are still set to default and where a specific resize parameter has been passed into GetCropUrl so that output crop is in same ratio as the predefined crop 2015-08-19 16:54:03 +01:00
Sebastiaan Janssen 54981cd57c Merge pull request #764 from Aaen/U4-6977
U4-6977: Updated the Our screenshot to show off the new design
2015-08-19 16:02:10 +02:00
Shannon Deminick 0aab8cacaa Merge pull request #767 from leekelleher/U4-6986
U4-6986 PublishedContentExtensions.FirstChild() throws exception
2015-08-19 15:41:15 +02:00
leekelleher 15b4d33e00 U4-6986 PublishedContentExtensions.FirstChild() throws exception
Changes the return value to use `.FirstOrDefault()` instead of `.First()`.
Includes unit-test.
2015-08-19 13:57:58 +01:00
Shannon Deminick 367ba5cddf Merge pull request #766 from bjarnef/dev-v7-minor-translations
Localize text in help dialog
2015-08-19 10:40:37 +02:00
Dennis Aaen ff64efbcdf Fix: Corrected the height of the image of the new ourumbraco 2015-08-19 10:00:39 +02:00
bjarnef 5bc0c499d8 Localize text in help dialog
Add localization for text in help dialog, create and delete dialogs and
some minor parts of the member area.
2015-08-19 02:03:54 +02:00
Dennis Aaen f667318b58 U4-6977: Updated the Our screenshot to show off the new design 2015-08-18 15:14:51 +02:00
Shannon 87c9d15ad5 removes autocomplete="off" from login 2015-08-18 10:44:45 +02:00
Vincent Baaij d5a41d41e9 Merge remote-tracking branch 'upstream/dev-v7' into dev-v7 2015-08-18 09:14:11 +02:00
Shannon 127736d188 updates to latest examine 2015-08-13 15:30:28 +02:00
Shannon 139ab8d4df Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-08-13 15:19:26 +02:00
Shannon 4abb8035b8 Changes the shutdown time for the logger to be 1 second 2015-08-13 15:19:16 +02:00
Shannon 0ca1807d64 Adds DelegateExtensions + Tests which is used for retrying and is used with the Examine Index Sync 2015-08-13 15:19:04 +02:00
Shannon Deminick 5ae90d201c Merge pull request #762 from Jeavon/RefreshByJson
Publicise methods and subclasses in MediaCacheRefresher
2015-08-13 14:59:23 +02:00
Jeavon Leopold 6c416009d7 Make DeserializeFromJsonPayload in MediaCacheRefresher and associated sub classes public so that it's possible to easily retrieve the data in custom code 2015-08-13 13:52:21 +01:00
Sebastiaan Janssen 50da9bcb50 Should help with U4-4049 Some images fail when uploading multiple media files 2015-08-13 12:26:00 +02:00
Shannon 9e6a2d8a7c Fixing: U4-6942 During upgrade MUST make sure that the new Property Type GUIDs are consistent ... just needs some testing now; 2015-08-11 15:56:48 +02:00
Shannon cfb84cae44 removes license txt that doesn't make any sense. 2015-08-11 12:23:15 +02:00
Shannon 4239833713 updates NotificationService 2015-08-11 12:12:34 +02:00
Shannon 4fa1a3948e updates how versions are sorted before being sent. 2015-08-11 11:52:06 +02:00
Shannon Deminick 1b78e854f0 Merge pull request #759 from umbraco/U4-5180
Fix: U4-5180 Notifications email highlighting is incorrect. Ensured t…
2015-08-11 11:50:57 +02:00
Shannon Deminick c62a2362d2 Merge pull request #761 from umbraco/U4-6808
U4-6808 Bug in umbRequestHelper service causing exceptions to end up …
2015-08-11 11:48:01 +02:00
Shannon Deminick eb1855fcb7 Merge pull request #760 from umbraco/U4-6798
U4-6798 Rollback Dialog Displays Incorrect Author.
2015-08-11 11:44:10 +02:00
Shannon d4863239cd adds null check to query builder 2015-08-11 10:40:18 +02:00
Shannon 4b7ddb9c15 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-08-10 18:06:50 +02:00
Shannon e5bb35b335 Updates to latest Examine 2015-08-10 18:06:23 +02:00
Claus 7eabd09b3a Ignoring test causing CI to fail occasionally. 2015-08-10 15:11:08 +02:00
Shannon 087f0c0ede updates internals visible for courier. 2015-08-10 13:09:48 +02:00
Shannon db9d6d9109 Makes the getter for InternalSearcher lazy, fixes up the LocalTempStorageDirectory so that it properly deals with both directories the same, including lock files. Fixes up the LocalTempStorageIndexer with a ton more error checks and retry attempts to acquire locks if it cannot do so during initialization. This has proven to work seamlessly with my load tests now including the functionality for Sync. Need to test LocalOnly with the tests now too. Also, this should work if an index gets corrupted in temp storage for some odd reason (shouldn't do now btw). More testing required but this so far is showing to be much more stable especially with the new changes in Examine core. 2015-08-07 00:06:56 +02:00
Shannon 700e180522 Updates ensuring db connection so that it's not waiting arbitrarily to exit. 2015-08-07 00:02:35 +02:00
Claus 8584997f5f U4-6808 Bug in umbRequestHelper service causing exceptions to end up in backoffice. 2015-08-06 16:03:12 +02:00
Claus 4710b3b641 U4-6798 Rollback Dialog Displays Incorrect Author. 2015-08-06 14:53:56 +02:00
Claus 227e2489c1 Fix: U4-5180 Notifications email highlighting is incorrect. Ensured the versions of content used in comparison is sorted correctly so the highlighting is based on previous version and not the base version of the content. 2015-08-06 10:32:41 +02:00
Shannon 91a5b19378 Fixes: U4-6891 Can't get to the "Rebuild" button when Lucene index folder is empty as well as how the polling works. 2015-08-05 18:32:59 +02:00
Shannon 4c20441c4e Fixes: U4-6915 Txt Starter Kit install fails on 7.3.0 beta3 2015-08-05 17:17:49 +02:00
Shannon edfe1e6d54 Fixes: U4-2793 There doesn't seem to be a way to un-assign a template from a content item with the new API. Fixes issue with content type cache clearing when templates are deleted. Fixes the legacy packager to use the new template service to delete templates which does it in a much more graceful way, otherwise we need to do a try catch. 2015-08-05 16:30:21 +02:00
Shannon 7869f77704 Fixes up deleting templates, fixes up legacy template code to ensure things are saved when they are updated 2015-08-05 15:00:28 +02:00
Shannon 34fd405bca Downgrades AutoMapper to the version before the assembly was signed (breaking!), we're stuck on < 3.1 because Automapper decided to sign an assembly in a minor version, nothing we can do till v8 2015-08-05 13:35:42 +02:00
Shannon f03ee9f908 Fixes routing tests and reverts to simplified routing logic based on the Language ISO code returned from the IDomain object. 2015-08-05 12:10:13 +02:00
Shannon b053638204 Fixes: U4-6866 getDescendants of template, N+1 issues for template repo (U4-5618 Repository level performance enhancements - remaining N+1 queries) 2015-08-05 11:50:20 +02:00
Shannon d790194682 Fixes: U4-6918 App_Plugins folder needs to be created properly on app start 2015-08-04 17:36:03 +02:00
Shannon 3fec2b9756 uses the LanguageIsoCode returned from the domain object during routing so it doesn't need to be re-looked up. 2015-08-04 15:53:08 +02:00
Shannon bc7a31d791 Updates IDomain to include language ISO code so we can save a lookup 2015-08-04 15:42:44 +02:00
Shannon 05d84c6673 updates the operation status to return the event messages used when raising events 2015-08-04 14:52:34 +02:00
Shannon f6645e3928 Fixes: U4-6917 ContentTypeService.GetContentType( GUID) throws exception 2015-08-04 14:05:57 +02:00
Shannon 50b00b12b0 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-08-04 13:23:57 +02:00
Shannon 569371ffff Fixes resize panel U4-5308 Umbraco 7 Content Tree Width not resizable or scrollable 2015-08-04 13:22:22 +02:00
Per Ploug Krogslund f7b72b225a Grid: auto-insert layout, row and editors if only 1 is available
When the grid loads and only one layout is available, it will be
inserted automatically.

When a row is inserted and a cell only has a single editor allowed, it
will be inserted.

These are chained so when an empty grid editor is loaded it will
preload layout + controllers if only one option is possible.

Also fixed the cog icon being visible, even without settings available

Adjusted a bit of styling for TinyMCE editors as they are invisible if
no focus + content entered.
2015-08-04 12:25:33 +02:00
Shannon d1bed54cf1 Fixes tabdrop memory leak U4-6907 Bootstrap tab drop has memory leaks, fixes tab/header to use the correct bootstrap tab api, simplifies the header code dramatically and speeds up processing. Fixes mem leak with delayedMouseLeave.directive 2015-08-04 11:59:57 +02:00
Shannon ba868887d4 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-08-03 12:50:18 +02:00
Shannon 3a7853dcbe makes sure the bottom bar buttons are moved when resizing the left pane and that their position stays relative during tab changing. 2015-08-02 11:32:43 +02:00
Shannon 60af7deacd ensures more unbinding is happening 2015-08-02 11:32:14 +02:00
Shannon 49bc3151b0 Fixes the detectfold processing and tab changing events, creates new umbTabs directive to manage the bootstrap tab changing events so other directives can easily subscribe to the changes. updats all editors to use them. 2015-08-02 11:13:26 +02:00
Shannon d6b7bae38a reverts tabs back to use only bootstrap tabs (we can change that at a later date now that we have the code), have fixed up a lot of the detect-fold logic so that it doesn't run an insane amount of calculations, however now we need to properly fix the bootstrap tab event bindings. 2015-08-01 17:33:55 +02:00
Sebastiaan Janssen 715cc22722 Revert "Correct trees.config"
This reverts commit 88b23e09b6.
2015-08-01 15:11:47 +02:00
Sebastiaan Janssen 88b23e09b6 Correct trees.config 2015-08-01 15:05:01 +02:00
Hai Le 4697f2ecad Bug fix: Issue with stripping modifiers with no trailing characters after placeholder
When using a modifier with no trailing characters after the placeholder eg. setting a color style with #{0}.  The end selection is set to 0 resulting in the value also being stripped
2015-08-01 15:54:00 +10:00
Shannon 612484c0b6 ensures more jquery event listeners are unbound 2015-07-31 12:52:29 +02:00
Shannon 0e4974babe Creates windowResizeListener directive... so there's only a single listener for this and things can register/unregister as required from it and the callbacks will always execute in a $digest. Updates the detect-fold and navResize to use this, it is much snappier now with less overhead. 2015-07-31 12:34:02 +02:00
Sebastiaan Janssen 5fdd7d8bd6 Merge branch 'bjarnef-dev-v7-U4-6898' into dev-v7 2015-07-31 11:29:58 +02:00
Sebastiaan Janssen b5c87ccfb7 Merge branch 'dev-v7-U4-6898' of https://github.com/bjarnef/Umbraco-CMS into bjarnef-dev-v7-U4-6898 2015-07-31 11:29:51 +02:00
Sebastiaan Janssen 2efe6ae7a4 Merge pull request #754 from bjarnef/dev-v7-U4-6179
Highlight recycle bin tree node
2015-07-31 11:20:44 +02:00
Shannon 5775984730 have new tab implementation working with backwards compat with bootstrap tabs. For our own editors, we will use the new tabs, this gives us more control and should be a bit quicker, perhaps in v8 we can remove bootstrap tabs entirely. 2015-07-31 10:50:33 +02:00
Sebastiaan Janssen cbab70fd7c Should finally fix this test that apparently relies on super strict timings 2015-07-30 19:28:33 +02:00
Shannon cfa2a30006 Changes how tabs work ... to no longer have to rely on bootstrap tabs and the hacky timing work-arounds, tabs are actually quite easy and now give us much more control.
Have made this change as backwards compatable (some things are deprecated though). Will update the other editors now.
2015-07-30 18:44:15 +02:00
bjarnef 09a3b0d155 Highlight recycle bin tree node
Ensure recycle bin tree node is highlighted when chosen.
2015-07-30 18:36:22 +02:00
Sebastiaan Janssen ca9cd77ded Fix log type 2015-07-30 18:14:29 +02:00
Sebastiaan Janssen 812601217a Merge branch 'pete2' into dev-v7 2015-07-30 18:03:09 +02:00
Pete Duncanson 3a6ec5ef0c Add a log message to stop database start up code from swallowing exception messages, now stash them in the logs to give developers a chance ;) 2015-07-30 18:01:24 +02:00
Rasmus Eeg Møller 4197a7654f U4-6902 - Changed from internal to public
Just like the ContentFinderResolver.cs
2015-07-30 17:59:18 +02:00
Sebastiaan Janssen 3133014650 Removes more references to FixedDisplayModes 2015-07-30 17:39:07 +02:00
Sebastiaan Janssen 4bce945946 Remove stray FixedDisplayModes reference 2015-07-30 17:19:43 +02:00
Sebastiaan Janssen 2d15c9c01c Use the new views config transform 2015-07-30 17:08:40 +02:00
Sebastiaan Janssen 58e648828b Fix web.config and adds a transform for NuGet 2015-07-30 17:08:40 +02:00
Sebastiaan Janssen d87b268a40 Update to MVC5 2015-07-30 17:08:39 +02:00
bjarnef 5174645059 Make tree nodes consistent
Make tree nodes have same position from the left regardless of the arrow
to expand the children.
2015-07-30 16:04:54 +02:00
Shannon e4286bc35b Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-07-30 15:13:51 +02:00
Shannon cf4d13da31 fixes backward compat issue 2015-07-30 15:13:39 +02:00
Shannon Deminick a89b064e29 Merge pull request #751 from rasmuseeg/patch-1
U4-6902 - Changed from internal to public
2015-07-30 15:04:23 +02:00
Rasmus Eeg Møller 1e41973eb5 U4-6902 - Changed from internal to public
Just like the ContentFinderResolver.cs
2015-07-30 14:54:10 +02:00
Shannon b4e496fceb Fixes backwards compat issue in 7.3 with TagQuery property on UmbracoHelper. see: http://issues.umbraco.org/issue/U4-6899 2015-07-30 14:03:17 +02:00
Shannon bb94fc7d71 Ensures notifications are shown for drag/drop uploads 2015-07-30 11:35:00 +02:00
Shannon 959378c456 Fixes file cleanup with blue imp uploads 2015-07-29 16:14:09 +02:00
Shannon 787e128d5c wires up event messages for media editor and tree (haven't done the drag/drop media upload though) 2015-07-29 16:00:06 +02:00
Shannon b7912a7be7 fixes build 2015-07-29 15:22:22 +02:00
Shannon 0bc7aa6ba7 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-07-29 15:18:34 +02:00
Shannon 367da39bbb wires up UI to show notifications for delete cancellation 2015-07-29 15:18:23 +02:00
Shannon 6d8ffb903f Ensures events for deleting, trashing and unpublishing are done using the event messages, updates UI to support showing these messages in the list view, Since we cannot change the
method results on a service, we've created a new temporary service that we will explicitly implement with an extension method to get it. This is temporary until v8 where we will just replace
the original methods on the service with these methods and then remove this class.
2015-07-29 15:12:12 +02:00
Shannon 0e992f897f Removes standalone classes, we can replace these with what we've got in the LinqPad provider 2015-07-29 15:07:55 +02:00
Shannon 3f19878c18 changes member controller to use long overload 2015-07-29 15:07:32 +02:00
Stephan 308f64a7e2 doc BatchedDatabaseServerMessenger startup 2015-07-29 11:22:12 +02:00
Shannon 1eab92b299 updates prog bars in examine mgt dashboard to be like other umb prog bars 2015-07-27 18:58:14 +02:00
Shannon 7a8b8f138f Fixes list view search debounce and adds a ui indication that search is in progress. 2015-07-27 18:48:41 +02:00
Shannon 926ea54c39 Developers can cancel an event with the CancelOperation method of the event with a custom message which will be used in place of the normal default cancellation message 2015-07-27 18:04:20 +02:00
Shannon b44494a093 Works on: U4-5308 Umbraco 7 Content Tree Width not resizable or scrollable 2015-07-27 16:38:39 +02:00
Shannon a6094a82cb Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-07-27 16:16:22 +02:00
Shannon 07f58d191b fixes js error 2015-07-27 16:16:10 +02:00
Sebastiaan Janssen 51eae92a5a Update json.net everywhere 2015-07-27 16:11:18 +02:00
Sebastiaan Janssen 0be3f3fb76 Oops, wrong path! Come on msbuild: just intuit what I wanted to do! :) 2015-07-27 16:08:28 +02:00
Sebastiaan Janssen 9f000eb90c Updates build to include and exclude correct files, syncs web.config and syncs dependency versions between core and nuget pkg 2015-07-27 15:52:10 +02:00
Sebastiaan Janssen b7926bfa19 Cookie monster 2015-07-27 15:52:10 +02:00
Shannon fa76ffa5ca workaround for upgrade auth issue 2015-07-27 15:48:14 +02:00
Shannon Deminick 5ed8ade862 Merge pull request #748 from mattbrailsford/dev-v7-increase-tree-icon-size
Increased tree icon font size for better visibility
2015-07-27 12:55:13 +02:00
Shannon 7a31ce16e2 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-07-27 12:53:20 +02:00
Shannon 16c9ca9e4b Refactors IDomain model, simplifies it so that it doesn't contain references, simplifies the domain repository to no longer require lookups of content and languages, updates all other code referencing IDomain and now if a language lookup is required it is made when appropriate. 2015-07-27 12:53:09 +02:00
Shannon 00c13b9939 fixes tests 2015-07-27 12:03:38 +02:00
Shannon Deminick dbced8bef7 Merge pull request #749 from AndyButland/u4-6856
U4-6856 - fixed issue that prevents username update...
2015-07-27 10:47:54 +02:00
AndyButland 9552922795 Fixed issue that prevents username update if other core membership provider properties are updated at the same time
Fixed typo in previous commit
2015-07-27 10:33:37 +02:00
mattbrailsford de53c8886b Increased to 19 pixels based on feedback 2015-07-25 09:32:54 +01:00
mattbrailsford 3672d13215 Increased font tree icon font size to 17px for better visibility 2015-07-24 21:36:24 +01:00
Shannon 5ab036e9d3 missing column creation in migration script. 2015-07-24 18:58:08 +02:00
Shannon accf52ca38 if user has explicitly opted out of index rebuild on startup, we must ensure that the database server messenger doesn't rebuild them either. 2015-07-24 18:52:04 +02:00
Shannon 51d14a7a01 Updates all calls to GetAll(params int[]) that potentially could have looked up all data un-intentionally - cause for U4-6869 contentService + domainService is slow outside Umbraco App Context 2015-07-24 18:36:07 +02:00
Shannon db0defb93f Ensures that indexes aren't double rebuilt on startup which can occur if there are no indexes and the DatabaseServerMessenger hasn't sync'd anything 2015-07-24 18:07:20 +02:00
Shannon 1fca0d22bf Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-07-24 17:34:28 +02:00
Shannon 7d7e92432e Fixes how the BatchedDatabaseServerMessenger startsup/boots 2015-07-24 17:34:06 +02:00
Sebastiaan Janssen 86ad3f6b05 Makes sure that R# doesn't suggest C#6 features 2015-07-24 17:25:52 +02:00
TimoPerplex 68ff77f5b6 This commit removes the hardcoded .jpg thumbnails
This commit removes the hardcoded .jpg thumbnails and uses the image
original extension to create the thumbnail.
Because we now use the original extension the image is no longer masked
as another (extension is .jpg but the file is actually a .png)

This fixes issues with Internet Explorer used in combination with the
no-sniff header.
Ref topic:
https://our.umbraco.org/forum/umbraco-7/using-umbraco-7/66788-adding-nosniff-header-breaks-png-images-in-internet-explorer
2015-07-24 16:27:26 +02:00
TimoPerplex 47e7469d65 Merge remote-tracking branch 'upstream/dev-v7' into dev-v7 2015-07-24 16:18:58 +02:00
Shannon 615ab564e5 fixes build 2015-07-24 12:57:01 +02:00
Shannon ee36a46d51 fixes tests 2015-07-24 12:54:59 +02:00
Shannon 293568228c Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-07-24 12:13:31 +02:00
Shannon 8b86276011 Ensures event messages are passed to Saved events for content/media 2015-07-24 12:07:32 +02:00
Shannon 9406675bf2 Ensures the Saving methods on the media service are wired up with the event messages, obsoletes the hacked WasCancelled internal property on Entity. 2015-07-24 11:52:30 +02:00
Shannon aa08a4ca37 Gets the messages being pumped out to the UI. Updates the ContentService and MediaServices to have a SaveWithStatus in order to determine the response, we'll need to update most of the methods to also have this OperationStatus. Now messages can be added to the UI for Saving & publishing for media and content services, we'll need to update more to support everything. 2015-07-24 11:44:09 +02:00
Sebastiaan Janssen abf8777b0a U4-6867 UmbracoLog wrongfully logs unPublish event with user ID 0
#U4-6867 Fixed Assignee: Unassigned
2015-07-24 11:02:13 +02:00
Shannon a6a2b02cd8 working on U4-5927 - this extends the base event class to have EventMessages which event consumers can add to, the trick is that there is a factory for these EventMessages, in a web context, the factory is a request based factory so that during a request all instances of the EventMessages are the same instance. All services then accept an instance of IEventMessagesFactory which they can then use when raising events. We'll then use this to send messages to the UI. Not sure if i should make this a resolver yet or not. Still a WIP!! 2015-07-23 20:04:40 +02:00
Shannon 445dff7c5e publicizes the ctor for PetaPocoUnitOfWorkProvider 2015-07-23 18:30:20 +02:00
Shannon 37076fa4eb Completes: U4-6871 CoreBootManager.CreateApplicationContext & CoreBootManager.CreateApplicationCache returns the instance instead of setting the singleton 2015-07-23 18:26:56 +02:00
Shannon 8c871a6172 publicizes a ctor for the ServiceContext which will allow you to pass in a custom repository factory. 2015-07-23 18:13:43 +02:00
Shannon Deminick 3e42358f2a Merge pull request #744 from timothyleerussell/dev-v7-umbracohelper-componentRender
Update Field() methods in UmbracoHelper
2015-07-23 18:05:01 +02:00
Shannon 9bdb91b3c0 latest examine 2015-07-23 18:03:44 +02:00
Shannon 7f1f090a10 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-07-23 17:57:08 +02:00
Shannon 5c91c204fa removes unneeded class 2015-07-23 17:57:02 +02:00
Shannon 11c7955b1e Lazily serializes the member data when required instead of all at once, this will save memory since the xml will only be created when it's required. 2015-07-23 17:56:29 +02:00
Shannon Deminick 72d4457a24 Merge pull request #745 from KevinJump/dev-v7-PackageMacros
Package Service - Case Insensitive Macro parameters
2015-07-23 15:43:19 +02:00
Shannon 9606cab81e Fixes: U4-4669 Required checkbox is overruled by regex on document type 2015-07-23 14:44:02 +02:00
Shannon 7cd47114e0 Fixes: U4-6771 Sorting editorstyles is not possible 2015-07-23 14:27:54 +02:00
Shannon cd578b7b19 Fixes: U4-6770 When creating editorstyles: No stylesheet property found with name when creating headingstyles with capitals 2015-07-23 13:18:53 +02:00
Shannon f3d9b4a9f3 Fixes BatchedDatabaseServerMessenger - it implements IApplicationEventHandler to control it's bootup process which ensures it doesn't attempt to boot or bind to events if the app is not configured or installing. This was preventing upgrading to 7.3 2015-07-23 12:28:17 +02:00
Shannon b0fb892b16 Fixes: U4-6736 Log "logout" from Umbraco and also ensures logging is occuring on timeout, logout, login all with Identity stuff. 2015-07-23 12:03:50 +02:00
Shannon 66ca4e48bb Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-07-22 18:25:21 +02:00
Shannon 96cd4daca5 Fixes how modelstate and viewdata get populated into the PartialViewMacroController and in turn get populated into the viewresult, privatize's EnsureViewObjectDataOnResult so that it's not used by accident elsewhere 2015-07-22 18:25:08 +02:00
Stephan a1f08ad1b4 Fix build 2015-07-22 13:11:39 +02:00
Shannon 44c3140b20 Updates CoreBootManager to be provided a logger which decouples it a little bit, updates CoreBootManagerTests to ensure resolution is reset on teardown, updates the ApplicationEventsResolver inner resolver to not use obsolete ctor's 2015-07-22 12:44:29 +02:00
Shannon 7fac2b811b Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-07-22 12:10:33 +02:00
Shannon 201512d5f2 Fixes :U4-6858 add localizationService.GetDictionaryItemDescendants, also obsoletes FlattenList since if used incorrectly could cause a flood of SQL calls, adds some tests to verify the output of SelectRecursive is in the same order and updates anything using FlattenList to SelectRecursive. Updates the Language repository to use GetAll wherever possible so all languages are simply cached, this means there less overall cache and less lookups. Updates the Dictionary repository to have less N+1 lookups when building the entity from the DTO by just looking up all languages instead of one at a time. Adds tests for getting descendants for dictionary items. 2015-07-22 12:10:21 +02:00
Kevin Jump c1f5d8392d Package Service - Case Insensitive Macro parameters
Make the check for existing alias values case Insensitive - stops the
SQL error you get if you try to add the same parameter twice.
2015-07-22 10:53:08 +01:00
Timothy Lee Russell 1aaeb75e0e Update Field() methods in UmbracoHelper
Update Field() methods in UmbracoHelper to use the existing lazy
instantiation of ComponentRenderer to fix a problem where
_componentRenderer is not provided by the default constructor.
2015-07-21 14:58:34 -07:00
Sebastiaan Janssen 0bbe1c6cdc U4-6721 Error when submitting Macros, Collection was modified; enumeration operation may not execute. (after project has been updated to MVC5)
#U4-6721 In Progress
2015-07-21 19:35:00 +02:00
Shannon b78f75775d Fixes: U4-6859 get membertype by key 2015-07-21 16:55:27 +02:00
Sebastiaan Janssen 34f44b02a2 U4-6721 Error when submitting Macros, Collection was modified; enumeration operation may not execute. (after project has been updated to MVC5)
#U4-6721 In Progress
2015-07-21 15:55:39 +02:00
Shannon 93c1321b99 fixes potential null ref when accessing the TagQuery property of UmbracoHelper 2015-07-20 15:37:40 +02:00
Shannon 73cb9ab3e5 updates core boot manager tests 2015-07-20 15:30:58 +02:00
Shannon e402768212 simplifies methods to just be GetTaggedEntityByKey, GetTaggedEntityById 2015-07-20 13:49:46 +02:00
Shannon 6095f0233e Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-07-20 13:45:47 +02:00
Shannon 9b1f4ecff9 Fixes: U4-6855 ITag does not expose the property it belongs to 2015-07-20 13:45:31 +02:00
Sebastiaan Janssen 3c884b583e U4-6762 7.3 beta: Could not load file or assembly 'System.Web.Mvc, Version=4.0.0.0
#U4-6762 Fixed
2015-07-20 11:30:41 +02:00
Sebastiaan Janssen ea653cbd18 U4-6762 7.3 beta: Could not load file or assembly 'System.Web.Mvc, Version=4.0.0.0
#U4-6762 Fixed
2015-07-20 11:30:04 +02:00
Stephan b2679f3f17 Bugfix 2015-07-19 13:08:29 +02:00
Shannon 231a7fa7c4 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-07-17 15:47:44 +02:00
Stephan a3936d69cb Revert rogue umbracoSettings.config changes (dbaf7c0) 2015-07-17 14:20:05 +02:00
Shannon a273584cc8 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-07-17 11:09:48 +02:00
Shannon 62c4e404b3 enabled db server registrar by default unless the legacy dist calls is enabled. 2015-07-17 11:09:31 +02:00
Stephan d1b6b5c76f DatabaseServerMessenger - cleanup 2015-07-17 10:48:09 +02:00
Shannon b5cf3e9f59 Fixes: U4-6844 Potential perf issue with new Domain service 2015-07-16 18:09:56 +02:00
Shannon d97c772c70 Fixes: U4-6831 Add {machinename} to ExamineIndex.config by default 2015-07-16 17:19:49 +02:00
Shannon d5460068d4 Merge remote-tracking branch 'origin/master-v7' into dev-v7
Conflicts:
	build/UmbracoVersion.txt
	src/SolutionInfo.cs
	src/Umbraco.Core/Configuration/UmbracoVersion.cs
	src/Umbraco.Core/Macros/MacroTagParser.cs
	src/Umbraco.Core/packages.config
	src/Umbraco.Tests/Controllers/BackOfficeControllerUnitTests.cs
	src/Umbraco.Tests/Macros/MacroParserTests.cs
	src/Umbraco.Tests/Strings/StringExtensionsTests.cs
	src/Umbraco.Tests/Umbraco.Tests.csproj
	src/Umbraco.Web.UI.Client/src/common/services/macro.service.js
	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
	src/Umbraco.Web/Editors/BackOfficeController.cs
	src/umbraco.cms/Actions/Action.cs
2015-07-16 17:04:25 +02:00
Shannon 5ac34a700f fixes get file checks in FileSystemTree when the folder doesn't exist 2015-07-16 16:58:13 +02:00
Shannon a40762f09d excludes folders from the UI project that we don't need to ship with. 2015-07-16 16:29:36 +02:00
Shannon 0f00eaed78 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-07-16 15:59:22 +02:00
Shannon 01653f60f9 Fixes: U4-6756 Don't ship or generate unnecessary folders 2015-07-16 15:59:08 +02:00
Shannon d8b6f1fef1 Fixes database server messenger to not bind to events if we're not installed, otherwise we get ysods (not sure if there was a typo there or not, but should defo not boot when not installed) 2015-07-16 15:52:22 +02:00
Sebastiaan Janssen 1ecd0af268 New installer image 2015-07-16 15:49:18 +02:00
Shannon c2dc896fce working on: U4-6756 Don't ship or generate unnecessary folders 2015-07-16 15:29:46 +02:00
Sebastiaan Janssen 2f714d0b3e Update MySql.Data dependency 2015-07-16 13:59:19 +02:00
Shannon 0bbcaca067 Add unique id for TextSearch / LuceneSearch
Add unique id for TextSearch / LuceneSearch for each searcher.
2015-07-16 13:52:52 +02:00
Sebastiaan Janssen 55d3d8437a Update number of tattoos 2015-07-16 12:44:10 +02:00
Shannon 9e2ab8507f Fixes c# macro tag parser - it needs to parse all macros contained in the entire string, the regex options were wrong meaning if you tried to add multiple macros without parameters it would fail, have added a unit test for that. 2015-07-16 12:31:07 +02:00
Shannon 6ee6c77d6e bumps version 2015-07-16 11:10:36 +02:00
Shannon 9b5d4e5b08 Moves some logic into StringExtensions, updates tests, adds other tests 2015-07-16 10:40:43 +02:00
Shannon 49f8b530b7 FIX U4-6687: Adding tests for RTE Macro parsing when macroAlias is the first attribute and a new test for multiple Macros of various format. 2015-07-16 09:51:04 +02:00
Shannon 56176d0e36 Fix U4-6687: Can't add multiple instances of a macro in RTE in 7.2.6 without ruining RTE formatting
We found that the MacroTagParser.cs was being greedy and matching all UMBRACO_MACRO tags instead of getting them individually.

macro.service.js was updated for posterity purposes to match the regex in the .cs side, but testing showed that it was functioning as expected without this change.
2015-07-16 09:50:49 +02:00
Shannon ab41c900da Quick stab at testing a method from BackofficeController for U4-6843
* Move GetLegacyActionJs logic into an internal static method so we can test
* Change LegacyJsActionType to internal for testing
* Add tests to verify method can determine between js paths and js blocks, so as not to pass js code into IOHelper.ResolveUrl

Conflicts:
	src/Umbraco.Tests/Umbraco.Tests.csproj
2015-07-16 09:48:04 +02:00
Shannon Deminick 92e0e5e570 Merge pull request #743 from tomfulton/tests-u4-6843
Quick stab at testing a method from BackofficeController for U4-6843
2015-07-16 09:47:11 +02:00
Shannon 90645e5e85 Check for ~/ before using IOHelper.ResolveUrl
An "relative virtual path" exception can be thrown by a path like "umbraco/test.js"
2015-07-16 09:45:18 +02:00
Shannon 872c345ac9 Fix backoffice breaking when Actions use code in their JsSource - U4-6843
This reverts/refactors this pull request: https://github.com/umbraco/Umbraco-CMS/pull/722/files

Since JsSource can be used for a file path or actual javascript, we can't use IOHelper.ResolveUrl here.  Instead we're moving it to the GetLegacyActionJs() method, which already handles deciding if it's a code or a URL.

💩

Conflicts:
	src/umbraco.cms/Actions/Action.cs
2015-07-16 09:44:25 +02:00
Shannon Deminick b4e0ddb7ad Merge pull request #742 from tomfulton/fix/u4-6843
Fix backoffice breaking when Actions use code in JsSource - U4-6843
2015-07-16 09:41:20 +02:00
Tom Fulton a1f40a3e6e Quick stab at testing a method from BackofficeController for U4-6843
* Move GetLegacyActionJs logic into an internal static method so we can test
* Change LegacyJsActionType to internal for testing
* Add tests to verify method can determine between js paths and js blocks, so as not to pass js code into IOHelper.ResolveUrl
2015-07-15 23:46:31 -06:00
Tom Fulton 28df1af226 Check for ~/ before using IOHelper.ResolveUrl
An "relative virtual path" exception can be thrown by a path like "umbraco/test.js"
2015-07-15 23:42:42 -06:00
Tom Fulton 195953d63c Fix backoffice breaking when Actions use code in their JsSource - U4-6843
This reverts/refactors this pull request: https://github.com/umbraco/Umbraco-CMS/pull/722/files

Since JsSource can be used for a file path or actual javascript, we can't use IOHelper.ResolveUrl here.  Instead we're moving it to the GetLegacyActionJs() method, which already handles deciding if it's a code or a URL.

💩
2015-07-15 16:59:09 -06:00
Stephan a93684f1f2 Bugfix unit tests 2015-07-15 18:16:45 +02:00
Shannon 18e8f09654 BatchedDatabaseServerMessenger only exists in Web now, no reason for it to be in Core. CoreBootManager by default now uses DatabaseServerMessenger (non-batched), WebBootManager now uses BatchedDatabaseServerMessenger and is always enabled by default unless the Dist Calls setting in umbracoSettings is enabled, in that case it will revert to using the legacy batched web services messenger. 2015-07-15 17:27:01 +02:00
Shannon 85ebcadcdd Fixes more tests and more decoupling of singletons 2015-07-15 16:40:50 +02:00
Shannon 0efeba3744 Fixing unit tests, decouples more singleton accessors 2015-07-15 16:28:50 +02:00
Shannon 2a63519e8c Fixes: U4-6834 Add TagService.GetTagsForEntity(Guid key) method 2015-07-15 15:54:06 +02:00
Shannon ba1d546579 Merge remote-tracking branch 'origin/master-v7' into dev-v7
Conflicts:
	src/Umbraco.Core/MainDom.cs
	src/Umbraco.Tests/Umbraco.Tests.csproj
	src/Umbraco.Tests/packages.config
	src/Umbraco.Web.UI.Client/src/canvasdesigner/index.html
	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
	src/Umbraco.Web/Umbraco.Web.csproj
	src/Umbraco.Web/packages.config
	src/UmbracoExamine/UmbracoExamine.csproj
	src/umbraco.MacroEngines/packages.config
	src/umbraco.MacroEngines/umbraco.MacroEngines.csproj
2015-07-15 14:58:19 +02:00
Sebastiaan Janssen 8baaae4da6 Merge branch '7.2.7' into master-v7 2015-07-15 12:58:48 +02:00
Sebastiaan Janssen ed05a3223f Update Examine NuGet dependency 2015-07-15 12:52:24 +02:00
Shannon 25e3134e35 Fixes unit tests 2015-07-15 12:33:47 +02:00
Shannon f1b9b98f5d Updates to latest examine 2015-07-15 12:32:11 +02:00
Sebastiaan Janssen d2f7eda074 Fixes unit test that failed because HostingEnvironment.ApplicationID is null in unit tests 2015-07-15 10:58:38 +02:00
Shannon a5d5809385 Fixes DatabaseServerMessenger, when an exception occurs, we need to log but we cannot keep trying to process an invalid instruction otherwise we're in an infinite error loop and no further instructions will ever get processed. 2015-07-15 10:50:01 +02:00
Shannon d9d38b9cc1 Merge remote-tracking branch 'origin/dev-v7' into dev-v7
Conflicts:
	src/Umbraco.Core/Sync/DatabaseServerMessenger.cs
	src/Umbraco.Tests/Umbraco.Tests.csproj
	src/Umbraco.Tests/packages.config
	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
	src/Umbraco.Web/Umbraco.Web.csproj
	src/UmbracoExamine/UmbracoExamine.csproj
	src/umbraco.MacroEngines/umbraco.MacroEngines.csproj
2015-07-15 10:32:55 +02:00
Shannon 1e147f97e1 Updates examine, updates loghelper references. 2015-07-15 10:29:28 +02:00
Stephan db0cfad6b9 Merge 7.2.7 into dev-v7
Conflicts:
	src/Umbraco.Core/Configuration/UmbracoVersion.cs
	src/Umbraco.Tests/packages.config
	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
	src/Umbraco.Web.UI/packages.config
	src/Umbraco.Web/Umbraco.Web.csproj
	src/Umbraco.Web/packages.config
	src/umbraco.MacroEngines/packages.config
	src/umbraco.cms/packages.config
	src/umbraco.cms/umbraco.cms.csproj
	src/umbraco.controls/umbraco.controls.csproj
	src/umbraco.editorControls/umbraco.editorControls.csproj
2015-07-14 19:57:56 +02:00
Stephan 3062eedb4f content - ensure backward compatibility 2015-07-14 19:28:15 +02:00
Stephan 1e3dd4c5cd Cleanup new umbracoApplicationUrl config 2015-07-14 19:28:14 +02:00
Sebastiaan Janssen a7871abbd9 Update Examine and ClientDependency to latest version 2015-07-14 16:50:45 +02:00
Stephan effa632fab DatabaseServerMessenger - ensure instructions 2015-07-14 16:21:05 +02:00
Stephan 161f2eda86 DisposableObject - cleanup & use 2015-07-14 15:57:01 +02:00
Stephan bf3a08cf85 DisposableObject - cleanup & use 2015-07-14 15:56:23 +02:00
Sebastiaan Janssen 7bc208e490 U4-6825 Can't blank out values using the built-in EditProfile snippet
#U4-6825 Fixed
2015-07-14 15:32:08 +02:00
Shannon a4dbc33b9a updates LogHelper references 2015-07-14 10:52:04 +02:00
Shannon 6b2e042e76 updates LogHelper references 2015-07-14 10:49:43 +02:00
Shannon b4bb15c66f fixes up a bower reference 2015-07-14 10:47:51 +02:00
Stephan 7bf28a20e7 DatabaseServerMessenger - sync only if MainDom 2015-07-13 22:57:39 +02:00
Stephan d386c069ee Post-merge 2015-07-13 22:57:38 +02:00
Stephan d83fdb48c9 Merge branch 7.2.7 into dev-v7
Conflicts:
	build/UmbracoVersion.txt
	src/SolutionInfo.cs
	src/Umbraco.Core/ApplicationContext.cs
	src/Umbraco.Core/AsyncLock.cs
	src/Umbraco.Core/Cache/DictionaryCacheProviderBase.cs
	src/Umbraco.Core/Cache/ObjectCacheRuntimeCacheProvider.cs
	src/Umbraco.Core/CoreBootManager.cs
	src/Umbraco.Core/Logging/LogHelper.cs
	src/Umbraco.Core/PluginManager.cs
	src/Umbraco.Core/Sync/ServerEnvironmentHelper.cs
	src/Umbraco.Core/TypeFinder.cs
	src/Umbraco.Core/Umbraco.Core.csproj
	src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs
	src/Umbraco.Tests/ServerEnvironmentHelperTests.cs
	src/Umbraco.Web.UI.Client/bower.json
	src/Umbraco.Web.UI.Client/gruntFile.js
	src/Umbraco.Web.UI.Client/src/less/grid.less
	src/Umbraco.Web.UI.Client/src/less/panel.less
	src/Umbraco.Web.UI.Client/src/less/property-editors.less
	src/Umbraco.Web.UI.Client/src/loader.js
	src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.controller.js
	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
	src/Umbraco.Web.UI/config/ClientDependency.config
	src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlCacheFilePersister.cs
	src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs
	src/Umbraco.Web/Scheduling/KeepAlive.cs
	src/Umbraco.Web/Scheduling/LatchedBackgroundTaskBase.cs
	src/Umbraco.Web/Scheduling/LogScrubber.cs
	src/Umbraco.Web/Scheduling/RecurringTaskBase.cs
	src/Umbraco.Web/Scheduling/ScheduledPublishing.cs
	src/Umbraco.Web/Scheduling/ScheduledTasks.cs
	src/Umbraco.Web/Scheduling/Scheduler.cs
	src/Umbraco.Web/UI/JavaScript/JsInitialize.js
	src/Umbraco.Web/Umbraco.Web.csproj
	src/Umbraco.Web/umbraco.presentation/content.cs
	src/umbraco.cms/Actions/Action.cs
2015-07-13 22:45:37 +02:00
Shannon 6aa633c8c5 changes app timeout to 1.5 mins 2015-07-13 17:10:35 +02:00
Shannon eddd643249 ensures that when setting the PropertyType's property on a PropertyGroup that the PropertyGroupId is set and updates an auth method to ensure that the correct identity type is returned. 2015-07-13 15:52:21 +02:00
Stephan 9be2f99e7b Scheduler - does not run tasks if not MainDom 2015-07-13 14:53:07 +02:00
Stephan 2d5bfc0fe2 Use MainDom status to protect umbraco.config
Conflicts:
	src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlCacheFilePersister.cs
	src/Umbraco.Web/umbraco.presentation/content.cs
2015-07-13 14:52:55 +02:00
Stephan c01f864e37 ApplicationContext - manage MainDom
Conflicts:
	src/Umbraco.Core/ApplicationContext.cs
	src/Umbraco.Core/Umbraco.Core.csproj
2015-07-13 14:41:07 +02:00
Stephan a8be796d68 Bugfix content for LB 2015-07-13 14:17:00 +02:00
Stephan 4acbdbe896 Move WaitOneAsync from AsyncLock to WaitHandleExtensions
Conflicts:
	src/Umbraco.Core/AsyncLock.cs
	src/Umbraco.Core/Umbraco.Core.csproj
2015-07-13 14:16:43 +02:00
Stephan 34a9eef8b8 BackgroundTaskRunner - add Hosted option, refactor some tasks
Conflicts:
	src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs
2015-07-13 14:13:47 +02:00
Stephan 0f56fa4baa Bugfix content xml doctype issue 2015-07-13 14:08:50 +02:00
Shannon 82a8404b2e Updates TemplateRenderer to not use singletons and to ensure that the http context values are copied back if anything fails 2015-07-09 18:30:52 +02:00
Shannon bce8affe16 removes unused method 2015-07-09 15:19:47 +02:00
Shannon 4bbd8097a2 Merge branch '7.2.7' of https://github.com/umbraco/Umbraco-CMS into 7.2.7 2015-07-09 15:08:41 +02:00
Shannon da9c810d78 Updates examine initialization of its IIndexCriteria to be lazy, this will save a few db calls on startup and ensure they are excuted at the very last possible time. 2015-07-09 14:32:50 +02:00
Shannon 431d066300 Changes the ApplicationEventHandler to check if the db is configured instead of being connected to which can cause issues if SQLCE file is locked by another app domain on startup. Then we verify in the CoreBootManager that the db can be connected to with a retry policy. Changes the db context CanConnect method to not store a static value since it might later be able to be connected to. 2015-07-09 14:31:59 +02:00
Shannon 6d50bd891a moves the ApplicationContext.IsConfigured to a lazy initializer 2015-07-09 14:30:32 +02:00
Stephan 1d00e3c5d8 UmbracoApplication - log unhandled exceptions
Conflicts:
	src/Umbraco.Core/UmbracoApplicationBase.cs
2015-07-08 21:33:22 +02:00
Stephan 97533e7c3d UmbracoApplication - log unhandled exceptions 2015-07-08 21:29:17 +02:00
Shannon e69422c8d8 Fixes tests (backports cache fix by name) 2015-07-08 18:14:31 +02:00
Shannon a277ac2fe4 udpates some logging stuff which will also make logging faster. 2015-07-08 17:55:08 +02:00
Shannon 1067b1e245 BackgroundTaskRunner - refactor recurring tasks, improve shutdown
Conflicts:
	src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlCacheFilePersister.cs
	src/Umbraco.Web/Scheduling/LogScrubber.cs
	src/Umbraco.Web/Scheduling/Scheduler.cs
	src/Umbraco.Web/Umbraco.Web.csproj
2015-07-08 17:41:20 +02:00
Shannon 7987f13a11 U4-6788 - refactor OriginalRequestUrl into UmbracoApplicationUrl
and fixes merge issues.
2015-07-08 17:32:36 +02:00
Shannon ccda1bdd73 Refactor scheduled tasks & publishing cancellation 2015-07-08 17:23:15 +02:00
Shannon 76a6f2d2d0 Updates scheduled tasks to be async with cancellation token 2015-07-08 17:23:00 +02:00
Shannon 69428b2281 Scheduled publishing is executing request async with cancellation token 2015-07-08 17:22:44 +02:00
Shannon 7cd39918a0 another log entry 2015-07-08 16:54:38 +02:00
Shannon 9a626c9da6 Merge branch '7.2.7' of https://github.com/umbraco/Umbraco-CMS into 7.2.7 2015-07-08 16:45:42 +02:00
Shannon 0520797c09 more logging 2015-07-08 16:45:34 +02:00
Stephan 9b85ba5b90 Resolution - better logging when freezing 2015-07-08 16:32:43 +02:00
Stephan 993a5bbc92 Resolution - better logging when freezing 2015-07-08 16:28:53 +02:00
Shannon ca738979ce Adds some more detailed logging. 2015-07-08 16:27:06 +02:00
Stephan c9489bb912 DatabaseServerMessenger - default instructions retention is 2 days 2015-07-08 14:42:47 +02:00
Stephan fce688f47f DatabaseServerMessenger - local identity is unique appdomain 2015-07-08 14:42:38 +02:00
Shannon 8cfb56adf4 adds machine name logging to startup 2015-07-08 13:28:15 +02:00
Stephan 6833c195c1 BackgroundTaskRunner - refactor recurring tasks, improve shutdown 2015-07-08 13:18:46 +02:00
Shannon 053346d79b fixes merge 2015-07-08 11:54:10 +02:00
Shannon 044c9c95f8 Merge branch 'dev-v7-U4-6677' of https://github.com/bjarnef/Umbraco-CMS into bjarnef-dev-v7-U4-6677
Conflicts:
	src/Umbraco.Web.UI.Client/src/less/panel.less

Conflicts:
	src/Umbraco.Web.UI.Client/src/less/panel.less
2015-07-08 11:49:09 +02:00
Shannon b23ea69b3e Fixes: U4-6636 Left navbar (section-bar) is unnecessary wide on mobile devices
Conflicts:
	src/Umbraco.Web.UI.Client/src/less/grid.less
2015-07-08 11:48:17 +02:00
Shannon 46f9c5ff05 Fixes: U4-5052 (U7) Previewing a published page changes icon in content tree to the little green plus indicating changes need to be published even though no changes have been made. 2015-07-08 11:46:03 +02:00
Shannon 3bc4b50d74 updates version 2015-07-08 11:36:50 +02:00
Shannon 1a2849dfb0 fixes merge issues 2015-07-08 11:35:55 +02:00
Shannon bcb5883230 Fixes: U4-3514 Add dropdown list of tabs, if more then 6 tabs
Conflicts:
	src/Umbraco.Web.UI.Client/bower.json
	src/Umbraco.Web.UI.Client/gruntFile.js
2015-07-08 11:16:46 +02:00
Shannon 18080c1cfb Fixes: U4-6796 BackOfficeIdentity gets assigned inadvertently for front-end requests if using ui.Text to localize 2015-07-08 11:13:49 +02:00
Shannon 2600a3887e Fixes issue with upgrading - potential file lock issues and also file check for access.config
Conflicts:
	src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenThreeZero/MovePublicAccessXmlDataToDb.cs
2015-07-08 11:13:24 +02:00
Shannon 45bec2a67d Fixes date picker: U4-6715 i can't seem to remove a "publish-at" date? - date picker is more robust now and does proper validity checking/feedback 2015-07-08 11:12:19 +02:00
Shannon da7456fd2a Fixes up unit test for testing back office request to ensure that the GlobalSettings.Path is consistent with a vdir 2015-07-08 11:11:17 +02:00
Shannon 275ba00e24 Fix IsBackOfficeRequest returning false for virtual directory paths - U4-6346 2015-07-08 11:10:30 +02:00
Shannon d00bf4649d Fix for JsSource on legacy trees not supporting virtual paths (~/) - U4-6346
Conflicts:
	src/umbraco.cms/Actions/Action.cs
2015-07-08 11:10:18 +02:00
Shannon 04976f8063 U4-6202 - cache clearing by object type
Conflicts:
	src/Umbraco.Core/Cache/ObjectCacheRuntimeCacheProvider.cs
2015-07-08 11:08:19 +02:00
Shannon 3e7c9fc81e Fixes: U4-6202 Cache not clearing by object type properly
Conflicts:
	src/Umbraco.Core/Cache/ObjectCacheRuntimeCacheProvider.cs
2015-07-08 11:07:53 +02:00
Shannon a1f4d7b16f Fixes: U4-5798 The database configuration failed with the following message: The incoming request has too many parameters. The server supports a maximum of 2100 parameters. 2015-07-08 11:05:30 +02:00
Shannon 811ef4a444 Fixes: U4-5673 SQL Azure cannot drop clustered index on upgrade 2015-07-08 11:03:42 +02:00
Shannon 69ac621f5a Fixes: U4-5670 Umbraco.DropDown List pre value with alias ** already exists for this data type 2015-07-08 11:03:10 +02:00
Shannon 610582df38 U4-5162 - do not cache macro if previewing 2015-07-08 11:02:30 +02:00
Shannon Deminick cf16692b5a Merge pull request #741 from abryukhov/patch-2
UI localization (RU) - All 7.2 and actual at the moment 7.3 keys
2015-07-08 09:53:23 +02:00
Shannon 5d60440a6f Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-07-07 18:27:38 +02:00
Shannon 0fe96e80c9 Fixes: U4-6782 ContentTypeService should support getByKey(Guid) and refactors a little bit of the RepositoryBase stuff with the addition of IReadRepository, adds some tests to support. 2015-07-07 18:26:53 +02:00
Shannon a712726065 Updates the logger and how to output process id and app domain id with the default log4net patterns. 2015-07-07 16:18:57 +02:00
Shannon 253b9dab27 Ensures log4net is shutdown on app shutdown 2015-07-07 16:12:05 +02:00
Shannon 1ffde1e9a6 makes log tests go a little quicker 2015-07-07 16:11:49 +02:00
Shannon f6e0dfe9dc Changes published media cache log output to warnings (when indexes are not found) 2015-07-07 16:11:33 +02:00
Sebastiaan Janssen 30dfd2772b "+" in the version doesn't work with the current NuGet 2015-07-07 15:20:35 +02:00
Alexander Bryukhov f93364ab96 All 7.2 and actual at the moment 7.3 keys 2015-07-07 19:17:56 +06:00
Sebastiaan Janssen b903e0503f "+" in the version doesn't work with the current NuGet 2015-07-07 15:11:58 +02:00
Sebastiaan Janssen b0ccb040a1 Makes sure we can have nightlies for non-pre-releases as well 2015-07-07 15:11:57 +02:00
Sebastiaan Janssen db030ffa31 Adds the ability to pass in a nightly version to the version comment 2015-07-07 15:11:57 +02:00
Shannon cf90e9a6b8 Fixes: U4-6796 BackOfficeIdentity gets assigned inadvertently for front-end requests if using ui.Text to localize 2015-07-07 12:05:51 +02:00
Shannon 7c451411cb Fixes issue with upgrading - potential file lock issues and also file check for access.config 2015-07-07 11:24:28 +02:00
Shannon bf19d61d14 bumps txt version 2015-07-06 18:02:25 +02:00
Shannon 2cd5551913 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-07-06 17:57:07 +02:00
Shannon 3a3917c1fc Fixes: U4-4231 remove umbracoUserLogins table 2015-07-06 17:52:07 +02:00
Shannon 7e798e18e8 Fixes: U4-6789 Core.Models.Macro is internal 2015-07-06 17:50:10 +02:00
Shannon Deminick 9cb5026a0a Merge pull request #740 from shwld/dev-v7
update language conf file (ja)
2015-07-06 17:36:23 +02:00
Stephan 39a9d68f43 U4-6785 - crlf when serializing to xml 2015-07-06 15:32:06 +02:00
Stephan 8c54f2edc9 U4-6788 - refactor OriginalRequestUrl into UmbracoApplicationUrl 2015-07-06 13:58:10 +02:00
Stephan d26b12137b CoreBootManager - report version in log 2015-07-03 16:39:35 +02:00
Stephan 081d6f9158 Logger - report process and domain ID 2015-07-03 16:39:34 +02:00
Stephan b52439f8f1 AsyncLock - support timeout when async-locking 2015-07-03 15:42:09 +02:00
Shannon d63f83f7c7 Fixes: U4-6786 Update to CDF 1.8.4 2015-07-03 11:40:41 +02:00
Shannon 85158abb5f removes unit test that no longer makes any sense. 2015-07-02 18:27:55 +02:00
Shannon c917fc37ae Fixes: U4-6113 Cannot delete member with upload field 2015-07-02 17:20:27 +02:00
Shannon f68cdf43e1 Fixes: U4-6099 cmsLanguageText.languageId needs to be a foreign key to the umbracoLanguage table 2015-07-02 17:19:42 +02:00
Shannon f0742c9d7c Fixes: U4-6733 Adding dictionary item (7.3): No parent dictionary item was found with id 41c7638d-f529-4bff-853e-59a0c2fb1bde 2015-07-02 14:52:01 +02:00
Shannon 32e21b0314 Fixes: U4-5798 The database configuration failed with the following message: The incoming request has too many parameters. The server supports a maximum of 2100 parameters. 2015-07-02 14:30:21 +02:00
Shannon 22c035c9b9 Fixes test 2015-07-02 11:21:46 +02:00
Shannon Deminick 4257d85aa7 Merge pull request #733 from base33/dev-v7
U4-6724 Moving content with JSON Tags add extra characters
2015-07-02 11:08:39 +02:00
craig 9c50c67319 U4-6724 Moving content with JSON Tags add extra characters 2015-07-01 21:25:03 +01:00
Shannon d0c4b2ab72 Fixes user lockout with aspnet identity 2015-07-01 18:02:58 +02:00
Shannon 53a0c55b14 Implements SignInManager, implements lock out policy for user manager, allows for better implementation of 2 factor auth for developers. Updates to latest owin libs. 2015-07-01 17:07:29 +02:00
Shannon d76b8d91b1 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-07-01 13:53:45 +02:00
Shannon 44943e367f Updates async logging to a newer format 2015-07-01 13:46:11 +02:00
Shannon Deminick 89c3c71251 Merge pull request #732 from SoerenDeger/U4-6759
Added missing language areas/keys to de lang file
2015-07-01 11:13:48 +02:00
Shannon Deminick 7e7725f0f5 Merge pull request #737 from tomfulton/fix/u46775
Support virtual paths for PreValueField attributes (U4-6775)
2015-07-01 10:54:10 +02:00
Shannon Deminick 7b881a2110 Merge pull request #736 from base33/U4-6773
U4-6773 create property - available properties are not sorted a-z
2015-07-01 10:50:33 +02:00
Shannon Deminick ccb078c8f2 Merge pull request #734 from jessetinell/sv-translations
Edited swedish translations
2015-07-01 10:41:26 +02:00
shwld 974f827e8b update language conf file (ja) 2015-07-01 01:18:29 +09:00
Tom Fulton 048a8683dd Support virtual paths for PreValueField attributes (U4-6775) 2015-06-29 17:51:40 -06:00
craig bdd7d7280d U4-6773 create property - available properties are not sorted a-z 2015-06-29 22:26:08 +01:00
Jesse 671026cfc9 Edited swedish translations
Added a few missing and removed unused translations.
2015-06-29 08:30:13 +02:00
Shannon 56315768e9 updates method name 2015-06-26 17:04:40 +02:00
Shannon 309675dce7 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-06-26 17:00:07 +02:00
Shannon b42959f663 Gets U4-6753 Identity support must have an option to enable auto-linked accounts working 2015-06-26 16:59:40 +02:00
Sören Deger 30979f92cc Added missing language areas/keys to de lang file
Added missing language areas and keys to the german language file, i.e.
area with alias: changeDocType, media, placeholders, grid and a lot of
more.
2015-06-26 14:48:57 +02:00
Stephan 623e8e3979 U4-6642 - bugfix PR 2015-06-26 12:31:53 +02:00
Shannon 42b2b16f0e fixes js error with date picker 2015-06-26 10:06:22 +02:00
Shannon f14989f7fd Updates code for U4-6579 with equals check and adds logic to the content editor too 2015-06-26 10:06:07 +02:00
Shannon acf7fa7907 Updates code for U4-6579 with equals check and adds logic to the content editor too 2015-06-26 10:01:32 +02:00
Shannon aa9751afff adds tests for U4-6696 2015-06-26 09:58:44 +02:00
Shannon Deminick 3be714d786 Merge pull request #730 from base33/dev-v7
U4-6696 - UmbracoHelper.GetPreValueAsString fires exception with inva…
2015-06-26 09:35:52 +02:00
Shannon Deminick bcd1395e08 Merge pull request #729 from DaveGreasley/dev-v7
Fixes U4-6579 error deleting media item in umbraco 7
2015-06-26 09:29:47 +02:00
craig 96199caa11 U4-6696 - UmbracoHelper.GetPreValueAsString fires exception with invalid integer 2015-06-25 22:40:56 +01:00
David Greasley 73de12037e Fixes U4-6579: Checks if media item being deleted was at the root then redirects to the root, otherwise redirects to parent item. 2015-06-25 21:11:36 +01:00
Vincent Baaij 2e43a34812 Merge remote-tracking branch 'upstream/dev-v7' into dev-v7 2015-06-25 17:37:36 +02:00
Vincent Baaij 1b9afc961b Fix for #U4-6171 Continuous Deployment from Visual Studio Online to Azure Websites not working as expected 2015-06-25 17:35:15 +02:00
Shannon 1a8c89b99a fixes oembed typo 2015-06-25 17:34:33 +02:00
Shannon fdf53b8550 puts the Flickr provider back for backwards compat, adds a todo and updates the release config with all providers 2015-06-25 17:10:45 +02:00
Shannon 5487ec1d5f Merge branch 'dev-v7-oembed' of https://github.com/tcmorris/Umbraco-CMS into tcmorris-dev-v7-oembed
Conflicts:
	src/Umbraco.Web/Umbraco.Web.csproj
2015-06-25 16:57:52 +02:00
Shannon 7b28e64c9e updates NodeDto and PropertyTypeDto to auto-gen GUIDs by default 2015-06-25 16:55:55 +02:00
Shannon 88a0189f23 fixes test 2015-06-25 16:46:57 +02:00
Shannon 95d8fe239e fixes js errors with grid and date picker 2015-06-25 16:40:48 +02:00
Shannon 8ad814a3b6 fixes property type Key generation 2015-06-25 16:40:24 +02:00
Shannon b5fb6bc2d5 Fixes: U4-5052 (U7) Previewing a published page changes icon in content tree to the little green plus indicating changes need to be published even though no changes have been made. 2015-06-25 16:30:06 +02:00
Shannon 9901b2ee3d Fixes: U4-6754 Resizing image in RTE passes invalid dimension parameters to ImageProcessor 2015-06-25 15:18:07 +02:00
Shannon 346d13174a Fixes: U4-6624 Sensitive form field has not disabled autocomplete 2015-06-25 14:40:28 +02:00
Shannon 79ad33dd6e Fixes: U4-5673 SQL Azure cannot drop clustered index on upgrade 2015-06-25 14:35:05 +02:00
Shannon 805d743f69 Fixes upgrade issue 2015-06-25 11:15:57 +02:00
Shannon a85f3bfc16 Fixes install issue that was causing so many tests to fail 2015-06-25 09:56:40 +02:00
Shannon 84cac6ac90 Fixes: U4-5741 [7.2] CodeMirror in RTE has issues in IE11 & U4-5781 Update to latest codemirror 2015-06-24 19:06:42 +02:00
Shannon Deminick e758bf2eca Merge pull request #716 from rasmusfjord/dev-v7
Updating image cropper interface
2015-06-24 17:49:17 +02:00
Shannon 1f0a4490a6 U4-6737 Add unique id (guid) column to property type 2015-06-24 17:47:20 +02:00
Shannon 85a4a4fa81 fixes migration check to ensure that migrations for the current version always run if the current installation version is a pre-release 2015-06-24 17:46:52 +02:00
Shannon aaf49667ec Fixes member indexer to ensure that all user fields are indexed. 2015-06-24 17:45:25 +02:00
Shannon a7029e4733 Fixes up migration runner with regard to semver numbers. All migrations for a normal version within a build number will execute. For example if migrating from 7.3.x-x to 7.3.0 (final), all migrations for 7.3 will execute. 2015-06-24 15:20:08 +02:00
Shannon 18b1857539 Changes versioning to SemVersion (via nuget package), now target migrations with the full SemVer and update the web.config with the correct sem ver. Creates migration to create the migration table. 2015-06-24 14:17:24 +02:00
Shannon 4f5c24d2e3 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-06-24 11:39:57 +02:00
Shannon f82d8a5df1 updates bower and bower install task. 2015-06-24 11:39:50 +02:00
Shannon Deminick cb3ed7ed8d Merge pull request #727 from bjarnef/dev-v7-U4-6748
Add unique id for TextSearch / LuceneSearch
2015-06-24 09:32:49 +02:00
bjarnef 1cade7f8c7 Add unique id for TextSearch / LuceneSearch
Add unique id for TextSearch / LuceneSearch for each searcher.
2015-06-23 22:28:49 +02:00
Shannon 7503a83219 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-06-23 18:10:57 +02:00
Shannon 869e0dcbd2 Updates the upgrader to ensure that the latest migrations are run if they don't exist, fixes the migration runner null check, adds test to subtract a revision number from a Version object. 2015-06-23 18:10:50 +02:00
Stephan a814b51682 U4-6675 - in-memory temp media cache 2015-06-23 13:57:00 +02:00
Shannon c204741fb9 Fixes up unit test for testing back office request to ensure that the GlobalSettings.Path is consistent with a vdir 2015-06-23 12:30:09 +02:00
Shannon Deminick 5f64b2cf37 Merge pull request #723 from tomfulton/fix/u4-6346
Fix unable to login to backoffice when using virtual directory - U4-6346
2015-06-23 12:16:36 +02:00
Shannon Deminick 9efa67224e Merge pull request #722 from tomfulton/fix/u4-6346-2
Fix for JsSource on legacy trees not supporting virtual paths (~/) - U4-6346
2015-06-23 12:13:32 +02:00
Shannon b00776901c Changes the routing context to be publicly accessable on the umbraco context. 2015-06-23 11:15:56 +02:00
Shannon Deminick 37211b9a2c Merge pull request #721 from robertjf/dev-v7
Issue U4-6734 Fix: Tweaks to TreePicker dialog for better entity support
2015-06-23 11:09:02 +02:00
Shannon 40c35e5851 Fixes: U4-6582 RTE "Link To File" missing rel="nodeId" attribute 2015-06-23 10:53:56 +02:00
Shannon 68073fdb8b Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-06-23 09:41:41 +02:00
Tom Fulton 5eb9138775 Fix IsBackOfficeRequest returning false for virtual directory paths - U4-6346 2015-06-22 16:26:35 -04:00
Tom Fulton cb6b8434f0 Fix for JsSource on legacy trees not supporting virtual paths (~/) - U4-6346 2015-06-22 16:12:13 -04:00
Shannon ff7bdb0f5b Ensures the migrations table is created on install, updates the installation to create the latest migration version once complete. 2015-06-22 19:31:34 +02:00
Shannon 38953212a3 Fixes up some unit tests with changes to migration runner, creates unit tests for ApplicationContext.IsConfigured, updates DatabaseContext to be able to mock some methods. 2015-06-22 18:59:44 +02:00
Shannon 8e1e7a8676 Gets the IsConfigured check checking the migration data, updates the install controller to ensure there's no infinite redirects and to use the IsUpgrading flag. Now to add entries to the table when the migrations have executed. 2015-06-22 16:22:47 +02:00
Stephan a296437547 Fix test that fails in Release mode 2015-06-22 15:50:41 +02:00
Stephan 012c3289cd U4-6675 - in-memory temp media cache 2015-06-22 15:50:22 +02:00
Sebastiaan Janssen 48dd3fe0c7 Update test for mapper added in commit a1d7f2d8 2015-06-21 15:24:50 +02:00
Sebastiaan Janssen 367d82d103 Experiment with less verbose logging for the build (so AppVeyor is easier to use) 2015-06-21 14:51:17 +02:00
Sebastiaan Janssen b7aadaa3d2 Experiment with less verbose logging for the build (so AppVeyor is easier to use) 2015-06-21 14:41:18 +02:00
Robert Foster 05d59bba73 Merge remote-tracking branch 'upstream/dev-v7' into dev-v7 2015-06-20 09:42:09 +10:00
Robert Foster d5baa586cf Adds the ability to provide the Entity Type to the treepicker dialog controller rather than just guessing from the type. This allows other types than just Document, Media or Member to be picked properly without errors.
Also fixed treepicker prevallue controller to pass in treeAlias properly to treepicker dialog.
2015-06-20 09:37:20 +10:00
Shannon a1d7f2d8b3 Created IMigrationEntryService and affiliated models, etc.... also updates the IServerRegistration stuff to be interfaced. 2015-06-19 12:03:02 +02:00
Shannon 3496a064c9 Fixes: U4-3514 Add dropdown list of tabs, if more then 6 tabs 2015-06-19 10:54:46 +02:00
Shannon 7c96f95491 Fixes: U4-6723 User timeout in the back office is an issue with new ASP.Net identity implementation 2015-06-18 19:16:49 +02:00
Shannon 7fc474d62b removes sort check from test - not sure why it is 2, something must have been fixed 2015-06-18 15:30:55 +02:00
Shannon 6a7229e983 Fixes: U4-5670 Umbraco.DropDown List pre value with alias ** already exists for this data type 2015-06-18 15:07:46 +02:00
Shannon f4d507eaa0 Allows the date + time picker to specify a format in the pre-values. 2015-06-18 10:14:31 +02:00
Shannon c962a9331a Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-06-18 10:04:45 +02:00
Shannon b175177770 Fixes date picker: U4-6715 i can't seem to remove a "publish-at" date? - date picker is more robust now and does proper validity checking/feedback 2015-06-18 10:04:22 +02:00
Shannon 08ff284121 adds test to ensure the service level can remove a scheduled publish date, obsoletes method: GetHasPermission 2015-06-18 09:44:16 +02:00
Shannon Deminick 221183d791 Merge pull request #718 from WebCentrum/dev-v7-gridsort2
Fixed bug in U4-6593 - After sort, reset the TinyMCE editors with previous settings
2015-06-17 15:22:52 +02:00
Shannon be84db097a Fixes: U4-6599 TinyMCE autoresize plugin has a bug and needs to be updated, U4-5689 update to latest TinyMCE 4.x version 2015-06-17 15:06:34 +02:00
Allyen eaaccdad75 Fixed bug in U4-6593 - After sort, reset the TinyMCE editors with previous settings 2015-06-17 14:57:15 +02:00
Shannon 4fcadc7e94 fixes: U4-5591 Error Change premissions on many nodes. 500 - The server supports a maximum of 2100 parameters 2015-06-17 12:21:47 +02:00
Shannon d77f95f29b removes tutorial docs and irrelavent readme and todo files, updates docs build to exclude tutorials header 2015-06-17 11:56:20 +02:00
Shannon 2751a4a02d added Icon to the base grid editor config interface 2015-06-17 10:01:45 +02:00
Shannon 437a9cf2b3 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-06-17 09:59:32 +02:00
Shannon aef1fb13b1 Fixes: U4-6148 Grid values should not store meta data/grid configuration, the grid config should be accessed globally for use in rendering the grid 2015-06-17 09:59:25 +02:00
Stephan db5697c455 Merge pull request #710 from dampee/U4-6642
U4-6642 - fix new node sort order
2015-06-16 18:25:46 +02:00
Shannon 10d368696d Updates grid editor to filter the values that will be persisted so it's a minimal subset. 2015-06-16 15:49:09 +02:00
Shannon ef2e86b271 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-06-16 15:04:39 +02:00
Shannon 1c0188351c Moves the grid configuration to a config class so it can be re-used. Updates the BackOfficeController to use the new config classes. Creates a new Grid property value converter (which can be overridden by user's ones) which merges the grid config values at runtime so we are not storing stale grid config values with the actual property value. Now we need to ensure that the grid doesn't post or persist these config values since they don't belong there. 2015-06-16 15:04:31 +02:00
Stephan 6d3377cc6e Revert "temp - temp media memory cache"
This reverts commit 8d1cdf020b.
2015-06-16 12:29:09 +02:00
Shannon fd6caf5cee updates how scripts render in main view - make it more clear where the callback is 2015-06-16 10:59:47 +02:00
Shannon 20e265491f Updates to latest AutoMapper and HtmlAgility 2015-06-16 10:19:34 +02:00
Shannon 10c8645b5f fixes button alignment now that the left section panel shrinks 2015-06-15 18:10:54 +02:00
Shannon 3c353fc7f9 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-06-15 17:47:01 +02:00
Shannon bc04f578e3 fix build 2015-06-15 17:46:53 +02:00
Shannon 03a8ee437d Merge branch 'dev-v7-U4-6677' of https://github.com/bjarnef/Umbraco-CMS into bjarnef-dev-v7-U4-6677
Conflicts:
	src/Umbraco.Web.UI.Client/src/less/panel.less
2015-06-15 17:43:06 +02:00
Stephan ee0297bb69 U4-6631 - throw on missing physical template file 2015-06-15 17:36:53 +02:00
Shannon Deminick 9765e9cf3a Merge pull request #715 from dampee/fixes/U4-5559
Fix Typo's build-in and seperate (U4-5559)
2015-06-15 17:31:23 +02:00
Shannon 6d9aba0952 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-06-15 17:13:42 +02:00
Shannon 1b137bb785 Fixes: U4-5777 Allow Localization of Plugins without having to edit core language files 2015-06-15 17:13:34 +02:00
Rasmus Fjord d57561b0e3 Updating image cropper interface to show crop more intuitive and also fixing u4-4622 2015-06-15 16:39:07 +02:00
Damiaan d2dc4efed8 U4-5559 Fix Typo "Seperate" to Separate 2015-06-15 16:12:46 +02:00
Damiaan 4f02a13a46 U4-5559 Fix Typo "Build-In" (Code) 2015-06-15 16:07:45 +02:00
Stephan 52c33055af U4-6702 - handle wildcard domains also for virtual node handler 2015-06-15 14:58:34 +02:00
Stephan bef6b8cd4c U4-5162 - do not cache macro if previewing 2015-06-15 14:45:16 +02:00
Stephan 8d1cdf020b temp - temp media memory cache 2015-06-15 14:38:09 +02:00
Shannon 29b64965ed Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2015-06-15 13:35:01 +02:00
Shannon 1e5a7a13dd fixes tree sync when the tree type alias isn't the correct case 2015-06-15 13:34:54 +02:00
Shannon Deminick e6cc90f6dd Merge pull request #714 from Tobz91/U4-6699
Removed capitalize from headings
2015-06-15 13:28:09 +02:00
Shannon c29af1df48 Fixes: U4-6636 Left navbar (section-bar) is unnecessary wide on mobile devices 2015-06-15 13:18:46 +02:00
Tobz91 8451a020dd Removed capitalize from headings
To avoid uppercase on first letter in every word for headings (in modals
for example).

Issue: http://issues.umbraco.org/issue/U4-6699
2015-06-15 13:18:18 +02:00
Shannon Deminick b413d717e2 Merge pull request #713 from vnbaaij/patch-1
As discussed in cg15 Grid workshop
2015-06-15 12:15:05 +02:00
Shannon Deminick dafaca414c Merge pull request #708 from fraabye/dev-v7
Added debugger display attribute to PropertyEditor base class. Fixes: U4-6534
2015-06-15 12:13:58 +02:00
Shannon Deminick b1fda57e50 Merge pull request #707 from trankin/bugfixes/U4-6687
Fix U4-6687: Can't add multiple instances of a macro in RTE in 7.2.6 …
2015-06-15 12:05:14 +02:00
Shannon Deminick 4cd8522921 Merge pull request #706 from bjarnef/dev-v7-U4-6058
U4-6058 - Move search field out of table header in listview
2015-06-15 11:44:58 +02:00
Vincent Baaij 4574aa2173 As discussed in cg15 Grid workshop
If you use more than one grid datatype in one doctype, the editors are shown the text 'Choose a layout for the page' more than once. By showing 'Choose a layout for this section', the text is in line with the documentation
2015-06-15 10:13:04 +02:00
Vincent Baaij 226f8f60ca As discussed in cg15 Grid workshop
If you use more than one grid datatype in one doctype, the editors are shown the text 'Choose a layout for the page' more than once. By showing 'Choose a layout for this section', the text is in line with the documentation
2015-06-15 10:10:05 +02:00
Shannon a3d4ccc062 Merge remote-tracking branch 'origin/dev-v7' into 7.3.0
Conflicts:
	src/Umbraco.Web.UI.Client/src/views/common/dialogs/login.html
2015-06-15 09:41:50 +02:00
Shannon Deminick 7ca323d8d3 Merge pull request #704 from bjarnef/dev-v7-loginview
Add ng-cloak for login view
2015-06-15 09:29:25 +02:00
Damiaan Peeters d35b47b960 MYSQL doesn't handle the same way. So used the same code as in PersistUpdatedItem() 2015-06-14 00:52:37 +02:00
Damiaan Peeters 00ad45f436 Fix for U4-6642 (Sort order messing up after deleting a node) 2015-06-13 11:37:14 +02:00
Frederik Raabye d75179b742 Added debugger display attribute to PropertyEditor base class. Fixes: U4-6534 2015-06-11 12:00:34 +02:00
Tom Rankin 6be183f11b FIX U4-6687: Adding tests for RTE Macro parsing when macroAlias is the first attribute and a new test for multiple Macros of various format. 2015-06-10 12:53:32 -05:00
Tom Rankin a979f7ab12 Missed a test case when the properties were not in front of MacroAlias 2015-06-10 11:20:51 -05:00
hartvig e639869bb1 Update index.html 2015-06-10 09:20:25 +02:00
hartvig 09552d282f Update canvasdesigner.controller.js 2015-06-10 09:19:44 +02:00
Tom Rankin afe09c0850 Fix U4-6687: Can't add multiple instances of a macro in RTE in 7.2.6 without ruining RTE formatting
We found that the MacroTagParser.cs was being greedy and matching all UMBRACO_MACRO tags instead of getting them individually.

macro.service.js was updated for posterity purposes to match the regex in the .cs side, but testing showed that it was functioning as expected without this change.
2015-06-09 14:19:59 -05:00
Sebastiaan Janssen 181f7c1819 Adds close button to the preview 2015-06-09 18:19:26 +02:00
bjarnef 3c21ccab78 Move search field out of table header
Move search field out of table header in listview to give more space for
content in listview.
2015-06-09 00:45:15 +02:00
bjarnef 3f0ea176e3 Add ng-cloak for login view
Add ng-cloak for login view to prevent Angular from briefly displaying
raw (uncompiled) content ```{{ }}```.
2015-06-08 01:42:51 +02:00
Sebastiaan Janssen 73fbe7d78c Merge branch 'dev-v7' into master-v7 2015-06-03 14:53:37 +02:00
Shannon 5d1340e864 Merge branch 'dev-v7' into master-v7 2015-05-13 10:15:11 +10:00
Sebastiaan Janssen c867f609f1 Merge branch '7.2.4' into master-v7 2015-03-20 11:05:00 +01:00
Sebastiaan Janssen 69879dc8f8 Merge branch 'dev-v7' into master-v7 2015-03-19 15:10:59 +01:00
AussieInSeattle 2276584c90 Update for when first control has settings
Adding style for when first control has settings - it was previously overlapping the "cog" icon above it
2015-03-11 11:52:57 -07:00
AussieInSeattle 05a0846e89 Update grid.controller.js 2015-03-09 11:22:16 -07:00
hartvig f663a13391 Updates installer with a new number of tattoos
Kudos to Mike Perry for being #3: https://twitter.com/nvmy13t/status/574733012904099840
2015-03-09 08:52:21 +01:00
AussieInSeattle b2947264e1 edit function for settings on a custom grid editor 2015-02-19 15:49:03 -08:00
AussieInSeattle 066927742e Update UI for settings for a custom grid editor 2015-02-19 15:47:11 -08:00
TimoPerplex 4616afced4 Merge pull request #1 from umbraco/dev-v7
Update to latest data
2015-01-19 09:05:18 +01:00
1375 changed files with 31677 additions and 47983 deletions
+3
View File
@@ -76,6 +76,7 @@ src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/umbraco.*
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/routes.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/app.dev.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/loader.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/loader.dev.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/main.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/app.js
@@ -129,3 +130,5 @@ src/*.boltdata/
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.front.js
src/umbraco.sln.ide/*
build/UmbracoCms.*/
src/.vs/
src/Umbraco.Web.UI/umbraco/js/install.loader.js
+2 -2
View File
@@ -7,9 +7,9 @@ The easiest way to get started is to run `build/build.bat` which will build both
If you're interested in making changes to Belle make sure to read the [Belle ReadMe file](src/Umbraco.Web.UI.Client/README.md). Note that you can always [download a nightly build](http://nightly.umbraco.org/umbraco%207.0.0/) so you don't have to build the code yourself.
## Watch a five minute introduction video ##
## Watch a introduction video ##
[![ScreenShot](http://umbraco.com/images/whatisumbraco.png)](http://umbraco.org/help-and-support/video-tutorials/getting-started/what-is-umbraco)
[![ScreenShot](http://umbraco.com/images/whatisumbraco.png)](https://umbraco.tv/videos/umbraco-v7/content-editor/basics/introduction/cms-explanation/)
## Umbraco - the simple, flexible and friendly ASP.NET CMS ##
+8 -6
View File
@@ -25,9 +25,9 @@ ECHO Installing the Microsoft.Bcl.Build package before anything else, otherwise
SET nuGetFolder=%CD%\..\src\packages\
..\src\.nuget\NuGet.exe sources Remove -Name MyGetUmbracoCore >NUL
..\src\.nuget\NuGet.exe sources Add -Name MyGetUmbracoCore -Source https://www.myget.org/F/umbracocore/api/v2/ >NUL
..\src\.nuget\NuGet.exe install ..\src\Umbraco.Web.UI\packages.config -OutputDirectory %nuGetFolder%
..\src\.nuget\NuGet.exe install ..\src\umbraco.businesslogic\packages.config -OutputDirectory %nuGetFolder%
..\src\.nuget\NuGet.exe install ..\src\Umbraco.Core\packages.config -OutputDirectory %nuGetFolder%
..\src\.nuget\NuGet.exe install ..\src\Umbraco.Web.UI\packages.config -OutputDirectory %nuGetFolder% -Verbosity quiet
..\src\.nuget\NuGet.exe install ..\src\umbraco.businesslogic\packages.config -OutputDirectory %nuGetFolder% -Verbosity quiet
..\src\.nuget\NuGet.exe install ..\src\Umbraco.Core\packages.config -OutputDirectory %nuGetFolder% -Verbosity quiet
ECHO Removing the belle build folder and bower_components folder to make sure everything is clean as a whistle
RD ..\src\Umbraco.Web.UI.Client\build /Q /S
@@ -43,7 +43,7 @@ DEL /F /Q webpihash.txt
ECHO Making sure Git is in the path so that the build can succeed
CALL InstallGit.cmd
ECHO Performing MSBuild and producing Umbraco binaries zip files
%windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe "Build.proj" /p:BUILD_RELEASE=%release% /p:BUILD_COMMENT=%comment%
%windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe "Build.proj" /p:BUILD_RELEASE=%release% /p:BUILD_COMMENT=%comment% /verbosity:minimal
ECHO Setting node_modules folder to hidden to prevent VS13 from crashing on it while loading the websites project
attrib +h ..\src\Umbraco.Web.UI.Client\node_modules
@@ -53,11 +53,13 @@ REN .\_BuildOutput\WebApp\Views\Web.config Web.config.transform
REN .\_BuildOutput\WebApp\Xslt\Web.config Web.config.transform
ECHO Packing the NuGet release files
..\src\.nuget\NuGet.exe Pack NuSpecs\UmbracoCms.Core.nuspec -Version %version% -Symbols
..\src\.nuget\NuGet.exe Pack NuSpecs\UmbracoCms.nuspec -Version %version%
..\src\.nuget\NuGet.exe Pack NuSpecs\UmbracoCms.Core.nuspec -Version %version% -Symbols -Verbosity quiet
..\src\.nuget\NuGet.exe Pack NuSpecs\UmbracoCms.nuspec -Version %version% -Verbosity quiet
IF ERRORLEVEL 1 GOTO :showerror
ECHO No errors were detected but you still may see some in the output, then it's time to investigate.
ECHO You might see some warnings but that is completely normal.
GOTO :EOF
:showerror
+44 -13
View File
@@ -68,6 +68,12 @@
<PropertyGroup Condition="'$(BUILD_RELEASE)'!='' AND '$(BUILD_COMMENT)'!=''">
<DECIMAL_BUILD_NUMBER>.$(BUILD_RELEASE)-$(BUILD_COMMENT)</DECIMAL_BUILD_NUMBER>
</PropertyGroup>
<PropertyGroup Condition="'$(BUILD_RELEASE)'!='' AND '$(BUILD_NIGHTLY)'!=''">
<DECIMAL_BUILD_NUMBER>.$(BUILD_RELEASE)-$(BUILD_NIGHTLY)</DECIMAL_BUILD_NUMBER>
</PropertyGroup>
<PropertyGroup Condition="'$(BUILD_RELEASE)'!='' AND '$(BUILD_COMMENT)'!='' AND '$(BUILD_NIGHTLY)'!=''">
<DECIMAL_BUILD_NUMBER>.$(BUILD_RELEASE)-$(BUILD_COMMENT)-$(BUILD_NIGHTLY)</DECIMAL_BUILD_NUMBER>
</PropertyGroup>
<PropertyGroup>
<BuildConfiguration>Release</BuildConfiguration>
@@ -91,15 +97,8 @@
</PropertyGroup>
<ItemGroup>
<SystemFolders Include="$(WebAppFolder)App_Plugins" />
<SystemFolders Include="$(WebAppFolder)App_Code" />
<SystemFolders Include="$(WebAppFolder)App_Data" />
<SystemFolders Include="$(WebAppFolder)Media" />
<SystemFolders Include="$(WebAppFolder)Masterpages" />
<SystemFolders Include="$(WebAppFolder)Scripts" />
<SystemFolders Include="$(WebAppFolder)Css" />
<SystemFolders Include="$(WebAppFolder)Xslt" />
<SystemFolders Include="$(WebAppFolder)UserControls" />
<SystemFolders Include="$(WebAppFolder)Views" />
</ItemGroup>
@@ -145,14 +144,14 @@
DestinationFiles="@(WebPiFiles->'$(WebPiFolder)%(RecursiveDir)%(Filename)%(Extension)')" />
<!-- Zip the files -->
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileNameWebPi)%22 %22$(WebPiFolderAbsolutePath)*%22 -x!dotLess.Core.dll" />
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileNameWebPi)%22 %22$(WebPiFolderAbsolutePath)*%22 -x!dotLess.Core.dll -x![Content_Types].xml >NUL" />
</Target>
<Target Name="ZipWebApp" DependsOnTargets="CreateSystemFolders" >
<Message Text="Starting to zip to $(buildDate)-$(BuildZipFileName)" Importance="high" />
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileNameBin)%22 %22$(SolutionBinFolderAbsolutePath)*%22 -x!dotLess.Core.dll" />
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileName)%22 %22$(WebAppFolderAbsolutePath)*%22 -x!dotLess.Core.dll" />
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileNameBin)%22 %22$(SolutionBinFolderAbsolutePath)*%22 -x!dotLess.Core.dll >NUL" />
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileName)%22 %22$(WebAppFolderAbsolutePath)*%22 -x!dotLess.Core.dll -x![Content_Types].xml >NUL" />
<Message Text="Finished zipping to build\$(BuildFolder)\$(buildDate)-$(BuildZipFileName)" Importance="high" />
</Target>
@@ -219,6 +218,7 @@
<Target Name="CopyTransformedConfig" DependsOnTargets="CopyXmlDocumentation">
<ItemGroup>
<ConfigFiles Include="$(WebAppFolder)config\*.config;$(WebAppFolder)config\*.js" />
<CustomLanguageFiles Include="$(WebAppFolder)config\lang\*.xml" />
<WebConfigTransformFile Include="$(WebAppFolder)Web.config" />
</ItemGroup>
@@ -227,6 +227,11 @@
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="false" />
<Copy SourceFiles="@(CustomLanguageFiles)"
DestinationFiles="@(CustomLanguageFiles->'$(ConfigsFolder)Lang\%(RecursiveDir)%(Filename)%(Extension)')"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="false" />
<Copy SourceFiles="@(WebConfigTransformFile)"
DestinationFiles="$(ConfigsFolder)Web.config.transform"
OverwriteReadOnlyFiles="true"
@@ -259,7 +264,7 @@
<Message Text="Compiling web project to build\$(BuildFolder)" Importance="high" />
<!-- For UseWPP_CopyWebApplication=True see http://stackoverflow.com/questions/1983575/copywebapplication-with-web-config-transformations -->
<!-- Build the Umbraco.Web.UI project -->
<MSBuild Projects="..\src\Umbraco.Web.UI\Umbraco.Web.UI.csproj" Properties="WarningLevel=0;Configuration=$(BuildConfiguration);UseWPP_CopyWebApplication=True;PipelineDependsOnBuild=False;OutDir=$(SolutionBinFolderAbsolutePath);WebProjectOutputDir=$(WebAppFolderAbsolutePath)" Targets="Clean;Rebuild;" BuildInParallel="False" ToolsVersion="4.0" UnloadProjectsOnCompletion="False">
<MSBuild Projects="..\src\Umbraco.Web.UI\Umbraco.Web.UI.csproj" Properties="WarningLevel=0;Configuration=$(BuildConfiguration);UseWPP_CopyWebApplication=True;PipelineDependsOnBuild=False;OutDir=$(SolutionBinFolderAbsolutePath);WebProjectOutputDir=$(WebAppFolderAbsolutePath);Verbosity=minimal" Targets="Clean;Rebuild;" BuildInParallel="False" ToolsVersion="4.0" UnloadProjectsOnCompletion="False">
</MSBuild>
<!-- DONE -->
@@ -271,9 +276,11 @@
<PropertyGroup>
<NewVersion>$(BUILD_RELEASE)</NewVersion>
<NewVersion Condition="'$(BUILD_COMMENT)'!=''">$(BUILD_RELEASE)-$(BUILD_COMMENT)</NewVersion>
<NewVersion Condition="'$(BUILD_NIGHTLY)'!=''">$(BUILD_RELEASE)-$(BUILD_NIGHTLY)</NewVersion>
<NewVersion Condition="'$(BUILD_COMMENT)'!='' And '$(BUILD_NIGHTLY)'!=''">$(BUILD_RELEASE)-$(BUILD_COMMENT)-$(BUILD_NIGHTLY)</NewVersion>
</PropertyGroup>
<!-- Match & replace 3 and 4 digit version numbers and -beta (if it's there) -->
<!-- Match & replace 3 and 4 digit version numbers and -beta and +nightly (if they're there) -->
<FileUpdate
Files="..\src\Umbraco.Core\Configuration\UmbracoVersion.cs"
Regex="(\d+)\.(\d+)\.(\d+)(.(\d+))?"
@@ -283,6 +290,16 @@
Regex="CurrentComment { get { return &quot;(.+)?&quot;"
ReplacementText="CurrentComment { get { return &quot;$(BUILD_COMMENT)&quot;"/>
<FileUpdate Files="..\src\Umbraco.Core\Configuration\UmbracoVersion.cs"
Condition="'$(BUILD_NIGHTLY)'!=''"
Regex="CurrentComment { get { return &quot;(.+)?&quot;"
ReplacementText="CurrentComment { get { return &quot;$(BUILD_NIGHTLY)&quot;"/>
<FileUpdate Files="..\src\Umbraco.Core\Configuration\UmbracoVersion.cs"
Condition="'$(BUILD_COMMENT)'!='' AND '$(BUILD_NIGHTLY)'!=''"
Regex="CurrentComment { get { return &quot;(.+)?&quot;"
ReplacementText="CurrentComment { get { return &quot;$(BUILD_COMMENT)-$(BUILD_NIGHTLY)&quot;"/>
<!--This updates the AssemblyFileVersion for the solution to the umbraco version-->
<FileUpdate
Files="..\src\SolutionInfo.cs"
@@ -300,10 +317,24 @@
Files="..\src\SolutionInfo.cs"
Regex="AssemblyInformationalVersion\(&quot;(.+)?&quot;\)"
ReplacementText="AssemblyInformationalVersion(&quot;$(BUILD_RELEASE)&quot;)"/>
<FileUpdate
Condition="'$(BUILD_NIGHTLY)'!=''"
Files="..\src\SolutionInfo.cs"
Regex="AssemblyInformationalVersion\(&quot;(.+)?&quot;\)"
ReplacementText="AssemblyInformationalVersion(&quot;$(BUILD_RELEASE)-$(BUILD_NIGHTLY)&quot;)"/>
<FileUpdate
Condition="'$(BUILD_COMMENT)'!='' AND '$(BUILD_NIGHTLY)'!=''"
Files="..\src\SolutionInfo.cs"
Regex="AssemblyInformationalVersion\(&quot;(.+)?&quot;\)"
ReplacementText="AssemblyInformationalVersion(&quot;$(BUILD_RELEASE)-$(BUILD_COMMENT)-$(BUILD_NIGHTLY)&quot;)"/>
<FileUpdate
Condition="'$(BUILD_COMMENT)'=='' AND '$(BUILD_NIGHTLY)'==''"
Files="..\src\SolutionInfo.cs"
Regex="AssemblyInformationalVersion\(&quot;(.+)?&quot;\)"
ReplacementText="AssemblyInformationalVersion(&quot;$(BUILD_RELEASE)&quot;)"/>
<!--This updates the copyright year-->
<FileUpdate
Condition="'$(BUILD_COMMENT)'==''"
Files="..\src\SolutionInfo.cs"
Regex="AssemblyCopyright\(&quot;Copyright © Umbraco (\d{4})&quot;\)"
ReplacementText="AssemblyCopyright(&quot;Copyright © Umbraco $([System.DateTime]::Now.ToString(`yyyy`))&quot;)"/>
+9 -13
View File
@@ -1,4 +1,6 @@
@ECHO OFF
SETLOCAL
SET release=%1
ECHO Installing Npm NuGet Package
@@ -6,17 +8,14 @@ SET nuGetFolder=%CD%\..\src\packages\
ECHO Configured packages folder: %nuGetFolder%
ECHO Current folder: %CD%
%CD%\..\src\.nuget\NuGet.exe install Npm.js -OutputDirectory %nuGetFolder%
%CD%\..\src\.nuget\NuGet.exe install Npm.js -OutputDirectory %nuGetFolder% -Verbosity quiet
for /f "delims=" %%A in ('dir %nuGetFolder%node.js.* /b') do set "nodePath=%nuGetFolder%%%A\"
for /f "delims=" %%A in ('dir %nuGetFolder%npm.js.* /b') do set "npmPath=%nuGetFolder%%%A\tools\"
ECHO Temporarily adding Npm and Node to path
SET oldPath=%PATH%
path=%npmPath%;%nodePath%;%PATH%
ECHO %path%
ECHO Adding Npm and Node to path
REM SETLOCAL is on, so changes to the path not persist to the actual user's path
PATH=%npmPath%;%nodePath%;%PATH%
SET buildFolder=%CD%
@@ -24,13 +23,10 @@ ECHO Change directory to %CD%\..\src\Umbraco.Web.UI.Client\
CD %CD%\..\src\Umbraco.Web.UI.Client\
ECHO Do npm install and the grunt build of Belle
call npm install
call npm install -g grunt-cli
call npm install -g bower
call npm install --quiet
call npm install -g grunt-cli --quiet
call npm install -g bower --quiet
call grunt build --buildversion=%release%
ECHO Reset path to what it was before
path=%oldPath%
ECHO Move back to the build folder
CD %buildFolder%
+5 -6
View File
@@ -1,19 +1,19 @@
@ECHO OFF
SET oldPath=%PATH%
SETLOCAL
REM SETLOCAL is on, so changes to the path not persist to the actual user's path
git.exe 2> NUL
if %ERRORLEVEL%==9009 GOTO :trydefaultpath
GOTO :EOF
:trydefaultpath
path=C:\Program Files (x86)\Git\cmd;%PATH%
path=C:\Program Files (x86)\Git\cmd;C:\Program Files\Git\cmd;%PATH%
git.exe 2> NUL
if %ERRORLEVEL%==9009 GOTO :showerror
GOTO :EOF
:showerror
path=%oldPath%
ECHO Git is not in your path and could not be found in C:\Program Files (x86)\Git\bin
ECHO Git is not in your path and could not be found in C:\Program Files (x86)\Git\cmd nor in C:\Program Files\Git\cmd
set /p install=" Do you want to install Git through Chocolatey [y/n]? " %=%
if %install%==y (
GOTO :installgit
@@ -29,5 +29,4 @@ GOTO :EOF
ECHO Installing Chocolatey first
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
ECHO Installing Git through Chocolatey
choco install git
path=C:\Program Files (x86)\Git\cmd;%path%
choco install git
+15 -13
View File
@@ -15,27 +15,29 @@
<language>en-US</language>
<tags>umbraco</tags>
<dependencies>
<dependency id="Microsoft.AspNet.Mvc" version="[4.0.40804.0,6.0.0)" />
<dependency id="Microsoft.AspNet.Mvc" version="[5.2.3,6.0.0)" />
<dependency id="Microsoft.AspNet.WebApi" version="[5.2.3,6.0.0)" />
<dependency id="Microsoft.AspNet.Mvc.FixedDisplayModes" version="1.0.1" />
<dependency id="Microsoft.Net.Http" version="[2.0.20710.0, 3.0.0)" />
<dependency id="Microsoft.AspNet.Identity.Owin" version="[2.2.0, 3.0.0)" />
<dependency id="Microsoft.Net.Http" version="[2.2.29, 3.0.0)" />
<dependency id="Microsoft.AspNet.Identity.Owin" version="[2.2.1, 3.0.0)" />
<dependency id="Microsoft.Owin.Security.Cookies" version="[3.0.1, 4.0.0)" />
<dependency id="Microsoft.Owin.Security.OAuth" version="[3.0.1, 4.0.0)" />
<dependency id="Microsoft.Owin.Host.SystemWeb" version="[3.0.1, 4.0.0)" />
<dependency id="MiniProfiler" version="[2.1.0, 3.0.0)" />
<dependency id="HtmlAgilityPack" version="[1.4.6, 2.0.0)" />
<dependency id="HtmlAgilityPack" version="[1.4.9, 2.0.0)" />
<dependency id="Lucene.Net" version="[2.9.4.1, 3.0.0.0)" />
<dependency id="SharpZipLib" version="[0.86.0, 1.0.0)" />
<dependency id="MySql.Data" version="[6.9.6, 7.0.0)" />
<dependency id="MySql.Data" version="[6.9.8, 7.0.0)" />
<dependency id="xmlrpcnet" version="[2.5.0, 3.0.0)" />
<dependency id="ClientDependency" version="[1.8.3.1, 2.0.0)" />
<dependency id="ClientDependency-Mvc" version="[1.8.0, 2.0.0)" />
<dependency id="AutoMapper" version="[3.0.0, 4.0.0)" />
<dependency id="Newtonsoft.Json" version="[6.0.5, 7.0.0)" />
<dependency id="Examine" version="[0.1.63, 1.0.0)" />
<dependency id="ImageProcessor" version="[1.9.5, 3.0.0)" />
<dependency id="ImageProcessor.Web" version="[3.3.1, 5.0.0)" />
<dependency id="ClientDependency" version="[1.8.4, 2.0.0)" />
<dependency id="ClientDependency-Mvc5" version="[1.8.0, 2.0.0)" />
<dependency id="AutoMapper" version="[3.0.0, 3.1.0)" />
<dependency id="Newtonsoft.Json" version="[6.0.8, 7.0.0)" />
<dependency id="Examine" version="[0.1.68, 1.0.0)" />
<dependency id="ImageProcessor" version="[2.3.0, 3.0.0)" />
<dependency id="ImageProcessor.Web" version="[4.4.0, 5.0.0)" />
<dependency id="semver" version="[1.1.2, 2.0.0)" />
<dependency id="Microsoft.AspNet.WebHelpers" version="[3.2.3, 4.0.0)" />
<dependency id="Microsoft.AspNet.WebPages.Data" version="[3.2.3, 4.0.0)" />
</dependencies>
</metadata>
<files>
+1 -1
View File
@@ -26,7 +26,6 @@
<file src="..\_BuildOutput\WebApp\Global.asax" target="Content\Global.asax" />
<file src="..\_BuildOutput\WebApp\Web.config" target="UmbracoFiles\Web.config" />
<file src="..\_BuildOutput\WebApp\App_Browsers\**" target="UmbracoFiles\App_Browsers" />
<file src="..\_BuildOutput\WebApp\App_Plugins\**" target="UmbracoFiles\App_Plugins" />
<file src="..\_BuildOutput\WebApp\bin\amd64\**" target="UmbracoFiles\bin\amd64" />
<file src="..\_BuildOutput\WebApp\bin\x86\**" target="UmbracoFiles\bin\x86" />
<file src="..\_BuildOutput\WebApp\config\splashes\**" target="UmbracoFiles\Config\splashes" />
@@ -41,6 +40,7 @@
<file src="tools\Dashboard.config.install.xdt" target="Content\config\Dashboard.config.install.xdt" />
<file src="tools\trees.config.install.xdt" target="Content\config\trees.config.install.xdt" />
<file src="tools\umbracoSettings.config.install.xdt" target="Content\config\umbracoSettings.config.install.xdt" />
<file src="tools\Views.Web.config.install.xdt" target="Views\Web.config.install.xdt" />
<file src="build\**" target="build" />
</files>
</package>
+12 -1
View File
@@ -1,6 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="CopyUmbracoFilesToWebRootForDeploy" AfterTargets="CopyAllFilesToSingleFolderForMsdeploy">
<PropertyGroup>
<UmbracoFilesFolder>$(MSBuildThisFileDirectory)..\UmbracoFiles\</UmbracoFilesFolder>
</PropertyGroup>
<ItemGroup>
<UmbracoFiles Include="$(UmbracoFilesFolder)**\*" />
</ItemGroup>
<Copy SourceFiles="%(UmbracoFiles.FullPath)" DestinationFiles="$(_PackageTempDir)\%(RecursiveDir)%(Filename)%(Extension)" Condition="!Exists('%(RecursiveDir)%(Filename)%(Extension)')" />
</Target>
<Target Name="CopyUmbracoFilesToWebRoot" BeforeTargets="AfterBuild">
<!-- This copies the files listed in `AddUmbracoFilesToOutput` to the webroot during NuGet install and should -->
<!-- not be altered to support automated builds, use `CopyUmbracoFilesToWebRootForDeploy` for that instead -->
<PropertyGroup>
<UmbracoFilesFolder>$(MSBuildThisFileDirectory)..\UmbracoFiles\</UmbracoFilesFolder>
</PropertyGroup>
@@ -47,4 +58,4 @@
</FilesForPackagingFromProject>
</ItemGroup>
</Target>
</Project>
</Project>
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<dashBoard xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<section alias="StartupSettingsDashboardSection" xdt:Locator="Match(alias)">
<section alias="StartupSettingsDashboardSection" xdt:Locator="Match(alias)" xdt:Transform="InsertIfMissing">
<tab caption="Get Started" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
<tab caption="Welcome" xdt:Locator="Match(caption)" xdt:Transform="InsertIfMissing">
<control showOnce="true" addPanel="true" panelCaption="" xdt:Transform="InsertIfMissing">
@@ -20,7 +20,7 @@
</tab>
</section>
<section alias="StartupDeveloperDashboardSection" xdt:Locator="Match(alias)">
<section alias="StartupDeveloperDashboardSection" xdt:Locator="Match(alias)" xdt:Transform="InsertIfMissing">
<tab caption="Get Started" xdt:Locator="Match(caption)" xdt:Transform="Replace">
<control showOnce="true" addPanel="true" panelCaption="">
views/dashboard/developer/developerdashboardvideos.html
@@ -29,15 +29,20 @@
<tab caption="Examine Management" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
</section>
<section alias="StartupDeveloperDashboardSection" xdt:Locator="Match(alias)">
<section alias="StartupDeveloperDashboardSection" xdt:Locator="Match(alias)" xdt:Transform="InsertIfMissing">
<tab caption="Examine Management" xdt:Locator="Match(caption)" xdt:Transform="InsertIfMissing">
<control>
views/dashboard/developer/examinemanagement.html
</control>
</tab>
<tab caption="Xml Data Integrity Report" xdt:Transform="InsertIfMissing">
<control>
views/dashboard/developer/xmldataintegrityreport.html
</control>
</tab>
</section>
<section alias="StartupMediaDashboardSection" xdt:Locator="Match(alias)">
<section alias="StartupMediaDashboardSection" xdt:Locator="Match(alias)" xdt:Transform="InsertIfMissing">
<tab caption="Get Started" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
<tab caption="Content" xdt:Locator="Match(caption)" xdt:Transform="InsertIfMissing" />
<tab caption="Content" xdt:Locator="Match(caption)" xdt:Transform="Replace">
@@ -47,7 +52,7 @@
</tab>
</section>
<section alias="StartupDashboardSection" xdt:Locator="Match(alias)">
<section alias="StartupDashboardSection" xdt:Locator="Match(alias)" xdt:Transform="InsertIfMissing">
<tab caption="Get Started" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
<tab caption="Get Started" xdt:Transform="Insert">
<access>
@@ -57,17 +62,10 @@
views/dashboard/default/startupdashboardintro.html
</control>
</tab>
<tab caption="Change password" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
<tab caption="Change Password" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
<tab caption="Change Password" xdt:Transform="Insert">
<control showOnce="false" addPanel="false" panelCaption="">
views/dashboard/ChangePassword.html
</control>
</tab>
<tab caption="Last Edits" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
</section>
<section alias="StartupMemberDashboardSection" xdt:Locator="Match(alias)">
<section alias="StartupMemberDashboardSection" xdt:Locator="Match(alias)" xdt:Transform="InsertIfMissing">
<tab caption="Get Started" xdt:Locator="Match(caption)" xdt:Transform="Remove" />
<tab caption="Get Started" xdt:Transform="Insert">
<control showOnce="true" addPanel="true" panelCaption="">
-3
View File
@@ -10,9 +10,6 @@
Don't forget to build!
When upgrading your website using NuGet you should answer "No" to the questions to overwrite the Web.config
file (and config files in the config folder).
We've done our best to transform your configuration files but in case something is not quite right: remember we
backed up your files in App_Data\NuGetBackup so you can find the original files before they were transformed.
@@ -0,0 +1,37 @@
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
xdt:Locator="Match(name)"
xdt:Transform="SetAttributes(type)">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
xdt:Locator="Match(name)"
xdt:Transform="SetAttributes(type)" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
xdt:Locator="Match(name)"
xdt:Transform="SetAttributes(type)" />
</sectionGroup>
</configSections>
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
xdt:Locator="Match(factoryType)"
xdt:Transform="SetAttributes(factoryType)" />
</system.web.webPages.razor>
<system.web>
<pages
pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
xdt:Locator="Match(pageParserFilterType,pageBaseType,userControlBaseType)"
xdt:Transform="SetAttributes(pageParserFilterType,pageBaseType,userControlBaseType)">
<controls>
<add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc"
xdt:Locator="Match(namespace)"
xdt:Transform="SetAttributes(assembly)" />
</controls>
</pages>
</system.web>
</configuration>
+56 -4
View File
@@ -20,10 +20,9 @@
<appSettings xdt:Transform="InsertIfMissing" />
<appSettings>
<add key="ValidationSettings:UnobtrusiveValidationMode" value="None" xdt:Locator="Match(key)" xdt:Transform="InsertIfMissing" />
<add key="owin:appStartup" value="UmbracoDefaultOwinStartup" xdt:Locator="Match(key)" xdt:Transform="InsertIfMissing" />
</appSettings>
<umbracoConfiguration xdt:Transform="InsertIfMissing">
<settings configSource="config\umbracoSettings.config" xdt:Locator="Match(configSource)" xdt:Transform="InsertIfMissing" />
<BaseRestExtensions configSource="config\BaseRestExtensions.config" xdt:Locator="Match(configSource)" xdt:Transform="InsertIfMissing" />
@@ -49,6 +48,13 @@
<system.web xdt:Transform="InsertIfMissing" />
<system.web>
<siteMap xdt:Transform="Remove" />
<siteMap xdt:Transform="InsertIfMissing">
<providers xdt:Transform="InsertIfMissing">
<remove name="MySqlSiteMapProvider" xdt:Transform="InsertIfMissing" />
</providers>
</siteMap>
<httpRuntime xdt:Transform="InsertIfMissing" />
<httpRuntime targetFramework="4.5" maxRequestLength="1048576" fcnMode="Single" xdt:Transform="SetAttributes(targetFramework,fcnMode,maxRequestLength)" />
<membership defaultProvider="DefaultMembershipProvider" xdt:Locator="Match(defaultProvider)" xdt:Transform="Remove" />
<roleManager defaultProvider="DefaultRoleProvider" xdt:Locator="Match(defaultProvider)" xdt:Transform="Remove"/>
<profile defaultProvider="DefaultProfileProvider" xdt:Locator="Match(defaultProvider)" xdt:Transform="Remove"/>>
@@ -75,6 +81,10 @@
</compilation>
<compilation>
<assemblies>
<remove assembly="System.Web.Http" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Net.Http" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
</assemblies>
<assemblies>
<remove assembly="System.Web.Http" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Net.Http" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
@@ -130,6 +140,13 @@
<remove name="SpellChecker" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="SpellChecker" xdt:Locator="Match(name)" xdt:Transform="Remove" />
</handlers>
<security xdt:Transform="InsertIfMissing">
<requestFiltering xdt:Transform="InsertIfMissing">
<requestLimits maxAllowedContentLength="1073741824" xdt:Transform="InsertIfMissing" />
</requestFiltering>
</security>
</system.webServer>
<system.codedom xdt:Transform="Remove" />
@@ -141,15 +158,26 @@
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='HtmlAgilityPack')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='System.Net.Http')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='Newtonsoft.Json')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='System.Web.Mvc')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='System.Web.Htttp')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='System.Web.WebPages.Razor')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='System.Web.Http')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='Microsoft.Owin')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='Microsoft.Owin.Security.OAuth')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='Microsoft.Owin.Security')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='Microsoft.Owin.Security.Cookies')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='System.Net.Http.Formatting')" xdt:Transform="Remove" />
</assemblyBinding>
</runtime>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="HtmlAgilityPack" publicKeyToken="bd319b19eaf3b43a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.4.9.0" newVersion="1.4.9.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
@@ -160,12 +188,36 @@
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.1" newVersion="4.0.0.1" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
+13
View File
@@ -57,12 +57,25 @@ if ($project) {
if(Test-Path $umbracoBinFolder\ImageProcessor.dll) { Remove-Item $umbracoBinFolder\ImageProcessor.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\ImageProcessor.Web.dll) { Remove-Item $umbracoBinFolder\ImageProcessor.Web.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Lucene.Net.dll) { Remove-Item $umbracoBinFolder\Lucene.Net.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.AspNet.Identity.Core.dll) { Remove-Item $umbracoBinFolder\Microsoft.AspNet.Identity.Core.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.AspNet.Identity.Owin.dll) { Remove-Item $umbracoBinFolder\Microsoft.AspNet.Identity.Owin.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.Owin.dll) { Remove-Item $umbracoBinFolder\Microsoft.Owin.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.Owin.Host.SystemWeb.dll) { Remove-Item $umbracoBinFolder\Microsoft.Owin.Host.SystemWeb.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.Owin.Security.dll) { Remove-Item $umbracoBinFolder\Microsoft.Owin.Security.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.Owin.Security.Cookies.dll) { Remove-Item $umbracoBinFolder\Microsoft.Owin.Security.Cookies.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.Owin.Security.OAuth.dll) { Remove-Item $umbracoBinFolder\Microsoft.Owin.Security.OAuth.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.Web.Infrastructure.dll) { Remove-Item $umbracoBinFolder\Microsoft.Web.Infrastructure.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.Web.Helpers.dll) { Remove-Item $umbracoBinFolder\Microsoft.Web.Helpers.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Microsoft.Web.Mvc.FixedDisplayModes.dll) { Remove-Item $umbracoBinFolder\Microsoft.Web.Mvc.FixedDisplayModes.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\MiniProfiler.dll) { Remove-Item $umbracoBinFolder\MiniProfiler.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\MySql.Data.dll) { Remove-Item $umbracoBinFolder\MySql.Data.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Newtonsoft.Json.dll) { Remove-Item $umbracoBinFolder\Newtonsoft.Json.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Owin.dll) { Remove-Item $umbracoBinFolder\Owin.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Semver.dll) { Remove-Item $umbracoBinFolder\Semver.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Net.Http.Extensions.dll) { Remove-Item $umbracoBinFolder\System.Net.Http.Extensions.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Net.Http.Formatting.dll) { Remove-Item $umbracoBinFolder\System.Net.Http.Formatting.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Net.Http.Primitives.dll) { Remove-Item $umbracoBinFolder\System.Net.Http.Primitives.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Web.Helpers.dll) { Remove-Item $umbracoBinFolder\System.Web.Helpers.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Web.Http.dll) { Remove-Item $umbracoBinFolder\System.Web.Http.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Web.Http.WebHost.dll) { Remove-Item $umbracoBinFolder\System.Web.Http.WebHost.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\System.Web.Mvc.dll) { Remove-Item $umbracoBinFolder\System.Web.Mvc.dll -Force -Confirm:$false }
@@ -0,0 +1,20 @@
<?xml version="1.0"?>
<log4net xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appender name="AsynchronousLog4NetAppender" xdt:Transform="Remove" xdt:Locator="Match(name)" />
<appender name="AsynchronousLog4NetAppender" type="Umbraco.Core.Logging.ParallelForwardingAppender,Umbraco.Core" xdt:Transform="Insert" >
<appender-ref ref="rollingFile" />
</appender>
<appender name="rollingFile" type="log4net.Appender.RollingFileAppender" xdt:Transform="InsertIfMissing">
<file value="App_Data\Logs\UmbracoTraceLog.txt" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<maximumFileSize value="5MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value=" %date [P%property{processId}/D%property{appDomainId}/T%thread] %-5level %logger - %message%newline" />
</layout>
<encoding value="utf-8" />
</appender>
</log4net>
+2 -2
View File
@@ -7,12 +7,12 @@
<add initialize="false" sortOrder="0" alias="mediaRecycleBin" application="media" title="Recycle Bin" iconClosed="icon-folder" iconOpen="icon-folder" type="umbraco.cms.presentation.Trees.MediaRecycleBin, umbraco" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="stylesheets" title="Stylesheets" type="umbraco.loadStylesheets, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="0" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="stylesheetProperty" title="Stylesheet Property" type="umbraco.loadStylesheetProperty, umbraco" iconClosed="" iconOpen="" initialize="false" sortOrder="0" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="templates" title="Templates" type="umbraco.loadTemplates, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="1" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="templates" title="Templates" type="Umbraco.Web.Trees.TemplatesTreeController, umbraco" iconClosed="icon-folder" iconOpen="icon-folder-open" sortOrder="1" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="partialViews" title="Partial Views" silent="false" initialize="true" iconClosed="icon-folder" iconOpen="icon-folder" type="Umbraco.Web.Trees.PartialViewsTree, umbraco" sortOrder="2" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="scripts" title="Scripts" type="umbraco.loadScripts, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="3" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="dictionary" title="Dictionary" type="umbraco.loadDictionary, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="4" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add alias="dictionary" xdt:Locator="Match(alias)" xdt:Transform="RemoveAttributes(action)" />
<add application="settings" alias="languages" title="Languages" type="umbraco.loadLanguages, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="5" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="languages" title="Languages" type="Umbraco.Web.Trees.LanguageTreeController, umbraco" iconClosed="icon-folder" iconOpen="icon-folder-open" sortOrder="5" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="mediaTypes" title="Media Types" type="umbraco.loadMediaTypes, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="6" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add application="settings" alias="nodeTypes" title="Document Types" type="umbraco.loadNodeTypes, umbraco" iconClosed="icon-folder" iconOpen="icon-folder" sortOrder="7" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
<add initialize="true" sortOrder="0" alias="datatype" application="developer" title="Data Types" iconClosed="icon-folder" iconOpen="icon-folder" type="Umbraco.Web.Trees.DataTypeTreeController, umbraco" xdt:Locator="Match(alias)" xdt:Transform="SetAttributes()" />
+3 -4
View File
@@ -45,9 +45,6 @@ del ..\src\Umbraco.Web.UI\UserControls\*.*
echo Removing masterpage files
del ..\src\Umbraco.Web.UI\masterpages\*.*
echo Removing view files
del ..\src\Umbraco.Web.UI\Views\*.*
echo Removing razor files
del ..\src\Umbraco.Web.UI\macroScripts\*.*
@@ -104,7 +101,9 @@ echo Removing user control files
FOR %%A IN (..\src\Umbraco.Web.UI\usercontrols\*.*) DO DEL %%A
echo Removing view files
FOR %%A IN (..\src\Umbraco.Web.UI\Views\*.*) DO DEL %%A
ATTRIB +H ..\src\Umbraco.Web.UI\Views\Partials\Grid\*.cshtml /S
FOR %%A IN (..\src\Umbraco.Web.UI\Views\) DO DEL /Q /S *.cshtml -H
ATTRIB -H ..\src\Umbraco.Web.UI\Views\Partials\Grid\*.cshtml /S
echo Removing razor files
FOR %%A IN (..\src\Umbraco.Web.UI\macroScripts\*.*) DO DEL %%A
+6 -4
View File
@@ -54,9 +54,6 @@ del ..\src\Umbraco.Web.UI\UserControls\*.*
echo Removing masterpage files
del ..\src\Umbraco.Web.UI\masterpages\*.*
echo Removing view files
del ..\src\Umbraco.Web.UI\Views\*.*
echo Removing razor files
del ..\src\Umbraco.Web.UI\macroScripts\*.*
@@ -122,7 +119,9 @@ echo Removing user control files
FOR %%A IN (..\src\Umbraco.Web.UI\usercontrols\*.*) DO DEL %%A
echo Removing view files
FOR %%A IN (..\src\Umbraco.Web.UI\Views\*.*) DO DEL %%A
ATTRIB +H ..\src\Umbraco.Web.UI\Views\Partials\Grid\*.cshtml /S
FOR %%A IN (..\src\Umbraco.Web.UI\Views\) DO DEL /Q /S *.cshtml -H
ATTRIB -H ..\src\Umbraco.Web.UI\Views\Partials\Grid\*.cshtml /S
echo Removing razor files
FOR %%A IN (..\src\Umbraco.Web.UI\macroScripts\*.*) DO DEL %%A
@@ -151,6 +150,9 @@ rmdir "..\src\Umbraco.Web.UI\usercontrols\umbracoContour\" /S /Q
echo Start with a clean web.config
copy ..\src\Umbraco.Web.UI\web.Template.config ..\src\Umbraco.Web.UI\web.config /Y
echo Start with a clean web.config
copy ..\src\Umbraco.Web.UI\web.Template.config ..\src\Umbraco.Web.UI\web.config /Y
echo "Umbraco install reverted to clean install"
pause
exit
+1 -2
View File
@@ -1,3 +1,2 @@
# Usage: on line 2 put the release version, on line 3 put the version comment (example: beta)
7.3.0
beta
7.3.5
+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="nuget.org" value="https://www.nuget.org/api/v2/" />
<add key="umbracocore" value="http://www.myget.org/f/umbracocore/" />
</packageSources>
</configuration>
@@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/CSharpLanguageProject/LanguageLevel/@EntryValue">CSharp50</s:String></wpf:ResourceDictionary>
+3 -3
View File
@@ -2,7 +2,7 @@
using System.Resources;
[assembly: AssemblyCompany("Umbraco")]
[assembly: AssemblyCopyright("Copyright © Umbraco 2015")]
[assembly: AssemblyCopyright("Copyright © Umbraco 2016")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -11,5 +11,5 @@ using System.Resources;
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("7.3.0")]
[assembly: AssemblyInformationalVersion("7.3.0-beta")]
[assembly: AssemblyFileVersion("7.3.5")]
[assembly: AssemblyInformationalVersion("7.3.5")]
+1 -1
View File
@@ -11,7 +11,7 @@ namespace Umbraco.Core
/// <summary>
/// A resolver to return all IAction objects
/// </summary>
internal sealed class ActionsResolver : LazyManyObjectsResolverBase<ActionsResolver, IAction>
public sealed class ActionsResolver : LazyManyObjectsResolverBase<ActionsResolver, IAction>
{
/// <summary>
/// Constructor
+123 -66
View File
@@ -1,16 +1,14 @@
using System;
using System.Configuration;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Caching;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.Logging;
using Umbraco.Core.ObjectResolution;
using Umbraco.Core.Profiling;
using Umbraco.Core.Services;
using Umbraco.Core.Sync;
namespace Umbraco.Core
{
@@ -34,10 +32,13 @@ namespace Umbraco.Core
if (dbContext == null) throw new ArgumentNullException("dbContext");
if (serviceContext == null) throw new ArgumentNullException("serviceContext");
if (cache == null) throw new ArgumentNullException("cache");
if (logger == null) throw new ArgumentNullException("logger");
_databaseContext = dbContext;
_services = serviceContext;
ApplicationCache = cache;
ProfilingLogger = logger;
Init();
}
/// <summary>
@@ -46,7 +47,7 @@ namespace Umbraco.Core
/// <param name="dbContext"></param>
/// <param name="serviceContext"></param>
/// <param name="cache"></param>
[Obsolete("Use the other constructor specifying an ILogger instead")]
[Obsolete("Use the other constructor specifying a ProfilingLogger instead")]
public ApplicationContext(DatabaseContext dbContext, ServiceContext serviceContext, CacheHelper cache)
: this(dbContext, serviceContext, cache,
new ProfilingLogger(LoggerResolver.Current.Logger, ProfilerResolver.Current.Profiler))
@@ -57,9 +58,27 @@ namespace Umbraco.Core
/// Creates a basic app context
/// </summary>
/// <param name="cache"></param>
[Obsolete("Use the other constructor specifying a ProfilingLogger instead")]
public ApplicationContext(CacheHelper cache)
{
if (cache == null) throw new ArgumentNullException("cache");
ApplicationCache = cache;
ProfilingLogger = new ProfilingLogger(LoggerResolver.Current.Logger, ProfilerResolver.Current.Profiler);
Init();
}
/// <summary>
/// Creates a basic app context
/// </summary>
/// <param name="cache"></param>
/// <param name="logger"></param>
public ApplicationContext(CacheHelper cache, ProfilingLogger logger)
{
if (cache == null) throw new ArgumentNullException("cache");
if (logger == null) throw new ArgumentNullException("logger");
ApplicationCache = cache;
ProfilingLogger = logger;
Init();
}
/// <summary>
@@ -75,13 +94,13 @@ namespace Umbraco.Core
/// </remarks>
public static ApplicationContext EnsureContext(ApplicationContext appContext, bool replaceContext)
{
if (ApplicationContext.Current != null)
if (Current != null)
{
if (!replaceContext)
return ApplicationContext.Current;
return Current;
}
ApplicationContext.Current = appContext;
return ApplicationContext.Current;
Current = appContext;
return Current;
}
/// <summary>
@@ -101,14 +120,14 @@ namespace Umbraco.Core
[Obsolete("Use the other method specifying an ProfilingLogger instead")]
public static ApplicationContext EnsureContext(DatabaseContext dbContext, ServiceContext serviceContext, CacheHelper cache, bool replaceContext)
{
if (ApplicationContext.Current != null)
if (Current != null)
{
if (!replaceContext)
return ApplicationContext.Current;
return Current;
}
var ctx = new ApplicationContext(dbContext, serviceContext, cache);
ApplicationContext.Current = ctx;
return ApplicationContext.Current;
Current = ctx;
return Current;
}
/// <summary>
@@ -128,14 +147,14 @@ namespace Umbraco.Core
/// </remarks>
public static ApplicationContext EnsureContext(DatabaseContext dbContext, ServiceContext serviceContext, CacheHelper cache, ProfilingLogger logger, bool replaceContext)
{
if (ApplicationContext.Current != null)
if (Current != null)
{
if (!replaceContext)
return ApplicationContext.Current;
return Current;
}
var ctx = new ApplicationContext(dbContext, serviceContext, cache, logger);
ApplicationContext.Current = ctx;
return ApplicationContext.Current;
Current = ctx;
return Current;
}
/// <summary>
@@ -190,16 +209,10 @@ 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
//
// then there is Application["umbracoNeedConfiguration"] which makes no sense... getting rid of it... SD: I have actually remove that now!
//
public bool IsConfigured
{
// todo - we should not do this - ok for now
get
{
return Configured;
}
get { return _configured.Value; }
}
/// <summary>
@@ -222,47 +235,91 @@ namespace Umbraco.Core
}
/// <summary>
/// The original/first url that the web application executes
/// The application url.
/// </summary>
/// <remarks>
/// we need to set the initial url in our ApplicationContext, this is so our keep alive service works and this must
/// exist on a global context because the keep alive service doesn't run in a web context.
/// we are NOT going to put a lock on this because locking will slow down the application and we don't really care
/// if two threads write to this at the exact same time during first page hit.
/// see: http://issues.umbraco.org/issue/U4-2059
/// The application url is the url that should be used by services to talk to the application,
/// eg keep alive or scheduled publishing services. It must exist on a global context because
/// some of these services may not run within a web context.
/// The format of the application url is:
/// - has a scheme (http or https)
/// - has the SystemDirectories.Umbraco path
/// - does not end with a slash
/// It is initialized on the first request made to the server, by UmbracoModule.EnsureApplicationUrl:
/// - if umbracoSettings:settings/web.routing/@umbracoApplicationUrl is set, use the value (new setting)
/// - if umbracoSettings:settings/scheduledTasks/@baseUrl is set, use the value (backward compatibility)
/// - otherwise, use the url of the (first) request.
/// Not locking, does not matter if several threads write to this.
/// See also issues:
/// - http://issues.umbraco.org/issue/U4-2059
/// - http://issues.umbraco.org/issue/U4-6788
/// - http://issues.umbraco.org/issue/U4-5728
/// - http://issues.umbraco.org/issue/U4-5391
/// </remarks>
internal string OriginalRequestUrl { get; set; }
internal string UmbracoApplicationUrl
{
get
{
ApplicationUrlHelper.EnsureApplicationUrl(this);
return _umbracoApplicationUrl;
}
}
private bool _versionsDifferenceReported;
// ReSharper disable once InconsistentNaming
internal string _umbracoApplicationUrl;
/// <summary>
/// Checks if the version configured matches the assembly version
/// </summary>
private bool Configured
private Lazy<bool> _configured;
internal MainDom MainDom { get; private set; }
private void Init()
{
get
{
try
{
var configStatus = ConfigurationStatus;
var currentVersion = UmbracoVersion.Current.ToString(3);
var ok = configStatus == currentVersion;
MainDom = new MainDom(ProfilingLogger.Logger);
MainDom.Acquire();
//Create the lazy value to resolve whether or not the application is 'configured'
_configured = new Lazy<bool>(() =>
{
try
{
var configStatus = ConfigurationStatus;
var currentVersion = UmbracoVersion.GetSemanticVersion();
if (ok == false && _versionsDifferenceReported == false)
{
// remember it's been reported so we don't flood the log
// no thread-safety so there may be a few log entries, doesn't matter
_versionsDifferenceReported = true;
ProfilingLogger.Logger.Debug<ApplicationContext>("CurrentVersion different from configStatus: '" + currentVersion + "','" + configStatus + "'");
}
return ok;
}
catch
{
return false;
}
}
var ok =
//we are not configured if this is null
string.IsNullOrWhiteSpace(configStatus) == false
//they must match
&& configStatus == currentVersion;
if (ok)
{
//The versions are the same in config, but are they the same in the database. We can only check this
// if we have a db context available, if we don't then we are not installed anyways
if (DatabaseContext.IsDatabaseConfigured && DatabaseContext.CanConnect)
{
var found = Services.MigrationEntryService.FindEntry(GlobalSettings.UmbracoMigrationName, UmbracoVersion.GetSemanticVersion());
if (found == null)
{
//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;
}
}
}
else
{
ProfilingLogger.Logger.Debug<ApplicationContext>(string.Format("CurrentVersion different from configStatus: '{0}','{1}'", currentVersion.ToSemanticString(), configStatus));
}
return ok;
}
catch (Exception ex)
{
LogHelper.Error<ApplicationContext>("Error determining if application is configured, returning false", ex);
return false;
}
});
}
private string ConfigurationStatus
@@ -280,12 +337,6 @@ namespace Umbraco.Core
}
}
private void AssertIsReady()
{
if (!this.IsReady)
throw new Exception("ApplicationContext is not ready yet.");
}
private void AssertIsNotReady()
{
if (this.IsReady)
@@ -326,6 +377,11 @@ namespace Umbraco.Core
internal set { _services = value; }
}
internal ServerRole GetCurrentServerRole()
{
var registrar = ServerRegistrarResolver.Current.Registrar as IServerRegistrar2;
return registrar == null ? ServerRole.Unknown : registrar.GetCurrentServerRole();
}
private volatile bool _disposed;
private readonly ReaderWriterLockSlim _disposalLocker = new ReaderWriterLockSlim();
@@ -350,7 +406,8 @@ namespace Umbraco.Core
//clear the cache
if (ApplicationCache != null)
{
ApplicationCache.ClearAllCache();
ApplicationCache.RuntimeCache.ClearAllCache();
ApplicationCache.IsolatedRuntimeCache.ClearAllCaches();
}
//reset all resolvers
ResolverCollection.ResetAll();
+2 -2
View File
@@ -74,7 +74,7 @@ namespace Umbraco.Core
/// <returns></returns>
private bool ShouldExecute(ApplicationContext applicationContext)
{
if (applicationContext.IsConfigured && applicationContext.DatabaseContext.CanConnect)
if (applicationContext.IsConfigured && applicationContext.DatabaseContext.IsDatabaseConfigured)
{
return true;
}
@@ -84,7 +84,7 @@ namespace Umbraco.Core
return true;
}
if (!applicationContext.DatabaseContext.CanConnect && ExecuteWhenDatabaseNotConfigured)
if (!applicationContext.DatabaseContext.IsDatabaseConfigured && ExecuteWhenDatabaseNotConfigured)
{
return true;
}
+44 -48
View File
@@ -1,5 +1,6 @@
using System;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
@@ -63,14 +64,14 @@ namespace Umbraco.Core
// for anonymous semaphore, use the unique releaser, else create a new one
return _semaphore != null
? _releaser // (IDisposable)new SemaphoreSlimReleaser(_semaphore)
: (IDisposable)new NamedSemaphoreReleaser(_semaphore2);
: new NamedSemaphoreReleaser(_semaphore2);
}
public Task<IDisposable> LockAsync()
{
var wait = _semaphore != null
? _semaphore.WaitAsync()
: WaitOneAsync(_semaphore2);
? _semaphore.WaitAsync()
: _semaphore2.WaitOneAsync();
return wait.IsCompleted
? _releaserTask ?? Task.FromResult(CreateReleaser()) // anonymous vs named
@@ -79,6 +80,19 @@ namespace Umbraco.Core
TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
}
public Task<IDisposable> LockAsync(int millisecondsTimeout)
{
var wait = _semaphore != null
? _semaphore.WaitAsync(millisecondsTimeout)
: _semaphore2.WaitOneAsync(millisecondsTimeout);
return wait.IsCompleted
? _releaserTask ?? Task.FromResult(CreateReleaser()) // anonymous vs named
: wait.ContinueWith((_, state) => (((AsyncLock)state).CreateReleaser()),
this, CancellationToken.None,
TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
}
public IDisposable Lock()
{
if (_semaphore != null)
@@ -104,38 +118,55 @@ namespace Umbraco.Core
private class NamedSemaphoreReleaser : CriticalFinalizerObject, IDisposable
{
private readonly Semaphore _semaphore;
private GCHandle _handle;
internal NamedSemaphoreReleaser(Semaphore semaphore)
{
_semaphore = semaphore;
_handle = GCHandle.Alloc(_semaphore);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
GC.SuppressFinalize(this); // finalize will not run
}
private void Dispose(bool disposing)
{
// critical
_handle.Free();
_semaphore.Release();
_semaphore.Dispose();
}
// we WANT to release the semaphore because it's a system object
// ie a critical non-managed resource - so we inherit from CriticalFinalizerObject
// which means that the finalizer "should" run in all situations
// we WANT to release the semaphore because it's a system object, ie a critical
// non-managed resource - and if it is not released then noone else can acquire
// the lock - so we inherit from CriticalFinalizerObject which means that the
// finalizer "should" run in all situations - there is always a chance that it
// does not run and the semaphore remains "acquired" but then chances are the
// whole process (w3wp.exe...) is going down, at which point the semaphore will
// be destroyed by Windows.
// however... that can fail with System.ObjectDisposedException because the
// underlying handle was closed... because we cannot guarantee that the semaphore
// is not gone already... unless we get a GCHandle = GCHandle.Alloc(_semaphore);
// which should keep it around and then we free the handle?
// however, the semaphore is a managed object, and so when the finalizer runs it
// might have been finalized already, and then we get a, ObjectDisposedException
// in the finalizer - which is bad.
// so... I'm not sure this is safe really...
// in order to prevent this we do two things
// - use a GCHandler to ensure the semaphore is still there when the finalizer
// runs, so we can actually release it
// - wrap the finalizer code in a try...catch to make sure it never throws
~NamedSemaphoreReleaser()
{
Dispose(false);
try
{
Dispose(false);
}
catch
{
// we do NOT want the finalizer to throw - never ever
}
}
}
@@ -168,40 +199,5 @@ namespace Umbraco.Core
Dispose(false);
}
}
// http://stackoverflow.com/questions/25382583/waiting-on-a-named-semaphore-with-waitone100-vs-waitone0-task-delay100
// http://blog.nerdbank.net/2011/07/c-await-for-waithandle.html
// F# has a AwaitWaitHandle method that accepts a time out... and seems pretty complex...
// version below should be OK
private static Task WaitOneAsync(WaitHandle handle)
{
var tcs = new TaskCompletionSource<object>();
var callbackHandleInitLock = new object();
lock (callbackHandleInitLock)
{
RegisteredWaitHandle callbackHandle = null;
// ReSharper disable once RedundantAssignment
callbackHandle = ThreadPool.RegisterWaitForSingleObject(
handle,
(state, timedOut) =>
{
tcs.SetResult(null);
// we take a lock here to make sure the outer method has completed setting the local variable callbackHandle.
lock (callbackHandleInitLock)
{
// ReSharper disable once PossibleNullReferenceException
// ReSharper disable once AccessToModifiedClosure
callbackHandle.Unregister(null);
}
},
/*state:*/ null,
/*millisecondsTimeOutInterval:*/ Timeout.Infinite,
/*executeOnlyOnce:*/ true);
}
return tcs.Task;
}
}
}
+29 -2
View File
@@ -1,8 +1,9 @@
using System;
using System.ComponentModel;
using Umbraco.Core.CodeAnnotations;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Constants storing cache keys used in caching
/// </summary>
@@ -12,52 +13,78 @@ namespace Umbraco.Core.Cache
public const string ApplicationsCacheKey = "ApplicationCache";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string UserTypeCacheKey = "UserTypeCache";
[Obsolete("This is no longer used and will be removed from the codebase in the future - it is referenced but no cache is stored against this key")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string ContentItemCacheKey = "contentItem";
[UmbracoWillObsolete("This cache key is only used for the legacy 'library' caching, remove in v8")]
public const string MediaCacheKey = "UL_GetMedia";
public const string MacroXsltCacheKey = "macroXslt_";
[UmbracoWillObsolete("This cache key is only used for legacy business logic caching, remove in v8")]
public const string MacroCacheKey = "UmbracoMacroCache";
public const string MacroHtmlCacheKey = "macroHtml_";
public const string MacroControlCacheKey = "macroControl_";
public const string MacroHtmlDateAddedCacheKey = "macroHtml_DateAdded_";
public const string MacroControlDateAddedCacheKey = "macroControl_DateAdded_";
[UmbracoWillObsolete("This cache key is only used for legacy 'library' member caching, remove in v8")]
public const string MemberLibraryCacheKey = "UL_GetMember";
[UmbracoWillObsolete("This cache key is only used for legacy business logic caching, remove in v8")]
public const string MemberBusinessLogicCacheKey = "MemberCacheItem_";
[UmbracoWillObsolete("This cache key is only used for legacy template business logic caching, remove in v8")]
public const string TemplateFrontEndCacheKey = "template";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string TemplateBusinessLogicCacheKey = "UmbracoTemplateCache";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string UserContextCacheKey = "UmbracoUserContext";
public const string UserContextTimeoutCacheKey = "UmbracoUserContextTimeout";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string UserCacheKey = "UmbracoUser";
public const string UserPermissionsCacheKey = "UmbracoUserPermissions";
[UmbracoWillObsolete("This cache key is only used for legacy business logic caching, remove in v8")]
public const string ContentTypeCacheKey = "UmbracoContentType";
[UmbracoWillObsolete("This cache key is only used for legacy business logic caching, remove in v8")]
public const string ContentTypePropertiesCacheKey = "ContentType_PropertyTypes_Content:";
[UmbracoWillObsolete("This cache key is only used for legacy business logic caching, remove in v8")]
public const string PropertyTypeCacheKey = "UmbracoPropertyTypeCache";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string LanguageCacheKey = "UmbracoLanguageCache";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string DomainCacheKey = "UmbracoDomainList";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string StylesheetCacheKey = "UmbracoStylesheet";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string StylesheetPropertyCacheKey = "UmbracoStylesheetProperty";
[Obsolete("This is no longer used and will be removed from the codebase in the future")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string DataTypeCacheKey = "UmbracoDataTypeDefinition";
public const string DataTypePreValuesCacheKey = "UmbracoPreVal";
@@ -2,6 +2,7 @@
using Umbraco.Core.Events;
using Umbraco.Core.Sync;
using umbraco.interfaces;
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Cache
{
@@ -63,5 +64,15 @@ namespace Umbraco.Core.Cache
{
OnCacheUpdated(Instance, new CacheRefresherEventArgs(id, MessageType.RefreshById));
}
/// <summary>
/// Clears the cache for all repository entities of this type
/// </summary>
/// <typeparam name="TEntity"></typeparam>
internal void ClearAllIsolatedCacheByEntityType<TEntity>()
where TEntity : class, IAggregateRoot
{
ApplicationContext.Current.ApplicationCache.IsolatedRuntimeCache.ClearCache<TEntity>();
}
}
}
@@ -2,11 +2,10 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Caching;
using Umbraco.Core.Cache;
using Umbraco.Core.Models;
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Persistence.Repositories
namespace Umbraco.Core.Cache
{
/// <summary>
/// A wrapper for any IRuntimeCacheProvider that ensures that all inserts and returns
@@ -79,7 +78,7 @@ namespace Umbraco.Core.Persistence.Repositories
public object GetCacheItem(string cacheKey, Func<object> getCacheItem)
{
return InnerProvider.GetCacheItem(cacheKey, () =>
var cached = InnerProvider.GetCacheItem(cacheKey, () =>
{
var result = DictionaryCacheProviderBase.GetSafeLazy(getCacheItem);
var value = result.Value; // force evaluation now - this may throw if cacheItem throws, and then nothing goes into cache
@@ -87,18 +86,21 @@ namespace Umbraco.Core.Persistence.Repositories
return CheckCloneableAndTracksChanges(value);
});
return CheckCloneableAndTracksChanges(cached);
}
public object GetCacheItem(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
return InnerProvider.GetCacheItem(cacheKey, () =>
var cached = InnerProvider.GetCacheItem(cacheKey, () =>
{
var result = DictionaryCacheProviderBase.GetSafeLazy(getCacheItem);
var value = result.Value; // force evaluation now - this may throw if cacheItem throws, and then nothing goes into cache
if (value == null) return null; // do not store null values (backward compat)
return CheckCloneableAndTracksChanges(value);
}, timeout, isSliding, priority, removedCallback, dependentFiles);
}, timeout, isSliding, priority, removedCallback, dependentFiles);
return CheckCloneableAndTracksChanges(cached);
}
public void InsertCacheItem(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout = null, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
@@ -0,0 +1,266 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Logging;
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Cache
{
/// <summary>
/// The default cache policy for retrieving a single entity
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <typeparam name="TId"></typeparam>
internal class DefaultRepositoryCachePolicy<TEntity, TId> : DisposableObject, IRepositoryCachePolicy<TEntity, TId>
where TEntity : class, IAggregateRoot
{
private readonly RepositoryCachePolicyOptions _options;
protected IRuntimeCacheProvider Cache { get; private set; }
private Action _action;
public DefaultRepositoryCachePolicy(IRuntimeCacheProvider cache, RepositoryCachePolicyOptions options)
{
if (cache == null) throw new ArgumentNullException("cache");
if (options == null) throw new ArgumentNullException("options");
_options = options;
Cache = cache;
}
public string GetCacheIdKey(object id)
{
if (id == null) throw new ArgumentNullException("id");
return string.Format("{0}{1}", GetCacheTypeKey(), id);
}
public string GetCacheTypeKey()
{
return string.Format("uRepo_{0}_", typeof(TEntity).Name);
}
public void CreateOrUpdate(TEntity entity, Action<TEntity> persistMethod)
{
if (entity == null) throw new ArgumentNullException("entity");
if (persistMethod == null) throw new ArgumentNullException("persistMethod");
try
{
persistMethod(entity);
//set the disposal action
SetCacheAction(() =>
{
//just to be safe, we cannot cache an item without an identity
if (entity.HasIdentity)
{
Cache.InsertCacheItem(GetCacheIdKey(entity.Id), () => entity);
}
//If there's a GetAllCacheAllowZeroCount cache, ensure it is cleared
Cache.ClearCacheItem(GetCacheTypeKey());
});
}
catch
{
//set the disposal action
SetCacheAction(() =>
{
//if an exception is thrown we need to remove the entry from cache, this is ONLY a work around because of the way
// that we cache entities: http://issues.umbraco.org/issue/U4-4259
Cache.ClearCacheItem(GetCacheIdKey(entity.Id));
//If there's a GetAllCacheAllowZeroCount cache, ensure it is cleared
Cache.ClearCacheItem(GetCacheTypeKey());
});
throw;
}
}
public void Remove(TEntity entity, Action<TEntity> persistMethod)
{
if (entity == null) throw new ArgumentNullException("entity");
if (persistMethod == null) throw new ArgumentNullException("persistMethod");
persistMethod(entity);
//set the disposal action
var cacheKey = GetCacheIdKey(entity.Id);
SetCacheAction(() =>
{
Cache.ClearCacheItem(cacheKey);
//If there's a GetAllCacheAllowZeroCount cache, ensure it is cleared
Cache.ClearCacheItem(GetCacheTypeKey());
});
}
public TEntity Get(TId id, Func<TId, TEntity> getFromRepo)
{
if (getFromRepo == null) throw new ArgumentNullException("getFromRepo");
var cacheKey = GetCacheIdKey(id);
var fromCache = Cache.GetCacheItem<TEntity>(cacheKey);
if (fromCache != null)
return fromCache;
var entity = getFromRepo(id);
//set the disposal action
SetCacheAction(cacheKey, entity);
return entity;
}
public TEntity Get(TId id)
{
var cacheKey = GetCacheIdKey(id);
return Cache.GetCacheItem<TEntity>(cacheKey);
}
public bool Exists(TId id, Func<TId, bool> getFromRepo)
{
if (getFromRepo == null) throw new ArgumentNullException("getFromRepo");
var cacheKey = GetCacheIdKey(id);
var fromCache = Cache.GetCacheItem<TEntity>(cacheKey);
return fromCache != null || getFromRepo(id);
}
public virtual TEntity[] GetAll(TId[] ids, Func<TId[], IEnumerable<TEntity>> getFromRepo)
{
if (getFromRepo == null) throw new ArgumentNullException("getFromRepo");
if (ids.Any())
{
var entities = ids.Select(Get).ToArray();
if (ids.Length.Equals(entities.Length) && entities.Any(x => x == null) == false)
return entities;
}
else
{
var allEntities = GetAllFromCache();
if (allEntities.Any())
{
if (_options.GetAllCacheValidateCount)
{
//Get count of all entities of current type (TEntity) to ensure cached result is correct
var totalCount = _options.PerformCount();
if (allEntities.Length == totalCount)
return allEntities;
}
else
{
return allEntities;
}
}
else if (_options.GetAllCacheAllowZeroCount)
{
//if the repository allows caching a zero count, then check the zero count cache
var zeroCount = Cache.GetCacheItem<TEntity[]>(GetCacheTypeKey());
if (zeroCount != null && zeroCount.Any() == false)
{
//there is a zero count cache so return an empty list
return new TEntity[] {};
}
}
}
//we need to do the lookup from the repo
var entityCollection = getFromRepo(ids)
//ensure we don't include any null refs in the returned collection!
.WhereNotNull()
.ToArray();
//set the disposal action
SetCacheAction(ids, entityCollection);
return entityCollection;
}
/// <summary>
/// Performs the lookup for all entities of this type from the cache
/// </summary>
/// <returns></returns>
protected virtual TEntity[] GetAllFromCache()
{
var allEntities = Cache.GetCacheItemsByKeySearch<TEntity>(GetCacheTypeKey())
.WhereNotNull()
.ToArray();
return allEntities.Any() ? allEntities : new TEntity[] {};
}
/// <summary>
/// The disposal performs the caching
/// </summary>
protected override void DisposeResources()
{
if (_action != null)
{
_action();
}
}
/// <summary>
/// Sets the action to execute on disposal for a single entity
/// </summary>
/// <param name="cacheKey"></param>
/// <param name="entity"></param>
protected virtual void SetCacheAction(string cacheKey, TEntity entity)
{
if (entity == null) return;
SetCacheAction(() =>
{
//just to be safe, we cannot cache an item without an identity
if (entity.HasIdentity)
{
Cache.InsertCacheItem(cacheKey, () => entity);
}
});
}
/// <summary>
/// Sets the action to execute on disposal for an entity collection
/// </summary>
/// <param name="ids"></param>
/// <param name="entityCollection"></param>
protected virtual void SetCacheAction(TId[] ids, TEntity[] entityCollection)
{
SetCacheAction(() =>
{
//This option cannot execute if we are looking up specific Ids
if (ids.Any() == false && entityCollection.Length == 0 && _options.GetAllCacheAllowZeroCount)
{
//there was nothing returned but we want to cache a zero count result so add an TEntity[] to the cache
// to signify that there is a zero count cache
Cache.InsertCacheItem(GetCacheTypeKey(), () => new TEntity[] {});
}
else
{
//This is the default behavior, we'll individually cache each item so that if/when these items are resolved
// by id, they are returned from the already existing cache.
foreach (var entity in entityCollection.WhereNotNull())
{
var localCopy = entity;
//just to be safe, we cannot cache an item without an identity
if (localCopy.HasIdentity)
{
Cache.InsertCacheItem(GetCacheIdKey(entity.Id), () => localCopy);
}
}
}
});
}
/// <summary>
/// Sets the action to execute on disposal
/// </summary>
/// <param name="action"></param>
protected void SetCacheAction(Action action)
{
_action = action;
}
}
}
@@ -0,0 +1,27 @@
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Creates cache policies
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <typeparam name="TId"></typeparam>
internal class DefaultRepositoryCachePolicyFactory<TEntity, TId> : IRepositoryCachePolicyFactory<TEntity, TId>
where TEntity : class, IAggregateRoot
{
private readonly IRuntimeCacheProvider _runtimeCache;
private readonly RepositoryCachePolicyOptions _options;
public DefaultRepositoryCachePolicyFactory(IRuntimeCacheProvider runtimeCache, RepositoryCachePolicyOptions options)
{
_runtimeCache = runtimeCache;
_options = options;
}
public virtual IRepositoryCachePolicy<TEntity, TId> CreatePolicy()
{
return new DefaultRepositoryCachePolicy<TEntity, TId>(_runtimeCache, _options);
}
}
}
@@ -0,0 +1,57 @@
using System.Linq;
using Umbraco.Core.Collections;
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Cache
{
/// <summary>
/// A caching policy that caches an entire dataset as a single collection
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <typeparam name="TId"></typeparam>
internal class FullDataSetRepositoryCachePolicy<TEntity, TId> : DefaultRepositoryCachePolicy<TEntity, TId>
where TEntity : class, IAggregateRoot
{
public FullDataSetRepositoryCachePolicy(IRuntimeCacheProvider cache) : base(cache, new RepositoryCachePolicyOptions())
{
}
/// <summary>
/// For this type of caching policy, we don't cache individual items
/// </summary>
/// <param name="cacheKey"></param>
/// <param name="entity"></param>
protected override void SetCacheAction(string cacheKey, TEntity entity)
{
//do nothing
}
/// <summary>
/// Sets the action to execute on disposal for an entity collection
/// </summary>
/// <param name="ids"></param>
/// <param name="entityCollection"></param>
protected override void SetCacheAction(TId[] ids, TEntity[] entityCollection)
{
//for this type of caching policy, we don't want to cache any GetAll request containing specific Ids
if (ids.Any()) return;
//set the disposal action
SetCacheAction(() =>
{
//We want to cache the result as a single collection
Cache.InsertCacheItem(GetCacheTypeKey(), () => new DeepCloneableList<TEntity>(entityCollection));
});
}
/// <summary>
/// This policy will cache the full data set as a single collection
/// </summary>
/// <returns></returns>
protected override TEntity[] GetAllFromCache()
{
var found = Cache.GetCacheItem<DeepCloneableList<TEntity>>(GetCacheTypeKey());
return found == null ? new TEntity[] { } : found.WhereNotNull().ToArray();
}
}
}
@@ -0,0 +1,25 @@
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Creates cache policies
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <typeparam name="TId"></typeparam>
internal class FullDataSetRepositoryCachePolicyFactory<TEntity, TId> : IRepositoryCachePolicyFactory<TEntity, TId>
where TEntity : class, IAggregateRoot
{
private readonly IRuntimeCacheProvider _runtimeCache;
public FullDataSetRepositoryCachePolicyFactory(IRuntimeCacheProvider runtimeCache)
{
_runtimeCache = runtimeCache;
}
public virtual IRepositoryCachePolicy<TEntity, TId> CreatePolicy()
{
return new FullDataSetRepositoryCachePolicy<TEntity, TId>(_runtimeCache);
}
}
}
@@ -102,7 +102,7 @@ namespace Umbraco.Core.Cache
// cannot create value within the lock, so if result.IsValueCreated is false, just
// do nothing here - means that if creation throws, a race condition could cause
// more than one thread to reach the return statement below and throw - accepted.
if (result == null || GetSafeLazyValue(result, true) == null) // get non-created as NonCreatedValue & exceptions as null
{
result = GetSafeLazy(getCacheItem);
@@ -122,7 +122,7 @@ namespace Umbraco.Core.Cache
if (eh != null) throw eh.Exception; // throw once!
return value;
}
#endregion
#region Insert
@@ -35,7 +35,7 @@ namespace Umbraco.Core.Cache
{
const string prefix = CacheItemPrefix + "-";
return _cache.Cast<DictionaryEntry>()
.Where(x => x.Key is string && ((string) x.Key).StartsWith(prefix));
.Where(x => x.Key is string && ((string)x.Key).StartsWith(prefix));
}
protected override void RemoveEntry(string key)
@@ -191,7 +191,7 @@ namespace Umbraco.Core.Cache
var value = result.Value; // force evaluation now - this may throw if cacheItem throws, and then nothing goes into cache
if (value == null) return; // do not store null values (backward compat)
cacheKey = GetCacheKey(cacheKey);
cacheKey = GetCacheKey(cacheKey);
var absolute = isSliding ? System.Web.Caching.Cache.NoAbsoluteExpiration : (timeout == null ? System.Web.Caching.Cache.NoAbsoluteExpiration : DateTime.Now.Add(timeout.Value));
var sliding = isSliding == false ? System.Web.Caching.Cache.NoSlidingExpiration : (timeout ?? System.Web.Caching.Cache.NoSlidingExpiration);
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Cache
{
internal interface IRepositoryCachePolicy<TEntity, TId> : IDisposable
where TEntity : class, IAggregateRoot
{
TEntity Get(TId id, Func<TId, TEntity> getFromRepo);
TEntity Get(TId id);
bool Exists(TId id, Func<TId, bool> getFromRepo);
string GetCacheIdKey(object id);
string GetCacheTypeKey();
void CreateOrUpdate(TEntity entity, Action<TEntity> persistMethod);
void Remove(TEntity entity, Action<TEntity> persistMethod);
TEntity[] GetAll(TId[] ids, Func<TId[], IEnumerable<TEntity>> getFromRepo);
}
}
@@ -0,0 +1,9 @@
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Cache
{
internal interface IRepositoryCachePolicyFactory<TEntity, TId> where TEntity : class, IAggregateRoot
{
IRepositoryCachePolicy<TEntity, TId> CreatePolicy();
}
}
@@ -0,0 +1,91 @@
using System;
using System.Collections.Concurrent;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Used to get/create/manipulate isolated runtime cache
/// </summary>
/// <remarks>
/// This is useful for repository level caches to ensure that cache lookups by key are fast so
/// that the repository doesn't need to search through all keys on a global scale.
/// </remarks>
public class IsolatedRuntimeCache
{
private readonly Func<Type, IRuntimeCacheProvider> _cacheFactory;
/// <summary>
/// Constructor that allows specifying a factory for the type of runtime isolated cache to create
/// </summary>
/// <param name="cacheFactory"></param>
public IsolatedRuntimeCache(Func<Type, IRuntimeCacheProvider> cacheFactory)
{
_cacheFactory = cacheFactory;
}
private readonly ConcurrentDictionary<Type, IRuntimeCacheProvider> _isolatedCache = new ConcurrentDictionary<Type, IRuntimeCacheProvider>();
/// <summary>
/// Returns an isolated runtime cache for a given type
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public IRuntimeCacheProvider GetOrCreateCache<T>()
{
return _isolatedCache.GetOrAdd(typeof(T), type => _cacheFactory(type));
}
/// <summary>
/// Returns an isolated runtime cache for a given type
/// </summary>
/// <returns></returns>
public IRuntimeCacheProvider GetOrCreateCache(Type type)
{
return _isolatedCache.GetOrAdd(type, t => _cacheFactory(t));
}
/// <summary>
/// Tries to get a cache by the type specified
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public Attempt<IRuntimeCacheProvider> GetCache<T>()
{
IRuntimeCacheProvider cache;
if (_isolatedCache.TryGetValue(typeof(T), out cache))
{
return Attempt.Succeed(cache);
}
return Attempt<IRuntimeCacheProvider>.Fail();
}
/// <summary>
/// Clears all values inside this isolated runtime cache
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public void ClearCache<T>()
{
IRuntimeCacheProvider cache;
if (_isolatedCache.TryGetValue(typeof(T), out cache))
{
cache.ClearAllCache();
}
}
/// <summary>
/// Clears all of the isolated caches
/// </summary>
public void ClearAllCaches()
{
foreach (var key in _isolatedCache.Keys)
{
IRuntimeCacheProvider cache;
if (_isolatedCache.TryRemove(key, out cache))
{
cache.ClearAllCache();
}
}
}
}
}
@@ -49,7 +49,7 @@ namespace Umbraco.Core.Cache
{
if (MemoryCache[key] == null) return;
MemoryCache.Remove(key);
}
}
}
public virtual void ClearCacheObjectTypes(string typeName)
@@ -137,7 +137,7 @@ namespace Umbraco.Core.Cache
.Select(x => x.Key)
.ToArray()) // ToArray required to remove
MemoryCache.Remove(key);
}
}
}
public virtual void ClearCacheByKeyExpression(string regexString)
@@ -149,7 +149,7 @@ namespace Umbraco.Core.Cache
.Select(x => x.Key)
.ToArray()) // ToArray required to remove
MemoryCache.Remove(key);
}
}
}
#endregion
@@ -201,7 +201,7 @@ namespace Umbraco.Core.Cache
return GetCacheItem(cacheKey, getCacheItem, null);
}
public object GetCacheItem(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal,CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
public object GetCacheItem(string cacheKey, Func<object> getCacheItem, TimeSpan? timeout, bool isSliding = false, CacheItemPriority priority = CacheItemPriority.Normal, CacheItemRemovedCallback removedCallback = null, string[] dependentFiles = null)
{
// see notes in HttpRuntimeCacheProvider
@@ -264,7 +264,7 @@ namespace Umbraco.Core.Cache
{
policy.ChangeMonitors.Add(new HostFileChangeMonitor(dependentFiles.ToList()));
}
if (removedCallback != null)
{
policy.RemovedCallback = arguments =>
@@ -295,6 +295,5 @@ namespace Umbraco.Core.Cache
}
return policy;
}
}
}
@@ -0,0 +1,27 @@
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Creates cache policies
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <typeparam name="TId"></typeparam>
internal class OnlySingleItemsRepositoryCachePolicyFactory<TEntity, TId> : IRepositoryCachePolicyFactory<TEntity, TId>
where TEntity : class, IAggregateRoot
{
private readonly IRuntimeCacheProvider _runtimeCache;
private readonly RepositoryCachePolicyOptions _options;
public OnlySingleItemsRepositoryCachePolicyFactory(IRuntimeCacheProvider runtimeCache, RepositoryCachePolicyOptions options)
{
_runtimeCache = runtimeCache;
_options = options;
}
public virtual IRepositoryCachePolicy<TEntity, TId> CreatePolicy()
{
return new SingleItemsOnlyRepositoryCachePolicy<TEntity, TId>(_runtimeCache, _options);
}
}
}
@@ -1,17 +1,34 @@
namespace Umbraco.Core.Persistence.Repositories
using System;
namespace Umbraco.Core.Cache
{
internal class RepositoryCacheOptions
internal class RepositoryCachePolicyOptions
{
/// <summary>
/// Constructor sets defaults
/// Ctor - sets GetAllCacheValidateCount = true
/// </summary>
public RepositoryCacheOptions()
public RepositoryCachePolicyOptions(Func<int> performCount)
{
PerformCount = performCount;
GetAllCacheValidateCount = true;
GetAllCacheAllowZeroCount = false;
GetAllCacheThresholdLimit = 100;
}
/// <summary>
/// Ctor - sets GetAllCacheValidateCount = false
/// </summary>
public RepositoryCachePolicyOptions()
{
PerformCount = null;
GetAllCacheValidateCount = false;
GetAllCacheAllowZeroCount = false;
}
/// <summary>
/// Callback required to get count for GetAllCacheValidateCount
/// </summary>
public Func<int> PerformCount { get; private set; }
/// <summary>
/// True/false as to validate the total item count when all items are returned from cache, the default is true but this
/// means that a db lookup will occur - though that lookup will probably be significantly less expensive than the normal
@@ -21,16 +38,11 @@ namespace Umbraco.Core.Persistence.Repositories
/// setting this to return false will improve performance of GetAll cache with no params but should only be used
/// for specific circumstances
/// </remarks>
public bool GetAllCacheValidateCount { get; set; }
public bool GetAllCacheValidateCount { get; private set; }
/// <summary>
/// True if the GetAll method will cache that there are zero results so that the db is not hit when there are no results found
/// </summary>
public bool GetAllCacheAllowZeroCount { get; set; }
/// <summary>
/// The threshold entity count for which the GetAll method will cache entities
/// </summary>
public int GetAllCacheThresholdLimit { get; set; }
}
}
@@ -0,0 +1,24 @@
using System.Linq;
using Umbraco.Core.Collections;
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Cache
{
/// <summary>
/// A caching policy that ignores all caches for GetAll - it will only cache calls for individual items
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <typeparam name="TId"></typeparam>
internal class SingleItemsOnlyRepositoryCachePolicy<TEntity, TId> : DefaultRepositoryCachePolicy<TEntity, TId>
where TEntity : class, IAggregateRoot
{
public SingleItemsOnlyRepositoryCachePolicy(IRuntimeCacheProvider cache, RepositoryCachePolicyOptions options) : base(cache, options)
{
}
protected override void SetCacheAction(TId[] ids, TEntity[] entityCollection)
{
//do nothing
}
}
}
+99 -203
View File
@@ -1,6 +1,8 @@
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
@@ -11,20 +13,19 @@ using Umbraco.Core.Logging;
namespace Umbraco.Core
{
/// <summary>
/// Class that is exposed by the ApplicationContext for application wide caching purposes
/// </summary>
public class CacheHelper
{
private readonly bool _enableCache;
private readonly IsolatedRuntimeCache _isolatedCacheManager;
private readonly ICacheProvider _requestCache;
private readonly ICacheProvider _nullRequestCache = new NullCacheProvider();
private static readonly ICacheProvider NullRequestCache = new NullCacheProvider();
private readonly ICacheProvider _staticCache;
private readonly ICacheProvider _nullStaticCache = new NullCacheProvider();
private readonly IRuntimeCacheProvider _httpCache;
private readonly IRuntimeCacheProvider _nullHttpCache = new NullCacheProvider();
private static readonly ICacheProvider NullStaticCache = new NullCacheProvider();
private readonly IRuntimeCacheProvider _runtimeCache;
private static readonly IRuntimeCacheProvider NullRuntimeCache = new NullCacheProvider();
/// <summary>
/// Creates a cache helper with disabled caches
/// </summary>
@@ -34,7 +35,7 @@ namespace Umbraco.Core
/// </remarks>
public static CacheHelper CreateDisabledCacheHelper()
{
return new CacheHelper(null, null, null, false);
return new CacheHelper(NullRuntimeCache, NullStaticCache, NullRequestCache, new IsolatedRuntimeCache(t => NullRuntimeCache));
}
/// <summary>
@@ -44,7 +45,8 @@ namespace Umbraco.Core
: this(
new HttpRuntimeCacheProvider(HttpRuntime.Cache),
new StaticCacheProvider(),
new HttpRequestCacheProvider())
new HttpRequestCacheProvider(),
new IsolatedRuntimeCache(t => new ObjectCacheRuntimeCacheProvider()))
{
}
@@ -56,51 +58,42 @@ namespace Umbraco.Core
: this(
new HttpRuntimeCacheProvider(cache),
new StaticCacheProvider(),
new HttpRequestCacheProvider())
new HttpRequestCacheProvider(),
new IsolatedRuntimeCache(t => new ObjectCacheRuntimeCacheProvider()))
{
}
/// <summary>
/// Initializes a new instance based on the provided providers
/// </summary>
/// <param name="httpCacheProvider"></param>
/// <param name="staticCacheProvider"></param>
/// <param name="requestCacheProvider"></param>
[Obsolete("Use the constructor the specifies all dependencies")]
[EditorBrowsable(EditorBrowsableState.Never)]
public CacheHelper(
IRuntimeCacheProvider httpCacheProvider,
ICacheProvider staticCacheProvider,
ICacheProvider requestCacheProvider)
: this(httpCacheProvider, staticCacheProvider, requestCacheProvider, true)
: this(httpCacheProvider, staticCacheProvider, requestCacheProvider, new IsolatedRuntimeCache(t => new ObjectCacheRuntimeCacheProvider()))
{
}
/// <summary>
/// Private ctor used for creating a disabled cache helper
/// </summary>
/// <param name="httpCacheProvider"></param>
/// <param name="staticCacheProvider"></param>
/// <param name="requestCacheProvider"></param>
/// <param name="enableCache"></param>
private CacheHelper(
/// <summary>
/// Initializes a new instance based on the provided providers
/// </summary>
/// <param name="httpCacheProvider"></param>
/// <param name="staticCacheProvider"></param>
/// <param name="requestCacheProvider"></param>
/// <param name="isolatedCacheManager"></param>
public CacheHelper(
IRuntimeCacheProvider httpCacheProvider,
ICacheProvider staticCacheProvider,
ICacheProvider requestCacheProvider,
bool enableCache)
ICacheProvider requestCacheProvider,
IsolatedRuntimeCache isolatedCacheManager)
{
if (enableCache)
{
_httpCache = httpCacheProvider;
_staticCache = staticCacheProvider;
_requestCache = requestCacheProvider;
}
else
{
_httpCache = null;
_staticCache = null;
_requestCache = null;
}
_enableCache = enableCache;
if (httpCacheProvider == null) throw new ArgumentNullException("httpCacheProvider");
if (staticCacheProvider == null) throw new ArgumentNullException("staticCacheProvider");
if (requestCacheProvider == null) throw new ArgumentNullException("requestCacheProvider");
if (isolatedCacheManager == null) throw new ArgumentNullException("isolatedCacheManager");
_runtimeCache = httpCacheProvider;
_staticCache = staticCacheProvider;
_requestCache = requestCacheProvider;
_isolatedCacheManager = isolatedCacheManager;
}
/// <summary>
@@ -108,15 +101,15 @@ namespace Umbraco.Core
/// </summary>
public ICacheProvider RequestCache
{
get { return _enableCache ? _requestCache : _nullRequestCache; }
get { return _requestCache; }
}
/// <summary>
/// Returns the current Runtime cache
/// </summary>
public ICacheProvider StaticCache
{
get { return _enableCache ? _staticCache : _nullStaticCache; }
get { return _staticCache; }
}
/// <summary>
@@ -124,8 +117,16 @@ namespace Umbraco.Core
/// </summary>
public IRuntimeCacheProvider RuntimeCache
{
get { return _enableCache ? _httpCache : _nullHttpCache; }
get { return _runtimeCache; }
}
/// <summary>
/// Returns the current Isolated Runtime cache manager
/// </summary>
public IsolatedRuntimeCache IsolatedRuntimeCache
{
get { return _isolatedCacheManager; }
}
#region Legacy Runtime/Http Cache accessors
@@ -133,16 +134,11 @@ namespace Umbraco.Core
/// Clears the item in umbraco's runtime cache
/// </summary>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public void ClearAllCache()
{
if (_enableCache == false)
{
_nullHttpCache.ClearAllCache();
}
else
{
_httpCache.ClearAllCache();
}
_runtimeCache.ClearAllCache();
_isolatedCacheManager.ClearAllCaches();
}
/// <summary>
@@ -150,16 +146,10 @@ namespace Umbraco.Core
/// </summary>
/// <param name="key">Key</param>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public void ClearCacheItem(string key)
{
if (_enableCache == false)
{
_nullHttpCache.ClearCacheItem(key);
}
else
{
_httpCache.ClearCacheItem(key);
}
_runtimeCache.ClearCacheItem(key);
}
@@ -171,30 +161,17 @@ namespace Umbraco.Core
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
public void ClearCacheObjectTypes(string typeName)
{
if (_enableCache == false)
{
_nullHttpCache.ClearCacheObjectTypes(typeName);
}
else
{
_httpCache.ClearCacheObjectTypes(typeName);
}
_runtimeCache.ClearCacheObjectTypes(typeName);
}
/// <summary>
/// Clears all objects in the System.Web.Cache with the System.Type specified
/// </summary>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public void ClearCacheObjectTypes<T>()
{
if (_enableCache == false)
{
_nullHttpCache.ClearCacheObjectTypes<T>();
}
else
{
_httpCache.ClearCacheObjectTypes<T>();
}
_runtimeCache.ClearCacheObjectTypes<T>();
}
/// <summary>
@@ -202,16 +179,10 @@ namespace Umbraco.Core
/// </summary>
/// <param name="keyStartsWith">The start of the key</param>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public void ClearCacheByKeySearch(string keyStartsWith)
{
if (_enableCache == false)
{
_nullHttpCache.ClearCacheByKeySearch(keyStartsWith);
}
else
{
_httpCache.ClearCacheByKeySearch(keyStartsWith);
}
_runtimeCache.ClearCacheByKeySearch(keyStartsWith);
}
/// <summary>
@@ -219,29 +190,17 @@ namespace Umbraco.Core
/// </summary>
/// <param name="regexString"></param>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public void ClearCacheByKeyExpression(string regexString)
{
if (_enableCache == false)
{
_nullHttpCache.ClearCacheByKeyExpression(regexString);
}
else
{
_httpCache.ClearCacheByKeyExpression(regexString);
}
_runtimeCache.ClearCacheByKeyExpression(regexString);
}
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public IEnumerable<T> GetCacheItemsByKeySearch<T>(string keyStartsWith)
{
if (_enableCache == false)
{
return _nullHttpCache.GetCacheItemsByKeySearch<T>(keyStartsWith);
}
else
{
return _httpCache.GetCacheItemsByKeySearch<T>(keyStartsWith);
}
return _runtimeCache.GetCacheItemsByKeySearch<T>(keyStartsWith);
}
/// <summary>
@@ -251,16 +210,10 @@ namespace Umbraco.Core
/// <param name="cacheKey"></param>
/// <returns></returns>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public TT GetCacheItem<TT>(string cacheKey)
{
if (_enableCache == false)
{
return _nullHttpCache.GetCacheItem<TT>(cacheKey);
}
else
{
return _httpCache.GetCacheItem<TT>(cacheKey);
}
return _runtimeCache.GetCacheItem<TT>(cacheKey);
}
/// <summary>
@@ -271,16 +224,11 @@ namespace Umbraco.Core
/// <param name="getCacheItem"></param>
/// <returns></returns>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public TT GetCacheItem<TT>(string cacheKey, Func<TT> getCacheItem)
{
if (_enableCache == false)
{
return _nullHttpCache.GetCacheItem<TT>(cacheKey, getCacheItem);
}
else
{
return _httpCache.GetCacheItem<TT>(cacheKey, getCacheItem);
}
return _runtimeCache.GetCacheItem<TT>(cacheKey, getCacheItem);
}
/// <summary>
@@ -292,17 +240,12 @@ namespace Umbraco.Core
/// <param name="getCacheItem"></param>
/// <returns></returns>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public TT GetCacheItem<TT>(string cacheKey,
TimeSpan timeout, Func<TT> getCacheItem)
{
if (_enableCache == false)
{
return _nullHttpCache.GetCacheItem<TT>(cacheKey, getCacheItem, timeout);
}
else
{
return _httpCache.GetCacheItem<TT>(cacheKey, getCacheItem, timeout);
}
return _runtimeCache.GetCacheItem<TT>(cacheKey, getCacheItem, timeout);
}
/// <summary>
@@ -315,18 +258,13 @@ namespace Umbraco.Core
/// <param name="getCacheItem"></param>
/// <returns></returns>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public TT GetCacheItem<TT>(string cacheKey,
CacheItemRemovedCallback refreshAction, TimeSpan timeout,
Func<TT> getCacheItem)
{
if (!_enableCache)
{
return _nullHttpCache.GetCacheItem<TT>(cacheKey, getCacheItem, timeout, removedCallback: refreshAction);
}
else
{
return _httpCache.GetCacheItem<TT>(cacheKey, getCacheItem, timeout, removedCallback: refreshAction);
}
return _runtimeCache.GetCacheItem<TT>(cacheKey, getCacheItem, timeout, removedCallback: refreshAction);
}
/// <summary>
@@ -340,18 +278,13 @@ namespace Umbraco.Core
/// <param name="getCacheItem"></param>
/// <returns></returns>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public TT GetCacheItem<TT>(string cacheKey,
CacheItemPriority priority, CacheItemRemovedCallback refreshAction, TimeSpan timeout,
Func<TT> getCacheItem)
{
if (_enableCache == false)
{
return _nullHttpCache.GetCacheItem<TT>(cacheKey, getCacheItem, timeout, false, priority, refreshAction);
}
else
{
return _httpCache.GetCacheItem<TT>(cacheKey, getCacheItem, timeout, false, priority, refreshAction);
}
return _runtimeCache.GetCacheItem<TT>(cacheKey, getCacheItem, timeout, false, priority, refreshAction);
}
/// <summary>
@@ -373,20 +306,13 @@ namespace Umbraco.Core
TimeSpan timeout,
Func<TT> getCacheItem)
{
if (_enableCache == false)
var cache = _runtimeCache as HttpRuntimeCacheProvider;
if (cache != null)
{
return _nullHttpCache.GetCacheItem<TT>(cacheKey, getCacheItem, timeout, false, priority, refreshAction, null);
}
else
{
var cache = _httpCache as HttpRuntimeCacheProvider;
if (cache != null)
{
var result = cache.GetCacheItem(cacheKey, () => getCacheItem(), timeout, false, priority, refreshAction, cacheDependency);
return result == null ? default(TT) : result.TryConvertTo<TT>().Result;
}
throw new InvalidOperationException("Cannot use this obsoleted overload when the current provider is not of type " + typeof(HttpRuntimeCacheProvider));
var result = cache.GetCacheItem(cacheKey, () => getCacheItem(), timeout, false, priority, refreshAction, cacheDependency);
return result == null ? default(TT) : result.TryConvertTo<TT>().Result;
}
throw new InvalidOperationException("Cannot use this obsoleted overload when the current provider is not of type " + typeof(HttpRuntimeCacheProvider));
}
/// <summary>
@@ -404,20 +330,13 @@ namespace Umbraco.Core
CacheDependency cacheDependency,
Func<TT> getCacheItem)
{
if (!_enableCache)
var cache = _runtimeCache as HttpRuntimeCacheProvider;
if (cache != null)
{
return _nullHttpCache.GetCacheItem<TT>(cacheKey, getCacheItem, null, false, priority, null, null);
}
else
{
var cache = _httpCache as HttpRuntimeCacheProvider;
if (cache != null)
{
var result = cache.GetCacheItem(cacheKey, () => getCacheItem(), null, false, priority, null, cacheDependency);
return result == null ? default(TT) : result.TryConvertTo<TT>().Result;
}
throw new InvalidOperationException("Cannot use this obsoleted overload when the current provider is not of type " + typeof(HttpRuntimeCacheProvider));
var result = cache.GetCacheItem(cacheKey, () => getCacheItem(), null, false, priority, null, cacheDependency);
return result == null ? default(TT) : result.TryConvertTo<TT>().Result;
}
throw new InvalidOperationException("Cannot use this obsoleted overload when the current provider is not of type " + typeof(HttpRuntimeCacheProvider));
}
/// <summary>
@@ -427,18 +346,14 @@ namespace Umbraco.Core
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="getCacheItem"></param>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public void InsertCacheItem<T>(string cacheKey,
CacheItemPriority priority,
Func<T> getCacheItem)
{
if (_enableCache == false)
{
_nullHttpCache.InsertCacheItem<T>(cacheKey, getCacheItem, priority: priority);
}
else
{
_httpCache.InsertCacheItem<T>(cacheKey, getCacheItem, priority: priority);
}
_runtimeCache.InsertCacheItem<T>(cacheKey, getCacheItem, priority: priority);
}
/// <summary>
@@ -449,19 +364,14 @@ namespace Umbraco.Core
/// <param name="priority"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
[Obsolete("Do not use this method, access the runtime cache from the RuntimeCache property")]
[EditorBrowsable(EditorBrowsableState.Never)]
public void InsertCacheItem<T>(string cacheKey,
CacheItemPriority priority,
TimeSpan timeout,
Func<T> getCacheItem)
{
if (_enableCache == false)
{
_nullHttpCache.InsertCacheItem<T>(cacheKey, getCacheItem, timeout, priority: priority);
}
else
{
_httpCache.InsertCacheItem<T>(cacheKey, getCacheItem, timeout, priority: priority);
}
_runtimeCache.InsertCacheItem<T>(cacheKey, getCacheItem, timeout, priority: priority);
}
/// <summary>
@@ -480,19 +390,12 @@ namespace Umbraco.Core
TimeSpan timeout,
Func<T> getCacheItem)
{
if (_enableCache == false)
var cache = _runtimeCache as HttpRuntimeCacheProvider;
if (cache != null)
{
_nullHttpCache.InsertCacheItem<T>(cacheKey, getCacheItem, timeout, priority: priority, dependentFiles:null);
}
else
{
var cache = _httpCache as HttpRuntimeCacheProvider;
if (cache != null)
{
cache.InsertCacheItem(cacheKey, () => getCacheItem(), timeout, false, priority, null, cacheDependency);
}
throw new InvalidOperationException("Cannot use this obsoleted overload when the current provider is not of type " + typeof(HttpRuntimeCacheProvider));
cache.InsertCacheItem(cacheKey, () => getCacheItem(), timeout, false, priority, null, cacheDependency);
}
throw new InvalidOperationException("Cannot use this obsoleted overload when the current provider is not of type " + typeof(HttpRuntimeCacheProvider));
}
/// <summary>
@@ -513,19 +416,12 @@ namespace Umbraco.Core
TimeSpan? timeout,
Func<T> getCacheItem)
{
if (_enableCache == false)
var cache = _runtimeCache as HttpRuntimeCacheProvider;
if (cache != null)
{
_nullHttpCache.InsertCacheItem<T>(cacheKey, getCacheItem, timeout, false, priority, refreshAction, null);
}
else
{
var cache = _httpCache as HttpRuntimeCacheProvider;
if (cache != null)
{
cache.InsertCacheItem(cacheKey, () => getCacheItem(), timeout, false, priority, refreshAction, cacheDependency);
}
throw new InvalidOperationException("Cannot use this obsoleted overload when the current provider is not of type " + typeof(HttpRuntimeCacheProvider));
cache.InsertCacheItem(cacheKey, () => getCacheItem(), timeout, false, priority, refreshAction, cacheDependency);
}
throw new InvalidOperationException("Cannot use this obsoleted overload when the current provider is not of type " + typeof(HttpRuntimeCacheProvider));
}
#endregion
@@ -0,0 +1,108 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Umbraco.Core.Models;
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Collections
{
/// <summary>
/// A List that can be deep cloned with deep cloned elements and can reset the collection's items dirty flags
/// </summary>
/// <typeparam name="T"></typeparam>
internal class DeepCloneableList<T> : List<T>, IDeepCloneable, IRememberBeingDirty
{
/// <summary>
/// Initializes a new instance of the <see cref="T:System.Collections.Generic.List`1"/> class that is empty and has the default initial capacity.
/// </summary>
public DeepCloneableList()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="T:System.Collections.Generic.List`1"/> class that contains elements copied from the specified collection and has sufficient capacity to accommodate the number of elements copied.
/// </summary>
/// <param name="collection">The collection whose elements are copied to the new list.</param><exception cref="T:System.ArgumentNullException"><paramref name="collection"/> is null.</exception>
public DeepCloneableList(IEnumerable<T> collection) : base(collection)
{
}
/// <summary>
/// Creates a new list and adds each element as a deep cloned element if it is of type IDeepCloneable
/// </summary>
/// <returns></returns>
public object DeepClone()
{
var newList = new DeepCloneableList<T>();
foreach (var item in this)
{
var dc = item as IDeepCloneable;
if (dc != null)
{
newList.Add((T) dc.DeepClone());
}
else
{
newList.Add(item);
}
}
return newList;
}
public bool IsDirty()
{
return this.OfType<IRememberBeingDirty>().Any(x => x.IsDirty());
}
public bool WasDirty()
{
return this.OfType<IRememberBeingDirty>().Any(x => x.WasDirty());
}
/// <summary>
/// Always returns false, the list has no properties we need to report
/// </summary>
/// <param name="propName"></param>
/// <returns></returns>
public bool IsPropertyDirty(string propName)
{
return false;
}
/// <summary>
/// Always returns false, the list has no properties we need to report
/// </summary>
/// <param name="propertyName"></param>
/// <returns></returns>
public bool WasPropertyDirty(string propertyName)
{
return false;
}
public void ResetDirtyProperties()
{
foreach (var dc in this.OfType<IRememberBeingDirty>())
{
dc.ResetDirtyProperties();
}
}
public void ForgetPreviouslyDirtyProperties()
{
foreach (var dc in this.OfType<IRememberBeingDirty>())
{
dc.ForgetPreviouslyDirtyProperties();
}
}
public void ResetDirtyProperties(bool rememberPreviouslyChangedProperties)
{
foreach (var dc in this.OfType<IRememberBeingDirty>())
{
dc.ResetDirtyProperties(rememberPreviouslyChangedProperties);
}
}
}
}
+28 -126
View File
@@ -36,7 +36,7 @@ namespace Umbraco.Core.Configuration
//make this volatile so that we can ensure thread safety with a double check lock
private static volatile string _reservedUrlsCache;
private static string _reservedPathsCache;
private static StartsWithContainer _reservedList = new StartsWithContainer();
private static HashSet<string> _reservedList = new HashSet<string>();
private static string _reservedPaths;
private static string _reservedUrls;
//ensure the built on (non-changeable) reserved paths are there at all times
@@ -242,6 +242,7 @@ namespace Umbraco.Core.Configuration
}
}
//TODO: Move these to constants!
public const string UmbracoConnectionName = "umbracoDbDSN";
public const string UmbracoMigrationName = "Umbraco";
@@ -420,14 +421,15 @@ namespace Umbraco.Core.Configuration
/// Gets a value indicating whether the current version of umbraco is configured.
/// </summary>
/// <value><c>true</c> if configured; otherwise, <c>false</c>.</value>
public static bool Configured
[Obsolete("Do not use this, it is no longer in use and will be removed from the codebase in future versions")]
internal static bool Configured
{
get
{
try
{
string configStatus = ConfigurationStatus;
string currentVersion = UmbracoVersion.Current.ToString(3);
string currentVersion = UmbracoVersion.GetSemanticVersion().ToSemanticString();
if (currentVersion != configStatus)
@@ -594,10 +596,7 @@ namespace Umbraco.Core.Configuration
[Obsolete("Use Umbraco.Core.Configuration.UmbracoVersion.Current instead", false)]
public static string CurrentVersion
{
get
{
return UmbracoVersion.Current.ToString(3);
}
get { return UmbracoVersion.GetSemanticVersion().ToSemanticString(); }
}
/// <summary>
@@ -768,38 +767,31 @@ namespace Umbraco.Core.Configuration
// store references to strings to determine changes
_reservedPathsCache = GlobalSettings.ReservedPaths;
_reservedUrlsCache = GlobalSettings.ReservedUrls;
string _root = SystemDirectories.Root.Trim().ToLower();
// add URLs and paths to a new list
StartsWithContainer _newReservedList = new StartsWithContainer();
foreach (string reservedUrl in _reservedUrlsCache.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries))
var newReservedList = new HashSet<string>();
foreach (var reservedUrlTrimmed in _reservedUrlsCache
.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Trim().ToLowerInvariant())
.Where(x => x.IsNullOrWhiteSpace() == false)
.Select(reservedUrl => IOHelper.ResolveUrl(reservedUrl).Trim().EnsureStartsWith("/"))
.Where(reservedUrlTrimmed => reservedUrlTrimmed.IsNullOrWhiteSpace() == false))
{
if (string.IsNullOrWhiteSpace(reservedUrl))
continue;
//resolves the url to support tilde chars
string reservedUrlTrimmed = IOHelper.ResolveUrl(reservedUrl.Trim()).Trim().ToLower();
if (reservedUrlTrimmed.Length > 0)
_newReservedList.Add(reservedUrlTrimmed);
newReservedList.Add(reservedUrlTrimmed);
}
foreach (string reservedPath in _reservedPathsCache.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries))
foreach (var reservedPathTrimmed in _reservedPathsCache
.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Trim().ToLowerInvariant())
.Where(x => x.IsNullOrWhiteSpace() == false)
.Select(reservedPath => IOHelper.ResolveUrl(reservedPath).Trim().EnsureStartsWith("/").EnsureEndsWith("/"))
.Where(reservedPathTrimmed => reservedPathTrimmed.IsNullOrWhiteSpace() == false))
{
bool trimEnd = !reservedPath.EndsWith("/");
if (string.IsNullOrWhiteSpace(reservedPath))
continue;
//resolves the url to support tilde chars
string reservedPathTrimmed = IOHelper.ResolveUrl(reservedPath.Trim()).Trim().ToLower();
if (reservedPathTrimmed.Length > 0)
_newReservedList.Add(reservedPathTrimmed + (reservedPathTrimmed.EndsWith("/") ? "" : "/"));
newReservedList.Add(reservedPathTrimmed);
}
// use the new list from now on
_reservedList = _newReservedList;
_reservedList = newReservedList;
}
}
}
@@ -807,107 +799,17 @@ namespace Umbraco.Core.Configuration
//The url should be cleaned up before checking:
// * If it doesn't contain an '.' in the path then we assume it is a path based URL, if that is the case we should add an trailing '/' because all of our reservedPaths use a trailing '/'
// * We shouldn't be comparing the query at all
var pathPart = url.Split('?')[0];
if (!pathPart.Contains(".") && !pathPart.EndsWith("/"))
var pathPart = url.Split(new[] {'?'}, StringSplitOptions.RemoveEmptyEntries)[0].ToLowerInvariant();
if (pathPart.Contains(".") == false)
{
pathPart += "/";
pathPart = pathPart.EnsureEndsWith('/');
}
// return true if url starts with an element of the reserved list
return _reservedList.StartsWith(pathPart.ToLowerInvariant());
return _reservedList.Any(x => pathPart.InvariantStartsWith(x));
}
/// <summary>
/// Structure that checks in logarithmic time
/// if a given string starts with one of the added keys.
/// </summary>
private class StartsWithContainer
{
/// <summary>Internal sorted list of keys.</summary>
public SortedList<string, string> _list
= new SortedList<string, string>(StartsWithComparator.Instance);
/// <summary>
/// Adds the specified new key.
/// </summary>
/// <param name="newKey">The new key.</param>
public void Add(string newKey)
{
// if the list already contains an element that begins with newKey, return
if (String.IsNullOrEmpty(newKey) || StartsWith(newKey))
return;
// create a new collection, so the old one can still be accessed
SortedList<string, string> newList
= new SortedList<string, string>(_list.Count + 1, StartsWithComparator.Instance);
// add only keys that don't already start with newKey, others are unnecessary
foreach (string key in _list.Keys)
if (!key.StartsWith(newKey))
newList.Add(key, null);
// add the new key
newList.Add(newKey, null);
// update the list (thread safe, _list was never in incomplete state)
_list = newList;
}
/// <summary>
/// Checks if the given string starts with any of the added keys.
/// </summary>
/// <param name="target">The target.</param>
/// <returns>true if a key is found that matches the start of target</returns>
/// <remarks>
/// Runs in O(s*log(n)), with n the number of keys and s the length of target.
/// </remarks>
public bool StartsWith(string target)
{
return _list.ContainsKey(target);
}
/// <summary>Comparator that tests if a string starts with another.</summary>
/// <remarks>Not a real comparator, since it is not reflexive. (x==y does not imply y==x)</remarks>
private sealed class StartsWithComparator : IComparer<string>
{
/// <summary>Default string comparer.</summary>
private readonly static Comparer<string> _stringComparer = Comparer<string>.Default;
/// <summary>Gets an instance of the StartsWithComparator.</summary>
public static readonly StartsWithComparator Instance = new StartsWithComparator();
/// <summary>
/// Tests if whole begins with all characters of part.
/// </summary>
/// <param name="part">The part.</param>
/// <param name="whole">The whole.</param>
/// <returns>
/// Returns 0 if whole starts with part, otherwise performs standard string comparison.
/// </returns>
public int Compare(string part, string whole)
{
// let the default string comparer deal with null or when part is not smaller then whole
if (part == null || whole == null || part.Length >= whole.Length)
return _stringComparer.Compare(part, whole);
////ensure both have a / on the end
//part = part.EndsWith("/") ? part : part + "/";
//whole = whole.EndsWith("/") ? whole : whole + "/";
//if (part.Length >= whole.Length)
// return _stringComparer.Compare(part, whole);
// loop through all characters that part and whole have in common
int pos = 0;
bool match;
do
{
match = (part[pos] == whole[pos]);
} while (match && ++pos < part.Length);
// return result of last comparison
return match ? 0 : (part[pos] < whole[pos] ? -1 : 1);
}
}
}
}
@@ -0,0 +1,16 @@
using System.IO;
using Umbraco.Core.Cache;
using Umbraco.Core.Logging;
namespace Umbraco.Core.Configuration.Grid
{
class GridConfig : IGridConfig
{
public GridConfig(ILogger logger, IRuntimeCacheProvider runtimeCache, DirectoryInfo appPlugins, DirectoryInfo configFolder, bool isDebug)
{
EditorsConfig = new GridEditorsConfig(logger, runtimeCache, appPlugins, configFolder, isDebug);
}
public IGridEditorsConfig EditorsConfig { get; private set; }
}
}
@@ -0,0 +1,78 @@
using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json.Linq;
using Umbraco.Core.Cache;
using Umbraco.Core.Logging;
using Umbraco.Core.Manifest;
using Umbraco.Core.PropertyEditors;
namespace Umbraco.Core.Configuration.Grid
{
class GridEditorsConfig : IGridEditorsConfig
{
private readonly ILogger _logger;
private readonly IRuntimeCacheProvider _runtimeCache;
private readonly DirectoryInfo _appPlugins;
private readonly DirectoryInfo _configFolder;
private readonly bool _isDebug;
public GridEditorsConfig(ILogger logger, IRuntimeCacheProvider runtimeCache, DirectoryInfo appPlugins, DirectoryInfo configFolder, bool isDebug)
{
_logger = logger;
_runtimeCache = runtimeCache;
_appPlugins = appPlugins;
_configFolder = configFolder;
_isDebug = isDebug;
}
public IEnumerable<IGridEditorConfig> Editors
{
get
{
Func<List<GridEditor>> getResult = () =>
{
var editors = new List<GridEditor>();
var gridConfig = Path.Combine(_configFolder.FullName, "grid.editors.config.js");
if (File.Exists(gridConfig))
{
try
{
var arr = JArray.Parse(File.ReadAllText(gridConfig));
//ensure the contents parse correctly to objects
var parsed = ManifestParser.GetGridEditors(arr);
editors.AddRange(parsed);
}
catch (Exception ex)
{
_logger.Error<GridEditorsConfig>("Could not parse the contents of grid.editors.config.js into a JSON array", ex);
}
}
var parser = new ManifestParser(_appPlugins, _runtimeCache);
var builder = new ManifestBuilder(_runtimeCache, parser);
foreach (var gridEditor in builder.GridEditors)
{
//no duplicates! (based on alias)
if (editors.Contains(gridEditor) == false)
{
editors.Add(gridEditor);
}
}
return editors;
};
//cache the result if debugging is disabled
var result = _isDebug
? getResult()
: _runtimeCache.GetCacheItem<List<GridEditor>>(
typeof(GridEditorsConfig) + "Editors",
() => getResult(),
TimeSpan.FromMinutes(10));
return result;
}
}
}
}
@@ -0,0 +1,14 @@
using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Umbraco.Core.Configuration.Grid
{
public interface IGridConfig
{
IGridEditorsConfig EditorsConfig { get; }
}
}
@@ -0,0 +1,15 @@
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
namespace Umbraco.Core.Configuration.Grid
{
public interface IGridEditorConfig
{
string Name { get; }
string Alias { get; }
string View { get; }
string Render { get; }
string Icon { get; }
IDictionary<string, object> Config { get; }
}
}
@@ -0,0 +1,9 @@
using System.Collections.Generic;
namespace Umbraco.Core.Configuration.Grid
{
public interface IGridEditorsConfig
{
IEnumerable<IGridEditorConfig> Editors { get; }
}
}
@@ -2,10 +2,13 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Threading;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration.BaseRest;
using Umbraco.Core.Configuration.Dashboard;
using Umbraco.Core.Configuration.Grid;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.Logging;
@@ -67,6 +70,7 @@ namespace Umbraco.Core.Configuration
private IDashboardSection _dashboardSection;
private IUmbracoSettingsSection _umbracoSettings;
private IBaseRestSection _baseRestExtensions;
private IGridConfig _gridConfig;
/// <summary>
/// Gets the IDashboardSection
@@ -140,6 +144,28 @@ namespace Umbraco.Core.Configuration
return _baseRestExtensions;
}
/// <summary>
/// Only for testing
/// </summary>
/// <param name="value"></param>
public void SetGridConfig(IGridConfig value)
{
_gridConfig = value;
}
/// <summary>
/// Gets the IGridConfig
/// </summary>
public IGridConfig GridConfig(ILogger logger, IRuntimeCacheProvider runtimeCache, DirectoryInfo appPlugins, DirectoryInfo configFolder, bool isDebug)
{
if (_gridConfig == null)
{
_gridConfig = new GridConfig(logger, runtimeCache, appPlugins, configFolder, isDebug);
}
return _gridConfig;
}
//TODO: Add other configurations here !
}
}
@@ -11,6 +11,8 @@
bool DisableFindContentByIdPath { get; }
string UrlProviderMode { get; }
string UmbracoApplicationUrl { get; }
}
}
@@ -30,8 +30,13 @@ namespace Umbraco.Core.Configuration.UmbracoSettings
[ConfigurationProperty("urlProviderMode", DefaultValue = "AutoLegacy")]
public string UrlProviderMode
{
get { return (string)base["urlProviderMode"]; }
get { return (string) base["urlProviderMode"]; }
}
[ConfigurationProperty("umbracoApplicationUrl", DefaultValue = null)]
public string UmbracoApplicationUrl
{
get { return (string)base["umbracoApplicationUrl"]; }
}
}
}
@@ -1,11 +1,12 @@
using System;
using System.Reflection;
using Semver;
namespace Umbraco.Core.Configuration
{
public class UmbracoVersion
{
private static readonly Version Version = new Version("7.3.0");
private static readonly Version Version = new Version("7.3.5");
/// <summary>
/// Gets the current version of Umbraco.
@@ -23,10 +24,20 @@ namespace Umbraco.Core.Configuration
/// Gets the version comment (like beta or RC).
/// </summary>
/// <value>The version comment.</value>
public static string CurrentComment { get { return "beta"; } }
public static string CurrentComment { get { return ""; } }
// Get the version of the umbraco.dll by looking at a class in that dll
// Had to do it like this due to medium trust issues, see: http://haacked.com/archive/2010/11/04/assembly-location-and-medium-trust.aspx
public static string AssemblyVersion { get { return new AssemblyName(typeof(ActionsResolver).Assembly.FullName).Version.ToString(); } }
public static SemVersion GetSemanticVersion()
{
return new SemVersion(
Current.Major,
Current.Minor,
Current.Build,
CurrentComment.IsNullOrWhiteSpace() ? null : CurrentComment,
Current.Revision > 0 ? Current.Revision.ToInvariantString() : null);
}
}
}
+1 -1
View File
@@ -43,7 +43,7 @@
public const string Users = "users";
/// <summary>
/// Application alias for the users section.
/// Application alias for the forms section.
/// </summary>
public const string Forms = "forms";
}
+2 -1
View File
@@ -27,6 +27,7 @@ namespace Umbraco.Core
/// <summary>
/// The root id for all top level dictionary items
/// </summary>
[Obsolete("There is no dictionary root item id anymore, it is simply null")]
public const string DictionaryItemRootId = "41c7638d-f529-4bff-853e-59a0c2fb1bde";
}
@@ -205,7 +206,7 @@ namespace Umbraco.Core
/// </summary>
internal const string StandardPropertiesGroupName = "Membership";
internal static Dictionary<string, PropertyType> GetStandardPropertyTypeStubs()
public static Dictionary<string, PropertyType> GetStandardPropertyTypeStubs()
{
return new Dictionary<string, PropertyType>
{
+73 -68
View File
@@ -2,91 +2,96 @@
namespace Umbraco.Core
{
public static partial class Constants
{
/// <summary>
/// Defines the identifiers for Umbraco object types as constants for easy centralized access/management.
/// </summary>
public static class ObjectTypes
{
/// <summary>
/// Guid for a Content Item object.
/// </summary>
public const string ContentItem = "10E2B09F-C28B-476D-B77A-AA686435E44A";
public static partial class Constants
{
/// <summary>
/// Defines the identifiers for Umbraco object types as constants for easy centralized access/management.
/// </summary>
public static class ObjectTypes
{
/// <summary>
/// Guid for a Content Item object.
/// </summary>
public const string ContentItem = "10E2B09F-C28B-476D-B77A-AA686435E44A";
/// <summary>
/// Guid for a Content Item Type object.
/// </summary>
public const string ContentItemType = "7A333C54-6F43-40A4-86A2-18688DC7E532";
/// <summary>
/// Guid for a Content Item Type object.
/// </summary>
public const string ContentItemType = "7A333C54-6F43-40A4-86A2-18688DC7E532";
/// <summary>
/// Guid for the Content Recycle Bin.
/// </summary>
public const string ContentRecycleBin = "01BB7FF2-24DC-4C0C-95A2-C24EF72BBAC8";
/// <summary>
/// Guid for the Content Recycle Bin.
/// </summary>
public const string ContentRecycleBin = "01BB7FF2-24DC-4C0C-95A2-C24EF72BBAC8";
/// <summary>
/// Guid for a DataType object.
/// </summary>
public const string DataType = "30A2A501-1978-4DDB-A57B-F7EFED43BA3C";
/// <summary>
/// Guid for a DataType object.
/// </summary>
public const string DataType = "30A2A501-1978-4DDB-A57B-F7EFED43BA3C";
/// <summary>
/// Guid for a Document object.
/// </summary>
public const string Document = "C66BA18E-EAF3-4CFF-8A22-41B16D66A972";
/// <summary>
/// Guid for a Document object.
/// </summary>
public const string Document = "C66BA18E-EAF3-4CFF-8A22-41B16D66A972";
/// <summary>
/// Guid for a Document Type object.
/// </summary>
public const string DocumentType = "A2CB7800-F571-4787-9638-BC48539A0EFB";
/// <summary>
/// Guid for a Document Type object.
/// </summary>
public const string DocumentType = "A2CB7800-F571-4787-9638-BC48539A0EFB";
/// <summary>
/// Guid for a Media object.
/// </summary>
public const string Media = "B796F64C-1F99-4FFB-B886-4BF4BC011A9C";
/// <summary>
/// Guid for a Media object.
/// </summary>
public const string Media = "B796F64C-1F99-4FFB-B886-4BF4BC011A9C";
/// <summary>
/// Guid for the Media Recycle Bin.
/// </summary>
public const string MediaRecycleBin = "CF3D8E34-1C1C-41e9-AE56-878B57B32113";
/// <summary>
/// Guid for the Media Recycle Bin.
/// </summary>
public const string MediaRecycleBin = "CF3D8E34-1C1C-41e9-AE56-878B57B32113";
/// <summary>
/// Guid for a Media Type object.
/// </summary>
public const string MediaType = "4EA4382B-2F5A-4C2B-9587-AE9B3CF3602E";
/// <summary>
/// Guid for a Media Type object.
/// </summary>
public const string MediaType = "4EA4382B-2F5A-4C2B-9587-AE9B3CF3602E";
/// <summary>
/// Guid for a Member object.
/// </summary>
public const string Member = "39EB0F98-B348-42A1-8662-E7EB18487560";
/// <summary>
/// Guid for a Member object.
/// </summary>
public const string Member = "39EB0F98-B348-42A1-8662-E7EB18487560";
/// <summary>
/// Guid for a Member Group object.
/// </summary>
public const string MemberGroup = "366E63B9-880F-4E13-A61C-98069B029728";
/// <summary>
/// Guid for a Member Group object.
/// </summary>
public const string MemberGroup = "366E63B9-880F-4E13-A61C-98069B029728";
/// <summary>
/// Guid for a Member Type object.
/// </summary>
public const string MemberType = "9B5416FB-E72F-45A9-A07B-5A9A2709CE43";
/// <summary>
/// Guid for a Member Type object.
/// </summary>
public const string MemberType = "9B5416FB-E72F-45A9-A07B-5A9A2709CE43";
/// <summary>
/// Guid for a Stylesheet object.
/// </summary>
/// <summary>
/// Guid for a Stylesheet object.
/// </summary>
[Obsolete("This no longer exists in the database")]
public const string Stylesheet = "9F68DA4F-A3A8-44C2-8226-DCBD125E4840";
[Obsolete("This no longer exists in the database")]
internal const string StylesheetProperty = "5555da4f-a123-42b2-4488-dcdfb25e4111";
/// <summary>
/// Guid for the System Root.
/// </summary>
public const string SystemRoot = "EA7D8624-4CFE-4578-A871-24AA946BF34D";
/// <summary>
/// Guid for the System Root.
/// </summary>
public const string SystemRoot = "EA7D8624-4CFE-4578-A871-24AA946BF34D";
/// <summary>
/// Guid for a Template object.
/// </summary>
public const string Template = "6FBDE604-4178-42CE-A10B-8A2600A2F07D";
}
}
/// <summary>
/// Guid for a Template object.
/// </summary>
public const string Template = "6FBDE604-4178-42CE-A10B-8A2600A2F07D";
/// <summary>
/// Guid for a Lock object.
/// </summary>
public const string LockObject = "87A9F1FF-B1E4-4A25-BABB-465A4A47EC41";
}
}
}
@@ -310,13 +310,13 @@ namespace Umbraco.Core
public const string TextboxAlias = "Umbraco.Textbox";
/// <summary>
/// Guid for the Textbox multiple datatype.
/// Guid for the Textarea datatype.
/// </summary>
[Obsolete("GUIDs are no longer used to reference Property Editors, use the Alias constant instead. This will be removed in future versions")]
public const string TextboxMultiple = "67DB8357-EF57-493E-91AC-936D305E0F2A";
/// <summary>
/// Alias for the Textbox multiple datatype.
/// Alias for the Textarea datatype.
/// </summary>
public const string TextboxMultipleAlias = "Umbraco.TextboxMultiple";
+2
View File
@@ -26,6 +26,8 @@
public const int DefaultMediaListViewDataTypeId = -96;
public const int DefaultMembersListViewDataTypeId = -97;
// identifiers for lock objects
public const int ServersLock = -331;
}
}
}
+7 -1
View File
@@ -1,4 +1,7 @@
namespace Umbraco.Core
using System;
using System.ComponentModel;
namespace Umbraco.Core
{
public static partial class Constants
{
@@ -15,6 +18,8 @@
/// <summary>
/// The auth cookie name
/// </summary>
[Obsolete("DO NOT USE THIS, USE ISecuritySection.AuthCookieName, this will be removed in future versions")]
[EditorBrowsable(EditorBrowsableState.Never)]
public const string AuthCookieName = "UMB_UCONTEXT";
}
@@ -26,6 +31,7 @@
public const string BackOfficeExternalAuthenticationType = "UmbracoExternalCookie";
public const string BackOfficeExternalCookieName = "UMB_EXTLOGIN";
public const string BackOfficeTokenAuthenticationType = "UmbracoBackOfficeToken";
public const string BackOfficeTwoFactorAuthenticationType = "UmbracoTwoFactorCookie";
/// <summary>
/// The prefix used for external identity providers for their authentication type
+198 -69
View File
@@ -2,10 +2,13 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Web;
using AutoMapper;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration;
using Umbraco.Core.Events;
using Umbraco.Core.Exceptions;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Models.Mapping;
@@ -39,15 +42,15 @@ namespace Umbraco.Core
/// </remarks>
public class CoreBootManager : IBootManager
{
private ProfilingLogger _profilingLogger;
protected ProfilingLogger ProfilingLogger { get; private set; }
private DisposableTimer _timer;
private bool _isInitialized = false;
private bool _isStarted = false;
private bool _isComplete = false;
private readonly IServiceProvider _serviceProvider = new ActivatorServiceProvider();
private readonly UmbracoApplicationBase _umbracoApplication;
protected ApplicationContext ApplicationContext { get; set; }
protected CacheHelper ApplicationCache { get; set; }
protected ApplicationContext ApplicationContext { get; private set; }
protected CacheHelper ApplicationCache { get; private set; }
protected PluginManager PluginManager { get; private set; }
protected UmbracoApplicationBase UmbracoApplication
@@ -66,6 +69,14 @@ namespace Umbraco.Core
_umbracoApplication = umbracoApplication;
}
internal CoreBootManager(UmbracoApplicationBase umbracoApplication, ProfilingLogger logger)
{
if (umbracoApplication == null) throw new ArgumentNullException("umbracoApplication");
if (logger == null) throw new ArgumentNullException("logger");
_umbracoApplication = umbracoApplication;
ProfilingLogger = logger;
}
public virtual IBootManager Initialize()
{
if (_isInitialized)
@@ -74,15 +85,17 @@ namespace Umbraco.Core
InitializeLoggerResolver();
InitializeProfilerResolver();
_profilingLogger = new ProfilingLogger(LoggerResolver.Current.Logger, ProfilerResolver.Current.Profiler);
ProfilingLogger = ProfilingLogger?? new ProfilingLogger(LoggerResolver.Current.Logger, ProfilerResolver.Current.Profiler);
_timer = _profilingLogger.TraceDuration<CoreBootManager>("Umbraco application starting", "Umbraco application startup complete");
_timer = ProfilingLogger.TraceDuration<CoreBootManager>(
string.Format("Umbraco {0} application starting on {1}", UmbracoVersion.GetSemanticVersion().ToSemanticString(), NetworkHelper.MachineName),
"Umbraco application startup complete");
CreateApplicationCache();
ApplicationCache = CreateApplicationCache();
//create and set the plugin manager (I'd much prefer to not use this singleton anymore but many things are using it unfortunately and
// the way that it is setup, there must only ever be one per app so without IoC it would be hard to make this not a singleton)
PluginManager = new PluginManager(ServiceProvider, ApplicationCache.RuntimeCache, _profilingLogger);
PluginManager = new PluginManager(ServiceProvider, ApplicationCache.RuntimeCache, ProfilingLogger);
PluginManager.Current = PluginManager;
//Create the legacy prop-eds mapping
@@ -90,38 +103,48 @@ namespace Umbraco.Core
LegacyParameterEditorAliasConverter.CreateMappingsForCoreEditors();
//create database and service contexts for the app context
var dbFactory = new DefaultDatabaseFactory(GlobalSettings.UmbracoConnectionName, LoggerResolver.Current.Logger);
var dbFactory = new DefaultDatabaseFactory(GlobalSettings.UmbracoConnectionName, ProfilingLogger.Logger);
Database.Mapper = new PetaPocoMapper();
var dbContext = new DatabaseContext(
dbFactory,
LoggerResolver.Current.Logger,
SqlSyntaxProviders.CreateDefault(LoggerResolver.Current.Logger));
ProfilingLogger.Logger,
SqlSyntaxProviders.CreateDefault(ProfilingLogger.Logger));
//initialize the DatabaseContext
dbContext.Initialize();
var serviceContext = new ServiceContext(
new RepositoryFactory(ApplicationCache, LoggerResolver.Current.Logger, dbContext.SqlSyntax, UmbracoConfig.For.UmbracoSettings()),
new PetaPocoUnitOfWorkProvider(dbFactory),
new FileUnitOfWorkProvider(),
new PublishingStrategy(),
ApplicationCache,
LoggerResolver.Current.Logger);
CreateApplicationContext(dbContext, serviceContext);
//get the service context
var serviceContext = CreateServiceContext(dbContext, dbFactory);
//set property and singleton from response
ApplicationContext.Current = ApplicationContext = CreateApplicationContext(dbContext, serviceContext);
InitializeApplicationEventsResolver();
InitializeResolvers();
InitializeModelMappers();
//now we need to call the initialize methods
ApplicationEventsResolver.Current.ApplicationEventHandlers
.ForEach(x => x.OnApplicationInitialized(UmbracoApplication, ApplicationContext));
using (ProfilingLogger.DebugDuration<CoreBootManager>(
string.Format("Executing {0} IApplicationEventHandler.OnApplicationInitialized", ApplicationEventsResolver.Current.ApplicationEventHandlers.Count()),
"Finished executing IApplicationEventHandler.OnApplicationInitialized"))
{
//now we need to call the initialize methods
ApplicationEventsResolver.Current.ApplicationEventHandlers
.ForEach(x =>
{
try
{
x.OnApplicationInitialized(UmbracoApplication, ApplicationContext);
}
catch (Exception ex)
{
ProfilingLogger.Logger.Error<CoreBootManager>("An error occurred running OnApplicationInitialized for handler " + x.GetType(), ex);
throw;
}
});
}
_isInitialized = true;
@@ -129,28 +152,54 @@ namespace Umbraco.Core
}
/// <summary>
/// Creates and assigns the application context singleton
/// Creates and returns the service context for the app
/// </summary>
/// <param name="dbContext"></param>
/// <param name="serviceContext"></param>
protected virtual void CreateApplicationContext(DatabaseContext dbContext, ServiceContext serviceContext)
/// <param name="dbFactory"></param>
/// <returns></returns>
protected virtual ServiceContext CreateServiceContext(DatabaseContext dbContext, IDatabaseFactory dbFactory)
{
//create the ApplicationContext
ApplicationContext = ApplicationContext.Current = new ApplicationContext(dbContext, serviceContext, ApplicationCache, _profilingLogger);
//default transient factory
var msgFactory = new TransientMessagesFactory();
return new ServiceContext(
new RepositoryFactory(ApplicationCache, ProfilingLogger.Logger, dbContext.SqlSyntax, UmbracoConfig.For.UmbracoSettings()),
new PetaPocoUnitOfWorkProvider(dbFactory),
new FileUnitOfWorkProvider(),
new PublishingStrategy(msgFactory, ProfilingLogger.Logger),
ApplicationCache,
ProfilingLogger.Logger,
msgFactory);
}
/// <summary>
/// Creates and assigns the ApplicationCache based on a new instance of System.Web.Caching.Cache
/// Creates and returns the application context for the app
/// </summary>
protected virtual void CreateApplicationCache()
/// <param name="dbContext"></param>
/// <param name="serviceContext"></param>
protected virtual ApplicationContext CreateApplicationContext(DatabaseContext dbContext, ServiceContext serviceContext)
{
//create the ApplicationContext
return new ApplicationContext(dbContext, serviceContext, ApplicationCache, ProfilingLogger);
}
/// <summary>
/// Creates and returns the CacheHelper for the app
/// </summary>
protected virtual CacheHelper CreateApplicationCache()
{
var cacheHelper = new CacheHelper(
new ObjectCacheRuntimeCacheProvider(),
new StaticCacheProvider(),
//we need to have the dep clone runtime cache provider to ensure
//all entities are cached properly (cloned in and cloned out)
new DeepCloneRuntimeCacheProvider(new ObjectCacheRuntimeCacheProvider()),
new StaticCacheProvider(),
//we have no request based cache when not running in web-based context
new NullCacheProvider());
new NullCacheProvider(),
new IsolatedRuntimeCache(type =>
//we need to have the dep clone runtime cache provider to ensure
//all entities are cached properly (cloned in and cloned out)
new DeepCloneRuntimeCacheProvider(new ObjectCacheRuntimeCacheProvider())));
ApplicationCache = cacheHelper;
return cacheHelper;
}
/// <summary>
@@ -176,7 +225,7 @@ namespace Umbraco.Core
/// </summary>
protected virtual void InitializeLoggerResolver()
{
LoggerResolver.Current = new LoggerResolver(Logger.CreateWithDefaultLog4NetConfiguration())
LoggerResolver.Current = new LoggerResolver(ProfilingLogger == null ? Logger.CreateWithDefaultLog4NetConfiguration() : ProfilingLogger.Logger)
{
//This is another special resolver that needs to be resolvable before resolution is frozen
//since it is used for profiling the application startup
@@ -190,7 +239,7 @@ namespace Umbraco.Core
protected virtual void InitializeProfilerResolver()
{
//By default we'll initialize the Log profiler (in the web project, we'll override with the web profiler)
ProfilerResolver.Current = new ProfilerResolver(new LogProfiler(LoggerResolver.Current.Logger))
ProfilerResolver.Current = new ProfilerResolver(ProfilingLogger == null ? new LogProfiler(LoggerResolver.Current.Logger) : ProfilingLogger.Profiler)
{
//This is another special resolver that needs to be resolvable before resolution is frozen
//since it is used for profiling the application startup
@@ -211,7 +260,7 @@ namespace Umbraco.Core
//... and set the special flag to let us resolve before frozen resolution
ApplicationEventsResolver.Current = new ApplicationEventsResolver(
ServiceProvider,
LoggerResolver.Current.Logger,
ProfilingLogger.Logger,
PluginManager.ResolveApplicationStartupHandlers())
{
CanResolveBeforeFrozen = true
@@ -226,7 +275,7 @@ namespace Umbraco.Core
/// <param name="rootPath">Absolute</param>
protected virtual void InitializeApplicationRootPath(string rootPath)
{
Umbraco.Core.IO.IOHelper.SetRootDirectory(rootPath);
IOHelper.SetRootDirectory(rootPath);
}
/// <summary>
@@ -240,11 +289,27 @@ namespace Umbraco.Core
if (_isStarted)
throw new InvalidOperationException("The boot manager has already been initialized");
//call OnApplicationStarting of each application events handler
ApplicationEventsResolver.Current.ApplicationEventHandlers
.ForEach(x => x.OnApplicationStarting(UmbracoApplication, ApplicationContext));
using (ProfilingLogger.DebugDuration<CoreBootManager>(
string.Format("Executing {0} IApplicationEventHandler.OnApplicationStarting", ApplicationEventsResolver.Current.ApplicationEventHandlers.Count()),
"Finished executing IApplicationEventHandler.OnApplicationStarting"))
{
//call OnApplicationStarting of each application events handler
ApplicationEventsResolver.Current.ApplicationEventHandlers
.ForEach(x =>
{
try
{
x.OnApplicationStarting(UmbracoApplication, ApplicationContext);
}
catch (Exception ex)
{
ProfilingLogger.Logger.Error<CoreBootManager>("An error occurred running OnApplicationStarting for handler " + x.GetType(), ex);
throw;
}
});
}
if (afterStartup != null)
if (afterStartup != null)
{
afterStartup(ApplicationContext.Current);
}
@@ -263,12 +328,37 @@ namespace Umbraco.Core
{
if (_isComplete)
throw new InvalidOperationException("The boot manager has already been completed");
FreezeResolution();
//call OnApplicationStarting of each application events handler
ApplicationEventsResolver.Current.ApplicationEventHandlers
.ForEach(x => x.OnApplicationStarted(UmbracoApplication, ApplicationContext));
//Here we need to make sure the db can be connected to
EnsureDatabaseConnection();
//This is a special case for the user service, we need to tell it if it's an upgrade, if so we need to ensure that
// exceptions are bubbled up if a user is attempted to be persisted during an upgrade (i.e. when they auth to login)
((UserService) ApplicationContext.Services.UserService).IsUpgrading = true;
using (ProfilingLogger.DebugDuration<CoreBootManager>(
string.Format("Executing {0} IApplicationEventHandler.OnApplicationStarted", ApplicationEventsResolver.Current.ApplicationEventHandlers.Count()),
"Finished executing IApplicationEventHandler.OnApplicationStarted"))
{
//call OnApplicationStarting of each application events handler
ApplicationEventsResolver.Current.ApplicationEventHandlers
.ForEach(x =>
{
try
{
x.OnApplicationStarted(UmbracoApplication, ApplicationContext);
}
catch (Exception ex)
{
ProfilingLogger.Logger.Error<CoreBootManager>("An error occurred running OnApplicationStarted for handler " + x.GetType(), ex);
throw;
}
});
}
//Now, startup all of our legacy startup handler
ApplicationEventsResolver.Current.InstantiateLegacyStartupHandlers();
@@ -286,6 +376,36 @@ namespace Umbraco.Core
//stop the timer and log the output
_timer.Dispose();
return this;
}
/// <summary>
/// We cannot continue if the db cannot be connected to
/// </summary>
private void EnsureDatabaseConnection()
{
if (ApplicationContext.IsConfigured == false) return;
if (ApplicationContext.DatabaseContext.IsDatabaseConfigured == false) return;
//try now
if (ApplicationContext.DatabaseContext.CanConnect)
return;
var currentTry = 0;
while (currentTry < 5)
{
//first wait, then retry
Thread.Sleep(1000);
if (ApplicationContext.DatabaseContext.CanConnect)
break;
currentTry++;
}
if (currentTry == 5)
{
throw new UmbracoStartupFailedException("Umbraco cannot start. A connection string is configured but the Umbraco cannot connect to the database.");
}
}
/// <summary>
@@ -305,12 +425,12 @@ namespace Umbraco.Core
ApplicationCache.RuntimeCache,
new ManifestParser(new DirectoryInfo(IOHelper.MapPath("~/App_Plugins")), ApplicationCache.RuntimeCache));
PropertyEditorResolver.Current = new PropertyEditorResolver(ServiceProvider, LoggerResolver.Current.Logger, () => PluginManager.ResolvePropertyEditors(), builder);
ParameterEditorResolver.Current = new ParameterEditorResolver(ServiceProvider, LoggerResolver.Current.Logger, () => PluginManager.ResolveParameterEditors(), builder);
PropertyEditorResolver.Current = new PropertyEditorResolver(ServiceProvider, ProfilingLogger.Logger, () => PluginManager.ResolvePropertyEditors(), builder);
ParameterEditorResolver.Current = new ParameterEditorResolver(ServiceProvider, ProfilingLogger.Logger, () => PluginManager.ResolveParameterEditors(), builder);
//setup the validators resolver with our predefined validators
ValidatorsResolver.Current = new ValidatorsResolver(
ServiceProvider, LoggerResolver.Current.Logger, new[]
ServiceProvider, ProfilingLogger.Logger, new[]
{
new Lazy<Type>(() => typeof (RequiredManifestValueValidator)),
new Lazy<Type>(() => typeof (RegexValidator)),
@@ -319,67 +439,76 @@ namespace Umbraco.Core
new Lazy<Type>(() => typeof (IntegerValidator)),
});
//by default we'll use the standard configuration based sync
ServerRegistrarResolver.Current = new ServerRegistrarResolver(
new ConfigServerRegistrar());
//by default we'll use the db server registrar unless the developer has the legacy
// dist calls enabled, in which case we'll use the config server registrar
if (UmbracoConfig.For.UmbracoSettings().DistributedCall.Enabled)
{
ServerRegistrarResolver.Current = new ServerRegistrarResolver(new ConfigServerRegistrar());
}
else
{
ServerRegistrarResolver.Current = new ServerRegistrarResolver(
new DatabaseServerRegistrar(
new Lazy<IServerRegistrationService>(() => ApplicationContext.Services.ServerRegistrationService),
new DatabaseServerRegistrarOptions()));
}
//by default (outside of the web) we'll use the default server messenger without
//supplying a username/password, this will automatically disable distributed calls
// .. we'll override this in the WebBootManager
//by default we'll use the database server messenger with default options (no callbacks),
// this will be overridden in the web startup
ServerMessengerResolver.Current = new ServerMessengerResolver(
new WebServiceServerMessenger());
new DatabaseServerMessenger(ApplicationContext, true, new DatabaseServerMessengerOptions()));
MappingResolver.Current = new MappingResolver(
ServiceProvider, LoggerResolver.Current.Logger,
ServiceProvider, ProfilingLogger.Logger,
() => PluginManager.ResolveAssignedMapperTypes());
//RepositoryResolver.Current = new RepositoryResolver(
// new RepositoryFactory(ApplicationCache));
CacheRefreshersResolver.Current = new CacheRefreshersResolver(
ServiceProvider, LoggerResolver.Current.Logger,
ServiceProvider, ProfilingLogger.Logger,
() => PluginManager.ResolveCacheRefreshers());
DataTypesResolver.Current = new DataTypesResolver(
ServiceProvider, LoggerResolver.Current.Logger,
ServiceProvider, ProfilingLogger.Logger,
() => PluginManager.ResolveDataTypes());
MacroFieldEditorsResolver.Current = new MacroFieldEditorsResolver(
ServiceProvider, LoggerResolver.Current.Logger,
ServiceProvider, ProfilingLogger.Logger,
() => PluginManager.ResolveMacroRenderings());
PackageActionsResolver.Current = new PackageActionsResolver(
ServiceProvider, LoggerResolver.Current.Logger,
ServiceProvider, ProfilingLogger.Logger,
() => PluginManager.ResolvePackageActions());
ActionsResolver.Current = new ActionsResolver(
ServiceProvider, LoggerResolver.Current.Logger,
ServiceProvider, ProfilingLogger.Logger,
() => PluginManager.ResolveActions());
//the database migration objects
MigrationResolver.Current = new MigrationResolver(
LoggerResolver.Current.Logger,
ProfilingLogger.Logger,
() => PluginManager.ResolveTypes<IMigration>());
// todo: remove once we drop IPropertyEditorValueConverter support.
PropertyEditorValueConvertersResolver.Current = new PropertyEditorValueConvertersResolver(
ServiceProvider, LoggerResolver.Current.Logger,
ServiceProvider, ProfilingLogger.Logger,
PluginManager.ResolvePropertyEditorValueConverters());
// need to filter out the ones we dont want!!
PropertyValueConvertersResolver.Current = new PropertyValueConvertersResolver(
ServiceProvider, LoggerResolver.Current.Logger,
ServiceProvider, ProfilingLogger.Logger,
PluginManager.ResolveTypes<IPropertyValueConverter>());
// use the new DefaultShortStringHelper
ShortStringHelperResolver.Current = new ShortStringHelperResolver(
//new LegacyShortStringHelper());
new DefaultShortStringHelper().WithDefaultConfig());
new DefaultShortStringHelper(UmbracoConfig.For.UmbracoSettings()).WithDefaultConfig());
UrlSegmentProviderResolver.Current = new UrlSegmentProviderResolver(
ServiceProvider, LoggerResolver.Current.Logger,
ServiceProvider, ProfilingLogger.Logger,
typeof(DefaultUrlSegmentProvider));
// by default, no factory is activated
+65 -34
View File
@@ -6,6 +6,7 @@ using System.Linq;
using System.Web;
using System.Web.Configuration;
using System.Xml.Linq;
using Semver;
using Umbraco.Core.Configuration;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
@@ -13,6 +14,7 @@ using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.Migrations;
using Umbraco.Core.Persistence.Migrations.Initial;
using Umbraco.Core.Persistence.SqlSyntax;
using Umbraco.Core.Services;
namespace Umbraco.Core
{
@@ -28,8 +30,6 @@ namespace Umbraco.Core
private readonly ILogger _logger;
private readonly SqlSyntaxProviders _syntaxProviders;
private bool _configured;
private bool _canConnect;
private volatile bool _connectCheck = false;
private readonly object _locker = new object();
private string _connectionString;
private string _providerName;
@@ -90,7 +90,7 @@ namespace Umbraco.Core
/// This should not be used for CRUD operations or queries against the
/// standard Umbraco tables! Use the Public services for that.
/// </remarks>
public UmbracoDatabase Database
public virtual UmbracoDatabase Database
{
get { return _factory.CreateDatabase(); }
}
@@ -98,7 +98,7 @@ namespace Umbraco.Core
/// <summary>
/// Boolean indicating whether the database has been configured
/// </summary>
public bool IsDatabaseConfigured
public virtual bool IsDatabaseConfigured
{
get { return _configured; }
}
@@ -106,33 +106,21 @@ namespace Umbraco.Core
/// <summary>
/// Determines if the db can be connected to
/// </summary>
public bool CanConnect
public virtual bool CanConnect
{
get
{
if (IsDatabaseConfigured == false) return false;
//double check lock so that it is only checked once and is fast
if (_connectCheck == false)
{
lock (_locker)
{
if (_canConnect == false)
{
_canConnect = DbConnectionExtensions.IsConnectionAvailable(ConnectionString, DatabaseProvider);
_connectCheck = true;
}
}
}
return _canConnect;
var canConnect = DbConnectionExtensions.IsConnectionAvailable(ConnectionString, DatabaseProvider);
LogHelper.Info<DatabaseContext>("CanConnect = " + canConnect);
return canConnect;
}
}
/// <summary>
/// Gets the configured umbraco db connection string.
/// </summary>
public string ConnectionString
public virtual string ConnectionString
{
get { return _connectionString; }
}
@@ -150,7 +138,7 @@ namespace Umbraco.Core
_providerName = "System.Data.SqlClient";
if (ConfigurationManager.ConnectionStrings[GlobalSettings.UmbracoConnectionName] != null)
{
if (!string.IsNullOrEmpty(ConfigurationManager.ConnectionStrings[GlobalSettings.UmbracoConnectionName].ProviderName))
if (string.IsNullOrEmpty(ConfigurationManager.ConnectionStrings[GlobalSettings.UmbracoConnectionName].ProviderName) == false)
_providerName = ConfigurationManager.ConnectionStrings[GlobalSettings.UmbracoConnectionName].ProviderName;
}
else
@@ -164,7 +152,7 @@ namespace Umbraco.Core
/// <summary>
/// Returns the Type of DatabaseProvider used
/// </summary>
public DatabaseProviders DatabaseProvider
public virtual DatabaseProviders DatabaseProvider
{
get
{
@@ -541,7 +529,7 @@ namespace Umbraco.Core
return _result;
}
internal Result CreateDatabaseSchemaAndData()
internal Result CreateDatabaseSchemaAndData(ApplicationContext applicationContext)
{
try
{
@@ -578,12 +566,15 @@ namespace Umbraco.Core
message = GetResultMessageForMySql();
var schemaResult = ValidateDatabaseSchema();
var installedVersion = schemaResult.DetermineInstalledVersion();
var installedSchemaVersion = schemaResult.DetermineInstalledVersion();
//If Configuration Status is empty and the determined version is "empty" its a new install - otherwise upgrade the existing
if (string.IsNullOrEmpty(GlobalSettings.ConfigurationStatus) && installedVersion.Equals(new Version(0, 0, 0)))
if (string.IsNullOrEmpty(GlobalSettings.ConfigurationStatus) && installedSchemaVersion.Equals(new Version(0, 0, 0)))
{
database.CreateDatabaseSchema();
var helper = new DatabaseSchemaHelper(database, _logger, SqlSyntax);
helper.CreateDatabaseSchema(true, applicationContext);
message = message + "<p>Installation completed!</p>";
//now that everything is done, we need to determine the version of SQL server that is executing
@@ -612,7 +603,7 @@ namespace Umbraco.Core
/// This assumes all of the previous checks are done!
/// </summary>
/// <returns></returns>
internal Result UpgradeSchemaAndData()
internal Result UpgradeSchemaAndData(IMigrationEntryService migrationEntryService)
{
try
{
@@ -631,16 +622,56 @@ namespace Umbraco.Core
var message = GetResultMessageForMySql();
var schemaResult = ValidateDatabaseSchema();
var installedVersion = schemaResult.DetermineInstalledVersion();
var installedSchemaVersion = new SemVersion(schemaResult.DetermineInstalledVersion());
var installedMigrationVersion = new SemVersion(0);
//we cannot check the migrations table if it doesn't exist, this will occur when upgrading to 7.3
if (schemaResult.ValidTables.Any(x => x.InvariantEquals("umbracoMigration")))
{
installedMigrationVersion = schemaResult.DetermineInstalledVersionByMigrations(migrationEntryService);
}
var targetVersion = UmbracoVersion.Current;
//In some cases - like upgrading from 7.2.6 -> 7.3, there will be no migration information in the database and therefore it will
// return a version of 0.0.0 and we don't necessarily want to run all migrations from 0 -> 7.3, so we'll just ensure that the
// migrations are run for the target version
if (installedMigrationVersion == new SemVersion(new Version(0, 0, 0)) && installedSchemaVersion > new SemVersion(new Version(0, 0, 0)))
{
//set the installedMigrationVersion to be one less than the target so the latest migrations are guaranteed to execute
installedMigrationVersion = new SemVersion(targetVersion.SubtractRevision());
}
//Figure out what our current installed version is. If the web.config doesn't have a version listed, then we'll use the minimum
// version detected between the schema installed and the migrations listed in the migration table.
// If there is a version in the web.config, we'll take the minimum between the listed migration in the db and what
// is declared in the web.config.
var currentInstalledVersion = string.IsNullOrEmpty(GlobalSettings.ConfigurationStatus)
//Take the minimum version between the detected schema version and the installed migration version
? new[] {installedSchemaVersion, installedMigrationVersion}.Min()
//Take the minimum version between the installed migration version and the version specified in the config
: new[] { SemVersion.Parse(GlobalSettings.ConfigurationStatus), installedMigrationVersion }.Min();
//Ok, another edge case here. If the current version is a pre-release,
// then we want to ensure all migrations for the current release are executed.
if (currentInstalledVersion.Prerelease.IsNullOrWhiteSpace() == false)
{
currentInstalledVersion = new SemVersion(currentInstalledVersion.GetVersion().SubtractRevision());
}
//DO the upgrade!
var currentVersion = string.IsNullOrEmpty(GlobalSettings.ConfigurationStatus)
? installedVersion
: new Version(GlobalSettings.ConfigurationStatus);
var targetVersion = UmbracoVersion.Current;
var runner = new MigrationRunner(_logger, currentVersion, targetVersion, GlobalSettings.UmbracoMigrationName);
var runner = new MigrationRunner(migrationEntryService, _logger, currentInstalledVersion, UmbracoVersion.GetSemanticVersion(), GlobalSettings.UmbracoMigrationName);
var upgraded = runner.Execute(database, true);
if (upgraded == false)
{
throw new ApplicationException("Upgrading failed, either an error occurred during the upgrade process or an event canceled the upgrade process, see log for full details");
}
message = message + "<p>Upgrade completed!</p>";
//now that everything is done, we need to determine the version of SQL server that is executing
+44
View File
@@ -0,0 +1,44 @@
using System;
using System.Diagnostics;
using System.Threading;
namespace Umbraco.Core
{
public static class DelegateExtensions
{
public static Attempt<T> RetryUntilSuccessOrTimeout<T>(this Func<Attempt<T>> task, TimeSpan timeout, TimeSpan pause)
{
if (pause.TotalMilliseconds < 0)
{
throw new ArgumentException("pause must be >= 0 milliseconds");
}
var stopwatch = Stopwatch.StartNew();
do
{
var result = task();
if (result) { return result; }
Thread.Sleep((int)pause.TotalMilliseconds);
}
while (stopwatch.Elapsed < timeout);
return Attempt<T>.Fail();
}
public static Attempt<T> RetryUntilSuccessOrMaxAttempts<T>(this Func<int, Attempt<T>> task, int totalAttempts, TimeSpan pause)
{
if (pause.TotalMilliseconds < 0)
{
throw new ArgumentException("pause must be >= 0 milliseconds");
}
int attempts = 0;
do
{
attempts++;
var result = task(attempts);
if (result) { return result; }
Thread.Sleep((int)pause.TotalMilliseconds);
}
while (attempts < totalAttempts);
return Attempt<T>.Fail();
}
}
}
+28 -39
View File
@@ -4,69 +4,58 @@ using System.Threading;
namespace Umbraco.Core
{
/// <summary>
/// Abstract implementation of logic commonly required to safely handle disposable unmanaged resources.
/// Abstract implementation of IDisposable.
/// </summary>
/// <remarks>
/// Can also be used as a pattern for when inheriting is not possible.
///
/// See also: https://msdn.microsoft.com/en-us/library/b1yfkh5e%28v=vs.110%29.aspx
/// See also: https://lostechies.com/chrispatterson/2012/11/29/idisposable-done-right/
///
/// Note: if an object's ctor throws, it will never be disposed, and so if that ctor
/// has allocated disposable objects, it should take care of disposing them.
/// </remarks>
public abstract class DisposableObject : IDisposable
{
private bool _disposed;
private readonly ReaderWriterLockSlim _disposalLocker = new ReaderWriterLockSlim();
private readonly object _locko = new object();
/// <summary>
/// Gets a value indicating whether this instance is disposed.
/// </summary>
/// <value>
/// <c>true</c> if this instance is disposed; otherwise, <c>false</c>.
/// </value>
public bool IsDisposed
{
get { return _disposed; }
}
// gets a value indicating whether this instance is disposed.
// for internal tests only (not thread safe)
//TODO make this internal + rename "Disposed" when we can break compatibility
public bool IsDisposed { get { return _disposed; } }
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
/// <filterpriority>2</filterpriority>
// implements IDisposable
public void Dispose()
{
Dispose(true);
// Use SupressFinalize in case a subclass of this type implements a finalizer.
GC.SuppressFinalize(this);
}
// finalizer
~DisposableObject()
{
// Run dispose but let the class know it was due to the finalizer running.
Dispose(false);
}
protected virtual void Dispose(bool disposing)
//TODO make this private, non-virtual when we can break compatibility
protected virtual void Dispose(bool disposing)
{
// Only operate if we haven't already disposed
if (IsDisposed || !disposing) return;
lock (_locko)
{
if (_disposed) return;
_disposed = true;
}
using (new WriteLock(_disposalLocker))
{
// Check again now we're inside the lock
if (IsDisposed) return;
DisposeUnmanagedResources();
// Call to actually release resources. This method is only
// kept separate so that the entire disposal logic can be used as a VS snippet
DisposeResources();
// Indicate that the instance has been disposed.
_disposed = true;
}
if (disposing)
DisposeResources();
}
/// <summary>
/// Handles the disposal of resources. Derived from abstract class <see cref="DisposableObject"/> which handles common required locking logic.
/// </summary>
protected abstract void DisposeResources();
protected virtual void DisposeUnmanagedResources()
{
}
{ }
}
}
+1
View File
@@ -101,6 +101,7 @@ namespace Umbraco.Core
/// <param name="f">The select child.</param>
/// <typeparam name="T">Item type</typeparam>
/// <returns>list of TItem</returns>
[Obsolete("Do not use, use SelectRecursive instead which has far less potential of re-iterating an iterator which may cause significantly more SQL queries")]
public static IEnumerable<T> FlattenList<T>(this IEnumerable<T> e, Func<T, IEnumerable<T>> f)
{
return e.SelectMany(c => f(c).FlattenList(f)).Concat(e);
@@ -3,7 +3,7 @@ using System.Security.Permissions;
namespace Umbraco.Core.Events
{
/// <summary>
/// <summary>
/// Event args for that can support cancellation
/// </summary>
[HostProtection(SecurityAction.LinkDemand, SharedState = true)]
@@ -11,15 +11,30 @@ namespace Umbraco.Core.Events
{
private bool _cancel;
public CancellableEventArgs(bool canCancel)
public CancellableEventArgs(bool canCancel, EventMessages eventMessages)
{
if (eventMessages == null) throw new ArgumentNullException("eventMessages");
CanCancel = canCancel;
Messages = eventMessages;
}
public CancellableEventArgs(bool canCancel)
{
CanCancel = canCancel;
}
//create a standalone messages
Messages = new EventMessages();
}
public CancellableEventArgs()
public CancellableEventArgs(EventMessages eventMessages)
: this(true, eventMessages)
{
}
public CancellableEventArgs()
: this(true)
{
}
/// <summary>
/// Flag to determine if this instance will support being cancellable
/// </summary>
@@ -32,7 +47,7 @@ namespace Umbraco.Core.Events
{
get
{
if (!CanCancel)
if (CanCancel == false)
{
throw new InvalidOperationException("This event argument class does not support cancelling.");
}
@@ -40,12 +55,28 @@ namespace Umbraco.Core.Events
}
set
{
if (!CanCancel)
if (CanCancel == false)
{
throw new InvalidOperationException("This event argument class does not support cancelling.");
}
_cancel = value;
}
}
}
/// <summary>
/// if this instance supports cancellation, this will set Cancel to true with an affiliated cancellation message
/// </summary>
/// <param name="cancelationMessage"></param>
public void CancelOperation(EventMessage cancelationMessage)
{
Cancel = true;
cancelationMessage.IsDefaultEventMessage = true;
Messages.Add(cancelationMessage);
}
/// <summary>
/// Returns the EventMessages object which is used to add messages to the message collection for this event
/// </summary>
public EventMessages Messages { get; private set; }
}
}
@@ -12,7 +12,18 @@ namespace Umbraco.Core.Events
public class CancellableObjectEventArgs<T> : CancellableEventArgs
{
public CancellableObjectEventArgs(T eventObject, bool canCancel)
public CancellableObjectEventArgs(T eventObject, bool canCancel, EventMessages eventMessages)
: base(canCancel, eventMessages)
{
EventObject = eventObject;
}
public CancellableObjectEventArgs(T eventObject, EventMessages eventMessages)
: this(eventObject, true, eventMessages)
{
}
public CancellableObjectEventArgs(T eventObject, bool canCancel)
: base(canCancel)
{
EventObject = eventObject;
+57 -7
View File
@@ -4,12 +4,56 @@ namespace Umbraco.Core.Events
{
public class DeleteEventArgs<TEntity> : CancellableObjectEventArgs<IEnumerable<TEntity>>
{
/// <summary>
/// Constructor accepting multiple entities that are used in the delete operation
/// </summary>
/// <param name="eventObject"></param>
/// <param name="canCancel"></param>
public DeleteEventArgs(IEnumerable<TEntity> eventObject, bool canCancel) : base(eventObject, canCancel)
/// <summary>
/// Constructor accepting multiple entities that are used in the delete operation
/// </summary>
/// <param name="eventObject"></param>
/// <param name="canCancel"></param>
/// <param name="eventMessages"></param>
public DeleteEventArgs(IEnumerable<TEntity> eventObject, bool canCancel, EventMessages eventMessages) : base(eventObject, canCancel, eventMessages)
{
MediaFilesToDelete = new List<string>();
}
/// <summary>
/// Constructor accepting multiple entities that are used in the delete operation
/// </summary>
/// <param name="eventObject"></param>
/// <param name="eventMessages"></param>
public DeleteEventArgs(IEnumerable<TEntity> eventObject, EventMessages eventMessages) : base(eventObject, eventMessages)
{
MediaFilesToDelete = new List<string>();
}
/// <summary>
/// Constructor accepting a single entity instance
/// </summary>
/// <param name="eventObject"></param>
/// <param name="eventMessages"></param>
public DeleteEventArgs(TEntity eventObject, EventMessages eventMessages)
: base(new List<TEntity> { eventObject }, eventMessages)
{
MediaFilesToDelete = new List<string>();
}
/// <summary>
/// Constructor accepting a single entity instance
/// </summary>
/// <param name="eventObject"></param>
/// <param name="canCancel"></param>
/// <param name="eventMessages"></param>
public DeleteEventArgs(TEntity eventObject, bool canCancel, EventMessages eventMessages)
: base(new List<TEntity> { eventObject }, canCancel, eventMessages)
{
MediaFilesToDelete = new List<string>();
}
/// <summary>
/// Constructor accepting multiple entities that are used in the delete operation
/// </summary>
/// <param name="eventObject"></param>
/// <param name="canCancel"></param>
public DeleteEventArgs(IEnumerable<TEntity> eventObject, bool canCancel) : base(eventObject, canCancel)
{
MediaFilesToDelete = new List<string>();
}
@@ -60,7 +104,13 @@ namespace Umbraco.Core.Events
public class DeleteEventArgs : CancellableEventArgs
{
public DeleteEventArgs(int id, bool canCancel)
public DeleteEventArgs(int id, bool canCancel, EventMessages eventMessages)
: base(canCancel, eventMessages)
{
Id = id;
}
public DeleteEventArgs(int id, bool canCancel)
: base(canCancel)
{
Id = id;
+21 -20
View File
@@ -1,4 +1,5 @@
using System;
using System.Linq;
namespace Umbraco.Core.Events
{
@@ -7,16 +8,16 @@ namespace Umbraco.Core.Events
/// </summary>
public static class EventExtensions
{
/// <summary>
/// Raises the event and returns a boolean value indicating if the event was cancelled
/// </summary>
/// <typeparam name="TSender"></typeparam>
/// <typeparam name="TArgs"></typeparam>
/// <param name="eventHandler"></param>
/// <param name="args"></param>
/// <param name="sender"></param>
/// <returns></returns>
public static bool IsRaisedEventCancelled<TSender, TArgs>(
/// <summary>
/// Raises the event and returns a boolean value indicating if the event was cancelled
/// </summary>
/// <typeparam name="TSender"></typeparam>
/// <typeparam name="TArgs"></typeparam>
/// <param name="eventHandler"></param>
/// <param name="args"></param>
/// <param name="sender"></param>
/// <returns></returns>
public static bool IsRaisedEventCancelled<TSender, TArgs>(
this TypedEventHandler<TSender, TArgs> eventHandler,
TArgs args,
TSender sender)
@@ -27,16 +28,16 @@ namespace Umbraco.Core.Events
return args.Cancel;
}
/// <summary>
/// Raises the event
/// </summary>
/// <typeparam name="TSender"></typeparam>
/// <typeparam name="TArgs"></typeparam>
/// <param name="eventHandler"></param>
/// <param name="args"></param>
/// <param name="sender"></param>
public static void RaiseEvent<TSender, TArgs>(
/// <summary>
/// Raises the event
/// </summary>
/// <typeparam name="TSender"></typeparam>
/// <typeparam name="TArgs"></typeparam>
/// <param name="eventHandler"></param>
/// <param name="args"></param>
/// <param name="sender"></param>
public static void RaiseEvent<TSender, TArgs>(
this TypedEventHandler<TSender, TArgs> eventHandler,
TArgs args,
TSender sender)
+27
View File
@@ -0,0 +1,27 @@
namespace Umbraco.Core.Events
{
/// <summary>
/// An event message
/// </summary>
public sealed class EventMessage
{
/// <summary>
/// Initializes a new instance of the <see cref="EventMessage"/> class.
/// </summary>
public EventMessage(string category, string message, EventMessageType messageType = EventMessageType.Default)
{
Category = category;
Message = message;
MessageType = messageType;
}
public string Category { get; private set; }
public string Message { get; private set; }
public EventMessageType MessageType { get; private set; }
/// <summary>
/// This is used to track if this message should be used as a default message so that Umbraco doesn't also append it's own default messages
/// </summary>
internal bool IsDefaultEventMessage { get; set; }
}
}
+32
View File
@@ -0,0 +1,32 @@
using System.Collections.Generic;
namespace Umbraco.Core.Events
{
/// <summary>
/// Event messages collection
/// </summary>
public sealed class EventMessages : DisposableObject
{
private readonly List<EventMessage> _msgs = new List<EventMessage>();
public void Add(EventMessage msg)
{
_msgs.Add(msg);
}
public int Count
{
get { return _msgs.Count; }
}
public IEnumerable<EventMessage> GetAll()
{
return _msgs;
}
protected override void DisposeResources()
{
_msgs.Clear();
}
}
}
@@ -0,0 +1,12 @@
using System.Collections.Generic;
namespace Umbraco.Core.Events
{
/// <summary>
/// Event messages factory
/// </summary>
public interface IEventMessagesFactory
{
EventMessages Get();
}
}
+14
View File
@@ -0,0 +1,14 @@
namespace Umbraco.Core.Events
{
/// <summary>
/// The type of event message
/// </summary>
public enum EventMessageType
{
Default = 0,
Info = 1,
Error = 2,
Success = 3,
Warning = 4
}
}
+43 -9
View File
@@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using Semver;
using Umbraco.Core.Persistence.Migrations;
namespace Umbraco.Core.Events
@@ -13,11 +15,20 @@ namespace Umbraco.Core.Events
/// <param name="targetVersion"></param>
/// <param name="canCancel"></param>
/// <param name="configuredVersion"></param>
public MigrationEventArgs(IList<IMigration> eventObject, SemVersion configuredVersion, SemVersion targetVersion, bool canCancel)
: base(eventObject, canCancel)
{
ConfiguredSemVersion = configuredVersion;
TargetSemVersion = targetVersion;
}
[Obsolete("Use constructor accepting UmbracoVersion instances instead")]
[EditorBrowsable(EditorBrowsableState.Never)]
public MigrationEventArgs(IList<IMigration> eventObject, Version configuredVersion, Version targetVersion, bool canCancel)
: base(eventObject, canCancel)
{
ConfiguredVersion = configuredVersion;
TargetVersion = targetVersion;
ConfiguredSemVersion = new SemVersion(configuredVersion);
TargetSemVersion = new SemVersion(targetVersion);
}
/// <summary>
@@ -28,12 +39,12 @@ namespace Umbraco.Core.Events
/// <param name="targetVersion"></param>
/// <param name="canCancel"></param>
/// <param name="configuredVersion"></param>
internal MigrationEventArgs(IList<IMigration> eventObject, MigrationContext migrationContext, Version configuredVersion, Version targetVersion, bool canCancel)
internal MigrationEventArgs(IList<IMigration> eventObject, MigrationContext migrationContext, SemVersion configuredVersion, SemVersion targetVersion, bool canCancel)
: base(eventObject, canCancel)
{
MigrationContext = migrationContext;
ConfiguredVersion = configuredVersion;
TargetVersion = targetVersion;
ConfiguredSemVersion = configuredVersion;
TargetSemVersion = targetVersion;
}
/// <summary>
@@ -42,11 +53,20 @@ namespace Umbraco.Core.Events
/// <param name="eventObject"></param>
/// <param name="configuredVersion"></param>
/// <param name="targetVersion"></param>
public MigrationEventArgs(IList<IMigration> eventObject, SemVersion configuredVersion, SemVersion targetVersion)
: base(eventObject)
{
ConfiguredSemVersion = configuredVersion;
TargetSemVersion = targetVersion;
}
[Obsolete("Use constructor accepting UmbracoVersion instances instead")]
[EditorBrowsable(EditorBrowsableState.Never)]
public MigrationEventArgs(IList<IMigration> eventObject, Version configuredVersion, Version targetVersion)
: base(eventObject)
{
ConfiguredVersion = configuredVersion;
TargetVersion = targetVersion;
ConfiguredSemVersion = new SemVersion(configuredVersion);
TargetSemVersion = new SemVersion(targetVersion);
}
/// <summary>
@@ -57,9 +77,23 @@ namespace Umbraco.Core.Events
get { return EventObject; }
}
public Version ConfiguredVersion { get; private set; }
[Obsolete("Use ConfiguredSemVersion instead")]
[EditorBrowsable(EditorBrowsableState.Never)]
public Version ConfiguredVersion
{
get { return ConfiguredSemVersion.GetVersion(); }
}
public Version TargetVersion { get; private set; }
[Obsolete("Use TargetUmbracoVersion instead")]
[EditorBrowsable(EditorBrowsableState.Never)]
public Version TargetVersion
{
get { return TargetSemVersion.GetVersion(); }
}
public SemVersion ConfiguredSemVersion { get; private set; }
public SemVersion TargetSemVersion { get; private set; }
internal MigrationContext MigrationContext { get; private set; }
}
+43 -14
View File
@@ -4,22 +4,51 @@ using System.Linq;
namespace Umbraco.Core.Events
{
public class MoveEventInfo<TEntity>
{
public MoveEventInfo(TEntity entity, string originalPath, int newParentId)
{
Entity = entity;
OriginalPath = originalPath;
NewParentId = newParentId;
}
public TEntity Entity { get; set; }
public string OriginalPath { get; set; }
public int NewParentId { get; set; }
}
public class MoveEventArgs<TEntity> : CancellableObjectEventArgs<TEntity>
{
/// <summary>
/// Constructor accepting a collection of MoveEventInfo objects
/// </summary>
/// <param name="canCancel"></param>
/// <param name="eventMessages"></param>
/// <param name="moveInfo">
/// A colleciton of MoveEventInfo objects that exposes all entities that have been moved during a single move operation
/// </param>
public MoveEventArgs(bool canCancel, EventMessages eventMessages, params MoveEventInfo<TEntity>[] moveInfo)
: base(default(TEntity), canCancel, eventMessages)
{
if (moveInfo.FirstOrDefault() == null)
{
throw new ArgumentException("moveInfo argument must contain at least one item");
}
MoveInfoCollection = moveInfo;
//assign the legacy props
EventObject = moveInfo.First().Entity;
ParentId = moveInfo.First().NewParentId;
}
/// <summary>
/// Constructor accepting a collection of MoveEventInfo objects
/// </summary>
/// <param name="eventMessages"></param>
/// <param name="moveInfo">
/// A colleciton of MoveEventInfo objects that exposes all entities that have been moved during a single move operation
/// </param>
public MoveEventArgs(EventMessages eventMessages, params MoveEventInfo<TEntity>[] moveInfo)
: base(default(TEntity), eventMessages)
{
if (moveInfo.FirstOrDefault() == null)
{
throw new ArgumentException("moveInfo argument must contain at least one item");
}
MoveInfoCollection = moveInfo;
//assign the legacy props
EventObject = moveInfo.First().Entity;
ParentId = moveInfo.First().NewParentId;
}
/// <summary>
/// Constructor accepting a collection of MoveEventInfo objects
/// </summary>
+16
View File
@@ -0,0 +1,16 @@
namespace Umbraco.Core.Events
{
public class MoveEventInfo<TEntity>
{
public MoveEventInfo(TEntity entity, string originalPath, int newParentId)
{
Entity = entity;
OriginalPath = originalPath;
NewParentId = newParentId;
}
public TEntity Entity { get; set; }
public string OriginalPath { get; set; }
public int NewParentId { get; set; }
}
}
+33 -1
View File
@@ -4,7 +4,39 @@ namespace Umbraco.Core.Events
{
public class NewEventArgs<TEntity> : CancellableObjectEventArgs<TEntity>
{
public NewEventArgs(TEntity eventObject, bool canCancel, string @alias, int parentId) : base(eventObject, canCancel)
public NewEventArgs(TEntity eventObject, bool canCancel, string @alias, int parentId, EventMessages eventMessages)
: base(eventObject, canCancel, eventMessages)
{
Alias = alias;
ParentId = parentId;
}
public NewEventArgs(TEntity eventObject, bool canCancel, string @alias, TEntity parent, EventMessages eventMessages)
: base(eventObject, canCancel, eventMessages)
{
Alias = alias;
Parent = parent;
}
public NewEventArgs(TEntity eventObject, string @alias, int parentId, EventMessages eventMessages)
: base(eventObject, eventMessages)
{
Alias = alias;
ParentId = parentId;
}
public NewEventArgs(TEntity eventObject, string @alias, TEntity parent, EventMessages eventMessages)
: base(eventObject, eventMessages)
{
Alias = alias;
Parent = parent;
}
public NewEventArgs(TEntity eventObject, bool canCancel, string @alias, int parentId) : base(eventObject, canCancel)
{
Alias = alias;
ParentId = parentId;
@@ -4,6 +4,52 @@ namespace Umbraco.Core.Events
{
public class PublishEventArgs<TEntity> : CancellableObjectEventArgs<IEnumerable<TEntity>>
{
/// <summary>
/// Constructor accepting multiple entities that are used in the publish operation
/// </summary>
/// <param name="eventObject"></param>
/// <param name="canCancel"></param>
/// <param name="isAllPublished"></param>
/// <param name="eventMessages"></param>
public PublishEventArgs(IEnumerable<TEntity> eventObject, bool canCancel, bool isAllPublished, EventMessages eventMessages)
: base(eventObject, canCancel, eventMessages)
{
IsAllRepublished = isAllPublished;
}
/// <summary>
/// Constructor accepting multiple entities that are used in the publish operation
/// </summary>
/// <param name="eventObject"></param>
/// <param name="eventMessages"></param>
public PublishEventArgs(IEnumerable<TEntity> eventObject, EventMessages eventMessages)
: base(eventObject, eventMessages)
{
}
/// <summary>
/// Constructor accepting a single entity instance
/// </summary>
/// <param name="eventObject"></param>
/// <param name="eventMessages"></param>
public PublishEventArgs(TEntity eventObject, EventMessages eventMessages)
: base(new List<TEntity> { eventObject }, eventMessages)
{
}
/// <summary>
/// Constructor accepting a single entity instance
/// </summary>
/// <param name="eventObject"></param>
/// <param name="canCancel"></param>
/// <param name="isAllPublished"></param>
/// <param name="eventMessages"></param>
public PublishEventArgs(TEntity eventObject, bool canCancel, bool isAllPublished, EventMessages eventMessages)
: base(new List<TEntity> { eventObject }, canCancel, eventMessages)
{
IsAllRepublished = isAllPublished;
}
/// <summary>
/// Constructor accepting multiple entities that are used in the publish operation
/// </summary>
+49 -6
View File
@@ -4,12 +4,55 @@ namespace Umbraco.Core.Events
{
public class SaveEventArgs<TEntity> : CancellableObjectEventArgs<IEnumerable<TEntity>>
{
/// <summary>
/// Constructor accepting multiple entities that are used in the saving operation
/// </summary>
/// <param name="eventObject"></param>
/// <param name="canCancel"></param>
public SaveEventArgs(IEnumerable<TEntity> eventObject, bool canCancel)
/// <summary>
/// Constructor accepting multiple entities that are used in the saving operation
/// </summary>
/// <param name="eventObject"></param>
/// <param name="canCancel"></param>
/// <param name="eventMessages"></param>
public SaveEventArgs(IEnumerable<TEntity> eventObject, bool canCancel, EventMessages eventMessages)
: base(eventObject, canCancel, eventMessages)
{
}
/// <summary>
/// Constructor accepting multiple entities that are used in the saving operation
/// </summary>
/// <param name="eventObject"></param>
/// <param name="eventMessages"></param>
public SaveEventArgs(IEnumerable<TEntity> eventObject, EventMessages eventMessages)
: base(eventObject, eventMessages)
{
}
/// <summary>
/// Constructor accepting a single entity instance
/// </summary>
/// <param name="eventObject"></param>
/// <param name="eventMessages"></param>
public SaveEventArgs(TEntity eventObject, EventMessages eventMessages)
: base(new List<TEntity> { eventObject }, eventMessages)
{
}
/// <summary>
/// Constructor accepting a single entity instance
/// </summary>
/// <param name="eventObject"></param>
/// <param name="canCancel"></param>
/// <param name="eventMessages"></param>
public SaveEventArgs(TEntity eventObject, bool canCancel, EventMessages eventMessages)
: base(new List<TEntity> { eventObject }, canCancel, eventMessages)
{
}
/// <summary>
/// Constructor accepting multiple entities that are used in the saving operation
/// </summary>
/// <param name="eventObject"></param>
/// <param name="canCancel"></param>
public SaveEventArgs(IEnumerable<TEntity> eventObject, bool canCancel)
: base(eventObject, canCancel)
{
}
@@ -0,0 +1,13 @@
namespace Umbraco.Core.Events
{
/// <summary>
/// A simple/default transient messages factory
/// </summary>
internal class TransientMessagesFactory : IEventMessagesFactory
{
public EventMessages Get()
{
return new EventMessages();
}
}
}
@@ -0,0 +1,18 @@
using System;
namespace Umbraco.Core.Exceptions
{
/// <summary>
/// An exception that is thrown if the umbraco application cannnot boot
/// </summary>
public class UmbracoStartupFailedException : Exception
{
/// <summary>
/// Initializes a new instance of the <see cref="T:System.Exception"/> class with a specified error message.
/// </summary>
/// <param name="message">The message that describes the error. </param>
public UmbracoStartupFailedException(string message) : base(message)
{
}
}
}
@@ -1,18 +1,18 @@
<?xml version="1.0"?>
<!-- Blocks public downloading of anything in this folder and sub folders -->
<configuration>
<system.web>
<httpHandlers>
<add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
</system.webServer>
</configuration>
<?xml version="1.0"?>
<!-- Blocks public downloading of anything in this folder and sub folders -->
<configuration>
<system.web>
<httpHandlers>
<add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
</system.webServer>
</configuration>
+86
View File
@@ -0,0 +1,86 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.0
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Umbraco.Core.FileResources {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Files {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Files() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Umbraco.Core.FileResources.Files", typeof(Files).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot;?&gt;
///
///&lt;!-- Blocks public downloading of anything in this folder and sub folders --&gt;
///
///&lt;configuration&gt;
/// &lt;system.web&gt;
/// &lt;httpHandlers&gt;
/// &lt;add path=&quot;*&quot; verb=&quot;*&quot; type=&quot;System.Web.HttpNotFoundHandler&quot;/&gt;
/// &lt;/httpHandlers&gt;
/// &lt;/system.web&gt;
/// &lt;system.webServer&gt;
/// &lt;validation validateIntegratedModeConfiguration=&quot;false&quot; /&gt;
/// &lt;handlers&gt;
/// &lt;remove name=&quot;BlockViewHandler&quot;/&gt;
/// &lt;add name=&quot;BlockViewHandler&quot; path=&quot;*&quot; verb=&quot;*&quot; preCondition=&quot;integratedMode&quot; type=&quot;System.Web.H [rest of string was truncated]&quot;;.
/// </summary>
internal static string BlockingWebConfig {
get {
return ResourceManager.GetString("BlockingWebConfig", resourceCulture);
}
}
}
}
+124
View File
@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="BlockingWebConfig" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>blockingweb.config;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
</root>
+80 -25
View File
@@ -6,6 +6,7 @@ using System.IO;
using System.Configuration;
using System.Web;
using System.Text.RegularExpressions;
using System.Web.Hosting;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
@@ -51,7 +52,23 @@ namespace Umbraco.Core.IO
return VirtualPathUtility.ToAbsolute(virtualPath, SystemDirectories.Root);
}
[Obsolete("Use Umbraco.Web.Templates.TemplateUtilities.ResolveUrlsFromTextString instead, this method on this class will be removed in future versions")]
public static Attempt<string> TryResolveUrl(string virtualPath)
{
try
{
if (virtualPath.StartsWith("~"))
return Attempt.Succeed(virtualPath.Replace("~", SystemDirectories.Root).Replace("//", "/"));
if (Uri.IsWellFormedUriString(virtualPath, UriKind.Absolute))
return Attempt.Succeed(virtualPath);
return Attempt.Succeed(VirtualPathUtility.ToAbsolute(virtualPath, SystemDirectories.Root));
}
catch (Exception ex)
{
return Attempt.Fail(virtualPath, ex);
}
}
[Obsolete("Use Umbraco.Web.Templates.TemplateUtilities.ResolveUrlsFromTextString instead, this method on this class will be removed in future versions")]
internal static string ResolveUrlsFromTextString(string text)
{
if (UmbracoConfig.For.UmbracoSettings().Content.ResolveUrlsFromTextString)
@@ -67,7 +84,7 @@ namespace Umbraco.Core.IO
if (tag.Groups[1].Success)
url = tag.Groups[1].Value;
if (string.IsNullOrEmpty(url) == false)
if (String.IsNullOrEmpty(url) == false)
{
string resolvedUrl = (url.Substring(0, 1) == "/") ? ResolveUrl(url.Substring(1)) : ResolveUrl(url);
text = text.Replace(url, resolvedUrl);
@@ -92,10 +109,10 @@ namespace Umbraco.Core.IO
if (useHttpContext && HttpContext.Current != null)
{
//string retval;
if (string.IsNullOrEmpty(path) == false && (path.StartsWith("~") || path.StartsWith(SystemDirectories.Root)))
return System.Web.Hosting.HostingEnvironment.MapPath(path);
if (String.IsNullOrEmpty(path) == false && (path.StartsWith("~") || path.StartsWith(SystemDirectories.Root)))
return HostingEnvironment.MapPath(path);
else
return System.Web.Hosting.HostingEnvironment.MapPath("~/" + path.TrimStart('/'));
return HostingEnvironment.MapPath("~/" + path.TrimStart('/'));
}
var root = GetRootDirectorySafe();
@@ -115,7 +132,7 @@ namespace Umbraco.Core.IO
{
string retval = ConfigurationManager.AppSettings[settingsKey];
if (string.IsNullOrEmpty(retval))
if (String.IsNullOrEmpty(retval))
retval = standardPath;
return retval.TrimEnd('/');
@@ -135,12 +152,7 @@ namespace Umbraco.Core.IO
/// <returns>A value indicating whether the filepath is valid.</returns>
internal static bool VerifyEditPath(string filePath, string validDir)
{
if (filePath.StartsWith(MapPath(SystemDirectories.Root)) == false)
filePath = MapPath(filePath);
if (validDir.StartsWith(MapPath(SystemDirectories.Root)) == false)
validDir = MapPath(validDir);
return filePath.StartsWith(validDir);
return VerifyEditPath(filePath, new[] { validDir });
}
/// <summary>
@@ -165,15 +177,31 @@ namespace Umbraco.Core.IO
/// <returns>A value indicating whether the filepath is valid.</returns>
internal static bool VerifyEditPath(string filePath, IEnumerable<string> validDirs)
{
// this is called from ScriptRepository, PartialViewRepository, etc.
// filePath is the fullPath (rooted, filesystem path, can be trusted)
// validDirs are virtual paths (eg ~/Views)
//
// except that for templates, filePath actually is a virtual path
//TODO
// what's below is dirty, there are too many ways to get the root dir, etc.
// not going to fix everything today
var mappedRoot = MapPath(SystemDirectories.Root);
if (filePath.StartsWith(mappedRoot) == false)
filePath = MapPath(filePath);
// yes we can (see above)
//// don't trust what we get, it may contain relative segments
//filePath = Path.GetFullPath(filePath);
foreach (var dir in validDirs)
{
var validDir = dir;
if (filePath.StartsWith(MapPath(SystemDirectories.Root)) == false)
filePath = MapPath(filePath);
if (validDir.StartsWith(MapPath(SystemDirectories.Root)) == false)
if (validDir.StartsWith(mappedRoot) == false)
validDir = MapPath(validDir);
if (filePath.StartsWith(validDir))
if (PathStartsWith(filePath, validDir, Path.DirectorySeparatorChar))
return true;
}
@@ -202,11 +230,8 @@ namespace Umbraco.Core.IO
/// <returns>A value indicating whether the filepath is valid.</returns>
internal static bool VerifyFileExtension(string filePath, List<string> validFileExtensions)
{
if (filePath.StartsWith(MapPath(SystemDirectories.Root)) == false)
filePath = MapPath(filePath);
var f = new FileInfo(filePath);
return validFileExtensions.Contains(f.Extension.Substring(1));
var ext = Path.GetExtension(filePath);
return ext != null && validFileExtensions.Contains(ext.TrimStart('.'));
}
/// <summary>
@@ -223,6 +248,16 @@ namespace Umbraco.Core.IO
return true;
}
public static bool PathStartsWith(string path, string root, char separator)
{
// either it is identical to root,
// or it is root + separator + anything
if (path.StartsWith(root, StringComparison.OrdinalIgnoreCase) == false) return false;
if (path.Length == root.Length) return true;
if (path.Length < root.Length) return false;
return path[root.Length] == separator;
}
/// <summary>
/// Returns the path to the root of the application, by getting the path to where the assembly where this
@@ -232,7 +267,7 @@ namespace Umbraco.Core.IO
/// <returns></returns>
internal static string GetRootDirectorySafe()
{
if (string.IsNullOrEmpty(_rootDir) == false)
if (String.IsNullOrEmpty(_rootDir) == false)
{
return _rootDir;
}
@@ -241,7 +276,7 @@ namespace Umbraco.Core.IO
var uri = new Uri(codeBase);
var path = uri.LocalPath;
var baseDirectory = Path.GetDirectoryName(path);
if (string.IsNullOrEmpty(baseDirectory))
if (String.IsNullOrEmpty(baseDirectory))
throw new Exception("No root directory could be resolved. Please ensure that your Umbraco solution is correctly configured.");
_rootDir = baseDirectory.Contains("bin")
@@ -253,8 +288,8 @@ namespace Umbraco.Core.IO
internal static string GetRootDirectoryBinFolder()
{
string binFolder = string.Empty;
if (string.IsNullOrEmpty(_rootDir))
string binFolder = String.Empty;
if (String.IsNullOrEmpty(_rootDir))
{
binFolder = Assembly.GetExecutingAssembly().GetAssemblyFile().Directory.FullName;
return binFolder;
@@ -298,5 +333,25 @@ namespace Umbraco.Core.IO
// use string extensions
return filePath.ToSafeFileName();
}
public static void EnsurePathExists(string path)
{
var absolutePath = IOHelper.MapPath(path);
if (Directory.Exists(absolutePath) == false)
Directory.CreateDirectory(absolutePath);
}
public static void EnsureFileExists(string path, string contents)
{
var absolutePath = IOHelper.MapPath(path);
if (File.Exists(absolutePath) == false)
{
using (var writer = File.CreateText(absolutePath))
{
writer.Write(contents);
}
}
}
}
}
+124 -44
View File
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.IO;
using System.Linq;
using Umbraco.Core.Logging;
@@ -9,7 +8,12 @@ namespace Umbraco.Core.IO
{
public class PhysicalFileSystem : IFileSystem
{
internal string RootPath { get; private set; }
// the rooted, filesystem path, using directory separator chars, NOT ending with a separator
// eg "c:" or "c:\path\to\site" or "\\server\path"
private readonly string _rootPath;
// the ??? url, using url separator chars, NOT ending with a separator
// eg "" (?) or "/Scripts" or ???
private readonly string _rootUrl;
public PhysicalFileSystem(string virtualRoot)
@@ -18,8 +22,13 @@ namespace Umbraco.Core.IO
if (virtualRoot.StartsWith("~/") == false)
throw new ArgumentException("The virtualRoot argument must be a virtual path and start with '~/'");
RootPath = IOHelper.MapPath(virtualRoot);
_rootPath = IOHelper.MapPath(virtualRoot);
_rootPath = EnsureDirectorySeparatorChar(_rootPath);
_rootPath = _rootPath.TrimEnd(Path.DirectorySeparatorChar);
_rootUrl = IOHelper.ResolveUrl(virtualRoot);
_rootUrl = EnsureUrlSeparatorChar(_rootUrl);
_rootUrl = _rootUrl.TrimEnd('/');
}
public PhysicalFileSystem(string rootPath, string rootUrl)
@@ -33,18 +42,31 @@ namespace Umbraco.Core.IO
if (rootPath.StartsWith("~/"))
throw new ArgumentException("The rootPath argument cannot be a virtual path and cannot start with '~/'");
RootPath = rootPath;
_rootUrl = rootUrl;
// rootPath should be... rooted, as in, it's a root path!
// but the test suite App.config cannot really "root" anything so we'll have to do it here
//var localRoot = AppDomain.CurrentDomain.BaseDirectory;
var localRoot = IOHelper.GetRootDirectorySafe();
if (Path.IsPathRooted(rootPath) == false)
{
rootPath = Path.Combine(localRoot, rootPath);
}
rootPath = EnsureDirectorySeparatorChar(rootPath);
rootUrl = EnsureUrlSeparatorChar(rootUrl);
_rootPath = rootPath.TrimEnd(Path.DirectorySeparatorChar);
_rootUrl = rootUrl.TrimEnd('/');
}
public IEnumerable<string> GetDirectories(string path)
{
path = EnsureTrailingSeparator(GetFullPath(path));
var fullPath = GetFullPath(path);
try
{
if (Directory.Exists(path))
return Directory.EnumerateDirectories(path).Select(GetRelativePath);
if (Directory.Exists(fullPath))
return Directory.EnumerateDirectories(fullPath).Select(GetRelativePath);
}
catch (UnauthorizedAccessException ex)
{
@@ -65,12 +87,13 @@ namespace Umbraco.Core.IO
public void DeleteDirectory(string path, bool recursive)
{
if (DirectoryExists(path) == false)
var fullPath = GetFullPath(path);
if (Directory.Exists(fullPath) == false)
return;
try
{
Directory.Delete(GetFullPath(path), recursive);
Directory.Delete(fullPath, recursive);
}
catch (DirectoryNotFoundException ex)
{
@@ -80,7 +103,8 @@ namespace Umbraco.Core.IO
public bool DirectoryExists(string path)
{
return Directory.Exists(GetFullPath(path));
var fullPath = GetFullPath(path);
return Directory.Exists(fullPath);
}
public void AddFile(string path, Stream stream)
@@ -90,17 +114,17 @@ namespace Umbraco.Core.IO
public void AddFile(string path, Stream stream, bool overrideIfExists)
{
var fsRelativePath = GetRelativePath(path);
var fullPath = GetFullPath(path);
var exists = File.Exists(fullPath);
if (exists && overrideIfExists == false)
throw new InvalidOperationException(string.Format("A file at path '{0}' already exists", path));
var exists = FileExists(fsRelativePath);
if (exists && overrideIfExists == false) throw new InvalidOperationException(string.Format("A file at path '{0}' already exists", path));
EnsureDirectory(Path.GetDirectoryName(fsRelativePath));
Directory.CreateDirectory(Path.GetDirectoryName(fullPath)); // ensure it exists
if (stream.CanSeek)
stream.Seek(0, 0);
using (var destination = (Stream)File.Create(GetFullPath(fsRelativePath)))
using (var destination = (Stream)File.Create(fullPath))
stream.CopyTo(destination);
}
@@ -111,9 +135,7 @@ namespace Umbraco.Core.IO
public IEnumerable<string> GetFiles(string path, string filter)
{
var fsRelativePath = GetRelativePath(path);
var fullPath = EnsureTrailingSeparator(GetFullPath(fsRelativePath));
var fullPath = GetFullPath(path);
try
{
@@ -140,12 +162,13 @@ namespace Umbraco.Core.IO
public void DeleteFile(string path)
{
if (!FileExists(path))
var fullPath = GetFullPath(path);
if (File.Exists(fullPath) == false)
return;
try
{
File.Delete(GetFullPath(path));
File.Delete(fullPath);
}
catch (FileNotFoundException ex)
{
@@ -155,39 +178,86 @@ namespace Umbraco.Core.IO
public bool FileExists(string path)
{
return File.Exists(GetFullPath(path));
var fullpath = GetFullPath(path);
return File.Exists(fullpath);
}
// beware, many things depend on how the GetRelative/AbsolutePath methods work!
/// <summary>
/// Gets the relative path.
/// </summary>
/// <param name="fullPathOrUrl">The full path or url.</param>
/// <returns>The path, relative to this filesystem's root.</returns>
/// <remarks>
/// <para>The relative path is relative to this filesystem's root, not starting with any
/// directory separator. If input was recognized as a url (path), then output uses url (path) separator
/// chars.</para>
/// </remarks>
public string GetRelativePath(string fullPathOrUrl)
{
var relativePath = fullPathOrUrl
.TrimStart(_rootUrl)
.Replace('/', Path.DirectorySeparatorChar)
.TrimStart(RootPath)
.TrimStart(Path.DirectorySeparatorChar);
// test url
var path = fullPathOrUrl.Replace('\\', '/'); // ensure url separator char
return relativePath;
if (IOHelper.PathStartsWith(path, _rootUrl, '/')) // if it starts with the root url...
return path.Substring(_rootUrl.Length) // strip it
.TrimStart('/'); // it's relative
// test path
path = EnsureDirectorySeparatorChar(fullPathOrUrl);
if (IOHelper.PathStartsWith(path, _rootPath, Path.DirectorySeparatorChar)) // if it starts with the root path
return path.Substring(_rootPath.Length) // strip it
.TrimStart(Path.DirectorySeparatorChar); // it's relative
// unchanged - including separators
return fullPathOrUrl;
}
/// <summary>
/// Gets the full path.
/// </summary>
/// <param name="path">The full or relative path.</param>
/// <returns>The full path.</returns>
/// <remarks>
/// <para>On the physical filesystem, the full path is the rooted (ie non-relative), safe (ie within this
/// filesystem's root) path. All separators are converted to Path.DirectorySeparatorChar.</para>
/// </remarks>
public string GetFullPath(string path)
{
//if the path starts with a '/' then it's most likely not a FS relative path which is required so convert it
if (path.StartsWith("/"))
{
path = GetRelativePath(path);
}
// normalize
var opath = path;
path = EnsureDirectorySeparatorChar(path);
return !path.StartsWith(RootPath)
? Path.Combine(RootPath, path)
: path;
// not sure what we are doing here - so if input starts with a (back) slash,
// we assume it's not a FS relative path and we try to convert it... but it
// really makes little sense?
if (path.StartsWith(Path.DirectorySeparatorChar.ToString()))
path = GetRelativePath(path);
// if already a full path, return
if (IOHelper.PathStartsWith(path, _rootPath, Path.DirectorySeparatorChar))
return path;
// else combine and sanitize, ie GetFullPath will take care of any relative
// segments in path, eg '../../foo.tmp' - it may throw a SecurityException
// if the combined path reaches illegal parts of the filesystem
var fpath = Path.Combine(_rootPath, path);
fpath = Path.GetFullPath(fpath);
// at that point, path is within legal parts of the filesystem, ie we have
// permissions to reach that path, but it may nevertheless be outside of
// our root path, due to relative segments, so better check
if (IOHelper.PathStartsWith(fpath, _rootPath, Path.DirectorySeparatorChar))
return fpath;
throw new FileSecurityException("File '" + opath + "' is outside this filesystem's root.");
}
public string GetUrl(string path)
{
return _rootUrl.TrimEnd("/") + "/" + path
.TrimStart(Path.DirectorySeparatorChar)
.Replace(Path.DirectorySeparatorChar, '/')
.TrimEnd("/");
path = EnsureUrlSeparatorChar(path).Trim('/');
return _rootUrl + "/" + path;
}
public DateTimeOffset GetLastModified(string path)
@@ -214,9 +284,19 @@ namespace Umbraco.Core.IO
protected string EnsureTrailingSeparator(string path)
{
if (!path.EndsWith(Path.DirectorySeparatorChar.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal))
path = path + Path.DirectorySeparatorChar;
return path.EnsureEndsWith(Path.DirectorySeparatorChar);
}
protected string EnsureDirectorySeparatorChar(string path)
{
path = path.Replace('/', Path.DirectorySeparatorChar);
path = path.Replace('\\', Path.DirectorySeparatorChar);
return path;
}
protected string EnsureUrlSeparatorChar(string path)
{
path = path.Replace('\\', '/');
return path;
}
+1 -1
View File
@@ -154,7 +154,7 @@ namespace Umbraco.Core.IO
{
get
{
return IOHelper.ReturnPath("umbracoWebservicesPath", "~/umbraco/webservices");
return IOHelper.ReturnPath("umbracoWebservicesPath", Umbraco.EnsureEndsWith("/") + "webservices");
}
}
+2 -2
View File
@@ -199,8 +199,8 @@ namespace Umbraco.Core.IO
using (var image = Image.FromStream(fs))
{
var fileNameThumb = string.IsNullOrWhiteSpace(fileNameAddition)
? string.Format("{0}_UMBRACOSYSTHUMBNAIL.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)))
: string.Format("{0}_{1}.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)), fileNameAddition);
? string.Format("{0}_UMBRACOSYSTHUMBNAIL." + Extension, Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)))
: string.Format("{0}_{1}." + Extension, Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)), fileNameAddition);
var thumbnail = maxWidthHeight == -1
? ImageHelper.GenerateThumbnail(image, width, height, fileNameThumb, Extension, _fs)
@@ -0,0 +1,105 @@
using System;
using log4net.Appender;
using log4net.Core;
using log4net.Util;
namespace Umbraco.Core.Logging
{
/// <remarks>
/// Based on https://github.com/cjbhaines/Log4Net.Async
/// </remarks>
public abstract class AsyncForwardingAppenderBase : ForwardingAppender
{
#region Private Members
private const FixFlags DefaultFixFlags = FixFlags.Partial;
private FixFlags _fixFlags = DefaultFixFlags;
private LoggingEventHelper _loggingEventHelper;
#endregion Private Members
#region Properties
public FixFlags Fix
{
get { return _fixFlags; }
set { SetFixFlags(value); }
}
/// <summary>
/// The logger name that will be used for logging internal errors.
/// </summary>
protected abstract string InternalLoggerName { get; }
public abstract int? BufferSize { get; set; }
#endregion Properties
public override void ActivateOptions()
{
base.ActivateOptions();
_loggingEventHelper = new LoggingEventHelper(InternalLoggerName, DefaultFixFlags);
InitializeAppenders();
}
#region Appender Management
public override void AddAppender(IAppender newAppender)
{
base.AddAppender(newAppender);
SetAppenderFixFlags(newAppender);
}
private void SetFixFlags(FixFlags newFixFlags)
{
if (newFixFlags != _fixFlags)
{
_loggingEventHelper.Fix = newFixFlags;
_fixFlags = newFixFlags;
InitializeAppenders();
}
}
private void InitializeAppenders()
{
foreach (var appender in Appenders)
{
SetAppenderFixFlags(appender);
}
}
private void SetAppenderFixFlags(IAppender appender)
{
var bufferingAppender = appender as BufferingAppenderSkeleton;
if (bufferingAppender != null)
{
bufferingAppender.Fix = Fix;
}
}
#endregion Appender Management
#region Forwarding
protected void ForwardInternalError(string message, Exception exception, Type thisType)
{
LogLog.Error(thisType, message, exception);
var loggingEvent = _loggingEventHelper.CreateLoggingEvent(Level.Error, message, exception);
ForwardLoggingEvent(loggingEvent, thisType);
}
protected void ForwardLoggingEvent(LoggingEvent loggingEvent, Type thisType)
{
try
{
base.Append(loggingEvent);
}
catch (Exception exception)
{
LogLog.Error(thisType, "Unable to forward logging event", exception);
}
}
#endregion Forwarding
}
}
@@ -1,276 +1,276 @@
using log4net.Core;
using log4net.Util;
using System;
using System.Runtime.Remoting.Messaging;
using System.Security.Principal;
using System.Threading;
using System.Threading.Tasks;
using log4net.Appender;
using log4net.Core;
using log4net.Util;
namespace Umbraco.Core.Logging
{
/// <summary>
/// Based on code by Chris Haines http://cjbhaines.wordpress.com/2012/02/13/asynchronous-log4net-appenders/
/// <summary>
/// Based on https://github.com/cjbhaines/Log4Net.Async
/// which is based on code by Chris Haines http://cjbhaines.wordpress.com/2012/02/13/asynchronous-log4net-appenders/
/// </summary>
public class AsynchronousRollingFileAppender : RollingFileAppender
{
private readonly ManualResetEvent _manualResetEvent;
private int _bufferOverflowCounter;
private bool _forceStop;
private bool _hasFinished;
private DateTime _lastLoggedBufferOverflow;
private bool _logBufferOverflow;
private RingBuffer<LoggingEvent> _pendingAppends;
private int _queueSizeLimit = 1000;
private bool _shuttingDown;
private RingBuffer<LoggingEvent> pendingAppends;
private readonly ManualResetEvent manualResetEvent;
private bool shuttingDown;
private bool hasFinished;
private bool forceStop;
private bool logBufferOverflow;
private int bufferOverflowCounter;
private DateTime lastLoggedBufferOverflow;
private int queueSizeLimit = 1000;
public int QueueSizeLimit
{
get
{
return queueSizeLimit;
}
set
{
queueSizeLimit = value;
}
}
public AsynchronousRollingFileAppender()
{
_manualResetEvent = new ManualResetEvent(false);
}
public AsynchronousRollingFileAppender()
{
manualResetEvent = new ManualResetEvent(false);
}
public int QueueSizeLimit
{
get { return _queueSizeLimit; }
set { _queueSizeLimit = value; }
}
public override void ActivateOptions()
{
base.ActivateOptions();
pendingAppends = new RingBuffer<LoggingEvent>(QueueSizeLimit);
pendingAppends.BufferOverflow += OnBufferOverflow;
StartAppendTask();
}
public override void ActivateOptions()
{
base.ActivateOptions();
_pendingAppends = new RingBuffer<LoggingEvent>(QueueSizeLimit);
_pendingAppends.BufferOverflow += OnBufferOverflow;
StartAppendTask();
}
protected override void Append(LoggingEvent[] loggingEvents)
{
Array.ForEach(loggingEvents, Append);
}
protected override void Append(LoggingEvent[] loggingEvents)
{
Array.ForEach(loggingEvents, Append);
}
protected override void Append(LoggingEvent loggingEvent)
{
if (FilterEvent(loggingEvent))
{
pendingAppends.Enqueue(loggingEvent);
}
}
protected override void Append(LoggingEvent loggingEvent)
{
if (FilterEvent(loggingEvent))
{
_pendingAppends.Enqueue(loggingEvent);
}
}
protected override void OnClose()
{
shuttingDown = true;
manualResetEvent.WaitOne(TimeSpan.FromSeconds(5));
protected override void OnClose()
{
_shuttingDown = true;
_manualResetEvent.WaitOne(TimeSpan.FromSeconds(5));
if (!hasFinished)
{
forceStop = true;
base.Append(new LoggingEvent(new LoggingEventData
{
Level = Level.Error,
Message = "Unable to clear out the AsyncRollingFileAppender buffer in the allotted time, forcing a shutdown",
TimeStamp = DateTime.UtcNow,
Identity = "",
ExceptionString = "",
UserName = WindowsIdentity.GetCurrent() != null ? WindowsIdentity.GetCurrent().Name : "",
Domain = AppDomain.CurrentDomain.FriendlyName,
ThreadName = Thread.CurrentThread.ManagedThreadId.ToString(),
LocationInfo = new LocationInfo(this.GetType().Name, "OnClose", "AsyncRollingFileAppender.cs", "75"),
LoggerName = this.GetType().FullName,
Properties = new PropertiesDictionary(),
})
);
}
if (!_hasFinished)
{
_forceStop = true;
var windowsIdentity = WindowsIdentity.GetCurrent();
base.OnClose();
}
var logEvent = new LoggingEvent(new LoggingEventData
{
Level = global::log4net.Core.Level.Error,
Message =
"Unable to clear out the AsynchronousRollingFileAppender buffer in the allotted time, forcing a shutdown",
TimeStamp = DateTime.UtcNow,
Identity = "",
ExceptionString = "",
UserName = windowsIdentity != null ? windowsIdentity.Name : "",
Domain = AppDomain.CurrentDomain.FriendlyName,
ThreadName = Thread.CurrentThread.ManagedThreadId.ToString(),
LocationInfo =
new LocationInfo(this.GetType().Name, "OnClose", "AsynchronousRollingFileAppender.cs", "59"),
LoggerName = this.GetType().FullName,
Properties = new PropertiesDictionary(),
});
private void StartAppendTask()
{
if (!shuttingDown)
{
Task appendTask = new Task(AppendLoggingEvents, TaskCreationOptions.LongRunning);
appendTask.LogErrors(LogAppenderError).ContinueWith(x => StartAppendTask()).LogErrors(LogAppenderError);
appendTask.Start();
}
}
if (this.DateTimeStrategy != null)
{
base.Append(logEvent);
}
}
private void LogAppenderError(string logMessage, Exception exception)
{
base.Append(new LoggingEvent(new LoggingEventData
{
Level = Level.Error,
Message = "Appender exception: " + logMessage,
TimeStamp = DateTime.UtcNow,
Identity = "",
ExceptionString = exception.ToString(),
UserName = WindowsIdentity.GetCurrent() != null ? WindowsIdentity.GetCurrent().Name : "",
Domain = AppDomain.CurrentDomain.FriendlyName,
ThreadName = Thread.CurrentThread.ManagedThreadId.ToString(),
LocationInfo = new LocationInfo(this.GetType().Name, "LogAppenderError", "AsyncRollingFileAppender.cs", "152"),
LoggerName = this.GetType().FullName,
Properties = new PropertiesDictionary(),
}));
}
base.OnClose();
}
private void AppendLoggingEvents()
{
LoggingEvent loggingEventToAppend;
while (!shuttingDown)
{
if (logBufferOverflow)
{
LogBufferOverflowError();
logBufferOverflow = false;
bufferOverflowCounter = 0;
lastLoggedBufferOverflow = DateTime.UtcNow;
}
private void StartAppendTask()
{
if (!_shuttingDown)
{
Task appendTask = new Task(AppendLoggingEvents, TaskCreationOptions.LongRunning);
appendTask.LogErrors(LogAppenderError).ContinueWith(x => StartAppendTask()).LogErrors(LogAppenderError);
appendTask.Start();
}
}
while (!pendingAppends.TryDequeue(out loggingEventToAppend))
{
Thread.Sleep(10);
if (shuttingDown)
{
break;
}
}
if (loggingEventToAppend == null)
{
continue;
}
private void LogAppenderError(string logMessage, Exception exception)
{
var windowsIdentity = WindowsIdentity.GetCurrent();
base.Append(new LoggingEvent(new LoggingEventData
{
Level = Level.Error,
Message = "Appender exception: " + logMessage,
TimeStamp = DateTime.UtcNow,
Identity = "",
ExceptionString = exception.ToString(),
UserName = windowsIdentity != null ? windowsIdentity.Name : "",
Domain = AppDomain.CurrentDomain.FriendlyName,
ThreadName = Thread.CurrentThread.ManagedThreadId.ToString(),
LocationInfo =
new LocationInfo(this.GetType().Name,
"LogAppenderError",
"AsynchronousRollingFileAppender.cs",
"100"),
LoggerName = this.GetType().FullName,
Properties = new PropertiesDictionary(),
}));
}
try
{
base.Append(loggingEventToAppend);
}
catch
{
}
}
private void AppendLoggingEvents()
{
LoggingEvent loggingEventToAppend;
while (!_shuttingDown)
{
if (_logBufferOverflow)
{
LogBufferOverflowError();
_logBufferOverflow = false;
_bufferOverflowCounter = 0;
_lastLoggedBufferOverflow = DateTime.UtcNow;
}
while (pendingAppends.TryDequeue(out loggingEventToAppend) && !forceStop)
{
try
{
base.Append(loggingEventToAppend);
}
catch
{
}
}
hasFinished = true;
manualResetEvent.Set();
}
while (!_pendingAppends.TryDequeue(out loggingEventToAppend))
{
Thread.Sleep(10);
if (_shuttingDown)
{
break;
}
}
if (loggingEventToAppend == null)
{
continue;
}
private void LogBufferOverflowError()
{
base.Append(new LoggingEvent(new LoggingEventData
{
Level = Level.Error,
Message = string.Format("Buffer overflow. {0} logging events have been lost in the last 30 seconds. [QueueSizeLimit: {1}]", bufferOverflowCounter, QueueSizeLimit),
TimeStamp = DateTime.UtcNow,
Identity = "",
ExceptionString = "",
UserName = WindowsIdentity.GetCurrent() != null ? WindowsIdentity.GetCurrent().Name : "",
Domain = AppDomain.CurrentDomain.FriendlyName,
ThreadName = Thread.CurrentThread.ManagedThreadId.ToString(),
LocationInfo = new LocationInfo(this.GetType().Name, "LogBufferOverflowError", "AsyncRollingFileAppender.cs", "152"),
LoggerName = this.GetType().FullName,
Properties = new PropertiesDictionary(),
}));
}
try
{
base.Append(loggingEventToAppend);
}
catch
{
}
}
private void OnBufferOverflow(object sender, EventArgs eventArgs)
{
bufferOverflowCounter++;
if (logBufferOverflow == false)
{
if (lastLoggedBufferOverflow < DateTime.UtcNow.AddSeconds(-30))
{
logBufferOverflow = true;
}
}
}
}
while (_pendingAppends.TryDequeue(out loggingEventToAppend) && !_forceStop)
{
try
{
base.Append(loggingEventToAppend);
}
catch
{
}
}
_hasFinished = true;
_manualResetEvent.Set();
}
internal interface IQueue<T>
{
void Enqueue(T item);
bool TryDequeue(out T ret);
}
private void LogBufferOverflowError()
{
var windowsIdentity = WindowsIdentity.GetCurrent();
base.Append(new LoggingEvent(new LoggingEventData
{
Level = Level.Error,
Message =
string.Format(
"Buffer overflow. {0} logging events have been lost in the last 30 seconds. [QueueSizeLimit: {1}]",
_bufferOverflowCounter,
QueueSizeLimit),
TimeStamp = DateTime.UtcNow,
Identity = "",
ExceptionString = "",
UserName = windowsIdentity != null ? windowsIdentity.Name : "",
Domain = AppDomain.CurrentDomain.FriendlyName,
ThreadName = Thread.CurrentThread.ManagedThreadId.ToString(),
LocationInfo =
new LocationInfo(this.GetType().Name,
"LogBufferOverflowError",
"AsynchronousRollingFileAppender.cs",
"172"),
LoggerName = this.GetType().FullName,
Properties = new PropertiesDictionary(),
}));
}
internal class RingBuffer<T> : IQueue<T>
{
private readonly object lockObject = new object();
private readonly T[] buffer;
private readonly int size;
private int readIndex = 0;
private int writeIndex = 0;
private bool bufferFull = false;
private void OnBufferOverflow(object sender, EventArgs eventArgs)
{
_bufferOverflowCounter++;
if (_logBufferOverflow == false)
{
if (_lastLoggedBufferOverflow < DateTime.UtcNow.AddSeconds(-30))
{
_logBufferOverflow = true;
}
}
}
public int Size { get { return size; } }
private class RingBuffer<T>
{
private readonly object _lockObject = new object();
private readonly T[] _buffer;
private readonly int _size;
private int _readIndex = 0;
private int _writeIndex = 0;
private bool _bufferFull = false;
public event Action<object, EventArgs> BufferOverflow;
public event Action<object, EventArgs> BufferOverflow;
public RingBuffer(int size)
{
this.size = size;
buffer = new T[size];
}
public RingBuffer(int size)
{
this._size = size;
_buffer = new T[size];
}
public void Enqueue(T item)
{
var bufferWasFull = false;
lock (lockObject)
{
buffer[writeIndex] = item;
writeIndex = (++writeIndex) % size;
if (bufferFull)
{
bufferWasFull = true;
readIndex = writeIndex;
}
else if (writeIndex == readIndex)
{
bufferFull = true;
}
}
public void Enqueue(T item)
{
lock (_lockObject)
{
_buffer[_writeIndex] = item;
_writeIndex = (++_writeIndex) % _size;
if (_bufferFull)
{
if (BufferOverflow != null)
{
BufferOverflow(this, EventArgs.Empty);
}
_readIndex = _writeIndex;
}
else if (_writeIndex == _readIndex)
{
_bufferFull = true;
}
}
}
if (bufferWasFull)
{
if (BufferOverflow != null)
{
BufferOverflow(this, EventArgs.Empty);
}
}
}
public bool TryDequeue(out T ret)
{
if (_readIndex == _writeIndex && !_bufferFull)
{
ret = default(T);
return false;
}
lock (_lockObject)
{
if (_readIndex == _writeIndex && !_bufferFull)
{
ret = default(T);
return false;
}
public bool TryDequeue(out T ret)
{
if (readIndex == writeIndex && !bufferFull)
{
ret = default(T);
return false;
}
lock (lockObject)
{
if (readIndex == writeIndex && !bufferFull)
{
ret = default(T);
return false;
}
ret = _buffer[_readIndex];
_readIndex = (++_readIndex) % _size;
_bufferFull = false;
return true;
}
}
}
}
ret = buffer[readIndex];
buffer[readIndex] = default(T);
readIndex = (++readIndex) % size;
bufferFull = false;
return true;
}
}
}
}
+17 -23
View File
@@ -1,4 +1,5 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
@@ -12,15 +13,20 @@ namespace Umbraco.Core.Logging
/// Used for logging
///</summary>
public class Logger : ILogger
{
{
public Logger(FileInfo log4NetConfigFile)
:this()
{
XmlConfigurator.Configure(log4NetConfigFile);
}
private Logger()
{
//Add custom global properties to the log4net context that we can use in our logging output
log4net.GlobalContext.Properties["processId"] = Process.GetCurrentProcess().Id;
log4net.GlobalContext.Properties["appDomainId"] = AppDomain.CurrentDomain.Id;
}
/// <summary>
@@ -53,31 +59,19 @@ namespace Umbraco.Core.Logging
return LogManager.GetLogger(getTypeFromInstance.GetType());
}
/// <summary>
/// Useful if the logger itself is running on another thread
/// </summary>
/// <param name="generateMessageFormat"></param>
/// <returns></returns>
private string PrefixThreadId(string generateMessageFormat)
{
return "[Thread " + Thread.CurrentThread.ManagedThreadId + "] " + generateMessageFormat;
}
public void Error(Type callingType, string message, Exception exception)
{
var logger = LogManager.GetLogger(callingType);
if (logger != null)
logger.Error(PrefixThreadId(message), exception);
logger.Error((message), exception);
}
public void Warn(Type callingType, string message, params Func<object>[] formatItems)
{
var logger = LogManager.GetLogger(callingType);
if (logger == null || logger.IsWarnEnabled == false) return;
logger.WarnFormat(PrefixThreadId(message), formatItems.Select(x => x.Invoke()).ToArray());
logger.WarnFormat((message), formatItems.Select(x => x.Invoke()).ToArray());
}
public void Warn(Type callingType, string message, bool showHttpTrace, params Func<object>[] formatItems)
@@ -92,7 +86,7 @@ namespace Umbraco.Core.Logging
var logger = LogManager.GetLogger(callingType);
if (logger == null || logger.IsWarnEnabled == false) return;
logger.WarnFormat(PrefixThreadId(message), formatItems.Select(x => x.Invoke()).ToArray());
logger.WarnFormat((message), formatItems.Select(x => x.Invoke()).ToArray());
}
@@ -105,7 +99,7 @@ namespace Umbraco.Core.Logging
var logger = LogManager.GetLogger(callingType);
if (logger == null || logger.IsWarnEnabled == false) return;
var executedParams = formatItems.Select(x => x.Invoke()).ToArray();
logger.WarnFormat(PrefixThreadId(message) + ". Exception: " + e, executedParams);
logger.WarnFormat((message) + ". Exception: " + e, executedParams);
}
/// <summary>
@@ -117,7 +111,7 @@ namespace Umbraco.Core.Logging
{
var logger = LogManager.GetLogger(callingType);
if (logger == null || logger.IsInfoEnabled == false) return;
logger.Info(PrefixThreadId(generateMessage.Invoke()));
logger.Info((generateMessage.Invoke()));
}
/// <summary>
@@ -131,7 +125,7 @@ namespace Umbraco.Core.Logging
var logger = LogManager.GetLogger(type);
if (logger == null || logger.IsInfoEnabled == false) return;
var executedParams = formatItems.Select(x => x.Invoke()).ToArray();
logger.InfoFormat(PrefixThreadId(generateMessageFormat), executedParams);
logger.InfoFormat((generateMessageFormat), executedParams);
}
@@ -144,7 +138,7 @@ namespace Umbraco.Core.Logging
{
var logger = LogManager.GetLogger(callingType);
if (logger == null || logger.IsDebugEnabled == false) return;
logger.Debug(PrefixThreadId(generateMessage.Invoke()));
logger.Debug((generateMessage.Invoke()));
}
/// <summary>
@@ -158,7 +152,7 @@ namespace Umbraco.Core.Logging
var logger = LogManager.GetLogger(type);
if (logger == null || logger.IsDebugEnabled == false) return;
var executedParams = formatItems.Select(x => x.Invoke()).ToArray();
logger.DebugFormat(PrefixThreadId(generateMessageFormat), executedParams);
logger.DebugFormat((generateMessageFormat), executedParams);
}
@@ -0,0 +1,17 @@
using log4net.Core;
namespace Umbraco.Core.Logging
{
/// <remarks>
/// Based on https://github.com/cjbhaines/Log4Net.Async
/// </remarks>
internal class LoggingEventContext
{
public LoggingEventContext(LoggingEvent loggingEvent)
{
LoggingEvent = loggingEvent;
}
public LoggingEvent LoggingEvent { get; set; }
}
}
@@ -0,0 +1,31 @@
using System;
using log4net.Core;
namespace Umbraco.Core.Logging
{
/// <remarks>
/// Based on https://github.com/cjbhaines/Log4Net.Async
/// </remarks>
internal class LoggingEventHelper
{
// needs to be a seperate class so that location is determined correctly by log4net when required
private static readonly Type HelperType = typeof(LoggingEventHelper);
private readonly string loggerName;
public FixFlags Fix { get; set; }
public LoggingEventHelper(string loggerName, FixFlags fix)
{
this.loggerName = loggerName;
Fix = fix;
}
public LoggingEvent CreateLoggingEvent(Level level, string message, Exception exception)
{
var loggingEvent = new LoggingEvent(HelperType, null, loggerName, level, message, exception);
loggingEvent.Fix = Fix;
return loggingEvent;
}
}
}
@@ -0,0 +1,307 @@
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
using log4net.Core;
using log4net.Util;
namespace Umbraco.Core.Logging
{
/// <summary>
/// An asynchronous appender based on <see cref="BlockingCollection{T}"/>
/// </summary>
/// <remarks>
/// Based on https://github.com/cjbhaines/Log4Net.Async
/// </remarks>
public class ParallelForwardingAppender : AsyncForwardingAppenderBase, IDisposable
{
#region Private Members
private const int DefaultBufferSize = 1000;
private BlockingCollection<LoggingEventContext> _loggingEvents;
private CancellationTokenSource _loggingCancelationTokenSource;
private CancellationToken _loggingCancelationToken;
private Task _loggingTask;
private Double _shutdownFlushTimeout = 1;
private TimeSpan _shutdownFlushTimespan = TimeSpan.FromSeconds(1);
private static readonly Type ThisType = typeof(ParallelForwardingAppender);
private volatile bool _shutDownRequested;
private int? _bufferSize = DefaultBufferSize;
#endregion Private Members
#region Properties
/// <summary>
/// Gets or sets the number of LoggingEvents that will be buffered. Set to null for unlimited.
/// </summary>
public override int? BufferSize
{
get { return _bufferSize; }
set { _bufferSize = value; }
}
public int BufferEntryCount
{
get
{
if (_loggingEvents == null) return 0;
return _loggingEvents.Count;
}
}
/// <summary>
/// Gets or sets the time period in which the system will wait for appenders to flush before canceling the background task.
/// </summary>
public Double ShutdownFlushTimeout
{
get
{
return _shutdownFlushTimeout;
}
set
{
_shutdownFlushTimeout = value;
}
}
protected override string InternalLoggerName
{
get { return "ParallelForwardingAppender"; }
}
#endregion Properties
#region Startup
public override void ActivateOptions()
{
base.ActivateOptions();
_shutdownFlushTimespan = TimeSpan.FromSeconds(_shutdownFlushTimeout);
StartForwarding();
}
private void StartForwarding()
{
if (_shutDownRequested)
{
return;
}
//Create a collection which will block the thread and wait for new entries
//if the collection is empty
if (BufferSize.HasValue && BufferSize > 0)
{
_loggingEvents = new BlockingCollection<LoggingEventContext>(BufferSize.Value);
}
else
{
//No limit on the number of events.
_loggingEvents = new BlockingCollection<LoggingEventContext>();
}
//The cancellation token is used to cancel a running task gracefully.
_loggingCancelationTokenSource = new CancellationTokenSource();
_loggingCancelationToken = _loggingCancelationTokenSource.Token;
_loggingTask = new Task(SubscriberLoop, _loggingCancelationToken);
_loggingTask.Start();
}
#endregion Startup
#region Shutdown
private void CompleteSubscriberTask()
{
_shutDownRequested = true;
if (_loggingEvents == null || _loggingEvents.IsAddingCompleted)
{
return;
}
//Don't allow more entries to be added.
_loggingEvents.CompleteAdding();
//Allow some time to flush
Thread.Sleep(_shutdownFlushTimespan);
if (!_loggingTask.IsCompleted && !_loggingCancelationToken.IsCancellationRequested)
{
_loggingCancelationTokenSource.Cancel();
//Wait here so that the error logging messages do not get into a random order.
//Don't pass the cancellation token because we are not interested
//in catching the OperationCanceledException that results.
_loggingTask.Wait();
}
if (!_loggingEvents.IsCompleted)
{
ForwardInternalError("The buffer was not able to be flushed before timeout occurred.", null, ThisType);
}
}
protected override void OnClose()
{
CompleteSubscriberTask();
base.OnClose();
}
#endregion Shutdown
#region Appending
protected override void Append(LoggingEvent loggingEvent)
{
if (_loggingEvents == null || _loggingEvents.IsAddingCompleted || loggingEvent == null)
{
return;
}
loggingEvent.Fix = Fix;
//In the case where blocking on a full collection, and the task is subsequently completed, the cancellation token
//will prevent the entry from attempting to add to the completed collection which would result in an exception.
_loggingEvents.Add(new LoggingEventContext(loggingEvent), _loggingCancelationToken);
}
protected override void Append(LoggingEvent[] loggingEvents)
{
if (_loggingEvents == null || _loggingEvents.IsAddingCompleted || loggingEvents == null)
{
return;
}
foreach (var loggingEvent in loggingEvents)
{
Append(loggingEvent);
}
}
#endregion Appending
#region Forwarding
/// <summary>
/// Iterates over a BlockingCollection containing LoggingEvents.
/// </summary>
private void SubscriberLoop()
{
Thread.CurrentThread.Name = String.Format("{0} ParallelForwardingAppender Subscriber Task", Name);
//The task will continue in a blocking loop until
//the queue is marked as adding completed, or the task is canceled.
try
{
//This call blocks until an item is available or until adding is completed
foreach (var entry in _loggingEvents.GetConsumingEnumerable(_loggingCancelationToken))
{
ForwardLoggingEvent(entry.LoggingEvent, ThisType);
}
}
catch (OperationCanceledException ex)
{
//The thread was canceled before all entries could be forwarded and the collection completed.
ForwardInternalError("Subscriber task was canceled before completion.", ex, ThisType);
//Cancellation is called in the CompleteSubscriberTask so don't call that again.
}
catch (ThreadAbortException ex)
{
//Thread abort may occur on domain unload.
ForwardInternalError("Subscriber task was aborted.", ex, ThisType);
//Cannot recover from a thread abort so complete the task.
CompleteSubscriberTask();
//The exception is swallowed because we don't want the client application
//to halt due to a logging issue.
}
catch (Exception ex)
{
//On exception, try to log the exception
ForwardInternalError("Subscriber task error in forwarding loop.", ex, ThisType);
//Any error in the loop is going to be some sort of extenuating circumstance from which we
//probably cannot recover anyway. Complete subscribing.
CompleteSubscriberTask();
}
}
#endregion Forwarding
#region IDisposable Implementation
private bool _disposed = false;
//Implement IDisposable.
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
if (_loggingTask != null)
{
if (!(_loggingTask.IsCanceled || _loggingTask.IsCompleted || _loggingTask.IsFaulted))
{
try
{
CompleteSubscriberTask();
}
catch (Exception ex)
{
LogLog.Error(ThisType, "Exception Completing Subscriber Task in Dispose Method", ex);
}
}
try
{
_loggingTask.Dispose();
}
catch (Exception ex)
{
LogLog.Error(ThisType, "Exception Disposing Logging Task", ex);
}
finally
{
_loggingTask = null;
}
}
if (_loggingEvents != null)
{
try
{
_loggingEvents.Dispose();
}
catch (Exception ex)
{
LogLog.Error(ThisType, "Exception Disposing BlockingCollection", ex);
}
finally
{
_loggingEvents = null;
}
}
if (_loggingCancelationTokenSource != null)
{
try
{
_loggingCancelationTokenSource.Dispose();
}
catch (Exception ex)
{
LogLog.Error(ThisType, "Exception Disposing CancellationTokenSource", ex);
}
finally
{
_loggingCancelationTokenSource = null;
}
}
}
_disposed = true;
}
}
// Use C# destructor syntax for finalization code.
~ParallelForwardingAppender()
{
// Simply call Dispose(false).
Dispose(false);
}
#endregion IDisposable Implementation
}
}
+6 -2
View File
@@ -11,8 +11,12 @@ namespace Umbraco.Core.Macros
/// </summary>
internal class MacroTagParser
{
private static readonly Regex MacroRteContent = new Regex(@"(<!--\s*?)(<\?UMBRACO_MACRO.*?/>)(\s*?-->)", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
private static readonly Regex MacroPersistedFormat = new Regex(@"(<\?UMBRACO_MACRO (?:.+)?macroAlias=[""']([^""\'\n\r]+?)[""'].+?)(?:/>|>.*?</\?UMBRACO_MACRO>)", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
private static readonly Regex MacroRteContent = new Regex(@"(<!--\s*?)(<\?UMBRACO_MACRO.*?/>)(\s*?-->)",
RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Singleline);
private static readonly Regex MacroPersistedFormat =
new Regex(@"(<\?UMBRACO_MACRO (?:.+?)??macroAlias=[""']([^""\'\n\r]+?)[""'].+?)(?:/>|>.*?</\?UMBRACO_MACRO>)",
RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Singleline);
/// <summary>
/// This formats the persisted string to something useful for the rte so that the macro renders properly since we
+189
View File
@@ -0,0 +1,189 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO.MemoryMappedFiles;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Hosting;
using Umbraco.Core.Logging;
using Umbraco.Core.ObjectResolution;
namespace Umbraco.Core
{
// represents the main domain
class MainDom : IRegisteredObject
{
#region Vars
private readonly ILogger _logger;
// our own lock for local consistency
private readonly object _locko = new object();
// async lock representing the main domain lock
private readonly AsyncLock _asyncLock;
private IDisposable _asyncLocker;
// event wait handle used to notify current main domain that it should
// release the lock because a new domain wants to be the main domain
private readonly EventWaitHandle _signal;
// indicates whether...
private volatile bool _isMainDom; // we are the main domain
private volatile bool _signaled; // we have been signaled
// actions to run before releasing the main domain
private readonly SortedList<int, Action> _callbacks = new SortedList<int, Action>();
private const int LockTimeoutMilliseconds = 90000; // (1.5 * 60 * 1000) == 1 min 30 seconds
#endregion
#region Ctor
// initializes a new instance of MainDom
public MainDom(ILogger logger)
{
_logger = logger;
var appId = string.Empty;
// HostingEnvironment.ApplicationID is null in unit tests, making ReplaceNonAlphanumericChars fail
if (HostingEnvironment.ApplicationID != null)
appId = HostingEnvironment.ApplicationID.ReplaceNonAlphanumericChars(string.Empty);
var lockName = "UMBRACO-" + appId + "-MAINDOM-LCK";
_asyncLock = new AsyncLock(lockName);
var eventName = "UMBRACO-" + appId + "-MAINDOM-EVT";
_signal = new EventWaitHandle(false, EventResetMode.AutoReset, eventName);
}
#endregion
// register a main domain consumer
public bool Register(Action release, int weight = 100)
{
return Register(null, release, weight);
}
// register a main domain consumer
public bool Register(Action install, Action release, int weight = 100)
{
lock (_locko)
{
if (_signaled) return false;
if (install != null)
install();
if (release != null)
_callbacks.Add(weight, release);
return true;
}
}
// handles the signal requesting that the main domain is released
private void OnSignal(string source)
{
// once signaled, we stop waiting, but then there is the hosting environment
// so we have to make sure that we only enter that method once
lock (_locko)
{
_logger.Debug<MainDom>("Signaled" + (_signaled ? " (again)" : "") + " (" + source + ").");
if (_signaled) return;
if (_isMainDom == false) return; // probably not needed
_signaled = true;
}
try
{
_logger.Debug<MainDom>("Stopping...");
foreach (var callback in _callbacks.Values)
{
try
{
callback(); // no timeout on callbacks
}
catch (Exception e)
{
_logger.Error<MainDom>("Error while running callback, remaining callbacks will not run.", e);
throw;
}
}
_logger.Debug<MainDom>("Stopped.");
}
finally
{
// in any case...
_isMainDom = false;
_asyncLocker.Dispose();
_logger.Debug<MainDom>("Released MainDom.");
}
}
// acquires the main domain
public bool Acquire()
{
lock (_locko) // we don't want the hosting environment to interfere by signaling
{
// if signaled, too late to acquire, give up
// the handler is not installed so that would be the hosting environment
if (_signaled)
{
_logger.Debug<MainDom>("Cannot acquire MainDom (signaled).");
return false;
}
_logger.Debug<MainDom>("Acquiring MainDom...");
// signal other instances that we want the lock, then wait one the lock,
// which may timeout, and this is accepted - see comments below
// signal, then wait for the lock, then make sure the event is
// resetted (maybe there was noone listening..)
_signal.Set();
// if more than 1 instance reach that point, one will get the lock
// and the other one will timeout, which is accepted
_asyncLocker = _asyncLock.Lock(LockTimeoutMilliseconds);
_isMainDom = true;
// we need to reset the event, because otherwise we would end up
// signaling ourselves and commiting suicide immediately.
// only 1 instance can reach that point, but other instances may
// have started and be trying to get the lock - they will timeout,
// which is accepted
_signal.Reset();
_signal.WaitOneAsync()
.ContinueWith(_ => OnSignal("signal"));
HostingEnvironment.RegisterObject(this);
_logger.Debug<MainDom>("Acquired MainDom.");
return true;
}
}
// gets a value indicating whether we are the main domain
public bool IsMainDom
{
get { return _isMainDom; }
}
// IRegisteredObject
public void Stop(bool immediate)
{
try
{
OnSignal("environment"); // will run once
}
finally
{
HostingEnvironment.UnregisterObject(this);
}
}
}
}
+23 -7
View File
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
@@ -96,11 +97,15 @@ namespace Umbraco.Core.Manifest
if (depth < 1)
{
var dirs = currDir.GetDirectories();
var result = new List<string>();
foreach (var d in dirs)
if (currDir.Exists)
{
result.AddRange(GetAllManifestFileContents(d));
var dirs = currDir.GetDirectories();
foreach (var d in dirs)
{
result.AddRange(GetAllManifestFileContents(d));
}
}
return result;
}
@@ -136,11 +141,22 @@ namespace Umbraco.Core.Manifest
{
var result = new List<PackageManifest>();
foreach (var m in manifestFileContents)
{
if (m.IsNullOrWhiteSpace()) continue;
{
var manifestContent = m;
if (manifestContent.IsNullOrWhiteSpace()) continue;
// Strip byte object marker, JSON.NET does not like it
var preamble = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
// Strangely StartsWith(preamble) would always return true
if (manifestContent.Substring(0, 1) == preamble)
manifestContent = manifestContent.Remove(0, preamble.Length);
if (manifestContent.IsNullOrWhiteSpace()) continue;
//remove any comments first
var replaced = CommentsSurround.Replace(m, match => " ");
var replaced = CommentsSurround.Replace(manifestContent, match => " ");
replaced = CommentsLine.Replace(replaced, match => "");
JObject deserialized;
@@ -150,7 +166,7 @@ namespace Umbraco.Core.Manifest
}
catch (Exception ex)
{
LogHelper.Error<ManifestParser>("An error occurred parsing manifest with contents: " + m, ex);
LogHelper.Error<ManifestParser>("An error occurred parsing manifest with contents: " + manifestContent, ex);
continue;
}
@@ -34,7 +34,7 @@ namespace Umbraco.Core.Media.Exif
}
/// <summary>
/// Expands ExifProperty objects contained in an ExifFile as seperate properties.
/// Expands ExifProperty objects contained in an ExifFile as separate properties.
/// </summary>
internal sealed class ExifFileTypeDescriptor : CustomTypeDescriptor
{
@@ -75,7 +75,7 @@ namespace Umbraco.Core.Media.Exif
{
if (items.ContainsKey (key))
items.Remove (key);
if (key == ExifTag.WindowsTitle || key == ExifTag.WindowsTitle || key == ExifTag.WindowsComment || key == ExifTag.WindowsAuthor || key == ExifTag.WindowsKeywords || key == ExifTag.WindowsSubject) {
if (key == ExifTag.WindowsTitle || key == ExifTag.WindowsComment || key == ExifTag.WindowsAuthor || key == ExifTag.WindowsKeywords || key == ExifTag.WindowsSubject) {
items.Add (key, new WindowsByteString (key, value));
} else {
items.Add (key, new ExifAscii (key, value, parent.Encoding));

Some files were not shown because too many files have changed in this diff Show More