windows-nt/Source/XPSP1/NT/ds/security/passport/include/hubapi.h
2020-09-26 16:20:57 +08:00

183 lines
5.2 KiB
C

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
PassProvider.h
Abstract:
Header file for Provider implementations
Author:
Max Metral (mmetral) 12-Aug-1998
Revision History:
12-Aug-1998 mmetral
Created.
--*/
#ifndef _HUBAPI_H_
#define _HUBAPI_H_
#include "PassportTypes.h"
/**
* We use fixed size structure members here for efficiency.
* If you don't want to write your own "AsciiToUniCpyN", here's an example
* w/no error checking or null appending
*
* AsciiToUniCpyN(WCHAR* dest, CHAR* src, DWORD n)
* {
* while ((n-- > 0) && (*(dest++)=(WCHAR) *(src++)))
* ;
* }
*/
typedef struct _UserEntry
{
CHAR achMemberName[MAX_MEMBERNAME_LEN];
CHAR achContactEmail[MAX_CONTACTEMAIL_LEN];
CHAR achPassword[MAX_PASSWORD_LEN];
char achCountry [2]; // ISO
CHAR achPostalCode[MAX_POSTALCODE_LEN];
DATE dtBirthdate;
GENDER Gender;
CHAR achMemberID[MAX_MEMBERID_LEN];
CHAR achAlias[MAX_ALIAS_LEN];
ULONG ulLanguagePreference;
CHAR achMSNGUID[MAX_MSNGUID_LEN];
ULONG ulProfileVersion;
ULONG ulFlags;
BYTE* pProviderInfo; // Pointer for provider's use
}
UserEntry;
/**
* Here are the function prototypes for providers.
*
* The function prototypes YOU (the provider implementor) must implement
* are here too. If you are an implementor, define _PROVIDER_IMPLEMENTATION_,
* and the exports will be handled correctly
*/
#ifdef _PROVIDER_IMPLEMENTATION_
#define PROVEXPORT __declspec(dllexport)
#else
#define PROVEXPORT __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif
/**
* Initializes provider. Returns either:
* S_OK - Initialization succeeded, the hub should begin processing requests
* E_FAIL - Initialization failed, the hub should generate the appropriate
* diagnostic events and abort startup
*/
PROVEXPORT HRESULT WINAPI Init();
/**
* Gets a member entry.
*
* pachRequestingDN
*
* The hub passes in the "distinguished name" of the requesting party.
* In most cases this corresponds to the subject dn from the X.509
* certificate used in the connection to the hub. This can be useful for
* filling in the pDomainReserved portion of the UserEntry.
*
* pachMemberName
*
* The Passport Id (including domain name) of the user to be retrieved.
* For example, max@hotmail.com.
*
* pExistingEntry
*
* The hub passes in the existing cached UserEntry record (if any) for
* examination by the provider. The definition of the UserEntry
* structure follows this function declaration. pExistingEntry can be
* NULL.
*
* ppNewEntry
*
* The provider should return the UserEntry to be used in authenticating
* the user. If the same, the provider should return pExistingEntry
* here. If there is no valid entry for the user, the Get function
* should use the E_NO_USER return code.
*
* ppachDomainReserved
*
* The provider can pass back a value to be used for the pDomainReserved field
* of the returned profile. The caller does NO management of this memory. The
* likely solution is to place all possible values in the structure stored in
* pProviderInfo, and free them on Release. This field is broken out to allow
* different values to be delivered to different brokers without causing locking
* problems.
*
* Returns:
* S_OK - A valid user entry was placed in ppNewEntry
* E_NO_USER - There is no valid user entry for the user named by bstrMemberName
* Other E_* code - A system failure has occurred, and should be logged accordingly
*
*/
PROVEXPORT HRESULT WINAPI Get(LPSTR pachRequestingDN, LPSTR pachMemberName,
ULONG* pulSchemaVersionRequest,
ULONG* pulSchemaVersionResponse,
LPSTR* pachSchemaDefinition,
UserEntry *pExistingEntry, UserEntry **ppNewEntry,
LPSTR *ppachDomainReserved);
/**
* Checks to see whether a member exists. This can be implemented as a call
* to Get, but to allow maximum performance, we push that decision down to the
* individual provider.
*
* in parameters (dn and memberName) are same as Get
*
* Returns:
* S_OK - A valid user entry was placed in ppNewEntry
* E_NO_USER - There is no valid user entry for the user named by bstrMemberName
* Other E_* code - A system failure has occurred, and should be logged accordingly
*
*/
PROVEXPORT HRESULT WINAPI MemberExists(LPSTR pwchRequestingDN, LPSTR pachMemberName);
/**
* Release gives the provider an opportunity to clean up UserEntry-s.
*/
PROVEXPORT void WINAPI Release(UserEntry *pUserEntry);
/**
* This code number is arbitrary. Should probably be more carefully
* chosen at some point.
*/
#define E_NO_USER 0x80ff0001
#define E_NO_SCHEMA 0x80ff0002
/**
* INVALID_SCHEMA is used to terminate the list of desired schemas.
*/
#define INVALID_SCHEMA 0xffffffff
/**
* ANY_SCHEMA is used as a wild card in the list of desired schemas
*/
#define ANY_SCHEMA 0x00000000
typedef HRESULT (CALLBACK* LPPROVINIT)();
typedef HRESULT
(CALLBACK* LPPROVGET)(LPSTR,LPSTR,ULONG*,ULONG*,LPSTR*,UserEntry*,UserEntry**,LPSTR*);
typedef HRESULT (CALLBACK* LPPROVMEXIST)(LPSTR,LPSTR);
typedef void (CALLBACK* LPPROVRELEASE)(UserEntry*);
#ifdef __cplusplus
} /* Extern C */
#endif
#endif