using System;
using System.Text;
using System.Web.Security;
using System.Web.UI.WebControls;
using System.Data;
using System.Web;
using CMS.CMSHelper;
using CMS.GlobalHelper;
using CMS.MembershipProvider;
using CMS.PortalControls;
using CMS.PortalEngine;
using CMS.SettingsProvider;
using CMS.SiteProvider;
using CMS.WebAnalytics;
using TreeNode = CMS.DocumentEngine.TreeNode;
public partial class CMSWebParts_Membership_LinkedIn_LinkedInLogon : CMSAbstractWebPart
{
#region "Variables"
private LinkedInHelper linkedInHelper = null;
#endregion
#region "Constants"
protected const string FILES_LOCATION = "~/CMSWebparts/Membership/LinkedIn/LinkedInLogon_files/";
protected const string SESSION_NAME_USERDATA = "LinkedInUserData";
#endregion
#region "Properties"
///
/// Indicates if birth date is required in registration process.
///
public bool RequireBirthDate
{
get
{
return ValidationHelper.GetBoolean(GetValue("BirthDate"), true);
}
set
{
SetValue("BirthDate", value);
}
}
///
/// Indicates if first name is required in registration process.
///
public bool RequireFirstName
{
get
{
return ValidationHelper.GetBoolean(GetValue("FirstName"), true);
}
set
{
SetValue("FirstName", value);
}
}
///
/// Indicates if last name is required in registration process.
///
public bool RequireLastName
{
get
{
return ValidationHelper.GetBoolean(GetValue("LastName"), true);
}
set
{
SetValue("LastName", value);
}
}
///
/// Gets or sets sign in button image URL.
///
public string SignInImageURL
{
get
{
return DataHelper.GetNotEmpty(GetValue("SignInImageURL"), GetImageUrl(FILES_LOCATION + "signin.png"));
}
set
{
SetValue("SignInImageURL", value);
}
}
///
/// Gets or sets the value that indicates whether to show sign out button.
///
public bool ShowSignOut
{
get
{
return ValidationHelper.GetBoolean(GetValue("ShowSignOut"), false);
}
set
{
SetValue("ShowSignOut", value);
}
}
///
/// Gets or sets sign in text.
///
public string SignInText
{
get
{
return ValidationHelper.GetString(GetValue("SignInText"), "");
}
set
{
SetValue("SignInText", value);
}
}
///
/// Gets or sets sign out text.
///
public string SignOutText
{
get
{
return ValidationHelper.GetString(GetValue("SignOutText"), "");
}
set
{
SetValue("SignOutText", value);
}
}
///
/// Gets or sets the value that buttons will be used instead of link buttons.
///
public bool ShowAsButton
{
get
{
return ValidationHelper.GetBoolean(GetValue("ShowAsButton"), false);
}
set
{
SetValue("ShowAsButton", value);
}
}
///
/// Gets or sets sign out button image URL.
///
public string SignOutImageURL
{
get
{
return DataHelper.GetNotEmpty(GetValue("SignOutImageURL"), GetImageUrl(FILES_LOCATION + "signout.png"));
}
set
{
SetValue("SignOutImageURL", value);
}
}
///
/// Gets or sets the conversion track name used after successful registration.
///
public string TrackConversionName
{
get
{
return ValidationHelper.GetString(GetValue("TrackConversionName"), "");
}
set
{
if ((value != null) && (value.Length > 400))
{
value = value.Substring(0, 400);
}
SetValue("TrackConversionName", value);
}
}
///
/// Gets or sets the conversion value used after successful registration.
///
public double ConversionValue
{
get
{
return ValidationHelper.GetDoubleSystem(GetValue("ConversionValue"), 0);
}
set
{
SetValue("ConversionValue", value);
}
}
///
/// Gets or sets the value that indicates whether after successful registration is
/// notification email sent to the administrator.
///
public bool NotifyAdministrator
{
get
{
return ValidationHelper.GetBoolean(GetValue("NotifyAdministrator"), false);
}
set
{
SetValue("NotifyAdministrator", value);
}
}
///
/// Gets the sender email (from).
///
private string FromAddress
{
get
{
return SettingsKeyProvider.GetStringValue(CMSContext.CurrentSiteName + ".CMSNoreplyEmailAddress");
}
}
///
/// Gets the recipient email (to).
///
private string ToAddress
{
get
{
return SettingsKeyProvider.GetStringValue(CMSContext.CurrentSiteName + ".CMSAdminEmailAddress");
}
}
#endregion
#region "Page events"
///
/// Content loaded event handler.
///
public override void OnContentLoaded()
{
base.OnContentLoaded();
SetupControl();
}
///
/// Initializes the control properties.
///
protected void SetupControl()
{
if (!StopProcessing)
{
// Check renamed DLL library
if (CMSOpenIDHelper.CheckOpenIdDLL())
{
// Check if LinkedIn module is enabled
if (LinkedInHelper.LinkedInIsAvailable(CMSContext.CurrentSiteName))
{
DisplayButtons();
linkedInHelper = new LinkedInHelper();
CheckStatus();
}
else
{
// Error label is displayed in Design mode when LinkedIn is disabled
if (CMSContext.ViewMode == ViewModeEnum.Design)
{
StringBuilder parameter = new StringBuilder();
parameter.Append(GetString("header.sitemanager") + " -> ");
parameter.Append(GetString("settingscategory.cmssettings") + " -> ");
parameter.Append(GetString("settingscategory.socialnetworks") + " -> ");
parameter.Append(GetString("settingscategory.cmslinkedin"));
if (CMSContext.CurrentUser.UserSiteManagerAdmin)
{
// Make it link for SiteManager Admin
parameter.Insert(0, "");
parameter.Append("");
}
lblError.Text = String.Format(GetString("mem.linkedin.disabled"), parameter.ToString());
lblError.Visible = true;
}
else
{
Visible = false;
}
}
}
// Error label is displayed in Design mode when LinkedIn library is not loaded
else
{
lblError.ResourceString = "mem.openid.library";
lblError.Visible = true;
}
}
else
{
Visible = false;
}
}
#endregion
#region "Private methods"
///
/// Checks status of current user.
///
protected void CheckStatus()
{
// Get current site name
string siteName = CMSContext.CurrentSiteName;
string error = null;
// Check return URL
string returnUrl = QueryHelper.GetString("returnurl", null);
returnUrl = HttpUtility.UrlDecode(returnUrl);
// Get current URL
string currentUrl = URLHelper.CurrentURL;
currentUrl = URLHelper.RemoveParameterFromUrl(currentUrl, "oauth_token");
currentUrl = URLHelper.RemoveParameterFromUrl(currentUrl, "oauth_verifier");
// Get LinkedIn response status
switch (linkedInHelper.CheckStatus(RequireFirstName, RequireLastName, RequireBirthDate, null))
{
// User is authenticated
case CMSOpenIDHelper.RESPONSE_AUTHENTICATED:
// LinkedIn profile Id not found = save new user
if (UserInfoProvider.GetUserInfoByLinkedInID(linkedInHelper.MemberId) == null)
{
string additionalInfoPage = SettingsKeyProvider.GetStringValue(siteName + ".CMSRequiredLinkedInPage").Trim();
// No page set, user can be created
if (String.IsNullOrEmpty(additionalInfoPage))
{
// Register new user
UserInfo ui = AuthenticationHelper.AuthenticateLinkedInUser(linkedInHelper.MemberId, linkedInHelper.FirstName, linkedInHelper.LastName, siteName, true, true, ref error);
// If user was successfuly created
if (ui != null)
{
if (linkedInHelper.BirthDate != DateTimeHelper.ZERO_TIME)
{
ui.UserSettings.UserDateOfBirth = linkedInHelper.BirthDate;
}
UserInfoProvider.SetUserInfo(ui);
// If user is enabled
if (ui.Enabled)
{
// Create autentification cookie
AuthenticationHelper.SetAuthCookieWithUserData(ui.UserName, true, Session.Timeout, new string[] { "linkedinlogin" });
Activity activityLogin = new ActivityUserLogin(ModuleCommands.OnlineMarketingGetUserLoginContactID(ui), ui, CMSContext.CurrentDocument, CMSContext.ActivityEnvironmentVariables);
activityLogin.Log();
}
// Notify administrator
if (NotifyAdministrator && !String.IsNullOrEmpty(FromAddress) && !String.IsNullOrEmpty(ToAddress))
{
AuthenticationHelper.NotifyAdministrator(ui, FromAddress, ToAddress);
}
// Send registration e-mails
// E-mail confirmation is not required as user already provided confirmation by successful login using OpenID
AuthenticationHelper.SendRegistrationEmails(ui, null, null, false, false);
// Log registration into analytics
AuthenticationHelper.TrackUserRegistration(TrackConversionName, ConversionValue, siteName, ui);
Activity activity = new ActivityRegistration(ui, CMSContext.CurrentDocument, CMSContext.ActivityEnvironmentVariables);
if (activity.Data != null)
{
activity.Data.ContactID = ModuleCommands.OnlineMarketingGetUserLoginContactID(ui);
activity.Log();
}
}
// Redirect when authentication was successful
if (String.IsNullOrEmpty(error))
{
if (!String.IsNullOrEmpty(returnUrl))
{
URLHelper.Redirect(URLHelper.GetAbsoluteUrl(returnUrl));
}
else
{
URLHelper.Redirect(currentUrl);
}
}
// Display error otherwise
else
{
lblError.Text = error;
lblError.Visible = true;
}
}
// Additional information page is set
else
{
// Store user object in session for additional use
SessionHelper.SetValue(SESSION_NAME_USERDATA, linkedInHelper.LinkedInResponse);
// Redirect to additional info page
string targetURL = URLHelper.GetAbsoluteUrl(additionalInfoPage);
if (!String.IsNullOrEmpty(returnUrl))
{
// Add return URL to parameter
targetURL = URLHelper.AddParameterToUrl(targetURL, "returnurl", HttpUtility.UrlEncode(returnUrl));
}
URLHelper.Redirect(targetURL);
}
}
// LinkedIn profile id is in DB
else
{
// Login existing user
UserInfo ui = AuthenticationHelper.AuthenticateLinkedInUser(linkedInHelper.MemberId, linkedInHelper.FirstName, linkedInHelper.LastName, siteName, false, true, ref error);
if ((ui != null) && (ui.Enabled))
{
// Create autentification cookie
AuthenticationHelper.SetAuthCookieWithUserData(ui.UserName, true, Session.Timeout, new string[] { "linkedinlogin" });
int contactID = ModuleCommands.OnlineMarketingGetUserLoginContactID(ui);
Activity activityLogin = new ActivityUserLogin(contactID, ui, CMSContext.CurrentDocument, CMSContext.ActivityEnvironmentVariables);
activityLogin.Log();
// Redirect user
if (!String.IsNullOrEmpty(returnUrl))
{
URLHelper.Redirect(URLHelper.GetAbsoluteUrl(returnUrl));
}
else
{
URLHelper.Redirect(currentUrl);
}
}
// Display error which occured during authentication process
else if (!String.IsNullOrEmpty(error))
{
lblError.Text = error;
lblError.Visible = true;
}
// Otherwise is user disabled
else
{
lblError.Text = GetString("membership.userdisabled");
lblError.Visible = true;
}
}
break;
// No authentication, do nothing
case LinkedInHelper.RESPONSE_NOTAUTHENTICATED:
break;
}
}
///
/// Displays buttons depending on web part settings.
///
protected void DisplayButtons()
{
// If user is already authenticated
if (CMSContext.CurrentUser.IsAuthenticated())
{
if (ShowSignOut)
{
// If text is set use text/button link
if (!string.IsNullOrEmpty(SignOutText))
{
// Button link
if (ShowAsButton)
{
btnSignOut.Text = SignOutText;
btnSignOut.Visible = true;
}
// Text link
else
{
btnSignOutLink.Text = SignOutText;
btnSignOutLink.Visible = true;
}
}
// Image link
else
{
btnSignOutImage.ImageUrl = ResolveUrl(SignOutImageURL);
btnSignOutImage.Visible = true;
btnSignOutImage.ToolTip = GetString("webparts_membership_signoutbutton.signout");
btnSignOut.Text = GetString("webparts_membership_signoutbutton.signout");
}
}
}
else
{
// If text is set use text/button link
if (!string.IsNullOrEmpty(SignInText))
{
// Button link
if (ShowAsButton)
{
btnSignIn.Text = SignInText;
btnSignIn.Visible = true;
}
// Text link
else
{
btnSignInLink.Text = SignInText;
btnSignInLink.Visible = true;
}
}
// Image link
else
{
btnSignInImage.ImageUrl = ResolveUrl(SignInImageURL);
btnSignInImage.Visible = true;
btnSignInImage.ToolTip = GetString("webparts_membership_signoutbutton.signin");
btnSignIn.Text = GetString("webparts_membership_signoutbutton.signin");
}
}
}
///
/// Sign in button event.
///
protected void btnSignIn_Click(object sender, EventArgs e)
{
linkedInHelper.SendRequest();
}
///
/// Sign out button event.
///
protected void btnSignOut_Click(object sender, EventArgs e)
{
if (CMSContext.CurrentUser.IsAuthenticated())
{
// Sign out from CMS
CMSContext.LogoutUser();
CMSContext.CurrentUser = null;
Response.Cache.SetNoStore();
// Clear used session
SessionHelper.Remove(SESSION_NAME_USERDATA);
// Redirect to return URL
string returnUrl = QueryHelper.GetString("returnurl", URLHelper.CurrentURL);
URLHelper.Redirect(URLHelper.GetAbsoluteUrl(HttpUtility.UrlDecode(returnUrl)));
}
}
#endregion
}