Index: /trunk/src/VBox/ValidationKit/testmanager/webui/wuiadmin.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/webui/wuiadmin.py	(revision 65916)
+++ /trunk/src/VBox/ValidationKit/testmanager/webui/wuiadmin.py	(revision 65917)
@@ -319,12 +319,12 @@
                 'Builds',       self._sActionUrlBase + self.ksActionBuildList,
                 [
-                    [ 'Builds',                 self._sActionUrlBase + self.ksActionBuildList ],
-                    [ 'Blacklist',              self._sActionUrlBase + self.ksActionBuildBlacklist ],
-                    [ 'Build sources',          self._sActionUrlBase + self.ksActionBuildSrcList ],
-                    [ 'Build categories',       self._sActionUrlBase + self.ksActionBuildCategoryList ],
-                    [ 'New build',              self._sActionUrlBase + self.ksActionBuildAdd ],
-                    [ 'New blacklisting',       self._sActionUrlBase + self.ksActionBuildBlacklistAdd ],
-                    [ 'New build source',       self._sActionUrlBase + self.ksActionBuildSrcAdd],
-                    [ 'New build category',     self._sActionUrlBase + self.ksActionBuildCategoryAdd ],
+                    [ 'Builds',                 self._sActionUrlBase + self.ksActionBuildList,              False ],
+                    [ 'Blacklist',              self._sActionUrlBase + self.ksActionBuildBlacklist,         False ],
+                    [ 'Build sources',          self._sActionUrlBase + self.ksActionBuildSrcList,           False ],
+                    [ 'Build categories',       self._sActionUrlBase + self.ksActionBuildCategoryList,      False ],
+                    [ 'New build',              self._sActionUrlBase + self.ksActionBuildAdd,               True ],
+                    [ 'New blacklisting',       self._sActionUrlBase + self.ksActionBuildBlacklistAdd,      True  ],
+                    [ 'New build source',       self._sActionUrlBase + self.ksActionBuildSrcAdd,            True ],
+                    [ 'New build category',     self._sActionUrlBase + self.ksActionBuildCategoryAdd,       True  ],
                 ]
             ],
@@ -332,8 +332,8 @@
                 'Failure Reasons',       self._sActionUrlBase + self.ksActionFailureReasonList,
                 [
-                    [ 'Failure categories',     self._sActionUrlBase + self.ksActionFailureCategoryList ],
-                    [ 'Failure reasons',        self._sActionUrlBase + self.ksActionFailureReasonList ],
-                    [ 'New failure category',   self._sActionUrlBase + self.ksActionFailureCategoryAdd ],
-                    [ 'New failure reason',     self._sActionUrlBase + self.ksActionFailureReasonAdd ],
+                    [ 'Failure categories',     self._sActionUrlBase + self.ksActionFailureCategoryList,    False ],
+                    [ 'Failure reasons',        self._sActionUrlBase + self.ksActionFailureReasonList,      False ],
+                    [ 'New failure category',   self._sActionUrlBase + self.ksActionFailureCategoryAdd,     True  ],
+                    [ 'New failure reason',     self._sActionUrlBase + self.ksActionFailureReasonAdd,       True  ],
                 ]
             ],
@@ -341,8 +341,8 @@
                 'System',      self._sActionUrlBase + self.ksActionSystemChangelogList,
                 [
-                    [ 'Changelog',              self._sActionUrlBase + self.ksActionSystemChangelogList ],
-                    [ 'System log',             self._sActionUrlBase + self.ksActionSystemLogList ],
-                    [ 'User accounts',          self._sActionUrlBase + self.ksActionUserList ],
-                    [ 'New user',               self._sActionUrlBase + self.ksActionUserAdd ],
+                    [ 'Changelog',              self._sActionUrlBase + self.ksActionSystemChangelogList,    False ],
+                    [ 'System log',             self._sActionUrlBase + self.ksActionSystemLogList,          False ],
+                    [ 'User accounts',          self._sActionUrlBase + self.ksActionUserList,               False ],
+                    [ 'New user',               self._sActionUrlBase + self.ksActionUserAdd,                True  ],
                 ]
             ],
