X-Git-Url: https://git.saurik.com/apple/mdnsresponder.git/blobdiff_plain/619ee211a2d1cd19533acb8c109cb34a602cbd46..0b74dd16dce34c1c64267ece7abda266fa586255:/mDNSWindows/ControlPanel/SharedSecret.cpp diff --git a/mDNSWindows/ControlPanel/SharedSecret.cpp b/mDNSWindows/ControlPanel/SharedSecret.cpp index 066fa98..3d19295 100644 --- a/mDNSWindows/ControlPanel/SharedSecret.cpp +++ b/mDNSWindows/ControlPanel/SharedSecret.cpp @@ -13,45 +13,20 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - - Change History (most recent first): - -$Log: SharedSecret.cpp,v $ -Revision 1.5 2006/08/14 23:25:28 cheshire -Re-licensed mDNSResponder daemon source code under Apache License, Version 2.0 - -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 #include "stdafx.h" #include "SharedSecret.h" +#include #include -#include - -//--------------------------------------------------------------------------------------------------------------------------- -// Private declarations -//--------------------------------------------------------------------------------------------------------------------------- -static BOOL -InitLsaString - ( - PLSA_UNICODE_STRING pLsaString, - LPCWSTR pwszString - ); // SharedSecret dialog @@ -95,129 +70,46 @@ BEGIN_MESSAGE_MAP(CSharedSecret, CDialog) END_MESSAGE_MAP() - //--------------------------------------------------------------------------------------------------------------------------- -// CSharedSecret::Commit +// CSharedSecret::Load //--------------------------------------------------------------------------------------------------------------------------- void -CSharedSecret::Commit( CString zone ) +CSharedSecret::Load( 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 += '.'; - } + char zoneUTF8[ 256 ]; + char outDomain[ 256 ]; + char outKey[ 256 ]; + char outSecret[ 256 ]; + + StringObjectToUTF8String( zone, zoneUTF8, sizeof( zoneUTF8 ) ); - if ( m_key.ReverseFind( '.' ) != m_key.GetLength() ) + if ( LsaGetSecret( zoneUTF8, outDomain, sizeof( outDomain ) / sizeof( TCHAR ), outKey, sizeof( outKey ) / sizeof( TCHAR ), outSecret, sizeof( outSecret ) / sizeof( TCHAR ) ) ) { - m_key += '.'; + m_key = outKey; + m_secret = outSecret; } - - // - // - // 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 ) + else { - LsaClose( handle ); - handle = NULL; + m_key = zone; } - - return; } //--------------------------------------------------------------------------------------------------------------------------- -// InitLsaString +// CSharedSecret::Commit //--------------------------------------------------------------------------------------------------------------------------- -static BOOL -InitLsaString - ( - PLSA_UNICODE_STRING pLsaString, - LPCWSTR pwszString - ) +void +CSharedSecret::Commit( CString zone ) { - 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; + char zoneUTF8[ 256 ]; + char keyUTF8[ 256 ]; + char secretUTF8[ 256 ]; -exit: + StringObjectToUTF8String( zone, zoneUTF8, sizeof( zoneUTF8 ) ); + StringObjectToUTF8String( m_key, keyUTF8, sizeof( keyUTF8 ) ); + StringObjectToUTF8String( m_secret, secretUTF8, sizeof( secretUTF8 ) ); - return ret; + LsaSetSecret( zoneUTF8, keyUTF8, secretUTF8 ); }