//------------------------------------------------------------------------------
//
// Copyright (c) Telligent Systems Corporation. All rights reserved.
//
//------------------------------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Specialized;
using System.IO;
using System.Web;
using System.Web.Caching;
using System.Xml;
using System.Xml.Serialization;
using CommunityServer.Components;
namespace CommunityServer.Configuration {
// *********************************************************************
// ForumConfiguration
//
///
/// Class used to represent the configuration data for the ASP.NET Forums
///
///
// ***********************************************************************/
public class CSConfiguration {
public static readonly string CacheKey = "CSConfiguration";
#region private members
Hashtable providers = new Hashtable();
Hashtable extensions = new Hashtable();
string defaultLanguage;
string filesPath;
bool disableBackgroundThreads = false;
bool disableIndexing = false;
bool disableEmail = false;
short smtpServerConnectionLimit = -1;
bool enableLatestVersionCheck = true;
private AppLocation app = null;
private string applicationOverride = null;
private int threadCount = 2;
private SystemType systemType = SystemType.Self;
bool backwardsCompatiblePasswords = false;
SSLSettings _ssl = SSLSettings.Ignore;
private string[] _defaultRoles = new string[]{"Everyone", "Registered Users"};
private string applicationKeyOverride = null;
private WWWStatus _wwwStatus = WWWStatus.Remove;
private bool enableProductListing = true;
private bool enableUsersOnline = true;
private string announcementRssUrl = String.Empty;
private ArrayList filterLanguages = new ArrayList();
private ArrayList editors = null;
private string proxyHost = string.Empty;
private int proxyPort = 80;
private string proxyUsername = string.Empty;
private string proxyPassword = string.Empty;
private string proxyBypassList = string.Empty;
private bool proxyBypassOnLocal = true;
private RolesConfiguration roleConfiguration= null;
private int cacheFactor = 5;
private XmlDocument XmlDoc = null;
private bool _enableVirtualization = false;
#endregion
#region cnstr
public CSConfiguration(XmlDocument doc)
{
XmlDoc = doc;
LoadValuesFromConfigurationXml();
}
#endregion
#region GetXML
///
/// Enables reading of the configuration file's XML without reloading the file
///
///
///
public XmlNode GetConfigSection(string nodePath)
{
return XmlDoc.SelectSingleNode(nodePath);
}
#endregion
#region GetConfig
public static CSConfiguration GetConfig()
{
CSConfiguration config = CSCache.Get(CacheKey) as CSConfiguration;
if(config == null)
{
string path = null;
HttpContext context = HttpContext.Current;
if(context != null)
path = context.Server.MapPath("~/communityserver.config");
else
path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "communityserver.config");
XmlDocument doc = new XmlDocument();
doc.Load(path);
config = new CSConfiguration(doc);
CSCache.Max(CacheKey,config,new CacheDependency(path));
CSCache.ReSetFactor(config.CacheFactor);
//CSEvents.PostConfigurationInitialized(config);
}
return config;
}
#endregion
// *********************************************************************
// LoadValuesFromConfigurationXml
//
///
/// Loads the forums configuration values.
///
///
// ***********************************************************************/
internal void LoadValuesFromConfigurationXml()
{
XmlNode node = GetConfigSection("CommunityServer/Core");
XmlAttributeCollection attributeCollection = node.Attributes;
// Get the default language
//
XmlAttribute att = attributeCollection["defaultLanguage"];
if (att != null)
defaultLanguage = att.Value;
else
defaultLanguage = "en-US";
att = attributeCollection["enableProductListing"];
if (att != null)
enableProductListing = bool.Parse(att.Value);
att = attributeCollection["enableUsersOnline"];
if (att != null)
enableUsersOnline = bool.Parse(att.Value);
att = attributeCollection["announcementRssUrl"];
if (att != null)
announcementRssUrl = att.Value;
// att = attributeCollection["filesPath"];
// if(att != null)
// filesPath = att.Value;
// else
//Changing this value is not supported in CS 1.x
filesPath = "/";
att = attributeCollection["applicationKeyOverride"];
if (att != null)
applicationKeyOverride = att.Value;
att = attributeCollection["disableThreading"];
if (att != null)
disableBackgroundThreads = bool.Parse(att.Value);
att = attributeCollection["disableIndexing"];
if (att != null)
disableIndexing = bool.Parse(att.Value);
att = attributeCollection["cacheFactor"];
if (att != null)
cacheFactor = Int32.Parse(att.Value);
else
cacheFactor = 5;
att = attributeCollection["disableEmail"];
if (att != null)
disableEmail = bool.Parse(att.Value);
att = attributeCollection["smtpServerConnectionLimit"];
if (att != null)
smtpServerConnectionLimit = short.Parse(att.Value);
else
smtpServerConnectionLimit = -1;
att = attributeCollection["enableLatestVersionCheck"];
if (att != null)
enableLatestVersionCheck = bool.Parse(att.Value);
att = attributeCollection["backwardsCompatiblePasswords"];
if (att != null)
backwardsCompatiblePasswords = bool.Parse(att.Value);
att = attributeCollection["enableVirtualization"];
if (att != null)
_enableVirtualization = bool.Parse(att.Value);
att = attributeCollection["applicationOverride"];
if (att != null)
applicationOverride = att.Value;
else
applicationOverride = null;
att = attributeCollection["systemType"];
if (att != null)
systemType = (SystemType)Enum.Parse(typeof(SystemType), attributeCollection["systemType"].Value);
else
systemType = SystemType.Self;
att = attributeCollection["wwwStatus"];
if (att != null)
_wwwStatus = (WWWStatus)Enum.Parse(typeof(WWWStatus), attributeCollection["wwwStatus"].Value);
att = attributeCollection["ssl"];
if (att != null)
_ssl = (SSLSettings)Enum.Parse(typeof(SSLSettings), att.Value, true);
if (_ssl == SSLSettings.Ignore && att == null)
{
att = attributeCollection["requireSSL"];
if (att != null && att.Value == "true")
_ssl = SSLSettings.Password;
}
att = attributeCollection["proxyHost"];
if (att != null)
proxyHost = att.Value;
att = attributeCollection["proxyPort"];
if (att != null)
if(att.Value != string.Empty)
proxyPort = int.Parse(att.Value);
att = attributeCollection["proxyUsername"];
if (att != null)
proxyUsername = att.Value;
att = attributeCollection["proxyPassword"];
if (att != null)
proxyPassword = att.Value;
att = attributeCollection["proxyBypassList"];
if (att != null)
proxyBypassList = att.Value;
att = attributeCollection["proxyBypassOnLocal"];
if (att != null)
if(att.Value != string.Empty)
proxyBypassOnLocal = bool.Parse(att.Value);
XmlAttribute roles = attributeCollection["defaultRoles"];
if (roles != null)
{
_defaultRoles = roles.Value.Split(';');
}
// Read child nodes
//
foreach (XmlNode child in node.ChildNodes)
{
if (child.Name == "providers")
GetProviders(child, providers);
if (child.Name == "appLocation")
GetAppLocation(child);
if (child.Name == "extensionModules")
GetProviders(child, extensions);
if (child.Name == "roleConfiguration")
GetRoleConfiguration(child);
if (child.Name == "filterLanguages")
GetFilterLanguages(child);
if (child.Name == "editors")
GetEditors(child);
}
//if we do not have an application, create the default one
if (app == null)
{
app = AppLocation.Default();
}
if (roleConfiguration == null)
{
roleConfiguration = new RolesConfiguration();
}
}
// *********************************************************************
// GetRoleConfiguration
//
///
/// Internal class used to populate default role changes.
///
/// XmlNode of the configurations.
///
// ***********************************************************************/
internal void GetRoleConfiguration(XmlNode node)
{
try
{
XmlSerializer serializer = new XmlSerializer(typeof (RolesConfiguration));
roleConfiguration = serializer.Deserialize(new XmlNodeReader(node)) as RolesConfiguration;
}
catch
{
//Should we let exception go?
roleConfiguration = new RolesConfiguration();
}
}
internal void GetFilterLanguages(XmlNode node)
{
filterLanguages = new ArrayList();
foreach(XmlNode child in node.ChildNodes)
{
if(child.Name == "filterLanguage")
{
XmlAttributeCollection csAtt = child.Attributes;
if(csAtt != null)
{
if (csAtt["enabled"] == null || bool.Parse(csAtt["enabled"].Value))
filterLanguages.Add(new FilterLanguage(csAtt["key"].Value, csAtt["name"].Value));
}
}
}
}
internal void GetEditors(XmlNode node)
{
editors = new ArrayList();
foreach(XmlNode child in node.ChildNodes)
{
if (child.Name == "editor")
{
XmlAttributeCollection csAtt = child.Attributes;
if (csAtt != null)
{
editors.Add(new SelectableEditor(csAtt["name"].Value, csAtt["skinName"].Value, (csAtt["default"] != null && bool.Parse(csAtt["default"].Value))));
}
}
}
}
// *********************************************************************
// GetProviders
//
///
/// Internal class used to populate the available providers.
///
/// XmlNode of the providers to add/remove/clear.
///
// ***********************************************************************/
internal void GetProviders(XmlNode node, Hashtable table) {
foreach (XmlNode provider in node.ChildNodes) {
switch (provider.Name) {
case "add" :
table.Add(provider.Attributes["name"].Value, new Provider(provider.Attributes) );
break;
case "remove" :
table.Remove(provider.Attributes["name"].Value);
break;
case "clear" :
table.Clear();
break;
}
}
}
internal void GetAppLocation(XmlNode node)
{
app = AppLocation.Create(node);
}
private bool defaultLanguageHasBeenValidated = false;
// Properties
//
public string DefaultLanguage
{
get
{
if(!defaultLanguageHasBeenValidated)
defaultLanguage = ResourceManager.GetSupportedLanguage(defaultLanguage, "en-US");
return defaultLanguage;
}
}
public string FilesPath { get { return filesPath; } }
public Hashtable Providers { get { return providers; } }
public Hashtable Extensions { get { return extensions; } }
public bool IsBackgroundThreadingDisabled { get { return disableBackgroundThreads; } }
public bool IsIndexingDisabled { get { return disableIndexing; } }
public RolesConfiguration RolesConfiguration{get { return roleConfiguration;} }
public string ApplicationOverride {get {return applicationOverride;} }
public int QueuedThreads { get { return threadCount; }}
public int CacheFactor { get { return cacheFactor; } }
public SSLSettings SSL { get {return _ssl;}}
public WWWStatus WWWStatus { get { return _wwwStatus;}}
public string ProxyHost { get { return proxyHost; } }
public int ProxyPort { get { return proxyPort; } }
public string ProxyUsername { get { return proxyUsername; } }
public string ProxyPassword { get { return proxyPassword; } }
public string ProxyBypassList { get { return proxyBypassList; } }
public bool ProxyBypassOnLocal { get { return proxyBypassOnLocal; } }
public bool EnableVirtualization{ get {return _enableVirtualization;}}
public bool EnableProductListing{ get {return enableProductListing; }}
public bool EnableUsersOnline{ get {return enableUsersOnline; }}
public string AnnouncementRssUrl{ get { return announcementRssUrl; }}
public string ApplicationKeyOverride
{
get{ return applicationKeyOverride;}
}
public ArrayList FilterLanguages { get { return filterLanguages; }}
public FilterLanguage DefaultFilterLanguage
{
get
{
return GetFilterLanguage(this.DefaultLanguage);
}
}
public FilterLanguage GetFilterLanguage(string key)
{
FilterLanguage fl = FindFilterLanguage(key);
if (fl != null)
return fl;
if (key.IndexOf("-") > -1)
fl = FindFilterLanguage(key.Substring(0, key.IndexOf("-")));
else
fl = FindFilterLanguage(key + "-" + key);
return fl;
}
private FilterLanguage FindFilterLanguage(string key)
{
foreach (FilterLanguage fl in FilterLanguages)
{
if (fl.Key == key)
return fl;
}
return null;
}
public ArrayList Editors
{
get { return editors; }
}
public SelectableEditor DefaultEditor
{
get
{
foreach (SelectableEditor editor in Editors)
{
if (editor.IsDefault)
return editor;
}
if (Editors.Count > 0)
return (SelectableEditor) Editors[0];
return null;
}
}
public AppLocation AppLocation
{
get{return app;}
}
public bool IsEmailDisabled {
get {
return disableEmail;
}
}
public short SmtpServerConnectionLimit {
get {
return smtpServerConnectionLimit;
}
}
public bool EnableLatestVersionCheck {
get {
return enableLatestVersionCheck;
}
}
public bool BackwardsCompatiblePasswords
{
get
{
return backwardsCompatiblePasswords;
}
}
public string[] DefaultRoles
{
get{return _defaultRoles;}
}
public SystemType SystemType {get{ return systemType;}}
}
public class Provider
{
string name;
ExtensionType extensionType;
string providerType;
NameValueCollection providerAttributes = new NameValueCollection();
public Provider (XmlAttributeCollection attributes)
{
// Set the name of the provider
//
name = attributes["name"].Value;
if (attributes["extensionType"] != null)
{
// Set the extension type
//
try
{
extensionType = (ExtensionType)Enum.Parse(typeof(ExtensionType), attributes["extensionType"].Value, true);
}
catch
{
// Occassionally get an exception on parsing the extensiontype, so set it to Unknown
extensionType = ExtensionType.Unknown;
}
}
// Set the type of the provider
//
providerType = attributes["type"].Value;
// Store all the attributes in the attributes bucket
//
foreach (XmlAttribute attribute in attributes)
{
if ( (attribute.Name != "name") && (attribute.Name != "type") )
providerAttributes.Add(attribute.Name, attribute.Value);
}
}
public string Name {
get {
return name;
}
}
public ExtensionType ExtensionType
{
get { return extensionType; }
}
public string Type {
get {
return providerType;
}
}
public NameValueCollection Attributes {
get {
return providerAttributes;
}
}
}
}