/*++

   Copyright    (c)    1994-1998    Microsoft Corporation

   Module  Name :

        authent.cpp

   Abstract:

        WWW Authentication Dialog

   Author:

        Ronald Meijer (ronaldm)

   Project:

        Internet Services Manager

   Revision History:

--*/

//
// Include Files
//
#include "stdafx.h"
#include "w3scfg.h"
#include "certmap.h"
#include "basdom.h"
#include "anondlg.h"
#include "authent.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif



CAuthenticationDlg::CAuthenticationDlg(
    IN LPCTSTR lpstrServerName, 
    IN DWORD   dwInstance,      
    IN CString & strBasicDomain,
    IN DWORD & dwAuthFlags,
    IN DWORD & dwAccessPermissions,
    IN CString & strUserName,
    IN CString & strPassword,
    IN BOOL & fPasswordSync,
    IN BOOL fAdminAccess,
    IN BOOL fHasDigest,
    IN CWnd * pParent           OPTIONAL
    )
/*++

Routine Description:

    Authentication dialog constructor

Arguments:

    LPCTSTR lpstrServerName     : Server name
    DWORD   dwInstance          : Instance number
    CString & strBasicDomain    : Basic domain name
    DWORD & dwAuthFlags         : Authorization flags
    DWORD & dwAccessPermissions : Access permissions
    CString & strUserName       : Anonymous user name
    CString & strPassword       : Anonymous user pwd
    BOOL & fPasswordSync        : Password sync setting
    BOOL fAdminAccess           : TRUE if user has admin access
    BOOL fHasDigest             : TRUE if machine supports digest auth.
    CWnd * pParent              : Optional parent window

Return Value:

    N/A

--*/
    : CDialog(CAuthenticationDlg::IDD, pParent),
      m_strServerName(lpstrServerName),
      m_strBasicDomain(strBasicDomain),
      m_strUserName(strUserName),
      m_strPassword(strPassword),
      m_dwInstance(dwInstance),
      m_dwAuthFlags(dwAuthFlags),
      m_dwAccessPermissions(dwAccessPermissions),
      m_fAdminAccess(fAdminAccess),
      m_fHasDigest(fHasDigest),
      m_fPasswordSync(fPasswordSync)
{
#if 0 // Class Wizard happy

    //{{AFX_DATA_INIT(CAuthenticationDlg)
    m_fClearText = FALSE;
    m_fDigest = FALSE;
    m_fChallengeResponse = FALSE;
    m_fUUEncoded = FALSE;
    //}}AFX_DATA_INIT

#endif // 0

    m_fClearText = IS_FLAG_SET(m_dwAuthFlags, MD_AUTH_BASIC);
    m_fDigest = IS_FLAG_SET(m_dwAuthFlags, MD_AUTH_MD5);
    m_fChallengeResponse = IS_FLAG_SET(m_dwAuthFlags, MD_AUTH_NT);
    m_fUUEncoded = IS_FLAG_SET(m_dwAuthFlags, MD_AUTH_ANONYMOUS);
}


void 
CAuthenticationDlg::DoDataExchange(
    IN CDataExchange * pDX
    )
/*++

Routine Description:

    Initialise/Store control data

Arguments:

    CDataExchange * pDX - DDX/DDV control structure

Return Value:

    None

--*/
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CAuthenticationDlg)
    DDX_Check(pDX, IDC_CHECK_CLEAR_TEXT, m_fClearText);
    DDX_Check(pDX, IDC_CHECK_DIGEST, m_fDigest);
    DDX_Check(pDX, IDC_CHECK_NT_CHALLENGE_RESPONSE, m_fChallengeResponse);
    DDX_Check(pDX, IDC_CHECK_UUENCODED, m_fUUEncoded);
    DDX_Control(pDX, IDC_CHECK_UUENCODED, m_check_UUEncoded);
    DDX_Control(pDX, IDC_CHECK_NT_CHALLENGE_RESPONSE, m_check_ChallengeResponse);
    DDX_Control(pDX, IDC_CHECK_DIGEST, m_check_Digest);
    DDX_Control(pDX, IDC_CHECK_CLEAR_TEXT, m_check_ClearText);
    DDX_Control(pDX, IDC_BUTTON_EDIT_ANONYMOUS, m_button_EditAnonymous);
    DDX_Control(pDX, IDC_BUTTON_EDIT, m_button_Edit);
    //}}AFX_DATA_MAP
}



