Skip to content

Commit

Permalink
Implement QR Code server
Browse files Browse the repository at this point in the history
  • Loading branch information
michael-m-2983 committed Sep 8, 2024
1 parent 6d0f9fd commit bfb2eeb
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 7 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
# turbo-server data directory
20*

# turbo-qr data directory
qr
1 change: 1 addition & 0 deletions turbo-scout/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"type": "module",
"scripts": {
"dev": "vite",
"dev-host": "vite --host",
"build": "tsc -b && vite build",
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"preview": "vite preview"
Expand Down
20 changes: 14 additions & 6 deletions turbo-scout/src/pages/share.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { BaseLayout } from "../layout";

import { Card, Center, Container, Group, Stack, ThemeIcon, UnstyledButton } from "@mantine/core";
import { IconBluetooth, IconDownload, IconQrcode, IconShare, IconWifi } from "@tabler/icons-react";
import { TurboStore, useTurboStore } from "../state";
import { TurboStore, md5, useTurboStore } from "../state";
import download from "downloadjs";
import { modals } from "@mantine/modals";
import QRCode from "react-qr-code";
Expand Down Expand Up @@ -49,13 +49,21 @@ const methods: ShareMethod[] = [
name: "QR Code",
icon: <IconQrcode style={{ width: "70%", height: "70%" }} />,
sendData: (state: TurboStore) => {

const content: string = JSON.stringify(state);

modals.open({
title: "QR Code",
centered: true,
children: <Center style={{ background: 'white', padding: '25px' }}>
<QRCode value={JSON.stringify(state)} />
</Center>
})
children: <Stack>
<Center style={{ background: 'white', padding: '25px' }}>
<QRCode value={content} />
</Center>
<pre>
Hash = {md5(content)}
</pre>
</Stack>
});
}
}
];
Expand All @@ -72,7 +80,7 @@ export default function SharePage() {
</pre>
<Center>
<Group>
{methods.map(method => <MethodButton method={method} state={state} />)}
{methods.map(method => <MethodButton method={method} state={state} key={method.name} />)}
</Group>
</Center>
</Container>
Expand Down
53 changes: 52 additions & 1 deletion turbo-scout/src/state.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,55 @@ export const useTurboStore = create<TurboStore>((set: any) => ({
...state,
entries: [...state.entries, entry]
}))
}));
}));

