Ir para conteúdo
Jack Oliveira

DRAP AND DROP

Recommended Posts

Ola pessoal, boa noite a todos

 

Bom é o seguinte tenho um codigo html onde selecione um modelo de site para poder criar na base selecionada, ele criar ate então, mas ele esta pegando somente o index.html

Mas quero que ele salva junto ao novo projeto o css, js, img, images, assets e fonts, quando faço os ajuste para que pega tudo isso ele me da erro ao salvar 

Vou mostra parte do html onde faz a seleção dos modelos

 

<!-- new page modal-->
<div class="modal fade" id="new-page-modal" tabindex="-1" role="dialog">
  <div class="modal-dialog" role="document">   
    <form id="newPageForm" method="POST" action="save.php">        
    <div class="modal-content">
      <div class="modal-header">
        <h6 class="modal-title text-primary fw-normal"><i class="la la-lg la-file"></i> Nova página</h6>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">
        </button>
      </div>
      <div class="modal-body text">
        <div class="mb-3 row" data-key="type">      
            <label class="col-sm-3 col-form-label">
                Modelo 
                <abbr title="O conteúdo deste modelo será usado como ponto de partida para o novo modelo">
                    <i class="la la-lg la-question-circle text-primary"></i>
                </abbr>
                
            </label>      
            <div class="col-sm-9 input">
                <div>    
                    <select class="form-select" name="startTemplateUrl">        
                        <option value="themes/modelo-branco/branco-template.html">Modelo em branco</option>        
                        <option value="themes/modelo1/index.html">Modelo 1 de L2</option>       
                        <option value="themes/modelo2/index.html">Modelo 3 de L2</option>
                        <option value="themes/modelo3/index.html">Modelo 3 de L2 </option>                        
                    </select>    
                </div>
            </div>     
        </div>
        <div class="mb-3 row" data-key="href">     
             <label class="col-sm-3 col-form-label">Nome da página</label>      
            <div class="col-sm-9 input">
                <div>   
                    <input name="title" type="text" value="Minha página" class="form-control" placeholder="Minha página" required>  
                </div>
            </div>     
        </div>        
        <div class="mb-3 row" data-key="href">     
             <label class="col-sm-3 col-form-label">Nome do arquivo</label>      
            <div class="col-sm-9 input">
                <div>   
                    <input name="file" type="text" value="my-page.html" class="form-control" placeholder="index.html" required>  
                </div>
            </div>     
        </div>       
        <div class="mb-3 row" data-key="href">     
             <label class="col-sm-3 col-form-label">Salvar na pasta</label>      
            <div class="col-sm-9 input">
                <div>   
                    <input name="folder" type="text" value="my-pages" class="form-control" placeholder="/" required>  
                </div>
                
            </div>     
        </div>
      </div>
      <div class="modal-footer">
        <button class="btn btn-secondary btn-lg" type="reset" data-bs-dismiss="modal"><i class="la la-times"></i> Cancelar</button>
        <button class="btn btn-primary btn-lg" type="submit"><i class="la la-check"></i> Criar página</button>
      </div>
    </div>   
   </form>        
  </div>
</div>

A ideia aqui é salvar tudo que tiver depois do themes/demo1/

quando ele salva so salva 

my-pasta/index.html

e quando for salva ele salva dentro de um pasta Projetos/MeuSite1

Projetos/MeuSite2  e assim vai

Este é o save.php

 

<?php
define('MAX_FILE_LIMIT', 1024 * 1024 * 2);//Tamanho máximo de arquivo HTML de 2 megabytes
define('ALLOW_PHP', false);//verifique se o html salvo contém tag php e não salve se não for permitido
define('ALLOWED_OEMBED_DOMAINS', [
	'https://www.youtube.com/', 
	'https://www.vimeo.com/', 
	'https://www.twitter.com/'
]);//carregar URLs apenas de sites permitidos para oembed

function sanitizeFileName($file, $allowedExtension = 'html') {
	$basename = basename($file);
	$disallow = ['.htaccess', 'passwd'];
	if (in_array($basename, $disallow)) {
		showError('Nome de arquivo não permitido!');
		return '';
	}
	
	//sanitize, remova o ponto duplo .. e remova os parâmetros get, se houver
	$file = preg_replace('@\?.*$@' , '', preg_replace('@\.{2,}@' , '', preg_replace('@[^\/\\a-zA-Z0-9\-\._]@', '', $file)));
	
	if ($file) {
		$file = __DIR__ . DIRECTORY_SEPARATOR . $file;
	} else {
		return '';
	}
	
	//permitir apenas extensão .html
	if ($allowedExtension) {
		$file = preg_replace('/\.[^.]+$/', '', $file) . ".$allowedExtension";
	}
	return $file;
}

function showError($error) {
	header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
	die($error);
}

function validOembedUrl($url) {
	foreach (ALLOWED_OEMBED_DOMAINS as $domain) {
		if (strpos($url, $domain) === 0) {
			return true;
		}
	}
	
	return false;
}

$html   = '';
$file   = '';
$action = '';

