using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using Umbraco.Core;
using Umbraco.Web.Security;
namespace Umbraco.Web
{
public static class ViewDataExtensions
{
public const string TokenUmbracoPath = "UmbracoPath";
public const string TokenInstallApiBaseUrl = "InstallApiBaseUrl";
public const string TokenUmbracoBaseFolder = "UmbracoBaseFolder";
public const string TokenExternalSignInError = "ExternalSignInError";
public const string TokenPasswordResetCode = "PasswordResetCode";
public static bool FromTempData(this ViewDataDictionary viewData, TempDataDictionary tempData, string token)
{
if (tempData[token] == null) return false;
viewData[token] = tempData[token];
return true;
}
///
/// Copies data from a request cookie to view data and then clears the cookie in the response
///
///
///
///
///
///
///
/// This is similar to TempData but in some cases we cannot use TempData which relies on the temp data provider and session.
/// The cookie value can either be a simple string value
///
///
internal static bool FromBase64CookieData(this ViewDataDictionary viewData, HttpContextBase httpContext, string cookieName)
{
var hasCookie = httpContext.Request.HasCookie(cookieName);
if (!hasCookie) return false;
// get the cookie value
var cookieVal = httpContext.Request.GetCookieValue(cookieName);
if (cookieVal == null)
return false;
// ensure the cookie is expired (must be done after reading the value)
httpContext.ExpireCookie(cookieName);
if (cookieVal.IsNullOrWhiteSpace())
return false;
try
{
var decoded = Encoding.UTF8.GetString(Convert.FromBase64String(System.Net.WebUtility.UrlDecode(cookieVal)));
// deserialize to T and store in viewdata
viewData[cookieName] = JsonConvert.DeserializeObject(decoded);
return true;
}
catch (Exception)
{
return false;
}
}
public static string GetUmbracoPath(this ViewDataDictionary viewData)
{
return (string)viewData[TokenUmbracoPath];
}
public static void SetUmbracoPath(this ViewDataDictionary viewData, string value)
{
viewData[TokenUmbracoPath] = value;
}
public static string GetInstallApiBaseUrl(this ViewDataDictionary viewData)
{
return (string)viewData[TokenInstallApiBaseUrl];
}
public static void SetInstallApiBaseUrl(this ViewDataDictionary viewData, string value)
{
viewData[TokenInstallApiBaseUrl] = value;
}
public static string GetUmbracoBaseFolder(this ViewDataDictionary viewData)
{
return (string)viewData[TokenUmbracoBaseFolder];
}
public static void SetUmbracoBaseFolder(this ViewDataDictionary viewData, string value)
{
viewData[TokenUmbracoBaseFolder] = value;
}
///
/// Used by the back office login screen to get any registered external login provider errors
///
///
///
public static BackOfficeExternalLoginProviderErrors GetExternalSignInProviderErrors(this ViewDataDictionary viewData)
{
return (BackOfficeExternalLoginProviderErrors)viewData[TokenExternalSignInError];
}
[Obsolete("Use GetExternalSignInProviderErrors instead")]
public static IEnumerable GetExternalSignInError(this ViewDataDictionary viewData)
{
var errs = viewData.GetExternalSignInProviderErrors();
return errs?.Errors ?? Enumerable.Empty();
}
///
/// Used by the back office controller to register any external login provider errors
///
///
///
public static void SetExternalSignInProviderErrors(this ViewDataDictionary viewData, BackOfficeExternalLoginProviderErrors errors)
{
viewData[TokenExternalSignInError] = errors;
}
[Obsolete("Use SetExternalSignInProviderErrors instead")]
public static void SetExternalSignInError(this ViewDataDictionary viewData, IEnumerable value)
{
viewData[TokenExternalSignInError] = new BackOfficeExternalLoginProviderErrors(string.Empty, value);
}
public static string GetPasswordResetCode(this ViewDataDictionary viewData)
{
return (string)viewData[TokenPasswordResetCode];
}
public static void SetPasswordResetCode(this ViewDataDictionary viewData, string value)
{
viewData[TokenPasswordResetCode] = value;
}
}
}