Skip to content
Snippets Groups Projects
Commit 70dd75ac authored by Elisa Giglio's avatar Elisa Giglio
Browse files

continuazione

parent 6dae2028
No related branches found
No related tags found
No related merge requests found
Showing with 290 additions and 122 deletions
No preview for this file type
No preview for this file type
......@@ -19,29 +19,12 @@ public class Home implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
URI requestURI = exchange.getRequestURI();
boolean wantsHome = Helper.compareText(requestURI.toString(),URI.create("/secured").toString());
boolean wantsKeycloak = Helper.compareText(requestURI.toString(),URI.create("/keycloak.json").toString());
if(!wantsHome && !wantsKeycloak) {
String error = "Invalid URI";
OutputStream os = exchange.getResponseBody();
exchange.sendResponseHeaders(400, error.getBytes().length);
os.write(error.getBytes());
os.close();
return;
}
String requestMethod = exchange.getRequestMethod();
if (Helper.compareText(requestMethod, "GET")) {
List<String> strlist = new ArrayList<>();
String response = null;
if(wantsHome){
response = getHomePage();
strlist.add("text/html");
} else if (wantsKeycloak){
response = getKeycloak();
strlist.add("text/json");
}
response = getHomePage();
strlist.add("text/html");
if(response != null && !Helper.compareText(response, "fail")){
exchange.getResponseHeaders().put("content-type", strlist);
exchange.sendResponseHeaders(200, response.getBytes().length);
......
......@@ -39,9 +39,6 @@ public class ObtainToken implements HttpHandler{
boolean wantsRedirectPage = Helper.compareText(stringURI,URI.create("/").toString());
boolean wantsToken = Helper.compareText(stringURI,URI.create("/secured").toString());
System.out.println(stringURI);
if(!wantsRedirectPage && !wantsToken) {
String error = "Invalid URI";
OutputStream os = exchange.getResponseBody();
......@@ -56,7 +53,10 @@ public class ObtainToken implements HttpHandler{
// get the html page
List<String> strlist = new ArrayList<>();
String response = null;
response = getRedirectPage("/redirect.html");
if(wantsRedirectPage)
response = getRedirectPage("/redirect.html");
if(wantsToken)
response = getRedirectPage("/domains.html");
strlist.add("text/html");
if(response != null && !Helper.compareText(response, "fail")){
......
......@@ -106,7 +106,7 @@ public class Server {
server.createContext("/js/",new Resources());
server.createContext("/css/",new Resources());
server.createContext("/res/",new ImageRes());
server.createContext("/secured/home",new Home());
server.createContext("/secured/home/",new Home());
server.createContext("/secured",new ObtainToken(kcs));
server.createContext("/",new ObtainToken(kcs));
......
......@@ -28,9 +28,13 @@
}
.toggle-button.active>.inner-circle {
margin-left: 40px;
margin-left: 30px;
}
.no-box-sizing {
box-sizing: content-box !important;
}
.trash-padding {
margin-top: 50px;
}
\ No newline at end of file
......@@ -20,6 +20,7 @@
<link rel="stylesheet" href="css/domains.css" type="text/css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>
<script defer src="js/authentication/moment.min.js"></script>
<script defer src="js/authentication/script.js" type="module"></script>
</head>
......@@ -86,6 +87,7 @@
</tbody>
</table>
</div>
<button class="btn btn-primary position-absolute bottom-0 end-0" id="button-logout">Logout</button>
<div class="modal fade" id="domain-modal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
......
'use strict';
import {createRowDomain} from '../templates/domains-template.js';
import {statoDomainToggle} from '../toggles.js';
import { getToken } from './script.js';
import { logoutKeycloak, getToken } from './script.js';
class App {
constructor(myDomains) {
this.myDomains = myDomains;
constructor(myDomains, requestsToDomain) {
// this.myDomains = myDomains;
this.requestsToDomain = requestsToDomain;
this.showAllDomains(myDomains);
const buttonLogout = document.getElementById('button-logout');
buttonLogout.addEventListener('click', async (event) => {
event.preventDefault();
await logoutKeycloak();
});
}
showAllDomains(myDomains) {
showAllDomains(domainsToShow) {
const addHere = document.getElementById('table-row-domains');
for(const d of myDomains) {
const row = createRowDomain(d);
for(const d of domainsToShow) {
const tr = document.createElement('tr');
tr.innerHTML = row;
tr.innerHTML = createRowDomain(d);;
console.log(d);
console.log(tr);
const plusRow = addHere.lastElementChild;
addHere.insertBefore(row, plusRow);
addHere.insertBefore(tr, plusRow);
if(d.admin) {
const toggle = row.querySelector('.toggle-button');
statoDomainToggle(d, toggle);
const deleteDomain = row.querySelector('.fa-trash');
deleteDomain.addEventListener('click', () => {
const token = getToken();
const response = await fetch('http://localhost:3001/delete', {
method: 'POST',
headers: , // DA FARE: inserire il token
body: JSON.stringify({domain: domain.nome})
});
if(response.ok) {
addHere.removeChild(row);
const toggle = tr.querySelector('.toggle-button');
this.statoDomainToggle(d, toggle, this.requestsToDomain);
const deleteDomain = tr.querySelector('.fa-trash');
deleteDomain.addEventListener('click', async () => {
const resultDelete = await this.requestsToDomain.deleteDomain(d);
if(resultDelete) {
addHere.removeChild(tr);
}
else {
throw new Error('Impossibile eliminare il dominio, provare piu\' tardi');
}
}
});
}
}
}
statoDomainToggle(domain, toggle, requestsToDomain) {
toggle.addEventListener('click', async (event) => {
event.preventDefault();
const token = getToken();
const stop = toggle.classList.contains('active');
if(stop) {
// toggle attiva. Se clicco richiedo che il dominio sia fermato
const resultStop = await requestsToDomain.stopDomain(domain);
if(resultStop) {
toggle.classList.remove('active');
}
else {
throw new Error('Impossibile fermare il dominio, provare piu\' tardi');
}
}
else {
const resultStart = await requestsToDomain.startDomain(domain);
if(resultStart) {
toggle.classList.add('active');
}
else {
throw new Error('Impossibile far partire il dominio, provare piu\' tardi');
}
}
});
}
}
export default App;
\ No newline at end of file
This diff is collapsed.
'use strict';
import {getToken} from "./script.js";
import Domain from "./domain.js";
class RequestToDomain {
constructor() {
}
/**
* Funzione per ottenenere dal domain manager tutte le informazioni
* sui domini dell'utente che ha effettuato il login
*/
async getMyDomains() {
const responseDomain = await fetch('http://localhost:3001/secured/domains', { // DA FARE: controllare che l'uri che ho specificato qui coincida con quello specificato dal domain manager
method: 'GET',
headers: {
'Authorization': `Bearer ${await getToken()}`
}
}) ;
const domainsJson = await response.json();
if(response.ok) {
const domainsArray = domainsJson.response;
const myDomains = domainsArray.map((d) => {
Domain.from(d)
});
return myDomains;
}
else
throw domainsJson;
}
/**
* Effettua la richiesta per creare un nuovo dominio.
*/
async createNewDomain() {
}
/**
* Effettua la richiesta al domain manager per far partire un dominio.
* @param {*} d dominio che si vuole far partire.
* @returns true se il dominio &egrave; stato fatto partire,
* false altrimenti.
*/
async startDomain(d) {
const response = await fetch('http://localhost:3001/start', {
method: 'POST',
headers: {
'Authorization': `Bearer ${await getToken()}`
},
body: JSON.stringify({domain: d.nome})
});
if(response.ok) {
return true;
}
else {
return false;
}
}
/**
* Effettua la richiesta al domain manager per fermare un dominio.
* @param {*} d dominio che si vuole fermare.
* @returns true se il dominio &egrave; stato fermato,
* false altrimenti.
*/
async stopDomain(d) {
const response = await fetch('http://localhost:3001/stop', {
method: 'POST',
headers: {
'Authorization': `Bearer ${await getToken()}`
},
body: JSON.stringify({domain: d.nome})
});
if(response.ok) {
return true;
}
else {
return false;
}
}
/**
* Effettua la richiesta al domain manager per cancellare un dominio.
* @param {*} d dominio che si vuole cancellare.
* @returns true se la cancellazione &egrave; andata a buon fine,
* false altrimenti.
*/
async deleteDomain(d) {
const response = await fetch('http://localhost:3001/delete', {
method: 'POST',
headers: {
'Authorization': `Bearer ${await getToken()}`
},
body: JSON.stringify({domain: d.nome})
});
if(response.ok) {
return true;
}
else {
return false;
}
}
}
export default RequestToDomain;
\ No newline at end of file
'use strict';
import Secure from './secure.js';
import Domain from './domain.js';
import App from './app';
import App from './app.js';
import RequestToDomain from './requests-to-domain.js';
// import * as jose from 'jose'; // per la gestione del token
const mySecure = new Secure();
let token = null;
let tokenTime = null; // momento in cui ottengo il token
let expirationTime = null; // momento a partire dal quale il token non sarà più valido
let alreadyRefreshed = false; // true se ho appena fatto la richiesta del token usando il refresh token
let oldTimeout = null;
const uri = window.location.toString();
if(!uri.includes('#')) {
......@@ -22,20 +26,36 @@ else {
const params = uriSplit[1].split('&');
const uriState = queryStringGetValue(params[0]);
const uriAuthCode = queryStringGetValue(params[2]);
const body = document.getElementById('body-id');
body.innerHTML = "";
if(!sessionStorage.stateSent || sessionStorage.stateSent !== uriState) {
const body = document.getElementById('body-id');
body.innerHTML = "";
body.innerHTML = `Errors in the request!`;
}
else {
token = await requestToken(uriAuthCode); // post per la richiesta del token
await requestFirstToken(uriAuthCode); // post per la richiesta del token
if(token !== null) {
console.log(token);
const myDomains = getMyDomains(token);
const app = new App(myDomains);
// console.log(token);
tokenTime = moment();
expirationTime = tokenTime.add(token.expires_in,'s');
const requestsToDomain = new RequestToDomain();
// const myDomains = await requestsToDomain.getMyDomains();
const myDomains = [{nome: "casa1", stato:"on", admin: true},
{nome: "casa2", stato:"off", admin: false},
{nome: "casa3", stato:"on", admin: true},
{nome: "casa4", stato:"on", admin: false},
{nome: "casa4", stato:"on", admin: false},
{nome: "casa4", stato:"on", admin: false},
{nome: "casa4", stato:"on", admin: true},
{nome: "casa4", stato:"on", admin: false}
];
const app = new App(myDomains, requestsToDomain);
}
// DA FARE: capire come richiedere il refresh token
}
}
......@@ -51,10 +71,10 @@ function queryStringGetValue(queryString) {
/**
* Post per la richiesta del token
* @returns il token ottenuto
* Post per la prima richiesta del token.
* @returns il token ottenuto se la richiesta ha avuto successo, null altrimenti.
*/
async function requestToken(uriAuthCode) {
async function requestFirstToken(uriAuthCode) {
const url = 'http://localhost:8080/realms/test00/protocol/openid-connect/token';
const response = await fetch(url, {
......@@ -70,35 +90,87 @@ async function requestToken(uriAuthCode) {
redirect_uri: 'http://localhost:3000/secured'
})
});
const token = await response.json();
if(response.ok)
return token;
token = await response.json();
if(response.ok) {
oldTimeout = timeoutRefresh();
}
else
return null;
token = null;
}
async function getToken() {
const now = moment();
if(now - expirationTime < 1) {
//this token has expired, so request new token
await requestUsingRefreshToken();
}
return token.access_token;
}
/**
* Funzione per ottenenere dal domain manager tutte le informazioni
* sui domini dell'utente che ha fatto il login
* @param {*} token token da inviare al domain manager
* Post per la richiesta del token usando il refresh token.
*/
async function getMyDomains(token) {
const responseDomain = await fetch('http://localhost:3001/secured/domains', { // DA FARE: controllare che l'uri che ho specificato qui coincida con quello specificato dal domain manager
method: 'GET',
async function requestUsingRefreshToken() {
const url = 'http://localhost:8080/realms/test00/protocol/openid-connect/token';
const response = await fetch(url, {
method: 'POST',
headers: {
// DA FARE: mettere qui il token
}
}) ;
const domainsJson = await response.json();
'Content-type':'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
grant_type: 'refresh_token',
client_id: 'myclient',
refresh_token: `${token.refresh_token}`
})
});
token = await response.json();
if(response.ok) {
const domainsArray = domainsJson.response;
const myDomains = domainsArray.map((d) => Domain.from(d));
return myDomains;
}
alreadyRefreshed = true;
oldTimeout = timeoutRefresh();
}
else
throw domainsJson;
token = null;
}
/**
* Prima che scada il refresh token, richiedo nuovamente il token
* (usando il refresh token).
* @returns id di setTimeout()
*/
function timeoutRefresh() {
if(oldTimeout !== null)
clearTimeout(oldTimeout);
return setTimeout(async () => {
if(!alreadyRefreshed) {
await requestUsingRefreshToken();
alreadyRefreshed = false;
}
}, (token.refresh_expires_in*1000)-5000);
}
export function getToken() {
return token;
}
\ No newline at end of file
/**
* Effettua il logout.
*/
async function logoutKeycloak() {
clearTimeout(oldTimeout); // DA FARE: non funziona. Controllare come si fa il logout su keycloak!!!!
const url = 'http://localhost:8080/realms/test00/protocol/openid-connect/logout?redirect_uri=http://localhost:3000/secured';
const response = await fetch(url, {
method: 'POST',
headers: {
'Authorization': `Bearer ${await getToken()}`
}
}
);
if(response.ok)
token = null;
else
throw await response.json();
}
export {getToken, logoutKeycloak};
......@@ -3,7 +3,7 @@
function createRowDomain(domain) {
return `
<th scope="row">
<h4 class="d-flex justify-content-center mt-2">${domain.nome}</h4>
<h4 class="d-flex justify-content-center mt-2"><a href="/secured/home/">${domain.nome}</a></h4>
</th>
<td class="align-middle">
<div class="switch-container no-box-sizing d-flex justify-content-center">
......@@ -13,7 +13,7 @@ function createRowDomain(domain) {
</div>
</td>
<td class="d-flex justify-content-center">
${domain.admin == true ? '<i class="fa-solid fa-trash fa-2x py-2">' : ''}
${domain.admin == true ? '<i class="fa-solid fa-trash fa-2x py-2">' : '<div class="trash-padding"></div>'}
</td>`;
}
......
......@@ -91,41 +91,4 @@ function luciToggleCallback(toggle){
toggle.classList.toggle('active');
}
async function statoDomainToggle(domain, toggle) {
toggle.addEventListener('click', event => {
event.preventDefault();
const token = getToken();
const stop = toggle.classList.contains('active');
if(stop) {
// toggle attiva
const response = await fetch('http://localhost:3001/stop', {
method: 'POST',
headers: , // DA FARE: inserire il token
body: JSON.stringify({domain: domain.nome})
});
if(response.ok) {
toggle.classList.remove('active');
}
else {
throw new Error('Impossibile fermare il dominio, provare piu\' tardi');
}
}
else {
const response = await fetch('http://localhost:3001/start', {
method: 'POST',
headers: , // DA FARE: inserire il token
body: JSON.stringify({domain: domain.nome})
});
if(response.ok) {
toggle.classList.add('active');
}
else {
throw new Error('Impossibile far partire il dominio, provare piu\' tardi');
}
}
});
}
export { setToggleMovement, scenariToggleListener, luciToggleListener, statoDomainToggle};
\ No newline at end of file
export { setToggleMovement, scenariToggleListener, luciToggleListener};
\ No newline at end of file
......@@ -26,6 +26,7 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>
<!-- <script defer src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script defer src="js/authentication/axios.min.js"></script> -->
<script defer src="js/authentication/moment.min.js"></script>
<script defer src="js/authentication/script.js" type="module"></script>
</head>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment