-
Notifications
You must be signed in to change notification settings - Fork 1
/
project.h
1753 lines (1447 loc) · 53.7 KB
/
project.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#ifndef PROJECT_H_INCLUDED
#define PROJECT_H_INCLUDED
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/project.h,v $
*
* Purpose : Defines data structures which are widely used in the
* project. Does not define any variables or functions
* (though it does declare some macros).
*
* Copyright : Written by and Copyright (C) 2001-2021 the
* Privoxy team. https://www.privoxy.org/
*
* Based on the Internet Junkbuster originally written
* by and Copyright (C) 1997 Anonymous Coders and
* Junkbusters Corporation. http://www.junkbusters.com
*
* This program is free software; you can redistribute it
* and/or modify it under the terms of the GNU General
* Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will
* be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* The GNU General Public License should be included with
* this file. If not, you can view it at
* http://www.gnu.org/copyleft/gpl.html
* or write to the Free Software Foundation, Inc., 59
* Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*********************************************************************/
/* Declare struct FILE for vars and funcs. */
#include <stdio.h>
/* Need time_t for file_list */
#include <time.h>
/* Needed for pcre choice */
#include "config.h"
#ifdef FEATURE_HTTPS_INSPECTION
/*
* Macros for SSL structures
*/
#define CERT_INFO_BUF_SIZE 4096
#define ISSUER_NAME_BUF_SIZE 2048
#define HASH_OF_HOST_BUF_SIZE 16
#endif /* FEATURE_HTTPS_INSPECTION */
#ifdef FEATURE_HTTPS_INSPECTION_MBEDTLS
#include "mbedtls/net_sockets.h"
#include "mbedtls/entropy.h"
#include "mbedtls/ctr_drbg.h"
#if defined(MBEDTLS_SSL_CACHE_C)
#include "mbedtls/ssl_cache.h"
#endif
#endif /* FEATURE_HTTPS_INSPECTION_MBEDTLS */
#ifdef FEATURE_HTTPS_INSPECTION_OPENSSL
#ifdef _WIN32
#include <wincrypt.h>
#undef X509_NAME
#undef X509_EXTENSIONS
#endif
#include <openssl/ssl.h>
#include <openssl/bio.h>
#include <openssl/err.h>
#endif /* FEATURE_HTTPS_INSPECTION_OPENSSL */
/* Need for struct sockaddr_storage */
#ifdef HAVE_RFC2553
# ifndef _WIN32
# include <netdb.h>
# include <sys/socket.h>
# else
# include <stdint.h>
# include <ws2tcpip.h>
typedef unsigned short in_port_t;
# endif
#endif
/*
* Include appropriate regular expression libraries.
* Note that pcrs and pcre (native) are needed for cgi
* and are included anyway.
*/
#ifdef STATIC_PCRE
# include "pcre.h"
#else
# ifdef PCRE_H_IN_SUBDIR
# include <pcre/pcre.h>
# else
# include <pcre.h>
# endif
#endif
#ifdef STATIC_PCRS
# include "pcrs.h"
#else
# include <pcrs.h>
#endif
#ifdef STATIC_PCRE
# include "pcreposix.h"
#else
# ifdef PCRE_H_IN_SUBDIR
# include <pcre/pcreposix.h>
# else
# include <pcreposix.h>
# endif
#endif
#ifdef _WIN32
/*
* I don't want to have to #include all this just for the declaration
* of SOCKET. However, it looks like we have to...
*/
#ifndef STRICT
#define STRICT
#endif
#include <windows.h>
#endif
#ifdef _WIN32
typedef SOCKET jb_socket;
#define JB_INVALID_SOCKET INVALID_SOCKET
#else /* ndef _WIN32 */
/**
* The type used by sockets. On UNIX it's an int. Microsoft decided to
* make it an unsigned.
*/
typedef int jb_socket;
/**
* The error value used for variables of type jb_socket. On UNIX this
* is -1, however Microsoft decided to make socket handles unsigned, so
* they use a different value.
*/
#define JB_INVALID_SOCKET (-1)
#endif /* ndef _WIN32 */
/**
* A standard error code. This should be JB_ERR_OK or one of the JB_ERR_xxx
* series of errors.
*/
enum privoxy_err
{
JB_ERR_OK = 0, /**< Success, no error */
JB_ERR_MEMORY = 1, /**< Out of memory */
JB_ERR_CGI_PARAMS = 2, /**< Missing or corrupt CGI parameters */
JB_ERR_FILE = 3, /**< Error opening, reading or writing a file */
JB_ERR_PARSE = 4, /**< Error parsing file */
JB_ERR_MODIFIED = 5, /**< File has been modified outside of the
CGI actions editor. */
JB_ERR_COMPRESS = 6 /**< Error on decompression */
};
typedef enum privoxy_err jb_err;
/**
* This macro is used to free a pointer that may be NULL.
* It also sets the variable to NULL after it's been freed.
* The parameter should be a simple variable without side effects.
*/
#define freez(X) { if(X) { free((void*)X); X = NULL ; } }
/**
* Macro definitions for platforms where isspace() and friends
* are macros that use their argument directly as an array index
* and thus better be positive. Supposedly that's the case on
* some unspecified Solaris versions.
* Note: Remember to #include <ctype.h> if you use these macros.
*/
#define privoxy_isdigit(__X) isdigit((int)(unsigned char)(__X))
#define privoxy_isupper(__X) isupper((int)(unsigned char)(__X))
#define privoxy_toupper(__X) toupper((int)(unsigned char)(__X))
#define privoxy_tolower(__X) tolower((int)(unsigned char)(__X))
#define privoxy_isspace(__X) isspace((int)(unsigned char)(__X))
/**
* Use for statically allocated buffers if you have no other choice.
* Remember to check the length of what you write into the buffer
* - we don't want any buffer overflows!
*/
#define BUFFER_SIZE 5000
/**
* Max length of CGI parameters (arbitrary limit).
*/
#define CGI_PARAM_LEN_MAX 500U
/**
* Buffer size for capturing struct hostent data in the
* gethostby(name|addr)_r library calls. Since we don't
* loop over gethostbyname_r, the buffer must be sufficient
* to accommodate multiple IN A RRs, as used in DNS round robin
* load balancing. W3C's wwwlib uses 1K, so that should be
* good enough for us, too.
*/
/**
* XXX: Temporary doubled, for some configurations
* 1K is still too small and we didn't get the
* real fix ready for inclusion.
*/
#define HOSTENT_BUFFER_SIZE 2048
/**
* Default TCP/IP address to listen on, as a string.
* Set to "127.0.0.1:8118".
*/
#define HADDR_DEFAULT "127.0.0.1:8118"
/* Forward def for struct client_state */
struct configuration_spec;
/**
* Entry in a linked list of strings.
*/
struct list_entry
{
/**
* The string pointer. It must point to a dynamically malloc()ed
* string or be NULL for the list functions to work. In the latter
* case, just be careful next time you iterate through the list in
* your own code.
*/
char *str;
/** Next entry in the linked list, or NULL if no more. */
struct list_entry *next;
};
/**
* A header for a linked list of strings.
*/
struct list
{
/** First entry in the list, or NULL if the list is empty. */
struct list_entry *first;
/** Last entry in the list, or NULL if the list is empty. */
struct list_entry *last;
};
/**
* An entry in a map. This is a name=value pair.
*/
struct map_entry
{
/** The key for the map. */
const char *name;
/** The value associated with that key. */
const char *value;
/** The next map entry, or NULL if none. */
struct map_entry *next;
};
/**
* A map from a string to another string.
* This is used for the parameters passed in a HTTP GET request, and
* to store the exports when the CGI interface is filling in a template.
*/
struct map
{
/** The first map entry, or NULL if the map is empty. */
struct map_entry *first;
/** The last map entry, or NULL if the map is empty. */
struct map_entry *last;
};
#ifdef FEATURE_HTTPS_INSPECTION_MBEDTLS
/*
* Struct of attributes necessary for TLS/SSL connection
*/
typedef struct {
mbedtls_ssl_context ssl;
mbedtls_ssl_config conf;
mbedtls_net_context socket_fd;
mbedtls_x509_crt server_cert;
mbedtls_x509_crt ca_cert;
mbedtls_pk_context prim_key;
int *ciphersuites_list;
#if defined(MBEDTLS_SSL_CACHE_C)
mbedtls_ssl_cache_context cache;
#endif
} mbedtls_connection_attr;
#endif /* FEATURE_HTTPS_INSPECTION_MBEDTLS */
#ifdef FEATURE_HTTPS_INSPECTION_OPENSSL
/*
* Struct of attributes necessary for TLS/SSL connection
*/
typedef struct {
SSL_CTX *ctx;
BIO *bio;
} openssl_connection_attr;
#endif /* FEATURE_HTTPS_INSPECTION_OPENSSL */
/**
* A HTTP request. This includes the method (GET, POST) and
* the parsed URL.
*
* This is also used whenever we want to match a URL against a
* URL pattern. This always contains the URL to match, and never
* a URL pattern. (See struct url_spec).
*/
struct http_request
{
char *cmd; /**< Whole command line: method, URL, Version */
char *ocmd; /**< Backup of original cmd for CLF logging */
char *gpc; /**< HTTP method: GET, POST, ... */
char *url; /**< The URL */
char *version; /**< Protocol version */
int status; /**< HTTP Status */
int port; /**< Port of URL or 80 (default) */
char *host; /**< Host part of URL */
char *path; /**< Path of URL */
char *hostport; /**< host[:port] */
char *host_ip_addr_str; /**< String with dotted decimal representation
of host's IP. NULL before connect_to() */
char *dbuffer; /**< Buffer with '\0'-delimited domain name. */
char **dvec; /**< List of pointers to the strings in dbuffer. */
int dcount; /**< How many parts to this domain? (length of dvec) */
#ifdef FEATURE_HTTPS_INSPECTION
int client_ssl; /**< Flag if we should communicate with client over ssl */
int server_ssl; /**< Flag if we should communicate with server over ssl */
unsigned char hash_of_host_hex[(HASH_OF_HOST_BUF_SIZE * 2) + 1]; /**< chars for hash in hex string and one for '\0' */
unsigned char hash_of_host[HASH_OF_HOST_BUF_SIZE+1]; /**< chars for bytes of hash and one for '\0' */
#endif
short int ssl; /**< Flag if protocol is https */
};
#ifdef FEATURE_HTTPS_INSPECTION
/*
* Struct for linked list containing certificates
*/
typedef struct certs_chain {
char info_buf[CERT_INFO_BUF_SIZE]; /* text info about properties of certificate */
char *file_buf; /* buffer for whole certificate - format to save in file */
struct certs_chain *next; /* next certificate in chain of trust */
} certs_chain_t;
#endif
/**
* Reasons for generating a http_response instead of delivering
* the requested resource. Mostly ordered the way they are checked
* for in chat().
*/
enum crunch_reason
{
UNSUPPORTED,
BLOCKED,
UNTRUSTED,
REDIRECTED,
CGI_CALL,
NO_SUCH_DOMAIN,
FORWARDING_FAILED,
CONNECT_FAILED,
OUT_OF_MEMORY,
INTERNAL_ERROR,
CONNECTION_TIMEOUT,
NO_SERVER_DATA
};
/**
* Response generated by CGI, blocker, or error handler
*/
struct http_response
{
char *status; /**< HTTP status (string). */
struct list headers[1]; /**< List of header lines. */
char *head; /**< Formatted http response head. */
size_t head_length; /**< Length of http response head. */
char *body; /**< HTTP document body. */
size_t content_length; /**< Length of body, REQUIRED if binary body. */
int is_static; /**< Nonzero if the content will never change and
should be cached by the browser (e.g. images). */
enum crunch_reason crunch_reason; /**< Why the response was generated in the first place. */
};
struct url_spec
{
#ifdef FEATURE_PCRE_HOST_PATTERNS
regex_t *host_regex;/**< Regex for host matching */
enum host_regex_type { VANILLA_HOST_PATTERN, PCRE_HOST_PATTERN } host_regex_type;
#endif /* defined FEATURE_PCRE_HOST_PATTERNS */
int dcount; /**< How many parts to this domain? (length of dvec) */
char *dbuffer; /**< Buffer with '\0'-delimited domain name, or NULL to match all hosts. */
char **dvec; /**< List of pointers to the strings in dbuffer. */
int unanchored; /**< Bitmap - flags are ANCHOR_LEFT and ANCHOR_RIGHT. */
char *port_list; /**< List of acceptable ports, or NULL to match all ports */
regex_t *preg; /**< Regex for matching path part */
};
/**
* A URL or a tag pattern.
*/
struct pattern_spec
{
/** The string which was parsed to produce this pattern_spec.
Used for debugging or display only. */
char *spec;
union
{
struct url_spec url_spec;
regex_t *tag_regex;
} pattern;
unsigned int flags; /**< Bitmap with various pattern properties. */
};
/**
* Constant for host part matching in URLs. If set, indicates that the start of
* the pattern must match the start of the URL. E.g. this is not set for the
* pattern ".example.com", so that it will match both "example.com" and
* "www.example.com". It is set for the pattern "example.com", which makes it
* match "example.com" only, not "www.example.com".
*/
#define ANCHOR_LEFT 1
/**
* Constant for host part matching in URLs. If set, indicates that the end of
* the pattern must match the end of the URL. E.g. this is not set for the
* pattern "ad.", so that it will match any host called "ad", irrespective
* of how many subdomains are in the fully-qualified domain name.
*/
#define ANCHOR_RIGHT 2
/** Pattern spec bitmap: It's an URL pattern. */
#define PATTERN_SPEC_URL_PATTERN 0x00000001UL
/** Pattern spec bitmap: It's a TAG pattern. */
#define PATTERN_SPEC_TAG_PATTERN 0x00000002UL
/** Pattern spec bitmap: It's a NO-REQUEST-TAG pattern. */
#define PATTERN_SPEC_NO_REQUEST_TAG_PATTERN 0x00000004UL
/** Pattern spec bitmap: It's a NO-RESPONSE-TAG pattern. */
#define PATTERN_SPEC_NO_RESPONSE_TAG_PATTERN 0x00000008UL
/** Pattern spec bitmap: It's a CLIENT-TAG pattern. */
#define PATTERN_SPEC_CLIENT_TAG_PATTERN 0x00000010UL
/**
* An I/O buffer. Holds a string which can be appended to, and can have data
* removed from the beginning.
*/
struct iob
{
char *buf; /**< Start of buffer */
char *cur; /**< Start of relevant data */
char *eod; /**< End of relevant data */
size_t size; /**< Size as malloc()ed */
};
/* Bits for csp->content_type bitmask: */
#define CT_TEXT 0x0001U /**< Suitable for pcrs filtering. */
#define CT_GIF 0x0002U /**< Suitable for GIF filtering. */
#define CT_TABOO 0x0004U /**< DO NOT filter, irrespective of other flags. */
/* Although these are not, strictly speaking, content types
* (they are content encodings), it is simple to handle them
* as such.
*/
#define CT_GZIP 0x0010U /**< gzip-compressed data. */
#define CT_DEFLATE 0x0020U /**< zlib-compressed data. */
#define CT_BROTLI 0x0040U /**< Brotli-compressed data. */
/**
* Flag to signal that the server declared the content type,
* so we can differentiate between unknown and undeclared
* content types.
*/
#define CT_DECLARED 0x0080U
/**
* The mask which includes all actions.
*/
#define ACTION_MASK_ALL (~0UL)
/**
* The most compatible set of actions - i.e. none.
*/
#define ACTION_MOST_COMPATIBLE 0x00000000UL
/** Action bitmap: Block the request. */
#define ACTION_BLOCK 0x00000001UL
/** Action bitmap: Deanimate if it's a GIF. */
#define ACTION_DEANIMATE 0x00000002UL
/** Action bitmap: Downgrade HTTP/1.1 to 1.0. */
#define ACTION_DOWNGRADE 0x00000004UL
/** Action bitmap: Fast redirects. */
#define ACTION_FAST_REDIRECTS 0x00000008UL
/** Action bitmap: Remove or add "X-Forwarded-For" header. */
#define ACTION_CHANGE_X_FORWARDED_FOR 0x00000010UL
/** Action bitmap: Hide "From" header. */
#define ACTION_HIDE_FROM 0x00000020UL
/** Action bitmap: Hide "Referer" header. (sic - follow HTTP, not English). */
#define ACTION_HIDE_REFERER 0x00000040UL
/** Action bitmap: Hide "User-Agent" and similar headers. */
#define ACTION_HIDE_USER_AGENT 0x00000080UL
/** Action bitmap: This is an image. */
#define ACTION_IMAGE 0x00000100UL
/** Action bitmap: Sets the image blocker. */
#define ACTION_IMAGE_BLOCKER 0x00000200UL
/** Action bitmap: Prevent compression. */
#define ACTION_NO_COMPRESSION 0x00000400UL
/** Action bitmap: Change cookies to session only cookies. */
#define ACTION_SESSION_COOKIES_ONLY 0x00000800UL
/** Action bitmap: Block cookies coming from the client. */
#define ACTION_CRUNCH_OUTGOING_COOKIES 0x00001000UL
/** Action bitmap: Block cookies coming from the server. */
#define ACTION_CRUNCH_INCOMING_COOKIES 0x00002000UL
/** Action bitmap: Override the forward settings in the config file */
#define ACTION_FORWARD_OVERRIDE 0x00004000UL
/** Action bitmap: Block as empty document */
#define ACTION_HANDLE_AS_EMPTY_DOCUMENT 0x00008000UL
/** Action bitmap: Limit CONNECT requests to safe ports. */
#define ACTION_LIMIT_CONNECT 0x00010000UL
/** Action bitmap: Redirect request. */
#define ACTION_REDIRECT 0x00020000UL
/** Action bitmap: Crunch or modify "if-modified-since" header. */
#define ACTION_HIDE_IF_MODIFIED_SINCE 0x00040000UL
/** Action bitmap: Overwrite Content-Type header. */
#define ACTION_CONTENT_TYPE_OVERWRITE 0x00080000UL
/** Action bitmap: Crunch specified server header. */
#define ACTION_CRUNCH_SERVER_HEADER 0x00100000UL
/** Action bitmap: Crunch specified client header */
#define ACTION_CRUNCH_CLIENT_HEADER 0x00200000UL
/** Action bitmap: Enable text mode by force */
#define ACTION_FORCE_TEXT_MODE 0x00400000UL
/** Action bitmap: Remove the "If-None-Match" header. */
#define ACTION_CRUNCH_IF_NONE_MATCH 0x00800000UL
/** Action bitmap: Enable content-disposition crunching */
#define ACTION_HIDE_CONTENT_DISPOSITION 0x01000000UL
/** Action bitmap: Replace or block Last-Modified header */
#define ACTION_OVERWRITE_LAST_MODIFIED 0x02000000UL
/** Action bitmap: Replace or block Accept-Language header */
#define ACTION_HIDE_ACCEPT_LANGUAGE 0x04000000UL
/** Action bitmap: Limit the cookie lifetime */
#define ACTION_LIMIT_COOKIE_LIFETIME 0x08000000UL
/** Action bitmap: Delay writes */
#define ACTION_DELAY_RESPONSE 0x10000000UL
/** Action bitmap: Turn https inspection on */
#define ACTION_HTTPS_INSPECTION 0x20000000UL
/** Action bitmap: Turn certificates verification off */
#define ACTION_IGNORE_CERTIFICATE_ERRORS 0x40000000UL
/** Action bitmap: Add "Referer" header. (sic - follow HTTP, not English). */
#define ACTION_ADD_REFERER 0x80000000UL
/** Action string index: How to deanimate GIFs */
#define ACTION_STRING_DEANIMATE 0
/** Action string index: Replacement for "From:" header */
#define ACTION_STRING_FROM 1
/** Action string index: How to block images */
#define ACTION_STRING_IMAGE_BLOCKER 2
/** Action string index: Replacement for "Referer:" header */
#define ACTION_STRING_REFERER 3
/** Action string index: Replacement for "User-Agent:" header */
#define ACTION_STRING_USER_AGENT 4
/** Action string index: Legal CONNECT ports. */
#define ACTION_STRING_LIMIT_CONNECT 5
/** Action string index: Server headers containing this pattern are crunched*/
#define ACTION_STRING_SERVER_HEADER 6
/** Action string index: Client headers containing this pattern are crunched*/
#define ACTION_STRING_CLIENT_HEADER 7
/** Action string index: Replacement for the "Accept-Language:" header*/
#define ACTION_STRING_LANGUAGE 8
/** Action string index: Replacement for the "Content-Type:" header*/
#define ACTION_STRING_CONTENT_TYPE 9
/** Action string index: Replacement for the "content-disposition:" header*/
#define ACTION_STRING_CONTENT_DISPOSITION 10
/** Action string index: Replacement for the "If-Modified-Since:" header*/
#define ACTION_STRING_IF_MODIFIED_SINCE 11
/** Action string index: Replacement for the "Last-Modified:" header. */
#define ACTION_STRING_LAST_MODIFIED 12
/** Action string index: Redirect URL */
#define ACTION_STRING_REDIRECT 13
/** Action string index: Decode before redirect? */
#define ACTION_STRING_FAST_REDIRECTS 14
/** Action string index: Overriding forward rule. */
#define ACTION_STRING_FORWARD_OVERRIDE 15
/** Action string index: Reason for the block. */
#define ACTION_STRING_BLOCK 16
/** Action string index: what to do with the "X-Forwarded-For" header. */
#define ACTION_STRING_CHANGE_X_FORWARDED_FOR 17
/** Action string index: how many minutes cookies should be valid. */
#define ACTION_STRING_LIMIT_COOKIE_LIFETIME 18
/** Action string index: how many milliseconds writes should be delayed. */
#define ACTION_STRING_DELAY_RESPONSE 19
/** Action string index: Completion string for "Referer:" header */
#define ACTION_STRING_ADD_REFERER 20
/** Number of string actions. */
#define ACTION_STRING_COUNT 21
/* To make the ugly hack in sed easier to understand */
#define CHECK_EVERY_HEADER_REMAINING 0
/** Index into current_action_spec::multi[] for headers to add. */
#define ACTION_MULTI_ADD_HEADER 0
/** Index into current_action_spec::multi[] for content filters to apply. */
#define ACTION_MULTI_FILTER 1
/** Index into current_action_spec::multi[] for server-header filters to apply. */
#define ACTION_MULTI_SERVER_HEADER_FILTER 2
/** Index into current_action_spec::multi[] for client-header filters to apply. */
#define ACTION_MULTI_CLIENT_HEADER_FILTER 3
/** Index into current_action_spec::multi[] for client-header tags to apply. */
#define ACTION_MULTI_CLIENT_HEADER_TAGGER 4
/** Index into current_action_spec::multi[] for server-header tags to apply. */
#define ACTION_MULTI_SERVER_HEADER_TAGGER 5
/** Number of multi-string actions. */
#define ACTION_MULTI_EXTERNAL_FILTER 6
/** Index into current_action_spec::multi[] for tags to suppress. */
#define ACTION_MULTI_SUPPRESS_TAG 7
/** Index into current_action_spec::multi[] for client body filters to apply. */
#define ACTION_MULTI_CLIENT_BODY_FILTER 8
/** Index into current_action_spec::multi[] for client body taggers to apply. */
#define ACTION_MULTI_CLIENT_BODY_TAGGER 9
/** Number of multi-string actions. */
#define ACTION_MULTI_COUNT 10
/**
* This structure contains a list of actions to apply to a URL.
* It only contains positive instructions - no "-" options.
* It is not used to store the actions list itself, only for
* url_actions() to return the current values.
*/
struct current_action_spec
{
/** Actions to apply. A bit set to "1" means perform the action. */
unsigned long flags;
/**
* Parameters for those actions that require them.
* Each entry is valid if & only if the corresponding entry in "flags" is
* set.
*/
char * string[ACTION_STRING_COUNT];
/** Lists of strings for multi-string actions. */
struct list multi[ACTION_MULTI_COUNT][1];
};
/**
* This structure contains a set of changes to actions.
* It can contain both positive and negative instructions.
* It is used to store an entry in the actions list.
*/
struct action_spec
{
unsigned long mask; /**< Actions to keep. A bit set to "0" means remove action. */
unsigned long add; /**< Actions to add. A bit set to "1" means add action. */
/**
* Parameters for those actions that require them.
* Each entry is valid if & only if the corresponding entry in "flags" is
* set.
*/
char * string[ACTION_STRING_COUNT];
/** Lists of strings to remove, for multi-string actions. */
struct list multi_remove[ACTION_MULTI_COUNT][1];
/** If nonzero, remove *all* strings from the multi-string action. */
int multi_remove_all[ACTION_MULTI_COUNT];
/** Lists of strings to add, for multi-string actions. */
struct list multi_add[ACTION_MULTI_COUNT][1];
};
#ifdef FEATURE_REQUIRED_TAG
/**
* A required tag list entry.
*
* This is a linked list.
*/
struct req_tag_list
{
regex_t *tag_regex; /**< Regex for tag matching */
struct req_tag_list *next; /**< The next entry in the list. */
};
#endif /* def FEATURE_REQUIRED_TAG */
/**
* This structure is used to store action files.
*
* It contains an URL or tag pattern, and the changes to
* the actions. It's a linked list and should only be
* free'd through unload_actions_file() unless there's
* only a single entry.
*/
struct url_actions
{
struct pattern_spec url[1]; /**< The URL or tag pattern. */
struct action_spec *action; /**< Action settings that might be shared with
the list entry before or after the current
one and can't be free'd willy nilly. */
#ifdef FEATURE_REQUIRED_TAG
struct req_tag_list *rtags; /**< Required tags that might be shared with
the list entry before or after the current
one and can't be free'd willy nilly. */
#endif /* def FEATURE_REQUIRED_TAG */
struct url_actions *next; /**< Next action section in file, or NULL. */
};
enum forwarder_type {
/**< Don't use a SOCKS server, forward to a HTTP proxy directly */
SOCKS_NONE = 0,
/**< original SOCKS 4 protocol */
SOCKS_4 = 40,
/**< SOCKS 4A, DNS resolution is done by the SOCKS server */
SOCKS_4A = 41,
/**< SOCKS 5 with hostnames, DNS resolution is done by the SOCKS server */
SOCKS_5 = 50,
/**< Like SOCKS5, but uses non-standard Tor extensions (currently only optimistic data) */
SOCKS_5T,
/**<
* Don't use a SOCKS server, forward to the specified webserver.
* The difference to SOCKS_NONE is that a request line without
* full URL is sent.
*/
FORWARD_WEBSERVER,
};
/*
* Structure to hold the server socket and the information
* required to make sure we only reuse the connection if
* the host and forwarding settings are the same.
*/
struct reusable_connection
{
jb_socket sfd;
int in_use;
time_t timestamp; /* XXX: rename? */
time_t request_sent;
time_t response_received;
/*
* Number of seconds after which this
* connection will no longer be reused.
*/
unsigned int keep_alive_timeout;
/*
* Number of requests that were sent to this connection.
* This is currently only for debugging purposes.
*/
unsigned int requests_sent_total;
char *host;
int port;
enum forwarder_type forwarder_type;
char *forward_host;
int forward_port;
int gateway_port;
char *gateway_host;
char *auth_username;
char *auth_password;
};
/*
* Flags for use in csp->flags
*/
/**
* Flag for csp->flags: Set if this client is processing data.
* Cleared when the thread associated with this structure dies.
*/
#define CSP_FLAG_ACTIVE 0x01U
/**
* Flag for csp->flags: Set if the server's reply is in "chunked"
* transfer encoding
*/
#define CSP_FLAG_CHUNKED 0x02U
/**
* Flag for csp->flags: Set if this request was enforced, although it would
* normally have been blocked.
*/
#define CSP_FLAG_FORCED 0x04U
/**
* Flag for csp->flags: Set if any modification to the body was done.
*/
#define CSP_FLAG_MODIFIED 0x08U
/**
* Flag for csp->flags: Set if request was blocked.
*/
#define CSP_FLAG_REJECTED 0x10U
/**
* Flag for csp->flags: Set if we are toggled on (FEATURE_TOGGLE).
*/
#define CSP_FLAG_TOGGLED_ON 0x20U
/**
* Flag for csp->flags: Set if an acceptable Connection header
* has already been set by the client.
*/
#define CSP_FLAG_CLIENT_CONNECTION_HEADER_SET 0x00000040U
/**
* Flag for csp->flags: Set if an acceptable Connection header
* has already been set by the server.
*/
#define CSP_FLAG_SERVER_CONNECTION_HEADER_SET 0x00000080U
/**
* Flag for csp->flags: Signals header parsers whether they
* are parsing server or client headers.
*/
#define CSP_FLAG_CLIENT_HEADER_PARSING_DONE 0x00000100U
/**
* Flag for csp->flags: Set if adding the Host: header
* isn't necessary.
*/
#define CSP_FLAG_HOST_HEADER_IS_SET 0x00000200U
/**
* Flag for csp->flags: Set if filtering is disabled by X-Filter: No
* XXX: As we now have tags we might as well ditch this.
*/
#define CSP_FLAG_NO_FILTERING 0x00000400U
/**
* Flag for csp->flags: Set the client IP has appended to
* an already existing X-Forwarded-For header in which case
* no new header has to be generated.
*/
#define CSP_FLAG_X_FORWARDED_FOR_APPENDED 0x00000800U
/**
* Flag for csp->flags: Set if the server wants to keep
* the connection alive.
*/
#define CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE 0x00001000U
/**
* Flag for csp->flags: Set if the server specified the
* content length.
*/
#define CSP_FLAG_SERVER_CONTENT_LENGTH_SET 0x00002000U
/**
* Flag for csp->flags: Set if we know the content length,
* either because the server set it, or we figured it out
* on our own.
*/
#define CSP_FLAG_CONTENT_LENGTH_SET 0x00004000U
/**
* Flag for csp->flags: Set if the client wants to keep
* the connection alive.
*/
#define CSP_FLAG_CLIENT_CONNECTION_KEEP_ALIVE 0x00008000U
/**
* Flag for csp->flags: Set if we think we got the whole
* client request and shouldn't read any additional data
* coming from the client until the current request has
* been dealt with.
*/
#define CSP_FLAG_CLIENT_REQUEST_COMPLETELY_READ 0x00010000U
/**
* Flag for csp->flags: Set if the server promised us to
* keep the connection open for a known number of seconds.
*/
#define CSP_FLAG_SERVER_KEEP_ALIVE_TIMEOUT_SET 0x00020000U
/**
* Flag for csp->flags: Set if we think we can't reuse
* the server socket. XXX: It's also set after sabotaging
* pipelining attempts which is somewhat inconsistent with
* the name.
*/
#define CSP_FLAG_SERVER_SOCKET_TAINTED 0x00040000U
/**
* Flag for csp->flags: Set if the Proxy-Connection header
* is among the server headers.
*/
#define CSP_FLAG_SERVER_PROXY_CONNECTION_HEADER_SET 0x00080000U
/**
* Flag for csp->flags: Set if the client reused its connection.
*/
#define CSP_FLAG_REUSED_CLIENT_CONNECTION 0x00100000U
/**
* Flag for csp->flags: Set if the supports deflate compression.
*/
#define CSP_FLAG_CLIENT_SUPPORTS_DEFLATE 0x00200000U
/**
* Flag for csp->flags: Set if the content has been deflated by Privoxy
*/
#define CSP_FLAG_BUFFERED_CONTENT_DEFLATED 0x00400000U
/**
* Flag for csp->flags: Set if we already read (parts of)
* a pipelined request in which case the client obviously
* isn't done talking.
*/
#define CSP_FLAG_PIPELINED_REQUEST_WAITING 0x00800000U
/**
* Flag for csp->flags: Set if the client body is chunk-encoded
*/
#define CSP_FLAG_CHUNKED_CLIENT_BODY 0x01000000U
/**
* Flag for csp->flags: Set if the client set the Expect header
*/
#define CSP_FLAG_UNSUPPORTED_CLIENT_EXPECTATION 0x02000000U
/**
* Flag for csp->flags: Set if we answered the request ourselves.
*/
#define CSP_FLAG_CRUNCHED 0x04000000U
#ifdef FUZZ
/**
* Flag for csp->flags: Set if we are working with fuzzed input
*/
#define CSP_FLAG_FUZZED_INPUT 0x08000000U
#endif
/*
* Flags for use in return codes of child processes
*/
/**
* Flag for process return code: Set if exiting process has been toggled
* during its lifetime.
*/
#define RC_FLAG_TOGGLED 0x10
/**
* Flag for process return code: Set if exiting process has blocked its
* request.
*/
#define RC_FLAG_BLOCKED 0x20
/**
* Maximum number of actions/filter files. This limit is arbitrary - it's just used
* to size an array.
*/
#define MAX_AF_FILES 100
#ifdef FEATURE_FORWARD_CLASS
/**
* Maximum number of forward classes. This limit is arbitrary - it's just used
* to size an array.