This is MiscRegistration.m in view mode; [Download] [Up]
// // MiscRegistration.m -- a class to sit underneath a Registration panel // Written by Don Yacktman Copyright (c) 1994 by Don Yacktman. // Version 1.0. All rights reserved. // // This notice may not be removed from this source code. // // This object is included in the MiscKit by permission from the author // and its use is governed by the MiscKit license, found in the file // "LICENSE.rtf" in the MiscKit distribution. Please refer to that file // for a list of all applicable permissions and restrictions. // #import <misckit/misckit.h> #define _notRegistered [strings valueForStringKey:"NotRegistered"] #define _unreg [strings valueForStringKey:"Unreg"] #define _reg [strings valueForStringKey:"Reg"] #define _OK [strings valueForStringKey:"OK"] #define _cantReg [strings valueForStringKey:"CantReg"] #define _badRegNum [strings valueForStringKey:"BadRegNum"] @implementation MiscRegistration + initialize { static NXDefaultsVector MiscRegistrationDefaults = { { MISC_KEY_DEFAULT, MISC_DEFAULT_KEY }, { NULL } }; NXRegisterDefaults([NXApp appName], MiscRegistrationDefaults); return self; } - init // make sure that *Panel is nil. { self = [super init]; _alertOnNoWrite = YES; registerPanel = nil; // get name of key file (inside app wrapper) _keyFileName = [MiscString newWithString:[NXApp appDirectory]]; [_keyFileName cat:"/"]; [_keyFileName cat:MISC_KEY_FILE_NAME]; _key = [[MiscString alloc] init]; _serialNum = [MiscString newWithString:MISC_UNREG_SERIAL_NUM]; [self readKey]; return self; } - setController:sender { controller = sender; return self; } - readKey { if (![self readKeyFromFile]) { // if read from file failed, then we need to try the one from // the defaults system. id keyString = [MiscString newWithString: NXGetDefaultValue([NXApp appName], MISC_KEY_DEFAULT)]; [_key setStringValue:[keyString stringValueAndFree]]; _alertOnNoWrite = NO; [self writeKeyToFile]; // attempt to remember the key _alertOnNoWrite = YES; } [self registered]; // make sure we are up to date on key verification // ***** even if not nil returned, may be invalid key... return self; } - writeKey { [self writeKeyToFile]; // **** this should only be written if the key is valid and single user, // in which case we do NOT write to key file! NXWriteDefault([NXApp appName], MISC_KEY_DEFAULT, [_key stringValue]); return self; } - readKeyFromFile { NXTypedStream *typedStream; FILE *testFile; char *temp; // first check for existence of file testFile = fopen([_keyFileName stringValue], "r"); if (testFile == NULL) { if (_notRegistered) [_key setStringValue:_notRegistered]; else [_key setStringValue:"No key."]; return nil; } fclose(testFile); typedStream = NXOpenTypedStreamForFile([_keyFileName stringValue], NX_READONLY); NXReadTypes(typedStream, "*", &temp); if (temp) { [_key setStringValue:temp]; } else { if (_notRegistered) { [_key setStringValue:_notRegistered]; } else { [_key setStringValue:"No key."]; } return nil; } NXCloseTypedStream(typedStream); return self; } - writeKeyToFile { NXTypedStream *typedStream; id chmodString = [MiscString newWithString:"chmod 644 "]; // only owner... const char *temp = [_key stringValue]; typedStream = NXOpenTypedStreamForFile([_keyFileName stringValue], NX_WRITEONLY); if (!typedStream) { // ***** should only put this up for network licenses... if (_alertOnNoWrite) NXRunAlertPanel("writeKey", _cantReg, NULL, NULL, _OK); return nil; } NXWriteTypes(typedStream, "*", &temp); NXCloseTypedStream(typedStream); [chmodString concatenate:_keyFileName]; system([chmodString stringValueAndFree]); return self; } - registerPanel // return the registerPanel, load it if needed. { if( !registerPanel) { [NXApp loadNibSection:"Register.nib" owner:self withNames:NO]; if (!strings) { // attempt to load a ".strings" file ***** } if (!strings) { // failing that, use the controller's string table strings = [controller strings]; } } return registerPanel; } - registration:sender { [self registerPanel]; // make sure nib is loaded [self fillRegistrationText:regText]; [[self registerPanel] makeFirstResponder:regNumText]; if ([_key emptyString]) [_key setStringValue:_notRegistered]; [regNumText setStringValue:[_key stringValue]]; [regNumText selectText:self]; [NXApp runModalFor:[self registerPanel]]; return self; } - (BOOL)registered { // determine if the user has registered. if (![_key emptyString] && [self keyOK]) return YES; return NO; } - (BOOL)keyOK { // override to check the "_key" variable (a MiscString) for OK values... // you should set the stringValue of _serialNum to the serial number // that corresponds to the key. (ie, the serial num should be embedded // in the key in some way along with everything else.) return YES; // Why don't I provide a mechanism here? Because the code would allow // any fool to come up with fake keys. So you have to write your own // code for this method for your security. If you would like me to // write you a simple key encoding mechanism, I'd be happy to do so; // just contact me: Don_Yacktman@byu.edu. I will charge you for the // service, but I don't ask much. (It's based upon how long it takes // me to write it, and since I already have some algorithms, I could use // a simpler method that's a permutation of what I already have and // your cost wouldn't be much more that about $15. Contact me...) // One other note: A hacker could always come in and disable the // keys. We don't try to circumvent this at all, so you might want // to use a more complex integrity method to fool hackers. Again, I // can give suggestions to the truly paranoid, for a fee. However, // unless you're really paranoid, there is no need for this since a // hacker will eventually crack whatever scheme you use, and this // scheme is sufficient to keep everyone else honest, I believe. } - registerApp:sender // accept registration...or not... { [_key setStringValue:[regNumText stringValue]]; // grab the key they typed [self writeKey]; [self fillRegistrationText:regText]; [registerPanel orderOut:self]; [NXApp stopModal]; [[(MiscInfoController *)controller info] updateSerialNumber]; if (![self registered]) NXRunAlertPanel(NULL, _badRegNum, NULL, NULL, NULL); return self; } - cancelRegistration:sender // cancel registration modal loop... { [registerPanel orderOut:self]; [NXApp stopModal]; return self; } - fillRegistrationText:textField { // sets up a text field with the registration number... if ([self registered]) { const char *regFormat = _reg; id tempStr; if (!regFormat) regFormat = "Copy #%s is registered."; tempStr = [[MiscString alloc] initFromFormat:regFormat, [_serialNum stringValue]]; [[textField setStringValue:[tempStr stringValueAndFree]] setTextGray:NX_DKGRAY]; } else { [[textField setStringValue:_unreg] setTextGray:NX_WHITE]; } return self; } - (const char *)serialNumber { return [_serialNum stringValue]; } - (const char *)registrationKey { return [_key stringValue]; }; @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.