package wincred

import (
	"time"
)

// CredentialPersistence describes one of three persistence modes of a credential.
// A detailed description of the available modes can be found on
// MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/aa374788(v=vs.85).aspx
type CredentialPersistence uint32

const (
	// PersistSession indicates that the credential only persists for the life
	// of the current Windows login session. Such a credential is not visible in
	// any other logon session, even from the same user.
	PersistSession CredentialPersistence = 0x1

	// PersistLocalMachine indicates that the credential persists for this and
	// all subsequent logon sessions on this local machine/computer. It is
	// however not visible for logon sessions of this user on a different
	// machine.
	PersistLocalMachine CredentialPersistence = 0x2

	// PersistEnterprise indicates that the credential persists for this and all
	// subsequent logon sessions for this user. It is also visible for logon
	// sessions on different computers.
	PersistEnterprise CredentialPersistence = 0x3
)

// CredentialAttribute represents an application-specific attribute of a credential.
type CredentialAttribute struct {
	Keyword string
	Value   []byte
}

// Credential is the basic credential structure.
// A credential is identified by its target name.
// The actual credential secret is available in the CredentialBlob field.
type Credential struct {
	TargetName     string
	Comment        string
	LastWritten    time.Time
	CredentialBlob []byte
	Attributes     []CredentialAttribute
	TargetAlias    string
	UserName       string
	Persist        CredentialPersistence
}

// GenericCredential holds a credential for generic usage.
// It is typically defined and used by applications that need to manage user
// secrets.
//
// More information about the available kinds of credentials of the Windows
// Credential Management API can be found on MSDN:
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa380517(v=vs.85).aspx
type GenericCredential struct {
	Credential
}

// DomainPassword holds a domain credential that is typically used by the
// operating system for user logon.
//
// More information about the available kinds of credentials of the Windows
// Credential Management API can be found on MSDN:
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa380517(v=vs.85).aspx
type DomainPassword struct {
	Credential
}
