using System;
using System.Configuration;
using System.IO;
using System.Net;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Validators {
public class ReCaptchaValidator : BaseValidator {
#region Fields
protected TextBox dummy = new TextBox();
#endregion Fields
#region Properties
///
/// Gets the Public Key generated by reCaptcha
///
private static string PublicKey {
get { return ConfigurationManager.AppSettings["publicKey"]; }
}
///
/// Gets the Private Key generated by reCaptcha
///
private static string PrivateKey {
get { return ConfigurationManager.AppSettings["privateKey"]; }
}
#endregion Properties
#region Private
///
/// Obtains the value of the passed key in the http form
///
///
///
private static string GetFormValue( string value ) {
return HttpContext.Current.Request.Form[value];
}
///
/// Gathers the parameters for reCaptchaValidator
///
///
private static string ReCaptchaParameters() {
string response = GetFormValue("recaptcha_response_field");
string challenge = GetFormValue("recaptcha_challenge_field");
string IP = HttpContext.Current.Request.UserHostName;
StringBuilder builder = new StringBuilder();
builder.AppendFormat( "privatekey={0}&", PrivateKey );
builder.AppendFormat( "remoteip={0}&", IP );
builder.AppendFormat( "challenge={0}&", challenge );
builder.AppendFormat( "response={0}", response );
return builder.ToString();
}
///
/// Validates the capcha inserted by the user
///
/// parameters to verify
/// response of the capcth
private static string ValidateCaptcha( string parameters ) {
try {
WebRequest request = WebRequest.Create( "http://api-verify.recaptcha.net/verify" );
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
StreamWriter writer = new StreamWriter( request.GetRequestStream() );
writer.Write( parameters );
writer.Close();
//Response
HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse();
StreamReader myReader = new StreamReader( webResponse.GetResponseStream() );
string response = myReader.ReadToEnd();
myReader.Close();
webResponse.Close();
return response;
}catch( WebException ) {
return string.Empty;
}
}
#endregion Private
#region Public
protected override bool EvaluateIsValid() {
string parameters = ReCaptchaParameters();
string result = ValidateCaptcha(parameters);
bool isValid = result.Equals("true\nsuccess");
if( !isValid ) {
ErrorMessage = "Your are not a human!";
Controls.Add( new LiteralControl(ErrorMessage));
}
return isValid;
}
#endregion Public
#region Control Events
protected override void OnInit(EventArgs e) {
dummy.ID = "aaa";
Controls.Add(dummy);
ControlToValidate = "aaa";
base.OnInit(e);
}
///
/// Writes the to show the validation Captcha
///
///
protected override void Render(HtmlTextWriter writer) {
writer.Write(
@"
", PublicKey );
dummy.Visible = false;
base.Render(writer);
}
#endregion Constructor
}
}