/**
* 42-line MD5 hash implementation.
*
* Taken from <https://stackoverflow.com/a/60467595>.
*
* @param inputString The string to hash. This MUST be a string.
* @returns A md5 hash.
*/
export function md5(inputString: string) {
var hc="0123456789abcdef";
function rh(n: number) {var j,s="";for(j=0;j<=3;j++) s+=hc.charAt((n>>(j*8+4))&0x0F)+hc.charAt((n>>(j*8))&0x0F);return s;}
function ad(x: number, y: number) {var l=(x&0xFFFF)+(y&0xFFFF);var m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xFFFF);}
function rl(n: number, c: number) {return (n<<c)|(n>>>(32-c));}
function cm(q: number, a: number, b: number, x: number, s: number, t: number) {return ad(rl(ad(ad(a,q),ad(x,t)),s),b);}
function ff(a: number,b: number, c: number, d: number, x: number, s: number, t: number) {return cm((b&c)|((~b)&d),a,b,x,s,t);}
function gg(a: number, b: number, c: number, d: number, x: number, s: number, t: number) {return cm((b&d)|(c&(~d)),a,b,x,s,t);}
function hh(a: number, b: number, c: number, d: number, x: number, s: number, t: number) {return cm(b^c^d,a,b,x,s,t);}
function ii(a: number, b: number, c: number, d: number, x: number, s: number, t: number) {return cm(c^(b|(~d)),a,b,x,s,t);}
function sb(x: string) {
var i;var nblk=((x.length+8)>>6)+1;var blks=new Array(nblk*16);for(i=0;i<nblk*16;i++) blks[i]=0;
for(i=0;i<x.length;i++) blks[i>>2]|=x.charCodeAt(i)<<((i%4)*8);
blks[i>>2]|=0x80<<((i%4)*8);blks[nblk*16-2]=x.length*8;return blks;
}
var i,x=sb(""+inputString),a=1732584193,b=-271733879,c=-1732584194,d=271733878,olda,oldb,oldc,oldd;
for(i=0;i<x.length;i+=16) {olda=a;oldb=b;oldc=c;oldd=d;
a=ff(a,b,c,d,x[i+ 0], 7, -680876936);d=ff(d,a,b,c,x[i+ 1],12, -389564586);c=ff(c,d,a,b,x[i+ 2],17, 606105819);
b=ff(b,c,d,a,x[i+ 3],22,-1044525330);a=ff(a,b,c,d,x[i+ 4], 7, -176418897);d=ff(d,a,b,c,x[i+ 5],12, 1200080426);
c=ff(c,d,a,b,x[i+ 6],17,-1473231341);b=ff(b,c,d,a,x[i+ 7],22, -45705983);a=ff(a,b,c,d,x[i+ 8], 7, 1770035416);
d=ff(d,a,b,c,x[i+ 9],12,-1958414417);c=ff(c,d,a,b,x[i+10],17, -42063);b=ff(b,c,d,a,x[i+11],22,-1990404162);
a=ff(a,b,c,d,x[i+12], 7, 1804603682);d=ff(d,a,b,c,x[i+13],12, -40341101);c=ff(c,d,a,b,x[i+14],17,-1502002290);
b=ff(b,c,d,a,x[i+15],22, 1236535329);a=gg(a,b,c,d,x[i+ 1], 5, -165796510);d=gg(d,a,b,c,x[i+ 6], 9,-1069501632);
c=gg(c,d,a,b,x[i+11],14, 643717713);b=gg(b,c,d,a,x[i+ 0],20, -373897302);a=gg(a,b,c,d,x[i+ 5], 5, -701558691);
d=gg(d,a,b,c,x[i+10], 9, 38016083);c=gg(c,d,a,b,x[i+15],14, -660478335);b=gg(b,c,d,a,x[i+ 4],20, -405537848);
a=gg(a,b,c,d,x[i+ 9], 5, 568446438);d=gg(d,a,b,c,x[i+14], 9,-1019803690);c=gg(c,d,a,b,x[i+ 3],14, -187363961);
b=gg(b,c,d,a,x[i+ 8],20, 1163531501);a=gg(a,b,c,d,x[i+13], 5,-1444681467);d=gg(d,a,b,c,x[i+ 2], 9, -51403784);
c=gg(c,d,a,b,x[i+ 7],14, 1735328473);b=gg(b,c,d,a,x[i+12],20,-1926607734);a=hh(a,b,c,d,x[i+ 5], 4, -378558);
d=hh(d,a,b,c,x[i+ 8],11,-2022574463);c=hh(c,d,a,b,x[i+11],16, 1839030562);b=hh(b,c,d,a,x[i+14],23, -35309556);
a=hh(a,b,c,d,x[i+ 1], 4,-1530992060);d=hh(d,a,b,c,x[i+ 4],11, 1272893353);c=hh(c,d,a,b,x[i+ 7],16, -155497632);
b=hh(b,c,d,a,x[i+10],23,-1094730640);a=hh(a,b,c,d,x[i+13], 4, 681279174);d=hh(d,a,b,c,x[i+ 0],11, -358537222);
c=hh(c,d,a,b,x[i+ 3],16, -722521979);b=hh(b,c,d,a,x[i+ 6],23, 76029189);a=hh(a,b,c,d,x[i+ 9], 4, -640364487);
d=hh(d,a,b,c,x[i+12],11, -421815835);c=hh(c,d,a,b,x[i+15],16, 530742520);b=hh(b,c,d,a,x[i+ 2],23, -995338651);
a=ii(a,b,c,d,x[i+ 0], 6, -198630844);d=ii(d,a,b,c,x[i+ 7],10, 1126891415);c=ii(c,d,a,b,x[i+14],15,-1416354905);
b=ii(b,c,d,a,x[i+ 5],21, -57434055);a=ii(a,b,c,d,x[i+12], 6, 1700485571);d=ii(d,a,b,c,x[i+ 3],10,-1894986606);
c=ii(c,d,a,b,x[i+10],15, -1051523);b=ii(b,c,d,a,x[i+ 1],21,-2054922799);a=ii(a,b,c,d,x[i+ 8], 6, 1873313359);
d=ii(d,a,b,c,x[i+15],10, -30611744);c=ii(c,d,a,b,x[i+ 6],15,-1560198380);b=ii(b,c,d,a,x[i+13],21, 1309151649);
a=ii(a,b,c,d,x[i+ 4], 6, -145523070);d=ii(d,a,b,c,x[i+11],10,-1120210379);c=ii(c,d,a,b,x[i+ 2],15, 718787259);
b=ii(b,c,d,a,x[i+ 9],21, -343485551);a=ad(a,olda);b=ad(b,oldb);c=ad(c,oldc);d=ad(d,oldd);
}
return rh(a)+rh(b)+rh(c)+rh(d);
}
27 changes: 27 additions & 0 deletions turbo_qr.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
"""
turbo-qr
This is a script for quickly storing QR code data.
Requirements: python 3, opencv2, a camera
"""

import cv2
import time
import os
import hashlib

capture = cv2.VideoCapture(0)
detector = cv2.QRCodeDetector()

os.makedirs("./qr", exist_ok=True)

while True:
_, image = capture.read()
data, bbox, _ = detector.detectAndDecode(image)

if data:
with open(f"qr/scan-{time.time()}.json", "w") as fp:
fp.write(data)
print("Data saved (hash=%s)" % hashlib.md5(data.encode('utf-8')).hexdigest())
break

0 comments on commit bfb2eeb

Please sign in to comment.