| Line 124... |
Line 124... |
| 124 |
/** @var string[] $errors Contains errors that can occur */
|
124 |
/** @var string[] $errors Contains errors that can occur */
|
| 125 |
protected $errors = array();
|
125 |
protected $errors = array();
|
| 126 |
/** @var string[] $workingOn During administration, contains the record being modified */
|
126 |
/** @var string[] $workingOn During administration, contains the record being modified */
|
| 127 |
protected $workingOn = array();
|
127 |
protected $workingOn = array();
|
| 128 |
|
128 |
|
| - |
|
129 |
public function data() {
|
| - |
|
130 |
return $this->data;
|
| - |
|
131 |
}
|
| - |
|
132 |
|
| 129 |
/**
|
133 |
/**
|
| 130 |
* constructor for an instance of the class
|
134 |
* constructor for an instance of the class
|
| 131 |
*
|
135 |
*
|
| 132 |
* Anything in $customFields will be recursively merged with $configuration, overwriting
|
136 |
* Anything in $customFields will be recursively merged with $configuration, overwriting
|
| 133 |
* as necessary.
|
137 |
* as necessary.
|
| Line 220... |
Line 224... |
| 220 |
$this->data['id'] = $result['id'];
|
224 |
$this->data['id'] = $result['id'];
|
| 221 |
foreach ( $this->configuration['tables']['users']['fields'] as $key => $record ) {
|
225 |
foreach ( $this->configuration['tables']['users']['fields'] as $key => $record ) {
|
| 222 |
if ( $key != 'pass' )
|
226 |
if ( $key != 'pass' )
|
| 223 |
$this->data[$key] = $result[$key];
|
227 |
$this->data[$key] = $result[$key];
|
| 224 |
}
|
228 |
}
|
| - |
|
229 |
return true;
|
| 225 |
} else {
|
230 |
} else {
|
| 226 |
$this->errors[] = 'Login Failed: Unknown username or password';
|
231 |
$this->errors[] = 'Login Failed: Unknown username or password';
|
| 227 |
foreach ( $this->configuration['tables']['users']['fields'] as $key => $record ) {
|
232 |
foreach ( $this->configuration['tables']['users']['fields'] as $key => $record ) {
|
| 228 |
$this->data[$key] = null;
|
233 |
$this->data[$key] = null;
|
| 229 |
}
|
234 |
}
|
| - |
|
235 |
return false;
|
| 230 |
}
|
236 |
}
|
| 231 |
} // validate
|
237 |
} // validate
|
| 232 |
|
238 |
|
| 233 |
/**
|
239 |
/**
|
| 234 |
* Get all users from data source and put them in an HTML list
|
240 |
* Get all users from data source and put them in an HTML list
|
| Line 371... |
Line 377... |
| 371 |
*
|
377 |
*
|
| 372 |
* NOTE: this will not create the form; the form is created someplace else
|
378 |
* NOTE: this will not create the form; the form is created someplace else
|
| 373 |
*
|
379 |
*
|
| 374 |
* @return string HTML containing all of the INPUT records a user can edit
|
380 |
* @return string HTML containing all of the INPUT records a user can edit
|
| 375 |
*/
|
381 |
*/
|
| 376 |
public function editScreen() {
|
382 |
public function editScreen( $connection ) {
|
| 377 |
$return = array();
|
383 |
$return = array();
|
| 378 |
$return[] = $this->configuration['screens']['adminScreen'];
|
384 |
$return[] = $this->configuration['screens']['adminScreen'];
|
| 379 |
$return[] = "<input type='hidden' name='id' value=" . $this->workingOn['id'] . "'>\n";
|
385 |
$return[] = "<input type='hidden' name='id' value=" . $this->workingOn['id'] . "'>\n";
|
| 380 |
foreach ( $this->configuration['tables']['users']['fields'] as $field => $record ) {
|
386 |
foreach ( $this->configuration['tables']['users']['fields'] as $field => $record ) {
|
| 381 |
// if this field is restricted and we are not admin, just skip it
|
387 |
// if this field is restricted and we are not admin, just skip it
|
| Line 414... |
Line 420... |
| 414 |
} // else
|
420 |
} // else
|
| 415 |
} // foreach
|
421 |
} // foreach
|
| 416 |
return $new;
|
422 |
return $new;
|
| 417 |
}
|
423 |
}
|
| 418 |
|
424 |
|
| - |
|
425 |
protected function addEdit( $connection ) {
|
| - |
|
426 |
$data = array();
|
| - |
|
427 |
foreach ( $this->configuration['tables']['users']['fields'] as $field => $record ) {
|
| - |
|
428 |
// if this field is restricted it is our record, skip it
|
| - |
|
429 |
if ( isset( $record['restrict'] ) && ( $this->data['id'] == $this->workingOn['id'] ) )
|
| - |
|
430 |
continue;
|
| - |
|
431 |
$htmlFieldName = $this->configuration['input prefix'] . $field;
|
| - |
|
432 |
$temp = '';
|
| - |
|
433 |
switch ( $record['html type'] ) {
|
| - |
|
434 |
case 'password':
|
| - |
|
435 |
if ( ! empty( $_REQUEST[$htmlFieldName] ) ) {
|
| - |
|
436 |
$data[$field] = password_hash( $_REQUEST[$htmlFieldName], PASSWORD_DEFAULT );
|
| - |
|
437 |
if ( isset( $this->configuration['tables']['users']['fields']['last password change'] ) ) {
|
| - |
|
438 |
$data['last password change'] = date("YmdHis");
|
| - |
|
439 |
}
|
| - |
|
440 |
}
|
| - |
|
441 |
break;
|
| - |
|
442 |
case 'boolean' :
|
| - |
|
443 |
if ( $this->workingOn['id'] == -1 || ( isset( $_REQUEST[$htmlFieldName] ) != $this->workingOn[$field] ) ) {
|
| - |
|
444 |
$data[$field] = isset( $_REQUEST[$htmlFieldName] ) ? 1 : 0;
|
| - |
|
445 |
}
|
| - |
|
446 |
break;
|
| - |
|
447 |
default : // text, textarea, other things like this
|
| - |
|
448 |
if ( $this->workingOn['id'] == -1 || ( isset( $_REQUEST[$htmlFieldName] ) && $_REQUEST[$htmlFieldName] !== $this->workingOn[$field] ) ) {
|
| - |
|
449 |
$data[$field] = $_REQUEST[$htmlFieldName];
|
| - |
|
450 |
if ( isset( $record['filter'] ) && preg_match( $record['filter'], $data[$field] ) !== 1 ) {
|
| - |
|
451 |
$this->errors[] = sprintf( "Invalid characters in %s, %s", $record['label'], $record['instructions'] );
|
| - |
|
452 |
unset( $data[$field] );
|
| - |
|
453 |
}
|
| - |
|
454 |
}
|
| - |
|
455 |
break;
|
| - |
|
456 |
} // switch
|
| - |
|
457 |
} // foreach
|
| - |
|
458 |
if ( count($this->errors) ) { // we have some errors
|
| - |
|
459 |
$this->errors[] = 'Record not updated';
|
| - |
|
460 |
return 'Error';
|
| - |
|
461 |
}
|
| - |
|
462 |
if ( $data ) {
|
| - |
|
463 |
$data['id'] = $this->workingOn['id'];
|
| - |
|
464 |
$return = $connection->update( $data ) ? "Updated" : "Failed";
|
| - |
|
465 |
if ( $this->workingOn['id'] == $this->data['id'] ) // we just updated us, reload record
|
| - |
|
466 |
$this->data = $connection->getARecord( array( 'id' => $this->data['id'] ) );
|
| - |
|
467 |
} else {
|
| - |
|
468 |
$return = "No changes";
|
| - |
|
469 |
}
|
| - |
|
470 |
}
|
| - |
|
471 |
|
| - |
|
472 |
protected function initWorkingOn( $connection, $id ) {
|
| - |
|
473 |
if ( ! isset($id) ) {
|
| - |
|
474 |
// we're working on ourself
|
| - |
|
475 |
$this->workingOn = $this->data;
|
| - |
|
476 |
} elseif ( isset($id ) && $this->workingOn['id'] != $id ) {
|
| - |
|
477 |
// we're working on a different user
|
| - |
|
478 |
if ( $id == -1 ) { // we are adding a new user
|
| - |
|
479 |
$this->workingOn = $this->emptyWorkingOn();
|
| - |
|
480 |
} else { // this is an existing user
|
| - |
|
481 |
$this->workingOn = $connection->getARecord( array( 'id' => $id ) );
|
| - |
|
482 |
}
|
| - |
|
483 |
}
|
| - |
|
484 |
// default to working on ourself
|
| - |
|
485 |
if ( ! ( isset( $this->workingOn ) && count( $this->workingOn ) ) ) {
|
| - |
|
486 |
$this->workingOn = $this->data;
|
| - |
|
487 |
}
|
| - |
|
488 |
}
|
| - |
|
489 |
|
| 419 |
/**
|
490 |
/**
|
| 420 |
* Sets up the admin function which allows users to edit themselves and, optionally, others
|
491 |
* Sets up the admin function which allows users to edit themselves and, optionally, others
|
| 421 |
*
|
492 |
*
|
| 422 |
* This should be called the first time, then repeatedly called until it is done
|
493 |
* This should be called the first time, then repeatedly called until it is done
|
| 423 |
* (it returns the string "Updated", "Failed" or "No changes".
|
494 |
* (it returns the string "Updated", "Failed" or "No changes".
|
| Line 439... |
Line 510... |
| 439 |
*
|
510 |
*
|
| 440 |
* @return string This may be an HTML table or a single screen
|
511 |
* @return string This may be an HTML table or a single screen
|
| 441 |
*/
|
512 |
*/
|
| 442 |
public function admin ( $connection, $nextScript = null ) {
|
513 |
public function admin ( $connection, $nextScript = null ) {
|
| 443 |
$nextScript = $this->getNextScript( $nextScript );
|
514 |
$nextScript = $this->getNextScript( $nextScript );
|
| 444 |
if ( ! isset($_REQUEST['id']) ) {
|
- |
|
| 445 |
// we're working on ourself
|
515 |
// set workingOn if not set
|
| 446 |
$this->workingOn = $this->data;
|
- |
|
| 447 |
} elseif ( isset($_REQUEST['id'] ) && $this->workingOn['id'] != $_REQUEST['id'] ) {
|
- |
|
| 448 |
// we're working on a different user
|
- |
|
| 449 |
if ( $_REQUEST['id'] == -1 ) { // we are adding a new user
|
- |
|
| 450 |
$this->workingOn = $this->emptyWorkingOn();
|
516 |
if ( ! $this->workingOn || isset($_REQUEST['id']) )
|
| 451 |
} else { // this is an existing user
|
- |
|
| 452 |
$this->workingOn = $connection->getARecord( array( 'id' => $_REQUEST['id'] ) );
|
517 |
$this->initWorkingOn( $connection, isset($_REQUEST['id']) ? $_REQUEST['id'] : null );
|
| 453 |
}
|
- |
|
| 454 |
}
|
- |
|
| 455 |
// default to working on ourself
|
- |
|
| 456 |
if ( ! ( isset( $this->workingOn ) && count( $this->workingOn ) ) ) {
|
- |
|
| 457 |
$this->workingOn = $this->data;
|
- |
|
| 458 |
}
|
- |
|
| 459 |
// we have no data, so we should create a form for them to enter something
|
518 |
// we have no data, so we should create a form for them to enter something
|
| 460 |
if ( ! isset( $_REQUEST[$this->configuration['input prefix'] . $this->configuration['tables']['users']['form test']] ) ) {
|
519 |
if ( ! isset( $_REQUEST[$this->configuration['input prefix'] . $this->configuration['tables']['users']['form test']] ) ) {
|
| 461 |
// create the screen
|
520 |
// create the screen
|
| 462 |
$return = $this->editScreen();
|
521 |
$return = $this->editScreen( $connection );
|
| 463 |
if ( $this->data['admin'] ) {
|
522 |
if ( $this->data['admin'] ) {
|
| 464 |
$return .= $this->allUsersHTML( $connection );
|
523 |
$return .= $this->allUsersHTML( $connection );
|
| 465 |
}
|
524 |
}
|
| 466 |
return sprintf( $this->configuration['screens']['edit form'],
|
525 |
return sprintf( $this->configuration['screens']['edit form'],
|
| 467 |
$nextScript,
|
526 |
$nextScript,
|
| 468 |
$return
|
527 |
$return
|
| 469 |
);
|
528 |
);
|
| 470 |
} else { // we are processing
|
529 |
} else { // we are processing
|
| 471 |
$data = array();
|
- |
|
| 472 |
foreach ( $this->configuration['tables']['users']['fields'] as $field => $record ) {
|
- |
|
| 473 |
// if this field is restricted it is our record, skip it
|
- |
|
| 474 |
if ( isset( $record['restrict'] ) && ( $this->data['id'] == $this->workingOn['id'] ) )
|
- |
|
| 475 |
continue;
|
- |
|
| 476 |
$htmlFieldName = $this->configuration['input prefix'] . $field;
|
- |
|
| 477 |
$temp = '';
|
- |
|
| 478 |
switch ( $record['html type'] ) {
|
- |
|
| 479 |
case 'password':
|
- |
|
| 480 |
if ( ! empty( $_REQUEST[$htmlFieldName] ) ) {
|
- |
|
| 481 |
$data[$field] = password_hash( $_REQUEST[$htmlFieldName], PASSWORD_DEFAULT );
|
- |
|
| 482 |
if ( isset( $this->configuration['tables']['users']['fields']['last password change'] ) ) {
|
- |
|
| 483 |
$data['last password change'] = date("YmdHis");
|
- |
|
| 484 |
}
|
- |
|
| 485 |
}
|
- |
|
| 486 |
break;
|
- |
|
| 487 |
case 'boolean' :
|
- |
|
| 488 |
if ( $this->workingOn['id'] == -1 || ( isset( $_REQUEST[$htmlFieldName] ) != $this->workingOn[$field] ) ) {
|
- |
|
| 489 |
$data[$field] = isset( $_REQUEST[$htmlFieldName] ) ? 1 : 0;
|
- |
|
| 490 |
}
|
- |
|
| 491 |
break;
|
- |
|
| 492 |
default : // text, textarea, other things like this
|
- |
|
| 493 |
if ( $this->workingOn['id'] == -1 || ( isset( $_REQUEST[$htmlFieldName] ) && $_REQUEST[$htmlFieldName] !== $this->workingOn[$field] ) ) {
|
- |
|
| 494 |
$data[$field] = $_REQUEST[$htmlFieldName];
|
- |
|
| 495 |
if ( isset( $record['filter'] ) && preg_match( $record['filter'], $data[$field] ) !== 1 ) {
|
- |
|
| 496 |
$this->errors[] = sprintf( "Invalid characters in %s, %s", $record['label'], $record['instructions'] );
|
- |
|
| 497 |
unset( $data[$field] );
|
- |
|
| 498 |
}
|
- |
|
| 499 |
}
|
- |
|
| 500 |
break;
|
- |
|
| 501 |
} // switch
|
- |
|
| 502 |
} // foreach
|
- |
|
| 503 |
if ( count($this->errors) ) { // we have some errors
|
- |
|
| 504 |
$this->errors[] = 'Record not updated';
|
- |
|
| 505 |
return 'Error';
|
- |
|
| 506 |
}
|
- |
|
| 507 |
if ( $data ) {
|
- |
|
| 508 |
$data['id'] = $this->workingOn['id'];
|
530 |
$return = $this->addEdit( $connection );
|
| 509 |
$return = $connection->update( $data ) ? "Updated" : "Failed";
|
- |
|
| 510 |
if ( $this->workingOn['id'] == $this->data['id'] ) // we just updated us, reload record
|
- |
|
| 511 |
$this->data = $connection->getARecord( array( 'id' => $this->data['id'] ) );
|
- |
|
| 512 |
} else {
|
- |
|
| 513 |
$return = "No changes";
|
- |
|
| 514 |
}
|
- |
|
| 515 |
unset( $this->workingOn );
|
531 |
unset( $this->workingOn );
|
| 516 |
return $return;
|
532 |
return $return;
|
| 517 |
} // else
|
533 |
} // else
|
| 518 |
} // admin
|
534 |
} // admin
|
| 519 |
|
535 |
|