#include <UIRibbon.h>
#include <UIRibbonPropertyHelpers.h>
#include "kfwribbon.h"
#include "LeashUICommandHandler.h"
#include "resource.h"
#include <loadfuncs-leash.h>
extern DWORD Leash_get_default_uppercaserealm();
extern DECL_FUNC_PTR(Leash_get_default_uppercaserealm);
HRESULT
LeashUICommandHandler::CreateInstance(IUICommandHandler **out, HWND hwnd)
{
LeashUICommandHandler *handler;
if (out == NULL)
return E_POINTER;
handler = new LeashUICommandHandler();
handler->mainwin = hwnd;
*out = static_cast<IUICommandHandler *>(handler);
return S_OK;
}
ULONG
LeashUICommandHandler::AddRef()
{
return InterlockedIncrement(&refcnt);
}
ULONG
LeashUICommandHandler::Release()
{
LONG tmp;
tmp = InterlockedDecrement(&refcnt);
if (tmp == 0)
delete this;
return tmp;
}
HRESULT
LeashUICommandHandler::QueryInterface(REFIID iid, void **ppv)
{
if (ppv == NULL)
return E_POINTER;
if (iid == __uuidof(IUnknown)) {
*ppv = static_cast<IUnknown*>(this);
} else if (iid == __uuidof(IUICommandHandler)) {
*ppv = static_cast<IUICommandHandler*>(this);
} else {
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return S_OK;
}
HRESULT
LeashUICommandHandler::Execute(UINT32 commandId, UI_EXECUTIONVERB verb,
const PROPERTYKEY *key,
const PROPVARIANT *currentValue,
IUISimplePropertySet *commandExecutionProperties)
{
if (verb != UI_EXECUTIONVERB_EXECUTE)
return E_NOTIMPL;
switch(commandId) {
case cmdGetTicketButton:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(ID_INIT_TICKET, 1), 0);
break;
case cmdRenewTicketButton:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(ID_RENEW_TICKET, 1), 0);
break;
case cmdDestroyTicketButton:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(ID_DESTROY_TICKET, 1),
0);
break;
case cmdMakeDefaultButton:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(ID_MAKE_DEFAULT, 1),
0);
break;
case cmdChangePasswordButton:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(ID_CHANGE_PASSWORD, 1),
0);
break;
case cmdIssuedCheckBox:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(ID_TIME_ISSUED, 1), 0);
break;
case cmdRenewUntilCheckBox:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(ID_RENEWABLE_UNTIL, 1),
0);
break;
case cmdValidUntilCheckBox:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(ID_VALID_UNTIL, 1), 0);
break;
case cmdEncTypeCheckBox:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(ID_ENCRYPTION_TYPE, 1),
0);
break;
case cmdFlagsCheckBox:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(ID_SHOW_TICKET_FLAGS,
1), 0);
break;
case cmdCcacheNameCheckBox:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(ID_CCACHE_NAME, 1), 0);
break;
case cmdAutoRenewCheckBox:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(ID_AUTO_RENEW, 1), 0);
break;
case cmdExpireAlarmCheckBox:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(ID_LOW_TICKET_ALARM,
1), 0);
break;
case cmdDestroyOnExitCheckBox:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(ID_KILL_TIX_ONEXIT, 1),
0);
break;
case cmdMixedCaseCheckBox:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(ID_UPPERCASE_REALM, 1),
0);
break;
case cmdHelp:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(ID_HELP_LEASH32, 1), 0);
break;
case cmdAbout:
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(0xe140, 1), 0);
break;
case cmdExit:
if (app != NULL)
app->SaveRibbonState();
SendMessage(mainwin, WM_COMMAND, MAKEWPARAM(0xe141, 1), 0);
break;
default:
return S_OK;
}
return S_OK;
}
static HRESULT
RegKeyToProperty(const char *regkey, bool default, PROPVARIANT *out)
{
DWORD bsize = sizeof(DWORD), enabled;
LONG code;
code = RegGetValue(HKEY_CURRENT_USER,
"Software\\MIT\\MIT Kerberos\\Settings",
regkey, RRF_RT_DWORD, NULL, &enabled,
&bsize);
if (code == ERROR_FILE_NOT_FOUND) {
code = ERROR_SUCCESS;
enabled = default ? 1 : 0;
}
if (FAILED(code) || bsize != sizeof(enabled))
return E_FAIL;
return UIInitPropertyFromBoolean(UI_PKEY_BooleanValue, enabled, out);
}
HRESULT
LeashUICommandHandler::UpdateProperty(UINT32 commandId, REFPROPERTYKEY key,
const PROPVARIANT *currentValue,
PROPVARIANT *newValue)
{
if (key != UI_PKEY_BooleanValue)
return E_NOTIMPL;
switch(commandId) {
case cmdIssuedCheckBox:
return RegKeyToProperty("Issued", false, newValue);
case cmdRenewUntilCheckBox:
return RegKeyToProperty("Renewable Until", false, newValue);
case cmdValidUntilCheckBox:
return RegKeyToProperty("Valid Until", true, newValue);
case cmdEncTypeCheckBox:
return RegKeyToProperty("Encryption Type", false, newValue);
case cmdFlagsCheckBox:
return RegKeyToProperty("Flags", false, newValue);
case cmdCcacheNameCheckBox:
return RegKeyToProperty("Credential Cache", false, newValue);
case cmdAutoRenewCheckBox:
return RegKeyToProperty("AutoRenewTickets", true, newValue);
case cmdExpireAlarmCheckBox:
return RegKeyToProperty("LowTicketAlarm", true, newValue);
case cmdDestroyOnExitCheckBox:
return RegKeyToProperty("DestroyTicketsOnExit", false, newValue);
case cmdMixedCaseCheckBox:
return UIInitPropertyFromBoolean(UI_PKEY_BooleanValue,
pLeash_get_default_uppercaserealm(), newValue);
default:
return E_NOTIMPL;
}
return E_NOTIMPL;
}