From 041622c4aa6618497557d04e6b687188237ab90e Mon Sep 17 00:00:00 2001 From: Botanic Date: Tue, 9 Jul 2013 05:08:32 -0700 Subject: [PATCH] Merge with quitta-gsoc-2013 --- .../ryzom_ams/ams_lib/autoload/dblayer.php | 13 + .../ryzom_ams/ams_lib/autoload/sync.php | 20 +- .../ryzom_ams/ams_lib/autoload/ticket.php | 169 ++++++++++ .../ams_lib/autoload/ticket_category.php | 94 ++++++ .../ams_lib/autoload/ticket_content.php | 75 ++++ .../ams_lib/autoload/ticket_reply.php | 110 ++++++ .../ams_lib/autoload/ticket_user.php | 101 ++++++ .../ryzom_ams/ams_lib/autoload/users.php | 48 ++- .../ryzom_ams/ams_lib/translations/en.ini | 17 +- .../ryzom_ams/ams_lib/translations/fr.ini | 14 +- .../ryzom_ams/www/html/autoload/webusers.php | 65 +++- .../tools/server/ryzom_ams/www/html/error.php | 2 +- .../ryzom_ams/www/html/func/add_user.php | 15 +- .../ryzom_ams/www/html/func/change_info.php | 115 +++++++ .../ryzom_ams/www/html/func/change_mail.php | 92 +++++ .../www/html/func/change_password.php | 44 ++- .../ryzom_ams/www/html/func/create_ticket.php | 48 +++ .../server/ryzom_ams/www/html/func/login.php | 5 +- .../ryzom_ams/www/html/inc/createticket.php | 45 +++ .../server/ryzom_ams/www/html/inc/error.php | 12 + .../ryzom_ams/www/html/inc/libuserlist.php | 114 ++++--- .../ryzom_ams/www/html/inc/settings.php | 282 +++++++++++++++- .../ryzom_ams/www/html/inc/show_user.php | 63 ++++ .../ryzom_ams/www/html/inc/userlist.php | 22 ++ .../tools/server/ryzom_ams/www/html/index.php | 6 + .../ryzom_ams/www/html/sql/DBScheme.png | Bin 0 -> 114396 bytes .../server/ryzom_ams/www/html/sql/install.php | 217 +++++++++++- .../ryzom_ams/www/html/sql/ticketsql.sql | 209 ++++++++++++ .../www/html/sql/ticketsystemmodel.mwb | Bin 0 -> 12381 bytes .../www/html/templates/createticket.tpl | 59 ++++ .../ryzom_ams/www/html/templates/error.tpl | 86 +++++ .../ryzom_ams/www/html/templates/layout.tpl | 3 +- .../www/html/templates/layout_admin.tpl | 2 + .../www/html/templates/layout_user.tpl | 3 +- .../www/html/templates/libuserlist.tpl | 9 +- .../ryzom_ams/www/html/templates/register.tpl | 2 +- .../ryzom_ams/www/html/templates/settings.tpl | 319 +++--------------- .../www/html/templates/show_user.tpl | 117 +++++++ .../ryzom_ams/www/html/templates/userlist.tpl | 62 ++-- 39 files changed, 2277 insertions(+), 402 deletions(-) create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket.php create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_category.php create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_content.php create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_reply.php create mode 100644 code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_user.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/func/change_info.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/func/change_mail.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/func/create_ticket.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/inc/createticket.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/inc/error.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/inc/show_user.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/inc/userlist.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/sql/DBScheme.png create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsystemmodel.mwb create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/templates/createticket.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/templates/error.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/templates/show_user.tpl diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/dblayer.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/dblayer.php index 240eda426..a96fd98ea 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/dblayer.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/dblayer.php @@ -41,4 +41,17 @@ class DBLayer{ } } + public function executeReturnId($query,$params){ + try{ + $statement = $this->PDO->prepare($query); + $this->PDO->beginTransaction(); + $statement->execute($params); + $lastId =$this->PDO->lastInsertId(); + $this->PDO->commit(); + return $lastId; + }catch (PDOException $e) { + throw $e; + } + } + } \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/sync.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/sync.php index 170a1c4bf..1c68b822b 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/sync.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/sync.php @@ -25,13 +25,27 @@ class Sync{ switch($record['type']) { case 'createPermissions': - case 'user_edit': + case 'change_pass': + $decode = json_decode($record['query']); + $values = array('user' => $decode[0], 'pass' => $decode[1]); + //make connection with and put into shard db & delete from the lib + $dbs->execute("SET Password = :pass WHERE Login = :user",$values); + $dbl->execute("DELETE FROM ams_querycache WHERE SID=:SID",array('SID' => $record['SID'])); + break; + case 'change_mail': + $decode = json_decode($record['query']); + $values = array('user' => $decode[0], 'mail' => $decode[1]); + //make connection with and put into shard db & delete from the lib + $dbs->execute("SET Email = :mail WHERE Login = :user",$values); + $dbl->execute("DELETE FROM ams_querycache WHERE SID=:SID",array('SID' => $record['SID'])); + break; case 'createUser': $decode = json_decode($record['query']); - $query = array('login' => $decode[0], 'pass' => $decode[1], 'mail' => $decode[2] ); + $values = array('login' => $decode[0], 'pass' => $decode[1], 'mail' => $decode[2] ); //make connection with and put into shard db & delete from the lib - $dbs->execute("INSERT INTO user (Login, Password, Email) VALUES (:login, :pass, :mail)",$query); + $dbs->execute("INSERT INTO user (Login, Password, Email) VALUES (:login, :pass, :mail)",$values); $dbl->execute("DELETE FROM ams_querycache WHERE SID=:SID",array('SID' => $record['SID'])); + break; } } print('Syncing completed'); diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket.php new file mode 100644 index 000000000..f8f9f10e3 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket.php @@ -0,0 +1,169 @@ +execute("SELECT * FROM ticket INNER JOIN ticket_user ON ticket.Author = ticket_user.TUserId and ticket_user.ExternId=:id", array('id' => $author)); + $row = $statement->fetchAll(); + $result = Array(); + foreach($row as $ticket){ + $instance = new self($db_data); + $instance->setTimestamp($ticket['Timestamp']); + $instance->setTitle($ticket['Title']); + $instance->setStatus($ticket['Status']); + $instance->setQueue($ticket['Queue']); + $instance->setTicket_Category($ticket['Ticket_Category']); + $instance->setAuthor($ticket['Author']); + $result[] = $instance; + } + return $result; + } + + + /*FUNCTION: create_Ticket() + * creates a ticket + first initial reply and fills in the content of it! + * + */ + public static function create_Ticket( $title, $content, $category, $author, $db_data) { + + $ticket = new Ticket($db_data); + $ticket->set($title,0,0,$category,$author); + $ticket->create(); + $ticket_id = $ticket->getTId(); + + + $ticket_content = new Ticket_Content($db_data); + $ticket_content->setContent($content); + $ticket_content->create(); + $content_id = $ticket_content->getTContentId(); + + + $ticket_reply = new Ticket_Reply($db_data); + $ticket_reply->set($ticket_id, $content_id, $author); + $ticket_reply->create(); + + } + + ////////////////////////////////////////////Methods//////////////////////////////////////////////////// + public function __construct($db_data) { + $this->db = $db_data; + } + + + //Set ticket object + public function set($t,$s,$q,$t_c,$a){ + $this->title = $t; + $this->status = $s; + $this->queue = $q; + $this->ticket_category = $t_c; + $this->author = $a; + } + + //create ticket by writing private data to DB. + public function create(){ + $dbl = new DBLayer($this->db); + $query = "INSERT INTO ticket (Timestamp, Title, Status, Queue, Ticket_Category, Author) VALUES (now(), :title, :status, :queue, :tcat, :author)"; + $values = Array('title' => $this->title, 'status' => $this->status, 'queue' => $this->queue, 'tcat' => $this->ticket_category, 'author' => $this->author); + $this->tId = $dbl->executeReturnId($query, $values); ; + } + + //return constructed element based on TId + public function load_With_TId( $id) { + $dbl = new DBLayer($this->db); + $statement = $dbl->execute("SELECT * FROM ticket WHERE TId=:id", array('id' => $id)); + $row = $statement->fetch(); + $this->tId = $row['TId']; + $this->timestamp = $row['Timestamp']; + $this->title = $row['Title']; + $this->status = $row['Status']; + $this->queue = $row['Queue']; + $this->ticket_category = $row['Ticket_Category']; + $this->author = $row['Author']; + } + + + //update private data to DB. + public function update(){ + $dbl = new DBLayer($this->db); + $query = "UPDATE ticket SET Timestamp = :timestamp, Title = :title, Status = :status, Queue = :queue, Ticket_Category = :tcat, Author = :author WHERE TId=:id"; + $values = Array('id' => $this->tId, 'timestamp' => $this->timestamp, 'title' => $this->title, 'status' => $this->status, 'queue' => $this->queue, 'tcat' => $this->ticket_category, 'author' => $this->author); + $statement = $dbl->execute($query, $values); + } + + + ////////////////////////////////////////////Getters//////////////////////////////////////////////////// + + public function getTId(){ + return $this->tId; + } + + public function getTimestamp(){ + return $this->timestamp; + } + + public function getTitle(){ + return $this->title; + } + + public function getStatus(){ + return $this->status; + } + + public function getQueue(){ + return $this->queue; + } + + public function getTicket_Category(){ + return $this->ticket_category; + } + + public function getAuthor(){ + return $this->author; + } + + ////////////////////////////////////////////Setters//////////////////////////////////////////////////// + + public function setTId($id){ + $this->tId = $id; + } + + public function setTimestamp($ts){ + $this->timestamp = $ts; + } + + public function setTitle($t){ + $this->title = $t; + } + + public function setStatus($s){ + $this->status = $s; + } + + public function setQueue($q){ + $this->queue = $q; + } + + public function setTicket_Category($tc){ + $this->ticket_category = $tc; + } + + public function setAuthor($a){ + $this->author = $a; + } + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_category.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_category.php new file mode 100644 index 000000000..1fe7227b7 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_category.php @@ -0,0 +1,94 @@ + $name); + $dbl->execute($query, $values); + + } + + + //return constructed element based on TCategoryId + public static function constr_TCategoryId( $id, $db_data) { + $instance = new self($db_data); + $instance->setTCategoryId($id); + return $instance; + } + + //returns list of all category objects + public static function getAllCategories($db_data) { + $dbl = new DBLayer($db_data); + $statement = $dbl->executeWithoutParams("SELECT * FROM ticket_category"); + $row = $statement->fetchAll(); + $result = Array(); + foreach($row as $category){ + $instance = new self($db_data); + $instance->tCategoryId = $category['TCategoryId']; + $instance->name = $category['Name']; + $result[] = $instance; + } + return $result; + } + + + ////////////////////////////////////////////Methods//////////////////////////////////////////////////// + + public function __construct($db_data) { + $this->db = $db_data; + } + + //return constructed element based on TCategoryId + public function load_With_TCategoryId( $id) { + $dbl = new DBLayer($this->db); + $statement = $dbl->execute("SELECT * FROM ticket_category WHERE TCategoryId=:id", array('id' => $id)); + $row = $statement->fetch(); + $this->tCategoryId = $row['TCategoryId']; + $this->name = $row['Name']; + } + + + //update private data to DB. + public function update(){ + $dbl = new DBLayer($this->db); + $query = "UPDATE ticket_category SET Name = :name WHERE TCategoryId=:id"; + $values = Array('id' => $this->tCategoryId, 'name' => $this->name); + $statement = $dbl->execute($query, $values); + } + + ////////////////////////////////////////////Getters//////////////////////////////////////////////////// + + public function getName(){ + if ($this->name == ""){ + $this->load_With_TCategoryId($this->tCategoryId); + } + return $this->name; + } + + + public function getTCategoryId(){ + return $this->tCategoryId; + } + + + ////////////////////////////////////////////Setters//////////////////////////////////////////////////// + + public function setName($n){ + $this->name = $n; + } + + public function setTCategoryId($id){ + $this->tCategoryId = $id; + } + + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_content.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_content.php new file mode 100644 index 000000000..62130d1d9 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_content.php @@ -0,0 +1,75 @@ +setTContentId($id); + return $instance; + } + + + ////////////////////////////////////////////Methods//////////////////////////////////////////////////// + + public function __construct($db_data) { + $this->db = $db_data; + } + + //Creates a ticket_content entry in the DB + public function create() { + $dbl = new DBLayer($this->db); + $query = "INSERT INTO ticket_content (Content) VALUES (:content)"; + $values = Array('content' => $this->content); + $this->tContentId = $dbl->executeReturnId($query, $values); ; + } + + //return constructed element based on TContentId + public function load_With_TContentId( $id) { + $dbl = new DBLayer($this->db); + $statement = $dbl->execute("SELECT * FROM ticket_content WHERE TContentId=:id", array('id' => $id)); + $row = $statement->fetch(); + $this->tContentId = $row['TContentId']; + $this->content = $row['Content']; + } + + //update private data to DB. + public function update(){ + $dbl = new DBLayer($this->db); + $query = "UPDATE ticket_content SET Content = :content WHERE TContentId=:id"; + $values = Array('id' => $this->tContentId, 'content' => $this->content); + $statement = $dbl->execute($query, $values); + } + + ////////////////////////////////////////////Getters//////////////////////////////////////////////////// + + public function getContent(){ + if ($this->content == ""){ + $this->load_With_TContentId($this->tContentId); + } + return $this->content; + } + + + public function getTContentId(){ + return $this->tContentId; + } + + + ////////////////////////////////////////////Setters//////////////////////////////////////////////////// + + public function setContent($c){ + $this->content = $c; + } + + public function setTContentId($c){ + $this->tContentId = $c; + } + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_reply.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_reply.php new file mode 100644 index 000000000..8f14a9f5f --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_reply.php @@ -0,0 +1,110 @@ +setTReplyId($id); + return $instance; + } + + ////////////////////////////////////////////Methods//////////////////////////////////////////////////// + + public function __construct($db_data) { + $this->db = $db_data; + } + + + //Set ticket_reply object + public function set($t,$c,$a){ + $this->ticket = $t; + $this->content = $c; + $this->author = $a; + } + + //create ticket by writing private data to DB. + public function create(){ + $dbl = new DBLayer($this->db); + $query = "INSERT INTO ticket_reply (Ticket, Content, Author, Timestamp) VALUES (:ticket, :content, :author, now())"; + $values = Array('ticket' => $this->ticket, 'content' => $this->content, 'author' => $this->author); + $dbl->execute($query, $values); + } + + //return constructed element based on TId + public function load_With_TReplyId( $id) { + $dbl = new DBLayer($this->db); + $statement = $dbl->execute("SELECT * FROM ticket_reply WHERE TReplyId=:id", array('id' => $id)); + $row = $statement->fetch(); + $this->tReplyId = $row['TReplyId']; + $this->ticket = $row['Ticket']; + $this->content = $row['Content']; + $this->author = $row['Author']; + $this->timestamp = $row['Timestamp']; + } + + //update private data to DB. + public function update(){ + $dbl = new DBLayer($this->db); + $query = "UPDATE ticket SET Ticket = :ticket, Content = :content, Author = :author, Timestamp = :timestamp WHERE TReplyId=:id"; + $values = Array('id' => $this->tReplyId, 'timestamp' => $this->timestamp, 'ticket' => $this->ticket, 'content' => $this->content, 'author' => $this->author); + $statement = $dbl->execute($query, $values); + } + + ////////////////////////////////////////////Getters//////////////////////////////////////////////////// + + public function getTicket(){ + return $this->ticket; + } + + + public function getContent(){ + return $this->content; + } + + public function getAuthor(){ + return $this->author; + } + + public function getTimestamp(){ + return $this->timestamp; + } + + + public function getTReplyId(){ + return $this->tReplyId; + } + + + ////////////////////////////////////////////Setters//////////////////////////////////////////////////// + + public function setTicket($t){ + $this->ticket = $t; + } + + + public function setContent($c){ + $this->content = $c; + } + + public function setAuthor($a){ + $this->author = $a; + } + + public function setTimestamp($t){ + $this->timestamp = $t; + } + + + public function setTReplyId($i){ + $this->tReplyId = $i; + } +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_user.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_user.php new file mode 100644 index 000000000..b61c99f68 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/ticket_user.php @@ -0,0 +1,101 @@ + $permission, 'ext_id' => $extern_id); + $dbl->execute($query, $values); + + } + + + //return constructed element based on TUserId + public static function constr_TUserId( $id, $db_data) { + $instance = new self($db_data); + $instance->setTUserId($id); + return $instance; + + } + + //return constructed element based on ExternId + public static function constr_ExternId( $id, $db_data ) { + $instance = new self($db_data); + $dbl = new DBLayer($instance->db); + $statement = $dbl->execute("SELECT * FROM ticket_user WHERE ExternId=:id", array('id' => $id)); + $row = $statement->fetch(); + $instance->tUserId = $row['TUserId']; + $instance->permission = $row['Permission']; + $instance->externId = $row['ExternId']; + return $instance; + + } + + + ////////////////////////////////////////////Methods//////////////////////////////////////////////////// + public function __construct($db_data) { + $this->db = $db_data; + } + + //return constructed element based on TUserId + public function load_With_TUserId( $id) { + $dbl = new DBLayer($this->db); + $statement = $dbl->execute("SELECT * FROM ticket_user WHERE TUserId=:id", array('id' => $id)); + $row = $statement->fetch(); + $instance->tUserId = $row['TUserId']; + $instance->permission = $row['Permission']; + $instance->externId = $row['ExternId']; + return $instance; + } + + //update private data to DB. + public function update(){ + $dbl = new DBLayer($this->db); + $query = "UPDATE ticket_user SET Permission = :perm, ExternId = :ext_id WHERE TUserId=:id"; + $values = Array('id' => $this->tUserId, 'perm' => $this->permission, 'ext_id' => $this->externId); + $statement = $dbl->execute($query, $values); + } + + ////////////////////////////////////////////Getters//////////////////////////////////////////////////// + + public function getPermission(){ + if ($this->permission == ""){ + $this->load_With_TUserId($this->tUserId); + } + return $this->permission; + } + + + public function getExternId(){ + if ($this->ExternId == ""){ + $this->load_With_TUserId($this->tUserId); + } + return $this->externId; + } + + + public function getTUserId(){ + return $this->tUserId; + } + + + ////////////////////////////////////////////Setters//////////////////////////////////////////////////// + + public function setPermission($perm){ + $this->permission = $perm; + } + + + public function setExternId($id){ + $this->externId = $id; + } + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/users.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/users.php index 7373bc4a3..9ce16aa37 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/users.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/users.php @@ -156,7 +156,7 @@ class Users{ * @takes $email * @return */ - private function checkEmail( $email ) + public function checkEmail( $email ) { if ( isset( $email ) ){ if ( !Users::validEmail( $email ) ){ @@ -284,12 +284,13 @@ class Users{ * @takes $array with name,pass and mail * @return ok if it's get correctly added to the shard, else return lib offline and put in libDB, if libDB is also offline return liboffline. */ - public function createUser($values){ + public function createUser($values, $user_id){ try { //make connection with and put into shard db global $cfg; $dbs = new DBLayer($cfg['db']['shard']); $dbs->execute("INSERT INTO user (Login, Password, Email) VALUES (:name, :pass, :mail)",$values); + ticket_user::createTicketUser( $user_id , 1, $cfg['db']['lib'] ); return "ok"; } catch (PDOException $e) { @@ -298,6 +299,7 @@ class Users{ $dbl = new DBLayer($cfg['db']['lib']); $dbl->execute("INSERT INTO ams_querycache (type, query) VALUES (:type, :query)",array("type" => "createUser", "query" => json_encode(array($values["name"],$values["pass"],$values["mail"])))); + ticket_user::createTicketUser( $user_id , 1, $cfg['db']['lib'] ); return "shardoffline"; }catch (PDOException $e) { print_r($e); @@ -365,25 +367,51 @@ class Users{ } } - protected function setPassword($user, $pass){ + protected function setAmsPassword($user, $pass){ + + global $cfg; + $values = Array('user' => $user, 'pass' => $pass); + try { //make connection with and put into shard db - global $cfg; $dbs = new DBLayer($cfg['db']['shard']); $dbs->execute("UPDATE user SET Password = :pass WHERE Login = :user ",$values); return "ok"; } catch (PDOException $e) { //oh noooz, the shard is offline! Put in query queue at ams_lib db! - /*try { - $dbl = new DBLayer($cfg['db']['lib']); - $dbl->execute("INSERT INTO ams_querycache (type, query) VALUES (:type, :query)",array("type" => "createUser", - "query" => json_encode(array($values["name"],$values["pass"],$values["mail"])))); + try { + $dbl = new DBLayer($cfg['db']['lib']); + $dbl->execute("INSERT INTO ams_querycache (type, query) VALUES (:type, :query)",array("type" => "change_pass", + "query" => json_encode(array($values["user"],$values["pass"])))); return "shardoffline"; }catch (PDOException $e) { - print_r($e); return "liboffline"; - }*/ + } + } + } + + protected function setAmsEmail($user, $mail){ + + global $cfg; + $values = Array('user' => $user, 'mail' => $mail); + + try { + //make connection with and put into shard db + $dbs = new DBLayer($cfg['db']['shard']); + $dbs->execute("UPDATE user SET Email = :mail WHERE Login = :user ",$values); + return "ok"; + } + catch (PDOException $e) { + //oh noooz, the shard is offline! Put in query queue at ams_lib db! + try { + $dbl = new DBLayer($cfg['db']['lib']); + $dbl->execute("INSERT INTO ams_querycache (type, query) VALUES (:type, :query)",array("type" => "change_mail", + "query" => json_encode(array($values["user"],$values["mail"])))); + return "shardoffline"; + }catch (PDOException $e) { + return "liboffline"; + } } } } diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/en.ini b/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/en.ini index 56c07761f..858c3020f 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/en.ini +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/en.ini @@ -20,14 +20,24 @@ name = "Name" email = "Email" action = "Action" +[show_user] + +[createticket] + +[error] +title404 = "Not
Found!" +title403 = "Forbidden!" +error_message404 = "This is not the page you are looking for.." +error_message403 = "You cannot access this page!" +go_home = "Go Home" [userlist] userlist_info = "welcome to the userlist" [login] login_info = "Please login with your Username and Password." -login_error_message = "The filled in username/password were not correct!" -login_register_message ="RegisterIf you dont have an account yet, create one" +login_error_message = "The username/password were not correct!" +login_register_message ="Register If you don't have an account yet, create one" login_register_message_here = "here" [logout] @@ -67,6 +77,7 @@ email_tooltip = "Email Address to which a confirmation email will be sent." email_message = "Please verify that the e-mail address you enter here is valid and will remain valid in the future. It will only be used to manage your Ryzom Core account." email_default = "Email" -tac_tag = "YES, I agree to the terms of service." +tac_tag1= "YES, I agree to the " +tac_tag2="terms of service" tac_message = "You must accept the Terms of Service." diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/fr.ini b/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/fr.ini index 56c07b555..150a62c6b 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/fr.ini +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/fr.ini @@ -20,6 +20,17 @@ name = "Nom" email = "Email" action = "Action" +[createticket] + +[show_user] + +[error] +title404 = "Pas
trouvez!" +title403 = "Interdit!" +error_message404 = "Ce page que vous cherchez n'existe pas." +error_message403 = "Vous n'avez pas permission d'access ce page!" +go_home = "Allez au main page" + [userlist] userlist_info = "bienvenue sur le userlist page!" @@ -66,5 +77,6 @@ email_tooltip = "Adresse de courriel (pour qui un email de confirmation vous ser email_message = "Veuillez vérifier que l'adresse e-mail que vous entrez ici est valable et restera valable à l'avenir. Elle ne sera utilisée que pour gérer votre compte de base de Ryzom." email_default = "email" -tac_tag = "OUI, j'accepte les termes de service." +tac_tag1 = "OUI, j'accepte les " +tac_tag2 = "termes de service" tac_message = "Vous devez accepter les Conditions d'utilisation." \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/autoload/webusers.php b/code/ryzom/tools/server/ryzom_ams/www/html/autoload/webusers.php index 91c7bc317..6c22c57f8 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/autoload/webusers.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/autoload/webusers.php @@ -50,7 +50,15 @@ class WebUsers extends Users{ } } - + public function getId($username){ + global $cfg; + + $dbw = new DBLayer($cfg['db']['web']); + $statement = $dbw->execute("SELECT * FROM ams_user WHERE Login=:username", array('username' => $username)); + $row = $statement->fetch(); + return $row['UId']; + } + public function getUsername($id){ global $cfg; @@ -60,6 +68,25 @@ class WebUsers extends Users{ return $row['Login']; } + public function getEmail($id){ + global $cfg; + + $dbw = new DBLayer($cfg['db']['web']); + $statement = $dbw->execute("SELECT * FROM ams_user WHERE UId=:id", array('id' => $id)); + $row = $statement->fetch(); + return $row['Email']; + } + + public function getInfo($id){ + global $cfg; + + $dbw = new DBLayer($cfg['db']['web']); + $statement = $dbw->execute("SELECT * FROM ams_user WHERE UId=:id", array('id' => $id)); + $row = $statement->fetch(); + $result = Array('FirstName' => $row['FirstName'], 'LastName' => $row['LastName'], 'Gender' => $row['Gender'], 'Country' => $row['Country']); + return $result; + } + public function isLoggedIn(){ if(isset($_SESSION['user'])){ return true; @@ -74,4 +101,40 @@ class WebUsers extends Users{ return false; } + public function setPassword($user, $pass){ + global $cfg; + $reply = WebUsers::setAmsPassword($user, $pass); + $values = Array('user' => $user, 'pass' => $pass); + try { + //make connection with and put into shard db + $dbw = new DBLayer($cfg['db']['web']); + $dbw->execute("UPDATE ams_user SET Password = :pass WHERE Login = :user ",$values); + } + catch (PDOException $e) { + //ERROR: the web DB is offline + } + return $reply; + } + + public function setEmail($user, $mail){ + global $cfg; + $reply = WebUsers::setAmsEmail($user, $mail); + $values = Array('user' => $user, 'mail' => $mail); + try { + //make connection with and put into shard db + $dbw = new DBLayer($cfg['db']['web']); + $dbw->execute("UPDATE ams_user SET Email = :mail WHERE Login = :user ",$values); + } + catch (PDOException $e) { + //ERROR: the web DB is offline + } + return $reply; + } + + public function getUsers(){ + global $cfg; + $dbl = new DBLayer($cfg['db']['web']); + $data = $dbl->executeWithoutParams("SELECT * FROM ams_user"); + return $data; + } } \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/error.php b/code/ryzom/tools/server/ryzom_ams/www/html/error.php index 4d701a543..b84bd7de7 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/error.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/error.php @@ -73,7 +73,7 @@
The page your are looking for is not found. -
Go Home or
Search
+
Go Home
diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/add_user.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/add_user.php index 1f8d5ce22..e21e32d6a 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/func/add_user.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/add_user.php @@ -36,7 +36,7 @@ function add_user(){ function write_user($newUser){ - + //create salt here, because we want it to be the same on the web/server $hashpass = crypt($newUser["pass"], WebUsers::generateSALT()); @@ -45,16 +45,17 @@ function write_user($newUser){ 'pass' => $hashpass, 'mail' => $newUser["mail"] ); - - //Create the user on the shard + in case shard is offline put copy of query in query db - //returns: ok, shardoffline or liboffline - $result = WebUsers::createUser($params); try{ - //make connection with web db and put it in there global $cfg; + //make connection with web db and put it in there $dbw = new DBLayer($cfg['db']['web']); - $dbw->execute("INSERT INTO ams_user (Login, Password, Email) VALUES (:name, :pass, :mail)",$params); + $user_id = $dbw->executeReturnId("INSERT INTO ams_user (Login, Password, Email) VALUES (:name, :pass, :mail)",$params); + + //Create the user on the shard + in case shard is offline put copy of query in query db + //returns: ok, shardoffline or liboffline + $result = WebUsers::createUser($params, $user_id); + }catch (PDOException $e) { //go to error page or something, because can't access website db diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/change_info.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/change_info.php new file mode 100644 index 000000000..baf28afc2 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/change_info.php @@ -0,0 +1,115 @@ +getInfo($_POST['target_id']); + + + $current_info['FirstName'] = filter_var($current_info['FirstName'], FILTER_SANITIZE_STRING); + $current_info['LastName'] = filter_var($current_info['LastName'], FILTER_SANITIZE_STRING); + $current_info['Country'] = filter_var($current_info['Country'], FILTER_SANITIZE_STRING); + $current_info['Gender'] = filter_var($current_info['Gender'], FILTER_SANITIZE_NUMBER_INT); + + + $updated = false; + $values = Array(); + $values['user'] = $target_username; + + //make the query that will update the data. + $query = "UPDATE ams_user SET "; + if(($_POST['FirstName'] != "") && ($_POST['FirstName'] != $current_info['FirstName'])){ + $query = $query . "FirstName = :fName "; + $updated = true; + $values['fName'] = filter_var($_POST['FirstName'], FILTER_SANITIZE_STRING); + } + if(($_POST['LastName'] != "") && ($_POST['LastName'] != $current_info['LastName'])){ + if($updated){ + $query = $query . ", LastName = :lName "; + }else{ + $query = $query . "LastName = :lName "; + } + $updated = true; + $values['lName'] = filter_var($_POST['LastName'], FILTER_SANITIZE_STRING); + } + if(($_POST['Country'] != "AA") && ($_POST['Country'] != $current_info['Country'])){ + if($updated){ + $query = $query . ", Country = :country "; + }else{ + $query = $query . "Country = :country "; + } + $updated = true; + $values['country'] = filter_var($_POST['Country'], FILTER_SANITIZE_STRING); + } + if($_POST['Gender'] != $current_info['Gender']){ + if($updated){ + $query = $query . ", Gender = :gender "; + }else{ + $query = $query . "Gender = :gender "; + } + $updated = true; + $values['gender'] = filter_var($_POST['Gender'], FILTER_SANITIZE_NUMBER_INT); + } + //finish the query! + $query = $query . "WHERE Login = :user"; + + //if some field is update then: + if($updated){ + global $cfg; + //execute the query in the web DB. + $dbw = new DBLayer($cfg['db']['web']); + $dbw->execute($query,$values); + } + + global $SITEBASE; + require_once($SITEBASE . 'inc/settings.php'); + $result = settings(); + if($updated){ + $result['info_updated'] = "OK"; + } + $result['permission'] = $_SESSION['permission']; + $result['username'] = $_SESSION['user']; + $result['no_visible_elements'] = 'FALSE'; + $result['target_id'] = $_POST['target_id']; + helpers :: loadtemplate( 'settings', $result); + exit; + + }else{ + //ERROR: permission denied! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; + } + + }else{ + //ERROR: The form was not filled in correclty + header("Location: index.php?page=settings"); + exit; + } + }else{ + //ERROR: user is not logged in + header("Location: index.php"); + exit; + } + + }catch (PDOException $e) { + //go to error page or something, because can't access website db + print_r($e); + exit; + } +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/change_mail.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/change_mail.php new file mode 100644 index 000000000..6905febae --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/change_mail.php @@ -0,0 +1,92 @@ +checkEmail($_POST['NewEmail']); + + global $SITEBASE; + require_once($SITEBASE . 'inc/settings.php'); + $result = settings(); + + if ( $reply != "success" ){ + $result['EMAIL_ERROR'] = 'TRUE'; + }else{ + $result['EMAIL_ERROR'] = 'FALSE'; + } + $result['prevNewEmail'] = filter_var($_POST["NewEmail"], FILTER_SANITIZE_EMAIL); + + if ($reply== "success"){ + $status = WebUsers::setEmail($target_username, filter_var($_POST["NewEmail"], FILTER_SANITIZE_EMAIL) ); + if($status == 'ok'){ + $result['SUCCESS_MAIL'] = "OK"; + }else if($status == 'shardoffline'){ + $result['SUCCESS_MAIL'] = "SHARDOFF"; + } + $result['permission'] = $_SESSION['permission']; + $result['no_visible_elements'] = 'FALSE'; + $result['username'] = $_SESSION['user']; + $result['target_id'] = $_POST['target_id']; + if(isset($_GET['id'])){ + if(WebUsers::isAdmin() && ($_POST['target_id'] != $_SESSION['id'])){ + $result['isAdmin'] = "TRUE"; + } + } + helpers :: loadtemplate( 'settings', $result); + exit; + + }else{ + $result['EMAIL'] = $reply; + $result['permission'] = $_SESSION['permission']; + $result['no_visible_elements'] = 'FALSE'; + $result['username'] = $_SESSION['user']; + $result['target_id'] = $_POST['target_id']; + if(isset($_GET['id'])){ + if(WebUsers::isAdmin() && ($_POST['target_id'] != $_SESSION['id'])){ + $result['isAdmin'] = "TRUE"; + } + } + helpers :: loadtemplate( 'settings', $result); + exit; + } + + }else{ + //ERROR: permission denied! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; + } + + }else{ + //ERROR: The form was not filled in correclty + header("Location: index.php?page=settings"); + exit; + } + }else{ + //ERROR: user is not logged in + header("Location: index.php"); + exit; + } + + }catch (PDOException $e) { + //go to error page or something, because can't access website db + print_r($e); + exit; + } + +} + diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/change_password.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/change_password.php index 3603c5144..57e675123 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/func/change_password.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/change_password.php @@ -18,44 +18,64 @@ function change_password(){ $adminChangesOther = true; $_POST["CurrentPass"] = "dummypass"; } - $id = $_POST['target_id']; $webUser = new WebUsers(); $params = Array( 'user' => $target_username, 'CurrentPass' => $_POST["CurrentPass"], 'NewPass' => $_POST["NewPass"], 'ConfirmNewPass' => $_POST["ConfirmNewPass"], 'adminChangesOther' => $adminChangesOther); $result = $webUser->check_change_password($params); if ($result == "success"){ //edit stuff into db + global $SITEBASE; + require_once($SITEBASE . 'inc/settings.php'); + $succresult = settings(); $hashpass = crypt($_POST["NewPass"], WebUsers::generateSALT()); - print('success!'); + $status = WebUsers::setPassword($target_username, $hashpass); + if($status == 'ok'){ + $succresult['SUCCESS_PASS'] = "OK"; + }else if($status == 'shardoffline'){ + $succresult['SUCCESS_PASS'] = "SHARDOFF"; + } + $succresult['permission'] = $_SESSION['permission']; + $succresult['no_visible_elements'] = 'FALSE'; + $succresult['username'] = $_SESSION['user']; + $succresult['target_id'] = $_POST['target_id']; + helpers :: loadtemplate( 'settings', $succresult); exit; }else{ - - $result['prevCurrentPass'] = $_POST["CurrentPass"]; - $result['prevNewPass'] = $_POST["NewPass"]; - $result['prevConfirmNewPass'] = $_POST["ConfirmNewPass"]; + + $result['prevCurrentPass'] = filter_var($_POST["CurrentPass"], FILTER_SANITIZE_STRING); + $result['prevNewPass'] = filter_var($_POST["NewPass"], FILTER_SANITIZE_STRING); + $result['prevConfirmNewPass'] = filter_var($_POST["ConfirmNewPass"], FILTER_SANITIZE_STRING); $result['permission'] = $_SESSION['permission']; $result['no_visible_elements'] = 'FALSE'; + $result['username'] = $_SESSION['user']; $result['target_id'] = $_POST['target_id']; - if(isset($_GET['id'])){ - if(WebUsers::isAdmin() && ($_POST['target_id'] != $_SESSION['id'])){ - $result['isAdmin'] = "TRUE"; - } - } + + global $SITEBASE; + require_once($SITEBASE . 'inc/settings.php'); + $settings = settings(); + + $result = array_merge($result,$settings); helpers :: loadtemplate( 'settings', $result); exit; } }else{ //ERROR: permission denied! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; } }else{ //ERROR: The form was not filled in correclty + header("Location: index.php?page=settings"); + exit; } }else{ //ERROR: user is not logged in - exit; + header("Location: index.php"); + exit; } }catch (PDOException $e) { diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/create_ticket.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/create_ticket.php new file mode 100644 index 000000000..8f8010889 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/create_ticket.php @@ -0,0 +1,48 @@ +getTUserId(); + }else{ + $author= Ticket_User::constr_ExternId($_POST['target_id'], $cfg['db']['lib'])->getTUserId(); + } + Ticket::create_Ticket($title, $content, $category, $author, $cfg['db']['lib'] ); + }catch (PDOException $e) { + //ERROR: LIB DB is not online! + header("Location: index.php"); + exit; + } + + }else{ + //ERROR: permission denied! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; + } + + }else{ + //ERROR: The form was not filled in correclty + header("Location: index.php?page=settings"); + exit; + } + }else{ + //ERROR: user is not logged in + header("Location: index.php"); + exit; + } + +} + diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/login.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/login.php index a34203541..eb9be221f 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/func/login.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/login.php @@ -11,13 +11,14 @@ function login(){ $_SESSION['user'] = $_POST["Username"]; $_SESSION['permission'] = $result['Permission']; $_SESSION['id'] = $result['UId']; - print('id='); - print($_SESSION['id']); + $_SESSION['ticket_user'] = Ticket_User::constr_ExternId($result['UId'],$cfg['db']['lib']); + //go back to the index page. header( 'Location: index.php' ); exit; }else{ //handle login failure + $result = Array(); $result['login_error'] = 'TRUE'; $result['no_visible_elements'] = 'TRUE'; helpers :: loadtemplate( 'login', $result); diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/createticket.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/createticket.php new file mode 100644 index 000000000..4647bbfaf --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/createticket.php @@ -0,0 +1,45 @@ +getTCategoryId()] = $catObj->getName(); + } + + return $result; + + }else{ + //ERROR: not logged in! + header("Location: index.php"); + exit; + } + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/error.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/error.php new file mode 100644 index 000000000..eca129ff6 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/error.php @@ -0,0 +1,12 @@ +executeWithoutParams("SELECT * FROM ams_querycache")->rowCount(); - - //the array hat will contain all users - $pageResult['liblist'] = Array(); - if($rows > 0){ - //This is the number of results displayed per page - $page_rows = 2; - - //This tells us the page number of our last page - $last = ceil($rows/$page_rows); - - //this makes sure the page number isn't below one, or more than our maximum pages - if ($pagenum < 1) - { + if(WebUsers::isAdmin()){ + //This checks to see if there is a page number. If not, it will set it to page 1 + if (!(isset($_GET['pagenum']))){ $pagenum = 1; - }else if ($pagenum > $last) { - $pagenum = $last; - } - - //This sets the range to display in our query - $max = 'limit ' .($pagenum - 1) * $page_rows .',' .$page_rows; - - //This is your query again, the same one... the only difference is we add $max into it - $data = $dbl->executeWithoutParams("SELECT * FROM ams_querycache $max"); - - //This is where we put the results in a resultArray to be sent to smarty - - $i = 0; - while($row = $data->fetch(PDO::FETCH_ASSOC)){ - $decode = json_decode($row['query']); - $pageResult['liblist'][$i]['id'] = $row['SID']; - $pageResult['liblist'][$i]['type'] = $row['type']; - $pageResult['liblist'][$i]['name'] = $decode[0]; - $pageResult['liblist'][$i]['mail'] = $decode[2]; - $i++; + }else{ + $pagenum = $_GET['pagenum']; } + + //Here we count the number of results + global $cfg; + $dbl = new DBLayer($cfg['db']['lib']); + $rows = $dbl->executeWithoutParams("SELECT * FROM ams_querycache")->rowCount(); + + //the array hat will contain all users + $pageResult['liblist'] = Array(); + if($rows > 0){ + //This is the number of results displayed per page + $page_rows = 2; + + //This tells us the page number of our last page + $last = ceil($rows/$page_rows); + + //this makes sure the page number isn't below one, or more than our maximum pages + if ($pagenum < 1) + { + $pagenum = 1; + }else if ($pagenum > $last) { + $pagenum = $last; + } + + //This sets the range to display in our query + $max = 'limit ' .($pagenum - 1) * $page_rows .',' .$page_rows; + + //This is your query again, the same one... the only difference is we add $max into it + $data = $dbl->executeWithoutParams("SELECT * FROM ams_querycache $max"); + + //This is where we put the results in a resultArray to be sent to smarty + + $i = 0; + while($row = $data->fetch(PDO::FETCH_ASSOC)){ + $decode = json_decode($row['query']); + $pageResult['liblist'][$i]['id'] = $row['SID']; + $pageResult['liblist'][$i]['type'] = $row['type']; + //$pageResult['liblist'][$i]['name'] = $decode[0]; + //$pageResult['liblist'][$i]['mail'] = $decode[2]; + $i++; + } + } + + //check if shard is online + try{ + $dbs = new DBLayer($cfg['db']['shard']); + $pageResult['shard'] = "online"; + }catch(PDOException $e) { + $pageResult['shard'] = "offline"; + } + return $pageResult; + }else{ + //ERROR: No access! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; } - - //check if shard is online - try{ - $dbs = new DBLayer($cfg['db']['shard']); - $pageResult['shard'] = "online"; - }catch(PDOException $e) { - $pageResult['shard'] = "offline"; - } - return $pageResult; } \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/settings.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/settings.php index 2248b7d70..90bafbefc 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/inc/settings.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/settings.php @@ -4,18 +4,288 @@ function settings(){ if(WebUsers::isLoggedIn()){ //in case id-GET param set it's value as target_id, if no id-param is given, ue the session id. if(isset($_GET['id'])){ - if(WebUsers::isAdmin() && ($_GET['id']!= $_SESSION['id'])){ - $result['isAdmin'] = "TRUE"; + if(($_GET['id'] != $_SESSION['id']) && (!WebUsers::isAdmin()) ){ + //ERROR: No access! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; + }else{ + $result = WebUsers::getInfo($_GET['id']); + if(WebUsers::isAdmin() && ($_GET['id']!= $_SESSION['id'])){ + $result['isAdmin'] = "TRUE"; + } + $result['target_id'] = $_GET['id']; + $result['current_mail'] = WebUsers::getEmail($_GET['id']); } - $result['target_id'] = $_GET['id']; }else{ + $result = WebUsers::getInfo($_SESSION['id']); $result['target_id'] = $_SESSION['id']; + $result['current_mail'] = WebUsers::getEmail($_SESSION['id']); + + //Sanitize Data + $result['current_mail'] = filter_var($result['current_mail'], FILTER_SANITIZE_EMAIL); + //$result['Login'] = filter_var($result['Login'], FILTER_SANITIZE_STRING); + $result['FirstName'] = filter_var($result['FirstName'], FILTER_SANITIZE_STRING); + $result['LastName'] = filter_var($result['LastName'], FILTER_SANITIZE_STRING); + $result['Country'] = filter_var($result['Country'], FILTER_SANITIZE_STRING); + $result['Gender'] = filter_var($result['Gender'], FILTER_SANITIZE_NUMBER_INT); } - + $result['country_array'] = getCountryArray(); return $result; }else{ //ERROR: not logged in! - print("not logged in!"); + header("Location: index.php"); exit; } -} \ No newline at end of file +} + + +function getCountryArray(){ + +$countries = array( +'AA'=>'None Selected', +'AF'=>'Afghanistan', +'AL'=>'Albania', +'DZ'=>'Algeria', +'AS'=>'American Samoa', +'AD'=>'Andorra', +'AO'=>'Angola', +'AI'=>'Anguilla', +'AQ'=>'Antarctica', +'AG'=>'Antigua And Barbuda', +'AR'=>'Argentina', +'AM'=>'Armenia', +'AW'=>'Aruba', +'AU'=>'Australia', +'AT'=>'Austria', +'AZ'=>'Azerbaijan', +'BS'=>'Bahamas', +'BH'=>'Bahrain', +'BD'=>'Bangladesh', +'BB'=>'Barbados', +'BY'=>'Belarus', +'BE'=>'Belgium', +'BZ'=>'Belize', +'BJ'=>'Benin', +'BM'=>'Bermuda', +'BT'=>'Bhutan', +'BO'=>'Bolivia', +'BA'=>'Bosnia And Herzegovina', +'BW'=>'Botswana', +'BV'=>'Bouvet Island', +'BR'=>'Brazil', +'IO'=>'British Indian Ocean Territory', +'BN'=>'Brunei', +'BG'=>'Bulgaria', +'BF'=>'Burkina Faso', +'BI'=>'Burundi', +'KH'=>'Cambodia', +'CM'=>'Cameroon', +'CA'=>'Canada', +'CV'=>'Cape Verde', +'KY'=>'Cayman Islands', +'CF'=>'Central African Republic', +'TD'=>'Chad', +'CL'=>'Chile', +'CN'=>'China', +'CX'=>'Christmas Island', +'CC'=>'Cocos (Keeling) Islands', +'CO'=>'Columbia', +'KM'=>'Comoros', +'CG'=>'Congo', +'CK'=>'Cook Islands', +'CR'=>'Costa Rica', +'CI'=>'Cote D\'Ivorie (Ivory Coast)', +'HR'=>'Croatia (Hrvatska)', +'CU'=>'Cuba', +'CY'=>'Cyprus', +'CZ'=>'Czech Republic', +'CD'=>'Democratic Republic Of Congo (Zaire)', +'DK'=>'Denmark', +'DJ'=>'Djibouti', +'DM'=>'Dominica', +'DO'=>'Dominican Republic', +'TP'=>'East Timor', +'EC'=>'Ecuador', +'EG'=>'Egypt', +'SV'=>'El Salvador', +'GQ'=>'Equatorial Guinea', +'ER'=>'Eritrea', +'EE'=>'Estonia', +'ET'=>'Ethiopia', +'FK'=>'Falkland Islands (Malvinas)', +'FO'=>'Faroe Islands', +'FJ'=>'Fiji', +'FI'=>'Finland', +'FR'=>'France', +'FX'=>'France, Metropolitan', +'GF'=>'French Guinea', +'PF'=>'French Polynesia', +'TF'=>'French Southern Territories', +'GA'=>'Gabon', +'GM'=>'Gambia', +'GE'=>'Georgia', +'DE'=>'Germany', +'GH'=>'Ghana', +'GI'=>'Gibraltar', +'GR'=>'Greece', +'GL'=>'Greenland', +'GD'=>'Grenada', +'GP'=>'Guadeloupe', +'GU'=>'Guam', +'GT'=>'Guatemala', +'GN'=>'Guinea', +'GW'=>'Guinea-Bissau', +'GY'=>'Guyana', +'HT'=>'Haiti', +'HM'=>'Heard And McDonald Islands', +'HN'=>'Honduras', +'HK'=>'Hong Kong', +'HU'=>'Hungary', +'IS'=>'Iceland', +'IN'=>'India', +'ID'=>'Indonesia', +'IR'=>'Iran', +'IQ'=>'Iraq', +'IE'=>'Ireland', +'IL'=>'Israel', +'IT'=>'Italy', +'JM'=>'Jamaica', +'JP'=>'Japan', +'JO'=>'Jordan', +'KZ'=>'Kazakhstan', +'KE'=>'Kenya', +'KI'=>'Kiribati', +'KW'=>'Kuwait', +'KG'=>'Kyrgyzstan', +'LA'=>'Laos', +'LV'=>'Latvia', +'LB'=>'Lebanon', +'LS'=>'Lesotho', +'LR'=>'Liberia', +'LY'=>'Libya', +'LI'=>'Liechtenstein', +'LT'=>'Lithuania', +'LU'=>'Luxembourg', +'MO'=>'Macau', +'MK'=>'Macedonia', +'MG'=>'Madagascar', +'MW'=>'Malawi', +'MY'=>'Malaysia', +'MV'=>'Maldives', +'ML'=>'Mali', +'MT'=>'Malta', +'MH'=>'Marshall Islands', +'MQ'=>'Martinique', +'MR'=>'Mauritania', +'MU'=>'Mauritius', +'YT'=>'Mayotte', +'MX'=>'Mexico', +'FM'=>'Micronesia', +'MD'=>'Moldova', +'MC'=>'Monaco', +'MN'=>'Mongolia', +'MS'=>'Montserrat', +'MA'=>'Morocco', +'MZ'=>'Mozambique', +'MM'=>'Myanmar (Burma)', +'NA'=>'Namibia', +'NR'=>'Nauru', +'NP'=>'Nepal', +'NL'=>'Netherlands', +'AN'=>'Netherlands Antilles', +'NC'=>'New Caledonia', +'NZ'=>'New Zealand', +'NI'=>'Nicaragua', +'NE'=>'Niger', +'NG'=>'Nigeria', +'NU'=>'Niue', +'NF'=>'Norfolk Island', +'KP'=>'North Korea', +'MP'=>'Northern Mariana Islands', +'NO'=>'Norway', +'OM'=>'Oman', +'PK'=>'Pakistan', +'PW'=>'Palau', +'PA'=>'Panama', +'PG'=>'Papua New Guinea', +'PY'=>'Paraguay', +'PE'=>'Peru', +'PH'=>'Philippines', +'PN'=>'Pitcairn', +'PL'=>'Poland', +'PT'=>'Portugal', +'PR'=>'Puerto Rico', +'QA'=>'Qatar', +'RE'=>'Reunion', +'RO'=>'Romania', +'RU'=>'Russia', +'RW'=>'Rwanda', +'SH'=>'Saint Helena', +'KN'=>'Saint Kitts And Nevis', +'LC'=>'Saint Lucia', +'PM'=>'Saint Pierre And Miquelon', +'VC'=>'Saint Vincent And The Grenadines', +'SM'=>'San Marino', +'ST'=>'Sao Tome And Principe', +'SA'=>'Saudi Arabia', +'SN'=>'Senegal', +'SC'=>'Seychelles', +'SL'=>'Sierra Leone', +'SG'=>'Singapore', +'SK'=>'Slovak Republic', +'SI'=>'Slovenia', +'SB'=>'Solomon Islands', +'SO'=>'Somalia', +'ZA'=>'South Africa', +'GS'=>'South Georgia And South Sandwich Islands', +'KR'=>'South Korea', +'ES'=>'Spain', +'LK'=>'Sri Lanka', +'SD'=>'Sudan', +'SR'=>'Suriname', +'SJ'=>'Svalbard And Jan Mayen', +'SZ'=>'Swaziland', +'SE'=>'Sweden', +'CH'=>'Switzerland', +'SY'=>'Syria', +'TW'=>'Taiwan', +'TJ'=>'Tajikistan', +'TZ'=>'Tanzania', +'TH'=>'Thailand', +'TG'=>'Togo', +'TK'=>'Tokelau', +'TO'=>'Tonga', +'TT'=>'Trinidad And Tobago', +'TN'=>'Tunisia', +'TR'=>'Turkey', +'TM'=>'Turkmenistan', +'TC'=>'Turks And Caicos Islands', +'TV'=>'Tuvalu', +'UG'=>'Uganda', +'UA'=>'Ukraine', +'AE'=>'United Arab Emirates', +'UK'=>'United Kingdom', +'US'=>'United States', +'UM'=>'United States Minor Outlying Islands', +'UY'=>'Uruguay', +'UZ'=>'Uzbekistan', +'VU'=>'Vanuatu', +'VA'=>'Vatican City (Holy See)', +'VE'=>'Venezuela', +'VN'=>'Vietnam', +'VG'=>'Virgin Islands (British)', +'VI'=>'Virgin Islands (US)', +'WF'=>'Wallis And Futuna Islands', +'EH'=>'Western Sahara', +'WS'=>'Western Samoa', +'YE'=>'Yemen', +'YU'=>'Yugoslavia', +'ZM'=>'Zambia', +'ZW'=>'Zimbabwe' +); + +return $countries; + +} + diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_user.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_user.php new file mode 100644 index 000000000..a0d9c9132 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/show_user.php @@ -0,0 +1,63 @@ +getTUserId(),$cfg['db']['lib']); + $i = 0; + $result['ticketlist'] = Array(); + foreach($ticketlist as $ticket){ + $result['ticketlist'][$i]['tId'] = $ticket->getTId(); + $result['ticketlist'][$i]['timestamp'] = $ticket->getTimestamp(); + $result['ticketlist'][$i]['title'] = $ticket->getTitle(); + + //get the status + $statusId = $ticket->getStatus(); + if ($statusId == 0){ + $status = "Waiting on support.."; + }else if($statusId == 1){ + $status = "Being handled.."; + }else if($statusId == 2){ + $status = "Closed"; + } + + $result['ticketlist'][$i]['statusText'] = $status; + $result['ticketlist'][$i]['status'] = $statusId; + //get the category + $category = Ticket_Category::constr_TCategoryId($ticket->getTicket_Category(), $cfg['db']['lib']); + $result['ticketlist'][$i]['category'] = $category->getName(); + $i++; + } + + return $result; + + }else{ + //ERROR: No access! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; + } + }else{ + //ERROR: not logged in! + header("Location: index.php"); + exit; + } +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/userlist.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/userlist.php new file mode 100644 index 000000000..e2c2cbfcb --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/userlist.php @@ -0,0 +1,22 @@ +fetch(PDO::FETCH_ASSOC)){ + $pageResult['userlist'][$i]['id'] = $row['UId']; + $pageResult['userlist'][$i]['username'] = $row['Login']; + $pageResult['userlist'][$i]['permission'] = $row['Permission']; + $pageResult['userlist'][$i]['email'] = $row['Email']; + $i++; + } + return $pageResult; + }else{ + //ERROR: No access! + $_SESSION['error_code'] = "403"; + header("Location: index.php?page=error"); + exit; + } +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/index.php b/code/ryzom/tools/server/ryzom_ams/www/html/index.php index d7f234d0d..040989bbb 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/index.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/index.php @@ -50,5 +50,11 @@ if($page == 'login' || $page == 'register' || $page == 'logout'){ }else{ $return['no_visible_elements'] = 'FALSE'; } + +//handle error page +if($page == 'error'){ + $return['permission'] = 0; + $return['no_visible_elements'] = 'FALSE'; +} //print_r($return); helpers :: loadTemplate( $page , $return ); diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/sql/DBScheme.png b/code/ryzom/tools/server/ryzom_ams/www/html/sql/DBScheme.png new file mode 100644 index 0000000000000000000000000000000000000000..340e67c5c6f832c1b159f85c0535c1e6ab755a6f GIT binary patch literal 114396 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 literal 0 HcmV?d00001 diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/createticket.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/createticket.tpl new file mode 100644 index 000000000..0b2ad2813 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/createticket.tpl @@ -0,0 +1,59 @@ +{block name=content} +

+
+ +
+
+
+ New ticket + +
+ +
+
+ +
+
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + +
+ +
+ +
+
+
+
+
+
+
+{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/error.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/error.tpl new file mode 100644 index 000000000..375815af3 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/error.tpl @@ -0,0 +1,86 @@ + + + + + + + Error + + + +

+ {$error_code} +

+ {if $error_code eq "404"} +

{$title404}

+
+
+ {$error_message404} + {else if $error_code eq "403"} +

{$title403}

+
+
+ {$error_message403} + {/if} +
{$go_home} +
+ + + \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout.tpl index c15e668cb..32088c7b8 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout.tpl +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout.tpl @@ -96,8 +96,7 @@
diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout_admin.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout_admin.tpl index b2c79ba00..cd7bc60ad 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout_admin.tpl +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout_admin.tpl @@ -2,9 +2,11 @@ {block name=menu}
  • Dashboard
  • +
  • Profile
  • Settings
  • Liblist
  • +
  • UserList
  • Logout
  • diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout_user.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout_user.tpl index 460a9b10b..8da6ca313 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout_user.tpl +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/layout_user.tpl @@ -2,9 +2,10 @@ {block name=menu}
  • Dashboard
  • +
  • Profile
  • Settings
  • -
  • Demo Userlist
  • +
  • Create New Ticket
  • Logout
  • {/block} diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/libuserlist.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/libuserlist.tpl index e8dee32fd..645de53f2 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/templates/libuserlist.tpl +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/libuserlist.tpl @@ -51,9 +51,6 @@ {$id} {$type} - {$name} - {$email} - {$action} @@ -61,11 +58,7 @@ {$element.id} {$element.type} - {$element.name} - {$element.mail} - - Delete - + {/foreach} diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/register.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/register.tpl index 5a154bb92..c97323520 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/templates/register.tpl +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/register.tpl @@ -64,7 +64,7 @@ isset($TAC) and $TAC eq "success"}success{else}{/if}">
    - {$tac_tag} + {$tac_tag1}{$tac_tag2}
    diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/settings.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/settings.tpl index c0e4f7a7b..f9ad610d9 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/templates/settings.tpl +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/settings.tpl @@ -50,6 +50,20 @@ + + + {if isset($SUCCESS_PASS) and $SUCCESS_PASS eq "OK"} +
    + The password has been changed! +
    + {/if} + + {if isset($SUCCESS_PASS) and $SUCCESS_PASS eq "SHARDOFF"} +
    + The password has been changed, though the shard seems offline, it may take some time to see the change on the shard. +
    + {/if} +
    @@ -73,18 +87,34 @@
    -
    + Change Email -
    +
    - -
    + + {if isset($EMAIL_ERROR) and $EMAIL_ERROR eq "TRUE"}{$EMAIL}{/if} + +
    -
    - +
    + + {if isset($SUCCESS_MAIL) and $SUCCESS_MAIL eq "OK"} +
    + The email has been changed! +
    + {/if} + + {if isset($SUCCESS_MAIL) and $SUCCESS_MAIL eq "SHARDOFF"} +
    + The email has been changed, though the shard seems offline, it may take some time to see the change on the shard. +
    + {/if} + + +
    @@ -106,7 +136,7 @@
    - + Change Info
    @@ -114,7 +144,7 @@
    - +
    @@ -124,7 +154,7 @@
    - +
    @@ -132,257 +162,10 @@
    - + {foreach from=$country_array key=k item=v} + + {/foreach}
    @@ -391,24 +174,30 @@
    - - + {if isset($info_updated) and $info_updated eq "OK"} +
    + The Info has been updated! +
    + {/if} + + +
    diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_user.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_user.tpl new file mode 100644 index 000000000..0b2a57c2b --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/show_user.tpl @@ -0,0 +1,117 @@ +{block name=content} +
    +
    +
    +

    Profile of {$target_name}

    +
    + + +
    +
    +
    +
    + Info + + + + + + + {if $firstName neq ""} + + + + + {/if} + {if $lastName neq ""} + + + + + {/if} + {if $country neq ""} + + + + + {/if} + {if $gender neq 0} + + + {if $gender eq 1} + + {else if $gender eq 2} + + {/if} + + {/if} + +
    Email:{$mail}
    Firstname:{$firstName}
    LastName:{$lastName}
    Country:{$country}
    Gender:♂♀
    +
    +
    +
    + +
    +
    +

    Actions

    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    +
    +
    +

    Tickets of {$target_name}

    +
    + + +
    +
    +
    +
    + Tickets + + + + + + + + + + + {foreach from=$ticketlist item=ticket} + + + + + + + + {/foreach} + + +
    TitleTimestampCategoryStatus
    {$ticket.title}{$ticket.timestamp}{$ticket.category}{$ticket.statusText}
    +
    +
    +
    +
    +{/block} + diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/userlist.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/userlist.tpl index 891bbd04b..d09c46abe 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/templates/userlist.tpl +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/userlist.tpl @@ -1,22 +1,46 @@ {block name=content} - -
    -
    -
    -

    {$userlist_info}

    -
    - - - - -
    -
    -
    -

    The shard/lib/web db user list You are about to see it here!

    - -
    -
    -
    -
    +
    +
    +
    +

    Members

    +
    + + + +
    +
    +
    + + + + + + + + + + + + {foreach from=$userlist item=element} + + + + + {if $element.permission eq 1}{/if} + {if $element.permission eq 2}{/if} + + + + {/foreach} + + +
    IdUsernameEmailPermissionAction
    {$element.id}{$element.username}{$element.email}UserAdmin + Show User + Edit User +
    +
    +
    + +
    {/block}

    -hiS09>%#|~z28ktk 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%0Aj{7| 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 z6BLCNdxinhNsfexecuteWithoutParams($sql); print "The Lib & Web database were correctly installed!
    "; @@ -51,7 +256,7 @@ 'pass' => $hashpass, 'mail' => "admin@admin.com", ); - Users::createUser($params); + Users::createUser($params, 1); try{ $params['permission'] = 2; $dbw = new DBLayer($cfg['db']['web']); diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql b/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql new file mode 100644 index 000000000..0f22a9741 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql @@ -0,0 +1,209 @@ +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL'; + +CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ; +USE `mydb` ; + +-- ----------------------------------------------------- +-- Table `mydb`.`ticket_category` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `mydb`.`ticket_category` ; + +CREATE TABLE IF NOT EXISTS `mydb`.`ticket_category` ( + `TCategoryId` INT NOT NULL AUTO_INCREMENT , + `Name` VARCHAR(45) NOT NULL , + PRIMARY KEY (`TCategoryId`) , + UNIQUE INDEX `Name_UNIQUE` (`Name` ASC) ) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `mydb`.`ticket_user` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `mydb`.`ticket_user` ; + +CREATE TABLE IF NOT EXISTS `mydb`.`ticket_user` ( + `TUserId` INT(10) NOT NULL AUTO_INCREMENT , + `Permission` INT(3) NOT NULL DEFAULT 1 , + `ExternId` INT(10) NOT NULL , + PRIMARY KEY (`TUserId`) ) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `mydb`.`ticket` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `mydb`.`ticket` ; + +CREATE TABLE IF NOT EXISTS `mydb`.`ticket` ( + `TId` INT NOT NULL AUTO_INCREMENT , + `Timestamp` TIMESTAMP NOT NULL , + `Title` VARCHAR(120) NOT NULL , + `Status` INT NULL DEFAULT 0 , + `Queue` INT NULL DEFAULT 0 , + `Ticket_Category` INT NOT NULL , + `Author` INT NOT NULL , + PRIMARY KEY (`TId`) , + INDEX `fk_ticket_ticket_category_idx` (`Ticket_Category` ASC) , + INDEX `fk_ticket_ams_user_idx` (`Author` ASC) , + CONSTRAINT `fk_ticket_ticket_category` + FOREIGN KEY (`Ticket_Category` ) + REFERENCES `mydb`.`ticket_category` (`TCategoryId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_ticket_ams_user` + FOREIGN KEY (`Author` ) + REFERENCES `mydb`.`ticket_user` (`TUserId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `mydb`.`assigned` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `mydb`.`assigned` ; + +CREATE TABLE IF NOT EXISTS `mydb`.`assigned` ( + `Ticket` INT NOT NULL , + `User` INT NOT NULL , + INDEX `fk_assigned_ticket_idx` (`Ticket` ASC) , + PRIMARY KEY (`Ticket`, `User`) , + INDEX `fk_assigned_ams_user_idx` (`User` ASC) , + CONSTRAINT `fk_assigned_ticket` + FOREIGN KEY (`Ticket` ) + REFERENCES `mydb`.`ticket` (`TId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_assigned_ams_user` + FOREIGN KEY (`User` ) + REFERENCES `mydb`.`ticket_user` (`TUserId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `mydb`.`tag` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `mydb`.`tag` ; + +CREATE TABLE IF NOT EXISTS `mydb`.`tag` ( + `TagId` INT NOT NULL AUTO_INCREMENT , + `Value` VARCHAR(60) NOT NULL , + PRIMARY KEY (`TagId`) , + UNIQUE INDEX `Value_UNIQUE` (`Value` ASC) ) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `mydb`.`tagged` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `mydb`.`tagged` ; + +CREATE TABLE IF NOT EXISTS `mydb`.`tagged` ( + `Ticket` INT NOT NULL , + `Tag` INT NOT NULL , + PRIMARY KEY (`Ticket`, `Tag`) , + INDEX `fk_tagged_tag_idx` (`Tag` ASC) , + CONSTRAINT `fk_tagged_ticket` + FOREIGN KEY (`Ticket` ) + REFERENCES `mydb`.`ticket` (`TId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_tagged_tag` + FOREIGN KEY (`Tag` ) + REFERENCES `mydb`.`tag` (`TagId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `mydb`.`ticket_content` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `mydb`.`ticket_content` ; + +CREATE TABLE IF NOT EXISTS `mydb`.`ticket_content` ( + `TContentId` INT NOT NULL AUTO_INCREMENT , + `Content` TEXT NULL , + PRIMARY KEY (`TContentId`) ) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8; + + +-- ----------------------------------------------------- +-- Table `mydb`.`ticket_reply` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `mydb`.`ticket_reply` ; + +CREATE TABLE IF NOT EXISTS `mydb`.`ticket_reply` ( + `TReplyId` INT NOT NULL AUTO_INCREMENT , + `Ticket` INT NOT NULL , + `Author` INT NOT NULL , + `Content` INT NOT NULL , + `Timestamp` TIMESTAMP NULL , + PRIMARY KEY (`TReplyId`) , + INDEX `fk_ticket_reply_ticket_idx` (`Ticket` ASC) , + INDEX `fk_ticket_reply_ams_user_idx` (`Author` ASC) , + INDEX `fk_ticket_reply_content_idx` (`Content` ASC) , + CONSTRAINT `fk_ticket_reply_ticket` + FOREIGN KEY (`Ticket` ) + REFERENCES `mydb`.`ticket` (`TId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_ticket_reply_ams_user` + FOREIGN KEY (`Author` ) + REFERENCES `mydb`.`ticket_user` (`TUserId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_ticket_reply_ticket_content` + FOREIGN KEY (`Content` ) + REFERENCES `mydb`.`ticket_content` (`TContentId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `mydb`.`ticket_group` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `mydb`.`ticket_group` ; + +CREATE TABLE IF NOT EXISTS `mydb`.`ticket_group` ( + `TGroupId` INT NOT NULL AUTO_INCREMENT , + `Title` VARCHAR(80) NOT NULL , + PRIMARY KEY (`TGroupId`) , + UNIQUE INDEX `Title_UNIQUE` (`Title` ASC) ) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `mydb`.`in_group` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `mydb`.`in_group` ; + +CREATE TABLE IF NOT EXISTS `mydb`.`in_group` ( + `Ticket_Group` INT NOT NULL , + `Ticket` INT NOT NULL , + PRIMARY KEY (`Ticket_Group`, `Ticket`) , + INDEX `fk_in_group_ticket_group_idx` (`Ticket_Group` ASC) , + INDEX `fk_in_group_ticket_idx` (`Ticket` ASC) , + CONSTRAINT `fk_in_group_ticket_group` + FOREIGN KEY (`Ticket_Group` ) + REFERENCES `mydb`.`ticket_group` (`TGroupId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_in_group_ticket` + FOREIGN KEY (`Ticket` ) + REFERENCES `mydb`.`ticket` (`TId` ) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsystemmodel.mwb b/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsystemmodel.mwb new file mode 100644 index 0000000000000000000000000000000000000000..53f58f0371074bb0e1fc828a87e13229d3ac9720 GIT binary patch literal 12381 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