config.c 169 KB
Newer Older
Roger Dingledine's avatar
Roger Dingledine committed
1
2
/* Copyright (c) 2001 Matej Pfajfar.
 * Copyright (c) 2001-2004, Roger Dingledine.
3
 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
4
 * Copyright (c) 2007-2010, The Tor Project, Inc. */
5
/* See LICENSE for licensing information */
6

Nick Mathewson's avatar
Nick Mathewson committed
7
/**
8
9
 * \file config.c
 * \brief Code to parse and interpret configuration files.
Nick Mathewson's avatar
Nick Mathewson committed
10
11
 **/

12
13
#define CONFIG_PRIVATE

Roger Dingledine's avatar
Roger Dingledine committed
14
#include "or.h"
Sebastian Hahn's avatar
Sebastian Hahn committed
15
#include "circuitbuild.h"
Sebastian Hahn's avatar
Sebastian Hahn committed
16
#include "circuitlist.h"
Sebastian Hahn's avatar
Sebastian Hahn committed
17
#include "config.h"
Sebastian Hahn's avatar
Sebastian Hahn committed
18
#include "connection.h"
Sebastian Hahn's avatar
Sebastian Hahn committed
19
#include "geoip.h"
Sebastian Hahn's avatar
Sebastian Hahn committed
20
#include "rendclient.h"
Sebastian Hahn's avatar
Sebastian Hahn committed
21
#include "rendservice.h"
Sebastian Hahn's avatar
Sebastian Hahn committed
22
#include "router.h"
Sebastian Hahn's avatar
Sebastian Hahn committed
23
#include "routerlist.h"
24
25
26
#ifdef MS_WINDOWS
#include <shlobj.h>
#endif
Roger Dingledine's avatar
Roger Dingledine committed
27

Nick Mathewson's avatar
Nick Mathewson committed
28
29
/** Enumeration of types which option values can take */
typedef enum config_type_t {
30
  CONFIG_TYPE_STRING = 0,   /**< An arbitrary string. */
31
  CONFIG_TYPE_FILENAME,     /**< A filename: some prefixes get expanded. */
32
  CONFIG_TYPE_UINT,         /**< A non-negative integer less than MAX_INT */
33
34
  CONFIG_TYPE_INTERVAL,     /**< A number of seconds, with optional units*/
  CONFIG_TYPE_MEMUNIT,      /**< A number of bytes, with optional units*/
35
36
  CONFIG_TYPE_DOUBLE,       /**< A floating-point value */
  CONFIG_TYPE_BOOL,         /**< A boolean value, expressed as 0 or 1. */
Nick Mathewson's avatar
Nick Mathewson committed
37
  CONFIG_TYPE_ISOTIME,      /**< An ISO-formatted time relative to GMT. */
38
39
  CONFIG_TYPE_CSV,          /**< A list of strings, separated by commas and
                              * optional whitespace. */
40
  CONFIG_TYPE_LINELIST,     /**< Uninterpreted config lines */
41
42
43
44
45
  CONFIG_TYPE_LINELIST_S,   /**< Uninterpreted, context-sensitive config lines,
                             * mixed with other keywords. */
  CONFIG_TYPE_LINELIST_V,   /**< Catch-all "virtual" option to summarize
                             * context-sensitive config lines when fetching.
                             */
46
47
  CONFIG_TYPE_ROUTERSET,    /**< A list of router names, addrs, and fps,
                             * parsed into a routerset_t. */
48
  CONFIG_TYPE_OBSOLETE,     /**< Obsolete (ignored) option. */
Nick Mathewson's avatar
Nick Mathewson committed
49
} config_type_t;
50

51
/** An abbreviation for a configuration option allowed on the command line. */
52
typedef struct config_abbrev_t {
53
54
  const char *abbreviated;
  const char *full;
55
  int commandline_only;
56
  int warn;
57
58
} config_abbrev_t;

59
60
/* Handy macro for declaring "In the config file or on the command line,
 * you can abbreviate <b>tok</b>s as <b>tok</b>". */
61
#define PLURAL(tok) { #tok, #tok "s", 0, 0 }
62

63
64
/** A list of abbreviations and aliases to map command-line options, obsolete
 * option names, or alternative option names, to their current values. */
65
static config_abbrev_t _option_abbrevs[] = {
66
  PLURAL(ExitNode),
67
  PLURAL(EntryNode),
68
69
  PLURAL(ExcludeNode),
  PLURAL(FirewallPort),
70
  PLURAL(LongLivedPort),
71
72
  PLURAL(HiddenServiceNode),
  PLURAL(HiddenServiceExcludeNode),
73
  PLURAL(NumCpu),
74
75
  PLURAL(RendNode),
  PLURAL(RendExcludeNode),
76
77
  PLURAL(StrictEntryNode),
  PLURAL(StrictExitNode),
78
  PLURAL(StrictNode),
79
  { "l", "Log", 1, 0},
80
  { "AllowUnverifiedNodes", "AllowInvalidNodes", 0, 0},
81
82
  { "AutomapHostSuffixes", "AutomapHostsSuffixes", 0, 0},
  { "AutomapHostOnResolve", "AutomapHostsOnResolve", 0, 0},
83
84
85
86
  { "BandwidthRateBytes", "BandwidthRate", 0, 0},
  { "BandwidthBurstBytes", "BandwidthBurst", 0, 0},
  { "DirFetchPostPeriod", "StatusFetchPeriod", 0, 0},
  { "MaxConn", "ConnLimit", 0, 1},
87
88
89
  { "ORBindAddress", "ORListenAddress", 0, 0},
  { "DirBindAddress", "DirListenAddress", 0, 0},
  { "SocksBindAddress", "SocksListenAddress", 0, 0},
90
91
92
93
  { "UseHelperNodes", "UseEntryGuards", 0, 0},
  { "NumHelperNodes", "NumEntryGuards", 0, 0},
  { "UseEntryNodes", "UseEntryGuards", 0, 0},
  { "NumEntryNodes", "NumEntryGuards", 0, 0},
94
95
  { "ResolvConf", "ServerDNSResolvConfFile", 0, 1},
  { "SearchDomains", "ServerDNSSearchDomains", 0, 1},
96
  { "ServerDNSAllowBrokenResolvConf", "ServerDNSAllowBrokenConfig", 0, 0},
97
  { "PreferTunnelledDirConns", "PreferTunneledDirConns", 0, 0},
98
  { "BridgeAuthoritativeDirectory", "BridgeAuthoritativeDir", 0, 0},
99
  { "HashedControlPassword", "__HashedControlSessionPassword", 1, 0},
100
101
  { "StrictEntryNodes", "StrictNodes", 0, 1},
  { "StrictExitNodes", "StrictNodes", 0, 1},
102
103
  { NULL, NULL, 0, 0},
};
104
105

