- Make an install directory somewhere convenient and switch to it
mkdir -p ~/.local/share/authy
cd ~/.local/share/authy
- Fetch the current Authy snap
mkdir -p ~/.local/share/authy
cd ~/.local/share/authy
/* Using a JavaScript proxy for a super low code REST client */ | |
// via https://dev.to/dipsaus9/javascript-lets-create-aproxy-19hg | |
// also see https://towardsdatascience.com/why-to-use-javascript-proxy-5cdc69d943e3 | |
// also see https://github.com/fastify/manifetch | |
// also see https://github.com/flash-oss/allserver | |
// and https://gist.github.com/v1vendi/75d5e5dad7a2d1ef3fcb48234e4528cb | |
const createApi = (url) => { | |
return new Proxy({}, { | |
get(target, key) { |
*update: TBC, but this new might affect how easy it is to use this technique past August 2024: Authy is shutting down its desktop app | The 2FA app Authy will only be available on Android and iOS starting in August
This gist, based in part on a gist by Brian Hartvigsen, allows you to export from Authy your TOTP tokens you have stored there.
Those can be "standard" 6-digits / 30 secs tokens, or Authy's own version, the 7-digits / 10 secs tokens.
// No Security | |
{ | |
"rules": { | |
".read": true, | |
".write": true | |
} | |
} |
axios({ | |
url: 'http://localhost:5000/static/example.pdf', | |
method: 'GET', | |
responseType: 'blob', // important | |
}).then((response) => { | |
const url = window.URL.createObjectURL(new Blob([response.data])); | |
const link = document.createElement('a'); | |
link.href = url; | |
link.setAttribute('download', 'file.pdf'); | |
document.body.appendChild(link); |
{% extends 'form_div_layout.html.twig' %} | |
{% block form_row -%} | |
<div class="row{% if (not compound or force_error|default(false)) and not valid %} has-error{% endif %}"> | |
<div class="input-field col s12"> | |
{{- form_widget(form) -}} | |
{{- form_label(form) -}} | |
{{- form_errors(form) -}} | |
</div> | |
</div> |
// ⚠ IMPORTANT: this is old and doesn't work for many different edge cases but I'll keep it as-is for any of you want it | |
// ⚠ IMPORTANT: you can find more robust versions in the comments or use a library implementation such as lodash's `merge` | |
// Merge a `source` object to a `target` recursively | |
const merge = (target, source) => { | |
// Iterate through `source` properties and if an `Object` set property to merge of `target` and `source` properties | |
for (const key of Object.keys(source)) { | |
if (source[key] instanceof Object) Object.assign(source[key], merge(target[key], source[key])) | |
} |
@font-face { | |
font-family: 'Material Icons'; | |
font-style: normal; | |
font-weight: 400; | |
src: url('data:font/truetype;charset=utf-8;base64,AAEAAAAPAIAAAwBwR0RFRgQAAFMAAYsIAAAAJEdQT1PgGO+cAAGLLAAAADZHU1VC5NKpUQABi2QAAGlQT1MvMgpzImMAAAF4AAAAYGNtYXDx8DHgAAAJeAAABgJjdnQgABEBRAAAD3wAAAAEZ2FzcP//AAMAAYsAAAAACGdseWZEfewEAAAXHAABckhoZWFkBtqLZgAAAPwAAAA2aGhlYQQBAgQAAAE0AAAAJGhtdHhq5mlGAAAB2AAAB6Bsb2NhOymWhQAAD4AAAAecbWF4cAQnAOEAAAFYAAAAIG5hbWUcDzXkAAGJZAAAAXpwb3N0/4YAMgABiuAAAAAgAAEAAAABAtBPvyKIXw889QAJAgAAAAAA0t6jygAAAADS3qPNAAD//gIAAgQAAAAIAAIAAAAAAAAAAQAAAgAAAAAAAgAAAAAAAgAAAQAAAAAAAAAAAAAAAAAAAAMAAQAAA80AsAAYAAAAAAACAAAAAQABAAAAQAAuAAAAAAAEAgABkAAFAAABTAFmAAAARwFMAWYAAAD1ABkAhAAAAgAFAwAAAAAAAAAAAAESAAAABAAAAAAAAAAAAAAAAIAAMP//AgAAAAAAAgAAAAAAAAEAAAAAAAAAAAAAACAAKwIAABEAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAKwAVAEAAKwBAAEAAVQBAAFUANQArAEAAQABVAGsAawBAACsAKwArACsAFQArAIAAKwArAKsAKwArACsAKwBAACsAFQBAAEAAVQBVAIAAgAArAIAAKwArACsAQAArAGsAlQBAAEAA |