add/edit/delete 'properties'

This commit is contained in:
Joshua P Panter 2018-01-27 03:05:45 -05:00
parent f751f53648
commit 5ff1b202b8
2 changed files with 162 additions and 18 deletions

View file

@ -2,7 +2,7 @@
/* /*
*------------------------------------------------------------ *------------------------------------------------------------
* *
* PEWS (pew! pew!) - PHP Easy WebFinger Server 1.6.0 * PEWS (pew! pew!) - PHP Easy WebFinger Server 1.7.0
* *
* This script enables webfinger support on a server that * This script enables webfinger support on a server that
* handles one or more domains. * handles one or more domains.
@ -402,9 +402,9 @@ function pews_manager( $auth, $password ) {
$reauth = pews_auth( $resource, $password ); $reauth = pews_auth( $resource, $password );
$auth = $reauth['class']; $auth = $reauth['class'];
case true: case true:
$resource = pews_parse_account_string( $resource );
if(isset($_POST['newAlias'])) { if(isset($_POST['newAlias'])) {
$newAlias = $_POST['newAlias']; $newAlias = $_POST['newAlias'];
$resource = pews_parse_account_string( $resource );
$acct_file = PEWS_DATA_STORE . '/' . $resource['host'] .'/'. $resource['user'] . '.json'; $acct_file = PEWS_DATA_STORE . '/' . $resource['host'] .'/'. $resource['user'] . '.json';
if (file_exists($acct_file)) { if (file_exists($acct_file)) {
$data = json_decode(file_get_contents($acct_file), true); $data = json_decode(file_get_contents($acct_file), true);
@ -414,11 +414,13 @@ function pews_manager( $auth, $password ) {
$data = json_encode($data, JSON_UNESCAPED_SLASHES); $data = json_encode($data, JSON_UNESCAPED_SLASHES);
$success = file_put_contents( $acct_file, $data ); $success = file_put_contents( $acct_file, $data );
if($success === false) { if($success === false) {
$return['is'] = false; http_response_code(500);
$return['info'] = 'Could not write to resource file'; $return['statusCode'] = 500;
$return['message'] = 'Could not write to resource file';
} else { } else {
$return['is'] = true; http_response_code(200);
$return['info'] = 'Alias: '.$newAlias.' added to '.$resource['acct']; $return['statusCode'] = 200;
$return['message'] = 'Alias: '.$newAlias.' added to '.$resource['acct'];
} }
} else { } else {
http_response_code(404); http_response_code(404);
@ -445,9 +447,9 @@ function pews_manager( $auth, $password ) {
$reauth = pews_auth( $resource, $password ); $reauth = pews_auth( $resource, $password );
$auth = $reauth['class']; $auth = $reauth['class'];
case true: case true:
$resource = pews_parse_account_string( $resource );
if(isset($_POST['oldAlias'])) { if(isset($_POST['oldAlias'])) {
$oldAlias = $_POST['oldAlias']; $oldAlias = $_POST['oldAlias'];
$resource = pews_parse_account_string( $resource );
$acct_file = PEWS_DATA_STORE . '/' . $resource['host'] .'/'. $resource['user'] . '.json'; $acct_file = PEWS_DATA_STORE . '/' . $resource['host'] .'/'. $resource['user'] . '.json';
if (file_exists($acct_file)) { if (file_exists($acct_file)) {
$data = json_decode(file_get_contents($acct_file), true); $data = json_decode(file_get_contents($acct_file), true);
@ -464,10 +466,11 @@ function pews_manager( $auth, $password ) {
$success = file_put_contents( $acct_file, $data ); $success = file_put_contents( $acct_file, $data );
if($success === false) { if($success === false) {
http_response_code(500); http_response_code(500);
$return['is'] = false; $return['statusCode'] = 500;
$return['info'] = 'Could not write to resource file'; $return['info'] = 'Could not write to resource file';
} else { } else {
$return['is'] = true; http_response_code(200);
$return['statusCode'] = 200;
$return['info'] = 'Alias: '.$oldAlias.' removed '.$resource['acct']; $return['info'] = 'Alias: '.$oldAlias.' removed '.$resource['acct'];
} }
} else { } else {
@ -493,11 +496,153 @@ function pews_manager( $auth, $password ) {
$return['info'] = $reauth['info']; $return['info'] = $reauth['info'];
} }
} elseif(isset($_POST['addProp'])) { } elseif(isset($_POST['addProp'])) {
// Do Something $resource = $_POST['addProp'];
switch ($auth) {
case false:
$reauth = pews_auth( $resource, $password );
$auth = $reauth['class'];
case true:
if(isset($_POST['propKey']) && isset($_POST['propVal'])) {
$propKey = $_POST['propKey'];
$propVal = $_POST['propVal'];
$resource = pews_parse_account_string( $resource );
$acct_file = PEWS_DATA_STORE .'/'. $resource['host'] .'/'. $resource['user'] .'.json';
if (file_exists($acct_file)) {
$data = json_decode(file_get_contents($acct_file), true);
$oldProps = isset($data['properties']) ? $data['properties'] : array();
if(array_key_exists($propKey, $oldProps)) {
http_response_code(409);
$return['statusCode'] = 409;
$return['message'] = $propKey . ' exists as '. $oldProps[$propKey] .' . Use editProp to overwrite.';
} else {
$newProps = array($propKey => $propVal);
$props = array_replace($oldProps, $newProps);
$data['properties'] = $props;
$data = json_encode($data, JSON_UNESCAPED_SLASHES);
$success = file_put_contents( $acct_file, $data );
if($success === false) {
http_response_code(500);
$return['statusCode'] = 500;
$return['message'] = 'Could not write to resource file';
} else {
http_response_code(200);
$return['statusCode'] = 200;
$return['message'] = 'Property element added to '.$resource['acct'];
}
}
} else {
http_response_code(404);
$return['statusCode'] = 404;
$return['message'] = 'Account '. $resource['acct'] .' not found.';
}
} else {
http_response_code(400);
$return['statusCode'] = 400;
$return['message'] = "This function requires both propKey and propVal, please check your query,";
}
break;
default:
http_response_code(401);
$return['statusCode'] = 401;
$return['message'] = "You can only add new resource properties with correct credentials";
$return['info'] = $reauth['info'];
}
} elseif(isset($_POST['editProp'])) { } elseif(isset($_POST['editProp'])) {
// Do Something $resource = $_POST['editProp'];
switch ($auth) {
case false:
$reauth = pews_auth( $resource, $password );
$auth = $reauth['class'];
case true:
if(isset($_POST['propKey']) && isset($_POST['propVal'])) {
$propKey = $_POST['propKey'];
$propVal = $_POST['propVal'];
$resource = pews_parse_account_string( $resource );
$acct_file = PEWS_DATA_STORE .'/'. $resource['host'] .'/'. $resource['user'] .'.json';
if (file_exists($acct_file)) {
$data = json_decode(file_get_contents($acct_file), true);
$oldProps = isset($data['properties']) ? $data['properties'] : array();
$newProps = array($propKey => $propVal);
$props = array_replace($oldProps, $newProps);
$data['properties'] = $props;
$data = json_encode($data, JSON_UNESCAPED_SLASHES);
$success = file_put_contents( $acct_file, $data );
if($success === false) {
http_response_code(500);
$return['statusCode'] = 500;
$return['message'] = 'Could not write to resource file';
} else {
http_response_code(200);
$return['statusCode'] = 200;
$return['message'] = 'Property for'. $resource['acct'] .' updated.';
}
} else {
http_response_code(404);
$return['statusCode'] = 404;
$return['message'] = 'Account '. $resource['acct'] .' not found.';
}
} else {
http_response_code(400);
$return['statusCode'] = 400;
$return['message'] = "This function requires both propKey and propVal, please check your query,";
}
break;
default:
http_response_code(401);
$return['statusCode'] = 401;
$return['message'] = "You can only edit resource properties with correct credentials";
$return['info'] = $reauth['info'];
}
} elseif(isset($_POST['delProp'])) { } elseif(isset($_POST['delProp'])) {
// Do Something $resource = $_POST['delProp'];
switch ($auth) {
case false:
$reauth = pews_auth( $resource, $password );
$auth = $reauth['class'];
case true:
if(isset($_POST['propKey'])) {
$propKey = $_POST['propKey'];
$resource = pews_parse_account_string( $resource );
$acct_file = PEWS_DATA_STORE .'/'. $resource['host'] .'/'. $resource['user'] .'.json';
if (file_exists($acct_file)) {
$data = json_decode(file_get_contents($acct_file), true);
$props = isset($data['properties']) ? $data['properties'] : array();
if(array_key_exists($propKey, $props)){
unset($props[$propKey]);
$data['properties'] = $props;
$data = json_encode($data, JSON_UNESCAPED_SLASHES);
$success = file_put_contents( $acct_file, $data );
if($success === false) {
http_response_code(500);
$return['statusCode'] = 500;
$return['message'] = 'Could not write to resource file';
} else {
http_response_code(200);
$return['statusCode'] = 200;
$return['message'] = 'Property for '. $resource['acct'] .' deleted.';
}
} else {
http_response_code(200);
$return['statusCode'] = 200;
$return['message'] = 'Nothing to delete, property already absent from server.';
}
} else {
http_response_code(404);
$return['statusCode'] = 404;
$return['message'] = 'Account ['. $resource['acct'] .'] not found.';
}
} else {
http_response_code(400);
$return['statusCode'] = 400;
$return['message'] = "Missing parameter: propKey, please check your query,";
}
break;
default:
http_response_code(401);
$return['statusCode'] = 401;
$return['message'] = "You can only delete resource properties with correct credentials";
$return['info'] = $reauth['info'];
}
} elseif(isset($_POST['addLink'])) { } elseif(isset($_POST['addLink'])) {
// Do Something // Do Something
} elseif(isset($_POST['editLink'])) { } elseif(isset($_POST['editLink'])) {
@ -544,7 +689,7 @@ function pews_manager( $auth, $password ) {
default: default:
http_response_code(401); http_response_code(401);
$return['statusCode'] = 401; $return['statusCode'] = 401;
$return['message'] = "You can change your own password if you know your credentials"; $return['message'] = "You can add only change your own password with correct credentials";
$return['info'] = $reauth['info']; $return['info'] = $reauth['info'];
} }
} else { } else {

View file

@ -32,8 +32,7 @@ The `PEWS` section of a PEWS resource file is not a part of the general Webfinge
If a user is `class:admin` then this user can alter the password of other users by adding `auth:admin-name@example.com` to the above post data, sending their own password as `pass:password`. If a user is `class:admin` then this user can alter the password of other users by adding `auth:admin-name@example.com` to the above post data, sending their own password as `pass:password`.
### TODO ### TODO
1. Finish api for adding, removing, and editing resource `properites` and `links` 1. Finish api for adding, removing, and editing resource `links`
2. Add option to allow users to remove their own resource file 2. Additional storage options (sqlite, etc.)
3. Additional storage options (sqlite, etc.) 3. Manager interface
4. Manager interface 4. Add in server-manager API examples (it's in the code... for now)
5. Add in server-manager API examples (it's in the code... for now)