Random passwords during study (fix #120) #159
4 changed files with 87 additions and 8 deletions
|
@ -5,6 +5,7 @@ import flask_sqlalchemy
|
||||||
import flask_praetorian
|
import flask_praetorian
|
||||||
import flask_cors
|
import flask_cors
|
||||||
import sys
|
import sys
|
||||||
|
from password_util import get_random_password
|
||||||
|
|
||||||
db = flask_sqlalchemy.SQLAlchemy()
|
db = flask_sqlalchemy.SQLAlchemy()
|
||||||
guard = flask_praetorian.Praetorian()
|
guard = flask_praetorian.Praetorian()
|
||||||
|
@ -132,6 +133,14 @@ def protected():
|
||||||
return {'message': f'protected endpoint (allowed user {flask_praetorian.current_user().username})'}
|
return {'message': f'protected endpoint (allowed user {flask_praetorian.current_user().username})'}
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/api/protected/rcv_pw', methods=['GET'])
|
||||||
|
# @flask_praetorian.auth_required
|
||||||
|
def get_password():
|
||||||
|
pw = get_random_password()
|
||||||
|
ret = {'password': pw}
|
||||||
|
return ret, 200
|
||||||
|
|
||||||
|
|
||||||
@app.route('/api/register', methods=['POST'])
|
@app.route('/api/register', methods=['POST'])
|
||||||
def register():
|
def register():
|
||||||
req = flask.request.get_json(force=True)
|
req = flask.request.get_json(force=True)
|
||||||
|
@ -239,8 +248,6 @@ def survey():
|
||||||
return ret, 400
|
return ret, 400
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Run the example
|
# Run the example
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app.run(debug=debug, host=host, port=port)
|
app.run(debug=debug, host=host, port=port)
|
||||||
|
|
60
backend/src/password_util.py
Normal file
60
backend/src/password_util.py
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
from random import seed
|
||||||
|
from random import randint
|
||||||
|
import time
|
||||||
|
|
||||||
|
seed(int(time.time()))
|
||||||
|
|
||||||
|
|
||||||
|
def get_random_value(list_length):
|
||||||
|
random_select = randint(0, list_length)
|
||||||
|
return random_select
|
||||||
|
|
||||||
|
|
||||||
|
def get_random_password():
|
||||||
|
|
||||||
|
first_part = [
|
||||||
|
"Der Vogel",
|
||||||
|
"Die Ameise",
|
||||||
|
"Die Biene",
|
||||||
|
"Ein Mensch",
|
||||||
|
"Jemand",
|
||||||
|
"Der Hund",
|
||||||
|
"Der Kater",
|
||||||
|
]
|
||||||
|
|
||||||
|
second_part = [
|
||||||
|
"frisst",
|
||||||
|
"küsst",
|
||||||
|
"begrüsst",
|
||||||
|
"besucht",
|
||||||
|
"beeinflusst",
|
||||||
|
"isst",
|
||||||
|
"findet",
|
||||||
|
"vergisst",
|
||||||
|
]
|
||||||
|
|
||||||
|
third_part = [
|
||||||
|
"den Vogel",
|
||||||
|
"die Mücke",
|
||||||
|
"den Adler",
|
||||||
|
"den Apfel",
|
||||||
|
"die Birne",
|
||||||
|
"die Biene",
|
||||||
|
"eine Gurke",
|
||||||
|
]
|
||||||
|
|
||||||
|
forth_part = [
|
||||||
|
"auf der Terasse.",
|
||||||
|
"auf der Wiese.",
|
||||||
|
"im Garten.",
|
||||||
|
"in der Kühltruhe.",
|
||||||
|
"auf dem Balkon.",
|
||||||
|
]
|
||||||
|
|
||||||
|
password = ""
|
||||||
|
password += str(first_part[get_random_value(len(first_part)-1)])
|
||||||
|
password += " " + str(second_part[get_random_value(len(second_part)-1)])
|
||||||
|
password += " " + str(third_part[get_random_value(len(third_part)-1)])
|
||||||
|
password += " " + str(forth_part[get_random_value(len(forth_part)-1)])
|
||||||
|
|
||||||
|
return password
|
|
@ -77,3 +77,7 @@ h1 {
|
||||||
.bildnachweise {
|
.bildnachweise {
|
||||||
font-size: 1.3em;
|
font-size: 1.3em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.generated-password {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import React from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import "../../App.css";
|
import "../../App.css";
|
||||||
import Footer from "../../Footer";
|
import Footer from "../../Footer";
|
||||||
import InputField from "../InputField";
|
import InputField from "../InputField";
|
||||||
|
@ -16,6 +16,8 @@ export default function BehaviorNormal() {
|
||||||
password = tmp_password;
|
password = tmp_password;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const [genPassword, setGenPassword] = useState("")
|
||||||
|
|
||||||
let logger = new Logger({
|
let logger = new Logger({
|
||||||
//inputs: ["cursor", "wheel", "keyboard", "touch"],
|
//inputs: ["cursor", "wheel", "keyboard", "touch"],
|
||||||
inputs: ["keyboard"],
|
inputs: ["keyboard"],
|
||||||
|
@ -35,24 +37,20 @@ export default function BehaviorNormal() {
|
||||||
};
|
};
|
||||||
|
|
||||||
const handlePasswordChange = (e) => {
|
const handlePasswordChange = (e) => {
|
||||||
console.log("handlePasswordChange");
|
|
||||||
setPassword(e.target.value);
|
setPassword(e.target.value);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleUsernameChange = (e) => {
|
const handleUsernameChange = (e) => {
|
||||||
console.log("handleUsernamechange");
|
|
||||||
setUsername(e.target.value);
|
setUsername(e.target.value);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleOnCopyEvent = (e) => {
|
const handleOnCopyEvent = (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
console.log("copy not allowed");
|
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleOnPasteEvent = (e) => {
|
const handleOnPasteEvent = (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
console.log("paste not allowed");
|
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -80,6 +78,16 @@ export default function BehaviorNormal() {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
fetch("/api/protected/rcv_pw", {
|
||||||
|
method: "get",
|
||||||
|
}).then((response) => {
|
||||||
|
response.json().then((resp) => {
|
||||||
|
setGenPassword(resp.password)
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="sitePage">
|
<div className="sitePage">
|
||||||
|
@ -97,7 +105,7 @@ export default function BehaviorNormal() {
|
||||||
normalerweise anmelden.
|
normalerweise anmelden.
|
||||||
</p>
|
</p>
|
||||||
<p onCopy={handleOnCopyEvent}>
|
<p onCopy={handleOnCopyEvent}>
|
||||||
Das Passwort für diese Situation lautet: abcdefgeh
|
Das Passwort für diese Situation lautet: <span className="generated-password">{genPassword}</span>
|
||||||
</p>
|
</p>
|
||||||
<form id="behaviorNormal" action="#">
|
<form id="behaviorNormal" action="#">
|
||||||
<InputField
|
<InputField
|
||||||
|
|
Loading…
Reference in a new issue