using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Web;
using System.Web.Caching;
using System.Web.Security;
using System.Web.UI;
using CamlexNET;
using CamlexNET.Impl.Helpers;
using CKS.FormsBasedAuthentication;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint.Utilities;
using Constants = Taloyhtio.CustomFBADataSource.CodeFiles.Constants;
namespace Taloyhtio.CustomFBADataSource
{
public class CustomFBAUsersView : DataSourceView
{
// private const string CACHE_KEY = "{8BA20044-A520-4cd9-9588-5702D5C79DBC}";
// private const int DEFAULT_CACHE_LIVE_TIME_IN_MINUTES = 5;
// private const string CACHE_LIVE_TIME_KEY = "FBADataSourceCacheLiveTimeInMinutes";
// private object view;
public CustomFBAUsersView(IDataSource owner, string viewName) : base(owner, viewName)
{
// var type = typeof (FBADataSource).Assembly.GetType("CKS.FormsBasedAuthentication.FBAUsersView");
// this.view = Activator.CreateInstance(type, owner, viewName);
}
//
// protected override IEnumerable ExecuteSelect(DataSourceSelectArguments selectArgs)
// {
// var data = this.getData(selectArgs);
// return this.filterData(data, selectArgs);
// }
//
// private IEnumerable getData(DataSourceSelectArguments selectArgs)
// {
// if (HttpContext.Current.Cache[CACHE_KEY] == null)
// {
// var coll = ReflectionHelper.CallMethod(this.view, "ExecuteSelect", selectArgs);
// int cacheLiveTimeInMinutes = this.getCacheLiveTimeInMinutes();
// HttpContext.Current.Cache.Insert(CACHE_KEY, coll, null, DateTime.Now.AddMinutes(cacheLiveTimeInMinutes),
// Cache.NoSlidingExpiration);
// }
// return HttpContext.Current.Cache[CACHE_KEY] as IEnumerable;
// }
/*protected override IEnumerable ExecuteSelect(DataSourceSelectArguments selectArgs)
{
// only continue if a membership provider has been configured
if (!CodeFiles.Utils.IsProviderConfigured())
return null;
// get site details
var site = SPContext.Current.Site;
var settings = CodeFiles.Utils.GetFBAIisSettings(site);
if (settings == null)
return null;
var web = site.RootWeb;
// we only display users that have been added to SharePoint
// we use the localized name, safe for non-English SharePoint servers
var list = web.Lists[SPUtility.GetLocalizedString("$Resources:userinfo_schema_listtitle", "core", web.Language)];
// create query list
var query = new SPQuery();
query.Query = string.Format(
"" +
"" +
"Person" +
"{0}" +
"" +
"" +
"" +
"" +
"", settings.MembershipProvider.ToString());
query.ViewFields = "";
// run query to get table of users
DataTable users = null;
try
{
users = list.GetItems(query).GetDataTable();
}
catch (Exception ex)
{
//Utils.LogError(ex);
return null;
}
users.Columns.Add("Active");
users.Columns.Add("IsInSharePoint");
users.Columns.Add("NonProviderName");
// Add additional user data to table
foreach (DataRow row in users.Rows)
{
// remove provider name to get actual user name
string userName = row["Name"].ToString().Replace(settings.MembershipProvider.ToLower() + ":", "");
row["NonProviderName"] = userName;
}
foreach (MembershipUser memberuser in Membership.GetAllUsers())
{
bool bFoundMember = false;
foreach (DataRow row in users.Rows)
{
if (memberuser.UserName.ToLower() == row["NonProviderName"].ToString().ToLower())
{
row["Name"] = memberuser.UserName;
row["Active"] = memberuser.IsApproved ? "Yes" : "No";
row["IsInSharePoint"] = "Yes";
bFoundMember = true;
//users.Rows[i].Delete();
break;
}
}
if (!bFoundMember)
{
//Add member to the data table
DataRow datanewuser = users.NewRow();
datanewuser["Name"] = memberuser.UserName;
datanewuser["Email"] = memberuser.Email;
datanewuser["Active"] = memberuser.IsApproved ? "Yes" : "No";
datanewuser["IsInSharePoint"] = "No";
users.Rows.Add(datanewuser);
}
}
// sort if a sort expression available
var dataView = new DataView(users);
if (selectArgs.SortExpression != String.Empty)
{
dataView.Sort = selectArgs.SortExpression;
}
// return as a DataList
return dataView;
}*/
protected override IEnumerable ExecuteSelect(DataSourceSelectArguments args)
{
// only continue if a membership provider has been configured
if (!CodeFiles.Utils.IsProviderConfigured())
return null;
// get site details
var site = SPContext.Current.Site;
var settings = CodeFiles.Utils.GetFBAIisSettings(site);
if (settings == null)
return null;
if (args.MaximumRows == 0)
{
return null;
}
// get paged users from sql database
int pageNumber = args.StartRowIndex/args.MaximumRows;
int totalRecords;
string userName = HttpContext.Current.Request.QueryString[Constants.QUERY_STRING_USERNAME];
MembershipUserCollection membershipUsers = null;
if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(userName.Trim()))
{
if (!userName.StartsWith("%"))
{
userName = "%" + userName;
}
if (!userName.EndsWith("%"))
{
userName = userName + "%";
}
// find users by name and email and merge them
var usersByName = Membership.FindUsersByName(userName);
var usersByEmail = Membership.FindUsersByEmail(userName);
foreach (MembershipUser userByEmail in usersByEmail)
{
bool foundByName = false;
foreach (MembershipUser userByName in usersByName)
{
if (userByName.UserName.ToLower() == userByEmail.UserName.ToLower())
{
foundByName = true;
break;
}
}
if (!foundByName)
{
usersByName.Add(userByEmail);
}
}
// assign totalRecords so we will know total number of pages in search results
totalRecords = usersByName.Count;
if (totalRecords <= args.MaximumRows)
{
membershipUsers = usersByName;
}
else
{
membershipUsers = new MembershipUserCollection();
var usersByNameArray = new MembershipUser[usersByName.Count];
usersByName.CopyTo(usersByNameArray, 0);
for (int i = args.StartRowIndex; i < Math.Min(args.StartRowIndex + args.MaximumRows, usersByNameArray.Length); i++)
{
membershipUsers.Add(usersByNameArray[i]);
}
}
}
else
{
membershipUsers = Membership.GetAllUsers(pageNumber, args.MaximumRows, out totalRecords);
}
if (membershipUsers.Count == 0)
{
return null;
}
var users = new DataTable();
users.Columns.Add("Name");
users.Columns.Add("Email");
users.Columns.Add("Title");
users.Columns.Add("Active");
users.Columns.Add("IsInSharePoint");
users.Columns.Add("Modified");
users.Columns.Add("Created");
foreach (MembershipUser membershipUser in membershipUsers)
{
var row = users.NewRow();
row["Name"] = membershipUser.UserName;
row["Email"] = membershipUser.Email;
row["Active"] = membershipUser.IsApproved ? "Yes" : "No";
row["IsInSharePoint"] = "No";
users.Rows.Add(row);
}
// get appropriate users from Sharepoint
string prefix = settings.MembershipProvider.ToLower() + ":";
var orExpressions = new List>>();
foreach (MembershipUser membershipUser in membershipUsers)
{
var mu = membershipUser;
orExpressions.Add(x => (string)x["Name"] == prefix + mu.UserName);
}
var orExpression = ExpressionsHelper.CombineOr(orExpressions);
var andExpressions = new List>>();
andExpressions.Add(x => (string)x["ContentType"] == "Person");
andExpressions.Add(orExpression);
var query = new SPQuery();
query.Query = Camlex.Query().WhereAll(andExpressions).ToString();
query.ViewFields = Camlex.Query().ViewFields(x => new[] { x["Name"], x["LinkTitle"], x["Email"], x["Modified"], x["Created"] });
DataTable spUsers = null;
try
{
spUsers = site.RootWeb.SiteUserInfoList.GetItems(query).GetDataTable();
}
catch (Exception ex)
{
//Utils.LogError(ex);
return null;
}
if (spUsers != null)
{
foreach (DataRow userRow in users.Rows)
{
foreach (DataRow spRow in spUsers.Rows)
{
string spUserName = ((string) spRow["Name"]).Replace(prefix, "");
if (((string) userRow["Name"]).ToLower() == spUserName.ToLower())
{
userRow["IsInSharePoint"] = "Yes";
userRow["Title"] = spRow["Title"];
userRow["Modified"] = spRow["Modified"];
userRow["Created"] = spRow["Created"];
break;
}
}
}
}
// add fake rows to allow switch pages
if (args.MaximumRows < totalRecords)
{
// fill previous pages
for (int i = 0; i < pageNumber; i++)
{
for (int j = 0; j < args.MaximumRows; j++)
{
var row = users.NewRow();
users.Rows.InsertAt(row, 0);
}
}
// fill following pages
var totalPages = Math.Ceiling(((decimal) totalRecords)/((decimal) args.MaximumRows));
for (int i = pageNumber + 1; i < totalPages; i++)
{
for (int j = 0; j < args.MaximumRows; j++)
{
var row = users.NewRow();
users.Rows.Add(row);
}
}
}
var dataView = new DataView(users);
return dataView;
}
// private IEnumerable filterData(IEnumerable coll, DataSourceSelectArguments selectArgs)
// {
// if (coll == null)
// {
// return coll;
// }
//
// var view = coll as DataView;
// if (view == null)
// {
// return coll;
// }
// if (view.Table == null)
// {
// return coll;
// }
//
// var filteredView = new DataView(view.Table);
// if (selectArgs.SortExpression != string.Empty)
// {
// filteredView.Sort = selectArgs.SortExpression;
// }
// string userName = HttpContext.Current.Request.QueryString[Constants.QUERY_STRING_USERNAME];
// if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(userName.Trim()))
// {
// filteredView.RowFilter =
// string.Format("Name = '{0}' OR Name LIKE '{0}*' OR Name LIKE '*{0}' OR Name LIKE '*{0}*' OR " +
// "Title = '{0}' OR Title LIKE '{0}*' OR Title LIKE '*{0}' OR Title LIKE '*{0}*' OR " +
// "Email = '{0}' OR Email LIKE '{0}*' OR Email LIKE '*{0}' OR Email LIKE '*{0}*'", userName);
// }
// return filteredView;
// }
// private int getCacheLiveTimeInMinutes()
// {
// try
// {
// string cacheLiveTime = ConfigurationManager.AppSettings[CACHE_LIVE_TIME_KEY];
// if (string.IsNullOrEmpty(cacheLiveTime))
// {
// return DEFAULT_CACHE_LIVE_TIME_IN_MINUTES;
// }
// int cache;
// if (!int.TryParse(cacheLiveTime, out cache))
// {
// return DEFAULT_CACHE_LIVE_TIME_IN_MINUTES;
// }
// return cache;
// }
// catch
// {
// return DEFAULT_CACHE_LIVE_TIME_IN_MINUTES;
// }
// }
}
}