cleanup and updated build
This commit is contained in:
parent
d79091faac
commit
9d2dc7b792
31
.github/workflows/build-docker.yml
vendored
31
.github/workflows/build-docker.yml
vendored
|
@ -21,6 +21,7 @@ jobs:
|
|||
id: prep
|
||||
run: |
|
||||
DOCKER_IMAGE="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}"
|
||||
DOCKER_IMAGE_HUB="docker.io/${{ env.IMAGE_NAME }}"
|
||||
VERSION=latest
|
||||
SHORTREF=${GITHUB_SHA::8}
|
||||
|
||||
|
@ -29,18 +30,23 @@ jobs:
|
|||
VERSION=${GITHUB_REF#refs/tags/v}
|
||||
fi
|
||||
TAGS="${DOCKER_IMAGE}:${VERSION},${DOCKER_IMAGE}:${SHORTREF}"
|
||||
TAGS_HUB="${DOCKER_IMAGE_HUB}:${VERSION},${DOCKER_IMAGE_HUB}:${SHORTREF}"
|
||||
|
||||
# If the VERSION looks like a version number, assume that
|
||||
# this is the most recent version of the image and also
|
||||
# tag it 'latest'.
|
||||
if [[ $VERSION =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
|
||||
TAGS="$TAGS,${DOCKER_IMAGE}:latest"
|
||||
TAGS_HUB="$TAGS_HUB,${DOCKER_IMAGE_HUB}:latest"
|
||||
fi
|
||||
|
||||
# Set output parameters.
|
||||
echo ::set-output name=tags::${TAGS}
|
||||
echo ::set-output name=docker_image::${DOCKER_IMAGE}
|
||||
|
||||
echo ::set-output name=tags_hub::${TAGS_HUB}
|
||||
echo ::set-output name=docker_image_hub::${DOCKER_IMAGE_HUB}
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@master
|
||||
with:
|
||||
|
@ -50,14 +56,21 @@ jobs:
|
|||
id: buildx
|
||||
uses: docker/setup-buildx-action@master
|
||||
|
||||
- name: Log in to the Container registry
|
||||
- name: Log in to Github Packages
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: docker.io
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: Build and push to GHCR
|
||||
uses: docker/build-push-action@v2
|
||||
with:
|
||||
builder: ${{ steps.buildx.outputs.name }}
|
||||
|
@ -65,4 +78,14 @@ jobs:
|
|||
file: docker/Dockerfile
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ steps.prep.outputs.tags }}
|
||||
tags: ${{ steps.prep.outputs.tags }}
|
||||
|
||||
- name: Build and push to Docker Hub
|
||||
uses: docker/build-push-action@v2
|
||||
with:
|
||||
builder: ${{ steps.buildx.outputs.name }}
|
||||
context: .
|
||||
file: docker/Dockerfile
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ steps.prep.outputs.tags_hub }}
|
157
web/api.php
157
web/api.php
|
@ -1,157 +0,0 @@
|
|||
<?php
|
||||
define('DS', DIRECTORY_SEPARATOR);
|
||||
define('ROOT', dirname(__FILE__));
|
||||
|
||||
error_reporting(E_ALL || ~E_NOTICE);
|
||||
ini_set('display_errors', 1);
|
||||
|
||||
include_once(ROOT.DS.'inc'.DS.'core.php');
|
||||
|
||||
if (PHP_SAPI === 'cli-server')
|
||||
$_SERVER['SCRIPT_NAME'] = pathinfo(__FILE__, PATHINFO_BASENAME);
|
||||
|
||||
if($_GET['url'])
|
||||
$url = explode('/',ltrim(parse_url($_GET['url'], PHP_URL_PATH),'/'));
|
||||
else $url = array_filter(explode('/',ltrim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH),'/')));
|
||||
|
||||
$action = strtolower($_REQUEST['a']);
|
||||
$email = strtolower($_REQUEST['email']);
|
||||
// quick hack to get admin email working.
|
||||
// by the time $email is checked its been over written.
|
||||
// store a copy in $admincheck to compare later.
|
||||
$admincheck = $email;
|
||||
|
||||
if(!empty($email)){
|
||||
if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
|
||||
// email param provided, but invalid: skip action and show invalid email error
|
||||
$o = array('status'=>'err','reason'=>'Invalid Email address');
|
||||
unset($action);
|
||||
}
|
||||
$dir = getDirForEmail($email);
|
||||
$email = basename($dir);
|
||||
}
|
||||
|
||||
switch($action)
|
||||
{
|
||||
case 'del':
|
||||
$id = intval($_REQUEST['mid']);
|
||||
if(!is_dir($dir))
|
||||
$o = array('status'=>'err','reason'=>'No emails received on this address');
|
||||
else if(!is_numeric($id) || !emailIDExists($email,$id))
|
||||
$o = array('status'=>'err','reason'=>'Invalid Email ID');
|
||||
else
|
||||
{
|
||||
|
||||
if(deleteEmail($email,$id))
|
||||
$o = array('status'=>'ok');
|
||||
else
|
||||
$o = array('status'=>'err','reason'=>'Could not delete email. Permission problem?');
|
||||
}
|
||||
break;
|
||||
case 'getdoms':
|
||||
$settings = loadSettings();
|
||||
if($settings['DOMAINS'])
|
||||
$o = explode(',',$settings['DOMAINS']);
|
||||
else $o = [];
|
||||
break;
|
||||
case 'attachment':
|
||||
$id = intval($_REQUEST['id']);
|
||||
$filename = basename($_REQUEST['filename']);
|
||||
$filepath = $dir.DS.'attachments'.DS.$id.'-'.$filename;
|
||||
if(!is_dir($dir))
|
||||
$o = array('status'=>'err','reason'=>'No emails received on this address');
|
||||
else if(!is_numeric($id) || !emailIDExists($email,$id))
|
||||
$o = array('status'=>'err','reason'=>'Invalid Email ID');
|
||||
else if(!file_exists($filepath))
|
||||
$o = array('status'=>'err','reason'=>'File not found');
|
||||
else
|
||||
{
|
||||
header('Content-Type: '.mime_content_type($filepath));
|
||||
readfile($filepath);
|
||||
exit();
|
||||
}
|
||||
break;
|
||||
|
||||
case 'load':
|
||||
$id = intval($_REQUEST['id']);
|
||||
if(empty($email))
|
||||
$o = array('status'=>'err','reason'=>'No email address provided');
|
||||
else if(!is_dir($dir))
|
||||
$o = array('status'=>'err','reason'=>'No emails received on this address');
|
||||
else if(!is_numeric($id) || !emailIDExists($email,$id))
|
||||
$o = array('status'=>'err','reason'=>'Invalid Email ID');
|
||||
else
|
||||
{
|
||||
$data = getEmail($email,$id);
|
||||
if($_REQUEST['raw']=='true')
|
||||
{
|
||||
header('Content-Type: text/plain');
|
||||
exit($data['raw']);
|
||||
}
|
||||
$o = array('status'=>'ok','data'=>$data);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'list':
|
||||
$settings = loadSettings();
|
||||
/*
|
||||
|
||||
if($settings['ADMIN'] && $settings['ADMIN']==$admincheck)
|
||||
{
|
||||
$o['status'] = 'ok';
|
||||
$o['type'] = 'admin';
|
||||
$o['dateformat'] = $settings['DATEFORMAT'];
|
||||
$emails = listEmailAdresses();
|
||||
$emaillist = array();
|
||||
|
||||
if(count($emails)>0)
|
||||
{
|
||||
foreach($emails as $email)
|
||||
{
|
||||
$emaildata = getEmailsOfEmail($email);
|
||||
foreach($emaildata as $time=>$d)
|
||||
$emaillist[$time.'-'.$email]=$d;
|
||||
}
|
||||
if(is_array($emaillist))
|
||||
krsort($emaillist);
|
||||
$data = (count($emaillist)?$emaillist:array());
|
||||
}
|
||||
|
||||
$o['emails']=$data;
|
||||
}
|
||||
else */
|
||||
|
||||
if(!is_dir($dir) && $settings['ADMIN']!=$admincheck)
|
||||
$o = array('status'=>'ok','emails'=>[]);
|
||||
else
|
||||
{
|
||||
if(!$email) $email = $admincheck;
|
||||
$data = getEmailsOfEmail($email);
|
||||
$lastid = $_REQUEST['lastid'];
|
||||
if($lastid && is_numeric($lastid))
|
||||
{
|
||||
foreach($data as $time=>$d)
|
||||
{
|
||||
if($time>$lastid)
|
||||
$emails[$time]=$d;
|
||||
}
|
||||
$data = (is_array($emails)?$emails:array());
|
||||
}
|
||||
|
||||
$o = array('status'=>'ok','emails'=>$data);
|
||||
}
|
||||
break;
|
||||
case 'show-list':
|
||||
$settings = loadSettings();
|
||||
$o = $settings['SHOW_ACCOUNT_LIST'];
|
||||
break;
|
||||
case 'list-addresses':
|
||||
$settings = loadSettings();
|
||||
$o = array('status'=>'ok','addresses'=>[]);
|
||||
|
||||
if ($settings['SHOW_ACCOUNT_LIST'])
|
||||
$o['addresses'] = listEmailAdresses();
|
||||
break;
|
||||
}
|
||||
|
||||
echo json_encode($o);
|
|
@ -22,6 +22,10 @@ tr.htmx-swapping td {
|
|||
display:none;
|
||||
}
|
||||
|
||||
.text-center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
||||
/* pico css overrides */
|
||||
|
||||
|
|
|
@ -18,6 +18,9 @@ if($_SERVER['HTTP_HX_REQUEST']!='true')
|
|||
'settings'=>loadSettings(),
|
||||
]));
|
||||
}
|
||||
else if(count($url)==1 && $url[0] == 'api') {
|
||||
exit($backend->renderTemplate('intro.html'));
|
||||
}
|
||||
|
||||
|
||||
$answer = $backend->run();
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,48 +0,0 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Required meta tags -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<link rel="shortcut icon" href="favicon.ico">
|
||||
|
||||
|
||||
<!-- Bootstrap CSS -->
|
||||
<link rel="stylesheet" href="css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="css/opentrashmail.css">
|
||||
<link rel="stylesheet" href="css/fontawesome.min.css">
|
||||
|
||||
<title>Open Trashmail</title>
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
|
||||
<a class="navbar-brand" href="?"><img src="imgs/logo_300_light.png" width="50px" /> Open Trashmail </a>
|
||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navi" aria-controls="navi" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse" id="navi">
|
||||
<form class="form-inline my-2 my-lg-0">
|
||||
<input class="form-control mr-sm-2" id="email" type="email" placeholder="email address" aria-label="email address">
|
||||
<button onClick="accessAccount()" class="btn btn-secondary my-2 my-sm-0"><i class="fas fa-arrow-left"></i><i class="fas fa-envelope"></i> Access account</button>
|
||||
<button onClick="generateAccount()" id="btn-gen-random" class="btn btn-secondary my-2 my-sm-0"><i class="fas fa-random"></i> Generate random</button>
|
||||
<button onClick="listAddresses(event)" id="btn-list-addresses" class="btn btn-secondary my-2 my-sm-0" style="display:none;"><i class="fas fa-list"></i> List accounts</button>
|
||||
</form>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main role="main" class="container" id="main">
|
||||
<div class="starter-template">
|
||||
<h1>Welcome to Open Trashmail</h1>
|
||||
<p class="lead">Access an email address or generate a new one.</p>
|
||||
</div>
|
||||
|
||||
</main><!-- /.container -->
|
||||
|
||||
<script src="js/jquery-3.4.1.min.js"></script>
|
||||
<script src="js/namegenerator.js"></script>
|
||||
<script src="js/opentrashmail.js"></script>
|
||||
<script src="js/bootstrap.bundle.min.js"></script>
|
||||
<script src="js/moment-with-locales.min.js"></script>
|
||||
</body>
|
||||
</html>
|
101
web/rss.php
101
web/rss.php
|
@ -1,101 +0,0 @@
|
|||
<?php
|
||||
define('DS', DIRECTORY_SEPARATOR);
|
||||
define('ROOT', dirname(__FILE__));
|
||||
define('DOMAIN', $_SERVER['HTTP_HOST']);
|
||||
|
||||
error_reporting(E_ALL || ~E_NOTICE);
|
||||
ini_set('display_errors', 1);
|
||||
|
||||
include_once(ROOT . DS . 'inc' . DS . 'core.php');
|
||||
|
||||
header("Content-Type: application/rss+xml; charset=UTF8");
|
||||
|
||||
if (PHP_SAPI === 'cli-server')
|
||||
$_SERVER['SCRIPT_NAME'] = pathinfo(__FILE__, PATHINFO_BASENAME);
|
||||
|
||||
if ($_GET['url'])
|
||||
$url = explode('/', ltrim(parse_url($_GET['url'], PHP_URL_PATH), '/'));
|
||||
else $url = array_filter(explode('/', ltrim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/')));
|
||||
|
||||
array_shift($url);
|
||||
|
||||
$email = $url[0];
|
||||
if (!$email) {
|
||||
http_response_code(404);
|
||||
exit('Error: Email not found');
|
||||
}
|
||||
|
||||
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) exit();
|
||||
|
||||
$rss = '<?xml version="1.0" ?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<atom:link href="https://' . DOMAIN . '/rss.php" rel="self" type="application/rss+xml" />
|
||||
<title>RSS for ' . $email . '</title>
|
||||
<link>https://' . DOMAIN . '/#' . $email . '</link>
|
||||
<description>RSS Feed for email address ' . $email . '</description>
|
||||
<lastBuildDate>' . date(DateTime::RFC2822, time()) . '</lastBuildDate>
|
||||
<image>
|
||||
<title>RSS for ' . $email . '</title>
|
||||
<url>https://raw.githubusercontent.com/HaschekSolutions/opentrashmail/master/web/imgs/logo_300.png</url>
|
||||
<link>https://github.com/HaschekSolutions/opentrashmail</link>
|
||||
</image>';
|
||||
|
||||
$emaildata = getEmailsOfEmail($email);
|
||||
foreach ($emaildata as $id => $d) {
|
||||
$data = getEmail($email, $id);
|
||||
//var_dump($data);
|
||||
$time = substr($id, 0, -3);
|
||||
$date = date("Y-m-d H:i", $time);
|
||||
$att_text = array();
|
||||
$encl = array();
|
||||
if (is_array($data['parsed']['attachments']))
|
||||
foreach ($data['parsed']['attachments'] as $filename) {
|
||||
$filepath = ROOT . DS . '..' . DS . 'data' . DS . $email . DS . 'attachments' . DS . $filename;
|
||||
$parts = explode('-', $filename);
|
||||
$fid = $parts[0];
|
||||
$fn = $parts[1];
|
||||
$url = 'https://' . DOMAIN . '/api.php?a=attachment&email=' . $email . '&id=' . $fid . '&filename=' . $fn;
|
||||
//$encl[] = '<enclosure url="'.rawurlencode($url).'" length="'.filesize($filepath).'" type="'.mime_content_type($filepath).'" />';
|
||||
$att_text[] = "<a href='$url' target='_blank'>$fn</a>";
|
||||
}
|
||||
$rss .= '
|
||||
<item>
|
||||
<title><![CDATA[' . $data['parsed']['subject'] . ']]></title>
|
||||
<pubDate>' . date(DateTime::RFC2822, $time) . '</pubDate>
|
||||
<link>https://' . DOMAIN . '/#' . $email . '</link>
|
||||
<guid>https://' . DOMAIN . '/api.php?a=load&email=' . $email . '&id=' . $id . '&raw=true</guid>
|
||||
<description>
|
||||
<![CDATA[
|
||||
Email from: ' . htmlentities($data['from']) . '<br/>
|
||||
Email to: ' . (is_array($data['rcpts']) ? htmlentities(implode(',', $data['rcpts'])) : htmlentities($email)) . '<br/>
|
||||
' . ((count($att_text) > 0) ? 'Attachments:<br/>' . array2ul($att_text) . '<br/>' : '') . '
|
||||
<a href="https://' . DOMAIN . '/api.php?a=load&email=' . $email . '&id=' . $id . '&raw=true">View raw email</a> <br/>
|
||||
<br/>---------<br/><br/>
|
||||
' . ($data['parsed']['htmlbody'] ? $data['parsed']['htmlbody'] : nl2br(htmlentities($data['parsed']['body']))) . '
|
||||
]]>
|
||||
</description>
|
||||
' ./*((count($encl)>0)?implode('<br/>',$encl):'').*/ '
|
||||
</item>';
|
||||
|
||||
//if (++$i > 5) break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
$rss .= '</channel>
|
||||
</rss> ';
|
||||
|
||||
echo $rss;
|
||||
|
||||
|
||||
function array2ul($array)
|
||||
{
|
||||
$out = "<ul>";
|
||||
foreach ($array as $key => $elem) {
|
||||
$out .= "<li>$elem</li>";
|
||||
}
|
||||
$out .= "</ul>";
|
||||
return $out;
|
||||
}
|
6
web/templates/intro.html
Normal file
6
web/templates/intro.html
Normal file
|
@ -0,0 +1,6 @@
|
|||
<div class="text-center">
|
||||
<img src="/imgs/logo_300_roundbg.png" alt="OpenTrashmail Logo">
|
||||
<h1>Welcome to OpenTrashmail</h1>
|
||||
<p><a href="https://github.com/HaschekSolutions/opentrashmail" target="_blank" role="button" class="secondary"><i class="fab fa-github"></i> View on Github</a></p>
|
||||
<p>OpenTrashmail is an open source, selfhostable, disposable email service that helps you protect your privacy online. With OpenTrashmail, you can create your own trashmail addresses using your own domain, subdomain or wildcard domain</p>
|
||||
</div>
|
Loading…
Reference in a new issue