4.37.0
All checks were successful
continuous-integration/drone/tag Build is passing

This commit is contained in:
MrMeeb 2024-01-18 12:00:07 +00:00
parent aeb34f8582
commit b3ee67213d
32 changed files with 182 additions and 370420 deletions

View File

@ -74,7 +74,7 @@ Setting up DKIM is highly recommended to reduce the chance your emails ending up
First you need to generate a private and public key for DKIM: First you need to generate a private and public key for DKIM:
```bash ```bash
openssl genrsa -out dkim.key 1024 openssl genrsa -out dkim.key -traditional 1024
openssl rsa -in dkim.key -pubout -out dkim.pub.key openssl rsa -in dkim.key -pubout -out dkim.pub.key
``` ```
@ -515,6 +515,8 @@ server {
} }
``` ```
Note: If `/etc/nginx/sites-enabled/default` exists, delete it or certbot will fail due to the conflict. The `simplelogin` file should be the only file in `sites-enabled`.
Reload Nginx with the command below Reload Nginx with the command below
```bash ```bash

View File

@ -32,6 +32,7 @@ def user_to_dict(user: User) -> dict:
"in_trial": user.in_trial(), "in_trial": user.in_trial(),
"max_alias_free_plan": user.max_alias_for_free_account(), "max_alias_free_plan": user.max_alias_for_free_account(),
"connected_proton_address": None, "connected_proton_address": None,
"can_create_reverse_alias": user.can_create_contacts(),
} }
if config.CONNECT_WITH_PROTON: if config.CONNECT_WITH_PROTON:
@ -58,6 +59,7 @@ def user_info():
- in_trial - in_trial
- max_alias_free - max_alias_free
- is_connected_with_proton - is_connected_with_proton
- can_create_reverse_alias
""" """
user = g.user user = g.user

View File

@ -489,7 +489,9 @@ def setup_nameservers():
NAMESERVERS = setup_nameservers() NAMESERVERS = setup_nameservers()
DISABLE_CREATE_CONTACTS_FOR_FREE_USERS = False DISABLE_CREATE_CONTACTS_FOR_FREE_USERS = os.environ.get(
"DISABLE_CREATE_CONTACTS_FOR_FREE_USERS", False
)
PARTNER_API_TOKEN_SECRET = os.environ.get("PARTNER_API_TOKEN_SECRET") or ( PARTNER_API_TOKEN_SECRET = os.environ.get("PARTNER_API_TOKEN_SECRET") or (
FLASK_SECRET + "partnerapitoken" FLASK_SECRET + "partnerapitoken"
) )

View File

@ -51,14 +51,6 @@ def email_validator():
return _check return _check
def user_can_create_contacts(user: User) -> bool:
if user.is_premium():
return True
if user.flags & User.FLAG_FREE_DISABLE_CREATE_ALIAS == 0:
return True
return not config.DISABLE_CREATE_CONTACTS_FOR_FREE_USERS
def create_contact(user: User, alias: Alias, contact_address: str) -> Contact: def create_contact(user: User, alias: Alias, contact_address: str) -> Contact:
""" """
Create a contact for a user. Can be restricted for new free users by enabling DISABLE_CREATE_CONTACTS_FOR_FREE_USERS. Create a contact for a user. Can be restricted for new free users by enabling DISABLE_CREATE_CONTACTS_FOR_FREE_USERS.
@ -82,7 +74,7 @@ def create_contact(user: User, alias: Alias, contact_address: str) -> Contact:
if contact: if contact:
raise ErrContactAlreadyExists(contact) raise ErrContactAlreadyExists(contact)
if not user_can_create_contacts(user): if not user.can_create_contacts():
raise ErrContactErrorUpgradeNeeded() raise ErrContactErrorUpgradeNeeded()
contact = Contact.create( contact = Contact.create(
@ -327,6 +319,6 @@ def alias_contact_manager(alias_id):
last_page=last_page, last_page=last_page,
query=query, query=query,
nb_contact=nb_contact, nb_contact=nb_contact,
can_create_contacts=user_can_create_contacts(current_user), can_create_contacts=current_user.can_create_contacts(),
csrf_form=csrf_form, csrf_form=csrf_form,
) )

View File