if (isset($_POST['startTemplateUrl']) && !empty($_POST['startTemplateUrl'])) {
	$startTemplateUrl = sanitizeFileName($_POST['startTemplateUrl']);
	$html = '';
	if ($startTemplateUrl) {
		$html = file_get_contents($startTemplateUrl);
	}
} else if (isset($_POST['html'])){
	$html = substr($_POST['html'], 0, MAX_FILE_LIMIT);
	if (!ALLOW_PHP) {
		//if (strpos($html, '<?php') !== false) {
		if (preg_match('@<\?php|<\? |<\?=|<\s*script\s*language\s*=\s*"\s*php\s*"\s*>@', $html)) {
			showError('PHP não permitido!');
		}
	}
}

if (isset($_POST['file'])) {
	$file = sanitizeFileName($_POST['file']);
}

if (isset($_GET['action'])) {
	$action = htmlspecialchars(strip_tags($_GET['action']));
}

if ($action) {
	//ações do gerenciador de arquivos, excluir e renomear
	switch ($action) {
		case 'rename':
			$newfile = sanitizeFileName($_POST['newfile']);
			if ($file && $newfile) {
				if (rename($file, $newfile)) {
					echo "Arquivo '$file' renomeado para '$newfile'";
				} else {
					showError("Erro ao renomear arquivo '$file' renomeado para '$newfile'");
				}
			}
		break;
		case 'delete':
			if ($file) {
				if (unlink($file)) {
					echo "Arquivo '$file' excluído";
				} else {
					showError("Erro ao excluir arquivo '$file'");
				}
			}
		break;
		case 'saveReusable':
		    //bloco ou seção
			$type = $_POST['type'] ?? false;
			$name = $_POST['name'] ?? false;
			$html = $_POST['html'] ?? false;
			
			if ($type && $name && $html) {
				
				$file = sanitizeFileName("$type/$name");
				if ($file) {
					$dir = dirname($file);
					if (!is_dir($dir)) {
						echo "$dir pasta não existe\n";
						if (mkdir($dir, 0777, true)) {
							echo "$dir pasta foi criada\n";
						} else {
							showError("Erro ao criar pasta '$dir'\n");
						}				
					}
					
					if (file_put_contents($file, $html)) {
						echo "Arquivo salvo '$file'";
					} else {
						showError("Erro ao salvar arquivo '$file'\nAs possíveis causas são falta de permissão de gravação ou caminho de arquivo incorreto!");
					}
				} else {
					showError('Nome de arquivo inválido!');
				}
			} else {
				showError("Faltam dados de elementos reutilizáveis!\n");
			}
		break;
		case 'oembedProxy':
			$url = $_GET['url'] ?? '';
			if (validOembedUrl($url)) {
				header('Content-Type: application/json');
				echo file_get_contents($url);
			} else {
				showError('URL inválida!');
			}
		break;
		default:
			showError("Ação inválida '$action'!");
	}
} else {
	//salvar pagina
	if ($html) {
		if ($file) {
			$dir = dirname($file);
			if (!is_dir($dir)) {
				echo "$dir pasta não existe\n";
				if (mkdir($dir, 0777, true)) {
					echo "$dir pasta foi criada\n";
				} else {
					showError("Erro ao criar pasta '$dir'\n");
				}
			}

			if (file_put_contents($file, $html)) {
				echo "Arquivo salvo '$file'";
			} else {
				showError("Erro ao salvar arquivo '$file'\nAs possíveis causas são falta de permissão de gravação ou caminho de arquivo incorreto!");
			}	
		} else {
			showError('O nome do arquivo está vazio!');
		}
	} else {
		showError('O conteúdo HTML está vazio!');
	}
}

Espero que possam entender o que preciso aqui....  fico no aguardo!  quando eu tento mudar a forma de salva no php, ele me da erro de que não foi salvo, e volta ao orginal como esta ai acima ele salva, talvez eu esteja escapando alguma coisa que não estou vendo.... 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para salvar todos os arquivos e pastas relacionados ao template (CSS, JS, imagens, etc.), você pode modificar seu código PHP para copiar a estrutura de diretórios e os arquivos. Vou mostrar como você pode fazer isso:

HTML
 

O código HTML não precisa de muitas alterações, mas certifique-se de que os caminhos dos templates estejam corretos. Aqui está o trecho relevante do seu HTML para referência:  

<!-- new page modal-->
<div class="modal fade" id="new-page-modal" tabindex="-1" role="dialog">
  <div class="modal-dialog" role="document">
    <form id="newPageForm" method="POST" action="save.php">
      <div class="modal-content">
        <div class="modal-header">
          <h6 class="modal-title text-primary fw-normal"><i class="la la-lg la-file"></i> Nova página</h6>
          <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
        </div>
        <div class="modal-body text">
          <div class="mb-3 row" data-key="type">
            <label class="col-sm-3 col-form-label">
              Modelo
              <abbr title="O conteúdo deste modelo será usado como ponto de partida para o novo modelo">
                <i class="la la-lg la-question-circle text-primary"></i>
              </abbr>
            </label>
            <div class="col-sm-9 input">
              <div>
                <select class="form-select" name="startTemplateUrl">
                  <option value="themes/modelo-branco/branco-template.html">Modelo em branco</option>
                  <option value="themes/modelo1/index.html">Modelo 1 de L2</option>
                  <option value="themes/modelo2/index.html">Modelo 2 de L2</option>
                  <option value="themes/modelo3/index.html">Modelo 3 de L2 </option>
                </select>
              </div>
            </div>
          </div>
          <div class="mb-3 row" data-key="href">
            <label class="col-sm-3 col-form-label">Nome da página</label>
            <div class="col-sm-9 input">
              <div>
                <input name="title" type="text" value="Minha página" class="form-control" placeholder="Minha página" required>
              </div>
            </div>
          </div>
          <div class="mb-3 row" data-key="href">
            <label class="col-sm-3 col-form-label">Nome do arquivo</label>
            <div class="col-sm-9 input">
              <div>
                <input name="file" type="text" value="my-page.html" class="form-control" placeholder="index.html" required>
              </div>
            </div>
          </div>
          <div class="mb-3 row" data-key="href">
            <label class="col-sm-3 col-form-label">Salvar na pasta</label>
            <div class="col-sm-9 input">
              <div>
                <input name="folder" type="text" value="my-pages" class="form-control" placeholder="/" required>
              </div>
            </div>
          </div>
        </div>
        <div class="modal-footer">
          <button class="btn btn-secondary btn-lg" type="reset" data-bs-dismiss="modal"><i class="la la-times"></i> Cancelar</button>
          <button class="btn btn-primary btn-lg" type="submit"><i class="la la-check"></i> Criar página</button>
        </div>
      </div>
    </form>
  </div>
