// 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.Text;
using Microsoft.Web.Services3;
using WebsitePanel.EnterpriseServer;
using WebsitePanel.EnterpriseServer.HostedSolution;
namespace WebsitePanel.Setup
{
public class ServerContext
{
public string Server { get; set; }
public string Username { get; set; }
public string Password { get; set; }
}
///
/// ES Proxy class
///
public class ES
{
public const int ERROR_USER_WRONG_PASSWORD = -110;
public const int ERROR_USER_WRONG_USERNAME = -109;
public const int ERROR_USER_ACCOUNT_CANCELLED = -105;
public const int ERROR_USER_ACCOUNT_DEMO = -106;
public const int ERROR_USER_ACCOUNT_PENDING = -103;
public const int ERROR_USER_ACCOUNT_SHOULD_BE_ADMINISTRATOR = -107;
public const int ERROR_USER_ACCOUNT_SHOULD_BE_RESELLER = -108;
public const int ERROR_USER_ACCOUNT_SUSPENDED = -104;
private static ServerContext serverContext = null;
private static void InitializeServices(ServerContext context)
{
serverContext = context;
}
public static bool Connect(string server, string username, string password)
{
bool ret = true;
ServerContext serverContext = new ServerContext();
serverContext.Server = server;
serverContext.Username = username;
serverContext.Password = password;
InitializeServices(serverContext);
int status = -1;
try
{
status = ES.Services.Authentication.AuthenticateUser(serverContext.Username, serverContext.Password, null);
}
catch (Exception ex)
{
Log.WriteError("Authentication error", ex);
return false;
}
string errorMessage = "Check your internet connection or server URL.";
if (status != 0)
{
switch (status)
{
case ERROR_USER_WRONG_USERNAME:
errorMessage = "Wrong username.";
break;
case ERROR_USER_WRONG_PASSWORD:
errorMessage = "Wrong password.";
break;
case ERROR_USER_ACCOUNT_CANCELLED:
errorMessage = "Account cancelled.";
break;
case ERROR_USER_ACCOUNT_PENDING:
errorMessage = "Account pending.";
break;
}
Log.WriteError(
string.Format("Cannot connect to the remote server. {0}", errorMessage));
ret = false;
}
return ret;
}
public static ES Services
{
get
{
return new ES();
}
}
public esSystem System
{
get { return GetCachedProxy(); }
}
public esApplicationsInstaller ApplicationsInstaller
{
get { return GetCachedProxy(); }
}
public esAuditLog AuditLog
{
get { return GetCachedProxy(); }
}
public esAuthentication Authentication
{
get { return GetCachedProxy(false); }
}
public esComments Comments
{
get { return GetCachedProxy(); }
}
public esDatabaseServers DatabaseServers
{
get { return GetCachedProxy(); }
}
public esFiles Files
{
get { return GetCachedProxy(); }
}
public esFtpServers FtpServers
{
get { return GetCachedProxy(); }
}
public esMailServers MailServers
{
get { return GetCachedProxy(); }
}
public esOperatingSystems OperatingSystems
{
get { return GetCachedProxy(); }
}
public esPackages Packages
{
get { return GetCachedProxy(); }
}
public esScheduler Scheduler
{
get { return GetCachedProxy(); }
}
public esTasks Tasks
{
get { return GetCachedProxy(); }
}
public esServers Servers
{
get { return GetCachedProxy(); }
}
public esStatisticsServers StatisticsServers
{
get { return GetCachedProxy(); }
}
public esUsers Users
{
get { return GetCachedProxy(); }
}
public esWebServers WebServers
{
get { return GetCachedProxy(); }
}
public esSharePointServers SharePointServers
{
get { return GetCachedProxy(); }
}
public esImport Import
{
get { return GetCachedProxy(); }
}
public esBackup Backup
{
get { return GetCachedProxy(); }
}
public esExchangeServer ExchangeServer
{
get { return GetCachedProxy(); }
}
public esOrganizations Organizations
{
get { return GetCachedProxy(); }
}
protected ES()
{
}
protected virtual T GetCachedProxy()
{
return GetCachedProxy(true);
}
protected virtual T GetCachedProxy(bool secureCalls)
{
if (serverContext == null)
{
throw new Exception("Server context is not specified");
}
Type t = typeof(T);
string key = t.FullName + ".ServiceProxy";
T proxy = (T)Activator.CreateInstance(t);
object p = proxy;
// configure proxy
EnterpriseServerProxyConfigurator cnfg = new EnterpriseServerProxyConfigurator();
cnfg.EnterpriseServerUrl = serverContext.Server;
if (secureCalls)
{
cnfg.Username = serverContext.Username;
cnfg.Password = serverContext.Password;
}
cnfg.Configure((WebServicesClientProtocol)p);
return proxy;
}
}
}