Compare commits

..

8 Commits

Author SHA1 Message Date
Leendert de Borst
511ec31d17 Bump version to 0.17.3 (#854) 2025-05-20 15:31:22 +02:00
Leendert de Borst
080e505991 Merge branch '850-prepare-0172-release' into 854-prepare-0173-release
* 850-prepare-0172-release:
  Bump version to 0.17.2 (#850)
2025-05-20 15:29:11 +02:00
Leendert de Borst
461c1a042d Silently fail incorrect 2FA codes during import instead of throwing exception (#852) 2025-05-20 15:22:09 +02:00
Leendert de Borst
79221f35c6 Bump version to 0.17.2 (#850) 2025-05-17 17:39:16 +02:00
Leendert de Borst
baf81392eb Restore docker-compose.yml container versions to :latest (#848) 2025-05-17 17:14:01 +02:00
Leendert de Borst
1fe7f7d8dc Bump version to 0.17.1 (#843) 2025-05-14 11:23:03 +02:00
Leendert de Borst
e41552a2c0 Fix credential edit password existence check (#840) 2025-05-14 11:05:45 +02:00
Leendert de Borst
8e9c100eac Fix browser extension popup manual search/filter bug (#839) 2025-05-14 11:05:36 +02:00
12 changed files with 89 additions and 46 deletions

View File

@@ -515,7 +515,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 15;
CURRENT_PROJECT_VERSION = 17;
DEVELOPMENT_TEAM = 8PHW4HN3F7;
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = YES;
@@ -530,7 +530,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.14;
MARKETING_VERSION = 0.16.2;
MARKETING_VERSION = 0.17.3;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
@@ -554,7 +554,7 @@
CODE_SIGN_ENTITLEMENTS = AliasVault/AliasVault.entitlements;
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 15;
CURRENT_PROJECT_VERSION = 17;
DEVELOPMENT_TEAM = 8PHW4HN3F7;
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = YES;
@@ -569,7 +569,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.14;
MARKETING_VERSION = 0.16.2;
MARKETING_VERSION = 0.17.3;
OTHER_LDFLAGS = (
"-framework",
SafariServices,

View File

@@ -531,7 +531,7 @@ function handleSearchInput(searchInput: HTMLInputElement, credentials: Credentia
const searchTerm = searchInput.value.toLowerCase();
// Ensure we have unique credentials
const uniqueCredentials = Array.from(new Map(credentials.map(cred => [cred.id, cred])).values());
const uniqueCredentials = Array.from(new Map(credentials.map(cred => [cred.Id, cred])).values());
let filteredCredentials;
if (searchTerm === '') {
@@ -1339,7 +1339,12 @@ async function fetchAndProcessFavicon(url: string, maxSize: number, targetWidth:
*/
async function resizeImage(imageData: Uint8Array, contentType: string, targetWidth: number): Promise<Blob | null> {
return new Promise((resolve) => {
const blob = new Blob([imageData], { type: contentType });
// Convert Uint8Array to ArrayBuffer to ensure compatibility with Blob
const arrayBuffer = imageData.buffer.slice(
imageData.byteOffset,
imageData.byteOffset + imageData.byteLength
) as ArrayBuffer; // Assert as ArrayBuffer to ensure type compatibility
const blob = new Blob([arrayBuffer], { type: contentType });
const img = new Image();
/**

View File

@@ -6,7 +6,7 @@ export class AppInfo {
/**
* The current extension version. This should be updated with each release of the extension.
*/
public static readonly VERSION = '0.17.0';
public static readonly VERSION = '0.17.3';
/**
* The minimum supported AliasVault server (API) version. If the server version is below this, the

View File

@@ -6,7 +6,7 @@ export default defineConfig({
manifest: {
name: "AliasVault",
description: "AliasVault Browser AutoFill Extension. Keeping your personal information private.",
version: "0.17.0",
version: "0.17.3",
content_security_policy: {
extension_pages: "script-src 'self' 'wasm-unsafe-eval'; object-src 'self';"
},

View File

@@ -1035,7 +1035,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = AliasVault/AliasVault.entitlements;
CURRENT_PROJECT_VERSION = 4;
CURRENT_PROJECT_VERSION = 5;
DEVELOPMENT_TEAM = 8PHW4HN3F7;
ENABLE_BITCODE = NO;
GCC_PREPROCESSOR_DEFINITIONS = (
@@ -1050,7 +1050,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 0.17.0;
MARKETING_VERSION = 0.17.3;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -1074,7 +1074,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = AliasVault/AliasVault.entitlements;
CURRENT_PROJECT_VERSION = 4;
CURRENT_PROJECT_VERSION = 5;
DEVELOPMENT_TEAM = 8PHW4HN3F7;
INFOPLIST_FILE = AliasVault/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = AliasVault;
@@ -1084,7 +1084,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 0.17.0;
MARKETING_VERSION = 0.17.3;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -1605,7 +1605,7 @@
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = autofill/autofill.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 4;
CURRENT_PROJECT_VERSION = 5;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 8PHW4HN3F7;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
@@ -1621,7 +1621,7 @@
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 0.17.0;
MARKETING_VERSION = 0.17.3;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
@@ -1650,7 +1650,7 @@
CODE_SIGN_ENTITLEMENTS = autofill/autofill.entitlements;
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 4;
CURRENT_PROJECT_VERSION = 5;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 8PHW4HN3F7;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
@@ -1666,7 +1666,7 @@
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 0.17.0;
MARKETING_VERSION = 0.17.3;
MTL_FAST_MATH = YES;
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
PRODUCT_BUNDLE_IDENTIFIER = net.aliasvault.app.autofill;

View File

@@ -8,7 +8,7 @@ export class AppInfo {
/**
* The current extension version. This should be updated with each release of the extension.
*/
public static readonly VERSION = '0.17.0';
public static readonly VERSION = '0.17.3';
/**
* The minimum supported AliasVault server (API) version. If the server version is below this, the

View File

@@ -813,17 +813,40 @@ class SqliteClient {
// 4. Update Password if changed
if (credential.Password !== existingCredential.Password) {
const passwordQuery = `
UPDATE Passwords
SET Value = ?,
UpdatedAt = ?
// Check if a password record already exists for this credential, if not, then create one.
const passwordRecordExistsQuery = `
SELECT Id
FROM Passwords
WHERE CredentialId = ?`;
const passwordResults = await this.executeQuery(passwordRecordExistsQuery, [credential.Id]);
await this.executeUpdate(passwordQuery, [
credential.Password,
currentDateTime,
credential.Id
]);
if (passwordResults.length === 0) {
// Create a new password record
const passwordQuery = `
INSERT INTO Passwords (Id, Value, CredentialId, CreatedAt, UpdatedAt, IsDeleted)
VALUES (?, ?, ?, ?, ?, ?)`;
await this.executeUpdate(passwordQuery, [
crypto.randomUUID().toUpperCase(),
credential.Password,
credential.Id,
currentDateTime,
currentDateTime,
0
]);
} else {
// Update the existing password record
const passwordQuery = `
UPDATE Passwords
SET Value = ?, UpdatedAt = ?
WHERE CredentialId = ?`;
await this.executeUpdate(passwordQuery, [
credential.Password,
currentDateTime,
credential.Id
]);
}
}
await NativeVaultManager.commitTransaction();

View File

@@ -30,7 +30,7 @@ public static class AppInfo
/// <summary>
/// Gets the patch version number.
/// </summary>
public const int VersionPatch = 0;
public const int VersionPatch = 3;
/// <summary>
/// Gets the minimum supported AliasVault client version. Normally the minimum client version is the same

View File

@@ -4,3 +4,6 @@ Business,,login,Item for business folder,,,0,,crisply,4CSp43uhSZri8A,
,,login,Test,,,0,,test2,asdasd,
Business,,login,TutaNota,,,0,,avtest2@tutamail.com,blabla,otpauth://totp/Strongbox?secret=PLW4SB3PQ7MKVXY2MXF4NEXS6Y&algorithm=SHA1&digits=6&period=30
Business,,login,Aliasvault.net,,,0,https://www.aliasvault.net,root,toor,
Business,,login,TutaNota3,,,0,,avtest3@tutamail.com,blabla,otpauth://totp/Test%20name%3Atest%40test.org?secret=PLW4SB3PQ7MKVXY2MXF4NEXS6Y&issuer=Alias%20Vault
Business,,login,TutaNota4,,,0,,avtest4@tutamail.com,blabla,otpauth://totp/my.email@gmail.com?secret=TEST!INVALID&issuer=Alias%20Vault&algorithm=SHA1&digits=6&period=30
Business,,login,TutaNota5,,,0,,avtest5@tutamail.com,blabla,incorrectstring
1 folder favorite type name notes fields reprompt login_uri login_username login_password login_totp
4 login Test 0 test2 asdasd
5 Business login TutaNota 0 avtest2@tutamail.com blabla otpauth://totp/Strongbox?secret=PLW4SB3PQ7MKVXY2MXF4NEXS6Y&algorithm=SHA1&digits=6&period=30
6 Business login Aliasvault.net 0 https://www.aliasvault.net root toor
7 Business login TutaNota3 0 avtest3@tutamail.com blabla otpauth://totp/Test%20name%3Atest%40test.org?secret=PLW4SB3PQ7MKVXY2MXF4NEXS6Y&issuer=Alias%20Vault
8 Business login TutaNota4 0 avtest4@tutamail.com blabla otpauth://totp/my.email@gmail.com?secret=TEST!INVALID&issuer=Alias%20Vault&algorithm=SHA1&digits=6&period=30
9 Business login TutaNota5 0 avtest5@tutamail.com blabla incorrectstring

View File

@@ -107,7 +107,10 @@ public class ImportExportTests
var importedCredentials = await BitwardenImporter.ImportFromCsvAsync(fileContent);
// Assert
Assert.That(importedCredentials, Has.Count.EqualTo(5));
Assert.That(importedCredentials, Has.Count.EqualTo(8));
// There is one entry which has an invalid TOTP code ("! in the secret), we ensure this logic does not throw a fatal error.
var convertedCredentials = BaseImporter.ConvertToCredential(importedCredentials);
// Test specific entries
var tutaNotaCredential = importedCredentials.First(c => c.ServiceName == "TutaNota");

View File

@@ -53,18 +53,27 @@ public static class BaseImporter
if (!string.IsNullOrEmpty(importedCredential.TwoFactorSecret))
{
// Sanitize the secret key by converting from potential URI to secret key and name.
var (secretKey, name) = TotpHelper.SanitizeSecretKey(importedCredential.TwoFactorSecret);
credential.TotpCodes = new List<TotpCode>
try
{
new()
var (secretKey, name) = TotpHelper.SanitizeSecretKey(importedCredential.TwoFactorSecret);
credential.TotpCodes = new List<TotpCode>
{
Name = name ?? "Authenticator",
SecretKey = secretKey,
CreatedAt = importedCredential.CreatedAt ?? DateTime.UtcNow,
UpdatedAt = importedCredential.UpdatedAt ?? DateTime.UtcNow,
}
};
new()
{
Name = name ?? "Authenticator",
SecretKey = secretKey,
CreatedAt = importedCredential.CreatedAt ?? DateTime.UtcNow,
UpdatedAt = importedCredential.UpdatedAt ?? DateTime.UtcNow,
}
};
}
catch (Exception ex)
{
// 2FA extraction failed, log the error and continue with the next credential
// so the import doesn't fail due to failed 2FA extraction.
Console.WriteLine($"Error importing TOTP code: {ex.Message}");
}
}
credentials.Add(credential);
@@ -72,4 +81,4 @@ public static class BaseImporter
return credentials;
}
}
}

View File

@@ -1,6 +1,6 @@
services:
postgres:
image: ghcr.io/lanedirt/aliasvault-postgres:0.16.1
image: ghcr.io/lanedirt/aliasvault-postgres:latest
volumes:
- ./database/postgres:/var/lib/postgresql/data:rw
env_file:
@@ -14,7 +14,7 @@ services:
start_period: 10s
client:
image: ghcr.io/lanedirt/aliasvault-client:0.16.1
image: ghcr.io/lanedirt/aliasvault-client:latest
volumes:
- ./logs/msbuild:/apps/server/msbuild-logs:rw
expose:
@@ -24,7 +24,7 @@ services:
- .env
api:
image: ghcr.io/lanedirt/aliasvault-api:0.16.1
image: ghcr.io/lanedirt/aliasvault-api:latest
expose:
- "3001"
volumes:
@@ -41,7 +41,7 @@ services:
ConnectionStrings__AliasServerDbContext: "Host=postgres;Database=aliasvault;Username=aliasvault;Password=${POSTGRES_PASSWORD}"
admin:
image: ghcr.io/lanedirt/aliasvault-admin:0.16.1
image: ghcr.io/lanedirt/aliasvault-admin:latest
expose:
- "3002"
volumes:
@@ -58,7 +58,7 @@ services:
ConnectionStrings__AliasServerDbContext: "Host=postgres;Database=aliasvault;Username=aliasvault;Password=${POSTGRES_PASSWORD}"
reverse-proxy:
image: ghcr.io/lanedirt/aliasvault-reverse-proxy:0.16.1
image: ghcr.io/lanedirt/aliasvault-reverse-proxy:latest
ports:
- "${HTTP_PORT:-80}:80"
- "${HTTPS_PORT:-443}:443"
@@ -76,7 +76,7 @@ services:
- .env
smtp:
image: ghcr.io/lanedirt/aliasvault-smtp:0.16.1
image: ghcr.io/lanedirt/aliasvault-smtp:latest
ports:
- "${SMTP_PORT:-25}:25"
- "${SMTP_TLS_PORT:-587}:587"
@@ -93,7 +93,7 @@ services:
ConnectionStrings__AliasServerDbContext: "Host=postgres;Database=aliasvault;Username=aliasvault;Password=${POSTGRES_PASSWORD}"
task-runner:
image: ghcr.io/lanedirt/aliasvault-task-runner:0.16.1
image: ghcr.io/lanedirt/aliasvault-task-runner:latest
volumes:
- ./database:/database:rw
- ./logs:/logs:rw