Re: Question about timezones in commit & tag dates
- From
Fabian Stelzer <fs@gigacodes.de>
- Date
- Sep 12, 2021, 15:07 UTC
- Message-ID
- <b121acdf-354f-c896-d2f6-b221ea2443c1@gigacodes.de>
- In-Reply-To
- <87fsu997wn.fsf@evledraar.gmail.com>
On 12.09.21 16:21, Ævar Arnfjörð Bjarmason wrote:
Show 51 quoted lines
>
> On Sun, Sep 12 2021, Fabian Stelzer wrote:
>
>> Hi,
>> while working on correct key rollover and verifying signatures for past
>> commits for the ssh signing topic i am trying to understand how Git
>> deals with timestamps for commits & tags.
>> For ssh signing the user will manage expiration times within their
>> allowedSigners file. Those timestamps do not carry a timezone and i
>> would assume a user (or automatic generation of this file) will assume
>> the systems timezone for them.
>> Therefore i wanted to pass the commit & tags timestamps adjusted to the
>> system timezone to make sure key rollover will have no gaps or failed
>> verification's especially when commit and system timezone differ greatly
>> and might roll over to another day.
>>
>> However the commit & tags structs only seem to carry the objects
>> timestamp as is, simply ignoring any timezone information. For the ssh
>> feature i can easily enough parse the ident line again from the object
>> header. But while looking at the usage of the existing date fields i can
>> see that objects are sometimes sorted on and compared by these dates.
>> When commands provide cut off times (--since) i think they might include
>> or exclude commits erroneously when they were made in a different
>> timezone around the cutoff date. ("log --since" indeed gives me some
>> unexpected results when mixing multiple timezones. Based on some simple
>> testing i think it just stops output when a commit falls outside of this
>> window, even though there might be one before it wich is within)
>>
>> Is my understanding of this correct and this the expected behaviour?
>> I think generally for git this does not matter much. But in certain
>> situations this is problematic.
>>
>> I would have assumed that git would either add the timezone as well or
>> adjust the commit timestamp upon populating the date field in the commit
>> struct to UTC but i could not find anything like it.
>
> Timezones are ultimately display information that's confusing to humans,
> but not machines. Machines just need to deal with epochs, or when a
> human supplies them a date convert a formatted date + timezone pair to
> an epoch.
>
> So in the key expiry case, I'd expect that any such system would say
> issue keys right now, now as in time(NULL), and we'd set those keys to
> expire after some time, say 1 day, so time(NULL) + 60 * 60 * 24;
>
> If you're in UTC that might yield a very satisfying (to humans, a
> machine won't care) expiry time. I.e. you'll get keys issued say at
> midnight, and expiring midnight the following day.
>
> What you're saying sounds to me like you're conflating the two
> things.You are correct. I somehow thought the stored timestamp would be in the specified timezone when it is not. The timezone is only used as reference for display.
Show 6 quoted lines
> Anyway, maybe I've misunderstood you. I just don't see how something > like key expiry would need to concern itself with anything but > epochs. If you conflate timezones with that and say "here's a key, it > expires at mindight" surely you'll have some keys last mere seconds, > others 10 hours etc. >
The ssh allowedSigners file specifies key expiry in a "%Y%m%d%H%M%S" format without any timezone information. So i have to assume the systems timezone is used. But correcting my misconception of the stored commit timestamp i can simply present it in the systems timezone for ssh to compare it with the specified expiry date.
Thanks for your help!