cleanup and updated build

This commit is contained in:
Chris 2023-11-11 17:01:07 +01:00
parent d79091faac
commit 9d2dc7b792
8 changed files with 40 additions and 7770 deletions

View file

@ -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 }}

View file

@ -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);

View file

@ -22,6 +22,10 @@ tr.htmx-swapping td {
display:none;
}
.text-center {
text-align: center;
}
/* pico css overrides */

View file

@ -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

View file

@ -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> &nbsp;
<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> &nbsp;
<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>

View file

@ -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
View 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>