jueves, 21 de marzo de 2013

Plantillas Endpoint Proteccion

Enunciado

Estas configurando diversas políticas para la detección de malware en estaciones y servidores con System Center Configuration Manager2012 y End Point Protection.
Especialmente en controladores de dominio, servidores de correo, etc esto puede ser complejo.
¿Hay algo que pueda ayudarte?

Solución:

En http://configmgrblog.com/2012/07/09/out-of-the-box-endpoint-protection-2012-policy-templates/ descubrí que en cualquier ordenador donde tengas instalada la consola de administración puedes acceder a la carpeta:
%programfiles%\"Microsoft Configuration Manager\AdminConsole\XmlStorage\EPTemplates"
Donde encontraras una colección de plantillas para distintas situaciones.

lunes, 11 de marzo de 2013

Problemas con el lenguaje español en umbraco

Síntomas

En Umbraco 6.0 se producen errores por la ausencia de código Java cuando un usuario que tiene establecido el idioma en español edita propiedades del tipo texto enriquecido.
Los errores hacen referencia la ausencia de módulos de lenguaje como es.js o o es_dlg.js.
En Chrome impiden la edición de la propiedad completamente.

Estos módulos es deberían figurar en la carpeta lang de tinyMCE3 y de diversos pluggins (por ejemplo faltan en   Umbraco_Client\Tinymce3\Plugins\Umbracoimg\Langs y en Umbraco_Client\Tinymce3\Plugins\Umbracoembed\Langs

Solución

Haz una copia del modulo en.js, en es.js (o similar).
Editarlo cambiando las referencias de idioma.
Por ejemplo: tinyMCE.addI18n('en.umbracoembed',... por tinyMCE.addI18n('es.umbracoembed',....
También si tienes mucho interés y tiempo puedes cambiar los textos descriptivos.

Actualización:
Tambien puedes copiar las traducciones del tinymce para la versión que usas:
http://www.tinymce.com/i18n3x/index.php?ctrl=lang&act=download&pr_id=1

martes, 5 de marzo de 2013

Error corrector ortográfico de Umbraco

Sintomas

Si intentas utilizar el corrector ortográfico del editor de texto enriquecido de Umbraco (Versión 6) te salta un error.
[ArgumentOutOfRangeException: El índice y la longitud deben hacer referencia a una ubicación en la cadena.
( Index and length must refer to a location within the string)

Solución: 

La solución está esbozada en: http://our.umbraco.org/forum/ourumb-dev-forum/bugs/28540-4711-spell-check-in-RTE.
Lo único que añado en este post son las instrucciones "Using" que faltan en el código del controlador genérico.

Básicamente es:
1.- Modificar /config/tinyMceConfig.config con la línea:
<config key="spellchecker_rpc_url">GSpellChecker.ashx</config>

Y agregar un controlador genérico: /umbraco/GSpellChecker.ashx
using System;
using System.Web;
using umbraco.presentation.umbraco_client.tinymce3.plugins.spellchecker;
using System.Xml;
using System.IO;
using System.Web.Script.Serialization;
using System.Net;
using System.Text;
public class GSpellChecker : SpellChecker, IHttpHandler {
  // Methods
  public override SpellCheckerResult CheckWords(string language, string[] words) {
    XmlDocument document = new XmlDocument();
    string data = string.Join(" ", words);
    string xml = SendRequest(language, data);
    document.LoadXml(xml);
    data = HttpContext.Current.Server.UrlEncode(data);
    SpellCheckerResult result = new SpellCheckerResult();
    foreach (XmlNode node in document.SelectNodes("//c")) {
      XmlElement element = (XmlElement)node;
      result.result.Add(data.Substring(Convert.ToInt32(element.GetAttribute("o")), Convert.ToInt32(element.GetAttribute("l"))));
    }
    return result;
  }

  public override SpellCheckerResult GetSuggestions(string language, string word) {
    XmlDocument document = new XmlDocument();
    string xml = SendRequest(language, word);
    document.LoadXml(xml);
    SpellCheckerResult result = new SpellCheckerResult();
    foreach (XmlNode node in document.SelectNodes("//c")) {
      XmlElement element = (XmlElement)node;
      foreach (string str2 in element.InnerText.Split(new char[] { '\t' })) {
        if (!string.IsNullOrEmpty(str2)) {
          result.result.Add(str2);
        }
      }
    }
    return result;
  }

  public void ProcessRequest(HttpContext context) {
    SpellCheckerInput input = SpellCheckerInput.Parse(new StreamReader(context.Request.InputStream));
    SpellCheckerResult suggestions = null;
    string method = input.Method;
    if (method != null) {
      if (!(method == "checkWords")) {
        if (method == "getSuggestions") {
          suggestions = this.GetSuggestions(input.Language, input.Words[0]);
          goto Label_007C;
        }
      } else {
        suggestions = this.CheckWords(input.Language, input.Words.ToArray());
        goto Label_007C;
      }
    }
    suggestions = new SpellCheckerResult();
  Label_007C:
    suggestions.id = input.Id;
    string s = new JavaScriptSerializer().Serialize(suggestions);
    context.Response.Write(s);
  }

  private static string SendRequest(string lang, string data) {
    string str;
    string requestUriString = string.Format("https://www.google.com:443/tbproxy/spell?lang={0}&hl={0}", lang);
    string s = string.Format("<?xml version=\"1.0\" encoding=\"utf-8\" ?><spellrequest textalreadyclipped=\"0\" ignoredups=\"0\" ignoredigits=\"1\" ignoreallcaps=\"1\"><text>{0}</text></spellrequest>", HttpContext.Current.Server.UrlEncode(data));
    StreamReader reader = null;
    HttpWebResponse response = null;
    Stream requestStream = null;
    try {
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUriString);
      request.KeepAlive = false;
      request.Method = "POST";
      request.ContentType = "application/PTI26";
      request.ContentLength = s.Length;
      WebHeaderCollection headers = request.Headers;
      headers.Add("MIME-Version: 1.0");
      headers.Add("Request-number: 1");
      headers.Add("Document-type: Request");
      headers.Add("Interface-Version: Test 1.4");
      requestStream = request.GetRequestStream();
      byte[] bytes = new ASCIIEncoding().GetBytes(s);
      requestStream.Write(bytes, 0, bytes.Length);
      response = (HttpWebResponse)request.GetResponse();
      reader = new StreamReader(response.GetResponseStream());
      str = reader.ReadToEnd();
    } finally {
      if (requestStream != null) {
        requestStream.Close();
      }
      if (reader != null) {
        reader.Close();
      }
      if (response != null) {
        response.Close();
      }
    }
    return str;
  }

  // Properties
  public bool IsReusable {
    get {
      return false;
    }
  }
}