/* * Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this * file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. * * @APPLE_LICENSE_HEADER_END@ Change History (most recent first): $Log: SharedSecret.cpp,v $ Revision 1.4 2005/10/18 06:13:41 herscher Prepend "$" to key name to ensure that secure updates work if the domain name and key name are the same Revision 1.3 2005/04/06 02:04:49 shersche Registering with shared secret doesn't work Revision 1.2 2005/03/03 19:55:22 shersche ControlPanel source code isn't saving CVS log info */ // SharedSecret.cpp : implementation file // #include "stdafx.h" #include "SharedSecret.h" #include #include //--------------------------------------------------------------------------------------------------------------------------- // Private declarations //--------------------------------------------------------------------------------------------------------------------------- static BOOL InitLsaString ( PLSA_UNICODE_STRING pLsaString, LPCWSTR pwszString ); // SharedSecret dialog IMPLEMENT_DYNAMIC(CSharedSecret, CDialog) //--------------------------------------------------------------------------------------------------------------------------- // CSharedSecret::CSharedSecret //--------------------------------------------------------------------------------------------------------------------------- CSharedSecret::CSharedSecret(CWnd* pParent /*=NULL*/) : CDialog(CSharedSecret::IDD, pParent) , m_key(_T("")) , m_secret(_T("")) { } //--------------------------------------------------------------------------------------------------------------------------- // CSharedSecret::~CSharedSecret //--------------------------------------------------------------------------------------------------------------------------- CSharedSecret::~CSharedSecret() { } //--------------------------------------------------------------------------------------------------------------------------- // CSharedSecret::DoDataExchange //--------------------------------------------------------------------------------------------------------------------------- void CSharedSecret::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_KEY, m_key ); DDX_Text(pDX, IDC_SECRET, m_secret ); } BEGIN_MESSAGE_MAP(CSharedSecret, CDialog) END_MESSAGE_MAP() //--------------------------------------------------------------------------------------------------------------------------- // CSharedSecret::Commit //--------------------------------------------------------------------------------------------------------------------------- void CSharedSecret::Commit( CString zone ) { LSA_OBJECT_ATTRIBUTES attrs; LSA_HANDLE handle = NULL; NTSTATUS res; LSA_UNICODE_STRING lucZoneName; LSA_UNICODE_STRING lucKeyName; LSA_UNICODE_STRING lucSecretName; BOOL ok; OSStatus err; // If there isn't a trailing dot, add one because the mDNSResponder // presents names with the trailing dot. if ( zone.ReverseFind( '.' ) != zone.GetLength() ) { zone += '.'; } if ( m_key.ReverseFind( '.' ) != m_key.GetLength() ) { m_key += '.'; } // // // Prepend "$" to the key name, so that there will // be no conflict between the zone name and the key // name m_key.Insert( 0, L"$" ); // attrs are reserved, so initialize to zeroes. ZeroMemory( &attrs, sizeof( attrs ) ); // Get a handle to the Policy object on the local system res = LsaOpenPolicy( NULL, &attrs, POLICY_ALL_ACCESS, &handle ); err = translate_errno( res == 0, LsaNtStatusToWinError( res ), kUnknownErr ); require_noerr( err, exit ); // Intializing PLSA_UNICODE_STRING structures ok = InitLsaString( &lucZoneName, zone ); err = translate_errno( ok, errno_compat(), kUnknownErr ); require_noerr( err, exit ); ok = InitLsaString( &lucKeyName, m_key ); err = translate_errno( ok, errno_compat(), kUnknownErr ); require_noerr( err, exit ); ok = InitLsaString( &lucSecretName, m_secret ); err = translate_errno( ok, errno_compat(), kUnknownErr ); require_noerr( err, exit ); // Store the private data. res = LsaStorePrivateData( handle, &lucZoneName, &lucKeyName ); err = translate_errno( res == 0, LsaNtStatusToWinError( res ), kUnknownErr ); require_noerr( err, exit ); res = LsaStorePrivateData( handle, &lucKeyName, &lucSecretName ); err = translate_errno( res == 0, LsaNtStatusToWinError( res ), kUnknownErr ); require_noerr( err, exit ); exit: if ( handle ) { LsaClose( handle ); handle = NULL; } return; } //--------------------------------------------------------------------------------------------------------------------------- // InitLsaString //--------------------------------------------------------------------------------------------------------------------------- static BOOL InitLsaString ( PLSA_UNICODE_STRING pLsaString, LPCWSTR pwszString ) { size_t dwLen = 0; BOOL ret = FALSE; if ( pLsaString == NULL ) { goto exit; } if ( pwszString != NULL ) { dwLen = wcslen(pwszString); // String is too large if (dwLen > 0x7ffe) { goto exit; } } // Store the string. pLsaString->Buffer = (WCHAR *) pwszString; pLsaString->Length = (USHORT) dwLen * sizeof(WCHAR); pLsaString->MaximumLength = (USHORT)(dwLen+1) * sizeof(WCHAR); ret = TRUE; exit: return ret; }