재우니의 블로그

  

    using System;
    using System.Collections.Specialized;
    using System.Web;

    public static class CookieHelper
    {
        public static void ClearCartCookie(Guid storeGuid)
        {
            if (storeGuid != Guid.Empty)
            {
                SetPersistentCookie(GetCartKey(storeGuid), string.Empty);
            }
        }

        public static bool CookieExists(string cookieName)
        {
            if (HttpContext.Current == null)
            {
                return false;
            }
            if (string.IsNullOrEmpty(cookieName))
            {
                return false;
            }
            return (HttpContext.Current.Request.Cookies[cookieName] != null);
        }

        public static string DecryptAndVerifyCookie(HttpCookie cookie, NameValueCollection serverVariables)
        {
            string[] strArray;
            if (cookie == null)
            {
                return null;
            }
            if (!CryptoHelper.DecryptAndVerifyData(cookie.Value, out strArray))
            {
                return null;
            }
            if ((strArray.Length == 3) && (DateTime.Parse(strArray[2]) < DateTime.Now))
            {
                return null;
            }
            if (strArray[1] != serverVariables["REMOTE_ADDR"])
            {
                return null;
            }
            return strArray[0];
        }

        public static void ExpireCookie(string cookieName)
        {
            if (!string.IsNullOrEmpty(cookieName) && (HttpContext.Current != null))
            {
                HttpCookie cookie = new HttpCookie(cookieName, string.Empty);
                cookie.HttpOnly = true;
                cookie.Expires = DateTime.Now.AddYears(-5);
                HttpContext.Current.Response.Cookies.Add(cookie);
            }
        }

        public static string GetCartCookie(Guid storeGuid)
        {
            if (storeGuid == Guid.Empty)
            {
                return string.Empty;
            }
            return GetCookieValue(GetCartKey(storeGuid));
        }

        public static string GetCartKey(Guid storeGuid)
        {
            return ("cart" + storeGuid.ToString());
        }

        public static string GetCookieValue(string cookieName)
        {
            if (HttpContext.Current == null)
            {
                return string.Empty;
            }
            if (string.IsNullOrEmpty(cookieName))
            {
                return string.Empty;
            }
            if (HttpContext.Current.Request.Cookies[cookieName] == null)
            {
                return string.Empty;
            }
            return HttpContext.Current.Request.Cookies.Get(cookieName).Value;
        }

        public static string GetSecureCookieValue(string cookieName)
        {
            if (HttpContext.Current == null)
            {
                return string.Empty;
            }
            if (string.IsNullOrEmpty(cookieName))
            {
                return string.Empty;
            }
            HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(cookieName);
            if (cookie == null)
            {
                return string.Empty;
            }
            return DecryptAndVerifyCookie(cookie, HttpContext.Current.Request.ServerVariables).ToString();
        }

        public static void SetCartCookie(Guid storeGuid, Guid cartGuid)
        {
            if ((storeGuid != Guid.Empty) && (cartGuid != Guid.Empty))
            {
                SetPersistentCookie("cart" + storeGuid.ToString(), cartGuid.ToString());
            }
        }

        public static void SetCookie(string cookieName, string cookieValue)
        {
            if ((!string.IsNullOrEmpty(cookieName) && !string.IsNullOrEmpty(cookieValue)) && (HttpContext.Current != null))
            {
                HttpCookie cookie = new HttpCookie(cookieName, cookieValue);
                cookie.HttpOnly = true;
                HttpContext.Current.Response.Cookies.Add(cookie);
            }
        }

        public static void SetCookie(string cookieName, string cookieValue, bool persistent)
        {
            if ((!string.IsNullOrEmpty(cookieName) && !string.IsNullOrEmpty(cookieValue)) && (HttpContext.Current != null))
            {
                if (persistent)
                {
                    SetPersistentCookie(cookieName, cookieValue);
                }
                else
                {
                    SetCookie(cookieName, cookieValue);
                }
            }
        }

        public static void SetPersistentCookie(string cookieName, string cookieValue)
        {
            if ((!string.IsNullOrEmpty(cookieName) && !string.IsNullOrEmpty(cookieValue)) && (HttpContext.Current != null))
            {
                HttpCookie cookie = new HttpCookie(cookieName, cookieValue);
                cookie.HttpOnly = true;
                cookie.Expires = DateTime.Now.AddYears(1);
                HttpContext.Current.Response.Cookies.Add(cookie);
            }
        }

        public static void SetSecureCookie(string cookieName, string cookieValue)
        {
            if ((!string.IsNullOrEmpty(cookieName) && !string.IsNullOrEmpty(cookieValue)) && (HttpContext.Current != null))
            {
                HttpCookie cookie = new HttpCookie(cookieName, cookieValue);
                cookie.HttpOnly = true;
                SignAndSecureCookie(cookie, HttpContext.Current.Request.ServerVariables);
                HttpContext.Current.Response.Cookies.Add(cookie);
            }
        }

        public static void SignAndSecureCookie(HttpCookie cookie, NameValueCollection serverVariables)
        {
            if (cookie.HasKeys)
            {
                throw new Exception("Does not support cookies with sub keys");
            }
            if (cookie.Expires != DateTime.MinValue)
            {
                cookie.Value = CryptoHelper.SignAndSecureData(new string[] { cookie.Value, serverVariables["REMOTE_ADDR"], cookie.Expires.ToString() });
            }
            else
            {
                cookie.Value = CryptoHelper.SignAndSecureData(new string[] { cookie.Value, serverVariables["REMOTE_ADDR"] });
            }
        }

        public static bool UserHasCartCookie(Guid storeGuid)
        {
            if (storeGuid == Guid.Empty)
            {
                return false;
            }
            return CookieExists("cart" + storeGuid.ToString());
        }
    }