using CookComputing.XmlRpc; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; using System.Web.Security; public interface IMetaWeblog { #region MetaWeblog API [XmlRpcMethod("metaWeblog.newPost")] string AddPost(string blogid, string username, string password, Post post, bool publish); [XmlRpcMethod("metaWeblog.editPost")] bool UpdatePost(string postid, string username, string password, Post post, bool publish); [XmlRpcMethod("metaWeblog.getPost")] object GetPost(string postid, string username, string password); [XmlRpcMethod("metaWeblog.getCategories")] object[] GetCategories(string blogid, string username, string password); [XmlRpcMethod("metaWeblog.getRecentPosts")] object[] GetRecentPosts(string blogid, string username, string password, int numberOfPosts); [XmlRpcMethod("metaWeblog.newMediaObject")] object NewMediaObject(string blogid, string username, string password, MediaObject mediaObject); #endregion #region Blogger API [XmlRpcMethod("blogger.deletePost")] [return: XmlRpcReturnValue(Description = "Returns true.")] bool DeletePost(string key, string postid, string username, string password, bool publish); [XmlRpcMethod("blogger.getUsersBlogs")] object[] GetUsersBlogs(string key, string username, string password); #endregion } public class MetaWeblogHandler : XmlRpcService, IMetaWeblog { string IMetaWeblog.AddPost(string blogid, string username, string password, Post post, bool publish) { ValidateUser(username, password); post.Slug = PostHandler.CreateSlug(post.Title); post.IsPublished = publish; Storage.Save(post); return post.ID; } bool IMetaWeblog.UpdatePost(string postid, string username, string password, Post post, bool publish) { ValidateUser(username, password); Post match = Storage.GetAllPosts().FirstOrDefault(p => p.ID == postid); if (match != null) { match.Title = post.Title; match.Content = post.Content; match.Slug = post.Slug; match.Categories = post.Categories; match.IsPublished = publish; match.PubDate = post.PubDate; Storage.Save(match); } return match != null; } bool IMetaWeblog.DeletePost(string key, string postid, string username, string password, bool publish) { ValidateUser(username, password); Post post = Storage.GetAllPosts().FirstOrDefault(p => p.ID == postid); if (post != null) { Storage.Delete(post); } return post != null; } object IMetaWeblog.GetPost(string postid, string username, string password) { ValidateUser(username, password); Post post = Storage.GetAllPosts().FirstOrDefault(p => p.ID == postid); if (post == null) throw new XmlRpcFaultException(0, "Post does not exist"); return new { description = post.Content, title = post.Title, dateCreated = post.PubDate, wp_slug = post.Slug, categories = post.Categories.ToArray(), postid = post.ID }; } object[] IMetaWeblog.GetRecentPosts(string blogid, string username, string password, int numberOfPosts) { ValidateUser(username, password); List list = new List(); foreach (var post in Storage.GetAllPosts().Take(numberOfPosts)) { var info = new { description = post.Content, title = post.Title, dateCreated = post.PubDate, wp_slug = post.Slug, postid = post.ID }; list.Add(info); } return list.ToArray(); } object[] IMetaWeblog.GetCategories(string blogid, string username, string password) { ValidateUser(username, password); var list = new List(); var categories = Storage.GetAllPosts().SelectMany(p => p.Categories); foreach (string category in categories.Distinct()) { list.Add(new { title = category }); } return list.ToArray(); } object IMetaWeblog.NewMediaObject(string blogid, string username, string password, MediaObject media) { ValidateUser(username, password); string path = Blog.SaveFileToDisk(media.bits, Path.GetExtension(media.name)); return new { url = path }; } object[] IMetaWeblog.GetUsersBlogs(string key, string username, string password) { ValidateUser(username, password); return new[] { new { blogid = "1", blogName = ConfigurationManager.AppSettings.Get("blog:name"), url = Context.Request.Url.Scheme + "://" + Context.Request.Url.Authority } }; } private void ValidateUser(string username, string password) { if (!FormsAuthentication.Authenticate(username, password)) { throw new XmlRpcFaultException(0, "User is not valid!"); } } } [XmlRpcMissingMapping(MappingAction.Ignore)] public struct MediaObject { public string name; public string type; public byte[] bits; }