public class UserServices
{
/// <summary>
/// Administrator username
/// </summary>
private const string ADMIN_USERNAME = "admin";
/// <summary>
/// Administrator password
/// </summary>
private const string ADMIN_PASSWORD = "test";
/// <summary>
/// Instance of the administration client.
/// </summary>
private readonly AdministrationServiceSoapPortClient _adminClient;
/// <summary>
/// Instance of the administration CMIS session.
/// </summary>
private readonly ISession _adminSession;
/// <summary>
/// Initializes a new instance of the <see cref="UserServices"/> class.
/// </summary>
public UserServices()
{
// hack: avoid certificate check for WCF
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
// Get ticket for admin user
var authClient = new AuthenticationServiceSoapPortClient();
AuthenticationResult ticket = authClient.startSession(ADMIN_USERNAME, ADMIN_PASSWORD);
// Instantiate administration service client for Alfresco
_adminClient = new AdministrationServiceSoapPortClient();
_adminClient.ClientCredentials.UserName.UserName = ticket.username;
_adminClient.ClientCredentials.UserName.Password = ticket.ticket;
// Instantiate administration session
var parameters = new Dictionary();
parameters[SessionParameter.BindingType] = BindingType.AtomPub;
parameters[SessionParameter.AtomPubUrl] = "http://localhost:8080/alfresco/service/cmis";
parameters[SessionParameter.User] = ADMIN_USERNAME;
parameters[SessionParameter.Password] = ADMIN_PASSWORD;
SessionFactory factory = SessionFactory.NewInstance();
_adminSession = factory.GetRepositories(parameters)[0].CreateSession();
}
/// <summary>
/// Creates a new user in the user management of Alfresco.
/// Additionally it creates a new home folder in the root repository of Alfresco.
/// </summary>
/// <param name="user">The user.</param>
/// <returns></returns>
public NewUserDetails CreateUser(User user)
{
// Create a new home folder for the specified user
var userHomeFolder = CreateUserHomeFolder(user);
// Create new user in Alfresco
var newUserDetails = new NewUserDetails();
newUserDetails.userName = user.UserName;
newUserDetails.password = user.Password;
newUserDetails.properties = CreateNewUserProperties(
userHomeFolder.Id,
user.FirstName,
user.MiddleName,
user.LastName,
user.Email,
user.OrganizationID);
NewUserDetails userDetails = null;
try
{
// Add new user to the user database of Alfresco and get the userdetails with the
// generated Server-ID.
userDetails = _adminClient.createUsers(new[] { newUserDetails });
}
catch (Exception ex)
{
// in case of the user already exists, an exception will thrown
}
return userDetails;
}
/// <summary>
/// Deletes the user from the database of Alfresco
/// </summary>
/// <param name="user">The user.</param>
public void RemoveUser(User user)
{
// Delete the home folder of the specified user
DeleteUserHomeFolder(user);
// Delete the user
_adminClient.deleteUsers(new[] { user.UserId });
}
/// <summary>
/// Fetches the root repository of the user home folders.
/// </summary>
/// <returns>The root repository where the user home folders are.</returns>
private IFolder FetchRootFolder()
{
return _adminSession.GetObjectByPath("/User Homes/") as DotCMIS.Client.Impl.Folder;
}
/// <summary>
/// Fetches the user home folder.
/// </summary>
/// <param name="user">The user.</param>
/// <returns></returns>
private IFolder FetchUserHomeFolder(User user)
{
return
_adminSession.GetObjectByPath(
string.Format("/User Homes/{0}", user.UserName)) as DotCMIS.Client.Impl.Folder;
}
/// <summary>
/// Creates a new home folder for the specified user
/// </summary>
/// <param name="user">The user.</param>
/// <returns></returns>
private IFolder CreateUserHomeFolder(User user)
{
var properties = new Dictionary();
properties[PropertyIds.Name] = user.UserName;
properties[PropertyIds.ObjectTypeId] = "cmis:folder";
return FetchRootFolder().CreateFolder(properties);
}
/// <summary>
/// Deletes the user home folder of the specified user.
/// </summary>
/// <param name="user">The user.</param>
private void DeleteUserHomeFolder(User user)
{
var userHomeFolder = FetchUserHomeFolder(user);
if (userHomeFolder != null)
{
userHomeFolder.Delete(true);
}
}
/// <summary>
/// Creates the new user properties.
/// </summary>
/// <param name="homeFolder">The home folder.</param>
/// <param name="firstName">The first name.</param>
/// <param name="middleName">Name of the middle.</param>
/// <param name="lastName">The last name.</param>
/// <param name="email">The email.</param>
/// <param name="orgId">The org identifier.</param>
/// <returns></returns>
private NamedValue[] CreateNewUserProperties(string homeFolder, string firstName, string middleName,
string lastName, string email, string orgId)
{
return new[]
{
new NamedValue
{
isMultiValue = false,
name = Constants.PROP_USER_HOMEFOLDER,
value = homeFolder,
values = null
},
new NamedValue
{
isMultiValue = false,
name = Constants.PROP_USER_FIRSTNAME,
value = firstName,
values = null
},
new NamedValue
{
isMultiValue = false,
name = Constants.PROP_USER_MIDDLENAME,
value = middleName,
values = null
},
new NamedValue
{
isMultiValue = false,
name = Constants.PROP_USER_LASTNAME,
value = lastName,
values = null
},
new NamedValue
{
isMultiValue = false,
name = Constants.PROP_USER_EMAIL,
value = email,
values = null
},
new NamedValue
{
isMultiValue = false,
name = Constants.PROP_USER_ORGID,
value = orgId,
values = null
}
};
}
}