using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web;
using ServiceStack.Common;
using ServiceStack.ServiceHost;
using ServiceStack.ServiceInterface.Auth;
using ServiceStack.WebHost.Endpoints;
using ServiceStack.WebHost.Endpoints.Extensions;
namespace ServiceStack.ServiceInterface
{
public class SessionOptions
{
public const string Temporary = "temp";
public const string Permanent = "perm";
}
///
/// Configure ServiceStack to have ISession support
///
public static class SessionExtensions
{
public static string GetSessionId(this IHttpRequest httpReq)
{
var sessionOptions = GetSessionOptions(httpReq);
return sessionOptions.Contains(SessionOptions.Permanent)
? httpReq.GetItemOrCookie(SessionFeature.PermanentSessionId)
: httpReq.GetItemOrCookie(SessionFeature.SessionId);
}
public static string GetPermanentSessionId(this IHttpRequest httpReq)
{
return httpReq.GetItemOrCookie(SessionFeature.PermanentSessionId);
}
public static string GetTemporarySessionId(this IHttpRequest httpReq)
{
return httpReq.GetItemOrCookie(SessionFeature.SessionId);
}
///
/// Create the active Session or Permanent Session Id cookie.
///
///
public static string CreateSessionId(this IHttpResponse res, IHttpRequest req)
{
var sessionOptions = GetSessionOptions(req);
return sessionOptions.Contains(SessionOptions.Permanent)
? res.CreatePermanentSessionId(req)
: res.CreateTemporarySessionId(req);
}
///
/// Create both Permanent and Session Id cookies and return the active sessionId
///
///
public static string CreateSessionIds(this IHttpResponse res, IHttpRequest req)
{
var sessionOptions = GetSessionOptions(req);
var permId = res.CreatePermanentSessionId(req);
var tempId = res.CreateTemporarySessionId(req);
return sessionOptions.Contains(SessionOptions.Permanent)
? permId
: tempId;
}
public static string CreatePermanentSessionId(this IHttpResponse res, IHttpRequest req)
{
var sessionId = Convert.ToBase64String(Guid.NewGuid().ToByteArray());
res.Cookies.AddPermanentCookie(SessionFeature.PermanentSessionId, sessionId);
req.Items[SessionFeature.PermanentSessionId] = sessionId;
return sessionId;
}
public static string CreateTemporarySessionId(this IHttpResponse res, IHttpRequest req)
{
var sessionId = Convert.ToBase64String(Guid.NewGuid().ToByteArray());
res.Cookies.AddSessionCookie(SessionFeature.SessionId, sessionId);
req.Items[SessionFeature.SessionId] = sessionId;
return sessionId;
}
public static HashSet GetSessionOptions(this IHttpRequest httpReq)
{
var sessionOptions = httpReq.GetItemOrCookie(SessionFeature.SessionOptionsKey);
return sessionOptions.IsNullOrEmpty()
? new HashSet()
: sessionOptions.Split(',').ToHashSet();
}
public static void UpdateSession(this IAuthSession session, UserAuth userAuth)
{
if (userAuth == null || session == null) return;
session.Roles = userAuth.Roles;
session.Permissions = userAuth.Permissions;
}
public static void UpdateFromUserAuthRepo(this IAuthSession session, IHttpRequest req, IUserAuthRepository userAuthRepo = null)
{
if (userAuthRepo == null)
userAuthRepo = req.TryResolve();
if (userAuthRepo == null) return;
var userAuth = userAuthRepo.GetUserAuth(session, null);
session.UpdateSession(userAuth);
}
public static HashSet AddSessionOptions(this IHttpResponse res, IHttpRequest req, params string[] options)
{
if (res == null || req == null || options.Length == 0) return new HashSet();
var existingOptions = req.GetSessionOptions();
foreach (var option in options)
{
if (option.IsNullOrEmpty()) continue;
if (option == SessionOptions.Permanent)
existingOptions.Remove(SessionOptions.Temporary);
else if (option == SessionOptions.Temporary)
existingOptions.Remove(SessionOptions.Permanent);
existingOptions.Add(option);
}
var strOptions = String.Join(",", existingOptions.ToArray());
res.Cookies.AddPermanentCookie(SessionFeature.SessionOptionsKey, strOptions);
req.Items[SessionFeature.SessionOptionsKey] = strOptions;
return existingOptions;
}
public static IHttpRequest ToRequest(this HttpRequest aspnetHttpReq)
{
return new HttpRequestWrapper(aspnetHttpReq) {
Container = AppHostBase.Instance != null ? AppHostBase.Instance.Container : null
};
}
public static IHttpRequest ToRequest(this HttpListenerRequest listenerHttpReq)
{
return new HttpListenerRequestWrapper(listenerHttpReq) {
Container = AppHostBase.Instance != null ? AppHostBase.Instance.Container : null
};
}
public static IHttpResponse ToResponse(this HttpResponse aspnetHttpRes)
{
return new HttpResponseWrapper(aspnetHttpRes);
}
public static IHttpResponse ToResponse(this HttpListenerResponse listenerHttpRes)
{
return new HttpListenerResponseWrapper(listenerHttpRes);
}
}
}