Skip to content

Instantly share code, notes, and snippets.

@cscott
Forked from atdt/wp-telnet.js
Last active September 15, 2015 16:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cscott/fcee762adc52a46761bf to your computer and use it in GitHub Desktop.
Save cscott/fcee762adc52a46761bf to your computer and use it in GitHub Desktop.
Wikipedia Telnet Server

Wikipedia Telnet Server

NPM

Sometime, browsing over http/https is just too insecure. For those times when you must absolutely guarantee no executable code will be served to you, we present:

Wikipedia via telnet.

Uses the nice mw-ocg-texter package to do pleasant Unicode rendering of Wikipedia content, via the Wikipedia REST API.

Based on the gist by Ori Livneh at https://gist.github.com/atdt/4037228

Installation

Install the node package dependencies with:

npm install

Running

Start a telnet server on port 1081:

node index.js

Sample session:

$ telnet localhost 1081
Trying ::1...
Connected to skiffserv.dyndns.org.
Escape character is '^]'.
 ▄▄▄▄▄▄▄░▄▄▄▄▄▄▄░▄▄▄▄▄▄░▄▄▄▄▄
 ░░▀███░░░░▀██░░░░██▀░░░░██░░
 ░░░▀██░░░░░▀██░░▄█░░░░░▄█░░░
 ░░░░███░░░░░▀██▄█░░░░░░█░░░░
 ░░░░░███░░░░░▀██░░░░░░█▀░░░░
 ░░░░░░███░░░░▄███░░░░█▀░░░░░
 ░░░░░░░██▄░░▄▀░███░░█▀░░░░░░
 ░░░░░░░▀██▄█▀░░░███▄▀░░░░░░░
 ░░░░░░░░▀██▀░░░░░███░░░░░░░░
 ░░░░░░░░░▀▀░░░░░░░▀░░░░░░░░░

Use "host xx.wikipedia.org" to switch wikipedias.
Type "quit" to exit.


>>> telnet
telnet

Not to be confused with Telenet.

Telnet is a session layer protocol used on the Internet or local area
networks to provide a bidirectional interactive text-oriented communication
facility using a virtual terminal connection. User data is interspersed
in-band with Telnet control information in an 8-bit byte oriented data
connection over the Transmission Control Protocol (TCP).

[...]
>>> host es.wikipedia.org
Using es.wikipedia.org for future articles.


>>> telnet
telnet

Telnet (Telecommunication Network¹ ) es el nombre de un protocolo de red
que nos permite viajar a otra máquina para manejarla remotamente como si
estuviéramos sentados delante de ella. También es el nombre del programa
informático que implementa el cliente. Para que la conexión funcione, como
en todos los servicios de Internet, la máquina a la que se acceda debe
tener un programa especial que reciba y gestione las conexiones. El puerto
que se utiliza generalmente es el 23.

[...]
>>> quit
Bye!
Connection closed by foreign host.

License

Copyright (c) 2015 C. Scott Ananian

Licensed under AGPLv3.

// Wikipedia telnet server
//
// To install dependencies:
// npm install mw-ocg-texter
var net = require( 'net' );
var fs = require('fs');
var texter = require('mw-ocg-texter/lib/standalone');
var port = 1081;
// Logo from https://en.wikipedia.org/wiki/ASCII_art, plus some instructions.
var logo = fs.readFileSync( 'wiki-logo.txt' );
var domain = 'en.wikipedia.org';
var ps1 = '\n\n>>> ';
// Cache siteinfo requests for some extra efficiency.
var cachedSiteinfo = Object.create(null);
var siteinfoCacher = function(bundler, wikis, log) {
var key = '$' + wikis.map( function( w ) { return w.baseurl; } ).join( '|' );
if (!cachedSiteinfo[key]) {
cachedSiteinfo[key] = new bundler.siteinfo(
wikis,
function () { /* don't log request retries */ }
);
}
return cachedSiteinfo[key];
};
function recv( socket, data ) {
data = data.toString().replace( /(\r\n?|\n)/gm, '' );
if ( /^host (.*\.org)$/.test( data ) ) {
domain = data.slice( 5 );
socket.write( 'Using '+domain+' for future articles.\n' );
socket.write( ps1 );
return;
}
if ( data === 'quit' ) {
socket.end( 'Bye!\n' );
return;
}
texter.convert({
domain: domain,
title: data,
stream: socket,
// siteinfo cacher is optional, but it speeds things up
// by eliminating an unnecessary action API request for each article
siteinfo: siteinfoCacher,
}).catch(function( e ) {
socket.write( 'Error: ' + String( e ).trim() + '\n' );
}).then(function() { socket.write( ps1 ); });
}
console.log('Listening on port', port);
net.createServer( function ( socket ) {
socket.write( logo );
socket.write( ps1 );
socket.on( 'data', recv.bind( null, socket ) );
} ).listen( port );
{
"name": "wikipedia-telnet",
"version": "0.0.1",
"description": "Wikipedia Telnet Server",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "cscott/wikipedia-telnet"
},
"keywords": [
"telnet",
"wikipedia"
],
"author": "cscott, atdt",
"license": "AGPL-3.0",
"homepage": "https://github.com/cscott/wikipedia-telnet",
"dependencies": {
"mw-ocg-texter": "^0.3.1"
}
}
▄▄▄▄▄▄▄░▄▄▄▄▄▄▄░▄▄▄▄▄▄░▄▄▄▄▄
░░▀███░░░░▀██░░░░██▀░░░░██░░
░░░▀██░░░░░▀██░░▄█░░░░░▄█░░░
░░░░███░░░░░▀██▄█░░░░░░█░░░░
░░░░░███░░░░░▀██░░░░░░█▀░░░░
░░░░░░███░░░░▄███░░░░█▀░░░░░
░░░░░░░██▄░░▄▀░███░░█▀░░░░░░
░░░░░░░▀██▄█▀░░░███▄▀░░░░░░░
░░░░░░░░▀██▀░░░░░███░░░░░░░░
░░░░░░░░░▀▀░░░░░░░▀░░░░░░░░░
Use "host xx.wikipedia.org" to switch wikipedias.
Type "quit" to exit.
@cscott
Copy link
Author

cscott commented Sep 15, 2015

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment