5 changed files with 176 additions and 182 deletions
			
			
		| @ -0,0 +1,48 @@ | |||
| <!DOCTYPE html> | |||
| <html lang="en"> | |||
| 
 | |||
| <head> | |||
|     <meta http-equiv="content-type" content="text/html; charset=UTF-8"> | |||
|     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | |||
|     <title>Bitwarden_rs Admin Panel</title> | |||
| 
 | |||
|     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.2.1/css/bootstrap.min.css" | |||
|         integrity="sha256-azvvU9xKluwHFJ0Cpgtf0CYzK7zgtOznnzxV4924X1w=" crossorigin="anonymous" /> | |||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" | |||
|         crossorigin="anonymous"></script> | |||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/blueimp-md5/2.10.0/js/md5.js" integrity="sha256-tCQ/BldMlN2vWe5gAiNoNb5svoOgVUhlUgv7UjONKKQ=" | |||
|         crossorigin="anonymous"></script> | |||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/identicon.js/2.3.3/identicon.min.js" integrity="sha256-nYoL3nK/HA1e1pJvLwNPnpKuKG9q89VFX862r5aohmA=" | |||
|         crossorigin="anonymous"></script> | |||
| 
 | |||
|     <style> | |||
|         body { | |||
|             padding-top: 70px; | |||
|         } | |||
| 
 | |||
|         img { | |||
|             width: 48px; | |||
|             height: 48px; | |||
|         } | |||
|     </style> | |||
| </head> | |||
| 
 | |||
| <body class="bg-light"> | |||
|     <nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top shadow"> | |||
|         <a class="navbar-brand" href="#">Bitwarden_rs</a> | |||
|         <div class="navbar-collapse"> | |||
|             <ul class="navbar-nav"> | |||
|                 <li class="nav-item active"> | |||
|                     <a class="nav-link" href="/admin">Admin Panel</a> | |||
|                 </li> | |||
|                 <li class="nav-item"> | |||
|                     <a class="nav-link" href="/">Vault</a> | |||
|                 </li> | |||
|             </ul> | |||
|         </div> | |||
|     </nav> | |||
|      | |||
|     {{> (page_content) }} | |||
| </body> | |||
| 
 | |||
| </html> | |||
| @ -1,54 +1,21 @@ | |||
| <!DOCTYPE html> | |||
| <html lang="en"> | |||
| 
 | |||
| <head> | |||
|     <meta http-equiv="content-type" content="text/html; charset=UTF-8"> | |||
|     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | |||
|     <title>Bitwarden_rs Admin Panel</title> | |||
| 
 | |||
|     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha256-azvvU9xKluwHFJ0Cpgtf0CYzK7zgtOznnzxV4924X1w=" crossorigin="anonymous" /> | |||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script> | |||
| 
 | |||
|     <style> | |||
|         body { padding-top: 70px; } | |||
|     </style> | |||
| </head> | |||
| 
 | |||
