]> git.saurik.com Git - apple/mdnsresponder.git/blobdiff - mDNSWindows/ControlPanel/SharedSecret.cpp
mDNSResponder-878.230.2.tar.gz
[apple/mdnsresponder.git] / mDNSWindows / ControlPanel / SharedSecret.cpp
index 066fa98767e0242786af1eb224fc7037f88fc86b..3d1929588e8151ac23f19e1ab1857eb0790fe431 100644 (file)
  * 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
-<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
 
@@ -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;
        }
-
-       // <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 );
 }