@@ -350,9 +350,9 @@
                 'Testboxes',   self._sActionUrlBase + self.ksActionTestBoxList,
                 [
-                    [ 'Testboxes',              self._sActionUrlBase + self.ksActionTestBoxList ],
-                    [ 'Scheduling groups',      self._sActionUrlBase + self.ksActionSchedGroupList ],
-                    [ 'New testbox',            self._sActionUrlBase + self.ksActionTestBoxAdd ],
-                    [ 'New scheduling group',   self._sActionUrlBase + self.ksActionSchedGroupAdd ],
-                    [ 'Regenerate all scheduling queues', self._sActionUrlBase + self.ksActionTestBoxesRegenQueues ],
+                    [ 'Testboxes',              self._sActionUrlBase + self.ksActionTestBoxList,            False ],
+                    [ 'Scheduling groups',      self._sActionUrlBase + self.ksActionSchedGroupList,         False ],
+                    [ 'New testbox',            self._sActionUrlBase + self.ksActionTestBoxAdd,             True  ],
+                    [ 'New scheduling group',   self._sActionUrlBase + self.ksActionSchedGroupAdd,          True  ],
+                    [ 'Regenerate all scheduling queues', self._sActionUrlBase + self.ksActionTestBoxesRegenQueues, True  ],
                 ]
             ],
@@ -360,11 +360,11 @@
                 'Test Config', self._sActionUrlBase + self.ksActionTestGroupList,
                 [
-                    [ 'Test cases',             self._sActionUrlBase + self.ksActionTestCaseList ],
-                    [ 'Test groups',            self._sActionUrlBase + self.ksActionTestGroupList ],
-                    [ 'Global resources',       self._sActionUrlBase + self.ksActionGlobalRsrcShowAll ],
-                    [ 'New test case',          self._sActionUrlBase + self.ksActionTestCaseAdd ],
-                    [ 'New test group',         self._sActionUrlBase + self.ksActionTestGroupAdd ],
-                    [ 'New global resource',    self._sActionUrlBase + self.ksActionGlobalRsrcShowAdd ],
-                    [ 'Regenerate all scheduling queues', self._sActionUrlBase + self.ksActionTestCfgRegenQueues ],
+                    [ 'Test cases',             self._sActionUrlBase + self.ksActionTestCaseList,           False ],
+                    [ 'Test groups',            self._sActionUrlBase + self.ksActionTestGroupList,          False ],
+                    [ 'Global resources',       self._sActionUrlBase + self.ksActionGlobalRsrcShowAll,      False  ],
+                    [ 'New test case',          self._sActionUrlBase + self.ksActionTestCaseAdd,            True  ],
+                    [ 'New test group',         self._sActionUrlBase + self.ksActionTestGroupAdd,           True  ],
+                    [ 'New global resource',    self._sActionUrlBase + self.ksActionGlobalRsrcShowAdd,      True  ],
+                    [ 'Regenerate all scheduling queues', self._sActionUrlBase + self.ksActionTestCfgRegenQueues, True  ],
                 ]
             ],
