~ubuntu-branches/ubuntu/wily/sflphone/wily

« back to all changes in this revision

Viewing changes to sflphone-common/libs/pjproject/pjnath/src/pjturn-srv/auth.c

  • Committer: Package Import Robot
  • Author(s): Francois Marier
  • Date: 2011-11-25 13:24:12 UTC
  • mfrom: (4.1.10 sid)
  • Revision ID: package-import@ubuntu.com-20111125132412-dc4qvhyosk74cd42
Tags: 1.0.1-4
Don't assume that arch:all packages will get built (closes: #649726)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* $Id: auth.c 2394 2008-12-23 17:27:53Z bennylp $ */
2
 
/* 
3
 
 * Copyright (C) 2008-2009 Teluu Inc. (http://www.teluu.com)
4
 
 * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
5
 
 *
6
 
 * This program is free software; you can redistribute it and/or modify
7
 
 * it under the terms of the GNU General Public License as published by
8
 
 * the Free Software Foundation; either version 2 of the License, or
9
 
 * (at your option) any later version.
10
 
 *
11
 
 * This program is distributed in the hope that it will be useful,
12
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 
 * GNU General Public License for more details.
15
 
 *
16
 
 * You should have received a copy of the GNU General Public License
17
 
 * along with this program; if not, write to the Free Software
18
 
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
19
 
 *
20
 
 *  Additional permission under GNU GPL version 3 section 7:
21
 
 *
22
 
 *  If you modify this program, or any covered work, by linking or
23
 
 *  combining it with the OpenSSL project's OpenSSL library (or a
24
 
 *  modified version of that library), containing parts covered by the
25
 
 *  terms of the OpenSSL or SSLeay licenses, Teluu Inc. (http://www.teluu.com)
26
 
 *  grants you additional permission to convey the resulting work.
27
 
 *  Corresponding Source for a non-source form of such a combination
28
 
 *  shall include the source code for the parts of OpenSSL used as well
29
 
 *  as that of the covered work.
30
 
 */
31
 
#include "auth.h"
32
 
#include <pjlib.h>
33
 
 
34
 
 
35
 
#define MAX_REALM       80
36
 
#define MAX_USERNAME    32
37
 
#define MAX_PASSWORD    32
38
 
#define MAX_NONCE       32
39
 
 
40
 
static char g_realm[MAX_REALM];
41
 
 
42
 
static struct cred_t
43
 
{
44
 
    char    username[MAX_USERNAME];
45
 
    char    passwd[MAX_PASSWORD];
46
 
} g_cred[] = 
47
 
{
48
 
    { "100", "100" },
49
 
    { "700", "700" },
50
 
    { "701", "701" }
51
 
};
52
 
 
53
 
#define THIS_FILE       "auth.c"
54
 
#define THE_NONCE       "pjnath"
55
 
#define LOG(expr)       PJ_LOG(3,expr)
56
 
 
57
 
 
58
 
/*
59
 
 * Initialize TURN authentication subsystem.
60
 
 */
61
 
PJ_DEF(pj_status_t) pj_turn_auth_init(const char *realm)
62
 
{
63
 
    PJ_ASSERT_RETURN(pj_ansi_strlen(realm) < MAX_REALM, PJ_ENAMETOOLONG);
64
 
    pj_ansi_strcpy(g_realm, realm);
65
 
    return PJ_SUCCESS;
66
 
}
67
 
 
68
 
/*
69
 
 * Shutdown TURN authentication subsystem.
70
 
 */
71
 
PJ_DEF(void) pj_turn_auth_dinit(void)
72
 
{
73
 
    /* Nothing to do */
74
 
}
75
 
 
76
 
 
77
 
/*
78
 
 * This function is called by pj_stun_verify_credential() when
79
 
 * server needs to challenge the request with 401 response.
80
 
 */
81
 
PJ_DEF(pj_status_t) pj_turn_get_auth(void *user_data,
82
 
                                     pj_pool_t *pool,
83
 
                                     pj_str_t *realm,
84
 
                                     pj_str_t *nonce)
85
 
{
86
 
    PJ_UNUSED_ARG(user_data);
87
 
    PJ_UNUSED_ARG(pool);
88
 
 
89
 
    *realm = pj_str(g_realm);
90
 
    *nonce = pj_str(THE_NONCE);
91
 
 
92
 
    return PJ_SUCCESS;
93
 
}
94
 
 
95
 
/*
96
 
 * This function is called to get the password for the specified username.
97
 
 * This function is also used to check whether the username is valid.
98
 
 */
99
 
PJ_DEF(pj_status_t) pj_turn_get_password(const pj_stun_msg *msg,
100
 
                                         void *user_data, 
101
 
                                         const pj_str_t *realm,
102
 
                                         const pj_str_t *username,
103
 
                                         pj_pool_t *pool,
104
 
                                         pj_stun_passwd_type *data_type,
105
 
                                         pj_str_t *data)
106
 
{
107
 
    unsigned i;
108
 
 
109
 
    PJ_UNUSED_ARG(msg);
110
 
    PJ_UNUSED_ARG(user_data);
111
 
    PJ_UNUSED_ARG(pool);
112
 
 
113
 
    if (pj_stricmp2(realm, g_realm)) {
114
 
        LOG((THIS_FILE, "auth error: invalid realm '%.*s'", 
115
 
                        (int)realm->slen, realm->ptr));
116
 
        return PJ_EINVAL;
117
 
    }
118
 
 
119
 
    for (i=0; i<PJ_ARRAY_SIZE(g_cred); ++i) {
120
 
        if (pj_stricmp2(username, g_cred[i].username) == 0) {
121
 
            *data_type = PJ_STUN_PASSWD_PLAIN;
122
 
            *data = pj_str(g_cred[i].passwd);
123
 
            return PJ_SUCCESS;
124
 
        }
125
 
    }
126
 
 
127
 
    LOG((THIS_FILE, "auth error: user '%.*s' not found", 
128
 
                    (int)username->slen, username->ptr));
129
 
    return PJ_ENOTFOUND;
130
 
}
131
 
 
132
 
/*
133
 
 * This function will be called to verify that the NONCE given
134
 
 * in the message can be accepted. If this callback returns
135
 
 * PJ_FALSE, 438 (Stale Nonce) response will be created.
136
 
 */
137
 
PJ_DEF(pj_bool_t) pj_turn_verify_nonce(const pj_stun_msg *msg,
138
 
                                       void *user_data,
139
 
                                       const pj_str_t *realm,
140
 
                                       const pj_str_t *username,
141
 
                                       const pj_str_t *nonce)
142
 
{
143
 
    PJ_UNUSED_ARG(msg);
144
 
    PJ_UNUSED_ARG(user_data);
145
 
    PJ_UNUSED_ARG(realm);
146
 
    PJ_UNUSED_ARG(username);
147
 
 
148
 
    if (pj_stricmp2(nonce, THE_NONCE)) {
149
 
        LOG((THIS_FILE, "auth error: invalid nonce '%.*s'", 
150
 
                        (int)nonce->slen, nonce->ptr));
151
 
        return PJ_FALSE;
152
 
    }
153
 
 
154
 
    return PJ_TRUE;
155
 
}
156