/** A list of state-file "abbreviations," for compatibility. */
106
static config_abbrev_t _state_abbrevs[] = {
107
  { "AccountingBytesReadInterval", "AccountingBytesReadInInterval", 0, 0 },
108
109
110
111
112
113
  { "HelperNode", "EntryGuard", 0, 0 },
  { "HelperNodeDownSince", "EntryGuardDownSince", 0, 0 },
  { "HelperNodeUnlistedSince", "EntryGuardUnlistedSince", 0, 0 },
  { "EntryNode", "EntryGuard", 0, 0 },
  { "EntryNodeDownSince", "EntryGuardDownSince", 0, 0 },
  { "EntryNodeUnlistedSince", "EntryGuardUnlistedSince", 0, 0 },
114
  { NULL, NULL, 0, 0},
115
};
116
#undef PLURAL
117

118
/** A variable allowed in the configuration file or on the command line. */
119
typedef struct config_var_t {
120
  const char *name; /**< The full keyword (case insensitive). */
121
122
  config_type_t type; /**< How to interpret the type and turn it into a
                       * value. */
123
124
  off_t var_offset; /**< Offset of the corresponding member of or_options_t. */
  const char *initvalue; /**< String (or null) describing initial value. */
125
126
} config_var_t;

Nick Mathewson's avatar
Nick Mathewson committed
127
128
129
130
/** An entry for config_vars: "The option <b>name</b> has type
 * CONFIG_TYPE_<b>conftype</b>, and corresponds to
 * or_options_t.<b>member</b>"
 */
131
132
#define VAR(name,conftype,member,initvalue)                             \
  { name, CONFIG_TYPE_ ## conftype, STRUCT_OFFSET(or_options_t, member), \
133
      initvalue }
