';
115 | if(!@include(dirname(__FILE__)."/../reseller/sidebar.php")) die("Error 6 -> Couldn't require sidebar.");
116 | echo '
';
117 | }
118 |
119 | public function headerAdmin(){
120 | echo '
121 |
122 |
TS Hosting Panel
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
';
140 | if(!@include(dirname(__FILE__)."/../admin/menu.php")) die("Error 5 -> Couldn't require menu.");
141 | echo '
';
142 | if(!@include(dirname(__FILE__)."/../admin/sidebar.php")) die("Error 6 -> Couldn't require sidebar.");
143 | echo '
';
144 | }
145 |
146 | public function footer(){
147 | echo '
';
148 | $this->copyright(false);
149 | echo '
';
150 | echo '
151 |
';
155 | }
156 |
157 | public function copyright($phone = true){
158 | $year = date('Y');
159 | $first = "© 2021 - " . $year ." Web Hosting Panel - Developed by ";
160 | $tamir = '
TamirSlo';
161 | if(!$phone){
162 | echo '
163 | '.$first.$tamir.'';
164 | }else{
165 | echo '';
167 | }
168 |
169 | }
170 |
171 | }
172 |
173 | ?>
--------------------------------------------------------------------------------
/api/models/email.php:
--------------------------------------------------------------------------------
1 | email = $email;
15 | }
16 |
17 | public function __toString()
18 | {
19 | return $this->email;
20 | }
21 |
22 | public function jsonSerialize(): mixed
23 | {
24 | return $this->email;
25 | }
26 | }
27 |
28 | ?>
--------------------------------------------------------------------------------
/api/models/name.php:
--------------------------------------------------------------------------------
1 | Name = $Name;
15 | }
16 |
17 | public function __toString()
18 | {
19 | return $this->Name;
20 | }
21 |
22 | public function jsonSerialize(): mixed
23 | {
24 | return $this->Name;
25 | }
26 | }
27 |
28 |
29 | ?>
--------------------------------------------------------------------------------
/api/models/resellerpackage.php:
--------------------------------------------------------------------------------
1 | ResellerPackageID = $ResellerPackageID;
19 | $this->Name = $Name;
20 | $this->MaxBandwidth = $MaxBandwidth;
21 | $this->MaxDiskUsage = $MaxDiskUsage;
22 | $this->MaxUsers = $MaxUsers;
23 | $this->MaxDomains = $MaxDomains;
24 | $this->MaxSubDomains = $MaxSubDomains;
25 | $this->MaxDatabases = $MaxDatabases;
26 | $this->MaxFTPAccounts = $MaxFTPAccounts;
27 | }
28 |
29 | public static function dbResellerPackageToObject(array $dbResellerPackage): self {
30 | return new ResellerPackage(
31 | $dbResellerPackage['ResellerPackageID'],
32 | new Name($dbResellerPackage['Name']),
33 | $dbResellerPackage['MaxBandwidth'],
34 | $dbResellerPackage['MaxDiskUsage'],
35 | $dbResellerPackage['MaxUsers'],
36 | $dbResellerPackage['MaxDomains'],
37 | $dbResellerPackage['MaxSubDomains'],
38 | $dbResellerPackage['MaxDatabases'],
39 | $dbResellerPackage['MaxFTPAccounts']
40 | );
41 | }
42 |
43 | public static function selectAll(): ResellerPackages{
44 | $db = \API\DB::getInstance();
45 | $dbResellerPackages = $db->getResellerPackages();
46 | if(!$dbResellerPackages['success'] || count($dbResellerPackages['results']) == 0) {
47 | throw new \Exception('Reseller packages not found');
48 | }
49 | return new ResellerPackages($dbResellerPackages['results']);
50 | }
51 |
52 | public static function selectByID(int $id): self{
53 | $db = \API\DB::getInstance();
54 | $dbResellerPackage = $db->getResellerPackageByID($id);
55 | if(!$dbResellerPackage['success'] || count($dbResellerPackage['results']) == 0) {
56 | throw new \Exception('Reseller package not found');
57 | }
58 | return self::dbResellerPackageToObject($dbResellerPackage['results'][0]);
59 | }
60 |
61 | public function create(): self {
62 | $db = \API\DB::getInstance();
63 | $dbResellerPackage = $db->addResellerPackage($this->Name, $this->MaxUsers, $this->MaxBandwidth, $this->MaxDiskUsage, $this->MaxDomains, $this->MaxSubDomains, $this->MaxDatabases, $this->MaxFTPAccounts);
64 | if(!$dbResellerPackage['success']) {
65 | throw new \Exception('Reseller package not created');
66 | }
67 | $this->ResellerPackageID = $db->lastInsertId();
68 | return $this;
69 | }
70 |
71 | }
72 |
73 | class ResellerPackages implements Countable, \Iterator {
74 | public array $ResellerPackages;
75 |
76 | public function __construct(array $ResellerPackages) {
77 | $this->ResellerPackages = array();
78 | $ResellerPackagesObjects = array();
79 | foreach($ResellerPackages as $ResellerPackage) {
80 | if($ResellerPackage instanceof ResellerPackage) {
81 | array_push($ResellerPackagesObjects, $ResellerPackage);
82 | continue;
83 | }else{
84 | $ResellerPackageObject = ResellerPackage::dbResellerPackageToObject($ResellerPackage);
85 | array_push($ResellerPackagesObjects, $ResellerPackageObject);
86 | }
87 | }
88 | $this->ResellerPackages = $ResellerPackagesObjects;
89 | }
90 |
91 | public function count(): int {
92 | return count($this->ResellerPackages);
93 | }
94 |
95 | public function current(): ResellerPackage {
96 | return current($this->ResellerPackages);
97 | }
98 |
99 | public function key(): int {
100 | return key($this->ResellerPackages);
101 | }
102 |
103 | public function next(): void {
104 | next($this->ResellerPackages);
105 | }
106 |
107 | public function rewind(): void {
108 | reset($this->ResellerPackages);
109 | }
110 |
111 | public function valid(): bool {
112 | return key($this->ResellerPackages) !== null;
113 | }
114 |
115 | }
116 |
117 | ?>
--------------------------------------------------------------------------------
/api/models/role.php:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/api/models/user.php:
--------------------------------------------------------------------------------
1 | UserID = $UserID;
27 | $this->Username = $Username;
28 | $this->Email = $Email;
29 | $this->FName = $FName;
30 | $this->LName = $LName;
31 | $this->Suspended = $Suspended;
32 | $this->Admin = $Admin;
33 | $this->Reseller = $Reseller;
34 | $this->ResellerID = $ResellerID;
35 | $this->ResellerPackageID = $ResellerPackageID;
36 | $this->UserCount = $UserCount;
37 |
38 | $this->UserType = new UserType($Admin, $Reseller);
39 | }
40 |
41 | public static function dbUserToObject(array $dbUser): self {
42 | $user = new self(
43 | $dbUser['UserID'],
44 | new Name($dbUser['Username']),
45 | new Email($dbUser['Email']),
46 | new Name($dbUser['FName']),
47 | new Name($dbUser['LName']),
48 | boolval($dbUser['Suspended']),
49 | boolval($dbUser['Admin']),
50 | boolval($dbUser['Reseller']),
51 | $dbUser['ResellerID'],
52 | $dbUser['ResellerPackageID'],
53 | $dbUser['UserCount']
54 | );
55 |
56 | if($user->ResellerID != null) {
57 | $user->ResellerUser = self::selectByID($dbUser['ResellerID']);
58 | }
59 |
60 | if($user->ResellerPackageID != null) {
61 | $user->ResellerPackage = ResellerPackage::selectByID($dbUser['ResellerPackageID']);
62 | }
63 |
64 | return $user;
65 | }
66 |
67 | public static function selectAll(): Users {
68 | $db = \API\DB::getInstance();
69 | $users = $db->getAllUsers();
70 | if(!$users['success'] || count($users['results']) == 0) {
71 | throw new \Exception('Users not found');
72 | }
73 | return new Users($users['results']);
74 | }
75 |
76 | public static function selectByID(int $id): self {
77 | $db = \API\DB::getInstance();
78 | $user = $db->getUserByID($id);
79 | if(!$user['success'] || count($user['results']) == 0) throw new \Exception("User not found");
80 |
81 | return self::dbUserToObject($user['results'][0]);
82 | }
83 |
84 | public static function selectByEmail(Email $email): self {
85 | $db = \API\DB::getInstance();
86 | $user = $db->getEmailDetails($email);
87 | if(!$user['success'] || count($user['results']) == 0) throw new \Exception("User not found");
88 |
89 | return self::dbUserToObject($user['results'][0]);
90 | }
91 |
92 | public static function selectByUsername(Name $username): self {
93 | $db = \API\DB::getInstance();
94 | $user = $db->getUserDetails($username);
95 | if(!$user['success'] || count($user['results']) == 0) throw new \Exception("User not found");
96 |
97 | return self::dbUserToObject($user['results'][0]);
98 | }
99 |
100 | public function create(string $pass): self {
101 | $db = \API\DB::getInstance();
102 |
103 | $salt = \API\Auth\Session::generateSalt();
104 | $hash = \API\Auth\Session::hashPass($pass, $salt);
105 |
106 | $user = $db->addUser((string) $this->Username, $hash, $salt, (string) $this->Email, (string) $this->FName, (string) $this->LName, (int) $this->Admin, (int) $this->Reseller, (int) $this->ResellerID, (int) $this->ResellerPackageID);
107 | if(!$user['success']) throw new \Exception("User not created");
108 |
109 | $this->UserID = $db->lastInsertId();
110 | return $this;
111 | }
112 |
113 | public function edit(Name $user, string $pass, Email $email, Name $fname, Name $lname, UserType $userType, ?int $resellerPackageID): self {
114 | $db = \API\DB::getInstance();
115 |
116 | if($resellerPackageID == null) {
117 | $resellerPackageID = $this->ResellerPackageID;
118 | }else{
119 | $resellerPackage = ResellerPackage::selectByID($resellerPackageID);
120 | $resellerPackageID = $resellerPackage->ResellerPackageID;
121 | }
122 |
123 | $emailExists = false;
124 | try{
125 | $emailUser = User::selectByEmail($email);
126 | if($emailUser->UserID !== $this->UserID) $emailExists = true;
127 | }catch(\Exception $e){
128 | // Do nothing
129 | }finally{
130 | if($emailExists){
131 | throw new \Exception('Email already exists');
132 | }
133 | }
134 |
135 | $usernameExists = false;
136 |
137 | try{
138 | $usernameUser = User::selectByUsername($user);
139 | if($usernameUser->UserID !== $this->UserID) $usernameExists = true;
140 | }catch(\Exception $e){
141 | // Do nothing
142 | }finally{
143 | if($usernameExists){
144 | throw new \Exception('Username already exists');
145 | }
146 | }
147 |
148 | try{
149 | if($userType->isReseller()){
150 | if($this->ResellerPackageID) ResellerPackage::selectByID($user->ResellerPackageID);
151 | else throw new \Exception('Reseller package not selected');
152 | }elseif($userType->isUser()){
153 | // TODO: Check for UserPackageID
154 | if($this->ResellerID) User::selectByID($user->ResellerID);
155 | else throw new \Exception('Reseller not selected');
156 | }
157 | }catch(\Exception $e){
158 | throw $e;
159 | }
160 |
161 | $userQuery = $db->editUser($this->UserID, (string) $user, (string) $email, (string) $fname, (string) $lname, (int) $userType->isAdmin(), (int) $userType->isReseller(), $resellerPackageID);
162 | if(!empty($pass)){
163 | $salt = \API\Auth\Session::generateSalt();
164 | $pass = \API\Auth\Session::hashPass($pass, $salt);
165 | $db->editUserPassword($this->UserID, $pass, $salt);
166 |
167 | }
168 | if(!$userQuery['success']) throw new \Exception("User not edited");
169 |
170 | return $this;
171 | }
172 |
173 | public function delete(): bool {
174 | $db = \API\DB::getInstance();
175 | $db->deleteUserByID($this->UserID);
176 | return true;
177 | }
178 |
179 | public static function isAdmin(User $user): bool {
180 | return $user->Admin;
181 | }
182 |
183 | public static function isReseller(User $user): bool {
184 | return $user->Reseller;
185 | }
186 |
187 | public static function isUser(User $user): bool {
188 | return !$user->Admin && !$user->Reseller;
189 | }
190 |
191 | public function fullName(): string {
192 | return $this->FName . ' ' . $this->LName;
193 | }
194 | }
195 |
196 | class Users implements Countable, \Iterator {
197 | public array $users;
198 |
199 | public function __construct(array $users) {
200 | $this->users = array();
201 | $userObjects = array();
202 | foreach($users as $user) {
203 | if($user instanceof User) {
204 | array_push($userObjects, $user);
205 | continue;
206 | }else{
207 | $userObject = User::dbUserToObject($user);
208 | array_push($userObjects, $userObject);
209 | }
210 | }
211 | $this->users = $userObjects;
212 | }
213 |
214 | public function count(): int {
215 | return count($this->users);
216 | }
217 |
218 | public function current(): User {
219 | return current($this->users);
220 | }
221 |
222 | public function key(): int {
223 | return key($this->users);
224 | }
225 |
226 | public function next(): void {
227 | next($this->users);
228 | }
229 |
230 | public function rewind(): void {
231 | reset($this->users);
232 | }
233 |
234 | public function valid(): bool {
235 | return key($this->users) !== null;
236 | }
237 |
238 | public function filter(string $filter): Users {
239 | $filteredUsers = array_filter($this->users, "API\Models\User::$filter");
240 | return new Users($filteredUsers);
241 | }
242 |
243 | public function filterByType(UserType $type): Users{
244 | $filteredUsers = array_filter($this->users, function(User $user) use ($type){
245 | return $user->UserType == $type;
246 | });
247 | return new Users($filteredUsers);
248 | }
249 |
250 | }
251 |
252 | ?>
--------------------------------------------------------------------------------
/api/models/usertype.php:
--------------------------------------------------------------------------------
1 | type = Role::Admin;
12 | } else if($reseller){
13 | $this->type = Role::Reseller;
14 | } else {
15 | $this->type = Role::User;
16 | }
17 | }
18 |
19 | public function __toString(): string{
20 | return match($this->type){
21 | Role::Admin => 'Admin',
22 | Role::Reseller => 'Reseller',
23 | Role::User => 'User',
24 | };
25 | }
26 |
27 | public function jsonSerialize(): mixed
28 | {
29 | return $this->__toString();
30 | }
31 |
32 | public static function Admin(): UserType{
33 | return new UserType(true, false);
34 | }
35 |
36 | public static function Reseller(): UserType{
37 | return new UserType(false, true);
38 | }
39 |
40 | public static function User(): UserType{
41 | return new UserType(false, false);
42 | }
43 |
44 | public function getRole(): Role{
45 | return $this->type;
46 | }
47 |
48 | public function isAdmin(): bool{
49 | return $this->type == Role::Admin;
50 | }
51 |
52 | public function isReseller(): bool{
53 | return $this->type == Role::Reseller;
54 | }
55 |
56 | public function isUser(): bool{
57 | return $this->type == Role::User;
58 | }
59 |
60 | public function isNotUser(): bool{
61 | return $this->type == Role::Admin || $this->type == Role::Reseller;
62 | }
63 | }
--------------------------------------------------------------------------------
/assets/css/panel.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: "Encode Sans";
3 | src: url("/assets/fonts/encode-sans.condensed.ttf");
4 | }
5 |
6 | html,
7 | body {
8 | height: 100%;
9 | }
10 |
11 | body {
12 | display: flex;
13 | background-color: #f5f5f5;
14 | align-items: unset;
15 | }
16 |
17 | #main {
18 | display: block;
19 | width: 100%;
20 | padding: 0;
21 | }
22 |
23 | #main>* {
24 | opacity: 1;
25 | transition: 1s;
26 | }
27 |
28 | #main.fadeout * {
29 | opacity: 0;
30 | }
31 |
32 | #toasts {
33 | position: fixed;
34 | bottom: 1vh;
35 | right: 1vw;
36 | min-width: 20vw;
37 | z-index: 1060;
38 | }
39 |
40 | #body-row {
41 | margin-left: 0;
42 | margin-right: 0;
43 | }
44 |
45 | #sidebar-container {
46 | min-height: 100vh;
47 | background-color: #333;
48 | padding: 0;
49 | }
50 |
51 | .navbar-toggler {
52 | border-color: rgba(255, 255, 255, 0) !important;
53 | outline: unset !important;
54 | }
55 |
56 | .navbar-toggler i {
57 | color: white;
58 | transition: 0.2s !important;
59 | }
60 |
61 | .navbar-toggler i:hover {
62 | background-color: #045F8C;
63 | border-radius: 65px;
64 | padding: 12px;
65 | margin: -12px;
66 | outline: unset !important;
67 | }
68 |
69 |
70 | /* Sidebar sizes when expanded and expanded */
71 |
72 | .sidebar-expanded {
73 | width: 230px;
74 | }
75 |
76 | .sidebar-collapsed {
77 | width: 60px;
78 | }
79 |
80 |
81 | /* Menu item*/
82 |
83 | #sidebar-container .list-group a {
84 | height: 50px;
85 | color: white;
86 | }
87 |
88 |
89 | /* Submenu item*/
90 |
91 | #sidebar-container .list-group .sidebar-submenu a {
92 | height: 45px;
93 | padding-left: 30px;
94 | }
95 |
96 | .sidebar-submenu {
97 | font-size: 0.9rem;
98 | }
99 |
100 |
101 | /* Separators */
102 |
103 | .sidebar-separator-title {
104 | background-color: #333;
105 | height: 35px;
106 | }
107 |
108 | .sidebar-separator {
109 | background-color: #333;
110 | height: 25px;
111 | }
112 |
113 | .logo-separator {
114 | background-color: #333;
115 | }
116 |
117 |
118 | /* Closed submenu icon */
119 |
120 |
121 | /*a[href='#account'] .submenu-icon::after {
122 | content: " \f0da";
123 | font-family: FontAwesome;
124 | display: inline;
125 | text-align: right;
126 | padding-left: 10px;
127 | }*/
128 |
129 | .menu-collapsed {
130 | transition: unset !important;
131 | }
132 |
133 |
134 | /* Opened submenu icon */
135 |
136 | #sidebar-container .list-group .list-group-item[aria-expanded="true"] .submenu-icon::after {
137 | content: " \f0da";
138 | font-family: FontAwesome;
139 | display: inline;
140 | text-align: right;
141 | padding-left: 10px;
142 | }
143 |
144 | .clickable {
145 | cursor: pointer;
146 | }
147 |
148 | .iconRotate {
149 | -moz-transform: rotate(0deg);
150 | -webkit-transform: rotate(0deg);
151 | -o-transform: rotate(0deg);
152 | -ms-transform: rotate(0deg);
153 | transform: rotate(0deg);
154 | }
155 |
156 | .iconRotated {
157 | -moz-transform: rotate(90deg);
158 | -webkit-transform: rotate(90deg);
159 | -o-transform: rotate(90deg);
160 | -ms-transform: rotate(90deg);
161 | transform: rotate(90deg);
162 | }
163 |
164 | .sidebarc {
165 | transition: 1s !important;
166 | position: fixed;
167 | top: 56px;
168 | bottom: 0;
169 | overflow-y: overlay !important;
170 | overflow-y: auto;
171 | padding-bottom: 56px !important;
172 | }
173 |
174 | .mcontent {
175 | margin-left: 230px;
176 | transition: 1s !important;
177 | }
178 |
179 | .card-header {
180 | font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;
181 | font-size: 17px;
182 | }
183 |
184 | .card-text {
185 | /*font-family: 'Lato', sans-serif !important;*/
186 | font-family: "Encode Sans" !important;
187 | /*font-weight: 600;*/
188 | }
189 |
190 | .card.disabled {
191 | background: #d2d2d2;
192 | color: #6c757d!important;
193 | }
194 |
195 | .tooltipRed + .tooltip > .tooltip-inner {
196 | color: #f55;
197 | }
198 |
199 | /* .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-retroorange,
200 | .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-retroorange {
201 | color: #fff;
202 | background: #ff9933;
203 | } */
204 |
205 | /* CUSTOM SWITCH ORANGE */
206 |
207 | .custom-control-input:checked~.custom-control-label.orange::before {
208 | border-color: #ffbc00;
209 | background-color: #ffbc00;
210 | }
211 |
212 | .custom-control-input:focus~.custom-control-label.orange::before {
213 | box-shadow: 0 0 0 0.2rem rgba(255,188,0,.25);
214 | }
215 |
216 | .custom-control-input:focus:not(:checked)~.custom-control-label.orange::before {
217 | border-color: #ffbc00;
218 | }
219 |
220 | /* CUSTOM SWITCH RED */
221 |
222 | .custom-control-input:checked~.custom-control-label.red::before {
223 | border-color: #ff4040;
224 | background-color: #ff4040;
225 | }
226 |
227 | .custom-control-input:focus~.custom-control-label.red::before {
228 | box-shadow: 0 0 0 0.2rem rgba(255,64,64,.25);
229 | }
230 |
231 | .custom-control-input:focus:not(:checked)~.custom-control-label.red::before {
232 | border-color: #ff4040;
233 | }
234 |
235 | .custom-control-label.center::before, .custom-control-label.center::after{
236 | margin-top: 5px !important;
237 | }
--------------------------------------------------------------------------------
/assets/css/signin.css:
--------------------------------------------------------------------------------
1 | html,
2 | body {
3 | height: 100%;
4 | width: 100%;
5 | }
6 |
7 | body {
8 | display: -ms-flexbox;
9 | display: flex;
10 | -ms-flex-align: center;
11 | align-items: center;
12 | background-color: #f5f5f5;
13 | }
14 |
15 | #main {
16 | display: contents;
17 | padding-top: 40px;
18 | padding-bottom: 40px;
19 | width: 100%;
20 | }
21 |
22 | #main * {
23 | opacity: 1;
24 | transition: 1s opacity;
25 | }
26 |
27 | #main.fadeout * {
28 | opacity: 0;
29 | /*transition: none;*/
30 | }
31 |
32 | .form-signin {
33 | width: 100%;
34 | max-width: 330px;
35 | padding: 15px;
36 | margin: auto;
37 | }
38 |
39 | .form-signin h1 {
40 | text-shadow: 0px 0px 10px #7a88f580;
41 | }
42 |
43 | .form-signin .checkbox {
44 | font-weight: 400;
45 | }
46 |
47 | .form-signin .form-control {
48 | position: relative;
49 | box-sizing: border-box;
50 | height: auto;
51 | padding: 10px;
52 | font-size: 16px;
53 | }
54 |
55 | .form-signin .form-control:focus {
56 | z-index: 2;
57 | }
58 |
59 | .form-signin input[type="text"] {
60 | margin-bottom: -1px;
61 | border-bottom-right-radius: 0;
62 | border-bottom-left-radius: 0;
63 | }
64 |
65 | .form-signin input[type="password"] {
66 | margin-bottom: 10px;
67 | border-top-left-radius: 0;
68 | border-top-right-radius: 0;
69 | }
70 |
71 | #toasts {
72 | position: absolute;
73 | bottom: 1vh;
74 | right: 1vw;
75 | min-width: 20vw;
76 | z-index: 10;
77 | }
--------------------------------------------------------------------------------
/assets/fonts/adlanta.light.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TamirSlo/TSHostingPanel/957173fb62cd470cda4a9931878f3ba3da594b49/assets/fonts/adlanta.light.otf
--------------------------------------------------------------------------------
/assets/fonts/encode-sans.condensed.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TamirSlo/TSHostingPanel/957173fb62cd470cda4a9931878f3ba3da594b49/assets/fonts/encode-sans.condensed.ttf
--------------------------------------------------------------------------------
/assets/images/Banner.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TamirSlo/TSHostingPanel/957173fb62cd470cda4a9931878f3ba3da594b49/assets/images/Banner.gif
--------------------------------------------------------------------------------
/assets/images/icon-lg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TamirSlo/TSHostingPanel/957173fb62cd470cda4a9931878f3ba3da594b49/assets/images/icon-lg.gif
--------------------------------------------------------------------------------
/assets/images/icon-md.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TamirSlo/TSHostingPanel/957173fb62cd470cda4a9931878f3ba3da594b49/assets/images/icon-md.gif
--------------------------------------------------------------------------------
/assets/images/icon-sm.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TamirSlo/TSHostingPanel/957173fb62cd470cda4a9931878f3ba3da594b49/assets/images/icon-sm.gif
--------------------------------------------------------------------------------
/assets/images/icon-xs.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TamirSlo/TSHostingPanel/957173fb62cd470cda4a9931878f3ba3da594b49/assets/images/icon-xs.gif
--------------------------------------------------------------------------------
/assets/js/popper.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright (C) Federico Zivolo 2019
3 | Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT).
4 | */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=e.ownerDocument.defaultView,n=o.getComputedStyle(e,null);return t?n[t]:n}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function r(e){return 11===e?pe:10===e?se:pe||se}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent||null;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TH','TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1
=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),le({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=fe({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},le(n,m,$(v)),le(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ge.FLIP:p=[n,i];break;case ge.CLOCKWISE:p=G(n);break;case ge.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u);(m||b||y)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),y&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=fe({},e.offsets.popper,D(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=C(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!me),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=H('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=fe({},E,e.attributes),e.styles=fe({},m,e.styles),e.arrowStyles=fe({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return j(e.instance.popper,e.styles),V(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&j(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),j(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ue});
5 | //# sourceMappingURL=popper.min.js.map
6 |
--------------------------------------------------------------------------------
/assets/js/toasts.js:
--------------------------------------------------------------------------------
1 | var eToastNum = 0
2 | var sToastNum = 0
3 | var cToastNum = 0
4 |
5 | function generateErrorToast() {
6 | eToastNum = eToastNum + 1;
7 | $("#toasts").append('');
18 | return eToastNum;
19 | }
20 |
21 | function generateSuccessToast() {
22 | sToastNum = sToastNum + 1;
23 | $("#toasts").append('');
35 | return sToastNum;
36 | }
37 |
38 | function generateConfirmToast(onConfirm) {
39 | cToastNum = cToastNum + 1;
40 | $("#toasts").append('');
52 | return cToastNum;
53 | }
--------------------------------------------------------------------------------
/index.php:
--------------------------------------------------------------------------------
1 | Couldn't require Main Class.");
5 |
6 |
7 | $tshp = TSHP::getInstance();
8 | ?>
9 |
10 |
11 |
12 |
13 | Web Hosting Panel
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
39 |
40 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/reseller/account/messages/index.php:
--------------------------------------------------------------------------------
1 | Couldn't require Main Class.");
5 |
6 | $tshp = TSHP::getInstance();
7 |
8 | $ui = new UI();
9 |
10 | $ui->headerReseller();
11 | ?>
12 |
13 | Messages
14 |
15 | footer();
17 | ?>
18 |
19 |
--------------------------------------------------------------------------------
/reseller/account/password/index.php:
--------------------------------------------------------------------------------
1 | Couldn't require Main Class.");
5 |
6 | $tshp = TSHP::getInstance();
7 |
8 | $ui = new UI();
9 |
10 | $ui->headerReseller();
11 | ?>
12 |
13 |