- Update to 2.21.90
- Update build requirements. - Remove patch for GNOME #363695 (obsolete/problematic). - Remove patch for GNOME #509741 (fixed upstream).
This commit is contained in:
parent
4f9238a9f3
commit
5d2020ca78
@ -1 +1 @@
|
|||||||
evolution-2.21.5.tar.bz2
|
evolution-2.21.90.tar.bz2
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
diff -up evolution-2.21.5/mail/mail-session.c.crash-on-startup evolution-2.21.5/mail/mail-session.c
|
|
||||||
--- evolution-2.21.5/mail/mail-session.c.crash-on-startup 2008-01-10 04:20:18.000000000 -0500
|
|
||||||
+++ evolution-2.21.5/mail/mail-session.c 2008-01-15 16:15:51.000000000 -0500
|
|
||||||
@@ -351,7 +351,13 @@ user_message_exec (struct _user_message_
|
|
||||||
g_signal_connect (
|
|
||||||
user_message_dialog, "response",
|
|
||||||
G_CALLBACK (user_message_response), m);
|
|
||||||
- em_utils_show_error_silent (user_message_dialog);
|
|
||||||
+
|
|
||||||
+ /* If the dialog has no "primary" text, there's nothing to
|
|
||||||
+ * display in the status bar. So just show the dialog. */
|
|
||||||
+ if (g_object_get_data (user_message_dialog, "primary"))
|
|
||||||
+ em_utils_show_error_silent (user_message_dialog);
|
|
||||||
+ else
|
|
||||||
+ gtk_widget_show (user_message_dialog);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,270 +0,0 @@
|
|||||||
diff -up evolution-2.21.2/mail/message-list.c.kill-ememory evolution-2.21.2/mail/message-list.c
|
|
||||||
--- evolution-2.21.2/mail/message-list.c.kill-ememory 2007-12-01 10:22:46.000000000 -0500
|
|
||||||
+++ evolution-2.21.2/mail/message-list.c 2007-12-01 10:23:43.000000000 -0500
|
|
||||||
@@ -416,70 +416,28 @@ get_message_info (MessageList *message_l
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
|
|
||||||
-static const char *
|
|
||||||
-get_normalised_string (MessageList *message_list, CamelMessageInfo *info, int col)
|
|
||||||
+static const gchar *
|
|
||||||
+get_normalised_string (MessageList *message_list, const gchar *string)
|
|
||||||
{
|
|
||||||
- const char *string, *str;
|
|
||||||
- char *normalised;
|
|
||||||
- EPoolv *poolv;
|
|
||||||
- int index;
|
|
||||||
-
|
|
||||||
- switch (col) {
|
|
||||||
- case COL_SUBJECT_NORM:
|
|
||||||
- string = camel_message_info_subject (info);
|
|
||||||
- index = NORMALISED_SUBJECT;
|
|
||||||
- break;
|
|
||||||
- case COL_FROM_NORM:
|
|
||||||
- string = camel_message_info_from (info);
|
|
||||||
- index = NORMALISED_FROM;
|
|
||||||
- break;
|
|
||||||
- case COL_TO_NORM:
|
|
||||||
- string = camel_message_info_to (info);
|
|
||||||
- index = NORMALISED_TO;
|
|
||||||
- break;
|
|
||||||
- default:
|
|
||||||
- string = NULL;
|
|
||||||
- index = NORMALISED_LAST;
|
|
||||||
- g_warning ("Should not be reached\n");
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- /* slight optimisation */
|
|
||||||
- if (string == NULL || string[0] == '\0')
|
|
||||||
+ GHashTable *hash_table = message_list->normalised_hash;
|
|
||||||
+ GStringChunk *string_chunk = message_list->string_chunk;
|
|
||||||
+ gchar *collation_key, *temp;
|
|
||||||
+
|
|
||||||
+ if (string == NULL || *string == '\0')
|
|
||||||
return "";
|
|
||||||
-
|
|
||||||
- poolv = g_hash_table_lookup (message_list->normalised_hash, camel_message_info_uid (info));
|
|
||||||
- if (poolv == NULL) {
|
|
||||||
- poolv = e_poolv_new (NORMALISED_LAST);
|
|
||||||
- g_hash_table_insert (message_list->normalised_hash, (char *) camel_message_info_uid (info), poolv);
|
|
||||||
- } else {
|
|
||||||
- str = e_poolv_get (poolv, index);
|
|
||||||
- if (*str)
|
|
||||||
- return str;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- if (col == COL_SUBJECT_NORM) {
|
|
||||||
- const unsigned char *subject;
|
|
||||||
-
|
|
||||||
- subject = (const unsigned char *) string;
|
|
||||||
- while (!g_ascii_strncasecmp ((char *)subject, "Re:", 3)) {
|
|
||||||
- subject += 3;
|
|
||||||
-
|
|
||||||
- /* jump over any spaces */
|
|
||||||
- while (*subject && isspace ((int) *subject))
|
|
||||||
- subject++;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- /* jump over any spaces */
|
|
||||||
- while (*subject && isspace ((int) *subject))
|
|
||||||
- subject++;
|
|
||||||
-
|
|
||||||
- string = (const char *) subject;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- normalised = g_utf8_collate_key (string, -1);
|
|
||||||
- e_poolv_set (poolv, index, normalised, TRUE);
|
|
||||||
-
|
|
||||||
- return e_poolv_get (poolv, index);
|
|
||||||
+
|
|
||||||
+ collation_key = g_hash_table_lookup (hash_table, string);
|
|
||||||
+ if (collation_key != NULL)
|
|
||||||
+ return collation_key;
|
|
||||||
+
|
|
||||||
+ temp = g_utf8_collate_key (string, -1);
|
|
||||||
+ collation_key = g_string_chunk_insert_const (string_chunk, temp);
|
|
||||||
+ g_free (temp);
|
|
||||||
+
|
|
||||||
+ temp = g_string_chunk_insert_const (string_chunk, string);
|
|
||||||
+ g_hash_table_insert (hash_table, temp, collation_key);
|
|
||||||
+
|
|
||||||
+ return collation_key;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
@@ -1287,12 +1245,23 @@ ml_tree_value_at (ETreeModel *etm, ETree
|
|
||||||
str = camel_message_info_from (msg_info);
|
|
||||||
return (void *)(str ? str : "");
|
|
||||||
case COL_FROM_NORM:
|
|
||||||
- return (void *) get_normalised_string (message_list, msg_info, col);
|
|
||||||
+ str = camel_message_info_from (msg_info);
|
|
||||||
+ return (void *) get_normalised_string (message_list, str);
|
|
||||||
case COL_SUBJECT:
|
|
||||||
str = camel_message_info_subject (msg_info);
|
|
||||||
return (void *)(str ? str : "");
|
|
||||||
case COL_SUBJECT_NORM:
|
|
||||||
- return (void *) get_normalised_string (message_list, msg_info, col);
|
|
||||||
+ str = camel_message_info_subject (msg_info);
|
|
||||||
+ while (str != NULL && *str != '\0') {
|
|
||||||
+ /* skip over spaces and reply prefixes */
|
|
||||||
+ if (g_ascii_strncasecmp (str, "Re:", 3) == 0)
|
|
||||||
+ str += 3;
|
|
||||||
+ else if (g_ascii_isspace (*str))
|
|
||||||
+ str++;
|
|
||||||
+ else
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ return (void *) get_normalised_string (message_list, str);
|
|
||||||
case COL_SENT: {
|
|
||||||
ETreePath child;
|
|
||||||
|
|
||||||
@@ -1316,7 +1285,8 @@ ml_tree_value_at (ETreeModel *etm, ETree
|
|
||||||
str = camel_message_info_to (msg_info);
|
|
||||||
return (void *)(str ? str : "");
|
|
||||||
case COL_TO_NORM:
|
|
||||||
- return (void *) get_normalised_string (message_list, msg_info, col);
|
|
||||||
+ str = camel_message_info_to (msg_info);
|
|
||||||
+ return (void *) get_normalised_string (message_list, str);
|
|
||||||
case COL_SIZE:
|
|
||||||
return GINT_TO_POINTER (camel_message_info_size(msg_info));
|
|
||||||
case COL_DELETED:
|
|
||||||
@@ -2066,13 +2036,13 @@ message_list_init (MessageList *message_
|
|
||||||
gtk_scrolled_window_set_vadjustment ((GtkScrolledWindow *) message_list, adjustment);
|
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (message_list), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
|
|
||||||
|
|
||||||
- message_list->normalised_hash = g_hash_table_new_full (
|
|
||||||
- g_str_hash, g_str_equal,
|
|
||||||
- (GDestroyNotify) NULL,
|
|
||||||
- (GDestroyNotify) e_poolv_destroy);
|
|
||||||
+ message_list->normalised_hash =
|
|
||||||
+ g_hash_table_new (g_str_hash, g_str_equal);
|
|
||||||
+
|
|
||||||
+ message_list->string_chunk = g_string_chunk_new (1024);
|
|
||||||
|
|
||||||
message_list->hidden = NULL;
|
|
||||||
- message_list->hidden_pool = NULL;
|
|
||||||
+ message_list->hidden_string_chunk = NULL;
|
|
||||||
message_list->hide_before = ML_HIDE_NONE_START;
|
|
||||||
message_list->hide_after = ML_HIDE_NONE_END;
|
|
||||||
|
|
||||||
@@ -2166,15 +2136,16 @@ message_list_finalise (GObject *object)
|
|
||||||
struct _MessageListPrivate *p = message_list->priv;
|
|
||||||
|
|
||||||
g_hash_table_destroy (message_list->normalised_hash);
|
|
||||||
+ g_string_chunk_free (message_list->string_chunk);
|
|
||||||
|
|
||||||
if (message_list->thread_tree)
|
|
||||||
camel_folder_thread_messages_unref(message_list->thread_tree);
|
|
||||||
|
|
||||||
if (message_list->hidden) {
|
|
||||||
g_hash_table_destroy(message_list->hidden);
|
|
||||||
- e_mempool_destroy(message_list->hidden_pool);
|
|
||||||
+ g_string_chunk_free(message_list->hidden_string_chunk);
|
|
||||||
message_list->hidden = NULL;
|
|
||||||
- message_list->hidden_pool = NULL;
|
|
||||||
+ message_list->hidden_string_chunk = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free(message_list->search);
|
|
||||||
@@ -3124,6 +3095,9 @@ message_list_set_folder (MessageList *me
|
|
||||||
|
|
||||||
/* reset the normalised sort performance hack */
|
|
||||||
g_hash_table_remove_all (message_list->normalised_hash);
|
|
||||||
+
|
|
||||||
+ g_string_chunk_free (message_list->string_chunk);
|
|
||||||
+ message_list->string_chunk = g_string_chunk_new (1024);
|
|
||||||
|
|
||||||
mail_regen_cancel(message_list);
|
|
||||||
|
|
||||||
@@ -3574,14 +3548,14 @@ message_list_hide_uids (MessageList *ml,
|
|
||||||
MESSAGE_LIST_LOCK (ml, hide_lock);
|
|
||||||
if (ml->hidden == NULL) {
|
|
||||||
ml->hidden = g_hash_table_new (g_str_hash, g_str_equal);
|
|
||||||
- ml->hidden_pool = e_mempool_new (512, 256, E_MEMPOOL_ALIGN_BYTE);
|
|
||||||
+ ml->hidden_string_chunk = g_string_chunk_new (512);
|
|
||||||
}
|
|
||||||
|
|
||||||
- uid = e_mempool_strdup (ml->hidden_pool, uids->pdata[i]);
|
|
||||||
+ uid = g_string_chunk_insert (ml->hidden_string_chunk, uids->pdata[i]);
|
|
||||||
g_hash_table_insert (ml->hidden, uid, uid);
|
|
||||||
for ( ; i < uids->len; i++) {
|
|
||||||
if (g_hash_table_lookup (ml->uid_nodemap, uids->pdata[i])) {
|
|
||||||
- uid = e_mempool_strdup (ml->hidden_pool, uids->pdata[i]);
|
|
||||||
+ uid = g_string_chunk_insert (ml->hidden_string_chunk, uids->pdata[i]);
|
|
||||||
g_hash_table_insert (ml->hidden, uid, uid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -3602,9 +3576,9 @@ message_list_hide_clear (MessageList *ml
|
|
||||||
MESSAGE_LIST_LOCK (ml, hide_lock);
|
|
||||||
if (ml->hidden) {
|
|
||||||
g_hash_table_destroy (ml->hidden);
|
|
||||||
- e_mempool_destroy (ml->hidden_pool);
|
|
||||||
+ g_string_chunk_free (ml->hidden_string_chunk);
|
|
||||||
ml->hidden = NULL;
|
|
||||||
- ml->hidden_pool = NULL;
|
|
||||||
+ ml->hidden_string_chunk = NULL;
|
|
||||||
}
|
|
||||||
ml->hide_before = ML_HIDE_NONE_START;
|
|
||||||
ml->hide_after = ML_HIDE_NONE_END;
|
|
||||||
@@ -3640,9 +3614,9 @@ load_hide_state (MessageList *ml)
|
|
||||||
MESSAGE_LIST_LOCK(ml, hide_lock);
|
|
||||||
if (ml->hidden) {
|
|
||||||
g_hash_table_destroy (ml->hidden);
|
|
||||||
- e_mempool_destroy (ml->hidden_pool);
|
|
||||||
+ g_string_chunk_free (ml->hidden_string_chunk);
|
|
||||||
ml->hidden = NULL;
|
|
||||||
- ml->hidden_pool = NULL;
|
|
||||||
+ ml->hidden_string_chunk = NULL;
|
|
||||||
}
|
|
||||||
ml->hide_before = ML_HIDE_NONE_START;
|
|
||||||
ml->hide_after = ML_HIDE_NONE_END;
|
|
||||||
@@ -3653,7 +3627,7 @@ load_hide_state (MessageList *ml)
|
|
||||||
camel_file_util_decode_fixed_int32 (in, &version);
|
|
||||||
if (version == HIDE_STATE_VERSION) {
|
|
||||||
ml->hidden = g_hash_table_new(g_str_hash, g_str_equal);
|
|
||||||
- ml->hidden_pool = e_mempool_new(512, 256, E_MEMPOOL_ALIGN_BYTE);
|
|
||||||
+ ml->hidden_string_chunk = g_string_chunk_new(512);
|
|
||||||
camel_file_util_decode_fixed_int32 (in, &lower);
|
|
||||||
ml->hide_before = lower;
|
|
||||||
camel_file_util_decode_fixed_int32 (in, &upper);
|
|
||||||
@@ -3662,7 +3636,7 @@ load_hide_state (MessageList *ml)
|
|
||||||
char *olduid, *uid;
|
|
||||||
|
|
||||||
if (camel_file_util_decode_string (in, &olduid) != -1) {
|
|
||||||
- uid = e_mempool_strdup(ml->hidden_pool, olduid);
|
|
||||||
+ uid = g_string_chunk_insert(ml->hidden_string_chunk, olduid);
|
|
||||||
g_free (olduid);
|
|
||||||
g_hash_table_insert(ml->hidden, uid, uid);
|
|
||||||
}
|
|
||||||
@@ -3811,12 +3785,12 @@ regen_list_exec (struct _regen_list_msg
|
|
||||||
|
|
||||||
if (m->ml->hidden == NULL) {
|
|
||||||
m->ml->hidden = g_hash_table_new (g_str_hash, g_str_equal);
|
|
||||||
- m->ml->hidden_pool = e_mempool_new (512, 256, E_MEMPOOL_ALIGN_BYTE);
|
|
||||||
+ m->ml->hidden_string_chunk = g_string_chunk_new (512);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < uidnew->len; i++) {
|
|
||||||
if (g_hash_table_lookup (m->ml->hidden, uidnew->pdata[i]) == NULL) {
|
|
||||||
- char *uid = e_mempool_strdup (m->ml->hidden_pool, uidnew->pdata[i]);
|
|
||||||
+ char *uid = g_string_chunk_insert (m->ml->hidden_string_chunk, uidnew->pdata[i]);
|
|
||||||
g_hash_table_insert (m->ml->hidden, uid, uid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
diff -up evolution-2.21.2/mail/message-list.h.kill-ememory evolution-2.21.2/mail/message-list.h
|
|
||||||
--- evolution-2.21.2/mail/message-list.h.kill-ememory 2007-10-23 06:06:27.000000000 -0400
|
|
||||||
+++ evolution-2.21.2/mail/message-list.h 2007-12-01 10:22:46.000000000 -0500
|
|
||||||
@@ -102,11 +102,12 @@ struct _MessageList {
|
|
||||||
GHashTable *uid_nodemap; /* uid (from info) -> tree node mapping */
|
|
||||||
|
|
||||||
GHashTable *normalised_hash;
|
|
||||||
+ GStringChunk *string_chunk;
|
|
||||||
|
|
||||||
/* UID's to hide. Keys in the mempool */
|
|
||||||
/* IMPORTANT: You MUST have obtained the hide lock, to operate on this data */
|
|
||||||
GHashTable *hidden;
|
|
||||||
- struct _EMemPool *hidden_pool;
|
|
||||||
+ GStringChunk *hidden_string_chunk;
|
|
||||||
int hide_unhidden; /* total length, before hiding */
|
|
||||||
int hide_before, hide_after; /* hide ranges of messages */
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
|||||||
%define dbus_glib_version 0.70
|
%define dbus_glib_version 0.70
|
||||||
%define dbus_version 1.0
|
%define dbus_version 1.0
|
||||||
%define eds_version 2.21.4
|
%define eds_version 2.21.90
|
||||||
|
%define glib2_version 2.15.3
|
||||||
%define gnome_doc_utils_version 0.8.0
|
%define gnome_doc_utils_version 0.8.0
|
||||||
%define gnome_icon_theme_version 2.19.91
|
%define gnome_icon_theme_version 2.19.91
|
||||||
%define gnome_pilot_version 2.0.15
|
%define gnome_pilot_version 2.0.15
|
||||||
@ -9,7 +10,7 @@
|
|||||||
%define gtkhtml_version 3.17.3
|
%define gtkhtml_version 3.17.3
|
||||||
%define intltool_version 0.35.5
|
%define intltool_version 0.35.5
|
||||||
%define last_libgal2_version 2:2.5.3-2
|
%define last_libgal2_version 2:2.5.3-2
|
||||||
%define libbonobo_version 2.16.0
|
%define libbonobo_version 2.20.3
|
||||||
%define libbonoboui_version 2.4.2
|
%define libbonoboui_version 2.4.2
|
||||||
%define orbit2_version 2.9.8
|
%define orbit2_version 2.9.8
|
||||||
%define pilot_link_version 2:0.12.1
|
%define pilot_link_version 2:0.12.1
|
||||||
@ -44,8 +45,8 @@
|
|||||||
### Abstract ###
|
### Abstract ###
|
||||||
|
|
||||||
Name: evolution
|
Name: evolution
|
||||||
Version: 2.21.5
|
Version: 2.21.90
|
||||||
Release: 2%{?dist}
|
Release: 1%{?dist}
|
||||||
License: GPLv2 and GFDL+
|
License: GPLv2 and GFDL+
|
||||||
Group: Applications/Productivity
|
Group: Applications/Productivity
|
||||||
Summary: GNOME's next-generation groupware suite
|
Summary: GNOME's next-generation groupware suite
|
||||||
@ -79,18 +80,12 @@ Patch14: evolution-2.7.1-no-gnome-common.patch
|
|||||||
|
|
||||||
#Patch15: evolution-2.7.1-notification-cleanups.patch
|
#Patch15: evolution-2.7.1-notification-cleanups.patch
|
||||||
|
|
||||||
# GNOME bug #363695
|
|
||||||
Patch16: evolution-2.9.1-kill-ememory.patch
|
|
||||||
|
|
||||||
# RH bug #176400
|
# RH bug #176400
|
||||||
Patch17: evolution-2.9.1-im-context-reset.patch
|
Patch17: evolution-2.9.1-im-context-reset.patch
|
||||||
|
|
||||||
# RH bug #215478 / GNOME bug #383842
|
# RH bug #215478 / GNOME bug #383842
|
||||||
Patch18: evolution-2.9.3-source-path-entry.patch
|
Patch18: evolution-2.9.3-source-path-entry.patch
|
||||||
|
|
||||||
# GNOME bug #509741
|
|
||||||
Patch19: evolution-2.21.5-crash-on-startup.patch
|
|
||||||
|
|
||||||
## Dependencies ###
|
## Dependencies ###
|
||||||
|
|
||||||
Requires(post): GConf2
|
Requires(post): GConf2
|
||||||
@ -116,6 +111,7 @@ BuildRequires: desktop-file-utils
|
|||||||
BuildRequires: evolution-data-server-devel >= %{eds_version}
|
BuildRequires: evolution-data-server-devel >= %{eds_version}
|
||||||
BuildRequires: flex
|
BuildRequires: flex
|
||||||
BuildRequires: gettext
|
BuildRequires: gettext
|
||||||
|
BuildRequires: glib2-devel >= %{glib2_version}
|
||||||
BuildRequires: gnome-doc-utils >= %{gnome_doc_utils_version}
|
BuildRequires: gnome-doc-utils >= %{gnome_doc_utils_version}
|
||||||
BuildRequires: gnome-vfs2-devel >= %{gnomevfs2_version}
|
BuildRequires: gnome-vfs2-devel >= %{gnomevfs2_version}
|
||||||
BuildRequires: gnutls-devel
|
BuildRequires: gnutls-devel
|
||||||
@ -232,10 +228,8 @@ This package contains the plugin to filter junk mail using SpamAssassin.
|
|||||||
%patch13 -p1 -b .fix-conduit-dir
|
%patch13 -p1 -b .fix-conduit-dir
|
||||||
%patch14 -p1 -b .no-gnome-common
|
%patch14 -p1 -b .no-gnome-common
|
||||||
#patch15 -p1 -b .notification-cleanups
|
#patch15 -p1 -b .notification-cleanups
|
||||||
%patch16 -p1 -b .kill-ememory
|
|
||||||
%patch17 -p1 -b .im-context-reset
|
%patch17 -p1 -b .im-context-reset
|
||||||
%patch18 -p1 -b .source-path-entry
|
%patch18 -p1 -b .source-path-entry
|
||||||
%patch19 -p1 -b .crash-on-startup
|
|
||||||
|
|
||||||
mkdir -p krb5-fakeprefix/include
|
mkdir -p krb5-fakeprefix/include
|
||||||
mkdir -p krb5-fakeprefix/lib
|
mkdir -p krb5-fakeprefix/lib
|
||||||
@ -670,6 +664,12 @@ rm -rf $RPM_BUILD_ROOT
|
|||||||
%{evo_plugin_dir}/liborg-gnome-sa-junk-plugin.so
|
%{evo_plugin_dir}/liborg-gnome-sa-junk-plugin.so
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Jan 28 2008 Matthew Barnes <mbarnes@redhat.com> - 2.21.90-1.fc9
|
||||||
|
- Update to 2.21.90
|
||||||
|
- Update build requirements.
|
||||||
|
- Remove patch for GNOME #363695 (obsolete/problematic).
|
||||||
|
- Remove patch for GNOME #509741 (fixed upstream).
|
||||||
|
|
||||||
* Tue Jan 15 2008 Matthew Barnes <mbarnes@redhat.com> - 2.21.5-2.fc9
|
* Tue Jan 15 2008 Matthew Barnes <mbarnes@redhat.com> - 2.21.5-2.fc9
|
||||||
- Add patch for GNOME bug #509741 (crash on startup).
|
- Add patch for GNOME bug #509741 (crash on startup).
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user