Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

198 lines
6.6 KiB

/*****************************************************************************\
FILE: INStoXML.cpp
DESCRIPTION:
This code will convert an INS (internet settings) or ISP (Internet
Service Provider) file to an Account AutoDiscovery XML file.
BryanSt 11/8/1999
Copyright (C) Microsoft Corp 1999-1999. All rights reserved.
\*****************************************************************************/
#include "priv.h"
#include <cowsite.h>
#include <atlbase.h>
#include "util.h"
#include "AutoDiscover.h"
#define XML_POST_REQUEST L"<?xml version=\"1.0\"?>\r\n<AUTODISCOVERY Version=\"0.1\">\r\n\t<REQUEST ACCOUNTTYPE=\"EMail\" EMAIL=\"%ls\">\r\n\t</REQUEST>\r\n</AUTODISCOVERY>\r\n"
#define XML_TEMPLATE_DISPNAME "<USER DISPLAYNAME=\"%ls\" />"
#define XML_TEMPLATE_ACCOUNT "<?xml version=\"1.0\"?>\r\n<AUTODISCOVERY Version=\"0.1\">\r\n %hs\r\n <ACCOUNT TYPE=\"EMail\" EXPIRE=\"7\">\r\n <PROTOCOL TYPE=\"POP3\" SERVERNAME=\"%ls\">\r\n <AUTH>\r\n <PASSWORD TYPE=\"%ls\" />\r\n </AUTH>\r\n </PROTOCOL>\r\n <PROTOCOL TYPE=\"SMTP\" SERVERNAME=\"%ls\">\r\n <AUTH>\r\n <PASSWORD TYPE=\"%ls\" />\r\n </AUTH>\r\n </PROTOCOL>\r\n </ACCOUNT>\r\n</AUTODISCOVERY>"
#define STR_SECTION_INET_MAIL TEXT("Internet_Mail")
#define STR_INIKEY_POP_SERVER TEXT("POP_Server")
#define STR_INIKEY_POP_NAME TEXT("POP_Logon_Name")
#define STR_INIKEY_SMTP_SERVER TEXT("SMTP_Server")
#define STR_INIKEY_AUTH_TYPE TEXT("Logon_Using_SPA")
#define STR_INIKEY_EMAIL_NAME TEXT("Email_Name") // DisplayName
#define STR_TYPE_POP3 TEXT("POP3")
#define STR_YES TEXT("yes")
#define STR_SPA TEXT("SPA")
typedef struct tagAUTODISCOVERYSETTINGS
{
LPWSTR pwszType;
LPWSTR pwszPOPServer;
LPWSTR pwszPOPServerLoginName;
LPWSTR pwszSMTPServer;
LPWSTR pwszDisplayName;
LPWSTR pwszAuthType;
} AUTODISCOVERYSETTINGS;
//===========================
// *** API Internals & Helpers ***
//===========================
HRESULT _GetAutoDiscSettings(LPCWSTR pwszINSFile, AUTODISCOVERYSETTINGS * pads)
{
WCHAR wzTemp[MAX_URL_STRING];
HRESULT hr = GetPrivateProfileStringHrWrap(STR_SECTION_INET_MAIL, STR_INIKEY_POP_SERVER, L"", wzTemp, ARRAYSIZE(wzTemp), pwszINSFile);
if (SUCCEEDED(hr) && wzTemp[0])
{
pads->pwszPOPServer = StrDupW(wzTemp);
hr = ((pads->pwszPOPServer) ? S_OK : E_OUTOFMEMORY);
if (SUCCEEDED(hr))
{
pads->pwszType = StrDupW(STR_TYPE_POP3);
hr = ((pads->pwszType) ? S_OK : E_OUTOFMEMORY);
}
}
hr = GetPrivateProfileStringHrWrap(STR_SECTION_INET_MAIL, STR_INIKEY_POP_NAME, L"", wzTemp, ARRAYSIZE(wzTemp), pwszINSFile);
if (SUCCEEDED(hr) && wzTemp[0])
{
pads->pwszPOPServerLoginName = StrDupW(wzTemp);
hr = ((pads->pwszPOPServerLoginName) ? S_OK : E_OUTOFMEMORY);
}
hr = GetPrivateProfileStringHrWrap(STR_SECTION_INET_MAIL, STR_INIKEY_SMTP_SERVER, L"", wzTemp, ARRAYSIZE(wzTemp), pwszINSFile);
if (SUCCEEDED(hr) && wzTemp[0])
{
pads->pwszSMTPServer = StrDupW(wzTemp);
hr = ((pads->pwszSMTPServer) ? S_OK : E_OUTOFMEMORY);
}
hr = GetPrivateProfileStringHrWrap(STR_SECTION_INET_MAIL, STR_INIKEY_AUTH_TYPE, L"", wzTemp, ARRAYSIZE(wzTemp), pwszINSFile);
if (SUCCEEDED(hr) && wzTemp[0] && StrCmpIW(wzTemp, STR_YES))
{
pads->pwszAuthType = StrDupW(STR_SPA);
hr = ((pads->pwszAuthType) ? S_OK : E_OUTOFMEMORY);
}
hr = GetPrivateProfileStringHrWrap(STR_SECTION_INET_MAIL, STR_INIKEY_EMAIL_NAME, L"", wzTemp, ARRAYSIZE(wzTemp), pwszINSFile);
if (SUCCEEDED(hr) && wzTemp[0])
{
pads->pwszDisplayName = StrDupW(wzTemp);
hr = ((pads->pwszDisplayName) ? S_OK : E_OUTOFMEMORY);
}
return hr;
}
HRESULT _CreateXMLFromSettings(AUTODISCOVERYSETTINGS * pads, LPSTR * ppszXML)
{
CHAR szUserTagXML[MAX_URL_STRING];
CHAR szAccountXML[MAX_URL_STRING * 4];
HRESULT hr = S_OK;
szUserTagXML[0] = 0;
szAccountXML[0] = 0;
if (pads->pwszDisplayName)
{
wnsprintfA(szUserTagXML, ARRAYSIZE(szUserTagXML), XML_TEMPLATE_DISPNAME, pads->pwszDisplayName);
}
// TODO: Do we need to add the POP Login Name?
wnsprintfA(szAccountXML, ARRAYSIZE(szAccountXML), XML_TEMPLATE_ACCOUNT, szUserTagXML, pads->pwszPOPServer, pads->pwszAuthType, pads->pwszSMTPServer, pads->pwszAuthType);
*ppszXML = StrDupA(szAccountXML);
hr = ((*ppszXML) ? S_OK : E_OUTOFMEMORY);
return hr;
}
HRESULT _SaveToFile(LPCWSTR pwszFileName, LPCSTR pszXML)
{
HANDLE hFile;
HRESULT hr = CreateFileHrWrap(pwszFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL, &hFile);
if (SUCCEEDED(hr))
{
DWORD chFSWritten;
hr = WriteFileWrap(hFile, pszXML, lstrlenA(pszXML), &chFSWritten, NULL);
CloseHandle(hFile);
}
return hr;
}
HRESULT _FreeAutoDiscSettings(AUTODISCOVERYSETTINGS * pads)
{
if (pads->pwszType) LocalFree(pads->pwszType);
if (pads->pwszPOPServer) LocalFree(pads->pwszPOPServer);
if (pads->pwszPOPServerLoginName) LocalFree(pads->pwszPOPServerLoginName);
if (pads->pwszSMTPServer) LocalFree(pads->pwszSMTPServer);
if (pads->pwszDisplayName) LocalFree(pads->pwszDisplayName);
if (pads->pwszAuthType) LocalFree(pads->pwszAuthType);
return S_OK;
}
//===========================
// *** APIs ***
//===========================
bool IsINSFile(LPCWSTR pwszINSFile)
{
WCHAR wzPOPServer[MAX_PATH];
bool fIsINSFile = false;
HRESULT hr = GetPrivateProfileStringHrWrap(STR_SECTION_INET_MAIL, STR_INIKEY_POP_SERVER, L"", wzPOPServer, ARRAYSIZE(wzPOPServer), pwszINSFile);
if (SUCCEEDED(hr) && wzPOPServer[0])
{
// We consider this a valid Account AutoDiscovery compatible INS/ISP
// file if it has:
// [Internet_Mail]
// POP_Server=xxxxx
fIsINSFile = true;
}
return fIsINSFile;
}
HRESULT ConvertINSToXML(LPCWSTR pwszINSFile)
{
AUTODISCOVERYSETTINGS ads = {0};
HRESULT hr = _GetAutoDiscSettings(pwszINSFile, &ads);
if (SUCCEEDED(hr))
{
LPSTR pszXML;
hr = _CreateXMLFromSettings(&ads, &pszXML);
if (SUCCEEDED(hr))
{
hr = _SaveToFile(pwszINSFile, pszXML);
LocalFree(pszXML);
}
_FreeAutoDiscSettings(&ads);
}
return hr;
}