diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3918d61 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.pyc +*.db +.env +*.log diff --git a/banner b/banner new file mode 100644 index 0000000..8f76e60 --- /dev/null +++ b/banner @@ -0,0 +1,8 @@ + + mmmmm mmmm m"" m"" m + # # m m mmmmm mmmmm m" "m mm#mm mm#mm # + #mmmm" # # m" m" # # # # # + # # # # m" m" # # # # " + #mmmm" "mm"# #mmmm #mmmm #mm# # # # + + diff --git a/banner1 b/banner1 new file mode 100644 index 0000000..1bc8229 --- /dev/null +++ b/banner1 @@ -0,0 +1,8 @@ + +m m ""# m +# # # mmm # mmm mmm mmmmm mmm # +" #"# # #" # # #" " #" "# # # # #" # # + ## ##" #"""" # # # # # # # #"""" " + # # "#mm" "mm "#mm" "#m#" # # # "#mm" # + + diff --git a/dot-env.sample b/dot-env.sample new file mode 100644 index 0000000..550a360 --- /dev/null +++ b/dot-env.sample @@ -0,0 +1,12 @@ +# Settings for the neofinger program itself +NF_BASEDIR="." +NF_DBNAME="usermap.db" +NF_LOGFILE="query.log" + +# Settings for uscpi-tcp +NF_PREPEND="sudo" +# these must be numaric +NF_RUNAS=`id` +NF_GROUP=`id -g` + +NF_PORT="79" diff --git a/initdb.py b/initdb.py new file mode 100644 index 0000000..b54a4ac --- /dev/null +++ b/initdb.py @@ -0,0 +1,23 @@ +import sqlite3 +import os +from settings import * + +schema = open("schema.sql").read() +banner1 = open("banner1").read() +banner = open("banner").read() +os.chdir(BASEDIR) + +db = sqlite3.connect(DBNAME) +c = db.cursor() +c.execute(schema) +db.commit() + +uname = os.getenv("USER") + +sqls = "INSERT INTO lusers (unix_name, type, data) VALUES (?,?,?)" + +c.execute(sqls, (uname, 255, "Created this foolishness")) +c.execute(sqls, ("__b1__", 11, banner1)) +c.execute(sqls, ('__b__', 11, banner)) +db.commit() +db.close() diff --git a/neofinger.py b/neofinger.py new file mode 100755 index 0000000..23c7be5 --- /dev/null +++ b/neofinger.py @@ -0,0 +1,89 @@ +#!/usr/bin/python3 +# Note We're doing this using uscpi-tcp for inital testing +# We'll add the socket stuff later +import sqlite3 +import os +import random +import pickle +import sys +import logging +import subprocess +from settings import * +DYN_TYPE = 76 +BANNER_TYPE = 11 +PLAINTEXT_TYPE = 255 +CRLF = '\r\n' + + +def eat_pickle(sP): + + cmd = pickle.loads(sP) + p = subprocess.Popen(cmd, stdout=subprocess.PIPE) + return p.stdout.read().decode("ascii") + + +os.chdir(BASEDIR) +dbcon = None +try: + dbcon = sqlite3.connect(DBNAME) +except Exception as e: + sys.stdout.write(str(e)) + + +def banner_query(): + + from random import choice + sqls = "SELECT data FROM lusers WHERE type=?" + cur = dbcon.cursor() + cur.execute(sqls, [BANNER_TYPE]) + bList = cur.fetchall() + b = choice(bList) + return b[0] + CRLF + +def parse_and_query(uname): + + rv = "No such entity\r\n" + if uname == '': + banner_query() + else: + sqls = "SELECT type, data FROM lusers WHERE unix_name=?" + cur = dbcon.cursor() + cur.execute(sqls, [uname]) + data = cur.fetchone() + if data: + rv = eat_pickle(data[1])+CRLF if int(data[0] + ) == DYN_TYPE else data[1]+CRLF + return rv + + +def info_query(uname): + + cur = dbcon.cursor() + cur.execute("SELECT data FROM lusers WHERE unix_name=?", [uname]) + data = cur.fetchone() + rv = data[0] + CRLF if data else "404 No such entity\r\n" + return rv + + +def send_stdin(): + return sys.stdin.readline() + + +recv_query = send_stdin + + +def send_msg(x): return sys.stdout.write(str(x)) + + +logging.basicConfig(filename=LOGFILE, filemode='w', + format='%(asctime)s - %(message)s', datefmt='%d-%b-%y %H:%M:%S') +line = recv_query() +if line == "\r\n" or line == "\n": + logging.warning("Query was blank sending banner") + send_msg(banner_query()) +else: + resp = parse_and_query(line.strip(CRLF)) + logging.warning("Query was %s sent %s", line.strip( + CRLF), str(resp).strip(CRLF)) + send_msg(resp) +sys.exit(0) diff --git a/neofingerd.sh b/neofingerd.sh new file mode 100755 index 0000000..d849707 --- /dev/null +++ b/neofingerd.sh @@ -0,0 +1,3 @@ +#!/bin/bash +. .env +$NF_PREPEND tcpserver -v -u $NF_RUNAS -g $NF_GROUP 0 $NF_PORT $NF_BASEDIR/neofinger.py diff --git a/schema.sql b/schema.sql new file mode 100644 index 0000000..a0fda96 --- /dev/null +++ b/schema.sql @@ -0,0 +1,7 @@ +CREATE TABLE lusers ( +uid INTEGER PRIMARY KEY NOT NULL, +type INTEGER DEFAULT 255, +unix_name VARCHAR(32) NOT NULL UNIQUE, +data BLOB DEFAULT 'their a really nice person' +); + diff --git a/settings.py b/settings.py new file mode 100644 index 0000000..423aa6c --- /dev/null +++ b/settings.py @@ -0,0 +1,6 @@ +from dotenv import load_dotenv +import os +load_dotenv() +LOGFILE = os.getenv("NF_LOGFILE") +BASEDIR = os.getenv("NF_BASEDIR") +DBNAME = os.getenv("NF_DBNAME")