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 "geoip.h"
Sebastian Hahn's avatar
Sebastian Hahn committed
16
#include "rendclient.h"
Sebastian Hahn's avatar
Sebastian Hahn committed
17
#include "rendservice.h"
Sebastian Hahn's avatar
Sebastian Hahn committed
18
#include "router.h"
Sebastian Hahn's avatar
Sebastian Hahn committed
19
#include "routerlist.h"
20
21
22
#ifdef MS_WINDOWS
#include <shlobj.h>
#endif
Roger Dingledine's avatar
Roger Dingledine committed
23

Nick Mathewson's avatar
Nick Mathewson committed
24
25
/** Enumeration of types which option values can take */
typedef enum config_type_t {
26
  CONFIG_TYPE_STRING = 0,   /**< An arbitrary string. */
27
  CONFIG_TYPE_FILENAME,     /**< A filename: some prefixes get expanded. */
28
  CONFIG_TYPE_UINT,         /**< A non-negative integer less than MAX_INT */
29
30
  CONFIG_TYPE_INTERVAL,     /**< A number of seconds, with optional units*/
  CONFIG_TYPE_MEMUNIT,      /**< A number of bytes, with optional units*/
31
32
  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
33
  CONFIG_TYPE_ISOTIME,      /**< An ISO-formatted time relative to GMT. */
34
35
  CONFIG_TYPE_CSV,          /**< A list of strings, separated by commas and
                              * optional whitespace. */
36
  CONFIG_TYPE_LINELIST,     /**< Uninterpreted config lines */
37
38
39
40
41
  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.
                             */
42
43
  CONFIG_TYPE_ROUTERSET,    /**< A list of router names, addrs, and fps,
                             * parsed into a routerset_t. */
44
  CONFIG_TYPE_OBSOLETE,     /**< Obsolete (ignored) option. */
Nick Mathewson's avatar
Nick Mathewson committed
45
} config_type_t;
46

47
/** An abbreviation for a configuration option allowed on the command line. */
48
typedef struct config_abbrev_t {
49
50
  const char *abbreviated;
  const char *full;
51
  int commandline_only;
52
  int warn;
53
54
} config_abbrev_t;

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

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

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

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

Nick Mathewson's avatar
Nick Mathewson committed
123
124
125
126
/** 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>"
 */
127
128
#define VAR(name,conftype,member,initvalue)                             \
  { name, CONFIG_TYPE_ ## conftype, STRUCT_OFFSET(or_options_t, member), \
129
      initvalue }
130
131
132
/** 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
133
/** An entry for config_vars: "The option <b>name</b> is obsolete." */
134
#define OBSOLETE(name) { name, CONFIG_TYPE_OBSOLETE, 0, NULL }
135

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

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

377
  { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL }
378
};
379

380
381
/** Override default values with these if the user sets the TestingTorNetwork
 * option. */
382
static config_var_t testing_tor_network_defaults[] = {
383
  V(ServerDNSAllowBrokenConfig,  BOOL,  "1"),
384
385
386
387
388
389
390
391
392
393
  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"),
394
395
396
397
398
  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"),
399
400
  { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL }
};
401
402
#undef VAR

403
404
#define VAR(name,conftype,member,initvalue)                             \
  { name, CONFIG_TYPE_ ## conftype, STRUCT_OFFSET(or_state_t, member),  \
405
      initvalue }
406
407

