Subversion Repositories oidplus

Compare Revisions

No changes between revisions

Regard whitespace Rev 429 → Rev 430

/trunk/doc/config_values.txt
227,3 → 227,15
and possibly other modules. It has no effect on relative URLs.
If this setting is not set, the last known absolute URL
will be remembered and used when a CLI call is made.
 
 
----------------------------------------------------
(4) LDAP FIELDS (see document ldap_installation.txt)
----------------------------------------------------
 
OIDplus::baseConfig()->setValue('LDAP_ENABLED', true);
OIDplus::baseConfig()->setValue('LDAP_SERVER', 'ldap://shs.company.local');
OIDplus::baseConfig()->setValue('LDAP_PORT', 389);
OIDplus::baseConfig()->setValue('LDAP_BASE_DN', 'DC=COMPANY,DC=local');
OIDplus::baseConfig()->setValue('LDAP_CONTROLUSER_RDN', 'test@company.local'); // Can be any user that is able to search for users (in order to find who is owning an email address)
OIDplus::baseConfig()->setValue('LDAP_CONTROLUSER_PASSWORD', 'foobar');
/trunk/doc/developer_notes/feature_oids.txt
49,7 → 49,12
public function whoisRaAttributes($email, &$out);
}
 
Interface <1.3.6.1.4.1.37476.2.5.2.3.5> {
// called by plugin publicPages/090_login
public function alternativeLoginMethods();
}
 
 
TL;DR:
Plugins communicate with other plugins using the OIDplusPlugin::implementsFeature()
function, which provide a way of "optional" interfaces.
/trunk/doc/ldap_installation.txt
0,0 → 1,20
 
How to use LDAP / ActiveDirectory login
=======================================
 
(1) In your PHP.ini, make sure that the "LDAP" extension is activated, e.g.:
 
extension=php_ldap.dll
 
(2) On your ActiveDirectory server, please make sure that the "mail" attribute
is set for all users that should be able to log into OIDplus.
 
(3) In userdata/baseconfig/config.inc.php, please add following lines,
and adjust them to your configuration:
 
OIDplus::baseConfig()->setValue('LDAP_ENABLED', true);
OIDplus::baseConfig()->setValue('LDAP_SERVER', 'ldap://shs.company.local');
OIDplus::baseConfig()->setValue('LDAP_PORT', 389);
OIDplus::baseConfig()->setValue('LDAP_BASE_DN', 'DC=COMPANY,DC=local');
OIDplus::baseConfig()->setValue('LDAP_CONTROLUSER_RDN', 'test@company.local'); // Can be any user that is able to search for users (in order to find who is owning an email address)
OIDplus::baseConfig()->setValue('LDAP_CONTROLUSER_PASSWORD', 'foobar');
/trunk/includes/classes/OIDplusRA.class.php
59,7 → 59,14
}
 
public function register_ra($new_password) {
if (is_null($new_password)) {
// Invalid password (used for LDAP/OAuth)
$s_salt = '';
$calc_authkey = '';
} else {
list($s_salt, $calc_authkey) = OIDplus::authUtils()->raGeneratePassword($new_password);
}
 
OIDplus::db()->query("insert into ###ra (salt, authkey, email, registered, ra_name, personal_name, organization, office, street, zip_town, country, phone, mobile, fax) values (?, ?, ?, ".OIDplus::db()->sqlDate().", ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", array($s_salt, $calc_authkey, $this->email, "", "", "", "", "", "", "", "", "", ""));
}
 
