Archivo

Posts Tagged ‘i2p plugins’

Uso de Streaming Library para aplicaciones en I2P

mayo 6, 2015 2 comentarios

Se ha hablado en varias ocasiones sobre los beneficios que aporta I2P al anonimato y en alguna ocasión se ha hablado sobre cómo crear rutinas simples que permitan acceder a I2P utilizando la librería “Streming Library”, la cual se encuentra escrita en Java. Si quieres hacer cualquier tipo de prueba con Python contra I2P, actualmente hay pocas librerías que realmente te lo permitan y que sean estables. Por lo que he podido apreciar en los foros oficiales de desarrolladores, al parecer las personas clave en el desarrollo de plugins, utilidades y el propio core de la red no muestran mucho interés en desarrollar otra librería en un lenguaje distinto para hacer lo que sobradamente ya hace la Streaming Library y francamente tienen toda la razón del mundo, ya que tienen un “roadmap” con cientos de frentes abiertos y es mucho más interesante crear cosas nuevas y mejorar las existentes que reinventar la rueda. Al equipo de I2P le ha costado muchísimo desarrollar la Streaming Library y la cantidad de errores que se reportaban al principio era enorme, es normal que después del número de horas invertidas y el nivel de estabilidad en el que se encuentra ahora, haya sido declarada como la librería de referencia para crear aplicaciones que requieran el uso del protocolo de control de I2P (I2CP) sobre TCP. No obstante, seguimos con los mismos problemas:

1. Aun sigue siendo poca, muy poca la documentación sobre su uso. Si realmente quieres aprender los elementos clave de la librería, tienes que meterte en los JavaDocs y empezar a crear un mapa mental de como están relacionadas las clases y cómo puedes usarlas.

