Apply URL encoding when username of turn server URL has ':' 86/279386/1
authorSangchul Lee <sc11.lee@samsung.com>
Thu, 28 Jul 2022 15:43:31 +0000 (00:43 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Mon, 8 Aug 2022 08:35:02 +0000 (17:35 +0900)
The form of URL should be turn(s)://username:password@host:port.

If the username has ':', for example '1221435:someidstring',
this could not be applied properly inside of webrtcbin.

In this case, this patch fixes it with using URL encoding
to avoid this situation.

[Version] 0.2.179
[Issue Type] Bug fix

Change-Id: Icd30fdbea39469526abde8016745fc291bf2d4a5
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
include/webrtc.h
include/webrtc_private.h
packaging/capi-media-webrtc.spec
src/webrtc.c
src/webrtc_private.c

index 2d0ebef204c6a3097b0af5e3114574e2d85157e3..e5f9695bea75076f46f821b7c80be159edd8dc69 100644 (file)
@@ -1341,7 +1341,7 @@ int webrtc_get_stun_server(webrtc_h webrtc, char **stun_server);
  * @since_tizen 6.5
  * @remarks Regarding TURN, refer to the RFC7065(https://tools.ietf.org/html/rfc7065).
  * @param[in] webrtc       WebRTC handle
- * @param[in] turn_server  The TURN server URL of the form turn(s)://username:password\@host:port
+ * @param[in] turn_server  The TURN server URL of the form turn(s)://username:password@host:port
  * @return @c 0 on success,
  *         otherwise a negative error value
  * @retval #WEBRTC_ERROR_NONE    Successful
index b3b38623fd965f33edb8ec4782ca39a0f946e1f2..b094c9de0b57fee3e4d6d265e678a273661bee1a 100644 (file)
@@ -685,6 +685,7 @@ int _webrtcbin_set_session_description(webrtc_s *webrtc, const char *description
 int _webrtcbin_add_ice_candidate(webrtc_s *webrtc, const char *candidate);
 void _webrtcbin_on_data_channel_cb(GstElement *webrtcbin, GObject *data_channel, gpointer user_data);
 bool _webrtcbin_have_remote_offer(webrtc_s *webrtc);
+gchar *_check_and_encode_turn_url(const char *url);
 
 void _init_data_channels(webrtc_s *webrtc);
 void _destroy_data_channels(webrtc_s *webrtc);
index bb514530a6c65d12c89cd98c264490903b07f048..204ee88df0cfaff11f98afc2f81db45c61e94d99 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.2.178
+Version:    0.2.179
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 4f829ab97389d70e9deb4de795619bcaf51770de..0f6924131d0b194d8680473cae644d481b6bf614 100644 (file)
@@ -895,7 +895,8 @@ int webrtc_add_turn_server(webrtc_h webrtc, const char *turn_server)
 {
        gboolean ret = FALSE;
        g_autoptr(GMutexLocker) locker = NULL;
-       webrtc_s *_webrtc = (webrtc_s*)webrtc;
+       webrtc_s *_webrtc = (webrtc_s *)webrtc;
+       gchar *turn_url;
 
        RET_VAL_IF(_webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
        RET_VAL_IF(turn_server == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "turn_server is NULL");
@@ -904,12 +905,18 @@ int webrtc_add_turn_server(webrtc_h webrtc, const char *turn_server)
 
        RET_VAL_IF(_webrtc->state != WEBRTC_STATE_IDLE, WEBRTC_ERROR_INVALID_STATE, "the state should be IDLE");
 
-       g_signal_emit_by_name(G_OBJECT(_webrtc->gst.webrtcbin), "add-turn-server", turn_server, &ret);
-       RET_VAL_IF(!ret, WEBRTC_ERROR_INVALID_PARAMETER, "invalid turn server url (%s)", turn_server);
+       turn_url = _check_and_encode_turn_url(turn_server);
+
+       g_signal_emit_by_name(G_OBJECT(_webrtc->gst.webrtcbin), "add-turn-server", turn_url, &ret);
+       if (!ret) {
+               LOG_ERROR("invalid turn server url (%s)", turn_url);
+               g_free(turn_url);
+               return WEBRTC_ERROR_INVALID_PARAMETER;
+       }
 
-       _webrtc->turn_server_urls = g_list_append(_webrtc->turn_server_urls, g_strdup(turn_server));
+       _webrtc->turn_server_urls = g_list_append(_webrtc->turn_server_urls, turn_url);
 
-       LOG_INFO("webrtc[%p] turn_server[%s]", webrtc, turn_server);
+       LOG_INFO("webrtc[%p] turn_server[%s]", webrtc, turn_url);
 
        return WEBRTC_ERROR_NONE;
 }
index fdf7e757484aefd95ea899411e020b297fcf818b..36455dfde143a97202df76a0015f6ef1024c12b8 100644 (file)
@@ -140,8 +140,20 @@ void _generate_dot(GstElement *pipeline, const gchar *name)
        g_free(dot_name);
 }
 
+gchar *_check_and_encode_turn_url(const char *url)
+{
+       g_auto(GStrv) str_arr = g_strsplit(url, "@", 2);
+       g_auto(GStrv) str_arr2 = g_strsplit(str_arr[0], ":", 0);
+
+       if (g_strv_length(str_arr2) > 3) /* NOTE: assume id has ':' character */
+               return g_strdup_printf("%s:%s%s%s:%s@%s",
+                       str_arr2[0], str_arr2[1], "%3A", str_arr2[2], str_arr2[3], str_arr[1]);
+
+       return g_strdup(url);
+}
+
 /* Use g_free() to release the return value. */
-static gchar__get_string_from_json_object(JsonObject *object)
+static gchar *__get_string_from_json_object(JsonObject *object)
 {
        JsonNode *root;
        JsonGenerator *generator;
@@ -161,7 +173,7 @@ static gchar* __get_string_from_json_object(JsonObject *object)
 }
 
 /* Use g_free() to release the return value. */
-static gchar__make_sdp_message(GstWebRTCSessionDescription *desc)
+static gchar *__make_sdp_message(GstWebRTCSessionDescription *desc)
 {
        gchar *text;
        JsonObject *msg, *sdp;