Projects STRLCPY GraphSpy Commits 58d615b5
🤬
  • Add access token model on every page for easier token switching.

  • Loading...
  • RedByte1337 committed 1 month ago
    58d615b5
    1 parent 98b28acf
  • ■ ■ ■ ■
    GraphSpy/templates/OneDrive.html
    skipped 11 lines
    12 12   </div>
    13 13   <div class="col-3">
    14 14   <label for="access_token_id" class="form-label">Access token id *</label>
    15  - <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     15 + <div class="input-group">
     16 + <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     17 + <button class="btn btn-outline-primary" type="button" data-bs-toggle="modal" data-bs-target="#access_token_modal" onclick="$('#access_token_modal_table').DataTable().ajax.reload(null, false)">Select...</button>
     18 + </div>
    16 19   </div>
    17 20   <div>
    18 21   <button type="Button" class="btn btn-primary" onclick="generateTable()">Browse</button>
    skipped 168 lines
  • ■ ■ ■ ■
    GraphSpy/templates/SharePoint.html
    skipped 11 lines
    12 12   </div>
    13 13   <div class="col-md-3">
    14 14   <label for="access_token_id" class="form-label">Access token id *</label>
    15  - <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     15 + <div class="input-group">
     16 + <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     17 + <button class="btn btn-outline-primary" type="button" data-bs-toggle="modal" data-bs-target="#access_token_modal" onclick="$('#access_token_modal_table').DataTable().ajax.reload(null, false)">Select...</button>
     18 + </div>
    16 19   </div>
    17 20   <div>
    18 21   <label for="path" class="form-label">Path *</label>
    skipped 186 lines
  • ■ ■ ■ ■
    GraphSpy/templates/SharePointDrives.html
    skipped 11 lines
    12 12   </div>
    13 13   <div class="col-3">
    14 14   <label for="access_token_id" class="form-label">Access token id *</label>
    15  - <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     15 + <div class="input-group">
     16 + <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     17 + <button class="btn btn-outline-primary" type="button" data-bs-toggle="modal" data-bs-target="#access_token_modal" onclick="$('#access_token_modal_table').DataTable().ajax.reload(null, false)">Select...</button>
     18 + </div>
    16 19   </div>
    17 20   <div>
    18 21   <button type="Button" class="btn btn-primary" onclick="generateTable()">Browse</button>
    skipped 128 lines
  • ■ ■ ■ ■
    GraphSpy/templates/SharePointSites.html
    skipped 16 lines
    17 17   </div>
    18 18   <div class="col-sm-4">
    19 19   <label for="access_token_id" class="form-label">Access token id *</label>
    20  - <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     20 + <div class="input-group">
     21 + <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     22 + <button class="btn btn-outline-primary" type="button" data-bs-toggle="modal" data-bs-target="#access_token_modal" onclick="$('#access_token_modal_table').DataTable().ajax.reload(null, false)">Select...</button>
     23 + </div>
    21 24   </div>
    22 25   <div>
    23 26   <button type="Button" class="btn btn-primary" onclick="generateTable()">Browse</button>
    skipped 127 lines
  • ■ ■ ■ ■ ■ ■
    GraphSpy/templates/access_token_modal.html
     1 +<div class="modal fade" id="access_token_modal" tabindex="-1" aria-labelledby="access_token_modal_label" aria-hidden="true">
     2 + <div class="modal-dialog modal-xl">
     3 + <div class="modal-content">
     4 + <div class="modal-header">
     5 + <h1 class="modal-title fs-5" id="access_token_modal_label">Access Tokens</h1>
     6 + <div style="float: right">
     7 + <i class="fi fi-br-expand px-3" id="expand-icon" style="cursor: pointer; float: left; opacity: 0.5"></i>
     8 + <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
     9 + </div>
     10 + </div>
     11 + <div class="modal-body">
     12 + <div id="dTable" class="box-body table-responsive" style="padding:20px;">
     13 + <table id="access_token_modal_table" class="display" style="width:100%">
     14 + <thead>
     15 + <tr>
     16 + <th></th>
     17 + <th></th>
     18 + <th></th>
     19 + <th></th>
     20 + <th>ID</th>
     21 + <th>Issued</th>
     22 + <th>Expires</th>
     23 + <th>User</th>
     24 + <th>Resource</th>
     25 + <th>Description</th>
     26 + </tr>
     27 + </thead>
     28 + </table>
     29 + </div>
     30 + </div>
     31 + <div class="modal-footer">
     32 + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
     33 + </div>
     34 + </div>
     35 + </div>
     36 +</div>
     37 +<script type="text/javascript" class="init">
     38 + // Populate the access_token_modal_table table
     39 + let accessTokenModalTable = new DataTable('#access_token_modal_table', {
     40 + ajax: {
     41 + url: '/api/list_access_tokens', dataSrc: ""
     42 + },
     43 + columns: [
     44 + {
     45 + className: 'dt-control',
     46 + orderable: false,
     47 + data: null,
     48 + defaultContent: '',
     49 + 'width': '20px'
     50 + },
     51 + {
     52 + className: 'active-control',
     53 + orderable: false,
     54 + data: null,
     55 + defaultContent: '<i class="fi fi-br-check" style="cursor: pointer"></i>',
     56 + 'width': '20px'
     57 + },
     58 + {
     59 + className: 'copy-control',
     60 + orderable: false,
     61 + data: null,
     62 + defaultContent: '<i class="fi fi-rr-copy-alt" style="cursor: pointer"></i>',
     63 + 'width': '20px'
     64 + },
     65 + {
     66 + className: 'delete-control',
     67 + orderable: false,
     68 + data: null,
     69 + defaultContent: '<i class="fi fi-rr-trash" style="cursor: pointer"></i>',
     70 + 'width': '20px'
     71 + },
     72 + { data: 'id', 'width': '30px' },
     73 + { data: 'issued_at', 'width': '150px' },
     74 + { data: 'expires_at', 'width': '150px' },
     75 + { data: 'user', 'width': '350px' },
     76 + { data: 'resource', 'width': '350px' },
     77 + { data: 'description' }
     78 + ],
     79 + order: [[4, 'desc']],
     80 + autoWidth: false
     81 + })
     82 + 
     83 + accessTokenModalTable.on('click', 'td.dt-control', function (e) {
     84 + let tr = e.target.closest('tr');
     85 + let row = accessTokenModalTable.row(tr);
     86 + 
     87 + if (row.child.isShown()) {
     88 + // This row is already open - close it
     89 + row.child.hide();
     90 + }
     91 + else {
     92 + // Open this row
     93 + row.child(formatAccessToken(row.data())).show();
     94 + }
     95 + });
     96 + 
     97 + accessTokenModalTable.on('click', 'td.active-control', function (e) {
     98 + let tr = e.target.closest('tr');
     99 + let row = accessTokenModalTable.row(tr);
     100 + setActiveAccessToken(row.data().id);
     101 + $('#access_token_modal').modal('hide');
     102 + });
     103 + 
     104 + accessTokenModalTable.on('click', 'td.copy-control', function (e) {
     105 + let tr = e.target.closest('tr');
     106 + let row = accessTokenModalTable.row(tr);
     107 + copyToClipboard(row.data().accesstoken);
     108 + });
     109 + 
     110 + 
     111 + accessTokenModalTable.on('click', 'td.delete-control', function (e) {
     112 + let tr = e.target.closest('tr');
     113 + let row = accessTokenModalTable.row(tr);
     114 + if (!confirm("Are you sure you want to delete access token with ID " + row.data().id + "?")) { return }
     115 + deleteAccessToken(row.data().id);
     116 + $('#access_tokens').DataTable().ajax.reload(null, false);
     117 + });
     118 + 
     119 + function formatAccessToken(d) {
     120 + // `d` is the original data object for the row
     121 + let response = $.ajax({
     122 + type: "GET",
     123 + async: false,
     124 + url: "/api/decode_token/" + d.id
     125 + });
     126 + var formatWrapper = $(
     127 + '<dl style="word-wrap: break-word; word-break: break-all; max-width:100%">' +
     128 + '<dt>Raw Token:</dt>' +
     129 + '</dl>'
     130 + );
     131 + var formatCode = $('<code></code>').text(d.accesstoken);
     132 + formatWrapper.append($('<dd></dd>').append(formatCode));
     133 + formatWrapper.append($('<dt>Decoded Token:</dt>'));
     134 + var formatPre = $('<pre style="white-space: pre-wrap"></pre>').text(JSON.stringify(JSON.parse(response.responseText), undefined, 4));
     135 + formatWrapper.append($('<dd></dd>').append(formatPre));
     136 + return formatWrapper;
     137 + }
     138 + 
     139 + $("#access_token_modal").on('click', 'i#expand-icon', function (e) {
     140 + $("#access_token_modal .modal-dialog").toggleClass('modal-xl').toggleClass('modal-fullscreen')
     141 + $("#access_token_modal i#expand-icon").toggleClass('fi-br-expand').toggleClass('fi-br-compress')
     142 + })
     143 +</script>
  • ■ ■ ■ ■ ■ ■
    GraphSpy/templates/access_tokens.html
    skipped 199 lines
    200 200   async: false,
    201 201   url: "/api/decode_token/" + d.id
    202 202   });
    203  - return (
    204  - //'<dl style = "word-wrap: break-word; word-break: break-all; width:100%">' +
     203 + var formatWrapper = $(
    205 204   '<dl>' +
    206 205   '<dt>Raw Token:</dt>' +
    207  - '<dd><code>' +
    208  - d.accesstoken +
    209  - '</code></dd>' +
    210  - '<dt>Decoded Token:</dt>' +
    211  - '<dd><pre>' +
    212  - JSON.stringify(JSON.parse(response.responseText), undefined, 4) +
    213  - '</pre></dd>' +
    214 206   '</dl>'
    215 207   );
     208 + var formatCode = $('<code></code>').text(d.accesstoken);
     209 + formatWrapper.append($('<dd></dd>').append(formatCode));
     210 + formatWrapper.append($('<dt>Decoded Token:</dt>'));
     211 + var formatPre = $('<pre></pre>').text(JSON.stringify(JSON.parse(response.responseText), undefined, 4));
     212 + formatWrapper.append($('<dd></dd>').append(formatPre));
     213 + return formatWrapper;
    216 214   }
    217 215  </script>
    218 216   
    skipped 1 lines
  • ■ ■ ■ ■ ■ ■
    GraphSpy/templates/custom_requests.html
    skipped 7 lines
    8 8   <form id="custom_request_form" class="row g-3">
    9 9   <div class="col-2">
    10 10   <label for="method" class="form-label">Method *</label>
    11  - <input list="methods" id="method" placeholder="GET" class="form-control" required>
    12  - <datalist id="methods">
     11 + <select id="method" placeholder="GET" class="form-select" required>
    13 12   <option value="GET">GET</option>
    14 13   <option value="POST">POST</option>
    15 14   <option value="PUT">PUT</option>
    skipped 1 lines
    17 16   <option value="HEAD">HEAD</option>
    18 17   <option value="DELETE">DELETE</option>
    19 18   <option value="OPTIONS">OPTIONS</option>
    20  - </datalist>
     19 + </select>
    21 20   </div>
    22 21   <div class="col-2">
    23 22   <label for="request_type" class="form-label">Body type</label>
    24  - <select id="request_type" class="form-select" aria-label="Request body">
     23 + <select id="request_type" class="form-select">
    25 24   <option value="text">Text</option>
    26 25   <option value="urlencoded">URL Encoded</option>
    27 26   <option value="json">JSON</option>
    skipped 2 lines
    30 29   </div>
    31 30   <div class="col-2">
    32 31   <label for="access_token_id" class="form-label">Access token id *</label>
    33  - <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     32 + <div class="input-group">
     33 + <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     34 + <button class="btn btn-outline-primary" type="button" data-bs-toggle="modal" data-bs-target="#access_token_modal" onclick="$('#access_token_modal_table').DataTable().ajax.reload(null, false)">Select...</button>
     35 + </div>
    34 36   </div>
    35 37   <div class="col-3"></div>
    36 38   <div class="col-3">
    skipped 58 lines
    95 97   </div>
    96 98   </div>
    97 99  </div>
    98  -<!-- Modal -->
    99  -<div class="modal fade" id="request_template_modal" tabindex="-1" aria-labelledby="request_template_modal_label" aria-hidden="true">
    100  - <div class="modal-dialog modal-xl">
    101  - <div class="modal-content">
    102  - <div class="modal-header">
    103  - <h1 class="modal-title fs-5" id="request_template_modal_label">Request Templates</h1>
    104  - <div style="float: right">
    105  - <i class="fi fi-br-expand px-3" id="expand-icon" style="cursor: pointer; float: left; opacity: 0.5"></i>
    106  - <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
    107  - </div>
    108  - </div>
    109  - <div class="modal-body">
    110  - <div id="dTable" class="box-body table-responsive" style="padding:20px;">
    111  - <table id="request_templates" class="display" style="width:100%">
    112  - <thead>
    113  - <tr>
    114  - <th></th>
    115  - <th></th>
    116  - <th></th>
    117  - <th>ID</th>
    118  - <th>Name</th>
    119  - <th>Body type</th>
    120  - <th>Method</th>
    121  - <th>URI</th>
    122  - </tr>
    123  - </thead>
    124  - </table>
    125  - </div>
    126  - </div>
    127  - <div class="modal-footer">
    128  - <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
    129  - </div>
    130  - </div>
    131  - </div>
    132  -</div>
    133  -<script type="text/javascript" class="init">
    134  - // Populate the request_templates table
    135  - let myTable = new DataTable('#request_templates', {
    136  - ajax: {
    137  - url: '/api/list_request_templates', dataSrc: ""
    138  - },
    139  - columns: [
    140  - {
    141  - className: 'dt-control',
    142  - orderable: false,
    143  - data: null,
    144  - defaultContent: '',
    145  - 'width': '20px'
    146  - },
    147  - {
    148  - className: 'active-control',
    149  - orderable: false,
    150  - data: null,
    151  - defaultContent: '<i class="fi fi-br-check" style="cursor: pointer"></i>',
    152  - 'width': '20px'
    153  - },
    154  - {
    155  - className: 'delete-control',
    156  - orderable: false,
    157  - data: null,
    158  - defaultContent: '<i class="fi fi-rr-trash" style="cursor: pointer"></i>',
    159  - 'width': '20px'
    160  - },
    161  - { data: 'id', 'width': '30px' },
    162  - { data: 'template_name', 'width': '150px' },
    163  - { data: 'request_type', 'width': '150px' },
    164  - { data: 'method', 'width': '100px' },
    165  - { data: 'uri'}
    166  - ],
    167  - order: [[3, 'desc']]
    168  - })
    169  - 
    170  - myTable.on('click', 'td.dt-control', function (e) {
    171  - let tr = e.target.closest('tr');
    172  - let row = myTable.row(tr);
    173  - 
    174  - if (row.child.isShown()) {
    175  - // This row is already open - close it
    176  - row.child.hide();
    177  - }
    178  - else {
    179  - // Open this row
    180  - row.child(format(row.data())).show();
    181  - }
    182  - });
    183  - 
    184  - myTable.on('click', 'td.active-control', function (e) {
    185  - let tr = e.target.closest('tr');
    186  - let row = myTable.row(tr);
    187  - request_template_info = row.data();
    188  - $("#request_uri").val(request_template_info.uri);
    189  - $("#method").val(request_template_info.method);
    190  - $("#request_type").val(request_template_info.request_type);
    191  - $("#body").val(request_template_info.body);
    192  - $("#request_template_name").val(request_template_info.template_name);
    193  - $('#header_fields').empty();
    194  - $('#variable_fields').empty();
    195  - for (var header_name in request_template_info.headers) {
    196  - if (request_template_info.headers.hasOwnProperty(header_name)) {
    197  - addHeaderRow(header_name, request_template_info.headers[header_name]);
    198  - }
    199  - }
    200  - for (var variable_name in request_template_info.variables) {
    201  - if (request_template_info.variables.hasOwnProperty(variable_name)) {
    202  - addVariableRow(variable_name, request_template_info.variables[variable_name]);
    203  - }
    204  - }
    205  - $('#request_template_modal').modal('hide');
    206  - });
    207  - 
    208  - myTable.on('click', 'td.delete-control', function (e) {
    209  - let tr = e.target.closest('tr');
    210  - let row = myTable.row(tr);
    211  - if (!confirm("Are you sure you want to delete request template '" + row.data().template_name + "'?")) { return }
    212  - deleteRequestTemplate(row.data().id);
    213  - });
    214  - 
    215  - function format(d) {
    216  - var descList = $(
    217  - '<dl>' +
    218  - '<dt>Request Template:</dt>' +
    219  - '</dl>');
    220  - var descDetails = $('<dd></dd>');
    221  - var preText = $('<pre></pre>');
    222  - preText.text(JSON.stringify(d, undefined, 4));
    223  - descDetails.append(preText);
    224  - descList.append(descDetails);
    225  - return descList
    226  - }
    227  - 
    228  - function deleteRequestTemplate(id) {
    229  - let response = $.ajax({
    230  - type: "POST",
    231  - async: false,
    232  - url: "/api/delete_request_template",
    233  - data: {"template_id": id}
    234  - });
    235  - $('#request_templates').DataTable().ajax.reload(null, false);
    236  - bootstrapToast("Delete Request Template", response.responseText)
    237  - }
    238  -</script>
    239 100  <script>
    240 101   function getHeaders() {
    241 102   let headers = {};
    skipped 47 lines
    289 150   } else {
    290 151   $("#response_body").text(responseJSON.response_text);
    291 152   }
    292  - }catch (e) {
     153 + } catch (e) {
    293 154   $("#response_body").text(responseJSON.response_text);
    294 155   }
    295 156   $("#response_status_code").text(responseJSON.response_status_code);
    skipped 78 lines
    374 235   $("#response-card").on('click', 'i#copy-icon', function (e) {
    375 236   copyToClipboard($("#response_body").text());
    376 237   })
     238 +</script>
    377 239   
    378  - $("#request_template_modal").on('click', 'i#expand-icon', function (e) {
    379  - $("#request_template_modal").find('.modal-dialog').toggleClass('modal-xl').toggleClass('modal-fullscreen')
    380  - $("i#expand-icon").toggleClass('fi-br-expand').toggleClass('fi-br-compress')
     240 +<!-- Request Template Modal -->
     241 +<div class="modal fade" id="request_template_modal" tabindex="-1" aria-labelledby="request_template_modal_label" aria-hidden="true">
     242 + <div class="modal-dialog modal-xl">
     243 + <div class="modal-content">
     244 + <div class="modal-header">
     245 + <h1 class="modal-title fs-5" id="request_template_modal_label">Request Templates</h1>
     246 + <div style="float: right">
     247 + <i class="fi fi-br-expand px-3" id="expand-icon" style="cursor: pointer; float: left; opacity: 0.5"></i>
     248 + <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
     249 + </div>
     250 + </div>
     251 + <div class="modal-body">
     252 + <div id="dTable" class="box-body table-responsive" style="padding:20px;">
     253 + <table id="request_templates" class="display" style="width:100%">
     254 + <thead>
     255 + <tr>
     256 + <th></th>
     257 + <th></th>
     258 + <th></th>
     259 + <th>ID</th>
     260 + <th>Name</th>
     261 + <th>Body type</th>
     262 + <th>Method</th>
     263 + <th>URI</th>
     264 + </tr>
     265 + </thead>
     266 + </table>
     267 + </div>
     268 + </div>
     269 + <div class="modal-footer">
     270 + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
     271 + </div>
     272 + </div>
     273 + </div>
     274 +</div>
     275 +<script type="text/javascript" class="init">
     276 + // Populate the request_templates table
     277 + let myTable = new DataTable('#request_templates', {
     278 + ajax: {
     279 + url: '/api/list_request_templates', dataSrc: ""
     280 + },
     281 + columns: [
     282 + {
     283 + className: 'dt-control',
     284 + orderable: false,
     285 + data: null,
     286 + defaultContent: '',
     287 + 'width': '20px'
     288 + },
     289 + {
     290 + className: 'active-control',
     291 + orderable: false,
     292 + data: null,
     293 + defaultContent: '<i class="fi fi-br-check" style="cursor: pointer"></i>',
     294 + 'width': '20px'
     295 + },
     296 + {
     297 + className: 'delete-control',
     298 + orderable: false,
     299 + data: null,
     300 + defaultContent: '<i class="fi fi-rr-trash" style="cursor: pointer"></i>',
     301 + 'width': '20px'
     302 + },
     303 + { data: 'id', 'width': '30px' },
     304 + { data: 'template_name', 'width': '150px' },
     305 + { data: 'request_type', 'width': '130px' },
     306 + { data: 'method', 'width': '80px' },
     307 + { data: 'uri' }
     308 + ],
     309 + order: [[3, 'desc']],
     310 + autoWidth: false
    381 311   })
    382 312   
     313 + myTable.on('click', 'td.dt-control', function (e) {
     314 + let tr = e.target.closest('tr');
     315 + let row = myTable.row(tr);
     316 + 
     317 + if (row.child.isShown()) {
     318 + // This row is already open - close it
     319 + row.child.hide();
     320 + }
     321 + else {
     322 + // Open this row
     323 + row.child(formatRequestTemplate(row.data())).show();
     324 + }
     325 + });
     326 + 
     327 + myTable.on('click', 'td.active-control', function (e) {
     328 + let tr = e.target.closest('tr');
     329 + let row = myTable.row(tr);
     330 + request_template_info = row.data();
     331 + $("#request_uri").val(request_template_info.uri);
     332 + $("#method").val(request_template_info.method);
     333 + $("#request_type").val(request_template_info.request_type);
     334 + $("#body").val(request_template_info.body);
     335 + $("#request_template_name").val(request_template_info.template_name);
     336 + $('#header_fields').empty();
     337 + $('#variable_fields').empty();
     338 + for (var header_name in request_template_info.headers) {
     339 + if (request_template_info.headers.hasOwnProperty(header_name)) {
     340 + addHeaderRow(header_name, request_template_info.headers[header_name]);
     341 + }
     342 + }
     343 + for (var variable_name in request_template_info.variables) {
     344 + if (request_template_info.variables.hasOwnProperty(variable_name)) {
     345 + addVariableRow(variable_name, request_template_info.variables[variable_name]);
     346 + }
     347 + }
     348 + $('#request_template_modal').modal('hide');
     349 + });
     350 + 
     351 + myTable.on('click', 'td.delete-control', function (e) {
     352 + let tr = e.target.closest('tr');
     353 + let row = myTable.row(tr);
     354 + if (!confirm("Are you sure you want to delete request template '" + row.data().template_name + "'?")) { return }
     355 + deleteRequestTemplate(row.data().id);
     356 + });
     357 + 
     358 + function formatRequestTemplate(d) {
     359 + var descList = $(
     360 + '<dl>' +
     361 + '<dt>Request Template:</dt>' +
     362 + '</dl>');
     363 + var descDetails = $('<dd></dd>');
     364 + var preText = $('<pre></pre>');
     365 + preText.text(JSON.stringify(d, undefined, 4));
     366 + descDetails.append(preText);
     367 + descList.append(descDetails);
     368 + return descList
     369 + }
     370 + 
     371 + function deleteRequestTemplate(id) {
     372 + let response = $.ajax({
     373 + type: "POST",
     374 + async: false,
     375 + url: "/api/delete_request_template",
     376 + data: { "template_id": id }
     377 + });
     378 + $('#request_templates').DataTable().ajax.reload(null, false);
     379 + bootstrapToast("Delete Request Template", response.responseText)
     380 + }
     381 + 
     382 + $("#request_template_modal").on('click', 'i#expand-icon', function (e) {
     383 + $("#request_template_modal .modal-dialog").toggleClass('modal-xl').toggleClass('modal-fullscreen')
     384 + $("#request_template_modal i#expand-icon").toggleClass('fi-br-expand').toggleClass('fi-br-compress')
     385 + })
    383 386  </script>
     387 + 
    384 388   {%endblock content%}
    385 389   
  • ■ ■ ■ ■
    GraphSpy/templates/generic_search.html
    skipped 26 lines
    27 27   </div>
    28 28   <div class="col-sm-4">
    29 29   <label for="access_token_id" class="form-label">Access token id *</label>
    30  - <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     30 + <div class="input-group">
     31 + <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     32 + <button class="btn btn-outline-primary" type="button" data-bs-toggle="modal" data-bs-target="#access_token_modal" onclick="$('#access_token_modal_table').DataTable().ajax.reload(null, false)">Select...</button>
     33 + </div>
    31 34   </div>
    32 35   <div>
    33 36   <label for="search_query" class="form-label">Search Query *</label>
    skipped 138 lines
  • ■ ■ ■ ■ ■ ■
    GraphSpy/templates/layout.html
    skipped 78 lines
    79 79   <a class="nav-link" href="{{url_for('outlook')}}">Outlook</a>
    80 80   </li>
    81 81   <li class="nav-item">
    82  - <span class="d-inline-block" id="nav-teams-disabled" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-content="Coming soon!" data-bs-placement="bottom" >
     82 + <span class="d-inline-block" id="nav-teams-disabled" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-content="Coming soon!" data-bs-placement="bottom">
    83 83   <a class="nav-link disabled">Teams</a>
    84 84   </span>
    85 85   </li>
    skipped 60 lines
    146 146   <h4>Access Token</h4>
    147 147   <form id="side_menu_access_token_form" class="row row-cols-auto">
    148 148   <div class="input-group">
    149  - <input type="text" id="access_token_id_side" class="form-control" size="1" required>
    150  - <button type="Button" class="btn btn-outline-primary" onclick="setActiveAccessToken(access_token_id_side.value);">Set active access token</button>
     149 + <input type="text" id="access_token_id_side" class="form-control" size="1" readonly>
     150 + <button type="Button" class="btn btn-outline-primary" data-bs-toggle="modal" data-bs-target="#access_token_modal" onclick="$('#access_token_modal_table').DataTable().ajax.reload(null, false)">Select...</button>
    151 151   </div>
    152 152   </form>
    153 153   <div class="card text-bg-secondary mb-3 mt-3" id="access_token_card">
    skipped 112 lines
    266 266   obtainAccessTokenInfo();
    267 267   obtainRefreshTokenInfo();
    268 268   </script>
     269 + <!-- Access Token Modal -->
     270 + {% include 'access_token_modal.html' %}
    269 271   <!-- Template Content -->
    270 272   <div class="container-fluid">
    271 273   {%block content%}
    skipped 15 lines
  • ■ ■ ■ ■ ■
    GraphSpy/templates/outlook.html
    skipped 8 lines
    9 9   <div class="col-md-6">
    10 10   <div class="input-group">
    11 11   <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     12 + <button class="btn btn-outline-primary" type="button" data-bs-toggle="modal" data-bs-target="#access_token_modal" onclick="$('#access_token_modal_table').DataTable().ajax.reload(null, false)">Select...</button>
    12 13   <button type="Button" class="btn btn-outline-primary" onclick="fillAccessToken(this.closest('form'))">Set access token</button>
    13 14   </div>
    14 15   </div>
    skipped 26 lines
  • ■ ■ ■ ■
    GraphSpy/templates/recent_files.html
    skipped 7 lines
    8 8   <form id="recent_file_form" class="row g-3">
    9 9   <div class="col-6">
    10 10   <label for="access_token_id" class="form-label">Access token id *</label>
    11  - <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     11 + <div class="input-group">
     12 + <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     13 + <button class="btn btn-outline-primary" type="button" data-bs-toggle="modal" data-bs-target="#access_token_modal" onclick="$('#access_token_modal_table').DataTable().ajax.reload(null, false)">Select...</button>
     14 + </div>
    12 15   </div>
    13 16   <div>
    14 17   <button type="Button" class="btn btn-primary" onclick="generateTable()">Request</button>
    skipped 123 lines
  • ■ ■ ■ ■
    GraphSpy/templates/shared_with_me.html
    skipped 7 lines
    8 8   <form id="shared_file_form" class="row g-3">
    9 9   <div class="col-6">
    10 10   <label for="access_token_id" class="form-label">Access token id *</label>
    11  - <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     11 + <div class="input-group">
     12 + <input type="text" id="access_token_id" name="access_token_id" class="form-control" required>
     13 + <button class="btn btn-outline-primary" type="button" data-bs-toggle="modal" data-bs-target="#access_token_modal" onclick="$('#access_token_modal_table').DataTable().ajax.reload(null, false)">Select...</button>
     14 + </div>
    12 15   </div>
    13 16   <div>
    14 17   <button type="Button" class="btn btn-primary" onclick="generateTable()">Request</button>
    skipped 123 lines
  • ■ ■ ■ ■ ■
    README.md
    skipped 134 lines
    135 135   * Password, ESTSAuth Cookie, PRT, ...
    136 136  * Advanced token customization options and optional v2 API support (CAE)
    137 137  * Automatic Access Token Refreshing
    138  -* Set a custom user agent
    139 138  * Microsoft Teams
    140 139   * Sadly, most MSGrapgh scopes required for Microsoft Teams can not be obtained through a FOCI client id, limiting the usecases where it could be accessed.
    141 140   * So the best option would be to use the Skype API, which is a FOCI resource, although this API is not documented by Microsoft or intended for public use
    skipped 21 lines
Please wait...
Page is in error, reload to recover