Den fre 23 maj 2025 kl 00:35 skrev Peter Balogh <pe...@svnplus.com>:

> Hi,
>
> So basically the patch becomes this
> I can't say I like the actual branch condition, but I'm open to
> suggestions :)
>

Hi,

I have not studied the patches in detail but I'm not so sure if I like the
idea of Serf special-casing / hardcoding a custom response reason. I feel
it would be better to offloading this to Subversion since we control both
ends there.

Also, RFC7235 [1] require a 401 response to send a WWW-Authenticate header
- I don't know if it would be possible to use this to send the challenge.
The response could then be added as a header field. Would it be possible
for the server to return a bearer token (= more or less the same as a
Set-Cookie) that we could store client-side to include on future requests?

Kind regards,
Daniel Sahlberg

[1] https://www.rfc-editor.org/rfc/rfc7235#section-3.1




>
> Best regards,
> Peter
>
> On 2025. 05. 21. 23:47, Peter Balogh wrote:
> > Hi,
> >
> > Would my approach (especially the serf change) acceptable, if instead
> > of 499, I rely on the 401 reason string from the status line?
> >
> > Best regards,
> > Peter
> >
> > On 2025. 05. 19. 12:37, Greg Stein wrote:
> >> Hi Peter,
> >>
> >> Apologies for not seeing this on the Subversion dev@ list when you
> >> first brought it up.
> >>
> >> Generally speaking, 2FA solutions along this set of requirements, use
> >> a "Bearer token" which is then placed into the Authorization: header.
> >> (sometimes referred to as a Personal Access Token (PAT)). That token
> >> is fetched out of band, placed into a config file, and then picked up
> >> for authentication with the origin server. I've seen this pattern
> >> used across many systems, and I would not like to see a custom 499
> >> HTTP response to (re)invent the wheel. Nor cookies. Just place the
> >> token into the Authorization header.
> >>
> >> I believe there are four parts here:
> >> 1. a cgi that gets placed on an svn server that can generate a bearer
> >> token for an authenticated user (standard HTTP Basic/Digest,
> >> according to whatever ACLs the server may want to use for access to
> >> that cgi). The bearer token is placed into a sqlite database on the
> >> svn server.
> >> 2. the user provides the bearer token to the svn client, which is
> >> saved into a new auth scheme in the svn config directories.
> >> "svn.bearer", for example.
> >> 3. a serf authentication API/mechanism to submit a Bearer token, and
> >> svn will present the bearer token extracted from its config
> >> 4. httpd grows a new "mod_auth_bearer" or "mod_auth_pat" ... and I
> >> could also bet you that such exists, so the above parts could be
> >> edited to match
> >>
> >> For the token used in this system, I would suggest Python's
> >> "secrets.token_hex(20)" to generate a hex string of 40
> >> characters, which represents 160 bits for a token (which I believe
> >> should be sufficient for this system; I'd think the CGI could simply
> >> have a constant that local installations may want to edit).
> >>
> >> Cheers,
> >> -g
> >>
> >> ps. for step 1, I imagine that the Apache Infra team would like to
> >> implement a custom solution to generate the bearer token for its
> >> deployment on ASF systems, but a CGI is a great mechanism for all
> >> third parties and to demonstrate the minimum needs to construct such
> >> tokens.
> >>
> >>
> >> On Sun, May 18, 2025 at 4:18 PM Peter Balogh <pe...@svnplus.com> wrote:
> >>
> >>     Hi,
> >>
> >>     I'm moving this conversation from the subversion dev mailing list
> >>     for now
> >>     I'm working on adding 2FA to subversion
> >>
> >>     I have a working PoC of this system, and I'd like to start
> >>     submitting patches.
> >>     The serf changes are attached, what is the process to get approval
> >>     for this?
> >>
> >>     The patches, configs and scripts to make this work are publicly
> >>     available here:
> >>     https://pub.svnplus.com/repo/2fa/trunk
> >>
> >>     The implementation uses a special 499 http response code to
> >>     request 2FA auth, I have a working server config that serves this
> >>     without any server side changes
> >>     https://pub.svnplus.com/repo/2fa/trunk/webdav.conf
> >>
> >>     The system is running at https://2fa.svnplus.com/repo/2fa/trunk/,
> >>     and it works in the browser and the svn cli with the patches
> >>     applied, but the svn client does not yet save the cookie, so every
> >>     command needs a 2fa
> >>
> >>     To access the demo system, use the username: user and password: pass
> >>     The 2FA QR code is displayed on the page
> >>
> >>     Please let me know, what you think
> >>
> >>     Best regards,
> >>     Peter
> >>
> >>     On 2025. 04. 02. 9:25, Daniel Sahlberg wrote:
> >>>     Hi,
> >>>
> >>>     Den mån 31 mars 2025 kl 13:09 skrev Peter Balogh
> >>> <pe...@svnplus.com>:
> >>>
> >>>         Hi,
> >>>
> >>>         I'm working on a proof of concept to add multi factor
> >>>         authentication to
> >>>         subversion
> >>>         I have multiple directions, and I'd like to get some feedback
> >>>         from this
> >>>         group before I head down the wrong road
> >>>         Please let me know, if I should read up on any of these, I
> >>>         did not find
> >>>         any recent conversation about these topics
> >>>
> >>>
> >>>     I think this is a very interesting concept!
> >>>
> >>>
> >>>         1. One option would be to extend the existing Basic auth with
> >>>         another
> >>>         challenge. This would support standard TOTP without external
> >>>         connections
> >>>         I couldn't find any standard way to communicating this
> >>>         through HTTP, my
> >>>         best solution would be to
> >>>
> >>>         1.A extend the 401 response with information that the system
> >>>         also needs
> >>>         a TOTP token
> >>>         I've only found the realm string I can use for this without
> >>>         modifying
> >>>         the serf library
> >>>
> >>>         1.B reject the username + password attempt with a different 401
> >>>         This would have to be handled inside the serf library
> >>>
> >>>
> >>>     I don't see a problem modifying Serf if it is needed. Several of
> >>>     the Subversion committers are also Serf committers and we can
> >>>     help there.
> >>>
> >>>
> >>>         2. Provide an external login path instead Basic auth. This
> >>>         would open up
> >>>         using oauth or similar external providers, but a web based
> >>>         provider
> >>>         could be run besides svn as well
> >>>         The server would respond with a 30X response, and the cmdline
> >>>         could
> >>>         print the url for the user to open, login and return to the
> >>>         terminal
> >>>         after authentication
> >>>         This would feel less native, but pretty common these days
> >>>
> >>>
> >>>     I like this idea - I guess this would open up to for example
> >>>     Microsoft Entra.
> >>>
> >>>     Make sure to use the standard baton/callback method to
> >>>     communicate the redirect URL to the client. This way GUI clients
> >>>     (for example TortoiseSVN) can implement a more "native" solution
> >>>     to the redirect.
> >>>
> >>>
> >>>         All of the solutions above would result in a HTTP cookie that
> >>>         would be
> >>>         stored encrypted in the auth folder, and sent with every
> >>>         subsequent request
> >>>
> >>>
> >>>     See existing discussions about storing the basic auth password in
> >>>     the auth folder. On Windows, there are APIs to encrypt the
> >>>     password linked to the user profile. In general no such on Unix,
> >>>     but I assume it could be stored in Gnome Keyring/Kwallet/GPG-agent.
> >>>
> >>>
> >>>         Do you have any thoughts or preferences about this?
> >>>         Do you see any technical or security issue with these?
> >>>
> >>>
> >>>     I know very little about the technical details of authentication
> >>>     on the http level but I think it would be god to adhere to
> >>>     existing standards as much as possible instead of inventing
> >>>     something unique to Subversion. For example it would be good if
> >>>     this can be done across a forward/reverse proxy.
> >>>
> >>>     If this feature is enabled on a server, it would be impossible to
> >>>     authenticate with an older client. Don't know if this is a
> >>>     compatibility concern or not, but I think this addition would
> >>>     warrant new releases.
> >>>
> >>>     Kind regards,
> >>>     Daniel
> >>>

Reply via email to