]>
git.ipfire.org Git - thirdparty/cups.git/blob - scheduler/policy.c
2 * "$Id: policy.c 7673 2008-06-18 22:31:26Z mike $"
4 * Policy routines for the Common UNIX Printing System (CUPS).
6 * Copyright 2007-2008 by Apple Inc.
7 * Copyright 1997-2006 by Easy Software Products, all rights reserved.
9 * These coded instructions, statements, and computer programs are the
10 * property of Apple Inc. and are protected by Federal copyright
11 * law. Distribution and use rights are outlined in the file "LICENSE.txt"
12 * which should have been included with this file. If this file is
13 * file is missing or damaged, see the license at "http://www.cups.org/".
17 * cupsdAddPolicy() - Add a policy to the system.
18 * cupsdAddPolicyOp() - Add an operation to a policy.
19 * cupsdCheckPolicy() - Check the IPP operation and username against
21 * cupsdDeleteAllPolicies() - Delete all policies in memory.
22 * cupsdFindPolicy() - Find a named policy.
23 * cupsdFindPolicyOp() - Find a policy operation.
27 * Include necessary headers...
37 static int compare_ops(cupsd_location_t
*a
, cupsd_location_t
*b
);
38 static int compare_policies(cupsd_policy_t
*a
, cupsd_policy_t
*b
);
39 static int hash_op(cupsd_location_t
*op
);
43 * 'AddPolicy()' - Add a policy to the system.
46 cupsd_policy_t
* /* O - Policy */
47 cupsdAddPolicy(const char *policy
) /* I - Name of policy */
49 cupsd_policy_t
*temp
; /* Pointer to policy */
56 Policies
= cupsArrayNew((cups_array_func_t
)compare_policies
, NULL
);
61 if ((temp
= calloc(1, sizeof(cupsd_policy_t
))) != NULL
)
63 cupsdSetString(&temp
->name
, policy
);
64 cupsArrayAdd(Policies
, temp
);
72 * 'cupsdAddPolicyOp()' - Add an operation to a policy.
75 cupsd_location_t
* /* O - New policy operation */
76 cupsdAddPolicyOp(cupsd_policy_t
*p
, /* I - Policy */
77 cupsd_location_t
*po
, /* I - Policy operation to copy */
78 ipp_op_t op
) /* I - IPP operation code */
80 int i
; /* Looping var */
81 cupsd_location_t
*temp
; /* New policy operation */
82 char name
[1024]; /* Interface name */
85 cupsdLogMessage(CUPSD_LOG_DEBUG2
, "cupsdAddPolicyOp(p=%p, po=%p, op=%x(%s))",
86 p
, po
, op
, ippOpString(op
));
92 p
->ops
= cupsArrayNew2((cups_array_func_t
)compare_ops
, NULL
,
93 (cups_ahash_func_t
)hash_op
, 128);
98 if ((temp
= calloc(1, sizeof(cupsd_location_t
))) != NULL
)
101 temp
->limit
= CUPSD_AUTH_LIMIT_IPP
;
103 cupsArrayAdd(p
->ops
, temp
);
108 * Copy the specified policy to the new one...
111 temp
->order_type
= po
->order_type
;
112 temp
->type
= po
->type
;
113 temp
->level
= po
->level
;
114 temp
->satisfy
= po
->satisfy
;
115 temp
->encryption
= po
->encryption
;
117 for (i
= 0; i
< po
->num_names
; i
++)
118 cupsdAddName(temp
, po
->names
[i
]);
120 for (i
= 0; i
< po
->num_allow
; i
++)
121 switch (po
->allow
[i
].type
)
124 cupsdAllowIP(temp
, po
->allow
[i
].mask
.ip
.address
,
125 po
->allow
[i
].mask
.ip
.netmask
);
128 case CUPSD_AUTH_INTERFACE
:
129 snprintf(name
, sizeof(name
), "@IF(%s)",
130 po
->allow
[i
].mask
.name
.name
);
131 cupsdAllowHost(temp
, name
);
135 cupsdAllowHost(temp
, po
->allow
[i
].mask
.name
.name
);
139 for (i
= 0; i
< po
->num_deny
; i
++)
140 switch (po
->deny
[i
].type
)
143 cupsdDenyIP(temp
, po
->deny
[i
].mask
.ip
.address
,
144 po
->deny
[i
].mask
.ip
.netmask
);
147 case CUPSD_AUTH_INTERFACE
:
148 snprintf(name
, sizeof(name
), "@IF(%s)",
149 po
->deny
[i
].mask
.name
.name
);
150 cupsdDenyHost(temp
, name
);
154 cupsdDenyHost(temp
, po
->deny
[i
].mask
.name
.name
);
165 * 'cupsdCheckPolicy()' - Check the IPP operation and username against a policy.
168 http_status_t
/* I - 1 if OK, 0 otherwise */
169 cupsdCheckPolicy(cupsd_policy_t
*p
, /* I - Policy */
170 cupsd_client_t
*con
, /* I - Client connection */
171 const char *owner
) /* I - Owner of object */
173 cupsd_location_t
*po
; /* Current policy operation */
182 cupsdLogMessage(CUPSD_LOG_CRIT
, "cupsdCheckPolicy: p=%p, con=%p!", p
, con
);
184 return ((http_status_t
)0);
188 * Find a match for the operation...
191 if ((po
= cupsdFindPolicyOp(p
, con
->request
->request
.op
.operation_id
)) == NULL
)
193 cupsdLogMessage(CUPSD_LOG_DEBUG2
, "cupsdCheckPolicy: No matching operation, returning 0!");
194 return ((http_status_t
)0);
200 * Return the status of the check...
203 return (cupsdIsAuthorized(con
, owner
));
208 * 'cupsdDeleteAllPolicies()' - Delete all policies in memory.
212 cupsdDeleteAllPolicies(void)
214 cupsd_policy_t
*p
; /* Current policy */
215 cupsd_location_t
*po
; /* Current policy op */
221 for (p
= (cupsd_policy_t
*)cupsArrayFirst(Policies
);
223 p
= (cupsd_policy_t
*)cupsArrayNext(Policies
))
225 for (po
= (cupsd_location_t
*)cupsArrayFirst(p
->ops
);
227 po
= (cupsd_location_t
*)cupsArrayNext(p
->ops
))
228 cupsdDeleteLocation(po
);
230 cupsArrayDelete(p
->ops
);
231 cupsdClearString(&p
->name
);
235 cupsArrayDelete(Policies
);
242 * 'cupsdFindPolicy()' - Find a named policy.
245 cupsd_policy_t
* /* O - Policy */
246 cupsdFindPolicy(const char *policy
) /* I - Name of policy */
248 cupsd_policy_t key
; /* Search key */
262 key
.name
= (char *)policy
;
263 return ((cupsd_policy_t
*)cupsArrayFind(Policies
, &key
));
268 * 'cupsdFindPolicyOp()' - Find a policy operation.
271 cupsd_location_t
* /* O - Policy operation */
272 cupsdFindPolicyOp(cupsd_policy_t
*p
, /* I - Policy */
273 ipp_op_t op
) /* I - IPP operation */
275 cupsd_location_t key
, /* Search key... */
276 *po
; /* Current policy operation */
279 cupsdLogMessage(CUPSD_LOG_DEBUG2
, "cupsdFindPolicyOp(p=%p, op=%x(%s))",
280 p
, op
, ippOpString(op
));
290 * Check the operation against the available policies...
294 if ((po
= (cupsd_location_t
*)cupsArrayFind(p
->ops
, &key
)) != NULL
)
296 cupsdLogMessage(CUPSD_LOG_DEBUG2
,
297 "cupsdFindPolicyOp: Found exact match...");
301 key
.op
= IPP_ANY_OPERATION
;
302 if ((po
= (cupsd_location_t
*)cupsArrayFind(p
->ops
, &key
)) != NULL
)
304 cupsdLogMessage(CUPSD_LOG_DEBUG2
,
305 "cupsdFindPolicyOp: Found wildcard match...");
309 cupsdLogMessage(CUPSD_LOG_DEBUG2
, "cupsdFindPolicyOp: No match found!");
316 * 'compare_ops()' - Compare two operations.
319 static int /* O - Result of comparison */
320 compare_ops(cupsd_location_t
*a
, /* I - First operation */
321 cupsd_location_t
*b
) /* I - Second operation */
323 return (a
->op
- b
->op
);
328 * 'compare_policies()' - Compare two policies.
331 static int /* O - Result of comparison */
332 compare_policies(cupsd_policy_t
*a
, /* I - First policy */
333 cupsd_policy_t
*b
) /* I - Second policy */
335 return (strcasecmp(a
->name
, b
->name
));
340 * 'hash_op()' - Generate a lookup hash for the operation.
343 static int /* O - Hash value */
344 hash_op(cupsd_location_t
*op
) /* I - Operation */
346 return (((op
->op
>> 6) & 0x40) | (op
->op
& 0x3f));
351 * End of "$Id: policy.c 7673 2008-06-18 22:31:26Z mike $".