diff options
author | Yigit Sever | 2021-04-15 03:50:34 +0300 |
---|---|---|
committer | Yigit Sever | 2021-04-15 03:50:34 +0300 |
commit | ee5dcba9046cdad96af673446165af0169fe15fe (patch) | |
tree | 93b70308ad1b5483513780cb82c1d2b839dbe3b3 | |
parent | 2b866db08bd20985a570c4f0f292aaecfe1ea052 (diff) | |
parent | 75d9257d89ebf2a544c8a5db0dc1d21b7f57464d (diff) | |
download | gradecoin-ee5dcba9046cdad96af673446165af0169fe15fe.tar.gz gradecoin-ee5dcba9046cdad96af673446165af0169fe15fe.tar.bz2 gradecoin-ee5dcba9046cdad96af673446165af0169fe15fe.zip |
Merge remote-tracking branch 'origin/template' into template
-rw-r--r-- | .gitmodules | 3 | ||||
-rw-r--r-- | TODO.md | 27 | ||||
-rw-r--r-- | scripts/python_client.py | 111 | ||||
-rw-r--r-- | site/config.toml | 23 | ||||
-rw-r--r-- | site/content/JWT.md | 11 | ||||
-rw-r--r-- | site/content/_index.md | 28 | ||||
-rw-r--r-- | site/content/block_docs.md | 11 | ||||
-rw-r--r-- | site/content/register_docs.md | 42 | ||||
-rw-r--r-- | site/content/transaction_docs.md | 11 | ||||
-rw-r--r-- | site/public/404.html | 3 | ||||
-rw-r--r-- | site/public/android-chrome-192x192.png (renamed from static/android-chrome-192x192.png) | bin | 26249 -> 26249 bytes | |||
-rw-r--r-- | site/public/android-chrome-512x512.png (renamed from static/android-chrome-512x512.png) | bin | 80376 -> 80376 bytes | |||
-rw-r--r-- | site/public/apple-touch-icon.png (renamed from static/apple-touch-icon.png) | bin | 24023 -> 24023 bytes | |||
-rw-r--r-- | site/public/block-docs/index.html | 126 | ||||
-rw-r--r-- | site/public/elasticlunr.min.js | 10 | ||||
-rw-r--r-- | site/public/favicon-16x16.png (renamed from static/favicon-16x16.png) | bin | 878 -> 878 bytes | |||
-rw-r--r-- | site/public/favicon-32x32.png (renamed from static/favicon-32x32.png) | bin | 2463 -> 2463 bytes | |||
-rw-r--r-- | site/public/favicon.ico (renamed from static/favicon.ico) | bin | 15406 -> 15406 bytes | |||
-rw-r--r-- | site/public/gradecoin.png (renamed from static/gradecoin.png) | bin | 197656 -> 197656 bytes | |||
-rw-r--r-- | site/public/index.html | 223 | ||||
-rw-r--r-- | site/public/juice.css | 1 | ||||
-rw-r--r-- | site/public/jwt/index.html | 126 | ||||
-rw-r--r-- | site/public/normalize.css | 349 | ||||
-rw-r--r-- | site/public/register-docs/index.html | 188 | ||||
-rw-r--r-- | site/public/robots.txt | 3 | ||||
-rw-r--r-- | site/public/search_index.en.js | 1 | ||||
-rw-r--r-- | site/public/sitemap.xml | 18 | ||||
-rw-r--r-- | site/public/transaction-docs/index.html | 126 | ||||
-rw-r--r-- | site/static/android-chrome-192x192.png | bin | 0 -> 26249 bytes | |||
-rw-r--r-- | site/static/android-chrome-512x512.png | bin | 0 -> 80376 bytes | |||
-rw-r--r-- | site/static/apple-touch-icon.png | bin | 0 -> 24023 bytes | |||
-rw-r--r-- | site/static/favicon-16x16.png | bin | 0 -> 878 bytes | |||
-rw-r--r-- | site/static/favicon-32x32.png | bin | 0 -> 2463 bytes | |||
-rw-r--r-- | site/static/favicon.ico | bin | 0 -> 15406 bytes | |||
-rw-r--r-- | site/static/gradecoin.png | bin | 0 -> 197656 bytes | |||
-rw-r--r-- | site/templates/_variables.html | 15 | ||||
-rw-r--r-- | site/templates/index.html | 44 | ||||
m--------- | site/themes/juice | 0 | ||||
-rw-r--r-- | src/handlers.rs | 11 | ||||
-rw-r--r-- | src/routes.rs | 11 |
40 files changed, 1494 insertions, 28 deletions
diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..3c79e9c --- /dev/null +++ b/.gitmodules | |||
@@ -0,0 +1,3 @@ | |||
1 | [submodule "site/themes/juice"] | ||
2 | path = site/themes/juice | ||
3 | url = https://github.com/huhu/juice | ||
@@ -1,5 +1,29 @@ | |||
1 | # TODO | 1 | # TODO |
2 | 2 | ||
3 | ## Office Hour/Recitation | ||
4 | - [ ] Should give a little pointers but not too much, I think at first this is going to seem hard to many students but it should become fairly easy after some little pointers | ||
5 | ## Docs | ||
6 | - [ ] Make a better explanation of authorization schema | ||
7 | - [ ] register: give the register message schema(passwd is missing) | ||
8 | - [ ] gradecoin: give narrative explanation | ||
9 | - [ ] how to bank works | ||
10 | - [ ] bank public key | ||
11 | - [ ] how to start(possibly some pointers and links -- blockchain, rest, jwt, rsa, public key) | ||
12 | - [ ] delete CONSTANTS | ||
13 | - [ ] register should have AuthRequest in the explanation | ||
14 | - [ ] link all types in schema.rs to the docs, they need to understand why we have them | ||
15 | - [ ] explain hash type(MD5 is missing in Claims) | ||
16 | - [ ] Initial auth request needs more explanation | ||
17 | - [ ] Explain JSON Wrapped | ||
18 | - [ ] Give links to the functions, their docs are very good. For example, it seems impossible to understand authentication from the first page, but when you go to handlers::authenticate_user many things are clarified. | ||
19 | - [ ] There is todo at handlers::authorized_propose_transaction, fix that | ||
20 | - [ ] authorized_propose_transaction and authorized_propose_block may have more explanation as in the case of | ||
21 | |||
22 | |||
23 | ### Authorization | ||
24 | - [ ] Pointer to JWT | ||
25 | - [ ] Pointer to Public Key Sign | ||
26 | |||
3 | ## Tests | 27 | ## Tests |
4 | - [ ] User Authentication/Authentication Tests | 28 | - [ ] User Authentication/Authentication Tests |
5 | - [ ] Route Tests | 29 | - [ ] Route Tests |
@@ -7,8 +31,6 @@ | |||
7 | - [ ] Valid JSON with missing fields | 31 | - [ ] Valid JSON with missing fields |
8 | - [ ] Valid JSON with extra fields | 32 | - [ ] Valid JSON with extra fields |
9 | 33 | ||
10 | ## Please | ||
11 | - [ ] use [juice](https://www.getzola.org/themes/juice/) theme with [template rendering](https://blog.logrocket.com/template-rendering-in-rust/) to create a landing page. I want it to look handmade & _scammy_, I'm talking [verylegit](https://verylegit.link) shortened urls, botched [this person does not exist](https://www.thispersondoesnotexist.com/) user stories etc. | ||
12 | 34 | ||
13 | ## Testnet | 35 | ## Testnet |
14 | - [ ] CHAOS MODE, 3 different coins, combine them to make 1 gradecoin | 36 | - [ ] CHAOS MODE, 3 different coins, combine them to make 1 gradecoin |
@@ -34,3 +56,4 @@ | |||
34 | - [X] Blocks should "play out" the transactions and execute transactions (2021-04-14 21:29) | 56 | - [X] Blocks should "play out" the transactions and execute transactions (2021-04-14 21:29) |
35 | - [X] "Coinbase" ("by" of the first transaction of the block) should get rewarded for their efforts (2021-04-14 21:48) | 57 | - [X] "Coinbase" ("by" of the first transaction of the block) should get rewarded for their efforts (2021-04-14 21:48) |
36 | - [X] Implemented Bank Account (2021-04-14 23:28) | 58 | - [X] Implemented Bank Account (2021-04-14 23:28) |
59 | - [x] use [juice](https://www.getzola.org/themes/juice/) theme ~~with [template rendering](https://blog.logrocket.com/template-rendering-in-rust/)~~ zola to create a landing page. (done at 2021-04-15 03:41, in the most hilarious way possible) | ||
diff --git a/scripts/python_client.py b/scripts/python_client.py index fe96cc2..2713f47 100644 --- a/scripts/python_client.py +++ b/scripts/python_client.py | |||
@@ -20,6 +20,92 @@ hash = "SHA-256" | |||
20 | # return priv_key.publickey() | 20 | # return priv_key.publickey() |
21 | 21 | ||
22 | 22 | ||
23 | import requests | ||
24 | from jwt import ( | ||
25 | JWT, | ||
26 | jwk_from_dict, | ||
27 | jwk_from_pem, | ||
28 | ) | ||
29 | from jwt.utils import get_int_from_datetime | ||
30 | from datetime import datetime, timedelta, timezone | ||
31 | |||
32 | |||
33 | def create_hashed_transaction(): | ||
34 | |||
35 | pass | ||
36 | |||
37 | def create_jwt(): | ||
38 | instance = JWT() | ||
39 | message = { | ||
40 | 'tha': create_hashed_transaction(), | ||
41 | 'iat': get_int_from_datetime(datetime.now(timezone.utc)), | ||
42 | 'exp': get_int_from_datetime( | ||
43 | datetime.now(timezone.utc) + timedelta(hours=1)), | ||
44 | } | ||
45 | |||
46 | with open('rsa_private_key.pem', 'rb') as fh: | ||
47 | signing_key = jwk_from_pem(fh.read()) | ||
48 | |||
49 | compact_jws = instance.encode(message, signing_key, alg='RS256') | ||
50 | |||
51 | return compact_jws | ||
52 | |||
53 | |||
54 | def post_register(): | ||
55 | credentials = { | ||
56 | "c": "", | ||
57 | "iv": "", | ||
58 | "key": "" | ||
59 | } | ||
60 | response = requests.post("localhost:8080/register", data=credentials) | ||
61 | |||
62 | |||
63 | def post_transaction_from_bank(): | ||
64 | body = { | ||
65 | "by": "{my_public_key}", | ||
66 | "source": "{bank_public_key}", | ||
67 | "target": "{my_public_key}", | ||
68 | "amount": 0, | ||
69 | "timestamp": get_int_from_datetime(datetime.now(timezone.utc)), | ||
70 | } | ||
71 | header = {'Content-Type': 'application/json', 'Authorization': f'Bearer {create_jwt()}'} | ||
72 | |||
73 | response = requests.post("localhost:8080/transaction", headers=header, data=body) | ||
74 | print(response.headers) | ||
75 | print(response.content) | ||
76 | |||
77 | def post_transaction_to_user(): | ||
78 | body = { | ||
79 | "by": "{my_public_key}", | ||
80 | "source": "{my_public_key}", | ||
81 | "target": "{user_public_key}", | ||
82 | "amount": 0, | ||
83 | "timestamp": get_int_from_datetime(datetime.now(timezone.utc)), | ||
84 | } | ||
85 | header = {'Content-Type': 'application/json', 'Authorization': f'Bearer {create_jwt()}'} | ||
86 | |||
87 | response = requests.post("localhost:8080/transaction", headers=header, data=body) | ||
88 | |||
89 | |||
90 | def post_block(): | ||
91 | credentials = { | ||
92 | "c": "", | ||
93 | "iv": "", | ||
94 | "key": "" | ||
95 | } | ||
96 | response = requests.post("localhost:8080/register", params=credentials) | ||
97 | |||
98 | |||
99 | def get_transaction(): | ||
100 | response = requests.get("http://localhost:8080/transaction") | ||
101 | print(response.headers) | ||
102 | |||
103 | |||
104 | def get_block(): | ||
105 | response = requests.get("http://localhost:8080/block") | ||
106 | print(response.headers) | ||
107 | |||
108 | |||
23 | def encrypt(message, pub_key): | 109 | def encrypt(message, pub_key): |
24 | cipher = PKCS1_OAEP.new(pub_key) | 110 | cipher = PKCS1_OAEP.new(pub_key) |
25 | return cipher.encrypt(message) | 111 | return cipher.encrypt(message) |
@@ -39,18 +125,19 @@ AUd927qkxgg/nyyFqwxIbTxebxzpNX8IHMT8PgNdMxVMqnhBWxiw1nborY+pwGVL | |||
39 | MwIDAQAB | 125 | MwIDAQAB |
40 | -----END PUBLIC KEY-----""" | 126 | -----END PUBLIC KEY-----""" |
41 | } | 127 | } |
42 | with open("../secrets/gradecoin.pub", "r") as fs: | 128 | # with open("../secrets/gradecoin.pub", "r") as fs: |
43 | data = fs.read() | 129 | # data = fs.read() |
44 | pubkeyobj = RSA.importKey(data) | 130 | # pubkeyobj = RSA.importKey(data) |
45 | 131 | # | |
46 | cipher = PKCS1_OAEP.new(pubkeyobj) | 132 | # cipher = PKCS1_OAEP.new(pubkeyobj) |
47 | 133 | # | |
48 | ser = json.dumps(myself, separators=(',', ':')) | 134 | # ser = json.dumps(myself, separators=(',', ':')) |
49 | 135 | # | |
50 | a = cipher.encrypt(ser) | 136 | # a = cipher.encrypt(ser) |
51 | 137 | # | |
52 | print(f"{a}") | 138 | # print(f"{a}") |
53 | 139 | get_block() | |
140 | get_transaction() | ||
54 | 141 | ||
55 | 142 | ||
56 | 143 | ||
diff --git a/site/config.toml b/site/config.toml new file mode 100644 index 0000000..93e9468 --- /dev/null +++ b/site/config.toml | |||
@@ -0,0 +1,23 @@ | |||
1 | # The URL the site will be built for | ||
2 | base_url = "http://localhost:8080" | ||
3 | |||
4 | theme = "juice" | ||
5 | |||
6 | # Whether to automatically compile all Sass files in the sass directory | ||
7 | compile_sass = true | ||
8 | |||
9 | # Whether to build a search index to be used later on by a JavaScript library | ||
10 | build_search_index = true | ||
11 | |||
12 | [markdown] | ||
13 | # Whether to do syntax highlighting | ||
14 | # Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola | ||
15 | highlight_code = true | ||
16 | |||
17 | [extra] | ||
18 | # Put all your custom variables here | ||
19 | juice_logo_name = "Gradecoin" | ||
20 | juice_logo_path = "gradecoin.png" | ||
21 | juice_extra_menu = [ | ||
22 | { title = "why?", link = "https://github.com/zhuowei/nft_ptr#why"} | ||
23 | ] | ||
diff --git a/site/content/JWT.md b/site/content/JWT.md new file mode 100644 index 0000000..91a7a73 --- /dev/null +++ b/site/content/JWT.md | |||
@@ -0,0 +1,11 @@ | |||
1 | +++ | ||
2 | title = "JWT" | ||
3 | description = "JSON Web Token Documentation" | ||
4 | weight = 5 | ||
5 | +++ | ||
6 | |||
7 | Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod | ||
8 | tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At | ||
9 | vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd | ||
10 | ubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. | ||
11 | |||
diff --git a/site/content/_index.md b/site/content/_index.md new file mode 100644 index 0000000..7dd7a7c --- /dev/null +++ b/site/content/_index.md | |||
@@ -0,0 +1,28 @@ | |||
1 | +++ | ||
2 | title = "Gradecoin" | ||
3 | sort_by = "weight" | ||
4 | +++ | ||
5 | |||
6 | - Don't know where to start? Gradecoin uses RESTful API, simple `curl` commands or even your browser will work! [This website can help as well](https://curl.trillworks.com/). | ||
7 | - [JWT Debugger](https://jwt.io) and the corresponding [RFC](https://tools.ietf.org/html/rfc7519) | ||
8 | |||
9 | # Services | ||
10 | ## /register | ||
11 | - Student creates their own 2048 bit RSA `keypair` | ||
12 | - Downloads `Gradecoin`'s Public Key from [Moodle](https://odtuclass.metu.edu.tr/my/) | ||
13 | - Encrypts their JSON wrapped `Public Key`, `Student ID` and one time `passwd` using Gradecoin's Public Key | ||
14 | - Their public key is now in our database and can be used to sign their JWT's during requests | ||
15 | |||
16 | ## /transaction | ||
17 | - You can offer a [Transaction](/transaction) - POST request | ||
18 | - The request should have `Authorization` | ||
19 | - The request header should be signed by the Public Key of the `by` field in the transaction | ||
20 | - fetch the list of `Transaction`s - GET request | ||
21 | |||
22 | ## /block | ||
23 | - offer a [`schema::Block`] - POST request | ||
24 | - The request should have `Authorization` | ||
25 | - The [`schema::Block::transaction_list`] of the block should be a subset of [`schema::Db::pending_transactions`] | ||
26 | - fetch the last accepted [`schema::Block`] - GET request | ||
27 | |||
28 | `Authorization`: The request header should have Bearer JWT.Token signed with Student Public Key | ||
diff --git a/site/content/block_docs.md b/site/content/block_docs.md new file mode 100644 index 0000000..26803bd --- /dev/null +++ b/site/content/block_docs.md | |||
@@ -0,0 +1,11 @@ | |||
1 | +++ | ||
2 | title = "Blocks" | ||
3 | description = "Block Documentation" | ||
4 | weight = 2 | ||
5 | +++ | ||
6 | |||
7 | Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod | ||
8 | tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At | ||
9 | vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd | ||
10 | ubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. | ||
11 | |||
diff --git a/site/content/register_docs.md b/site/content/register_docs.md new file mode 100644 index 0000000..45571fb --- /dev/null +++ b/site/content/register_docs.md | |||
@@ -0,0 +1,42 @@ | |||
1 | +++ | ||
2 | title = "Register" | ||
3 | description = "Register Documentation" | ||
4 | weight = 3 | ||
5 | +++ | ||
6 | |||
7 | POST request to /register endpoint | ||
8 | Lets a [`User`] (=student) to authenticate themselves to the system | ||
9 | This `request` can be rejected if the payload is malformed (=not authenticated properly) or if | ||
10 | the [`AuthRequest.user_id`] of the `request` is not in the list of users that can hold a Gradecoin account | ||
11 | |||
12 | # Authentication Process | ||
13 | - Gradecoin's Public Key (`gradecoin_public_key`) is listed on moodle. | ||
14 | - Gradecoin's Private Key (`gradecoin_private_key`) is loaded here | ||
15 | |||
16 | - Student picks a short temporary key (`k_temp`) | ||
17 | - Creates a JSON object (`auth_plaintext`) with their `metu_id` and `public key` in base64 (PEM) format (`S_PK`): | ||
18 | { | ||
19 | student_id: "e12345", | ||
20 | passwd: "15 char secret" | ||
21 | public_key: "---BEGIN PUBLIC KEY..." | ||
22 | } | ||
23 | |||
24 | - Encrypts the serialized string of `auth_plaintext` with 128 bit block AES in CBC mode with Pkcs7 padding using the temporary key (`k_temp`), the result is `auth_ciphertext` TODO should this be base64'd? | ||
25 | - The temporary key student has picked `k_temp` is encrypted using RSA with OAEP padding scheme | ||
26 | using sha256 with `gradecoin_public_key` (TODO base64? same as above), giving us `key_ciphertext` | ||
27 | - The payload JSON object (`auth_request`) can be JSON serialized now: | ||
28 | { | ||
29 | c: "auth_ciphertext" | ||
30 | key: "key_ciphertext" | ||
31 | } | ||
32 | |||
33 | ## Gradecoin Side | ||
34 | |||
35 | - Upon receiving, we first RSA decrypt with OAEP padding scheme using SHA256 with `gradecoin_private_key` as the key and auth_request.key `key` as the ciphertext, receiving `temp_key` (this is the temporary key chosen by stu | ||
36 | - With `temp_key`, we can AES 128 Cbc Pkcs7 decrypt the `auth_request.c`, giving us | ||
37 | auth_plaintext | ||
38 | - The `auth_plaintext` String can be deserialized to [`AuthRequest`] | ||
39 | - We then verify the payload and calculate the User fingerprint | ||
40 | - Finally, create the new [`User`] object, insert to users HashMap `<fingerprint, User>` | ||
41 | |||
42 | |||
diff --git a/site/content/transaction_docs.md b/site/content/transaction_docs.md new file mode 100644 index 0000000..6607fe9 --- /dev/null +++ b/site/content/transaction_docs.md | |||
@@ -0,0 +1,11 @@ | |||
1 | +++ | ||
2 | title = "Transactions" | ||
3 | description = "Transaction documentation" | ||
4 | weight = 2 | ||
5 | +++ | ||
6 | |||
7 | Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod | ||
8 | tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At | ||
9 | vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd | ||
10 | ubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. | ||
11 | |||
diff --git a/site/public/404.html b/site/public/404.html new file mode 100644 index 0000000..f8414f0 --- /dev/null +++ b/site/public/404.html | |||
@@ -0,0 +1,3 @@ | |||
1 | <!doctype html> | ||
2 | <title>404 Not Found</title> | ||
3 | <h1>404 Not Found</h1> | ||
diff --git a/static/android-chrome-192x192.png b/site/public/android-chrome-192x192.png index 023ddbd..023ddbd 100644 --- a/static/android-chrome-192x192.png +++ b/site/public/android-chrome-192x192.png | |||
Binary files differ | |||
diff --git a/static/android-chrome-512x512.png b/site/public/android-chrome-512x512.png index 4251933..4251933 100644 --- a/static/android-chrome-512x512.png +++ b/site/public/android-chrome-512x512.png | |||
Binary files differ | |||
diff --git a/static/apple-touch-icon.png b/site/public/apple-touch-icon.png index cd8e4c8..cd8e4c8 100644 --- a/static/apple-touch-icon.png +++ b/site/public/apple-touch-icon.png | |||
Binary files differ | |||
diff --git a/site/public/block-docs/index.html b/site/public/block-docs/index.html new file mode 100644 index 0000000..8331952 --- /dev/null +++ b/site/public/block-docs/index.html | |||
@@ -0,0 +1,126 @@ | |||
1 | <!DOCTYPE html> | ||
2 | <html lang="en"> | ||
3 | |||
4 | <head> | ||
5 | <meta charset="UTF-8"> | ||
6 | <title>Blocks | </title> | ||
7 | <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | ||
8 | <style> | ||
9 | :root { | ||
10 | /* Primary theme color */ | ||
11 | --primary-color: #F8D12F; | ||
12 | /* Primary theme text color */ | ||
13 | --primary-text-color: #1E2329; | ||
14 | /* Primary theme link color */ | ||
15 | --primary-link-color: #2F57F7; | ||
16 | /* Secondary color: the background body color */ | ||
17 | --secondary-color: #FAFAFA; | ||
18 | --secondary-text-color: #303030; | ||
19 | /* Highlight text color of table of content */ | ||
20 | --toc-highlight-text-color: #d46e13; | ||
21 | } | ||
22 | </style> | ||
23 | |||
24 | <link href="https://fonts.googleapis.com/css?family=Alfa+Slab+One&display=swap" rel="stylesheet"> | ||
25 | <link href="https://fonts.googleapis.com/css?family=Fira+Sans:400,500,600&display=swap" rel="stylesheet"> | ||
26 | <link rel="stylesheet" href="/normalize.css"> | ||
27 | <link rel="stylesheet" href="http://localhost:8080/juice.css"> | ||
28 | |||
29 | |||
30 | </head> | ||
31 | |||
32 | <body> | ||
33 | |||
34 | <header class="box-shadow"> | ||
35 | |||
36 | |||
37 | <a href="http://localhost:8080/"> | ||
38 | <div class="logo"> | ||
39 | <img src="http://localhost:8080/gradecoin.png" alt="logo"> | ||
40 | Gradecoin | ||
41 | </div> | ||
42 | </a> | ||
43 | |||
44 | <nav> | ||
45 | |||
46 | <a class="nav-item subtitle-text" href="http://localhost:8080/block-docs/">Blocks</a> | ||
47 | |||
48 | <a class="nav-item subtitle-text" href="http://localhost:8080/transaction-docs/">Transactions</a> | ||
49 | |||
50 | <a class="nav-item subtitle-text" href="http://localhost:8080/register-docs/">Register</a> | ||
51 | |||
52 | <a class="nav-item subtitle-text" href="http://localhost:8080/jwt/">JWT</a> | ||
53 | |||
54 | |||
55 | |||
56 | <a class="nav-item subtitle-text" href="https://github.com/zhuowei/nft_ptr#why">why?</a> | ||
57 | |||
58 | |||
59 | </nav> | ||
60 | |||
61 | </header> | ||
62 | |||
63 | |||
64 | <main> | ||
65 | |||
66 | |||
67 | |||
68 | |||
69 | |||
70 | <div class="content text"> | ||
71 | |||
72 | <div class="heading-text">Block Documentation</div> | ||
73 | <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod | ||
74 | tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At | ||
75 | vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd | ||
76 | ubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p> | ||
77 | |||
78 | |||
79 | </div> | ||
80 | |||
81 | |||
82 | |||
83 | </main> | ||
84 | |||
85 | |||
86 | <footer> | ||
87 | ⁂ | ||
88 | </footer> | ||
89 | |||
90 | </body> | ||
91 | <script> | ||
92 | function highlightNav(heading) { | ||
93 | let pathname = location.pathname; | ||
94 | document.querySelectorAll(".toc a").forEach((item) => { | ||
95 | item.classList.remove("active"); | ||
96 | }); | ||
97 | document.querySelector(".toc a[href$='" + pathname + "#" + heading + "']").classList.add("active"); | ||
98 | } | ||
99 | |||
100 | let currentHeading = ""; | ||
101 | window.onscroll = function () { | ||
102 | let h = document.querySelectorAll("h1,h2,h3,h4,h5,h6"); | ||
103 | let elementArr = []; | ||
104 | |||
105 | h.forEach(item => { | ||
106 | if (item.id !== "") { | ||
107 | elementArr[item.id] = item.getBoundingClientRect().top; | ||
108 | } | ||
109 | }); | ||
110 | elementArr.sort(); | ||
111 | for (let key in elementArr) { | ||
112 | if (!elementArr.hasOwnProperty(key)) { | ||
113 | continue; | ||
114 | } | ||
115 | if (elementArr[key] > 0 && elementArr[key] < 300) { | ||
116 | if (currentHeading !== key) { | ||
117 | highlightNav(key); | ||
118 | currentHeading = key; | ||
119 | } | ||
120 | break; | ||
121 | } | ||
122 | } | ||
123 | } | ||
124 | </script> | ||
125 | |||
126 | </html> | ||
diff --git a/site/public/elasticlunr.min.js b/site/public/elasticlunr.min.js new file mode 100644 index 0000000..79dad65 --- /dev/null +++ b/site/public/elasticlunr.min.js | |||
@@ -0,0 +1,10 @@ | |||
1 | /** | ||
2 | * elasticlunr - http://weixsong.github.io | ||
3 | * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.6 | ||
4 | * | ||
5 | * Copyright (C) 2017 Oliver Nightingale | ||
6 | * Copyright (C) 2017 Wei Song | ||
7 | * MIT Licensed | ||
8 | * @license | ||
9 | */ | ||
10 | !function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u<s.length;u++){var a=s[u];r[a]=this.pipeline.run(t.tokenizer(e[a]))}var l={};for(var c in o){var d=r[c]||r.any;if(d){var f=this.fieldSearch(d,c,o),h=o[c].boost;for(var p in f)f[p]=f[p]*h;for(var p in f)p in l?l[p]+=f[p]:l[p]=f[p]}}var v,g=[];for(var p in l)v={ref:p,score:l[p]},this.documentStore.hasDoc(p)&&(v.doc=this.documentStore.getDoc(p)),g.push(v);return g.sort(function(e,t){return t.score-e.score}),g},t.Index.prototype.fieldSearch=function(e,t,n){var i=n[t].bool,o=n[t].expand,r=n[t].boost,s=null,u={};return 0!==r?(e.forEach(function(e){var n=[e];1==o&&(n=this.index[t].expandToken(e));var r={};n.forEach(function(n){var o=this.index[t].getDocs(n),a=this.idf(n,t);if(s&&"AND"==i){var l={};for(var c in s)c in o&&(l[c]=o[c]);o=l}n==e&&this.fieldSearchStats(u,n,o);for(var c in o){var d=this.index[t].getTermFrequency(n,c),f=this.documentStore.getFieldLength(c,t),h=1;0!=f&&(h=1/Math.sqrt(f));var p=1;n!=e&&(p=.15*(1-(n.length-e.length)/n.length));var v=d*a*h*p;c in r?r[c]+=v:r[c]=v}},this),s=this.mergeScores(s,r,i)},this),s=this.coordNorm(s,u,e.length)):void 0},t.Index.prototype.mergeScores=function(e,t,n){if(!e)return t;if("AND"==n){var i={};for(var o in t)o in e&&(i[o]=e[o]+t[o]);return i}for(var o in t)o in e?e[o]+=t[o]:e[o]=t[o];return e},t.Index.prototype.fieldSearchStats=function(e,t,n){for(var i in n)i in e?e[i].push(t):e[i]=[t]},t.Index.prototype.coordNorm=function(e,t,n){for(var i in e)if(i in t){var o=t[i].length;e[i]=e[i]*o/n}return e},t.Index.prototype.toJSON=function(){var e={};return this._fields.forEach(function(t){e[t]=this.index[t].toJSON()},this),{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),index:e,pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},t.DocumentStore=function(e){this._save=null===e||void 0===e?!0:e,this.docs={},this.docInfo={},this.length=0},t.DocumentStore.load=function(e){var t=new this;return t.length=e.length,t.docs=e.docs,t.docInfo=e.docInfo,t._save=e.save,t},t.DocumentStore.prototype.isDocStored=function(){return this._save},t.DocumentStore.prototype.addDoc=function(t,n){this.hasDoc(t)||this.length++,this.docs[t]=this._save===!0?e(n):null},t.DocumentStore.prototype.getDoc=function(e){return this.hasDoc(e)===!1?null:this.docs[e]},t.DocumentStore.prototype.hasDoc=function(e){return e in this.docs},t.DocumentStore.prototype.removeDoc=function(e){this.hasDoc(e)&&(delete this.docs[e],delete this.docInfo[e],this.length--)},t.DocumentStore.prototype.addFieldLength=function(e,t,n){null!==e&&void 0!==e&&0!=this.hasDoc(e)&&(this.docInfo[e]||(this.docInfo[e]={}),this.docInfo[e][t]=n)},t.DocumentStore.prototype.updateFieldLength=function(e,t,n){null!==e&&void 0!==e&&0!=this.hasDoc(e)&&this.addFieldLength(e,t,n)},t.DocumentStore.prototype.getFieldLength=function(e,t){return null===e||void 0===e?0:e in this.docs&&t in this.docInfo[e]?this.docInfo[e][t]:0},t.DocumentStore.prototype.toJSON=function(){return{docs:this.docs,docInfo:this.docInfo,length:this.length,save:this._save}},t.stemmer=function(){var e={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},t={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",o=n+"[^aeiouy]*",r=i+"[aeiou]*",s="^("+o+")?"+r+o,u="^("+o+")?"+r+o+"("+r+")?$",a="^("+o+")?"+r+o+r+o,l="^("+o+")?"+i,c=new RegExp(s),d=new RegExp(a),f=new RegExp(u),h=new RegExp(l),p=/^(.+?)(ss|i)es$/,v=/^(.+?)([^s])s$/,g=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,y=/.$/,S=/(at|bl|iz)$/,x=new RegExp("([^aeiouylsz])\\1$"),w=new RegExp("^"+o+i+"[^aeiouwxy]$"),I=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,D=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,_=/^(.+?)e$/,P=/ll$/,k=new RegExp("^"+o+i+"[^aeiouwxy]$"),z=function(n){var i,o,r,s,u,a,l;if(n.length<3)return n;if(r=n.substr(0,1),"y"==r&&(n=r.toUpperCase()+n.substr(1)),s=p,u=v,s.test(n)?n=n.replace(s,"$1$2"):u.test(n)&&(n=n.replace(u,"$1$2")),s=g,u=m,s.test(n)){var z=s.exec(n);s=c,s.test(z[1])&&(s=y,n=n.replace(s,""))}else if(u.test(n)){var z=u.exec(n);i=z[1],u=h,u.test(i)&&(n=i,u=S,a=x,l=w,u.test(n)?n+="e":a.test(n)?(s=y,n=n.replace(s,"")):l.test(n)&&(n+="e"))}if(s=I,s.test(n)){var z=s.exec(n);i=z[1],n=i+"i"}if(s=b,s.test(n)){var z=s.exec(n);i=z[1],o=z[2],s=c,s.test(i)&&(n=i+e[o])}if(s=E,s.test(n)){var z=s.exec(n);i=z[1],o=z[2],s=c,s.test(i)&&(n=i+t[o])}if(s=D,u=F,s.test(n)){var z=s.exec(n);i=z[1],s=d,s.test(i)&&(n=i)}else if(u.test(n)){var z=u.exec(n);i=z[1]+z[2],u=d,u.test(i)&&(n=i)}if(s=_,s.test(n)){var z=s.exec(n);i=z[1],s=d,u=f,a=k,(s.test(i)||u.test(i)&&!a.test(i))&&(n=i)}return s=P,u=d,s.test(n)&&u.test(n)&&(s=y,n=n.replace(s,"")),"y"==r&&(n=r.toLowerCase()+n.substr(1)),n};return z}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.stopWordFilter=function(e){return e&&t.stopWordFilter.stopWords[e]!==!0?e:void 0},t.clearStopWords=function(){t.stopWordFilter.stopWords={}},t.addStopWords=function(e){null!=e&&Array.isArray(e)!==!1&&e.forEach(function(e){t.stopWordFilter.stopWords[e]=!0},this)},t.resetStopWords=function(){t.stopWordFilter.stopWords=t.defaultStopWords},t.defaultStopWords={"":!0,a:!0,able:!0,about:!0,across:!0,after:!0,all:!0,almost:!0,also:!0,am:!0,among:!0,an:!0,and:!0,any:!0,are:!0,as:!0,at:!0,be:!0,because:!0,been:!0,but:!0,by:!0,can:!0,cannot:!0,could:!0,dear:!0,did:!0,"do":!0,does:!0,either:!0,"else":!0,ever:!0,every:!0,"for":!0,from:!0,get:!0,got:!0,had:!0,has:!0,have:!0,he:!0,her:!0,hers:!0,him:!0,his:!0,how:!0,however:!0,i:!0,"if":!0,"in":!0,into:!0,is:!0,it:!0,its:!0,just:!0,least:!0,let:!0,like:!0,likely:!0,may:!0,me:!0,might:!0,most:!0,must:!0,my:!0,neither:!0,no:!0,nor:!0,not:!0,of:!0,off:!0,often:!0,on:!0,only:!0,or:!0,other:!0,our:!0,own:!0,rather:!0,said:!0,say:!0,says:!0,she:!0,should:!0,since:!0,so:!0,some:!0,than:!0,that:!0,the:!0,their:!0,them:!0,then:!0,there:!0,these:!0,they:!0,"this":!0,tis:!0,to:!0,too:!0,twas:!0,us:!0,wants:!0,was:!0,we:!0,were:!0,what:!0,when:!0,where:!0,which:!0,"while":!0,who:!0,whom:!0,why:!0,will:!0,"with":!0,would:!0,yet:!0,you:!0,your:!0},t.stopWordFilter.stopWords=t.defaultStopWords,t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(e){if(null===e||void 0===e)throw new Error("token should not be undefined");return e.replace(/^\W+/,"").replace(/\W+$/,"")},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.InvertedIndex=function(){this.root={docs:{},df:0}},t.InvertedIndex.load=function(e){var t=new this;return t.root=e.root,t},t.InvertedIndex.prototype.addToken=function(e,t,n){for(var n=n||this.root,i=0;i<=e.length-1;){var o=e[i];o in n||(n[o]={docs:{},df:0}),i+=1,n=n[o]}var r=t.ref;n.docs[r]?n.docs[r]={tf:t.tf}:(n.docs[r]={tf:t.tf},n.df+=1)},t.InvertedIndex.prototype.hasToken=function(e){if(!e)return!1;for(var t=this.root,n=0;n<e.length;n++){if(!t[e[n]])return!1;t=t[e[n]]}return!0},t.InvertedIndex.prototype.getNode=function(e){if(!e)return null;for(var t=this.root,n=0;n<e.length;n++){if(!t[e[n]])return null;t=t[e[n]]}return t},t.InvertedIndex.prototype.getDocs=function(e){var t=this.getNode(e);return null==t?{}:t.docs},t.InvertedIndex.prototype.getTermFrequency=function(e,t){var n=this.getNode(e);return null==n?0:t in n.docs?n.docs[t].tf:0},t.InvertedIndex.prototype.getDocFreq=function(e){var t=this.getNode(e);return null==t?0:t.df},t.InvertedIndex.prototype.removeToken=function(e,t){if(e){var n=this.getNode(e);null!=n&&t in n.docs&&(delete n.docs[t],n.df-=1)}},t.InvertedIndex.prototype.expandToken=function(e,t,n){if(null==e||""==e)return[];var t=t||[];if(void 0==n&&(n=this.getNode(e),null==n))return t;n.df>0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e<arguments.length;e++)t=arguments[e],~this.indexOf(t)||this.elements.splice(this.locationFor(t),0,t);this.length=this.elements.length},lunr.SortedSet.prototype.toArray=function(){return this.elements.slice()},lunr.SortedSet.prototype.map=function(e,t){return this.elements.map(e,t)},lunr.SortedSet.prototype.forEach=function(e,t){return this.elements.forEach(e,t)},lunr.SortedSet.prototype.indexOf=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]<u[i]?n++:s[n]>u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o<r.length;o++)i.add(r[o]);return i},lunr.SortedSet.prototype.toJSON=function(){return this.toArray()},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.elasticlunr=t()}(this,function(){return t})}(); | ||
diff --git a/static/favicon-16x16.png b/site/public/favicon-16x16.png index bd63d34..bd63d34 100644 --- a/static/favicon-16x16.png +++ b/site/public/favicon-16x16.png | |||
Binary files differ | |||
diff --git a/static/favicon-32x32.png b/site/public/favicon-32x32.png index e343587..e343587 100644 --- a/static/favicon-32x32.png +++ b/site/public/favicon-32x32.png | |||
Binary files differ | |||
diff --git a/static/favicon.ico b/site/public/favicon.ico index 45d8bfe..45d8bfe 100644 --- a/static/favicon.ico +++ b/site/public/favicon.ico | |||
Binary files differ | |||
diff --git a/static/gradecoin.png b/site/public/gradecoin.png index eeb670c..eeb670c 100644 --- a/static/gradecoin.png +++ b/site/public/gradecoin.png | |||
Binary files differ | |||
diff --git a/site/public/index.html b/site/public/index.html new file mode 100644 index 0000000..0177355 --- /dev/null +++ b/site/public/index.html | |||
@@ -0,0 +1,223 @@ | |||
1 | <!DOCTYPE html> | ||
2 | <html lang="en"> | ||
3 | |||
4 | <head> | ||
5 | <meta charset="UTF-8"> | ||
6 | <title></title> | ||
7 | <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | ||
8 | <style> | ||
9 | :root { | ||
10 | /* Primary theme color */ | ||
11 | --primary-color: #F8D12F; | ||
12 | /* Primary theme text color */ | ||
13 | --primary-text-color: #1E2329; | ||
14 | /* Primary theme link color */ | ||
15 | --primary-link-color: #2F57F7; | ||
16 | /* Secondary color: the background body color */ | ||
17 | --secondary-color: #FAFAFA; | ||
18 | --secondary-text-color: #303030; | ||
19 | /* Highlight text color of table of content */ | ||
20 | --toc-highlight-text-color: #d46e13; | ||
21 | } | ||
22 | </style> | ||
23 | |||
24 | <link href="https://fonts.googleapis.com/css?family=Alfa+Slab+One&display=swap" rel="stylesheet"> | ||
25 | <link href="https://fonts.googleapis.com/css?family=Fira+Sans:400,500,600&display=swap" rel="stylesheet"> | ||
26 | <link rel="stylesheet" href="/normalize.css"> | ||
27 | <link rel="stylesheet" href="http://localhost:8080/juice.css"> | ||
28 | |||
29 | |||
30 | </head> | ||
31 | |||
32 | <body> | ||
33 | |||
34 | |||
35 | <header class="pos-absolute" style="background-color: transparent"> | ||
36 | |||
37 | |||
38 | <a href="http://localhost:8080/"> | ||
39 | <div class="logo"> | ||
40 | <img src="http://localhost:8080/gradecoin.png" alt="logo"> | ||
41 | Gradecoin | ||
42 | </div> | ||
43 | </a> | ||
44 | |||
45 | <nav> | ||
46 | |||
47 | <a class="nav-item subtitle-text" href="http://localhost:8080/block-docs/">Blocks</a> | ||
48 | |||
49 | <a class="nav-item subtitle-text" href="http://localhost:8080/transaction-docs/">Transactions</a> | ||
50 | |||
51 | <a class="nav-item subtitle-text" href="http://localhost:8080/register-docs/">Register</a> | ||
52 | |||
53 | <a class="nav-item subtitle-text" href="http://localhost:8080/jwt/">JWT</a> | ||
54 | |||
55 | |||
56 | |||
57 | <a class="nav-item subtitle-text" href="https://github.com/zhuowei/nft_ptr#why">why?</a> | ||
58 | |||
59 | |||
60 | </nav> | ||
61 | |||
62 | </header> | ||
63 | |||
64 | <div class="hero"> | ||
65 | |||
66 | <section class="text-center"> | ||
67 | <h1 class="heading-text" style="font-size: 50px"> | ||
68 | Mine your own grades | ||
69 | </h1> | ||
70 | <h3 class="title-text"> | ||
71 | <b style="color: deepskyblue">Gradecoin</b> is the latest cutting edge blockchain technology agile grading framework that drives organic engagement and other buzzwords, with big data mining search engine optimization | ||
72 | </h3> | ||
73 | <div> | ||
74 | <!-- <a class="github-button" href="https://github.com/huhu/juice" data-size="large" data-show-count="true" --> | ||
75 | <!-- aria-label="Star huhu/juice on GitHub">Star</a> --> | ||
76 | <!-- <a class="github-button" href="https://github.com/huhu/juice/fork" data-size="large" --> | ||
77 | <!-- data-show-count="true" aria-label="Fork huhu/juice on GitHub">Fork</a> --> | ||
78 | </div> | ||
79 | </section> | ||
80 | <img class="hero-image" style="width: 50%" src="http://localhost:8080/gradecoin.png"> | ||
81 | |||
82 | <div class="explore-more text" | ||
83 | onclick="document.getElementById('features').scrollIntoView({behavior: 'smooth'})"> | ||
84 | ⇩ Learn How ⇩ | ||
85 | </div> | ||
86 | <style> | ||
87 | .hero section { | ||
88 | padding: 0 5rem; | ||
89 | } | ||
90 | @media screen and (max-width: 768px) { | ||
91 | .hero section { | ||
92 | padding: 0 2rem; | ||
93 | } | ||
94 | |||
95 | .hero-image { | ||
96 | display: none | ||
97 | } | ||
98 | } | ||
99 | </style> | ||
100 | |||
101 | </div> | ||
102 | |||
103 | |||
104 | |||
105 | <main> | ||
106 | |||
107 | |||
108 | |||
109 | |||
110 | |||
111 | <div class="toc"> | ||
112 | <div class="toc-sticky"> | ||
113 | |||
114 | <div class="toc-item"> | ||
115 | <a class="subtext" href="http://localhost:8080/#services">Services</a> | ||
116 | </div> | ||
117 | |||
118 | |||
119 | <div class="toc-item-child"> | ||
120 | <a class="subtext" href="http://localhost:8080/#register"><small>- /register</small></a> | ||
121 | </div> | ||
122 | |||
123 | <div class="toc-item-child"> | ||
124 | <a class="subtext" href="http://localhost:8080/#transaction"><small>- /transaction</small></a> | ||
125 | </div> | ||
126 | |||
127 | <div class="toc-item-child"> | ||
128 | <a class="subtext" href="http://localhost:8080/#block"><small>- /block</small></a> | ||
129 | </div> | ||
130 | |||
131 | |||
132 | |||
133 | </div> | ||
134 | </div> | ||
135 | |||
136 | |||
137 | |||
138 | <div class="content text"> | ||
139 | |||
140 | <div id="features" class="heading-text">Overview</div> | ||
141 | <ul> | ||
142 | <li>Don't know where to start? Gradecoin uses RESTful API, simple <code>curl</code> commands or even your browser will work! <a href="https://curl.trillworks.com/">This website can help as well</a>.</li> | ||
143 | <li><a href="https://jwt.io">JWT Debugger</a> and the corresponding <a href="https://tools.ietf.org/html/rfc7519">RFC</a></li> | ||
144 | </ul> | ||
145 | <h1 id="services">Services</h1> | ||
146 | <h2 id="register">/register</h2> | ||
147 | <ul> | ||
148 | <li>Student creates their own 2048 bit RSA <code>keypair</code></li> | ||
149 | <li>Downloads <code>Gradecoin</code>'s Public Key from <a href="https://odtuclass.metu.edu.tr/my/">Moodle</a></li> | ||
150 | <li>Encrypts their JSON wrapped <code>Public Key</code>, <code>Student ID</code> and one time <code>passwd</code> using Gradecoin's Public Key</li> | ||
151 | <li>Their public key is now in our database and can be used to sign their JWT's during requests</li> | ||
152 | </ul> | ||
153 | <h2 id="transaction">/transaction</h2> | ||
154 | <ul> | ||
155 | <li>You can offer a <a href="/transaction">Transaction</a> - POST request | ||
156 | <ul> | ||
157 | <li>The request should have <code>Authorization</code></li> | ||
158 | <li>The request header should be signed by the Public Key of the <code>by</code> field in the transaction</li> | ||
159 | </ul> | ||
160 | </li> | ||
161 | <li>fetch the list of <code>Transaction</code>s - GET request</li> | ||
162 | </ul> | ||
163 | <h2 id="block">/block</h2> | ||
164 | <ul> | ||
165 | <li>offer a [<code>schema::Block</code>] - POST request | ||
166 | <ul> | ||
167 | <li>The request should have <code>Authorization</code></li> | ||
168 | <li>The [<code>schema::Block::transaction_list</code>] of the block should be a subset of [<code>schema::Db::pending_transactions</code>]</li> | ||
169 | </ul> | ||
170 | </li> | ||
171 | <li>fetch the last accepted [<code>schema::Block</code>] - GET request</li> | ||
172 | </ul> | ||
173 | <p><code>Authorization</code>: The request header should have Bearer JWT.Token signed with Student Public Key</p> | ||
174 | |||
175 | |||
176 | </div> | ||
177 | |||
178 | |||
179 | |||
180 | </main> | ||
181 | |||
182 | |||
183 | <footer> | ||
184 | ⁂ | ||
185 | </footer> | ||
186 | |||
187 | </body> | ||
188 | <script> | ||
189 | function highlightNav(heading) { | ||
190 | let pathname = location.pathname; | ||
191 | document.querySelectorAll(".toc a").forEach((item) => { | ||
192 | item.classList.remove("active"); | ||
193 | }); | ||
194 | document.querySelector(".toc a[href$='" + pathname + "#" + heading + "']").classList.add("active"); | ||
195 | } | ||
196 | |||
197 | let currentHeading = ""; | ||
198 | window.onscroll = function () { | ||
199 | let h = document.querySelectorAll("h1,h2,h3,h4,h5,h6"); | ||
200 | let elementArr = []; | ||
201 | |||
202 | h.forEach(item => { | ||
203 | if (item.id !== "") { | ||
204 | elementArr[item.id] = item.getBoundingClientRect().top; | ||
205 | } | ||
206 | }); | ||
207 | elementArr.sort(); | ||
208 | for (let key in elementArr) { | ||
209 | if (!elementArr.hasOwnProperty(key)) { | ||
210 | continue; | ||
211 | } | ||
212 | if (elementArr[key] > 0 && elementArr[key] < 300) { | ||
213 | if (currentHeading !== key) { | ||
214 | highlightNav(key); | ||
215 | currentHeading = key; | ||
216 | } | ||
217 | break; | ||
218 | } | ||
219 | } | ||
220 | } | ||
221 | </script> | ||
222 | |||
223 | </html> | ||
diff --git a/site/public/juice.css b/site/public/juice.css new file mode 100644 index 0000000..219f864 --- /dev/null +++ b/site/public/juice.css | |||
@@ -0,0 +1 @@ | |||
.text-center{text-align:center}.pos-absolute{right:0;left:0;position:absolute}.box-shadow{box-shadow:0 2px 10px 2px #ddd}.heading-text{font-family:"Fira Sans", sans-serif;font-size:32px;font-weight:600;padding:10px 0 25px 0;color:var(--primary-text-color)}h1,.title-text{font-family:"Fira Sans", sans-serif;font-size:25px;font-weight:500;color:var(--primary-text-color);border-left:var(--primary-color) 8px solid;padding-left:10px}h2,.subtitle-text{font-family:"Fira Sans", sans-serif;font-size:20px;font-weight:500;color:var(--primary-text-color)}.text{font-family:"Fira Sans", sans-serif;font-size:18px;font-weight:400;line-height:26px;letter-spacing:0.2px;color:var(--primary-text-color)}.subtext{font-family:"Fira Sans", sans-serif;font-size:16px;font-weight:400;letter-spacing:0.1px}.content{padding:0 40px;display:flex;flex-direction:column;justify-content:center;overflow-x:auto}.content pre{overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal;background-color:white;color:#4a4a4a;font-size:.875em;font-family:monospace}.content code{background-color:white;color:#4a4a4a;font-size:.875em;font-weight:normal;padding:0.25em 0.5em;font-family:monospace}.content pre code{padding:0}.content a{color:var(--primary-link-color)}.content a:hover{text-decoration:underline}.content blockquote{border-left:#e2dede 8px solid;margin:0;background-color:#f2f1f0;padding:0 20px}body{padding:0;margin:0;box-sizing:border-box;background-color:var(--secondary-color)}a{text-decoration:none}ul{margin-top:0.5rem}ul>li{padding:0.3rem 0}p>img{width:100%;height:auto}header{background-color:var(--primary-color);color:black;padding:20px 50px;display:flex;align-items:center;justify-content:space-between}.logo{font-family:"Alfa Slab One", serif;font-size:32px;color:var(--primary-text-color);display:flex;align-items:center;margin:0 40px}.logo img{width:60px;margin:0 25px}.nav-item{margin:0 10px;text-decoration:none;font-size:18px;font-weight:bold}.nav-item:hover{color:#000;text-decoration:underline}.hero{display:flex;align-items:center;justify-content:space-evenly;height:100vh;background-color:var(--primary-color);overflow-x:hidden;padding:0 40px}.hero .explore-more{position:absolute;bottom:20px;cursor:pointer}main{display:flex;padding:50px 100px}main .toc{max-width:260px;min-width:240px}main .toc-item{padding:10px 20px;color:#424242}main .toc-item a,main .toc-item-child a{color:var(--secondary-text-color)}main .toc-item a:hover,main .toc-item-child a:hover{cursor:pointer;text-decoration:underline}main .toc-item a.active,main .toc-item-child a.active{color:var(--toc-highlight-text-color)}main .toc-item-child{padding:0 30px 5px;color:#424242}.toc-sticky{border-radius:3px;border-top:5px solid var(--primary-color);background-color:white;position:sticky;position:-webkit-sticky;position:-moz-sticky;position:-ms-sticky;position:-o-sticky;top:10px;padding:10px 0}footer{padding:50px;display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:#202020;color:#fcfcfc}footer a{color:#fcfcfc;text-decoration:underline}@media screen and (min-width: 1280px){.content{max-width:60%;min-width:800px}}@media screen and (max-width: 768px){header{padding:10px 30px;flex-direction:column;align-items:center;justify-content:center}.logo{font-size:28px;margin:10px}.logo img{width:45px;margin:0 10px 0 0}.nav-item{margin:0 5px;font-size:14px}.hero{padding:40px 30px}main{padding:30px}.content{padding:0}.explore-more,.toc{display:none}} | |||
diff --git a/site/public/jwt/index.html b/site/public/jwt/index.html new file mode 100644 index 0000000..899aada --- /dev/null +++ b/site/public/jwt/index.html | |||
@@ -0,0 +1,126 @@ | |||
1 | <!DOCTYPE html> | ||
2 | <html lang="en"> | ||
3 | |||
4 | <head> | ||
5 | <meta charset="UTF-8"> | ||
6 | <title>JWT | </title> | ||
7 | <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | ||
8 | <style> | ||
9 | :root { | ||
10 | /* Primary theme color */ | ||
11 | --primary-color: #F8D12F; | ||
12 | /* Primary theme text color */ | ||
13 | --primary-text-color: #1E2329; | ||
14 | /* Primary theme link color */ | ||
15 | --primary-link-color: #2F57F7; | ||
16 | /* Secondary color: the background body color */ | ||
17 | --secondary-color: #FAFAFA; | ||
18 | --secondary-text-color: #303030; | ||
19 | /* Highlight text color of table of content */ | ||
20 | --toc-highlight-text-color: #d46e13; | ||
21 | } | ||
22 | </style> | ||
23 | |||
24 | <link href="https://fonts.googleapis.com/css?family=Alfa+Slab+One&display=swap" rel="stylesheet"> | ||
25 | <link href="https://fonts.googleapis.com/css?family=Fira+Sans:400,500,600&display=swap" rel="stylesheet"> | ||
26 | <link rel="stylesheet" href="/normalize.css"> | ||
27 | <link rel="stylesheet" href="http://localhost:8080/juice.css"> | ||
28 | |||
29 | |||
30 | </head> | ||
31 | |||
32 | <body> | ||
33 | |||
34 | <header class="box-shadow"> | ||
35 | |||
36 | |||
37 | <a href="http://localhost:8080/"> | ||
38 | <div class="logo"> | ||
39 | <img src="http://localhost:8080/gradecoin.png" alt="logo"> | ||
40 | Gradecoin | ||
41 | </div> | ||
42 | </a> | ||
43 | |||
44 | <nav> | ||
45 | |||
46 | <a class="nav-item subtitle-text" href="http://localhost:8080/block-docs/">Blocks</a> | ||
47 | |||
48 | <a class="nav-item subtitle-text" href="http://localhost:8080/transaction-docs/">Transactions</a> | ||
49 | |||
50 | <a class="nav-item subtitle-text" href="http://localhost:8080/register-docs/">Register</a> | ||
51 | |||
52 | <a class="nav-item subtitle-text" href="http://localhost:8080/jwt/">JWT</a> | ||
53 | |||
54 | |||
55 | |||
56 | <a class="nav-item subtitle-text" href="https://github.com/zhuowei/nft_ptr#why">why?</a> | ||
57 | |||
58 | |||
59 | </nav> | ||
60 | |||
61 | </header> | ||
62 | |||
63 | |||
64 | <main> | ||
65 | |||
66 | |||
67 | |||
68 | |||
69 | |||
70 | <div class="content text"> | ||
71 | |||
72 | <div class="heading-text">JSON Web Token Documentation</div> | ||
73 | <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod | ||
74 | tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At | ||
75 | vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd | ||
76 | ubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p> | ||
77 | |||
78 | |||
79 | </div> | ||
80 | |||
81 | |||
82 | |||
83 | </main> | ||
84 | |||
85 | |||
86 | <footer> | ||
87 | ⁂ | ||
88 | </footer> | ||
89 | |||
90 | </body> | ||
91 | <script> | ||
92 | function highlightNav(heading) { | ||
93 | let pathname = location.pathname; | ||
94 | document.querySelectorAll(".toc a").forEach((item) => { | ||
95 | item.classList.remove("active"); | ||
96 | }); | ||
97 | document.querySelector(".toc a[href$='" + pathname + "#" + heading + "']").classList.add("active"); | ||
98 | } | ||
99 | |||
100 | let currentHeading = ""; | ||
101 | window.onscroll = function () { | ||
102 | let h = document.querySelectorAll("h1,h2,h3,h4,h5,h6"); | ||
103 | let elementArr = []; | ||
104 | |||
105 | h.forEach(item => { | ||
106 | if (item.id !== "") { | ||
107 | elementArr[item.id] = item.getBoundingClientRect().top; | ||
108 | } | ||
109 | }); | ||
110 | elementArr.sort(); | ||
111 | for (let key in elementArr) { | ||
112 | if (!elementArr.hasOwnProperty(key)) { | ||
113 | continue; | ||
114 | } | ||
115 | if (elementArr[key] > 0 && elementArr[key] < 300) { | ||
116 | if (currentHeading !== key) { | ||
117 | highlightNav(key); | ||
118 | currentHeading = key; | ||
119 | } | ||
120 | break; | ||
121 | } | ||
122 | } | ||
123 | } | ||
124 | </script> | ||
125 | |||
126 | </html> | ||
diff --git a/site/public/normalize.css b/site/public/normalize.css new file mode 100644 index 0000000..192eb9c --- /dev/null +++ b/site/public/normalize.css | |||
@@ -0,0 +1,349 @@ | |||
1 | /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ | ||
2 | |||
3 | /* Document | ||
4 | ========================================================================== */ | ||
5 | |||
6 | /** | ||
7 | * 1. Correct the line height in all browsers. | ||
8 | * 2. Prevent adjustments of font size after orientation changes in iOS. | ||
9 | */ | ||
10 | |||
11 | html { | ||
12 | line-height: 1.15; /* 1 */ | ||
13 | -webkit-text-size-adjust: 100%; /* 2 */ | ||
14 | } | ||
15 | |||
16 | /* Sections | ||
17 | ========================================================================== */ | ||
18 | |||
19 | /** | ||
20 | * Remove the margin in all browsers. | ||
21 | */ | ||
22 | |||
23 | body { | ||
24 | margin: 0; | ||
25 | } | ||
26 | |||
27 | /** | ||
28 | * Render the `main` element consistently in IE. | ||
29 | */ | ||
30 | |||
31 | main { | ||
32 | display: block; | ||
33 | } | ||
34 | |||
35 | /** | ||
36 | * Correct the font size and margin on `h1` elements within `section` and | ||
37 | * `article` contexts in Chrome, Firefox, and Safari. | ||
38 | */ | ||
39 | |||
40 | h1 { | ||
41 | font-size: 2em; | ||
42 | margin: 0.67em 0; | ||
43 | } | ||
44 | |||
45 | /* Grouping content | ||
46 | ========================================================================== */ | ||
47 | |||
48 | /** | ||
49 | * 1. Add the correct box sizing in Firefox. | ||
50 | * 2. Show the overflow in Edge and IE. | ||
51 | */ | ||
52 | |||
53 | hr { | ||
54 | box-sizing: content-box; /* 1 */ | ||
55 | height: 0; /* 1 */ | ||
56 | overflow: visible; /* 2 */ | ||
57 | } | ||
58 | |||
59 | /** | ||
60 | * 1. Correct the inheritance and scaling of font size in all browsers. | ||
61 | * 2. Correct the odd `em` font sizing in all browsers. | ||
62 | */ | ||
63 | |||
64 | pre { | ||
65 | font-family: monospace, monospace; /* 1 */ | ||
66 | font-size: 1em; /* 2 */ | ||
67 | } | ||
68 | |||
69 | /* Text-level semantics | ||
70 | ========================================================================== */ | ||
71 | |||
72 | /** | ||
73 | * Remove the gray background on active links in IE 10. | ||
74 | */ | ||
75 | |||
76 | a { | ||
77 | background-color: transparent; | ||
78 | } | ||
79 | |||
80 | /** | ||
81 | * 1. Remove the bottom border in Chrome 57- | ||
82 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. | ||
83 | */ | ||
84 | |||
85 | abbr[title] { | ||
86 | border-bottom: none; /* 1 */ | ||
87 | text-decoration: underline; /* 2 */ | ||
88 | text-decoration: underline dotted; /* 2 */ | ||
89 | } | ||
90 | |||
91 | /** | ||
92 | * Add the correct font weight in Chrome, Edge, and Safari. | ||
93 | */ | ||
94 | |||
95 | b, | ||
96 | strong { | ||
97 | font-weight: bolder; | ||
98 | } | ||
99 | |||
100 | /** | ||
101 | * 1. Correct the inheritance and scaling of font size in all browsers. | ||
102 | * 2. Correct the odd `em` font sizing in all browsers. | ||
103 | */ | ||
104 | |||
105 | code, | ||
106 | kbd, | ||
107 | samp { | ||
108 | font-family: monospace, monospace; /* 1 */ | ||
109 | font-size: 1em; /* 2 */ | ||
110 | } | ||
111 | |||
112 | /** | ||
113 | * Add the correct font size in all browsers. | ||
114 | */ | ||
115 | |||
116 | small { | ||
117 | font-size: 80%; | ||
118 | } | ||
119 | |||
120 | /** | ||
121 | * Prevent `sub` and `sup` elements from affecting the line height in | ||
122 | * all browsers. | ||
123 | */ | ||
124 | |||
125 | sub, | ||
126 | sup { | ||
127 | font-size: 75%; | ||
128 | line-height: 0; | ||
129 | position: relative; | ||
130 | vertical-align: baseline; | ||
131 | } | ||
132 | |||
133 | sub { | ||
134 | bottom: -0.25em; | ||
135 | } | ||
136 | |||
137 | sup { | ||
138 | top: -0.5em; | ||
139 | } | ||
140 | |||
141 | /* Embedded content | ||
142 | ========================================================================== */ | ||
143 | |||
144 | /** | ||
145 | * Remove the border on images inside links in IE 10. | ||
146 | */ | ||
147 | |||
148 | img { | ||
149 | border-style: none; | ||
150 | } | ||
151 | |||
152 | /* Forms | ||
153 | ========================================================================== */ | ||
154 | |||
155 | /** | ||
156 | * 1. Change the font styles in all browsers. | ||
157 | * 2. Remove the margin in Firefox and Safari. | ||
158 | */ | ||
159 | |||
160 | button, | ||
161 | input, | ||
162 | optgroup, | ||
163 | select, | ||
164 | textarea { | ||
165 | font-family: inherit; /* 1 */ | ||
166 | font-size: 100%; /* 1 */ | ||
167 | line-height: 1.15; /* 1 */ | ||
168 | margin: 0; /* 2 */ | ||
169 | } | ||
170 | |||
171 | /** | ||
172 | * Show the overflow in IE. | ||
173 | * 1. Show the overflow in Edge. | ||
174 | */ | ||
175 | |||
176 | button, | ||
177 | input { /* 1 */ | ||
178 | overflow: visible; | ||
179 | } | ||
180 | |||
181 | /** | ||
182 | * Remove the inheritance of text transform in Edge, Firefox, and IE. | ||
183 | * 1. Remove the inheritance of text transform in Firefox. | ||
184 | */ | ||
185 | |||
186 | button, | ||
187 | select { /* 1 */ | ||
188 | text-transform: none; | ||
189 | } | ||
190 | |||
191 | /** | ||
192 | * Correct the inability to style clickable types in iOS and Safari. | ||
193 | */ | ||
194 | |||
195 | button, | ||
196 | [type="button"], | ||
197 | [type="reset"], | ||
198 | [type="submit"] { | ||
199 | -webkit-appearance: button; | ||
200 | } | ||
201 | |||
202 | /** | ||
203 | * Remove the inner border and padding in Firefox. | ||
204 | */ | ||
205 | |||
206 | button::-moz-focus-inner, | ||
207 | [type="button"]::-moz-focus-inner, | ||
208 | [type="reset"]::-moz-focus-inner, | ||
209 | [type="submit"]::-moz-focus-inner { | ||
210 | border-style: none; | ||
211 | padding: 0; | ||
212 | } | ||
213 | |||
214 | /** | ||
215 | * Restore the focus styles unset by the previous rule. | ||
216 | */ | ||
217 | |||
218 | button:-moz-focusring, | ||
219 | [type="button"]:-moz-focusring, | ||
220 | [type="reset"]:-moz-focusring, | ||
221 | [type="submit"]:-moz-focusring { | ||
222 | outline: 1px dotted ButtonText; | ||
223 | } | ||
224 | |||
225 | /** | ||
226 | * Correct the padding in Firefox. | ||
227 | */ | ||
228 | |||
229 | fieldset { | ||
230 | padding: 0.35em 0.75em 0.625em; | ||
231 | } | ||
232 | |||
233 | /** | ||
234 | * 1. Correct the text wrapping in Edge and IE. | ||
235 | * 2. Correct the color inheritance from `fieldset` elements in IE. | ||
236 | * 3. Remove the padding so developers are not caught out when they zero out | ||
237 | * `fieldset` elements in all browsers. | ||
238 | */ | ||
239 | |||
240 | legend { | ||
241 | box-sizing: border-box; /* 1 */ | ||
242 | color: inherit; /* 2 */ | ||
243 | display: table; /* 1 */ | ||
244 | max-width: 100%; /* 1 */ | ||
245 | padding: 0; /* 3 */ | ||
246 | white-space: normal; /* 1 */ | ||
247 | } | ||
248 | |||
249 | /** | ||
250 | * Add the correct vertical alignment in Chrome, Firefox, and Opera. | ||
251 | */ | ||
252 | |||
253 | progress { | ||
254 | vertical-align: baseline; | ||
255 | } | ||
256 | |||
257 | /** | ||
258 | * Remove the default vertical scrollbar in IE 10+. | ||
259 | */ | ||
260 | |||
261 | textarea { | ||
262 | overflow: auto; | ||
263 | } | ||
264 | |||
265 | /** | ||
266 | * 1. Add the correct box sizing in IE 10. | ||
267 | * 2. Remove the padding in IE 10. | ||
268 | */ | ||
269 | |||
270 | [type="checkbox"], | ||
271 | [type="radio"] { | ||
272 | box-sizing: border-box; /* 1 */ | ||
273 | padding: 0; /* 2 */ | ||
274 | } | ||
275 | |||
276 | /** | ||
277 | * Correct the cursor style of increment and decrement buttons in Chrome. | ||
278 | */ | ||
279 | |||
280 | [type="number"]::-webkit-inner-spin-button, | ||
281 | [type="number"]::-webkit-outer-spin-button { | ||
282 | height: auto; | ||
283 | } | ||
284 | |||
285 | /** | ||
286 | * 1. Correct the odd appearance in Chrome and Safari. | ||
287 | * 2. Correct the outline style in Safari. | ||
288 | */ | ||
289 | |||
290 | [type="search"] { | ||
291 | -webkit-appearance: textfield; /* 1 */ | ||
292 | outline-offset: -2px; /* 2 */ | ||
293 | } | ||
294 | |||
295 | /** | ||
296 | * Remove the inner padding in Chrome and Safari on macOS. | ||
297 | */ | ||
298 | |||
299 | [type="search"]::-webkit-search-decoration { | ||
300 | -webkit-appearance: none; | ||
301 | } | ||
302 | |||
303 | /** | ||
304 | * 1. Correct the inability to style clickable types in iOS and Safari. | ||
305 | * 2. Change font properties to `inherit` in Safari. | ||
306 | */ | ||
307 | |||
308 | ::-webkit-file-upload-button { | ||
309 | -webkit-appearance: button; /* 1 */ | ||
310 | font: inherit; /* 2 */ | ||
311 | } | ||
312 | |||
313 | /* Interactive | ||
314 | ========================================================================== */ | ||
315 | |||
316 | /* | ||
317 | * Add the correct display in Edge, IE 10+, and Firefox. | ||
318 | */ | ||
319 | |||
320 | details { | ||
321 | display: block; | ||
322 | } | ||
323 | |||
324 | /* | ||
325 | * Add the correct display in all browsers. | ||
326 | */ | ||
327 | |||
328 | summary { | ||
329 | display: list-item; | ||
330 | } | ||
331 | |||
332 | /* Misc | ||
333 | ========================================================================== */ | ||
334 | |||
335 | /** | ||
336 | * Add the correct display in IE 10+. | ||
337 | */ | ||
338 | |||
339 | template { | ||
340 | display: none; | ||
341 | } | ||
342 | |||
343 | /** | ||
344 | * Add the correct display in IE 10. | ||
345 | */ | ||
346 | |||
347 | [hidden] { | ||
348 | display: none; | ||
349 | } | ||
diff --git a/site/public/register-docs/index.html b/site/public/register-docs/index.html new file mode 100644 index 0000000..10a4d56 --- /dev/null +++ b/site/public/register-docs/index.html | |||
@@ -0,0 +1,188 @@ | |||
1 | <!DOCTYPE html> | ||
2 | <html lang="en"> | ||
3 | |||
4 | <head> | ||
5 | <meta charset="UTF-8"> | ||
6 | <title>Register | </title> | ||
7 | <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | ||
8 | <style> | ||
9 | :root { | ||
10 | /* Primary theme color */ | ||
11 | --primary-color: #F8D12F; | ||
12 | /* Primary theme text color */ | ||
13 | --primary-text-color: #1E2329; | ||
14 | /* Primary theme link color */ | ||
15 | --primary-link-color: #2F57F7; | ||
16 | /* Secondary color: the background body color */ | ||
17 | --secondary-color: #FAFAFA; | ||
18 | --secondary-text-color: #303030; | ||
19 | /* Highlight text color of table of content */ | ||
20 | --toc-highlight-text-color: #d46e13; | ||
21 | } | ||
22 | </style> | ||
23 | |||
24 | <link href="https://fonts.googleapis.com/css?family=Alfa+Slab+One&display=swap" rel="stylesheet"> | ||
25 | <link href="https://fonts.googleapis.com/css?family=Fira+Sans:400,500,600&display=swap" rel="stylesheet"> | ||
26 | <link rel="stylesheet" href="/normalize.css"> | ||
27 | <link rel="stylesheet" href="http://localhost:8080/juice.css"> | ||
28 | |||
29 | |||
30 | </head> | ||
31 | |||
32 | <body> | ||
33 | |||
34 | <header class="box-shadow"> | ||
35 | |||
36 | |||
37 | <a href="http://localhost:8080/"> | ||
38 | <div class="logo"> | ||
39 | <img src="http://localhost:8080/gradecoin.png" alt="logo"> | ||
40 | Gradecoin | ||
41 | </div> | ||
42 | </a> | ||
43 | |||
44 | <nav> | ||
45 | |||
46 | <a class="nav-item subtitle-text" href="http://localhost:8080/block-docs/">Blocks</a> | ||
47 | |||
48 | <a class="nav-item subtitle-text" href="http://localhost:8080/transaction-docs/">Transactions</a> | ||
49 | |||
50 | <a class="nav-item subtitle-text" href="http://localhost:8080/register-docs/">Register</a> | ||
51 | |||
52 | <a class="nav-item subtitle-text" href="http://localhost:8080/jwt/">JWT</a> | ||
53 | |||
54 | |||
55 | |||
56 | <a class="nav-item subtitle-text" href="https://github.com/zhuowei/nft_ptr#why">why?</a> | ||
57 | |||
58 | |||
59 | </nav> | ||
60 | |||
61 | </header> | ||
62 | |||
63 | |||
64 | <main> | ||
65 | |||
66 | |||
67 | |||
68 | |||
69 | |||
70 | <div class="toc"> | ||
71 | <div class="toc-sticky"> | ||
72 | |||
73 | <div class="toc-item"> | ||
74 | <a class="subtext" href="http://localhost:8080/register-docs/#authentication-process">Authentication Process</a> | ||
75 | </div> | ||
76 | |||
77 | |||
78 | <div class="toc-item-child"> | ||
79 | <a class="subtext" href="http://localhost:8080/register-docs/#gradecoin-side"><small>- Gradecoin Side</small></a> | ||
80 | </div> | ||
81 | |||
82 | |||
83 | |||
84 | </div> | ||
85 | </div> | ||
86 | |||
87 | |||
88 | |||
89 | <div class="content text"> | ||
90 | |||
91 | <div class="heading-text">Register Documentation</div> | ||
92 | <p>POST request to /register endpoint | ||
93 | Lets a [<code>User</code>] (=student) to authenticate themselves to the system | ||
94 | This <code>request</code> can be rejected if the payload is malformed (=not authenticated properly) or if | ||
95 | the [<code>AuthRequest.user_id</code>] of the <code>request</code> is not in the list of users that can hold a Gradecoin account</p> | ||
96 | <h1 id="authentication-process">Authentication Process</h1> | ||
97 | <ul> | ||
98 | <li> | ||
99 | <p>Gradecoin's Public Key (<code>gradecoin_public_key</code>) is listed on moodle.</p> | ||
100 | </li> | ||
101 | <li> | ||
102 | <p>Gradecoin's Private Key (<code>gradecoin_private_key</code>) is loaded here</p> | ||
103 | </li> | ||
104 | <li> | ||
105 | <p>Student picks a short temporary key (<code>k_temp</code>)</p> | ||
106 | </li> | ||
107 | <li> | ||
108 | <p>Creates a JSON object (<code>auth_plaintext</code>) with their <code>metu_id</code> and <code>public key</code> in base64 (PEM) format (<code>S_PK</code>): | ||
109 | { | ||
110 | student_id: "e12345", | ||
111 | passwd: "15 char secret" | ||
112 | public_key: "---BEGIN PUBLIC KEY..." | ||
113 | }</p> | ||
114 | </li> | ||
115 | <li> | ||
116 | <p>Encrypts the serialized string of <code>auth_plaintext</code> with 128 bit block AES in CBC mode with Pkcs7 padding using the temporary key (<code>k_temp</code>), the result is <code>auth_ciphertext</code> TODO should this be base64'd?</p> | ||
117 | </li> | ||
118 | <li> | ||
119 | <p>The temporary key student has picked <code>k_temp</code> is encrypted using RSA with OAEP padding scheme | ||
120 | using sha256 with <code>gradecoin_public_key</code> (TODO base64? same as above), giving us <code>key_ciphertext</code></p> | ||
121 | </li> | ||
122 | <li> | ||
123 | <p>The payload JSON object (<code>auth_request</code>) can be JSON serialized now: | ||
124 | { | ||
125 | c: "auth_ciphertext" | ||
126 | key: "key_ciphertext" | ||
127 | }</p> | ||
128 | </li> | ||
129 | </ul> | ||
130 | <h2 id="gradecoin-side">Gradecoin Side</h2> | ||
131 | <ul> | ||
132 | <li>Upon receiving, we first RSA decrypt with OAEP padding scheme using SHA256 with <code>gradecoin_private_key</code> as the key and auth_request.key <code>key</code> as the ciphertext, receiving <code>temp_key</code> (this is the temporary key chosen by stu</li> | ||
133 | <li>With <code>temp_key</code>, we can AES 128 Cbc Pkcs7 decrypt the <code>auth_request.c</code>, giving us | ||
134 | auth_plaintext</li> | ||
135 | <li>The <code>auth_plaintext</code> String can be deserialized to [<code>AuthRequest</code>]</li> | ||
136 | <li>We then verify the payload and calculate the User fingerprint</li> | ||
137 | <li>Finally, create the new [<code>User</code>] object, insert to users HashMap <code><fingerprint, User></code></li> | ||
138 | </ul> | ||
139 | |||
140 | |||
141 | </div> | ||
142 | |||
143 | |||
144 | |||
145 | </main> | ||
146 | |||
147 | |||
148 | <footer> | ||
149 | ⁂ | ||
150 | </footer> | ||
151 | |||
152 | </body> | ||
153 | <script> | ||
154 | function highlightNav(heading) { | ||
155 | let pathname = location.pathname; | ||
156 | document.querySelectorAll(".toc a").forEach((item) => { | ||
157 | item.classList.remove("active"); | ||
158 | }); | ||
159 | document.querySelector(".toc a[href$='" + pathname + "#" + heading + "']").classList.add("active"); | ||
160 | } | ||
161 | |||
162 | let currentHeading = ""; | ||
163 | window.onscroll = function () { | ||
164 | let h = document.querySelectorAll("h1,h2,h3,h4,h5,h6"); | ||
165 | let elementArr = []; | ||
166 | |||
167 | h.forEach(item => { | ||
168 | if (item.id !== "") { | ||
169 | elementArr[item.id] = item.getBoundingClientRect().top; | ||
170 | } | ||
171 | }); | ||
172 | elementArr.sort(); | ||
173 | for (let key in elementArr) { | ||
174 | if (!elementArr.hasOwnProperty(key)) { | ||
175 | continue; | ||
176 | } | ||
177 | if (elementArr[key] > 0 && elementArr[key] < 300) { | ||
178 | if (currentHeading !== key) { | ||
179 | highlightNav(key); | ||
180 | currentHeading = key; | ||
181 | } | ||
182 | break; | ||
183 | } | ||
184 | } | ||
185 | } | ||
186 | </script> | ||
187 | |||
188 | </html> | ||
diff --git a/site/public/robots.txt b/site/public/robots.txt new file mode 100644 index 0000000..c100df9 --- /dev/null +++ b/site/public/robots.txt | |||
@@ -0,0 +1,3 @@ | |||
1 | User-agent: * | ||
2 | Allow: / | ||
3 | Sitemap: http://localhost:8080/sitemap.xml | ||
diff --git a/site/public/search_index.en.js b/site/public/search_index.en.js new file mode 100644 index 0000000..03cbfea --- /dev/null +++ b/site/public/search_index.en.js | |||
@@ -0,0 +1 @@ | |||
window.searchIndex = {"fields":["title","body"],"pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5","index":{"body":{"root":{"docs":{},"df":0,"1":{"docs":{},"df":0,"2":{"docs":{},"df":0,"8":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}},"5":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}},"2":{"docs":{},"df":0,"0":{"docs":{},"df":0,"4":{"docs":{},"df":0,"8":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}},"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"v":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}},"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}}}}},"e":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"y":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}}}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.4142135623730951},"http://localhost:8080/jwt/":{"tf":1.4142135623730951},"http://localhost:8080/transaction-docs/":{"tf":1.4142135623730951}},"df":3}}},"p":{"docs":{},"df":0,"i":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"_":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"x":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}}}}}}}}}},"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"x":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":2.0}},"df":1}}}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1,".":{"docs":{},"df":0,"c":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1},"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"y":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}}}}}}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.7320508075688772}},"df":1}}},"o":{"docs":{},"df":0,"r":{"docs":{"http://localhost:8080/":{"tf":1.7320508075688772}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1,".":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"_":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}},"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"6":{"docs":{},"df":0,"4":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1,"'":{"docs":{},"df":0,"d":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.0},"http://localhost:8080/register-docs/":{"tf":1.0}},"df":2}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"http://localhost:8080/":{"tf":1.4142135623730951},"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/register-docs/":{"tf":1.0}},"df":3}}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}}}}},"c":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}},"b":{"docs":{},"df":0,"c":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"x":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}}},"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}}}}}}},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.0},"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":2}}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"l":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}},"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"g":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}},"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"y":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.4142135623730951},"http://localhost:8080/jwt/":{"tf":1.4142135623730951},"http://localhost:8080/transaction-docs/":{"tf":1.4142135623730951}},"df":3}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"http://localhost:8080/block-docs/":{"tf":2.0},"http://localhost:8080/jwt/":{"tf":2.0},"http://localhost:8080/transaction-docs/":{"tf":2.0}},"df":3}}},"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}},"w":{"docs":{},"df":0,"n":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}}}}},"u":{"docs":{},"df":0,"o":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3},"r":{"docs":{},"df":0,"e":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"1":{"docs":{},"df":0,"2":{"docs":{},"df":0,"3":{"docs":{},"df":0,"4":{"docs":{},"df":0,"5":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}},"a":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3},"i":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"y":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.0},"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":2}}}}},"d":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}}},"o":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}},"s":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}},"t":{"docs":{"http://localhost:8080/block-docs/":{"tf":2.0},"http://localhost:8080/jwt/":{"tf":2.0},"http://localhost:8080/transaction-docs/":{"tf":2.0}},"df":3},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}},"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"http://localhost:8080/":{"tf":1.4142135623730951}},"df":1}}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}},"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}}}}},"r":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"http://localhost:8080/":{"tf":1.4142135623730951},"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":2,"'":{"docs":{"http://localhost:8080/":{"tf":1.4142135623730951},"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":2},"_":{"docs":{},"df":0,"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"_":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"y":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}}}}}}}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"_":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"y":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}}}}}}}}}}}}}}}}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://localhost:8080/":{"tf":1.4142135623730951}},"df":1}}}},"l":{"docs":{},"df":0,"p":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"d":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1},"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}}}}}},"p":{"docs":{},"df":0,"s":{"docs":{},"df":0,"u":{"docs":{},"df":0,"m":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.4142135623730951},"http://localhost:8080/jwt/":{"tf":1.4142135623730951},"http://localhost:8080/transaction-docs/":{"tf":1.4142135623730951}},"df":3}}}}},"j":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"http://localhost:8080/":{"tf":1.0},"http://localhost:8080/register-docs/":{"tf":1.7320508075688772}},"df":2}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}}},"w":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0}},"df":2,"'":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1},".":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}}}}}}},"k":{"docs":{},"df":0,"_":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.7320508075688772}},"df":1}}}}},"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"d":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}},"e":{"docs":{},"df":0,"y":{"docs":{"http://localhost:8080/":{"tf":2.449489742783178},"http://localhost:8080/register-docs/":{"tf":3.3166247903554}},"df":2,"_":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"x":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}}}}}}}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}},"s":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.0},"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":2}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.4142135623730951},"http://localhost:8080/jwt/":{"tf":1.4142135623730951},"http://localhost:8080/transaction-docs/":{"tf":1.4142135623730951}},"df":3}}}},"t":{"docs":{},"df":0,";":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}}}}}}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}},"l":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"_":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{"http://localhost:8080/":{"tf":1.0},"http://localhost:8080/register-docs/":{"tf":1.0}},"df":2}}}}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"u":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}}},"w":{"docs":{"http://localhost:8080/":{"tf":1.0},"http://localhost:8080/register-docs/":{"tf":1.0}},"df":2}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}}},"b":{"docs":{},"df":0,"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.7320508075688772}},"df":1}}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"http://localhost:8080/":{"tf":1.4142135623730951}},"df":1}}}},"n":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.7320508075688772}},"df":1},"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"w":{"docs":{},"df":0,"d":{"docs":{"http://localhost:8080/":{"tf":1.0},"http://localhost:8080/register-docs/":{"tf":1.0}},"df":2}}}},"y":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.7320508075688772}},"df":1}}}}}},"e":{"docs":{},"df":0,"m":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}}},"k":{"docs":{},"df":0,"c":{"docs":{},"df":0,"s":{"docs":{},"df":0,"7":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}}}},"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.4142135623730951},"http://localhost:8080/register-docs/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"http://localhost:8080/":{"tf":2.449489742783178},"http://localhost:8080/register-docs/":{"tf":1.7320508075688772}},"df":2,"_":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"y":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"m":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.0},"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":2}}}},"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":3.0},"http://localhost:8080/register-docs/":{"tf":1.7320508075688772}},"df":2}}}}},"s":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}},"f":{"docs":{},"df":0,"c":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"a":{"docs":{"http://localhost:8080/":{"tf":1.0},"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":2}}},"s":{"docs":{},"df":0,"_":{"docs":{},"df":0,"p":{"docs":{},"df":0,"k":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}},"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"s":{"docs":{},"df":0,"c":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}}}},"m":{"docs":{},"df":0,"e":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}}}},"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,":":{"docs":{},"df":0,":":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"http://localhost:8080/":{"tf":1.4142135623730951}},"df":1,":":{"docs":{},"df":0,":":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"_":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}}},"d":{"docs":{},"df":0,"b":{"docs":{},"df":0,":":{"docs":{},"df":0,":":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"_":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}}}}},"e":{"docs":{},"df":0,"a":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3},"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}},"d":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.4142135623730951},"http://localhost:8080/jwt/":{"tf":1.4142135623730951},"http://localhost:8080/transaction-docs/":{"tf":1.4142135623730951}},"df":3},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"2":{"docs":{},"df":0,"5":{"docs":{},"df":0,"6":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}},"g":{"docs":{},"df":0,"n":{"docs":{"http://localhost:8080/":{"tf":1.7320508075688772}},"df":1}},"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}},"t":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.4142135623730951},"http://localhost:8080/jwt/":{"tf":1.4142135623730951},"http://localhost:8080/transaction-docs/":{"tf":1.4142135623730951}},"df":3}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}}}},"u":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.7320508075688772},"http://localhost:8080/register-docs/":{"tf":1.7320508075688772}},"df":2,"_":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}}},"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}}}}}},"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"_":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"y":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}}}},"o":{"docs":{},"df":0,"r":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"http://localhost:8080/register-docs/":{"tf":2.0}},"df":1}}}}}}}},"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"v":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}}},"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.4142135623730951}},"df":1}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":2.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":2}}}}}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}}}}}},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}},"s":{"docs":{"http://localhost:8080/":{"tf":1.7320508075688772},"http://localhost:8080/register-docs/":{"tf":2.0}},"df":2,"e":{"docs":{},"df":0,"r":{"docs":{"http://localhost:8080/register-docs/":{"tf":2.23606797749979}},"df":1,"&":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}},"t":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}},"o":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0},"http://localhost:8080/jwt/":{"tf":1.0},"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":3}}}}}}}},"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"b":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"l":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}}}},"title":{"root":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"http://localhost:8080/block-docs/":{"tf":1.0}},"df":1}}}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"http://localhost:8080/":{"tf":1.0}},"df":1}}}}}}}}},"j":{"docs":{},"df":0,"w":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/jwt/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/register-docs/":{"tf":1.0}},"df":1}}}}}},"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"http://localhost:8080/transaction-docs/":{"tf":1.0}},"df":1}}}}}}}}}}},"documentStore":{"save":true,"docs":{"http://localhost:8080/":{"body":"\nDon't know where to start? Gradecoin uses RESTful API, simple curl commands or even your browser will work! This website can help as well.\nJWT Debugger and the corresponding RFC\n\nServices\n/register\n\nStudent creates their own 2048 bit RSA keypair\nDownloads Gradecoin's Public Key from Moodle\nEncrypts their JSON wrapped Public Key, Student ID and one time passwd using Gradecoin's Public Key\nTheir public key is now in our database and can be used to sign their JWT's during requests\n\n/transaction\n\nYou can offer a Transaction - POST request\n\nThe request should have Authorization\nThe request header should be signed by the Public Key of the by field in the transaction\n\n\nfetch the list of Transactions - GET request\n\n/block\n\noffer a [schema::Block] - POST request\n\nThe request should have Authorization\nThe [schema::Block::transaction_list] of the block should be a subset of [schema::Db::pending_transactions]\n\n\nfetch the last accepted [schema::Block] - GET request\n\nAuthorization: The request header should have Bearer JWT.Token signed with Student Public Key\n","id":"http://localhost:8080/","title":"Gradecoin"},"http://localhost:8080/block-docs/":{"body":"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod\ntempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At\nvero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd\nubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n","id":"http://localhost:8080/block-docs/","title":"Blocks"},"http://localhost:8080/jwt/":{"body":"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod\ntempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At\nvero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd\nubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n","id":"http://localhost:8080/jwt/","title":"JWT"},"http://localhost:8080/register-docs/":{"body":"POST request to /register endpoint\nLets a [User] (=student) to authenticate themselves to the system\nThis request can be rejected if the payload is malformed (=not authenticated properly) or if\nthe [AuthRequest.user_id] of the request is not in the list of users that can hold a Gradecoin account\nAuthentication Process\n\n\nGradecoin's Public Key (gradecoin_public_key) is listed on moodle.\n\n\nGradecoin's Private Key (gradecoin_private_key) is loaded here\n\n\nStudent picks a short temporary key (k_temp)\n\n\nCreates a JSON object (auth_plaintext) with their metu_id and public key in base64 (PEM) format (S_PK):\n{\nstudent_id: \"e12345\",\npasswd: \"15 char secret\"\npublic_key: \"---BEGIN PUBLIC KEY...\"\n}\n\n\nEncrypts the serialized string of auth_plaintext with 128 bit block AES in CBC mode with Pkcs7 padding using the temporary key (k_temp), the result is auth_ciphertext TODO should this be base64'd?\n\n\nThe temporary key student has picked k_temp is encrypted using RSA with OAEP padding scheme\nusing sha256 with gradecoin_public_key (TODO base64? same as above), giving us key_ciphertext\n\n\nThe payload JSON object (auth_request) can be JSON serialized now:\n{\nc: \"auth_ciphertext\"\nkey: \"key_ciphertext\"\n}\n\n\nGradecoin Side\n\nUpon receiving, we first RSA decrypt with OAEP padding scheme using SHA256 with gradecoin_private_key as the key and auth_request.key key as the ciphertext, receiving temp_key (this is the temporary key chosen by stu\nWith temp_key, we can AES 128 Cbc Pkcs7 decrypt the auth_request.c, giving us\nauth_plaintext\nThe auth_plaintext String can be deserialized to [AuthRequest]\nWe then verify the payload and calculate the User fingerprint\nFinally, create the new [User] object, insert to users HashMap <fingerprint, User>\n\n","id":"http://localhost:8080/register-docs/","title":"Register"},"http://localhost:8080/transaction-docs/":{"body":"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod\ntempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At\nvero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd\nubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n","id":"http://localhost:8080/transaction-docs/","title":"Transactions"}},"docInfo":{"http://localhost:8080/":{"body":99,"title":1},"http://localhost:8080/block-docs/":{"body":48,"title":1},"http://localhost:8080/jwt/":{"body":48,"title":1},"http://localhost:8080/register-docs/":{"body":166,"title":1},"http://localhost:8080/transaction-docs/":{"body":48,"title":1}},"length":5},"lang":"English"}; \ No newline at end of file | |||
diff --git a/site/public/sitemap.xml b/site/public/sitemap.xml new file mode 100644 index 0000000..db9224f --- /dev/null +++ b/site/public/sitemap.xml | |||
@@ -0,0 +1,18 @@ | |||
1 | <?xml version="1.0" encoding="UTF-8"?> | ||
2 | <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> | ||
3 | <url> | ||
4 | <loc>http://localhost:8080/</loc> | ||
5 | </url> | ||
6 | <url> | ||
7 | <loc>http://localhost:8080/block-docs/</loc> | ||
8 | </url> | ||
9 | <url> | ||
10 | <loc>http://localhost:8080/jwt/</loc> | ||
11 | </url> | ||
12 | <url> | ||
13 | <loc>http://localhost:8080/register-docs/</loc> | ||
14 | </url> | ||
15 | <url> | ||
16 | <loc>http://localhost:8080/transaction-docs/</loc> | ||
17 | </url> | ||
18 | </urlset> | ||
diff --git a/site/public/transaction-docs/index.html b/site/public/transaction-docs/index.html new file mode 100644 index 0000000..8c35895 --- /dev/null +++ b/site/public/transaction-docs/index.html | |||
@@ -0,0 +1,126 @@ | |||
1 | <!DOCTYPE html> | ||
2 | <html lang="en"> | ||
3 | |||
4 | <head> | ||
5 | <meta charset="UTF-8"> | ||
6 | <title>Transactions | </title> | ||
7 | <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | ||
8 | <style> | ||
9 | :root { | ||
10 | /* Primary theme color */ | ||
11 | --primary-color: #F8D12F; | ||
12 | /* Primary theme text color */ | ||
13 | --primary-text-color: #1E2329; | ||
14 | /* Primary theme link color */ | ||
15 | --primary-link-color: #2F57F7; | ||
16 | /* Secondary color: the background body color */ | ||
17 | --secondary-color: #FAFAFA; | ||
18 | --secondary-text-color: #303030; | ||
19 | /* Highlight text color of table of content */ | ||
20 | --toc-highlight-text-color: #d46e13; | ||
21 | } | ||
22 | </style> | ||
23 | |||
24 | <link href="https://fonts.googleapis.com/css?family=Alfa+Slab+One&display=swap" rel="stylesheet"> | ||
25 | <link href="https://fonts.googleapis.com/css?family=Fira+Sans:400,500,600&display=swap" rel="stylesheet"> | ||
26 | <link rel="stylesheet" href="/normalize.css"> | ||
27 | <link rel="stylesheet" href="http://localhost:8080/juice.css"> | ||
28 | |||
29 | |||
30 | </head> | ||
31 | |||
32 | <body> | ||
33 | |||
34 | <header class="box-shadow"> | ||
35 | |||
36 | |||
37 | <a href="http://localhost:8080/"> | ||
38 | <div class="logo"> | ||
39 | <img src="http://localhost:8080/gradecoin.png" alt="logo"> | ||
40 | Gradecoin | ||
41 | </div> | ||
42 | </a> | ||
43 | |||
44 | <nav> | ||
45 | |||
46 | <a class="nav-item subtitle-text" href="http://localhost:8080/block-docs/">Blocks</a> | ||
47 | |||
48 | <a class="nav-item subtitle-text" href="http://localhost:8080/transaction-docs/">Transactions</a> | ||
49 | |||
50 | <a class="nav-item subtitle-text" href="http://localhost:8080/register-docs/">Register</a> | ||
51 | |||
52 | <a class="nav-item subtitle-text" href="http://localhost:8080/jwt/">JWT</a> | ||
53 | |||
54 | |||
55 | |||
56 | <a class="nav-item subtitle-text" href="https://github.com/zhuowei/nft_ptr#why">why?</a> | ||
57 | |||
58 | |||
59 | </nav> | ||
60 | |||
61 | </header> | ||
62 | |||
63 | |||
64 | <main> | ||
65 | |||
66 | |||
67 | |||
68 | |||
69 | |||
70 | <div class="content text"> | ||
71 | |||
72 | <div class="heading-text">Transaction documentation</div> | ||
73 | <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod | ||
74 | tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At | ||
75 | vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd | ||
76 | ubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p> | ||
77 | |||
78 | |||
79 | </div> | ||
80 | |||
81 | |||
82 | |||
83 | </main> | ||
84 | |||
85 | |||
86 | <footer> | ||
87 | ⁂ | ||
88 | </footer> | ||
89 | |||
90 | </body> | ||
91 | <script> | ||
92 | function highlightNav(heading) { | ||
93 | let pathname = location.pathname; | ||
94 | document.querySelectorAll(".toc a").forEach((item) => { | ||
95 | item.classList.remove("active"); | ||
96 | }); | ||
97 | document.querySelector(".toc a[href$='" + pathname + "#" + heading + "']").classList.add("active"); | ||
98 | } | ||
99 | |||
100 | let currentHeading = ""; | ||
101 | window.onscroll = function () { | ||
102 | let h = document.querySelectorAll("h1,h2,h3,h4,h5,h6"); | ||
103 | let elementArr = []; | ||
104 | |||
105 | h.forEach(item => { | ||
106 | if (item.id !== "") { | ||
107 | elementArr[item.id] = item.getBoundingClientRect().top; | ||
108 | } | ||
109 | }); | ||
110 | elementArr.sort(); | ||
111 | for (let key in elementArr) { | ||
112 | if (!elementArr.hasOwnProperty(key)) { | ||
113 | continue; | ||
114 | } | ||
115 | if (elementArr[key] > 0 && elementArr[key] < 300) { | ||
116 | if (currentHeading !== key) { | ||
117 | highlightNav(key); | ||
118 | currentHeading = key; | ||
119 | } | ||
120 | break; | ||
121 | } | ||
122 | } | ||
123 | } | ||
124 | </script> | ||
125 | |||
126 | </html> | ||
diff --git a/site/static/android-chrome-192x192.png b/site/static/android-chrome-192x192.png new file mode 100644 index 0000000..023ddbd --- /dev/null +++ b/site/static/android-chrome-192x192.png | |||
Binary files differ | |||
diff --git a/site/static/android-chrome-512x512.png b/site/static/android-chrome-512x512.png new file mode 100644 index 0000000..4251933 --- /dev/null +++ b/site/static/android-chrome-512x512.png | |||
Binary files differ | |||
diff --git a/site/static/apple-touch-icon.png b/site/static/apple-touch-icon.png new file mode 100644 index 0000000..cd8e4c8 --- /dev/null +++ b/site/static/apple-touch-icon.png | |||
Binary files differ | |||
diff --git a/site/static/favicon-16x16.png b/site/static/favicon-16x16.png new file mode 100644 index 0000000..bd63d34 --- /dev/null +++ b/site/static/favicon-16x16.png | |||
Binary files differ | |||
diff --git a/site/static/favicon-32x32.png b/site/static/favicon-32x32.png new file mode 100644 index 0000000..e343587 --- /dev/null +++ b/site/static/favicon-32x32.png | |||
Binary files differ | |||
diff --git a/site/static/favicon.ico b/site/static/favicon.ico new file mode 100644 index 0000000..45d8bfe --- /dev/null +++ b/site/static/favicon.ico | |||
Binary files differ | |||
diff --git a/site/static/gradecoin.png b/site/static/gradecoin.png new file mode 100644 index 0000000..eeb670c --- /dev/null +++ b/site/static/gradecoin.png | |||
Binary files differ | |||
diff --git a/site/templates/_variables.html b/site/templates/_variables.html new file mode 100644 index 0000000..3fd05b4 --- /dev/null +++ b/site/templates/_variables.html | |||
@@ -0,0 +1,15 @@ | |||
1 | <style> | ||
2 | :root { | ||
3 | /* Primary theme color */ | ||
4 | --primary-color: #F8D12F; | ||
5 | /* Primary theme text color */ | ||
6 | --primary-text-color: #1E2329; | ||
7 | /* Primary theme link color */ | ||
8 | --primary-link-color: #2F57F7; | ||
9 | /* Secondary color: the background body color */ | ||
10 | --secondary-color: #FAFAFA; | ||
11 | --secondary-text-color: #303030; | ||
12 | /* Highlight text color of table of content */ | ||
13 | --toc-highlight-text-color: #d46e13; | ||
14 | } | ||
15 | </style> | ||
diff --git a/site/templates/index.html b/site/templates/index.html new file mode 100644 index 0000000..70223a5 --- /dev/null +++ b/site/templates/index.html | |||
@@ -0,0 +1,44 @@ | |||
1 | {% extends "juice/templates/index.html" %} | ||
2 | |||
3 | {% block hero %} | ||
4 | <section class="text-center"> | ||
5 | <h1 class="heading-text" style="font-size: 50px"> | ||
6 | Mine your own grades | ||
7 | </h1> | ||
8 | <h3 class="title-text"> | ||
9 | <b style="color: deepskyblue">Gradecoin</b> is the latest cutting edge blockchain technology agile grading framework that drives organic engagement and other buzzwords, with big data mining search engine optimization | ||
10 | </h3> | ||
11 | <div> | ||
12 | <!-- <a class="github-button" href="https://github.com/huhu/juice" data-size="large" data-show-count="true" --> | ||
13 | <!-- aria-label="Star huhu/juice on GitHub">Star</a> --> | ||
14 | <!-- <a class="github-button" href="https://github.com/huhu/juice/fork" data-size="large" --> | ||
15 | <!-- data-show-count="true" aria-label="Fork huhu/juice on GitHub">Fork</a> --> | ||
16 | </div> | ||
17 | </section> | ||
18 | <img class="hero-image" style="width: 50%" src="{{ get_url(path="gradecoin.png") }}"> | ||
19 | |||
20 | <div class="explore-more text" | ||
21 | onclick="document.getElementById('features').scrollIntoView({behavior: 'smooth'})"> | ||
22 | ⇩ Learn How ⇩ | ||
23 | </div> | ||
24 | <style> | ||
25 | .hero section { | ||
26 | padding: 0 5rem; | ||
27 | } | ||
28 | @media screen and (max-width: 768px) { | ||
29 | .hero section { | ||
30 | padding: 0 2rem; | ||
31 | } | ||
32 | |||
33 | .hero-image { | ||
34 | display: none | ||
35 | } | ||
36 | } | ||
37 | </style> | ||
38 | {% endblock hero %} | ||
39 | |||
40 | {% block footer %} | ||
41 | <footer> | ||
42 | ⁂ | ||
43 | </footer> | ||
44 | {% endblock footer %} | ||
diff --git a/site/themes/juice b/site/themes/juice new file mode 160000 | |||
Subproject 07310323f85e7851c0a1498021b0a02cfb2e215 | |||
diff --git a/src/handlers.rs b/src/handlers.rs index b3a6fa8..7135190 100644 --- a/src/handlers.rs +++ b/src/handlers.rs | |||
@@ -194,17 +194,6 @@ pub async fn authenticate_user( | |||
194 | Ok(warp::reply::with_status(res_json, StatusCode::CREATED)) | 194 | Ok(warp::reply::with_status(res_json, StatusCode::CREATED)) |
195 | } | 195 | } |
196 | 196 | ||
197 | // fn shed_pem_header_footer(maybe_key: String) -> Result<Vec<u8>, String> { | ||
198 | // let der_encoded = maybe_key | ||
199 | // .lines() | ||
200 | // .filter(|line| !line.starts_with("-")) | ||
201 | // .fold(String::new(), |mut data, line| { | ||
202 | // data.push_str(&line); | ||
203 | // data | ||
204 | // }); | ||
205 | // Ok(base64::decode(&der_encoded).expect("failed to decode base64 content")) | ||
206 | // } | ||
207 | |||
208 | /// GET /transaction | 197 | /// GET /transaction |
209 | /// Returns JSON array of transactions | 198 | /// Returns JSON array of transactions |
210 | /// Cannot fail | 199 | /// Cannot fail |
diff --git a/src/routes.rs b/src/routes.rs index f8d9605..59342bb 100644 --- a/src/routes.rs +++ b/src/routes.rs | |||
@@ -7,14 +7,19 @@ use crate::schema::Db; | |||
7 | 7 | ||
8 | /// Every route combined | 8 | /// Every route combined |
9 | pub fn consensus_routes(db: Db) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone { | 9 | pub fn consensus_routes(db: Db) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone { |
10 | let welcome_route = warp::path::end().and_then(handlers::welcome_handler); | 10 | // Remember when we wanted to implement templating |
11 | // Why would we? Just put a staic webpage under /public (next to Cargo.toml) and place it and | ||
12 | // the end of the filter chain | ||
11 | 13 | ||
12 | welcome_route | 14 | // Fully fledged website support, phew! |
13 | .or(transaction_list(db.clone())) | 15 | let static_route = warp::any().and(warp::fs::dir("public")); |
16 | |||
17 | transaction_list(db.clone()) | ||
14 | .or(register_user(db.clone())) | 18 | .or(register_user(db.clone())) |
15 | .or(auth_transaction_propose(db.clone())) | 19 | .or(auth_transaction_propose(db.clone())) |
16 | .or(auth_block_propose(db.clone())) | 20 | .or(auth_block_propose(db.clone())) |
17 | .or(block_list(db.clone())) | 21 | .or(block_list(db.clone())) |
22 | .or(static_route) | ||
18 | } | 23 | } |
19 | 24 | ||
20 | /// POST /register warp route | 25 | /// POST /register warp route |