pydradis3 0.2.3
Update of pydradis for Python3 plus some optimizations

PyDradis
=======
<h3>
Dradis API Python Wrapper 0.2.3
</h3>

Updated by GoVanguard. Originally created by Novacoast.

License
-
Pydradis3 is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Pydradis3 is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with Pydradis.  If not, see <http://www.gnu.org/licenses/>.

Usage Example
-
This is a wrapper for the [Dradis Pro API](http://securityroots.com/dradispro/support/guides/rest_api/index.html)

Install by either pulling from this repo or using:
```
pip install pydradis3
```
Setup:

```python
from pydradis3 import Pydradis3

debug = True #Do you want to see debug info?
verify = True #Force ssl certificate verification?
pd = Pydradis3("<DRADIS API KEY>","<DRADIS SERVER URL>",debug,verify)

```

All endpoints have 6 functions that work roughly the same:

- *Get:* Given an element id, returns the element info.

- *Get Lists:* Returns list of Clients, Projects, etc..

- *Create:* Creates elements and returns their id.

- *Update:* Updates elements and returns their id.

- *Delete:* Deletes elements and returns True if successful.

- *Find:* Given keyword(s), return a list of possible elements.

<h4>Client Endpoint</h4>

- get_clientlist()
```python
>>> pd.get_clientlist()
[[u'NASA', 2], [u'ACME Inc.', 5]]
```

- get_client(int client_id)
```python
>>> pd.get_client(2)
{u'client_since': u'2016-08-29', u'name': u'NASA', u'created_at': u'2016-08-29T05:43:47.000Z', u'updated_at': u'2016-08-29T05:44:30.000Z', u'id': 3, u'projects': [{u'id': 6, u'name': u'Internal Pentest #1'}]}
```

- create_client(string client_name)
```python
>>> pd.create_client("Wayne Industries")
42
```

- update_client(string client_name)
```python
>>> pd.update_client("Wayne Corp.")
42
```

- find_client(string client_name)
```python
>>> pd.find_client("Wayne Corp.")
42
```

- delete_client(int client_id)
```python
>>> pd.delete_client(42)
True
```

<h4>Project Endpoint</h4>

- get_projectlist()
```python
>>> pd.get_projectlist()
[[u'Project X', 10],[u'WikiTesting', 7], [u'Project B-25', 1], [u'Internal Pentest', 2]]
```

- get_project(int project_id)
```python
>>> pd.get_project(10)
{u'owners': [{u'email': u'pedro@example.com'}], u'name': u'Project X', u'created_at': u'2016-04-20T23:49:40.000Z', u'updated_at': u'2016-06-29T16:10:06.000Z', u'authors': [{u'email': u'pedro@example.com'}], u'id': 10}
```

- create_project(string project_name, int client_id=None)
```python
>>> pd.create_project("Project T",2)
26
```

- update_project(int project_id, string project_name, int new_client_id)
```python
>>> pd.update_project(26,"Project T1",42)
26
```

- find_project(string project_name)
```python
>>> pd.find_project("Project T1")
26
```

- delete_project(int project_id)
```python
>>> pd.delete_project(10)
True
```

<h4>Node Endpoint</h4>

- get_nodelist(int project_id)
```python
>>> pd.get_nodelist(1)
[[u'Dradis Professional Edition', 1], [u'Welcome', 2], [u'Getting Help', 3], [u"What's next?", 4]]
```

- get_node(int project_id, int node_id)
```python
>>> pd.get_node(1,1)
{u'type_id': 0, u'created_at': u'2012-06-09T10:25:57.000Z', u'updated_at': u'2014-03-12T14:19:37.000Z', u'label': u'Dradis Professional Edition', u'parent_id': None, u'notes': [{u'fields': {u'Title': u'Test Note #1'}, u'category_id': 6, u'text': u'#[Title]#\nTest Note #1', u'id': 1, u'title': u'Test Note #1'}], u'position': 0, u'evidence': [], u'id': 1}
```

- create_node(int project_id, string label, int type_id=0, int parent_id=None, position=1)
```python
>>> pd.create_node(1,"Testing #2",0,None,1)
590
```

- update_node(int project_id, int node_id, string label=None, int type_id=None, int parent_id=None, position=None)
```python
>>> pd.update_node(1,590,"Testing #2 - Mod",0,1,0)
590
```

- find_node(int project_id, string nodepath)
```python
>>> pd.find_node(1,"Dradis Professional Edition/Testing #2 - Mod")
590
```


- delete_node(int project_id, int node_id)
```python
>>> pd.delete_node(1,590)
True
```

<h4>Issues Endpoint</h4>

- get_issuelist(int project_id)
```python
>>> pd.get_issuelist(1)
[[u'Firewall Issue', 414], [u'Problem #1', 413]]
```

- get_issue(int project_id, int issue_id)
```python
>>> pd.get_issue(1,414)
{u'title': u'Firewall Issue', u'fields': {u'Description': u'The firewall is turned off', u'Title': u'Firewall Issue'}, u'created_at': u'2016-06-30T16:07:10.000Z', u'updated_at': u'2016-06-30T16:07:10.000Z', u'text': u'#[Title]#\r\nFirewall Issue\r\n\r\n#[Description]#\r\nThe firewall is turned off\r\n\r\n', u'id': 414}
```

- create_issue(int project_id, string title, string text, string[] tags=[])
```python
>>> pd.create_issue(1,"Main router issue", "Main router uses default admin & password", ["Internal","Networking"])
415
```

- update_issue(int project_id, int issue_id, string title, string text, string[] tags=[])
```python
>>> pd.update_issue(1,415,"Main router credentials", "Admin=root and password=abc123 ", ["Internal","Networking","Tag A"])
415
```

- find_issue(int project_id, string[] keywords)
```python
#Use with single keyword
>>> pd.find_issue(1,"router")
[[u'Main router credentials', 415]]
#Use with keyword list
>>> pd.find_issue(1,["issue","problem"])
[[u'Firewall Issue', 414], [u'Problem #1', 413]]
```

- delete_issue(int project_id, int issue_id)
```python
>>> pd.delete_issue(414)
True
```


<h4>Evidence Endpoint</h4>

- get_evidencelist(int project_id, int node_id)
```python
>>> pd.get_evidencelist(1,1)
[{u'content': u'#[Title]#\r\nFingerprints\r\n\r\n#[Description]#\r\nFoo Foo\r\n\r\n#[Tag B]#\r\n', u'fields': {u'Tag B': u'', u'Label': u'Dradis Professional Edition', u'Description': u'Foo Foo', u'Title': u'Fingerprints'}, u'issue': {u'url': u'https://dradis.waynecorp.at/pro/api/issues/415', u'id': 415, u'title': u'Main router credentials'}, u'id': 47}]
```

- get_evidence(int project_id, int node_id, int evidence_id)
```python
>>> pd.get_evidence(1,1,47)
{u'content': u'#[Title]#\r\nFingerprints\r\n\r\n#[Description]#\r\nFoo Foo\r\n\r\n#[Tag B]#\r\n', u'fields': {u'Tag B': u'', u'Label': u'Dradis Professional Edition', u'Description': u'Foo Foo', u'Title': u'Fingerprints'}, u'issue': {u'url': u'https://dradis.waynecorp.at/pro/api/issues/415', u'id': 415, u'title': u'Main router credentials'}, u'id': 47}
```

- create_evidence(int project_id, int node_id, int issue_id, string title, string text, string[] tags=[])
```python
>>> pd.create_evidence(1,1,415,"Some Evidence", "More Info",["Tag A"])
48
```

- update_evidence(int project_id, int node_id, int issue_id, int evidence_id, string title, string text, string[] tags=[])
```python
>>> pd.update_evidence(1,1,415,46,"Some Evidence #2", "More Info",["Internal"])
46
```

- find_evidence(int project_id, node_id, string[] keywords)
```python
>>> pd.find_evidence(1,1,["evidence #2"])
[{u'content': u'#[Title]#\r\nSome Evidence #2\r\n\r\n#[Description]#\r\nMore Info\r\n\r\n#[Internal]#\r\n', u'fields': {u'Internal': u'', u'Label': u'Dradis Professional Edition', u'Description': u'More Info', u'Title': u'Some Evidence #2'}, u'issue': {u'url': u'https://dradis.waynecorp.at/pro/api/issues/415', u'id': 415, u'title': u'Main router credentials'}, u'id': 46}]
```

- delete_evidence(int project_id, node_id, evidence_id)
```python
>>> pd.delete_evidence(1,1,46)
True
```

<h4>Note Endpoint</h4>

- get_notelist(int project_id, int node_id)
```python
>>> pd.get_notelist(1,1)
[[u'Use the tree on the left to browse through the items in this project.', 1], [u'Ready to try the new interface?', 2]]
```

- get_note(int project_id, int node_id, int note_id)
```python
pd.get_note(1,1,1)
{u'fields': {u'Title': u'Use the tree on the left to browse through the items in this project.'}, u'category_id': 6, u'text': u'#[Title]#\nUse the tree on the left to browse through the items in this project.', u'id': 1, u'title': u'Use the tree on the left to browse through the items in this project.'}
```

- create_note(int project_id, int node_id, string title, string text, string[] tags=[], category=0)
```python
>>>pd.create_note(1,1,"Possible Hosts", "foo.com, foo.org and foo.net",["External","OSINT"],0)
416
```

- update_note(int project_id, int node_id, int note_id, string title, string text, string[] tags=[], category=1)
```python
>>> pd.update_note(1,1,416," Possible Vulnerable Hosts", "foo.com, foo.org, foo.net, and foo.io",["External","OSINT"],1)
416
```

- find_note(int project_id, int node_id, string[] keywords)
```python
>>> pd.find_note(1,1,["foo.org","foo.net"])
[[u'Vulnerable Host', 416]
```

- delete_note(int project_id, int node_id, int note_id)
```python
>>> pd.delete_note(1,1,416)
True
```

<h4>Attachment Endpoint</h4>

- get_attachmentlist(int project_id, int node_id)
```python
>>> pd.get_attachmentlist(1,358)
[[u'screenshot.png', u'/pro/nodes/358/attachments/screenshot.png'], [u'test.py', u'/pro/nodes/358/attachments/test.py']]
```

- get_attachment(int projectid, int nodeid, string attachment_name, string output_name=None)
```python
>>> pd.get_attachment(1,358,"screenshot.png","downloads/screenshot01.png")
True #This means it succesfully downloaded file to downloads/screenshot01.png
```

- pd.post_attachment(int projectid, int nodeid, string attachment_filename)
```python
>>> pd.post_attachment(1,358,"important.txt")
[u'important.txt', u'/pro/nodes/358/attachments/important.txt']
```

- pd.rename_attachment(int projectid, int nodeid, string attachment_name, string new_attachment_name)
```python
>>> pd.rename_attachment(1,358,"important.txt","super_important.txt")
[u'super_important.txt', u'/pro/nodes/358/attachments/super_important.txt']
```

- pd.delete_attachment(int projectid, int nodeid, string attachment_name)
```python
>>> pd.delete_attachment(1,358,"important.txt")
True
```