using System; using System.Collections.Generic; using System.Text; using System.Web.UI.WebControls; using System.Web; using Microsoft.SharePoint.Administration; using System.Diagnostics; using System.Reflection; using Microsoft.SharePoint; using System.Web.Configuration; using System.Configuration; using System.Web.Security; using Microsoft.SharePoint.Utilities; using Microsoft.SharePoint.Administration.Claims; using System.Collections; namespace CKS.FormsBasedAuthentication { class Utils { //TODO: Inherit from Sharepoint membership provider and fix all unimplemented functions/properties. Then go through code and get rid //of all references to Utils that are used to work around this. public static MembershipProvider BaseMembershipProvider() { return Membership.Providers[GetMembershipProvider()]; } public static RoleProvider BaseRoleProvider() { return Roles.Providers[GetRoleProvider()]; } public static MembershipProvider BaseMembershipProvider(SPSite site) { return Membership.Providers[GetMembershipProvider(site)]; } public static RoleProvider BaseRoleProvider(SPSite site) { return Roles.Providers[GetRoleProvider(site)]; } public static string DecodeUsername(string username) { if (SPClaimProviderManager.IsEncodedClaim(username)) { return SPClaimProviderManager.Local.DecodeClaim(username).Value; } else { return username; } } public static string EncodeUsername(string username) { SPClaim claim = new SPClaim(SPClaimTypes.UserLogonName, username, "http://www.w3.org/2001/XMLSchema#string", SPOriginalIssuers.Format(SPOriginalIssuerType.Forms, GetMembershipProvider())); return SPClaimProviderManager.Local.EncodeClaim(claim); } public static string GetCurrentUsername() { return DecodeUsername(SPContext.Current.Web.CurrentUser.LoginName); } public static string EncodeUsername(string username, SPSite site) { SPClaim claim = new SPClaim(SPClaimTypes.UserLogonName, username, "http://www.w3.org/2001/XMLSchema#string", SPOriginalIssuers.Format(SPOriginalIssuerType.Forms, GetMembershipProvider(site))); return SPClaimProviderManager.Local.EncodeClaim(claim); } public static string GetMembershipProvider() { return GetMembershipProvider(SPContext.Current.Site); } public static string GetRoleProvider() { return GetRoleProvider(SPContext.Current.Site); } public static string GetRoleProvider(SPSite site) { // get role provider of whichever zone in the web app is fba enabled SPIisSettings settings = GetFBAIisSettings(site); return settings.FormsClaimsAuthenticationProvider.RoleProvider; } public static string GetMembershipProvider(HttpContext context) { using (SPSite site = new SPSite(SPUtility.GetPageUrlPath(context))) { return GetMembershipProvider(site); } } public static string GetMembershipProvider(SPSite site) { // get membership provider of whichever zone in the web app is fba enabled SPIisSettings settings = GetFBAIisSettings(site); if (settings == null) return null; return settings.FormsClaimsAuthenticationProvider.MembershipProvider; } private static SPIisSettings GetFBAIisSettings(SPSite site) { SPIisSettings settings = null; // try and get FBA IIS settings from current site zone try { settings = site.WebApplication.IisSettings[site.Zone]; if (settings.UseFormsClaimsAuthenticationProvider) return settings; } catch { // expecting errors here so do nothing } // check each zone type for an FBA enabled IIS site foreach (SPUrlZone zone in Enum.GetValues(typeof(SPUrlZone))) { try { settings = site.WebApplication.IisSettings[(SPUrlZone)zone]; if (settings.UseFormsClaimsAuthenticationProvider) return settings; } catch { // expecting errors here so do nothing } } // return null if FBA not enabled return null; } /// /// check current site to see if a provider has been specified in the web.config /// /// public static bool IsProviderConfigured() { // attempt to get current users details int numUsers; try { BaseMembershipProvider().GetAllUsers(0,1,out numUsers); } catch { // if fails membership provider is not configured correctly return false; } // if no error provider is ok return true; } public static void ResetUserPassword(string username, string newPassword, bool sendEmail, SPWeb web) { if (Utils.BaseMembershipProvider().RequiresQuestionAndAnswer || !Utils.BaseMembershipProvider().EnablePasswordReset) { throw new Exception(LocalizedString.GetGlobalString("FBAPackWebPages", "ResetPasswordUnavailable")); } MembershipUser user = Utils.BaseMembershipProvider().GetUser(username, false); string password = user.ResetPassword(); //Change the password to the specified password if (!String.IsNullOrEmpty(newPassword)) { if (user.ChangePassword(password, newPassword)) { password = newPassword; } else { throw new Exception(LocalizedString.GetGlobalString("FBAPackWebPages", "ResetPasswordChangePasswordError")); } } if (sendEmail) { MembershipRequest request = MembershipRequest.GetMembershipRequest(user, web); request.Password = password; MembershipRequest.SendResetPasswordEmail(request, web); } } public static void LogError(string errorMessage, FBADiagnosticsService.FBADiagnosticsCategory errorCategory) { // log error to ULS log FBADiagnosticsService.Local.WriteTrace(0, errorCategory, TraceSeverity.High, errorMessage,null); } public static void LogError(Exception ex) { // log error LogError(ex.ToString(), FBADiagnosticsService.FBADiagnosticsCategory.General); } public static void LogError(string errorMessage) { LogError(errorMessage, FBADiagnosticsService.FBADiagnosticsCategory.General); } public static void LogError(Exception ex, bool transferToErrorPage) { LogError(ex); SPUtility.TransferToErrorPage(ex.Message); } public static string GetWebProperty(string key, string defaultValue, SPWeb web, bool save) { string value = null; value = web.Properties[key]; if (value == null) { value = defaultValue; if (save) { SetWebProperty(key, value, web); } } return value; } public static string GetWebProperty(string key, string defaultValue, SPWeb web) { return GetWebProperty(key, defaultValue, web, false); } public static string GetWebProperty(string key, string defaultValue) { return GetWebProperty(key, defaultValue, SPContext.Current.Web); } public static bool GetSiteProperty(string key, bool defaultValue) { return GetSiteProperty(key, defaultValue, SPContext.Current.Site); } public static bool GetSiteProperty(string key, bool defaultValue, SPSite site) { bool result = defaultValue; SPSecurity.RunWithElevatedPrivileges(delegate() { using (SPSite privSite = new SPSite(site.ID, site.Zone)) { SPWeb web = privSite.RootWeb; result = Boolean.Parse(GetWebProperty(key, defaultValue.ToString(), web)); } }); return result; } public static void SetWebProperty(string key, string value, SPWeb web) { bool unsafeUpdates = web.AllowUnsafeUpdates; web.AllowUnsafeUpdates = true; web.Properties[key] = value; web.Properties.Update(); web.AllowUnsafeUpdates = unsafeUpdates; } public static void SetWebProperty(string key, string value) { SetWebProperty(key, value, SPContext.Current.Web); } public static void SetSiteProperty(string key, bool value, SPSite site) { SetWebProperty(key, value.ToString(), site.RootWeb); } public static void SetSiteProperty(string key, bool value) { SetWebProperty(key, value.ToString(), SPContext.Current.Site.RootWeb); } public static string GetAbsoluteURL(SPWeb web, string path) { return SPUtility.ConcatUrls(web.Url, path); } public static int GetChoiceIndex(SPFieldChoice field, string value) { if (field == null || value == null) { return -1; } for (int i = 0; i < field.Choices.Count; i++) { if (field.Choices[i] == value) { return i; } } return -1; } } }