summaryrefslogtreecommitdiff
path: root/src/chat/sman.cpp
blob: 6ae665f7ba0069fd86c485eadde42a47284f0543 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#ifndef SMAN_CPP
#define SMAN_CPP

#include "sman.h"
#include "../tool/tool.h"
#include "../maps/mtools.h"
#include "../contrib/crypt/md5.h"

sman::sman() : smap<sess*,string>::smap(HMAPOCC)
{
    i_session_count = 0;
    pthread_mutex_init( &mut_i_session_count, NULL );
}

sman::~sman()
{
    // Delete each session object of the smap!
    smap<sess*,string>::run_func( mtools<sess*>::delete_obj );	
    pthread_mutex_destroy( &mut_i_session_count );
}

string sman::generate_id( int i_len )
{
    string valid_chars = wrap::CONF->get_elem("chat.session.validchars");
    string s_ret = "";

    srand(time(0)+tool::string2int(wrap::CONF->get_elem("chat.session.kloakkey")));
    int i_char;

    for (int i = 0; i < i_len; i++)
    {
     i_char = rand() % 64;
     s_ret += valid_chars[i_char];
    }

    if ( wrap::CONF->get_elem("chat.session.md5hash") == "true" )
    {
      string s_salt = wrap::CONF->get_elem("chat.session.md5salt");
      s_ret = string(md5::MD5Crypt(s_ret.c_str(), s_salt.c_str())); 
      return s_ret.substr(s_ret.find(s_salt) + s_salt.length() + 3);
    }

    return s_ret;
}

sess *sman::create_session( )
{
    string s_tmpid = generate_id( tool::string2int( wrap::CONF->get_elem( "chat.session.length" ) ) );

    sess* p_sess = new sess( s_tmpid );

    pthread_mutex_lock( &mut_i_session_count );
    i_session_count++;
#ifdef NCURSES
    print_sessions();
#endif
    pthread_mutex_unlock( &mut_i_session_count );

    //????
    add_elem( p_sess, s_tmpid );

    return p_sess;
}

sess *sman::get_session( string s_id )
{
    return get_elem( s_id );
}

void
sman::destroy_session( string s_id )
{
    pthread_mutex_lock( &mut_i_session_count );
    i_session_count--;
#ifdef NCURSES
    print_sessions();
#endif
    pthread_mutex_unlock( &mut_i_session_count );

    sess* p_sess = get_elem( s_id );
    del_elem( s_id );
    delete p_sess;
}

#ifdef NCURSES
void sman::print_sessions()
{
    if ( wrap::NCUR->is_ready() )
    {
     mvprintw( NCUR_SESSION_X,NCUR_SESSION_Y, "Sessions: %d ", i_session_count);
     refresh();
    }
}

#ifdef NCURSES
void sman::print_init_ncurses()
{
    pthread_mutex_lock( &mut_i_session_count );
    print_sessions();
    pthread_mutex_unlock( &mut_i_session_count );
}
#endif

int
sman::get_session_count()
{
    int i_ret;
    pthread_mutex_lock( &mut_i_session_count );
    i_ret = i_session_count; 
    pthread_mutex_unlock( &mut_i_session_count );
    return i_ret;
}

#endif
#endif