From 2b5e7ea5f64b08c7da646f9c9b1c0be02d023c97 Mon Sep 17 00:00:00 2001
From: Richard Underwood <richard.underwood@digitaslbi.com>
Date: Wed, 4 Jan 2017 09:30:58 +0000
Subject: [PATCH] Uncomitted changes prior to merge. Permissions ...

---
 includes/config.inc.php-dist |  6 +++
 index.php                    | 69 ++++++++++++++++++++++++++++++
 permissions.php              | 83 ++++++++++++++++++++++++++++++++++++
 3 files changed, 158 insertions(+)
 create mode 100644 permissions.php

diff --git a/includes/config.inc.php-dist b/includes/config.inc.php-dist
index bc00616..4b1ff16 100644
--- a/includes/config.inc.php-dist
+++ b/includes/config.inc.php-dist
@@ -10,6 +10,12 @@ $logging = TRUE;
 $allowclearlogs = TRUE;  # Allow clearing of log entries
 $allowrotatelogs = FALSE;# Allow rotation to text file on server
 
+$restrictediting = TRUE; # Restrict editing of record types
+$restrictedtypes = array( 
+    'SOA' => 1,
+    'NS' => 1
+);
+
 # Log directory - if allowrotatelogs is set, this is where the logs will
 # be written. It must be writeable by the web server user.
 $logsdirectory = "../etc";
diff --git a/index.php b/index.php
index 31f328f..593ce29 100644
--- a/index.php
+++ b/index.php
@@ -796,6 +796,75 @@ $(document).ready(function () {
                 inputClass: 'serial',
                 listClass: 'serial'
             },
+            permissions: {
+                title: 'Permissions',
+                width: '10%',
+                create: false,
+                edit: false,
+                display: function(data) {
+                    var $img = $('<img class="list" src="img/list.png" title="Permissions" />');
+                    $img.click(function () {
+                        $('#SlaveZones').jtable('openChildTable',
+                            $img.closest('tr'), {
+                                title: 'Permissions for ' + data.record.name,
+                                openChildAsAccordion: true,
+                                actions: {
+                                    listAction: 'permissions.php?action=list&zoneid=' + data.record.id,
+                                    createAction: 'permissions.php?action=add&zoneid=' + data.record.id,
+                                    deleteAction: 'permissions.php?action=remove&zoneid=' + data.record.id
+                                },
+                                fields: {
+                                    id: {
+                                        key: true,
+                                        type: 'hidden'
+                                    },
+                                    type: {
+                                        title: 'Type',
+                                        inputClass: "permissionstype",
+                                        options: {
+                                            'user': 'User',
+                                            'group': 'Group'
+                                        },
+                                        create: true,
+                                        edit: false
+                                    },
+                                    value: {
+                                        title: 'Name',
+                                        inputClass: "usergrouplist",
+                                        display: displayContent('value')
+                                    },
+                                    permissions: {
+                                        title: 'Permissions',
+                                        options: {
+                                            '1' : 'View Only',
+<?php if($restrictediting) { ?>
+                                            '3' : 'Update normal records',
+                                            '7' : 'Update all records',
+<?php } else { ?>
+                                            '7' : 'Update',
+<?php } ?>
+                                            '15' : 'Admin'
+                                        }
+                                    }
+                                },
+                                formCreated: function(event, dat) {
+                                    $( ".usergrouplist" ).autocomplete({
+                                        source: "users.php?action=autocomplete&zoneid=" + data.record.id + "&type=" + $( ".permissionstype" ).val()
+                                    });
+                                    $( ".permissionstype" ).change(function() {
+                                      $( ".usergrouplist" ).val("");
+                                      $( ".usergrouplist" ).autocomplete({
+                                          source: "users.php?action=autocomplete&type=" + $( ".permissionstype" ).val()
+                                      });
+                                    });
+                                }
+                            }, function (data) {
+                                data.childTable.jtable('load');
+                            })
+                    });
+                    return $img;
+                }
+            },
             exportzone: {
                 title: '',
                 width: '1%',
diff --git a/permissions.php b/permissions.php
new file mode 100644
index 0000000..713e465
--- /dev/null
+++ b/permissions.php
@@ -0,0 +1,83 @@
+<?php
+
+include_once('includes/config.inc.php');
+include_once('includes/session.inc.php');
+include_once('includes/misc.inc.php');
+
+if (!is_csrf_safe()) {
+    header('Status: 403');
+    header('Location: ./index.php');
+    jtable_respond(null, 'error', "Authentication required");
+}
+
+$zoneid = isset($_GET['zoneid']) ? intval($_GET['zoneid']) : '';
+
+if (!is_adminuser()) {
+    header('Status: 403');
+    jtable_respond(null, 'error', "You need adminprivileges to get here");
+}
+
+if (!isset($_GET['action'])) {
+    header('Status: 400');
+    jtable_respond(null, 'error', 'No action given');
+}
+
+switch ($_GET['action']) {
+
+case "list":
+
+    if ($zoneid != '') {
+        $permissions = get_zone_permissions($zoneid);
+        jtable_respond($permissions);
+    } else {
+        jtable_respond(null, 'error', 'Could not list zone permissions');
+    }
+    break;
+
+case "add":
+    $type = isset($_POST['type']) ? $_POST['type'] : '';
+    $value = isset($_POST['value']) ? $_POST['value'] : '';
+    $permissons = isset($_POST['permissions']) ? $_POST['permissions'] : '';
+
+    if ($zoneid != '') {
+        if (user_exists($user)) {
+            if(is_group_member($groupid,$user)) {
+                jtable_respond(null, 'error', "User already a member of the group");
+            } elseif(!is_null($id=add_group_member($groupid,$user))) {
+                $entry = array('id' => $id,'user' => $user);
+                jtable_respond($entry, 'single');
+            } else {
+                jtable_respond(null, 'error', "Failed to add user to group");
+            }
+        } else {
+            jtable_respond(null, 'error', "User doesn't exist");
+        }
+    } else {
+        jtable_respond(null, 'error', 'Zone not specified');
+    }
+    break;
+
+case "remove":
+
+    if ($id != '') {
+        if(remove_group_member($id)) {
+            jtable_respond(null, 'delete');
+        } else {
+            jtable_respond(null, 'error', "Failed to delete user from group");
+        }
+    } else {
+        jtable_respond(null, 'error', 'ID not specified');
+    }
+    break;
+
+case "autocomplete":
+    $term = isset($_GET['type']) ? $_GET['type'] : '';
+    $term = isset($_GET['term']) ? $_GET['term'] : '';
+    $users=get_usernames_filtered($term);
+    print json_encode($users);
+    break;
+
+default:
+    jtable_respond(null, 'error', 'Invalid action');
+    break;
+}