</div>


PHP (save.php)

Modifique o seu save.php para copiar a estrutura completa do template selecionado. Adicionado função para copiar diretórios recursivamente e ajustar o script para usar essa função.
 

<?php
define('MAX_FILE_LIMIT', 1024 * 1024 * 2);//Tamanho máximo de arquivo HTML de 2 megabytes
define('ALLOW_PHP', false);//verifique se o html salvo contém tag php e não salve se não for permitido
define('ALLOWED_OEMBED_DOMAINS', [
	'https://www.youtube.com/', 
	'https://www.vimeo.com/', 
	'https://www.twitter.com/'
]);//carregar URLs apenas de sites permitidos para oembed

function sanitizeFileName($file, $allowedExtension = 'html') {
	$basename = basename($file);
	$disallow = ['.htaccess', 'passwd'];
	if (in_array($basename, $disallow)) {
		showError('Nome de arquivo não permitido!');
		return '';
	}
	
	$file = preg_replace('@\?.*$@' , '', preg_replace('@\.{2,}@' , '', preg_replace('@[^\/\\a-zA-Z0-9\-\._]@', '', $file)));
	
	if ($file) {
		$file = __DIR__ . DIRECTORY_SEPARATOR . $file;
	} else {
		return '';
	}
	
	if ($allowedExtension) {
		$file = preg_replace('/\.[^.]+$/', '', $file) . ".$allowedExtension";
	}
	return $file;
}

function showError($error) {
	header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
	die($error);
}

function validOembedUrl($url) {
	foreach (ALLOWED_OEMBED_DOMAINS as $domain) {
		if (strpos($url, $domain) === 0) {
			return true;
		}
	}
	return false;
}

function copyDirectory($src, $dst) {
	$dir = opendir($src);
	@mkdir($dst);
	while(false !== ( $file = readdir($dir)) ) {
		if (( $file != '.' ) && ( $file != '..' )) {
			if ( is_dir($src . '/' . $file) ) {
				copyDirectory($src . '/' . $file, $dst . '/' . $file);
			}
			else {
				copy($src . '/' . $file, $dst . '/' . $file);
			}
		}
	}
	closedir($dir);
}

$html   = '';
$file   = '';
$action = '';

if (isset($_POST['startTemplateUrl']) && !empty($_POST['startTemplateUrl'])) {
	$startTemplateUrl = sanitizeFileName($_POST['startTemplateUrl']);
	if ($startTemplateUrl) {
		$templateDir = dirname($startTemplateUrl);
		$targetDir = __DIR__ . '/Projetos/' . sanitizeFileName($_POST['folder']);
		copyDirectory($templateDir, $targetDir);
		$html = file_get_contents($startTemplateUrl);
	}
} else if (isset($_POST['html'])){
	$html = substr($_POST['html'], 0, MAX_FILE_LIMIT);
	if (!ALLOW_PHP) {
		if (preg_match('@<\?php|<\? |<\?=|<\s*script\s*language\s*=\s*"\s*php\s*"\s*>@', $html)) {
			showError('PHP não permitido!');
		}
	}
}

if (isset($_POST['file'])) {
	$file = sanitizeFileName($_POST['file']);
}

if (isset($_GET['action'])) {
	$action = htmlspecialchars(strip_tags($_GET['action']));
}

