#region Usings
using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using DotNetNuke.Common;
using DotNetNuke.Common.Utilities;
using DotNetNuke.Entities.Modules;
using DotNetNuke.Entities.Modules.Actions;
using DotNetNuke.Entities.Portals;
using DotNetNuke.Entities.Users;
using DotNetNuke.Framework;
using DotNetNuke.Security;
using DotNetNuke.Services.Exceptions;
using DotNetNuke.Services.Localization;
using YAF.Classes.Core;
using YAF.Classes.Data;
using YAF.Classes.Utils;
#endregion
namespace YAF.DotNetNuke
{
/// <summary>
/// Summary description for DotNetNukeModule.
/// </summary>
public partial class YafDnnModule : PortalModuleBase, IActionable
{
private bool _createNewBoard;
private Forum _forum1;
private PortalSettings _portalSettings;
private CDefault _basePage;
private PortalSettings CurrentPortalSettings
{
get { return _portalSettings ?? (_portalSettings = PortalController.GetCurrentPortalSettings()); }
}
/// <summary>
/// </summary>
public string SessionUserKeyName
{
get { return String.Format("yaf_dnn_boardid{0}_userid{1}_portalid{2}", _forum1.BoardID, UserId, CurrentPortalSettings.PortalId); }
}
/// <summary>
/// BasePage
/// </summary>
public CDefault BasePage
{
get { return _basePage ?? (_basePage = GetDefault(this)); }
}
#region IActionable Members
/// <summary>
/// Add Menu Entries to Module Container
/// </summary>
public ModuleActionCollection ModuleActions
{
get
{
ModuleActionCollection actions = new ModuleActionCollection
{
{
GetNextActionID(),
"Edit YAF Settings",
ModuleActionType.AddContent,
String.Empty,
String.Empty,
EditUrl(),
false,
SecurityAccessLevel.Host,
true,
false
},
{
GetNextActionID(),
"DNN User Importer",
ModuleActionType.AddContent,
String.Empty,
String.Empty,
EditUrl("Import"),
false,
SecurityAccessLevel.Host,
true,
false
}
};
return actions;
}
}
#endregion
private void DotNetNukeModule_Load(object sender, EventArgs e)
{
if (Page.IsPostBack)
return;
// Check for user
if (!HttpContext.Current.User.Identity.IsAuthenticated)
{
return;
}
try
{
// Get current Dnn user (DNN 4)
// UserInfo dnnUserInfo = UserController.GetUser(CurrentPortalSettings.PortalId, UserId, false);
// Get current Dnn user (DNN 5)
UserInfo dnnUserInfo = UserController.GetUserById(CurrentPortalSettings.PortalId, UserId);
//get the user from the membership provider
MembershipUser dnnUser = Membership.GetUser(dnnUserInfo.Username, true);
if (dnnUser == null)
return;
// see if the roles have been syncronized...
if (Session[SessionUserKeyName + "_rolesloaded"] == null)
{
bool roleChanged = false;
foreach (string role in dnnUserInfo.Roles)
{
if (!Roles.RoleExists(role))
{
Roles.CreateRole(role);
roleChanged = true;
}
if (!Roles.IsUserInRole(dnnUserInfo.Username, role))
Roles.AddUserToRole(dnnUserInfo.Username, role);
}
if (roleChanged)
MarkRolesChanged();
Session[SessionUserKeyName + "_rolesloaded"] = true;
}
//Admin or Host user?
if ((dnnUserInfo.IsSuperUser || dnnUserInfo.UserID == CurrentPortalSettings.AdministratorId) && _createNewBoard)
CreateNewBoard(dnnUserInfo, dnnUser);
int yafUserId;
try
{
yafUserId = DB.user_get(_forum1.BoardID, dnnUser.ProviderUserKey);
if (yafUserId > 0)
Session[string.Format("{0}_userSync", SessionUserKeyName)] = true;
}
catch (Exception)
{
yafUserId = 0;
Session[string.Format("{0}_userSync", SessionUserKeyName)] = null;
}
// Has this user been registered in YAF already?
if (Session[string.Format("{0}_userSync", SessionUserKeyName)] != null)
return;
if (yafUserId == 0)
yafUserId = CreateYafUser(dnnUserInfo, dnnUser);
// super admin check...
if (dnnUserInfo.IsSuperUser)
{
CreateYafHostUser(yafUserId);
}
if (YafContext.Current.Settings != null)
RoleMembershipHelper.UpdateForumUser(dnnUser, YafContext.Current.Settings.BoardID);
YafContext.Current.Cache.Clear();
DataCache.ClearPortalCache(CurrentPortalSettings.PortalId, true);
Session.Clear();
Response.Redirect(Globals.NavigateURL(), true);
}
catch (Exception ex)
{
Exceptions.ProcessModuleLoadException(this, ex);
}
}
private static void MarkRolesChanged()
{
RolePrincipal rolePrincipal;
if (Roles.CacheRolesInCookie)
{
string roleCookie = "";
HttpCookie cookie = HttpContext.Current.Request.Cookies[Roles.CookieName];
if (cookie != null)
roleCookie = cookie.Value;
rolePrincipal = new RolePrincipal(HttpContext.Current.User.Identity, roleCookie);
}
else
rolePrincipal = new RolePrincipal(HttpContext.Current.User.Identity);
rolePrincipal.SetDirty();
}
private void CreateYafHostUser(int yafUserId)
{
// get this user information...
DataTable userInfo = DB.user_list(_forum1.BoardID, yafUserId, null, null, null);
if (userInfo.Rows.Count <= 0)
return;
DataRow row = userInfo.Rows[0];
if (Convert.ToBoolean(row["IsHostAdmin"]))
return;
// fix the ishostadmin flag...
UserFlags userFlags = new UserFlags(row["Flags"]) {IsHostAdmin = true};
// update...
DB.user_adminsave(_forum1.BoardID, yafUserId, row["Name"], row["DisplayName"], row["Email"], userFlags.BitValue, row["RankID"]);
}
private int CreateYafUser(UserInfo dnnUserInfo, MembershipUser dnnUser)
{
YafContext.Current.Cache.Clear();
// setup roles
RoleMembershipHelper.SetupUserRoles(_forum1.BoardID, dnnUser.UserName);
// create the user in the YAF DB so profile can ge created...
int? userId = RoleMembershipHelper.CreateForumUser(dnnUser, _forum1.BoardID);
if (userId == null)
return 0;
// create profile
YafUserProfile userProfile = YafUserProfile.GetProfile(dnnUser.UserName);
// setup their inital profile information
userProfile.Initialize(dnnUser.UserName, true);
userProfile.RealName = dnnUserInfo.Profile.FullName;
userProfile.Location = dnnUserInfo.Profile.Country;
userProfile.Homepage = dnnUserInfo.Profile.Website;
userProfile.Save();
int yafUserId = UserMembershipHelper.GetUserIDFromProviderUserKey(dnnUser.ProviderUserKey);
// Save User
DB.user_save(yafUserId,
_forum1.BoardID,
null,
null,
null,
GetUserTimeZoneOffset(dnnUserInfo, CurrentPortalSettings),
null,
null,
null,
true,
null,
null,
null,
null,
null,
null);
return yafUserId;
}
private void CreateNewBoard(UserInfo dnnUserInfo, MembershipUser dnnUser)
{
// Add new admin users to group
if (!Roles.IsUserInRole(dnnUserInfo.Username, "Administrators"))
Roles.AddUserToRole(dnnUserInfo.Username, "Administrators");
if (dnnUserInfo.IsSuperUser)
{
//This is HOST and probably the first board.
//The install routine already created the first board.
//Make sure Module settings are in place
ModuleController objForumSettings = new ModuleController();
objForumSettings.UpdateModuleSetting(ModuleId, "forumboardid", "1");
objForumSettings.UpdateModuleSetting(ModuleId, "forumcategoryid", string.Empty);
_forum1.BoardID = 1;
}
else
{
// This is an admin adding a new forum.
string newBoardName = "{0} Forums".FormatWith(CurrentPortalSettings.PortalName);
//Create the board
YafCultureInfo yafCultureInfo = GetYafCultureInfo(Localization.GetPageLocale(CurrentPortalSettings));
int largestBoardId = DB.board_create(dnnUserInfo.Username,
dnnUserInfo.Email,
dnnUser.ProviderUserKey,
newBoardName,
yafCultureInfo.Culture,
yafCultureInfo.LanguageFile,
"DotNetNuke",
"DotNetNuke");
//Assign the new forum to this module
ModuleController objForumSettings = new ModuleController();
objForumSettings.UpdateModuleSetting(ModuleId, "forumboardid", largestBoardId.ToString());
objForumSettings.UpdateModuleSetting(ModuleId, "forumcategoryid", string.Empty);
_forum1.BoardID = largestBoardId;
}
}
/// <summary>
/// Change Page Title
/// </summary>
/// <param name = "sender"></param>
/// <param name = "e"></param>
private void Forum1_PageTitleSet(object sender, ForumPageTitleArgs e)
{
if (!string.IsNullOrEmpty(CurrentPortalSettings.ActiveTab.Title))
BasePage.Title = BasePage.Title.Replace(CurrentPortalSettings.ActiveTab.Title, string.Empty);
}
/// <summary>
/// </summary>
/// <param name = "e"></param>
protected override void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// </summary>
private void InitializeComponent()
{
if (AJAX.IsInstalled())
{
AJAX.RegisterScriptManager();
}
_forum1 = new Forum();
pnlModuleContent.Controls.Add(_forum1);
Load += DotNetNukeModule_Load;
_forum1.PageTitleSet += Forum1_PageTitleSet;
//Get current BoardID
try
{
_createNewBoard = false;
// This will create an error if there is no setting for forumboardid
_forum1.BoardID = int.Parse(Settings["forumboardid"].ToString());
SetDnnLangToYaf();
string cId = Settings["forumcategoryid"].ToString();
if (cId != string.Empty)
_forum1.CategoryID = int.Parse(cId);
}
catch (Exception)
{
//A forum does not exist for this module
//Create a new board
_createNewBoard = true;
//forum1.BoardID = 1;
}
}
/// <summary>
/// Change YAF Language based on DNN Language,
/// this will override the YAF Language Setting
/// </summary>
private void SetDnnLangToYaf()
{
YafCultureInfo yafCultureInfo = GetYafCultureInfo(Localization.GetPageLocale(CurrentPortalSettings));
YafContext.Current.BoardSettings.Culture = yafCultureInfo.Culture;
YafContext.Current.BoardSettings.Language = yafCultureInfo.LanguageFile;
}
protected override void OnError(EventArgs e)
{
Exception x = Server.GetLastError();
DB.eventlog_create(YafContext.Current.PageUserID, this, x);
base.OnError(e);
}
private static int GetUserTimeZoneOffset(UserInfo userInfo, PortalSettings portalSettings)
{
int timeZone;
if ((userInfo != null) && (userInfo.UserID != Null.NullInteger))
timeZone = userInfo.Profile.TimeZone;
else
timeZone = portalSettings.TimeZoneOffset;
return timeZone;
}
private static Dictionary<string, string> GetYafCultures()
{
Dictionary<string, string> yafCultures = new Dictionary<string, string>();
DataTable cult = StaticDataHelper.Cultures();
foreach (DataRow row in cult.Rows)
{
try
{
yafCultures.Add(row["CultureTag"].ToString(), row["CultureFile"].ToString());
}
catch
{
continue;
}
}
if (yafCultures.Count == 0)
{
yafCultures.Add("en", "english.xml");
}
return yafCultures;
}
private static YafCultureInfo GetYafCultureInfo(CultureInfo cultureInfo)
{
string culture = "en";
string lngFile = "english.xml";
Dictionary<string, string> cultures = GetYafCultures();
YafCultureInfo yafCultureInfo = new YafCultureInfo();
if (cultureInfo != null)
{
if (cultures.ContainsKey(cultureInfo.TwoLetterISOLanguageName))
{
culture = cultureInfo.TwoLetterISOLanguageName;
lngFile = cultures[cultureInfo.TwoLetterISOLanguageName];
}
else if (cultures.ContainsKey(cultureInfo.Name))
{
culture = cultureInfo.Name;
lngFile = cultures[cultureInfo.Name];
}
}
yafCultureInfo.Culture = culture;
yafCultureInfo.LanguageFile = lngFile;
return yafCultureInfo;
}
private static CDefault GetDefault(Control c)
{
Control parent = c.Parent;
if (parent != null)
{
if (parent is CDefault)
{
return (CDefault)parent;
}
return GetDefault(parent);
}
return null;
}
#region Nested type: YafCultureInfo
private struct YafCultureInfo
{
public string Culture;
public string LanguageFile;
}
#endregion
}
}