using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using newtelligence.DasBlog.Web.Core;
using Microsoft.Samples.ServiceHosting.StorageClient;
using newtelligence.DasBlog.Web;
namespace newtelligence.DasBlog.Runtime.Azure{
public class SiteSecurityDataServiceAzure : ISiteSecurityDataService
{
private StorageAccountInfo accountinfo;
public SiteSecurityDataServiceAzure(string location)
{
this.accountinfo = StorageAccountInfo.GetDefaultTableStorageAccountFromConfiguration();
TableStorage.CreateTablesFromModel(typeof(SiteSecurityDataServiceContext), accountinfo);
var ctx = new SiteSecurityDataServiceContext(accountinfo);
// ensure we have atleast one admin user
var admin = (from u in ctx.Users
where u.Role == "admin"
select u).FirstOrDefault();
if (admin == null)
{
AddUser(new User() { Name = "Admin", Password = "admin", Role = "admin", Active = true });
}
}
public void AddUser(User user)
{
var ctx = new SiteSecurityDataServiceContext(accountinfo);
ctx.AddUser(new UserEntity(user));
}
public void UpdateUser(User user)
{
if (user != null)
{
var ctx = new SiteSecurityDataServiceContext(this.accountinfo);
string username = user.Name.ToLowerInvariant();
var ent = FindUserEntity(x => x.NameLower == username, ref ctx);
if (!string.IsNullOrEmpty(user.Password))
{
ent.Password = user.XmlPassword;
}
ent.EmailAddress = user.EmailAddress;
ent.NotifyOnNewPost = user.NotifyOnNewPost;
ent.NotifyOnAllComment = user.NotifyOnAllComment;
ent.NotifyOnOwnComment = user.NotifyOnOwnComment;
ent.DisplayName = user.DisplayName;
ent.OpenIDUrl = user.OpenIDUrl;
ctx.UpdateUser(ent);
}
}
public UserCollection GetAllUsers()
{
var ctx = new SiteSecurityDataServiceContext(accountinfo);
var users = (from u in ctx.Users select u).ToList();
return new UserCollection(users.ConvertAll(u => u.GetUser()));
}
public void SetPassword(string userName, string password)
{
userName = userName.ToLowerInvariant();
var ctx = new SiteSecurityDataServiceContext(accountinfo);
var user = FindUserEntity(x => x.NameLower == userName, ref ctx);
if (user != null)
{
// hash the password before storing it, since we don't want unencrypted data
// in the cloud storage
user.Password = SiteSecurity.Encrypt(password);
ctx.UpdateUser(user);
}
}
public User FindUserByUserName(string userName)
{
userName = userName.ToLowerInvariant();
return this.FindUser(x => x.NameLower == userName);
}
public User FindUserByEmail(string email)
{
return this.FindUser(x => x.EmailAddress == email);
}
public User FindUserByDisplayName(string displayName)
{
return this.FindUser(x => x.DisplayName == displayName);
}
public User FindUserByOpenIdIdentifier(string identifier)
{
return this.FindUser(x => x.OpenIDUrl == identifier);
}
private UserEntity FindUserEntity(Func<UserEntity, bool> predicate, ref SiteSecurityDataServiceContext ctx)
{
return ctx.Users.Where(predicate).FirstOrDefault();
}
// helper method for finding a user
private User FindUser(Func<UserEntity, bool> predicate)
{
var ctx = new SiteSecurityDataServiceContext(accountinfo);
var ent = FindUserEntity(predicate, ref ctx);
return ent == null ? null : ent.GetUser();
}
}
}
|