if ($action) {
	switch ($action) {
		case 'rename':
			$newfile = sanitizeFileName($_POST['newfile']);
			if ($file && $newfile) {
				if (rename($file, $newfile)) {
					echo "Arquivo '$file' renomeado para '$newfile'";
				} else {
					showError("Erro ao renomear arquivo '$file' renomeado para '$newfile'");
				}
			}
		break;
		case 'delete':
			if ($file) {
				if (unlink($file)) {
					echo "Arquivo '$file' excluído";
				} else {
					showError("Erro ao excluir arquivo '$file'");
				}
			}
		break;
		case 'saveReusable':
			$type = $_POST['type'] ?? false;
			$name = $_POST['name'] ?? false;
			$html = $_POST['html'] ?? false;
			
			if ($type && $name && $html) {
				$file = sanitizeFileName("$type/$name");
				if ($file) {
					$dir = dirname($file);
					if (!is_dir($dir)) {
						echo "$dir pasta não existe\n";
						if (mkdir($dir, 0777, true)) {
							echo "$dir pasta foi criada\n";
						} else {
							showError("Erro ao criar pasta '$dir'\n");
						}
					}
					if (file_put_contents($file, $html)) {
						echo "Arquivo salvo '$file'";
					} else {
						showError("Erro ao salvar arquivo '$file'\nAs possíveis causas são falta de permissão de gravação ou caminho de arquivo incorreto!");
					}
				} else {
					showError('Nome de arquivo inválido!');
				}
			} else {
				showError("Faltam dados de elementos reutilizáveis!\n");
			}
		break;
		case 'oembedProxy':
			$url = $_GET['url'] ?? '';
			if (validOembedUrl($url)) {
				header('Content-Type: application/json');
				echo file_get_contents($url);
			} else {
				showError('URL inválida!');
			}
		break;
		default:
			showError("Ação inválida '$action'!");
	}
} else {
	if ($html) {
		if ($file) {
			$dir = dirname($file);
			if (!is_dir($dir)) {
				echo "$dir pasta não existe\n";
				if (mkdir($dir, 0777, true)) {
					echo "$dir pasta foi criada\n";
				} else {
					showError("Erro ao criar pasta '$dir'\n");
				}
			}
			if (file_put_contents($file, $html)) {
				echo "Arquivo salvo '$file'";
			} else {
				showError("Erro ao salvar arquivo '$file'\nAs possíveis causas são falta de permissão de gravação ou caminho de arquivo incorreto!");
			}
		} else {
			showError('O nome do arquivo está vazio!');
		}
	} else {
		showError('O conteúdo HTML está vazio!');
	}
}
?>

 

Explicação

  1. Função copyDirectory: Essa função copia recursivamente todos os arquivos e subdiretórios de um diretório fonte para um diretório destino.
     
  2. Modificação do processamento do template: Adicionado o código para copiar a estrutura do diretório do template para o destino especificado.
     

Com essas alterações, quando você selecionar um template e criar uma nova página, todo o conteúdo do diretório do template (CSS, JS, imagens, etc.) será copiado para a nova localização.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um adendo: tente programar códigos complexos, no mínimo, utilizando somente programação funcional e não misture com programação procedural.

https://www.alura.com.br/artigos/programacao-funcional-o-que-e

Exemplo:

<?php

define('MAX_FILE_LIMIT', 1024 * 1024 * 2); // Tamanho máximo de arquivo HTML de 2 megabytes
define('ALLOW_PHP', false); // Verifique se o html salvo contém tag php e não salve se não for permitido
define('ALLOWED_OEMBED_DOMAINS', [
    'https://www.youtube.com/', 
    'https://www.vimeo.com/', 
    'https://www.twitter.com/'
]); // Carregar URLs apenas de sites permitidos para oembed

// Função pura
function sanitizeFileName($file, $allowedExtension = 'html') {
    $basename = basename($file);
    $disallow = ['.htaccess', 'passwd'];
    if (in_array($basename, $disallow)) {
        showError('Nome de arquivo não permitido!');
        return '';
    }

    $file = preg_replace('@\?.*$@' , '', preg_replace('@\.{2,}@' , '', preg_replace('@[^\/\\a-zA-Z0-9\-\._]@', '', $file)));

    if ($file) {
        $file = __DIR__ . DIRECTORY_SEPARATOR . $file;
    } else {
        return '';
    }

    if ($allowedExtension) {
        $file = preg_replace('/\.[^.]+$/', '', $file) . ".$allowedExtension";
    }
    return $file;
}

// Função pura
function showError($error) {
    header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
    die($error);
}

// Função de alta ordem (recebe uma função como argumento)
function validOembedUrl($url) {
    return array_reduce(ALLOWED_OEMBED_DOMAINS, function($valid, $domain) use ($url) {
        return $valid || strpos($url, $domain) === 0;
    }, false);
}

// Função pura
function copyDirectory($src, $dst) {
    $dir = opendir($src);
    @mkdir($dst);
    while (false !== ($file = readdir($dir))) {
        if (($file != '.') && ($file != '..')) {
            if (is_dir($src . '/' . $file)) {
                copyDirectory($src . '/' . $file, $dst . '/' . $file);
            } else {
                copy($src . '/' . $file, $dst . '/' . $file);
            }
        }
    }
    closedir($dir);
}

