//	**************************************************************************************
//	File:			Krb4RealmHostMaintenance.cpp 
//	By:				Arthur David Leather
//	Created:		12/02/98
//	Copyright		@1998 Massachusetts Institute of Technology - All rights reserved.
//	Description:	CPP file for Krb4RealmHostMaintenance.h. Contains variables and functions 
//					for Kerberos Four Properties
//
//	History:
//
//	MM/DD/YY	Inits	Description of Change
//	12/02/98	ADL		Original
//	**************************************************************************************


#include "stdafx.h"
#include "leash.h"
#include "KrbProperties.h"
#include "Krb4Properties.h"
#include "Krb4AddToRealmHostList.h"
#include "Krb4RealmHostMaintenance.h"
#include "Krb4EditRealmHostList.h"
#include "lglobals.h"

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

/////////////////////////////////////////////////////////////////////////////
// CKrb4RealmHostMaintenance dialog


IMPLEMENT_DYNCREATE(CKrb4RealmHostMaintenance, CPropertyPage)

CKrb4RealmHostMaintenance::CKrb4RealmHostMaintenance() : CPropertyPage(CKrb4RealmHostMaintenance::IDD)
{
	m_defectiveLines = 0;
    m_initDnsKdcLookup = m_newDnsKdcLookup = 0;
}

CKrb4RealmHostMaintenance::~CKrb4RealmHostMaintenance()
{
}

void CKrb4RealmHostMaintenance::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CKrb4RealmHostMaintenance)
	DDX_Control(pDX, IDC_LIST_KRB4_REALM_HOST, m_RealmHostList);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CKrb4RealmHostMaintenance, CPropertyPage)
	//{{AFX_MSG_MAP(CKrb4RealmHostMaintenance)
	ON_BN_CLICKED(IDC_BUTTON_KRB4_REALM_HOST_ADD, OnButtonRealmHostAdd)
	ON_BN_CLICKED(IDC_BUTTON_KRB4_REALM_HOST_EDIT, OnButtonRealmHostEdit)
	ON_BN_CLICKED(ID_BUTTON_KRB4_REALM_HOST_REMOVE, OnButtonRealmHostRemove)
	ON_LBN_SELCHANGE(IDC_LIST_KRB4_REALM_HOST, OnSelchangeListRemoveHost)
	ON_LBN_DBLCLK(IDC_LIST_KRB4_REALM_HOST, OnDblclkListRemoveHost)
	ON_BN_CLICKED(IDC_BUTTON_REALMHOST_MAINT_HELP2, OnButtonRealmhostMaintHelp2)
    ON_BN_CLICKED(IDC_KRB4_DNS_KDC, OnCheckDnsKdcLookup)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CKrb4RealmHostMaintenance message handlers

BOOL CKrb4RealmHostMaintenance::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();
	
	CStdioFile krbCon;
	if (!krbCon.Open(CKrbProperties::m_krbPath, CFile::modeReadWrite)) 
	{ // can't find file, so lets set some defaults	
		
		m_RealmHostList.AddString(KRB_REALM	" " KRB_MASTER);	
	}
	else
	{
		memset(lineBuf, '\0', sizeof(lineBuf));
		krbCon.ReadString(lineBuf, sizeof(lineBuf));
		while (TRUE)
		{
			if (!krbCon.ReadString(lineBuf, sizeof(lineBuf)))
			  break;
				
			*(lineBuf + strlen(lineBuf) - 1) = 0;

			if (!strchr(lineBuf, ' ') && !strchr(lineBuf, '\t'))
			{ // found a defective line
				m_defectiveLines++; 
			}

            if ( !strncmp(".KERBEROS.OPTION.",lineBuf,17) ) {
                char * p = &lineBuf[17];
                while (isspace(*p)) 
                    p++;
                if (!strcmp("dns",p))
                    m_initDnsKdcLookup = m_newDnsKdcLookup = 1;
            } else {
                if (LB_ERR == m_RealmHostList.AddString(lineBuf))
                {
                    LeashErrorBox("OnInitDialog::Can't read Configuration File", 
                                   CKrbProperties::m_krbPath);
                    krbCon.Close();
                    return FALSE;
                }
            }
		}

		krbCon.Close();
	}
			
	m_RealmHostList.SetCurSel(0);

	if (!m_RealmHostList.GetCount())
	{
		GetDlgItem(ID_BUTTON_KRB4_REALM_HOST_REMOVE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BUTTON_KRB4_REALM_HOST_EDIT)->EnableWindow(FALSE);
	}
	
	return TRUE;  
}