@ -52,13 +52,13 @@ def get_stats(user: User) -> Stats:
@dashboard_bp.route("/", methods=["GET", "POST"]) @dashboard_bp.route("/", methods=["GET", "POST"])
@login_required
@limiter.limit( @limiter.limit(
ALIAS_LIMIT, ALIAS_LIMIT,
methods=["POST"], methods=["POST"],
exempt_when=lambda: request.form.get("form-name") != "create-random-email", exempt_when=lambda: request.form.get("form-name") != "create-random-email",
) )
@limiter.limit("10/minute", methods=["GET"], key_func=lambda: current_user.id) @limiter.limit("10/minute", methods=["GET"], key_func=lambda: current_user.id)
@login_required
@parallel_limiter.lock( @parallel_limiter.lock(
name="alias_creation", name="alias_creation",
only_when=lambda: request.form.get("form-name") == "create-random-email", only_when=lambda: request.form.get("form-name") == "create-random-email",

View File

@ -1113,6 +1113,13 @@ class User(Base, ModelMixin, UserMixin, PasswordOracle):
return random_words(1) return random_words(1)
def can_create_contacts(self) -> bool:
if self.is_premium():
return True
if self.flags & User.FLAG_FREE_DISABLE_CREATE_ALIAS == 0:
return True
return not config.DISABLE_CREATE_CONTACTS_FOR_FREE_USERS
def __repr__(self): def __repr__(self):
return f"<User {self.id} {self.name} {self.email}>" return f"<User {self.id} {self.name} {self.email}>"
@ -1506,6 +1513,7 @@ class Alias(Base, ModelMixin):
def mailboxes(self): def mailboxes(self):
ret = [self.mailbox] ret = [self.mailbox]
for m in self._mailboxes: for m in self._mailboxes:
if m.id is not self.mailbox.id:
ret.append(m) ret.append(m)
ret = [mb for mb in ret if mb.verified] ret = [mb for mb in ret if mb.verified]

View File

@ -388,7 +388,7 @@ Input:
- (Optional but recommended) `hostname` passed in query string - (Optional but recommended) `hostname` passed in query string
- Request Message Body in json (`Content-Type` is `application/json`) - Request Message Body in json (`Content-Type` is `application/json`)
- alias_prefix: string. The first part of the alias that user can choose. - alias_prefix: string. The first part of the alias that user can choose.
- signed_suffix: should be one of the suffixes returned in the `GET /api/v4/alias/options` endpoint. - signed_suffix: should be one of the suffixes returned in the `GET /api/v5/alias/options` endpoint.
- mailbox_ids: list of mailbox_id that "owns" this alias - mailbox_ids: list of mailbox_id that "owns" this alias
- (Optional) note: alias note - (Optional) note: alias note
- (Optional) name: alias name - (Optional) name: alias name

View File

@ -192,7 +192,6 @@ amigos
amines amines
amnion amnion
amoeba amoeba
amoral
amount amount
amours amours
ampere ampere
@ -215,7 +214,6 @@ animus
anions anions
ankles ankles
anklet anklet
annals
anneal anneal
annoys annoys
annual annual
@ -364,7 +362,6 @@ auntie
aureus aureus
aurora aurora
author author
autism
autumn autumn
avails avails
avatar avatar
@ -638,14 +635,12 @@ bigwig
bijoux bijoux
bikers bikers
biking biking
bikini
bilges bilges
bilked bilked
bilker bilker
billed billed
billet billet
billow billow
bimbos
binary binary
binder binder
binged binged
@ -710,8 +705,6 @@ blocks
blokes blokes
blonde blonde
blonds blonds
bloods
bloody
blooms blooms
bloops bloops
blotch blotch
@ -817,8 +810,6 @@ bounds
bounty bounty
bovine bovine
bovver bovver
bowels
bowers
bowing bowing
bowled bowled
bowleg bowleg
@ -827,10 +818,8 @@ bowman
bowmen bowmen
bowwow bowwow
boxcar boxcar
boxers
boxier boxier
boxing boxing
boyish
braced braced
bracer bracer
braces braces
@ -861,7 +850,6 @@ breach
breads breads
breaks breaks
breams breams
breast
breath breath
breech breech
breeds breeds
@ -872,9 +860,6 @@ brevet
brewed brewed
brewer brewer
briars briars
bribed
briber
bribes
bricks bricks
bridal bridal
brides brides
@ -926,13 +911,7 @@ buffed
buffer buffer
buffet buffet
bugged bugged
bugger
bugled
bugler
bugles
builds builds
bulged
bulges
bulked bulked
bulled bulled
bullet bullet
@ -1340,8 +1319,6 @@ clingy
clinic clinic
clinks clinks
clique clique
cloaca
cloaks
cloche cloche
clocks clocks
clomps clomps
@ -1448,7 +1425,6 @@ comply
compos compos
conchs conchs
concur concur
condom
condor condor
condos condos
coneys coneys
@ -1568,8 +1544,6 @@ cranes
cranks cranks
cranky cranky
cranny cranny
crapes
crappy
crated crated
crater crater
crates crates
@ -1585,7 +1559,6 @@ crazes
creaks creaks
creaky creaky
creams creams
creamy
crease crease
create create
creche creche
@ -1594,8 +1567,6 @@ credos
creeds creeds
creeks creeks
creels creels
creeps
creepy
cremes cremes
creole creole
crepes crepes
@ -1728,9 +1699,6 @@ dainty
daises daises
damage damage
damask damask
dammed
dammit
damned
damped damped
dampen dampen
damper damper
@ -1754,7 +1722,6 @@ darers
daring daring
darken darken
darker darker
darkie
darkly darkly
darned darned
darner darner
@ -1763,8 +1730,6 @@ darter
dashed dashed
dasher dasher
dashes dashes
daters
dating
dative dative
daubed daubed
dauber dauber
@ -1921,7 +1886,6 @@ dharma
dhotis dhotis
diadem diadem
dialog dialog
diaper
diatom diatom
dibble dibble
dicier dicier
@ -1943,7 +1907,6 @@ digits
diking diking
diktat diktat
dilate dilate
dildos
dilute dilute
dimity dimity
dimmed dimmed
@ -2058,7 +2021,6 @@ dotted
double double
doubly doubly
doubts doubts
douche
doughy doughy
dourer dourer
dourly dourly
@ -2139,15 +2101,6 @@ duenna
duffed duffed
duffer duffer
dugout dugout
dulcet
dulled
duller
dumber
dumbly
dumbos
dumdum
dumped
dumper
dunces dunces
dunged dunged
dunked dunked
@ -2285,7 +2238,6 @@ endows
endued endued
endues endues
endure endure
enemas
energy energy
enfold enfold
engage engage
@ -2333,7 +2285,6 @@ erects
ermine ermine
eroded eroded
erodes erodes
erotic
errand errand
errant errant
errata errata
@ -2344,7 +2295,6 @@ eructs
erupts erupts
escape escape
eschew eschew
escort
escrow escrow
escudo escudo
espied espied
@ -2363,7 +2313,6 @@ ethnic
etudes etudes
euchre euchre
eulogy eulogy
eunuch
eureka eureka
evaded evaded
evader evader
@ -2392,7 +2341,6 @@ exempt
exerts exerts
exeunt exeunt
exhale exhale
exhort
exhume exhume
exiled exiled
exiles exiles
@ -2415,7 +2363,6 @@ extant
extend extend
extent extent
extols extols
extort
extras extras
exuded exuded
exudes exudes
@ -2440,7 +2387,6 @@ faeces
faerie faerie
faffed faffed
fagged fagged
faggot
failed failed
faille faille
fainer fainer
@ -2473,18 +2419,10 @@ faring
farmed farmed
farmer farmer
farrow farrow
farted
fascia fascia
fasted fasted
fasten fasten
faster faster
father
fathom
fating
fatsos
fatten
fatter
fatwas
faucet faucet
faults faults
faulty faulty
@ -2532,7 +2470,6 @@ fesses
festal festal
fester fester
feting feting
fetish
fetter fetter
fettle fettle
feudal feudal
@ -2617,9 +2554,7 @@ flaked
flakes flakes
flambe flambe
flamed flamed
flamer
flames flames
flange
flanks flanks
flared flared
flares flares
@ -2754,8 +2689,6 @@ franks
frappe frappe
frauds frauds
frayed frayed
freaks
freaky
freely freely
freest freest
freeze freeze
@ -2795,8 +2728,6 @@ fryers
frying frying
ftpers ftpers
ftping ftping
fucked
fucker
fuddle fuddle
fudged fudged
fudges fudges
@ -2891,10 +2822,7 @@ gasbag
gashed gashed
gashes gashes
gasket gasket
gasman
gasmen
gasped gasped
gassed
gasses gasses
gateau gateau
gather gather
@ -3104,7 +3032,6 @@ grimed
grimes grimes
grimly grimly
grinds grinds
gringo
griped griped
griper griper
gripes gripes
@ -3186,8 +3113,6 @@ gypsum
gyrate gyrate
gyving gyving
habits habits
hacked
hacker
hackle hackle
hadith hadith
haggis haggis
@ -3195,8 +3120,6 @@ haggle
hailed hailed
hairdo hairdo
haired haired
hajjes
hajjis
halest halest
haling haling
halite halite
@ -3223,11 +3146,8 @@ happen
haptic haptic
harass harass
harden harden
harder
hardly
harems harems
haring haring
harked
harlot harlot
harmed harmed
harped harped
@ -3407,7 +3327,6 @@ hoofed
hoofer hoofer
hookah hookah
hooked hooked
hooker
hookup hookup
hooped hooped
hoopla hoopla
@ -3459,8 +3378,6 @@ huffed
hugely hugely
hugest hugest
hugged hugged
hulled
huller
humane humane
humans humans
humble humble
@ -3667,8 +3584,6 @@ jacket
jading jading
jagged jagged
jaguar jaguar
jailed
jailer
jalopy jalopy
jammed jammed
jangle jangle
@ -3689,8 +3604,6 @@ jejune
jelled jelled
jellos jellos
jennet jennet
jerked
jerkin
jersey jersey
jested jested
jester jester
@ -3814,11 +3727,7 @@ kidded
kidder kidder
kiddie kiddie
kiddos kiddos
kidnap
kidney kidney
killed
killer
kilned
kilted kilted
kilter kilter
kimono kimono
@ -3827,15 +3736,11 @@ kinder
kindle kindle
kindly kindly
kingly kingly
kinked
kiosks kiosks
kipped kipped
kipper kipper
kirsch kirsch
kismet kismet
kissed
kisser
kisses
kiting kiting
kitsch kitsch
kitted kitted
@ -3847,10 +3752,6 @@ kluges
klutzy klutzy
knacks knacks
knaves knaves
kneads
kneels
knells
knifed
knifes knifes
knight knight
knives knives
@ -4210,8 +4111,6 @@ lunges
lupine lupine
lupins lupins
luring luring
lurked
lurker
lusher lusher
lushes lushes
lushly lushly
@ -4608,7 +4507,6 @@ muggle
mukluk mukluk
mulcts mulcts
mulish mulish
mullah
mulled mulled
mullet mullet
mumble mumble
@ -4721,9 +4619,6 @@ nickel
nicker nicker
nickle nickle
nieces nieces
niggas
niggaz
nigger
niggle niggle
nigher nigher
nights nights
@ -4736,7 +4631,6 @@ ninjas
ninths ninths
nipped nipped
nipper nipper
nipple
nitric nitric
nitwit nitwit
nixing nixing
@ -4781,15 +4675,6 @@ nozzle
nuance nuance
nubbin nubbin
nubile nubile
nuclei
nudest
nudged
nudges
nudism
nudist
nudity
nugget
nuking
numbed numbed
number number
numbly numbly
@ -4804,7 +4689,6 @@ nutter
nuzzle nuzzle
nybble nybble
nylons nylons
nympho
nymphs nymphs
oafish oafish
oaring oaring
@ -4885,7 +4769,6 @@ opting
option option
opuses opuses
oracle oracle
orally
orange orange
orated orated
orates orates
@ -4897,7 +4780,6 @@ ordeal
orders orders
ordure ordure
organs organs
orgasm
orgies orgies
oriels oriels
orient orient
@ -4993,10 +4875,6 @@ pander
panels panels
panics panics
panned panned
panted
pantie
pantos
pantry
papacy papacy
papaya papaya
papers papers
@ -5078,7 +4956,6 @@ pebble
pebbly pebbly
pecans pecans
pecked pecked
pecker
pectic pectic
pectin pectin
pedalo pedalo
@ -5151,9 +5028,6 @@ phenom
phials phials
phlegm phlegm
phloem phloem
phobia
phobic
phoebe
phoned phoned
phones phones
phoney phoney
@ -5228,9 +5102,6 @@ piques
piracy piracy
pirate pirate
pirogi pirogi
pissed
pisser
pisses
pistes pistes
pistil pistil
pistol pistol
@ -5311,8 +5182,6 @@ pogrom
points points
pointy pointy
poised poised
poises
poison
pokers pokers
pokeys pokeys
pokier pokier
@ -5422,7 +5291,6 @@ preyed
priced priced
prices prices
pricey pricey
pricks
prided prided
prides prides
priers priers
@ -5602,14 +5470,9 @@ rabbit
rabble rabble
rabies rabies
raceme raceme
racers
racial
racier racier
racily racily
racing racing
racism
racist
racked
racket racket
radars radars
radial radial
@ -5661,8 +5524,6 @@ rapers
rapids rapids
rapier rapier
rapine rapine
raping
rapist
rapped rapped
rappel rappel
rapper rapper
@ -5747,7 +5608,6 @@ recoup
rectal rectal
rector rector
rectos rectos
rectum
recurs recurs
recuse recuse
redact redact
@ -5891,7 +5751,6 @@ resume
retail retail
retain retain
retake retake
retard
retell retell
retest retest
retied retied
@ -6125,8 +5984,6 @@ sadden
sadder sadder
saddle saddle
sadhus sadhus
sadism
sadist
safari safari
safely safely
safest safest
@ -6364,16 +6221,6 @@ severs
sewage sewage
sewers sewers
sewing sewing
sexier
sexily
sexing
sexism
sexist
sexpot
sextet
sexton
sexual
shabby
shacks shacks
shaded shaded
shades shades
@ -6383,10 +6230,7 @@ shaggy
shaken shaken
shaker shaker
shakes shakes
shalom
shaman shaman
shamed
shames
shandy shandy
shanks shanks
shanty shanty
@ -6432,7 +6276,6 @@ shirks
shirrs shirrs
shirts shirts
shirty shirty
shitty
shiver shiver
shoals shoals
shoats shoats
@ -6575,9 +6418,6 @@ slangy
slants slants
slated slated
slates slates
slaved
slaver
slaves
slayed slayed
slayer slayer
sleaze sleaze
@ -6672,7 +6512,6 @@ snarks
snarky snarky
snarls snarls
snarly snarly
snatch
snazzy snazzy
sneaks sneaks
sneaky sneaky
@ -6716,7 +6555,6 @@ socket
sodded sodded
sodden sodden
sodium sodium
sodomy
soever soever
soften soften
softer softer
@ -7468,7 +7306,6 @@ torrid
torsos torsos
tortes tortes
tossed tossed
tosser
tosses tosses
tossup tossup
totals totals
@ -7686,7 +7523,6 @@ unhook
unhurt unhurt
unions unions
unique unique
unisex
unison unison
united united
unites unites
@ -7793,7 +7629,6 @@ vacant
vacate vacate
vacuum vacuum
vagary vagary
vagina
vaguer vaguer
vainer vainer
vainly vainly
@ -7930,9 +7765,6 @@ votive
vowels vowels
vowing vowing
voyage voyage
voyeur
vulgar
vulvae
wabbit wabbit
wacker wacker
wackos wackos
@ -7975,7 +7807,6 @@ wander
wangle wangle
waning waning
wanked wanked
wanker
wanner wanner
wanted wanted
wanton wanton

View File

@ -1944,7 +1944,6 @@ dosage
dose dose
dotted dotted
doubling doubling
douche
dove dove
down down
dowry dowry
@ -3015,7 +3014,6 @@ groom
groove groove
grooving grooving
groovy groovy
grope
ground ground
grouped grouped
grout grout
@ -3135,7 +3133,6 @@ happiness
happy happy
harbor harbor
hardcopy hardcopy
hardcore
hardcover hardcover
harddisk harddisk
hardened hardened
@ -6553,7 +6550,6 @@ swimmer
swimming swimming
swimsuit swimsuit
swimwear swimwear
swinger
swinging swinging
swipe swipe
swirl swirl

File diff suppressed because it is too large Load Diff

View File

@ -20,6 +20,7 @@ exclude = '''
[tool.ruff] [tool.ruff]
ignore-init-module-imports = true ignore-init-module-imports = true
exclude = [".venv", "migrations"]
[tool.djlint] [tool.djlint]
indent = 2 indent = 2

View File

@ -15,7 +15,7 @@
{{ otp_token_form.csrf_token }} {{ otp_token_form.csrf_token }}
<input type="hidden" name="form-name" value="create" /> <input type="hidden" name="form-name" value="create" />
<div class="font-weight-bold mt-5">Token</div> <div class="font-weight-bold mt-5">Token</div>
<div class="small-text mb-3">Please enter the 2FA code from your 2FA authenticator</div> <div class="small-text mb-3">Please enter the 2FA code from your authenticator app</div>
{{ otp_token_form.token(class="form-control", autofocus="true") }} {{ otp_token_form.token(class="form-control", autofocus="true") }}
{{ render_field_errors(otp_token_form.token) }} {{ render_field_errors(otp_token_form.token) }}
<div class="form-check"> <div class="form-check">

View File

@ -9,7 +9,7 @@
<h1 class="card-title">Create new account</h1> <h1 class="card-title">Create new account</h1>
<div class="form-group"> <div class="form-group">
<label class="form-label">Email address</label> <label class="form-label">Email address</label>
{{ form.email(class="form-control", type="email", placeholder="YourName@protonmail.com") }} {{ form.email(class="form-control", type="email", placeholder="username@proton.me") }}
<div class="small-text alert alert-info" style="margin-top: 1px"> <div class="small-text alert alert-info" style="margin-top: 1px">
Emails sent to your alias will be forwarded to this email address. Emails sent to your alias will be forwarded to this email address.
<br> <br>

View File

@ -7,6 +7,7 @@
<div class="card-body p-6 text-center"> <div class="card-body p-6 text-center">
<h1 class="h4">An email to validate your email is on its way.</h1> <h1 class="h4">An email to validate your email is on its way.</h1>
<p>Please check your inbox/spam folder.</p> <p>Please check your inbox/spam folder.</p>
<p>Make sure to mark the message as not spam so that future messages come to your normal inbox</p>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -59,6 +59,8 @@
</div> </div>
</div> </div>
</div> </div>
{% if can_create_contacts %}
<div class="row mb-5"> <div class="row mb-5">
<div class="col-12 col-lg-6 pt-1"> <div class="col-12 col-lg-6 pt-1">
<form method="post"> <form method="post">
@ -79,6 +81,7 @@
{% endif %} {% endif %}
</form> </form>
</div> </div>
{% endif %}
<div class="col-12 col-lg-6 pt-1"> <div class="col-12 col-lg-6 pt-1">
<div class="float-right d-flex"> <div class="float-right d-flex">
<form method="post"> <form method="post">

View File

@ -17,7 +17,7 @@
<b>hello@{{ FIRST_ALIAS_DOMAIN }}</b>, <b>hello@{{ FIRST_ALIAS_DOMAIN }}</b>,
<b>me@{{ FIRST_ALIAS_DOMAIN }}</b>, etc. <b>me@{{ FIRST_ALIAS_DOMAIN }}</b>, etc.
<br /> <br />
If you add your own domain, this restriction is removed, and you can fully customize the alias. If you add your own domain (or subdomain), this restriction is removed, and you can fully customize the alias.
<br /> <br />
</div> </div>
</div> </div>

View File

@ -12,7 +12,7 @@
<div class="card-body"> <div class="card-body">
<h1 class="h3">Two Factor Authentication - TOTP</h1> <h1 class="h3">Two Factor Authentication - TOTP</h1>
<p> <p>
You will need to use a 2FA application like Google Authenticator or Authy on your phone or PC and scan the following QR Code: You will need to use a 2FA application like Proton Pass or Aegis on your phone or PC and scan the following QR Code:
</p> </p>
<canvas id="qr"></canvas> <canvas id="qr"></canvas>
<script> <script>

View File

@ -10,7 +10,7 @@
<div>{{ notification.message | safe }}</div> <div>{{ notification.message | safe }}</div>
<form method="post" <form method="post"
class="float-right mt-3" class="float-right mt-3"
onsubmit="return confirm('This operation is not reversible, please confirm');"> onsubmit="return confirm('This operation is irreversible, please confirm');">
<button class="btn btn-outline-danger">Delete</button> <button class="btn btn-outline-danger">Delete</button>
</form> </form>
</div> </div>

View File

@ -18,7 +18,7 @@
<br /> <br />
For generic questions, i.e. not related to your account, we recommend to post the question on For generic questions, i.e. not related to your account, we recommend to post the question on
our our
<a href="https://www.reddit.com/r/Simplelogin/">Reddit</a> <a href="https://www.reddit.com/r/Simplelogin/">Reddit</a> or <a href="https://forum.simplelogin.io/">our official forum</a>
where our community can help answer the question where our community can help answer the question
and other people with the same question can find the answer there. and other people with the same question can find the answer there.
</div> </div>

View File

@ -1,17 +1,19 @@
{% extends "default.html" %} {% extends "default.html" %}
{% set active_page = "dashboard" %} {% set active_page = "dashboard" %}
{% block title %}Block an alias{% endblock %} {% block title %}Deactivate an alias{% endblock %}
{% block default_content %} {% block default_content %}
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<h1 class="h3">Block alias</h1> <h1 class="h3">Deactivate alias</h1>
<p> <p>
You are about to block the alias You are about to deactivate the alias
<a href="mailto:{{ alias }}" target="_blank">{{ alias }}</a> <a href="mailto:{{ alias }}" target="_blank">{{ alias }}</a>
</p> </p>
<p>After this, you will stop receiving all emails sent to this alias, please confirm.</p> <p>
After this, you will stop receiving all emails sent to this alias, please confirm. You will always be able to re-activate it untill you will decide to delete it.
</p>
<form method="post"> <form method="post">
<button class="btn btn-warning">Confirm</button> <button class="btn btn-warning">Confirm</button>
</form> </form>

View File

@ -43,9 +43,8 @@ Note, if you are a paying Proton Mail user, you automatically receive the premiu
{% endcall %} {% endcall %}
{% call text() %} {% call text() %}
For any question, feedback or feature request, please join our For any question or feedback, please join our <a href="https://forum.simplelogin.io/">official forum</a>.
<a href="https://github.com/simple-login/app/discussions">GitHub forum</a> If you want to request a feature, please submit it on our <a href="https://github.com/simple-login/app/discussions">GitHub repo</a>.
.
You can also join our You can also join our
<a href="https://www.reddit.com/r/Simplelogin/">Reddit</a> <a href="https://www.reddit.com/r/Simplelogin/">Reddit</a>
or follow our or follow our

View File

@ -13,7 +13,8 @@ SimpleLogin is also available on Android and iOS so you can manage your aliases
Note, if you are a paying Proton Mail user, you automatically receive the premium version of SimpleLogin. Note, if you are a paying Proton Mail user, you automatically receive the premium version of SimpleLogin.
For any question, feedback or feature request, please join our GitHub forum. For any question or feedback, please join our official forum.
If you want to request a feature, please submit it on our GitHub repo.
You can also join our Reddit or follow our Twitter. You can also join our Reddit or follow our Twitter.
Best, Best,
@ -26,7 +27,8 @@ Firefox: https://addons.mozilla.org/firefox/addon/simplelogin/
Edge: https://microsoftedge.microsoft.com/addons/detail/simpleloginreceive-sen/diacfpipniklenphgljfkmhinphjlfff Edge: https://microsoftedge.microsoft.com/addons/detail/simpleloginreceive-sen/diacfpipniklenphgljfkmhinphjlfff
Android: https://play.google.com/store/apps/details?id=io.simplelogin.android Android: https://play.google.com/store/apps/details?id=io.simplelogin.android
iOS: https://apps.apple.com/app/id1494359858 iOS: https://apps.apple.com/app/id1494359858
Github forum: https://github.com/simple-login/app/discussions Github repo: https://github.com/simple-login/app/discussions
Official forum: https://forum.simplelogin.io/
Reddit: https://www.reddit.com/r/Simplelogin/ Reddit: https://www.reddit.com/r/Simplelogin/
Twitter: https://twitter.com/simple_login Twitter: https://twitter.com/simple_login

View File

@ -71,9 +71,10 @@ Please note that you can't create more than {{ MAX_NB_EMAIL_FREE_PLAN }} aliases
{% endif %} {% endif %}
{% call text() %} {% call text() %}
For any question, feedback or feature request, please join our For any question or feedback,
<a href="https://github.com/simple-login/app/discussions">GitHub forum</a> please join our <a href="https://forum.simplelogin.io/">official forum</a>.
. If you want to request a feature,
please submit it on our <a href="https://github.com/simple-login/app/discussions">GitHub repo</a>.
You can also join our You can also join our
<a href="https://www.reddit.com/r/Simplelogin/">Reddit</a> <a href="https://www.reddit.com/r/Simplelogin/">Reddit</a>
or follow our or follow our

View File

@ -26,6 +26,8 @@ No worries: all aliases you create during this period will continue to work norm
At any time, you can reach out to us by simply replying to this email. At any time, you can reach out to us by simply replying to this email.
For any question, feedback or feature request, please join our GitHub forum at https://github.com/simple-login/app/discussions For any question or feedback, please join our official forum at https://forum.simplelogin.io/
If you want to request a feature, please submit it on our GitHub repo at https://github.com/simple-login/app/discussions
You can also join our Reddit at https://www.reddit.com/r/Simplelogin/ follow our Twitter at https://twitter.com/simplelogin You can also join our Reddit at https://www.reddit.com/r/Simplelogin/ follow our Twitter at https://twitter.com/simplelogin

View File

@ -4,6 +4,7 @@
{{ render_text("Thank you for choosing SimpleLogin.") }} {{ render_text("Thank you for choosing SimpleLogin.") }}
{{ render_text("To get started, please confirm that <b>" + email + "</b> is your email address by clicking on the button below within 1 hour.") }} {{ render_text("To get started, please confirm that <b>" + email + "</b> is your email address by clicking on the button below within 1 hour.") }}
{{ render_text("If it wasn't you, maybe someone entered your email by mistake. In this case you can ignore this mail.") }}
{{ render_button("Verify email", activation_link) }} {{ render_button("Verify email", activation_link) }}
{{ render_text('Thanks, {{ render_text('Thanks,
<br /> <br />

View File

@ -4,4 +4,6 @@
Thank you for choosing SimpleLogin. Thank you for choosing SimpleLogin.
To get started, please confirm that {{email}} is your email address using this link {{activation_link}} within 1 hour. To get started, please confirm that {{email}} is your email address using this link {{activation_link}} within 1 hour.
If it wasn't you, maybe someone entered your email by mistake. In this case you can ignore this mail.
{% endblock %} {% endblock %}

View File

@ -7,7 +7,7 @@
{% endcall %} {% endcall %}
{% call text() %} {% call text() %}
Your have tried to register multiple times to {{ service }}, and this is against the terms of service of SimpleLogin. Please don't do that anymore. You have tried to register multiple times to {{ service }}, and this is against the terms of service of SimpleLogin. Please don't do that anymore.
{% endcall %} {% endcall %}
{% call text() %} {% call text() %}

View File

@ -17,8 +17,7 @@
SimpleLogin is an <a href="https://github.com/simple-login">open source</a> email alias solution to protect your email address. SimpleLogin is an <a href="https://github.com/simple-login">open source</a> email alias solution to protect your email address.
</p> </p>
<p class="small text-white"> <p class="small text-white">
SimpleLogin is the product of SimpleLogin SAS, registered in France under the SIREN number 884302134. SimpleLogin is the product of <a href="https://proton.me">Proton AG</a>, registered in Switzerland under number CHE-354.686.492.
SimpleLogin SAS is part of <a href="https://proton.me">Proton AG</a>.
</p> </p>
</div> </div>
</div> </div>
@ -38,12 +37,6 @@
alt="GitHub"> alt="GitHub">
</a> </a>
</li> </li>
<li>
<a class="list-group-item text-white footer-item "
href="https://github.com/simple-login/app/blob/master/docs/api.md">
API Docs
</a>
</li>
<li> <li>
<a class="list-group-item text-white footer-item " <a class="list-group-item text-white footer-item "
href="https://status.simplelogin.io/">Status</a> href="https://status.simplelogin.io/">Status</a>
@ -61,18 +54,10 @@
<a class="list-group-item text-white footer-item" <a class="list-group-item text-white footer-item"
href="https://simplelogin.io/blog/">Blog</a> href="https://simplelogin.io/blog/">Blog</a>
</li> </li>
<li>
<a class="list-group-item text-white footer-item"
href="https://simplelogin.io/job/">Join Us</a>
</li>
<li> <li>
<a class="list-group-item text-white footer-item" <a class="list-group-item text-white footer-item"
href="https://simplelogin.io/about/">About Us</a> href="https://simplelogin.io/about/">About Us</a>
</li> </li>
<li>
<a class="list-group-item text-white footer-item"
href="https://github.com/simple-login/app/projects/1">Roadmap</a>
</li>
<li> <li>
<a class="list-group-item text-white footer-item" <a class="list-group-item text-white footer-item"
href="https://simplelogin.io/contact/">Contact Us</a> href="https://simplelogin.io/contact/">Contact Us</a>
@ -106,37 +91,9 @@
<a class="list-group-item text-white footer-item " <a class="list-group-item text-white footer-item "
href="https://simplelogin.io/docs/">Documentation</a> href="https://simplelogin.io/docs/">Documentation</a>
</li> </li>
</ul>
</div>
<div class="col-sm-4 col-lg-2 mb-4">
<h3 class="h4 text-white">Comparisons</h3>
<ul class="list-group list-group-transparent list-group-white list-group-flush list-group-borderless mb-0 footer-list-group">
<li> <li>
<a class="list-group-item text-white footer-item" <a class="list-group-item text-white footer-item "
href="https://simplelogin.io/blog/email-alias-vs-plus-sign/"> href="https://forum.simplelogin.io">Forum</a>
vs Plus Sign (+) Trick
</a>
</li>
<li>
<a class="list-group-item text-white footer-item"
href="https://simplelogin.io/blog/vs-firefox-relay/">
vs
Firefox Relay
</a>
</li>
<li>
<a class="list-group-item text-white footer-item"
href="https://simplelogin.io/blog/vs-burner-mail/">
vs
Burner Mail
</a>
</li>
<li>
<a class="list-group-item text-white footer-item"
href="https://simplelogin.io/blog/alternative-33mail/">
vs
33mail
</a>
</li> </li>
</ul> </ul>
</div> </div>

View File

@ -83,7 +83,14 @@
</a> </a>
</div> </div>
<div class="dropdown-item"> <div class="dropdown-item">
<a href="https://github.com/simple-login/app/discussions" <a href="https://github.com/simple-login/app/"
target="_blank"
rel="noopener noreferrer">
Github repo
<i class="fa fa-external-link" aria-hidden="true"></i>
</a>
<div class="dropdown-item">
<a href="https://forum.simplelogin.io"
target="_blank" target="_blank"
rel="noopener noreferrer"> rel="noopener noreferrer">
Forum Forum
@ -154,8 +161,8 @@
</a> </a>
</div> </div>
</div> </div>
</div> </div>
<div class="header collapse d-lg-flex p-0" id="headerMenuCollapse"> <div class="header collapse d-lg-flex p-0" id="headerMenuCollapse">
<div class="container"> <div class="container">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-lg order-lg-first"> <div class="col-lg order-lg-first">
@ -164,4 +171,4 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -106,7 +106,7 @@
</a> </a>
</div> </div>
<div class="dropdown-item"> <div class="dropdown-item">
<a href="https://github.com/simple-login/app/discussions" <a href="https://forum.simplelogin.io/"
target="_blank" target="_blank"
rel="noopener noreferrer"> rel="noopener noreferrer">
Forum Forum

View File

@ -1,6 +1,7 @@
from flask import url_for from flask import url_for
from app import config from app import config
from app.db import Session
from app.models import User, PartnerUser from app.models import User, PartnerUser
from app.proton.utils import get_proton_partner from app.proton.utils import get_proton_partner
from tests.api.utils import get_new_user_and_api_key from tests.api.utils import get_new_user_and_api_key
@ -23,6 +24,7 @@ def test_user_in_trial(flask_client):
"profile_picture_url": None, "profile_picture_url": None,
"max_alias_free_plan": config.MAX_NB_EMAIL_FREE_PLAN, "max_alias_free_plan": config.MAX_NB_EMAIL_FREE_PLAN,
"connected_proton_address": None, "connected_proton_address": None,
"can_create_reverse_alias": True,
} }
@ -52,9 +54,24 @@ def test_user_linked_to_proton(flask_client):
"profile_picture_url": None, "profile_picture_url": None,
"max_alias_free_plan": config.MAX_NB_EMAIL_FREE_PLAN, "max_alias_free_plan": config.MAX_NB_EMAIL_FREE_PLAN,
"connected_proton_address": partner_email, "connected_proton_address": partner_email,
"can_create_reverse_alias": user.can_create_contacts(),
} }
def test_cannot_create_reverse_alias(flask_client):
user, api_key = get_new_user_and_api_key()
user.trial_end = None
Session.flush()
config.DISABLE_CREATE_CONTACTS_FOR_FREE_USERS = True
r = flask_client.get(
url_for("api.user_info"), headers={"Authentication": api_key.code}
)
assert r.status_code == 200
assert not r.json["can_create_reverse_alias"]
def test_wrong_api_key(flask_client): def test_wrong_api_key(flask_client):
r = flask_client.get( r = flask_client.get(
url_for("api.user_info"), headers={"Authentication": "Invalid code"} url_for("api.user_info"), headers={"Authentication": "Invalid code"}

View File

@ -0,0 +1,17 @@
from app.db import Session
from app.models import Alias, Mailbox, AliasMailbox
from tests.utils import create_new_user, random_email
def test_duplicated_mailbox_is_returned_only_once():
user = create_new_user()
other_mailbox = Mailbox.create(user_id=user.id, email=random_email(), verified=True)
alias = Alias.create_new_random(user)
AliasMailbox.create(mailbox_id=other_mailbox.id, alias_id=alias.id)
AliasMailbox.create(mailbox_id=user.default_mailbox_id, alias_id=alias.id)
Session.flush()
alias_mailboxes = alias.mailboxes
assert len(alias_mailboxes) == 2
alias_mailbox_id = [mailbox.id for mailbox in alias_mailboxes]
assert user.default_mailbox_id in alias_mailbox_id
assert other_mailbox.id in alias_mailbox_id