diff --git a/CHANGELOG.md b/CHANGELOG.md index 2065afc..59eba3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,17 +1,17 @@ todo - Added public page of the list of know urls and in/visible status - Added passworded links -- clean PSR-2 codding style and short array -- fix php 7.3+ and php 8.0.x compatibility -- fix compatibility with Dotclear 2.19 - fix widgets rendering - move setting to config file - fix dashboard rendering - fix deprecated external service -- create readme file 2021.08.27 - add dashboard icon +- clean PSR-2 codding style and short array +- fix php 7.3+ and php 8.0.x compatibility +- fix compatibility with Dotclear 2.19 +- create readme file 2011.04.01 * Changed version numbering diff --git a/_prepend.php b/_prepend.php index 70d3be7..70abb77 100644 --- a/_prepend.php +++ b/_prepend.php @@ -42,6 +42,7 @@ $d = dirname(__FILE__) . '/inc/'; $__autoload['kutrl'] = $d . 'class.kutrl.php'; $__autoload['kutrlService'] = $d . 'lib.kutrl.srv.php'; $__autoload['kutrlLog'] = $d . 'lib.kutrl.log.php'; +$__autoload['kutrlLinksList'] = $d . 'lib.kutrl.lst.php'; # Services $__autoload['bilbolinksKutrlService'] = $d . 'services/class.bilbolinks.service.php'; diff --git a/dcstore.xml b/dcstore.xml new file mode 100644 index 0000000..ab3a5d3 --- /dev/null +++ b/dcstore.xml @@ -0,0 +1,13 @@ + + +kUtRL +2021.08.27 +Jean-Christian Denis and contributors +Use, create and serve short url on your blog +https://github.com/JcDenis/kUtRL/releases/download/v2021.08.27/plugin-kUtRL.zip +2.19 +http://plugins.dotaddict.org/dc2/details/kUtRL + +https://github.com/JcDenis/kUtRL + + \ No newline at end of file diff --git a/icon-b.png b/icon-b.png index 0359bb8..1cd7362 100644 Binary files a/icon-b.png and b/icon-b.png differ diff --git a/icon.png b/icon.png index d995261..b7c079a 100644 Binary files a/icon.png and b/icon.png differ diff --git a/inc/img/kutrl_logo.png b/inc/img/kutrl_logo.png deleted file mode 100644 index def9fa8..0000000 Binary files a/inc/img/kutrl_logo.png and /dev/null differ diff --git a/inc/index.link.php b/inc/index.link.php deleted file mode 100644 index b39a1d1..0000000 --- a/inc/index.link.php +++ /dev/null @@ -1,140 +0,0 @@ -con->escape($_POST['str'])); - $hash = empty($_POST['custom']) ? null : $_POST['custom']; - - if (empty($url)) { - throw new Exception(__('There is nothing to shorten.')); - } - if (!$kut->testService()) { - throw new Exception(__('Service is not well configured.')); - } - if (null !== $hash && !$kut->allow_custom_hash) { - throw new Exception(__('This service does not allowed custom hash.')); - } - if (!$kut->isValidUrl($url)) { - throw new Exception(__('This link is not a valid URL.')); - } - if (!$kut->isLongerUrl($url)) { - throw new Exception(__('This link is too short.')); - } - if (!$kut->isProtocolUrl($url)) { - throw new Exception(__('This type of link is not allowed.')); - } - if (!$kut->allow_external_url && !$kut->isBlogUrl($url)) { - throw new Exception(__('Short links are limited to this blog URL.')); - } - if ($kut->isServiceUrl($url)) { - throw new Exception(__('This link is already a short link.')); - } - if (null !== $hash && false !== ($rs = $kut->isKnowHash($hash))) { - throw new Exception(__('This custom short url is already taken.')); - } - if (false !== ($rs = $kut->isKnowUrl($url))) { - $url = $rs->url; - $new_url = $kut->url_base .$rs->hash; - $msg = - '

' . - sprintf( - __('Short link for %s is %s') , - '' . html::escapeHTML($url) .'', - '' . $new_url . '' - ) . '

'; - } else { - if (false === ($rs = $kut->hash($url, $hash))) { - if ($kut->error->flag()) { - throw new Exception($kut->error->toHTML()); - } - throw new Exception(__('Failed to create short link. This could be caused by a service failure.')); - } else { - $url = $rs->url; - $new_url = $kut->url_base . $rs->hash; - $msg = - '

' . - sprintf( - __('Short link for %s is %s'), - '' . html::escapeHTML($url) . '', - '' . $new_url . '' - ) . '

'; - - # ex: Send new url to messengers - if (!empty($rs)) { - $core->callBehavior('adminAfterKutrlCreate', $core, $rs,__('New short URL')); - } - } - } - } catch (Exception $e) { - $core->error->add($e->getMessage()); - } -} - -echo ' - -kUtRL, ' . __('Links shortener') . '' . $header . ' - -

kUtRL' . -' › ' . __('Links') . '' . -' › ' . __('New link') . -'

' . $msg; - -if (null === $kut) { - echo '

' . __('You must set an admin service.') . '

'; -} else { - echo ' - '; -} -dcPage::helpBlock('kUtRL'); -echo $footer . ''; \ No newline at end of file diff --git a/inc/index.links.php b/inc/index.links.php deleted file mode 100644 index a2535b1..0000000 --- a/inc/index.links.php +++ /dev/null @@ -1,264 +0,0 @@ -rs->isEmpty()) { - echo '

' . __('No short link') . '

'; - } else { - $pager = new pager($page, $this->rs_count, $nb_per_page, 10); - - $pager->base_url = $url; - - $html_block = - '' . - '' . - '' . - '' . - '' . - '' . - '' . - '' . - '' . - '%s' . - '
' . __('Hash') . '' . __('Link') . '' . __('Date') . '' . __('Service') . '
'; - - echo '

' . __('Page(s)') . ' : ' . $pager->getLinks() . '

'; - $blocks = explode('%s', $html_block); - echo $blocks[0]; - - $this->rs->index(((integer)$page - 1) * $nb_per_page); - $iter = 0; - while ($iter < $nb_per_page) { - - echo $this->line($url,$iter); - - if ($this->rs->isEnd()) { - break; - } else { - $this->rs->moveNext(); - } - $iter++; - } - echo $blocks[1]; - echo '

' . __('Page(s)') . ' : ' . $pager->getLinks() . '

'; - } - } - - private function line($url, $loop) - { - $type = $this->rs->kut_type; - $hash = $this->rs->kut_hash; - - if (null !== ($o = kutrl::quickService($this->rs->kut_type))) { - $type = '' . $o->name . ''; - $hash = '' . $hash . ''; - } - - return - '' . "\n" . - '' . - form::checkbox(['entries[' . $loop . ']'], $this->rs->kut_id, 0) . - '' . - '' . - $hash . - "\n" . - '' . - '' . $this->rs->kut_url . '' . - "\n" . - '' . - dt::dt2str(__('%Y-%m-%d %H:%M'), $this->rs->kut_dt, $this->core->auth->getInfo('user_tz')) . - "\n" . - '' . - $type . - "\n" . - '' . "\n"; - } -} - -# Logs class -$log = new kutrlLog($core); - -# Filters -$show_filters = false; -$urlsrv = !empty($_GET['urlsrv']) ? $_GET['urlsrv'] : ''; -$sortby = !empty($_GET['sortby']) ? $_GET['sortby'] : 'kut_dt'; -$order = !empty($_GET['order']) ? $_GET['order'] : 'desc'; - -$page = !empty($_GET['page']) ? (integer) $_GET['page'] : 1; -$nb_per_page = 30; -if (!empty($_GET['nb']) && (integer) $_GET['nb'] > 0) { - if ($nb_per_page != $_GET['nb']) { - $show_filters = true; - } - $nb_per_page = (integer) $_GET['nb']; -} - -# Combos -$sortby_combo = [ - __('Date') => 'kut_dt', - __('Long link') => 'kut_url', - __('Short link') => 'kut_hash' -]; - -$order_combo = [ - __('Descending') => 'desc', - __('Ascending') => 'asc' -]; - -$services_combo = []; -foreach(kutrl::getServices($core) as $service_id => $service) -{ - $o = new $service($core); - $services_combo[__($o->name)] = $o->id; -} -$ext_services_combo = array_merge([__('Disabled') => ''], $services_combo); -$lst_services_combo = array_merge(['-' => ''], $services_combo); - -# Params for list -$params = []; -$params['limit'] = [(($page-1)*$nb_per_page), $nb_per_page]; - -if ($sortby != '' && in_array($sortby, $sortby_combo)) { - if ($urlsrv != '' && in_array($urlsrv, $lst_services_combo)) { - $params['kut_type'] = $urlsrv; - } - if ($order != '' && in_array($order, $order_combo)) { - $params['order'] = $sortby . ' ' . $order; - } - if ($sortby != 'kut_dt' || $order != 'desc' || $urlsrv != '') { - $show_filters = true; - } -} - -$pager_base_url = - $p_url . - '&tab=list' . - '&urlsrv=' . $urlsrv . - '&sortby=' . $sortby . - '&order=' . $order . - '&nb=' . $nb_per_page . - '&page=%s'; - -# Delete links from list -if ($action == 'deletelinks') { - try { - foreach($_POST['entries'] as $k => $id) { - $rs = $log->getLogs(['kut_id' => $id]); - if ($rs->isEmpty()) { - continue; - } - if (null === ($o = kutrl::quickService($rs->kut_type))) { - continue; - } - $o->remove($rs->kut_url); - } - - $core->blog->triggerBlog(); - http::redirect($p_url . '&part=links&urlsrv=' . $urlsrv . '&sortby=' . $sortby . '&order=' . $order . '&nb=' . $nb_per_page . '&page=' . $page . '&msg=' . $action); - } catch (Exception $e) { - $core->error->add($e->getMessage()); - } -} - -# Get links and pager -try { - $list_all = $log->getLogs($params); - $list_counter = $log->getLogs($params, true)->f(0); - $list_current = new kutrlLinksList($core, $list_all, $list_counter, $pager_base_url); -} catch (Exception $e) { - $core->error->add($e->getMessage()); -} -if (!$show_filters) { - $header .= dcPage::jsLoad('js/filter-controls.js'); -} - -echo ' - -kUtRL, ' . __('Links shortener') . '' . -"\n\n" . -$header . ' - -

