From 77e028dd9c812cc5511fbcfb6a49d00af60fd4b8 Mon Sep 17 00:00:00 2001 From: iglocska Date: Mon, 17 Jun 2013 15:23:21 +0200 Subject: [PATCH] Several smaller changes - Fix to the proposed attribute edit that got broken in a previous commit - Fix to the org filters for non admin users - Some changes to the documentation --- app/Controller/EventsController.php | 4 + app/View/Events/index.ctp | 10 ++ app/View/Pages/administration.ctp | 128 ++++++++++---------- app/View/Pages/documentation.ctp | 16 +-- app/View/ShadowAttributes/edit.ctp | 173 ++++++++++++++++++++++++++++ app/webroot/img/doc/publish.png | Bin 6361 -> 5280 bytes 6 files changed, 259 insertions(+), 72 deletions(-) create mode 100644 app/View/ShadowAttributes/edit.ctp diff --git a/app/Controller/EventsController.php b/app/Controller/EventsController.php index 9d2c7c407..d268c64e3 100755 --- a/app/Controller/EventsController.php +++ b/app/Controller/EventsController.php @@ -117,6 +117,10 @@ class EventsController extends AppController { if (!$v) continue 2; $this->paginate['conditions'][] = array('Event.date' . ' <' => $v); break; + case 'org' : + if (!$v) continue 2; + $this->paginate['conditions'][] = array('Event.orgc' . ' =' => $v); + break; default: if (!$v) continue 2; $this->paginate['conditions'][] = array('Event.' . substr($k, 6) . ' LIKE' => '%' . $v . '%'); diff --git a/app/View/Events/index.ctp b/app/View/Events/index.ctp index faa3e2922..c2087d9d2 100755 --- a/app/View/Events/index.ctp +++ b/app/View/Events/index.ctp @@ -1,5 +1,6 @@ passedArgs['searchinfo'])) $this->passedArgs['searchinfo'] = '';?> passedArgs['searchorgc'])) $this->passedArgs['searchorgc'] = '';?> +passedArgs['searchorg'])) $this->passedArgs['searchorg'] = '';?> passedArgs['searchDatefrom'])) $this->passedArgs['searchDatefrom'] = '';?> passedArgs['searchDateuntil'])) $this->passedArgs['searchDateuntil'] = '';?>
@@ -93,6 +94,14 @@ } else { ?> Paginator->sort('org'); ?> +
+ Form->input('searchorg', array( + 'value' => $this->passedArgs['searchorg'], + 'label' => '', + 'class' => 'input-mini')); + ?> +
Add user

Listing all users:

To list all current users of the system, just click on List Users under the administration menu to the left. A view will be loaded with a list of all users and the following columns of information:
List users

Editing a user:

To add a new user, click on the New User button in the administration menu to the left and fill out the following fields in the view that is loaded:

Contacting a user:

Site admins can use the "Contact users" feature to send all or an individual user an e-mail. Users that have a PGP key set will receive their e-mails encrypted. When clicking this button on the left, you'll be presented with a form that allows you to specify the type of the e-mail, who it should reach and what the content is using the following options:
Contact
Keep in mind that all e-mails sent through this system will, in addition to your own message, will be signed in the name of the instance's host organisation's support team, will include the e-mail address of the instance's support (if the contact field is set in the bootstrap file), and will include the instance's PGP signature for users that have a PGP key set (and thus are eligible for an encrypted e-mail).

Managing the roles

Privileges are assigned to users by assigning them to rule groups, which use one of four options determining what they can do with events and four additional privilege elevating settings. The four options for event manipulation are: Read Only, Manage My Own Events, Manage Organisation Events, Manage & Publish Organisation Events. The extra privileges are admin, sync, authentication key usage and audit permission
-Read Only: This allows the user to browse events that his organisation has access to, but doesn't allow any changes to be made to the database.
-Manage My Own Events: The second option, gives its users rights to create, modify or delete their own events, but they cannot publish them.
-Manage Organization Events: allows users to create events or modify and delete events created by a member of their organisation.
-Manage & Publish Organisation Events: This last setting, gives users the right to do all of the above and also to publish the events of their organisation.
-Perm sync: This setting allows the users of the role to be used as a synchronisation user. The authentication key of this user can be handed out to the administrator of a remote MISP instance to allow the synchronisation features to work.
-Perm admin: Gives the user administrator privileges, this setting is used for the organisation admins.
-Perm audit: Grants access to the logs. With the exception of site admins, only logs generated by the user's own org are visible.
-Perm auth: This setting enables the authentication key of the role's users to be used for rest requests.
+Read Only: This allows the user to browse events that his organisation has access to, but doesn't allow any changes to be made to the database.
+Manage My Own Events: The second option, gives its users rights to create, modify or delete their own events, but they cannot publish them.
+Manage Organization Events: allows users to create events or modify and delete events created by a member of their organisation.
+Manage & Publish Organisation Events: This last setting, gives users the right to do all of the above and also to publish the events of their organisation.
+Perm sync: This setting allows the users of the role to be used as a synchronisation user. The authentication key of this user can be handed out to the administrator of a remote MISP instance to allow the synchronisation features to work.
+Perm admin: Gives the user administrator privileges, this setting is used for the organisation admins.
+Perm audit: Grants access to the logs. With the exception of site admins, only logs generated by the user's own org are visible.
+Perm auth: This setting enables the authentication key of the role's users to be used for rest requests.

Creating roles:

When creating a new role, you will have to enter a name for the role to be created and set up the permissions (as described above) using the radio toggle and the four check-boxes.

Listing roles:

@@ -121,26 +121,26 @@ By clicking on the List Roles button, you can view a list of all the currently r Users with audit permissions are able to browse or search the logs that MISP automatically appends each time certain actions are taken (actions that modify data or if a user logs in and out).
Generally, the following actions are logged:

Browsing the logs:

Listing all the log entries will show the following columns generated by the users of your organisation (or all organisations in the case of site admins):
List logs
\ No newline at end of file diff --git a/app/View/Pages/documentation.ctp b/app/View/Pages/documentation.ctp index f18050d6a..fc7d85796 100644 --- a/app/View/Pages/documentation.ctp +++ b/app/View/Pages/documentation.ctp @@ -55,22 +55,22 @@
Sync Actions
Administration
Audit

The left bar

This bar changes based on each page-group. The blue selection shows you what page you are on.

diff --git a/app/View/ShadowAttributes/edit.ctp b/app/View/ShadowAttributes/edit.ctp new file mode 100644 index 000000000..beeca67fe --- /dev/null +++ b/app/View/ShadowAttributes/edit.ctp @@ -0,0 +1,173 @@ +
+Form->create('ShadowAttribute');?> +
+ + Form->input('id'); + echo $this->Form->input('category', array( + 'empty' => '(choose one)', + 'div' => 'input', + )); + if (!$attachment) { + echo $this->Form->input('type', array( + 'empty' => '(first choose category)' + )); + } + ?> +
+ Form->input('value', array( + 'type' => 'textarea', + 'error' => array('escape' => false), + 'class' => 'input-xxlarge clear' + )); + ?> +
+ Form->input('batch_import', array( + 'type' => 'checkbox', + )); + echo $this->Form->input('to_ids', array( + 'checked' => true, + 'label' => 'IDS Signature?', + )); + // link an onchange event to the form elements + $this->Js->get('#ShadowAttributeCategory')->event('change', 'formCategoryChanged("#ShadowAttributeCategory")'); + $this->Js->get('#ShadowAttributeType')->event('change', 'showFormInfo("#ShadowAttributeType")'); + ?> +
+Form->button('Propose', array('class' => 'btn btn-primary')); + echo $this->Form->end(); +?> +
+
+ +
+ + +Js->writeBuffer(); // Write cached scripts \ No newline at end of file diff --git a/app/webroot/img/doc/publish.png b/app/webroot/img/doc/publish.png index 11a1ffc7270b3726ea8f022678a87129b1599fc2..7d07521f4b06be080e698549cae7191aa331615a 100644 GIT binary patch literal 5280 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