Further clarify e-mail policy
This commit is contained in:
@@ -10,7 +10,10 @@ will be removed when reported.
|
||||
* **Copyright violation**: Works which are shared without permission from the
|
||||
copyright holder. For copyright reports we need a formal DMCA takedown request
|
||||
originating from the copyright holder or a representative. See the chapter
|
||||
[E-Mail reporting rules](#toc_2) below.
|
||||
[E-Mail reporting rules](#toc_2) below. When sending a copyright infringement
|
||||
notice to our abuse address, please state clearly that it is a copyright
|
||||
infringement notice so that we can properly detect the type of report. Using
|
||||
words like 'theft' or 'stolen' won't work because piracy is not theft.
|
||||
* **Porn**: Pornographic material is not strictly banned on pixeldrain. But in
|
||||
order to comply with international regulations I have to prevent it from
|
||||
spreading too far. For this reason pornographic videos and images can be
|
||||
@@ -67,11 +70,13 @@ receive:
|
||||
[Message-ID](https://en.wikipedia.org/wiki/Message-ID) header. The Message-ID
|
||||
is used to reference messages in our system, mails without a Message-ID are
|
||||
not processed.
|
||||
* The e-mail must include either a valid [DKIM
|
||||
signature](https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail) or a [SPF
|
||||
header](https://en.wikipedia.org/wiki/Sender_Policy_Framework). Since the
|
||||
sender address is used as a verification method we must use these methods to
|
||||
combat message spoofing.
|
||||
* The abuse system uses e-mail addresses for authenctication so we need to be
|
||||
wary of [message spoofing](https://en.wikipedia.org/wiki/Email_spoofing). To
|
||||
combat this we require both
|
||||
[DKIM](https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail) and
|
||||
[SPF](https://en.wikipedia.org/wiki/Sender_Policy_Framework) validation before
|
||||
we can accept e-mails. If either of these checks fail we assume the message
|
||||
was spoofed and it goes straight to the spambox.
|
||||
* Only send abuse reports to
|
||||
[abuse@pixeldrain.com](mailto:abuse@pixeldrain.com). Messages sent to any
|
||||
other e-mail address are ignored.
|
||||
|
@@ -15,7 +15,6 @@ let block_form = {
|
||||
label: "Type",
|
||||
type: "radio",
|
||||
radio_values: [
|
||||
"unknown",
|
||||
"copyright",
|
||||
"porn",
|
||||
"child_abuse",
|
||||
|
@@ -157,37 +157,33 @@ onMount(get_reporters);
|
||||
{/if}
|
||||
</section>
|
||||
|
||||
<br/>
|
||||
|
||||
<div class="table_scroll">
|
||||
<h2>Pending reporters</h2>
|
||||
<EmailReportersTable
|
||||
reporters={reporters_pending}
|
||||
on:edit={e => edit_reporter(e.detail)}
|
||||
on:approve={e => approve_reporter(e.detail)}
|
||||
on:spam={e => spam_reporter(e.detail)}
|
||||
on:delete={e => delete_reporter(e.detail)}>
|
||||
</EmailReportersTable>
|
||||
<h2>Pending reporters</h2>
|
||||
<EmailReportersTable
|
||||
reporters={reporters_pending}
|
||||
on:edit={e => edit_reporter(e.detail)}
|
||||
on:approve={e => approve_reporter(e.detail)}
|
||||
on:spam={e => spam_reporter(e.detail)}
|
||||
on:delete={e => delete_reporter(e.detail)}>
|
||||
</EmailReportersTable>
|
||||
|
||||
|
||||
<h2>Trusted reporters</h2>
|
||||
<EmailReportersTable
|
||||
reporters={reporters_trusted}
|
||||
on:edit={e => edit_reporter(e.detail)}
|
||||
on:approve={e => approve_reporter(e.detail)}
|
||||
on:spam={e => spam_reporter(e.detail)}
|
||||
on:delete={e => delete_reporter(e.detail)}>
|
||||
</EmailReportersTable>
|
||||
<h2>Trusted reporters</h2>
|
||||
<EmailReportersTable
|
||||
reporters={reporters_trusted}
|
||||
on:edit={e => edit_reporter(e.detail)}
|
||||
on:approve={e => approve_reporter(e.detail)}
|
||||
on:spam={e => spam_reporter(e.detail)}
|
||||
on:delete={e => delete_reporter(e.detail)}>
|
||||
</EmailReportersTable>
|
||||
|
||||
<h2>Rejected reporters</h2>
|
||||
<EmailReportersTable
|
||||
reporters={reporters_rejected}
|
||||
on:edit={e => edit_reporter(e.detail)}
|
||||
on:approve={e => approve_reporter(e.detail)}
|
||||
on:spam={e => spam_reporter(e.detail)}
|
||||
on:delete={e => delete_reporter(e.detail)}>
|
||||
</EmailReportersTable>
|
||||
</div>
|
||||
<h2>Rejected reporters</h2>
|
||||
<EmailReportersTable
|
||||
reporters={reporters_rejected}
|
||||
on:edit={e => edit_reporter(e.detail)}
|
||||
on:approve={e => approve_reporter(e.detail)}
|
||||
on:spam={e => spam_reporter(e.detail)}
|
||||
on:delete={e => delete_reporter(e.detail)}>
|
||||
</EmailReportersTable>
|
||||
<br/>
|
||||
|
||||
<style>
|
||||
@@ -198,7 +194,4 @@ onMount(get_reporters);
|
||||
}
|
||||
.toolbar > * { flex: 0 0 auto; }
|
||||
.toolbar_spacer { flex: 1 1 auto; }
|
||||
.table_scroll {
|
||||
text-align: left;
|
||||
}
|
||||
</style>
|
||||
|
@@ -52,48 +52,50 @@ const toggle_preview = (rep) => {
|
||||
}
|
||||
</script>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td><SortButton field="from_address" active_field={sort_field} asc={asc} sort_func={sort}>Address</SortButton></td>
|
||||
<td><SortButton field="name" active_field={sort_field} asc={asc} sort_func={sort}>Name</SortButton></td>
|
||||
<td><SortButton field="reports_sent" active_field={sort_field} asc={asc} sort_func={sort}>Reports</SortButton></td>
|
||||
<td><SortButton field="files_blocked" active_field={sort_field} asc={asc} sort_func={sort}>Blocked</SortButton></td>
|
||||
<td><SortButton field="last_used" active_field={sort_field} asc={asc} sort_func={sort}>Last used</SortButton></td>
|
||||
<td><SortButton field="created" active_field={sort_field} asc={asc} sort_func={sort}>Created</SortButton></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
{#each reporters as rep (rep.from_address)}
|
||||
<tr animate:flip={{duration: 500}}>
|
||||
<td>{rep.from_address}</td>
|
||||
<td>{rep.name}</td>
|
||||
<td>{rep.reports_sent}</td>
|
||||
<td>{rep.files_blocked}</td>
|
||||
<td>{formatDate(rep.last_used, true, true, false)}</td>
|
||||
<td>{formatDate(rep.created, false, false, false)}</td>
|
||||
<td>
|
||||
<button on:click|preventDefault={() => toggle_preview(rep)} class="button round">
|
||||
<i class="icon">visibility</i>
|
||||
</button>
|
||||
<button on:click|preventDefault={() => {dispatch("edit", rep)}} class="button round">
|
||||
<i class="icon">edit</i>
|
||||
</button>
|
||||
{#if rep.status !== "trusted"}
|
||||
<button on:click|preventDefault={() => {dispatch("approve", rep)}} class="button button_highlight round">
|
||||
<i class="icon">check</i>
|
||||
</button>
|
||||
{/if}
|
||||
{#if rep.status !== "rejected"}
|
||||
<button on:click|preventDefault={() => {dispatch("spam", rep)}} class="button button_red round">
|
||||
<i class="icon">block</i>
|
||||
</button>
|
||||
{/if}
|
||||
<button on:click|preventDefault={() => {dispatch("delete", rep)}} class="button button_red round">
|
||||
<i class="icon">delete</i>
|
||||
</button>
|
||||
</td>
|
||||
<div class="table_scroll">
|
||||
<table>
|
||||
<tr>
|
||||
<td><SortButton field="from_address" active_field={sort_field} asc={asc} sort_func={sort}>Address</SortButton></td>
|
||||
<td><SortButton field="name" active_field={sort_field} asc={asc} sort_func={sort}>Name</SortButton></td>
|
||||
<td><SortButton field="reports_sent" active_field={sort_field} asc={asc} sort_func={sort}>Reports</SortButton></td>
|
||||
<td><SortButton field="files_blocked" active_field={sort_field} asc={asc} sort_func={sort}>Blocked</SortButton></td>
|
||||
<td><SortButton field="last_used" active_field={sort_field} asc={asc} sort_func={sort}>Last used</SortButton></td>
|
||||
<td><SortButton field="created" active_field={sort_field} asc={asc} sort_func={sort}>Created</SortButton></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
{/each}
|
||||
</table>
|
||||
{#each reporters as rep (rep.from_address)}
|
||||
<tr animate:flip={{duration: 500}}>
|
||||
<td>{rep.from_address}</td>
|
||||
<td>{rep.name}</td>
|
||||
<td>{rep.reports_sent}</td>
|
||||
<td>{rep.files_blocked}</td>
|
||||
<td>{formatDate(rep.last_used, true, true, false)}</td>
|
||||
<td>{formatDate(rep.created, false, false, false)}</td>
|
||||
<td>
|
||||
<button on:click|preventDefault={() => toggle_preview(rep)} class="button round">
|
||||
<i class="icon">email</i>
|
||||
</button>
|
||||
<button on:click|preventDefault={() => {dispatch("edit", rep)}} class="button round">
|
||||
<i class="icon">edit</i>
|
||||
</button>
|
||||
{#if rep.status !== "trusted"}
|
||||
<button on:click|preventDefault={() => {dispatch("approve", rep)}} class="button button_highlight round">
|
||||
<i class="icon">check</i>
|
||||
</button>
|
||||
{/if}
|
||||
{#if rep.status !== "rejected"}
|
||||
<button on:click|preventDefault={() => {dispatch("spam", rep)}} class="button button_red round">
|
||||
<i class="icon">block</i>
|
||||
</button>
|
||||
{/if}
|
||||
<button on:click|preventDefault={() => {dispatch("delete", rep)}} class="button button_red round">
|
||||
<i class="icon">delete</i>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
{/each}
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<Modal bind:this={modal} title={preview_subject} width="1000px">
|
||||
{#if preview_html !== ""}
|
||||
@@ -104,6 +106,9 @@ const toggle_preview = (rep) => {
|
||||
</Modal>
|
||||
|
||||
<style>
|
||||
.table_scroll {
|
||||
text-align: initial;
|
||||
}
|
||||
.message_html {
|
||||
padding: 8px;
|
||||
text-align: initial;
|
||||
|
@@ -4,6 +4,18 @@ import { formatDate } from "../util/Formatting.svelte";
|
||||
import Expandable from "../util/Expandable.svelte";
|
||||
import LoadingIndicator from "../util/LoadingIndicator.svelte";
|
||||
|
||||
const abuse_types = [
|
||||
"copyright",
|
||||
"child_abuse",
|
||||
"terrorism",
|
||||
"gore",
|
||||
"zoophilia",
|
||||
"malware",
|
||||
"doxing",
|
||||
"revenge_porn",
|
||||
"porn",
|
||||
]
|
||||
|
||||
let loading = true
|
||||
let rows = []
|
||||
let total_offences = 0
|
||||
@@ -11,7 +23,7 @@ let total_offences = 0
|
||||
let expanded = false
|
||||
let creating = false
|
||||
let new_ban_address
|
||||
let new_ban_reason = "unknown"
|
||||
let new_ban_reason = abuse_types[0]
|
||||
|
||||
const get_bans = async () => {
|
||||
loading = true;
|
||||
@@ -114,23 +126,11 @@ onMount(get_bans);
|
||||
<input id="field_address" type="text" bind:this={new_ban_address}/>
|
||||
<label for="field_reason">Reason</label>
|
||||
<div id="field_reason">
|
||||
<input id="reason_unknown" name="reporter_type" type="radio" bind:group={new_ban_reason} value="unknown" />
|
||||
<label for="reason_unknown">unknown</label>
|
||||
<br/>
|
||||
<input id="reason_copyright" name="reporter_type" type="radio" bind:group={new_ban_reason} value="copyright" />
|
||||
<label for="reason_copyright">copyright</label>
|
||||
<br/>
|
||||
<input id="reason_child_abuse" name="reporter_type" type="radio" bind:group={new_ban_reason} value="child_abuse" />
|
||||
<label for="reason_child_abuse">child_abuse</label>
|
||||
<br/>
|
||||
<input id="reason_terrorism" name="reporter_type" type="radio" bind:group={new_ban_reason} value="terorrism" />
|
||||
<label for="reason_terrorism">terrorism</label>
|
||||
<br/>
|
||||
<input id="reason_gore" name="reporter_type" type="radio" bind:group={new_ban_reason} value="gore" />
|
||||
<label for="reason_gore">gore</label>
|
||||
<br/>
|
||||
<input id="reason_malware" name="reporter_type" type="radio" bind:group={new_ban_reason} value="malware" />
|
||||
<label for="reason_malware">malware</label>
|
||||
{#each abuse_types as t (t)}
|
||||
<input id="reason_{t}" name="reporter_type" type="radio" bind:group={new_ban_reason} value="{t}" />
|
||||
<label for="reason_{t}">{t}</label>
|
||||
<br/>
|
||||
{/each}
|
||||
</div>
|
||||
<button class="button_highlight" type="submit" style="float: right;">
|
||||
<i class="icon">save</i> Save
|
||||
|
Reference in New Issue
Block a user