From 6e637324a7d146b5675fec00c819259d7ac9c244 Mon Sep 17 00:00:00 2001 From: Kent Sutherland Date: Wed, 29 Oct 2003 02:36:59 +0000 Subject: [PATCH] You can now connect through the new NetworkObject. Password authentication is in, but needs to be tested. --- .../Preferences.nib/keyedobjects.nib | Bin 38454 -> 38095 bytes MainController.m | 18 +++--- NetworkController.m | 57 ++++++++++-------- NetworkObject.h | 3 + NetworkObject.m | 37 +++++++++--- PreferencesController.m | 24 +++----- libValidate.a | Bin 8032 -> 8032 bytes 7 files changed, 84 insertions(+), 55 deletions(-) diff --git a/English.lproj/Preferences.nib/keyedobjects.nib b/English.lproj/Preferences.nib/keyedobjects.nib index 88ffb88a8b3b114fc2e8a505979ec0563acd8a57..7e4be37599dae2e933f70e6a2ac9b589b8595848 100755 GIT binary patch delta 23785 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

#{pq$f>4_ep?`}RNNsTMmu``No{8-7Lb4h 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 ab%*Ls*Ii%$112U2&GiC8LrG?ay88ee(s$(m delta 24232 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 diff --git a/MainController.m b/MainController.m index 92f3ee6..aaddc7f 100755 --- a/MainController.m +++ b/MainController.m @@ -2,6 +2,7 @@ #import "MenuController.h" #import "PreferencesController.h" #import "NetworkController.h" +#import "NetworkObject.h" #import #import #import @@ -947,8 +948,9 @@ static MainController *sharedController; ITDebugLog(@"Attempting to connect to shared remote."); //Connect if ([networkController connectToHost:[df stringForKey:@"sharedPlayerHost"]]) { - currentRemote = [[networkController networkObject] remote]; - [refreshTimer invalidate]; + currentRemote = [[[networkController networkObject] remote] retain]; + [self timerUpdate]; + //[refreshTimer invalidate]; ITDebugLog(@"Connection successful."); return YES; } else { @@ -962,6 +964,7 @@ static MainController *sharedController; { ITDebugLog(@"Disconnecting from shared remote."); //Disconnect + [currentRemote release]; currentRemote = [remoteArray objectAtIndex:0]; [networkController disconnect]; [self timerUpdate]; @@ -983,14 +986,13 @@ static MainController *sharedController; - (void)networkError:(NSException *)exception { ITDebugLog(@"Remote exception thrown: %@: %@", [exception name], [exception reason]); - NSLog(@"Remote exception thrown: %@: %@", [exception name], [exception reason]); - NSRunCriticalAlertPanel(@"Remote MenuTunes Disconnected", @"The MenuTunes server you were connected to stopped responding or quit. MenuTunes will revert back to the local player.", @"OK", nil, nil); - if ([networkController isConnectedToServer] && [self disconnectFromServer]) { - if ([[exception name] isEqualToString:NSPortTimeoutException]) { + if ([[exception name] isEqualToString:NSPortTimeoutException]) { + NSRunCriticalAlertPanel(@"Remote MenuTunes Disconnected", @"The MenuTunes server you were connected to stopped responding or quit. MenuTunes will revert back to the local player.", @"OK", nil, nil); + if ([networkController isConnectedToServer] && [self disconnectFromServer]) { [NSTimer scheduledTimerWithTimeInterval:45 target:self selector:@selector(checkForRemoteServer:) userInfo:nil repeats:YES]; + } else { + ITDebugLog(@"CRITICAL ERROR, DISCONNECTING!"); } - } else { - ITDebugLog(@"CRITICAL ERROR, DISCONNECTING!"); } } diff --git a/NetworkController.m b/NetworkController.m index 9edb713..230e136 100755 --- a/NetworkController.m +++ b/NetworkController.m @@ -40,7 +40,6 @@ static NetworkController *sharedController; { [self disconnect]; if (serverOn) { - [serverConnection invalidate]; [serverConnection release]; } [serverPass release]; @@ -78,8 +77,8 @@ static NetworkController *sharedController; sendPort:serverPort]; [serverConnection setRootObject:[[NetworkObject alloc] init]]; [serverConnection registerName:@"ITMTPlayerHost"]; - [serverConnection setDelegate:self]; NS_HANDLER + [[serverConnection rootObject] release]; [serverConnection release]; [serverPort release]; ITDebugLog(@"Error starting server!"); @@ -107,8 +106,6 @@ static NetworkController *sharedController; [service stop]; [serverConnection registerName:nil]; [[serverConnection rootObject] release]; - [serverPort invalidate]; - [serverConnection invalidate]; [serverConnection release]; ITDebugLog(@"Stopped server."); serverOn = NO; @@ -120,6 +117,7 @@ static NetworkController *sharedController; NSData *fullPass = [[NSUserDefaults standardUserDefaults] dataForKey:@"connectPassword"]; unsigned char buffer; ITDebugLog(@"Connecting to host: %@", host); + [remoteHost release]; remoteHost = [host copy]; if (fullPass) { [fullPass getBytes:&buffer range:NSMakeRange(6, 4)]; @@ -132,7 +130,6 @@ static NetworkController *sharedController; clientPort = [[NSSocketPort alloc] initRemoteWithTCPPort:SERVER_PORT host:host]; clientConnection = [[NSConnection connectionWithReceivePort:nil sendPort:clientPort] retain]; - [clientConnection setDelegate:self]; [clientConnection setReplyTimeout:5]; clientProxy = [[clientConnection rootProxy] retain]; NS_HANDLER @@ -141,6 +138,26 @@ static NetworkController *sharedController; ITDebugLog(@"Connection to host failed: %@", host); return NO; NS_ENDHANDLER + + if (!clientProxy) { + ITDebugLog(@"Null proxy! Couldn't connect!"); + [self disconnect]; + return NO; + } + + if ([clientProxy requiresPassword]) { + ITDebugLog(@"Sending password."); + if (![clientProxy sendPassword:[[NSUserDefaults standardUserDefaults] dataForKey:@"connectPassword"]]) { + ITDebugLog(@"Invalid password!"); + [self disconnect]; + if ( NSRunCriticalAlertPanel(@"Invalid Password", @"The MenuTunes server you attempted to connect to rejected your password. Would you like to try to reconnect?.", @"Yes", @"No", nil) == NSOKButton ) { + return [self connectToHost:host]; + } else { + return NO; + } + } + } + ITDebugLog(@"Connected to host: %@", host); [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(disconnect) name:NSConnectionDidDieNotification object:clientConnection]; connectedToServer = YES; @@ -155,7 +172,6 @@ static NetworkController *sharedController; remoteHost = nil; [[NSNotificationCenter defaultCenter] removeObserver:self]; [clientProxy release]; - [clientConnection invalidate]; [clientConnection release]; return YES; } @@ -178,20 +194,24 @@ static NetworkController *sharedController; NS_DURING testPort = [[NSSocketPort alloc] initRemoteWithTCPPort:SERVER_PORT - host:host]; + host:host]; testConnection = [[NSConnection connectionWithReceivePort:nil sendPort:testPort] retain]; [testConnection setReplyTimeout:2]; - tempProxy = [testConnection rootProxy]; - [testConnection setDelegate:self]; + tempProxy = (NetworkObject *)[testConnection rootProxy]; [tempProxy serverName]; NS_HANDLER ITDebugLog(@"Connection to host failed: %@", host); - [testConnection invalidate]; [testConnection release]; [testPort release]; return NO; NS_ENDHANDLER - [testConnection invalidate]; + + if (!clientProxy) { + ITDebugLog(@"Null proxy! Couldn't connect!"); + [testConnection release]; + [testPort release]; + return NO; + } [testConnection release]; [testPort release]; return YES; @@ -227,21 +247,6 @@ static NetworkController *sharedController; return remoteServices; } -/*- (BOOL)authenticateComponents:(NSArray*)components withData:(NSData *)authenticationData -{ - return YES; - if (![[NSUserDefaults standardUserDefaults] boolForKey:@"enableSharingPassword"] || [authenticationData isEqualToData:serverPass]) { - return YES; - } else { - return NO; - } -} - -- (NSData *)authenticationDataForComponents:(NSArray *)components -{ - return clientPass; -}*/ - - (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing { ITDebugLog(@"Found service named %@.", [aNetService name]); diff --git a/NetworkObject.h b/NetworkObject.h index f211d19..75d534c 100755 --- a/NetworkObject.h +++ b/NetworkObject.h @@ -25,4 +25,7 @@ } - (ITMTRemote *)remote; - (NSString *)serverName; + +- (BOOL)requiresPassword; +- (BOOL)sendPassword:(NSData *)password; @end diff --git a/NetworkObject.m b/NetworkObject.m index 5ab7c79..da316e1 100755 --- a/NetworkObject.m +++ b/NetworkObject.m @@ -1,10 +1,19 @@ -// -// NetworkObject.m -// MenuTunes -// -// Created by Kent Sutherland on Tue Oct 28 2003. -// Copyright (c) 2003 __MyCompanyName__. All rights reserved. -// +/* + * MenuTunes + * NetworkObject + * Remote network object that is vended + * + * Original Author : Kent Sutherland + * Responsibility : Kent Sutherland + * + * Copyright (c) 2002 - 2003 iThink Software. + * All Rights Reserved + * + * This header defines the Objective-C protocol which all MenuTunes Remote + * plugins must implement. To build a remote, create a subclass of this + * object, and implement each method in the @protocol below. + * + */ #import "NetworkObject.h" #import "MainController.h" @@ -25,4 +34,18 @@ return name; } +- (BOOL)requiresPassword +{ + return [[NSUserDefaults standardUserDefaults] boolForKey:@"enableSharingPassword"]; +} + +- (BOOL)sendPassword:(NSData *)password +{ + if ([password isEqualToData:[[NSUserDefaults standardUserDefaults] dataForKey:@"sharedPlayerPassword"]]) { + return YES; + } else { + return NO; + } +} + @end diff --git a/PreferencesController.m b/PreferencesController.m index 5f38b44..96c19e8 100755 --- a/PreferencesController.m +++ b/PreferencesController.m @@ -199,14 +199,15 @@ static PreferencesController *prefs = nil; //Set the server password const char *instring = [[sender stringValue] UTF8String]; const char *password = "password"; - unsigned char result; + unsigned char *result; NSData *hashedPass, *passwordStringHash; - SHA1(instring, strlen(instring), &result); - hashedPass = [NSData dataWithBytes:&result length:strlen(&result)]; - SHA1(password, strlen(password), &result); - passwordStringHash = [NSData dataWithBytes:&result length:strlen(&result)]; + result = SHA1(instring, strlen(instring), NULL); + hashedPass = [NSData dataWithBytes:result length:strlen(result)]; + result = SHA1(password, strlen(password), NULL); + passwordStringHash = [NSData dataWithBytes:result length:strlen(result)]; if (![hashedPass isEqualToData:passwordStringHash]) { [df setObject:hashedPass forKey:@"sharedPlayerPassword"]; + [sender setStringValue:@"password"]; } } else if ( [sender tag] == 5040 ) { BOOL state = SENDER_STATE; @@ -249,9 +250,9 @@ static PreferencesController *prefs = nil; } } else if ( [sender tag] == 5150 ) { const char *instring = [[sender stringValue] UTF8String]; - unsigned char result; - SHA1(instring, strlen(instring), &result); - [df setObject:[NSData dataWithBytes:&result length:strlen(&result)] forKey:@"connectPassword"]; + unsigned char *result; + result = SHA1(instring, strlen(instring), NULL); + [df setObject:[NSData dataWithBytes:result length:strlen(result)] forKey:@"connectPassword"]; } else if ( [sender tag] == 5110 ) { //Cancel [NSApp endSheet:selectPlayerSheet]; @@ -308,7 +309,6 @@ static PreferencesController *prefs = nil; } else if ( effectTag == 2103 ) { [sw setEntryEffect:[[[ITSlideHorizontallyWindowEffect alloc] initWithWindow:sw] autorelease]]; } else if ( effectTag == 2104 ) { - NSLog(@"dflhgldf"); [sw setEntryEffect:[[[ITPivotWindowEffect alloc] initWithWindow:sw] autorelease]]; } @@ -795,11 +795,7 @@ static PreferencesController *prefs = nil; return [[hotKeysDictionary objectForKey:[hotKeysArray objectAtIndex:rowIndex]] description]; } } else { - if ([[aTableColumn identifier] isEqualToString:@"name"]) { - return [[[[NetworkController sharedController] remoteServices] objectAtIndex:rowIndex] name]; - } else { - return @"X"; - } + return [[[[NetworkController sharedController] remoteServices] objectAtIndex:rowIndex] name]; } } diff --git a/libValidate.a b/libValidate.a index 533f7dba605e83448b537140b340327d598c2c97..4a42a336fe1483cf528e15245308917641b8559c 100755 GIT binary patch delta 16 XcmaE0_rPv~EUTq~g^9sNB|CWlG(QC- delta 16 XcmaE0_rPv~EUSsBk*VQEB|CWlG#dpV -- 2.20.1