Adding file integrity check
This commit is contained in:
parent
2352960418
commit
2cf55956f2
349
index.html
349
index.html
@ -65,7 +65,6 @@
|
|||||||
</sm-popup>
|
</sm-popup>
|
||||||
<script src="scripts/components.min.js"></script>
|
<script src="scripts/components.min.js"></script>
|
||||||
<script src="https://unpkg.com/uhtml@3.0.1/es.js"></script>
|
<script src="https://unpkg.com/uhtml@3.0.1/es.js"></script>
|
||||||
<script src="scripts/octokit.js" type="module"></script>
|
|
||||||
<script>
|
<script>
|
||||||
const { html, svg, render: renderElem } = uhtml;
|
const { html, svg, render: renderElem } = uhtml;
|
||||||
const uiGlobals = {}
|
const uiGlobals = {}
|
||||||
@ -119,7 +118,7 @@
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
//Function for displaying toast notifications. pass in error for mode param if you want to show an error.
|
//Function for displaying toast notifications. pass in error for mode param if you want to show an error.
|
||||||
function notify(message, mode, options = {}) {
|
function notify(message, mode, options = { timeout, pinned }) {
|
||||||
let icon
|
let icon
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case 'success':
|
case 'success':
|
||||||
@ -127,7 +126,7 @@
|
|||||||
break;
|
break;
|
||||||
case 'error':
|
case 'error':
|
||||||
icon = `<svg class="icon icon--error" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-7v2h2v-2h-2zm0-8v6h2V7h-2z"/></svg>`
|
icon = `<svg class="icon icon--error" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-7v2h2v-2h-2zm0-8v6h2V7h-2z"/></svg>`
|
||||||
if (typeof options.pinned === 'undefined')
|
if (!options.hasOwnProperty('timeout'))
|
||||||
options.pinned = true
|
options.pinned = true
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -329,17 +328,32 @@
|
|||||||
if (!page)
|
if (!page)
|
||||||
page = 'home'
|
page = 'home'
|
||||||
const preventDownloadInfoPopup = localStorage.getItem('dontShowDownloadInfo')
|
const preventDownloadInfoPopup = localStorage.getItem('dontShowDownloadInfo')
|
||||||
if (preventDownloadInfoPopup === null)
|
document.querySelectorAll('.dapp-download-button').forEach(elem => {
|
||||||
document.querySelectorAll('.dapp-download-button').forEach(elem => {
|
elem.onclick = (e) => {
|
||||||
elem.onclick = (e) => openPopup('download_info_popup')
|
e.preventDefault()
|
||||||
})
|
// check dapp hash before downloading and show error if hash doesn't match
|
||||||
|
const { hash: knownHash, appLink } = elem.closest('.dapp-card').dataset;
|
||||||
|
getRepoHash(appLink.split('/').pop()).then(latestHash => {
|
||||||
|
if (latestHash !== knownHash) {
|
||||||
|
notify(`The dapp you are trying to download has been modified. Dapp won't be downloaded.`, 'error')
|
||||||
|
} else {
|
||||||
|
if (preventDownloadInfoPopup === null || preventDownloadInfoPopup === 'false')
|
||||||
|
openPopup('download_info_popup')
|
||||||
|
// initiate download
|
||||||
|
window.location.href = elem.href
|
||||||
|
}
|
||||||
|
}).catch(e => {
|
||||||
|
console.error(e)
|
||||||
|
notify('There was an error while trying to download the dapp. Please try again later.', 'error', {
|
||||||
|
timeout: 10000,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
function dontShowInfoAgain() {
|
function dontShowInfoAgain() {
|
||||||
localStorage.setItem('dontShowDownloadInfo', true);
|
localStorage.setItem('dontShowDownloadInfo', true);
|
||||||
document.querySelectorAll('.dapp-download-button').forEach(elem => {
|
|
||||||
elem.onclick = null
|
|
||||||
})
|
|
||||||
closePopup()
|
closePopup()
|
||||||
}
|
}
|
||||||
window.addEventListener('load', () => {
|
window.addEventListener('load', () => {
|
||||||
@ -359,149 +373,226 @@
|
|||||||
<h1>Page not found</h1>
|
<h1>Page not found</h1>
|
||||||
`)
|
`)
|
||||||
})
|
})
|
||||||
const dappsList = [
|
let dappsList = [
|
||||||
{
|
{
|
||||||
name: 'Messenger',
|
"name": "BTC Mortgage",
|
||||||
description: 'Chat with your Bitcoin, Ethereum and FLO friends or use Bitcoin and FLO multisig.',
|
"description": "Borrow or Lend USD against Bitcoin",
|
||||||
icon: ``,
|
"icon": "",
|
||||||
appLink: 'https://ranchimall.github.io/messenger',
|
"appLink": "https://ranchimall.github.io/btcmortgage",
|
||||||
moreLink: '#/dapps/messenger',
|
"moreLink": "#/dapps/btc-mortgage",
|
||||||
tags: ['messenger', 'chat', 'bitcoin', 'ethereum', 'flo', 'multisig'],
|
"tags": [
|
||||||
category: 'social'
|
"bitcoin",
|
||||||
|
"mortgage",
|
||||||
|
"lend",
|
||||||
|
"borrow"
|
||||||
|
],
|
||||||
|
"category": "finance",
|
||||||
|
"hash": "197f0c491e8cabf866603d03c437f9b96ad5b58ce55de2f6bc0d39a633fdf5e1"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'FLO Wallet',
|
"name": "BTC Wallet",
|
||||||
description: 'A wallet for FLO',
|
"description": "Send and receive Bitcoin and track transactions.",
|
||||||
icon: ``,
|
"icon": "",
|
||||||
appLink: 'https://ranchimall.github.io/flowallet',
|
"appLink": "https://ranchimall.github.io/btcwallet",
|
||||||
moreLink: '#/dapps/flo-wallet',
|
"moreLink": "#/dapps/btc-wallet",
|
||||||
tags: ['flo', 'wallet'],
|
"tags": [
|
||||||
category: 'wallet'
|
"bitcoin",
|
||||||
|
"wallet"
|
||||||
|
],
|
||||||
|
"category": "wallet",
|
||||||
|
"hash": "20f12011d57e157e24b6388b3bb5d7f5970880babe99947dcf50749e08299cc0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'FLO Scout',
|
"name": "Certify",
|
||||||
description: 'Track FLO token transactions and utilize smart contracts.',
|
"description": "Create and distribute blockchain based certificates",
|
||||||
icon: ``,
|
"icon": "",
|
||||||
appLink: 'https://ranchimall.github.io/floscout',
|
"appLink": "https://ranchimall.github.io/certify",
|
||||||
moreLink: '#/dapps/flo-scout',
|
"moreLink": "#/dapps/certify",
|
||||||
tags: ['flo', 'scout', 'smart contracts'],
|
"tags": [
|
||||||
category: 'blockchain-explorer'
|
"certificates",
|
||||||
|
"certify",
|
||||||
|
"certification"
|
||||||
|
],
|
||||||
|
"category": "identity",
|
||||||
|
"hash": "99f2b66dcd62b2156b4f64cd4eab8a4efc182284fe13cdb8e2a9876d865c0123"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'BTC Wallet',
|
"name": "Content Collaboration",
|
||||||
description: 'Send and receive Bitcoin and track transactions.',
|
"description": "A writing app that allows you to collaborate with others",
|
||||||
icon: ``,
|
"icon": "",
|
||||||
appLink: 'https://ranchimall.github.io/btcwallet',
|
"appLink": "https://ranchimall.github.io/cc",
|
||||||
moreLink: '#/dapps/btc-wallet',
|
"moreLink": "#/dapps/content-collaboration",
|
||||||
tags: ['bitcoin', 'wallet'],
|
"tags": [
|
||||||
category: 'wallet'
|
"collaboration",
|
||||||
|
"writing",
|
||||||
|
"content"
|
||||||
|
],
|
||||||
|
"category": "content",
|
||||||
|
"hash": "debdda5bd18f0f4d06876967de5f6dd55f514b9048ec978d435acdbe720a5ff8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Taproot wallet',
|
"name": "Exchange",
|
||||||
description: 'A Bitcoin wallet with Taproot support.',
|
"description": "Trade FLO and FLO tokens with rupee tokens",
|
||||||
icon: ``,
|
"icon": "",
|
||||||
appLink: 'https://ranchimall.github.io/taprootwallet',
|
"appLink": "https://ranchimall.github.io/exchangemarket",
|
||||||
moreLink: '#/dapps/taproot-wallet',
|
"moreLink": "#/dapps/exchange",
|
||||||
tags: ['bitcoin', 'wallet', 'taproot'],
|
"tags": [
|
||||||
category: 'wallet'
|
"exchange",
|
||||||
|
"trade",
|
||||||
|
"flo",
|
||||||
|
"rupee"
|
||||||
|
],
|
||||||
|
"category": "finance",
|
||||||
|
"hash": "a5dbba6043d82ae04e99a8a522f4ab2d1ba2a2779cdcf4f28c1da2b2acf11df6"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'FLO Ethereum',
|
"name": "FLO Ethereum",
|
||||||
description: 'A Ethereum wallet that works with FLO',
|
"description": "A Ethereum wallet that works with FLO",
|
||||||
icon: ``,
|
"icon": "",
|
||||||
appLink: 'https://ranchimall.github.io/floethereum',
|
"appLink": "https://ranchimall.github.io/floethereum",
|
||||||
moreLink: '#/dapps/flo-ethereum',
|
"moreLink": "#/dapps/flo-ethereum",
|
||||||
tags: ['ethereum', 'wallet', 'flo'],
|
"tags": [
|
||||||
category: 'wallet'
|
"ethereum",
|
||||||
|
"wallet",
|
||||||
|
"flo"
|
||||||
|
],
|
||||||
|
"category": "wallet",
|
||||||
|
"hash": "6e647729eb0f179045f764d08c44d61178bb84e36e327d026c34a701a9875132"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'KYC',
|
"name": "FLO Scout",
|
||||||
description: 'An app to verify your identity',
|
"description": "Track FLO token transactions and utilize smart contracts.",
|
||||||
icon: ``,
|
"icon": "",
|
||||||
appLink: 'https://ranchimall.github.io/kyc',
|
"appLink": "https://ranchimall.github.io/floscout",
|
||||||
moreLink: '#/dapps/kyc',
|
"moreLink": "#/dapps/flo-scout",
|
||||||
tags: ['kyc', 'identity'],
|
"tags": [
|
||||||
category: 'identity'
|
"flo",
|
||||||
|
"scout",
|
||||||
|
"smart contracts"
|
||||||
|
],
|
||||||
|
"category": "blockchain-explorer",
|
||||||
|
"hash": "cb84c51f35d03e224b4a76d1a27dd19a75f4ac9b785e059696c16206557cfee3"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'BTC Mortgage',
|
"name": "FLO Wallet",
|
||||||
description: 'Borrow or Lend USD against Bitcoin',
|
"description": "A wallet for FLO",
|
||||||
icon: ``,
|
"icon": "",
|
||||||
appLink: 'https://ranchimall.github.io/btcmortgage',
|
"appLink": "https://ranchimall.github.io/flowallet",
|
||||||
moreLink: '#/dapps/btc-mortgage',
|
"moreLink": "#/dapps/flo-wallet",
|
||||||
tags: ['bitcoin', 'mortgage', 'lend', 'borrow'],
|
"tags": [
|
||||||
category: 'finance'
|
"flo",
|
||||||
|
"wallet"
|
||||||
|
],
|
||||||
|
"category": "wallet",
|
||||||
|
"hash": "a6ba8112b57a033cc0124aa3f1761e27b2066226b6604d035e8596d2c662b6b6"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'FLOpay',
|
"name": "FLOpay",
|
||||||
description: 'A rupee token payments app based on FLO',
|
"description": "A rupee token payments app based on FLO",
|
||||||
icon: ``,
|
"icon": "",
|
||||||
appLink: 'https://ranchimall.github.io/flopay',
|
"appLink": "https://ranchimall.github.io/flopay",
|
||||||
moreLink: '#/dapps/flopay',
|
"moreLink": "#/dapps/flopay",
|
||||||
tags: ['flo', 'payments', 'rupee'],
|
"tags": [
|
||||||
category: 'wallet'
|
"flo",
|
||||||
|
"payments",
|
||||||
|
"rupee"
|
||||||
|
],
|
||||||
|
"category": "wallet",
|
||||||
|
"hash": "8cc4313d43468138f26cf13a776876fc21560714d8e5eb1217599af585105a8f"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Content Collaboration',
|
"name": "KYC",
|
||||||
description: 'A writing app that allows you to collaborate with others',
|
"description": "An app to verify your identity",
|
||||||
icon: ``,
|
"icon": "",
|
||||||
appLink: 'https://ranchimall.github.io/cc',
|
"appLink": "https://ranchimall.github.io/kyc",
|
||||||
moreLink: '#/dapps/content-collaboration',
|
"moreLink": "#/dapps/kyc",
|
||||||
tags: ['collaboration', 'writing', 'content'],
|
"tags": [
|
||||||
category: 'content'
|
"kyc",
|
||||||
|
"identity"
|
||||||
|
],
|
||||||
|
"category": "identity",
|
||||||
|
"hash": "247423654e501dab943296ab9a55e60bf4204164aee469f401cecf0b53290671"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'RIBC',
|
"name": "LogSheet",
|
||||||
description: 'RanchiMall Internship Blockchain Contract (RIBC) allows you hire and manage interns.',
|
"description": "Create and manage public and private log sheets",
|
||||||
icon: ``,
|
"icon": "",
|
||||||
appLink: 'https://ranchimall.github.io/ribc',
|
"appLink": "https://ranchimall.github.io/flologsheet",
|
||||||
moreLink: '#/dapps/ribc',
|
"moreLink": "#/dapps/log-sheet",
|
||||||
tags: ['internship', 'contract', 'ribc'],
|
"tags": [
|
||||||
category: 'management'
|
"log",
|
||||||
|
"sheet",
|
||||||
|
"logsheets"
|
||||||
|
],
|
||||||
|
"category": "content",
|
||||||
|
"hash": "5c04711bbeaede85010e26d281a0a246a6f7f104e07a7bfcc5bc5208908647b6"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'LogSheet',
|
"name": "Messenger",
|
||||||
description: 'Create and manage public and private log sheets',
|
"description": "Chat with your Bitcoin, Ethereum and FLO friends or use Bitcoin and FLO multisig.",
|
||||||
icon: ``,
|
"icon": "",
|
||||||
appLink: 'https://ranchimall.github.io/logsheet',
|
"appLink": "https://ranchimall.github.io/messenger",
|
||||||
moreLink: '#/dapps/log-sheet',
|
"moreLink": "#/dapps/messenger",
|
||||||
tags: ['log', 'sheet', 'logsheets'],
|
"tags": [
|
||||||
category: 'content'
|
"messenger",
|
||||||
|
"chat",
|
||||||
|
"bitcoin",
|
||||||
|
"ethereum",
|
||||||
|
"flo",
|
||||||
|
"multisig"
|
||||||
|
],
|
||||||
|
"category": "social",
|
||||||
|
"hash": "8713c516c826f10a5258a0962c87e3a26bd54f25d9034d7d2b7dbb7a33e4e914"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Exchange',
|
"name": "RanchiMall Times",
|
||||||
description: 'Trade FLO and FLO tokens with rupee tokens',
|
"description": "A news app that showcases articles created with Content Collaboration app",
|
||||||
icon: ``,
|
"icon": "",
|
||||||
appLink: 'https://ranchimall.github.io/exchangemarket',
|
"appLink": "https://ranchimall.github.io/rmtimes",
|
||||||
moreLink: '#/dapps/exchange',
|
"moreLink": "#/dapps/ranchimall-times",
|
||||||
tags: ['exchange', 'trade', 'flo', 'rupee'],
|
"tags": [
|
||||||
category: 'finance'
|
"news",
|
||||||
|
"articles",
|
||||||
|
"content"
|
||||||
|
],
|
||||||
|
"category": "content",
|
||||||
|
"hash": "840823abe525a8be560d58e45af2499de6f45eaf973ce69a500b1df31ca295be"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'RanchiMall Times',
|
"name": "RIBC",
|
||||||
description: 'A news app that showcases articles created with Content Collaboration app',
|
"description": "RanchiMall Internship Blockchain Contract (RIBC) allows you hire and manage interns.",
|
||||||
icon: ``,
|
"icon": "",
|
||||||
appLink: 'https://ranchimall.github.io/rmtimes',
|
"appLink": "https://ranchimall.github.io/ribc",
|
||||||
moreLink: '#/dapps/ranchimall-times',
|
"moreLink": "#/dapps/ribc",
|
||||||
tags: ['news', 'articles', 'content'],
|
"tags": [
|
||||||
category: 'content'
|
"internship",
|
||||||
|
"contract",
|
||||||
|
"ribc"
|
||||||
|
],
|
||||||
|
"category": "management",
|
||||||
|
"hash": "9e0e44c5d50d7a0f28fb0f8ac4a168b5a1ec93a6e29e41503e1a6a579c567ed8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Certify',
|
"name": "Taproot wallet",
|
||||||
description: 'Create and distribute blockchain based certificates',
|
"description": "A Bitcoin wallet with Taproot support.",
|
||||||
icon: ``,
|
"icon": "",
|
||||||
appLink: 'https://ranchimall.github.io/certify',
|
"appLink": "https://ranchimall.github.io/taprootwallet",
|
||||||
moreLink: '#/dapps/certify',
|
"moreLink": "#/dapps/taproot-wallet",
|
||||||
tags: ['certificates', 'certify', 'certification'],
|
"tags": [
|
||||||
category: 'identity'
|
"bitcoin",
|
||||||
},
|
"wallet",
|
||||||
].sort((a, b) => a.name.localeCompare(b.name))
|
"taproot"
|
||||||
|
],
|
||||||
|
"category": "wallet",
|
||||||
|
"hash": "592bdad38e1b45e41247f054de33b9d71c58d4178d70ca03c22f1def7c97e2c0"
|
||||||
|
}
|
||||||
|
].sort((a, b) => a.name.localeCompare(b.name));
|
||||||
router.addRoute('home', renderHome)
|
router.addRoute('home', renderHome)
|
||||||
router.addRoute('', renderHome)
|
router.addRoute('', renderHome)
|
||||||
function renderDappCard(dapp) {
|
function renderDappCard(dapp) {
|
||||||
const { name, description, icon, appLink, moreLink, tags, category } = dapp;
|
const { name, description, icon, appLink, moreLink, tags, category, hash } = dapp;
|
||||||
return html`
|
return html`
|
||||||
<li class="dapp-card">
|
<li class="dapp-card" .dataset=${{ appLink, hash }}>
|
||||||
<div class="flex space-between">
|
<div class="flex space-between">
|
||||||
<div class="dapp-card__icon">
|
<div class="dapp-card__icon">
|
||||||
${icon}
|
${icon}
|
||||||
@ -603,8 +694,7 @@
|
|||||||
const linkToVerify = getRef('link_verification__input').value.trim();
|
const linkToVerify = getRef('link_verification__input').value.trim();
|
||||||
if (linkToVerify === '')
|
if (linkToVerify === '')
|
||||||
return notify('Please enter a link to verify', 'error', {
|
return notify('Please enter a link to verify', 'error', {
|
||||||
timeout: 5000,
|
timeout: 5000
|
||||||
pinned: false
|
|
||||||
})
|
})
|
||||||
const linkIsHostedCorrectly = linkToVerify.startsWith('https://ranchimall.github.io/')
|
const linkIsHostedCorrectly = linkToVerify.startsWith('https://ranchimall.github.io/')
|
||||||
const linkIsAuthorized = dappsList.some(({ appLink }) => linkToVerify.includes(appLink))
|
const linkIsAuthorized = dappsList.some(({ appLink }) => linkToVerify.includes(appLink))
|
||||||
@ -744,6 +834,21 @@
|
|||||||
);
|
);
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
async function getRepoHash(repoName = 'messenger') {
|
||||||
|
const response = await fetch(`https://api.github.com/repos/ranchimall/${repoName}/contents/`)
|
||||||
|
const json = await response.json()
|
||||||
|
const combinedSHA = json.reduce((acc, { sha }) => acc + sha, '')
|
||||||
|
return await calculateSHA256(new Blob([combinedSHA]))
|
||||||
|
}
|
||||||
|
|
||||||
|
async function calculateSHA256(blob) {
|
||||||
|
const buffer = await blob.arrayBuffer();
|
||||||
|
const hashBuffer = await crypto.subtle.digest('SHA-256', buffer);
|
||||||
|
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
||||||
|
const hashHex = hashArray.map(byte => byte.toString(16).padStart(2, '0')).join('');
|
||||||
|
return hashHex;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|||||||
@ -1,20 +0,0 @@
|
|||||||
import { Octokit, App } from "https://esm.sh/octokit";
|
|
||||||
|
|
||||||
async function some() {
|
|
||||||
const octokit = new Octokit({
|
|
||||||
auth: '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'
|
|
||||||
})
|
|
||||||
const owner = 'ranchimall';
|
|
||||||
const repo = 'messenger';
|
|
||||||
return await octokit.request('GET /repos/{owner}/{repo}', {
|
|
||||||
owner,
|
|
||||||
repo,
|
|
||||||
headers: {
|
|
||||||
'X-GitHub-Api-Version': '2022-11-28'
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
console.log(new Octokit({
|
|
||||||
auth: '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'
|
|
||||||
}))
|
|
||||||
// console.log(await some())
|
|
||||||
1
scripts/octokit.min.js
vendored
1
scripts/octokit.min.js
vendored
@ -1 +0,0 @@
|
|||||||
import{Octokit,App}from"https://esm.sh/octokit";async function some(){const octokit=new Octokit({auth:"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"});return await octokit.request("GET /repos/{owner}/{repo}",{owner:"ranchimall",repo:"messenger",headers:{"X-GitHub-Api-Version":"2022-11-28"}})}console.log(new Octokit({auth:"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"}));
|
|
||||||
Loading…
Reference in New Issue
Block a user