After you add the comment, feel free to merge.

Reviewed-by: Richard Hansen <rhan...@bbn.com>

Thanks,
Richard


On 2015-05-21 21:53, David Mandelberg wrote:
> On 2015-05-21 15:28, Richard Hansen wrote:
>> Hi David,
>>
>> I only see minor stuff; it can be merged as-is if you don't feel like
>> making any changes.
>>
>> General comment:  Do we have any tests for TAL file parsing?  If not,
>> perhaps we should add some before making this change.
> 
> We don't have any automatic tests for TAL parsing, but I did test this 
> patch if I remember correctly. We also have a step in the pre release 
> checklist that would catch any major bugs in TAL parsing. Also, if there 
> were an error in TAL parsing code, it would be very easy to diagnose 
> because of how simple TALs are and how they only change when a person 
> changes them. In short, TAL parsing tests might be nice to have at some 
> point, but I don't think they're all that important now.
> 
> 
>> Specific comments in-line below.
>>
>> On 2015-04-06 20:55, David Mandelberg wrote:
>>> draft-ietf-sidr-rfc6490-bis-03 defines a new format for TALs. This
>>
>> drop the -03
> 
> I like including the revision number, since it makes it easier to 
> update code to a newer revision (or published RFC) if there are any 
> changes to the draft in the future. I've also found it helpful in the 
> past when I've gone through code that was written to an older revision 
> of a draft than I was familiar with.
> 
> 
>>> commit adds support for both old and new style TALs.
>>> ---
>>>  bin/rpki/updateTA.py.in | 47 
>>> ++++++++++++++++++++++++++++++++---------------
>>>  1 file changed, 32 insertions(+), 15 deletions(-)
>>>
>>> diff --git a/bin/rpki/updateTA.py.in b/bin/rpki/updateTA.py.in
>>> index 146e54f..6c803df 100644
>>> --- a/bin/rpki/updateTA.py.in
>>> +++ b/bin/rpki/updateTA.py.in
>>> @@ -223,21 +223,38 @@ def delete_other_TAs(keep_paths):
>>>
>>>  def parse_TAL_file(tal_file):
>>>      """Return [rsyncURI, subjectPublicKeyInfo] as a pair of 
>>> strings."""
>>> -    f = open(tal_file, "r")
>>> -
>>> -    # First non-blank line is the TA rsync URI
>>> -    rsync_uri = None
>>> -    while not rsync_uri:
>>> -        rsync_uri = f.readline().strip()
>>> -
>>> -    # Base64-encoded SubjectPublicKeyInfo is the rest of the file,
>>> -    # with all whitespace removed.
>>> -    words = []
>>> -    for line in f:
>>> -        for w in line.strip().split():
>>> -            words.append(w)
>>> -    pubkey_b64 = "".join(words)
>>> -    return [rsync_uri, pubkey_b64]
>>> +    with open(tal_file, "r") as f:
>>
>> you can use open(tal_file, "rU") to convert all line endings to '\n'
> 
> Thanks, I didn't know about that. I don't think that affects 
> correctness here, and it only affects readability minimally, so I'm not 
> going to change it now. (But I'll keep it in mind for the future.) If 
> I'm wrong about it affecting correctness, please correct me.
> 
> 
>>> +        lines = f.readlines()
>>> +
>>> +    rsync_uris = []
>>> +    pubkey_b64_words = []
>>> +
>>> +    if '\r\n' in lines or '\n' in lines:
>>> +        # Parse as in draft-ietf-sidr-rfc6490-bis-03
>>
>> drop the -03
> 
> [same explanation as above]
> 
> 
>>> +        in_uri_section = True
>>> +        for line in lines:
>>> +            if in_uri_section:
>>> +                if line in ('\r\n', '\n'):
>>> +                    in_uri_section = False
>>> +                    continue
>>> +                elif line.lower().startswith('rsync://'):
>>> +                    rsync_uris.append(line.strip())
>>
>> There should be a comment here explaining that we check if the line
>> starts with 'rsync://' for forward compatibility with non-rsync URIs.
> 
> Good point. I'll add one.
> 
> 
>>> +            else:
>>> +                pubkey_b64_words.extend(line.split())
>>> +
>>> +    else:
>>> +        # Parse as in RFC6490
>>> +        if lines[0].lower().startswith('rsync://'):
>>
>> I'm not sure why you test if it starts with 'rsync://' here.
> 
> Two related reasons:
>   * To trigger the RuntimeError('TAL file has no rsync URIs: ' + 
> tal_file) below if there's a typo in the TAL that causes us to be unable 
> to extract the rsync URI.
>   * To prevent us from running commands like `rsync 
> jOMAHWzGm6osrgoogqwakxfZC8zEUSorhv1sTwWBIwJe4I 
> /path/to/cache/trustanchors/jOMAHWzGm6osrgoogqwakxfZC8zEUSorhv1sTwWBIwJe4I` 
> if the first line of the TAL was accidentally removed.
> 
>>
>>> +            rsync_uris.append(lines[0].strip())
>>> +        for line in lines[1:]:
>>> +            pubkey_b64_words.extend(line.split())
>>> +
>>> +    if not rsync_uris:
>>> +        raise RuntimeError('TAL file has no rsync URIs: ' + 
>>> tal_file)
>>> +    elif not pubkey_b64_words:
>>> +        raise RuntimeError('TAL file has no public key: ' + 
>>> tal_file)
>>> +
>>> +    return [rsync_uris[0], ''.join(pubkey_b64_words)]
>>
>> The above logic looks correct and is quite readable, but it does
>> multiple passes over the lines and I think it's a bit more complex 
>> than
>> it needs to be.  What about something like this:
>>
>>     uris = []
>>     pubkey_b64_words = []
>>
>>     with open(tal_file, 'r') as f:
>>         in_uri_section = True
>>         for line in (l.strip() for l in f):
>>             # base64 encoded data doesn't have colons, URIs do
>>             if in_uri_section and ':' not in line:
>>                 in_uri_section = False
>>             if in_uri_section:
>>                 uris.append(line)
>>             else:
>>                 pubkey_b64_words.extend(line.split())
>>
>>     rsync_uri = next(
>>         (x for x in uris if x.lower().startswith('rsync://')), None)
>>
>>     if rsync_uri is None:
>>         raise RuntimeError('TAL file has no rsync URIs: ' + tal_file)
>>     elif not pubkey_b64_words:
>>         raise RuntimeError('TAL file has no public key: ' + tal_file)
>>
>>     return [rsync_uri, ''.join(pubkey_b64_words)]
>>
>> The above is maybe a bit inscrutable, however.
> 
> TAL files are pretty small. I made a conscious decision to read the 
> entire file into memory and do multiple passes, in order to make the 
> code more readable.

------------------------------------------------------------------------------
One dashboard for servers and applications across Physical-Virtual-Cloud 
Widest out-of-the-box monitoring support with 50+ applications
Performance metrics, stats and reports that give you Actionable Insights
Deep dive visibility with transaction tracing using APM Insight.
http://ad.doubleclick.net/ddm/clk/290420510;117567292;y
_______________________________________________
rpstir-devel mailing list
rpstir-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rpstir-devel

Reply via email to