kUtRL' . -' › ' . __('Links') . -' - ' . __('New link') . '' . -'

' . $msg; - -if (!$show_filters) { - echo '

' . - __('Filters') . '

'; -} - -echo ' -
-
' . __('Filters') . ' -
-
- -
-
- - -
-
-

- -' . -form::hidden(['p'], 'kUtRL') . -form::hidden(['part'], 'links') . ' -

-
-
-
-
-
-
'; - -$list_current->display($page, $nb_per_page, $pager_base_url); - -echo ' -
-

-

-' . -form::hidden(['action'], 'deletelinks') . -form::hidden(['urlsrv'], $urlsrv) . -form::hidden(['sortby'], $sortby) . -form::hidden(['order'], $order) . -form::hidden(['page'], $page) . -form::hidden(['nb'], $nb_per_page) . -form::hidden(['p'], 'kUtRL') . -form::hidden(['part'], 'links') . -$core->formNonce() . ' -

-
-
'; - -dcPage::helpBlock('kUtRL'); -echo $footer . ''; -?> \ No newline at end of file diff --git a/inc/index.service.php b/inc/index.service.php deleted file mode 100644 index d240c0d..0000000 --- a/inc/index.service.php +++ /dev/null @@ -1,84 +0,0 @@ - $service) { - $o = new $service($core); - $o->saveSettings(); - } - $core->blog->triggerBlog(); - http::redirect($p_url . '&part=service§ion=' . $section . '&msg=' . $action); - } catch (Exception $e) { - $core->error->add($e->getMessage()); - } -} - -echo ' - -kUtRL, ' . __('Links shortener') . '' . $header . -dcPage::jsLoad('index.php?pf=kUtRL/js/service.js') . -"\n" . -' - -

kUtRL' . -' › ' . __('Links') . '' . -' › ' . __('Services') . -' - ' . __('New link') . '' . -'

' . $msg . ' -
'; - -foreach(kutrl::getServices($core) as $service_id => $service) { - $o = new $service($core); - - echo '
' . $o->name . ''; - - if (!empty($msg)) { - echo '

' . ( - $o->testService() ? - $img_green . ' ' . sprintf(__('%s API is well configured and runing.'), $o->name) : - $img_red . ' ' . sprintf(__('Failed to test %s API.'), $o->name) - ) . '

'; - //if ($o->error->flag()) { - echo $o->error->toHTML(); - //} - } - if (!empty($o->home)) { - echo '

' . sprintf(__('Learn more about %s.'), $o->name) . '

'; - } - $o->settingsForm(); - - echo '
'; -} - -echo ' -
-

' . -$core->formNonce() . -form::hidden(['p'], 'kUtRL') . -form::hidden(['part'], 'service') . -form::hidden(['action'], 'saveservice') . -form::hidden(['section'], $section) . ' -

-
'; -dcPage::helpBlock('kUtRL'); -echo $footer . ''; \ No newline at end of file diff --git a/inc/index.setting.php b/inc/index.setting.php deleted file mode 100644 index a605d79..0000000 --- a/inc/index.setting.php +++ /dev/null @@ -1,163 +0,0 @@ -kutrl_active; -$s_plugin_service = (string) $s->kutrl_plugin_service; -$s_admin_service = (string) $s->kutrl_admin_service; -$s_tpl_service = (string) $s->kutrl_tpl_service; -$s_wiki_service = (string) $s->kutrl_wiki_service; -$s_allow_external_url = (boolean) $s->kutrl_allow_external_url; -$s_tpl_passive = (boolean) $s->kutrl_tpl_passive; -$s_tpl_active = (boolean) $s->kutrl_tpl_active; -$s_admin_entry_default = (string) $s->kutrl_admin_entry_default; - -if ($default_part == 'setting' && $action == 'savesetting') { - try { - $s_active = !empty($_POST['s_active']); - $s_admin_service = $_POST['s_admin_service']; - $s_plugin_service = $_POST['s_plugin_service']; - $s_tpl_service = $_POST['s_tpl_service']; - $s_wiki_service = $_POST['s_wiki_service']; - $s_allow_external_url = !empty($_POST['s_allow_external_url']); - $s_tpl_passive = !empty($_POST['s_tpl_passive']); - $s_tpl_active = !empty($_POST['s_tpl_active']); - $s_admin_entry_default = !empty($_POST['s_admin_entry_default']); - - $s->put('kutrl_active', $s_active); - $s->put('kutrl_plugin_service', $s_plugin_service); - $s->put('kutrl_admin_service', $s_admin_service); - $s->put('kutrl_tpl_service', $s_tpl_service); - $s->put('kutrl_wiki_service', $s_wiki_service); - $s->put('kutrl_allow_external_url', $s_allow_external_url); - $s->put('kutrl_tpl_passive', $s_tpl_passive); - $s->put('kutrl_tpl_active', $s_tpl_active); - $s->put('kutrl_admin_entry_default', $s_admin_entry_default); - - $core->blog->triggerBlog(); - - http::redirect($p_url . '&part=setting&msg=' . $action . '§ion=' . $section); - } catch (Exception $e) { - $core->error->add($e->getMessage()); - } -} - -$services_combo = []; -foreach(kutrl::getServices($core) as $service_id => $service) { - $o = new $service($core); - $services_combo[__($o->name)] = $o->id; -} -$ext_services_combo = array_merge([__('Disabled')=>''], $services_combo); -$lst_services_combo = array_merge(['-'=>''], $services_combo); - -echo ' - -kUtRL, ' . __('Links shortener') . '' . $header . -dcPage::jsLoad('index.php?pf=kUtRL/js/setting.js') . -"\n" . -' - -

kUtRL' . -' › ' . __('Links') . '' . -' › ' . __('Settings') . -' - ' . __('New link') . '' . -'

' . $msg . ' -
- -
' . __('Plugin activation') . ' -

-
- -
' . __('General rules') . ' -

-

' . __('Not only link started with this blog URL could be shortened.') . '

-

-

' . __('If this extension is disabled and the passive mode is enabled, "kutrl" tags (like EntryKurl) will display long urls instead of nothing on templates.') . '

-

-

' . __('If the active mode is enabled, all know default template tags (like EntryURL) will display short urls instead of long ones on templates.') . '
' . -__('You can disable URL shortening for a specific template tag by adding attribute disable_kutrl="1" to it . ') . '

-

-

' . __('This can be changed on page of creation/edition of an entry.') . '

-
- -
' . __('Default services') . ' -

-

' . __('Service to use in this admin page and on edit page of an entry.') . '

-

-

' . __('Service to use on third part plugins.') . '

-

-

' . __('Shorten links automatically when using template value like "EntryKutrl".') . '

-

-

' . __('Shorten links automatically found in contents using wiki synthax.') . '

-
- -
-

' . -$core->formNonce() . -form::hidden(['p'], 'kUtRL') . -form::hidden(['part'], 'setting') . -form::hidden(['action'], 'savesetting') . -form::hidden(['section'], $section) . ' -

-
'; -dcPage::helpBlock('kUtRL'); -echo $footer . ''; \ No newline at end of file diff --git a/inc/lib.kutrl.lst.php b/inc/lib.kutrl.lst.php new file mode 100644 index 0000000..1a5fa76 --- /dev/null +++ b/inc/lib.kutrl.lst.php @@ -0,0 +1,78 @@ +rs->isEmpty()) { + echo '

' . __('No short link') . '

'; + } else { + $pager = new pager($page, $this->rs_count, $nb_per_page, 10); + + $pager->base_url = $url; + + $html_block = + '' . + '' . + '' . + '' . + '' . + '' . + '' . + '' . + '' . + '%s' . + '
' . __('Hash') . '' . __('Link') . '' . __('Date') . '' . __('Service') . '
'; + + echo '

' . __('Page(s)') . ' : ' . $pager->getLinks() . '

'; + $blocks = explode('%s', $html_block); + echo $blocks[0]; + + $this->rs->index(((integer)$page - 1) * $nb_per_page); + $iter = 0; + while ($iter < $nb_per_page) { + + echo $this->line($url,$iter); + + if ($this->rs->isEnd()) { + break; + } else { + $this->rs->moveNext(); + } + $iter++; + } + echo $blocks[1]; + echo '

' . __('Page(s)') . ' : ' . $pager->getLinks() . '

'; + } + } + + private function line($url, $loop) + { + $type = $this->rs->kut_type; + $hash = $this->rs->kut_hash; + + if (null !== ($o = kutrl::quickService($this->rs->kut_type))) { + $type = '' . $o->name . ''; + $hash = '' . $hash . ''; + } + + return + '' . "\n" . + '' . + form::checkbox(['entries[' . $loop . ']'], $this->rs->kut_id, 0) . + '' . + '' . + $hash . + "\n" . + '' . + '' . $this->rs->kut_url . '' . + "\n" . + '' . + dt::dt2str(__('%Y-%m-%d %H:%M'), $this->rs->kut_dt, $this->core->auth->getInfo('user_tz')) . + "\n" . + '' . + $type . + "\n" . + '' . "\n"; + } +} \ No newline at end of file diff --git a/inc/services/class.googl.service.php b/inc/services/class.googl.service.php index 61cb439..95523d1 100644 --- a/inc/services/class.googl.service.php +++ b/inc/services/class.googl.service.php @@ -24,7 +24,7 @@ class googlKutrlService extends kutrlService private $url_api = 'https://www.googleapis.com/urlshortener/v1/url'; private $url_test = 'http://dotclear.jcdenis.com/go/kUtRL'; private $args = [ - 'key' => 'AIzaSyDE1WfOMdnrnX8p51jSmVodenaNk385asc' + 'key' => '' ]; private $headers = array('Content-Type: application/json'); diff --git a/inc/services/class.local.service.php b/inc/services/class.local.service.php index 9f64880..31204ef 100644 --- a/inc/services/class.local.service.php +++ b/inc/services/class.local.service.php @@ -97,7 +97,7 @@ class localKutrlService extends kutrlService '

' . __('There are two templates delivered with kUtRL, if you do not use default theme, you may adapt them to yours.') . '
' . __('Files are in plugin directory /default-templates, just copy them into your theme and edit them.') . '

