1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * Configuration routines for the CUPS scheduler.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright © 2007-2018 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
6*5e7646d2SAndroid Build Coastguard Worker *
7*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more
8*5e7646d2SAndroid Build Coastguard Worker * information.
9*5e7646d2SAndroid Build Coastguard Worker */
10*5e7646d2SAndroid Build Coastguard Worker
11*5e7646d2SAndroid Build Coastguard Worker /*
12*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
13*5e7646d2SAndroid Build Coastguard Worker */
14*5e7646d2SAndroid Build Coastguard Worker
15*5e7646d2SAndroid Build Coastguard Worker #include "cupsd.h"
16*5e7646d2SAndroid Build Coastguard Worker #include <stdarg.h>
17*5e7646d2SAndroid Build Coastguard Worker #include <grp.h>
18*5e7646d2SAndroid Build Coastguard Worker #include <sys/utsname.h>
19*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_ASL_H
20*5e7646d2SAndroid Build Coastguard Worker # include <asl.h>
21*5e7646d2SAndroid Build Coastguard Worker #elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
22*5e7646d2SAndroid Build Coastguard Worker # define SD_JOURNAL_SUPPRESS_LOCATION
23*5e7646d2SAndroid Build Coastguard Worker # include <systemd/sd-journal.h>
24*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_ASL_H */
25*5e7646d2SAndroid Build Coastguard Worker #include <syslog.h>
26*5e7646d2SAndroid Build Coastguard Worker
27*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_LIBPAPER
28*5e7646d2SAndroid Build Coastguard Worker # include <paper.h>
29*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_LIBPAPER */
30*5e7646d2SAndroid Build Coastguard Worker
31*5e7646d2SAndroid Build Coastguard Worker
32*5e7646d2SAndroid Build Coastguard Worker /*
33*5e7646d2SAndroid Build Coastguard Worker * Possibly missing network definitions...
34*5e7646d2SAndroid Build Coastguard Worker */
35*5e7646d2SAndroid Build Coastguard Worker
36*5e7646d2SAndroid Build Coastguard Worker #ifndef INADDR_NONE
37*5e7646d2SAndroid Build Coastguard Worker # define INADDR_NONE 0xffffffff
38*5e7646d2SAndroid Build Coastguard Worker #endif /* !INADDR_NONE */
39*5e7646d2SAndroid Build Coastguard Worker
40*5e7646d2SAndroid Build Coastguard Worker
41*5e7646d2SAndroid Build Coastguard Worker /*
42*5e7646d2SAndroid Build Coastguard Worker * Configuration variable structure...
43*5e7646d2SAndroid Build Coastguard Worker */
44*5e7646d2SAndroid Build Coastguard Worker
45*5e7646d2SAndroid Build Coastguard Worker typedef enum
46*5e7646d2SAndroid Build Coastguard Worker {
47*5e7646d2SAndroid Build Coastguard Worker CUPSD_VARTYPE_INTEGER, /* Integer option */
48*5e7646d2SAndroid Build Coastguard Worker CUPSD_VARTYPE_TIME, /* Time interval option */
49*5e7646d2SAndroid Build Coastguard Worker CUPSD_VARTYPE_STRING, /* String option */
50*5e7646d2SAndroid Build Coastguard Worker CUPSD_VARTYPE_BOOLEAN, /* Boolean option */
51*5e7646d2SAndroid Build Coastguard Worker CUPSD_VARTYPE_PATHNAME, /* File/directory name option */
52*5e7646d2SAndroid Build Coastguard Worker CUPSD_VARTYPE_PERM /* File/directory permissions */
53*5e7646d2SAndroid Build Coastguard Worker } cupsd_vartype_t;
54*5e7646d2SAndroid Build Coastguard Worker
55*5e7646d2SAndroid Build Coastguard Worker typedef struct
56*5e7646d2SAndroid Build Coastguard Worker {
57*5e7646d2SAndroid Build Coastguard Worker const char *name; /* Name of variable */
58*5e7646d2SAndroid Build Coastguard Worker void *ptr; /* Pointer to variable */
59*5e7646d2SAndroid Build Coastguard Worker cupsd_vartype_t type; /* Type (int, string, address) */
60*5e7646d2SAndroid Build Coastguard Worker } cupsd_var_t;
61*5e7646d2SAndroid Build Coastguard Worker
62*5e7646d2SAndroid Build Coastguard Worker
63*5e7646d2SAndroid Build Coastguard Worker /*
64*5e7646d2SAndroid Build Coastguard Worker * Local globals...
65*5e7646d2SAndroid Build Coastguard Worker */
66*5e7646d2SAndroid Build Coastguard Worker
67*5e7646d2SAndroid Build Coastguard Worker static const cupsd_var_t cupsd_vars[] =
68*5e7646d2SAndroid Build Coastguard Worker {
69*5e7646d2SAndroid Build Coastguard Worker { "AutoPurgeJobs", &JobAutoPurge, CUPSD_VARTYPE_BOOLEAN },
70*5e7646d2SAndroid Build Coastguard Worker #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
71*5e7646d2SAndroid Build Coastguard Worker { "BrowseDNSSDSubTypes", &DNSSDSubTypes, CUPSD_VARTYPE_STRING },
72*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_DNSSD || HAVE_AVAHI */
73*5e7646d2SAndroid Build Coastguard Worker { "BrowseWebIF", &BrowseWebIF, CUPSD_VARTYPE_BOOLEAN },
74*5e7646d2SAndroid Build Coastguard Worker { "Browsing", &Browsing, CUPSD_VARTYPE_BOOLEAN },
75*5e7646d2SAndroid Build Coastguard Worker { "Classification", &Classification, CUPSD_VARTYPE_STRING },
76*5e7646d2SAndroid Build Coastguard Worker { "ClassifyOverride", &ClassifyOverride, CUPSD_VARTYPE_BOOLEAN },
77*5e7646d2SAndroid Build Coastguard Worker { "DefaultLanguage", &DefaultLanguage, CUPSD_VARTYPE_STRING },
78*5e7646d2SAndroid Build Coastguard Worker { "DefaultLeaseDuration", &DefaultLeaseDuration, CUPSD_VARTYPE_TIME },
79*5e7646d2SAndroid Build Coastguard Worker { "DefaultPaperSize", &DefaultPaperSize, CUPSD_VARTYPE_STRING },
80*5e7646d2SAndroid Build Coastguard Worker { "DefaultPolicy", &DefaultPolicy, CUPSD_VARTYPE_STRING },
81*5e7646d2SAndroid Build Coastguard Worker { "DefaultShared", &DefaultShared, CUPSD_VARTYPE_BOOLEAN },
82*5e7646d2SAndroid Build Coastguard Worker { "DirtyCleanInterval", &DirtyCleanInterval, CUPSD_VARTYPE_TIME },
83*5e7646d2SAndroid Build Coastguard Worker #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
84*5e7646d2SAndroid Build Coastguard Worker { "DNSSDHostName", &DNSSDHostName, CUPSD_VARTYPE_STRING },
85*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_DNSSD || HAVE_AVAHI */
86*5e7646d2SAndroid Build Coastguard Worker { "ErrorPolicy", &ErrorPolicy, CUPSD_VARTYPE_STRING },
87*5e7646d2SAndroid Build Coastguard Worker { "FilterLimit", &FilterLimit, CUPSD_VARTYPE_INTEGER },
88*5e7646d2SAndroid Build Coastguard Worker { "FilterNice", &FilterNice, CUPSD_VARTYPE_INTEGER },
89*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_GSSAPI
90*5e7646d2SAndroid Build Coastguard Worker { "GSSServiceName", &GSSServiceName, CUPSD_VARTYPE_STRING },
91*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_GSSAPI */
92*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_ONDEMAND
93*5e7646d2SAndroid Build Coastguard Worker { "IdleExitTimeout", &IdleExitTimeout, CUPSD_VARTYPE_TIME },
94*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_ONDEMAND */
95*5e7646d2SAndroid Build Coastguard Worker { "JobKillDelay", &JobKillDelay, CUPSD_VARTYPE_TIME },
96*5e7646d2SAndroid Build Coastguard Worker { "JobRetryLimit", &JobRetryLimit, CUPSD_VARTYPE_INTEGER },
97*5e7646d2SAndroid Build Coastguard Worker { "JobRetryInterval", &JobRetryInterval, CUPSD_VARTYPE_TIME },
98*5e7646d2SAndroid Build Coastguard Worker { "KeepAlive", &KeepAlive, CUPSD_VARTYPE_BOOLEAN },
99*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_LAUNCHD
100*5e7646d2SAndroid Build Coastguard Worker { "LaunchdTimeout", &IdleExitTimeout, CUPSD_VARTYPE_TIME },
101*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_LAUNCHD */
102*5e7646d2SAndroid Build Coastguard Worker { "LimitRequestBody", &MaxRequestSize, CUPSD_VARTYPE_INTEGER },
103*5e7646d2SAndroid Build Coastguard Worker { "ListenBackLog", &ListenBackLog, CUPSD_VARTYPE_INTEGER },
104*5e7646d2SAndroid Build Coastguard Worker { "LogDebugHistory", &LogDebugHistory, CUPSD_VARTYPE_INTEGER },
105*5e7646d2SAndroid Build Coastguard Worker { "MaxActiveJobs", &MaxActiveJobs, CUPSD_VARTYPE_INTEGER },
106*5e7646d2SAndroid Build Coastguard Worker { "MaxClients", &MaxClients, CUPSD_VARTYPE_INTEGER },
107*5e7646d2SAndroid Build Coastguard Worker { "MaxClientsPerHost", &MaxClientsPerHost, CUPSD_VARTYPE_INTEGER },
108*5e7646d2SAndroid Build Coastguard Worker { "MaxCopies", &MaxCopies, CUPSD_VARTYPE_INTEGER },
109*5e7646d2SAndroid Build Coastguard Worker { "MaxEvents", &MaxEvents, CUPSD_VARTYPE_INTEGER },
110*5e7646d2SAndroid Build Coastguard Worker { "MaxHoldTime", &MaxHoldTime, CUPSD_VARTYPE_TIME },
111*5e7646d2SAndroid Build Coastguard Worker { "MaxJobs", &MaxJobs, CUPSD_VARTYPE_INTEGER },
112*5e7646d2SAndroid Build Coastguard Worker { "MaxJobsPerPrinter", &MaxJobsPerPrinter, CUPSD_VARTYPE_INTEGER },
113*5e7646d2SAndroid Build Coastguard Worker { "MaxJobsPerUser", &MaxJobsPerUser, CUPSD_VARTYPE_INTEGER },
114*5e7646d2SAndroid Build Coastguard Worker { "MaxJobTime", &MaxJobTime, CUPSD_VARTYPE_TIME },
115*5e7646d2SAndroid Build Coastguard Worker { "MaxLeaseDuration", &MaxLeaseDuration, CUPSD_VARTYPE_TIME },
116*5e7646d2SAndroid Build Coastguard Worker { "MaxLogSize", &MaxLogSize, CUPSD_VARTYPE_INTEGER },
117*5e7646d2SAndroid Build Coastguard Worker { "MaxRequestSize", &MaxRequestSize, CUPSD_VARTYPE_INTEGER },
118*5e7646d2SAndroid Build Coastguard Worker { "MaxSubscriptions", &MaxSubscriptions, CUPSD_VARTYPE_INTEGER },
119*5e7646d2SAndroid Build Coastguard Worker { "MaxSubscriptionsPerJob", &MaxSubscriptionsPerJob, CUPSD_VARTYPE_INTEGER },
120*5e7646d2SAndroid Build Coastguard Worker { "MaxSubscriptionsPerPrinter",&MaxSubscriptionsPerPrinter, CUPSD_VARTYPE_INTEGER },
121*5e7646d2SAndroid Build Coastguard Worker { "MaxSubscriptionsPerUser", &MaxSubscriptionsPerUser, CUPSD_VARTYPE_INTEGER },
122*5e7646d2SAndroid Build Coastguard Worker { "MultipleOperationTimeout", &MultipleOperationTimeout, CUPSD_VARTYPE_TIME },
123*5e7646d2SAndroid Build Coastguard Worker { "PageLogFormat", &PageLogFormat, CUPSD_VARTYPE_STRING },
124*5e7646d2SAndroid Build Coastguard Worker { "PreserveJobFiles", &JobFiles, CUPSD_VARTYPE_TIME },
125*5e7646d2SAndroid Build Coastguard Worker { "PreserveJobHistory", &JobHistory, CUPSD_VARTYPE_TIME },
126*5e7646d2SAndroid Build Coastguard Worker { "ReloadTimeout", &ReloadTimeout, CUPSD_VARTYPE_TIME },
127*5e7646d2SAndroid Build Coastguard Worker { "RIPCache", &RIPCache, CUPSD_VARTYPE_STRING },
128*5e7646d2SAndroid Build Coastguard Worker { "RootCertDuration", &RootCertDuration, CUPSD_VARTYPE_TIME },
129*5e7646d2SAndroid Build Coastguard Worker { "ServerAdmin", &ServerAdmin, CUPSD_VARTYPE_STRING },
130*5e7646d2SAndroid Build Coastguard Worker { "ServerName", &ServerName, CUPSD_VARTYPE_STRING },
131*5e7646d2SAndroid Build Coastguard Worker { "StrictConformance", &StrictConformance, CUPSD_VARTYPE_BOOLEAN },
132*5e7646d2SAndroid Build Coastguard Worker { "Timeout", &Timeout, CUPSD_VARTYPE_TIME },
133*5e7646d2SAndroid Build Coastguard Worker { "WebInterface", &WebInterface, CUPSD_VARTYPE_BOOLEAN }
134*5e7646d2SAndroid Build Coastguard Worker };
135*5e7646d2SAndroid Build Coastguard Worker static const cupsd_var_t cupsfiles_vars[] =
136*5e7646d2SAndroid Build Coastguard Worker {
137*5e7646d2SAndroid Build Coastguard Worker { "AccessLog", &AccessLog, CUPSD_VARTYPE_STRING },
138*5e7646d2SAndroid Build Coastguard Worker { "CacheDir", &CacheDir, CUPSD_VARTYPE_STRING },
139*5e7646d2SAndroid Build Coastguard Worker { "ConfigFilePerm", &ConfigFilePerm, CUPSD_VARTYPE_PERM },
140*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
141*5e7646d2SAndroid Build Coastguard Worker { "CreateSelfSignedCerts", &CreateSelfSignedCerts, CUPSD_VARTYPE_BOOLEAN },
142*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
143*5e7646d2SAndroid Build Coastguard Worker { "DataDir", &DataDir, CUPSD_VARTYPE_STRING },
144*5e7646d2SAndroid Build Coastguard Worker { "DocumentRoot", &DocumentRoot, CUPSD_VARTYPE_STRING },
145*5e7646d2SAndroid Build Coastguard Worker { "ErrorLog", &ErrorLog, CUPSD_VARTYPE_STRING },
146*5e7646d2SAndroid Build Coastguard Worker { "FileDevice", &FileDevice, CUPSD_VARTYPE_BOOLEAN },
147*5e7646d2SAndroid Build Coastguard Worker { "FontPath", &FontPath, CUPSD_VARTYPE_STRING },
148*5e7646d2SAndroid Build Coastguard Worker { "LogFilePerm", &LogFilePerm, CUPSD_VARTYPE_PERM },
149*5e7646d2SAndroid Build Coastguard Worker { "LPDConfigFile", &LPDConfigFile, CUPSD_VARTYPE_STRING },
150*5e7646d2SAndroid Build Coastguard Worker { "PageLog", &PageLog, CUPSD_VARTYPE_STRING },
151*5e7646d2SAndroid Build Coastguard Worker { "Printcap", &Printcap, CUPSD_VARTYPE_STRING },
152*5e7646d2SAndroid Build Coastguard Worker { "RemoteRoot", &RemoteRoot, CUPSD_VARTYPE_STRING },
153*5e7646d2SAndroid Build Coastguard Worker { "RequestRoot", &RequestRoot, CUPSD_VARTYPE_STRING },
154*5e7646d2SAndroid Build Coastguard Worker { "ServerBin", &ServerBin, CUPSD_VARTYPE_PATHNAME },
155*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
156*5e7646d2SAndroid Build Coastguard Worker { "ServerKeychain", &ServerKeychain, CUPSD_VARTYPE_PATHNAME },
157*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
158*5e7646d2SAndroid Build Coastguard Worker { "ServerRoot", &ServerRoot, CUPSD_VARTYPE_PATHNAME },
159*5e7646d2SAndroid Build Coastguard Worker { "SMBConfigFile", &SMBConfigFile, CUPSD_VARTYPE_STRING },
160*5e7646d2SAndroid Build Coastguard Worker { "StateDir", &StateDir, CUPSD_VARTYPE_STRING },
161*5e7646d2SAndroid Build Coastguard Worker { "SyncOnClose", &SyncOnClose, CUPSD_VARTYPE_BOOLEAN },
162*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_AUTHORIZATION_H
163*5e7646d2SAndroid Build Coastguard Worker { "SystemGroupAuthKey", &SystemGroupAuthKey, CUPSD_VARTYPE_STRING },
164*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_AUTHORIZATION_H */
165*5e7646d2SAndroid Build Coastguard Worker { "TempDir", &TempDir, CUPSD_VARTYPE_PATHNAME }
166*5e7646d2SAndroid Build Coastguard Worker };
167*5e7646d2SAndroid Build Coastguard Worker
168*5e7646d2SAndroid Build Coastguard Worker static int default_auth_type = CUPSD_AUTH_AUTO;
169*5e7646d2SAndroid Build Coastguard Worker /* Default AuthType, if not specified */
170*5e7646d2SAndroid Build Coastguard Worker
171*5e7646d2SAndroid Build Coastguard Worker static const unsigned ones[4] =
172*5e7646d2SAndroid Build Coastguard Worker {
173*5e7646d2SAndroid Build Coastguard Worker 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
174*5e7646d2SAndroid Build Coastguard Worker };
175*5e7646d2SAndroid Build Coastguard Worker static const unsigned zeros[4] =
176*5e7646d2SAndroid Build Coastguard Worker {
177*5e7646d2SAndroid Build Coastguard Worker 0x00000000, 0x00000000, 0x00000000, 0x00000000
178*5e7646d2SAndroid Build Coastguard Worker };
179*5e7646d2SAndroid Build Coastguard Worker
180*5e7646d2SAndroid Build Coastguard Worker
181*5e7646d2SAndroid Build Coastguard Worker /*
182*5e7646d2SAndroid Build Coastguard Worker * Local functions...
183*5e7646d2SAndroid Build Coastguard Worker */
184*5e7646d2SAndroid Build Coastguard Worker
185*5e7646d2SAndroid Build Coastguard Worker static http_addrlist_t *get_address(const char *value, int defport);
186*5e7646d2SAndroid Build Coastguard Worker static int get_addr_and_mask(const char *value, unsigned *ip,
187*5e7646d2SAndroid Build Coastguard Worker unsigned *mask);
188*5e7646d2SAndroid Build Coastguard Worker static void mime_error_cb(void *ctx, const char *message);
189*5e7646d2SAndroid Build Coastguard Worker static int parse_aaa(cupsd_location_t *loc, char *line,
190*5e7646d2SAndroid Build Coastguard Worker char *value, int linenum);
191*5e7646d2SAndroid Build Coastguard Worker static int parse_fatal_errors(const char *s);
192*5e7646d2SAndroid Build Coastguard Worker static int parse_groups(const char *s, int linenum);
193*5e7646d2SAndroid Build Coastguard Worker static int parse_protocols(const char *s);
194*5e7646d2SAndroid Build Coastguard Worker static int parse_variable(const char *filename, int linenum,
195*5e7646d2SAndroid Build Coastguard Worker const char *line, const char *value,
196*5e7646d2SAndroid Build Coastguard Worker size_t num_vars,
197*5e7646d2SAndroid Build Coastguard Worker const cupsd_var_t *vars);
198*5e7646d2SAndroid Build Coastguard Worker static int read_cupsd_conf(cups_file_t *fp);
199*5e7646d2SAndroid Build Coastguard Worker static int read_cups_files_conf(cups_file_t *fp);
200*5e7646d2SAndroid Build Coastguard Worker static int read_location(cups_file_t *fp, char *name, int linenum);
201*5e7646d2SAndroid Build Coastguard Worker static int read_policy(cups_file_t *fp, char *name, int linenum);
202*5e7646d2SAndroid Build Coastguard Worker static void set_policy_defaults(cupsd_policy_t *pol);
203*5e7646d2SAndroid Build Coastguard Worker
204*5e7646d2SAndroid Build Coastguard Worker
205*5e7646d2SAndroid Build Coastguard Worker /*
206*5e7646d2SAndroid Build Coastguard Worker * 'cupsdAddAlias()' - Add a host alias.
207*5e7646d2SAndroid Build Coastguard Worker */
208*5e7646d2SAndroid Build Coastguard Worker
209*5e7646d2SAndroid Build Coastguard Worker void
cupsdAddAlias(cups_array_t * aliases,const char * name)210*5e7646d2SAndroid Build Coastguard Worker cupsdAddAlias(cups_array_t *aliases, /* I - Array of aliases */
211*5e7646d2SAndroid Build Coastguard Worker const char *name) /* I - Name to add */
212*5e7646d2SAndroid Build Coastguard Worker {
213*5e7646d2SAndroid Build Coastguard Worker cupsd_alias_t *a; /* New alias */
214*5e7646d2SAndroid Build Coastguard Worker size_t namelen; /* Length of name */
215*5e7646d2SAndroid Build Coastguard Worker
216*5e7646d2SAndroid Build Coastguard Worker
217*5e7646d2SAndroid Build Coastguard Worker namelen = strlen(name);
218*5e7646d2SAndroid Build Coastguard Worker
219*5e7646d2SAndroid Build Coastguard Worker if ((a = (cupsd_alias_t *)malloc(sizeof(cupsd_alias_t) + namelen)) == NULL)
220*5e7646d2SAndroid Build Coastguard Worker return;
221*5e7646d2SAndroid Build Coastguard Worker
222*5e7646d2SAndroid Build Coastguard Worker a->namelen = namelen;
223*5e7646d2SAndroid Build Coastguard Worker memcpy(a->name, name, namelen + 1); /* OK since a->name is allocated */
224*5e7646d2SAndroid Build Coastguard Worker
225*5e7646d2SAndroid Build Coastguard Worker cupsArrayAdd(aliases, a);
226*5e7646d2SAndroid Build Coastguard Worker }
227*5e7646d2SAndroid Build Coastguard Worker
228*5e7646d2SAndroid Build Coastguard Worker
229*5e7646d2SAndroid Build Coastguard Worker /*
230*5e7646d2SAndroid Build Coastguard Worker * 'cupsdCheckPermissions()' - Fix the mode and ownership of a file or directory.
231*5e7646d2SAndroid Build Coastguard Worker */
232*5e7646d2SAndroid Build Coastguard Worker
233*5e7646d2SAndroid Build Coastguard Worker int /* O - 0 on success, -1 on error, 1 on warning */
cupsdCheckPermissions(const char * filename,const char * suffix,mode_t mode,uid_t user,gid_t group,int is_dir,int create_dir)234*5e7646d2SAndroid Build Coastguard Worker cupsdCheckPermissions(
235*5e7646d2SAndroid Build Coastguard Worker const char *filename, /* I - File/directory name */
236*5e7646d2SAndroid Build Coastguard Worker const char *suffix, /* I - Additional file/directory name */
237*5e7646d2SAndroid Build Coastguard Worker mode_t mode, /* I - Permissions */
238*5e7646d2SAndroid Build Coastguard Worker uid_t user, /* I - Owner */
239*5e7646d2SAndroid Build Coastguard Worker gid_t group, /* I - Group */
240*5e7646d2SAndroid Build Coastguard Worker int is_dir, /* I - 1 = directory, 0 = file */
241*5e7646d2SAndroid Build Coastguard Worker int create_dir) /* I - 1 = create directory, -1 = create w/o logging, 0 = not */
242*5e7646d2SAndroid Build Coastguard Worker {
243*5e7646d2SAndroid Build Coastguard Worker int dir_created = 0; /* Did we create a directory? */
244*5e7646d2SAndroid Build Coastguard Worker char pathname[1024]; /* File name with prefix */
245*5e7646d2SAndroid Build Coastguard Worker struct stat fileinfo; /* Stat buffer */
246*5e7646d2SAndroid Build Coastguard Worker int is_symlink; /* Is "filename" a symlink? */
247*5e7646d2SAndroid Build Coastguard Worker
248*5e7646d2SAndroid Build Coastguard Worker
249*5e7646d2SAndroid Build Coastguard Worker /*
250*5e7646d2SAndroid Build Coastguard Worker * Prepend the given root to the filename before testing it...
251*5e7646d2SAndroid Build Coastguard Worker */
252*5e7646d2SAndroid Build Coastguard Worker
253*5e7646d2SAndroid Build Coastguard Worker if (suffix)
254*5e7646d2SAndroid Build Coastguard Worker {
255*5e7646d2SAndroid Build Coastguard Worker snprintf(pathname, sizeof(pathname), "%s/%s", filename, suffix);
256*5e7646d2SAndroid Build Coastguard Worker filename = pathname;
257*5e7646d2SAndroid Build Coastguard Worker }
258*5e7646d2SAndroid Build Coastguard Worker
259*5e7646d2SAndroid Build Coastguard Worker /*
260*5e7646d2SAndroid Build Coastguard Worker * See if we can stat the file/directory...
261*5e7646d2SAndroid Build Coastguard Worker */
262*5e7646d2SAndroid Build Coastguard Worker
263*5e7646d2SAndroid Build Coastguard Worker if (lstat(filename, &fileinfo))
264*5e7646d2SAndroid Build Coastguard Worker {
265*5e7646d2SAndroid Build Coastguard Worker if (errno == ENOENT && create_dir)
266*5e7646d2SAndroid Build Coastguard Worker {
267*5e7646d2SAndroid Build Coastguard Worker if (create_dir > 0)
268*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG, "Creating missing directory \"%s\"",
269*5e7646d2SAndroid Build Coastguard Worker filename);
270*5e7646d2SAndroid Build Coastguard Worker
271*5e7646d2SAndroid Build Coastguard Worker if (mkdir(filename, mode))
272*5e7646d2SAndroid Build Coastguard Worker {
273*5e7646d2SAndroid Build Coastguard Worker if (create_dir > 0)
274*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
275*5e7646d2SAndroid Build Coastguard Worker "Unable to create directory \"%s\" - %s", filename,
276*5e7646d2SAndroid Build Coastguard Worker strerror(errno));
277*5e7646d2SAndroid Build Coastguard Worker else
278*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
279*5e7646d2SAndroid Build Coastguard Worker sd_journal_print(LOG_ERR, "Unable to create directory \"%s\" - %s", filename, strerror(errno));
280*5e7646d2SAndroid Build Coastguard Worker #else
281*5e7646d2SAndroid Build Coastguard Worker syslog(LOG_ERR, "Unable to create directory \"%s\" - %s", filename, strerror(errno));
282*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
283*5e7646d2SAndroid Build Coastguard Worker
284*5e7646d2SAndroid Build Coastguard Worker return (-1);
285*5e7646d2SAndroid Build Coastguard Worker }
286*5e7646d2SAndroid Build Coastguard Worker
287*5e7646d2SAndroid Build Coastguard Worker dir_created = 1;
288*5e7646d2SAndroid Build Coastguard Worker fileinfo.st_mode = mode | S_IFDIR;
289*5e7646d2SAndroid Build Coastguard Worker }
290*5e7646d2SAndroid Build Coastguard Worker else
291*5e7646d2SAndroid Build Coastguard Worker return (create_dir ? -1 : 1);
292*5e7646d2SAndroid Build Coastguard Worker }
293*5e7646d2SAndroid Build Coastguard Worker
294*5e7646d2SAndroid Build Coastguard Worker if ((is_symlink = S_ISLNK(fileinfo.st_mode)) != 0)
295*5e7646d2SAndroid Build Coastguard Worker {
296*5e7646d2SAndroid Build Coastguard Worker if (stat(filename, &fileinfo))
297*5e7646d2SAndroid Build Coastguard Worker {
298*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "\"%s\" is a bad symlink - %s",
299*5e7646d2SAndroid Build Coastguard Worker filename, strerror(errno));
300*5e7646d2SAndroid Build Coastguard Worker return (-1);
301*5e7646d2SAndroid Build Coastguard Worker }
302*5e7646d2SAndroid Build Coastguard Worker }
303*5e7646d2SAndroid Build Coastguard Worker
304*5e7646d2SAndroid Build Coastguard Worker /*
305*5e7646d2SAndroid Build Coastguard Worker * Make sure it's a regular file or a directory as needed...
306*5e7646d2SAndroid Build Coastguard Worker */
307*5e7646d2SAndroid Build Coastguard Worker
308*5e7646d2SAndroid Build Coastguard Worker if (!dir_created && !is_dir && !S_ISREG(fileinfo.st_mode))
309*5e7646d2SAndroid Build Coastguard Worker {
310*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "\"%s\" is not a regular file.", filename);
311*5e7646d2SAndroid Build Coastguard Worker return (-1);
312*5e7646d2SAndroid Build Coastguard Worker }
313*5e7646d2SAndroid Build Coastguard Worker
314*5e7646d2SAndroid Build Coastguard Worker if (!dir_created && is_dir && !S_ISDIR(fileinfo.st_mode))
315*5e7646d2SAndroid Build Coastguard Worker {
316*5e7646d2SAndroid Build Coastguard Worker if (create_dir >= 0)
317*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "\"%s\" is not a directory.", filename);
318*5e7646d2SAndroid Build Coastguard Worker else
319*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
320*5e7646d2SAndroid Build Coastguard Worker sd_journal_print(LOG_ERR, "\"%s\" is not a directory.", filename);
321*5e7646d2SAndroid Build Coastguard Worker #else
322*5e7646d2SAndroid Build Coastguard Worker syslog(LOG_ERR, "\"%s\" is not a directory.", filename);
323*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
324*5e7646d2SAndroid Build Coastguard Worker
325*5e7646d2SAndroid Build Coastguard Worker return (-1);
326*5e7646d2SAndroid Build Coastguard Worker }
327*5e7646d2SAndroid Build Coastguard Worker
328*5e7646d2SAndroid Build Coastguard Worker /*
329*5e7646d2SAndroid Build Coastguard Worker * If the filename is a symlink, do not change permissions (STR #2937)...
330*5e7646d2SAndroid Build Coastguard Worker */
331*5e7646d2SAndroid Build Coastguard Worker
332*5e7646d2SAndroid Build Coastguard Worker if (is_symlink)
333*5e7646d2SAndroid Build Coastguard Worker return (0);
334*5e7646d2SAndroid Build Coastguard Worker
335*5e7646d2SAndroid Build Coastguard Worker /*
336*5e7646d2SAndroid Build Coastguard Worker * Fix owner, group, and mode as needed...
337*5e7646d2SAndroid Build Coastguard Worker */
338*5e7646d2SAndroid Build Coastguard Worker
339*5e7646d2SAndroid Build Coastguard Worker if (dir_created || fileinfo.st_uid != user || fileinfo.st_gid != group)
340*5e7646d2SAndroid Build Coastguard Worker {
341*5e7646d2SAndroid Build Coastguard Worker if (create_dir >= 0)
342*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG, "Repairing ownership of \"%s\"",
343*5e7646d2SAndroid Build Coastguard Worker filename);
344*5e7646d2SAndroid Build Coastguard Worker
345*5e7646d2SAndroid Build Coastguard Worker if (chown(filename, user, group) && !getuid())
346*5e7646d2SAndroid Build Coastguard Worker {
347*5e7646d2SAndroid Build Coastguard Worker if (create_dir >= 0)
348*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
349*5e7646d2SAndroid Build Coastguard Worker "Unable to change ownership of \"%s\" - %s", filename,
350*5e7646d2SAndroid Build Coastguard Worker strerror(errno));
351*5e7646d2SAndroid Build Coastguard Worker else
352*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
353*5e7646d2SAndroid Build Coastguard Worker sd_journal_print(LOG_ERR, "Unable to change ownership of \"%s\" - %s", filename, strerror(errno));
354*5e7646d2SAndroid Build Coastguard Worker #else
355*5e7646d2SAndroid Build Coastguard Worker syslog(LOG_ERR, "Unable to change ownership of \"%s\" - %s", filename, strerror(errno));
356*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
357*5e7646d2SAndroid Build Coastguard Worker
358*5e7646d2SAndroid Build Coastguard Worker return (1);
359*5e7646d2SAndroid Build Coastguard Worker }
360*5e7646d2SAndroid Build Coastguard Worker }
361*5e7646d2SAndroid Build Coastguard Worker
362*5e7646d2SAndroid Build Coastguard Worker if (dir_created || (fileinfo.st_mode & 07777) != mode)
363*5e7646d2SAndroid Build Coastguard Worker {
364*5e7646d2SAndroid Build Coastguard Worker if (create_dir >= 0)
365*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG, "Repairing access permissions of \"%s\"",
366*5e7646d2SAndroid Build Coastguard Worker filename);
367*5e7646d2SAndroid Build Coastguard Worker
368*5e7646d2SAndroid Build Coastguard Worker if (chmod(filename, mode))
369*5e7646d2SAndroid Build Coastguard Worker {
370*5e7646d2SAndroid Build Coastguard Worker if (create_dir >= 0)
371*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
372*5e7646d2SAndroid Build Coastguard Worker "Unable to change permissions of \"%s\" - %s", filename,
373*5e7646d2SAndroid Build Coastguard Worker strerror(errno));
374*5e7646d2SAndroid Build Coastguard Worker else
375*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
376*5e7646d2SAndroid Build Coastguard Worker sd_journal_print(LOG_ERR, "Unable to change permissions of \"%s\" - %s", filename, strerror(errno));
377*5e7646d2SAndroid Build Coastguard Worker #else
378*5e7646d2SAndroid Build Coastguard Worker syslog(LOG_ERR, "Unable to change permissions of \"%s\" - %s", filename, strerror(errno));
379*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
380*5e7646d2SAndroid Build Coastguard Worker
381*5e7646d2SAndroid Build Coastguard Worker return (1);
382*5e7646d2SAndroid Build Coastguard Worker }
383*5e7646d2SAndroid Build Coastguard Worker }
384*5e7646d2SAndroid Build Coastguard Worker
385*5e7646d2SAndroid Build Coastguard Worker /*
386*5e7646d2SAndroid Build Coastguard Worker * Everything is OK...
387*5e7646d2SAndroid Build Coastguard Worker */
388*5e7646d2SAndroid Build Coastguard Worker
389*5e7646d2SAndroid Build Coastguard Worker return (0);
390*5e7646d2SAndroid Build Coastguard Worker }
391*5e7646d2SAndroid Build Coastguard Worker
392*5e7646d2SAndroid Build Coastguard Worker
393*5e7646d2SAndroid Build Coastguard Worker /*
394*5e7646d2SAndroid Build Coastguard Worker * 'cupsdDefaultAuthType()' - Get the default AuthType.
395*5e7646d2SAndroid Build Coastguard Worker *
396*5e7646d2SAndroid Build Coastguard Worker * When the default_auth_type is "auto", this function tries to get the GSS
397*5e7646d2SAndroid Build Coastguard Worker * credentials for the server. If that succeeds we use Kerberos authentication,
398*5e7646d2SAndroid Build Coastguard Worker * otherwise we do a fallback to Basic authentication against the local user
399*5e7646d2SAndroid Build Coastguard Worker * accounts.
400*5e7646d2SAndroid Build Coastguard Worker */
401*5e7646d2SAndroid Build Coastguard Worker
402*5e7646d2SAndroid Build Coastguard Worker int /* O - Default AuthType value */
cupsdDefaultAuthType(void)403*5e7646d2SAndroid Build Coastguard Worker cupsdDefaultAuthType(void)
404*5e7646d2SAndroid Build Coastguard Worker {
405*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_GSSAPI
406*5e7646d2SAndroid Build Coastguard Worker OM_uint32 major_status, /* Major status code */
407*5e7646d2SAndroid Build Coastguard Worker minor_status; /* Minor status code */
408*5e7646d2SAndroid Build Coastguard Worker gss_name_t server_name; /* Server name */
409*5e7646d2SAndroid Build Coastguard Worker gss_buffer_desc token = GSS_C_EMPTY_BUFFER;
410*5e7646d2SAndroid Build Coastguard Worker /* Service name token */
411*5e7646d2SAndroid Build Coastguard Worker char buf[1024]; /* Service name buffer */
412*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_GSSAPI */
413*5e7646d2SAndroid Build Coastguard Worker
414*5e7646d2SAndroid Build Coastguard Worker
415*5e7646d2SAndroid Build Coastguard Worker /*
416*5e7646d2SAndroid Build Coastguard Worker * If we have already determined the correct default AuthType, use it...
417*5e7646d2SAndroid Build Coastguard Worker */
418*5e7646d2SAndroid Build Coastguard Worker
419*5e7646d2SAndroid Build Coastguard Worker if (default_auth_type != CUPSD_AUTH_AUTO)
420*5e7646d2SAndroid Build Coastguard Worker return (default_auth_type);
421*5e7646d2SAndroid Build Coastguard Worker
422*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_GSSAPI
423*5e7646d2SAndroid Build Coastguard Worker # ifdef __APPLE__
424*5e7646d2SAndroid Build Coastguard Worker /*
425*5e7646d2SAndroid Build Coastguard Worker * If the weak-linked GSSAPI/Kerberos library is not present, don't try
426*5e7646d2SAndroid Build Coastguard Worker * to use it...
427*5e7646d2SAndroid Build Coastguard Worker */
428*5e7646d2SAndroid Build Coastguard Worker
429*5e7646d2SAndroid Build Coastguard Worker if (&gss_init_sec_context == NULL)
430*5e7646d2SAndroid Build Coastguard Worker return (default_auth_type = CUPSD_AUTH_BASIC);
431*5e7646d2SAndroid Build Coastguard Worker # endif /* __APPLE__ */
432*5e7646d2SAndroid Build Coastguard Worker
433*5e7646d2SAndroid Build Coastguard Worker /*
434*5e7646d2SAndroid Build Coastguard Worker * Try to obtain the server's GSS credentials (GSSServiceName@servername). If
435*5e7646d2SAndroid Build Coastguard Worker * that fails we must use Basic...
436*5e7646d2SAndroid Build Coastguard Worker */
437*5e7646d2SAndroid Build Coastguard Worker
438*5e7646d2SAndroid Build Coastguard Worker snprintf(buf, sizeof(buf), "%s@%s", GSSServiceName, ServerName);
439*5e7646d2SAndroid Build Coastguard Worker
440*5e7646d2SAndroid Build Coastguard Worker token.value = buf;
441*5e7646d2SAndroid Build Coastguard Worker token.length = strlen(buf);
442*5e7646d2SAndroid Build Coastguard Worker server_name = GSS_C_NO_NAME;
443*5e7646d2SAndroid Build Coastguard Worker major_status = gss_import_name(&minor_status, &token,
444*5e7646d2SAndroid Build Coastguard Worker GSS_C_NT_HOSTBASED_SERVICE,
445*5e7646d2SAndroid Build Coastguard Worker &server_name);
446*5e7646d2SAndroid Build Coastguard Worker
447*5e7646d2SAndroid Build Coastguard Worker memset(&token, 0, sizeof(token));
448*5e7646d2SAndroid Build Coastguard Worker
449*5e7646d2SAndroid Build Coastguard Worker if (GSS_ERROR(major_status))
450*5e7646d2SAndroid Build Coastguard Worker {
451*5e7646d2SAndroid Build Coastguard Worker cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status,
452*5e7646d2SAndroid Build Coastguard Worker "cupsdDefaultAuthType: gss_import_name(%s) failed", buf);
453*5e7646d2SAndroid Build Coastguard Worker return (default_auth_type = CUPSD_AUTH_BASIC);
454*5e7646d2SAndroid Build Coastguard Worker }
455*5e7646d2SAndroid Build Coastguard Worker
456*5e7646d2SAndroid Build Coastguard Worker major_status = gss_display_name(&minor_status, server_name, &token, NULL);
457*5e7646d2SAndroid Build Coastguard Worker
458*5e7646d2SAndroid Build Coastguard Worker if (GSS_ERROR(major_status))
459*5e7646d2SAndroid Build Coastguard Worker {
460*5e7646d2SAndroid Build Coastguard Worker cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status,
461*5e7646d2SAndroid Build Coastguard Worker "cupsdDefaultAuthType: gss_display_name(%s) failed",
462*5e7646d2SAndroid Build Coastguard Worker buf);
463*5e7646d2SAndroid Build Coastguard Worker return (default_auth_type = CUPSD_AUTH_BASIC);
464*5e7646d2SAndroid Build Coastguard Worker }
465*5e7646d2SAndroid Build Coastguard Worker
466*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG,
467*5e7646d2SAndroid Build Coastguard Worker "cupsdDefaultAuthType: Attempting to acquire Kerberos "
468*5e7646d2SAndroid Build Coastguard Worker "credentials for %s...", (char *)token.value);
469*5e7646d2SAndroid Build Coastguard Worker
470*5e7646d2SAndroid Build Coastguard Worker ServerCreds = GSS_C_NO_CREDENTIAL;
471*5e7646d2SAndroid Build Coastguard Worker major_status = gss_acquire_cred(&minor_status, server_name, GSS_C_INDEFINITE,
472*5e7646d2SAndroid Build Coastguard Worker GSS_C_NO_OID_SET, GSS_C_ACCEPT,
473*5e7646d2SAndroid Build Coastguard Worker &ServerCreds, NULL, NULL);
474*5e7646d2SAndroid Build Coastguard Worker if (GSS_ERROR(major_status))
475*5e7646d2SAndroid Build Coastguard Worker {
476*5e7646d2SAndroid Build Coastguard Worker cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status,
477*5e7646d2SAndroid Build Coastguard Worker "cupsdDefaultAuthType: gss_acquire_cred(%s) failed",
478*5e7646d2SAndroid Build Coastguard Worker (char *)token.value);
479*5e7646d2SAndroid Build Coastguard Worker gss_release_name(&minor_status, &server_name);
480*5e7646d2SAndroid Build Coastguard Worker gss_release_buffer(&minor_status, &token);
481*5e7646d2SAndroid Build Coastguard Worker return (default_auth_type = CUPSD_AUTH_BASIC);
482*5e7646d2SAndroid Build Coastguard Worker }
483*5e7646d2SAndroid Build Coastguard Worker
484*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG,
485*5e7646d2SAndroid Build Coastguard Worker "cupsdDefaultAuthType: Kerberos credentials acquired "
486*5e7646d2SAndroid Build Coastguard Worker "successfully for %s.", (char *)token.value);
487*5e7646d2SAndroid Build Coastguard Worker
488*5e7646d2SAndroid Build Coastguard Worker gss_release_name(&minor_status, &server_name);
489*5e7646d2SAndroid Build Coastguard Worker gss_release_buffer(&minor_status, &token);
490*5e7646d2SAndroid Build Coastguard Worker
491*5e7646d2SAndroid Build Coastguard Worker HaveServerCreds = 1;
492*5e7646d2SAndroid Build Coastguard Worker
493*5e7646d2SAndroid Build Coastguard Worker return (default_auth_type = CUPSD_AUTH_NEGOTIATE);
494*5e7646d2SAndroid Build Coastguard Worker
495*5e7646d2SAndroid Build Coastguard Worker #else
496*5e7646d2SAndroid Build Coastguard Worker /*
497*5e7646d2SAndroid Build Coastguard Worker * No Kerberos support compiled in so just use Basic all the time...
498*5e7646d2SAndroid Build Coastguard Worker */
499*5e7646d2SAndroid Build Coastguard Worker
500*5e7646d2SAndroid Build Coastguard Worker return (default_auth_type = CUPSD_AUTH_BASIC);
501*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_GSSAPI */
502*5e7646d2SAndroid Build Coastguard Worker }
503*5e7646d2SAndroid Build Coastguard Worker
504*5e7646d2SAndroid Build Coastguard Worker
505*5e7646d2SAndroid Build Coastguard Worker /*
506*5e7646d2SAndroid Build Coastguard Worker * 'cupsdFreeAliases()' - Free all of the alias entries.
507*5e7646d2SAndroid Build Coastguard Worker */
508*5e7646d2SAndroid Build Coastguard Worker
509*5e7646d2SAndroid Build Coastguard Worker void
cupsdFreeAliases(cups_array_t * aliases)510*5e7646d2SAndroid Build Coastguard Worker cupsdFreeAliases(cups_array_t *aliases) /* I - Array of aliases */
511*5e7646d2SAndroid Build Coastguard Worker {
512*5e7646d2SAndroid Build Coastguard Worker cupsd_alias_t *a; /* Current alias */
513*5e7646d2SAndroid Build Coastguard Worker
514*5e7646d2SAndroid Build Coastguard Worker
515*5e7646d2SAndroid Build Coastguard Worker for (a = (cupsd_alias_t *)cupsArrayFirst(aliases);
516*5e7646d2SAndroid Build Coastguard Worker a;
517*5e7646d2SAndroid Build Coastguard Worker a = (cupsd_alias_t *)cupsArrayNext(aliases))
518*5e7646d2SAndroid Build Coastguard Worker free(a);
519*5e7646d2SAndroid Build Coastguard Worker
520*5e7646d2SAndroid Build Coastguard Worker cupsArrayDelete(aliases);
521*5e7646d2SAndroid Build Coastguard Worker }
522*5e7646d2SAndroid Build Coastguard Worker
523*5e7646d2SAndroid Build Coastguard Worker
524*5e7646d2SAndroid Build Coastguard Worker /*
525*5e7646d2SAndroid Build Coastguard Worker * 'cupsdReadConfiguration()' - Read the cupsd.conf file.
526*5e7646d2SAndroid Build Coastguard Worker */
527*5e7646d2SAndroid Build Coastguard Worker
528*5e7646d2SAndroid Build Coastguard Worker int /* O - 1 on success, 0 otherwise */
cupsdReadConfiguration(void)529*5e7646d2SAndroid Build Coastguard Worker cupsdReadConfiguration(void)
530*5e7646d2SAndroid Build Coastguard Worker {
531*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
532*5e7646d2SAndroid Build Coastguard Worker cups_file_t *fp; /* Configuration file */
533*5e7646d2SAndroid Build Coastguard Worker int status; /* Return status */
534*5e7646d2SAndroid Build Coastguard Worker char temp[1024], /* Temporary buffer */
535*5e7646d2SAndroid Build Coastguard Worker mimedir[1024], /* MIME directory */
536*5e7646d2SAndroid Build Coastguard Worker *slash; /* Directory separator */
537*5e7646d2SAndroid Build Coastguard Worker cups_lang_t *language; /* Language */
538*5e7646d2SAndroid Build Coastguard Worker struct passwd *user; /* Default user */
539*5e7646d2SAndroid Build Coastguard Worker struct group *group; /* Default group */
540*5e7646d2SAndroid Build Coastguard Worker char *old_serverroot, /* Old ServerRoot */
541*5e7646d2SAndroid Build Coastguard Worker *old_requestroot; /* Old RequestRoot */
542*5e7646d2SAndroid Build Coastguard Worker int old_remote_port; /* Old RemotePort */
543*5e7646d2SAndroid Build Coastguard Worker const char *tmpdir; /* TMPDIR environment variable */
544*5e7646d2SAndroid Build Coastguard Worker struct stat tmpinfo; /* Temporary directory info */
545*5e7646d2SAndroid Build Coastguard Worker cupsd_policy_t *p; /* Policy */
546*5e7646d2SAndroid Build Coastguard Worker
547*5e7646d2SAndroid Build Coastguard Worker
548*5e7646d2SAndroid Build Coastguard Worker /*
549*5e7646d2SAndroid Build Coastguard Worker * Save the old root paths...
550*5e7646d2SAndroid Build Coastguard Worker */
551*5e7646d2SAndroid Build Coastguard Worker
552*5e7646d2SAndroid Build Coastguard Worker old_serverroot = NULL;
553*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&old_serverroot, ServerRoot);
554*5e7646d2SAndroid Build Coastguard Worker old_requestroot = NULL;
555*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&old_requestroot, RequestRoot);
556*5e7646d2SAndroid Build Coastguard Worker
557*5e7646d2SAndroid Build Coastguard Worker /*
558*5e7646d2SAndroid Build Coastguard Worker * Reset the server configuration data...
559*5e7646d2SAndroid Build Coastguard Worker */
560*5e7646d2SAndroid Build Coastguard Worker
561*5e7646d2SAndroid Build Coastguard Worker cupsdDeleteAllLocations();
562*5e7646d2SAndroid Build Coastguard Worker
563*5e7646d2SAndroid Build Coastguard Worker cupsdDeleteAllListeners();
564*5e7646d2SAndroid Build Coastguard Worker
565*5e7646d2SAndroid Build Coastguard Worker old_remote_port = RemotePort;
566*5e7646d2SAndroid Build Coastguard Worker RemotePort = 0;
567*5e7646d2SAndroid Build Coastguard Worker
568*5e7646d2SAndroid Build Coastguard Worker /*
569*5e7646d2SAndroid Build Coastguard Worker * String options...
570*5e7646d2SAndroid Build Coastguard Worker */
571*5e7646d2SAndroid Build Coastguard Worker
572*5e7646d2SAndroid Build Coastguard Worker cupsdFreeAliases(ServerAlias);
573*5e7646d2SAndroid Build Coastguard Worker ServerAlias = NULL;
574*5e7646d2SAndroid Build Coastguard Worker
575*5e7646d2SAndroid Build Coastguard Worker cupsdClearString(&ServerName);
576*5e7646d2SAndroid Build Coastguard Worker cupsdClearString(&ServerAdmin);
577*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&ServerBin, CUPS_SERVERBIN);
578*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&RequestRoot, CUPS_REQUESTS);
579*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&CacheDir, CUPS_CACHEDIR);
580*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&DataDir, CUPS_DATADIR);
581*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&DocumentRoot, CUPS_DOCROOT);
582*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&AccessLog, CUPS_LOGDIR "/access_log");
583*5e7646d2SAndroid Build Coastguard Worker cupsdClearString(&ErrorLog);
584*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&PageLog, CUPS_LOGDIR "/page_log");
585*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&PageLogFormat,
586*5e7646d2SAndroid Build Coastguard Worker "%p %u %j %T %P %C %{job-billing} "
587*5e7646d2SAndroid Build Coastguard Worker "%{job-originating-host-name} %{job-name} %{media} %{sides}");
588*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&Printcap, CUPS_DEFAULT_PRINTCAP);
589*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&FontPath, CUPS_FONTPATH);
590*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&RemoteRoot, "remroot");
591*5e7646d2SAndroid Build Coastguard Worker cupsdSetStringf(&ServerHeader, "CUPS/%d.%d IPP/2.1", CUPS_VERSION_MAJOR,
592*5e7646d2SAndroid Build Coastguard Worker CUPS_VERSION_MINOR);
593*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&StateDir, CUPS_STATEDIR);
594*5e7646d2SAndroid Build Coastguard Worker
595*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(CUPS_DEFAULT_PRINTCAP, "/etc/printers.conf"))
596*5e7646d2SAndroid Build Coastguard Worker PrintcapFormat = PRINTCAP_SOLARIS;
597*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(CUPS_DEFAULT_PRINTCAP,
598*5e7646d2SAndroid Build Coastguard Worker "/Library/Preferences/org.cups.printers.plist"))
599*5e7646d2SAndroid Build Coastguard Worker PrintcapFormat = PRINTCAP_PLIST;
600*5e7646d2SAndroid Build Coastguard Worker else
601*5e7646d2SAndroid Build Coastguard Worker PrintcapFormat = PRINTCAP_BSD;
602*5e7646d2SAndroid Build Coastguard Worker
603*5e7646d2SAndroid Build Coastguard Worker strlcpy(temp, ConfigurationFile, sizeof(temp));
604*5e7646d2SAndroid Build Coastguard Worker if ((slash = strrchr(temp, '/')) != NULL)
605*5e7646d2SAndroid Build Coastguard Worker *slash = '\0';
606*5e7646d2SAndroid Build Coastguard Worker
607*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&ServerRoot, temp);
608*5e7646d2SAndroid Build Coastguard Worker
609*5e7646d2SAndroid Build Coastguard Worker cupsdClearString(&Classification);
610*5e7646d2SAndroid Build Coastguard Worker ClassifyOverride = 0;
611*5e7646d2SAndroid Build Coastguard Worker
612*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
613*5e7646d2SAndroid Build Coastguard Worker # ifdef HAVE_GNUTLS
614*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&ServerKeychain, "ssl");
615*5e7646d2SAndroid Build Coastguard Worker # else
616*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&ServerKeychain, "/Library/Keychains/System.keychain");
617*5e7646d2SAndroid Build Coastguard Worker # endif /* HAVE_GNUTLS */
618*5e7646d2SAndroid Build Coastguard Worker
619*5e7646d2SAndroid Build Coastguard Worker _httpTLSSetOptions(_HTTP_TLS_NONE, _HTTP_TLS_1_0, _HTTP_TLS_MAX);
620*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
621*5e7646d2SAndroid Build Coastguard Worker
622*5e7646d2SAndroid Build Coastguard Worker language = cupsLangDefault();
623*5e7646d2SAndroid Build Coastguard Worker
624*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(language->language, "C") || !strcmp(language->language, "POSIX"))
625*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&DefaultLanguage, "en");
626*5e7646d2SAndroid Build Coastguard Worker else
627*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&DefaultLanguage, language->language);
628*5e7646d2SAndroid Build Coastguard Worker
629*5e7646d2SAndroid Build Coastguard Worker cupsdClearString(&DefaultPaperSize);
630*5e7646d2SAndroid Build Coastguard Worker
631*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&RIPCache, "128m");
632*5e7646d2SAndroid Build Coastguard Worker
633*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&TempDir, NULL);
634*5e7646d2SAndroid Build Coastguard Worker
635*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_GSSAPI
636*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&GSSServiceName, CUPS_DEFAULT_GSSSERVICENAME);
637*5e7646d2SAndroid Build Coastguard Worker
638*5e7646d2SAndroid Build Coastguard Worker if (HaveServerCreds)
639*5e7646d2SAndroid Build Coastguard Worker {
640*5e7646d2SAndroid Build Coastguard Worker OM_uint32 minor_status; /* Minor status code */
641*5e7646d2SAndroid Build Coastguard Worker
642*5e7646d2SAndroid Build Coastguard Worker gss_release_cred(&minor_status, &ServerCreds);
643*5e7646d2SAndroid Build Coastguard Worker
644*5e7646d2SAndroid Build Coastguard Worker HaveServerCreds = 0;
645*5e7646d2SAndroid Build Coastguard Worker }
646*5e7646d2SAndroid Build Coastguard Worker
647*5e7646d2SAndroid Build Coastguard Worker ServerCreds = GSS_C_NO_CREDENTIAL;
648*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_GSSAPI */
649*5e7646d2SAndroid Build Coastguard Worker
650*5e7646d2SAndroid Build Coastguard Worker /*
651*5e7646d2SAndroid Build Coastguard Worker * Find the default user...
652*5e7646d2SAndroid Build Coastguard Worker */
653*5e7646d2SAndroid Build Coastguard Worker
654*5e7646d2SAndroid Build Coastguard Worker if ((user = getpwnam(CUPS_DEFAULT_USER)) != NULL)
655*5e7646d2SAndroid Build Coastguard Worker User = user->pw_uid;
656*5e7646d2SAndroid Build Coastguard Worker else
657*5e7646d2SAndroid Build Coastguard Worker {
658*5e7646d2SAndroid Build Coastguard Worker /*
659*5e7646d2SAndroid Build Coastguard Worker * Use the (historical) NFS nobody user ID (-2 as a 16-bit twos-
660*5e7646d2SAndroid Build Coastguard Worker * complement number...)
661*5e7646d2SAndroid Build Coastguard Worker */
662*5e7646d2SAndroid Build Coastguard Worker
663*5e7646d2SAndroid Build Coastguard Worker User = 65534;
664*5e7646d2SAndroid Build Coastguard Worker }
665*5e7646d2SAndroid Build Coastguard Worker
666*5e7646d2SAndroid Build Coastguard Worker endpwent();
667*5e7646d2SAndroid Build Coastguard Worker
668*5e7646d2SAndroid Build Coastguard Worker /*
669*5e7646d2SAndroid Build Coastguard Worker * Find the default group...
670*5e7646d2SAndroid Build Coastguard Worker */
671*5e7646d2SAndroid Build Coastguard Worker
672*5e7646d2SAndroid Build Coastguard Worker group = getgrnam(CUPS_DEFAULT_GROUP);
673*5e7646d2SAndroid Build Coastguard Worker endgrent();
674*5e7646d2SAndroid Build Coastguard Worker
675*5e7646d2SAndroid Build Coastguard Worker if (group)
676*5e7646d2SAndroid Build Coastguard Worker Group = group->gr_gid;
677*5e7646d2SAndroid Build Coastguard Worker else
678*5e7646d2SAndroid Build Coastguard Worker {
679*5e7646d2SAndroid Build Coastguard Worker /*
680*5e7646d2SAndroid Build Coastguard Worker * Fallback to group "nobody"...
681*5e7646d2SAndroid Build Coastguard Worker */
682*5e7646d2SAndroid Build Coastguard Worker
683*5e7646d2SAndroid Build Coastguard Worker group = getgrnam("nobody");
684*5e7646d2SAndroid Build Coastguard Worker endgrent();
685*5e7646d2SAndroid Build Coastguard Worker
686*5e7646d2SAndroid Build Coastguard Worker if (group)
687*5e7646d2SAndroid Build Coastguard Worker Group = group->gr_gid;
688*5e7646d2SAndroid Build Coastguard Worker else
689*5e7646d2SAndroid Build Coastguard Worker {
690*5e7646d2SAndroid Build Coastguard Worker /*
691*5e7646d2SAndroid Build Coastguard Worker * Use the (historical) NFS nobody group ID (-2 as a 16-bit twos-
692*5e7646d2SAndroid Build Coastguard Worker * complement number...)
693*5e7646d2SAndroid Build Coastguard Worker */
694*5e7646d2SAndroid Build Coastguard Worker
695*5e7646d2SAndroid Build Coastguard Worker Group = 65534;
696*5e7646d2SAndroid Build Coastguard Worker }
697*5e7646d2SAndroid Build Coastguard Worker }
698*5e7646d2SAndroid Build Coastguard Worker
699*5e7646d2SAndroid Build Coastguard Worker /*
700*5e7646d2SAndroid Build Coastguard Worker * Numeric options...
701*5e7646d2SAndroid Build Coastguard Worker */
702*5e7646d2SAndroid Build Coastguard Worker
703*5e7646d2SAndroid Build Coastguard Worker AccessLogLevel = CUPSD_ACCESSLOG_ACTIONS;
704*5e7646d2SAndroid Build Coastguard Worker ConfigFilePerm = CUPS_DEFAULT_CONFIG_FILE_PERM;
705*5e7646d2SAndroid Build Coastguard Worker FatalErrors = parse_fatal_errors(CUPS_DEFAULT_FATAL_ERRORS);
706*5e7646d2SAndroid Build Coastguard Worker default_auth_type = CUPSD_AUTH_BASIC;
707*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
708*5e7646d2SAndroid Build Coastguard Worker CreateSelfSignedCerts = TRUE;
709*5e7646d2SAndroid Build Coastguard Worker DefaultEncryption = HTTP_ENCRYPT_REQUIRED;
710*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
711*5e7646d2SAndroid Build Coastguard Worker DirtyCleanInterval = DEFAULT_KEEPALIVE;
712*5e7646d2SAndroid Build Coastguard Worker JobKillDelay = DEFAULT_TIMEOUT;
713*5e7646d2SAndroid Build Coastguard Worker JobRetryLimit = 5;
714*5e7646d2SAndroid Build Coastguard Worker JobRetryInterval = 300;
715*5e7646d2SAndroid Build Coastguard Worker FileDevice = FALSE;
716*5e7646d2SAndroid Build Coastguard Worker FilterLevel = 0;
717*5e7646d2SAndroid Build Coastguard Worker FilterLimit = 0;
718*5e7646d2SAndroid Build Coastguard Worker FilterNice = 0;
719*5e7646d2SAndroid Build Coastguard Worker HostNameLookups = FALSE;
720*5e7646d2SAndroid Build Coastguard Worker KeepAlive = TRUE;
721*5e7646d2SAndroid Build Coastguard Worker ListenBackLog = SOMAXCONN;
722*5e7646d2SAndroid Build Coastguard Worker LogDebugHistory = 200;
723*5e7646d2SAndroid Build Coastguard Worker LogFilePerm = CUPS_DEFAULT_LOG_FILE_PERM;
724*5e7646d2SAndroid Build Coastguard Worker LogLevel = CUPSD_LOG_WARN;
725*5e7646d2SAndroid Build Coastguard Worker LogTimeFormat = CUPSD_TIME_STANDARD;
726*5e7646d2SAndroid Build Coastguard Worker MaxClients = 100;
727*5e7646d2SAndroid Build Coastguard Worker MaxClientsPerHost = 0;
728*5e7646d2SAndroid Build Coastguard Worker MaxLogSize = 1024 * 1024;
729*5e7646d2SAndroid Build Coastguard Worker MaxRequestSize = 0;
730*5e7646d2SAndroid Build Coastguard Worker MultipleOperationTimeout = 900;
731*5e7646d2SAndroid Build Coastguard Worker NumSystemGroups = 0;
732*5e7646d2SAndroid Build Coastguard Worker ReloadTimeout = DEFAULT_KEEPALIVE;
733*5e7646d2SAndroid Build Coastguard Worker RootCertDuration = 300;
734*5e7646d2SAndroid Build Coastguard Worker Sandboxing = CUPSD_SANDBOXING_STRICT;
735*5e7646d2SAndroid Build Coastguard Worker StrictConformance = FALSE;
736*5e7646d2SAndroid Build Coastguard Worker SyncOnClose = FALSE;
737*5e7646d2SAndroid Build Coastguard Worker Timeout = 900;
738*5e7646d2SAndroid Build Coastguard Worker WebInterface = CUPS_DEFAULT_WEBIF;
739*5e7646d2SAndroid Build Coastguard Worker
740*5e7646d2SAndroid Build Coastguard Worker BrowseLocalProtocols = parse_protocols(CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS);
741*5e7646d2SAndroid Build Coastguard Worker BrowseWebIF = FALSE;
742*5e7646d2SAndroid Build Coastguard Worker Browsing = CUPS_DEFAULT_BROWSING;
743*5e7646d2SAndroid Build Coastguard Worker DefaultShared = CUPS_DEFAULT_DEFAULT_SHARED;
744*5e7646d2SAndroid Build Coastguard Worker
745*5e7646d2SAndroid Build Coastguard Worker #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
746*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&DNSSDSubTypes, "_cups,_print");
747*5e7646d2SAndroid Build Coastguard Worker cupsdClearString(&DNSSDHostName);
748*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_DNSSD || HAVE_AVAHI */
749*5e7646d2SAndroid Build Coastguard Worker
750*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&LPDConfigFile, CUPS_DEFAULT_LPD_CONFIG_FILE);
751*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&SMBConfigFile, CUPS_DEFAULT_SMB_CONFIG_FILE);
752*5e7646d2SAndroid Build Coastguard Worker
753*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&ErrorPolicy, "stop-printer");
754*5e7646d2SAndroid Build Coastguard Worker
755*5e7646d2SAndroid Build Coastguard Worker JobHistory = DEFAULT_HISTORY;
756*5e7646d2SAndroid Build Coastguard Worker JobFiles = DEFAULT_FILES;
757*5e7646d2SAndroid Build Coastguard Worker JobAutoPurge = 0;
758*5e7646d2SAndroid Build Coastguard Worker MaxHoldTime = 0;
759*5e7646d2SAndroid Build Coastguard Worker MaxJobs = 500;
760*5e7646d2SAndroid Build Coastguard Worker MaxActiveJobs = 0;
761*5e7646d2SAndroid Build Coastguard Worker MaxJobsPerUser = 0;
762*5e7646d2SAndroid Build Coastguard Worker MaxJobsPerPrinter = 0;
763*5e7646d2SAndroid Build Coastguard Worker MaxJobTime = 3 * 60 * 60; /* 3 hours */
764*5e7646d2SAndroid Build Coastguard Worker MaxCopies = CUPS_DEFAULT_MAX_COPIES;
765*5e7646d2SAndroid Build Coastguard Worker
766*5e7646d2SAndroid Build Coastguard Worker cupsdDeleteAllPolicies();
767*5e7646d2SAndroid Build Coastguard Worker cupsdClearString(&DefaultPolicy);
768*5e7646d2SAndroid Build Coastguard Worker
769*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_AUTHORIZATION_H
770*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&SystemGroupAuthKey, CUPS_DEFAULT_SYSTEM_AUTHKEY);
771*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_AUTHORIZATION_H */
772*5e7646d2SAndroid Build Coastguard Worker
773*5e7646d2SAndroid Build Coastguard Worker MaxSubscriptions = 100;
774*5e7646d2SAndroid Build Coastguard Worker MaxSubscriptionsPerJob = 0;
775*5e7646d2SAndroid Build Coastguard Worker MaxSubscriptionsPerPrinter = 0;
776*5e7646d2SAndroid Build Coastguard Worker MaxSubscriptionsPerUser = 0;
777*5e7646d2SAndroid Build Coastguard Worker DefaultLeaseDuration = 86400;
778*5e7646d2SAndroid Build Coastguard Worker MaxLeaseDuration = 0;
779*5e7646d2SAndroid Build Coastguard Worker
780*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_ONDEMAND
781*5e7646d2SAndroid Build Coastguard Worker IdleExitTimeout = 60;
782*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_ONDEMAND */
783*5e7646d2SAndroid Build Coastguard Worker
784*5e7646d2SAndroid Build Coastguard Worker /*
785*5e7646d2SAndroid Build Coastguard Worker * Setup environment variables...
786*5e7646d2SAndroid Build Coastguard Worker */
787*5e7646d2SAndroid Build Coastguard Worker
788*5e7646d2SAndroid Build Coastguard Worker cupsdInitEnv();
789*5e7646d2SAndroid Build Coastguard Worker
790*5e7646d2SAndroid Build Coastguard Worker /*
791*5e7646d2SAndroid Build Coastguard Worker * Read the cups-files.conf file...
792*5e7646d2SAndroid Build Coastguard Worker */
793*5e7646d2SAndroid Build Coastguard Worker
794*5e7646d2SAndroid Build Coastguard Worker if ((fp = cupsFileOpen(CupsFilesFile, "r")) != NULL)
795*5e7646d2SAndroid Build Coastguard Worker {
796*5e7646d2SAndroid Build Coastguard Worker status = read_cups_files_conf(fp);
797*5e7646d2SAndroid Build Coastguard Worker
798*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(fp);
799*5e7646d2SAndroid Build Coastguard Worker
800*5e7646d2SAndroid Build Coastguard Worker if (!status)
801*5e7646d2SAndroid Build Coastguard Worker {
802*5e7646d2SAndroid Build Coastguard Worker if (TestConfigFile)
803*5e7646d2SAndroid Build Coastguard Worker printf("\"%s\" contains errors.\n", CupsFilesFile);
804*5e7646d2SAndroid Build Coastguard Worker else
805*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
806*5e7646d2SAndroid Build Coastguard Worker sd_journal_print(LOG_ERR, "Unable to read \"%s\" due to errors.", CupsFilesFile);
807*5e7646d2SAndroid Build Coastguard Worker #else
808*5e7646d2SAndroid Build Coastguard Worker syslog(LOG_LPR, "Unable to read \"%s\" due to errors.", CupsFilesFile);
809*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
810*5e7646d2SAndroid Build Coastguard Worker
811*5e7646d2SAndroid Build Coastguard Worker return (0);
812*5e7646d2SAndroid Build Coastguard Worker }
813*5e7646d2SAndroid Build Coastguard Worker }
814*5e7646d2SAndroid Build Coastguard Worker else if (errno == ENOENT)
815*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "No %s, using defaults.", CupsFilesFile);
816*5e7646d2SAndroid Build Coastguard Worker else
817*5e7646d2SAndroid Build Coastguard Worker {
818*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
819*5e7646d2SAndroid Build Coastguard Worker sd_journal_print(LOG_ERR, "Unable to open \"%s\" - %s", CupsFilesFile, strerror(errno));
820*5e7646d2SAndroid Build Coastguard Worker #else
821*5e7646d2SAndroid Build Coastguard Worker syslog(LOG_LPR, "Unable to open \"%s\" - %s", CupsFilesFile, strerror(errno));
822*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
823*5e7646d2SAndroid Build Coastguard Worker
824*5e7646d2SAndroid Build Coastguard Worker return (0);
825*5e7646d2SAndroid Build Coastguard Worker }
826*5e7646d2SAndroid Build Coastguard Worker
827*5e7646d2SAndroid Build Coastguard Worker if (!ErrorLog)
828*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&ErrorLog, CUPS_LOGDIR "/error_log");
829*5e7646d2SAndroid Build Coastguard Worker
830*5e7646d2SAndroid Build Coastguard Worker /*
831*5e7646d2SAndroid Build Coastguard Worker * Read the cupsd.conf file...
832*5e7646d2SAndroid Build Coastguard Worker */
833*5e7646d2SAndroid Build Coastguard Worker
834*5e7646d2SAndroid Build Coastguard Worker if ((fp = cupsFileOpen(ConfigurationFile, "r")) == NULL)
835*5e7646d2SAndroid Build Coastguard Worker {
836*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
837*5e7646d2SAndroid Build Coastguard Worker sd_journal_print(LOG_ERR, "Unable to open \"%s\" - %s", ConfigurationFile, strerror(errno));
838*5e7646d2SAndroid Build Coastguard Worker #else
839*5e7646d2SAndroid Build Coastguard Worker syslog(LOG_LPR, "Unable to open \"%s\" - %s", ConfigurationFile, strerror(errno));
840*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
841*5e7646d2SAndroid Build Coastguard Worker
842*5e7646d2SAndroid Build Coastguard Worker return (0);
843*5e7646d2SAndroid Build Coastguard Worker }
844*5e7646d2SAndroid Build Coastguard Worker
845*5e7646d2SAndroid Build Coastguard Worker status = read_cupsd_conf(fp);
846*5e7646d2SAndroid Build Coastguard Worker
847*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(fp);
848*5e7646d2SAndroid Build Coastguard Worker
849*5e7646d2SAndroid Build Coastguard Worker if (!status)
850*5e7646d2SAndroid Build Coastguard Worker {
851*5e7646d2SAndroid Build Coastguard Worker if (TestConfigFile)
852*5e7646d2SAndroid Build Coastguard Worker printf("\"%s\" contains errors.\n", ConfigurationFile);
853*5e7646d2SAndroid Build Coastguard Worker else
854*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
855*5e7646d2SAndroid Build Coastguard Worker sd_journal_print(LOG_ERR, "Unable to read \"%s\" due to errors.", ConfigurationFile);
856*5e7646d2SAndroid Build Coastguard Worker #else
857*5e7646d2SAndroid Build Coastguard Worker syslog(LOG_LPR, "Unable to read \"%s\" due to errors.", ConfigurationFile);
858*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
859*5e7646d2SAndroid Build Coastguard Worker
860*5e7646d2SAndroid Build Coastguard Worker return (0);
861*5e7646d2SAndroid Build Coastguard Worker }
862*5e7646d2SAndroid Build Coastguard Worker
863*5e7646d2SAndroid Build Coastguard Worker RunUser = getuid();
864*5e7646d2SAndroid Build Coastguard Worker
865*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Remote access is %s.",
866*5e7646d2SAndroid Build Coastguard Worker RemotePort ? "enabled" : "disabled");
867*5e7646d2SAndroid Build Coastguard Worker
868*5e7646d2SAndroid Build Coastguard Worker if (!RemotePort)
869*5e7646d2SAndroid Build Coastguard Worker BrowseLocalProtocols = 0; /* Disable sharing - no remote access */
870*5e7646d2SAndroid Build Coastguard Worker
871*5e7646d2SAndroid Build Coastguard Worker /*
872*5e7646d2SAndroid Build Coastguard Worker * See if the ServerName is an IP address...
873*5e7646d2SAndroid Build Coastguard Worker */
874*5e7646d2SAndroid Build Coastguard Worker
875*5e7646d2SAndroid Build Coastguard Worker if (ServerName)
876*5e7646d2SAndroid Build Coastguard Worker {
877*5e7646d2SAndroid Build Coastguard Worker if (!ServerAlias)
878*5e7646d2SAndroid Build Coastguard Worker ServerAlias = cupsArrayNew(NULL, NULL);
879*5e7646d2SAndroid Build Coastguard Worker
880*5e7646d2SAndroid Build Coastguard Worker cupsdAddAlias(ServerAlias, ServerName);
881*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s", ServerName);
882*5e7646d2SAndroid Build Coastguard Worker }
883*5e7646d2SAndroid Build Coastguard Worker else
884*5e7646d2SAndroid Build Coastguard Worker {
885*5e7646d2SAndroid Build Coastguard Worker if (gethostname(temp, sizeof(temp)))
886*5e7646d2SAndroid Build Coastguard Worker {
887*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to get hostname: %s",
888*5e7646d2SAndroid Build Coastguard Worker strerror(errno));
889*5e7646d2SAndroid Build Coastguard Worker strlcpy(temp, "localhost", sizeof(temp));
890*5e7646d2SAndroid Build Coastguard Worker }
891*5e7646d2SAndroid Build Coastguard Worker
892*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&ServerName, temp);
893*5e7646d2SAndroid Build Coastguard Worker
894*5e7646d2SAndroid Build Coastguard Worker if (!ServerAlias)
895*5e7646d2SAndroid Build Coastguard Worker ServerAlias = cupsArrayNew(NULL, NULL);
896*5e7646d2SAndroid Build Coastguard Worker
897*5e7646d2SAndroid Build Coastguard Worker cupsdAddAlias(ServerAlias, temp);
898*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s", temp);
899*5e7646d2SAndroid Build Coastguard Worker
900*5e7646d2SAndroid Build Coastguard Worker if (HostNameLookups || RemotePort)
901*5e7646d2SAndroid Build Coastguard Worker {
902*5e7646d2SAndroid Build Coastguard Worker struct hostent *host; /* Host entry to get FQDN */
903*5e7646d2SAndroid Build Coastguard Worker
904*5e7646d2SAndroid Build Coastguard Worker if ((host = gethostbyname(temp)) != NULL)
905*5e7646d2SAndroid Build Coastguard Worker {
906*5e7646d2SAndroid Build Coastguard Worker if (_cups_strcasecmp(temp, host->h_name))
907*5e7646d2SAndroid Build Coastguard Worker {
908*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&ServerName, host->h_name);
909*5e7646d2SAndroid Build Coastguard Worker cupsdAddAlias(ServerAlias, host->h_name);
910*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s",
911*5e7646d2SAndroid Build Coastguard Worker host->h_name);
912*5e7646d2SAndroid Build Coastguard Worker }
913*5e7646d2SAndroid Build Coastguard Worker
914*5e7646d2SAndroid Build Coastguard Worker if (host->h_aliases)
915*5e7646d2SAndroid Build Coastguard Worker {
916*5e7646d2SAndroid Build Coastguard Worker for (i = 0; host->h_aliases[i]; i ++)
917*5e7646d2SAndroid Build Coastguard Worker if (_cups_strcasecmp(temp, host->h_aliases[i]))
918*5e7646d2SAndroid Build Coastguard Worker {
919*5e7646d2SAndroid Build Coastguard Worker cupsdAddAlias(ServerAlias, host->h_aliases[i]);
920*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s",
921*5e7646d2SAndroid Build Coastguard Worker host->h_aliases[i]);
922*5e7646d2SAndroid Build Coastguard Worker }
923*5e7646d2SAndroid Build Coastguard Worker }
924*5e7646d2SAndroid Build Coastguard Worker }
925*5e7646d2SAndroid Build Coastguard Worker }
926*5e7646d2SAndroid Build Coastguard Worker
927*5e7646d2SAndroid Build Coastguard Worker /*
928*5e7646d2SAndroid Build Coastguard Worker * Make sure we have the base hostname added as an alias, too!
929*5e7646d2SAndroid Build Coastguard Worker */
930*5e7646d2SAndroid Build Coastguard Worker
931*5e7646d2SAndroid Build Coastguard Worker if ((slash = strchr(temp, '.')) != NULL)
932*5e7646d2SAndroid Build Coastguard Worker {
933*5e7646d2SAndroid Build Coastguard Worker *slash = '\0';
934*5e7646d2SAndroid Build Coastguard Worker cupsdAddAlias(ServerAlias, temp);
935*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s", temp);
936*5e7646d2SAndroid Build Coastguard Worker }
937*5e7646d2SAndroid Build Coastguard Worker }
938*5e7646d2SAndroid Build Coastguard Worker
939*5e7646d2SAndroid Build Coastguard Worker for (slash = ServerName; isdigit(*slash & 255) || *slash == '.'; slash ++);
940*5e7646d2SAndroid Build Coastguard Worker
941*5e7646d2SAndroid Build Coastguard Worker ServerNameIsIP = !*slash;
942*5e7646d2SAndroid Build Coastguard Worker
943*5e7646d2SAndroid Build Coastguard Worker /*
944*5e7646d2SAndroid Build Coastguard Worker * Make sure ServerAdmin is initialized...
945*5e7646d2SAndroid Build Coastguard Worker */
946*5e7646d2SAndroid Build Coastguard Worker
947*5e7646d2SAndroid Build Coastguard Worker if (!ServerAdmin)
948*5e7646d2SAndroid Build Coastguard Worker cupsdSetStringf(&ServerAdmin, "root@%s", ServerName);
949*5e7646d2SAndroid Build Coastguard Worker
950*5e7646d2SAndroid Build Coastguard Worker /*
951*5e7646d2SAndroid Build Coastguard Worker * Use the default system group if none was supplied in cupsd.conf...
952*5e7646d2SAndroid Build Coastguard Worker */
953*5e7646d2SAndroid Build Coastguard Worker
954*5e7646d2SAndroid Build Coastguard Worker if (NumSystemGroups == 0)
955*5e7646d2SAndroid Build Coastguard Worker {
956*5e7646d2SAndroid Build Coastguard Worker if (!parse_groups(CUPS_DEFAULT_SYSTEM_GROUPS, 0))
957*5e7646d2SAndroid Build Coastguard Worker {
958*5e7646d2SAndroid Build Coastguard Worker /*
959*5e7646d2SAndroid Build Coastguard Worker * Find the group associated with GID 0...
960*5e7646d2SAndroid Build Coastguard Worker */
961*5e7646d2SAndroid Build Coastguard Worker
962*5e7646d2SAndroid Build Coastguard Worker group = getgrgid(0);
963*5e7646d2SAndroid Build Coastguard Worker endgrent();
964*5e7646d2SAndroid Build Coastguard Worker
965*5e7646d2SAndroid Build Coastguard Worker if (group != NULL)
966*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&SystemGroups[0], group->gr_name);
967*5e7646d2SAndroid Build Coastguard Worker else
968*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&SystemGroups[0], "unknown");
969*5e7646d2SAndroid Build Coastguard Worker
970*5e7646d2SAndroid Build Coastguard Worker SystemGroupIDs[0] = 0;
971*5e7646d2SAndroid Build Coastguard Worker NumSystemGroups = 1;
972*5e7646d2SAndroid Build Coastguard Worker }
973*5e7646d2SAndroid Build Coastguard Worker }
974*5e7646d2SAndroid Build Coastguard Worker
975*5e7646d2SAndroid Build Coastguard Worker /*
976*5e7646d2SAndroid Build Coastguard Worker * Make sure ConfigFilePerm and LogFilePerm have sane values...
977*5e7646d2SAndroid Build Coastguard Worker */
978*5e7646d2SAndroid Build Coastguard Worker
979*5e7646d2SAndroid Build Coastguard Worker ConfigFilePerm &= 0664;
980*5e7646d2SAndroid Build Coastguard Worker LogFilePerm &= 0664;
981*5e7646d2SAndroid Build Coastguard Worker
982*5e7646d2SAndroid Build Coastguard Worker /*
983*5e7646d2SAndroid Build Coastguard Worker * Open the system log for cupsd if necessary...
984*5e7646d2SAndroid Build Coastguard Worker */
985*5e7646d2SAndroid Build Coastguard Worker
986*5e7646d2SAndroid Build Coastguard Worker if (!LogStderr)
987*5e7646d2SAndroid Build Coastguard Worker {
988*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(AccessLog, "stderr"))
989*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&AccessLog, "syslog");
990*5e7646d2SAndroid Build Coastguard Worker
991*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(ErrorLog, "stderr"))
992*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&ErrorLog, "syslog");
993*5e7646d2SAndroid Build Coastguard Worker
994*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(PageLog, "stderr"))
995*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&PageLog, "syslog");
996*5e7646d2SAndroid Build Coastguard Worker }
997*5e7646d2SAndroid Build Coastguard Worker
998*5e7646d2SAndroid Build Coastguard Worker #if defined(HAVE_VSYSLOG) && !defined(HAVE_ASL_H) && !defined(HAVE_SYSTEMD_SD_JOURNAL_H)
999*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(AccessLog, "syslog") ||
1000*5e7646d2SAndroid Build Coastguard Worker !strcmp(ErrorLog, "syslog") ||
1001*5e7646d2SAndroid Build Coastguard Worker !strcmp(PageLog, "syslog"))
1002*5e7646d2SAndroid Build Coastguard Worker openlog("cupsd", LOG_PID | LOG_NOWAIT | LOG_NDELAY, LOG_LPR);
1003*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_VSYSLOG && !HAVE_ASL_H && !HAVE_SYSTEMD_SD_JOURNAL_H */
1004*5e7646d2SAndroid Build Coastguard Worker
1005*5e7646d2SAndroid Build Coastguard Worker /*
1006*5e7646d2SAndroid Build Coastguard Worker * Log the configuration file that was used...
1007*5e7646d2SAndroid Build Coastguard Worker */
1008*5e7646d2SAndroid Build Coastguard Worker
1009*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Loaded configuration file \"%s\"",
1010*5e7646d2SAndroid Build Coastguard Worker ConfigurationFile);
1011*5e7646d2SAndroid Build Coastguard Worker
1012*5e7646d2SAndroid Build Coastguard Worker /*
1013*5e7646d2SAndroid Build Coastguard Worker * Validate the Group and SystemGroup settings - they cannot be the same,
1014*5e7646d2SAndroid Build Coastguard Worker * otherwise the CGI programs will be able to authenticate as root without
1015*5e7646d2SAndroid Build Coastguard Worker * a password!
1016*5e7646d2SAndroid Build Coastguard Worker */
1017*5e7646d2SAndroid Build Coastguard Worker
1018*5e7646d2SAndroid Build Coastguard Worker if (!RunUser)
1019*5e7646d2SAndroid Build Coastguard Worker {
1020*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < NumSystemGroups; i ++)
1021*5e7646d2SAndroid Build Coastguard Worker if (Group == SystemGroupIDs[i])
1022*5e7646d2SAndroid Build Coastguard Worker break;
1023*5e7646d2SAndroid Build Coastguard Worker
1024*5e7646d2SAndroid Build Coastguard Worker if (i < NumSystemGroups)
1025*5e7646d2SAndroid Build Coastguard Worker {
1026*5e7646d2SAndroid Build Coastguard Worker /*
1027*5e7646d2SAndroid Build Coastguard Worker * Log the error and reset the group to a safe value...
1028*5e7646d2SAndroid Build Coastguard Worker */
1029*5e7646d2SAndroid Build Coastguard Worker
1030*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
1031*5e7646d2SAndroid Build Coastguard Worker "Group and SystemGroup cannot use the same groups.");
1032*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & (CUPSD_FATAL_CONFIG | CUPSD_FATAL_PERMISSIONS))
1033*5e7646d2SAndroid Build Coastguard Worker return (0);
1034*5e7646d2SAndroid Build Coastguard Worker
1035*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Resetting Group to \"nobody\"...");
1036*5e7646d2SAndroid Build Coastguard Worker
1037*5e7646d2SAndroid Build Coastguard Worker group = getgrnam("nobody");
1038*5e7646d2SAndroid Build Coastguard Worker endgrent();
1039*5e7646d2SAndroid Build Coastguard Worker
1040*5e7646d2SAndroid Build Coastguard Worker if (group != NULL)
1041*5e7646d2SAndroid Build Coastguard Worker Group = group->gr_gid;
1042*5e7646d2SAndroid Build Coastguard Worker else
1043*5e7646d2SAndroid Build Coastguard Worker {
1044*5e7646d2SAndroid Build Coastguard Worker /*
1045*5e7646d2SAndroid Build Coastguard Worker * Use the (historical) NFS nobody group ID (-2 as a 16-bit twos-
1046*5e7646d2SAndroid Build Coastguard Worker * complement number...)
1047*5e7646d2SAndroid Build Coastguard Worker */
1048*5e7646d2SAndroid Build Coastguard Worker
1049*5e7646d2SAndroid Build Coastguard Worker Group = 65534;
1050*5e7646d2SAndroid Build Coastguard Worker }
1051*5e7646d2SAndroid Build Coastguard Worker }
1052*5e7646d2SAndroid Build Coastguard Worker }
1053*5e7646d2SAndroid Build Coastguard Worker
1054*5e7646d2SAndroid Build Coastguard Worker /*
1055*5e7646d2SAndroid Build Coastguard Worker * Check that we have at least one listen/port line; if not, report this
1056*5e7646d2SAndroid Build Coastguard Worker * as an error and exit!
1057*5e7646d2SAndroid Build Coastguard Worker */
1058*5e7646d2SAndroid Build Coastguard Worker
1059*5e7646d2SAndroid Build Coastguard Worker if (cupsArrayCount(Listeners) == 0)
1060*5e7646d2SAndroid Build Coastguard Worker {
1061*5e7646d2SAndroid Build Coastguard Worker /*
1062*5e7646d2SAndroid Build Coastguard Worker * No listeners!
1063*5e7646d2SAndroid Build Coastguard Worker */
1064*5e7646d2SAndroid Build Coastguard Worker
1065*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_EMERG,
1066*5e7646d2SAndroid Build Coastguard Worker "No valid Listen or Port lines were found in the "
1067*5e7646d2SAndroid Build Coastguard Worker "configuration file.");
1068*5e7646d2SAndroid Build Coastguard Worker
1069*5e7646d2SAndroid Build Coastguard Worker /*
1070*5e7646d2SAndroid Build Coastguard Worker * Commit suicide...
1071*5e7646d2SAndroid Build Coastguard Worker */
1072*5e7646d2SAndroid Build Coastguard Worker
1073*5e7646d2SAndroid Build Coastguard Worker cupsdEndProcess(getpid(), 0);
1074*5e7646d2SAndroid Build Coastguard Worker }
1075*5e7646d2SAndroid Build Coastguard Worker
1076*5e7646d2SAndroid Build Coastguard Worker /*
1077*5e7646d2SAndroid Build Coastguard Worker * Set the default locale using the language and charset...
1078*5e7646d2SAndroid Build Coastguard Worker */
1079*5e7646d2SAndroid Build Coastguard Worker
1080*5e7646d2SAndroid Build Coastguard Worker cupsdSetStringf(&DefaultLocale, "%s.UTF-8", DefaultLanguage);
1081*5e7646d2SAndroid Build Coastguard Worker
1082*5e7646d2SAndroid Build Coastguard Worker /*
1083*5e7646d2SAndroid Build Coastguard Worker * Update all relative filenames to include the full path from ServerRoot...
1084*5e7646d2SAndroid Build Coastguard Worker */
1085*5e7646d2SAndroid Build Coastguard Worker
1086*5e7646d2SAndroid Build Coastguard Worker if (DocumentRoot[0] != '/')
1087*5e7646d2SAndroid Build Coastguard Worker cupsdSetStringf(&DocumentRoot, "%s/%s", ServerRoot, DocumentRoot);
1088*5e7646d2SAndroid Build Coastguard Worker
1089*5e7646d2SAndroid Build Coastguard Worker if (RequestRoot[0] != '/')
1090*5e7646d2SAndroid Build Coastguard Worker cupsdSetStringf(&RequestRoot, "%s/%s", ServerRoot, RequestRoot);
1091*5e7646d2SAndroid Build Coastguard Worker
1092*5e7646d2SAndroid Build Coastguard Worker if (ServerBin[0] != '/')
1093*5e7646d2SAndroid Build Coastguard Worker cupsdSetStringf(&ServerBin, "%s/%s", ServerRoot, ServerBin);
1094*5e7646d2SAndroid Build Coastguard Worker
1095*5e7646d2SAndroid Build Coastguard Worker if (StateDir[0] != '/')
1096*5e7646d2SAndroid Build Coastguard Worker cupsdSetStringf(&StateDir, "%s/%s", ServerRoot, StateDir);
1097*5e7646d2SAndroid Build Coastguard Worker
1098*5e7646d2SAndroid Build Coastguard Worker if (CacheDir[0] != '/')
1099*5e7646d2SAndroid Build Coastguard Worker cupsdSetStringf(&CacheDir, "%s/%s", ServerRoot, CacheDir);
1100*5e7646d2SAndroid Build Coastguard Worker
1101*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
1102*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(ServerKeychain, "internal"))
1103*5e7646d2SAndroid Build Coastguard Worker cupsdClearString(&ServerKeychain);
1104*5e7646d2SAndroid Build Coastguard Worker else if (ServerKeychain[0] != '/')
1105*5e7646d2SAndroid Build Coastguard Worker cupsdSetStringf(&ServerKeychain, "%s/%s", ServerRoot, ServerKeychain);
1106*5e7646d2SAndroid Build Coastguard Worker
1107*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG, "Using keychain \"%s\" for server name \"%s\".", ServerKeychain ? ServerKeychain : "internal", ServerName);
1108*5e7646d2SAndroid Build Coastguard Worker if (!CreateSelfSignedCerts)
1109*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG, "Self-signed TLS certificate generation is disabled.");
1110*5e7646d2SAndroid Build Coastguard Worker cupsSetServerCredentials(ServerKeychain, ServerName, CreateSelfSignedCerts);
1111*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
1112*5e7646d2SAndroid Build Coastguard Worker
1113*5e7646d2SAndroid Build Coastguard Worker /*
1114*5e7646d2SAndroid Build Coastguard Worker * Make sure that directories and config files are owned and
1115*5e7646d2SAndroid Build Coastguard Worker * writable by the user and group in the cupsd.conf file...
1116*5e7646d2SAndroid Build Coastguard Worker */
1117*5e7646d2SAndroid Build Coastguard Worker
1118*5e7646d2SAndroid Build Coastguard Worker snprintf(temp, sizeof(temp), "%s/rss", CacheDir);
1119*5e7646d2SAndroid Build Coastguard Worker
1120*5e7646d2SAndroid Build Coastguard Worker if ((cupsdCheckPermissions(RequestRoot, NULL, 0710, RunUser,
1121*5e7646d2SAndroid Build Coastguard Worker Group, 1, 1) < 0 ||
1122*5e7646d2SAndroid Build Coastguard Worker cupsdCheckPermissions(CacheDir, NULL, 0770, RunUser,
1123*5e7646d2SAndroid Build Coastguard Worker Group, 1, 1) < 0 ||
1124*5e7646d2SAndroid Build Coastguard Worker cupsdCheckPermissions(temp, NULL, 0775, RunUser,
1125*5e7646d2SAndroid Build Coastguard Worker Group, 1, 1) < 0 ||
1126*5e7646d2SAndroid Build Coastguard Worker cupsdCheckPermissions(StateDir, NULL, 0755, RunUser,
1127*5e7646d2SAndroid Build Coastguard Worker Group, 1, 1) < 0 ||
1128*5e7646d2SAndroid Build Coastguard Worker cupsdCheckPermissions(StateDir, "certs", RunUser ? 0711 : 0511, User,
1129*5e7646d2SAndroid Build Coastguard Worker SystemGroupIDs[0], 1, 1) < 0 ||
1130*5e7646d2SAndroid Build Coastguard Worker cupsdCheckPermissions(ServerRoot, NULL, 0755, RunUser,
1131*5e7646d2SAndroid Build Coastguard Worker Group, 1, 0) < 0 ||
1132*5e7646d2SAndroid Build Coastguard Worker cupsdCheckPermissions(ServerRoot, "ppd", 0755, RunUser,
1133*5e7646d2SAndroid Build Coastguard Worker Group, 1, 1) < 0 ||
1134*5e7646d2SAndroid Build Coastguard Worker cupsdCheckPermissions(ServerRoot, "ssl", 0700, RunUser,
1135*5e7646d2SAndroid Build Coastguard Worker Group, 1, 0) < 0 ||
1136*5e7646d2SAndroid Build Coastguard Worker cupsdCheckPermissions(ConfigurationFile, NULL, ConfigFilePerm, RunUser,
1137*5e7646d2SAndroid Build Coastguard Worker Group, 0, 0) < 0 ||
1138*5e7646d2SAndroid Build Coastguard Worker cupsdCheckPermissions(CupsFilesFile, NULL, ConfigFilePerm, RunUser,
1139*5e7646d2SAndroid Build Coastguard Worker Group, 0, 0) < 0 ||
1140*5e7646d2SAndroid Build Coastguard Worker cupsdCheckPermissions(ServerRoot, "classes.conf", 0600, RunUser,
1141*5e7646d2SAndroid Build Coastguard Worker Group, 0, 0) < 0 ||
1142*5e7646d2SAndroid Build Coastguard Worker cupsdCheckPermissions(ServerRoot, "printers.conf", 0600, RunUser,
1143*5e7646d2SAndroid Build Coastguard Worker Group, 0, 0) < 0 ||
1144*5e7646d2SAndroid Build Coastguard Worker cupsdCheckPermissions(ServerRoot, "passwd.md5", 0600, User,
1145*5e7646d2SAndroid Build Coastguard Worker Group, 0, 0) < 0) &&
1146*5e7646d2SAndroid Build Coastguard Worker (FatalErrors & CUPSD_FATAL_PERMISSIONS))
1147*5e7646d2SAndroid Build Coastguard Worker return (0);
1148*5e7646d2SAndroid Build Coastguard Worker
1149*5e7646d2SAndroid Build Coastguard Worker /*
1150*5e7646d2SAndroid Build Coastguard Worker * Update TempDir to the default if it hasn't been set already...
1151*5e7646d2SAndroid Build Coastguard Worker */
1152*5e7646d2SAndroid Build Coastguard Worker
1153*5e7646d2SAndroid Build Coastguard Worker #ifdef __APPLE__
1154*5e7646d2SAndroid Build Coastguard Worker if (TempDir && !RunUser &&
1155*5e7646d2SAndroid Build Coastguard Worker (!strncmp(TempDir, "/private/tmp", 12) || !strncmp(TempDir, "/tmp", 4)))
1156*5e7646d2SAndroid Build Coastguard Worker {
1157*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot use %s for TempDir.", TempDir);
1158*5e7646d2SAndroid Build Coastguard Worker cupsdClearString(&TempDir);
1159*5e7646d2SAndroid Build Coastguard Worker }
1160*5e7646d2SAndroid Build Coastguard Worker #endif /* __APPLE__ */
1161*5e7646d2SAndroid Build Coastguard Worker
1162*5e7646d2SAndroid Build Coastguard Worker if (!TempDir)
1163*5e7646d2SAndroid Build Coastguard Worker {
1164*5e7646d2SAndroid Build Coastguard Worker #ifdef __APPLE__
1165*5e7646d2SAndroid Build Coastguard Worker if ((tmpdir = getenv("TMPDIR")) != NULL &&
1166*5e7646d2SAndroid Build Coastguard Worker strncmp(tmpdir, "/private/tmp", 12) && strncmp(tmpdir, "/tmp", 4))
1167*5e7646d2SAndroid Build Coastguard Worker #else
1168*5e7646d2SAndroid Build Coastguard Worker if ((tmpdir = getenv("TMPDIR")) != NULL)
1169*5e7646d2SAndroid Build Coastguard Worker #endif /* __APPLE__ */
1170*5e7646d2SAndroid Build Coastguard Worker {
1171*5e7646d2SAndroid Build Coastguard Worker /*
1172*5e7646d2SAndroid Build Coastguard Worker * TMPDIR is defined, see if it is OK for us to use...
1173*5e7646d2SAndroid Build Coastguard Worker */
1174*5e7646d2SAndroid Build Coastguard Worker
1175*5e7646d2SAndroid Build Coastguard Worker if (stat(tmpdir, &tmpinfo))
1176*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to access TMPDIR (%s): %s",
1177*5e7646d2SAndroid Build Coastguard Worker tmpdir, strerror(errno));
1178*5e7646d2SAndroid Build Coastguard Worker else if (!S_ISDIR(tmpinfo.st_mode))
1179*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "TMPDIR (%s) is not a directory.",
1180*5e7646d2SAndroid Build Coastguard Worker tmpdir);
1181*5e7646d2SAndroid Build Coastguard Worker else if ((tmpinfo.st_uid != User || !(tmpinfo.st_mode & S_IWUSR)) &&
1182*5e7646d2SAndroid Build Coastguard Worker (tmpinfo.st_gid != Group || !(tmpinfo.st_mode & S_IWGRP)) &&
1183*5e7646d2SAndroid Build Coastguard Worker !(tmpinfo.st_mode & S_IWOTH))
1184*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
1185*5e7646d2SAndroid Build Coastguard Worker "TMPDIR (%s) has the wrong permissions.", tmpdir);
1186*5e7646d2SAndroid Build Coastguard Worker else
1187*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&TempDir, tmpdir);
1188*5e7646d2SAndroid Build Coastguard Worker }
1189*5e7646d2SAndroid Build Coastguard Worker }
1190*5e7646d2SAndroid Build Coastguard Worker
1191*5e7646d2SAndroid Build Coastguard Worker if (!TempDir)
1192*5e7646d2SAndroid Build Coastguard Worker {
1193*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Using default TempDir of %s/tmp...",
1194*5e7646d2SAndroid Build Coastguard Worker RequestRoot);
1195*5e7646d2SAndroid Build Coastguard Worker cupsdSetStringf(&TempDir, "%s/tmp", RequestRoot);
1196*5e7646d2SAndroid Build Coastguard Worker }
1197*5e7646d2SAndroid Build Coastguard Worker
1198*5e7646d2SAndroid Build Coastguard Worker setenv("TMPDIR", TempDir, 1);
1199*5e7646d2SAndroid Build Coastguard Worker
1200*5e7646d2SAndroid Build Coastguard Worker /*
1201*5e7646d2SAndroid Build Coastguard Worker * Make sure the temporary directory has the right permissions...
1202*5e7646d2SAndroid Build Coastguard Worker */
1203*5e7646d2SAndroid Build Coastguard Worker
1204*5e7646d2SAndroid Build Coastguard Worker if (!strncmp(TempDir, RequestRoot, strlen(RequestRoot)) ||
1205*5e7646d2SAndroid Build Coastguard Worker access(TempDir, 0))
1206*5e7646d2SAndroid Build Coastguard Worker {
1207*5e7646d2SAndroid Build Coastguard Worker /*
1208*5e7646d2SAndroid Build Coastguard Worker * Update ownership and permissions if the CUPS temp directory
1209*5e7646d2SAndroid Build Coastguard Worker * is under the spool directory or does not exist...
1210*5e7646d2SAndroid Build Coastguard Worker */
1211*5e7646d2SAndroid Build Coastguard Worker
1212*5e7646d2SAndroid Build Coastguard Worker if (cupsdCheckPermissions(TempDir, NULL, 01770, RunUser, Group, 1, 1) < 0 &&
1213*5e7646d2SAndroid Build Coastguard Worker (FatalErrors & CUPSD_FATAL_PERMISSIONS))
1214*5e7646d2SAndroid Build Coastguard Worker return (0);
1215*5e7646d2SAndroid Build Coastguard Worker }
1216*5e7646d2SAndroid Build Coastguard Worker
1217*5e7646d2SAndroid Build Coastguard Worker /*
1218*5e7646d2SAndroid Build Coastguard Worker * Update environment variables...
1219*5e7646d2SAndroid Build Coastguard Worker */
1220*5e7646d2SAndroid Build Coastguard Worker
1221*5e7646d2SAndroid Build Coastguard Worker cupsdUpdateEnv();
1222*5e7646d2SAndroid Build Coastguard Worker
1223*5e7646d2SAndroid Build Coastguard Worker /*
1224*5e7646d2SAndroid Build Coastguard Worker * Validate the default error policy...
1225*5e7646d2SAndroid Build Coastguard Worker */
1226*5e7646d2SAndroid Build Coastguard Worker
1227*5e7646d2SAndroid Build Coastguard Worker if (strcmp(ErrorPolicy, "retry-current-job") &&
1228*5e7646d2SAndroid Build Coastguard Worker strcmp(ErrorPolicy, "abort-job") &&
1229*5e7646d2SAndroid Build Coastguard Worker strcmp(ErrorPolicy, "retry-job") &&
1230*5e7646d2SAndroid Build Coastguard Worker strcmp(ErrorPolicy, "stop-printer"))
1231*5e7646d2SAndroid Build Coastguard Worker {
1232*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ALERT, "Invalid ErrorPolicy \"%s\", resetting to \"stop-printer\".", ErrorPolicy);
1233*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&ErrorPolicy, "stop-printer");
1234*5e7646d2SAndroid Build Coastguard Worker }
1235*5e7646d2SAndroid Build Coastguard Worker
1236*5e7646d2SAndroid Build Coastguard Worker /*
1237*5e7646d2SAndroid Build Coastguard Worker * Update default paper size setting as needed...
1238*5e7646d2SAndroid Build Coastguard Worker */
1239*5e7646d2SAndroid Build Coastguard Worker
1240*5e7646d2SAndroid Build Coastguard Worker if (!DefaultPaperSize)
1241*5e7646d2SAndroid Build Coastguard Worker {
1242*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_LIBPAPER
1243*5e7646d2SAndroid Build Coastguard Worker char *paper_result; /* Paper size name from libpaper */
1244*5e7646d2SAndroid Build Coastguard Worker
1245*5e7646d2SAndroid Build Coastguard Worker if ((paper_result = systempapername()) != NULL)
1246*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&DefaultPaperSize, paper_result);
1247*5e7646d2SAndroid Build Coastguard Worker else
1248*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_LIBPAPER */
1249*5e7646d2SAndroid Build Coastguard Worker if (!DefaultLanguage ||
1250*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(DefaultLanguage, "C") ||
1251*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(DefaultLanguage, "POSIX") ||
1252*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(DefaultLanguage, "en") ||
1253*5e7646d2SAndroid Build Coastguard Worker !_cups_strncasecmp(DefaultLanguage, "en.", 3) ||
1254*5e7646d2SAndroid Build Coastguard Worker !_cups_strncasecmp(DefaultLanguage, "en_US", 5) ||
1255*5e7646d2SAndroid Build Coastguard Worker !_cups_strncasecmp(DefaultLanguage, "en_CA", 5) ||
1256*5e7646d2SAndroid Build Coastguard Worker !_cups_strncasecmp(DefaultLanguage, "fr_CA", 5))
1257*5e7646d2SAndroid Build Coastguard Worker {
1258*5e7646d2SAndroid Build Coastguard Worker /*
1259*5e7646d2SAndroid Build Coastguard Worker * These are the only locales that will default to "letter" size...
1260*5e7646d2SAndroid Build Coastguard Worker */
1261*5e7646d2SAndroid Build Coastguard Worker
1262*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&DefaultPaperSize, "Letter");
1263*5e7646d2SAndroid Build Coastguard Worker }
1264*5e7646d2SAndroid Build Coastguard Worker else
1265*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&DefaultPaperSize, "A4");
1266*5e7646d2SAndroid Build Coastguard Worker }
1267*5e7646d2SAndroid Build Coastguard Worker
1268*5e7646d2SAndroid Build Coastguard Worker /*
1269*5e7646d2SAndroid Build Coastguard Worker * Update classification setting as needed...
1270*5e7646d2SAndroid Build Coastguard Worker */
1271*5e7646d2SAndroid Build Coastguard Worker
1272*5e7646d2SAndroid Build Coastguard Worker if (Classification && !_cups_strcasecmp(Classification, "none"))
1273*5e7646d2SAndroid Build Coastguard Worker cupsdClearString(&Classification);
1274*5e7646d2SAndroid Build Coastguard Worker
1275*5e7646d2SAndroid Build Coastguard Worker if (Classification)
1276*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Security set to \"%s\"", Classification);
1277*5e7646d2SAndroid Build Coastguard Worker
1278*5e7646d2SAndroid Build Coastguard Worker /*
1279*5e7646d2SAndroid Build Coastguard Worker * Check the MaxClients setting, and then allocate memory for it...
1280*5e7646d2SAndroid Build Coastguard Worker */
1281*5e7646d2SAndroid Build Coastguard Worker
1282*5e7646d2SAndroid Build Coastguard Worker if (MaxClients > (MaxFDs / 3) || MaxClients <= 0)
1283*5e7646d2SAndroid Build Coastguard Worker {
1284*5e7646d2SAndroid Build Coastguard Worker if (MaxClients > 0)
1285*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO,
1286*5e7646d2SAndroid Build Coastguard Worker "MaxClients limited to 1/3 (%d) of the file descriptor "
1287*5e7646d2SAndroid Build Coastguard Worker "limit (%d)...",
1288*5e7646d2SAndroid Build Coastguard Worker MaxFDs / 3, MaxFDs);
1289*5e7646d2SAndroid Build Coastguard Worker
1290*5e7646d2SAndroid Build Coastguard Worker MaxClients = MaxFDs / 3;
1291*5e7646d2SAndroid Build Coastguard Worker }
1292*5e7646d2SAndroid Build Coastguard Worker
1293*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Configured for up to %d clients.",
1294*5e7646d2SAndroid Build Coastguard Worker MaxClients);
1295*5e7646d2SAndroid Build Coastguard Worker
1296*5e7646d2SAndroid Build Coastguard Worker /*
1297*5e7646d2SAndroid Build Coastguard Worker * Check the MaxActiveJobs setting; limit to 1/3 the available
1298*5e7646d2SAndroid Build Coastguard Worker * file descriptors, since we need a pipe for each job...
1299*5e7646d2SAndroid Build Coastguard Worker */
1300*5e7646d2SAndroid Build Coastguard Worker
1301*5e7646d2SAndroid Build Coastguard Worker if (MaxActiveJobs > (MaxFDs / 3))
1302*5e7646d2SAndroid Build Coastguard Worker MaxActiveJobs = MaxFDs / 3;
1303*5e7646d2SAndroid Build Coastguard Worker
1304*5e7646d2SAndroid Build Coastguard Worker /*
1305*5e7646d2SAndroid Build Coastguard Worker * Update the MaxClientsPerHost value, as needed...
1306*5e7646d2SAndroid Build Coastguard Worker */
1307*5e7646d2SAndroid Build Coastguard Worker
1308*5e7646d2SAndroid Build Coastguard Worker if (MaxClientsPerHost <= 0)
1309*5e7646d2SAndroid Build Coastguard Worker MaxClientsPerHost = MaxClients;
1310*5e7646d2SAndroid Build Coastguard Worker
1311*5e7646d2SAndroid Build Coastguard Worker if (MaxClientsPerHost > MaxClients)
1312*5e7646d2SAndroid Build Coastguard Worker MaxClientsPerHost = MaxClients;
1313*5e7646d2SAndroid Build Coastguard Worker
1314*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO,
1315*5e7646d2SAndroid Build Coastguard Worker "Allowing up to %d client connections per host.",
1316*5e7646d2SAndroid Build Coastguard Worker MaxClientsPerHost);
1317*5e7646d2SAndroid Build Coastguard Worker
1318*5e7646d2SAndroid Build Coastguard Worker /*
1319*5e7646d2SAndroid Build Coastguard Worker * Update the default policy, as needed...
1320*5e7646d2SAndroid Build Coastguard Worker */
1321*5e7646d2SAndroid Build Coastguard Worker
1322*5e7646d2SAndroid Build Coastguard Worker if (DefaultPolicy)
1323*5e7646d2SAndroid Build Coastguard Worker DefaultPolicyPtr = cupsdFindPolicy(DefaultPolicy);
1324*5e7646d2SAndroid Build Coastguard Worker else
1325*5e7646d2SAndroid Build Coastguard Worker DefaultPolicyPtr = NULL;
1326*5e7646d2SAndroid Build Coastguard Worker
1327*5e7646d2SAndroid Build Coastguard Worker if (!DefaultPolicyPtr)
1328*5e7646d2SAndroid Build Coastguard Worker {
1329*5e7646d2SAndroid Build Coastguard Worker cupsd_location_t *po; /* New policy operation */
1330*5e7646d2SAndroid Build Coastguard Worker
1331*5e7646d2SAndroid Build Coastguard Worker
1332*5e7646d2SAndroid Build Coastguard Worker if (DefaultPolicy)
1333*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Default policy \"%s\" not found.",
1334*5e7646d2SAndroid Build Coastguard Worker DefaultPolicy);
1335*5e7646d2SAndroid Build Coastguard Worker
1336*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&DefaultPolicy, "default");
1337*5e7646d2SAndroid Build Coastguard Worker
1338*5e7646d2SAndroid Build Coastguard Worker if ((DefaultPolicyPtr = cupsdFindPolicy("default")) != NULL)
1339*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO,
1340*5e7646d2SAndroid Build Coastguard Worker "Using policy \"default\" as the default.");
1341*5e7646d2SAndroid Build Coastguard Worker else
1342*5e7646d2SAndroid Build Coastguard Worker {
1343*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO,
1344*5e7646d2SAndroid Build Coastguard Worker "Creating CUPS default administrative policy:");
1345*5e7646d2SAndroid Build Coastguard Worker
1346*5e7646d2SAndroid Build Coastguard Worker DefaultPolicyPtr = p = cupsdAddPolicy("default");
1347*5e7646d2SAndroid Build Coastguard Worker
1348*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "<Policy default>");
1349*5e7646d2SAndroid Build Coastguard Worker
1350*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "JobPrivateAccess default");
1351*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(p->job_access), "@OWNER");
1352*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(p->job_access), "@SYSTEM");
1353*5e7646d2SAndroid Build Coastguard Worker
1354*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "JobPrivateValues default");
1355*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(p->job_attrs), "job-name");
1356*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(p->job_attrs), "job-originating-host-name");
1357*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(p->job_attrs), "job-originating-user-name");
1358*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(p->job_attrs), "phone");
1359*5e7646d2SAndroid Build Coastguard Worker
1360*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "SubscriptionPrivateAccess default");
1361*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(p->sub_access), "@OWNER");
1362*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(p->sub_access), "@SYSTEM");
1363*5e7646d2SAndroid Build Coastguard Worker
1364*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "SubscriptionPrivateValues default");
1365*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(p->job_attrs), "notify-events");
1366*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(p->job_attrs), "notify-pull-method");
1367*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(p->job_attrs), "notify-recipient-uri");
1368*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(p->job_attrs), "notify-subscriber-user-name");
1369*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(p->job_attrs), "notify-user-data");
1370*5e7646d2SAndroid Build Coastguard Worker
1371*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO,
1372*5e7646d2SAndroid Build Coastguard Worker "<Limit Create-Job Print-Job Print-URI Validate-Job>");
1373*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow");
1374*5e7646d2SAndroid Build Coastguard Worker
1375*5e7646d2SAndroid Build Coastguard Worker po = cupsdAddPolicyOp(p, NULL, IPP_CREATE_JOB);
1376*5e7646d2SAndroid Build Coastguard Worker po->order_type = CUPSD_AUTH_ALLOW;
1377*5e7646d2SAndroid Build Coastguard Worker
1378*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_PRINT_JOB);
1379*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_PRINT_URI);
1380*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_VALIDATE_JOB);
1381*5e7646d2SAndroid Build Coastguard Worker
1382*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "</Limit>");
1383*5e7646d2SAndroid Build Coastguard Worker
1384*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO,
1385*5e7646d2SAndroid Build Coastguard Worker "<Limit Send-Document Send-URI Cancel-Job Hold-Job "
1386*5e7646d2SAndroid Build Coastguard Worker "Release-Job Restart-Job Purge-Jobs "
1387*5e7646d2SAndroid Build Coastguard Worker "Set-Job-Attributes Create-Job-Subscription "
1388*5e7646d2SAndroid Build Coastguard Worker "Renew-Subscription Cancel-Subscription "
1389*5e7646d2SAndroid Build Coastguard Worker "Get-Notifications Reprocess-Job Cancel-Current-Job "
1390*5e7646d2SAndroid Build Coastguard Worker "Suspend-Current-Job Resume-Job "
1391*5e7646d2SAndroid Build Coastguard Worker "Cancel-My-Jobs Close-Job CUPS-Move-Job "
1392*5e7646d2SAndroid Build Coastguard Worker "CUPS-Authenticate-Job CUPS-Get-Document>");
1393*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow");
1394*5e7646d2SAndroid Build Coastguard Worker
1395*5e7646d2SAndroid Build Coastguard Worker po = cupsdAddPolicyOp(p, NULL, IPP_SEND_DOCUMENT);
1396*5e7646d2SAndroid Build Coastguard Worker po->order_type = CUPSD_AUTH_ALLOW;
1397*5e7646d2SAndroid Build Coastguard Worker po->level = CUPSD_AUTH_USER;
1398*5e7646d2SAndroid Build Coastguard Worker
1399*5e7646d2SAndroid Build Coastguard Worker cupsdAddName(po, "@OWNER");
1400*5e7646d2SAndroid Build Coastguard Worker cupsdAddName(po, "@SYSTEM");
1401*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Require user @OWNER @SYSTEM");
1402*5e7646d2SAndroid Build Coastguard Worker
1403*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_SEND_URI);
1404*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_CANCEL_JOB);
1405*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_HOLD_JOB);
1406*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_RELEASE_JOB);
1407*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_RESTART_JOB);
1408*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_PURGE_JOBS);
1409*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_SET_JOB_ATTRIBUTES);
1410*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_CREATE_JOB_SUBSCRIPTION);
1411*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_RENEW_SUBSCRIPTION);
1412*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_CANCEL_SUBSCRIPTION);
1413*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_GET_NOTIFICATIONS);
1414*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_REPROCESS_JOB);
1415*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_CANCEL_CURRENT_JOB);
1416*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_SUSPEND_CURRENT_JOB);
1417*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_RESUME_JOB);
1418*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_CANCEL_MY_JOBS);
1419*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_CLOSE_JOB);
1420*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, CUPS_MOVE_JOB);
1421*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, CUPS_AUTHENTICATE_JOB);
1422*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, CUPS_GET_DOCUMENT);
1423*5e7646d2SAndroid Build Coastguard Worker
1424*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "</Limit>");
1425*5e7646d2SAndroid Build Coastguard Worker
1426*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO,
1427*5e7646d2SAndroid Build Coastguard Worker "<Limit Pause-Printer Resume-Printer "
1428*5e7646d2SAndroid Build Coastguard Worker "Set-Printer-Attributes Enable-Printer "
1429*5e7646d2SAndroid Build Coastguard Worker "Disable-Printer Pause-Printer-After-Current-Job "
1430*5e7646d2SAndroid Build Coastguard Worker "Hold-New-Jobs Release-Held-New-Jobs "
1431*5e7646d2SAndroid Build Coastguard Worker "Deactivate-Printer Activate-Printer Restart-Printer "
1432*5e7646d2SAndroid Build Coastguard Worker "Shutdown-Printer Startup-Printer Promote-Job "
1433*5e7646d2SAndroid Build Coastguard Worker "Schedule-Job-After Cancel-Jobs CUPS-Add-Printer "
1434*5e7646d2SAndroid Build Coastguard Worker "CUPS-Delete-Printer CUPS-Add-Class CUPS-Delete-Class "
1435*5e7646d2SAndroid Build Coastguard Worker "CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default>");
1436*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow");
1437*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "AuthType Default");
1438*5e7646d2SAndroid Build Coastguard Worker
1439*5e7646d2SAndroid Build Coastguard Worker po = cupsdAddPolicyOp(p, NULL, IPP_PAUSE_PRINTER);
1440*5e7646d2SAndroid Build Coastguard Worker po->order_type = CUPSD_AUTH_ALLOW;
1441*5e7646d2SAndroid Build Coastguard Worker po->type = CUPSD_AUTH_DEFAULT;
1442*5e7646d2SAndroid Build Coastguard Worker po->level = CUPSD_AUTH_USER;
1443*5e7646d2SAndroid Build Coastguard Worker
1444*5e7646d2SAndroid Build Coastguard Worker cupsdAddName(po, "@SYSTEM");
1445*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Require user @SYSTEM");
1446*5e7646d2SAndroid Build Coastguard Worker
1447*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_RESUME_PRINTER);
1448*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_SET_PRINTER_ATTRIBUTES);
1449*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_ENABLE_PRINTER);
1450*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_DISABLE_PRINTER);
1451*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_PAUSE_PRINTER_AFTER_CURRENT_JOB);
1452*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_HOLD_NEW_JOBS);
1453*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_RELEASE_HELD_NEW_JOBS);
1454*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_DEACTIVATE_PRINTER);
1455*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_ACTIVATE_PRINTER);
1456*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_RESTART_PRINTER);
1457*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_SHUTDOWN_PRINTER);
1458*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_STARTUP_PRINTER);
1459*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_PROMOTE_JOB);
1460*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_SCHEDULE_JOB_AFTER);
1461*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, IPP_CANCEL_JOBS);
1462*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, CUPS_ADD_PRINTER);
1463*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, CUPS_DELETE_PRINTER);
1464*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, CUPS_ADD_CLASS);
1465*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, CUPS_DELETE_CLASS);
1466*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, CUPS_ACCEPT_JOBS);
1467*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, CUPS_REJECT_JOBS);
1468*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(p, po, CUPS_SET_DEFAULT);
1469*5e7646d2SAndroid Build Coastguard Worker
1470*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "</Limit>");
1471*5e7646d2SAndroid Build Coastguard Worker
1472*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "<Limit All>");
1473*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow");
1474*5e7646d2SAndroid Build Coastguard Worker
1475*5e7646d2SAndroid Build Coastguard Worker po = cupsdAddPolicyOp(p, NULL, IPP_ANY_OPERATION);
1476*5e7646d2SAndroid Build Coastguard Worker po->order_type = CUPSD_AUTH_ALLOW;
1477*5e7646d2SAndroid Build Coastguard Worker
1478*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "</Limit>");
1479*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "</Policy>");
1480*5e7646d2SAndroid Build Coastguard Worker }
1481*5e7646d2SAndroid Build Coastguard Worker }
1482*5e7646d2SAndroid Build Coastguard Worker
1483*5e7646d2SAndroid Build Coastguard Worker if (LogLevel >= CUPSD_LOG_DEBUG2)
1484*5e7646d2SAndroid Build Coastguard Worker {
1485*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReadConfiguration: NumPolicies=%d",
1486*5e7646d2SAndroid Build Coastguard Worker cupsArrayCount(Policies));
1487*5e7646d2SAndroid Build Coastguard Worker for (i = 0, p = (cupsd_policy_t *)cupsArrayFirst(Policies);
1488*5e7646d2SAndroid Build Coastguard Worker p;
1489*5e7646d2SAndroid Build Coastguard Worker i ++, p = (cupsd_policy_t *)cupsArrayNext(Policies))
1490*5e7646d2SAndroid Build Coastguard Worker {
1491*5e7646d2SAndroid Build Coastguard Worker int j; /* Looping var */
1492*5e7646d2SAndroid Build Coastguard Worker cupsd_location_t *loc; /* Current location */
1493*5e7646d2SAndroid Build Coastguard Worker
1494*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReadConfiguration: Policies[%d]=\"%s\"", i, p->name);
1495*5e7646d2SAndroid Build Coastguard Worker
1496*5e7646d2SAndroid Build Coastguard Worker for (j = 0, loc = (cupsd_location_t *)cupsArrayFirst(p->ops); loc; j ++, loc = (cupsd_location_t *)cupsArrayNext(p->ops))
1497*5e7646d2SAndroid Build Coastguard Worker {
1498*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReadConfiguration: ops[%d]=%s", j, ippOpString(loc->op));
1499*5e7646d2SAndroid Build Coastguard Worker }
1500*5e7646d2SAndroid Build Coastguard Worker }
1501*5e7646d2SAndroid Build Coastguard Worker }
1502*5e7646d2SAndroid Build Coastguard Worker
1503*5e7646d2SAndroid Build Coastguard Worker /*
1504*5e7646d2SAndroid Build Coastguard Worker * If we are doing a full reload or the server root has changed, flush
1505*5e7646d2SAndroid Build Coastguard Worker * the jobs, printers, etc. and start from scratch...
1506*5e7646d2SAndroid Build Coastguard Worker */
1507*5e7646d2SAndroid Build Coastguard Worker
1508*5e7646d2SAndroid Build Coastguard Worker if (NeedReload == RELOAD_ALL ||
1509*5e7646d2SAndroid Build Coastguard Worker old_remote_port != RemotePort ||
1510*5e7646d2SAndroid Build Coastguard Worker !old_serverroot || !ServerRoot || strcmp(old_serverroot, ServerRoot) ||
1511*5e7646d2SAndroid Build Coastguard Worker !old_requestroot || !RequestRoot || strcmp(old_requestroot, RequestRoot))
1512*5e7646d2SAndroid Build Coastguard Worker {
1513*5e7646d2SAndroid Build Coastguard Worker mime_type_t *type; /* Current type */
1514*5e7646d2SAndroid Build Coastguard Worker char mimetype[MIME_MAX_SUPER + MIME_MAX_TYPE];
1515*5e7646d2SAndroid Build Coastguard Worker /* MIME type name */
1516*5e7646d2SAndroid Build Coastguard Worker
1517*5e7646d2SAndroid Build Coastguard Worker
1518*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Full reload is required.");
1519*5e7646d2SAndroid Build Coastguard Worker
1520*5e7646d2SAndroid Build Coastguard Worker /*
1521*5e7646d2SAndroid Build Coastguard Worker * Free all memory...
1522*5e7646d2SAndroid Build Coastguard Worker */
1523*5e7646d2SAndroid Build Coastguard Worker
1524*5e7646d2SAndroid Build Coastguard Worker cupsdDeleteAllSubscriptions();
1525*5e7646d2SAndroid Build Coastguard Worker cupsdFreeAllJobs();
1526*5e7646d2SAndroid Build Coastguard Worker cupsdDeleteAllPrinters();
1527*5e7646d2SAndroid Build Coastguard Worker
1528*5e7646d2SAndroid Build Coastguard Worker DefaultPrinter = NULL;
1529*5e7646d2SAndroid Build Coastguard Worker
1530*5e7646d2SAndroid Build Coastguard Worker if (MimeDatabase != NULL)
1531*5e7646d2SAndroid Build Coastguard Worker mimeDelete(MimeDatabase);
1532*5e7646d2SAndroid Build Coastguard Worker
1533*5e7646d2SAndroid Build Coastguard Worker if (NumMimeTypes)
1534*5e7646d2SAndroid Build Coastguard Worker {
1535*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < NumMimeTypes; i ++)
1536*5e7646d2SAndroid Build Coastguard Worker _cupsStrFree(MimeTypes[i]);
1537*5e7646d2SAndroid Build Coastguard Worker
1538*5e7646d2SAndroid Build Coastguard Worker free(MimeTypes);
1539*5e7646d2SAndroid Build Coastguard Worker }
1540*5e7646d2SAndroid Build Coastguard Worker
1541*5e7646d2SAndroid Build Coastguard Worker /*
1542*5e7646d2SAndroid Build Coastguard Worker * Read the MIME type and conversion database...
1543*5e7646d2SAndroid Build Coastguard Worker */
1544*5e7646d2SAndroid Build Coastguard Worker
1545*5e7646d2SAndroid Build Coastguard Worker snprintf(temp, sizeof(temp), "%s/filter", ServerBin);
1546*5e7646d2SAndroid Build Coastguard Worker snprintf(mimedir, sizeof(mimedir), "%s/mime", DataDir);
1547*5e7646d2SAndroid Build Coastguard Worker
1548*5e7646d2SAndroid Build Coastguard Worker MimeDatabase = mimeNew();
1549*5e7646d2SAndroid Build Coastguard Worker mimeSetErrorCallback(MimeDatabase, mime_error_cb, NULL);
1550*5e7646d2SAndroid Build Coastguard Worker
1551*5e7646d2SAndroid Build Coastguard Worker MimeDatabase = mimeLoadTypes(MimeDatabase, mimedir);
1552*5e7646d2SAndroid Build Coastguard Worker MimeDatabase = mimeLoadTypes(MimeDatabase, ServerRoot);
1553*5e7646d2SAndroid Build Coastguard Worker MimeDatabase = mimeLoadFilters(MimeDatabase, mimedir, temp);
1554*5e7646d2SAndroid Build Coastguard Worker MimeDatabase = mimeLoadFilters(MimeDatabase, ServerRoot, temp);
1555*5e7646d2SAndroid Build Coastguard Worker
1556*5e7646d2SAndroid Build Coastguard Worker if (!MimeDatabase)
1557*5e7646d2SAndroid Build Coastguard Worker {
1558*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_EMERG,
1559*5e7646d2SAndroid Build Coastguard Worker "Unable to load MIME database from \"%s\" or \"%s\".",
1560*5e7646d2SAndroid Build Coastguard Worker mimedir, ServerRoot);
1561*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
1562*5e7646d2SAndroid Build Coastguard Worker return (0);
1563*5e7646d2SAndroid Build Coastguard Worker }
1564*5e7646d2SAndroid Build Coastguard Worker
1565*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO,
1566*5e7646d2SAndroid Build Coastguard Worker "Loaded MIME database from \"%s\" and \"%s\": %d types, "
1567*5e7646d2SAndroid Build Coastguard Worker "%d filters...", mimedir, ServerRoot,
1568*5e7646d2SAndroid Build Coastguard Worker mimeNumTypes(MimeDatabase), mimeNumFilters(MimeDatabase));
1569*5e7646d2SAndroid Build Coastguard Worker
1570*5e7646d2SAndroid Build Coastguard Worker /*
1571*5e7646d2SAndroid Build Coastguard Worker * Create a list of MIME types for the document-format-supported
1572*5e7646d2SAndroid Build Coastguard Worker * attribute...
1573*5e7646d2SAndroid Build Coastguard Worker */
1574*5e7646d2SAndroid Build Coastguard Worker
1575*5e7646d2SAndroid Build Coastguard Worker NumMimeTypes = mimeNumTypes(MimeDatabase);
1576*5e7646d2SAndroid Build Coastguard Worker if (!mimeType(MimeDatabase, "application", "octet-stream"))
1577*5e7646d2SAndroid Build Coastguard Worker NumMimeTypes ++;
1578*5e7646d2SAndroid Build Coastguard Worker
1579*5e7646d2SAndroid Build Coastguard Worker if ((MimeTypes = calloc((size_t)NumMimeTypes, sizeof(const char *))) == NULL)
1580*5e7646d2SAndroid Build Coastguard Worker {
1581*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
1582*5e7646d2SAndroid Build Coastguard Worker "Unable to allocate memory for %d MIME types.",
1583*5e7646d2SAndroid Build Coastguard Worker NumMimeTypes);
1584*5e7646d2SAndroid Build Coastguard Worker NumMimeTypes = 0;
1585*5e7646d2SAndroid Build Coastguard Worker }
1586*5e7646d2SAndroid Build Coastguard Worker else
1587*5e7646d2SAndroid Build Coastguard Worker {
1588*5e7646d2SAndroid Build Coastguard Worker for (i = 0, type = mimeFirstType(MimeDatabase);
1589*5e7646d2SAndroid Build Coastguard Worker type;
1590*5e7646d2SAndroid Build Coastguard Worker i ++, type = mimeNextType(MimeDatabase))
1591*5e7646d2SAndroid Build Coastguard Worker {
1592*5e7646d2SAndroid Build Coastguard Worker snprintf(mimetype, sizeof(mimetype), "%s/%s", type->super, type->type);
1593*5e7646d2SAndroid Build Coastguard Worker
1594*5e7646d2SAndroid Build Coastguard Worker MimeTypes[i] = _cupsStrAlloc(mimetype);
1595*5e7646d2SAndroid Build Coastguard Worker }
1596*5e7646d2SAndroid Build Coastguard Worker
1597*5e7646d2SAndroid Build Coastguard Worker if (i < NumMimeTypes)
1598*5e7646d2SAndroid Build Coastguard Worker MimeTypes[i] = _cupsStrAlloc("application/octet-stream");
1599*5e7646d2SAndroid Build Coastguard Worker }
1600*5e7646d2SAndroid Build Coastguard Worker
1601*5e7646d2SAndroid Build Coastguard Worker if (LogLevel == CUPSD_LOG_DEBUG2)
1602*5e7646d2SAndroid Build Coastguard Worker {
1603*5e7646d2SAndroid Build Coastguard Worker mime_filter_t *filter; /* Current filter */
1604*5e7646d2SAndroid Build Coastguard Worker
1605*5e7646d2SAndroid Build Coastguard Worker
1606*5e7646d2SAndroid Build Coastguard Worker for (type = mimeFirstType(MimeDatabase);
1607*5e7646d2SAndroid Build Coastguard Worker type;
1608*5e7646d2SAndroid Build Coastguard Worker type = mimeNextType(MimeDatabase))
1609*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReadConfiguration: type %s/%s",
1610*5e7646d2SAndroid Build Coastguard Worker type->super, type->type);
1611*5e7646d2SAndroid Build Coastguard Worker
1612*5e7646d2SAndroid Build Coastguard Worker for (filter = mimeFirstFilter(MimeDatabase);
1613*5e7646d2SAndroid Build Coastguard Worker filter;
1614*5e7646d2SAndroid Build Coastguard Worker filter = mimeNextFilter(MimeDatabase))
1615*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG2,
1616*5e7646d2SAndroid Build Coastguard Worker "cupsdReadConfiguration: filter %s/%s to %s/%s %d %s",
1617*5e7646d2SAndroid Build Coastguard Worker filter->src->super, filter->src->type,
1618*5e7646d2SAndroid Build Coastguard Worker filter->dst->super, filter->dst->type,
1619*5e7646d2SAndroid Build Coastguard Worker filter->cost, filter->filter);
1620*5e7646d2SAndroid Build Coastguard Worker }
1621*5e7646d2SAndroid Build Coastguard Worker
1622*5e7646d2SAndroid Build Coastguard Worker /*
1623*5e7646d2SAndroid Build Coastguard Worker * Load banners...
1624*5e7646d2SAndroid Build Coastguard Worker */
1625*5e7646d2SAndroid Build Coastguard Worker
1626*5e7646d2SAndroid Build Coastguard Worker snprintf(temp, sizeof(temp), "%s/banners", DataDir);
1627*5e7646d2SAndroid Build Coastguard Worker cupsdLoadBanners(temp);
1628*5e7646d2SAndroid Build Coastguard Worker
1629*5e7646d2SAndroid Build Coastguard Worker /*
1630*5e7646d2SAndroid Build Coastguard Worker * Load printers and classes...
1631*5e7646d2SAndroid Build Coastguard Worker */
1632*5e7646d2SAndroid Build Coastguard Worker
1633*5e7646d2SAndroid Build Coastguard Worker cupsdLoadAllPrinters();
1634*5e7646d2SAndroid Build Coastguard Worker cupsdLoadAllClasses();
1635*5e7646d2SAndroid Build Coastguard Worker
1636*5e7646d2SAndroid Build Coastguard Worker cupsdCreateCommonData();
1637*5e7646d2SAndroid Build Coastguard Worker
1638*5e7646d2SAndroid Build Coastguard Worker /*
1639*5e7646d2SAndroid Build Coastguard Worker * Update the printcap file as needed...
1640*5e7646d2SAndroid Build Coastguard Worker */
1641*5e7646d2SAndroid Build Coastguard Worker
1642*5e7646d2SAndroid Build Coastguard Worker if (Printcap && *Printcap && access(Printcap, 0))
1643*5e7646d2SAndroid Build Coastguard Worker cupsdWritePrintcap();
1644*5e7646d2SAndroid Build Coastguard Worker
1645*5e7646d2SAndroid Build Coastguard Worker /*
1646*5e7646d2SAndroid Build Coastguard Worker * Load queued jobs...
1647*5e7646d2SAndroid Build Coastguard Worker */
1648*5e7646d2SAndroid Build Coastguard Worker
1649*5e7646d2SAndroid Build Coastguard Worker cupsdLoadAllJobs();
1650*5e7646d2SAndroid Build Coastguard Worker
1651*5e7646d2SAndroid Build Coastguard Worker /*
1652*5e7646d2SAndroid Build Coastguard Worker * Load subscriptions...
1653*5e7646d2SAndroid Build Coastguard Worker */
1654*5e7646d2SAndroid Build Coastguard Worker
1655*5e7646d2SAndroid Build Coastguard Worker cupsdLoadAllSubscriptions();
1656*5e7646d2SAndroid Build Coastguard Worker
1657*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Full reload complete.");
1658*5e7646d2SAndroid Build Coastguard Worker }
1659*5e7646d2SAndroid Build Coastguard Worker else
1660*5e7646d2SAndroid Build Coastguard Worker {
1661*5e7646d2SAndroid Build Coastguard Worker /*
1662*5e7646d2SAndroid Build Coastguard Worker * Not a full reload, so recreate the common printer attributes...
1663*5e7646d2SAndroid Build Coastguard Worker */
1664*5e7646d2SAndroid Build Coastguard Worker
1665*5e7646d2SAndroid Build Coastguard Worker cupsdCreateCommonData();
1666*5e7646d2SAndroid Build Coastguard Worker
1667*5e7646d2SAndroid Build Coastguard Worker /*
1668*5e7646d2SAndroid Build Coastguard Worker * Update all jobs as needed...
1669*5e7646d2SAndroid Build Coastguard Worker */
1670*5e7646d2SAndroid Build Coastguard Worker
1671*5e7646d2SAndroid Build Coastguard Worker cupsdUpdateJobs();
1672*5e7646d2SAndroid Build Coastguard Worker
1673*5e7646d2SAndroid Build Coastguard Worker /*
1674*5e7646d2SAndroid Build Coastguard Worker * Update all printers as needed...
1675*5e7646d2SAndroid Build Coastguard Worker */
1676*5e7646d2SAndroid Build Coastguard Worker
1677*5e7646d2SAndroid Build Coastguard Worker cupsdUpdatePrinters();
1678*5e7646d2SAndroid Build Coastguard Worker cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP);
1679*5e7646d2SAndroid Build Coastguard Worker
1680*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Partial reload complete.");
1681*5e7646d2SAndroid Build Coastguard Worker }
1682*5e7646d2SAndroid Build Coastguard Worker
1683*5e7646d2SAndroid Build Coastguard Worker /*
1684*5e7646d2SAndroid Build Coastguard Worker * Reset the reload state...
1685*5e7646d2SAndroid Build Coastguard Worker */
1686*5e7646d2SAndroid Build Coastguard Worker
1687*5e7646d2SAndroid Build Coastguard Worker NeedReload = RELOAD_NONE;
1688*5e7646d2SAndroid Build Coastguard Worker
1689*5e7646d2SAndroid Build Coastguard Worker cupsdClearString(&old_serverroot);
1690*5e7646d2SAndroid Build Coastguard Worker cupsdClearString(&old_requestroot);
1691*5e7646d2SAndroid Build Coastguard Worker
1692*5e7646d2SAndroid Build Coastguard Worker return (1);
1693*5e7646d2SAndroid Build Coastguard Worker }
1694*5e7646d2SAndroid Build Coastguard Worker
1695*5e7646d2SAndroid Build Coastguard Worker
1696*5e7646d2SAndroid Build Coastguard Worker /*
1697*5e7646d2SAndroid Build Coastguard Worker * 'get_address()' - Get an address + port number from a line.
1698*5e7646d2SAndroid Build Coastguard Worker */
1699*5e7646d2SAndroid Build Coastguard Worker
1700*5e7646d2SAndroid Build Coastguard Worker static http_addrlist_t * /* O - Pointer to list if address good, NULL if bad */
get_address(const char * value,int defport)1701*5e7646d2SAndroid Build Coastguard Worker get_address(const char *value, /* I - Value string */
1702*5e7646d2SAndroid Build Coastguard Worker int defport) /* I - Default port */
1703*5e7646d2SAndroid Build Coastguard Worker {
1704*5e7646d2SAndroid Build Coastguard Worker char buffer[1024], /* Hostname + port number buffer */
1705*5e7646d2SAndroid Build Coastguard Worker defpname[255], /* Default port name */
1706*5e7646d2SAndroid Build Coastguard Worker *hostname, /* Hostname or IP */
1707*5e7646d2SAndroid Build Coastguard Worker *portname; /* Port number or name */
1708*5e7646d2SAndroid Build Coastguard Worker http_addrlist_t *addrlist; /* Address list */
1709*5e7646d2SAndroid Build Coastguard Worker
1710*5e7646d2SAndroid Build Coastguard Worker
1711*5e7646d2SAndroid Build Coastguard Worker /*
1712*5e7646d2SAndroid Build Coastguard Worker * Check for an empty value...
1713*5e7646d2SAndroid Build Coastguard Worker */
1714*5e7646d2SAndroid Build Coastguard Worker
1715*5e7646d2SAndroid Build Coastguard Worker if (!*value)
1716*5e7646d2SAndroid Build Coastguard Worker {
1717*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Bad (empty) address.");
1718*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1719*5e7646d2SAndroid Build Coastguard Worker }
1720*5e7646d2SAndroid Build Coastguard Worker
1721*5e7646d2SAndroid Build Coastguard Worker /*
1722*5e7646d2SAndroid Build Coastguard Worker * Grab a hostname and port number; if there is no colon and the port name
1723*5e7646d2SAndroid Build Coastguard Worker * is only digits, then we have a port number by itself...
1724*5e7646d2SAndroid Build Coastguard Worker */
1725*5e7646d2SAndroid Build Coastguard Worker
1726*5e7646d2SAndroid Build Coastguard Worker strlcpy(buffer, value, sizeof(buffer));
1727*5e7646d2SAndroid Build Coastguard Worker
1728*5e7646d2SAndroid Build Coastguard Worker if ((portname = strrchr(buffer, ':')) != NULL && !strchr(portname, ']'))
1729*5e7646d2SAndroid Build Coastguard Worker {
1730*5e7646d2SAndroid Build Coastguard Worker *portname++ = '\0';
1731*5e7646d2SAndroid Build Coastguard Worker hostname = buffer;
1732*5e7646d2SAndroid Build Coastguard Worker }
1733*5e7646d2SAndroid Build Coastguard Worker else
1734*5e7646d2SAndroid Build Coastguard Worker {
1735*5e7646d2SAndroid Build Coastguard Worker for (portname = buffer; isdigit(*portname & 255); portname ++);
1736*5e7646d2SAndroid Build Coastguard Worker
1737*5e7646d2SAndroid Build Coastguard Worker if (*portname)
1738*5e7646d2SAndroid Build Coastguard Worker {
1739*5e7646d2SAndroid Build Coastguard Worker /*
1740*5e7646d2SAndroid Build Coastguard Worker * Use the default port...
1741*5e7646d2SAndroid Build Coastguard Worker */
1742*5e7646d2SAndroid Build Coastguard Worker
1743*5e7646d2SAndroid Build Coastguard Worker sprintf(defpname, "%d", defport);
1744*5e7646d2SAndroid Build Coastguard Worker portname = defpname;
1745*5e7646d2SAndroid Build Coastguard Worker hostname = buffer;
1746*5e7646d2SAndroid Build Coastguard Worker }
1747*5e7646d2SAndroid Build Coastguard Worker else
1748*5e7646d2SAndroid Build Coastguard Worker {
1749*5e7646d2SAndroid Build Coastguard Worker /*
1750*5e7646d2SAndroid Build Coastguard Worker * The buffer contains just a port number...
1751*5e7646d2SAndroid Build Coastguard Worker */
1752*5e7646d2SAndroid Build Coastguard Worker
1753*5e7646d2SAndroid Build Coastguard Worker portname = buffer;
1754*5e7646d2SAndroid Build Coastguard Worker hostname = NULL;
1755*5e7646d2SAndroid Build Coastguard Worker }
1756*5e7646d2SAndroid Build Coastguard Worker }
1757*5e7646d2SAndroid Build Coastguard Worker
1758*5e7646d2SAndroid Build Coastguard Worker if (hostname && !strcmp(hostname, "*"))
1759*5e7646d2SAndroid Build Coastguard Worker hostname = NULL;
1760*5e7646d2SAndroid Build Coastguard Worker
1761*5e7646d2SAndroid Build Coastguard Worker /*
1762*5e7646d2SAndroid Build Coastguard Worker * Now lookup the address using httpAddrGetList()...
1763*5e7646d2SAndroid Build Coastguard Worker */
1764*5e7646d2SAndroid Build Coastguard Worker
1765*5e7646d2SAndroid Build Coastguard Worker if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL)
1766*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Hostname lookup for \"%s\" failed.",
1767*5e7646d2SAndroid Build Coastguard Worker hostname ? hostname : "(nil)");
1768*5e7646d2SAndroid Build Coastguard Worker
1769*5e7646d2SAndroid Build Coastguard Worker return (addrlist);
1770*5e7646d2SAndroid Build Coastguard Worker }
1771*5e7646d2SAndroid Build Coastguard Worker
1772*5e7646d2SAndroid Build Coastguard Worker
1773*5e7646d2SAndroid Build Coastguard Worker /*
1774*5e7646d2SAndroid Build Coastguard Worker * 'get_addr_and_mask()' - Get an IP address and netmask.
1775*5e7646d2SAndroid Build Coastguard Worker */
1776*5e7646d2SAndroid Build Coastguard Worker
1777*5e7646d2SAndroid Build Coastguard Worker static int /* O - 1 on success, 0 on failure */
get_addr_and_mask(const char * value,unsigned * ip,unsigned * mask)1778*5e7646d2SAndroid Build Coastguard Worker get_addr_and_mask(const char *value, /* I - String from config file */
1779*5e7646d2SAndroid Build Coastguard Worker unsigned *ip, /* O - Address value */
1780*5e7646d2SAndroid Build Coastguard Worker unsigned *mask) /* O - Mask value */
1781*5e7646d2SAndroid Build Coastguard Worker {
1782*5e7646d2SAndroid Build Coastguard Worker int i, j, /* Looping vars */
1783*5e7646d2SAndroid Build Coastguard Worker family, /* Address family */
1784*5e7646d2SAndroid Build Coastguard Worker ipcount; /* Count of fields in address */
1785*5e7646d2SAndroid Build Coastguard Worker unsigned ipval; /* Value */
1786*5e7646d2SAndroid Build Coastguard Worker const char *maskval, /* Pointer to start of mask value */
1787*5e7646d2SAndroid Build Coastguard Worker *ptr, /* Pointer into value */
1788*5e7646d2SAndroid Build Coastguard Worker *ptr2; /* ... */
1789*5e7646d2SAndroid Build Coastguard Worker
1790*5e7646d2SAndroid Build Coastguard Worker
1791*5e7646d2SAndroid Build Coastguard Worker /*
1792*5e7646d2SAndroid Build Coastguard Worker * Get the address...
1793*5e7646d2SAndroid Build Coastguard Worker */
1794*5e7646d2SAndroid Build Coastguard Worker
1795*5e7646d2SAndroid Build Coastguard Worker ip[0] = ip[1] = ip[2] = ip[3] = 0x00000000;
1796*5e7646d2SAndroid Build Coastguard Worker mask[0] = mask[1] = mask[2] = mask[3] = 0xffffffff;
1797*5e7646d2SAndroid Build Coastguard Worker
1798*5e7646d2SAndroid Build Coastguard Worker if ((maskval = strchr(value, '/')) != NULL)
1799*5e7646d2SAndroid Build Coastguard Worker maskval ++;
1800*5e7646d2SAndroid Build Coastguard Worker else
1801*5e7646d2SAndroid Build Coastguard Worker maskval = value + strlen(value);
1802*5e7646d2SAndroid Build Coastguard Worker
1803*5e7646d2SAndroid Build Coastguard Worker #ifdef AF_INET6
1804*5e7646d2SAndroid Build Coastguard Worker /*
1805*5e7646d2SAndroid Build Coastguard Worker * Check for an IPv6 address...
1806*5e7646d2SAndroid Build Coastguard Worker */
1807*5e7646d2SAndroid Build Coastguard Worker
1808*5e7646d2SAndroid Build Coastguard Worker if (*value == '[')
1809*5e7646d2SAndroid Build Coastguard Worker {
1810*5e7646d2SAndroid Build Coastguard Worker /*
1811*5e7646d2SAndroid Build Coastguard Worker * Parse hexadecimal IPv6/IPv4 address...
1812*5e7646d2SAndroid Build Coastguard Worker */
1813*5e7646d2SAndroid Build Coastguard Worker
1814*5e7646d2SAndroid Build Coastguard Worker family = AF_INET6;
1815*5e7646d2SAndroid Build Coastguard Worker
1816*5e7646d2SAndroid Build Coastguard Worker for (i = 0, ptr = value + 1; *ptr && i < 8; i ++)
1817*5e7646d2SAndroid Build Coastguard Worker {
1818*5e7646d2SAndroid Build Coastguard Worker if (*ptr == ']')
1819*5e7646d2SAndroid Build Coastguard Worker break;
1820*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(ptr, "::", 2))
1821*5e7646d2SAndroid Build Coastguard Worker {
1822*5e7646d2SAndroid Build Coastguard Worker for (ptr2 = strchr(ptr + 2, ':'), j = 0;
1823*5e7646d2SAndroid Build Coastguard Worker ptr2;
1824*5e7646d2SAndroid Build Coastguard Worker ptr2 = strchr(ptr2 + 1, ':'), j ++);
1825*5e7646d2SAndroid Build Coastguard Worker
1826*5e7646d2SAndroid Build Coastguard Worker i = 6 - j;
1827*5e7646d2SAndroid Build Coastguard Worker ptr += 2;
1828*5e7646d2SAndroid Build Coastguard Worker }
1829*5e7646d2SAndroid Build Coastguard Worker else if (isdigit(*ptr & 255) && strchr(ptr + 1, '.') && i >= 6)
1830*5e7646d2SAndroid Build Coastguard Worker {
1831*5e7646d2SAndroid Build Coastguard Worker /*
1832*5e7646d2SAndroid Build Coastguard Worker * Read IPv4 dotted quad...
1833*5e7646d2SAndroid Build Coastguard Worker */
1834*5e7646d2SAndroid Build Coastguard Worker
1835*5e7646d2SAndroid Build Coastguard Worker unsigned val[4] = { 0, 0, 0, 0 };
1836*5e7646d2SAndroid Build Coastguard Worker /* IPv4 address values */
1837*5e7646d2SAndroid Build Coastguard Worker
1838*5e7646d2SAndroid Build Coastguard Worker ipcount = sscanf(ptr, "%u.%u.%u.%u", val + 0, val + 1, val + 2,
1839*5e7646d2SAndroid Build Coastguard Worker val + 3);
1840*5e7646d2SAndroid Build Coastguard Worker
1841*5e7646d2SAndroid Build Coastguard Worker /*
1842*5e7646d2SAndroid Build Coastguard Worker * Range check the IP numbers...
1843*5e7646d2SAndroid Build Coastguard Worker */
1844*5e7646d2SAndroid Build Coastguard Worker
1845*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < ipcount; i ++)
1846*5e7646d2SAndroid Build Coastguard Worker if (val[i] > 255)
1847*5e7646d2SAndroid Build Coastguard Worker return (0);
1848*5e7646d2SAndroid Build Coastguard Worker
1849*5e7646d2SAndroid Build Coastguard Worker /*
1850*5e7646d2SAndroid Build Coastguard Worker * Merge everything into a 32-bit IPv4 address in ip[3]...
1851*5e7646d2SAndroid Build Coastguard Worker */
1852*5e7646d2SAndroid Build Coastguard Worker
1853*5e7646d2SAndroid Build Coastguard Worker ip[3] = ((((((unsigned)val[0] << 8) | (unsigned)val[1]) << 8) |
1854*5e7646d2SAndroid Build Coastguard Worker (unsigned)val[2]) << 8) | (unsigned)val[3];
1855*5e7646d2SAndroid Build Coastguard Worker
1856*5e7646d2SAndroid Build Coastguard Worker if (ipcount < 4)
1857*5e7646d2SAndroid Build Coastguard Worker mask[3] = (0xffffffff << (32 - 8 * ipcount)) & 0xffffffff;
1858*5e7646d2SAndroid Build Coastguard Worker
1859*5e7646d2SAndroid Build Coastguard Worker /*
1860*5e7646d2SAndroid Build Coastguard Worker * If the leading words are all 0's then this is an IPv4 address...
1861*5e7646d2SAndroid Build Coastguard Worker */
1862*5e7646d2SAndroid Build Coastguard Worker
1863*5e7646d2SAndroid Build Coastguard Worker if (!val[0] && !val[1] && !val[2])
1864*5e7646d2SAndroid Build Coastguard Worker family = AF_INET;
1865*5e7646d2SAndroid Build Coastguard Worker
1866*5e7646d2SAndroid Build Coastguard Worker while (isdigit(*ptr & 255) || *ptr == '.')
1867*5e7646d2SAndroid Build Coastguard Worker ptr ++;
1868*5e7646d2SAndroid Build Coastguard Worker break;
1869*5e7646d2SAndroid Build Coastguard Worker }
1870*5e7646d2SAndroid Build Coastguard Worker else if (isxdigit(*ptr & 255))
1871*5e7646d2SAndroid Build Coastguard Worker {
1872*5e7646d2SAndroid Build Coastguard Worker ipval = strtoul(ptr, (char **)&ptr, 16);
1873*5e7646d2SAndroid Build Coastguard Worker
1874*5e7646d2SAndroid Build Coastguard Worker if (*ptr == ':' && ptr[1] != ':')
1875*5e7646d2SAndroid Build Coastguard Worker ptr ++;
1876*5e7646d2SAndroid Build Coastguard Worker
1877*5e7646d2SAndroid Build Coastguard Worker if (ipval > 0xffff)
1878*5e7646d2SAndroid Build Coastguard Worker return (0);
1879*5e7646d2SAndroid Build Coastguard Worker
1880*5e7646d2SAndroid Build Coastguard Worker if (i & 1)
1881*5e7646d2SAndroid Build Coastguard Worker ip[i / 2] |= ipval;
1882*5e7646d2SAndroid Build Coastguard Worker else
1883*5e7646d2SAndroid Build Coastguard Worker ip[i / 2] |= ipval << 16;
1884*5e7646d2SAndroid Build Coastguard Worker }
1885*5e7646d2SAndroid Build Coastguard Worker else
1886*5e7646d2SAndroid Build Coastguard Worker return (0);
1887*5e7646d2SAndroid Build Coastguard Worker }
1888*5e7646d2SAndroid Build Coastguard Worker
1889*5e7646d2SAndroid Build Coastguard Worker if (*ptr != ']')
1890*5e7646d2SAndroid Build Coastguard Worker return (0);
1891*5e7646d2SAndroid Build Coastguard Worker
1892*5e7646d2SAndroid Build Coastguard Worker ptr ++;
1893*5e7646d2SAndroid Build Coastguard Worker
1894*5e7646d2SAndroid Build Coastguard Worker if (*ptr && *ptr != '/')
1895*5e7646d2SAndroid Build Coastguard Worker return (0);
1896*5e7646d2SAndroid Build Coastguard Worker }
1897*5e7646d2SAndroid Build Coastguard Worker else
1898*5e7646d2SAndroid Build Coastguard Worker #endif /* AF_INET6 */
1899*5e7646d2SAndroid Build Coastguard Worker {
1900*5e7646d2SAndroid Build Coastguard Worker /*
1901*5e7646d2SAndroid Build Coastguard Worker * Parse dotted-decimal IPv4 address...
1902*5e7646d2SAndroid Build Coastguard Worker */
1903*5e7646d2SAndroid Build Coastguard Worker
1904*5e7646d2SAndroid Build Coastguard Worker unsigned val[4] = { 0, 0, 0, 0 }; /* IPv4 address values */
1905*5e7646d2SAndroid Build Coastguard Worker
1906*5e7646d2SAndroid Build Coastguard Worker
1907*5e7646d2SAndroid Build Coastguard Worker family = AF_INET;
1908*5e7646d2SAndroid Build Coastguard Worker ipcount = sscanf(value, "%u.%u.%u.%u", val + 0, val + 1, val + 2, val + 3);
1909*5e7646d2SAndroid Build Coastguard Worker
1910*5e7646d2SAndroid Build Coastguard Worker /*
1911*5e7646d2SAndroid Build Coastguard Worker * Range check the IP numbers...
1912*5e7646d2SAndroid Build Coastguard Worker */
1913*5e7646d2SAndroid Build Coastguard Worker
1914*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < ipcount; i ++)
1915*5e7646d2SAndroid Build Coastguard Worker if (val[i] > 255)
1916*5e7646d2SAndroid Build Coastguard Worker return (0);
1917*5e7646d2SAndroid Build Coastguard Worker
1918*5e7646d2SAndroid Build Coastguard Worker /*
1919*5e7646d2SAndroid Build Coastguard Worker * Merge everything into a 32-bit IPv4 address in ip[3]...
1920*5e7646d2SAndroid Build Coastguard Worker */
1921*5e7646d2SAndroid Build Coastguard Worker
1922*5e7646d2SAndroid Build Coastguard Worker ip[3] = ((((((unsigned)val[0] << 8) | (unsigned)val[1]) << 8) |
1923*5e7646d2SAndroid Build Coastguard Worker (unsigned)val[2]) << 8) | (unsigned)val[3];
1924*5e7646d2SAndroid Build Coastguard Worker
1925*5e7646d2SAndroid Build Coastguard Worker if (ipcount < 4)
1926*5e7646d2SAndroid Build Coastguard Worker mask[3] = (0xffffffff << (32 - 8 * ipcount)) & 0xffffffff;
1927*5e7646d2SAndroid Build Coastguard Worker }
1928*5e7646d2SAndroid Build Coastguard Worker
1929*5e7646d2SAndroid Build Coastguard Worker if (*maskval)
1930*5e7646d2SAndroid Build Coastguard Worker {
1931*5e7646d2SAndroid Build Coastguard Worker /*
1932*5e7646d2SAndroid Build Coastguard Worker * Get the netmask value(s)...
1933*5e7646d2SAndroid Build Coastguard Worker */
1934*5e7646d2SAndroid Build Coastguard Worker
1935*5e7646d2SAndroid Build Coastguard Worker memset(mask, 0, sizeof(unsigned) * 4);
1936*5e7646d2SAndroid Build Coastguard Worker
1937*5e7646d2SAndroid Build Coastguard Worker if (strchr(maskval, '.'))
1938*5e7646d2SAndroid Build Coastguard Worker {
1939*5e7646d2SAndroid Build Coastguard Worker /*
1940*5e7646d2SAndroid Build Coastguard Worker * Get dotted-decimal mask...
1941*5e7646d2SAndroid Build Coastguard Worker */
1942*5e7646d2SAndroid Build Coastguard Worker
1943*5e7646d2SAndroid Build Coastguard Worker if (family != AF_INET)
1944*5e7646d2SAndroid Build Coastguard Worker return (0);
1945*5e7646d2SAndroid Build Coastguard Worker
1946*5e7646d2SAndroid Build Coastguard Worker if (sscanf(maskval, "%u.%u.%u.%u", mask + 0, mask + 1, mask + 2,
1947*5e7646d2SAndroid Build Coastguard Worker mask + 3) != 4)
1948*5e7646d2SAndroid Build Coastguard Worker return (0);
1949*5e7646d2SAndroid Build Coastguard Worker
1950*5e7646d2SAndroid Build Coastguard Worker mask[3] |= (((((unsigned)mask[0] << 8) | (unsigned)mask[1]) << 8) |
1951*5e7646d2SAndroid Build Coastguard Worker (unsigned)mask[2]) << 8;
1952*5e7646d2SAndroid Build Coastguard Worker mask[0] = mask[1] = mask[2] = 0;
1953*5e7646d2SAndroid Build Coastguard Worker }
1954*5e7646d2SAndroid Build Coastguard Worker else
1955*5e7646d2SAndroid Build Coastguard Worker {
1956*5e7646d2SAndroid Build Coastguard Worker /*
1957*5e7646d2SAndroid Build Coastguard Worker * Get address/bits format...
1958*5e7646d2SAndroid Build Coastguard Worker */
1959*5e7646d2SAndroid Build Coastguard Worker
1960*5e7646d2SAndroid Build Coastguard Worker i = atoi(maskval);
1961*5e7646d2SAndroid Build Coastguard Worker
1962*5e7646d2SAndroid Build Coastguard Worker #ifdef AF_INET6
1963*5e7646d2SAndroid Build Coastguard Worker if (family == AF_INET6)
1964*5e7646d2SAndroid Build Coastguard Worker {
1965*5e7646d2SAndroid Build Coastguard Worker if (i > 128)
1966*5e7646d2SAndroid Build Coastguard Worker return (0);
1967*5e7646d2SAndroid Build Coastguard Worker
1968*5e7646d2SAndroid Build Coastguard Worker i = 128 - i;
1969*5e7646d2SAndroid Build Coastguard Worker
1970*5e7646d2SAndroid Build Coastguard Worker if (i <= 96)
1971*5e7646d2SAndroid Build Coastguard Worker mask[0] = 0xffffffff;
1972*5e7646d2SAndroid Build Coastguard Worker else
1973*5e7646d2SAndroid Build Coastguard Worker mask[0] = (0xffffffff << (i - 96)) & 0xffffffff;
1974*5e7646d2SAndroid Build Coastguard Worker
1975*5e7646d2SAndroid Build Coastguard Worker if (i <= 64)
1976*5e7646d2SAndroid Build Coastguard Worker mask[1] = 0xffffffff;
1977*5e7646d2SAndroid Build Coastguard Worker else if (i >= 96)
1978*5e7646d2SAndroid Build Coastguard Worker mask[1] = 0;
1979*5e7646d2SAndroid Build Coastguard Worker else
1980*5e7646d2SAndroid Build Coastguard Worker mask[1] = (0xffffffff << (i - 64)) & 0xffffffff;
1981*5e7646d2SAndroid Build Coastguard Worker
1982*5e7646d2SAndroid Build Coastguard Worker if (i <= 32)
1983*5e7646d2SAndroid Build Coastguard Worker mask[2] = 0xffffffff;
1984*5e7646d2SAndroid Build Coastguard Worker else if (i >= 64)
1985*5e7646d2SAndroid Build Coastguard Worker mask[2] = 0;
1986*5e7646d2SAndroid Build Coastguard Worker else
1987*5e7646d2SAndroid Build Coastguard Worker mask[2] = (0xffffffff << (i - 32)) & 0xffffffff;
1988*5e7646d2SAndroid Build Coastguard Worker
1989*5e7646d2SAndroid Build Coastguard Worker if (i == 0)
1990*5e7646d2SAndroid Build Coastguard Worker mask[3] = 0xffffffff;
1991*5e7646d2SAndroid Build Coastguard Worker else if (i >= 32)
1992*5e7646d2SAndroid Build Coastguard Worker mask[3] = 0;
1993*5e7646d2SAndroid Build Coastguard Worker else
1994*5e7646d2SAndroid Build Coastguard Worker mask[3] = (0xffffffff << i) & 0xffffffff;
1995*5e7646d2SAndroid Build Coastguard Worker }
1996*5e7646d2SAndroid Build Coastguard Worker else
1997*5e7646d2SAndroid Build Coastguard Worker #endif /* AF_INET6 */
1998*5e7646d2SAndroid Build Coastguard Worker {
1999*5e7646d2SAndroid Build Coastguard Worker if (i > 32)
2000*5e7646d2SAndroid Build Coastguard Worker return (0);
2001*5e7646d2SAndroid Build Coastguard Worker
2002*5e7646d2SAndroid Build Coastguard Worker mask[0] = 0xffffffff;
2003*5e7646d2SAndroid Build Coastguard Worker mask[1] = 0xffffffff;
2004*5e7646d2SAndroid Build Coastguard Worker mask[2] = 0xffffffff;
2005*5e7646d2SAndroid Build Coastguard Worker
2006*5e7646d2SAndroid Build Coastguard Worker if (i < 32)
2007*5e7646d2SAndroid Build Coastguard Worker mask[3] = (0xffffffff << (32 - i)) & 0xffffffff;
2008*5e7646d2SAndroid Build Coastguard Worker else
2009*5e7646d2SAndroid Build Coastguard Worker mask[3] = 0xffffffff;
2010*5e7646d2SAndroid Build Coastguard Worker }
2011*5e7646d2SAndroid Build Coastguard Worker }
2012*5e7646d2SAndroid Build Coastguard Worker }
2013*5e7646d2SAndroid Build Coastguard Worker
2014*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_DEBUG2,
2015*5e7646d2SAndroid Build Coastguard Worker "get_addr_and_mask(value=\"%s\", "
2016*5e7646d2SAndroid Build Coastguard Worker "ip=[%08x:%08x:%08x:%08x], mask=[%08x:%08x:%08x:%08x])",
2017*5e7646d2SAndroid Build Coastguard Worker value, ip[0], ip[1], ip[2], ip[3], mask[0], mask[1], mask[2],
2018*5e7646d2SAndroid Build Coastguard Worker mask[3]);
2019*5e7646d2SAndroid Build Coastguard Worker
2020*5e7646d2SAndroid Build Coastguard Worker /*
2021*5e7646d2SAndroid Build Coastguard Worker * Check for a valid netmask; no fallback like in CUPS 1.1.x!
2022*5e7646d2SAndroid Build Coastguard Worker */
2023*5e7646d2SAndroid Build Coastguard Worker
2024*5e7646d2SAndroid Build Coastguard Worker if ((ip[0] & ~mask[0]) != 0 ||
2025*5e7646d2SAndroid Build Coastguard Worker (ip[1] & ~mask[1]) != 0 ||
2026*5e7646d2SAndroid Build Coastguard Worker (ip[2] & ~mask[2]) != 0 ||
2027*5e7646d2SAndroid Build Coastguard Worker (ip[3] & ~mask[3]) != 0)
2028*5e7646d2SAndroid Build Coastguard Worker return (0);
2029*5e7646d2SAndroid Build Coastguard Worker
2030*5e7646d2SAndroid Build Coastguard Worker return (1);
2031*5e7646d2SAndroid Build Coastguard Worker }
2032*5e7646d2SAndroid Build Coastguard Worker
2033*5e7646d2SAndroid Build Coastguard Worker
2034*5e7646d2SAndroid Build Coastguard Worker /*
2035*5e7646d2SAndroid Build Coastguard Worker * 'mime_error_cb()' - Log a MIME error.
2036*5e7646d2SAndroid Build Coastguard Worker */
2037*5e7646d2SAndroid Build Coastguard Worker
2038*5e7646d2SAndroid Build Coastguard Worker static void
mime_error_cb(void * ctx,const char * message)2039*5e7646d2SAndroid Build Coastguard Worker mime_error_cb(void *ctx, /* I - Context pointer (unused) */
2040*5e7646d2SAndroid Build Coastguard Worker const char *message) /* I - Message */
2041*5e7646d2SAndroid Build Coastguard Worker {
2042*5e7646d2SAndroid Build Coastguard Worker (void)ctx;
2043*5e7646d2SAndroid Build Coastguard Worker
2044*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "%s", message);
2045*5e7646d2SAndroid Build Coastguard Worker }
2046*5e7646d2SAndroid Build Coastguard Worker
2047*5e7646d2SAndroid Build Coastguard Worker
2048*5e7646d2SAndroid Build Coastguard Worker /*
2049*5e7646d2SAndroid Build Coastguard Worker * 'parse_aaa()' - Parse authentication, authorization, and access control lines.
2050*5e7646d2SAndroid Build Coastguard Worker */
2051*5e7646d2SAndroid Build Coastguard Worker
2052*5e7646d2SAndroid Build Coastguard Worker static int /* O - 1 on success, 0 on failure */
parse_aaa(cupsd_location_t * loc,char * line,char * value,int linenum)2053*5e7646d2SAndroid Build Coastguard Worker parse_aaa(cupsd_location_t *loc, /* I - Location */
2054*5e7646d2SAndroid Build Coastguard Worker char *line, /* I - Line from file */
2055*5e7646d2SAndroid Build Coastguard Worker char *value, /* I - Start of value data */
2056*5e7646d2SAndroid Build Coastguard Worker int linenum) /* I - Current line number */
2057*5e7646d2SAndroid Build Coastguard Worker {
2058*5e7646d2SAndroid Build Coastguard Worker char *valptr; /* Pointer into value */
2059*5e7646d2SAndroid Build Coastguard Worker unsigned ip[4], /* IP address components */
2060*5e7646d2SAndroid Build Coastguard Worker mask[4]; /* IP netmask components */
2061*5e7646d2SAndroid Build Coastguard Worker
2062*5e7646d2SAndroid Build Coastguard Worker
2063*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(line, "Encryption"))
2064*5e7646d2SAndroid Build Coastguard Worker {
2065*5e7646d2SAndroid Build Coastguard Worker /*
2066*5e7646d2SAndroid Build Coastguard Worker * "Encryption xxx" - set required encryption level...
2067*5e7646d2SAndroid Build Coastguard Worker */
2068*5e7646d2SAndroid Build Coastguard Worker
2069*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "never"))
2070*5e7646d2SAndroid Build Coastguard Worker loc->encryption = HTTP_ENCRYPT_NEVER;
2071*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "always"))
2072*5e7646d2SAndroid Build Coastguard Worker {
2073*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2074*5e7646d2SAndroid Build Coastguard Worker "Encryption value \"%s\" on line %d of %s is invalid in this "
2075*5e7646d2SAndroid Build Coastguard Worker "context. Using \"required\" instead.", value, linenum, ConfigurationFile);
2076*5e7646d2SAndroid Build Coastguard Worker
2077*5e7646d2SAndroid Build Coastguard Worker loc->encryption = HTTP_ENCRYPT_REQUIRED;
2078*5e7646d2SAndroid Build Coastguard Worker }
2079*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "required"))
2080*5e7646d2SAndroid Build Coastguard Worker loc->encryption = HTTP_ENCRYPT_REQUIRED;
2081*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "ifrequested"))
2082*5e7646d2SAndroid Build Coastguard Worker loc->encryption = HTTP_ENCRYPT_IF_REQUESTED;
2083*5e7646d2SAndroid Build Coastguard Worker else
2084*5e7646d2SAndroid Build Coastguard Worker {
2085*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2086*5e7646d2SAndroid Build Coastguard Worker "Unknown Encryption value %s on line %d of %s.", value, linenum, ConfigurationFile);
2087*5e7646d2SAndroid Build Coastguard Worker return (0);
2088*5e7646d2SAndroid Build Coastguard Worker }
2089*5e7646d2SAndroid Build Coastguard Worker }
2090*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "Order"))
2091*5e7646d2SAndroid Build Coastguard Worker {
2092*5e7646d2SAndroid Build Coastguard Worker /*
2093*5e7646d2SAndroid Build Coastguard Worker * "Order Deny,Allow" or "Order Allow,Deny"...
2094*5e7646d2SAndroid Build Coastguard Worker */
2095*5e7646d2SAndroid Build Coastguard Worker
2096*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strncasecmp(value, "deny", 4))
2097*5e7646d2SAndroid Build Coastguard Worker loc->order_type = CUPSD_AUTH_ALLOW;
2098*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strncasecmp(value, "allow", 5))
2099*5e7646d2SAndroid Build Coastguard Worker loc->order_type = CUPSD_AUTH_DENY;
2100*5e7646d2SAndroid Build Coastguard Worker else
2101*5e7646d2SAndroid Build Coastguard Worker {
2102*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown Order value %s on line %d of %s.",
2103*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
2104*5e7646d2SAndroid Build Coastguard Worker return (0);
2105*5e7646d2SAndroid Build Coastguard Worker }
2106*5e7646d2SAndroid Build Coastguard Worker }
2107*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "Allow") || !_cups_strcasecmp(line, "Deny"))
2108*5e7646d2SAndroid Build Coastguard Worker {
2109*5e7646d2SAndroid Build Coastguard Worker /*
2110*5e7646d2SAndroid Build Coastguard Worker * Allow [From] host/ip...
2111*5e7646d2SAndroid Build Coastguard Worker * Deny [From] host/ip...
2112*5e7646d2SAndroid Build Coastguard Worker */
2113*5e7646d2SAndroid Build Coastguard Worker
2114*5e7646d2SAndroid Build Coastguard Worker while (*value)
2115*5e7646d2SAndroid Build Coastguard Worker {
2116*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strncasecmp(value, "from", 4))
2117*5e7646d2SAndroid Build Coastguard Worker {
2118*5e7646d2SAndroid Build Coastguard Worker /*
2119*5e7646d2SAndroid Build Coastguard Worker * Strip leading "from"...
2120*5e7646d2SAndroid Build Coastguard Worker */
2121*5e7646d2SAndroid Build Coastguard Worker
2122*5e7646d2SAndroid Build Coastguard Worker value += 4;
2123*5e7646d2SAndroid Build Coastguard Worker
2124*5e7646d2SAndroid Build Coastguard Worker while (_cups_isspace(*value))
2125*5e7646d2SAndroid Build Coastguard Worker value ++;
2126*5e7646d2SAndroid Build Coastguard Worker
2127*5e7646d2SAndroid Build Coastguard Worker if (!*value)
2128*5e7646d2SAndroid Build Coastguard Worker break;
2129*5e7646d2SAndroid Build Coastguard Worker }
2130*5e7646d2SAndroid Build Coastguard Worker
2131*5e7646d2SAndroid Build Coastguard Worker /*
2132*5e7646d2SAndroid Build Coastguard Worker * Find the end of the value...
2133*5e7646d2SAndroid Build Coastguard Worker */
2134*5e7646d2SAndroid Build Coastguard Worker
2135*5e7646d2SAndroid Build Coastguard Worker for (valptr = value; *valptr && !_cups_isspace(*valptr); valptr ++);
2136*5e7646d2SAndroid Build Coastguard Worker
2137*5e7646d2SAndroid Build Coastguard Worker while (_cups_isspace(*valptr))
2138*5e7646d2SAndroid Build Coastguard Worker *valptr++ = '\0';
2139*5e7646d2SAndroid Build Coastguard Worker
2140*5e7646d2SAndroid Build Coastguard Worker /*
2141*5e7646d2SAndroid Build Coastguard Worker * Figure out what form the allow/deny address takes:
2142*5e7646d2SAndroid Build Coastguard Worker *
2143*5e7646d2SAndroid Build Coastguard Worker * All
2144*5e7646d2SAndroid Build Coastguard Worker * None
2145*5e7646d2SAndroid Build Coastguard Worker * *.domain.com
2146*5e7646d2SAndroid Build Coastguard Worker * .domain.com
2147*5e7646d2SAndroid Build Coastguard Worker * host.domain.com
2148*5e7646d2SAndroid Build Coastguard Worker * nnn.*
2149*5e7646d2SAndroid Build Coastguard Worker * nnn.nnn.*
2150*5e7646d2SAndroid Build Coastguard Worker * nnn.nnn.nnn.*
2151*5e7646d2SAndroid Build Coastguard Worker * nnn.nnn.nnn.nnn
2152*5e7646d2SAndroid Build Coastguard Worker * nnn.nnn.nnn.nnn/mm
2153*5e7646d2SAndroid Build Coastguard Worker * nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
2154*5e7646d2SAndroid Build Coastguard Worker */
2155*5e7646d2SAndroid Build Coastguard Worker
2156*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "all"))
2157*5e7646d2SAndroid Build Coastguard Worker {
2158*5e7646d2SAndroid Build Coastguard Worker /*
2159*5e7646d2SAndroid Build Coastguard Worker * All hosts...
2160*5e7646d2SAndroid Build Coastguard Worker */
2161*5e7646d2SAndroid Build Coastguard Worker
2162*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(line, "Allow"))
2163*5e7646d2SAndroid Build Coastguard Worker cupsdAddIPMask(&(loc->allow), zeros, zeros);
2164*5e7646d2SAndroid Build Coastguard Worker else
2165*5e7646d2SAndroid Build Coastguard Worker cupsdAddIPMask(&(loc->deny), zeros, zeros);
2166*5e7646d2SAndroid Build Coastguard Worker }
2167*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "none"))
2168*5e7646d2SAndroid Build Coastguard Worker {
2169*5e7646d2SAndroid Build Coastguard Worker /*
2170*5e7646d2SAndroid Build Coastguard Worker * No hosts...
2171*5e7646d2SAndroid Build Coastguard Worker */
2172*5e7646d2SAndroid Build Coastguard Worker
2173*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(line, "Allow"))
2174*5e7646d2SAndroid Build Coastguard Worker cupsdAddIPMask(&(loc->allow), ones, zeros);
2175*5e7646d2SAndroid Build Coastguard Worker else
2176*5e7646d2SAndroid Build Coastguard Worker cupsdAddIPMask(&(loc->deny), ones, zeros);
2177*5e7646d2SAndroid Build Coastguard Worker }
2178*5e7646d2SAndroid Build Coastguard Worker #ifdef AF_INET6
2179*5e7646d2SAndroid Build Coastguard Worker else if (value[0] == '*' || value[0] == '.' ||
2180*5e7646d2SAndroid Build Coastguard Worker (!isdigit(value[0] & 255) && value[0] != '['))
2181*5e7646d2SAndroid Build Coastguard Worker #else
2182*5e7646d2SAndroid Build Coastguard Worker else if (value[0] == '*' || value[0] == '.' || !isdigit(value[0] & 255))
2183*5e7646d2SAndroid Build Coastguard Worker #endif /* AF_INET6 */
2184*5e7646d2SAndroid Build Coastguard Worker {
2185*5e7646d2SAndroid Build Coastguard Worker /*
2186*5e7646d2SAndroid Build Coastguard Worker * Host or domain name...
2187*5e7646d2SAndroid Build Coastguard Worker */
2188*5e7646d2SAndroid Build Coastguard Worker
2189*5e7646d2SAndroid Build Coastguard Worker if (value[0] == '*')
2190*5e7646d2SAndroid Build Coastguard Worker value ++;
2191*5e7646d2SAndroid Build Coastguard Worker
2192*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(line, "Allow"))
2193*5e7646d2SAndroid Build Coastguard Worker cupsdAddNameMask(&(loc->allow), value);
2194*5e7646d2SAndroid Build Coastguard Worker else
2195*5e7646d2SAndroid Build Coastguard Worker cupsdAddNameMask(&(loc->deny), value);
2196*5e7646d2SAndroid Build Coastguard Worker }
2197*5e7646d2SAndroid Build Coastguard Worker else
2198*5e7646d2SAndroid Build Coastguard Worker {
2199*5e7646d2SAndroid Build Coastguard Worker /*
2200*5e7646d2SAndroid Build Coastguard Worker * One of many IP address forms...
2201*5e7646d2SAndroid Build Coastguard Worker */
2202*5e7646d2SAndroid Build Coastguard Worker
2203*5e7646d2SAndroid Build Coastguard Worker if (!get_addr_and_mask(value, ip, mask))
2204*5e7646d2SAndroid Build Coastguard Worker {
2205*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Bad netmask value %s on line %d of %s.",
2206*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
2207*5e7646d2SAndroid Build Coastguard Worker return (0);
2208*5e7646d2SAndroid Build Coastguard Worker }
2209*5e7646d2SAndroid Build Coastguard Worker
2210*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(line, "Allow"))
2211*5e7646d2SAndroid Build Coastguard Worker cupsdAddIPMask(&(loc->allow), ip, mask);
2212*5e7646d2SAndroid Build Coastguard Worker else
2213*5e7646d2SAndroid Build Coastguard Worker cupsdAddIPMask(&(loc->deny), ip, mask);
2214*5e7646d2SAndroid Build Coastguard Worker }
2215*5e7646d2SAndroid Build Coastguard Worker
2216*5e7646d2SAndroid Build Coastguard Worker /*
2217*5e7646d2SAndroid Build Coastguard Worker * Advance to next value...
2218*5e7646d2SAndroid Build Coastguard Worker */
2219*5e7646d2SAndroid Build Coastguard Worker
2220*5e7646d2SAndroid Build Coastguard Worker value = valptr;
2221*5e7646d2SAndroid Build Coastguard Worker }
2222*5e7646d2SAndroid Build Coastguard Worker }
2223*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "AuthType"))
2224*5e7646d2SAndroid Build Coastguard Worker {
2225*5e7646d2SAndroid Build Coastguard Worker /*
2226*5e7646d2SAndroid Build Coastguard Worker * AuthType {none,basic,digest,basicdigest,negotiate,default}
2227*5e7646d2SAndroid Build Coastguard Worker */
2228*5e7646d2SAndroid Build Coastguard Worker
2229*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "none"))
2230*5e7646d2SAndroid Build Coastguard Worker {
2231*5e7646d2SAndroid Build Coastguard Worker loc->type = CUPSD_AUTH_NONE;
2232*5e7646d2SAndroid Build Coastguard Worker loc->level = CUPSD_AUTH_ANON;
2233*5e7646d2SAndroid Build Coastguard Worker }
2234*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "basic"))
2235*5e7646d2SAndroid Build Coastguard Worker {
2236*5e7646d2SAndroid Build Coastguard Worker loc->type = CUPSD_AUTH_BASIC;
2237*5e7646d2SAndroid Build Coastguard Worker
2238*5e7646d2SAndroid Build Coastguard Worker if (loc->level == CUPSD_AUTH_ANON)
2239*5e7646d2SAndroid Build Coastguard Worker loc->level = CUPSD_AUTH_USER;
2240*5e7646d2SAndroid Build Coastguard Worker }
2241*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "default"))
2242*5e7646d2SAndroid Build Coastguard Worker {
2243*5e7646d2SAndroid Build Coastguard Worker loc->type = CUPSD_AUTH_DEFAULT;
2244*5e7646d2SAndroid Build Coastguard Worker
2245*5e7646d2SAndroid Build Coastguard Worker if (loc->level == CUPSD_AUTH_ANON)
2246*5e7646d2SAndroid Build Coastguard Worker loc->level = CUPSD_AUTH_USER;
2247*5e7646d2SAndroid Build Coastguard Worker }
2248*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "negotiate"))
2249*5e7646d2SAndroid Build Coastguard Worker {
2250*5e7646d2SAndroid Build Coastguard Worker loc->type = CUPSD_AUTH_NEGOTIATE;
2251*5e7646d2SAndroid Build Coastguard Worker
2252*5e7646d2SAndroid Build Coastguard Worker if (loc->level == CUPSD_AUTH_ANON)
2253*5e7646d2SAndroid Build Coastguard Worker loc->level = CUPSD_AUTH_USER;
2254*5e7646d2SAndroid Build Coastguard Worker }
2255*5e7646d2SAndroid Build Coastguard Worker else
2256*5e7646d2SAndroid Build Coastguard Worker {
2257*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN,
2258*5e7646d2SAndroid Build Coastguard Worker "Unknown authorization type %s on line %d of %s.",
2259*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
2260*5e7646d2SAndroid Build Coastguard Worker return (0);
2261*5e7646d2SAndroid Build Coastguard Worker }
2262*5e7646d2SAndroid Build Coastguard Worker }
2263*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "AuthClass"))
2264*5e7646d2SAndroid Build Coastguard Worker {
2265*5e7646d2SAndroid Build Coastguard Worker /*
2266*5e7646d2SAndroid Build Coastguard Worker * AuthClass anonymous, user, system, group
2267*5e7646d2SAndroid Build Coastguard Worker */
2268*5e7646d2SAndroid Build Coastguard Worker
2269*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "anonymous"))
2270*5e7646d2SAndroid Build Coastguard Worker {
2271*5e7646d2SAndroid Build Coastguard Worker loc->type = CUPSD_AUTH_NONE;
2272*5e7646d2SAndroid Build Coastguard Worker loc->level = CUPSD_AUTH_ANON;
2273*5e7646d2SAndroid Build Coastguard Worker
2274*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN,
2275*5e7646d2SAndroid Build Coastguard Worker "\"AuthClass %s\" is deprecated; consider removing "
2276*5e7646d2SAndroid Build Coastguard Worker "it from line %d.",
2277*5e7646d2SAndroid Build Coastguard Worker value, linenum);
2278*5e7646d2SAndroid Build Coastguard Worker }
2279*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "user"))
2280*5e7646d2SAndroid Build Coastguard Worker {
2281*5e7646d2SAndroid Build Coastguard Worker loc->level = CUPSD_AUTH_USER;
2282*5e7646d2SAndroid Build Coastguard Worker
2283*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN,
2284*5e7646d2SAndroid Build Coastguard Worker "\"AuthClass %s\" is deprecated; consider using "
2285*5e7646d2SAndroid Build Coastguard Worker "\"Require valid-user\" on line %d of %s.",
2286*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
2287*5e7646d2SAndroid Build Coastguard Worker }
2288*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "group"))
2289*5e7646d2SAndroid Build Coastguard Worker {
2290*5e7646d2SAndroid Build Coastguard Worker loc->level = CUPSD_AUTH_GROUP;
2291*5e7646d2SAndroid Build Coastguard Worker
2292*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN,
2293*5e7646d2SAndroid Build Coastguard Worker "\"AuthClass %s\" is deprecated; consider using "
2294*5e7646d2SAndroid Build Coastguard Worker "\"Require user @groupname\" on line %d of %s.",
2295*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
2296*5e7646d2SAndroid Build Coastguard Worker }
2297*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "system"))
2298*5e7646d2SAndroid Build Coastguard Worker {
2299*5e7646d2SAndroid Build Coastguard Worker loc->level = CUPSD_AUTH_GROUP;
2300*5e7646d2SAndroid Build Coastguard Worker
2301*5e7646d2SAndroid Build Coastguard Worker cupsdAddName(loc, "@SYSTEM");
2302*5e7646d2SAndroid Build Coastguard Worker
2303*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN,
2304*5e7646d2SAndroid Build Coastguard Worker "\"AuthClass %s\" is deprecated; consider using "
2305*5e7646d2SAndroid Build Coastguard Worker "\"Require user @SYSTEM\" on line %d of %s.",
2306*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
2307*5e7646d2SAndroid Build Coastguard Worker }
2308*5e7646d2SAndroid Build Coastguard Worker else
2309*5e7646d2SAndroid Build Coastguard Worker {
2310*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN,
2311*5e7646d2SAndroid Build Coastguard Worker "Unknown authorization class %s on line %d of %s.",
2312*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
2313*5e7646d2SAndroid Build Coastguard Worker return (0);
2314*5e7646d2SAndroid Build Coastguard Worker }
2315*5e7646d2SAndroid Build Coastguard Worker }
2316*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "AuthGroupName"))
2317*5e7646d2SAndroid Build Coastguard Worker {
2318*5e7646d2SAndroid Build Coastguard Worker cupsdAddName(loc, value);
2319*5e7646d2SAndroid Build Coastguard Worker
2320*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN,
2321*5e7646d2SAndroid Build Coastguard Worker "\"AuthGroupName %s\" directive is deprecated; consider "
2322*5e7646d2SAndroid Build Coastguard Worker "using \"Require user @%s\" on line %d of %s.",
2323*5e7646d2SAndroid Build Coastguard Worker value, value, linenum, ConfigurationFile);
2324*5e7646d2SAndroid Build Coastguard Worker }
2325*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "Require"))
2326*5e7646d2SAndroid Build Coastguard Worker {
2327*5e7646d2SAndroid Build Coastguard Worker /*
2328*5e7646d2SAndroid Build Coastguard Worker * Apache synonym for AuthClass and AuthGroupName...
2329*5e7646d2SAndroid Build Coastguard Worker *
2330*5e7646d2SAndroid Build Coastguard Worker * Get initial word:
2331*5e7646d2SAndroid Build Coastguard Worker *
2332*5e7646d2SAndroid Build Coastguard Worker * Require valid-user
2333*5e7646d2SAndroid Build Coastguard Worker * Require group names
2334*5e7646d2SAndroid Build Coastguard Worker * Require user names
2335*5e7646d2SAndroid Build Coastguard Worker */
2336*5e7646d2SAndroid Build Coastguard Worker
2337*5e7646d2SAndroid Build Coastguard Worker for (valptr = value; !_cups_isspace(*valptr) && *valptr; valptr ++);
2338*5e7646d2SAndroid Build Coastguard Worker
2339*5e7646d2SAndroid Build Coastguard Worker if (*valptr)
2340*5e7646d2SAndroid Build Coastguard Worker *valptr++ = '\0';
2341*5e7646d2SAndroid Build Coastguard Worker
2342*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "valid-user") ||
2343*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "user"))
2344*5e7646d2SAndroid Build Coastguard Worker loc->level = CUPSD_AUTH_USER;
2345*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "group"))
2346*5e7646d2SAndroid Build Coastguard Worker loc->level = CUPSD_AUTH_GROUP;
2347*5e7646d2SAndroid Build Coastguard Worker else
2348*5e7646d2SAndroid Build Coastguard Worker {
2349*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "Unknown Require type %s on line %d of %s.",
2350*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
2351*5e7646d2SAndroid Build Coastguard Worker return (0);
2352*5e7646d2SAndroid Build Coastguard Worker }
2353*5e7646d2SAndroid Build Coastguard Worker
2354*5e7646d2SAndroid Build Coastguard Worker /*
2355*5e7646d2SAndroid Build Coastguard Worker * Get the list of names from the line...
2356*5e7646d2SAndroid Build Coastguard Worker */
2357*5e7646d2SAndroid Build Coastguard Worker
2358*5e7646d2SAndroid Build Coastguard Worker for (value = valptr; *value;)
2359*5e7646d2SAndroid Build Coastguard Worker {
2360*5e7646d2SAndroid Build Coastguard Worker while (_cups_isspace(*value))
2361*5e7646d2SAndroid Build Coastguard Worker value ++;
2362*5e7646d2SAndroid Build Coastguard Worker
2363*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_AUTHORIZATION_H
2364*5e7646d2SAndroid Build Coastguard Worker if (!strncmp(value, "@AUTHKEY(", 9))
2365*5e7646d2SAndroid Build Coastguard Worker {
2366*5e7646d2SAndroid Build Coastguard Worker /*
2367*5e7646d2SAndroid Build Coastguard Worker * Grab "@AUTHKEY(name)" value...
2368*5e7646d2SAndroid Build Coastguard Worker */
2369*5e7646d2SAndroid Build Coastguard Worker
2370*5e7646d2SAndroid Build Coastguard Worker for (valptr = value + 9; *valptr != ')' && *valptr; valptr ++);
2371*5e7646d2SAndroid Build Coastguard Worker
2372*5e7646d2SAndroid Build Coastguard Worker if (*valptr)
2373*5e7646d2SAndroid Build Coastguard Worker *valptr++ = '\0';
2374*5e7646d2SAndroid Build Coastguard Worker }
2375*5e7646d2SAndroid Build Coastguard Worker else
2376*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_AUTHORIZATION_H */
2377*5e7646d2SAndroid Build Coastguard Worker if (*value == '\"' || *value == '\'')
2378*5e7646d2SAndroid Build Coastguard Worker {
2379*5e7646d2SAndroid Build Coastguard Worker /*
2380*5e7646d2SAndroid Build Coastguard Worker * Grab quoted name...
2381*5e7646d2SAndroid Build Coastguard Worker */
2382*5e7646d2SAndroid Build Coastguard Worker
2383*5e7646d2SAndroid Build Coastguard Worker for (valptr = value + 1; *valptr != *value && *valptr; valptr ++);
2384*5e7646d2SAndroid Build Coastguard Worker
2385*5e7646d2SAndroid Build Coastguard Worker value ++;
2386*5e7646d2SAndroid Build Coastguard Worker }
2387*5e7646d2SAndroid Build Coastguard Worker else
2388*5e7646d2SAndroid Build Coastguard Worker {
2389*5e7646d2SAndroid Build Coastguard Worker /*
2390*5e7646d2SAndroid Build Coastguard Worker * Grab literal name.
2391*5e7646d2SAndroid Build Coastguard Worker */
2392*5e7646d2SAndroid Build Coastguard Worker
2393*5e7646d2SAndroid Build Coastguard Worker for (valptr = value; !_cups_isspace(*valptr) && *valptr; valptr ++);
2394*5e7646d2SAndroid Build Coastguard Worker }
2395*5e7646d2SAndroid Build Coastguard Worker
2396*5e7646d2SAndroid Build Coastguard Worker if (*valptr)
2397*5e7646d2SAndroid Build Coastguard Worker *valptr++ = '\0';
2398*5e7646d2SAndroid Build Coastguard Worker
2399*5e7646d2SAndroid Build Coastguard Worker cupsdAddName(loc, value);
2400*5e7646d2SAndroid Build Coastguard Worker
2401*5e7646d2SAndroid Build Coastguard Worker for (value = valptr; _cups_isspace(*value); value ++);
2402*5e7646d2SAndroid Build Coastguard Worker }
2403*5e7646d2SAndroid Build Coastguard Worker }
2404*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "Satisfy"))
2405*5e7646d2SAndroid Build Coastguard Worker {
2406*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "all"))
2407*5e7646d2SAndroid Build Coastguard Worker loc->satisfy = CUPSD_AUTH_SATISFY_ALL;
2408*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "any"))
2409*5e7646d2SAndroid Build Coastguard Worker loc->satisfy = CUPSD_AUTH_SATISFY_ANY;
2410*5e7646d2SAndroid Build Coastguard Worker else
2411*5e7646d2SAndroid Build Coastguard Worker {
2412*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "Unknown Satisfy value %s on line %d of %s.",
2413*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
2414*5e7646d2SAndroid Build Coastguard Worker return (0);
2415*5e7646d2SAndroid Build Coastguard Worker }
2416*5e7646d2SAndroid Build Coastguard Worker }
2417*5e7646d2SAndroid Build Coastguard Worker else
2418*5e7646d2SAndroid Build Coastguard Worker return (0);
2419*5e7646d2SAndroid Build Coastguard Worker
2420*5e7646d2SAndroid Build Coastguard Worker return (1);
2421*5e7646d2SAndroid Build Coastguard Worker }
2422*5e7646d2SAndroid Build Coastguard Worker
2423*5e7646d2SAndroid Build Coastguard Worker
2424*5e7646d2SAndroid Build Coastguard Worker /*
2425*5e7646d2SAndroid Build Coastguard Worker * 'parse_fatal_errors()' - Parse FatalErrors values in a string.
2426*5e7646d2SAndroid Build Coastguard Worker */
2427*5e7646d2SAndroid Build Coastguard Worker
2428*5e7646d2SAndroid Build Coastguard Worker static int /* O - FatalErrors bits */
parse_fatal_errors(const char * s)2429*5e7646d2SAndroid Build Coastguard Worker parse_fatal_errors(const char *s) /* I - FatalErrors string */
2430*5e7646d2SAndroid Build Coastguard Worker {
2431*5e7646d2SAndroid Build Coastguard Worker int fatal; /* FatalErrors bits */
2432*5e7646d2SAndroid Build Coastguard Worker char value[1024], /* Value string */
2433*5e7646d2SAndroid Build Coastguard Worker *valstart, /* Pointer into value */
2434*5e7646d2SAndroid Build Coastguard Worker *valend; /* End of value */
2435*5e7646d2SAndroid Build Coastguard Worker
2436*5e7646d2SAndroid Build Coastguard Worker
2437*5e7646d2SAndroid Build Coastguard Worker /*
2438*5e7646d2SAndroid Build Coastguard Worker * Empty FatalErrors line yields NULL pointer...
2439*5e7646d2SAndroid Build Coastguard Worker */
2440*5e7646d2SAndroid Build Coastguard Worker
2441*5e7646d2SAndroid Build Coastguard Worker if (!s)
2442*5e7646d2SAndroid Build Coastguard Worker return (CUPSD_FATAL_NONE);
2443*5e7646d2SAndroid Build Coastguard Worker
2444*5e7646d2SAndroid Build Coastguard Worker /*
2445*5e7646d2SAndroid Build Coastguard Worker * Loop through the value string,...
2446*5e7646d2SAndroid Build Coastguard Worker */
2447*5e7646d2SAndroid Build Coastguard Worker
2448*5e7646d2SAndroid Build Coastguard Worker strlcpy(value, s, sizeof(value));
2449*5e7646d2SAndroid Build Coastguard Worker
2450*5e7646d2SAndroid Build Coastguard Worker fatal = CUPSD_FATAL_NONE;
2451*5e7646d2SAndroid Build Coastguard Worker
2452*5e7646d2SAndroid Build Coastguard Worker for (valstart = value; *valstart;)
2453*5e7646d2SAndroid Build Coastguard Worker {
2454*5e7646d2SAndroid Build Coastguard Worker /*
2455*5e7646d2SAndroid Build Coastguard Worker * Get the current space/comma-delimited kind name...
2456*5e7646d2SAndroid Build Coastguard Worker */
2457*5e7646d2SAndroid Build Coastguard Worker
2458*5e7646d2SAndroid Build Coastguard Worker for (valend = valstart; *valend; valend ++)
2459*5e7646d2SAndroid Build Coastguard Worker if (_cups_isspace(*valend) || *valend == ',')
2460*5e7646d2SAndroid Build Coastguard Worker break;
2461*5e7646d2SAndroid Build Coastguard Worker
2462*5e7646d2SAndroid Build Coastguard Worker if (*valend)
2463*5e7646d2SAndroid Build Coastguard Worker *valend++ = '\0';
2464*5e7646d2SAndroid Build Coastguard Worker
2465*5e7646d2SAndroid Build Coastguard Worker /*
2466*5e7646d2SAndroid Build Coastguard Worker * Add the error to the bitmask...
2467*5e7646d2SAndroid Build Coastguard Worker */
2468*5e7646d2SAndroid Build Coastguard Worker
2469*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(valstart, "all"))
2470*5e7646d2SAndroid Build Coastguard Worker fatal = CUPSD_FATAL_ALL;
2471*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(valstart, "browse"))
2472*5e7646d2SAndroid Build Coastguard Worker fatal |= CUPSD_FATAL_BROWSE;
2473*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(valstart, "-browse"))
2474*5e7646d2SAndroid Build Coastguard Worker fatal &= ~CUPSD_FATAL_BROWSE;
2475*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(valstart, "config"))
2476*5e7646d2SAndroid Build Coastguard Worker fatal |= CUPSD_FATAL_CONFIG;
2477*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(valstart, "-config"))
2478*5e7646d2SAndroid Build Coastguard Worker fatal &= ~CUPSD_FATAL_CONFIG;
2479*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(valstart, "listen"))
2480*5e7646d2SAndroid Build Coastguard Worker fatal |= CUPSD_FATAL_LISTEN;
2481*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(valstart, "-listen"))
2482*5e7646d2SAndroid Build Coastguard Worker fatal &= ~CUPSD_FATAL_LISTEN;
2483*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(valstart, "log"))
2484*5e7646d2SAndroid Build Coastguard Worker fatal |= CUPSD_FATAL_LOG;
2485*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(valstart, "-log"))
2486*5e7646d2SAndroid Build Coastguard Worker fatal &= ~CUPSD_FATAL_LOG;
2487*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(valstart, "permissions"))
2488*5e7646d2SAndroid Build Coastguard Worker fatal |= CUPSD_FATAL_PERMISSIONS;
2489*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(valstart, "-permissions"))
2490*5e7646d2SAndroid Build Coastguard Worker fatal &= ~CUPSD_FATAL_PERMISSIONS;
2491*5e7646d2SAndroid Build Coastguard Worker else if (_cups_strcasecmp(valstart, "none"))
2492*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2493*5e7646d2SAndroid Build Coastguard Worker "Unknown FatalErrors kind \"%s\" ignored.", valstart);
2494*5e7646d2SAndroid Build Coastguard Worker
2495*5e7646d2SAndroid Build Coastguard Worker for (valstart = valend; *valstart; valstart ++)
2496*5e7646d2SAndroid Build Coastguard Worker if (!_cups_isspace(*valstart) || *valstart != ',')
2497*5e7646d2SAndroid Build Coastguard Worker break;
2498*5e7646d2SAndroid Build Coastguard Worker }
2499*5e7646d2SAndroid Build Coastguard Worker
2500*5e7646d2SAndroid Build Coastguard Worker return (fatal);
2501*5e7646d2SAndroid Build Coastguard Worker }
2502*5e7646d2SAndroid Build Coastguard Worker
2503*5e7646d2SAndroid Build Coastguard Worker
2504*5e7646d2SAndroid Build Coastguard Worker /*
2505*5e7646d2SAndroid Build Coastguard Worker * 'parse_groups()' - Parse system group names in a string.
2506*5e7646d2SAndroid Build Coastguard Worker */
2507*5e7646d2SAndroid Build Coastguard Worker
2508*5e7646d2SAndroid Build Coastguard Worker static int /* O - 1 on success, 0 on failure */
parse_groups(const char * s,int linenum)2509*5e7646d2SAndroid Build Coastguard Worker parse_groups(const char *s, /* I - Space-delimited groups */
2510*5e7646d2SAndroid Build Coastguard Worker int linenum) /* I - Line number in cups-files.conf */
2511*5e7646d2SAndroid Build Coastguard Worker {
2512*5e7646d2SAndroid Build Coastguard Worker int status; /* Return status */
2513*5e7646d2SAndroid Build Coastguard Worker char value[1024], /* Value string */
2514*5e7646d2SAndroid Build Coastguard Worker *valstart, /* Pointer into value */
2515*5e7646d2SAndroid Build Coastguard Worker *valend, /* End of value */
2516*5e7646d2SAndroid Build Coastguard Worker quote; /* Quote character */
2517*5e7646d2SAndroid Build Coastguard Worker struct group *group; /* Group */
2518*5e7646d2SAndroid Build Coastguard Worker
2519*5e7646d2SAndroid Build Coastguard Worker
2520*5e7646d2SAndroid Build Coastguard Worker /*
2521*5e7646d2SAndroid Build Coastguard Worker * Make a copy of the string and parse out the groups...
2522*5e7646d2SAndroid Build Coastguard Worker */
2523*5e7646d2SAndroid Build Coastguard Worker
2524*5e7646d2SAndroid Build Coastguard Worker strlcpy(value, s, sizeof(value));
2525*5e7646d2SAndroid Build Coastguard Worker
2526*5e7646d2SAndroid Build Coastguard Worker status = 1;
2527*5e7646d2SAndroid Build Coastguard Worker valstart = value;
2528*5e7646d2SAndroid Build Coastguard Worker
2529*5e7646d2SAndroid Build Coastguard Worker while (*valstart && NumSystemGroups < MAX_SYSTEM_GROUPS)
2530*5e7646d2SAndroid Build Coastguard Worker {
2531*5e7646d2SAndroid Build Coastguard Worker if (*valstart == '\'' || *valstart == '\"')
2532*5e7646d2SAndroid Build Coastguard Worker {
2533*5e7646d2SAndroid Build Coastguard Worker /*
2534*5e7646d2SAndroid Build Coastguard Worker * Scan quoted name...
2535*5e7646d2SAndroid Build Coastguard Worker */
2536*5e7646d2SAndroid Build Coastguard Worker
2537*5e7646d2SAndroid Build Coastguard Worker quote = *valstart++;
2538*5e7646d2SAndroid Build Coastguard Worker
2539*5e7646d2SAndroid Build Coastguard Worker for (valend = valstart; *valend; valend ++)
2540*5e7646d2SAndroid Build Coastguard Worker if (*valend == quote)
2541*5e7646d2SAndroid Build Coastguard Worker break;
2542*5e7646d2SAndroid Build Coastguard Worker }
2543*5e7646d2SAndroid Build Coastguard Worker else
2544*5e7646d2SAndroid Build Coastguard Worker {
2545*5e7646d2SAndroid Build Coastguard Worker /*
2546*5e7646d2SAndroid Build Coastguard Worker * Scan space or comma-delimited name...
2547*5e7646d2SAndroid Build Coastguard Worker */
2548*5e7646d2SAndroid Build Coastguard Worker
2549*5e7646d2SAndroid Build Coastguard Worker for (valend = valstart; *valend; valend ++)
2550*5e7646d2SAndroid Build Coastguard Worker if (_cups_isspace(*valend) || *valend == ',')
2551*5e7646d2SAndroid Build Coastguard Worker break;
2552*5e7646d2SAndroid Build Coastguard Worker }
2553*5e7646d2SAndroid Build Coastguard Worker
2554*5e7646d2SAndroid Build Coastguard Worker if (*valend)
2555*5e7646d2SAndroid Build Coastguard Worker *valend++ = '\0';
2556*5e7646d2SAndroid Build Coastguard Worker
2557*5e7646d2SAndroid Build Coastguard Worker group = getgrnam(valstart);
2558*5e7646d2SAndroid Build Coastguard Worker if (group)
2559*5e7646d2SAndroid Build Coastguard Worker {
2560*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(SystemGroups + NumSystemGroups, valstart);
2561*5e7646d2SAndroid Build Coastguard Worker SystemGroupIDs[NumSystemGroups] = group->gr_gid;
2562*5e7646d2SAndroid Build Coastguard Worker
2563*5e7646d2SAndroid Build Coastguard Worker NumSystemGroups ++;
2564*5e7646d2SAndroid Build Coastguard Worker }
2565*5e7646d2SAndroid Build Coastguard Worker else
2566*5e7646d2SAndroid Build Coastguard Worker {
2567*5e7646d2SAndroid Build Coastguard Worker if (linenum)
2568*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown SystemGroup \"%s\" on line %d of %s.", valstart, linenum, CupsFilesFile);
2569*5e7646d2SAndroid Build Coastguard Worker else
2570*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown default SystemGroup \"%s\".", valstart);
2571*5e7646d2SAndroid Build Coastguard Worker
2572*5e7646d2SAndroid Build Coastguard Worker status = 0;
2573*5e7646d2SAndroid Build Coastguard Worker }
2574*5e7646d2SAndroid Build Coastguard Worker
2575*5e7646d2SAndroid Build Coastguard Worker endgrent();
2576*5e7646d2SAndroid Build Coastguard Worker
2577*5e7646d2SAndroid Build Coastguard Worker valstart = valend;
2578*5e7646d2SAndroid Build Coastguard Worker
2579*5e7646d2SAndroid Build Coastguard Worker while (*valstart == ',' || _cups_isspace(*valstart))
2580*5e7646d2SAndroid Build Coastguard Worker valstart ++;
2581*5e7646d2SAndroid Build Coastguard Worker }
2582*5e7646d2SAndroid Build Coastguard Worker
2583*5e7646d2SAndroid Build Coastguard Worker return (status);
2584*5e7646d2SAndroid Build Coastguard Worker }
2585*5e7646d2SAndroid Build Coastguard Worker
2586*5e7646d2SAndroid Build Coastguard Worker
2587*5e7646d2SAndroid Build Coastguard Worker /*
2588*5e7646d2SAndroid Build Coastguard Worker * 'parse_protocols()' - Parse browse protocols in a string.
2589*5e7646d2SAndroid Build Coastguard Worker */
2590*5e7646d2SAndroid Build Coastguard Worker
2591*5e7646d2SAndroid Build Coastguard Worker static int /* O - Browse protocol bits */
parse_protocols(const char * s)2592*5e7646d2SAndroid Build Coastguard Worker parse_protocols(const char *s) /* I - Space-delimited protocols */
2593*5e7646d2SAndroid Build Coastguard Worker {
2594*5e7646d2SAndroid Build Coastguard Worker int protocols; /* Browse protocol bits */
2595*5e7646d2SAndroid Build Coastguard Worker char value[1024], /* Value string */
2596*5e7646d2SAndroid Build Coastguard Worker *valstart, /* Pointer into value */
2597*5e7646d2SAndroid Build Coastguard Worker *valend; /* End of value */
2598*5e7646d2SAndroid Build Coastguard Worker
2599*5e7646d2SAndroid Build Coastguard Worker
2600*5e7646d2SAndroid Build Coastguard Worker /*
2601*5e7646d2SAndroid Build Coastguard Worker * Empty protocol line yields NULL pointer...
2602*5e7646d2SAndroid Build Coastguard Worker */
2603*5e7646d2SAndroid Build Coastguard Worker
2604*5e7646d2SAndroid Build Coastguard Worker if (!s)
2605*5e7646d2SAndroid Build Coastguard Worker return (0);
2606*5e7646d2SAndroid Build Coastguard Worker
2607*5e7646d2SAndroid Build Coastguard Worker /*
2608*5e7646d2SAndroid Build Coastguard Worker * Loop through the value string,...
2609*5e7646d2SAndroid Build Coastguard Worker */
2610*5e7646d2SAndroid Build Coastguard Worker
2611*5e7646d2SAndroid Build Coastguard Worker strlcpy(value, s, sizeof(value));
2612*5e7646d2SAndroid Build Coastguard Worker
2613*5e7646d2SAndroid Build Coastguard Worker protocols = 0;
2614*5e7646d2SAndroid Build Coastguard Worker
2615*5e7646d2SAndroid Build Coastguard Worker for (valstart = value; *valstart;)
2616*5e7646d2SAndroid Build Coastguard Worker {
2617*5e7646d2SAndroid Build Coastguard Worker /*
2618*5e7646d2SAndroid Build Coastguard Worker * Get the current space/comma-delimited protocol name...
2619*5e7646d2SAndroid Build Coastguard Worker */
2620*5e7646d2SAndroid Build Coastguard Worker
2621*5e7646d2SAndroid Build Coastguard Worker for (valend = valstart; *valend; valend ++)
2622*5e7646d2SAndroid Build Coastguard Worker if (_cups_isspace(*valend) || *valend == ',')
2623*5e7646d2SAndroid Build Coastguard Worker break;
2624*5e7646d2SAndroid Build Coastguard Worker
2625*5e7646d2SAndroid Build Coastguard Worker if (*valend)
2626*5e7646d2SAndroid Build Coastguard Worker *valend++ = '\0';
2627*5e7646d2SAndroid Build Coastguard Worker
2628*5e7646d2SAndroid Build Coastguard Worker /*
2629*5e7646d2SAndroid Build Coastguard Worker * Add the protocol to the bitmask...
2630*5e7646d2SAndroid Build Coastguard Worker */
2631*5e7646d2SAndroid Build Coastguard Worker
2632*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(valstart, "dnssd") ||
2633*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(valstart, "dns-sd") ||
2634*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(valstart, "bonjour"))
2635*5e7646d2SAndroid Build Coastguard Worker protocols |= BROWSE_DNSSD;
2636*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(valstart, "all"))
2637*5e7646d2SAndroid Build Coastguard Worker protocols |= BROWSE_ALL;
2638*5e7646d2SAndroid Build Coastguard Worker else if (_cups_strcasecmp(valstart, "none"))
2639*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2640*5e7646d2SAndroid Build Coastguard Worker "Unknown browse protocol \"%s\" ignored.", valstart);
2641*5e7646d2SAndroid Build Coastguard Worker
2642*5e7646d2SAndroid Build Coastguard Worker for (valstart = valend; *valstart; valstart ++)
2643*5e7646d2SAndroid Build Coastguard Worker if (!_cups_isspace(*valstart) || *valstart != ',')
2644*5e7646d2SAndroid Build Coastguard Worker break;
2645*5e7646d2SAndroid Build Coastguard Worker }
2646*5e7646d2SAndroid Build Coastguard Worker
2647*5e7646d2SAndroid Build Coastguard Worker return (protocols);
2648*5e7646d2SAndroid Build Coastguard Worker }
2649*5e7646d2SAndroid Build Coastguard Worker
2650*5e7646d2SAndroid Build Coastguard Worker
2651*5e7646d2SAndroid Build Coastguard Worker /*
2652*5e7646d2SAndroid Build Coastguard Worker * 'parse_variable()' - Parse a variable line.
2653*5e7646d2SAndroid Build Coastguard Worker */
2654*5e7646d2SAndroid Build Coastguard Worker
2655*5e7646d2SAndroid Build Coastguard Worker static int /* O - 1 on success, 0 on failure */
parse_variable(const char * filename,int linenum,const char * line,const char * value,size_t num_vars,const cupsd_var_t * vars)2656*5e7646d2SAndroid Build Coastguard Worker parse_variable(
2657*5e7646d2SAndroid Build Coastguard Worker const char *filename, /* I - Name of configuration file */
2658*5e7646d2SAndroid Build Coastguard Worker int linenum, /* I - Line in configuration file */
2659*5e7646d2SAndroid Build Coastguard Worker const char *line, /* I - Line from configuration file */
2660*5e7646d2SAndroid Build Coastguard Worker const char *value, /* I - Value from configuration file */
2661*5e7646d2SAndroid Build Coastguard Worker size_t num_vars, /* I - Number of variables */
2662*5e7646d2SAndroid Build Coastguard Worker const cupsd_var_t *vars) /* I - Variables */
2663*5e7646d2SAndroid Build Coastguard Worker {
2664*5e7646d2SAndroid Build Coastguard Worker size_t i; /* Looping var */
2665*5e7646d2SAndroid Build Coastguard Worker const cupsd_var_t *var; /* Variables */
2666*5e7646d2SAndroid Build Coastguard Worker char temp[1024]; /* Temporary string */
2667*5e7646d2SAndroid Build Coastguard Worker
2668*5e7646d2SAndroid Build Coastguard Worker
2669*5e7646d2SAndroid Build Coastguard Worker for (i = num_vars, var = vars; i > 0; i --, var ++)
2670*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(line, var->name))
2671*5e7646d2SAndroid Build Coastguard Worker break;
2672*5e7646d2SAndroid Build Coastguard Worker
2673*5e7646d2SAndroid Build Coastguard Worker if (i == 0)
2674*5e7646d2SAndroid Build Coastguard Worker {
2675*5e7646d2SAndroid Build Coastguard Worker /*
2676*5e7646d2SAndroid Build Coastguard Worker * Unknown directive! Output an error message and continue...
2677*5e7646d2SAndroid Build Coastguard Worker */
2678*5e7646d2SAndroid Build Coastguard Worker
2679*5e7646d2SAndroid Build Coastguard Worker if (!value)
2680*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value for %s on line %d of %s.",
2681*5e7646d2SAndroid Build Coastguard Worker line, linenum, filename);
2682*5e7646d2SAndroid Build Coastguard Worker else
2683*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown directive %s on line %d of %s.",
2684*5e7646d2SAndroid Build Coastguard Worker line, linenum, filename);
2685*5e7646d2SAndroid Build Coastguard Worker
2686*5e7646d2SAndroid Build Coastguard Worker return (0);
2687*5e7646d2SAndroid Build Coastguard Worker }
2688*5e7646d2SAndroid Build Coastguard Worker
2689*5e7646d2SAndroid Build Coastguard Worker switch (var->type)
2690*5e7646d2SAndroid Build Coastguard Worker {
2691*5e7646d2SAndroid Build Coastguard Worker case CUPSD_VARTYPE_INTEGER :
2692*5e7646d2SAndroid Build Coastguard Worker if (!value)
2693*5e7646d2SAndroid Build Coastguard Worker {
2694*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2695*5e7646d2SAndroid Build Coastguard Worker "Missing integer value for %s on line %d of %s.",
2696*5e7646d2SAndroid Build Coastguard Worker line, linenum, filename);
2697*5e7646d2SAndroid Build Coastguard Worker return (0);
2698*5e7646d2SAndroid Build Coastguard Worker }
2699*5e7646d2SAndroid Build Coastguard Worker else if (!isdigit(*value & 255))
2700*5e7646d2SAndroid Build Coastguard Worker {
2701*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2702*5e7646d2SAndroid Build Coastguard Worker "Bad integer value for %s on line %d of %s.",
2703*5e7646d2SAndroid Build Coastguard Worker line, linenum, filename);
2704*5e7646d2SAndroid Build Coastguard Worker return (0);
2705*5e7646d2SAndroid Build Coastguard Worker }
2706*5e7646d2SAndroid Build Coastguard Worker else
2707*5e7646d2SAndroid Build Coastguard Worker {
2708*5e7646d2SAndroid Build Coastguard Worker int n; /* Number */
2709*5e7646d2SAndroid Build Coastguard Worker char *units; /* Units */
2710*5e7646d2SAndroid Build Coastguard Worker
2711*5e7646d2SAndroid Build Coastguard Worker n = strtol(value, &units, 0);
2712*5e7646d2SAndroid Build Coastguard Worker
2713*5e7646d2SAndroid Build Coastguard Worker if (units && *units)
2714*5e7646d2SAndroid Build Coastguard Worker {
2715*5e7646d2SAndroid Build Coastguard Worker if (tolower(units[0] & 255) == 'g')
2716*5e7646d2SAndroid Build Coastguard Worker n *= 1024 * 1024 * 1024;
2717*5e7646d2SAndroid Build Coastguard Worker else if (tolower(units[0] & 255) == 'm')
2718*5e7646d2SAndroid Build Coastguard Worker n *= 1024 * 1024;
2719*5e7646d2SAndroid Build Coastguard Worker else if (tolower(units[0] & 255) == 'k')
2720*5e7646d2SAndroid Build Coastguard Worker n *= 1024;
2721*5e7646d2SAndroid Build Coastguard Worker else if (tolower(units[0] & 255) == 't')
2722*5e7646d2SAndroid Build Coastguard Worker n *= 262144;
2723*5e7646d2SAndroid Build Coastguard Worker else
2724*5e7646d2SAndroid Build Coastguard Worker {
2725*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2726*5e7646d2SAndroid Build Coastguard Worker "Unknown integer value for %s on line %d of %s.",
2727*5e7646d2SAndroid Build Coastguard Worker line, linenum, filename);
2728*5e7646d2SAndroid Build Coastguard Worker return (0);
2729*5e7646d2SAndroid Build Coastguard Worker }
2730*5e7646d2SAndroid Build Coastguard Worker }
2731*5e7646d2SAndroid Build Coastguard Worker
2732*5e7646d2SAndroid Build Coastguard Worker if (n < 0)
2733*5e7646d2SAndroid Build Coastguard Worker {
2734*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2735*5e7646d2SAndroid Build Coastguard Worker "Bad negative integer value for %s on line %d of "
2736*5e7646d2SAndroid Build Coastguard Worker "%s.", line, linenum, filename);
2737*5e7646d2SAndroid Build Coastguard Worker return (0);
2738*5e7646d2SAndroid Build Coastguard Worker }
2739*5e7646d2SAndroid Build Coastguard Worker else
2740*5e7646d2SAndroid Build Coastguard Worker {
2741*5e7646d2SAndroid Build Coastguard Worker *((int *)var->ptr) = n;
2742*5e7646d2SAndroid Build Coastguard Worker }
2743*5e7646d2SAndroid Build Coastguard Worker }
2744*5e7646d2SAndroid Build Coastguard Worker break;
2745*5e7646d2SAndroid Build Coastguard Worker
2746*5e7646d2SAndroid Build Coastguard Worker case CUPSD_VARTYPE_PERM :
2747*5e7646d2SAndroid Build Coastguard Worker if (!value)
2748*5e7646d2SAndroid Build Coastguard Worker {
2749*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2750*5e7646d2SAndroid Build Coastguard Worker "Missing permissions value for %s on line %d of %s.",
2751*5e7646d2SAndroid Build Coastguard Worker line, linenum, filename);
2752*5e7646d2SAndroid Build Coastguard Worker return (0);
2753*5e7646d2SAndroid Build Coastguard Worker }
2754*5e7646d2SAndroid Build Coastguard Worker else if (!isdigit(*value & 255))
2755*5e7646d2SAndroid Build Coastguard Worker {
2756*5e7646d2SAndroid Build Coastguard Worker /* TODO: Add chmod UGO syntax support */
2757*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2758*5e7646d2SAndroid Build Coastguard Worker "Bad permissions value for %s on line %d of %s.",
2759*5e7646d2SAndroid Build Coastguard Worker line, linenum, filename);
2760*5e7646d2SAndroid Build Coastguard Worker return (0);
2761*5e7646d2SAndroid Build Coastguard Worker }
2762*5e7646d2SAndroid Build Coastguard Worker else
2763*5e7646d2SAndroid Build Coastguard Worker {
2764*5e7646d2SAndroid Build Coastguard Worker int n = strtol(value, NULL, 8);
2765*5e7646d2SAndroid Build Coastguard Worker /* Permissions value */
2766*5e7646d2SAndroid Build Coastguard Worker
2767*5e7646d2SAndroid Build Coastguard Worker if (n < 0)
2768*5e7646d2SAndroid Build Coastguard Worker {
2769*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2770*5e7646d2SAndroid Build Coastguard Worker "Bad negative permissions value for %s on line %d of "
2771*5e7646d2SAndroid Build Coastguard Worker "%s.", line, linenum, filename);
2772*5e7646d2SAndroid Build Coastguard Worker return (0);
2773*5e7646d2SAndroid Build Coastguard Worker }
2774*5e7646d2SAndroid Build Coastguard Worker else
2775*5e7646d2SAndroid Build Coastguard Worker {
2776*5e7646d2SAndroid Build Coastguard Worker *((mode_t *)var->ptr) = (mode_t)n;
2777*5e7646d2SAndroid Build Coastguard Worker }
2778*5e7646d2SAndroid Build Coastguard Worker }
2779*5e7646d2SAndroid Build Coastguard Worker break;
2780*5e7646d2SAndroid Build Coastguard Worker
2781*5e7646d2SAndroid Build Coastguard Worker case CUPSD_VARTYPE_TIME :
2782*5e7646d2SAndroid Build Coastguard Worker if (!value)
2783*5e7646d2SAndroid Build Coastguard Worker {
2784*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2785*5e7646d2SAndroid Build Coastguard Worker "Missing time interval value for %s on line %d of "
2786*5e7646d2SAndroid Build Coastguard Worker "%s.", line, linenum, filename);
2787*5e7646d2SAndroid Build Coastguard Worker return (0);
2788*5e7646d2SAndroid Build Coastguard Worker }
2789*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strncasecmp(line, "PreserveJob", 11) &&
2790*5e7646d2SAndroid Build Coastguard Worker (!_cups_strcasecmp(value, "true") ||
2791*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "on") ||
2792*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "enabled") ||
2793*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "yes")))
2794*5e7646d2SAndroid Build Coastguard Worker {
2795*5e7646d2SAndroid Build Coastguard Worker *((int *)var->ptr) = INT_MAX;
2796*5e7646d2SAndroid Build Coastguard Worker }
2797*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "false") ||
2798*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "off") ||
2799*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "disabled") ||
2800*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "no"))
2801*5e7646d2SAndroid Build Coastguard Worker {
2802*5e7646d2SAndroid Build Coastguard Worker *((int *)var->ptr) = 0;
2803*5e7646d2SAndroid Build Coastguard Worker }
2804*5e7646d2SAndroid Build Coastguard Worker else if (!isdigit(*value & 255))
2805*5e7646d2SAndroid Build Coastguard Worker {
2806*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2807*5e7646d2SAndroid Build Coastguard Worker "Unknown time interval value for %s on line %d of "
2808*5e7646d2SAndroid Build Coastguard Worker "%s.", line, linenum, filename);
2809*5e7646d2SAndroid Build Coastguard Worker return (0);
2810*5e7646d2SAndroid Build Coastguard Worker }
2811*5e7646d2SAndroid Build Coastguard Worker else
2812*5e7646d2SAndroid Build Coastguard Worker {
2813*5e7646d2SAndroid Build Coastguard Worker double n; /* Number */
2814*5e7646d2SAndroid Build Coastguard Worker char *units; /* Units */
2815*5e7646d2SAndroid Build Coastguard Worker
2816*5e7646d2SAndroid Build Coastguard Worker n = strtod(value, &units);
2817*5e7646d2SAndroid Build Coastguard Worker
2818*5e7646d2SAndroid Build Coastguard Worker if (units && *units)
2819*5e7646d2SAndroid Build Coastguard Worker {
2820*5e7646d2SAndroid Build Coastguard Worker if (tolower(units[0] & 255) == 'w')
2821*5e7646d2SAndroid Build Coastguard Worker n *= 7 * 24 * 60 * 60;
2822*5e7646d2SAndroid Build Coastguard Worker else if (tolower(units[0] & 255) == 'd')
2823*5e7646d2SAndroid Build Coastguard Worker n *= 24 * 60 * 60;
2824*5e7646d2SAndroid Build Coastguard Worker else if (tolower(units[0] & 255) == 'h')
2825*5e7646d2SAndroid Build Coastguard Worker n *= 60 * 60;
2826*5e7646d2SAndroid Build Coastguard Worker else if (tolower(units[0] & 255) == 'm')
2827*5e7646d2SAndroid Build Coastguard Worker n *= 60;
2828*5e7646d2SAndroid Build Coastguard Worker else
2829*5e7646d2SAndroid Build Coastguard Worker {
2830*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2831*5e7646d2SAndroid Build Coastguard Worker "Unknown time interval value for %s on line "
2832*5e7646d2SAndroid Build Coastguard Worker "%d of %s.", line, linenum, filename);
2833*5e7646d2SAndroid Build Coastguard Worker return (0);
2834*5e7646d2SAndroid Build Coastguard Worker }
2835*5e7646d2SAndroid Build Coastguard Worker }
2836*5e7646d2SAndroid Build Coastguard Worker
2837*5e7646d2SAndroid Build Coastguard Worker if (n < 0.0 || n > INT_MAX)
2838*5e7646d2SAndroid Build Coastguard Worker {
2839*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2840*5e7646d2SAndroid Build Coastguard Worker "Bad time value for %s on line %d of %s.",
2841*5e7646d2SAndroid Build Coastguard Worker line, linenum, filename);
2842*5e7646d2SAndroid Build Coastguard Worker return (0);
2843*5e7646d2SAndroid Build Coastguard Worker }
2844*5e7646d2SAndroid Build Coastguard Worker else
2845*5e7646d2SAndroid Build Coastguard Worker {
2846*5e7646d2SAndroid Build Coastguard Worker *((int *)var->ptr) = (int)n;
2847*5e7646d2SAndroid Build Coastguard Worker }
2848*5e7646d2SAndroid Build Coastguard Worker }
2849*5e7646d2SAndroid Build Coastguard Worker break;
2850*5e7646d2SAndroid Build Coastguard Worker
2851*5e7646d2SAndroid Build Coastguard Worker case CUPSD_VARTYPE_BOOLEAN :
2852*5e7646d2SAndroid Build Coastguard Worker if (!value)
2853*5e7646d2SAndroid Build Coastguard Worker {
2854*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2855*5e7646d2SAndroid Build Coastguard Worker "Missing boolean value for %s on line %d of %s.",
2856*5e7646d2SAndroid Build Coastguard Worker line, linenum, filename);
2857*5e7646d2SAndroid Build Coastguard Worker return (0);
2858*5e7646d2SAndroid Build Coastguard Worker }
2859*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "true") ||
2860*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "on") ||
2861*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "enabled") ||
2862*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "yes") ||
2863*5e7646d2SAndroid Build Coastguard Worker atoi(value) != 0)
2864*5e7646d2SAndroid Build Coastguard Worker {
2865*5e7646d2SAndroid Build Coastguard Worker *((int *)var->ptr) = TRUE;
2866*5e7646d2SAndroid Build Coastguard Worker }
2867*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "false") ||
2868*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "off") ||
2869*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "disabled") ||
2870*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "no") ||
2871*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "0"))
2872*5e7646d2SAndroid Build Coastguard Worker {
2873*5e7646d2SAndroid Build Coastguard Worker *((int *)var->ptr) = FALSE;
2874*5e7646d2SAndroid Build Coastguard Worker }
2875*5e7646d2SAndroid Build Coastguard Worker else
2876*5e7646d2SAndroid Build Coastguard Worker {
2877*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2878*5e7646d2SAndroid Build Coastguard Worker "Unknown boolean value %s on line %d of %s.",
2879*5e7646d2SAndroid Build Coastguard Worker value, linenum, filename);
2880*5e7646d2SAndroid Build Coastguard Worker return (0);
2881*5e7646d2SAndroid Build Coastguard Worker }
2882*5e7646d2SAndroid Build Coastguard Worker break;
2883*5e7646d2SAndroid Build Coastguard Worker
2884*5e7646d2SAndroid Build Coastguard Worker case CUPSD_VARTYPE_PATHNAME :
2885*5e7646d2SAndroid Build Coastguard Worker if (!value)
2886*5e7646d2SAndroid Build Coastguard Worker {
2887*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2888*5e7646d2SAndroid Build Coastguard Worker "Missing pathname value for %s on line %d of %s.",
2889*5e7646d2SAndroid Build Coastguard Worker line, linenum, filename);
2890*5e7646d2SAndroid Build Coastguard Worker return (0);
2891*5e7646d2SAndroid Build Coastguard Worker }
2892*5e7646d2SAndroid Build Coastguard Worker
2893*5e7646d2SAndroid Build Coastguard Worker if (value[0] == '/')
2894*5e7646d2SAndroid Build Coastguard Worker strlcpy(temp, value, sizeof(temp));
2895*5e7646d2SAndroid Build Coastguard Worker else
2896*5e7646d2SAndroid Build Coastguard Worker snprintf(temp, sizeof(temp), "%s/%s", ServerRoot, value);
2897*5e7646d2SAndroid Build Coastguard Worker
2898*5e7646d2SAndroid Build Coastguard Worker if (access(temp, 0) && _cups_strcasecmp(value, "internal") && _cups_strcasecmp(line, "ServerKeychain"))
2899*5e7646d2SAndroid Build Coastguard Worker {
2900*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
2901*5e7646d2SAndroid Build Coastguard Worker "File or directory for \"%s %s\" on line %d of %s "
2902*5e7646d2SAndroid Build Coastguard Worker "does not exist.", line, value, linenum, filename);
2903*5e7646d2SAndroid Build Coastguard Worker return (0);
2904*5e7646d2SAndroid Build Coastguard Worker }
2905*5e7646d2SAndroid Build Coastguard Worker
2906*5e7646d2SAndroid Build Coastguard Worker cupsdSetString((char **)var->ptr, temp);
2907*5e7646d2SAndroid Build Coastguard Worker break;
2908*5e7646d2SAndroid Build Coastguard Worker
2909*5e7646d2SAndroid Build Coastguard Worker case CUPSD_VARTYPE_STRING :
2910*5e7646d2SAndroid Build Coastguard Worker cupsdSetString((char **)var->ptr, value);
2911*5e7646d2SAndroid Build Coastguard Worker break;
2912*5e7646d2SAndroid Build Coastguard Worker }
2913*5e7646d2SAndroid Build Coastguard Worker
2914*5e7646d2SAndroid Build Coastguard Worker return (1);
2915*5e7646d2SAndroid Build Coastguard Worker }
2916*5e7646d2SAndroid Build Coastguard Worker
2917*5e7646d2SAndroid Build Coastguard Worker
2918*5e7646d2SAndroid Build Coastguard Worker /*
2919*5e7646d2SAndroid Build Coastguard Worker * 'read_cupsd_conf()' - Read the cupsd.conf configuration file.
2920*5e7646d2SAndroid Build Coastguard Worker */
2921*5e7646d2SAndroid Build Coastguard Worker
2922*5e7646d2SAndroid Build Coastguard Worker static int /* O - 1 on success, 0 on failure */
read_cupsd_conf(cups_file_t * fp)2923*5e7646d2SAndroid Build Coastguard Worker read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
2924*5e7646d2SAndroid Build Coastguard Worker {
2925*5e7646d2SAndroid Build Coastguard Worker int linenum; /* Current line number */
2926*5e7646d2SAndroid Build Coastguard Worker char line[HTTP_MAX_BUFFER],
2927*5e7646d2SAndroid Build Coastguard Worker /* Line from file */
2928*5e7646d2SAndroid Build Coastguard Worker temp[HTTP_MAX_BUFFER],
2929*5e7646d2SAndroid Build Coastguard Worker /* Temporary buffer for value */
2930*5e7646d2SAndroid Build Coastguard Worker *value; /* Pointer to value */
2931*5e7646d2SAndroid Build Coastguard Worker int valuelen; /* Length of value */
2932*5e7646d2SAndroid Build Coastguard Worker http_addrlist_t *addrlist, /* Address list */
2933*5e7646d2SAndroid Build Coastguard Worker *addr; /* Current address */
2934*5e7646d2SAndroid Build Coastguard Worker
2935*5e7646d2SAndroid Build Coastguard Worker
2936*5e7646d2SAndroid Build Coastguard Worker /*
2937*5e7646d2SAndroid Build Coastguard Worker * Loop through each line in the file...
2938*5e7646d2SAndroid Build Coastguard Worker */
2939*5e7646d2SAndroid Build Coastguard Worker
2940*5e7646d2SAndroid Build Coastguard Worker linenum = 0;
2941*5e7646d2SAndroid Build Coastguard Worker
2942*5e7646d2SAndroid Build Coastguard Worker while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
2943*5e7646d2SAndroid Build Coastguard Worker {
2944*5e7646d2SAndroid Build Coastguard Worker /*
2945*5e7646d2SAndroid Build Coastguard Worker * Decode the directive...
2946*5e7646d2SAndroid Build Coastguard Worker */
2947*5e7646d2SAndroid Build Coastguard Worker
2948*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(line, "<Location") && value)
2949*5e7646d2SAndroid Build Coastguard Worker {
2950*5e7646d2SAndroid Build Coastguard Worker /*
2951*5e7646d2SAndroid Build Coastguard Worker * <Location path>
2952*5e7646d2SAndroid Build Coastguard Worker */
2953*5e7646d2SAndroid Build Coastguard Worker
2954*5e7646d2SAndroid Build Coastguard Worker linenum = read_location(fp, value, linenum);
2955*5e7646d2SAndroid Build Coastguard Worker if (linenum == 0)
2956*5e7646d2SAndroid Build Coastguard Worker return (0);
2957*5e7646d2SAndroid Build Coastguard Worker }
2958*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "<Policy") && value)
2959*5e7646d2SAndroid Build Coastguard Worker {
2960*5e7646d2SAndroid Build Coastguard Worker /*
2961*5e7646d2SAndroid Build Coastguard Worker * <Policy name>
2962*5e7646d2SAndroid Build Coastguard Worker */
2963*5e7646d2SAndroid Build Coastguard Worker
2964*5e7646d2SAndroid Build Coastguard Worker linenum = read_policy(fp, value, linenum);
2965*5e7646d2SAndroid Build Coastguard Worker if (linenum == 0)
2966*5e7646d2SAndroid Build Coastguard Worker return (0);
2967*5e7646d2SAndroid Build Coastguard Worker }
2968*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "FaxRetryInterval") && value)
2969*5e7646d2SAndroid Build Coastguard Worker {
2970*5e7646d2SAndroid Build Coastguard Worker JobRetryInterval = atoi(value);
2971*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN,
2972*5e7646d2SAndroid Build Coastguard Worker "FaxRetryInterval is deprecated; use "
2973*5e7646d2SAndroid Build Coastguard Worker "JobRetryInterval on line %d of %s.", linenum, ConfigurationFile);
2974*5e7646d2SAndroid Build Coastguard Worker }
2975*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "FaxRetryLimit") && value)
2976*5e7646d2SAndroid Build Coastguard Worker {
2977*5e7646d2SAndroid Build Coastguard Worker JobRetryLimit = atoi(value);
2978*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN,
2979*5e7646d2SAndroid Build Coastguard Worker "FaxRetryLimit is deprecated; use "
2980*5e7646d2SAndroid Build Coastguard Worker "JobRetryLimit on line %d of %s.", linenum, ConfigurationFile);
2981*5e7646d2SAndroid Build Coastguard Worker }
2982*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
2983*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "SSLOptions"))
2984*5e7646d2SAndroid Build Coastguard Worker {
2985*5e7646d2SAndroid Build Coastguard Worker /*
2986*5e7646d2SAndroid Build Coastguard Worker * SSLOptions [AllowRC4] [AllowSSL3] [AllowDH] [DenyCBC] [DenyTLS1.0] [None]
2987*5e7646d2SAndroid Build Coastguard Worker */
2988*5e7646d2SAndroid Build Coastguard Worker
2989*5e7646d2SAndroid Build Coastguard Worker int options = _HTTP_TLS_NONE,/* SSL/TLS options */
2990*5e7646d2SAndroid Build Coastguard Worker min_version = _HTTP_TLS_1_0,
2991*5e7646d2SAndroid Build Coastguard Worker max_version = _HTTP_TLS_MAX;
2992*5e7646d2SAndroid Build Coastguard Worker
2993*5e7646d2SAndroid Build Coastguard Worker if (value)
2994*5e7646d2SAndroid Build Coastguard Worker {
2995*5e7646d2SAndroid Build Coastguard Worker char *start, /* Start of option */
2996*5e7646d2SAndroid Build Coastguard Worker *end; /* End of option */
2997*5e7646d2SAndroid Build Coastguard Worker
2998*5e7646d2SAndroid Build Coastguard Worker for (start = value; *start; start = end)
2999*5e7646d2SAndroid Build Coastguard Worker {
3000*5e7646d2SAndroid Build Coastguard Worker /*
3001*5e7646d2SAndroid Build Coastguard Worker * Find end of keyword...
3002*5e7646d2SAndroid Build Coastguard Worker */
3003*5e7646d2SAndroid Build Coastguard Worker
3004*5e7646d2SAndroid Build Coastguard Worker end = start;
3005*5e7646d2SAndroid Build Coastguard Worker while (*end && !_cups_isspace(*end))
3006*5e7646d2SAndroid Build Coastguard Worker end ++;
3007*5e7646d2SAndroid Build Coastguard Worker
3008*5e7646d2SAndroid Build Coastguard Worker if (*end)
3009*5e7646d2SAndroid Build Coastguard Worker *end++ = '\0';
3010*5e7646d2SAndroid Build Coastguard Worker
3011*5e7646d2SAndroid Build Coastguard Worker /*
3012*5e7646d2SAndroid Build Coastguard Worker * Compare...
3013*5e7646d2SAndroid Build Coastguard Worker */
3014*5e7646d2SAndroid Build Coastguard Worker
3015*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(start, "AllowRC4"))
3016*5e7646d2SAndroid Build Coastguard Worker options |= _HTTP_TLS_ALLOW_RC4;
3017*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(start, "AllowSSL3"))
3018*5e7646d2SAndroid Build Coastguard Worker min_version = _HTTP_TLS_SSL3;
3019*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(start, "AllowDH"))
3020*5e7646d2SAndroid Build Coastguard Worker options |= _HTTP_TLS_ALLOW_DH;
3021*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(start, "DenyCBC"))
3022*5e7646d2SAndroid Build Coastguard Worker options |= _HTTP_TLS_DENY_CBC;
3023*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(start, "DenyTLS1.0"))
3024*5e7646d2SAndroid Build Coastguard Worker min_version = _HTTP_TLS_1_1;
3025*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(start, "MaxTLS1.0"))
3026*5e7646d2SAndroid Build Coastguard Worker max_version = _HTTP_TLS_1_0;
3027*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(start, "MaxTLS1.1"))
3028*5e7646d2SAndroid Build Coastguard Worker max_version = _HTTP_TLS_1_1;
3029*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(start, "MaxTLS1.2"))
3030*5e7646d2SAndroid Build Coastguard Worker max_version = _HTTP_TLS_1_2;
3031*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(start, "MaxTLS1.3"))
3032*5e7646d2SAndroid Build Coastguard Worker max_version = _HTTP_TLS_1_3;
3033*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(start, "MinTLS1.0"))
3034*5e7646d2SAndroid Build Coastguard Worker min_version = _HTTP_TLS_1_0;
3035*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(start, "MinTLS1.1"))
3036*5e7646d2SAndroid Build Coastguard Worker min_version = _HTTP_TLS_1_1;
3037*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(start, "MinTLS1.2"))
3038*5e7646d2SAndroid Build Coastguard Worker min_version = _HTTP_TLS_1_2;
3039*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(start, "MinTLS1.3"))
3040*5e7646d2SAndroid Build Coastguard Worker min_version = _HTTP_TLS_1_3;
3041*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(start, "None"))
3042*5e7646d2SAndroid Build Coastguard Worker options = _HTTP_TLS_NONE;
3043*5e7646d2SAndroid Build Coastguard Worker else if (_cups_strcasecmp(start, "NoEmptyFragments"))
3044*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "Unknown SSL option %s at line %d.", start, linenum);
3045*5e7646d2SAndroid Build Coastguard Worker }
3046*5e7646d2SAndroid Build Coastguard Worker }
3047*5e7646d2SAndroid Build Coastguard Worker
3048*5e7646d2SAndroid Build Coastguard Worker _httpTLSSetOptions(options, min_version, max_version);
3049*5e7646d2SAndroid Build Coastguard Worker }
3050*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
3051*5e7646d2SAndroid Build Coastguard Worker else if ((!_cups_strcasecmp(line, "Port") || !_cups_strcasecmp(line, "Listen")
3052*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
3053*5e7646d2SAndroid Build Coastguard Worker || !_cups_strcasecmp(line, "SSLPort") || !_cups_strcasecmp(line, "SSLListen")
3054*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
3055*5e7646d2SAndroid Build Coastguard Worker ) && value)
3056*5e7646d2SAndroid Build Coastguard Worker {
3057*5e7646d2SAndroid Build Coastguard Worker /*
3058*5e7646d2SAndroid Build Coastguard Worker * Add listening address(es) to the list...
3059*5e7646d2SAndroid Build Coastguard Worker */
3060*5e7646d2SAndroid Build Coastguard Worker
3061*5e7646d2SAndroid Build Coastguard Worker cupsd_listener_t *lis; /* New listeners array */
3062*5e7646d2SAndroid Build Coastguard Worker
3063*5e7646d2SAndroid Build Coastguard Worker
3064*5e7646d2SAndroid Build Coastguard Worker /*
3065*5e7646d2SAndroid Build Coastguard Worker * Get the address list...
3066*5e7646d2SAndroid Build Coastguard Worker */
3067*5e7646d2SAndroid Build Coastguard Worker
3068*5e7646d2SAndroid Build Coastguard Worker addrlist = get_address(value, IPP_PORT);
3069*5e7646d2SAndroid Build Coastguard Worker
3070*5e7646d2SAndroid Build Coastguard Worker if (!addrlist)
3071*5e7646d2SAndroid Build Coastguard Worker {
3072*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Bad %s address %s at line %d.", line,
3073*5e7646d2SAndroid Build Coastguard Worker value, linenum);
3074*5e7646d2SAndroid Build Coastguard Worker continue;
3075*5e7646d2SAndroid Build Coastguard Worker }
3076*5e7646d2SAndroid Build Coastguard Worker
3077*5e7646d2SAndroid Build Coastguard Worker /*
3078*5e7646d2SAndroid Build Coastguard Worker * Add each address...
3079*5e7646d2SAndroid Build Coastguard Worker */
3080*5e7646d2SAndroid Build Coastguard Worker
3081*5e7646d2SAndroid Build Coastguard Worker for (addr = addrlist; addr; addr = addr->next)
3082*5e7646d2SAndroid Build Coastguard Worker {
3083*5e7646d2SAndroid Build Coastguard Worker /*
3084*5e7646d2SAndroid Build Coastguard Worker * See if this address is already present...
3085*5e7646d2SAndroid Build Coastguard Worker */
3086*5e7646d2SAndroid Build Coastguard Worker
3087*5e7646d2SAndroid Build Coastguard Worker for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
3088*5e7646d2SAndroid Build Coastguard Worker lis;
3089*5e7646d2SAndroid Build Coastguard Worker lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
3090*5e7646d2SAndroid Build Coastguard Worker if (httpAddrEqual(&(addr->addr), &(lis->address)) &&
3091*5e7646d2SAndroid Build Coastguard Worker httpAddrPort(&(addr->addr)) == httpAddrPort(&(lis->address)))
3092*5e7646d2SAndroid Build Coastguard Worker break;
3093*5e7646d2SAndroid Build Coastguard Worker
3094*5e7646d2SAndroid Build Coastguard Worker if (lis)
3095*5e7646d2SAndroid Build Coastguard Worker {
3096*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_ONDEMAND
3097*5e7646d2SAndroid Build Coastguard Worker if (!lis->on_demand)
3098*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_ONDEMAND */
3099*5e7646d2SAndroid Build Coastguard Worker {
3100*5e7646d2SAndroid Build Coastguard Worker httpAddrString(&lis->address, temp, sizeof(temp));
3101*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN,
3102*5e7646d2SAndroid Build Coastguard Worker "Duplicate listen address \"%s\" ignored.", temp);
3103*5e7646d2SAndroid Build Coastguard Worker }
3104*5e7646d2SAndroid Build Coastguard Worker
3105*5e7646d2SAndroid Build Coastguard Worker continue;
3106*5e7646d2SAndroid Build Coastguard Worker }
3107*5e7646d2SAndroid Build Coastguard Worker
3108*5e7646d2SAndroid Build Coastguard Worker /*
3109*5e7646d2SAndroid Build Coastguard Worker * Allocate another listener...
3110*5e7646d2SAndroid Build Coastguard Worker */
3111*5e7646d2SAndroid Build Coastguard Worker
3112*5e7646d2SAndroid Build Coastguard Worker if (!Listeners)
3113*5e7646d2SAndroid Build Coastguard Worker Listeners = cupsArrayNew(NULL, NULL);
3114*5e7646d2SAndroid Build Coastguard Worker
3115*5e7646d2SAndroid Build Coastguard Worker if (!Listeners)
3116*5e7646d2SAndroid Build Coastguard Worker {
3117*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
3118*5e7646d2SAndroid Build Coastguard Worker "Unable to allocate %s at line %d - %s.",
3119*5e7646d2SAndroid Build Coastguard Worker line, linenum, strerror(errno));
3120*5e7646d2SAndroid Build Coastguard Worker break;
3121*5e7646d2SAndroid Build Coastguard Worker }
3122*5e7646d2SAndroid Build Coastguard Worker
3123*5e7646d2SAndroid Build Coastguard Worker if ((lis = calloc(1, sizeof(cupsd_listener_t))) == NULL)
3124*5e7646d2SAndroid Build Coastguard Worker {
3125*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
3126*5e7646d2SAndroid Build Coastguard Worker "Unable to allocate %s at line %d - %s.",
3127*5e7646d2SAndroid Build Coastguard Worker line, linenum, strerror(errno));
3128*5e7646d2SAndroid Build Coastguard Worker break;
3129*5e7646d2SAndroid Build Coastguard Worker }
3130*5e7646d2SAndroid Build Coastguard Worker
3131*5e7646d2SAndroid Build Coastguard Worker cupsArrayAdd(Listeners, lis);
3132*5e7646d2SAndroid Build Coastguard Worker
3133*5e7646d2SAndroid Build Coastguard Worker /*
3134*5e7646d2SAndroid Build Coastguard Worker * Copy the current address and log it...
3135*5e7646d2SAndroid Build Coastguard Worker */
3136*5e7646d2SAndroid Build Coastguard Worker
3137*5e7646d2SAndroid Build Coastguard Worker memcpy(&(lis->address), &(addr->addr), sizeof(lis->address));
3138*5e7646d2SAndroid Build Coastguard Worker lis->fd = -1;
3139*5e7646d2SAndroid Build Coastguard Worker
3140*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
3141*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(line, "SSLPort") || !_cups_strcasecmp(line, "SSLListen"))
3142*5e7646d2SAndroid Build Coastguard Worker lis->encryption = HTTP_ENCRYPT_ALWAYS;
3143*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
3144*5e7646d2SAndroid Build Coastguard Worker
3145*5e7646d2SAndroid Build Coastguard Worker httpAddrString(&lis->address, temp, sizeof(temp));
3146*5e7646d2SAndroid Build Coastguard Worker
3147*5e7646d2SAndroid Build Coastguard Worker #ifdef AF_LOCAL
3148*5e7646d2SAndroid Build Coastguard Worker if (lis->address.addr.sa_family == AF_LOCAL)
3149*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Listening to %s (Domain)", temp);
3150*5e7646d2SAndroid Build Coastguard Worker else
3151*5e7646d2SAndroid Build Coastguard Worker #endif /* AF_LOCAL */
3152*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO, "Listening to %s:%d (IPv%d)", temp,
3153*5e7646d2SAndroid Build Coastguard Worker httpAddrPort(&(lis->address)),
3154*5e7646d2SAndroid Build Coastguard Worker httpAddrFamily(&(lis->address)) == AF_INET ? 4 : 6);
3155*5e7646d2SAndroid Build Coastguard Worker
3156*5e7646d2SAndroid Build Coastguard Worker if (!httpAddrLocalhost(&(lis->address)))
3157*5e7646d2SAndroid Build Coastguard Worker RemotePort = httpAddrPort(&(lis->address));
3158*5e7646d2SAndroid Build Coastguard Worker }
3159*5e7646d2SAndroid Build Coastguard Worker
3160*5e7646d2SAndroid Build Coastguard Worker /*
3161*5e7646d2SAndroid Build Coastguard Worker * Free the list...
3162*5e7646d2SAndroid Build Coastguard Worker */
3163*5e7646d2SAndroid Build Coastguard Worker
3164*5e7646d2SAndroid Build Coastguard Worker httpAddrFreeList(addrlist);
3165*5e7646d2SAndroid Build Coastguard Worker }
3166*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "BrowseProtocols") ||
3167*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "BrowseLocalProtocols"))
3168*5e7646d2SAndroid Build Coastguard Worker {
3169*5e7646d2SAndroid Build Coastguard Worker /*
3170*5e7646d2SAndroid Build Coastguard Worker * "BrowseProtocols name [... name]"
3171*5e7646d2SAndroid Build Coastguard Worker * "BrowseLocalProtocols name [... name]"
3172*5e7646d2SAndroid Build Coastguard Worker */
3173*5e7646d2SAndroid Build Coastguard Worker
3174*5e7646d2SAndroid Build Coastguard Worker int protocols = parse_protocols(value);
3175*5e7646d2SAndroid Build Coastguard Worker
3176*5e7646d2SAndroid Build Coastguard Worker if (protocols < 0)
3177*5e7646d2SAndroid Build Coastguard Worker {
3178*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
3179*5e7646d2SAndroid Build Coastguard Worker "Unknown browse protocol \"%s\" on line %d of %s.",
3180*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
3181*5e7646d2SAndroid Build Coastguard Worker break;
3182*5e7646d2SAndroid Build Coastguard Worker }
3183*5e7646d2SAndroid Build Coastguard Worker
3184*5e7646d2SAndroid Build Coastguard Worker BrowseLocalProtocols = protocols;
3185*5e7646d2SAndroid Build Coastguard Worker }
3186*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "DefaultAuthType") && value)
3187*5e7646d2SAndroid Build Coastguard Worker {
3188*5e7646d2SAndroid Build Coastguard Worker /*
3189*5e7646d2SAndroid Build Coastguard Worker * DefaultAuthType {basic,digest,basicdigest,negotiate}
3190*5e7646d2SAndroid Build Coastguard Worker */
3191*5e7646d2SAndroid Build Coastguard Worker
3192*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "none"))
3193*5e7646d2SAndroid Build Coastguard Worker default_auth_type = CUPSD_AUTH_NONE;
3194*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "basic"))
3195*5e7646d2SAndroid Build Coastguard Worker default_auth_type = CUPSD_AUTH_BASIC;
3196*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "negotiate"))
3197*5e7646d2SAndroid Build Coastguard Worker default_auth_type = CUPSD_AUTH_NEGOTIATE;
3198*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "auto"))
3199*5e7646d2SAndroid Build Coastguard Worker default_auth_type = CUPSD_AUTH_AUTO;
3200*5e7646d2SAndroid Build Coastguard Worker else
3201*5e7646d2SAndroid Build Coastguard Worker {
3202*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN,
3203*5e7646d2SAndroid Build Coastguard Worker "Unknown default authorization type %s on line %d of %s.",
3204*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
3205*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3206*5e7646d2SAndroid Build Coastguard Worker return (0);
3207*5e7646d2SAndroid Build Coastguard Worker }
3208*5e7646d2SAndroid Build Coastguard Worker }
3209*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
3210*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "DefaultEncryption"))
3211*5e7646d2SAndroid Build Coastguard Worker {
3212*5e7646d2SAndroid Build Coastguard Worker /*
3213*5e7646d2SAndroid Build Coastguard Worker * DefaultEncryption {Never,IfRequested,Required}
3214*5e7646d2SAndroid Build Coastguard Worker */
3215*5e7646d2SAndroid Build Coastguard Worker
3216*5e7646d2SAndroid Build Coastguard Worker if (!value || !_cups_strcasecmp(value, "never"))
3217*5e7646d2SAndroid Build Coastguard Worker DefaultEncryption = HTTP_ENCRYPT_NEVER;
3218*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "required"))
3219*5e7646d2SAndroid Build Coastguard Worker DefaultEncryption = HTTP_ENCRYPT_REQUIRED;
3220*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "ifrequested"))
3221*5e7646d2SAndroid Build Coastguard Worker DefaultEncryption = HTTP_ENCRYPT_IF_REQUESTED;
3222*5e7646d2SAndroid Build Coastguard Worker else
3223*5e7646d2SAndroid Build Coastguard Worker {
3224*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN,
3225*5e7646d2SAndroid Build Coastguard Worker "Unknown default encryption %s on line %d of %s.",
3226*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
3227*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3228*5e7646d2SAndroid Build Coastguard Worker return (0);
3229*5e7646d2SAndroid Build Coastguard Worker }
3230*5e7646d2SAndroid Build Coastguard Worker }
3231*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
3232*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "HostNameLookups") && value)
3233*5e7646d2SAndroid Build Coastguard Worker {
3234*5e7646d2SAndroid Build Coastguard Worker /*
3235*5e7646d2SAndroid Build Coastguard Worker * Do hostname lookups?
3236*5e7646d2SAndroid Build Coastguard Worker */
3237*5e7646d2SAndroid Build Coastguard Worker
3238*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "off") || !_cups_strcasecmp(value, "no") ||
3239*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "false"))
3240*5e7646d2SAndroid Build Coastguard Worker HostNameLookups = 0;
3241*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "on") || !_cups_strcasecmp(value, "yes") ||
3242*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "true"))
3243*5e7646d2SAndroid Build Coastguard Worker HostNameLookups = 1;
3244*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "double"))
3245*5e7646d2SAndroid Build Coastguard Worker HostNameLookups = 2;
3246*5e7646d2SAndroid Build Coastguard Worker else
3247*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "Unknown HostNameLookups %s on line %d of %s.",
3248*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
3249*5e7646d2SAndroid Build Coastguard Worker }
3250*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "AccessLogLevel") && value)
3251*5e7646d2SAndroid Build Coastguard Worker {
3252*5e7646d2SAndroid Build Coastguard Worker /*
3253*5e7646d2SAndroid Build Coastguard Worker * Amount of logging to do to access log...
3254*5e7646d2SAndroid Build Coastguard Worker */
3255*5e7646d2SAndroid Build Coastguard Worker
3256*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "all"))
3257*5e7646d2SAndroid Build Coastguard Worker AccessLogLevel = CUPSD_ACCESSLOG_ALL;
3258*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "actions"))
3259*5e7646d2SAndroid Build Coastguard Worker AccessLogLevel = CUPSD_ACCESSLOG_ACTIONS;
3260*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "config"))
3261*5e7646d2SAndroid Build Coastguard Worker AccessLogLevel = CUPSD_ACCESSLOG_CONFIG;
3262*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "none"))
3263*5e7646d2SAndroid Build Coastguard Worker AccessLogLevel = CUPSD_ACCESSLOG_NONE;
3264*5e7646d2SAndroid Build Coastguard Worker else
3265*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "Unknown AccessLogLevel %s on line %d of %s.",
3266*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
3267*5e7646d2SAndroid Build Coastguard Worker }
3268*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "LogLevel") && value)
3269*5e7646d2SAndroid Build Coastguard Worker {
3270*5e7646d2SAndroid Build Coastguard Worker /*
3271*5e7646d2SAndroid Build Coastguard Worker * Amount of logging to do to error log...
3272*5e7646d2SAndroid Build Coastguard Worker */
3273*5e7646d2SAndroid Build Coastguard Worker
3274*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "debug2"))
3275*5e7646d2SAndroid Build Coastguard Worker LogLevel = CUPSD_LOG_DEBUG2;
3276*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "debug"))
3277*5e7646d2SAndroid Build Coastguard Worker LogLevel = CUPSD_LOG_DEBUG;
3278*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "info"))
3279*5e7646d2SAndroid Build Coastguard Worker LogLevel = CUPSD_LOG_INFO;
3280*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "notice"))
3281*5e7646d2SAndroid Build Coastguard Worker LogLevel = CUPSD_LOG_NOTICE;
3282*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "warn"))
3283*5e7646d2SAndroid Build Coastguard Worker LogLevel = CUPSD_LOG_WARN;
3284*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "error"))
3285*5e7646d2SAndroid Build Coastguard Worker LogLevel = CUPSD_LOG_ERROR;
3286*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "crit"))
3287*5e7646d2SAndroid Build Coastguard Worker LogLevel = CUPSD_LOG_CRIT;
3288*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "alert"))
3289*5e7646d2SAndroid Build Coastguard Worker LogLevel = CUPSD_LOG_ALERT;
3290*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "emerg"))
3291*5e7646d2SAndroid Build Coastguard Worker LogLevel = CUPSD_LOG_EMERG;
3292*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "none"))
3293*5e7646d2SAndroid Build Coastguard Worker LogLevel = CUPSD_LOG_NONE;
3294*5e7646d2SAndroid Build Coastguard Worker else
3295*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "Unknown LogLevel %s on line %d of %s.",
3296*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
3297*5e7646d2SAndroid Build Coastguard Worker }
3298*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "LogTimeFormat") && value)
3299*5e7646d2SAndroid Build Coastguard Worker {
3300*5e7646d2SAndroid Build Coastguard Worker /*
3301*5e7646d2SAndroid Build Coastguard Worker * Amount of logging to do to error log...
3302*5e7646d2SAndroid Build Coastguard Worker */
3303*5e7646d2SAndroid Build Coastguard Worker
3304*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "standard"))
3305*5e7646d2SAndroid Build Coastguard Worker LogTimeFormat = CUPSD_TIME_STANDARD;
3306*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "usecs"))
3307*5e7646d2SAndroid Build Coastguard Worker LogTimeFormat = CUPSD_TIME_USECS;
3308*5e7646d2SAndroid Build Coastguard Worker else
3309*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "Unknown LogTimeFormat %s on line %d of %s.",
3310*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
3311*5e7646d2SAndroid Build Coastguard Worker }
3312*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "ServerTokens") && value)
3313*5e7646d2SAndroid Build Coastguard Worker {
3314*5e7646d2SAndroid Build Coastguard Worker /*
3315*5e7646d2SAndroid Build Coastguard Worker * Set the string used for the Server header...
3316*5e7646d2SAndroid Build Coastguard Worker */
3317*5e7646d2SAndroid Build Coastguard Worker
3318*5e7646d2SAndroid Build Coastguard Worker struct utsname plat; /* Platform info */
3319*5e7646d2SAndroid Build Coastguard Worker
3320*5e7646d2SAndroid Build Coastguard Worker
3321*5e7646d2SAndroid Build Coastguard Worker uname(&plat);
3322*5e7646d2SAndroid Build Coastguard Worker
3323*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "ProductOnly"))
3324*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&ServerHeader, "CUPS IPP");
3325*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "Major"))
3326*5e7646d2SAndroid Build Coastguard Worker cupsdSetStringf(&ServerHeader, "CUPS/%d IPP/2", CUPS_VERSION_MAJOR);
3327*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "Minor"))
3328*5e7646d2SAndroid Build Coastguard Worker cupsdSetStringf(&ServerHeader, "CUPS/%d.%d IPP/2.1", CUPS_VERSION_MAJOR,
3329*5e7646d2SAndroid Build Coastguard Worker CUPS_VERSION_MINOR);
3330*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "Minimal"))
3331*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&ServerHeader, CUPS_MINIMAL " IPP/2.1");
3332*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "OS"))
3333*5e7646d2SAndroid Build Coastguard Worker cupsdSetStringf(&ServerHeader, CUPS_MINIMAL " (%s %s) IPP/2.1",
3334*5e7646d2SAndroid Build Coastguard Worker plat.sysname, plat.release);
3335*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "Full"))
3336*5e7646d2SAndroid Build Coastguard Worker cupsdSetStringf(&ServerHeader, CUPS_MINIMAL " (%s %s; %s) IPP/2.1",
3337*5e7646d2SAndroid Build Coastguard Worker plat.sysname, plat.release, plat.machine);
3338*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "None"))
3339*5e7646d2SAndroid Build Coastguard Worker cupsdSetString(&ServerHeader, "");
3340*5e7646d2SAndroid Build Coastguard Worker else
3341*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "Unknown ServerTokens %s on line %d of %s.",
3342*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
3343*5e7646d2SAndroid Build Coastguard Worker }
3344*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "ServerAlias") && value)
3345*5e7646d2SAndroid Build Coastguard Worker {
3346*5e7646d2SAndroid Build Coastguard Worker /*
3347*5e7646d2SAndroid Build Coastguard Worker * ServerAlias name [... name]
3348*5e7646d2SAndroid Build Coastguard Worker */
3349*5e7646d2SAndroid Build Coastguard Worker
3350*5e7646d2SAndroid Build Coastguard Worker if (!ServerAlias)
3351*5e7646d2SAndroid Build Coastguard Worker ServerAlias = cupsArrayNew(NULL, NULL);
3352*5e7646d2SAndroid Build Coastguard Worker
3353*5e7646d2SAndroid Build Coastguard Worker for (; *value;)
3354*5e7646d2SAndroid Build Coastguard Worker {
3355*5e7646d2SAndroid Build Coastguard Worker for (valuelen = 0; value[valuelen]; valuelen ++)
3356*5e7646d2SAndroid Build Coastguard Worker if (_cups_isspace(value[valuelen]) || value[valuelen] == ',')
3357*5e7646d2SAndroid Build Coastguard Worker break;
3358*5e7646d2SAndroid Build Coastguard Worker
3359*5e7646d2SAndroid Build Coastguard Worker if (value[valuelen])
3360*5e7646d2SAndroid Build Coastguard Worker {
3361*5e7646d2SAndroid Build Coastguard Worker value[valuelen] = '\0';
3362*5e7646d2SAndroid Build Coastguard Worker valuelen ++;
3363*5e7646d2SAndroid Build Coastguard Worker }
3364*5e7646d2SAndroid Build Coastguard Worker
3365*5e7646d2SAndroid Build Coastguard Worker cupsdAddAlias(ServerAlias, value);
3366*5e7646d2SAndroid Build Coastguard Worker
3367*5e7646d2SAndroid Build Coastguard Worker for (value += valuelen; *value; value ++)
3368*5e7646d2SAndroid Build Coastguard Worker if (!_cups_isspace(*value) || *value != ',')
3369*5e7646d2SAndroid Build Coastguard Worker break;
3370*5e7646d2SAndroid Build Coastguard Worker }
3371*5e7646d2SAndroid Build Coastguard Worker }
3372*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "AccessLog") ||
3373*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "CacheDir") ||
3374*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "ConfigFilePerm") ||
3375*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "DataDir") ||
3376*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "DocumentRoot") ||
3377*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "ErrorLog") ||
3378*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "FatalErrors") ||
3379*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "FileDevice") ||
3380*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "FontPath") ||
3381*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "Group") ||
3382*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "LogFilePerm") ||
3383*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "LPDConfigFile") ||
3384*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "PageLog") ||
3385*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "PassEnv") ||
3386*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "Printcap") ||
3387*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "PrintcapFormat") ||
3388*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "RemoteRoot") ||
3389*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "RequestRoot") ||
3390*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "ServerBin") ||
3391*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "ServerCertificate") ||
3392*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "ServerKey") ||
3393*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "ServerKeychain") ||
3394*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "ServerRoot") ||
3395*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "SetEnv") ||
3396*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "SMBConfigFile") ||
3397*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "StateDir") ||
3398*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "SystemGroup") ||
3399*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "SystemGroupAuthKey") ||
3400*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "TempDir") ||
3401*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "User"))
3402*5e7646d2SAndroid Build Coastguard Worker {
3403*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO,
3404*5e7646d2SAndroid Build Coastguard Worker "Please move \"%s%s%s\" on line %d of %s to the %s file; "
3405*5e7646d2SAndroid Build Coastguard Worker "this will become an error in a future release.",
3406*5e7646d2SAndroid Build Coastguard Worker line, value ? " " : "", value ? value : "", linenum,
3407*5e7646d2SAndroid Build Coastguard Worker ConfigurationFile, CupsFilesFile);
3408*5e7646d2SAndroid Build Coastguard Worker }
3409*5e7646d2SAndroid Build Coastguard Worker else
3410*5e7646d2SAndroid Build Coastguard Worker parse_variable(ConfigurationFile, linenum, line, value,
3411*5e7646d2SAndroid Build Coastguard Worker sizeof(cupsd_vars) / sizeof(cupsd_vars[0]), cupsd_vars);
3412*5e7646d2SAndroid Build Coastguard Worker }
3413*5e7646d2SAndroid Build Coastguard Worker
3414*5e7646d2SAndroid Build Coastguard Worker return (1);
3415*5e7646d2SAndroid Build Coastguard Worker }
3416*5e7646d2SAndroid Build Coastguard Worker
3417*5e7646d2SAndroid Build Coastguard Worker
3418*5e7646d2SAndroid Build Coastguard Worker /*
3419*5e7646d2SAndroid Build Coastguard Worker * 'read_cups_files_conf()' - Read the cups-files.conf configuration file.
3420*5e7646d2SAndroid Build Coastguard Worker */
3421*5e7646d2SAndroid Build Coastguard Worker
3422*5e7646d2SAndroid Build Coastguard Worker static int /* O - 1 on success, 0 on failure */
read_cups_files_conf(cups_file_t * fp)3423*5e7646d2SAndroid Build Coastguard Worker read_cups_files_conf(cups_file_t *fp) /* I - File to read from */
3424*5e7646d2SAndroid Build Coastguard Worker {
3425*5e7646d2SAndroid Build Coastguard Worker int i, /* Looping var */
3426*5e7646d2SAndroid Build Coastguard Worker linenum; /* Current line number */
3427*5e7646d2SAndroid Build Coastguard Worker char line[HTTP_MAX_BUFFER], /* Line from file */
3428*5e7646d2SAndroid Build Coastguard Worker *value; /* Value from line */
3429*5e7646d2SAndroid Build Coastguard Worker struct group *group; /* Group */
3430*5e7646d2SAndroid Build Coastguard Worker static const char * const prohibited_env[] =
3431*5e7646d2SAndroid Build Coastguard Worker { /* Prohibited environment variables */
3432*5e7646d2SAndroid Build Coastguard Worker "APPLE_LANGUAGE",
3433*5e7646d2SAndroid Build Coastguard Worker "AUTH_DOMAIN",
3434*5e7646d2SAndroid Build Coastguard Worker "AUTH_INFO_REQUIRED",
3435*5e7646d2SAndroid Build Coastguard Worker "AUTH_NEGOTIATE",
3436*5e7646d2SAndroid Build Coastguard Worker "AUTH_PASSWORD",
3437*5e7646d2SAndroid Build Coastguard Worker "AUTH_UID",
3438*5e7646d2SAndroid Build Coastguard Worker "AUTH_USERNAME",
3439*5e7646d2SAndroid Build Coastguard Worker "CHARSET",
3440*5e7646d2SAndroid Build Coastguard Worker "CLASS",
3441*5e7646d2SAndroid Build Coastguard Worker "CLASSIFICATION",
3442*5e7646d2SAndroid Build Coastguard Worker "CONTENT_TYPE",
3443*5e7646d2SAndroid Build Coastguard Worker "CUPS_CACHEDIR",
3444*5e7646d2SAndroid Build Coastguard Worker "CUPS_DATADIR",
3445*5e7646d2SAndroid Build Coastguard Worker "CUPS_DOCROOT",
3446*5e7646d2SAndroid Build Coastguard Worker "CUPS_FILETYPE",
3447*5e7646d2SAndroid Build Coastguard Worker "CUPS_FONTPATH",
3448*5e7646d2SAndroid Build Coastguard Worker "CUPS_MAX_MESSAGE",
3449*5e7646d2SAndroid Build Coastguard Worker "CUPS_REQUESTROOT",
3450*5e7646d2SAndroid Build Coastguard Worker "CUPS_SERVERBIN",
3451*5e7646d2SAndroid Build Coastguard Worker "CUPS_SERVERROOT",
3452*5e7646d2SAndroid Build Coastguard Worker "CUPS_STATEDIR",
3453*5e7646d2SAndroid Build Coastguard Worker "DEVICE_URI",
3454*5e7646d2SAndroid Build Coastguard Worker "FINAL_CONTENT_TYPE",
3455*5e7646d2SAndroid Build Coastguard Worker "HOME",
3456*5e7646d2SAndroid Build Coastguard Worker "LANG",
3457*5e7646d2SAndroid Build Coastguard Worker "PPD",
3458*5e7646d2SAndroid Build Coastguard Worker "PRINTER",
3459*5e7646d2SAndroid Build Coastguard Worker "PRINTER_INFO",
3460*5e7646d2SAndroid Build Coastguard Worker "PRINTER_LOCATION",
3461*5e7646d2SAndroid Build Coastguard Worker "PRINTER_STATE_REASONS",
3462*5e7646d2SAndroid Build Coastguard Worker "RIP_CACHE",
3463*5e7646d2SAndroid Build Coastguard Worker "SERVER_ADMIN",
3464*5e7646d2SAndroid Build Coastguard Worker "SOFTWARE",
3465*5e7646d2SAndroid Build Coastguard Worker "TMPDIR",
3466*5e7646d2SAndroid Build Coastguard Worker "USER"
3467*5e7646d2SAndroid Build Coastguard Worker };
3468*5e7646d2SAndroid Build Coastguard Worker
3469*5e7646d2SAndroid Build Coastguard Worker
3470*5e7646d2SAndroid Build Coastguard Worker /*
3471*5e7646d2SAndroid Build Coastguard Worker * Loop through each line in the file...
3472*5e7646d2SAndroid Build Coastguard Worker */
3473*5e7646d2SAndroid Build Coastguard Worker
3474*5e7646d2SAndroid Build Coastguard Worker linenum = 0;
3475*5e7646d2SAndroid Build Coastguard Worker
3476*5e7646d2SAndroid Build Coastguard Worker while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
3477*5e7646d2SAndroid Build Coastguard Worker {
3478*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(line, "FatalErrors"))
3479*5e7646d2SAndroid Build Coastguard Worker FatalErrors = parse_fatal_errors(value);
3480*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "Group") && value)
3481*5e7646d2SAndroid Build Coastguard Worker {
3482*5e7646d2SAndroid Build Coastguard Worker /*
3483*5e7646d2SAndroid Build Coastguard Worker * Group ID to run as...
3484*5e7646d2SAndroid Build Coastguard Worker */
3485*5e7646d2SAndroid Build Coastguard Worker
3486*5e7646d2SAndroid Build Coastguard Worker if (isdigit(value[0]))
3487*5e7646d2SAndroid Build Coastguard Worker Group = (gid_t)atoi(value);
3488*5e7646d2SAndroid Build Coastguard Worker else
3489*5e7646d2SAndroid Build Coastguard Worker {
3490*5e7646d2SAndroid Build Coastguard Worker endgrent();
3491*5e7646d2SAndroid Build Coastguard Worker group = getgrnam(value);
3492*5e7646d2SAndroid Build Coastguard Worker
3493*5e7646d2SAndroid Build Coastguard Worker if (group != NULL)
3494*5e7646d2SAndroid Build Coastguard Worker Group = group->gr_gid;
3495*5e7646d2SAndroid Build Coastguard Worker else
3496*5e7646d2SAndroid Build Coastguard Worker {
3497*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
3498*5e7646d2SAndroid Build Coastguard Worker "Unknown Group \"%s\" on line %d of %s.", value,
3499*5e7646d2SAndroid Build Coastguard Worker linenum, CupsFilesFile);
3500*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3501*5e7646d2SAndroid Build Coastguard Worker return (0);
3502*5e7646d2SAndroid Build Coastguard Worker }
3503*5e7646d2SAndroid Build Coastguard Worker }
3504*5e7646d2SAndroid Build Coastguard Worker }
3505*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "PassEnv") && value)
3506*5e7646d2SAndroid Build Coastguard Worker {
3507*5e7646d2SAndroid Build Coastguard Worker /*
3508*5e7646d2SAndroid Build Coastguard Worker * PassEnv variable [... variable]
3509*5e7646d2SAndroid Build Coastguard Worker */
3510*5e7646d2SAndroid Build Coastguard Worker
3511*5e7646d2SAndroid Build Coastguard Worker int valuelen; /* Length of variable name */
3512*5e7646d2SAndroid Build Coastguard Worker
3513*5e7646d2SAndroid Build Coastguard Worker for (; *value;)
3514*5e7646d2SAndroid Build Coastguard Worker {
3515*5e7646d2SAndroid Build Coastguard Worker for (valuelen = 0; value[valuelen]; valuelen ++)
3516*5e7646d2SAndroid Build Coastguard Worker if (_cups_isspace(value[valuelen]) || value[valuelen] == ',')
3517*5e7646d2SAndroid Build Coastguard Worker break;
3518*5e7646d2SAndroid Build Coastguard Worker
3519*5e7646d2SAndroid Build Coastguard Worker if (value[valuelen])
3520*5e7646d2SAndroid Build Coastguard Worker {
3521*5e7646d2SAndroid Build Coastguard Worker value[valuelen] = '\0';
3522*5e7646d2SAndroid Build Coastguard Worker valuelen ++;
3523*5e7646d2SAndroid Build Coastguard Worker }
3524*5e7646d2SAndroid Build Coastguard Worker
3525*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < (int)(sizeof(prohibited_env) / sizeof(prohibited_env[0])); i ++)
3526*5e7646d2SAndroid Build Coastguard Worker {
3527*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(value, prohibited_env[i]))
3528*5e7646d2SAndroid Build Coastguard Worker {
3529*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Environment variable \"%s\" cannot be passed through on line %d of %s.", value, linenum, CupsFilesFile);
3530*5e7646d2SAndroid Build Coastguard Worker
3531*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3532*5e7646d2SAndroid Build Coastguard Worker return (0);
3533*5e7646d2SAndroid Build Coastguard Worker else
3534*5e7646d2SAndroid Build Coastguard Worker break;
3535*5e7646d2SAndroid Build Coastguard Worker }
3536*5e7646d2SAndroid Build Coastguard Worker }
3537*5e7646d2SAndroid Build Coastguard Worker
3538*5e7646d2SAndroid Build Coastguard Worker if (i >= (int)(sizeof(prohibited_env) / sizeof(prohibited_env[0])))
3539*5e7646d2SAndroid Build Coastguard Worker cupsdSetEnv(value, NULL);
3540*5e7646d2SAndroid Build Coastguard Worker
3541*5e7646d2SAndroid Build Coastguard Worker for (value += valuelen; *value; value ++)
3542*5e7646d2SAndroid Build Coastguard Worker if (!_cups_isspace(*value) || *value != ',')
3543*5e7646d2SAndroid Build Coastguard Worker break;
3544*5e7646d2SAndroid Build Coastguard Worker }
3545*5e7646d2SAndroid Build Coastguard Worker }
3546*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "PrintcapFormat") && value)
3547*5e7646d2SAndroid Build Coastguard Worker {
3548*5e7646d2SAndroid Build Coastguard Worker /*
3549*5e7646d2SAndroid Build Coastguard Worker * Format of printcap file?
3550*5e7646d2SAndroid Build Coastguard Worker */
3551*5e7646d2SAndroid Build Coastguard Worker
3552*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "bsd"))
3553*5e7646d2SAndroid Build Coastguard Worker PrintcapFormat = PRINTCAP_BSD;
3554*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "plist"))
3555*5e7646d2SAndroid Build Coastguard Worker PrintcapFormat = PRINTCAP_PLIST;
3556*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "solaris"))
3557*5e7646d2SAndroid Build Coastguard Worker PrintcapFormat = PRINTCAP_SOLARIS;
3558*5e7646d2SAndroid Build Coastguard Worker else
3559*5e7646d2SAndroid Build Coastguard Worker {
3560*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
3561*5e7646d2SAndroid Build Coastguard Worker "Unknown PrintcapFormat \"%s\" on line %d of %s.",
3562*5e7646d2SAndroid Build Coastguard Worker value, linenum, CupsFilesFile);
3563*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3564*5e7646d2SAndroid Build Coastguard Worker return (0);
3565*5e7646d2SAndroid Build Coastguard Worker }
3566*5e7646d2SAndroid Build Coastguard Worker }
3567*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "Sandboxing") && value)
3568*5e7646d2SAndroid Build Coastguard Worker {
3569*5e7646d2SAndroid Build Coastguard Worker /*
3570*5e7646d2SAndroid Build Coastguard Worker * Level of sandboxing?
3571*5e7646d2SAndroid Build Coastguard Worker */
3572*5e7646d2SAndroid Build Coastguard Worker
3573*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "off") && getuid())
3574*5e7646d2SAndroid Build Coastguard Worker Sandboxing = CUPSD_SANDBOXING_OFF;
3575*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "relaxed"))
3576*5e7646d2SAndroid Build Coastguard Worker Sandboxing = CUPSD_SANDBOXING_RELAXED;
3577*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "strict"))
3578*5e7646d2SAndroid Build Coastguard Worker Sandboxing = CUPSD_SANDBOXING_STRICT;
3579*5e7646d2SAndroid Build Coastguard Worker else
3580*5e7646d2SAndroid Build Coastguard Worker {
3581*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
3582*5e7646d2SAndroid Build Coastguard Worker "Unknown Sandboxing \"%s\" on line %d of %s.",
3583*5e7646d2SAndroid Build Coastguard Worker value, linenum, CupsFilesFile);
3584*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3585*5e7646d2SAndroid Build Coastguard Worker return (0);
3586*5e7646d2SAndroid Build Coastguard Worker }
3587*5e7646d2SAndroid Build Coastguard Worker }
3588*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "SetEnv") && value)
3589*5e7646d2SAndroid Build Coastguard Worker {
3590*5e7646d2SAndroid Build Coastguard Worker /*
3591*5e7646d2SAndroid Build Coastguard Worker * SetEnv variable value
3592*5e7646d2SAndroid Build Coastguard Worker */
3593*5e7646d2SAndroid Build Coastguard Worker
3594*5e7646d2SAndroid Build Coastguard Worker char *valueptr; /* Pointer to environment variable value */
3595*5e7646d2SAndroid Build Coastguard Worker
3596*5e7646d2SAndroid Build Coastguard Worker for (valueptr = value; *valueptr && !isspace(*valueptr & 255); valueptr ++);
3597*5e7646d2SAndroid Build Coastguard Worker
3598*5e7646d2SAndroid Build Coastguard Worker if (*valueptr)
3599*5e7646d2SAndroid Build Coastguard Worker {
3600*5e7646d2SAndroid Build Coastguard Worker /*
3601*5e7646d2SAndroid Build Coastguard Worker * Found a value...
3602*5e7646d2SAndroid Build Coastguard Worker */
3603*5e7646d2SAndroid Build Coastguard Worker
3604*5e7646d2SAndroid Build Coastguard Worker while (isspace(*valueptr & 255))
3605*5e7646d2SAndroid Build Coastguard Worker *valueptr++ = '\0';
3606*5e7646d2SAndroid Build Coastguard Worker
3607*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < (int)(sizeof(prohibited_env) / sizeof(prohibited_env[0])); i ++)
3608*5e7646d2SAndroid Build Coastguard Worker {
3609*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(value, prohibited_env[i]))
3610*5e7646d2SAndroid Build Coastguard Worker {
3611*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Environment variable \"%s\" cannot be set on line %d of %s.", value, linenum, CupsFilesFile);
3612*5e7646d2SAndroid Build Coastguard Worker
3613*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3614*5e7646d2SAndroid Build Coastguard Worker return (0);
3615*5e7646d2SAndroid Build Coastguard Worker else
3616*5e7646d2SAndroid Build Coastguard Worker break;
3617*5e7646d2SAndroid Build Coastguard Worker }
3618*5e7646d2SAndroid Build Coastguard Worker }
3619*5e7646d2SAndroid Build Coastguard Worker
3620*5e7646d2SAndroid Build Coastguard Worker if (i >= (int)(sizeof(prohibited_env) / sizeof(prohibited_env[0])))
3621*5e7646d2SAndroid Build Coastguard Worker cupsdSetEnv(value, valueptr);
3622*5e7646d2SAndroid Build Coastguard Worker }
3623*5e7646d2SAndroid Build Coastguard Worker else
3624*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
3625*5e7646d2SAndroid Build Coastguard Worker "Missing value for SetEnv directive on line %d of %s.",
3626*5e7646d2SAndroid Build Coastguard Worker linenum, ConfigurationFile);
3627*5e7646d2SAndroid Build Coastguard Worker }
3628*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "SystemGroup") && value)
3629*5e7646d2SAndroid Build Coastguard Worker {
3630*5e7646d2SAndroid Build Coastguard Worker /*
3631*5e7646d2SAndroid Build Coastguard Worker * SystemGroup (admin) group(s)...
3632*5e7646d2SAndroid Build Coastguard Worker */
3633*5e7646d2SAndroid Build Coastguard Worker
3634*5e7646d2SAndroid Build Coastguard Worker if (!parse_groups(value, linenum))
3635*5e7646d2SAndroid Build Coastguard Worker {
3636*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3637*5e7646d2SAndroid Build Coastguard Worker return (0);
3638*5e7646d2SAndroid Build Coastguard Worker }
3639*5e7646d2SAndroid Build Coastguard Worker }
3640*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "User") && value)
3641*5e7646d2SAndroid Build Coastguard Worker {
3642*5e7646d2SAndroid Build Coastguard Worker /*
3643*5e7646d2SAndroid Build Coastguard Worker * User ID to run as...
3644*5e7646d2SAndroid Build Coastguard Worker */
3645*5e7646d2SAndroid Build Coastguard Worker
3646*5e7646d2SAndroid Build Coastguard Worker if (isdigit(value[0] & 255))
3647*5e7646d2SAndroid Build Coastguard Worker {
3648*5e7646d2SAndroid Build Coastguard Worker int uid = atoi(value);
3649*5e7646d2SAndroid Build Coastguard Worker
3650*5e7646d2SAndroid Build Coastguard Worker if (!uid)
3651*5e7646d2SAndroid Build Coastguard Worker {
3652*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
3653*5e7646d2SAndroid Build Coastguard Worker "Will not use User 0 as specified on line %d of %s "
3654*5e7646d2SAndroid Build Coastguard Worker "for security reasons. You must use a non-"
3655*5e7646d2SAndroid Build Coastguard Worker "privileged account instead.",
3656*5e7646d2SAndroid Build Coastguard Worker linenum, CupsFilesFile);
3657*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3658*5e7646d2SAndroid Build Coastguard Worker return (0);
3659*5e7646d2SAndroid Build Coastguard Worker }
3660*5e7646d2SAndroid Build Coastguard Worker else
3661*5e7646d2SAndroid Build Coastguard Worker User = (uid_t)atoi(value);
3662*5e7646d2SAndroid Build Coastguard Worker }
3663*5e7646d2SAndroid Build Coastguard Worker else
3664*5e7646d2SAndroid Build Coastguard Worker {
3665*5e7646d2SAndroid Build Coastguard Worker struct passwd *p; /* Password information */
3666*5e7646d2SAndroid Build Coastguard Worker
3667*5e7646d2SAndroid Build Coastguard Worker endpwent();
3668*5e7646d2SAndroid Build Coastguard Worker p = getpwnam(value);
3669*5e7646d2SAndroid Build Coastguard Worker
3670*5e7646d2SAndroid Build Coastguard Worker if (p)
3671*5e7646d2SAndroid Build Coastguard Worker {
3672*5e7646d2SAndroid Build Coastguard Worker if (!p->pw_uid)
3673*5e7646d2SAndroid Build Coastguard Worker {
3674*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
3675*5e7646d2SAndroid Build Coastguard Worker "Will not use User %s (UID=0) as specified on line "
3676*5e7646d2SAndroid Build Coastguard Worker "%d of %s for security reasons. You must use a "
3677*5e7646d2SAndroid Build Coastguard Worker "non-privileged account instead.",
3678*5e7646d2SAndroid Build Coastguard Worker value, linenum, CupsFilesFile);
3679*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3680*5e7646d2SAndroid Build Coastguard Worker return (0);
3681*5e7646d2SAndroid Build Coastguard Worker }
3682*5e7646d2SAndroid Build Coastguard Worker else
3683*5e7646d2SAndroid Build Coastguard Worker User = p->pw_uid;
3684*5e7646d2SAndroid Build Coastguard Worker }
3685*5e7646d2SAndroid Build Coastguard Worker else
3686*5e7646d2SAndroid Build Coastguard Worker {
3687*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
3688*5e7646d2SAndroid Build Coastguard Worker "Unknown User \"%s\" on line %d of %s.",
3689*5e7646d2SAndroid Build Coastguard Worker value, linenum, CupsFilesFile);
3690*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3691*5e7646d2SAndroid Build Coastguard Worker return (0);
3692*5e7646d2SAndroid Build Coastguard Worker }
3693*5e7646d2SAndroid Build Coastguard Worker }
3694*5e7646d2SAndroid Build Coastguard Worker }
3695*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "ServerCertificate") ||
3696*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "ServerKey"))
3697*5e7646d2SAndroid Build Coastguard Worker {
3698*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_INFO,
3699*5e7646d2SAndroid Build Coastguard Worker "The \"%s\" directive on line %d of %s is no longer "
3700*5e7646d2SAndroid Build Coastguard Worker "supported; this will become an error in a future "
3701*5e7646d2SAndroid Build Coastguard Worker "release.",
3702*5e7646d2SAndroid Build Coastguard Worker line, linenum, CupsFilesFile);
3703*5e7646d2SAndroid Build Coastguard Worker }
3704*5e7646d2SAndroid Build Coastguard Worker else if (!parse_variable(CupsFilesFile, linenum, line, value,
3705*5e7646d2SAndroid Build Coastguard Worker sizeof(cupsfiles_vars) / sizeof(cupsfiles_vars[0]),
3706*5e7646d2SAndroid Build Coastguard Worker cupsfiles_vars) &&
3707*5e7646d2SAndroid Build Coastguard Worker (FatalErrors & CUPSD_FATAL_CONFIG))
3708*5e7646d2SAndroid Build Coastguard Worker return (0);
3709*5e7646d2SAndroid Build Coastguard Worker }
3710*5e7646d2SAndroid Build Coastguard Worker
3711*5e7646d2SAndroid Build Coastguard Worker return (1);
3712*5e7646d2SAndroid Build Coastguard Worker }
3713*5e7646d2SAndroid Build Coastguard Worker
3714*5e7646d2SAndroid Build Coastguard Worker
3715*5e7646d2SAndroid Build Coastguard Worker /*
3716*5e7646d2SAndroid Build Coastguard Worker * 'read_location()' - Read a <Location path> definition.
3717*5e7646d2SAndroid Build Coastguard Worker */
3718*5e7646d2SAndroid Build Coastguard Worker
3719*5e7646d2SAndroid Build Coastguard Worker static int /* O - New line number or 0 on error */
read_location(cups_file_t * fp,char * location,int linenum)3720*5e7646d2SAndroid Build Coastguard Worker read_location(cups_file_t *fp, /* I - Configuration file */
3721*5e7646d2SAndroid Build Coastguard Worker char *location, /* I - Location name/path */
3722*5e7646d2SAndroid Build Coastguard Worker int linenum) /* I - Current line number */
3723*5e7646d2SAndroid Build Coastguard Worker {
3724*5e7646d2SAndroid Build Coastguard Worker cupsd_location_t *loc, /* New location */
3725*5e7646d2SAndroid Build Coastguard Worker *parent; /* Parent location */
3726*5e7646d2SAndroid Build Coastguard Worker char line[HTTP_MAX_BUFFER],
3727*5e7646d2SAndroid Build Coastguard Worker /* Line buffer */
3728*5e7646d2SAndroid Build Coastguard Worker *value, /* Value for directive */
3729*5e7646d2SAndroid Build Coastguard Worker *valptr; /* Pointer into value */
3730*5e7646d2SAndroid Build Coastguard Worker
3731*5e7646d2SAndroid Build Coastguard Worker
3732*5e7646d2SAndroid Build Coastguard Worker if ((parent = cupsdFindLocation(location)) != NULL)
3733*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "Duplicate <Location %s> on line %d of %s.",
3734*5e7646d2SAndroid Build Coastguard Worker location, linenum, ConfigurationFile);
3735*5e7646d2SAndroid Build Coastguard Worker else if ((parent = cupsdNewLocation(location)) == NULL)
3736*5e7646d2SAndroid Build Coastguard Worker return (0);
3737*5e7646d2SAndroid Build Coastguard Worker else
3738*5e7646d2SAndroid Build Coastguard Worker {
3739*5e7646d2SAndroid Build Coastguard Worker cupsdAddLocation(parent);
3740*5e7646d2SAndroid Build Coastguard Worker
3741*5e7646d2SAndroid Build Coastguard Worker parent->limit = CUPSD_AUTH_LIMIT_ALL;
3742*5e7646d2SAndroid Build Coastguard Worker }
3743*5e7646d2SAndroid Build Coastguard Worker
3744*5e7646d2SAndroid Build Coastguard Worker loc = parent;
3745*5e7646d2SAndroid Build Coastguard Worker
3746*5e7646d2SAndroid Build Coastguard Worker while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
3747*5e7646d2SAndroid Build Coastguard Worker {
3748*5e7646d2SAndroid Build Coastguard Worker /*
3749*5e7646d2SAndroid Build Coastguard Worker * Decode the directive...
3750*5e7646d2SAndroid Build Coastguard Worker */
3751*5e7646d2SAndroid Build Coastguard Worker
3752*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(line, "</Location>"))
3753*5e7646d2SAndroid Build Coastguard Worker return (linenum);
3754*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "<Limit") ||
3755*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "<LimitExcept"))
3756*5e7646d2SAndroid Build Coastguard Worker {
3757*5e7646d2SAndroid Build Coastguard Worker if (!value)
3758*5e7646d2SAndroid Build Coastguard Worker {
3759*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Syntax error on line %d of %s.", linenum, ConfigurationFile);
3760*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3761*5e7646d2SAndroid Build Coastguard Worker return (0);
3762*5e7646d2SAndroid Build Coastguard Worker else
3763*5e7646d2SAndroid Build Coastguard Worker continue;
3764*5e7646d2SAndroid Build Coastguard Worker }
3765*5e7646d2SAndroid Build Coastguard Worker
3766*5e7646d2SAndroid Build Coastguard Worker if ((loc = cupsdCopyLocation(parent)) == NULL)
3767*5e7646d2SAndroid Build Coastguard Worker return (0);
3768*5e7646d2SAndroid Build Coastguard Worker
3769*5e7646d2SAndroid Build Coastguard Worker cupsdAddLocation(loc);
3770*5e7646d2SAndroid Build Coastguard Worker
3771*5e7646d2SAndroid Build Coastguard Worker loc->limit = 0;
3772*5e7646d2SAndroid Build Coastguard Worker while (*value)
3773*5e7646d2SAndroid Build Coastguard Worker {
3774*5e7646d2SAndroid Build Coastguard Worker for (valptr = value; !isspace(*valptr & 255) && *valptr; valptr ++);
3775*5e7646d2SAndroid Build Coastguard Worker
3776*5e7646d2SAndroid Build Coastguard Worker if (*valptr)
3777*5e7646d2SAndroid Build Coastguard Worker *valptr++ = '\0';
3778*5e7646d2SAndroid Build Coastguard Worker
3779*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(value, "ALL"))
3780*5e7646d2SAndroid Build Coastguard Worker loc->limit = CUPSD_AUTH_LIMIT_ALL;
3781*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(value, "GET"))
3782*5e7646d2SAndroid Build Coastguard Worker loc->limit |= CUPSD_AUTH_LIMIT_GET;
3783*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(value, "HEAD"))
3784*5e7646d2SAndroid Build Coastguard Worker loc->limit |= CUPSD_AUTH_LIMIT_HEAD;
3785*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(value, "OPTIONS"))
3786*5e7646d2SAndroid Build Coastguard Worker loc->limit |= CUPSD_AUTH_LIMIT_OPTIONS;
3787*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(value, "POST"))
3788*5e7646d2SAndroid Build Coastguard Worker loc->limit |= CUPSD_AUTH_LIMIT_POST;
3789*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(value, "PUT"))
3790*5e7646d2SAndroid Build Coastguard Worker loc->limit |= CUPSD_AUTH_LIMIT_PUT;
3791*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(value, "TRACE"))
3792*5e7646d2SAndroid Build Coastguard Worker loc->limit |= CUPSD_AUTH_LIMIT_TRACE;
3793*5e7646d2SAndroid Build Coastguard Worker else
3794*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "Unknown request type %s on line %d of %s.",
3795*5e7646d2SAndroid Build Coastguard Worker value, linenum, ConfigurationFile);
3796*5e7646d2SAndroid Build Coastguard Worker
3797*5e7646d2SAndroid Build Coastguard Worker for (value = valptr; isspace(*value & 255); value ++);
3798*5e7646d2SAndroid Build Coastguard Worker }
3799*5e7646d2SAndroid Build Coastguard Worker
3800*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(line, "<LimitExcept"))
3801*5e7646d2SAndroid Build Coastguard Worker loc->limit = CUPSD_AUTH_LIMIT_ALL ^ loc->limit;
3802*5e7646d2SAndroid Build Coastguard Worker
3803*5e7646d2SAndroid Build Coastguard Worker parent->limit &= ~loc->limit;
3804*5e7646d2SAndroid Build Coastguard Worker }
3805*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "</Limit>") ||
3806*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "</LimitExcept>"))
3807*5e7646d2SAndroid Build Coastguard Worker loc = parent;
3808*5e7646d2SAndroid Build Coastguard Worker else if (!value)
3809*5e7646d2SAndroid Build Coastguard Worker {
3810*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d of %s.", linenum, ConfigurationFile);
3811*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3812*5e7646d2SAndroid Build Coastguard Worker return (0);
3813*5e7646d2SAndroid Build Coastguard Worker }
3814*5e7646d2SAndroid Build Coastguard Worker else if (!parse_aaa(loc, line, value, linenum))
3815*5e7646d2SAndroid Build Coastguard Worker {
3816*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
3817*5e7646d2SAndroid Build Coastguard Worker "Unknown Location directive %s on line %d of %s.",
3818*5e7646d2SAndroid Build Coastguard Worker line, linenum, ConfigurationFile);
3819*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3820*5e7646d2SAndroid Build Coastguard Worker return (0);
3821*5e7646d2SAndroid Build Coastguard Worker }
3822*5e7646d2SAndroid Build Coastguard Worker }
3823*5e7646d2SAndroid Build Coastguard Worker
3824*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
3825*5e7646d2SAndroid Build Coastguard Worker "Unexpected end-of-file at line %d while reading location.",
3826*5e7646d2SAndroid Build Coastguard Worker linenum);
3827*5e7646d2SAndroid Build Coastguard Worker
3828*5e7646d2SAndroid Build Coastguard Worker return ((FatalErrors & CUPSD_FATAL_CONFIG) ? 0 : linenum);
3829*5e7646d2SAndroid Build Coastguard Worker }
3830*5e7646d2SAndroid Build Coastguard Worker
3831*5e7646d2SAndroid Build Coastguard Worker
3832*5e7646d2SAndroid Build Coastguard Worker /*
3833*5e7646d2SAndroid Build Coastguard Worker * 'read_policy()' - Read a <Policy name> definition.
3834*5e7646d2SAndroid Build Coastguard Worker */
3835*5e7646d2SAndroid Build Coastguard Worker
3836*5e7646d2SAndroid Build Coastguard Worker static int /* O - New line number or 0 on error */
read_policy(cups_file_t * fp,char * policy,int linenum)3837*5e7646d2SAndroid Build Coastguard Worker read_policy(cups_file_t *fp, /* I - Configuration file */
3838*5e7646d2SAndroid Build Coastguard Worker char *policy, /* I - Location name/path */
3839*5e7646d2SAndroid Build Coastguard Worker int linenum) /* I - Current line number */
3840*5e7646d2SAndroid Build Coastguard Worker {
3841*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
3842*5e7646d2SAndroid Build Coastguard Worker cupsd_policy_t *pol; /* Policy */
3843*5e7646d2SAndroid Build Coastguard Worker cupsd_location_t *op; /* Policy operation */
3844*5e7646d2SAndroid Build Coastguard Worker int num_ops; /* Number of IPP operations */
3845*5e7646d2SAndroid Build Coastguard Worker ipp_op_t ops[100]; /* Operations */
3846*5e7646d2SAndroid Build Coastguard Worker char line[HTTP_MAX_BUFFER],
3847*5e7646d2SAndroid Build Coastguard Worker /* Line buffer */
3848*5e7646d2SAndroid Build Coastguard Worker *value, /* Value for directive */
3849*5e7646d2SAndroid Build Coastguard Worker *valptr; /* Pointer into value */
3850*5e7646d2SAndroid Build Coastguard Worker
3851*5e7646d2SAndroid Build Coastguard Worker
3852*5e7646d2SAndroid Build Coastguard Worker /*
3853*5e7646d2SAndroid Build Coastguard Worker * Create the policy...
3854*5e7646d2SAndroid Build Coastguard Worker */
3855*5e7646d2SAndroid Build Coastguard Worker
3856*5e7646d2SAndroid Build Coastguard Worker if ((pol = cupsdFindPolicy(policy)) != NULL)
3857*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "Duplicate <Policy %s> on line %d of %s.",
3858*5e7646d2SAndroid Build Coastguard Worker policy, linenum, ConfigurationFile);
3859*5e7646d2SAndroid Build Coastguard Worker else if ((pol = cupsdAddPolicy(policy)) == NULL)
3860*5e7646d2SAndroid Build Coastguard Worker return (0);
3861*5e7646d2SAndroid Build Coastguard Worker
3862*5e7646d2SAndroid Build Coastguard Worker /*
3863*5e7646d2SAndroid Build Coastguard Worker * Read from the file...
3864*5e7646d2SAndroid Build Coastguard Worker */
3865*5e7646d2SAndroid Build Coastguard Worker
3866*5e7646d2SAndroid Build Coastguard Worker op = NULL;
3867*5e7646d2SAndroid Build Coastguard Worker num_ops = 0;
3868*5e7646d2SAndroid Build Coastguard Worker
3869*5e7646d2SAndroid Build Coastguard Worker while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
3870*5e7646d2SAndroid Build Coastguard Worker {
3871*5e7646d2SAndroid Build Coastguard Worker /*
3872*5e7646d2SAndroid Build Coastguard Worker * Decode the directive...
3873*5e7646d2SAndroid Build Coastguard Worker */
3874*5e7646d2SAndroid Build Coastguard Worker
3875*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(line, "</Policy>"))
3876*5e7646d2SAndroid Build Coastguard Worker {
3877*5e7646d2SAndroid Build Coastguard Worker if (op)
3878*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN,
3879*5e7646d2SAndroid Build Coastguard Worker "Missing </Limit> before </Policy> on line %d of %s.",
3880*5e7646d2SAndroid Build Coastguard Worker linenum, ConfigurationFile);
3881*5e7646d2SAndroid Build Coastguard Worker
3882*5e7646d2SAndroid Build Coastguard Worker set_policy_defaults(pol);
3883*5e7646d2SAndroid Build Coastguard Worker
3884*5e7646d2SAndroid Build Coastguard Worker return (linenum);
3885*5e7646d2SAndroid Build Coastguard Worker }
3886*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "<Limit") && !op)
3887*5e7646d2SAndroid Build Coastguard Worker {
3888*5e7646d2SAndroid Build Coastguard Worker if (!value)
3889*5e7646d2SAndroid Build Coastguard Worker {
3890*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Syntax error on line %d of %s.", linenum, ConfigurationFile);
3891*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3892*5e7646d2SAndroid Build Coastguard Worker return (0);
3893*5e7646d2SAndroid Build Coastguard Worker else
3894*5e7646d2SAndroid Build Coastguard Worker continue;
3895*5e7646d2SAndroid Build Coastguard Worker }
3896*5e7646d2SAndroid Build Coastguard Worker
3897*5e7646d2SAndroid Build Coastguard Worker /*
3898*5e7646d2SAndroid Build Coastguard Worker * Scan for IPP operation names...
3899*5e7646d2SAndroid Build Coastguard Worker */
3900*5e7646d2SAndroid Build Coastguard Worker
3901*5e7646d2SAndroid Build Coastguard Worker num_ops = 0;
3902*5e7646d2SAndroid Build Coastguard Worker
3903*5e7646d2SAndroid Build Coastguard Worker while (*value)
3904*5e7646d2SAndroid Build Coastguard Worker {
3905*5e7646d2SAndroid Build Coastguard Worker for (valptr = value; !isspace(*valptr & 255) && *valptr; valptr ++);
3906*5e7646d2SAndroid Build Coastguard Worker
3907*5e7646d2SAndroid Build Coastguard Worker if (*valptr)
3908*5e7646d2SAndroid Build Coastguard Worker *valptr++ = '\0';
3909*5e7646d2SAndroid Build Coastguard Worker
3910*5e7646d2SAndroid Build Coastguard Worker if (num_ops < (int)(sizeof(ops) / sizeof(ops[0])))
3911*5e7646d2SAndroid Build Coastguard Worker {
3912*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "All"))
3913*5e7646d2SAndroid Build Coastguard Worker ops[num_ops ++] = IPP_ANY_OPERATION;
3914*5e7646d2SAndroid Build Coastguard Worker else if ((ops[num_ops] = ippOpValue(value)) == IPP_BAD_OPERATION)
3915*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Bad IPP operation name \"%s\" on line %d of %s.", value, linenum, ConfigurationFile);
3916*5e7646d2SAndroid Build Coastguard Worker else
3917*5e7646d2SAndroid Build Coastguard Worker num_ops ++;
3918*5e7646d2SAndroid Build Coastguard Worker }
3919*5e7646d2SAndroid Build Coastguard Worker else
3920*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
3921*5e7646d2SAndroid Build Coastguard Worker "Too many operations listed on line %d of %s.",
3922*5e7646d2SAndroid Build Coastguard Worker linenum, ConfigurationFile);
3923*5e7646d2SAndroid Build Coastguard Worker
3924*5e7646d2SAndroid Build Coastguard Worker for (value = valptr; isspace(*value & 255); value ++);
3925*5e7646d2SAndroid Build Coastguard Worker }
3926*5e7646d2SAndroid Build Coastguard Worker
3927*5e7646d2SAndroid Build Coastguard Worker /*
3928*5e7646d2SAndroid Build Coastguard Worker * If none are specified, apply the policy to all operations...
3929*5e7646d2SAndroid Build Coastguard Worker */
3930*5e7646d2SAndroid Build Coastguard Worker
3931*5e7646d2SAndroid Build Coastguard Worker if (num_ops == 0)
3932*5e7646d2SAndroid Build Coastguard Worker {
3933*5e7646d2SAndroid Build Coastguard Worker ops[0] = IPP_ANY_OPERATION;
3934*5e7646d2SAndroid Build Coastguard Worker num_ops = 1;
3935*5e7646d2SAndroid Build Coastguard Worker }
3936*5e7646d2SAndroid Build Coastguard Worker
3937*5e7646d2SAndroid Build Coastguard Worker /*
3938*5e7646d2SAndroid Build Coastguard Worker * Add a new policy for the first operation...
3939*5e7646d2SAndroid Build Coastguard Worker */
3940*5e7646d2SAndroid Build Coastguard Worker
3941*5e7646d2SAndroid Build Coastguard Worker op = cupsdAddPolicyOp(pol, NULL, ops[0]);
3942*5e7646d2SAndroid Build Coastguard Worker }
3943*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "</Limit>") && op)
3944*5e7646d2SAndroid Build Coastguard Worker {
3945*5e7646d2SAndroid Build Coastguard Worker /*
3946*5e7646d2SAndroid Build Coastguard Worker * Finish the current operation limit...
3947*5e7646d2SAndroid Build Coastguard Worker */
3948*5e7646d2SAndroid Build Coastguard Worker
3949*5e7646d2SAndroid Build Coastguard Worker if (num_ops > 1)
3950*5e7646d2SAndroid Build Coastguard Worker {
3951*5e7646d2SAndroid Build Coastguard Worker /*
3952*5e7646d2SAndroid Build Coastguard Worker * Copy the policy to the other operations...
3953*5e7646d2SAndroid Build Coastguard Worker */
3954*5e7646d2SAndroid Build Coastguard Worker
3955*5e7646d2SAndroid Build Coastguard Worker for (i = 1; i < num_ops; i ++)
3956*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(pol, op, ops[i]);
3957*5e7646d2SAndroid Build Coastguard Worker }
3958*5e7646d2SAndroid Build Coastguard Worker
3959*5e7646d2SAndroid Build Coastguard Worker op = NULL;
3960*5e7646d2SAndroid Build Coastguard Worker }
3961*5e7646d2SAndroid Build Coastguard Worker else if (!value)
3962*5e7646d2SAndroid Build Coastguard Worker {
3963*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d of %s.", linenum, ConfigurationFile);
3964*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3965*5e7646d2SAndroid Build Coastguard Worker return (0);
3966*5e7646d2SAndroid Build Coastguard Worker }
3967*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "JobPrivateAccess") ||
3968*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "JobPrivateValues") ||
3969*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "SubscriptionPrivateAccess") ||
3970*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "SubscriptionPrivateValues"))
3971*5e7646d2SAndroid Build Coastguard Worker {
3972*5e7646d2SAndroid Build Coastguard Worker if (op)
3973*5e7646d2SAndroid Build Coastguard Worker {
3974*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
3975*5e7646d2SAndroid Build Coastguard Worker "%s directive must appear outside <Limit>...</Limit> "
3976*5e7646d2SAndroid Build Coastguard Worker "on line %d of %s.", line, linenum, ConfigurationFile);
3977*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
3978*5e7646d2SAndroid Build Coastguard Worker return (0);
3979*5e7646d2SAndroid Build Coastguard Worker }
3980*5e7646d2SAndroid Build Coastguard Worker else
3981*5e7646d2SAndroid Build Coastguard Worker {
3982*5e7646d2SAndroid Build Coastguard Worker /*
3983*5e7646d2SAndroid Build Coastguard Worker * Pull out whitespace-delimited values...
3984*5e7646d2SAndroid Build Coastguard Worker */
3985*5e7646d2SAndroid Build Coastguard Worker
3986*5e7646d2SAndroid Build Coastguard Worker while (*value)
3987*5e7646d2SAndroid Build Coastguard Worker {
3988*5e7646d2SAndroid Build Coastguard Worker /*
3989*5e7646d2SAndroid Build Coastguard Worker * Find the end of the current value...
3990*5e7646d2SAndroid Build Coastguard Worker */
3991*5e7646d2SAndroid Build Coastguard Worker
3992*5e7646d2SAndroid Build Coastguard Worker for (valptr = value; !isspace(*valptr & 255) && *valptr; valptr ++);
3993*5e7646d2SAndroid Build Coastguard Worker
3994*5e7646d2SAndroid Build Coastguard Worker if (*valptr)
3995*5e7646d2SAndroid Build Coastguard Worker *valptr++ = '\0';
3996*5e7646d2SAndroid Build Coastguard Worker
3997*5e7646d2SAndroid Build Coastguard Worker /*
3998*5e7646d2SAndroid Build Coastguard Worker * Save it appropriately...
3999*5e7646d2SAndroid Build Coastguard Worker */
4000*5e7646d2SAndroid Build Coastguard Worker
4001*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(line, "JobPrivateAccess"))
4002*5e7646d2SAndroid Build Coastguard Worker {
4003*5e7646d2SAndroid Build Coastguard Worker /*
4004*5e7646d2SAndroid Build Coastguard Worker * JobPrivateAccess {all|default|user/group list|@@ACL}
4005*5e7646d2SAndroid Build Coastguard Worker */
4006*5e7646d2SAndroid Build Coastguard Worker
4007*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "default"))
4008*5e7646d2SAndroid Build Coastguard Worker {
4009*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->job_access), "@OWNER");
4010*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->job_access), "@SYSTEM");
4011*5e7646d2SAndroid Build Coastguard Worker }
4012*5e7646d2SAndroid Build Coastguard Worker else
4013*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->job_access), value);
4014*5e7646d2SAndroid Build Coastguard Worker }
4015*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "JobPrivateValues"))
4016*5e7646d2SAndroid Build Coastguard Worker {
4017*5e7646d2SAndroid Build Coastguard Worker /*
4018*5e7646d2SAndroid Build Coastguard Worker * JobPrivateValues {all|none|default|attribute list}
4019*5e7646d2SAndroid Build Coastguard Worker */
4020*5e7646d2SAndroid Build Coastguard Worker
4021*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "default"))
4022*5e7646d2SAndroid Build Coastguard Worker {
4023*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->job_attrs), "job-name");
4024*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->job_attrs), "job-originating-host-name");
4025*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->job_attrs), "job-originating-user-name");
4026*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->job_attrs), "phone");
4027*5e7646d2SAndroid Build Coastguard Worker }
4028*5e7646d2SAndroid Build Coastguard Worker else
4029*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->job_attrs), value);
4030*5e7646d2SAndroid Build Coastguard Worker }
4031*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "SubscriptionPrivateAccess"))
4032*5e7646d2SAndroid Build Coastguard Worker {
4033*5e7646d2SAndroid Build Coastguard Worker /*
4034*5e7646d2SAndroid Build Coastguard Worker * SubscriptionPrivateAccess {all|default|user/group list|@@ACL}
4035*5e7646d2SAndroid Build Coastguard Worker */
4036*5e7646d2SAndroid Build Coastguard Worker
4037*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "default"))
4038*5e7646d2SAndroid Build Coastguard Worker {
4039*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->sub_access), "@OWNER");
4040*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->sub_access), "@SYSTEM");
4041*5e7646d2SAndroid Build Coastguard Worker }
4042*5e7646d2SAndroid Build Coastguard Worker else
4043*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->sub_access), value);
4044*5e7646d2SAndroid Build Coastguard Worker }
4045*5e7646d2SAndroid Build Coastguard Worker else /* if (!_cups_strcasecmp(line, "SubscriptionPrivateValues")) */
4046*5e7646d2SAndroid Build Coastguard Worker {
4047*5e7646d2SAndroid Build Coastguard Worker /*
4048*5e7646d2SAndroid Build Coastguard Worker * SubscriptionPrivateValues {all|none|default|attribute list}
4049*5e7646d2SAndroid Build Coastguard Worker */
4050*5e7646d2SAndroid Build Coastguard Worker
4051*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "default"))
4052*5e7646d2SAndroid Build Coastguard Worker {
4053*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->sub_attrs), "notify-events");
4054*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->sub_attrs), "notify-pull-method");
4055*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->sub_attrs), "notify-recipient-uri");
4056*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->sub_attrs), "notify-subscriber-user-name");
4057*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->sub_attrs), "notify-user-data");
4058*5e7646d2SAndroid Build Coastguard Worker }
4059*5e7646d2SAndroid Build Coastguard Worker else
4060*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->sub_attrs), value);
4061*5e7646d2SAndroid Build Coastguard Worker }
4062*5e7646d2SAndroid Build Coastguard Worker
4063*5e7646d2SAndroid Build Coastguard Worker /*
4064*5e7646d2SAndroid Build Coastguard Worker * Find the next string on the line...
4065*5e7646d2SAndroid Build Coastguard Worker */
4066*5e7646d2SAndroid Build Coastguard Worker
4067*5e7646d2SAndroid Build Coastguard Worker for (value = valptr; isspace(*value & 255); value ++);
4068*5e7646d2SAndroid Build Coastguard Worker }
4069*5e7646d2SAndroid Build Coastguard Worker }
4070*5e7646d2SAndroid Build Coastguard Worker }
4071*5e7646d2SAndroid Build Coastguard Worker else if (!op)
4072*5e7646d2SAndroid Build Coastguard Worker {
4073*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
4074*5e7646d2SAndroid Build Coastguard Worker "Missing <Limit ops> directive before %s on line %d of %s.",
4075*5e7646d2SAndroid Build Coastguard Worker line, linenum, ConfigurationFile);
4076*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
4077*5e7646d2SAndroid Build Coastguard Worker return (0);
4078*5e7646d2SAndroid Build Coastguard Worker }
4079*5e7646d2SAndroid Build Coastguard Worker else if (!parse_aaa(op, line, value, linenum))
4080*5e7646d2SAndroid Build Coastguard Worker {
4081*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
4082*5e7646d2SAndroid Build Coastguard Worker "Unknown Policy Limit directive %s on line %d of %s.",
4083*5e7646d2SAndroid Build Coastguard Worker line, linenum, ConfigurationFile);
4084*5e7646d2SAndroid Build Coastguard Worker
4085*5e7646d2SAndroid Build Coastguard Worker if (FatalErrors & CUPSD_FATAL_CONFIG)
4086*5e7646d2SAndroid Build Coastguard Worker return (0);
4087*5e7646d2SAndroid Build Coastguard Worker }
4088*5e7646d2SAndroid Build Coastguard Worker }
4089*5e7646d2SAndroid Build Coastguard Worker
4090*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_ERROR,
4091*5e7646d2SAndroid Build Coastguard Worker "Unexpected end-of-file at line %d while reading policy "
4092*5e7646d2SAndroid Build Coastguard Worker "\"%s\".", linenum, policy);
4093*5e7646d2SAndroid Build Coastguard Worker
4094*5e7646d2SAndroid Build Coastguard Worker return ((FatalErrors & CUPSD_FATAL_CONFIG) ? 0 : linenum);
4095*5e7646d2SAndroid Build Coastguard Worker }
4096*5e7646d2SAndroid Build Coastguard Worker
4097*5e7646d2SAndroid Build Coastguard Worker
4098*5e7646d2SAndroid Build Coastguard Worker /*
4099*5e7646d2SAndroid Build Coastguard Worker * 'set_policy_defaults()' - Set default policy values as needed.
4100*5e7646d2SAndroid Build Coastguard Worker */
4101*5e7646d2SAndroid Build Coastguard Worker
4102*5e7646d2SAndroid Build Coastguard Worker static void
set_policy_defaults(cupsd_policy_t * pol)4103*5e7646d2SAndroid Build Coastguard Worker set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */
4104*5e7646d2SAndroid Build Coastguard Worker {
4105*5e7646d2SAndroid Build Coastguard Worker cupsd_location_t *op; /* Policy operation */
4106*5e7646d2SAndroid Build Coastguard Worker
4107*5e7646d2SAndroid Build Coastguard Worker
4108*5e7646d2SAndroid Build Coastguard Worker /*
4109*5e7646d2SAndroid Build Coastguard Worker * Verify that we have an explicit policy for Validate-Job, Cancel-Jobs,
4110*5e7646d2SAndroid Build Coastguard Worker * Cancel-My-Jobs, Close-Job, and CUPS-Get-Document, which ensures that
4111*5e7646d2SAndroid Build Coastguard Worker * upgrades do not introduce new security issues...
4112*5e7646d2SAndroid Build Coastguard Worker *
4113*5e7646d2SAndroid Build Coastguard Worker * CUPS STR #4659: Allow a lone <Limit All> policy.
4114*5e7646d2SAndroid Build Coastguard Worker */
4115*5e7646d2SAndroid Build Coastguard Worker
4116*5e7646d2SAndroid Build Coastguard Worker if (cupsArrayCount(pol->ops) > 1)
4117*5e7646d2SAndroid Build Coastguard Worker {
4118*5e7646d2SAndroid Build Coastguard Worker if ((op = cupsdFindPolicyOp(pol, IPP_VALIDATE_JOB)) == NULL ||
4119*5e7646d2SAndroid Build Coastguard Worker op->op == IPP_ANY_OPERATION)
4120*5e7646d2SAndroid Build Coastguard Worker {
4121*5e7646d2SAndroid Build Coastguard Worker if ((op = cupsdFindPolicyOp(pol, IPP_PRINT_JOB)) != NULL &&
4122*5e7646d2SAndroid Build Coastguard Worker op->op != IPP_ANY_OPERATION)
4123*5e7646d2SAndroid Build Coastguard Worker {
4124*5e7646d2SAndroid Build Coastguard Worker /*
4125*5e7646d2SAndroid Build Coastguard Worker * Add a new limit for Validate-Job using the Print-Job limit as a
4126*5e7646d2SAndroid Build Coastguard Worker * template...
4127*5e7646d2SAndroid Build Coastguard Worker */
4128*5e7646d2SAndroid Build Coastguard Worker
4129*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Validate-Job defined in policy %s - using Print-Job's policy.", pol->name);
4130*5e7646d2SAndroid Build Coastguard Worker
4131*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(pol, op, IPP_VALIDATE_JOB);
4132*5e7646d2SAndroid Build Coastguard Worker }
4133*5e7646d2SAndroid Build Coastguard Worker else
4134*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Validate-Job defined in policy %s and no suitable template found.", pol->name);
4135*5e7646d2SAndroid Build Coastguard Worker }
4136*5e7646d2SAndroid Build Coastguard Worker
4137*5e7646d2SAndroid Build Coastguard Worker if ((op = cupsdFindPolicyOp(pol, IPP_CANCEL_JOBS)) == NULL ||
4138*5e7646d2SAndroid Build Coastguard Worker op->op == IPP_ANY_OPERATION)
4139*5e7646d2SAndroid Build Coastguard Worker {
4140*5e7646d2SAndroid Build Coastguard Worker if ((op = cupsdFindPolicyOp(pol, IPP_PAUSE_PRINTER)) != NULL &&
4141*5e7646d2SAndroid Build Coastguard Worker op->op != IPP_ANY_OPERATION)
4142*5e7646d2SAndroid Build Coastguard Worker {
4143*5e7646d2SAndroid Build Coastguard Worker /*
4144*5e7646d2SAndroid Build Coastguard Worker * Add a new limit for Cancel-Jobs using the Pause-Printer limit as a
4145*5e7646d2SAndroid Build Coastguard Worker * template...
4146*5e7646d2SAndroid Build Coastguard Worker */
4147*5e7646d2SAndroid Build Coastguard Worker
4148*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-Jobs defined in policy %s - using Pause-Printer's policy.", pol->name);
4149*5e7646d2SAndroid Build Coastguard Worker
4150*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(pol, op, IPP_CANCEL_JOBS);
4151*5e7646d2SAndroid Build Coastguard Worker }
4152*5e7646d2SAndroid Build Coastguard Worker else
4153*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-Jobs defined in policy %s and no suitable template found.", pol->name);
4154*5e7646d2SAndroid Build Coastguard Worker }
4155*5e7646d2SAndroid Build Coastguard Worker
4156*5e7646d2SAndroid Build Coastguard Worker if ((op = cupsdFindPolicyOp(pol, IPP_CANCEL_MY_JOBS)) == NULL ||
4157*5e7646d2SAndroid Build Coastguard Worker op->op == IPP_ANY_OPERATION)
4158*5e7646d2SAndroid Build Coastguard Worker {
4159*5e7646d2SAndroid Build Coastguard Worker if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
4160*5e7646d2SAndroid Build Coastguard Worker op->op != IPP_ANY_OPERATION)
4161*5e7646d2SAndroid Build Coastguard Worker {
4162*5e7646d2SAndroid Build Coastguard Worker /*
4163*5e7646d2SAndroid Build Coastguard Worker * Add a new limit for Cancel-My-Jobs using the Send-Document limit as
4164*5e7646d2SAndroid Build Coastguard Worker * a template...
4165*5e7646d2SAndroid Build Coastguard Worker */
4166*5e7646d2SAndroid Build Coastguard Worker
4167*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-My-Jobs defined in policy %s - using Send-Document's policy.", pol->name);
4168*5e7646d2SAndroid Build Coastguard Worker
4169*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(pol, op, IPP_CANCEL_MY_JOBS);
4170*5e7646d2SAndroid Build Coastguard Worker }
4171*5e7646d2SAndroid Build Coastguard Worker else
4172*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-My-Jobs defined in policy %s and no suitable template found.", pol->name);
4173*5e7646d2SAndroid Build Coastguard Worker }
4174*5e7646d2SAndroid Build Coastguard Worker
4175*5e7646d2SAndroid Build Coastguard Worker if ((op = cupsdFindPolicyOp(pol, IPP_CLOSE_JOB)) == NULL ||
4176*5e7646d2SAndroid Build Coastguard Worker op->op == IPP_ANY_OPERATION)
4177*5e7646d2SAndroid Build Coastguard Worker {
4178*5e7646d2SAndroid Build Coastguard Worker if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
4179*5e7646d2SAndroid Build Coastguard Worker op->op != IPP_ANY_OPERATION)
4180*5e7646d2SAndroid Build Coastguard Worker {
4181*5e7646d2SAndroid Build Coastguard Worker /*
4182*5e7646d2SAndroid Build Coastguard Worker * Add a new limit for Close-Job using the Send-Document limit as a
4183*5e7646d2SAndroid Build Coastguard Worker * template...
4184*5e7646d2SAndroid Build Coastguard Worker */
4185*5e7646d2SAndroid Build Coastguard Worker
4186*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Close-Job defined in policy %s - using Send-Document's policy.", pol->name);
4187*5e7646d2SAndroid Build Coastguard Worker
4188*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(pol, op, IPP_CLOSE_JOB);
4189*5e7646d2SAndroid Build Coastguard Worker }
4190*5e7646d2SAndroid Build Coastguard Worker else
4191*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Close-Job defined in policy %s and no suitable template found.", pol->name);
4192*5e7646d2SAndroid Build Coastguard Worker }
4193*5e7646d2SAndroid Build Coastguard Worker
4194*5e7646d2SAndroid Build Coastguard Worker if ((op = cupsdFindPolicyOp(pol, CUPS_GET_DOCUMENT)) == NULL ||
4195*5e7646d2SAndroid Build Coastguard Worker op->op == IPP_ANY_OPERATION)
4196*5e7646d2SAndroid Build Coastguard Worker {
4197*5e7646d2SAndroid Build Coastguard Worker if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
4198*5e7646d2SAndroid Build Coastguard Worker op->op != IPP_ANY_OPERATION)
4199*5e7646d2SAndroid Build Coastguard Worker {
4200*5e7646d2SAndroid Build Coastguard Worker /*
4201*5e7646d2SAndroid Build Coastguard Worker * Add a new limit for CUPS-Get-Document using the Send-Document
4202*5e7646d2SAndroid Build Coastguard Worker * limit as a template...
4203*5e7646d2SAndroid Build Coastguard Worker */
4204*5e7646d2SAndroid Build Coastguard Worker
4205*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "No limit for CUPS-Get-Document defined in policy %s - using Send-Document's policy.", pol->name);
4206*5e7646d2SAndroid Build Coastguard Worker
4207*5e7646d2SAndroid Build Coastguard Worker cupsdAddPolicyOp(pol, op, CUPS_GET_DOCUMENT);
4208*5e7646d2SAndroid Build Coastguard Worker }
4209*5e7646d2SAndroid Build Coastguard Worker else
4210*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "No limit for CUPS-Get-Document defined in policy %s and no suitable template found.", pol->name);
4211*5e7646d2SAndroid Build Coastguard Worker }
4212*5e7646d2SAndroid Build Coastguard Worker }
4213*5e7646d2SAndroid Build Coastguard Worker
4214*5e7646d2SAndroid Build Coastguard Worker /*
4215*5e7646d2SAndroid Build Coastguard Worker * Verify we have JobPrivateAccess, JobPrivateValues,
4216*5e7646d2SAndroid Build Coastguard Worker * SubscriptionPrivateAccess, and SubscriptionPrivateValues in the policy.
4217*5e7646d2SAndroid Build Coastguard Worker */
4218*5e7646d2SAndroid Build Coastguard Worker
4219*5e7646d2SAndroid Build Coastguard Worker if (!pol->job_access)
4220*5e7646d2SAndroid Build Coastguard Worker {
4221*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "No JobPrivateAccess defined in policy %s - using defaults.", pol->name);
4222*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->job_access), "@OWNER");
4223*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->job_access), "@SYSTEM");
4224*5e7646d2SAndroid Build Coastguard Worker }
4225*5e7646d2SAndroid Build Coastguard Worker
4226*5e7646d2SAndroid Build Coastguard Worker if (!pol->job_attrs)
4227*5e7646d2SAndroid Build Coastguard Worker {
4228*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "No JobPrivateValues defined in policy %s - using defaults.", pol->name);
4229*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->job_attrs), "job-name");
4230*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->job_attrs), "job-originating-host-name");
4231*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->job_attrs), "job-originating-user-name");
4232*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->job_attrs), "phone");
4233*5e7646d2SAndroid Build Coastguard Worker }
4234*5e7646d2SAndroid Build Coastguard Worker
4235*5e7646d2SAndroid Build Coastguard Worker if (!pol->sub_access)
4236*5e7646d2SAndroid Build Coastguard Worker {
4237*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "No SubscriptionPrivateAccess defined in policy %s - using defaults.", pol->name);
4238*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->sub_access), "@OWNER");
4239*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->sub_access), "@SYSTEM");
4240*5e7646d2SAndroid Build Coastguard Worker }
4241*5e7646d2SAndroid Build Coastguard Worker
4242*5e7646d2SAndroid Build Coastguard Worker if (!pol->sub_attrs)
4243*5e7646d2SAndroid Build Coastguard Worker {
4244*5e7646d2SAndroid Build Coastguard Worker cupsdLogMessage(CUPSD_LOG_WARN, "No SubscriptionPrivateValues defined in policy %s - using defaults.", pol->name);
4245*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->sub_attrs), "notify-events");
4246*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->sub_attrs), "notify-pull-method");
4247*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->sub_attrs), "notify-recipient-uri");
4248*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->sub_attrs), "notify-subscriber-user-name");
4249*5e7646d2SAndroid Build Coastguard Worker cupsdAddString(&(pol->sub_attrs), "notify-user-data");
4250*5e7646d2SAndroid Build Coastguard Worker }
4251*5e7646d2SAndroid Build Coastguard Worker }
4252