mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2026-05-26 20:49:55 +00:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 19204b097d | |||
| 567d809efe | |||
| 8171e3d614 | |||
| 98b221096b | |||
| 027f6a4b02 | |||
| 42028f155b | |||
| 6999246d19 | |||
| 01f6893c07 | |||
| ed93a4ad9f | |||
| cc8a4501b5 | |||
| cbb1632a1a | |||
| df59fc35b4 |
@@ -0,0 +1,53 @@
|
|||||||
|
name: Auto Labeler
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types: [opened, reopened]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
issues: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
auto-label:
|
||||||
|
name: Apply labels based on changed files
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Apply PR Labels
|
||||||
|
uses: https://github.com/actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const allFiles = await github.paginate(github.rest.pulls.listFiles, {
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
pull_number: context.issue.number,
|
||||||
|
});
|
||||||
|
|
||||||
|
const fileNames = allFiles.map(f => f.filename);
|
||||||
|
const labelsToAdd = new Set();
|
||||||
|
|
||||||
|
for (const file of fileNames) {
|
||||||
|
if (file.startsWith('docs/') || file.startsWith('theme/') || file.endsWith('.md') || file == 'rspress.config.ts') {
|
||||||
|
labelsToAdd.add('Documentation');
|
||||||
|
}
|
||||||
|
if (file.startsWith('.forgejo/')) {
|
||||||
|
labelsToAdd.add('Meta/CI');
|
||||||
|
}
|
||||||
|
if (file.startsWith('pkg/') || file.startsWith('nix/') || file === 'flake.nix' || file === 'flake.lock' || file.startsWith('docker/')) {
|
||||||
|
labelsToAdd.add('Meta/Packaging');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (labelsToAdd.size > 0) {
|
||||||
|
const labelsArray = Array.from(labelsToAdd);
|
||||||
|
console.log('Adding labels:', labelsArray);
|
||||||
|
await github.rest.issues.addLabels({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
labels: labelsArray,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.log('No files changed that require auto-labeling.');
|
||||||
|
}
|
||||||
@@ -92,10 +92,13 @@ jobs:
|
|||||||
BASE_VERSION=$(cargo metadata --no-deps --format-version 1 | jq -r ".packages[] | select(.name == \"conduwuit\").version" | sed 's/[^a-zA-Z0-9.+]/~/g')
|
BASE_VERSION=$(cargo metadata --no-deps --format-version 1 | jq -r ".packages[] | select(.name == \"conduwuit\").version" | sed 's/[^a-zA-Z0-9.+]/~/g')
|
||||||
# VERSION is the package version, COMPONENT is used in
|
# VERSION is the package version, COMPONENT is used in
|
||||||
# apt's repository config like a git repo branch
|
# apt's repository config like a git repo branch
|
||||||
if [[ "${{ forge.ref }}" == "refs/tags/"* ]]; then
|
VERSION=$BASE_VERSION
|
||||||
# Use the "stable" component for tagged releases
|
if [[ ${{ forge.ref_name }} =~ ^v+[0-9]\.+[0-9]\.+[0-9]$ ]]; then
|
||||||
|
# Use the "stable" component for tagged semver releases
|
||||||
COMPONENT="stable"
|
COMPONENT="stable"
|
||||||
VERSION=$BASE_VERSION
|
elif [[ ${{ forge.ref }} =~ ^refs/tags/^v+[0-9]\.+[0-9]\.+[0-9] ]]; then
|
||||||
|
# Use the "unstable" component for tagged semver pre-releases
|
||||||
|
COMPONENT="unstable"
|
||||||
else
|
else
|
||||||
# Use the "dev" component for development builds
|
# Use the "dev" component for development builds
|
||||||
SHA=$(echo "${{ forge.sha }}" | cut -c1-7)
|
SHA=$(echo "${{ forge.sha }}" | cut -c1-7)
|
||||||
|
|||||||
Generated
+11
-11
@@ -848,9 +848,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "4.6.0"
|
version = "4.6.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351"
|
checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap_builder",
|
"clap_builder",
|
||||||
"clap_derive",
|
"clap_derive",
|
||||||
@@ -868,9 +868,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap_derive"
|
name = "clap_derive"
|
||||||
version = "4.6.0"
|
version = "4.6.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a"
|
checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"heck",
|
"heck",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
@@ -1906,7 +1906,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
|
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"windows-sys 0.61.2",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -3475,7 +3475,7 @@ version = "0.50.3"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
|
checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"windows-sys 0.61.2",
|
"windows-sys 0.60.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -4845,7 +4845,7 @@ dependencies = [
|
|||||||
"errno",
|
"errno",
|
||||||
"libc",
|
"libc",
|
||||||
"linux-raw-sys",
|
"linux-raw-sys",
|
||||||
"windows-sys 0.61.2",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -5446,7 +5446,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
|
checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"windows-sys 0.61.2",
|
"windows-sys 0.60.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -5749,9 +5749,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio"
|
name = "tokio"
|
||||||
version = "1.51.1"
|
version = "1.52.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c"
|
checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"libc",
|
"libc",
|
||||||
@@ -6578,7 +6578,7 @@ version = "0.1.11"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
|
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"windows-sys 0.61.2",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Users will now be prevented from removing their email if the server is configured to require an email when registering an account.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Fixed a situation where multiple email addresses could be associated with one user when that user changes their email address.
|
||||||
@@ -2104,6 +2104,9 @@
|
|||||||
# Whether to require that users provide an email address when they
|
# Whether to require that users provide an email address when they
|
||||||
# register.
|
# register.
|
||||||
#
|
#
|
||||||
|
# If either this option or `require_email_for_token_registration` are set,
|
||||||
|
# users will not be allowed to remove their email address.
|
||||||
|
#
|
||||||
#require_email_for_registration = false
|
#require_email_for_registration = false
|
||||||
|
|
||||||
# Whether to require that users who register with a registration token
|
# Whether to require that users who register with a registration token
|
||||||
|
|||||||
@@ -6,10 +6,10 @@
|
|||||||
"message": "Welcome to Continuwuity! Important announcements about the project will appear here."
|
"message": "Welcome to Continuwuity! Important announcements about the project will appear here."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 10,
|
"id": 11,
|
||||||
"mention_room": false,
|
"mention_room": false,
|
||||||
"date": "2026-03-03",
|
"date": "2026-04-17",
|
||||||
"message": "We've just released [v0.5.6](https://forgejo.ellis.link/continuwuation/continuwuity/releases/tag/v0.5.6), which contains a few security improvements - plus significant reliability and performance improvements. Please update as soon as possible. \n\nWe released [v0.5.5](https://forgejo.ellis.link/continuwuation/continuwuity/releases/tag/v0.5.5) two weeks ago, but it skipped your admin room straight to [our announcements channel](https://matrix.to/#/!jIdNjSM5X-V5JVx2h2kAhUZIIQ08GyzPL55NFZAH1vM?via=ellis.link&via=gingershaped.computer&via=matrix.org). Make sure you're there to get important information as soon as we announce it! [Our space](https://matrix.to/#/!8cR4g-i9ucof69E4JHNg9LbPVkGprHb3SzcrGBDDJgk?via=continuwuity.org&via=ellis.link&via=matrix.org) has also gained a bunch of new and interesting rooms - be there or be square."
|
"message": "[v0.5.7](https://forgejo.ellis.link/continuwuation/continuwuity/releases/tag/v0.5.7) is out! Email verification! Terms and Conditions! Deleting notification pushers! So much good stuff. Go grab the release and read the changelog!"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,9 @@
|
|||||||
callPackage,
|
callPackage,
|
||||||
rustPlatform,
|
rustPlatform,
|
||||||
cargoExtraArgs ? "",
|
cargoExtraArgs ? "",
|
||||||
|
rustflags ? "",
|
||||||
rocksdb ? callPackage ./rocksdb.nix { },
|
rocksdb ? callPackage ./rocksdb.nix { },
|
||||||
|
profile ? "release",
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
# see https://crane.dev/API.html#cranelibfiltercargosources
|
# see https://crane.dev/API.html#cranelibfiltercargosources
|
||||||
@@ -35,6 +37,8 @@ let
|
|||||||
env = {
|
env = {
|
||||||
ROCKSDB_INCLUDE_DIR = "${rocksdb}/include";
|
ROCKSDB_INCLUDE_DIR = "${rocksdb}/include";
|
||||||
ROCKSDB_LIB_DIR = "${rocksdb}/lib";
|
ROCKSDB_LIB_DIR = "${rocksdb}/lib";
|
||||||
|
CARGO_PROFILE = profile;
|
||||||
|
RUSTFLAGS = rustflags;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
{
|
{
|
||||||
perSystem =
|
perSystem =
|
||||||
{
|
{
|
||||||
|
self',
|
||||||
pkgs,
|
pkgs,
|
||||||
craneLib,
|
craneLib,
|
||||||
...
|
...
|
||||||
@@ -12,7 +13,22 @@
|
|||||||
{
|
{
|
||||||
packages = {
|
packages = {
|
||||||
rocksdb = pkgs.callPackage ./rocksdb.nix { };
|
rocksdb = pkgs.callPackage ./rocksdb.nix { };
|
||||||
default = pkgs.callPackage ./continuwuity.nix { inherit self craneLib; };
|
default = pkgs.callPackage ./continuwuity.nix {
|
||||||
|
inherit self craneLib;
|
||||||
|
# extra features via `cargoExtraArgs`
|
||||||
|
cargoExtraArgs = "-F http3";
|
||||||
|
# extra RUSTFLAGS via `rustflags`
|
||||||
|
# the stuff below is required for http3
|
||||||
|
rustflags = "--cfg reqwest_unstable";
|
||||||
|
};
|
||||||
|
# users may also override this with other cargo profiles to build for other feature sets
|
||||||
|
#
|
||||||
|
# other examples include:
|
||||||
|
#
|
||||||
|
# - release-high-perf
|
||||||
|
max-perf = self'.packages.default.override {
|
||||||
|
profile = "release-max-perf";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,9 @@ This document provides information about downloading and deploying the Debian pa
|
|||||||
|
|
||||||
To add the Continuwuation apt repository:
|
To add the Continuwuation apt repository:
|
||||||
```bash
|
```bash
|
||||||
# Replace with `"dev"` for bleeding-edge builds at your own risk
|
# Component `"stable"` contains all tagged releases. Use `"stable unstable"` to additionally include all pre-releases (alpha, beta, rc,...)
|
||||||
|
# Replace with `"dev"` for bleeding-edge builds at your own risk, these contain
|
||||||
|
# automatic nightly builds and might or might not work.
|
||||||
export COMPONENT="stable"
|
export COMPONENT="stable"
|
||||||
# Import the Continuwuation signing key
|
# Import the Continuwuation signing key
|
||||||
sudo curl https://forgejo.ellis.link/api/packages/continuwuation/debian/repository.key -o /etc/apt/keyrings/forgejo-continuwuation.asc
|
sudo curl https://forgejo.ellis.link/api/packages/continuwuation/debian/repository.key -o /etc/apt/keyrings/forgejo-continuwuation.asc
|
||||||
|
|||||||
@@ -53,6 +53,10 @@ pub(crate) async fn request_3pid_management_token_via_email_route(
|
|||||||
State(services): State<crate::State>,
|
State(services): State<crate::State>,
|
||||||
body: Ruma<request_3pid_management_token_via_email::v3::Request>,
|
body: Ruma<request_3pid_management_token_via_email::v3::Request>,
|
||||||
) -> Result<request_3pid_management_token_via_email::v3::Response> {
|
) -> Result<request_3pid_management_token_via_email::v3::Response> {
|
||||||
|
if !services.threepid.email_requirement().may_change() {
|
||||||
|
return Err!(Request(Forbidden("You may not change your email address.")));
|
||||||
|
}
|
||||||
|
|
||||||
let Ok(email) = Address::try_from(body.email.clone()) else {
|
let Ok(email) = Address::try_from(body.email.clone()) else {
|
||||||
return Err!(Request(InvalidParam("Invalid email address.")));
|
return Err!(Request(InvalidParam("Invalid email address.")));
|
||||||
};
|
};
|
||||||
@@ -105,6 +109,10 @@ pub(crate) async fn add_3pid_route(
|
|||||||
) -> Result<add_3pid::v3::Response> {
|
) -> Result<add_3pid::v3::Response> {
|
||||||
let sender_user = body.sender_user();
|
let sender_user = body.sender_user();
|
||||||
|
|
||||||
|
if !services.threepid.email_requirement().may_change() {
|
||||||
|
return Err!(Request(Forbidden("You may not change your email address.")));
|
||||||
|
}
|
||||||
|
|
||||||
// Require password auth to add an email
|
// Require password auth to add an email
|
||||||
let _ = services
|
let _ = services
|
||||||
.uiaa
|
.uiaa
|
||||||
@@ -138,6 +146,10 @@ pub(crate) async fn delete_3pid_route(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !services.threepid.email_requirement().may_remove() {
|
||||||
|
return Err!(Request(Forbidden("You may not remove your email address.")));
|
||||||
|
}
|
||||||
|
|
||||||
if services
|
if services
|
||||||
.threepid
|
.threepid
|
||||||
.disassociate_localpart_email(sender_user.localpart())
|
.disassociate_localpart_email(sender_user.localpart())
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ pub(crate) async fn get_capabilities_route(
|
|||||||
|
|
||||||
// Only allow 3pid changes if SMTP is configured
|
// Only allow 3pid changes if SMTP is configured
|
||||||
capabilities.thirdparty_id_changes = ThirdPartyIdChangesCapability {
|
capabilities.thirdparty_id_changes = ThirdPartyIdChangesCapability {
|
||||||
enabled: services.mailer.mailer().is_some(),
|
enabled: services.threepid.email_requirement().may_change(),
|
||||||
};
|
};
|
||||||
|
|
||||||
capabilities.get_login_token = GetLoginTokenCapability {
|
capabilities.get_login_token = GetLoginTokenCapability {
|
||||||
|
|||||||
@@ -2516,6 +2516,9 @@ pub struct SmtpConfig {
|
|||||||
/// Whether to require that users provide an email address when they
|
/// Whether to require that users provide an email address when they
|
||||||
/// register.
|
/// register.
|
||||||
///
|
///
|
||||||
|
/// If either this option or `require_email_for_token_registration` are set,
|
||||||
|
/// users will not be allowed to remove their email address.
|
||||||
|
///
|
||||||
/// default: false
|
/// default: false
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub require_email_for_registration: bool,
|
pub require_email_for_registration: bool,
|
||||||
@@ -2545,7 +2548,6 @@ const DEPRECATED_KEYS: &[&str] = &[
|
|||||||
"well_known_support_role",
|
"well_known_support_role",
|
||||||
"well_known_support_email",
|
"well_known_support_email",
|
||||||
"well_known_support_mxid",
|
"well_known_support_mxid",
|
||||||
"registration_token_file",
|
|
||||||
"well_known.rtc_focus_server_urls",
|
"well_known.rtc_focus_server_urls",
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ use std::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use base64::{Engine as _, engine::general_purpose::URL_SAFE_NO_PAD};
|
use base64::{Engine as _, engine::general_purpose::URL_SAFE_NO_PAD};
|
||||||
|
use conduwuit::info;
|
||||||
use conduwuit_core::{
|
use conduwuit_core::{
|
||||||
Error, Event, Result, at, debug, err, error,
|
Error, Event, Result, at, debug, err, error,
|
||||||
result::LogErr,
|
result::LogErr,
|
||||||
@@ -866,9 +867,12 @@ impl Service {
|
|||||||
|
|
||||||
for (event_id, result) in result.iter().flat_map(|resp| resp.pdus.iter()) {
|
for (event_id, result) in result.iter().flat_map(|resp| resp.pdus.iter()) {
|
||||||
if let Err(e) = result {
|
if let Err(e) = result {
|
||||||
warn!(
|
info!(
|
||||||
%txn_id, %server,
|
%txn_id,
|
||||||
"error sending PDU {event_id} to remote server: {e:?}"
|
%server,
|
||||||
|
%event_id,
|
||||||
|
remote_error=?e,
|
||||||
|
"remote server encountered an error while processing an event"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,23 @@ pub struct Service {
|
|||||||
ratelimiter: DefaultKeyedRateLimiter<Address>,
|
ratelimiter: DefaultKeyedRateLimiter<Address>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub enum EmailRequirement {
|
||||||
|
/// Users may change their email, but cannot remove it entirely.
|
||||||
|
Required,
|
||||||
|
/// Users may change or remove their email.
|
||||||
|
Optional,
|
||||||
|
/// Users may not change their email at all.
|
||||||
|
Unavailable,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl EmailRequirement {
|
||||||
|
#[must_use]
|
||||||
|
pub fn may_change(&self) -> bool { matches!(self, Self::Required | Self::Optional) }
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
|
pub fn may_remove(&self) -> bool { matches!(self, Self::Optional) }
|
||||||
|
}
|
||||||
|
|
||||||
struct Data {
|
struct Data {
|
||||||
localpart_email: Arc<Map>,
|
localpart_email: Arc<Map>,
|
||||||
email_localpart: Arc<Map>,
|
email_localpart: Arc<Map>,
|
||||||
@@ -64,6 +81,19 @@ impl Service {
|
|||||||
Quota::per_minute(nonzero!(10_u32)).allow_burst(nonzero!(2_u32));
|
Quota::per_minute(nonzero!(10_u32)).allow_burst(nonzero!(2_u32));
|
||||||
const VALIDATION_URL_PATH: &str = "/_continuwuity/3pid/email/validate";
|
const VALIDATION_URL_PATH: &str = "/_continuwuity/3pid/email/validate";
|
||||||
|
|
||||||
|
/// Check if users are required to have an email address.
|
||||||
|
pub fn email_requirement(&self) -> EmailRequirement {
|
||||||
|
if let Some(smtp) = &self.services.config.smtp {
|
||||||
|
if smtp.require_email_for_registration || smtp.require_email_for_token_registration {
|
||||||
|
EmailRequirement::Required
|
||||||
|
} else {
|
||||||
|
EmailRequirement::Optional
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
EmailRequirement::Unavailable
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Send a validation message to an email address.
|
/// Send a validation message to an email address.
|
||||||
///
|
///
|
||||||
/// Returns the validation session ID on success.
|
/// Returns the validation session ID on success.
|
||||||
@@ -234,6 +264,9 @@ impl Service {
|
|||||||
| None => {
|
| None => {
|
||||||
// The supplied email is not already in use.
|
// The supplied email is not already in use.
|
||||||
|
|
||||||
|
// Remove the user's existing email first.
|
||||||
|
let _ = self.disassociate_localpart_email(localpart).await;
|
||||||
|
|
||||||
let email: &str = email.as_ref();
|
let email: &str = email.as_ref();
|
||||||
self.db.localpart_email.insert(localpart, email);
|
self.db.localpart_email.insert(localpart, email);
|
||||||
self.db.email_localpart.insert(email, localpart);
|
self.db.email_localpart.insert(email, localpart);
|
||||||
|
|||||||
Reference in New Issue
Block a user