| <body class="bg-light"> | |||
|     <nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top shadow"> | |||
|         <a class="navbar-brand" href="#">Bitwarden_rs</a> | |||
|         <div class="navbar-collapse"> | |||
|             <ul class="navbar-nav"> | |||
|                 <li class="nav-item active"> | |||
|                     <a class="nav-link" href="/admin">Admin Panel</a> | |||
|                 </li> | |||
|                 <li class="nav-item"> | |||
|                     <a class="nav-link" href="/">Vault</a> | |||
|                 </li> | |||
|             </ul> | |||
|         </div> | |||
|     </nav> | |||
|     <main class="container"> | |||
|         {{#if error}} | |||
|         <div class="align-items-center p-3 mb-3 text-white-50 bg-warning rounded shadow"> | |||
|             <div> | |||
|                 <h6 class="mb-0 text-white">{{error}}</h6> | |||
|             </div> | |||
| <main class="container"> | |||
|     {{#if error}} | |||
|     <div class="align-items-center p-3 mb-3 text-white-50 bg-warning rounded shadow"> | |||
|         <div> | |||
|             <h6 class="mb-0 text-white">{{error}}</h6> | |||
|         </div> | |||
|         {{/if}} | |||
|     </div> | |||
|     {{/if}} | |||
| 
 | |||
|         <div class="align-items-center p-3 mb-3 text-white-50 bg-danger rounded shadow"> | |||
|             <div> | |||
|                 <h6 class="mb-0 text-white">Authentication key needed to continue</h6> | |||
|                 <small>Please provide it below:</small> | |||
|     <div class="align-items-center p-3 mb-3 text-white-50 bg-danger rounded shadow"> | |||
|         <div> | |||
|             <h6 class="mb-0 text-white">Authentication key needed to continue</h6> | |||
|             <small>Please provide it below:</small> | |||
| 
 | |||
|                 <form class="form-inline" method="post"> | |||
|                     <input type="password" class="form-control w-50 mr-2" name="token" placeholder="Enter admin token"> | |||
|                     <button type="submit" class="btn btn-primary">Save</button> | |||
|                 </form> | |||
|             </div> | |||
|             <form class="form-inline" method="post"> | |||
|                 <input type="password" class="form-control w-50 mr-2" name="token" placeholder="Enter admin token"> | |||
|                 <button type="submit" class="btn btn-primary">Save</button> | |||
|             </form> | |||
|         </div> | |||
|     </main> | |||
| </body> | |||
| 
 | |||
| </html> | |||
|     </div> | |||
| </main> | |||
| @ -1,124 +1,83 @@ | |||
| <!DOCTYPE html> | |||
| <html lang="en"> | |||
| <main class="container"> | |||
|     <div id="users-block" class="my-3 p-3 bg-white rounded shadow"> | |||
|         <h6 class="border-bottom pb-2 mb-0">Registered Users</h6> | |||
| 
 | |||
| <head> | |||
|     <meta http-equiv="content-type" content="text/html; charset=UTF-8"> | |||
|     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | |||
|     <title>Bitwarden_rs Admin Panel</title> | |||
| 
 | |||
|     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.2.1/css/bootstrap.min.css" | |||
|         integrity="sha256-azvvU9xKluwHFJ0Cpgtf0CYzK7zgtOznnzxV4924X1w=" crossorigin="anonymous" /> | |||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" | |||
|         crossorigin="anonymous"></script> | |||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/blueimp-md5/2.10.0/js/md5.js" integrity="sha256-tCQ/BldMlN2vWe5gAiNoNb5svoOgVUhlUgv7UjONKKQ=" | |||
|         crossorigin="anonymous"></script> | |||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/identicon.js/2.3.3/identicon.min.js" integrity="sha256-nYoL3nK/HA1e1pJvLwNPnpKuKG9q89VFX862r5aohmA=" | |||
|         crossorigin="anonymous"></script> | |||
| 
 | |||
|     <style> | |||
|         body { padding-top: 70px; } | |||
|         img { width: 48px; height: 48px; } | |||
|     </style> | |||
| 
 | |||
|     <script> | |||
|         function reload() { window.location.reload(); } | |||
|         function identicon(email) { | |||
|             const data = new Identicon(md5(email), { size: 48, format: 'svg' }); | |||
|             return "data:image/svg+xml;base64," + data.toString(); | |||
|         } | |||
|         function _post(url, successMsg, errMsg, data) { | |||
|             $.post({ url: url, data: data }) | |||
|                 .done(function () { | |||
|                     alert(successMsg); | |||
|                     reload(); | |||
|                 }).fail(function (e) { | |||
|                     const r = e.responseJSON; | |||
|                     const msg = r ? r.ErrorModel.Message : "Unknown error"; | |||
|                     alert(errMsg + ": " + msg); | |||
|                 }); | |||
|         } | |||
|         function deleteUser(id, mail) { | |||
|             var input_mail = prompt("To delete user '" + mail + "', please type the name below") | |||
|             if (input_mail) { | |||
|                 if (input_mail == mail) { | |||
|                     _post("/admin/users/" + id + "/delete", | |||
|                         "User deleted correctly", | |||
|                         "Error deleting user"); | |||
|                 } else { | |||
|                     alert("Wrong email, please try again") | |||
|                 } | |||
|             } | |||
|         } | |||
|         function inviteUser() { | |||
|             inv = $("#email-invite"); | |||
|             data = JSON.stringify({ "Email": inv.val() }); | |||
|             inv.val(""); | |||
|             _post("/admin/invite/", "User invited correctly", | |||
|                 "Error inviting user", data); | |||
|         } | |||
| 
 | |||
|         $(window).on('load', function () { | |||
|             //$("#reload-btn").click(reload); | |||
|             $("#invite-form").submit(inviteUser); | |||
|             $("img.identicon").each(function (i, e) { | |||
|                 e.src = identicon(e.dataset.src); | |||
|             }); | |||
|         }); | |||
|     </script> | |||
| </head> | |||
| 
 | |||
| <body class="bg-light"> | |||
|     <nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top shadow"> | |||
|         <a class="navbar-brand" href="#">Bitwarden_rs</a> | |||
|         <div class="navbar-collapse"> | |||
|             <ul class="navbar-nav"> | |||
|                 <li class="nav-item active"> | |||
|                     <a class="nav-link" href="/admin">Admin Panel</a> | |||
|                 </li> | |||
|                 <li class="nav-item"> | |||
|                     <a class="nav-link" href="/">Vault</a> | |||
|                 </li> | |||
|             </ul> | |||
|         </div> | |||
|     </nav> | |||
|     <main class="container"> | |||
|         <div id="users-block" class="my-3 p-3 bg-white rounded shadow"> | |||
|             <h6 class="border-bottom pb-2 mb-0">Registered Users</h6> | |||
| 
 | |||
|             <div id="users-list"> | |||
|                 {{#each users}} | |||
|                 <div class="media pt-3"> | |||
|                     {{!-- row.find(".tmp-icon").attr("src", identicon(user.Email)) --}} | |||
|                     <img class="mr-2 rounded identicon" data-src="{{Email}}"> | |||
|                     <div class="media-body pb-3 mb-0 small border-bottom"> | |||
|                         <div class="d-flex justify-content-between"> | |||
|                             <strong>{{Name}}</strong> | |||
|                             <a class="tmp-del mr-3" href="" onclick='deleteUser("{{Id}}", "{{Email}}");'>Delete User</a> | |||
|                         </div> | |||
|                         <span class="d-block">{{Email}}</span> | |||
|         <div id="users-list"> | |||
|             {{#each users}} | |||
|             <div class="media pt-3"> | |||
|                 <img class="mr-2 rounded identicon" data-src="{{Email}}"> | |||
|                 <div class="media-body pb-3 mb-0 small border-bottom"> | |||
|                     <div class="d-flex justify-content-between"> | |||
|                         <strong>{{Name}}</strong> | |||
|                         <a class="tmp-del mr-3" href="" onclick='deleteUser("{{Id}}", "{{Email}}");'>Delete User</a> | |||
|                     </div> | |||
|                     <span class="d-block">{{Email}}</span> | |||
|                 </div> | |||
|                 {{/each}} | |||
| 
 | |||
|             </div> | |||
|             {{/each}} | |||
| 
 | |||
|             <small class="d-block text-right mt-3"> | |||
|                 <a id="reload-btn" href="">Reload users</a> | |||
|             </small> | |||
|         </div> | |||
| 
 | |||
|         <div id="invite-form-block" class="align-items-center p-3 mb-3 text-white-50 bg-secondary rounded shadow"> | |||
|             <div> | |||
|                 <h6 class="mb-0 text-white">Invite User</h6> | |||
|                 <small>Email:</small> | |||
|         <small class="d-block text-right mt-3"> | |||
|             <a id="reload-btn" href="">Reload users</a> | |||
|         </small> | |||
|     </div> | |||
| 
 | |||
|                 <form class="form-inline" id="invite-form"> | |||
|                     <input type="email" class="form-control w-50 mr-2" id="email-invite" placeholder="Enter email"> | |||
|                     <button type="submit" class="btn btn-primary">Invite</button> | |||
|                 </form> | |||
|             </div> | |||
|     <div id="invite-form-block" class="align-items-center p-3 mb-3 text-white-50 bg-secondary rounded shadow"> | |||
|         <div> | |||
|             <h6 class="mb-0 text-white">Invite User</h6> | |||
|             <small>Email:</small> | |||
| 
 | |||
|             <form class="form-inline" id="invite-form"> | |||
|                 <input type="email" class="form-control w-50 mr-2" id="email-invite" placeholder="Enter email"> | |||
|                 <button type="submit" class="btn btn-primary">Invite</button> | |||
|             </form> | |||
|         </div> | |||
|     </main> | |||
| </body> | |||
|     </div> | |||
| </main> | |||
| 
 | |||
| </html> | |||
| <script> | |||
|     function reload() { window.location.reload(); } | |||
|     function identicon(email) { | |||
|         const data = new Identicon(md5(email), { size: 48, format: 'svg' }); | |||
|         return "data:image/svg+xml;base64," + data.toString(); | |||
|     } | |||
|     function _post(url, successMsg, errMsg, data) { | |||
|         $.post({ url: url, data: data }) | |||
|             .done(function () { | |||
|                 alert(successMsg); | |||
|                 reload(); | |||
|             }).fail(function (e) { | |||
|                 const r = e.responseJSON; | |||
|                 const msg = r ? r.ErrorModel.Message : "Unknown error"; | |||
|                 alert(errMsg + ": " + msg); | |||
|             }); | |||
|     } | |||
|     function deleteUser(id, mail) { | |||
|         var input_mail = prompt("To delete user '" + mail + "', please type the name below") | |||
|         if (input_mail) { | |||
|             if (input_mail == mail) { | |||
|                 _post("/admin/users/" + id + "/delete", | |||
|                     "User deleted correctly", | |||
|                     "Error deleting user"); | |||
|             } else { | |||
|                 alert("Wrong email, please try again") | |||
|             } | |||
|         } | |||
|     } | |||
|     function inviteUser() { | |||
|         inv = $("#email-invite"); | |||
|         data = JSON.stringify({ "Email": inv.val() }); | |||
|         inv.val(""); | |||
|         _post("/admin/invite/", "User invited correctly", | |||
|             "Error inviting user", data); | |||
|     } | |||
| 
 | |||
|     $(window).on('load', function () { | |||
|         //$("#reload-btn").click(reload); | |||
|         $("#invite-form").submit(inviteUser); | |||
|         $("img.identicon").each(function (i, e) { | |||
|             e.src = identicon(e.dataset.src); | |||
|         }); | |||
|     }); | |||
| </script> | |||
					Loading…
					
					
				
		Reference in new issue