134
135
136
/** As VAR, but the option name and member name are the same. */
#define V(member,conftype,initvalue)                                    \
  VAR(#member, conftype, member, initvalue)
Nick Mathewson's avatar
Nick Mathewson committed
137
/** An entry for config_vars: "The option <b>name</b> is obsolete." */
138
#define OBSOLETE(name) { name, CONFIG_TYPE_OBSOLETE, 0, NULL }
139

Nick Mathewson's avatar
Nick Mathewson committed
140
141
142
143
/** Array of configuration options.  Until we disallow nonstandard
 * abbreviations, order is significant, since the first matching option will
 * be chosen first.
 */
144
static config_var_t _option_vars[] = {
145
  OBSOLETE("AccountingMaxKB"),
146
147
148
  V(AccountingMax,               MEMUNIT,  "0 bytes"),
  V(AccountingStart,             STRING,   NULL),
  V(Address,                     STRING,   NULL),
149
  V(AllowDotExit,                BOOL,     "0"),
150
151
  V(AllowInvalidNodes,           CSV,      "middle,rendezvous"),
  V(AllowNonRFC953Hostnames,     BOOL,     "0"),
152
153
  V(AllowSingleHopCircuits,      BOOL,     "0"),
  V(AllowSingleHopExits,         BOOL,     "0"),
154
155
156
  V(AlternateBridgeAuthority,    LINELIST, NULL),
  V(AlternateDirAuthority,       LINELIST, NULL),
  V(AlternateHSAuthority,        LINELIST, NULL),
157
  V(AssumeReachable,             BOOL,     "0"),
158
  V(AuthDirBadDir,               LINELIST, NULL),
159
160
161
162
  V(AuthDirBadExit,              LINELIST, NULL),
  V(AuthDirInvalid,              LINELIST, NULL),
  V(AuthDirReject,               LINELIST, NULL),
  V(AuthDirRejectUnlisted,       BOOL,     "0"),
163
  V(AuthDirListBadDirs,          BOOL,     "0"),
164
  V(AuthDirListBadExits,         BOOL,     "0"),
165
166
  V(AuthDirMaxServersPerAddr,    UINT,     "2"),
  V(AuthDirMaxServersPerAuthAddr,UINT,     "5"),
167
168
169
170
  VAR("AuthoritativeDirectory",  BOOL, AuthoritativeDir,    "0"),
  V(AutomapHostsOnResolve,       BOOL,     "0"),
  V(AutomapHostsSuffixes,        CSV,      ".onion,.exit"),
  V(AvoidDiskWrites,             BOOL,     "0"),
171
172
  V(BandwidthBurst,              MEMUNIT,  "10 MB"),
  V(BandwidthRate,               MEMUNIT,  "5 MB"),
173
174
  V(BridgeAuthoritativeDir,      BOOL,     "0"),
  VAR("Bridge",                  LINELIST, Bridges,    NULL),
175
  V(BridgePassword,              STRING,   NULL),
176
  V(BridgeRecordUsageByCountry,  BOOL,     "1"),
177
  V(BridgeRelay,                 BOOL,     "0"),
178
  V(CellStatistics,              BOOL,     "0"),
179
  V(LearnCircuitBuildTimeout,    BOOL,     "1"),
180
  V(CircuitBuildTimeout,         INTERVAL, "0"),
181
  V(CircuitIdleTimeout,          INTERVAL, "1 hour"),
182
  V(CircuitStreamTimeout,        INTERVAL, "0"),
183
  V(CircuitPriorityHalflife,     DOUBLE,  "-100.0"), /*negative:'Use default'*/
184
185
  V(ClientDNSRejectInternalAddresses, BOOL,"1"),
  V(ClientOnly,                  BOOL,     "0"),
186
  V(ConsensusParams,             STRING,   NULL),
187
188
189
190
191
192
193
194
195
196
  V(ConnLimit,                   UINT,     "1000"),
  V(ConstrainedSockets,          BOOL,     "0"),
  V(ConstrainedSockSize,         MEMUNIT,  "8192"),
  V(ContactInfo,                 STRING,   NULL),
  V(ControlListenAddress,        LINELIST, NULL),
  V(ControlPort,                 UINT,     "0"),
  V(ControlSocket,               LINELIST, NULL),
  V(CookieAuthentication,        BOOL,     "0"),
  V(CookieAuthFileGroupReadable, BOOL,     "0"),
  V(CookieAuthFile,              STRING,   NULL),
197
  V(DataDirectory,               FILENAME, NULL),
198
  OBSOLETE("DebugLogFile"),
199
  V(DirAllowPrivateAddresses,    BOOL,     NULL),
200
  V(TestingAuthDirTimeToLearnReachability, INTERVAL, "30 minutes"),
201
  V(DirListenAddress,            LINELIST, NULL),
202
  OBSOLETE("DirFetchPeriod"),
203
204
  V(DirPolicy,                   LINELIST, NULL),
  V(DirPort,                     UINT,     "0"),
205
  V(DirPortFrontPage,            FILENAME, NULL),
206
  OBSOLETE("DirPostPeriod"),
207
208
209
210
  OBSOLETE("DirRecordUsageByCountry"),
  OBSOLETE("DirRecordUsageGranularity"),
  OBSOLETE("DirRecordUsageRetainIPs"),
  OBSOLETE("DirRecordUsageSaveInterval"),
Karsten Loesing's avatar
Karsten Loesing committed
211
  V(DirReqStatistics,            BOOL,     "0"),
212
  VAR("DirServer",               LINELIST, DirServers, NULL),
213
  V(DisableAllSwap,              BOOL,     "0"),
214
215
216
217
  V(DNSPort,                     UINT,     "0"),
  V(DNSListenAddress,            LINELIST, NULL),
  V(DownloadExtraInfo,           BOOL,     "0"),
  V(EnforceDistinctSubnets,      BOOL,     "1"),
218
  V(EntryNodes,                  ROUTERSET,   NULL),
219
  V(EntryStatistics,             BOOL,     "0"),
220
  V(TestingEstimatedDescriptorPropagationTime, INTERVAL, "10 minutes"),
221
222
  V(ExcludeNodes,                ROUTERSET, NULL),
  V(ExcludeExitNodes,            ROUTERSET, NULL),
223
  V(ExcludeSingleHopRelays,      BOOL,     "1"),
224
  V(ExitNodes,                   ROUTERSET, NULL),
225
226
  V(ExitPolicy,                  LINELIST, NULL),
  V(ExitPolicyRejectPrivate,     BOOL,     "1"),
227
  V(ExitPortStatistics,          BOOL,     "0"),
228
  V(ExtraInfoStatistics,         BOOL,     "0"),
229

valerino's avatar
valerino committed
230
231
232
#if defined (WINCE)
  V(FallbackNetworkstatusFile,   FILENAME, "fallback-consensus"),
#else
233
  V(FallbackNetworkstatusFile,   FILENAME,
234
    SHARE_DATADIR PATH_SEPARATOR "tor" PATH_SEPARATOR "fallback-consensus"),
valerino's avatar
valerino committed
235
#endif
236
237
238
  V(FascistFirewall,             BOOL,     "0"),
  V(FirewallPorts,               CSV,      ""),
  V(FastFirstHopPK,              BOOL,     "1"),
239
  V(FetchDirInfoEarly,           BOOL,     "0"),
240
  V(FetchDirInfoExtraEarly,      BOOL,     "0"),
241
242
243
  V(FetchServerDescriptors,      BOOL,     "1"),
  V(FetchHidServDescriptors,     BOOL,     "1"),
  V(FetchUselessDescriptors,     BOOL,     "0"),
244
#ifdef WIN32
245
  V(GeoIPFile,                   FILENAME, "<default>"),
246
#else
247
248
  V(GeoIPFile,                   FILENAME,
    SHARE_DATADIR PATH_SEPARATOR "tor" PATH_SEPARATOR "geoip"),
249
#endif
250
  OBSOLETE("Group"),
251
  V(HardwareAccel,               BOOL,     "0"),
252
253
  V(AccelName,                   STRING,   NULL),
  V(AccelDir,                    FILENAME, NULL),
254
  V(HashedControlPassword,       LINELIST, NULL),
255
  V(HidServDirectoryV2,          BOOL,     "1"),
Nick Mathewson's avatar
Nick Mathewson committed
256
  VAR("HiddenServiceDir",    LINELIST_S, RendConfigLines,    NULL),
257
258
  OBSOLETE("HiddenServiceExcludeNodes"),
  OBSOLETE("HiddenServiceNodes"),
Nick Mathewson's avatar
Nick Mathewson committed
259
260
  VAR("HiddenServiceOptions",LINELIST_V, RendConfigLines,    NULL),
  VAR("HiddenServicePort",   LINELIST_S, RendConfigLines,    NULL),
261
  VAR("HiddenServiceVersion",LINELIST_S, RendConfigLines,    NULL),
262
  VAR("HiddenServiceAuthorizeClient",LINELIST_S,RendConfigLines, NULL),
263
  V(HidServAuth,                 LINELIST, NULL),
264
  V(HSAuthoritativeDir,          BOOL,     "0"),
265
  OBSOLETE("HSAuthorityRecordStats"),
266
267
268
269
  V(HttpProxy,                   STRING,   NULL),
  V(HttpProxyAuthenticator,      STRING,   NULL),
  V(HttpsProxy,                  STRING,   NULL),
  V(HttpsProxyAuthenticator,     STRING,   NULL),
270
271
272
273
  V(Socks4Proxy,                 STRING,   NULL),
  V(Socks5Proxy,                 STRING,   NULL),
  V(Socks5ProxyUsername,         STRING,   NULL),
  V(Socks5ProxyPassword,         STRING,   NULL),
274
  OBSOLETE("IgnoreVersion"),
275
276
  V(KeepalivePeriod,             INTERVAL, "5 minutes"),
  VAR("Log",                     LINELIST, Logs,             NULL),
277
  OBSOLETE("LinkPadding"),
278
279
  OBSOLETE("LogLevel"),
  OBSOLETE("LogFile"),
280
  V(LongLivedPorts,              CSV,
281
                         "21,22,706,1863,5050,5190,5222,5223,6667,6697,8300"),
282
283
284
285
  VAR("MapAddress",              LINELIST, AddressMap,           NULL),
  V(MaxAdvertisedBandwidth,      MEMUNIT,  "1 GB"),
  V(MaxCircuitDirtiness,         INTERVAL, "10 minutes"),
  V(MaxOnionsPending,            UINT,     "100"),
286
  OBSOLETE("MonthlyAccountingStart"),
287
288
  V(MyFamily,                    STRING,   NULL),
  V(NewCircuitPeriod,            INTERVAL, "30 seconds"),
289
  VAR("NamingAuthoritativeDirectory",BOOL, NamingAuthoritativeDir, "0"),
290
291
292
  V(NatdListenAddress,           LINELIST, NULL),
  V(NatdPort,                    UINT,     "0"),
  V(Nickname,                    STRING,   NULL),
293
  V(WarnUnsafeSocks,              BOOL,     "1"),
294
295
296
297
298
299
300
  V(NoPublish,                   BOOL,     "0"),
  VAR("NodeFamily",              LINELIST, NodeFamilies,         NULL),
  V(NumCpus,                     UINT,     "1"),
  V(NumEntryGuards,              UINT,     "3"),
  V(ORListenAddress,             LINELIST, NULL),
  V(ORPort,                      UINT,     "0"),
  V(OutboundBindAddress,         STRING,   NULL),
301
  OBSOLETE("PathlenCoinWeight"),
302
303
  V(PerConnBWBurst,              MEMUNIT,  "0"),
  V(PerConnBWRate,               MEMUNIT,  "0"),
304
  V(PidFile,                     STRING,   NULL),
305
  V(TestingTorNetwork,           BOOL,     "0"),
Roger Dingledine's avatar
Roger Dingledine committed
306
  V(PreferTunneledDirConns,      BOOL,     "1"),
307
  V(ProtocolWarnings,            BOOL,     "0"),
308
  V(PublishServerDescriptor,     CSV,      "1"),
309
310
311
312
313
314
315
  V(PublishHidServDescriptors,   BOOL,     "1"),
  V(ReachableAddresses,          LINELIST, NULL),
  V(ReachableDirAddresses,       LINELIST, NULL),
  V(ReachableORAddresses,        LINELIST, NULL),
  V(RecommendedVersions,         LINELIST, NULL),
  V(RecommendedClientVersions,   LINELIST, NULL),
  V(RecommendedServerVersions,   LINELIST, NULL),
316
  OBSOLETE("RedirectExit"),
317
  V(RefuseUnknownExits,          BOOL,     "0"),
318
  V(RejectPlaintextPorts,        CSV,      ""),
319
320
  V(RelayBandwidthBurst,         MEMUNIT,  "0"),
  V(RelayBandwidthRate,          MEMUNIT,  "0"),
321
322
  OBSOLETE("RendExcludeNodes"),
  OBSOLETE("RendNodes"),
323
324
  V(RendPostPeriod,              INTERVAL, "1 hour"),
  V(RephistTrackTime,            INTERVAL, "24 hours"),
325
  OBSOLETE("RouterFile"),
326
327
  V(RunAsDaemon,                 BOOL,     "0"),
  V(RunTesting,                  BOOL,     "0"),
328
  V(SafeLogging,                 STRING,   "1"),
329
  V(SafeSocks,                   BOOL,     "0"),
330
  V(ServerDNSAllowBrokenConfig,  BOOL,     "1"),
331
332
  V(ServerDNSAllowNonRFC953Hostnames, BOOL,"0"),
  V(ServerDNSDetectHijacking,    BOOL,     "1"),
333
  V(ServerDNSRandomizeCase,      BOOL,     "1"),
334
335
336
  V(ServerDNSResolvConfFile,     STRING,   NULL),
  V(ServerDNSSearchDomains,      BOOL,     "0"),
  V(ServerDNSTestAddresses,      CSV,
337
      "www.google.com,www.mit.edu,www.yahoo.com,www.slashdot.org"),
338
339
340
341
342
  V(ShutdownWaitLength,          INTERVAL, "30 seconds"),
  V(SocksListenAddress,          LINELIST, NULL),
  V(SocksPolicy,                 LINELIST, NULL),
  V(SocksPort,                   UINT,     "9050"),
  V(SocksTimeout,                INTERVAL, "2 minutes"),
343
  OBSOLETE("StatusFetchPeriod"),
344
  V(StrictNodes,                 BOOL,     "0"),
345
  OBSOLETE("SysLog"),
346
  V(TestSocks,                   BOOL,     "0"),
347
  OBSOLETE("TestVia"),
348
349
  V(TrackHostExits,              CSV,      NULL),
  V(TrackHostExitsExpire,        INTERVAL, "30 minutes"),
350
  OBSOLETE("TrafficShaping"),
351
352
  V(TransListenAddress,          LINELIST, NULL),
  V(TransPort,                   UINT,     "0"),
Roger Dingledine's avatar
Roger Dingledine committed
353
  V(TunnelDirConns,              BOOL,     "1"),
354
355
356
357
  V(UpdateBridgesFromAuthority,  BOOL,     "0"),
  V(UseBridges,                  BOOL,     "0"),
  V(UseEntryGuards,              BOOL,     "1"),
  V(User,                        STRING,   NULL),
358
  VAR("V1AuthoritativeDirectory",BOOL, V1AuthoritativeDir,   "0"),
359
  VAR("V2AuthoritativeDirectory",BOOL, V2AuthoritativeDir,   "0"),
360
  VAR("V3AuthoritativeDirectory",BOOL, V3AuthoritativeDir,   "0"),
361
362
363
  V(TestingV3AuthInitialVotingInterval, INTERVAL, "30 minutes"),
  V(TestingV3AuthInitialVoteDelay, INTERVAL, "5 minutes"),
  V(TestingV3AuthInitialDistDelay, INTERVAL, "5 minutes"),
364
365
366
367
  V(V3AuthVotingInterval,        INTERVAL, "1 hour"),
  V(V3AuthVoteDelay,             INTERVAL, "5 minutes"),
  V(V3AuthDistDelay,             INTERVAL, "5 minutes"),
  V(V3AuthNIntervalsValid,       UINT,     "3"),
368
  V(V3AuthUseLegacyKey,          BOOL,     "0"),
369
  V(V3BandwidthsFile,            FILENAME, NULL),
370
  VAR("VersioningAuthoritativeDirectory",BOOL,VersioningAuthoritativeDir, "0"),
371
  V(VirtualAddrNetwork,          STRING,   "127.192.0.0/10"),
372
  V(WarnPlaintextPorts,          CSV,      "23,109,110,143"),
373
  VAR("__ReloadTorrcOnSIGHUP",   BOOL,  ReloadTorrcOnSIGHUP,      "1"),
374
375
376
  VAR("__AllDirActionsPrivate",  BOOL,  AllDirActionsPrivate,     "0"),
  VAR("__DisablePredictedCircuits",BOOL,DisablePredictedCircuits, "0"),
  VAR("__LeaveStreamsUnattached",BOOL,  LeaveStreamsUnattached,   "0"),
377
378
  VAR("__HashedControlSessionPassword", LINELIST, HashedControlSessionPassword,
      NULL),
379
  V(MinUptimeHidServDirectoryV2, INTERVAL, "24 hours"),
380

381
  { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL }
382
};
383

384
385
/** Override default values with these if the user sets the TestingTorNetwork
 * option. */
386
static config_var_t testing_tor_network_defaults[] = {
387
  V(ServerDNSAllowBrokenConfig,  BOOL,  "1"),
388
389
390
391
392
393
394
395
396
397
  V(DirAllowPrivateAddresses,    BOOL,     "1"),
  V(EnforceDistinctSubnets,      BOOL,     "0"),
  V(AssumeReachable,             BOOL,     "1"),
  V(AuthDirMaxServersPerAddr,    UINT,     "0"),
  V(AuthDirMaxServersPerAuthAddr,UINT,     "0"),
  V(ClientDNSRejectInternalAddresses, BOOL,"0"),
  V(ExitPolicyRejectPrivate,     BOOL,     "0"),
  V(V3AuthVotingInterval,        INTERVAL, "5 minutes"),
  V(V3AuthVoteDelay,             INTERVAL, "20 seconds"),
  V(V3AuthDistDelay,             INTERVAL, "20 seconds"),
398
399
400
401
402
  V(TestingV3AuthInitialVotingInterval, INTERVAL, "5 minutes"),
  V(TestingV3AuthInitialVoteDelay, INTERVAL, "20 seconds"),
  V(TestingV3AuthInitialDistDelay, INTERVAL, "20 seconds"),
  V(TestingAuthDirTimeToLearnReachability, INTERVAL, "0 minutes"),
  V(TestingEstimatedDescriptorPropagationTime, INTERVAL, "0 minutes"),
403
404
  { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL }
};
405
406
#undef VAR

407
408
#define VAR(name,conftype,member,initvalue)                             \
  { name, CONFIG_TYPE_ ## conftype, STRUCT_OFFSET(or_state_t, member),  \
409
      initvalue }
410
411

/** Array of "state" variables saved to the ~/.tor/state file. */
412
static config_var_t _state_vars[] = {
413
414
415
416
417
  V(AccountingBytesReadInInterval,    MEMUNIT,  NULL),
  V(AccountingBytesWrittenInInterval, MEMUNIT,  NULL),
  V(AccountingExpectedUsage,          MEMUNIT,  NULL),
  V(AccountingIntervalStart,          ISOTIME,  NULL),
  V(AccountingSecondsActive,          INTERVAL, NULL),
Roger Dingledine's avatar
Roger Dingledine committed
418

419
420
421
  VAR("EntryGuard",              LINELIST_S,  EntryGuards,             NULL),
  VAR("EntryGuardDownSince",     LINELIST_S,  EntryGuards,             NULL),
  VAR("EntryGuardUnlistedSince", LINELIST_S,  EntryGuards,             NULL),
422
  VAR("EntryGuardAddedBy",       LINELIST_S,  EntryGuards,             NULL),
423
  V(EntryGuards,                 LINELIST_V,  NULL),
Nick Mathewson's avatar
Nick Mathewson committed
424

425
426
427
428
429
430
  V(BWHistoryReadEnds,                ISOTIME,  NULL),
  V(BWHistoryReadInterval,            UINT,     "900"),
  V(BWHistoryReadValues,              CSV,      ""),
  V(BWHistoryWriteEnds,               ISOTIME,  NULL),
  V(BWHistoryWriteInterval,           UINT,     "900"),
  V(BWHistoryWriteValues,             CSV,      ""),
431

432
  V(TorVersion,                       STRING,   NULL),
433

434
435
  V(LastRotatedOnionKey,              ISOTIME,  NULL),
  V(LastWritten,                      ISOTIME,  NULL),
436

437
  V(TotalBuildTimes,                  UINT,     NULL),
438
  V(CircuitBuildAbandonedCount,         UINT,     "0"),
439
440
  VAR("CircuitBuildTimeBin",          LINELIST_S, BuildtimeHistogram, NULL),
  VAR("BuildtimeHistogram",           LINELIST_V, BuildtimeHistogram, NULL),
441

442
  { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL }
443
444
};

445
#undef VAR
446
#undef V
447
448
#undef OBSOLETE

449
450
/** Represents an English description of a configuration variable; used when
 * generating configuration file comments. */
451
452
453
454
455
typedef struct config_var_description_t {
  const char *name;
  const char *description;
} config_var_description_t;

456
/** Type of a callback to validate whether a given configuration is
Roger Dingledine's avatar
Roger Dingledine committed
457
 * well-formed and consistent. See options_trial_assign() for documentation
458
 * of arguments. */
459
typedef int (*validate_fn_t)(void*,void*,int,char**);
460

461
462
463
/** Information on the keys, value types, key-to-struct-member mappings,
 * variable descriptions, validation functions, and abbreviations for a
 * configuration or storage format. */
464
typedef struct {
465
466
467
  size_t size; /**< Size of the struct that everything gets parsed into. */
  uint32_t magic; /**< Required 'magic value' to make sure we have a struct
                   * of the right type. */
Roger Dingledine's avatar
Roger Dingledine committed
468
  off_t magic_offset; /**< Offset of the magic value within the struct. */
469
  config_abbrev_t *abbrevs; /**< List of abbreviations that we expand when
Roger Dingledine's avatar
Roger Dingledine committed
470
                             * parsing this format. */
471
472
473
  config_var_t *vars; /**< List of variables we recognize, their default
                       * values, and where we stick them in the structure. */
  validate_fn_t validate_fn; /**< Function to validate config. */
Roger Dingledine's avatar
Roger Dingledine committed
474
475
476
  /** If present, extra is a LINELIST variable for unrecognized
   * lines.  Otherwise, unrecognized lines are an error. */
  config_var_t *extra;
477
478
} config_format_t;

479
480
/** Macro: assert that <b>cfg</b> has the right magic field for format
 * <b>fmt</b>. */
481
#define CHECK(fmt, cfg) STMT_BEGIN                                      \
482
    tor_assert(fmt && cfg);                                             \
483
    tor_assert((fmt)->magic ==                                          \
484
               *(uint32_t*)STRUCT_VAR_P(cfg,fmt->magic_offset));        \
485
  STMT_END
486

487
488
489
#ifdef MS_WINDOWS
static char *get_windows_conf_root(void);
#endif
490
static void config_line_append(config_line_t **lst,
491
                               const char *key, const char *val);
492
493
static void option_clear(config_format_t *fmt, or_options_t *options,
                         config_var_t *var);
494
static void option_reset(config_format_t *fmt, or_options_t *options,
495
                         config_var_t *var, int use_defaults);
496
static void config_free(config_format_t *fmt, void *options);
497
static int config_lines_eq(config_line_t *a, config_line_t *b);
498
static int option_is_same(config_format_t *fmt,
499
500
                          or_options_t *o1, or_options_t *o2,
                          const char *name);
501
static or_options_t *options_dup(config_format_t *fmt, or_options_t *old);
502
503
504
static int options_validate(or_options_t *old_options, or_options_t *options,
                            int from_setconf, char **msg);
static int options_act_reversible(or_options_t *old_options, char **msg);
505
static int options_act(or_options_t *old_options);
506
507
static int options_transition_allowed(or_options_t *old, or_options_t *new,
                                      char **msg);
508
509
510
511
static int options_transition_affects_workers(or_options_t *old_options,
                                              or_options_t *new_options);
static int options_transition_affects_descriptor(or_options_t *old_options,
                                                 or_options_t *new_options);
512
static int check_nickname_list(const char *lst, const char *name, char **msg);
513
static void config_register_addressmaps(or_options_t *options);
514

515
static int parse_bridge_line(const char *line, int validate_only);
516
517
518
static int parse_dir_server_line(const char *line,
                                 authority_type_t required_type,
                                 int validate_only);
519
static int validate_data_directory(or_options_t *options);
520
static int write_configuration_file(const char *fname, or_options_t *options);
521
static config_line_t *get_assigned_option(config_format_t *fmt,
522
523
                                          void *options, const char *key,
                                          int escape_val);
524
static void config_init(config_format_t *fmt, void *options);
525
static int or_state_validate(or_state_t *old_options, or_state_t *options,
526
                             int from_setconf, char **msg);
527
528
static int or_state_load(void);
static int options_init_logs(or_options_t *options, int validate_only);
529

530
531
532
static int is_listening_on_low_port(uint16_t port_option,
                                    const config_line_t *listen_options);

533
534
static uint64_t config_parse_memunit(const char *s, int *ok);
static int config_parse_interval(const char *s, int *ok);
535
static void init_libevent(void);
536
static int opt_streq(const char *s1, const char *s2);
537

538
/** Magic value for or_options_t. */
539
540
#define OR_OPTIONS_MAGIC 9090909

541
/** Configuration format for or_options_t. */
542
static config_format_t options_format = {
543
544
545
  sizeof(or_options_t),
  OR_OPTIONS_MAGIC,
  STRUCT_OFFSET(or_options_t, _magic),
546
547
548
  _option_abbrevs,
  _option_vars,
  (validate_fn_t)options_validate,
549
  NULL
550
551
};

552
/** Magic value for or_state_t. */
553
554
#define OR_STATE_MAGIC 0x57A73f57

555
556
/** "Extra" variable in the state that receives lines we can't parse. This
 * lets us preserve options from versions of Tor newer than us. */
557
558
559
560
static config_var_t state_extra_var = {
  "__extra", CONFIG_TYPE_LINELIST, STRUCT_OFFSET(or_state_t, ExtraLines), NULL
};

561
/** Configuration format for or_state_t. */
562
563
564
565
static config_format_t state_format = {
  sizeof(or_state_t),
  OR_STATE_MAGIC,
  STRUCT_OFFSET(or_state_t, _magic),
566
  _state_abbrevs,
567
568
  _state_vars,
  (validate_fn_t)or_state_validate,
569
  &state_extra_var,
570
571
};

572
573
574
575
576
/*
 * Functions to read and write the global options pointer.
 */

/** Command-line and config-file options. */
577
static or_options_t *global_options = NULL;
Roger Dingledine's avatar
Roger Dingledine committed
578
/** Name of most recently read torrc file. */
579
static char *torrc_fname = NULL;
580
/** Persistent serialized state. */
581
static or_state_t *global_state = NULL;
582
583
/** Configuration Options set by command line. */
static config_line_t *global_cmdline_options = NULL;
Roger Dingledine's avatar
Roger Dingledine committed
584
/** Contents of most recently read DirPortFrontPage file. */
585
586
587
588
589
590
591
592
static char *global_dirfrontpagecontents = NULL;

/** Return the contents of our frontpage string, or NULL if not configured. */
const char *
get_dirportfrontpage(void)
{
  return global_dirfrontpagecontents;
}
593

594
/** Allocate an empty configuration object of a given format type. */
595
596
597
static void *
config_alloc(config_format_t *fmt)
{
598
  void *opts = tor_malloc_zero(fmt->size);
599
  *(uint32_t*)STRUCT_VAR_P(opts, fmt->magic_offset) = fmt->magic;
600
601
602
603
  CHECK(fmt, opts);
  return opts;
}

604
605
/** Return the currently configured options. */
or_options_t *
606
607
get_options(void)
{
608
609
610
  tor_assert(global_options);
  return global_options;
}
611

612
613
/** Change the current global options to contain <b>new_val</b> instead of
 * their current value; take action based on the new value; free the old value
614
 * as necessary.  Returns 0 on success, -1 on failure.
615
 */
616
int
617
set_options(or_options_t *new_val, char **msg)
618
{
619
  or_options_t *old_options = global_options;
620
  global_options = new_val;
621
622
  /* Note that we pass the *old* options below, for comparison. It
   * pulls the new options directly out of global_options. */
623
624
  if (options_act_reversible(old_options, msg)<0) {
    tor_assert(*msg);
625
626
627
    global_options = old_options;
    return -1;
  }
628
  if (options_act(old_options) < 0) { /* acting on the options failed. die. */
629
    log_err(LD_BUG,
Roger Dingledine's avatar
Roger Dingledine committed
630
            "Acting on config options left us in a broken state. Dying.");
631
632
    exit(1);
  }
633
634

  config_free(&options_format, old_options);
635
636

  return 0;
637
638
}

639
extern const char tor_git_revision[]; /* from tor_main.c */
640

641
/** The version of this Tor process, as parsed. */
642
643
static char *_version = NULL;

644
/** Return the current Tor version. */
645
646
647
const char *
get_version(void)
{
648
  if (_version == NULL) {
649
650
    if (strlen(tor_git_revision)) {
      size_t len = strlen(VERSION)+strlen(tor_git_revision)+16;
651
      _version = tor_malloc(len);
652
      tor_snprintf(_version, len, "%s (git-%s)", VERSION, tor_git_revision);
653
    } else {
654
      _version = tor_strdup(VERSION);
655
656
    }
  }
657
  return _version;
658
659
}

660
661
662
663
664
/** Release additional memory allocated in options
 */
static void
or_options_free(or_options_t *options)
{
665
666
667
  if (!options)
    return;

668
  routerset_free(options->_ExcludeExitNodesUnion);
669
670
671
  config_free(&options_format, options);
}

672
673
/** Release all memory and resources held by global configuration structures.
 */
674
675
676
void
config_free_all(void)
{
677
678
679
680
681
682
683
684
685
  or_options_free(global_options);
  global_options = NULL;

  config_free(&state_format, global_state);
  global_state = NULL;

  config_free_lines(global_cmdline_options);
  global_cmdline_options = NULL;

686
  tor_free(torrc_fname);
687
  tor_free(_version);
688
  tor_free(global_dirfrontpagecontents);
689
690
}

691
692
693
694
695
/** Make <b>address</b> -- a piece of information related to our operation as
 * a client -- safe to log according to the settings in options->SafeLogging,
 * and return it.
 *
 * (We return "[scrubbed]" if SafeLogging is "1", and address otherwise.)
696
697
 */
const char *
698
safe_str_client(const char *address)
699
{
700
  tor_assert(address);
701
  if (get_options()->_SafeLogging == SAFELOG_SCRUB_ALL)
702
703
704
705
706
    return "[scrubbed]";
  else
    return address;
}

707
708
709
710
711
712
/** Make <b>address</b> -- a piece of information of unspecified sensitivity
 * -- safe to log according to the settings in options->SafeLogging, and
 * return it.
 *
 * (We return "[scrubbed]" if SafeLogging is anything besides "0", and address
 * otherwise.)
713
714
 */
const char *
715
716
safe_str(const char *address)
{
717
  tor_assert(address);
718
  if (get_options()->_SafeLogging != SAFELOG_SCRUB_NONE)
719
720
721
722
723
    return "[scrubbed]";
  else
    return address;
}

724
/** Equivalent to escaped(safe_str_client(address)).  See reentrancy note on
725
726
 * escaped(): don't use this outside the main thread, or twice in the same
 * log statement. */
727
const char *
728
escaped_safe_str_client(const char *address)
729
{
730
  if (get_options()->_SafeLogging == SAFELOG_SCRUB_ALL)
731
732
733
734
735
    return "[scrubbed]";
  else
    return escaped(address);
}

736
/** Equivalent to escaped(safe_str(address)).  See reentrancy note on
737
738
 * escaped(): don't use this outside the main thread, or twice in the same
 * log statement. */
739
740
741
const char *
escaped_safe_str(const char *address)
{
742
  if (get_options()->_SafeLogging != SAFELOG_SCRUB_NONE)
743
744
745
746
747
    return "[scrubbed]";
  else
    return escaped(address);
}

748
749
/** Add the default directory authorities directly into the trusted dir list,
 * but only add them insofar as they share bits with <b>type</b>. */
750
static void
751
add_default_trusted_dir_authorities(authority_type_t type)
752
{
753
  int i;
754
  const char *dirservers[] = {
755
756
757
    "moria1 orport=9101 no-v2 "
      "v3ident=D586D18309DED4CD6D57C18FDB97EFA96D330566 "
      "128.31.0.39:9131 9695 DFC3 5FFE B861 329B 9F1A B04C 4639 7020 CE31",
758
    "tor26 v1 orport=443 v3ident=14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 "
Peter Palfrader's avatar
Peter Palfrader committed
759
      "86.59.21.38:80 847B 1F85 0344 D787 6491 A548 92F9 0493 4E4E B85D",
Roger Dingledine's avatar
Roger Dingledine committed
760
761
    "dizum orport=443 v3ident=E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 "
      "194.109.206.212:80 7EA6 EAD6 FD83 083C 538F 4403 8BBF A077 587D D755",
762
    "Tonga orport=443 bridge no-v2 82.94.251.203:80 "
763
      "4A0C CD2D DC79 9508 3D73 F5D6 6710 0C8A 5831 F16D",
764
765
    "ides orport=9090 no-v2 v3ident=27B6B5996C426270A5C95488AA5BCEB6BCC86956 "
      "216.224.124.114:9030 F397 038A DC51 3361 35E7 B80B D99C A384 4360 292B",
766
767
768
    "gabelmoo orport=8080 no-v2 "
      "v3ident=ED03BB616EB2F60BEC80151114BB25CEF515B226 "
      "80.190.246.100:8180 F204 4413 DAC2 E02E 3D6B CF47 35A1 9BCA 1DE9 7281",
769
770
    "dannenberg orport=443 no-v2 "
      "v3ident=585769C78764D58426B8B52B6651A5A71137189A "
771
      "193.23.244.244:80 7BE6 83E6 5D48 1413 21C5 ED92 F075 C553 64AC 7123",
772
773
    "urras orport=80 no-v2 v3ident=80550987E1D626E3EBA5E5E75A458DE0626D088C "
      "208.83.223.34:443 0AD3 FA88 4D18 F89E EA2D 89C0 1937 9E0E 7FD9 4417",
774
775
776
    "maatuska orport=80 no-v2 "
      "v3ident=49015F787433103580E3B66A1707A00E60F2D15B "
      "213.115.239.118:443 BD6A 8292 55CB 08E6 6FBE 7D37 4836 3586 E46B 3810",
777
    NULL
778
  };
779
780
781
782
783
784
  for (i=0; dirservers[i]; i++) {
    if (parse_dir_server_line(dirservers[i], type, 0)<0) {
      log_err(LD_BUG, "Couldn't parse internal dirserver line %s",
              dirservers[i]);
    }
  }
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
}

/** Look at all the config options for using alternate directory
 * authorities, and make sure none of them are broken. Also, warn the
 * user if we changed any dangerous ones.
 */
static int
validate_dir_authorities(or_options_t *options, or_options_t *old_options)
{
  config_line_t *cl;

  if (options->DirServers &&
      (options->AlternateDirAuthority || options->AlternateBridgeAuthority ||
       options->AlternateHSAuthority)) {
    log_warn(LD_CONFIG,
             "You cannot set both DirServers and Alternate*Authority.");
    return -1;
  }

  /* do we want to complain to the user about being partitionable? */
  if ((options->DirServers &&
       (!old_options ||
        !config_lines_eq(options->DirServers, old_options->DirServers))) ||
      (options->AlternateDirAuthority &&
       (!old_options ||
        !config_lines_eq(options->AlternateDirAuthority,
                         old_options->AlternateDirAuthority)))) {
    log_warn(LD_CONFIG,
             "You have used DirServer or AlternateDirAuthority to "
             "specify alternate directory authorities in "
             "your configuration. This is potentially dangerous: it can "
             "make you look different from all other Tor users, and hurt "
             "your anonymity. Even if you've specified the same "
             "authorities as Tor uses by default, the defaults could "
             "change in the future. Be sure you know what you're doing.");
  }

  /* Now go through the four ways you can configure an alternate
   * set of directory authorities, and make sure none are broken. */
  for (cl = options->DirServers; cl; cl = cl->next)
825
    if (parse_dir_server_line(cl->value, NO_AUTHORITY, 1)<0)
826
827
      return -1;
  for (cl = options->AlternateBridgeAuthority; cl; cl = cl->next)
828
    if (parse_dir_server_line(cl->value, NO_AUTHORITY, 1)<0)
829
830
      return -1;
  for (cl = options->AlternateDirAuthority; cl; cl = cl->next)
831
    if (parse_dir_server_line(cl->value, NO_AUTHORITY, 1)<0)
832
833
      return -1;
  for (cl = options->AlternateHSAuthority; cl; cl = cl->next)