// Função de alta ordem (recebe uma função como argumento)
function processAction($action, $data) {
    $actions = [
        'rename' => function($data) {
            $newfile = sanitizeFileName($data['newfile']);
            if ($data['file'] && $newfile) {
                if (rename($data['file'], $newfile)) {
                    echo "Arquivo '{$data['file']}' renomeado para '$newfile'";
                } else {
                    showError("Erro ao renomear arquivo '{$data['file']}' para '$newfile'");
                }
            }
        },
        'delete' => function($data) {
            if ($data['file']) {
                if (unlink($data['file'])) {
                    echo "Arquivo '{$data['file']}' excluído";
                } else {
                    showError("Erro ao excluir arquivo '{$data['file']}'");
                }
            }
        },
        'saveReusable' => function($data) {
            $type = $data['type'] ?? false;
            $name = $data['name'] ?? false;
            $html = $data['html'] ?? false;
            
            if ($type && $name && $html) {
                $file = sanitizeFileName("$type/$name");
                if ($file) {
                    $dir = dirname($file);
                    if (!is_dir($dir)) {
                        echo "$dir pasta não existe\n";
                        if (mkdir($dir, 0777, true)) {
                            echo "$dir pasta foi criada\n";
                        } else {
                            showError("Erro ao criar pasta '$dir'\n");
                        }
                    }
                    if (file_put_contents($file, $html)) {
                        echo "Arquivo salvo '$file'";
                    } else {
                        showError("Erro ao salvar arquivo '$file'\nAs possíveis causas são falta de permissão de gravação ou caminho de arquivo incorreto!");
                    }
                } else {
                    showError('Nome de arquivo inválido!');
                }
            } else {
                showError("Faltam dados de elementos reutilizáveis!\n");
            }
        },
        'oembedProxy' => function($data) {
            $url = $data['url'] ?? '';
            if (validOembedUrl($url)) {
                header('Content-Type: application/json');
                echo file_get_contents($url);
            } else {
                showError('URL inválida!');
            }
        }
    ];

    if (isset($actions[$action])) {
        $actions[$action]($data);
    } else {
        showError("Ação inválida '$action'!");
    }
}

$html = '';
$file = '';
$action = '';

if (isset($_POST['startTemplateUrl']) && !empty($_POST['startTemplateUrl'])) {
    $startTemplateUrl = sanitizeFileName($_POST['startTemplateUrl']);
    if ($startTemplateUrl) {
        $templateDir = dirname($startTemplateUrl);
        $targetDir = __DIR__ . '/Projetos/' . sanitizeFileName($_POST['folder']);
        copyDirectory($templateDir, $targetDir);
        $html = file_get_contents($startTemplateUrl);
    }
} else if (isset($_POST['html'])) {
    $html = substr($_POST['html'], 0, MAX_FILE_LIMIT);
    if (!ALLOW_PHP) {
        if (preg_match('@<\?php|<\? |<\?=|<\s*script\s*language\s*=\s*"\s*php\s*"\s*>@', $html)) {
            showError('PHP não permitido!');
        }
    }
}

if (isset($_POST['file'])) {
    $file = sanitizeFileName($_POST['file']);
}

if (isset($_GET['action'])) {
    $action = htmlspecialchars(strip_tags($_GET['action']));
}

if ($action) {
    processAction($action, ['file' => $file, 'newfile' => $_POST['newfile'] ?? '', 'type' => $_POST['type'] ?? '', 'name' => $_POST['name'] ?? '', 'html' => $_POST['html'] ?? '', 'url' => $_GET['url'] ?? '']);
} else {
    if ($html) {
        if ($file) {
            $dir = dirname($file);
            if (!is_dir($dir)) {
                echo "$dir pasta não existe\n";
                if (mkdir($dir, 0777, true)) {
                    echo "$dir pasta foi criada\n";
                } else {
                    showError("Erro ao criar pasta '$dir'\n");
                }
            }
            if (file_put_contents($file, $html)) {
                echo "Arquivo salvo '$file'";
            } else {
                showError("Erro ao salvar arquivo '$file'\nAs possíveis causas são falta de permissão de gravação ou caminho de arquivo incorreto!");
            }
        } else {
            showError('O nome do arquivo está vazio!');
        }
    } else {
        showError('O conteúdo HTML está vazio!');
    }
}
?>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Abaixo um exemplo de funções mais microgerenciadas, com documentação indicando se cada função é uma função pura ou não:

 

<?php

define('MAX_FILE_LIMIT', 1024 * 1024 * 2); // Tamanho máximo de arquivo HTML de 2 megabytes
define('ALLOW_PHP', false); // Verifique se o html salvo contém tag php e não salve se não for permitido
define('ALLOWED_OEMBED_DOMAINS', [
    'https://www.youtube.com/', 
    'https://www.vimeo.com/', 
    'https://www.twitter.com/'
]); // Carregar URLs apenas de sites permitidos para oembed

/**
 * Sanitiza o nome do arquivo.
 * Função pura.
 */
function sanitizeFileName($file, $allowedExtension = 'html') {
    $basename = getBaseName($file);
    if (isDisallowedFile($basename)) {
        showError('Nome de arquivo não permitido!');
        return '';
    }

    $file = sanitizeFilePath($file);
    if ($file) {
        $file = __DIR__ . DIRECTORY_SEPARATOR . $file;
    } else {
        return '';
    }

    if ($allowedExtension) {
        $file = addAllowedExtension($file, $allowedExtension);
    }
    return $file;
}

/**
 * Retorna o nome base do arquivo.
 * Função pura.
 */
function getBaseName($file) {
    return basename($file);
}

/**
 * Verifica se o arquivo é um dos arquivos não permitidos.
 * Função pura.
 */
function isDisallowedFile($basename) {
    $disallow = ['.htaccess', 'passwd'];
    return in_array($basename, $disallow);
}

/**
 * Sanitiza o caminho do arquivo.
 * Função pura.
 */
function sanitizeFilePath($file) {
    return preg_replace('@\?.*$@', '', preg_replace('@\.{2,}@', '', preg_replace('@[^\/\\a-zA-Z0-9\-\._]@', '', $file)));
}

