*/ // must be run within Dokuwiki if(!defined('DOKU_INC')) die(); if (!defined('DOKU_LF')) define('DOKU_LF', "\n"); if (!defined('DOKU_TAB')) define('DOKU_TAB', "\t"); if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); define('CHPASSWD_BIN','/usr/local/sbin/chpasswd'); define('CHSMBPASSWD_BIN','/usr/local/sbin/chsmbpasswd'); require_once(DOKU_PLUGIN.'syntax.php'); require_once(DOKU_INC.'inc/auth.php'); class syntax_plugin_pwchange extends DokuWiki_Syntax_Plugin { function getInfo() { return array( 'author' => 'Dennis Wagelaar', 'email' => 'dennis.wagelaar@vub.ac.be', 'date' => '2008-11-13', 'name' => 'Pwchange Plugin', 'desc' => 'allows users to change their password via the passwd command', 'url' => 'http://wiki.splitbrain.org/plugin:pwchange', ); } function getType() { return 'substition'; } function getPType() { return 'block'; } function getSort() { return 98; } function connectTo($mode) { $this->Lexer->addSpecialPattern('~~PWCHANGE.*?~~', $mode, 'plugin_pwchange'); } function handle($match, $state, $pos, &$handler) { $match = substr($match, 2, -2); // strip markup list($junk, $parm) = explode(':', $match, 2); return array($parm); } function render($mode, &$renderer, $data) { global $conf; list($parm) = $data; // prevent caching to ensure the included pages are always fresh $renderer->info['cache'] = false; if ($mode == 'xhtml' && $_SERVER['REMOTE_USER']) { // check for password change command if ($_REQUEST['pwchange']) { // do password change $result = $this->_changepw(); // print result $renderer->p_open(); $renderer->strong_open(); $renderer->doc .= $result; $renderer->strong_close(); $renderer->p_close(); } // and render the pwchange box $this->_render_pwbox($renderer); return true; } return false; } function _changepw() { if (!@is_executable(CHPASSWD_BIN) || !@is_executable(CHSMBPASSWD_BIN)) { return 'Error: cannot invoke chpasswd command.'; } if ($_REQUEST['newpw'] != $_REQUEST['newpwverify']) { return 'Error: new password verification differs from new password.'; } $handle = popen(CHPASSWD_BIN, 'w'); fwrite($handle, $_SERVER['REMOTE_USER'] . "\n"); fwrite($handle, $_REQUEST['oldpw'] . "\n"); fwrite($handle, $_REQUEST['newpw'] . "\n"); $result = pclose($handle); if ($result != 0) { return 'Error: password change failed.'; } $handle = popen(CHSMBPASSWD_BIN, 'w'); fwrite($handle, $_SERVER['REMOTE_USER'] . "\n"); fwrite($handle, $_REQUEST['oldpw'] . "\n"); fwrite($handle, $_REQUEST['newpw'] . "\n"); $result = pclose($handle); if ($result != 0) { return 'Error: password change successful, but samba password change failed.'; } return 'Password change successful.'; } function _render_pwbox(&$renderer) { $renderer->doc .= '
'; $renderer->doc .= ''; $renderer->table_open(); $renderer->tablerow_open(); $renderer->tableheader_open(); $renderer->doc .= 'Username'; $renderer->tableheader_close(); $renderer->tablecell_open(); $renderer->doc .= $_SERVER['REMOTE_USER']; $renderer->tablecell_close(); $renderer->tablerow_close(); $renderer->tablerow_open(); $renderer->tableheader_open(); $renderer->doc .= 'Old password'; $renderer->tableheader_close(); $renderer->tablecell_open(); $renderer->doc .= ''; $renderer->tablecell_close(); $renderer->tablerow_close(); $renderer->tablerow_open(); $renderer->tableheader_open(); $renderer->doc .= 'New password'; $renderer->tableheader_close(); $renderer->tablecell_open(); $renderer->doc .= ''; $renderer->tablecell_close(); $renderer->tablerow_close(); $renderer->tablerow_open(); $renderer->tableheader_open(); $renderer->doc .= 'Verify new password'; $renderer->tableheader_close(); $renderer->tablecell_open(); $renderer->doc .= ''; $renderer->tablecell_close(); $renderer->tablerow_close(); $renderer->tablerow_open(); $renderer->tableheader_open(); $renderer->doc .= ' '; $renderer->tableheader_close(); $renderer->tablecell_open(); $renderer->doc .= ''; $renderer->tablecell_close(); $renderer->tablerow_close(); $renderer->table_close(); $renderer->doc .= '
'; } } // vim:ts=4:sw=4:et:enc=utf-8: