' ' DotNetNukeŽ - http://www.dotnetnuke.com ' Copyright (c) 2002-2009 ' by DotNetNuke Corporation ' ' Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated ' documentation files (the "Software"), to deal in the Software without restriction, including without limitation ' the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and ' to permit persons to whom the Software is furnished to do so, subject to the following conditions: ' ' The above copyright notice and this permission notice shall be included in all copies or substantial portions ' of the Software. ' ' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED ' TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ' THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF ' CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ' DEALINGS IN THE SOFTWARE. ' Imports System.IO Imports DotNetNuke.Entities.Tabs Imports DotNetNuke.Security.Permissions Imports DotNetNuke.UI.Skins Imports DotNetNuke.UI.Utilities Imports DotNetNuke.Entities.Host Imports DotNetNuke.Application Namespace DotNetNuke.Framework ''' ----------------------------------------------------------------------------- ''' Project : DotNetNuke ''' Class : CDefault ''' ''' ----------------------------------------------------------------------------- ''' ''' ''' ''' ''' ''' ''' [sun1] 1/19/2004 Created ''' ''' ----------------------------------------------------------------------------- Partial Class DefaultPage Inherits DotNetNuke.Framework.CDefault : Implements IClientAPICallbackEventHandler #Region "Properties" ''' ----------------------------------------------------------------------------- ''' ''' Property to allow the programmatic assigning of ScrollTop position ''' ''' ''' ''' ''' ''' [Jon Henning] 3/23/2005 Created ''' ''' ----------------------------------------------------------------------------- Public Property PageScrollTop() As Integer Get If ScrollTop.Value.Length > 0 AndAlso IsNumeric(ScrollTop.Value) Then Return CInt(ScrollTop.Value) End If End Get Set(ByVal Value As Integer) ScrollTop.Value = Value.ToString End Set End Property #End Region #Region "Private Methods" ''' ----------------------------------------------------------------------------- ''' ''' ''' ''' ''' - Obtain PortalSettings from Current Context ''' - redirect to a specific tab based on name ''' - if first time loading this page then reload to avoid caching ''' - set page title and stylesheet ''' - check to see if we should show the Assembly Version in Page Title ''' - set the background image if there is one selected ''' - set META tags, copyright, keywords and description ''' ''' ''' [sun1] 1/19/2004 Created ''' ''' ----------------------------------------------------------------------------- Private Sub InitializePage() Dim objTabs As New TabController Dim objTab As TabInfo ' redirect to a specific tab based on name If Request.QueryString("tabname") <> "" Then Dim strURL As String = "" objTab = objTabs.GetTabByName(Request.QueryString("TabName"), CType(HttpContext.Current.Items("PortalSettings"), PortalSettings).PortalId) If Not objTab Is Nothing Then Dim actualParamCount As Integer = 0 Dim params(Request.QueryString.Count - 1) As String 'maximum number of elements For intParam As Integer = 0 To Request.QueryString.Count - 1 Select Case Request.QueryString.Keys(intParam).ToLower() Case "tabid", "tabname" Case Else params(actualParamCount) = Request.QueryString.Keys(intParam) + "=" + Request.QueryString(intParam) actualParamCount = actualParamCount + 1 End Select Next ReDim Preserve params(actualParamCount - 1) 'redim to remove blank elements Response.Redirect(NavigateURL(objTab.TabID, Null.NullString, params), True) Else ''404 Error - Redirect to ErrorPage Throw New HttpException(404, "Not Found") End If End If If Request.IsAuthenticated = True Then Select Case Convert.ToString(Host.AuthenticatedCacheability) Case "0" : Response.Cache.SetCacheability(HttpCacheability.NoCache) Case "1" : Response.Cache.SetCacheability(HttpCacheability.Private) Case "2" : Response.Cache.SetCacheability(HttpCacheability.Public) Case "3" : Response.Cache.SetCacheability(HttpCacheability.Server) Case "4" : Response.Cache.SetCacheability(HttpCacheability.ServerAndNoCache) Case "5" : Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate) End Select End If ' page comment If Host.DisplayCopyright Then Comment += String.Concat(vbCrLf, _ "", vbCrLf, _ "", vbCrLf, _ "", vbCrLf, _ "", vbCrLf, _ "", vbCrLf) End If Page.Header.Controls.AddAt(0, New LiteralControl(Comment)) If PortalSettings.ActiveTab.PageHeadText <> Null.NullString AndAlso Not IsAdminControl() Then Page.Header.Controls.Add(New LiteralControl(PortalSettings.ActiveTab.PageHeadText)) End If ' set page title Dim strTitle As String = PortalSettings.PortalName For Each objTab In PortalSettings.ActiveTab.BreadCrumbs strTitle += String.Concat(" > ", objTab.TabName) Next ' tab title override If Not String.IsNullOrEmpty(PortalSettings.ActiveTab.Title) Then strTitle = PortalSettings.ActiveTab.Title End If Title = strTitle 'set the background image if there is one selected If Not Me.FindControl("Body") Is Nothing Then If Not String.IsNullOrEmpty(PortalSettings.BackgroundFile) Then CType(Me.FindControl("Body"), HtmlGenericControl).Attributes("style") = String.Concat("background-image:url(", PortalSettings.HomeDirectory & PortalSettings.BackgroundFile, ");") End If End If ' META Refresh If PortalSettings.ActiveTab.RefreshInterval > 0 _ AndAlso Request.QueryString("ctl") Is Nothing Then MetaRefresh.Content = PortalSettings.ActiveTab.RefreshInterval.ToString Else MetaRefresh.Visible = False End If ' META description If Not String.IsNullOrEmpty(PortalSettings.ActiveTab.Description) Then Description = PortalSettings.ActiveTab.Description Else Description = PortalSettings.Description End If ' META keywords If Not String.IsNullOrEmpty(PortalSettings.ActiveTab.KeyWords) Then KeyWords = PortalSettings.ActiveTab.KeyWords Else KeyWords = PortalSettings.KeyWords End If If Host.DisplayCopyright Then KeyWords += ",DotNetNuke,DNN" End If ' META copyright If Not String.IsNullOrEmpty(PortalSettings.FooterText) Then Copyright = PortalSettings.FooterText Else Copyright = String.Concat("Copyright (c) ", Year(Now()), " by ", PortalSettings.PortalName) End If ' META generator If Host.DisplayCopyright Then Generator = "DotNetNuke " Else Generator = "" End If ' META Robots If Request.QueryString("ctl") IsNot Nothing AndAlso _ (Request.QueryString("ctl") = "Login" OrElse Request.QueryString("ctl") = "Register") Then MetaRobots.Content = "NOINDEX, NOFOLLOW" Else MetaRobots.Content = "INDEX, FOLLOW" End If ' NonProduction Label Injection If NonProductionVersion() AndAlso Host.DisplayBetaNotice Then Dim versionString As String = String.Format(" ({0} Version: {1})", DotNetNukeContext.Current.Application.Status, DotNetNukeContext.Current.Application.Version.ToString) Title &= versionString End If ' register DNN SkinWidgets Inititialization scripts If PortalSettings.EnableSkinWidgets Then DotNetNuke.Framework.jQuery.RequestRegistration() ClientAPI.RegisterStartUpScript(Page, "initWidgets", String.Format("", ResolveUrl("~/Resources/Shared/scripts/initWidgets.js"))) End If End Sub ''' ----------------------------------------------------------------------------- ''' ''' Look for skin level doctype configuration file, and inject the value into the top of default.aspx ''' when no configuration if found, the doctype for versions prior to 4.4 is used to maintain backwards compatibility with existing skins. ''' Adds xmlns and lang parameters when appropiate. ''' ''' The currently loading skin ''' ''' ''' [cathal] 11/29/2006 Created ''' [cniknet] 05/20/2009 Refactored to use HtmlAttributes collection ''' ''' ----------------------------------------------------------------------------- Private Sub SetSkinDoctype(ByVal Skin As DotNetNuke.UI.Skins.Skin) Dim strLang As String = System.Globalization.CultureInfo.CurrentCulture.ToString() Dim strDocType As String = PortalSettings.ActiveTab.SkinDoctype If strDocType.Contains("XHTML 1.0") Then 'XHTML 1.0 HtmlAttributes.Add("xml:lang", strLang) HtmlAttributes.Add("lang", strLang) HtmlAttributes.Add("xmlns", "http://www.w3.org/1999/xhtml") ElseIf strDocType.Contains("XHTML 1.1") Then 'XHTML 1.1 HtmlAttributes.Add("xml:lang", strLang) HtmlAttributes.Add("xmlns", "http://www.w3.org/1999/xhtml") Else 'other HtmlAttributes.Add("lang", strLang) End If 'Find the placeholder control and render the doctype Dim objDoctype As Control = Me.FindControl("skinDocType") CType(objDoctype, System.Web.UI.WebControls.Literal).Text = PortalSettings.ActiveTab.SkinDoctype End Sub ''' ----------------------------------------------------------------------------- ''' ''' ''' ''' ''' - manage affiliates ''' - log visit to site ''' ''' ''' [sun1] 1/19/2004 Created ''' ''' ----------------------------------------------------------------------------- Private Sub ManageRequest() ' affiliate processing Dim AffiliateId As Integer = -1 If Not Request.QueryString("AffiliateId") Is Nothing Then If IsNumeric(Request.QueryString("AffiliateId")) Then AffiliateId = Int32.Parse(Request.QueryString("AffiliateId")) Dim objAffiliates As New Services.Vendors.AffiliateController objAffiliates.UpdateAffiliateStats(AffiliateId, 1, 0) ' save the affiliateid for acquisitions If Request.Cookies("AffiliateId") Is Nothing Then ' do not overwrite Dim objCookie As HttpCookie = New HttpCookie("AffiliateId") objCookie.Value = AffiliateId.ToString objCookie.Expires = Now.AddYears(1) ' persist cookie for one year Response.Cookies.Add(objCookie) End If End If End If ' site logging If PortalSettings.SiteLogHistory <> 0 Then ' get User ID ' URL Referrer Dim URLReferrer As String = "" Try If Not Request.UrlReferrer Is Nothing Then URLReferrer = Request.UrlReferrer.ToString() End If Catch ex As Exception End Try Dim strSiteLogStorage As String = Host.SiteLogStorage Dim intSiteLogBuffer As Integer = Host.SiteLogBuffer ' log visit Dim objSiteLogs As New Services.Log.SiteLog.SiteLogController Dim objUserInfo As UserInfo = UserController.GetCurrentUserInfo objSiteLogs.AddSiteLog(PortalSettings.PortalId, objUserInfo.UserID, URLReferrer, Request.Url.ToString(), Request.UserAgent, Request.UserHostAddress, Request.UserHostName, PortalSettings.ActiveTab.TabID, AffiliateId, intSiteLogBuffer, strSiteLogStorage) End If End Sub Private Sub ManageStyleSheets(ByVal PortalCSS As Boolean, ByVal ctlSkin As DotNetNuke.UI.Skins.Skin) ' initialize reference paths to load the cascading style sheets Dim ID As String Dim objCSSCache As Hashtable = CType(DataCache.GetCache("CSS"), Hashtable) If objCSSCache Is Nothing Then objCSSCache = New Hashtable End If If PortalCSS = False Then ' default style sheet ( required ) ID = CreateValidID(Common.Globals.HostPath) AddStyleSheet(ID, Common.Globals.HostPath & "default.css") ' skin package style sheet ID = CreateValidID(PortalSettings.ActiveTab.SkinPath) If objCSSCache.ContainsKey(ID) = False Then If File.Exists(Server.MapPath(ctlSkin.SkinPath) & "skin.css") Then objCSSCache(ID) = ctlSkin.SkinPath & "skin.css" Else objCSSCache(ID) = "" End If If Not Host.PerformanceSetting = Common.Globals.PerformanceSettings.NoCaching Then DataCache.SetCache("CSS", objCSSCache) End If End If If objCSSCache(ID).ToString <> "" Then AddStyleSheet(ID, objCSSCache(ID).ToString) End If ' skin file style sheet ID = CreateValidID(Replace(ctlSkin.SkinSrc, ".ascx", ".css")) If objCSSCache.ContainsKey(ID) = False Then If File.Exists(Server.MapPath(Replace(ctlSkin.SkinSrc, ".ascx", ".css"))) Then objCSSCache(ID) = Replace(ctlSkin.SkinSrc, ".ascx", ".css") Else objCSSCache(ID) = "" End If If Not Host.PerformanceSetting = Common.Globals.PerformanceSettings.NoCaching Then DataCache.SetCache("CSS", objCSSCache) End If End If If objCSSCache(ID).ToString <> "" Then AddStyleSheet(ID, objCSSCache(ID).ToString) End If Else If File.Exists(PortalSettings.HomeDirectoryMapPath & "portal.css") Then ' portal style sheet ID = CreateValidID(PortalSettings.HomeDirectory) AddStyleSheet(ID, PortalSettings.HomeDirectory & "portal.css") End If End If End Sub Private Sub ManageFavicon() Dim strFavicon As String = CType(DataCache.GetCache("FAVICON" & PortalSettings.PortalId.ToString), String) If strFavicon = "" Then If File.Exists(PortalSettings.HomeDirectoryMapPath & "favicon.ico") Then strFavicon = PortalSettings.HomeDirectory & "favicon.ico" If Not Host.PerformanceSetting = Common.Globals.PerformanceSettings.NoCaching Then DataCache.SetCache("FAVICON" & PortalSettings.PortalId.ToString, strFavicon) End If End If End If If strFavicon <> "" Then Dim objLink As New HtmlLink() objLink.Attributes("rel") = "SHORTCUT ICON" objLink.Attributes("href") = strFavicon Page.Header.Controls.Add(objLink) End If End Sub 'I realize the parsing of this is rather primitive. A better solution would be to use json serialization 'unfortunately, I don't have the time to write it. When we officially adopt MS AJAX, we will get this type of 'functionality and this should be changed to utilize it for its plumbing. Private Function ParsePageCallBackArgs(ByVal strArg As String) As Generic.Dictionary(Of String, String) Dim aryVals() As String = Split(strArg, DotNetNuke.UI.Utilities.ClientAPI.COLUMN_DELIMITER) Dim objDict As Generic.Dictionary(Of String, String) = New Generic.Dictionary(Of String, String) If aryVals.Length > 0 Then objDict.Add("type", aryVals(0)) Select Case CType(objDict("type"), DNNClientAPI.PageCallBackType) Case DNNClientAPI.PageCallBackType.GetPersonalization objDict.Add("namingcontainer", aryVals(1)) objDict.Add("key", aryVals(2)) Case DNNClientAPI.PageCallBackType.SetPersonalization objDict.Add("namingcontainer", aryVals(1)) objDict.Add("key", aryVals(2)) objDict.Add("value", aryVals(3)) End Select End If Return objDict End Function #End Region #Region "Protected Methods" ' Enables addition of multiple attributes to HTML element ' This approach is needed because adding id/runat attribute to HTML ' would cause XHTML validation to fail -- NK Protected ReadOnly Property HtmlAttributeList() As String Get If Not (HtmlAttributes Is Nothing) AndAlso (HtmlAttributes.Count > 0) Then Dim attr As New StringBuilder("") For Each attributeName As String In HtmlAttributes.Keys If (attributeName <> "") AndAlso Not (HtmlAttributes(attributeName) Is Nothing) Then Dim attributeValue As String = HtmlAttributes(attributeName) ' Duplicate keys are returned as a comma-separated list ' Split into individual attributeName=attributeValue pairs If (attributeValue.IndexOf(",") > 0) Then Dim attributeValues As String() = attributeValue.Split(",") For attributeCounter As Integer = 0 To attributeValues.Length - 1 attr.Append(" " & attributeName & "=""" & attributeValues(attributeCounter) & """") Next Else attr.Append(" " & attributeName & "=""" & attributeValue & """") End If End If Next Return attr.ToString() Else Return "" End If End Get End Property Protected Overrides Sub Finalize() MyBase.Finalize() End Sub Protected Function NonProductionVersion() As Boolean Return DotNetNukeContext.Current.Application.Status <> ReleaseMode.Stable End Function #End Region #Region "Event Handlers" ''' ----------------------------------------------------------------------------- ''' ''' Contains the functionality to populate the Root aspx page with controls ''' ''' ''' ''' ''' - obtain PortalSettings from Current Context ''' - set global page settings. ''' - initialise reference paths to load the cascading style sheets ''' - add skin control placeholder. This holds all the modules and content of the page. ''' ''' ''' [sun1] 1/19/2004 Created ''' [jhenning] 8/24/2005 Added logic to look for post originating from a ClientCallback ''' ''' ----------------------------------------------------------------------------- Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init ' set global page settings InitializePage() ' load skin control Dim ctlSkin As DotNetNuke.UI.Skins.Skin = DotNetNuke.UI.Skins.Skin.GetSkin(Me) 'check for and read skin package level doctype SetSkinDoctype(ctlSkin) 'Manage disabled pages If PortalSettings.ActiveTab.DisableLink Then If TabPermissionController.CanAdminPage() Then Dim heading As String = Localization.GetString("PageDisabled.Header") Dim message As String = Localization.GetString("PageDisabled.Text") DotNetNuke.UI.Skins.Skin.AddPageMessage(ctlSkin, heading, message, Skins.Controls.ModuleMessage.ModuleMessageType.YellowWarning) Else If PortalSettings.HomeTabId > 0 Then Response.Redirect(NavigateURL(PortalSettings.HomeTabId), True) Else Response.Redirect(GetPortalDomainName(PortalSettings.PortalAlias.HTTPAlias, Request), True) End If End If End If 'check if running with known account defaults Dim messageText As String = "" If Request.IsAuthenticated = True AndAlso String.IsNullOrEmpty(Request.QueryString("runningDefault")) = False Then Dim userInfo As UserInfo = HttpContext.Current.Items("UserInfo") 'only show message to default users If (userInfo.Username.ToLower = "admin") OrElse (userInfo.Username.ToLower = "host") Then messageText = RenderDefaultsWarning() Dim messageTitle As String = Services.Localization.Localization.GetString("InsecureDefaults.Title", Services.Localization.Localization.GlobalResourceFile) UI.Skins.Skin.AddPageMessage(ctlSkin, messageTitle.ToString, messageText.ToString, Skins.Controls.ModuleMessage.ModuleMessageType.RedError) End If End If ' add CSS links ManageStyleSheets(False, ctlSkin) ' add skin to page SkinPlaceHolder.Controls.Add(ctlSkin) ' add CSS links ManageStyleSheets(True, ctlSkin) ' add Favicon ManageFavicon() ' ClientCallback Logic DotNetNuke.UI.Utilities.ClientAPI.HandleClientAPICallbackEvent(Me) End Sub ''' ''' check if a warning about account defaults needs to be rendered ''' ''' localised error message ''' ''' ''' [cathal] 2/28/2007 Created ''' Private Function RenderDefaultsWarning() As String Dim warningLevel As String = Request.QueryString("runningDefault").ToString Dim warningMessage As String = String.Empty Select Case warningLevel Case "1" warningMessage = Services.Localization.Localization.GetString("InsecureAdmin.Text", Services.Localization.Localization.GlobalResourceFile) Case "2" warningMessage = Services.Localization.Localization.GetString("InsecureHost.Text", Services.Localization.Localization.GlobalResourceFile) Case "3" warningMessage = Services.Localization.Localization.GetString("InsecureDefaults.Text", Services.Localization.Localization.GlobalResourceFile) End Select Return warningMessage End Function ''' ----------------------------------------------------------------------------- ''' ''' Initialize the Scrolltop html control which controls the open / closed nature of each module ''' ''' ''' ''' ''' ''' ''' [sun1] 1/19/2004 Created ''' [jhenning] 3/23/2005 No longer passing in parameter to __dnn_setScrollTop, instead pulling value from textbox on client ''' ''' ----------------------------------------------------------------------------- Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim Scrolltop As HtmlControls.HtmlInputHidden = CType(Page.FindControl("ScrollTop"), HtmlControls.HtmlInputHidden) If Scrolltop.Value <> "" Then DotNetNuke.UI.Utilities.DNNClientAPI.AddBodyOnloadEventHandler(Page, "__dnn_setScrollTop();") Scrolltop.Value = Scrolltop.Value End If End Sub Private Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.PreRender ' process the current request If Not IsAdminControl() Then ManageRequest() End If 'Set the Head tags Page.Header.Title = Title MetaGenerator.Content = Generator MetaGenerator.Visible = (Generator <> "") MetaAuthor.Content = PortalSettings.PortalName MetaCopyright.Content = Copyright MetaCopyright.Visible = (Copyright <> "") MetaKeywords.Content = KeyWords MetaKeywords.Visible = (KeyWords <> "") MetaDescription.Content = Description MetaDescription.Visible = (Description <> "") ' Because we have delayed registration of the jQuery script, ' Modules can override the standard behavior by including their own script on the page. ' The module must register the script with the "jQuery" key and should notify user ' of potential version conflicts with core jQuery support. If jQuery.IsRequested Then jQuery.RegisterScript(Page) End Sub Public Function HandleCallbackEvent(ByVal eventArgument As String) As String Implements IClientAPICallbackEventHandler.RaiseClientAPICallbackEvent Dim objDict As Generic.Dictionary(Of String, String) = ParsePageCallBackArgs(eventArgument) If objDict.ContainsKey("type") Then 'in order to limit the keys that can be accessed and written we are storing 'the enabled keys in a shared hash table If DNNClientAPI.IsPersonalizationKeyRegistered(objDict("namingcontainer") & ClientAPI.CUSTOM_COLUMN_DELIMITER & objDict("key")) = False Then Throw New Exception(String.Format("This personalization key has not been enabled ({0}:{1}). Make sure you enable it with DNNClientAPI.EnableClientPersonalization", objDict("namingcontainer"), objDict("key"))) End If Select Case CType(objDict("type"), DNNClientAPI.PageCallBackType) Case DNNClientAPI.PageCallBackType.GetPersonalization Return Personalization.Personalization.GetProfile(objDict("namingcontainer"), objDict("key")) Case DNNClientAPI.PageCallBackType.SetPersonalization Personalization.Personalization.SetProfile(objDict("namingcontainer"), objDict("key"), objDict("value")) Return objDict("value") Case Else Throw New Exception("Unknown Callback Type") End Select End If Return "" End Function #End Region End Class End Namespace