chore: update version to 1.4.8
This commit is contained in:
@@ -1,5 +1,22 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 1.4.8 (2026-03-23)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
- **Email**: Add support for marking emails as answered or forwarded and display status icons in email list and thread views
|
||||||
|
- **Email**: Enhance identity selection by supporting sub-addressing (plus addressing) in email composer
|
||||||
|
- **Settings**: Add notification settings with sound picker, preview playback, and configurable alert sounds
|
||||||
|
- **Settings**: Add default mail program settings with localization support across all locales
|
||||||
|
- **Auth**: Implement path prefix handling for OAuth callbacks and login redirects, enabling reverse proxy deployments
|
||||||
|
- **Validation**: Add all multi-part TLDs for domain validation in favicon API (#81)
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
- **Calendar**: Fix bugs in duration parsing, RFC compliance, and event handling across calendar components
|
||||||
|
- **Calendar**: Detect tasks created by external CalDAV clients such as Thunderbird
|
||||||
|
- **Settings**: Enhance account settings with username and authentication method display (#90)
|
||||||
|
|
||||||
## 1.4.7 (2026-03-21)
|
## 1.4.7 (2026-03-21)
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import { Mail, AlertCircle, Loader2, X, Info, Eye, EyeOff, LogIn, Sun, Moon, Mon
|
|||||||
import { discoverOAuth, type OAuthMetadata } from "@/lib/oauth/discovery";
|
import { discoverOAuth, type OAuthMetadata } from "@/lib/oauth/discovery";
|
||||||
import { generateCodeVerifier, generateCodeChallenge, generateState } from "@/lib/oauth/pkce";
|
import { generateCodeVerifier, generateCodeChallenge, generateState } from "@/lib/oauth/pkce";
|
||||||
import { OAUTH_SCOPES } from "@/lib/oauth/tokens";
|
import { OAUTH_SCOPES } from "@/lib/oauth/tokens";
|
||||||
import { getPathPrefix } from "@/lib/browser-navigation";
|
|
||||||
|
|
||||||
const APP_VERSION = "1.4.7";
|
const APP_VERSION = "1.4.7";
|
||||||
|
|
||||||
@@ -149,7 +148,7 @@ export default function LoginPage() {
|
|||||||
if (!serverUrl) return;
|
if (!serverUrl) return;
|
||||||
const handleClickOutside = (event: MouseEvent) => {
|
const handleClickOutside = (event: MouseEvent) => {
|
||||||
if (suggestionsRef.current && !suggestionsRef.current.contains(event.target as Node) &&
|
if (suggestionsRef.current && !suggestionsRef.current.contains(event.target as Node) &&
|
||||||
inputRef.current && !inputRef.current.contains(event.target as Node)) {
|
inputRef.current && !inputRef.current.contains(event.target as Node)) {
|
||||||
setShowSuggestions(false);
|
setShowSuggestions(false);
|
||||||
}
|
}
|
||||||
if (themeMenuRef.current && !themeMenuRef.current.contains(event.target as Node)) {
|
if (themeMenuRef.current && !themeMenuRef.current.contains(event.target as Node)) {
|
||||||
@@ -181,8 +180,7 @@ export default function LoginPage() {
|
|||||||
const startServerSideSso = useCallback(async () => {
|
const startServerSideSso = useCallback(async () => {
|
||||||
setOauthLoading(true);
|
setOauthLoading(true);
|
||||||
try {
|
try {
|
||||||
const prefix = getPathPrefix(params.locale as string);
|
const redirectUri = `${window.location.origin}/${params.locale}/auth/callback`;
|
||||||
const redirectUri = `${window.location.origin}${prefix}/${params.locale}/auth/callback`;
|
|
||||||
const res = await fetch('/api/auth/sso/start', {
|
const res = await fetch('/api/auth/sso/start', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
@@ -360,8 +358,7 @@ export default function LoginPage() {
|
|||||||
const verifier = generateCodeVerifier();
|
const verifier = generateCodeVerifier();
|
||||||
const challenge = await generateCodeChallenge(verifier);
|
const challenge = await generateCodeChallenge(verifier);
|
||||||
const state = generateState();
|
const state = generateState();
|
||||||
const prefix = getPathPrefix(params.locale as string);
|
const redirectUri = `${window.location.origin}/${params.locale}/auth/callback`;
|
||||||
const redirectUri = `${window.location.origin}${prefix}/${params.locale}/auth/callback`;
|
|
||||||
|
|
||||||
sessionStorage.setItem("oauth_code_verifier", verifier);
|
sessionStorage.setItem("oauth_code_verifier", verifier);
|
||||||
sessionStorage.setItem("oauth_state", state);
|
sessionStorage.setItem("oauth_state", state);
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "bulwark-webmail",
|
"name": "bulwark-webmail",
|
||||||
"version": "1.4.7",
|
"version": "1.4.8",
|
||||||
"description": "Bulwark Webmail — a modern webmail client built for Stalwart Mail Server",
|
"description": "Bulwark Webmail — a modern webmail client built for Stalwart Mail Server",
|
||||||
"author": "Bulwark Webmail <bulwark@rbm.systems>",
|
"author": "Bulwark Webmail <bulwark@rbm.systems>",
|
||||||
"license": "AGPL-3.0-only",
|
"license": "AGPL-3.0-only",
|
||||||
|
|||||||
Reference in New Issue
Block a user