View previous topic :: View next topic |
Author |
Message |
TRUSTAbyss -
Joined: 29 Oct 2003 Posts: 3752 Location: USA, GA
|
Posted: Thu Nov 09, 2006 11:19 pm Post subject: PHP Function to Read Abyss's Users. |
|
|
Hello Everyone,
I've been learning some SimpleXML last night and decided to share some of
my work with the Abyss Web Server community. I've written a function that will
read your "abyss.conf" and output all User Accounts per Host.
This is very helpful if you wish to read abyss.conf and use those accounts with
your own PHP scripts. My function creates an Associated Array with every single
User Account you add per Host. Enjoy!
Note: PHP5 is required in order to use this function.
Code: | <pre>
<?php
/**
* The abyss_user_accounts() Function
* Created by: Josh (TRUSTAbyss)
*/
function abyss_user_accounts($file, $host_id) {
$xml = simplexml_load_file($file);
$output = array();
if (count($xml->server->host[$host_id]->users->user) > 0) {
foreach ($xml->server->host[$host_id]->users->user as $account) {
$user = trim((string) $account->name);
$pass = trim((string) $account->password);
$output["user"][] = $user;
$output["pass"][] = $pass;
}
return $output;
}
else {
return FALSE;
}
}
// Add the path to your abyss.conf file.
$file = "C:\\Program Files\\Abyss Web Server\\abyss.conf";
// Let's lookup the current Host so we know which Users to Pull.
$host_id = $_SERVER['INSTANCE_ID'] - 1;
// This just assigns $output variable, the array of the accounts
$output = @abyss_user_accounts($file, $host_id);
// Last but not least, output it!
print_r($output);
// Let's retrieve the first User Account. This is easy! lol
echo "<br>";
echo "Username: " . $output['user'][0] . "\n";
echo "Password: " . $output['pass'][0];
?>
</pre>
|
Edit: To create an Abyss Web Server user account. Use this code.
Code: | <?php
function create_abyss_password($user, $pass) {
return md5(base64_encode("$user:$pass"));
}
// Let's create an Abyss Web Server password
// Syntax: abyss_create_password("Username", "Password")
$user = "Josh"; // Username to use
$pass = "password here"; // User's Password in plain Text
echo "Username ".$user." has the password ".abyss_create_password($user, $pass);
?> |
Sincerely, Josh (TRUSTAbyss)
Last edited by TRUSTAbyss on Mon Aug 04, 2008 9:36 pm; edited 6 times in total |
|
Back to top |
|
|
roganty -
Joined: 08 Jun 2004 Posts: 357 Location: Bristol, UK
|
Posted: Fri Nov 10, 2006 12:20 am Post subject: Re: PHP Function to Read Abyss's Users. |
|
|
TRUSTAbyss wrote: | Hello Everyone,
I've been learning some SimpleXML last night and decided to share some of
my work with the Abyss Web Server community. I've written a function that will
read your "abyss.conf" and output all User Accounts per Host.
This is very helpful if you wish to read abyss.conf and use those accounts with
your own PHP scripts. My function creates an Associated Array with every single
User Account you add per Host. Enjoy!
Note: PHP5 is required in order to use this function. |
If you want I could write a similar function using php 4.
But I don't have abyss x2 so I would need to know how the config file is laid out
Code: | <root>
<server>
<host>
<users>
<user />
</users>
</host>
</server>
</root> |
how is multiple hosts defined? _________________ Anthony R
Roganty | Links-Links.co.uk |
|
Back to top |
|
|
TRUSTAbyss -
Joined: 29 Oct 2003 Posts: 3752 Location: USA, GA
|
Posted: Fri Nov 10, 2006 12:24 am Post subject: |
|
|
It's layed out the same way. The Virtual Host is known by its id tag. I will be
more than happy to test your similar function anyway.
Edit: My function can now be used in Controle Structures easier. You can now
write code like this.
Code: | <?php
$user = "josh";
if ($output['user'][0] == $user) {
echo "Your username is already in abyss.conf";
}
?>
|
Last edited by TRUSTAbyss on Fri Nov 10, 2006 12:50 am; edited 1 time in total |
|
Back to top |
|
|
roganty -
Joined: 08 Jun 2004 Posts: 357 Location: Bristol, UK
|
Posted: Fri Nov 10, 2006 12:49 am Post subject: |
|
|
TRUSTAbyss wrote: | It's layed out the same way. The Virtual Host is known by its id tag. I will be
more than happy to test your similar function anyway. |
More clarification needed!
by id tag do you mean
Code: | <host id="1"></host> |
or
Code: | <host>
<id>1</id>
</host> |
_________________ Anthony R
Roganty | Links-Links.co.uk |
|
Back to top |
|
|
TRUSTAbyss -
Joined: 29 Oct 2003 Posts: 3752 Location: USA, GA
|
Posted: Fri Nov 10, 2006 12:50 am Post subject: |
|
|
I mean |
|
Back to top |
|
|
roganty -
Joined: 08 Jun 2004 Posts: 357 Location: Bristol, UK
|
Posted: Fri Nov 10, 2006 12:55 am Post subject: |
|
|
Thanks
It'll be ready for tomorrow _________________ Anthony R
Roganty | Links-Links.co.uk |
|
Back to top |
|
|
TRUSTAbyss -
Joined: 29 Oct 2003 Posts: 3752 Location: USA, GA
|
Posted: Fri Nov 10, 2006 12:58 am Post subject: |
|
|
I'll be looking forward to it. Good Luck! :-) |
|
Back to top |
|
|
roganty -
Joined: 08 Jun 2004 Posts: 357 Location: Bristol, UK
|
Posted: Fri Nov 10, 2006 2:00 am Post subject: |
|
|
Ok, its done. (Its called code recycling ;) )
But I want to make absolute certain about the format of the abyss.conf file for x2
Code: | <?xml version="1.0" encoding="UTF-8"?>
<root>
<server>
<host>
<id>1</id>
<users>
<user>user1</user>
<password>pass1</password>
<user>user2</user>
<password>pass2</password>
<user>user3</user>
<password>pass3</password>
</users>
</host>
<host>
<id>2</id>
<users>
<user>user4</user>
<password>pass4</password>
<user>user5</user>
<password>pass5</password>
<user>user6</user>
<password>pass6</password>
</users>
</host>
</server>
</root> |
This is my dummy abyss.conf file I'm using to test my script
Is that how users and their passwords are set out?
Is that how hosts are set out? _________________ Anthony R
Roganty | Links-Links.co.uk |
|
Back to top |
|
|
TRUSTAbyss -
Joined: 29 Oct 2003 Posts: 3752 Location: USA, GA
|
Posted: Fri Nov 10, 2006 2:36 am Post subject: |
|
|
No. This is how it looks.
Code: | <?xml version="1.0" encoding="UTF-8"?>
<root>
<server>
<host>
<id>1</id>
<users>
<user>
<name>user1</name>
<password>pass1</password>
</user>
<user>
<name>user2</name>
<password>pass2</password>
</user>
</users>
</host>
<host>
<id>2</id>
<users>
<user>
<name>user1</name>
<password>pass1</password>
</user>
<user>
<name>user2</name>
<password>pass2</password>
</user>
</users>
</host>
</server>
</root>
|
|
|
Back to top |
|
|
roganty -
Joined: 08 Jun 2004 Posts: 357 Location: Bristol, UK
|
Posted: Fri Nov 10, 2006 11:48 am Post subject: Code at last!!! |
|
|
Thanks TRUSTAbyss
Here is the long awaited code
Code: | <?php echo("The updated code can be found below!") ?> |
Some notes:
use -1 for the host id to get a list of all users
more functionality can be added quite easily as the whole user list can be accessed _________________ Anthony R
Roganty | Links-Links.co.uk
Last edited by roganty on Fri Nov 10, 2006 11:43 pm; edited 1 time in total |
|
Back to top |
|
|
TRUSTAbyss -
Joined: 29 Oct 2003 Posts: 3752 Location: USA, GA
|
Posted: Fri Nov 10, 2006 12:03 pm Post subject: |
|
|
Sorry, I just tested it and it doesn't work. What XML format are you using to
parse the XML? Are you using the format I showed you? |
|
Back to top |
|
|
roganty -
Joined: 08 Jun 2004 Posts: 357 Location: Bristol, UK
|
Posted: Fri Nov 10, 2006 12:20 pm Post subject: |
|
|
TRUSTAbyss wrote: | Sorry, I just tested it and it doesn't work. What XML format are you using to
parse the XML? Are you using the format I showed you? |
What isn't working?
Are there any error messages
Code: | <?xml version="1.0" encoding="UTF-8"?>
<root>
<server>
<host>
<id>0</id>
<users>
<user>
<name>user1</name>
<password>pass1</password>
</user>
<user>
<name>user2</name>
<password>pass2</password>
</user>
<user>
<name>user3</name>
<password>pass3</password>
</user>
</users>
</host>
<host>
<id>1</id>
<users>
<user>
<name>user4</name>
<password>pass4</password>
</user>
<user>
<name>user5</name>
<password>pass5</password>
</user>
<user>
<name>user6</name>
<password>pass6</password>
</user>
</users>
</host>
<host>
<id>2</id>
</host>
</server>
</root> |
That is the test file that I am using
Does the code at the bottom looks like the following?
Code: | // Add the path to your abyss.conf file.
$file = "/home/anthony/projects/abyss.conf"; //ok, you will need to change this
$host_id = -1; //keep as -1
$otpt = new abyss_user_accounts($file);
$output = $otpt->abyss_user_accounts_for_host($host_id);
print "<pre>" .print_r($output, true). "</pre>"; |
on my computer the above gives me
Quote: | Array
(
[0] => Array
(
[user1] => pass1
[user2] => pass2
[user3] => pass3
)
[1] => Array
(
[user4] => pass4
[user5] => pass5
[user6] => pass6
)
[2] => Array
(
)
) |
Try it with the test file, see if that works _________________ Anthony R
Roganty | Links-Links.co.uk |
|
Back to top |
|
|
TRUSTAbyss -
Joined: 29 Oct 2003 Posts: 3752 Location: USA, GA
|
Posted: Fri Nov 10, 2006 12:25 pm Post subject: |
|
|
The test file works. Maybe I missed something when I told you the format. I will
send you an "abyss.conf" with dummy hosts in a little while. |
|
Back to top |
|
|
roganty -
Joined: 08 Jun 2004 Posts: 357 Location: Bristol, UK
|
Posted: Fri Nov 10, 2006 12:28 pm Post subject: |
|
|
TRUSTAbyss wrote: | The test file works. Maybe I missed something when I told you the format. I will
send you an "abyss.conf" with dummy hosts in a little while. |
Okay, thanks. _________________ Anthony R
Roganty | Links-Links.co.uk |
|
Back to top |
|
|
TRUSTAbyss -
Joined: 29 Oct 2003 Posts: 3752 Location: USA, GA
|
Posted: Fri Nov 10, 2006 12:37 pm Post subject: |
|
|
The "abyss.conf" file is sent. Check your "Private Messages" inbox. |
|
Back to top |
|
|
roganty -
Joined: 08 Jun 2004 Posts: 357 Location: Bristol, UK
|
Posted: Fri Nov 10, 2006 1:20 pm Post subject: |
|
|
TRUSTAbyss wrote: | The "abyss.conf" file is sent. Check your "Private Messages" inbox. |
Thanks for the file, that is just what I needed!
I've had a look through it, and I have spotted the areas where my script was falling down.
- The <root> tag is used in more than one place, for example, root->server->parameters->root
- The <name> tag is also used in more than one place,for example, root->host->names->name and root->host->users->user->name
- The <id> tag comes after the <users> tag
I've got to go to work now, but I will work on it tonight when I come home _________________ Anthony R
Roganty | Links-Links.co.uk |
|
Back to top |
|
|
roganty -
Joined: 08 Jun 2004 Posts: 357 Location: Bristol, UK
|
Posted: Fri Nov 10, 2006 11:42 pm Post subject: The wait is over - finally! |
|
|
Ok, here is the new code
Code: | <?php
class abyss_user_accounts{
var $XMLfile = "";
var $XMLparser;
var $tag_is = array();
var $hosts_output = array();
function abyss_user_accounts($file){
$this->output = array();
$this->XMLfile = $file;
$this->Generate($this->XMLfile);
}
function abyss_user_accounts_for_host($host_id=-1){
//print "<pre>" .print_r($this->hosts_output, true). "</pre>";
if( $host_id == -1 ) return $this->hosts_output;
else{
if( isset($this->hosts_output[$host_id]) ){
if( empty($this->hosts_output[$host_id]) ) return "There are no users for host id #$host_id";
else return $this->hosts_output[$host_id];
}else return "There is no host with an id of $host_id";
}
}
function Generate($XMLfile){
if( $fp = @fopen($XMLfile,"r")){
$this->XMLparser = xml_parser_create();
xml_set_object($this->XMLparser, $this);
xml_parser_set_option($this->XMLparser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($this->XMLparser, XML_OPTION_SKIP_WHITE, 1);
xml_set_element_handler($this->XMLparser, array(&$this, "startElement"), array(&$this, "endElement"));
xml_set_character_data_handler($this->XMLparser, array(&$this, "characterData"));
while( $data = fread($fp, 4096)){
if(! xml_parse($this->XMLparser, $data, feof($fp)) ){
die( sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($this->XMLparser)), xml_get_current_line_number($this->XMLparser)));
}
}
xml_parser_free($this->XMLparser);
}else{
print "<br /><b>ERROR</b>: Could not open XML file ". $XMLfile ."<br />";
}
}
function startElement($parser, $name, $attrs){
$attnames = array_keys($attrs);
$tag_is = $this->tag_is;
//print ":".$name."<br />";
switch( $name ){
case "root" : if( empty($tag_is) ) $tag_is = array("root"); break;
case "server" : $tag_is[1] ="server"; break;
case "host" : $tag_is[2] = "host"; $this->add2output = false; break;
case "id" : $tag_is[3] = "id"; break;
case "users" : $tag_is[3] = "users"; $this->tmp_usr_arr = array(); break;
case "user" : $tag_is[4] = "user"; break;
case "name" : if( $tag_is[4] == "user" ) $tag_is[5] = "name"; break;
case "password" : if( $tag_is[4] == "user" ) $tag_is[5] = "password"; break;
}
$this->tag_is = $tag_is;
}
function endElement($parser, $name){
$tag_is = $this->tag_is;
switch( $name ){
case "root" : if( $tag_is[1] != "server" ) $tag_is = array(); break;
case "server" : $tag_is[1] =""; break;
case "host" : $tag_is[2] = ""; break;
case "id" : $tag_is[3] = ""; break;
case "users" : $tag_is[3] = ""; break;
case "user" : $tag_is[4] = ""; break;
case "name" : if( $tag_is[4] == "user" ) $tag_is[5] = ""; break;
case "password" : if( $tag_is[4] == "user" ) $tag_is[5] = ""; break;
}
$this->tag_is = $tag_is;
}
function characterData($parser, $data){
$data = trim($data);
$tag_is = $this->tag_is;
$hosts_output = $this->hosts_output;
if(! empty($data) )
if( $tag_is[0] == "root" )
if( $tag_is[1] == "server" )
if( $tag_is[2] == "host" )
if( $tag_is[3] == "users" ){
if( $tag_is[4] == "user" ){
if( $tag_is[5] == "name" ) $this->tmp_usr = $data;
else
if( $tag_is[5] == "password" ){
if( $this->add2output ) $hosts_output[$this->tmp_host_id][$this->tmp_usr] = $data;
else
if(! $this->add2output ) $this->tmp_usr_arr[$this->tmp_usr] = $data;
}
}
}else
if( $tag_is[3] == "id" ){
$this->tmp_host_id = $data;
if( empty($this->tmp_usr_arr) ){
$hosts_output[$this->tmp_host_id] = array();
$this->add2output = true;
}else{
$hosts_output[$this->tmp_host_id] = $this->tmp_usr_arr;
$this->add2output = false;
}
}
$this->hosts_output = $hosts_output;
}
}
// Add the path to your abyss.conf file.
$file = "C:\\Program Files\\Abyss Web Server\\abyss.conf";
//$file = "/home/anthony/projects/abyss.conf";
// Let's lookup the current Host so we know which Users to Pull.
$host_id = $_SERVER['INSTANCE_ID'];
//$host_id = -1;
$otpt = new abyss_user_accounts($file);
// This just assigns $output variable, the array of the accounts
$output = $otpt->abyss_user_accounts_for_host($host_id);
// Last but not least, output it!
print "<pre>" .print_r($output, true). "</pre>";
?> |
Some notes:
use -1 for the host id to get a list of all users
more functionality can be added quite easily as the whole user list can be accessed _________________ Anthony R
Roganty | Links-Links.co.uk |
|
Back to top |
|
|
TRUSTAbyss -
Joined: 29 Oct 2003 Posts: 3752 Location: USA, GA
|
Posted: Sat Nov 11, 2006 12:09 am Post subject: |
|
|
It works! Thanks for this contribution. I'm going to try and learn from your code
to build my own XML applications for PHP4 and PHP5. |
|
Back to top |
|
|
roganty -
Joined: 08 Jun 2004 Posts: 357 Location: Bristol, UK
|
Posted: Sat Nov 11, 2006 12:16 am Post subject: |
|
|
TRUSTAbyss wrote: | It works! Thanks for this contribution. I'm going to try and learn from your code
to build my own XML applications for PHP4 and PHP5. |
Don't be so surprised that it works! (mock indignation)
When ever I need to do XML parsing, I always use the same function - Generate()
A good place to start is at the following page:
http://uk.php.net/manual/en/function.xml-parser-create.php _________________ Anthony R
Roganty | Links-Links.co.uk |
|
Back to top |
|
|
TRUSTAbyss -
Joined: 29 Oct 2003 Posts: 3752 Location: USA, GA
|
Posted: Mon Aug 04, 2008 9:39 pm Post subject: |
|
|
The abyss_user_accounts() function has been updated for better performance. Basically, I added a new function to load the XML in a better way instead of turning the whole XML file into a string followed by an object. This new code should provide better performance. |
|
Back to top |
|
|
|