Index: /trunk/src/VBox/ValidationKit/testmanager/webui/wuibase.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/webui/wuibase.py	(revision 65916)
+++ /trunk/src/VBox/ValidationKit/testmanager/webui/wuibase.py	(revision 65917)
@@ -170,4 +170,6 @@
         Generates the two menus, returning them as (sTopMenuItems, sSideMenuItems).
         """
+        fReadOnly = self.isReadOnlyUser();
+
         #
         # We use the action to locate the side menu.
@@ -207,10 +209,11 @@
             for asSubItem in aasSideMenu:
                 if asSubItem[1] is not None:
-                    if self._isSideMenuMatch(asSubItem[1], sActionParam):
-                        sSideMenuItems += '<li class="current_page_item">';
-                    else:
-                        sSideMenuItems += '<li>';
-                    sSideMenuItems += '<a href="' + webutils.escapeAttr(asSubItem[1]) + '">' \
-                                    + webutils.escapeElem(asSubItem[0]) + '</a></li>\n';
+                    if not asSubItem[2] or not fReadOnly:
+                        if self._isSideMenuMatch(asSubItem[1], sActionParam):
+                            sSideMenuItems += '<li class="current_page_item">';
+                        else:
+                            sSideMenuItems += '<li>';
+                        sSideMenuItems += '<a href="' + webutils.escapeAttr(asSubItem[1]) + '">' \
+                                        + webutils.escapeElem(asSubItem[0]) + '</a></li>\n';
                 else:
                     sSideMenuItems += '<li class="subheader_item">' + webutils.escapeElem(asSubItem[0]) + '</li>';
Index: /trunk/src/VBox/ValidationKit/testmanager/webui/wuimain.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/webui/wuimain.py	(revision 65916)
+++ /trunk/src/VBox/ValidationKit/testmanager/webui/wuimain.py	(revision 65917)
@@ -264,13 +264,13 @@
                 [
                     [ 'Grouped by',        None ],
-                    [ 'Ungrouped',          sActUrlBase + self.ksActionResultsUnGrouped           + sSheriff ],
-                    [ 'Sched group',        sActUrlBase + self.ksActionResultsGroupedBySchedGroup + sSheriff ],
-                    [ 'Test group',         sActUrlBase + self.ksActionResultsGroupedByTestGroup  + sSheriff ],
-                    [ 'Test case',          sActUrlBase + self.ksActionResultsGroupedByTestCase   + sSheriff ],
-                    [ 'Testbox',            sActUrlBase + self.ksActionResultsGroupedByTestBox    + sSheriff ],
-                    [ 'OS',                 sActUrlBase + self.ksActionResultsGroupedByOS         + sSheriff ],
-                    [ 'Architecture',       sActUrlBase + self.ksActionResultsGroupedByArch       + sSheriff ],
-                    [ 'Revision',           sActUrlBase + self.ksActionResultsGroupedByBuildRev   + sSheriff ],
-                    [ 'Build category',     sActUrlBase + self.ksActionResultsGroupedByBuildCat   + sSheriff ],
+                    [ 'Ungrouped',          sActUrlBase + self.ksActionResultsUnGrouped           + sSheriff, False ],
+                    [ 'Sched group',        sActUrlBase + self.ksActionResultsGroupedBySchedGroup + sSheriff, False ],
+                    [ 'Test group',         sActUrlBase + self.ksActionResultsGroupedByTestGroup  + sSheriff, False ],
+                    [ 'Test case',          sActUrlBase + self.ksActionResultsGroupedByTestCase   + sSheriff, False ],
+                    [ 'Testbox',            sActUrlBase + self.ksActionResultsGroupedByTestBox    + sSheriff, False ],
+                    [ 'OS',                 sActUrlBase + self.ksActionResultsGroupedByOS         + sSheriff, False ],
+                    [ 'Architecture',       sActUrlBase + self.ksActionResultsGroupedByArch       + sSheriff, False ],
+                    [ 'Revision',           sActUrlBase + self.ksActionResultsGroupedByBuildRev   + sSheriff, False ],
+                    [ 'Build category',     sActUrlBase + self.ksActionResultsGroupedByBuildCat   + sSheriff, False ],
                 ]
             ],
@@ -278,9 +278,9 @@
                 'Reports',          sActUrlBase + self.ksActionReportSummary,
                 [
-                    [ 'Summary',                  sActUrlBase + self.ksActionReportSummary                 + sExtraReports ],
-                    [ 'Success rate',             sActUrlBase + self.ksActionReportRate                    + sExtraReports ],
-                    [ 'Test case failures',       sActUrlBase + self.ksActionReportTestCaseFailures        + sExtraReports ],
-                    [ 'Testbox failures',         sActUrlBase + self.ksActionReportTestBoxFailures         + sExtraReports ],
-                    [ 'Failure reasons',          sActUrlBase + self.ksActionReportFailureReasons          + sExtraReports ],
+                    [ 'Summary',                  sActUrlBase + self.ksActionReportSummary          + sExtraReports, False ],
+                    [ 'Success rate',             sActUrlBase + self.ksActionReportRate             + sExtraReports, False ],
+                    [ 'Test case failures',       sActUrlBase + self.ksActionReportTestCaseFailures + sExtraReports, False ],
+                    [ 'Testbox failures',         sActUrlBase + self.ksActionReportTestBoxFailures  + sExtraReports, False ],
+                    [ 'Failure reasons',          sActUrlBase + self.ksActionReportFailureReasons   + sExtraReports, False ],
                 ]
             ],
@@ -289,13 +289,13 @@
                 [
                     [ 'Grouped by',        None ],
-                    [ 'Ungrouped',          sActUrlBase + self.ksActionResultsUnGrouped           + sExtraTimeNav ],
-                    [ 'Sched group',        sActUrlBase + self.ksActionResultsGroupedBySchedGroup + sExtraTimeNav ],
-                    [ 'Test group',         sActUrlBase + self.ksActionResultsGroupedByTestGroup  + sExtraTimeNav ],
-                    [ 'Test case',          sActUrlBase + self.ksActionResultsGroupedByTestCase   + sExtraTimeNav ],
-                    [ 'Testbox',            sActUrlBase + self.ksActionResultsGroupedByTestBox    + sExtraTimeNav ],
-                    [ 'OS',                 sActUrlBase + self.ksActionResultsGroupedByOS         + sExtraTimeNav ],
-                    [ 'Architecture',       sActUrlBase + self.ksActionResultsGroupedByArch       + sExtraTimeNav ],
-                    [ 'Revision',           sActUrlBase + self.ksActionResultsGroupedByBuildRev   + sExtraTimeNav ],
-                    [ 'Build category',     sActUrlBase + self.ksActionResultsGroupedByBuildCat   + sExtraTimeNav ],
+                    [ 'Ungrouped',          sActUrlBase + self.ksActionResultsUnGrouped           + sExtraTimeNav, False ],
+                    [ 'Sched group',        sActUrlBase + self.ksActionResultsGroupedBySchedGroup + sExtraTimeNav, False ],
+                    [ 'Test group',         sActUrlBase + self.ksActionResultsGroupedByTestGroup  + sExtraTimeNav, False ],
+                    [ 'Test case',          sActUrlBase + self.ksActionResultsGroupedByTestCase   + sExtraTimeNav, False ],
+                    [ 'Testbox',            sActUrlBase + self.ksActionResultsGroupedByTestBox    + sExtraTimeNav, False ],
+                    [ 'OS',                 sActUrlBase + self.ksActionResultsGroupedByOS         + sExtraTimeNav, False ],
+                    [ 'Architecture',       sActUrlBase + self.ksActionResultsGroupedByArch       + sExtraTimeNav, False ],
+                    [ 'Revision',           sActUrlBase + self.ksActionResultsGroupedByBuildRev   + sExtraTimeNav, False ],
+                    [ 'Build category',     sActUrlBase + self.ksActionResultsGroupedByBuildCat   + sExtraTimeNav, False ],
                 ]
             ],
@@ -304,13 +304,13 @@
                 [
                     [ 'Grouped by',        None ],
-                    [ 'Ungrouped',          sActUrlBase + self.ksActionResultsUnGrouped           + sOnlyFailures ],
-                    [ 'Sched group',        sActUrlBase + self.ksActionResultsGroupedBySchedGroup + sOnlyFailures ],
-                    [ 'Test group',         sActUrlBase + self.ksActionResultsGroupedByTestGroup  + sOnlyFailures ],
-                    [ 'Test case',          sActUrlBase + self.ksActionResultsGroupedByTestCase   + sOnlyFailures ],
-                    [ 'Testbox',            sActUrlBase + self.ksActionResultsGroupedByTestBox    + sOnlyFailures ],
-                    [ 'OS',                 sActUrlBase + self.ksActionResultsGroupedByOS         + sOnlyFailures ],
-                    [ 'Architecture',       sActUrlBase + self.ksActionResultsGroupedByArch       + sOnlyFailures ],
-                    [ 'Revision',           sActUrlBase + self.ksActionResultsGroupedByBuildRev   + sOnlyFailures ],
-                    [ 'Build category',     sActUrlBase + self.ksActionResultsGroupedByBuildCat   + sOnlyFailures ],
+                    [ 'Ungrouped',          sActUrlBase + self.ksActionResultsUnGrouped           + sOnlyFailures, False ],
+                    [ 'Sched group',        sActUrlBase + self.ksActionResultsGroupedBySchedGroup + sOnlyFailures, False ],
+                    [ 'Test group',         sActUrlBase + self.ksActionResultsGroupedByTestGroup  + sOnlyFailures, False ],
+                    [ 'Test case',          sActUrlBase + self.ksActionResultsGroupedByTestCase   + sOnlyFailures, False ],
+                    [ 'Testbox',            sActUrlBase + self.ksActionResultsGroupedByTestBox    + sOnlyFailures, False ],
+                    [ 'OS',                 sActUrlBase + self.ksActionResultsGroupedByOS         + sOnlyFailures, False ],
+                    [ 'Architecture',       sActUrlBase + self.ksActionResultsGroupedByArch       + sOnlyFailures, False ],
+                    [ 'Revision',           sActUrlBase + self.ksActionResultsGroupedByBuildRev   + sOnlyFailures, False ],
+                    [ 'Build category',     sActUrlBase + self.ksActionResultsGroupedByBuildCat   + sOnlyFailures, False ],
                 ]
             ],