' . - ''; + '
'; } public function testService() diff --git a/index.php b/index.php index 8ff5b16..4626cab 100644 --- a/index.php +++ b/index.php @@ -12,7 +12,7 @@ # -- END LICENSE BLOCK ------------------------------------ if (!defined('DC_CONTEXT_ADMIN')) { - return; + return; } # Check user perms @@ -23,45 +23,548 @@ $s = $core->blog->settings->kUtRL; # Default values $show_filters = false; -$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ''; -$section = isset($_REQUEST['section']) ? $_REQUEST['section'] : ''; -$img_green = 'ok'; -$img_red = 'fail'; +$p_url = $core->adminurl->get('admin.plugin.kUtRL'); +$part = isset($_REQUEST['part']) ? $_REQUEST['part'] : 'links'; +$action = isset($_POST['action']) ? $_POST['action'] : ''; -$header = -dcPage::jsLoad('index.php?pf=kUtRL/js/main.js') . -'\n" . -''; - -$footer = '

-' . __('Settings') . ' - -' . __('Services') . ' - -kUtRL - ' . $core->plugins->moduleInfo('kUtRL','version') . '  -' . __('kUtRL') . ' -

'; - -# Messages -$msg = isset($_REQUEST['msg']) ? $_REQUEST['msg'] : ''; -$msg_list = [ - 'savesetting' => __('Configuration successfully saved'), - 'saveservice' => __('Services successfully updated'), - 'createlink' => __('Link successfully shorten'), - 'deletelinks' => __('Links successfully deleted') -]; -if (isset($msg_list[$msg])) { - $msg = sprintf('

%s

