print "<table width='100%'><tr><td>";
print "<textarea dojoType=\"dijit.form.SimpleTextarea\" rows='4'
- style='font-size : 12px; width : 98%' id=\"tags_str\"
+ style='height : 100px; font-size : 12px; width : 98%' id=\"tags_str\"
name='tags_str'>$tags_str</textarea>
<div class=\"autocomplete\" id=\"tags_choices\"
style=\"display:none\"></div>";
$reply .= "<span class=\"main\">";
$reply .= "<span id='selected_prompt'></span>";
- $reply .= "<span class=\"sel_links\">
+ /*$reply .= "<span class=\"sel_links\">
<a href=\"#\" onclick=\"$sel_all_link\">".__('All')."</a>,
<a href=\"#\" onclick=\"$sel_unread_link\">".__('Unread')."</a>,
<a href=\"#\" onclick=\"$sel_inv_link\">".__('Invert')."</a>,
<a href=\"#\" onclick=\"$sel_none_link\">".__('None')."</a></li>";
- $reply .= "</span> ";
+ $reply .= "</span> "; */
$reply .= "<select dojoType=\"dijit.form.Select\"
onchange=\"headlineActionsChange(this)\">";
- $reply .= "<option value=\"false\">".__('More...')."</option>";
+
+ $reply .= "<option value=\"0\" disabled='1'>".__('Select...')."</option>";
+
+ $reply .= "<option value=\"$sel_all_link\">".__('All')."</option>";
+ $reply .= "<option value=\"$sel_unread_link\">".__('Unread')."</option>";
+ $reply .= "<option value=\"$sel_inv_link\">".__('Invert')."</option>";
+ $reply .= "<option value=\"$sel_none_link\">".__('None')."</option>";
$reply .= "<option value=\"0\" disabled=\"1\">".__('Selection toggle:')."</option>";
const HOOK_RENDER_ENCLOSURE = 29;
const HOOK_ARTICLE_FILTER_ACTION = 30;
const HOOK_ARTICLE_EXPORT_FEED = 31;
+ const HOOK_MAIN_TOOLBAR_BUTTON = 32;
const KIND_ALL = 1;
const KIND_SYSTEM = 2;
$auth_pass = $this->dbh->fetch_result($result, 0, "auth_pass");
- if ($auth_pass_encrypted) {
+ if ($auth_pass_encrypted && function_exists("mcrypt_decrypt")) {
require_once "crypt.php";
$auth_pass = decrypt_string($auth_pass);
}
$feed_language = $this->dbh->escape_string(trim($_POST["feed_language"]));
- if (strlen(FEED_CRYPT_KEY) > 0) {
- require_once "crypt.php";
- $auth_pass = substr(encrypt_string($auth_pass), 0, 250);
- $auth_pass_encrypted = 'true';
- } else {
- $auth_pass_encrypted = 'false';
- }
-
+ $auth_pass_encrypted = 'false';
$auth_pass = $this->dbh->escape_string($auth_pass);
if (get_pref('ENABLE_FEED_CATS')) {
"SELECT id FROM ttrss_feeds
WHERE feed_url = '$feed' AND owner_uid = ".$_SESSION["uid"]);
- if (strlen(FEED_CRYPT_KEY) > 0) {
- require_once "crypt.php";
- $pass = substr(encrypt_string($pass), 0, 250);
- $auth_pass_encrypted = 'true';
- } else {
- $auth_pass_encrypted = 'false';
- }
-
+ $auth_pass_encrypted = 'false';
$pass = $this->dbh->escape_string($pass);
if ($this->dbh->num_rows($result) == 0) {
*\r
*/\r
require_once 'lib/phpmailer/class.phpmailer.php';\r
+require_once 'lib/phpmailer/class.smtp.php';\r
require_once "config.php";\r
\r
class ttrssMailer extends PHPMailer {\r
$this->Username = SMTP_LOGIN;\r
$this->Password = SMTP_PASSWORD;\r
}\r
- if(SMTP_SECURE)
- $this->SMTPSecure = SMTP_SECURE;
+ if(SMTP_SECURE)\r
+ $this->SMTPSecure = SMTP_SECURE; \r
}\r
/* @brief a simple mail function to send email using the defaults\r
* This will send an HTML email using the configured defaults\r
// including PUSH, bookmarklets and browser integration will not work properly.
define('FEED_CRYPT_KEY', '');
+ // WARNING: mcrypt is deprecated in php 7.1. This directive exists for backwards
+ // compatibility with existing installs, new passwords are NOT going to be encrypted.
+ // Use update.php --decrypt-feeds to decrypt existing passwords in the database while
+ // mcrypt is still available.
+
// Key used for encryption of passwords for password-protected feeds
// in the database. A string of 24 random characters. If left blank, encryption
// is not used. Requires mcrypt functions.
margin-right : 4px;
}
+@media (max-width: 992px) {
+ #main-toolbar #selected_prompt {
+ display : none;
+ }
+}
+
span.contentPreview {
color : #999;
font-weight : normal;
return false;
}
-
- function encrypt_string($str) {
- $key = hash('SHA256', FEED_CRYPT_KEY, true);
-
- $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,
- MCRYPT_MODE_CBC), MCRYPT_RAND);
-
- $encstr = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str,
- MCRYPT_MODE_CBC, $iv);
-
- $iv_base64 = base64_encode($iv);
- $encstr_base64 = base64_encode($encstr);
-
- return "$iv_base64:$encstr_base64";
- }
?>
"SELECT id FROM ttrss_feeds
WHERE feed_url = '$url' AND owner_uid = ".$_SESSION["uid"]);
- if (strlen(FEED_CRYPT_KEY) > 0) {
- require_once "crypt.php";
- $auth_pass = substr(encrypt_string($auth_pass), 0, 250);
- $auth_pass_encrypted = 'true';
- } else {
- $auth_pass_encrypted = 'false';
- }
-
+ $auth_pass_encrypted = 'false';
$auth_pass = db_escape_string($auth_pass);
if (db_num_rows($result) == 0) {
$auth_login = db_fetch_result($result, 0, "auth_login");
$auth_pass = db_fetch_result($result, 0, "auth_pass");
- if ($auth_pass_encrypted) {
+ if ($auth_pass_encrypted && function_exists("mcrypt_decrypt")) {
require_once "crypt.php";
$auth_pass = decrypt_string($auth_pass);
}
$auth_login = db_fetch_result($result, 0, "auth_login");
$auth_pass = db_fetch_result($result, 0, "auth_pass");
- if ($auth_pass_encrypted) {
+ if ($auth_pass_encrypted && function_exists("mcrypt_decrypt")) {
require_once "crypt.php";
$auth_pass = decrypt_string($auth_pass);
}
<div id="toolbar" dojoType="dijit.layout.ContentPane" region="top">
<div id="main-toolbar" dojoType="dijit.Toolbar">
+ <?php
+ foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_MAIN_TOOLBAR_BUTTON) as $p) {
+ echo $p->hook_main_toolbar_button();
+ }
+ ?>
+
<form id="headlines-toolbar" action="" onsubmit='return false'>
</form>
<form id="main_toolbar_form" action="" onsubmit='return false'>
- <button dojoType="dijit.form.Button" id="collapse_feeds_btn"
- onclick="collapse_feedlist()"
- title="<?php echo __('Collapse feedlist') ?>" style="display : none">
- <<</button>
-
<select name="view_mode" title="<?php echo __('Show articles') ?>"
onchange="viewModeChanged()"
dojoType="dijit.form.Select">
$finished = false;
- if (function_exists("mcrypt_decrypt")) {
- $crypt_key = make_password(24);
- } else {
- $crypt_key = "";
- }
-
foreach ($data as $line) {
if (preg_match("/define\('DB_TYPE'/", $line)) {
$rv .= "\tdefine('DB_TYPE', '$DB_TYPE');\n";
$rv .= "\tdefine('DB_PORT', '$DB_PORT');\n";
} else if (preg_match("/define\('SELF_URL_PATH'/", $line)) {
$rv .= "\tdefine('SELF_URL_PATH', '$SELF_URL_PATH');\n";
- } else if (preg_match("/define\('FEED_CRYPT_KEY'/", $line)) {
- $rv .= "\tdefine('FEED_CRYPT_KEY', '$crypt_key');\n";
} else if (!$finished) {
$rv .= "$line\n";
}
function collapse_feedlist() {
try {
- if (!Element.visible('feeds-holder')) {
- Element.show('feeds-holder');
- $("collapse_feeds_btn").innerHTML = "<<";
- } else {
- Element.hide('feeds-holder');
- $("collapse_feeds_btn").innerHTML = ">>";
- }
+ Element.toggle("feeds-holder");
dijit.byId("main").resize();
print "</td></tr>";
- print "<tr><td colspan='2'><textarea dojoType=\"dijit.form.SimpleTextarea\" style='font-size : 12px; width : 98%' rows=\"20\"
+ print "<tr><td colspan='2'><textarea dojoType=\"dijit.form.SimpleTextarea\"
+ style='height : 200px; font-size : 12px; width : 98%' rows=\"20\"
name='content'>$content</textarea>";
print "</td></tr></table>";
--- /dev/null
+<?php
+class Toggle_Sidebar extends Plugin {
+
+ private $host;
+
+ function about() {
+ return array(1.0,
+ "Adds a main toolbar button to toggle sidebar",
+ "fox");
+ }
+
+ function init($host) {
+ $this->host = $host;
+
+ $host->add_hook($host::HOOK_MAIN_TOOLBAR_BUTTON, $this);
+ }
+
+ function hook_main_toolbar_button() {
+ ?>
+
+ <button dojoType="dijit.form.Button" onclick="collapse_feedlist()">
+ <img src="plugins/toggle_sidebar/application_side_list.png"
+ title="<?php echo __('Collapse feedlist') ?>">
+ </button>
+
+ <?php
+ }
+
+ function api_version() {
+ return 2;
+ }
+
+}
+?>
"debug-feed:",
"force-refetch",
"force-rehash",
+ "decrypt-feeds",
"help");
foreach (PluginHost::getInstance()->get_commands() as $command => $data) {
print " --debug-feed N - perform debug update of feed N\n";
print " --force-refetch - debug update: force refetch feed data\n";
print " --force-rehash - debug update: force rehash articles\n";
+ print " --decrypt-feeds - decrypt feed passwords\n";
print " --help - show this help\n";
print "Plugin options:\n";
update_rss_feed($feed);
}
+ if (isset($options["decrypt-feeds"])) {
+ $result = db_query("SELECT id, auth_pass FROM ttrss_feeds WHERE auth_pass_encrypted = true");
+
+ if (!function_exists("mcrypt_decrypt")) {
+ _debug("mcrypt functions not available.");
+ return;
+ }
+
+ require_once "crypt.php";
+
+ $total = 0;
+
+ db_query("BEGIN");
+
+ while ($line = db_fetch_assoc($result)) {
+ _debug("processing feed id " . $line["id"]);
+
+ $auth_pass = db_escape_string(decrypt_string($line["auth_pass"]));
+
+ db_query("UPDATE ttrss_feeds SET auth_pass_encrypted = false, auth_pass = '$auth_pass'
+ WHERE id = " . $line["id"]);
+
+ ++$total;
+ }
+
+ db_query("COMMIT");
+
+ _debug("$total feeds processed.");
+ }
+
PluginHost::getInstance()->run_commands($options);
if (file_exists(LOCK_DIRECTORY . "/$lock_filename"))
+ if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
+ fclose($lock_handle);
unlink(LOCK_DIRECTORY . "/$lock_filename");
?>