Compare commits

..

15 Commits
DEV_5 ... main

Author SHA1 Message Date
f921d1fe75 Correct Sidebar
All checks were successful
Neutral/pipeline/head This commit looks good
2023-06-10 21:13:34 +02:00
46bc7f0013 Correct Sidebar
Some checks failed
Neutral/pipeline/head There was a failure building this commit
2023-06-10 21:11:25 +02:00
21dc689c9a Correct Sidebar
Some checks failed
Neutral/pipeline/head There was a failure building this commit
2023-06-10 21:08:53 +02:00
98d62e6883 Remove useless stuff
All checks were successful
Neutral/pipeline/head This commit looks good
2023-06-10 21:04:42 +02:00
e3a1db5200 Restore Neutral
All checks were successful
Neutral/pipeline/head This commit looks good
2023-04-28 22:36:23 +02:00
4243d6e651 Implement MultiToken
All checks were successful
Neutral/pipeline/head This commit looks good
2023-04-01 16:48:13 +02:00
f056db13d8 Edit Photos for CV Editor
All checks were successful
Neutral/pipeline/head This commit looks good
2023-03-29 21:22:53 +02:00
43bf4c0baa Final Improvement for CV Editor #3
All checks were successful
Neutral/pipeline/head This commit looks good
2023-03-29 18:59:58 +02:00
ee51c4fe8a Final Improvement for CV Editor #2
All checks were successful
Neutral/pipeline/head This commit looks good
2023-03-29 18:53:18 +02:00
eafa16e46d Final Improvement for CV Editor
All checks were successful
Neutral/pipeline/head This commit looks good
2023-03-29 18:48:39 +02:00
12b340e0f1 Improve CV Editor + Fixe
Some checks reported errors
Neutral/pipeline/head Something is wrong with the build of this commit
2023-03-29 18:13:13 +02:00
353746b3d4 Final Fix CV EDITOR
All checks were successful
Neutral/pipeline/head This commit looks good
2023-03-27 22:08:44 +02:00
9982f1f1bf Fix CV EDITOR
All checks were successful
Neutral/pipeline/head This commit looks good
2023-03-27 22:03:55 +02:00
88ce85c422 Edit Markdown Folder Directory
All checks were successful
Neutral/pipeline/head This commit looks good
2023-03-27 21:59:44 +02:00
74c5342633 First Upload of DEV_6
All checks were successful
Neutral/pipeline/head This commit looks good
2023-03-27 21:55:47 +02:00
21 changed files with 1641 additions and 62 deletions

1
Jenkinsfile vendored
View File

@ -19,7 +19,6 @@ pipeline {
steps {
script {
def doesJavaRock = input(message: 'Confirmation de Déploiement', ok: 'Déployer')
echo "[Neutral-Deploy] - Deploy Stage"
sh "ssh raphix@raphix.fr sudo apt update -y"
sh "ssh raphix@raphix.fr sudo apt upgrade -y"

3
app.js
View File

@ -21,6 +21,8 @@ var userManagerRouter = require('./routes/usermanager');
var linkRouter = require('./routes/link');
var fileRouter = require("./routes/filemanager")
var downloadRouter = require("./routes/download")
var cvRouter = require("./routes/cv")
var app = express();
@ -49,6 +51,7 @@ app.use('/usermanager', userManagerRouter)
app.use('/link', linkRouter)
app.use("/filemanager", fileRouter)
app.use("/download", downloadRouter)
app.use("/cv", cvRouter)
// catch 404 and forward to error handler

View File

@ -31,10 +31,7 @@ module.exports.createUser = (name, password, level, fullname) => {
"uuid": userUUID,
"fullname": fullname,
"permissionLevel":level,
"token":{
},
"tokens":{},
"lastconnexion":0
}
@ -88,7 +85,7 @@ module.exports.deleteToken = (username) => {
const userData = JSON.parse(fs.readFileSync(__dirname + path.sep + "users" + path.sep + this.getUUID(username) + ".json", 'utf-8'))
userData.token = {}
userData.tokens = {}
fs.writeFileSync(__dirname + path.sep + "users" + path.sep + this.getUUID(username) + ".json", JSON.stringify(userData, null, 2))
@ -111,13 +108,13 @@ module.exports.checkToken = (req, res) => {
fs.writeFileSync(__dirname + path.sep + "users" + path.sep + userData.uuid + ".json", JSON.stringify(userData, null, 2))
if(userData.token.livableToken == true) {
if(userData.tokens[req.cookies.tokenID].livableToken == true) {
const checkTokenData = {"name":user, "permLevel": userData.permissionLevel, "fullname":userData.fullname, "lastconnexion":userData.lastconnexion};
return checkTokenData;
} else {
const tokenDate = new Date(userData.token.createdAt)
const tokenDate = new Date(userData.tokens[req.cookies.tokenID].createdAt)
const nowDate = new Date(Date.now())
if(tokenDate.getDay() == nowDate.getDay() && tokenDate.getMonth() == nowDate.getMonth()) {
@ -126,7 +123,10 @@ module.exports.checkToken = (req, res) => {
return checkTokenData;
} else {
this.clearSpecificCookie(req.cookies.tokenID);
res.clearCookie('tokenID');
const checkTokenData = {"name":false}
return checkTokenData;
@ -143,6 +143,43 @@ module.exports.checkToken = (req, res) => {
}
module.exports.clearSpecificCookie = (token) => {
const tokens = this.getAllToken()
const user = tokens.get(token)
const users = this.getUsers()
const userData = JSON.parse(fs.readFileSync(__dirname + path.sep + "users" + path.sep + users.get(user) + ".json", 'utf-8'))
userData["tokens"].token = null;
fs.writeFileSync(__dirname + path.sep + "users" + path.sep + userData.uuid + ".json", JSON.stringify(userData, null, 2))
}
module.exports.clearCookies = (token) => {
const tokens = this.getAllToken()
const user = tokens.get(token)
const users = this.getUsers()
const userData = JSON.parse(fs.readFileSync(__dirname + path.sep + "users" + path.sep + users.get(user) + ".json", 'utf-8'))
userData["tokens"] = {};
fs.writeFileSync(__dirname + path.sep + "users" + path.sep + userData.uuid + ".json", JSON.stringify(userData, null, 2))
}
module.exports.getFullName = (username) => {
@ -166,19 +203,13 @@ module.exports.generateTokenID = (username, userData, req, users) => {
livable = true;
}
Object.defineProperties(newUserData, {
token: {
value: {
newUserData.tokens[tokenID] = {
"tokenID":tokenID,
"livableToken": livable,
"createdAt": date
},
writable: true
}
})
fs.writeFileSync(__dirname + path.sep + "users" + path.sep + users.get(username) + ".json", JSON.stringify(newUserData, null, 2))
return tokenID
@ -204,7 +235,13 @@ module.exports.getAllToken = () => {
fs.readdirSync(__dirname + path.sep + "users").forEach(file => {
const fileData = JSON.parse(fs.readFileSync(__dirname + path.sep + "users" + path.sep + file, 'utf-8'))
token.set(fileData.token.tokenID, fileData.username)
for(var tokenIDs of Object.keys(fileData.tokens)) {
token.set(fileData.tokens[tokenIDs].tokenID, fileData.username)
console.log(token)
}
})

View File

@ -1,6 +1,6 @@
{
"name": "neutral",
"version": "DEV_5",
"version": "DEV_6",
"private": true,
"nodemonConfig": {
"ext": "js, html",

View File

@ -1,5 +1,3 @@
const account = document.getElementById("account")
const menu = document.getElementById("accmenu")
const sidebar = document.getElementById("sidebar")
@ -145,6 +143,7 @@ const b4 = document.getElementById("s-moni")
const b5 = document.getElementById("s-device")
const b6 = document.getElementById("s-cv")
const b7 = document.getElementById("s-link")
const b8 = document.getElementById("s-admin")
const settings = document.getElementById("settingsBtn")
b1.addEventListener("click", () => {
@ -183,6 +182,11 @@ b7.addEventListener("click", () => {
})
b8.addEventListener("click", () => {
getPage("panel.html")
})
settings.addEventListener("click", () => {
getPage("settings.html")

View File

@ -273,6 +273,12 @@ body {
overflow:scroll;
overflow-x:hidden;
}
.sidebar:hover .d-content {
margin-left: 15%;
}
.sidecontent{
@ -299,7 +305,11 @@ body {
display: flex;
justify-content: start;
flex-direction: column;
gap: 1vw;
}
.sidebar:hover .middle{
gap: 0;
}
.sidebar:hover .middle {
@ -316,7 +326,7 @@ body {
text-align: unset;
padding-top: 5%;
padding-left: 30%;
padding-left: 10%;
}
.sidebar-footer {
@ -358,6 +368,8 @@ body {
-webkit-user-select: none; /* Chrome, Safari, Opéra depuis la version 15 */
-ms-user-select: none; /* Internet explorer depuis la version 10 et Edge */
user-select: none; /* Propriété standard */
margin-left: 2%;
text-align: center;
}
.username {
@ -398,9 +410,9 @@ body {
.sidebar-item {
transition: all 0.2s ease 0s;
padding: 5%;
margin-top: 5%;
margin-bottom: 5%;
padding: 10%;
width: 100%;
}
.sidebar-item:hover {

852
public/templates/cv.html Normal file
View File

@ -0,0 +1,852 @@
<div class="home">
<h1>Mon CV</h1>
</br>
<div class="homepanel">
<div class="row w-100">
<div class="hbox col-lg">
<h1><i class="fas fa-puzzle-piece"></i> Sections</h1>
<div class="cv-sections">
<div class="row w-100">
<select id="cv-section-selector" class="cv-selector">
<option>Qui suis-je ?</option>
<option>Contact</option>
<option>Formations</option>
<option>Diplomes & Certifications</option>
<option>Passions et activités</option>
<option>Ma recherche de stage</option>
</select>
</div>
<div class="row w-100">
<textarea id="cv-section-textarea" class="cv-textarea">
</textarea>
</div>
<div class="row w-100">
<button id="cv-section-save" class="cv-save col-lg-2"><i class="fa fa-save"></i> Sauvegarder</button>
</div>
<div class="row w-100">
<p id="cv-section-info" class="cv-info" style="color:rgb(255, 48, 48)"></p>
</div>
</div>
</div>
<div class="hbox col-lg">
<h1><i class="fa fa-gear"></i> Projets</h1>
<div class="cv-sections">
<div class="row w-100">
<select id="cv-project-selector" class="col-lg-10 cv-selector">
</select>
<button id="cv-project-add" class="col-lg-1 cv-plus"><i class="fa fa-plus"></i></button>
</div>
<div class="row w-100">
<textarea id="cv-project-textarea" class="cv-textarea">
</textarea>
</div>
<div class="row cv-upload-section">
<p class="col-lg-8" style="font-size: 14px;">Image : <span id="cv-m-upload-name">Aucune image !</span></p>
<button id="cv-m-upload-btn" style="margin-left: 10%;" class="col-lg-2 cv-upload"><i class="fa fa-upload"></i> Upload</button>
<input id='cv-m-upload-file' type='file' hidden/>
</div>
<div class="row w-100">
<button id="cv-project-save" class="cv-save col-lg-2"><i class="fa fa-save"></i> Sauvegarder</button>
<button id="cv-project-del" class="cv-del col-lg-2"><i class="fa fa-trash"></i> Effacer</button>
</div>
<div class="row w-100">
<p id="cv-project-info" class="cv-info" style="color:rgb(255, 48, 48)"></p>
</div>
</div>
</div>
</div>
<div class="row w-100">
<div class="hbox col-lg">
<h1><i class="fa fa-signal"></i> Statistiques</h1>
<p>Coming soon ...</p>
</div>
</div>
</div>
</div>
<dialog class="cv_addproject" id="cv-project-dialog">
<h1><i class="fa fa-project-diagram"></i> Créer un projet</h1>
<p>Nom du projet :</p>
<input class="inp" id="cv-project-add-input" type="text">
<div style="color: rgb(255, 76, 76);" id="cv-project-add-info"></div>
</div>
<div class="cv-upload-section">
<p style="font-size: 14px;">Image : <span id="cv-upload-name">NULL_NAME</span> <button id="cv-upload-btn" style="margin-left: 10%;" class="cv-upload"><i class="fa fa-upload"></i> Upload</button></p>
<input id='cv-upload-file' type='file' hidden/>
</div>
<button onclick="getPage('cv.html')" id="cv-project-add-close" class="cv_add_close">Annuler</button>
<button id="cv-project-add-confirm" class="cv_add_confirm">Ajouter</button>
</dialog>
<script>
if(typeof checkDelare == "undefined") {
const checkDelare = true;
const sectionTextArea = document.getElementById("cv-section-textarea")
const sectionSelector = document.getElementById("cv-section-selector")
const sectionSave = document.getElementById("cv-section-save")
const sectionInfo = document.getElementById("cv-section-info")
const projectTextArea = document.getElementById("cv-project-textarea")
const projectSelector = document.getElementById("cv-project-selector")
const projectSave = document.getElementById("cv-project-save")
const projectInfo = document.getElementById("cv-project-info")
const projectDelete = document.getElementById("cv-project-del")
const projectAdd = document.getElementById("cv-project-add")
const projectDialog = document.getElementById("cv-project-dialog")
const projectAddInput = document.getElementById("cv-project-add-input")
const projectAddConfirm = document.getElementById("cv-project-add-confirm")
const projectAddInfo = document.getElementById("cv-project-add-info")
const projectUploadFile = document.getElementById("cv-upload-file")
const projectUploadBtn = document.getElementById("cv-upload-btn")
const projectUploadName = document.getElementById("cv-upload-name")
const eprojectUploadFile = document.getElementById("cv-m-upload-file")
const eprojectUploadBtn = document.getElementById("cv-m-upload-btn")
const eprojectUploadName = document.getElementById("cv-m-upload-name")
var sectionSelectedMD = null;
var projectSelectedMD = null;
loadText(sectionTextArea, "WHOAMI")
getProjects(projectSelector)
projectAddConfirm.addEventListener("click", () => {
projectAddInfo.innerHTML = ""
const refusedChar = ['\\','/' ,':' ,'*','?' ,'"','<','>','|']
var wrongName = true;
for(var char of refusedChar) {
console.log(wrongName)
if(projectAddInput.value.includes(char)) {
wrongName = false;
}
}
if(wrongName == true && projectAddInput.value != "" && projectAddInput.value != "WHOAMI" && projectAddInput.value != "CONTACT" && projectAddInput.value != "FORMATION" && projectAddInput.value != "DIPLOME" && projectAddInput.value != "LOBBIES" && projectAddInput.value != "FIND") {
fetch('/cv', {
method: 'POST',
redirect: 'follow',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({"request":"add", "value": projectAddInput.value})
})
.then(response => response.json())
.then(response => res(response))
function res(response) {
if(response.result == "failed") {
content.innerHTML = ' <h1 style="color:red;"><i style="color:yellow; font-size: 2vw;" class="fa fa-warning"></i> Erreur de chargement des données - Erreur : ' + response.content + '</h1>'
console.log("FAILED")
} else if(response.result == "success") {
if(response.content == "ERROR_NOT_PERMITTED") {
projectAddInfo.innerHTML = "Erreur, le fichier n'a pas été ajouté correctement !"
} else {
projectDialog.close()
getProjects(projectSelector)
loadText(projectTextArea, projectAddInput.value)
projectSelector.value = projectAddInput.value
}
}
}
if(projectUploadFile.files.length > 0) {
const file_acc = new FormData();
file_acc.append("apic", projectUploadFile.files[0])
fetch('/upload', {
method: 'POST',
mode:"cors",
cache:"no-cache",
credentials:"same-origin",
headers: {
"uploadforproject": projectAddInput.value
},
referrerPolicy:"no-referrer",
redirect: 'follow',
body: file_acc
}).then(response => response.json())
.then(response => resupload(response))
function resupload(response) {
if(response.result == "ERROR") {
projectInfo.innerHTML = "L'image n'a pas été upload !"
}
}
}
} else {
projectAddInfo.innerHTML = "Ce nom n'est pas autorisé !"
}
})
projectAdd.addEventListener("click", () => {
projectDialog.showModal()
projectAddInput.value = ""
projectUploadName.innerHTML = "Aucune image."
projectUploadFile.value = null;
})
projectUploadFile.addEventListener("change", () => {
projectUploadName.innerHTML = projectUploadFile.files[0].name
})
projectUploadBtn.addEventListener("click", () => {
projectUploadFile.click()
})
eprojectUploadBtn.addEventListener("click", () => {
eprojectUploadFile.click()
})
eprojectUploadFile.addEventListener("change", () => {
eprojectUploadName.innerHTML = eprojectUploadFile.files[0].name
if(eprojectUploadFile.files.length > 0) {
const file_acc = new FormData();
file_acc.append("apic", eprojectUploadFile.files[0])
fetch('/upload', {
method: 'POST',
mode:"cors",
cache:"no-cache",
credentials:"same-origin",
headers: {
"uploadforproject": projectSelector.value
},
referrerPolicy:"no-referrer",
redirect: 'follow',
body: file_acc
}).then(response => response.json())
.then(response => resupload(response))
function resupload(response) {
if(response.result == "ERROR") {
projectInfo.innerHTML = "L'image n'a pas été upload !"
} else {
projectInfo.innerHTML = "<span style='color:rgb(130, 255, 163); '>L'image a été correctement upload !</span>"
}
}
}
})
projectDelete.addEventListener("click", () => {
const opt = projectSelector.value
deleteProject(opt)
})
sectionSelector.addEventListener("change", () => {
const opt = sectionSelector.value
if(opt == "Qui suis-je ?") {
loadText(sectionTextArea, "WHOAMI")
} else if(opt == "Contact") {
loadText(sectionTextArea, "CONTACT")
} else if(opt == "Formations") {
loadText(sectionTextArea, "FORMATION")
} else if(opt == "Diplomes & Certifications") {
loadText(sectionTextArea, "DIPLOME")
} else if(opt == "Passions et activités") {
loadText(sectionTextArea, "LOBBIES")
} else if(opt == "Ma recherche de stage") {
loadText(sectionTextArea, "FIND")
}
})
projectSelector.addEventListener("change", () => {
const opt = projectSelector.value
loadText(projectTextArea, opt)
})
sectionSave.addEventListener("click", () => {
sectionInfo.innerHTML = ""
fetch('/cv', {
method: 'POST',
redirect: 'follow',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({"request":"set", "value": sectionTextArea.value, "type": sectionSelectedMD})
})
.then(response => response.json())
.then(response => res(response))
function res(response) {
if(response.result == "failed") {
content.innerHTML = ' <h1 style="color:red;"><i style="color:yellow; font-size: 2vw;" class="fa fa-warning"></i> Erreur de chargement des données - Erreur : ' + response.content + '</h1>'
console.log("FAILED")
} else if(response.result == "success") {
if(response.content == "ERROR_NOT_PERMITTED") {
sectionInfo.innerHTML = "Erreur, le fichier n'a pas été sauvegardé correctement !"
} else {
sectionInfo.innerHTML = "<span style='color:rgb(130, 255, 163); '>Le fichier a été sauvegardé avec succès !</span>"
}
}
}
})
projectSave.addEventListener("click", () => {
projectInfo.innerHTML = ""
fetch('/cv', {
method: 'POST',
redirect: 'follow',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({"request":"set", "value": projectTextArea.value, "type": projectSelectedMD})
})
.then(response => response.json())
.then(response => res(response))
function res(response) {
if(response.result == "failed") {
content.innerHTML = ' <h1 style="color:red;"><i style="color:yellow; font-size: 2vw;" class="fa fa-warning"></i> Erreur de chargement des données - Erreur : ' + response.content + '</h1>'
console.log("FAILED")
} else if(response.result == "success") {
if(response.content == "ERROR_NOT_PERMITTED") {
projectInfo.innerHTML = "Erreur, le fichier n'a pas été sauvegardé correctement !"
} else {
projectInfo.innerHTML = "<span style='color:rgb(130, 255, 163); '>Le fichier a été sauvegardé avec succès !</span>"
}
}
}
})
loadText(sectionTextArea, "WHOAMI")
function loadText(textArea, requestElement) {
sectionSelectedMD = requestElement
projectSelectedMD = projectSelector.value
fetch('/cv', {
method: 'POST',
redirect: 'follow',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({"request":"get", "value": requestElement})
})
.then(response => response.json())
.then(response => res(response))
function res(response) {
if(response.result == "failed") {
content.innerHTML = ' <h1 style="color:red;"><i style="color:yellow; font-size: 2vw;" class="fa fa-warning"></i> Erreur de chargement des données - Erreur : ' + response.content + '</h1>'
console.log("FAILED")
} else if(response.result == "success") {
textArea.value = response.content
}
}
}
function getProjects(selector) {
fetch('/cv', {
method: 'POST',
redirect: 'follow',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({"request":"get-projects"})
})
.then(response => response.json())
.then(response => res(response))
function res(response) {
if(response.result == "failed") {
content.innerHTML = ' <h1 style="color:red;"><i style="color:yellow; font-size: 2vw;" class="fa fa-warning"></i> Erreur de chargement des données - Erreur : ' + response.content + '</h1>'
console.log("FAILED")
} else if(response.result == "success") {
const projectList = response.content
var projectSelectorInner = new Array();
for(var projet of projectList) {
projectSelectorInner.push("<option>" + projet + "</option>")
}
if(projectList.length == 0) {
projectInfo.innerHTML = "<span style='color: white;'>Aucun projet</span>"
projectTextArea.innerHTML = 'Aucun projet n\'est disponible'
}
selector.innerHTML = projectSelectorInner.join("")
loadText(projectTextArea, selector.value)
}
}
}
function deleteProject(opt) {
fetch('/cv', {
method: 'POST',
redirect: 'follow',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({"request":"del", "value": opt})
})
.then(response => response.json())
.then(response => res(response))
function res(response) {
if(response.result == "failed") {
content.innerHTML = ' <h1 style="color:red;"><i style="color:yellow; font-size: 2vw;" class="fa fa-warning"></i> Erreur de chargement des données - Erreur : ' + response.content + '</h1>'
console.log("FAILED")
} else if(response.result == "success") {
if(response.content == "ERROR_NOT_PERMITTED") {
projectInfo.innerHTML = "Erreur, le fichier n'a pas été supprimé correctement !"
} else {
projectInfo.innerHTML = "<span style='color:rgb(130, 255, 163); '>Le fichier a été supprimé avec succès !</span>"
}
getProjects(projectSelector)
}
}
}
}
</script>
<!-- Style-->
<style>
.cv_addproject {
border-radius: 1vw;
border-color: transparent;
background-color: rgb(80, 80, 80);
color: white;
text-align: center;
}
.cv_add_close {
border-radius: 1vw;
border-color: rgb(255, 48, 48);
border-width: 1%;
border-style: solid;
color: white;
background-color: transparent;
transition: all 0.2s ease 0s;
margin: 0.5vw;
padding: 0.5vw;
font-size: 1vw;
}
.cv_add_close:hover {
box-shadow: 1px 1px 10px rgb(255, 48, 48);
background-color: rgb(255, 48, 48);
color: black;
}
.cv_add_close:active {
box-shadow: none;
}
.cv_add_confirm {
border-radius: 1vw;
border-color: rgb(0, 174, 255);
border-width: 1%;
border-style: solid;
color: white;
background-color: transparent;
transition: all 0.2s ease 0s;
margin: 0.5vw;
padding: 0.5vw;
font-size: 1vw;
}
.cv_add_confirm:hover {
box-shadow: 1px 1px 10px rgb(0, 174, 255);
background-color: rgb(0, 174, 255);
color: black;
}
.cv_add_confirm:active {
box-shadow: none;
}
.inp {
border-style: hidden;
border-radius: 1vw;
padding: 0.2vw;
padding-left: 1vw;
transition: all 0.2s ease 0s;
margin-bottom: 0.5vw;
width: 100%;
}
.inp:hover {
box-shadow: 2px 2px 5px rgba(255, 255, 255, 0.477) ;
}
.inp:focus {
box-shadow: 5px 5px 5px rgba(0, 174, 255, 0.477) ;
}
.cv-info {
margin-top: 5%;
}
.cv-upload-section {
align-items: center;
margin-top: 3%;
}
.cv-selector {
border-radius: 1vw;
border-color: rgb(0, 174, 255);
border-width: 1%;
border-style: solid;
color: white;
background-color: transparent;
transition: all 0.2s ease 0s;
font-size: 0.7vw;
padding: 0.5vw;
margin-bottom: 3%;
}
.cv-selector:hover {
box-shadow: 1px 1px 10px rgb(0, 174, 255);
background-color: rgb(0, 174, 255);
color: black;
}
.cv-selector:active {
box-shadow: none;
}
.cv-selector option {
background-color: rgb(80, 80, 80);
color: white;
}
.cv-upload {
border-radius: 1vw;
border-color: rgb(0, 174, 255);
border-width: 1%;
border-style: solid;
color: white;
background-color: transparent;
transition: all 0.2s ease 0s;
font-size: 0.7vw;
padding: 0.5vw;
}
.cv-upload:hover {
box-shadow: 1px 1px 10px rgb(0, 174, 255);
background-color: rgb(0, 174, 255);
color: black;
}
.cv-upload:active {
box-shadow: none;
}
.cv-save{
border-radius: 1vw;
border-color: rgb(0, 174, 255);
border-width: 1%;
border-style: solid;
color: white;
background-color: transparent;
transition: all 0.2s ease 0s;
font-size: 0.7vw;
padding: 0.5vw;
margin-top: 3%;
margin-right: 3%;
}
.cv-save:hover {
box-shadow: 1px 1px 10px rgb(0, 174, 255);
background-color: rgb(0, 174, 255);
color: black;
}
.cv-save:active {
box-shadow: none;
}
.cv-plus {
border-radius: 1vw;
border-color: rgb(0, 174, 255);
border-width: 1%;
border-style: solid;
color: white;
background-color: transparent;
transition: all 0.2s ease 0s;
font-size: 0.7vw;
padding: 0.5vw;
margin-bottom: 3%;
margin-left: 2%;
}
.cv-plus:hover {
box-shadow: 1px 1px 10px rgb(0, 174, 255);
background-color: rgb(0, 174, 255);
color: black;
}
.cv-plus:active {
box-shadow: none;
}
.cv-del {
border-radius: 1vw;
border-color: rgb(255, 48, 48);
border-width: 1%;
border-style: solid;
color: white;
background-color: transparent;
transition: all 0.2s ease 0s;
font-size: 0.7vw;
padding: 0.5vw;
margin-top: 3%;
margin-right: 3%;
}
.cv-del:hover {
box-shadow: 1px 1px 10px rgb(255, 48, 48);
background-color: rgb(255, 48, 48);
color: black;
}
.cv-del:active {
box-shadow: none;
}
.cv-textarea {
border-radius: 1vw;
padding: 3%;
color: black;
height: 15vw;
}
.cv-sections {
padding: 2% !important;
}
.hbox h1 {
font-size: large;
}
table {
color: white;
}
.hbox {
margin: 1%;
padding: 1%;
background-color: rgb(80, 80, 80);
border-radius: 1vw;
box-shadow: 5px 5px 5px rgba(80, 80, 80, 0.477) ;
}
</style>

View File

@ -1,11 +1,13 @@
<div class="files">
<h1>Gestionnaire de fichiers</h1>
</br>
<div class="homepanel">
<div class="row w-100">
<div class="hbox col-lg">
<div class="fi_act">
<h1><i class="fa fa-folder"></i> Fichiers</h1>
<hr>
<div>
<button id="fi_new_folder" class="fi_act_btn"><i class="fa fa-folder"></i> Nouveau dossier</button>
<input id='fi_upload_file' type='file' hidden multiple />
@ -202,6 +204,7 @@
} else {
getDirectory(currentDir.value)
fiInfo.innerHTML = "<span style='color: rgb(130, 255, 163);'>Le fichier <strong>" + file.name + "</strong> a été upload !</span>"
}
}

View File

@ -7,6 +7,7 @@
<h1><i class="fa fa-bell"></i> Notifications</h1>
<hr>
<table class="table">

View File

@ -5,6 +5,7 @@
<div class="row w-100">
<div class="hbox col-lg">
<h1><i class="fa fa-link"></i> Liens raccourcis</h1>
<hr>
</br>
<div id="lkcontent">

View File

@ -0,0 +1,70 @@
<div class="home">
<h1>Administration <button onclick="getPage('panel.html')">RELOAD</button></h1>
</br>
<div class="homepanel">
<div class="row w-100">
<div class="hbox col-lg">
<h1><i class="fa fa-gear"></i> Actions et informations</h1>
<hr>
<button>Redémarrer</button>
<button>Update</button>
</div>
<div class="hbox col-lg">
<h1><i class="fa fa-file"></i> Chemin d'accès et paramètres</h1>
</div>
</div>
</div>
</div>
<!-- Style-->
<style>
.home {
}
.hbox h1 {
font-size: large;
}
table {
color: white;
}
.hbox {
margin: 1%;
padding: 1%;
background-color: rgb(80, 80, 80);
border-radius: 1vw;
box-shadow: 5px 5px 5px rgba(80, 80, 80, 0.477) ;
}
</style>

View File

@ -6,6 +6,7 @@
<div class="hbox col">
<p class="title"><i class="fa fa-id-card"></i> Mes informations</p>
<hr>
<div class="settings-content">
<p>Photo de profil :</p>
<div id="*accountpicture"></div>

View File

@ -5,6 +5,7 @@
<div class="row w-100">
<div class="hbox col">
<h1><i class="fa fa-users"></i> Utilisateurs</h1>
<hr>
<div id="gus_panel" class="gus_users">
</div>

554
routes/cv.js Normal file
View File

@ -0,0 +1,554 @@
var express = require('express');
var router = express.Router();
var ntr = require("../neutral-functions.js")
var fs = require("fs")
var path = require("path")
var mime = require('mime-types');
const { compileString } = require('sass');
const { response } = require('../app.js');
/* GET home page. */
router.get('/', function(req, res, next) {
var check = ntr.checkToken(req, res)
if(check.name != false) {
res.redirect(302, "/")
} else {
res.render('login', {error: ""});
}
});
router.post("/", function(req, res, next) {
var check = ntr.checkToken(req, res)
if(check.name == false) {
res.send({"result":"failed", "content":"ERROR_TOKEN_NOT_VALID"})
} else {
if(check.permLevel >= 2) {
const bod = req.body
if(bod.request == "get") {
const markdownFolder = "/home/gitlab-ci/cv/dashboard-raphael/markdown/"
if(bod.value == "WHOAMI") {
var fileData = null;
if(fs.existsSync(markdownFolder)) {
fileData = fs.readFileSync(markdownFolder + "whoami.md")
} else {
fileData = fs.readFileSync("../MD_TEST/whoami.md")
}
res.send({"result":"success", "content":fileData.toString()})
} else if(bod.value == "CONTACT") {
var fileData = null;
if(fs.existsSync(markdownFolder)) {
fileData = fs.readFileSync(markdownFolder + "info.md")
} else {
fileData = fs.readFileSync("../MD_TEST/info.md")
}
res.send({"result":"success", "content":fileData.toString()})
} else if(bod.value == "FORMATION") {
var fileData = null;
if(fs.existsSync(markdownFolder)) {
fileData = fs.readFileSync(markdownFolder + "formation.md")
} else {
fileData = fs.readFileSync("../MD_TEST/formation.md")
}
res.send({"result":"success", "content":fileData.toString()})
} else if(bod.value == "DIPLOME") {
var fileData = null;
if(fs.existsSync(markdownFolder)) {
fileData = fs.readFileSync(markdownFolder + "certif.md")
} else {
fileData = fs.readFileSync("../MD_TEST/certif.md")
}
res.send({"result":"success", "content":fileData.toString()})
} else if(bod.value == "LOBBIES") {
var fileData = null;
if(fs.existsSync(markdownFolder)) {
fileData = fs.readFileSync(markdownFolder + "passions.md")
} else {
fileData = fs.readFileSync("../MD_TEST/passions.md")
}
res.send({"result":"success", "content":fileData.toString()})
} else if(bod.value == "FIND") {
var fileData = null;
if(fs.existsSync(markdownFolder)) {
fileData = fs.readFileSync(markdownFolder + "find.md")
} else {
fileData = fs.readFileSync("../MD_TEST/find.md")
}
res.send({"result":"success", "content":fileData.toString()})
} else {
var fileData = null;
if(fs.existsSync(markdownFolder)) {
fileData = fs.readFileSync(markdownFolder + "project/" + bod.value + ".md")
} else {
fileData = fs.readFileSync("../MD_TEST/project/" + bod.value + ".md")
}
res.send({"result":"success", "content":fileData.toString()})
}
} else if(bod.request == "set") {
const markdownFolder = "/home/gitlab-ci/cv/dashboard-raphael/markdown/"
if(bod.type == "WHOAMI") {
if(fs.existsSync(markdownFolder)) {
fs.writeFile(markdownFolder + "whoami.md", bod.value, (err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
console.log(err)
}
})
} else {
fs.writeFile("../MD_TEST/whoami.md", bod.value, (err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
console.log(err)
}
})
}
} else if(bod.type == "CONTACT") {
if(fs.existsSync(markdownFolder)) {
fs.writeFile(markdownFolder + "info.md", bod.value, (err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
console.log(err)
}
})
} else {
fs.writeFile("../MD_TEST/info.md", bod.value, (err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
console.log(err)
}
})
}
res.send({"result":"success", "content":fileData.toString()})
} else if(bod.type == "FORMATION") {
if(fs.existsSync(markdownFolder)) {
fs.writeFile(markdownFolder + "formation.md", bod.value, (err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
console.log(err)
}
})
} else {
fs.writeFile("../MD_TEST/formation.md", bod.value, (err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
console.log(err)
}
})
}
} else if(bod.type == "DIPLOME") {
if(fs.existsSync(markdownFolder)) {
fs.writeFile(markdownFolder + "certif.md", bod.value, (err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
console.log(err)
}
})
} else {
fs.writeFile("../MD_TEST/certif.md", bod.value, (err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
console.log(err)
}
})
}
} else if(bod.type == "LOBBIES") {
if(fs.existsSync(markdownFolder)) {
fs.writeFile(markdownFolder + "passions.md", bod.value, (err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
console.log(err)
}
})
} else {
fs.writeFile("../MD_TEST/passions.md", bod.value, (err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
console.log(err)
}
})
}
} else if(bod.type == "FIND") {
if(fs.existsSync(markdownFolder)) {
fs.writeFile(markdownFolder + "find.md", bod.value, (err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
console.log(err)
}
})
} else {
fs.writeFile("../MD_TEST/find.md", bod.value, (err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
console.log(err)
}
})
}
} else {
if(fs.existsSync(markdownFolder)) {
fs.writeFile(markdownFolder + "/project/" + bod.type + ".md", bod.value, (err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
console.log(err)
}
})
} else {
fs.writeFile("../MD_TEST/project/" + bod.type + ".md", bod.value, (err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
console.log(err)
}
})
}
}
} else if(bod.request == "get-projects") {
const projectFolder = "/home/gitlab-ci/cv/dashboard-raphael/markdown/project/"
if(fs.existsSync(projectFolder)) {
var allProject = new Array()
fs.readdirSync(projectFolder).forEach((file) => {
allProject.push((file).replace(".md", ""))
})
res.send({"result":"success", "content":allProject})
} else {
var allProject = new Array()
fs.readdirSync("../MD_TEST/project/").forEach((file) => {
if(fs.statSync("../MD_TEST/project/" + file).isDirectory()) {
console.log(file)
} else {
allProject.push((file).replace(".md", ""))
}
})
res.send({"result":"success", "content":allProject})
}
} else if(bod.request == "del") {
const projectFolder = "/home/gitlab-ci/cv/dashboard-raphael/markdown/project/"
if(fs.existsSync(projectFolder + bod.value + ".md")) {
fs.rm(projectFolder + bod.value + ".md", (err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
}
})
} else if(fs.existsSync("../MD_TEST/project/" + bod.value + ".md")) {
fs.rm("../MD_TEST/project/" + bod.value + ".md", (err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
}
})
} else {
res.send({"result":"failed", "content":"FILE_NO_EXIST"})
}
} else if(bod.request == "add") {
const projectFolder = "/home/gitlab-ci/cv/dashboard-raphael/markdown/project/"
if(fs.existsSync(projectFolder)) {
fs.writeFile(projectFolder + bod.value + ".md", "**" + bod.value + "**" ,(err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
}
})
} else {
fs.writeFile("../MD_TEST/project/" + bod.value + ".md", "**" + bod.value + "**" ,(err) => {
if(err) {
res.send({"result":"success", "content":"ERROR_NOT_PERMITTED"})
console.log(err)
} else {
res.send({"result":"success", "content":"NO_PROBLEM"})
}
})
}
}
} else {
res.send({"result":"failed", "content":"ERROR_USER_PERMISSION_TOO_LOW"})
}
}
})
module.exports = router;

View File

@ -19,6 +19,7 @@ router.get('/', function(req, res, next) {
} else {
ntr.clearCookies(req.cookies.tokenID)
res.clearCookie('tokenID')
res.redirect(302, "/login")

View File

@ -7,6 +7,7 @@ var uuid = require("uuid")
var ntr = require("../neutral-functions.js");
const Jimp = require("jimp");
const { compileString } = require('sass');
const { exec } = require('child_process');
/* GET home page. */
router.get('/', function(req, res, next) {
@ -163,6 +164,43 @@ router.post("/", function(req, res, next) {
} else if(req.headers.uploadforproject != null) {
const projectFolder = "/home/gitlab-ci/cv/dashboard-raphael/public/images/"
if(fs.existsSync(projectFolder)) {
image.mv(projectFolder + req.headers.uploadforproject + ".jpg", (error) => {
if(error) {
res.send({"result":"ERROR"})
console.log(error)
} else {
res.send({"result":"SUCCESS"})
}
})
} else {
const mdtestfolder = "../MD_TEST/project/image/"
image.mv(mdtestfolder + req.headers.uploadforproject + ".jpg", (error) => {
if(error) {
res.send({"result":"ERROR"})
} else {
res.send({"result":"SUCCESS"})
}
})
}
} else {

View File

@ -1,13 +0,0 @@
{
"username": "raphix",
"password": "U2FsdGVkX19eUkHlyqAgwuLYtNjlqzUmVAD7tBEBtaY=",
"uuid": "0cee5da6-6812-49d8-97f5-2df5c1d78191",
"fullname": "Raphael PICOT",
"permissionLevel": 4,
"token": {
"tokenID": "571ecb2b-726f-442f-9ec7-bc19205847b7",
"livableToken": true,
"createdAt": 1679260759114
},
"lastconnexion": 1679595671060
}

View File

@ -0,0 +1,9 @@
{
"username": "root",
"password": "U2FsdGVkX18At+CXx+srQ5aCaTZafPTcYEUPIIIi0f0=",
"uuid": "2022eab5-5fa6-44ba-9f47-725c11226e97",
"fullname": "Administrateur",
"permissionLevel": 4,
"tokens": {},
"lastconnexion": 0
}

View File

@ -0,0 +1,9 @@
{
"username": "raphix",
"password": "U2FsdGVkX19Aop5Pvbq6wM82PpHsE18indmcC+9ken8=",
"uuid": "a03e5a1b-4aa4-4ed1-bbb5-f734ddf7158e",
"fullname": "Raphaël PICOT",
"permissionLevel": 4,
"tokens": {},
"lastconnexion": 0
}

View File

@ -1,9 +0,0 @@
{
"username": "root",
"password": "U2FsdGVkX19uiFCajX45dwmAqo3GpmAQho5U9g5RSww=",
"uuid": "c8f353a4-d0df-4c10-bccc-d4f47daf0f51",
"fullname": "Administrateur",
"permissionLevel": 4,
"token": {},
"lastconnexion": 1677339336836
}

View File

@ -22,22 +22,28 @@
<i class="fa fa-users"></i>
<p class="sidebar-text">Gestionnaire des utilisateurs</p>
</div>
<div class="sidebar-item " id="s-moni">
<i class="fa fa-computer"></i>
<p class="sidebar-text">Monitoring</p>
</div>
<div class="sidebar-item" id="s-device">
<i class="fa-solid fa-server"></i>
<p class="sidebar-text">Appareils et serveurs</p>
</div>
<div class="sidebar-item" id="s-cv">
<i class="fa-solid fa-file-lines"></i>
<p class="sidebar-text">Mon CV</p>
</div>
<div class="sidebar-item" id="s-link">
<i class="fa-solid fa-link"></i>
<p class="sidebar-text">Générateur de lien</p>
</div>
<div style="display: none;" class="sidebar-item " id="s-moni">
<i class="fa fa-computer"></i>
<p class="sidebar-text">Monitoring</p>
</div>
<div style="display: none;" class="sidebar-item" id="s-device">
<i class="fa-solid fa-server"></i>
<p class="sidebar-text">Appareils et serveurs</p>
</div>
<div style="display: none;" class="sidebar-item" id="s-admin">
<i class="fa-solid fa-gear"></i>
<p class="sidebar-text">Administration</p>
</div>
</div>