diff --git a/www/config.php b/www/config.php
new file mode 100644
index 00000000..9e22d0cc
--- /dev/null
+++ b/www/config.php
@@ -0,0 +1,13 @@
+
diff --git a/www/control_panel.php b/www/control_panel.php
new file mode 100644
index 00000000..d37ebc84
--- /dev/null
+++ b/www/control_panel.php
@@ -0,0 +1,50 @@
+
+
+
+
+
+
Characters
+
+
+
+
+
diff --git a/www/control_panel_common.php b/www/control_panel_common.php
new file mode 100644
index 00000000..23f08b69
--- /dev/null
+++ b/www/control_panel_common.php
@@ -0,0 +1,20 @@
+
diff --git a/www/control_panel_edit_character.php b/www/control_panel_edit_character.php
new file mode 100644
index 00000000..2af1ddbf
--- /dev/null
+++ b/www/control_panel_edit_character.php
@@ -0,0 +1,551 @@
+ "Hyur Midlander Male",
+ 2 => "Hyur Midlander Female",
+ 3 => "Hyur Highlander Male",
+ 4 => "Elezen Wildwood Male",
+ 5 => "Elezen Wildwood Female",
+ 6 => "Elezen Duskwight Male",
+ 7 => "Elezen Duskwight Female",
+ 8 => "Lalafell Plainsfolk Male",
+ 9 => "Lalafell Plainsfolk Female",
+ 10 => "Lalafell Dunesfolk Male",
+ 11 => "Lalafell Dunesfolk Female",
+ 12 => "Miqo'te Seeker of the Sun Female",
+ 13 => "Miqo'te Keeper of the Moon Female",
+ 14 => "Roegadyn Sea Wolf Male",
+ 15 => "Roegadyn Hellsguard Male"
+);
+
+$g_guardians = array(
+ 1 => "Halone, the Fury",
+ 2 => "Menphina, the Lover",
+ 3 => "Thaliak, the Scholar",
+ 4 => "Nymeia, the Spinner",
+ 5 => "Llymlaen, the Navigator",
+ 6 => "Oschon, the Wanderer",
+ 7 => "Byregot, the Builder",
+ 8 => "Rhalgr, the Destroyer",
+ 9 => "Azeyma, the Warden",
+ 10 => "Nald'thal, the Traders",
+ 11 => "Nophica, the Matron",
+ 12 => "Althyk, the Keeper"
+);
+
+$g_allegiances = array(
+ 1 => "Limsa Lominsa",
+ 2 => "Gridania",
+ 3 => "Ul'dah",
+);
+
+$g_htmlToDbFieldMapping = array(
+ "characterName" => "name",
+ "characterTribe" => "tribe",
+ "characterSize" => "size",
+ "characterVoice" => "voice",
+ "characterSkinColor" => "skinColor",
+ "characterHairStyle" => "hairStyle",
+ "characterHairColor" => "hairColor",
+ "characterHairOption" => "hairOption",
+ "characterEyeColor" => "eyeColor",
+ "characterFaceType" => "faceType",
+ "characterFaceBrow" => "faceBrow",
+ "characterFaceEye" => "faceEye",
+ "characterFaceIris" => "faceIris",
+ "characterFaceNose" => "faceNose",
+ "characterFaceMouth" => "faceMouth",
+ "characterFaceJaw" => "faceJaw",
+ "characterFaceCheek" => "faceCheek",
+ "characterFaceOption1" => "faceOption1",
+ "characterFaceOption2" => "faceOption2",
+ "characterGuardian" => "guardian",
+ "characterBirthMonth" => "birthMonth",
+ "characterBirthDay" => "birthDay",
+ "characterAllegiance" => "allegiance",
+ "characterWeapon1" => "weapon1",
+ "characterWeapon2" => "weapon2",
+ "characterHeadGear" => "headGear",
+ "characterBodyGear" => "bodyGear",
+ "characterLegsGear" => "legsGear",
+ "characterHandsGear" => "handsGear",
+ "characterFeetGear" => "feetGear",
+ "characterWaistGear" => "waistGear",
+ "characterRightEarGear" => "rightEarGear",
+ "characterLeftEarGear" => "leftEarGear",
+ "characterRightFingerGear" => "rightFingerGear",
+ "characterLeftFingerGear" => "leftFingerGear"
+);
+
+function SaveCharacter($databaseConnection, $htmlFieldMapping, $characterId)
+{
+ $characterInfo = array();
+ foreach($htmlFieldMapping as $htmlFieldName => $dbFieldName)
+ {
+ $characterInfo[$dbFieldName] = $_POST[$htmlFieldName];
+ }
+ UpdateCharacterInfo($databaseConnection, $characterId, $characterInfo);
+}
+
+function GenerateTextField($characterInfo, $htmlFieldMapping, $htmlFieldName, $fieldMaxLength = null)
+{
+ $inputMaxLength = ($fieldMaxLength === null) ? "" : sprintf("maxlength=\"%d\"", $fieldMaxLength);
+ return sprintf("
",
+ $htmlFieldName, $htmlFieldName, $characterInfo[$htmlFieldMapping[$htmlFieldName]], $inputMaxLength);
+}
+
+function GenerateSelectField($characterInfo, $htmlFieldMapping, $htmlFieldOptions, $htmlFieldName)
+{
+ $dbFieldName = $htmlFieldMapping[$htmlFieldName];
+ $htmlText = sprintf("
\n",
+ $htmlFieldName, $htmlFieldName);
+ foreach($htmlFieldOptions as $optionId => $optionName)
+ {
+ $htmlText .= sprintf("%s \n",
+ $optionId,
+ ($optionId === (int)$characterInfo[$dbFieldName]) ? "selected" : "",
+ $optionName);
+ }
+ $htmlText .= " \n";
+ return $htmlText;
+}
+
+if(isset($_POST["cancel"]))
+{
+ header("Location: control_panel.php");
+ exit;
+}
+
+if(isset($_POST["save"]))
+{
+ SaveCharacter($g_databaseConnection, $g_htmlToDbFieldMapping, $g_characterId);
+ header("Location: control_panel.php");
+ exit;
+}
+
+try
+{
+ $g_characterInfo = GetCharacterInfo($g_databaseConnection, $g_userId, $g_characterId);
+}
+catch(Exception $e)
+{
+ header("Location: control_panel.php");
+ exit;
+}
+
+?>
+
+
+
+
+
Seventh Umbral Server
+
+
+
+
+
+
+
+
+
Edit Character (Help )
+
+
General Notes
+
+ All values here are editable, so change them at your own risk. Just keep in mind that
+ you can always import an appearance from a character creation data file and equip presetted
+ equipment to reset your character.
+
+
Import Appearance
+
+ Use this to import a character creation data file. Those files
+ are created by the client when saving character creation data in the character creation
+ mode, just before selecting the server on which the character will be created. They are usually
+ located in the "C:\Users\{Username}\Documents\My Games\FINAL FANTASY XIV\user\00000000" folder
+ and have a '.CMB' extension.
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/www/control_panel_header.php b/www/control_panel_header.php
new file mode 100644
index 00000000..08403fa4
--- /dev/null
+++ b/www/control_panel_header.php
@@ -0,0 +1,8 @@
+
+
+ Welcome, . (Logout)
+
diff --git a/www/control_panel_login.php b/www/control_panel_login.php
new file mode 100644
index 00000000..e5b1596a
--- /dev/null
+++ b/www/control_panel_login.php
@@ -0,0 +1,81 @@
+getMessage();
+ }
+}
+
+?>
+
+
+
+
+
Seventh Umbral Server
+
+
+
+
+
+
+
+
+
diff --git a/www/control_panel_logout.php b/www/control_panel_logout.php
new file mode 100644
index 00000000..a1618362
--- /dev/null
+++ b/www/control_panel_logout.php
@@ -0,0 +1,6 @@
+
diff --git a/www/create_user.php b/www/create_user.php
new file mode 100644
index 00000000..fef6e8a0
--- /dev/null
+++ b/www/create_user.php
@@ -0,0 +1,109 @@
+getMessage();
+ }
+}
+
+?>
+
+
+
+
Seventh Umbral Server
+
+
+
+
+
+
+
Create New User
+
+
+
+
+
+
diff --git a/www/create_user_success.php b/www/create_user_success.php
new file mode 100644
index 00000000..b5f1232f
--- /dev/null
+++ b/www/create_user_success.php
@@ -0,0 +1,25 @@
+
+
+
+
+
Seventh Umbral Server
+
+
+
+
+
+
+
+ User created successfully.
+
+
+ You may now use the Seventh Umbral Launcher to login and connect to this server.
+
+
+ Login to the User Control Panel
+
+
+
+
diff --git a/www/css/global.css b/www/css/global.css
new file mode 100644
index 00000000..0af8d574
--- /dev/null
+++ b/www/css/global.css
@@ -0,0 +1,158 @@
+body
+{
+ font-family: Verdana;
+ font-size: 10pt;
+ line-height: 14pt;
+ height: 100%;
+}
+
+
+div.contentContainer {
+ width: 50%;
+ float: left;
+}
+
+
+div.info
+{
+ width: 320px;
+ height: 100%;
+ margin-left: auto;
+ margin-right: auto;
+ text-align: center;
+ padding: 20px;
+ background-color: lightgrey;
+}
+
+div.infoFooter
+{
+ width: 400px;
+ margin-left: auto;
+ margin-right: auto;
+ text-align: right;
+ padding: 5px;
+}
+
+div.edit
+{
+ width: 50%;
+ min-width: 600px;
+ margin-top: 20px;
+ margin-left: auto;
+ margin-right: auto;
+ text-align: center;
+ padding: 20px;
+ background-color: lightgrey;
+}
+
+div.inner
+{
+ position: relative;
+ max-width: 1250px;
+ margin: 0px auto;
+}
+
+h1
+{
+ line-height: 23px;
+ font-size: 23px;
+ padding: 5px 0px;
+}
+
+h2
+{
+ line-height: 17px;
+ font-size: 14px;
+ font-weight: bold;
+ padding: 5px;
+}
+
+h3
+{
+ line-height: 14px;
+ font-size: 12px;
+ font-weight: bold;
+ padding: 5px;
+}
+
+header.top
+{
+ padding: 20px 0px;
+ background: none repeat scroll 0% 0% lavender;
+ position: relative;
+ z-index: 999;
+}
+
+table.center
+{
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table.infoForm
+{
+ width: 100%;
+}
+
+table.editForm
+{
+ width: 100%;
+}
+
+table.editForm input
+{
+ width: 100%;
+}
+
+table.editForm select
+{
+ width: 100%;
+}
+
+td
+{
+ padding: 3px;
+}
+
+th
+{
+ padding: 3px;
+ text-decoration: underline;
+}
+
+p
+{
+ padding: 2px;
+}
+
+p.errorMessage
+{
+ color: darkred;
+ font-weight: bold;
+}
+
+p.pageTitle
+{
+ font-weight: bold;
+ font-size: 28px;
+ line-height: 20px;
+ padding: 0px 0px;
+}
+
+p.pageTitle a
+{
+ text-decoration: none;
+ color: black;
+}
+
+p.pageSubTitle
+{
+ font-size: 10px;
+ line-height: 18px;
+ padding: 0px 0px;
+}
+
+#recaptcha_area
+{
+ margin: 0 auto;
+}
diff --git a/www/css/reset.css b/www/css/reset.css
new file mode 100644
index 00000000..e29c0f5f
--- /dev/null
+++ b/www/css/reset.css
@@ -0,0 +1,48 @@
+/* http://meyerweb.com/eric/tools/css/reset/
+ v2.0 | 20110126
+ License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed,
+figure, figcaption, footer, header, hgroup,
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+ display: block;
+}
+body {
+ line-height: 1;
+}
+ol, ul {
+ list-style: none;
+}
+blockquote, q {
+ quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+ content: '';
+ content: none;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
diff --git a/www/database.php b/www/database.php
new file mode 100644
index 00000000..79aabc0b
--- /dev/null
+++ b/www/database.php
@@ -0,0 +1,388 @@
+select_db($database);
+ $dataConnection->query("SET NAMES 'utf8'");
+
+ return $dataConnection;
+}
+
+$g_databaseConnection = CreateDatabaseConnection($db_server, $db_username, $db_password, $db_database);
+
+function GenerateRandomSha224()
+{
+ mt_srand(microtime(true) * 100000 + memory_get_usage(true));
+ return hash("sha224", uniqid(mt_rand(), true));
+}
+
+function VerifyUser($dataConnection, $username, $password)
+{
+ $statement = $dataConnection->prepare("SELECT id, passhash, salt FROM users WHERE name = ?");
+ if(!$statement)
+ {
+ throw new Exception(__FUNCTION__ . " failed: " . $dataConnection->error);
+ }
+
+ try
+ {
+ $statement->bind_param('s', $username);
+ if(!$statement->execute())
+ {
+ throw new Exception(__FUNCTION__ . " failed.");
+ }
+
+ $statement->bind_result($id, $storedPasshash, $salt);
+ if(!$statement->fetch())
+ {
+ throw new Exception(__FUNCTION__ . " failed.");
+ }
+
+ $saltedPassword = $password . $salt;
+ $hashedPassword = hash("sha224", $saltedPassword);
+
+ if($hashedPassword !== $storedPasshash)
+ {
+ throw new Exception(__FUNCTION__ . " failed.");
+ }
+
+ return $id;
+ }
+ finally
+ {
+ $statement->close();
+ }
+}
+
+function InsertUser($dataConnection, $username, $passhash, $salt, $email)
+{
+ {
+ $statement = $dataConnection->prepare("INSERT INTO users (name, passhash, salt, email) VALUES (?, ?, ?, ?)");
+ if(!$statement)
+ {
+ throw new Exception(__FUNCTION__ . " failed: " . $dataConnection->error);
+ }
+
+ try
+ {
+ $statement->bind_param('ssss', $username, $passhash, $salt, $email);
+
+ if(!$statement->execute())
+ {
+ throw new Exception(__FUNCTION__ . " failed.");
+ }
+ }
+ finally
+ {
+ $statement->close();
+ }
+ }
+}
+
+function RefreshOrCreateSession($dataConnection, $userId)
+{
+ try
+ {
+ $sessionId = GetSessionFromUserId($dataConnection, $userId);
+ RefreshSession($dataConnection, $sessionId);
+ }
+ catch(Exception $e)
+ {
+ $sessionId = CreateSession($dataConnection, $userId);
+ }
+
+ return $sessionId;
+}
+
+function CreateSession($dataConnection, $userId)
+{
+ //Delete any session that might be active
+ {
+ $statement = $dataConnection->prepare("DELETE FROM sessions WHERE userId = ?");
+ if(!$statement)
+ {
+ throw new Exception("Failed to create session: " . $dataConnection->error);
+ }
+
+ try
+ {
+ $statement->bind_param('i', $userId);
+
+ if(!$statement->execute())
+ {
+ throw new Exception("Failed to create session: " . $dataConnection->error);
+ }
+ }
+ finally
+ {
+ $statement->close();
+ }
+ }
+
+ //Create new session
+ {
+ $sessionId = GenerateRandomSha224();
+
+ $statement = $dataConnection->prepare("INSERT INTO sessions (id, userid, expiration) VALUES (?, ?, NOW() + INTERVAL " . FFXIV_SESSION_LENGTH . " HOUR)");
+ if(!$statement)
+ {
+ throw new Exception("Failed to create session: " . $dataConnection->error);
+ }
+
+ try
+ {
+ $statement->bind_param('si', $sessionId, $userId);
+
+ if(!$statement->execute())
+ {
+ throw new Exception("Failed to create session: " . $dataConnection->error);
+ }
+ }
+ finally
+ {
+ $statement->close();
+ }
+
+ return $sessionId;
+ }
+}
+
+function GetSessionFromUserId($dataConnection, $userId)
+{
+ $statement = $dataConnection->prepare("SELECT id FROM sessions WHERE userId = ? AND expiration > NOW()");
+ if(!$statement)
+ {
+ throw new Exception("Failed to get session id: " . $dataConnection->error);
+ }
+
+ try
+ {
+ $statement->bind_param('i', $userId);
+
+ if(!$statement->execute())
+ {
+ throw new Exception("Failed to get session id: " . $dataConnection->error);
+ }
+
+ $statement->bind_result($sessionId);
+ if(!$statement->fetch())
+ {
+ throw new Exception("Failed to get session id: " . $dataConnection->error);
+ }
+
+ return $sessionId;
+ }
+ finally
+ {
+ $statement->close();
+ }
+}
+
+function RefreshSession($dataConnection, $sessionId)
+{
+ $statement = $dataConnection->prepare("UPDATE sessions SET expiration = NOW() + INTERVAL " . FFXIV_SESSION_LENGTH . " HOUR WHERE id = ?");
+ if(!$statement)
+ {
+ throw new Exception("Failed to refresh session: " . $dataConnection->error);
+ }
+
+ try
+ {
+ $statement->bind_param('s', $sessionId);
+
+ if(!$statement->execute())
+ {
+ throw new Exception("Failed to refresh session: " . $dataConnection->error);
+ }
+ }
+ finally
+ {
+ $statement->close();
+ }
+}
+
+function GetUserIdFromSession($dataConnection, $sessionId)
+{
+ $statement = $dataConnection->prepare("SELECT userId FROM sessions WHERE id = ? AND expiration > NOW()");
+ if(!$statement)
+ {
+ throw new Exception("Could not get user id.");
+ }
+
+ try
+ {
+ $statement->bind_param('s', $sessionId);
+ if(!$statement->execute())
+ {
+ throw new Exception("Could not get user id.");
+ }
+
+ $statement->bind_result($userId);
+ if(!$statement->fetch())
+ {
+ throw new Exception("Could not get user id.");
+ }
+
+ return $userId;
+ }
+ finally
+ {
+ $statement->close();
+ }
+}
+
+function GetUserInfo($dataConnection, $userId)
+{
+ $statement = $dataConnection->prepare("SELECT name FROM users WHERE id = ?");
+ if(!$statement)
+ {
+ throw new Exception("Failed to get user information: " . $dataConnection->error);
+ }
+
+ try
+ {
+ $statement->bind_param('i', $userId);
+ if(!$statement->execute())
+ {
+ throw new Exception("Failed to get user information: " . $dataConnection->error);
+ }
+
+ $result = $statement->get_result();
+ if(!$result)
+ {
+ throw new Exception("Failed to get user information: " . $dataConnection->error);
+ }
+
+ $row = $result->fetch_assoc();
+ if(!$row)
+ {
+ throw new Exception("Failed to get user information: " . $dataConnection->error);
+ }
+
+ return $row;
+ }
+ finally
+ {
+ $statement->close();
+ }
+}
+
+function GetUserCharacters($dataConnection, $userId)
+{
+ $statement = $dataConnection->prepare("SELECT id, name FROM characters WHERE userId = ?");
+ if(!$statement)
+ {
+ throw new Exception(__FUNCTION__ . " failed: " . $dataConnection->error);
+ }
+
+ try
+ {
+ $statement->bind_param('i', $userId);
+ if(!$statement->execute())
+ {
+ throw new Exception(__FUNCTION__ . " failed: " . $dataConnection->error);
+ }
+
+ $result = $statement->get_result();
+ if(!$result)
+ {
+ throw new Exception(__FUNCTION__ . " failed: " . $dataConnection->error);
+ }
+
+ $characters = array();
+
+ while(1)
+ {
+ $row = $result->fetch_assoc();
+ if(!$row)
+ {
+ break;
+ }
+ array_push($characters, $row);
+ }
+
+ return $characters;
+ }
+ finally
+ {
+ $statement->close();
+ }
+}
+
+function GetCharacterInfo($dataConnection, $userId, $characterId)
+{
+ $query = sprintf("SELECT * FROM characters WHERE userId = '%d' AND id = '%d'",
+ $userId, $characterId);
+ $result = $dataConnection->query($query);
+ if(!$result)
+ {
+ throw new Exception(__FUNCTION__ . " failed: " . $dataConnection->error);
+ }
+
+ $row = $result->fetch_assoc();
+ if(!$row)
+ {
+ throw new Exception(__FUNCTION__ . " failed: " . $dataConnection->error);
+ }
+
+ return $row;
+}
+
+function UpdateCharacterInfo($dataConnection, $characterId, $characterInfo)
+{
+ $statement = $dataConnection->prepare("UPDATE ffxiv_characters SET
+ name = ?, tribe = ?, size = ?, voice = ?, skinColor = ?, hairStyle = ?, hairColor = ?, hairOption = ?,
+ eyeColor = ?, faceType = ?, faceBrow = ?, faceEye = ?, faceIris = ?, faceNose = ?, faceMouth = ?, faceJaw = ?,
+ faceCheek = ?, faceOption1 = ?, faceOption2 = ?, guardian = ?, birthMonth = ?, birthDay = ?, allegiance = ?,
+ weapon1 = ?, weapon2 = ?, headGear = ?, bodyGear = ?, legsGear = ?, handsGear = ?, feetGear = ?,
+ waistGear = ?, rightEarGear = ?, leftEarGear = ?, rightFingerGear = ?, leftFingerGear = ?
+ WHERE id = ?");
+ if(!$statement)
+ {
+ throw new Exception("Failed to update character information: " . $dataConnection->error);
+ }
+
+ try
+ {
+ if(!$statement->bind_param("siiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+ $characterInfo["name"], $characterInfo["tribe"], $characterInfo["size"], $characterInfo["voice"],
+ $characterInfo["skinColor"], $characterInfo["hairStyle"], $characterInfo["hairColor"],
+ $characterInfo["hairOption"], $characterInfo["eyeColor"], $characterInfo["faceType"],
+ $characterInfo["faceBrow"], $characterInfo["faceEye"], $characterInfo["faceIris"],
+ $characterInfo["faceNose"], $characterInfo["faceMouth"], $characterInfo["faceJaw"],
+ $characterInfo["faceCheek"], $characterInfo["faceOption1"], $characterInfo["faceOption2"],
+ $characterInfo["guardian"], $characterInfo["birthMonth"], $characterInfo["birthDay"], $characterInfo["allegiance"],
+ $characterInfo["weapon1"], $characterInfo["weapon2"], $characterInfo["headGear"], $characterInfo["bodyGear"],
+ $characterInfo["legsGear"], $characterInfo["handsGear"], $characterInfo["feetGear"],
+ $characterInfo["waistGear"], $characterInfo["rightEarGear"], $characterInfo["leftEarGear"],
+ $characterInfo["rightFingerGear"], $characterInfo["leftFingerGear"],
+ $characterId))
+ {
+ throw new Exception("Failed to update character information: " . $dataConnection->error);
+ }
+
+ if(!$statement->execute())
+ {
+ throw new Exception("Failed to update character information: " . $dataConnection->error);
+ }
+ }
+ finally
+ {
+ $statement->close();
+ }
+}
+
+?>
diff --git a/www/favicon.ico b/www/favicon.ico
new file mode 100644
index 00000000..edea6975
Binary files /dev/null and b/www/favicon.ico differ
diff --git a/www/header.php b/www/header.php
new file mode 100644
index 00000000..aca5ab3f
--- /dev/null
+++ b/www/header.php
@@ -0,0 +1,3 @@
+
diff --git a/www/img/logo.png b/www/img/logo.png
new file mode 100644
index 00000000..c42b8b25
Binary files /dev/null and b/www/img/logo.png differ
diff --git a/www/index.php b/www/index.php
new file mode 100644
index 00000000..2236f73b
--- /dev/null
+++ b/www/index.php
@@ -0,0 +1,553 @@
+
+// Arno Esterhuizen
+// et Romain Bourdon
+// et Hervé Leclerc
+//
+// Mise à jour par Herve Leclerc herve.leclerc@alterway.fr
+// Icônes par Mark James
+//------
+//[modif oto] Modifications Dominique Ottello (Otomatic)
+//Suppression des vhosts, le dossier n'étant plus créé à l'installation
+//Affichage des Outils, Projets et Alias sur trois colonnes
+// - Recodage en utf-8
+// - Modification des styles : ajout .third .left et .right
+// - Ajouts d'index dans $langues['en'] et ['fr'] :
+// 'locale' pour set_locale
+// 'docp' url des documentations PHP
+// 'docm' url des documentations MySQL
+// 'doca2.2' url de la documentation Apache 2.2
+// 'doca2.4' url de la documentation Apache 2.4
+// 'server' Server Software
+// - Classement alphabétique des extensions PHP en fonction de la localisation
+// - Liens sur les documentations Apache, PHP et MySQL
+// - Ajout variable $suppress_localhost = true;
+// - Conformité W3C par ajout de ... sur les variables
+// $aliasContents et $projectContents si vides
+
+//[modif oto] - Pour supprimer niveau localhost dans les url
+$suppress_localhost = true;
+// avec modification de la ligne
+//$projectContents .= ''.$file.' ';
+//Par :
+//$projectContents .= ''.$file.' ';
+//-----
+//[modif oto] Ajout $server_dir pour un seul remplacement
+// si déplacement www hors de Wamp et pas d'utilisation des jonctions
+//Par défaut la valeur est "../"
+//$server_dir = "WAMPROOT/";
+$server_dir = "../";
+//Fonctionne à condition d'avoir ServerSignature On et ServerTokens Full dans httpd.conf
+$server_software = $_SERVER['SERVER_SOFTWARE'];
+
+$wampConfFile = $server_dir.'wampmanager.conf';
+//chemin jusqu'aux fichiers alias
+$aliasDir = $server_dir.'alias/';
+
+// on charge le fichier de conf locale
+if (!is_file($wampConfFile))
+ die ('Unable to open WampServer\'s config file, please change path in index.php file');
+$fp = fopen($wampConfFile,'r');
+$wampConfFileContents = fread ($fp, filesize ($wampConfFile));
+fclose ($fp);
+
+
+// on récupère les versions des applis
+preg_match('|phpVersion = (.*)\n|',$wampConfFileContents,$result);
+$phpVersion = str_replace('"','',$result[1]);
+preg_match('|apacheVersion = (.*)\n|',$wampConfFileContents,$result);
+$apacheVersion = str_replace('"','',$result[1]);
+$doca_version = 'doca'.substr($apacheVersion,0,3);
+preg_match('|mysqlVersion = (.*)\n|',$wampConfFileContents,$result);
+$mysqlVersion = str_replace('"','',$result[1]);
+preg_match('|wampserverVersion = (.*)\n|',$wampConfFileContents,$result);
+$wampserverVersion = str_replace('"','',$result[1]);
+
+// répertoires à ignorer dans les projets
+$projectsListIgnore = array ('.','..');
+
+// textes
+$langues = array(
+ 'en' => array(
+ 'langue' => 'English',
+ 'locale' => 'english',
+ 'autreLangue' => 'Version Française',
+ 'autreLangueLien' => 'fr',
+ 'titreHtml' => 'WAMPSERVER Homepage',
+ 'titreConf' => 'Server Configuration',
+ 'versa' => 'Apache Version :',
+ 'doca2.2' => 'httpd.apache.org/docs/2.2/en/',
+ 'doca2.4' => 'httpd.apache.org/docs/2.4/en/',
+ 'versp' => 'PHP Version :',
+ 'server' => 'Server Software:',
+ 'docp' => 'www.php.net/manual/en/',
+ 'versm' => 'MySQL Version :',
+ 'docm' => 'dev.mysql.com/doc/index.html',
+ 'phpExt' => 'Loaded Extensions : ',
+ 'titrePage' => 'Tools',
+ 'txtProjet' => 'Your Projects',
+ 'txtNoProjet' => 'No projects yet. To create a new one, just create a directory in \'www\'.',
+ 'txtAlias' => 'Your Aliases',
+ 'txtNoAlias' => 'No Alias yet. To create a new one, use the WAMPSERVER menu.',
+ 'faq' => 'http://www.en.wampserver.com/faq.php'
+ ),
+ 'fr' => array(
+ 'langue' => 'Français',
+ 'locale' => 'french',
+ 'autreLangue' => 'English Version',
+ 'autreLangueLien' => 'en',
+ 'titreHtml' => 'Accueil WAMPSERVER',
+ 'titreConf' => 'Configuration Serveur',
+ 'versa' => 'Version Apache:',
+ 'doca2.2' => 'httpd.apache.org/docs/2.2/fr/',
+ 'doca2.4' => 'httpd.apache.org/docs/2.4/fr/',
+ 'versp' => 'Version de PHP:',
+ 'server' => 'Server Software:',
+ 'docp' => 'www.php.net/manual/fr/',
+ 'versm' => 'Version de MySQL:',
+ 'docm' => 'dev.mysql.com/doc/index.html',
+ 'phpExt' => 'Extensions Chargées: ',
+ 'titrePage' => 'Outils',
+ 'txtProjet' => 'Vos Projets',
+ 'txtNoProjet' => 'Aucun projet. Pour en ajouter un nouveau, créez simplement un répertoire dans \'www\'.',
+ 'txtAlias' => 'Vos Alias',
+ 'txtNoAlias' => 'Aucun alias. Pour en ajouter un nouveau, utilisez le menu de WAMPSERVER.',
+ 'faq' => 'http://www.wampserver.com/faq.php'
+ )
+);
+
+// images
+$pngFolder = <<< EOFILE
+iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAA3NCSVQICAjb4U/gAAABhlBMVEX//v7//v3///7//fr//fj+/v3//fb+/fT+/Pf//PX+/Pb+/PP+/PL+/PH+/PD+++/+++7++u/9+vL9+vH79+r79+n79uj89tj89Nf889D88sj78sz78sr58N3u7u7u7ev777j67bL67Kv46sHt6uP26cns6d356aP56aD56Jv45pT45pP45ZD45I324av344r344T14J734oT34YD13pD24Hv03af13pP233X025303JL23nX23nHz2pX23Gvn2a7122fz2I3122T12mLz14Xv1JPy1YD12Vz02Fvy1H7v04T011Py03j011b01k7v0n/x0nHz1Ejv0Hnuz3Xx0Gvz00buzofz00Pxz2juz3Hy0TrmznzmzoHy0Djqy2vtymnxzS3xzi/kyG3jyG7wyyXkwJjpwHLiw2Liw2HhwmDdvlXevVPduVThsX7btDrbsj/gq3DbsDzbrT7brDvaqzjapjrbpTraojnboTrbmzrbmjrbl0Tbljrakz3ajzzZjTfZijLZiTJdVmhqAAAAgnRSTlP///////////////////////////////////////8A////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9XzUpQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAB90RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgOLVo0ngAAACqSURBVBiVY5BDAwxECGRlpgNBtpoKCMjLM8jnsYKASFJycnJ0tD1QRT6HromhHj8YMOcABYqEzc3d4uO9vIKCIkULgQIlYq5haao8YMBUDBQoZWIBAnFtAwsHD4kyoEA5l5SCkqa+qZ27X7hkBVCgUkhRXcvI2sk3MCpRugooUCOooWNs4+wdGpuQIlMDFKiWNbO0dXTx9AwICVGuBQqkFtQ1wEB9LhGeAwDSdzMEmZfC0wAAAABJRU5ErkJggg==
+EOFILE;
+$pngFolderGo = <<< EOFILE
+iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJISURBVDjLpZPLS5RhFIef93NmnMIRSynvgRF5KWhRlmWbbotwU9sWLupfCBeBEYhQm2iVq1oF0TKIILIkMgosxBaBkpFDmpo549y+772dFl5bBIG/5eGch9+5KRFhOwrYpmIAk8+OjScr29uV2soTotzXtLOZLiD6q0oBUDjY89nGAJQErU3dD+NKKZDVYpTChr9a5sdvpWUtClCWqBRxZiE/9+o68CQGgJUQr8ujn/dxugyCSpRKkaw/S33n7QQigAfxgKCCitqpp939mwCjAvEapxOIF3xpBlOYJ78wQjxZB2LAa0QsYEm19iUQv29jBihJeltCF0F0AZNbIdXaS7K6ba3hdQey6iBWBS6IbQJMQGzHHqrarm0kCh6vf2AzLxGX5eboc5ZLBe52dZBsvAGRsAUgIi7EFycQl0VcDrEZvFlGXBZshtCGNNa0cXVkjEdXIjBb1kiEiLd4s4jYLOKy9L1+DGLQ3qKtpW7XAdpqj5MLC/Q8uMi98oYtAC2icIj9jdgMYjNYrznf0YsTj/MOjzCbTXO48RR5XaJ35k2yMBCoGIBov2yLSztNPpHCpwKROKHVOPF8X5rCeIv1BuMMK1GOI02nyZsiH769DVcBYXRneuhSJ8I5FCmAsNomrbPsrWzGeocTz1x2ht0VtXxKj/Jl+v1y0dCg/vVMl4daXKg12mtCq9lf0xGcaLnA2Mw7hidfTGhL5+ygROp/v/HQQLB4tPlMzcjk8EftOTk7KHr1hP4T0NKvFp0vqyl5F18YFLse/wPLHlqRZqo3CAAAAABJRU5ErkJggg==
+EOFILE;
+$gifLogo = <<< EOFILE
+iVBORw0KGgoAAAANSUhEUgAAAGAAAABTCAYAAABgdgI7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
+bWFnZVJlYWR5ccllPAAAA2RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp
+bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6
+eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEz
+NDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo
+dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw
+dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu
+MC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz
+b3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1N
+Ok9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1ODg0QkM3NUZBMDhFMDExODkyQ0U2NkE5ODVB
+M0Q2OSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyMEQ2RDU5MDA5M0UxMUUwOUUwRkYwRTg2
+NjQyMzQzQyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMEQ2RDU4RjA5M0UxMUUwOUUwRkYw
+RTg2NjQyMzQzQyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3Mi
+PiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1ODg0QkM3NUZB
+MDhFMDExODkyQ0U2NkE5ODVBM0Q2OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1ODg0QkM3
+NUZBMDhFMDExODkyQ0U2NkE5ODVBM0Q2OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRG
+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
+EOFILE;
+$pngPlugin = <<< EOFILE
+iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAABmklEQVR42mL4//8/AyUYIIDAxK5du1BwXEb3/9D4FjBOzZ/wH10ehkF6AQIIw4B1G7b+D09o/h+X3gXG4YmteA0ACCCsLghPbPkfm9b5PzK5439Sdg9eAwACCEyANMBwaFwTGIMMAOEQIBuGA6Mb/qMbABBAEAOQnIyMo1M74Tgiqf2/b3gVhgEAAQQmQuKa/8ekdYMxyLCgmEYMHJXc9t87FNMAgACCGgBxIkgzyDaQU5FxQGQN2AUBUXX/vULKwdgjsOQ/SC9AAKEEYlB03f+oFJABdSjYP6L6P0guIqkVjt0DisEGAAQQigEgG0AhHxBVi4L9wqvBBiEHtqs/xACAAAIbEBBd/x+Eg2ObwH4FORmGfYCaQRikCUS7B5YBNReBMUgvQABBDADaAtIIwsEx9f/Dk9pQsH9kHTh8XANKMAIRIIDAhF9ELTiQQH4FaQAZCAsskPNhyRpkK7oBAAEEMSC8GsVGkEaYIlBghcU3gbGzL6YBAAEEJnzCgP6EYs/gcjCGKQI5G4Z9QiswDAAIIAZKszNAgAEAHgFgGSNMTwgAAAAASUVORK5CYII=
+EOFILE;
+$pngWrench = <<< EOFILE
+iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAA3NCSVQICAjb4U/gAAABO1BMVEXu7u7n5+fk5OTi4uLg4ODd3d3X19fV1dXU1NTS0tLPz8+7z+/MzMy6zu65ze65zu7Kysq3zO62zO3IyMjHx8e1yOiyyO2yyOzFxcXExMSyxue0xuexxefDw8OtxeuwxOXCwsLBwcGuxOWsw+q/v7+qweqqwuqrwuq+vr6nv+qmv+m7u7ukvumkvemivOi5ubm4uLicuOebuOeat+e0tLSYtuabtuaatuaXteaZteaatN6Xs+aVs+WTsuaTsuWRsOSrq6uLreKoqKinp6elpaWLqNijo6OFpt2CpNyAo92BotyAo9+dnZ18oNqbm5t4nt57nth7ntp4nt15ndp3nd6ZmZmYmJhym956mtJzm96WlpaVlZVwmNyTk5Nvl9lultuSkpKNjY2Li4uKioqIiIiHh4eGhoZQgtVKfNFdha6iAAAAaXRSTlMA//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////914ivwAAAACXBIWXMAAAsSAAALEgHS3X78AAAAH3RFWHRTb2Z0d2FyZQBNYWNyb21lZGlhIEZpcmV3b3JrcyA4tWjSeAAAAKFJREFUGJVjYIABASc/PwYkIODDxBCNLODEzGiQgCwQxsTlzJCYmAgXiGKVdHFxYEuB8dkTOIS1tRUVocaIWiWI8IiIKKikaoD50kYWrpwmKSkpsRC+lBk3t2NEMgtMu4wpr5aeuHcAjC9vzadjYyjn7w7lK9kK6tqZK4d4wBQECenZW6pHesEdFC9mbK0W7otwsqenqmpMILIn4tIzgpG4ADUpGMOpkOiuAAAAAElFTkSuQmCC
+EOFILE;
+$favicon = <<< EOFILE
+iVBORw0KGgoAAAANSUhEUgAAAB8AAAAfCAYAAAAfrhY5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
+bWFnZVJlYWR5ccllPAAAA2RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp
+bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6
+eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEz
+NDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo
+dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw
+dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu
+MC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz
+b3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1N
+Ok9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1ODg0QkM3NUZBMDhFMDExODkyQ0U2NkE5ODVB
+M0Q2OSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxRkI1ODNGRTA5MDMxMUUwQjAwNEEwODc0
+OTk5N0ZEOCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxRkI1ODNGRDA5MDMxMUUwQjAwNEEw
+ODc0OTk5N0ZEOCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3Mi
+PiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1ODg0QkM3NUZB
+MDhFMDExODkyQ0U2NkE5ODVBM0Q2OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1ODg0QkM3
+NUZBMDhFMDExODkyQ0U2NkE5ODVBM0Q2OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRG
+PiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PiUukzAAAAHHSURBVHja5FfRccIwDLVz
+/W+7QdggbJBM0HQCwg+/LRNwTJDymx9ggmYDsgEZwRuUDVI5ET1XyE5CuIa76k7ABVtPluQnRVZV
+JcYST4woD85/ZRbC5wxUf/sdbZagBehGVAvlNM+GXWYaaIugQ+QDdA1OnLqByyyAzwPo042iqyMx
+BwdKN7jMNODREWKFyonv2KdPPqERoDlPGQMKQ7drPWPjfAy6Inb080/QiK/2Js8JMacBpzWwzGIs
+QFdxhujkFMNtSkj3m1ftjTnxEg0f0XNXAYb1mmatwFPSFM1s4NTwuUp18QU9CiyonWj2rhkHWXAK
+kNeh7gdMQ5wzRdnKcAo9DwZcsRBtqL70qm7Ior3B/5zbI0IKrvv8mxarhXSsXtrY8m5OfjB+F5SN
+BkhKrpi8635uaxAvkO9HpgZSB/v57f2cFpEQzz+UeZ28Yvq+bMXpkb5rSgwLc+Z5Fylwb+y68x4p
+MlNW2CLnPUmnrE/d7F1dOGXJ+Qb0neQqre9ptZiAscTI38ng7YTQ8g6Budlg75pktkxPV9idctss
+1mGYOKciupsxatQB8pJkmkUTpgCvHZ0jDtg+t4/60vAf3tVGBf8WYAC3Rq8Ub3mHyQAAAABJRU5E
+rkJggg==
+EOFILE;
+
+
+//affichage du phpinfo
+if (isset($_GET['phpinfo']))
+{
+ phpinfo();
+ exit();
+}
+
+
+//affichage des images
+if (isset($_GET['img']))
+{
+ switch ($_GET['img'])
+ {
+ case 'pngFolder' :
+ header("Content-type: image/png");
+ echo base64_decode($pngFolder);
+ exit();
+
+ case 'pngFolderGo' :
+ header("Content-type: image/png");
+ echo base64_decode($pngFolderGo);
+ exit();
+
+ case 'gifLogo' :
+ header("Content-type: image/gif");
+ echo base64_decode($gifLogo);
+ exit();
+
+ case 'pngPlugin' :
+ header("Content-type: image/png");
+ echo base64_decode($pngPlugin);
+ exit();
+
+ case 'pngWrench' :
+ header("Content-type: image/png");
+ echo base64_decode($pngWrench);
+ exit();
+
+ case 'favicon' :
+ header("Content-type: image/x-icon");
+ echo base64_decode($favicon);
+ exit();
+ }
+}
+
+
+
+// Définition de la langue et des textes
+
+if (isset ($_GET['lang']))
+{
+ $langue = htmlspecialchars($_GET['lang'],ENT_QUOTES);
+ if ($langue != 'en' && $langue != 'fr' ) {
+ $langue = 'fr';
+ }
+ }
+elseif (isset ($_SERVER['HTTP_ACCEPT_LANGUAGE']) AND preg_match("/^fr/", $_SERVER['HTTP_ACCEPT_LANGUAGE']))
+{
+ $langue = 'fr';
+}
+else
+{
+ $langue = 'en';
+}
+
+//initialisation
+$aliasContents = '';
+
+// récupération des alias
+if (is_dir($aliasDir))
+{
+ $handle=opendir($aliasDir);
+ while (($file = readdir($handle))!==false)
+ {
+ if (is_file($aliasDir.$file) && strstr($file, '.conf'))
+ {
+ $msg = '';
+ $aliasContents .= ''.str_replace('.conf','',$file).' ';
+ }
+ }
+ closedir($handle);
+}
+if (empty($aliasContents))
+ $aliasContents = "".$langues[$langue]['txtNoAlias']." \n";
+
+// récupération des projets
+$handle=opendir(".");
+$projectContents = '';
+while (($file = readdir($handle))!==false)
+{
+ if (is_dir($file) && !in_array($file,$projectsListIgnore))
+ {
+ //[modif oto] Ajout éventuel de http:// pour éviter le niveau localhost dans les url
+ $projectContents .= ''.$file.' ';
+ }
+}
+closedir($handle);
+if (empty($projectContents))
+ $projectContents = "".$langues[$langue]['txtNoProjet']." \n";;
+
+
+//initialisation
+$phpExtContents = '';
+
+// récupération des extensions PHP
+$loaded_extensions = get_loaded_extensions();
+// [modif oto] classement alphabétique des extensions
+setlocale(LC_ALL,"{$langues[$langue]['locale']}");
+sort($loaded_extensions,SORT_LOCALE_STRING);
+foreach ($loaded_extensions as $extension)
+ $phpExtContents .= "${extension} ";
+
+
+//header('Status: 301 Moved Permanently', false, 301);
+//header('Location: /aviatechno/index.php');
+//exit();
+
+$pageContents = <<< EOPAGE
+
+
+
+
+
+ {$langues[$langue]['titreHtml']}
+
+
+
+
+
+
+
+
+
W A M P
+
+ PHP 5
+ Apache 2
+ MySQL 5
+
+
+
+
+
+ {$langues[$langue]['titreConf']}
+
+
+ {$langues[$langue]['versa']}
+ ${apacheVersion} - Documentation
+ {$langues[$langue]['versp']}
+ ${phpVersion} - Documentation
+ {$langues[$langue]['server']}
+ ${server_software}
+ {$langues[$langue]['phpExt']}
+
+
+
+ {$langues[$langue]['versm']}
+ ${mysqlVersion} - Documentation
+
+
+
+
{$langues[$langue]['titrePage']}
+
+
+
+
{$langues[$langue]['txtProjet']}
+
+
+
+
{$langues[$langue]['txtAlias']}
+
+
+
+
+
+
+EOPAGE;
+
+echo $pageContents;
+?>
\ No newline at end of file
diff --git a/www/login.php b/www/login.php
new file mode 100644
index 00000000..40870a8f
--- /dev/null
+++ b/www/login.php
@@ -0,0 +1,89 @@
+getMessage();
+ }
+}
+
+?>
+
+
+
+ FFXIV 1.0 Login
+
+
+
+
+ window.location=\"ffxiv://login_success?sessionId=" . $sessionId . "\";";
+ }
+ ?>
+
+
+
+
+
+
+
+
+
+
+
diff --git a/www/presets_armor.json b/www/presets_armor.json
new file mode 100644
index 00000000..e2c7bfe3
--- /dev/null
+++ b/www/presets_armor.json
@@ -0,0 +1,146 @@
+{
+ 0: {
+ "name": "Bard Artifact Equipment",
+ "headGear": 41984,
+ "bodyGear": 41984,
+ "legsGear": 41984,
+ "handsGear": 41984,
+ "feetGear": 41984,
+ "waistGear": 0
+ },
+ 1: {
+ "name": "Black Mage Artifact Equipment",
+ "headGear": 40960,
+ "bodyGear": 40960,
+ "legsGear": 40960,
+ "handsGear": 40960,
+ "feetGear": 40960,
+ "waistGear": 0
+ },
+ 2: {
+ "name": "Dragoon Artifact Equipment",
+ "headGear": 36864,
+ "bodyGear": 36864,
+ "legsGear": 36864,
+ "handsGear": 36864,
+ "feetGear": 36864,
+ "waistGear": 0
+ },
+ 3: {
+ "name": "Monk Artifact Equipment",
+ "headGear": 45056,
+ "bodyGear": 45056,
+ "legsGear": 45056,
+ "handsGear": 45056,
+ "feetGear": 45056,
+ "waistGear": 0
+ },
+ 4: {
+ "name": "Paladin Artifact Equipment",
+ "headGear": 43008,
+ "bodyGear": 43008,
+ "legsGear": 43008,
+ "handsGear": 43008,
+ "feetGear": 43008,
+ "waistGear": 0
+ },
+ 5: {
+ "name": "Warrior Artifact Equipment",
+ "headGear": 37888,
+ "bodyGear": 37888,
+ "legsGear": 37888,
+ "handsGear": 37888,
+ "feetGear": 37888,
+ "waistGear": 0
+ },
+ 6: {
+ "name": "White Mage Artifact Equipment",
+ "headGear": 39936,
+ "bodyGear": 39936,
+ "legsGear": 39936,
+ "handsGear": 39936,
+ "feetGear": 39936,
+ "waistGear": 0
+ },
+ 7: {
+ "name": "The Maelstrom Uniform",
+ "headGear": 46080,
+ "bodyGear": 46080,
+ "legsGear": 1024,
+ "handsGear": 46080,
+ "feetGear": 46080,
+ "waistGear": 0
+ },
+ 8: {
+ "name": "The Order of the Twin Adder Uniform",
+ "headGear": 46112,
+ "bodyGear": 46081,
+ "legsGear": 1024,
+ "handsGear": 46081,
+ "feetGear": 46081,
+ "waistGear": 0
+ },
+ 9: {
+ "name": "The Immortal Flames Uniform",
+ "headGear": 46144,
+ "bodyGear": 46082,
+ "legsGear": 1024,
+ "handsGear": 46082,
+ "feetGear": 46082,
+ "waistGear": 0
+ },
+ 10: {
+ "name": "Alberic",
+ "headGear": 0,
+ "bodyGear": 15744,
+ "legsGear": 7238,
+ "handsGear": 11584,
+ "feetGear": 15744,
+ "waistGear": 0
+ },
+ 11: {
+ "name": "Jehantel",
+ "headGear": 9604,
+ "bodyGear": 28742,
+ "legsGear": 28928,
+ "handsGear": 1024,
+ "feetGear": 9412,
+ "waistGear": 0
+ },
+ 12: {
+ "name": "Miraudont",
+ "headGear": 19503,
+ "bodyGear": 14598,
+ "legsGear": 3268,
+ "handsGear": 14560,
+ "feetGear": 13475,
+ "waistGear": 248832
+ },
+ 13: {
+ "name": "Nael van Darnus (Elezen Male Only)",
+ "headGear": 0,
+ "bodyGear": 933888,
+ "legsGear": 1024,
+ "handsGear": 1024,
+ "feetGear": 1024,
+ "waistGear": 0
+ },
+ 14: {
+ "name": "Papalymo",
+ "headGear": 20507,
+ "bodyGear": 7589,
+ "legsGear": 16641,
+ "handsGear": 3265,
+ "feetGear": 9504,
+ "waistGear": 168960
+ },
+ 15: {
+ "name": "Rubh Epocan",
+ "headGear": 20576,
+ "bodyGear": 7232,
+ "legsGear": 5198,
+ "handsGear": 6209,
+ "feetGear": 6209,
+ "waistGear": 248832
+ },
+};
\ No newline at end of file
diff --git a/www/presets_weapon.json b/www/presets_weapon.json
new file mode 100644
index 00000000..4a987118
--- /dev/null
+++ b/www/presets_weapon.json
@@ -0,0 +1,107 @@
+{
+ 0: {
+ "name": "Axe",
+ "weapon1": 147850240,
+ "weapon2": 0,
+ },
+ 1: {
+ "name": "Bow & Arrow",
+ "weapon1": 210766878,
+ "weapon2": 236979210,
+ },
+ 2: {
+ "name": "Fists",
+ "weapon1": 58723358,
+ "weapon2": 59771934,
+ },
+ 3: {
+ "name": "Lance",
+ "weapon1": 168826880,
+ "weapon2": 0,
+ },
+ 4: {
+ "name": "Sword & Shield",
+ "weapon1": 79692880,
+ "weapon2": 32513024,
+ },
+ 5: {
+ "name": "Wand (Conjurer)",
+ "weapon1": 331351052,
+ "weapon2": 0,
+ },
+ 6: {
+ "name": "Wand (Thaumaturge)",
+ "weapon1": 294652958,
+ "weapon2": 0,
+ },
+ 7: {
+ "name": "Ifrit's Battleaxe",
+ "weapon1": 147857408,
+ "weapon2": 0,
+ },
+ 8: {
+ "name": "Ifrit's Bow",
+ "weapon1": 210768896,
+ "weapon2": 0,
+ },
+ 9: {
+ "name": "Ifrit's Claws",
+ "weapon1": 62915584,
+ "weapon2": 63964160,
+ },
+ 10: {
+ "name": "Ifrit's Harpoon",
+ "weapon1": 175113216,
+ "weapon2": 0,
+ },
+ 11: {
+ "name": "Ifrit's Blade",
+ "weapon1": 81789952,
+ "weapon2": 0,
+ },
+ 12: {
+ "name": "Ifrit's Cane",
+ "weapon1": 347086848,
+ "weapon2": 0,
+ },
+ 13: {
+ "name": "Ifrit's Cudgel",
+ "weapon1": 294653952,
+ "weapon2": 0,
+ },
+ 14: {
+ "name": "Bravura",
+ "weapon1": 147856384,
+ "weapon2": 0,
+ },
+ 15: {
+ "name": "Artemis Bow",
+ "weapon1": 212861952,
+ "weapon2": 0,
+ },
+ 16: {
+ "name": "Sphairai",
+ "weapon1": 65012736,
+ "weapon2": 66061312,
+ },
+ 17: {
+ "name": "Gae Bolg",
+ "weapon1": 173016064,
+ "weapon2": 0,
+ },
+ 18: {
+ "name": "Curtana & Holy Shield",
+ "weapon1": 79702016,
+ "weapon2": 32517120,
+ },
+ 19: {
+ "name": "Thyrus",
+ "weapon1": 347084800,
+ "weapon2": 0,
+ },
+ 20: {
+ "name": "Stardust Rod",
+ "weapon1": 310380544,
+ "weapon2": 0,
+ },
+};
diff --git a/www/testmysql.php b/www/testmysql.php
new file mode 100644
index 00000000..fdb5dd88
--- /dev/null
+++ b/www/testmysql.php
@@ -0,0 +1,7 @@
+
\ No newline at end of file