Index: trunk/phase3/maintenance/archives/patch-user_restrictions.sql |
— | — | @@ -1,41 +0,0 @@ |
2 | | - |
3 | | -CREATE TABLE /*$wgDBprefix*/user_restrictions ( |
4 | | - -- ID of the restriction |
5 | | - ur_id int NOT NULL auto_increment, |
6 | | - |
7 | | - -- Restriction type. Block from either editing namespace or page |
8 | | - ur_type ENUM('namespace','page') NOT NULL, |
9 | | - -- Namespace to restrict if ur_type = namespace |
10 | | - ur_namespace int default NULL, |
11 | | - -- Page to restrict if ur_type = page |
12 | | - ur_page_namespace int default NULL, |
13 | | - ur_page_title varchar(255) binary default '', |
14 | | - |
15 | | - -- User that is restricted |
16 | | - ur_user int unsigned NOT NULL, |
17 | | - ur_user_text varchar(255) NOT NULL, |
18 | | - |
19 | | - -- User who has done this restriction |
20 | | - ur_by int unsigned NOT NULL, |
21 | | - ur_by_text varchar(255) binary NOT NULL default '', |
22 | | - -- Reason for this restriction |
23 | | - ur_reason mediumblob NOT NULL, |
24 | | - |
25 | | - -- Time when this restriction was made |
26 | | - ur_timestamp varbinary(14) NOT NULL default '', |
27 | | - -- Expiry or "infinity" |
28 | | - ur_expiry varbinary(14) NOT NULL default '', |
29 | | - |
30 | | - PRIMARY KEY ur_id (ur_id), |
31 | | - -- For looking up restrictions for user and title |
32 | | - INDEX ur_user_page(ur_user,ur_page_namespace,ur_page_title(255)), |
33 | | - INDEX ur_user_namespace(ur_user,ur_namespace), |
34 | | - -- For Special:ListUserRestrictions |
35 | | - INDEX ur_type (ur_type,ur_timestamp), |
36 | | - INDEX ur_namespace (ur_namespace,ur_timestamp), |
37 | | - INDEX ur_page (ur_page_namespace,ur_page_title,ur_timestamp), |
38 | | - INDEX ur_timestamp (ur_timestamp), |
39 | | - -- For quick removal of expired restrictions |
40 | | - INDEX ur_expiry (ur_expiry) |
41 | | -) /*$wgDBTableOptions*/; |
Index: trunk/phase3/maintenance/parserTests.inc |
— | — | @@ -593,7 +593,7 @@ |
594 | 594 | 'site_stats', 'hitcounter', 'ipblocks', 'image', 'oldimage', |
595 | 595 | 'recentchanges', 'watchlist', 'math', 'interwiki', |
596 | 596 | 'querycache', 'objectcache', 'job', 'redirect', 'querycachetwo', |
597 | | - 'archive', 'user_groups', 'page_props', 'category', 'user_restrictions', |
| 597 | + 'archive', 'user_groups', 'page_props', 'category' |
598 | 598 | ); |
599 | 599 | |
600 | 600 | if ($wgDBtype === 'mysql') |
Index: trunk/phase3/maintenance/updaters.inc |
— | — | @@ -145,10 +145,9 @@ |
146 | 146 | array( 'update_password_format' ), |
147 | 147 | |
148 | 148 | // 1.14 |
149 | | - array( 'add_field', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ), |
| 149 | + array( 'add_field', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ), |
150 | 150 | array( 'do_active_users_init' ), |
151 | | - array( 'add_field', 'ipblocks', 'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ), |
152 | | - array( 'add_table', 'user_restrictions', 'patch-user_restrictions.sql' ), |
| 151 | + array( 'add_field', 'ipblocks', 'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ) |
153 | 152 | ); |
154 | 153 | |
155 | 154 | |
Index: trunk/phase3/maintenance/language/messages.inc |
— | — | @@ -569,10 +569,6 @@ |
570 | 570 | 'edit-conflict', |
571 | 571 | 'edit-no-change', |
572 | 572 | 'edit-already-exists', |
573 | | - 'userrestricted-page', |
574 | | - 'userrestricted-namespace', |
575 | | - 'userrestricted-page-indef', |
576 | | - 'userrestricted-namespace-indef', |
577 | 573 | ), |
578 | 574 | 'parserwarnings' => array( |
579 | 575 | 'expensive-parserfunction-warning', |
— | — | @@ -1775,7 +1771,6 @@ |
1776 | 1772 | 'ipbsubmit', |
1777 | 1773 | 'ipbother', |
1778 | 1774 | 'ipboptions', |
1779 | | - 'ipbinfinite', |
1780 | 1775 | 'ipbotheroption', |
1781 | 1776 | 'ipbotherreason', |
1782 | 1777 | 'ipbhidename', |
— | — | @@ -1849,69 +1844,6 @@ |
1850 | 1845 | 'sorbs_create_account_reason', |
1851 | 1846 | 'cant-block-while-blocked', |
1852 | 1847 | ), |
1853 | | - 'listuserrestrictions' => array( |
1854 | | - 'listuserrestrictions', |
1855 | | - 'listuserrestrictions-intro', |
1856 | | - 'listuserrestrictions-row-ns', |
1857 | | - 'listuserrestrictions-row-page', |
1858 | | - 'listuserrestrictions-row-expiry', |
1859 | | - 'listuserrestrictions-legend', |
1860 | | - 'listuserrestrictions-type', |
1861 | | - 'listuserrestrictions-user', |
1862 | | - 'listuserrestrictions-namespace', |
1863 | | - 'listuserrestrictions-page', |
1864 | | - 'listuserrestrictions-submit', |
1865 | | - 'listuserrestrictions-notfound', |
1866 | | - 'listuserrestrictions-empty', |
1867 | | - 'listuserrestrictions-remove', |
1868 | | - 'userrestrictiontype-none', |
1869 | | - 'userrestrictiontype-namespace', |
1870 | | - 'userrestrictiontype-page', |
1871 | | - ), |
1872 | | - 'removerestrictions' => array( |
1873 | | - 'removerestrictions', |
1874 | | - 'removerestrictions-intro', |
1875 | | - 'removerestrictions-noid', |
1876 | | - 'removerestrictions-wrongid', |
1877 | | - 'removerestrictions-legend', |
1878 | | - 'removerestrictions-user', |
1879 | | - 'removerestrictions-type', |
1880 | | - 'removerestrictions-page', |
1881 | | - 'removerestrictions-namespace', |
1882 | | - 'removerestrictions-reason', |
1883 | | - 'removerestrictions-submit', |
1884 | | - 'removerestrictions-success', |
1885 | | - ), |
1886 | | - 'restrictuser' => array( |
1887 | | - 'restrictuser', |
1888 | | - 'restrictuser-userselect', |
1889 | | - 'restrictuser-user', |
1890 | | - 'restrictuser-go', |
1891 | | - 'restrictuser-notfound', |
1892 | | - 'restrictuser-existing', |
1893 | | - 'restrictuser-legend-page', |
1894 | | - 'restrictuser-legend-namespace', |
1895 | | - 'restrictuser-title', |
1896 | | - 'restrictuser-namespace', |
1897 | | - 'restrictuser-expiry', |
1898 | | - 'restrictuser-reason', |
1899 | | - 'restrictuser-submit', |
1900 | | - 'restrictuser-badtitle', |
1901 | | - 'restrictuser-badnamespace', |
1902 | | - 'restrictuser-badexpiry', |
1903 | | - 'restrictuser-duptitle', |
1904 | | - 'restrictuser-dupnamespace', |
1905 | | - 'restrictuser-success', |
1906 | | - 'restrictuser-description', |
1907 | | - ), |
1908 | | - 'restrictlog' => array( |
1909 | | - 'restrictionlog', |
1910 | | - 'restrictionlogtext', |
1911 | | - 'restrictentry', |
1912 | | - 'restrictremoveentry', |
1913 | | - 'restrictlognamespace', |
1914 | | - 'restrictlogpage', |
1915 | | - ), |
1916 | 1848 | 'developertools' => array( |
1917 | 1849 | 'lockdb', |
1918 | 1850 | 'unlockdb', |
— | — | @@ -3039,10 +2971,6 @@ |
3040 | 2972 | 'sp-contributions' => '', |
3041 | 2973 | 'whatlinkshere' => 'What links here', |
3042 | 2974 | 'block' => 'Block/unblock', |
3043 | | - 'listuserrestrictions' => 'Special:ListUserRestrictions', |
3044 | | - 'removerestrictions' => 'Special:RemoveRestrictions', |
3045 | | - 'restrictuser' => 'Restrict user', |
3046 | | - 'restrictlog' => 'Special:Log/restrict', |
3047 | 2975 | 'developertools' => 'Developer tools', |
3048 | 2976 | 'movepage' => 'Move page', |
3049 | 2977 | 'export' => 'Export', |
Index: trunk/phase3/maintenance/tables.sql |
— | — | @@ -1243,47 +1243,4 @@ |
1244 | 1244 | PRIMARY KEY (ul_key) |
1245 | 1245 | ) /*$wgDBTableOptions*/; |
1246 | 1246 | |
1247 | | -CREATE TABLE /*$wgDBprefix*/user_restrictions ( |
1248 | | - -- ID of the restriction |
1249 | | - ur_id int NOT NULL auto_increment, |
1250 | | - |
1251 | | - -- Restriction type. Block from either editing namespace or page |
1252 | | - ur_type ENUM('namespace','page') NOT NULL, |
1253 | | - -- Namespace to restrict if ur_type = namespace |
1254 | | - ur_namespace int default NULL, |
1255 | | - -- Page to restrict if ur_type = page |
1256 | | - ur_page_namespace int default NULL, |
1257 | | - ur_page_title varchar(255) binary default '', |
1258 | | - |
1259 | | - -- User that is restricted |
1260 | | - ur_user int unsigned NOT NULL, |
1261 | | - ur_user_text varchar(255) NOT NULL, |
1262 | | - |
1263 | | - -- User who has done this restriction |
1264 | | - ur_by int unsigned NOT NULL, |
1265 | | - ur_by_text varchar(255) binary NOT NULL default '', |
1266 | | - -- Reason for this restriction |
1267 | | - ur_reason mediumblob NOT NULL, |
1268 | | - |
1269 | | - -- Time when this restriction was made |
1270 | | - ur_timestamp varbinary(14) NOT NULL default '', |
1271 | | - -- Expiry or "infinity" |
1272 | | - ur_expiry varbinary(14) NOT NULL default '', |
1273 | | - |
1274 | | - PRIMARY KEY ur_id (ur_id), |
1275 | | - -- For looking up restrictions for user and title |
1276 | | - INDEX ur_user (ur_user), |
1277 | | - INDEX ur_user_page(ur_user,ur_page_namespace,ur_page_title(255)), |
1278 | | - INDEX ur_user_namespace(ur_user,ur_namespace), |
1279 | | - -- For Special:ListUserRestrictions |
1280 | | - INDEX ur_type (ur_type,ur_timestamp), |
1281 | | - INDEX ur_namespace (ur_namespace,ur_timestamp), |
1282 | | - INDEX ur_page (ur_page_namespace,ur_page_title,ur_timestamp), |
1283 | | - INDEX ur_timestamp (ur_timestamp), |
1284 | | - -- For quick removal of expired restrictions |
1285 | | - INDEX ur_expiry (ur_expiry) |
1286 | | -) /*$wgDBTableOptions*/; |
1287 | | - |
1288 | | - |
1289 | 1247 | -- vim: sw=2 sts=2 et |
Index: trunk/phase3/includes/UserRestriction.php |
— | — | @@ -1,189 +0,0 @@ |
2 | | -<?php |
3 | | - |
4 | | -/** |
5 | | - * Object that represents a user restriction |
6 | | - */ |
7 | | -class UserRestriction { |
8 | | - const PAGE = 'page'; |
9 | | - const NAMESPACE = 'namespace'; |
10 | | - |
11 | | - private $mId, $mType, $mNamespace, $mPage, $mSubjectText, $mSubjectId, |
12 | | - $mBlockerId, $mBlockerText, $mReason, $mTimestamp, $mExpiry; |
13 | | - |
14 | | - public static function newFromRow( $row ) { |
15 | | - if( !$row ) |
16 | | - return null; |
17 | | - |
18 | | - $obj = new UserRestriction(); |
19 | | - $obj->mId = $row->ur_id; |
20 | | - $obj->mType = $row->ur_type; |
21 | | - if( $obj->mType == self::PAGE ) { |
22 | | - $obj->mPage = Title::makeTitle( $row->ur_page_namespace, $row->ur_page_title ); |
23 | | - } elseif( $obj->mType == self::NAMESPACE ) { |
24 | | - $obj->mNamespace = $row->ur_namespace; |
25 | | - } else { |
26 | | - throw new MWException( "Unknown user restriction type: {$row->ur_type}" ); |
27 | | - } |
28 | | - |
29 | | - $obj->mSubjectId = $row->ur_user; |
30 | | - $obj->mSubjectText = $row->ur_user_text; |
31 | | - $obj->mBlockerId = $row->ur_by; |
32 | | - $obj->mBlockerText = $row->ur_by_text; |
33 | | - $obj->mReason = $row->ur_reason; |
34 | | - $obj->mTimestamp = wfTimestamp( TS_MW, $row->ur_timestamp ); |
35 | | - $obj->mExpiry = $row->ur_expiry; |
36 | | - return $obj; |
37 | | - } |
38 | | - |
39 | | - public static function fetchForUser( $user, $forWrite = false ) { |
40 | | - $dbr = wfGetDB( $forWrite ? DB_MASTER : DB_SLAVE ); |
41 | | - if( is_int( $user ) ) |
42 | | - $query = array( 'ur_user' => $user ); |
43 | | - else |
44 | | - $query = array( 'ur_user_text' => $user ); |
45 | | - $res = $dbr->select( 'user_restrictions', '*', $query, __METHOD__ ); |
46 | | - $result = array(); |
47 | | - foreach( $res as $row ) { |
48 | | - $result[] = self::newFromRow( $row ); |
49 | | - } |
50 | | - return $result; |
51 | | - } |
52 | | - |
53 | | - public static function fetchForTitle( $user, $title ) { |
54 | | - $dbr = wfGetDB( DB_SLAVE ); |
55 | | - if( $user->isLoggedIn() ) |
56 | | - $query = array( 'ur_user' => $user->getId() ); |
57 | | - else |
58 | | - $query = array( 'ur_user_text' => $user->getName() ); |
59 | | - $query['ur_page_namespace'] = $title->getNamespace(); |
60 | | - $query['ur_page_title'] = $title->getDBKey(); |
61 | | - $res = $dbr->select( 'user_restrictions', '*', $query, __METHOD__ ); |
62 | | - $result = array(); |
63 | | - foreach( $res as $row ) { |
64 | | - $result[] = self::newFromRow( $row ); |
65 | | - } |
66 | | - return $result; |
67 | | - } |
68 | | - |
69 | | - public static function fetchForNamespace( $user, $ns ) { |
70 | | - $dbr = wfGetDB( DB_SLAVE ); |
71 | | - if( $user->isLoggedIn() ) |
72 | | - $query = array( 'ur_user' => $user->getId() ); |
73 | | - else |
74 | | - $query = array( 'ur_user_text' => $user->getName() ); |
75 | | - $query['ur_namespace'] = $ns; |
76 | | - $res = $dbr->select( 'user_restrictions', '*', $query, __METHOD__ ); |
77 | | - $result = array(); |
78 | | - foreach( $res as $row ) { |
79 | | - $result[] = self::newFromRow( $row ); |
80 | | - } |
81 | | - return $result; |
82 | | - } |
83 | | - |
84 | | - public static function newFromId( $id, $forWrite = false ) { |
85 | | - $dbr = wfGetDB( $forWrite ? DB_MASTER : DB_SLAVE ); |
86 | | - if( !$id || !is_numeric( $id ) ) |
87 | | - return null; |
88 | | - $res = $dbr->selectRow( 'user_restrictions', '*', array( 'ur_id' => $id ), __METHOD__ ); |
89 | | - return self::newFromRow( $res ); |
90 | | - } |
91 | | - |
92 | | - public function getId() { return $this->mId; } |
93 | | - public function setId( $v ) { $this->mId = $v; } |
94 | | - public function getType() { return $this->mType; } |
95 | | - public function setType( $v ) { $this->mType = $v; } |
96 | | - public function getNamespace() { return $this->mNamespace; } |
97 | | - public function setNamespace( $v ) { $this->mNamespace = $v; } |
98 | | - public function getPage() { return $this->mPage; } |
99 | | - public function setPage( $v ) { $this->mPage = $v; } |
100 | | - public function getSubjectId() { return $this->mSubjectId; } |
101 | | - public function setSubjectId( $v ) { $this->mSubjectId = $v; } |
102 | | - public function getSubjectText() { return $this->mSubjectText; } |
103 | | - public function setSubjectText( $v ) { $this->mSubjectText = $v; } |
104 | | - public function getBlockerId() { return $this->mBlockerId; } |
105 | | - public function setBlockerId( $v ) { $this->mBlockerId = $v; } |
106 | | - public function getBlockerText() { return $this->mBlockerText; } |
107 | | - public function setBlockerText( $v ) { $this->mBlockerText = $v; } |
108 | | - public function getReason() { return $this->mReason; } |
109 | | - public function setReason( $v ) { $this->mReason = $v; } |
110 | | - public function getTimestamp() { return $this->mTimestamp; } |
111 | | - public function setTimestamp( $v ) { $this->mTimestamp = $v; } |
112 | | - public function getExpiry() { return $this->mExpiry; } |
113 | | - public function setExpiry( $v ) { $this->mExpiry = $v; } |
114 | | - |
115 | | - public function isPage() { |
116 | | - return $this->mType == self::PAGE; |
117 | | - } |
118 | | - public function isNamespace() { |
119 | | - return $this->mType == self::NAMESPACE; |
120 | | - } |
121 | | - |
122 | | - public function isExpired() { |
123 | | - return is_numeric( $this->mExpiry ) && $this->mExpiry < wfTimestampNow( TS_MW ); |
124 | | - } |
125 | | - |
126 | | - public function deleteIfExpired() { |
127 | | - if( $this->isExpired() ) { |
128 | | - $this->delete(); |
129 | | - return true; |
130 | | - } else { |
131 | | - return false; |
132 | | - } |
133 | | - } |
134 | | - |
135 | | - public function delete() { |
136 | | - $dbw = wfGetDB( DB_MASTER ); |
137 | | - $dbw->delete( 'user_restrictions', array( 'ur_id' => $this->mId ), __METHOD__ ); |
138 | | - return $dbw->affectedRows(); |
139 | | - } |
140 | | - |
141 | | - public static function purgeExpired() { |
142 | | - $dbw = wfGetDB( DB_MASTER ); |
143 | | - $dbw->delete( 'user_restrictions', array( 'ur_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ), __METHOD__ ); |
144 | | - } |
145 | | - |
146 | | - public function commit() { |
147 | | - $dbw = wfGetDB( DB_MASTER ); |
148 | | - $this->setId( $dbw->nextSequenceValue('user_restrictions_ur_id_val') ); |
149 | | - $row = array( |
150 | | - 'ur_id' => $this->mId, |
151 | | - 'ur_type' => $this->mType, |
152 | | - 'ur_user' => $this->mSubjectId, |
153 | | - 'ur_user_text' => $this->mSubjectText, |
154 | | - 'ur_by' => $this->mBlockerId, |
155 | | - 'ur_by_text' => $this->mBlockerText, |
156 | | - 'ur_reason' => $this->mReason, |
157 | | - 'ur_timestamp' => $dbw->timestamp( $this->mTimestamp ), |
158 | | - 'ur_expiry' => $this->mExpiry, |
159 | | - ); |
160 | | - if( $this->isPage() ) { |
161 | | - $row['ur_page_namespace'] = $this->mPage->getNamespace(); |
162 | | - $row['ur_page_title'] = $this->mPage->getDbKey(); |
163 | | - } |
164 | | - if( $this->isNamespace() ) { |
165 | | - $row['ur_namespace'] = $this->mNamespace; |
166 | | - } |
167 | | - $dbw->insert( 'user_restrictions', $row, __METHOD__ ); |
168 | | - } |
169 | | - |
170 | | - public static function formatType( $type ) { |
171 | | - return wfMsg( 'userrestrictiontype-' . $type ); |
172 | | - } |
173 | | - |
174 | | - /** |
175 | | - * Converts expiry which user input to the internal representation. |
176 | | - * Returns false if invalid expiry is set, Block::infinity() on empty value, |
177 | | - * Block::infinity() on infinity or 14-symbol timestamp |
178 | | - */ |
179 | | - public static function convertExpiry( $expiry ) { |
180 | | - if( !$expiry ) |
181 | | - return Block::infinity(); |
182 | | - if( in_array( $expiry, array( 'infinite', 'infinity', 'indefinite' ) ) ) |
183 | | - return Block::infinity(); |
184 | | - $unix = @strtotime( $expiry ); |
185 | | - if( !$unix || $unix === -1 ) |
186 | | - return false; |
187 | | - else |
188 | | - return wfTimestamp( TS_MW, $unix ); |
189 | | - } |
190 | | -} |
Index: trunk/phase3/includes/User.php |
— | — | @@ -151,7 +151,7 @@ |
152 | 152 | 'markbotedits', |
153 | 153 | 'minoredit', |
154 | 154 | 'move', |
155 | | - 'movefile', |
| 155 | + 'movepage', |
156 | 156 | 'move-rootuserpages', |
157 | 157 | 'move-subpages', |
158 | 158 | 'nominornewtalk', |
— | — | @@ -161,7 +161,6 @@ |
162 | 162 | 'proxyunbannable', |
163 | 163 | 'purge', |
164 | 164 | 'read', |
165 | | - 'restrict', |
166 | 165 | 'reupload', |
167 | 166 | 'reupload-shared', |
168 | 167 | 'rollback', |
Index: trunk/phase3/includes/Article.php |
— | — | @@ -2435,12 +2435,7 @@ |
2436 | 2436 | ); |
2437 | 2437 | |
2438 | 2438 | # Delete restrictions for it |
2439 | | - $dbw->delete( 'page_restrictions', array( 'pr_page' => $id ), __METHOD__ ); |
2440 | | - $dbw->delete( 'user_restrictions', |
2441 | | - array( |
2442 | | - 'ur_page_namespace' => $this->mTitle->getNamespace(), |
2443 | | - 'ur_page_title' => $this->mTitle->getDBKey() |
2444 | | - ), __METHOD__ ); |
| 2439 | + $dbw->delete( 'page_restrictions', array ( 'pr_page' => $id ), __METHOD__ ); |
2445 | 2440 | |
2446 | 2441 | # Now that it's safely backed up, delete it |
2447 | 2442 | $dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__); |
Index: trunk/phase3/includes/AutoLoader.php |
— | — | @@ -201,8 +201,6 @@ |
202 | 202 | 'UserArray' => 'includes/UserArray.php', |
203 | 203 | 'UserArrayFromResult' => 'includes/UserArray.php', |
204 | 204 | 'UserMailer' => 'includes/UserMailer.php', |
205 | | - 'UserRestriction' => 'includes/UserRestriction.php', |
206 | | - 'UserRestrictionsPager' => 'includes/specials/SpecialListUserRestrictions.php', |
207 | 205 | 'UserRightsProxy' => 'includes/UserRightsProxy.php', |
208 | 206 | 'WatchedItem' => 'includes/WatchedItem.php', |
209 | 207 | 'WatchlistEditor' => 'includes/WatchlistEditor.php', |
Index: trunk/phase3/includes/Title.php |
— | — | @@ -1009,7 +1009,9 @@ |
1010 | 1010 | } |
1011 | 1011 | $errors = $this->getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries ); |
1012 | 1012 | |
1013 | | - global $wgContLang, $wgLang, $wgEmailConfirmToEdit; |
| 1013 | + global $wgContLang; |
| 1014 | + global $wgLang; |
| 1015 | + global $wgEmailConfirmToEdit; |
1014 | 1016 | |
1015 | 1017 | if ( $wgEmailConfirmToEdit && !$user->isEmailConfirmed() && $action != 'createaccount' ) { |
1016 | 1018 | $errors[] = array( 'confirmedittext' ); |
— | — | @@ -1041,7 +1043,20 @@ |
1042 | 1044 | $blockTimestamp = $wgLang->timeanddate( wfTimestamp( TS_MW, $user->mBlock->mTimestamp ), true ); |
1043 | 1045 | |
1044 | 1046 | if ( $blockExpiry == 'infinity' ) { |
1045 | | - $blockExpiry = wfMsg( 'ipbinfinite' ); |
| 1047 | + // Entry in database (table ipblocks) is 'infinity' but 'ipboptions' uses 'infinite' or 'indefinite' |
| 1048 | + $scBlockExpiryOptions = wfMsg( 'ipboptions' ); |
| 1049 | + |
| 1050 | + foreach ( explode( ',', $scBlockExpiryOptions ) as $option ) { |
| 1051 | + if ( strpos( $option, ':' ) == false ) |
| 1052 | + continue; |
| 1053 | + |
| 1054 | + list ($show, $value) = explode( ":", $option ); |
| 1055 | + |
| 1056 | + if ( $value == 'infinite' || $value == 'indefinite' ) { |
| 1057 | + $blockExpiry = $show; |
| 1058 | + break; |
| 1059 | + } |
| 1060 | + } |
1046 | 1061 | } else { |
1047 | 1062 | $blockExpiry = $wgLang->timeanddate( wfTimestamp( TS_MW, $blockExpiry ), true ); |
1048 | 1063 | } |
— | — | @@ -1051,9 +1066,9 @@ |
1052 | 1067 | $errors[] = array( ($block->mAuto ? 'autoblockedtext' : 'blockedtext'), $link, $reason, $ip, $name, |
1053 | 1068 | $blockid, $blockExpiry, $intended, $blockTimestamp ); |
1054 | 1069 | } |
1055 | | - |
| 1070 | + |
1056 | 1071 | // Remove the errors being ignored. |
1057 | | - |
| 1072 | + |
1058 | 1073 | foreach( $errors as $index => $error ) { |
1059 | 1074 | $error_key = is_array($error) ? $error[0] : $error; |
1060 | 1075 | |
— | — | @@ -1076,8 +1091,6 @@ |
1077 | 1092 | * @return \type{\array} Array of arrays of the arguments to wfMsg to explain permissions problems. |
1078 | 1093 | */ |
1079 | 1094 | private function getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries = true ) { |
1080 | | - global $wgLang; |
1081 | | - |
1082 | 1095 | wfProfileIn( __METHOD__ ); |
1083 | 1096 | |
1084 | 1097 | $errors = array(); |
— | — | @@ -1249,34 +1262,6 @@ |
1250 | 1263 | $errors[] = $return; |
1251 | 1264 | } |
1252 | 1265 | |
1253 | | - // Check per-user restrictions |
1254 | | - if( $doExpensiveQueries && $action != 'read' ) { |
1255 | | - $rs = UserRestriction::fetchForTitle( $user, $this ); |
1256 | | - if( !$rs ) |
1257 | | - $rs = UserRestriction::fetchForNamespace( $user, $this->getNamespace() ); |
1258 | | - if( $rs ) { |
1259 | | - $r = $rs[0]; |
1260 | | - if( !$r->deleteIfExpired() ) { |
1261 | | - $error = array(); |
1262 | | - $start = array( $wgLang->date( $r->getTimestamp() ), $wgLang->time( $r->getTimestamp() ) ); |
1263 | | - if( $r->isPage() ) |
1264 | | - $error = array( 'userrestricted-page', $this->getFullText(), |
1265 | | - $r->getBlockerText(), $r->getReason(), $start[0], $start[1] ); |
1266 | | - elseif( $r->isNamespace() ) |
1267 | | - $error = array( 'userrestricted-namespace', $wgLang->getDisplayNsText( $this->getNamespace() ), |
1268 | | - $r->getBlockerText(), $r->getReason(), $start[0], $start[1] ); |
1269 | | - |
1270 | | - if( $r->getExpiry() == 'infinity' ) { |
1271 | | - $error[0] .= '-indef'; |
1272 | | - } else { |
1273 | | - $error[] = $wgLang->date( $r->getExpiry() ); |
1274 | | - $error[] = $wgLang->time( $r->getExpiry() ); |
1275 | | - } |
1276 | | - $errors[] = $error; |
1277 | | - } |
1278 | | - } |
1279 | | - } |
1280 | | - |
1281 | 1266 | wfProfileOut( __METHOD__ ); |
1282 | 1267 | return $errors; |
1283 | 1268 | } |
— | — | @@ -2573,12 +2558,6 @@ |
2574 | 2559 | $log->addEntry( 'move_prot', $nt, $comment, array($this->getPrefixedText()) ); // FIXME: $params? |
2575 | 2560 | } |
2576 | 2561 | |
2577 | | - # Update user restrictions |
2578 | | - $dbw->update( 'user_restrictions', |
2579 | | - array( 'ur_page_namespace' => $nt->getNamespace(), 'ur_page_title' => $nt->getDBKey() ), |
2580 | | - array( 'ur_page_namespace' => $this->getNamespace(), 'ur_page_title' => $this->getDBKey() ), |
2581 | | - __METHOD__ ); |
2582 | | - |
2583 | 2562 | # Update watchlists |
2584 | 2563 | $oldnamespace = $this->getNamespace() & ~1; |
2585 | 2564 | $newnamespace = $nt->getNamespace() & ~1; |
Index: trunk/phase3/includes/DefaultSettings.php |
— | — | @@ -1232,7 +1232,6 @@ |
1233 | 1233 | $wgGroupPermissions['sysop']['apihighlimits'] = true; |
1234 | 1234 | $wgGroupPermissions['sysop']['browsearchive'] = true; |
1235 | 1235 | $wgGroupPermissions['sysop']['noratelimit'] = true; |
1236 | | -$wgGroupPermissions['sysop']['restrict'] = true; |
1237 | 1236 | $wgGroupPermissions['sysop']['movefile'] = true; |
1238 | 1237 | #$wgGroupPermissions['sysop']['mergehistory'] = true; |
1239 | 1238 | |
— | — | @@ -2797,7 +2796,6 @@ |
2798 | 2797 | 'patrol', |
2799 | 2798 | 'merge', |
2800 | 2799 | 'suppress', |
2801 | | - 'restrict', |
2802 | 2800 | ); |
2803 | 2801 | |
2804 | 2802 | /** |
— | — | @@ -2852,7 +2850,6 @@ |
2853 | 2851 | 'patrol' => 'patrol-log-page', |
2854 | 2852 | 'merge' => 'mergelog', |
2855 | 2853 | 'suppress' => 'suppressionlog', |
2856 | | - 'restrict' => 'restrictionlog', |
2857 | 2854 | ); |
2858 | 2855 | |
2859 | 2856 | /** |
— | — | @@ -2873,7 +2870,6 @@ |
2874 | 2871 | 'patrol' => 'patrol-log-header', |
2875 | 2872 | 'merge' => 'mergelogpagetext', |
2876 | 2873 | 'suppress' => 'suppressionlogtext', |
2877 | | - 'restrict' => 'restrictionlogtext', |
2878 | 2874 | ); |
2879 | 2875 | |
2880 | 2876 | /** |
— | — | @@ -2909,8 +2905,6 @@ |
2910 | 2906 | 'suppress/delete' => 'suppressedarticle', |
2911 | 2907 | 'suppress/block' => 'blocklogentry', |
2912 | 2908 | 'suppress/reblock' => 'reblock-logentry', |
2913 | | - 'restrict/restrict' => 'restrictentry', |
2914 | | - 'restrict/remove' => 'restrictremoveentry', |
2915 | 2909 | ); |
2916 | 2910 | |
2917 | 2911 | /** |
— | — | @@ -2982,8 +2976,6 @@ |
2983 | 2977 | 'Preferences' => 'users', |
2984 | 2978 | 'Resetpass' => 'users', |
2985 | 2979 | 'DeletedContributions' => 'users', |
2986 | | - 'ListUserRestrictions' => 'users', |
2987 | | - 'RestrictUser' => 'users', |
2988 | 2980 | |
2989 | 2981 | 'Mostlinked' => 'highuse', |
2990 | 2982 | 'Mostlinkedcategories' => 'highuse', |
Index: trunk/phase3/includes/specials/SpecialRestrictUser.php |
— | — | @@ -2,8 +2,6 @@ |
3 | 3 | |
4 | 4 | function wfSpecialRestrictUser( $par = null ) { |
5 | 5 | global $wgOut, $wgRequest; |
6 | | - $wgOut->addHTML( wfMsgExt( 'restrictuser-description', 'parse' ) ); |
7 | | - |
8 | 6 | $user = $userOrig = null; |
9 | 7 | if( $par ) { |
10 | 8 | $userOrig = $par; |
— | — | @@ -50,6 +48,8 @@ |
51 | 49 | } |
52 | 50 | |
53 | 51 | public static function existingRestrictions( $restrictions ) { |
| 52 | + //TODO: autoload? |
| 53 | + require_once( dirname( __FILE__ ) . '/SpecialListUserRestrictions.php' ); |
54 | 54 | $s = Xml::fieldset( wfMsg( 'restrictuser-existing' ) ) . '<ul>'; |
55 | 55 | foreach( $restrictions as $r ) |
56 | 56 | $s .= UserRestrictionsPager::formatRestriction( $r ); |
— | — | @@ -126,7 +126,6 @@ |
127 | 127 | $l = new LogPage( 'restrict' ); |
128 | 128 | $l->addEntry( 'restrict', Title::makeTitle( NS_USER, $user ), $r->getReason(), |
129 | 129 | array( $r->getType(), $r->getPage()->getFullText(), $logExpiry) ); |
130 | | - self::invalidateCache( $user ); |
131 | 130 | } |
132 | 131 | |
133 | 132 | public static function namespaceRestrictionForm( $uid, $user, $oldRestrictions ) { |
— | — | @@ -137,13 +136,13 @@ |
138 | 137 | $wgUser->matchEditToken( $wgRequest->getVal( 'edittoken' ) ) ) { |
139 | 138 | $ns = $wgRequest->getVal( 'namespace' ); |
140 | 139 | if( $wgContLang->getNsText( $ns ) === false ) |
141 | | - $error = array( 'restrictuser-badnamespace' ); |
| 140 | + $error = wfMsgExt( 'restrictuser-badnamespace', 'parseinline' ); |
142 | 141 | elseif( UserRestriction::convertExpiry( $wgRequest->getVal( 'expiry' ) ) === false ) |
143 | | - $error = array( 'restrictuser-badexpiry', $wgRequest->getVal( 'expiry' ) ); |
| 142 | + $error = wfMsgExt( 'restrictuser-badexpiry', 'parseinline', $wgRequest->getVal( 'expiry' ) ); |
144 | 143 | else |
145 | 144 | foreach( $oldRestrictions as $r ) |
146 | 145 | if( $r->isNamespace() && $r->getNamespace() == $ns ) |
147 | | - $error = array( 'restrictuser-dupnamespace' ); |
| 146 | + $error = wfMsgExt( 'restrictuser-dupnamespace', 'parse' ); |
148 | 147 | if( !$error ) { |
149 | 148 | self::doNamespaceRestriction( $uid, $user ); |
150 | 149 | $success = array('restrictuser-success', $user); |
— | — | @@ -186,11 +185,5 @@ |
187 | 186 | $l = new LogPage( 'restrict' ); |
188 | 187 | $l->addEntry( 'restrict', Title::makeTitle( NS_USER, $user ), $r->getReason(), |
189 | 188 | array( $r->getType(), $r->getNamespace(), $logExpiry ) ); |
190 | | - self::invalidateCache( $user ); |
191 | 189 | } |
192 | | - |
193 | | - private static function invalidateCache( $user ) { |
194 | | - $userObj = User::newFromName( $user, false ); |
195 | | - $userObj->invalidateCache(); |
196 | | - } |
197 | 190 | } |
Index: trunk/phase3/includes/specials/SpecialRemoveRestrictions.php |
— | — | @@ -56,7 +56,5 @@ |
57 | 57 | if( $r->isNamespace() ) |
58 | 58 | $params[] = $r->getNamespace(); |
59 | 59 | $log->addEntry( 'remove', Title::makeTitle( NS_USER, $r->getSubjectText() ), $reason, $params ); |
60 | | - $userObj = User::newFromName( $r->getSubjectText(), false ); |
61 | | - $userObj->invalidateCache(); |
62 | 60 | return $result; |
63 | 61 | } |
Index: trunk/phase3/includes/specials/SpecialListUserRestrictions.php |
— | — | @@ -134,7 +134,7 @@ |
135 | 135 | $subjlink = $sk->userLink( $r->getSubjectId(), $r->getSubjectText() ) . |
136 | 136 | $sk->userToolLinks( $r->getSubjectId(), $r->getSubjectText() ); |
137 | 137 | $expiry = is_numeric( $r->getExpiry() ) ? |
138 | | - wfMsg( 'listuserrestrictions-row-expiry', $wgLang->date( $r->getExpiry() ), $wgLang->time( $r->getExpiry() ) ) : |
| 138 | + wfMsg( 'listuserrestrictions-row-expiry', $wgLang->timeanddate( $r->getExpiry() ) ) : |
139 | 139 | wfMsg( 'ipbinfinite' ); |
140 | 140 | $msg = ''; |
141 | 141 | if( $r->isNamespace() ) { |
Index: trunk/phase3/includes/SpecialPage.php |
— | — | @@ -129,9 +129,6 @@ |
130 | 130 | 'Allpages' => 'SpecialAllpages', |
131 | 131 | 'Prefixindex' => 'SpecialPrefixindex', |
132 | 132 | 'Ipblocklist' => array( 'SpecialPage', 'Ipblocklist' ), |
133 | | - 'ListUserRestrictions' => array( 'SpecialPage', 'ListUserRestrictions' ), |
134 | | - 'RemoveRestrictions' => array( 'UnlistedSpecialPage', 'RemoveRestrictions', 'restrict' ), |
135 | | - 'RestrictUser' => array( 'SpecialPage', 'RestrictUser', 'restrict' ), |
136 | 133 | 'Specialpages' => array( 'UnlistedSpecialPage', 'Specialpages' ), |
137 | 134 | 'Contributions' => 'SpecialContributions', |
138 | 135 | 'Emailuser' => array( 'UnlistedSpecialPage', 'Emailuser' ), |
Index: trunk/phase3/includes/LogPage.php |
— | — | @@ -193,19 +193,6 @@ |
194 | 194 | } else { |
195 | 195 | $rv = wfMsgForContent( $wgLogActions[$key], $titleLink ); |
196 | 196 | } |
197 | | - } elseif( $type == 'restrict' ) { |
198 | | - if( $params[0] == UserRestriction::PAGE ) |
199 | | - $subj = wfMsgExt( 'restrictlogpage', 'parseinline', $params[1] ); |
200 | | - if( $params[0] == UserRestriction::NAMESPACE ) |
201 | | - $subj = wfMsgExt( 'restrictlognamespace', 'parseinline', $wgLang->getDisplayNsText( $params[1] ) ); |
202 | | - $expiry = ''; |
203 | | - if( $key == 'restrict/restrict' ) |
204 | | - $expiry = $wgLang->translateBlockExpiry( $params[2] ); |
205 | | - if ( $skin ) { |
206 | | - $rv = wfMsg( $wgLogActions[$key], $titleLink, $subj, $expiry ); |
207 | | - } else { |
208 | | - $rv = wfMsgForContent( $wgLogActions[$key], $titleLink, $subj, $expiry ); |
209 | | - } |
210 | 197 | } else { |
211 | 198 | $details = ''; |
212 | 199 | array_unshift( $params, $titleLink ); |
— | — | @@ -277,7 +264,6 @@ |
278 | 265 | } |
279 | 266 | break; |
280 | 267 | case 'rights': |
281 | | - case 'restrict': |
282 | 268 | $text = $wgContLang->ucfirst( $title->getText() ); |
283 | 269 | $titleLink = $skin->makeLinkObj( Title::makeTitle( NS_USER, $text ) ); |
284 | 270 | break; |
Index: trunk/phase3/languages/messages/MessagesEn.php |
— | — | @@ -431,9 +431,6 @@ |
432 | 432 | 'LinkSearch' => array( 'LinkSearch' ), |
433 | 433 | 'DeletedContributions' => array( 'DeletedContributions' ), |
434 | 434 | 'Interwiki' => array( 'Interwiki' ), |
435 | | - 'ListUserRestrictions' => array( 'ListUserRestrictions' ), |
436 | | - 'RemoveRestrictions' => array( 'RemoveRestrictions' ), |
437 | | - 'RestrictUser' => array( 'RestrictUser' ), |
438 | 435 | ); |
439 | 436 | |
440 | 437 | /** |
— | — | @@ -1199,39 +1196,7 @@ |
1200 | 1197 | 'edit-no-change' => 'Your edit was ignored, because no change was made to the text.', |
1201 | 1198 | 'edit-already-exists' => 'Could not create a new page. |
1202 | 1199 | It already exists.', |
1203 | | -'userrestricted-page' => '<big>\'\'\'Your user name or IP address has been restricted from editing page "$1".\'\'\'</big> |
1204 | 1200 | |
1205 | | -The restriction was set by [[User:$2|$2]]. |
1206 | | -The reason given is \'\'$3\'\'. |
1207 | | - |
1208 | | -The restriction was set on $4 at $5 and expires on $6 at $7. |
1209 | | - |
1210 | | -You can contact [[User:$2|$2]] or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the restriction.', |
1211 | | -'userrestricted-namespace' => "<big>'''Your user name or IP address has been restricted from editing the $1 namespace.'''</big> |
1212 | | - |
1213 | | -The restriction was put by [[User:$2|$2]]. |
1214 | | -The reason given is ''$3''. |
1215 | | - |
1216 | | -Restriction was put on $4 at $5 and expires on $6 at $7. |
1217 | | - |
1218 | | -You can contact [[User:$2|$2]] or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the restriction.", |
1219 | | -'userrestricted-page-indef' => '<big>\'\'\'Your user name or IP address has been restricted from editing page "$1".\'\'\'</big> |
1220 | | - |
1221 | | -The restriction was set by [[User:$2|$2]]. |
1222 | | -The reason given is \'\'$3\'\'. |
1223 | | - |
1224 | | -The restriction was set on $4 at $5 and will not expire. |
1225 | | - |
1226 | | -You can contact [[User:$2|$2]] or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the restriction.', |
1227 | | -'userrestricted-namespace-indef' => "<big>'''Your user name or IP address has been restricted from editing $1 namespace.'''</big> |
1228 | | - |
1229 | | -The restriction was put by [[User:$2|$2]]. |
1230 | | -The reason given is ''$3''. |
1231 | | - |
1232 | | -Restriction was put on $4 at $5 and will not expire. |
1233 | | - |
1234 | | -You can contact [[User:$2|$2]] or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the restriction.", |
1235 | | - |
1236 | 1201 | # Parser/template warnings |
1237 | 1202 | 'expensive-parserfunction-warning' => 'Warning: This page contains too many expensive parser function calls. |
1238 | 1203 | |
— | — | @@ -2601,7 +2566,6 @@ |
2602 | 2567 | 'ipbsubmit' => 'Block this user', |
2603 | 2568 | 'ipbother' => 'Other time:', |
2604 | 2569 | 'ipboptions' => '2 hours:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,infinite:infinite', # display1:time1,display2:time2,... |
2605 | | -'ipbinfinite' => 'infinite', |
2606 | 2570 | 'ipbotheroption' => 'other', |
2607 | 2571 | 'ipbotherreason' => 'Other/additional reason:', |
2608 | 2572 | 'ipbhidename' => 'Hide username from the block log, active block list and user list', |
— | — | @@ -2684,72 +2648,6 @@ |
2685 | 2649 | You cannot create an account', |
2686 | 2650 | 'cant-block-while-blocked' => 'You cannot block other users while you are blocked.', |
2687 | 2651 | |
2688 | | -# Special:ListUserRestrictions |
2689 | | -'listuserrestrictions' => 'List of user restrictions', |
2690 | | -'listuserrestrictions-intro' => 'This list contains all restrictions from editing certain pages and namespaces put on users. |
2691 | | -[[Special:Ipblocklist|Blocks]] are not listed here.', |
2692 | | -'listuserrestrictions-row-ns' => 'restricted $1 from editing $2 namespace ($3)', |
2693 | | -'listuserrestrictions-row-page' => 'restricted $1 from editing $2 ($3)', |
2694 | | -'listuserrestrictions-row-expiry' => 'expires on $1 at $2', |
2695 | | -'listuserrestrictions-legend' => 'Find a restriction', |
2696 | | -'listuserrestrictions-type' => 'Type:', |
2697 | | -'listuserrestrictions-user' => 'User:', |
2698 | | -'listuserrestrictions-namespace' => 'Namespace:', |
2699 | | -'listuserrestrictions-page' => 'Page:', |
2700 | | -'listuserrestrictions-submit' => 'Go', |
2701 | | -'listuserrestrictions-notfound' => 'There is no restriction that matches specified criteria.', |
2702 | | -'listuserrestrictions-empty' => 'This list is empty.', |
2703 | | -'listuserrestrictions-remove' => 'remove', |
2704 | | -'userrestrictiontype-none' => '(none)', |
2705 | | -'userrestrictiontype-namespace' => 'Namespace', |
2706 | | -'userrestrictiontype-page' => 'Page', |
2707 | | - |
2708 | | -# Special:RemoveRestrictions |
2709 | | -'removerestrictions' => 'Remove the restriction for a user', |
2710 | | -'removerestrictions-intro' => 'Use the form below to remove a restriction from a certain user.', |
2711 | | -'removerestrictions-noid' => 'No restriction ID was specified.', |
2712 | | -'removerestrictions-wrongid' => 'Restriction with that ID not found. |
2713 | | -Most probably someone has removed it or it expired.', |
2714 | | -'removerestrictions-legend' => 'Remove a restriction', |
2715 | | -'removerestrictions-user' => 'Restricted user:', |
2716 | | -'removerestrictions-type' => 'Restriction type:', |
2717 | | -'removerestrictions-page' => 'Page:', |
2718 | | -'removerestrictions-namespace' => 'Namespace:', |
2719 | | -'removerestrictions-reason' => 'Reason:', |
2720 | | -'removerestrictions-submit' => 'Remove the restriction', |
2721 | | -'removerestrictions-success' => 'Successfully removed the restriction from [[User:$1|$1]].', |
2722 | | - |
2723 | | -# Restrict user |
2724 | | -'restrictuser' => 'Restrict user', |
2725 | | -'restrictuser-userselect' => 'Select a user', |
2726 | | -'restrictuser-user' => 'User:', |
2727 | | -'restrictuser-go' => 'Restrict user', |
2728 | | -'restrictuser-notfound' => 'User not found', |
2729 | | -'restrictuser-existing' => 'Existing restrictions', |
2730 | | -'restrictuser-legend-page' => 'Restrict from editing a page', |
2731 | | -'restrictuser-legend-namespace' => 'Restrict from editing a namespace', |
2732 | | -'restrictuser-title' => 'Page to restrict:', |
2733 | | -'restrictuser-namespace' => 'Namespace:', |
2734 | | -'restrictuser-expiry' => 'Expires:', |
2735 | | -'restrictuser-reason' => 'Reason:', |
2736 | | -'restrictuser-submit' => 'Restrict user', |
2737 | | -'restrictuser-badtitle' => 'Invalid title specified: $1.', |
2738 | | -'restrictuser-badnamespace' => 'Invalid namespace specified.', |
2739 | | -'restrictuser-badexpiry' => 'Invalid expiry specified: $1.', |
2740 | | -'restrictuser-duptitle' => 'User is already restricted from editing this title.', |
2741 | | -'restrictuser-dupnamespace' => 'User is already restricted from editing this namespace.', |
2742 | | -'restrictuser-success' => 'Successfully restricted user $1.', |
2743 | | -'restrictuser-description' => 'Use the form below to block write access to a specific page or namespace from a specific IP address or username. |
2744 | | -This should be done only in accordance with policy. Fill in a specific reason below.', |
2745 | | - |
2746 | | -# Special:Log/restrict |
2747 | | -'restrictionlog' => 'User restriction log', |
2748 | | -'restrictionlogtext' => 'This log contains all restrictions put on users by administrators.', |
2749 | | -'restrictentry' => 'restricted $1 from editing $2 (expiry set to $3)', |
2750 | | -'restrictremoveentry' => 'removed restriction from $1 for editing $2', |
2751 | | -'restrictlognamespace' => '$1 namespace', |
2752 | | -'restrictlogpage' => '[[$1]]', # do not translate or duplicate this message to other languages |
2753 | | - |
2754 | 2652 | # Developer tools |
2755 | 2653 | 'lockdb' => 'Lock database', |
2756 | 2654 | 'unlockdb' => 'Unlock database', |