websitepanel/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebApplicationGalleryParams.ascx.cs
2013-03-10 10:58:39 -04:00

662 lines
No EOL
28 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright (c) 2012, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Web;
using System.Web.UI.WebControls;
using WebsitePanel.EnterpriseServer;
using WebsitePanel.Providers.Common;
using WebsitePanel.Providers.WebAppGallery;
using WebsitePanel.Providers.ResultObjects;
using WebsitePanel.Providers.Database;
using System.Text.RegularExpressions;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Reflection;
namespace WebsitePanel.Portal
{
public partial class WebApplicationGalleryParams : WebsitePanelModuleBase
{
private const DeploymentParameterWellKnownTag databaseEngineTags =
DeploymentParameterWellKnownTag.Sql |
DeploymentParameterWellKnownTag.MySql |
DeploymentParameterWellKnownTag.SqLite |
DeploymentParameterWellKnownTag.VistaDB |
DeploymentParameterWellKnownTag.FlatFile;
private GalleryApplicationResult appResult;
private UserInfo _policyUser;
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
return;
try
{
// load application details
appResult = ES.Services.WebApplicationGallery.GetGalleryApplicationDetails(PanelSecurity.PackageId, PanelRequest.ApplicationID);
if (!appResult.IsSuccess)
{
messageBox.ShowMessage(appResult, "WAG_NOT_AVAILABLE", "WebAppGallery");
return;
}
// bind app details
appHeader.BindApplicationDetails(appResult.Value);
//// check for warnings
//if (appResult.ErrorCodes.Count > 0)
//{
// // app does not meet requirements
// messageBox.ShowMessage(appResult, "WAG_CANNOT_INSTALL_APPLICATION", "WebAppGallery");
// //btnInstall.Enabled = false;
//}
// bind app parameters
List<DeploymentParameter> parameters = GetApplicationParameters();
if (parameters == null)
return;
//
BindWebSites();
BindDatabaseEngines(parameters);
}
catch (Exception ex)
{
ShowErrorMessage("WAG_NOT_AVAILABLE", ex);
DisableForm();
}
}
private List<DeploymentParameter> GetApplicationParameters()
{
DeploymentParametersResult result =
ES.Services.WebApplicationGallery.GetGalleryApplicationParams(PanelSecurity.PackageId, PanelRequest.ApplicationID);
// check results
if (!result.IsSuccess)
{
messageBox.ShowMessage(result, "WAG_NOT_AVAILABLE", "WebAppGallery");
DisableForm();
return null;
}
// return params
return result.Value;
}
private void DisableForm()
{
btnInstall.Enabled = false;
secAppSettings.Visible = false;
urlPanel.Visible = false;
tempUrlPanel.Visible = false;
}
private void BindWebSites()
{
ddlWebSite.DataSource = ES.Services.WebServers.GetWebSites(PanelSecurity.PackageId, false);
ddlWebSite.DataBind();
ddlWebSite.Items.Insert(0, new ListItem(GetLocalizedString("Text.SelectWebSite"), ""));
// select site from query string parameter
string targetSite = HttpContext.Current.Request["SiteId"];
if (!string.IsNullOrEmpty(targetSite))
{
foreach (ListItem item in ddlWebSite.Items)
{
if (item.Text == targetSite)
{
item.Selected = true;
ddlWebSite.Enabled = false;
locWebSiteDescription.Visible = false;
break;
}
}
ddlWebSite.SelectedValue = targetSite;
}
// apply policy to virtual dirs
directoryName.SetPackagePolicy(PanelSecurity.PackageId, UserSettings.WEB_POLICY, "VirtDirNamePolicy");
}
private void BindDatabaseEngines(List<DeploymentParameter> parameters)
{
// SQL Server
if (FindParameterByTag(parameters, DeploymentParameterWellKnownTag.Sql) != null)
{
// load package context
PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId);
// add SQL Server engines
if (cntx.Groups.ContainsKey(ResourceGroups.MsSql2012))
AddDatabaseEngine(DeploymentParameterWellKnownTag.Sql, ResourceGroups.MsSql2012, GetSharedLocalizedString("ResourceGroup." + ResourceGroups.MsSql2012));
if (cntx.Groups.ContainsKey(ResourceGroups.MsSql2008))
AddDatabaseEngine(DeploymentParameterWellKnownTag.Sql, ResourceGroups.MsSql2008, GetSharedLocalizedString("ResourceGroup." + ResourceGroups.MsSql2008));
if (cntx.Groups.ContainsKey(ResourceGroups.MsSql2005))
AddDatabaseEngine(DeploymentParameterWellKnownTag.Sql, ResourceGroups.MsSql2005, GetSharedLocalizedString("ResourceGroup." + ResourceGroups.MsSql2005));
if (cntx.Groups.ContainsKey(ResourceGroups.MsSql2000))
AddDatabaseEngine(DeploymentParameterWellKnownTag.Sql, ResourceGroups.MsSql2000, GetSharedLocalizedString("ResourceGroup." + ResourceGroups.MsSql2000));
}
// MySQL Server
if (FindParameterByTag(parameters, DeploymentParameterWellKnownTag.MySql) != null)
{
// load package context
PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId);
// add SQL Server engines
if (cntx.Groups.ContainsKey(ResourceGroups.MySql5))
AddDatabaseEngine(DeploymentParameterWellKnownTag.MySql, ResourceGroups.MySql5, GetSharedLocalizedString("ResourceGroup." + ResourceGroups.MySql5));
if (cntx.Groups.ContainsKey(ResourceGroups.MySql4))
AddDatabaseEngine(DeploymentParameterWellKnownTag.MySql, ResourceGroups.MySql4, GetSharedLocalizedString("ResourceGroup." + ResourceGroups.MySql4));
}
// SQLite
if (FindParameterByTag(parameters, DeploymentParameterWellKnownTag.SqLite) != null)
AddDatabaseEngine(DeploymentParameterWellKnownTag.SqLite, "", GetLocalizedString("DatabaseEngine.SQLite"));
// Flat File
if (FindParameterByTag(parameters, DeploymentParameterWellKnownTag.FlatFile) != null)
AddDatabaseEngine(DeploymentParameterWellKnownTag.FlatFile, "", GetLocalizedString("DatabaseEngine.FlatFile"));
// VistaFB
if (FindParameterByTag(parameters, DeploymentParameterWellKnownTag.VistaDB) != null)
AddDatabaseEngine(DeploymentParameterWellKnownTag.VistaDB, "", GetLocalizedString("DatabaseEngine.VistaDB"));
BindDBPolicies(parameters);
// hide module if no database required
divDatabase.Visible = (databaseEngines.Items.Count > 0);
// bind parameters
BindParameters(parameters);
}
#region prefix & suffix for database name & username
private void BindDBPolicies(List<DeploymentParameter> parameters)
{
// MS SQL Server
if (FindParameterByTag(parameters, DeploymentParameterWellKnownTag.Sql) != null)
{
SetDBPolicies(UserSettings.MSSQL_POLICY, parameters, DeploymentParameterWellKnownTag.Sql);
}
// MySQL Server
if (FindParameterByTag(parameters, DeploymentParameterWellKnownTag.MySql) != null)
{
SetDBPolicies(UserSettings.MYSQL_POLICY, parameters, DeploymentParameterWellKnownTag.MySql);
}
}
private void SetDBPolicies(string policy, IEnumerable<DeploymentParameter> parameters, DeploymentParameterWellKnownTag dbTag)
{
foreach (DeploymentParameter parameter in parameters)
{
if (
(parameter.WellKnownTags & DeploymentParameterWellKnownTag.DBName) != 0
&&
(parameter.WellKnownTags & dbTag) != 0
)
{
// database name
string policyValue = GetPackagePolicy(policy, "DatabaseNamePolicy");
ApplyPrefixSuffixPolicy(parameter, policyValue);
}
if (
(parameter.WellKnownTags & DeploymentParameterWellKnownTag.DBUserName) != 0
&&
(parameter.WellKnownTags & dbTag) != 0
)
{
// user name
string policyValue = GetPackagePolicy(policy, "UserNamePolicy");
ApplyPrefixSuffixPolicy(parameter, policyValue);
}
}
}
private bool ApplyPrefixSuffixPolicy(DeploymentParameter parameter, string policyValue)
{
if (null != policyValue)
{
string prefix, suffix;
ParsePolicyPrefixSuffix(policyValue, out prefix, out suffix);
if (!string.IsNullOrEmpty(prefix))
parameter.ValuePrefix = prefix;
if (!string.IsNullOrEmpty(suffix))
parameter.ValueSuffix = suffix;
return true;
}
return false;
}
private void ParsePolicyPrefixSuffix(string policyValue, out string prefix, out string suffix)
{
prefix = string.Empty;
suffix = string.Empty;
// parse and enforce policy
if (string.IsNullOrEmpty(policyValue)) return;
try
{
// parse settings
string[] parts = policyValue.Split(';');
bool enabled = Utils.ParseBool(parts[0], false);
prefix = parts[4];
suffix = parts[5];
// apply policy
if (enabled)
{
// prefix
if (!String.IsNullOrEmpty(prefix))
{
// substitute vars
prefix = Utils.ReplaceStringVariable(prefix, "user_id", _policyUser.UserId.ToString(CultureInfo.InvariantCulture));
prefix = Utils.ReplaceStringVariable(prefix, "user_name", _policyUser.Username);
}
// suffix
if (!String.IsNullOrEmpty(suffix))
{
// substitute vars
suffix = Utils.ReplaceStringVariable(suffix, "user_id", _policyUser.UserId.ToString(CultureInfo.InvariantCulture));
suffix = Utils.ReplaceStringVariable(suffix, "user_name", _policyUser.Username);
}
}
}
catch
{
/* skip */
}
}
private string GetPackagePolicy(string settingsName, string key)
{
// load package
PackageInfo package = PackagesHelper.GetCachedPackage(PanelSecurity.PackageId);
if (package != null)
{
// load user profile
int userId = package.UserId;
_policyUser = UsersHelper.GetCachedUser(package.UserId);
if (_policyUser != null)
{
// load settings
UserSettings settings = UsersHelper.GetCachedUserSettings(userId, settingsName);
if (settings != null)
{
string policyValue = settings[key];
if (policyValue != null)
return policyValue;
}
}
}
return null;
}
#endregion
private void AddDatabaseEngine(DeploymentParameterWellKnownTag engine, string group, string text)
{
databaseEngines.Items.Add(new ListItem(text, String.Format("{0},{1}", engine, group)));
}
protected void databaseEngines_SelectedIndexChanged(object sender, EventArgs e)
{
// load parameters
List<DeploymentParameter> parameters = GetApplicationParameters();
if (parameters == null)
return;
BindDBPolicies(parameters);
BindParameters(parameters);
}
protected void databaseMode_SelectedIndexChanged(object sender, EventArgs e)
{
// load parameters
List<DeploymentParameter> parameters = GetApplicationParameters();
if (parameters == null)
return;
BindDBPolicies(parameters);
BindParameters(parameters);
}
private void BindParameters()
{
// load parameters
List<DeploymentParameter> parameters = GetApplicationParameters();
if (parameters == null)
return;
// bind parameters
BindParameters(parameters);
}
private void BindParameters(List<DeploymentParameter> parameters)
{
if (databaseEngines.Items.Count > 0)
{
// filter parameters by database engine
DeploymentParameterWellKnownTag engine = GetSelectedDatabaseEngine();
string resourceGroup = GetSelectedDatabaseResourceGroup();
// remove parameters for other engines
parameters.RemoveAll(delegate(DeploymentParameter p)
{
return (p.WellKnownTags & databaseEngineTags) > 0
&& (p.WellKnownTags & engine) != engine;
});
// hide database mode for file-based engines
databaseModeBlock.Visible = !String.IsNullOrEmpty(resourceGroup);
}
// bind
repParams.DataSource = parameters;
repParams.DataBind();
// bind existing databases and user
BindExistingDatabases();
}
private void BindExistingDatabases()
{
string resourceGroup = GetSelectedDatabaseResourceGroup();
if (String.IsNullOrEmpty(resourceGroup))
return; // application does not require database
// databases
WebApplicationGalleryParamControl databaseControl = FindParameterControlByTag(DeploymentParameterWellKnownTag.DBName);
if (databaseControl != null && databaseMode.SelectedValue == "existing")
{
// bind databases
SqlDatabase[] databases = ES.Services.DatabaseServers.GetSqlDatabases(PanelSecurity.PackageId, resourceGroup, false);
// disable regexp validator
databaseControl.ValidationKind &= ~DeploymentParameterValidationKind.RegularExpression;
// enable enumeration
List<string> databaseNames = new List<string>();
databaseNames.Add(""); // add empty database
foreach (SqlDatabase database in databases)
databaseNames.Add(database.Name);
databaseControl.ValidationKind |= DeploymentParameterValidationKind.Enumeration;
databaseControl.ValidationString = String.Join(",", databaseNames.ToArray());
// fill users list
WebApplicationGalleryParamControl userControl = FindParameterControlByTag(DeploymentParameterWellKnownTag.DBUserName);
if (userControl != null)
{
SqlUser[] users = ES.Services.DatabaseServers.GetSqlUsers(PanelSecurity.PackageId, resourceGroup, false);
// disable regexp validator
userControl.ValidationKind &= ~DeploymentParameterValidationKind.RegularExpression;
// enable enumeration
List<string> userNames = new List<string>();
userNames.Add(""); // add empty username
foreach (SqlUser user in users)
userNames.Add(user.Name);
userControl.ValidationKind |= DeploymentParameterValidationKind.Enumeration;
userControl.ValidationString = String.Join(",", userNames.ToArray());
// username password
WebApplicationGalleryParamControl userPasswordControl = FindParameterControlByTag(DeploymentParameterWellKnownTag.DBUserPassword);
if (userPasswordControl != null)
{
userPasswordControl.WellKnownTags &= ~DeploymentParameterWellKnownTag.New;
}
}
}
}
protected void repParams_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
WebApplicationGalleryParamControl paramControl = e.Item.FindControl("param") as WebApplicationGalleryParamControl;
if (paramControl != null)
paramControl.BindParameter(e.Item.DataItem as DeploymentParameter);
}
private DeploymentParameter FindParameterByTag(List<DeploymentParameter> parameters, DeploymentParameterWellKnownTag tag)
{
return parameters.Find(delegate(DeploymentParameter p)
{
return ((p.WellKnownTags & tag) == tag);
});
}
private WebApplicationGalleryParamControl FindParameterControlByTag(DeploymentParameterWellKnownTag tag)
{
foreach (RepeaterItem item in repParams.Items)
{
WebApplicationGalleryParamControl paramControl = item.FindControl("param") as WebApplicationGalleryParamControl;
if (paramControl != null && (paramControl.WellKnownTags & tag) == tag)
return paramControl;
}
return null;
}
private DeploymentParameterWellKnownTag GetSelectedDatabaseEngine()
{
string val = databaseEngines.SelectedValue;
return String.IsNullOrEmpty(val)
? DeploymentParameterWellKnownTag.None
: (DeploymentParameterWellKnownTag)Enum.Parse(typeof(DeploymentParameterWellKnownTag), val.Split(',')[0]);
}
private string GetSelectedDatabaseResourceGroup()
{
string val = databaseEngines.SelectedValue.Trim();
return val != "" ? val.Split(',')[1] : val;
}
private List<DeploymentParameter> GetParameters()
{
// get the information about selected database engine
string resourceGroup = GetSelectedDatabaseResourceGroup();
DeploymentParameterWellKnownTag databaseEngine = GetSelectedDatabaseEngine();
// collect parameters
List<DeploymentParameter> parameters = new List<DeploymentParameter>();
foreach (RepeaterItem item in repParams.Items)
{
WebApplicationGalleryParamControl paramControl = item.FindControl("param") as WebApplicationGalleryParamControl;
if (paramControl != null)
{
// store parameter in the collection
DeploymentParameter param = paramControl.GetParameter();
parameters.Add(param);
// set database engine flag
param.WellKnownTags &= ~databaseEngineTags; // reset all database flags
param.WellKnownTags |= databaseEngine; // set seleced
}
}
// add the information about selected resource group
if (!String.IsNullOrEmpty(resourceGroup))
{
parameters.Add(new DeploymentParameter()
{
Name = DeploymentParameter.ResourceGroupParameterName,
Value = resourceGroup,
WellKnownTags = databaseEngine
});
}
return parameters;
}
private void InstallApplication()
{
if (!Page.IsValid)
return; // server-side validation
// collect parameters
List<DeploymentParameter> parameters = GetParameters();
string language = (string)Session["WebApplicationGaleryLanguage"];
// install application
StringResultObject res = ES.Services.WebApplicationGallery.Install(PanelSecurity.PackageId,
PanelRequest.ApplicationID,
ddlWebSite.SelectedItem.Text,
directoryName.Text.Trim(),
parameters.ToArray(),
language
);
InstallLogPanel.Visible = true;
InstallLog.InnerText = res.Value;
// show message box with results
if (res.IsSuccess)
{
messageBox.ShowMessage(res, "WEB_APPLICATION_GALLERY_INSTALLED", "WebAppGallery");
}
else
{
messageBox.ShowMessage(res, null, null);
}
// toggle controls if there are no errors
if (res.ErrorCodes.Count == 0)
{
secAppSettings.Visible = false;
btnCancel.Visible = false;
btnInstall.Visible = false;
btnOK.Visible = true;
urlPanel.Visible = true;
try
{
GalleryApplicationResult appResult =
ES.Services.WebApplicationGallery.GetGalleryApplicationDetails(PanelSecurity.PackageId,
PanelRequest.ApplicationID);
//
GalleryApplication application = appResult.Value;
//
if (application != null)
{
// change "Launch" link
hlApplication.Text = String.Format(GetLocalizedString("LaunchApplication.Text"), application.Title);
// set "main" application URL
hlApplication.NavigateUrl = GetAppLaunchUrl(application, ddlWebSite.SelectedItem.Text);
// set "temp" application URL if required
DomainInfo[] domains = ES.Services.WebServers.GetWebSitePointers(Int32.Parse(ddlWebSite.SelectedValue));
foreach (DomainInfo domain in domains)
{
if (domain.IsInstantAlias)
{
// show temp URL
tempUrlPanel.Visible = true;
// set URL text
tempUrl.Text = String.Format(GetLocalizedString("LaunchApplicationTemp.Text"), GetAppLaunchUrl(application, domain.DomainName));
break;
}
}
}
}
catch (Exception ex)
{
ShowErrorMessage("GET_GALLERY_APPLIACTION_DETAILS", ex);
}
}
}
private string GetAppLaunchUrl(GalleryApplication app, string siteUrl)
{
// fix app start page
string startPage = app.StartPage != null ? app.StartPage.Replace('\\', '/').TrimStart('/') : "";
// build URL
string url = "http://" + siteUrl;
// append virtual dir
if (directoryName.Text != "")
url += "/" + directoryName.Text;
// append start page and return
return url + "/" + startPage;
}
protected void btnInstall_Click(object sender, EventArgs e)
{
InstallApplication();
}
protected void btnCancel_Click(object sender, EventArgs e)
{
string returnUrl = HttpContext.Current.Request["ReturnUrl"];
if (!string.IsNullOrEmpty(returnUrl))
{
string redirectUrl = HttpUtility.UrlDecode(returnUrl);
Response.Redirect(redirectUrl);
}
else
{
RedirectSpaceHomePage();
}
}
protected void btnOK_Click(object sender, EventArgs e)
{
string returnUrl = HttpContext.Current.Request["ReturnUrl"];
if (!string.IsNullOrEmpty(returnUrl))
{
string redirectUrl = HttpUtility.UrlDecode(returnUrl);
Response.Redirect(redirectUrl);
}
else
{
RedirectSpaceHomePage();
}
}
}
}