Subversion Repositories oidplus

Compare Revisions

No changes between revisions

Regard whitespace Rev 354 → Rev 355

/trunk/TODO
10,6 → 10,14
- Does the admin feature "600_log" also show all log events from all Objects and all RAs?
- at a lot of forms, if you press "enter", the "form" will not be submitted (e.g. "create ra" plugin), cannot reproduce?
- Test every function of OIDplus to ensure everything works after the recent changes in OOP
- When you try to create an OID and have not entered an asn1 id, there should be a warning
- Multilang
* !! Translate all PHP and JS files (make a tool that searches all "_L" functions and updates the message.xml files)
* !! Find a solution how to translate resources, HTML templates, etc.
* Make it compatible with search engines: Instead of JavaScript/Cookie language selection, make an argument "?lang=" ???
- WebWHOIS: Open in new Window? Show URL without opening the page?
- Create a possibility to invoke cronjobs (VTS registration / automatic publishing) via crontab?
- Make a plugin that shows warning from plugins (via "feature-interface"), e.g. the registration plugin could warn that CURL is not working correctly etc.
 
NEW FUNCTIONALITIES
- Admin plugin "Attachments" with following functionalities:
95,7 → 103,6
- SQLite3: Implement Natural OID sorting (natSort)
 
FUTURE
- multilang
- make use of Composer. Problems:
* What if composer installs a version of a component, which is incompatible?
* We need a new publishing script, because simply checking out SVN is not enough anymore. The user needs to execute composer. But what is if the user don't have composer (or dont have shell access at all?)
/trunk/ajax.php
100,6 → 100,16
// Outputs: JSON
if (!isset($_REQUEST['id'])) throw new OIDplusException("Invalid args");
$json_out = OIDplus::menuUtils()->json_tree($_REQUEST['id'], isset($_REQUEST['goto']) ? $_REQUEST['goto'] : '');
} else if (isset($_REQUEST['action']) && ($_REQUEST['action'] == 'set_language')) {
// Action: set_language
// Method: GET / POST
// Parameters: language
// Outputs: JSON
if (!isset($_REQUEST['language'])) throw new OIDplusException("Invalid args");
$cookie_path = OIDplus::getSystemUrl(true);
if (empty($cookie_path)) $cookie_path = '/';
setcookie('LANGUAGE', $_POST['language'], 0, $cookie_path, '', false, false/*HttpOnly off, because JavaScript also needs translation*/);
$json_out['status'] = 0;
} else {
throw new OIDplusException('Invalid action ID');
}
/trunk/doc/developer_notes/class_diagram.drawio
1,0 → 0,0
<mxfile host="app.diagrams.net" modified="2020-05-18T18:01:35.837Z" agent="5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Safari/605.1.15" etag="lJkyqylMPBuqBZV26ODb" version="13.1.2" type="device"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">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</diagram></mxfile>
<mxfile host="app.diagrams.net" modified="2020-08-10T12:26:35.422Z" agent="5.0 (Windows)" etag="H36YEA37N4JvvKWIpkvJ" version="13.6.2" type="device"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">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</diagram></mxfile>
/trunk/doc/developer_notes/class_diagram.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/includes/classes/OIDplus.class.php
26,9 → 26,12
private static /*string[]*/ $disabledObjectTypes = array();
private static /*OIDplusDatabasePlugin[]*/ $dbPlugins = array();
private static /*OIDplusSqlSlangPlugin[]*/ $sqlSlangPlugins = array();
private static /*OIDplusLanguagePlugin[]*/ $languagePlugins = array();
 
protected static $html = true;
 
/*public*/ const DEFAULT_LANGUAGE = 'enus';
 
private function __construct() {
}
 
324,6 → 327,17
return self::$authPlugins;
}
 
# --- Language plugin
 
private static function registerLanguagePlugin(OIDplusLanguagePlugin $plugin) {
self::$languagePlugins[] = $plugin;
return true;
}
 
public static function getLanguagePlugins() {
return self::$languagePlugins;
}
 
# --- Logger plugin
 
private static function registerLoggerPlugin(OIDplusLoggerPlugin $plugin) {
452,6 → 466,7
$res = array_merge($res, self::$objectTypePlugins);
$res = array_merge($res, self::$dbPlugins);
$res = array_merge($res, self::$sqlSlangPlugins);
$res = array_merge($res, self::$languagePlugins);
return $res;
}
 
