danielebarchiesi@0
|
1 <?php
|
danielebarchiesi@0
|
2
|
danielebarchiesi@0
|
3 /**
|
danielebarchiesi@0
|
4 * @file
|
danielebarchiesi@0
|
5 * Install, update and uninstall functions for the user module.
|
danielebarchiesi@0
|
6 */
|
danielebarchiesi@0
|
7
|
danielebarchiesi@0
|
8 /**
|
danielebarchiesi@0
|
9 * Implements hook_schema().
|
danielebarchiesi@0
|
10 */
|
danielebarchiesi@0
|
11 function user_schema() {
|
danielebarchiesi@0
|
12 $schema['authmap'] = array(
|
danielebarchiesi@0
|
13 'description' => 'Stores distributed authentication mapping.',
|
danielebarchiesi@0
|
14 'fields' => array(
|
danielebarchiesi@0
|
15 'aid' => array(
|
danielebarchiesi@0
|
16 'description' => 'Primary Key: Unique authmap ID.',
|
danielebarchiesi@0
|
17 'type' => 'serial',
|
danielebarchiesi@0
|
18 'unsigned' => TRUE,
|
danielebarchiesi@0
|
19 'not null' => TRUE,
|
danielebarchiesi@0
|
20 ),
|
danielebarchiesi@0
|
21 'uid' => array(
|
danielebarchiesi@0
|
22 'type' => 'int',
|
danielebarchiesi@0
|
23 'not null' => TRUE,
|
danielebarchiesi@0
|
24 'default' => 0,
|
danielebarchiesi@0
|
25 'description' => "User's {users}.uid.",
|
danielebarchiesi@0
|
26 ),
|
danielebarchiesi@0
|
27 'authname' => array(
|
danielebarchiesi@0
|
28 'type' => 'varchar',
|
danielebarchiesi@0
|
29 'length' => 128,
|
danielebarchiesi@0
|
30 'not null' => TRUE,
|
danielebarchiesi@0
|
31 'default' => '',
|
danielebarchiesi@0
|
32 'description' => 'Unique authentication name.',
|
danielebarchiesi@0
|
33 ),
|
danielebarchiesi@0
|
34 'module' => array(
|
danielebarchiesi@0
|
35 'type' => 'varchar',
|
danielebarchiesi@0
|
36 'length' => 128,
|
danielebarchiesi@0
|
37 'not null' => TRUE,
|
danielebarchiesi@0
|
38 'default' => '',
|
danielebarchiesi@0
|
39 'description' => 'Module which is controlling the authentication.',
|
danielebarchiesi@0
|
40 ),
|
danielebarchiesi@0
|
41 ),
|
danielebarchiesi@0
|
42 'unique keys' => array(
|
danielebarchiesi@0
|
43 'authname' => array('authname'),
|
danielebarchiesi@0
|
44 ),
|
danielebarchiesi@0
|
45 'primary key' => array('aid'),
|
danielebarchiesi@0
|
46 'foreign keys' => array(
|
danielebarchiesi@0
|
47 'user' => array(
|
danielebarchiesi@0
|
48 'table' => 'users',
|
danielebarchiesi@0
|
49 'columns' => array('uid' => 'uid'),
|
danielebarchiesi@0
|
50 ),
|
danielebarchiesi@0
|
51 ),
|
danielebarchiesi@0
|
52 );
|
danielebarchiesi@0
|
53
|
danielebarchiesi@0
|
54 $schema['role_permission'] = array(
|
danielebarchiesi@0
|
55 'description' => 'Stores the permissions assigned to user roles.',
|
danielebarchiesi@0
|
56 'fields' => array(
|
danielebarchiesi@0
|
57 'rid' => array(
|
danielebarchiesi@0
|
58 'type' => 'int',
|
danielebarchiesi@0
|
59 'unsigned' => TRUE,
|
danielebarchiesi@0
|
60 'not null' => TRUE,
|
danielebarchiesi@0
|
61 'description' => 'Foreign Key: {role}.rid.',
|
danielebarchiesi@0
|
62 ),
|
danielebarchiesi@0
|
63 'permission' => array(
|
danielebarchiesi@0
|
64 'type' => 'varchar',
|
danielebarchiesi@0
|
65 'length' => 128,
|
danielebarchiesi@0
|
66 'not null' => TRUE,
|
danielebarchiesi@0
|
67 'default' => '',
|
danielebarchiesi@0
|
68 'description' => 'A single permission granted to the role identified by rid.',
|
danielebarchiesi@0
|
69 ),
|
danielebarchiesi@0
|
70 'module' => array(
|
danielebarchiesi@0
|
71 'type' => 'varchar',
|
danielebarchiesi@0
|
72 'length' => 255,
|
danielebarchiesi@0
|
73 'not null' => TRUE,
|
danielebarchiesi@0
|
74 'default' => '',
|
danielebarchiesi@0
|
75 'description' => "The module declaring the permission.",
|
danielebarchiesi@0
|
76 ),
|
danielebarchiesi@0
|
77 ),
|
danielebarchiesi@0
|
78 'primary key' => array('rid', 'permission'),
|
danielebarchiesi@0
|
79 'indexes' => array(
|
danielebarchiesi@0
|
80 'permission' => array('permission'),
|
danielebarchiesi@0
|
81 ),
|
danielebarchiesi@0
|
82 'foreign keys' => array(
|
danielebarchiesi@0
|
83 'role' => array(
|
danielebarchiesi@0
|
84 'table' => 'roles',
|
danielebarchiesi@0
|
85 'columns' => array('rid' => 'rid'),
|
danielebarchiesi@0
|
86 ),
|
danielebarchiesi@0
|
87 ),
|
danielebarchiesi@0
|
88 );
|
danielebarchiesi@0
|
89
|
danielebarchiesi@0
|
90 $schema['role'] = array(
|
danielebarchiesi@0
|
91 'description' => 'Stores user roles.',
|
danielebarchiesi@0
|
92 'fields' => array(
|
danielebarchiesi@0
|
93 'rid' => array(
|
danielebarchiesi@0
|
94 'type' => 'serial',
|
danielebarchiesi@0
|
95 'unsigned' => TRUE,
|
danielebarchiesi@0
|
96 'not null' => TRUE,
|
danielebarchiesi@0
|
97 'description' => 'Primary Key: Unique role ID.',
|
danielebarchiesi@0
|
98 ),
|
danielebarchiesi@0
|
99 'name' => array(
|
danielebarchiesi@0
|
100 'type' => 'varchar',
|
danielebarchiesi@0
|
101 'length' => 64,
|
danielebarchiesi@0
|
102 'not null' => TRUE,
|
danielebarchiesi@0
|
103 'default' => '',
|
danielebarchiesi@0
|
104 'description' => 'Unique role name.',
|
danielebarchiesi@0
|
105 'translatable' => TRUE,
|
danielebarchiesi@0
|
106 ),
|
danielebarchiesi@0
|
107 'weight' => array(
|
danielebarchiesi@0
|
108 'type' => 'int',
|
danielebarchiesi@0
|
109 'not null' => TRUE,
|
danielebarchiesi@0
|
110 'default' => 0,
|
danielebarchiesi@0
|
111 'description' => 'The weight of this role in listings and the user interface.',
|
danielebarchiesi@0
|
112 ),
|
danielebarchiesi@0
|
113 ),
|
danielebarchiesi@0
|
114 'unique keys' => array(
|
danielebarchiesi@0
|
115 'name' => array('name'),
|
danielebarchiesi@0
|
116 ),
|
danielebarchiesi@0
|
117 'primary key' => array('rid'),
|
danielebarchiesi@0
|
118 'indexes' => array(
|
danielebarchiesi@0
|
119 'name_weight' => array('name', 'weight'),
|
danielebarchiesi@0
|
120 ),
|
danielebarchiesi@0
|
121 );
|
danielebarchiesi@0
|
122
|
danielebarchiesi@0
|
123 // The table name here is plural, despite Drupal table naming standards,
|
danielebarchiesi@0
|
124 // because "user" is a reserved word in many databases.
|
danielebarchiesi@0
|
125 $schema['users'] = array(
|
danielebarchiesi@0
|
126 'description' => 'Stores user data.',
|
danielebarchiesi@0
|
127 'fields' => array(
|
danielebarchiesi@0
|
128 'uid' => array(
|
danielebarchiesi@0
|
129 'type' => 'int',
|
danielebarchiesi@0
|
130 'unsigned' => TRUE,
|
danielebarchiesi@0
|
131 'not null' => TRUE,
|
danielebarchiesi@0
|
132 'description' => 'Primary Key: Unique user ID.',
|
danielebarchiesi@0
|
133 'default' => 0,
|
danielebarchiesi@0
|
134 ),
|
danielebarchiesi@0
|
135 'name' => array(
|
danielebarchiesi@0
|
136 'type' => 'varchar',
|
danielebarchiesi@0
|
137 'length' => 60,
|
danielebarchiesi@0
|
138 'not null' => TRUE,
|
danielebarchiesi@0
|
139 'default' => '',
|
danielebarchiesi@0
|
140 'description' => 'Unique user name.',
|
danielebarchiesi@0
|
141 ),
|
danielebarchiesi@0
|
142 'pass' => array(
|
danielebarchiesi@0
|
143 'type' => 'varchar',
|
danielebarchiesi@0
|
144 'length' => 128,
|
danielebarchiesi@0
|
145 'not null' => TRUE,
|
danielebarchiesi@0
|
146 'default' => '',
|
danielebarchiesi@0
|
147 'description' => "User's password (hashed).",
|
danielebarchiesi@0
|
148 ),
|
danielebarchiesi@0
|
149 'mail' => array(
|
danielebarchiesi@0
|
150 'type' => 'varchar',
|
danielebarchiesi@0
|
151 'length' => 254,
|
danielebarchiesi@0
|
152 'not null' => FALSE,
|
danielebarchiesi@0
|
153 'default' => '',
|
danielebarchiesi@0
|
154 'description' => "User's e-mail address.",
|
danielebarchiesi@0
|
155 ),
|
danielebarchiesi@0
|
156 'theme' => array(
|
danielebarchiesi@0
|
157 'type' => 'varchar',
|
danielebarchiesi@0
|
158 'length' => 255,
|
danielebarchiesi@0
|
159 'not null' => TRUE,
|
danielebarchiesi@0
|
160 'default' => '',
|
danielebarchiesi@0
|
161 'description' => "User's default theme.",
|
danielebarchiesi@0
|
162 ),
|
danielebarchiesi@0
|
163 'signature' => array(
|
danielebarchiesi@0
|
164 'type' => 'varchar',
|
danielebarchiesi@0
|
165 'length' => 255,
|
danielebarchiesi@0
|
166 'not null' => TRUE,
|
danielebarchiesi@0
|
167 'default' => '',
|
danielebarchiesi@0
|
168 'description' => "User's signature.",
|
danielebarchiesi@0
|
169 ),
|
danielebarchiesi@0
|
170 'signature_format' => array(
|
danielebarchiesi@0
|
171 'type' => 'varchar',
|
danielebarchiesi@0
|
172 'length' => 255,
|
danielebarchiesi@0
|
173 'not null' => FALSE,
|
danielebarchiesi@0
|
174 'description' => 'The {filter_format}.format of the signature.',
|
danielebarchiesi@0
|
175 ),
|
danielebarchiesi@0
|
176 'created' => array(
|
danielebarchiesi@0
|
177 'type' => 'int',
|
danielebarchiesi@0
|
178 'not null' => TRUE,
|
danielebarchiesi@0
|
179 'default' => 0,
|
danielebarchiesi@0
|
180 'description' => 'Timestamp for when user was created.',
|
danielebarchiesi@0
|
181 ),
|
danielebarchiesi@0
|
182 'access' => array(
|
danielebarchiesi@0
|
183 'type' => 'int',
|
danielebarchiesi@0
|
184 'not null' => TRUE,
|
danielebarchiesi@0
|
185 'default' => 0,
|
danielebarchiesi@0
|
186 'description' => 'Timestamp for previous time user accessed the site.',
|
danielebarchiesi@0
|
187 ),
|
danielebarchiesi@0
|
188 'login' => array(
|
danielebarchiesi@0
|
189 'type' => 'int',
|
danielebarchiesi@0
|
190 'not null' => TRUE,
|
danielebarchiesi@0
|
191 'default' => 0,
|
danielebarchiesi@0
|
192 'description' => "Timestamp for user's last login.",
|
danielebarchiesi@0
|
193 ),
|
danielebarchiesi@0
|
194 'status' => array(
|
danielebarchiesi@0
|
195 'type' => 'int',
|
danielebarchiesi@0
|
196 'not null' => TRUE,
|
danielebarchiesi@0
|
197 'default' => 0,
|
danielebarchiesi@0
|
198 'size' => 'tiny',
|
danielebarchiesi@0
|
199 'description' => 'Whether the user is active(1) or blocked(0).',
|
danielebarchiesi@0
|
200 ),
|
danielebarchiesi@0
|
201 'timezone' => array(
|
danielebarchiesi@0
|
202 'type' => 'varchar',
|
danielebarchiesi@0
|
203 'length' => 32,
|
danielebarchiesi@0
|
204 'not null' => FALSE,
|
danielebarchiesi@0
|
205 'description' => "User's time zone.",
|
danielebarchiesi@0
|
206 ),
|
danielebarchiesi@0
|
207 'language' => array(
|
danielebarchiesi@0
|
208 'type' => 'varchar',
|
danielebarchiesi@0
|
209 'length' => 12,
|
danielebarchiesi@0
|
210 'not null' => TRUE,
|
danielebarchiesi@0
|
211 'default' => '',
|
danielebarchiesi@0
|
212 'description' => "User's default language.",
|
danielebarchiesi@0
|
213 ),
|
danielebarchiesi@0
|
214 'picture' => array(
|
danielebarchiesi@0
|
215 'type' => 'int',
|
danielebarchiesi@0
|
216 'not null' => TRUE,
|
danielebarchiesi@0
|
217 'default' => 0,
|
danielebarchiesi@0
|
218 'description' => "Foreign key: {file_managed}.fid of user's picture.",
|
danielebarchiesi@0
|
219 ),
|
danielebarchiesi@0
|
220 'init' => array(
|
danielebarchiesi@0
|
221 'type' => 'varchar',
|
danielebarchiesi@0
|
222 'length' => 254,
|
danielebarchiesi@0
|
223 'not null' => FALSE,
|
danielebarchiesi@0
|
224 'default' => '',
|
danielebarchiesi@0
|
225 'description' => 'E-mail address used for initial account creation.',
|
danielebarchiesi@0
|
226 ),
|
danielebarchiesi@0
|
227 'data' => array(
|
danielebarchiesi@0
|
228 'type' => 'blob',
|
danielebarchiesi@0
|
229 'not null' => FALSE,
|
danielebarchiesi@0
|
230 'size' => 'big',
|
danielebarchiesi@0
|
231 'serialize' => TRUE,
|
danielebarchiesi@0
|
232 'description' => 'A serialized array of name value pairs that are related to the user. Any form values posted during user edit are stored and are loaded into the $user object during user_load(). Use of this field is discouraged and it will likely disappear in a future version of Drupal.',
|
danielebarchiesi@0
|
233 ),
|
danielebarchiesi@0
|
234 ),
|
danielebarchiesi@0
|
235 'indexes' => array(
|
danielebarchiesi@0
|
236 'access' => array('access'),
|
danielebarchiesi@0
|
237 'created' => array('created'),
|
danielebarchiesi@0
|
238 'mail' => array('mail'),
|
danielebarchiesi@0
|
239 'picture' => array('picture'),
|
danielebarchiesi@0
|
240 ),
|
danielebarchiesi@0
|
241 'unique keys' => array(
|
danielebarchiesi@0
|
242 'name' => array('name'),
|
danielebarchiesi@0
|
243 ),
|
danielebarchiesi@0
|
244 'primary key' => array('uid'),
|
danielebarchiesi@0
|
245 'foreign keys' => array(
|
danielebarchiesi@0
|
246 'signature_format' => array(
|
danielebarchiesi@0
|
247 'table' => 'filter_format',
|
danielebarchiesi@0
|
248 'columns' => array('signature_format' => 'format'),
|
danielebarchiesi@0
|
249 ),
|
danielebarchiesi@0
|
250 ),
|
danielebarchiesi@0
|
251 );
|
danielebarchiesi@0
|
252
|
danielebarchiesi@0
|
253 $schema['users_roles'] = array(
|
danielebarchiesi@0
|
254 'description' => 'Maps users to roles.',
|
danielebarchiesi@0
|
255 'fields' => array(
|
danielebarchiesi@0
|
256 'uid' => array(
|
danielebarchiesi@0
|
257 'type' => 'int',
|
danielebarchiesi@0
|
258 'unsigned' => TRUE,
|
danielebarchiesi@0
|
259 'not null' => TRUE,
|
danielebarchiesi@0
|
260 'default' => 0,
|
danielebarchiesi@0
|
261 'description' => 'Primary Key: {users}.uid for user.',
|
danielebarchiesi@0
|
262 ),
|
danielebarchiesi@0
|
263 'rid' => array(
|
danielebarchiesi@0
|
264 'type' => 'int',
|
danielebarchiesi@0
|
265 'unsigned' => TRUE,
|
danielebarchiesi@0
|
266 'not null' => TRUE,
|
danielebarchiesi@0
|
267 'default' => 0,
|
danielebarchiesi@0
|
268 'description' => 'Primary Key: {role}.rid for role.',
|
danielebarchiesi@0
|
269 ),
|
danielebarchiesi@0
|
270 ),
|
danielebarchiesi@0
|
271 'primary key' => array('uid', 'rid'),
|
danielebarchiesi@0
|
272 'indexes' => array(
|
danielebarchiesi@0
|
273 'rid' => array('rid'),
|
danielebarchiesi@0
|
274 ),
|
danielebarchiesi@0
|
275 'foreign keys' => array(
|
danielebarchiesi@0
|
276 'user' => array(
|
danielebarchiesi@0
|
277 'table' => 'users',
|
danielebarchiesi@0
|
278 'columns' => array('uid' => 'uid'),
|
danielebarchiesi@0
|
279 ),
|
danielebarchiesi@0
|
280 'role' => array(
|
danielebarchiesi@0
|
281 'table' => 'roles',
|
danielebarchiesi@0
|
282 'columns' => array('rid' => 'rid'),
|
danielebarchiesi@0
|
283 ),
|
danielebarchiesi@0
|
284 ),
|
danielebarchiesi@0
|
285 );
|
danielebarchiesi@0
|
286
|
danielebarchiesi@0
|
287 return $schema;
|
danielebarchiesi@0
|
288 }
|
danielebarchiesi@0
|
289
|
danielebarchiesi@0
|
290 /**
|
danielebarchiesi@0
|
291 * Implements hook_install().
|
danielebarchiesi@0
|
292 */
|
danielebarchiesi@0
|
293 function user_install() {
|
danielebarchiesi@0
|
294 // Insert a row for the anonymous user.
|
danielebarchiesi@0
|
295 db_insert('users')
|
danielebarchiesi@0
|
296 ->fields(array(
|
danielebarchiesi@0
|
297 'uid' => 0,
|
danielebarchiesi@0
|
298 'name' => '',
|
danielebarchiesi@0
|
299 'mail' => '',
|
danielebarchiesi@0
|
300 ))
|
danielebarchiesi@0
|
301 ->execute();
|
danielebarchiesi@0
|
302
|
danielebarchiesi@0
|
303 // We need some placeholders here as name and mail are uniques and data is
|
danielebarchiesi@0
|
304 // presumed to be a serialized array. This will be changed by the settings
|
danielebarchiesi@0
|
305 // form in the installer.
|
danielebarchiesi@0
|
306 db_insert('users')
|
danielebarchiesi@0
|
307 ->fields(array(
|
danielebarchiesi@0
|
308 'uid' => 1,
|
danielebarchiesi@0
|
309 'name' => 'placeholder-for-uid-1',
|
danielebarchiesi@0
|
310 'mail' => 'placeholder-for-uid-1',
|
danielebarchiesi@0
|
311 'created' => REQUEST_TIME,
|
danielebarchiesi@0
|
312 'status' => 1,
|
danielebarchiesi@0
|
313 'data' => NULL,
|
danielebarchiesi@0
|
314 ))
|
danielebarchiesi@0
|
315 ->execute();
|
danielebarchiesi@0
|
316
|
danielebarchiesi@0
|
317 // Built-in roles.
|
danielebarchiesi@0
|
318 $rid_anonymous = db_insert('role')
|
danielebarchiesi@0
|
319 ->fields(array('name' => 'anonymous user', 'weight' => 0))
|
danielebarchiesi@0
|
320 ->execute();
|
danielebarchiesi@0
|
321 $rid_authenticated = db_insert('role')
|
danielebarchiesi@0
|
322 ->fields(array('name' => 'authenticated user', 'weight' => 1))
|
danielebarchiesi@0
|
323 ->execute();
|
danielebarchiesi@0
|
324
|
danielebarchiesi@0
|
325 // Sanity check to ensure the anonymous and authenticated role IDs are the
|
danielebarchiesi@0
|
326 // same as the drupal defined constants. In certain situations, this will
|
danielebarchiesi@0
|
327 // not be true.
|
danielebarchiesi@0
|
328 if ($rid_anonymous != DRUPAL_ANONYMOUS_RID) {
|
danielebarchiesi@0
|
329 db_update('role')
|
danielebarchiesi@0
|
330 ->fields(array('rid' => DRUPAL_ANONYMOUS_RID))
|
danielebarchiesi@0
|
331 ->condition('rid', $rid_anonymous)
|
danielebarchiesi@0
|
332 ->execute();
|
danielebarchiesi@0
|
333 }
|
danielebarchiesi@0
|
334 if ($rid_authenticated != DRUPAL_AUTHENTICATED_RID) {
|
danielebarchiesi@0
|
335 db_update('role')
|
danielebarchiesi@0
|
336 ->fields(array('rid' => DRUPAL_AUTHENTICATED_RID))
|
danielebarchiesi@0
|
337 ->condition('rid', $rid_authenticated)
|
danielebarchiesi@0
|
338 ->execute();
|
danielebarchiesi@0
|
339 }
|
danielebarchiesi@0
|
340 }
|
danielebarchiesi@0
|
341
|
danielebarchiesi@0
|
342 /**
|
danielebarchiesi@0
|
343 * Implements hook_update_dependencies().
|
danielebarchiesi@0
|
344 */
|
danielebarchiesi@0
|
345 function user_update_dependencies() {
|
danielebarchiesi@0
|
346 // user_update_7006() updates data in the {role_permission} table, so it must
|
danielebarchiesi@0
|
347 // run after system_update_7007(), which populates that table.
|
danielebarchiesi@0
|
348 $dependencies['user'][7006] = array(
|
danielebarchiesi@0
|
349 'system' => 7007,
|
danielebarchiesi@0
|
350 );
|
danielebarchiesi@0
|
351
|
danielebarchiesi@0
|
352 // user_update_7010() needs to query the {filter_format} table to get a list
|
danielebarchiesi@0
|
353 // of existing text formats, so it must run after filter_update_7000(), which
|
danielebarchiesi@0
|
354 // creates that table.
|
danielebarchiesi@0
|
355 $dependencies['user'][7010] = array(
|
danielebarchiesi@0
|
356 'filter' => 7000,
|
danielebarchiesi@0
|
357 );
|
danielebarchiesi@0
|
358
|
danielebarchiesi@0
|
359 // user_update_7012() uses the file API, which relies on the {file_managed}
|
danielebarchiesi@0
|
360 // table, so it must run after system_update_7034(), which creates that
|
danielebarchiesi@0
|
361 // table.
|
danielebarchiesi@0
|
362 $dependencies['user'][7012] = array(
|
danielebarchiesi@0
|
363 'system' => 7034,
|
danielebarchiesi@0
|
364 );
|
danielebarchiesi@0
|
365
|
danielebarchiesi@0
|
366 // user_update_7013() uses the file usage API, which relies on the
|
danielebarchiesi@0
|
367 // {file_usage} table, so it must run after system_update_7059(), which
|
danielebarchiesi@0
|
368 // creates that table.
|
danielebarchiesi@0
|
369 $dependencies['user'][7013] = array(
|
danielebarchiesi@0
|
370 'system' => 7059,
|
danielebarchiesi@0
|
371 );
|
danielebarchiesi@0
|
372
|
danielebarchiesi@0
|
373 return $dependencies;
|
danielebarchiesi@0
|
374 }
|
danielebarchiesi@0
|
375
|
danielebarchiesi@0
|
376 /**
|
danielebarchiesi@0
|
377 * Utility function: grant a set of permissions to a role during update.
|
danielebarchiesi@0
|
378 *
|
danielebarchiesi@0
|
379 * This function is valid for a database schema version 7000.
|
danielebarchiesi@0
|
380 *
|
danielebarchiesi@0
|
381 * @param $rid
|
danielebarchiesi@0
|
382 * The role ID.
|
danielebarchiesi@0
|
383 * @param $permissions
|
danielebarchiesi@0
|
384 * An array of permissions names.
|
danielebarchiesi@0
|
385 * @param $module
|
danielebarchiesi@0
|
386 * The name of the module defining the permissions.
|
danielebarchiesi@0
|
387 * @ingroup update_api
|
danielebarchiesi@0
|
388 */
|
danielebarchiesi@0
|
389 function _update_7000_user_role_grant_permissions($rid, array $permissions, $module) {
|
danielebarchiesi@0
|
390 // Grant new permissions for the role.
|
danielebarchiesi@0
|
391 foreach ($permissions as $name) {
|
danielebarchiesi@0
|
392 db_merge('role_permission')
|
danielebarchiesi@0
|
393 ->key(array(
|
danielebarchiesi@0
|
394 'rid' => $rid,
|
danielebarchiesi@0
|
395 'permission' => $name,
|
danielebarchiesi@0
|
396 ))
|
danielebarchiesi@0
|
397 ->fields(array(
|
danielebarchiesi@0
|
398 'module' => $module,
|
danielebarchiesi@0
|
399 ))
|
danielebarchiesi@0
|
400 ->execute();
|
danielebarchiesi@0
|
401 }
|
danielebarchiesi@0
|
402 }
|
danielebarchiesi@0
|
403
|
danielebarchiesi@0
|
404 /**
|
danielebarchiesi@0
|
405 * @addtogroup updates-6.x-to-7.x
|
danielebarchiesi@0
|
406 * @{
|
danielebarchiesi@0
|
407 */
|
danielebarchiesi@0
|
408
|
danielebarchiesi@0
|
409 /**
|
danielebarchiesi@0
|
410 * Increase the length of the password field to accommodate better hashes.
|
danielebarchiesi@0
|
411 *
|
danielebarchiesi@0
|
412 * Also re-hashes all current passwords to improve security. This may be a
|
danielebarchiesi@0
|
413 * lengthy process, and is performed batch-wise.
|
danielebarchiesi@0
|
414 */
|
danielebarchiesi@0
|
415 function user_update_7000(&$sandbox) {
|
danielebarchiesi@0
|
416 $sandbox['#finished'] = 0;
|
danielebarchiesi@0
|
417 // Lower than DRUPAL_HASH_COUNT to make the update run at a reasonable speed.
|
danielebarchiesi@0
|
418 $hash_count_log2 = 11;
|
danielebarchiesi@0
|
419 // Multi-part update.
|
danielebarchiesi@0
|
420 if (!isset($sandbox['user_from'])) {
|
danielebarchiesi@0
|
421 db_change_field('users', 'pass', 'pass', array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''));
|
danielebarchiesi@0
|
422 $sandbox['user_from'] = 0;
|
danielebarchiesi@0
|
423 $sandbox['user_count'] = db_query("SELECT COUNT(uid) FROM {users}")->fetchField();
|
danielebarchiesi@0
|
424 }
|
danielebarchiesi@0
|
425 else {
|
danielebarchiesi@0
|
426 require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
|
danielebarchiesi@0
|
427 // Hash again all current hashed passwords.
|
danielebarchiesi@0
|
428 $has_rows = FALSE;
|
danielebarchiesi@0
|
429 // Update this many per page load.
|
danielebarchiesi@0
|
430 $count = 1000;
|
danielebarchiesi@0
|
431 $result = db_query_range("SELECT uid, pass FROM {users} WHERE uid > 0 ORDER BY uid", $sandbox['user_from'], $count);
|
danielebarchiesi@0
|
432 foreach ($result as $account) {
|
danielebarchiesi@0
|
433 $has_rows = TRUE;
|
danielebarchiesi@0
|
434
|
danielebarchiesi@0
|
435 // If the $account->pass value is not a MD5 hash (a 32 character
|
danielebarchiesi@0
|
436 // hexadecimal string) then skip it.
|
danielebarchiesi@0
|
437 if (!preg_match('/^[0-9a-f]{32}$/', $account->pass)) {
|
danielebarchiesi@0
|
438 continue;
|
danielebarchiesi@0
|
439 }
|
danielebarchiesi@0
|
440
|
danielebarchiesi@0
|
441 $new_hash = user_hash_password($account->pass, $hash_count_log2);
|
danielebarchiesi@0
|
442 if ($new_hash) {
|
danielebarchiesi@0
|
443 // Indicate an updated password.
|
danielebarchiesi@0
|
444 $new_hash = 'U' . $new_hash;
|
danielebarchiesi@0
|
445 db_update('users')
|
danielebarchiesi@0
|
446 ->fields(array('pass' => $new_hash))
|
danielebarchiesi@0
|
447 ->condition('uid', $account->uid)
|
danielebarchiesi@0
|
448 ->execute();
|
danielebarchiesi@0
|
449 }
|
danielebarchiesi@0
|
450 }
|
danielebarchiesi@0
|
451 $sandbox['#finished'] = $sandbox['user_from']/$sandbox['user_count'];
|
danielebarchiesi@0
|
452 $sandbox['user_from'] += $count;
|
danielebarchiesi@0
|
453 if (!$has_rows) {
|
danielebarchiesi@0
|
454 $sandbox['#finished'] = 1;
|
danielebarchiesi@0
|
455 return t('User passwords rehashed to improve security');
|
danielebarchiesi@0
|
456 }
|
danielebarchiesi@0
|
457 }
|
danielebarchiesi@0
|
458 }
|
danielebarchiesi@0
|
459
|
danielebarchiesi@0
|
460 /**
|
danielebarchiesi@0
|
461 * Remove the 'threshold', 'mode' and 'sort' columns from the {users} table.
|
danielebarchiesi@0
|
462 *
|
danielebarchiesi@0
|
463 * These fields were previously used to store per-user comment settings.
|
danielebarchiesi@0
|
464 */
|
danielebarchiesi@0
|
465
|
danielebarchiesi@0
|
466 function user_update_7001() {
|
danielebarchiesi@0
|
467 db_drop_field('users', 'threshold');
|
danielebarchiesi@0
|
468 db_drop_field('users', 'mode');
|
danielebarchiesi@0
|
469 db_drop_field('users', 'sort');
|
danielebarchiesi@0
|
470 }
|
danielebarchiesi@0
|
471
|
danielebarchiesi@0
|
472 /**
|
danielebarchiesi@0
|
473 * Convert user time zones from time zone offsets to time zone names.
|
danielebarchiesi@0
|
474 */
|
danielebarchiesi@0
|
475 function user_update_7002(&$sandbox) {
|
danielebarchiesi@0
|
476 $sandbox['#finished'] = 0;
|
danielebarchiesi@0
|
477
|
danielebarchiesi@0
|
478 // Multi-part update.
|
danielebarchiesi@0
|
479 if (!isset($sandbox['user_from'])) {
|
danielebarchiesi@0
|
480 db_change_field('users', 'timezone', 'timezone', array('type' => 'varchar', 'length' => 32, 'not null' => FALSE));
|
danielebarchiesi@0
|
481 $sandbox['user_from'] = 0;
|
danielebarchiesi@0
|
482 $sandbox['user_count'] = db_query("SELECT COUNT(uid) FROM {users}")->fetchField();
|
danielebarchiesi@0
|
483 $sandbox['user_not_migrated'] = 0;
|
danielebarchiesi@0
|
484 }
|
danielebarchiesi@0
|
485 else {
|
danielebarchiesi@0
|
486 $timezones = system_time_zones();
|
danielebarchiesi@0
|
487 // Update this many per page load.
|
danielebarchiesi@0
|
488 $count = 10000;
|
danielebarchiesi@0
|
489 $contributed_date_module = db_field_exists('users', 'timezone_name');
|
danielebarchiesi@0
|
490 $contributed_event_module = db_field_exists('users', 'timezone_id');
|
danielebarchiesi@0
|
491
|
danielebarchiesi@0
|
492 $results = db_query_range("SELECT uid FROM {users} ORDER BY uid", $sandbox['user_from'], $count);
|
danielebarchiesi@0
|
493 foreach ($results as $account) {
|
danielebarchiesi@0
|
494 $timezone = NULL;
|
danielebarchiesi@0
|
495 // If the contributed Date module has created a users.timezone_name
|
danielebarchiesi@0
|
496 // column, use this data to set each user's time zone.
|
danielebarchiesi@0
|
497 if ($contributed_date_module) {
|
danielebarchiesi@0
|
498 $date_timezone = db_query("SELECT timezone_name FROM {users} WHERE uid = :uid", array(':uid' => $account->uid))->fetchField();
|
danielebarchiesi@0
|
499 if (isset($timezones[$date_timezone])) {
|
danielebarchiesi@0
|
500 $timezone = $date_timezone;
|
danielebarchiesi@0
|
501 }
|
danielebarchiesi@0
|
502 }
|
danielebarchiesi@0
|
503 // If the contributed Event module has stored user time zone information
|
danielebarchiesi@0
|
504 // use that information to update the user accounts.
|
danielebarchiesi@0
|
505 if (!$timezone && $contributed_event_module) {
|
danielebarchiesi@0
|
506 try {
|
danielebarchiesi@0
|
507 $event_timezone = db_query("SELECT t.name FROM {users} u LEFT JOIN {event_timezones} t ON u.timezone_id = t.timezone WHERE u.uid = :uid", array(':uid' => $account->uid))->fetchField();
|
danielebarchiesi@0
|
508 $event_timezone = str_replace(' ', '_', $event_timezone);
|
danielebarchiesi@0
|
509 if (isset($timezones[$event_timezone])) {
|
danielebarchiesi@0
|
510 $timezone = $event_timezone;
|
danielebarchiesi@0
|
511 }
|
danielebarchiesi@0
|
512 }
|
danielebarchiesi@0
|
513 catch (PDOException $e) {
|
danielebarchiesi@0
|
514 // Ignore error if event_timezones table does not exist or unexpected
|
danielebarchiesi@0
|
515 // schema found.
|
danielebarchiesi@0
|
516 }
|
danielebarchiesi@0
|
517 }
|
danielebarchiesi@0
|
518 if ($timezone) {
|
danielebarchiesi@0
|
519 db_update('users')
|
danielebarchiesi@0
|
520 ->fields(array('timezone' => $timezone))
|
danielebarchiesi@0
|
521 ->condition('uid', $account->uid)
|
danielebarchiesi@0
|
522 ->execute();
|
danielebarchiesi@0
|
523 }
|
danielebarchiesi@0
|
524 else {
|
danielebarchiesi@0
|
525 $sandbox['user_not_migrated']++;
|
danielebarchiesi@0
|
526 db_update('users')
|
danielebarchiesi@0
|
527 ->fields(array('timezone' => NULL))
|
danielebarchiesi@0
|
528 ->condition('uid', $account->uid)
|
danielebarchiesi@0
|
529 ->execute();
|
danielebarchiesi@0
|
530 }
|
danielebarchiesi@0
|
531 $sandbox['user_from']++;
|
danielebarchiesi@0
|
532 }
|
danielebarchiesi@0
|
533
|
danielebarchiesi@0
|
534 $sandbox['#finished'] = $sandbox['user_from'] / $sandbox['user_count'];
|
danielebarchiesi@0
|
535 if ($sandbox['user_from'] == $sandbox['user_count']) {
|
danielebarchiesi@0
|
536 if ($sandbox['user_not_migrated'] > 0) {
|
danielebarchiesi@0
|
537 variable_set('empty_timezone_message', 1);
|
danielebarchiesi@0
|
538 drupal_set_message(format_string('Some user time zones have been emptied and need to be set to the correct values. Use the new <a href="@config-url">time zone options</a> to choose whether to remind users at login to set the correct time zone.', array('@config-url' => url('admin/config/regional/settings'))), 'warning');
|
danielebarchiesi@0
|
539 }
|
danielebarchiesi@0
|
540 return t('Migrated user time zones');
|
danielebarchiesi@0
|
541 }
|
danielebarchiesi@0
|
542 }
|
danielebarchiesi@0
|
543 }
|
danielebarchiesi@0
|
544
|
danielebarchiesi@0
|
545 /**
|
danielebarchiesi@0
|
546 * Update user settings for cancelling user accounts.
|
danielebarchiesi@0
|
547 *
|
danielebarchiesi@0
|
548 * Prior to 7.x, users were not able to cancel their accounts. When
|
danielebarchiesi@0
|
549 * administrators deleted an account, all contents were assigned to uid 0,
|
danielebarchiesi@0
|
550 * which is the same as the 'user_cancel_reassign' method now.
|
danielebarchiesi@0
|
551 */
|
danielebarchiesi@0
|
552 function user_update_7003() {
|
danielebarchiesi@0
|
553 // Set the default account cancellation method.
|
danielebarchiesi@0
|
554 variable_set('user_cancel_method', 'user_cancel_reassign');
|
danielebarchiesi@0
|
555 // Re-assign notification setting.
|
danielebarchiesi@0
|
556 if ($setting = variable_get('user_mail_status_deleted_notify', FALSE)) {
|
danielebarchiesi@0
|
557 variable_set('user_mail_status_canceled_notify', $setting);
|
danielebarchiesi@0
|
558 variable_del('user_mail_status_deleted_notify');
|
danielebarchiesi@0
|
559 }
|
danielebarchiesi@0
|
560 // Re-assign "Account deleted" mail strings to "Account canceled" mail.
|
danielebarchiesi@0
|
561 if ($setting = variable_get('user_mail_status_deleted_subject', FALSE)) {
|
danielebarchiesi@0
|
562 variable_set('user_mail_status_canceled_subject', $setting);
|
danielebarchiesi@0
|
563 variable_del('user_mail_status_deleted_subject');
|
danielebarchiesi@0
|
564 }
|
danielebarchiesi@0
|
565 if ($setting = variable_get('user_mail_status_deleted_body', FALSE)) {
|
danielebarchiesi@0
|
566 variable_set('user_mail_status_canceled_body', $setting);
|
danielebarchiesi@0
|
567 variable_del('user_mail_status_deleted_body');
|
danielebarchiesi@0
|
568 }
|
danielebarchiesi@0
|
569 }
|
danielebarchiesi@0
|
570
|
danielebarchiesi@0
|
571 /**
|
danielebarchiesi@0
|
572 * Changes the users table to allow longer e-mail addresses.
|
danielebarchiesi@0
|
573 */
|
danielebarchiesi@0
|
574 function user_update_7005(&$sandbox) {
|
danielebarchiesi@0
|
575 $mail_field = array(
|
danielebarchiesi@0
|
576 'type' => 'varchar',
|
danielebarchiesi@0
|
577 'length' => 254,
|
danielebarchiesi@0
|
578 'not null' => FALSE,
|
danielebarchiesi@0
|
579 'default' => '',
|
danielebarchiesi@0
|
580 'description' => "User's e-mail address.",
|
danielebarchiesi@0
|
581 );
|
danielebarchiesi@0
|
582 $init_field = array(
|
danielebarchiesi@0
|
583 'type' => 'varchar',
|
danielebarchiesi@0
|
584 'length' => 254,
|
danielebarchiesi@0
|
585 'not null' => FALSE,
|
danielebarchiesi@0
|
586 'default' => '',
|
danielebarchiesi@0
|
587 'description' => 'E-mail address used for initial account creation.',
|
danielebarchiesi@0
|
588 );
|
danielebarchiesi@0
|
589 db_drop_index('users', 'mail');
|
danielebarchiesi@0
|
590 db_change_field('users', 'mail', 'mail', $mail_field, array('indexes' => array('mail' => array('mail'))));
|
danielebarchiesi@0
|
591 db_change_field('users', 'init', 'init', $init_field);
|
danielebarchiesi@0
|
592 }
|
danielebarchiesi@0
|
593
|
danielebarchiesi@0
|
594 /**
|
danielebarchiesi@0
|
595 * Add module data to {role_permission}.
|
danielebarchiesi@0
|
596 */
|
danielebarchiesi@0
|
597 function user_update_7006(&$sandbox) {
|
danielebarchiesi@0
|
598 $module_field = array(
|
danielebarchiesi@0
|
599 'type' => 'varchar',
|
danielebarchiesi@0
|
600 'length' => 255,
|
danielebarchiesi@0
|
601 'not null' => TRUE,
|
danielebarchiesi@0
|
602 'default' => '',
|
danielebarchiesi@0
|
603 'description' => "The module declaring the permission.",
|
danielebarchiesi@0
|
604 );
|
danielebarchiesi@0
|
605 // Check that the field hasn't been updated in an aborted run of this
|
danielebarchiesi@0
|
606 // update.
|
danielebarchiesi@0
|
607 if (!db_field_exists('role_permission', 'module')) {
|
danielebarchiesi@0
|
608 // Add a new field for the fid.
|
danielebarchiesi@0
|
609 db_add_field('role_permission', 'module', $module_field);
|
danielebarchiesi@0
|
610 }
|
danielebarchiesi@0
|
611 }
|
danielebarchiesi@0
|
612
|
danielebarchiesi@0
|
613 /**
|
danielebarchiesi@0
|
614 * Add a weight column to user roles.
|
danielebarchiesi@0
|
615 */
|
danielebarchiesi@0
|
616 function user_update_7007() {
|
danielebarchiesi@0
|
617 db_add_field('role', 'weight', array('type' => 'int', 'not null' => TRUE, 'default' => 0));
|
danielebarchiesi@0
|
618 db_add_index('role', 'name_weight', array('name', 'weight'));
|
danielebarchiesi@0
|
619 }
|
danielebarchiesi@0
|
620
|
danielebarchiesi@0
|
621 /**
|
danielebarchiesi@0
|
622 * If 'user_register' variable was unset in Drupal 6, set it to be the same as
|
danielebarchiesi@0
|
623 * the Drupal 6 default setting.
|
danielebarchiesi@0
|
624 */
|
danielebarchiesi@0
|
625 function user_update_7008() {
|
danielebarchiesi@0
|
626 if (!isset($GLOBALS['conf']['user_register'])) {
|
danielebarchiesi@0
|
627 // Set to the Drupal 6 default, "visitors can create accounts".
|
danielebarchiesi@0
|
628 variable_set('user_register', USER_REGISTER_VISITORS);
|
danielebarchiesi@0
|
629 }
|
danielebarchiesi@0
|
630 }
|
danielebarchiesi@0
|
631
|
danielebarchiesi@0
|
632 /**
|
danielebarchiesi@0
|
633 * Converts fields that store serialized variables from text to blob.
|
danielebarchiesi@0
|
634 */
|
danielebarchiesi@0
|
635 function user_update_7009() {
|
danielebarchiesi@0
|
636 $spec = array(
|
danielebarchiesi@0
|
637 'type' => 'blob',
|
danielebarchiesi@0
|
638 'not null' => FALSE,
|
danielebarchiesi@0
|
639 'size' => 'big',
|
danielebarchiesi@0
|
640 'serialize' => TRUE,
|
danielebarchiesi@0
|
641 'description' => 'A serialized array of name value pairs that are related to the user. Any form values posted during user edit are stored and are loaded into the $user object during user_load(). Use of this field is discouraged and it will likely disappear in a future version of Drupal.',
|
danielebarchiesi@0
|
642 );
|
danielebarchiesi@0
|
643 db_change_field('users', 'data', 'data', $spec);
|
danielebarchiesi@0
|
644 }
|
danielebarchiesi@0
|
645
|
danielebarchiesi@0
|
646 /**
|
danielebarchiesi@0
|
647 * Update the {user}.signature_format column.
|
danielebarchiesi@0
|
648 */
|
danielebarchiesi@0
|
649 function user_update_7010() {
|
danielebarchiesi@0
|
650 // Update the database column to allow NULL values.
|
danielebarchiesi@0
|
651 db_change_field('users', 'signature_format', 'signature_format', array(
|
danielebarchiesi@0
|
652 'type' => 'int',
|
danielebarchiesi@0
|
653 'unsigned' => TRUE,
|
danielebarchiesi@0
|
654 'not null' => FALSE,
|
danielebarchiesi@0
|
655 'description' => 'The {filter_format}.format of the signature.',
|
danielebarchiesi@0
|
656 ));
|
danielebarchiesi@0
|
657
|
danielebarchiesi@0
|
658 // Replace the signature format with NULL if the signature is empty and does
|
danielebarchiesi@0
|
659 // not already have a stored text format.
|
danielebarchiesi@0
|
660 //
|
danielebarchiesi@0
|
661 // In Drupal 6, "0" (the former FILTER_FORMAT_DEFAULT constant) could be used
|
danielebarchiesi@0
|
662 // to indicate this situation, but in Drupal 7, only NULL is supported. This
|
danielebarchiesi@0
|
663 // update therefore preserves the ability of user accounts which were never
|
danielebarchiesi@0
|
664 // given a signature (for example, if the site did not have user signatures
|
danielebarchiesi@0
|
665 // enabled, or if the user never edited their account information) to not
|
danielebarchiesi@0
|
666 // have a particular text format assumed for them the first time the
|
danielebarchiesi@0
|
667 // signature is edited.
|
danielebarchiesi@0
|
668 db_update('users')
|
danielebarchiesi@0
|
669 ->fields(array('signature_format' => NULL))
|
danielebarchiesi@0
|
670 ->condition('signature', '')
|
danielebarchiesi@0
|
671 ->condition('signature_format', 0)
|
danielebarchiesi@0
|
672 ->execute();
|
danielebarchiesi@0
|
673
|
danielebarchiesi@0
|
674 // There are a number of situations in which a Drupal 6 site could store
|
danielebarchiesi@0
|
675 // content with a nonexistent text format. This includes text formats that
|
danielebarchiesi@0
|
676 // had later been deleted, or non-empty content stored with a value of "0"
|
danielebarchiesi@0
|
677 // (the former FILTER_FORMAT_DEFAULT constant). Drupal 6 would filter this
|
danielebarchiesi@0
|
678 // content using whatever the site-wide default text format was at the moment
|
danielebarchiesi@0
|
679 // the text was being displayed.
|
danielebarchiesi@0
|
680 //
|
danielebarchiesi@0
|
681 // In Drupal 7, this behavior is no longer supported, and all content must be
|
danielebarchiesi@0
|
682 // stored with an explicit text format (or it will not be displayed when it
|
danielebarchiesi@0
|
683 // is filtered). Therefore, to preserve the behavior of the site after the
|
danielebarchiesi@0
|
684 // upgrade, we must replace all instances described above with the current
|
danielebarchiesi@0
|
685 // value of the (old) site-wide default format at the moment of the upgrade.
|
danielebarchiesi@0
|
686 $existing_formats = db_query("SELECT format FROM {filter_format}")->fetchCol();
|
danielebarchiesi@0
|
687 $default_format = variable_get('filter_default_format', 1);
|
danielebarchiesi@0
|
688 db_update('users')
|
danielebarchiesi@0
|
689 ->fields(array('signature_format' => $default_format))
|
danielebarchiesi@0
|
690 ->isNotNull('signature_format')
|
danielebarchiesi@0
|
691 ->condition('signature_format', $existing_formats, 'NOT IN')
|
danielebarchiesi@0
|
692 ->execute();
|
danielebarchiesi@0
|
693 }
|
danielebarchiesi@0
|
694
|
danielebarchiesi@0
|
695 /**
|
danielebarchiesi@0
|
696 * Placeholder function.
|
danielebarchiesi@0
|
697 *
|
danielebarchiesi@0
|
698 * As a fix for user_update_7011() not updating email templates to use the new
|
danielebarchiesi@0
|
699 * tokens, user_update_7017() now targets email templates of Drupal 6 sites and
|
danielebarchiesi@0
|
700 * already upgraded sites.
|
danielebarchiesi@0
|
701 */
|
danielebarchiesi@0
|
702 function user_update_7011() {
|
danielebarchiesi@0
|
703 }
|
danielebarchiesi@0
|
704
|
danielebarchiesi@0
|
705 /**
|
danielebarchiesi@0
|
706 * Add the user's pictures to the {file_managed} table and make them managed
|
danielebarchiesi@0
|
707 * files.
|
danielebarchiesi@0
|
708 */
|
danielebarchiesi@0
|
709 function user_update_7012(&$sandbox) {
|
danielebarchiesi@0
|
710
|
danielebarchiesi@0
|
711 $picture_field = array(
|
danielebarchiesi@0
|
712 'type' => 'int',
|
danielebarchiesi@0
|
713 'not null' => TRUE,
|
danielebarchiesi@0
|
714 'default' => 0,
|
danielebarchiesi@0
|
715 'description' => "Foreign key: {file_managed}.fid of user's picture.",
|
danielebarchiesi@0
|
716 );
|
danielebarchiesi@0
|
717
|
danielebarchiesi@0
|
718 if (!isset($sandbox['progress'])) {
|
danielebarchiesi@0
|
719 // Check that the field hasn't been updated in an aborted run of this
|
danielebarchiesi@0
|
720 // update.
|
danielebarchiesi@0
|
721 if (!db_field_exists('users', 'picture_fid')) {
|
danielebarchiesi@0
|
722 // Add a new field for the fid.
|
danielebarchiesi@0
|
723 db_add_field('users', 'picture_fid', $picture_field);
|
danielebarchiesi@0
|
724 }
|
danielebarchiesi@0
|
725
|
danielebarchiesi@0
|
726 // Initialize batch update information.
|
danielebarchiesi@0
|
727 $sandbox['progress'] = 0;
|
danielebarchiesi@0
|
728 $sandbox['last_user_processed'] = -1;
|
danielebarchiesi@0
|
729 $sandbox['max'] = db_query("SELECT COUNT(*) FROM {users} WHERE picture <> ''")->fetchField();
|
danielebarchiesi@0
|
730 }
|
danielebarchiesi@0
|
731
|
danielebarchiesi@0
|
732 // As a batch operation move the photos into the {file_managed} table and
|
danielebarchiesi@0
|
733 // update the {users} records.
|
danielebarchiesi@0
|
734 $limit = 500;
|
danielebarchiesi@0
|
735 $result = db_query_range("SELECT uid, picture FROM {users} WHERE picture <> '' AND uid > :uid ORDER BY uid", 0, $limit, array(':uid' => $sandbox['last_user_processed']));
|
danielebarchiesi@0
|
736 foreach ($result as $user) {
|
danielebarchiesi@0
|
737 // Don't bother adding files that don't exist.
|
danielebarchiesi@0
|
738 if (file_exists($user->picture)) {
|
danielebarchiesi@0
|
739
|
danielebarchiesi@0
|
740 // Check if the file already exists.
|
danielebarchiesi@0
|
741 $files = file_load_multiple(array(), array('uri' => $user->picture));
|
danielebarchiesi@0
|
742 if (count($files)) {
|
danielebarchiesi@0
|
743 $file = reset($files);
|
danielebarchiesi@0
|
744 }
|
danielebarchiesi@0
|
745 else {
|
danielebarchiesi@0
|
746 // Create a file object.
|
danielebarchiesi@0
|
747 $file = new stdClass();
|
danielebarchiesi@0
|
748 $file->uri = $user->picture;
|
danielebarchiesi@0
|
749 $file->filename = drupal_basename($file->uri);
|
danielebarchiesi@0
|
750 $file->filemime = file_get_mimetype($file->uri);
|
danielebarchiesi@0
|
751 $file->uid = $user->uid;
|
danielebarchiesi@0
|
752 $file->status = FILE_STATUS_PERMANENT;
|
danielebarchiesi@0
|
753 $file = file_save($file);
|
danielebarchiesi@0
|
754 }
|
danielebarchiesi@0
|
755
|
danielebarchiesi@0
|
756 db_update('users')
|
danielebarchiesi@0
|
757 ->fields(array('picture_fid' => $file->fid))
|
danielebarchiesi@0
|
758 ->condition('uid', $user->uid)
|
danielebarchiesi@0
|
759 ->execute();
|
danielebarchiesi@0
|
760 }
|
danielebarchiesi@0
|
761
|
danielebarchiesi@0
|
762 // Update our progress information for the batch update.
|
danielebarchiesi@0
|
763 $sandbox['progress']++;
|
danielebarchiesi@0
|
764 $sandbox['last_user_processed'] = $user->uid;
|
danielebarchiesi@0
|
765 }
|
danielebarchiesi@0
|
766
|
danielebarchiesi@0
|
767 // Indicate our current progress to the batch update system. If there's no
|
danielebarchiesi@0
|
768 // max value then there's nothing to update and we're finished.
|
danielebarchiesi@0
|
769 $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['progress'] / $sandbox['max']);
|
danielebarchiesi@0
|
770
|
danielebarchiesi@0
|
771 // When we're finished, drop the old picture field and rename the new one to
|
danielebarchiesi@0
|
772 // replace it.
|
danielebarchiesi@0
|
773 if (isset($sandbox['#finished']) && $sandbox['#finished'] == 1) {
|
danielebarchiesi@0
|
774 db_drop_field('users', 'picture');
|
danielebarchiesi@0
|
775 db_change_field('users', 'picture_fid', 'picture', $picture_field);
|
danielebarchiesi@0
|
776 }
|
danielebarchiesi@0
|
777 }
|
danielebarchiesi@0
|
778
|
danielebarchiesi@0
|
779 /**
|
danielebarchiesi@0
|
780 * Add user module file usage entries.
|
danielebarchiesi@0
|
781 */
|
danielebarchiesi@0
|
782 function user_update_7013(&$sandbox) {
|
danielebarchiesi@0
|
783 if (!isset($sandbox['progress'])) {
|
danielebarchiesi@0
|
784 // Initialize batch update information.
|
danielebarchiesi@0
|
785 $sandbox['progress'] = 0;
|
danielebarchiesi@0
|
786 $sandbox['last_uid_processed'] = -1;
|
danielebarchiesi@0
|
787 $sandbox['max'] = db_query("SELECT COUNT(*) FROM {users} u WHERE u.picture <> 0")->fetchField();
|
danielebarchiesi@0
|
788 }
|
danielebarchiesi@0
|
789
|
danielebarchiesi@0
|
790 // Add usage entries for the user picture files.
|
danielebarchiesi@0
|
791 $limit = 500;
|
danielebarchiesi@0
|
792 $result = db_query_range('SELECT f.*, u.uid as user_uid FROM {users} u INNER JOIN {file_managed} f ON u.picture = f.fid WHERE u.picture <> 0 AND u.uid > :uid ORDER BY u.uid', 0, $limit, array(':uid' => $sandbox['last_uid_processed']))->fetchAllAssoc('fid', PDO::FETCH_ASSOC);
|
danielebarchiesi@0
|
793 foreach ($result as $row) {
|
danielebarchiesi@0
|
794 $uid = $row['user_uid'];
|
danielebarchiesi@0
|
795 $file = (object) $row;
|
danielebarchiesi@0
|
796 file_usage_add($file, 'user', 'user', $uid);
|
danielebarchiesi@0
|
797
|
danielebarchiesi@0
|
798 // Update our progress information for the batch update.
|
danielebarchiesi@0
|
799 $sandbox['progress']++;
|
danielebarchiesi@0
|
800 $sandbox['last_uid_processed'] = $uid;
|
danielebarchiesi@0
|
801 }
|
danielebarchiesi@0
|
802
|
danielebarchiesi@0
|
803 // Indicate our current progress to the batch update system.
|
danielebarchiesi@0
|
804 $sandbox['#finished'] = empty($sandbox['max']) || ($sandbox['progress'] / $sandbox['max']);
|
danielebarchiesi@0
|
805 }
|
danielebarchiesi@0
|
806
|
danielebarchiesi@0
|
807 /**
|
danielebarchiesi@0
|
808 * Rename the 'post comments without approval' permission.
|
danielebarchiesi@0
|
809 *
|
danielebarchiesi@0
|
810 * In Drupal 7, this permission has been renamed to 'skip comment approval'.
|
danielebarchiesi@0
|
811 */
|
danielebarchiesi@0
|
812 function user_update_7014() {
|
danielebarchiesi@0
|
813 db_update('role_permission')
|
danielebarchiesi@0
|
814 ->fields(array('permission' => 'skip comment approval'))
|
danielebarchiesi@0
|
815 ->condition('permission', 'post comments without approval')
|
danielebarchiesi@0
|
816 ->execute();
|
danielebarchiesi@0
|
817
|
danielebarchiesi@0
|
818 return t("Renamed the 'post comments without approval' permission to 'skip comment approval'.");
|
danielebarchiesi@0
|
819 }
|
danielebarchiesi@0
|
820
|
danielebarchiesi@0
|
821 /**
|
danielebarchiesi@0
|
822 * Change {users}.signature_format into varchar.
|
danielebarchiesi@0
|
823 */
|
danielebarchiesi@0
|
824 function user_update_7015() {
|
danielebarchiesi@0
|
825 db_change_field('users', 'signature_format', 'signature_format', array(
|
danielebarchiesi@0
|
826 'type' => 'varchar',
|
danielebarchiesi@0
|
827 'length' => 255,
|
danielebarchiesi@0
|
828 'not null' => FALSE,
|
danielebarchiesi@0
|
829 'description' => 'The {filter_format}.format of the signature.',
|
danielebarchiesi@0
|
830 ));
|
danielebarchiesi@0
|
831 }
|
danielebarchiesi@0
|
832
|
danielebarchiesi@0
|
833 /**
|
danielebarchiesi@0
|
834 * @} End of "addtogroup updates-6.x-to-7.x".
|
danielebarchiesi@0
|
835 */
|
danielebarchiesi@0
|
836
|
danielebarchiesi@0
|
837 /**
|
danielebarchiesi@0
|
838 * @addtogroup updates-7.x-extra
|
danielebarchiesi@0
|
839 * @{
|
danielebarchiesi@0
|
840 */
|
danielebarchiesi@0
|
841
|
danielebarchiesi@0
|
842 /**
|
danielebarchiesi@0
|
843 * Update the database to match the schema.
|
danielebarchiesi@0
|
844 */
|
danielebarchiesi@0
|
845 function user_update_7016() {
|
danielebarchiesi@0
|
846 // Add field default.
|
danielebarchiesi@0
|
847 db_change_field('users', 'uid', 'uid', array(
|
danielebarchiesi@0
|
848 'type' => 'int',
|
danielebarchiesi@0
|
849 'unsigned' => TRUE,
|
danielebarchiesi@0
|
850 'not null' => TRUE,
|
danielebarchiesi@0
|
851 'default' => 0,
|
danielebarchiesi@0
|
852 ));
|
danielebarchiesi@0
|
853 }
|
danielebarchiesi@0
|
854
|
danielebarchiesi@0
|
855 /**
|
danielebarchiesi@0
|
856 * Update email templates to use new tokens.
|
danielebarchiesi@0
|
857 *
|
danielebarchiesi@0
|
858 * This function upgrades customized email templates from the old !token format
|
danielebarchiesi@0
|
859 * to the new core tokens format. Additionally, in Drupal 7 we no longer e-mail
|
danielebarchiesi@0
|
860 * plain text passwords to users, and there is no token for a plain text
|
danielebarchiesi@0
|
861 * password in the new token system. Therefore, it also modifies any saved
|
danielebarchiesi@0
|
862 * templates using the old '!password' token such that the token is removed, and
|
danielebarchiesi@0
|
863 * displays a warning to users that they may need to go and modify the wording
|
danielebarchiesi@0
|
864 * of their templates.
|
danielebarchiesi@0
|
865 */
|
danielebarchiesi@0
|
866 function user_update_7017() {
|
danielebarchiesi@0
|
867 $message = '';
|
danielebarchiesi@0
|
868
|
danielebarchiesi@0
|
869 $tokens = array(
|
danielebarchiesi@0
|
870 '!site' => '[site:name]',
|
danielebarchiesi@0
|
871 '!username' => '[user:name]',
|
danielebarchiesi@0
|
872 '!mailto' => '[user:mail]',
|
danielebarchiesi@0
|
873 '!login_uri' => '[site:login-url]',
|
danielebarchiesi@0
|
874 '!uri_brief' => '[site:url-brief]',
|
danielebarchiesi@0
|
875 '!edit_uri' => '[user:edit-url]',
|
danielebarchiesi@0
|
876 '!login_url' => '[user:one-time-login-url]',
|
danielebarchiesi@0
|
877 '!uri' => '[site:url]',
|
danielebarchiesi@0
|
878 '!date' => '[date:medium]',
|
danielebarchiesi@0
|
879 '!password' => '',
|
danielebarchiesi@0
|
880 );
|
danielebarchiesi@0
|
881
|
danielebarchiesi@0
|
882 $result = db_select('variable', 'v')
|
danielebarchiesi@0
|
883 ->fields('v', array('name'))
|
danielebarchiesi@0
|
884 ->condition('name', db_like('user_mail_') . '%', 'LIKE')
|
danielebarchiesi@0
|
885 ->execute();
|
danielebarchiesi@0
|
886
|
danielebarchiesi@0
|
887 foreach ($result as $row) {
|
danielebarchiesi@0
|
888 // Use variable_get() to get the unserialized value for free.
|
danielebarchiesi@0
|
889 if ($value = variable_get($row->name, FALSE)) {
|
danielebarchiesi@0
|
890
|
danielebarchiesi@0
|
891 if (empty($message) && (strpos($value, '!password') !== FALSE)) {
|
danielebarchiesi@0
|
892 $message = t('The ability to send users their passwords in plain text has been removed in Drupal 7. Your existing email templates have been modified to remove it. You should <a href="@template-url">review these templates</a> to make sure they read properly.', array('@template-url' => url('admin/config/people/accounts')));
|
danielebarchiesi@0
|
893 }
|
danielebarchiesi@0
|
894
|
danielebarchiesi@0
|
895 variable_set($row->name, str_replace(array_keys($tokens), $tokens, $value));
|
danielebarchiesi@0
|
896 }
|
danielebarchiesi@0
|
897 }
|
danielebarchiesi@0
|
898
|
danielebarchiesi@0
|
899 return $message;
|
danielebarchiesi@0
|
900 }
|
danielebarchiesi@0
|
901
|
danielebarchiesi@0
|
902 /**
|
danielebarchiesi@0
|
903 * Ensure there is an index on {users}.picture.
|
danielebarchiesi@0
|
904 */
|
danielebarchiesi@0
|
905 function user_update_7018() {
|
danielebarchiesi@0
|
906 if (!db_index_exists('users', 'picture')) {
|
danielebarchiesi@0
|
907 db_add_index('users', 'picture', array('picture'));
|
danielebarchiesi@0
|
908 }
|
danielebarchiesi@0
|
909 }
|
danielebarchiesi@0
|
910
|
danielebarchiesi@0
|
911 /**
|
danielebarchiesi@0
|
912 * @} End of "addtogroup updates-7.x-extra".
|
danielebarchiesi@0
|
913 */
|