/*
* Box Socialâ„¢
* http://boxsocial.net/
* Copyright © 2007, David Lachlan Smith
*
* $Id:$
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Configuration;
using System.Web.SessionState;
using BoxSocial.Internals;
using BoxSocial.IO;
namespace BoxSocial.FrontEnd
{
public partial class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
AppDomainSetup ads = AppDomain.CurrentDomain.SetupInformation;
ads.ShadowCopyFiles = bool.TrueString;
if (ads.ShadowCopyDirectories != null)
{
if (ads.ShadowCopyDirectories == "")
{
ads.ShadowCopyDirectories = HttpContext.Current.Server.MapPath("/applications/");
}
else
{
ads.ShadowCopyDirectories = string.Format("{0};{1}", ads.ShadowCopyDirectories, HttpContext.Current.Server.MapPath("/applications/"));
}
}
AppDomain.CurrentDomain.SetShadowCopyPath(ads.ShadowCopyDirectories + ";" + Server.MapPath(@"/applications/"));
}
protected void Application_End(object sender, EventArgs e)
{
}
protected void Application_Error(object sender, EventArgs e)
{
Server.Transfer("error-handler.aspx");
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext httpContext = HttpContext.Current;
string[] redir = httpContext.Request.RawUrl.Split(';');
string host = httpContext.Request.Url.Host.ToLower();
if (host == "www." + Linker.Domain)
{
Response.Redirect(Linker.Uri);
return;
}
string currentURI = null;
Uri cUri = null;
if (httpContext.Request.RawUrl.Contains(";http://") || httpContext.Request.RawUrl.Contains("?http://"))
{
if (redir.Length > 1)
// Apache2/IIS
{
currentURI = redir[1];
cUri = new Uri(currentURI);
currentURI = cUri.AbsolutePath;
if (currentURI.EndsWith("index.php"))
{
currentURI = currentURI.Substring(0, currentURI.Length - 9);
Response.Redirect(currentURI, true);
Response.End();
return;
}
if (currentURI.EndsWith(".php"))
{
currentURI = currentURI.Substring(0, currentURI.Length - 4);
Response.Redirect(currentURI, true);
Response.End();
return;
}
}
else
// NGINX
{
int i = httpContext.Request.RawUrl.IndexOf('?');
if (httpContext.Request.RawUrl.Length >= i)
{
currentURI = httpContext.Request.RawUrl.Substring(i + 1);
}
cUri = new Uri(currentURI);
currentURI = cUri.AbsolutePath;
}
}
/*else
{
currentURI = httpContext.Request.RawUrl;
cUri = new Uri(currentURI);
currentURI = cUri.AbsolutePath;
}*/
if (!httpContext.Request.RawUrl.Contains("404.aspx"))
{
if (host == Linker.Domain)
{
return;
}
else
{
if (httpContext.Request.RawUrl.Contains("default.aspx"))
{
cUri = httpContext.Request.Url;
currentURI = "/";
}
}
}
if (currentURI != null)
{
List patterns = new List();
if (host != Linker.Domain)
{
SelectQuery query = new SelectQuery("dns_records");
query.AddFields("dns_domain", "dns_owner_id", "dns_owner_type", "dns_owner_key");
query.AddCondition("dns_domain", host);
Mysql db = new Mysql(WebConfigurationManager.AppSettings["mysql-user"],
WebConfigurationManager.AppSettings["mysql-password"],
WebConfigurationManager.AppSettings["mysql-database"],
WebConfigurationManager.AppSettings["mysql-host"]);
DataTable dnsTable = db.Query(query);
if (dnsTable.Rows.Count == 1)
{
switch ((string)dnsTable.Rows[0]["dns_owner_type"])
{
case "GROUP":
patterns.Add(new string[] { @"^/comment(/|)$", @"/comment.aspx" });
patterns.Add(new string[] { string.Format(@"^/styles/group/{0}.css$", (string)dnsTable.Rows[0]["dns_owner_key"]), string.Format(@"/groupstyle.aspx?gn={0}", (string)dnsTable.Rows[0]["dns_owner_key"]) });
patterns.Add(new string[] { @"^/account/([a-z\-]+)/([a-z\-]+)(/|)$", string.Format(@"/groupaccount.aspx?gn={0}&module=$1&sub=$2", (string)dnsTable.Rows[0]["dns_owner_key"]) });
patterns.Add(new string[] { @"^/account/([a-z\-]+)(/|)$", string.Format(@"/groupaccount.aspx?gn={0}&module=$1", (string)dnsTable.Rows[0]["dns_owner_key"]) });
patterns.Add(new string[] { @"^/account(/|)$", string.Format(@"/groupaccount.aspx?gn={0}", (string)dnsTable.Rows[0]["dns_owner_key"]) });
patterns.Add(new string[] { @"^(/|)$", string.Format(@"/grouppage.aspx?gn={0}&path=", (string)dnsTable.Rows[0]["dns_owner_key"]) });
patterns.Add(new string[] { @"^/(.+)(/|)$", string.Format(@"/grouppage.aspx?gn={0}&path=$1", (string)dnsTable.Rows[0]["dns_owner_key"]) });
break;
case "USER":
patterns.Add(new string[] { @"^/comment(/|)$", @"/comment.aspx" });
patterns.Add(new string[] { string.Format(@"^/styles/{0}.css$", (string)dnsTable.Rows[0]["dns_owner_key"]), string.Format(@"/userstyle.aspx?un={0}", (string)dnsTable.Rows[0]["dns_owner_key"]) });
patterns.Add(new string[] { @"^/friends(/|)$", string.Format(@"/viewfriends.aspx?un={0}", (string)dnsTable.Rows[0]["dns_owner_key"]) });
patterns.Add(new string[] { @"^/friends/([0-9]+)(/|)$", string.Format(@"/viewfriends.aspx?un={0}&page=$1", (string)dnsTable.Rows[0]["dns_owner_key"]) });
patterns.Add(new string[] { @"^(/|)$", string.Format(@"/memberpage.aspx?un={0}&path=", (string)dnsTable.Rows[0]["dns_owner_key"]) });
patterns.Add(new string[] { @"^/(.+)(/|)$", string.Format(@"/memberpage.aspx?un={0}&path=$1", (string)dnsTable.Rows[0]["dns_owner_key"]) });
break;
}
}
else
{
return;
}
db.CloseConnection();
}
else
{
patterns.Add(new string[] { @"^/images/corners-(top|bottom|middle)-([0-9a-f\-_]{6})-([0-9\-_]+)-([0-9\-_]+).png$", @"/corners.aspx?location=$1&width=$3&roundness=$4&colour=$2&ext=png" });
patterns.Add(new string[] { @"^/images/corners-(top|bottom|middle)-([0-9a-f\-_]{6})-([0-9\-_]+)-([0-9\-_]+).gif$", @"/corners.aspx?location=$1&width=$3&roundness=$4&colour=$2&ext=gif" });
patterns.Add(new string[] { @"^/images/corners-(top|bottom|middle)-(left|right|centre)-([0-9a-f\-_]{6})-([0-9\-_]+)-([0-9\-_]+).png$", @"/corners.aspx?location=$1,$2&width=$4&roundness=$5&colour=$3&ext=png" });
patterns.Add(new string[] { @"^/images/corners-(top|bottom|middle)-(left|right|centre)-([0-9a-f\-_]{6})-([0-9\-_]+)-([0-9\-_]+).gif$", @"/corners.aspx?location=$1,$2&width=$4&roundness=$5&colour=$3&ext=gif" });
patterns.Add(new string[] { @"^/about(/|)$", @"/about.aspx" });
patterns.Add(new string[] { @"^/opensource(/|)$", @"/opensource.aspx" });
patterns.Add(new string[] { @"^/safety(/|)$", @"/safety.aspx" });
patterns.Add(new string[] { @"^/privacy(/|)$", @"/privacy.aspx" });
patterns.Add(new string[] { @"^/terms-of-service(/|)$", @"/tos.aspx" });
patterns.Add(new string[] { @"^/site-map(/|)$", @"/sitemap.aspx" });
patterns.Add(new string[] { @"^/copyright(/|)$", @"/copyright.aspx" });
patterns.Add(new string[] { @"^/register(/|)$", @"/register.aspx" });
patterns.Add(new string[] { @"^/sign-in(/|)$", @"/login.aspx" });
patterns.Add(new string[] { @"^/login(/|)$", @"/login.aspx" });
patterns.Add(new string[] { @"^/search(/|)$", @"/search.aspx" });
patterns.Add(new string[] { @"^/comment(/|)$", @"/comment.aspx" });
patterns.Add(new string[] { @"^/functions(/|)$", @"/functions.aspx" });
patterns.Add(new string[] { @"^/account/([a-z\-]+)/([a-z\-]+)(/|)$", @"/account.aspx?module=$1&sub=$2" });
patterns.Add(new string[] { @"^/account/([a-z\-]+)(/|)$", @"/account.aspx?module=$1" });
patterns.Add(new string[] { @"^/account(/|)$", @"/account.aspx" });
patterns.Add(new string[] { @"^/group/([A-Za-z0-9\-_]+)/account/([a-z\-]+)/([a-z\-]+)(/|)$", @"/groupaccount.aspx?gn=$1&module=$2&sub=$3" });
patterns.Add(new string[] { @"^/group/([A-Za-z0-9\-_]+)/account/([a-z\-]+)(/|)$", @"/groupaccount.aspx?gn=$1&module=$2" });
patterns.Add(new string[] { @"^/group/([A-Za-z0-9\-_]+)/account(/|)$", @"/groupaccount.aspx?gn=$1" });
patterns.Add(new string[] { @"^/music/([A-Za-z0-9\-_]+)/account/([a-z\-]+)/([a-z\-]+)(/|)$", @"/musicaccount.aspx?mn=$1&module=$2&sub=$3" });
patterns.Add(new string[] { @"^/music/([A-Za-z0-9\-_]+)/account/([a-z\-]+)(/|)$", @"/musicaccount.aspx?mn=$1&module=$2" });
patterns.Add(new string[] { @"^/music/([A-Za-z0-9\-_]+)/account(/|)$", @"/musicaccount.aspx?mn=$1" });
patterns.Add(new string[] { @"^/styles/([A-Za-z0-9\-_]+).css$", @"/userstyle.aspx?un=$1" });
patterns.Add(new string[] { @"^/styles/group/([A-Za-z0-9\-_]+).css$", @"/groupstyle.aspx?gn=$1" });
patterns.Add(new string[] { @"^/styles/music/([A-Za-z0-9\-_]+).css$", @"/musicstyle.aspx?gn=$1" });
patterns.Add(new string[] { @"^/help(/|)$", @"/help.aspx" });
patterns.Add(new string[] { @"^/help/([a-z\-]+)(/|)$", @"/help.aspx?topic=$1" });
patterns.Add(new string[] { @"^/applications(/|)$", @"/viewapplications.aspx$1" });
patterns.Add(new string[] { @"^/application/([A-Za-z0-9\-_]+)(/|)$", @"/applicationpage.aspx?an=$1&path=" });
//patterns.Add(new string[] { @"^/groups/create(/|)$", @"/creategroup.aspx" });
patterns.Add(new string[] { @"^/groups/register(/|)$", @"/staticpage.aspx?path=groups/register" });
patterns.Add(new string[] { @"^/groups(/|)$", @"/staticpage.aspx?path=groups" });
patterns.Add(new string[] { @"^/groups/([A-Za-z0-9\-_]+)(/|)$", @"/staticpage.aspx?path=groups/$1" });
patterns.Add(new string[] { @"^/group/([A-Za-z0-9\-_]+)(/|)$", @"/grouppage.aspx?gn=$1&path=" });
//patterns.Add(new string[] { @"^/group/([A-Za-z0-9\-_]+)/images/([A-Za-z0-9\-_/\.]+)$", @"/viewimage.aspx?gn=$1&path=$2" });
patterns.Add(new string[] { @"^/networks(/|)$", @"/viewnetworks.aspx" });
patterns.Add(new string[] { @"^/networks/([A-Za-z0-9\-_\.]+)(/|)$", @"/viewnetworks.aspx?type=$1" });
patterns.Add(new string[] { @"^/network/([A-Za-z0-9\-_\.]+)(/|)$", @"/networkpage.aspx?nn=$1&path=" });
//patterns.Add(new string[] { @"^/network/([A-Za-z0-9\-_\.]+)/images/([A-Za-z0-9\-_/\.]+)$", @"/viewimage.aspx?nn=$1&path=$2" });
//patterns.Add(new string[] { @"^/musicians/create(/|)$", @"/createmusician.aspx" });
//patterns.Add(new string[] { @"^/musicians(/|)$", @"/viewmusicians.aspx$1" });
//patterns.Add(new string[] { @"^/musician/([A-Za-z0-9\-_]+)(/|)$", @"/viewmusicians.aspx?genre=$1" });
//patterns.Add(new string[] { @"^/musician/([A-Za-z0-9\-_]+)(/|)([A-Za-z0-9\-_]+)(/|)$", @"/viewmusicians.aspx?genre=$1&sub=$2" });
patterns.Add(new string[] { @"^/music/register(/|)$", @"/staticpage.aspx?path=music/register" });
patterns.Add(new string[] { @"^/music(/|)$", @"/staticpage.aspx?path=music" });
patterns.Add(new string[] { @"^/music/chart(/|)$", @"/staticpage.aspx?path=music/chart" });
patterns.Add(new string[] { @"^/music/directory(/|)$", @"/staticpage.aspx?path=music/directory" });
patterns.Add(new string[] { @"^/music/directory/genres(/|)$", @"/staticpage.aspx?path=music/directory/genres" });
patterns.Add(new string[] { @"^/music/directory/genre/([a-z0-9\-_\+]+)(/|)$", @"/staticpage.aspx?path=music/directory/genres/$1" });
patterns.Add(new string[] { @"^/music/([A-Za-z0-9\-_]+)(/|)$", @"/musicpage.aspx?mn=$1&path=" });
patterns.Add(new string[] { @"^/([A-Za-z0-9\-_\.]+)(/|)$", @"/memberpage.aspx?un=$1&path=" });
//patterns.Add(new string[] { @"^/([A-Za-z0-9\-_]+)/profile(/|)$", @"/viewprofile.aspx?un=$1" });
patterns.Add(new string[] { @"^/([A-Za-z0-9\-_\.]+)/friends(/|)$", @"/viewfriends.aspx?un=$1" });
patterns.Add(new string[] { @"^/([A-Za-z0-9\-_\.]+)/friends/([0-9]+)(/|)$", @"/viewfriends.aspx?un=$1&page=$2" });
//patterns.Add(new string[] { @"^/([A-Za-z0-9\-_]+)/images/([A-Za-z0-9\-_/\.]+)$", @"/viewimage.aspx?un=$1&path=$2" });
/* Wildcard for application loader */
patterns.Add(new string[] { @"^/application/([A-Za-z0-9\-_]+)/(.+)(/|)$", @"/applicationpage.aspx?an=$1&path=$2" });
patterns.Add(new string[] { @"^/group/([A-Za-z0-9\-_]+)/(.+)(/|)$", @"/grouppage.aspx?gn=$1&path=$2" });
patterns.Add(new string[] { @"^/network/([A-Za-z0-9\-_\.]+)/(.+)(/|)$", @"/networkpage.aspx?nn=$1&path=$2" });
patterns.Add(new string[] { @"^/music/([A-Za-z0-9\-_]+)/(.+)(/|)$", @"/musicpage.aspx?mn=$1&path=$2" });
patterns.Add(new string[] { @"^/([A-Za-z0-9\-_\.]+)/(.+)(/|)$", @"/memberpage.aspx?un=$1&path=$2" });
}
// fast cull
int ioc = currentURI.IndexOf('/', 1);
if (ioc >= 1)
{
foreach (string[] pattern in patterns)
{
int iop = pattern[0].IndexOf('/', 2);
if (iop >= 2)
{
if (currentURI.Substring(1, ioc - 1).Equals(pattern[0].Substring(2, iop - 2)))
{
if (Regex.IsMatch(currentURI, pattern[0]))
{
Regex rex = new Regex(pattern[0]);
currentURI = rex.Replace(currentURI, pattern[1]);
if (currentURI.Contains("?"))
{
httpContext.RewritePath(currentURI.TrimEnd(new char[] { '/' }) + "&" + cUri.Query.TrimStart(new char[] { '?' }));
return;
}
else
{
httpContext.RewritePath(currentURI.TrimEnd(new char[] { '/' }) + cUri.Query);
return;
}
}
}
}
}
}
// full catch all
foreach (string[] pattern in patterns)
{
if (Regex.IsMatch(currentURI, pattern[0]))
{
Regex rex = new Regex(pattern[0]);
currentURI = rex.Replace(currentURI, pattern[1]);
if (currentURI.Contains("?"))
{
httpContext.RewritePath(currentURI.TrimEnd(new char[] { '/' }) + "&" + cUri.Query.TrimStart(new char[] { '?' }));
return;
}
else
{
httpContext.RewritePath(currentURI.TrimEnd(new char[] { '/' }) + cUri.Query);
return;
}
}
}
}
}
}
}