This is Services.m in view mode; [Download] [Up]
/*
SambaManger. A graphical frontend to configure the NetInfo enhanced samba.
Copyright (C) 1998 Robert Frank
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Robert Frank, frank@ifi.unibas.ch
*/
#import "Services.h"
#import "Controller.h"
#import "NIDirectory.h"
#import "NIProperty.h"
#import "Panels.h"
#import "SMBKeys.h"
#import "NetInfoKeys.h"
#define ALERT_STATUS(a,m,b1,b2,b3,arg1,status) \
NXRunAlertPanel(getString(a), getString(m), \
getString(b1), \
b2?getString(b2):NULL, \
b3?getString(b3):NULL, \
arg1, ni_error(status))
// The special sections (as spelled in smb.config):
char *sectionNames[] = {
NULL, // This is just a place holder for any service!
"homes",
"global",
"printers"
};
// An intermediate object for the dual text field (form):
@interface BiText:Object
{
id form;
id textDelegate;
char sep, pre, post, *strng;
}
- init:(char)s form:f pre:(char)b post:(char)e;
- free;
- setTextDelegate:sender;
- selectText:sender;
- nextText;
- setNextText:sender;
- setStringValue:(const char *)s;
- (const char *)stringValue;
@end
@implementation BiText
- init:(char)s form:f pre:(char)b post:(char)e
{
[super init];
textDelegate = nil;
form = f;
sep = s;
pre = b;
post = e;
strng = NULL;
return self;
}
- free
{
if (strng)
NXZoneFree([self zone], strng);
return [super free];
}
- textDidEnd:textObject endChar:(unsigned short)whyEnd
{
if (whyEnd == NX_RETURN)
if ([form selectedRow] == 1)
[textDelegate textDidEnd:textObject endChar:whyEnd];
return self;
}
- setTextDelegate:sender
{
textDelegate = sender;
return [form setTextDelegate:self];
}
- selectText:sender
{
return [form selectTextAt:0];
}
- nextText
{
return nil;
}
- setNextText:sender
{
return self;
}
- setStringValue:(const char *)s
{
char *p = NULL, *d, *str = NULL;
if (!s) {
[form setStringValue:"" at:0];
[form setStringValue:"" at:1];
return self;
} else {
p = str = NXCopyStringBufferFromZone(s, [self zone]);
if (pre && (*p == pre))
p++;
if (post && (str[strlen(str)-1] == post))
str[strlen(str)-1] = '\0';
}
if (d = strchr(p, sep)) {
[form setStringValue:d+1 at:1];
*d = '\0';
[form setStringValue:p at:0];
} else {
[form setStringValue:p at:0];
[form setStringValue:"" at:1];
}
NXZoneFree([self zone], str);
return self;
}
- (const char *)stringValue
{
int l1 = strlen([form stringValueAt:0]),
l2 = strlen([form stringValueAt:1]);
char *p;
p = strng = NXZoneRealloc([self zone], strng, l1 + l2 + 3);
if (pre)
*p++ = pre;
strcpy(p, [form stringValueAt:0]);
p+= l1;
*p++ = sep;
strcpy(p, [form stringValueAt:1]);
p+= l2;
if (post)
*p++ = post;
*p = '\0';
return strng;
}
@end
// An intermediate object for the file modes:
@interface FileModes:Object
{
id window;
id radio;
id check1, check2, check3;
id netinfoDir;
id prop;
int mask;
}
- init:w radio:r check1:c1 check2:c2 check3:c3 niDir:d label:(const char *)l;
- display:sender;
@end
@implementation FileModes
- show:(int)value
{
[check1 setState:value&0400 at:0 :0];
[check1 setState:value&0200 at:0 :1];
[check1 setState:value&0100 at:0 :2];
[check2 setState:value&0040 at:0 :0];
[check2 setState:value&0020 at:0 :1];
[check2 setState:value&0010 at:0 :2];
[check3 setState:value&0004 at:0 :0];
[check3 setState:value&0002 at:0 :1];
[check3 setState:value&0001 at:0 :2];
return self;
}
- changed:sender
{
char buf[4];
int col = [radio selectedCol];
[window setDocEdited:YES];
if (sender == radio) {
if (col) {
sprintf(buf, "%03o", mask&0777);
[prop updateValue:buf at:0];
[self show:mask];
} else {
[prop removeValues];
[self show:0];
}
} else {
[radio selectCellAt:0 :1];
mask = 0;
mask|= [[check1 cellAt:0 :0] state]?0400:0;
mask|= [[check1 cellAt:0 :1] state]?0200:0;
mask|= [[check1 cellAt:0 :2] state]?0100:0;
mask|= [[check2 cellAt:0 :0] state]?0040:0;
mask|= [[check2 cellAt:0 :1] state]?0020:0;
mask|= [[check2 cellAt:0 :2] state]?0010:0;
mask|= [[check3 cellAt:0 :0] state]?0004:0;
mask|= [[check3 cellAt:0 :1] state]?0002:0;
mask|= [[check3 cellAt:0 :2] state]?0001:0;
sprintf(buf, "%03o", mask);
[prop updateValue:buf at:0];
}
return self;
}
- init:w radio:r check1:c1 check2:c2 check3:c3 niDir:d label:(const char *)l
{
window =w;
radio = r;
check1 = c1;
check2 = c2;
check3 = c3;
netinfoDir = d;
mask = 0;
[radio setTarget:self];
[radio setAction:@selector(changed:)];
[check1 setTarget:self];
[check1 setAction:@selector(changed:)];
[check2 setTarget:self];
[check2 setAction:@selector(changed:)];
[check3 setTarget:self];
[check3 setAction:@selector(changed:)];
prop = [netinfoDir addCall:l displayAction:@selector(display:)];
[prop setDelegate:self];
return self;
}
- display:sender
{
mask = 0; // Isn't set if the string has no number!
sscanf([sender valueAt:0], "%o", &mask);
[radio selectCellAt:0 :mask?1:0];
[self show:mask];
return self;
}
@end
// Class variable with the string for the open/save panel's title.
static const char *hostTitle, *groupTitle, *userTitle, *servicesTitle;
@implementation Services
// ************************************************************************
// Class methods:
+ initialize
// Called once by the run time system
{
hostTitle = getString("Title:Hosts");
groupTitle = getString("Title:Groups");
userTitle = getString("Title:Users");
servicesTitle = getString("Title:Services");
return self;
}
+ new:sender at:(NXCoord *)offset
{
NIDirectory *NIDir;
Services *service = [Services alloc];
if ((service->serviceType = [[Panels new] selectService]) < 0)
return [service free];
if ((NIDir = [NIDirectory new:sender root:SMNI_SAMBA directory:NULL])) {
[NIDir setDelegate:service];
if ([service init:sender dirObj:NIDir delta:offset service:NULL]) {
[NIDir setSaveTitle:servicesTitle];
return service;
}
[NIDir close];
}
return [service free];
}
+ open:sender at:(NXCoord *)offset
{
NIDirectory *NIDir;
Services *service = [Services alloc];
const char *sName;
if ((NIDir = [NIDirectory open:sender root:SMNI_SAMBA withTitle:servicesTitle])) {
[NIDir setDelegate:service];
sName = [NIDir baseName];
for (service->serviceType = 3; service->serviceType; service->serviceType--)
if (!strcmp(sectionNames[service->serviceType], sName))
break;
if ([service init:sender dirObj:NIDir delta:offset service:sName])
return service;
[NIDir close];
}
return [service free];
}
// ************************************************************************
// Local methods:
- free
{
[remAnnounce free];
[mangleMap free];
[interfaces free];
[objCreateMask free];
[objDirMask free];
[objForceCreateMask free];
[objForceDirMask free];
return [super free];
}
// Set which page of options to display
- selectPage:sender
{
int number = [[matrixPages selectedCell] tag];
if (number != lastPage) {
[[boxChoices contentView] replaceSubview:lastPageID with:boxes[number]];
lastPageID = boxes[number];
lastPage = number;
[window display];
}
return self;
}
// Display the socket options
- getSocketOpts:sender
{
const char *p;
int i, count = [sender values];
for (i=0; i < count; i++) {
p = [sender valueAt:i];
if (!strcmp(p, S_SO_KEEPALIVE))
[formSOChecks selectCellAt:0 :0];
else if (!strcmp(p, S_SO_REUSEADDR))
[formSOChecks selectCellAt:1 :0];
else if (!strcmp(p, S_SO_BROADCAST))
[formSOChecks selectCellAt:0 :1];
else if (!strcmp(p, S_SO_TCP_NODEL))
[formSOChecks selectCellAt:1 :1];
else if (!strncmp(p, S_SO_SNDBUF, strlen(S_SO_SNDBUF))) {
p = strchr(p, '=') + 1;
[formSOBufSizes setStringValue:p at:0];
} else if (!strncmp(p, S_SO_RCVBUF, strlen(S_SO_RCVBUF))) {
p = strchr(p, '=') + 1;
[formSOBufSizes setStringValue:p at:1];
} else if (!strncmp(p, S_SO_SNDLOWAT, strlen(S_SO_SNDLOWAT))) {
p = strchr(p, '=') + 1;
[formSOLowWatMark setStringValue:p at:0];
} else if (!strncmp(p, S_SO_RCVLOWAT, strlen(S_SO_RCVLOWAT))) {
p = strchr(p, '=') + 1;
[formSOLowWatMark setStringValue:p at:1];
}
}
return self;
}
- setSocketOpts:sender
{
[window setDocEdited:YES];
return self;
}
// ************************************************************************
// Methods:
- (BOOL)minimumOK
{
if (serviceType > 0)
return [super minimumOK];
else
return YES;
}
- setGlobService
{
// GLOBALS
// access password security name mangling
[ni_dirObj addBool:S_ENCRYPT_PASS outlet:radioEncryptPasswd];
[ni_dirObj addBool:S_NULL_PASSWDS outlet:radioNullPasswd];
[ni_dirObj addBool:S_UNIX_REALNAME outlet:radioUnixRealName];
[ni_dirObj addInt:S_PASSWD_LEVEL text:textPasswdLevel slider:sliderPasswdLevel zero:NULL];
[ni_dirObj addPopup:S_SECURITY outlet:popupSecurity];
[ni_dirObj addString:S_HOSTS_EQUIV text:textHostsEquiv
button:[formSetPassSec cellAt:0 :0] mode:NIPT_FILE path:NULL title:NULL];
[ni_dirObj addString:S_PASSWD_CHAT outlet:textPasswdChat];
[ni_dirObj addString:S_PASSWD_PROG text:textPasswdProgram
button:[formSetPassSec cellAt:2 :0] mode:NIPT_FILE path:NULL title:NULL];
[ni_dirObj addString:S_ROOT_DIR text:textRootDirectory
button:[formSetPassSec cellAt:3 :0] mode:NIPT_DIR path:NULL title:NULL];
[ni_dirObj addString:S_SMB_PASSWD_FL text:textSMBPasswdFile
button:[formSetPassSec cellAt:4 :0] mode:NIPT_FILE path:NULL title:NULL];
[ni_dirObj addBrowser:S_PASSWD_SERVER browser:browserPasswdServer text:textPasswdServer
add:buttonAddPasswdServer remove:buttonRemPasswdServer];
[ni_dirObj addBool:S_CASE_SENSITIV outlet:radioCaseSensitive];
[ni_dirObj addBool:S_STRIP_DOT outlet:radioStripDot];
[ni_dirObj addInt:S_MANGLED_STACK text:textMangleStack slider:sliderMangleStack zero:NULL];
[ni_dirObj addPopup:S_CHAR_SET outlet:popupCharSet];
[ni_dirObj addPopup:S_CLNT_CODE_PG outlet:popupCodePage];
// Logon locking logging
[ni_dirObj addBool:S_DOMAIN_LOGONS outlet:radioDomainLogons];
[ni_dirObj addString:S_LOGON_PATH outlet:textLogonPath];
[ni_dirObj addString:S_LOGON_SCRIPT text:textLogonScript
button:[formGSetLogon cellAt:1 :0] mode:NIPT_FILE path:NULL title:NULL];
[ni_dirObj addString:S_MESSAGE outlet:textMessageCommand];
[ni_dirObj addString:S_SMB_RUN text:textSMBRun
button:[formGSetLogon cellAt:3 :0] mode:NIPT_FILE path:NULL title:NULL];
[ni_dirObj addString:S_USERNAME_MAP text:textUserNameMap
button:[formGSetLogon cellAt:4 :0] mode:NIPT_FILE path:NULL title:NULL];
[ni_dirObj addBool:S_STATUS outlet:radioStatus];
[ni_dirObj addBool:S_SYSLOG_ONLY outlet:radioSyslogOnly];
[ni_dirObj addString:S_LOCK_DIR text:textLockDir
button:buttonSetLockDir mode:NIPT_DIR path:NULL title:NULL];
//!!! suffix = log.%m
propLogFile = [ni_dirObj addString:S_LOG_FILE text:textLogFile
button:buttonSetLogFile mode:NIPT_DIR path:NULL title:NULL];
[ni_dirObj addInt:S_MAX_LOG_SIZE text:textLogSize slider:sliderLogSize
zero:getString("string:unlimited")];
[ni_dirObj addInt:S_LOG_LEVEL text:textLogLevel slider:sliderLogLevel zero:NULL];
// nmbd
[ni_dirObj addBool:S_DNS_PROXY outlet:radioDNSProxy];
[ni_dirObj addBool:S_LOCAL_MASTER outlet:radioLocalMaster];
[ni_dirObj addBool:S_TIME_SERVER outlet:radioTimeServer];
[ni_dirObj addBool:S_WINS_PROXY outlet:radioWINSProxy];
remAnnounce = [[BiText alloc] init:'/' form:formRemAnnounce pre:'\0' post:'\0'];
[ni_dirObj addBrowser:S_REM_ANNOUNCE browser:browserRemAnnounce text:remAnnounce
add:buttonAddRemAnnounce remove:buttonRemRemAnnounce];
[ni_dirObj addBrowser:S_NB_ALIASES browser:browserNBAliases text:textNBAliases
add:buttonAddNBAliases remove:buttonRemNBAliases];
// Startup
[ni_dirObj addBool:S_DOMAIN_MASTER outlet:radioDomainMaster];
[ni_dirObj addBool:S_LOAD_PRNTRS outlet:radioLoadPrinters];
[ni_dirObj addBool:S_PREF_MASTER outlet:radioPrefMaster];
[ni_dirObj addBool:S_WINS_SUPPORT outlet:radioWINSSupport];
[ni_dirObj addInt:S_OS_LEVEL text:textOSLevel slider:sliderOSLevel zero:NULL];
[ni_dirObj addPopup:S_ANNOUNCE_AS outlet:popupAnnounceAs];
[ni_dirObj addPopup:S_PRINTING outlet:popupPrinting];
[ni_dirObj addPopup:S_PROTOCOL outlet:popupProtocol];
propAnnounceVersion = [ni_dirObj addString:S_ANNOUNCE_VER outlet:textAnnounceVersion];
[ni_dirObj addString:S_CONF_FILE text:textConfigFile
button:[formSetStartup cellAt:1 :0] mode:NIPT_FILE path:NULL title:NULL];
[ni_dirObj addString:S_DEFAULT_SERV text:textDefaultService
button:[formSetStartup cellAt:2 :0] mode:NIPT_NETINFO
path:SMNI_SAMBA title:servicesTitle];
[ni_dirObj addString:S_NB_NAME outlet:textNetBIOSName];
[ni_dirObj addString:S_PRNTCAP_NAME text:textPrintcapName
button:[formSetStartup cellAt:4 :0] mode:NIPT_FILE path:NULL title:NULL];
[ni_dirObj addString:S_SERVER_STRNG outlet:textServerString];
[ni_dirObj addString:S_SOCK_ADDR outlet:textSocketAddress];
[ni_dirObj addString:S_WINS_SERVER text:textWINSServer
button:[formSetStartup cellAt:7 :0] mode:NIPT_NETINFO
path:SMNI_SAMBA title:hostTitle];
[ni_dirObj addString:S_WORKGROUP outlet:textWorkGroup];
interfaces = [[BiText alloc] init:'/' form:formInterfaces pre:'\0' post:'\0'];
[ni_dirObj addBrowser:S_INTERFACES browser:browserInterfaces text:interfaces
add:buttonAddInterfaces remove:buttonRemInterfaces];
[ni_dirObj addBrowser:S_AUTO_SERVICES browser:browserAutoServices
add:buttonAddAutoServices remove:buttonRemAutoServices
mode:NIPT_NETINFO path:SMNI_SAMBA title:servicesTitle];
// Tuning
[ni_dirObj addBool:S_GETWD_CACHE outlet:radioGetwdCache];
[ni_dirObj addBool:S_READ_PRED outlet:radioReadPrediction];
[ni_dirObj addBool:S_READ_RAW outlet:radioReadRaw];
[ni_dirObj addBool:S_SYNC_ALWAYS outlet:radioSyncAlways];
[ni_dirObj addBool:S_WRITE_RAW outlet:radioWriteRaw];
[ni_dirObj addInt:S_DEAD_TIME text:textDeadTime slider:sliderDeadTime
zero:getString("string:no timeout")];
[ni_dirObj addInt:S_KEEP_ALIVE text:textKeepAlive slider:sliderKeepAlive
zero:getString("string:no packets")];
[ni_dirObj addInt:S_LPQ_CACHE_TM text:textlpqCache slider:sliderlpqCache
zero:getString("string:no caching")];
[ni_dirObj addInt:S_READ_SIZE text:textReadSize slider:sliderReadSize zero:NULL];
[formSOBufSizes setTextDelegate:self];
[formSOLowWatMark setTextDelegate:self];
[formSOChecks setTarget:self];
[formSOChecks setAction:@selector(setSocketOpts:)];
[ni_dirObj addCall:S_SOCK_OPTS displayAction:@selector(getSocketOpts:)];
return self;
}
- setService
{
// SERVICES
// access
[ni_dirObj addBool:S_BROWSEABLE outlet:radioBrowseable];
[ni_dirObj addBool:S_GUEST_ONLY outlet:radioGuestOnly];
[ni_dirObj addBool:S_ONLY_USER outlet:radioOnlyUser];
[ni_dirObj addBool:S_PRNTABLE outlet:radioPrintable];
[ni_dirObj addBool:S_PUBLIC outlet:radioPublic];
[ni_dirObj addBool:S_READ_ONLY outlet:radioReadOnly];
propAllowHosts = [ni_dirObj addBrowser:S_ALLOWHOSTS browser:browserAllowHosts
add:buttonAddAllowHosts remove:buttonRemAllowHosts
mode:NIPT_NETINFO path:SMNI_HOSTS title:hostTitle];
propDenyHosts = [ni_dirObj addBrowser:S_DENY_HOSTS browser:browserDenyHosts
add:buttonAddDenyHosts remove:buttonRemDenyHosts
mode:NIPT_NETINFO path:SMNI_HOSTS title:hostTitle];
propReadList = [ni_dirObj addBrowser:S_READ_LIST browser:browserReadList
add:buttonAddReadList remove:buttonRemReadList
mode:NIPT_NETINFO path:SMNI_USERS title:userTitle];
propWriteList = [ni_dirObj addBrowser:S_WRITE_LIST browser:browserWriteList
add:buttonAddWriteList remove:buttonRemWriteList
mode:NIPT_NETINFO path:SMNI_USERS title:userTitle];
propValidUsers = [ni_dirObj addBrowser:S_VALID_USERS browser:browserValidUsers
add:buttonAddValidUsers remove:buttonRemValidUsers
mode:NIPT_NETINFO path:SMNI_USERS title:userTitle];
propInvalidUsers = [ni_dirObj addBrowser:S_INVALID_USERS browser:browserInvalidUsers
add:buttonAddInvalidUsers remove:buttonRemInvalidUsers
mode:NIPT_NETINFO path:SMNI_USERS title:userTitle];
[ni_dirObj addInt:S_MAX_CONNS text:textMaxCons slider:sliderMaxCons
zero:getString("string:unlimited")];
[ni_dirObj addString:S_VOLUME outlet:textVolume];
// File visibility name mangling
[ni_dirObj addBool:S_HIDE_DOT_FILE outlet:radioHideDots];
[ni_dirObj addBool:S_SET_DIR outlet:radioSetDir];
[ni_dirObj addBool:S_FOLLOW_SYMLNK outlet:radioFollowSymLinks];
[ni_dirObj addBool:S_WIDE_LINKS outlet:radioWideLinks];
[ni_dirObj addBrowser:S_DONT_DESCEND browser:browserDescend
add:buttonAddDescend remove:buttonRemDescend
mode:NIPT_DIR path:NULL title:NULL];
// seperator = '/'
propHideFiles = [ni_dirObj addBrowser:S_HIDE_FILES browser:browserHideFiles text:textHideFiles
add:buttonAddHideFiles remove:buttonRemHideFiles];
propHideFilesSeparator = [ni_dirObj addProperty:S_HIDE_FILES_S];
// seperator = '/'
propVetoFiles = [ni_dirObj addBrowser:S_VETO_FILES browser:browserVetoFiles text:textVetoFiles
add:buttonAddVetoFiles remove:buttonRemVetoFiles];
propVetoFilesSeparator = [ni_dirObj addProperty:S_VETO_FILES_S];
[ni_dirObj addBool:S_MANGLE_CASE outlet:radioMangleCase];
[ni_dirObj addBool:S_MANGLED_NAMES outlet:radioMangledName];
[ni_dirObj addBool:S_PRESERVE_CASE outlet:radioPreserveCase];
[ni_dirObj addBool:S_SHRT_PRS_CASE outlet:radioShortPresCase];
[ni_dirObj addBool:S_DEFAULT_CASE outlet:radioDefaultCase];
[ni_dirObj addBrowser:S_VALID_CHARS browser:browserValidChars text:textValidChars
add:buttonAddValidChars remove:buttonRemValidChars];
mangleMap = [[BiText alloc] init:' ' form:formMangleMap pre:'(' post:')'];
[ni_dirObj addBrowser:S_MANGLED_MAP browser:browserMangledMap text:mangleMap
add:buttonAddMangledMap remove:buttonRemMangledMap];
[ni_dirObj addChar:S_MANGLING_CHAR outlet:textMangleChar];
// File permissions locking logging
[ni_dirObj addBool:S_ALTPERM outlet:radioAlternate];
[ni_dirObj addBool:S_DEL_READ_ONLY outlet:radioDelReadOnly];
[ni_dirObj addBool:S_DOS_FILETIMES outlet:radioDOSFileTimes];
[ni_dirObj addBool:S_MAP_ARCHIVE outlet:radioMapArchive];
[ni_dirObj addBool:S_MAP_HIDDEN outlet:radioMapHidden];
[ni_dirObj addBool:S_MAP_SYSTEM outlet:radioMapSystem];
[ni_dirObj addString:S_FRCE_USER text:textForceUser
button:buttonSetForceUser mode:NIPT_NETINFO
path:SMNI_USERS title:userTitle];
[ni_dirObj addString:S_FRCE_GROUP text:textForceGroup
button:buttonSetForceGroup mode:NIPT_NETINFO
path:SMNI_GROUPS title:groupTitle];
objCreateMask = [[FileModes alloc] init:window radio:radioCreateMask
check1:check1CreateMask
check2:check2CreateMask
check3:check3CreateMask
niDir:ni_dirObj
label:S_CREATE_MASK];
objDirMask = [[FileModes alloc] init:window radio:radioDirMask
check1:check1DirMask
check2:check2DirMask
check3:check3DirMask
niDir:ni_dirObj
label:S_DIR_MASK];
objForceCreateMask = [[FileModes alloc] init:window radio:radioForceCreateMask
check1:check1ForceCreateMask
check2:check2ForceCreateMask
check3:check3ForceCreateMask
niDir:ni_dirObj
label:S_FRCE_CREAT_MD];
objForceDirMask = [[FileModes alloc] init:window radio:radioForceDirMask
check1:check1ForceDirMask
check2:check2ForceDirMask
check3:check3ForceDirMask
niDir:ni_dirObj
label:S_FRCE_DIR_MODE];
[ni_dirObj addBool:S_FAKE_OPLOCKS outlet:radioFakeOpLocks];
[ni_dirObj addBool:S_LOCKING outlet:radioLocking];
[ni_dirObj addBool:S_SHARE_MODES outlet:radioShareModes];
[ni_dirObj addBool:S_STRCT_LOCKING outlet:radioStrictLocking];
// Passwords and Security logon and execution startup
[ni_dirObj addBool:S_REVALIDATE outlet:radioRevalidate];
[ni_dirObj addString:S_GUEST_ACCOUNT text:textGuestAccount
button:buttonSetGuestAccount mode:NIPT_NETINFO
path:SMNI_USERS title:userTitle];
[ni_dirObj addBrowser:S_ADMINUSERS browser:browserAdminUsers
add:buttonAddAdminUsers remove:buttonRemAdminUsers
mode:NIPT_NETINFO path:SMNI_USERS title:userTitle];
propUserNames = [ni_dirObj addBrowser:S_USERNAME browser:browserUserNames
add:buttonAddUserNames remove:buttonRemUserNames
mode:NIPT_NETINFO path:SMNI_USERS title:userTitle];
propMagicOutput= [ni_dirObj addString:S_MAGIC_OUTPUT text:textMagicOutput
button:[formSetLogon cellAt:0 :0] mode:NIPT_DIR path:NULL title:NULL];
[ni_dirObj addString:S_MAGIC_SCRIPT text:textMagicScript
button:[formSetLogon cellAt:1 :0] mode:NIPT_FILE path:NULL title:NULL];
[ni_dirObj addString:S_PATH text:textPath
button:[formSetLogon cellAt:2 :0] mode:NIPT_DIR path:NULL title:NULL];
[ni_dirObj addString:S_PRE_EXEC text:textPreExecution
button:[formSetLogon cellAt:3 :0] mode:NIPT_FILE path:NULL title:NULL];
[ni_dirObj addString:S_POST_EXEC text:textPostExecution
button:[formSetLogon cellAt:4 :0] mode:NIPT_FILE path:NULL title:NULL];
[ni_dirObj addString:S_ROOT_PRE_EX text:textRootPreExecution
button:[formSetLogon cellAt:5 :0] mode:NIPT_FILE path:NULL title:NULL];
[ni_dirObj addString:S_ROOT_POST_EX text:textRootPostExecution
button:[formSetLogon cellAt:6 :0] mode:NIPT_FILE path:NULL title: NULL];
[ni_dirObj addString:S_INCLUDE text:textInclude
button:buttonSetInclude mode:NIPT_FILE path:NULL title: NULL];
return self;
}
- setPrinters
{
// PRINTERS
[[ni_dirObj addProperty:S_COMMENT] updateValue:"Template for all Samba Printers" at:0];
[[ni_dirObj addProperty:S_SHARE_MODES] updateValue:"no" at:0];
[[ni_dirObj addProperty:S_READ_ONLY] updateValue:"no" at:0];
[ni_dirObj addInt:S_MIN_PRNT_SPC text:textMinPrntSpace slider:sliderMinPrntSpace
zero:getString("string:no caching")];
[ni_dirObj addBool:S_AVAILABLE outlet:checkPAvailable];
[ni_dirObj addBool:S_BROWSEABLE outlet:radioPBrowseable];
[ni_dirObj addBool:S_POSTSCRIPT outlet:radioPostscript];
[ni_dirObj addBool:S_PUBLIC outlet:radioPPublic];
[ni_dirObj addBool:S_GUEST_ONLY outlet:radioPGuestOnly];
[ni_dirObj addBool:S_WRITEABLE outlet:radioPWriteable];
[[ni_dirObj addProperty:S_PRNTABLE] updateValue:"yes" at:0];
[ni_dirObj addString:S_PRNT_DRIVER outlet:textPrinterDriver];
[ni_dirObj addString:S_PATH text:textSpoolDirectory
button:buttonSetSpoolDir mode:NIPT_DIR path:NULL title: NULL];
[ni_dirObj addString:S_PRNT_COMM outlet:textUnixPrint];
[ni_dirObj addString:S_LPRM outlet:textUnixDelete];
[ni_dirObj addString:S_LPQ outlet:textUnixShowQueue];
[ni_dirObj addString:S_LPPAUSE outlet:textUnixPause];
[ni_dirObj addString:S_LPRESUME outlet:textUnixResume];
return self;
}
- setupAndLoad
{
NXRect bframe;
id nameProp;
// Set the target and action of the page pop up list.
popupPages = [buttonPages target];
[popupPages setTarget:self];
[popupPages setAction:@selector(selectPage:)];
matrixPages = [popupPages itemList];
// Set the users or group panel
panels = [Panels new];
locked = NO;
// Set the name field. If this was a +new, set the name for homes,
// globals, and printers (serviceType > 0)
nameProp = [ni_dirObj addProperty:S_NAME];
if (![ni_dirObj domainName] && (serviceType > 0))
[nameProp insertValue:sectionNames[serviceType]];
#define setOrigin(n) [n getFrame:&bframe]; bframe.origin.x = 5.0; bframe.origin.y = 5.0; [n setFrame:&bframe]
if (serviceType < 3) {
boxes[0] = boxSAccess; setOrigin(boxSAccess);
boxes[1] = boxSVisMangle; setOrigin(boxSVisMangle);
boxes[2] = boxSPermLock; setOrigin(boxSPermLock);
boxes[3] = boxSPwSecLogExecStart; setOrigin(boxSPwSecLogExecStart);
[self setService];
if (serviceType < 2) {
boxes[8] = nil; [popupPages removeItemAt:9];
boxes[7] = nil; [popupPages removeItemAt:8];
boxes[6] = nil; [popupPages removeItemAt:7];
boxes[5] = nil; [popupPages removeItemAt:6];
boxes[4] = nil; [popupPages removeItemAt:5];
} else {
// Put the box ids into a list:
boxes[4] = boxGAccPwSecNM; setOrigin(boxGAccPwSecNM);
boxes[5] = boxGLockLog; setOrigin(boxGLockLog);
boxes[6] = boxGBinder; setOrigin(boxGBinder);
boxes[7] = boxGStartup; setOrigin(boxGStartup);
boxes[8] = boxGTunig; setOrigin(boxGTunig);
[self setGlobService];
}
[[boxChoices contentView] replaceSubview:lastPageID with:boxes[0]];
lastPageID = boxSAccess;
lastPage = 0;
} else {
setOrigin(boxPrinters);
[[window contentView] replaceSubview:boxChoices with:boxPrinters];
[self setPrinters];
}
[ni_dirObj scan];
return self;
}
// ************************************************************************
// Delegates:
- (int)willSelect:sender what:(int)kind path:(char **)ni_path title:(char **)ni_panel_title state:(int *)mode
{
if ((sender == propReadList) || (sender == propWriteList) ||
(sender == propValidUsers) || (sender == propInvalidUsers) ||
(sender == propUserNames)) {
if ((*mode = [panels userOrGroup]) == PS_NONE)
return NIPT_NONE;
if (*mode == PS_GROUP) {
*ni_path = SMNI_GROUPS;
*ni_panel_title = (char *)groupTitle;
}
} else if ((sender == propAllowHosts) || (sender == propDenyHosts)) {
if ((*mode = [panels netgroupOrHost]) == PS_NONE)
return NIPT_NONE;
}
return kind;
}
- (int)didSelect:sender what:(int)kind value:(char **)selection domain:(const char *)niDomain state:(int)mode
{
ni_id tempDir;
ni_name tempFullDir;
ni_namelist netgroupList;
void *tempHandle = NULL;
NIDomain *tempDomain;
char *p;
int status;
if (!*selection || !**selection)
return 0;
if ((sender == propLogFile) || (sender == propMagicOutput)) {
if (!strrchr(*selection, '.')) {
p = NXZoneRealloc([NXApp zone], *selection, strlen(*selection)+8);
if (p[strlen(p)-1] != '/')
(void)strcat(p,"/");
if (sender == propMagicOutput)
(void)strcat(p, "%U.out");
else
(void)strcat(p, "log.%m");
*selection = p;
}
} else if ((sender == propReadList) || (sender == propWriteList) ||
(sender == propValidUsers) || (sender == propInvalidUsers) ||
(sender == propUserNames)) {
if (mode == PS_GROUP) {
p = NXZoneRealloc([NXApp zone], *selection, strlen(*selection)+1);
bcopy(p, p+1, strlen(p)+1);
*p = '@';
*selection = p;
}
} else if ((sender == propAllowHosts) || (sender == propDenyHosts)) {
if (mode == PS_GROUP) {
// Present a browser with all possible choices.
// Allocate and connect a NetInfo handle.
tempDomain = [[NIDomain alloc] init];
status = [tempDomain setConnection:niDomain readTimeout:5 writeTimeout:10 canAbort:YES mustWrite:NO];
if (status == NI_OK) {
tempHandle = [tempDomain getDomainHandle];
if (tempHandle == NULL) {
status = [tempDomain lastError];
}
}
if (status == NI_OK) {
tempFullDir = NXZoneMalloc([self zone], sizeof(char)*(strlen(SMNI_HOSTS)+strlen(*selection)+2));
(void)strcpy(tempFullDir, SMNI_HOSTS);
(void)strcat(tempFullDir, "/");
(void)strcat(tempFullDir, *selection);
// Locate the directory.
status = ni_pathsearch(tempHandle, &tempDir, tempFullDir);
ni_name_free(&tempFullDir);
if (status == NI_OK)
status = ni_lookupprop(tempHandle, &tempDir, SMNIP_NETGROUP, &netgroupList);
}
[tempDomain free];
if (status != NI_OK) {
ALERT_STATUS("Alert:NetInfo Error", "Message:Connecting to",
"Button:OK", NULL, NULL, niDomain, status);
return -1;
}
if (netgroupList.ni_namelist_len <= 0) {
status = NXRunAlertPanel(getString("Alert:Alert"),
getString("Message:No Netgroups"),
getString("Button:Try Again"),
getString("Button:Cancel"), NULL);
if (status == NX_ALERTALTERNATE)
return -1;
return 1;
}
p = (char *)[panels showNetgroups:&netgroupList];
if (!p) {
ni_namelist_free(&netgroupList);
return -1;
}
// Prepend the '@'
*selection = NXZoneRealloc([NXApp zone], *selection, strlen(p)+1);
strcpy(*selection+1, p);
**selection = '@';
ni_namelist_free(&netgroupList);
}
}
return 0;
}
- (BOOL)propertyWillChange:sender value:(char **)string default:(BOOL *)remove index:(int)anInt
{
char *p = *string;
int alert = 0;
if (*string && ((sender == propHideFiles) || (sender == propVetoFiles))) {
if (strchr(*string, '/')) {
NXRunAlertPanel(getString("Alert:Alert"),
getString("Message:No '/' in names allowed!"),
getString("Button:OK"),
NULL, NULL);
return YES;
}
} else if (*string && (sender == propAnnounceVersion)) {
alert = 1;
if (atoi(*string) > 0) {
if (p = strchr(*string, '.')) {
if (atoi(p+1) > 0)
alert = 0;
}
}
if (alert) {
NXRunAlertPanel(getString("Alert:Alert"),
getString("Message:Illegal version number in Anounce Version"),
getString("Button:OK"),
NULL, NULL);
return YES;
}
}
return NO;
}
- propertyDidChange:sender value:(const char *)string
{
if (locked)
return self;
[window setDocEdited:YES];
if (sender == propHideFiles) {
if (string)
[propHideFilesSeparator updateValue:"/" at:0];
else
[propHideFilesSeparator removeValues];
} else if (sender == propVetoFiles) {
if (string)
[propVetoFilesSeparator updateValue:"/" at:0];
else
[propVetoFilesSeparator removeValues];
}
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.