diff --git a/tui/main.cpp b/tui/main.cpp index ccc8708..b9c9c1e 100644 --- a/tui/main.cpp +++ b/tui/main.cpp @@ -7,6 +7,8 @@ int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); + app.setOrganizationName("fiveforty"); + app.setApplicationName("tui"); initscr(); refresh(); diff --git a/tui/menu.cpp b/tui/menu.cpp index fe8717f..b71a119 100644 --- a/tui/menu.cpp +++ b/tui/menu.cpp @@ -1,4 +1,7 @@ #include +#include +#include +#include #include "menu.h" Menu::Menu(WINDOW *window, QObject *parent) : @@ -100,6 +103,8 @@ void Menu::mainmenu(WINDOW *window) { interfaceMenu(window); }else if(c == '2') { arpMenu(window); + }else if(c == '3') { + wifiInterfaceMenu(window); } } @@ -174,6 +179,69 @@ arpChar: } } +void Menu::wifiInterfaceMenu(WINDOW *window) { + wclear(window); + + cyan(window); + box(window, 0, 0); + + red(window); + mvwaddstr(window, 1, 2, "Wireless Interfaces:"); + + green(window); + + QStringList interfaceList = Wireless::interfaceList(); + + int count = 1; + int y = 3; + int lastInterface = 0; + QHash interfaceHash; + + foreach(QString interface, interfaceList) { + QString orig = interface; + interface = QString::number(count) + ". " + interface; + QByteArray interfaceArray = interface.toLatin1(); + const char *interfaceStr = interfaceArray.constData(); + + mvwaddstr(window, y, 2, interfaceStr); + + lastInterface = count + '0'; + + interfaceHash.insert(lastInterface, orig); + + ++y; + ++count; + } + + cyan(window); + mvwaddstr(window, y + 1, 2, "0. Back to main menu"); + + magenta(window); + mvwaddstr(window, y + 3, 2, "q. Quit"); + mvwaddstr(window, y + 5, 2, "Enter selection: "); + wrefresh(window); + + char c = getch(); + + if(c < '0' || c > lastInterface) { + if(c != 'q') { + if(c == 27) { + mainmenu(window); + }else{ + wifiInterfaceMenu(window); + } + } + }else{ + if(c == '0') { + mainmenu(window); + }else{ + if(c > '0' && c <= lastInterface) { + wifiInterfaceSelect(window, interfaceHash.value(c)); + } + } + } +} + void Menu::interfaceMenu(WINDOW *window) { wclear(window); @@ -237,6 +305,181 @@ void Menu::interfaceMenu(WINDOW *window) { } } +void Menu::wifiInterfaceSelect(WINDOW *window, QString interface) { + Wireless wir(interface); + Interface obj(""); + QStringList ipList; + + wclear(window); + + cyan(window); + box(window, 0, 0); + + red(window); + QString title = QString("Wireless info for: ") + interface; + QByteArray array = title.toLatin1(); + const char *data = array.constData(); + + mvwaddstr(window, 1, 2, data); + mvwaddstr(window, 3, 2, "Bands:"); + + green(window); + + QList bands = wir.bandMap(); + + int count = 1; + int y = 5; + + foreach(Wireless::BandInfo band, bands) { + QString bandStr; + + switch(band.band) { + case Wireless::BAND_2GHZ: + { + bandStr = "2.4GHz"; + break; + } + case Wireless::BAND_5GHZ: + { + bandStr = "5GHz"; + break; + } + default: + { + bandStr = "Other"; + break; + } + } + + QByteArray arr = bandStr.toLatin1(); + const char *data = arr.constData(); + + mvwaddstr(window, y, 2, data); + + ++y; + ++count; + } + + if(count == 1) { + mvwaddstr(window, y, 2, "No supported bands found."); + ++y; + } + + cyan(window); + mvwaddstr(window, y + 1, 2, "0. Back to wireless interfaces"); + + magenta(window); + mvwaddstr(window, y + 3, 2, "a. Add IP address"); + mvwaddstr(window, y + 4, 2, "d. Delete IP address"); + mvwaddstr(window, y + 5, 2, "q. Quit"); + + mvwaddstr(window, y + 7, 2, "Enter selection: "); + wrefresh(window); + + char c = getch(); + + if(c < '0' || c > (count + '0' - 1)) { + if(c == 27) { + wifiInterfaceMenu(window); + }else if(c == 'q') { + // no-op, just quit + }else if(c == 'a') { + wdeleteln(window); + mvwaddstr(window, y + 7, 2, "Enter IP address to add: "); + wrefresh(window); + + char ipToAdd[19] = {0}; + + echo(); + wgetnstr(window, ipToAdd, sizeof(ipToAdd) / sizeof(char) - 1); + noecho(); + + QString ip = ipToAdd; + + if(!ip.contains(QRegularExpression("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/([5-9]|[1-2][0-9]|3[0-2])$"))) { + msgbox("Invalid IP address. Please try again."); + interfaceSelect(window, interface); + return; + } + + wdeleteln(window); + QString confirm = "Are you sure you want to add "; + + confirm += ip; + confirm += " [y/n]? "; + + QByteArray arr = confirm.toLatin1(); + const char *confirmStr = arr.constData(); + + mvwaddstr(window, y + 7, 2, confirmStr); + wrefresh(window); + + c = getch(); + + if(c == 'y') { + if(obj.addAddress(ip)) { + msgbox("Could not add IP address. Not enough permissions?"); + }else{ + msgbox("IP address added successfully."); + } + + interfaceSelect(window, interface); + }else{ + interfaceSelect(window, interface); + } + }else if(c == 'd') { + wdeleteln(window); + mvwaddstr(window, y + 7, 2, "Enter number of IP address to delete: "); + wrefresh(window); + char ipToDelete = getch(); + + if(ipToDelete < '1' || ipToDelete > '9') { + interfaceSelect(window, interface); + return; + } + + if(!(ipList.count() >= ipToDelete - '0')) { + interfaceSelect(window, interface); + return; + } + + wdeleteln(window); + QString confirm = "Are you sure you want to delete "; + + confirm += ipList[ipToDelete - '0' - 1]; + confirm += " [y/n]? "; + + QByteArray arr = confirm.toLatin1(); + const char *confirmStr = arr.constData(); + + mvwaddstr(window, y + 7, 2, confirmStr); + wrefresh(window); + + c = getch(); + + if(c == 'y') { + if(obj.deleteAddress(ipList[ipToDelete - '0' - 1])) { + msgbox("Could not delete IP address. Not enough permissions?"); + }else{ + msgbox("IP address deleted successfully."); + } + + interfaceSelect(window, interface); + }else{ + interfaceSelect(window, interface); + } + }else{ + wifiInterfaceSelect(window, interface); + } + }else{ + if(c == '0') { + wifiInterfaceMenu(window); + }else{ + wifiInterfaceSelect(window, interface); + } + } +} + void Menu::interfaceSelect(WINDOW *window, QString interface) { wclear(window); diff --git a/tui/menu.h b/tui/menu.h index 9867ecf..e6f9c30 100644 --- a/tui/menu.h +++ b/tui/menu.h @@ -1,10 +1,11 @@ +#ifndef TUI_MENU_H +#define TUI_MENU_H + #include #include #include #include #include -#include -#include #include #include @@ -35,5 +36,9 @@ private: void arpMenu(WINDOW *window); void interfaceMenu(WINDOW *window); void interfaceSelect(WINDOW *window, QString interface); + void wifiInterfaceMenu(WINDOW *window); + void wifiInterfaceSelect(WINDOW *window, QString interface); void mainmenu(WINDOW *window); }; + +#endif // TUI_MENU_H diff --git a/wireless.cpp b/wireless.cpp index f8adf6f..d2f0c05 100644 --- a/wireless.cpp +++ b/wireless.cpp @@ -8,6 +8,7 @@ extern "C" { #include "ieee80211.h" } +#include "interface.h" #include "wireless.h" #include "utils.h" #include @@ -155,6 +156,20 @@ Wireless::~Wireless() { m_bands.clear(); } +QStringList Wireless::interfaceList() { + QStringList interfaces = Interface::list(); + + foreach(QString interface, interfaces) { + Wireless wir(interface); + + if(!wir.isValid()) { + interfaces.removeAll(interface); + } + } + + return interfaces; +} + /*! Returns a list of integers representing all physically supported channels in all supported bands, regardless if TX/RX is allowed or not in the current regulatory domain. */ diff --git a/wireless.h b/wireless.h index 938d507..09cdc4c 100644 --- a/wireless.h +++ b/wireless.h @@ -84,6 +84,7 @@ public: static QString ChanToFreq(QString channel, QString outputFormat = QString()); static int FreqToChan(int frequency); static QString FreqToChan(QString frequency, QString outputFormat = QString()); + static QStringList interfaceList(); bool isValid() const; bool isNL80211() const; bool channelSupported(int channel) const;