Utilizar GPG desde consola

—–BEGIN PGP SIGNED MESSAGE—–
Hash: SHA1

¡Hola a todos! un tutorial para usar gpg desde consola.

Importando las llaves

Suponiendo que queremos descargar la clave privada desde un servidor ftp donde la tenemos guardada, lo haríamos asi:

$ wget ftp://USUARIO:CONTRASENA@ftp.google.com/pedro_private.asc

Listo, ahora tenemos nuestra clave privada en el current working directory. Es bastante importante que ejecutemos

$ history -c

para eliminar la contraseña del history de bash. Procedemos a importar la clave privada.

$ gpg --import pedro_private.asc
gpg: key EC5D3913: "droope <pedro@worcel.com>" not changed
gpg: key EC5D3913: already in secret keyring
gpg: Total number processed: 2
gpg:              unchanged: 1
gpg:       secret keys read: 1
gpg:  secret keys unchanged: 1

En mi caso ya la tenía importada por lo que no pasó nada. Después necesitamos importar la llave pública de nuestro receptor. El procedimiento es el mismo. Si no tenemos su llave, podemos intentar buscarla con –search-keys

$ gpg --import bob_public.asc
$ gpg --search-keys "bob perez"

Encriptando un mensaje

Para encriptar y firmar un mensaje, el comando básico es

$ gpg -sea -r bob

You need a passphrase to unlock the secret key for
user: "droope <pedro@worcel.com>"
1024-bit DSA key, ID EC5D3913, created 2010-06-29

Enter passphrase:

el parámetro -r indica el receptor, Podemos usar su nombre, su apellido, su email, o el ID de su llave supongo. -s es para firmar, -e es para encriptar y -a es para que el texto aparezca en ascii y no en binario. ( I think, aunque -a viene de armor y no de ascii )

Escribimos la contraseña y comenzamos a escribir un mensaje. Es un poco incómodo para empezar, porque no podemos navegar el texto excepto con el backspace, y no podemos subir las líneas ni nada por el estilo. Una vez terminada la edición del texto presionamos Ctrl + D una o dos veces para terminar la edición. Esto es estandar en bash, no recuerdo exactamente, pero creo que es la forma estandar de insertar un caracter EOF ( end of file ). Sirve también para cuando queremos envíar mails desde consola utilizando el comando `mail`. Vale la pena recordarlo ;) es muy util.

Fácil, eh? Y mucho mas práctico que cualquier cliente de X. El próximo manual mas información sobre como usar un mejor editor a la hora de editar el texto. ( nano ftw ).

Para encriptar un archivo

gpg -sea -r bob archivo.txt

Desencriptar un mensaje

Para desencriptar un mensaje de consola, el comando es

$ gpg -d
# pegamos el texto a desencriptar
- -----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.11 (GNU/Linux)

hQEOA84lsilnu8zVEAQAtD6gz9Ug2CvD1yLpbTrg+3TFRjSyF/mD3sbximxX1hju
v7Kw7UPcVcWMx/jT4ORdlDqzRSVqHnXxOFXm8QSy+aJinxYoEtIGuIqJL/2Pi9KL
Rc5qz2JULX2Ux5I17tDXJCrDBttMBCwpMFcwYZ33KIgikPFpLeWEXzXStzNx9oUD
/Rsjqnlph5EcPHlbMtYH37eqA8DvopCZs4GFFuqcLdbvsJDLJlsgm3WD6WefVHmj
RB8f/BnF1XKQcwApLROSh0SBx5IqtzmL657QlJm0yNwmcW9M31R/xF8G96QnxHud
mvvwYKfT/CTIOJux45FNFDjgW+CkO/scAqzksrdqH7Ty0pUBf8oK0vVT2ndtZVOr
eODDy0i94cdtddE7EeU6+g1/E+V9730gKY23rmDphBXKHdY6dHcoExwWaErpl9Wc
L1QAA9PdR4ELfwFU92lko3VxtvgTLb7Kxme21VXShcfz6NUAB8HHdcNWYz8Oq6Wn
ivjCRYZQvbXXFiCeKBp1b0A2fbxXlLsXd6jLgwqvewOd6fLATCIskw==
=GbH7
- -----END PGP MESSAGE-----
You need a passphrase to unlock the secret key for
user: "droope <pedro@worcel.com>"
1024-bit ELG-E key, ID 67BBCCD5, created 2010-06-29 (main key ID EC5D3913)

Enter passphrase:

Apretamos CTRL + D una o dos veces y aparecerá el texto desencriptado

Si queremos desencriptar un archivo, lo podemos hacer

$ gpg -do archivo_desencriptado archivo_encriptado.txt.asc

Firmar un mensaje en texto claro

Para hacer una firma como la que tiene este post, lo podemos hacer

