* 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.6 2007/06/12 20:06:06 herscher
-<rdar://problem/5263387> ControlPanel was inadvertently adding a trailing dot to all key names.
-
-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
-<rdar://problem/4192119> 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
-<rdar://problem/4066485> Registering with shared secret doesn't work
-
-Revision 1.2 2005/03/03 19:55:22 shersche
-<rdar://problem/4034481> ControlPanel source code isn't saving CVS log info
-
-
-*/
+ */
// SharedSecret.cpp : implementation file
//
+
+#include <Secret.h>
#include "stdafx.h"
#include "SharedSecret.h"
+#include <WinServices.h>
#include <DebugServices.h>
-#include <ntsecapi.h>
-
-//---------------------------------------------------------------------------------------------------------------------------
-// Private declarations
-//---------------------------------------------------------------------------------------------------------------------------
-static BOOL
-InitLsaString
- (
- PLSA_UNICODE_STRING pLsaString,
- LPCWSTR pwszString
- );
// SharedSecret dialog
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() - 1 ) )
- {
- zone += '.';
- }
+ char zoneUTF8[ 256 ];
+ char outDomain[ 256 ];
+ char outKey[ 256 ];
+ char outSecret[ 256 ];
- if ( m_key.ReverseFind( '.' ) != ( m_key.GetLength() - 1 ) )
+ StringObjectToUTF8String( zone, zoneUTF8, sizeof( zoneUTF8 ) );
+
+ 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;
}
-
- // <rdar://problem/4192119>
- //
- // 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 );
}