diff --git a/js/index.js b/js/index.js index fd065b8..40b8a96 100644 --- a/js/index.js +++ b/js/index.js @@ -1,18 +1,72 @@ (function () { $(document).ready(function () { - $("#formulario").submit(function (evt) { - evt.preventDefault(); - var data = { - hash: $("#txtHash").val().trim(), - algoritmo: $("#slcAlgoritmos").val().trim(), - }; - $.ajax({ - url: "src/cracker.php", - type: "post", - data: {} - }).done(function (respuesta) { - console.log(respuesta); - }); + + var validator = ValidatorJS.createValidator({ + form: $("#formulario"), + triggers: [ValidatorJS.VALIDATE_ON_FORM_SUBMIT, ValidatorJS.VALIDATE_ON_FIELD_BLUR], + validField: function (args) { + var $campo = args.field; + var idCampo = $campo.get(0).id; + $campo.closest(".form-group").removeClass("has-error"); + $campo.attr('data-original-title', ""); + }, + invalidField: function (args) { + var $campo = args.field; + $campo.closest(".form-group").addClass("has-error"); + $campo.tooltip( + { + title: "", + trigger: "focus", + html: true + }); + $campo.data("mensajesTooltip", args.messages); + var textoTooltip = ""; + for (var i = 0; i < $campo.data("mensajesTooltip").length; i++) { + textoTooltip += $campo.data("mensajesTooltip")[i].texto + "
"; + } + $campo.attr('data-original-title', textoTooltip); + }, + invalidForm: function (args) { + }, + validForm: function (args) { + args.event.preventDefault(); + var data = { + hash: $("#txtHash").val().trim(), + algoritmo: $("#slcAlgoritmos").val().trim(), + }; + $.ajax({ + url: getURL() + "src/cracker.php", + type: "post", + data: data + }).done(function (respuesta) { + console.log(respuesta); + }); + }, + validValidation: function (args) { + var $campo = args.field; + var idCampo = args.field.attr("id"); + var idTipoValidacion = args.validation.validationType; + var mensajesTooltip = $campo.data("mensajesTooltip"); + if (mensajesTooltip === undefined) { + mensajesTooltip = []; + } + for (var i = 0; i < mensajesTooltip.length; i++) { + if (mensajesTooltip[i].idTipoValidacion === idTipoValidacion) { + mensajesTooltip.splice(i, 1); + break; + } + } + $campo.data("mensajesTooltip", mensajesTooltip); + } + }); + validator.addValidation($("#txtHash"), ValidatorJS.VALIDATION_TYPE_LENGTH, {max: 512, message: {idTipoValidacion: ValidatorJS.VALIDATION_TYPE_LENGTH, texto: "El hash no puede tener más de 512 caracteres."}}); + validator.addValidation($("#txtHash"), ValidatorJS.VALIDATION_TYPE_REQUIRED, {message: {idTipoValidacion: ValidatorJS.VALIDATION_TYPE_REQUIRED, texto: "El hash no puede estar vacío."}}); + validator.addValidation($("#slcAlgoritmos"), ValidatorJS.VALIDATION_TYPE_REQUIRED, {message: {idTipoValidacion: ValidatorJS.VALIDATION_TYPE_REQUIRED, texto: "El algoritmo no puede estar sin seleccionar."}}); }); + + function getURL(){ + return location.origin + "/labsis_hash_cracker_web/"; + } + })(); \ No newline at end of file diff --git a/js/lib/validator-1.1.3.js b/js/lib/validator-1.1.3.js new file mode 100644 index 0000000..cc01ffa --- /dev/null +++ b/js/lib/validator-1.1.3.js @@ -0,0 +1,1000 @@ +/*! + * ValidatorJS JavaScript Library v1.1.3 + * Project site: https://github.com/dsbarrionuevo/ValidationJS + * + * Dependencies: + * jQuery version 1.11.0 or newer: https://jquery.com/ + * + * Date: 15/06/2016 + */ +var ValidatorJS = (function () { + //check available dependencies + if ("undefined" == typeof jQuery) { + throw new Error("ValidatorJS's JavaScript requires jQuery"); + } + + var myself = {}; + + // Valida se hace submit en el formulario indicado como trigger (form) + Validator.prototype.VALIDATE_ON_FORM_SUBMIT = 0; + // Valida cuando se hace click en el boton indicado como trigger (button) + Validator.prototype.VALIDATE_ON_BUTTON_CLICK = 1; + // Valida al hacer blur del campo: evento blur + Validator.prototype.VALIDATE_ON_FIELD_BLUR = 2; + // Valida al cambiar el texto del campo: evento change + Validator.prototype.VALIDATE_ON_FIELD_CHANGE = 3; + // Valida cuando se ejecuta el evento indicado + Validator.prototype.VALIDATE_ON_CUSTOM_EVENT = 4; + + // Clase asociada a un formulario + function Validator(args) { + var instance = this; + //Trigger puede ser un form sobre el cual se ejecuta el submit, o un button que dispare la validacion + this.trigger = args.form || args.button || undefined; + this.message = args.message; + //Es un array de disparadores de validaciones: submit, blur, keyup, etc. + this.validationTriggers = args.triggers || []; + //estos dos eventos son solo para la validacion de todo el formulario, en el futuro + //podriamos agregarlas a las validaciones de los campos individaules tambien + this.before = args.before; + this.after = args.after; + //podrias crear una function onError que capturaria todas las excepciones... + // Array asociativo: como clave utiliza el id del campo y como valor un array numerico de tipos de validaciones. + this.validationTriggersForFields = {}; + // Array asociativo: utiliza como clave el id del campo pasado y como valor un array numerico de validaciones + // Este array mantiene las validaciones que se deberán realizar por cada campo. + this.validations = {}; + + this.addValidationForField = function (targetField, validationObject) { + //para no tener que obligar de ponerle un id a todos los campos de un formulario + //podria usar como target el mismo jquery object y despuas hacer un mecanismo de equals + //para poder obtener un campo especifico + var target = targetField.get(0).id; + var countFields = 0; + var foundField = false; + for (var field in instance.validations) { + //aqui deberia ir el mecanismo de equals + if (field === target) { + foundField = true; + //verifico que no tenga ese tipo de validacion ya cargado... + var validationTypeAlreadyExists = false; + for (var i = 0; i < instance.validations[target].length; i++) { + if (instance.validations[target][i].validationType === validationObject.validationType) { + validationTypeAlreadyExists = true; + } + } + if (!validationTypeAlreadyExists) { + instance.validations[target].push(validationObject); + //console.log("Agrego validacion de tipo "+validationObject.validationType+" para "+target); + } + } + countFields++; + } + if (countFields === 0 || !foundField) { + //console.log("Agrego validacion de tipo "+validationObject.validationType+" para "+target); + //creo el array con la primera validacion para ese campo + instance.validations[target] = [validationObject]; + } + }; + this.getValidation = function (targetField, validationType) { + var target = targetField.get(0).id; + for (var field in instance.validations) { + if (field === target) { + for (var i = 0; i < instance.validations[target].length; i++) { + if (instance.validations[target][i].validationType === validationType) { + return instance.validations[target][i]; + } + } + } + } + return null; + }; + this.hasValidation = function (targetField, validationType) { + return (instance.getValidation(targetField, validationType) !== null); + }; + this.removeValidationForField = function (targetField, validationType) { + var target = targetField.get(0).id; + for (var field in instance.validations) { + if (field === target) { + for (var i = 0; i < instance.validations[target].length; i++) { + if (instance.validations[target][i].validationType === validationType) { + //borro todas las validaciones de ese tipo, no solo la primera + instance.validations[target].splice(i, 1); + //console.log("Borro validacion tipo "+tipoValidacion+" para "+idCampo); + } + } + } + } + }; + this.addValidation = function (validationObject) { + //cargo primero las validaciones en el array del validador + for (var i = 0; i < validationObject.validations.length; i++) { + instance.addValidationForField(validationObject.field, new Validation({ + field: validationObject.field, + validationType: validationObject.validations[i].validationType, + parameters: validationObject.validations[i].parameters, + validator: instance, + message: validationObject.validations[i].message + })); + } + //funciones general que uso dentro de los eventos siguientes... + var validationFunction = function (evt, targetField) { + var validField = true; + var validationsForField = instance.validations[targetField]; + var messages = []; + for (var i = 0; i < validationsForField.length; i++) { + var validationForField = validationsForField[i]; + var validValidation = validationForField.validate(); + instance.callValidationFunctions({ + event: evt, + validation: validationForField, + field: validationForField.field, + message: validationForField.message + }, validValidation); + if (!validValidation) { + validField = false; + } + if (validationForField.message !== undefined && validValidation === false) { + messages.push(validationForField.message); + } + } + instance.callFieldFunctions({ + event: evt, + field: validationForField.field, + //validations: validationsForField//se lo podria enviar... + messages: messages + }, validField); + }; + for (var i = 0; i < instance.validationTriggers.length; i++) { + var validationType = instance.validationTriggers[i]; + var triggerAlreadySet = false; + for (var fieldIdForValidationTriggers in instance.validationTriggersForFields) { + if (fieldIdForValidationTriggers === validationObject.field.get(0).id) { + for (var k = 0; k < instance.validationTriggersForFields[fieldIdForValidationTriggers].length; k++) { + if (instance.validationTriggersForFields[fieldIdForValidationTriggers][k] === validationType) { + triggerAlreadySet = true; + } + } + } + } + if (triggerAlreadySet === false) { + switch (validationType) { + case(Validator.prototype.VALIDATOR_SUBMIT): + //la validacion se realiza al hacer submit del formulario entero + break; + //la ultima validacion individual enmascara los resultados de las validaciones anteriores + case(Validator.prototype.VALIDATE_ON_FIELD_BLUR): + for (var field in instance.validations) { + if (field === validationObject.field.get(0).id) { + var fieldType = getType(validationObject.field); + if (fieldType === "div") { + //el evento onblur no se dispara en los divs... por eso busco sus inputs hijos + //esto se usaria por ejempo si quiero validar un grupo de checkboxs + validationObject.field.find("input").blur(function (evt) { + validationFunction(evt, validationObject.field.get(0).id); + }); + } else { + //se asigna un onblur por cada validacion agregada + //a un campo, en realidad deberia agregar una + //sola vez onblur y no por cada validacion + validationObject.field.blur(function (evt) { + validationFunction(evt, validationObject.field.get(0).id); + }); + } + } + } + break; + case(Validator.prototype.VALIDATE_ON_FIELD_CHANGE): + for (field in instance.validations) { + if (field === validationObject.field.get(0).id) { + var fieldType = getType(validationObject.field); + /*if (checkAttributeMatches(fieldType, ["text", "password", "number", "email"])) { + validationObject.field.keyup(function (evt) { + validationFunction(evt, validationObject.field.get(0).id); + }); + } else {*/ + validationObject.field.change(function (evt) { + validationFunction(evt, validationObject.field.get(0).id); + }); + /*}*/ + } + } + break; + } + if (instance.validationTriggersForFields[validationObject.field.get(0).id] === undefined) { + instance.validationTriggersForFields[validationObject.field.get(0).id] = [validationType]; + } else { + instance.validationTriggersForFields[validationObject.field.get(0).id].push(validationType); + } + } + } + }; + + this.addValidationTrigger = function (validationType) { + for (var i = 0; i < instance.validationTriggers.length; i++) { + if (validationType === instance.validationTriggers[i]) { + return false; + } + } + instance.validationTriggers.push(validationType); + addEventListenerForTrigger(validationType); + return true; + }; + + //resultado de las validaciones individuales + this.validValidation = args.validValidation; + this.invalidValidation = args.invalidValidation; + //resutado de las validaciones conjuntas en un campo + this.validField = args.validField; + this.invalidField = args.invalidField; + //resultado de todas las validaciones de todos los campos en el formulario + this.validForm = args.validForm; + this.invalidForm = args.invalidForm; + //el segundo parametro es el tipo de validacion que disparo las validaciones, + //este puede ser: form, button, o custom (custom si no viene... o fue llamado aparte del modulo) + this.validate = function (evt, validationEvent) { + var validForm = true; + if (instance.before !== undefined) { + //le paso solo los campos, no sus validaciones + var fields = [];//only ids + for (var fieldId in instance.validations) { + fields.push(fieldId); + } + instance.before({ + event: evt, + fields: fields, + trigger: validationEvent//puede ser undefined + }); + } + for (var field in instance.validations) { + //la propiedad campo es el id del campo en si + var validationsForField = instance.validations[field]; + if (validationsForField.length === 0) { + continue; + } + var validField = true; + var messagesForField = []; + var targetField = null; + for (var i = 0; i < validationsForField.length; i++) { + var validationForField = validationsForField[i]; + targetField = validationForField.field; + var validValidation = validationForField.validate(); + instance.callValidationFunctions({ + event: evt, + validation: validationForField, + field: validationForField.field, + message: validationForField.message + }, validValidation); + if (!validValidation) { + //si al menos una validacion de este campo es invalida, todo el campo es invalido + validField = false; + if (validationForField.message !== undefined && validValidation === false) { + messagesForField.push(validationForField.message); + } + } + } + instance.callFieldFunctions({ + event: evt, + field: targetField, //deberia ser distinto de null... + //validations: validationsForField//se lo podria enviar... + messages: messagesForField + }, validField); + if (!validField) { + //si al menos una validacion de un campo es invalida, todo el formulario es invalido + validForm = false; + } + } + var objectForCallFormFunctions = { + event: evt, + validator: instance, + trigger: validationEvent//puede ser undefined + }; + if (validationEvent === Validator.prototype.VALIDATE_ON_FORM_SUBMIT) { + objectForCallFormFunctions.form = instance.trigger; + } else if (validationEvent === Validator.prototype.VALIDATE_ON_BUTTON_CLICK) { + objectForCallFormFunctions.button = instance.trigger; + } else { + //si es custom o si es undefined entra por aqui + } + instance.callFormFunctions(objectForCallFormFunctions, validForm); + if (instance.after !== undefined) { + instance.after({ + event: evt, + valid: validForm, + trigger: validationEvent//puede ser undefined + }); + } + return validForm; + }; + //llamar funciones predefinias de validacion + this.callValidationFunctions = function (parameters, result) { + if (!result) { + if (instance.invalidValidation !== undefined) { + instance.invalidValidation(parameters); + } + } else { + if (instance.validValidation !== undefined) { + //delete parameters.message; + instance.validValidation(parameters); + } + } + }; + this.callFieldFunctions = function (parameters, result) { + if (!result) { + if (instance.invalidField !== undefined) { + instance.invalidField(parameters); + } + } else { + if (instance.validField !== undefined) { + //delete parameters.messages; + instance.validField(parameters); + } + } + }; + this.callFormFunctions = function (parameters, result) { + if (!result) { + //si el formulario es invalido, DEBO impdir que se envíe... en todos los casos + if (parameters.event !== undefined && parameters.event.type.toLowerCase() === "submit") { + parameters.event.preventDefault(); + } + if (instance.invalidForm !== undefined) { + instance.invalidForm(parameters); + } + } else { + if (instance.validForm !== undefined) { + delete parameters.message; + instance.validForm(parameters); + } + } + }; + + //Cuando llamar validate? + function addEventListenerForTrigger(validationEvent) { + if (validationEvent === Validator.prototype.VALIDATE_ON_FORM_SUBMIT) { + if (instance.trigger !== undefined && instance.trigger[0].tagName.toLowerCase() === "form") { + instance.trigger.submit(function (evt) { + instance.validate(evt, validationEvent); + }); + } else { + throw "No validation event callback found correct for VALIDATE_ON_FORM_SUBMIT validation type"; + } + } else if (validationEvent === Validator.prototype.VALIDATE_ON_BUTTON_CLICK) { + //debe ser un button o input type submit, button necesariamente + if (instance.trigger !== undefined && checkAttributeMatches(instance.trigger[0].tagName.toLowerCase(), ["button", "input"])) { + var correctButtonGiven = true; + if (instance.trigger[0].tagName.toLowerCase() === "input" && !checkAttributeMatches(getType(instance.trigger).toLowerCase(), ["button", "submit"])) { + correctButtonGiven = false; + } + if (correctButtonGiven) { + instance.trigger.click(function (evt) { + instance.validate(evt, validationEvent); + }); + } + } else { + throw "No validation event callback found correct for VALIDATE_ON_BUTTON_CLICK validation type"; + } + } else if (validationEvent === Validator.prototype.VALIDATE_ON_CUSTOM_EVENT) { + if (args.validationCustomEvent !== undefined && (typeof (args.validationCustomEvent)).toLowerCase() === "function") { + args.validationCustomEvent(instance.validate); + } else { + throw "No validation event callback found correct for VALIDATE_ON_CUSTOM_EVENT validation type"; + } + } else { + throw "No validation event trigger found. Given: " + validationEvent; + } + } + + //agregando valores por defecto en caso de no haber seteado los necesarios para funcionar + var globalTriggersFound = false; + for (var i = 0; i < instance.validationTriggers.length; i++) { + if (instance.validationTriggers[i] === Validator.prototype.VALIDATE_ON_FORM_SUBMIT || instance.validationTriggers[i] === Validator.prototype.VALIDATE_ON_BUTTON_CLICK || instance.validationTriggers[i] === Validator.prototype.VALIDATE_ON_CUSTOM_EVENT) { + globalTriggersFound = true; + //agrego loas validaciones de tipo trigger + addEventListenerForTrigger(instance.validationTriggers[i]); + } + } + if (!globalTriggersFound) { + //entonces trato de usar agregar un trigger por submit del trigger (form), comportamiento por defecto + try { + //si salta expecion entonces intento en el catch buscar un boton y agregar el callback de button por defecto + addEventListenerForTrigger(Validator.prototype.VALIDATE_ON_FORM_SUBMIT); + } catch (error) { + //ahora si esto lanza error es que de vedad no puede funcionar el validador, hizo el mejor intento, + //a no ser que se haya especificado una validacion custm + try { + addEventListenerForTrigger(Validator.prototype.VALIDATE_ON_BUTTON_CLICK); + } catch (error) { + var customValidatorFound = false; + for (var i = 0; i < instance.validationTriggers.length; i++) { + if (instance.validationTriggers[i] === Validator.prototype.VALIDATE_ON_CUSTOM_EVENT) { + customValidatorFound = true; + } + } + if (customValidatorFound === false) { + throw "No validation trigger found"; + } else { + if (args.validationCustomEvent !== undefined && (typeof (args.validationCustomEvent)).toLowerCase() === "function") { + args.validationCustomEvent(instance.validate); + } else { + throw "No validation trigger found"; + } + } + } + } + } + } + + Validation.prototype.VALIDATION_TYPE_REQUIRED = 0; + Validation.prototype.VALIDATION_TYPE_LENGTH = 1;//sirve para cualquier tipo de valor + Validation.prototype.VALIDATION_TYPE_NUMBER = 2; + Validation.prototype.VALIDATION_TYPE_INT = 3; + Validation.prototype.VALIDATION_TYPE_DECIMAL = 4; + Validation.prototype.VALIDATION_TYPE_VALUE = 5;//sirve solo para valores numericos + Validation.prototype.VALIDATION_TYPE_EMAIL = 6; + Validation.prototype.VALIDATION_TYPE_GROUP = 7; + Validation.prototype.VALIDATION_TYPE_RADIO_GROUP = 8; + Validation.prototype.VALIDATION_TYPE_CHECKBOX_GROUP = 9; + Validation.prototype.VALIDATION_TYPE_CUSTOM = 10; + Validation.prototype.VALIDATION_TYPE_COMPARE = 11; + Validation.prototype.VALIDATION_TYPE_DATE = 12; + // + Validation.prototype.customValidations = []; + /* + + */ + /** + * Agrega la validación a la lista de validaciones personalizadas, retorna + * 'true' si ha podido agregar la validación (sólo cuando en la lista de + * validaciones personalizadas no existe ya una validación con el mismo id), + * 'false' en caso contratio. + * @param {type} customValidation Objecto que representa la validación + * personalizada de la siguiente forma: + * customValidacion: { + * id: "myId", + * method: function(field, parameters){ return boolean; } + * } + * @returns {Boolean} 'True' si se pudo agregar la validación personalizada, + * 'false' en caso contratio. + */ + Validation.prototype.addCustomValidation = function (customValidation) { + if (Validation.prototype.getCustomValidation(customValidation.id) === null) { + Validation.prototype.customValidations.push({ + id: customValidation.id, + method: customValidation.method + }); + return true; + } + return false; + }; + Validation.prototype.getCustomValidation = function (id) { + for (var i = 0; i < Validation.prototype.customValidations.length; i++) { + var customValidation = Validation.prototype.customValidations[i]; + if (id === customValidation.id) { + return customValidation; + } + } + return null; + }; + Validation.prototype.removeCustomValidation = function (id) { + //podria usar if(getCustomValidation(validationId) !== null){} pero no tendria el indice... + for (var i = 0; i < Validation.prototype.customValidations.length; i++) { + var customValidation = Validation.prototype.customValidations[i]; + if (id === customValidation.id) { + Validation.prototype.customValidations.slice(i, 1); + return true; + } + } + return false; + }; + //asociado a un unico campo + function Validation(args) { + var instance = this; + this.field = args.field; + if (instance.field !== null && instance.field !== undefined) { + //this.fieldType podría ser: text, password, radio, checkbox, reset, + //button, submit (y los de html5...), también textarea, select. + this.fieldType = getType(instance.field); + } else { + this.fieldType = undefined; + } + this.validationType = args.validationType; + this.parameters = args.parameters; + //cargo la validacion personalizada si no la tengo + if (instance.validationType === Validation.prototype.VALIDATION_TYPE_CUSTOM) { + if (instance.parameters.id !== undefined && instance.parameters.method !== undefined) { + Validation.prototype.addCustomValidation({ + id: instance.parameters.id, + method: instance.parameters.method + }); + } + } + this.validator = args.validator; + //es el mensaje de error + this.message = args.message; + this.applyValidation = function () { + //deberia verificar que posea el atributo value + var value; + if (instance.parameters !== undefined && instance.parameters.trim !== undefined && instance.parameters.trim === false) { + value = instance.field.val(); + } else { + //hago trim por defecto + if (instance.field.val() !== null) { + value = instance.field.val().trim(); + } else { + value = instance.field.val(); + } + } + switch (instance.validationType) { + case(Validation.prototype.VALIDATION_TYPE_REQUIRED): + if (checkAttributeMatches(instance.fieldType, ["text", "password", "number", "email", "textarea"])) { + return value.length > 0; + } else if (instance.fieldType === "select") { + //en caso de que el select posea cadenas por ejemplo, y + //queremos setear la cadena "vacio" como opcion vacía, + //debemos setearle como que lo represente el sigueinte + //invalidRequiredValue, el mismo será tratado como cadena. + if (instance.parameters !== undefined && instance.parameters.invalidRequiredValue !== undefined) { + return !(value === instance.parameters.invalidRequiredValue); + } + //para un uso más genérico permito que agrega una función + //que recibe como parámetro el valor seleccionado en + //el select y retorna true si es válido y false en caso contrario + if (instance.parameters !== undefined && instance.parameters.checkRequiredMethod !== undefined) { + return instance.parameters.checkRequiredMethod(value); + } + // Valor igual a -1 no es válido para un select requerido + if (isNaN(value)) { + return true; + } + //como fallback compara con un int y el mismo debe ser + //distinto a -1 para ser válido + return parseInt(value) !== -1; + } else { + //para requerir radio o checkboxes deberia pasar un tipoCampo explicito + //---> Aca deberia hacer algo en serio util, es decir, comprobar que al menos un radio o un check + //estan seleccionados, pero esa comprobacion la hago en el mismo validation_type_check o radio + //por eso aqui solo devuelvo true... + return true; + } + break; + case(Validation.prototype.VALIDATION_TYPE_NUMBER): + //si el campo esta vacio regresa valido = true, porque no hay numero o texto cargado... + return !isNaN(value); + break; + case(Validation.prototype.VALIDATION_TYPE_INT): + var length = instance.field.val().trim().length; + if (length === 0) + return true; + if (isNaN(value)) { + return false; + } + var isInt = /^-?\d+?$/.test(value); + if (isInt) { + var int = parseInt(value); + if (isNaN(int)) { + //no pudo parsear correctamente + return false; + } + if (instance.parameters === undefined) { + //porque si no tiene los parametros min y max sólo quiere + //validar que sea un numero entero + return true; + } + //min y max podrian eliminarse de esta validacion y solucionarlo usando dos validaciones: type_int y type_value + var min = instance.parameters.min; + var max = instance.parameters.max; + if (min !== undefined) { + if (int < min) { + return false; + } + } + if (max !== undefined) { + if (int > max) { + return false; + } + } + return true; + } + return false; + case(Validation.prototype.VALIDATION_TYPE_DECIMAL): + var length = value.length; + if (length > 0) { + var separator = "."; + var decimales = 2; + if (instance.parameters !== undefined && instance.parameters.separator !== undefined) { + separator = instance.parameters.separator; + } + if (separator === ".") { + separator = "\\."; + } + if (instance.parameters !== undefined && instance.parameters.decimales !== undefined) { + decimales = parseInt(instance.parameters.decimales); + } + if (decimales < 1) { + decimales = 1; + } + var ok = new RegExp("^\\d+(?:" + separator + "\\d{1," + decimales + "})?$").test(value); + if (ok) { + var min = Number.MIN_VALUE; + var max = Number.MAX_VALUE; + if (instance.parameters !== undefined && instance.parameters.max !== undefined) { + max = parseFloat(instance.parameters.max); + } + if (instance.parameters !== undefined && instance.parameters.min !== undefined) { + min = parseFloat(instance.parameters.min); + } + var valueFloat = parseFloat(value); + return min <= valueFloat && valueFloat <= max; + } else { + return false; + } + } + return true; + case(Validation.prototype.VALIDATION_TYPE_LENGTH): + //si solo seteo una longitud maxima y no una minima, el campo + //puede ser vacio y esto lo toma como valido... + //a no ser que tambien le agregue que sea campo requerido, eso + //es lo correcto + var valueLength = value.length; + if (instance.parameters === undefined) { + //necesariamente debe tener seteado un max o min + return false; + } + var min = instance.parameters.min; + var max = instance.parameters.max; + if (min === undefined && max === undefined) { + return false; + } + if (min !== undefined) { + if (valueLength < min) { + return false; + } + } + if (max !== undefined) { + if (valueLength > max) { + return false; + } + } + return true; + break; + case(Validation.prototype.VALIDATION_TYPE_VALUE): + var length = instance.field.val().trim().length; + if (length === 0) + return true; + if (isNaN(value)) { + return false; + } + if (instance.parameters === undefined) { + return false; + } + //no funcionaria con un decimal, revisar + var numberValue = parseFloat(value); + if (isNaN(numberValue)) { + //no pudo parsear correctamente + return false; + } + var min = instance.parameters.min; + var max = instance.parameters.max; + if (min === undefined && max === undefined) { + return false; + } + if (min !== undefined) { + if (numberValue < min) { + return false; + } + } + if (max !== undefined) { + if (numberValue > max) { + return false; + } + } + return true; + break; + case(Validation.prototype.VALIDATION_TYPE_EMAIL): + if (value.length > 0) { + if (instance.parameters === undefined || (instance.parameters !== undefined && instance.parameters.format === undefined)) { + return /^[a-zA-Z0-9\._%\+-]+@[a-zA-Z_0-9.-]+\.[a-zA-Z]{2,}$/.test(value); + } else { + var format = instance.parameters.format; + if (format === undefined) + { + return false; + } + return format.test(value); + } + } + return true; + break; + case(Validation.prototype.VALIDATION_TYPE_RADIO_GROUP): + //revisar + var selected = false; + if (instance.parameters !== undefined && instance.parameters.group !== undefined) { + var groupName = instance.parameters.group; + //deberia pasar como parametro desde que formulario o div + //dentro del formulario buscar, para evitar complicaciones + //en caso de que haya dos grupos de radios con los mismos names + $("input[type='radio'][name='" + groupName + "']").each(function () { + if ($(this).is(":checked")) { + selected = true; + } + }); + } else { + instance.field.find("input[type='radio']").each(function () { + if ($(this).is(":checked")) { + selected = true; + } + }); + } + if (instance.validator.hasValidation(instance.field, Validation.prototype.VALIDATION_TYPE_REQUIRED)) { + return selected; + } + return true; + break; + case(Validation.prototype.VALIDATION_TYPE_GROUP): + //sirve para checkboxes o radios + if (instance.parameters === undefined) { + return false; + } + if (instance.parameters.group === undefined) { + return false; + } + if (instance.parameters.type === undefined) { + return false; + } + var groupType = instance.parameters.type; + var groupName = instance.parameters.group; + var countSelecteds = 0; + //tambien hace falta pasar como parametro de donde buscar + $("input[type='" + groupType + "'][name='" + groupName + "']").each(function () { + if ($(this).is(":checked")) { + countSelecteds++; + } + }); + var min = instance.parameters.min; + var max = instance.parameters.max; + if (min === undefined && max === undefined) { + //como minimo valida que este al menos uno seleccionado + return countSelecteds >= 1; + } + if (min !== undefined) { + if (countSelecteds < min) { + return false; + } + } + if (max !== undefined) { + if (countSelecteds > max) { + return false; + } + } + return true; + break; + case(Validation.prototype.VALIDATION_TYPE_CHECKBOX_GROUP): + var countSelecteds = 0; + if (instance.parameters !== undefined && instance.parameters.group !== undefined) { + var groupName = instance.parameters.group; + $("input[type='checkbox'][name='" + groupName + "']").each(function () { + if ($(this).is(":checked")) { + countSelecteds++; + } + }); + } else { + instance.field.find("input[type='checkbox']").each(function () { + if ($(this).is(":checked")) { + countSelecteds++; + } + }); + } + //solo si es requerido, el comportamiento por defeto es ahora + //no validar a no ser que sea campo requerido + if (instance.validator.hasValidation(instance.field, Validation.prototype.VALIDATION_TYPE_REQUIRED)) { + if (instance.parameters === undefined) { + return countSelecteds >= 1; + } + var min = instance.parameters.min; + var max = instance.parameters.max; + if (min === undefined && max === undefined) { + return countSelecteds >= 1; + } + if (min !== undefined) { + if (countSelecteds < min) { + return false; + } + } + if (max !== undefined) { + if (countSelecteds > max) { + return false; + } + } + } + return true; + break; + case(Validation.prototype.VALIDATION_TYPE_CUSTOM): + if (instance.parameters === undefined) { + return false; + } + var id = instance.parameters.id; + if (id === undefined) { + return false; + } + var customValidation = Validation.prototype.getCustomValidation(id); + if (customValidation === undefined || customValidation === null) { + return false; + } + var parameters = instance.parameters.parameters; + if (parameters !== undefined) { + return customValidation.method(instance.field, parameters); + } + return customValidation.method(instance.field); + case(Validation.prototype.VALIDATION_TYPE_COMPARE): + //implementacion futuras + //usos posibles: igualdad de strings, check del tipo de dato, mayor menor igual en campos y checkboxs seleccionados, etc... + return false; + break; + case(Validation.prototype.VALIDATION_TYPE_DATE): + if (instance.parameters === undefined) { + return false; + } + var format = instance.parameters.format; + if (format === undefined) { + return false; + } + if (value === "") { + return true; + } + switch (format) { + case 'dd/mm': + return /^(0?[1-9]|[12][0-9]|3[01])[\/](0?[1-9]|1[012])$/.test(value); + case 'mm/aaaa': + return /^(0?[1-9]|1[012])[\/]\d{4}$/.test(value); + case 'aaaa': + return /^\d{4}$/.test(value); + default: + return false; + } + break; + default: + return false; + break; + } + }; + this.validate = function () { + return instance.applyValidation(); + }; + } + //Funciones utiles + function getType($element) { + if ($element.get(0).tagName.toLowerCase() === "input") { + return $element.get(0).type.toLowerCase(); + } else { + //para selects o textarea, por ejemplo + return $element.get(0).tagName.toLowerCase(); + } + } + //comprueba que coincide con al menos uno de los valores pedidos + function checkAttributeMatches(attributeName, values) { + for (var i = 0; i < values.length; i++) { + if (attributeName === values[i]) { + return true; + } + } + return false; + } + + /////////////////////funciones del modulo + + myself.validators = []; + + function ValidatorInstance(id, validator) { + var instance = this; + this.id = id; + this.validator = validator; + this.addValidation = function (field, validationType, optionalParameters) { + var message = undefined; + var parameters = undefined; + if (optionalParameters !== undefined) { + if (optionalParameters.message !== undefined) { + message = optionalParameters.message; + } + //el parametro 'required' agrega automáticamente la validación + //de tipo campo requerido, sin embargo no establece un mensaje + //de específico. + if (optionalParameters.required !== undefined && optionalParameters.required === true) { + instance.validator.addValidation({ + field: field, + validations: [ + { + validationType: Validation.prototype.VALIDATION_TYPE_REQUIRED + } + ] + }); + } + var hasValidationParameters = false; + for (var optionalParameter in optionalParameters) { + //estos par�metros ya estar�a contemplados... + if (optionalParameter !== "message" && optionalParameter !== "required") { + if (hasValidationParameters === false) { + parameters = {}; + } + parameters[optionalParameter] = optionalParameters[optionalParameter]; + hasValidationParameters = true; + } + } + } + //en caso de que el objecto jQuery field sea un selector por clase, + //aquí sería el lugar donde recorrería y agregaria la validación para + //cada uno de ellos. + instance.validator.addValidation({ + field: field, + validations: [ + { + validationType: validationType, + parameters: parameters, + message: message + } + ] + }); + }; + this.removeValidation = function (field, validationType) { + instance.validator.removeValidationForField(field, validationType); + }; + } + + ///////////////////// Funciones públicas + + /* + Crea un validador a partir de un objeto jQuery formulario (tagName=FORM) + o un botón (tagName=BUTTON), una constante que indica cuándo se debe + ejecutar las validaciones y parámetros opcionales. + */ + myself.createValidator = function (parameters) { + //aqui podria hacer el proxy entre la signatura del metodo publico y el modulo + var newValidatorInstance = new ValidatorInstance( + myself.validators.length, + new Validator(parameters) + ); + myself.validators.push(newValidatorInstance); + return newValidatorInstance; + }; + + // Funciones que permiten agregar, obtener y eliminar una validación personalizada. + + myself.addCustomValidation = function (id, method) { + return Validation.prototype.addCustomValidation({ + id: id, + method: method + }); + }; + myself.getCustomValidation = function (id) { + return Validation.prototype.getCustomValidation(id); + }; + myself.removeCustomValidation = function (id) { + return Validation.prototype.removeCustomValidation(id); + }; + + ///////////////////// Constantes públicas + + // Indican cuándo ejecutar la validación. + + myself.VALIDATE_ON_FORM_SUBMIT = Validator.prototype.VALIDATE_ON_FORM_SUBMIT; + myself.VALIDATE_ON_BUTTON_CLICK = Validator.prototype.VALIDATE_ON_BUTTON_CLICK; + myself.VALIDATE_ON_FIELD_BLUR = Validator.prototype.VALIDATE_ON_FIELD_BLUR; + myself.VALIDATE_ON_FIELD_CHANGE = Validator.prototype.VALIDATE_ON_FIELD_CHANGE; + myself.VALIDATE_ON_CUSTOM_EVENT = Validator.prototype.VALIDATE_ON_CUSTOM_EVENT; + + // Indican el tipo de validación. + + myself.VALIDATION_TYPE_REQUIRED = Validation.prototype.VALIDATION_TYPE_REQUIRED; + myself.VALIDATION_TYPE_LENGTH = Validation.prototype.VALIDATION_TYPE_LENGTH; + myself.VALIDATION_TYPE_NUMBER = Validation.prototype.VALIDATION_TYPE_NUMBER; + myself.VALIDATION_TYPE_INT = Validation.prototype.VALIDATION_TYPE_INT; + myself.VALIDATION_TYPE_DECIMAL = Validation.prototype.VALIDATION_TYPE_DECIMAL; + myself.VALIDATION_TYPE_VALUE = Validation.prototype.VALIDATION_TYPE_VALUE; + myself.VALIDATION_TYPE_EMAIL = Validation.prototype.VALIDATION_TYPE_EMAIL; + myself.VALIDATION_TYPE_GROUP = Validation.prototype.VALIDATION_TYPE_GROUP; + myself.VALIDATION_TYPE_RADIO_GROUP = Validation.prototype.VALIDATION_TYPE_RADIO_GROUP; + myself.VALIDATION_TYPE_CHECKBOX_GROUP = Validation.prototype.VALIDATION_TYPE_CHECKBOX_GROUP; + myself.VALIDATION_TYPE_DATE = Validation.prototype.VALIDATION_TYPE_DATE; + myself.VALIDATION_TYPE_CUSTOM = Validation.prototype.VALIDATION_TYPE_CUSTOM; + + return myself; +}()); diff --git a/src/cracker.php b/src/cracker.php index 022bd28..9d1e7d5 100644 --- a/src/cracker.php +++ b/src/cracker.php @@ -3,35 +3,41 @@ require_once '../config.php'; // Funcion para hacer peticiones con cURL -function hacer_peticion($url_recurso) { +function hacer_peticion($url_recurso, $datos_entrada) { $datos = null; // Inicio curl $sesion = curl_init(); curl_setopt($sesion, CURLOPT_URL, $url_recurso); - curl_setopt($sesion, CURLOPT_HTTPGET, true); + curl_setopt($sesion, CURLOPT_HTTPGET, false); + curl_setopt($sesion, CURLOPT_POST, true); curl_setopt($sesion, CURLOPT_HEADER, false); curl_setopt($sesion, CURLOPT_RETURNTRANSFER, true); + // Convierte array asociativo de datos en entrada en un string URL encodeado. + $string_datos_entrada = http_build_query($datos_entrada); + + curl_setopt($sesion, CURLOPT_POSTFIELDS, $string_datos_entrada); + // Ejecuto $resultado = curl_exec($sesion); - + // Cierro curl curl_close($sesion); - + // Proceso la respuesta if ($resultado === false) { throw new Exception("Error al hacer petición.", 0, null); } - $resultado = json_decode($resultado); - if (!property_exists($resultado, "estado")) { + $resultado = json_decode($resultado, true); + if (!isset($resultado["estado"])) { // Error... throw new Exception("Respuesta con formato no reconocido.", 0, null); } else { - $estado = $resultado->estado; + $estado = $resultado["estado"]; if ($estado === "ok") { - $datos = $resultado->datos; + $datos = $resultado["datos"]; } else { - throw new Exception($resultado->error->descripcion, $resultado->error->id, null); + throw new Exception($resultado["error"]["descripcion"], $resultado["error"]["id"], null); } } return $datos; @@ -39,4 +45,12 @@ function hacer_peticion($url_recurso) { // URL del recurso del Servidor de Hashes Inversos $url_recurso = "http://localhost/labsis_hash_cracker_web/src/mockup_respuesta_shi.php"; -$respuesta = hacer_peticion($url_recurso); + +$hash = filter_input(INPUT_POST, "hash"); +$algoritmo = filter_input(INPUT_POST, "algoritmo"); + +$respuesta = hacer_peticion($url_recurso, array("hash" => $hash, "algoritmo" => $algoritmo)); + +// Asumo que la respuesta ya viene en el formato esperado (el json acordado). +//print_r($respuesta); +echo json_encode($respuesta); diff --git a/src/mockup_respuesta_shi.php b/src/mockup_respuesta_shi.php index 53433f6..5736b6b 100644 --- a/src/mockup_respuesta_shi.php +++ b/src/mockup_respuesta_shi.php @@ -17,8 +17,11 @@ $algoritmo = filter_input(INPUT_POST, "algoritmo"); // Armo comando con parametros de entrada. - $comando = "java ..."; - exec($comando); +// $comando = "java ..."; + + $objeto_datos = array("resultados" => array("1", "2", "3")); + +// exec($comando); // Fin del procesamiento. } catch (Exception $ex) { $error = true; diff --git a/tmpl/index.tmpl.php b/tmpl/index.tmpl.php index d78246b..86e2f61 100644 --- a/tmpl/index.tmpl.php +++ b/tmpl/index.tmpl.php @@ -9,6 +9,7 @@ + @@ -48,7 +49,7 @@