using System;
using System.Collections;
using System.Data;
using System.Web.UI;
using System.Web.Security;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint.Utilities;
using System.Reflection;
using System.Globalization;
using System.Linq;
namespace CKS.FormsBasedAuthentication
{
///
/// Data source for the User Management user display view. Gets all FBA users and adds basic membership info
///
class FBAUsersView : DataSourceView
{
private FBADataSource _owner;
public FBAUsersView(FBADataSource owner, string viewName)
: base(owner, viewName)
{
_owner = owner;
}
protected override IEnumerable ExecuteSelect(DataSourceSelectArguments selectArgs)
{
// only continue if a membership provider has been configured
if (!Utils.IsProviderConfigured())
return null;
// get site details
SPSite site = SPContext.Current.Site;
string provider = Utils.GetMembershipProvider(site);
if (provider == null)
return null;
SPWeb web = site.RootWeb;
string yes = LocalizedString.GetString("FBAPackFeatures", "Yes");
string no = LocalizedString.GetString("FBAPackFeatures", "No");
// we only display users that have been added to SharePoint
// we use the localized name, safe for non-English SharePoint servers
SPList list = web.SiteUserInfoList; //web.Lists[SPUtility.GetLocalizedString("$Resources:userinfo_schema_listtitle", "core", web.Language)];
// create query list
SPQuery query = new SPQuery();
query.Query = string.Format(
"" +
"" +
"Person" +
"{0}" +
"" +
"" +
"" +
"" +
"", provider);
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;
}
if (users == null)
{
users = new DataTable();
users.Columns.Add("ID");
users.Columns.Add("Title");
users.Columns.Add("Name");
users.Columns.Add("LinkTitle");
users.Columns.Add("Email");
users.Columns.Add("Modified", typeof(DateTime));
users.Columns.Add("Created", typeof(DateTime));
}
users.Columns.Add("Active");
users.Columns.Add("Locked");
users.Columns.Add("LastLogin", typeof(DateTime));
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 = Utils.DecodeUsername(row["Name"].ToString());
// row["NonProviderName"] = userName;
//}
int totalRecords = 0;
//LogLocal("received the user data");
var datarowresults = users.AsEnumerable();
// LogLocal("get enumberation variable");
var membershipUserColl = Utils.BaseMembershipProvider(site).GetAllUsers(0, 100000, out totalRecords).Cast().ToList();
//LogLocal("get member ship user list");
//membershipUserColl.Where(memberuser => memberuser.UserName.ToLower() == Utils.DecodeUsername(p["Name"].ToString())).ToList().ForEach(row => row.Delete());
int totalMemebership = membershipUserColl.Count;
var userList = users.Rows.Cast().ToList();
//LogLocal("User Name:" + Convert.ToString(userList[0]["Name"]));
//LogLocal("Loop started");
var resultJoin = from member in membershipUserColl
join curUser in userList on member.UserName.ToLower() equals Utils.DecodeUsername(curUser["Name"].ToString()) into gj
from subpet in gj.DefaultIfEmpty()
select new { member.UserName, IsApproved = member.IsApproved, IsLockedOut = member.IsLockedOut, Email = member.Email, LastLoginDate = member.LastLoginDate, curRow = subpet };
foreach (var item in resultJoin)
{
if (item.curRow != null)
{
item.curRow["Name"] = item.UserName;
item.curRow["Active"] = item.IsApproved ? yes : no;
item.curRow["Locked"] = item.IsLockedOut ? yes : no;
item.curRow["LastLogin"] = item.LastLoginDate;
item.curRow["IsInSharePoint"] = yes;
}
else
{
//Add member to the data table
DataRow datanewuser = users.NewRow();
datanewuser["Name"] = item.UserName;
datanewuser["Email"] = item.Email;
datanewuser["Active"] = item.IsApproved ? yes : no;
datanewuser["Locked"] = item.IsLockedOut ? yes : no;
datanewuser["LastLogin"] = item.LastLoginDate;
datanewuser["IsInSharePoint"] = no;
users.Rows.Add(datanewuser);
}
}
#region "working"
// Working
//for (int i = 0; i < totalMemebership; i++)
//{
// MembershipUser memberuser = membershipUserColl[i];
// var curUser = userList.Where(p => p["Name"].ToString().Contains(memberuser.UserName.ToLower())).FirstOrDefault(); //.Where(p => memberuser.UserName.ToLower() == Utils.DecodeUsername(p["Name"].ToString())).FirstOrDefault();
// bool bFoundMember = false;
// if (curUser != null)
// {
// curUser["Name"] = memberuser.UserName;
// curUser["Active"] = memberuser.IsApproved ? yes : no;
// curUser["Locked"] = memberuser.IsLockedOut ? yes : no;
// curUser["LastLogin"] = memberuser.LastLoginDate;
// curUser["IsInSharePoint"] = yes;
// bFoundMember = true;
// }
// 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["Locked"] = memberuser.IsLockedOut ? yes : no;
// datanewuser["LastLogin"] = memberuser.LastLoginDate;
// datanewuser["IsInSharePoint"] = no;
// users.Rows.Add(datanewuser);
// }
//}
//Working end
#endregion
// LogLocal("Loop end");
//foreach (MembershipUser memberuser in membershipUserColl)
//{
// LogLocal("do user query started");
//var curUser = datarowresults.Where(p => memberuser.UserName.ToLower() == p["Name"].ToString()).FirstOrDefault();
//LogLocal("do user query result received");
//bool bFoundMember = false;
//if (curUser != null)
//{
// curUser["Name"] = memberuser.UserName;
// curUser["Active"] = memberuser.IsApproved ? yes : no;
// curUser["Locked"] = memberuser.IsLockedOut ? yes : no;
// curUser["LastLogin"] = memberuser.LastLoginDate;
// curUser["IsInSharePoint"] = yes;
// bFoundMember = true;
//}
//else
//{
//}
//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["Locked"] = memberuser.IsLockedOut ? yes : no;
// row["LastLogin"] = memberuser.LastLoginDate;
// 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["Locked"] = memberuser.IsLockedOut ? yes : no;
// datanewuser["LastLogin"] = memberuser.LastLoginDate;
// datanewuser["IsInSharePoint"] = no;
// users.Rows.Add(datanewuser);
//}
//}
// LogLocal("Completed user check with FBA now start to remove user");
datarowresults.Where(p => p["IsInSharePoint"].ToString() != yes && p["IsInSharePoint"].ToString() != no).ToList().ForEach(row => row.Delete());
// LogLocal("remove user completed");
////Remove users that weren't found in SharePoint
//for (int i = users.Rows.Count - 1; i >= 0; i--)
//{
// if (users.Rows[i]["IsInSharePoint"].ToString() != yes && users.Rows[i]["IsInSharePoint"].ToString() != no)
// {
// users.Rows[i].Delete();
// }
//}
// sort if a sort expression available
DataView dataView = new DataView(users);
if (selectArgs.SortExpression != String.Empty)
{
dataView.Sort = selectArgs.SortExpression;
}
//Filter the data if a filter is provided
if (_owner.SearchText.Length > 0)
{
dataView.RowFilter = string.Format("Name LIKE '%{0}%' OR Email LIKE '%{0}%' OR Title LIKE '%{0}%'", _owner.SearchText);
}
else
{
dataView.RowFilter = "";
}
// LogLocal("return the result");
// return as a DataList
return (IEnumerable)dataView;
}
public void LogLocal(string messsage)
{
System.IO.StreamWriter sw = System.IO.File.AppendText(
@"C:\LocalLog.txt");
try
{
string logLine = System.String.Format(
"{0:G}: {1}.", System.DateTime.Now, messsage);
sw.WriteLine(logLine);
}
catch (Exception ex)
{
}
finally
{
sw.Close();
}
}
}
}