576,6 → 591,7
self::$disabledObjectTypes = array();
self::$dbPlugins = array();
self::$sqlSlangPlugins = array();
self::$languagePlugins = array();
self::$system_id_cache = null;
self::$sslAvailableCache = null;
 
618,6 → 634,7
self::registerAllPlugins('auth', 'OIDplusAuthPlugin', array('OIDplus','registerAuthPlugin'));
self::registerAllPlugins('logger', 'OIDplusLoggerPlugin', array('OIDplus','registerLoggerPlugin'));
self::registerAllPlugins('objectTypes', 'OIDplusObjectTypePlugin', array('OIDplus','registerObjectTypePlugin'));
self::registerAllPlugins('language', 'OIDplusLanguagePlugin', array('OIDplus','registerLanguagePlugin'));
 
// Initialize non-DB plugins
 
633,7 → 650,10
foreach (OIDplus::getObjectTypePlugins() as $plugin) {
$plugin->init($html);
}
foreach (OIDplus::getLanguagePlugins() as $plugin) {
$plugin->init($html);
}
}
 
# --- System URL, System ID, PKI, and other functions
 
914,4 → 934,34
}
return $target;
}
 
public static function getCurrentLang() {
$lang = isset($_COOKIE['LANGUAGE']) ? $_COOKIE['LANGUAGE'] : self::DEFAULT_LANGUAGE;
$lang = preg_replace('@[^a-z]@ismU', '', $lang); // sanitize
return $lang;
}
 
// Note: Please use the alias _L() instead. It has also an builtin sprintf() to make code easier.
public static function getText($str) {
$lang = self::getCurrentLang();
 
static $translation_array = array();
static $translation_loaded = null;
if ($lang != $translation_loaded) {
if (strpos($lang,'/') !== false) return $str; // prevent attack (but actually, the sanitization above should work)
if (strpos($lang,'\\') !== false) return $str; // prevent attack (but actually, the sanitization above should work)
if (strpos($lang,'..') !== false) return $str; // prevent attack (but actually, the sanitization above should work)
$translation_file = __DIR__.'/../../plugins/language/'.$lang.'/messages.xml';
if (!file_exists($translation_file)) return $str;
$xml = simplexml_load_string(file_get_contents($translation_file));
foreach ($xml->message as $msg) {
$src = $msg->source->__toString();
$dst = $msg->target->__toString();
$translation_array[$src] = $dst;
}
$translation_loaded = $lang;
}
 
return isset($translation_array[$str]) ? $translation_array[$str] : $str;
}
}
/trunk/includes/classes/OIDplusLanguagePlugin.class.php
0,0 → 1,22
<?php
 
