1
/* $Id: auth.c 3553 2011-05-05 06:14:19Z nanang $ */
3
* Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
4
* Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
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.
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.
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
25
#define MAX_USERNAME 32
26
#define MAX_PASSWORD 32
29
static char g_realm[MAX_REALM];
33
char username[MAX_USERNAME];
34
char passwd[MAX_PASSWORD];
42
#define THIS_FILE "auth.c"
43
#define THE_NONCE "pjnath"
44
#define LOG(expr) PJ_LOG(3,expr)
48
* Initialize TURN authentication subsystem.
50
PJ_DEF(pj_status_t) pj_turn_auth_init(const char *realm)
52
PJ_ASSERT_RETURN(pj_ansi_strlen(realm) < MAX_REALM, PJ_ENAMETOOLONG);
53
pj_ansi_strcpy(g_realm, realm);
58
* Shutdown TURN authentication subsystem.
60
PJ_DEF(void) pj_turn_auth_dinit(void)
67
* This function is called by pj_stun_verify_credential() when
68
* server needs to challenge the request with 401 response.
70
PJ_DEF(pj_status_t) pj_turn_get_auth(void *user_data,
75
PJ_UNUSED_ARG(user_data);
78
*realm = pj_str(g_realm);
79
*nonce = pj_str(THE_NONCE);
85
* This function is called to get the password for the specified username.
86
* This function is also used to check whether the username is valid.
88
PJ_DEF(pj_status_t) pj_turn_get_password(const pj_stun_msg *msg,
90
const pj_str_t *realm,
91
const pj_str_t *username,
93
pj_stun_passwd_type *data_type,
99
PJ_UNUSED_ARG(user_data);
102
if (pj_stricmp2(realm, g_realm)) {
103
LOG((THIS_FILE, "auth error: invalid realm '%.*s'",
104
(int)realm->slen, realm->ptr));
108
for (i=0; i<PJ_ARRAY_SIZE(g_cred); ++i) {
109
if (pj_stricmp2(username, g_cred[i].username) == 0) {
110
*data_type = PJ_STUN_PASSWD_PLAIN;
111
*data = pj_str(g_cred[i].passwd);
116
LOG((THIS_FILE, "auth error: user '%.*s' not found",
117
(int)username->slen, username->ptr));
122
* This function will be called to verify that the NONCE given
123
* in the message can be accepted. If this callback returns
124
* PJ_FALSE, 438 (Stale Nonce) response will be created.
126
PJ_DEF(pj_bool_t) pj_turn_verify_nonce(const pj_stun_msg *msg,
128
const pj_str_t *realm,
129
const pj_str_t *username,
130
const pj_str_t *nonce)
133
PJ_UNUSED_ARG(user_data);
134
PJ_UNUSED_ARG(realm);
135
PJ_UNUSED_ARG(username);
137
if (pj_stricmp2(nonce, THE_NONCE)) {
138
LOG((THIS_FILE, "auth error: invalid nonce '%.*s'",
139
(int)nonce->slen, nonce->ptr));