├── README.md ├── about.php ├── administration.php ├── agent-shell-cmd.php ├── base.php ├── browser.php ├── clear-agent-task-queue.php ├── configuration.php ├── create-listener.php ├── credentials.php ├── css ├── bootstrap.min.css ├── index.php └── style.css ├── dashboard.php ├── delete-agent-results.php ├── execute-module.php ├── fonts ├── glyphicons-halflings-regular.eot ├── glyphicons-halflings-regular.svg ├── glyphicons-halflings-regular.ttf ├── glyphicons-halflings-regular.woff └── index.php ├── generate-stager.php ├── get-result.php ├── img ├── empyre_logo_black4.png ├── github-32.png ├── github.png ├── glyphicons-halflings-white.png ├── glyphicons-halflings.png ├── index.php ├── loading64.gif ├── logo.png ├── twitter-32.png └── twitter.png ├── includes ├── check-authorize.php ├── footer.php ├── functions.php ├── head-section.php ├── index.php ├── navbar.php └── php_file_tree.php ├── index.php ├── js ├── base64.js ├── base64.min.js ├── bootstrap.min.js ├── html5shiv.js ├── index.php ├── jquery.min.js └── scripts.js ├── kill-agent.php ├── kill-listener.php ├── less ├── alerts.less ├── badges.less ├── bootstrap.less ├── breadcrumbs.less ├── button-groups.less ├── buttons.less ├── carousel.less ├── close.less ├── code.less ├── component-animations.less ├── dropdowns.less ├── forms.less ├── glyphicons.less ├── grid.less ├── index.php ├── input-groups.less ├── jumbotron.less ├── labels.less ├── list-group.less ├── media.less ├── mixins.less ├── modals.less ├── navbar.less ├── navs.less ├── normalize.less ├── pager.less ├── pagination.less ├── panels.less ├── popovers.less ├── print.less ├── progress-bars.less ├── responsive-utilities.less ├── scaffolding.less ├── tables.less ├── theme.less ├── thumbnails.less ├── tooltip.less ├── type.less ├── utilities.less ├── variables.less └── wells.less ├── login.php ├── logout.php ├── remove-agent.php ├── remove-stale-agents.php ├── rename-agent.php ├── restart-api-server.php ├── search-agent-name.php ├── search-listener-name.php ├── search-module-name.php ├── search-module.php ├── search-stager-name.php ├── show-agent-results.php ├── show-all-agents.php ├── show-all-listeners.php ├── show-all-logged-events.php ├── show-all-modules.php ├── show-all-stagers.php ├── show-logged-events-agent.php ├── show-logged-events-msg.php ├── show-logged-events-type.php ├── show-stale-agents.php ├── shutdown-api-server.php ├── styles ├── default │ ├── default.css │ ├── images │ │ ├── application.png │ │ ├── code.png │ │ ├── css.png │ │ ├── db.png │ │ ├── directory.png │ │ ├── doc.png │ │ ├── file.png │ │ ├── film.png │ │ ├── flash.png │ │ ├── html.png │ │ ├── index.php │ │ ├── java.png │ │ ├── linux.png │ │ ├── music.png │ │ ├── pdf.png │ │ ├── php.png │ │ ├── picture.png │ │ ├── ppt.png │ │ ├── psd.png │ │ ├── ruby.png │ │ ├── script.png │ │ ├── txt.png │ │ ├── xls.png │ │ └── zip.png │ └── index.php ├── index.php └── js │ └── php_file_tree.js └── version.php /README.md: -------------------------------------------------------------------------------- 1 | # EmPyre Web 2 | 3 | 4 | EmPyre Web utilizes the EmPyre REST API Server. It is a web interface for using [EmPyre](https://github.com/adaptivethreat/EmPyre). 5 | 6 | 7 | # Run EmPyre REST API Server 8 | 9 | 10 | Get EmPyre: https://github.com/adaptivethreat/EmPyre 11 | 12 | ``` 13 | ./empyre --headless --restport port --username empyre_username --password empyre_password 14 | ``` 15 | 16 | # Requirements 17 | 18 | 19 | PHP Curl should be installed to use EmPyre Web. 20 | 21 | 22 | ## Install PHP Curl 23 | 24 | ``` 25 | sudo apt-get install php5-curl 26 | ``` 27 | 28 | 29 | ## To check for PHP Curl 30 | 31 | Command Line: 32 | ``` 33 | root@kali:~# php -i | grep -i curl 34 | /etc/php5/cli/conf.d/20-curl.ini, 35 | curl 36 | cURL support => enabled 37 | cURL Information => 7.47.0 38 | ``` 39 | 40 | PHP Script: 41 | ``` 42 | 45 | ``` 46 | 47 | 48 | # Important 49 | 50 | 51 | CSRF protection has not been implemented because it was affecting the working of EmPyre Web. It will be implemented in the next release. 52 | 53 | 54 | Stay Calm. Stay Secure. Contribute :) 55 | 56 | 57 | # Screenshots 58 | 59 | 60 | ![empyre-web-login](https://cloud.githubusercontent.com/assets/5358495/15268453/d429473a-19fc-11e6-90a2-9cac96643463.PNG) 61 | 62 | 63 | ![empyre-web-about](https://cloud.githubusercontent.com/assets/5358495/15268501/7d40496c-19fe-11e6-884f-914081da2780.PNG) 64 | 65 | 66 | ![empyre-web-dashboard](https://cloud.githubusercontent.com/assets/5358495/15268458/e7132cee-19fc-11e6-8ed5-8c29f929649c.PNG) 67 | 68 | 69 | -------------------------------------------------------------------------------- /about.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | EmPyre: About 6 | 7 | 8 | 9 |
10 | 11 |
12 |
13 |
14 |
About EmPyre Web v1.0
15 |
16 | EmPyre Web utilizes the EmPyre REST API Server. It is a web interface for using EmPyre.

17 | EmPyre Web created by @xploresec

