|
15 | 15 | check_pdns_search_allowed, |
16 | 16 | check_pdns_zone_admin, |
17 | 17 | check_pdns_zone_allowed, |
| 18 | + check_pdns_tsigkeys_allowed, |
18 | 19 | dependency_check_token_defined, |
19 | 20 | dependency_metrics_proxy_enabled, |
20 | 21 | ensure_rrsets_request_allowed, |
@@ -442,6 +443,109 @@ async def search_data( |
442 | 443 | return data |
443 | 444 |
|
444 | 445 |
|
| 446 | +@router_pdns.get('/servers/{server_id}/tsigkeys') |
| 447 | +async def list_tsigkeys( |
| 448 | + response: Response, server_id: str, X_API_Key: str = Header() |
| 449 | +): |
| 450 | + ''' |
| 451 | + Get all TSIGKeys on the server, except the actual key. |
| 452 | +
|
| 453 | + <https://doc.powerdns.com/authoritative/http-api/tsigkey.html#get--servers-server_id-tsigkeys> |
| 454 | + ''' |
| 455 | + environment = get_environment_for_token(config, X_API_Key) |
| 456 | + if not check_pdns_tsigkeys_allowed(environment): |
| 457 | + logger.info(f'TSIGKeys not allowed for environment {environment.name}') |
| 458 | + raise ZoneNotAllowedException() |
| 459 | + resp = await pdns.get(f'/api/v1/servers/{server_id}/tsigkeys') |
| 460 | + response.status_code = resp.status |
| 461 | + data = await response_json_or_text(resp) |
| 462 | + return data |
| 463 | + |
| 464 | + |
| 465 | +@router_pdns.get('/servers/{server_id}/tsigkeys/{tsigkey_id}') |
| 466 | +async def fetch_tsigkey( |
| 467 | + response: Response, server_id: str, tsigkey_id: str, X_API_Key: str = Header() |
| 468 | +): |
| 469 | + ''' |
| 470 | + Get a specific TSIGKeys on the server, including the actual key. |
| 471 | +
|
| 472 | + <https://doc.powerdns.com/authoritative/http-api/tsigkey.html#get--servers-server_id-tsigkeys-tsigkey_id> |
| 473 | + ''' |
| 474 | + environment = get_environment_for_token(config, X_API_Key) |
| 475 | + if not check_pdns_tsigkeys_allowed(environment): |
| 476 | + logger.info(f'TSIGKeys not allowed for environment {environment.name}') |
| 477 | + raise ZoneNotAllowedException() |
| 478 | + resp = await pdns.get(f'/api/v1/servers/{server_id}/tsigkeys/{tsigkey_id}') |
| 479 | + response.status_code = resp.status |
| 480 | + data = await response_json_or_text(resp) |
| 481 | + return data |
| 482 | + |
| 483 | + |
| 484 | +@router_pdns.post('/servers/{server_id}/tsigkeys') |
| 485 | +async def create_tsigkey( |
| 486 | + request: Request, response: Response, server_id: str, X_API_Key: str = Header() |
| 487 | +): |
| 488 | + ''' |
| 489 | + Add a TSIG key. |
| 490 | +
|
| 491 | + This methods add a new TSIGKey. The actual key can be generated by the server or be provided by the client. |
| 492 | +
|
| 493 | + <https://doc.powerdns.com/authoritative/http-api/tsigkey.html#post--servers-server_id-tsigkeys> |
| 494 | + ''' |
| 495 | + environment = get_environment_for_token(config, X_API_Key) |
| 496 | + if not check_pdns_tsigkeys_allowed(environment): |
| 497 | + logger.info(f'TSIGKeys not allowed for environment {environment.name}') |
| 498 | + raise ZoneNotAllowedException() |
| 499 | + resp = await pdns.post(f'/api/v1/servers/{server_id}/tsigkeys', payload=await request.json()) |
| 500 | + response.status_code = resp.status |
| 501 | + data = await response_json_or_text(resp) |
| 502 | + return data |
| 503 | + |
| 504 | + |
| 505 | +@router_pdns.put('/servers/{server_id}/tsigkeys/{tsigkey_id}') |
| 506 | +async def update_tsigkey( |
| 507 | + request: Request, response: Response, server_id: str, tsigkey_id: str, X_API_Key: str = Header() |
| 508 | +): |
| 509 | + ''' |
| 510 | + The TSIGKey at tsigkey_id can be changed in multiple ways: |
| 511 | +
|
| 512 | + * Changing the Name, this will remove the key with tsigkey_id after adding. |
| 513 | + * Changing the Algorithm |
| 514 | + * Changing the Key |
| 515 | +
|
| 516 | + Only the relevant fields have to be provided in the request body. |
| 517 | +
|
| 518 | + <https://doc.powerdns.com/authoritative/http-api/tsigkey.html#put--servers-server_id-tsigkeys-tsigkey_id> |
| 519 | + ''' |
| 520 | + environment = get_environment_for_token(config, X_API_Key) |
| 521 | + if not check_pdns_tsigkeys_allowed(environment): |
| 522 | + logger.info(f'TSIGKeys not allowed for environment {environment.name}') |
| 523 | + raise ZoneNotAllowedException() |
| 524 | + resp = await pdns.put(f'/api/v1/servers/{server_id}/tsigkeys/{tsigkey_id}', payload=await request.json()) |
| 525 | + response.status_code = resp.status |
| 526 | + data = await response_json_or_text(resp) |
| 527 | + return data |
| 528 | + |
| 529 | + |
| 530 | +@router_pdns.delete('/servers/{server_id}/tsigkeys/{tsigkey_id}') |
| 531 | +async def delete_tsigkey( |
| 532 | + response: Response, server_id: str, tsigkey_id: str, X_API_Key: str = Header() |
| 533 | +): |
| 534 | + ''' |
| 535 | + Delete the TSIGKey with tsigkey_id. |
| 536 | +
|
| 537 | + <https://doc.powerdns.com/authoritative/http-api/tsigkey.html#delete--servers-server_id-tsigkeys-tsigkey_id> |
| 538 | + ''' |
| 539 | + environment = get_environment_for_token(config, X_API_Key) |
| 540 | + if not check_pdns_tsigkeys_allowed(environment): |
| 541 | + logger.info(f'TSIGKeys not allowed for environment {environment.name}') |
| 542 | + raise ZoneNotAllowedException() |
| 543 | + resp = await pdns.delete(f'/api/v1/servers/{server_id}/tsigkeys/{tsigkey_id}') |
| 544 | + response.status_code = resp.status |
| 545 | + data = await response_json_or_text(resp) |
| 546 | + return data |
| 547 | + |
| 548 | + |
445 | 549 | app.include_router(router_proxy) |
446 | 550 | app.include_router(router_pdns) |
447 | 551 | app.include_router(router_health) |
0 commit comments