diff --git a/src/Umbraco.Web.UI.Client/lib/angular/angular-cookies.js b/src/Umbraco.Web.UI.Client/lib/angular/angular-cookies.js
index fbf0acb406..44a728d2c4 100644
--- a/src/Umbraco.Web.UI.Client/lib/angular/angular-cookies.js
+++ b/src/Umbraco.Web.UI.Client/lib/angular/angular-cookies.js
@@ -1,183 +1,185 @@
/**
- * @license AngularJS v1.0.5
+ * @license AngularJS v1.0.7
* (c) 2010-2012 Google, Inc. http://angularjs.org
* License: MIT
*/
-(function(window, angular, undefined) {
-'use strict';
+(function (window, angular, undefined) {
+ 'use strict';
-/**
- * @ngdoc overview
- * @name ngCookies
- */
+ /**
+ * @ngdoc overview
+ * @name ngCookies
+ */
-angular.module('ngCookies', ['ng']).
- /**
- * @ngdoc object
- * @name ngCookies.$cookies
- * @requires $browser
- *
- * @description
- * Provides read/write access to browser's cookies.
- *
- * Only a simple Object is exposed and by adding or removing properties to/from
- * this object, new cookies are created/deleted at the end of current $eval.
- *
- * @example
-
-
-
-
-
- */
- factory('$cookies', ['$rootScope', '$browser', function ($rootScope, $browser) {
- var cookies = {},
- lastCookies = {},
- lastBrowserCookies,
- runEval = false,
- copy = angular.copy,
- isUndefined = angular.isUndefined;
+ angular.module('ngCookies', ['ng']).
+ /**
+ * @ngdoc object
+ * @name ngCookies.$cookies
+ * @requires $browser
+ *
+ * @description
+ * Provides read/write access to browser's cookies.
+ *
+ * Only a simple Object is exposed and by adding or removing properties to/from
+ * this object, new cookies are created/deleted at the end of current $eval.
+ *
+ * @example
+
+
+
+
+
+ */
+ factory('$cookies', ['$rootScope', '$browser', function ($rootScope, $browser) {
+ var cookies = {},
+ lastCookies = {},
+ lastBrowserCookies,
+ runEval = false,
+ copy = angular.copy,
+ isUndefined = angular.isUndefined;
- //creates a poller fn that copies all cookies from the $browser to service & inits the service
- $browser.addPollFn(function() {
- var currentCookies = $browser.cookies();
- if (lastBrowserCookies != currentCookies) { //relies on browser.cookies() impl
- lastBrowserCookies = currentCookies;
- copy(currentCookies, lastCookies);
- copy(currentCookies, cookies);
- if (runEval) $rootScope.$apply();
- }
- })();
+ //creates a poller fn that copies all cookies from the $browser to service & inits the service
+ $browser.addPollFn(function () {
+ var currentCookies = $browser.cookies();
+ if (lastBrowserCookies != currentCookies) { //relies on browser.cookies() impl
+ lastBrowserCookies = currentCookies;
+ copy(currentCookies, lastCookies);
+ copy(currentCookies, cookies);
+ if (runEval) $rootScope.$apply();
+ }
+ })();
- runEval = true;
+ runEval = true;
- //at the end of each eval, push cookies
- //TODO: this should happen before the "delayed" watches fire, because if some cookies are not
- // strings or browser refuses to store some cookies, we update the model in the push fn.
- $rootScope.$watch(push);
+ //at the end of each eval, push cookies
+ //TODO: this should happen before the "delayed" watches fire, because if some cookies are not
+ // strings or browser refuses to store some cookies, we update the model in the push fn.
+ $rootScope.$watch(push);
- return cookies;
+ return cookies;
+
+
+ /**
+ * Pushes all the cookies from the service to the browser and verifies if all cookies were stored.
+ */
+ function push() {
+ var name,
+ value,
+ browserCookies,
+ updated;
+
+ //delete any cookies deleted in $cookies
+ for (name in lastCookies) {
+ if (isUndefined(cookies[name])) {
+ $browser.cookies(name, undefined);
+ }
+ }
+
+ //update all cookies updated in $cookies
+ for (name in cookies) {
+ value = cookies[name];
+ if (!angular.isString(value)) {
+ if (angular.isDefined(lastCookies[name])) {
+ cookies[name] = lastCookies[name];
+ } else {
+ delete cookies[name];
+ }
+ } else if (value !== lastCookies[name]) {
+ $browser.cookies(name, value);
+ updated = true;
+ }
+ }
+
+ //verify what was actually stored
+ if (updated) {
+ updated = false;
+ browserCookies = $browser.cookies();
+
+ for (name in cookies) {
+ if (cookies[name] !== browserCookies[name]) {
+ //delete or reset all cookies that the browser dropped from $cookies
+ if (isUndefined(browserCookies[name])) {
+ delete cookies[name];
+ } else {
+ cookies[name] = browserCookies[name];
+ }
+ updated = true;
+ }
+ }
+ }
+ }
+ }]).
/**
- * Pushes all the cookies from the service to the browser and verifies if all cookies were stored.
+ * @ngdoc object
+ * @name ngCookies.$cookieStore
+ * @requires $cookies
+ *
+ * @description
+ * Provides a key-value (string-object) storage, that is backed by session cookies.
+ * Objects put or retrieved from this storage are automatically serialized or
+ * deserialized by angular's toJson/fromJson.
+ * @example
*/
- function push() {
- var name,
- value,
- browserCookies,
- updated;
+ factory('$cookieStore', ['$cookies', function ($cookies) {
- //delete any cookies deleted in $cookies
- for (name in lastCookies) {
- if (isUndefined(cookies[name])) {
- $browser.cookies(name, undefined);
- }
- }
+ return {
+ /**
+ * @ngdoc method
+ * @name ngCookies.$cookieStore#get
+ * @methodOf ngCookies.$cookieStore
+ *
+ * @description
+ * Returns the value of given cookie key
+ *
+ * @param {string} key Id to use for lookup.
+ * @returns {Object} Deserialized cookie value.
+ */
+ get: function (key) {
+ var value = $cookies[key];
+ return value ? angular.fromJson(value) : value;
+ },
- //update all cookies updated in $cookies
- for(name in cookies) {
- value = cookies[name];
- if (!angular.isString(value)) {
- if (angular.isDefined(lastCookies[name])) {
- cookies[name] = lastCookies[name];
- } else {
- delete cookies[name];
- }
- } else if (value !== lastCookies[name]) {
- $browser.cookies(name, value);
- updated = true;
- }
- }
+ /**
+ * @ngdoc method
+ * @name ngCookies.$cookieStore#put
+ * @methodOf ngCookies.$cookieStore
+ *
+ * @description
+ * Sets a value for given cookie key
+ *
+ * @param {string} key Id for the `value`.
+ * @param {Object} value Value to be stored.
+ */
+ put: function (key, value) {
+ $cookies[key] = angular.toJson(value);
+ },
- //verify what was actually stored
- if (updated){
- updated = false;
- browserCookies = $browser.cookies();
+ /**
+ * @ngdoc method
+ * @name ngCookies.$cookieStore#remove
+ * @methodOf ngCookies.$cookieStore
+ *
+ * @description
+ * Remove given cookie
+ *
+ * @param {string} key Id of the key-value pair to delete.
+ */
+ remove: function (key) {
+ delete $cookies[key];
+ }
+ };
- for (name in cookies) {
- if (cookies[name] !== browserCookies[name]) {
- //delete or reset all cookies that the browser dropped from $cookies
- if (isUndefined(browserCookies[name])) {
- delete cookies[name];
- } else {
- cookies[name] = browserCookies[name];
- }
- updated = true;
- }
- }
- }
- }
- }]).
+ }]);
- /**
- * @ngdoc object
- * @name ngCookies.$cookieStore
- * @requires $cookies
- *
- * @description
- * Provides a key-value (string-object) storage, that is backed by session cookies.
- * Objects put or retrieved from this storage are automatically serialized or
- * deserialized by angular's toJson/fromJson.
- * @example
- */
- factory('$cookieStore', ['$cookies', function($cookies) {
-
- return {
- /**
- * @ngdoc method
- * @name ngCookies.$cookieStore#get
- * @methodOf ngCookies.$cookieStore
- *
- * @description
- * Returns the value of given cookie key
- *
- * @param {string} key Id to use for lookup.
- * @returns {Object} Deserialized cookie value.
- */
- get: function(key) {
- return angular.fromJson($cookies[key]);
- },
-
- /**
- * @ngdoc method
- * @name ngCookies.$cookieStore#put
- * @methodOf ngCookies.$cookieStore
- *
- * @description
- * Sets a value for given cookie key
- *
- * @param {string} key Id for the `value`.
- * @param {Object} value Value to be stored.
- */
- put: function(key, value) {
- $cookies[key] = angular.toJson(value);
- },
-
- /**
- * @ngdoc method
- * @name ngCookies.$cookieStore#remove
- * @methodOf ngCookies.$cookieStore
- *
- * @description
- * Remove given cookie
- *
- * @param {string} key Id of the key-value pair to delete.
- */
- remove: function(key) {
- delete $cookies[key];
- }
- };
-
- }]);
-
-})(window, window.angular);
+})(window, window.angular);
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/lib/angular/angular-cookies.min.js b/src/Umbraco.Web.UI.Client/lib/angular/angular-cookies.min.js
index bd82c75d2c..2244789e89 100644
--- a/src/Umbraco.Web.UI.Client/lib/angular/angular-cookies.min.js
+++ b/src/Umbraco.Web.UI.Client/lib/angular/angular-cookies.min.js
@@ -1,7 +1,9 @@
-/*
- AngularJS v1.0.5
+/*
+ AngularJS v1.0.7
(c) 2010-2012 Google, Inc. http://angularjs.org
License: MIT
*/
-(function(m,f,l){'use strict';f.module("ngCookies",["ng"]).factory("$cookies",["$rootScope","$browser",function(d,c){var b={},g={},h,i=!1,j=f.copy,k=f.isUndefined;c.addPollFn(function(){var a=c.cookies();h!=a&&(h=a,j(a,g),j(a,b),i&&d.$apply())})();i=!0;d.$watch(function(){var a,e,d;for(a in g)k(b[a])&&c.cookies(a,l);for(a in b)e=b[a],f.isString(e)?e!==g[a]&&(c.cookies(a,e),d=!0):f.isDefined(g[a])?b[a]=g[a]:delete b[a];if(d)for(a in e=c.cookies(),b)b[a]!==e[a]&&(k(e[a])?delete b[a]:b[a]=e[a])});return b}]).factory("$cookieStore",
-["$cookies",function(d){return{get:function(c){return f.fromJson(d[c])},put:function(c,b){d[c]=f.toJson(b)},remove:function(c){delete d[c]}}}])})(window,window.angular);
+(function (m, f, l) {
+ 'use strict'; f.module("ngCookies", ["ng"]).factory("$cookies", ["$rootScope", "$browser", function (d, b) { var c = {}, g = {}, h, i = !1, j = f.copy, k = f.isUndefined; b.addPollFn(function () { var a = b.cookies(); h != a && (h = a, j(a, g), j(a, c), i && d.$apply()) })(); i = !0; d.$watch(function () { var a, e, d; for (a in g) k(c[a]) && b.cookies(a, l); for (a in c) e = c[a], f.isString(e) ? e !== g[a] && (b.cookies(a, e), d = !0) : f.isDefined(g[a]) ? c[a] = g[a] : delete c[a]; if (d) for (a in e = b.cookies(), c) c[a] !== e[a] && (k(e[a]) ? delete c[a] : c[a] = e[a]) }); return c }]).factory("$cookieStore",
+ ["$cookies", function (d) { return { get: function (b) { return (b = d[b]) ? f.fromJson(b) : b }, put: function (b, c) { d[b] = f.toJson(c) }, remove: function (b) { delete d[b] } } }])
+})(window, window.angular);
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/app.dev.js b/src/Umbraco.Web.UI.Client/src/app.dev.js
index fd806e6d25..42b4abb61a 100644
--- a/src/Umbraco.Web.UI.Client/src/app.dev.js
+++ b/src/Umbraco.Web.UI.Client/src/app.dev.js
@@ -4,5 +4,6 @@ var app = angular.module('umbraco', [
'umbraco.resources',
'umbraco.services',
'umbraco.httpbackend',
- 'umbraco.security'
+ 'umbraco.security',
+ 'ngCookies'
]);
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/app.js b/src/Umbraco.Web.UI.Client/src/app.js
index 921d490c19..02f45c2447 100644
--- a/src/Umbraco.Web.UI.Client/src/app.js
+++ b/src/Umbraco.Web.UI.Client/src/app.js
@@ -3,5 +3,6 @@ var app = angular.module('umbraco', [
'umbraco.directives',
'umbraco.resources',
'umbraco.services',
- 'umbraco.security'
+ 'umbraco.security',
+ 'ngCookies'
]);
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/umbproperty.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/umbproperty.directive.js
index dbdce22dd8..01f0dd6890 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/umbproperty.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/umbproperty.directive.js
@@ -10,7 +10,12 @@ angular.module("umbraco.directives")
restrict: 'E',
replace: true,
templateUrl: 'views/directives/umb-property.html',
- link: function(scope, element, attrs, ctrl) {
+ link: function (scope, element, attrs, ctrl) {
+
+ if (!scope || !scope.model || !scope.model.view) {
+ return;
+ }
+
scope.propertyEditorView = umbPropEditorHelper.getViewPath(scope.model.view);
}
};
diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/_module.js b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/_module.js
index ac14bd4a6a..2a9030fe0c 100644
--- a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/_module.js
+++ b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/_module.js
@@ -1 +1 @@
-angular.module("umbraco.mocks", []);
\ No newline at end of file
+angular.module("umbraco.mocks", ['ngCookies']);
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/_utills.js b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/_utills.js
index 1e31e4aa07..d43cd5cc41 100644
--- a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/_utills.js
+++ b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/_utills.js
@@ -1,18 +1,52 @@
angular.module('umbraco.mocks').
- factory('mocksUtills', function () {
- 'use strict';
+ factory('mocksUtills', ['$cookieStore', function($cookieStore) {
+ 'use strict';
+
+ //by default we will perform authorization
+ var doAuth = true;
- return {
- urlRegex: function(url) {
- url = url.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
- return new RegExp("^" + url);
- },
-
- getParameterByName: function(url, name) {
- name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
- var regex = new RegExp("[\\?&]" + name + "=([^]*)"),
- results = regex.exec(url);
- return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
- }
- };
- });
\ No newline at end of file
+ return {
+
+ /** generally used for unit tests, calling this will disable the auth check and always return true */
+ disableAuth: function() {
+ doAuth = false;
+ },
+
+ /** generally used for unit tests, calling this will enabled the auth check */
+ enabledAuth: function() {
+ doAuth = true;
+ },
+
+ /** Checks for our mock auth cookie, if it's not there, returns false */
+ checkAuth: function () {
+ if (doAuth) {
+ var mockAuthCookie = $cookieStore.get("mockAuthCookie");
+ if (!mockAuthCookie) {
+ return false;
+ }
+ return true;
+ }
+ else {
+ return true;
+ }
+ },
+
+ /** Creates/sets the auth cookie with a value indicating the user is now authenticated */
+ setAuth: function() {
+ //set the cookie for loging
+ $cookieStore.put("mockAuthCookie", "Logged in!");
+ },
+
+ urlRegex: function(url) {
+ url = url.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
+ return new RegExp("^" + url);
+ },
+
+ getParameterByName: function(url, name) {
+ name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
+ var regex = new RegExp("[\\?&]" + name + "=([^]*)"),
+ results = regex.exec(url);
+ return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
+ }
+ };
+ }]);
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/content.mocks.js b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/content.mocks.js
index 1abc57898b..b159d01274 100644
--- a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/content.mocks.js
+++ b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/content.mocks.js
@@ -3,6 +3,11 @@ angular.module('umbraco.mocks').
'use strict';
function returnEmptyNode(status, data, headers) {
+
+ if (!mocksUtills.checkAuth()) {
+ return [401, null, null];
+ }
+
var response = returnNodebyId(200, "", null);
var node = response[1];
var parentId = mocksUtills.getParameterByName(data, "parentId") || 1234;
@@ -21,6 +26,11 @@ angular.module('umbraco.mocks').
}
function returnNodebyId(status, data, headers) {
+
+ if (!mocksUtills.checkAuth()) {
+ return [401, null, null];
+ }
+
var id = mocksUtills.getParameterByName(data, "id") || "1234";
id = parseInt(id, 10);
diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/contenttype.mocks.js b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/contenttype.mocks.js
index fdc15f5b30..594094e711 100644
--- a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/contenttype.mocks.js
+++ b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/contenttype.mocks.js
@@ -3,6 +3,11 @@ angular.module('umbraco.mocks').
'use strict';
function returnAllowedChildren(status, data, headers) {
+
+ if (!mocksUtills.checkAuth()) {
+ return [401, null, null];
+ }
+
var types = [
{ name: "News Article", description: "Standard news article", alias: "newsArticle", id: 1234, cssClass: "file" },
{ name: "News Area", description: "Area to hold all news articles, there should be only one", alias: "newsArea", id: 1234, cssClass: "suitcase" },
diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/media.mocks.js b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/media.mocks.js
index 84c2bc5fe2..68c36b6280 100644
--- a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/media.mocks.js
+++ b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/media.mocks.js
@@ -3,6 +3,11 @@ angular.module('umbraco.mocks').
'use strict';
function returnNodebyId(status, data, headers) {
+
+ if (!mocksUtills.checkAuth()) {
+ return [401, null, null];
+ }
+
var id = mocksUtills.getParameterByName(data, "id") || 1234;
var node = {
@@ -81,12 +86,12 @@ angular.module('umbraco.mocks').
return {
register: function() {
$httpBackend
- .whenGET(mocksUtills.urlRegex('/umbraco/UmbracoApi/Content/GetById'))
+ .whenGET(mocksUtills.urlRegex('/umbraco/UmbracoApi/Media/GetById'))
.respond(returnNodebyId);
},
expectGetById: function() {
$httpBackend
- .expectGET(mocksUtills.urlRegex('/umbraco/UmbracoApi/Content/GetById'));
+ .expectGET(mocksUtills.urlRegex('/umbraco/UmbracoApi/Media/GetById'));
}
};
}]);
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/section.resource.js b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/section.resource.js
index bd866495b8..d9c4107b25 100644
--- a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/section.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/section.resource.js
@@ -7,6 +7,11 @@ function sectionMocks($httpBackend, mocksUtills) {
/** internal method to mock the sections to be returned */
function getSections() {
+
+ if (!mocksUtills.checkAuth()) {
+ return [401, null, null];
+ }
+
var sections = [
{ name: "Content", cssclass: "traycontent", alias: "content" },
{ name: "Media", cssclass: "traymedia", alias: "media" },
diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/tree.mocks.js b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/tree.mocks.js
index 3f648ea8f6..c45d1e3b41 100644
--- a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/tree.mocks.js
+++ b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/tree.mocks.js
@@ -4,6 +4,10 @@ angular.module('umbraco.mocks').
function getMenuItems() {
+ if (!mocksUtills.checkAuth()) {
+ return [401, null, null];
+ }
+
var menu = [
{ name: "Create", cssclass: "plus", alias: "create" },
@@ -30,6 +34,10 @@ angular.module('umbraco.mocks').
function returnChildren(status, data, headers) {
+ if (!mocksUtills.checkAuth()) {
+ return [401, null, null];
+ }
+
var id = mocksUtills.getParameterByName(data, "id");
var section = mocksUtills.getParameterByName(data, "treeType");
var level = mocksUtills.getParameterByName(data, "level")+1;
@@ -54,6 +62,11 @@ angular.module('umbraco.mocks').
}
function returnApplicationTrees(status, data, headers) {
+
+ if (!mocksUtills.checkAuth()) {
+ return [401, null, null];
+ }
+
var section = mocksUtills.getParameterByName(data, "application");
var url = "/umbraco/UmbracoTrees/ApplicationTreeApi/GetChildren?treeType=" + section + "&id=1234&level=1";
var menuUrl = "/umbraco/UmbracoTrees/ApplicationTreeApi/GetMenu?treeType=" + section + "&id=1234&parentId=456";
diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/user.mocks.js b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/user.mocks.js
index 0255023f0f..ca8e005cc3 100644
--- a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/user.mocks.js
+++ b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/user.mocks.js
@@ -1,25 +1,34 @@
angular.module('umbraco.mocks').
factory('userMocks', ['$httpBackend', 'mocksUtills', function ($httpBackend, mocksUtills) {
'use strict';
-
- var firsttry = true;
- function returnUser(status, data, headers) {
- var app = mocksUtills.getParameterByName(data, "application");
+
+ var mocked = {
+ name: "Per Ploug",
+ email: "test@test.com",
+ emailHash: "f9879d71855b5ff21e4963273a886bfc",
+ id: 0,
+ locale: 'da-DK'
+ };
- var mocked = {
- name: "Per Ploug",
- email: "test@test.com",
- emailHash: "f9879d71855b5ff21e4963273a886bfc",
- id: 0,
- locale: 'da-DK'
- };
-
- if (firsttry) {
- firsttry = false;
- return [200, mocked, null];
- } else {
+ function getCurrentUser(status, data, headers) {
+ //check for existence of a cookie so we can do login/logout in the belle app (ignore for tests).
+ if (!mocksUtills.checkAuth()) {
+ //return a 204 with a null value
+ //return [204, null, null];
+
+ return [401, null, null];
+ }
+ else {
return [200, mocked, null];
}
+ }
+
+ function returnUser(status, data, headers) {
+
+ //set the cookie for loging
+ mocksUtills.setAuth();
+
+ return [200, mocked, null];
}
return {
@@ -32,7 +41,7 @@ angular.module('umbraco.mocks').
$httpBackend
.whenGET('/umbraco/UmbracoApi/Authentication/GetCurrentUser')
- .respond(returnUser);
+ .respond(getCurrentUser);
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.httpbackend.js b/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.httpbackend.js
index 2c0568bf65..2ccbe13d67 100644
--- a/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.httpbackend.js
+++ b/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.httpbackend.js
@@ -1,12 +1,13 @@
var umbracoAppDev = angular.module('umbraco.httpbackend', ['umbraco', 'ngMockE2E', 'umbraco.mocks']);
-function initBackEnd($httpBackend, contentMocks, treeMocks, userMocks, contentTypeMocks, sectionMocks) {
+function initBackEnd($httpBackend, contentMocks, mediaMocks, treeMocks, userMocks, contentTypeMocks, sectionMocks) {
console.log("httpBackend inited");
//Register mocked http responses
- contentMocks.register();
+ contentMocks.register();
+ mediaMocks.register();
sectionMocks.register();
treeMocks.register();
diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/auth.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/auth.resource.js
index 63ef482ddc..18d78a8789 100644
--- a/src/Umbraco.Web.UI.Client/src/common/resources/auth.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/auth.resource.js
@@ -33,19 +33,7 @@ function authResource($q, $http, angularHelper) {
return angularHelper.resourcePromise(
$http.get(getIsAuthUrl()),
- {
- success: function (data, status, headers, config) {
- //204 - means the current user is not-authorized, the result was empty.
- if (status === 204) {
- //if it's unauthorized it just means we are not authenticated so we'll just return null
- return null;
- }
- else {
- return data;
- }
- },
- errorMsg: 'Server call failed for checking authorization'
- });
+ 'Server call failed for checking authorization');
}
};
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/security/security.service.js b/src/Umbraco.Web.UI.Client/src/common/security/security.service.js
index 4e4f2adc77..fc8b51f121 100644
--- a/src/Umbraco.Web.UI.Client/src/common/security/security.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/security/security.service.js
@@ -1,5 +1,8 @@
// Based loosely around work by Witold Szczerba - https://github.com/witoldsz/angular-http-auth
+//TODO: We need to streamline the usage of this class and the overlap it has with userService and authResource!
+// SD: IMO, I think we can remove this class and just put this all into the userService class.
+
angular.module('umbraco.security.service', [
'umbraco.security.retryQueue', // Keeps track of failed requests that need to be retried once the user logs in
'umbraco.resources',
@@ -8,112 +11,72 @@ angular.module('umbraco.security.service', [
.factory('security', ['$http', '$q', '$location', 'securityRetryQueue', 'authResource', 'dialogService', '$log',
function ($http, $q, $location, queue, authResource, dialogService, $log) {
- // Register a handler for when an item is added to the retry queue
- queue.onItemAddedCallbacks.push(function (retryItem) {
- if (queue.hasMore()) {
- service.showLogin();
- }
- });
-
-
- // Redirect to the given url (defaults to '/')
- function redirect(url) {
- url = url || '/';
- $location.path(url);
- }
-
- // Login form dialog stuff
- var loginDialog = null;
-
- function openLoginDialog() {
- if ( loginDialog ) {
- throw new Error('Trying to open a dialog that is already open!');
- }
-
- loginDialog = dialogService.open({
- template: 'views/common/dialogs/login.html',
- modalClass: "login-overlay",
- animation: "slide",
- show: true,
- callback: onLoginDialogClose});
- }
-
- //function closeLoginDialog(success) {
- // if (loginDialog) {
- // loginDialog = null;
- // }
- //}
-
- function onLoginDialogClose(success) {
- loginDialog = null;
-
- if ( success ) {
- queue.retryAll();
- } else {
- queue.cancelAll();
- redirect();
- }
- }
-
- //TODO: Clean this class up since most of this doesn't do anything!
+ // Register a handler for when an item is added to the retry queue
+ queue.onItemAddedCallbacks.push(function (retryItem) {
+ if (queue.hasMore()) {
+ service.showLogin();
+ }
+ });
- // The public API of the service
- var service = {
-
- //// Get the first reason for needing a login
- //getLoginReason: function() {
- // return queue.retryReason();
- //},
-
- // Show the modal login dialog
- showLogin: function() {
- openLoginDialog();
- },
-
- //// Attempt to authenticate a user by the given email and password
- //login: function(email, password) {
- // var request = $http.post('/login', {email: email, password: password});
- // return request.then(function(response) {
- // service.currentUser = response.data.user;
- // if ( service.isAuthenticated() ) {
- // closeLoginDialog(true);
- // }
- // });
- //},
-
- //// Give up trying to login and clear the retry queue
- //cancelLogin: function() {
- // closeLoginDialog(false);
- // redirect();
- //},
-
- //// Logout the current user and redirect
- //logout: function(redirectTo) {
- // $http.post('/logout').then(function() {
- // service.currentUser = null;
- // redirect(redirectTo);
- // });
- //},
-
- // Ask the backend to see if a user is already authenticated - this may be from a previous session.
- requestCurrentUser: function() {
- if ( service.isAuthenticated() ) {
- return $q.when(service.currentUser);
- } else {
- service.currentUser = authResource.currentUser;
- return service.currentUser;
+ // Redirect to the given url (defaults to '/')
+ function redirect(url) {
+ url = url || '/';
+ $location.path(url);
}
- },
- // Information about the current user
- currentUser: null,
+ // Login form dialog stuff
+ var loginDialog = null;
- // Is the current user authenticated?
- isAuthenticated: function(){
- return !!service.currentUser;
- }
- };
+ function openLoginDialog() {
+ if (!loginDialog) {
+ loginDialog = dialogService.open({
+ template: 'views/common/dialogs/login.html',
+ modalClass: "login-overlay",
+ animation: "slide",
+ show: true,
+ callback: onLoginDialogClose
+ });
+ }
+ }
- return service;
-}]);
\ No newline at end of file
+ function onLoginDialogClose(success) {
+ loginDialog = null;
+
+ if (success) {
+ queue.retryAll();
+ } else {
+ queue.cancelAll();
+ redirect();
+ }
+ }
+
+ // The public API of the service
+ var service = {
+
+ // Show the modal login dialog
+ showLogin: function () {
+ openLoginDialog();
+ },
+
+ // Ask the backend to see if a user is already authenticated - this may be from a previous session.
+ requestCurrentUser: function () {
+ if (service.isAuthenticated()) {
+ return $q.when(service.currentUser);
+ } else {
+ service.currentUser = authResource.currentUser;
+ return service.currentUser;
+ }
+ },
+
+ // Information about the current user
+ currentUser: null,
+
+ // Is the current user authenticated?
+ isAuthenticated: function () {
+ return !!service.currentUser;
+ }
+ };
+
+ return service;
+ }]);
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js
index 7f5832a152..0bbca1b7cd 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js
@@ -24,8 +24,6 @@ angular.module('umbraco.services')
var currentNode;
var ui = {};
- var _sections = sectionResource.getSections();
-
function setMode(mode) {
switch (mode) {
case 'tree':
@@ -69,8 +67,7 @@ angular.module('umbraco.services')
currentNode: currentNode,
mode: "default",
ui: ui,
- sections: _sections,
-
+
/**
* @ngdoc method
* @name umbraco.services.navigationService#load
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/user.service.js b/src/Umbraco.Web.UI.Client/src/common/services/user.service.js
index 0af24cf1d4..aa78bf5c17 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/user.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/user.service.js
@@ -1,48 +1,41 @@
angular.module('umbraco.services')
.factory('userService', function (authResource, $q) {
- var currentUser = null;
+ var currentUser = null;
return {
-
+
/** Returns a promise, sends a request to the server to check if the current cookie is authorized */
- isAuthenticated: function() {
- var deferred = $q.defer();
-
- $q.when(authResource.isAuthenticated())
+ isAuthenticated: function () {
+
+ return $q.when(authResource.isAuthenticated())
.then(function(data) {
- currentUser = data;
- currentUser.avatar = 'http://www.gravatar.com/avatar/' + data.emailHash + '?s=40';
-
- //note, this can return null if they are not authenticated
- deferred.resolve({ user: data, authenticated: true });
- },
- function(reason) {
- deferred.reject(reason);
- });
- return deferred.promise;
- },
+ //note, this can return null if they are not authenticated
+ if (!data) {
+ throw "Not authenticated";
+ }
+ else {
+ currentUser = data;
+ currentUser.avatar = 'http://www.gravatar.com/avatar/' + data.emailHash + '?s=40';
+ return { user: data, authenticated: true };
+ }
+ });
+ },
/** Returns a promise, sends a request to the server to validate the credentials */
authenticate: function (login, password) {
- var deferred = $q.defer();
-
- $q.when(authResource.performLogin(login, password))
- .then(function(data) {
+ return $q.when(authResource.performLogin(login, password))
+ .then(function (data) {
+ //when it's successful, return the user data
currentUser = data;
- deferred.resolve({ user: data, authenticated: true });
- },
- function(reason) {
- deferred.reject(reason);
- });
-
- return deferred.promise;
+ return { user: data, authenticated: true };
+ });
},
logout: function () {
- $rootScope.$apply(function () {
+ $rootScope.$apply(function () {
currentUser = undefined;
});
},
diff --git a/src/Umbraco.Web.UI.Client/src/loader.js b/src/Umbraco.Web.UI.Client/src/loader.js
index 1c8490e1f1..b00e75f242 100644
--- a/src/Umbraco.Web.UI.Client/src/loader.js
+++ b/src/Umbraco.Web.UI.Client/src/loader.js
@@ -2,8 +2,9 @@ yepnope({
load: [
'lib/jquery/jquery-1.8.2.min.js',
- 'lib/jquery/jquery.cookie.js',
+
'lib/angular/angular.min.js',
+ 'lib/angular/angular-cookies.min.js',
'lib/angular/angular-mocks.js',
'lib/bootstrap/js/bootstrap.js',
'lib/underscore/underscore.js',
diff --git a/src/Umbraco.Web.UI.Client/src/main.js b/src/Umbraco.Web.UI.Client/src/main.js
deleted file mode 100644
index 77187671ef..0000000000
--- a/src/Umbraco.Web.UI.Client/src/main.js
+++ /dev/null
@@ -1,75 +0,0 @@
-require.config({
- waitSeconds: 120,
- paths: {
- app: 'app_dev',
- jquery: '../lib/jquery/jquery-1.8.2.min',
- jqueryCookie: '../lib/jquery/jquery.cookie',
- umbracoExtensions: "../lib/umbraco/extensions",
- bootstrap: '../lib/bootstrap/js/bootstrap',
- underscore: '../lib/underscore/underscore',
- angular: '../lib/angular/angular.min',
- angularResource: '../lib/angular/angular-resource',
-
- app: 'app_dev',
-
- codemirror: '../lib/codemirror/js/lib/codemirror',
- codemirrorJs: '../lib/codemirror/js/mode/javascript/javascript',
- codemirrorCss: '../lib/codemirror/js/mode/css/css',
- codemirrorXml: '../lib/codemirror/js/mode/xml/xml',
- codemirrorHtml: '../lib/codemirror/js/mode/htmlmixed/htmlmixed',
-
- tinymce: '../lib/tinymce/tinymce.min',
- text: '../lib/require/text',
- async: '../lib/require/async',
- css: '../lib/require/css'
- },
- shim: {
- 'angular' : {'exports' : 'angular'},
- 'angular-resource': { deps: ['angular'] },
- 'bootstrap': { deps: ['jquery'] },
- 'jqueryCookie': { deps: ['jquery'] },
- 'underscore': {exports: '_'},
- 'codemirror': {exports: 'CodeMirror'},
- 'codemirrorJs':{deps:['codemirror']},
- 'codemirrorCss':{deps:['codemirror']},
- 'codemirrorXml':{deps:['codemirror']},
- 'codemirrorHtml':{deps:['codemirrorXml','codemirrorCss','codemirrorJs'], exports: 'mixedMode'},
- 'tinymce': {
- exports: 'tinyMCE',
- init: function () {
- this.tinymce.DOM.events.domLoaded = true;
- return this.tinymce;
- }
- }
- },
- priority: [
- "angular"
- ],
- urlArgs: 'v=1.1'
-});
-
-require( [
- 'angular',
- 'app',
- 'jquery',
- 'jqueryCookie',
- 'bootstrap',
- 'umbracoExtensions',
- 'umbraco.mocks',
- 'umbraco.directives',
- 'umbraco.filters',
- 'umbraco.services',
- 'umbraco.security',
- 'umbraco.controllers',
- 'routes'
- ], function(angular, app, jQuery) {
- //This function will be called when all the dependencies
- //listed above are loaded. Note that this function could
- //be called before the page is loaded.
- //This callback is optional.
-
- jQuery(document).ready(function () {
- angular.bootstrap(document, ['umbraco']);
- });
-
-});
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/main.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/main.controller.js
index 710e7ce619..d421919984 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/main.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/common/main.controller.js
@@ -10,7 +10,9 @@
*/
function MainController($scope, $routeParams, $rootScope, $timeout, notificationsService, userService, navigationService, legacyJsLoader) {
//set default properties
- $scope.authenticated = null; //the null is important because we do an explicit bool check on this in the view
+
+ //the null is important because we do an explicit bool check on this in the view
+ $scope.authenticated = null;
//subscribes to notifications in the notification service
$scope.notifications = notificationsService.current;
diff --git a/src/Umbraco.Web.UI.Client/test/config/app.unit.js b/src/Umbraco.Web.UI.Client/test/config/app.unit.js
index e21617e5f5..ed1d63bc18 100644
--- a/src/Umbraco.Web.UI.Client/test/config/app.unit.js
+++ b/src/Umbraco.Web.UI.Client/test/config/app.unit.js
@@ -4,5 +4,6 @@ var app = angular.module('umbraco', [
'umbraco.resources',
'umbraco.services',
'umbraco.mocks',
- 'umbraco.security'
+ 'umbraco.security',
+ 'ngCookies'
]);
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/test/config/karma.conf.js b/src/Umbraco.Web.UI.Client/test/config/karma.conf.js
index 8b6f171072..9a012be1a0 100644
--- a/src/Umbraco.Web.UI.Client/test/config/karma.conf.js
+++ b/src/Umbraco.Web.UI.Client/test/config/karma.conf.js
@@ -9,6 +9,7 @@ module.exports = function(karma) {
files: [
'lib/jquery/jquery-1.8.2.min.js',
'lib/angular/angular.min.js',
+ 'lib/angular/angular-cookies.min.js',
'lib/underscore/underscore.js',
'test/lib/angular/angular-mocks.js',
'lib/umbraco/Extensions.js',
diff --git a/src/Umbraco.Web.UI.Client/test/config/unit.js b/src/Umbraco.Web.UI.Client/test/config/unit.js
index d84fed1171..7f8b49e30e 100644
--- a/src/Umbraco.Web.UI.Client/test/config/unit.js
+++ b/src/Umbraco.Web.UI.Client/test/config/unit.js
@@ -8,6 +8,7 @@ files = [
'lib/jquery/jquery-1.8.2.min.js',
'lib/angular/angular.min.js',
+ 'lib/angular/angular-cookies.min.js',
'test/lib/angular/angular-mocks.js',
'lib/umbraco/Extensions.js',
'src/app_dev.js',
diff --git a/src/Umbraco.Web.UI.Client/test/unit/app/content/editContentController.spec.js b/src/Umbraco.Web.UI.Client/test/unit/app/content/editContentController.spec.js
index fd1d963e16..d8dd8277a9 100644
--- a/src/Umbraco.Web.UI.Client/test/unit/app/content/editContentController.spec.js
+++ b/src/Umbraco.Web.UI.Client/test/unit/app/content/editContentController.spec.js
@@ -5,7 +5,11 @@ describe('edit content controller tests', function () {
beforeEach(module('umbraco'));
//inject the contentMocks service
- beforeEach(inject(function ($rootScope, $controller, angularHelper, $httpBackend, contentMocks) {
+ beforeEach(inject(function ($rootScope, $controller, angularHelper, $httpBackend, contentMocks, mocksUtills) {
+
+ //for these tests we don't want any authorization to occur
+ mocksUtills.disableAuth();
+
httpBackend = $httpBackend;
scope = $rootScope.$new();
diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/contentFactory.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/contentFactory.spec.js
index 51d0d49a8d..349fde0549 100644
--- a/src/Umbraco.Web.UI.Client/test/unit/common/services/contentFactory.spec.js
+++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/contentFactory.spec.js
@@ -5,7 +5,11 @@ describe('content factory tests', function () {
beforeEach(module('umbraco.resources'));
beforeEach(module('umbraco.mocks'));
- beforeEach(inject(function ($injector) {
+ beforeEach(inject(function ($injector, mocksUtills) {
+
+ //for these tests we don't want any authorization to occur
+ mocksUtills.disableAuth();
+
$rootScope = $injector.get('$rootScope');
$httpBackend = $injector.get('$httpBackend');
mocks = $injector.get("contentMocks");
diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/contenttypeFactory.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/contenttypeFactory.spec.js
index 390820552c..261c5c0e8b 100644
--- a/src/Umbraco.Web.UI.Client/test/unit/common/services/contenttypeFactory.spec.js
+++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/contenttypeFactory.spec.js
@@ -5,7 +5,11 @@ describe('content type factory tests', function () {
beforeEach(module('umbraco.resources'));
beforeEach(module('umbraco.mocks'));
- beforeEach(inject(function ($injector) {
+ beforeEach(inject(function ($injector, mocksUtills) {
+
+ //for these tests we don't want any authorization to occur
+ mocksUtills.disableAuth();
+
$rootScope = $injector.get('$rootScope');
$httpBackend = $injector.get('$httpBackend');
mocks = $injector.get("contentTypeMocks");
diff --git a/src/Umbraco.Web.UI/umbraco/js/app.dev.js b/src/Umbraco.Web.UI/umbraco/js/app.dev.js
index fd806e6d25..42b4abb61a 100644
--- a/src/Umbraco.Web.UI/umbraco/js/app.dev.js
+++ b/src/Umbraco.Web.UI/umbraco/js/app.dev.js
@@ -4,5 +4,6 @@ var app = angular.module('umbraco', [
'umbraco.resources',
'umbraco.services',
'umbraco.httpbackend',
- 'umbraco.security'
+ 'umbraco.security',
+ 'ngCookies'
]);
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI/umbraco/js/loader.js b/src/Umbraco.Web.UI/umbraco/js/loader.js
index 1c8490e1f1..b00e75f242 100644
--- a/src/Umbraco.Web.UI/umbraco/js/loader.js
+++ b/src/Umbraco.Web.UI/umbraco/js/loader.js
@@ -2,8 +2,9 @@ yepnope({
load: [
'lib/jquery/jquery-1.8.2.min.js',
- 'lib/jquery/jquery.cookie.js',
+
'lib/angular/angular.min.js',
+ 'lib/angular/angular-cookies.min.js',
'lib/angular/angular-mocks.js',
'lib/bootstrap/js/bootstrap.js',
'lib/underscore/underscore.js',
diff --git a/src/Umbraco.Web/Editors/AuthenticationController.cs b/src/Umbraco.Web/Editors/AuthenticationController.cs
index 505d12253d..6dcf4cf149 100644
--- a/src/Umbraco.Web/Editors/AuthenticationController.cs
+++ b/src/Umbraco.Web/Editors/AuthenticationController.cs
@@ -43,11 +43,9 @@ namespace Umbraco.Web.Editors
Services.UserService.GetUserById(
UmbracoContext.Security.GetUserId(UmbracoContext.Security.UmbracoUserContextId));
return _userModelMapper.ToUserDetail(user);
- }
+ }
- //don't return not-authorized because this method is here to check if the current user is authorized.
- // if they are not, then we just return no content.
- throw new HttpResponseException(HttpStatusCode.NoContent);
+ throw new HttpResponseException(HttpStatusCode.Unauthorized);
}
public UserDetail PostLogin(string username, string password)
diff --git a/src/Umbraco.Web/UI/JavaScript/JsInitialize.js b/src/Umbraco.Web/UI/JavaScript/JsInitialize.js
index a4a5eacec6..ff9815f03b 100644
--- a/src/Umbraco.Web/UI/JavaScript/JsInitialize.js
+++ b/src/Umbraco.Web/UI/JavaScript/JsInitialize.js
@@ -1,7 +1,7 @@
[
'lib/jquery/jquery-1.8.2.min.js',
- 'lib/jquery/jquery.cookie.js',
'lib/angular/angular.min.js',
+ 'lib/angular/angular-cookies.min.js',
'lib/bootstrap/js/bootstrap.js',
'lib/underscore/underscore.js',
'lib/umbraco/Extensions.js',