BugTrack/2543
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
* 誰でもユーザーを登録できるようにする [#u9b84c47]
- ページ: [[BugTrack]]
- 投稿者: [[零鐵]]
- 優先順位: 低
- 状態: 提案
- カテゴリー: 本体新機能
- 投稿日: 2022-01-07 (金) 14:51:15
- バージョン: 1.5.3
** メッセージ [#zeeb233c]
誰でもユーザーを登録できるようにし、 %%Wikipediaにあるよ...
登録ユーザーへ個別に権限の設定ができるといいと思ってます XD
** ユーザー登録システムの実装案 ([[はいふん]]) [#e7153aa7]
:lib/auth.php|
ユーザー登録に関する関数をつくってみました。~
私はform_auth関数の次に埋め込んでます。
/**
* Check if username can be used
*
* @param String username
* @return true is usable username
*/
function is_usable_username($username)
{
global $auth_users;
if (in_array($username, array_keys($auth_users))) {
return false;
}
return true;
}
function exist_user($username) {
return !is_usable_username($username);
}
/**
* User registration
*/
function user_registration()
{
global $user_registration;
global $auth_users, $created_users;
if ($user_registration) {
if (file_exists(PKWK_USERLIST_CACHE)) {
$lines = file(PKWK_USERLIST_CACHE);
foreach ($lines as $line) {
list($user, $pass) = explode("\t", rtrim($line));
$created_users[$user] = array(
'edit_auth_pages' => $pass,
'password' => $pass,
);
$created_auth_users[$user] = $pass;
}
if ($created_auth_users) {
$auth_users += $created_auth_users;
unset($created_auth_users);
}
}
}
}
/**
* Create user
*
* @param String username
* @param String password
* @param boolean check
* @return true is created user
*/
function create_user($username, $password, $check)
{
global $user_registration, $created_users;
if (!$user_registration)
die_message('User registration is disabled.');
if ($username == '' || $password == '') return false;
if ($check) {
if (exist_user($username)) {
return false;
}
}
$created_users[$username] = array(
'password' => $password,
);
$file = PKWK_USERLIST_CACHE;
pkwk_touch_file($file);
$fp = fopen($file, 'r+') or
die_message('Cannot open ' . $file);
set_file_buffer($fp, 0);
flock($fp, LOCK_EX);
ftruncate($fp, 0);
rewind($fp);
foreach ($created_users as $user=>$data)
fputs($fp, $user . "\t" . $data['password'] . "\n");
flock($fp, LOCK_UN);
fclose($fp);
return true;
}
form_auth関数の変更箇所
function form_auth($username, $password)
{
global $ldap_user_account, $auth_users;
$user = $username;
if ($ldap_user_account) {
// LDAP account
return ldap_auth($username, $password);
} else {
// Defined users in pukiwiki.ini.php
- if (in_array($user, array_keys($auth_users))) {
+ if (exist_user($user)) {
if (pkwk_hash_compute(
$password,
$auth_users[$user]) === $auth_users[$user]) {
session_start();
session_regenerate_id(true); // require: PHP5.1+
$_SESSION['authenticated_user'] = $user;
$_SESSION['authenticated_user_fullname'] = $user;
return true;
}
}
}
return false;
}
定数の定義
/////////////////////////////////////////////////
// User registration
define('PKWK_USERLIST_CACHE', DATA_HOME . 'userlist.dat');
:lib/pukiwiki.php|
/////////////////////////////////////////////////
// Main
if ($vars['page'] === FALSE) {
die_invalid_pagename();
exit;
}
if (manage_page_redirect()) {
exit;
}
$retvars = array();
$is_cmd = FALSE;
if (isset($vars['cmd'])) {
$is_cmd = TRUE;
$plugin = & $vars['cmd'];
} else if (isset($vars['plugin'])) {
$plugin = & $vars['plugin'];
} else {
$plugin = '';
}
if ($plugin != '') {
+ user_registration();
ensure_valid_auth_user();
:plugin/loginform.inc.php|
function plugin_loginform_action()
{
global $auth_user, $auth_type, $_loginform_messages;
$page = isset($_GET['page']) ? $_GET['page'] : '';
$pcmd = isset($_GET['pcmd']) ? $_GET['pcmd'] : '';
$url_after_login = isset($_GET['url_after_login']) ? $_...
$page_after_login = $page;
if (!$url_after_login) {
$page_after_login = $page;
}
- $action_url = get_base_uri() . '?plugin=loginform'
- . '&page=' . rawurlencode($page)
- . ($url_after_login ? '&url_after_login=' . rawurlenc...
- . ($page_after_login ? '&page_after_login=' . rawurle...
$username = isset($_POST['username']) ? $_POST['usernam...
$password = isset($_POST['password']) ? $_POST['passwor...
$isset_user_credential = $username || $password ;
if ($username && $password && form_auth($username, $pas...
// Sign in successfully completed
form_auth_redirect($url_after_login, $page_after_login);
exit; // or 'return FALSE;' - Don't double check for F...
}
if ($pcmd === 'logout') {
// logout
switch ($auth_type) {
case AUTH_TYPE_BASIC:
header('WWW-Authenticate: Basic realm="Please cancel...
header('HTTP/1.0 401 Unauthorized');
break;
case AUTH_TYPE_FORM:
case AUTH_TYPE_EXTERNAL:
case AUTH_TYPE_SAML:
default:
$_SESSION = array();
session_regenerate_id(true); // require: PHP5.1+
session_destroy();
break;
}
$auth_user = '';
return array(
'msg' => 'Log out',
'body' => 'Logged out completely<br>'
. '<a href="'. get_page_uri($page) . '">'
. $page . '</a>'
);
+ } else if ($pcmd === 'registration') {
+ // registration
+ $password_confirm = isset($_POST['password_confirm'])...
+ $match_password = $password == $password_confirm;
+ $usable_username = is_usable_username($username);
+ if ($usable_username && $match_password) {
+ if (create_user($username, $password, false)) {
+ }
+ }
+ $action_url = get_base_uri() . '?plugin=loginform&pcm...
+ . '&page=' . rawurlencode($page)
+ . ($url_after_login ? '&url_after_login=' . rawurlenc...
+ . ($page_after_login ? '&page_after_login=' . rawurle...
+ ob_start();
+?>
+<style>
+ .registrationformcontainer {
+ text-align: center;
+ }
+ .registrationform table {
+ margin-top: 1em;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ .registrationform tbody td {
+ padding: .5em;
+ }
+ .registrationform .label {
+ text-align: right;
+ }
+ .registrationform .registration-button-container {
+ text-align: right;
+ }
+ .registrationform .registrationbutton {
+ margin-top: 1em;
+ }
+ .registrationform .errormessage {
+ color: red;
+ }
+</style>
+<div class="registrationformcontainer">
+<form name="loginform" class="registrationform" action=...
+<div>
+<table style="border:0">
+ <tbody>
+ <tr>
+ <td class="label"><label for="_plugin_registrationf...
+ <td><input type="text" name="username" value="<?php...
+ </tr>
+ <tr>
+ <td class="label"><label for="_plugin_registrationfor...
+ <td><input type="password" name="password" id="_plugi...
+ </tr>
+ <tr>
+ <td class="label"><label for="_plugin_registrationfor...
+ <td><input type="password" name="password_confirm" id...
+ </tr>
+<?php if (!$usable_username): ?>
+ <tr>
+ <td></td>
+ <td class="errormessage"><?php echo $_loginform_mes...
+ </tr>
+<?php endif ?>
+<?php if (!$match_password): ?>
+ <tr>
+ <td></td>
+ <td class="errormessage"><?php echo $_loginform_mes...
+ </tr>
+<?php endif ?>
+ <tr>
+ <td></td>
+ <td class="registration-button-container"><input ty...
+ </tr>
+ </tbody>
+</table>
+</div>
+<div>
+</div>
+</form>
+</div>
+<script><!--
+window.addEventListener && window.addEventListener("DOM...
+ var f = window.document.forms.loginform;
+ if (f && f.username && f.password) {
+ if (f.username.value) {
+ f.password.focus && f.password.focus();
+ } else {
+ f.username.focus && f.username.focus();
+ }
+ }
+});
+//-->
+</script>
+<?php
+ $body = ob_get_contents();
+ ob_end_clean();
+ return array(
+ 'msg' => $_loginform_messages['register'],
+ 'body' => $body,
+ );
+
} else {
// login
+ $action_url = get_base_uri() . '?plugin=loginform'
+ . '&page=' . rawurlencode($page)
+ . ($url_after_login ? '&url_after_login=' . rawurlenc...
+ . ($page_after_login ? '&page_after_login=' . rawurle...
ob_start();
?>
<style>
.loginformcontainer {
text-align: center;
}
:pukiwiki.ini.php|
私はUser definitionの近くに埋め込んでみました。
/////////////////////////////////////////////////
// User registration (0:Disable, 1:Enable)
$user_registration = 1;
:.htaccess|
# Prohibit direct access
-<FilesMatch "\.(ini\.php|lng\.php|txt|gz|tgz|zip)$">
+<FilesMatch "\.(ini\.php|lng\.php|txt|gz|tgz|zip|dat)$">
Require all denied
</FilesMatch>
ユーザー登録とはまた別だと思いますが、ユーザーのみ編集で...
:ja.lng.php|
Page titlesの箇所へ追加
$_title_cannotedit_not_login = 'ログインしていないため $...
Skinの箇所へ追加
$_LANG['skin']['registration'] = 'ユーザー登録';
差分
///////////////////////////////////////
// loginform.inc.php
$_loginform_messages = array(
'username' => 'ユーザー名:',
'password' => 'パスワード:',
+ 'password_confirm' => 'パスワード (確認):',
'login' => 'ログイン',
+ 'register' => 'ユーザー登録',
- 'invalid_username_or_password' => 'ユーザー名またはパ...
+ 'invalid_username_or_password' => 'ユーザー名またはパ...
+ 'unavailable_username' => '既にそのユーザー名は使われ...
+ 'not_match_password' => 'パスワードが確認と一致しません'
);
:skin/pukiwiki.skin.php|
<?php if ($enable_login) { ?>
[
- <?php _navigator('login') ?>
+ <?php _navigator('login') ?> |
+ <?php _navigator('registration') ?>
]
<?php } ?>
:lib/html.php|
$_LINK['upload'] = "$script?plugin=attach&pcmd=up...
+ $_LINK['registration'] = "$script?cmd=loginform&...
$_LINK['canonical_url'] = $canonical_url;
:en.lng.php|
Page titlesの箇所へ追加
$_title_cannotedit_not_login = '$1 is not editable becau...
Skinの箇所へ追加
$_LANG['skin']['registration'] = 'User registration';
差分
///////////////////////////////////////
// loginform.inc.php
$_loginform_messages = array(
'username' => 'Username',
'password' => 'Password',
+ 'password_confirm' => 'Password (Confirm):',
'login' => 'Log in',
+ 'register' => 'User registration',
- 'invalid_username_or_password' => 'The username or pas...
+ 'invalid_username_or_password' => 'The username or pas...
+ 'unavailable_username' => 'The username is already in ...
+ 'not_match_password' => 'Password and confirmed passwo...
);
:plugin/edit.inc.php|
定数定義
// ユーザーだけがページを編集できるようにする
define('PLUGIN_EDIT_WRITE_USER_ONLY', FALSE);
plugin_edit_action関数
function plugin_edit_action()
{
- global $vars, $_title_edit;
+ global $vars, $_title_edit, $auth_user, $_title_cannot...
if (PKWK_READONLY) die_message('PKWK_READONLY prohibits...
// Create initial pages
plugin_edit_setup_initial_pages();
$page = isset($vars['page']) ? $vars['page'] : '';
check_editable($page, true, true);
check_readable($page, true, true);
+ if (PLUGIN_EDIT_WRITE_USER_ONLY && !$auth_user) {
+ $body = $title = str_replace('$1',
+ htmlsc(strip_bracket($page)), $_title_cannotedit_not...
+ $page = str_replace('$1', make_search($page), $_title...
+ catbody($title, $page, $body);
+ exit;
+ }
''userlist.dat''に登録されたユーザーのデータが保存されま...
** 関連 [#fcca9a74]
- [[BugTrack/776]]
--------
- ユーザー管理をPukiWiki上で行うについては昔からいくつか...
- 「利用者ページ」や「下書き」はユーザー管理とはまた別の...
-- 「[[BugTrack/2554]] 利用者ページと下書き機能」として分...
- 「ユーザー登録システムの実装案 (はいふん)」はいふんさん...
-- 本命の対応は [[official:PukiWiki/Authentication]] にあ...
-- userlist.dat の内容と拡張子を pukiwiki.ini.php のよう...
-- いずれにしても、ユーザー管理をPukiWiki本体とは別建てに...
-- お二人ともご意見ありがとうございます。本体に組み込むの...
-- 「もしデータベースでユーザー管理を実装した場合では問題...
-- 「userlist.dat の内容と拡張子を pukiwiki.ini.php のよ...
-- 参考までに、外部認証を使ってTwitterアカウントでログイ...
#comment
終了行:
* 誰でもユーザーを登録できるようにする [#u9b84c47]
- ページ: [[BugTrack]]
- 投稿者: [[零鐵]]
- 優先順位: 低
- 状態: 提案
- カテゴリー: 本体新機能
- 投稿日: 2022-01-07 (金) 14:51:15
- バージョン: 1.5.3
** メッセージ [#zeeb233c]
誰でもユーザーを登録できるようにし、 %%Wikipediaにあるよ...
登録ユーザーへ個別に権限の設定ができるといいと思ってます XD
** ユーザー登録システムの実装案 ([[はいふん]]) [#e7153aa7]
:lib/auth.php|
ユーザー登録に関する関数をつくってみました。~
私はform_auth関数の次に埋め込んでます。
/**
* Check if username can be used
*
* @param String username
* @return true is usable username
*/
function is_usable_username($username)
{
global $auth_users;
if (in_array($username, array_keys($auth_users))) {
return false;
}
return true;
}
function exist_user($username) {
return !is_usable_username($username);
}
/**
* User registration
*/
function user_registration()
{
global $user_registration;
global $auth_users, $created_users;
if ($user_registration) {
if (file_exists(PKWK_USERLIST_CACHE)) {
$lines = file(PKWK_USERLIST_CACHE);
foreach ($lines as $line) {
list($user, $pass) = explode("\t", rtrim($line));
$created_users[$user] = array(
'edit_auth_pages' => $pass,
'password' => $pass,
);
$created_auth_users[$user] = $pass;
}
if ($created_auth_users) {
$auth_users += $created_auth_users;
unset($created_auth_users);
}
}
}
}
/**
* Create user
*
* @param String username
* @param String password
* @param boolean check
* @return true is created user
*/
function create_user($username, $password, $check)
{
global $user_registration, $created_users;
if (!$user_registration)
die_message('User registration is disabled.');
if ($username == '' || $password == '') return false;
if ($check) {
if (exist_user($username)) {
return false;
}
}
$created_users[$username] = array(
'password' => $password,
);
$file = PKWK_USERLIST_CACHE;
pkwk_touch_file($file);
$fp = fopen($file, 'r+') or
die_message('Cannot open ' . $file);
set_file_buffer($fp, 0);
flock($fp, LOCK_EX);
ftruncate($fp, 0);
rewind($fp);
foreach ($created_users as $user=>$data)
fputs($fp, $user . "\t" . $data['password'] . "\n");
flock($fp, LOCK_UN);
fclose($fp);
return true;
}
form_auth関数の変更箇所
function form_auth($username, $password)
{
global $ldap_user_account, $auth_users;
$user = $username;
if ($ldap_user_account) {
// LDAP account
return ldap_auth($username, $password);
} else {
// Defined users in pukiwiki.ini.php
- if (in_array($user, array_keys($auth_users))) {
+ if (exist_user($user)) {
if (pkwk_hash_compute(
$password,
$auth_users[$user]) === $auth_users[$user]) {
session_start();
session_regenerate_id(true); // require: PHP5.1+
$_SESSION['authenticated_user'] = $user;
$_SESSION['authenticated_user_fullname'] = $user;
return true;
}
}
}
return false;
}
定数の定義
/////////////////////////////////////////////////
// User registration
define('PKWK_USERLIST_CACHE', DATA_HOME . 'userlist.dat');
:lib/pukiwiki.php|
/////////////////////////////////////////////////
// Main
if ($vars['page'] === FALSE) {
die_invalid_pagename();
exit;
}
if (manage_page_redirect()) {
exit;
}
$retvars = array();
$is_cmd = FALSE;
if (isset($vars['cmd'])) {
$is_cmd = TRUE;
$plugin = & $vars['cmd'];
} else if (isset($vars['plugin'])) {
$plugin = & $vars['plugin'];
} else {
$plugin = '';
}
if ($plugin != '') {
+ user_registration();
ensure_valid_auth_user();
:plugin/loginform.inc.php|
function plugin_loginform_action()
{
global $auth_user, $auth_type, $_loginform_messages;
$page = isset($_GET['page']) ? $_GET['page'] : '';
$pcmd = isset($_GET['pcmd']) ? $_GET['pcmd'] : '';
$url_after_login = isset($_GET['url_after_login']) ? $_...
$page_after_login = $page;
if (!$url_after_login) {
$page_after_login = $page;
}
- $action_url = get_base_uri() . '?plugin=loginform'
- . '&page=' . rawurlencode($page)
- . ($url_after_login ? '&url_after_login=' . rawurlenc...
- . ($page_after_login ? '&page_after_login=' . rawurle...
$username = isset($_POST['username']) ? $_POST['usernam...
$password = isset($_POST['password']) ? $_POST['passwor...
$isset_user_credential = $username || $password ;
if ($username && $password && form_auth($username, $pas...
// Sign in successfully completed
form_auth_redirect($url_after_login, $page_after_login);
exit; // or 'return FALSE;' - Don't double check for F...
}
if ($pcmd === 'logout') {
// logout
switch ($auth_type) {
case AUTH_TYPE_BASIC:
header('WWW-Authenticate: Basic realm="Please cancel...
header('HTTP/1.0 401 Unauthorized');
break;
case AUTH_TYPE_FORM:
case AUTH_TYPE_EXTERNAL:
case AUTH_TYPE_SAML:
default:
$_SESSION = array();
session_regenerate_id(true); // require: PHP5.1+
session_destroy();
break;
}
$auth_user = '';
return array(
'msg' => 'Log out',
'body' => 'Logged out completely<br>'
. '<a href="'. get_page_uri($page) . '">'
. $page . '</a>'
);
+ } else if ($pcmd === 'registration') {
+ // registration
+ $password_confirm = isset($_POST['password_confirm'])...
+ $match_password = $password == $password_confirm;
+ $usable_username = is_usable_username($username);
+ if ($usable_username && $match_password) {
+ if (create_user($username, $password, false)) {
+ }
+ }
+ $action_url = get_base_uri() . '?plugin=loginform&pcm...
+ . '&page=' . rawurlencode($page)
+ . ($url_after_login ? '&url_after_login=' . rawurlenc...
+ . ($page_after_login ? '&page_after_login=' . rawurle...
+ ob_start();
+?>
+<style>
+ .registrationformcontainer {
+ text-align: center;
+ }
+ .registrationform table {
+ margin-top: 1em;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ .registrationform tbody td {
+ padding: .5em;
+ }
+ .registrationform .label {
+ text-align: right;
+ }
+ .registrationform .registration-button-container {
+ text-align: right;
+ }
+ .registrationform .registrationbutton {
+ margin-top: 1em;
+ }
+ .registrationform .errormessage {
+ color: red;
+ }
+</style>
+<div class="registrationformcontainer">
+<form name="loginform" class="registrationform" action=...
+<div>
+<table style="border:0">
+ <tbody>
+ <tr>
+ <td class="label"><label for="_plugin_registrationf...
+ <td><input type="text" name="username" value="<?php...
+ </tr>
+ <tr>
+ <td class="label"><label for="_plugin_registrationfor...
+ <td><input type="password" name="password" id="_plugi...
+ </tr>
+ <tr>
+ <td class="label"><label for="_plugin_registrationfor...
+ <td><input type="password" name="password_confirm" id...
+ </tr>
+<?php if (!$usable_username): ?>
+ <tr>
+ <td></td>
+ <td class="errormessage"><?php echo $_loginform_mes...
+ </tr>
+<?php endif ?>
+<?php if (!$match_password): ?>
+ <tr>
+ <td></td>
+ <td class="errormessage"><?php echo $_loginform_mes...
+ </tr>
+<?php endif ?>
+ <tr>
+ <td></td>
+ <td class="registration-button-container"><input ty...
+ </tr>
+ </tbody>
+</table>
+</div>
+<div>
+</div>
+</form>
+</div>
+<script><!--
+window.addEventListener && window.addEventListener("DOM...
+ var f = window.document.forms.loginform;
+ if (f && f.username && f.password) {
+ if (f.username.value) {
+ f.password.focus && f.password.focus();
+ } else {
+ f.username.focus && f.username.focus();
+ }
+ }
+});
+//-->
+</script>
+<?php
+ $body = ob_get_contents();
+ ob_end_clean();
+ return array(
+ 'msg' => $_loginform_messages['register'],
+ 'body' => $body,
+ );
+
} else {
// login
+ $action_url = get_base_uri() . '?plugin=loginform'
+ . '&page=' . rawurlencode($page)
+ . ($url_after_login ? '&url_after_login=' . rawurlenc...
+ . ($page_after_login ? '&page_after_login=' . rawurle...
ob_start();
?>
<style>
.loginformcontainer {
text-align: center;
}
:pukiwiki.ini.php|
私はUser definitionの近くに埋め込んでみました。
/////////////////////////////////////////////////
// User registration (0:Disable, 1:Enable)
$user_registration = 1;
:.htaccess|
# Prohibit direct access
-<FilesMatch "\.(ini\.php|lng\.php|txt|gz|tgz|zip)$">
+<FilesMatch "\.(ini\.php|lng\.php|txt|gz|tgz|zip|dat)$">
Require all denied
</FilesMatch>
ユーザー登録とはまた別だと思いますが、ユーザーのみ編集で...
:ja.lng.php|
Page titlesの箇所へ追加
$_title_cannotedit_not_login = 'ログインしていないため $...
Skinの箇所へ追加
$_LANG['skin']['registration'] = 'ユーザー登録';
差分
///////////////////////////////////////
// loginform.inc.php
$_loginform_messages = array(
'username' => 'ユーザー名:',
'password' => 'パスワード:',
+ 'password_confirm' => 'パスワード (確認):',
'login' => 'ログイン',
+ 'register' => 'ユーザー登録',
- 'invalid_username_or_password' => 'ユーザー名またはパ...
+ 'invalid_username_or_password' => 'ユーザー名またはパ...
+ 'unavailable_username' => '既にそのユーザー名は使われ...
+ 'not_match_password' => 'パスワードが確認と一致しません'
);
:skin/pukiwiki.skin.php|
<?php if ($enable_login) { ?>
[
- <?php _navigator('login') ?>
+ <?php _navigator('login') ?> |
+ <?php _navigator('registration') ?>
]
<?php } ?>
:lib/html.php|
$_LINK['upload'] = "$script?plugin=attach&pcmd=up...
+ $_LINK['registration'] = "$script?cmd=loginform&...
$_LINK['canonical_url'] = $canonical_url;
:en.lng.php|
Page titlesの箇所へ追加
$_title_cannotedit_not_login = '$1 is not editable becau...
Skinの箇所へ追加
$_LANG['skin']['registration'] = 'User registration';
差分
///////////////////////////////////////
// loginform.inc.php
$_loginform_messages = array(
'username' => 'Username',
'password' => 'Password',
+ 'password_confirm' => 'Password (Confirm):',
'login' => 'Log in',
+ 'register' => 'User registration',
- 'invalid_username_or_password' => 'The username or pas...
+ 'invalid_username_or_password' => 'The username or pas...
+ 'unavailable_username' => 'The username is already in ...
+ 'not_match_password' => 'Password and confirmed passwo...
);
:plugin/edit.inc.php|
定数定義
// ユーザーだけがページを編集できるようにする
define('PLUGIN_EDIT_WRITE_USER_ONLY', FALSE);
plugin_edit_action関数
function plugin_edit_action()
{
- global $vars, $_title_edit;
+ global $vars, $_title_edit, $auth_user, $_title_cannot...
if (PKWK_READONLY) die_message('PKWK_READONLY prohibits...
// Create initial pages
plugin_edit_setup_initial_pages();
$page = isset($vars['page']) ? $vars['page'] : '';
check_editable($page, true, true);
check_readable($page, true, true);
+ if (PLUGIN_EDIT_WRITE_USER_ONLY && !$auth_user) {
+ $body = $title = str_replace('$1',
+ htmlsc(strip_bracket($page)), $_title_cannotedit_not...
+ $page = str_replace('$1', make_search($page), $_title...
+ catbody($title, $page, $body);
+ exit;
+ }
''userlist.dat''に登録されたユーザーのデータが保存されま...
** 関連 [#fcca9a74]
- [[BugTrack/776]]
--------
- ユーザー管理をPukiWiki上で行うについては昔からいくつか...
- 「利用者ページ」や「下書き」はユーザー管理とはまた別の...
-- 「[[BugTrack/2554]] 利用者ページと下書き機能」として分...
- 「ユーザー登録システムの実装案 (はいふん)」はいふんさん...
-- 本命の対応は [[official:PukiWiki/Authentication]] にあ...
-- userlist.dat の内容と拡張子を pukiwiki.ini.php のよう...
-- いずれにしても、ユーザー管理をPukiWiki本体とは別建てに...
-- お二人ともご意見ありがとうございます。本体に組み込むの...
-- 「もしデータベースでユーザー管理を実装した場合では問題...
-- 「userlist.dat の内容と拡張子を pukiwiki.ini.php のよ...
-- 参考までに、外部認証を使ってTwitterアカウントでログイ...
#comment
ページ名: