Projects STRLCPY gophish Commits 6f81f1f2
🤬
  • Making the results map an optional setting stored in localStorage. Fixes #747 Also does more formatting fixes for various files.

  • Loading...
  • Jordan Wright committed 7 years ago
    6f81f1f2
    1 parent c49474fd
Revision indexing in progress... (symbol navigation in revisions will be accurate after indexed)
  • static/css/dist/gophish.css
    Unable to diff as some line is too long.
  • ■ ■ ■ ■ ■ ■
    static/css/main.css
    1 1  .nav-tabs {
    2  - cursor:pointer;
     2 + cursor: pointer;
    3 3  }
     4 + 
    4 5  .datatable_hidden {
    5  - display:none;
     6 + display: none;
    6 7  }
    7  - .navbar-logo {
    8  - margin: 4px 0px;
    9  - float: left;
    10  - }
    11  - #navbar-login {
    12  - padding-top:8px;
    13  - padding-bottom:0px;
    14  - }
    15  - #navbar-dropdown {
    16  - margin-top:6px;
    17  - margin-right:15px;
    18  - }
    19  - .sans {
    20  - font-family:'Open Sans', sans-serif !important;
    21  - }
    22  - .label {
    23  - font-family:'Roboto', sans-serif !important;
    24  - }
    25  - .form-signin {
    26  - max-width: 400px;
    27  - padding: 15px;
    28  - margin: 40px auto 0px auto;
    29  - }
    30  - ul .dropdown-menu .ng-isolate-scope {
     8 + 
     9 +.navbar-logo {
     10 + margin: 4px 0px;
     11 + float: left;
     12 +}
     13 + 
     14 +#navbar-login {
     15 + padding-top: 8px;
     16 + padding-bottom: 0px;
     17 +}
     18 + 
     19 +#navbar-dropdown {
     20 + margin-top: 6px;
     21 + margin-right: 15px;
     22 +}
     23 + 
     24 +.sans {
     25 + font-family: 'Open Sans', sans-serif !important;
     26 +}
     27 + 
     28 +.label {
     29 + font-family: 'Roboto', sans-serif !important;
     30 +}
     31 + 
     32 +.form-signin {
     33 + max-width: 400px;
     34 + padding: 15px;
     35 + margin: 40px auto 0px auto;
     36 +}
     37 + 
     38 +ul .dropdown-menu .ng-isolate-scope {
    31 39   visibility: visible;
    32  - display:block;
     40 + display: block;
    33 41   opacity: 1;
    34  - }
    35  - #login-button{
    36  - padding:10px 15px;
    37  - }
    38  - .form-signin-heading {
    39  - text-align:center;
    40  - }
    41  - .form-signin .form-signin-heading, .form-signin .checkbox {
    42  - margin-bottom: 10px;
    43  - }
    44  - .form-signin .checkbox {
    45  - font-weight: normal;
    46  - }
    47  - .form-signin .form-control {
    48  - font-family:'Open Sans', sans-serif;
    49  - position: relative;
    50  - font-size: 16px;
    51  - height: auto;
    52  - padding: 10px;
    53  - -webkit-box-sizing: border-box;
    54  - -moz-box-sizing: border-box;
    55  - box-sizing: border-box;
    56  - }
    57  - .form-signin .form-control:focus {
    58  - z-index: 2;
    59  - }
    60  - .form-signin .top-input {
    61  - margin-bottom: -1px;
    62  - border-bottom-left-radius: 0;
    63  - border-bottom-right-radius: 0;
    64  - }
    65  - .form-signin .middle-input {
    66  - margin-bottom: -1px;
    67  - border-top-left-radius: 0;
    68  - border-top-right-radius: 0;
    69  - border-bottom-left-radius: 0;
    70  - border-bottom-right-radius: 0;
    71  - }
    72  - .form-signin .bottom-input {
    73  - margin-bottom: 10px;
    74  - border-top-left-radius: 0;
    75  - border-top-right-radius: 0;
    76  - }
    77  - #logo {
    78  - display: block;
    79  - margin-left: auto;
    80  - margin-right: auto;
    81  - }
    82  - footer > p {
    83  - color:#444444;
    84  - font-family:'Open Sans', sans-serif;
    85  - }
    86  - .header {
    87  - margin-top:10px;
    88  - }
    89  - .sidebar {
    90  - padding-left:0px;
    91  - }
    92  - .sidebar a {
    93  - color:#201e1c;
    94  - }
    95  - .sidebar a:hover {
    96  - color:#201e1c;
    97  - }
    98  - .api_heading {
    99  - font-family:'Open Sans', sans-serif;
    100  - background-color:#201e1c;
    101  - border-radius: 5px;
    102  - padding:10px;
    103  - color:#E2E2E2;
    104  - width:100%;
    105  - }
    106  - p {
    107  - font-size:1.2em;
    108  - }
     42 +}
     43 + 
     44 +#login-button {
     45 + padding: 10px 15px;
     46 +}
     47 + 
     48 +.form-signin-heading {
     49 + text-align: center;
     50 +}
     51 + 
     52 +.form-signin .form-signin-heading,
     53 +.form-signin .checkbox {
     54 + margin-bottom: 10px;
     55 +}
     56 + 
     57 +.form-signin .checkbox {
     58 + font-weight: normal;
     59 +}
     60 + 
     61 +.form-signin .form-control {
     62 + font-family: 'Open Sans', sans-serif;
     63 + position: relative;
     64 + font-size: 16px;
     65 + height: auto;
     66 + padding: 10px;
     67 + -webkit-box-sizing: border-box;
     68 + -moz-box-sizing: border-box;
     69 + box-sizing: border-box;
     70 +}
     71 + 
     72 +.form-signin .form-control:focus {
     73 + z-index: 2;
     74 +}
     75 + 
     76 +.form-signin .top-input {
     77 + margin-bottom: -1px;
     78 + border-bottom-left-radius: 0;
     79 + border-bottom-right-radius: 0;
     80 +}
     81 + 
     82 +.form-signin .middle-input {
     83 + margin-bottom: -1px;
     84 + border-top-left-radius: 0;
     85 + border-top-right-radius: 0;
     86 + border-bottom-left-radius: 0;
     87 + border-bottom-right-radius: 0;
     88 +}
     89 + 
     90 +.form-signin .bottom-input {
     91 + margin-bottom: 10px;
     92 + border-top-left-radius: 0;
     93 + border-top-right-radius: 0;
     94 +}
     95 + 
     96 +#logo {
     97 + display: block;
     98 + margin-left: auto;
     99 + margin-right: auto;
     100 +}
     101 + 
     102 +footer>p {
     103 + color: #444444;
     104 + font-family: 'Open Sans', sans-serif;
     105 +}
     106 + 
     107 +.header {
     108 + margin-top: 10px;
     109 +}
     110 + 
     111 +.sidebar {
     112 + padding-left: 0px;
     113 +}
     114 + 
     115 +.sidebar a {
     116 + color: #201e1c;
     117 +}
     118 + 
     119 +.sidebar a:hover {
     120 + color: #201e1c;
     121 +}
     122 + 
     123 +.api_heading {
     124 + font-family: 'Open Sans', sans-serif;
     125 + background-color: #201e1c;
     126 + border-radius: 5px;
     127 + padding: 10px;
     128 + color: #E2E2E2;
     129 + width: 100%;
     130 +}
     131 + 
     132 +p {
     133 + font-size: 1.2em;
     134 +}
    109 135   
    110  - .form-label {
    111  - padding-top:7px;
    112  - }
     136 +.form-label {
     137 + padding-top: 7px;
     138 +}
    113 139   
    114  - .hover {
     140 +.hover {
    115 141   visibility: visible;
    116  - }
     142 +}
    117 143   
    118  - .edit-button {
    119  - display:none;
    120  - }
     144 +.edit-button {
     145 + display: none;
     146 +}
    121 147   
    122  - .editable-row:hover .edit-button {
    123  - display : inline-block;
     148 +.editable-row:hover .edit-button {
     149 + display: inline-block;
    124 150   padding: 3px 6px;
    125  - font-size:9px;
    126  - }
     151 + font-size: 9px;
     152 +}
    127 153   
    128  - .remove-row {
    129  - float:right;
    130  - cursor:pointer;
    131  - }
     154 +.remove-row {
     155 + float: right;
     156 + cursor: pointer;
     157 +}
    132 158   
    133  - .pagination {
    134  - margin:0px;
    135  - }
     159 +.pagination {
     160 + margin: 0px;
     161 +}
    136 162   
    137 163  @media (min-width: 992px) {
    138  - .modal-dialog {
    139  - width: 700px;
    140  - }
     164 + .modal-dialog {
     165 + width: 700px;
     166 + }
    141 167  }
    142 168   
    143  -.dropdown-menu > li > a {
    144  - cursor:pointer;
     169 +.dropdown-menu>li>a {
     170 + cursor: pointer;
    145 171  }
    146 172   
    147 173  .btn-file {
    148 174   position: relative;
    149 175   overflow: hidden;
    150 176  }
     177 + 
    151 178  .btn-file input[type=file] {
    152 179   position: absolute;
    153 180   top: 0;
    skipped 8 lines
    162 189   cursor: inherit;
    163 190   display: block;
    164 191  }
     192 + 
    165 193  .typeahead {
    166  - border-left-radius:6px !important;
    167  - float:none !important;
     194 + border-left-radius: 6px !important;
     195 + float: none !important;
    168 196  }
     197 + 
    169 198  .tt-query {
    170  - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    171  - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    172  - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
     199 + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
     200 + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
     201 + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    173 202  }
     203 + 
    174 204  .tt-hint {
    175  - color: #999
     205 + color: #999
    176 206  }
     207 + 
    177 208  .tt-menu {
    178  - width: 422px;
    179  - margin-top: 4px;
    180  - padding: 4px 0;
    181  - background-color: #fff;
    182  - border: 1px solid #ccc;
    183  - border: 1px solid rgba(0, 0, 0, 0.2);
    184  - -webkit-border-radius: 4px;
    185  - -moz-border-radius: 4px;
    186  - border-radius: 4px;
    187  - -webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);
    188  - -moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);
    189  - box-shadow: 0 5px 10px rgba(0,0,0,.2);
     209 + width: 422px;
     210 + margin-top: 4px;
     211 + padding: 4px 0;
     212 + background-color: #fff;
     213 + border: 1px solid #ccc;
     214 + border: 1px solid rgba(0, 0, 0, 0.2);
     215 + -webkit-border-radius: 4px;
     216 + -moz-border-radius: 4px;
     217 + border-radius: 4px;
     218 + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
     219 + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
     220 + box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
    190 221  }
     222 + 
    191 223  .tt-suggestion {
    192  - padding: 3px 20px;
    193  - line-height: 24px;
     224 + padding: 3px 20px;
     225 + line-height: 24px;
    194 226  }
     227 + 
    195 228  .tt-suggestion.tt-cursor {
    196  - color: #fff;
    197  - background-color: #0097cf;
     229 + color: #fff;
     230 + background-color: #0097cf;
     231 +}
    198 232   
    199  -}
    200 233  .tt-suggestion p {
    201  - margin: 0;
     234 + margin: 0;
    202 235  }
     236 + 
    203 237  .typeahead-button {
    204  - line-height:1.39 !important;
     238 + line-height: 1.39 !important;
    205 239  }
    206 240   
    207 241  .ct-point {
    208  - cursor:pointer;
     242 + cursor: pointer;
    209 243  }
    210 244   
    211  -.ct-timeline-point{
    212  - cursor:pointer;
    213  - stroke:#ffffff;
    214  - stroke-width:1px;
     245 +.ct-timeline-point {
     246 + cursor: pointer;
     247 + stroke: #ffffff;
     248 + stroke-width: 1px;
    215 249  }
    216 250   
    217 251  .ct-point-sending {
    218  - fill:#428bca !important;
     252 + fill: #428bca !important;
    219 253  }
    220 254   
    221 255  .ct-point-error {
    222  - fill:#6c7a89 !important;
     256 + fill: #6c7a89 !important;
    223 257  }
    224 258   
    225 259  .ct-point-clicked {
    226  - fill:#F39C12 !important;
     260 + fill: #F39C12 !important;
    227 261  }
    228 262   
    229 263  .ct-point-opened {
    230  - fill:#f9bf3b !important;
     264 + fill: #f9bf3b !important;
    231 265  }
    232 266   
    233 267  .ct-point-sent {
    234  - fill:#1abc9c !important;
     268 + fill: #1abc9c !important;
    235 269  }
    236 270   
    237 271  .ct-point-success {
    238  - fill:#f05b4f !important;
     272 + fill: #f05b4f !important;
    239 273  }
    240 274   
    241  -.chartist-tooltip{
    242  - position:absolute;
    243  - display:inline-block;
    244  - min-width:5em;
    245  - padding:.5em;
    246  - background:#283F50;
    247  - color:#ffffff;
    248  - font-weight:700;
    249  - text-align:center;
    250  - pointer-events:none;
    251  - z-index:1;
    252  - margin-left:1.25em;
     275 +.chartist-tooltip {
     276 + position: absolute;
     277 + display: inline-block;
     278 + min-width: 5em;
     279 + padding: .5em;
     280 + background: #283F50;
     281 + color: #ffffff;
     282 + font-weight: 700;
     283 + text-align: center;
     284 + pointer-events: none;
     285 + z-index: 1;
     286 + margin-left: 1.25em;
    253 287   font-size: .75em;
    254 288   border-radius: 4px;
    255 289  }
    256 290   
    257  -.chartist-pie-tooltip{
    258  - position:absolute;
    259  - display:inline-block;
    260  - min-width:5em;
    261  - padding:.5em;
    262  - background:#283F50;
    263  - color:#ffffff;
    264  - font-weight:700;
    265  - text-align:center;
    266  - pointer-events:none;
    267  - z-index:1;
    268  - margin-left:1.25em;
     291 +.chartist-pie-tooltip {
     292 + position: absolute;
     293 + display: inline-block;
     294 + min-width: 5em;
     295 + padding: .5em;
     296 + background: #283F50;
     297 + color: #ffffff;
     298 + font-weight: 700;
     299 + text-align: center;
     300 + pointer-events: none;
     301 + z-index: 1;
     302 + margin-left: 1.25em;
    269 303   font-size: .75em;
    270 304   border-radius: 4px;
    271 305  }
    272 306   
    273  -.chartist-tooltip:after{
    274  - content:"";
    275  - position:absolute;
    276  - top:100%;
    277  - left:50%;
    278  - width:0;
    279  - height:0;
    280  - margin-left:-15px;
    281  - border:15px solid transparent;
    282  - border-top-color:#283F50
     307 +.chartist-tooltip:after {
     308 + content: "";
     309 + position: absolute;
     310 + top: 100%;
     311 + left: 50%;
     312 + width: 0;
     313 + height: 0;
     314 + margin-left: -15px;
     315 + border: 15px solid transparent;
     316 + border-top-color: #283F50
    283 317  }
    284 318   
    285 319  .chartist-chart {
    286  - height:175px;
     320 + height: 175px;
    287 321  }
    288 322   
    289 323  .chartist-legend {
    290  - list-style: none;
    291  - position: absolute;
    292  - padding-left:0px;
    293  - top: 0;
     324 + list-style: none;
     325 + position: absolute;
     326 + padding-left: 0px;
     327 + top: 0;
    294 328  }
     329 + 
    295 330  .chartist-legend li {
    296  - display: block;
    297  - position: relative;
    298  - margin-bottom: 4px;
    299  - border-radius: 5px;
    300  - padding: 2px 8px 2px 8px;
    301  - font-size: 14px;
    302  - cursor: default;
    303  - -webkit-transition: background-color 200ms ease-in-out;
    304  - -moz-transition: background-color 200ms ease-in-out;
    305  - -o-transition: background-color 200ms ease-in-out;
    306  - transition: background-color 200ms ease-in-out;
     331 + display: block;
     332 + position: relative;
     333 + margin-bottom: 4px;
     334 + border-radius: 5px;
     335 + padding: 2px 8px 2px 8px;
     336 + font-size: 14px;
     337 + cursor: default;
     338 + -webkit-transition: background-color 200ms ease-in-out;
     339 + -moz-transition: background-color 200ms ease-in-out;
     340 + -o-transition: background-color 200ms ease-in-out;
     341 + transition: background-color 200ms ease-in-out;
    307 342  }
     343 + 
    308 344  .chartist-legend li span {
    309  - display: inline-block;
    310  - vertical-align:middle;
    311  - width: 20px;
    312  - height: 20px;
    313  - margin-right:10px;
    314  - border-radius: 50%;
     345 + display: inline-block;
     346 + vertical-align: middle;
     347 + width: 20px;
     348 + height: 20px;
     349 + margin-right: 10px;
     350 + border-radius: 50%;
    315 351  }
    316 352   
    317 353  .ct-series-a .ct-slice-donut {
    318  - stroke:#1abc9c !important;
     354 + stroke: #1abc9c !important;
    319 355  }
    320 356   
    321 357  .ct-slice-donut.ct-slice-donut-error {
    322  - stroke:#6c7a89 !important;
     358 + stroke: #6c7a89 !important;
    323 359  }
    324 360   
    325  -.ct-slice-donut.ct-slice-donut-sent{
    326  - stroke:#1abc9c !important
     361 +.ct-slice-donut.ct-slice-donut-sent {
     362 + stroke: #1abc9c !important
    327 363  }
    328 364   
    329  -.ct-slice-donut.ct-slice-donut-opened{
    330  - stroke:#f9bf3b !important;
     365 +.ct-slice-donut.ct-slice-donut-opened {
     366 + stroke: #f9bf3b !important;
    331 367  }
    332 368   
    333  -.ct-slice-donut.ct-slice-donut-success{
    334  - stroke:#f05b4f !important;
     369 +.ct-slice-donut.ct-slice-donut-success {
     370 + stroke: #f05b4f !important;
    335 371  }
    336 372   
    337  -.ct-slice-donut.ct-slice-donut-clicked{
    338  - stroke:#F39C12!important;
     373 +.ct-slice-donut.ct-slice-donut-clicked {
     374 + stroke: #F39C12!important;
    339 375  }
    340 376   
    341  -.ct-slice-donut.ct-slice-donut-sending{
    342  - stroke:#428bca !important;
     377 +.ct-slice-donut.ct-slice-donut-sending {
     378 + stroke: #428bca !important;
    343 379  }
    344 380   
    345 381  .ct-legend-error {
    skipped 25 lines
    371 407  }
    372 408   
    373 409  .gophish-editor {
    374  - font-family: 'Courier New',Monospace !important;
     410 + font-family: 'Courier New', Monospace !important;
    375 411   font-size: small !important;
    376 412  }
     413 + 
    377 414  #resultsMap {
    378  - margin-top:-30px;
     415 + margin-top: -30px;
    379 416  }
     417 + 
     418 + 
    380 419  /* Handle the navbar collapse at < 1300px */
     420 + 
    381 421  @media (min-width: 768px) and (max-width: 1300px) {
    382 422   .navbar-collapse.collapse {
    383 423   display: none !important;
    skipped 1 lines
    385 425   .navbar-collapse.collapse.in {
    386 426   display: block !important;
    387 427   }
    388  - .navbar-header .collapse, .navbar-toggle {
    389  - display:block !important;
     428 + .navbar-header .collapse,
     429 + .navbar-toggle {
     430 + display: block !important;
    390 431   }
    391 432   .navbar-header {
    392  - float:none !important;
     433 + float: none !important;
    393 434   }
    394 435  }
     436 + 
     437 + 
    395 438  /* Table Styling */
     439 + 
    396 440  .modal-content .dataTable tbody td {
    397  - font-size: 16px;/* Smaller font on modal tables */
     441 + font-size: 16px;
     442 + /* Smaller font on modal tables */
    398 443  }
    399  -.dataTables_info{
    400  - font-size: 15px;
     444 + 
     445 +.dataTables_info {
     446 + font-size: 15px;
    401 447  }
    402 448   
     449 + 
    403 450  /* Sort Icons */
    404  -table.dataTable thead .sorting:after, table.dataTable thead .sorting_asc:after, table.dataTable thead .sorting_desc:after {
    405  - font-family: 'FontAwesome' !important;
    406  - position: relative !important;
    407  - display: initial !important;
    408  - top: initial!important;
    409  - right: initial!important;
    410  - left: 6px;
    411  - color: #1abc9c;
     451 + 
     452 +table.dataTable thead .sorting:after,
     453 +table.dataTable thead .sorting_asc:after,
     454 +table.dataTable thead .sorting_desc:after {
     455 + font-family: 'FontAwesome' !important;
     456 + position: relative !important;
     457 + display: initial !important;
     458 + top: initial!important;
     459 + right: initial!important;
     460 + left: 6px;
     461 + color: #1abc9c;
    412 462  }
    413  -table.dataTable thead .sorting:after{
    414  - content: "\f0dc" !important;
    415  - color: initial;
     463 + 
     464 +table.dataTable thead .sorting:after {
     465 + content: "\f0dc" !important;
     466 + color: initial;
    416 467  }
     468 + 
    417 469  table.dataTable thead .sorting_asc:after {
    418  - content: "\f0de" !important;
    419  - opacity: .8 !important;
     470 + content: "\f0de" !important;
     471 + opacity: .8 !important;
    420 472  }
     473 + 
    421 474  table.dataTable thead .sorting_desc:after {
    422  - content: "\f0dd" !important;
    423  - opacity: .8 !important;
     475 + content: "\f0dd" !important;
     476 + opacity: .8 !important;
    424 477  }
    425  -td.details-control{
    426  - cursor:pointer;
     478 + 
     479 +td.details-control {
     480 + cursor: pointer;
    427 481  }
    428  -.timeline{
    429  - text-align:left;
    430  - background-color:#ffffff;
     482 + 
     483 +.timeline {
     484 + text-align: left;
     485 + background-color: #ffffff;
    431 486  }
    432  -.timeline-graph{
    433  - margin-left:30px;
     487 + 
     488 +.timeline-graph {
     489 + margin-left: 30px;
    434 490  }
    435  -.timeline>h6{
    436  - margin-top:0px;
    437  - margin-bottom:5px;
     491 + 
     492 +.timeline>h6 {
     493 + margin-top: 0px;
     494 + margin-bottom: 5px;
    438 495  }
    439  -.timeline>.subtitle{
    440  - color: #999999;
    441  - font-style: italic;
    442  - margin-bottom:15px;
    443  - display:block;
     496 + 
     497 +.timeline>.subtitle {
     498 + color: #999999;
     499 + font-style: italic;
     500 + margin-bottom: 15px;
     501 + display: block;
    444 502  }
    445  -.timeline-entry{
    446  - position:relative;
    447  - padding-bottom:36px;
     503 + 
     504 +.timeline-entry {
     505 + position: relative;
     506 + padding-bottom: 36px;
    448 507  }
     508 + 
    449 509  .timeline-bar {
    450  - display:block;
    451  - content:"";
    452  - position:absolute;
    453  - top:5px;
    454  - bottom:0;
    455  - width:1px;
    456  - left:-6px;
    457  - background:#aaaaaa;
     510 + display: block;
     511 + content: "";
     512 + position: absolute;
     513 + top: 5px;
     514 + bottom: 0;
     515 + width: 1px;
     516 + left: -6px;
     517 + background: #aaaaaa;
    458 518  }
    459  -.timeline-entry:last-child .timeline-bar{
    460  - display:none;
     519 + 
     520 +.timeline-entry:last-child .timeline-bar {
     521 + display: none;
    461 522  }
     523 + 
    462 524  .timeline-entry:last-child {
    463  - padding-bottom:0px;
     525 + padding-bottom: 0px;
    464 526  }
    465  -.timeline-icon{
    466  - position:relative;
    467  - float:left;
    468  - margin-left:-24px;
    469  - width:36px;
    470  - top:-5px;
    471  - height:36px;
    472  - text-align:center;
    473  - border-radius:50%;
     527 + 
     528 +.timeline-icon {
     529 + position: relative;
     530 + float: left;
     531 + margin-left: -24px;
     532 + width: 36px;
     533 + top: -5px;
     534 + height: 36px;
     535 + text-align: center;
     536 + border-radius: 50%;
    474 537  }
    475  -.timeline-icon>i{
    476  - margin-top:10px;
    477  - color:#ffffff;
     538 + 
     539 +.timeline-icon>i {
     540 + margin-top: 10px;
     541 + color: #ffffff;
    478 542  }
     543 + 
    479 544  .timeline-message {
    480  - padding-left:30px;
     545 + padding-left: 30px;
    481 546  }
     547 + 
    482 548  .timeline-date {
    483  - float:right;
    484  - color:#999999;
    485  - font-style:italic;
     549 + float: right;
     550 + color: #999999;
     551 + font-style: italic;
    486 552  }
     553 + 
    487 554  .timeline-event-details {
    488  - font-size:16px;
    489  - margin-top:5px;
    490  - cursor:pointer;
     555 + font-size: 16px;
     556 + margin-top: 5px;
     557 + cursor: pointer;
    491 558  }
     559 + 
    492 560  .timeline-replay-button {
    493  - margin-top:10px;
     561 + margin-top: 10px;
    494 562  }
    495  -.timeline-event-details>.table-responsive{
    496  - display:none;
     563 + 
     564 +.timeline-event-details>.table-responsive {
     565 + display: none;
    497 566  }
    498  -.timeline-event-details{
    499  - margin-top: 10px;
    500  - margin-bottom: 10px;
     567 + 
     568 +.timeline-event-details {
     569 + margin-top: 10px;
     570 + margin-bottom: 10px;
    501 571  }
    502  -.timeline-event-results{
    503  - font-size:16px;
    504  - display:none;
     572 + 
     573 +.timeline-event-results {
     574 + font-size: 16px;
     575 + display: none;
    505 576  }
     577 + 
    506 578  .tooltip-inner {
    507  - width:300px !important;
     579 + width: 300px !important;
    508 580  }
    509  -#refresh_message{
    510  - display:none;
     581 + 
     582 +#refresh_message {
     583 + display: none;
    511 584  }
     585 + 
    512 586  #capture_passwords {
    513  - display:none;
     587 + display: none;
    514 588  }
     589 + 
    515 590  #redirect_url {
    516  - display:none;
     591 + display: none;
    517 592  }
     593 + 
    518 594  @media (max-width: 767px) {
    519  - .navbar-header {
    520  - margin-left:10px !important;
    521  - }
     595 + .navbar-header {
     596 + margin-left: 10px !important;
     597 + }
    522 598  }
    523  -table.dataTable{
    524  - width:100% !important;
     599 + 
     600 +table.dataTable {
     601 + width: 100% !important;
    525 602  }
     603 + 
    526 604  .btn-blue {
    527  - color:#fff;
    528  - background-color:#428bca;
    529  - border-color:#428bca;
     605 + color: #fff;
     606 + background-color: #428bca;
     607 + border-color: #428bca;
    530 608  }
    531  -.btn-blue:hover{
    532  - background-color:#64a1d6;
     609 + 
     610 +.btn-blue:hover {
     611 + background-color: #64a1d6;
    533 612  }
     613 + 
    534 614  .select2-container--bootstrap .select2-selection--single .select2-selection__rendered {
    535 615   font-size: 15px !important;
    536 616  }
     617 + 
    537 618  .select2-container--bootstrap .select2-selection--single {
    538 619   height: 42px !important;
    539 620   padding: 8px 12px !important;
    540 621  }
     622 + 
    541 623  .input-group-btn .btn {
    542  - line-height:20px !important;
     624 + line-height: 20px !important;
    543 625  }
     626 + 
    544 627  .highcharts-title {
    545  - font-family: "Source Sans Pro",Helvetica,Arial,sans-serif;
     628 + font-family: "Source Sans Pro", Helvetica, Arial, sans-serif;
    546 629   font-size: 16px !important;
    547 630  }
     631 + 
    548 632  .color-success {
    549 633   font-weight: bold;
    550 634   color: #f05b4f;
    551 635  }
     636 + 
    552 637  .color-sent {
    553 638   font-weight: bold;
    554 639   color: #1abc9c;
    555 640  }
     641 + 
    556 642  .color-opened {
    557 643   font-weight: bold;
    558 644   color: #f9bf3b;
    559 645  }
     646 + 
    560 647  .color-clicked {
    561 648   font-weight: bold;
    562 649   color: #f39c12;
    563 650  }
     651 + 
    564 652  .color-success {
    565 653   color: #f05b4f;
    566 654  }
    567  -.nav-sidebar>li.active>a:focus, .nav-sidebar>li.active>a:hover {
     655 + 
     656 +.nav-sidebar>li.active>a:focus,
     657 +.nav-sidebar>li.active>a:hover {
    568 658   background-color: #37485a;
    569 659  }
     660 + 
     661 +#resultsMapContainer {
     662 + display: none;
     663 +}
  • static/js/dist/app/campaign_results.min.js
    Unable to diff as some line is too long.
  • ■ ■ ■ ■
    static/js/dist/app/settings.min.js
    1  -$(document).ready(function(){$("#apiResetForm").submit(function(s){return $.post("/api/reset",$(this).serialize()).done(function(s){api_key=s.data,successFlash(s.message),$("#api_key").val(api_key)}).fail(function(s){errorFlash(s.message)}),!1}),$("#settingsForm").submit(function(s){return $.post("/settings",$(this).serialize()).done(function(s){successFlash(s.message)}).fail(function(s){errorFlash(s.responseJSON.message)}),!1})});
     1 +$(document).ready(function(){$("#apiResetForm").submit(function(e){return $.post("/api/reset",$(this).serialize()).done(function(e){api_key=e.data,successFlash(e.message),$("#api_key").val(api_key)}).fail(function(e){errorFlash(e.message)}),!1}),$("#settingsForm").submit(function(e){return $.post("/settings",$(this).serialize()).done(function(e){successFlash(e.message)}).fail(function(e){errorFlash(e.responseJSON.message)}),!1});var e=localStorage.getItem("gophish.use_map");$("#use_map").prop("checked",JSON.parse(e)),$("#use_map").on("change",function(){localStorage.setItem("gophish.use_map",JSON.stringify(this.checked))})});
  • ■ ■ ■ ■ ■ ■
    static/js/src/app/campaign_results.js
    skipped 403 lines
    404 404   left = chart.plotLeft + pie.center[0],
    405 405   top = chart.plotTop + pie.center[1];
    406 406   this.innerText = rend.text(chartopts['data'][0].y, left, top).
    407  - attr({
    408  - 'text-anchor': 'middle',
    409  - 'font-size': '24px',
    410  - 'font-weight': 'bold',
    411  - 'fill': chartopts['colors'][0],
    412  - 'font-family': 'Helvetica,Arial,sans-serif'
    413  - }).add();
     407 + attr({
     408 + 'text-anchor': 'middle',
     409 + 'font-size': '24px',
     410 + 'font-weight': 'bold',
     411 + 'fill': chartopts['colors'][0],
     412 + 'font-family': 'Helvetica,Arial,sans-serif'
     413 + }).add();
    414 414   },
    415 415   render: function () {
    416  - this.innerText.attr({ text: chartopts['data'][0].y })
     416 + this.innerText.attr({
     417 + text: chartopts['data'][0].y
     418 + })
    417 419   }
    418 420   }
    419 421   },
    skipped 24 lines
    444 446   colors: chartopts['colors'],
    445 447   }]
    446 448   })
     449 +}
     450 +
     451 +/* Updates the bubbles on the map
     452 +
     453 +@param {campaign.result[]} results - The campaign results to process
     454 +*/
     455 +var updateMap = function (results) {
     456 + if (!map) {
     457 + return
     458 + }
     459 + bubbles = []
     460 + $.each(campaign.results, function (i, result) {
     461 + // Check that it wasn't an internal IP
     462 + if (result.latitude == 0 && result.longitude == 0) {
     463 + return true;
     464 + }
     465 + newIP = true
     466 + $.each(bubbles, function (i, bubble) {
     467 + if (bubble.ip == result.ip) {
     468 + bubbles[i].radius += 1
     469 + newIP = false
     470 + return false
     471 + }
     472 + })
     473 + if (newIP) {
     474 + bubbles.push({
     475 + latitude: result.latitude,
     476 + longitude: result.longitude,
     477 + name: result.ip,
     478 + fillKey: "point",
     479 + radius: 2
     480 + })
     481 + }
     482 + })
     483 + map.bubbles(bubbles)
    447 484  }
    448 485  
    449 486  /* poll - Queries the API and updates the UI with the results
    skipped 86 lines
    536 573   })
    537 574   })
    538 575   /* Update the map information */
    539  - bubbles = []
    540  - $.each(campaign.results, function (i, result) {
    541  - // Check that it wasn't an internal IP
    542  - if (result.latitude == 0 && result.longitude == 0) {
    543  - return true;
    544  - }
    545  - newIP = true
    546  - $.each(bubbles, function (i, bubble) {
    547  - if (bubble.ip == result.ip) {
    548  - bubbles[i].radius += 1
    549  - newIP = false
    550  - return false
    551  - }
    552  - })
    553  - if (newIP) {
    554  - bubbles.push({
    555  - latitude: result.latitude,
    556  - longitude: result.longitude,
    557  - name: result.ip,
    558  - fillKey: "point",
    559  - radius: 2
    560  - })
    561  - }
    562  - })
    563  - map.bubbles(bubbles)
     576 + updateMap(campaign.results)
    564 577   $("#refresh_message").hide()
    565 578   $("#refresh_btn").show()
    566 579   })
    skipped 1 lines
    568 581  
    569 582  function load() {
    570 583   campaign.id = window.location.pathname.split('/').slice(-1)[0]
     584 + var use_map = JSON.parse(localStorage.getItem('gophish.use_map'))
    571 585   api.campaignId.results(campaign.id)
    572 586   .success(function (c) {
    573 587   campaign = c
    skipped 122 lines
    696 710   colors: [statuses[status].color, '#dddddd']
    697 711   })
    698 712   })
    699  - if (!map) {
     713 + if (use_map) {
     714 + $("#resultsMapContainer").show()
    700 715   map = new Datamap({
    701 716   element: document.getElementById("resultsMap"),
    702 717   responsive: true,
    skipped 10 lines
    713 728   }
    714 729   });
    715 730   }
    716  - $.each(campaign.results, function (i, result) {
    717  - // Check that it wasn't an internal IP
    718  - if (result.latitude == 0 && result.longitude == 0) {
    719  - return true;
    720  - }
    721  - newIP = true
    722  - $.each(bubbles, function (i, bubble) {
    723  - if (bubble.ip == result.ip) {
    724  - bubbles[i].radius += 1
    725  - newIP = false
    726  - return false
    727  - }
    728  - })
    729  - if (newIP) {
    730  - bubbles.push({
    731  - latitude: result.latitude,
    732  - longitude: result.longitude,
    733  - name: result.ip,
    734  - fillKey: "point",
    735  - radius: 2
    736  - })
    737  - }
    738  - })
    739  - map.bubbles(bubbles)
     731 + updateMap(campaign.results)
    740 732   }
    741  - // Load up the map data (only once!)
    742  - $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
    743  - if ($(e.target).attr('href') == "#overview") {
    744  - if (!map) {
    745  - map = new Datamap({
    746  - element: document.getElementById("resultsMap"),
    747  - responsive: true,
    748  - fills: {
    749  - defaultFill: "#ffffff"
    750  - },
    751  - geographyConfig: {
    752  - highlightFillColor: "#1abc9c",
    753  - borderColor: "#283F50"
    754  - }
    755  - });
    756  - }
    757  - }
    758  - })
    759 733   })
    760 734   .error(function () {
    761 735   $("#loading").hide()
    skipped 2 lines
    764 738  }
    765 739  
    766 740  var setRefresh
     741 +
    767 742  function refresh() {
    768 743   if (!doPoll) {
    769 744   return;
    skipped 18 lines
    788 763   // Start the polling loop
    789 764   setRefresh = setTimeout(refresh, 60000)
    790 765  })
    791  - 
  • ■ ■ ■ ■ ■ ■
    static/js/src/app/settings.js
    1  -$(document).ready(function() {
    2  - $("#apiResetForm").submit(function(e) {
     1 +$(document).ready(function () {
     2 + $("#apiResetForm").submit(function (e) {
    3 3   $.post("/api/reset", $(this).serialize())
    4  - .done(function(data) {
     4 + .done(function (data) {
    5 5   api_key = data.data
    6 6   successFlash(data.message)
    7 7   $("#api_key").val(api_key)
    8 8   })
    9  - .fail(function(data) {
     9 + .fail(function (data) {
    10 10   errorFlash(data.message)
    11 11   })
    12 12   return false
    13 13   })
    14  - $("#settingsForm").submit(function(e) {
     14 + $("#settingsForm").submit(function (e) {
    15 15   $.post("/settings", $(this).serialize())
    16  - .done(function(data) {
     16 + .done(function (data) {
    17 17   successFlash(data.message)
    18 18   })
    19  - .fail(function(data) {
     19 + .fail(function (data) {
    20 20   errorFlash(data.responseJSON.message)
    21 21   })
    22 22   return false
    23 23   })
     24 + var use_map = localStorage.getItem('gophish.use_map')
     25 + $("#use_map").prop('checked', JSON.parse(use_map))
     26 + $("#use_map").on('change', function () {
     27 + localStorage.setItem('gophish.use_map', JSON.stringify(this.checked))
     28 + })
    24 29  })
    25  - 
  • ■ ■ ■ ■
    templates/campaign_results.html
    skipped 77 lines
    78 78   <div id="clicked_chart" style="height:200px;" class="col-lg-3 col-md-3"></div>
    79 79   <div id="submitted_data_chart" style="height:200px;" class="col-lg-3 col-md-3"></div>
    80 80   </div>
    81  - <div class="row">
     81 + <div class="row" id="resultsMapContainer">
    82 82   <div class="col-md-6">
    83 83   <p style="text-align:center;">Targets Map</p>
    84 84   <div id="resultsMap"></div>
    skipped 29 lines
  • ■ ■ ■ ■ ■ ■
    templates/settings.html
    skipped 16 lines
    17 17   </li>
    18 18   <li class="active"><a href="/settings">Settings</a>
    19 19   </li>
    20  - <li><hr></li>
     20 + <li>
     21 + <hr>
     22 + </li>
    21 23   <li><a href="https://gophish.gitbooks.io/user-guide/content/">User Guide</a>
    22 24   </li>
    23 25   <li><a href="/api/">API Documentation</a>
    skipped 7 lines
    31 33   <h1 class="page-header">Settings</h1>
    32 34   </div>
    33 35   <div id="flashes" class="row"></div>
    34  - <div class="row">
    35  - <label class="col-sm-2 control-label form-label">Gophish version</label>
    36  - <div class="col-md-6">
    37  - <label class="form-label">{{.Version}}</label>
    38  - </div>
    39  - </div>
    40  - <br/>
    41  - <div class="row">
    42  - <label class="col-sm-2 control-label form-label">Register a New User</label>
    43  - <div class="col-md-6">
    44  - <a href="/register" class="btn btn-primary"><i class="fa fa-plus"></i> Add User</a>
     36 + <!-- Nav tabs -->
     37 + <ul class="nav nav-tabs" role="tablist">
     38 + <li class="active" role="mainSettings"><a href="#mainSettings" aria-controls="mainSettings" role="tab" data-toggle="tab">Account Settings</a></li>
     39 + <li role="uiSettings"><a href="#uiSettings" aria-controls="uiSettings" role="tab" data-toggle="tab">UI Settings</a></li>
     40 + </ul>
     41 + <!-- Tab Panes -->
     42 + <div class="tab-content">
     43 + <div role="tabpanel" class="tab-pane active" id="mainSettings">
     44 + <br/>
     45 + <div class="row">
     46 + <label class="col-sm-2 control-label form-label">Gophish version</label>
     47 + <div class="col-md-6">
     48 + <label class="form-label">{{.Version}}</label>
     49 + </div>
    45 50   </div>
    46  - </div>
    47  - <br/>
    48  - <div class="row">
    49  - <label for="api_key" class="col-sm-2 control-label form-label">API Key:</label>
    50  - <div class="col-md-6">
    51  - <input type="text" id="api_key" onclick="this.select();" value="{{.User.ApiKey}}" class="form-control" readonly/>
    52  - </div>
    53  - <form id="apiResetForm">
    54  - <button class="btn btn-primary"><i class="fa fa-refresh" type="submit"></i> Reset</button>
    55  - <input type="hidden" name="csrf_token" value="{{.Token}}"/>
    56  - </form>
    57  - </div>
    58  - <br />
    59  - <form id="settingsForm">
    60  - <div class="row">
    61  - <label for="username" class="col-sm-2 control-label form-label">Username:</label>
    62  - <div class="col-md-6">
    63  - <input type="text" id="username" name="username" value="{{.User.Username}}" class="form-control" />
    64  - </div>
    65  - </div>
    66  - <br />
    67  - <div class="row">
    68  - <label for="current_password" class="col-sm-2 control-label form-label">Old Password:</label>
    69  - <div class="col-md-6">
    70  - <input type="password" id="current_password" name="current_password" autocomplete="off" class="form-control"/>
     51 + <br/>
     52 + <div class="row">
     53 + <label class="col-sm-2 control-label form-label">Register a New User</label>
     54 + <div class="col-md-6">
     55 + <a href="/register" class="btn btn-primary"><i class="fa fa-plus"></i> Add User</a>
     56 + </div>
    71 57   </div>
    72  - </div>
    73  - <br />
    74  - <div class="row">
    75  - <label for="new_password" class="col-sm-2 control-label form-label">New Password:</label>
    76  - <div class="col-md-6">
    77  - <input type="password" id="new_password" name="new_password" autocomplete="off" class="form-control" />
     58 + <br/>
     59 + <div class="row">
     60 + <label for="api_key" class="col-sm-2 control-label form-label">API Key:</label>
     61 + <div class="col-md-6">
     62 + <input type="text" id="api_key" onclick="this.select();" value="{{.User.ApiKey}}" class="form-control" readonly/>
     63 + </div>
     64 + <form id="apiResetForm">
     65 + <button class="btn btn-primary"><i class="fa fa-refresh" type="submit"></i> Reset</button>
     66 + <input type="hidden" name="csrf_token" value="{{.Token}}" />
     67 + </form>
    78 68   </div>
     69 + <br />
     70 + <form id="settingsForm">
     71 + <div class="row">
     72 + <label for="username" class="col-sm-2 control-label form-label">Username:</label>
     73 + <div class="col-md-6">
     74 + <input type="text" id="username" name="username" value="{{.User.Username}}" class="form-control" />
     75 + </div>
     76 + </div>
     77 + <br />
     78 + <div class="row">
     79 + <label for="current_password" class="col-sm-2 control-label form-label">Old Password:</label>
     80 + <div class="col-md-6">
     81 + <input type="password" id="current_password" name="current_password" autocomplete="off" class="form-control" />
     82 + </div>
     83 + </div>
     84 + <br />
     85 + <div class="row">
     86 + <label for="new_password" class="col-sm-2 control-label form-label">New Password:</label>
     87 + <div class="col-md-6">
     88 + <input type="password" id="new_password" name="new_password" autocomplete="off" class="form-control" />
     89 + </div>
     90 + </div>
     91 + <br />
     92 + <div class="row">
     93 + <label for="confirm_new_password" class="col-sm-2 control-label form-label">Confirm New Password:</label>
     94 + <div class="col-md-6">
     95 + <input type="password" id="confirm_new_password" name="confirm_new_password" autocomplete="off" class="form-control" />
     96 + </div>
     97 + </div>
     98 + <input type="hidden" name="csrf_token" value="{{.Token}}" />
     99 + <br />
     100 + <button class="btn btn-primary" type="submit"><i class="fa fa-save"></i> Save</button>
     101 + </form>
     102 + <br/>
    79 103   </div>
    80  - <br />
    81  - <div class="row">
    82  - <label for="confirm_new_password" class="col-sm-2 control-label form-label">Confirm New Password:</label>
    83  - <div class="col-md-6">
    84  - <input type="password" id="confirm_new_password" name="confirm_new_password" autocomplete="off" class="form-control" />
     104 + <div role="tabpanel" class="tab-pane" id="uiSettings">
     105 + <br/>
     106 + <div class="checkbox checkbox-primary">
     107 + <input id="use_map" type="checkbox">
     108 + <label for="use_map">Show campaign results map</label>
    85 109   </div>
    86 110   </div>
    87  - <input type="hidden" name="csrf_token" value="{{.Token}}"/>
    88  - <br />
    89  - <button class="btn btn-primary" type="submit"><i class="fa fa-save"></i> Save</button>
    90  - </form>
    91  - <br/>
     111 + </div>
    92 112  </div>
    93  -{{end}}
    94  -{{define "scripts"}}
     113 +{{end}} {{define "scripts"}}
    95 114  <script src="/js/dist/app/settings.min.js"></script>
    96 115  {{end}}
    97  - 
Please wait...
Page is in error, reload to recover