183 lines
5.2 KiB
C
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
|