diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml new file mode 100644 index 0000000..46e92ef --- /dev/null +++ b/.github/workflows/build-and-publish.yml @@ -0,0 +1,54 @@ +on: + push: + branches: + - 'master' + tags: + - 'v*.*.*' + +jobs: + build-and-push-docker-image: + name: Build Docker image and push to repositories + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v3 + with: + images: | + ngoduykhanh/powerdns-admin + tags: | + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build latest image + uses: docker/build-push-action@v2 + if: github.ref == 'refs/heads/master' + with: + context: ./ + file: ./docker/Dockerfile + push: true + tags: ngoduykhanh/powerdns-admin:latest + + - name: Build release image + uses: docker/build-push-action@v2 + if: ${{ github.event_name == 'create' && github.event.ref_type == 'tag' }} + with: + context: ./ + file: ./docker/Dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 311f17c..0000000 --- a/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: minimal -script: - - docker-compose -f docker-compose-test.yml up --exit-code-from powerdns-admin --abort-on-container-exit -services: - - docker diff --git a/README.md b/README.md index 67f5e2e..e924bb0 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # PowerDNS-Admin A PowerDNS web interface with advanced features. -[![Build Status](https://travis-ci.org/ngoduykhanh/PowerDNS-Admin.svg?branch=master)](https://travis-ci.org/ngoduykhanh/PowerDNS-Admin) [![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/ngoduykhanh/PowerDNS-Admin.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/ngoduykhanh/PowerDNS-Admin/context:python) [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/ngoduykhanh/PowerDNS-Admin.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/ngoduykhanh/PowerDNS-Admin/context:javascript) diff --git a/docker/Dockerfile b/docker/Dockerfile index b44d749..5296e02 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -65,14 +65,6 @@ RUN mkdir -p /app && \ mkdir -p /app/configs && \ cp -r /build/configs/docker_config.py /app/configs -# Cleanup -RUN pip install pip-autoremove && \ - pip-autoremove cssmin -y && \ - pip-autoremove jsmin -y && \ - pip-autoremove pytest -y -L packaging && \ - pip uninstall -y pip-autoremove && \ - apk del ${BUILD_DEPENDENCIES} - # Build image FROM alpine:3.13 diff --git a/powerdnsadmin/decorators.py b/powerdnsadmin/decorators.py index 5bf6c96..44e545b 100644 --- a/powerdnsadmin/decorators.py +++ b/powerdnsadmin/decorators.py @@ -93,6 +93,23 @@ def can_configure_dnssec(f): return decorated_function +def can_remove_domain(f): + """ + Grant access if: + - user is in Operator role or higher, or + - allow_user_remove_domain is on + """ + @wraps(f) + def decorated_function(*args, **kwargs): + if current_user.role.name not in [ + 'Administrator', 'Operator' + ] and not Setting().get('allow_user_remove_domain'): + abort(403) + return f(*args, **kwargs) + + return decorated_function + + def can_create_domain(f): """ diff --git a/powerdnsadmin/lib/schema.py b/powerdnsadmin/lib/schema.py index daee29a..78d8369 100644 --- a/powerdnsadmin/lib/schema.py +++ b/powerdnsadmin/lib/schema.py @@ -47,7 +47,7 @@ class UserDetailedSchema(Schema): lastname = fields.String() email = fields.String() role = fields.Embed(schema=RoleSchema) - accounts = fields.Embed(schema=AccountSummarySchema) + accounts = fields.Embed(schema=AccountSummarySchema, many=True) class AccountSchema(Schema): id = fields.Integer() diff --git a/powerdnsadmin/lib/utils.py b/powerdnsadmin/lib/utils.py index d7f20a4..951f750 100644 --- a/powerdnsadmin/lib/utils.py +++ b/powerdnsadmin/lib/utils.py @@ -104,6 +104,13 @@ def fetch_json(remote_url, data = None try: data = json.loads(r.content.decode('utf-8')) + except UnicodeDecodeError: + # If the decoding fails, switch to slower but probably working .json() + try: + logging.warning("UTF-8 content.decode failed, switching to slower .json method") + data = r.json() + except Exception as e: + raise e except Exception as e: raise RuntimeError( 'Error while loading JSON data from {0}'.format(remote_url)) from e @@ -239,7 +246,7 @@ def pretty_domain_name(value): """ if isinstance(value, str): if value.startswith('xn--') \ - or value.find('.xn--'): + or value.find('.xn--') != -1: try: return value.encode().decode('idna') except: diff --git a/powerdnsadmin/models/record.py b/powerdnsadmin/models/record.py index e0b507c..e2e2b5a 100644 --- a/powerdnsadmin/models/record.py +++ b/powerdnsadmin/models/record.py @@ -65,6 +65,9 @@ class Record(object): rrsets=[] for r in jdata['rrsets']: + if len(r['records']) == 0: + continue + while len(r['comments']) -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/powerdnsadmin/templates/admin_edit_key.html b/powerdnsadmin/templates/admin_edit_key.html index f1a33a0..d89cad1 100644 --- a/powerdnsadmin/templates/admin_edit_key.html +++ b/powerdnsadmin/templates/admin_edit_key.html @@ -59,7 +59,7 @@ @@ -165,4 +165,4 @@ -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/powerdnsadmin/templates/base.html b/powerdnsadmin/templates/base.html index 60fd616..c6feb93 100644 --- a/powerdnsadmin/templates/base.html +++ b/powerdnsadmin/templates/base.html @@ -21,6 +21,9 @@ {% assets "css_main" -%} {%- endassets %} +{% if SETTING.get('custom_css') %} + +{% endif %} +
+

+ Domain + Remove existing +

+ +
+{% endblock %} + +{% block content %} +
+
+
+
+
+

Remove domain

+
+ + +
+ +
+
+ +
+ + + +
+
+ +
+
+
+
+

Help with removing a new domain

+
+
+
+
Domain name
+
Select domain you wish to remove from DNS.
+
+

Find more details at https://docs.powerdns.com/md/ +

+
+
+
+
+
+{% endblock %} +{% block extrascripts %} + +{% endblock %} + +{% block modals %} + +{% endblock %} diff --git a/powerdnsadmin/templates/login.html b/powerdnsadmin/templates/login.html index ffa57a9..dcf96cf 100644 --- a/powerdnsadmin/templates/login.html +++ b/powerdnsadmin/templates/login.html @@ -11,7 +11,9 @@ {% assets "css_login" -%} {%- endassets %} - +{% if SETTING.get('custom_css') %} + +{% endif %}