Verified Commit 2d0f5cb1 authored by Tom Schuster's avatar Tom Schuster Committed by ma1
Browse files

Bug 1701974 - Use x-kde-passwordManagerHint when copying private data to the clipboard. r=stransky

parent da03dd1c
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -66,6 +66,10 @@ static const char kHTMLMarkupPrefix[] =

static const char kURIListMime[] = "text/uri-list";

// MIME to exclude sensitive data (password) from the clipboard history on not
// just KDE.
static const char kKDEPasswordManagerHintMime[] = "x-kde-passwordManagerHint";

MOZ_CONSTINIT ClipboardTargets nsRetrievalContext::sClipboardTargets;
MOZ_CONSTINIT ClipboardTargets nsRetrievalContext::sPrimaryTargets;

@@ -313,6 +317,12 @@ nsClipboard::SetNativeClipboardData(nsITransferable* aTransferable,
    gtk_target_list_add(list, atom, 0, 0);
  }

  // Try to exclude private data from clipboard history.
  if (aTransferable->GetIsPrivateData()) {
    GdkAtom atom = gdk_atom_intern(kKDEPasswordManagerHintMime, FALSE);
    gtk_target_list_add(list, atom, 0, 0);
  }

  // Get GTK clipboard (CLIPBOARD or PRIMARY)
  GtkClipboard* gtkClipboard =
      gtk_clipboard_get(GetSelectionAtom(aWhichClipboard));
@@ -1228,6 +1238,22 @@ void nsClipboard::SelectionGetEvent(GtkClipboard* aClipboard,
    return;
  }

  if (selectionTarget == gdk_atom_intern(kKDEPasswordManagerHintMime, FALSE)) {
    if (!trans->GetIsPrivateData()) {
      MOZ_CLIPBOARD_LOG(
          "  requested %s, but the data isn't actually private!\n",
          kKDEPasswordManagerHintMime);
      return;
    }

    static const char* kSecret = "secret";
    MOZ_CLIPBOARD_LOG("  Setting data to '%s' for %s\n", kSecret,
                      kKDEPasswordManagerHintMime);
    gtk_selection_data_set(aSelectionData, selectionTarget, 8,
                           (const guchar*)kSecret, strlen(kSecret));
    return;
  }

  MOZ_CLIPBOARD_LOG("  Try if we have anything at GetTransferData() for %s\n",
                    GUniquePtr<gchar>(gdk_atom_name(selectionTarget)).get());