Provide secured frontend access to secured backend

Co-authored-by: dudleycu <dudleyc.twitch@gmail.com>
master
Joshua Sigona 3 years ago
parent 47e0bc7458
commit 9f020d4ae8
  1. 101
      src/App.js

@ -451,7 +451,7 @@ function TableEditor(p) {
function SubmitBoxes() { function SubmitBoxes() {
if (!lockSubmission) { if (!lockSubmission) {
setLockSubmission(true) setLockSubmission(true)
axios.post(p.BACKENDURL+p.path,submitVals) axios.post(p.BACKENDURL+p.path,{...submitVals,pass:p.password})
.then(()=>{ .then(()=>{
setSubmitVal("Clear") setSubmitVal("Clear")
setUpdate(true) setUpdate(true)
@ -476,7 +476,7 @@ function TableEditor(p) {
useEffect(()=>{ useEffect(()=>{
var promises=[] var promises=[]
parse(fileData,{columns:true,skip_empty_lines:true}).forEach((entry)=>{ parse(fileData,{columns:true,skip_empty_lines:true}).forEach((entry)=>{
promises.push(axios.post(p.BACKENDURL+p.path,entry)) promises.push(axios.post(p.BACKENDURL+p.path,{...entry,pass:p.password}))
}) })
Promise.allSettled(promises) Promise.allSettled(promises)
.then(()=>{ .then(()=>{
@ -497,7 +497,7 @@ function TableEditor(p) {
if (update) { if (update) {
setLoading(true) setLoading(true)
var dependency_map = {} var dependency_map = {}
axios.get(p.BACKENDURL+p.path) axios.get(p.BACKENDURL+p.path+"?pass="+p.password)
.then((data)=>{ .then((data)=>{
var cols = data.data.fields var cols = data.data.fields
var rows = data.data.rows var rows = data.data.rows
@ -507,7 +507,7 @@ function TableEditor(p) {
var promise_list = [] var promise_list = []
cols.filter((col)=>col.name!=="id"&&col.name.includes("_id")).forEach((col)=>{ cols.filter((col)=>col.name!=="id"&&col.name.includes("_id")).forEach((col)=>{
promise_list.push(axios.get(p.BACKENDURL+"/"+col.name.replace("_id","")) promise_list.push(axios.get(p.BACKENDURL+"/"+col.name.replace("_id","")+"?pass="+p.password)
.then((data)=>{ .then((data)=>{
dependency_map[col.name]=data.data.rows.sort((a,b)=>b.id-a.id) dependency_map[col.name]=data.data.rows.sort((a,b)=>b.id-a.id)
})) }))
@ -544,11 +544,12 @@ function TableEditor(p) {
{<tr><td></td>{fields.map((col,i)=><td key={i}>{<InputBox includeBlankValue={true} data={dependencies[col.name]} callback4={ {<tr><td></td>{fields.map((col,i)=><td key={i}>{<InputBox includeBlankValue={true} data={dependencies[col.name]} callback4={
(f)=>{setSubmitVal({field:col.name,value:f});}}/>}</td>)}<input style={{position:'absolute',top:"-1000px"}}/><PlusCircle onClick={()=>{SubmitBoxes()}} className="submitbutton"/></tr>} (f)=>{setSubmitVal({field:col.name,value:f});}}/>}</td>)}<input style={{position:'absolute',top:"-1000px"}}/><PlusCircle onClick={()=>{SubmitBoxes()}} className="submitbutton"/></tr>}
{data.map((dat)=><tr key={dat.id}> {data.map((dat)=><tr key={dat.id}>
<td><XSquareFill className="webicon" onClick={()=>{axios.delete(p.BACKENDURL+p.path,{data:{id:dat.id}}).then(()=>{setUpdate(true)}).catch((err)=>{alert(err.response.data)})}}/></td>{fields.map((col,i)=><td key={dat.id+"_"+i} className="table-padding table"> <td><XSquareFill className="webicon" onClick={()=>{axios.delete(p.BACKENDURL+p.path,{data:{id:dat.id,pass:p.password}}).then(()=>{setUpdate(true)}).catch((err)=>{alert(err.response.data)})}}/></td>{fields.map((col,i)=><td key={dat.id+"_"+i} className="table-padding table">
<InputBox lockSubmission={lockSubmission} data={dependencies[col.name]} callback={(value)=>{ <InputBox lockSubmission={lockSubmission} data={dependencies[col.name]} callback={(value)=>{
return axios.patch(p.BACKENDURL+p.path,{ return axios.patch(p.BACKENDURL+p.path,{
[col.name]:value, [col.name]:value,
id:dat.id id:dat.id,
pass:p.password
}) })
}} value={String(dat[col.name])}/></td>)}</tr>)} }} value={String(dat[col.name])}/></td>)}</tr>)}
</tbody> </tbody>
@ -565,7 +566,7 @@ function DatabaseEditor(p) {
useEffect(()=>{ useEffect(()=>{
if (update) { if (update) {
axios.get(p.BACKENDURL+"/databases") axios.get(p.BACKENDURL+"/databases?pass="+p.password)
.then((data)=>{ .then((data)=>{
setDatabases(data.data) setDatabases(data.data)
}) })
@ -584,7 +585,7 @@ function DatabaseEditor(p) {
<button className="basichover" style={{backgroundColor:"navy"}} onClick={()=>{ <button className="basichover" style={{backgroundColor:"navy"}} onClick={()=>{
setLoading(true) setLoading(true)
setMessage(<span style={{color:"black"}}>Uploading Test Database to Production...</span>) setMessage(<span style={{color:"black"}}>Uploading Test Database to Production...</span>)
axios.post(p.BACKENDURL+"/databases/testtolive") axios.post(p.BACKENDURL+"/databases/testtolive",{pass:p.password})
.then(()=>{ .then(()=>{
setMessage(<span style={{color:"green"}}>Success! Test Database is now live!</span>) setMessage(<span style={{color:"green"}}>Success! Test Database is now live!</span>)
}) })
@ -598,7 +599,7 @@ function DatabaseEditor(p) {
<button className="basichover" style={{backgroundColor:"maroon"}} onClick={()=>{ <button className="basichover" style={{backgroundColor:"maroon"}} onClick={()=>{
setLoading(true) setLoading(true)
setMessage(<span style={{color:"black"}}>Restoring Test Database using Live Database...</span>) setMessage(<span style={{color:"black"}}>Restoring Test Database using Live Database...</span>)
axios.post(p.BACKENDURL+"/databases/livetotest") axios.post(p.BACKENDURL+"/databases/livetotest",{pass:p.password})
.then(()=>{ .then(()=>{
setMessage(<span style={{color:"green"}}>Success! Live Database has been applied to the Test Database!</span>) setMessage(<span style={{color:"green"}}>Success! Live Database has been applied to the Test Database!</span>)
}) })
@ -612,7 +613,7 @@ function DatabaseEditor(p) {
<button className="basichover" style={{backgroundColor:"darkgreen"}} onClick={()=>{ <button className="basichover" style={{backgroundColor:"darkgreen"}} onClick={()=>{
setLoading(true) setLoading(true)
setMessage(<span style={{color:"black"}}>Backing up the Live database...</span>) setMessage(<span style={{color:"black"}}>Backing up the Live database...</span>)
axios.post(p.BACKENDURL+"/databases/backup") axios.post(p.BACKENDURL+"/databases/backup",{pass:p.password})
.then(()=>{ .then(()=>{
setMessage(<span style={{color:"green"}}>Success! Live Database has been saved!</span>) setMessage(<span style={{color:"green"}}>Success! Live Database has been saved!</span>)
}) })
@ -641,7 +642,8 @@ function DatabaseEditor(p) {
onClick={()=>{ onClick={()=>{
setLoading(true) setLoading(true)
axios.post(p.BACKENDURL+"/databases/restorefrombackup",{ axios.post(p.BACKENDURL+"/databases/restorefrombackup",{
database:db.datname database:db.datname,
pass:p.password
}) })
.then((data)=>{ .then((data)=>{
setMessage(<span style={{color:"green"}}>{"Success! Database has been set to the state from "+date}</span>) setMessage(<span style={{color:"green"}}>{"Success! Database has been set to the state from "+date}</span>)
@ -661,8 +663,29 @@ function DatabaseEditor(p) {
} }
function AdminPanel(p) { function AdminPanel(p) {
const [verified,setVerified] = useState(false)
const [password,setPassword] = useState("")
return <div className="main"> return <div className="main">
<div className="w-25"><Box title="Navigation"> {!verified?
<div className="w-75">
<img src={process.env.PUBLIC_URL+"/spinner.gif"} alt=""/>
<input type="password" value={password} onChange={(f)=>{setPassword(f.currentTarget.value)}} onKeyDown={(e)=>{
if (e.key==="Enter") {
axios.post(GetBackendURL(p)+"/passwordcheck",{
pass:password
})
.then((data)=>{
if (data.data.verified) {
setVerified(data.data.verified)
}
})
.catch((err)=>{
setVerified(false)
setPassword("")
})}}}></input>
<img src={process.env.PUBLIC_URL+"/spinner.gif"} alt=""/>
</div>:<>
<div className="w-25"><Box title="Navigation">
<Table classes="adminNav"> <Table classes="adminNav">
<Link to={process.env.PUBLIC_URL+"/admin/class"}>Class</Link><br/> <Link to={process.env.PUBLIC_URL+"/admin/class"}>Class</Link><br/>
<Link to={process.env.PUBLIC_URL+"/admin/classdata"}>Class Data</Link><br/> <Link to={process.env.PUBLIC_URL+"/admin/classdata"}>Class Data</Link><br/>
@ -705,82 +728,82 @@ function AdminPanel(p) {
</Table></Box></div> </Table></Box></div>
<div className="w-75"> <div className="w-75">
<Route path={process.env.PUBLIC_URL+"/admin/class"}> <Route path={process.env.PUBLIC_URL+"/admin/class"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/class"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/class"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/classdata"}> <Route path={process.env.PUBLIC_URL+"/admin/classdata"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/class_level_data"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/class_level_data"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/classweaponcompatibility"}> <Route path={process.env.PUBLIC_URL+"/admin/classweaponcompatibility"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/class_weapon_type_data"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/class_weapon_type_data"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/photonarts"}> <Route path={process.env.PUBLIC_URL+"/admin/photonarts"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/photon_art"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/photon_art"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/weapons"}> <Route path={process.env.PUBLIC_URL+"/admin/weapons"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/weapon"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/weapon"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/weaponexistencedata"}> <Route path={process.env.PUBLIC_URL+"/admin/weaponexistencedata"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/weapon_existence_data"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/weapon_existence_data"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/weapontypes"}> <Route path={process.env.PUBLIC_URL+"/admin/weapontypes"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/weapon_type"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/weapon_type"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/armor"}> <Route path={process.env.PUBLIC_URL+"/admin/armor"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/armor"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/armor"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/potentials"}> <Route path={process.env.PUBLIC_URL+"/admin/potentials"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/potential"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/potential"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/potentialdata"}> <Route path={process.env.PUBLIC_URL+"/admin/potentialdata"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/potential_data"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/potential_data"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/builds"}> <Route path={process.env.PUBLIC_URL+"/admin/builds"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/builds"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/builds"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/skills"}> <Route path={process.env.PUBLIC_URL+"/admin/skills"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/skill"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/skill"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/skilltypes"}> <Route path={process.env.PUBLIC_URL+"/admin/skilltypes"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/skill_type"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/skill_type"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/skilldata"}> <Route path={process.env.PUBLIC_URL+"/admin/skilldata"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/skill_data"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/skill_data"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/classskills"}> <Route path={process.env.PUBLIC_URL+"/admin/classskills"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/class_skill"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/class_skill"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/classskilldata"}> <Route path={process.env.PUBLIC_URL+"/admin/classskilldata"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/class_skill_data"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/class_skill_data"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/augments"}> <Route path={process.env.PUBLIC_URL+"/admin/augments"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/augment"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/augment"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/augmenttypes"}> <Route path={process.env.PUBLIC_URL+"/admin/augmenttypes"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/augment_type"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/augment_type"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/enemydata"}> <Route path={process.env.PUBLIC_URL+"/admin/enemydata"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/enemy_data"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/enemy_data"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/food"}> <Route path={process.env.PUBLIC_URL+"/admin/food"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/food"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/food"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/foodmultipliers"}> <Route path={process.env.PUBLIC_URL+"/admin/foodmultipliers"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/food_mult"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/food_mult"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/roles"}> <Route path={process.env.PUBLIC_URL+"/admin/roles"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/roles"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/roles"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/users"}> <Route path={process.env.PUBLIC_URL+"/admin/users"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/users"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/users"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/database_audit"}> <Route path={process.env.PUBLIC_URL+"/admin/database_audit"}>
<TableEditor BACKENDURL={GetBackendURL(p)} path="/database_audit"/> <TableEditor password={password} BACKENDURL={GetBackendURL(p)} path="/database_audit"/>
</Route> </Route>
<Route path={process.env.PUBLIC_URL+"/admin/database_manager"}> <Route path={process.env.PUBLIC_URL+"/admin/database_manager"}>
<DatabaseEditor BACKENDURL={GetBackendURL(p)}/> <DatabaseEditor password={password} BACKENDURL={GetBackendURL(p)}/>
</Route> </Route>
</div> </div></>}
</div> </div>
} }
function EditStatBox(p) { function EditStatBox(p) {

Loading…
Cancel
Save