blob: 4efef7ca76e1693b5bb070adda16f81cd4b198c7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DotCMIS.Binding.Services;
using DotCMIS.Binding.Impl;
using DotCMIS.CMISWebServicesReference;
using System.Net;
namespace DotCMIS.Binding
{
public interface ICmisBinding
{
IRepositoryService GetRepositoryService();
INavigationService GetNavigationService();
IObjectService GetObjectService();
IVersioningService GetVersioningService();
IRelationshipService GetRelationshipService();
IDiscoveryService GetDiscoveryService();
IMultiFilingService GetMultiFilingService();
IAclService GetAclService();
IPolicyService GetPolicyService();
IBindingsObjectFactory GetObjectFactory();
void ClearAllCaches();
void ClearRepositoryCache(string repositoryId);
void Close();
}
public interface IBindingSession
{
object GetValue(string key);
object GetValue(string key, object defValue);
int GetValue(string key, int defValue);
}
public abstract class AbstractAuthenticationProvider
{
public IBindingSession Session { get; set; }
public abstract void Authenticate(object connection);
public string GetUser()
{
return Session.GetValue(SessionParameter.User) as string;
}
public string GetPassword()
{
return Session.GetValue(SessionParameter.Password) as string;
}
}
public class StandardAuthenticationProvider : AbstractAuthenticationProvider
{
public override void Authenticate(object connection)
{
string user = GetUser();
string password = GetPassword();
if (user == null || password == null)
{
return;
}
if (connection is RepositoryServicePortClient)
{
((RepositoryServicePortClient)connection).ClientCredentials.UserName.UserName = user;
((RepositoryServicePortClient)connection).ClientCredentials.UserName.Password = password;
}
else if (connection is NavigationServicePortClient)
{
((NavigationServicePortClient)connection).ClientCredentials.UserName.UserName = user;
((NavigationServicePortClient)connection).ClientCredentials.UserName.Password = password;
}
else if (connection is ObjectServicePortClient)
{
((ObjectServicePortClient)connection).ClientCredentials.UserName.UserName = user;
((ObjectServicePortClient)connection).ClientCredentials.UserName.Password = password;
}
else if (connection is VersioningServicePortClient)
{
((VersioningServicePortClient)connection).ClientCredentials.UserName.UserName = user;
((VersioningServicePortClient)connection).ClientCredentials.UserName.Password = password;
}
else if (connection is DiscoveryServicePortClient)
{
((DiscoveryServicePortClient)connection).ClientCredentials.UserName.UserName = user;
((DiscoveryServicePortClient)connection).ClientCredentials.UserName.Password = password;
}
else if (connection is RelationshipServicePortClient)
{
((RelationshipServicePortClient)connection).ClientCredentials.UserName.UserName = user;
((RelationshipServicePortClient)connection).ClientCredentials.UserName.Password = password;
}
else if (connection is MultiFilingServicePortClient)
{
((MultiFilingServicePortClient)connection).ClientCredentials.UserName.UserName = user;
((MultiFilingServicePortClient)connection).ClientCredentials.UserName.Password = password;
}
else if (connection is PolicyServicePortClient)
{
((PolicyServicePortClient)connection).ClientCredentials.UserName.UserName = user;
((PolicyServicePortClient)connection).ClientCredentials.UserName.Password = password;
}
else if (connection is ACLServicePortClient)
{
((ACLServicePortClient)connection).ClientCredentials.UserName.UserName = user;
((ACLServicePortClient)connection).ClientCredentials.UserName.Password = password;
}
else if (connection is WebRequest)
{
((WebRequest)connection).Credentials = new NetworkCredential(user, password);
}
}
}
public interface IBindingsObjectFactory
{
}
public class CmisBindingFactory
{
// Default CMIS AtomPub binding SPI implementation
public const string BindingSpiAtomPub = "DotCMIS.Binding.AtomPub.CmisAtomPubSpi";
// Default CMIS Web Services binding SPI implementation
public const string BindingSpiWebServices = "DotCMIS.Binding.WebServices.CmisWebServicesSpi";
public const string StandardAuthenticationProviderClass = "DotCMIS.Binding.StandardAuthenticationProvider";
private IDictionary<string, string> defaults;
private CmisBindingFactory()
{
defaults = CreateNewDefaultParameters();
}
public static CmisBindingFactory NewInstance()
{
return new CmisBindingFactory();
}
public IDictionary<string, string> GetDefaultSessionParameters()
{
return defaults;
}
public void SetDefaultSessionParameters(IDictionary<string, string> sessionParameters)
{
if (sessionParameters == null)
{
defaults = CreateNewDefaultParameters();
}
else
{
defaults = sessionParameters;
}
}
public ICmisBinding CreateCmisBinding(IDictionary<string, string> sessionParameters)
{
CheckSessionParameters(sessionParameters, true);
AddDefaultParameters(sessionParameters);
return new CmisBinding(sessionParameters);
}
public ICmisBinding CreateCmisAtomPubBinding(IDictionary<string, string> sessionParameters)
{
CheckSessionParameters(sessionParameters, false);
sessionParameters[SessionParameter.BindingSpiClass] = BindingSpiAtomPub;
if (!sessionParameters.ContainsKey(SessionParameter.AuthenticationProviderClass))
{
sessionParameters[SessionParameter.AuthenticationProviderClass] = StandardAuthenticationProviderClass;
}
AddDefaultParameters(sessionParameters);
Check(sessionParameters, SessionParameter.AtomPubUrl);
return new CmisBinding(sessionParameters);
}
public ICmisBinding CreateCmisWebServicesBinding(IDictionary<string, string> sessionParameters)
{
CheckSessionParameters(sessionParameters, false);
sessionParameters[SessionParameter.BindingSpiClass] = BindingSpiWebServices;
if (!sessionParameters.ContainsKey(SessionParameter.AuthenticationProviderClass))
{
sessionParameters[SessionParameter.AuthenticationProviderClass] = StandardAuthenticationProviderClass;
}
AddDefaultParameters(sessionParameters);
Check(sessionParameters, SessionParameter.WebServicesAclService);
Check(sessionParameters, SessionParameter.WebServicesDiscoveryService);
Check(sessionParameters, SessionParameter.WebServicesMultifilingService);
Check(sessionParameters, SessionParameter.WebServicesNavigationService);
Check(sessionParameters, SessionParameter.WebServicesObjectService);
Check(sessionParameters, SessionParameter.WebServicesPolicyService);
Check(sessionParameters, SessionParameter.WebServicesRelationshipService);
Check(sessionParameters, SessionParameter.WebServicesRepositoryService);
Check(sessionParameters, SessionParameter.WebServicesVersioningService);
return new CmisBinding(sessionParameters);
}
// ---- internals ----
private void CheckSessionParameters(IDictionary<string, string> sessionParameters, bool mustContainSpi)
{
// don't accept null
if (sessionParameters == null)
{
throw new ArgumentNullException("sessionParameters");
}
// check binding entry
if (mustContainSpi)
{
string spiClass;
if (sessionParameters.TryGetValue(SessionParameter.BindingSpiClass, out spiClass))
{
throw new ArgumentException("SPI class entry (" + SessionParameter.BindingSpiClass + ") is missing!");
}
if ((spiClass == null) || (spiClass.Trim().Length == 0))
{
throw new ArgumentException("SPI class entry (" + SessionParameter.BindingSpiClass + ") is invalid!");
}
}
}
private void Check(IDictionary<string, string> sessionParameters, String parameter)
{
if (!sessionParameters.ContainsKey(parameter))
{
throw new ArgumentException("Parameter '" + parameter + "' is missing!");
}
}
private void AddDefaultParameters(IDictionary<string, string> sessionParameters)
{
foreach (string key in defaults.Keys)
{
if (!sessionParameters.ContainsKey(key))
{
sessionParameters[key] = defaults[key];
}
}
}
private IDictionary<string, string> CreateNewDefaultParameters()
{
IDictionary<string, string> result = new Dictionary<string, string>();
result[SessionParameter.CacheSizeRepositories] = "10";
result[SessionParameter.CacheSizeTypes] = "100";
result[SessionParameter.CacheSizeLinks] = "400";
return result;
}
}
}