', $msg_list[$msg]); +# used in setting & links +if (in_array($part, ['setting', 'links'])) { + $services_combo = []; + foreach(kutrl::getServices($core) as $service_id => $service) { + $o = new $service($core); + $services_combo[__($o->name)] = $o->id; + } + $ext_services_combo = array_merge([__('Disabled')=>''], $services_combo); + $lst_services_combo = array_merge(['-'=>''], $services_combo); } -# Pages -$start_part = $s->kutrl_active ? 'links' : 'setting'; -$default_part = isset($_REQUEST['part']) ? $_REQUEST['part'] : $start_part; - -if (!file_exists(dirname(__FILE__) . '/inc/index.' . $default_part . '.php')) { - $default_part = 'setting'; +# used in setting & service +if (in_array($part, ['setting', 'service'])) { + $img_green = 'ok'; + $img_red = 'fail'; } -include dirname(__FILE__) . '/inc/index.' . $default_part . '.php'; \ No newline at end of file + +# setting +if ($part == 'setting') { + $s_active = (boolean) $s->kutrl_active; + $s_plugin_service = (string) $s->kutrl_plugin_service; + $s_admin_service = (string) $s->kutrl_admin_service; + $s_tpl_service = (string) $s->kutrl_tpl_service; + $s_wiki_service = (string) $s->kutrl_wiki_service; + $s_allow_external_url = (boolean) $s->kutrl_allow_external_url; + $s_tpl_passive = (boolean) $s->kutrl_tpl_passive; + $s_tpl_active = (boolean) $s->kutrl_tpl_active; + $s_admin_entry_default = (string) $s->kutrl_admin_entry_default; + + if (!empty($_POST['save'])) { + try { + $s_active = !empty($_POST['s_active']); + $s_admin_service = (string) $_POST['s_admin_service']; + $s_plugin_service = (string) $_POST['s_plugin_service']; + $s_tpl_service = (string) $_POST['s_tpl_service']; + $s_wiki_service = (string) $_POST['s_wiki_service']; + $s_allow_external_url = !empty($_POST['s_allow_external_url']); + $s_tpl_passive = !empty($_POST['s_tpl_passive']); + $s_tpl_active = !empty($_POST['s_tpl_active']); + $s_admin_entry_default = !empty($_POST['s_admin_entry_default']); + + $s->put('kutrl_active', $s_active); + $s->put('kutrl_plugin_service', $s_plugin_service); + $s->put('kutrl_admin_service', $s_admin_service); + $s->put('kutrl_tpl_service', $s_tpl_service); + $s->put('kutrl_wiki_service', $s_wiki_service); + $s->put('kutrl_allow_external_url', $s_allow_external_url); + $s->put('kutrl_tpl_passive', $s_tpl_passive); + $s->put('kutrl_tpl_active', $s_tpl_active); + $s->put('kutrl_admin_entry_default', $s_admin_entry_default); + + $core->blog->triggerBlog(); + + dcPage::addSuccessNotice( + __('Configuration successfully saved') + ); + + http::redirect($p_url . '&part=setting'); + } catch (Exception $e) { + $core->error->add($e->getMessage()); + } + } +} + +# services +if ($part == 'service' && !empty($_POST['save'])) { + try { + foreach(kutrl::getServices($core) as $service_id => $service) { + $o = new $service($core); + $o->saveSettings(); + } + $core->blog->triggerBlog(); + + dcPage::addSuccessNotice( + __('Configuration successfully saved') + ); + + http::redirect($p_url . '&part=service'); + } catch (Exception $e) { + $core->error->add($e->getMessage()); + } +} + +# link creation +if ($part == 'link') { + $kut = kutrl::quickPlace('admin'); + + if (!empty($_POST['save'])) { + try { + if (null === $kut) { + throw new Exception('Unknow service'); + } + $url = trim($core->con->escape($_POST['str'])); + $hash = empty($_POST['custom']) ? null : $_POST['custom']; + + if (empty($url)) { + throw new Exception(__('There is nothing to shorten.')); + } + if (!$kut->testService()) { + throw new Exception(__('Service is not well configured.')); + } + if (null !== $hash && !$kut->allow_custom_hash) { + throw new Exception(__('This service does not allowed custom hash.')); + } + if (!$kut->isValidUrl($url)) { + throw new Exception(__('This link is not a valid URL.')); + } + if (!$kut->isLongerUrl($url)) { + throw new Exception(__('This link is too short.')); + } + if (!$kut->isProtocolUrl($url)) { + throw new Exception(__('This type of link is not allowed.')); + } + if (!$kut->allow_external_url && !$kut->isBlogUrl($url)) { + throw new Exception(__('Short links are limited to this blog URL.')); + } + if ($kut->isServiceUrl($url)) { + throw new Exception(__('This link is already a short link.')); + } + if (null !== $hash && false !== ($rs = $kut->isKnowHash($hash))) { + throw new Exception(__('This custom short url is already taken.')); + } + if (false !== ($rs = $kut->isKnowUrl($url))) { + $url = $rs->url; + $new_url = $kut->url_base .$rs->hash; + + dcPage::addSuccessNotice(sprintf( + __('Short link for %s is %s'), + '' . html::escapeHTML($url) . '', + '' . $new_url . '' + )); + } else { + if (false === ($rs = $kut->hash($url, $hash))) { + if ($kut->error->flag()) { + throw new Exception($kut->error->toHTML()); + } + throw new Exception(__('Failed to create short link. This could be caused by a service failure.')); + } else { + $url = $rs->url; + $new_url = $kut->url_base . $rs->hash; + + dcPage::addSuccessNotice(sprintf( + __('Short link for %s is %s'), + '' . html::escapeHTML($url) . '', + '' . $new_url . '' + )); + + # ex: Send new url to messengers + if (!empty($rs)) { + $core->callBehavior('adminAfterKutrlCreate', $core, $rs,__('New short URL')); + } + } + } + } catch (Exception $e) { + $core->error->add($e->getMessage()); + } + } +} + +# links +if ($part == 'links') { + $log = new kutrlLog($core); + + $sortby_combo = [ + __('Date') => 'kut_dt', + __('Long link') => 'kut_url', + __('Short link') => 'kut_hash' + ]; + $order_combo = [ + __('Descending') => 'desc', + __('Ascending') => 'asc' + ]; + + $core->auth->user_prefs->addWorkspace('interface'); + $default_sortby = 'kut_dt'; + $default_order = $core->auth->user_prefs->interface->posts_order ?: 'desc'; + $nb_per_page = $core->auth->user_prefs->interface->nb_posts_per_page ?: 30; + $sortby = !empty($_GET['sortby']) ? $_GET['sortby'] : $default_sortby; + $order = !empty($_GET['order']) ? $_GET['order'] : $default_order; + $urlsrv = !empty($_GET['urlsrv']) ? $_GET['urlsrv'] : ''; + $page = !empty($_GET['page']) ? max(1, (integer) $_GET['page']) : 1; + $show_filters = false; + + if (!empty($_GET['nb']) && (integer) $_GET['nb'] > 0) { + if ($nb_per_page != (integer) $_GET['nb']) { + $show_filters = true; + } + $nb_per_page = (integer) $_GET['nb']; + } + + $params = []; + $params['limit'] = [(($page-1)*$nb_per_page), $nb_per_page]; + + if (!in_array($sortby, $sortby_combo)) { + $sortby = $default_sortby; + } + + if (!in_array($order, $order_combo)) { + $order = $default_order; + } + $params['order'] = $sortby . ' ' . $order; + + if ($urlsrv != '' && in_array($urlsrv, $lst_services_combo)) { + $params['kut_type'] = $urlsrv; + } + + if ($sortby != $default_sortby || $order != $default_order || $urlsrv != '') { + $show_filters = true; + } + + $pager_base_url = + $p_url . + '&urlsrv=' . $urlsrv . + '&sortby=' . $sortby . + '&order=' . $order . + '&nb=' . $nb_per_page . + '&page=%s'; + + try { + $list_all = $log->getLogs($params); + $list_counter = $log->getLogs($params, true)->f(0); + $list_current = new kutrlLinksList($core, $list_all, $list_counter); + } catch (Exception $e) { + $core->error->add($e->getMessage()); + } + + if (!empty($_POST['deletelinks'])) { + try { + foreach($_POST['entries'] as $id) { + $rs = $log->getLogs(['kut_id' => $id]); + if ($rs->isEmpty()) { + continue; + } + if (null === ($o = kutrl::quickService($rs->kut_type))) { + continue; + } + $o->remove($rs->kut_url); + } + + $core->blog->triggerBlog(); + + dcPage::addSuccessNotice( + __('Links successfully deleted') + ); + + http::redirect($p_url . '&part=links&urlsrv=' . $urlsrv . '&sortby=' . $sortby . '&order=' . $order . '&nb=' . $nb_per_page . '&page=' . $page); + } catch (Exception $e) { + $core->error->add($e->getMessage()); + } + } +} + +# display header +echo +'kUtRL, ' . __('Links shortener') . ''; + +if ($part == 'links') { + echo + '\n" . + dcPage::jsFilterControl($show_filters); +} + +echo +''; + +# display setting +if ($part == 'setting') { + echo + dcPage::breadcrumb( + [ + __('Links shortener') => '', + '' . __('Plugin configuration') . '' => '', + __('Services configuration') => $p_url .'&part=service' + ], + ['hl' => false] + ) . + dcPage::notices() . + + '

