diff --git a/Rocksolid_Light/rocksolid/newsportal.php b/Rocksolid_Light/rocksolid/newsportal.php index 1c987db..e0b6e3e 100644 --- a/Rocksolid_Light/rocksolid/newsportal.php +++ b/Rocksolid_Light/rocksolid/newsportal.php @@ -1768,18 +1768,47 @@ function get_poster_name($name) return ($thisposter); } -function save_config_value($configfile, $name, $value) +/* + * This function returns false on success + * or return value contains error info + * 'added' etc. + */ +function save_config_value($configfile, $name, $value, $value_unique = false) { - $list = file($configfile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); - $saveconfig = fopen($configfile, 'w+'); - foreach ($list as $save) { - $name = explode(':', $save); - if (strcmp($name[0], $group) == 0) { - fputs($saveconfig, $group . ":" . $article . "\n"); + global $spooldir; + $return_val = false; + $tempfile = tempnam($spooldir, 'rslight-'); + if(file_exists($tempfile)) { + unlink($tempfile); + } + $lines = file($configfile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + $found = false; + foreach ($lines as $line) { + $current = explode(':', $line); + if ($value_unique && (strcmp($current[1], $value) == 0)) { + // Found value. Write once + if(!$found) { + file_put_contents($tempfile, $name . ":" . $value . "\n", FILE_APPEND); + } + $found = true; + continue; + } + if (strcmp($current[0], $name) == 0) { + // $name matches option. Overwrite + file_put_contents($tempfile, $name . ":" . $value . "\n", FILE_APPEND); + $found = true; } else { - fputs($saveconfig, $save . "\n"); + // $name does not match option. Keep current line + file_put_contents($tempfile, $line . "\n", FILE_APPEND); } } + if(!$found) { + // $name not found in options. Add to file. + file_put_contents($tempfile, $name . ":" . $value . "\n", FILE_APPEND); + } + copy($tempfile, $configfile); + unlink($tempfile); + return $return_val; } function get_config_file_value($configfile, $request) diff --git a/Rocksolid_Light/rslight/overrides.inc.php.dist b/Rocksolid_Light/rslight/overrides.inc.php.dist index a23bf12..6844fd6 100644 --- a/Rocksolid_Light/rslight/overrides.inc.php.dist +++ b/Rocksolid_Light/rslight/overrides.inc.php.dist @@ -25,6 +25,12 @@ return [ // Disable Message-ID search in header 'disable_msgid_search' => false, + // Reserved aliases + 'reserved_names' => array("admin", "sysop", "rslight"), + + // Users who may have duplicate aliases in aliases.conf + 'duplicate_aliases' => array("admins user name here"), + // Just leave this here to avoid comma errors 'comma' => true ]; diff --git a/Rocksolid_Light/spoolnews/user.php b/Rocksolid_Light/spoolnews/user.php index cf952ff..e9d22c7 100644 --- a/Rocksolid_Light/spoolnews/user.php +++ b/Rocksolid_Light/spoolnews/user.php @@ -221,6 +221,27 @@ if (isset($_POST['command']) && $_POST['command'] == 'SaveConfig') { $value = false; } } + if(isset($OVERRIDES['reserved_names'])) { + $reserved_names = $OVERRIDES['reserved_names']; + } else { + $reserved_names = array("admin", "sysop"); + } + if(isset($OVERRIDES['duplicate_aliases'])) { + $dupe_ok = $OVERRIDES['duplicate_aliases']; + } else { + $dupe_ok = false; + } + foreach($reserved_names as $name) { + if(strtolower($_POST['display_name']) == strtolower($name)) { + // It's a reserved alias + echo '' . $_POST['display_name'] . " is unavailable.
Please try again"; + echo '
'; + echo ''; + echo ""; + echo ''; + exit(); + } + } if ($value && (strtolower($_POST['display_name']) != $user)) { // It's someone else's username or alias echo '' . $_POST['display_name'] . " is unavailable.
Please try again"; @@ -253,8 +274,21 @@ if (isset($_POST['command']) && $_POST['command'] == 'SaveConfig') { exit(); } } - $user_config['display_name'] = $_POST['display_name']; - $user_config['display_email'] = $_POST['display_email']; + $user_config['display_name'] = trim($_POST['display_name']); + $user_config['display_email'] = trim($_POST['display_email']); + // Apply alias into $config_dir/aliases_conf + if(strtolower($user_config['display_name'] != strtolower($_POST['username']))) { + $value_unique = true; + if($dupe_ok) { + foreach($dupe_ok as $dupe) { + if($dupe == strtolower($_POST['username'])) { + $value_unique = false; + break; + } + } + } + save_config_value($config_dir . '/aliases.conf', strtolower($user_config['display_name']), strtolower($_POST['username']), $value_unique); + } } $user_config['signature'] = $_POST['signature']; $user_config['xface'] = $_POST['xface'];