/**
 * Adiciona a extensão permitida ao arquivo.
 * Função pura.
 */
function addAllowedExtension($file, $allowedExtension) {
    return preg_replace('/\.[^.]+$/', '', $file) . ".$allowedExtension";
}

/**
 * Exibe uma mensagem de erro e encerra a execução.
 * Função pura.
 */
function showError($error) {
    header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
    die($error);
}

/**
 * Verifica se a URL é permitida para oEmbed.
 * Função de alta ordem.
 */
function validOembedUrl($url) {
    return array_reduce(ALLOWED_OEMBED_DOMAINS, fn($valid, $domain) => $valid || strpos($url, $domain) === 0, false);
}

/**
 * Copia o diretório fonte para o diretório de destino.
 * Função não pura (opera no sistema de arquivos).
 */
function copyDirectory($src, $dst) {
    $dir = openDirectory($src);
    createDirectory($dst);
    while (false !== ($file = readDirectory($dir))) {
        if (isNotSpecialDir($file)) {
            $srcFilePath = $src . '/' . $file;
            $dstFilePath = $dst . '/' . $file;
            if (isDirectory($srcFilePath)) {
                copyDirectory($srcFilePath, $dstFilePath);
            } else {
                copyFile($srcFilePath, $dstFilePath);
            }
        }
    }
    closeDirectory($dir);
}

/**
 * Abre um diretório.
 * Função não pura (opera no sistema de arquivos).
 */
function openDirectory($path) {
    return opendir($path);
}

/**
 * Cria um diretório.
 * Função não pura (opera no sistema de arquivos).
 */
function createDirectory($path) {
    return @mkdir($path);
}

/**
 * Lê um diretório.
 * Função não pura (opera no sistema de arquivos).
 */
function readDirectory($dir) {
    return readdir($dir);
}

/**
 * Verifica se o arquivo não é um diretório especial (. ou ..).
 * Função pura.
 */
function isNotSpecialDir($file) {
    return ($file != '.' && $file != '..');
}

/**
 * Verifica se o caminho é um diretório.
 * Função não pura (opera no sistema de arquivos).
 */
function isDirectory($path) {
    return is_dir($path);
}

/**
 * Copia um arquivo de origem para o destino.
 * Função não pura (opera no sistema de arquivos).
 */
function copyFile($src, $dst) {
    return copy($src, $dst);
}

/**
 * Fecha um diretório.
 * Função não pura (opera no sistema de arquivos).
 */
function closeDirectory($dir) {
    closedir($dir);
}

/**
 * Processa as ações com base no tipo de ação.
 * Função de alta ordem.
 */
function processAction($action, $data) {
    $actions = [
        'rename' => function($data) {
            $newfile = sanitizeFileName($data['newfile']);
            if ($data['file'] && $newfile) {
                if (rename($data['file'], $newfile)) {
                    echo "Arquivo '{$data['file']}' renomeado para '$newfile'";
                } else {
                    showError("Erro ao renomear arquivo '{$data['file']}' para '$newfile'");
                }
            }
        },
        'delete' => function($data) {
            if ($data['file']) {
                if (unlink($data['file'])) {
                    echo "Arquivo '{$data['file']}' excluído";
                } else {
                    showError("Erro ao excluir arquivo '{$data['file']}'");
                }
            }
        },
        'saveReusable' => function($data) {
            $type = $data['type'] ?? false;
            $name = $data['name'] ?? false;
            $html = $data['html'] ?? false;
            
            if ($type && $name && $html) {
                $file = sanitizeFileName("$type/$name");
                if ($file) {
                    $dir = dirname($file);
                    if (!is_dir($dir)) {
                        echo "$dir pasta não existe\n";
                        if (mkdir($dir, 0777, true)) {
                            echo "$dir pasta foi criada\n";
                        } else {
                            showError("Erro ao criar pasta '$dir'\n");
                        }
                    }
                    if (file_put_contents($file, $html)) {
                        echo "Arquivo salvo '$file'";
                    } else {
                        showError("Erro ao salvar arquivo '$file'\nAs possíveis causas são falta de permissão de gravação ou caminho de arquivo incorreto!");
                    }
                } else {
                    showError('Nome de arquivo inválido!');
                }
            } else {
                showError("Faltam dados de elementos reutilizáveis!\n");
            }
        },
        'oembedProxy' => function($data) {
            $url = $data['url'] ?? '';
            if (validOembedUrl($url)) {
                header('Content-Type: application/json');
                echo file_get_contents($url);
            } else {
                showError('URL inválida!');
            }
        }
    ];

    if (isset($actions[$action])) {
        $actions[$action]($data);
    } else {
        showError("Ação inválida '$action'!");
    }
}

$html = '';
$file = '';
$action = '';

if (isset($_POST['startTemplateUrl']) && !empty($_POST['startTemplateUrl'])) {
    $startTemplateUrl = sanitizeFileName($_POST['startTemplateUrl']);
    if ($startTemplateUrl) {
        $templateDir = dirname($startTemplateUrl);
        $targetDir = __DIR__ . '/Projetos/' . sanitizeFileName($_POST['folder']);
        copyDirectory($templateDir, $targetDir);
        $html = file_get_contents($startTemplateUrl);
    }
} else if (isset($_POST['html'])) {
    $html = substr($_POST['html'], 0, MAX_FILE_LIMIT);
    if (!ALLOW_PHP) {
        if (containsPHP($html)) {
            showError('PHP não permitido!');
        }
    }
}

