Пример #1
0
// Create a new session
// FIXME - This is currently open to a DoS attack.
//         but since we have a session limit, just for opendias.
char *create_session() {
  char *session_id;

  // Check upper session count limit
  int current_session_count = sll_count( sll_findFirstElement( sessions ) );
  o_log( DEBUGM, "There are currently %d active sessions", current_session_count);
  if( current_session_count > MAX_SESSIONS ) {
    return NULL;
  }

  // Generate session key
  uuid_t uu;
  char *sid = malloc(36+1);
  uuid_generate(uu);
  uuid_unparse(uu, sid);
  session_id = o_strdup(sid);
  free(sid);
  o_log(DEBUGM, "Generated new session: %s", session_id );

  // Create new session structure
  struct session_data *session_element = malloc( sizeof(struct session_data) );
  session_element->last_accessed = time(NULL);
  session_element->session_container = sll_init();

  // Save and return
  sll_insert( sessions, o_strdup(session_id), session_element );
  return session_id;
}
Пример #2
0
// Delete session that have not been accessed since 'oldest_allowed'
void clear_sessions_older_than( time_t oldest_allowed ) {
  struct simpleLinkedList *session = NULL;
  struct simpleLinkedList *sess_data = NULL;
  int session_expiration_count = 0;

  session = sll_findFirstElement( sessions );
  while( session != NULL ) {

    struct simpleLinkedList *this_session = session;
    session = sll_getNext( session );

    if( 0 == strcmp( this_session->key, "placeholder" ) )
      continue;

    struct session_data *sessions_element = (struct session_data *)this_session->data;
    if( sessions_element->last_accessed < oldest_allowed ) {

      for( sess_data = sll_findFirstElement( sessions_element->session_container ) ; sess_data != NULL ; sess_data = sll_getNext( sess_data ) ) {
        free( sess_data->key );
        free( sess_data->data );
      }
      sll_destroy( sll_findFirstElement( sessions_element->session_container ) );
      sessions_element->session_container = NULL;

      free( sessions_element );
      this_session->data = NULL;

      o_log( DEBUGM, "Deleting session: %s", this_session->key );
      free( this_session->key );
      this_session->key = NULL;

      sll_delete( this_session );
      session_expiration_count++;
    }
  }
  if( session_expiration_count >= 1 ) {
    o_log( DEBUGM, "Expired %d sessions", session_expiration_count);
  }

}
Пример #3
0
struct simpleLinkedList *sll_findFirstElement( struct simpleLinkedList *element ) {
  if( !element || element->prev == NULL ) {
    return element;
  }
  return sll_findFirstElement( element->prev );
}