1 /* 2 * Client definitions for the CUPS scheduler. 3 * 4 * Copyright © 2007-2018 by Apple Inc. 5 * Copyright © 1997-2007 by Easy Software Products, all rights reserved. 6 * 7 * Licensed under Apache License v2.0. See the file "LICENSE" for more 8 * information. 9 */ 10 11 #ifdef HAVE_AUTHORIZATION_H 12 # include <Security/Authorization.h> 13 #endif /* HAVE_AUTHORIZATION_H */ 14 15 16 /* 17 * HTTP client structure... 18 */ 19 20 struct cupsd_client_s 21 { 22 int number; /* Connection number */ 23 http_t *http; /* HTTP client connection */ 24 ipp_t *request, /* IPP request information */ 25 *response; /* IPP response information */ 26 cupsd_location_t *best; /* Best match for AAA */ 27 struct timeval start; /* Request start time */ 28 http_state_t operation; /* Request operation */ 29 off_t bytes; /* Bytes transferred for this request */ 30 int is_browser; /* Is the client a web browser? */ 31 int type; /* AuthType for username */ 32 char username[HTTP_MAX_VALUE], 33 /* Username from Authorization: line */ 34 password[HTTP_MAX_VALUE], 35 /* Password from Authorization: line */ 36 uri[HTTP_MAX_URI], 37 /* Localized URL/URI for GET/PUT */ 38 *filename, /* Filename of output file */ 39 *command, /* Command to run */ 40 *options, /* Options for command */ 41 *query_string; /* QUERY_STRING environment variable */ 42 int file; /* Input/output file */ 43 int file_ready; /* Input ready on file/pipe? */ 44 int pipe_pid; /* Pipe process ID (or 0 if not a pipe) */ 45 http_status_t pipe_status; /* HTTP status from pipe process */ 46 int sent_header, /* Non-zero if sent HTTP header */ 47 got_fields, /* Non-zero if all fields seen */ 48 header_used; /* Number of header bytes used */ 49 char header[2048]; /* Header from CGI program */ 50 cups_lang_t *language; /* Language to use */ 51 #ifdef HAVE_SSL 52 int auto_ssl; /* Automatic test for SSL/TLS */ 53 #endif /* HAVE_SSL */ 54 http_addr_t clientaddr; /* Client's server address */ 55 char clientname[256];/* Client's server name for connection */ 56 int clientport; /* Client's server port for connection */ 57 char servername[256];/* Server name for connection */ 58 int serverport; /* Server port for connection */ 59 #ifdef HAVE_GSSAPI 60 int have_gss; /* Have GSS credentials? */ 61 uid_t gss_uid; /* User ID for local prints */ 62 #endif /* HAVE_GSSAPI */ 63 #ifdef HAVE_AUTHORIZATION_H 64 AuthorizationRef authref; /* Authorization ref */ 65 #endif /* HAVE_AUTHORIZATION_H */ 66 }; 67 68 #define HTTP(con) ((con)->http) 69 70 71 /* 72 * HTTP listener structure... 73 */ 74 75 typedef struct 76 { 77 int fd; /* File descriptor for this server */ 78 http_addr_t address; /* Bind address of socket */ 79 http_encryption_t encryption; /* To encrypt or not to encrypt... */ 80 #ifdef HAVE_ONDEMAND 81 int on_demand; /* Is this a socket from launchd/systemd/upstart? */ 82 #endif /* HAVE_ONDEMAND */ 83 } cupsd_listener_t; 84 85 86 /* 87 * Globals... 88 */ 89 90 VAR int LastClientNumber VALUE(0), 91 /* Last client connection number */ 92 ListenBackLog VALUE(SOMAXCONN), 93 /* Max backlog of pending connections */ 94 LocalPort VALUE(631), 95 /* Local port to use */ 96 RemotePort VALUE(0); 97 /* Remote port to use */ 98 VAR http_encryption_t LocalEncryption VALUE(HTTP_ENCRYPT_IF_REQUESTED); 99 /* Local port encryption to use */ 100 VAR cups_array_t *Listeners VALUE(NULL); 101 /* Listening sockets */ 102 VAR time_t ListeningPaused VALUE(0); 103 /* Time when listening was paused */ 104 VAR cups_array_t *Clients VALUE(NULL), 105 /* HTTP clients */ 106 *ActiveClients VALUE(NULL); 107 /* Active HTTP clients */ 108 VAR char *ServerHeader VALUE(NULL); 109 /* Server header in requests */ 110 VAR int CGIPipes[2] VALUE2(-1,-1); 111 /* Pipes for CGI error/debug output */ 112 VAR cupsd_statbuf_t *CGIStatusBuffer VALUE(NULL); 113 /* Status buffer for pipes */ 114 115 116 /* 117 * Prototypes... 118 */ 119 120 extern void cupsdAcceptClient(cupsd_listener_t *lis); 121 extern void cupsdCloseAllClients(void); 122 extern int cupsdCloseClient(cupsd_client_t *con); 123 extern void cupsdDeleteAllListeners(void); 124 extern void cupsdPauseListening(void); 125 extern int cupsdProcessIPPRequest(cupsd_client_t *con); 126 extern void cupsdReadClient(cupsd_client_t *con); 127 extern void cupsdResumeListening(void); 128 extern int cupsdSendCommand(cupsd_client_t *con, char *command, 129 char *options, int root); 130 extern int cupsdSendError(cupsd_client_t *con, http_status_t code, 131 int auth_type); 132 extern int cupsdSendHeader(cupsd_client_t *con, http_status_t code, 133 char *type, int auth_type); 134 extern void cupsdShutdownClient(cupsd_client_t *con); 135 extern void cupsdStartListening(void); 136 extern void cupsdStopListening(void); 137 extern void cupsdUpdateCGI(void); 138 extern void cupsdWriteClient(cupsd_client_t *con); 139 140 #ifdef HAVE_SSL 141 extern int cupsdEndTLS(cupsd_client_t *con); 142 extern int cupsdStartTLS(cupsd_client_t *con); 143 #endif /* HAVE_SSL */ 144