Commit e4fe9e3c authored by Mortier Benoit's avatar Mortier Benoit

Merge branch '1.0.12-fixes'

parents 4854b67c ec49b35f
.directory
......@@ -181,3 +181,13 @@ documentation and additional help.
* Christian Kreidl <christian.kreidl@ziti.uni-heidelberg.de>
ppolicy improvement
* Martin Hamant <mh@ow2.org>
Coded the LockUser fonction for the webservice
* Jonathan Swaelens <jonathan@opensides.be>
QA on FusionDirectory
RPM packaging maintener and ArchLinux Packager
* Timothée Giet timo@timotheegiet.com
New breezy icon Theme
FusionDirectory changelog
=========================
* FusionDirectory 1.0.13
|Fix] Bugs #4570: error when saving a user with php7
|Fix] Bugs #4571: when clicking on department in the left menu on php7
|Fix] Bugs #4757: padlock next to user dn in edition screen is confusing
|Fix] Bugs #4759: disabled account can still reset password ?
|Fix] FusionDirectory plugins - Bugs #4763: Translation mishaps in dovecot plugin
|Fix] Bugs #4764: Fusiondirectory exposes bindpw on error
[Feature] Bugs #4774: Add an LDAP logging system
|Fix] FusionDirectory plugins - Bugs #4776: unwanted debug in jsonrpc.php
|Fix] FusionDirectory plugins - Bugs #4782: Systems snapshots are broken
[Feature] FusionDirectory plugins - Bugs #4783: Use of templates through the webservice
[Feature] Bugs #4785: create an interface to manage the option for the script managing the expiration messages
|Fix] FusionDirectory plugins - Bugs #4787: Mail server should not be mandatory in alias plugin
|Fix] FusionDirectory plugins - Bugs #4788: 'Incorrect response id (request id: 1, response id: )'
|Fix] FusionDirectory plugins - Bugs #4789: Webservice setfields method needs documentation
|Fix] Bugs #4794: sambaNTpassword is not updated when password is changed through «My account» menu
|Fix] Bugs #4806: Importing ldif file with comments generates error
|Fix] Bugs #4821: password recovery, email field focus
|Fix] Bugs #4823: Imagick is not detected during the setup
|Fix] Bugs #4824: Error when I will create fd-admin in the setup
|Fix] Bugs #4826: File docs/INSTALL must be updated or deleted
|Fix] Bugs #4828: FusionDirectory does not work with Smarty 3.1.29
|Fix] Bugs #4833: Uncaught exception 'NonExistingObjectTypeException' with message 'Non-existing type ""
[Feature] Bugs #4853: get the value of the connect user in a variable to be passed to scripts hooks
|Fix] FusionDirectory plugins - Bugs #4855: PHP error about DNSenabled
|Fix] FusionDirectory plugins - Bugs #4856: Copy past test of server
[Feature] FusionDirectory plugins - Bugs #4857: When mail can be used to login, it should be unique
|Fix] Bugs #4863: top header of the login page keep the green even when the breezy them is activated
|Fix] FusionDirectory plugins - Wishlist #4790: make functions names consistent
|Fix] FusionDirectory plugins - Wishlist #4791: setfields() : values structure and fields names
|Fix] FusionDirectory plugins - Wishlist #4798: fields() : suggestion on returned array structure
[Feature] FusionDirectory plugins - Wishlist #4799: creating an object with several activated tabs in one go
[Feature] FusionDirectory plugins - Wishlist #4854: adding "lock/unlock entry" function to the webservice
* FusionDirectory 1.0.12
Bugs #4645: Could not add groups to user templates
FusionDirectory plugins - Bugs #4658: csv import with empty field
Bugs #4678: group : member objects list
FusionDirectory plugins - Bugs #4689: we should be able to create mail address without having a server and a service referenced
FusionDirectory plugins - Bugs #4692: remove the antivirus service
FusionDirectory plugins - Bugs #4699: move postfix service in his own plugin
FusionDirectory plugins - Bugs #4706: move the spamassasin service to his own plugin
Bugs #4713: remove the antivirus service icons
FusionDirectory plugins - Bugs #4714: leftover in services-fd.schema of the removal of the asterisk plugin
FusionDirectory plugins - Bugs #4721: move the spam options for the mail user tab to a spamassasin user tab
Bugs #4735: nginx + php-fpm with fusiondirectory
Bugs #4737: we should remove data['SERVERS']['IMAP'] from config
FusionDirectory plugins - Bugs #4739: remove the option Use custom sieve script (disables all Mail options!)
FusionDirectory plugins - Bugs #4740: in the cyrus service the hostname, port should be mandatory
FusionDirectory plugins - Bugs #4741: in the dovecot service the hostname, port should be mandatory
FusionDirectory plugins - Bugs #4742: ppolicy: description cannot be set
Bugs #4746: Error when saving user if objectClass person is missing.
Bugs #4754: user template : %r|% does not work in password
Bugs #4756: Update documentation with fixes/dev repos info.
Wishlist #4687: ACL assignments can’t give rights to groups.
Wishlist #4722: Use Nginx instead of Apache2
Wishlist #4738: extend the search query to email
FusionDirectory plugins - Wishlist #4743: ppolicy: user interface improvements
Wishlist #4755: user template: password should show only one field
|Fix] Bugs #4645: Could not add groups to user templates
|Fix] FusionDirectory plugins - Bugs #4658: csv import with empty field
|Fix] Bugs #4678: group : member objects list
[Feature] FusionDirectory plugins - Bugs #4689: we should be able to create mail address without having a server and a service referenced
|Fix] FusionDirectory plugins - Bugs #4692: remove the antivirus service
|Fix] FusionDirectory plugins - Bugs #4699: move postfix service in his own plugin
|Fix] FusionDirectory plugins - Bugs #4706: move the spamassasin service to his own plugin
|Fix] Bugs #4713: remove the antivirus service icons
|Fix] FusionDirectory plugins - Bugs #4714: leftover in services-fd.schema of the removal of the asterisk plugin
|Fix] FusionDirectory plugins - Bugs #4721: move the spam options for the mail user tab to a spamassasin user tab
|Fix] Bugs #4735: nginx + php-fpm with fusiondirectory
|Fix] Bugs #4737: we should remove data['SERVERS']['IMAP'] from config
|Fix] FusionDirectory plugins - Bugs #4739: remove the option Use custom sieve script (disables all Mail options!)
|Fix] FusionDirectory plugins - Bugs #4740: in the cyrus service the hostname, port should be mandatory
|Fix] FusionDirectory plugins - Bugs #4741: in the dovecot service the hostname, port should be mandatory
|Fix] FusionDirectory plugins - Bugs #4742: ppolicy: description cannot be set
|Fix] Bugs #4746: Error when saving user if objectClass person is missing.
|Fix] Bugs #4754: user template : %r|% does not work in password
|Fix] Bugs #4756: Update documentation with fixes/dev repos info.
|Fix] Wishlist #4687: ACL assignments can’t give rights to groups.
|Fix] Wishlist #4722: Use Nginx instead of Apache2
[Feature] Wishlist #4738: extend the search query to email
[Feature] FusionDirectory plugins - Wishlist #4743: ppolicy: user interface improvements
[Feature] Wishlist #4755: user template: password should show only one field
* FusionDirectory 1.0.11
......
FusionDirectory 1.0.7 INSTALL FROM SOURCES
==========================================
Prequisite:
You have a system up and running. It has apache and PHP 5.2.0 minimum installed
with smarty 2 or 3 and there is a blank (or prefilled) LDAP server available.
You have installed the following perl libraries
Path::Class
Net::LDAP
MIME::Base64
Crypt::PasswdMD5
Crypt::CBC
File::Copy::Recursive
Archive::Extract
XML::Twig
You have installed the following libraries :
scriptacolulous available at http://script.aculo.us/downloads
Prototype available at http://prototypejs.org/download/
Smarty3-i18n available at http://repos.fusiondirectory.org/sources/1.0/smarty3-i18n/
The following tool :
Schema2ldif http://repos.fusiondirectory.org/sources/1.0/schema2ldif/
If you intend to use the plugins that need an sql backend like :
rsyslog
asterisk
fax
you need to install the pear mdb2 library and the pear mdb2 driver library corresponding to your choice of database
---
1) DOWNLOADING FUSIONDIRECTORY
==============================
- Get the fusiondirectory tarballs from http://download.fusiondirectory.org/sources/1.0/fusiondirectory.
wget http://download.fusiondirectory.org/sources/1.0/fusiondirectory/fusiondirectory-1.0.x.tar.gz
wget http://download.fusiondirectory.org/sources/1.0/fusiondirectory/fusiondirectory-plugins-1.0.x.tar.gz
X here being the latest version available
- Get the checksums file to be sure that the file where not corrupted
wget http://download.fusiondirectory.org/sources/1.0/fusiondirectory/CHECKSUM.MD5
- Compare the md5sum from fusiondirectory-1.0.x.tar.gz and
fusiondirectory-1.0.x.tar.gz to the md5sum in CHECKSUM.MD5
cat CHECKSUM.MD5
md5sum fusiondirectory-1.0.x.tar.gz
md5sum fusiondirectory-plugins-1.0.x.tar.gz
2 ) INSTALLING FUSIONDIRECTORY CORE
===================================
- Unpack the FusionDirectory tarball and move the main fusiondirectory
directory to a place your webserver is configured to find it. On most
of the case this will be /var/www/fusiondirectory. Our fusiondirectory-setup script use
/var/www/fusiondirectory as default path.
For exemple, if you need to change the global path of FusionDirectory installation you can modify the variable 'fd_home':
* fusiondirectory-setup --set-fd_home="/usr/share/fusiondirectory" --write-vars will change the path of your FusionDirectory installation.
Please note that --write-vars combined with --set-<variable_name>=<your data> will write your changes to the variables.inc file,
so its mandatory to use them together.
- Move the contrib/bin directory in /usr/local/bin
* chmod 750 /var/www/fusiondirectory/contrib/bin/*
* mv /var/www/fusiondirectory/contrib/bin/* /usr/local/bin/
- Create if needed the man5 et man1 directories in /usr/local/man
* mkdir /usr/local/man/man1
* mkdir /usr/local/man/man5
- Compress the manpages
* gzip contrib/man/fusiondirectory.conf.5
* gzip contrib/man/fusiondirectory-setup.1
* gzip contrib/man/fusiondirectory-insert-schema.1
- Move the man pages to the right place
* mv contrib/man/fusiondirectory-setup.1.gz /usr/local/man/man1
* mv contrib/man/fusiondirectory-insert-schema.1.gz /usr/local/man/man1/
* mv contrib/man/fusiondirectory.conf.5.gz /usr/local/man/man5
- Create the symbolic links for the fusiondirectory smarty functions
Check that your smarty dir is in /usr/share/php/smarty or adapt the path accordingly
* ln -s /var/www/fusiondirectory/contrib/smarty/plugins/block.t.php /usr/share/php/smarty/libs/plugins/block.t.php
* ln -s /var/www/fusiondirectory/contrib/smarty/plugins/function.msgPool.php /usr/share/php/smarty/libs/plugins/function.msgPool.php
- Remove the library for accessing databases if you don't need access to the plugins needing it
* rm -f /var/www/fusiondirectory/include/class_databaseManagement.inc
- Create the directory to store your fusiondirectory schemas
mkdir <your-ldap-schema-directory>/fusiondirectory
- Move the needed schema and ldif from contrib to your ldap server schema directory
* mv /var/www/fusiondirectory/contrib/openldap/*.schema <your-ldap-schema-directory>/fusiondirectory
- Add the required schema
* fusiondirectory-insert-schema
- check what schema are installed
* fusiondirectory-insert-schema -l
core
cosine
nis
inetorgperson
samba
core-fd
core-fd-conf
ldapns
recovery-fd
Those are the core basic schema needed
- Run the fusiondirectory-setup
* fusiondirectory-setup --check-directories --update-cache --update-locales
Please note that if you changed the path of your FusionDirectory installation you will need to type the following commands
* fusiondirectory-setup --set-fd_home=<your path> --check-directories --update-cache --update-locales
- Copy the file from contrib/fusiondirectory.conf to /var/cache/fusiondirectory/template
3 INSTALLING FUSIONDIRECTORY PLUGINS
====================================
- Run the fusiondirectory-setup
* fusiondirectory-setup --install-plugins
Please note that if you changed the path of your FusionDirectory installation you will need to type the following commands
* fusiondirectory-setup --set-fd_home=<your path> --install-plugins
- Copy the two file from argonaut/include into the global FusionDirectory include directory
cp argonaut/include/class_supportDaemon.inc /var/www/fusiondirectory/include
cp argonaut/include/jsonRPCClient.php /var/www/fusiondirectory/include
- Remove the asterisk, fax, rsyslog plugins if you removed the database management library when installing the core
rm -Rf /var/www/fusiondirectory/plugins/personal/faxaccount/
rm -Rf /var/www/fusiondirectory/plugins/admin/blocklists/
rm -Rf /var/www/fusiondirectory/plugins/addons/faxreports/
rm -Rf /var/www/fusiondirectory/plugins/personal/phoneaccount/
rm -Rf /var/www/fusiondirectory/plugins/addons/fonreports/
rm -Rf /var/www/fusiondirectory/plugins/admin/conference/
rm -Rf /var/www/fusiondirectory/plugins/admin/macro/
rm -Rf /var/www/fusiondirectory/plugins/addons/rsyslog/
fusiondirectory-setup --update-locales --update-cache
Please note that if you changed the path of your FusionDirectory installation you will need to type the following commands:
fusiondirectory-setup --set-fd_home=<your path> --update-locales --update-cache
- Install the schema for the ldap configuration backedn of all the plugins
fusiondirectory-insert-schema -i /var/www/fusiondirectory/contrib/openldap/*fd-conf.schema
- Install the schema(s) for the each plugin you have installed
fusiondirectory-insert-schema -i /var/www/fusiondirectory/contrib/openldap/<plugin>.schema
- Copy the file from contrib/apache to the apache site configuration dir
* mv /var/www/fusiondirectory/contrib/apache/fusiondirectory-apache.conf <your-apache-configuration-directory>
- Reload your apache web server
http[s]://your-server/fusiondirectory
FusionDirectory setup will perform some basic system checks about general
prerequisites. The setup asks some questions and provides a basic
fusiondirectory.conf to save in /etc/fusiondirectory. Follow the instructions
until you're able to log in.
You're done. Lets play with the GUI.
Have fun!
---
* Further information
To improve this piece of software, please report all kind of errors using the bug tracker
on https://forge.fusiondirectory.org
Documentation: http://documentation.fusiondirectory.org/
Mailinglist: http://lists.fusiondirectory.org/
Irc: #fusiondirectory on freenode
---
The FusionDirectory project <contact@fusiondirectory.org>
This diff is collapsed.
......@@ -133,7 +133,7 @@
.\" ========================================================================
.\"
.IX Title "FUSIONDIRECTORY-INSERT-SCHEMA 1"
.TH FUSIONDIRECTORY-INSERT-SCHEMA 1 "2016-03-02" "FusionDirectory 1.0.12" "FusionDirectory Documentation"
.TH FUSIONDIRECTORY-INSERT-SCHEMA 1 "2016-06-02" "FusionDirectory 1.0.13" "FusionDirectory Documentation"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
......
......@@ -133,7 +133,7 @@
.\" ========================================================================
.\"
.IX Title "FUSIONDIRECTORY-SETUP 1"
.TH FUSIONDIRECTORY-SETUP 1 "2016-04-06" "FusionDirectory 1.0.12" "FusionDirectory Documentation"
.TH FUSIONDIRECTORY-SETUP 1 "2016-06-02" "FusionDirectory 1.0.13" "FusionDirectory Documentation"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
......
......@@ -133,7 +133,7 @@
.\" ========================================================================
.\"
.IX Title "FUSIONDIRECTORY.CONF 1"
.TH FUSIONDIRECTORY.CONF 1 "2016-03-02" "FusionDirectory 1.0.12" "FusionDirectory Documentation"
.TH FUSIONDIRECTORY.CONF 1 "2016-06-02" "FusionDirectory 1.0.13" "FusionDirectory Documentation"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
......
......@@ -30,8 +30,8 @@ session::global_set('errorsAlreadyPosted', array());
/* Logged in? Simple security check */
if (!session::global_is_set('ui')) {
new log("security", "unknown", "", array(), "Error: autocomplete.php called without session");
header ("Location: index.php");
logging::log('security', 'unknown', '', array(), 'Error: autocomplete.php called without session');
header ('Location: index.php');
exit;
}
......
This diff is collapsed.
......@@ -31,8 +31,8 @@ session::global_set('errorsAlreadyPosted', array());
/* Logged in? Simple security check */
if (!session::global_is_set('ui')) {
new log("security", "unknown", "", array(), "Error: getbin.php called without session");
header ("Location: index.php");
logging::log('security', 'unknown', '', array(), 'Error: getbin.php called without session');
header ('Location: index.php');
exit;
}
......
......@@ -23,7 +23,7 @@
require_once ("../include/php_setup.inc");
require_once ("functions.inc");
require_once ("variables.inc");
require_once ("class_log.inc");
require_once ("class_logging.inc");
header("Content-type: text/html; charset=UTF-8");
/* Display the login page and exit() */
......@@ -159,6 +159,7 @@ if (!is_readable(CONFIG_DIR.'/'.CONFIG_FILE)) {
/* Parse configuration file */
$config = new config(CONFIG_DIR.'/'.CONFIG_FILE, $BASE_DIR);
session::global_set('config', $config);
session::global_set('DEBUGLEVEL', $config->get_cfg_value('DEBUGLEVEL'));
@DEBUG (DEBUG_CONFIG, __LINE__, __FUNCTION__, __FILE__, $config->data, 'config');
......@@ -293,9 +294,9 @@ class Index {
$ui = ldap_login_user(self::$username, self::$password);
if ($ui === NULL || !$ui) {
if (isset($_SERVER['REMOTE_ADDR'])) {
new log('security', 'login', '', array(), 'Authentication failed for user "'.self::$username.'" [from '.$_SERVER['REMOTE_ADDR'].']');
logging::log('security', 'login', '', array(), 'Authentication failed for user "'.self::$username.'" [from '.$_SERVER['REMOTE_ADDR'].']');
} else {
new log('security', 'login', '', array(), 'Authentication failed for user "'.self::$username.'"');
logging::log('security', 'login', '', array(), 'Authentication failed for user "'.self::$username.'"');
}
$message = _('Please check the username/password combination.');
$smarty->assign ('nextfield', 'password');
......@@ -317,9 +318,6 @@ class Index {
/* User might have its own language, re-run initLanguage */
initLanguage();
/* Save config to session. */
session::global_set('config', $config);
/* We need a fully loaded plist and config to test account expiration */
session::global_un_set('plist');
$plist = load_plist();
......@@ -329,7 +327,7 @@ class Index {
$expired = $ui->expired_status();
if ($expired == POSIX_ACCOUNT_EXPIRED) {
new log('security', 'login', '', array(), 'Account for user "'.self::$username.'" has expired');
logging::log('security', 'login', '', array(), 'Account for user "'.self::$username.'" has expired');
$message = _('Account locked. Please contact your system administrator!');
$smarty->assign ('nextfield', 'password');
return FALSE;
......@@ -343,7 +341,7 @@ class Index {
{
global $config;
/* Not account expired or password forced change go to main page */
new log('security', 'login', '', array(), 'User "'.self::$username.'" logged in successfully.');
logging::log('security', 'login', '', array(), 'User "'.self::$username.'" logged in successfully.');
session::global_set('connected', 1);
$config->checkLdapConfig(); // check that newly installed plugins have their configuration in the LDAP
session::global_set('DEBUGLEVEL', $config->get_cfg_value('DEBUGLEVEL'));
......
......@@ -49,7 +49,7 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") {
/* Logged in? Simple security check */
if (!session::global_is_set('connected')) {
new log('security', 'login', '', array(), 'main.php called without session - logging out');
logging::log('security', 'login', '', array(), 'main.php called without session - logging out');
header ('Location: index.php?message=nosession');
exit;
}
......@@ -57,7 +57,7 @@ if (!session::global_is_set('connected')) {
/* Check for uniqe ip address */
$ui = session::global_get('ui');
if ($_SERVER['REMOTE_ADDR'] != $ui->ip) {
new log('security', 'login', '', array(), 'main.php called with session which has a changed IP address.');
logging::log('security', 'login', '', array(), 'main.php called with session which has a changed IP address.');
header ('Location: index.php?signout=1&message=newip');
exit;
}
......@@ -84,7 +84,7 @@ if (session::global_get('_LAST_PAGE_REQUEST') != '') {
*/
if ($request_time > $max_life) {
session::destroy();
new log('security', 'login', '', array(), 'main.php called with expired session - logging out');
logging::log('security', 'login', '', array(), 'main.php called with expired session - logging out');
header ('Location: index.php?signout=1&message=expired');
exit;
}
......@@ -114,7 +114,7 @@ if (isset($global_check) && $config->get_cfg_value("forceglobals") == "TRUE") {
_("Fatal error: Register globals is on. FusionDirectory will refuse to login unless this is fixed by an administrator."),
FATAL_ERROR_DIALOG);
new log("security", "login", "", array(), "Register globals is on. For security reasons, this should be turned off.");
logging::log('security', 'login', '', array(), 'Register globals is on. For security reasons, this should be turned off.');
session::destroy ();
exit;
}
......@@ -133,11 +133,11 @@ $smarty->assign("hideMenus", FALSE);
if ($config->get_cfg_value("handleExpiredAccounts") == "TRUE") {
$expired = $ui->expired_status();
if (($expired == POSIX_WARN_ABOUT_EXPIRATION) && !session::is_set('POSIX_WARN_ABOUT_EXPIRATION__DONE')) {
@DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, $expired, "This user account (".$ui->uid.") is about to expire");
@DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, $expired, 'This user account ('.$ui->uid.') is about to expire');
// The users password is about to xpire soon, display a warning message.
new log("security", "fusiondirectory", "", array(), "password for user '".$ui->uid."' is about to expire");
msg_dialog::display(_("Password change"), _("Your password is about to expire, please change your password!"), INFO_DIALOG);
logging::log('security', 'fusiondirectory', '', array(), 'password for user "'.$ui->uid.'" is about to expire');
msg_dialog::display(_('Password change'), _('Your password is about to expire, please change your password!'), INFO_DIALOG);
session::set('POSIX_WARN_ABOUT_EXPIRATION__DONE', TRUE);
} elseif ($expired == POSIX_FORCE_PASSWORD_CHANGE) {
@DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, $expired, "This user account expired");
......@@ -165,7 +165,7 @@ if (isset($_GET['plug']) && $plist->plugin_access_allowed($_GET['plug'])) {
$plugin_dir = $plist->get_path($plug);
session::global_set('plugin_dir', $plugin_dir);
if ($plugin_dir == '') {
new log('security', 'fusiondirectory', '', array(), "main.php called with invalid plug parameter \"$plug\"");
logging::log('security', 'fusiondirectory', '', array(), "main.php called with invalid plug parameter \"$plug\"");
header ('Location: index.php?signout=1&message=invalidparameter&plug='.$plug);
exit;
}
......
......@@ -62,12 +62,19 @@ if (!(is_dir($smarty->compile_dir) && is_writable($smarty->compile_dir))) {
}
/* Get posted language */
if (isset($_POST['lang_selected']) && $_POST['lang_selected'] != "") {
if (isset($_POST['lang_selected']) && $_POST['lang_selected'] != '') {
$lang = $_POST['lang_selected'];
/* Append .UTF-8 to language string if necessary */
if (!preg_match("/utf(-)8$/i", $lang)) {
$lang .= ".UTF-8";
if (!preg_match('/utf(-)?8$/i', $lang)) {
$lang .= '.UTF-8';
}
} elseif (session::global_is_set('lang')) {
$lang = session::global_get('lang');
/* Append .UTF-8 to language string if necessary */
if (!preg_match('/utf(-)?8$/i', $lang)) {
$lang .= '.UTF-8';
}
} else {
$lang = get_browser_language();
......
div.datepicker {
position:absolute;
text-align:center;
border:1px #AAA solid;
font-family:arial;
background:#fcfcfc;
font-size:10px;
padding:0;
}
div.datepicker-calendar table {
font-size:10px;
border:1px solid #fcfcfc;
margin:0;
padding:0;
text-align:center;
}
div.datepicker div.datepicker-header {
font-size:11px;
font-weight:bold;
background:#F0F0F0;
border-bottom: