~stepankk/pyopenssl/bug-845445

« back to all changes in this revision

Viewing changes to OpenSSL/ssl/connection.c

  • Committer: Jean-Paul Calderone
  • Date: 2011-06-06 12:33:31 UTC
  • mfrom: (153.1.4 sni)
  • Revision ID: exarkun@divmod.com-20110606123331-vm00hkfitja61m7c
Add client and server support for SNI.

Show diffs side-by-side

added added

removed removed

Lines of Context:
263
263
    return (PyObject *)self->context;
264
264
}
265
265
 
 
266
static char ssl_Connection_set_context_doc[] = "\n\
 
267
Switch this connection to a new session context\n\
 
268
\n\
 
269
@param context: A L{Context} instance giving the new session context to use.\n\
 
270
\n\
 
271
";
 
272
static PyObject *
 
273
ssl_Connection_set_context(ssl_ConnectionObj *self, PyObject *args) {
 
274
    ssl_ContextObj *ctx;
 
275
    ssl_ContextObj *old;
 
276
 
 
277
    if (!PyArg_ParseTuple(args, "O!:set_context", &ssl_Context_Type, &ctx)) {
 
278
        return NULL;
 
279
    }
 
280
 
 
281
    /* This Connection will hold on to this context now.  Make sure it stays
 
282
     * alive.
 
283
     */
 
284
    Py_INCREF(ctx);
 
285
 
 
286
    /* XXX The unit tests don't actually verify that this call is made.
 
287
     * They're satisfied if self->context gets updated.
 
288
     */
 
289
    SSL_set_SSL_CTX(self->ssl, ctx->ctx);
 
290
 
 
291
    /* Swap the old out and the new in.
 
292
     */
 
293
    old = self->context;
 
294
    self->context = ctx;
 
295
 
 
296
    /* XXX The unit tests don't verify that this reference is dropped.
 
297
     */
 
298
    Py_DECREF(old);
 
299
 
 
300
    Py_INCREF(Py_None);
 
301
    return Py_None;
 
302
}
 
303
 
 
304
static char ssl_Connection_get_servername_doc[] = "\n\
 
305
Retrieve the servername extension value if provided in the client hello\n\
 
306
message, or None if there wasn't one.\n\
 
307
\n\
 
308
@return: A byte string giving the server name or C{None}.\n\
 
309
\n\
 
310
";
 
311
static PyObject *
 
312
ssl_Connection_get_servername(ssl_ConnectionObj *self, PyObject *args) {
 
313
    int type = TLSEXT_NAMETYPE_host_name;
 
314
    const char *name;
 
315
 
 
316
    if (!PyArg_ParseTuple(args, ":get_servername")) {
 
317
        return NULL;
 
318
    }
 
319
 
 
320
    name = SSL_get_servername(self->ssl, type);
 
321
 
 
322
    if (name == NULL) {
 
323
        Py_INCREF(Py_None);
 
324
        return Py_None;
 
325
    } else {
 
326
        return PyBytes_FromString(name);
 
327
    }
 
328
}
 
329
 
 
330
 
 
331
static char ssl_Connection_set_tlsext_host_name_doc[] = "\n\
 
332
Set the value of the servername extension to send in the client hello.\n\
 
333
\n\
 
334
@param name: A byte string giving the name.\n\
 
335
\n\
 
336
";
 
337
static PyObject *
 
338
ssl_Connection_set_tlsext_host_name(ssl_ConnectionObj *self, PyObject *args) {
 
339
    char *buf;
 
340
 
 
341
    if (!PyArg_ParseTuple(args, BYTESTRING_FMT ":set_tlsext_host_name", &buf)) {
 
342
        return NULL;
 
343
    }
 
344
 
 
345
    /* XXX I guess this can fail sometimes? */
 
346
    SSL_set_tlsext_host_name(self->ssl, buf);
 
347
 
 
348
    Py_INCREF(Py_None);
 
349
    return Py_None;
 
350
}
 
351
 
 
352
 
 
353
 
266
354
static char ssl_Connection_pending_doc[] = "\n\
267
355
Get the number of bytes that can be safely read from the connection\n\
268
356
\n\
1181
1269
static PyMethodDef ssl_Connection_methods[] =
1182
1270
{
1183
1271
    ADD_METHOD(get_context),
 
1272
    ADD_METHOD(set_context),
 
1273
    ADD_METHOD(get_servername),
 
1274
    ADD_METHOD(set_tlsext_host_name),
1184
1275
    ADD_METHOD(pending),
1185
1276
    ADD_METHOD(send),
1186
1277
    ADD_ALIAS (write, send),