' . __('Plugin configuration') . '

+

' . __('Back to links list') . '

+ +
+ +
+

' . __('Plugin activation') . '

+

+
+ +
+

' . __('Behaviors') . '

+

+

' . __('Not only link started with this blog URL could be shortened.') . '

+

+

' . __('If this extension is disabled and the passive mode is enabled, "kutrl" tags (like EntryKurl) will display long urls instead of nothing on templates.') . '

+

+

' . __('If the active mode is enabled, all know default template tags (like EntryURL) will display short urls instead of long ones on templates.') . '
' . + __('You can disable URL shortening for a specific template tag by adding attribute disable_kutrl="1" to it . ') . '

+

+

' . __('This can be changed on page of creation/edition of an entry.') . '

+
+ +
+

' . __('Default services') . '

+

+

' . __('Service to use in this admin page and on edit page of an entry.') . '

+

+

' . __('Service to use on third part plugins.') . '

+

+

' . __('Shorten links automatically when using template value like "EntryKutrl".') . '

+

+

' . __('Shorten links automatically found in contents using wiki synthax.') . '

+
+ +

' . + $core->formNonce() . + form::hidden(['part'], 'setting') . ' +

+
'; +} + +# display service +if ($part == 'service') { + echo + dcPage::breadcrumb( + [ + __('Links shortener') => '', + __('Plugin configuration') => $p_url . '&part=setting', + '' . __('Services configuration') . '' => '' + ], + ['hl' => false] + ) . + dcPage::notices() . + + '

' . __('Services configuration') . '

' . + '

' . __('Back to links list') . '

'; + '
'; + + foreach(kutrl::getServices($core) as $service_id => $service) { + $o = new $service($core); + + echo '

' . $o->name . '

'; + + if (!empty($_POST['save'])) { + echo '

' . ( + $o->testService() ? + $img_green . ' ' . sprintf(__('%s API is well configured and runing.'), $o->name) : + $img_red . ' ' . sprintf(__('Failed to test %s API.'), $o->name) + ) . '

'; + //if ($o->error->flag()) { + echo $o->error->toHTML(); + //} + } + if (!empty($o->home)) { + echo '

' . sprintf(__('Learn more about %s.'), $o->name) . '

'; + } + $o->settingsForm(); + + echo '
'; + } + + echo ' +
+

' . + $core->formNonce() . + form::hidden(['part'], 'service') . ' +

+
'; +} + +# display link creation +if ($part == 'link') { + echo + dcPage::breadcrumb( + [ + __('Links shortener') => '', + __('Links') => $core->adminurl->get('admin.plugin.kUtRL'), + '' . __('New link') . '' => '' + ], + ['hl' => false] + ) . + dcPage::notices(); + + if (null === $kut) { + echo '

' . __('You must set an admin service.') . '

'; + } else { + echo ' +
+

' . sprintf(__('Shorten link using service "%s"'), $kut->name) . '

+
+ '; + } +} + +if ($part == 'links') { + echo + dcPage::breadcrumb( + [ + __('Links shortener') => '', + '' . __('Links') . '' => '', + __('New link') => $core->adminurl->get('admin.plugin.kUtRL').'&part=link' + ], + ['hl' => false] + ) . + dcPage::notices(); + + echo ' +
+

' . __('Show filters and display options') . '

+
+
+

' . __('Filters') . '

+

' . + form::combo('urlsrv', $lst_services_combo, $urlsrv) . ' +

+ +
+

' . __('Display options') . '

+

' . + form::combo('sortby', $sortby_combo, $sortby) . '

+

' . + form::combo('order', $order_combo, $order) . '

+

' . __('Show') . '

' . + + form::hidden('part', 'links') . + form::hidden('p', 'kUtRL') . ' + +
+
+ +

+

+
+ +
'; + + $list_current->display($page, $nb_per_page, $pager_base_url); + + echo ' +
+

+

+ ' . + form::hidden(['deletelinks'], 1) . + form::hidden(['urlsrv'], $urlsrv) . + form::hidden(['sortby'], $sortby) . + form::hidden(['order'], $order) . + form::hidden(['page'], $page) . + form::hidden(['nb'], $nb_per_page) . + form::hidden(['part'], 'links') . + $core->formNonce() . ' +

+
+
'; + +} +# display footer +dcPage::helpBlock('kUtRL'); + +echo +'

