view PostWriterWebService blog/PostWriterWebService.asmx @ 178:33e57fd1a6c9

Roles: en dominio y autoregistración
author nelopauselli
date Mon, 08 Aug 2011 12:30:37 -0300
parents 4895116b8232
children
line wrap: on
line source

<%@ WebService Language="C#" Class="PostWriterWebService" %>

using System;
using System.Configuration;
using System.Globalization;
using System.Linq;
using System.Security.Cryptography;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using Telerik.Blogs;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
// [System.Web.Script.Services.ScriptService]
public class PostWriterWebService  : System.Web.Services.WebService {

  [WebMethod]
  public void WriteBlogPost(string securityToken, string blogName, string postTitle, string postHtmlContent, string postAuthor, bool setPublicationDate)
  {
    checkSecurityToken(securityToken);
    writePost(blogName, postTitle, postHtmlContent, postAuthor, setPublicationDate);
  }
  
  private void checkSecurityToken(string securityToken)
  {
    if (string.IsNullOrEmpty(securityToken)) throw new ArgumentNullException("securityToken");

    var now = DateTime.UtcNow;
    now = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0, 0);

    var masterKey = System.Configuration.ConfigurationManager.AppSettings["BlogWriterMasterKey"];
    if (string.IsNullOrEmpty(masterKey))
      throw new Exception("Master key not found");

    var token1 = buildToken(masterKey, now.AddMinutes(-1));
    var token2 = buildToken(masterKey, now);
    var token3 = buildToken(masterKey, now.AddMinutes(1));

    if (!securityToken.Equals(token1) && !securityToken.Equals(token2) && !securityToken.Equals(token3))
      throw new Exception("Invalid security token");
  }

  private string buildToken(string key, DateTime time)
  {
    var aux = key + time.ToString(CultureInfo.InvariantCulture);

    var enc = System.Text.Encoding.ASCII.GetEncoder();

    var data = new byte[aux.Length];
    enc.GetBytes(aux.ToCharArray(), 0, aux.Length, data, 0, true);

    var md5 = new MD5CryptoServiceProvider();
    var result = md5.ComputeHash(data);

    return BitConverter.ToString(result).Replace("-", "").ToLower();
  }

  private void writePost(string blogName, string postTitle, string postHtmlContent, string postAuthor, bool setPublicationDate)
  {
    if (string.IsNullOrEmpty(blogName)) throw new ArgumentNullException("blogName");
    if (string.IsNullOrEmpty(postTitle)) throw new ArgumentNullException("postTitle");
    if (string.IsNullOrEmpty(postHtmlContent)) throw new ArgumentNullException("postHtmlContent");
    if (string.IsNullOrEmpty(postAuthor)) throw new ArgumentNullException("postAuthor");

    try
    {
      var manager = new BlogManager();

      var blogs = manager.GetBlogs();
      var blog = (blogs.Cast<IBlog>()).SingleOrDefault(b => b.Name.Equals(blogName));
      
      if (blog == null)
        throw new Exception(string.Format("Blog '{0}' no encontrado", blogName));

      var postContent = manager.Content.CreateContent("text/html");

      postContent.ParentID = blog.ID;
      postContent.Content = postHtmlContent;
      postContent.SetMetaData("Author", postAuthor);
      postContent.SetMetaData("Title", postTitle);
      if (setPublicationDate)
        postContent.SetMetaData("Publication_Date", DateTime.Now);

      manager.Content.SaveContent(postContent);
    }
    catch (Exception e)
    {
      throw new Exception("Ocurrio un error creando el post", e);
    }
  }
}