18 |     19 | 20 |
21 |
22 |
23 |
24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /administration.php: -------------------------------------------------------------------------------- 1 | Unexpected response"; 15 | } 16 | ?> 17 | 18 | 19 | 20 | EmPyre: Administration 21 | 22 | 23 | 24 |
25 | 26 |
27 |
28 |
29 |
Permanent Session Token
30 |
31 |
32 |
33 |
34 |
Restart EmPyre REST API Server
35 |
36 |
37 |
38 |
39 |
Shutdown EmPyre REST API Server
40 |
41 |
42 |
43 |
44 |
45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /agent-shell-cmd.php: -------------------------------------------------------------------------------- 1 | 0 && isset($_POST['agent_cmd']) && strlen($_POST['agent_cmd'])>0) 10 | { 11 | $agent_name = html_entity_decode(urldecode($_POST['agent_name'])); 12 | $agent_cmd = html_entity_decode(urldecode($_POST['agent_cmd'])); 13 | //Sorry but had to do it to get better results to show to the user 14 | //Here I delete the current result buffer to show current command's result to user 15 | $delete_arr_result = delete_agent_results($sess_ip, $sess_port, $sess_token, $agent_name); 16 | //Continue executing the shell command execution module 17 | $arr_result = execute_shell_cmd_agent($sess_ip, $sess_port, $sess_token, $agent_name, $agent_cmd); 18 | if(!empty($arr_result)) 19 | { 20 | if(array_key_exists("success",$arr_result)) 21 | { 22 | $resp = $arr_result["success"]; 23 | if($resp) 24 | $empire_shell_agent = "
Shell command executed successfully.
"; 25 | else 26 | $empire_shell_agent = "
Shell command could not be executed.
"; 27 | } 28 | elseif(array_key_exists("error",$arr_result)) 29 | { 30 | $empire_shell_agent = "
".ucfirst(htmlentities($arr_result['error']))."
"; 31 | } 32 | else 33 | { 34 | $empire_shell_agent = "
Unexpected response.
"; 35 | } 36 | } 37 | else 38 | { 39 | $empire_shell_agent = "
Unexpected response.
"; 40 | } 41 | } 42 | } 43 | 44 | $empire_agents = ""; 45 | $arr_result = get_all_agents($sess_ip, $sess_port, $sess_token); 46 | if(!empty($arr_result)) 47 | { 48 | $empire_agents .= ""; 49 | for($i=0; $i".htmlentities($arr_result["agents"][$i]["name"]).""; 52 | } 53 | $empire_agents .= ""; 54 | } 55 | else 56 | { 57 | $empire_agents = "
Unexpected response.
"; 58 | } 59 | ?> 60 | 61 | 62 | 63 | EmPyre: Execute Shell Command - Agent 64 | 65 | 66 | 67 |
68 | 69 |
70 |
71 |
72 |
Task Agent to Run a Shell Command
73 |
74 |
75 |
76 | 79 |
80 |
81 | 82 |
83 | 84 |
85 |
86 | 87 |
88 |
89 |

90 |
91 |
92 |
Agent Output
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |

101 |
102 | 103 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /base.php: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | EmPyre: Dashboard 10 | 11 | 12 | 13 | 14 |
15 | 16 |

EmPyre Web

17 |
18 |
19 |
20 |
Panel Header
21 |
Panel Body
22 |
23 |
24 |
25 |
Panel Header
26 |
Panel Body
27 |
28 |

29 |
30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /browser.php: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | EmPyre: Browser 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 |
19 |
20 |
21 |
File System Browser
22 |
23 | 24 |
25 |
26 |

27 |
28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /clear-agent-task-queue.php: -------------------------------------------------------------------------------- 1 | 0) 10 | { 11 | $agent_name = html_entity_decode(urldecode($_POST['agent_name'])); 12 | $arr_result = clear_agent_task_queue($sess_ip, $sess_port, $sess_token, $agent_name); 13 | if(!empty($arr_result)) 14 | { 15 | if(array_key_exists("success",$arr_result)) 16 | { 17 | $resp = $arr_result["success"]; 18 | if($resp) 19 | $empire_clear_agent_tasks = "
Agent task queue cleared.
"; 20 | else 21 | $empire_clear_agent_tasks = "
Could not clear agent task queue.
"; 22 | } 23 | elseif(array_key_exists("error",$arr_result)) 24 | { 25 | $empire_clear_agent_tasks = "
".ucfirst(htmlentities($arr_result['error']))."
"; 26 | } 27 | else 28 | { 29 | $empire_clear_agent_tasks = "
Unexpected response.
"; 30 | } 31 | } 32 | else 33 | { 34 | $empire_clear_agent_tasks = "
Unexpected response.
"; 35 | } 36 | } 37 | } 38 | 39 | $empire_agents = ""; 40 | $arr_result = get_all_agents($sess_ip, $sess_port, $sess_token); 41 | if(!empty($arr_result)) 42 | { 43 | $empire_agents .= ""; 44 | for($i=0; $i".htmlentities($arr_result["agents"][$i]["name"]).""; 47 | } 48 | $empire_agents .= ""; 49 | } 50 | else 51 | { 52 | $empire_agents = "
Unexpected response.
"; 53 | } 54 | ?> 55 | 56 | 57 | 58 | EmPyre: Clear Task Queue 59 | 60 | 61 | 62 |
63 | 64 |
65 |
66 |
67 |
Clear Agent Task Queue
68 |
69 |
70 | Clears the queued tasks for the agent specified by Agent Name.

71 |
72 | 75 |
76 | 77 |
78 |
79 | 80 |
81 |
82 |
83 |
84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /configuration.php: -------------------------------------------------------------------------------- 1 | Configuration NameConfiguration Value'; 11 | foreach($arr_result["config"][0] as $key => $value) 12 | { 13 | $key = htmlentities($key); 14 | $value = htmlentities($value); 15 | $empire_config .= "$key$value"; 16 | } 17 | $empire_config .= ''; 18 | } 19 | else 20 | { 21 | $empire_config = "
Unexpected response
"; 22 | } 23 | ?> 24 | 25 | 26 | 27 | EmPyre: Configuration 28 | 29 | 30 | 31 |
32 | 33 |
34 |
35 |
36 |
Configuration Information
37 |
38 |
39 |
40 |
41 |
42 |
43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /credentials.php: -------------------------------------------------------------------------------- 1 | ".ucfirst(htmlentities($arr_result["error"])).""; 11 | } 12 | else 13 | { 14 | if(is_array($arr_result)) 15 | { 16 | if(!empty($arr_result)) 17 | { 18 | $empire_credentials .= ''; 19 | if(array_key_exists("creds",$arr_result)) 20 | { 21 | if(sizeof($arr_result["creds"])>0) 22 | { 23 | foreach($arr_result["creds"][0] as $key => $value) 24 | { 25 | $empire_credentials .= ''; 26 | } 27 | for($i=0; $i $value) 31 | { 32 | $value = htmlentities($value); 33 | $empire_credentials .= ""; 34 | } 35 | $empire_credentials .= ""; 36 | } 37 | $empire_credentials .= '
'.htmlentities($key).'$value
'; 38 | } 39 | else 40 | { 41 | $empire_credentials = "
No credentials found.
"; 42 | } 43 | } 44 | else 45 | { 46 | $empire_credentials = "
Unexpected response.
"; 47 | } 48 | } 49 | else 50 | { 51 | $empire_credentials = "
Unexpected response.
"; 52 | } 53 | } 54 | else 55 | { 56 | if(!empty($arr_result)) 57 | { 58 | $empire_credentials = "
".ucfirst(htmlentities($arr_result["error"]))."
"; 59 | } 60 | else 61 | { 62 | $empire_credentials = "
Unexpected response.
"; 63 | } 64 | } 65 | } 66 | ?> 67 | 68 | 69 | 70 | EmPyre: Credentials 71 | 72 | 73 | 74 |
75 | 76 |
77 |
78 |
79 |
Credentials
80 |
81 |
82 |

83 |
84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /css/index.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/css/index.php -------------------------------------------------------------------------------- /css/style.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/css/style.css -------------------------------------------------------------------------------- /dashboard.php: -------------------------------------------------------------------------------- 1 | Unexpected response."; 15 | } 16 | 17 | $agent_count = "0 agents currently active" ; 18 | $arr_result = get_all_agents($sess_ip, $sess_port, $sess_token); 19 | if(!empty($arr_result)) 20 | { 21 | $agent_count = sizeof($arr_result["agents"]) . " agents currently active"; 22 | } 23 | else 24 | { 25 | $agent_count = "
Unexpected response.
"; 26 | } 27 | ?> 28 | 29 | 30 | 31 | EmPyre: Dashboard 32 | 33 | 34 | 35 | 36 |
37 | 38 |

EmPyre Web

39 |
40 |
41 |
42 |
EmPyre Listeners
43 |
44 |
45 |
46 |
47 |
EmPyre Agents
48 |
49 |
50 |
51 |
52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /delete-agent-results.php: -------------------------------------------------------------------------------- 1 | 0) 10 | { 11 | $agent_name = html_entity_decode(urldecode($_POST['agent_name'])); 12 | $arr_result = delete_agent_results($sess_ip, $sess_port, $sess_token, $agent_name); 13 | if(!empty($arr_result)) 14 | { 15 | if(array_key_exists("success",$arr_result)) 16 | { 17 | $resp = $arr_result["success"]; 18 | if($resp) 19 | $empire_delete_agent_results = "
Agent results deleted successfully.
"; 20 | else 21 | $empire_delete_agent_results = "
Could not delete agent's results.
"; 22 | } 23 | elseif(array_key_exists("error",$arr_result)) 24 | { 25 | $empire_delete_agent_results = "
".ucfirst(htmlentities($arr_result['error']))."
"; 26 | } 27 | else 28 | { 29 | $empire_delete_agent_results = "
Unexpected response.
"; 30 | } 31 | } 32 | else 33 | { 34 | $empire_delete_agent_results = "
Unexpected response.
"; 35 | } 36 | } 37 | } 38 | 39 | $empire_agents = ""; 40 | $arr_result = get_all_agents($sess_ip, $sess_port, $sess_token); 41 | if(!empty($arr_result)) 42 | { 43 | $empire_agents .= ""; 44 | for($i=0; $i".htmlentities($arr_result["agents"][$i]["name"]).""; 47 | } 48 | $empire_agents .= ""; 49 | } 50 | else 51 | { 52 | $empire_agents = "
Unexpected response.
"; 53 | } 54 | ?> 55 | 56 | 57 | 58 | EmPyre: Delete Agent Results 59 | 60 | 61 | 62 |
63 | 64 |
65 |
66 |
67 |
Delete Agent Results
68 |
69 |
70 | Deletes the result buffer for the agent specified by Agent Name.

71 |
72 | 75 |
76 | 77 |
78 |
79 | 80 |
81 |
82 |
83 |
84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /fonts/index.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/fonts/index.php -------------------------------------------------------------------------------- /get-result.php: -------------------------------------------------------------------------------- 1 | 0) 11 | { 12 | //Get agent results 13 | $agent_name = html_entity_decode(urldecode($_POST['agent_name'])); 14 | $arr_result = show_agent_results($sess_ip, $sess_port, $sess_token, $agent_name); 15 | if(!empty($arr_result)) 16 | { 17 | if(array_key_exists("results",$arr_result)) 18 | { 19 | if(sizeof($arr_result["results"])>0) 20 | { 21 | if(array_key_exists("agentname", $arr_result["results"][0]) && array_key_exists("results", $arr_result["results"][0])) 22 | { 23 | $val_agent_name = htmlentities($arr_result["results"][0]["agentname"]); 24 | $val_agent_results = htmlentities($arr_result["results"][0]["results"]); 25 | $val_agent_results = (strlen($val_agent_results)>0 ? $val_agent_results : "No results"); 26 | $empire_show_agent_results .= "
$val_agent_results
"; 27 | } 28 | else 29 | { 30 | $empire_show_agent_results = "
Unexpected response.
"; 31 | } 32 | } 33 | else 34 | { 35 | $empire_show_agent_results = "
Unexpected response.
"; 36 | } 37 | } 38 | elseif(array_key_exists("error",$arr_result)) 39 | { 40 | $empire_show_agent_results = "
".ucfirst(htmlentities($arr_result['error']))."
"; 41 | } 42 | else 43 | { 44 | $empire_show_agent_results = "
Unexpected response.
"; 45 | } 46 | } 47 | else 48 | { 49 | $empire_show_agent_results = "
Unexpected response.
"; 50 | } 51 | echo $empire_show_agent_results; 52 | } 53 | } 54 | ?> -------------------------------------------------------------------------------- /img/empyre_logo_black4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/img/empyre_logo_black4.png -------------------------------------------------------------------------------- /img/github-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/img/github-32.png -------------------------------------------------------------------------------- /img/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/img/github.png -------------------------------------------------------------------------------- /img/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/img/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /img/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/img/glyphicons-halflings.png -------------------------------------------------------------------------------- /img/index.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/img/index.php -------------------------------------------------------------------------------- /img/loading64.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/img/loading64.gif -------------------------------------------------------------------------------- /img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/img/logo.png -------------------------------------------------------------------------------- /img/twitter-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/img/twitter-32.png -------------------------------------------------------------------------------- /img/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/img/twitter.png -------------------------------------------------------------------------------- /includes/check-authorize.php: -------------------------------------------------------------------------------- 1 | 0 && strlen($sess_port)>0 && strlen($sess_user)>0 && strlen($sess_pass)>0 && strlen($sess_token)>0 && strlen($sess_csrf)==64) 14 | { 15 | $allow = 1; 16 | } 17 | else 18 | { 19 | die('
Unauthorized Access 1
'); 20 | } 21 | } 22 | else 23 | { 24 | die('
Unauthorized Access 2
'); 25 | } 26 | if($allow!=1) 27 | { 28 | die('
Unauthorized Access 3
'); 29 | } 30 | ?> -------------------------------------------------------------------------------- /includes/footer.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

5 | 6 |  EmPyre Web v1.0  7 | 8 |

9 |
10 |
11 |
-------------------------------------------------------------------------------- /includes/head-section.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /includes/index.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/includes/index.php -------------------------------------------------------------------------------- /includes/php_file_tree.php: -------------------------------------------------------------------------------- 1 | 2 ) { // Use 2 instead of 0 to account for . and .. "directories" 52 | $php_file_tree = "" . htmlspecialchars($this_file) . ""; 60 | $php_file_tree .= php_file_tree_dir("$directory/$this_file", $return_link ,$extensions, false); 61 | $php_file_tree .= ""; 62 | } else { 63 | // File 64 | // Get extension (prepend 'ext-' to prevent invalid classes from extensions that begin with numbers) 65 | $ext = "ext-" . substr($this_file, strrpos($this_file, ".") + 1); 66 | $link = str_replace("[link]", "$directory/" . urlencode($this_file), $return_link); 67 | $php_file_tree .= "
  • " . htmlspecialchars($this_file) . "
  • "; 68 | } 69 | } 70 | } 71 | $php_file_tree .= ""; 72 | } 73 | return $php_file_tree; 74 | } 75 | 76 | // For PHP4 compatibility 77 | function php4_scandir($dir) { 78 | $dh = opendir($dir); 79 | while( false !== ($filename = readdir($dh)) ) { 80 | $files[] = $filename; 81 | } 82 | sort($files); 83 | return($files); 84 | } 85 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /js/base64.js: -------------------------------------------------------------------------------- 1 | var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9+/=]/g,"");while(f>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/rn/g,"n");var t="";for(var n=0;n127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}} -------------------------------------------------------------------------------- /js/base64.min.js: -------------------------------------------------------------------------------- 1 | (function(global){"use strict";var _Base64=global.Base64;var version="2.1.9";var buffer;if(typeof module!=="undefined"&&module.exports){try{buffer=require("buffer").Buffer}catch(err){}}var b64chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var b64tab=function(bin){var t={};for(var i=0,l=bin.length;i>>6)+fromCharCode(128|cc&63):fromCharCode(224|cc>>>12&15)+fromCharCode(128|cc>>>6&63)+fromCharCode(128|cc&63)}else{var cc=65536+(c.charCodeAt(0)-55296)*1024+(c.charCodeAt(1)-56320);return fromCharCode(240|cc>>>18&7)+fromCharCode(128|cc>>>12&63)+fromCharCode(128|cc>>>6&63)+fromCharCode(128|cc&63)}};var re_utob=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;var utob=function(u){return u.replace(re_utob,cb_utob)};var cb_encode=function(ccc){var padlen=[0,2,1][ccc.length%3],ord=ccc.charCodeAt(0)<<16|(ccc.length>1?ccc.charCodeAt(1):0)<<8|(ccc.length>2?ccc.charCodeAt(2):0),chars=[b64chars.charAt(ord>>>18),b64chars.charAt(ord>>>12&63),padlen>=2?"=":b64chars.charAt(ord>>>6&63),padlen>=1?"=":b64chars.charAt(ord&63)];return chars.join("")};var btoa=global.btoa?function(b){return global.btoa(b)}:function(b){return b.replace(/[\s\S]{1,3}/g,cb_encode)};var _encode=buffer?function(u){return(u.constructor===buffer.constructor?u:new buffer(u)).toString("base64")}:function(u){return btoa(utob(u))};var encode=function(u,urisafe){return!urisafe?_encode(String(u)):_encode(String(u)).replace(/[+\/]/g,function(m0){return m0=="+"?"-":"_"}).replace(/=/g,"")};var encodeURI=function(u){return encode(u,true)};var re_btou=new RegExp(["[À-ß][€-¿]","[à-ï][€-¿]{2}","[ð-÷][€-¿]{3}"].join("|"),"g");var cb_btou=function(cccc){switch(cccc.length){case 4:var cp=(7&cccc.charCodeAt(0))<<18|(63&cccc.charCodeAt(1))<<12|(63&cccc.charCodeAt(2))<<6|63&cccc.charCodeAt(3),offset=cp-65536;return fromCharCode((offset>>>10)+55296)+fromCharCode((offset&1023)+56320);case 3:return fromCharCode((15&cccc.charCodeAt(0))<<12|(63&cccc.charCodeAt(1))<<6|63&cccc.charCodeAt(2));default:return fromCharCode((31&cccc.charCodeAt(0))<<6|63&cccc.charCodeAt(1))}};var btou=function(b){return b.replace(re_btou,cb_btou)};var cb_decode=function(cccc){var len=cccc.length,padlen=len%4,n=(len>0?b64tab[cccc.charAt(0)]<<18:0)|(len>1?b64tab[cccc.charAt(1)]<<12:0)|(len>2?b64tab[cccc.charAt(2)]<<6:0)|(len>3?b64tab[cccc.charAt(3)]:0),chars=[fromCharCode(n>>>16),fromCharCode(n>>>8&255),fromCharCode(n&255)];chars.length-=[0,0,2,1][padlen];return chars.join("")};var atob=global.atob?function(a){return global.atob(a)}:function(a){return a.replace(/[\s\S]{1,4}/g,cb_decode)};var _decode=buffer?function(a){return(a.constructor===buffer.constructor?a:new buffer(a,"base64")).toString()}:function(a){return btou(atob(a))};var decode=function(a){return _decode(String(a).replace(/[-_]/g,function(m0){return m0=="-"?"+":"/"}).replace(/[^A-Za-z0-9\+\/]/g,""))};var noConflict=function(){var Base64=global.Base64;global.Base64=_Base64;return Base64};global.Base64={VERSION:version,atob:atob,btoa:btoa,fromBase64:decode,toBase64:encode,utob:utob,encode:encode,encodeURI:encodeURI,btou:btou,decode:decode,noConflict:noConflict};if(typeof Object.defineProperty==="function"){var noEnum=function(v){return{value:v,enumerable:false,writable:true,configurable:true}};global.Base64.extendString=function(){Object.defineProperty(String.prototype,"fromBase64",noEnum(function(){return decode(this)}));Object.defineProperty(String.prototype,"toBase64",noEnum(function(urisafe){return encode(this,urisafe)}));Object.defineProperty(String.prototype,"toBase64URI",noEnum(function(){return encode(this,true)}))}}if(global["Meteor"]){Base64=global.Base64}})(this); -------------------------------------------------------------------------------- /js/html5shiv.js: -------------------------------------------------------------------------------- 1 | /* 2 | HTML5 Shiv v3.6.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | (function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); 5 | a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; 6 | c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| 7 | "undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video",version:"3.6.2",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment(); 8 | for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d0) 10 | { 11 | $kill_agent = html_entity_decode(urldecode($_POST['kill_agent'])); 12 | $arr_result = kill_agent($sess_ip, $sess_port, $sess_token, $kill_agent); 13 | if(!empty($arr_result)) 14 | { 15 | if(array_key_exists("success",$arr_result)) 16 | { 17 | $resp = $arr_result["success"]; 18 | if($resp) 19 | $empire_kill_agent = "
    Agent killed successfully.
    "; 20 | else 21 | $empire_kill_agent = "
    Could not kill agent.
    "; 22 | } 23 | elseif(array_key_exists("error",$arr_result)) 24 | { 25 | $empire_kill_agent = "
    ".ucfirst(htmlentities($arr_result['error']))."
    "; 26 | } 27 | else 28 | { 29 | $empire_kill_agent = "
    Unexpected response.
    "; 30 | } 31 | } 32 | else 33 | { 34 | $empire_kill_agent = "
    Unexpected response.
    "; 35 | } 36 | } 37 | } 38 | 39 | $empire_agents = ""; 40 | $arr_result = get_all_agents($sess_ip, $sess_port, $sess_token); 41 | if(!empty($arr_result)) 42 | { 43 | $empire_agents .= ""; 44 | for($i=0; $i".htmlentities($arr_result["agents"][$i]["name"]).""; 47 | } 48 | $empire_agents .= ""; 49 | } 50 | else 51 | { 52 | $empire_agents = "
    Unexpected response.
    "; 53 | } 54 | ?> 55 | 56 | 57 | 58 | EmPyre: Kill Agent(s) 59 | 60 | 61 | 62 |
    63 | 64 |
    65 |
    66 |
    67 |
    Kill Agent(s)
    68 |
    69 |
    70 | Tasks an agent or all agents to exit.

    71 |
    72 | 75 |
    76 | 77 |
    78 |
    79 | 80 |
    81 |
    82 |

    83 |
    84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /kill-listener.php: -------------------------------------------------------------------------------- 1 | 0) 8 | { 9 | $kill_listener = html_entity_decode(urldecode($_POST['kill_listener'])); 10 | $arr_result = kill_listener($sess_ip, $sess_port, $sess_token, $kill_listener); 11 | if(!empty($arr_result)) 12 | { 13 | if(array_key_exists("error", $arr_result)) 14 | { 15 | $empire_kill_listener = "
    ".ucfirst(htmlentities($arr_result["error"]))."
    "; 16 | } 17 | elseif(array_key_exists("success", $arr_result)) 18 | { 19 | if($arr_result["success"] == True) 20 | { 21 | $empire_kill_listener .= "
    Listener killed successfully.
    "; 22 | } 23 | elseif($arr_result["success"] == False) 24 | { 25 | $empire_kill_listener .= "
    Kill listener failed.
    "; 26 | } 27 | else 28 | { 29 | $empire_kill_listener = "
    Unexpected response.
    "; 30 | } 31 | } 32 | else 33 | { 34 | $empire_kill_listener = "
    Unexpected response.
    "; 35 | } 36 | } 37 | else 38 | { 39 | $empire_kill_listener = "
    Unexpected response.
    "; 40 | } 41 | } 42 | 43 | $empire_listeners = ""; 44 | $arr_result = get_all_listeners($sess_ip, $sess_port, $sess_token); 45 | if(!empty($arr_result)) 46 | { 47 | $empire_listeners .= ""; 48 | for($i=0; $i".htmlentities($arr_result["listeners"][$i]["name"]).""; 51 | } 52 | $empire_listeners .= ""; 53 | } 54 | else 55 | { 56 | $empire_listeners = "
    Unexpected response.
    "; 57 | } 58 | ?> 59 | 60 | 61 | 62 | EmPyre: Kill Listener 63 | 64 | 65 | 66 |
    67 | 68 |
    69 |
    70 |
    71 |
    Kill Listener(s)
    72 |
    73 |
    74 |
    75 | 78 |
    79 | 80 |
    81 |
    82 | 83 |
    84 |
    85 |

    86 |
    87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /less/alerts.less: -------------------------------------------------------------------------------- 1 | // 2 | // Alerts 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base styles 7 | // ------------------------- 8 | 9 | .alert { 10 | padding: @alert-padding; 11 | margin-bottom: @line-height-computed; 12 | border: 1px solid transparent; 13 | border-radius: @alert-border-radius; 14 | 15 | // Headings for larger alerts 16 | h4 { 17 | margin-top: 0; 18 | // Specified for the h4 to prevent conflicts of changing @headings-color 19 | color: inherit; 20 | } 21 | // Provide class for links that match alerts 22 | .alert-link { 23 | font-weight: @alert-link-font-weight; 24 | } 25 | 26 | // Improve alignment and spacing of inner content 27 | > p, 28 | > ul { 29 | margin-bottom: 0; 30 | } 31 | > p + p { 32 | margin-top: 5px; 33 | } 34 | } 35 | 36 | // Dismissable alerts 37 | // 38 | // Expand the right padding and account for the close button's positioning. 39 | 40 | .alert-dismissable { 41 | padding-right: (@alert-padding + 20); 42 | 43 | // Adjust close link position 44 | .close { 45 | position: relative; 46 | top: -2px; 47 | right: -21px; 48 | color: inherit; 49 | } 50 | } 51 | 52 | // Alternate styles 53 | // 54 | // Generate contextual modifier classes for colorizing the alert. 55 | 56 | .alert-success { 57 | .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); 58 | } 59 | .alert-info { 60 | .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); 61 | } 62 | .alert-warning { 63 | .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); 64 | } 65 | .alert-danger { 66 | .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); 67 | } 68 | -------------------------------------------------------------------------------- /less/badges.less: -------------------------------------------------------------------------------- 1 | // 2 | // Badges 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base classes 7 | .badge { 8 | display: inline-block; 9 | min-width: 10px; 10 | padding: 3px 7px; 11 | font-size: @font-size-small; 12 | font-weight: @badge-font-weight; 13 | color: @badge-color; 14 | line-height: @badge-line-height; 15 | vertical-align: baseline; 16 | white-space: nowrap; 17 | text-align: center; 18 | background-color: @badge-bg; 19 | border-radius: @badge-border-radius; 20 | 21 | // Empty badges collapse automatically (not available in IE8) 22 | &:empty { 23 | display: none; 24 | } 25 | } 26 | 27 | // Hover state, but only for links 28 | a.badge { 29 | &:hover, 30 | &:focus { 31 | color: @badge-link-hover-color; 32 | text-decoration: none; 33 | cursor: pointer; 34 | } 35 | } 36 | 37 | // Quick fix for labels/badges in buttons 38 | .btn .badge { 39 | position: relative; 40 | top: -1px; 41 | } 42 | 43 | // Account for counters in navs 44 | a.list-group-item.active > .badge, 45 | .nav-pills > .active > a > .badge { 46 | color: @badge-active-color; 47 | background-color: @badge-active-bg; 48 | } 49 | .nav-pills > li > a > .badge { 50 | margin-left: 3px; 51 | } 52 | -------------------------------------------------------------------------------- /less/bootstrap.less: -------------------------------------------------------------------------------- 1 | // Core variables and mixins 2 | @import "variables.less"; 3 | @import "mixins.less"; 4 | 5 | // Reset 6 | @import "normalize.less"; 7 | @import "print.less"; 8 | 9 | // Core CSS 10 | @import "scaffolding.less"; 11 | @import "type.less"; 12 | @import "code.less"; 13 | @import "grid.less"; 14 | @import "tables.less"; 15 | @import "forms.less"; 16 | @import "buttons.less"; 17 | 18 | // Components 19 | @import "component-animations.less"; 20 | @import "glyphicons.less"; 21 | @import "dropdowns.less"; 22 | @import "button-groups.less"; 23 | @import "input-groups.less"; 24 | @import "navs.less"; 25 | @import "navbar.less"; 26 | @import "breadcrumbs.less"; 27 | @import "pagination.less"; 28 | @import "pager.less"; 29 | @import "labels.less"; 30 | @import "badges.less"; 31 | @import "jumbotron.less"; 32 | @import "thumbnails.less"; 33 | @import "alerts.less"; 34 | @import "progress-bars.less"; 35 | @import "media.less"; 36 | @import "list-group.less"; 37 | @import "panels.less"; 38 | @import "wells.less"; 39 | @import "close.less"; 40 | 41 | // Components w/ JavaScript 42 | @import "modals.less"; 43 | @import "tooltip.less"; 44 | @import "popovers.less"; 45 | @import "carousel.less"; 46 | 47 | // Utility classes 48 | @import "utilities.less"; 49 | @import "responsive-utilities.less"; 50 | -------------------------------------------------------------------------------- /less/breadcrumbs.less: -------------------------------------------------------------------------------- 1 | // 2 | // Breadcrumbs 3 | // -------------------------------------------------- 4 | 5 | 6 | .breadcrumb { 7 | padding: 8px 15px; 8 | margin-bottom: @line-height-computed; 9 | list-style: none; 10 | background-color: @breadcrumb-bg; 11 | border-radius: @border-radius-base; 12 | > li { 13 | display: inline-block; 14 | + li:before { 15 | content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space 16 | padding: 0 5px; 17 | color: @breadcrumb-color; 18 | } 19 | } 20 | > .active { 21 | color: @breadcrumb-active-color; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /less/buttons.less: -------------------------------------------------------------------------------- 1 | // 2 | // Buttons 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base styles 7 | // -------------------------------------------------- 8 | 9 | // Core styles 10 | .btn { 11 | display: inline-block; 12 | margin-bottom: 0; // For input.btn 13 | font-weight: @btn-font-weight; 14 | text-align: center; 15 | vertical-align: middle; 16 | cursor: pointer; 17 | background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 18 | border: 1px solid transparent; 19 | white-space: nowrap; 20 | .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base); 21 | .user-select(none); 22 | 23 | &:focus { 24 | .tab-focus(); 25 | } 26 | 27 | &:hover, 28 | &:focus { 29 | color: @btn-default-color; 30 | text-decoration: none; 31 | } 32 | 33 | &:active, 34 | &.active { 35 | outline: 0; 36 | background-image: none; 37 | .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); 38 | } 39 | 40 | &.disabled, 41 | &[disabled], 42 | fieldset[disabled] & { 43 | cursor: not-allowed; 44 | pointer-events: none; // Future-proof disabling of clicks 45 | .opacity(.65); 46 | .box-shadow(none); 47 | } 48 | 49 | } 50 | 51 | 52 | // Alternate buttons 53 | // -------------------------------------------------- 54 | 55 | .btn-default { 56 | .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border); 57 | } 58 | .btn-primary { 59 | .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border); 60 | } 61 | // Warning appears as orange 62 | .btn-warning { 63 | .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border); 64 | } 65 | // Danger and error appear as red 66 | .btn-danger { 67 | .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border); 68 | } 69 | // Success appears as green 70 | .btn-success { 71 | .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border); 72 | } 73 | // Info appears as blue-green 74 | .btn-info { 75 | .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border); 76 | } 77 | 78 | 79 | // Link buttons 80 | // ------------------------- 81 | 82 | // Make a button look and behave like a link 83 | .btn-link { 84 | color: @link-color; 85 | font-weight: normal; 86 | cursor: pointer; 87 | border-radius: 0; 88 | 89 | &, 90 | &:active, 91 | &[disabled], 92 | fieldset[disabled] & { 93 | background-color: transparent; 94 | .box-shadow(none); 95 | } 96 | &, 97 | &:hover, 98 | &:focus, 99 | &:active { 100 | border-color: transparent; 101 | } 102 | &:hover, 103 | &:focus { 104 | color: @link-hover-color; 105 | text-decoration: underline; 106 | background-color: transparent; 107 | } 108 | &[disabled], 109 | fieldset[disabled] & { 110 | &:hover, 111 | &:focus { 112 | color: @btn-link-disabled-color; 113 | text-decoration: none; 114 | } 115 | } 116 | } 117 | 118 | 119 | // Button Sizes 120 | // -------------------------------------------------- 121 | 122 | .btn-lg { 123 | // line-height: ensure even-numbered height of button next to large input 124 | .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large); 125 | } 126 | .btn-sm, 127 | .btn-xs { 128 | // line-height: ensure proper height of button next to small input 129 | .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small); 130 | } 131 | .btn-xs { 132 | padding: 1px 5px; 133 | } 134 | 135 | 136 | // Block button 137 | // -------------------------------------------------- 138 | 139 | .btn-block { 140 | display: block; 141 | width: 100%; 142 | padding-left: 0; 143 | padding-right: 0; 144 | } 145 | 146 | // Vertically space out multiple block buttons 147 | .btn-block + .btn-block { 148 | margin-top: 5px; 149 | } 150 | 151 | // Specificity overrides 152 | input[type="submit"], 153 | input[type="reset"], 154 | input[type="button"] { 155 | &.btn-block { 156 | width: 100%; 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /less/carousel.less: -------------------------------------------------------------------------------- 1 | // 2 | // Carousel 3 | // -------------------------------------------------- 4 | 5 | 6 | // Wrapper for the slide container and indicators 7 | .carousel { 8 | position: relative; 9 | } 10 | 11 | .carousel-inner { 12 | position: relative; 13 | overflow: hidden; 14 | width: 100%; 15 | 16 | > .item { 17 | display: none; 18 | position: relative; 19 | .transition(.6s ease-in-out left); 20 | 21 | // Account for jankitude on images 22 | > img, 23 | > a > img { 24 | .img-responsive(); 25 | line-height: 1; 26 | } 27 | } 28 | 29 | > .active, 30 | > .next, 31 | > .prev { display: block; } 32 | 33 | > .active { 34 | left: 0; 35 | } 36 | 37 | > .next, 38 | > .prev { 39 | position: absolute; 40 | top: 0; 41 | width: 100%; 42 | } 43 | 44 | > .next { 45 | left: 100%; 46 | } 47 | > .prev { 48 | left: -100%; 49 | } 50 | > .next.left, 51 | > .prev.right { 52 | left: 0; 53 | } 54 | 55 | > .active.left { 56 | left: -100%; 57 | } 58 | > .active.right { 59 | left: 100%; 60 | } 61 | 62 | } 63 | 64 | // Left/right controls for nav 65 | // --------------------------- 66 | 67 | .carousel-control { 68 | position: absolute; 69 | top: 0; 70 | left: 0; 71 | bottom: 0; 72 | width: @carousel-control-width; 73 | .opacity(@carousel-control-opacity); 74 | font-size: @carousel-control-font-size; 75 | color: @carousel-control-color; 76 | text-align: center; 77 | text-shadow: @carousel-text-shadow; 78 | // We can't have this transition here because WebKit cancels the carousel 79 | // animation if you trip this while in the middle of another animation. 80 | 81 | // Set gradients for backgrounds 82 | &.left { 83 | #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001)); 84 | } 85 | &.right { 86 | left: auto; 87 | right: 0; 88 | #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5)); 89 | } 90 | 91 | // Hover/focus state 92 | &:hover, 93 | &:focus { 94 | color: @carousel-control-color; 95 | text-decoration: none; 96 | .opacity(.9); 97 | } 98 | 99 | // Toggles 100 | .icon-prev, 101 | .icon-next, 102 | .glyphicon-chevron-left, 103 | .glyphicon-chevron-right { 104 | position: absolute; 105 | top: 50%; 106 | z-index: 5; 107 | display: inline-block; 108 | } 109 | .icon-prev, 110 | .glyphicon-chevron-left { 111 | left: 50%; 112 | } 113 | .icon-next, 114 | .glyphicon-chevron-right { 115 | right: 50%; 116 | } 117 | .icon-prev, 118 | .icon-next { 119 | width: 20px; 120 | height: 20px; 121 | margin-top: -10px; 122 | margin-left: -10px; 123 | font-family: serif; 124 | } 125 | 126 | .icon-prev { 127 | &:before { 128 | content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039) 129 | } 130 | } 131 | .icon-next { 132 | &:before { 133 | content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A) 134 | } 135 | } 136 | } 137 | 138 | // Optional indicator pips 139 | // 140 | // Add an unordered list with the following class and add a list item for each 141 | // slide your carousel holds. 142 | 143 | .carousel-indicators { 144 | position: absolute; 145 | bottom: 10px; 146 | left: 50%; 147 | z-index: 15; 148 | width: 60%; 149 | margin-left: -30%; 150 | padding-left: 0; 151 | list-style: none; 152 | text-align: center; 153 | 154 | li { 155 | display: inline-block; 156 | width: 10px; 157 | height: 10px; 158 | margin: 1px; 159 | text-indent: -999px; 160 | border: 1px solid @carousel-indicator-border-color; 161 | border-radius: 10px; 162 | cursor: pointer; 163 | 164 | // IE8-9 hack for event handling 165 | // 166 | // Internet Explorer 8-9 does not support clicks on elements without a set 167 | // `background-color`. We cannot use `filter` since that's not viewed as a 168 | // background color by the browser. Thus, a hack is needed. 169 | // 170 | // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we 171 | // set alpha transparency for the best results possible. 172 | background-color: #000 \9; // IE8 173 | background-color: rgba(0,0,0,0); // IE9 174 | } 175 | .active { 176 | margin: 0; 177 | width: 12px; 178 | height: 12px; 179 | background-color: @carousel-indicator-active-bg; 180 | } 181 | } 182 | 183 | // Optional captions 184 | // ----------------------------- 185 | // Hidden by default for smaller viewports 186 | .carousel-caption { 187 | position: absolute; 188 | left: 15%; 189 | right: 15%; 190 | bottom: 20px; 191 | z-index: 10; 192 | padding-top: 20px; 193 | padding-bottom: 20px; 194 | color: @carousel-caption-color; 195 | text-align: center; 196 | text-shadow: @carousel-text-shadow; 197 | & .btn { 198 | text-shadow: none; // No shadow for button elements in carousel-caption 199 | } 200 | } 201 | 202 | 203 | // Scale up controls for tablets and up 204 | @media screen and (min-width: @screen-sm-min) { 205 | 206 | // Scale up the controls a smidge 207 | .carousel-control { 208 | .glyphicons-chevron-left, 209 | .glyphicons-chevron-right, 210 | .icon-prev, 211 | .icon-next { 212 | width: 30px; 213 | height: 30px; 214 | margin-top: -15px; 215 | margin-left: -15px; 216 | font-size: 30px; 217 | } 218 | } 219 | 220 | // Show and left align the captions 221 | .carousel-caption { 222 | left: 20%; 223 | right: 20%; 224 | padding-bottom: 30px; 225 | } 226 | 227 | // Move up the indicators 228 | .carousel-indicators { 229 | bottom: 20px; 230 | } 231 | } 232 | -------------------------------------------------------------------------------- /less/close.less: -------------------------------------------------------------------------------- 1 | // 2 | // Close icons 3 | // -------------------------------------------------- 4 | 5 | 6 | .close { 7 | float: right; 8 | font-size: (@font-size-base * 1.5); 9 | font-weight: @close-font-weight; 10 | line-height: 1; 11 | color: @close-color; 12 | text-shadow: @close-text-shadow; 13 | .opacity(.2); 14 | 15 | &:hover, 16 | &:focus { 17 | color: @close-color; 18 | text-decoration: none; 19 | cursor: pointer; 20 | .opacity(.5); 21 | } 22 | 23 | // Additional properties for button version 24 | // iOS requires the button element instead of an anchor tag. 25 | // If you want the anchor version, it requires `href="#"`. 26 | button& { 27 | padding: 0; 28 | cursor: pointer; 29 | background: transparent; 30 | border: 0; 31 | -webkit-appearance: none; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /less/code.less: -------------------------------------------------------------------------------- 1 | // 2 | // Code (inline and block) 3 | // -------------------------------------------------- 4 | 5 | 6 | // Inline and block code styles 7 | code, 8 | kbd, 9 | pre, 10 | samp { 11 | font-family: @font-family-monospace; 12 | } 13 | 14 | // Inline code 15 | code { 16 | padding: 2px 4px; 17 | font-size: 90%; 18 | color: @code-color; 19 | background-color: @code-bg; 20 | white-space: nowrap; 21 | border-radius: @border-radius-base; 22 | } 23 | 24 | // Blocks of code 25 | pre { 26 | display: block; 27 | padding: ((@line-height-computed - 1) / 2); 28 | margin: 0 0 (@line-height-computed / 2); 29 | font-size: (@font-size-base - 1); // 14px to 13px 30 | line-height: @line-height-base; 31 | word-break: break-all; 32 | word-wrap: break-word; 33 | color: @pre-color; 34 | background-color: @pre-bg; 35 | border: 1px solid @pre-border-color; 36 | border-radius: @border-radius-base; 37 | 38 | // Account for some code outputs that place code tags in pre tags 39 | code { 40 | padding: 0; 41 | font-size: inherit; 42 | color: inherit; 43 | white-space: pre-wrap; 44 | background-color: transparent; 45 | border-radius: 0; 46 | } 47 | } 48 | 49 | // Enable scrollable blocks of code 50 | .pre-scrollable { 51 | max-height: @pre-scrollable-max-height; 52 | overflow-y: scroll; 53 | } 54 | -------------------------------------------------------------------------------- /less/component-animations.less: -------------------------------------------------------------------------------- 1 | // 2 | // Component animations 3 | // -------------------------------------------------- 4 | 5 | // Heads up! 6 | // 7 | // We don't use the `.opacity()` mixin here since it causes a bug with text 8 | // fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552. 9 | 10 | .fade { 11 | opacity: 0; 12 | .transition(opacity .15s linear); 13 | &.in { 14 | opacity: 1; 15 | } 16 | } 17 | 18 | .collapse { 19 | display: none; 20 | &.in { 21 | display: block; 22 | } 23 | } 24 | .collapsing { 25 | position: relative; 26 | height: 0; 27 | overflow: hidden; 28 | .transition(height .35s ease); 29 | } 30 | -------------------------------------------------------------------------------- /less/dropdowns.less: -------------------------------------------------------------------------------- 1 | // 2 | // Dropdown menus 3 | // -------------------------------------------------- 4 | 5 | 6 | // Dropdown arrow/caret 7 | .caret { 8 | display: inline-block; 9 | width: 0; 10 | height: 0; 11 | margin-left: 2px; 12 | vertical-align: middle; 13 | border-top: @caret-width-base solid @dropdown-caret-color; 14 | border-right: @caret-width-base solid transparent; 15 | border-left: @caret-width-base solid transparent; 16 | // Firefox fix for https://github.com/twbs/bootstrap/issues/9538. Once fixed, 17 | // we can just straight up remove this. 18 | border-bottom: 0 dotted; 19 | } 20 | 21 | // The dropdown wrapper (div) 22 | .dropdown { 23 | position: relative; 24 | } 25 | 26 | // Prevent the focus on the dropdown toggle when closing dropdowns 27 | .dropdown-toggle:focus { 28 | outline: 0; 29 | } 30 | 31 | // The dropdown menu (ul) 32 | .dropdown-menu { 33 | position: absolute; 34 | top: 100%; 35 | left: 0; 36 | z-index: @zindex-dropdown; 37 | display: none; // none by default, but block on "open" of the menu 38 | float: left; 39 | min-width: 160px; 40 | padding: 5px 0; 41 | margin: 2px 0 0; // override default ul 42 | list-style: none; 43 | font-size: @font-size-base; 44 | background-color: @dropdown-bg; 45 | border: 1px solid @dropdown-fallback-border; // IE8 fallback 46 | border: 1px solid @dropdown-border; 47 | border-radius: @border-radius-base; 48 | .box-shadow(0 6px 12px rgba(0,0,0,.175)); 49 | background-clip: padding-box; 50 | 51 | // Aligns the dropdown menu to right 52 | &.pull-right { 53 | right: 0; 54 | left: auto; 55 | } 56 | 57 | // Dividers (basically an hr) within the dropdown 58 | .divider { 59 | .nav-divider(@dropdown-divider-bg); 60 | } 61 | 62 | // Links within the dropdown menu 63 | > li > a { 64 | display: block; 65 | padding: 3px 20px; 66 | clear: both; 67 | font-weight: normal; 68 | line-height: @line-height-base; 69 | color: @dropdown-link-color; 70 | white-space: nowrap; // prevent links from randomly breaking onto new lines 71 | } 72 | } 73 | 74 | // Hover/Focus state 75 | .dropdown-menu > li > a { 76 | &:hover, 77 | &:focus { 78 | text-decoration: none; 79 | color: @dropdown-link-hover-color; 80 | background-color: @dropdown-link-hover-bg; 81 | } 82 | } 83 | 84 | // Active state 85 | .dropdown-menu > .active > a { 86 | &, 87 | &:hover, 88 | &:focus { 89 | color: @dropdown-link-active-color; 90 | text-decoration: none; 91 | outline: 0; 92 | background-color: @dropdown-link-active-bg; 93 | } 94 | } 95 | 96 | // Disabled state 97 | // 98 | // Gray out text and ensure the hover/focus state remains gray 99 | 100 | .dropdown-menu > .disabled > a { 101 | &, 102 | &:hover, 103 | &:focus { 104 | color: @dropdown-link-disabled-color; 105 | } 106 | } 107 | // Nuke hover/focus effects 108 | .dropdown-menu > .disabled > a { 109 | &:hover, 110 | &:focus { 111 | text-decoration: none; 112 | background-color: transparent; 113 | background-image: none; // Remove CSS gradient 114 | .reset-filter(); 115 | cursor: not-allowed; 116 | } 117 | } 118 | 119 | // Open state for the dropdown 120 | .open { 121 | // Show the menu 122 | > .dropdown-menu { 123 | display: block; 124 | } 125 | 126 | // Remove the outline when :focus is triggered 127 | > a { 128 | outline: 0; 129 | } 130 | } 131 | 132 | // Dropdown section headers 133 | .dropdown-header { 134 | display: block; 135 | padding: 3px 20px; 136 | font-size: @font-size-small; 137 | line-height: @line-height-base; 138 | color: @dropdown-header-color; 139 | } 140 | 141 | // Backdrop to catch body clicks on mobile, etc. 142 | .dropdown-backdrop { 143 | position: fixed; 144 | left: 0; 145 | right: 0; 146 | bottom: 0; 147 | top: 0; 148 | z-index: @zindex-dropdown - 10; 149 | } 150 | 151 | // Right aligned dropdowns 152 | .pull-right > .dropdown-menu { 153 | right: 0; 154 | left: auto; 155 | } 156 | 157 | // Allow for dropdowns to go bottom up (aka, dropup-menu) 158 | // 159 | // Just add .dropup after the standard .dropdown class and you're set, bro. 160 | // TODO: abstract this so that the navbar fixed styles are not placed here? 161 | 162 | .dropup, 163 | .navbar-fixed-bottom .dropdown { 164 | // Reverse the caret 165 | .caret { 166 | // Firefox fix for https://github.com/twbs/bootstrap/issues/9538. Once this 167 | // gets fixed, restore `border-top: 0;`. 168 | border-top: 0 dotted; 169 | border-bottom: @caret-width-base solid @dropdown-caret-color; 170 | content: ""; 171 | } 172 | // Different positioning for bottom up menu 173 | .dropdown-menu { 174 | top: auto; 175 | bottom: 100%; 176 | margin-bottom: 1px; 177 | } 178 | } 179 | 180 | 181 | // Component alignment 182 | // 183 | // Reiterate per navbar.less and the modified component alignment there. 184 | 185 | @media (min-width: @grid-float-breakpoint) { 186 | .navbar-right { 187 | .dropdown-menu { 188 | .pull-right > .dropdown-menu(); 189 | } 190 | } 191 | } 192 | 193 | -------------------------------------------------------------------------------- /less/grid.less: -------------------------------------------------------------------------------- 1 | // 2 | // Grid system 3 | // -------------------------------------------------- 4 | 5 | // Set the container width, and override it for fixed navbars in media queries 6 | .container { 7 | .container-fixed(); 8 | } 9 | 10 | // mobile first defaults 11 | .row { 12 | .make-row(); 13 | } 14 | 15 | // Common styles for small and large grid columns 16 | .make-grid-columns(); 17 | 18 | 19 | // Extra small grid 20 | // 21 | // Grid classes for extra small devices like smartphones. No offset, push, or 22 | // pull classes are present here due to the size of the target. 23 | // 24 | // Note that `.col-xs-12` doesn't get floated on purpose--there's no need since 25 | // it's full-width. 26 | 27 | .make-grid-columns-float(xs); 28 | .make-grid(@grid-columns, xs, width); 29 | .make-grid(@grid-columns, xs, pull); 30 | .make-grid(@grid-columns, xs, push); 31 | .make-grid(@grid-columns, xs, offset); 32 | 33 | 34 | // Small grid 35 | // 36 | // Columns, offsets, pushes, and pulls for the small device range, from phones 37 | // to tablets. 38 | // 39 | // Note that `.col-sm-12` doesn't get floated on purpose--there's no need since 40 | // it's full-width. 41 | 42 | @media (min-width: @screen-sm-min) { 43 | .container { 44 | width: @container-sm; 45 | } 46 | 47 | .make-grid-columns-float(sm); 48 | .make-grid(@grid-columns, sm, width); 49 | .make-grid(@grid-columns, sm, pull); 50 | .make-grid(@grid-columns, sm, push); 51 | .make-grid(@grid-columns, sm, offset); 52 | } 53 | 54 | 55 | // Medium grid 56 | // 57 | // Columns, offsets, pushes, and pulls for the desktop device range. 58 | // 59 | // Note that `.col-md-12` doesn't get floated on purpose--there's no need since 60 | // it's full-width. 61 | 62 | @media (min-width: @screen-md-min) { 63 | .container { 64 | width: @container-md; 65 | } 66 | 67 | .make-grid-columns-float(md); 68 | .make-grid(@grid-columns, md, width); 69 | .make-grid(@grid-columns, md, pull); 70 | .make-grid(@grid-columns, md, push); 71 | .make-grid(@grid-columns, md, offset); 72 | } 73 | 74 | 75 | // Large grid 76 | // 77 | // Columns, offsets, pushes, and pulls for the large desktop device range. 78 | // 79 | // Note that `.col-lg-12` doesn't get floated on purpose--there's no need since 80 | // it's full-width. 81 | 82 | @media (min-width: @screen-lg-min) { 83 | .container { 84 | width: @container-lg; 85 | } 86 | 87 | .make-grid-columns-float(lg); 88 | .make-grid(@grid-columns, lg, width); 89 | .make-grid(@grid-columns, lg, pull); 90 | .make-grid(@grid-columns, lg, push); 91 | .make-grid(@grid-columns, lg, offset); 92 | } 93 | 94 | -------------------------------------------------------------------------------- /less/index.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/less/index.php -------------------------------------------------------------------------------- /less/input-groups.less: -------------------------------------------------------------------------------- 1 | // 2 | // Input groups 3 | // -------------------------------------------------- 4 | 5 | // Base styles 6 | // ------------------------- 7 | .input-group { 8 | position: relative; // For dropdowns 9 | display: table; 10 | border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table 11 | 12 | // Undo padding and float of grid classes 13 | &.col { 14 | float: none; 15 | padding-left: 0; 16 | padding-right: 0; 17 | } 18 | 19 | .form-control { 20 | width: 100%; 21 | margin-bottom: 0; 22 | } 23 | } 24 | 25 | // Sizing options 26 | // 27 | // Remix the default form control sizing classes into new ones for easier 28 | // manipulation. 29 | 30 | .input-group-lg > .form-control, 31 | .input-group-lg > .input-group-addon, 32 | .input-group-lg > .input-group-btn > .btn { .input-lg(); } 33 | .input-group-sm > .form-control, 34 | .input-group-sm > .input-group-addon, 35 | .input-group-sm > .input-group-btn > .btn { .input-sm(); } 36 | 37 | 38 | // Display as table-cell 39 | // ------------------------- 40 | .input-group-addon, 41 | .input-group-btn, 42 | .input-group .form-control { 43 | display: table-cell; 44 | 45 | &:not(:first-child):not(:last-child) { 46 | border-radius: 0; 47 | } 48 | } 49 | // Addon and addon wrapper for buttons 50 | .input-group-addon, 51 | .input-group-btn { 52 | width: 1%; 53 | white-space: nowrap; 54 | vertical-align: middle; // Match the inputs 55 | } 56 | 57 | // Text input groups 58 | // ------------------------- 59 | .input-group-addon { 60 | padding: @padding-base-vertical @padding-base-horizontal; 61 | font-size: @font-size-base; 62 | font-weight: normal; 63 | line-height: 1; 64 | color: @input-color; 65 | text-align: center; 66 | background-color: @input-group-addon-bg; 67 | border: 1px solid @input-group-addon-border-color; 68 | border-radius: @border-radius-base; 69 | 70 | // Sizing 71 | &.input-sm { 72 | padding: @padding-small-vertical @padding-small-horizontal; 73 | font-size: @font-size-small; 74 | border-radius: @border-radius-small; 75 | } 76 | &.input-lg { 77 | padding: @padding-large-vertical @padding-large-horizontal; 78 | font-size: @font-size-large; 79 | border-radius: @border-radius-large; 80 | } 81 | 82 | // Nuke default margins from checkboxes and radios to vertically center within. 83 | input[type="radio"], 84 | input[type="checkbox"] { 85 | margin-top: 0; 86 | } 87 | } 88 | 89 | // Reset rounded corners 90 | .input-group .form-control:first-child, 91 | .input-group-addon:first-child, 92 | .input-group-btn:first-child > .btn, 93 | .input-group-btn:first-child > .dropdown-toggle, 94 | .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { 95 | .border-right-radius(0); 96 | } 97 | .input-group-addon:first-child { 98 | border-right: 0; 99 | } 100 | .input-group .form-control:last-child, 101 | .input-group-addon:last-child, 102 | .input-group-btn:last-child > .btn, 103 | .input-group-btn:last-child > .dropdown-toggle, 104 | .input-group-btn:first-child > .btn:not(:first-child) { 105 | .border-left-radius(0); 106 | } 107 | .input-group-addon:last-child { 108 | border-left: 0; 109 | } 110 | 111 | // Button input groups 112 | // ------------------------- 113 | .input-group-btn { 114 | position: relative; 115 | white-space: nowrap; 116 | 117 | // Negative margin to only have a 1px border between the two 118 | &:first-child > .btn { 119 | margin-right: -1px; 120 | } 121 | &:last-child > .btn { 122 | margin-left: -1px; 123 | } 124 | } 125 | .input-group-btn > .btn { 126 | position: relative; 127 | // Jankily prevent input button groups from wrapping 128 | + .btn { 129 | margin-left: -4px; 130 | } 131 | // Bring the "active" button to the front 132 | &:hover, 133 | &:active { 134 | z-index: 2; 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /less/jumbotron.less: -------------------------------------------------------------------------------- 1 | // 2 | // Jumbotron 3 | // -------------------------------------------------- 4 | 5 | 6 | .jumbotron { 7 | padding: @jumbotron-padding; 8 | margin-bottom: @jumbotron-padding; 9 | font-size: @jumbotron-font-size; 10 | font-weight: 200; 11 | line-height: (@line-height-base * 1.5); 12 | color: @jumbotron-color; 13 | background-color: @jumbotron-bg; 14 | 15 | h1 { 16 | line-height: 1; 17 | color: @jumbotron-heading-color; 18 | } 19 | p { 20 | line-height: 1.4; 21 | } 22 | 23 | .container & { 24 | border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container 25 | } 26 | 27 | @media screen and (min-width: @screen-sm-min) { 28 | padding-top: (@jumbotron-padding * 1.6); 29 | padding-bottom: (@jumbotron-padding * 1.6); 30 | 31 | .container & { 32 | padding-left: (@jumbotron-padding * 2); 33 | padding-right: (@jumbotron-padding * 2); 34 | } 35 | 36 | h1 { 37 | font-size: (@font-size-base * 4.5); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /less/labels.less: -------------------------------------------------------------------------------- 1 | // 2 | // Labels 3 | // -------------------------------------------------- 4 | 5 | .label { 6 | display: inline; 7 | padding: .2em .6em .3em; 8 | font-size: 75%; 9 | font-weight: bold; 10 | line-height: 1; 11 | color: @label-color; 12 | text-align: center; 13 | white-space: nowrap; 14 | vertical-align: baseline; 15 | border-radius: .25em; 16 | 17 | // Add hover effects, but only for links 18 | &[href] { 19 | &:hover, 20 | &:focus { 21 | color: @label-link-hover-color; 22 | text-decoration: none; 23 | cursor: pointer; 24 | } 25 | } 26 | 27 | // Empty labels collapse automatically (not available in IE8) 28 | &:empty { 29 | display: none; 30 | } 31 | } 32 | 33 | // Colors 34 | // Contextual variations (linked labels get darker on :hover) 35 | 36 | .label-default { 37 | .label-variant(@label-default-bg); 38 | } 39 | 40 | .label-primary { 41 | .label-variant(@label-primary-bg); 42 | } 43 | 44 | .label-success { 45 | .label-variant(@label-success-bg); 46 | } 47 | 48 | .label-info { 49 | .label-variant(@label-info-bg); 50 | } 51 | 52 | .label-warning { 53 | .label-variant(@label-warning-bg); 54 | } 55 | 56 | .label-danger { 57 | .label-variant(@label-danger-bg); 58 | } 59 | -------------------------------------------------------------------------------- /less/list-group.less: -------------------------------------------------------------------------------- 1 | // 2 | // List groups 3 | // -------------------------------------------------- 4 | 5 | // Base class 6 | // 7 | // Easily usable on
      ,
        , or
        . 8 | .list-group { 9 | // No need to set list-style: none; since .list-group-item is block level 10 | margin-bottom: 20px; 11 | padding-left: 0; // reset padding because ul and ol 12 | } 13 | 14 | // Individual list items 15 | // ------------------------- 16 | 17 | .list-group-item { 18 | position: relative; 19 | display: block; 20 | padding: 10px 15px; 21 | // Place the border on the list items and negative margin up for better styling 22 | margin-bottom: -1px; 23 | background-color: @list-group-bg; 24 | border: 1px solid @list-group-border; 25 | 26 | // Round the first and last items 27 | &:first-child { 28 | .border-top-radius(@list-group-border-radius); 29 | } 30 | &:last-child { 31 | margin-bottom: 0; 32 | .border-bottom-radius(@list-group-border-radius); 33 | } 34 | 35 | // Align badges within list items 36 | > .badge { 37 | float: right; 38 | } 39 | > .badge + .badge { 40 | margin-right: 5px; 41 | } 42 | } 43 | 44 | // Linked list items 45 | a.list-group-item { 46 | color: @list-group-link-color; 47 | 48 | .list-group-item-heading { 49 | color: @list-group-link-heading-color; 50 | } 51 | 52 | // Hover state 53 | &:hover, 54 | &:focus { 55 | text-decoration: none; 56 | background-color: @list-group-hover-bg; 57 | } 58 | 59 | // Active class on item itself, not parent 60 | &.active, 61 | &.active:hover, 62 | &.active:focus { 63 | z-index: 2; // Place active items above their siblings for proper border styling 64 | color: @list-group-active-color; 65 | background-color: @list-group-active-bg; 66 | border-color: @list-group-active-border; 67 | 68 | // Force color to inherit for custom content 69 | .list-group-item-heading { 70 | color: inherit; 71 | } 72 | .list-group-item-text { 73 | color: lighten(@list-group-active-bg, 40%); 74 | } 75 | } 76 | } 77 | 78 | // Custom content options 79 | // ------------------------- 80 | 81 | .list-group-item-heading { 82 | margin-top: 0; 83 | margin-bottom: 5px; 84 | } 85 | .list-group-item-text { 86 | margin-bottom: 0; 87 | line-height: 1.3; 88 | } 89 | -------------------------------------------------------------------------------- /less/media.less: -------------------------------------------------------------------------------- 1 | // Media objects 2 | // Source: http://stubbornella.org/content/?p=497 3 | // -------------------------------------------------- 4 | 5 | 6 | // Common styles 7 | // ------------------------- 8 | 9 | // Clear the floats 10 | .media, 11 | .media-body { 12 | overflow: hidden; 13 | zoom: 1; 14 | } 15 | 16 | // Proper spacing between instances of .media 17 | .media, 18 | .media .media { 19 | margin-top: 15px; 20 | } 21 | .media:first-child { 22 | margin-top: 0; 23 | } 24 | 25 | // For images and videos, set to block 26 | .media-object { 27 | display: block; 28 | } 29 | 30 | // Reset margins on headings for tighter default spacing 31 | .media-heading { 32 | margin: 0 0 5px; 33 | } 34 | 35 | 36 | // Media image alignment 37 | // ------------------------- 38 | 39 | .media { 40 | > .pull-left { 41 | margin-right: 10px; 42 | } 43 | > .pull-right { 44 | margin-left: 10px; 45 | } 46 | } 47 | 48 | 49 | // Media list variation 50 | // ------------------------- 51 | 52 | // Undo default ul/ol styles 53 | .media-list { 54 | padding-left: 0; 55 | list-style: none; 56 | } 57 | -------------------------------------------------------------------------------- /less/modals.less: -------------------------------------------------------------------------------- 1 | // 2 | // Modals 3 | // -------------------------------------------------- 4 | 5 | // .modal-open - body class for killing the scroll 6 | // .modal - container to scroll within 7 | // .modal-dialog - positioning shell for the actual modal 8 | // .modal-content - actual modal w/ bg and corners and shit 9 | 10 | // Kill the scroll on the body 11 | .modal-open { 12 | overflow: hidden; 13 | } 14 | 15 | // Container that the modal scrolls within 16 | .modal { 17 | display: none; 18 | overflow: auto; 19 | overflow-y: scroll; 20 | position: fixed; 21 | top: 0; 22 | right: 0; 23 | bottom: 0; 24 | left: 0; 25 | z-index: @zindex-modal-background; 26 | 27 | // When fading in the modal, animate it to slide down 28 | &.fade .modal-dialog { 29 | .translate(0, -25%); 30 | .transition-transform(~"0.3s ease-out"); 31 | } 32 | &.in .modal-dialog { .translate(0, 0)} 33 | } 34 | 35 | // Shell div to position the modal with bottom padding 36 | .modal-dialog { 37 | position: relative; 38 | margin-left: auto; 39 | margin-right: auto; 40 | width: auto; 41 | padding: 10px; 42 | z-index: (@zindex-modal-background + 10); 43 | } 44 | 45 | // Actual modal 46 | .modal-content { 47 | position: relative; 48 | background-color: @modal-content-bg; 49 | border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc) 50 | border: 1px solid @modal-content-border-color; 51 | border-radius: @border-radius-large; 52 | .box-shadow(0 3px 9px rgba(0,0,0,.5)); 53 | background-clip: padding-box; 54 | // Remove focus outline from opened modal 55 | outline: none; 56 | } 57 | 58 | // Modal background 59 | .modal-backdrop { 60 | position: fixed; 61 | top: 0; 62 | right: 0; 63 | bottom: 0; 64 | left: 0; 65 | z-index: (@zindex-modal-background - 10); 66 | background-color: @modal-backdrop-bg; 67 | // Fade for backdrop 68 | &.fade { .opacity(0); } 69 | &.in { .opacity(.5); } 70 | } 71 | 72 | // Modal header 73 | // Top section of the modal w/ title and dismiss 74 | .modal-header { 75 | padding: @modal-title-padding; 76 | border-bottom: 1px solid @modal-header-border-color; 77 | min-height: (@modal-title-padding + @modal-title-line-height); 78 | } 79 | // Close icon 80 | .modal-header .close { 81 | margin-top: -2px; 82 | } 83 | 84 | // Title text within header 85 | .modal-title { 86 | margin: 0; 87 | line-height: @modal-title-line-height; 88 | } 89 | 90 | // Modal body 91 | // Where all modal content resides (sibling of .modal-header and .modal-footer) 92 | .modal-body { 93 | position: relative; 94 | padding: @modal-inner-padding; 95 | } 96 | 97 | // Footer (for actions) 98 | .modal-footer { 99 | margin-top: 15px; 100 | padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding; 101 | text-align: right; // right align buttons 102 | border-top: 1px solid @modal-footer-border-color; 103 | .clearfix(); // clear it in case folks use .pull-* classes on buttons 104 | 105 | // Properly space out buttons 106 | .btn + .btn { 107 | margin-left: 5px; 108 | margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs 109 | } 110 | // but override that for button groups 111 | .btn-group .btn + .btn { 112 | margin-left: -1px; 113 | } 114 | // and override it for block buttons as well 115 | .btn-block + .btn-block { 116 | margin-left: 0; 117 | } 118 | } 119 | 120 | // Scale up the modal 121 | @media screen and (min-width: @screen-sm-min) { 122 | 123 | .modal-dialog { 124 | width: 600px; 125 | padding-top: 30px; 126 | padding-bottom: 30px; 127 | } 128 | .modal-content { 129 | .box-shadow(0 5px 15px rgba(0,0,0,.5)); 130 | } 131 | 132 | } 133 | -------------------------------------------------------------------------------- /less/pager.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pager pagination 3 | // -------------------------------------------------- 4 | 5 | 6 | .pager { 7 | padding-left: 0; 8 | margin: @line-height-computed 0; 9 | list-style: none; 10 | text-align: center; 11 | .clearfix(); 12 | li { 13 | display: inline; 14 | > a, 15 | > span { 16 | display: inline-block; 17 | padding: 5px 14px; 18 | background-color: @pagination-bg; 19 | border: 1px solid @pagination-border; 20 | border-radius: @pager-border-radius; 21 | } 22 | 23 | > a:hover, 24 | > a:focus { 25 | text-decoration: none; 26 | background-color: @pagination-hover-bg; 27 | } 28 | } 29 | 30 | .next { 31 | > a, 32 | > span { 33 | float: right; 34 | } 35 | } 36 | 37 | .previous { 38 | > a, 39 | > span { 40 | float: left; 41 | } 42 | } 43 | 44 | .disabled { 45 | > a, 46 | > a:hover, 47 | > a:focus, 48 | > span { 49 | color: @pager-disabled-color; 50 | background-color: @pagination-bg; 51 | cursor: not-allowed; 52 | } 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /less/pagination.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pagination (multiple pages) 3 | // -------------------------------------------------- 4 | .pagination { 5 | display: inline-block; 6 | padding-left: 0; 7 | margin: @line-height-computed 0; 8 | border-radius: @border-radius-base; 9 | 10 | > li { 11 | display: inline; // Remove list-style and block-level defaults 12 | > a, 13 | > span { 14 | position: relative; 15 | float: left; // Collapse white-space 16 | padding: @padding-base-vertical @padding-base-horizontal; 17 | line-height: @line-height-base; 18 | text-decoration: none; 19 | background-color: @pagination-bg; 20 | border: 1px solid @pagination-border; 21 | margin-left: -1px; 22 | } 23 | &:first-child { 24 | > a, 25 | > span { 26 | margin-left: 0; 27 | .border-left-radius(@border-radius-base); 28 | } 29 | } 30 | &:last-child { 31 | > a, 32 | > span { 33 | .border-right-radius(@border-radius-base); 34 | } 35 | } 36 | } 37 | 38 | > li > a, 39 | > li > span { 40 | &:hover, 41 | &:focus { 42 | background-color: @pagination-hover-bg; 43 | } 44 | } 45 | 46 | > .active > a, 47 | > .active > span { 48 | &, 49 | &:hover, 50 | &:focus { 51 | z-index: 2; 52 | color: @pagination-active-color; 53 | background-color: @pagination-active-bg; 54 | border-color: @pagination-active-bg; 55 | cursor: default; 56 | } 57 | } 58 | 59 | > .disabled { 60 | > span, 61 | > span:hover, 62 | > span:focus, 63 | > a, 64 | > a:hover, 65 | > a:focus { 66 | color: @pagination-disabled-color; 67 | background-color: @pagination-bg; 68 | border-color: @pagination-border; 69 | cursor: not-allowed; 70 | } 71 | } 72 | } 73 | 74 | // Sizing 75 | // -------------------------------------------------- 76 | 77 | // Large 78 | .pagination-lg { 79 | .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large); 80 | } 81 | 82 | // Small 83 | .pagination-sm { 84 | .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small); 85 | } 86 | -------------------------------------------------------------------------------- /less/panels.less: -------------------------------------------------------------------------------- 1 | // 2 | // Panels 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .panel { 8 | margin-bottom: @line-height-computed; 9 | background-color: @panel-bg; 10 | border: 1px solid transparent; 11 | border-radius: @panel-border-radius; 12 | .box-shadow(0 1px 1px rgba(0,0,0,.05)); 13 | } 14 | 15 | // Panel contents 16 | .panel-body { 17 | padding: 15px; 18 | .clearfix(); 19 | } 20 | 21 | 22 | // List groups in panels 23 | // 24 | // By default, space out list group content from panel headings to account for 25 | // any kind of custom content between the two. 26 | 27 | .panel { 28 | > .list-group { 29 | margin-bottom: 0; 30 | 31 | .list-group-item { 32 | border-width: 1px 0; 33 | 34 | // Remove border radius for top one 35 | &:first-child { 36 | .border-top-radius(0); 37 | } 38 | // But keep it for the last one 39 | &:last-child { 40 | border-bottom: 0; 41 | } 42 | } 43 | } 44 | } 45 | // Collapse space between when there's no additional content. 46 | .panel-heading + .list-group { 47 | .list-group-item:first-child { 48 | border-top-width: 0; 49 | } 50 | } 51 | 52 | 53 | // Tables in panels 54 | // 55 | // Place a non-bordered `.table` within a panel (not within a `.panel-body`) and 56 | // watch it go full width. 57 | 58 | .panel { 59 | > .table, 60 | > .table-responsive { 61 | margin-bottom: 0; 62 | } 63 | > .panel-body + .table, 64 | > .panel-body + .table-responsive { 65 | border-top: 1px solid @table-border-color; 66 | } 67 | > .table-bordered, 68 | > .table-responsive > .table-bordered { 69 | border: 0; 70 | > thead, 71 | > tbody, 72 | > tfoot { 73 | > tr { 74 | > th:first-child, 75 | > td:first-child { 76 | border-left: 0; 77 | } 78 | > th:last-child, 79 | > td:last-child { 80 | border-right: 0; 81 | } 82 | 83 | &:last-child > th, 84 | &:last-child > td { 85 | border-bottom: 0; 86 | } 87 | } 88 | } 89 | } 90 | } 91 | 92 | 93 | // Optional heading 94 | .panel-heading { 95 | padding: 10px 15px; 96 | border-bottom: 1px solid transparent; 97 | .border-top-radius(@panel-border-radius - 1); 98 | 99 | & > .dropdown .dropdown-toggle { 100 | color: inherit; 101 | } 102 | } 103 | 104 | // Within heading, strip any `h*` tag of it's default margins for spacing. 105 | .panel-title { 106 | margin-top: 0; 107 | margin-bottom: 0; 108 | font-size: ceil((@font-size-base * 1.125)); 109 | > a { 110 | color: inherit; 111 | } 112 | } 113 | 114 | // Optional footer (stays gray in every modifier class) 115 | .panel-footer { 116 | padding: 10px 15px; 117 | background-color: @panel-footer-bg; 118 | border-top: 1px solid @panel-inner-border; 119 | .border-bottom-radius(@panel-border-radius - 1); 120 | } 121 | 122 | 123 | // Collapsable panels (aka, accordion) 124 | // 125 | // Wrap a series of panels in `.panel-group` to turn them into an accordion with 126 | // the help of our collapse JavaScript plugin. 127 | 128 | .panel-group { 129 | // Tighten up margin so it's only between panels 130 | .panel { 131 | margin-bottom: 0; 132 | border-radius: @panel-border-radius; 133 | overflow: hidden; // crop contents when collapsed 134 | + .panel { 135 | margin-top: 5px; 136 | } 137 | } 138 | 139 | .panel-heading { 140 | border-bottom: 0; 141 | + .panel-collapse .panel-body { 142 | border-top: 1px solid @panel-inner-border; 143 | } 144 | } 145 | .panel-footer { 146 | border-top: 0; 147 | + .panel-collapse .panel-body { 148 | border-bottom: 1px solid @panel-inner-border; 149 | } 150 | } 151 | } 152 | 153 | 154 | // Contextual variations 155 | .panel-default { 156 | .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border); 157 | } 158 | .panel-primary { 159 | .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border); 160 | } 161 | .panel-success { 162 | .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border); 163 | } 164 | .panel-warning { 165 | .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border); 166 | } 167 | .panel-danger { 168 | .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border); 169 | } 170 | .panel-info { 171 | .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border); 172 | } 173 | -------------------------------------------------------------------------------- /less/popovers.less: -------------------------------------------------------------------------------- 1 | // 2 | // Popovers 3 | // -------------------------------------------------- 4 | 5 | 6 | .popover { 7 | position: absolute; 8 | top: 0; 9 | left: 0; 10 | z-index: @zindex-popover; 11 | display: none; 12 | max-width: @popover-max-width; 13 | padding: 1px; 14 | text-align: left; // Reset given new insertion method 15 | background-color: @popover-bg; 16 | background-clip: padding-box; 17 | border: 1px solid @popover-fallback-border-color; 18 | border: 1px solid @popover-border-color; 19 | border-radius: @border-radius-large; 20 | .box-shadow(0 5px 10px rgba(0,0,0,.2)); 21 | 22 | // Overrides for proper insertion 23 | white-space: normal; 24 | 25 | // Offset the popover to account for the popover arrow 26 | &.top { margin-top: -10px; } 27 | &.right { margin-left: 10px; } 28 | &.bottom { margin-top: 10px; } 29 | &.left { margin-left: -10px; } 30 | } 31 | 32 | .popover-title { 33 | margin: 0; // reset heading margin 34 | padding: 8px 14px; 35 | font-size: @font-size-base; 36 | font-weight: normal; 37 | line-height: 18px; 38 | background-color: @popover-title-bg; 39 | border-bottom: 1px solid darken(@popover-title-bg, 5%); 40 | border-radius: 5px 5px 0 0; 41 | } 42 | 43 | .popover-content { 44 | padding: 9px 14px; 45 | } 46 | 47 | // Arrows 48 | // 49 | // .arrow is outer, .arrow:after is inner 50 | 51 | .popover .arrow { 52 | &, 53 | &:after { 54 | position: absolute; 55 | display: block; 56 | width: 0; 57 | height: 0; 58 | border-color: transparent; 59 | border-style: solid; 60 | } 61 | } 62 | .popover .arrow { 63 | border-width: @popover-arrow-outer-width; 64 | } 65 | .popover .arrow:after { 66 | border-width: @popover-arrow-width; 67 | content: ""; 68 | } 69 | 70 | .popover { 71 | &.top .arrow { 72 | left: 50%; 73 | margin-left: -@popover-arrow-outer-width; 74 | border-bottom-width: 0; 75 | border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback 76 | border-top-color: @popover-arrow-outer-color; 77 | bottom: -@popover-arrow-outer-width; 78 | &:after { 79 | content: " "; 80 | bottom: 1px; 81 | margin-left: -@popover-arrow-width; 82 | border-bottom-width: 0; 83 | border-top-color: @popover-arrow-color; 84 | } 85 | } 86 | &.right .arrow { 87 | top: 50%; 88 | left: -@popover-arrow-outer-width; 89 | margin-top: -@popover-arrow-outer-width; 90 | border-left-width: 0; 91 | border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback 92 | border-right-color: @popover-arrow-outer-color; 93 | &:after { 94 | content: " "; 95 | left: 1px; 96 | bottom: -@popover-arrow-width; 97 | border-left-width: 0; 98 | border-right-color: @popover-arrow-color; 99 | } 100 | } 101 | &.bottom .arrow { 102 | left: 50%; 103 | margin-left: -@popover-arrow-outer-width; 104 | border-top-width: 0; 105 | border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback 106 | border-bottom-color: @popover-arrow-outer-color; 107 | top: -@popover-arrow-outer-width; 108 | &:after { 109 | content: " "; 110 | top: 1px; 111 | margin-left: -@popover-arrow-width; 112 | border-top-width: 0; 113 | border-bottom-color: @popover-arrow-color; 114 | } 115 | } 116 | 117 | &.left .arrow { 118 | top: 50%; 119 | right: -@popover-arrow-outer-width; 120 | margin-top: -@popover-arrow-outer-width; 121 | border-right-width: 0; 122 | border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback 123 | border-left-color: @popover-arrow-outer-color; 124 | &:after { 125 | content: " "; 126 | right: 1px; 127 | border-right-width: 0; 128 | border-left-color: @popover-arrow-color; 129 | bottom: -@popover-arrow-width; 130 | } 131 | } 132 | 133 | } 134 | -------------------------------------------------------------------------------- /less/print.less: -------------------------------------------------------------------------------- 1 | // 2 | // Basic print styles 3 | // -------------------------------------------------- 4 | // Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css 5 | 6 | @media print { 7 | 8 | * { 9 | text-shadow: none !important; 10 | color: #000 !important; // Black prints faster: h5bp.com/s 11 | background: transparent !important; 12 | box-shadow: none !important; 13 | } 14 | 15 | a, 16 | a:visited { 17 | text-decoration: underline; 18 | } 19 | 20 | a[href]:after { 21 | content: " (" attr(href) ")"; 22 | } 23 | 24 | abbr[title]:after { 25 | content: " (" attr(title) ")"; 26 | } 27 | 28 | // Don't show links for images, or javascript/internal links 29 | a[href^="javascript:"]:after, 30 | a[href^="#"]:after { 31 | content: ""; 32 | } 33 | 34 | pre, 35 | blockquote { 36 | border: 1px solid #999; 37 | page-break-inside: avoid; 38 | } 39 | 40 | thead { 41 | display: table-header-group; // h5bp.com/t 42 | } 43 | 44 | tr, 45 | img { 46 | page-break-inside: avoid; 47 | } 48 | 49 | img { 50 | max-width: 100% !important; 51 | } 52 | 53 | @page { 54 | margin: 2cm .5cm; 55 | } 56 | 57 | p, 58 | h2, 59 | h3 { 60 | orphans: 3; 61 | widows: 3; 62 | } 63 | 64 | h2, 65 | h3 { 66 | page-break-after: avoid; 67 | } 68 | 69 | // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245 70 | // Once fixed, we can just straight up remove this. 71 | select { 72 | background: #fff !important; 73 | } 74 | 75 | // Bootstrap components 76 | .navbar { 77 | display: none; 78 | } 79 | .table { 80 | td, 81 | th { 82 | background-color: #fff !important; 83 | } 84 | } 85 | .btn, 86 | .dropup > .btn { 87 | > .caret { 88 | border-top-color: #000 !important; 89 | } 90 | } 91 | .label { 92 | border: 1px solid #000; 93 | } 94 | 95 | .table { 96 | border-collapse: collapse !important; 97 | } 98 | .table-bordered { 99 | th, 100 | td { 101 | border: 1px solid #ddd !important; 102 | } 103 | } 104 | 105 | } 106 | -------------------------------------------------------------------------------- /less/progress-bars.less: -------------------------------------------------------------------------------- 1 | // 2 | // Progress bars 3 | // -------------------------------------------------- 4 | 5 | 6 | // Bar animations 7 | // ------------------------- 8 | 9 | // WebKit 10 | @-webkit-keyframes progress-bar-stripes { 11 | from { background-position: 40px 0; } 12 | to { background-position: 0 0; } 13 | } 14 | 15 | // Firefox 16 | @-moz-keyframes progress-bar-stripes { 17 | from { background-position: 40px 0; } 18 | to { background-position: 0 0; } 19 | } 20 | 21 | // Opera 22 | @-o-keyframes progress-bar-stripes { 23 | from { background-position: 0 0; } 24 | to { background-position: 40px 0; } 25 | } 26 | 27 | // Spec and IE10+ 28 | @keyframes progress-bar-stripes { 29 | from { background-position: 40px 0; } 30 | to { background-position: 0 0; } 31 | } 32 | 33 | 34 | 35 | // Bar itself 36 | // ------------------------- 37 | 38 | // Outer container 39 | .progress { 40 | overflow: hidden; 41 | height: @line-height-computed; 42 | margin-bottom: @line-height-computed; 43 | background-color: @progress-bg; 44 | border-radius: @border-radius-base; 45 | .box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); 46 | } 47 | 48 | // Bar of progress 49 | .progress-bar { 50 | float: left; 51 | width: 0%; 52 | height: 100%; 53 | font-size: @font-size-small; 54 | line-height: @line-height-computed; 55 | color: @progress-bar-color; 56 | text-align: center; 57 | background-color: @progress-bar-bg; 58 | .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); 59 | .transition(width .6s ease); 60 | } 61 | 62 | // Striped bars 63 | .progress-striped .progress-bar { 64 | #gradient > .striped(); 65 | background-size: 40px 40px; 66 | } 67 | 68 | // Call animation for the active one 69 | .progress.active .progress-bar { 70 | .animation(progress-bar-stripes 2s linear infinite); 71 | } 72 | 73 | 74 | 75 | // Variations 76 | // ------------------------- 77 | 78 | .progress-bar-success { 79 | .progress-bar-variant(@progress-bar-success-bg); 80 | } 81 | 82 | .progress-bar-info { 83 | .progress-bar-variant(@progress-bar-info-bg); 84 | } 85 | 86 | .progress-bar-warning { 87 | .progress-bar-variant(@progress-bar-warning-bg); 88 | } 89 | 90 | .progress-bar-danger { 91 | .progress-bar-variant(@progress-bar-danger-bg); 92 | } 93 | -------------------------------------------------------------------------------- /less/responsive-utilities.less: -------------------------------------------------------------------------------- 1 | // 2 | // Responsive: Utility classes 3 | // -------------------------------------------------- 4 | 5 | 6 | // IE10 in Windows (Phone) 8 7 | // 8 | // Support for responsive views via media queries is kind of borked in IE10, for 9 | // Surface/desktop in split view and for Windows Phone 8. This particular fix 10 | // must be accompanied by a snippet of JavaScript to sniff the user agent and 11 | // apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at 12 | // our Getting Started page for more information on this bug. 13 | // 14 | // For more information, see the following: 15 | // 16 | // Issue: https://github.com/twbs/bootstrap/issues/10497 17 | // Docs: http://getbootstrap.com/getting-started/#browsers 18 | // Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/ 19 | 20 | @-ms-viewport { 21 | width: device-width; 22 | } 23 | 24 | 25 | // Visibility utilities 26 | 27 | .visible-xs { 28 | .responsive-invisibility(); 29 | @media (max-width: @screen-xs-max) { 30 | .responsive-visibility(); 31 | } 32 | &.visible-sm { 33 | @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { 34 | .responsive-visibility(); 35 | } 36 | } 37 | &.visible-md { 38 | @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { 39 | .responsive-visibility(); 40 | } 41 | } 42 | &.visible-lg { 43 | @media (min-width: @screen-lg-min) { 44 | .responsive-visibility(); 45 | } 46 | } 47 | } 48 | .visible-sm { 49 | .responsive-invisibility(); 50 | &.visible-xs { 51 | @media (max-width: @screen-xs-max) { 52 | .responsive-visibility(); 53 | } 54 | } 55 | @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { 56 | .responsive-visibility(); 57 | } 58 | &.visible-md { 59 | @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { 60 | .responsive-visibility(); 61 | } 62 | } 63 | &.visible-lg { 64 | @media (min-width: @screen-lg-min) { 65 | .responsive-visibility(); 66 | } 67 | } 68 | } 69 | .visible-md { 70 | .responsive-invisibility(); 71 | &.visible-xs { 72 | @media (max-width: @screen-xs-max) { 73 | .responsive-visibility(); 74 | } 75 | } 76 | &.visible-sm { 77 | @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { 78 | .responsive-visibility(); 79 | } 80 | } 81 | @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { 82 | .responsive-visibility(); 83 | } 84 | &.visible-lg { 85 | @media (min-width: @screen-lg-min) { 86 | .responsive-visibility(); 87 | } 88 | } 89 | } 90 | .visible-lg { 91 | .responsive-invisibility(); 92 | &.visible-xs { 93 | @media (max-width: @screen-xs-max) { 94 | .responsive-visibility(); 95 | } 96 | } 97 | &.visible-sm { 98 | @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { 99 | .responsive-visibility(); 100 | } 101 | } 102 | &.visible-md { 103 | @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { 104 | .responsive-visibility(); 105 | } 106 | } 107 | @media (min-width: @screen-lg-min) { 108 | .responsive-visibility(); 109 | } 110 | } 111 | 112 | .hidden-xs { 113 | .responsive-visibility(); 114 | @media (max-width: @screen-xs-max) { 115 | .responsive-invisibility(); 116 | } 117 | &.hidden-sm { 118 | @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { 119 | .responsive-invisibility(); 120 | } 121 | } 122 | &.hidden-md { 123 | @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { 124 | .responsive-invisibility(); 125 | } 126 | } 127 | &.hidden-lg { 128 | @media (min-width: @screen-lg-min) { 129 | .responsive-invisibility(); 130 | } 131 | } 132 | } 133 | .hidden-sm { 134 | .responsive-visibility(); 135 | &.hidden-xs { 136 | @media (max-width: @screen-xs-max) { 137 | .responsive-invisibility(); 138 | } 139 | } 140 | @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { 141 | .responsive-invisibility(); 142 | } 143 | &.hidden-md { 144 | @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { 145 | .responsive-invisibility(); 146 | } 147 | } 148 | &.hidden-lg { 149 | @media (min-width: @screen-lg-min) { 150 | .responsive-invisibility(); 151 | } 152 | } 153 | } 154 | .hidden-md { 155 | .responsive-visibility(); 156 | &.hidden-xs { 157 | @media (max-width: @screen-xs-max) { 158 | .responsive-invisibility(); 159 | } 160 | } 161 | &.hidden-sm { 162 | @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { 163 | .responsive-invisibility(); 164 | } 165 | } 166 | @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { 167 | .responsive-invisibility(); 168 | } 169 | &.hidden-lg { 170 | @media (min-width: @screen-lg-min) { 171 | .responsive-invisibility(); 172 | } 173 | } 174 | } 175 | .hidden-lg { 176 | .responsive-visibility(); 177 | &.hidden-xs { 178 | @media (max-width: @screen-xs-max) { 179 | .responsive-invisibility(); 180 | } 181 | } 182 | &.hidden-sm { 183 | @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { 184 | .responsive-invisibility(); 185 | } 186 | } 187 | &.hidden-md { 188 | @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { 189 | .responsive-invisibility(); 190 | } 191 | } 192 | @media (min-width: @screen-lg-min) { 193 | .responsive-invisibility(); 194 | } 195 | } 196 | 197 | // Print utilities 198 | .visible-print { 199 | .responsive-invisibility(); 200 | } 201 | 202 | @media print { 203 | .visible-print { 204 | .responsive-visibility(); 205 | } 206 | .hidden-print { 207 | .responsive-invisibility(); 208 | } 209 | } 210 | -------------------------------------------------------------------------------- /less/scaffolding.less: -------------------------------------------------------------------------------- 1 | // 2 | // Scaffolding 3 | // -------------------------------------------------- 4 | 5 | 6 | // Reset the box-sizing 7 | 8 | *, 9 | *:before, 10 | *:after { 11 | .box-sizing(border-box); 12 | } 13 | 14 | 15 | // Body reset 16 | 17 | html { 18 | font-size: 62.5%; 19 | -webkit-tap-highlight-color: rgba(0,0,0,0); 20 | } 21 | 22 | body { 23 | font-family: @font-family-base; 24 | font-size: @font-size-base; 25 | line-height: @line-height-base; 26 | color: @text-color; 27 | background-color: @body-bg; 28 | } 29 | 30 | // Reset fonts for relevant elements 31 | input, 32 | button, 33 | select, 34 | textarea { 35 | font-family: inherit; 36 | font-size: inherit; 37 | line-height: inherit; 38 | } 39 | 40 | 41 | // Links 42 | 43 | a { 44 | color: @link-color; 45 | text-decoration: none; 46 | 47 | &:hover, 48 | &:focus { 49 | color: @link-hover-color; 50 | text-decoration: underline; 51 | } 52 | 53 | &:focus { 54 | .tab-focus(); 55 | } 56 | } 57 | 58 | 59 | // Images 60 | 61 | img { 62 | vertical-align: middle; 63 | } 64 | 65 | // Responsive images (ensure images don't scale beyond their parents) 66 | .img-responsive { 67 | .img-responsive(); 68 | } 69 | 70 | // Rounded corners 71 | .img-rounded { 72 | border-radius: @border-radius-large; 73 | } 74 | 75 | // Image thumbnails 76 | // 77 | // Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`. 78 | .img-thumbnail { 79 | padding: @thumbnail-padding; 80 | line-height: @line-height-base; 81 | background-color: @thumbnail-bg; 82 | border: 1px solid @thumbnail-border; 83 | border-radius: @thumbnail-border-radius; 84 | .transition(all .2s ease-in-out); 85 | 86 | // Keep them at most 100% wide 87 | .img-responsive(inline-block); 88 | } 89 | 90 | // Perfect circle 91 | .img-circle { 92 | border-radius: 50%; // set radius in percents 93 | } 94 | 95 | 96 | // Horizontal rules 97 | 98 | hr { 99 | margin-top: @line-height-computed; 100 | margin-bottom: @line-height-computed; 101 | border: 0; 102 | border-top: 1px solid @hr-border; 103 | } 104 | 105 | 106 | // Only display content to screen readers 107 | // 108 | // See: http://a11yproject.com/posts/how-to-hide-content/ 109 | 110 | .sr-only { 111 | position: absolute; 112 | width: 1px; 113 | height: 1px; 114 | margin: -1px; 115 | padding: 0; 116 | overflow: hidden; 117 | clip: rect(0,0,0,0); 118 | border: 0; 119 | } 120 | -------------------------------------------------------------------------------- /less/tables.less: -------------------------------------------------------------------------------- 1 | // 2 | // Tables 3 | // -------------------------------------------------- 4 | 5 | 6 | table { 7 | max-width: 100%; 8 | background-color: @table-bg; 9 | } 10 | th { 11 | text-align: left; 12 | } 13 | 14 | 15 | // Baseline styles 16 | 17 | .table { 18 | width: 100%; 19 | margin-bottom: @line-height-computed; 20 | // Cells 21 | > thead, 22 | > tbody, 23 | > tfoot { 24 | > tr { 25 | > th, 26 | > td { 27 | padding: @table-cell-padding; 28 | line-height: @line-height-base; 29 | vertical-align: top; 30 | border-top: 1px solid @table-border-color; 31 | } 32 | } 33 | } 34 | // Bottom align for column headings 35 | > thead > tr > th { 36 | vertical-align: bottom; 37 | border-bottom: 2px solid @table-border-color; 38 | } 39 | // Remove top border from thead by default 40 | > caption + thead, 41 | > colgroup + thead, 42 | > thead:first-child { 43 | > tr:first-child { 44 | > th, 45 | > td { 46 | border-top: 0; 47 | } 48 | } 49 | } 50 | // Account for multiple tbody instances 51 | > tbody + tbody { 52 | border-top: 2px solid @table-border-color; 53 | } 54 | 55 | // Nesting 56 | .table { 57 | background-color: @body-bg; 58 | } 59 | } 60 | 61 | 62 | // Condensed table w/ half padding 63 | 64 | .table-condensed { 65 | > thead, 66 | > tbody, 67 | > tfoot { 68 | > tr { 69 | > th, 70 | > td { 71 | padding: @table-condensed-cell-padding; 72 | } 73 | } 74 | } 75 | } 76 | 77 | 78 | // Bordered version 79 | // 80 | // Add borders all around the table and between all the columns. 81 | 82 | .table-bordered { 83 | border: 1px solid @table-border-color; 84 | > thead, 85 | > tbody, 86 | > tfoot { 87 | > tr { 88 | > th, 89 | > td { 90 | border: 1px solid @table-border-color; 91 | } 92 | } 93 | } 94 | > thead > tr { 95 | > th, 96 | > td { 97 | border-bottom-width: 2px; 98 | } 99 | } 100 | } 101 | 102 | 103 | // Zebra-striping 104 | // 105 | // Default zebra-stripe styles (alternating gray and transparent backgrounds) 106 | 107 | .table-striped > tbody > tr:nth-child(odd) { 108 | > td, 109 | > th { 110 | background-color: @table-bg-accent; 111 | } 112 | } 113 | 114 | 115 | // Hover effect 116 | // 117 | // Placed here since it has to come after the potential zebra striping 118 | 119 | .table-hover > tbody > tr:hover { 120 | > td, 121 | > th { 122 | background-color: @table-bg-hover; 123 | } 124 | } 125 | 126 | 127 | // Table cell sizing 128 | // 129 | // Reset default table behavior 130 | 131 | table col[class*="col-"] { 132 | float: none; 133 | display: table-column; 134 | } 135 | table { 136 | td, 137 | th { 138 | &[class*="col-"] { 139 | float: none; 140 | display: table-cell; 141 | } 142 | } 143 | } 144 | 145 | 146 | // Table backgrounds 147 | // 148 | // Exact selectors below required to override `.table-striped` and prevent 149 | // inheritance to nested tables. 150 | 151 | .table > thead > tr, 152 | .table > tbody > tr, 153 | .table > tfoot > tr { 154 | > td.active, 155 | > th.active, 156 | &.active > td, 157 | &.active > th { 158 | background-color: @table-bg-active; 159 | } 160 | } 161 | 162 | // Generate the contextual variants 163 | .table-row-variant(success; @state-success-bg; @state-success-border); 164 | .table-row-variant(danger; @state-danger-bg; @state-danger-border); 165 | .table-row-variant(warning; @state-warning-bg; @state-warning-border); 166 | 167 | 168 | // Responsive tables 169 | // 170 | // Wrap your tables in `.table-responsive` and we'll make them mobile friendly 171 | // by enabling horizontal scrolling. Only applies <768px. Everything above that 172 | // will display normally. 173 | 174 | @media (max-width: @screen-xs-max) { 175 | .table-responsive { 176 | width: 100%; 177 | margin-bottom: (@line-height-computed * 0.75); 178 | overflow-y: hidden; 179 | overflow-x: scroll; 180 | -ms-overflow-style: -ms-autohiding-scrollbar; 181 | border: 1px solid @table-border-color; 182 | -webkit-overflow-scrolling: touch; 183 | 184 | // Tighten up spacing 185 | > .table { 186 | margin-bottom: 0; 187 | 188 | // Ensure the content doesn't wrap 189 | > thead, 190 | > tbody, 191 | > tfoot { 192 | > tr { 193 | > th, 194 | > td { 195 | white-space: nowrap; 196 | } 197 | } 198 | } 199 | } 200 | 201 | // Special overrides for the bordered tables 202 | > .table-bordered { 203 | border: 0; 204 | 205 | // Nuke the appropriate borders so that the parent can handle them 206 | > thead, 207 | > tbody, 208 | > tfoot { 209 | > tr { 210 | > th:first-child, 211 | > td:first-child { 212 | border-left: 0; 213 | } 214 | > th:last-child, 215 | > td:last-child { 216 | border-right: 0; 217 | } 218 | } 219 | } 220 | 221 | // Only nuke the last row's bottom-border in `tbody` and `tfoot` since 222 | // chances are there will be only one `tr` in a `thead` and that would 223 | // remove the border altogether. 224 | > tbody, 225 | > tfoot { 226 | > tr:last-child { 227 | > th, 228 | > td { 229 | border-bottom: 0; 230 | } 231 | } 232 | } 233 | 234 | } 235 | } 236 | } 237 | -------------------------------------------------------------------------------- /less/thumbnails.less: -------------------------------------------------------------------------------- 1 | // 2 | // Thumbnails 3 | // -------------------------------------------------- 4 | 5 | 6 | // Mixin and adjust the regular image class 7 | .thumbnail { 8 | .img-thumbnail(); 9 | display: block; // Override the inline-block from `.img-thumbnail` 10 | margin-bottom: @line-height-computed; 11 | 12 | > img { 13 | .img-responsive(); 14 | margin-left: auto; 15 | margin-right: auto; 16 | } 17 | } 18 | 19 | 20 | // Add a hover state for linked versions only 21 | a.thumbnail:hover, 22 | a.thumbnail:focus, 23 | a.thumbnail.active { 24 | border-color: @link-color; 25 | } 26 | 27 | // Image captions 28 | .thumbnail .caption { 29 | padding: @thumbnail-caption-padding; 30 | color: @thumbnail-caption-color; 31 | } 32 | -------------------------------------------------------------------------------- /less/tooltip.less: -------------------------------------------------------------------------------- 1 | // 2 | // Tooltips 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .tooltip { 8 | position: absolute; 9 | z-index: @zindex-tooltip; 10 | display: block; 11 | visibility: visible; 12 | font-size: @font-size-small; 13 | line-height: 1.4; 14 | .opacity(0); 15 | 16 | &.in { .opacity(.9); } 17 | &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; } 18 | &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; } 19 | &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; } 20 | &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; } 21 | } 22 | 23 | // Wrapper for the tooltip content 24 | .tooltip-inner { 25 | max-width: @tooltip-max-width; 26 | padding: 3px 8px; 27 | color: @tooltip-color; 28 | text-align: center; 29 | text-decoration: none; 30 | background-color: @tooltip-bg; 31 | border-radius: @border-radius-base; 32 | } 33 | 34 | // Arrows 35 | .tooltip-arrow { 36 | position: absolute; 37 | width: 0; 38 | height: 0; 39 | border-color: transparent; 40 | border-style: solid; 41 | } 42 | .tooltip { 43 | &.top .tooltip-arrow { 44 | bottom: 0; 45 | left: 50%; 46 | margin-left: -@tooltip-arrow-width; 47 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0; 48 | border-top-color: @tooltip-arrow-color; 49 | } 50 | &.top-left .tooltip-arrow { 51 | bottom: 0; 52 | left: @tooltip-arrow-width; 53 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0; 54 | border-top-color: @tooltip-arrow-color; 55 | } 56 | &.top-right .tooltip-arrow { 57 | bottom: 0; 58 | right: @tooltip-arrow-width; 59 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0; 60 | border-top-color: @tooltip-arrow-color; 61 | } 62 | &.right .tooltip-arrow { 63 | top: 50%; 64 | left: 0; 65 | margin-top: -@tooltip-arrow-width; 66 | border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0; 67 | border-right-color: @tooltip-arrow-color; 68 | } 69 | &.left .tooltip-arrow { 70 | top: 50%; 71 | right: 0; 72 | margin-top: -@tooltip-arrow-width; 73 | border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width; 74 | border-left-color: @tooltip-arrow-color; 75 | } 76 | &.bottom .tooltip-arrow { 77 | top: 0; 78 | left: 50%; 79 | margin-left: -@tooltip-arrow-width; 80 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; 81 | border-bottom-color: @tooltip-arrow-color; 82 | } 83 | &.bottom-left .tooltip-arrow { 84 | top: 0; 85 | left: @tooltip-arrow-width; 86 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; 87 | border-bottom-color: @tooltip-arrow-color; 88 | } 89 | &.bottom-right .tooltip-arrow { 90 | top: 0; 91 | right: @tooltip-arrow-width; 92 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; 93 | border-bottom-color: @tooltip-arrow-color; 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /less/utilities.less: -------------------------------------------------------------------------------- 1 | // 2 | // Utility classes 3 | // -------------------------------------------------- 4 | 5 | 6 | // Floats 7 | // ------------------------- 8 | 9 | .clearfix { 10 | .clearfix(); 11 | } 12 | .center-block { 13 | .center-block(); 14 | } 15 | .pull-right { 16 | float: right !important; 17 | } 18 | .pull-left { 19 | float: left !important; 20 | } 21 | 22 | 23 | // Toggling content 24 | // ------------------------- 25 | 26 | // Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1 27 | .hide { 28 | display: none !important; 29 | } 30 | .show { 31 | display: block !important; 32 | } 33 | .invisible { 34 | visibility: hidden; 35 | } 36 | .text-hide { 37 | .text-hide(); 38 | } 39 | 40 | 41 | // Hide from screenreaders and browsers 42 | // 43 | // Credit: HTML5 Boilerplate 44 | 45 | .hidden { 46 | display: none !important; 47 | visibility: hidden !important; 48 | } 49 | 50 | 51 | // For Affix plugin 52 | // ------------------------- 53 | 54 | .affix { 55 | position: fixed; 56 | } 57 | -------------------------------------------------------------------------------- /less/wells.less: -------------------------------------------------------------------------------- 1 | // 2 | // Wells 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .well { 8 | min-height: 20px; 9 | padding: 19px; 10 | margin-bottom: 20px; 11 | background-color: @well-bg; 12 | border: 1px solid darken(@well-bg, 7%); 13 | border-radius: @border-radius-base; 14 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); 15 | blockquote { 16 | border-color: #ddd; 17 | border-color: rgba(0,0,0,.15); 18 | } 19 | } 20 | 21 | // Sizes 22 | .well-lg { 23 | padding: 24px; 24 | border-radius: @border-radius-large; 25 | } 26 | .well-sm { 27 | padding: 9px; 28 | border-radius: @border-radius-small; 29 | } 30 | -------------------------------------------------------------------------------- /login.php: -------------------------------------------------------------------------------- 1 | 0 && strlen($sess_port)>0 && strlen($sess_user)>0 && strlen($sess_pass)>0 && strlen($sess_token)>0 && strlen($sess_csrf)==64) 14 | { 15 | $allow = 1; 16 | } 17 | } 18 | if($allow==1) 19 | { 20 | header("Location: dashboard.php"); 21 | } 22 | 23 | require_once("includes/functions.php"); 24 | 25 | $status = ""; 26 | if(isset($_POST["empire_ip"]) && isset($_POST["empire_port"]) && isset($_POST["empire_user"]) && isset($_POST["empire_pass"])) 27 | { 28 | $empire_ip = urldecode($_POST["empire_ip"]); 29 | $empire_port = urldecode($_POST["empire_port"]); 30 | $empire_user = urldecode($_POST["empire_user"]); 31 | $empire_pass = urldecode($_POST["empire_pass"]); 32 | if(strlen($empire_ip)>0 && strlen($empire_port)>0 && strlen($empire_user)>0 && strlen($empire_pass)>0) 33 | { 34 | $arr_result = authenticate_empire($empire_ip, $empire_port, $empire_user, $empire_pass); 35 | if(array_key_exists("token", $arr_result)) 36 | { 37 | $empire_session_token = $arr_result["token"]; 38 | $status = "
        Login success. $empire_session_token
        "; 39 | @session_destroy(); 40 | session_start(); 41 | session_regenerate_id(); 42 | //Create session values 43 | $_SESSION['empire_ip'] = $empire_ip; 44 | $_SESSION['empire_port'] = $empire_port; 45 | $_SESSION['empire_user'] = $empire_user; 46 | $_SESSION['empire_pass'] = $empire_pass; 47 | $_SESSION['empire_session_token'] = $empire_session_token; 48 | //For anti-csrf 49 | $_SESSION['csrf_token'] = substr("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",mt_rand(0,50),1).substr(hash("sha256",time().rand().rand()), 1); 50 | header("Location: dashboard.php"); 51 | } 52 | else 53 | { 54 | $status = "
        Failed login attempt.
        "; 55 | } 56 | } 57 | } 58 | ?> 59 | 60 | 61 | 62 | 63 | EmPyre Web Login 64 | 65 | 66 | 67 | 68 |
        69 | 70 |
        71 |
        72 |
        73 |
        74 |
        75 |

        76 | 77 |

        EmPyre Web

        78 |
        79 |
        80 |
        81 | 82 | 83 |
        84 |
        85 | 86 | 87 |
        88 |
        89 | 90 | 91 |
        92 |
        93 | 94 | 95 |
        96 | 97 |

        98 | 0){ echo $status; } ?> 99 |
        100 |
        101 |
        102 |
        103 | 104 | 105 | -------------------------------------------------------------------------------- /logout.php: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 | 16 | EmPyre Web Logged Out 17 | 18 | 19 | 20 | 21 |
        22 | 23 |
        24 | You have been logged out.
        '; ?> 25 |
        26 |
        27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /remove-agent.php: -------------------------------------------------------------------------------- 1 | 0) 10 | { 11 | $remove_agent = html_entity_decode(urldecode($_POST['remove_agent'])); 12 | $arr_result = remove_agent($sess_ip, $sess_port, $sess_token, $remove_agent); 13 | if(!empty($arr_result)) 14 | { 15 | if(array_key_exists("success",$arr_result)) 16 | { 17 | $resp = $arr_result["success"]; 18 | if($resp) 19 | $empire_remove_agent = "
        Agent removed successfully.
        "; 20 | else 21 | $empire_remove_agent = "
        Could not remove agent.
        "; 22 | } 23 | elseif(array_key_exists("error",$arr_result)) 24 | { 25 | $empire_remove_agent = "
        ".ucfirst(htmlentities($arr_result['error']))."
        "; 26 | } 27 | else 28 | { 29 | $empire_remove_agent = "
        Unexpected response.
        "; 30 | } 31 | } 32 | else 33 | { 34 | $empire_remove_agent = "
        Unexpected response.
        "; 35 | } 36 | } 37 | } 38 | 39 | $empire_agents = ""; 40 | $arr_result = get_all_agents($sess_ip, $sess_port, $sess_token); 41 | if(!empty($arr_result)) 42 | { 43 | $empire_agents .= ""; 44 | for($i=0; $i".htmlentities($arr_result["agents"][$i]["name"]).""; 47 | } 48 | } 49 | else 50 | { 51 | $empire_agents = "
        Unexpected response.
        "; 52 | } 53 | ?> 54 | 55 | 56 | 57 | EmPyre: Remove Agent 58 | 59 | 60 | 61 |
        62 | 63 |
        64 |
        65 |
        66 |
        Remove Agent
        67 |
        68 |
        69 | Removes the agent specified by Agent Name (doesn't kill first).

        70 |
        71 | 74 |
        75 | 76 |
        77 |
        78 | 79 |
        80 |
        81 |

        82 |
        83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /remove-stale-agents.php: -------------------------------------------------------------------------------- 1 | Stale agents deleted"; 20 | else 21 | $empire_remove_stale_agents = "
        Could not delete stale agents.
        "; 22 | } 23 | elseif(array_key_exists("error",$arr_result)) 24 | { 25 | $empire_remove_stale_agents = "
        ".ucfirst(htmlentities($arr_result['error']))."
        "; 26 | } 27 | else 28 | { 29 | $empire_remove_stale_agents = "
        Unexpected response.
        "; 30 | } 31 | } 32 | else 33 | { 34 | $empire_remove_stale_agents = "
        Unexpected response.
        "; 35 | } 36 | } 37 | } 38 | ?> 39 | 40 | 41 | 42 | EmPyre: Remove Stale Agents 43 | 44 | 45 | 46 |
        47 | 48 |
        49 |
        50 |
        51 |
        Remove Stale Agents
        52 |
        53 |
        54 |
        55 | 56 |
        57 |
        58 | 59 |
        60 |
        61 |

        62 |
        63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /rename-agent.php: -------------------------------------------------------------------------------- 1 | 0 && isset($_POST['newname']) && strlen($_POST['newname'])>0) 10 | { 11 | $current_agent_name = html_entity_decode(urldecode($_POST['current_agent_name'])); 12 | $agent_newname = html_entity_decode(urldecode($_POST['newname'])); 13 | $arr_result = rename_agent($sess_ip, $sess_port, $sess_token, $current_agent_name, $agent_newname); 14 | if(!empty($arr_result)) 15 | { 16 | if(array_key_exists("success",$arr_result)) 17 | { 18 | $resp = $arr_result["success"]; 19 | if($resp) 20 | $empire_rename_agent = "
        Agent renamed successfully.
        "; 21 | else 22 | $empire_rename_agent = "
        Could not rename agent.
        "; 23 | } 24 | elseif(array_key_exists("error",$arr_result)) 25 | { 26 | $empire_rename_agent = "
        ".ucfirst(htmlentities($arr_result['error']))."
        "; 27 | } 28 | else 29 | { 30 | $empire_rename_agent = "
        Unexpected response.
        "; 31 | } 32 | } 33 | else 34 | { 35 | $empire_rename_agent = "
        Unexpected response.
        "; 36 | } 37 | } 38 | } 39 | 40 | $empire_agents = ""; 41 | $arr_result = get_all_agents($sess_ip, $sess_port, $sess_token); 42 | if(!empty($arr_result)) 43 | { 44 | $empire_agents .= ""; 45 | for($i=0; $i".htmlentities($arr_result["agents"][$i]["name"]).""; 48 | } 49 | } 50 | else 51 | { 52 | $empire_agents = "
        Unexpected response.
        "; 53 | } 54 | ?> 55 | 56 | 57 | 58 | EmPyre: Rename Agent 59 | 60 | 61 | 62 |
        63 | 64 |
        65 |
        66 |
        67 |
        Rename Agent
        68 |
        69 |
        70 |
        71 | 74 |
        75 |
        76 | 77 |
        78 | 79 |
        80 |
        81 | 82 |
        83 |
        84 |

        85 |
        86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /restart-api-server.php: -------------------------------------------------------------------------------- 1 | Failed to restart EmPyre REST API Server."; 17 | else 18 | $empire_restart = "
        ".htmlentities($temp_resp)."
        "; 19 | } 20 | elseif(array_key_exists("error", $arr_result)) 21 | { 22 | $error_resp = ucfirst(htmlentities($arr_result["error"])); 23 | $empire_restart = "
        $error_resp
        "; 24 | } 25 | else 26 | { 27 | $empire_restart = "
        Unexpected response
        "; 28 | } 29 | } 30 | else 31 | { 32 | $empire_restart = "
        Unexpected response
        "; 33 | } 34 | ?> 35 | 36 | 37 | 38 | EmPyre: Restart API Server 39 | 40 | 41 | 42 |
        43 | 44 |
        45 |
        46 |
        47 |
        Restart EmPyre REST API Server
        48 |
        49 |
        50 |
        51 |

        52 |
        53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /search-agent-name.php: -------------------------------------------------------------------------------- 1 | ".ucfirst(htmlentities($arr_result["error"])).""; 14 | } 15 | else 16 | { 17 | if(!empty($arr_result)) 18 | { 19 | if(array_key_exists("agents", $arr_result) && !empty($arr_result["agents"][0])) 20 | { 21 | $empire_agent .= "
        Agent Name: ".htmlentities($arr_result["agents"][0]["name"])."
        "; 22 | $empire_agent .= ""; 23 | foreach($arr_result["agents"][0] as $key => $value) 24 | { 25 | $key = htmlentities($key); 26 | $value = htmlentities($value); 27 | $empire_agent .= ""; 28 | } 29 | $empire_agent .= '
        Agent OptionAgent Value
        $key$value
        '; 30 | $empire_agent .= "

        "; 31 | } 32 | elseif(array_key_exists("agents", $arr_result) && empty($arr_result["agents"][0])) 33 | { 34 | $empire_agent = "
        Agent not found.
        "; 35 | } 36 | else 37 | { 38 | $empire_agent = "
        Unexpected response.
        "; 39 | //$empire_agent = $arr_result; 40 | } 41 | } 42 | else 43 | { 44 | $empire_agent = "
        Unexpected response.
        "; 45 | } 46 | } 47 | } 48 | ?> 49 | 50 | 51 | 52 | EmPyre: Search Agent 53 | 54 | 55 | 56 |
        57 | 58 |
        59 |
        60 |
        61 |
        Search Agent by Name
        62 |
        63 |
        64 |
        65 | 66 |
        67 | 68 |
        69 |
        70 | 71 |
        72 |
        73 |

        74 |
        75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /search-listener-name.php: -------------------------------------------------------------------------------- 1 | ".ucfirst(htmlentities($arr_result["error"])).""; 14 | } 15 | else 16 | { 17 | if(!empty($arr_result)) 18 | { 19 | $empire_listener .= '
        Listener Name: '.htmlentities($arr_result["listeners"][0]["name"]).'
        '; 20 | $empire_listener .= ''; 21 | foreach($arr_result["listeners"][0] as $key => $value) 22 | { 23 | $key = htmlentities($key); 24 | $value = htmlentities($value); 25 | $empire_listener .= ""; 26 | } 27 | $empire_listener .= '
        Listener OptionListener Value
        $key$value
        '; 28 | $empire_listener .= '
        '; 29 | } 30 | else 31 | { 32 | $empire_listener = "
        Unexpected response.
        "; 33 | } 34 | } 35 | } 36 | ?> 37 | 38 | 39 | 40 | EmPyre: Search Listener 41 | 42 | 43 | 44 |
        45 | 46 |
        47 |
        48 |
        49 |
        Search Listener by name
        50 |
        51 |
        52 |
        53 | 54 |
        55 | 56 |
        57 |
        58 | 59 |
        60 |
        61 |
        62 |
        63 |
        64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /search-module-name.php: -------------------------------------------------------------------------------- 1 | 0) 17 | { 18 | for($i=0; $iUse Module 22 |
        "; 23 | $empire_module .= ""; 24 | foreach($arr_result["modules"][$i] as $key => $value) 25 | { 26 | if($key != "options") 27 | { 28 | $key = htmlentities($key); 29 | $value = (is_array($value) ? htmlentities(implode(', ', $value)) : $value); 30 | if(is_bool($value)) 31 | { 32 | if($value == True) 33 | $value = "Yes"; 34 | else 35 | $value = "No"; 36 | } 37 | elseif(is_null($value)) 38 | { 39 | $value = "Null"; 40 | } 41 | else 42 | { 43 | $value = htmlentities($value); 44 | } 45 | $empire_module .= ""; 46 | } 47 | } 48 | $empire_module .= "
        $key$value
        "; 49 | $empire_module .= ""; 50 | foreach($arr_result["modules"][$i]["options"] as $key => $value) 51 | { 52 | $key = htmlentities($key); 53 | $desc = htmlentities($value["Description"]); 54 | $reqd = (htmlentities($value["Required"]) ? "Yes" : "No"); 55 | $val = htmlentities($value["Value"]); 56 | $empire_module .= ""; 57 | $empire_module .= ""; 58 | $empire_module .= ""; 59 | } 60 | $empire_module .= '
        Module Options:
        NameDescriptionRequiredValue
        $key$desc$reqd$val
        '; 61 | $empire_module .= "
        "; 62 | } 63 | } 64 | else 65 | { 66 | $empire_module = "
        No module found.
        "; 67 | } 68 | } 69 | elseif(array_key_exists("error", $arr_result)) 70 | { 71 | $empire_module = "
        ".ucfirst(htmlentities($arr_result["error"]))."
        "; 72 | } 73 | else 74 | { 75 | $empire_module = "
        Unexpected response.
        "; 76 | } 77 | } 78 | else 79 | { 80 | $empire_module = "
        Unexpected response.
        "; 81 | } 82 | } 83 | ?> 84 | 85 | 86 | 87 | EmPyre: Search Module Name 88 | 89 | 90 | 91 |
        92 | 93 |
        94 |
        95 |
        96 |
        Show Module by Name
        97 |
        98 |
        99 |
        100 | 101 |
        102 | 103 |
        104 |
        105 | 106 |
        107 |
        108 |

        109 |
        110 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /search-module.php: -------------------------------------------------------------------------------- 1 | 0) 17 | { 18 | for($i=0; $i Use Module 22 |
        23 |
        "; 24 | $empire_module .= ""; 25 | foreach($arr_result["modules"][$i] as $key => $value) 26 | { 27 | if($key != "options") 28 | { 29 | $key = htmlentities($key); 30 | $value = (is_array($value) ? htmlentities(implode(', ', $value)) : $value); 31 | if(is_bool($value)) 32 | { 33 | if($value == True) 34 | $value = "Yes"; 35 | else 36 | $value = "No"; 37 | } 38 | elseif(is_null($value)) 39 | { 40 | $value = "Null"; 41 | } 42 | else 43 | { 44 | $value = htmlentities($value); 45 | } 46 | $empire_module .= ""; 47 | } 48 | } 49 | $empire_module .= "
        $key$value
        "; 50 | $empire_module .= ""; 51 | foreach($arr_result["modules"][$i]["options"] as $key => $value) 52 | { 53 | $key = htmlentities($key); 54 | $desc = htmlentities($value["Description"]); 55 | $reqd = (htmlentities($value["Required"]) ? "Yes" : "No"); 56 | $val = htmlentities($value["Value"]); 57 | $empire_module .= ""; 58 | $empire_module .= ""; 59 | $empire_module .= ""; 60 | } 61 | $empire_module .= '
        Module Options:
        NameDescriptionRequiredValue
        $key$desc$reqd$val
        '; 62 | $empire_module .= "

        "; 63 | $count = $i+1; 64 | } 65 | } 66 | else 67 | { 68 | $empire_module = "
        No module found.
        "; 69 | } 70 | } 71 | elseif(array_key_exists("error", $arr_result)) 72 | { 73 | $empire_module = "
        ".ucfirst(htmlentities($arr_result["error"]))."
        "; 74 | } 75 | else 76 | { 77 | $empire_module = "
        Unexpected response.
        "; 78 | } 79 | } 80 | else 81 | { 82 | $empire_module = "
        Unexpected response.
        "; 83 | } 84 | } 85 | ?> 86 | 87 | 88 | 89 | EmPyre: Search Module 90 | 91 | 92 | 93 |
        94 | 95 |
        96 |
        97 |
        98 |
        Search for Module ()
        99 |
        100 |
        101 | Searches all module fields for the given term.

        102 |
        103 | 104 |
        105 | 106 |
        107 |
        108 | 109 |
        110 |
        111 |

        112 |
        113 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /search-stager-name.php: -------------------------------------------------------------------------------- 1 | ".ucfirst(htmlentities($arr_result["error"])).""; 14 | } 15 | else 16 | { 17 | if(!empty($arr_result)) 18 | { 19 | for($i=0; $i 23 |
        "; 24 | $stager_name = htmlentities($arr_result["stagers"][$i]["Name"]); 25 | $stager_desc = htmlentities($arr_result["stagers"][$i]["Description"]); 26 | $stager_author = htmlentities(implode(",", $arr_result["stagers"][$i]["Author"])); 27 | $stager_comments = htmlentities(implode(",", $arr_result["stagers"][$i]["Comments"])); 28 | $empire_stager .= "
        Name$stager_name
        Description$stager_desc
        Author$stager_author
        Comments$stager_comments
        "; 29 | $empire_stager .= ""; 30 | foreach($arr_result["stagers"][$i]["options"] as $key => $value) 31 | { 32 | $key = htmlentities($key); 33 | $desc = htmlentities($value["Description"]); 34 | $reqd = (htmlentities($value["Required"]) ? "Yes" : "No"); 35 | $val = htmlentities($value["Value"]); 36 | $empire_stager .= ""; 37 | $empire_stager .= ""; 38 | $empire_stager .= ""; 39 | } 40 | $empire_stager .= '
        Stager Options:
        NameDescriptionRequiredValue
        $key$desc$reqd$val
        '; 41 | $empire_stager .= "

        "; 42 | } 43 | } 44 | else 45 | { 46 | $empire_stager = "
        Unexpected response.
        "; 47 | } 48 | } 49 | } 50 | ?> 51 | 52 | 53 | 54 | EmPyre: Search Stager 55 | 56 | 57 | 58 |
        59 | 60 |
        61 |
        62 |
        63 |
        Search Stager by Name
        64 |
        65 |
        66 |
        67 | 68 |
        69 | 70 |
        71 |
        72 | 73 |
        74 |
        75 |
        76 |
        77 |
        78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /show-agent-results.php: -------------------------------------------------------------------------------- 1 | 0) 10 | { 11 | $agent_name = html_entity_decode(urldecode($_POST['agent_name'])); 12 | $arr_result = show_agent_results($sess_ip, $sess_port, $sess_token, $agent_name); 13 | if(!empty($arr_result)) 14 | { 15 | if(array_key_exists("results",$arr_result)) 16 | { 17 | if(sizeof($arr_result["results"])>0) 18 | { 19 | if(array_key_exists("agentname", $arr_result["results"][0]) && array_key_exists("results", $arr_result["results"][0])) 20 | { 21 | $val_agent_name = htmlentities($arr_result["results"][0]["agentname"]); 22 | $val_agent_results = htmlentities($arr_result["results"][0]["results"]); 23 | $val_agent_results = (strlen($val_agent_results)>0 ? $val_agent_results : "No results"); 24 | $empire_show_agent_results .= "
        Agent $val_agent_name Results
        $val_agent_results
        "; 25 | } 26 | else 27 | { 28 | $empire_show_agent_results = "
        Unexpected response.
        "; 29 | } 30 | } 31 | else 32 | { 33 | $empire_show_agent_results = "
        Unexpected response.
        "; 34 | } 35 | } 36 | elseif(array_key_exists("error",$arr_result)) 37 | { 38 | $empire_show_agent_results = "
        ".ucfirst(htmlentities($arr_result['error']))."
        "; 39 | } 40 | else 41 | { 42 | $empire_show_agent_results = "
        Unexpected response.
        "; 43 | } 44 | } 45 | else 46 | { 47 | $empire_show_agent_results = "
        Unexpected response.
        "; 48 | } 49 | } 50 | } 51 | 52 | $empire_agents = ""; 53 | $arr_result = get_all_agents($sess_ip, $sess_port, $sess_token); 54 | if(!empty($arr_result)) 55 | { 56 | $empire_agents .= ""; 57 | for($i=0; $i".htmlentities($arr_result["agents"][$i]["name"]).""; 60 | } 61 | } 62 | else 63 | { 64 | $empire_agents = "
        Unexpected response.
        "; 65 | } 66 | ?> 67 | 68 | 69 | 70 | EmPyre: Show Agent Results 71 | 72 | 73 | 74 |
        75 | 76 |
        77 |
        78 |
        79 |
        Show Agent Results
        80 |
        81 |
        82 | Retrieves results for the agent specifed by Agent Name.

        83 |
        84 | 87 |
        88 | 89 |
        90 |
        91 | 92 |
        93 |
        94 |
        95 |
        96 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /show-all-agents.php: -------------------------------------------------------------------------------- 1 | 0) 14 | { 15 | $empire_agents .= "
        "; 16 | for($i=0; $i
        20 |
        21 |
        "; 22 | $empire_agents .= ''; 23 | foreach($arr_result["agents"][$i] as $key => $value) 24 | { 25 | $key = htmlentities($key); 26 | $value = htmlentities($value); 27 | $empire_agents .= ""; 28 | } 29 | $empire_agents .= '
        Agent OptionAgent Value
        $key$value
        '; 30 | $empire_agents .= "

        "; 31 | $count = $i + 1; 32 | } 33 | $empire_agents .= ""; 34 | } 35 | else 36 | { 37 | $empire_agents = "
        No agent found.
        "; 38 | } 39 | } 40 | elseif(array_key_exists("error", $arr_result)) 41 | { 42 | $empire_agents = "
        ".$arr_result["error"]."
        "; 43 | } 44 | else 45 | { 46 | $empire_agents = "
        Unexpected response.
        "; 47 | } 48 | } 49 | else 50 | { 51 | $empire_agents = "
        Unexpected response.
        "; 52 | } 53 | ?> 54 | 55 | 56 | 57 | EmPyre: All Agents 58 | 59 | 60 | 61 |
        62 | 63 |
        64 |
        65 |
        66 |
        Show All Agents ()
        67 |
        68 |
        69 |
        70 |
        71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /show-all-listeners.php: -------------------------------------------------------------------------------- 1 | Listener OptionListener Value'; 12 | $empire_listeners .= "
        "; 13 | for($i=0; $i
        17 |
        18 |
        "; 19 | $empire_listeners .= ''; 20 | foreach($arr_result["listeners"][$i] as $key => $value) 21 | { 22 | $key = htmlentities($key); 23 | $value = htmlentities($value); 24 | $empire_listeners .= ""; 25 | } 26 | $empire_listeners .= '
        Listener OptionListener Value
        $key$value
        '; 27 | $empire_listeners .= "
        "; 28 | $count = $i + 1; 29 | } 30 | $empire_listeners .= ""; 31 | } 32 | else 33 | { 34 | $empire_listeners = "
        Unexpected response.
        "; 35 | } 36 | ?> 37 | 38 | 39 | 40 | EmPyre: All Listeners 41 | 42 | 43 | 44 |
        45 | 46 |
        47 |
        48 |
        49 |
        Show All Listeners ()
        50 |
        51 |
        52 |
        53 |
        54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /show-all-logged-events.php: -------------------------------------------------------------------------------- 1 | ".htmlentities($arr_result["error"]).""; 15 | } 16 | else 17 | { 18 | $empire_all_events = "
        Unexpected response
        "; 19 | } 20 | ?> 21 | 22 | 23 | 24 | EmPyre: All Logged Events 25 | 26 | 27 | 28 |
        29 | 30 |
        31 |
        32 |
        33 |
        Show All Logged Events
        34 |
        35 |
        36 |
        37 |
        38 |
        39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /show-all-modules.php: -------------------------------------------------------------------------------- 1 | 0) 14 | { 15 | $temp_module_name_list = array(); 16 | for($temp_i=0; $temp_i Use Module 26 |
        27 |
        "; 28 | $empire_modules .= ""; 29 | foreach($arr_result["modules"][$i] as $key => $value) 30 | { 31 | if($key != "options") 32 | { 33 | $key = htmlentities($key); 34 | $value = (is_array($value) ? htmlentities(implode(', ', $value)) : $value); 35 | if(is_bool($value)) 36 | { 37 | if($value == True) 38 | $value = "Yes"; 39 | else 40 | $value = "No"; 41 | } 42 | elseif(is_null($value)) 43 | { 44 | $value = "Null"; 45 | } 46 | else 47 | { 48 | $value = htmlentities($value); 49 | } 50 | $empire_modules .= ""; 51 | } 52 | } 53 | $empire_modules .= "
        $key$value
        "; 54 | $empire_modules .= ""; 55 | foreach($arr_result["modules"][$i]["options"] as $key => $value) 56 | { 57 | $key = htmlentities($key); 58 | $desc = htmlentities($value["Description"]); 59 | $reqd = (htmlentities($value["Required"]) ? "Yes" : "No"); 60 | $val = htmlentities($value["Value"]); 61 | $empire_modules .= ""; 62 | $empire_modules .= ""; 63 | $empire_modules .= ""; 64 | } 65 | $empire_modules .= '
        Module Options:
        NameDescriptionRequiredValue
        $key$desc$reqd$val
        '; 66 | $empire_modules .= "

        "; 67 | $count = $i+1; 68 | } 69 | } 70 | else 71 | { 72 | $empire_modules = "
        No module found.
        "; 73 | } 74 | } 75 | elseif(array_key_exists("error", $arr_result)) 76 | { 77 | $empire_modules = "
        ".ucfirst(htmlentities($arr_result["error"]))."
        "; 78 | } 79 | else 80 | { 81 | $empire_modules = "
        Unexpected response.
        "; 82 | } 83 | } 84 | else 85 | { 86 | $empire_modules = "
        Unexpected response.
        "; 87 | } 88 | ?> 89 | 90 | 91 | 92 | EmPyre: All Modules 93 | 94 | 95 | 96 |
        97 | 98 |
        99 |
        100 |
        101 |
        Show All Modules ()
        102 |
        103 |
        104 |

        105 |
        106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /show-all-stagers.php: -------------------------------------------------------------------------------- 1 |
        14 | 15 |
        16 |
        "; 17 | $stager_name = htmlentities($arr_result["stagers"][$i]["Name"]); 18 | $stager_desc = htmlentities($arr_result["stagers"][$i]["Description"]); 19 | $stager_author = htmlentities(implode(", ", $arr_result["stagers"][$i]["Author"])); 20 | $stager_comments = htmlentities(implode(", ", $arr_result["stagers"][$i]["Comments"])); 21 | $empire_stagers .= "
        Name$stager_name
        Description$stager_desc
        Author$stager_author
        Comments$stager_comments
        "; 22 | $empire_stagers .= ""; 23 | foreach($arr_result["stagers"][$i]["options"] as $key => $value) 24 | { 25 | $key = htmlentities($key); 26 | $desc = htmlentities($value["Description"]); 27 | $reqd = (htmlentities($value["Required"]) ? "Yes" : "No"); 28 | $val = htmlentities($value["Value"]); 29 | $empire_stagers .= ""; 30 | $empire_stagers .= ""; 31 | $empire_stagers .= ""; 32 | } 33 | $empire_stagers .= '
        Stager Options:
        NameDescriptionRequiredValue
        $key$desc$reqd$val
        '; 34 | $empire_stagers .= "

        "; 35 | $count = $i+1; 36 | } 37 | } 38 | else 39 | { 40 | $empire_stagers = "
        Unexpected response.
        "; 41 | } 42 | ?> 43 | 44 | 45 | 46 | EmPyre: All Stagers 47 | 48 | 49 | 50 |
        51 | 52 |
        53 |
        54 |
        55 |
        All Stagers ()
        56 |
        57 |
        58 |
        59 |
        60 |
        61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /show-logged-events-agent.php: -------------------------------------------------------------------------------- 1 | 0) 10 | { 11 | $agent_name = html_entity_decode(urldecode($_GET['agent_name'])); 12 | $arr_result = get_agent_logged_events($sess_ip, $sess_port, $sess_token, $agent_name); 13 | if(!empty($arr_result)) 14 | { 15 | if(array_key_exists("reporting",$arr_result)) 16 | { 17 | $empire_show_agent_results = $arr_result; 18 | } 19 | elseif(array_key_exists("error",$arr_result)) 20 | { 21 | $empire_show_agent_results = "
        ".ucfirst(htmlentities($arr_result['error']))."
        "; 22 | } 23 | else 24 | { 25 | $empire_show_agent_results = "
        Unexpected response.
        "; 26 | } 27 | } 28 | else 29 | { 30 | $empire_show_agent_results = "
        Unexpected response.
        "; 31 | } 32 | } 33 | } 34 | 35 | $empire_agents = ""; 36 | $arr_result = get_all_agents($sess_ip, $sess_port, $sess_token); 37 | if(!empty($arr_result)) 38 | { 39 | $empire_agents .= ""; 40 | for($i=0; $i".htmlentities($arr_result["agents"][$i]["name"]).""; 43 | } 44 | } 45 | else 46 | { 47 | $empire_agents = "
        Unexpected response.
        "; 48 | } 49 | ?> 50 | 51 | 52 | 53 | EmPyre: Logged Events - Agent 54 | 55 | 56 | 57 |
        58 | 59 |
        60 |
        61 |
        62 |
        Show Agent Logged Events
        63 |
        64 |
        65 | Shows events for a specific agent.

        66 |
        67 | 70 |
        71 | 72 |
        73 |
        74 |
        75 |
        76 |
        77 |

        78 |
        79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /show-logged-events-msg.php: -------------------------------------------------------------------------------- 1 | 0) 10 | { 11 | $event_msg = html_entity_decode(urldecode($_GET['event_msg'])); 12 | $arr_result = get_msg_logged_events($sess_ip, $sess_port, $sess_token, $event_msg); 13 | if(!empty($arr_result)) 14 | { 15 | if(array_key_exists("reporting",$arr_result)) 16 | { 17 | $empire_show_msg_results = $arr_result; 18 | } 19 | elseif(array_key_exists("error",$arr_result)) 20 | { 21 | $empire_show_msg_results = "
        ".ucfirst(htmlentities($arr_result['error']))."
        "; 22 | } 23 | else 24 | { 25 | $empire_show_msg_results = "
        Unexpected response.
        "; 26 | } 27 | } 28 | else 29 | { 30 | $empire_show_msg_results = "
        Unexpected response.
        "; 31 | } 32 | } 33 | } 34 | ?> 35 | 36 | 37 | 38 | EmPyre: Logged Events - Msg 39 | 40 | 41 | 42 |
        43 | 44 |
        45 |
        46 |
        47 |
        Show Logged Events with a Specific Msg
        48 |
        49 |
        50 | Shows events with a specific msg.

        51 |
        52 | 53 |
        54 | 55 |
        56 |
        57 |
        58 |
        59 |
        60 |

        61 |
        62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /show-logged-events-type.php: -------------------------------------------------------------------------------- 1 | 0) 10 | { 11 | $event_type = html_entity_decode(urldecode($_GET['event_type'])); 12 | $arr_result = get_type_logged_events($sess_ip, $sess_port, $sess_token, $event_type); 13 | if(!empty($arr_result)) 14 | { 15 | if(array_key_exists("reporting",$arr_result)) 16 | { 17 | $empire_show_type_results = $arr_result; 18 | } 19 | elseif(array_key_exists("error",$arr_result)) 20 | { 21 | $empire_show_type_results = "
        ".ucfirst(htmlentities($arr_result['error']))."
        "; 22 | } 23 | else 24 | { 25 | $empire_show_type_results = "
        Unexpected response.
        "; 26 | } 27 | } 28 | else 29 | { 30 | $empire_show_type_results = "
        Unexpected response.
        "; 31 | } 32 | } 33 | } 34 | ?> 35 | 36 | 37 | 38 | EmPyre: Logged Events - Type 39 | 40 | 41 | 42 |
        43 | 44 |
        45 |
        46 |
        47 |
        Show Logged Events of Specific Type
        48 |
        49 |
        50 | Shows events of a specific type.

        51 |
        52 | 58 |
        59 | 60 |
        61 |
        62 |
        63 |
        64 |
        65 |

        66 |
        67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /show-stale-agents.php: -------------------------------------------------------------------------------- 1 | 0) 14 | { 15 | $empire_agents .= "
        "; 16 | for($i=0; $i
        20 |
        21 |
        "; 22 | $empire_agents .= ''; 23 | foreach($arr_result["agents"][$i] as $key => $value) 24 | { 25 | $key = htmlentities($key); 26 | $value = htmlentities($value); 27 | $empire_agents .= ""; 28 | } 29 | $empire_agents .= '
        Agent OptionAgent Value
        $key$value
        '; 30 | $empire_agents .= "

        "; 31 | $count = $i + 1; 32 | } 33 | $empire_agents .= ""; 34 | } 35 | else 36 | { 37 | $empire_agents = "
        No stale agent found.
        "; 38 | } 39 | } 40 | elseif(array_key_exists("error", $arr_result)) 41 | { 42 | $empire_agents = "
        ".$arr_result["error"]."
        "; 43 | } 44 | else 45 | { 46 | $empire_agents = "
        Unexpected response.
        "; 47 | } 48 | } 49 | else 50 | { 51 | $empire_agents = "
        Unexpected response.
        "; 52 | } 53 | ?> 54 | 55 | 56 | 57 | EmPyre: Stale Agents 58 | 59 | 60 | 61 |
        62 | 63 |
        64 |
        65 |
        66 |
        Show Stale Agents ()
        67 |
        68 |
        69 |
        70 |
        71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /shutdown-api-server.php: -------------------------------------------------------------------------------- 1 | Failed to restart EmPyre REST API Server."; 17 | else 18 | $empire_shutdown = "
        ".htmlentities($temp_resp)."
        "; 19 | } 20 | elseif(array_key_exists("error", $arr_result)) 21 | { 22 | $error_resp = ucfirst(htmlentities($arr_result["error"])); 23 | $empire_shutdown = "
        $error_resp
        "; 24 | } 25 | else 26 | { 27 | $empire_shutdown = "
        Unexpected response
        "; 28 | } 29 | } 30 | else 31 | { 32 | $empire_shutdown = "
        Unexpected response
        "; 33 | } 34 | ?> 35 | 36 | 37 | 38 | EmPyre: Shutdown API Server 39 | 40 | 41 | 42 |
        43 | 44 |
        45 |
        46 |
        47 |
        Shutdown EmPyre REST API Server
        48 |
        49 |
        50 |
        51 |
        52 |
        53 |
        54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /styles/default/default.css: -------------------------------------------------------------------------------- 1 | /* PHP File Tree Default Theme 2 | 3 | By Cory LaViska (http://abeautifulsite.net/) 4 | Featuring the Silk Icon Set from famfamfam (http://www.famfamfam.com/lab/icons/silk/) 5 | 6 | */ 7 | 8 | .php-file-tree { 9 | font-family: Georgia; 10 | font-size: 12px; 11 | letter-spacing: 1px; line-height: 1.5; 12 | } 13 | 14 | .php-file-tree A { 15 | color: #000000; 16 | text-decoration: none; 17 | } 18 | 19 | .php-file-tree A:hover { 20 | color: #666666; 21 | } 22 | 23 | .php-file-tree .open { 24 | font-style: italic; 25 | } 26 | 27 | .php-file-tree .closed { 28 | font-style: normal; 29 | } 30 | 31 | .php-file-tree .pft-directory { 32 | list-style-image: url(images/directory.png); 33 | } 34 | 35 | /* Default file */ 36 | .php-file-tree LI.pft-file { list-style-image: url(images/file.png); } 37 | /* Additional file types */ 38 | .php-file-tree LI.ext-3gp { list-style-image: url(images/film.png); } 39 | .php-file-tree LI.ext-afp { list-style-image: url(images/code.png); } 40 | .php-file-tree LI.ext-afpa { list-style-image: url(images/code.png); } 41 | .php-file-tree LI.ext-asp { list-style-image: url(images/code.png); } 42 | .php-file-tree LI.ext-aspx { list-style-image: url(images/code.png); } 43 | .php-file-tree LI.ext-avi { list-style-image: url(images/film.png); } 44 | .php-file-tree LI.ext-bat { list-style-image: url(images/application.png); } 45 | .php-file-tree LI.ext-bmp { list-style-image: url(images/picture.png); } 46 | .php-file-tree LI.ext-c { list-style-image: url(images/code.png); } 47 | .php-file-tree LI.ext-cfm { list-style-image: url(images/code.png); } 48 | .php-file-tree LI.ext-cgi { list-style-image: url(images/code.png); } 49 | .php-file-tree LI.ext-com { list-style-image: url(images/application.png); } 50 | .php-file-tree LI.ext-cpp { list-style-image: url(images/code.png); } 51 | .php-file-tree LI.ext-css { list-style-image: url(images/css.png); } 52 | .php-file-tree LI.ext-doc { list-style-image: url(images/doc.png); } 53 | .php-file-tree LI.ext-exe { list-style-image: url(images/application.png); } 54 | .php-file-tree LI.ext-gif { list-style-image: url(images/picture.png); } 55 | .php-file-tree LI.ext-fla { list-style-image: url(images/flash.png); } 56 | .php-file-tree LI.ext-h { list-style-image: url(images/code.png); } 57 | .php-file-tree LI.ext-htm { list-style-image: url(images/html.png); } 58 | .php-file-tree LI.ext-html { list-style-image: url(images/html.png); } 59 | .php-file-tree LI.ext-jar { list-style-image: url(images/java.png); } 60 | .php-file-tree LI.ext-jpg { list-style-image: url(images/picture.png); } 61 | .php-file-tree LI.ext-jpeg { list-style-image: url(images/picture.png); } 62 | .php-file-tree LI.ext-js { list-style-image: url(images/script.png); } 63 | .php-file-tree LI.ext-lasso { list-style-image: url(images/code.png); } 64 | .php-file-tree LI.ext-log { list-style-image: url(images/txt.png); } 65 | .php-file-tree LI.ext-m4p { list-style-image: url(images/music.png); } 66 | .php-file-tree LI.ext-mov { list-style-image: url(images/film.png); } 67 | .php-file-tree LI.ext-mp3 { list-style-image: url(images/music.png); } 68 | .php-file-tree LI.ext-mp4 { list-style-image: url(images/film.png); } 69 | .php-file-tree LI.ext-mpg { list-style-image: url(images/film.png); } 70 | .php-file-tree LI.ext-mpeg { list-style-image: url(images/film.png); } 71 | .php-file-tree LI.ext-ogg { list-style-image: url(images/music.png); } 72 | .php-file-tree LI.ext-pcx { list-style-image: url(images/picture.png); } 73 | .php-file-tree LI.ext-pdf { list-style-image: url(images/pdf.png); } 74 | .php-file-tree LI.ext-php { list-style-image: url(images/php.png); } 75 | .php-file-tree LI.ext-png { list-style-image: url(images/picture.png); } 76 | .php-file-tree LI.ext-ppt { list-style-image: url(images/ppt.png); } 77 | .php-file-tree LI.ext-psd { list-style-image: url(images/psd.png); } 78 | .php-file-tree LI.ext-pl { list-style-image: url(images/script.png); } 79 | .php-file-tree LI.ext-py { list-style-image: url(images/script.png); } 80 | .php-file-tree LI.ext-rb { list-style-image: url(images/ruby.png); } 81 | .php-file-tree LI.ext-rbx { list-style-image: url(images/ruby.png); } 82 | .php-file-tree LI.ext-rhtml { list-style-image: url(images/ruby.png); } 83 | .php-file-tree LI.ext-rpm { list-style-image: url(images/linux.png); } 84 | .php-file-tree LI.ext-ruby { list-style-image: url(images/ruby.png); } 85 | .php-file-tree LI.ext-sql { list-style-image: url(images/db.png); } 86 | .php-file-tree LI.ext-swf { list-style-image: url(images/flash.png); } 87 | .php-file-tree LI.ext-tif { list-style-image: url(images/picture.png); } 88 | .php-file-tree LI.ext-tiff { list-style-image: url(images/picture.png); } 89 | .php-file-tree LI.ext-txt { list-style-image: url(images/txt.png); } 90 | .php-file-tree LI.ext-vb { list-style-image: url(images/code.png); } 91 | .php-file-tree LI.ext-wav { list-style-image: url(images/music.png); } 92 | .php-file-tree LI.ext-wmv { list-style-image: url(images/film.png); } 93 | .php-file-tree LI.ext-xls { list-style-image: url(images/xls.png); } 94 | .php-file-tree LI.ext-xml { list-style-image: url(images/code.png); } 95 | .php-file-tree LI.ext-zip { list-style-image: url(images/zip.png); } 96 | /* You can add millions of these... */ 97 | 98 | -------------------------------------------------------------------------------- /styles/default/images/application.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/application.png -------------------------------------------------------------------------------- /styles/default/images/code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/code.png -------------------------------------------------------------------------------- /styles/default/images/css.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/css.png -------------------------------------------------------------------------------- /styles/default/images/db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/db.png -------------------------------------------------------------------------------- /styles/default/images/directory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/directory.png -------------------------------------------------------------------------------- /styles/default/images/doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/doc.png -------------------------------------------------------------------------------- /styles/default/images/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/file.png -------------------------------------------------------------------------------- /styles/default/images/film.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/film.png -------------------------------------------------------------------------------- /styles/default/images/flash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/flash.png -------------------------------------------------------------------------------- /styles/default/images/html.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/html.png -------------------------------------------------------------------------------- /styles/default/images/index.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/index.php -------------------------------------------------------------------------------- /styles/default/images/java.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/java.png -------------------------------------------------------------------------------- /styles/default/images/linux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/linux.png -------------------------------------------------------------------------------- /styles/default/images/music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/music.png -------------------------------------------------------------------------------- /styles/default/images/pdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/pdf.png -------------------------------------------------------------------------------- /styles/default/images/php.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/php.png -------------------------------------------------------------------------------- /styles/default/images/picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/picture.png -------------------------------------------------------------------------------- /styles/default/images/ppt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/ppt.png -------------------------------------------------------------------------------- /styles/default/images/psd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/psd.png -------------------------------------------------------------------------------- /styles/default/images/ruby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/ruby.png -------------------------------------------------------------------------------- /styles/default/images/script.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/script.png -------------------------------------------------------------------------------- /styles/default/images/txt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/txt.png -------------------------------------------------------------------------------- /styles/default/images/xls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/xls.png -------------------------------------------------------------------------------- /styles/default/images/zip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/images/zip.png -------------------------------------------------------------------------------- /styles/default/index.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/default/index.php -------------------------------------------------------------------------------- /styles/index.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/interference-security/empyre-web/fa890e7d406b5c019c2291bb1a2f053711e726a9/styles/index.php -------------------------------------------------------------------------------- /styles/js/php_file_tree.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | == PHP FILE TREE JAVASCRIPT EXTENSION == 4 | 5 | Based on the Expandable Listmenu Script by Daniel Nolan 6 | http://www.bleedingego.co.uk/webdev.php 7 | 8 | Modified by Cory S.N. LaViska 9 | http://abeautifulsite.net/ 10 | 11 | == WHAT IT DOES == 12 | 13 | This script makes the nested lists created by PHP File Tree expand and 14 | collapse dynamically. 15 | 16 | == USAGE == 17 | 18 | Include the script into the section of the appropriate 19 | page(s) as shown below: 20 | 21 | 22 | 23 | All file trees generated by PHP File Tree will automatically collapse to 24 | the top level (as specified by $directory) and become dynamic. 25 | 26 | == FAQS == 27 | 28 | Q Can I have more than one file tree on one page? 29 | A Yes. You can have as many as you want and they will all function as expected. 30 | 31 | */ 32 | 33 | function init_php_file_tree() { 34 | if (!document.getElementsByTagName) return; 35 | 36 | var aMenus = document.getElementsByTagName("LI"); 37 | for (var i = 0; i < aMenus.length; i++) { 38 | var mclass = aMenus[i].className; 39 | if (mclass.indexOf("pft-directory") > -1) { 40 | var submenu = aMenus[i].childNodes; 41 | for (var j = 0; j < submenu.length; j++) { 42 | if (submenu[j].tagName == "A") { 43 | 44 | submenu[j].onclick = function() { 45 | var node = this.nextSibling; 46 | 47 | while (1) { 48 | if (node != null) { 49 | if (node.tagName == "UL") { 50 | var d = (node.style.display == "none") 51 | node.style.display = (d) ? "block" : "none"; 52 | this.className = (d) ? "open" : "closed"; 53 | return false; 54 | } 55 | node = node.nextSibling; 56 | } else { 57 | return false; 58 | } 59 | } 60 | return false; 61 | } 62 | 63 | submenu[j].className = (mclass.indexOf("open") > -1) ? "open" : "closed"; 64 | } 65 | 66 | if (submenu[j].tagName == "UL") 67 | submenu[j].style.display = (mclass.indexOf("open") > -1) ? "block" : "none"; 68 | } 69 | } 70 | } 71 | return false; 72 | } 73 | 74 | window.onload = init_php_file_tree; -------------------------------------------------------------------------------- /version.php: -------------------------------------------------------------------------------- 1 | Unexpected response"; 15 | } 16 | ?> 17 | 18 | 19 | 20 | EmPyre: Version 21 | 22 | 23 | 24 |
        25 | 26 |
        27 |
        28 |
        29 |
        EmPyre Version
        30 |
        31 |
        32 |
        33 |
        34 | 35 | 36 | 37 | --------------------------------------------------------------------------------