if (isset($_POST['file'])) {
    $file = sanitizeFileName($_POST['file']);
}

if (isset($_GET['action'])) {
    $action = sanitizeAction($_GET['action']);
}

if ($action) {
    processAction($action, [
        'file' => $file,
        'newfile' => $_POST['newfile'] ?? '',
        'type' => $_POST['type'] ?? '',
        'name' => $_POST['name'] ?? '',
        'html' => $_POST['html'] ?? '',
        'url' => $_GET['url'] ?? ''
    ]);
} else {
    if ($html) {
        if ($file) {
            if (!is_dir($dir = dirname($file))) {
                echo "$dir pasta não existe\n";
                if (!mkdir($dir, 0777, true)) {
                    showError("Erro ao criar pasta '$dir'\n");
                }
            }
            if (file_put_contents($file, $html)) {
                echo "Arquivo salvo '$file'";
            } else {
                showError("Erro ao salvar arquivo '$file'\nAs possíveis causas são falta de permissão de gravação ou caminho de arquivo incorreto!");
            }
        } else {
            showError('O nome do arquivo está vazio!');
        }
    } else {
        showError('O conteúdo HTML está vazio!');
    }
}

/**
 * Verifica se o conteúdo contém PHP.
 * Função pura.
 */
function containsPHP($html) {
    return preg_match('@<\?php|<\? |<\?=|<\s*script\s*language\s*=\s*"\s*php\s*"\s*>@', $html);
}

/**
 * Sanitiza a ação recebida via GET.
 * Função pura.
 */
function sanitizeAction($action) {
    return htmlspecialchars(strip_tags($action));
}
?>

Explicações das Funções:

  1. sanitizeFileName: Sanitiza o nome do arquivo. Função pura.
  2. getBaseName: Retorna o nome base do arquivo. Função pura.
  3. isDisallowedFile: Verifica se o arquivo é um dos arquivos não permitidos. Função pura.
  4. sanitizeFilePath: Sanitiza o caminho do arquivo. Função pura.
  5. addAllowedExtension: Adiciona a extensão permitida ao arquivo. Função pura.
  6. showError: Exibe uma mensagem de erro e encerra a execução. Função pura.
  7. validOembedUrl: Verifica se a URL é permitida para oEmbed. Função de alta ordem.
  8. copyDirectory: Copia o diretório fonte para o diretório de destino. Função não pura.
  9. openDirectory: Abre um diretório. Função não pura.
  10. createDirectory: Cria um diretório. Função não pura.
  11. readDirectory: Lê um diretório. Função não pura.
  12. isNotSpecialDir: Verifica se o arquivo não é um diretório especial (. ou ..). Função pura.
  13. isDirectory: Verifica se o caminho é um diretório. Função não pura.
  14. copyFile: Copia um arquivo de origem para o destino. Função não pura.
  15. closeDirectory: Fecha um diretório. Função não pura.
  16. processAction: Processa as ações com base no tipo de ação. Função de alta ordem.
  17. containsPHP: Verifica se o conteúdo contém PHP. Função pura.
  18. sanitizeAction: Sanitiza a ação recebida via GET. Função pura.

Este código agora está mais modularizado com funções microgerenciadas, facilitando a leitura e manutenção, além de seguir princípios de programação funcional onde aplicável.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por daemon
      Boa tarde,
       
      tenho o domío na raiz: teste.com.br
      Gostaria de criar uma barra /categoria.
       
      No caso fica teste.com.br/categoria/
      Tem como eu fazer este url sem criar a pasta categoria ?
    • Por daemon
      Estou com uma dúvida,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, porém gostara de mostrar a imagem que esta na pagina do link.
       
      É possível eu colocar na minha index o url, e aparecer uma preview da imagem que esta no link ? 
       
      Igual o google: https://news.google.com/topics/CAAqKggKIiRDQkFTRlFvSUwyMHZNRGx1YlY4U0JYQjBMVUpTR2dKQ1VpZ0FQAQ?hl=pt-BR&amp;gl=BR&amp;ceid=BR%3Apt-419
       
      No caso eu importo o tópico e descrição, porém não consigo deixar essa imagem na pagina principal.
    • Por violin101
      Caros amigos, saudações.

      Estou com uma dúvida:
      Como consigo fazer uma rotina no sistema onde possa fazer de forma automática trazer o resultado de entrada de produtos a cada 3 meses, por exemplo:

      Produtos --- Entrada ---  Meses
      Prod_A -------- 100 ------ 01/2024
      Prod_A -------- 120 ------ 03/2024
      Prod_A -------- 105 ------ 04/2024
      =========================
      Prod_B -------- 105 ------ 02/2024
      Prod_B -------- 120 ------ 03/2024
      Prod_B -------- 130 ------ 04/2024
      =========================
      ETC
       
      Como consigo mostrar para o usuário esse movimento de entrada a cada 3 meses ?

      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Peço desculpa em recorrer a ajuda dos amigos, pois está sendo um mistério para mim, configurar o meu sistema para Impressão de XML e NFe.

      Quando acrescento as linhas no início do Controller:
      use NFePHP\NFe\Make;
      use NFePHP\NFe\Tools;
      use NFePHP\NFe\Danfe;
      etc, etc.
       
       e chamo a libraries assim em alguma função:  $nfe = new Make(); e etc. <== o sistema acusa que não consegue achar 
       
      fiz as alterações necessárias no autoload
      /* |-------------------------------------------------------------------------- | Composer auto-loading |-------------------------------------------------------------------------- | | Enabling this setting will tell CodeIgniter to look for a Composer | package auto-loader script in application/vendor/autoload.php. | | $config['composer_autoload'] = TRUE; | | Or if you have your vendor/ directory located somewhere else, you | can opt to set a specific path as well: | | $config['composer_autoload'] = '/path/to/vendor/autoload.php'; | | For more information about Composer, please visit http://getcomposer.org/ | | Note: This will NOT disable or override the CodeIgniter-specific | autoloading (application/config/autoload.php) */ $config['composer_autoload'] = './vendor/autoload.php';  
      o meu composer.json está assim:
      { "description": "The CodeIgniter framework", "name": "codeigniter/framework", "type": "project", "homepage": "https://codeigniter.com", "license": "MIT", "support": { "forum": "http://forum.codeigniter.com/", "wiki": "https://github.com/bcit-ci/CodeIgniter/wiki", "irc": "irc://irc.freenode.net/codeigniter", "source": "https://github.com/bcit-ci/CodeIgniter" }, "require": { "php": ">=5.3.7", "mpdf/mpdf": "^7.1", "nfephp-org/sped-nfe": "^5.0", "nfephp-org/sped-da": "^1.0" }, "suggest": { "paragonie/random_compat": "Provides better randomness in PHP 5.x" }, "autoload": { "psr-4": { "Libraries\\": "application/libraries" } } }  
      após instalar a NFePhp através do composer, o caminho da pasta NFePhp está assim:
      nome_do_meu_sistema
      |____ application
      |______vendor
      |________nfephp-org
      |__________sped-common
      |__________sped-da
      |__________sped-gtin
      |__________sped-nfe

      Como consigo trazer os comando/libraries da NFe para poder utilizar no projeto.
       
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Estou com uma dúvida e não estou conseguindo resolver.
       
      Tenho uma tabela onde o usuário lança a Entrada de Produtos <=== até aqui tudo bem.

      O problema que estou encontrando é: 
      - após lançar os itens e se por alguma necessidade precisar fazer devolução, gostaria de alterar o STATUS do lançamento do PRODUTO de 1 para 2, ou seja:
       
      lançou:
      101 - Caneta ------- 10 x 1.50 = 15,00 status = 1
      102 - Lápis --------- 10 x 1.50 = 15,00 status = 1
      103 - Borracha ---- 10 x 1.50 = 15,00 status = 1
      104 - Apontador - 10 x 1.50 = 15,00 status = 1
       
      Se precisar DEVOLVER os itens 102 e 103 o Status de 1 passa para 2, ou seja:
      101 - Caneta ------- 10 x 1.50 = 15,00 status = 1
      102 - Lápis --------- 10 x 1.50 = 15,00 status = 2
      103 - Borracha ---- 10 x 1.50 = 15,00 status = 2
      104 - Apontador - 10 x 1.50 = 15,00 status = 1
       
      Obs.: como consigo filtrar o CódigoProduto + NúmeroLançamento, para não ocorrer o erro de alterar todos.
       
      O problema que estou enfrentando, quando dou o Comando para Alterar, o Sistema Altera todos os produtos lançados que estiver na base de dados, ou seja, onde tiver 102 e 103, o sistema altera.
       
      o meu código:
      CONTROLLER
      /*Salva o Detalhe do Lançamento*/ protected function save_detalhe($prods,$qtde,$vlrunit,$vlrtotal,$notaLct,$numlcto,$codslct){ for ($i=0; $i < count($prods); $i++) { $data = array( 'cod_prod' => $prods[$i], 'qtd_prod' => $qtde[$i], 'vlr_unit' => $vlrunit[$i], 'vlr_total' => $vlrtotal[$i], 'status' => 2, 'devitens' => 2, 'n_nf' => $notaLct, 'lancamentos_idlcto'=> $numlcto, ); //Função para Salvar os Detalhes do lançamento $this->devolucao_model->save_detalhe($data); //Função para Atualizar a Quantidade de Produto no Estoque $this->update_produto($prods[$i],$qtde[$i],$vlrunit[$i],$vlrtotal[$i]); //Função para Alterar Devolução do Item $this->upd_itens($prods[$i],$notaLct[$i],$codslct[$i]); } } /*<=== até aqui tudo certo, como deve ser feito*/ /* * O Problema está aqui * para não ocorrer duplicidade de Lançamento, * o sistema altera o Status do 1º. lançamento */ protected function upd_itens($idprds,$notaLct,$codslct){ $data = array( 'devitens' => 2, ); $this->devolucao_model->update_itens($idprds,$data); }  
      MODEL:
      //Altera o Campo Devolução do Item Lançado //Altera todos os código de produto que encontrar public function update_itens($idprds,$data){ $this->db->where("cod_prod",$idprds); return $this->db->update("lctos_itens",$data); }  
      Grato,
       
      Cesar






       
       
       
       
       
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.