summaryrefslogtreecommitdiff
path: root/daemon
diff options
context:
space:
mode:
authorRoss Lagerwall <rosslagerwall@gmail.com>2014-07-30 17:34:48 +0100
committerRoss Lagerwall <rosslagerwall@gmail.com>2014-09-27 09:37:24 +0100
commitc6200ea2184b63016fe573155b0480ba88069456 (patch)
tree51a482187bacb3e1f3318ed9390190901dad7066 /daemon
parentfab432937b4bfcd56c07c8be3e14335612bd42f3 (diff)
downloadgvfs-c6200ea2184b63016fe573155b0480ba88069456.tar.gz
afp: Use UTF-8 for volume names
Use UTF-8 for volume names since volume names are encoded as UTF-8 for protocol versions 3.0 and higher. This prevents seeing volume names like: "John’s Public Folder" Since the volume name comes as a pascal string with UTF-8 encoding, extend the function to read pascal strings with the ability to read pascal strings encoded as UTF-8. https://bugzilla.gnome.org/show_bug.cgi?id=733996
Diffstat (limited to 'daemon')
-rw-r--r--daemon/gvfsafpconnection.c28
-rw-r--r--daemon/gvfsafpconnection.h2
-rw-r--r--daemon/gvfsafpserver.c12
-rw-r--r--daemon/gvfsafputils.h4
4 files changed, 32 insertions, 14 deletions
diff --git a/daemon/gvfsafpconnection.c b/daemon/gvfsafpconnection.c
index 97d1f538..2f2958d7 100644
--- a/daemon/gvfsafpconnection.c
+++ b/daemon/gvfsafpconnection.c
@@ -275,7 +275,7 @@ g_vfs_afp_reply_dup_data (GVfsAfpReply *reply, gsize size, guint8 **data)
}
gboolean
-g_vfs_afp_reply_read_pascal (GVfsAfpReply *reply, char **str)
+g_vfs_afp_reply_read_pascal (GVfsAfpReply *reply, gboolean is_utf8, char **str)
{
guint8 strsize;
@@ -290,12 +290,30 @@ g_vfs_afp_reply_read_pascal (GVfsAfpReply *reply, char **str)
if (str)
{
- *str = g_convert (reply->data + reply->pos, strsize,
- "UTF-8", "MACINTOSH", NULL, NULL, NULL);
+ if (is_utf8)
+ {
+ char *tmp;
+
+ if (!g_vfs_afp_reply_get_data (reply, strsize, (guint8 **)&tmp))
+ {
+ reply->pos--;
+ return FALSE;
+ }
+
+ *str = g_utf8_normalize (tmp, strsize, G_NORMALIZE_DEFAULT_COMPOSE);
+ }
+ else
+ {
+ *str = g_convert (reply->data + reply->pos, strsize,
+ "UTF-8", "MACINTOSH", NULL, NULL, NULL);
+ reply->pos += strsize;
+ }
+ }
+ else
+ {
+ reply->pos += strsize;
}
- reply->pos += strsize;
-
return TRUE;
}
diff --git a/daemon/gvfsafpconnection.h b/daemon/gvfsafpconnection.h
index 5d90cf64..1435e0df 100644
--- a/daemon/gvfsafpconnection.h
+++ b/daemon/gvfsafpconnection.h
@@ -254,7 +254,7 @@ gboolean g_vfs_afp_reply_read_uint16 (GVfsAfpReply *reply, guint16
gboolean g_vfs_afp_reply_get_data (GVfsAfpReply *reply, gsize size, guint8 **data);
gboolean g_vfs_afp_reply_dup_data (GVfsAfpReply *reply, gsize size, guint8 **data);
-gboolean g_vfs_afp_reply_read_pascal (GVfsAfpReply *reply, char **str);
+gboolean g_vfs_afp_reply_read_pascal (GVfsAfpReply *reply, gboolean is_utf8, char **str);
gboolean g_vfs_afp_reply_read_afp_name (GVfsAfpReply *reply, gboolean read_text_encoding, GVfsAfpName **afp_name);
gboolean g_vfs_afp_reply_seek (GVfsAfpReply *reply, goffset offset, GSeekType type);
diff --git a/daemon/gvfsafpserver.c b/daemon/gvfsafpserver.c
index 2d3d33db..69e04b5a 100644
--- a/daemon/gvfsafpserver.c
+++ b/daemon/gvfsafpserver.c
@@ -760,7 +760,7 @@ get_server_info (GVfsAfpServer *server,
REPLY_READ_UINT16 (reply, &priv->info.flags);
- REPLY_READ_PASCAL (reply, &priv->info.server_name);
+ REPLY_READ_PASCAL (reply, FALSE, &priv->info.server_name);
/* Parse UTF-8 ServerName */
if (priv->info.flags & (0x1 << 8)) {
@@ -779,7 +779,7 @@ get_server_info (GVfsAfpServer *server,
/* Parse MachineType */
REPLY_SEEK (reply, MachineType_offset, G_SEEK_SET);
- REPLY_READ_PASCAL (reply, &priv->info.machine_type);
+ REPLY_READ_PASCAL (reply, FALSE, &priv->info.machine_type);
/* Parse Versions */
REPLY_SEEK (reply, AFPVersionCount_offset, G_SEEK_SET);
@@ -789,7 +789,7 @@ get_server_info (GVfsAfpServer *server,
char *version;
AfpVersion afp_version;
- REPLY_READ_PASCAL (reply, &version);
+ REPLY_READ_PASCAL (reply, FALSE, &version);
afp_version = string_to_afp_version (version);
g_free (version);
if (afp_version > priv->info.version)
@@ -813,7 +813,7 @@ get_server_info (GVfsAfpServer *server,
{
char *uam;
- REPLY_READ_PASCAL (reply, &uam);
+ REPLY_READ_PASCAL (reply, FALSE, &uam);
priv->info.uams = g_slist_prepend (priv->info.uams, uam);
}
@@ -1342,7 +1342,7 @@ get_volumes_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
GVfsAfpVolumeData *volume_data;
REPLY_READ_BYTE (reply, &flags);
- REPLY_READ_PASCAL (reply, &vol_name);
+ REPLY_READ_PASCAL (reply, TRUE, &vol_name);
if (!vol_name)
continue;
@@ -1743,7 +1743,7 @@ map_id_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
if (map_data->function == GVFS_AFP_MAP_ID_FUNCTION_USER_ID_TO_NAME ||
map_data->function == GVFS_AFP_MAP_ID_FUNCTION_GROUP_ID_TO_NAME)
{
- REPLY_READ_PASCAL (reply, &map_data->name);
+ REPLY_READ_PASCAL (reply, FALSE, &map_data->name);
}
else
{
diff --git a/daemon/gvfsafputils.h b/daemon/gvfsafputils.h
index d520327e..06724403 100644
--- a/daemon/gvfsafputils.h
+++ b/daemon/gvfsafputils.h
@@ -127,9 +127,9 @@ G_STMT_START { \
goto invalid_reply; \
} G_STMT_END
-#define REPLY_READ_PASCAL(reply, val) \
+#define REPLY_READ_PASCAL(reply, is_utf8, val) \
G_STMT_START { \
- if (!g_vfs_afp_reply_read_pascal (reply, val)) \
+ if (!g_vfs_afp_reply_read_pascal (reply, is_utf8, val)) \
goto invalid_reply; \
} G_STMT_END