/trunk/plugins/language/dede/messages.xml
462,6 → 462,14
</message>
<message>
<source><![CDATA[
Alternative login methods
]]></source>
<target><![CDATA[
Alternative Login-Methoden
]]></target>
</message>
<message>
<source><![CDATA[
Arc "%1" is too long and therefore cannot be appended to the OID "%2" (max allowed arc size is "%3")
]]></source>
<target><![CDATA[
774,6 → 782,14
</message>
<message>
<source><![CDATA[
Cannot connect to LDAP server
]]></source>
<target><![CDATA[
Konnte nicht zu LDAP-Server verbinden
]]></target>
</message>
<message>
<source><![CDATA[
Cannot create directory "%1" (problem with permissions?)
]]></source>
<target><![CDATA[
1534,6 → 1550,14
</message>
<message>
<source><![CDATA[
Error in search query: %1
]]></source>
<target><![CDATA[
Fehler in Such-Anfrage: %1
]]></target>
</message>
<message>
<source><![CDATA[
Error: %1
]]></source>
<target><![CDATA[
2558,6 → 2582,14
</message>
<message>
<source><![CDATA[
LDAP authentication is disabled on this system.
]]></source>
<target><![CDATA[
LDAP-Authentifizierung ist auf diesem System deaktiviert.
]]></target>
</message>
<message>
<source><![CDATA[
Languages
]]></source>
<target><![CDATA[
2710,6 → 2742,14
</message>
<message>
<source><![CDATA[
Login using LDAP / ActiveDirectory
]]></source>
<target><![CDATA[
Mittels LDAP / ActiveDirectory anmelden
]]></target>
</message>
<message>
<source><![CDATA[
Logout
]]></source>
<target><![CDATA[
3782,6 → 3822,14
</message>
<message>
<source><![CDATA[
Please enter a valid email address
]]></source>
<target><![CDATA[
Bitte geben Sie eine gültige E-Mail-Adresse ein
]]></target>
</message>
<message>
<source><![CDATA[
Please enter a valid password length.
]]></source>
<target><![CDATA[
5014,6 → 5062,14
</message>
<message>
<source><![CDATA[
System cannot login to LDAP in order to search the user
]]></source>
<target><![CDATA[
System kann nicht zum LDAP-Server verbinden, um den Benutzer zu suchen
]]></target>
</message>
<message>
<source><![CDATA[
System check
]]></source>
<target><![CDATA[
6062,6 → 6118,14
</message>
<message>
<source><![CDATA[
You don't need to register. Just enter your Windows/Company credentials.
]]></source>
<target><![CDATA[
Sie müssen sich nicht separat registrieren. Geben Sie zum Anmelden einfach Ihre Anmeldedaten des Firmen-Netzwerks ein.
]]></target>
</message>
<message>
<source><![CDATA[
You have chosen to invite %1 as a Registration Authority. If you click "Send", the following email will be sent to %2:
]]></source>
<target><![CDATA[
/trunk/plugins/publicPages/090_login/OIDplusPagePublicLogin.class.php
23,9 → 23,6
// === RA LOGIN/LOGOUT ===
 
if ($actionID == 'ra_login') {
$email = $params['email'];
$ra = new OIDplusRA($email);
 
if (OIDplus::baseConfig()->getValue('RECAPTCHA_ENABLED', false)) {
$secret=OIDplus::baseConfig()->getValue('RECAPTCHA_PRIVATE', '');
$response=$params["captcha"];
36,6 → 33,13
}
}
 
$email = $params['email'];
$ra = new OIDplusRA($email);
 
if (empty($email)) {
throw new OIDplusException(_L('Please enter a valid email address'));
}
 
if ($ra->checkPassword($params['password'])) {
OIDplus::logger()->log("[OK]RA($email)!", "RA '$email' logged in");
OIDplus::authUtils()::raLogin($email);
165,6 → 169,29
$tabcont .= '<abbr title="'._L('Since invitations are disabled at this OIDplus system, the system administrator needs to create your account manually in the administrator control panel.').'">'._L('How to register?').'</abbr></p>';
}
$out['text'] .= OIDplus::gui()->tabContentPage('ra', $tabcont, $tab === 'ra');
 
$alt_logins_html = array();
foreach (OIDplus::getPagePlugins() as $plugin) {
if ($plugin->implementsFeature('1.3.6.1.4.1.37476.2.5.2.3.5')) {
$logins = $plugin->alternativeLoginMethods();
foreach ($logins as $data) {
if (isset($data[2]) && !empty($data[2])) {
$img = '<img src="'.$data[2].'" alt="'.htmlentities($data[1]).'"> ';
} else {
$img = '';
}
$alt_logins_html[] = $img.'<a '.OIDplus::gui()->link($data[0]).'>'.htmlentities($data[1]).'</a>';
}
}
}
if (count($alt_logins_html) > 0) {
$out['text'] .= '<p>'._L('Alternative login methods').':<br>';
foreach ($alt_logins_html as $alt_login) {
$out['text'] .= $alt_login.'</br>';
}
$out['text'] .= '</p>';
}
 
// ---------------- "Administrator" tab
$tabcont = '<h2>'._L('Login as administrator').'</h2>';
if (OIDplus::authUtils()::isAdminLoggedIn()) {
/trunk/plugins/publicPages/800_login_ldap/OIDplusPagePublicLoginLDAP.class.php
0,0 → 1,277
<?php
 
/*
* OIDplus 2.0
* Copyright 2020 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 OIDplusPagePublicLoginLdap extends OIDplusPagePluginPublic {
 
protected function ldapAuthByEMail($email, $password) {
$cfg_ldap_server = OIDplus::baseConfig()->getValue('LDAP_SERVER');
$cfg_ldap_port = OIDplus::baseConfig()->getValue('LDAP_PORT', 389);
$cfg_ldap_base_dn = OIDplus::baseConfig()->getValue('LDAP_BASE_DN');
$cfg_ldap_rdn = OIDplus::baseConfig()->getValue('LDAP_CONTROLUSER_RDN');
$cfg_ldap_password = OIDplus::baseConfig()->getValue('LDAP_CONTROLUSER_PASSWORD');
 
// Connect to the server
if (!empty($cfg_ldap_port)) {
if (!($ldapconn = @ldap_connect($cfg_ldap_server, $cfg_ldap_port))) throw new OIDplusException(_L('Cannot connect to LDAP server'));
} else {
if (!($ldapconn = @ldap_connect($cfg_ldap_server))) throw new OIDplusException(_L('Cannot connect to LDAP server'));
}
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
 
// Login in order to search for the user
if (!empty($cfg_ldap_rdn)) {
if (!empty($cfg_ldap_password)) {
if (!($ldapbind = @ldap_bind($ldapconn, $cfg_ldap_rdn, $cfg_ldap_password))) throw new OIDplusException(_L('System cannot login to LDAP in order to search the user'));
} else {
if (!($ldapbind = @ldap_bind($ldapconn, $cfg_ldap_rdn))) throw new OIDplusException(_L('System cannot login to LDAP in order to search the user'));
}
} else {
if (!($ldapbind = @ldap_bind($ldapconn))) throw new OIDplusException(_L('System cannot login to LDAP in order to search the user'));
}
 
// Search the user using the email address
if (!($result = @ldap_search($ldapconn,$cfg_ldap_base_dn, '(&(objectClass=user)(cn=*))'))) throw new OIDplusException(_L('Error in search query: %1', ldap_error($ldapconn)));
$data = ldap_get_entries($ldapconn, $result);
$found_username = null;
for ($i=0; $i<$data['count']; $i++) {
if ((isset($data[$i]['mail'][0])) && ($data[$i]['mail'][0] == $email)) {
$found_username = $data[$i]['userprincipalname'][0];
$ldap_userinfo = array();
foreach ($data[$i] as $x => $y) {
if (is_int($x)) continue;
if (!is_array($y)) continue;
$ldap_userinfo[$x] = $y[0];
}
}
}
if (is_null($found_username)) return false;
 
// Login as the new user in order to check the credentials
//ldap_unbind($ldapconn); // commented out because ldap_unbind() kills the link descriptor
if ($ldapbind = @ldap_bind($ldapconn, $found_username, $password)) {
//ldap_unbind($ldapconn);
ldap_close($ldapconn);
return $ldap_userinfo;
} else {
return false;
}
}
 
private function registerRA($ra, $ldap_userinfo) {
$email = $ra->raEmail();
 
$ra->register_ra(null); // create a user account without password
 
/*
OID+ DB Field ActiveDirectory field
------------------------------------------------
ra_name cn
personal_name displayname (or: givenname + " " + sn)
organization company
office physicaldeliveryofficename or department
street streetaddress
zip_town postalcode + " " + l
country co (human-readable) or c (ISO country code)
phone telephonenumber or homephone
mobile mobile
fax facsimiletelephonenumber
(none) wwwhomepage
*/
 
if (!isset($ldap_userinfo['cn'])) $ldap_userinfo['cn'] = '';
if (!isset($ldap_userinfo['displayname'])) $ldap_userinfo['displayname'] = '';
if (!isset($ldap_userinfo['givenname'])) $ldap_userinfo['givenname'] = '';
if (!isset($ldap_userinfo['sn'])) $ldap_userinfo['sn'] = '';
if (!isset($ldap_userinfo['company'])) $ldap_userinfo['company'] = '';
if (!isset($ldap_userinfo['physicaldeliveryofficename'])) $ldap_userinfo['physicaldeliveryofficename'] = '';
if (!isset($ldap_userinfo['department'])) $ldap_userinfo['department'] = '';
if (!isset($ldap_userinfo['streetaddress'])) $ldap_userinfo['streetaddress'] = '';
if (!isset($ldap_userinfo['postalcode'])) $ldap_userinfo['postalcode'] = '';
if (!isset($ldap_userinfo['l'])) $ldap_userinfo['l'] = '';
if (!isset($ldap_userinfo['co'])) $ldap_userinfo['co'] = '';
if (!isset($ldap_userinfo['c'])) $ldap_userinfo['c'] = '';
if (!isset($ldap_userinfo['telephonenumber'])) $ldap_userinfo['telephonenumber'] = '';
if (!isset($ldap_userinfo['homephone'])) $ldap_userinfo['homephone'] = '';
if (!isset($ldap_userinfo['mobile'])) $ldap_userinfo['mobile'] = '';
if (!isset($ldap_userinfo['facsimiletelephonenumber'])) $ldap_userinfo['facsimiletelephonenumber'] = '';
if (!isset($ldap_userinfo['wwwhomepage'])) $ldap_userinfo['wwwhomepage'] = '';
 
$opuserdata = array();
$opuserdata['ra_name'] = $ldap_userinfo['cn'];
if (!empty($ldap_userinfo['displayname'])) {
$opuserdata['personal_name'] = $ldap_userinfo['displayname'];
} else {
$opuserdata['personal_name'] = trim($ldap_userinfo['givenname'].' '.$ldap_userinfo['sn']);
}
$opuserdata['organization'] = $ldap_userinfo['company'];
if (!empty($ldap_userinfo['physicaldeliveryofficename'])) {
$opuserdata['office'] = $ldap_userinfo['physicaldeliveryofficename'];
} else {
$opuserdata['office'] = $ldap_userinfo['department'];
}
$opuserdata['street'] = $ldap_userinfo['streetaddress'];
$opuserdata['zip_town'] = trim($ldap_userinfo['postalcode'].' '.$ldap_userinfo['l']);
$opuserdata['country'] = $ldap_userinfo['co']; // ISO country code: $ldap_userinfo['c']
$opuserdata['phone'] = $ldap_userinfo['telephonenumber']; // homephone for private phone number
$opuserdata['mobile'] = $ldap_userinfo['mobile'];
$opuserdata['fax'] = $ldap_userinfo['facsimiletelephonenumber'];
 
foreach ($opuserdata as $dbfield => $val) {
if (!empty($val)) {
OIDplus::db()->query("update ###ra set ".$dbfield." = ? where email = ?", array($val, $email));
}
}
}
 
public function action($actionID, $params) {
if ($actionID == 'ra_login_ldap') {
if (!OIDplus::baseConfig()->getValue('LDAP_ENABLED', false)) {
throw new OIDplusException(_L('LDAP authentication is disabled on this system.'));
}
 
if (OIDplus::baseConfig()->getValue('RECAPTCHA_ENABLED', false)) {
$secret=OIDplus::baseConfig()->getValue('RECAPTCHA_PRIVATE', '');
$response=$params["captcha"];
$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(_L('CAPTCHA not successfully verified'));
}
}
 
$email = $params['email'];
$password = $params['password'];
 
if (empty($email)) {
throw new OIDplusException(_L('Please enter a valid email address'));
}
 
if (!($ldap_userinfo = $this->ldapAuthByEMail($email, $password))) {
if (OIDplus::config()->getValue('log_failed_ra_logins', false)) {
OIDplus::logger()->log("[WARN]A!", "Failed login to RA account '$email' using LDAP");
}
throw new OIDplusException(_L('Wrong password or user not registered'));
}
 
$ra = new OIDplusRA($email);
if (!$ra->existing()) {
$this->registerRA($ra, $ldap_userinfo);
OIDplus::logger()->log("[INFO]RA($email)!", "RA '$email' was created because of successful LDAP login");
}
 
OIDplus::logger()->log("[OK]RA($email)!", "RA '$email' logged in via LDAP");
OIDplus::authUtils()::raLogin($email);
 
OIDplus::db()->query("UPDATE ###ra set last_login = ".OIDplus::db()->sqlDate()." where email = ?", array($email));
 
return array("status" => 0);
} else {
throw new OIDplusException(_L('Unknown action ID'));
}
}
 
public function init($html=true) {
// Nothing
}
 
public function gui($id, &$out, &$handled) {
if ($id === 'oidplus:login_ldap') {
$handled = true;
$out['title'] = _L('Login using LDAP / ActiveDirectory');
$out['icon'] = OIDplus::webpath(__DIR__).'icon_big.png';
 
if (!OIDplus::baseConfig()->getValue('LDAP_ENABLED', false)) {
$out['icon'] = 'img/error_big.png';
$out['text'] = _L('LDAP authentication is disabled on this system.');
return;
}
 
$out['text'] .= '<noscript>';
$out['text'] .= '<p>'._L('You need to enable JavaScript to use the login area.').'</p>';
$out['text'] .= '</noscript>';
 
$out['text'] .= '<div id="loginLdapArea" style="visibility: hidden">';
$out['text'] .= (OIDplus::baseConfig()->getValue('RECAPTCHA_ENABLED', false) ?
'<script> grecaptcha.render(document.getElementById("g-recaptcha"), { "sitekey" : "'.OIDplus::baseConfig()->getValue('RECAPTCHA_PUBLIC', '').'" }); </script>'.
'<p>'._L('Before logging in, please solve the following CAPTCHA').'</p>'.
'<div id="g-recaptcha" class="g-recaptcha" data-sitekey="'.OIDplus::baseConfig()->getValue('RECAPTCHA_PUBLIC', '').'"></div>' : '');
$out['text'] .= '<br>';
 
$out['text'] = '<h2>'._L('Login as RA').'</h2>';
$login_list = OIDplus::authUtils()->loggedInRaList();
if (count($login_list) > 0) {
foreach ($login_list as $x) {
$out['text'] .= '<p>'._L('You are logged in as %1','<b>'.$x->raEmail().'</b>').' (<a href="#" onclick="return raLogout('.js_escape($x->raEmail()).');">'._L('Logout').'</a>)</p>';
}
$out['text'] .= '<p>'._L('If you have more accounts, you can log in with another account here.').'</p>';
} else {
$out['text'] .= '<p>'._L('Enter your email address and your password to log in as Registration Authority.').'</p>';
}
$out['text'] .= '<form onsubmit="return raLoginLdapOnSubmit(this);">';
$out['text'] .= '<div><label class="padding_label">'._L('E-Mail').':</label><input type="text" name="email" value="" id="raLoginLdapEMail"></div>';
$out['text'] .= '<div><label class="padding_label">'._L('Password').':</label><input type="password" name="password" value="" id="raLoginLdapPassword"></div>';
$out['text'] .= '<br><input type="submit" value="'._L('Login').'"><br><br>';
$out['text'] .= '</form>';
 
$invitePlugin = OIDplus::getPluginByOid('1.3.6.1.4.1.37476.2.5.2.4.2.92'); // OIDplusPageRaInvite
$out['text'] .= '<abbr title="'._L('You don\'t need to register. Just enter your Windows/Company credentials.').'">'._L('How to register?').'</abbr></p>';
 
$mins = ceil(OIDplus::baseConfig()->getValue('SESSION_LIFETIME', 30*60)/60);
$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 %1 minutes.', $mins);
$privacy_document_file = 'OIDplus/privacy_documentation.html';
$resourcePlugin = OIDplus::getPluginByOid('1.3.6.1.4.1.37476.2.5.2.4.1.500'); // OIDplusPagePublicResources
if (!is_null($resourcePlugin) && 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').'>'._L('More information about the cookies used').'</a>';
}
$out['text'] .= '</font></p></div>';
 
$out['text'] .= '<script>document.getElementById("loginLdapArea").style.visibility = "visible";</script>';
}
}
 
public function publicSitemap(&$out) {
$out[] = 'oidplus:login_ldap';
}
 
public function tree(&$json, $ra_email=null, $nonjs=false, $req_goto='') {
return true;
}
 
public function tree_search($request) {
return false;
}
 
public function implementsFeature($id) {
if (strtolower($id) == '1.3.6.1.4.1.37476.2.5.2.3.5') return true; // alternativeLoginMethods
return false;
}
 
public function alternativeLoginMethods() {
$logins = array();
if (OIDplus::baseConfig()->getValue('LDAP_ENABLED', false)) {
$logins[] = array(
'oidplus:login_ldap',
'Login using LDAP / ActiveDirectory',
OIDplus::webpath(__DIR__).'treeicon.png'
);
}
return $logins;
}
}
/trunk/plugins/publicPages/800_login_ldap/OIDplusPagePublicLoginLDAP.js
0,0 → 1,54
/*
* OIDplus 2.0
* Copyright 2020 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.
*/
 
/* RA */
 
function raLoginLdap(email, password) {
$.ajax({
url:"ajax.php",
method:"POST",
data: {
csrf_token:csrf_token,
plugin:"1.3.6.1.4.1.37476.2.5.2.4.1.800",
action:"ra_login_ldap",
email:email,
password:password,
captcha: document.getElementsByClassName('g-recaptcha').length > 0 ? grecaptcha.getResponse() : null
},
error:function(jqXHR, textStatus, errorThrown) {
alert(_L("Error: %1",errorThrown));
if (document.getElementsByClassName('g-recaptcha').length > 0) grecaptcha.reset();
},
success:function(data) {
if ("error" in data) {
alert(_L("Error: %1",data.error));
if (document.getElementsByClassName('g-recaptcha').length > 0) grecaptcha.reset();
} else if (data.status >= 0) {
window.location.href = '?goto=oidplus:system';
// reloadContent();
} else {
alert(_L("Error: %1",data));
if (document.getElementsByClassName('g-recaptcha').length > 0) grecaptcha.reset();
}
}
});
}
 
function raLoginLdapOnSubmit() {
raLoginLdap(document.getElementById("raLoginLdapEMail").value, document.getElementById("raLoginLdapPassword").value);
return false;
}
/trunk/plugins/publicPages/800_login_ldap/icon_big.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/publicPages/800_login_ldap/index.html
--- trunk/plugins/publicPages/800_login_ldap/manifest.xml (nonexistent)
+++ trunk/plugins/publicPages/800_login_ldap/manifest.xml (revision 430)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<manifest
+ xmlns="urn:oid:1.3.6.1.4.1.37476.2.5.2.5.2.1"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:oid:1.3.6.1.4.1.37476.2.5.2.5.2.1 https://oidplus.viathinksoft.com/oidplus/plugins/manifest_plugin_page.xsd">
+
+ <type>OIDplusPagePluginPublic</type>
+
+ <info>
+ <name>Login</name>
+ <author>ViaThinkSoft</author>
+ <version />
+ <descriptionHTML />
+ <oid>1.3.6.1.4.1.37476.2.5.2.4.1.800</oid>
+ </info>
+
+ <php>
+ <mainclass>OIDplusPagePublicLoginLDAP</mainclass>
+ </php>
+
+ <css>
+ </css>
+
+ <js>
+ <file>OIDplusPagePublicLoginLDAP.js</file>
+ </js>
+
+</manifest>
/trunk/plugins/publicPages/800_login_ldap/treeicon.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