first commit
This commit is contained in:
27
main.py
Normal file
27
main.py
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
from fastapi import FastAPI, APIRouter, Request
|
||||||
|
from fastapi.templating import Jinja2Templates
|
||||||
|
from security import security_router
|
||||||
|
import uvicorn
|
||||||
|
|
||||||
|
app = FastAPI()
|
||||||
|
app.include_router(security_router)
|
||||||
|
|
||||||
|
templates = Jinja2Templates(directory="templates")
|
||||||
|
|
||||||
|
|
||||||
|
@app.get("/")
|
||||||
|
async def read_root(request: Request):
|
||||||
|
data = "hi"
|
||||||
|
return templates.TemplateResponse(
|
||||||
|
request=request,
|
||||||
|
name="index.html",
|
||||||
|
contents={"data": data}
|
||||||
|
)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
uvicorn.run(
|
||||||
|
"main:app",
|
||||||
|
host="0.0.0.0",
|
||||||
|
port=8080,
|
||||||
|
reload=True
|
||||||
|
)
|
||||||
1
security/__init__.py
Normal file
1
security/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from .security import security_router
|
||||||
BIN
security/__pycache__/__init__.cpython-310.pyc
Normal file
BIN
security/__pycache__/__init__.cpython-310.pyc
Normal file
Binary file not shown.
BIN
security/__pycache__/security.cpython-310.pyc
Normal file
BIN
security/__pycache__/security.cpython-310.pyc
Normal file
Binary file not shown.
17
security/security.py
Normal file
17
security/security.py
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
from fastapi import APIRouter, Request
|
||||||
|
from fastapi.templating import Jinja2Templates
|
||||||
|
|
||||||
|
security_router = APIRouter(prefix="/security", tags=["security"])
|
||||||
|
templates = Jinja2Templates(directory="templates")
|
||||||
|
|
||||||
|
|
||||||
|
@security_router.get("/browser")
|
||||||
|
async def security_check_list(request: Request):
|
||||||
|
return templates.TemplateResponse(
|
||||||
|
request=request, name="browser_random_number.html", contents={"rand": "rand"}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@security_router.get("/browser")
|
||||||
|
async def security_check_browser():
|
||||||
|
return {"message": "checking browser security"}
|
||||||
46
templates/base.html
Normal file
46
templates/base.html
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<link href="https://cdn.jsdelivr.net/npm/flowbite@2.5.2/dist/flowbite.min.css" rel="stylesheet" />
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/flowbite@2.5.2/dist/flowbite.min.js"></script>
|
||||||
|
<script src="https://webgl2fundamentals.org/webgl/resources/webgl-utils.js"></script>
|
||||||
|
<title>{% block title %}My FastAPI App{% endblock %}</title>
|
||||||
|
{% block css %}
|
||||||
|
{% endblock %}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
|
||||||
|
<nav class="bg-white border-gray-200 dark:bg-gray-900">
|
||||||
|
<div class="max-w-screen-xl flex flex-wrap items-center justify-between mx-auto p-4">
|
||||||
|
<a href="https://flowbite.com/" class="flex items-center space-x-3 rtl:space-x-reverse">
|
||||||
|
<img src="https://flowbite.com/docs/images/logo.svg" class="h-8" alt="Flowbite Logo" />
|
||||||
|
<span class="self-center text-2xl font-semibold whitespace-nowrap dark:text-white">Flowbite</span>
|
||||||
|
</a>
|
||||||
|
<button data-collapse-toggle="navbar-default" type="button" class="inline-flex items-center p-2 w-10 h-10 justify-center text-sm text-gray-500 rounded-lg md:hidden hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-200 dark:text-gray-400 dark:hover:bg-gray-700 dark:focus:ring-gray-600" aria-controls="navbar-default" aria-expanded="false">
|
||||||
|
<span class="sr-only">Open main menu</span>
|
||||||
|
<svg class="w-5 h-5" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 17 14">
|
||||||
|
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M1 1h15M1 7h15M1 13h15"/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<div class="hidden w-full md:block md:w-auto" id="navbar-default">
|
||||||
|
<ul class="font-medium flex flex-col p-4 md:p-0 mt-4 border border-gray-100 rounded-lg bg-gray-50 md:flex-row md:space-x-8 rtl:space-x-reverse md:mt-0 md:border-0 md:bg-white dark:bg-gray-800 md:dark:bg-gray-900 dark:border-gray-700">
|
||||||
|
<li>
|
||||||
|
<a href="#" class="block py-2 px-3 text-white bg-blue-700 rounded md:bg-transparent md:text-blue-700 md:p-0 dark:text-white md:dark:text-blue-500" aria-current="page">Home</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% endblock %}
|
||||||
|
{% block js %}
|
||||||
|
{% endblock %}
|
||||||
|
<footer>
|
||||||
|
<p>© 2024 EKSTRAH Security Application</p>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
198
templates/browser_random_number.html
Normal file
198
templates/browser_random_number.html
Normal file
@@ -0,0 +1,198 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block title %}Browser Random Generation{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="max-w-scree grid grid-cols-1 items-center divide-y">
|
||||||
|
<div class="flex justify-center pt-6">
|
||||||
|
<p class="text-2xl" id="browser-name">Detected Browser: Something</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-center pt-6">
|
||||||
|
<canvas id="randNumCanvas" width="1000" height="1000"></canvas>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block js %}
|
||||||
|
<script>
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var vertexShaderSource = `#version 300 es
|
||||||
|
|
||||||
|
// an attribute is an input (in) to a vertex shader.
|
||||||
|
// It will receive data from a buffer
|
||||||
|
in vec2 a_position;
|
||||||
|
|
||||||
|
// Used to pass in the resolution of the canvas
|
||||||
|
uniform vec2 u_resolution;
|
||||||
|
|
||||||
|
// all shaders have a main function
|
||||||
|
void main() {
|
||||||
|
|
||||||
|
// convert the position from pixels to 0.0 to 1.0
|
||||||
|
vec2 zeroToOne = a_position / u_resolution;
|
||||||
|
|
||||||
|
// convert from 0->1 to 0->2
|
||||||
|
vec2 zeroToTwo = zeroToOne * 2.0;
|
||||||
|
|
||||||
|
// convert from 0->2 to -1->+1 (clipspace)
|
||||||
|
vec2 clipSpace = zeroToTwo - 1.0;
|
||||||
|
|
||||||
|
gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
var fragmentShaderSource = `#version 300 es
|
||||||
|
|
||||||
|
precision highp float;
|
||||||
|
|
||||||
|
uniform vec4 u_color;
|
||||||
|
|
||||||
|
// we need to declare an output for the fragment shader
|
||||||
|
out vec4 outColor;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
outColor = u_color;
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
// Get A WebGL context
|
||||||
|
var canvas = document.querySelector("#randNumCanvas");
|
||||||
|
var gl = canvas.getContext("webgl2");
|
||||||
|
if (!gl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use our boilerplate utils to compile the shaders and link into a program
|
||||||
|
var program = webglUtils.createProgramFromSources(gl,
|
||||||
|
[vertexShaderSource, fragmentShaderSource]);
|
||||||
|
|
||||||
|
// look up where the vertex data needs to go.
|
||||||
|
var positionAttributeLocation = gl.getAttribLocation(program, "a_position");
|
||||||
|
|
||||||
|
// look up uniform locations
|
||||||
|
var resolutionUniformLocation = gl.getUniformLocation(program, "u_resolution");
|
||||||
|
var colorLocation = gl.getUniformLocation(program, "u_color");
|
||||||
|
|
||||||
|
// Create a buffer
|
||||||
|
var positionBuffer = gl.createBuffer();
|
||||||
|
|
||||||
|
// Create a vertex array object (attribute state)
|
||||||
|
var vao = gl.createVertexArray();
|
||||||
|
|
||||||
|
// and make it the one we're currently working with
|
||||||
|
gl.bindVertexArray(vao);
|
||||||
|
|
||||||
|
// Turn on the attribute
|
||||||
|
gl.enableVertexAttribArray(positionAttributeLocation);
|
||||||
|
|
||||||
|
// Bind it to ARRAY_BUFFER (think of it as ARRAY_BUFFER = positionBuffer)
|
||||||
|
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
|
||||||
|
|
||||||
|
// Tell the attribute how to get data out of positionBuffer (ARRAY_BUFFER)
|
||||||
|
var size = 2; // 2 components per iteration
|
||||||
|
var type = gl.FLOAT; // the data is 32bit floats
|
||||||
|
var normalize = false; // don't normalize the data
|
||||||
|
var stride = 0; // 0 = move forward size * sizeof(type) each iteration to get the next position
|
||||||
|
var offset = 0; // start at the beginning of the buffer
|
||||||
|
gl.vertexAttribPointer(
|
||||||
|
positionAttributeLocation, size, type, normalize, stride, offset);
|
||||||
|
|
||||||
|
webglUtils.resizeCanvasToDisplaySize(gl.canvas);
|
||||||
|
|
||||||
|
// Tell WebGL how to convert from clip space to pixels
|
||||||
|
gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
|
||||||
|
|
||||||
|
// Clear the canvas
|
||||||
|
gl.clearColor(0, 0, 0, 0);
|
||||||
|
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
// Tell it to use our program (pair of shaders)
|
||||||
|
gl.useProgram(program);
|
||||||
|
|
||||||
|
// Bind the attribute/buffer set we want.
|
||||||
|
gl.bindVertexArray(vao);
|
||||||
|
|
||||||
|
// Pass in the canvas resolution so we can convert from
|
||||||
|
// pixels to clipspace in the shader
|
||||||
|
gl.uniform2f(resolutionUniformLocation, gl.canvas.width, gl.canvas.height);
|
||||||
|
//const array = new Uint16Array(30_000);
|
||||||
|
//const randNum = self.crypto.getRandomValues(array);
|
||||||
|
// draw 50 random rectangles in random colors
|
||||||
|
var primitiveType = gl.TRIANGLES;
|
||||||
|
var offset = 0;
|
||||||
|
var count = 6;
|
||||||
|
var counter = 0;
|
||||||
|
var array2D = [];
|
||||||
|
var y_cnt = 0;
|
||||||
|
var x_cnt = 0;
|
||||||
|
for (var size = 0; size < 1000; ++size) {
|
||||||
|
array2D[size] = self.crypto.getRandomValues(new Uint16Array(1000));
|
||||||
|
}
|
||||||
|
for (var y = 0; y < 2000; y = y + 2) {
|
||||||
|
for (var x = 0; x < 2000; x = x + 2) {
|
||||||
|
setRectangle(gl, x, y, 2, 2);
|
||||||
|
gl.uniform4f(colorLocation, 0.0, 0.0, 0.0, normalizeUint16(array2D[y/2][x/2]));
|
||||||
|
gl.drawArrays(primitiveType, offset, count);
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns a random integer from 0 to range - 1.
|
||||||
|
function randomInt(range) {
|
||||||
|
return Math.floor(Math.random() * range);
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeUint16(val) {
|
||||||
|
return val/65535;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fill the buffer with the values that define a rectangle.
|
||||||
|
function setRectangle(gl, x, y, width, height) {
|
||||||
|
var x1 = x;
|
||||||
|
var x2 = x + width;
|
||||||
|
var y1 = y;
|
||||||
|
var y2 = y + height;
|
||||||
|
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
|
||||||
|
x1, y1,
|
||||||
|
x2, y1,
|
||||||
|
x1, y2,
|
||||||
|
x1, y2,
|
||||||
|
x2, y1,
|
||||||
|
x2, y2,
|
||||||
|
]), gl.STATIC_DRAW);
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
// Function to detect the browser name
|
||||||
|
function detectBrowser() {
|
||||||
|
var userAgent = navigator.userAgent;
|
||||||
|
if (userAgent.indexOf("Edg") > -1) {
|
||||||
|
return "Microsoft Edge";
|
||||||
|
} else if (userAgent.indexOf("Chrome") > -1) {
|
||||||
|
return "Chrome";
|
||||||
|
} else if (userAgent.indexOf("Firefox") > -1) {
|
||||||
|
return "Firefox";
|
||||||
|
} else if (userAgent.indexOf("Safari") > -1) {
|
||||||
|
return "Safari";
|
||||||
|
} else if (userAgent.indexOf("Opera") > -1) {
|
||||||
|
return "Opera";
|
||||||
|
} else if (userAgent.indexOf("Trident") > -1 || userAgent.indexOf("MSIE") > -1) {
|
||||||
|
return "Internet Explorer";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the browser name and display it
|
||||||
|
var browserName = detectBrowser();
|
||||||
|
document.getElementById("browser-name").innerText = "Detected Browser: " + browserName;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
19
templates/browser_security_random_number.html
Normal file
19
templates/browser_security_random_number.html
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>{% block title %}My FastAPI App{% endblock %}</title>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{% block content %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{# Footer #}
|
||||||
|
<footer>
|
||||||
|
<p>© 2024 EKSTRAH Security Application</p>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
{% block js %}{% endblock %}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
14
templates/index.html
Normal file
14
templates/index.html
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block title %}Home Page{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
<h1>Hello World</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block css %}
|
||||||
|
{{ super() }}
|
||||||
|
{% endblock %}
|
||||||
Reference in New Issue
Block a user