Merge branch 'master' of hackerspace.pl:q3k/hackfridge
Conflicts: terminal/CMakeLists.txtmaster
commit
03c2a7aa38
|
@ -8,3 +8,6 @@ install_manifest.txt
|
||||||
|
|
||||||
*.o
|
*.o
|
||||||
hf-terminal
|
hf-terminal
|
||||||
|
test-barcode
|
||||||
|
|
||||||
|
config.h
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
project(hf-terminal)
|
project(hf-terminal)
|
||||||
|
|
||||||
add_executable(hf-terminal main.c tts.c base64.c ldap.c nfc.c network.c)
|
add_executable(hf-terminal main.c tts.c base64.c ldap.c nfc.c network.c barcode.c)
|
||||||
add_executable(hash-one hash-one.c ldap.c)
|
add_executable(hash-one hash-one.c ldap.c)
|
||||||
set(CMAKE_C_FLAGS "-std=c99 -g -I/usr/local/include -L/usr/local/lib")
|
set(CMAKE_C_FLAGS "-std=c99 -g -I/usr/local/include -L/usr/local/lib")
|
||||||
|
add_executable(test-barcode test-barcode.c barcode.c)
|
||||||
|
|
||||||
target_link_libraries(hf-terminal nfc m ldap crypto ssl)
|
target_link_libraries(hf-terminal nfc m ldap crypto ssl)
|
||||||
target_link_libraries(hash-one m crypto ldap)
|
target_link_libraries(hash-one m crypto ldap)
|
||||||
|
|
|
@ -0,0 +1,109 @@
|
||||||
|
#include <termios.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/select.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
int g_BarcodeFD;
|
||||||
|
|
||||||
|
int barcode_initialize(char *Device)
|
||||||
|
{
|
||||||
|
g_BarcodeFD = open(Device, O_RDWR | O_NONBLOCK);
|
||||||
|
if (g_BarcodeFD == -1)
|
||||||
|
{
|
||||||
|
printf("Failed to open barcode reader TTY.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct termios Config;
|
||||||
|
|
||||||
|
if (!isatty(g_BarcodeFD))
|
||||||
|
{
|
||||||
|
printf("Barcode TTY is not a TTY!\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tcgetattr(g_BarcodeFD, &Config))
|
||||||
|
{
|
||||||
|
printf("Could not get barcode TTY config.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&Config, 0, sizeof(Config));
|
||||||
|
Config.c_iflag = 0;
|
||||||
|
Config.c_oflag = 0;
|
||||||
|
Config.c_lflag = 0;
|
||||||
|
Config.c_cflag = CS8|CREAD|CLOCAL;
|
||||||
|
Config.c_cc[VMIN] = 1;
|
||||||
|
Config.c_cc[VTIME] = 0;
|
||||||
|
|
||||||
|
if (cfsetispeed(&Config, B9600) < 0 || cfsetospeed(&Config, B9600) < 0)
|
||||||
|
{
|
||||||
|
printf("Could not set barcode TTY baudrate!\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tcsetattr(g_BarcodeFD, TCSAFLUSH, &Config) < 0)
|
||||||
|
{
|
||||||
|
printf("Could not set barcode TTY attributes!\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tcflush(g_BarcodeFD, TCIOFLUSH);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _async_read_timeout(int FD, char *DataOut, int NumBytes, int Timeout)
|
||||||
|
{
|
||||||
|
fd_set Read, Write, Special;
|
||||||
|
FD_ZERO(&Read);
|
||||||
|
FD_ZERO(&Write);
|
||||||
|
FD_ZERO(&Special);
|
||||||
|
|
||||||
|
FD_SET(FD, &Read);
|
||||||
|
|
||||||
|
struct timeval TTimeout;
|
||||||
|
memset(&TTimeout, 0, sizeof(TTimeout));
|
||||||
|
TTimeout.tv_sec = Timeout;
|
||||||
|
|
||||||
|
int ResultFD = select(FD + 1, &Read, &Write, &Special, &TTimeout);
|
||||||
|
if (ResultFD == -1)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return read(FD, DataOut, NumBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
int barcode_read(char *BarcodeOut)
|
||||||
|
{
|
||||||
|
int BytesRead = 0;
|
||||||
|
|
||||||
|
// read the first byte with a long timeout
|
||||||
|
BytesRead += _async_read_timeout(g_BarcodeFD, BarcodeOut + BytesRead, 14, BARCODE_TIMEOUT);
|
||||||
|
if (BytesRead == -1)
|
||||||
|
{
|
||||||
|
printf("Timeout on reading first barcode bytes.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (BytesRead < 14)
|
||||||
|
{
|
||||||
|
int Result = _async_read_timeout(g_BarcodeFD, BarcodeOut + BytesRead, 14 - BytesRead, 1);
|
||||||
|
if (Result == -1)
|
||||||
|
{
|
||||||
|
printf("Timeout on reading following bytecode bytes.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
BytesRead += Result;
|
||||||
|
}
|
||||||
|
BarcodeOut[13] = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
#ifndef __BARCODE_H__
|
||||||
|
#define __BARCODE_H__
|
||||||
|
|
||||||
|
int barcode_initialize(char *Device);
|
||||||
|
int barcode_read(char *BarcodeOut);
|
||||||
|
|
||||||
|
#endif
|
|
@ -7,4 +7,7 @@
|
||||||
#define LDAP_BASE "ou=Peole,dc=somecorp,dc=com"
|
#define LDAP_BASE "ou=Peole,dc=somecorp,dc=com"
|
||||||
#define LDAP_FILTER_HASHES "objectClass=hsMember"
|
#define LDAP_FILTER_HASHES "objectClass=hsMember"
|
||||||
|
|
||||||
|
#define BARCODE_PORT "/dev/ttyUSB0"
|
||||||
|
#define BARCODE_TIMEOUT 20
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -12,6 +12,9 @@
|
||||||
|
|
||||||
const int NO_SUCH_CARD = LDAP_NO_SUCH_OBJECT;
|
const int NO_SUCH_CARD = LDAP_NO_SUCH_OBJECT;
|
||||||
|
|
||||||
|
// fucking gcc
|
||||||
|
size_t strnlen(const char *s, size_t maxlen);
|
||||||
|
|
||||||
static char* ldap_attrs_hashes[] = {
|
static char* ldap_attrs_hashes[] = {
|
||||||
"uid",
|
"uid",
|
||||||
"mifareIDHash",
|
"mifareIDHash",
|
||||||
|
@ -65,7 +68,7 @@ int ldap_dn_by_mifare(char *MifareID, char *DNOut, int *DNLength)
|
||||||
nentries = ldap_count_entries(ld, msg);
|
nentries = ldap_count_entries(ld, msg);
|
||||||
result = LDAP_NO_SUCH_OBJECT;
|
result = LDAP_NO_SUCH_OBJECT;
|
||||||
for(entry = ldap_first_entry(ld, msg); entry != NULL; entry = ldap_next_entry(ld, entry)) {
|
for(entry = ldap_first_entry(ld, msg); entry != NULL; entry = ldap_next_entry(ld, entry)) {
|
||||||
values = ldap_get_values(ld, entry, "mifareIDHash");
|
values = (unsigned char**)ldap_get_values(ld, entry, "mifareIDHash");
|
||||||
if(values) {
|
if(values) {
|
||||||
for(i = 0; values[i] != NULL; ++i) {
|
for(i = 0; values[i] != NULL; ++i) {
|
||||||
bzero(entry_salt, 20);
|
bzero(entry_salt, 20);
|
||||||
|
@ -81,7 +84,7 @@ int ldap_dn_by_mifare(char *MifareID, char *DNOut, int *DNLength)
|
||||||
result = 0;
|
result = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ldap_value_free(values);
|
ldap_value_free((char **)values);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
search_finalize:
|
search_finalize:
|
||||||
|
@ -90,3 +93,36 @@ finalize:
|
||||||
ldap_unbind_s(ld);
|
ldap_unbind_s(ld);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// because fuck you that's why
|
||||||
|
int ldap_uid_from_dn(char *DN, char *UIDOut)
|
||||||
|
{
|
||||||
|
char *KeyPair = DN;
|
||||||
|
int KeyPairLength = 0;
|
||||||
|
|
||||||
|
for (char *i = DN; i < DN + strlen(DN); i++)
|
||||||
|
{
|
||||||
|
if (*i == ',')
|
||||||
|
{
|
||||||
|
char *KeyPairSplit;
|
||||||
|
for (KeyPairSplit = KeyPair; *KeyPairSplit != '='; KeyPairSplit++) {}
|
||||||
|
|
||||||
|
int KeyLength = KeyPairSplit - KeyPair;
|
||||||
|
char *Key = KeyPair;
|
||||||
|
int ValueLength = KeyPairLength - KeyLength - 1;
|
||||||
|
char *Value = KeyPairSplit + 1;
|
||||||
|
|
||||||
|
|
||||||
|
if (KeyLength == 3 && strncmp(Key, "uid", KeyLength) == 0)
|
||||||
|
{
|
||||||
|
memcpy(UIDOut, Value, ValueLength);
|
||||||
|
UIDOut[ValueLength] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
KeyPair = i + 1;
|
||||||
|
KeyPairLength = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
KeyPairLength++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
#define __LDAP_H__
|
#define __LDAP_H__
|
||||||
|
|
||||||
int ldap_dn_by_mifare(char *MifareID, char *DNOut, int *DNLength);
|
int ldap_dn_by_mifare(char *MifareID, char *DNOut, int *DNLength);
|
||||||
|
int hash_mifare(char *MifareID, char *salt, char* target);
|
||||||
|
int ldap_uid_from_dn(char *DN, char *UIDOut);
|
||||||
const int NO_SUCH_CARD;
|
const int NO_SUCH_CARD;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2,17 +2,82 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "nfc.h"
|
#include "nfc.h"
|
||||||
|
#include "barcode.h"
|
||||||
|
#include "ldap.h"
|
||||||
#include "tts.h"
|
#include "tts.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
nfc_initialize();
|
if (nfc_initialize())
|
||||||
|
{
|
||||||
|
printf("NFC initialization failed\n");
|
||||||
|
tts_speak("Nie można było zainicjalizować czytnika mifare.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
printf("NFC initialization successful\n");
|
||||||
|
|
||||||
|
if (barcode_initialize(BARCODE_PORT))
|
||||||
|
{
|
||||||
|
printf("Barcode initialization failed\n");
|
||||||
|
tts_speak("Nie można było zainicjalizować czytnika kodów kreskowych.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
printf("Barcode initialization successful\n");
|
||||||
|
|
||||||
tts_speak("Refryżyrator gotowy do pracy.");
|
tts_speak("Refryżyrator gotowy do pracy.");
|
||||||
|
|
||||||
|
char MifareID[128];
|
||||||
|
char Barcode[14];
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
nfc_poll();
|
int NFCResult = nfc_read(MifareID);
|
||||||
|
|
||||||
|
if (NFCResult == 0)
|
||||||
|
{
|
||||||
|
char DN[256];
|
||||||
|
int DNLength = 256;
|
||||||
|
int LDAPResult = ldap_dn_by_mifare(MifareID, DN, &DNLength);
|
||||||
|
|
||||||
|
if (LDAPResult > 0)
|
||||||
|
{
|
||||||
|
if (LDAPResult == NO_SUCH_CARD)
|
||||||
|
{
|
||||||
|
tts_speak("Nieznana karta.");
|
||||||
|
printf("NFC: Unknown card.\n");
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tts_speak("Błąd eldapa.");
|
||||||
|
printf("LDAP: Unknown error %i\n", LDAPResult);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("LDAP DN: %s\n", DN);
|
||||||
|
char UID[128];
|
||||||
|
ldap_uid_from_dn(DN, UID);
|
||||||
|
printf("LDAP uid: %s\n", UID);
|
||||||
|
|
||||||
|
tts_speak("Zeskanuj produkt.\n");
|
||||||
|
|
||||||
|
int BarcodeResult = barcode_read(Barcode);
|
||||||
|
if (BarcodeResult == 0)
|
||||||
|
{
|
||||||
|
printf("Scanned barcode %s\n", Barcode);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Barcode error %i\n", BarcodeResult);
|
||||||
|
// Do error handling here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (NFCResult != NFC_TIMEOUT)
|
||||||
|
{
|
||||||
|
printf("NFC error %i\n", NFCResult);
|
||||||
|
// Do error handling here
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,11 @@
|
||||||
#include "ldap.h"
|
#include "ldap.h"
|
||||||
#include "base64.h"
|
#include "base64.h"
|
||||||
|
|
||||||
|
#define E_BAD_CARD 1
|
||||||
|
#define E_NO_SUCH_USER 2
|
||||||
|
#define E_FUCKUP 3
|
||||||
|
#define E_TIMEOUT 4
|
||||||
|
|
||||||
static nfc_device_t *g_NFCDevice = NULL;
|
static nfc_device_t *g_NFCDevice = NULL;
|
||||||
|
|
||||||
const nfc_modulation_t g_NFCModulations[5] = {
|
const nfc_modulation_t g_NFCModulations[5] = {
|
||||||
|
@ -21,7 +26,7 @@ const nfc_modulation_t g_NFCModulations[5] = {
|
||||||
};
|
};
|
||||||
const size_t g_NFCModulationCount = 5;
|
const size_t g_NFCModulationCount = 5;
|
||||||
|
|
||||||
void nfc_poll(void)
|
int nfc_read(char *MifareOut)
|
||||||
{
|
{
|
||||||
nfc_target_t Target;
|
nfc_target_t Target;
|
||||||
bool Result = nfc_initiator_poll_target(g_NFCDevice, g_NFCModulations, g_NFCModulationCount, 20, 2, &Target);
|
bool Result = nfc_initiator_poll_target(g_NFCDevice, g_NFCModulations, g_NFCModulationCount, 20, 2, &Target);
|
||||||
|
@ -29,37 +34,17 @@ void nfc_poll(void)
|
||||||
if (Result)
|
if (Result)
|
||||||
{
|
{
|
||||||
if (Target.nm.nmt != NMT_ISO14443A)
|
if (Target.nm.nmt != NMT_ISO14443A)
|
||||||
return;
|
return E_BAD_CARD;
|
||||||
|
|
||||||
if (Target.nti.nai.szUidLen != 4)
|
if (Target.nti.nai.szUidLen != 4)
|
||||||
return;
|
return E_BAD_CARD;
|
||||||
|
|
||||||
printf("Scanned Mifare %x.\n", *(int *)Target.nti.nai.abtUid);
|
printf("Scanned Mifare %x.\n", *(int *)Target.nti.nai.abtUid);
|
||||||
|
|
||||||
char MifareID[5];
|
sprintf(MifareOut, "%02x%02x%02x%02x", Target.nti.nai.abtUid[0], Target.nti.nai.abtUid[1], Target.nti.nai.abtUid[2], Target.nti.nai.abtUid[3]);
|
||||||
sprintf(MifareID, "%04x", *(int *)Target.nti.nai.abtUid);
|
return 0;
|
||||||
|
|
||||||
char DN[128];
|
|
||||||
int DNLength = 128;
|
|
||||||
int LDAPResult = ldap_dn_by_mifare(MifareID, DN, &DNLength);
|
|
||||||
|
|
||||||
if (LDAPResult > 0)
|
|
||||||
{
|
|
||||||
if (LDAPResult == NO_SUCH_CARD)
|
|
||||||
{
|
|
||||||
tts_speak("Nieznana karta.");
|
|
||||||
sleep(5);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tts_speak("Nieznany błąd przy połączeniu z eldapem.");
|
|
||||||
sleep(10);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
printf("This appears to be %s.\n", DN);
|
|
||||||
}
|
}
|
||||||
|
return E_TIMEOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
int nfc_initialize(void)
|
int nfc_initialize(void)
|
||||||
|
|
|
@ -1,7 +1,12 @@
|
||||||
#ifndef __NFC_H__
|
#ifndef __NFC_H__
|
||||||
#define __NFC_H__
|
#define __NFC_H__
|
||||||
|
|
||||||
|
#define NFC_BAD_CARD 1
|
||||||
|
#define NFC_NO_SUCH_USER 2
|
||||||
|
#define NFC_FUCKUP 3
|
||||||
|
#define NFC_TIMEOUT 4
|
||||||
|
|
||||||
int nfc_initialize(void);
|
int nfc_initialize(void);
|
||||||
void nfc_poll(void);
|
int nfc_read(char *UIDOut);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "barcode.h"
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
if (barcode_initialize("/dev/ttyUSB0"))
|
||||||
|
{
|
||||||
|
printf("Could not initialize barcode.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char Barcode[14];
|
||||||
|
if (barcode_read(Barcode))
|
||||||
|
{
|
||||||
|
printf("Could not read barcode.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
printf("barcode: %s\n", Barcode);
|
||||||
|
if (barcode_read(Barcode))
|
||||||
|
{
|
||||||
|
printf("Could not read barcode.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
printf("barcode: %s\n", Barcode);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Reference in New Issue