Index: mod/forum/lib.php
===================================================================
RCS file: /cvsroot/moodle/moodle/mod/forum/lib.php,v
retrieving revision 1.536.2.43
diff -u -F function -r1.536.2.43 lib.php
--- mod/forum/lib.php	7 Jul 2008 15:38:21 -0000	1.536.2.43
+++ mod/forum/lib.php	23 Sep 2008 02:00:29 -0000
@@ -3199,30 +3199,50 @@ function forum_unsubscribe($userid, $for
  * Given a new post, subscribes or unsubscribes as appropriate.
  * Returns some text which describes what happened.
  */
-function forum_post_subscription($post) {
+function forum_post_subscription($post, $forum) {
 
     global $USER;
 
-    $subscribed=forum_is_subscribed($USER->id, $post->forum);
-    if ((isset($post->subscribe) && $post->subscribe && $subscribed)
-        || (!$post->subscribe && !$subscribed)) {
+    $action = '';
+    $subscribed = forum_is_subscribed($USER->id, $forum);
+    
+    if ($forum->forcesubscribe == FORUM_FORCESUBSCRIBE) { // database ignored
         return "";
-    }
+    } elseif (($forum->forcesubscribe == FORUM_DISALLOWSUBSCRIBE)
+        && !has_capability('moodle/course:manageactivities', $coursecontext, $USER->id)) {
+        if ($subscribed) {
+            $action = 'unsubscribe'; // sanity check, following MDL-14558
+        } else {
+            return "";
+        }
 
-    if (!$forum = get_record("forum", "id", $post->forum)) {
-        return "";
+    } else { // go with the user's choice
+        if (isset($post->subscribe)) {
+            // no change
+            if ((!empty($post->subscribe) && $subscribed)
+                || (empty($post->subscribe) && !$subscribed)) {
+                return "";
+
+            } elseif (!empty($post->subscribe) && !$subscribed) {
+                $action = 'subscribe';
+
+            } elseif (empty($post->subscribe) && $subscribed) {
+                $action = 'unsubscribe';
+            }
+        }
     }
 
     $info->name  = fullname($USER);
     $info->forum = $forum->name;
 
-    if (!empty($post->subscribe)) {
-        forum_subscribe($USER->id, $post->forum);
-        return "<p>".get_string("nowsubscribed", "forum", $info)."</p>";
+    switch ($action) {
+        case 'subscribe':
+            forum_subscribe($USER->id, $post->forum);
+            return "<p>".get_string("nowsubscribed", "forum", $info)."</p>";
+        case 'unsubscribe':
+            forum_unsubscribe($USER->id, $post->forum);
+            return "<p>".get_string("nownotsubscribed", "forum", $info)."</p>";
     }
-
-    forum_unsubscribe($USER->id, $post->forum);
-    return "<p>".get_string("nownotsubscribed", "forum", $info)."</p>";
 }
 
 
Index: mod/forum/post.php
===================================================================
RCS file: /cvsroot/moodle/moodle/mod/forum/post.php,v
retrieving revision 1.134.2.14
diff -u -F function -r1.134.2.14 post.php
--- mod/forum/post.php	28 Jan 2008 03:22:41 -0000	1.134.2.14
+++ mod/forum/post.php	23 Sep 2008 02:00:29 -0000
@@ -514,7 +514,7 @@
             }
             $message .= '<br />'.get_string("postupdated", "forum");
 
-            if ($subscribemessage = forum_post_subscription($fromform)) {
+            if ($subscribemessage = forum_post_subscription($fromform, $forum)) {
                 $timemessage = 4;
             }
             if ($forum->type == 'single') {
@@ -544,7 +544,7 @@
                     $timemessage = 4;
                 }
                 
-                if ($subscribemessage = forum_post_subscription($fromform)) {
+                if ($subscribemessage = forum_post_subscription($fromform, $forum)) {
                     $timemessage = 4;
                 }
 
@@ -604,7 +604,7 @@
                     $message .= '<br />'.get_string("postadded", "forum", format_time($CFG->maxeditingtime));
                 }    
 
-                if ($subscribemessage = forum_post_subscription($discussion)) {
+                if ($subscribemessage = forum_post_subscription($discussion, $forum)) {
                     $timemessage = 4;
                 }
