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.