Files
Umbraco-CMS/umbraco/businesslogic/BasePages/BasePage.cs
Shandem bd16513d55 Upgraded ClientDependency framework.
Fixes: 26756

[TFS Changeset #65446]
2010-04-13 11:16:15 +00:00

328 lines
12 KiB
C#

using System;
using System.Data;
using System.Web;
using umbraco.BusinessLogic;
using umbraco.DataLayer;
using umbraco.IO;
namespace umbraco.BasePages {
/// <summary>
/// umbraco.BasePages.BasePage is the default page type for the umbraco backend.
/// The basepage keeps track of the current user and the page context. But does not
/// Restrict access to the page itself.
/// The keep the page secure, the umbracoEnsuredPage class should be used instead
/// </summary>
public class BasePage : System.Web.UI.Page {
private User _user;
private bool _userisValidated = false;
private ClientTools m_clientTools;
// ticks per minute 600,000,000
private static long _ticksPrMinute = 600000000;
private static int _umbracoTimeOutInMinutes = GlobalSettings.TimeOutInMinutes;
/// <summary>
/// The path to the umbraco root folder
/// </summary>
protected string UmbracoPath = SystemDirectories.Umbraco;
/// <summary>
/// The current user ID
/// </summary>
protected int uid = 0;
/// <summary>
/// The page timeout in seconds.
/// </summary>
protected long timeout = 0;
/// <summary>
/// Gets the SQL helper.
/// </summary>
/// <value>The SQL helper.</value>
protected static ISqlHelper SqlHelper {
get { return umbraco.BusinessLogic.Application.SqlHelper; }
}
/// <summary>
/// Initializes a new instance of the <see cref="BasePage"/> class.
/// </summary>
public BasePage() {
}
/// <summary>
/// Returns the current BasePage for the current request.
/// This assumes that the current page is a BasePage, otherwise, returns null;
/// </summary>
public static BasePage Current
{
get
{
return HttpContext.Current.CurrentHandler as BasePage;
}
}
/// <summary>
/// Returns a refernce of an instance of ClientTools for access to the pages client API
/// </summary>
public ClientTools ClientTools
{
get
{
if (m_clientTools == null)
m_clientTools = new ClientTools(this);
return m_clientTools;
}
}
[Obsolete("Use ClientTools instead")]
public void RefreshPage(int Seconds)
{
ClientTools.RefreshAdmin(Seconds);
}
private void validateUser() {
if ((umbracoUserContextID != "")) {
uid = GetUserId(umbracoUserContextID);
timeout = GetTimeout(umbracoUserContextID);
if (timeout > DateTime.Now.Ticks) {
_user = BusinessLogic.User.GetUser(uid);
// Check for console access
if (_user.NoConsole && GlobalSettings.RequestIsInUmbracoApplication(HttpContext.Current) && !GlobalSettings.RequestIsLiveEditRedirector(HttpContext.Current))
{
throw new ArgumentException("You have no priviledges to the umbraco console. Please contact your administrator");
}
else
{
_userisValidated = true;
updateLogin();
}
} else {
throw new ArgumentException("User has timed out!!");
}
} else
throw new ArgumentException("The user has no umbraco contextid - try logging in");
}
/// <summary>
/// Gets the user id.
/// </summary>
/// <param name="umbracoUserContextID">The umbraco user context ID.</param>
/// <returns></returns>
public static int GetUserId(string umbracoUserContextID) {
try {
if (System.Web.HttpRuntime.Cache["UmbracoUserContext" + umbracoUserContextID] == null) {
System.Web.HttpRuntime.Cache.Insert(
"UmbracoUserContext" + umbracoUserContextID,
SqlHelper.ExecuteScalar<int>("select userID from umbracoUserLogins where contextID = @contextId",
SqlHelper.CreateParameter("@contextId", new Guid(umbracoUserContextID))
),
null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
new TimeSpan(0, (int)(_umbracoTimeOutInMinutes / 10), 0));
}
return (int)System.Web.HttpRuntime.Cache["UmbracoUserContext" + umbracoUserContextID];
} catch {
return -1;
}
}
// Added by NH to use with webservices authentications
/// <summary>
/// Validates the user context ID.
/// </summary>
/// <param name="umbracoUserContextID">The umbraco user context ID.</param>
/// <returns></returns>
public static bool ValidateUserContextID(string umbracoUserContextID) {
if ((umbracoUserContextID != "")) {
int uid = GetUserId(umbracoUserContextID);
long timeout = GetTimeout(umbracoUserContextID);
if (timeout > DateTime.Now.Ticks) {
return true;
} else {
BusinessLogic.Log.Add(BusinessLogic.LogTypes.Logout, BusinessLogic.User.GetUser(uid), -1, "");
return false;
}
} else
return false;
}
private static long GetTimeout(string umbracoUserContextID) {
if (System.Web.HttpRuntime.Cache["UmbracoUserContextTimeout" + umbracoUserContextID] == null) {
System.Web.HttpRuntime.Cache.Insert(
"UmbracoUserContextTimeout" + umbracoUserContextID,
SqlHelper.ExecuteScalar<long>("select timeout from umbracoUserLogins where contextId=@contextId",
SqlHelper.CreateParameter("@contextId", new Guid(umbracoUserContextID))
),
null,
DateTime.Now.AddMinutes(_umbracoTimeOutInMinutes / 10), System.Web.Caching.Cache.NoSlidingExpiration);
}
return (long)System.Web.HttpRuntime.Cache["UmbracoUserContextTimeout" + umbracoUserContextID];
}
// Changed to public by NH to help with webservice authentication
/// <summary>
/// Gets or sets the umbraco user context ID.
/// </summary>
/// <value>The umbraco user context ID.</value>
public static string umbracoUserContextID {
get
{
if (HttpContext.Current != null)
if (HttpContext.Current.Request != null)
if (HttpContext.Current.Request.Cookies != null)
{
HttpCookie userContext = HttpContext.Current.Request.Cookies.Get("UserContext");
if (userContext != null)
return userContext.Value;
}
return "";
}
set {
if (HttpContext.Current != null)
{
// Clearing all old cookies before setting a new one.
try
{
if (HttpContext.Current.Request != null)
if (HttpContext.Current.Request.Cookies["UserContext"] != null)
{
HttpContext.Current.Response.Cookies.Clear();
}
}
catch
{
}
// Create new cookie.
var c = new HttpCookie("UserContext");
c.Name = "UserContext";
c.Value = value;
c.Expires = DateTime.Now.AddDays(1);
HttpContext.Current.Response.Cookies.Add(c);
}
}
}
/// <summary>
/// Clears the login.
/// </summary>
public void ClearLogin() {
umbracoUserContextID = "";
}
private void updateLogin() {
// only call update if more than 1/10 of the timeout has passed
if (timeout - (((_ticksPrMinute * _umbracoTimeOutInMinutes) * 0.8)) < DateTime.Now.Ticks)
SqlHelper.ExecuteNonQuery(
"UPDATE umbracoUserLogins SET timeout = @timeout WHERE contextId = @contextId",
SqlHelper.CreateParameter("@timeout", DateTime.Now.Ticks + (_ticksPrMinute * _umbracoTimeOutInMinutes)),
SqlHelper.CreateParameter("@contextId", umbracoUserContextID));
}
/// <summary>
/// Logs a user in.
/// </summary>
/// <param name="u">The user</param>
public static void doLogin(User u) {
Guid retVal = Guid.NewGuid();
SqlHelper.ExecuteNonQuery(
"insert into umbracoUserLogins (contextID, userID, timeout) values (@contextId,'" + u.Id + "','" +
(DateTime.Now.Ticks + (_ticksPrMinute * _umbracoTimeOutInMinutes)).ToString() +
"') ",
SqlHelper.CreateParameter("@contextId", retVal));
umbracoUserContextID = retVal.ToString();
BusinessLogic.Log.Add(BusinessLogic.LogTypes.Login, u, -1, "");
}
/// <summary>
/// Gets the user.
/// </summary>
/// <returns></returns>
public User getUser() {
if (!_userisValidated) validateUser();
return _user;
}
/// <summary>
/// Ensures the page context.
/// </summary>
public void ensureContext() {
validateUser();
}
[Obsolete("Use ClientTools instead")]
public void speechBubble(speechBubbleIcon i, string header, string body)
{
ClientTools.ShowSpeechBubble(i, header, body);
}
//[Obsolete("Use ClientTools instead")]
//public void reloadParentNode()
//{
// ClientTools.ReloadParentNode(true);
//}
/// <summary>
/// a collection of available speechbubble icons
/// </summary>
public enum speechBubbleIcon {
/// <summary>
/// Save icon
/// </summary>
save,
/// <summary>
/// Info icon
/// </summary>
info,
/// <summary>
/// Error icon
/// </summary>
error,
/// <summary>
/// Success icon
/// </summary>
success,
/// <summary>
/// Warning icon
/// </summary>
warning
}
/// <summary>
/// Raises the <see cref="E:System.Web.UI.Control.Load"></see> event.
/// </summary>
/// <param name="e">The <see cref="T:System.EventArgs"></see> object that contains the event data.</param>
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
if (!Request.IsSecureConnection && GlobalSettings.UseSSL) {
string serverName = HttpUtility.UrlEncode(Request.ServerVariables["SERVER_NAME"]);
Response.Redirect(string.Format("https://{0}{1}", serverName, Request.FilePath));
}
}
/// <summary>
/// Override client target.
/// </summary>
[Obsolete("This is no longer supported")]
public bool OverrideClientTarget = false;
}
}