379 lines
15 KiB
C#
379 lines
15 KiB
C#
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(
|
|
"<Where>" +
|
|
"<And>" +
|
|
"<Eq><FieldRef Name='ContentType' /><Value Type='Text'>Person</Value></Eq>" +
|
|
"<BeginsWith><FieldRef Name='Name' /><Value Type='Text'>{0}</Value></BeginsWith>" +
|
|
"</And>" +
|
|
"</Where>" +
|
|
"<OrderBy>" +
|
|
"<FieldRef Name='LinkTitle' />" +
|
|
"</OrderBy>", settings.MembershipProvider.ToString());
|
|
|
|
query.ViewFields = "<FieldRef Name='Name' /><FieldRef Name='LinkTitle' /><FieldRef Name='Email' /><FieldRef Name='Modified' /><FieldRef Name='Created' />";
|
|
|
|
// 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<Expression<Func<SPListItem, bool>>>();
|
|
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<Expression<Func<SPListItem, bool>>>();
|
|
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;
|
|
// }
|
|
// }
|
|
}
|
|
}
|