#!/usr/bin/python3 -I
# Unlock the GNOME "login" keyring with a password read from stdin.
# Exit 0 if the keyring ends up unlocked, 1 otherwise.
import sys
import gi
gi.require_version("Gio", "2.0")
from gi.repository import Gio, GLib

BUS_NAME = "org.freedesktop.secrets"
SERVICE = "/org/freedesktop/secrets"
COLLECTION = "/org/freedesktop/secrets/collection/login"

password = sys.stdin.buffer.read().rstrip(b"\n")
bus = Gio.bus_get_sync(Gio.BusType.SESSION)

def call(path, iface, method, args, rtype):
    return bus.call_sync(BUS_NAME, path, iface, method, args,
                         GLib.VariantType(rtype), Gio.DBusCallFlags.NONE, -1, None).unpack()

def locked():
    return call(COLLECTION, "org.freedesktop.DBus.Properties", "Get",
                GLib.Variant("(ss)", ("org.freedesktop.Secret.Collection", "Locked")), "(v)")[0]

try:
    if not locked():
        sys.exit(0)
except GLib.Error as e:
    sys.exit(f"login keyring not available: {e.message}")

_, session = call(SERVICE, "org.freedesktop.Secret.Service", "OpenSession",
                  GLib.Variant("(sv)", ("plain", GLib.Variant("s", ""))), "(vo)")
try:
    call(SERVICE, "org.gnome.keyring.InternalUnsupportedGuiltRiddenInterface",
         "UnlockWithMasterPassword",
         GLib.Variant("(o(oayays))", (COLLECTION, (session, b"", password, "text/plain"))), "()")
except GLib.Error as e:
    print(f"unlock failed: {e.message}", file=sys.stderr)
sys.exit(1 if locked() else 0)