/*
* OIDplus 2.0
* Copyright 2019 Daniel Marschall, ViaThinkSoft
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
 
abstract class OIDplusLanguagePlugin extends OIDplusPlugin {
 
}
/trunk/includes/classes/OIDplusPluginManifest.class.php
29,6 → 29,7
private $phpMainClass = '';
private $cssFiles = array();
private $jsFiles = array();
private $rawXML = null;
 
public function getTypeClass(): string {
return $this->type;
66,6 → 67,10
return $this->jsFiles;
}
 
public function getRawXml(): object {
return $this->rawXML;
}
 
public function loadManifest($filename) {
if (!file_exists($filename)) return false;
$xmldata = @simplexml_load_file($filename);
92,6 → 97,8
$this->jsFiles[] = $file;
}
 
$this->rawXML = $xmldata;
 
return true;
}
 
/trunk/includes/functions.inc.php
125,3 → 125,7
return implode($break, $lines);
}
}
 
function _L($str, ...$sprintfArgs) {
return sprintf(OIDplus::getText($str), $sprintfArgs);
}
/trunk/index.php
150,6 → 150,24
</div>
</div>
 
<div id="languageBox">
<?php
 
foreach (OIDplus::getAllPluginManifests('language') as $pluginManifest) {
$xmldata = $pluginManifest->getRawXml();
$flag = $xmldata->language->flag->__toString();
$code = $xmldata->language->code->__toString();
if ($code == OIDplus::getCurrentLang()) {
$class = 'lng_flag';
} else {
$class = 'lng_flag picture_grayout';
}
echo '<img src="plugins/language/'.$code.'/'.$flag.'" alt="'.$pluginManifest->getName().'" title="'.$pluginManifest->getName().'" class="'.$class.'" id="lng_flag_'.$code.'" height="20" onclick="setLanguage(\''.$code.'\')"> ';
}
 
?>
</div>
 
<div id="gotobox">
<input type="text" name="goto" id="gotoedit" value="<?php echo htmlentities($static_node_id); ?>">
<input type="button" value="Go" onclick="gotoButtonClicked()" id="gotobutton">
/trunk/oidplus.min.js.php
47,6 → 47,24
}
}
 
foreach (OIDplus::getAllPluginManifests('language') as $pluginManifest) {
$xmldata = $pluginManifest->getRawXml();
$lang = $xmldata->language->code->__toString();
if (strpos($lang,'/') !== false) return $str; // prevent attack (but actually, the sanitization above should work)
if (strpos($lang,'\\') !== false) return $str; // prevent attack (but actually, the sanitization above should work)
if (strpos($lang,'..') !== false) return $str; // prevent attack (but actually, the sanitization above should work)
$translation_file = __DIR__.'/plugins/language/'.$lang.'/messages.xml';
if (!file_exists($translation_file)) continue;
$xml = simplexml_load_string(file_get_contents($translation_file));
foreach ($xml->message as $msg) {
$src = $msg->source->__toString();
$dst = $msg->target->__toString();
$translation_array[$lang][$src] = $dst;
}
 
$files[]= 'var language_messages = '.json_encode($translation_array).';';
}
 
# ---
 
$minifier = null;
/trunk/oidplus_base.css
388,6 → 388,35
filter: alpha(opacity=20) !important;
}
 
/* Language box */
 
@media only screen and (min-width: 801px) {
/* Desktop */
 
#languageBox {
position:absolute;
right:420px;
top:15px;
}
 
}
 
#languageBox {
display: none; /* will be set to 'block' by JavaScript */
}
 
.lng_flag {
cursor: pointer;
}
 
.picture_grayout {
webkit-filter: grayscale(100%);
-moz-filter: grayscale(100%);
-o-filter: grayscale(100%);
-ms-filter: grayscale(100%);
filter: grayscale(100%);
}
 
/* Goto box */
 
@media only screen and (max-width: 800px) {
/trunk/oidplus_base.js
Cannot display: file marked as a binary type.
svn:mime-type = application/javascript
/trunk/plugins/adminPages/800_plugins/OIDplusPageAdminPlugins.class.php
69,6 → 69,7
$show_obj_inactive = false;
$show_auth = false;
$show_logger = false;
$show_language = false;
 
if ($parts[1] == '') {
$out['title'] = "Installed plugins";
84,6 → 85,7
$show_obj_inactive = true;
$show_auth = true;
$show_logger = true;
$show_language = true;
} else if ($parts[1] == 'pages') {
$out['title'] = "Page plugins";
$out['icon'] = file_exists(__DIR__.'/icon_big.png') ? OIDplus::webpath(__DIR__).'icon_big.png' : '';
149,6 → 151,10
$out['title'] = "Logger";
$out['icon'] = file_exists(__DIR__.'/icon_big.png') ? OIDplus::webpath(__DIR__).'icon_big.png' : '';
$show_logger = true;
} else if ($parts[1] == 'language') {
$out['title'] = "Languages";
$out['icon'] = file_exists(__DIR__.'/icon_big.png') ? OIDplus::webpath(__DIR__).'icon_big.png' : '';
$show_language = true;
} else {
$out['icon'] = 'img/error_big.png';
$out['text'] = '<p>Invalid arguments.</p>';
399,8 → 405,33
$out['text'] .= '</div></div>';
}
}
 
