/*++ 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