Browse Source

start on wireless menu, currently shows supported bands for an interface

master
Brad Parker 11 years ago
parent
commit
3b84770e8a
  1. 2
      tui/main.cpp
  2. 243
      tui/menu.cpp
  3. 9
      tui/menu.h
  4. 15
      wireless.cpp
  5. 1
      wireless.h

2
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();

243
tui/menu.cpp

@ -1,4 +1,7 @@
#include <QTimer>
#include <interface.h>
#include <wireless.h>
#include <neighbor.h>
#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<int, QString> 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<Wireless::BandInfo> 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);

9
tui/menu.h

@ -1,10 +1,11 @@
#ifndef TUI_MENU_H
#define TUI_MENU_H
#include <iostream>
#include <stdio.h>
#include <curses.h>
#include <QCoreApplication>
#include <QRegularExpression>
#include <interface.h>
#include <neighbor.h>
#include <QStringList>
#include <QHash>
@ -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

15
wireless.cpp

@ -8,6 +8,7 @@ extern "C" {
#include "ieee80211.h"
}
#include "interface.h"
#include "wireless.h"
#include "utils.h"
#include <iostream>
@ -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.
*/

1
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;

Loading…
Cancel
Save