2020-04-27 15:35:11 -05:00
< ? php
2017-02-07 20:13:14 +00:00
error_reporting ( 0 );
#error_reporting('E_ALL');
session_start ();
header ( 'Content-type: text/xml' );
include ( " config.php " );
$db = $GLOBALS [ 'conf_dbname' ];
$basePath = $GLOBALS [ 'conf_basePath' ];
$mapPath = $GLOBALS [ 'conf_mapPath' ];
2020-04-27 15:35:11 -05:00
2017-02-07 20:13:14 +00:00
function myMail ( $to , $subject , $message ){
$fromAddr = $GLOBALS [ 'conf_mailAddress' ];
$headers = 'From: <' . $fromAddr . " > \r \n " .
'Reply-To: <' . $fromAddr . " > \r \n " .
'X-Mailer: PHP/' . phpversion () . " \r \n \r \n " ;
mail ( $to , $subject , $message , $headers );
}
function getRequest (){
$putdata = fopen ( " php://input " , " rb " );
$myData = " " ;
while ( ! feof ( $putdata )){
$myData = $myData . fread ( $putdata , 4096 );
}
fclose ( $putdata );
return ( $myData );
}
function writeToFile ( $filename , $text ){
// create directory if not already present
$cmd = " mkdir -p \" $ (dirname \" " . $filename . " \" ) \" " ;
system ( $cmd );
2020-04-27 15:35:11 -05:00
$fp = fopen ( $filename , 'w' ) or die ( " Can't open file _ " . $filename . " _ " );
2017-02-07 20:13:14 +00:00
fwrite ( $fp , $text );
fclose ( $fp );
}
function readFromFile ( $filename ){
$fp = fopen ( $filename , 'r' ) or die ( " Can't open file " );
$text = fread ( $fp , filesize ( $filename ));
fclose ( $fp );
return ( $text );
}
function isFileOwner ( $dh , $filePKey , $userPKey ){
$query = " Select count(*) \" count \" ,max(pkey) from fileUserRel where filePKey= " . $dh -> quote ( $filePKey ) . " and userPKey= " . $dh -> quote ( $userPKey ) ;
$result = $dh -> query ( $query ) ;
$row = $result -> fetch ();
if ( $row [ 'count' ] == 1 ) {
return ( true );
} else {
return ( false );
}
}
function deleteFile ( $dh , $mapPath , $fileInfo ){
if ( isFileOwner ( $dh , $fileInfo [ " PKey " ], $_SESSION [ 'UserPKey' ])) {
//$query="delete from file where pkey = " . $fileInfo["PKey"] . "";
$query = " update file set deleteDate=datetime('now') where pkey = " . $dh -> quote ( $fileInfo [ " PKey " ]) ;
$dh -> exec ( $query ) ;
//unlink($mapPath . "/" . $fileInfo['Name']);
}
return ( " <x success='true' /> " );
}
function getNewPKey ( $dh ){
// $dh->beginTransaction();
$query = " Select nextFree from pkey " ;
$result = $dh -> query ( $query ) ;
$row = $result -> fetch ();
$newPKey = $row [ 'nextFree' ];
$query = " update pkey set nextFree=nextFree+1 " ;
$dh -> exec ( $query ) ;
// $dh->commit();
return ( $newPKey );
}
function getUserInfo ( $dh ){
$xmlDoc = new DomDocument ();
$rootNode = $xmlDoc -> createElement ( " response " );
$xmlDoc -> appendChild ( $rootNode );
$query = " Select name,mail from user where pkey= " . $dh -> quote ( $_SESSION [ 'UserPKey' ]);
writeToFile ( " /tmp/rrr " , $query );
$result = $dh -> query ( $query ) ;
$row = $result -> fetch ();
if ( ! $row ) {
$success = " false " ;
$rootNode -> setAttribute ( " name " , " Unknown " );
$rootNode -> setAttribute ( " mail " , " Unknown " );
$error = " UserNotFoundError " ;
} else {
$success = " true " ;
$rootNode -> setAttribute ( " name " , $row [ 'name' ]);
$rootNode -> setAttribute ( " mail " , $row [ 'mail' ]);
$dh -> exec ( $query ) ;
}
$rootNode -> setAttribute ( " success " , $success );
if ( $success == " false " ) {
$rootNode -> setAttribute ( " error " , $error );
}
return ( $xmlDoc );
}
// Inserts new files into the DB, updates the description.
// returns the filename.
// filePKey must be null for new records
function getFileNameAndPKey ( $dh , $filePKey , $description ){
2020-04-27 15:35:11 -05:00
if ( $filePKey == " null " ) {
2017-02-07 20:13:14 +00:00
$isNew = true ;
$filePKey = getNewPKey ( $dh );
$fileName = $_SESSION [ " UserPKey " ] . " / " . $filePKey ; // TODO - should include the user
$query = " insert into file (pkey,filename,description) values ( " . $dh -> quote ( $filePKey ) . " , " . $dh -> quote ( $fileName ) . " , " . $dh -> quote ( $description ) . " ) " ;
$dh -> exec ( $query ) ;
$query = " insert into fileUserRel (pkey,filePKey,userPKey,isOwner) values ( " . $dh -> quote ( getNewPKey ( $dh )) . " , " . $dh -> quote ( $filePKey ) . " , " . $dh -> quote ( $_SESSION [ 'UserPKey' ]) . " ,1) " ;
$dh -> exec ( $query ) ;
} else {
$isNew = false ;
$query = " Select file.filename \" fileName \" , file.description \" fileDescription \" from file,fileUserRel where file.pkey= " . $dh -> quote ( $filePKey ) . " and fileUserRel.filePKey=file.pkey and fileUserRel.userPKey= " . $dh -> quote ( $_SESSION [ 'UserPKey' ]) ;
$result = $dh -> query ( $query ) ;
$row = $result -> fetch ();
$fileName = $row [ 'fileName' ];
$currDescription = $row [ 'fileDescription' ];
if (( $description != null ) and ( $currDescription != $description )) {
$query = " update file set description= " . $dh -> quote ( $description ) . " where pkey= " . $dh -> quote ( $filePKey ) ;
$dh -> exec ( $query ) ;
}
}
$ret = array ( " Name " => $fileName ,
" PKey " => $filePKey ,
" isNew " => $isNew );
return ( $ret );
}
function getIconList ( $dh ){
$xmlDoc = new DomDocument ();
$rootNode = $xmlDoc -> createElement ( " icons " );
$rootNode -> setAttribute ( " success " , " true " );
$xmlDoc -> appendChild ( $rootNode );
$query = " Select icon.pkey \" iconPKey \" , icon.filename \" filename \" ,icon.description \" description \" from icon order by sort " ;
$result = $dh -> query ( $query ) ;
while ( $row = $result -> fetch ()) {
$recordNode = $xmlDoc -> createElement ( " icon " );
$recordNode -> setAttribute ( " pkey " , $row [ 'iconPKey' ]);
$recordNode -> setAttribute ( " filename " , $row [ 'filename' ]);
$recordNode -> setAttribute ( " description " , $row [ 'description' ]);
$rootNode -> appendChild ( $recordNode );
}
return ( $xmlDoc );
}
function listFiles ( $dh ){
$xmlDoc = new DomDocument ();
$rootNode = $xmlDoc -> createElement ( " div " );
$rootNode -> setAttribute ( " class " , " fileList " );
$rootNode -> setAttribute ( " success " , " true " );
$xmlDoc -> appendChild ( $rootNode );
$query = " Select file.pkey \" filePKey \" , file.description \" fileDescription \" from file,fileUserRel where file.pkey=fileUserRel.filePKey and fileUserRel.userPKey= " . $dh -> quote ( $_SESSION [ 'UserPKey' ]) . " and file.deleteDate is null order by description " ;
$result = $dh -> query ( $query ) ;
while ( $row = $result -> fetch ()) {
$fileNode = $xmlDoc -> createElement ( " div " );
$fileNode -> setAttribute ( " class " , " singleFile " );
$fileNode -> setAttribute ( " pkey " , $row [ 'filePKey' ]);
$fileNode -> appendChild ( $xmlDoc -> createTextNode ( $row [ 'fileDescription' ]));
$rootNode -> appendChild ( $fileNode );
}
return ( $xmlDoc );
}
function confirmOptin ( $dh , $token ){
$xmlDoc = new DomDocument ();
$rootNode = $xmlDoc -> createElement ( " response " );
$xmlDoc -> appendChild ( $rootNode );
$query = " Select count(*) \" count \" ,max(pkey) \" userOptinPKey \" from userOptin where confirmed != '1' and token= " . $dh -> quote ( $token );
$result = $dh -> query ( $query ) ;
$row = $result -> fetch ();
if ( $row [ 'count' ] != 1 ) {
$success = " false " ;
$error = " TokenNotFoundError " ;
} else {
$success = " true " ;
$query = " update userOptin set confirmed='1' where pkey =' " . $row [ 'userOptinPKey' ] . " ' " ;
$dh -> exec ( $query ) ;
}
$rootNode -> setAttribute ( " success " , $success );
if ( $success == " false " ) {
$rootNode -> setAttribute ( " error " , $error );
}
return ( $xmlDoc );
}
function checkMailAddress ( $mail ){
if (( strlen ( $mail ) < 6 ) || ( false === strpos ( $mail , " @ " ))) {
return ( " Invalid E-Mail Address! " );
}
$result = " " ;
try {
$fp = popen ( $GLOBALS [ 'conf_basePath' ] . " checkMail.sh " . $mail , " r " );
while ( ! feof ( $fp )) {
$result = $result . fgets ( $fp , 4096 );
}
pclose ( $fp );
} catch ( Exception $e ) {
$result = " Can't execute check-script. " ;
}
return ( $result );
}
function optinUser ( $dh , $mail , $password ){
$xmlDoc = new DomDocument ();
$rootNode = $xmlDoc -> createElement ( " response " );
$xmlDoc -> appendChild ( $rootNode );
$mailCheckErr = checkMailAddress ( $mail );
if ( " " != $mailCheckErr ) {
$rootNode -> setAttribute ( " success " , " false " );
$rootNode -> setAttribute ( " error " , " MailAddressNotValidError " );
$rootNode -> setAttribute ( " description " , $mailCheckErr );
return ( $xmlDoc );
}
$query = " Select count(*) \" count \" ,max(pkey) \" userPKey \" from user where mail= " . $dh -> quote ( $mail );
$result = $dh -> query ( $query ) ;
$row = $result -> fetch ();
if ( $row [ 'count' ] != 0 ) {
$rootNode -> setAttribute ( " success " , " false " );
$rootNode -> setAttribute ( " error " , " MailAlreadyRegisteredValidation " );
} else {
$rootNode -> setAttribute ( " success " , " true " );
$userPKey = getNewPKey ( $dh );
$query = " Insert into user (pkey,name,mail,password) values ( " . $dh -> quote ( $userPKey ) . " , " . $dh -> quote ( $mail ) . " , " . $dh -> quote ( $mail ) . " , " . $dh -> quote ( $password ) . " ) " ;
$dh -> exec ( $query ) ;
$token = getToken ();
$query = " Insert into userOptin (pkey, userPKey, pendingSince, ip, confirmed, token) values ( " . $dh -> quote ( getNewPKey ( $dh )) . " , " . $dh -> quote ( $userPKey ) . " ,datetime('now'), " . $dh -> quote ( $_SERVER [ " REMOTE_ADDR " ]) . " ,'0', " . $dh -> quote ( $token ) . " ) " ;
$dh -> exec ( $query ) ;
myMail ( $mail , $GLOBALS [ " conf_appName " ] . " Sign up Confirmation " , " Thanks for signing up! \n please follow this link to confirm your mail-address: \n < " . $GLOBALS [ " conf_appURL " ] . " login.php?action=confirmOptin&token= " . $token . " > " );
}
return ( $xmlDoc );
}
function getToken (){
$salt = microtime () . " _ " . $_SERVER [ " REMOTE_ADDR " ] . " _ " . rand ( 1 , 32768 );
return ( md5 ( $salt ));
}
function setupAutoLogin ( $dh ){
$token = getToken ();
$query = " insert into userAutologin (pkey, userPKey, token,setupDate) values ( " . $dh -> quote ( getNewPKey ( $dh )) . " , " . $dh -> quote ( $_SESSION [ " UserPKey " ]) . " , " . $dh -> quote ( $token ) . " ,datetime('now')) " ;
$dh -> exec ( $query );
return ( $token );
}
function logOutUser ( $dh , $loginToken ){
$query = " delete from userAutoLogin where userPKey= " . $dh -> quote ( $_SESSION [ 'userPKey' ]) . " and token= " . $dh -> quote ( $loginToken );
$dh -> exec ( $query ) ;
unset ( $_SESSION [ 'UserPKey' ]);
$xmlDoc = new DomDocument ();
$rootNode = $xmlDoc -> createElement ( " response " );
$rootNode -> setAttribute ( " success " , " true " );
$xmlDoc -> appendChild ( $rootNode );
return ( $xmlDoc );
}
function logInUser ( $dh , $mail , $password , $isSetupAutoLogin , $loginToken ){
if ( $loginToken ) {
$query = " Select count(*) \" count \" ,max(user.pkey) \" userPKey \" from user, userOptin, userAutologin where userAutoLogin.userPKey=user.pkey and userAutoLogin.token= " . $dh -> quote ( $loginToken ) . " and userOptin.userPKey=user.PKey and userOptin.confirmed='1' and user.mail= " . $dh -> quote ( $mail );
} else {
$query = " Select count(*) \" count \" ,max(user.pkey) \" userPKey \" from user, userOptin where userOptin.userPKey=user.PKey and userOptin.confirmed='1' and user.mail= " . $dh -> quote ( $mail ) . " and user.password= " . $dh -> quote ( $password );
}
2020-04-27 15:35:11 -05:00
2017-02-07 20:13:14 +00:00
$result = $dh -> query ( $query ) ;
2020-04-27 15:35:11 -05:00
try {
$row = $result -> fetch ();
} catch ( Exception $ex ) {
echo " EX: " . $ex -> getMessage ();
}
2017-02-07 20:13:14 +00:00
if ( $row [ 'count' ] == 1 ) {
$success = " true " ;
$_SESSION [ 'UserPKey' ] = $row [ 'userPKey' ];
$query = " insert into userLogin (pkey, userpkey, loginDate, loginIp) values ( " . $dh -> quote ( getNewPKey ( $dh )) . " , " . $dh -> quote ( $_SESSION [ " UserPKey " ]) . " ,datetime('now'), " . $dh -> quote ( $_SERVER [ " REMOTE_ADDR " ]) . " ) " ;
$dh -> exec ( $query ) ;
if ( $isSetupAutoLogin ) {
$autoLoginToken = setupAutoLogin ( $dh );
}
} else {
$success = " false " ;
$errorclass = " AppError " ;
$_SESSION [ 'UserPKey' ] = null ;
}
$xmlDoc = new DomDocument ();
$rootNode = $xmlDoc -> createElement ( " response " );
$rootNode -> setAttribute ( " success " , $success );
$rootNode -> setAttribute ( " autologintoken " , $autoLoginToken );
$rootNode -> setAttribute ( " errorclass " , $errorclass );
$xmlDoc -> appendChild ( $rootNode );
return ( $xmlDoc );
}
function mailPassword ( $dh , $mail ){
$xmlDoc = new DomDocument ();
$rootNode = $xmlDoc -> createElement ( " response " );
$xmlDoc -> appendChild ( $rootNode );
$query = " Select count(*) \" count \" ,max(user.pkey) \" userPKey \" ,min(userOptin.confirmed) \" optinConfirmed \" ,min(userOptin.token) \" optinToken \" from user, userOptin where userOptin.userPKey=user.PKey and userOptin.confirmed='1' and user.mail= " . $dh -> quote ( $mail );
$result = $dh -> query ( $query ) ;
$row = $result -> fetch ();
if ( $row [ 'count' ] != 1 ) {
$success = " false " ;
$error = " MailAddressNotRegisteredValidation " ;
} else {
$success = " true " ;
if ( $row [ 'optinConfirmed' ] != " 1 " ) {
$token = $row [ 'optinToken' ];
myMail ( $mail , $GLOBALS [ " conf_appName " ] . " Password-Request/Sign up Confirmation " , " During your password request we found that your mail-address was not confirmend yet. \n You can only sign in if your address is confirmed. \n please follow this link to confirm your mail-address: \n < " . $GLOBALS [ " conf_appURL " ] . " login.php?action=confirmOptin&token= " . $token . " > " );
} else {
$token = getToken ();
$query = " Insert into userPassReq (pkey, userPKey, token, requestDate) values ( " . $dh -> quote ( getNewPKey ( $dh )) . " ,' " . $row [ 'userPKey' ] . " ', " . $dh -> quote ( $token ) . " ,datetime('now')) " ;
$dh -> exec ( $query ) ;
myMail ( $mail , $GLOBALS [ " conf_appName " ] . " Password override request " , " To override your password please follow this link: \n < " . $GLOBALS [ " conf_appURL " ] . " login.php?action=overridePassword&token= " . $token . " > " );
}
}
$rootNode -> setAttribute ( " success " , $success );
if ( $success == " false " ) {
$rootNode -> setAttribute ( " error " , $error );
}
return ( $xmlDoc );
}
function setUserPassword ( $dh , $UserPKey , $newPass ){
$query = " update user set password= " . $dh -> quote ( $newPass ) . " where mail<>'demo' and pkey = " . $dh -> quote ( $UserPKey );
$dh -> exec ( $query ) ;
}
function updateUserProfile ( $dh , $mail , $password , $name ){
$xmlDoc = new DomDocument ();
$rootNode = $xmlDoc -> createElement ( " response " );
$xmlDoc -> appendChild ( $rootNode );
// check the mail-address if it was changed
if ( getUserInfo ( $dh ) -> firstChild -> getAttribute ( " mail " ) != $mail ) {
$mailCheckErr = checkMailAddress ( $mail );
if ( " " != $mailCheckErr ) {
$rootNode -> setAttribute ( " success " , " false " );
$rootNode -> setAttribute ( " error " , " MailAddressNotValidError " );
$rootNode -> setAttribute ( " description " , $mailCheckErr );
return ( $xmlDoc );
}
}
if ( $password ) {
setUserPassword ( $dh , $_SESSION [ " UserPKey " ], $password );
}
$query = " update user set name= " . $dh -> quote ( $name ) . " , mail= " . $dh -> quote ( $mail ) . " where mail<>'demo' and pkey = " . $dh -> quote ( $_SESSION [ " UserPKey " ]);
$dh -> exec ( $query ) ;
$rootNode -> setAttribute ( " success " , " true " );
return ( $xmlDoc );
}
function changePassword ( $dh , $mail , $newPass , $oldPass , $token ){
$xmlDoc = new DomDocument ();
$rootNode = $xmlDoc -> createElement ( " response " );
$xmlDoc -> appendChild ( $rootNode );
if ( strlen ( $mail ) > 1 ) { // change password with mail and old password
$query = " select count(*) \" count \" , max(user.pkey) \" userPKey \" from user,userOptin where user.pkey=userOptin.userPKey and userOptin.confirmed='1' and user.password= " . $dh -> quote ( $oldPass ) . " and user.mail= " . $dh -> quote ( $mail );
$result = $dh -> query ( $query ) ;
$row = $result -> fetch ();
if ( $row [ 'count' ] != 1 ) {
$success = " false " ;
$error = " MailNotExistentOrPasswordWrongValidation " ;
} else {
setUserPassword ( $dh , $row [ 'userPKey' ], $newPass );
$success = " true " ;
}
} else { // change password via token
$query = " select count(*) \" count \" , max(userPassReq.userPKey) \" userPKey \" , max(userPassReq.pkey) \" userPassReqPKey \" from userPassReq where token is not null and token= " . $dh -> quote ( $token ) ;
$result = $dh -> query ( $query ) ;
$row = $result -> fetch ();
if ( $row [ 'count' ] != 1 ) {
$success = " false " ;
$error = " TokenExpiredValidation " ;
} else {
setUserPassword ( $dh , $row [ 'userPKey' ], $newPass );
$success = " true " ;
$query = " update userPassReq set token=null where pkey = " . $row [ 'userPassReqPKey' ] ;
$result = $dh -> query ( $query ) ;
}
}
$rootNode -> setAttribute ( " success " , $success );
if ( $success == " false " ) {
$rootNode -> setAttribute ( " error " , $error );
}
return ( $xmlDoc );
}
try {
$dh = new PDO ( " sqlite: " . $db );
$reqXML = new DomDocument ();
$reqXML -> loadXML ( getRequest ());
$theFunction = $reqXML -> documentElement -> getAttribute ( " function " );
writeToFile ( " /tmp/reqtgt.log " , $reqXML -> saveXML ());
switch ( $theFunction ) {
case " SAVEFILE " :
$description = $reqXML -> documentElement -> getAttribute ( " description " );
$filePKeyReq = $reqXML -> documentElement -> getAttribute ( " filepkey " );
$fileInfo = getFileNameAndPKey ( $dh , $filePKeyReq , $description );
if ( $fileInfo [ " isNew " ]) { $reqXML -> documentElement -> setAttribute ( " filepkey " , $fileInfo [ " PKey " ]); }
writeToFile ( $mapPath . $fileInfo [ " Name " ], $reqXML -> saveXML ());
echo ( " <x success='true' filepkey=' " . $fileInfo [ " PKey " ] . " '/> " );
break ;
case " OPENFILE " :
$filePKey = $reqXML -> documentElement -> getAttribute ( " filepkey " );
$fileInfo = getFileNameAndPKey ( $dh , $filePKey , null );
echo ( readFromFile ( $mapPath . $fileInfo [ " Name " ]));
break ;
case " DELETEFILE " :
$filePKey = $reqXML -> documentElement -> getAttribute ( " filepkey " );
$fileInfo = getFileNameAndPKey ( $dh , $filePKey , null );
echo ( deleteFile ( $dh , $mapPath , $fileInfo ));
break ;
case " LISTFILES " :
echo ( listFiles ( $dh ) -> saveXML ());
break ;
case " LOGIN " :
$mail = $reqXML -> documentElement -> getAttribute ( " mail " );
$password = $reqXML -> documentElement -> getAttribute ( " password " );
$isSetupAutoLogin = ( $reqXML -> documentElement -> getAttribute ( " isautologin " ) == " 1 " );
echo ( logInUser ( $dh , $mail , $password , $isSetupAutoLogin , null ) -> saveXML ());
break ;
case " LOGOUT " :
$loginToken = $reqXML -> documentElement -> getAttribute ( " token " );
echo ( logOutUser ( $dh , $loginToken ) -> saveXML ());
break ;
case " TOKENLOGIN " :
$mail = $reqXML -> documentElement -> getAttribute ( " mail " );
$loginToken = $reqXML -> documentElement -> getAttribute ( " token " );
echo ( logInUser ( $dh , $mail , null , false , $loginToken ) -> saveXML ());
break ;
case " OPTINUSER " :
$mail = $reqXML -> documentElement -> getAttribute ( " mail " );
$password = $reqXML -> documentElement -> getAttribute ( " password " );
echo ( optinUser ( $dh , $mail , $password ) -> saveXML ());
break ;
case " MAILPASSWORD " :
$mail = $reqXML -> documentElement -> getAttribute ( " mail " );
echo ( mailPassword ( $dh , $mail ) -> saveXML ());
break ;
case " CONFIRMOPTIN " :
$token = $reqXML -> documentElement -> getAttribute ( " token " );
echo ( confirmOptin ( $dh , $token ) -> saveXML ());
break ;
case " CHANGEPASSWORD " :
$mail = $reqXML -> documentElement -> getAttribute ( " mail " );
$newPass = $reqXML -> documentElement -> getAttribute ( " newpass " );
$oldPass = $reqXML -> documentElement -> getAttribute ( " oldpass " );
$token = $reqXML -> documentElement -> getAttribute ( " token " );
echo ( changePassword ( $dh , $mail , $newPass , $oldPass , $token ) -> saveXML ());
break ;
case " UPDATEUSERPROFILE " :
$mail = $reqXML -> documentElement -> getAttribute ( " mail " );
$password = $reqXML -> documentElement -> getAttribute ( " password " );
$name = $reqXML -> documentElement -> getAttribute ( " name " );
echo ( updateUserProfile ( $dh , $mail , $password , $name ) -> saveXML ());
break ;
case " GETICONLIST " :
echo ( getIconList ( $dh ) -> saveXML ());
break ;
case " GETUSERINFO " :
echo ( getUserInfo ( $dh ) -> saveXML ());
break ;
}
} catch ( PDOException $exception ) {
$xmlDoc = new DomDocument ();
$rootNode = $xmlDoc -> createElement ( " response " );
$xmlDoc -> appendChild ( $rootNode );
$rootNode -> setAttribute ( " success " , " false " );
$rootNode -> setAttribute ( " error " , " DB-Error " );
$rootNode -> setAttribute ( " message " , $exception -> getMessage ());
die ( $xmlDoc -> saveXML ());
}
?>