[Spice-devel] [PATCH 13/13] server: add SASL support

Alon Levy alevy at redhat.com
Thu Feb 24 16:43:20 PST 2011


On Fri, Feb 25, 2011 at 12:46:34AM +0100, Marc-André Lureau wrote:
> On Thu, Feb 24, 2011 at 10:19 PM, Alon Levy <alevy at redhat.com> wrote:
> > On Tue, Feb 22, 2011 at 05:09:07PM +0100, Marc-André Lureau wrote:
> >> We introduce 2 public functions to integrate with the library user.
> >>
> >> spice_server_set_sasl() - turn on SASL
> >> spice_server_set_sasl_appname() - specify the name of the app (It is
> >> used for where to find the default configuration file)
> >>
> >
> > Do you think this could be made a separate file? reds_sasl.c? Just a thought.
> 
> We could, I don't really mind. But the API should be availble either
> or not SASL is compiled in.

Forget it, not sure it helps.

> 
> >>  void reds_channel_init_auth_caps(Channel *channel)
> >>  {
> >> -    reds_channel_set_common_caps(channel, SPICE_COMMON_CAP_AUTH_SPICE, TRUE);
> >> +    if (sasl_enabled)
> >> +        reds_channel_set_common_caps(channel, SPICE_COMMON_CAP_AUTH_SASL, TRUE);
> >> +    else
> >> +        reds_channel_set_common_caps(channel, SPICE_COMMON_CAP_AUTH_SPICE, TRUE);
> >
> > Just to be sure I understand: we either support SASL authentication, or SPICE, but
> > never both? unless we talk to a client that doesn't understand the AUTH_SELECTION,
> > and then we fall back to SPICE?
> 
> No, if SASL is enabled, we should only accept SASL (it's enforce
> later, not only in the caps).
> 
> We could do that only at the client/qemu level, and not enforce it
> here. Your thoughts?
> 

Ok, I think it's fine the way it is.

> >>      reds_channel_set_common_caps(channel, SPICE_COMMON_CAP_PROTOCOL_AUTH_SELECTION, TRUE);
> >>  }
> >>
> >> @@ -1487,7 +1498,7 @@ static void reds_handle_main_link(RedLinkInfo *link)
> >>      link_mess = link->link_mess;
> >>      reds_disconnect();
> >>
> >> -    if (!link_mess->connection_id) {
> >> +    if (link_mess->connection_id == 0) {
> >>          reds_send_link_result(link, SPICE_LINK_ERR_OK);
> >>          while((connection_id = rand()) == 0);
> >>          reds->agent_state.num_tokens = 0;
> >> @@ -1671,6 +1682,100 @@ static inline void async_read_clear_handlers(AsyncRead *obj)
> >>      obj->stream->watch = NULL;
> >>  }
> >>
> >> +#if HAVE_SASL
> >> +static int sync_write_u8(RedsStream *s, uint8_t n)
> >> +{
> >> +    return sync_write(s, &n, sizeof(uint8_t));
> >> +}
> >> +
> >> +static int sync_write_u32(RedsStream *s, uint32_t n)
> >> +{
> >> +    return sync_write(s, &n, sizeof(uint32_t));
> >> +}
> >> +
> >> +ssize_t reds_stream_sasl_write(RedsStream *s, const void *buf, size_t nbyte)
> >> +{
> >> +    ssize_t ret;
> >> +
> >> +    if (!s->sasl.encoded) {
> >> +        int err;
> >> +        err = sasl_encode(s->sasl.conn, (char *)buf, nbyte,
> >> +                          (const char **)&s->sasl.encoded,
> >> +                          &s->sasl.encodedLength);
> >> +        if (err != SASL_OK) {
> >> +            red_printf("sasl_encode error: %d", err);
> >> +            return -1;
> >> +        }
> >> +
> >> +        if (s->sasl.encodedLength == 0)
> >> +            return 0;
> > Missing {}
> 
> Argh.. is that in the coding style? Tbh, I don't like the extra {},
> they just make the code more heavy for one line imho.. (perhaps this
> is some python influence on me?)

I'm a pythonista too, and I actually think it looks better with the squiglies.
It's just blocks, c style - and being consistent everywhere, python style.

> >> +    if (sasl->len < 1 || sasl->len > 100) {
> >> +        red_printf("Got client mechname len %d", sasl->len);
> > "Got bad client mechname len %d" FTFY.
> 
> ok
> 
> >>  ssize_t reds_stream_write(RedsStream *s, const void *buf, size_t nbyte)
> >>  {
> >> -    return s->write(s, buf, nbyte);
> >> +    ssize_t ret;
> >> +
> >> +#if HAVE_SASL
> >> +    if (s->sasl.conn && s->sasl.runSSF)
> >> +        ret = reds_stream_sasl_write(s, buf, nbyte);
> > {}
> >> +    else
> >> +#endif
> >> +        ret = s->write(s, buf, nbyte);
> > {}
> >> +
> >
> > Wouldn't this be nicer using just a callback? (like olden times) Well, I don't
> > care to write that patch, so I don't mind if this stays.
> 
> you mean set s->write to reds_stream_sasl_write() at appropriate time?
> That sounds possible. Is that what you asked?
Before we had always user doing the dereference, you changed it to a more oop
style, I think that's good, so actually I take back my request (didn't like the
fact we now have two function calls, but I guess the compiler optimizes this so
I shouldn't worry so much).

> 
> >> +#if HAVE_SASL
> >> +typedef struct RedsSASLContext {
> >
> > So you use Context here after removing it from RedsStream??
> > How about just RedsSASL?
> 
> Yeah, sometime I make irony! ;) ok, it was not intended, I probably
> did it because of RedsStreamContext, then I changed RedsStream but
> forgot RedsSASL...
> 
> Agreed, it needs to be fixed.
> 
> thanks
> 
> -- 
> Marc-André Lureau


More information about the Spice-devel mailing list