Sample code for 30+ languages & platforms
PureBasic

Windows Credentials Manager / Apple Keychain - List All Secrets

See more Secrets Examples

On Windows, lists all secrets in the Windows Credentials Manager.

On MacOS or iOS, lists all secrets in the Apple Keychain.

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

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkJsonObject.pb"
IncludeFile "CkSecrets.pb"

Procedure ChilkatExample()

    success.i = 0

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

    secrets.i = CkSecrets::ckCreate()
    If secrets.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

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

    ; Pass an empty JSON object to list all secrets.
    json.i = CkJsonObject::ckCreate()
    If json.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    results.i = CkJsonObject::ckCreate()
    If results.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::setCkEmitCompact(results, 0)

    success = CkSecrets::ckListSecrets(secrets,json,results)
    If success = 0
        Debug CkSecrets::ckLastErrorText(secrets)
        CkSecrets::ckDispose(secrets)
        CkJsonObject::ckDispose(json)
        CkJsonObject::ckDispose(results)
        ProcedureReturn
    EndIf

    Debug CkJsonObject::ckEmit(results)

    ; Sample output on Windows (listing all secrets contained in the Windows Credentials Manager)
    ; The "targetName" is purely informational and indicates the raw TargetName of the secret (i.e. Credential) stored in the Credentials Manager.
    ; Code for parsing (iterating) the JSON results is shown below..

    ; {
    ;   "secrets": [
    ;     {
    ;       "appName": "Test",
    ;       "service": "MyService",
    ;       "domain": "Xyz",
    ;       "username": "MySecret",
    ;       "targetName": "Test/MyService/Xyz/MySecret"
    ;     },
    ;     {
    ;       "appName": "Chilkat",
    ;       "service": "TestSplit",
    ;       "domain": "local",
    ;       "username": "Matt",
    ;       "targetName": "Chilkat/TestSplit/local/Matt"
    ;     },
    ;     {
    ;       "appName": "Test2",
    ;       "service": "Custom",
    ;       "domain": "Ocean",
    ;       "username": "Starfish20",
    ;       "targetName": "Test2/Custom/Ocean/Starfish20"
    ;     },
    ;     {
    ;       "service": "VS Code Azure",
    ;       "domain": "",
    ;       "username": "Azure",
    ;       "targetName": "VS Code Azure/Azure"
    ;     },
    ;     {
    ;       "appName": "Test2",
    ;       "service": "Custom",
    ;       "domain": "Ocean",
    ;       "username": "Starfish",
    ;       "targetName": "Test2/Custom/Ocean/Starfish"
    ;     },
    ;     {
    ;       "appName": "AA_MyApp",
    ;       "service": "OAuth2",
    ;       "domain": "onedrive",
    ;       "username": "matt",
    ;       "targetName": "AA_MyApp/OAuth2/onedrive/matt"
    ;     }
    ;   ]
    ; }

    ; ---------------------------------------------------------------------------------------
    ; Here's sample output for listing secrets on MacOS
    ; Some are secrets created using Chilkat's API, others are pre-existing secrets.
    ; The "keyChainService" and "keyChainAccount" members are purely informational and show the raw Apple Keychain Service and Account information for the secret.

    ; {
    ;   "secrets": [
    ;     {
    ;       "service": "com.apple.scopedbookmarksagent.xpc",
    ;       "username": "com.apple.scopedbookmarksagent.xpc",
    ;       "keyChainService": "com.apple.scopedbookmarksagent.xpc",
    ;       "keyChainAccount": "com.apple.scopedbookmarksagent.xpc"
    ;     },
    ;     {
    ;       "service": "StandaloneBeacon",
    ;       "username": "searchparty",
    ;       "keyChainService": "StandaloneBeacon",
    ;       "keyChainAccount": "searchparty"
    ;     },
    ;     {
    ;       "service": "BeaconStore",
    ;       "username": "BeaconStoreKey",
    ;       "keyChainService": "BeaconStore",
    ;       "keyChainAccount": "BeaconStoreKey"
    ;     },
    ;     {
    ;       "service": "LocalStorage",
    ;       "username": "findmylocate",
    ;       "keyChainService": "LocalStorage",
    ;       "keyChainAccount": "findmylocate"
    ;     },
    ;     {
    ;       "service": "ProtectedCloudStorage",
    ;       "username": "default",
    ;       "keyChainService": "ProtectedCloudStorage",
    ;       "keyChainAccount": "default"
    ;     },
    ;     {
    ;       "service": "CloudStorage",
    ;       "username": "findmylocate",
    ;       "keyChainService": "CloudStorage",
    ;       "keyChainAccount": "findmylocate"
    ;     },
    ;     {
    ;       "service": "CloudKitCache",
    ;       "username": "FindMyCloudKit",
    ;       "keyChainService": "CloudKitCache",
    ;       "keyChainAccount": "FindMyCloudKit"
    ;     },
    ;     {
    ;       "service": "com.apple.continuity.encryption",
    ;       "username": "handoff-own-encryption-key",
    ;       "keyChainService": "com.apple.continuity.encryption",
    ;       "keyChainAccount": "handoff-own-encryption-key"
    ;     },
    ;     {
    ;       "service": "com.apple.NetworkServiceProxy.ProxyToken",
    ;       "username": "CloudFlare",
    ;       "keyChainService": "com.apple.NetworkServiceProxy.ProxyToken",
    ;       "keyChainAccount": "CloudFlare"
    ;     },
    ;     {
    ;       "appName": "Chilkat",
    ;       "service": "çözツ新",
    ;       "domain": "local",
    ;       "username": "Matt",
    ;       "keyChainService": "Chilkat/çözツ新",
    ;       "keyChainAccount": "local/Matt"
    ;     },
    ;     {
    ;       "service": "AirPort",
    ;       "username": "FP Public WiFi",
    ;       "keyChainService": "AirPort",
    ;       "keyChainAccount": "FP Public WiFi"
    ;     }
    ;   ]
    ; }

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

    appName.s
    service.s
    domain.s
    username.s
    targetName.s
    keyChainService.s
    keyChainAccount.s

    i.i = 0
    count_i.i = CkJsonObject::ckSizeOfArray(results,"secrets")
    While i < count_i
        CkJsonObject::setCkI(results, i)
        appName = CkJsonObject::ckStringOf(results,"secrets[i].appName")
        service = CkJsonObject::ckStringOf(results,"secrets[i].service")
        domain = CkJsonObject::ckStringOf(results,"secrets[i].domain")
        username = CkJsonObject::ckStringOf(results,"secrets[i].username")
        targetName = CkJsonObject::ckStringOf(results,"secrets[i].targetName")
        keyChainService = CkJsonObject::ckStringOf(results,"secrets[i].keyChainService")
        keyChainAccount = CkJsonObject::ckStringOf(results,"secrets[i].keyChainAccount")
        i = i + 1
    Wend


    CkSecrets::ckDispose(secrets)
    CkJsonObject::ckDispose(json)
    CkJsonObject::ckDispose(results)


    ProcedureReturn
EndProcedure