[Asterisk-code-review] res pjsip: Update artificial auth whenever default realm cha... (asterisk[master])

Anonymous Coward asteriskteam at digium.com
Tue Feb 21 22:55:13 CST 2017


Anonymous Coward #1000019 has submitted this change and it was merged. ( https://gerrit.asterisk.org/4992 )

Change subject: res_pjsip: Update artificial auth whenever default_realm changes.
......................................................................


res_pjsip: Update artificial auth whenever default_realm changes.

There was code attempting to update the artificial authentication object
whenever the default_realm changed.  However, once the artificial
authentication object was created it would never get updated.  The
artificial authentication object would require a system restart for a
change to the default_realm to take effect.

ASTERISK-26799

Change-Id: Id59036e9529c2d3ed728af2ed904dc36e7094802
---
M res/res_pjsip/pjsip_distributor.c
1 file changed, 61 insertions(+), 23 deletions(-)

Approvals:
  Kevin Harwell: Looks good to me, but someone else must approve
  Anonymous Coward #1000019: Verified
  Joshua Colp: Looks good to me, approved



diff --git a/res/res_pjsip/pjsip_distributor.c b/res/res_pjsip/pjsip_distributor.c
index eabfa4b..d043063 100644
--- a/res/res_pjsip/pjsip_distributor.c
+++ b/res/res_pjsip/pjsip_distributor.c
@@ -43,7 +43,6 @@
 
 /* From the auth/realm realtime column size */
 #define MAX_REALM_LENGTH 40
-static char default_realm[MAX_REALM_LENGTH + 1];
 
 #define DEFAULT_SUSPECTS_BUCKETS 53
 
@@ -462,35 +461,54 @@
 	return PJ_TRUE;
 }
 
-static struct ast_sip_auth *artificial_auth;
+static struct ast_sip_auth *alloc_artificial_auth(char *default_realm)
+{
+	struct ast_sip_auth *fake_auth;
+
+	fake_auth = ast_sorcery_alloc(ast_sip_get_sorcery(), SIP_SORCERY_AUTH_TYPE,
+		"artificial");
+	if (!fake_auth) {
+		return NULL;
+	}
+
+	ast_string_field_set(fake_auth, realm, default_realm);
+	ast_string_field_set(fake_auth, auth_user, "");
+	ast_string_field_set(fake_auth, auth_pass, "");
+	fake_auth->type = AST_SIP_AUTH_TYPE_ARTIFICIAL;
+
+	return fake_auth;
+}
+
+static AO2_GLOBAL_OBJ_STATIC(artificial_auth);
 
 static int create_artificial_auth(void)
 {
-	if (!(artificial_auth = ast_sorcery_alloc(
-		      ast_sip_get_sorcery(), SIP_SORCERY_AUTH_TYPE, "artificial"))) {
+	char default_realm[MAX_REALM_LENGTH + 1];
+	struct ast_sip_auth *fake_auth;
+
+	ast_sip_get_default_realm(default_realm, sizeof(default_realm));
+	fake_auth = alloc_artificial_auth(default_realm);
+	if (!fake_auth) {
 		ast_log(LOG_ERROR, "Unable to create artificial auth\n");
 		return -1;
 	}
 
-	ast_string_field_set(artificial_auth, realm, default_realm);
-	ast_string_field_set(artificial_auth, auth_user, "");
-	ast_string_field_set(artificial_auth, auth_pass, "");
-	artificial_auth->type = AST_SIP_AUTH_TYPE_ARTIFICIAL;
+	ao2_global_obj_replace_unref(artificial_auth, fake_auth);
+	ao2_ref(fake_auth, -1);
 	return 0;
 }
 
 struct ast_sip_auth *ast_sip_get_artificial_auth(void)
 {
-	ao2_ref(artificial_auth, +1);
-	return artificial_auth;
+	return ao2_global_obj_ref(artificial_auth);
 }
 
 static struct ast_sip_endpoint *artificial_endpoint = NULL;
 
 static int create_artificial_endpoint(void)
 {
-	if (!(artificial_endpoint = ast_sorcery_alloc(
-		      ast_sip_get_sorcery(), "endpoint", NULL))) {
+	artificial_endpoint = ast_sorcery_alloc(ast_sip_get_sorcery(), "endpoint", NULL);
+	if (!artificial_endpoint) {
 		return -1;
 	}
 
@@ -968,20 +986,40 @@
 
 static void global_loaded(const char *object_type)
 {
-	char *identifier_order = ast_sip_get_endpoint_identifier_order();
-	char *io_copy = identifier_order ? ast_strdupa(identifier_order) : NULL;
-	char *identify_method;
+	char default_realm[MAX_REALM_LENGTH + 1];
+	struct ast_sip_auth *fake_auth;
+	char *identifier_order;
 
-	ast_free(identifier_order);
-	using_auth_username = 0;
-	while ((identify_method = ast_strip(strsep(&io_copy, ",")))) {
-		if (!strcmp(identify_method, "auth_username")) {
-			using_auth_username = 1;
-			break;
+	/* Update using_auth_username */
+	identifier_order = ast_sip_get_endpoint_identifier_order();
+	if (identifier_order) {
+		char *identify_method;
+		char *io_copy = ast_strdupa(identifier_order);
+		int new_using = 0;
+
+		ast_free(identifier_order);
+		while ((identify_method = ast_strip(strsep(&io_copy, ",")))) {
+			if (!strcmp(identify_method, "auth_username")) {
+				new_using = 1;
+				break;
+			}
+		}
+		using_auth_username = new_using;
+	}
+
+	/* Update default_realm of artificial_auth */
+	ast_sip_get_default_realm(default_realm, sizeof(default_realm));
+	fake_auth = ast_sip_get_artificial_auth();
+	if (!fake_auth || strcmp(fake_auth->realm, default_realm)) {
+		ao2_cleanup(fake_auth);
+
+		fake_auth = alloc_artificial_auth(default_realm);
+		if (fake_auth) {
+			ao2_global_obj_replace_unref(artificial_auth, fake_auth);
+			ao2_ref(fake_auth, -1);
 		}
 	}
 
-	ast_sip_get_default_realm(default_realm, sizeof(default_realm));
 	ast_sip_get_unidentified_request_thresholds(&unidentified_count, &unidentified_period, &unidentified_prune_interval);
 
 	/* Clean out the old task, if any */
@@ -1114,7 +1152,7 @@
 	internal_sip_unregister_service(&endpoint_mod);
 	internal_sip_unregister_service(&distributor_mod);
 
-	ao2_cleanup(artificial_auth);
+	ao2_global_obj_release(artificial_auth);
 	ao2_cleanup(artificial_endpoint);
 
 	ast_sorcery_observer_remove(ast_sip_get_sorcery(), "global", &global_observer);

-- 
To view, visit https://gerrit.asterisk.org/4992
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Id59036e9529c2d3ed728af2ed904dc36e7094802
Gerrit-PatchSet: 3
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Owner: Richard Mudgett <rmudgett at digium.com>
Gerrit-Reviewer: Anonymous Coward #1000019
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>
Gerrit-Reviewer: Kevin Harwell <kharwell at digium.com>



More information about the asterisk-code-review mailing list