ysl node db support

pull/1/head
Tom Early 5 years ago
parent a2d1be3ccd
commit 942a308eb0

2
.gitignore vendored

@ -8,7 +8,9 @@
./*.service
configure.mk
configure.h
configure.sql
reflector.cfg
wiresx/configure.php
src/xlxd
src/xrfd
ambed/ambed

@ -35,6 +35,8 @@ sudo apt install git
sudo apt install apache2 php5
sudo apt install build-essential
sudo apt install g++
# the following is only needed for XLX, not for XRF
sudo apt install libmysqlclient-dev
```
### Download the repository and enter the directory

@ -63,16 +63,20 @@ WriteMemFile () {
local file
file="$rcfg"
echo "# created on `date`" > $file
[ -z ${callsign+x} ] || echo "callsign='$callsign'" >> $file
[ -z ${nummod+x} ] || echo "nummod=$nummod" >> $file
[ -z ${ip4addr+x} ] || echo "ip4addr='$ip4addr'" >> $file
[ -z ${ip6addr+x} ] || echo "ip6addr='$ip6addr'" >> $file
[ -z ${tcaddress+x} ] || echo "tcaddress='$tcaddress'" >> $file
[ -z ${tcmodules+x} ] || echo "tcmodules='$tcmodules'" >> $file
[ -z ${ysfenable+x} ] || echo "ysfenable=$ysfenable" >> $file
[ -z ${ysfmodule+x} ] || echo "ysfmodule='$ysfmodule'" >> $file
[ -z ${g3support+x} ] || echo "g3support=$g3support" >> $file
[ -z ${dbsupport+x} ] || echo "dbsupport=$dbsupport" >> $file
[ -z ${callsign+x} ] || echo "callsign='$callsign'" >> $file
[ -z ${nummod+x} ] || echo "nummod=$nummod" >> $file
[ -z ${ip4addr+x} ] || echo "ip4addr='$ip4addr'" >> $file
[ -z ${ip6addr+x} ] || echo "ip6addr='$ip6addr'" >> $file
[ -z ${tcaddress+x} ] || echo "tcaddress='$tcaddress'" >> $file
[ -z ${tcmodules+x} ] || echo "tcmodules='$tcmodules'" >> $file
[ -z ${ysfenable+x} ] || echo "ysfenable=$ysfenable" >> $file
[ -z ${ysfmodule+x} ] || echo "ysfmodule='$ysfmodule'" >> $file
[ -z ${ysflocaldb+x} ] || echo "ysflocaldb=$ysflocaldb" >> $file
[ -z ${ysfdbname+x} ] || echo "ysfdbname='$ysfdbname'" >> $file
[ -z ${ysfdbuser+x} ] || echo "ysfdbuser='$ysflocaldb'" >> $file
[ -z ${ysfdbpw+x} ] || echo "ysfdbpw='$ysfdbpw'" >> $file
[ -z ${g3support+x} ] || echo "g3support=$g3support" >> $file
[ -z ${dbsupport+x} ] || echo "dbsupport=$dbsupport" >> $file
}
WriteSRCHFile () {
@ -109,6 +113,14 @@ WriteSRCHFile () {
else
echo "#define YSF_AUTOLINK_MODULE '${ysfmodule}'" >> $file
fi
if [[ "$ysflocaldb" == true ]]; then
echo '#define YSF_DB_SUPPORT true' >> $file
echo "#define YSF_DB_NAME \"$ysfdbname\"" >> $file
echo "#define YSF_DB_USER \"$ysfdbuser\"" >> $file
echo "#define YSF_DB_PASSWORD \"$ysfdbpw\"" >> $file
else
echo '#define YSF_DB_SUPPORT false' >> $file
fi
fi
if [ -z ${g3support+x} ]; then
m=${g3support_d}
@ -162,6 +174,39 @@ WriteAmbeMKFile () {
fi
}
WriteCfgPhpFile () {
cat << EOF > $ysfs
// Created on $(date)
<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', '${ysfdbuser}');
define('DB_PASSWORD', '${ysfdbpw}');
define('DB_NAME', '${ysfdbname}');
// Attempt to connect to MySQL database
\$link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// Check connection
if (\$link === false) { die("ERROR: Could not connect. " . mysqli_connect_error()); }
?>
EOF
}
WriteDBCreateFile () {
cat << EOF > $dbcr
CREATE DATABASE IF NOT EXISTS ${ysfdbname};
USE ${ysfdbname};
CREATE TABLE IF NOT EXISTS ysfnodes (
callsign VARCHAR(7) PRIMARY KEY,
password VARCHAR(255) NOT NULL,
txfreq INT NOT NULL DEFAULT 446500000,
rxfreq INT NOT NULL DEFAULT 446500000,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE USER IF NOT EXISTS '${ysfdbuser}'@'localhost' IDENTIFIED BY '${ysfdbpw}';
GRANT ALL PRIVILEGES ON $ysfdbname . ysfnodes TO '${ysfdbuser}'@'localhost';
FLUSH PRIVILEGES;
EOF
}
WriteCFGFiles () {
WriteMemFile
WriteSRCHFile
@ -172,6 +217,12 @@ WriteCFGFiles () {
WriteAmbeHFile
WriteAmbeMKFile
fi
if [[ "$ysflocaldb" == true ]]; then
WriteCfgPhpFile
WriteDBCreateFile
else
rm -f $ysfs
fi
}
ListCFGFiles ()
@ -188,6 +239,12 @@ ListCFGFiles ()
echo "===========${ambm}============="
cat $ambm
fi
if [[ "$ysflocaldb" == true ]]; then
echo "===========${ysfs}============="
cat $ysfs
echo "===========${dbcr}============="
cat $dbcr
fi
}
# Execution starts here!
@ -197,6 +254,8 @@ srch='src/configure.h'
srcm='src/configure.mk'
ambh='ambed/configure.h'
ambm='ambed/configure.mk'
ysfs='wiresx/configure.php'
dbcr='configure.sql'
xlxserv='/etc/systemd/system/xlxd.service'
xrfserv='/etc/systemd/system/xrfd.service'
# default values
@ -210,6 +269,10 @@ ysfenable_d=false
ysfmodule_d='D'
g3support_d=false
dbsupport_d=false
ysflocaldb_d=false
ysfdbname_d=''
ysfdbuser_d=''
ysfdbpw_d=''
# expert mode
if [[ "$1" == ex* ]]; then
@ -245,26 +308,32 @@ while [[ "$key" != q* ]]
do
clear
echo
echo " Reflector Configuration, Version #200723"
echo " Reflector Configuration, Version #200810"
echo
echo -n "cs : Reflector Callsign = "; EvaluateVar callsign{,_d}
echo -n "nm : Number of Modules = "; EvaluateVar nummod{,_d}
echo -n "i4 : IPv4 Listen Address = "; EvaluateVar ip4addr{,_d}
echo -n "i6 : IPv6 Listen Address = "; EvaluateVar ip6addr{,_d}
echo -n "cs : Reflector Callsign = "; EvaluateVar callsign{,_d}
echo -n "nm : Number of Modules = "; EvaluateVar nummod{,_d}
echo -n "i4 : IPv4 Listen Address = "; EvaluateVar ip4addr{,_d}
echo -n "i6 : IPv6 Listen Address = "; EvaluateVar ip6addr{,_d}
if [[ "$callsign" == XLX* ]]; then
echo -n "tc : Transcoder Address = "; EvaluateVar tcaddress{,_d}
echo -n "tc : Transcoder Address = "; EvaluateVar tcaddress{,_d}
if [ ! -z ${tcaddress+x} ]; then
echo -n "tm : Transcoder Modules = "; EvaluateVar tcmodules{,_d}
echo -n "tm : Transcoder Modules = "; EvaluateVar tcmodules{,_d}
fi
echo -n "ye : YSF Autolink Enable = "; EvaluateVar ysfenable{,_d}
echo -n "ye : YSF Autolink Enable = "; EvaluateVar ysfenable{,_d}
if [ ! -z ${ysfenable+x} ]; then
if [[ "$ysfenable" == true ]]; then
echo -n "ym : YSF Autolink Module = "; EvaluateVar ysfmodule{,_d}
echo -n "ym : YSF Autolink Module = "; EvaluateVar ysfmodule{,_d}
fi
fi
echo -n "yl : YSF Local Database = "; EvaluateVar ysflocaldb{,_d}
if [[ "$ysflocaldb" == true ]]; then
echo -n "yd : YSF Database Name = "; EvaluateVar ysfdbname{,_d}
echo -n "yu : YSF Database User = "; EvaluateVar ysfdbuser{,_d}
echo -n "yp : YSF Database Password = "; EvaluateVar ysfdbpw{,_d}
fi
fi
echo -n "g3 : Icom G3 Support = "; EvaluateVar g3support{,_d}
echo -n "db : Debugging Support = "; EvaluateVar dbsupport{,_d}
echo -n "g3 : Icom G3 Support = "; EvaluateVar g3support{,_d}
echo -n "db : Debugging Support = "; EvaluateVar dbsupport{,_d}
echo
if [[ "$callsign" == XLX* ]] || [[ "$callsign" == XRF* ]]; then
echo "w : Write configuration files (overwrites any existing files) and quit"
@ -278,7 +347,7 @@ do
callsign="${value^^}"
callsign="${callsign:0:6}"
if [[ "$callsign" == XRF* ]]; then
unset tcaddress tcmodules
unset tcaddress tcmodules ysflocaldb ysfdbname ysfdbuser ysfdbpw
fi
elif [[ "$key" == nm* ]]; then nummod="$value"
elif [[ "$key" == i4* ]]; then ip4addr="$value"
@ -291,6 +360,10 @@ do
ysfmodule="${ysfmodule:0:1}"
elif [[ "$key" == g3* ]]; then SetBooleanValue g3support "$value"
elif [[ "$key" == db* ]]; then SetBooleanValue dbsupport "$value"
elif [[ "$key" == yl* ]]; then SetBooleanValue ysflocaldb "$value"
elif [[ "$key" == yd* ]]; then ysfdbname="$value"
elif [[ "$key" == yu* ]]; then ysfdbuser="$value"
elif [[ "$key" == yp* ]]; then ysfdbpw="$value"
elif [[ "$key" == w* ]]; then
WriteCFGFiles
ListCFGFiles
@ -306,6 +379,10 @@ do
elif [[ "$value" == ym* ]]; then unset ysfmodule
elif [[ "$value" == g3* ]]; then unset g3support
elif [[ "$value" == db* ]]; then unset dbsupport
elif [[ "$value" == yl* ]]; then unset ysflocaldb ysfdbname ysfdbuser ysfdbpw
elif [[ "$value" == yd* ]]; then unset ysfdbname
elif [[ "$value" == yu* ]]; then unset ysfdbuser
elif [[ "$value" == yp* ]]; then unset ysfdbpw
fi
fi
done

@ -44,6 +44,7 @@ SRCS = $(XRFSRCS)
ifeq ($(is_xlx), true)
SRCS += $(XLXSRCS)
LDFLAGS += `mysql_config --libs`
endif
ifdef tc_ip

@ -301,12 +301,10 @@ bool CWiresxCmdHandler::ReplyToWiresxDxReqPacket(const CIp &Ip, const CWiresxInf
sign = '+';
}
unsigned int freqHz = WiresxInfo.GetTxFrequency() % 1000000U;
unsigned int freqkHz = (freqHz + 500U) / 1000U;
//unsigned int freqkHz = (freqHz + 500U) / 1000U;
char freq[30U];
::sprintf(freq, "%05u.%03u000%c%03u.%06u",
WiresxInfo.GetTxFrequency() / 1000000U,
freqkHz, sign, offset / 1000000U, offset % 1000000U);
::sprintf(freq, "%05u.%06u%c%03u.%06u", WiresxInfo.GetTxFrequency() / 1000000U, freqHz, sign, offset / 1000000U, offset % 1000000U);
::memcpy(data + 84U, freq, 23U);
}

@ -36,16 +36,14 @@ CYsfNode::CYsfNode()
m_uiRxFreq = 0;
}
CYsfNode::CYsfNode(const CCallsign &callsign, uint32 txfreq, uint32 rxfreq)
CYsfNode::CYsfNode(uint32 txfreq, uint32 rxfreq)
{
m_Callsign = callsign;
m_uiTxFreq = txfreq;
m_uiRxFreq = rxfreq;
}
CYsfNode::CYsfNode(const CYsfNode &node)
{
m_Callsign = node.m_Callsign;
m_uiTxFreq = node.m_uiTxFreq;
m_uiRxFreq = node.m_uiRxFreq;
}
@ -56,5 +54,5 @@ CYsfNode::CYsfNode(const CYsfNode &node)
bool CYsfNode::IsValid(void) const
{
return m_Callsign.IsValid();
return true;
}

@ -26,7 +26,6 @@
#define cysfnode_h
#include "main.h"
#include "ccallsign.h"
////////////////////////////////////////////////////////////////////////////////////////
// define
@ -40,7 +39,7 @@ class CYsfNode
public:
// constructor
CYsfNode();
CYsfNode(const CCallsign &, uint32, uint32);
CYsfNode(uint32, uint32);
CYsfNode(const CYsfNode &);
// destructor
@ -53,7 +52,6 @@ public:
protected:
// data
CCallsign m_Callsign;
uint32 m_uiTxFreq;
uint32 m_uiRxFreq;
};

@ -23,6 +23,7 @@
// ----------------------------------------------------------------------------
#include <string.h>
#include <mysql/mysql.h>
#include "main.h"
#include "creflector.h"
#include "cysfnodedir.h"
@ -99,9 +100,7 @@ bool CYsfNodeDir::Reload(void)
if ( LoadContent(&buffer) )
{
Lock();
{
ok = RefreshContent(buffer);
}
ok = RefreshContent(buffer) && ReadDb();
Unlock();
}
return ok;
@ -126,3 +125,58 @@ bool CYsfNodeDir::FindFrequencies(const CCallsign &callsign, uint32 *txfreq, uin
return false;
}
}
bool CYsfNodeDir::ReadDb()
{
#if YSF_DB_SUPPORT==true
bool rval = false;
MYSQL *con = mysql_init(NULL);
if (con)
{
if (mysql_real_connect(con, "localhost", YSF_DB_USER, YSF_DB_PASSWORD, YSF_DB_NAME, 0, NULL, 0))
{
if (0 == mysql_query(con, "SELECT callsign,txfreq,rxfreq FROM ysfnodes"))
{
MYSQL_RES *result = mysql_store_result(con);
if (result)
{
rval = true;
std::cout << "Adding " << mysql_num_rows(result) << " registered YSF stations from table " << YSF_DB_NAME << std::endl;
MYSQL_ROW row;
while ((row = mysql_fetch_row(result)))
{
CCallsign cs(row[0]);
CYsfNode node(atoi(row[1]), atoi(row[2]));
std::pair<CCallsign, CYsfNode> pair(cs, node);
insert(pair);
}
mysql_free_result(result);
}
else
{
std::cerr << "Could not fetch MySQL rows" << std::endl;
}
}
else
{
std::cerr << "MySQL query failed: " << mysql_error(con) << std::endl;
}
}
else
{
std::cerr << "Could not connect to database " << YSF_DB_NAME << ": " << mysql_error(con) << std::endl;
}
mysql_close(con);
}
else
{
std::cerr << "Could not init mysql." << std::endl;
return false;
}
return rval;
#else
return true;
#endif
}

@ -84,6 +84,7 @@ protected:
// reload helpers
bool Reload(void);
virtual bool NeedReload(void) { return false; }
bool ReadDb(void);
//bool IsValidDmrid(const char *);

@ -128,7 +128,7 @@ bool CYsfNodeDirFile::RefreshContent(const CBuffer &buffer)
{
// new entry
CCallsign cs(callsign);
CYsfNode node(cs, atoi(txfreq), atoi(rxfreq));
CYsfNode node(atoi(txfreq), atoi(rxfreq));
if ( cs.IsValid() && node.IsValid() )
{
insert(std::pair<CCallsign, CYsfNode>(cs, node));

@ -71,7 +71,7 @@ bool CYsfNodeDirHttp::RefreshContent(const CBuffer &buffer)
{
// new entry
CCallsign cs(callsign);
CYsfNode node(cs, atoi(txfreq), atoi(rxfreq));
CYsfNode node(atoi(txfreq), atoi(rxfreq));
if ( cs.IsValid() && node.IsValid() )
{
insert(std::pair<CCallsign, CYsfNode>(cs, node));

6757
wiresx/bootstrap.css vendored

File diff suppressed because it is too large Load Diff

@ -0,0 +1,15 @@
<?php
/* Database credentials. Assuming you are running MySQL */
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'qnusers');
define('DB_PASSWORD', 'qnuser!20');
define('DB_NAME', 'qnusers');
/* Attempt to connect to MySQL database */
$link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// Check connection
if($link === false){
die("ERROR: Could not connect. " . mysqli_connect_error());
}
?>

@ -0,0 +1,72 @@
<?php
// Initialize the session
session_start();
// Check if the user is logged in, otherwise redirect to login page
if (!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true) {
header("location: login.php");
exit;
}
// Include config file
require_once "configure.php";
// find current frequencies and initialize
$sql = "SELECT txfreq, rxfreq FROM users WHERE callsign = ?";
if ($stmt = mysqli_prepare($link, $sql)) {
// Bind variables to the prepared statement as parameters
mysqli_stmt_bind_param($stmt, "s", $_SESSION["callsign"]);
// Attempt to execute the prepared statement
if (mysqli_stmt_execute($stmt)) {
// Store result
mysqli_stmt_store_result($stmt);
// Check if callsign exists, if yes then verify password
if (mysqli_stmt_num_rows($stmt) == 1) {
// Bind result variables
mysqli_stmt_bind_result($stmt, $tx_freq_hz, $rx_freq_hz);
if (mysqli_stmt_fetch($stmt)) {
$txfreq = $tx_freq_hz / 1000000.0;
$rxfreq = $rx_freq_hz / 1000000.0;
} else {
die("Can't bind frequencies\n");
}
} else {
die("Couldn't find one row for callsign\n");
}
} else {
die("Trouble SELECTing row\n");
}
mysqli_stmt_close($stmt);
} else {
die("Couldn't prepare SELECT statement\n");
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Set Frequency</title>
<link rel="stylesheet" href="bootstrap.css">
<style type="text/css">
body{ font: 14px sans-serif; text-align: center; }
</style>
</head>
<body>
<div class="page-header">
<h1>Summary for <?php echo htmlspecialchars($_SESSION["callsign"]); ?></h1>
</div>
<div class="wrapper">
<h2>Hot-Spot Frequencies Summary</h2>
<p>Hot-spot Callsign: <?php echo $_SESSION["callsign"]; ?></p>
<p>Transmit Frequency: <?php echo $txfreq; ?> MHz</p>
<p>Receive Frequency: <?php echo $rxfreq; ?> MHz</p>
</div>
<p>
<a href="frequency.php" class="btn btn-primary">Reset Frequencies</a>
<a href="reset-password.php" class="btn btn-warning">Reset Your Password</a>
<a href="logout.php" class="btn btn-danger">Sign Out of Your Account</a>
</p>
</body>
</html>

@ -0,0 +1,126 @@
<?php
// Initialize the session
session_start();
// Check if the user is logged in, otherwise redirect to login page
if (!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true) {
header("location: login.php");
exit;
}
// Include config file
require_once "configure.php";
// find current frequencies and initialize
$sql = "SELECT txfreq, rxfreq FROM users WHERE callsign = ?";
if ($stmt = mysqli_prepare($link, $sql)) {
// Bind variables to the prepared statement as parameters
mysqli_stmt_bind_param($stmt, "s", $_SESSION["callsign"]);
// Attempt to execute the prepared statement
if (mysqli_stmt_execute($stmt)) {
// Store result
mysqli_stmt_store_result($stmt);
// Check if callsign exists, if yes then verify password
if (mysqli_stmt_num_rows($stmt) == 1) {
// Bind result variables
mysqli_stmt_bind_result($stmt, $tx_freq_hz, $rx_freq_hz);
if (mysqli_stmt_fetch($stmt)) {
$txfreq = $tx_freq_hz / 1000000.0;
$rxfreq = $rx_freq_hz / 1000000.0;
} else {
die("Can't bind frequencies\n");
}
} else {
die("Couldn't find one row for callsign\n");
}
} else {
die("Trouble SELECTing row\n");
}
mysqli_stmt_close($stmt);
} else {
die("Couldn't prepare SELECT statement\n");
}
// Processing form data when form is submitted
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Validate new password
if ($txfreq > 1000.0 || $txfreq < 10.0) {
$txfreq_err = "TX out of range.";
}
// Validate confirm password
if ($rxfreq > 1000.0 || $rxfreq < 10.0) {
$rxfreq_err = "RX out of range.";
}
// Check input errors before updating the database
if (empty($txfreq_err) && empty($rxfreq_err)) {
// Prepare an update statement
$sql = "UPDATE users SET txfreq = ?, rxfreq = ? WHERE callsign = ?";
if($stmt = mysqli_prepare($link, $sql)){
// Bind variables to the prepared statement as parameters
$tx_freq_hz = $_POST["txfreq"] * 1000000;
$rx_freq_hz = $_POST["rxfreq"] * 1000000;
mysqli_stmt_bind_param($stmt, "iis", $tx_freq_hz, $rx_freq_hz, $_SESSION["callsign"]);
// Attempt to execute the prepared statement
if(mysqli_stmt_execute($stmt)){
// Frequencies updated successfully, go to summary
header("location: finish.php");
exit();
} else{
echo "Oops! Something went wrong. Please try again later.";
}
// Close statement
mysqli_stmt_close($stmt);
}
}
// Close connection
mysqli_close($link);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Set Frequency</title>
<link rel="stylesheet" href="bootstrap.css">
<style type="text/css">
body{ width: 350px; padding: 20px; }
</style>
</head>
<body>
<div class="page-header">
<h1>Set Frequencies for <?php echo htmlspecialchars($_SESSION["callsign"]); ?></h1>
</div>
<div class="wrapper">
<h2>Hot-Spot Frequencies</h2>
<p>Set your hot-spot WiresX frequencies (in MHz) here.</p>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<div class="form-group <?php echo (!empty($new_txfreq_err)) ? 'has-error' : ''; ?>">
<label>Tx Frequency (MHz)</label>
<input type="number" size="12" name="txfreq" min="10" max="1000" step="0.0005" class="form-control" value="<?php echo $txfreq; ?>">
<span class="help-block"><?php echo $txfreq_err; ?></span>
</div>
<div class="form-group <?php echo (!empty($rxfreq_err)) ? 'has-error' : ''; ?>">
<label>Rx Frequency (MHz)</label>
<input type="number" size="12" name="rxfreq" min="10" max="1000" step="0.0005" class="form-control" value="<?php echo $rxfreq; ?>">
<span class="help-block"><?php echo $rxfreq_err; ?></span>
</div>
<div class="form-group">
<input type="submit" class="btn btn-primary" value="Submit">
<a class="btn btn-link" href="finish.php">Cancel</a>
</div>
</form>
</div>
<p>
<a href="reset-password.php" class="btn btn-warning">Reset Your Password</a>
<a href="logout.php" class="btn btn-danger">Sign Out of Your Account</a>
</p>
</body>
</html>

@ -0,0 +1,123 @@
<?php
// Initialize the session
session_start();
// Check if the user is already logged in, if yes then redirect him to frequency page
if(isset($_SESSION["loggedin"]) && $_SESSION["loggedin"] === true){
header("location: frequency.php");
exit;
}
// Include config file
require_once "configure.php";
// Define variables and initialize with empty values
$callsign = $password = "";
$callsign_err = $password_err = "";
// Processing form data when form is submitted
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Check if callsign is empty
if (empty(trim($_POST["callsign"]))) {
$callsign_err = "Please enter your callsign.";
} else {
$callsign = strtoupper(trim($_POST["callsign"]));
}
// Check if password is empty
if (empty(trim($_POST["password"]))) {
$password_err = "Please enter your password.";
} else {
$password = trim($_POST["password"]);
}
// Validate credentials
if (empty($callsign_err) && empty($password_err)) {
// Prepare a select statement
$sql = "SELECT callsign, password FROM users WHERE callsign = ?";
if ($stmt = mysqli_prepare($link, $sql)) {
// Bind variables to the prepared statement as parameters
mysqli_stmt_bind_param($stmt, "s", $param_callsign);
// Set parameters
$param_callsign = $callsign;
// Attempt to execute the prepared statement
if (mysqli_stmt_execute($stmt)) {
// Store result
mysqli_stmt_store_result($stmt);
// Check if callsign exists, if yes then verify password
if (mysqli_stmt_num_rows($stmt) == 1) {
// Bind result variables
mysqli_stmt_bind_result($stmt, $callsign, $hashed_password);
if (mysqli_stmt_fetch($stmt)) {
if (password_verify($password, $hashed_password)) {
// Password is correct, so start a new session
session_start();
// Store data in session variables
$_SESSION["loggedin"] = true;
$_SESSION["callsign"] = $callsign;
// Redirect user to frequency page
header("location: frequency.php");
} else {
// Display an error message if password is not valid
$password_err = "The password you entered was not valid.";
}
}
} else {
// Display an error message if callsign doesn't exist
$callsign_err = "No account found with that callsign.";
}
} else {
echo "Oops! Something went wrong. Please try again later.";
}
// Close statement
mysqli_stmt_close($stmt);
}
}
// Close connection
mysqli_close($link);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
<link rel="stylesheet" href="bootstrap.css">
<style type="text/css">
body{ font: 14px sans-serif; }
.wrapper{ width: 350px; padding: 20px; }
</style>
</head>
<body>
<div class="wrapper">
<h2>Login</h2>
<p>Login with your hot-spot callsign.</p>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<div class="form-group <?php echo (!empty($callsign_err)) ? 'has-error' : ''; ?>">
<label>Username</label>
<input type="text" name="callsign" class="form-control" value="<?php echo $callsign; ?>">
<span class="help-block"><?php echo $callsign_err; ?></span>
</div>
<div class="form-group <?php echo (!empty($password_err)) ? 'has-error' : ''; ?>">
<label>Password</label>
<input type="password" name="password" class="form-control">
<span class="help-block"><?php echo $password_err; ?></span>
</div>
<div class="form-group">
<input type="submit" class="btn btn-primary" value="Login">
</div>
<p>Don't have an account? <a href="register.php">Sign up now</a>.</p>
</form>
</div>
</body>
</html>

@ -0,0 +1,14 @@
<?php
// Initialize the session
session_start();
// Unset all of the session variables
$_SESSION = array();
// Destroy the session.
session_destroy();
// Redirect to login page
header("location: login.php");
exit;
?>

@ -0,0 +1,148 @@
<?php
// Include config file
require_once "configure.php";
function IsValidCallsign(string $callsign)
{
$regex = '/^(([1-9][A-Z])|([A-PR-Z][0-9])|([A-PR-Z][A-Z][0-9]))[0-9A-Z]*[A-Z]$/';
$rval = preg_match($regex, $callsign);
if (FALSE === $rval)
die("trouble with callsign regular expression\n");
return $rval;
}
// Define variables and initialize with empty values
$callsign = $password = $confirm_password = "";
$callsign_err = $password_err = $confirm_password_err = "";
// Processing form data when form is submitted
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Validate callsign
if (empty(trim($_POST["callsign"]))) {
$callsign_err = "Please enter your callsign.";
} else if (strlen(trim($_POST["callsign"])) > 7) {
$callsign_err = "Callsign is too long.";
} else if (! IsValidCallsign(strtoupper(trim($_POST["callsign"])))) {
$callsign_err = "Not a valid callsign.";
} else {
// Prepare a select statement
$sql = "SELECT * FROM users WHERE callsign = ?";
if ($stmt = mysqli_prepare($link, $sql)) {
// Bind variables to the prepared statement as parameters
mysqli_stmt_bind_param($stmt, "s", $param_callsign);
// Set parameters
$param_callsign = strtoupper(trim($_POST["callsign"]));
// Attempt to execute the prepared statement
if (mysqli_stmt_execute($stmt)) {
/* store result */
mysqli_stmt_store_result($stmt);
if (mysqli_stmt_num_rows($stmt) == 1) {
$callsign_err = "This callsign is already taken.";
} else {
$callsign = strtoupper(trim($_POST["callsign"]));
}
} else {
echo "Oops! Something went wrong. Please try again later.";
}
// Close statement
mysqli_stmt_close($stmt);
}
}
// Validate password
if (empty(trim($_POST["password"]))) {
$password_err = "Please enter a password.";
} elseif (strlen(trim($_POST["password"])) < 6) {
$password_err = "Password must have atleast 6 characters.";
} else {
$password = trim($_POST["password"]);
}
// Validate confirm password
if (empty(trim($_POST["confirm_password"]))) {
$confirm_password_err = "Please confirm password.";
} else {
$confirm_password = trim($_POST["confirm_password"]);
if(empty($password_err) && ($password != $confirm_password)){
$confirm_password_err = "Password did not match.";
}
}
// Check input errors before inserting in database
if (empty($callsign_err) && empty($password_err) && empty($confirm_password_err)) {
// Prepare an insert statement
$sql = "INSERT INTO users (callsign, password) VALUES (?, ?)";
if ($stmt = mysqli_prepare($link, $sql)) {
// Bind variables to the prepared statement as parameters
mysqli_stmt_bind_param($stmt, "ss", $param_callsign, $param_password);
// Set parameters
$param_callsign = $callsign;
$param_password = password_hash($password, PASSWORD_DEFAULT); // Creates a password hash
// Attempt to execute the prepared statement
if (mysqli_stmt_execute($stmt)) {
// Redirect to login page
header("location: login.php");
} else {
echo "Something went wrong. Please try again later.";
}
// Close statement
mysqli_stmt_close($stmt);
}
}
// Close connection
mysqli_close($link);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hot-Spot Frequency for WiresX Registration</title>
<link rel="stylesheet" href="bootstrap.css">
<style type="text/css">
body{ font: 14px sans-serif; }
.wrapper{ width: 350px; padding: 20px; }
</style>
</head>
<body>
<div class="wrapper">
<h2>Sign Up</h2>
<p>Please fill this form to create an account. Use your hot-spot callsign to register.</p>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<div class="form-group <?php echo (!empty($callsign_err)) ? 'has-error' : ''; ?>">
<label>Your Callsign</label>
<input type="text" name="callsign" class="form-control" value="<?php echo $callsign; ?>">
<span class="help-block"><?php echo $callsign_err; ?></span>
</div>
<div class="form-group <?php echo (!empty($password_err)) ? 'has-error' : ''; ?>">
<label>Password</label>
<input type="password" name="password" class="form-control" value="<?php echo $password; ?>">
<span class="help-block"><?php echo $password_err; ?></span>
</div>
<div class="form-group <?php echo (!empty($confirm_password_err)) ? 'has-error' : ''; ?>">
<label>Confirm Password</label>
<input type="password" name="confirm_password" class="form-control" value="<?php echo $confirm_password; ?>">
<span class="help-block"><?php echo $confirm_password_err; ?></span>
</div>
<div class="form-group">
<input type="submit" class="btn btn-primary" value="Submit">
<input type="reset" class="btn btn-default" value="Reset">
</div>
<p>Already have an account? <a href="login.php">Login here</a>.</p>
</form>
</div>
</body>
</html>

@ -0,0 +1,106 @@
<?php
// Initialize the session
session_start();
// Check if the user is logged in, otherwise redirect to login page
if (!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true) {
header("location: login.php");
exit;
}
// Include config file
require_once "configure.php";
// Define variables and initialize with empty values
$new_password = $confirm_password = "";
$new_password_err = $confirm_password_err = "";
// Processing form data when form is submitted
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Validate new password
if (empty(trim($_POST["new_password"]))) {
$new_password_err = "Please enter the new password.";
} elseif (strlen(trim($_POST["new_password"])) < 6) {
$new_password_err = "Password must have atleast 6 characters.";
} else{
$new_password = trim($_POST["new_password"]);
}
// Validate confirm password
if (empty(trim($_POST["confirm_password"]))) {
$confirm_password_err = "Please confirm the password.";
} else {
$confirm_password = trim($_POST["confirm_password"]);
if (empty($new_password_err) && ($new_password != $confirm_password)) {
$confirm_password_err = "Password did not match.";
}
}
// Check input errors before updating the database
if (empty($new_password_err) && empty($confirm_password_err)) {
// Prepare an update statement
$sql = "UPDATE users SET password = ? WHERE callsign = ?";
if($stmt = mysqli_prepare($link, $sql)){
// Bind variables to the prepared statement as parameters
mysqli_stmt_bind_param($stmt, "ss", $param_password, $param_callsign);
// Set parameters
$param_password = password_hash($new_password, PASSWORD_DEFAULT);
$param_callsign = $_SESSION["callsign"];
// Attempt to execute the prepared statement
if(mysqli_stmt_execute($stmt)){
// Password updated successfully. Destroy the session, and redirect to login page
session_destroy();
header("location: login.php");
exit();
} else{
echo "Oops! Something went wrong. Please try again later.";
}
// Close statement
mysqli_stmt_close($stmt);
}
}
// Close connection
mysqli_close($link);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Reset Password</title>
<link rel="stylesheet" href="bootstrap.css">
<style type="text/css">
body{ font: 14px sans-serif; }
.wrapper{ width: 350px; padding: 20px; }
</style>
</head>
<body>
<div class="wrapper">
<h2>Reset Password</h2>
<p>Please fill out this form to reset your password.</p>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<div class="form-group <?php echo (!empty($new_password_err)) ? 'has-error' : ''; ?>">
<label>New Password</label>
<input type="password" name="new_password" class="form-control" value="<?php echo $new_password; ?>">
<span class="help-block"><?php echo $new_password_err; ?></span>
</div>
<div class="form-group <?php echo (!empty($confirm_password_err)) ? 'has-error' : ''; ?>">
<label>Confirm Password</label>
<input type="password" name="confirm_password" class="form-control">
<span class="help-block"><?php echo $confirm_password_err; ?></span>
</div>
<div class="form-group">
<input type="submit" class="btn btn-primary" value="Submit">
<a class="btn btn-link" href="finish.php">Cancel</a>
</div>
</form>
</div>
</body>
</html>
Loading…
Cancel
Save

Powered by TurnKey Linux.