mirror of
https://github.com/bitwarden/browser
synced 2025-12-06 00:13:28 +00:00
Merge branch 'main' into PM-26250-Explore-options-to-enable-direct-importer-for-mac-app-store-build
This commit is contained in:
@@ -138,7 +138,7 @@ pub async fn import_logins(
|
|||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub(crate) struct BrowserConfig {
|
pub(crate) struct BrowserConfig {
|
||||||
pub name: &'static str,
|
pub name: &'static str,
|
||||||
pub data_dir: &'static str,
|
pub data_dir: &'static [&'static str],
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) static SUPPORTED_BROWSER_MAP: LazyLock<
|
pub(crate) static SUPPORTED_BROWSER_MAP: LazyLock<
|
||||||
@@ -150,11 +150,19 @@ pub(crate) static SUPPORTED_BROWSER_MAP: LazyLock<
|
|||||||
.collect::<std::collections::HashMap<_, _>>()
|
.collect::<std::collections::HashMap<_, _>>()
|
||||||
});
|
});
|
||||||
|
|
||||||
fn get_browser_data_dir(config: &BrowserConfig) -> Result<PathBuf> {
|
fn get_and_validate_data_dir(config: &BrowserConfig) -> Result<PathBuf> {
|
||||||
let dir = dirs::home_dir()
|
for data_dir in config.data_dir.iter() {
|
||||||
.ok_or_else(|| anyhow!("Home directory not found"))?
|
let dir = dirs::home_dir()
|
||||||
.join(config.data_dir);
|
.ok_or_else(|| anyhow!("Home directory not found"))?
|
||||||
Ok(dir)
|
.join(data_dir);
|
||||||
|
if dir.exists() {
|
||||||
|
return Ok(dir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(anyhow!(
|
||||||
|
"Browser user data directory '{:?}' not found",
|
||||||
|
config.data_dir
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -198,13 +206,7 @@ fn load_local_state_for_browser(browser_name: &str) -> Result<(PathBuf, LocalSta
|
|||||||
.get(browser_name)
|
.get(browser_name)
|
||||||
.ok_or_else(|| anyhow!("Unsupported browser: {}", browser_name))?;
|
.ok_or_else(|| anyhow!("Unsupported browser: {}", browser_name))?;
|
||||||
|
|
||||||
let data_dir = get_browser_data_dir(config)?;
|
let data_dir = get_and_validate_data_dir(config)?;
|
||||||
if !data_dir.exists() {
|
|
||||||
return Err(anyhow!(
|
|
||||||
"Browser user data directory '{}' not found",
|
|
||||||
data_dir.display()
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let local_state = load_local_state(&data_dir)?;
|
let local_state = load_local_state(&data_dir)?;
|
||||||
|
|
||||||
|
|||||||
@@ -18,19 +18,22 @@ use crate::{
|
|||||||
pub(crate) const SUPPORTED_BROWSERS: &[BrowserConfig] = &[
|
pub(crate) const SUPPORTED_BROWSERS: &[BrowserConfig] = &[
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Chrome",
|
name: "Chrome",
|
||||||
data_dir: ".config/google-chrome",
|
data_dir: &[".config/google-chrome"],
|
||||||
},
|
},
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Chromium",
|
name: "Chromium",
|
||||||
data_dir: "snap/chromium/common/chromium",
|
data_dir: &["snap/chromium/common/chromium"],
|
||||||
},
|
},
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Brave",
|
name: "Brave",
|
||||||
data_dir: "snap/brave/current/.config/BraveSoftware/Brave-Browser",
|
data_dir: &[
|
||||||
|
"snap/brave/current/.config/BraveSoftware/Brave-Browser",
|
||||||
|
".config/BraveSoftware/Brave-Browser",
|
||||||
|
],
|
||||||
},
|
},
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Opera",
|
name: "Opera",
|
||||||
data_dir: "snap/opera/current/.config/opera",
|
data_dir: &["snap/opera/current/.config/opera", ".config/opera"],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -166,31 +166,31 @@ pub mod sandbox {
|
|||||||
pub(crate) const SUPPORTED_BROWSERS: &[BrowserConfig] = &[
|
pub(crate) const SUPPORTED_BROWSERS: &[BrowserConfig] = &[
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Chrome",
|
name: "Chrome",
|
||||||
data_dir: "Library/Application Support/Google/Chrome",
|
data_dir: &["Library/Application Support/Google/Chrome"],
|
||||||
},
|
},
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Chromium",
|
name: "Chromium",
|
||||||
data_dir: "Library/Application Support/Chromium",
|
data_dir: &["Library/Application Support/Chromium"],
|
||||||
},
|
},
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Microsoft Edge",
|
name: "Microsoft Edge",
|
||||||
data_dir: "Library/Application Support/Microsoft Edge",
|
data_dir: &["Library/Application Support/Microsoft Edge"],
|
||||||
},
|
},
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Brave",
|
name: "Brave",
|
||||||
data_dir: "Library/Application Support/BraveSoftware/Brave-Browser",
|
data_dir: &["Library/Application Support/BraveSoftware/Brave-Browser"],
|
||||||
},
|
},
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Arc",
|
name: "Arc",
|
||||||
data_dir: "Library/Application Support/Arc/User Data",
|
data_dir: &["Library/Application Support/Arc/User Data"],
|
||||||
},
|
},
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Opera",
|
name: "Opera",
|
||||||
data_dir: "Library/Application Support/com.operasoftware.Opera",
|
data_dir: &["Library/Application Support/com.operasoftware.Opera"],
|
||||||
},
|
},
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Vivaldi",
|
name: "Vivaldi",
|
||||||
data_dir: "Library/Application Support/Vivaldi",
|
data_dir: &["Library/Application Support/Vivaldi"],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -25,27 +25,27 @@ pub use signature::*;
|
|||||||
pub(crate) const SUPPORTED_BROWSERS: &[BrowserConfig] = &[
|
pub(crate) const SUPPORTED_BROWSERS: &[BrowserConfig] = &[
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Brave",
|
name: "Brave",
|
||||||
data_dir: "AppData/Local/BraveSoftware/Brave-Browser/User Data",
|
data_dir: &["AppData/Local/BraveSoftware/Brave-Browser/User Data"],
|
||||||
},
|
},
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Chrome",
|
name: "Chrome",
|
||||||
data_dir: "AppData/Local/Google/Chrome/User Data",
|
data_dir: &["AppData/Local/Google/Chrome/User Data"],
|
||||||
},
|
},
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Chromium",
|
name: "Chromium",
|
||||||
data_dir: "AppData/Local/Chromium/User Data",
|
data_dir: &["AppData/Local/Chromium/User Data"],
|
||||||
},
|
},
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Microsoft Edge",
|
name: "Microsoft Edge",
|
||||||
data_dir: "AppData/Local/Microsoft/Edge/User Data",
|
data_dir: &["AppData/Local/Microsoft/Edge/User Data"],
|
||||||
},
|
},
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Opera",
|
name: "Opera",
|
||||||
data_dir: "AppData/Roaming/Opera Software/Opera Stable",
|
data_dir: &["AppData/Roaming/Opera Software/Opera Stable"],
|
||||||
},
|
},
|
||||||
BrowserConfig {
|
BrowserConfig {
|
||||||
name: "Vivaldi",
|
name: "Vivaldi",
|
||||||
data_dir: "AppData/Local/Vivaldi/User Data",
|
data_dir: &["AppData/Local/Vivaldi/User Data"],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "node scripts/build.js",
|
"build": "napi build --platform --js false",
|
||||||
"test": "cargo test"
|
"test": "cargo test"
|
||||||
},
|
},
|
||||||
"author": "",
|
"author": "",
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
||||||
const { execSync } = require('child_process');
|
|
||||||
|
|
||||||
const args = process.argv.slice(2);
|
|
||||||
const isRelease = args.includes('--release');
|
|
||||||
|
|
||||||
if (isRelease) {
|
|
||||||
console.log('Building release mode.');
|
|
||||||
} else {
|
|
||||||
console.log('Building debug mode.');
|
|
||||||
process.env.RUST_LOG = 'debug';
|
|
||||||
}
|
|
||||||
|
|
||||||
execSync(`napi build --platform --js false ${isRelease ? '--release' : ''}`, { stdio: 'inherit', env: process.env });
|
|
||||||
@@ -961,7 +961,7 @@ pub mod logging {
|
|||||||
};
|
};
|
||||||
use tracing::Level;
|
use tracing::Level;
|
||||||
use tracing_subscriber::{
|
use tracing_subscriber::{
|
||||||
filter::EnvFilter,
|
filter::{EnvFilter, LevelFilter},
|
||||||
fmt::format::{DefaultVisitor, Writer},
|
fmt::format::{DefaultVisitor, Writer},
|
||||||
layer::SubscriberExt,
|
layer::SubscriberExt,
|
||||||
util::SubscriberInitExt,
|
util::SubscriberInitExt,
|
||||||
@@ -1049,17 +1049,9 @@ pub mod logging {
|
|||||||
pub fn init_napi_log(js_log_fn: ThreadsafeFunction<(LogLevel, String), CalleeHandled>) {
|
pub fn init_napi_log(js_log_fn: ThreadsafeFunction<(LogLevel, String), CalleeHandled>) {
|
||||||
let _ = JS_LOGGER.0.set(js_log_fn);
|
let _ = JS_LOGGER.0.set(js_log_fn);
|
||||||
|
|
||||||
// the log level hierarchy is determined by:
|
|
||||||
// - if RUST_LOG is detected at runtime
|
|
||||||
// - if RUST_LOG is provided at compile time
|
|
||||||
// - default to INFO
|
|
||||||
let filter = EnvFilter::builder()
|
let filter = EnvFilter::builder()
|
||||||
.with_default_directive(
|
// set the default log level to INFO.
|
||||||
option_env!("RUST_LOG")
|
.with_default_directive(LevelFilter::INFO.into())
|
||||||
.unwrap_or("info")
|
|
||||||
.parse()
|
|
||||||
.expect("should provide valid log level at compile time."),
|
|
||||||
)
|
|
||||||
// parse directives from the RUST_LOG environment variable,
|
// parse directives from the RUST_LOG environment variable,
|
||||||
// overriding the default directive for matching targets.
|
// overriding the default directive for matching targets.
|
||||||
.from_env_lossy();
|
.from_env_lossy();
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ type CharacterType = "letter" | "emoji" | "special" | "number";
|
|||||||
@Component({
|
@Component({
|
||||||
selector: "bit-color-password",
|
selector: "bit-color-password",
|
||||||
template: `@for (character of passwordCharArray(); track $index; let i = $index) {
|
template: `@for (character of passwordCharArray(); track $index; let i = $index) {
|
||||||
<span [class]="getCharacterClass(character)">
|
<span [class]="getCharacterClass(character)" class="tw-font-mono">
|
||||||
<span>{{ character }}</span>
|
<span>{{ character }}</span>
|
||||||
@if (showCount()) {
|
@if (showCount()) {
|
||||||
<span class="tw-whitespace-nowrap tw-text-xs tw-leading-5 tw-text-main">{{ i + 1 }}</span>
|
<span class="tw-whitespace-nowrap tw-text-xs tw-leading-5 tw-text-main">{{ i + 1 }}</span>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { formatArgsForCodeSnippet } from "../../../../.storybook/format-args-for
|
|||||||
|
|
||||||
import { ColorPasswordComponent } from "./color-password.component";
|
import { ColorPasswordComponent } from "./color-password.component";
|
||||||
|
|
||||||
const examplePassword = "Wq$Jk😀7jlI DX#rS5Sdi!z ";
|
const examplePassword = "Wq$Jk😀7jlI DX#rS5Sdi!z0O ";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
title: "Component Library/Color Password",
|
title: "Component Library/Color Password",
|
||||||
|
|||||||
@@ -23,7 +23,11 @@
|
|||||||
(keydown)="handleKeyDown($event)"
|
(keydown)="handleKeyDown($event)"
|
||||||
>
|
>
|
||||||
<ng-content></ng-content>
|
<ng-content></ng-content>
|
||||||
<div class="tw-sticky tw-bottom-0 tw-left-0 tw-z-20 tw-mt-auto tw-w-full tw-bg-background-alt3">
|
<!-- 53rem = ~850px -->
|
||||||
|
<!-- This is a magic number. This number was selected by going to the UI and finding the number that felt the best to me and design. No real rhyme or reason :) -->
|
||||||
|
<div
|
||||||
|
class="[@media(min-height:53rem)]:tw-sticky tw-bottom-0 tw-left-0 tw-z-20 tw-mt-auto tw-w-full tw-bg-background-alt3"
|
||||||
|
>
|
||||||
<bit-nav-divider></bit-nav-divider>
|
<bit-nav-divider></bit-nav-divider>
|
||||||
@if (data.open) {
|
@if (data.open) {
|
||||||
<ng-content select="[slot=footer]"></ng-content>
|
<ng-content select="[slot=footer]"></ng-content>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<div class="tw-flex tw-items-center tw-justify-center" style="width: 40px; height: 40px">
|
<div class="tw-flex tw-items-center tw-justify-center" style="width: 40px; height: 40px">
|
||||||
<app-vault-icon [cipher]="cipher()" [coloredIcon]="true"></app-vault-icon>
|
<app-vault-icon [cipher]="cipher()" [coloredIcon]="true"></app-vault-icon>
|
||||||
</div>
|
</div>
|
||||||
<h2 bitTypography="h4" class="tw-ml-2 tw-mt-2" data-testid="item-name">
|
<h2 bitTypography="h4" class="tw-ml-2 tw-mt-2 tw-select-auto" data-testid="item-name">
|
||||||
{{ cipher().name }}
|
{{ cipher().name }}
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user