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; // } // } } }