Created
May 30, 2024 16:40
-
-
Save muellerzr/f978f81fd77ab065d14804d5e9bbf1fc to your computer and use it in GitHub Desktop.
Password protection on static gh site
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Deploy to GitHub Pages | |
on: | |
push: | |
branches: [ "main", "master" ] | |
workflow_dispatch: | |
jobs: | |
deploy: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: '3.9' | |
cache: "pip" | |
cache-dependency-path: settings.ini | |
- name: Install Dependencies | |
env: | |
USE_PRE: true | |
shell: bash | |
run: | | |
set -ux | |
python -m pip install --upgrade pip | |
pip install nbdev==2.3.12 | |
test -f setup.py && pip install -e ".[dev]" | |
- name: Build docs | |
shell: bash | |
run: nbdev_docs | |
- name: Encrypt files | |
shell: bash | |
run: | | |
npm install -g [email protected] | |
find ./_docs -type f -name "*.html" -exec staticrypt {} --template password_template.html -p letswalktogether -d ./_docs \; | |
rm password_template.html | |
- name: Enable GitHub Pages | |
shell: python | |
run: | | |
import ghapi.core,nbdev.config,sys | |
msg="Please ensure GitHub Pages can publish from the root of the `gh-pages` branch per these instructions - https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site#publishing-from-a-branch" | |
try: | |
api = ghapi.core.GhApi(owner=nbdev.config.get_config().user, repo=nbdev.config.get_config().repo, token="${{ secrets.GITHUB_TOKEN }}") | |
api.enable_pages(branch='gh-pages') | |
except Exception as e: | |
print(f'::warning title="Could not enable GitHub Pages Automatically":: {msg}\n{e}') | |
- name: Deploy to GitHub Pages | |
uses: peaceiris/actions-gh-pages@v3 | |
with: | |
github_token: ${{ secrets.GITHUB_TOKEN }} | |
force_orphan: true | |
publish_dir: ./_docs | |
# The following lines assign commit authorship to the official GH-Actions bot for deploys to `gh-pages` branch. | |
# You can swap them out with your own user credentials. | |
user_name: github-actions[bot] | |
user_email: 41898282+github-actions[bot]@users.noreply.github.com |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html class="staticrypt-html"> | |
<head> | |
<meta charset="utf-8" /> | |
<title>/*[|template_title|]*/0</title> | |
<meta name="viewport" content="width=device-width, initial-scale=1" /> | |
<!-- do not cache this page --> | |
<meta http-equiv="cache-control" content="max-age=0" /> | |
<meta http-equiv="cache-control" content="no-cache" /> | |
<meta http-equiv="expires" content="0" /> | |
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" /> | |
<meta http-equiv="pragma" content="no-cache" /> | |
<style> | |
.staticrypt-hr { | |
margin-top: 20px; | |
margin-bottom: 20px; | |
border: 0; | |
border-top: 1px solid #eee; | |
} | |
.staticrypt-page { | |
width: 360px; | |
padding: 8% 0 0; | |
margin: auto; | |
box-sizing: border-box; | |
} | |
.staticrypt-form { | |
position: relative; | |
z-index: 1; | |
background: #ffffff; | |
max-width: 360px; | |
margin: 0 auto 100px; | |
padding: 45px; | |
text-align: center; | |
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24); | |
} | |
.staticrypt-form input[type="password"] { | |
outline: 0; | |
background: #f2f2f2; | |
width: 100%; | |
border: 0; | |
margin: 0 0 15px; | |
padding: 15px; | |
box-sizing: border-box; | |
font-size: 14px; | |
} | |
.staticrypt-form .staticrypt-decrypt-button { | |
text-transform: uppercase; | |
outline: 0; | |
background: /*[|template_color_primary|]*/ 0; | |
width: 100%; | |
border: 0; | |
padding: 15px; | |
color: #ffffff; | |
font-size: 14px; | |
cursor: pointer; | |
} | |
.staticrypt-form .staticrypt-decrypt-button:hover, | |
.staticrypt-form .staticrypt-decrypt-button:active, | |
.staticrypt-form .staticrypt-decrypt-button:focus { | |
background: /*[|template_color_primary|]*/ 0; | |
filter: brightness(92%); | |
} | |
.staticrypt-html { | |
height: 100%; | |
} | |
.staticrypt-body { | |
height: 100%; | |
margin: 0; | |
} | |
.staticrypt-content { | |
height: 100%; | |
margin-bottom: 1em; | |
background: /*[|template_color_secondary|]*/ 0; | |
font-family: "Arial", sans-serif; | |
-webkit-font-smoothing: antialiased; | |
-moz-osx-font-smoothing: grayscale; | |
} | |
.staticrypt-instructions { | |
margin-top: -1em; | |
margin-bottom: 1em; | |
} | |
.staticrypt-title { | |
font-size: 1.5em; | |
} | |
label.staticrypt-remember { | |
display: flex; | |
align-items: center; | |
margin-bottom: 1em; | |
} | |
.staticrypt-remember input[type="checkbox"] { | |
transform: scale(1.5); | |
margin-right: 1em; | |
} | |
.hidden { | |
display: none !important; | |
} | |
.staticrypt-spinner-container { | |
height: 100%; | |
display: flex; | |
align-items: center; | |
justify-content: center; | |
} | |
.staticrypt-spinner { | |
display: inline-block; | |
width: 2rem; | |
height: 2rem; | |
vertical-align: text-bottom; | |
border: 0.25em solid gray; | |
border-right-color: transparent; | |
border-radius: 50%; | |
-webkit-animation: spinner-border 0.75s linear infinite; | |
animation: spinner-border 0.75s linear infinite; | |
animation-duration: 0.75s; | |
animation-timing-function: linear; | |
animation-delay: 0s; | |
animation-iteration-count: infinite; | |
animation-direction: normal; | |
animation-fill-mode: none; | |
animation-play-state: running; | |
animation-name: spinner-border; | |
} | |
@keyframes spinner-border { | |
100% { | |
transform: rotate(360deg); | |
} | |
} | |
</style> | |
</head> | |
<body class="staticrypt-body"> | |
<div id="staticrypt_loading" class="staticrypt-spinner-container"> | |
<div class="staticrypt-spinner"></div> | |
</div> | |
<div id="staticrypt_content" class="staticrypt-content hidden"> | |
<div class="staticrypt-page"> | |
<div class="staticrypt-form"> | |
<div class="staticrypt-instructions"> | |
<p class="staticrypt-title">Welcome to Walk with fastai, Revisited</p> | |
<p>Please enter the password you received upon purchasing the course. If you are here and have not done so, access may be purchased <a href="https://store.walkwithfastai.com/walk-with-fastai-revisited">from here</a></p> | |
</div> | |
<hr class="staticrypt-hr" /> | |
<form id="staticrypt-form" action="#" method="post"> | |
<input | |
id="staticrypt-password" | |
type="password" | |
name="password" | |
placeholder="/*[|template_placeholder|]*/0" | |
autofocus | |
/> | |
<label id="staticrypt-remember-label" class="staticrypt-remember hidden"> | |
<input id="staticrypt-remember" type="checkbox" name="remember" /> | |
/*[|template_remember|]*/0 | |
</label> | |
<input type="submit" class="staticrypt-decrypt-button" value="/*[|template_button|]*/0" /> | |
</form> | |
</div> | |
</div> | |
</div> | |
<script> | |
// these variables will be filled when generating the file - the template format is '/*[|variable_name|]*/0' | |
const staticryptInitiator = /*[|js_staticrypt|]*/ 0; | |
const templateError = "/*[|template_error|]*/0", | |
isRememberEnabled = /*[|is_remember_enabled|]*/ 0, | |
staticryptConfig = /*[|staticrypt_config|]*/ 0; | |
// you can edit these values to customize some of the behavior of StatiCrypt | |
const templateConfig = { | |
rememberExpirationKey: "staticrypt_expiration", | |
rememberPassphraseKey: "staticrypt_passphrase", | |
replaceHtmlCallback: null, | |
clearLocalStorageCallback: null, | |
}; | |
// init the staticrypt engine | |
const staticrypt = staticryptInitiator.init(staticryptConfig, templateConfig); | |
// try to automatically decrypt on load if there is a saved password | |
window.onload = async function () { | |
const { isSuccessful } = await staticrypt.handleDecryptOnLoad(); | |
// if we didn't decrypt anything on load, show the password prompt. Otherwise the content has already been | |
// replaced, no need to do anything | |
if (!isSuccessful) { | |
// hide loading screen | |
document.getElementById("staticrypt_loading").classList.add("hidden"); | |
document.getElementById("staticrypt_content").classList.remove("hidden"); | |
document.getElementById("staticrypt-password").focus(); | |
// show the remember me checkbox | |
if (isRememberEnabled) { | |
document.getElementById("staticrypt-remember-label").classList.remove("hidden"); | |
} | |
} | |
}; | |
// handle password form submission | |
document.getElementById("staticrypt-form").addEventListener("submit", async function (e) { | |
e.preventDefault(); | |
const password = document.getElementById("staticrypt-password").value, | |
isRememberChecked = document.getElementById("staticrypt-remember").checked; | |
const { isSuccessful } = await staticrypt.handleDecryptionOfPage(password, isRememberChecked); | |
if (!isSuccessful) { | |
alert(templateError); | |
} | |
}); | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment