Review of "Clipboard with Passwords" version cwp v1 (1)

Details Page Preview

Clipboard history manager with a built-in password vault: encrypted storage, search, copy-all and paste buttons

Extension Homepage
https://github.com/sergolova/clipboard-with-passwords

No comments.

FAQ

Files

Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.

Shexli (experimental) warning 4 manual_review 1

Shexli found 5 issues that may need reviewer attention.

EGO-A-005 manual_review

extensions should not access the clipboard directly

Direct clipboard access via `St.Clipboard.get_default()` requires reviewer scrutiny.

Review Guidelines

  • extension.js:124
    St.Clipboard.get_default()
  • passwordVaultDialog.js:25
    St.Clipboard.get_default()

EGO-A-004 warning

extension files should not contain excessive ungated console logging

File contains 7 ungated console.log/warn/error calls (threshold: 5).

No excessive logging

  • extension.js:1092
    console.error('Error fetching URL metadata:', e)
  • extension.js:1860
    console.error('Clipboard Indicator: Failed to refresh indicator')
  • extension.js:1861
    console.error(e)
  • extension.js:2109
    console.error(e)
  • extension.js:2237
    console.error('Clipboard Indicator: Failed to update registry')
  • extension.js:2238
    console.error(e)
  • extension.js:223
    console.warn('Clipboard Indicator: password-vault-path fallback used', e)

EGO-X-003 warning

extensions should not call run_dispose in extension code

Extension code should not call `run_dispose()`.

GObject.Object.run_dispose

  • keyboard.js:37
    this.#device.run_dispose()

EGO-X-004 warning

extensions should avoid synchronous file IO in shell code

Shell code should avoid synchronous file IO APIs like `GLib.file_get_contents()` and `Gio.File.load_contents()`.

File Operations

  • registry.js:76
    file.load_contents(null)
  • registry.js:219
    file.load_contents(null)
  • urlMetadataManager.js:176
    file.load_contents(null)

EGO-L-003 warning

signals connected by extension should be disconnected in disable()

Signals assigned in `enable()` are missing matching disconnect calls in `disable()` or its helper methods.

Disconnect all signals

  • extension.js:656
    this.clearMenuItem.connect('activate', this._removeAll.bind(this))
  • extension.js:1453
                menuItem.imagePreviewBtn.connect('clicked', () => {
                    this.#cancelHoverPreview(menuItem);
                    this.#showImagePreview(entry);
                })
  • extension.js:1491
                menuItem.editBtn.connect('clicked', () => showEditDialog(menuItem, {
                    onSave: () => this._saveEditedItem(menuItem),
                }))
  • extension.js:1534
                menuItem.protectBtn.connect('clicked', () => {
                    entry.setProtected(!entry.isProtected());
                    menuItem.protectBtn.visible = entry.isFavorite();
                    menuItem.protectBtn.child.icon_name = entry.isProtected()
                        ? 'security-high-symbol
  • extension.js:1564
            menuItem.pasteBtn.connect('clicked',
                () => this.#pasteItem(menuItem)
            )
  • extension.js:1584
            menuItem.tagBtn.connect('clicked', () => showTagDialog(menuItem, {
                onSaved: () => this._updateCache(),
            }))
  • extension.js:2254
            dialog.connect('closed', () => {
                const i = this._vaultDialogs.indexOf(dialog);
                if (i !== -1) {
                    this._vaultDialogs.splice(i, 1);
                }
            })
  • extension.js:1457
                menuItem.imagePreviewBtn.connect('enter-event', () => {
                    this.#cancelHoverPreview(menuItem);
                    if (PREVIEW_ON_HOVER) {
                        menuItem.imagePreviewBtn._cwpHoverPreviewId = setTimeout(() => {
                            menuItem.imagePreviewBtn._cwpHo
  • extension.js:1346
            menuItem.actor.connect('key-press-event', (actor, event) => {
                switch (event.get_key_symbol()) {
                    case Clutter.KEY_Delete:
                        if (menuItem.entry.isFavorite()) {
                            if (CONFIRM_ON_PINNED_DELETE) {
                                this
  • extension.js:1469
                menuItem.imagePreviewBtn.connect('leave-event', () => {
                    this.#cancelHoverPreview(menuItem);
                    this.imagePreview.close();
                })
  • extension.js:197
            this.menu.connect('open-state-changed', (menu, isOpen) => {
                if (!isOpen) {
                    // Never leave a stale image preview behind when the menu
                    // closes while a hover preview is up.
                    this.imagePreview.close();
                    this.menu.sourceA
  • extension.js:523
            this.menu.connect('open-state-changed', (self, open) => {
                this._setFocusOnOpenTimeout = setTimeout(() => {
                    if (!open) return;
    
                    // Belt & braces: re-check the theme marker every time the menu
                    // opens in case the scheme changed while
  • extension.js:648
            this.resetTimerButton.connect('clicked', () => {
                this._scheduleNextHistoryClear();
            })
  • extension.js:668
    this.settingsMenuItem.connect('activate', this._openSettings.bind(this))

All Versions

Version Status
cwp v1 (1) Unreviewed