$OpenBSD: patch-add_file_c,v 1.2 2009/02/14 09:41:35 jasper Exp $
--- add_file.c.orig	Sat Sep 29 07:21:51 2001
+++ add_file.c	Sat Feb 14 10:40:49 2009
@@ -233,6 +233,7 @@ sNewDatum (char *filename, char *hash)
 	FREE (info);
 	return 0;
     }
+    strlower (info->hash);
 #endif
     return info;
 }
@@ -248,8 +249,8 @@ sBitrateToMask (int bitrate, USER * user)
 	if (bitrate <= BitRate[i])
 	    return i;
     }
-    log_message ("sBitrateToMask(): invalid bit rate %d (%s, \"%s\")", bitrate,
-		 user->nick, user->clientinfo);
+    log_message ("sBitrateToMask(): invalid bit rate %d (%s, \"%s\")",
+		 bitrate, user->nick, user->clientinfo);
     return 0;			/* invalid bitrate */
 }
 
@@ -287,6 +288,8 @@ HANDLER (add_file)
 
     if (!option (ON_ALLOW_SHARE))
 	return;
+    if(con->user->level==LEVEL_LEECH)
+	return;
 
     if (Max_Shared && con->user->shared >= Max_Shared)
     {
@@ -376,6 +379,8 @@ HANDLER (share_file)
 
     if (!option (ON_ALLOW_SHARE))
 	return;
+    if(con->user->level==LEVEL_LEECH)
+	return;
     if (Max_Shared && con->user->shared >= Max_Shared)
     {
 	log_message ("add_file(): %s is already sharing %d files",
@@ -466,6 +471,8 @@ HANDLER (add_directory)
     CHECK_USER_CLASS ("add_directory");
     if (!option (ON_ALLOW_SHARE))
 	return;
+    if(con->user->level==LEVEL_LEECH)
+	return;
     dir = next_arg (&pkt);	/* directory */
     if (!dir)
     {
@@ -653,8 +660,40 @@ HANDLER (user_sharing)
 		       user->libsize);
 }
 
+void
+unshare_all_internal (USER * user)
+{
+    if (user->shared)
+    {
+#ifndef ROUTING_ONLY
+	if (ISUSER (user->con))
+	{
+	    /* local user */
+	    free_hash (user->con->uopt->files);
+	    user->con->uopt->files = 0;
+	    ASSERT (Local_Files >= user->shared);
+	    Local_Files -= user->shared;
+	}
+#endif /* !ROUTING_ONLY */
+	if (user->libsize > Num_Gigs)
+	{
+	    log_message ("unshare_all: sender->libsize=%u Num_Gigs=%f",
+			 user->libsize, Num_Gigs);
+	    Num_Gigs = user->libsize;
+	}
+	ASSERT (Num_Gigs >= user->libsize);
+	Num_Gigs -= user->libsize;
+	ASSERT (Num_Files >= user->shared);
+	Num_Files -= user->shared;
+	user->libsize = 0;
+	user->shared = 0;
+    }
+}
+
 /* 110 [:sender]
- * unshare all files
+ * unshare all files.  this will handle the case of a remote server forcing
+ * a local client to unshare all files as well, so we can have the hub
+ * perform this action.
  */
 HANDLER (unshare_all)
 {
@@ -664,33 +703,18 @@ HANDLER (unshare_all)
     (void) len;
     if (pop_user_server (con, tag, &pkt, &sender_name, &sender))
 	return;
-    ASSERT (sender != 0);
-#ifndef ROUTING_ONLY
+    if (!sender)
+    {
+	log_message ("unshare_all: error: received unshare message from server %s",
+		     sender_name);
+	return;
+    }
     if (ISUSER (con))
     {
-	if (!con->uopt->files)
-	{
-	    ASSERT (sender->shared == 0);
-	    return;		/* nothing shared */
-	}
+	if (sender->shared == 0)
+	    return;		/* nothing to unshare */
 	send_cmd (con, tag, "%d", sender->shared);
-	free_hash (con->uopt->files);
-	con->uopt->files = 0;
-	ASSERT (Local_Files >= sender->shared);
-	Local_Files -= sender->shared;
     }
-#endif /* !ROUTING_ONLY */
-    if (sender->libsize > Num_Gigs)
-    {
-	log_message ("unshare_all: sender->libsize=%u Num_Gigs=%f",
-		     sender->libsize, Num_Gigs);
-	Num_Gigs = sender->libsize;
-    }
-    ASSERT (Num_Gigs >= sender->libsize);
-    Num_Gigs -= sender->libsize;
-    ASSERT (Num_Files >= sender->shared);
-    Num_Files -= sender->shared;
-    sender->libsize = 0;
-    sender->shared = 0;
+    unshare_all_internal (sender);
     pass_message_args (con, tag, ":%s", sender->nick);
 }