BOOL CKrb4RealmHostMaintenance::OnApply()
{
	CStdioFile krbCon;
	if (!krbCon.Open(CKrbProperties::m_krbPath, CFile::modeCreate | 
														 CFile::modeNoTruncate |
														 CFile::modeReadWrite)) 
	{	
		LeashErrorBox("OnApply::Can't open Configuration File", 
					  CKrbProperties::m_krbPath);
		return TRUE;
	}

	memset(lineBuf, '\0', sizeof(lineBuf));
	if (!krbCon.ReadString(lineBuf, sizeof(lineBuf)))
	{
//-----ADL----///strcpy(lineBuf, CKrb4ConfigOptions::m_newDefaultRealm);		
		strcat(lineBuf, "\n"); 
	}
	
	krbCon.SetLength(0);
	krbCon.WriteString(lineBuf);
	for (INT maxItems = m_RealmHostList.GetCount(), item = 0; item < maxItems; item++)
	{
		memset(lineBuf, '\0', sizeof(lineBuf));
		if (!m_RealmHostList.GetText(item, lineBuf))
          break;
			
		krbCon.WriteString(lineBuf);
		krbCon.WriteString("\n");
	}

    if ( m_newDnsKdcLookup )
        krbCon.WriteString(".KERBEROS.OPTION. dns\n");

	krbCon.Close();
	return TRUE;
}

void CKrb4RealmHostMaintenance::OnOK() 
{
	CPropertyPage::OnOK();
}

void CKrb4RealmHostMaintenance::OnCancel() 
{
	CPropertyPage::OnCancel();
}

void CKrb4RealmHostMaintenance::OnCheckDnsKdcLookup()
{
    m_newDnsKdcLookup = (BOOL)IsDlgButtonChecked(IDC_KRB4_DNS_KDC);
    SetModified(TRUE);
}

void CKrb4RealmHostMaintenance::ResetDefaultRealmComboBox()
{ // krb4 is loaded without krb5
	CHAR lineBuf[REALM_SZ + MAX_HSTNM + 20];
	
	int maxItems = m_RealmHostList.GetCount();

	CKrbConfigOptions::m_krbRealmEditbox.ResetContent();

	for (int xItems = 0; xItems < maxItems; xItems++)	
	{
		m_RealmHostList.GetText(xItems, lineBuf);	

		LPSTR space = strchr(lineBuf, ' ');
		if (space)
		  *space = 0;
		else
		  ASSERT(0);

		if (CB_ERR == CKrbConfigOptions::m_krbRealmEditbox.FindStringExact(-1, lineBuf))
		{ // no dups
			if (LB_ERR == CKrbConfigOptions::m_krbRealmEditbox.AddString(lineBuf))
			{
				MessageBox("OnInitDialog::Can't add to Kerberos Realm Combobox", 
						   "Leash", MB_OK);
				return;
			}
		}
	}

	CHAR krbhst[MAX_HSTNM + 1];
	CHAR krbrlm[REALM_SZ + 1];
		
	strcpy(krbrlm, CKrbConfigOptions::m_newDefaultRealm);
	memset(krbhst, '\0', sizeof(krbhst));

	// Check for Host
	// don't use KRB4 - krb_get_krbhst - would have to re-logon, on file location 
	// change, to use this function
	extern krb_get_krbhst(char* h, char* r, int n);
	if (KFAILURE == krb_get_krbhst(krbhst, krbrlm, 1))
	{
		MessageBox("We can't find the Host Server for your Default Realm!!!", 
                    "Leash", MB_OK);
		return;
	}

	CKrbConfigOptions::m_hostServer = krbhst;
}

void CKrb4RealmHostMaintenance::OnButtonRealmHostAdd() 
{
	CKrb4AddToRealmHostList addToRealmHostList;
	
	if (IDOK == addToRealmHostList.DoModal())
	{
		if (addToRealmHostList.GetNewRealm().IsEmpty())
		  ASSERT(0);
			
		CString newLine;
		newLine = addToRealmHostList.GetNewRealm() + " " + addToRealmHostList.GetNewHost();  			
	    
		if (addToRealmHostList.GetNewAdmin())
		  newLine += " admin server";
		
		// We don't want duplicate items in Listbox
		if (LB_ERR != m_RealmHostList.FindStringExact(-1, newLine))
		{ // found duplicate item in Listbox 
			LeashErrorBox("OnButtonRealmHostAdd::Found a Duplicate Item!\nCan't add to List",
						  newLine);					
			return;
		}

		
		m_RealmHostList.InsertString(0, newLine);
		m_RealmHostList.SetCurSel(0);
		SetModified(TRUE);

		ResetDefaultRealmComboBox();
		
		if (1 == m_RealmHostList.GetCount())
		{
			GetDlgItem(ID_BUTTON_KRB4_REALM_HOST_REMOVE)->EnableWindow();
			GetDlgItem(IDC_BUTTON_KRB4_REALM_HOST_EDIT)->EnableWindow();
		}
	}
}
	
