* feat: (wip) authorize note access
* fix: remove multiEditorEnabled
* refactor: update SNJS + eslint
* refactor: remove privileges in favor of SNJS protections
* fix: do not close editor when editing an archived note
* chore: remove progress indicator for webpack dev server
* fix: add rel="noreferrer" to bugsnag links
* chore(deps): upgrade snjs
* chore(deps): upgrade snjs
* feat: batch manager protection + react challenge modal + eslint fix
* fix: lint errors
* fix: launch state error
* fix: challenge modal: cancel instead of dismiss when pressing escape
* feat: improve focus styles
* fix: cancel session revoking when pressing escape on confirm dialog
* fix: lint warning
* chore(deps): upgrade minor versions
* feat: make SNWebCrypto a constant
* feat: add random identifier to bugsnag reports
* fix: check onKeyUp instead of onKeyDown
* feat: implement SNJS backup file password retrieval
* chore(deps): upgrade snjs
* feat: display warning banner when using the app with no account
* fix: properly color svg button
* fix: wording
* fix: hide account warning after login + improve key storage wording
* chore(deps): upgrade stylekit
* feat: use stylekit fonts for the editor
* chore(deps): bump nokogiri from 1.10.8 to 1.11.1 (#511)
Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.10.8 to 1.11.1.
- [Release notes](https://github.com/sparklemotion/nokogiri/releases)
- [Changelog](https://github.com/sparklemotion/nokogiri/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.10.8...v1.11.1)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com>
* chore(deps): bump ini from 1.3.5 to 1.3.8 (#504)
Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.8.
- [Release notes](https://github.com/isaacs/ini/releases)
- [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.8)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com>
* fix: rename master branch to main
* fix: add missing placeholders for submodules (#516)
Co-authored-by: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com>
* chore(deps): upgrade snjs, babel, typescript, reach, mobx, preact
* feat: clear protection session
* fix: use correct close icon size
* fix: hide protections paragraph when no account or passcode exist
* chore(deps): remove unused dependencies
* fix: button casing
* feat: implement SNApplication.hasProtectionSources
* chore(version): 3.6.0
* feat: enable sessions management for every build
* feat: make "Protected" flag more subtle
* fix: only match protected note title
* fix: remove inconsistencies between protected note label and date
* feat: show warning when protecting a note with no protection source
* feat: make unprotecting a note a protected action
* chore(deps): upgrade snjs
* chore(version): 3.6.0-beta01
* fix: run docker with root to fix crashing on Linux (undoes 62da387d3a) (#525)
* feat: make encrypted backups protected (#524)
Co-authored-by: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: proletarius101 <54175165+proletarius101@users.noreply.github.com>
Co-authored-by: Darius JJ Chuck <79410894+standarius@users.noreply.github.com>
Co-authored-by: Antonella Sgarlatta <antonella@standardnotes.org>
123 lines
3.4 KiB
TypeScript
123 lines
3.4 KiB
TypeScript
import { isNullOrUndefined, SNLog } from '@standardnotes/snjs';
|
|
import { isDesktopApplication, isDev } from '@/utils';
|
|
import { storage, StorageKey } from './localStorage';
|
|
import Bugsnag from '@bugsnag/js';
|
|
import { WebCrypto } from '../crypto';
|
|
|
|
declare const __VERSION__: string;
|
|
declare global {
|
|
interface Window {
|
|
// eslint-disable-next-line camelcase
|
|
_bugsnag_api_key?: string;
|
|
}
|
|
}
|
|
|
|
function redactFilePath(line: string): string {
|
|
const fileName = line.match(/\w+\.(html|js)/)?.[0];
|
|
const redacted = '<redacted file path>';
|
|
if (fileName) {
|
|
return redacted + '/' + fileName;
|
|
} else {
|
|
return redacted;
|
|
}
|
|
}
|
|
|
|
export function startErrorReporting(): void {
|
|
const disableErrorReporting = storage.get(StorageKey.DisableErrorReporting);
|
|
if (
|
|
/**
|
|
* Error reporting used to be opt-out, but is now opt-in, so
|
|
* treat the absence of an error reporting preference as an indication
|
|
* to disable error reporting.
|
|
*/
|
|
isNullOrUndefined(disableErrorReporting) ||
|
|
disableErrorReporting ||
|
|
!window._bugsnag_api_key
|
|
) {
|
|
SNLog.onError = console.error;
|
|
return;
|
|
}
|
|
try {
|
|
const storedUserId = storage.get(StorageKey.AnonymousUserId);
|
|
let anonymousUserId: string;
|
|
if (storedUserId === null) {
|
|
anonymousUserId = WebCrypto.generateUUIDSync();
|
|
storage.set(StorageKey.AnonymousUserId, anonymousUserId);
|
|
} else {
|
|
anonymousUserId = storedUserId;
|
|
}
|
|
|
|
Bugsnag.start({
|
|
apiKey: window._bugsnag_api_key,
|
|
appType: isDesktopApplication() ? 'desktop' : 'web',
|
|
appVersion: __VERSION__,
|
|
collectUserIp: false,
|
|
autoTrackSessions: false,
|
|
releaseStage: isDev ? 'development' : undefined,
|
|
enabledBreadcrumbTypes: ['error', 'log'],
|
|
onError(event) {
|
|
event.setUser(anonymousUserId);
|
|
|
|
/**
|
|
* Redact any data that could be used to identify user,
|
|
* such as file paths.
|
|
*/
|
|
if (isDesktopApplication()) {
|
|
if (event.context) {
|
|
event.context = `Desktop/${redactFilePath(event.context)}`;
|
|
}
|
|
}
|
|
|
|
if (event.request.url?.includes('file:')) {
|
|
event.request.url = redactFilePath(event.request.url);
|
|
}
|
|
|
|
const originalStack = event.originalError.stack;
|
|
if (
|
|
typeof originalStack === 'string' &&
|
|
originalStack.includes('file:')
|
|
) {
|
|
event.originalError.stack = originalStack
|
|
.split('\n')
|
|
.map((line) =>
|
|
line.includes('file:') ? redactFilePath(line) : line
|
|
)
|
|
.join('\n');
|
|
}
|
|
|
|
for (const error of event.errors) {
|
|
for (const stackFrame of error.stacktrace) {
|
|
if (stackFrame.file.includes('file:')) {
|
|
stackFrame.file = redactFilePath(stackFrame.file);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
});
|
|
|
|
if (isDev) {
|
|
SNLog.onError = console.error;
|
|
} else {
|
|
SNLog.onError = (error) => {
|
|
Bugsnag.notify(error);
|
|
};
|
|
}
|
|
} catch (error) {
|
|
console.error('Failed to start Bugsnag.', error);
|
|
SNLog.onError = console.error;
|
|
}
|
|
}
|
|
|
|
export function disableErrorReporting() {
|
|
storage.remove(StorageKey.AnonymousUserId);
|
|
storage.set(StorageKey.DisableErrorReporting, true);
|
|
}
|
|
|
|
export function enableErrorReporting() {
|
|
storage.set(StorageKey.DisableErrorReporting, false);
|
|
}
|
|
|
|
export function errorReportingId() {
|
|
return storage.get(StorageKey.AnonymousUserId);
|
|
}
|