0

I have a C++ script that recognizes people, so it recognizes faces, but also the people belonging to that face. Im quite a C++ newbie so I was already glad I could get it to work (the original script isn't written by me but needed some changes to work).

There is a function in this script that needs to alter a php file when it recognizes, for example, me.

I have written this function, but it completely destroys the formatting of the php file and deletes pieces of code I don't want deleted.

The C++ code that looks for the php file and edits it:

if(nWho==P_NICK)
{   
    fstream calendar("/var/www/html/MagicMirror_Old/calendar.php");
    string readout;
    string search;
    search = "$url = 'some_URL_to_some_site'";
    string replace;
    replace = "$url = 'some_URL_to_some_other_site'"
    while(getline(calendar,readout))
    {
      if(readout == search)
      {
        calendar << replace;
      }
      else 
      {
        calendar << readout;
      }
    }   
}

Now the original php file that is being edited has the following content before it is edited:

// Set the url of the calendar feed.
$url = 'some_URL_to_some_site';

/*****************************************/

// Run the helper function with the desired URL and echo the contents.
echo get_url($url);

// Define the helper function that retrieved the data and decodes the content.
function get_url($url)
{
    //user agent is very necessary, otherwise some websites like google.com wont give zipped content
    $opts = array(
        'http'=>array(
            'method'=>"GET",
            'header'=>"Accept-Language: en-US,en;q=0.8rn" .
                        "Accept-Encoding: gzip,deflate,sdchrn" .
                        "Accept-Charset:UTF-8,*;q=0.5rn" .
                        "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0 FirePHP/0.4rn",
            "ignore_errors" => true  //Fix problems getting data
        ),
        //Fixes problems in ssl 
    "ssl" => array(
        "verify_peer"=>false,
        "verify_peer_name"=>false
    )
    );

    $context = stream_context_create($opts);
    $content = file_get_contents($url ,false,$context); 

    //If http response header mentions that content is gzipped, then uncompress it
    foreach($http_response_header as $c => $h)
    {
        if(stristr($h, 'content-encoding') and stristr($h, 'gzip'))
        {
            //Now lets uncompress the compressed data
            $content = gzinflate( substr($content,10,-8) );
        }
    }

    return $content;
}

Which turns to the following after the file is edited by C++:

<?php
<?php Set the url of the calendar feed.
 Set the url of the calendar feed.= 'https://p01-calendarws.icloud.com/ca/subscribe/1/n6x7Farxpt7m9S8bHg1TGArSj7J6kanm_2KEoJPL5YIAk3y70FpRo4GyWwO-6QfHSY5mXtHcRGVxYZUf7U3HPDOTG5x0qYnno1Zr_VuKH2M';
= 'https://p01-calendarws.icloud.com/ca/subscribe/1/n6x7Farxpt7m9S8bHg1TGArSj7J6kanm_2KEoJPL5YIAk3y70FpRo4GyWwO-6QfHSY5mXtHcRGVxYZUf7U3HPDOTG5x0qYnno1Zr_VuKH2M';***********/
***********/ helper function with the desired URL and echo the contents.
 helper function with the desired URL and echo the contents.trieved the data and decodes the content.
trieved the data and decodes the content.ent is very necessary, otherwise some websites like google.com wont give zipped content
ent is very necessary, otherwise some websites like google.com wont give zipped content'header'=>"Accept-Language: en-US,en;q=0.8rn" .
'header'=>"Accept-Language: en-US,en;q=0.8rn" .,deflate,sdchrn" .
,deflate,sdchrn" .       "Accept-Charset:UTF-8,*;q=0.5rn" .
       "Accept-Charset:UTF-8,*;q=0.5rn" .illa/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0 FirePHP/0.4rn",
illa/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0 FirePHP/0.4rn",ixes problems in ssl 
ixes problems in ssl "verify_peer"=>false,
"verify_peer"=>false,=>false
=>false  );
  );    $context = stream_context_create($opts);
    $context = stream_context_create($opts);e,$context); 
e,$context); /If http response header mentions that content is gzipped, then uncompress it
/If http response header mentions that content is gzipped, then uncompress it, 'content-encoding') and stristr($h, 'gzip'))
, 'content-encoding') and stristr($h, 'gzip'))the compressed data
the compressed datant = gzinflate( substr($content,10,-8) );
nt = gzinflate( substr($content,10,-8) );tent;
tent;

As you probably notice, this isn't how the file should look like considering it's original state.

Basically only the $url on the second line needs to be replaced by a different url and the rest of the formatting of the php file should stay the same. Is there a way to do this in C++?

Nick
  • 29
  • 9
  • I suggest letting the C++ code return a name, calling `exec()` from PHP, and call the C++ code, reading it's output and let PHP itself change your URL. – online Thomas Jan 15 '16 at 14:18

1 Answers1

0

Taking the code for the replace() and replaceAll() functions in this SO answer for replacing some text in a string:

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

bool replace(std::string& str, const std::string& from, const std::string& to) {
    size_t start_pos = str.find(from);
    if(start_pos == std::string::npos)
        return false;
    str.replace(start_pos, from.length(), to);
    return true;
}

void replaceAll(std::string& str, const std::string& from, const std::string& to) {
    if(from.empty())
        return;
    size_t start_pos = 0;
    while((start_pos = str.find(from, start_pos)) != std::string::npos) {
        str.replace(start_pos, from.length(), to);
        start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
    }
}

int main()
{
    ifstream calendar("calendar.php");
    std::stringstream buffer;
    // read whole file in a buffer
    buffer << calendar.rdbuf();
    // use a new file for output
    ofstream newcalendar;
    newcalendar.open("newcalendar.php");
    string search  = "$url = 'some_URL_to_some_site'";
    string to = "$url = 'some_URL_to_some_other_site'";
    string content = buffer.str();
    replaceAll(content, search, to);
    newcalendar << content;
    newcalendar.close();
    calendar.close();
    remove("calendar.php");
    rename("newcalendar.php", "calendar.php");
    return 0;
}

Be careful, the spelling of the searched text has to be exact !

EDIT: Added two lines for renaming the files

Community
  • 1
  • 1
Gerard Rozsavolgyi
  • 4,834
  • 4
  • 32
  • 39
  • If I understand it correctly, this would create a new php file, which is not desired since the php file will be 'live' on the localhost. It seems to me that this uses a lot of code (maybe too much?) for such a small action. It might be neccesary to accomplish what I need, but isn't there a shorter way of doing it? Maybe something along the line of just deleting the second line and inserting a new one with given text.? – Nick Jan 15 '16 at 15:39
  • yes that's correct but it's easy to replace old file by new one when it's done. Writing on a "live file" on a production server might not be very safe ... – Gerard Rozsavolgyi Jan 15 '16 at 15:49
  • I see, the thing is it all needs to happen in an automated way because once the project is up, there will be no keyboard or mouse attached. The security isn't a big issue since it will be deployed in an isolated environment. The idea behind it is when a person is recognized, his/her personal ical calendar key is loaded in the PHP script so a personalized agenda is shown. That's why I'm looking for an answer that just replaces the url in the original PHP file – Nick Jan 15 '16 at 15:55
  • i've added the renaming in my answer of files so it's all done in at the same time – Gerard Rozsavolgyi Jan 15 '16 at 16:21
  • Using c++ is necessary though because of some decisions previously made in regard to this project. Thank you very much, it only needed a few adjustments to specify correct paths. You sir, are awesome – Nick Jan 15 '16 at 16:40