+' . __('Plugin configuration') . ' - +' . __('Services configuration') . ' - +kUtRL - ' . $core->plugins->moduleInfo('kUtRL', 'version') . '  + +' . __('kUtRL') . ' +

+'; \ No newline at end of file diff --git a/js/admin.js b/js/admin.js deleted file mode 100644 index e8101b4..0000000 --- a/js/admin.js +++ /dev/null @@ -1,15 +0,0 @@ -/* -- BEGIN LICENSE BLOCK ---------------------------------- - * This file is part of kUtRL, a plugin for Dotclear 2. - * - * Copyright (c) 2009-2011 JC Denis and contributors - * jcdenis@gdwd.com - * - * 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 ------------------------------------*/ - -$(function(){ - /* toogle admin form sidebar */ - $('#kutrl-form-title').toggleWithLegend($('#kutrl-form-content'),{cookie:'dcx_kutrl_admin_form_sidebar'}); -}); \ No newline at end of file diff --git a/js/main.js b/js/main.js deleted file mode 100644 index 8d0d5c9..0000000 --- a/js/main.js +++ /dev/null @@ -1,80 +0,0 @@ -/* -- BEGIN LICENSE BLOCK ---------------------------------- - * This file is part of kUtRL, a plugin for Dotclear 2. - * - * Copyright (c) 2009-2011 JC Denis and contributors - * jcdenis@gdwd.com - * - * 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 ------------------------------------*/ - -$(function(){ - /* tools */ - dotclear.jcTools = new jcToolsBox(); - /* wait message */ - $('#content').submit(function(){dotclear.jcTools.waitMessage();return true;}); -}); - -function jcToolsBox(){} - -jcToolsBox.prototype={ - text_wait:'Please wait', - section:'', - - formFieldsetToMenu:function(form){ - var This=this; - var section=$(form).children('fieldset[id='+This.section+']').attr('id'); - var hidden_section=$(form).children('input[name=section]').attr('value'); - var formMenu=$(form).children('p.formMenu').get(0); - if (formMenu==undefined) { - $(form).prepend($('

').addClass('formMenu')); - } - $(form).children('fieldset').each(function(){ - var Fieldset=this; - $(Fieldset).hide(); - var title=$(Fieldset).children('legend').text(); - var menu=$('').text(title).addClass('button').attr('tabindex','2').click( - function(){ - var fieldset_visible=$(form).children('fieldset:visible'); - if (fieldset_visible==undefined){ - $(Fieldset).slideDown('slow');$(form).children('input[type=submit]').show(); - }else{ - $(fieldset_visible).fadeOut('fast',function(){$(Fieldset).fadeIn('fast');$(form).children('input[type=submit]').show();}) - } - if (hidden_section==undefined){ - $(form).children('input[name=section]').remove(); - $(form).append($('').attr('name','section').attr('value',$(Fieldset).attr('id'))); - } - $('.message').fadeOut('slow',function(){$(this).slideUp('slow',function(){$(this).remove();})}); - } - ); - $(form).children('.formMenu').append(menu).append(' '); - }); - if (section!=undefined){ - $(form).children('fieldset[id='+section+']').show(); - }else{ - $(form).children('fieldset:first').show(); - } - }, - - waitMessage:function(){ - var This=this; - var content=$('div[id=content]'); - if (content!=undefined){ - $(content).hide(); - }else{ - $('input').hide();$('select').hide(); - content=$('body'); - } - var text=$('

').addClass('message').text(This.text_wait); - This.blinkItem(text); - var box=$('
').attr('style','margin: 60px auto auto;width:200px;').append(text); - $(content).before($(box)); - }, - - blinkItem:function(item){ - var This=this; - $(item).fadeOut('slow',function(){$(this).fadeIn('slow',function(){This.blinkItem(this);})}); - } -} \ No newline at end of file diff --git a/js/service.js b/js/service.js deleted file mode 100644 index ec78b52..0000000 --- a/js/service.js +++ /dev/null @@ -1,17 +0,0 @@ -/* -- BEGIN LICENSE BLOCK ---------------------------------- - * This file is part of kUtRL, a plugin for Dotclear 2. - * - * Copyright (c) 2009-2011 JC Denis and contributors - * jcdenis@gdwd.com - * - * 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 ------------------------------------*/ - -$(function() { - var kutrlForm=$('#service-form'); - if (kutrlForm!=undefined){ - dotclear.jcTools.formFieldsetToMenu(kutrlForm); - } -}); \ No newline at end of file diff --git a/js/setting.js b/js/setting.js deleted file mode 100644 index b450278..0000000 --- a/js/setting.js +++ /dev/null @@ -1,17 +0,0 @@ -/* -- BEGIN LICENSE BLOCK ---------------------------------- - * This file is part of kUtRL, a plugin for Dotclear 2. - * - * Copyright (c) 2009-2011 JC Denis and contributors - * jcdenis@gdwd.com - * - * 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 ------------------------------------*/ - -$(function() { - var kutrlForm=$('#setting-form'); - if (kutrlForm!=undefined){ - dotclear.jcTools.formFieldsetToMenu(kutrlForm); - } -}); \ No newline at end of file