/** Array of "state" variables saved to the ~/.tor/state file. */
408
static config_var_t _state_vars[] = {
409
410
411
412
413
  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
414

415
416
417
  VAR("EntryGuard",              LINELIST_S,  EntryGuards,             NULL),
  VAR("EntryGuardDownSince",     LINELIST_S,  EntryGuards,             NULL),
  VAR("EntryGuardUnlistedSince", LINELIST_S,  EntryGuards,             NULL),
418
  VAR("EntryGuardAddedBy",       LINELIST_S,  EntryGuards,             NULL),
419
  V(EntryGuards,                 LINELIST_V,  NULL),
Nick Mathewson's avatar
Nick Mathewson committed
420

421
422
423
424
425
426
  V(BWHistoryReadEnds,                ISOTIME,  NULL),
  V(BWHistoryReadInterval,            UINT,     "900"),
  V(BWHistoryReadValues,              CSV,      ""),
  V(BWHistoryWriteEnds,               ISOTIME,  NULL),
  V(BWHistoryWriteInterval,           UINT,     "900"),
  V(BWHistoryWriteValues,             CSV,      ""),
427

428
  V(TorVersion,                       STRING,   NULL),
429

430
431
  V(LastRotatedOnionKey,              ISOTIME,  NULL),
  V(LastWritten,                      ISOTIME,  NULL),
432

433
  V(TotalBuildTimes,                  UINT,     NULL),
434
  V(CircuitBuildAbandonedCount,         UINT,     "0"),
435
436
  VAR("CircuitBuildTimeBin",          LINELIST_S, BuildtimeHistogram, NULL),
  VAR("BuildtimeHistogram",           LINELIST_V, BuildtimeHistogram, NULL),
437

438
  { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL }
439
440
};

441
#undef VAR
442
#undef V
443
444
#undef OBSOLETE

445
446
/** Represents an English description of a configuration variable; used when
 * generating configuration file comments. */
447
448
449
450
451
typedef struct config_var_description_t {
  const char *name;
  const char *description;
} config_var_description_t;

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

457
458
459
/** Information on the keys, value types, key-to-struct-member mappings,
 * variable descriptions, validation functions, and abbreviations for a
 * configuration or storage format. */
460
typedef struct {
461
462
463
  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
464
  off_t magic_offset; /**< Offset of the magic value within the struct. */
465
  config_abbrev_t *abbrevs; /**< List of abbreviations that we expand when
Roger Dingledine's avatar
Roger Dingledine committed
466
                             * parsing this format. */
467
468
469
  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
470
471
472
  /** If present, extra is a LINELIST variable for unrecognized
   * lines.  Otherwise, unrecognized lines are an error. */
  config_var_t *extra;
473
474
} config_format_t;

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

483
484
485
#ifdef MS_WINDOWS
static char *get_windows_conf_root(void);
#endif
486
static void config_line_append(config_line_t **lst,
487
                               const char *key, const char *val);
488
489
static void option_clear(config_format_t *fmt, or_options_t *options,
                         config_var_t *var);
490
static void option_reset(config_format_t *fmt, or_options_t *options,
491
                         config_var_t *var, int use_defaults);
492
static void config_free(config_format_t *fmt, void *options);
493
static int config_lines_eq(config_line_t *a, config_line_t *b);
494
static int option_is_same(config_format_t *fmt,
495
496
                          or_options_t *o1, or_options_t *o2,
                          const char *name);
497
static or_options_t *options_dup(config_format_t *fmt, or_options_t *old);
498
499
500
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);
501
static int options_act(or_options_t *old_options);
502
503
static int options_transition_allowed(or_options_t *old, or_options_t *new,
                                      char **msg);
504
505
506
507
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);
508
static int check_nickname_list(const char *lst, const char *name, char **msg);
509
static void config_register_addressmaps(or_options_t *options);
510

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

526
527
528
static int is_listening_on_low_port(uint16_t port_option,
                                    const config_line_t *listen_options);

529
530
static uint64_t config_parse_memunit(const char *s, int *ok);
static int config_parse_interval(const char *s, int *ok);
531
static void init_libevent(void);
532
static int opt_streq(const char *s1, const char *s2);
533

534
/** Magic value for or_options_t. */
535
536
#define OR_OPTIONS_MAGIC 9090909

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

548
/** Magic value for or_state_t. */
549
550
#define OR_STATE_MAGIC 0x57A73f57

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

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

568
569
570
571
572
/*
 * Functions to read and write the global options pointer.
 */