$ gpg --clearsign

¡Espero que les sea de utilidad!
Un abrazo grande,
Pedro
—–BEGIN PGP SIGNATURE—–
Version: GnuPG v1.4.11 (GNU/Linux)

iEYEARECAAYFAk4xTIsACgkQ1LYwDexdORPJAwCgyPie6a19omWPZzCsEmpWz82I
zRUAoKFb0hy/j/keEEZU799mEKeD9wl3
=DNQr
—–END PGP SIGNATURE—–

Obtener URL con PHP

¡Hola gente!

Hace muy poco, me encontré con una situación en la que tenía que obtener la URL desde la que se estaba ejecutando el script. El siguiente código obtiene, tal como el original, además de la url, los parámetros GET. La diferencia con éste es que nos permite eliminar uno o varios parámetros GET.

function getCurrentUrl($exceptions) {
	/*
	 * @param array $exceptions an array containing the string keys of get to be skipped
	 */
		$pageURL = 'http';
		if ($_SERVER ["HTTPS"] == "on") {
			$pageURL .= "s";
		}
		$pageURL .= "://";
		if ($_SERVER ["SERVER_PORT"] != "80") {
			$pageURL .= $_SERVER ["SERVER_NAME"] . ":" . $_SERVER ["SERVER_PORT"] . $_SERVER ["REQUEST_URI"];
		} else {
			$pageURL .= $_SERVER ["SERVER_NAME"] . $_SERVER ["REQUEST_URI"];
		}
		
		foreach($exceptions as $e) {
			$e = preg_quote($e);
			$pageURL = preg_replace('/(?<=(&|\?))'.$e.'=.*?(&|$)/', "", $pageURL);
		}
		
		return $pageURL;
	}

¡Espero que les sea de utilidad!

Un saludo,
Pedro

Capturar la parte final de una URL

¡Hola gente!

Quería compartir esta expresión regular, que me sirvió para obtener la parte final de una url, independientemente de si es https://droope.wordpress.com o google.com o lo que sea, siempre obtiene solo el sector final ( “droope.wordpress.com”, “google.com”).

$regex = '/(?:http:\/\/)?(?:www\.)?([\w\d]+\.[\w]+(\.[\w]+)?)/';

También creé una función que lo hace toda la matemática por nosotros:

function valid_url_get($url) {
	
	if(preg_match('/(?:http:\/\/)?(?:www\.)?([\w\d\-]+\.[\w]+(\.[\w]+)?)/i', $url, $matches)) {
		return $matches[1];
	} else {
		return false;
	}
	
}

Retorna false si no es válida. En caso contrario, retorna el sector final de la url ;)

Un saludo,
Pedro

Devolver el número de fila en una consulta SQL

¡Hola amigos!

Para aquellos que estén buscando lo que promete el título, la consulta es

select @rownum:=@rownum+1 as row, gid FROM games LIMIT 3000

Para los demás, dejo una consulta muy sencilla, que sirve para obtener el lugar que ocuparía una fila en determinada consulta ( es útil para redirigir a un usuario, luego de un evento exitoso, al lugar en el que estaba, en lugar de la página uno. Obteniendo el resultado que nos da esta consulta, y dividiendolo por el número de elementos que mostramos por página, obtendremos el número de página )

SET @rownum = 0;
SELECT row FROM (select @rownum:=@rownum+1 as row, gid FROM games LIMIT 3000) result WHERE result.gid = 3675

:)

Un saludo,
Pedro

Regex para convertir urls a links

¡Hola!

En el curso de mis viajes, me encontré en una situación en la que tenía que reemplazar URLs obtenidas desde un feed por links a esas URLs. Pensé en crear mi propio código regex, pero al final opté por utilizar google. Hoy me alegro de haberlo hecho, porque me encontré una expresión regular excelente que cubre las urls que veran si clickean este enlace.

Me parece que está muy completo, y hasta ahora no me ha fallado con ninguna url.

El código regex es:

<?php
$regexUrl = "/\b(([\w-]+:\/\/?|www[.]|(\w+\.))([^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/))))/";
// $2 = subdomain $3 resto de la url $1 cadena completa

Hice una función que simplifica bastante todo, simplemente hemos de pasarle como parámetro la variable en la que queremos que se transformen las URLs. La dejo a continuación, junto con un ejemplo de su uso. (es muy sencilla de utilizar.)

<?php

function urls_to_links($originalString) {
	return preg_replace("/\b(([\w-]+:\/\/?|(www[.]|\w+\.))([^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/))))/", '<a href="http://$3$4">$1</a>', $originalString);
}

$cadena = "esta es una www.match.com con regex.urls.com para transformar a links. Dije alguna vez regex transformar urls? regex.urls.com/transformar/a/links";
$transformada = urls_to_links($cadena);

