Sample code for 30+ languages & platforms
Zig

Windows Credentials Manager / Apple Keychain - List Matching Secrets

See more Secrets Examples

List secrets matching one or more wildcarded names for app, service, domain, and username.

Note: This example requires Chilkat v10.1.0 or later.

Chilkat Zig Downloads

Zig
const std = @import("std");
const chilkat = @import("chilkat");

pub fn main(init: std.process.Init) !void {
    const alloc = init.arena.allocator();

    // This example requires the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    const secrets = try chilkat.Secrets.init();
    defer secrets.deinit();

    // On Windows, this is the Windows Credentials Manager
    // On MacOS/iOS, it is the Apple Keychain
    secrets.setLocation("local_manager");

    // Set wildcarded or exact values for appName, service, domain, and username.
    // Omit any members where anything is allowed to match, or alternatively specify "*" to match anything.
    const json_match = try chilkat.JsonObject.init();
    defer json_match.deinit();
    json_match.updateString("appName", "Test*") catch {};
    json_match.updateString("service", "*") catch {};
    json_match.updateString("domain", "*") catch {};
    json_match.updateString("username", "Starfish*") catch {};

    const results = try chilkat.JsonObject.init();
    defer results.deinit();
    results.setEmitCompact(false);

    secrets.listSecrets(json_match, results) catch {
        std.debug.print("{s}\n", .{try secrets.getLastErrorText(alloc)});
        return;
    };

    std.debug.print("{s}\n", .{try results.emit(alloc)});

    // Sample output on Windows.
    // The "targetName" is purely informational and indicates the raw TargetName of the secret (i.e. Credential) stored in the Credentials Manager.

    // {
    //   "secrets": [
    //     {
    //       "appName": "Test2",
    //       "service": "Custom",
    //       "domain": "Ocean",
    //       "username": "Starfish20",
    //       "targetName": "Test2/Custom/Ocean/Starfish20"
    //     },
    //     {
    //       "appName": "Test2",
    //       "service": "Custom",
    //       "domain": "Ocean",
    //       "username": "Starfish",
    //       "targetName": "Test2/Custom/Ocean/Starfish"
    //     }
    //   ]
    // }

    // ---------------------------------------------------------------------------------------
    // Here's sample code for parsing the JSON list of secrets.

    var app_name: [:0]const u8 = "";
    var service: [:0]const u8 = "";
    var domain: [:0]const u8 = "";
    var username: [:0]const u8 = "";
    var target_name: [:0]const u8 = "";
    var key_chain_service: [:0]const u8 = "";
    var key_chain_account: [:0]const u8 = "";

    var i: i32 = 0;
    const count_i = results.sizeOfArray("secrets");
    while (i < count_i) {
        results.setI(i);
        app_name = try results.stringOf(alloc, "secrets[i].appName");
        service = try results.stringOf(alloc, "secrets[i].service");
        domain = try results.stringOf(alloc, "secrets[i].domain");
        username = try results.stringOf(alloc, "secrets[i].username");
        // Information field for Windows Credentials Manager.
        target_name = try results.stringOf(alloc, "secrets[i].targetName");
        // Informational fields if on MacOS using the Apple Keychain.
        key_chain_service = try results.stringOf(alloc, "secrets[i].keyChainService");
        key_chain_account = try results.stringOf(alloc, "secrets[i].keyChainAccount");
        i = i + 1;
    }
}