/** Command-line and config-file options. */
573
static or_options_t *global_options = NULL;
Roger Dingledine's avatar
Roger Dingledine committed
574
/** Name of most recently read torrc file. */
575
static char *torrc_fname = NULL;
576
/** Persistent serialized state. */
577
static or_state_t *global_state = NULL;
578
579
/** Configuration Options set by command line. */
static config_line_t *global_cmdline_options = NULL;
Roger Dingledine's avatar
Roger Dingledine committed
580
/** Contents of most recently read DirPortFrontPage file. */
581
582
583
584
585
586
587
588
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;
}
589

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

600
601
/** Return the currently configured options. */
or_options_t *
602
603
get_options(void)
{
604
605
606
  tor_assert(global_options);
  return global_options;
}
607

608
609
/** 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
610
 * as necessary.  Returns 0 on success, -1 on failure.
611
 */
612
int
613
set_options(or_options_t *new_val, char **msg)
614
{
615
  or_options_t *old_options = global_options;
616
  global_options = new_val;
617
618
  /* Note that we pass the *old* options below, for comparison. It
   * pulls the new options directly out of global_options. */
619
620
  if (options_act_reversible(old_options, msg)<0) {
    tor_assert(*msg);
621
622
623
    global_options = old_options;
    return -1;
  }
624
  if (options_act(old_options) < 0) { /* acting on the options failed. die. */
625
    log_err(LD_BUG,
Roger Dingledine's avatar
Roger Dingledine committed
626
            "Acting on config options left us in a broken state. Dying.");
627
628
    exit(1);
  }
629
630

  config_free(&options_format, old_options);
631
632

  return 0;
633
634
}

635
extern const char tor_git_revision[]; /* from tor_main.c */
636

637
/** The version of this Tor process, as parsed. */
638
639
static char *_version = NULL;

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

656
657
658
659
660
/** Release additional memory allocated in options
 */
static void
or_options_free(or_options_t *options)
{
661
662
663
  if (!options)
    return;

664
  routerset_free(options->_ExcludeExitNodesUnion);
665
666
667
  config_free(&options_format, options);
}

668
669
/** Release all memory and resources held by global configuration structures.
 */
670
671
672
void
config_free_all(void)
{
673
674
675
676
677
678
679
680
681
  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;

682
  tor_free(torrc_fname);
683
  tor_free(_version);
684
  tor_free(global_dirfrontpagecontents);
685
686
}

687
688
689
690
691
/** 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.)
692
693
 */
const char *
694
safe_str_client(const char *address)
695
{
696
  tor_assert(address);
697
  if (get_options()->_SafeLogging == SAFELOG_SCRUB_ALL)
698
699
700
701
702
    return "[scrubbed]";
  else
    return address;
}

703
704
705
706
707
708
/** 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.)
709
710
 */
const char *
711
712
safe_str(const char *address)
{
713
  tor_assert(address);
714
  if (get_options()->_SafeLogging != SAFELOG_SCRUB_NONE)
715
716
717
718
719
    return "[scrubbed]";
  else
    return address;
}

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

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

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

/** 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)
821
    if (parse_dir_server_line(cl->value, NO_AUTHORITY, 1)<0)
822
823
      return -1;
  for (cl = options->AlternateBridgeAuthority; cl; cl = cl->next)
824
    if (parse_dir_server_line(cl->value, NO_AUTHORITY, 1)<0)
825
826
      return -1;
  for (cl = options->AlternateDirAuthority; cl; cl = cl->next)
827
    if (parse_dir_server_line(cl->value, NO_AUTHORITY, 1)<0)
828
829
      return -1;
  for (cl = options->AlternateHSAuthority; cl; cl = cl->next)
830
    if (parse_dir_server_line(cl->value, NO_AUTHORITY, 1)<0)
831
832
833
834
835
836
837
838
839
840
841
842
843
      return -1;
  return 0;
}

/** Look at all the config options and assign new dir authorities
 * as appropriate.
 */
static int
consider_adding_dir_authorities(or_options_t *options,
                                or_options_t *old_options)
{
  config_line_t *cl;
  int need_to_update =