Class: OpenSSL::SSL::Session

Inherits:
Object
  • Object
show all
Defined in:
ext/openssl/ossl_ssl_session.c

Defined Under Namespace

Classes: SessionError

Instance Method Summary collapse

Constructor Details

#new(ssl_socket) ⇒ Session #new(string) ⇒ Session

Creates a new Session object from an instance of SSLSocket or DER/PEM encoded String.



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'ext/openssl/ossl_ssl_session.c', line 37

static VALUE ossl_ssl_session_initialize(VALUE self, VALUE arg1)
{
  SSL_SESSION *ctx = NULL;

  if (RDATA(self)->data)
    ossl_raise(eSSLSession, "SSL Session already initialized");

  if (rb_obj_is_instance_of(arg1, cSSLSocket)) {
    SSL *ssl;

    GetSSL(arg1, ssl);

    if ((ctx = SSL_get1_session(ssl)) == NULL)
      ossl_raise(eSSLSession, "no session available");
  } else {
    BIO *in = ossl_obj2bio(&arg1);

    ctx = PEM_read_bio_SSL_SESSION(in, NULL, NULL, NULL);

    if (!ctx) {
            OSSL_BIO_reset(in);
      ctx = d2i_SSL_SESSION_bio(in, NULL);
    }

    BIO_free(in);

    if (!ctx)
      ossl_raise(rb_eArgError, "unknown type");
  }

  /* should not happen */
  if (ctx == NULL)
    ossl_raise(eSSLSession, "ctx not set - internal error");

  RDATA(self)->data = ctx;

  return self;
}

Instance Method Details

#==(session2) ⇒ Boolean

Returns true if the two Session is the same, false if not.



118
119
120
121
122
123
124
125
126
127
128
129
# File 'ext/openssl/ossl_ssl_session.c', line 118

static VALUE ossl_ssl_session_eq(VALUE val1, VALUE val2)
{
  SSL_SESSION *ctx1, *ctx2;

  GetSSLSession(val1, ctx1);
  GetSSLSession(val2, ctx2);

  switch (ossl_SSL_SESSION_cmp(ctx1, ctx2)) {
  case 0:    return Qtrue;
  default: return Qfalse;
  }
}

#idString

Returns the Session ID.



216
217
218
219
220
221
222
223
224
225
226
227
# File 'ext/openssl/ossl_ssl_session.c', line 216

static VALUE ossl_ssl_session_get_id(VALUE self)
{
  SSL_SESSION *ctx;
  const unsigned char *p = NULL;
  unsigned int i = 0;

  GetSSLSession(self, ctx);

  p = SSL_SESSION_get_id(ctx, &i);

  return rb_str_new((const char *) p, i);
}

#initialize_copy(other) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'ext/openssl/ossl_ssl_session.c', line 76

static VALUE
ossl_ssl_session_initialize_copy(VALUE self, VALUE other)
{
    SSL_SESSION *sess, *sess_other, *sess_new;

    rb_check_frozen(self);
    sess = RTYPEDDATA_DATA(self); /* XXX */
    GetSSLSession(other, sess_other);

    sess_new = ASN1_dup((i2d_of_void *)i2d_SSL_SESSION, (d2i_of_void *)d2i_SSL_SESSION,
      (char *)sess_other);
    if (!sess_new)
  ossl_raise(eSSLSession, "ASN1_dup");

    RTYPEDDATA_DATA(self) = sess_new;
    SSL_SESSION_free(sess);

    return self;
}

#timeTime

Returns the time at which the session was established.



137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'ext/openssl/ossl_ssl_session.c', line 137

static VALUE
ossl_ssl_session_get_time(VALUE self)
{
    SSL_SESSION *ctx;
    long t;

    GetSSLSession(self, ctx);
    t = SSL_SESSION_get_time(ctx);
    if (t == 0)
  return Qnil;

    return rb_funcall(rb_cTime, rb_intern("at"), 1, LONG2NUM(t));
}

#time=(time) ⇒ Object #time=(integer) ⇒ Object

Sets start time of the session. Time resolution is in seconds.



179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'ext/openssl/ossl_ssl_session.c', line 179

static VALUE ossl_ssl_session_set_time(VALUE self, VALUE time_v)
{
  SSL_SESSION *ctx;
  long t;

  GetSSLSession(self, ctx);
  if (rb_obj_is_instance_of(time_v, rb_cTime)) {
    time_v = rb_funcall(time_v, rb_intern("to_i"), 0);
  }
  t = NUM2LONG(time_v);
  SSL_SESSION_set_time(ctx, t);
  return ossl_ssl_session_get_time(self);
}

#timeoutInteger

Returns the timeout value set for the session, in seconds from the established time.



159
160
161
162
163
164
165
166
167
168
169
# File 'ext/openssl/ossl_ssl_session.c', line 159

static VALUE
ossl_ssl_session_get_timeout(VALUE self)
{
    SSL_SESSION *ctx;
    long t;

    GetSSLSession(self, ctx);
    t = SSL_SESSION_get_timeout(ctx);

    return LONG2NUM(t);
}

#timeout=(integer) ⇒ Object

Sets how long until the session expires in seconds.



199
200
201
202
203
204
205
206
207
208
# File 'ext/openssl/ossl_ssl_session.c', line 199

static VALUE ossl_ssl_session_set_timeout(VALUE self, VALUE time_v)
{
  SSL_SESSION *ctx;
  long t;

  GetSSLSession(self, ctx);
  t = NUM2LONG(time_v);
  SSL_SESSION_set_timeout(ctx, t);
  return ossl_ssl_session_get_timeout(self);
}

#to_derString

Returns an ASN1 encoded String that contains the Session object.



235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
# File 'ext/openssl/ossl_ssl_session.c', line 235

static VALUE ossl_ssl_session_to_der(VALUE self)
{
  SSL_SESSION *ctx;
  unsigned char *p;
  int len;
  VALUE str;

  GetSSLSession(self, ctx);
  len = i2d_SSL_SESSION(ctx, NULL);
  if (len <= 0) {
    ossl_raise(eSSLSession, "i2d_SSL_SESSION");
  }

  str = rb_str_new(0, len);
  p = (unsigned char *)RSTRING_PTR(str);
  i2d_SSL_SESSION(ctx, &p);
  ossl_str_adjust(str, p);
  return str;
}

#to_pemString

Returns a PEM encoded String that contains the Session object.



261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
# File 'ext/openssl/ossl_ssl_session.c', line 261

static VALUE ossl_ssl_session_to_pem(VALUE self)
{
  SSL_SESSION *ctx;
  BIO *out;

  GetSSLSession(self, ctx);

  if (!(out = BIO_new(BIO_s_mem()))) {
    ossl_raise(eSSLSession, "BIO_s_mem()");
  }

  if (!PEM_write_bio_SSL_SESSION(out, ctx)) {
    BIO_free(out);
    ossl_raise(eSSLSession, "SSL_SESSION_print()");
  }


  return ossl_membio2str(out);
}

#to_textString

Shows everything in the Session object. This is for diagnostic purposes.



288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
# File 'ext/openssl/ossl_ssl_session.c', line 288

static VALUE ossl_ssl_session_to_text(VALUE self)
{
  SSL_SESSION *ctx;
  BIO *out;

  GetSSLSession(self, ctx);

  if (!(out = BIO_new(BIO_s_mem()))) {
    ossl_raise(eSSLSession, "BIO_s_mem()");
  }

  if (!SSL_SESSION_print(out, ctx)) {
    BIO_free(out);
    ossl_raise(eSSLSession, "SSL_SESSION_print()");
  }

  return ossl_membio2str(out);
}