I'm working on implementing Safari Push Notification service for my website. I've been following the tutorial made by Apple which can be found here. And we have to create a package to serve push notifications and Apple provides a companion php file that helps to create the package.
Now I've downloaded the php file and tried running it, but it always throws a warning saying "Failed to open stream: No such file or directory".
Full Log:
D:\...\Downloads\php-7.0.4-nts-Win32-VC14-x86>php D:\..\Downloads\Safari-Push-Notifications-master\createPushPackage.php
Warning: copy(pushPackage.raw/icon.iconset/icon_16x16.png): failed to open stream: No such file or directory in ...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 30
Warning: copy(pushPackage.raw/icon.iconset/icon_16x16#2x.png): failed to open stream: No such file or directory in ...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 30
Warning: copy(pushPackage.raw/icon.iconset/icon_32x32.png): failed to open stream: No such file or directory in ...\Downloads\Safari-Push-Notifications-master\Safari-Push-Notifications-master\createPushPackage.php on line 30
Warning: copy(pushPackage.raw/icon.iconset/icon_32x32#2x.png): failed to open stream: No such file or directory in ...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 30
Warning: copy(pushPackage.raw/icon.iconset/icon_128x128.png): failed to open stream: No such file or directory in ...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 30
Warning: copy(pushPackage.raw/icon.iconset/icon_128x128#2x.png): failed to openstream: No such file or directory in ...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line30
Warning: copy(pushPackage.raw/website.json): failed to open stream: No such fileor directory in ...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 30
Warning: file_get_contents(D:/../Desktop/dntest1457346433/icon.iconset/icon_128x128#2x.png): failed to open stream: No such file or directory in D:\...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 39
.
.
.
Warning: file_get_contents(D:/../Desktop/dntest1457346433/icon.iconset/icon_16x16.png): failed to open stream: No such file or directory in D:\...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 39
Warning: file_get_contents(D:/../Desktop/dntest1457346433/website.json): failed to open stream: No such file or directory in ...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 39
Warning: file_get_contents(Desktop): failed to open stream: No such file or directory in D:\...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 47
PS: I do have a directory named pushPackage.raw that contains a folder called icon.iconset which has a set of 6 png images. So I have no idea why it says "No such file is present".
PHP Companion file
<?php
// This script creates a valid push package.
// This script assumes that the website.json file and iconset already exist.
// This script creates a manifest and signature, zips the folder, and returns the push package.
// Use this script as an example to generate a push package dynamically.
$certificate_path = "Desktop"; // Change this to the path where your certificate is located
$certificate_password = "pwd1"; // Change this to the certificate's import password
// Convenience function that returns an array of raw files needed to construct the package.
function raw_files() {
return array(
'icon.iconset/icon_16x16.png',
'icon.iconset/icon_16x16#2x.png',
'icon.iconset/icon_32x32.png',
'icon.iconset/icon_32x32#2x.png',
'icon.iconset/icon_128x128.png',
'icon.iconset/icon_128x128#2x.png',
'website.json'
);
}
// Copies the raw push package files to $package_dir.
function copy_raw_push_package_files($package_dir) {
mkdir($package_dir . '/icon.iconset');
foreach (raw_files() as $raw_file) {
copy("pushPackage.raw/$raw_file", "$package_dir/$raw_file");
}
}
// Creates the manifest by calculating the SHA1 hashes for all of the raw files in the package.
function create_manifest($package_dir) {
// Obtain SHA1 hashes of all the files in the push package
$manifest_data = array();
foreach (raw_files() as $raw_file) {
$manifest_data[$raw_file] = sha1(file_get_contents("$package_dir/$raw_file"));
}
file_put_contents("$package_dir/manifest.json", json_encode((object)$manifest_data));
}
// Creates a signature of the manifest using the push notification certificate.
function create_signature($package_dir, $cert_path, $cert_password) {
// Load the push notification certificate
$pkcs12 = file_get_contents($cert_path);
$certs = array();
if(!openssl_pkcs12_read($pkcs12, $certs, $cert_password)) {
return;
}
$signature_path = "$package_dir/signature";
// Sign the manifest.json file with the private key from the certificate
$cert_data = openssl_x509_read($certs['cert']);
$private_key = openssl_pkey_get_private($certs['pkey'], $cert_password);
openssl_pkcs7_sign("$package_dir/manifest.json", $signature_path, $cert_data, $private_key, array(), PKCS7_BINARY | PKCS7_DETACHED);
// Convert the signature from PEM to DER
$signature_pem = file_get_contents($signature_path);
$matches = array();
if (!preg_match('~Content-Disposition:[^\n]+\s*?([A-Za-z0-9+=/\r\n]+)\s*?-----~', $signature_pem, $matches)) {
return;
}
$signature_der = base64_decode($matches[1]);
file_put_contents($signature_path, $signature_der);
}
// Zips the directory structure into a push package, and returns the path to the archive.
function package_raw_data($package_dir) {
$zip_path = "$package_dir.zip";
// Package files as a zip file
$zip = new ZipArchive();
if (!$zip->open("$package_dir.zip", ZIPARCHIVE::CREATE)) {
error_log('Could not create ' . $zip_path);
return;
}
$raw_files = raw_files();
$raw_files[] = 'manifest.json';
$raw_files[] = 'signature';
foreach ($raw_files as $raw_file) {
$zip->addFile("$package_dir/$raw_file", $raw_file);
}
$zip->close();
return $zip_path;
}
// Creates the push package, and returns the path to the archive.
function create_push_package() {
global $certificate_path, $certificate_password;
// Create a temporary directory in which to assemble the push package
$package_dir = 'D:/Users/Mike/Desktop/dntest' . time();
if (!mkdir($package_dir)) {
unlink($package_dir);
die;
}
copy_raw_push_package_files($package_dir);
create_manifest($package_dir);
create_signature($package_dir, $certificate_path, $certificate_password);
$package_path = package_raw_data($package_dir);
return $package_path;
}
// MAIN
$package_path = create_push_package();
if (empty($package_path)) {
http_response_code(500);
die;
}
header("Content-type: application/zip");
echo file_get_contents($package_path);
die;
Another thing, this php script does create a package at the specified location (D:/Users/Mike/Desktop), but without the contents present in the pushPackage.raw directory.
Please help me resolve this issue. Thank you so much!
You need to run createPushPackage.php from the folder with Safari-Push-Notifications package (in your case D:\..\Downloads\Safari-Push-Notifications-master\) because code copy("pushPackage.raw/$raw_file", "$package_dir/$raw_file"); use relative path to assets files.
Add some explanation for relative paths:
bash$ pwd
/var/www/test # we inside /var/www/
bash$ ls -la # there are 2 files
-rw-r--r-- 1 alexanderpolomodov wheel 48 Mar 7 15:07 test.php
-rw-r--r-- 1 alexanderpolomodov wheel 15 Mar 7 15:08 test.txt
# test.php consist from one string
# var_dump(file_get_contents('test.txt'));
bash$ php test.php # run this script
string(15) "test filepaths"
bash$ cd ..
# when we run this command from another folder we get error
bash$ php test/test.php
Warning: file_get_contents(test.txt): failed to open stream: No such file or directory in /private/var/www/test/test.php on line 3
bool(false)
Related
i have a config file and i have to in multiple programs so it's located in /etc
the name of the file is cnf.json and permissions are 666 (read and write for owner, group, others) and the code i have is
try{
$file = fopen(CNF_PATH, "r");
print_r(error_get_last());
$data = fread($file, filesize(CNF_PATH));
echo $data;
}catch(Exception $e) {
}
error is Failed to open stream: Permission denied
what am i doing wrong?
i appreciate your suggestion and solutions.
Environment:
Laravel Version: 5.8.29
PHP Version $ php --version: PHP 7.2.24 (cli)
Problem Statement:
I'm unable to download file from s3 to local disk using put method in created directory.
ErrorException (E_WARNING) : file_put_contents(/path/storage/4804_1626): failed to open stream: Is a directory
However, I've found that directory has been created with below permission. I tried setting permission 777 as passing third parameter in makeDirectory() method but it didn't work.
ubuntu#ip:~/path/storage$ ll
drwxr-xr-x 2 www-data www-data 4096 Sep 20 07:07 4804_1626/
Files & Configuration:
$folderPath = Storage::disk('local')->makeDirectory($folderName, 0777);
$contents = Storage::disk('s3')->get('path/' . $fileName);
Storage::disk('local')->put($folderName, $contents); // Following line is throwing error
You need to specify full path to file, not only folder:
Storage::disk('local')->put($folderName . '/' . $fileName, $contents);
I have a sample code using laravel
error: failed to open stream: No such file or directory in file
$test = 'sample_remote_tempfile.txt';
$content = Storage::get('upload/'.$test);
foreach (file($content) as $line) {
explode(" , ", trim($content),"\n");
die($content);
}
( IF USE LARAVEL )
use command, to clear autoload files, and update routes to load new names of clases.
> composer dumpautoload
Check your routes file, to verify that all class names are spelled correctly
routes\web.php
I run my webserver on windows (XAMPP Control Panel v3.2.2). I am creating files and folders like this:
use File;
...
$Path = app_path()
. '/Projects/'
. strtolower($Project->name)
. '/Schema/';
if (File::exists($Path)) {
$result = 1;
} else {
$result = File::makeDirectory($unitPath , '775', true);
$content = "the content is basically a whole controller";
$file = $Path . strtolower($Unit->name) . '.php';
$bytes_written = File::put($file, $content);
if ($bytes_written === false) {
return false;
}
}
The file which I create is a PHP controller.
The files and folders are created. However by using git bash I noticed that the permission is not set to 775 even though I have specified it in makeDirectory, same for the files.
If I try to execute an action from the created file (which is a controller), then I get:
ErrorException in
C:\xampp\htdocs\selenium\vendor\composer\ClassLoader.php line 440:
include(C:\xampp\htdocs\selenium): failed to open stream: Permission
denied
How can I solve this, other than running my webserver on linux instead of windows?
NOTE: Everything works fine on my computer at home, where I also run the webserver on windows. The only difference is that I am using Windows 10 64bit at home and Windows 7 64bit here at work.
UPDATE:
The ErrorException include(C:\xampp\htdocs\selenium): failed to open stream: Permission denied dissapeared after executing composer update. But the question how I can create a file/folders with specific permissions persists.
UPDATE 2:
After creating a new file the ErrorException appears again...
I am trying to get crontab to run a php file, here is the cronjob
10 * * * * /usr/bin/php /var/www/update/ranks.php >> /var/www/update/log/ranks.txt
But I keep getting an error saying the required file does not exist
PHP Warning: require_once(../mws_products.php): failed to open stream: No such file or directory in /var/www/update/ranks.php on line 2
PHP Fatal error: require_once(): Failed opening required '../mws_products.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/update/ranks.php on line 2
I do not get this problem when I run the file from a browser or when I go into the directory of the file and execute the file e.g. cd /var/www/update/
ranks.php
<?php
require_once('../mws_products.php');
echo "-------------------------------------------------------------\n";
echo date('d-M-Y H:i:s',time())."\n";
echo "Update Ranks\n";
$products->updateRanks();
$database->addUpdate("ranks", time());
echo "\n\n\n";
?>
folder structure
[folder] update
|____ [file] ranks.php
[file] mws_products.php
What could be causing this problem? (note: I have tried restarting apache and the server)
As your are running in a crontab from the root directory ../mws_pruducts.php does not exists, relative to the given root.
There are multiple solutions, this is one of them:
define( 'ROOT', dirname(__FILE__) );
require_once(ROOT . '/../mws_products.php');
Try with the absolute path for the file...
require_once('/var/www/mws_products.php');