void CKrb4RealmHostMaintenance::OnButtonRealmHostEdit() 
{
	INT selItemIndex = m_RealmHostList.GetCurSel();
	LPSTR pSelItem = new char[m_RealmHostList.GetTextLen(selItemIndex) + 1];
	if (!pSelItem)
	  ASSERT(0);

	CString selItem; 
	m_RealmHostList.GetText(selItemIndex, selItem);
	strcpy(pSelItem, selItem);

	CKrb4EditRealmHostList editRealmHostList(pSelItem);
	delete [] pSelItem;
	
	if (IDOK == editRealmHostList.DoModal())
	{
		CString editedItem = editRealmHostList.GetEditedItem();
		if (0 != selItem.CompareNoCase(editedItem) && 
			LB_ERR != m_RealmHostList.FindStringExact(-1, editedItem)) 
		{
			LeashErrorBox("OnButtonRealmHostEdit::Found a Duplicate!\nCan't add to List",
							  editedItem);					
			
			return;
		}

		m_RealmHostList.DeleteString(selItemIndex);
		m_RealmHostList.InsertString(selItemIndex, editRealmHostList.GetEditedItem());
		m_RealmHostList.SetCurSel(selItemIndex);
		SetModified(TRUE);

		ResetDefaultRealmComboBox();
	}
}

void CKrb4RealmHostMaintenance::OnButtonRealmHostRemove() 
{
	if (IDYES != AfxMessageBox("You are about to remove an item from the list!\n\nContinue?", 
		                       MB_YESNO))
	  return;

	INT curSel = m_RealmHostList.GetCurSel();	
	m_RealmHostList.DeleteString(curSel);  // Single Sel Listbox		
	
	if (-1 == m_RealmHostList.SetCurSel(curSel))
	  m_RealmHostList.SetCurSel(curSel - 1);
	
	SetModified(TRUE);

	ResetDefaultRealmComboBox();
	
	if (!m_RealmHostList.GetCount())
	{
		GetDlgItem(ID_BUTTON_KRB4_REALM_HOST_REMOVE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BUTTON_KRB4_REALM_HOST_EDIT)->EnableWindow(FALSE);
	}
	
	/* For Mult. Sel Listbox
	const LONG MAX_SEL_BUF = m_RealmHostList.GetSelCount();
	LPINT selectBuf = new INT[MAX_SEL_BUF];
		
	for (INT maxSelected = m_RealmHostList.GetSelItems(MAX_SEL_BUF, selectBuf), del=0, sel=0;
	     sel < maxSelected; sel++)
	{
		if (LB_ERR == m_RealmHostList.DeleteString(*(selectBuf + sel) - del))
		  MessageBox("Help", "Error", MB_OK);
		else
		  del++; 
	}
		
	delete selectBuf;
	*/
}

void CKrb4RealmHostMaintenance::OnSelchangeListRemoveHost() 
{
	//SetModified(TRUE);	
}


void CKrb4RealmHostMaintenance::OnDblclkListRemoveHost() 
{
	OnButtonRealmHostEdit(); 	
}

BOOL CKrb4RealmHostMaintenance::PreTranslateMessage(MSG* pMsg) 
{
	if (m_defectiveLines)
	{
		if (m_defectiveLines == 1)
		  LeashErrorBox("Found a defective entry in file", 
						CKrbProperties::m_krbPath, "Warning");
	    else if (m_defectiveLines > 1)
	      LeashErrorBox("Found more then one defective entry in file", 
						CKrbProperties::m_krbPath, "Warning");
	}

	m_defectiveLines = 0;	
	return CPropertyPage::PreTranslateMessage(pMsg);
}

void CKrb4RealmHostMaintenance::OnButtonRealmhostMaintHelp2() 
{
	MessageBox("No Help Available!", "Note", MB_OK);	
}
