To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / extra / soundsoftware / doxysafe.pl @ 1002:f6ede18f3e6e

History | View | Annotate | Download (5.04 KB)

1
#!/usr/bin/perl -w
2

    
3
# Read a Doxyfile and print it out again to stdout, with only
4
# whitelisted keys in it and with some keys set to pre-fixed values.
5
#
6
# Note that OUTPUT_DIRECTORY is not included; it should be added by
7
# the caller
8

    
9
use strict;
10

    
11
my $txt = join "", <>;
12
$txt =~ s/^\s*#.*$//gm;
13
$txt =~ s/\\\n//gs;
14
$txt =~ s/\r//g;
15
$txt =~ s/\n\s*\n/\n/gs;
16

    
17
my %fixed = (
18
    FULL_PATH_NAMES => "NO",
19
    SYMBOL_CACHE_SIZE => 2,
20
    EXCLUDE_SYMLINKS => "YES",
21
    GENERATE_HTML => "YES",
22
    PERL_PATH => "/usr/bin/perl",
23
    HAVE_DOT => "YES",
24
    HTML_OUTPUT => ".",
25
    HTML_DYNAMIC_SECTIONS => "NO",
26
    SEARCHENGINE => "NO",
27
    DOT_FONTNAME => "FreeMono",
28
    DOT_FONTSIZE => 10,
29
    DOT_FONTPATH => "/usr/share/fonts/truetype/freefont",
30
    DOT_IMAGE_FORMAT => "png",
31
    DOT_PATH => "/usr/bin/dot",
32
    DOT_TRANSPARENT => "YES",
33
);
34

    
35
# These are the keys that are safe to take from the output and include
36
# in the output; they may still need to be checked for safe values (if
37
# file paths).
38
my @safe = qw(
39
INPUT
40
FILE_PATTERNS
41
EXAMPLE_PATH
42
EXAMPLE_PATTERNS
43
IMAGE_PATH
44
INCLUDE_PATH           
45
INCLUDE_FILE_PATTERNS
46
DOXYFILE_ENCODING      
47
PROJECT_NAME           
48
PROJECT_NUMBER         
49
CREATE_SUBDIRS         
50
OUTPUT_LANGUAGE        
51
BRIEF_MEMBER_DESC      
52
REPEAT_BRIEF           
53
ABBREVIATE_BRIEF       
54
ALWAYS_DETAILED_SEC    
55
INLINE_INHERITED_MEMB  
56
STRIP_FROM_PATH        
57
STRIP_FROM_INC_PATH    
58
JAVADOC_AUTOBRIEF      
59
QT_AUTOBRIEF           
60
MULTILINE_CPP_IS_BRIEF 
61
INHERIT_DOCS           
62
SEPARATE_MEMBER_PAGES  
63
TAB_SIZE               
64
ALIASES                
65
OPTIMIZE_OUTPUT_FOR_C  
66
OPTIMIZE_OUTPUT_JAVA   
67
OPTIMIZE_FOR_FORTRAN   
68
OPTIMIZE_OUTPUT_VHDL   
69
EXTENSION_MAPPING      
70
BUILTIN_STL_SUPPORT    
71
CPP_CLI_SUPPORT        
72
SIP_SUPPORT            
73
IDL_PROPERTY_SUPPORT   
74
DISTRIBUTE_GROUP_DOC   
75
SUBGROUPING            
76
TYPEDEF_HIDES_STRUCT   
77
EXTRACT_ALL            
78
EXTRACT_PRIVATE        
79
EXTRACT_STATIC         
80
EXTRACT_LOCAL_CLASSES  
81
EXTRACT_LOCAL_METHODS  
82
EXTRACT_ANON_NSPACES   
83
HIDE_UNDOC_MEMBERS     
84
HIDE_UNDOC_CLASSES     
85
HIDE_FRIEND_COMPOUNDS  
86
HIDE_IN_BODY_DOCS      
87
INTERNAL_DOCS          
88
HIDE_SCOPE_NAMES       
89
SHOW_INCLUDE_FILES     
90
FORCE_LOCAL_INCLUDES   
91
INLINE_INFO            
92
SORT_MEMBER_DOCS       
93
SORT_BRIEF_DOCS        
94
SORT_MEMBERS_CTORS_1ST 
95
SORT_GROUP_NAMES       
96
SORT_BY_SCOPE_NAME     
97
GENERATE_TODOLIST      
98
GENERATE_TESTLIST      
99
GENERATE_BUGLIST       
100
GENERATE_DEPRECATEDLIST
101
ENABLED_SECTIONS       
102
MAX_INITIALIZER_LINES  
103
SHOW_USED_FILES        
104
SHOW_DIRECTORIES       
105
SHOW_FILES             
106
SHOW_NAMESPACES        
107
QUIET                  
108
WARNINGS               
109
WARN_IF_UNDOCUMENTED   
110
WARN_IF_DOC_ERROR      
111
WARN_NO_PARAMDOC       
112
INPUT_ENCODING         
113
RECURSIVE              
114
EXCLUDE                
115
EXCLUDE_SYMLINKS       
116
EXCLUDE_PATTERNS       
117
EXCLUDE_SYMBOLS        
118
EXAMPLE_RECURSIVE      
119
SOURCE_BROWSER         
120
INLINE_SOURCES         
121
STRIP_CODE_COMMENTS    
122
REFERENCED_BY_RELATION 
123
REFERENCES_RELATION    
124
REFERENCES_LINK_SOURCE 
125
VERBATIM_HEADERS       
126
ALPHABETICAL_INDEX     
127
COLS_IN_ALPHA_INDEX    
128
IGNORE_PREFIX          
129
HTML_TIMESTAMP         
130
HTML_ALIGN_MEMBERS     
131
ENABLE_PREPROCESSING   
132
MACRO_EXPANSION        
133
EXPAND_ONLY_PREDEF     
134
SEARCH_INCLUDES        
135
PREDEFINED             
136
EXPAND_AS_DEFINED      
137
SKIP_FUNCTION_MACROS   
138
ALLEXTERNALS           
139
EXTERNAL_GROUPS        
140
CLASS_DIAGRAMS         
141
HIDE_UNDOC_RELATIONS   
142
CLASS_GRAPH            
143
COLLABORATION_GRAPH    
144
GROUP_GRAPHS           
145
UML_LOOK               
146
TEMPLATE_RELATIONS     
147
INCLUDE_GRAPH          
148
INCLUDED_BY_GRAPH      
149
CALL_GRAPH             
150
CALLER_GRAPH           
151
GRAPHICAL_HIERARCHY    
152
DIRECTORY_GRAPH        
153
DOT_GRAPH_MAX_NODES    
154
MAX_DOT_GRAPH_DEPTH    
155
DOT_MULTI_TARGETS      
156
DOT_CLEANUP            
157
);
158

    
159
my %safehash;
160
for my $sk (@safe) { $safehash{$sk} = 1; }
161

    
162
my @lines = split "\n", $txt;
163

    
164
my %settings;
165

    
166
sub is_safe {
167
    my $key = shift;
168
    defined $safehash{$key} and $safehash{$key} == 1;
169
}
170

    
171
sub has_file_path {
172
    # Returns true if the given key expects a file path as a value.
173
    # We only need to test keys that are safe; unsafe keys have been
174
    # rejected already.
175
    my $key = shift;
176
    $key eq "INPUT" or
177
	$key =~ /^OUTPUT_/ or
178
	$key =~ /_PATH$/ or
179
	$key =~ /_PATTERNS$/;
180
}
181

    
182
sub is_safe_file_path {
183
    my $value = shift;
184
    not $value =~ /^\// and not $value =~ /\.\./;
185
}
186

    
187
foreach my $line (@lines) {
188

    
189
    chomp $line;
190
    my ($key, $value) = split /\s*=\s*/, $line;
191

    
192
    next if !defined $key;
193

    
194
    if ($key =~ /^GENERATE_/ and not $key =~ /LIST$/) {
195
	print STDERR "NOTE: Setting $key explicitly to NO\n";
196
	$settings{$key} = "NO";
197
	next;
198
    }
199
	
200
    if (!is_safe($key)) {
201
	print STDERR "NOTE: Skipping non-whitelisted key $key\n";
202
	next;
203
    }
204

    
205
    if (has_file_path($key) and !is_safe_file_path($value)) {
206
	print STDERR "ERROR: Unsafe file path \"$value\" for key $key\n";
207
	exit 1;
208
    }
209

    
210
    $settings{$key} = $value;
211
}
212

    
213
foreach my $key (keys %fixed) {
214
    my $value = $fixed{$key};
215
    print STDERR "NOTE: Setting $key to fixed value $value\n";
216
    $settings{$key} = $value;
217
}
218

    
219
print join "\n", map { "$_ = $settings{$_}" } keys %settings;
220
print "\n";