mirror of
https://codeberg.org/vlw/tempmail.git
synced 2025-09-13 18:03:40 +02:00
Initial commit
This commit is contained in:
commit
bc93d825b1
4 changed files with 183 additions and 0 deletions
55
.gitignore
vendored
Executable file
55
.gitignore
vendored
Executable file
|
@ -0,0 +1,55 @@
|
|||
# victorwesterlund.com #
|
||||
########################
|
||||
.well-known/
|
||||
/content
|
||||
|
||||
# Bootstrapping #
|
||||
#################
|
||||
/node_modules
|
||||
/public/hot
|
||||
/public/storage
|
||||
/storage/*.key
|
||||
/vendor
|
||||
.env
|
||||
.env.backup
|
||||
.phpunit.result.cache
|
||||
Homestead.json
|
||||
Homestead.yaml
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
public/robots.txt
|
||||
|
||||
|
||||
# OS generated files #
|
||||
######################
|
||||
.DS_Store
|
||||
.DS_Store?
|
||||
._*
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
Icon?
|
||||
ehthumbs.db
|
||||
Thumbs.db
|
||||
.directory
|
||||
|
||||
# Tool specific files #
|
||||
#######################
|
||||
# vim
|
||||
*~
|
||||
*.swp
|
||||
*.swo
|
||||
# sublime text & textmate
|
||||
*.sublime-*
|
||||
*.stTheme.cache
|
||||
*.tmlanguage.cache
|
||||
*.tmPreferences.cache
|
||||
# Eclipse
|
||||
.settings/*
|
||||
# JetBrains, aka PHPStorm, IntelliJ IDEA
|
||||
.idea/*
|
||||
# NetBeans
|
||||
nbproject/*
|
||||
# Visual Studio Code
|
||||
.vscode
|
||||
# Sass preprocessor
|
||||
.sass-cache/
|
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2022 Victor Westerlund
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
75
assets/js/script.mjs
Normal file
75
assets/js/script.mjs
Normal file
|
@ -0,0 +1,75 @@
|
|||
// Convert decimal Unix epoch to base64
|
||||
function epochToBase64() {
|
||||
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
||||
let time = Math.floor((Date.now() / 1000)).toString();
|
||||
let output = '';
|
||||
|
||||
// Encode as base64
|
||||
let i = 0;
|
||||
do {
|
||||
let chr1 = time.charCodeAt(i++);
|
||||
let chr2 = time.charCodeAt(i++);
|
||||
let chr3 = time.charCodeAt(i++);
|
||||
|
||||
let enc1 = chr1 >> 2;
|
||||
let enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
|
||||
let enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
|
||||
let enc4 = chr3 & 63;
|
||||
|
||||
if (isNaN(chr2))
|
||||
enc3 = enc4 = 64;
|
||||
else if (isNaN(chr3))
|
||||
enc4 = 64;
|
||||
|
||||
// Add chars to result
|
||||
output += alphabet.charAt(enc1)
|
||||
+ alphabet.charAt(enc2)
|
||||
+ alphabet.charAt(enc3)
|
||||
+ alphabet.charAt(enc4);
|
||||
|
||||
} while (i < time.length);
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
// Set output element value with base64 encoded Unix epoch
|
||||
function generateTempMail() {
|
||||
const target = document.getElementById("email");
|
||||
let domain = document.getElementById("domain");
|
||||
|
||||
// Default to victorwesterlund.com
|
||||
domain = domain.value ? domain.value : "victorwesterlund.com";
|
||||
|
||||
target.value = `${epochToBase64()}@${domain}`;
|
||||
}
|
||||
|
||||
// Bind new temp mail button
|
||||
document.getElementById("tempmail").addEventListener("submit", event => {
|
||||
event.preventDefault();
|
||||
generateTempMail();
|
||||
});
|
||||
|
||||
// Select all text on focus of output element
|
||||
document.getElementById("email").addEventListener("focus", event => event.target.select());
|
||||
|
||||
// Bind copy button
|
||||
document.getElementById("copy").addEventListener("click", event => {
|
||||
const target = document.getElementById("email");
|
||||
|
||||
// Focus output element if Clipboard API is unavailable
|
||||
if (navigator.hasOwnProperty("clipboard")) {
|
||||
return target.focus();
|
||||
}
|
||||
|
||||
// Attempt to copy to clipboard or focus output elemet if failed
|
||||
navigator.clipboard.writeText(target.value)
|
||||
.then(() => {
|
||||
const cache = event.target.innerText;
|
||||
event.target.innerText = "Copied!";
|
||||
|
||||
setTimeout(() => event.target.innerText = cache, 1500);
|
||||
})
|
||||
.catch(() => target.focus());
|
||||
});
|
||||
|
||||
generateTempMail();
|
32
index.html
Normal file
32
index.html
Normal file
|
@ -0,0 +1,32 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
|
||||
<style>body,html{height:100%;}</style>
|
||||
<title>Disposable E-Mail Generator</title>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container h-100">
|
||||
<div class="row h-100 justify-content-center align-items-center">
|
||||
<form class="col-12" id="tempmail">
|
||||
<div class="form-group mb-3">
|
||||
<label for="domain" class="form-label">Domain</label>
|
||||
<input type="text" class="form-control form-control-lg" id="domain" placeholder="victorwesterlund.com">
|
||||
</div>
|
||||
<div class="form-group mb-3">
|
||||
<label for="email" class="form-label">E-Mail</label>
|
||||
<input readonly type="text" class="form-control form-control-lg" id="email" placeholder="Generating..">
|
||||
</div>
|
||||
<div class="form-group mb-3 d-grid gap-3">
|
||||
<button type="button" class="btn btn-primary btn-lg" id="copy">Copy to Clipboard</button>
|
||||
<button type="submit" class="btn btn-outline-secondary btn-lg" id="generate">Generate New</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<script type="module" src="assets/js/script.mjs"></script>
|
||||
</body>
|
||||
</html>
|
Loading…
Add table
Reference in a new issue