licenseBootstrap/inc/class.license.bootstrap.php

387 lines
8.4 KiB
PHP

<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
#
# This file is part of licenseBootstrap, a plugin for Dotclear 2.
#
# Copyright (c) 2009-2013 Jean-Christian Denis and contributors
# contact@jcdenis.fr http://jcd.lv
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- END LICENSE BLOCK ------------------------------------
if (!defined('DC_CONTEXT_ADMIN')) {
return null;
}
class licenseBootstrap
{
protected static $licenses = array();
/**
* Add license to a module.
*
* Note that you must check if module exists
* before calling this method.
*
* @param object $core dcCore instance
* @param array $module Module info
*/
public static function addLicense($core, $module)
{
$s = $core->blog->settings->licenseBootstrap;
# --BEHAVIOR-- licenseBootstrapBeforeAddLicense
$core->callBehavior(
'licenseBootstrapBeforeAddLicense',
$core,
$module
);
if ($s->write_full) {
licenseBootstrap::writeFullContent(
$s->license_name,
$module,
$s->overwrite
);
}
licenseBootstrap::writeHeadContent(
$s->license_name,
licenseBootstrap::decode($s->license_head),
$module,
$core->auth,
$s->overwrite,
$s->write_php,
$s->write_js,
$s->exclude_locales
);
# --BEHAVIOR-- licenseBootstrapAfterAddLicense
$core->callBehavior(
'licenseBootstrapAfterAddLicense',
$core,
$module
);
}
/**
* Get available licenses.
*
* @return array List of licenses names
*/
public static function getLicenses()
{
if (empty(licenseBootstrap::$licenses)) {
$file_reg = '/^([a-z0-9]+)\.head\.txt$/';
$res = array();
foreach (files::scandir(dirname(__FILE__).'/licenses/') as $file) {
if (preg_match($file_reg, $file, $matches)) {
$res[] = $matches[1];
}
}
licenseBootstrap::$licenses = $res;
}
return licenseBootstrap::$licenses;
}
/**
* Get license name.
*
* Check requested license name and return existing one.
*
* @param string $name License name
* @return string License name
*/
public static function getName($name='gpl2')
{
return in_array($name, self::getLicenses()) ? $name : 'gpl2';
}
/**
* Get license header.
*
* @param string $name License name
* @param string $content Header content
* @return string Header content
*/
public static function getHead($name='gpl2', $content='')
{
if (!in_array($name, self::getLicenses())) {
$name = 'gpl2';
$content = '';
}
return empty($content) ?
self::getContent($name, 'head') : $content;
}
/**
* Get full license.
*
* @param string $name License name
* @return string Full license content
*/
public static function getFull($name='gpl2')
{
return self::getContent($name, 'full');
}
/**
* Get original license content.
*
* @param string $name License name
* @param string $part License part (head or full)
* @return string License content
*/
public static function getContent($name='gpl2', $part='head')
{
if (!in_array($name, self::getLicenses())) {
$name = 'gpl2';
}
if (!in_array($part, array('head', 'full'))) {
$part = 'head';
}
return file_get_contents(
dirname(__FILE__).'/licenses/'.$name.'.'.$part.'.txt'
);
}
/**
* Write license block into module files headers
*
* @param string $name License name
* @param string $content License block content
* @param array $module Module info
* @param object $user dcAuth instance
* @param boolean $overwrite Overwrite existing license
* @param boolean $php Write license in PHP
* @param boolean $js Write license in JS
* @param boolean $locales Excludes locales folder
*/
public static function writeHeadContent($name, $content, $module, $user, $overwrite, $php, $js, $locales)
{
if (!isset($module['root']) || !is_writable($module['root'])) {
throw new Exception();
}
$license = self::replaceInfo(
self::getHead($name, $content),
$module,
$user
);
foreach(self::getModuleFiles($module['root']) as $file) {
if ($locales && preg_match('/(\.lang\.php|libs)/', $file)) {
continue;
}
$path = $module['root'].'/'.$file;
$extension = files::getExtension($file);
if ($php && $extension == 'php') {
file_put_contents(
$file,
self::replacePhpContent(
file_get_contents($file),
$license,
$overwrite
)
);
}
elseif ($js && $extension == 'js') {
file_put_contents(
$file,
self::replaceJsContent(
file_get_contents($file),
$license,
$overwrite
)
);
}
}
}
/**
* Write full license file
*
* @param string $name License name
* @param array $module Module info
* @param boolean $overwrite Overwrite existing license
*/
public static function writeFullContent($name, $module, $overwrite)
{
if (!isset($module['root']) || !is_writable($module['root'])) {
throw new Exception();
}
if (file_exists($module['root'].'/LICENSE') && !$overwrite) {
return null;
}
file_put_contents(
$module['root'].'/LICENSE',
self::getFull($name)
);
}
/**
* Replace license block in PHP file
*
* @param string $content File content
* @param string $license License content
* @param boolean $overwrite Overwrite existing license
* @return string File content
*/
protected static function replacePhpContent($content, $license, $overwrite)
{
$clean = preg_replace(
'/((# -- BEGIN LICENSE BLOCK ([-]+))(.*?)'.
'(# -- END LICENSE BLOCK ([-]+))([\n|\r\n]+))/msi',
'',
$content
);
if ($clean != $content && !$overwrite) {
return $content;
}
return preg_replace(
'/(\<\?php)/',
'<?php'.
"\r\n# -- BEGIN LICENSE BLOCK ----------------------------------\r\n".
"#\r\n".
'# '.str_replace("\n", "\n# ", trim($license)).
"\r\n#".
"\r\n# -- END LICENSE BLOCK ------------------------------------\r\n",
$clean,
1
);
}
/**
* Replace license block in JS files
*
* @param string $content File content
* @param string $license License content
* @param boolean $overwrite Overwrite existing license
* @return string File content
*/
protected static function replaceJsContent($content, $license, $overwrite)
{
$clean = preg_replace(
'/((\/\* -- BEGIN LICENSE BLOCK ([-]+))(.*?)'.
'(\* -- END LICENSE BLOCK ([-]+)\*\/)([\n|\r\n]+))/msi',
'',
$content
);
if ($clean != $content && !$overwrite) {
return $content;
}
return
"/* -- BEGIN LICENSE BLOCK ----------------------------------\r\n".
" *\r\n".
' * '.str_replace("\n", "\n * ", trim($license)).
"\r\n *".
"\r\n * -- END LICENSE BLOCK ------------------------------------*/\r\n\r\n".
$clean;
}
/**
* Replace info in license
*
* @param string $content License content
* @param array $module Module info
* @param array $user User info
* @return string License content
*/
protected static function replaceInfo($content, $module, $user)
{
return str_replace(
array(
'%year%',
'%module_id%',
'%module_name%',
'%module_author%',
'%module_type%',
'%user_cn%',
'%user_name%',
'%user_email%',
'%user_url%'
),
array(
date('Y'),
$module['id'],
$module['name'],
$module['author'],
$module['type'],
$user->getInfo('user_cn'),
$user->getinfo('user_name'),
$user->getInfo('user_email'),
$user->getInfo('user_url')
),
$content
);
}
/**
* Get list of module files
*
* @param string $path Path to scan
* @param string $dir Ignore
* @param array $res Ignore
* @return array List of files
*/
protected static function getModuleFiles($path, $dir='', $res=array())
{
$path = path::real($path);
if (!is_dir($path) || !is_readable($path)) {
return array();
}
if (!$dir) {
$dir = $path;
}
$files = files::scandir($path);
foreach($files AS $file) {
if (substr($file, 0, 1) == '.') {
continue;
}
if (is_dir($path.'/'.$file)) {
$res = self::getModuleFiles(
$path.'/'.$file, $dir.'/'.$file,
$res
);
}
else {
$res[] = empty($dir) ? $file : $dir.'/'.$file;
}
}
return $res;
}
public static function encode($a)
{
return base64_encode(serialize($a));
}
public static function decode($a)
{
return unserialize(base64_decode($a));
}
}