2. Si eres un desarrollador en Python o tienes alguna herramienta para acceder a la web profunda de I2P aunque sea para consultar “Destinations”. Bueno, lo tienes un poco complicado por lo que comentaba antes. Aunque existe el proyecto python-i2cp (https://github.com/majestrate/python-i2cp) para utilizar directamente el protocolo interno de I2P, pero no avanza al ritmo que se esperaría y aun no funciona correctamente a la hora de consultar un destination. Además, utilizar directamente I2CP está desaconsejado por el equipo de I2P. Nos queda utilizar Jython o la JSR de Java correspondiente para ejecutar código de scripting con Python desde la máquina virtual de Java.

Es este artículo intentaré centrarme en el primer punto y explicaré algunas características interesantes en Streaming library para Java y en un próximo articulo, intentaré explicar algunas alternativas a la hora de acceder a I2P desde Python.

No en todos los casos resulta viable utilizar la Streaming Library de I2P, pero por norma general, cuando se habla de aplicaciones punto a punto, como es el caso de descargas de torrents y cosas similares, resulta bastante conveniente y óptimo utilizar esta librería, de hecho, un ejemplo bastante claro lo tenemos con el proyecto I2PSnark, un cliente bittorrent que utiliza la Streaming Library para descargar y compartir torrents utilizando la red de I2P. El código fuente del proyecto se encuentra licenciado con la GNU/GPL y se está disponible en el siguiente repositorio GitHub: https://github.com/i2p/i2p.i2p/tree/master/apps/i2psnark Si se mira con atención las clases y métodos que se incluyen en el proyecto, es mucho más fácil comprender el funcionamiento de la Streaming Library y cómo utilizarla.

En primer lugar, cualquier rutina de código utilizando esta librería puede funcionar en uno de dos modos, o bien como cliente que consulta “destinations” (un destino en I2P es similar a la combinación de una dirección IP y un puerto) o simplemente como servidor. Las principales clases disponibles en la API son “wrappers” de las clases SocketServer y Socket de Java, aunque evidentemente las clases en la Streaming Library adicionan las funcionalidades necesarias para que todas las conexiones se lleven a cabo utilizando la red de I2P.
Por otro lado, en una instancia de I2P, un programa escrito en Java y utilizando la Streaming Library puede actuar como emisor o receptor (recordar que I2P es una red que basada en paquetes y no en circuitos como TOR), con lo cual desde un programa se puede generar el “destination” para que otros usuarios envíen paquetes a la instancia o se pueden buscar (lookup) destinos y enviarles paquetes. El siguiente código sería la clase más simple que se puede crear utilizando la Streaming Library para crear un emisor.

import net.i2p.client.streaming.I2PSocket;
import net.i2p.client.I2PSession;
import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory; 

public class Server {
	public static void main(String[] args) {
		I2PSocketManager manager = I2PSocketManagerFactory.createManager();
		I2PServerSocket serverSocket = manager.getServerSocket();
		I2PSession session = manager.getSession();
System.out.println(session.getMyDestination().toBase64());
	}
}

Como se puede apreciar, se crea una instancia de la clase “I2PSocketManager” utilizando la factoría “I2PSocketManagerFactory” y posteriormente se crea un objeto “I2PServerSocket”, el cual será utilizado para atender a las peticiones de otros usuarios en la red de I2P. Finalmente, se pinta por pantalla el destination local del proceso recién iniciado. La clase “net.i2p.data.Destination” cuenta con los métodos “toBase64” y “toBase32” que serán utilizados por el cliente para comunicarse con la instancia de I2P.

El código anterior solamente se encarga de obtener una sesión I2P y pintar por pantalla el destination generado, pero una vez hecho esto, el hilo principal del programa termina. Las siguientes instrucciones que se deben añadir, deben permitir que el proceso se quede en estado de escucha para procesar los mensajes que envían los clientes, para ello la clase I2PThread permite crear un hilo de ejecución ininterrumpido que permitirá al emisor actuar como servidor y recibir mensajes.

import net.i2p.client.I2PSession;
import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory;
import net.i2p.util.I2PThread;
public class Server {
	public static void main(String[] args) {
		I2PSocketManager manager = I2PSocketManagerFactory.createManager();
		I2PServerSocket serverSocket = manager.getServerSocket();
		I2PSession session = manager.getSession();
System.out.println(session.getMyDestination().toBase64());
		I2PThread thread = new I2PThread(new
			ClientHandler(serverSocket));
		thread.setDaemon(false);
		thread.start();
	}
	private static class ClientHandler implements Runnable {
		private I2PServerSocket socket;
		public ClientHandler(I2PServerSocket socket) {
			this.socket = socket;
		}
		public void run() {
			while(true) {
		//Procesar las conexiones de los clientes.
                        }
                }
	}
}

En este caso se crea una nueva clase que procesará los mensajes de los clientes de forma indefinida en un bucle “while true”. En dicho bucle se aceptarán las conexiones de los clientes por I2P y posteriormente, se realizará algún tipo de procesamiento, el cual, típicamente consiste en recibir las conexiones por parte de los clientes y responder a los mensajes.

	while(true) {
		try {
			I2PSocket sock = this.socket.accept();
			if(sock != null) {
				//Receive
				BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
				//Send
				BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
				String line = br.readLine();
				if(line != null) {
                                    System.out.println(line);
                                    bw.write(line);
			            bw.flush();
				}
				sock.close();
			}
		} catch (I2PException ex) {
		System.out.println("General I2P exception!");
		} catch (ConnectException ex) {
		System.out.println("Error connecting!");
		} catch (SocketTimeoutException ex) {
                System.out.println("Timeout!");
		} catch (IOException ex) {
                System.out.println("read/write-exception!");
		}
       }

Por otro lado, el cliente debe conocer cuál es la dirección (destination) del emisor para poder transmitirle un mensaje y recibir su respuesta. El código necesario en la parte del cliente es mucho más simple, ya que solamente requiere utilizar la clase I2PSocket y conectarse con el destination especificado.

package testing.i2p;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InterruptedIOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ConnectException;
import java.net.NoRouteToHostException;
import net.i2p.I2PException;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory;
import net.i2p.data.DataFormatException;
import net.i2p.data.Destination; 

public class Client {
	public static void main(String[] args) {
		I2PSocketManager manager =
I2PSocketManagerFactory.createManager();
		System.out.println("Destination:");
		BufferedReader br = new BufferedReader(new
			InputStreamReader(System.in));
		String destinationString;
		try {
			destinationString = br.readLine();
		} catch (IOException ex) {
			System.out.println("Failed to get the Destination.");
			return;
		}
		Destination destination;
		try {
			destination = new Destination(destinationString);
		} catch (DataFormatException ex) {
			System.out.println("Destination string incorrectly formatted.");
			return;
		}
		I2PSocket socket;
		try {
			socket = manager.connect(destination);
		} catch (I2PException ex) {
			System.out.println("General I2P exception occurred!");
			return;
		} catch (ConnectException ex) {
			System.out.println("Failed to connect!");
			return;
		} catch (NoRouteToHostException ex) {
			System.out.println("Couldn't find host!");
			return;
		} catch (InterruptedIOException ex) {
			System.out.println("Sending/receiving was interrupted!");
			return;
		}
		try {
			//Write to server
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			bw.write("Hello I2P!\n");
			BufferedReader br2 = new BufferedReader(new
		InputStreamReader(socket.getInputStream()));
			String s = null;
			while ((s = br2.readLine()) != null) {
				System.out.println("Received from server: " + s);
			}
			socket.close();
		} catch (IOException ex) {
			System.out.println("Error occurred while
			sending/receiving!");
		}
	}
}

El código anterior es la base para crear cosas mucho más elaboradas, por ejemplo, en lugar de utilizar las clases BufferedReader y BufferedWriter se podría utilizar clases como ObjectInputStream y ObjectOutputStream que permiten enviar objetos serializados (aquellos que extienden de la interfaz java.io.Serializable) y de esta forma, construir aplicaciones muy robustas al interior de I2P. Por otro lado, también se puede utilizar para crear plugins que se puedan desplegar directamente desde la consola de administración de I2P. Sobre estas cosas hablaré en un próximo articulo.

Saludos y Happy Hack!
Adastra.

20 eepsites en la web profunda de I2P que te podrían interesar

febrero 5, 2015 6 comentarios

Este año puede ser muy interesante para I2P ya que por lo que he podido percibir en la red por comentarios en blogs, foros y en varios canales IRC, la gente está comenzando a utilizar más activamente I2P tanto como solución “InProxy” como solución “Outproxy”, especialmente desde la última edición de la CCC celebrada en Hamburgo. Ya os comentaba en la última entrada que 2015 es el año en el que deberías comenzar a pensar en I2P como una buena alternativa a TOR ya que se trata de una red madura y con mucho que ofrecer. Siguiendo esa misma línea, os dejo un listado de eepsites en I2P que a lo mejor resultan de vuestro interés, pero antes de eso, es importante hablar un poco sobre SusiDNS y el sistema de nombrado que utiliza I2P.

Tal como os he explicado anteriormente en una serie de artículos sobre I2P que he redactado hace unos años, el sistema de nombrado que utiliza un router depende de un fichero de texto que vincula un dominio “.i2p” con una dirección en base32 o base64, que es realmente el “destination” del servicio. En I2P no existe un sistema centralizado para resolver la dirección de un destino con su correspondiente dominio “.i2p”, no funciona como el clásico y conocido DNS, todos los hostnames son locales. Este sistema de nombrado se puede gestionar por medio de la aplicación “SusiDNS”, la cual se encuentra instalada por defecto en todos los routers de I2P en la siguiente dirección: http://127.0.0.1:7657/susidns/index. Algunos de los EEPSites que se listan a continuación ya se encuentran incluidos en el sistema de nombrado, sin embargo es posible que algunos no lo estén, por ese motivo es necesario hacerlo manualmente utilizando SusiDNS.

Por otro lado, es posible que una dirección “.i2p” no se encuentre almacenada en el addressbook local y en estos casos, el usuario tiene dos alternativas, o bien adicionar dicha dirección en cualquiera de los addressbook de la instancia local de I2P o utilizar un “jump service” que servirá de proxy entre el cliente y el destino sin necesidad de agregar el dominio y la dirección base32/base64 en el addressbook local. Algunos de los “jump services” más utilizados son los siguientes:

http://i2host.i2p

http://stats.i2p

http://no.i2p

http://i2pjump.i2p

Aclarados estos puntos, se listan algunos “eepsites” interesantes en la red de I2P. De esta forma, podrás comenzar a utilizar I2P, navegar por la web profunda y acceder a contenidos e información que sea de tu interés.

1. I2P Wiki (UGHA).

Una wiki bastante simple pero con buenos recursos sobre otros eepsites en I2P y recursos variados.

URL I2P: http://ugha.i2p/

URL Base32: http://z3f3owc72awbywk4p6qb5l2mxgitvs6ejztggbpn2a3ddmymfjda.b32.i2p

2. INR (I2P Name Registry).

Probablemente es uno de los recursos más interesantes para cualquier usuario que recién está comenzando con I2P. Incluye un directorio de servicios ocultos en I2P que los usuarios registran para que cualquiera pueda acceder a su correspondiente “destination”.

URL I2P: http://inr.i2p

URL Base32: http://joajgazyztfssty4w2on5oaqksz6tqoxbduy553y34mf4byv6gpq.b32.i2p

3. Foro de discusión de ZZZ.

Seguramente es para muchos conocido que el usuario “zzz” es uno de los desarrolladores de I2P y que lleva el proyecto desde el principio y dado que I2P sigue estando en versión “beta”, un buen recurso para conocer las últimas novedades es su foro de discusión, donde cualquiera puede registrarse y abrir un hilo. Es un recurso que te será muy útil para aprender y posteriormente apoyar al proyecto (con código, obviamente).

URL I2P: http://zzz.i2p/

URL Base32: http://ukeu3k5oycgaauneqgtnvselmt4yemvoilkln7jpvamvfx7dnkdq.b32.i2p/

4. Planet I2P.

Sitio dedicado a las últimas novedades en I2P.

URL I2P: http://planet.i2p/

URL Base32: http://y45f23mb2apgywmftrjmfg35oynzfwjed7rxs2mh76pbdeh4fatq.b32.i2p

5. Abusos Judiciales.

España es un país en el que se comenten innumerables atropellos y abusos judiciales y parece ser, que es poco lo que los afectados pueden hacer al respecto. Este servicio oculto no solamente se encuentra en I2P, sino que también se puede encontrar en TOR en la dirección onion http://2dn2dmxt5uwnxz3j.onion/ y su finalidad es exponer los principales abusos judiciales cometidos en España y las medidas legales que pueden aplicar los afectados. Además incluye consejos muy interesantes para protegerse y denunciar querellas falsas, denuncias, multas injustas, etc. Espero que ninguno de vosotros se encuentre nunca en una situación legal delicada, pero si así fuese, este sitio puede resolver algunas de las dudas que puedas tener.

URL I2P: http://abusos.i2p/

URL Base32: http://jnvf5uh4cnw5xv4yjwr5m4mv672ayacdj6lvsqyxkjtbzbuquxgq.b32.i2p/

6. APlus

Se trata de una red social muy simple en la que sus miembros pueden intercambiar mensajes y chatear. Para poder utilizarla, es necesario estar registrado, de lo contrario solamente podrás buscar los usuarios que se encuentran registrados.

URL I2P: http://aplus.i2p

URL Base32: http://h67lym6btfqinjs5ye272fo6uze2uvjk6t7qabibocjedfcv5fva.b32.i2p/

7. Strategic Intelligence Network (SIN)

Un sistema que recolecta y analiza los últimos acontecimientos en cada país del mundo y en base a dicha información, se encarga de generar distintos niveles de “SecCon” (Security Conditions) en cada país. Este sistema es interesante para conocer de primera mano la situación social y política de cada país del mundo y si eres una persona que suele viajar mucho, puedes leer las recomendaciones que incluye para mantener unos niveles de seguridad mínimos tanto en el viaje como en la estancia.

URL I2P: http://sin.i2p

URL Base32: http://tph27jvsnriyy3fcxmg44icunb5ugi3qhue3e7skwn4awp5j5zyq.b32.i2p/

8. GIT Hosting

Si tienes un proyecto de desarrollo de software y te interesa publicarlo en la web profunda de I2P, puedes registrarlo en el sitio git.repo.i2p y realizar su administración utilizando las utilidades de GIT del mismo modo que con cualquier repositorio en Internet.

URL I2P: http://git.repo.i2phttp://pull.git.repo.i2p/http://push.git.repo.i2p/

URL Base32: http://vsd2vtgtuua2vwqsal2mpmxm2b2cpn3qzmqjoeumrrw2p4aot7uq.b32.i2p/w

http://3so7htzxzz6h46qvjm3fbd735zl3lrblerlj2xxybhobublcv67q.b32.i2p/

http://jef4g5vxnqybm4zpouum3lzbl6ti6456q57nbyj5kfyldkempm3a.b32.i2p/

9. eepstatus

Servicio muy similar a INR, se encarga de verificar que los eepsites que se encuentran en el listado se encuentran activos y aquellos que no lo están, tienen una marca roja indicando la última fecha en la que se han visto en linea. Del mismo modo que ocurre con INR, se trata de un listado que se alimenta de sitios registrados por los usuarios de I2P y por un motor de indexación que incluye el servicio, por lo tanto es posible encontrar con servicios ocultos con contenidos inadecuados o ilegales y es importante ser consciente de ello y tomar las medidas oportunas.

URL I2P: http://identiguy.i2p/

URL Base32: http://3mzmrus2oron5fxptw7hw2puho3bnqmw2hqy7nw64dsrrjwdilva.b32.i2p/

10. PasteThis

Servicio similar a PasteBin para I2P. Los textos compartidos pueden ser públicos o privados

URL I2P: http://pastethis.i2p

URL Base32: http://erkqiwnjl7vtysqd3wvddv6tfvnhswarqkbn4blhdlhfxn7cf2ha.b32.i2p/

11. Postman Tracker

Uno de los servicios más conocidos en I2P para subir ficheros torrent en I2P. Es importante tener en cuenta que es posible que algunos de los torrents que se encuentran almacenados, no tengan el contenido que dicen tener. Cuidado, te puedes llevar una sorpresa.

URL I2P: http://tracker2.postman.i2p/

URL Base32: http://ahsplxkbhemefwvvml7qovzl5a2b5xo5i7lyai7ntdunvcyfdtna.b32.i2p/

12. LaWiki

Una wiki en castellano muy completa sobre el uso de I2P y con explicaciones muy detalladas sobre privacidad, anonimato y cuestiones técnicas relacionadas con I2P, TOR, FreeNet, etc. Se recomienda su lectura!

URL I2P: http://lawiki.i2p

URL Base32: ddwc3z7tm6yuvh4mzmqne2ifn7qglbz73zyqxtkewlpzl7kpmqzq.b32.i2p

13. Killyourtv

Se trata de un blog con información técnica bastante útil. Encontraras varios manuales y servicios interesantes. Además, incluye una de las mejores guías que he visto sobre Tahoe, algo de lo que hablaré en un próximo articulo.

URL I2P: http://killyourtv.i2p/

URL Base32: http://aululz24ugumppq56jsaw3d7mkbmcgo7dl2lgeanvpniyk2cbrda.b32.i2p/

14. Shadowlife

Un blog de opinión sobre temas relacionados con anonimato y privacidad. Hace algún tiempo leí algunos artículos sobre anonimato online y offline que me parecieron interesantes, seguramente a ti también.

URL I2P: http://shadowlife.i2p

URL Base32: http://jme44x4m5k3ikzwk3sopi6huyp5qsqzr27plno2ds65cl4nv2b4a.b32.i2p

15. ZeroBin

Similar a PasteThis, pero permite publicar mensajes de forma privada y con una fecha de caducidad. Además tiene la opción de que se auto-destruya después de que el mensaje es leído.

URL I2P: http://zerobin.i2p

URL Base32: http://3564erslxzaoucqasxsjerk4jz2xril7j2cbzd4p7flpb4ut67hq.b32.i2p/

16. Syndie

Syndie es un sistema para la creación y gestión de foros descentralizados en I2P. Es muy popular entre los usuarios.

URL I2P: http://www.syndie.i2p

URL Base32: http://7lm3yzpuejhpl4tt4l7o4ndqlu7hgijohofh7oaydx7q7kelenbq.b32.i2p

17. Postman

Servicio en I2P para crear cuentas de correo electrónico de forma anónima. Es probablemente el servicio más conocido en I2P para este tipo de tareas. Una cuenta en Postman puede ser utilizada en cualquier cliente de I2P para recepción y envío de mensajes de correo electrónico. Fijaros en la sección “Pages” a la derecha, allí se encuentran todas las opciones disponibles en Postman.

URL I2P: http://hq.postman.i2p

URL Base32: http://27ivgyi2xhbwjyqmnx3ufjvc2slg6mv7767hxct74cfwzksjemaq.b32.i2p

18. I2P Find

Del mismo modo que existe el servicio TORFind para la búsqueda de servicios ocultos en TOR, I2PFind es un servicio que permite buscar servicios ocultos en I2P y/o en TOR. Además, cualquiera puede registrar su propio dominio I2P para que sea indexado por el motor de búsqueda.

URL I2P: http://i2pfind.i2p

URL Base32: http://cgkswg5iezxdvfds2p5lgvhfhvd6sv3r72yioarywnwgmiazbw3q.b32.i2p/

19. Ihave2P

Se trata de un sitio oculto que ofrece varios tipos de servicios, como por ejemplo un pastebin con cifrado y mi favorito, servidores proxy del tipo http/https/socks a la clearnet por medio de TOR y/o I2P. Este último en concreto, se encuentra disponible en una dirección distinta (http://ihave2proxy.i2phttp://ginbb7blr6rvgfkuyx7435rakosdilzeduklygrkwaw3dwduntcq.b32.i2p/).

URL I2P: http://ihave2p.i2p

URL Base32: http://s6npkh5hzslijnzohm2om32un4sh4r2urp6hry2fya6oo55ehcyq.b32.i2p/

20. Torrent Finder

Buscador de Torrents en la web profunda de I2P.

URL I2P: http://torrentfinder.i2p

URL Base32: http://mpc73okj7wq2xl6clofl64cn6v7vrvhpmi6d524nrsvbeuvjxalq.b32.i2p/

Una lista de 20 servicios ocultos (eepsites) en I2P que espero que te ayuden a perder el miedo a navegar por este tipo de redes y encontrar cosas (legales) que sean de tu interés.

Un saludo y Happy Hack!
Adastra.

Preservando el Anonimato y Extendiendo su Uso – Arquitectura y Protocolos utilizados en I2P – Parte XXVIII

diciembre 12, 2011 1 comentario

Hasta este punto se ha hablado de una forma extensa sobre la arquitectura del I2P y la capa de aplicación resaltando los principales clientes y plugins que pueden ser instalados en una instancia I2P, se ha hablado sobre los detalles funcionales de I2P y como los mensajes son transferidos entre emisores y receptores, no obstante no se ha profundizado sobre los protocolos y las distintas capas que soportan todo esto para que la comunicación anónima entre dos entidades sea posible, la pila de protocolos que se soportan en I2P están agrupados por capas complejas que extienden de forma significativa el modelo de referencia estándar OSI para comunicaciones en entornos de red. En realidad esta es una de las razones por las cuales I2P es también considerado un proyecto con un alto nivel académico y técnico que para muchos resulta interesante y sumamente practico. Para explicar a grandes rasgos la arquitectura de red de I2P y con el objetivo de que sea fácil de comprender para el lector (y a la vez con un buen nivel de contenido técnico), se comenzará por indicar cada uno de los elementos de la pila de protocolos de I2P desde su capa más alta (aplicación) hasta las capas más bajas (transporte).

Leer más…

Preservando el Anonimato y Extendiendo su Uso – Servicios Anonimos, Plugins en I2P – Parte XXVII

diciembre 9, 2011 1 comentario

En I2P existen módulos adicionales que se pueden instalar en una instancia I2P en ejecución, los cuales permiten extender las funcionalidades que vienen incluidas en el sistema. Uno de los principales enfoques de estos Plugins son la seguridad de los mismos, dado que podría perfectamente ser un vector de ataque valido contra usuarios que los utilicen, por esta razón el equipo de desarrollo de este proyecto, antes de hacer publico cualquier plugin, primero realiza una comprobación sobre el código y obliga a que cualquier desarrollador firme digitalmente sus desarrollos antes de subirlos al repositorio de plugins de I2P.

Leer más…

A %d blogueros les gusta esto: