Create login logic

This commit is contained in:
zontreck 2024-05-16 02:03:39 -07:00
parent 68e0312c84
commit ad4b7fc4e7
9 changed files with 188 additions and 14 deletions

View file

@ -8,7 +8,7 @@ class Constants {
static const DRAWER_COLOR = Color.fromARGB(148, 0, 97, 97); static const DRAWER_COLOR = Color.fromARGB(148, 0, 97, 97);
static const PORTFOLIO_CARD_COLOR = Color.fromARGB(255, 0, 71, 97); static const PORTFOLIO_CARD_COLOR = Color.fromARGB(255, 0, 71, 97);
static const VERSION = "Version 1.0.051524.2243"; static const VERSION = "Version 1.0.051624.0201";
static const COPYRIGHT = "Copyright 2024 - Tara Piccari. All rights Reserved"; static const COPYRIGHT = "Copyright 2024 - Tara Piccari. All rights Reserved";
static const CLIENTPSK = static const CLIENTPSK =
"f5c6caf3efe1ec5aa4b7c572f92aa14782b7be34b4c7844fa9c6d47fdf94246"; "f5c6caf3efe1ec5aa4b7c572f92aa14782b7be34b4c7844fa9c6d47fdf94246";

View file

@ -1,5 +1,8 @@
import 'dart:convert'; import 'dart:convert';
import 'package:libac_flutter/utils/Hashing.dart';
import 'package:zontreck/pages/OpenSim.dart';
import 'Settings.dart'; import 'Settings.dart';
abstract class IPacket { abstract class IPacket {
@ -243,3 +246,66 @@ class C2SRegisterAccountPacket implements IPacket {
clientKey: map['clientKey'] as String); clientKey: map['clientKey'] as String);
} }
} }
class C2SLoginPacket implements IPacket {
final String first;
final String last;
final String password;
C2SLoginPacket(
{required this.first, required this.last, required this.password});
@override
HTTPMethod method() {
return HTTPMethod.Post;
}
@override
String getType() {
return "C2SLogin";
}
@override
String encode() {
return json.encode({
"first": first,
"last": last,
"type": getType(),
"password": Hashing.md5Hash(password)
});
}
}
class S2CLoginResponsePacket implements IPacket {
final bool loggedIn;
final String reason;
final User user;
S2CLoginResponsePacket(
{required this.loggedIn, required this.reason, required this.user});
@override
HTTPMethod method() {
return HTTPMethod.Get;
}
@override
String getType() {
return "S2CLoginResponse";
}
@override
String encode() {
return json
.encode({"type": getType(), "login": loggedIn, "reason": reason});
}
static S2CLoginResponsePacket decode(String params) {
var map = json.decode(params);
// Proceed now to constructing PODO
return S2CLoginResponsePacket(
loggedIn: map['login'] as bool,
reason: map['reason'] as String,
user: User.parseJson(json.encode(map['user'])));
}
}

View file

@ -136,6 +136,12 @@ class Settings {
S2CPongPacket pong = S2CPongPacket.decode(reply); S2CPongPacket pong = S2CPongPacket.decode(reply);
return pong; return pong;
} }
case "S2CLoginResponse":
{
S2CLoginResponsePacket response =
S2CLoginResponsePacket.decode(reply);
return response;
}
default: default:
{ {
return NullPacket(); return NullPacket();

View file

@ -1,10 +1,42 @@
import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:footer/footer.dart'; import 'package:footer/footer.dart';
import 'package:footer/footer_view.dart'; import 'package:footer/footer_view.dart';
import 'package:libac_flutter/utils/uuid/UUID.dart';
import 'package:zontreck/Constants.dart'; import 'package:zontreck/Constants.dart';
import 'package:zontreck/Packets.dart'; import 'package:zontreck/Packets.dart';
import 'package:zontreck/Settings.dart'; import 'package:zontreck/Settings.dart';
class User {
UUID ID;
String FirstName;
String LastName;
int createdAt;
String userTitle;
bool active;
User(
{required this.ID,
required this.FirstName,
required this.LastName,
required this.createdAt,
required this.userTitle,
required this.active});
static User parseJson(String params) {
var map = json.decode(params);
return User(
ID: UUID.parse(map['id'] as String),
FirstName: map['first'] as String,
LastName: map['last'] as String,
createdAt: map['rezzed'] as int,
userTitle: map['title'] as String,
active: map['active'] as bool);
}
}
class OpenSimPage extends StatefulWidget { class OpenSimPage extends StatefulWidget {
const OpenSimPage({super.key}); const OpenSimPage({super.key});

View file

@ -41,8 +41,6 @@ function rewriteSystemInclude($psk, $clientPSK)
if(file_exists("../database.user.php")) if(file_exists("../database.user.php"))
require("../database.user.php"); require("../database.user.php");
else
require("Database.php");
if(file_exists("../system.user.php")) if(file_exists("../system.user.php"))
require("../system.user.php"); require("../system.user.php");

View file

@ -1,8 +0,0 @@
<?php
define("DB_HOST", "localhost");
define("DB_USER", "root");
define("DB_PASS", "changeme");
define("DB_NAME", "changeme");
?>

View file

@ -6,11 +6,85 @@ if(!defined("COMMON"))
$js = getJsonizedInput(); $js = getJsonizedInput();
// Read login parameters // Read login parameters
$username = $js["username"]; $first = $js['first'];
$last = $js['last'];
$password = $js["password"]; $password = $js["password"];
// Password is hashed // Password is hashed
// Compare against hash in database + : md5(salt) // Compare against hash in database + : md5(salt)
$DB = get_DB(); $DB = get_DB();
$clientKey = $js['clientKey'];
if($clientKey == CLIENTPSK) {
// PSK Matches, authorized application
$res = $DB->query("SELECT * FROM `UserAccounts` INNER JOIN `auth` ON `UserAccounts`.`PrincipalID` = `auth`.`UUID` WHERE `FirstName` = '$first' AND `LastName` = '$last';");
/*
*
return User(
ID: UUID.parse(map['id'] as String),
FirstName: map['first'] as String,
LastName: map['last'] as String,
createdAt: map['rezzed'] as int,
userTitle: map['title'] as String);
return S2CLoginResponsePacket(
loggedIn: map['login'] as bool,
reason: map['reason'] as String,
user: User.parseJson(json.encode(map['user'])));
*/
$id = NULLKEY;
$first = "";
$last = "";
$rezday = 0;
$title = "";
$login = false;
$reason = "Invalid password";
$active = false;
if($res->num_rows > 0) {
$row = $res->fetch_assoc();
$pwSalt = $row['passwordSalt'];
$pwHash = $row['passwordHash'];
if(md5($password.":" . $pwSalt) == $pwHash) {
// Login Success
$_SESSION['login'] = "1";
$id = $row['UUID'];
$first = $row['FirstName'];
$last = $row['LastName'];
$rezday = $row['createdAt'];
$title = $row['UserTitle'];
$active = $row['active'] == 1;
$reason = "success";
$login=true;
}
}
else {
$reason = "No such user";
}
die(json_encode(
array(
"login" => $login,
"reason" => $reason,
"type" => "S2CLoginResponse",
"user" => array(
"id" => $id,
"first" => $first,
"last" => $last,
"title" => $title,
"rez" => $rezday,
"active" => $active
)
)
));
} else {
die(json_encode(array(
"login" => false,
"reason" => "Unauthorized",
"type" => "S2CLoginResponse"
)));
}
?> ?>

View file

@ -26,7 +26,13 @@ if($clientKey == CLIENTPSK) {
$DB->query("INSERT INTO `UserAccounts` (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created, UserLevel, UserFlags, UserTitle, active) VALUES ('$ID', '".NULLKEY."', '$first', '$last', '$email', '', '".time()."', '$level', '0', '$title', '0');"); $DB->query("INSERT INTO `UserAccounts` (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created, UserLevel, UserFlags, UserTitle, active) VALUES ('$ID', '".NULLKEY."', '$first', '$last', '$email', '', '".time()."', '$level', '0', '$title', '0');");
die(json_encode(array("done"=>true, "type"=> "S2CSimpleReply"))); die(
json_encode(
array(
"done"=>true,
"type"=> "S2CSimpleReply"
)
));
}else { }else {

View file

@ -3,7 +3,7 @@
if(!defined("COMMON")) if(!defined("COMMON"))
require("Common.php"); require("Common.php");
if(DB_NAME == "changeme" && DB_PASS == "changeme") { if(!defined("DB_NAME") && !defined("DB_PASS")) {
$ret = array ( $ret = array (
"done" => false, "done" => false,
"type" => "S2CSimpleReply" "type" => "S2CSimpleReply"