public E get()

in storage/src/main/java/com/microsoft/alm/storage/windows/internal/CredManagerBackedSecureStore.java [71:112]


    public E get(String key) {
        Debug.Assert(key != null, "key cannot be null");

        logger.info("Getting secret for {}", key);

        final CredAdvapi32.PCREDENTIAL pcredential = new CredAdvapi32.PCREDENTIAL();
        boolean read = false;
        E cred;

        try {
            // MSDN doc doesn't mention threading safety, so let's just be careful and synchronize the access
            synchronized (INSTANCE) {
                read = INSTANCE.CredRead(key, CredAdvapi32.CRED_TYPE_GENERIC, 0, pcredential);
            }

            if (read) {
                final CredAdvapi32.CREDENTIAL credential = new CredAdvapi32.CREDENTIAL(pcredential.credential);

                byte[] secretBytes = credential.CredentialBlob.getByteArray(0, credential.CredentialBlobSize);
                final String secret = StringHelper.UTF8GetString(secretBytes);
                final String username = credential.UserName;

                cred = create(username, secret);

            } else {
                cred = null;
            }

        } catch (final LastErrorException e) {
            logError(logger, "Getting secret failed.", e);
            cred = null;

        } finally {
            if (pcredential.credential != null) {
                synchronized (INSTANCE) {
                    INSTANCE.CredFree(pcredential.credential);
                }
            }
        }

        return cred;
    }