diff --git a/a.a-widget-dev/content.tex b/a.a-widget-dev/content.tex new file mode 100644 index 0000000..40d55ea --- /dev/null +++ b/a.a-widget-dev/content.tex @@ -0,0 +1,204 @@ +% DO NOT COMPILE THIS FILE DIRECTLY! +% This is included by the other .tex files. + +\lstdefinelanguage{json}{ + basicstyle=\ttfamily\footnotesize, + numbers=left, + numberstyle=\ttfamily\footnotesize, + stepnumber=1, + numbersep=8pt, + showstringspaces=false, + breaklines=true, + frame=lines, + title=\lstname, + backgroundcolor=\color{background}, + literate= + *{0}{{{\color{numb}0}}}{1} + {1}{{{\color{numb}1}}}{1} + {2}{{{\color{numb}2}}}{1} + {3}{{{\color{numb}3}}}{1} + {4}{{{\color{numb}4}}}{1} + {5}{{{\color{numb}5}}}{1} + {6}{{{\color{numb}6}}}{1} + {7}{{{\color{numb}7}}}{1} + {8}{{{\color{numb}8}}}{1} + {9}{{{\color{numb}9}}}{1}, +} + + +\begin{frame} +\titlepage +\end{frame} + +\begin{frame} + \frametitle{Dashboard in MISP} + \begin{itemize} + \item User configured simple dashboard interface + \item {\bf Visualise}, {\bf aggregate} and {\bf track} data important to you + \item Brand new feature, still undergoing reworks + \end{itemize} + \begin{center} + \includegraphics[scale=0.18]{dashboard_small.png} + \end{center} +\end{frame} + +\begin{frame} + \frametitle{The internals of a widget} + \begin{itemize} + \item The widget file itself + \begin{itemize} + \item Acts as the backend for the widget, full access to all MISP internals + \item Load data, convert it to a format easily represented by the appropriate views + \item Controls the default settings of the widget - size, name, behaviours + \item Only main function required to be implemented: handler() + \item Optional recognised function: checkPermissions() for ACL + \end{itemize} + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{The internals of the widget} + \begin{itemize} + \item {\bf Backend} for the widget, full access to all MISP internals + \item {\bf Load, convert, format} to be represented via view widgets + \item {\bf Widget metadata} - size, name, description, behaviours + \item Only main function required to be implemented: {\bf handler()} + \item Optional: {\bf checkPermissions() for ACL} + \item Accepts {\bf user configuration} for which a template can be provided + \item Located in /var/www/MISP/app/Lib/Dashboard/ + \item Custom widgets can be placed in /var/www/MISP/app/Lib/Dashboard/Custom/ + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{The view layer of a widget} + \begin{itemize} + \item View files are included by default and reusable + \item Currently we have a small but growing list of views + \begin{itemize} + \item BarChart + \item SimpleList + \item WorldMap + \end{itemize} + \item Converts the data passed by the Widget logic to HTML + \item Located in /var/www/MISP/view/Elements/dashboard/Widgets/ + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Widget behaviours} + \begin{itemize} + \item Widgets can additionally be tied to certain {\bf behaviours} + \item Caching + \begin{itemize} + \item Executions of the widget logic are cached + \item {\bf Separate caches for each organisation in addition to site admins} + \item Cache duration is controlled by the widget logic + \end{itemize} + \item Refresh + \begin{itemize} + \item Widgets can be set to refresh after x seconds + \end{itemize} + \item Both of these should be used with special care in regards to the use of {\bf system resources} + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Exercise module: simple Whoami} + \begin{itemize} + \item Let's start with a skeleton + \item Create /var/www/MISP/app/Lib/Dashboard/Custom/WhoamiWidget.php + \item MISP will parse anything ending with Widget.php in this directory + \end{itemize} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Exercise module: simple Whoami} + \begin{adjustbox}{width=\textwidth,height=8cm,keepaspectratio} + \begin{lstlisting}[language=json,firstnumber=1] +Log = ClassRegistry::init('Log'); + $entries = $this->Log->find('all', array( + 'recursive' => -1, + 'conditions' => array( + 'action' => 'login', 'user_id' => $user['id'] + ), + 'order' => 'id desc', + 'limit' => 5, + 'fields' => array('created', 'ip') + )); + foreach ($entries as &$entry) { + $entry = $entry['Log']['created'] . ' --- ' . + ( + empty($entry['Log']['ip']) ? + 'IP not logged' : + $entry['Log']['ip'] + ); + } + return array( + array('title' => 'Email', 'value' => $user['email']), + array( + 'title' => 'Role', 'value' => $user['Role']['name'] + ), + array( + 'title' => 'Organisation', + 'value' => $user['Organisation']['name'] + ), + array( + 'title' => 'IP', 'value' => $_SERVER['REMOTE_ADDR'] + ), + array('title' => 'Last logins', 'value' => $entries) + ); +} + \end{lstlisting} + \end{adjustbox} +\end{frame} + +\begin{frame} + \frametitle{Result} + \begin{center} + \includegraphics[scale=0.5]{whoami.png} + \end{center} +\end{frame} + diff --git a/a.a-widget-dev/dashboard_small.png b/a.a-widget-dev/dashboard_small.png new file mode 100644 index 0000000..5c1f949 Binary files /dev/null and b/a.a-widget-dev/dashboard_small.png differ diff --git a/a.a-widget-dev/logo-circl.pdf b/a.a-widget-dev/logo-circl.pdf new file mode 100755 index 0000000..62c9239 Binary files /dev/null and b/a.a-widget-dev/logo-circl.pdf differ diff --git a/a.a-widget-dev/lolphp.jpg b/a.a-widget-dev/lolphp.jpg new file mode 100644 index 0000000..7d174c6 Binary files /dev/null and b/a.a-widget-dev/lolphp.jpg differ diff --git a/a.a-widget-dev/misp.pdf b/a.a-widget-dev/misp.pdf new file mode 100644 index 0000000..f7a3f9d Binary files /dev/null and b/a.a-widget-dev/misp.pdf differ diff --git a/a.a-widget-dev/misplogo.pdf b/a.a-widget-dev/misplogo.pdf new file mode 100755 index 0000000..60da568 Binary files /dev/null and b/a.a-widget-dev/misplogo.pdf differ diff --git a/a.a-widget-dev/nibbler.jpg b/a.a-widget-dev/nibbler.jpg new file mode 100644 index 0000000..bf67959 Binary files /dev/null and b/a.a-widget-dev/nibbler.jpg differ diff --git a/a.a-widget-dev/nibbler_rest_client.png b/a.a-widget-dev/nibbler_rest_client.png new file mode 100644 index 0000000..fbf966d Binary files /dev/null and b/a.a-widget-dev/nibbler_rest_client.png differ diff --git a/a.a-widget-dev/slide.tex b/a.a-widget-dev/slide.tex new file mode 100644 index 0000000..9ce3f93 --- /dev/null +++ b/a.a-widget-dev/slide.tex @@ -0,0 +1,33 @@ +\documentclass{beamer} +\usetheme[numbering=progressbar]{focus} +\definecolor{main}{RGB}{47, 161, 219} +\definecolor{textcolor}{RGB}{128, 128, 128} +\definecolor{background}{RGB}{240, 247, 255} +\definecolor{delim}{RGB}{20,105,176} +\colorlet{punct}{red!60!black} +\colorlet{numb}{magenta!60!black} + + + +\usepackage[utf8]{inputenc} +\usepackage{tikz} +\usepackage{listings} +\usepackage{adjustbox} +\usetikzlibrary{positioning} +\usetikzlibrary{shapes,arrows} +%\usepackage[T1]{fontenc} +%\usepackage[scaled]{beramono} + +\author{\small{\input{../includes/authors.txt}}} + +\title{Extending MISP with Python modules} +\subtitle{MISP - Threat Sharing} +\institute{\href{http://www.misp-project.org/}{http://www.misp-project.org/} \\ Twitter: \emph{\href{https://twitter.com/mispproject}{@MISPProject}}} +\date{\input{../includes/location.txt}} +\titlegraphic{\includegraphics[scale=0.85]{misp.pdf}} + + +\begin{document} +\include{content} +\end{document} + diff --git a/a.a-widget-dev/whoami.png b/a.a-widget-dev/whoami.png new file mode 100644 index 0000000..76628f3 Binary files /dev/null and b/a.a-widget-dev/whoami.png differ diff --git a/a.a-widget-dev/x-isac-logo.png b/a.a-widget-dev/x-isac-logo.png new file mode 100755 index 0000000..21c68bc Binary files /dev/null and b/a.a-widget-dev/x-isac-logo.png differ