//
// Message Map
//
BEGIN_MESSAGE_MAP(CAuthenticationDlg, CDialog)
    //{{AFX_MSG_MAP(CAuthenticationDlg)
    ON_BN_CLICKED(IDC_CHECK_CLEAR_TEXT, OnCheckClearText)
    ON_BN_CLICKED(IDC_CHECK_UUENCODED, OnCheckUuencoded)
    ON_BN_CLICKED(IDC_CHECK_DIGEST, OnCheckDigest)
    ON_BN_CLICKED(IDC_BUTTON_EDIT, OnButtonEdit)
    ON_BN_CLICKED(IDC_BUTTON_EDIT_ANONYMOUS, OnButtonEditAnonymous)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()



void
CAuthenticationDlg::SetControlStates()
/*++

Routine Description:

    Set control states depending on current data in the dialog

Arguments:

    None

Return Value:

    None

--*/
{
    m_button_Edit.EnableWindow(m_fClearText);
    m_button_EditAnonymous.EnableWindow(m_fUUEncoded && m_fAdminAccess);
}



BOOL 
CAuthenticationDlg::OnInitDialog() 
/*++

Routine Description:

    WM_INITDIALOG handler.  Initialize the dialog.

Arguments:

    None.

Return Value:

    TRUE if no focus is to be set automatically, FALSE if the focus
    is already set.

--*/
{
    CDialog::OnInitDialog();
    
    SetControlStates();  

    //
    // Ensure compatibility with downlevel
    //
    m_check_Digest.EnableWindow(m_fHasDigest);

    return TRUE;  
}



void 
CAuthenticationDlg::OnCheckClearText() 
/*++

Routine Description:

    Clear text checkbox handler

Arguments:

    None

Return Value:

    None

--*/
{
    if (m_check_ClearText.GetCheck() == 1)
    {
        CClearTxtDlg dlg;
        if (dlg.DoModal() != IDOK)
        {
            m_check_ClearText.SetCheck(0);
            return;
        }
    }

    m_fClearText = !m_fClearText;
    SetControlStates();
}



void 
CAuthenticationDlg::OnCheckDigest() 
/*++

Routine Description:

    'Digest' checkbox handler

Arguments:

    None

Return Value:

    None

--*/
{
    ASSERT(m_fHasDigest);

    if (m_check_Digest.GetCheck() == 1)
    {
        if (!NoYesMessageBox(IDS_WRN_DIGEST))
        {
            m_check_Digest.SetCheck(0);
            return;
        }
    }

    m_fDigest = !m_fDigest;
    SetControlStates();
}



void 
CAuthenticationDlg::OnCheckUuencoded() 
/*++

Routine Description:

    UU Encoding checkbox been pressed.

Arguments:

    None

Return Value:

    None

--*/
{
    m_fUUEncoded = !m_fUUEncoded;
    SetControlStates();
}



void 
CAuthenticationDlg::OnButtonEditAnonymous() 
/*++

Routine Description:

    'Edit anonymous' button handler

Arguments:

    None

Return Value:

    None

--*/
{
    CAnonymousDlg dlg(
        m_strServerName,
        m_strUserName,
        m_strPassword,
        m_fPasswordSync,
        this
        );

    if (dlg.DoModal() == IDOK)
    {
        m_strUserName = dlg.GetUserName();
        m_strPassword = dlg.GetPassword();
        m_fPasswordSync = dlg.GetPasswordSync();
    }
}



void 
CAuthenticationDlg::OnButtonEdit() 
/*++

Routine Description:

    'Edit default basic domain dialog' button handler

Arguments:

    None

Return Value:

    None

--*/
{
    CBasDomainDlg dlg(m_strBasicDomain);
    if (dlg.DoModal() == IDOK)
    {
        m_strBasicDomain = dlg.GetBasicDomain();
    }
}



void 
CAuthenticationDlg::OnOK() 
/*++

Routine Description:

    OK button handler, save information

Arguments:

    None

Return Value:

    None

--*/
{
    if (UpdateData(TRUE))
    {
        SET_FLAG_IF(m_fClearText, m_dwAuthFlags, MD_AUTH_BASIC);
        SET_FLAG_IF(m_fChallengeResponse, m_dwAuthFlags, MD_AUTH_NT);
        SET_FLAG_IF(m_fUUEncoded, m_dwAuthFlags, MD_AUTH_ANONYMOUS);
        SET_FLAG_IF(m_fDigest, m_dwAuthFlags, MD_AUTH_MD5);

        //
        // Provide warning if no authentication is selected
        //
        if (!m_dwAuthFlags 
         && !m_dwAccessPermissions 
         && !NoYesMessageBox(IDS_WRN_NO_AUTH)
           )
        {
            //
            // Don't dismiss the dialog
            //
            return;
        }

        CDialog::OnOK();
    }
}