HID Card Reader - NonaSuomy/PuRe GitHub Wiki
Card Reader for unLab sign-ins
/home/unlab/unbot/unbot.conf
source scripts/unsocket.tcl
unsocket.tcl
# Script: unSocket.tcl for EggDrop bot: unBot
# Hacked by: Wess Thornton
# Description: Opens a socket on the unBot and listens for text input to spam to the IRC Channel #unLab.
# Currently getting text from a C Winsock script that scans our RFID Cards.
# Message needs to be formatted "PASS SENDER WHO MESSAGE"
# EX: "mypass123 unDoor @WessleeT haz Enter'd."
# SETTINGS START
# Port/IP for your script you want to listen on (you need to set same port in client app that sends the text)
set botlisten(port) "31337"
set botlisten(ip) "10.13.37.105"
# Channel you want to send output to.
set botlisten(devchan) "#unlab"
# Bot listen password. Makes so no external siglnals can get to it. use only if hosting on a different server.
set botlisten(password) "PASSWORDHERE"
# SETTINGS END
# Open our socket.
if {![info exists serverSocket]} {
set serverSocket [socket -server main -myaddr $botlisten(ip) $botlisten(port)]
}
proc main { sock host port } {
#-blocking 0
fconfigure $sock -buffering line
fileevent $sock readable [action $sock $host $port]
}
proc action { chan host port } {
global botlisten
set soc_data [gets $chan]
if {![eof $chan]} {
outputAction $soc_data $botlisten(devchan)
set soc_data [gets $chan]
} else {
outputAction $soc_data $botlisten(devchan)
close $chan
}
}
# Check for password, format output and then spam channel.
proc outputAction { soc_data chan } {
global botlisten
# putlog $soc_data
if {[string length $soc_data]} {
lassign [split $soc_data] pass sender who
set message [join [lrange [split $soc_data] 3 end]]
# putlog $pass
# putlog $sender
# putlog $who
# putlog $message
# putlog $botlisten(password)
if {[string equal $pass $botlisten(password)]} {
#This Relays what ever the bot is sending to the selected channel, this could also be a user
putquick "PRIVMSG $chan :<< $sender >> $who: $message"
putlog "unSocket: message spammed in channel."
if {[string equal $sender "unDoor"]} {
# putlog "Sent message to AlphaSign."
exec -- ~/signage.pl "unBot: Welcome to unLab" $who
putlog "unSocket: Sent message to AlphaSign."
#set url "http://10.13.37.222/jsonrpc?request=\{%22jsonrpc%22:%222.0%22,%22id%22:%221%22,%22method%22:%22Player.Open%22,%22params%22:\{%22item%22:\{%22file%22:%22special://home/media/Busy_Child-The_Crystal_Method-Vegas.mp3%22\}\}\}"
set urls "http://10.13.37.222/jsonrpc?request=%7B%22jsonrpc%22%3A%222.0%22%2C%22id%22%3A%221%22%2C%22method%22%3A%22Player.Open%22%2C%22params%22%3A%7B%22item%22%3A%7B%22file%22%3A%22special%3A%2F%2Fhome%2Fmedia%2F"
set urle ".mp3%22%7D%7D%7D"
# putlog $urls
# putlog $who
# putlog $urle
set token [::http::geturl $urls$who$urle]
set data [::http::data $token]
::http::cleanup $token
putlog "unSocket: Sent message to XBMC"
}
}
}
}
unsockettest.py
## unsockettest.py
import sys, socket
def runQuery(serverAddress, toSend):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(serverAddress)
sock.sendall(toSend)
sock.shutdown(1)
response = sock.makefile().read()
print "Sent to server:", toSend
print "Got reply:", response
sock.close()
servAddr = sys.argv[1]
host, port = servAddr.split(":")
serverAddress = (host, int(port))
runQuery(serverAddress, "PASSWORDHERE unDoor TeknoJuce This is a test pang!")
# runQuery(serverAddress, "PASSWORDHERE Here is a longer string")
get_data.c Line:527-727
// Database process data to console and fire data at unBot to spam.
static int callback(void *data, int argc, char **argv, char **azColName){
int i;
printf("%s\n", argv[5] ? argv[5] : "NULL");
fprintf(stderr, "%s: \n", (const char*) data);
for (i = 0; i < argc; i++){
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
// Spam unBot with the sqlite3 membercard table options field.
sendunbot(31337, "10.13.37.105", argv[4], argv[5]);
return 0;
}
// Search sqlite3 database for card serial number.
int uncardbase(int argc, char argv [])
{
sqlite3 *db;
char *zErrMsg = 0;
int rc;
const char* data = "Callback function called";
//char buffer1 [] = "80e84300fbff12e1";
char *sql;
/* Open database */
// Open SQL - Dont declare vars in here or you'll be sorry
rc = sqlite3_open("unCard.db", &db);
if (rc){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
exit(0);
}
else{
fprintf(stderr, "Opened database successfully\n");
}
//char *zSQL = sqlite3_mprintf("SELECT price FROM warehouse WHERE p_ID='%q'", input_value);
//sqlite3_prepare_v2(handle,zSQL,-1,&stmt,0);
/* Create SQL statement */
sql = sqlite3_mprintf("SELECT CardSerial, CardATR, FirstName, LastName, NickName, Options FROM membercard WHERE CardSerial = '%q'", argv);
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, (void*) data, &zErrMsg);
if (rc != SQLITE_OK){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
//system("pause");
}
else{
fprintf(stdout, "Operation done successfully\n");
//system("pause");
}
sqlite3_close(db);
return 0;
}
// Open
int sendunbot(int argc, char *argv, char *nickname, char *msgunbot) {
char *first = "PASSWORDHERE unDoor";
char *second = nickname;
char *third = msgunbot;
char *botmsg;
char *tpkt; /* message to send to host ("<unDoor> + nickname + msgunbot") */
char *servername; /* pointer to name of server */
struct hostent *h; /* getnamebyhost info returned */
struct sockaddr_in sa; /* socket address */
int soxdes; /* socket descriptor */
short portnum; /* port number of server */
int inlen; /* length of input message */
char inbuf[INSIZE]; /* input message buffer */
size_t len1 = strlen(first);
size_t len2 = strlen(second);
size_t len3 = strlen(third);
#ifdef WINSOCK
WSADATA wsaData; /* Winsock parameters */
WSAStartup(0x0101, &wsaData);
botmsg = (char *)malloc(len1 + len2 + len3 + 3);
memcpy(botmsg, first, len1);
botmsg[len1] = ' ';
memcpy(botmsg + len1 + 1, second, len2); // includes terminating null
botmsg[len1 + len2 + 1] = ' ';
memcpy(botmsg + len1 + len2 + 2, third, len3 + 1);
//char botmsg[256];
//_snprintf(botmsg, sizeof botmsg, "%s%s%s", first, second, third);
//size_t size = strlen(first) + strlen(second) + strlen(third) + 3; botmsg = malloc(size); snprintf(botmsg, size, "%s %s %s", first, second, third);
tpkt = botmsg;
//printf_s(tpkt);
/* ask for the server name and port */
//puts("\nEnter the IP name of the server >");
servername = (char *) malloc(80);
//scanf_s("%s", servername);
//puts("\nEnter the port number used by the server >");
//scanf_s("%d", &portnum);
servername = argv;
portnum = argc;
#else
servername = argv[1];
portnum = atoi(argv[2]);
#endif
/* get host address */
h = gethostbyname(servername);
if (h == NULL) {
perror("gethostbyname");
//system("PAUSE");
//exit(5);
}
/* build socket structure */
memcpy((char *) &sa.sin_addr, (char *) h->h_addr, h->h_length);
sa.sin_family = h->h_addrtype;
sa.sin_port = htons(portnum);
/* allocate an open socket */
soxdes = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (soxdes == -1) {
perror("socket");
//system("PAUSE");
//exit(7);
}
else
printf("socket created. result is %X\n", soxdes);
/* connect to the server */
if (connect(soxdes, (const struct sockaddr*) &sa, sizeof sa) < 0) {
perror("connect");
//system("PAUSE");
//exit(7);
}
puts("connected");
/* send a packet to the server */
if (send(soxdes, tpkt, strlen(tpkt), 0) == -1) {
perror("write to socket");
//system("PAUSE");
//exit(5);
}
puts(tpkt);
puts("packet sent to server");
/* wait for a reply */
//inlen = recv(soxdes, inbuf, INSIZE, 0);
//printf("%d byte reply from server >%s\n", inlen, inbuf);
//system("PAUSE");
#ifdef WINSOCK
WSACleanup();
#else
close(soxdes);
#endif
}
void ShowCardEntry(BYTE bParam, BYTE pbData[], DWORD dwLength)
{
DWORD i;
char buffer[17];
char temp[3];
int k;
printf("\t");
switch (bParam)
{
case 0x00 : printf("Serial number : "); break;
case 0x01 : printf("Historical bytes : "); break;
case 0xF0 : printf("Complete identifier : "); break;
case 0xF1 : printf("PIX.SS & PIX.NN : "); break;
case 0xF2 : printf("Truncated serial n. : "); break;
default : printf("Unknown entry %02X : ", bParam);
}
// get the byte value into this form to send to the database select statement function above...
//uncardbase(1, "80e84300fbff12e1");
k= 0;
for (i = 0; i < dwLength; i++)
{
sprintf(temp,"%02X", pbData[i]);
buffer[k] = temp[0];
buffer[k+1] = temp[1];
k += 2;
}
buffer[16] = 0;
//Test Debug Sample.
//uncardbase(1, "80E84300FBFF12E1");
//strtoul(buffer, NULL, 16);
printf(buffer);
printf("\n");
printf("\n");
uncardbase(1, buffer);
}