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;
}