// ¡la cadena tiene ahora transformados los enlaces!
echo $transformada;

Para aquellos a los que les interese, el test case de esta aplicación es el siguiente:

<?php // regex to transform links test case / regex para transformar urls a enlaces - links test case

$testCases = "http://google.com/mail
http://google.com/mail/
(Something like http://google.com/mail)
http://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style_(disambiguation_pages)
(Something like http://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style_(disambiguation_pages))
http://google.com/mail.
http://google.com/mail/.
<http://google.com/mail>
<http://google.com/mail/>
http://google.com/mail,
http://www.tokyoflash.com/blog/?p=1288.
http://website.ws/faq
http://userid:password@example.com:8080
http://userid@example.com
http://userid@example.com:8080
http://userid:password@example.com
<tag>http://google.com/mail</tag>
Just a www.google.com link.
this is a adsense.google.com
this is a adsense.google.com/
this is a http://adsense.google.com
this is a http://adsense.google.com/";

$testCases = explode("\n", $testCases);

$urlRegex = "/\b(([\w-]+:\/\/?|(www[.]|\w+\.))([^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/))))/";
foreach($testCases as $testCase) {
	$stringWithUrls = preg_replace($urlRegex, '<a href="http://$3$4">$1</a>', $testCase);
	echo $stringWithUrls . "<br />";
}

¡Eso sería todo!

Espero que les sea de utilidad, me costó bastante esfuerzo, y modifiqué bastante la expresión original. :)

Un saludo
Pedro

Fuente:
Liberal regex for matching URLs

Menú de filtros

Hola Amigos:

Ejemplo de un menu de filtros
Ejemplo de un menu de filtros

Traigo para ustedes una clase programada por mi, que sirve para crear un menú de filtros. ¿Para que sirve en menú de filtros? Sirve para los casos en los que tenemos una base de datos con una tabla autos, y dentro de ella varios tipos de filtros: Autos rojos, autos verdes, y a la vez, autos caros y autos baratos.

Entonces, la idea de el menú sería la de crear lo siguiente:

Filtrar búsqueda por:

Color
-Rojo
-Azul
-Verde

Precio
-Barato
-Moderado
-Caro

Lo bueno de esta clase es que permite la recursión infinita de fitros, lo que permite usar varias categorías y subcategorías.

El código necesario para producir un menú sería el siguiente:

 
$possibleFilters = array(
		// category
		'anythingCanGoHere' => array( // key is string, ergo is category
			'name' => 'Colors',
			'0' => array( //key is_numeric, ergo is filter
				'name' => 'red',
				'url' => '?filter=red',
				'id' => 1,
			),
			'1' => array(
				'name' => 'green',
				'url' => '?filter=green',
				'id' => 2,
			),
			'2' => array(
				'name' => 'red',
				'url' => '?filter=blue',
				'id' => 3,
			),
		),
		//category w/ link
		'asLongAsItsAString' => array(
			'name' => 'weight',
			'url' => 'heavy.php',
			'0' => array(
				'name' => 'Less than 100KG',
				'url' => 'index.php?weight=100kg',
				'id' => 4,
			),
			'1' => array(
				'name' => 'between 100KG and 200KG',
				'url' => 'index.php?weight=200kg',
				'id' => 5,
			),
			'2' => array(
				'name' => 'more than 200KG',
				'url' => 'index.php?weight=300kg',
				'id' => 6,
			),
		),
	);

	$currentFilters = array(
		'1',
		'6'
	); // array de ID's que van a estar marcadas como seleccionadas

	$filterSearch = new filterSearch();
	$filterSearch->output_filter($possibleFilters, $currentFilters);

Como verán, una vez obtenida la información, el código necesario para producir el menu se reduce a dos líneas de código.

Existen varias configuraciones posibles, que deben aplicarse al objeto filterSearch

$filterSearch = new filterSearch();
$filterSearch->debug = 0; // debug? bool
$filterSearch->use_headers = 1; // usar headers alrededor de los títulos de las categorías
$filterSearch->available_headers = array(
	    '<h1 class="pagination_category">%</h1>',
	    '<h2 class="pagination_category">%</h2>',
	    '<h3 class="pagination_category">%</h3>',
	    '<h4 class="pagination_category">%</h4>',
	    '<h5 class="pagination_category">%</h5>',
	    '<h6 class="pagination_category">%</h6>',
    ); // Headers que va a utilizar la clase. Puedes usar cualquier tag HTML, solamente es importante recordar colocar un % donde iría el nombre de la categoría.
$filterSearch->extra_class = "filterSearchLink"; // clase para agregar a todos los links.
$filterSearch->output_filter($possibleFilters, $currentFilters);

¡Espero sea de utilidad!
Un saludo,
Pedro