scan_rr.go 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938
  1. package dns
  2. import (
  3. "encoding/base64"
  4. "net"
  5. "strconv"
  6. "strings"
  7. )
  8. // Parse the rdata of each rrtype.
  9. // All data from the channel c is either zString or zBlank.
  10. // After the rdata there may come a zBlank and then a zNewline
  11. // or immediately a zNewline. If this is not the case we flag
  12. // an *ParseError: garbage after rdata.
  13. func setRR(h RR_Header, c *zlexer, o, f string) (RR, *ParseError) {
  14. var rr RR
  15. if newFn, ok := TypeToRR[h.Rrtype]; ok && canParseAsRR(h.Rrtype) {
  16. rr = newFn()
  17. *rr.Header() = h
  18. } else {
  19. rr = &RFC3597{Hdr: h}
  20. }
  21. err := rr.parse(c, o, f)
  22. if err != nil {
  23. return nil, err
  24. }
  25. return rr, nil
  26. }
  27. // canParseAsRR returns true if the record type can be parsed as a
  28. // concrete RR. It blacklists certain record types that must be parsed
  29. // according to RFC 3597 because they lack a presentation format.
  30. func canParseAsRR(rrtype uint16) bool {
  31. switch rrtype {
  32. case TypeANY, TypeNULL, TypeOPT, TypeTSIG:
  33. return false
  34. default:
  35. return true
  36. }
  37. }
  38. // A remainder of the rdata with embedded spaces, return the parsed string (sans the spaces)
  39. // or an error
  40. func endingToString(c *zlexer, errstr, f string) (string, *ParseError) {
  41. var s string
  42. l, _ := c.Next() // zString
  43. for l.value != zNewline && l.value != zEOF {
  44. if l.err {
  45. return s, &ParseError{f, errstr, l}
  46. }
  47. switch l.value {
  48. case zString:
  49. s += l.token
  50. case zBlank: // Ok
  51. default:
  52. return "", &ParseError{f, errstr, l}
  53. }
  54. l, _ = c.Next()
  55. }
  56. return s, nil
  57. }
  58. // A remainder of the rdata with embedded spaces, split on unquoted whitespace
  59. // and return the parsed string slice or an error
  60. func endingToTxtSlice(c *zlexer, errstr, f string) ([]string, *ParseError) {
  61. // Get the remaining data until we see a zNewline
  62. l, _ := c.Next()
  63. if l.err {
  64. return nil, &ParseError{f, errstr, l}
  65. }
  66. // Build the slice
  67. s := make([]string, 0)
  68. quote := false
  69. empty := false
  70. for l.value != zNewline && l.value != zEOF {
  71. if l.err {
  72. return nil, &ParseError{f, errstr, l}
  73. }
  74. switch l.value {
  75. case zString:
  76. empty = false
  77. if len(l.token) > 255 {
  78. // split up tokens that are larger than 255 into 255-chunks
  79. sx := []string{}
  80. p, i := 0, 255
  81. for {
  82. if i <= len(l.token) {
  83. sx = append(sx, l.token[p:i])
  84. } else {
  85. sx = append(sx, l.token[p:])
  86. break
  87. }
  88. p, i = p+255, i+255
  89. }
  90. s = append(s, sx...)
  91. break
  92. }
  93. s = append(s, l.token)
  94. case zBlank:
  95. if quote {
  96. // zBlank can only be seen in between txt parts.
  97. return nil, &ParseError{f, errstr, l}
  98. }
  99. case zQuote:
  100. if empty && quote {
  101. s = append(s, "")
  102. }
  103. quote = !quote
  104. empty = true
  105. default:
  106. return nil, &ParseError{f, errstr, l}
  107. }
  108. l, _ = c.Next()
  109. }
  110. if quote {
  111. return nil, &ParseError{f, errstr, l}
  112. }
  113. return s, nil
  114. }
  115. func (rr *A) parse(c *zlexer, o, f string) *ParseError {
  116. l, _ := c.Next()
  117. if len(l.token) == 0 { // dynamic update rr.
  118. return slurpRemainder(c, f)
  119. }
  120. rr.A = net.ParseIP(l.token)
  121. if rr.A == nil || l.err {
  122. return &ParseError{f, "bad A A", l}
  123. }
  124. return slurpRemainder(c, f)
  125. }
  126. func (rr *AAAA) parse(c *zlexer, o, f string) *ParseError {
  127. l, _ := c.Next()
  128. if len(l.token) == 0 { // dynamic update rr.
  129. return slurpRemainder(c, f)
  130. }
  131. rr.AAAA = net.ParseIP(l.token)
  132. if rr.AAAA == nil || l.err {
  133. return &ParseError{f, "bad AAAA AAAA", l}
  134. }
  135. return slurpRemainder(c, f)
  136. }
  137. func (rr *NS) parse(c *zlexer, o, f string) *ParseError {
  138. l, _ := c.Next()
  139. rr.Ns = l.token
  140. if len(l.token) == 0 { // dynamic update rr.
  141. return slurpRemainder(c, f)
  142. }
  143. name, nameOk := toAbsoluteName(l.token, o)
  144. if l.err || !nameOk {
  145. return &ParseError{f, "bad NS Ns", l}
  146. }
  147. rr.Ns = name
  148. return slurpRemainder(c, f)
  149. }
  150. func (rr *PTR) parse(c *zlexer, o, f string) *ParseError {
  151. l, _ := c.Next()
  152. rr.Ptr = l.token
  153. if len(l.token) == 0 { // dynamic update rr.
  154. return slurpRemainder(c, f)
  155. }
  156. name, nameOk := toAbsoluteName(l.token, o)
  157. if l.err || !nameOk {
  158. return &ParseError{f, "bad PTR Ptr", l}
  159. }
  160. rr.Ptr = name
  161. return slurpRemainder(c, f)
  162. }
  163. func (rr *NSAPPTR) parse(c *zlexer, o, f string) *ParseError {
  164. l, _ := c.Next()
  165. rr.Ptr = l.token
  166. if len(l.token) == 0 { // dynamic update rr.
  167. return slurpRemainder(c, f)
  168. }
  169. name, nameOk := toAbsoluteName(l.token, o)
  170. if l.err || !nameOk {
  171. return &ParseError{f, "bad NSAP-PTR Ptr", l}
  172. }
  173. rr.Ptr = name
  174. return slurpRemainder(c, f)
  175. }
  176. func (rr *RP) parse(c *zlexer, o, f string) *ParseError {
  177. l, _ := c.Next()
  178. rr.Mbox = l.token
  179. if len(l.token) == 0 { // dynamic update rr.
  180. return slurpRemainder(c, f)
  181. }
  182. mbox, mboxOk := toAbsoluteName(l.token, o)
  183. if l.err || !mboxOk {
  184. return &ParseError{f, "bad RP Mbox", l}
  185. }
  186. rr.Mbox = mbox
  187. c.Next() // zBlank
  188. l, _ = c.Next()
  189. rr.Txt = l.token
  190. txt, txtOk := toAbsoluteName(l.token, o)
  191. if l.err || !txtOk {
  192. return &ParseError{f, "bad RP Txt", l}
  193. }
  194. rr.Txt = txt
  195. return slurpRemainder(c, f)
  196. }
  197. func (rr *MR) parse(c *zlexer, o, f string) *ParseError {
  198. l, _ := c.Next()
  199. rr.Mr = l.token
  200. if len(l.token) == 0 { // dynamic update rr.
  201. return slurpRemainder(c, f)
  202. }
  203. name, nameOk := toAbsoluteName(l.token, o)
  204. if l.err || !nameOk {
  205. return &ParseError{f, "bad MR Mr", l}
  206. }
  207. rr.Mr = name
  208. return slurpRemainder(c, f)
  209. }
  210. func (rr *MB) parse(c *zlexer, o, f string) *ParseError {
  211. l, _ := c.Next()
  212. rr.Mb = l.token
  213. if len(l.token) == 0 { // dynamic update rr.
  214. return slurpRemainder(c, f)
  215. }
  216. name, nameOk := toAbsoluteName(l.token, o)
  217. if l.err || !nameOk {
  218. return &ParseError{f, "bad MB Mb", l}
  219. }
  220. rr.Mb = name
  221. return slurpRemainder(c, f)
  222. }
  223. func (rr *MG) parse(c *zlexer, o, f string) *ParseError {
  224. l, _ := c.Next()
  225. rr.Mg = l.token
  226. if len(l.token) == 0 { // dynamic update rr.
  227. return slurpRemainder(c, f)
  228. }
  229. name, nameOk := toAbsoluteName(l.token, o)
  230. if l.err || !nameOk {
  231. return &ParseError{f, "bad MG Mg", l}
  232. }
  233. rr.Mg = name
  234. return slurpRemainder(c, f)
  235. }
  236. func (rr *HINFO) parse(c *zlexer, o, f string) *ParseError {
  237. chunks, e := endingToTxtSlice(c, "bad HINFO Fields", f)
  238. if e != nil {
  239. return e
  240. }
  241. if ln := len(chunks); ln == 0 {
  242. return nil
  243. } else if ln == 1 {
  244. // Can we split it?
  245. if out := strings.Fields(chunks[0]); len(out) > 1 {
  246. chunks = out
  247. } else {
  248. chunks = append(chunks, "")
  249. }
  250. }
  251. rr.Cpu = chunks[0]
  252. rr.Os = strings.Join(chunks[1:], " ")
  253. return nil
  254. }
  255. func (rr *MINFO) parse(c *zlexer, o, f string) *ParseError {
  256. l, _ := c.Next()
  257. rr.Rmail = l.token
  258. if len(l.token) == 0 { // dynamic update rr.
  259. return slurpRemainder(c, f)
  260. }
  261. rmail, rmailOk := toAbsoluteName(l.token, o)
  262. if l.err || !rmailOk {
  263. return &ParseError{f, "bad MINFO Rmail", l}
  264. }
  265. rr.Rmail = rmail
  266. c.Next() // zBlank
  267. l, _ = c.Next()
  268. rr.Email = l.token
  269. email, emailOk := toAbsoluteName(l.token, o)
  270. if l.err || !emailOk {
  271. return &ParseError{f, "bad MINFO Email", l}
  272. }
  273. rr.Email = email
  274. return slurpRemainder(c, f)
  275. }
  276. func (rr *MF) parse(c *zlexer, o, f string) *ParseError {
  277. l, _ := c.Next()
  278. rr.Mf = l.token
  279. if len(l.token) == 0 { // dynamic update rr.
  280. return slurpRemainder(c, f)
  281. }
  282. name, nameOk := toAbsoluteName(l.token, o)
  283. if l.err || !nameOk {
  284. return &ParseError{f, "bad MF Mf", l}
  285. }
  286. rr.Mf = name
  287. return slurpRemainder(c, f)
  288. }
  289. func (rr *MD) parse(c *zlexer, o, f string) *ParseError {
  290. l, _ := c.Next()
  291. rr.Md = l.token
  292. if len(l.token) == 0 { // dynamic update rr.
  293. return slurpRemainder(c, f)
  294. }
  295. name, nameOk := toAbsoluteName(l.token, o)
  296. if l.err || !nameOk {
  297. return &ParseError{f, "bad MD Md", l}
  298. }
  299. rr.Md = name
  300. return slurpRemainder(c, f)
  301. }
  302. func (rr *MX) parse(c *zlexer, o, f string) *ParseError {
  303. l, _ := c.Next()
  304. if len(l.token) == 0 { // dynamic update rr.
  305. return slurpRemainder(c, f)
  306. }
  307. i, e := strconv.ParseUint(l.token, 10, 16)
  308. if e != nil || l.err {
  309. return &ParseError{f, "bad MX Pref", l}
  310. }
  311. rr.Preference = uint16(i)
  312. c.Next() // zBlank
  313. l, _ = c.Next() // zString
  314. rr.Mx = l.token
  315. name, nameOk := toAbsoluteName(l.token, o)
  316. if l.err || !nameOk {
  317. return &ParseError{f, "bad MX Mx", l}
  318. }
  319. rr.Mx = name
  320. return slurpRemainder(c, f)
  321. }
  322. func (rr *RT) parse(c *zlexer, o, f string) *ParseError {
  323. l, _ := c.Next()
  324. if len(l.token) == 0 { // dynamic update rr.
  325. return slurpRemainder(c, f)
  326. }
  327. i, e := strconv.ParseUint(l.token, 10, 16)
  328. if e != nil {
  329. return &ParseError{f, "bad RT Preference", l}
  330. }
  331. rr.Preference = uint16(i)
  332. c.Next() // zBlank
  333. l, _ = c.Next() // zString
  334. rr.Host = l.token
  335. name, nameOk := toAbsoluteName(l.token, o)
  336. if l.err || !nameOk {
  337. return &ParseError{f, "bad RT Host", l}
  338. }
  339. rr.Host = name
  340. return slurpRemainder(c, f)
  341. }
  342. func (rr *AFSDB) parse(c *zlexer, o, f string) *ParseError {
  343. l, _ := c.Next()
  344. if len(l.token) == 0 { // dynamic update rr.
  345. return slurpRemainder(c, f)
  346. }
  347. i, e := strconv.ParseUint(l.token, 10, 16)
  348. if e != nil || l.err {
  349. return &ParseError{f, "bad AFSDB Subtype", l}
  350. }
  351. rr.Subtype = uint16(i)
  352. c.Next() // zBlank
  353. l, _ = c.Next() // zString
  354. rr.Hostname = l.token
  355. name, nameOk := toAbsoluteName(l.token, o)
  356. if l.err || !nameOk {
  357. return &ParseError{f, "bad AFSDB Hostname", l}
  358. }
  359. rr.Hostname = name
  360. return slurpRemainder(c, f)
  361. }
  362. func (rr *X25) parse(c *zlexer, o, f string) *ParseError {
  363. l, _ := c.Next()
  364. if len(l.token) == 0 { // dynamic update rr.
  365. return slurpRemainder(c, f)
  366. }
  367. if l.err {
  368. return &ParseError{f, "bad X25 PSDNAddress", l}
  369. }
  370. rr.PSDNAddress = l.token
  371. return slurpRemainder(c, f)
  372. }
  373. func (rr *KX) parse(c *zlexer, o, f string) *ParseError {
  374. l, _ := c.Next()
  375. if len(l.token) == 0 { // dynamic update rr.
  376. return slurpRemainder(c, f)
  377. }
  378. i, e := strconv.ParseUint(l.token, 10, 16)
  379. if e != nil || l.err {
  380. return &ParseError{f, "bad KX Pref", l}
  381. }
  382. rr.Preference = uint16(i)
  383. c.Next() // zBlank
  384. l, _ = c.Next() // zString
  385. rr.Exchanger = l.token
  386. name, nameOk := toAbsoluteName(l.token, o)
  387. if l.err || !nameOk {
  388. return &ParseError{f, "bad KX Exchanger", l}
  389. }
  390. rr.Exchanger = name
  391. return slurpRemainder(c, f)
  392. }
  393. func (rr *CNAME) parse(c *zlexer, o, f string) *ParseError {
  394. l, _ := c.Next()
  395. rr.Target = l.token
  396. if len(l.token) == 0 { // dynamic update rr.
  397. return slurpRemainder(c, f)
  398. }
  399. name, nameOk := toAbsoluteName(l.token, o)
  400. if l.err || !nameOk {
  401. return &ParseError{f, "bad CNAME Target", l}
  402. }
  403. rr.Target = name
  404. return slurpRemainder(c, f)
  405. }
  406. func (rr *DNAME) parse(c *zlexer, o, f string) *ParseError {
  407. l, _ := c.Next()
  408. rr.Target = l.token
  409. if len(l.token) == 0 { // dynamic update rr.
  410. return slurpRemainder(c, f)
  411. }
  412. name, nameOk := toAbsoluteName(l.token, o)
  413. if l.err || !nameOk {
  414. return &ParseError{f, "bad DNAME Target", l}
  415. }
  416. rr.Target = name
  417. return slurpRemainder(c, f)
  418. }
  419. func (rr *SOA) parse(c *zlexer, o, f string) *ParseError {
  420. l, _ := c.Next()
  421. rr.Ns = l.token
  422. if len(l.token) == 0 { // dynamic update rr.
  423. return slurpRemainder(c, f)
  424. }
  425. ns, nsOk := toAbsoluteName(l.token, o)
  426. if l.err || !nsOk {
  427. return &ParseError{f, "bad SOA Ns", l}
  428. }
  429. rr.Ns = ns
  430. c.Next() // zBlank
  431. l, _ = c.Next()
  432. rr.Mbox = l.token
  433. mbox, mboxOk := toAbsoluteName(l.token, o)
  434. if l.err || !mboxOk {
  435. return &ParseError{f, "bad SOA Mbox", l}
  436. }
  437. rr.Mbox = mbox
  438. c.Next() // zBlank
  439. var (
  440. v uint32
  441. ok bool
  442. )
  443. for i := 0; i < 5; i++ {
  444. l, _ = c.Next()
  445. if l.err {
  446. return &ParseError{f, "bad SOA zone parameter", l}
  447. }
  448. if j, e := strconv.ParseUint(l.token, 10, 32); e != nil {
  449. if i == 0 {
  450. // Serial must be a number
  451. return &ParseError{f, "bad SOA zone parameter", l}
  452. }
  453. // We allow other fields to be unitful duration strings
  454. if v, ok = stringToTTL(l.token); !ok {
  455. return &ParseError{f, "bad SOA zone parameter", l}
  456. }
  457. } else {
  458. v = uint32(j)
  459. }
  460. switch i {
  461. case 0:
  462. rr.Serial = v
  463. c.Next() // zBlank
  464. case 1:
  465. rr.Refresh = v
  466. c.Next() // zBlank
  467. case 2:
  468. rr.Retry = v
  469. c.Next() // zBlank
  470. case 3:
  471. rr.Expire = v
  472. c.Next() // zBlank
  473. case 4:
  474. rr.Minttl = v
  475. }
  476. }
  477. return slurpRemainder(c, f)
  478. }
  479. func (rr *SRV) parse(c *zlexer, o, f string) *ParseError {
  480. l, _ := c.Next()
  481. if len(l.token) == 0 { // dynamic update rr.
  482. return slurpRemainder(c, f)
  483. }
  484. i, e := strconv.ParseUint(l.token, 10, 16)
  485. if e != nil || l.err {
  486. return &ParseError{f, "bad SRV Priority", l}
  487. }
  488. rr.Priority = uint16(i)
  489. c.Next() // zBlank
  490. l, _ = c.Next() // zString
  491. i, e = strconv.ParseUint(l.token, 10, 16)
  492. if e != nil || l.err {
  493. return &ParseError{f, "bad SRV Weight", l}
  494. }
  495. rr.Weight = uint16(i)
  496. c.Next() // zBlank
  497. l, _ = c.Next() // zString
  498. i, e = strconv.ParseUint(l.token, 10, 16)
  499. if e != nil || l.err {
  500. return &ParseError{f, "bad SRV Port", l}
  501. }
  502. rr.Port = uint16(i)
  503. c.Next() // zBlank
  504. l, _ = c.Next() // zString
  505. rr.Target = l.token
  506. name, nameOk := toAbsoluteName(l.token, o)
  507. if l.err || !nameOk {
  508. return &ParseError{f, "bad SRV Target", l}
  509. }
  510. rr.Target = name
  511. return slurpRemainder(c, f)
  512. }
  513. func (rr *NAPTR) parse(c *zlexer, o, f string) *ParseError {
  514. l, _ := c.Next()
  515. if len(l.token) == 0 { // dynamic update rr.
  516. return slurpRemainder(c, f)
  517. }
  518. i, e := strconv.ParseUint(l.token, 10, 16)
  519. if e != nil || l.err {
  520. return &ParseError{f, "bad NAPTR Order", l}
  521. }
  522. rr.Order = uint16(i)
  523. c.Next() // zBlank
  524. l, _ = c.Next() // zString
  525. i, e = strconv.ParseUint(l.token, 10, 16)
  526. if e != nil || l.err {
  527. return &ParseError{f, "bad NAPTR Preference", l}
  528. }
  529. rr.Preference = uint16(i)
  530. // Flags
  531. c.Next() // zBlank
  532. l, _ = c.Next() // _QUOTE
  533. if l.value != zQuote {
  534. return &ParseError{f, "bad NAPTR Flags", l}
  535. }
  536. l, _ = c.Next() // Either String or Quote
  537. if l.value == zString {
  538. rr.Flags = l.token
  539. l, _ = c.Next() // _QUOTE
  540. if l.value != zQuote {
  541. return &ParseError{f, "bad NAPTR Flags", l}
  542. }
  543. } else if l.value == zQuote {
  544. rr.Flags = ""
  545. } else {
  546. return &ParseError{f, "bad NAPTR Flags", l}
  547. }
  548. // Service
  549. c.Next() // zBlank
  550. l, _ = c.Next() // _QUOTE
  551. if l.value != zQuote {
  552. return &ParseError{f, "bad NAPTR Service", l}
  553. }
  554. l, _ = c.Next() // Either String or Quote
  555. if l.value == zString {
  556. rr.Service = l.token
  557. l, _ = c.Next() // _QUOTE
  558. if l.value != zQuote {
  559. return &ParseError{f, "bad NAPTR Service", l}
  560. }
  561. } else if l.value == zQuote {
  562. rr.Service = ""
  563. } else {
  564. return &ParseError{f, "bad NAPTR Service", l}
  565. }
  566. // Regexp
  567. c.Next() // zBlank
  568. l, _ = c.Next() // _QUOTE
  569. if l.value != zQuote {
  570. return &ParseError{f, "bad NAPTR Regexp", l}
  571. }
  572. l, _ = c.Next() // Either String or Quote
  573. if l.value == zString {
  574. rr.Regexp = l.token
  575. l, _ = c.Next() // _QUOTE
  576. if l.value != zQuote {
  577. return &ParseError{f, "bad NAPTR Regexp", l}
  578. }
  579. } else if l.value == zQuote {
  580. rr.Regexp = ""
  581. } else {
  582. return &ParseError{f, "bad NAPTR Regexp", l}
  583. }
  584. // After quote no space??
  585. c.Next() // zBlank
  586. l, _ = c.Next() // zString
  587. rr.Replacement = l.token
  588. name, nameOk := toAbsoluteName(l.token, o)
  589. if l.err || !nameOk {
  590. return &ParseError{f, "bad NAPTR Replacement", l}
  591. }
  592. rr.Replacement = name
  593. return slurpRemainder(c, f)
  594. }
  595. func (rr *TALINK) parse(c *zlexer, o, f string) *ParseError {
  596. l, _ := c.Next()
  597. rr.PreviousName = l.token
  598. if len(l.token) == 0 { // dynamic update rr.
  599. return slurpRemainder(c, f)
  600. }
  601. previousName, previousNameOk := toAbsoluteName(l.token, o)
  602. if l.err || !previousNameOk {
  603. return &ParseError{f, "bad TALINK PreviousName", l}
  604. }
  605. rr.PreviousName = previousName
  606. c.Next() // zBlank
  607. l, _ = c.Next()
  608. rr.NextName = l.token
  609. nextName, nextNameOk := toAbsoluteName(l.token, o)
  610. if l.err || !nextNameOk {
  611. return &ParseError{f, "bad TALINK NextName", l}
  612. }
  613. rr.NextName = nextName
  614. return slurpRemainder(c, f)
  615. }
  616. func (rr *LOC) parse(c *zlexer, o, f string) *ParseError {
  617. // Non zero defaults for LOC record, see RFC 1876, Section 3.
  618. rr.HorizPre = 165 // 10000
  619. rr.VertPre = 162 // 10
  620. rr.Size = 18 // 1
  621. ok := false
  622. // North
  623. l, _ := c.Next()
  624. if len(l.token) == 0 { // dynamic update rr.
  625. return nil
  626. }
  627. i, e := strconv.ParseUint(l.token, 10, 32)
  628. if e != nil || l.err {
  629. return &ParseError{f, "bad LOC Latitude", l}
  630. }
  631. rr.Latitude = 1000 * 60 * 60 * uint32(i)
  632. c.Next() // zBlank
  633. // Either number, 'N' or 'S'
  634. l, _ = c.Next()
  635. if rr.Latitude, ok = locCheckNorth(l.token, rr.Latitude); ok {
  636. goto East
  637. }
  638. i, e = strconv.ParseUint(l.token, 10, 32)
  639. if e != nil || l.err {
  640. return &ParseError{f, "bad LOC Latitude minutes", l}
  641. }
  642. rr.Latitude += 1000 * 60 * uint32(i)
  643. c.Next() // zBlank
  644. l, _ = c.Next()
  645. if i, e := strconv.ParseFloat(l.token, 32); e != nil || l.err {
  646. return &ParseError{f, "bad LOC Latitude seconds", l}
  647. } else {
  648. rr.Latitude += uint32(1000 * i)
  649. }
  650. c.Next() // zBlank
  651. // Either number, 'N' or 'S'
  652. l, _ = c.Next()
  653. if rr.Latitude, ok = locCheckNorth(l.token, rr.Latitude); ok {
  654. goto East
  655. }
  656. // If still alive, flag an error
  657. return &ParseError{f, "bad LOC Latitude North/South", l}
  658. East:
  659. // East
  660. c.Next() // zBlank
  661. l, _ = c.Next()
  662. if i, e := strconv.ParseUint(l.token, 10, 32); e != nil || l.err {
  663. return &ParseError{f, "bad LOC Longitude", l}
  664. } else {
  665. rr.Longitude = 1000 * 60 * 60 * uint32(i)
  666. }
  667. c.Next() // zBlank
  668. // Either number, 'E' or 'W'
  669. l, _ = c.Next()
  670. if rr.Longitude, ok = locCheckEast(l.token, rr.Longitude); ok {
  671. goto Altitude
  672. }
  673. if i, e := strconv.ParseUint(l.token, 10, 32); e != nil || l.err {
  674. return &ParseError{f, "bad LOC Longitude minutes", l}
  675. } else {
  676. rr.Longitude += 1000 * 60 * uint32(i)
  677. }
  678. c.Next() // zBlank
  679. l, _ = c.Next()
  680. if i, e := strconv.ParseFloat(l.token, 32); e != nil || l.err {
  681. return &ParseError{f, "bad LOC Longitude seconds", l}
  682. } else {
  683. rr.Longitude += uint32(1000 * i)
  684. }
  685. c.Next() // zBlank
  686. // Either number, 'E' or 'W'
  687. l, _ = c.Next()
  688. if rr.Longitude, ok = locCheckEast(l.token, rr.Longitude); ok {
  689. goto Altitude
  690. }
  691. // If still alive, flag an error
  692. return &ParseError{f, "bad LOC Longitude East/West", l}
  693. Altitude:
  694. c.Next() // zBlank
  695. l, _ = c.Next()
  696. if len(l.token) == 0 || l.err {
  697. return &ParseError{f, "bad LOC Altitude", l}
  698. }
  699. if l.token[len(l.token)-1] == 'M' || l.token[len(l.token)-1] == 'm' {
  700. l.token = l.token[0 : len(l.token)-1]
  701. }
  702. if i, e := strconv.ParseFloat(l.token, 32); e != nil {
  703. return &ParseError{f, "bad LOC Altitude", l}
  704. } else {
  705. rr.Altitude = uint32(i*100.0 + 10000000.0 + 0.5)
  706. }
  707. // And now optionally the other values
  708. l, _ = c.Next()
  709. count := 0
  710. for l.value != zNewline && l.value != zEOF {
  711. switch l.value {
  712. case zString:
  713. switch count {
  714. case 0: // Size
  715. e, m, ok := stringToCm(l.token)
  716. if !ok {
  717. return &ParseError{f, "bad LOC Size", l}
  718. }
  719. rr.Size = e&0x0f | m<<4&0xf0
  720. case 1: // HorizPre
  721. e, m, ok := stringToCm(l.token)
  722. if !ok {
  723. return &ParseError{f, "bad LOC HorizPre", l}
  724. }
  725. rr.HorizPre = e&0x0f | m<<4&0xf0
  726. case 2: // VertPre
  727. e, m, ok := stringToCm(l.token)
  728. if !ok {
  729. return &ParseError{f, "bad LOC VertPre", l}
  730. }
  731. rr.VertPre = e&0x0f | m<<4&0xf0
  732. }
  733. count++
  734. case zBlank:
  735. // Ok
  736. default:
  737. return &ParseError{f, "bad LOC Size, HorizPre or VertPre", l}
  738. }
  739. l, _ = c.Next()
  740. }
  741. return nil
  742. }
  743. func (rr *HIP) parse(c *zlexer, o, f string) *ParseError {
  744. // HitLength is not represented
  745. l, _ := c.Next()
  746. if len(l.token) == 0 { // dynamic update rr.
  747. return nil
  748. }
  749. i, e := strconv.ParseUint(l.token, 10, 8)
  750. if e != nil || l.err {
  751. return &ParseError{f, "bad HIP PublicKeyAlgorithm", l}
  752. }
  753. rr.PublicKeyAlgorithm = uint8(i)
  754. c.Next() // zBlank
  755. l, _ = c.Next() // zString
  756. if len(l.token) == 0 || l.err {
  757. return &ParseError{f, "bad HIP Hit", l}
  758. }
  759. rr.Hit = l.token // This can not contain spaces, see RFC 5205 Section 6.
  760. rr.HitLength = uint8(len(rr.Hit)) / 2
  761. c.Next() // zBlank
  762. l, _ = c.Next() // zString
  763. if len(l.token) == 0 || l.err {
  764. return &ParseError{f, "bad HIP PublicKey", l}
  765. }
  766. rr.PublicKey = l.token // This cannot contain spaces
  767. rr.PublicKeyLength = uint16(base64.StdEncoding.DecodedLen(len(rr.PublicKey)))
  768. // RendezvousServers (if any)
  769. l, _ = c.Next()
  770. var xs []string
  771. for l.value != zNewline && l.value != zEOF {
  772. switch l.value {
  773. case zString:
  774. name, nameOk := toAbsoluteName(l.token, o)
  775. if l.err || !nameOk {
  776. return &ParseError{f, "bad HIP RendezvousServers", l}
  777. }
  778. xs = append(xs, name)
  779. case zBlank:
  780. // Ok
  781. default:
  782. return &ParseError{f, "bad HIP RendezvousServers", l}
  783. }
  784. l, _ = c.Next()
  785. }
  786. rr.RendezvousServers = xs
  787. return nil
  788. }
  789. func (rr *CERT) parse(c *zlexer, o, f string) *ParseError {
  790. l, _ := c.Next()
  791. if len(l.token) == 0 { // dynamic update rr.
  792. return nil
  793. }
  794. if v, ok := StringToCertType[l.token]; ok {
  795. rr.Type = v
  796. } else if i, e := strconv.ParseUint(l.token, 10, 16); e != nil {
  797. return &ParseError{f, "bad CERT Type", l}
  798. } else {
  799. rr.Type = uint16(i)
  800. }
  801. c.Next() // zBlank
  802. l, _ = c.Next() // zString
  803. i, e := strconv.ParseUint(l.token, 10, 16)
  804. if e != nil || l.err {
  805. return &ParseError{f, "bad CERT KeyTag", l}
  806. }
  807. rr.KeyTag = uint16(i)
  808. c.Next() // zBlank
  809. l, _ = c.Next() // zString
  810. if v, ok := StringToAlgorithm[l.token]; ok {
  811. rr.Algorithm = v
  812. } else if i, e := strconv.ParseUint(l.token, 10, 8); e != nil {
  813. return &ParseError{f, "bad CERT Algorithm", l}
  814. } else {
  815. rr.Algorithm = uint8(i)
  816. }
  817. s, e1 := endingToString(c, "bad CERT Certificate", f)
  818. if e1 != nil {
  819. return e1
  820. }
  821. rr.Certificate = s
  822. return nil
  823. }
  824. func (rr *OPENPGPKEY) parse(c *zlexer, o, f string) *ParseError {
  825. s, e := endingToString(c, "bad OPENPGPKEY PublicKey", f)
  826. if e != nil {
  827. return e
  828. }
  829. rr.PublicKey = s
  830. return nil
  831. }
  832. func (rr *CSYNC) parse(c *zlexer, o, f string) *ParseError {
  833. l, _ := c.Next()
  834. if len(l.token) == 0 { // dynamic update rr.
  835. return nil
  836. }
  837. j, e := strconv.ParseUint(l.token, 10, 32)
  838. if e != nil {
  839. // Serial must be a number
  840. return &ParseError{f, "bad CSYNC serial", l}
  841. }
  842. rr.Serial = uint32(j)
  843. c.Next() // zBlank
  844. l, _ = c.Next()
  845. j, e = strconv.ParseUint(l.token, 10, 16)
  846. if e != nil {
  847. // Serial must be a number
  848. return &ParseError{f, "bad CSYNC flags", l}
  849. }
  850. rr.Flags = uint16(j)
  851. rr.TypeBitMap = make([]uint16, 0)
  852. var (
  853. k uint16
  854. ok bool
  855. )
  856. l, _ = c.Next()
  857. for l.value != zNewline && l.value != zEOF {
  858. switch l.value {
  859. case zBlank:
  860. // Ok
  861. case zString:
  862. tokenUpper := strings.ToUpper(l.token)
  863. if k, ok = StringToType[tokenUpper]; !ok {
  864. if k, ok = typeToInt(l.token); !ok {
  865. return &ParseError{f, "bad CSYNC TypeBitMap", l}
  866. }
  867. }
  868. rr.TypeBitMap = append(rr.TypeBitMap, k)
  869. default:
  870. return &ParseError{f, "bad CSYNC TypeBitMap", l}
  871. }
  872. l, _ = c.Next()
  873. }
  874. return nil
  875. }
  876. func (rr *SIG) parse(c *zlexer, o, f string) *ParseError {
  877. return rr.RRSIG.parse(c, o, f)
  878. }
  879. func (rr *RRSIG) parse(c *zlexer, o, f string) *ParseError {
  880. l, _ := c.Next()
  881. if len(l.token) == 0 { // dynamic update rr.
  882. return nil
  883. }
  884. tokenUpper := strings.ToUpper(l.token)
  885. if t, ok := StringToType[tokenUpper]; !ok {
  886. if strings.HasPrefix(tokenUpper, "TYPE") {
  887. t, ok = typeToInt(l.token)
  888. if !ok {
  889. return &ParseError{f, "bad RRSIG Typecovered", l}
  890. }
  891. rr.TypeCovered = t
  892. } else {
  893. return &ParseError{f, "bad RRSIG Typecovered", l}
  894. }
  895. } else {
  896. rr.TypeCovered = t
  897. }
  898. c.Next() // zBlank
  899. l, _ = c.Next()
  900. i, err := strconv.ParseUint(l.token, 10, 8)
  901. if err != nil || l.err {
  902. return &ParseError{f, "bad RRSIG Algorithm", l}
  903. }
  904. rr.Algorithm = uint8(i)
  905. c.Next() // zBlank
  906. l, _ = c.Next()
  907. i, err = strconv.ParseUint(l.token, 10, 8)
  908. if err != nil || l.err {
  909. return &ParseError{f, "bad RRSIG Labels", l}
  910. }
  911. rr.Labels = uint8(i)
  912. c.Next() // zBlank
  913. l, _ = c.Next()
  914. i, err = strconv.ParseUint(l.token, 10, 32)
  915. if err != nil || l.err {
  916. return &ParseError{f, "bad RRSIG OrigTtl", l}
  917. }
  918. rr.OrigTtl = uint32(i)
  919. c.Next() // zBlank
  920. l, _ = c.Next()
  921. if i, err := StringToTime(l.token); err != nil {
  922. // Try to see if all numeric and use it as epoch
  923. if i, err := strconv.ParseInt(l.token, 10, 64); err == nil {
  924. // TODO(miek): error out on > MAX_UINT32, same below
  925. rr.Expiration = uint32(i)
  926. } else {
  927. return &ParseError{f, "bad RRSIG Expiration", l}
  928. }
  929. } else {
  930. rr.Expiration = i
  931. }
  932. c.Next() // zBlank
  933. l, _ = c.Next()
  934. if i, err := StringToTime(l.token); err != nil {
  935. if i, err := strconv.ParseInt(l.token, 10, 64); err == nil {
  936. rr.Inception = uint32(i)
  937. } else {
  938. return &ParseError{f, "bad RRSIG Inception", l}
  939. }
  940. } else {
  941. rr.Inception = i
  942. }
  943. c.Next() // zBlank
  944. l, _ = c.Next()
  945. i, err = strconv.ParseUint(l.token, 10, 16)
  946. if err != nil || l.err {
  947. return &ParseError{f, "bad RRSIG KeyTag", l}
  948. }
  949. rr.KeyTag = uint16(i)
  950. c.Next() // zBlank
  951. l, _ = c.Next()
  952. rr.SignerName = l.token
  953. name, nameOk := toAbsoluteName(l.token, o)
  954. if l.err || !nameOk {
  955. return &ParseError{f, "bad RRSIG SignerName", l}
  956. }
  957. rr.SignerName = name
  958. s, e := endingToString(c, "bad RRSIG Signature", f)
  959. if e != nil {
  960. return e
  961. }
  962. rr.Signature = s
  963. return nil
  964. }
  965. func (rr *NSEC) parse(c *zlexer, o, f string) *ParseError {
  966. l, _ := c.Next()
  967. rr.NextDomain = l.token
  968. if len(l.token) == 0 { // dynamic update rr.
  969. return nil
  970. }
  971. name, nameOk := toAbsoluteName(l.token, o)
  972. if l.err || !nameOk {
  973. return &ParseError{f, "bad NSEC NextDomain", l}
  974. }
  975. rr.NextDomain = name
  976. rr.TypeBitMap = make([]uint16, 0)
  977. var (
  978. k uint16
  979. ok bool
  980. )
  981. l, _ = c.Next()
  982. for l.value != zNewline && l.value != zEOF {
  983. switch l.value {
  984. case zBlank:
  985. // Ok
  986. case zString:
  987. tokenUpper := strings.ToUpper(l.token)
  988. if k, ok = StringToType[tokenUpper]; !ok {
  989. if k, ok = typeToInt(l.token); !ok {
  990. return &ParseError{f, "bad NSEC TypeBitMap", l}
  991. }
  992. }
  993. rr.TypeBitMap = append(rr.TypeBitMap, k)
  994. default:
  995. return &ParseError{f, "bad NSEC TypeBitMap", l}
  996. }
  997. l, _ = c.Next()
  998. }
  999. return nil
  1000. }
  1001. func (rr *NSEC3) parse(c *zlexer, o, f string) *ParseError {
  1002. l, _ := c.Next()
  1003. if len(l.token) == 0 { // dynamic update rr.
  1004. return nil
  1005. }
  1006. i, e := strconv.ParseUint(l.token, 10, 8)
  1007. if e != nil || l.err {
  1008. return &ParseError{f, "bad NSEC3 Hash", l}
  1009. }
  1010. rr.Hash = uint8(i)
  1011. c.Next() // zBlank
  1012. l, _ = c.Next()
  1013. i, e = strconv.ParseUint(l.token, 10, 8)
  1014. if e != nil || l.err {
  1015. return &ParseError{f, "bad NSEC3 Flags", l}
  1016. }
  1017. rr.Flags = uint8(i)
  1018. c.Next() // zBlank
  1019. l, _ = c.Next()
  1020. i, e = strconv.ParseUint(l.token, 10, 16)
  1021. if e != nil || l.err {
  1022. return &ParseError{f, "bad NSEC3 Iterations", l}
  1023. }
  1024. rr.Iterations = uint16(i)
  1025. c.Next()
  1026. l, _ = c.Next()
  1027. if len(l.token) == 0 || l.err {
  1028. return &ParseError{f, "bad NSEC3 Salt", l}
  1029. }
  1030. if l.token != "-" {
  1031. rr.SaltLength = uint8(len(l.token)) / 2
  1032. rr.Salt = l.token
  1033. }
  1034. c.Next()
  1035. l, _ = c.Next()
  1036. if len(l.token) == 0 || l.err {
  1037. return &ParseError{f, "bad NSEC3 NextDomain", l}
  1038. }
  1039. rr.HashLength = 20 // Fix for NSEC3 (sha1 160 bits)
  1040. rr.NextDomain = l.token
  1041. rr.TypeBitMap = make([]uint16, 0)
  1042. var (
  1043. k uint16
  1044. ok bool
  1045. )
  1046. l, _ = c.Next()
  1047. for l.value != zNewline && l.value != zEOF {
  1048. switch l.value {
  1049. case zBlank:
  1050. // Ok
  1051. case zString:
  1052. tokenUpper := strings.ToUpper(l.token)
  1053. if k, ok = StringToType[tokenUpper]; !ok {
  1054. if k, ok = typeToInt(l.token); !ok {
  1055. return &ParseError{f, "bad NSEC3 TypeBitMap", l}
  1056. }
  1057. }
  1058. rr.TypeBitMap = append(rr.TypeBitMap, k)
  1059. default:
  1060. return &ParseError{f, "bad NSEC3 TypeBitMap", l}
  1061. }
  1062. l, _ = c.Next()
  1063. }
  1064. return nil
  1065. }
  1066. func (rr *NSEC3PARAM) parse(c *zlexer, o, f string) *ParseError {
  1067. l, _ := c.Next()
  1068. if len(l.token) == 0 { // dynamic update rr.
  1069. return slurpRemainder(c, f)
  1070. }
  1071. i, e := strconv.ParseUint(l.token, 10, 8)
  1072. if e != nil || l.err {
  1073. return &ParseError{f, "bad NSEC3PARAM Hash", l}
  1074. }
  1075. rr.Hash = uint8(i)
  1076. c.Next() // zBlank
  1077. l, _ = c.Next()
  1078. i, e = strconv.ParseUint(l.token, 10, 8)
  1079. if e != nil || l.err {
  1080. return &ParseError{f, "bad NSEC3PARAM Flags", l}
  1081. }
  1082. rr.Flags = uint8(i)
  1083. c.Next() // zBlank
  1084. l, _ = c.Next()
  1085. i, e = strconv.ParseUint(l.token, 10, 16)
  1086. if e != nil || l.err {
  1087. return &ParseError{f, "bad NSEC3PARAM Iterations", l}
  1088. }
  1089. rr.Iterations = uint16(i)
  1090. c.Next()
  1091. l, _ = c.Next()
  1092. if l.token != "-" {
  1093. rr.SaltLength = uint8(len(l.token))
  1094. rr.Salt = l.token
  1095. }
  1096. return slurpRemainder(c, f)
  1097. }
  1098. func (rr *EUI48) parse(c *zlexer, o, f string) *ParseError {
  1099. l, _ := c.Next()
  1100. if len(l.token) == 0 { // dynamic update rr.
  1101. return slurpRemainder(c, f)
  1102. }
  1103. if len(l.token) != 17 || l.err {
  1104. return &ParseError{f, "bad EUI48 Address", l}
  1105. }
  1106. addr := make([]byte, 12)
  1107. dash := 0
  1108. for i := 0; i < 10; i += 2 {
  1109. addr[i] = l.token[i+dash]
  1110. addr[i+1] = l.token[i+1+dash]
  1111. dash++
  1112. if l.token[i+1+dash] != '-' {
  1113. return &ParseError{f, "bad EUI48 Address", l}
  1114. }
  1115. }
  1116. addr[10] = l.token[15]
  1117. addr[11] = l.token[16]
  1118. i, e := strconv.ParseUint(string(addr), 16, 48)
  1119. if e != nil {
  1120. return &ParseError{f, "bad EUI48 Address", l}
  1121. }
  1122. rr.Address = i
  1123. return slurpRemainder(c, f)
  1124. }
  1125. func (rr *EUI64) parse(c *zlexer, o, f string) *ParseError {
  1126. l, _ := c.Next()
  1127. if len(l.token) == 0 { // dynamic update rr.
  1128. return slurpRemainder(c, f)
  1129. }
  1130. if len(l.token) != 23 || l.err {
  1131. return &ParseError{f, "bad EUI64 Address", l}
  1132. }
  1133. addr := make([]byte, 16)
  1134. dash := 0
  1135. for i := 0; i < 14; i += 2 {
  1136. addr[i] = l.token[i+dash]
  1137. addr[i+1] = l.token[i+1+dash]
  1138. dash++
  1139. if l.token[i+1+dash] != '-' {
  1140. return &ParseError{f, "bad EUI64 Address", l}
  1141. }
  1142. }
  1143. addr[14] = l.token[21]
  1144. addr[15] = l.token[22]
  1145. i, e := strconv.ParseUint(string(addr), 16, 64)
  1146. if e != nil {
  1147. return &ParseError{f, "bad EUI68 Address", l}
  1148. }
  1149. rr.Address = i
  1150. return slurpRemainder(c, f)
  1151. }
  1152. func (rr *SSHFP) parse(c *zlexer, o, f string) *ParseError {
  1153. l, _ := c.Next()
  1154. if len(l.token) == 0 { // dynamic update rr.
  1155. return nil
  1156. }
  1157. i, e := strconv.ParseUint(l.token, 10, 8)
  1158. if e != nil || l.err {
  1159. return &ParseError{f, "bad SSHFP Algorithm", l}
  1160. }
  1161. rr.Algorithm = uint8(i)
  1162. c.Next() // zBlank
  1163. l, _ = c.Next()
  1164. i, e = strconv.ParseUint(l.token, 10, 8)
  1165. if e != nil || l.err {
  1166. return &ParseError{f, "bad SSHFP Type", l}
  1167. }
  1168. rr.Type = uint8(i)
  1169. c.Next() // zBlank
  1170. s, e1 := endingToString(c, "bad SSHFP Fingerprint", f)
  1171. if e1 != nil {
  1172. return e1
  1173. }
  1174. rr.FingerPrint = s
  1175. return nil
  1176. }
  1177. func (rr *DNSKEY) parseDNSKEY(c *zlexer, o, f, typ string) *ParseError {
  1178. l, _ := c.Next()
  1179. if len(l.token) == 0 { // dynamic update rr.
  1180. return nil
  1181. }
  1182. i, e := strconv.ParseUint(l.token, 10, 16)
  1183. if e != nil || l.err {
  1184. return &ParseError{f, "bad " + typ + " Flags", l}
  1185. }
  1186. rr.Flags = uint16(i)
  1187. c.Next() // zBlank
  1188. l, _ = c.Next() // zString
  1189. i, e = strconv.ParseUint(l.token, 10, 8)
  1190. if e != nil || l.err {
  1191. return &ParseError{f, "bad " + typ + " Protocol", l}
  1192. }
  1193. rr.Protocol = uint8(i)
  1194. c.Next() // zBlank
  1195. l, _ = c.Next() // zString
  1196. i, e = strconv.ParseUint(l.token, 10, 8)
  1197. if e != nil || l.err {
  1198. return &ParseError{f, "bad " + typ + " Algorithm", l}
  1199. }
  1200. rr.Algorithm = uint8(i)
  1201. s, e1 := endingToString(c, "bad "+typ+" PublicKey", f)
  1202. if e1 != nil {
  1203. return e1
  1204. }
  1205. rr.PublicKey = s
  1206. return nil
  1207. }
  1208. func (rr *DNSKEY) parse(c *zlexer, o, f string) *ParseError {
  1209. return rr.parseDNSKEY(c, o, f, "DNSKEY")
  1210. }
  1211. func (rr *KEY) parse(c *zlexer, o, f string) *ParseError {
  1212. return rr.parseDNSKEY(c, o, f, "KEY")
  1213. }
  1214. func (rr *CDNSKEY) parse(c *zlexer, o, f string) *ParseError {
  1215. return rr.parseDNSKEY(c, o, f, "CDNSKEY")
  1216. }
  1217. func (rr *RKEY) parse(c *zlexer, o, f string) *ParseError {
  1218. l, _ := c.Next()
  1219. if len(l.token) == 0 { // dynamic update rr.
  1220. return nil
  1221. }
  1222. i, e := strconv.ParseUint(l.token, 10, 16)
  1223. if e != nil || l.err {
  1224. return &ParseError{f, "bad RKEY Flags", l}
  1225. }
  1226. rr.Flags = uint16(i)
  1227. c.Next() // zBlank
  1228. l, _ = c.Next() // zString
  1229. i, e = strconv.ParseUint(l.token, 10, 8)
  1230. if e != nil || l.err {
  1231. return &ParseError{f, "bad RKEY Protocol", l}
  1232. }
  1233. rr.Protocol = uint8(i)
  1234. c.Next() // zBlank
  1235. l, _ = c.Next() // zString
  1236. i, e = strconv.ParseUint(l.token, 10, 8)
  1237. if e != nil || l.err {
  1238. return &ParseError{f, "bad RKEY Algorithm", l}
  1239. }
  1240. rr.Algorithm = uint8(i)
  1241. s, e1 := endingToString(c, "bad RKEY PublicKey", f)
  1242. if e1 != nil {
  1243. return e1
  1244. }
  1245. rr.PublicKey = s
  1246. return nil
  1247. }
  1248. func (rr *EID) parse(c *zlexer, o, f string) *ParseError {
  1249. s, e := endingToString(c, "bad EID Endpoint", f)
  1250. if e != nil {
  1251. return e
  1252. }
  1253. rr.Endpoint = s
  1254. return nil
  1255. }
  1256. func (rr *NIMLOC) parse(c *zlexer, o, f string) *ParseError {
  1257. s, e := endingToString(c, "bad NIMLOC Locator", f)
  1258. if e != nil {
  1259. return e
  1260. }
  1261. rr.Locator = s
  1262. return nil
  1263. }
  1264. func (rr *GPOS) parse(c *zlexer, o, f string) *ParseError {
  1265. l, _ := c.Next()
  1266. if len(l.token) == 0 { // dynamic update rr.
  1267. return slurpRemainder(c, f)
  1268. }
  1269. _, e := strconv.ParseFloat(l.token, 64)
  1270. if e != nil || l.err {
  1271. return &ParseError{f, "bad GPOS Longitude", l}
  1272. }
  1273. rr.Longitude = l.token
  1274. c.Next() // zBlank
  1275. l, _ = c.Next()
  1276. _, e = strconv.ParseFloat(l.token, 64)
  1277. if e != nil || l.err {
  1278. return &ParseError{f, "bad GPOS Latitude", l}
  1279. }
  1280. rr.Latitude = l.token
  1281. c.Next() // zBlank
  1282. l, _ = c.Next()
  1283. _, e = strconv.ParseFloat(l.token, 64)
  1284. if e != nil || l.err {
  1285. return &ParseError{f, "bad GPOS Altitude", l}
  1286. }
  1287. rr.Altitude = l.token
  1288. return slurpRemainder(c, f)
  1289. }
  1290. func (rr *DS) parseDS(c *zlexer, o, f, typ string) *ParseError {
  1291. l, _ := c.Next()
  1292. if len(l.token) == 0 { // dynamic update rr.
  1293. return nil
  1294. }
  1295. i, e := strconv.ParseUint(l.token, 10, 16)
  1296. if e != nil || l.err {
  1297. return &ParseError{f, "bad " + typ + " KeyTag", l}
  1298. }
  1299. rr.KeyTag = uint16(i)
  1300. c.Next() // zBlank
  1301. l, _ = c.Next()
  1302. if i, e = strconv.ParseUint(l.token, 10, 8); e != nil {
  1303. tokenUpper := strings.ToUpper(l.token)
  1304. i, ok := StringToAlgorithm[tokenUpper]
  1305. if !ok || l.err {
  1306. return &ParseError{f, "bad " + typ + " Algorithm", l}
  1307. }
  1308. rr.Algorithm = i
  1309. } else {
  1310. rr.Algorithm = uint8(i)
  1311. }
  1312. c.Next() // zBlank
  1313. l, _ = c.Next()
  1314. i, e = strconv.ParseUint(l.token, 10, 8)
  1315. if e != nil || l.err {
  1316. return &ParseError{f, "bad " + typ + " DigestType", l}
  1317. }
  1318. rr.DigestType = uint8(i)
  1319. s, e1 := endingToString(c, "bad "+typ+" Digest", f)
  1320. if e1 != nil {
  1321. return e1
  1322. }
  1323. rr.Digest = s
  1324. return nil
  1325. }
  1326. func (rr *DS) parse(c *zlexer, o, f string) *ParseError {
  1327. return rr.parseDS(c, o, f, "DS")
  1328. }
  1329. func (rr *DLV) parse(c *zlexer, o, f string) *ParseError {
  1330. return rr.parseDS(c, o, f, "DLV")
  1331. }
  1332. func (rr *CDS) parse(c *zlexer, o, f string) *ParseError {
  1333. return rr.parseDS(c, o, f, "CDS")
  1334. }
  1335. func (rr *TA) parse(c *zlexer, o, f string) *ParseError {
  1336. l, _ := c.Next()
  1337. if len(l.token) == 0 { // dynamic update rr.
  1338. return nil
  1339. }
  1340. i, e := strconv.ParseUint(l.token, 10, 16)
  1341. if e != nil || l.err {
  1342. return &ParseError{f, "bad TA KeyTag", l}
  1343. }
  1344. rr.KeyTag = uint16(i)
  1345. c.Next() // zBlank
  1346. l, _ = c.Next()
  1347. if i, e := strconv.ParseUint(l.token, 10, 8); e != nil {
  1348. tokenUpper := strings.ToUpper(l.token)
  1349. i, ok := StringToAlgorithm[tokenUpper]
  1350. if !ok || l.err {
  1351. return &ParseError{f, "bad TA Algorithm", l}
  1352. }
  1353. rr.Algorithm = i
  1354. } else {
  1355. rr.Algorithm = uint8(i)
  1356. }
  1357. c.Next() // zBlank
  1358. l, _ = c.Next()
  1359. i, e = strconv.ParseUint(l.token, 10, 8)
  1360. if e != nil || l.err {
  1361. return &ParseError{f, "bad TA DigestType", l}
  1362. }
  1363. rr.DigestType = uint8(i)
  1364. s, err := endingToString(c, "bad TA Digest", f)
  1365. if err != nil {
  1366. return err
  1367. }
  1368. rr.Digest = s
  1369. return nil
  1370. }
  1371. func (rr *TLSA) parse(c *zlexer, o, f string) *ParseError {
  1372. l, _ := c.Next()
  1373. if len(l.token) == 0 { // dynamic update rr.
  1374. return nil
  1375. }
  1376. i, e := strconv.ParseUint(l.token, 10, 8)
  1377. if e != nil || l.err {
  1378. return &ParseError{f, "bad TLSA Usage", l}
  1379. }
  1380. rr.Usage = uint8(i)
  1381. c.Next() // zBlank
  1382. l, _ = c.Next()
  1383. i, e = strconv.ParseUint(l.token, 10, 8)
  1384. if e != nil || l.err {
  1385. return &ParseError{f, "bad TLSA Selector", l}
  1386. }
  1387. rr.Selector = uint8(i)
  1388. c.Next() // zBlank
  1389. l, _ = c.Next()
  1390. i, e = strconv.ParseUint(l.token, 10, 8)
  1391. if e != nil || l.err {
  1392. return &ParseError{f, "bad TLSA MatchingType", l}
  1393. }
  1394. rr.MatchingType = uint8(i)
  1395. // So this needs be e2 (i.e. different than e), because...??t
  1396. s, e2 := endingToString(c, "bad TLSA Certificate", f)
  1397. if e2 != nil {
  1398. return e2
  1399. }
  1400. rr.Certificate = s
  1401. return nil
  1402. }
  1403. func (rr *SMIMEA) parse(c *zlexer, o, f string) *ParseError {
  1404. l, _ := c.Next()
  1405. if len(l.token) == 0 { // dynamic update rr.
  1406. return nil
  1407. }
  1408. i, e := strconv.ParseUint(l.token, 10, 8)
  1409. if e != nil || l.err {
  1410. return &ParseError{f, "bad SMIMEA Usage", l}
  1411. }
  1412. rr.Usage = uint8(i)
  1413. c.Next() // zBlank
  1414. l, _ = c.Next()
  1415. i, e = strconv.ParseUint(l.token, 10, 8)
  1416. if e != nil || l.err {
  1417. return &ParseError{f, "bad SMIMEA Selector", l}
  1418. }
  1419. rr.Selector = uint8(i)
  1420. c.Next() // zBlank
  1421. l, _ = c.Next()
  1422. i, e = strconv.ParseUint(l.token, 10, 8)
  1423. if e != nil || l.err {
  1424. return &ParseError{f, "bad SMIMEA MatchingType", l}
  1425. }
  1426. rr.MatchingType = uint8(i)
  1427. // So this needs be e2 (i.e. different than e), because...??t
  1428. s, e2 := endingToString(c, "bad SMIMEA Certificate", f)
  1429. if e2 != nil {
  1430. return e2
  1431. }
  1432. rr.Certificate = s
  1433. return nil
  1434. }
  1435. func (rr *RFC3597) parse(c *zlexer, o, f string) *ParseError {
  1436. l, _ := c.Next()
  1437. if l.token != "\\#" {
  1438. return &ParseError{f, "bad RFC3597 Rdata", l}
  1439. }
  1440. c.Next() // zBlank
  1441. l, _ = c.Next()
  1442. rdlength, e := strconv.Atoi(l.token)
  1443. if e != nil || l.err {
  1444. return &ParseError{f, "bad RFC3597 Rdata ", l}
  1445. }
  1446. s, e1 := endingToString(c, "bad RFC3597 Rdata", f)
  1447. if e1 != nil {
  1448. return e1
  1449. }
  1450. if rdlength*2 != len(s) {
  1451. return &ParseError{f, "bad RFC3597 Rdata", l}
  1452. }
  1453. rr.Rdata = s
  1454. return nil
  1455. }
  1456. func (rr *SPF) parse(c *zlexer, o, f string) *ParseError {
  1457. s, e := endingToTxtSlice(c, "bad SPF Txt", f)
  1458. if e != nil {
  1459. return e
  1460. }
  1461. rr.Txt = s
  1462. return nil
  1463. }
  1464. func (rr *AVC) parse(c *zlexer, o, f string) *ParseError {
  1465. s, e := endingToTxtSlice(c, "bad AVC Txt", f)
  1466. if e != nil {
  1467. return e
  1468. }
  1469. rr.Txt = s
  1470. return nil
  1471. }
  1472. func (rr *TXT) parse(c *zlexer, o, f string) *ParseError {
  1473. // no zBlank reading here, because all this rdata is TXT
  1474. s, e := endingToTxtSlice(c, "bad TXT Txt", f)
  1475. if e != nil {
  1476. return e
  1477. }
  1478. rr.Txt = s
  1479. return nil
  1480. }
  1481. // identical to setTXT
  1482. func (rr *NINFO) parse(c *zlexer, o, f string) *ParseError {
  1483. s, e := endingToTxtSlice(c, "bad NINFO ZSData", f)
  1484. if e != nil {
  1485. return e
  1486. }
  1487. rr.ZSData = s
  1488. return nil
  1489. }
  1490. func (rr *URI) parse(c *zlexer, o, f string) *ParseError {
  1491. l, _ := c.Next()
  1492. if len(l.token) == 0 { // dynamic update rr.
  1493. return nil
  1494. }
  1495. i, e := strconv.ParseUint(l.token, 10, 16)
  1496. if e != nil || l.err {
  1497. return &ParseError{f, "bad URI Priority", l}
  1498. }
  1499. rr.Priority = uint16(i)
  1500. c.Next() // zBlank
  1501. l, _ = c.Next()
  1502. i, e = strconv.ParseUint(l.token, 10, 16)
  1503. if e != nil || l.err {
  1504. return &ParseError{f, "bad URI Weight", l}
  1505. }
  1506. rr.Weight = uint16(i)
  1507. c.Next() // zBlank
  1508. s, err := endingToTxtSlice(c, "bad URI Target", f)
  1509. if err != nil {
  1510. return err
  1511. }
  1512. if len(s) != 1 {
  1513. return &ParseError{f, "bad URI Target", l}
  1514. }
  1515. rr.Target = s[0]
  1516. return nil
  1517. }
  1518. func (rr *DHCID) parse(c *zlexer, o, f string) *ParseError {
  1519. // awesome record to parse!
  1520. s, e := endingToString(c, "bad DHCID Digest", f)
  1521. if e != nil {
  1522. return e
  1523. }
  1524. rr.Digest = s
  1525. return nil
  1526. }
  1527. func (rr *NID) parse(c *zlexer, o, f string) *ParseError {
  1528. l, _ := c.Next()
  1529. if len(l.token) == 0 { // dynamic update rr.
  1530. return slurpRemainder(c, f)
  1531. }
  1532. i, e := strconv.ParseUint(l.token, 10, 16)
  1533. if e != nil || l.err {
  1534. return &ParseError{f, "bad NID Preference", l}
  1535. }
  1536. rr.Preference = uint16(i)
  1537. c.Next() // zBlank
  1538. l, _ = c.Next() // zString
  1539. u, err := stringToNodeID(l)
  1540. if err != nil || l.err {
  1541. return err
  1542. }
  1543. rr.NodeID = u
  1544. return slurpRemainder(c, f)
  1545. }
  1546. func (rr *L32) parse(c *zlexer, o, f string) *ParseError {
  1547. l, _ := c.Next()
  1548. if len(l.token) == 0 { // dynamic update rr.
  1549. return slurpRemainder(c, f)
  1550. }
  1551. i, e := strconv.ParseUint(l.token, 10, 16)
  1552. if e != nil || l.err {
  1553. return &ParseError{f, "bad L32 Preference", l}
  1554. }
  1555. rr.Preference = uint16(i)
  1556. c.Next() // zBlank
  1557. l, _ = c.Next() // zString
  1558. rr.Locator32 = net.ParseIP(l.token)
  1559. if rr.Locator32 == nil || l.err {
  1560. return &ParseError{f, "bad L32 Locator", l}
  1561. }
  1562. return slurpRemainder(c, f)
  1563. }
  1564. func (rr *LP) parse(c *zlexer, o, f string) *ParseError {
  1565. l, _ := c.Next()
  1566. if len(l.token) == 0 { // dynamic update rr.
  1567. return slurpRemainder(c, f)
  1568. }
  1569. i, e := strconv.ParseUint(l.token, 10, 16)
  1570. if e != nil || l.err {
  1571. return &ParseError{f, "bad LP Preference", l}
  1572. }
  1573. rr.Preference = uint16(i)
  1574. c.Next() // zBlank
  1575. l, _ = c.Next() // zString
  1576. rr.Fqdn = l.token
  1577. name, nameOk := toAbsoluteName(l.token, o)
  1578. if l.err || !nameOk {
  1579. return &ParseError{f, "bad LP Fqdn", l}
  1580. }
  1581. rr.Fqdn = name
  1582. return slurpRemainder(c, f)
  1583. }
  1584. func (rr *L64) parse(c *zlexer, o, f string) *ParseError {
  1585. l, _ := c.Next()
  1586. if len(l.token) == 0 { // dynamic update rr.
  1587. return slurpRemainder(c, f)
  1588. }
  1589. i, e := strconv.ParseUint(l.token, 10, 16)
  1590. if e != nil || l.err {
  1591. return &ParseError{f, "bad L64 Preference", l}
  1592. }
  1593. rr.Preference = uint16(i)
  1594. c.Next() // zBlank
  1595. l, _ = c.Next() // zString
  1596. u, err := stringToNodeID(l)
  1597. if err != nil || l.err {
  1598. return err
  1599. }
  1600. rr.Locator64 = u
  1601. return slurpRemainder(c, f)
  1602. }
  1603. func (rr *UID) parse(c *zlexer, o, f string) *ParseError {
  1604. l, _ := c.Next()
  1605. if len(l.token) == 0 { // dynamic update rr.
  1606. return slurpRemainder(c, f)
  1607. }
  1608. i, e := strconv.ParseUint(l.token, 10, 32)
  1609. if e != nil || l.err {
  1610. return &ParseError{f, "bad UID Uid", l}
  1611. }
  1612. rr.Uid = uint32(i)
  1613. return slurpRemainder(c, f)
  1614. }
  1615. func (rr *GID) parse(c *zlexer, o, f string) *ParseError {
  1616. l, _ := c.Next()
  1617. if len(l.token) == 0 { // dynamic update rr.
  1618. return slurpRemainder(c, f)
  1619. }
  1620. i, e := strconv.ParseUint(l.token, 10, 32)
  1621. if e != nil || l.err {
  1622. return &ParseError{f, "bad GID Gid", l}
  1623. }
  1624. rr.Gid = uint32(i)
  1625. return slurpRemainder(c, f)
  1626. }
  1627. func (rr *UINFO) parse(c *zlexer, o, f string) *ParseError {
  1628. s, e := endingToTxtSlice(c, "bad UINFO Uinfo", f)
  1629. if e != nil {
  1630. return e
  1631. }
  1632. if ln := len(s); ln == 0 {
  1633. return nil
  1634. }
  1635. rr.Uinfo = s[0] // silently discard anything after the first character-string
  1636. return nil
  1637. }
  1638. func (rr *PX) parse(c *zlexer, o, f string) *ParseError {
  1639. l, _ := c.Next()
  1640. if len(l.token) == 0 { // dynamic update rr.
  1641. return slurpRemainder(c, f)
  1642. }
  1643. i, e := strconv.ParseUint(l.token, 10, 16)
  1644. if e != nil || l.err {
  1645. return &ParseError{f, "bad PX Preference", l}
  1646. }
  1647. rr.Preference = uint16(i)
  1648. c.Next() // zBlank
  1649. l, _ = c.Next() // zString
  1650. rr.Map822 = l.token
  1651. map822, map822Ok := toAbsoluteName(l.token, o)
  1652. if l.err || !map822Ok {
  1653. return &ParseError{f, "bad PX Map822", l}
  1654. }
  1655. rr.Map822 = map822
  1656. c.Next() // zBlank
  1657. l, _ = c.Next() // zString
  1658. rr.Mapx400 = l.token
  1659. mapx400, mapx400Ok := toAbsoluteName(l.token, o)
  1660. if l.err || !mapx400Ok {
  1661. return &ParseError{f, "bad PX Mapx400", l}
  1662. }
  1663. rr.Mapx400 = mapx400
  1664. return slurpRemainder(c, f)
  1665. }
  1666. func (rr *CAA) parse(c *zlexer, o, f string) *ParseError {
  1667. l, _ := c.Next()
  1668. if len(l.token) == 0 { // dynamic update rr.
  1669. return nil
  1670. }
  1671. i, err := strconv.ParseUint(l.token, 10, 8)
  1672. if err != nil || l.err {
  1673. return &ParseError{f, "bad CAA Flag", l}
  1674. }
  1675. rr.Flag = uint8(i)
  1676. c.Next() // zBlank
  1677. l, _ = c.Next() // zString
  1678. if l.value != zString {
  1679. return &ParseError{f, "bad CAA Tag", l}
  1680. }
  1681. rr.Tag = l.token
  1682. c.Next() // zBlank
  1683. s, e := endingToTxtSlice(c, "bad CAA Value", f)
  1684. if e != nil {
  1685. return e
  1686. }
  1687. if len(s) != 1 {
  1688. return &ParseError{f, "bad CAA Value", l}
  1689. }
  1690. rr.Value = s[0]
  1691. return nil
  1692. }
  1693. func (rr *TKEY) parse(c *zlexer, o, f string) *ParseError {
  1694. l, _ := c.Next()
  1695. // Algorithm
  1696. if l.value != zString {
  1697. return &ParseError{f, "bad TKEY algorithm", l}
  1698. }
  1699. rr.Algorithm = l.token
  1700. c.Next() // zBlank
  1701. // Get the key length and key values
  1702. l, _ = c.Next()
  1703. i, err := strconv.ParseUint(l.token, 10, 8)
  1704. if err != nil || l.err {
  1705. return &ParseError{f, "bad TKEY key length", l}
  1706. }
  1707. rr.KeySize = uint16(i)
  1708. c.Next() // zBlank
  1709. l, _ = c.Next()
  1710. if l.value != zString {
  1711. return &ParseError{f, "bad TKEY key", l}
  1712. }
  1713. rr.Key = l.token
  1714. c.Next() // zBlank
  1715. // Get the otherdata length and string data
  1716. l, _ = c.Next()
  1717. i, err = strconv.ParseUint(l.token, 10, 8)
  1718. if err != nil || l.err {
  1719. return &ParseError{f, "bad TKEY otherdata length", l}
  1720. }
  1721. rr.OtherLen = uint16(i)
  1722. c.Next() // zBlank
  1723. l, _ = c.Next()
  1724. if l.value != zString {
  1725. return &ParseError{f, "bad TKEY otherday", l}
  1726. }
  1727. rr.OtherData = l.token
  1728. return nil
  1729. }