Ultimamente collegando il telefono a Mac non riuscivo piu' a scaricare il file mediante Android File Transfer
La soluzione e' quanto mai banale, Tirando giu' la tendina si deve cliccare su USB per la ricarica e si evidenziano le altre opzioni. Cliccando su Trasferimento File si accede al contenuto del telefono. La piccola cosa fastidiosa e' che si deve ripetere questa operazione ogni volta che si inserisce il cavo USB
martedì 27 dicembre 2016
DVD su XBox Orginal
Sono venuto in possesso del primo modello della XBox...non che smaniassi dalla voglia di provarla ma visto che c'ero l'ho collegata al televisore ...e sono iniziati i problemi
Al primo avvio sono riuscito a giocare a GTA fino a quando durante il caricamento di un livello da disco ottico si e' presentato il seguente errore
Per quanto ne sapevo la XBox primo modello era un PC (un P3 700 con scheda NVidia) con un vestito diverso e con i soli blocchi software. Su internet girano molti video che spiegano come pulire il DVD ma in caso di necessita' ho in casa diverse vecchie unita' ottiche da PC per cui pensavo in ogni caso di poterla sostituire
Per aprire il case e' sufficiente svitare le 4 torx nascoste sotto i piedini e le 2 nascoste sotto gli adesivi
ecco come si presenta il dispositivo a cofano aperto...un bel cavo IDE
Per smontare DVD ed HD e' necessario rimuovere 3 torx bronzate abbastanza nascoste per togliere lo chassis in plastica (togliere le viti e' facile...rimetterle decisamente meno)
e qui la prima amara sopresa...il DVD non e' standard PC.Ha un cavo dati EIDE ma l'alimentazione e' proprietaria...nessuna possibilita' di usare compenentistica PC..si deve cercare di ripulire l'unita'
il DVD si apre con 4 viti a croce standard
ed e' costruito in modo differente dai modelli PC. Espone completamente le ottiche per cui e' facile pulire
Rimontare l'unita' DVD pero' non e' banalissimo. Si incastra male e dato che e' portante deve essere stretta bene
Alla fine di tutto questo lavoro, riaccendo ma continua a non leggere DVD..lavoro sprecato
Al primo avvio sono riuscito a giocare a GTA fino a quando durante il caricamento di un livello da disco ottico si e' presentato il seguente errore
Per quanto ne sapevo la XBox primo modello era un PC (un P3 700 con scheda NVidia) con un vestito diverso e con i soli blocchi software. Su internet girano molti video che spiegano come pulire il DVD ma in caso di necessita' ho in casa diverse vecchie unita' ottiche da PC per cui pensavo in ogni caso di poterla sostituire
Per aprire il case e' sufficiente svitare le 4 torx nascoste sotto i piedini e le 2 nascoste sotto gli adesivi
ecco come si presenta il dispositivo a cofano aperto...un bel cavo IDE
Per smontare DVD ed HD e' necessario rimuovere 3 torx bronzate abbastanza nascoste per togliere lo chassis in plastica (togliere le viti e' facile...rimetterle decisamente meno)
e qui la prima amara sopresa...il DVD non e' standard PC.Ha un cavo dati EIDE ma l'alimentazione e' proprietaria...nessuna possibilita' di usare compenentistica PC..si deve cercare di ripulire l'unita'
il DVD si apre con 4 viti a croce standard
ed e' costruito in modo differente dai modelli PC. Espone completamente le ottiche per cui e' facile pulire
Rimontare l'unita' DVD pero' non e' banalissimo. Si incastra male e dato che e' portante deve essere stretta bene
Alla fine di tutto questo lavoro, riaccendo ma continua a non leggere DVD..lavoro sprecato
venerdì 23 dicembre 2016
Primi passi con Android Things su Intel Edison
Doveva chiamarsi Brillo ma alla fine IoT di Google e' diventato Android Things.
Per iniziare ad usarlo si deve configurare un dispositivo, nel mio caso una Intel Edison
Premessa: questa fase e' stata eseguita su due computer differenti perche' sulla mia Linux Box Centos 7 avevo qualche problema ad installare Platform Flash Tool di Intel (ed ho quindi usato Mac) mentre su Mac mi veniva generato un errore non comprensibile al momento di utilizzare fastboot (ed ho quindi usato Linux)
Si parte flashando il firmware della Edison scaricando il software da qui e l'immagine da qui (non ci sono altre impostazioni da fare ..di default si trova Flash file FlashEdison.json e Configuration Non_OS)
Si preme il tasto FW (SW1U3 il secondo da sinistra sopra al processore nell'Arduino Kit di Edison)
e si collega il cavo al connettore J16 (il tasto SW1 deve essere posizionato con il cursore verso J16)
a questo punto si clicca browse e si punta al file .zip e si attende
al termine delle operazioni si ha una schermata di questo tipo ed usando il comando
fastboot devices
si vede il dispositivo in modalita' fast boot
A questo punto si scarica entra nella directory dove e' stato scompattato il file precedentemente scaricato (androidthings_edison_devpreview_1.zip)
Ho provato a continuare a seguire la guida ma su Mac e' stato generato il seguente comando
su Linux invece tutto procede bene
si riavvia quindi il dispositivo per togliere la modalita' fastboot e passare in modalita' device
fastboot reboot
adb devices(attenzione; a questo punto e' necessario alimentare la Edison non solo dalla microUSB su J16)
Per iniziare ad usarlo si deve configurare un dispositivo, nel mio caso una Intel Edison
Premessa: questa fase e' stata eseguita su due computer differenti perche' sulla mia Linux Box Centos 7 avevo qualche problema ad installare Platform Flash Tool di Intel (ed ho quindi usato Mac) mentre su Mac mi veniva generato un errore non comprensibile al momento di utilizzare fastboot (ed ho quindi usato Linux)
Si parte flashando il firmware della Edison scaricando il software da qui e l'immagine da qui (non ci sono altre impostazioni da fare ..di default si trova Flash file FlashEdison.json e Configuration Non_OS)
Si preme il tasto FW (SW1U3 il secondo da sinistra sopra al processore nell'Arduino Kit di Edison)
e si collega il cavo al connettore J16 (il tasto SW1 deve essere posizionato con il cursore verso J16)
a questo punto si clicca browse e si punta al file .zip e si attende
al termine delle operazioni si ha una schermata di questo tipo ed usando il comando
fastboot devices
si vede il dispositivo in modalita' fast boot
A questo punto si scarica entra nella directory dove e' stato scompattato il file precedentemente scaricato (androidthings_edison_devpreview_1.zip)
Ho provato a continuare a seguire la guida ma su Mac e' stato generato il seguente comando
su Linux invece tutto procede bene
$ fastboot \
flash gpt partition-table.img \
flash u-boot u-boot-edison.bin \
flash boot_a boot.img \
flash boot_b boot.img \
flash system_a system.img \
flash system_b system.img \
flash userdata userdata.img \
erase misc \
set_active _a
$ fastboot \
flash gapps_a gapps.img \
flash gapps_b gapps.img
$ fastboot \
flash oem_a oem.img \
flash oem_b oem.img
si riavvia quindi il dispositivo per togliere la modalita' fastboot e passare in modalita' device
fastboot reboot
adb devices(attenzione; a questo punto e' necessario alimentare la Edison non solo dalla microUSB su J16)
giovedì 22 dicembre 2016
Leggere dati da Firebase Realtime Database
Per me che vengo da una esperienza SQL mettere le mani per la prima volta su un Database NoSql come quello di Firebase e' un po' spiazzante....ma ci si fa l'abitudine
Per prima cosa Firebase non gestisce i dati mentre tabelle bidimensionali a struttura rigida ma i dati vengono rapppresentati come un albero a cui sono attaccate delle derivazioni (child) i quali non e' necessario che abbiamo la stessa struttura (al di sotto di una chiave, per esempio, in un caso le proprieta' possono essere due oppure tre)
Se si editano i dati dalla Console di Firebase si vedra' che posizionando il mouse sulla root appaiono dei simboli (+ e -)..la prima volta che si usa sembra che non si abbia nessuna interazione perche' i simboli scompaiono appena si sposta il mouse
Oltre a creare i dati in modo interattivo si possono ovviamente creare anche via codice. Di seguito un esempio in Javascript commentato con le righe evidenziate in giallo
----------------------------------------------------------------
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Read</title>
<!-- Firebase -->
<script src="https://www.gstatic.com/firebasejs/3.6.4/firebase.js"></script>
</head>
<body>
<pre id="punti">
</pre>
<script>
// Initialize Firebase
var config = {
apiKey: "AIzaSyAchx8oVeLUgxxxxxxxxxxxxxxxxxxxxxxx",
authDomain: "notifica-23425.firebaseapp.com",
databaseURL: "https://notifica-23425.firebaseio.com",
storageBucket: "notifica-23425.appspot.com",
messagingSenderId: "392xxxxxxxxxxxxxx"
};
firebase.initializeApp(config);
var timestamp = new Date().getTime();
console.log(timestamp);
//vengono inseriti due nodi nella radice
// usando il comando set vengono di fatto rimossi tutti i contenuti nel db
var ins_punti = firebase.database().ref();
ins_punti.set({
l2: {
lat: 1,
lon: 30,
nome: "Venezia",
tempo: timestamp
},
l3: {
lat: 33,
lon: 40,
nome: "Bari"
}
});
//vengono aggiunti al nodo Punti due elementi. Si tratta di un append
// e viene quindi di default inserita una chiave univoca
ins_punti.child("Punti").push({
lat: 13,
lon: 33,
nome: "Torino"
});
ins_punti.child("Punti").push({
lat: 14,
lon: 35,
nome: "Firenze"
});
//vengono mostrate a video tutte le coppie del ramo "l2" del nodo in radice
const prePunti = document.getElementById('punti');
const dbRefPunti = firebase.database().ref().child('l2');
dbRefPunti.on('value', snap => {
prePunti.innerText = JSON.stringify(snap.val(),null,1);
//con questa chiamata vengono richieste tutte le coppie chiave/valore del ramo Punti
//da qui in poi i risultati sono visibili nel log e non a video
firebase.database().ref().child('Punti').on('value', snap => console.log(snap.val()));
//con questa chiamata vengono richieste tutte le coppie chiave/valore dell'ultimo nodo aggiunto alla lista del ramo Punti
firebase.database().ref().child('Punti').limitToLast(1).on('child_added', snap => console.log(snap.val()));
//con questa chiamata viene richiesto il valore del campo nome dell'ultimo nodo aggiunto alla lista del ramo Punti
firebase.database().ref().child('Punti').limitToLast(1).on('child_added', snap => console.log(snap.val().nome));
//con questa chiamata viene richiesto il valore del campo nome del nodo con lat=13 del ramo Punti
firebase.database().ref().child('Punti').orderByChild("lat").equalTo(13).on('child_added', snap => console.log(snap.val().nome));
firebase.database().ref().child('l2').update({lat: 133});
//rimuove il ramo l1 dalla root
firebase.database().ref().child('l3').remove();
});
</script>
</body>
</html>
----------------------------------------------------------------
La cosa interessante e' che le modifiche effettuate risultano essere in realtime. Se ci sono differenti client con la pagina Web aperta ed una modifica e' stata effettuata al DB questa sara' visualizzata su tutti i client senza la necesssita' di ricarica la pagina
Come per i db sql anche per Firebase e' possibile inserire la definizione delle chiavi per accelerare la ricerca e si possono definire le regole di accesso. Cio' viene effettuato nel Tab regole o rules
Per prima cosa Firebase non gestisce i dati mentre tabelle bidimensionali a struttura rigida ma i dati vengono rapppresentati come un albero a cui sono attaccate delle derivazioni (child) i quali non e' necessario che abbiamo la stessa struttura (al di sotto di una chiave, per esempio, in un caso le proprieta' possono essere due oppure tre)
Se si editano i dati dalla Console di Firebase si vedra' che posizionando il mouse sulla root appaiono dei simboli (+ e -)..la prima volta che si usa sembra che non si abbia nessuna interazione perche' i simboli scompaiono appena si sposta il mouse
Oltre a creare i dati in modo interattivo si possono ovviamente creare anche via codice. Di seguito un esempio in Javascript commentato con le righe evidenziate in giallo
----------------------------------------------------------------
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Read</title>
<!-- Firebase -->
<script src="https://www.gstatic.com/firebasejs/3.6.4/firebase.js"></script>
</head>
<body>
<pre id="punti">
</pre>
<script>
// Initialize Firebase
var config = {
apiKey: "AIzaSyAchx8oVeLUgxxxxxxxxxxxxxxxxxxxxxxx",
authDomain: "notifica-23425.firebaseapp.com",
databaseURL: "https://notifica-23425.firebaseio.com",
storageBucket: "notifica-23425.appspot.com",
messagingSenderId: "392xxxxxxxxxxxxxx"
};
firebase.initializeApp(config);
var timestamp = new Date().getTime();
console.log(timestamp);
//vengono inseriti due nodi nella radice
// usando il comando set vengono di fatto rimossi tutti i contenuti nel db
var ins_punti = firebase.database().ref();
ins_punti.set({
l2: {
lat: 1,
lon: 30,
nome: "Venezia",
tempo: timestamp
},
l3: {
lat: 33,
lon: 40,
nome: "Bari"
}
});
//vengono aggiunti al nodo Punti due elementi. Si tratta di un append
// e viene quindi di default inserita una chiave univoca
ins_punti.child("Punti").push({
lat: 13,
lon: 33,
nome: "Torino"
});
ins_punti.child("Punti").push({
lat: 14,
lon: 35,
nome: "Firenze"
});
//vengono mostrate a video tutte le coppie del ramo "l2" del nodo in radice
const prePunti = document.getElementById('punti');
const dbRefPunti = firebase.database().ref().child('l2');
dbRefPunti.on('value', snap => {
prePunti.innerText = JSON.stringify(snap.val(),null,1);
//con questa chiamata vengono richieste tutte le coppie chiave/valore del ramo Punti
//da qui in poi i risultati sono visibili nel log e non a video
firebase.database().ref().child('Punti').on('value', snap => console.log(snap.val()));
//con questa chiamata vengono richieste tutte le coppie chiave/valore dell'ultimo nodo aggiunto alla lista del ramo Punti
firebase.database().ref().child('Punti').limitToLast(1).on('child_added', snap => console.log(snap.val()));
//con questa chiamata viene richiesto il valore del campo nome dell'ultimo nodo aggiunto alla lista del ramo Punti
firebase.database().ref().child('Punti').limitToLast(1).on('child_added', snap => console.log(snap.val().nome));
//con questa chiamata viene richiesto il valore del campo nome del nodo con lat=13 del ramo Punti
firebase.database().ref().child('Punti').orderByChild("lat").equalTo(13).on('child_added', snap => console.log(snap.val().nome));
firebase.database().ref().child('l2').update({lat: 133});
//rimuove il ramo l1 dalla root
firebase.database().ref().child('l3').remove();
});
</script>
</body>
</html>
----------------------------------------------------------------
La cosa interessante e' che le modifiche effettuate risultano essere in realtime. Se ci sono differenti client con la pagina Web aperta ed una modifica e' stata effettuata al DB questa sara' visualizzata su tutti i client senza la necesssita' di ricarica la pagina
Come per i db sql anche per Firebase e' possibile inserire la definizione delle chiavi per accelerare la ricerca e si possono definire le regole di accesso. Cio' viene effettuato nel Tab regole o rules
martedì 20 dicembre 2016
Atom Editor e proxy su Windows
Non e' proprio intuitivo installare pacchetti su Atom in presenza di un proxy server
la soluzione e' digitare a riga di comando
apm config set proxy "http://ip:port/"
la soluzione e' digitare a riga di comando
apm config set proxy "http://ip:port/"
apm config set https_proxy "http://ip:port/"
Hosting su Firebase con Centos 7
Firebase offre la possibilita' di avere anche un hosting di contenuti statici (quindi si puo' utilizzare scripting lato client ma non scripting lato server...niente PHP)
Per sfruttare tale opzione si utilizza Firebase-CLI via NPM. Si parte su Centos 7 installando NPM mediante il comando
curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -
e
npm install -g firebase-tools
si effettua il login
Per sfruttare tale opzione si utilizza Firebase-CLI via NPM. Si parte su Centos 7 installando NPM mediante il comando
curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -
yum install -y nodejs
a questo punto si installa Firebase-CLI con
si effettua il login
firebase login (si apre una pagina del browser per l'autenticazione anche a due vie)
ci si sposta nella root del progetto HTML che si vuole pubblicare su Firebase e si digita
firebase init
(vengono creati alcuni file tipo firebase.json e .firebaserc)
a questo punto si digita
firebase deploy
ed i file saranno copiati sui server di Firebase e saranno disponibili all'indirizzo
https://{nome_progetto}.firebaseapp.com
prima di fare il deploy l'applicazione Web puo' essere provata usando il comando
firebase serve
sara' avviato un server web locale all'indirizzo
http://localhost:5000
la gestione dei file sull'hosting avviene in un modo piu' simile a GitHub che a FTP. In pratica si fa un commit di tutti i file ed il server mette in produzione l'ultimo snapshot. Se si e' commesso un errore su un file non si puo' modificare il singolo file ma si deve fare il commit di tutto il progetto
Se si vuole ritornare ad una situazione precedente sicuramente funzionante si puo' selezionare il salvataggio preferito dal tab hosting
la gestione dei file sull'hosting avviene in un modo piu' simile a GitHub che a FTP. In pratica si fa un commit di tutti i file ed il server mette in produzione l'ultimo snapshot. Se si e' commesso un errore su un file non si puo' modificare il singolo file ma si deve fare il commit di tutto il progetto
Se si vuole ritornare ad una situazione precedente sicuramente funzionante si puo' selezionare il salvataggio preferito dal tab hosting
Spam su Firebase
Giusto ieri stavo giocando con l'autenticazione Web di Firebase.
Si tratta di un sistema piuttosto semplice. Prima si copia il codice Javascript con i codici di accesso e li si inserisce nella pagina HTML di login
Per prima cosa ho modificato la pagina di tutorial eliminando la possibilita' di registrarsi con la mail. L'idea e' che l'amministratore inserisce a mano gli utenti che possono loggarsi eliminando gli accessi anonimi
Questa e' la pagina di login ed il relativo codice (in giallo nel codice i comandi per l'autenticazione con Firebase)
email3.html
-------------------
<!DOCTYPE html>
<!--
Copyright (c) 2016 Google Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<html>
<head>
<meta charset=utf-8 />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Email/Password Authentication Example</title>
<!-- Material Design Theming -->
<link rel="stylesheet" href="https://code.getmdl.io/1.1.3/material.orange-indigo.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<script defer src="https://code.getmdl.io/1.1.3/material.min.js"></script>
<link rel="stylesheet" href="main.css">
<!-- Firebase -->
<script src="https://www.gstatic.com/firebasejs/3.6.4/firebase.js"></script>
<script>
// Initialize Firebase
var config = {
apiKey: "AIzaSyAchx8oVeLUgYnGujAXXXXXXXXXXXXXXX",
authDomain: "notifXXXXXXXXX.firebaseapp.com",
databaseURL: "https://notiXXXXXXXX.firebaseio.com",
storageBucket: "notifXXXXXXX.appspot.com",
messagingSenderId: "392XXXXXXXX"
};
firebase.initializeApp(config);
</script>
<script type="text/javascript">
/**
* Handles the sign in button press.
*/
function toggleSignIn() {
if (firebase.auth().currentUser) {
// [START signout]
firebase.auth().signOut();
// [END signout]
} else {
var email = document.getElementById('email').value;
var password = document.getElementById('password').value;
// Sign in with email and pass.
// [START authwithemail]
firebase.auth().signInWithEmailAndPassword(email, password).catch(function(error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// [START_EXCLUDE]
if (errorCode === 'auth/wrong-password') {
alert('Wrong password.');
} else {
alert(errorMessage);
}
console.log(error);
});
}
}
function initApp() {
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
window.location.href = "email3.html";
}
});
document.getElementById('quickstart-sign-in').addEventListener('click', toggleSignIn, false);
}
window.onload = function() {
initApp();
};
</script>
</head>
<body>
<div class="demo-layout mdl-layout mdl-js-layout mdl-layout--fixed-header">
<!-- Header section containing title -->
<header class="mdl-layout__header mdl-color-text--white mdl-color--light-blue-700">
</header>
<main class="mdl-layout__content mdl-color--grey-100">
<div class="mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-grid">
<!-- Container for the demo -->
<div class="mdl-card mdl-shadow--2dp mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-cell--12-col-desktop">
<div class="mdl-card__title mdl-color--light-blue-600 mdl-color-text--white">
<h2 class="mdl-card__title-text">Firebase Email & Password Authentication</h2>
</div>
<div class="mdl-card__supporting-text mdl-color-text--grey-600">
<p>Enter an email and password below and either sign in to an existing account or sign up</p>
<input class="mdl-textfield__input" style="display:inline;width:auto;" type="text" id="email" name="email" placeholder="Email"/>
<input class="mdl-textfield__input" style="display:inline;width:auto;" type="password" id="password" name="password" placeholder="Password"/>
<br/><br/>
<button class="mdl-button mdl-js-button mdl-button--raised" id="quickstart-sign-in" name="signin">Sign In</button>
</div>
</div>
</div>
</main>
</div>
</body>
</html>
-------------------
Se l'autenticazione e' corretta allora passa automaticamente alla pagina 2. Se si accede direttamente alla pagina 2 senza autenticazione questa rimanda indietro alla pagina di login.
email3.html
------------------
<!DOCTYPE html>
<!--
Copyright (c) 2016 Google Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<html>
<head>
<meta charset=utf-8 />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Email/Password Authentication Example</title>
<!-- Material Design Theming -->
<link rel="stylesheet" href="https://code.getmdl.io/1.1.3/material.orange-indigo.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<script defer src="https://code.getmdl.io/1.1.3/material.min.js"></script>
<link rel="stylesheet" href="main.css">
<!-- Firebase -->
<script src="https://www.gstatic.com/firebasejs/3.6.4/firebase.js"></script>
<script>
// Initialize Firebase
var config = {
apiKey: "AIzaSyAchx8oVeLUgYnGujAEfXXXXXXXXXXXXX",
authDomain: "XXXXXXXXX.firebaseapp.com",
databaseURL: "https://XXXXXXXX5.firebaseio.com",
storageBucket: "XXXXXXXXX.appspot.com",
messagingSenderId: "39272XXXXXXXX"
};
firebase.initializeApp(config);
</script>
<script type="text/javascript">
/**
* Handles the sign in button press.
*/
function toggleSignIn() {
if (firebase.auth().currentUser) {
// [START signout]
firebase.auth().signOut();
window.location.href = "email2.html";
// [END signout]
} else {
var email = document.getElementById('email').value;
// Sign in with email and pass.
// [START authwithemail]
firebase.auth().signInWithEmailAndPassword(email, password).catch(function(error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// [START_EXCLUDE]
if (errorCode === 'auth/wrong-password') {
alert('Wrong password.');
} else {
alert(errorMessage);
}
console.log(error);
document.getElementById('quickstart-sign-in').disabled = false;
// [END_EXCLUDE]
});
// [END authwithemail]
}
document.getElementById('quickstart-sign-in').disabled = true;
}
/**
* initApp handles setting up UI event listeners and registering Firebase auth listeners:
* - firebase.auth().onAuthStateChanged: This listener is called when the user is signed in or
* out, and that is where we update the UI.
*/
function initApp() {
// Listening for auth state changes.
// [START authstatelistener]
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
// User is signed in.
var displayName = user.displayName;
var email = user.email;
var emailVerified = user.emailVerified;
var photoURL = user.photoURL;
var isAnonymous = user.isAnonymous;
var uid = user.uid;
var providerData = user.providerData;
// [START_EXCLUDE silent]
document.getElementById('quickstart-sign-in-status').textContent = 'Signed in';
document.getElementById('quickstart-sign-in').textContent = 'Sign out';
document.getElementById('quickstart-account-details').textContent = JSON.stringify(user, null, ' ');
// [END_EXCLUDE]
} else {
window.location.href = "email2.html";
}
});
// [END authstatelistener]
document.getElementById('quickstart-sign-in').addEventListener('click', toggleSignIn, false);
}
window.onload = function() {
initApp();
};
</script>
</head>
<body>
<div class="demo-layout mdl-layout mdl-js-layout mdl-layout--fixed-header">
<!-- Header section containing title -->
<header class="mdl-layout__header mdl-color-text--white mdl-color--light-blue-700">
<div class="mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-grid">
<div class="mdl-layout__header-row mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-cell--8-col-desktop">
<a href="/"><h3>Firebase Authentication</h3></a>
</div>
</div>
</header>
<main class="mdl-layout__content mdl-color--grey-100">
<div class="mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-grid">
<!-- Container for the demo -->
<div class="mdl-card mdl-shadow--2dp mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-cell--12-col-desktop">
<div class="mdl-card__title mdl-color--light-blue-600 mdl-color-text--white">
<h2 class="mdl-card__title-text">Firebase Email & Password Authentication</h2>
</div>
<div class="mdl-card__supporting-text mdl-color-text--grey-600">
<button class="mdl-button mdl-js-button mdl-button--raised" id="quickstart-sign-in" name="signin">Sign In</button>
<!-- Container where we'll display the user details -->
<div class="quickstart-user-details-container">
Firebase sign-in status: <span id="quickstart-sign-in-status">Unknown</span>
<div>Firebase auth <code>currentUser</code> object value:</div>
<pre><code id="quickstart-account-details">null</code></pre>
</div>
</div>
</div>
</div>
</main>
</div>
</body>
</html>
------------------
Stamani riprendendo in mano la cosa mi sono accorto di un nuovo utente che si era registrato (vedi l'ultima riga della tabella sottostante) senza nessun intervento. Visto che i codici di autenticazione sono inclusi in Javascript e non sono mascherabili e' abbastanza semplice fare un codice HTML che crei un login anonimo via email
a quanto pare non e' possibile limitare questo comportamento. L'unica possibilita' di filtro e' a livello di permessi di accesso alla base dati
Si tratta di un sistema piuttosto semplice. Prima si copia il codice Javascript con i codici di accesso e li si inserisce nella pagina HTML di login
Per prima cosa ho modificato la pagina di tutorial eliminando la possibilita' di registrarsi con la mail. L'idea e' che l'amministratore inserisce a mano gli utenti che possono loggarsi eliminando gli accessi anonimi
Questa e' la pagina di login ed il relativo codice (in giallo nel codice i comandi per l'autenticazione con Firebase)
email3.html
-------------------
<!DOCTYPE html>
<!--
Copyright (c) 2016 Google Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<html>
<head>
<meta charset=utf-8 />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Email/Password Authentication Example</title>
<!-- Material Design Theming -->
<link rel="stylesheet" href="https://code.getmdl.io/1.1.3/material.orange-indigo.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<script defer src="https://code.getmdl.io/1.1.3/material.min.js"></script>
<link rel="stylesheet" href="main.css">
<!-- Firebase -->
<script src="https://www.gstatic.com/firebasejs/3.6.4/firebase.js"></script>
<script>
// Initialize Firebase
var config = {
apiKey: "AIzaSyAchx8oVeLUgYnGujAXXXXXXXXXXXXXXX",
authDomain: "notifXXXXXXXXX.firebaseapp.com",
databaseURL: "https://notiXXXXXXXX.firebaseio.com",
storageBucket: "notifXXXXXXX.appspot.com",
messagingSenderId: "392XXXXXXXX"
};
firebase.initializeApp(config);
</script>
<script type="text/javascript">
/**
* Handles the sign in button press.
*/
function toggleSignIn() {
if (firebase.auth().currentUser) {
// [START signout]
firebase.auth().signOut();
// [END signout]
} else {
var email = document.getElementById('email').value;
var password = document.getElementById('password').value;
// Sign in with email and pass.
// [START authwithemail]
firebase.auth().signInWithEmailAndPassword(email, password).catch(function(error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// [START_EXCLUDE]
if (errorCode === 'auth/wrong-password') {
alert('Wrong password.');
} else {
alert(errorMessage);
}
console.log(error);
});
}
}
function initApp() {
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
window.location.href = "email3.html";
}
});
document.getElementById('quickstart-sign-in').addEventListener('click', toggleSignIn, false);
}
window.onload = function() {
initApp();
};
</script>
</head>
<body>
<div class="demo-layout mdl-layout mdl-js-layout mdl-layout--fixed-header">
<!-- Header section containing title -->
<header class="mdl-layout__header mdl-color-text--white mdl-color--light-blue-700">
</header>
<main class="mdl-layout__content mdl-color--grey-100">
<div class="mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-grid">
<!-- Container for the demo -->
<div class="mdl-card mdl-shadow--2dp mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-cell--12-col-desktop">
<div class="mdl-card__title mdl-color--light-blue-600 mdl-color-text--white">
<h2 class="mdl-card__title-text">Firebase Email & Password Authentication</h2>
</div>
<div class="mdl-card__supporting-text mdl-color-text--grey-600">
<p>Enter an email and password below and either sign in to an existing account or sign up</p>
<input class="mdl-textfield__input" style="display:inline;width:auto;" type="text" id="email" name="email" placeholder="Email"/>
<input class="mdl-textfield__input" style="display:inline;width:auto;" type="password" id="password" name="password" placeholder="Password"/>
<br/><br/>
<button class="mdl-button mdl-js-button mdl-button--raised" id="quickstart-sign-in" name="signin">Sign In</button>
</div>
</div>
</div>
</main>
</div>
</body>
</html>
-------------------
Se l'autenticazione e' corretta allora passa automaticamente alla pagina 2. Se si accede direttamente alla pagina 2 senza autenticazione questa rimanda indietro alla pagina di login.
email3.html
------------------
<!DOCTYPE html>
<!--
Copyright (c) 2016 Google Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<html>
<head>
<meta charset=utf-8 />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Email/Password Authentication Example</title>
<!-- Material Design Theming -->
<link rel="stylesheet" href="https://code.getmdl.io/1.1.3/material.orange-indigo.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<script defer src="https://code.getmdl.io/1.1.3/material.min.js"></script>
<link rel="stylesheet" href="main.css">
<!-- Firebase -->
<script src="https://www.gstatic.com/firebasejs/3.6.4/firebase.js"></script>
<script>
// Initialize Firebase
var config = {
apiKey: "AIzaSyAchx8oVeLUgYnGujAEfXXXXXXXXXXXXX",
authDomain: "XXXXXXXXX.firebaseapp.com",
databaseURL: "https://XXXXXXXX5.firebaseio.com",
storageBucket: "XXXXXXXXX.appspot.com",
messagingSenderId: "39272XXXXXXXX"
};
firebase.initializeApp(config);
</script>
<script type="text/javascript">
/**
* Handles the sign in button press.
*/
function toggleSignIn() {
if (firebase.auth().currentUser) {
// [START signout]
firebase.auth().signOut();
window.location.href = "email2.html";
// [END signout]
} else {
var email = document.getElementById('email').value;
// Sign in with email and pass.
// [START authwithemail]
firebase.auth().signInWithEmailAndPassword(email, password).catch(function(error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// [START_EXCLUDE]
if (errorCode === 'auth/wrong-password') {
alert('Wrong password.');
} else {
alert(errorMessage);
}
console.log(error);
document.getElementById('quickstart-sign-in').disabled = false;
// [END_EXCLUDE]
});
// [END authwithemail]
}
document.getElementById('quickstart-sign-in').disabled = true;
}
/**
* initApp handles setting up UI event listeners and registering Firebase auth listeners:
* - firebase.auth().onAuthStateChanged: This listener is called when the user is signed in or
* out, and that is where we update the UI.
*/
function initApp() {
// Listening for auth state changes.
// [START authstatelistener]
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
// User is signed in.
var displayName = user.displayName;
var email = user.email;
var emailVerified = user.emailVerified;
var photoURL = user.photoURL;
var isAnonymous = user.isAnonymous;
var uid = user.uid;
var providerData = user.providerData;
// [START_EXCLUDE silent]
document.getElementById('quickstart-sign-in-status').textContent = 'Signed in';
document.getElementById('quickstart-sign-in').textContent = 'Sign out';
document.getElementById('quickstart-account-details').textContent = JSON.stringify(user, null, ' ');
// [END_EXCLUDE]
} else {
window.location.href = "email2.html";
}
});
// [END authstatelistener]
document.getElementById('quickstart-sign-in').addEventListener('click', toggleSignIn, false);
}
window.onload = function() {
initApp();
};
</script>
</head>
<body>
<div class="demo-layout mdl-layout mdl-js-layout mdl-layout--fixed-header">
<!-- Header section containing title -->
<header class="mdl-layout__header mdl-color-text--white mdl-color--light-blue-700">
<div class="mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-grid">
<div class="mdl-layout__header-row mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-cell--8-col-desktop">
<a href="/"><h3>Firebase Authentication</h3></a>
</div>
</div>
</header>
<main class="mdl-layout__content mdl-color--grey-100">
<div class="mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-grid">
<!-- Container for the demo -->
<div class="mdl-card mdl-shadow--2dp mdl-cell mdl-cell--12-col mdl-cell--12-col-tablet mdl-cell--12-col-desktop">
<div class="mdl-card__title mdl-color--light-blue-600 mdl-color-text--white">
<h2 class="mdl-card__title-text">Firebase Email & Password Authentication</h2>
</div>
<div class="mdl-card__supporting-text mdl-color-text--grey-600">
<button class="mdl-button mdl-js-button mdl-button--raised" id="quickstart-sign-in" name="signin">Sign In</button>
<!-- Container where we'll display the user details -->
<div class="quickstart-user-details-container">
Firebase sign-in status: <span id="quickstart-sign-in-status">Unknown</span>
<div>Firebase auth <code>currentUser</code> object value:</div>
<pre><code id="quickstart-account-details">null</code></pre>
</div>
</div>
</div>
</div>
</main>
</div>
</body>
</html>
------------------
Stamani riprendendo in mano la cosa mi sono accorto di un nuovo utente che si era registrato (vedi l'ultima riga della tabella sottostante) senza nessun intervento. Visto che i codici di autenticazione sono inclusi in Javascript e non sono mascherabili e' abbastanza semplice fare un codice HTML che crei un login anonimo via email
a quanto pare non e' possibile limitare questo comportamento. L'unica possibilita' di filtro e' a livello di permessi di accesso alla base dati
Iscriviti a:
Post (Atom)
Debugger integrato ESP32S3
Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede nell'ID USB della porta Jtag. Nel modulo...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...