if ($show_language) {
if (count($plugins = OIDplus::getLanguagePlugins()) > 0) {
$out['text'] .= '<h2>Languages</h2>';
$out['text'] .= '<div class="container box"><div id="suboid_table" class="table-responsive">';
$out['text'] .= '<table class="table table-bordered table-striped">';
$out['text'] .= ' <tr>';
$out['text'] .= ' <th width="25%">Class name</th>';
$out['text'] .= ' <th width="25%">Plugin name</th>';
$out['text'] .= ' <th width="25%">Plugin version</th>';
$out['text'] .= ' <th width="25%">Plugin author</th>';
$out['text'] .= ' </tr>';
foreach ($plugins as $plugin) {
$out['text'] .= ' <tr>';
$pluginManifest = OIDplus::getPluginManifest($plugin);
$out['text'] .= '<td><a '.OIDplus::gui()->link('oidplus:system_plugins$'.get_class($plugin)).'>'.htmlentities(get_class($plugin)).'</a></td>';
$out['text'] .= '<td>' . htmlentities(empty($pluginManifest->getName()) ? 'n/a' : $pluginManifest->getName()) . '</td>';
$out['text'] .= '<td>' . htmlentities(empty($pluginManifest->getVersion()) ? 'n/a' : $pluginManifest->getVersion()) . '</td>';
$out['text'] .= '<td>' . htmlentities(empty($pluginManifest->getAuthor()) ? 'n/a' : $pluginManifest->getAuthor()) . '</td>';
$out['text'] .= ' </tr>';
}
$out['text'] .= '</table>';
$out['text'] .= '</div></div>';
}
}
}
}
 
public function tree(&$json, $ra_email=null, $nonjs=false, $req_goto='') {
if (!OIDplus::authUtils()::isAdminLoggedIn()) return false;
423,6 → 454,7
$tree_icon_obj_inactive = $tree_icon; // TODO
$tree_icon_auth = $tree_icon; // TODO
$tree_icon_logger = $tree_icon; // TODO
$tree_icon_language = $tree_icon; // TODO
 
$pp_public = array();
$pp_ra = array();
557,6 → 589,17
'text' => $txt,
);
}
$language_plugins = array();
foreach (OIDplus::getLanguagePlugins() as $plugin) {
$pluginManifest = OIDplus::getPluginManifest($plugin);
$txt = (empty($pluginManifest->getName())) ? get_class($plugin) : $pluginManifest->getName();
 
$language_plugins[] = array(
'id' => 'oidplus:system_plugins$'.get_class($plugin),
'icon' => $tree_icon_language,
'text' => $txt,
);
}
$json[] = array(
'id' => 'oidplus:system_plugins',
'icon' => $tree_icon,
616,6 → 659,12
'icon' => $tree_icon,
'text' => 'Logger',
'children' => $logger_plugins
),
array(
'id' => 'oidplus:system_plugins.language',
'icon' => $tree_icon,
'text' => 'Languages',
'children' => $language_plugins
)
)
);
/trunk/plugins/language/dede/OIDplusLanguagePluginGerman.class.php
0,0 → 1,22
<?php
 
/*
* OIDplus 2.0
* Copyright 2019 Daniel Marschall, ViaThinkSoft
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
 
class OIDplusLanguagePluginGerman extends OIDplusLanguagePlugin {
 
}
/trunk/plugins/language/dede/flag.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/plugins/language/dede/manifest.xml
0,0 → 1,24
<?xml version="1.0"?>
<manifest>
 
<type>OIDplusLanguagePlugin</type>
 
<info>
<name>Deutsch</name>
<author>ViaThinkSoft</author>
<version />
<descriptionHTML />
<oid>1.3.6.1.4.1.37476.2.5.2.4.9.2</oid>
</info>
 
<php>
<mainclass>OIDplusLanguagePluginGerman</mainclass>
</php>
 
<language>
<code>dede</code>
<flag>flag.png</flag>
<messages>messages.xml</messages>
</language>
</manifest>
/trunk/plugins/language/dede/messages.xml
0,0 → 1,6
<translation>
<message>
<source>How to register?</source>
<target>Wie Sie sich registrieren</target>
</message>
</translation>
/trunk/plugins/language/enus/OIDplusLanguagePluginEnglishUSA.class.php
0,0 → 1,22
<?php
 
/*
* OIDplus 2.0
* Copyright 2019 Daniel Marschall, ViaThinkSoft
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
 
class OIDplusLanguagePluginEnglishUSA extends OIDplusLanguagePlugin {
 
}
/trunk/plugins/language/enus/flag.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/plugins/language/enus/manifest.xml
0,0 → 1,24
<?xml version="1.0"?>
<manifest>
 
<type>OIDplusLanguagePlugin</type>
 
<info>
<name>English (USA)</name>
<author>ViaThinkSoft</author>
<version />
<descriptionHTML />
<oid>1.3.6.1.4.1.37476.2.5.2.4.9.1</oid>
</info>
 
<php>
<mainclass>OIDplusLanguagePluginEnglishUSA</mainclass>
</php>
 
<language>
<code>enus</code>
<flag>flag.png</flag>
<messages>messages.xml</messages>
</language>
</manifest>
/trunk/plugins/language/enus/messages.xml
0,0 → 1,3
<translation>
<!-- Nothing in here, because English (USA) is the main language of OIDplus -->
</translation>
/trunk/plugins/publicPages/090_login/OIDplusPagePublicLogin.class.php
32,7 → 32,7
$verify=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secret}&response={$response}");
$captcha_success=json_decode($verify);
if ($captcha_success->success==false) {
throw new OIDplusException('Captcha wrong');
throw new OIDplusException(_L('Captcha wrong'));
}
}
 
51,7 → 51,7
OIDplus::logger()->log("[WARN]A!", "Failed login to RA account '$email' (RA not existing)");
}
}
throw new OIDplusException('Wrong password or user not registered');
throw new OIDplusException(_L('Wrong password or user not registered'));
}
 
} else if ($actionID == 'ra_logout') {
93,7 → 93,7
return array("status" => 0);
}
else {
throw new OIDplusException("Unknown action ID");
throw new OIDplusException(_L("Unknown action ID"));
}
}
 
117,7 → 117,7
$out['icon'] = OIDplus::webpath(__DIR__).'login_big.png';
 
$out['text'] .= '<noscript>';
$out['text'] .= '<p>You need to enable JavaScript to use the login area.</p>';
$out['text'] .= '<p>'._L('You need to enable JavaScript to use the login area.').'</p>';
$out['text'] .= '</noscript>';
 
$out['text'] .= '<div id="loginArea" style="visibility: hidden"><div id="loginTab" class="container" style="width:100%;">';
142,9 → 142,9
foreach ($login_list as $x) {
$out['text'] .= '<p>You are logged in as <b>'.$x->raEmail().'</b> (<a href="#" onclick="return raLogout('.js_escape($x->raEmail()).');">Logout</a>)</p>';
}
$out['text'] .= '<p>If you have more accounts, you can log in with a new account:</p>';
$out['text'] .= '<p>'._L('If you have more accounts, you can log in with a new account:').'</p>';
} else {
$out['text'] .= '<p>Enter your email address and your password to log in as Registration Authority.</p>';
$out['text'] .= '<p>'._L('Enter your email address and your password to log in as Registration Authority.').'</p>';
}
$out['text'] .= '<form onsubmit="return raLoginOnSubmit(this);">';
$out['text'] .= '<div><label class="padding_label">E-Mail:</label><input type="text" name="email" value="" id="raLoginEMail"></div>';
154,9 → 154,9
$out['text'] .= '<p><a '.OIDplus::gui()->link('oidplus:forgot_password').'>Forgot password?</a><br>';
 
if (class_exists('OIDplusPageRaInvite') && OIDplus::config()->getValue('ra_invitation_enabled')) {
$out['text'] .= '<abbr title="To receive login data, the superior RA needs to send you an invitation. After creating or updating your OID, the system will ask them if they want to send you an invitation. If they accept, you will receive an email with an activation link. Alternatively, the system admin can create your account manually in the administrator control panel.">How to register?</abbr></p>';
$out['text'] .= '<abbr title="'._L('To receive login data, the superior RA needs to send you an invitation. After creating or updating your OID, the system will ask them if they want to send you an invitation. If they accept, you will receive an email with an activation link. Alternatively, the system admin can create your account manually in the administrator control panel.').'">'._L('How to register?').'</abbr></p>';
} else {
$out['text'] .= '<abbr title="Since invitations are disabled at this OIDplus installation, the system administrator needs to create your account manually in the administrator control panel.">How to register?</abbr></p>';
$out['text'] .= '<abbr title="'._L('Since invitations are disabled at this OIDplus installation, the system administrator needs to create your account manually in the administrator control panel.').'">'._L('How to register?').'</abbr></p>';
}
 
$out['text'] .= ' </div>';
178,9 → 178,9
$out['text'] .= ' </div>';
$out['text'] .= ' </div>';
$out['text'] .= ' </div><br>';
$out['text'] .= '<p><font size="-1"><i>Privacy information</i>: By using the login functionality, you are accepting that a "session cookie" is temporarily stored in your browser. '.
$out['text'] .= '<p><font size="-1">'._L('<i>Privacy information</i>: By using the login functionality, you are accepting that a "session cookie" is temporarily stored in your browser. '.
'The session cookie is a small text file that is sent to this website every time you visit it, to identify you as an already logged in user. '.
'It does not track any of your online activities outside OIDplus. The cookie will be destroyed when you log out or after an inactivity of '.ceil(OIDplus::baseConfig()->getValue('SESSION_LIFETIME', 30*60)/60).' minutes.';
'It does not track any of your online activities outside OIDplus. The cookie will be destroyed when you log out or after an inactivity of %d minutes.', ceil(OIDplus::baseConfig()->getValue('SESSION_LIFETIME', 30*60)/60));
$privacy_document_file = 'OIDplus/privacy_documentation.html';
if (class_exists('OIDplusPagePublicResources') && file_exists(OIDplus::basePath().'/res/'.$privacy_document_file)) {
$out['text'] .= ' <a '.OIDplus::gui()->link('oidplus:resources$'.$privacy_document_file.'$'.OIDplus::authUtils()::makeAuthKey("resources;".$privacy_document_file).'#cookies').'>More information about the cookies used</a>';
211,11 → 211,11
'id' => 'oidplus:logout$admin',
'icon' => OIDplus::webpath(__DIR__).'treeicon_logout.png',
'conditionalselect' => 'adminLogout()', // defined in oidplus_base.js
'text' => 'Log out'
'text' => _L('Log out')
);
$loginChildren[] = array(
'id' => 'oidplus:dummy$'.md5(rand()),
'text' => "Logged in as admin",
'text' => _L("Logged in as admin"),
'icon' => OIDplus::webpath(__DIR__).'treeicon_admin.png',
'conditionalselect' => 'false', // dummy node that can't be selected
'state' => array("opened" => true),
237,7 → 237,7
'id' => 'oidplus:logout$'.$ra_email,
'conditionalselect' => 'raLogout('.js_escape($ra_email).')', // defined in oidplus_base.js
'icon' => OIDplus::webpath(__DIR__).'treeicon_logout.png',
'text' => 'Log out'
'text' => _L('Log out')
);
foreach (OIDplusObject::getRaRoots($ra_email) as $loc_root) {
$ico = $loc_root->getIcon();
263,7 → 263,7
$json[] = array(
'id' => 'oidplus:login',
'icon' => OIDplus::webpath(__DIR__).'treeicon_login.png',
'text' => 'Login',
'text' => _L('Login'),
'state' => array("opened" => count($loginChildren)>0),
'children' => $loginChildren
);
/trunk/res/OIDplus/privacy_documentation.html
16,7 → 16,7
}
</style>
<h1>Procedural documentation related to privacy</h1>
<p><em>Revision: 28 July 2020</em></p>
<p><em>Revision: 10 August 2020</em></p>
<p><strong><em>Important</em></strong><em>: This document is written by ViaThinkSoft (the developer of the software &ldquo;OIDplus&rdquo;) and gives general information on how OIDplus works regarding privacy-related topics. Since OIDplus is a web-software that can be downloaded, installed, and operated by anyone on their server systems, this document DOES NOT describe how the owners/administrators of this particular installation of OIDplus are handling your data. Therefore, the owner of this system should provide an additional/individual privacy statement.</em></p>
<a name="terminology"></a><h2><strong><u>Parties / Terminology</u></strong></h2>
<p><strong>ViaThinkSoft</strong> is the developer of the software solution &ldquo;OIDplus&rdquo;.</p>
494,6 → 494,23
<p>When the browser session is closed.</p>
</td>
</tr>
<tr>
<td width="122">
<p>Language Cookie</p>
</td>
<td width="114">
<p>Essential</p>
</td>
<td width="139">
<p>The language cookie contains the desired language.</p>
</td>
<td width="118">
<p>As soon as a flag is clicked</p>
</td>
<td width="126">
<p>When the browser session is closed.</p>
</td>
</tr>
</tbody>
</table>
<a name="external_javascripts"></a><h2><strong><u>External JavaScripts</u></strong></h2>