checkpoint
[plewww.git] / planetlab / persons / persons.php
1 <?php
2
3 // $Id: index.php 11645 2009-01-21 23:09:49Z thierry $
4
5 // Require login
6 require_once 'plc_login.php';
7
8 // Get session and API handles
9 require_once 'plc_session.php';
10 global $plc, $api;
11
12 // Print header
13 require_once 'plc_drupal.php';
14 // set default 
15 drupal_set_title('People');
16 include 'plc_header.php'; 
17
18 // Common functions
19 require_once 'plc_functions.php';
20 require_once 'plc_sorts.php';
21
22 //fix the memory limit for this page
23 ini_set("memory_limit","48M");
24
25 // find person roles
26 $_person= $plc->person;
27 $_roles= $_person['role_ids'];
28
29
30 ////////////////////
31 // The set of columns to fetch
32 // and the filter applied for fetching sites
33 if ( !in_array( '10', $_roles ) ) {
34   $columns = array("person_id", "first_name", "last_name", "email", "roles" , "peer_id");
35   // PIs can see users not yet enabled
36   if ( ! in_array ('20', $_roles) ) {
37     $filter = array ("enabled" => TRUE);
38   } else {
39     $filter = array();
40   }
41  } else {
42   $columns = array("person_id", "first_name", "last_name", "email", "roles" , "peer_id", "key_ids", "enabled","slice_ids" );
43   $filter = array ();
44  }
45
46 //////////////////
47 // perform post-processing on site objects as returned by GetSites
48 // performs sanity check and summarize the result in a single column
49 // performs in-place replacement, so passes a reference
50 function layout_person ($person) {
51
52   // we need the 'key_ids' field to do this
53   // so regular users wont run this
54   if ( ! array_key_exists ('key_ids', $person))
55     return $person ;
56     
57   $messages=array();
58   
59   // do all this stuff on local persons only
60   if ( $person['peer_id'] ) {
61     $class='plc-foreign';
62   } else {
63     $class='plc-warning';
64     // check that the person has keys, but dont do that for admins
65     if ( ! in_array ('admin',$person['roles']) && count($person['key_ids']) == 0)
66       $messages [] = "No Key";
67   }
68   if ( ! $person['enabled'] ) 
69     $messages[] = "Disabled";
70   // but always cleanup $person columns
71   unset ($person['key_ids']);
72   unset ($person['enabled']);
73   //detect tech already involved on some slices. 
74   if( ( count($person['roles'])==1 ) && ( in_array('tech',$person['roles']) )  && (! empty($person["slice_ids"])) ) {
75     $messages[]="Tech involved in a Slice";  
76   }
77   // cleanup $person columns
78   unset ($person['slice_ids']);
79   //display the extra status column
80   $person['status'] = plc_vertical_table($messages,$class);
81   return $person;
82 }
83
84 // if emailpattern or peerscope is set then search for Persons.
85 // we use GET rather than POST so paginate can display the right contents on subsequent pages
86 // can be useful for writing bookmarkable URL's as well
87 if( $_GET['emailpattern'] || $_GET['peerscope']) {
88   $emailpattern= $_GET['emailpattern'];
89    if (empty($emailpattern)) { 
90     $emailpattern="*";
91   }
92    $filter = array_merge (array( "email"=>$emailpattern ), $filter);
93    switch ($_GET['peerscope']) {
94    case '':
95      $peer_label="all peers";
96      break;
97    case 'local':
98      $filter=array_merge(array("peer_id"=>NULL),$filter);
99      $peer_label="local peer";
100      break;
101    case 'foreign':
102      $filter=array_merge(array("~peer_id"=>NULL),$filter);
103      $peer_label="foreign peers";
104      break;
105    default:
106     $peer_id=intval($_GET['peerscope']);
107     $filter=array_merge(array("peer_id"=>$peer_id),$filter);
108     $peer=$api->GetPeers(array("peer_id"=>$peer_id));
109     $peer_label='peer "' . $peer[0]['peername'] . '"';
110     break;
111    }
112    // need to use a hash filter for patterns to be properly handled
113   $persons= $api->GetPersons($filter , $columns );
114   $persons= array_map(layout_person,$persons);
115   $person_count = count ($persons);
116   if ( $person_count == 1) {
117     header( "location: index.php?id=". $persons[0]['person_id'] );
118     exit();
119   } else if ( $person_count == 0) {
120     echo "<span class='plc-warning'> No person whose email matches $emailpattern </span>";
121   } else {
122     drupal_set_title ("Users matching $emailpattern on ". $peer_label);
123     sort_persons ($persons);
124     echo paginate( $persons, "person_id", "Persons", 25, "email");
125   }
126  }
127 // if a site_id is given, display the site persons only
128 else if( $_GET['site_id'] ) {
129   $site_id= $_GET['site_id'];
130   // Get site info
131   $site_info= $api->GetSites( array( intval( $site_id ) ), array( "name", "person_ids" ) );
132   drupal_set_title("People with " . $site_info[0]['name']);
133   // Get site nodes
134   $persons= $api->GetPersons( array_merge (array("person_id"=>$site_info[0]['person_ids']),$filter), $columns );
135   $persons= array_map(layout_person,$persons);
136   sort_persons( $persons );
137
138   echo paginate( $persons, "person_id", "Persons", 25, "email" );
139
140 }
141 // if a slice_id is given,display the persons involved in this slice
142 else if( $_GET['slice_id'] ) {
143   $slice_id= $_GET['slice_id'];
144   // Get slice infos
145   $slice_info= $api->GetSlices( array( intval( $slice_id ) ), array( "name", "person_ids" ) );
146   drupal_set_title("People In " . $slice_info[0]['name']);
147   // Get slice persons
148   $persons= $api->GetPersons( array_merge (array("person_id"=>$slice_info[0]['person_ids']),$filter), $columns );
149   if ( empty ($persons) ) {
150     echo "No persons to display";
151   } else {
152
153   $persons= array_map(layout_person,$persons);
154   sort_persons( $persons );
155
156   echo paginate( $persons, "person_id", "Persons", 25, "email" );
157   echo "<br /><p><a href='/db/slices/index.php?id=".$slice_id.">Back to slice page</a></div>";  
158   }
159   
160  }
161 // if no person id, display list of persons to choose
162 elseif( !$_GET['id'] ) {
163
164   // GetPersons API call
165   $persons= $api->GetPersons( empty($filter) ? NULL : $filter, $columns );
166   $persons= array_map(layout_person,$persons);
167   sort_persons( $persons );
168
169   drupal_set_html_head('<script type="text/javascript" src="/planetlab/bsn/bsn.Ajax.js"></script>
170     <script type="text/javascript" src="/planetlab/bsn/bsn.DOM.js"></script>
171     <script type="text/javascript" src="/planetlab/bsn/bsn.AutoSuggest.js"></script>');
172
173   echo "<div>\n
174         <form method=get action='index.php'>\n";
175   //if( $emailpattern ) echo "<font color=red>'$emailpattern' is not a valid person email.</font>\n";
176   echo "<table><tr>\n
177 <th><label for='testinput'>Enter Person Email or pattern: : </label></th>\n
178 <td><input type='text' id='testinput' name='emailpattern' size=40 value='' /></td>\n
179 <td rowspan=2><input type=submit value='Select Person' /></td>\n
180 </tr> <tr>
181 <th><label for='peerscope'>Federation scope: </label></th>\n
182 <td><select id='peerscope' name='peerscope' onChange='submit()'>\n
183 ";
184     echo plc_peers_option_list($api);
185     echo "</select></td>\n
186 </tr></table></form></div>\n
187 <br />\n";
188   echo paginate( $persons, "person_id" , "Persons", 25, "email");
189   echo "<script type=\"text/javascript\">\n
190 var options = {\n
191         script:\"/planetlab/persons/test.php?\",\n
192         varname:\"input\",\n
193         minchars:1\n
194 };\n
195 var as = new AutoSuggest('testinput', options);\n
196 </script>\n";
197 }
198 else {
199   // get the person_id from the URL
200   $person_id= intval( $_GET['id'] );
201   // GetPersons API call for this person
202   $person_info= $api->GetPersons( array( $person_id ) );
203   if( empty( $person_info ) ) {
204     echo "No such person.";   
205   } else {
206     // vars from api
207     $first_name= $person_info[0]['first_name'];
208     $last_name= $person_info[0]['last_name'];
209     $title= $person_info[0]['title'];
210     $url= $person_info[0]['url'];
211     $phone= $person_info[0]['phone'];
212     $email= $person_info[0]['email'];
213     $enabled= $person_info[0]['enabled'];
214     $peer_id=$person_info[0]['peer_id'];
215     
216     // arrays from api
217     $role_ids= $person_info[0]['role_ids'];
218     $roles= $person_info[0]['roles'];
219     $site_ids= $person_info[0]['site_ids'];
220     $slice_ids= $person_info[0]['slice_ids'];
221     $key_ids= $person_info[0]['key_ids'];
222     
223     // gets more data from API calls
224     $site_info= $api->GetSites( $site_ids, array( "site_id", "name" ) );
225     $slice_info= $api->GetSlices( $slice_ids, array( "slice_id", "name" ) );
226     $key_info= $api->GetKeys( $key_ids );
227     
228     drupal_set_title("$first_name $last_name Account Information");
229
230     // start form
231     if ( ! $peer_id ) {
232       echo "<form action='/db/persons/person_actions.php' enctype='multipart/form-data'  method='post'>\n";
233     } else {
234       echo "<div class='plc-foreign'>";
235     }
236     echo "<input type=hidden name='person_id' value='$person_id'>\n";
237     
238     if ( ! $peer_id ) {
239       if( in_array( 10, $_roles ) || ( in_array( 20, $_roles ) && in_array( $site_ids[0], $_person['site_ids'] ) ) ) {
240         // list to take person action
241
242         echo "<table><tr><td>";
243
244         if (in_array( 10, $_roles )) {
245           echo plc_event_button("Person","person",$person_id); 
246           echo "</td><td>";
247         }
248
249         echo "<select name='actions' onChange=\"submit();\">\n";
250                         
251         $actions= array( ''=>'Choose Action', 'delete'=>"Delete $first_name" );
252         
253         if( $enabled == true )
254           $actions['disable']= "Disable $first_name";
255         else
256           $actions['enable']= "Enable $first_name";
257
258         if ( in_array(10,$_roles)) {
259             $actions['su'] = "Become $first_name";
260           }
261               
262         foreach( $actions as $key => $val ) {
263           echo "<option value='$key'";
264                 
265           if( $key == $_POST['actions'] )
266             echo " selected";
267                 
268           echo ">$val</option>\n";
269         }
270               
271         echo "</select>\n";
272
273         if( $enabled == false ) {
274           echo "</td><td>";
275           echo " &nbsp; <font color=red size=-1><- This user is not enabled. Choose here to enable or delete.</font>";
276         }
277         echo "</td></tr></table>";
278       }
279
280     } 
281         
282     // basic person info
283     echo "<hr />";
284     echo "<table border=0>\n";
285     echo "<tr><th>First Name: </th><td> $first_name</td></tr>\n";
286     echo "<tr><th>Last Name: </th><td> $last_name</td></tr>\n";
287     echo "<tr><th>Title: </th><td> $title</td></tr>\n";
288     echo "<tr><th>Email: </th><td><a href='mailto:$email'>$email</a></td></tr>\n";
289     echo "<tr><th>Phone: </th><td>$phone</td></tr>\n";
290     echo "<tr><th>URL: </th><td>$url</td></tr>\n";
291     echo "</table>\n";
292           
293     if( in_array( 10, $_roles ) || $_person['person_id'] == $person_id )
294       echo "<br /><a href='/db/persons/update.php?id=$person_id'>Update info</a>\n";
295           
296     echo "<hr />\n";
297                 
298     // keys
299     $can_manage_keys = ( ( ! $peer_id ) && (in_array( "10", $_roles ) || $person_id == $_person['person_id']));
300     echo "<h3>Keys</h3>\n";
301     if( !empty( $key_ids ) ) {
302       echo "<p><table border=0 width=450>\n";
303       echo "<thead><tr><th>Type</th><th>Key</th>";
304       if ( $can_manage_keys )
305         echo "<th>Remove</th>";
306       echo "</tr></thead><tbody>\n";
307                         
308       foreach( $key_info as $key ) {
309         $key_type= $key['key_type'];
310         $key_id= $key['key_id'];
311         $key_text= wordwrap( $key['key'], 70, "<br />\n", 1 );
312         echo "<tr><td>$key_type</td><td>$key_text";
313               
314         if ( $can_manage_keys ) 
315           echo "</td><td><input type=checkbox name='rem_key[]' value='$key_id'>";
316               
317         echo "</td></tr>\n";
318       }
319         
320       echo "</tbody></table>\n";
321       if ($can_manage_keys)
322         echo "<p><input type=submit name='Remove_keys' value='Remove keys'><br />\n";
323             
324     } else {
325       echo "<span class='plc-warning'> This user has no known key</span>";
326     }
327                 
328     if( $can_manage_keys ){
329       echo "<br /> Upload new key: <input type='file' name='key' size=30>\n
330         <input type='submit' name='Upload' value='Upload'>\n
331         <br /><hr />\n";
332     }
333     // sites
334     echo "<h3>Sites</h3>\n";
335     if( !empty( $site_info ) ) {
336       echo "<table cellpadding=3><tbody>\n";
337         
338       foreach( $site_info as $site ) {
339         $site_name= $site['name'];
340         $site_id= $site['site_id'];
341               
342         echo "<tr><td><a href='/db/sites/index.php?id=$site_id'>$site_name</a> </td><td> (<input type=checkbox name='rem_site[]' value='$site_id'> remove)</td></tr>\n";
343       }
344       echo "</tbody></table>\n";
345       echo "<input type=submit name='Remove_Sites' value='Remove Sites'>\n";
346         
347     } else {
348       echo "<span class='plc-warning'> This user is not affiliated with a site !!</span>";
349     }
350         
351     // diplay site select list to add another site for user
352     if( ! $peer_id && in_array( 10, $_roles ) ) {
353       // get site info
354       $full_site_info= $api->GetSites( NULL, array( "site_id", "name" ) );
355             
356       if( $site_info )
357         $person_site= arr_diff( $full_site_info, $site_info );
358       else
359         $person_site= $full_site_info;
360             
361       sort_sites( $person_site );
362             
363       echo "<p>Select a site to add this user to: ";
364       echo "<select name='site_add' onChange='submit()'>\n<option value=''>Choose a site to add:</option>\n";
365             
366       foreach( $person_site as $site ) {
367         echo "<option value=". $site['site_id'] .">". $site['name'] ."</option>\n";
368               
369       }
370             
371       echo "</select>";
372             
373     }
374     echo "<hr />\n";
375
376   // roles
377     echo "<h3>Roles</h3>\n";
378     echo "<p><table>\n";
379     echo "<thead><tr><th>Role</th>";
380     if( in_array( "10", $_roles ) )
381       echo "<th>Remove</th>";
382     echo "</tr></thead><tbody>\n";
383           
384     // construct role array
385     for( $n=0; $n<count($roles); $n++ ) {
386       $proles[]= array( 'role_id'=>$role_ids[$n], 'name'=>$roles[$n] );
387     }
388     
389     $button_shown=0;
390     if ( !empty ($roles) ) {
391       foreach( $proles as $role ) {
392         $role_name= $role['name'];
393         $role_id= $role['role_id'];
394               
395         echo "<tr><td>$role_name";
396               
397
398         if( in_array( 10, $_roles ) ) {
399           echo "</td><td><input type=checkbox name='rem_role[]' value='$role_id'>";
400           if ( ! $button_shown ) {
401             $rowspan=count($roles);
402             echo "</td><td rowspan=$rowspan valign=center><input type=submit name='Remove_Roles' value='Remove Roles'></td></tr>\n";
403             $button_shown=1;
404           }
405         }
406               
407         echo "</td></tr>\n";
408       }
409     } else {
410       echo "<span class='plc-warning'> This user has no known role !!</span>";
411     }
412     echo "</tbody></table>\n";
413           
414     // if admin show roles to add
415     if( in_array( 10, $_roles ) ) {
416       $all_roles= $api->GetRoles();
417       $addable_roles= arr_diff( $all_roles, $proles );
418       ##when the proles array is empty strangely the method arr_diff($all_roles, $proles )
419       ##return an empty array and the scrolling roles list is not displayed in this case
420       ##assign to addablerole all the roles
421       if (count($proles)==0)
422         $addable_roles=$all_roles;
423       
424       if( !empty( $addable_roles ) ) {
425         echo "<p>Add role: <select name='add_role' onChange='submit()'>\n<option value=''>Choose a Role to add:</option>\n";
426         
427         foreach( $addable_roles as $arole ) {
428           echo "<option value=". $arole['role_id'] .">". $arole['name'] ."</option>\n";
429                 
430         }
431               
432         echo "</select>\n";
433               
434       }
435     }
436           
437     echo "<hr />\n";
438           
439     // slices
440     echo "<h3>Slices</h3>\n";
441     if( !empty( $slice_info ) ) {
442             
443       foreach( $slice_info as $slice ) {
444         $slice_name= $slice['name'];
445         $slice_id= $slice['slice_id'];
446               
447         echo "<a href='/db/slices/index.php?id=$slice_id'>$slice_name</a><br />\n";
448       }
449             
450     } else {
451       echo "No slices found for that user";
452     }
453           
454     if ( ! $peer_id ) {
455       echo "</form>\n";
456     } else {
457       echo "</div>\n";
458     }
459           
460   }
461   if( $peer_id )
462     echo "<br /></div>";
463   
464   echo "<br /><hr /><p><a href='/db/persons/index.php'>Back to persons list</a></div>";
465   
466  }
467
468
469 // Print footer
470 include 'plc_footer.php';
471
472
473 ?>