Ejemplo n.º 1
0
 public function modify_zone($response, $identifier, $data, &$out = null)
 {
     ZoneFunctions::get_zone($response, $identifier, $o, false);
     if (empty($o)) {
         $out = false;
         return $response;
     }
     unset($o);
     try {
         $connection = Database::getConnection();
         $connection->beginTransaction();
     } catch (PDOException $e) {
         $response->code = Response::INTERNALSERVERERROR;
         $response->error = "Could not connect to PowerDNS server.";
         $response->error_detail = "INTERNAL_SERVER_ERROR";
         $out = false;
         return $response;
     }
     $parameters = array();
     $query = "UPDATE `%s` SET ";
     $q = array();
     if (isset($data->name)) {
         $q[] = "name = :name";
         $parameters[":name"] = $data->name;
     }
     if (isset($data->master)) {
         $q[] = "master = :master";
         $parameters[":master"] = $data->master;
     }
     if (isset($data->type)) {
         $q[] = "type = :type";
         $parameters[":type"] = $data->type;
     }
     if (empty($parameters) && !isset($data->records)) {
         $response->code = Response::BADREQUEST;
         $response->error = "Nothing to change, check your request body.";
         $response->error_detail = "ZONE_NO_CHANGES";
         $out = false;
         return $response;
     }
     if (!empty($parameters)) {
         $query .= implode(", ", $q);
         $query .= " WHERE name = :identifier";
         $parameters[":identifier"] = $identifier;
         $statement = $connection->prepare(sprintf($query, PowerDNSConfig::DB_ZONE_TABLE));
         if ($statement->execute($parameters) === false) {
             $response->code = Response::INTERNALSERVERERROR;
             $response->error = "Rolling back transaction, failed to modify zone.";
             $response->error_detail = "ZONE_MODIFY_FAILED";
             $connection->rollback();
             $out = false;
             return $response;
         }
     }
     if (isset($data->records)) {
         $deletions = array();
         $additions = array();
         foreach ($data->records as $record) {
             if (isset($record->mode) && $record->mode == "delete") {
                 $deletions[] = $record;
             } else {
                 $additions[] = $record;
             }
         }
         if (!empty($deletions)) {
             $obj = new StdClass();
             $obj->records = $deletions;
             ZoneFunctions::delete_records($response, $identifier, $obj, $out, $connection);
             if (!$out) {
                 $connection->rollback();
                 $out = false;
                 return $response;
             }
             unset($obj);
         }
         if (!empty($additions)) {
             $obj = new StdClass();
             $obj->records = $additions;
             ZoneFunctions::create_records($response, $identifier, $obj, $out, true, $connection);
             if (!$out) {
                 $connection->rollback();
                 $out = false;
                 return $response;
             }
             unset($obj);
         }
     }
     $connection->commit();
     $response->code = Response::OK;
     $response->body = true;
     if (isset($data->records)) {
         $response->log_message = sprintf("Zone %s was modified, deleted %d records and added %d records.", $identifier, count($deletions), count($additions));
     } else {
         $response->log_message = sprintf("Zone %s was modified.", $identifier);
     }
     $out = true;
     return $response;
 }
Ejemplo n.º 2
0
 /**
  * Delete an existing DNS zone, or delete a record from the zone.
  *
  * If an identifier is specified, the entire zone will be deleted.
  *
  * ### Response: ###
  *
  * ~~~
  * true
  * ~~~
  *
  * If a body is specified, but no identifier, the specified entries will be deleted from the zone.
  *
  * ### Request: ###
  *
  * ~~~
  * {
  *     "name": <string>,
  *     "records": [ {
  *             "name": <string>,
  *             "type": <string>,
  *             "content": <string>,
  *             "priority": <int>
  *     },1..n ]
  * }
  * ~~~
  *
  * ### Response: ###
  *
  * ~~~
  * true
  * ~~~
  *
  * ### Errors (request without identifier): ###
  *
  * * 508 - Invalid request, missing required parameters or input validation failed.
  * * 500 - Failed to connect to database or query execution error.
  * * 409 - Cannot delete records from a SLAVE zone.
  * * 404 - Could not find zone.
  *
  * ### Errors (request with identifier): ###
  *
  * * 508 - Invalid request, missing required parameters or input validation failed.
  * * 500 - Failed to connect to database or query execution error.
  * * 404 - Could not find zone.
  *
  * @access public
  * @param mixed $request Request parameters
  * @param string $identifier Zone identifier
  * @return Response True if zone was deleted, error message otherwise.
  */
 public function delete($request, $identifier = null)
 {
     $response = new FormattedResponse($request);
     $data = $request->parseData();
     if (empty($identifier) && (empty($data) || !isset($data->name) || !isset($data->records) || empty($data->records))) {
         $response->code = Response::BADREQUEST;
         $response->error = "Identifier and/or records were missing or invalid. Ensure that the body is in valid format and all required parameters are present.";
         $response->error_detail = "MISSING_REQUIRED_PARAMETERS";
         return $response;
     }
     $validator = new ZoneValidator($data);
     $validator->mode_override = "delete";
     if (!empty($identifier)) {
         $validator->identifier = $identifier;
     }
     if (!$validator->validates()) {
         $response->code = Response::BADREQUEST;
         $response->error = $validator->getFormattedErrors();
         $response->error_detail = $validator->getErrorDetails();
         return $response;
     }
     if (!empty($identifier)) {
         return ZoneFunctions::delete_zone($response, $identifier);
     } else {
         return ZoneFunctions::delete_records($response, $data->name, $data);
     }
 }
Ejemplo n.º 3
0
 public function delete_arpa($response, $identifier, &$out = null)
 {
     ArpaFunctions::get_arpa($response, $identifier, $o, true);
     if (empty($o)) {
         $out = false;
         return $response;
     }
     $record = new stdClass();
     $record->name = $o['name'];
     $record->type = "PTR";
     $record->content = $o['reverse_dns'];
     $record->priority = $o['priority'];
     $req = new stdClass();
     $req->records = array($record);
     $response = ZoneFunctions::delete_records($response, $o['arpa_zone'], $req, $o);
     if (empty($o)) {
         $out = false;
         return $response;
     }
     $response->code = Response::OK;
     $response->body = true;
     $response->log_message = sprintf("Deleted Arpa record for IP %s", $identifier);
     $out = true;
     return $response;
 }