mirror of
https://github.com/EGroupware/egroupware.git
synced 2025-02-04 20:40:14 +01:00
adding new dir structure for the api
This commit is contained in:
parent
14dd29f0de
commit
94b13882e9
18
phpgwapi/cron/clean_database.pl
Executable file
18
phpgwapi/cron/clean_database.pl
Executable file
@ -0,0 +1,18 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use DBI;
|
||||||
|
|
||||||
|
$db_host = 'localhost';
|
||||||
|
$db_name = 'phpGroupWare';
|
||||||
|
$db_user = 'phpgroupware';
|
||||||
|
$db_pass = 'phpgr0upwar3';
|
||||||
|
|
||||||
|
$dbase = DBI->connect("DBI:mysql:$db_name;$db_host",$db_user,$db_pass);
|
||||||
|
|
||||||
|
|
||||||
|
$command = $dbase->do("delete from webcal_entry");
|
||||||
|
$command = $dbase->do("delete from webcal_entry_user");
|
||||||
|
$command = $dbase->do("delete from webcal_entry_groups");
|
||||||
|
$command = $dbase->do("delete from webcal_entry_repeats");
|
||||||
|
|
||||||
|
$dbase->disconnect();
|
21
phpgwapi/cron/stalesessions.php
Executable file
21
phpgwapi/cron/stalesessions.php
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
// stalesession.php - to use instead of stalesession.pl
|
||||||
|
// may be invoked via cron with "php stalesession.php"
|
||||||
|
|
||||||
|
// config start
|
||||||
|
$purgedelay = "3600"; // define allowed idle time before deletion in seconds
|
||||||
|
$purgetime = time() - $purgedelay;
|
||||||
|
$db_user = $ARGV[1];
|
||||||
|
$db_pwd = "phpgr0upwar3";
|
||||||
|
$db_server = "localhost";
|
||||||
|
$db_db = "phpGroupWare";
|
||||||
|
// config end - do not edit after here unless you really know what you do!
|
||||||
|
|
||||||
|
// establish link:
|
||||||
|
$link = mysql_connect("$db_server","$db_user","$db_pwd");
|
||||||
|
mysql_query("use $db_db", $link);
|
||||||
|
|
||||||
|
// delete old (timed out) sessions
|
||||||
|
$query = sprintf("delete from sessions where dla <= \"$purgetime\"");
|
||||||
|
$res = mysql_query($query, $link);
|
||||||
|
?>
|
84
phpgwapi/cron/stalesessions.pl
Executable file
84
phpgwapi/cron/stalesessions.pl
Executable file
@ -0,0 +1,84 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
# /**************************************************************************\
|
||||||
|
# * phpGroupWare *
|
||||||
|
# * http://www.phpgroupware.org *
|
||||||
|
# * Written by Joseph Engo <jengo@phpgroupware.org> *
|
||||||
|
# * -------------------------------------------- *
|
||||||
|
# * This program is free software; you can redistribute it and/or modify it *
|
||||||
|
# * under the terms of the GNU General Public License as published by the *
|
||||||
|
# * Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
# * option) any later version. *
|
||||||
|
# \**************************************************************************/
|
||||||
|
|
||||||
|
use DBI;
|
||||||
|
|
||||||
|
# Config section
|
||||||
|
|
||||||
|
$db_host = 'localhost';
|
||||||
|
$db_name = 'phpGroupWare';
|
||||||
|
$db_user = 'phpgroupware';
|
||||||
|
$db_pass = 'phpgr0upwar3';
|
||||||
|
|
||||||
|
# Email users when they don't log out ?
|
||||||
|
# If you are selecting this option. You might want to customize the message
|
||||||
|
# below.
|
||||||
|
|
||||||
|
# Note: This takes much longer to clean out the database each time. Since it
|
||||||
|
# must go select each user and then email them.
|
||||||
|
|
||||||
|
$email_user = 'Y';
|
||||||
|
$sendmail_location = '/usr/sbin/sendmail';
|
||||||
|
|
||||||
|
# Where should the message be comming from ?
|
||||||
|
$message_from = "webmaster\@athens.prv";
|
||||||
|
|
||||||
|
# This is how long a user can be at idle before being deleted. Look at the
|
||||||
|
# SECURITY file for more information.
|
||||||
|
# The default is set to 2 hours.
|
||||||
|
|
||||||
|
$secs_to_stale = '3600';
|
||||||
|
|
||||||
|
|
||||||
|
# uncomment the line for your database.
|
||||||
|
# mysql
|
||||||
|
$dbase = DBI->connect("DBI:mysql:$db_name;$db_host",$db_user,$db_pass);
|
||||||
|
# postgresql
|
||||||
|
#$dbase = DBI->connect("DBI:Pg:dbname=$db_name;host=$db_host",$db_user,$db_pass);
|
||||||
|
|
||||||
|
# End of config section
|
||||||
|
|
||||||
|
$staletime = time() - $secs_to_stale;
|
||||||
|
|
||||||
|
if ($email_user eq 'Y') {
|
||||||
|
$command = $dbase->prepare("select loginid,logintime,ip,sessionid from "
|
||||||
|
. "sessions where dla <= '$staletime'");
|
||||||
|
$command->execute();
|
||||||
|
|
||||||
|
while (@session_data = $command->fetchrow_array()) {
|
||||||
|
send_message($session_data[0],$session_data[1],$session_data[2]);
|
||||||
|
$command2 = $dbase->do("delete from sessions where sessionid='"
|
||||||
|
. "$session_data[3]'");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$command = $dbase->do("delete from sessions where dla <= '$staletime'");
|
||||||
|
}
|
||||||
|
|
||||||
|
#$command->finish();
|
||||||
|
$dbase->disconnect();
|
||||||
|
|
||||||
|
sub send_message($$$)
|
||||||
|
{
|
||||||
|
my($loginid, $logintime,$IP)=@_;
|
||||||
|
open ( SENDMAIL, "|$sendmail_location -t" ) || warn "Can't open sendmail";
|
||||||
|
print SENDMAIL "To: $loginid\@localhost\n";
|
||||||
|
print SENDMAIL "Subject: Important account information\n";
|
||||||
|
print SENDMAIL "From: $message_from\n\n";
|
||||||
|
print SENDMAIL "According to our records, you have not logged out during ";
|
||||||
|
print SENDMAIL "your recent session. It is important to that you click ";
|
||||||
|
print SENDMAIL "on the logout icons when done with your session. ";
|
||||||
|
print SENDMAIL "\nFor more information, contact your system admin.\n\n";
|
||||||
|
print SENDMAIL "Session information:\n";
|
||||||
|
print SENDMAIL "logintime: " . localtime( $logintime ) . "\n";
|
||||||
|
print SENDMAIL "IP Address: " . $IP . "\n.\n";
|
||||||
|
close ( SENDMAIL );
|
||||||
|
}
|
444
phpgwapi/doc/CHANGELOG
Normal file
444
phpgwapi/doc/CHANGELOG
Normal file
@ -0,0 +1,444 @@
|
|||||||
|
[0.9.8] - Merged in patch for UW-Maildir IMAP server support
|
||||||
|
Thanks milosch
|
||||||
|
- Fixed setup not detecting installed databases with PHP 3
|
||||||
|
- Fixed repeating entries being saved properly.
|
||||||
|
- Added ability for admin to edit any calendar event.
|
||||||
|
- Fixed entries showing improperly on wrong date.
|
||||||
|
- Fixed file uploads through filemanager.
|
||||||
|
- Fixed repeating entries Month select box.
|
||||||
|
- Fixed calendar week selector starting on Monday on footer.
|
||||||
|
- Fixed buggy calendar saving when no groups are selected with group access.
|
||||||
|
- Fixed submitting of calendar entry when javascript turned off.
|
||||||
|
- Fixed calendar preferences not updating properly
|
||||||
|
- Fixed denylogin form not display and converted it to a template.
|
||||||
|
- Added select box option for multiable domains in login.php
|
||||||
|
- Fixed proxy server support for headlines and check for new version on main screen.
|
||||||
|
- Fixed headlines preferences and converted headline preferences to a template
|
||||||
|
- Fixed pgsql upgrade from beta path.
|
||||||
|
- Fixed chronological ordering of calendar events.
|
||||||
|
- Changed javascript validation to server side upon submitting calendar events.
|
||||||
|
- Merged patch for parsing of non-compliant rfc822 email addresses.
|
||||||
|
Thanks bwulf
|
||||||
|
- Fixed the addressbook not opening when composing email.
|
||||||
|
- Applied patch to fix md5 en/decryption.
|
||||||
|
Thanks milosch
|
||||||
|
- Fixed login message not showing up.
|
||||||
|
- Added in feature for frames. This can be a user preference, or a global option
|
||||||
|
for the admin to disable, allow, or force.
|
||||||
|
- Added in a few preformace tweaks that will use serialize() and unserialize() for
|
||||||
|
dropping the phpgw_info array into the session table durring login.
|
||||||
|
- Changed a few of the icons to our news ones.
|
||||||
|
- Fixed 12 am/pm problem in calendar.
|
||||||
|
- Added default filter to calendar preferences.
|
||||||
|
|
||||||
|
[0.9.7] - Fixed SQL error in tts
|
||||||
|
- Fixed table locking in admin -> edit account
|
||||||
|
- Added capability to schedule others and not yourself to calendar.
|
||||||
|
- Fixed d/l'ing of files through filemanager.
|
||||||
|
- Enhanced Free/Busy calendar view.
|
||||||
|
- Fix for repeating events not showing in calendar.
|
||||||
|
- Fix for Day View warning in calendar.
|
||||||
|
- Fix for TTS with Update by non-email user.
|
||||||
|
- Fixed admin/accesslog.php wasn't using phpgw_access_log
|
||||||
|
- Fix for Week View warning in calendar.
|
||||||
|
- Fix for Matrix View not working with Netscape 6.
|
||||||
|
- Added text only feature for navbar
|
||||||
|
- Converted navbar to work off templates
|
||||||
|
- Merged in patch for filemanager to fix upload in SAFE_MODE
|
||||||
|
Thanks s837008
|
||||||
|
- Cleaned up mainscreen message section, you can also have a login screen message now.
|
||||||
|
- Merged in update for french
|
||||||
|
- Merged in update for Spanish
|
||||||
|
Thanks gmartine
|
||||||
|
- Merged in patch for calendar for year view
|
||||||
|
Thanks bwulf
|
||||||
|
- session class will now use the HTTP_X_FORWARDED_FOR if a user is behind a proxy server.
|
||||||
|
- Merged in patch to fix the addressbook not displaying all of the fields.
|
||||||
|
Thanks ydario
|
||||||
|
- New Calendar table structures and code.
|
||||||
|
- Applied patch to fix set_time_limit() warnings in safe_mode
|
||||||
|
Thanks count
|
||||||
|
- Fixed warning messages in EMail with/without CC header info.
|
||||||
|
- Fixed errors for TTS mailings.
|
||||||
|
(This was actually a problem with email, users not having a
|
||||||
|
Sent folder. Sent Folders automatically created if not exist.)
|
||||||
|
- Fixed matrixview warnings when viewing manual.
|
||||||
|
- Fixed problem with moving to prev/next msg in NNTP.
|
||||||
|
- Fix possible problem connecting to LDAP server.
|
||||||
|
- Fix home page display of calendar events.
|
||||||
|
- Added ability to set users defaut calendar view of top icon.
|
||||||
|
- Changed calednar duration to a true date/time.
|
||||||
|
- Added ability to filter calendar events based on access.
|
||||||
|
- Merged in patch adding free() to the pgsql db.
|
||||||
|
Thanks count
|
||||||
|
|
||||||
|
[0.9.6] - Fix user permissions where not being checked properly.
|
||||||
|
|
||||||
|
[0.9.5] - Fixed NNTP preferences.
|
||||||
|
- Fixed NNTP read_message - missed converting call for VFS.
|
||||||
|
- Fixed calendar view of events - change of convert_string_to_names_access().
|
||||||
|
- Fixed deletion of user accounts hanging on deleting of calendar events.
|
||||||
|
- Fix for email in BIG5 charset.
|
||||||
|
- Fix for adding new users.
|
||||||
|
- Fixed a bug that was casuing people to have problems logining in when using cookie support.
|
||||||
|
- Fixed calendar display of 12 hour formats.
|
||||||
|
- Fixed a few problems with admin -> editaccount not changing the directory name properly.
|
||||||
|
- Fixed the languages table was using the lang name in upper case while everything else
|
||||||
|
was using lowercase.
|
||||||
|
- Added admin section to be able to add legal notices or other messages on the main screen.
|
||||||
|
Thanks snerd for this idea.
|
||||||
|
- Added matrix view of individuals and calendar events.
|
||||||
|
- Fixed parent_page link on footer line.
|
||||||
|
|
||||||
|
[0.9.4] - Fixed calendar week view.
|
||||||
|
- Displays calendar items in day view without start times.
|
||||||
|
- You now have to specify which API classes need to be loaded.
|
||||||
|
- Preformance is much better.
|
||||||
|
- Fixed a calendar SQL error with stock setups using the demo user.
|
||||||
|
- Fixed a problem with the email folders only reporting back the number of messages
|
||||||
|
in the INBOX regardless of which folder it is in.
|
||||||
|
- Added calendar day view to home page.
|
||||||
|
- Fixed problem with deletion of accounts.
|
||||||
|
- Fixed a few problems with error reporting in the accounts section.
|
||||||
|
Thanks mdean <mdean@kcnet.com>
|
||||||
|
- Renamed the webcal_entry.cal_create_by field to webcal_entry.cal_owner.
|
||||||
|
- Split out auth class, so that you can auth from anywhere and still store your accounts in sql or ldap.
|
||||||
|
- Added mail auth class, that will authenticate users against their email accounts
|
||||||
|
- Added multiple domain support.
|
||||||
|
- Fixed a few problems with the categories class
|
||||||
|
- Fixed nextmatchs calling link() wrong causing the next pages to not be displayed.
|
||||||
|
- Removed javascript from the login template
|
||||||
|
- Fixed HTML error in the application status select box for admin -> new/edit application
|
||||||
|
- Fixed group public filters in addressbook and todo list
|
||||||
|
- Cleanup up templates in admin section and created a few new templates.
|
||||||
|
|
||||||
|
[0.9.3] - Fixed the new user account form not returning the users firstname or last name when an
|
||||||
|
error is reported.
|
||||||
|
- Fixed NNTP to handle new VFS api.
|
||||||
|
- Fixed a number of preferences bugs on the main screen.
|
||||||
|
- Fixed E-Mail sigs not being added.
|
||||||
|
- Moved E-Mail preferences into its own section.
|
||||||
|
- When changing NNTP servers, now deletes newsgroups and users_newsgroups.
|
||||||
|
- Applied Patch #102089 - scrollbars for addressbook when composing email. Thanks jaggdedge <jaggdedge@users.sourceforge.net>
|
||||||
|
- owner fields are now working off account_id instead of account_lid
|
||||||
|
- Fixed time format on calendar preferences.
|
||||||
|
- NNTP now uses preferences to store monitored newsgroups.
|
||||||
|
- Added better error checking in applications admin section.
|
||||||
|
- Applied Patch #102116 - qmail/vmail spaces in TO:,CC: fields sending email. Thanks jaggdedge <jaggdedge@users.sourceforge.net>
|
||||||
|
- Email Trash folder is now created if it doesn't exsist
|
||||||
|
- Added user preferences for sending messages to the trash or just deleteing them.
|
||||||
|
- Started working on LDAP support. Its some what functional right now, but please be carefull
|
||||||
|
it has not been fully tested or debugged.
|
||||||
|
- Fixed appsession() not decrypting data properly.
|
||||||
|
- mcrypt should be working correctly now.
|
||||||
|
- Fixed problem with email's addressbook not retrieving records.
|
||||||
|
- Applied patch for accounts->listusers(). Thanks Mathieu van Loon <mathieu@playcollevtive.com>
|
||||||
|
- Fixed check for new version not working.
|
||||||
|
- Merged in patch for vcard support in addressbook. Thanks Qbert <qbert@users.sourceforge.net>
|
||||||
|
- Merged in patch for better langague support based on iso-639 Thanks zaphod <zaphod@users.sourceforge.net>
|
||||||
|
- Fixed accesslog not showing the logout field properly.
|
||||||
|
- transy should now be somewhat usable.
|
||||||
|
- Added automatic email of changes to TTS tickets.
|
||||||
|
- Fixed show currentusers on navbar preference
|
||||||
|
- Added new categories class
|
||||||
|
- Fixed date preferences in todo list
|
||||||
|
- Added date preferences to addressbook for birthdays
|
||||||
|
- Fixed group access to calendar items.
|
||||||
|
|
||||||
|
[0.9.2] - Fixed sorting bug in currentusers.php
|
||||||
|
- Cleaned up error reporting and form in newaccount.php
|
||||||
|
- Fixed viewaccounts.php not updated to the new accounts table.
|
||||||
|
- Fixed access_log not being updated durring logouts.
|
||||||
|
- Fixed email/folders.php not showing the number of messages in the INBOX.
|
||||||
|
- Fixed messages that where being passed around in the headlines admin section.
|
||||||
|
- Fixed setup script not working properly with certain version of MySQL.
|
||||||
|
- Fixed the participants list in the calendar.
|
||||||
|
- Fixed permission bug that was not checking users access to an app.
|
||||||
|
- Applied Patch #101453 - CJK character set display. Thanks Park ChungKyu <pchk@users.sourceforge.net>
|
||||||
|
- Applied Patch #101321 - CZECH lang translation. Thanks Petr Moses <pmoses@users.sourceforge.net>
|
||||||
|
- Now ISO 639 compliant with language translation id.
|
||||||
|
- Applied Patch #101828 - Swedish lang translation. Thanks Kjell Claesson <keyson@users.sourceforge.net>
|
||||||
|
- Fixed group management with new groups and navbar problems.
|
||||||
|
- Changed around the way the preferences work. The $phpgw_info array is also handled a little
|
||||||
|
differently for preferences. It now looks like:
|
||||||
|
$phpgw_info["user"]["preferences"][appname][preference name]
|
||||||
|
- Fixed NNTP call to preferences.php if user does not have any groups selected.
|
||||||
|
- Fixed setting of default preferences of new users.
|
||||||
|
- Updated Spanish translations. Thanks gmartine <gmartine@users.sourceforge.net>
|
||||||
|
- Default preferences used if not set in DB.
|
||||||
|
- NNTP fixed to use the new account table layout.
|
||||||
|
- NNTP Header problem fixed.
|
||||||
|
- Applied Patch #101934 - Updated Swedish lang translation. Thanks Kjell Claesson <keyson@users.sourceforge.net>
|
||||||
|
- Fixed a problem with setup/index.php return a number of errors on fresh PostgreSQL databases.
|
||||||
|
|
||||||
|
[0.9.1] - Fixed a few missing variables with templates.
|
||||||
|
- editing a product in the inventory program now forwards you back to the category
|
||||||
|
you where in.
|
||||||
|
- You can now use decimals in the inventory program.
|
||||||
|
- Added missing tables for tts and fixed problems with postgresql.
|
||||||
|
- Fixed changing of password not getting set in session table
|
||||||
|
- email now displays "Could not open mailbox" if mailbox could
|
||||||
|
not be opened (formerly displayed just "mailbox empty")
|
||||||
|
- Added ability to add/edit product status (inventory)
|
||||||
|
- Fixed displaying of repeated calendar events by owner
|
||||||
|
- Fixed displaying of calendar events to include group events
|
||||||
|
- Converted more of the inventory program to use templates
|
||||||
|
- Added a search field/add button when list products (inventory)
|
||||||
|
- Fixed editing of calendar entry with regards to start time
|
||||||
|
- Fixed sorting order in navbar when apps where assigned to a group.
|
||||||
|
- Fixed groups not being assinged an app properly.
|
||||||
|
- Fixed timeout for email receiving/sending.
|
||||||
|
- Changed the format for the accounts, sessions, and preferences tables.
|
||||||
|
- Started adding support for Oracle databases (Not working yet)
|
||||||
|
- Added new layout for admin and preferences sections.
|
||||||
|
- Fixed addressbook entries assigned to groups.
|
||||||
|
- Fixed accounts not using link() properly and kicking admin out of searchs.
|
||||||
|
- Removed globalconfig.inc.php and moved it into the database. Theres now a nice new
|
||||||
|
setup program.
|
||||||
|
- Updated docs a great deal.
|
||||||
|
- Group public items should now be working.
|
||||||
|
- Fixed a wrong data type error when calling sort() on 1 folder.
|
||||||
|
- Added week number in month view of calendar. (Patch by grasl)
|
||||||
|
- Moved charset setting from globalconfig.inc.php / DB to lang files.
|
||||||
|
- A bunch of other minor bug fixes.
|
||||||
|
|
||||||
|
[09072000] - Added print icon that allows you to print out a page without having
|
||||||
|
the navbar. Thanks Sam Wynn Jr <sam.wynn@lmco.com>
|
||||||
|
- on group creation the files directory tried to be created in
|
||||||
|
"filemanager/groups/" instead of in "files/groups/" - fixed.
|
||||||
|
Same for the user directory.
|
||||||
|
- Added error checking for creating/editing an account with no permissions.
|
||||||
|
- Fixed a db->unlock() issue in editaccount.php
|
||||||
|
- Fixed a few $phpgw_flags out of place.
|
||||||
|
- Fixed a problem with attachments not handled properly
|
||||||
|
- Fixed email/folder.php
|
||||||
|
- Fixed a problem with link targeting and the navbar.
|
||||||
|
- Fixed kp3 not being passed properly in chat.
|
||||||
|
- Changed the icon for NNTP.
|
||||||
|
- Changed the way session->create() makes the random number. This should fix
|
||||||
|
the problems on NT.
|
||||||
|
- Added HTTP Proxy support to phpgw_network.
|
||||||
|
- Pop3: when a header line started with cc:, from:, ..., but
|
||||||
|
no information followed the colon, a bunch of error messages were
|
||||||
|
displayed ("xxx not an object"). Fixed.
|
||||||
|
- Inventory program now supports changeable status fields.
|
||||||
|
- Added feature to show minium in stock products in different colors.
|
||||||
|
- Added error checking for changing a group name to a name that already exsists
|
||||||
|
- Removed session->hidden_var(), use link() from now on.
|
||||||
|
NOTE: You need to make sure you use the POST method. GET will cause problems.
|
||||||
|
- Cookie sessionid support works a little better now.
|
||||||
|
- Started adding LDAP account authencation support.
|
||||||
|
- Converted session->loginid, session->firstname, session->lastname, session->con to store
|
||||||
|
this data in the phpgw_info array.
|
||||||
|
- Moved check_owner() from session class to common.
|
||||||
|
- Converted all working apps to use the new lang() function which uses a database instead of
|
||||||
|
the lang files. (Passing extra variables is not working perfect, yet)
|
||||||
|
|
||||||
|
[08212000] - removed db_lock() and db_unlock() I changed the phpgw_db_* to use them
|
||||||
|
properly
|
||||||
|
- remove all remaining references to $dbase and $phpgw_db we are now using
|
||||||
|
$phpgw->db for database stuff
|
||||||
|
- Added unlock() in halt() for the database class. This should help prevent
|
||||||
|
database lockups if the program executes some invailed SQL.
|
||||||
|
- Moved around the directory layout. The include files and images are now
|
||||||
|
in the applications directory.
|
||||||
|
- You can now add permissions to a group, all users within that group
|
||||||
|
would be granted those permissions.
|
||||||
|
- NNTP now compatible with PHP3/PHP4.
|
||||||
|
- Fixed parse errors and footer problems with the calendars printer
|
||||||
|
friendly version.
|
||||||
|
- Fixed a problem with the groups directory not being deleted.
|
||||||
|
- Fixed a problem with not being able to add users to a group.
|
||||||
|
- Fixed bad links in calendar
|
||||||
|
- Added feature to be able to remove users from a group automaticly
|
||||||
|
- changetheme.php will now read the files in the directory. You no longer
|
||||||
|
need to edit it to add themes
|
||||||
|
- Fixed a problem with the default sorting order messing up the next matchs
|
||||||
|
while viewing a message
|
||||||
|
- Added feature to check for new releases of phpGW
|
||||||
|
- Added feature to filter out entrys only within a certain group.
|
||||||
|
This is for the todo list and addressbook.
|
||||||
|
- Added a search field and next matchs icons to accounts and groups form.
|
||||||
|
- Fixed the "code" messages not showing up after adding new entrys and what not.
|
||||||
|
- Started converting the admin section to work off templates
|
||||||
|
- Started converting the todo list to work off templates
|
||||||
|
- Added a few new themes
|
||||||
|
|
||||||
|
[08152000] - Fixed a problem with the calendar not showing the months in the users
|
||||||
|
langague preference.
|
||||||
|
- Added the new alpha human resources section
|
||||||
|
- Added the new alpha inventory program
|
||||||
|
- Added new global var $phpgw_flags
|
||||||
|
replaces $currentapp, $noheader, $nonavbar
|
||||||
|
- Small change in the API with the lang files.
|
||||||
|
- Added missing files for french
|
||||||
|
- pop_sort() accelerated by using temp file for storing header
|
||||||
|
information - speed factor > 2 for re-sorts!
|
||||||
|
- Added a temp quick fix for PostgreSQL not working in the calendar
|
||||||
|
I am using the old code, so there might be bugs. This is
|
||||||
|
just until we can find a better solution.
|
||||||
|
- Added a warning message if users are still apart of a group thats
|
||||||
|
about to be deleted.
|
||||||
|
- a bunch of error messages where shown when some header info was
|
||||||
|
split into multiple lines (on pop account), and address info
|
||||||
|
could not be built in this case. Fixed.
|
||||||
|
- Added Dutch and Korean langague support
|
||||||
|
- Added default app and default sorting order preference
|
||||||
|
- Fixed multipart handling on pop3
|
||||||
|
- Added config option for where the "Powered by" can go, top or bottom
|
||||||
|
- add/edit/delete accounts code has been cleaned up greatly.
|
||||||
|
- Better error control in the accounts section
|
||||||
|
- Fixed check_owner() in session class not reporting the owner properly
|
||||||
|
|
||||||
|
[08072000] - Fixed current users next matchs icons not showing up properly
|
||||||
|
- Added support to save sent-messages into Sent folder
|
||||||
|
- Fixed bug where users always see the mail server connection
|
||||||
|
error on a new installation
|
||||||
|
- Added cookie support so you can save your session id as a cookie
|
||||||
|
- Fixed permission bug in preferences with anonymous users
|
||||||
|
- Fixed permission bug in calendar
|
||||||
|
- Greatly improved ftp app
|
||||||
|
- Started adding the new manager permission
|
||||||
|
- Added link in the admin section to find out your phpinfo()
|
||||||
|
- A few bug fixes in the admin section
|
||||||
|
|
||||||
|
[08042000] - Fixed repeating events in calendar day view
|
||||||
|
- Started refering to modules as applications
|
||||||
|
- Fixed todo list not showing list properly
|
||||||
|
- Started adding new application layout
|
||||||
|
- Clean up documentation
|
||||||
|
- Added better german langague file support.
|
||||||
|
- Fixed addressbook not showing the group access properly
|
||||||
|
- Added nextmatchs to email
|
||||||
|
- Deleting a message will now forward you to the next message
|
||||||
|
instead of the inbox.
|
||||||
|
- Added spanish, Itailian and Norwegien lang files.
|
||||||
|
- EMail now supports POP-3
|
||||||
|
- Next matchs icons in email
|
||||||
|
- Many other fixes and features that we can't remeber :)
|
||||||
|
|
||||||
|
[07122000] - Added multi-langague support
|
||||||
|
- Added confirms before records are deleted.
|
||||||
|
- Fixed the footer not being called in the calendar
|
||||||
|
- Fixed the todo list not showing the list properly
|
||||||
|
- Added date format thanks vinz
|
||||||
|
- Renamed session.class to session.inc.php
|
||||||
|
- Added feature to allow stale uploads to be deleted on
|
||||||
|
systems that don't support cron
|
||||||
|
- Fixed calendar searchs
|
||||||
|
- Added preferences to have text under icons on navigation bar
|
||||||
|
|
||||||
|
[07062000] - Fixed javascript pop-up window upadting wrong fields.
|
||||||
|
thanks vinz
|
||||||
|
- Fixed security hole in logout.php
|
||||||
|
- Added support support for todo list showing who created
|
||||||
|
the record.
|
||||||
|
- Added support for date due in todo list.
|
||||||
|
- Fixed bug in killsession.php thanks vinz
|
||||||
|
- Added support for day view in calendar
|
||||||
|
- Added support for hovering descriptions using the alt tag
|
||||||
|
- Added support for newsheadlines program
|
||||||
|
thanks Mark Peters <mpeters@satx.rr.com>
|
||||||
|
- The calendar sports a new layout.
|
||||||
|
- Started converting HTML to be HTML 4.0 complient
|
||||||
|
- Added new filemanager program
|
||||||
|
- New experimental look for the user section.
|
||||||
|
|
||||||
|
[06302000] - Moved around the inc directorys for better security.
|
||||||
|
- Fixed the file attachments and parse errors.
|
||||||
|
- Fixed file uploads for Windows thanks vinz
|
||||||
|
- Added to bring you back to the same folder you are in
|
||||||
|
(email) thanks smoser
|
||||||
|
- Fixed directorys not be deleted properly and should
|
||||||
|
now work under windows.
|
||||||
|
- Updated docs a little
|
||||||
|
- Include pre-alpha release of trouble ticket system
|
||||||
|
- A few other small bug fixes.
|
||||||
|
|
||||||
|
[06272000] - Updated most of the docs for the new name (phpGroupWare)
|
||||||
|
- Resolve a few issues with installing on PHP 4.
|
||||||
|
- editaccounts.php3 now updated the calendar tables properly
|
||||||
|
- Cleaned up groups.inc and removed no longer used and repeated code
|
||||||
|
- Fixed broken link in calendar
|
||||||
|
- Renamed all .php3 so program works in PHP 4.
|
||||||
|
- Added next and previous links in calendar year view
|
||||||
|
- Printer friendly version of the calendar no longer show the
|
||||||
|
navigation bar on top
|
||||||
|
|
||||||
|
[06222000] - Fixed problem with timeformat only showing up if you have calendar
|
||||||
|
access.
|
||||||
|
- Added support to select from a few pre-defined date formats
|
||||||
|
Anyone have suggestions on some more ?
|
||||||
|
- Fixed problem with create_tables.mysql for calendar global events
|
||||||
|
thanks Vincent Larchet <vinz@users.sourceforge.net>
|
||||||
|
- Added support for multiable file uploads.
|
||||||
|
- Fixed table locking issues in editaccount.php3
|
||||||
|
- There is now a config option to point to a differant directory that webdistro is install on.
|
||||||
|
- A couple of other small bug fixes and code cleanup.
|
||||||
|
- Fixed a problem with email signatures not working
|
||||||
|
|
||||||
|
[06172000] - Added db_lock() and db_unlock. That should fix the table locking
|
||||||
|
problems.
|
||||||
|
- Fixed problem with filtering in todo list.
|
||||||
|
- Fixed admin viewaccount.php3 not showing permissions properly.
|
||||||
|
|
||||||
|
[06162000] - included new theme thanks Marl <marl@users.sourceforge.net>
|
||||||
|
- Made sure that the docs where included this time.
|
||||||
|
- Fixed javascript error in edit_entry.php thanks marvinhorst
|
||||||
|
- Fixed problem with edit_entry.php not including current users
|
||||||
|
loginid
|
||||||
|
- Renamed functions.inc to calendar.inc to make things easier to
|
||||||
|
understand.
|
||||||
|
- Renamed all .php file to .php3
|
||||||
|
- Fixed small calendar days, Sa and Su where backwords.
|
||||||
|
- Removed cal_eventid from webcal_entry_repeats, wasn't needed and was causing problems.
|
||||||
|
- Fixed a few problems with create_tables.*
|
||||||
|
- Global public items should now work in the calendar
|
||||||
|
- Added feature to change users passwords (admin)
|
||||||
|
- Update some of the docs.
|
||||||
|
- Renamed and merged some files in the calendar.
|
||||||
|
- Added percent of users that logged out to accesslog
|
||||||
|
|
||||||
|
[06092000] - Fixed lastlogin information that wasn't updating.
|
||||||
|
- Added table locks in edit_entry_handler.php (calendar)
|
||||||
|
- Added feature to annoy users that haven't changed there
|
||||||
|
password for more then 30 days.
|
||||||
|
- Added javascript popup window for addressbook in email
|
||||||
|
Thanks Brian King <bking@affcu.com>
|
||||||
|
|
||||||
|
[06082000] - Added new groups class
|
||||||
|
- Combined permissions and preferences into session.inc
|
||||||
|
- Renamed session.inc to webdistro_common.inc
|
||||||
|
- Fixed blank items showing up in the todo list.
|
||||||
|
- Cleaned up create_tables.* Took out all of the uneeded things.
|
||||||
|
- Included a new theme, it looks pretty bad on some computers.
|
||||||
|
But, we need to test things out a little with it.
|
||||||
|
|
||||||
|
[06052000] - Fixed a few permission bugs in the addressbook
|
||||||
|
- Started converting all programs to use the new session class
|
||||||
|
- Light code cleanup
|
||||||
|
- Fixed parse errors in a few places
|
||||||
|
- Added timezone support
|
||||||
|
- Updated stalesessions.pl
|
||||||
|
- Fixed a few possiable security problems with addressbook
|
||||||
|
|
||||||
|
[06032000] - Fixed problems editing accounts using postgresql
|
||||||
|
- Fixed problems creating account in create_tables.*
|
||||||
|
- Admin section updated. Sorting features. New layout for current
|
||||||
|
sessions.
|
||||||
|
- login.php3 Fixed problem with it not updating users lastlogin
|
||||||
|
- Fixed problems with adding events to the calendar.
|
||||||
|
- Fixed problems with repeating events with a frequency of more
|
||||||
|
then 1. I think I have finally narrowed most of the problems
|
||||||
|
down.
|
||||||
|
- Addressbook had the city and street mixed. Thanks Eric Degner
|
||||||
|
- Added feature to show who created the addressbook entry.
|
||||||
|
I will add support for this in the todolist later.
|
||||||
|
- Cleaned up some unneeded files in some of the directorys.
|
||||||
|
- Added next and previous link in message.php3 for email.
|
||||||
|
- Converted program to start using the new permissions and
|
||||||
|
preferences class.
|
||||||
|
- Fixed session table for mysql
|
||||||
|
|
||||||
|
[06022000] - Calendar bug fixes and code cleanup.
|
||||||
|
- Security fix for login.php3
|
87
phpgwapi/doc/CREDITS
Normal file
87
phpgwapi/doc/CREDITS
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
### Core Developers ###
|
||||||
|
|
||||||
|
* Joseph Engo (aka Jengo) <jengo@phpgroupware.org>
|
||||||
|
- Man who started it all.
|
||||||
|
- Provides project direction, documentation.
|
||||||
|
- Works on core services session management, permissions, groups class, etc...
|
||||||
|
- Wrote the following applications
|
||||||
|
--- Addressbook (orignal work)
|
||||||
|
--- ToDolist (orignal work)
|
||||||
|
--- Inventory (orignal work)
|
||||||
|
--- Email (Adapted from Aeromail, which was written by Mark Cushman <mark@cushman.net> http://the.cushman.net/)
|
||||||
|
--- Calendar (Adapted from WebCalendar, which was written by Craig Knudsen <cknudsen@radix.net> http://www.radix.net/~cknudsen)
|
||||||
|
- Continues development and project direction.
|
||||||
|
|
||||||
|
* Dan Kuykendall (aka Seek3r) <dan@kuykendall.org>
|
||||||
|
- Project Administrator/Supervisor.
|
||||||
|
- Provides project direction, documentation.
|
||||||
|
- Works on core services such as the $phpgw[] array for application developers.
|
||||||
|
- Hosts website, and offers commercial support thru Clear River Technologies (http://www.clearrivertech.com)
|
||||||
|
- Wrote the following applications
|
||||||
|
--- File Manager (Based on filemanager, which was written by Lacey Pevey <lpevey@mailhost.tcs.tulane.edu> http://px.sklar.com/code.html?code_id=258)
|
||||||
|
--- Chat (orignal work)
|
||||||
|
- Continues development and project direction.
|
||||||
|
|
||||||
|
### Application Developers ###
|
||||||
|
* Michael Weber <weber@rising-systems.de>
|
||||||
|
- Develops/Maintains Trouble Ticket System
|
||||||
|
|
||||||
|
* Vincent Larchet (aka vinz) <vinz@users.sourceforge.net>
|
||||||
|
- He hops from application to application helping out everywhere
|
||||||
|
- Keeps phpGW working on NT servers
|
||||||
|
|
||||||
|
* Mark A Peters (aka Skeeter) <mpeters@satx.rr.com>
|
||||||
|
- Developed/Maintains Headlines application
|
||||||
|
- Developed/Maintains NNTP application
|
||||||
|
- Helps with almost all other applications as well
|
||||||
|
|
||||||
|
* Scott Moser (aka smoser) <smoser@brickies.net>
|
||||||
|
-Developed/Maintains the FTP application
|
||||||
|
|
||||||
|
* Itzchak Rehberg (aka izzy) <izzysoft@qumran.org>
|
||||||
|
- has been working on replacement for mail() function
|
||||||
|
- Developed/Maintains POP-3 class
|
||||||
|
- Built/Maintains the german language files
|
||||||
|
- He hops from application to application helping out everywhere
|
||||||
|
|
||||||
|
* Stephan Beal (aka wander) <stephan@wanderinghorse.net>
|
||||||
|
- Initial quick-n-dirty rbs port from the MRBS system
|
||||||
|
- Minor bug fixes.
|
||||||
|
- Conned Hakon into doing the Norwegian translations ;)
|
||||||
|
|
||||||
|
* Marc Logemann (aka Loge) |loge@mail.com|
|
||||||
|
- Develop/Maintains todo (project management)
|
||||||
|
- Develops utility classes for phpgwapi
|
||||||
|
- mental support for Palm Sync issue :)
|
||||||
|
|
||||||
|
### Patch Contributors ### (in alphabetical order) Let us know if we forgot anyone :)
|
||||||
|
* Wolfgang Lunz <wlunz@infomatec.de>
|
||||||
|
* bachroxx <bachroxx@users.sourceforge.net>
|
||||||
|
* brandonne <brandonne@users.sourceforge.net>
|
||||||
|
* Park ChungKyu <pchk@users.sourceforge.net>
|
||||||
|
* Kjell Claesson <keyson@users.sourceforge.net>
|
||||||
|
- Swedish translations.
|
||||||
|
* Simone Cortesi <simone@cortesi.com>
|
||||||
|
- Italian translations.
|
||||||
|
* flimm <flimm@users.sourceforge.net>
|
||||||
|
* gmartine <gmartine@users.sourceforge.net>
|
||||||
|
* Omer Uner Guclu <oquclu@superonline.com>
|
||||||
|
* Marvin Horst <marvinhorst@hotmail.com>
|
||||||
|
* Brian King <bking@affcu.com>
|
||||||
|
* Marl <marl@users.sourceforge.net>
|
||||||
|
* Mike Preishuber <martin.preishuber@eclipt.uni-klu.ac.at>
|
||||||
|
* Roy Svendsen <roysv@users.sourceforge.net>
|
||||||
|
* smoser <smoser@users.sourceforge.net>
|
||||||
|
* Petr Moses <pmoses@users.sourceforge.net>
|
||||||
|
- Czechoslovakian translations.
|
||||||
|
* preisel <preisl@users.aourceforge.net>
|
||||||
|
* Raúl Alexis Betancort Santana <rabs@dimension-virtual.com>
|
||||||
|
- Great working on our first template set.
|
||||||
|
* Hakon Tjaum
|
||||||
|
- Norwegian translations.
|
||||||
|
* zaphod <zaphod@users.sourceforge.net>
|
||||||
|
- Dutch (?) translations.
|
||||||
|
|
||||||
|
Thanks to Crista Schofield and Eric Degner for *TONS* of Beta testing.
|
||||||
|
All others on the phpgroupware-developers@lists.sourceforge.net mailing list
|
||||||
|
And finally every one of our users for the encouragement that keeps us happy, which means more development.
|
342
phpgwapi/doc/LICENSE
Normal file
342
phpgwapi/doc/LICENSE
Normal file
@ -0,0 +1,342 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) 19yy <name of author>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Library General
|
||||||
|
Public License instead of this License.
|
||||||
|
|
||||||
|
|
1
phpgwapi/doc/README
Normal file
1
phpgwapi/doc/README
Normal file
@ -0,0 +1 @@
|
|||||||
|
PLEASE SEE THE index.html OR index.txt files.
|
2
phpgwapi/doc/RELEASE-NOTES
Normal file
2
phpgwapi/doc/RELEASE-NOTES
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
This version will NOT work with PHP 4.0.3pl1. This is due to the PHP devteam breaking serialize() and
|
||||||
|
unserialize(). There is no known work around.
|
27
phpgwapi/doc/SECURITY
Normal file
27
phpgwapi/doc/SECURITY
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
First off, I would not recommend using this in a type of enviroment that
|
||||||
|
security is a really big concern. I am *NOT* saying that you shouldn't be
|
||||||
|
concerned about it, but, until the system is thoughly tested. I would not
|
||||||
|
recommend it.
|
||||||
|
|
||||||
|
Becuase of the current methods that the email system works. It is required
|
||||||
|
that the users password is in the sessions table. IMAP needs the password
|
||||||
|
to verify the user. This is one of the main reasons for the stalesessions
|
||||||
|
program. I do not like keeping passwords in any medium that is not encryped.
|
||||||
|
|
||||||
|
The email system stores its file attachments in a temp directory. For right
|
||||||
|
now, you need to watch this directory because it can fill up very quickly.
|
||||||
|
If a user does not finsh composing the message (going else where in the program,
|
||||||
|
internet connection dieing, browser crash, etc) the file will sit there until
|
||||||
|
it is deleted. There will be a simple cron program to go through and clean
|
||||||
|
things up.
|
||||||
|
|
||||||
|
The files/users and files/groups directories need to be writable by the UID
|
||||||
|
that php runs under (nobody or your apache UID). This is a security risk
|
||||||
|
if 3rd parties can place php or cgi scripts on your machine, because they
|
||||||
|
will have full read/write access to those directories.
|
||||||
|
You should also consider moving the files directory outside of the
|
||||||
|
tree your webserver has access to to prevent websurfers from directly accessing
|
||||||
|
the files, or add in .htaccess files to restrict access to that tree.
|
||||||
|
|
||||||
|
Besides this, there is nothing else that I am aware of. Let me know if you
|
||||||
|
find anything.
|
2011
phpgwapi/doc/index.html
Normal file
2011
phpgwapi/doc/index.html
Normal file
File diff suppressed because it is too large
Load Diff
706
phpgwapi/doc/index.txt
Normal file
706
phpgwapi/doc/index.txt
Normal file
@ -0,0 +1,706 @@
|
|||||||
|
|
||||||
|
phpGroupWare Docs V0.05
|
||||||
|
|
||||||
|
Dan Kuykendall
|
||||||
|
|
||||||
|
Joseph Engo
|
||||||
|
_________________________________________________________________
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Dedication
|
||||||
|
|
||||||
|
Thanks to Joesph Engo for starting phpGroupWare (at the time called
|
||||||
|
webdistro) and the core of this HOWTO. Thanks to all the developers
|
||||||
|
and users who contribute to making phpGroupWare such a success.
|
||||||
|
|
||||||
|
Table of Contents
|
||||||
|
I. Introduction
|
||||||
|
|
||||||
|
1. What is phpGroupWare
|
||||||
|
2. Why should you use it
|
||||||
|
3. A short History
|
||||||
|
4. Copyright
|
||||||
|
|
||||||
|
II. Installation
|
||||||
|
|
||||||
|
5. Requirements
|
||||||
|
|
||||||
|
Tested Systems
|
||||||
|
|
||||||
|
6. Obtaining phpGroupWare
|
||||||
|
|
||||||
|
Released Versions
|
||||||
|
Developer's version from CVS
|
||||||
|
|
||||||
|
7. Installation Steps
|
||||||
|
|
||||||
|
Installing from TarBall
|
||||||
|
Installing from CVS
|
||||||
|
Setup / Configure phpGroupWare
|
||||||
|
Testing the install
|
||||||
|
Installing additional applications
|
||||||
|
|
||||||
|
8. Trouble Shooting
|
||||||
|
|
||||||
|
I get "Unable to open mailbox" when using the email
|
||||||
|
application
|
||||||
|
|
||||||
|
It seems to hang when I try to read my mail
|
||||||
|
When I log in I see the directory listing instead of a web
|
||||||
|
page
|
||||||
|
|
||||||
|
I get garbage that looks like code when I go to the
|
||||||
|
phpGroupWare URL
|
||||||
|
|
||||||
|
III. Using phpGroupWare
|
||||||
|
|
||||||
|
9. Loging into phpgw
|
||||||
|
10. checking Email
|
||||||
|
11. Using Addressbook
|
||||||
|
12. Using Calender
|
||||||
|
13. Managing Files with file manager
|
||||||
|
14. Getting Headlines
|
||||||
|
15. Human Resources
|
||||||
|
16. Preferences
|
||||||
|
17. Using todo
|
||||||
|
18. Using Trouble ticket
|
||||||
|
|
||||||
|
IV. Administering phpGroupWare
|
||||||
|
|
||||||
|
19. User Accounts
|
||||||
|
|
||||||
|
Creating Accounts
|
||||||
|
Maintaining Accounts
|
||||||
|
|
||||||
|
20. Group Accounts
|
||||||
|
|
||||||
|
Creating Accounts
|
||||||
|
Maintaining Accounts
|
||||||
|
|
||||||
|
21. Applications
|
||||||
|
|
||||||
|
Installing
|
||||||
|
Updating
|
||||||
|
|
||||||
|
V. Developers Documentation
|
||||||
|
|
||||||
|
22. Developing Add-On Apps
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
add your topic seek
|
||||||
|
|
||||||
|
23. API documentation
|
||||||
|
|
||||||
|
function1(or what ever)
|
||||||
|
|
||||||
|
VII. About this document
|
||||||
|
|
||||||
|
I. Introduction
|
||||||
|
|
||||||
|
Do yo have questions on using phpGroupWare , like What? Why? What for?
|
||||||
|
What's in for me?
|
||||||
|
|
||||||
|
Then you should seriously read this doc :-).
|
||||||
|
|
||||||
|
Table of Contents
|
||||||
|
1. What is phpGroupWare
|
||||||
|
2. Why should you use it
|
||||||
|
3. A short History
|
||||||
|
4. Copyright
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 1. What is phpGroupWare
|
||||||
|
|
||||||
|
phpGroupWare is a web based groupware application that includes
|
||||||
|
integrated features such as email, calendar, todo list, address book,
|
||||||
|
file manager, headline news, and a trouble ticket system. It should
|
||||||
|
run on all systems where PHP is installed and has access to a SQL
|
||||||
|
server (MySQL ,PostgreSQL or Oracle).
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 2. Why should you use it
|
||||||
|
|
||||||
|
You should use it if you would like a powerful groupware system that
|
||||||
|
can be access from anywhere on the Internet.
|
||||||
|
|
||||||
|
For companies with a distributed user base, it's an ideal solution.
|
||||||
|
Oh, and did I mention that its FREE?
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 3. A short History
|
||||||
|
|
||||||
|
phpGroupWare started by Jengo (Joseph Engo) as an application to
|
||||||
|
satisfy his girlfriends need for a webbased calendar/todo_list/email.
|
||||||
|
At the time it was called webdistro when Seek3r (Dan Kuykendall)
|
||||||
|
discovered this promising project. The two joined up together and
|
||||||
|
between Seek3r's API design and Jengo's programming skills they
|
||||||
|
renamed the project phpGroupWare and started building the application
|
||||||
|
around the phpgwAPI.
|
||||||
|
|
||||||
|
During this period Seek3r took over project management to free Jengo
|
||||||
|
up to do more development. This duo worked hard to build a sucessful
|
||||||
|
community around the project. Their efforts paid off, and the project
|
||||||
|
is what it is today due to the efforts of the developers who have
|
||||||
|
joined this community.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 4. Copyright
|
||||||
|
|
||||||
|
Copyright (c) Dan Kuykendall.
|
||||||
|
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.1 or
|
||||||
|
any later version published by the Free Software Foundation A copy of
|
||||||
|
the license is available at GNU Free Documentation License Making
|
||||||
|
TeXWork
|
||||||
|
|
||||||
|
II. Installation
|
||||||
|
|
||||||
|
Installation/Upgrade and Configuration of phpGroupWare has been made a
|
||||||
|
s easy as possible.
|
||||||
|
Most of the work is point and click.
|
||||||
|
By carefully reading this document you can easly install phpGroupWare.
|
||||||
|
|
||||||
|
Since this is still a beta version we do expect some bugs.
|
||||||
|
|
||||||
|
Table of Contents
|
||||||
|
5. Requirements
|
||||||
|
6. Obtaining phpGroupWare
|
||||||
|
7. Installation Steps
|
||||||
|
8. Trouble Shooting
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 5. Requirements
|
||||||
|
|
||||||
|
You will need PHP compiled and installed on your system. You will also
|
||||||
|
need MySQL, PostgreSQL or Oracle setup.
|
||||||
|
|
||||||
|
If you are planning on using the email system, you will need to have
|
||||||
|
an IMAP server installed and IMAP support compiled into PHP, or a POP3
|
||||||
|
server installed. You can have it installed as an Apache module or CGI
|
||||||
|
mode for other web servers, the Apache module is preferred. We will
|
||||||
|
assume that you are running on a Linux or other Unix system for these
|
||||||
|
steps. Windows is supported, but there is no documentation for it
|
||||||
|
currently.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Tested Systems
|
||||||
|
|
||||||
|
Seek3r has tested:
|
||||||
|
|
||||||
|
* phpGroupWare.org runs: Red Hat 6.2,
|
||||||
|
Apache/1.3.12,PHP/4.0.2,mod_perl/1.21,MySQL
|
||||||
|
3.23.10-alpha,Courier-IMAP 0.33+ with qmail 1.03
|
||||||
|
|
||||||
|
Blinky has tested:
|
||||||
|
|
||||||
|
* phpGroupWare.net runs: Red Hat 6.2,Apache/1.3.14 PHP/4.0.3pl1
|
||||||
|
mod_ssl/2.7.1 OpenSSL/0.9.6 PHP4.03.pl1, MySQL 3.23.10-alpha,qmail
|
||||||
|
1.03
|
||||||
|
* dev boxes are variants on: Red Hat 7.0,mysql-3.23.22-6 (from RH7
|
||||||
|
RPM), and Sendmail, Courier, or qmail+courier IMAP depending on
|
||||||
|
mood.
|
||||||
|
|
||||||
|
Jengo has tested:
|
||||||
|
|
||||||
|
* main test box: Red Hat 6.2,Apache 1.3.12,PHP 3.0.16,PostgreSQL
|
||||||
|
7.2,Sendmail (from RH6.2)
|
||||||
|
* laptop is rh 6.1, apache 1.3.?, MySQL and PostgreSQL 7.0 w/ PHP
|
||||||
|
3.0.16, its a P-90 w/ 40 mb ram and a 800 mb hd
|
||||||
|
* Test box: Win2k with IIS5.0, PHP4.0.2 and MySQL
|
||||||
|
|
||||||
|
There are installations on Windows NT and OS/2, and using MySQL or
|
||||||
|
Oracle as the database.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 6. Obtaining phpGroupWare
|
||||||
|
|
||||||
|
While we are still in the Beta phase of phpGroupWare, you may want to
|
||||||
|
track the CVS copy as closely as possible. The released versions are
|
||||||
|
more stable, but often contain bugs that have been fixed in the CVS
|
||||||
|
version.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Released Versions
|
||||||
|
|
||||||
|
The downloads section on the site contains links to the most recent
|
||||||
|
releases, and several mirror sites for the releases.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Developer's version from CVS
|
||||||
|
|
||||||
|
If you have never used CVS, you may want to read through the
|
||||||
|
doucmentation found at www.cvshome.org . The CVS pages for the core
|
||||||
|
and apps projects can be found at phpGroupWare Core CVS , and
|
||||||
|
phpGroupWare Apps CVS. Follow the directions for Anonymous CVS access
|
||||||
|
and you should have the most recent development copy of phpGroupWare
|
||||||
|
in no time.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 7. Installation Steps
|
||||||
|
|
||||||
|
After you have met the system requirements, You can install it from
|
||||||
|
the TarBall or you can get it directly from CVS.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Installing from TarBall
|
||||||
|
|
||||||
|
The files should be installed in the webserver directory. So all you
|
||||||
|
need to do is unpack the tar ball and copy the whole directory to the
|
||||||
|
webserver directory
|
||||||
|
|
||||||
|
(eg. /home/httpd/html for default apache configuration in many linux
|
||||||
|
distros).
|
||||||
|
|
||||||
|
You may have to get required permissions to do this. Contact your
|
||||||
|
system administrator if you dont have the permission to write to your
|
||||||
|
webserver directory.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Installing from CVS
|
||||||
|
|
||||||
|
Grabbing a copy from CVS is not as hard as it may seem. You will need
|
||||||
|
to have a cvs client installed. Then try the following commands:
|
||||||
|
|
||||||
|
export
|
||||||
|
CVSROOT=':pserver:anonymous@cvs.phpgroupware.sourceforge.net:/cvsroot/
|
||||||
|
phpgroupware'
|
||||||
|
cvs login (just hit enter when prompted for a password)
|
||||||
|
cvs checkout phpgroupware
|
||||||
|
If you need to install into a different dirname, you can add ' -d
|
||||||
|
dirname' after 'checkout' and before 'phpgroupware'. The commands
|
||||||
|
would look like this:
|
||||||
|
|
||||||
|
export
|
||||||
|
CVSROOT=':pserver:anonymous@cvs.phpgroupware.sourceforge.net:/cvsroot/
|
||||||
|
phpgroupware'
|
||||||
|
cvs login (just hit enter when prompted for a password)
|
||||||
|
cvs checkout -d dirname phpgroupware
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Setup / Configure phpGroupWare
|
||||||
|
|
||||||
|
The config file
|
||||||
|
|
||||||
|
Copy the header.inc.php.sample file to header.inc.php and edit the
|
||||||
|
file, following the directions in the comments.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Create database in MySQL
|
||||||
|
|
||||||
|
An empty database will be needed for phpGroupWare. Here are the
|
||||||
|
instructions for doing so with MySQL. First create the database:
|
||||||
|
|
||||||
|
mysqladmin create phpgroupware -p
|
||||||
|
Then login to the mysql:
|
||||||
|
|
||||||
|
mysql -p
|
||||||
|
Finally grant the needed security rights:
|
||||||
|
|
||||||
|
grant all on phpgroupware.* to phpgroupware@localhost identified by
|
||||||
|
"some_password";
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Create database in PostreSQL
|
||||||
|
|
||||||
|
An empty database will be needed for phpGroupWare. Here are the
|
||||||
|
instructions for doing so with PostgreSQL. Create the database:
|
||||||
|
|
||||||
|
postmaster -i -D /home/[username]/[dataDir]
|
||||||
|
You will probably need to review PostgreSQL documentation for futher
|
||||||
|
details.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
The Setup Program
|
||||||
|
|
||||||
|
Then point your browser to phpgroupware/setup/ which will create (or
|
||||||
|
upgrade) the database tables. You wil be asked to login, using the
|
||||||
|
password set in header.inc.php. Setup will attempt to determine what
|
||||||
|
version of the phpGroupWare database you have installed, and upgrade
|
||||||
|
to the most recent version.
|
||||||
|
|
||||||
|
Note: The developers are concentrating on getting the beta working,
|
||||||
|
and have not spent a great deal of time building upgrade scripts
|
||||||
|
from the alpha versions of phpGroupWare. You are advised to backup
|
||||||
|
your existing alpha database before running the setup script to
|
||||||
|
avoid problems!
|
||||||
|
|
||||||
|
If you get no error messages, continue on to
|
||||||
|
phpgroupware/setup/config.php to configure phpGroupWare to your
|
||||||
|
system.
|
||||||
|
|
||||||
|
If you are using the email system you will need to create a temporary
|
||||||
|
directory where file uploads will be stored. For security reasons, you
|
||||||
|
should chown nobody.nobody and chmod 700 to that directory. Depending
|
||||||
|
on your system configuration. Default installs of Apache normally run
|
||||||
|
as the user nobody. You may need your system administrator to do this
|
||||||
|
for you if you do not have root access.
|
||||||
|
|
||||||
|
If you do not have access to root, create this file and run it.
|
||||||
|
?php
|
||||||
|
if (mkdir("/path/to/temp/directory",0700)) {
|
||||||
|
echo "Directory created successfully";
|
||||||
|
} else {
|
||||||
|
echo "Error creating directory";
|
||||||
|
}
|
||||||
|
?
|
||||||
|
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
The phpGroupWare Daemon
|
||||||
|
|
||||||
|
If you have access to cron, you may want to setup the files in the
|
||||||
|
cron directory.
|
||||||
|
|
||||||
|
stalesessions.pl - There are 2 reasons for this file.
|
||||||
|
|
||||||
|
* Users always forget to logout. This way the session doesn't sit
|
||||||
|
around forever, creating a possible security risk.
|
||||||
|
* The email system requires plain text passwords which are stored in
|
||||||
|
the sessions table.
|
||||||
|
|
||||||
|
This file is not required, you can simply disable cron_apps in the
|
||||||
|
admin -> applications section to clean out the sessions table during
|
||||||
|
login and logout
|
||||||
|
|
||||||
|
stale_uploads.pl - This will delete file attachments for messages that
|
||||||
|
where not completed. If a users browser crashes, Internet connection
|
||||||
|
dies, etc, their files will sit there forever unless deleted. You
|
||||||
|
could add a few lines to logout.php that will look in the temp
|
||||||
|
directory for any stale uploads and delete them. But, once again, it
|
||||||
|
becomes a performance issue.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Testing the install
|
||||||
|
|
||||||
|
If your config is setup properly you can now login. Point your browser
|
||||||
|
to the installed location and login with the username demo and the
|
||||||
|
password is 1234 At this point it would be a good idea to create a new
|
||||||
|
user with administrative privileges and delete the old one.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Installing additional applications
|
||||||
|
|
||||||
|
Once you have the core phpGroupWare install up and running, you may
|
||||||
|
want to download and install additional applications.
|
||||||
|
|
||||||
|
You should consult any README or INSTALL files that come with the new
|
||||||
|
application first, as most require you to create additional tables in
|
||||||
|
the database, and add additional translation data to the lang table
|
||||||
|
(typically a file called lang.sql)
|
||||||
|
|
||||||
|
You install the new application within the phpGroupWare install tree
|
||||||
|
by copying the application directory into the phpGroupWare install
|
||||||
|
location, and enabling the application through the Administration
|
||||||
|
page.
|
||||||
|
|
||||||
|
For example, this is the process to install the Headlines application
|
||||||
|
(see http://sourceforge.net/phpgwapps/ for more on this and other
|
||||||
|
applications).
|
||||||
|
|
||||||
|
* Download the .tar.gz file for the application, or check out the
|
||||||
|
source with cvs with
|
||||||
|
export
|
||||||
|
CVSROOT=':pserver:anonymous@cvs.phpgroupware.sourceforge.net:/cvsr
|
||||||
|
oot/phpgwapps'
|
||||||
|
cvs login (just hit enter if prompted for a password)
|
||||||
|
cvs co headlines
|
||||||
|
* Move the headlines directory into your phpGroupWare install
|
||||||
|
directory.
|
||||||
|
* Log into phpGroupWare as an administrative user, and go to the
|
||||||
|
Administration page.
|
||||||
|
* In the first section, choose the Applications link.
|
||||||
|
* Click on add, and fill in the form.
|
||||||
|
Application name should be identical to the name of the directory
|
||||||
|
you moved into the phpGroupWare install, in this case use
|
||||||
|
headlines
|
||||||
|
Application Title is shown in the navigation bar and other places
|
||||||
|
to refer to the new application. Enter Headlines for this example.
|
||||||
|
Enabled can be used to disable an application for all users
|
||||||
|
temporially. You should normal check the box to enable the
|
||||||
|
application.
|
||||||
|
* Back in the Administration page, you need to enable the
|
||||||
|
application for specific users or user groups by editing them, and
|
||||||
|
checking the new Headlines box that appears in the middle of the
|
||||||
|
account editing page.
|
||||||
|
* Once you have added the Headlines app to your account, you should
|
||||||
|
see a Headlines entry in the Administration and Preferences pages,
|
||||||
|
and there should be an icon for the Headlines application in the
|
||||||
|
navigation bar.
|
||||||
|
* Once you enable a few of the Headlines sites through the
|
||||||
|
Administration page link, you should see headlines grabbed from
|
||||||
|
the sites you selected when you click on the Headlines icon in the
|
||||||
|
navigation bar.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 8. Trouble Shooting
|
||||||
|
|
||||||
|
Warning
|
||||||
|
|
||||||
|
phpGroupWare is still Beta software, expect some bugs along the way.
|
||||||
|
If you run into a problem not discussed here, contact us through one
|
||||||
|
of the methods listed on the website.
|
||||||
|
|
||||||
|
The phpGroupWare developers can most often be seen hanging out in
|
||||||
|
#phpGroupWare on irc.openprojects.net if you require real-time help.
|
||||||
|
|
||||||
|
Also check the FAQ in this directory for additional common questions,
|
||||||
|
it is available as FAQ.sgml, FAQ.txt and FAQ.html
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
I get "Unable to open mailbox" when using the email application
|
||||||
|
|
||||||
|
At the time of this writing (2000-09-27) you must use the same
|
||||||
|
username and password in phpGroupWare that you use to log into your
|
||||||
|
mail server. If you change your password and it still isn't working,
|
||||||
|
try logging out of phpGroupWare (the rightmost icon in the navigation
|
||||||
|
bar) and then log back in.
|
||||||
|
|
||||||
|
An preference page to edit the email settings is being developed, and
|
||||||
|
should appear shortly after the first beta release.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
It seems to hang when I try to read my mail
|
||||||
|
|
||||||
|
This is often a problem if you are using POP3 instead of IMAP, and you
|
||||||
|
have more than a few hundred messages in your mailbox.
|
||||||
|
|
||||||
|
By default, php is set up to time-out a request that takes over 30
|
||||||
|
seconds to complete. phpGroupWare must do a lot of work the first time
|
||||||
|
your POP3 mailbox is opened, and every time you get new mail, which
|
||||||
|
may take more than the 30 second timeout.
|
||||||
|
|
||||||
|
You can either clean up your mailbox with another mail program, or add
|
||||||
|
the line
|
||||||
|
set_time_limit(0);
|
||||||
|
|
||||||
|
to the top of the inc/phpgwapi/phpgw_msg_pop3.inc.php file, just
|
||||||
|
before the line class msg extends msg_common
|
||||||
|
|
||||||
|
If you choose to edit the file, be patient when loading a large POP3
|
||||||
|
mailbox - the author tested against a mailbox with 2500 messages in
|
||||||
|
it, but it took 15 minutes to load the page. We highly suggest you use
|
||||||
|
IMAP if you expect to have more than a few hundred messages in your
|
||||||
|
mailbox.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
When I log in I see the directory listing instead of a web page
|
||||||
|
|
||||||
|
You are using Apache, this often means you need to add .php to the
|
||||||
|
DirectoryIndex line in your httpd.conf file. For example:
|
||||||
|
DirectoryIndex index.php index.php3 index.html index.htm index.cgi
|
||||||
|
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
I get garbage that looks like code when I go to the phpGroupWare URL
|
||||||
|
|
||||||
|
This is often because you have php3 installed, which does not map .php
|
||||||
|
to the PHP engine. For PHP3:
|
||||||
|
AddType application/x-httpd-php3 .php3 .php
|
||||||
|
|
||||||
|
For PHP4:
|
||||||
|
AddType application/x-httpd-php .php3 .php
|
||||||
|
|
||||||
|
III. Using phpGroupWare
|
||||||
|
|
||||||
|
Using phpGroupWare is a cake walk , thats what people say :-). Reading
|
||||||
|
this doc would definitely give a head start. If you ever come cross
|
||||||
|
any problem please report to
|
||||||
|
|
||||||
|
Table of Contents
|
||||||
|
9. Loging into phpgw
|
||||||
|
10. checking Email
|
||||||
|
11. Using Addressbook
|
||||||
|
12. Using Calender
|
||||||
|
13. Managing Files with file manager
|
||||||
|
14. Getting Headlines
|
||||||
|
15. Human Resources
|
||||||
|
16. Preferences
|
||||||
|
17. Using todo
|
||||||
|
18. Using Trouble ticket
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 9. Loging into phpgw
|
||||||
|
|
||||||
|
After your setup you can point your browser to index.php in the
|
||||||
|
installation directory. If the set up was right you can login with
|
||||||
|
user name demo and the password is 1234> Now it is recommended to
|
||||||
|
create a new user with administrative privileges and delete the old
|
||||||
|
one.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 10. checking Email
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 11. Using Addressbook
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 12. Using Calender
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 13. Managing Files with file manager
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 14. Getting Headlines
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 15. Human Resources
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 16. Preferences
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 17. Using todo
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 18. Using Trouble ticket
|
||||||
|
|
||||||
|
IV. Administering phpGroupWare
|
||||||
|
|
||||||
|
To administer phpGroupWare you need not be a PHP hacker. All you need
|
||||||
|
to do is again just point and click. And hey just a bit of typing too.
|
||||||
|
:). You need to login to phpGroupWare and click the Administration
|
||||||
|
image.
|
||||||
|
|
||||||
|
Table of Contents
|
||||||
|
19. User Accounts
|
||||||
|
20. Group Accounts
|
||||||
|
21. Applications
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 19. User Accounts
|
||||||
|
|
||||||
|
In phpGroupWare it is very easy to maintain User Accounts. You can
|
||||||
|
easily add , remove or set previleges to the user accordingly.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Creating Accounts
|
||||||
|
|
||||||
|
To create a user account goto User Accounts section of Administration
|
||||||
|
and the click the Add button. Now a form would be displayed. FIXME :
|
||||||
|
should i explain the process :-). After submiting the form you would
|
||||||
|
be sent back to the accounts page and you can now see the new user you
|
||||||
|
have just created. Isn't it easy !!!
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Maintaining Accounts
|
||||||
|
|
||||||
|
Maintaining user accounts is also very easy. Just go to the User
|
||||||
|
Accounts section . Now you can see the list of the current users and
|
||||||
|
there logins. You can now either view their ops or can even edit them.
|
||||||
|
FIXMEAGIN: need i say anything more :->.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 20. Group Accounts
|
||||||
|
|
||||||
|
Enter the User Group section. You would see the current user groups.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Creating Accounts
|
||||||
|
|
||||||
|
Click the Add button. Now fill the form by selecting the existing
|
||||||
|
users and the persmissions you want to include in the new group.And
|
||||||
|
you r done.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Maintaining Accounts
|
||||||
|
|
||||||
|
One has always a option to view and edit the groups when ever needed
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 21. Applications
|
||||||
|
|
||||||
|
There r many applications been developed for phpGroupWare and there
|
||||||
|
would be more in the future. So insatallation of these application and
|
||||||
|
as well as the future applications has been made easy the developers.
|
||||||
|
So what you have to do is to just go to the Application section.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Installing
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Updating
|
||||||
|
|
||||||
|
V. Developers Documentation
|
||||||
|
|
||||||
|
This documentation is for developers who want to hack into the core of
|
||||||
|
the phpGroupWare. Please follow this documentation carefully before u
|
||||||
|
take a jump into the code :)
|
||||||
|
|
||||||
|
Table of Contents
|
||||||
|
22. Developing Add-On Apps
|
||||||
|
23. API documentation
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 22. Developing Add-On Apps
|
||||||
|
|
||||||
|
text for developin add on apps (seek its your area)
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
|
||||||
|
text for requirements
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
add your topic seek
|
||||||
|
|
||||||
|
text for the appropriate topic
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Chapter 23. API documentation
|
||||||
|
|
||||||
|
text for the API documentation chapter
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
function1(or what ever)
|
||||||
|
|
||||||
|
the function you want to include seek.
|
||||||
|
|
||||||
|
VII. About this document
|
||||||
|
|
||||||
|
The newest version of this document can be found on our website
|
||||||
|
www.phpgroupware.org as SGML source, HTML, or TEXT.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Comments
|
||||||
|
|
||||||
|
Comments on this HOWTO should be directed to the phpGroupWare
|
||||||
|
developers mailing list phpgroupware-developers@lists.sourceforge.net
|
||||||
|
|
||||||
|
To subscribe, go to http://sourceforge.net/mail/?group_id=7305
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
History
|
||||||
|
|
||||||
|
This document was started by Joseph Engo and reworked by Dan
|
||||||
|
Kuykendall.
|
||||||
|
_________________________________________________________________
|
||||||
|
|
||||||
|
Version History
|
||||||
|
|
||||||
|
Old Version
|
||||||
|
|
||||||
|
* Created by Jengo, wasn't in SGML HOWTO format.
|
||||||
|
|
||||||
|
v1.0 (July 6, 2000)
|
||||||
|
|
||||||
|
* Built proper SGML version.
|
||||||
|
* Included the FAQ.
|
||||||
|
* Other minor additions.
|
||||||
|
|
||||||
|
v1.1 (September 27-29, 2000) - blinky
|
||||||
|
|
||||||
|
* Added Testing Install section
|
||||||
|
* Added Trouble-shooting section
|
||||||
|
* Added description of application installation
|
||||||
|
* Changes for the new setup program
|
||||||
|
|
||||||
|
v0.01 (October 15 , 2000) - gnrfan , Converted the HOWTO to DocBook
|
||||||
|
format
|
||||||
|
|
||||||
|
v.0.05 (November 5, 2000) - gnrfan , Completely revamped according to
|
||||||
|
Seek's idea and intregrated the Developers HOWTO.
|
||||||
|
|
||||||
|
v 0.xx (Somewhere in the near future) - gnrfan, Trail map comming up
|
||||||
|
on how to hack and learn about coding phpGroupWare(core) and its apps
|
||||||
|
too :-).
|
43
phpgwapi/footer.inc.php
Normal file
43
phpgwapi/footer.inc.php
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* This file written by Dan Kuykendall <seek3r@phpgroupware.org> *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
$d1 = strtolower(substr($phpgw_info["server"]["app_inc"],0,3));
|
||||||
|
if($d1 == "htt" || $d1 == "ftp") {
|
||||||
|
echo "Failed attempt to break in via an old Security Hole!<br>\n";
|
||||||
|
exit;
|
||||||
|
} unset($d1);
|
||||||
|
|
||||||
|
/**************************************************************************\
|
||||||
|
* Include the apps footer files if it exists *
|
||||||
|
\**************************************************************************/
|
||||||
|
if (file_exists ($phpgw_info["server"]["app_inc"]."/footer.inc.php")){
|
||||||
|
include($phpgw_info["server"]["app_inc"]."/footer.inc.php");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($phpgw_info["server"]["showpoweredbyon"] == "bottom" && $phpgw_info["server"]["showpoweredbyon"] != "top") {
|
||||||
|
echo "<P>\n";
|
||||||
|
echo "<Table Width=100% Border=0 CellPadding=0 CellSpacing=0 BGColor=".$phpgw_info["theme"]["navbar_bg"].">\n";
|
||||||
|
echo " <TR><TD>";
|
||||||
|
echo "<P><P>\n" . lang("Powered by phpGroupWare version x",
|
||||||
|
$phpgw_info["server"]["version"]) . "<br>\n";
|
||||||
|
echo "</TD>";
|
||||||
|
if ($phpgw_info["flags"]["parent_page"])
|
||||||
|
echo "<td align=\"right\"><a href=\"".$phpgw->link($phpgw_info["flags"]["parent_page"])."\">".lang("up")."</a></td>";
|
||||||
|
echo "</TR>\n</Table>\n";
|
||||||
|
}
|
||||||
|
$phpgw->db->disconnect();
|
||||||
|
|
||||||
|
?>
|
||||||
|
</BODY>
|
||||||
|
</HTML>
|
418
phpgwapi/phpgw.inc.php
Normal file
418
phpgwapi/phpgw.inc.php
Normal file
@ -0,0 +1,418 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* This file written by Dan Kuykendall <seek3r@phpgroupware.org> *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
$d1 = strtolower(substr($phpgw_info["server"]["include_root"],0,3));
|
||||||
|
$d2 = strtolower(substr($phpgw_info["server"]["server_root"],0,3));
|
||||||
|
$d3 = strtolower(substr($phpgw_info["server"]["api_dir"],0,3));
|
||||||
|
if($d1 == "htt" || $d1 == "ftp" || $d2 == "htt" || $d2 == "ftp" || $d3 == "htt" || $d3 == "ftp") {
|
||||||
|
echo "Failed attempt to break in via an old Security Hole!<br>\n";
|
||||||
|
exit;
|
||||||
|
} unset($d1);unset($d2);unset($d3);
|
||||||
|
|
||||||
|
error_reporting(7);
|
||||||
|
|
||||||
|
/**************************************************************************\
|
||||||
|
* Quick verification of updated header.inc.php *
|
||||||
|
\**************************************************************************/
|
||||||
|
if ($phpgw_info["server"]["header_version"] != $phpgw_info["server"]["current_header_version"]){
|
||||||
|
echo "You need to port your settings to the new header.inc.php version.";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************\
|
||||||
|
* Load up all the base files *
|
||||||
|
\**************************************************************************/
|
||||||
|
include($phpgw_info["server"]["include_root"] . "/phpgwapi/phpgw_info.inc.php");
|
||||||
|
|
||||||
|
/**************************************************************************\
|
||||||
|
* Required classes *
|
||||||
|
\**************************************************************************/
|
||||||
|
/* Load selected database class */
|
||||||
|
if (empty($phpgw_info["server"]["db_type"])){$phpgw_info["server"]["db_type"] = "mysql";}
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_db_".$phpgw_info["server"]["db_type"].".inc.php");
|
||||||
|
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_session.inc.php");
|
||||||
|
|
||||||
|
/* Load selected translation class */
|
||||||
|
if (empty($phpgw_info["server"]["translation_system"])){$phpgw_info["server"]["translation_system"] = "sql";}
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_lang_".$phpgw_info["server"]["translation_system"].".inc.php");
|
||||||
|
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_crypto.inc.php");
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_template.inc.php");
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_common.inc.php");
|
||||||
|
|
||||||
|
/**************************************************************************\
|
||||||
|
* Optional classes, which can be disabled for performance increases *
|
||||||
|
* - they are loaded after pulling in the config from the DB *
|
||||||
|
\**************************************************************************/
|
||||||
|
function load_optional()
|
||||||
|
{
|
||||||
|
global $phpgw,$phpgw_info;
|
||||||
|
|
||||||
|
$phpgw->common->key = $phpgw_info["server"]["encryptkey"];
|
||||||
|
$phpgw->common->key .= $phpgw_info["user"]["sessionid"];
|
||||||
|
$phpgw->common->key .= $phpgw_info["user"]["kp3"];
|
||||||
|
$phpgw->common->iv = $phpgw_info["server"]["mcrypt_iv"];
|
||||||
|
$phpgw->crypto = new crypto($phpgw->common->key,$phpgw->common->iv);
|
||||||
|
|
||||||
|
if ($phpgw_info["flags"]["enable_categories_class"]) {
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_categories.inc.php");
|
||||||
|
$phpgw->categories = new categories;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($phpgw_info["flags"]["enable_network_class"]) {
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_network.inc.php");
|
||||||
|
$phpgw->network = new network;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($phpgw_info["flags"]["enable_send_class"]) {
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_send.inc.php");
|
||||||
|
$phpgw->send = new send;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($phpgw_info["flags"]["enable_nextmatchs_class"]) {
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_nextmatchs.inc.php");
|
||||||
|
$phpgw->nextmatchs = new nextmatchs;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($phpgw_info["flags"]["enable_utilities_class"]) {
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_utilities.inc.php");
|
||||||
|
$phpgw->utilities = new utilities;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($phpgw_info["flags"]["enable_vfs_class"]) {
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_vfs.inc.php");
|
||||||
|
$phpgw->vfs = new vfs;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($phpgw_info["flags"]["enable_todo_class"]) {
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_todo.inc.php");
|
||||||
|
$phpgw->todo = new todo;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($phpgw_info["flags"]["enable_calendar_class"]) {
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_calendar.inc.php");
|
||||||
|
$phpgw->calendar = new calendar;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($phpgw_info["flags"]["enable_addressbook_class"]) {
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_addressbook.inc.php");
|
||||||
|
$phpgw->addressbook = new addressbook;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************\
|
||||||
|
* Our API class starts here *
|
||||||
|
\**************************************************************************/
|
||||||
|
class phpgw
|
||||||
|
{
|
||||||
|
var $accounts;
|
||||||
|
var $acl;
|
||||||
|
var $addressbook;
|
||||||
|
var $auth;
|
||||||
|
var $db;
|
||||||
|
var $debug = 0; // This will turn on debugging information. (Not fully working)
|
||||||
|
var $crypto;
|
||||||
|
var $calendar;
|
||||||
|
var $categories;
|
||||||
|
var $common;
|
||||||
|
var $hooks;
|
||||||
|
var $network;
|
||||||
|
var $nextmatchs;
|
||||||
|
var $preferences;
|
||||||
|
var $session;
|
||||||
|
var $msg;
|
||||||
|
var $send;
|
||||||
|
var $template;
|
||||||
|
var $todo;
|
||||||
|
var $translation;
|
||||||
|
var $utilities;
|
||||||
|
var $vfs;
|
||||||
|
|
||||||
|
|
||||||
|
// This is here so you can decied what the best way to handle bad sessions
|
||||||
|
// You could redirect them to login.php with code 2 or use the default
|
||||||
|
// I recommend using the default until all of the bugs are worked out.
|
||||||
|
|
||||||
|
function phpgw()
|
||||||
|
{
|
||||||
|
global $phpgw_info, $sessionid;
|
||||||
|
/**************************************************************************\
|
||||||
|
* Required classes *
|
||||||
|
\**************************************************************************/
|
||||||
|
$this->db = new db;
|
||||||
|
$this->db->Host = $phpgw_info["server"]["db_host"];
|
||||||
|
$this->db->Type = $phpgw_info["server"]["db_type"];
|
||||||
|
$this->db->Database = $phpgw_info["server"]["db_name"];
|
||||||
|
$this->db->User = $phpgw_info["server"]["db_user"];
|
||||||
|
$this->db->Password = $phpgw_info["server"]["db_pass"];
|
||||||
|
|
||||||
|
if ($this->debug) {
|
||||||
|
$this->db->Debug = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($phpgw_info["flags"]["currentapp"] == "login") {
|
||||||
|
$this->db->query("select * from config",__LINE__,__FILE__);
|
||||||
|
while($this->db->next_record()) {
|
||||||
|
$phpgw_info["server"][$this->db->f("config_name")] = $this->db->f("config_value");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Load selected authentication class */
|
||||||
|
if (empty($phpgw_info["server"]["auth_type"])){$phpgw_info["server"]["auth_type"] = "sql";}
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_auth_".$phpgw_info["server"]["auth_type"].".inc.php");
|
||||||
|
|
||||||
|
/* Load selected accounts class */
|
||||||
|
if (empty($phpgw_info["server"]["account_repository"])){$phpgw_info["server"]["account_repository"] = $phpgw_info["server"]["auth_type"];}
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_accounts_".$phpgw_info["server"]["account_repository"].".inc.php");
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_accounts_shared.inc.php");
|
||||||
|
|
||||||
|
/**************************************************************************\
|
||||||
|
* Continue adding the classes *
|
||||||
|
\**************************************************************************/
|
||||||
|
$this->auth = new auth;
|
||||||
|
$this->session = new sessions;
|
||||||
|
$this->translation = new translation;
|
||||||
|
$this->common = new common;
|
||||||
|
$this->accounts = new accounts;
|
||||||
|
$this->preferences = new preferences;
|
||||||
|
$this->acl = new acl;
|
||||||
|
$this->hooks = new hooks;
|
||||||
|
|
||||||
|
$sep = filesystem_separator();
|
||||||
|
$template_root = $phpgw_info["server"]["server_root"] . $sep . $phpgw_info["flags"]["currentapp"]
|
||||||
|
. $sep . "templates" . $sep . $phpgw_info["server"]["default_tplset"];
|
||||||
|
if (is_dir($template_root)) {
|
||||||
|
$this->template = new Template($template_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/**************************************************************************\
|
||||||
|
* Core functions *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* A function to handle session support via url session id, or cookies */
|
||||||
|
function link($url = "", $extravars = "")
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info, $usercookie, $kp3, $PHP_SELF;
|
||||||
|
|
||||||
|
if (! $kp3)
|
||||||
|
$kp3 = $phpgw_info["user"]["kp3"];
|
||||||
|
|
||||||
|
if (! $url) { // PHP won't allow you to set a var to a var
|
||||||
|
$url = $PHP_SELF; // or function for default values
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($phpgw_info["server"]["usecookies"]) && $phpgw_info["server"]["usecookies"]) {
|
||||||
|
if ($extravars) {
|
||||||
|
$url .= "?$extravars";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$url .= "?sessionid=" . $phpgw_info["user"]["sessionid"];
|
||||||
|
$url .= "&kp3=" . $kp3;
|
||||||
|
if ($extravars) {
|
||||||
|
$url .= "&$extravars";
|
||||||
|
}
|
||||||
|
$url .= "&domain=" . $phpgw_info["user"]["domain"];
|
||||||
|
if ($phpgw_info["flags"]["newsmode"]) {
|
||||||
|
$url .= "&newsmode=on";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// next line adds index.php when one is assumed since
|
||||||
|
// iis will not interpret urls like http://.../addressbook/?xyz=5
|
||||||
|
return str_replace("/?", "/index.php?", $url);
|
||||||
|
}
|
||||||
|
|
||||||
|
function strip_html($s)
|
||||||
|
{
|
||||||
|
global $phpgw_info;
|
||||||
|
$working_langs = array("en" => True);
|
||||||
|
|
||||||
|
return htmlspecialchars(stripslashes($s));
|
||||||
|
}
|
||||||
|
|
||||||
|
function redirect($url = "")
|
||||||
|
{
|
||||||
|
// This function handles redirects under iis and apache
|
||||||
|
// it assumes that $phpgw->link() has already been called
|
||||||
|
|
||||||
|
global $HTTP_ENV_VARS;
|
||||||
|
|
||||||
|
$iis = strpos($HTTP_ENV_VARS["SERVER_SOFTWARE"], "IIS", 0);
|
||||||
|
|
||||||
|
if ( !$url ) {
|
||||||
|
$url = $PHP_SELF;
|
||||||
|
}
|
||||||
|
if ( $iis ) {
|
||||||
|
echo "\n<HTML>\n<HEAD>\n<TITLE>Redirecting to $url</TITLE>";
|
||||||
|
echo "\n<META HTTP-EQUIV=REFRESH CONTENT=\"0; URL=$url\">";
|
||||||
|
echo "\n</HEAD><BODY>";
|
||||||
|
echo "<H3>Please continue to <a href=\"$url\">this page</a></H3>";
|
||||||
|
echo "\n</BODY></HTML>";
|
||||||
|
exit;
|
||||||
|
} else {
|
||||||
|
Header("Location: $url");
|
||||||
|
print("\n\n");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function lang($key, $m1 = "", $m2 = "", $m3 = "", $m4 = "")
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
|
||||||
|
return $phpgw->translation->translate($key);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Some people might prefear to use this one
|
||||||
|
function _L($key, $m1 = "", $m2 = "", $m3 = "", $m4 = "")
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
|
||||||
|
return $phpgw->translation->translate($key);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
/**************************************************************************\
|
||||||
|
* Our API class ends here *
|
||||||
|
\**************************************************************************/
|
||||||
|
/**************************************************************************\
|
||||||
|
* Direct functions, which are not part of the API class *
|
||||||
|
* for whatever reason. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
function lang($key, $m1="", $m2="", $m3="", $m4="", $m5="", $m6="", $m7="", $m8="", $m9="", $m10="" )
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
# TODO: check if $m1 is of type array. If so, use it instead of $m2-$mN (Stephan)
|
||||||
|
$vars = array( $m1, $m2, $m3, $m4, $m5, $m6, $m7, $m8, $m9, $m10 );
|
||||||
|
$value = $phpgw->translation->translate("$key", $vars );
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Just a temp wrapper.
|
||||||
|
function check_code($code)
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
|
||||||
|
return $phpgw->common->check_code($code);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************\
|
||||||
|
* These lines load up the API, fill up the $phpgw_info array, etc *
|
||||||
|
\**************************************************************************/
|
||||||
|
$phpgw = new phpgw;
|
||||||
|
|
||||||
|
if ($phpgw_info["flags"]["currentapp"] != "login" && $phpgw_info["flags"]["currentapp"] != "logout") {
|
||||||
|
if (! $phpgw->session->verify()) {
|
||||||
|
Header("Location: " . $phpgw->link($phpgw_info["server"]["webserver_url"] . "/login.php", "cd=10"));
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
load_optional();
|
||||||
|
|
||||||
|
phpgw_fillarray();
|
||||||
|
$phpgw->common->common_();
|
||||||
|
if ($phpgw_info["flags"]["enable_calendar_class"]){
|
||||||
|
$printer_friendly = ((isset($friendly) && ($friendly==1))?True:False);
|
||||||
|
$phpgw->calendar->calendar_($printer_friendly);
|
||||||
|
}
|
||||||
|
if ($phpgw_info["flags"]["enable_utilities_class"]){
|
||||||
|
$phpgw->utilities->utilities_();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($phpgw_info["flags"]["nocommon_preferences"]) || !$phpgw_info["flags"]["nocommon_preferences"]) {
|
||||||
|
if (!isset($phpgw_info["user"]["preferences"]["common"]["maxmatchs"]) || !$phpgw_info["user"]["preferences"]["common"]["maxmatchs"]) {
|
||||||
|
$phpgw->preferences->change("common","maxmatchs",15);
|
||||||
|
$preferences_update = True;
|
||||||
|
}
|
||||||
|
if (!isset($phpgw_info["user"]["preferences"]["common"]["theme"]) || !$phpgw_info["user"]["preferences"]["common"]["theme"]) {
|
||||||
|
$phpgw->preferences->change("common","theme","default");
|
||||||
|
$preferences_update = True;
|
||||||
|
}
|
||||||
|
if (!isset($phpgw_info["user"]["preferences"]["common"]["dateformat"]) || !$phpgw_info["user"]["preferences"]["common"]["dateformat"]) {
|
||||||
|
$phpgw->preferences->change("common","dateformat","m/d/Y");
|
||||||
|
$preferences_update = True;
|
||||||
|
}
|
||||||
|
if (!isset($phpgw_info["user"]["preferences"]["common"]["timeformat"]) || !$phpgw_info["user"]["preferences"]["common"]["timeformat"]) {
|
||||||
|
$phpgw->preferences->change("common","timeformat",12);
|
||||||
|
$preferences_update = True;
|
||||||
|
}
|
||||||
|
if (!isset($phpgw_info["user"]["preferences"]["common"]["lang"]) || !$phpgw_info["user"]["preferences"]["common"]["lang"]) {
|
||||||
|
$phpgw->preferences->change("common","lang","en");
|
||||||
|
$preferences_update = True;
|
||||||
|
}
|
||||||
|
if ($preferences_update) {
|
||||||
|
$phpgw->preferences->commit(__LINE__,__FILE__);
|
||||||
|
}
|
||||||
|
unset($preferences_update);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************\
|
||||||
|
* These lines load up the themes *
|
||||||
|
\**************************************************************************/
|
||||||
|
include($phpgw_info["server"]["server_root"] . "/themes/" .
|
||||||
|
$phpgw_info["user"]["preferences"]["common"]["theme"] . ".theme");
|
||||||
|
|
||||||
|
if ($phpgw_info["theme"]["bg_color"] == "") {
|
||||||
|
/* Looks like there was a problem finding that theme. Try the default */
|
||||||
|
echo "Warning: error locating selected theme";
|
||||||
|
include ($phpgw_info["server"]["server_root"] . "/themes/default.theme");
|
||||||
|
if ($phpgw_info["theme"]["bg_color"] == "") {
|
||||||
|
// Hope we don't get to this point. Better then the user seeing a
|
||||||
|
// complety back screen and not know whats going on
|
||||||
|
echo "<body bgcolor=FFFFFF>Fatal error: no themes found";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************\
|
||||||
|
* If they are using frames, we need to set some variables *
|
||||||
|
\**************************************************************************/
|
||||||
|
if (($phpgw_info["user"]["preferences"]["common"]["useframes"] && $phpgw_info["server"]["useframes"] == "allowed")
|
||||||
|
|| ($phpgw_info["server"]["useframes"] == "always")) {
|
||||||
|
$phpgw_info["flags"]["navbar_target"] = "phpgw_body";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************\
|
||||||
|
* Verify that the users session is still active otherwise kick them out *
|
||||||
|
\**************************************************************************/
|
||||||
|
if ($phpgw_info["flags"]["currentapp"] != "home" && $phpgw_info["flags"]["currentapp"] != "logout"
|
||||||
|
&& $phpgw_info["flags"]["currentapp"] != "preferences") {
|
||||||
|
|
||||||
|
if (! $phpgw_info["user"]["apps"][$phpgw_info["flags"]["currentapp"]]) {
|
||||||
|
$phpgw->common->phpgw_header();
|
||||||
|
echo "<p><center><b>" . lang("Access not permitted") . "</b></center>";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************\
|
||||||
|
* Load the header unless the developer turns it off *
|
||||||
|
\**************************************************************************/
|
||||||
|
if (!isset($phpgw_info["flags"]["noheader"]) || ! $phpgw_info["flags"]["noheader"]) {
|
||||||
|
$phpgw->common->phpgw_header();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************\
|
||||||
|
* Load the app include files if the exists *
|
||||||
|
\**************************************************************************/
|
||||||
|
/* Then the include file */
|
||||||
|
if (file_exists ($phpgw_info["server"]["app_inc"]."/functions.inc.php")){
|
||||||
|
include($phpgw_info["server"]["app_inc"]."/functions.inc.php");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
error_reporting(7);
|
310
phpgwapi/phpgw_accounts_ldap.inc.php
Normal file
310
phpgwapi/phpgw_accounts_ldap.inc.php
Normal file
@ -0,0 +1,310 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
class accounts_
|
||||||
|
{
|
||||||
|
var $groups;
|
||||||
|
var $group_names;
|
||||||
|
var $apps;
|
||||||
|
|
||||||
|
function phpgw_fillarray()
|
||||||
|
{
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
|
||||||
|
// get a ldap connection handle
|
||||||
|
$ds = $phpgw->common->ldapConnect();
|
||||||
|
|
||||||
|
// search the dn for the given uid
|
||||||
|
$sri = ldap_search($ds, $phpgw_info["server"]["ldap_context"], "uid=".$phpgw_info["user"]["userid"]);
|
||||||
|
$allValues = ldap_get_entries($ds, $sri);
|
||||||
|
|
||||||
|
/* Now dump it into the array; take first entry found */
|
||||||
|
$phpgw_info["user"]["account_id"] = $allValues[0]["uidnumber"][0];
|
||||||
|
$phpgw_info["user"]["account_dn"] = $allValues[0]["dn"];
|
||||||
|
$phpgw_info["user"]["account_lid"] = $allValues[0]["uid"][0];
|
||||||
|
$phpgw_info["user"]["firstname"] = $allValues[0]["givenname"][0];
|
||||||
|
$phpgw_info["user"]["lastname"] = $allValues[0]["sn"][0];
|
||||||
|
$phpgw_info["user"]["fullname"] = $allValues[0]["cn"][0];
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Please don't remove this code. Lars Kneschke
|
||||||
|
// remove the "count" value
|
||||||
|
for ($i=0; $i < $allValues[0]["phpgw_groups"]["count"]; $i++)
|
||||||
|
{
|
||||||
|
$phpgw_info["user"]["groups"][] = $allValues[0]["phpgw_groups"][$i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove the "count" value
|
||||||
|
for ($i=0; $i < $allValues[0]["phpgw_account_perms"]["count"]; $i++)
|
||||||
|
{
|
||||||
|
$phpgw_info["user"]["app_perms"][] = $allValues[0]["phpgw_account_perms"][$i];
|
||||||
|
}
|
||||||
|
|
||||||
|
$phpgw_info["user"]["lastlogin"] = $allValues[0]["phpgw_lastlogin"][0];
|
||||||
|
$phpgw_info["user"]["lastloginfrom"] = $allValues[0]["phpgw_lastfrom"][0];
|
||||||
|
$phpgw_info["user"]["lastpasswd_change"] = $allValues[0]["phpgw_lastpasswd_change"][0];
|
||||||
|
$phpgw_info["user"]["status"] = $allValues[0]["phpgw_status"][0];
|
||||||
|
*/
|
||||||
|
$db = $phpgw->db;
|
||||||
|
$db->query("select * from accounts where account_lid='" . $phpgw_info["user"]["userid"] . "'",__LINE__,__FILE__);
|
||||||
|
$db->next_record();
|
||||||
|
|
||||||
|
$phpgw_info["user"]["groups"] = explode (",",$db->f("account_groups"));
|
||||||
|
$phpgw_info["user"]["app_perms"] = explode (":",$db->f("account_permissions"));
|
||||||
|
$phpgw_info["user"]["lastlogin"] = $db->f("account_lastlogin");
|
||||||
|
$phpgw_info["user"]["lastloginfrom"] = $db->f("account_lastloginfrom");
|
||||||
|
$phpgw_info["user"]["lastpasswd_change"] = $db->f("account_lastpwd_change");
|
||||||
|
$phpgw_info["user"]["status"] = $db->f("account_status");
|
||||||
|
}
|
||||||
|
|
||||||
|
function read_userData($dn)
|
||||||
|
{
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
|
||||||
|
// get a ldap connection handle
|
||||||
|
$ds = $phpgw->common->ldapConnect();
|
||||||
|
|
||||||
|
// search the dn for the given uid
|
||||||
|
$sri = ldap_read($ds,rawurldecode("$dn"),"objectclass=*");
|
||||||
|
$allValues = ldap_get_entries($ds, $sri);
|
||||||
|
|
||||||
|
/* Now dump it into the array; take first entry found */
|
||||||
|
$userData["account_id"] = $allValues[0]["uidnumber"][0];
|
||||||
|
$userData["account_dn"] = $allValues[0]["dn"];
|
||||||
|
$userData["account_lid"] = $allValues[0]["uid"][0];
|
||||||
|
$userData["firstname"] = $allValues[0]["givenname"][0];
|
||||||
|
$userData["lastname"] = $allValues[0]["sn"][0];
|
||||||
|
$userData["fullname"] = $allValues[0]["cn"][0];
|
||||||
|
|
||||||
|
/* // Please don't remove this code. Lars Kneschke
|
||||||
|
// remove the "count" value
|
||||||
|
for ($i=0; $i < $allValues[0]["phpgw_groups"]["count"]; $i++)
|
||||||
|
{
|
||||||
|
$userData["groups"][] = $allValues[0]["phpgw_groups"][$i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove the "count" value
|
||||||
|
for ($i=0; $i < $allValues[0]["phpgw_app_perms"]["count"]; $i++)
|
||||||
|
{
|
||||||
|
$userData["app_perms"][] = $allValues[0]["phpgw_account_perms"][$i];
|
||||||
|
}
|
||||||
|
|
||||||
|
$userData["lastlogin"] = $allValues[0]["phpgw_lastlogin"][0];
|
||||||
|
$userData["lastloginfrom"] = $allValues[0]["phpgw_lastfrom"][0];
|
||||||
|
$userData["lastpasswd_change"] = $allValues[0]["phpgw_lastpasswd_change"][0];
|
||||||
|
$userData["status"] = $allValues[0]["phpgw_status"][0];
|
||||||
|
*/
|
||||||
|
|
||||||
|
$db = $phpgw->db;
|
||||||
|
$db->query("select * from accounts where account_lid='" . $userData["account_lid"] . "'",__LINE__,__FILE__);
|
||||||
|
$db->next_record();
|
||||||
|
|
||||||
|
$userData["groups"] = explode (",",$db->f("account_groups"));
|
||||||
|
$userData["app_perms"] = explode (":",$db->f("account_permissions"));
|
||||||
|
$userData["lastlogin"] = $db->f("account_lastlogin");
|
||||||
|
$userData["lastloginfrom"] = $db->f("account_lastloginfrom");
|
||||||
|
$userData["lastpasswd_change"] = $db->f("account_lastpwd_change");
|
||||||
|
$userData["status"] = $db->f("account_status");
|
||||||
|
|
||||||
|
return $userData;
|
||||||
|
}
|
||||||
|
|
||||||
|
function read_groups($lid) {
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
$phpgw->db->query("select account_groups from accounts where account_lid='$lid'",__LINE__,__FILE__);
|
||||||
|
$phpgw->db->next_record();
|
||||||
|
|
||||||
|
$gl = explode(",",$phpgw->db->f("account_groups"));
|
||||||
|
for ($i=1; $i<(count($gl)-1); $i++) {
|
||||||
|
$ga = explode(":",$gl[$i]);
|
||||||
|
$groups[$ga[0]] = $ga[1];
|
||||||
|
}
|
||||||
|
return $groups;
|
||||||
|
}
|
||||||
|
|
||||||
|
function read_group_names($lid = "")
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
|
||||||
|
if (! $lid) {
|
||||||
|
$lid = $phpgw_info["user"]["userid"];
|
||||||
|
}
|
||||||
|
$groups = $this->read_groups($lid);
|
||||||
|
|
||||||
|
$i = 0;
|
||||||
|
while ($groups && $group = each($groups)) {
|
||||||
|
$phpgw->db->query("select group_name from groups where group_id=".$group[0],__LINE__,__FILE__);
|
||||||
|
$phpgw->db->next_record();
|
||||||
|
$group_names[$i][0] = $group[0];
|
||||||
|
$group_names[$i][1] = $phpgw->db->f("group_name");
|
||||||
|
$group_names[$i++][2] = $group[1];
|
||||||
|
}
|
||||||
|
if (! $lid)
|
||||||
|
$this->group_names = $group_names;
|
||||||
|
|
||||||
|
return $group_names;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* // This works a little odd, but it is required for apps to be listed in the correct order.
|
||||||
|
// We first take an array of apps in the correct order and give it a value of 1. Which local means false.
|
||||||
|
// After the app is verified, it is giving the value of 2, meaning true.
|
||||||
|
function read_apps($lid)
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
|
||||||
|
// fing enabled apps in this system
|
||||||
|
$phpgw->db->query("select app_name from applications where app_enabled != 0 order by app_order",__LINE__,__FILE__);
|
||||||
|
while ($phpgw->db->next_record()) {
|
||||||
|
$enabled_apps[$phpgw->db->f("app_name")] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get a ldap connection handle
|
||||||
|
$ds = $phpgw->common->ldapConnect();
|
||||||
|
|
||||||
|
// search the dn for the given uid
|
||||||
|
$sri = ldap_search($ds, $phpgw_info["server"]["ldap_context"], "uid=$lid");
|
||||||
|
$allValues = ldap_get_entries($ds, $sri);
|
||||||
|
|
||||||
|
for ($i=0; $i < $allValues[0]["phpgw_account_perms"]["count"]; $i++)
|
||||||
|
{
|
||||||
|
$pl = $allValues[0]["phpgw_account_perms"][$i];
|
||||||
|
if ($enabled_apps[$pl])
|
||||||
|
{
|
||||||
|
$enabled_apps[$pl] = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is to prevent things from being loaded twice
|
||||||
|
if ($phpgw_info["user"]["userid"] == $lid) {
|
||||||
|
$group_list = $this->groups;
|
||||||
|
} else {
|
||||||
|
$group_list = $this->read_groups($lid);
|
||||||
|
}
|
||||||
|
|
||||||
|
while ($group_list && $group = each($group_list)) {
|
||||||
|
$phpgw->db->query("select group_apps from groups where group_id=".$group[0]);
|
||||||
|
$phpgw->db->next_record();
|
||||||
|
|
||||||
|
$gp = explode(":",$phpgw->db->f("group_apps"));
|
||||||
|
for ($i=1,$j=0;$i<count($gp)-1;$i++,$j++) {
|
||||||
|
$enabled_apps[$gp[$i]] = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while ($sa = each($enabled_apps)) {
|
||||||
|
if ($sa[1] == 2) {
|
||||||
|
$return_apps[$sa[0]] = True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return_apps;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
// This works a little odd, but it is required for apps to be listed in the correct order.
|
||||||
|
// We first take an array of apps in the correct order and give it a value of 1. Which local means false.
|
||||||
|
// After the app is verified, it is giving the value of 2, meaning true.
|
||||||
|
function read_apps($lid)
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
|
||||||
|
$db2 = $phpgw->db;
|
||||||
|
|
||||||
|
$db2->query("select app_name,app_enabled from applications where app_enabled != 0 order by app_order",__LINE__,__FILE__);
|
||||||
|
while ($db2->next_record()) {
|
||||||
|
$enabled_apps[$db2->f("app_name")] = 1;
|
||||||
|
$app_status[$db2->f("app_name")] = $db2->f("app_status");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gettype($lid) == "integer") {
|
||||||
|
$db2->query("select account_permissions from accounts where account_id=$lid",__LINE__,__FILE__);
|
||||||
|
} else {
|
||||||
|
$db2->query("select account_permissions from accounts where account_lid='$lid'",__LINE__,__FILE__);
|
||||||
|
}
|
||||||
|
$db2->next_record();
|
||||||
|
|
||||||
|
$pl = explode(":",$db2->f("account_permissions"));
|
||||||
|
|
||||||
|
for ($i=0; $i<count($pl); $i++) {
|
||||||
|
if ($enabled_apps[$pl[$i]]) {
|
||||||
|
$enabled_apps[$pl[$i]] = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$group_list = $this->read_groups($lid);
|
||||||
|
|
||||||
|
while ($group_list && $group = each($group_list)) {
|
||||||
|
$db2->query("select group_apps from groups where group_id=".$group[0],__LINE__,__FILE__);
|
||||||
|
$db2->next_record();
|
||||||
|
|
||||||
|
$gp = explode(":",$db2->f("group_apps"));
|
||||||
|
for ($i=1,$j=0;$i<count($gp)-1;$i++,$j++) {
|
||||||
|
$enabled_apps[$gp[$i]] = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while ($sa = each($enabled_apps)) {
|
||||||
|
if ($sa[1] == 2) {
|
||||||
|
$return_apps[$sa[0]] = True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return_apps;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This will return the group permissions in an array
|
||||||
|
function read_group_apps($group_id)
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
|
||||||
|
$phpgw->db->query("select group_apps from groups where group_id=".$group_id,__LINE__,__FILE__);
|
||||||
|
$phpgw->db->next_record();
|
||||||
|
|
||||||
|
$gp = explode(":",$phpgw->db->f("group_apps"));
|
||||||
|
for ($i=1,$j=0;$i<count($gp)-1;$i++,$j++) {
|
||||||
|
$apps_array[$j] = $gp[$i];
|
||||||
|
}
|
||||||
|
return $apps_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: This needs to work off LDAP (jengo)
|
||||||
|
function listusers($groups="")
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
|
||||||
|
if ($groups) {
|
||||||
|
$phpgw->db->query("select account_lid,account_firstname,account_lastname from accounts where account_groups"
|
||||||
|
. "like '%,$groups,%'",__LINE__,__FILE__);
|
||||||
|
} else {
|
||||||
|
$phpgw->db->query("select account_lid,account_firstname,account_lastname from accounts",__LINE__,__FILE__);
|
||||||
|
}
|
||||||
|
$i = 0;
|
||||||
|
while ($phpgw->db->next_record()) {
|
||||||
|
$accounts["account_lid"][$i] = $phpgw->db->f("account_lid");
|
||||||
|
$accounts["account_firstname"][$i] = $phpgw->db->f("account_firstname");
|
||||||
|
$accounts["account_lastname"][$i] = $phpgw->db->f("account_lastname");
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
return $accounts;
|
||||||
|
}
|
||||||
|
|
||||||
|
function accounts_const()
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
|
||||||
|
$this->groups = $this->read_groups($phpgw_info["user"]["userid"]);
|
||||||
|
$this->apps = $this->read_apps($phpgw_info["user"]["userid"]);
|
||||||
|
|
||||||
|
$phpgw_info["user"]["apps"] = $this->apps;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
289
phpgwapi/phpgw_accounts_shared.inc.php
Normal file
289
phpgwapi/phpgw_accounts_shared.inc.php
Normal file
@ -0,0 +1,289 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
class accounts extends accounts_
|
||||||
|
{
|
||||||
|
|
||||||
|
// use this if you make any changes to phpgw_info, including preferences, config table changes, etc
|
||||||
|
function sync($line="",$file="")
|
||||||
|
{
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
$db = $phpgw->db;
|
||||||
|
|
||||||
|
//echo "<br>sync called<br>Line: $line<br>File:$file";
|
||||||
|
|
||||||
|
/* ********This sets the server variables from the database******** */
|
||||||
|
$db->query("select * from config",__LINE__,__FILE__);
|
||||||
|
while($db->next_record()) {
|
||||||
|
$phpgw_info["server"][$db->f("config_name")] = $db->f("config_value");
|
||||||
|
}
|
||||||
|
$phpgw->accounts->accounts_const(__LINE__,__FILE__);
|
||||||
|
|
||||||
|
$phpgw_info_temp["user"] = $phpgw_info["user"];
|
||||||
|
$phpgw_info_temp["apps"] = $phpgw_info["apps"];
|
||||||
|
$phpgw_info_temp["server"] = $phpgw_info["server"];
|
||||||
|
$phpgw_info_temp["hooks"] = $phpgw->hooks->read();
|
||||||
|
$phpgw_info_temp["user"]["kp3"] = ""; // We don't want it anywhere in the
|
||||||
|
// database for security.
|
||||||
|
|
||||||
|
$db->query("update phpgw_sessions set session_info='" . serialize($phpgw_info_temp)
|
||||||
|
. "' where session_id='" . $phpgw_info["user"]["sessionid"] . "'",__LINE__,__FILE__);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function add_app($appname,$rebuild = False)
|
||||||
|
{
|
||||||
|
if (! $rebuild) {
|
||||||
|
if (gettype($appname) == "array") {
|
||||||
|
$t .= ":";
|
||||||
|
$t .= implode(":",$appname);
|
||||||
|
$this->temp_app_list .= $t;
|
||||||
|
} else {
|
||||||
|
$this->temp_app_list .= ":" . $appname;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$t = $this->temp_app_list . ":";
|
||||||
|
unset($this->temp_app_list);
|
||||||
|
return $t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sql_search($table,$owner=0)
|
||||||
|
{
|
||||||
|
global $phpgw_info;
|
||||||
|
global $phpgw;
|
||||||
|
$s = "";
|
||||||
|
// Changed By: Skeeter 29 Nov 00
|
||||||
|
// This is to allow the user to search for other individuals group info....
|
||||||
|
if(!$owner) {
|
||||||
|
$owner = $phpgw_info["user"]["account_id"];
|
||||||
|
}
|
||||||
|
$db = $phpgw->db;
|
||||||
|
$db->query("SELECT account_lid FROM accounts WHERE account_id=".$owner,__LINE__,__FILE__);
|
||||||
|
$db->next_record();
|
||||||
|
$groups = $this->read_groups($db->f("account_lid"));
|
||||||
|
if (gettype($groups) == "array") {
|
||||||
|
// echo "\n\n\n\n\ntest: " . count($groups) . "\n\n\n\n\n\n";
|
||||||
|
while ($group = each($groups)) {
|
||||||
|
$s .= " or $table like '%," . $group[0] . ",%'";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is used to split the arrays in the access column into an array
|
||||||
|
function string_to_array($s)
|
||||||
|
{
|
||||||
|
$raw_array = explode(",",$s);
|
||||||
|
|
||||||
|
for ($i=1,$j=0;$i<count($raw_array)-1; $i++,$j++) {
|
||||||
|
$return_array[$j] = $raw_array[$i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// This is used to convert a raw group string (,5,6,7,) into a string of
|
||||||
|
// there names.
|
||||||
|
// Example: accounting, billing, developers
|
||||||
|
function convert_string_to_names($gs)
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
|
||||||
|
$groups = explode(",",$gs);
|
||||||
|
|
||||||
|
$s = "";
|
||||||
|
for ($i=1;$i<count($groups)-1; $i++) {
|
||||||
|
$group_number = explode(",",$groups[$i]);
|
||||||
|
//$phpgw->db->query("select group_name from groups where group_id=".$groups[$i]);
|
||||||
|
$phpgw->db->query("select group_name from groups where group_id=".$group_number[0],__LINE__,__FILE__);
|
||||||
|
$phpgw->db->next_record();
|
||||||
|
$s .= $phpgw->db->f("group_name");
|
||||||
|
if (count($groups) != 0 && $i != count($groups)-2)
|
||||||
|
$s .= ",";
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This one is used for the access column
|
||||||
|
// This is used to convert a raw group string (,5,6,7,) into a string of
|
||||||
|
// there names.
|
||||||
|
// Example: accounting, billing, developers
|
||||||
|
function convert_string_to_names_access($gs)
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
|
||||||
|
$groups = explode(",",$gs);
|
||||||
|
|
||||||
|
$db2 = $phpgw->db;
|
||||||
|
|
||||||
|
$s = ""; $i = 0;
|
||||||
|
for ($j=1;$j<count($groups)-1; $j++) {
|
||||||
|
$db2->query("select group_name from groups where group_id=".$groups[$j],__LINE__,__FILE__);
|
||||||
|
$db2->next_record();
|
||||||
|
$group_names[$i] = $db2->f("group_name");
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
return implode(",",$group_names);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert an array into the format needed for the groups column in the accounts table.
|
||||||
|
// This function is only temp, until we create the wrapper class's for different forms
|
||||||
|
// of auth.
|
||||||
|
function groups_array_to_string($groups)
|
||||||
|
{
|
||||||
|
$s = "";
|
||||||
|
if (count($groups)) {
|
||||||
|
while (list($t,$group,$level) = each($groups)) {
|
||||||
|
$s .= "," . $group . ":0";
|
||||||
|
}
|
||||||
|
$s .= ",";
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert an array into the format needed for the access column.
|
||||||
|
function array_to_string($access,$array)
|
||||||
|
{
|
||||||
|
$s = "";
|
||||||
|
if ($access == "group" || $access == "public" || $access == "none") {
|
||||||
|
if (count($array)) {
|
||||||
|
while ($t = each($array)) {
|
||||||
|
$s .= "," . $t[1];
|
||||||
|
}
|
||||||
|
$s .= ",";
|
||||||
|
}
|
||||||
|
if (! count($array) && $access == "none") {
|
||||||
|
$s = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class preferences
|
||||||
|
{
|
||||||
|
|
||||||
|
function read_preferences()
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
|
||||||
|
$phpgw->db->query("select preference_value from preferences where preference_owner='"
|
||||||
|
. $phpgw_info["user"]["account_id"] . "'",__LINE__,__FILE__);
|
||||||
|
$phpgw->db->next_record();
|
||||||
|
$phpgw_info["user"]["preferences"] = unserialize($phpgw->db->f("preference_value"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// This should be called when you are doing changing the $phpgw_info["user"]["preferences"]
|
||||||
|
// array
|
||||||
|
function commit($line = "",$file = "")
|
||||||
|
{
|
||||||
|
//echo "<br>commit called<br>Line: $line<br>File: $file";
|
||||||
|
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
$db = $phpgw->db;
|
||||||
|
|
||||||
|
$db->query("delete from preferences where preference_owner='" . $phpgw_info["user"]["account_id"]
|
||||||
|
. "'",__LINE__,__FILE__);
|
||||||
|
|
||||||
|
$db->query("insert into preferences (preference_owner,preference_value) values ('"
|
||||||
|
. $phpgw_info["user"]["account_id"] . "','" . serialize($phpgw_info["user"]["preferences"])
|
||||||
|
. "')",__LINE__,__FILE__);
|
||||||
|
$phpgw->accounts->sync(__LINE__,__FILE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a new preference.
|
||||||
|
function change($app_name,$var,$value = "")
|
||||||
|
{
|
||||||
|
global $phpgw_info;
|
||||||
|
|
||||||
|
if (! $value) {
|
||||||
|
global $$var;
|
||||||
|
$value = $$var;
|
||||||
|
}
|
||||||
|
|
||||||
|
$phpgw_info["user"]["preferences"][$app_name][$var] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
function delete($app_name,$var)
|
||||||
|
{
|
||||||
|
global $phpgw_info;
|
||||||
|
unset($phpgw_info["user"]["preferences"][$app_name][$var]);
|
||||||
|
|
||||||
|
}
|
||||||
|
} //end of preferences class
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class acl
|
||||||
|
{
|
||||||
|
/* This is a new class. These are sample table entries
|
||||||
|
insert into phpgw_acl (acl_appname, acl_location, acl_account, acl_account_type, acl_rights)
|
||||||
|
values('filemanager', 'create', 1, 'u', 4);
|
||||||
|
insert into phpgw_acl (acl_appname, acl_location, acl_account, acl_account_type, acl_rights)
|
||||||
|
values('filemanager', 'create', 1, 'g', 2);
|
||||||
|
insert into phpgw_acl (acl_appname, acl_location, acl_account, acl_account_type, acl_rights)
|
||||||
|
values('filemanager', 'create', 2, 'u', 1);
|
||||||
|
insert into phpgw_acl (acl_appname, acl_location, acl_account, acl_account_type, acl_rights)
|
||||||
|
values('filemanager', 'create', 2, 'g', 2);
|
||||||
|
*/
|
||||||
|
|
||||||
|
function check($location, $required, $appname = False){
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
if ($appname == False){
|
||||||
|
$appname = $phpgw_info["flags"]["currentapp"];
|
||||||
|
}
|
||||||
|
// User piece
|
||||||
|
$sql = "select acl_rights from phpgw_acl where acl_appname='$appname'";
|
||||||
|
$sql .= " and (acl_location in ('$location','everywhere')) and ";
|
||||||
|
$sql .= "((acl_account_type = 'u' and acl_account = ".$phpgw_info["user"]["account_id"].")";
|
||||||
|
|
||||||
|
// Group piece
|
||||||
|
$sql .= " or (acl_account_type='g' and acl_account in (0"; // group 0 covers all users
|
||||||
|
$memberships = $phpgw->accounts->read_group_names();
|
||||||
|
if (is_array($memberships) && count($memberships) > 0){
|
||||||
|
for ($idx = 0; $idx < count($memberships); ++$idx){
|
||||||
|
$sql .= ",".$memberships[$idx][0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$sql .= ")))";
|
||||||
|
$rights = 0;
|
||||||
|
$phpgw->db->query($sql ,__LINE__,__FILE__);
|
||||||
|
if ($phpgw->db->num_rows() == 0 && $phpgw_info["server"]["acl_default"] != "deny"){ return True; }
|
||||||
|
while ($phpgw->db->next_record()) {
|
||||||
|
if ($phpgw->db->f("acl_rights") == 0){ return False; }
|
||||||
|
$rights |= $phpgw->db->f("acl_rights");
|
||||||
|
}
|
||||||
|
return !!($rights & $required);
|
||||||
|
}
|
||||||
|
|
||||||
|
function add($app, $location, $id, $id_type, $rights){
|
||||||
|
}
|
||||||
|
|
||||||
|
function edit($app, $location, $id, $id_type, $rights){
|
||||||
|
}
|
||||||
|
|
||||||
|
function replace($app, $location, $id, $id_type, $rights){
|
||||||
|
}
|
||||||
|
|
||||||
|
function delete($app, $location, $id, $id_type){
|
||||||
|
}
|
||||||
|
|
||||||
|
function view($app, $location, $id, $id_type){
|
||||||
|
}
|
||||||
|
|
||||||
|
} //end of acl class
|
||||||
|
?>
|
228
phpgwapi/phpgw_accounts_sql.inc.php
Normal file
228
phpgwapi/phpgw_accounts_sql.inc.php
Normal file
@ -0,0 +1,228 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
class accounts_
|
||||||
|
{
|
||||||
|
var $groups;
|
||||||
|
var $group_names;
|
||||||
|
var $apps;
|
||||||
|
|
||||||
|
function phpgw_fillarray()
|
||||||
|
{
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
|
||||||
|
$db2 = $phpgw->db;
|
||||||
|
|
||||||
|
$db2->query("select * from accounts where account_lid='" . $phpgw_info["user"]["userid"] . "'",__LINE__,__FILE__);
|
||||||
|
$db2->next_record();
|
||||||
|
|
||||||
|
/* Now dump it into the array */
|
||||||
|
$phpgw_info["user"]["account_id"] = $db2->f("account_id");
|
||||||
|
$phpgw_info["user"]["firstname"] = $db2->f("account_firstname");
|
||||||
|
$phpgw_info["user"]["lastname"] = $db2->f("account_lastname");
|
||||||
|
$phpgw_info["user"]["fullname"] = $db2->f("account_firstname") . " "
|
||||||
|
. $db2->f("account_lastname");
|
||||||
|
$phpgw_info["user"]["groups"] = explode (",", $db2->f("account_groups"));
|
||||||
|
$phpgw_info["user"]["app_perms"] = explode (":", $db2->f("account_permissions"));
|
||||||
|
$phpgw_info["user"]["lastlogin"] = $db2->f("account_lastlogin");
|
||||||
|
$phpgw_info["user"]["lastloginfrom"] = $db2->f("account_lastloginfrom");
|
||||||
|
$phpgw_info["user"]["lastpasswd_change"] = $db2->f("account_lastpwd_change");
|
||||||
|
$phpgw_info["user"]["status"] = $db2->f("account_status");
|
||||||
|
}
|
||||||
|
|
||||||
|
function read_userData($id)
|
||||||
|
{
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
|
||||||
|
$db2 = $phpgw->db;
|
||||||
|
|
||||||
|
$db2->query("select * from accounts where account_id='$id'",__LINE__,__FILE__);
|
||||||
|
$db2->next_record();
|
||||||
|
|
||||||
|
/* Now dump it into the array */
|
||||||
|
$userData["account_id"] = $db2->f("account_id");
|
||||||
|
$userData["account_lid"] = $db2->f("account_lid");
|
||||||
|
$userData["firstname"] = $db2->f("account_firstname");
|
||||||
|
$userData["lastname"] = $db2->f("account_lastname");
|
||||||
|
$userData["fullname"] = $db2->f("account_firstname") . " "
|
||||||
|
. $db2->f("account_lastname");
|
||||||
|
$userData["groups"] = explode(",", $db2->f("account_groups"));
|
||||||
|
$userData["app_perms"] = explode(":", $db2->f("account_permissions"));
|
||||||
|
$userData["lastlogin"] = $db2->f("account_lastlogin");
|
||||||
|
$userData["lastloginfrom"] = $db2->f("account_lastloginfrom");
|
||||||
|
$userData["lastpasswd_change"] = $db2->f("account_lastpwd_change");
|
||||||
|
$userData["status"] = $db2->f("account_status");
|
||||||
|
|
||||||
|
return $userData;
|
||||||
|
}
|
||||||
|
|
||||||
|
function read_groups($lid)
|
||||||
|
{
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
|
||||||
|
$db2 = $phpgw->db;
|
||||||
|
|
||||||
|
if ($phpgw_info["user"]["userid"] != $lid) {
|
||||||
|
$db2->query("select account_groups from accounts where account_lid='$lid'",__LINE__,__FILE__);
|
||||||
|
$db2->next_record();
|
||||||
|
$gl = explode(",",$db2->f("account_groups"));
|
||||||
|
} else {
|
||||||
|
$gl = $phpgw_info["user"]["groups"];
|
||||||
|
}
|
||||||
|
|
||||||
|
for ($i=1; $i<(count($gl)-1); $i++) {
|
||||||
|
$ga = explode(":",$gl[$i]);
|
||||||
|
$groups[$ga[0]] = $ga[1];
|
||||||
|
}
|
||||||
|
return $groups;
|
||||||
|
}
|
||||||
|
|
||||||
|
function read_group_names($lid = "")
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
|
||||||
|
$db2 = $phpgw->db;
|
||||||
|
|
||||||
|
if (! $lid) {
|
||||||
|
$lid = $phpgw_info["user"]["userid"];
|
||||||
|
}
|
||||||
|
$groups = $this->read_groups($lid);
|
||||||
|
|
||||||
|
$i = 0;
|
||||||
|
while ($groups && $group = each($groups)) {
|
||||||
|
$db2->query("select group_name from groups where group_id=".$group[0],__LINE__,__FILE__);
|
||||||
|
$db2->next_record();
|
||||||
|
$group_names[$i][0] = $group[0];
|
||||||
|
$group_names[$i][1] = $db2->f("group_name");
|
||||||
|
$group_names[$i++][2] = $group[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $lid) {
|
||||||
|
$this->group_names = $group_names;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $group_names;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This works a little odd, but it is required for apps to be listed in the correct order.
|
||||||
|
// We first take an array of apps in the correct order and give it a value of 1. Which local means false.
|
||||||
|
// After the app is verified, it is giving the value of 2, meaning true.
|
||||||
|
function read_apps($lid)
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
|
||||||
|
$db2 = $phpgw->db;
|
||||||
|
|
||||||
|
$db2->query("select * from applications where app_enabled != '0'",__LINE__,__FILE__);
|
||||||
|
while ($db2->next_record()) {
|
||||||
|
$name = $db2->f("app_name");
|
||||||
|
$title = $db2->f("app_title");
|
||||||
|
$status = $db2->f("app_enabled");
|
||||||
|
$phpgw_info["apps"][$name] = array("title" => $title, "enabled" => True, "status" => $status);
|
||||||
|
|
||||||
|
$enabled_apps[$db2->f("app_name")] = 1;
|
||||||
|
$app_status[$db2->f("app_name")] = $db2->f("app_status");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gettype($lid) == "integer") {
|
||||||
|
$db2->query("select account_permissions from accounts where account_id=$lid",__LINE__,__FILE__);
|
||||||
|
} else {
|
||||||
|
$db2->query("select account_permissions from accounts where account_lid='$lid'",__LINE__,__FILE__);
|
||||||
|
}
|
||||||
|
$db2->next_record();
|
||||||
|
|
||||||
|
$pl = explode(":",$db2->f("account_permissions"));
|
||||||
|
|
||||||
|
for ($i=0; $i<count($pl); $i++) {
|
||||||
|
if ($enabled_apps[$pl[$i]]) {
|
||||||
|
$enabled_apps[$pl[$i]] = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$group_list = $this->read_groups($lid);
|
||||||
|
|
||||||
|
while ($group_list && $group = each($group_list)) {
|
||||||
|
$db2->query("select group_apps from groups where group_id=".$group[0],__LINE__,__FILE__);
|
||||||
|
$db2->next_record();
|
||||||
|
|
||||||
|
$gp = explode(":",$db2->f("group_apps"));
|
||||||
|
for ($i=1,$j=0;$i<count($gp)-1;$i++,$j++) {
|
||||||
|
$enabled_apps[$gp[$i]] = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while ($sa = each($enabled_apps)) {
|
||||||
|
if ($sa[1] == 2) {
|
||||||
|
$return_apps[$sa[0]] = True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return_apps;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This will return the group permissions in an array
|
||||||
|
function read_group_apps($group_id)
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
|
||||||
|
$db2 = $phpgw->db;
|
||||||
|
|
||||||
|
$db2->query("select group_apps from groups where group_id=".$group_id,__LINE__,__FILE__);
|
||||||
|
$db2->next_record();
|
||||||
|
|
||||||
|
$gp = explode(":",$db2->f("group_apps"));
|
||||||
|
for ($i=1,$j=0;$i<count($gp)-1;$i++,$j++) {
|
||||||
|
$apps_array[$j] = $gp[$i];
|
||||||
|
}
|
||||||
|
return $apps_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function listusers($groups="")
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
|
||||||
|
$db2 = $phpgw->db;
|
||||||
|
|
||||||
|
if ($groups) {
|
||||||
|
$db2->query("select account_lid,account_firstname,account_lastname from accounts where account_groups"
|
||||||
|
. "like '%,$groups,%'",__LINE__,__FILE__);
|
||||||
|
} else {
|
||||||
|
$db2->query("select account_lid,account_firstname,account_lastname from accounts",__LINE__,__FILE__);
|
||||||
|
}
|
||||||
|
$i = 0;
|
||||||
|
while ($db2->next_record()) {
|
||||||
|
$accounts["account_lid"][$i] = $db2->f("account_lid");
|
||||||
|
$accounts["account_firstname"][$i] = $db2->f("account_firstname");
|
||||||
|
$accounts["account_lastname"][$i] = $db2->f("account_lastname");
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
return $accounts;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function accounts_const($line,$file)
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
|
||||||
|
//echo "accounts_const called<br>line: $line<br>$file";
|
||||||
|
|
||||||
|
$phpgw->accounts->phpgw_fillarray();
|
||||||
|
$phpgw->preferences->read_preferences();
|
||||||
|
$this->groups = $this->read_groups($phpgw_info["user"]["userid"]);
|
||||||
|
$this->apps = $this->read_apps($phpgw_info["user"]["userid"]);
|
||||||
|
|
||||||
|
$phpgw_info["user"]["apps"] = $this->apps;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
16
phpgwapi/phpgw_addressbook.inc.php
Normal file
16
phpgwapi/phpgw_addressbook.inc.php
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
class addressbook
|
||||||
|
{
|
||||||
|
}
|
27
phpgwapi/phpgw_auth_http.inc.php
Normal file
27
phpgwapi/phpgw_auth_http.inc.php
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $ Id $ */
|
||||||
|
|
||||||
|
class auth
|
||||||
|
{
|
||||||
|
|
||||||
|
function authenticate($username, $passwd) {
|
||||||
|
global $phpgw_info, $phpgw, $PHP_AUTH_USER;
|
||||||
|
|
||||||
|
if (isset($PHP_AUTH_USER)) {
|
||||||
|
return True;
|
||||||
|
} else {
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
47
phpgwapi/phpgw_auth_ldap.inc.php
Normal file
47
phpgwapi/phpgw_auth_ldap.inc.php
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id $ */
|
||||||
|
|
||||||
|
class auth
|
||||||
|
{
|
||||||
|
|
||||||
|
function authenticate($username, $passwd) {
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
// error_reporting MUST be set to zero, otherwise you'll get nasty LDAP errors with a bad login/pass...
|
||||||
|
// these are just "warnings" and can be ignored.....
|
||||||
|
error_reporting(0);
|
||||||
|
|
||||||
|
$ldap = ldap_connect($phpgw_info["server"]["ldap_host"]);
|
||||||
|
|
||||||
|
// find the dn for this uid, the uid is not always in the dn
|
||||||
|
$sri = ldap_search($ldap, $phpgw_info["server"]["ldap_context"], "uid=$username");
|
||||||
|
$allValues = ldap_get_entries($ldap, $sri);
|
||||||
|
if($allValues["count"] > 0)
|
||||||
|
{
|
||||||
|
// we only care about the first dn
|
||||||
|
$userDN = $allValues[0]["dn"];
|
||||||
|
|
||||||
|
// generate a bogus password to pass if the user doesn't give us one
|
||||||
|
// this gets around systems that are anonymous search enabled
|
||||||
|
if (empty($passwd)) $passwd = crypt(microtime());
|
||||||
|
// try to bind as the user with user suplied password
|
||||||
|
if (ldap_bind($ldap,$userDN, $passwd)) return True;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Turn error reporting back to normal
|
||||||
|
error_reporting(7);
|
||||||
|
|
||||||
|
// dn not found or password wrong
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
43
phpgwapi/phpgw_auth_mail.inc.php
Normal file
43
phpgwapi/phpgw_auth_mail.inc.php
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id $ */
|
||||||
|
|
||||||
|
class auth
|
||||||
|
{
|
||||||
|
|
||||||
|
function authenticate($username, $passwd) {
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
error_reporting(error_reporting() - 2);
|
||||||
|
|
||||||
|
|
||||||
|
if ($phpgw_info["server"]["mail_login_type"] == "vmailmgr") {
|
||||||
|
$username = $username . "@" . $phpgw_info[server][mail_suffix];
|
||||||
|
}
|
||||||
|
if ($phpgw_info["server"]["mail_server_type"]=="imap") {
|
||||||
|
$phpgw_info["server"]["mail_port"] = "143";
|
||||||
|
} elseif ($phpgw_info["server"]["mail_server_type"]=="pop3") {
|
||||||
|
$phpgw_info["server"]["mail_port"] = "110";
|
||||||
|
}
|
||||||
|
|
||||||
|
$mailauth = imap_open("{".$phpgw_info["server"]["mail_server"]
|
||||||
|
.":".$phpgw_info["server"]["mail_port"]."}INBOX", $username , $passwd);
|
||||||
|
|
||||||
|
error_reporting(error_reporting() + 2);
|
||||||
|
if ($mailauth == False) {
|
||||||
|
return False;
|
||||||
|
} else {
|
||||||
|
imap_close($mailauth);
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
39
phpgwapi/phpgw_auth_sql.inc.php
Normal file
39
phpgwapi/phpgw_auth_sql.inc.php
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $ Id $ */
|
||||||
|
|
||||||
|
class auth
|
||||||
|
{
|
||||||
|
|
||||||
|
function authenticate($username, $passwd) {
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
|
||||||
|
$db = $phpgw->db;
|
||||||
|
|
||||||
|
$local_debug = false;
|
||||||
|
|
||||||
|
if ($local_debug) {
|
||||||
|
echo "<b>Debug SQL: uid - $username passwd - $passwd</b>";
|
||||||
|
}
|
||||||
|
|
||||||
|
$db->query("SELECT * FROM accounts WHERE account_lid = '$username' AND "
|
||||||
|
. "account_pwd='" . md5($passwd) . "' AND account_status ='A'",__LINE__,__FILE__);
|
||||||
|
$db->next_record();
|
||||||
|
|
||||||
|
if ($db->f("account_lid")) {
|
||||||
|
return True;
|
||||||
|
} else {
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
1483
phpgwapi/phpgw_calendar.inc.php
Normal file
1483
phpgwapi/phpgw_calendar.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
95
phpgwapi/phpgw_categories.inc.php
Normal file
95
phpgwapi/phpgw_categories.inc.php
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare - API (categories) *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
class categories
|
||||||
|
{
|
||||||
|
function read($format = "", $app_name = "", $owner = "", $cat_id = "")
|
||||||
|
{
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
$db2 = $phpgw->db;
|
||||||
|
|
||||||
|
if (! isset($owner)) {
|
||||||
|
$owner = $phpgw_info["user"]["account_id"];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! isset($format)) {
|
||||||
|
$format = "array";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($format == "single") {
|
||||||
|
$db2->query("select * from categories where cat_id='$cat_id' and account_id='$owner' "
|
||||||
|
. "and app_name='" . addslashes($app_name) . "'");
|
||||||
|
$db2->next_record();
|
||||||
|
|
||||||
|
$cat_info[]["id"] = $db2->f("cat_id");
|
||||||
|
$cat_info[]["name"] = $db2->f("cat_name");
|
||||||
|
$cat_info[]["descrption"] = $db2->f("cat_descrption");
|
||||||
|
return $cat_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $app_name) {
|
||||||
|
$app_name = $phpgw_info["flags"]["currentapp"];
|
||||||
|
}
|
||||||
|
if (! $account_id) {
|
||||||
|
$owner = $phpgw_info["user"]["account_id"];
|
||||||
|
}
|
||||||
|
|
||||||
|
$db2->query("select cat_id,cat_name,cat_description from categories where app_name='$app_name' "
|
||||||
|
. "and account_id='$owner'");
|
||||||
|
$i = 0;
|
||||||
|
while ($db2->next_record()) {
|
||||||
|
if ($format == "array") {
|
||||||
|
$cat_list[$i]["cat_id"] = $db2->f("cat_id");
|
||||||
|
$cat_list[$i]["cat_name"] = $db2->f("cat_name");
|
||||||
|
$cat_list[$i]["cat_description"] = $db2->f("cat_description");
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
if ($format == "select") {
|
||||||
|
$cat_list .= '<option value="' . $db2->f("cat_id") . '">' . $db2->f("cat_name")
|
||||||
|
. '</option>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $cat_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
function add($owner,$app_name,$cat_name,$cat_description = "")
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
$db2 = $phpgw->db;
|
||||||
|
|
||||||
|
$db2->query("insert into categories (account_id,app_name,cat_name,cat_description) values ('"
|
||||||
|
. "$owner','" . addslashes($app_name) . "','" . addslashes($cat_name) . "','"
|
||||||
|
. addslashes($cat_description) . "')");
|
||||||
|
}
|
||||||
|
|
||||||
|
function delete($owner,$app_name,$cat_name)
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
$db2 = $phpgw->db;
|
||||||
|
|
||||||
|
$db2->query("delete from categories where account_id='$account_id' and app_name='"
|
||||||
|
. addslashes($app_name) . "' and cat_name='" . addslashes($cat_name) . "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
function edit($owner,$app_name,$cat_name,$cat_description)
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
$db2 = $phpgw->db;
|
||||||
|
|
||||||
|
$db2->query("update categories set cat_name='" . addslashes($cat_name) . "', cat_description='"
|
||||||
|
. addslashes($cat_description) . "' where account_id='$owner' and app_name='"
|
||||||
|
. addslashes($app_name) . "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
983
phpgwapi/phpgw_common.inc.php
Normal file
983
phpgwapi/phpgw_common.inc.php
Normal file
@ -0,0 +1,983 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
$d1 = strtolower(substr($phpgw_info["server"]["include_root"],0,3));
|
||||||
|
$d2 = strtolower(substr($phpgw_info["server"]["server_root"],0,3));
|
||||||
|
if($d1 == "htt" || $d1 == "ftp" || $d2 == "htt" || $d2 == "ftp") {
|
||||||
|
echo "Failed attempt to break in via an old Security Hole!<br>\n";
|
||||||
|
exit;
|
||||||
|
} unset($d1);unset($d2);
|
||||||
|
|
||||||
|
// Since LDAP will return system accounts, there are a few we don't want to login.
|
||||||
|
$phpgw_info["server"]["global_denied_users"] = array('root' => True,
|
||||||
|
'bin' => True,
|
||||||
|
'daemon' => True,
|
||||||
|
'adm' => True,
|
||||||
|
'lp' => True,
|
||||||
|
'sync' => True,
|
||||||
|
'shutdown' => True,
|
||||||
|
'halt' => True,
|
||||||
|
'mail' => True,
|
||||||
|
'news' => True,
|
||||||
|
'uucp' => True,
|
||||||
|
'operator' => True,
|
||||||
|
'games' => True,
|
||||||
|
'gopher' => True,
|
||||||
|
'nobody' => True,
|
||||||
|
'xfs' => True,
|
||||||
|
'pgsql' => True,
|
||||||
|
'mysql' => True,
|
||||||
|
'postgres' => True,
|
||||||
|
'ftp' => True,
|
||||||
|
'gdm' => True,
|
||||||
|
'named' => True);
|
||||||
|
|
||||||
|
// I had to create this has a wrapper, becuase the phpgw.inc.php files needs it before the classes
|
||||||
|
// are finished loading (jengo)
|
||||||
|
function filesystem_separator()
|
||||||
|
{
|
||||||
|
if (PHP_OS == "Windows" || PHP_OS == "OS/2") {
|
||||||
|
return "\\";
|
||||||
|
} else {
|
||||||
|
return "/";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class common
|
||||||
|
{
|
||||||
|
var $phpgw;
|
||||||
|
var $iv = "";
|
||||||
|
var $key = "";
|
||||||
|
var $crypto;
|
||||||
|
|
||||||
|
// connect to the ldap server and return a handle
|
||||||
|
function ldapConnect($host = "", $dn = "", $passwd = "")
|
||||||
|
{
|
||||||
|
global $phpgw_info;
|
||||||
|
|
||||||
|
if (! $host) {
|
||||||
|
$host = $phpgw_info["server"]["ldap_host"];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $dn) {
|
||||||
|
$dn = $phpgw_info["server"]["ldap_root_dn"];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $passwd) {
|
||||||
|
$passwd = $phpgw_info["server"]["ldap_root_passwd"];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// connect to ldap server
|
||||||
|
if (! $ds = ldap_connect($host)) {
|
||||||
|
printf("<b>Error: Can't connect to LDAP server %s!</b><br>",$host);
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
|
// bind as admin, we not to able to do everything
|
||||||
|
if (! ldap_bind($ds,$dn,$passwd)) {
|
||||||
|
printf("<b>Error: Can't bind to LDAP server: %s!</b><br>",$dn);
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ds;
|
||||||
|
}
|
||||||
|
|
||||||
|
function randomstring($size)
|
||||||
|
{
|
||||||
|
$s = "";
|
||||||
|
srand((double)microtime()*1000000);
|
||||||
|
$random_char = array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f",
|
||||||
|
"g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v",
|
||||||
|
"w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L",
|
||||||
|
"M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z");
|
||||||
|
|
||||||
|
for ($i=0; $i<$size; $i++) {
|
||||||
|
$s .= $random_char[rand(1,61)];
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look at the note towards the top of this file (jengo)
|
||||||
|
function filesystem_separator()
|
||||||
|
{
|
||||||
|
return filesystem_separator();
|
||||||
|
}
|
||||||
|
|
||||||
|
function error_list($error)
|
||||||
|
{
|
||||||
|
$html_error = '<table border="0" width="50%"><tr><td align="right"><b>' . lang("error") . '</b>: </td><td align="left">' . $error[0] . '</td></tr>';
|
||||||
|
|
||||||
|
for ($i=1; $i<count($error); $i++) {
|
||||||
|
$html_error .= '<tr><td> </td><td align="left">' . $error[$i] . '</td></tr>';
|
||||||
|
}
|
||||||
|
return $html_error . '</table>';
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_owner($record,$link,$label,$extravars = "")
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
|
||||||
|
$s = '<a href="' . $phpgw->link($link,$extravars) . '"> ' . lang($label) . ' </a>';
|
||||||
|
if (ereg("^[0-9]+$",$record)) {
|
||||||
|
if ($record != $phpgw_info["user"]["account_id"]) {
|
||||||
|
$s = " ";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($record != $phpgw_info["user"]["userid"]) {
|
||||||
|
$s = " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
function display_fullname($lid, $firstname, $lastname)
|
||||||
|
{
|
||||||
|
if (! $firstname && ! $lastname) {
|
||||||
|
$s = $lid;
|
||||||
|
}
|
||||||
|
if (! $firstname && $lastname) {
|
||||||
|
$s = $lastname;
|
||||||
|
}
|
||||||
|
if ($firstname && ! $lastname) {
|
||||||
|
$s = $firstname;
|
||||||
|
}
|
||||||
|
if ($firstname && $lastname) {
|
||||||
|
$s = "$lastname, $firstname";
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
function grab_owner_name($id)
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
$phpgw->db->query("select account_lid,account_firstname,account_lastname from accounts where account_id=".$id,__LINE__,__FILE__);
|
||||||
|
$phpgw->db->next_record();
|
||||||
|
|
||||||
|
return $phpgw->common->display_fullname($phpgw->db->f("account_lid"),$phpgw->db->f("account_firstname"),$phpgw->db->f("account_lastname"));
|
||||||
|
}
|
||||||
|
|
||||||
|
function create_tabs($tabs, $selected, $fontsize = "")
|
||||||
|
{
|
||||||
|
global $phpgw_info;
|
||||||
|
$output_text = '<table border="0" cellspacing="0" cellpadding="0"><tr>';
|
||||||
|
$ir = $phpgw_info["server"]["webserver_url"] . "/images";
|
||||||
|
|
||||||
|
if ($fontsize) {
|
||||||
|
$fs = '<font size="' . $fontsize . '">';
|
||||||
|
$fse = '</font>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$i = 1;
|
||||||
|
while ($tab = each($tabs)) {
|
||||||
|
if ($tab[0] == $selected) {
|
||||||
|
if ($i == 1) {
|
||||||
|
$output_text .= '<td align="right"><img src="' . $ir . '/tabs-start1.gif"></td>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$output_text .= '<td align="left" background="' . $ir . '/tabs-bg1.gif"> <b><a href="'
|
||||||
|
. $tab[1]["link"] . '" class="tablink">' . $fs . $tab[1]["label"]
|
||||||
|
. $fse . '</a></b> </td>';
|
||||||
|
if ($i == count($tabs)) {
|
||||||
|
$output_text .= '<td align="left"><img src="' . $ir . '/tabs-end1.gif"></td>';
|
||||||
|
} else {
|
||||||
|
$output_text .= '<td align="left"><img src="' . $ir . '/tabs-sepr.gif"></td>';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($i == 1) {
|
||||||
|
$output_text .= '<td align="right"><img src="' . $ir . '/tabs-start0.gif"></td>';
|
||||||
|
}
|
||||||
|
$output_text .= '<td align="left" background="' . $ir . '/tabs-bg0.gif"> <b><a href="'
|
||||||
|
. $tab[1]["link"] . '" class="tablink">' . $fs . $tab[1]["label"] . $fse
|
||||||
|
. '</a></b> </td>';
|
||||||
|
if (($i + 1) == $selected) {
|
||||||
|
$output_text .= '<td align="left"><img src="' . $ir . '/tabs-sepl.gif"></td>';
|
||||||
|
} else if ($i == $selected || $i != count($tabs)) {
|
||||||
|
$output_text .= '<td align="left"><img src="' . $ir . '/tabs-sepm.gif"></td>';
|
||||||
|
} else if ($i == count($tabs)) {
|
||||||
|
if ($i == $selected) {
|
||||||
|
$output_text .= '<td align="left"><img src="' . $ir . '/tabs-end1.gif"></td>';
|
||||||
|
} else {
|
||||||
|
$output_text .= '<td align="left"><img src="' . $ir . '/tabs-end0.gif"></td>';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($i != count($tabs)) {
|
||||||
|
$output_text .= '<td align="left"><img src="' . $ir . '/tabs-sepr.gif"></td>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$i++;
|
||||||
|
$output_text .= "\n";
|
||||||
|
}
|
||||||
|
$output_text .= "</table>\n";
|
||||||
|
return $output_text;
|
||||||
|
}
|
||||||
|
|
||||||
|
function show_icon(&$tpl, $td_width, $appname, $description = "")
|
||||||
|
{
|
||||||
|
global $phpgw_info, $colspan, $phpgw;
|
||||||
|
|
||||||
|
if ($appname && (($appname=="home" || $appname=="logout" || $appname == "print" || $appname == "preferences")
|
||||||
|
|| ($phpgw_info["user"]["apps"][$appname]))) {
|
||||||
|
|
||||||
|
if (isset($phpgw_info["flags"]["navbar_target"]) && $phpgw_info["flags"]["navbar_target"]) {
|
||||||
|
$target = ' target="' . $phpgw_info["flags"]["navbar_target"] . '"';
|
||||||
|
if ($appname == "logout") {
|
||||||
|
$target = ' target="_top"';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$target = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($colspan) && $colspan) {
|
||||||
|
$colspan++;
|
||||||
|
} else {
|
||||||
|
$colspan = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($description) || !$description) {
|
||||||
|
$description = $phpgw_info["apps"][$appname]["title"];
|
||||||
|
}
|
||||||
|
|
||||||
|
$urlbasename = $phpgw_info["server"]["webserver_url"];
|
||||||
|
|
||||||
|
if ($appname == "home") {
|
||||||
|
$output_text = "<A href=\"" . $phpgw->link($urlbasename."/index.php");
|
||||||
|
} elseif ($appname == "logout") {
|
||||||
|
$output_text = "<A href=\"" . $phpgw->link($urlbasename."/logout.php");
|
||||||
|
} elseif ($appname == "print") {
|
||||||
|
$output_text = "<A href=\"javascript:window.print();\"";
|
||||||
|
// Changed by Skeeter 03 Dec 00 2000 GMT
|
||||||
|
// This is to allow for the calendar app to have a default page view.
|
||||||
|
} elseif ($appname == "calendar") {
|
||||||
|
if(isset($phpgw_info["user"]["preferences"]["common"]["defaultcalendar"]))
|
||||||
|
$view = $phpgw_info["user"]["preferences"]["common"]["defaultcalendar"];
|
||||||
|
else
|
||||||
|
$view = "index.php";
|
||||||
|
$output_text = "<A href=\"" . $phpgw->link($urlbasename."/$appname/".$view);
|
||||||
|
// end change
|
||||||
|
} else {
|
||||||
|
$output_text = "<A href=\"" . $phpgw->link($urlbasename."/$appname/index.php");
|
||||||
|
}
|
||||||
|
$output_text .= "\"$target>";
|
||||||
|
|
||||||
|
if ($phpgw_info["user"]["preferences"]["common"]["navbar_format"] != "text") {
|
||||||
|
if ($appname != "home" && $appname != "logout" && $appname != "print") {
|
||||||
|
$output_text .= "<img src=\"" . $phpgw_info["server"]["webserver_url"]
|
||||||
|
. "/" . $appname . "/images" . "/navbar.gif\" border=0 alt=\"" . lang($description) . "\">";
|
||||||
|
} else {
|
||||||
|
$output_text .= "<img src=\"" . $phpgw_info["server"]["webserver_url"]
|
||||||
|
. "/images/$appname.gif\" border=0 alt=\"" . lang($description) . "\">";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ereg("text",$phpgw_info["user"]["preferences"]["common"]["navbar_format"])) {
|
||||||
|
$output_text .= "<br><font size=\"-2\">" . lang($description) . "</font>";
|
||||||
|
}
|
||||||
|
$output_text .= "</A>";
|
||||||
|
$tpl->set_var("td_align","center");
|
||||||
|
$tpl->set_var("td_width",$td_width);
|
||||||
|
$tpl->set_var("colspan",1);
|
||||||
|
$tpl->set_var("value",$output_text);
|
||||||
|
$tpl->parse("navbar_columns","navbar_column",True);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function navbar()
|
||||||
|
{
|
||||||
|
global $cd,$phpgw,$phpgw_info,$colspan,$PHP_SELF;
|
||||||
|
$tpl = new Template($phpgw_info["server"]["template_dir"]);
|
||||||
|
$tpl->set_file(array("navbar" => "navbar.tpl",
|
||||||
|
"navbar_row" => "navbar_row.tpl",
|
||||||
|
"navbar_column" => "navbar_column.tpl"
|
||||||
|
));
|
||||||
|
|
||||||
|
$urlbasename = $phpgw_info["server"]["webserver_url"];
|
||||||
|
|
||||||
|
if (ereg("text",$phpgw_info["user"]["preferences"]["common"]["navbar_format"])) {
|
||||||
|
$td_width = "7%";
|
||||||
|
} else {
|
||||||
|
$td_width = "3%";
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is hardcoded for right now
|
||||||
|
if ($phpgw_info["user"]["preferences"]["common"]["navbar_format"] == "text") {
|
||||||
|
$tpl->set_var("tr_color","FFFFFF");
|
||||||
|
} else {
|
||||||
|
$tpl->set_var("tr_color",$phpgw_info["theme"]["navbar_bg"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$tpl->set_var("td_align","left");
|
||||||
|
$tpl->set_var("td_width","");
|
||||||
|
$tpl->set_var("value"," " . $phpgw_info["user"]["fullname"] . " - "
|
||||||
|
. lang($phpgw->common->show_date(time(),"l")) . " "
|
||||||
|
. lang($phpgw->common->show_date(time(),"F")) . " "
|
||||||
|
. $phpgw->common->show_date(time(),"d, Y"));
|
||||||
|
$tpl->parse("navbar_columns","navbar_column",True);
|
||||||
|
|
||||||
|
if ($phpgw_info["user"]["preferences"]["common"]["navbar_format"] == "text") {
|
||||||
|
$tabs[1]["label"] = "home";
|
||||||
|
$tabs[1]["link"] = $phpgw->link($phpgw_info["server"]["webserver_url"] . "/index.php");
|
||||||
|
|
||||||
|
if ($PHP_SELF == $phpgw_info["server"]["webserver_url"] . "/index.php") {
|
||||||
|
$selected = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$i = 2;
|
||||||
|
|
||||||
|
while ($permission = each($phpgw_info["user"]["apps"])) {
|
||||||
|
if ($phpgw_info["apps"][$permission[0]]["status"] != 2) {
|
||||||
|
$tabs[$i]["label"] = $permission[0];
|
||||||
|
$tabs[$i]["link"] = $phpgw->link($phpgw_info["server"]["webserver_url"] . "/" . $permission[0] . "/index.php");
|
||||||
|
if (ereg($permission[0],$PHP_SELF)) {
|
||||||
|
$selected = $i;
|
||||||
|
}
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tabs[$i]["label"] = "preferences";
|
||||||
|
$tabs[$i]["link"] = $phpgw->link($phpgw_info["server"]["webserver_url"] . "/preferences/index.php");
|
||||||
|
if ($PHP_SELF == $phpgw_info["server"]["webserver_url"] . "/preferences/index.php") {
|
||||||
|
$selected = $i;
|
||||||
|
}
|
||||||
|
$i++;
|
||||||
|
|
||||||
|
$tabs[$i]["label"] = "logout";
|
||||||
|
$tabs[$i]["link"] = $phpgw->link($phpgw_info["server"]["webserver_url"] . "/logout.php");
|
||||||
|
|
||||||
|
$tpl->set_var("td_align","center");
|
||||||
|
$tpl->set_var("td_width",$td_width);
|
||||||
|
$tpl->set_var("colspan",1);
|
||||||
|
$tpl->set_var("value",$this->create_tabs($tabs,$selected,-1));
|
||||||
|
$tpl->parse("navbar_columns","navbar_column",True);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
$this->show_icon(&$tpl,$td_width,"home","home");
|
||||||
|
$this->show_icon(&$tpl,$td_width,"print","print");
|
||||||
|
|
||||||
|
while ($permission = each($phpgw_info["user"]["apps"])) {
|
||||||
|
if ($phpgw_info["apps"][$permission[0]]["status"] != 2) {
|
||||||
|
$this->show_icon(&$tpl,$td_width,$permission[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->show_icon(&$tpl,$td_width,"preferences","Preferences");
|
||||||
|
$this->show_icon(&$tpl,$td_width,"logout","Logout");
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
$tpl->parse("navbar_rows","navbar_row",True);
|
||||||
|
|
||||||
|
if (isset($phpgw_info["user"]["apps"]["admin"]) && isset($phpgw_info["user"]["preferences"]["common"]["show_currentusers"])) {
|
||||||
|
if ($phpgw_info["server"]["showpoweredbyon"] != "top") {
|
||||||
|
$phpgw->db->query("select count(*) from phpgw_sessions");
|
||||||
|
$phpgw->db->next_record();
|
||||||
|
$tpl->set_var("td_align","right");
|
||||||
|
$tpl->set_var("td_width","");
|
||||||
|
$tpl->set_var("tr_color",$phpgw_info["theme"]["bg_color"]);
|
||||||
|
$tpl->set_var("value",'<a href="' . $phpgw->link($urlbasename."/admin/currentusers.php")
|
||||||
|
. '"> ' . lang("Current users") . ': ' . $phpgw->db->f(0) . '</a>');
|
||||||
|
$tpl->set_var("colspan",($colspan+1));
|
||||||
|
$tpl->parse("navbar_columns","navbar_column");
|
||||||
|
$tpl->parse("navbar_rows","navbar_row",True);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($phpgw_info["server"]["showpoweredbyon"] == "top") {
|
||||||
|
if ( ! $phpgw_info["user"]["preferences"]["common"]["show_currentusers"]) {
|
||||||
|
$tpl->set_var("td_align","left");
|
||||||
|
$tpl->set_var("td_width","");
|
||||||
|
$tpl->set_var("tr_color",$phpgw_info["theme"]["bg_color"]);
|
||||||
|
$tpl->set_var("value",lang("Powered by phpGroupWare version x",$phpgw_info["server"]["version"]));
|
||||||
|
$tpl->set_var("colspan",$colspan);
|
||||||
|
$tpl->parse("navbar_columns","navbar_column");
|
||||||
|
$tpl->parse("navbar_rows","navbar_row",True);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($phpgw_info["server"]["showpoweredbyon"] == "top"
|
||||||
|
&& isset($phpgw_info["user"]["apps"]["admin"])
|
||||||
|
&& isset($phpgw_info["user"]["preferences"]["common"]["show_currentusers"])) {
|
||||||
|
|
||||||
|
$tpl->set_var("td_align","left");
|
||||||
|
$tpl->set_var("td_width","");
|
||||||
|
$tpl->set_var("tr_color",$phpgw_info["theme"]["bg_color"]);
|
||||||
|
$tpl->set_var("value",lang("Powered by phpGroupWare version x",$phpgw_info["server"]["version"]));
|
||||||
|
$tpl->set_var("colspan",1);
|
||||||
|
$tpl->parse("navbar_columns","navbar_column");
|
||||||
|
|
||||||
|
$phpgw->db->query("select count(*) from phpgw_sessions");
|
||||||
|
$phpgw->db->next_record();
|
||||||
|
$tpl->set_var("td_align","right");
|
||||||
|
$tpl->set_var("td_width","");
|
||||||
|
$tpl->set_var("value",'<a href="' . $phpgw->link($urlbasename."/admin/currentusers.php")
|
||||||
|
. '"> ' . lang("Current users") . ': ' . $phpgw->db->f(0) . '</a>');
|
||||||
|
$tpl->set_var("colspan",($colspan--));
|
||||||
|
$tpl->parse("navbar_columns","navbar_column",True);
|
||||||
|
$tpl->parse("navbar_rows","navbar_row",True);
|
||||||
|
}
|
||||||
|
|
||||||
|
$tpl->pparse("out","navbar");
|
||||||
|
|
||||||
|
// Make the wording a little more user friendly
|
||||||
|
if ($phpgw_info["user"]["lastpasswd_change"] == 0) {
|
||||||
|
echo "<br><center>" . lang("You are required to change your password "
|
||||||
|
. "during your first login");
|
||||||
|
echo "<br> Click this image on the navbar: <img src=\"".$phpgw_info["server"]["webserver_url"]."/preferences/images/navbar.gif\">";
|
||||||
|
echo "</center>";
|
||||||
|
} else if ($phpgw_info["user"]["lastpasswd_change"] < time() - (86400*30)) {
|
||||||
|
echo "<br><CENTER>" . lang("it has been more then x days since you "
|
||||||
|
. "changed your password",30) . "</CENTER>";
|
||||||
|
}
|
||||||
|
if (isset($cd) && $cd) {
|
||||||
|
echo "<center>" . check_code($cd) . "</center>";
|
||||||
|
}
|
||||||
|
|
||||||
|
unset($colspan);
|
||||||
|
|
||||||
|
/**************************************************************************\
|
||||||
|
* Load the app include files if the exists *
|
||||||
|
\**************************************************************************/
|
||||||
|
/* Then the include file */
|
||||||
|
if (file_exists ($phpgw_info["server"]["app_inc"]."/header.inc.php")) {
|
||||||
|
include($phpgw_info["server"]["app_inc"]."/header.inc.php");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function phpgw_header() {
|
||||||
|
global $phpgw, $phpgw_info, $HTMLCOMPLAINT;
|
||||||
|
|
||||||
|
echo "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\"> ";
|
||||||
|
echo "<HTML LANG=\"en\">";
|
||||||
|
echo "<HEAD>";
|
||||||
|
echo "<TITLE>".$phpgw_info["server"]["site_title"]."</TITLE>";
|
||||||
|
echo "<META http-equiv=\"Content-Type\" content=\"text/html; charset=\"".$phpgw->translation->translate("charset")."\">";
|
||||||
|
echo "<STYLE type=\"text/css\">";
|
||||||
|
echo " a {text-decoration:none;}";
|
||||||
|
echo " <!--";
|
||||||
|
echo " A:link{text-decoration:none}";
|
||||||
|
echo " A:visted{text-decoration:none}";
|
||||||
|
echo " A:active{text-decoration:none}";
|
||||||
|
echo " body { margin-top: 0px; margin-right: 0px; margin-left: 0px}";
|
||||||
|
echo " .tablink";
|
||||||
|
echo " {";
|
||||||
|
echo " color: #000000;";
|
||||||
|
echo " }";
|
||||||
|
echo " -->";
|
||||||
|
echo "</STYLE>";
|
||||||
|
echo "</HEAD>";
|
||||||
|
if ($phpgw_info["server"]["htmlcompliant"]) {
|
||||||
|
echo ("<BODY BGCOLOR=\"".$phpgw_info["theme"]["bg_color"]."\" ALINK=\"".$phpgw_info["theme"]["alink"]."\" LINK=\"".$phpgw_info["theme"]["link"]."\" VLINK=\"".$phpgw_info["theme"]["vlink"]."\">\n");
|
||||||
|
} else {
|
||||||
|
echo ("<BODY BGCOLOR=\"".$phpgw_info["theme"]["bg_color"]."\">\n");
|
||||||
|
}
|
||||||
|
if ((! isset($phpgw_info["flags"]["nonavbar"]) || ! $phpgw_info["flags"]["nonavbar"]) && ! $phpgw_info["flags"]["navbar_target"]) {
|
||||||
|
$this->navbar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function phpgw_footer()
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info, $HTMLCOMPLAINT;
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/footer.inc.php");
|
||||||
|
|
||||||
|
// Clean up mcrypt
|
||||||
|
if (is_object($this->crypto)) {
|
||||||
|
$this->crypto->cleanup();
|
||||||
|
unset($this->crypto);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function hex2bin($data)
|
||||||
|
{
|
||||||
|
$len = strlen($data);
|
||||||
|
return pack("H" . $len, $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function encrypt($data) {
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
|
||||||
|
$data = serialize($data);
|
||||||
|
return $phpgw->crypto->encrypt($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function decrypt($data) {
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
|
||||||
|
$data = $phpgw->crypto->decrypt($data);
|
||||||
|
return unserialize($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function des_cryptpasswd($userpass, $random)
|
||||||
|
{
|
||||||
|
$lcrypt = "{crypt}";
|
||||||
|
$password = crypt($userpass);
|
||||||
|
$ldappassword = sprintf("%s%s", $lcrypt, $password);
|
||||||
|
|
||||||
|
return $ldappassword;
|
||||||
|
}
|
||||||
|
|
||||||
|
function md5_cryptpasswd($userpass, $random)
|
||||||
|
{
|
||||||
|
$bsalt = "$1$";
|
||||||
|
$esalt = "$"; // patch
|
||||||
|
$lcrypt = "{crypt}";
|
||||||
|
// $modsalt = sprintf("%s%s", $bsalt, $random);
|
||||||
|
$modsalt = sprintf("%s%s%s", $bsalt, $random, $esalt); // patch
|
||||||
|
$password = crypt($userpass, $modsalt);
|
||||||
|
$ldappassword = sprintf("%s%s", $lcrypt, $password);
|
||||||
|
|
||||||
|
return $ldappassword;
|
||||||
|
}
|
||||||
|
|
||||||
|
function encrypt_password($password)
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
|
||||||
|
if ($phpgw_info["server"]["ldap_encryption_type"] == "DES") {
|
||||||
|
$salt = $this->randomstring(2);
|
||||||
|
$e_password = $this->des_cryptpasswd($password, $salt);
|
||||||
|
}
|
||||||
|
if ($phpgw_info["server"]["ldap_encryption_type"] == "MD5") {
|
||||||
|
// $salt = $this->randomstring(9);
|
||||||
|
$salt = $this->randomstring(8); // patch
|
||||||
|
$e_password = $this->md5_cryptpasswd($password, $salt);
|
||||||
|
}
|
||||||
|
return $e_password;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function hook($location = ""){
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
|
||||||
|
/* First include the apps own hook file */
|
||||||
|
$appname = $phpgw_info["flags"]["currentapp"];
|
||||||
|
$f = $phpgw_info["server"]["server_root"] . "/" . $appname . "/inc/hook_".$phpgw_info["flags"]["currentapp"];
|
||||||
|
if ($location != ""){$f .= "_".$location.".inc.php";}else{$f .= ".inc.php";}
|
||||||
|
if (file_exists($f)) {include($f);}
|
||||||
|
|
||||||
|
/* Then add the rest */
|
||||||
|
reset ($phpgw_info["user"]["app_perms"]);
|
||||||
|
while (list (, $appname) = each ($phpgw_info["user"]["app_perms"])){
|
||||||
|
if ($appname != "" || $appname != $phpgw_info["flags"]["currentapp"]){
|
||||||
|
$f = $phpgw_info["server"]["server_root"] . "/" . $appname . "/inc/hook_".$phpgw_info["flags"]["currentapp"];
|
||||||
|
if ($location != ""){$f .= "_".$location.".inc.php";}else{$f .= ".inc.php"; }
|
||||||
|
if (file_exists($f)) {include($f);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function appsession($data = "##NOTHING##") {
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
|
||||||
|
if ($data == "##NOTHING##") { /* This allows the user to put "" as the value. */
|
||||||
|
$phpgw->db->query("select content from phpgw_app_sessions where sessionid = '"
|
||||||
|
.$phpgw_info["user"]["sessionid"]."' and loginid = '"
|
||||||
|
.$phpgw_info["user"]["userid"]."' and app = '"
|
||||||
|
.$phpgw_info["flags"]["currentapp"] . "'",__LINE__,__FILE__);
|
||||||
|
if($phpgw->db->num_rows()) {
|
||||||
|
$phpgw->db->next_record();
|
||||||
|
$data = $phpgw->db->f("content");
|
||||||
|
$data = $this->decrypt($data);
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$data = $this->encrypt($data);
|
||||||
|
$phpgw->db->query("select * from phpgw_app_sessions where sessionid = '"
|
||||||
|
. $phpgw_info["user"]["sessionid"] . "' and app = '"
|
||||||
|
. $phpgw_info["flags"]["currentapp"] . "'",__LINE__,__FILE__);
|
||||||
|
if ($phpgw->db->num_rows()==0) {
|
||||||
|
$phpgw->db->query("INSERT INTO phpgw_app_sessions (sessionid,loginid,app,content)"
|
||||||
|
." VALUES ('".$phpgw_info["user"]["sessionid"]."','"
|
||||||
|
.$phpgw_info["user"]["userid"]
|
||||||
|
."','".$phpgw_info["flags"]["currentapp"]."','".$data."');",__LINE__,__FILE__);
|
||||||
|
} else {
|
||||||
|
$phpgw->db->query("update phpgw_app_sessions set content = '$data' where sessionid = '"
|
||||||
|
.$phpgw_info["user"]["sessionid"]."' and loginid = '"
|
||||||
|
.$phpgw_info["user"]["userid"]."'",__LINE__,__FILE__);
|
||||||
|
}
|
||||||
|
$data = $this->decrypt($data);
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function will add preferences for the specified app to the phpgw_info[] array
|
||||||
|
// i(knecke) had moved this function phpgw_accounts_* class preferences
|
||||||
|
/*
|
||||||
|
function read_preferences($app_name)
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
$sql = "select preference_name,preference_value, preference_appname from preferences where "
|
||||||
|
. "preference_owner='".$phpgw_info["user"]["account_id"]."' AND preference_appname='$app_name'";
|
||||||
|
|
||||||
|
$phpgw->db->query($sql,__LINE__,__FILE__);
|
||||||
|
while($phpgw->db->next_record()) {
|
||||||
|
$phpgw_info["user"]["preferences"][$phpgw->db->f("preference_appname")][$phpgw->db->f("preference_name")] = $phpgw->db->f("preference_value");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a new preference.
|
||||||
|
// i(knecke) had moved this function phpgw_accounts_* class preferences
|
||||||
|
function preferences_add($account_id,$var,$app_name,$value = "")
|
||||||
|
{
|
||||||
|
if ($value) {
|
||||||
|
global $phpgw;
|
||||||
|
$phpgw->db->query("insert into preferences (preference_owner,preference_name,"
|
||||||
|
. "preference_value,preference_appname) values ('$account_id','$var','$value','"
|
||||||
|
. "$app_name')",__LINE__,__FILE__);
|
||||||
|
} else {
|
||||||
|
global $$var, $phpgw;
|
||||||
|
$phpgw->db->query("insert into preferences (preference_owner,preference_name,"
|
||||||
|
. "preference_value,preference_appname) values ('$account_id','$var','". $$var
|
||||||
|
. "','$app_name')",__LINE__,__FILE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// i(knecke) had moved this function phpgw_accounts_* class preferences
|
||||||
|
function preferences_delete($method,$account_id,$var = "", $var2 = "")
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
|
||||||
|
switch ($method)
|
||||||
|
{
|
||||||
|
case "all": $phpgw->db->query("delete from preferences where preference_owner='"
|
||||||
|
. "$account_id'",__LINE__,__FILE__); break;
|
||||||
|
// I may take this one out in the future. If you need it, let me know. (jengo)
|
||||||
|
case "notheme": $phpgw->db->query("delete from preferences where preference_owner='"
|
||||||
|
. "$account_id' and preference_name != 'theme'",__LINE__,__FILE__); break;
|
||||||
|
case "onlyvar": $phpgw->db->query("delete from preferences where preference_owner='"
|
||||||
|
. "$account_id' and preference_name='$var'",__LINE__,__FILE__); break;
|
||||||
|
case "byapp": $phpgw->db->query("delete from preferences where preference_owner='"
|
||||||
|
. "$account_id' and preference_appname='$var'",__LINE__,__FILE__); break;
|
||||||
|
case "byappnotheme": $phpgw->db->query("delete from preferences where preference_owner='"
|
||||||
|
. "$account_id' and preference_appname='$var' and preference_name !='theme'",__LINE__,__FILE__); break;
|
||||||
|
case "byappvar": $phpgw->db->query("delete from preferences where preference_owner='"
|
||||||
|
. "$account_id' and preference_appname='".substr($var,0,strpos($var,"|"))."' "
|
||||||
|
. "and preference_name='".substr($var,strpos($var,"|")+1)."'",__LINE__,__FILE__); break;
|
||||||
|
case "byappvar_single": $phpgw->db->query("delete from preferences where preference_owner='"
|
||||||
|
. "$account_id' and preference_appname='$var' "
|
||||||
|
. "and preference_name='$var2'",__LINE__,__FILE__); break;
|
||||||
|
|
||||||
|
default: return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// i(knecke) had moved this function phpgw_accounts_* class preferences
|
||||||
|
function preferences_update($account_id,$var,$app_name)
|
||||||
|
{
|
||||||
|
$this->preferences_delete("onlyvar",$account_id,$var);
|
||||||
|
$this->preferences_add($account_id,$var,$app_name);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
function show_date($t = "", $format = "")
|
||||||
|
{
|
||||||
|
global $phpgw_info;
|
||||||
|
|
||||||
|
if (! $t)
|
||||||
|
$t = time();
|
||||||
|
|
||||||
|
$t = $t + ((60*60) * $phpgw_info["user"]["preferences"]["common"]["tz_offset"]);
|
||||||
|
|
||||||
|
if (! $format) {
|
||||||
|
$format = $phpgw_info["user"]["preferences"]["common"]["dateformat"] . " - ";
|
||||||
|
if ($phpgw_info["user"]["preferences"]["common"]["timeformat"] == "12") {
|
||||||
|
$format .= "h:i:s a";
|
||||||
|
} else {
|
||||||
|
$format .= "H:i:s";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return date($format,$t);
|
||||||
|
}
|
||||||
|
|
||||||
|
function dateformatorder($yearstr,$monthstr,$daystr,$add_seperator = False)
|
||||||
|
{
|
||||||
|
global $phpgw_info;
|
||||||
|
$dateformat = strtolower($phpgw_info["user"]["preferences"]["common"]["dateformat"]);
|
||||||
|
$sep = substr($phpgw_info["user"]["preferences"]["common"]["dateformat"],1,1);
|
||||||
|
|
||||||
|
$dlarr[strpos($dateformat,'y')] = $yearstr;
|
||||||
|
$dlarr[strpos($dateformat,'m')] = $monthstr;
|
||||||
|
$dlarr[strpos($dateformat,'d')] = $daystr;
|
||||||
|
ksort($dlarr);
|
||||||
|
|
||||||
|
if ($add_seperator) {
|
||||||
|
return (implode($sep,$dlarr));
|
||||||
|
} else {
|
||||||
|
return (implode(" ",$dlarr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function formattime($hour,$min,$sec="")
|
||||||
|
{
|
||||||
|
global $phpgw_info;
|
||||||
|
|
||||||
|
$h12 = $hour;
|
||||||
|
if ($phpgw_info["user"]["preferences"]["common"]["timeformat"] == "12") {
|
||||||
|
if ($hour > 12)
|
||||||
|
$ampm = " pm";
|
||||||
|
else
|
||||||
|
$ampm = " am";
|
||||||
|
$h12 %= 12;
|
||||||
|
if ($h12 == 0 && $hour)
|
||||||
|
$h12 = 12;
|
||||||
|
if ($h12 == 0 && ! $hour)
|
||||||
|
$h12 = 0;
|
||||||
|
} else
|
||||||
|
$h12 = $hour;
|
||||||
|
|
||||||
|
if ($sec)
|
||||||
|
$sec = ":$sec";
|
||||||
|
|
||||||
|
return "$h12:$min$sec$ampm";
|
||||||
|
}
|
||||||
|
|
||||||
|
// This will be moved into the applications area.
|
||||||
|
function check_code($code)
|
||||||
|
{
|
||||||
|
$s = "<br>";
|
||||||
|
switch ($code)
|
||||||
|
{
|
||||||
|
case 13: $s .= lang("Your message has been sent");break;
|
||||||
|
case 14: $s .= lang("New entry added sucessfully");break;
|
||||||
|
case 15: $s .= lang("Entry updated sucessfully"); break;
|
||||||
|
case 16: $s .= lang("Entry has been deleted sucessfully"); break;
|
||||||
|
case 18: $s .= lang("Password has been updated"); break;
|
||||||
|
case 19: $s .= lang("Session has been killed"); break;
|
||||||
|
case 27: $s .= lang("Account has been updated"); break;
|
||||||
|
case 28: $s .= lang("Account has been created"); break;
|
||||||
|
case 29: $s .= lang("Account has been deleted"); break;
|
||||||
|
case 30: $s .= lang("Your settings have been updated"); break;
|
||||||
|
case 31: $s .= lang("Group has been added"); break;
|
||||||
|
case 32: $s .= lang("Group has been deleted"); break;
|
||||||
|
case 33: $s .= lang("Group has been updated"); break;
|
||||||
|
case 34: $s .= lang("Account has been deleted") . "<p>"
|
||||||
|
. lang("Error deleting x x directory",lang("users")," ".lang("private")." ")
|
||||||
|
. ",<br>" . lang("Please x by hand",lang("delete")) . "<br><br>"
|
||||||
|
. lang("To correct this error for the future you will need to properly set the")
|
||||||
|
. "<br>" . lang("permissions to the files/users directory")
|
||||||
|
. "<br>" . lang("On *nix systems please type: x","chmod 707 "
|
||||||
|
. $phpgw_info["server"]["files_dir"] . "/users/");
|
||||||
|
break;
|
||||||
|
case 35: $s .= lang("Account has been updated") . "<p>"
|
||||||
|
. lang("Error renaming x x directory",lang("users"),
|
||||||
|
" ".lang("private")." ")
|
||||||
|
. ",<br>" . lang("Please x by hand",
|
||||||
|
lang("rename")) . "<br><br>"
|
||||||
|
. lang("To correct this error for the future you will need to properly set the")
|
||||||
|
. "<br>" . lang("permissions to the files/users directory")
|
||||||
|
. "<br>" . lang("On *nix systems please type: x","chmod 707 "
|
||||||
|
. $phpgw_info["server"]["files_dir"] . "/users/");
|
||||||
|
break;
|
||||||
|
case 36: $s .= lang("Account has been created") . "<p>"
|
||||||
|
. lang("Error creating x x directory",lang("users"),
|
||||||
|
" ".lang("private")." ")
|
||||||
|
. ",<br>" . lang("Please x by hand",
|
||||||
|
lang("create")) . "<br><br>"
|
||||||
|
. lang("To correct this error for the future you will need to properly set the")
|
||||||
|
. "<br>" . lang("permissions to the files/users directory")
|
||||||
|
. "<br>" . lang("On *nix systems please type: x","chmod 707 "
|
||||||
|
. $phpgw_info["server"]["files_dir"] . "/users/");
|
||||||
|
break;
|
||||||
|
case 37: $s .= lang("Group has been added") . "<p>"
|
||||||
|
. lang("Error creating x x directory",lang("groups")," ")
|
||||||
|
. ",<br>" . lang("Please x by hand",
|
||||||
|
lang("create")) . "<br><br>"
|
||||||
|
. lang("To correct this error for the future you will need to properly set the")
|
||||||
|
. "<br>" . lang("permissions to the files/users directory")
|
||||||
|
. "<br>" . lang("On *nix systems please type: x","chmod 707 "
|
||||||
|
. $phpgw_info["server"]["files_dir"] . "/groups/");
|
||||||
|
break;
|
||||||
|
case 38: $s .= lang("Group has been deleted") . "<p>"
|
||||||
|
. lang("Error deleting x x directory",lang("groups")," ")
|
||||||
|
. ",<br>" . lang("Please x by hand",
|
||||||
|
lang("delete")) . "<br><br>"
|
||||||
|
. lang("To correct this error for the future you will need to properly set the")
|
||||||
|
. "<br>" . lang("permissions to the files/users directory")
|
||||||
|
. "<br>" . lang("On *nix systems please type: x","chmod 707 "
|
||||||
|
. $phpgw_info["server"]["files_dir"] . "/groups/");
|
||||||
|
break;
|
||||||
|
case 39: $s .= lang("Group has been updated") . "<p>"
|
||||||
|
. lang("Error renaming x x directory",lang("groups")," ")
|
||||||
|
. ",<br>" . lang("Please x by hand",
|
||||||
|
lang("rename")) . "<br><br>"
|
||||||
|
. lang("To correct this error for the future you will need to properly set the")
|
||||||
|
. "<br>" . lang("permissions to the files/users directory")
|
||||||
|
. "<br>" . lang("On *nix systems please type: x","chmod 707 "
|
||||||
|
. $phpgw_info["server"]["files_dir"] . "/groups/");
|
||||||
|
break;
|
||||||
|
case 40: $s .= lang("You have not entered a\nBrief Description").".";
|
||||||
|
break;
|
||||||
|
case 41: $s .= lang("You have not entered a\nvalid time of day.");
|
||||||
|
break;
|
||||||
|
case 42: $s .= lang("You have not entered a\nvalid date.");
|
||||||
|
break;
|
||||||
|
default: return "";
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
function phpgw_error($error,$line = "", $file = "")
|
||||||
|
{
|
||||||
|
echo "<p><b>phpGroupWare internal error:</b><p>$error";
|
||||||
|
if ($line) {
|
||||||
|
echo "Line: $line";
|
||||||
|
}
|
||||||
|
if ($file) {
|
||||||
|
echo "File: $file";
|
||||||
|
}
|
||||||
|
echo "<p>Your session has been halted.";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function create_phpcode_from_array($array)
|
||||||
|
{
|
||||||
|
while (list($key, $val) = each($array)) {
|
||||||
|
if (is_array($val)) {
|
||||||
|
while (list($key2, $val2) = each($val)) {
|
||||||
|
if (is_array($val2)) {
|
||||||
|
while (list($key3, $val3) = each ($val2)) {
|
||||||
|
if (is_array($val3)) {
|
||||||
|
while (list($key4, $val4) = each ($val3)) {
|
||||||
|
$s .= '$phpgw_info["' . $key . '"]["' . $key2 . '"]["' . $key3 . '"]["' .$key4 . '"]="' . $val4 . '";';
|
||||||
|
$s .= "\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$s .= '$phpgw_info["' . $key . '"]["' . $key2 . '"]["' . $key3 . '"]="' . $val3 . '";';
|
||||||
|
$s .= "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$s .= '$phpgw_info["' . $key .'"]["' . $key2 . '"]="' . $val2 . '";';
|
||||||
|
$s .= "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$s .= '$phpgw_info["' . $key . '"]="' . $val . '";';
|
||||||
|
$s .= "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// This will return the full phpgw_info array, used for debugging
|
||||||
|
function debug_phpgw_info()
|
||||||
|
{
|
||||||
|
global $phpgw_info;
|
||||||
|
|
||||||
|
while (list($key, $val) = each($phpgw_info)) {
|
||||||
|
if (is_array($val)) {
|
||||||
|
while (list($key2, $val2) = each($val)) {
|
||||||
|
if (is_array($val2)) {
|
||||||
|
while (list($key3, $val3) = each ($val2)) {
|
||||||
|
if (is_array($val3)) {
|
||||||
|
while (list($key4, $val4) = each ($val3)) {
|
||||||
|
echo "phpgw_info[$key][$key2][$key3][$key4]=$val4<br>";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "phpgw_info[$key][$key2][$key3]=$val3<br>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "phpgw_info[$key][$key2]=$val2<br>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "phpgw_info[$key]=$val<br>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This will return a list of functions in the API
|
||||||
|
function debug_list_core_functions()
|
||||||
|
{
|
||||||
|
global $phpgw_info;
|
||||||
|
|
||||||
|
echo "<br><b>core functions</b><br>";
|
||||||
|
echo "<pre>";
|
||||||
|
chdir($phpgw_info["server"]["include_root"]."/phpgwapi");
|
||||||
|
system("grep -r '^[ \t]*function' *");
|
||||||
|
echo "</pre>";
|
||||||
|
}
|
||||||
|
|
||||||
|
function common_()
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
$phpgw_info["server"]["dir_separator"] = $this->filesystem_separator();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class hooks
|
||||||
|
{
|
||||||
|
function read()
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
$db = $phpgw->db;
|
||||||
|
|
||||||
|
$db->query("select * from phpgw_hooks");
|
||||||
|
while ($db->next_record()) {
|
||||||
|
$return_array[$db->f("hook_id")]["app"] = $db->f("hook_appname");
|
||||||
|
$return_array[$db->f("hook_id")]["location"] = $db->f("hook_location");
|
||||||
|
$return_array[$db->f("hook_id")]["filename"] = $db->f("hook_filename");
|
||||||
|
}
|
||||||
|
return $return_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
function proccess($type,$where = "")
|
||||||
|
{
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
|
||||||
|
$currentapp = $phpgw_info["flags"]["currentapp"];
|
||||||
|
$type = strtolower($type);
|
||||||
|
|
||||||
|
if ($type != "location" && $type != "app") {
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a check to see if that location/app has a hook
|
||||||
|
// This way it doesn't have to loop everytime
|
||||||
|
|
||||||
|
while ($hook = each($phpgw_info["hooks"])) {
|
||||||
|
if ($type == "app") {
|
||||||
|
if ($hook[1]["app"] == $currentapp) {
|
||||||
|
$include_file = $phpgw_info["server"]["server_root"] . "/"
|
||||||
|
. $currentapp . "/hooks/"
|
||||||
|
. $hook[1]["app"] . $hook[1]["filename"];
|
||||||
|
include($include_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if ($type == "location") {
|
||||||
|
if ($hook[1]["location"] == $where) {
|
||||||
|
$include_file = $phpgw_info["server"]["server_root"] . "/"
|
||||||
|
. $hook[1]["app"] . "/hooks/"
|
||||||
|
. $hook[1]["filename"];
|
||||||
|
if (! is_file($include_file)) {
|
||||||
|
$phpgw->common->phpgw_error("Failed to include hook: $include_file");
|
||||||
|
} else {
|
||||||
|
include($include_file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
123
phpgwapi/phpgw_crypto.inc.php
Normal file
123
phpgwapi/phpgw_crypto.inc.php
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
class crypto {
|
||||||
|
var $td = False; // Handle for mcrypt
|
||||||
|
var $iv = "";
|
||||||
|
var $key = "";
|
||||||
|
function crypto($key,$iv)
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
|
||||||
|
if ($phpgw_info["server"]["mcrypt_enabled"] && extension_loaded("mcrypt")) {
|
||||||
|
if ($phpgw_info["server"]["mcrypt_version"] == "old") {
|
||||||
|
$this->td = false;
|
||||||
|
if (PHP_VERSION > "4.0.2pl1") {
|
||||||
|
$keysize = mcrypt_get_key_size(MCRYPT_TRIPLEDES);
|
||||||
|
$ivsize = mcrypt_get_iv_size(MCRYPT_TRIPLEDES,MCRYPT_MODE_CBC);
|
||||||
|
} else {
|
||||||
|
$keysize = 8;
|
||||||
|
$ivsize = 8;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Start up mcrypt
|
||||||
|
$this->td = mcrypt_module_open (MCRYPT_TRIPLEDES, "", MCRYPT_MODE_CBC, "");
|
||||||
|
|
||||||
|
$ivsize = mcrypt_enc_get_iv_size($this->td);
|
||||||
|
$keysize = mcrypt_enc_get_key_size($this->td);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hack IV to be the correct size
|
||||||
|
$x = strlen($iv);
|
||||||
|
for ($i = 0; $i < $ivsize; $i++) {
|
||||||
|
$this->iv .= $iv[$i % $x];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hack Key to be the correct size
|
||||||
|
$x = strlen($key);
|
||||||
|
|
||||||
|
for ($i = 0; $i < $keysize; $i++) {
|
||||||
|
$this->key .= $key[$i % $x];
|
||||||
|
}
|
||||||
|
if ($phpgw_info["server"]["mcrypt_version"] != "old") {
|
||||||
|
mcrypt_generic_init ($this->td, $this->key, $this->iv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If mcrypt isn't loaded key and iv are not needed
|
||||||
|
}
|
||||||
|
|
||||||
|
function cleanup()
|
||||||
|
{
|
||||||
|
global $phpgw_info;
|
||||||
|
|
||||||
|
if ($phpgw_info["server"]["mcrypt_enabled"] && extension_loaded("mcrypt")) {
|
||||||
|
if ($phpgw_info["server"]["mcrypt_version"] != "old") {
|
||||||
|
mcrypt_generic_end ($this->td);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function hex2bin($data)
|
||||||
|
{
|
||||||
|
$len = strlen($data);
|
||||||
|
return pack("H" . $len, $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function encrypt($data) {
|
||||||
|
global $phpgw_info;
|
||||||
|
|
||||||
|
$data = serialize($data);
|
||||||
|
|
||||||
|
// Disable all encryption if the admin didn't set it up
|
||||||
|
if ($phpgw_info["server"]["mcrypt_enabled"] && extension_loaded("mcrypt")) {
|
||||||
|
switch ($phpgw_info["server"]["mcrypt_version"]) {
|
||||||
|
// The old code, only works with mcrypt <= 2.2.x
|
||||||
|
case "old": {
|
||||||
|
$encrypteddata = mcrypt_cbc(MCRYPT_TripleDES, $this->key, $data, MCRYPT_ENCRYPT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: { // Handle 2.4 and newer API
|
||||||
|
$encrypteddata = mcrypt_generic($this->td, $data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$encrypteddata = bin2hex($encrypteddata);
|
||||||
|
return $encrypteddata;
|
||||||
|
} else { // No mcrypt == insecure !
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function decrypt($encrypteddata) {
|
||||||
|
global $phpgw_info;
|
||||||
|
|
||||||
|
// Disable all encryption if the admin didn't set it up
|
||||||
|
if ($phpgw_info["server"]["mcrypt_enabled"] && extension_loaded("mcrypt")) {
|
||||||
|
$data = $this->hex2bin($encrypteddata);
|
||||||
|
|
||||||
|
switch ($phpgw_info["server"]["mcrypt_version"]) {
|
||||||
|
// The old code, only works with mcrypt <= 2.2.x
|
||||||
|
case "old": {
|
||||||
|
$data = mcrypt_cbc(MCRYPT_TripleDES, $this->key, $data, MCRYPT_DECRYPT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: { // Handle 2.4 and newer API
|
||||||
|
$data = mdecrypt_generic($this->td, $data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return unserialize($data);
|
||||||
|
} else {
|
||||||
|
return unserialize($encrypteddata);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // class crypto
|
143
phpgwapi/phpgw_db_msql.inc.php
Normal file
143
phpgwapi/phpgw_db_msql.inc.php
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Session Management for PHP3
|
||||||
|
*
|
||||||
|
* Copyright (c) 1998,1999 SH Online Dienst GmbH
|
||||||
|
* Boris Erdmann, Kristian Koehntopp
|
||||||
|
*
|
||||||
|
* Derived from db_mysql.inc by Sascha Schumann <sascha@schumann.cx>
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
class db {
|
||||||
|
var $Host = "";
|
||||||
|
var $Database = "";
|
||||||
|
|
||||||
|
var $Link_ID = 0;
|
||||||
|
var $Query_ID = 0;
|
||||||
|
var $Record = array();
|
||||||
|
var $Row;
|
||||||
|
|
||||||
|
var $Error = "";
|
||||||
|
|
||||||
|
var $Auto_Free = 0; ## Set this to 1 for automatic msql_free_result()
|
||||||
|
|
||||||
|
function connect() {
|
||||||
|
// Not connected? Then connect?
|
||||||
|
if ( 0 == $this->Link_ID ) {
|
||||||
|
// Check for local connect
|
||||||
|
$this->Link_ID = empty($this->Host)?
|
||||||
|
$this->Link_ID=msql_pconnect():
|
||||||
|
$this->Link_ID=msql_pconnect($this->Host);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Still not connected? Raise error.
|
||||||
|
if ( 0 == $this->Link_ID ) {
|
||||||
|
$this->halt("Link-ID == false, pconnect failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Select current database
|
||||||
|
if (!msql_select_db($this->Database, $this->Link_ID)) {
|
||||||
|
$this->halt("cannot use database ".$this->Database);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function query($Query_String) {
|
||||||
|
$this->connect();
|
||||||
|
|
||||||
|
# printf("Debug: query = %s<br>\n", $Query_String);
|
||||||
|
|
||||||
|
$this->Query_ID = msql_query($Query_String,$this->Link_ID);
|
||||||
|
$this->Row = 0;
|
||||||
|
$this->Error = msql_error();
|
||||||
|
if (!$this->Query_ID) {
|
||||||
|
$this->halt("Invalid SQL: ".$Query_String);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->Query_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
function next_record() {
|
||||||
|
$this->Record = msql_fetch_array($this->Query_ID);
|
||||||
|
$this->Row += 1;
|
||||||
|
$this->Error = msql_error();
|
||||||
|
|
||||||
|
$stat = is_array($this->Record);
|
||||||
|
if (!$stat && $this->Auto_Free) {
|
||||||
|
msql_free_result($this->Query_ID);
|
||||||
|
$this->Query_ID = 0;
|
||||||
|
}
|
||||||
|
return $stat;
|
||||||
|
}
|
||||||
|
|
||||||
|
function seek($pos) {
|
||||||
|
$status = msql_data_seek($this->Query_ID, $pos);
|
||||||
|
if ($status)
|
||||||
|
$this->Row = $pos;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
function metadata($table) {
|
||||||
|
$count = 0;
|
||||||
|
$id = 0;
|
||||||
|
$res = array();
|
||||||
|
|
||||||
|
$this->connect();
|
||||||
|
$id = @msql_list_fields($this->Database, $table);
|
||||||
|
if ($id < 0) {
|
||||||
|
$this->Error = msql_error();
|
||||||
|
$this->halt("Metadata query failed.");
|
||||||
|
}
|
||||||
|
$count = msql_num_fields($id);
|
||||||
|
|
||||||
|
for ($i=0; $i<$count; $i++) {
|
||||||
|
$res[$i]["table"] = msql_fieldtable ($id, $i);
|
||||||
|
$res[$i]["name"] = msql_fieldname ($id, $i);
|
||||||
|
$res[$i]["type"] = msql_fieldtype ($id, $i);
|
||||||
|
$res[$i]["len"] = msql_fieldlen ($id, $i);
|
||||||
|
$res[$i]["flags"] = msql_fieldflags ($id, $i);
|
||||||
|
$res["meta"][$res[$i]["name"]] = $i;
|
||||||
|
$res["num_fields"]= $count;
|
||||||
|
}
|
||||||
|
|
||||||
|
msql_free_result($id);
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
function affected_rows() {
|
||||||
|
return msql_affected_rows($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function num_rows() {
|
||||||
|
return msql_num_rows($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function num_fields() {
|
||||||
|
return msql_num_fields($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function nf() {
|
||||||
|
return $this->num_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
function np() {
|
||||||
|
print $this->num_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
function f($Name) {
|
||||||
|
return $this->Record[$Name];
|
||||||
|
}
|
||||||
|
|
||||||
|
function p($Name) {
|
||||||
|
print $this->Record[$Name];
|
||||||
|
}
|
||||||
|
|
||||||
|
function halt($msg) {
|
||||||
|
printf("<b>Database error:</b> %s<br>\n", $msg);
|
||||||
|
printf("<b>MSQL Error</b>: %s<br>\n", $this->Error);
|
||||||
|
die("Session halted.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
146
phpgwapi/phpgw_db_mssql.inc.php
Normal file
146
phpgwapi/phpgw_db_mssql.inc.php
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Session Management for PHP3
|
||||||
|
*
|
||||||
|
* (C) Copyright 1998 Cameron Taggart (cameront@wolfenet.com)
|
||||||
|
* Modified by Guarneri carmelo (carmelo@melting-soft.com)
|
||||||
|
* Modified by Cameron Just (C.Just@its.uq.edu.au)
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
# echo "<BR>This is using the MSSQL class<BR>";
|
||||||
|
|
||||||
|
class db {
|
||||||
|
var $Host = "";
|
||||||
|
var $Database = "";
|
||||||
|
var $User = "";
|
||||||
|
var $Password = "";
|
||||||
|
|
||||||
|
var $Link_ID = 0;
|
||||||
|
var $Query_ID = 0;
|
||||||
|
var $Record = array();
|
||||||
|
var $Row = 0;
|
||||||
|
|
||||||
|
var $Errno = 0;
|
||||||
|
var $Error = "";
|
||||||
|
|
||||||
|
var $Auto_Free = 0; ## set this to 1 to automatically free results
|
||||||
|
|
||||||
|
|
||||||
|
function connect() {
|
||||||
|
if ( 0 == $this->Link_ID ) {
|
||||||
|
$this->Link_ID=mssql_pconnect($this->Host, $this->User, $this->Password);
|
||||||
|
if (!$this->Link_ID)
|
||||||
|
$this->halt("Link-ID == false, mssql_pconnect failed");
|
||||||
|
else
|
||||||
|
mssql_select_db($this->Database, $this->Link_ID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function free_result(){
|
||||||
|
mssql_free_result($this->Query_ID);
|
||||||
|
$this->Query_ID = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function query($Query_String) {
|
||||||
|
if (!$this->Link_ID)
|
||||||
|
$this->connect();
|
||||||
|
|
||||||
|
# printf("<br>Debug: query = %s<br>\n", $Query_String);
|
||||||
|
|
||||||
|
$this->Query_ID = mssql_query($Query_String, $this->Link_ID);
|
||||||
|
$this->Row = 0;
|
||||||
|
if (!$this->Query_ID) {
|
||||||
|
$this->Errno = 1;
|
||||||
|
$this->Error = "General Error (The MSSQL interface cannot return detailed error messages).";
|
||||||
|
$this->halt("Invalid SQL: ".$Query_String);
|
||||||
|
}
|
||||||
|
return $this->Query_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
function next_record() {
|
||||||
|
|
||||||
|
if ($this->Record = mssql_fetch_row($this->Query_ID)) {
|
||||||
|
// add to Record[<key>]
|
||||||
|
$count = mssql_num_fields($this->Query_ID);
|
||||||
|
for ($i=0; $i<$count; $i++){
|
||||||
|
$fieldinfo = mssql_fetch_field($this->Query_ID,$i);
|
||||||
|
$this->Record[strtolower($fieldinfo->name)] = $this->Record[$i];
|
||||||
|
}
|
||||||
|
$this->Row += 1;
|
||||||
|
$stat = 1;
|
||||||
|
} else {
|
||||||
|
if ($this->Auto_Free) {
|
||||||
|
$this->free_result();
|
||||||
|
}
|
||||||
|
$stat = 0;
|
||||||
|
}
|
||||||
|
return $stat;
|
||||||
|
}
|
||||||
|
|
||||||
|
function seek($pos) {
|
||||||
|
mssql_data_seek($this->Query_ID,$pos);
|
||||||
|
$this->Row = $pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
function metadata($table) {
|
||||||
|
$count = 0;
|
||||||
|
$id = 0;
|
||||||
|
$res = array();
|
||||||
|
|
||||||
|
$this->connect();
|
||||||
|
$id = mssql_query("select * from $table", $this->Link_ID);
|
||||||
|
if (!$id) {
|
||||||
|
$this->Errno = 1;
|
||||||
|
$this->Error = "General Error (The MSSQL interface cannot return detailed error messages).";
|
||||||
|
$this->halt("Metadata query failed.");
|
||||||
|
}
|
||||||
|
$count = mssql_num_fields($id);
|
||||||
|
|
||||||
|
for ($i=0; $i<$count; $i++) {
|
||||||
|
$info = mssql_fetch_field($id, $i);
|
||||||
|
$res[$i]["table"] = $table;
|
||||||
|
$res[$i]["name"] = $info["name"];
|
||||||
|
$res[$i]["len"] = $info["max_length"];
|
||||||
|
$res[$i]["flags"] = $info["numeric"];
|
||||||
|
}
|
||||||
|
$this->free_result();
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
function affected_rows() {
|
||||||
|
return mssql_affected_rows($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function num_rows() {
|
||||||
|
return mssql_num_rows($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function num_fields() {
|
||||||
|
return mssql_num_fields($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function nf() {
|
||||||
|
return $this->num_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
function np() {
|
||||||
|
print $this->num_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
function f($Field_Name) {
|
||||||
|
return $this->Record[strtolower($Field_Name)];
|
||||||
|
}
|
||||||
|
|
||||||
|
function p($Field_Name) {
|
||||||
|
print $this->f($Field_Name);
|
||||||
|
}
|
||||||
|
|
||||||
|
function halt($msg) {
|
||||||
|
printf("<b>Database error:</b> %s<br>\n", $msg);
|
||||||
|
printf("<b>MSSQL Error</b>: %s (%s)<br>\n",
|
||||||
|
$this->Errno,
|
||||||
|
$this->Error);
|
||||||
|
die("Session halted.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
394
phpgwapi/phpgw_db_mysql.inc.php
Normal file
394
phpgwapi/phpgw_db_mysql.inc.php
Normal file
@ -0,0 +1,394 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Session Management for PHP3
|
||||||
|
*
|
||||||
|
* Copyright (c) 1998-2000 NetUSE AG
|
||||||
|
* Boris Erdmann, Kristian Koehntopp
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
class db {
|
||||||
|
|
||||||
|
/* public: connection parameters */
|
||||||
|
var $Host = "";
|
||||||
|
var $Database = "";
|
||||||
|
var $User = "";
|
||||||
|
var $Password = "";
|
||||||
|
|
||||||
|
/* public: configuration parameters */
|
||||||
|
var $Auto_Free = 0; ## Set to 1 for automatic mysql_free_result()
|
||||||
|
var $Debug = 0; ## Set to 1 for debugging messages.
|
||||||
|
var $Halt_On_Error = "yes"; ## "yes" (halt with message), "no" (ignore errors quietly), "report" (ignore errror, but spit a warning)
|
||||||
|
var $Seq_Table = "db_sequence";
|
||||||
|
|
||||||
|
/* public: result array and current row number */
|
||||||
|
var $Record = array();
|
||||||
|
var $Row;
|
||||||
|
|
||||||
|
/* public: current error number and error text */
|
||||||
|
var $Errno = 0;
|
||||||
|
var $Error = "";
|
||||||
|
|
||||||
|
/* public: this is an api revision, not a CVS revision. */
|
||||||
|
var $type = "mysql";
|
||||||
|
var $revision = "1.2";
|
||||||
|
|
||||||
|
/* private: link and query handles */
|
||||||
|
var $Link_ID = 0;
|
||||||
|
var $Query_ID = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* public: constructor */
|
||||||
|
function db($query = "") {
|
||||||
|
$this->query($query);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: some trivial reporting */
|
||||||
|
function link_id() {
|
||||||
|
return $this->Link_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
function query_id() {
|
||||||
|
return $this->Query_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: connection management */
|
||||||
|
function connect($Database = "", $Host = "", $User = "", $Password = "") {
|
||||||
|
/* Handle defaults */
|
||||||
|
if ("" == $Database)
|
||||||
|
$Database = $this->Database;
|
||||||
|
if ("" == $Host)
|
||||||
|
$Host = $this->Host;
|
||||||
|
if ("" == $User)
|
||||||
|
$User = $this->User;
|
||||||
|
if ("" == $Password)
|
||||||
|
$Password = $this->Password;
|
||||||
|
|
||||||
|
/* establish connection, select database */
|
||||||
|
if ( 0 == $this->Link_ID ) {
|
||||||
|
|
||||||
|
$this->Link_ID=mysql_pconnect($Host, $User, $Password);
|
||||||
|
if (!$this->Link_ID) {
|
||||||
|
$this->halt("pconnect($Host, $User, \$Password) failed.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!@mysql_select_db($Database,$this->Link_ID)) {
|
||||||
|
$this->halt("cannot use database ".$this->Database);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->Link_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This only affects systems not using persistant connections
|
||||||
|
function disconnect()
|
||||||
|
{
|
||||||
|
return mysql_close($this->Link_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: discard the query result */
|
||||||
|
function free() {
|
||||||
|
@mysql_free_result($this->Query_ID);
|
||||||
|
$this->Query_ID = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: perform a query */
|
||||||
|
// I added the line and file section so we can have better error reporting. (jengo)
|
||||||
|
function query($Query_String, $line = "", $file = "") {
|
||||||
|
/* No empty queries, please, since PHP4 chokes on them. */
|
||||||
|
if ($Query_String == "")
|
||||||
|
/* The empty query string is passed on from the constructor,
|
||||||
|
* when calling the class without a query, e.g. in situations
|
||||||
|
* like these: '$db = new db_Subclass;'
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!$this->connect()) {
|
||||||
|
return 0; /* we already complained in connect() about that. */
|
||||||
|
};
|
||||||
|
|
||||||
|
# New query, discard previous result.
|
||||||
|
if ($this->Query_ID) {
|
||||||
|
$this->free();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->Debug)
|
||||||
|
printf("Debug: query = %s<br>\n", $Query_String);
|
||||||
|
|
||||||
|
$this->Query_ID = @mysql_query($Query_String,$this->Link_ID);
|
||||||
|
$this->Row = 0;
|
||||||
|
$this->Errno = mysql_errno();
|
||||||
|
$this->Error = mysql_error();
|
||||||
|
if (! $this->Query_ID) {
|
||||||
|
$this->halt("Invalid SQL: ".$Query_String, $line, $file);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Will return nada if it fails. That's fine.
|
||||||
|
return $this->Query_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: walk result set */
|
||||||
|
function next_record() {
|
||||||
|
if (!$this->Query_ID) {
|
||||||
|
$this->halt("next_record called with no query pending.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->Record = @mysql_fetch_array($this->Query_ID);
|
||||||
|
$this->Row += 1;
|
||||||
|
$this->Errno = mysql_errno();
|
||||||
|
$this->Error = mysql_error();
|
||||||
|
|
||||||
|
$stat = is_array($this->Record);
|
||||||
|
if (!$stat && $this->Auto_Free) {
|
||||||
|
$this->free();
|
||||||
|
}
|
||||||
|
return $stat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: position in result set */
|
||||||
|
function seek($pos = 0) {
|
||||||
|
$status = @mysql_data_seek($this->Query_ID, $pos);
|
||||||
|
if ($status)
|
||||||
|
$this->Row = $pos;
|
||||||
|
else {
|
||||||
|
$this->halt("seek($pos) failed: result has ".$this->num_rows()." rows");
|
||||||
|
|
||||||
|
/* half assed attempt to save the day,
|
||||||
|
* but do not consider this documented or even
|
||||||
|
* desireable behaviour.
|
||||||
|
*/
|
||||||
|
@mysql_data_seek($this->Query_ID, $this->num_rows());
|
||||||
|
$this->Row = $this->num_rows;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: table locking */
|
||||||
|
function lock($table, $mode="write") {
|
||||||
|
$this->connect();
|
||||||
|
|
||||||
|
$query="lock tables ";
|
||||||
|
if (is_array($table)) {
|
||||||
|
while (list($key,$value)=each($table)) {
|
||||||
|
if ($key=="read" && $key!=0) {
|
||||||
|
$query.="$value read, ";
|
||||||
|
} else {
|
||||||
|
$query.="$value $mode, ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$query=substr($query,0,-2);
|
||||||
|
} else {
|
||||||
|
$query.="$table $mode";
|
||||||
|
}
|
||||||
|
$res = @mysql_query($query, $this->Link_ID);
|
||||||
|
if (!$res) {
|
||||||
|
$this->halt("lock($table, $mode) failed.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
function unlock() {
|
||||||
|
$this->connect();
|
||||||
|
|
||||||
|
$res = @mysql_query("unlock tables");
|
||||||
|
if (!$res) {
|
||||||
|
$this->halt("unlock() failed.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* public: evaluate the result (size, width) */
|
||||||
|
function affected_rows() {
|
||||||
|
return @mysql_affected_rows($this->Link_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function num_rows() {
|
||||||
|
return @mysql_num_rows($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function num_fields() {
|
||||||
|
return @mysql_num_fields($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: shorthand notation */
|
||||||
|
function nf() {
|
||||||
|
return $this->num_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
function np() {
|
||||||
|
print $this->num_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
function f($Name) {
|
||||||
|
return $this->Record[$Name];
|
||||||
|
}
|
||||||
|
|
||||||
|
function p($Name) {
|
||||||
|
print $this->Record[$Name];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: sequence numbers */
|
||||||
|
function nextid($seq_name) {
|
||||||
|
$this->connect();
|
||||||
|
|
||||||
|
if ($this->lock($this->Seq_Table)) {
|
||||||
|
/* get sequence number (locked) and increment */
|
||||||
|
$q = sprintf("select nextid from %s where seq_name = '%s'",
|
||||||
|
$this->Seq_Table,
|
||||||
|
$seq_name);
|
||||||
|
$id = @mysql_query($q, $this->Link_ID);
|
||||||
|
$res = @mysql_fetch_array($id);
|
||||||
|
|
||||||
|
/* No current value, make one */
|
||||||
|
if (!is_array($res)) {
|
||||||
|
$currentid = 0;
|
||||||
|
$q = sprintf("insert into %s values('%s', %s)",
|
||||||
|
$this->Seq_Table,
|
||||||
|
$seq_name,
|
||||||
|
$currentid);
|
||||||
|
$id = @mysql_query($q, $this->Link_ID);
|
||||||
|
} else {
|
||||||
|
$currentid = $res["nextid"];
|
||||||
|
}
|
||||||
|
$nextid = $currentid + 1;
|
||||||
|
$q = sprintf("update %s set nextid = '%s' where seq_name = '%s'",
|
||||||
|
$this->Seq_Table,
|
||||||
|
$nextid,
|
||||||
|
$seq_name);
|
||||||
|
$id = @mysql_query($q, $this->Link_ID);
|
||||||
|
$this->unlock();
|
||||||
|
} else {
|
||||||
|
$this->halt("cannot lock ".$this->Seq_Table." - has it been created?");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return $nextid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: return table metadata */
|
||||||
|
function metadata($table='',$full=false) {
|
||||||
|
$count = 0;
|
||||||
|
$id = 0;
|
||||||
|
$res = array();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Due to compatibility problems with Table we changed the behavior
|
||||||
|
* of metadata();
|
||||||
|
* depending on $full, metadata returns the following values:
|
||||||
|
*
|
||||||
|
* - full is false (default):
|
||||||
|
* $result[]:
|
||||||
|
* [0]["table"] table name
|
||||||
|
* [0]["name"] field name
|
||||||
|
* [0]["type"] field type
|
||||||
|
* [0]["len"] field length
|
||||||
|
* [0]["flags"] field flags
|
||||||
|
*
|
||||||
|
* - full is true
|
||||||
|
* $result[]:
|
||||||
|
* ["num_fields"] number of metadata records
|
||||||
|
* [0]["table"] table name
|
||||||
|
* [0]["name"] field name
|
||||||
|
* [0]["type"] field type
|
||||||
|
* [0]["len"] field length
|
||||||
|
* [0]["flags"] field flags
|
||||||
|
* ["meta"][field name] index of field named "field name"
|
||||||
|
* The last one is used, if you have a field name, but no index.
|
||||||
|
* Test: if (isset($result['meta']['myfield'])) { ...
|
||||||
|
*/
|
||||||
|
|
||||||
|
// if no $table specified, assume that we are working with a query
|
||||||
|
// result
|
||||||
|
if ($table) {
|
||||||
|
$this->connect();
|
||||||
|
$id = @mysql_list_fields($this->Database, $table);
|
||||||
|
if (!$id)
|
||||||
|
$this->halt("Metadata query failed.");
|
||||||
|
} else {
|
||||||
|
$id = $this->Query_ID;
|
||||||
|
if (!$id)
|
||||||
|
$this->halt("No query specified.");
|
||||||
|
}
|
||||||
|
|
||||||
|
$count = @mysql_num_fields($id);
|
||||||
|
|
||||||
|
// made this IF due to performance (one if is faster than $count if's)
|
||||||
|
if (!$full) {
|
||||||
|
for ($i=0; $i<$count; $i++) {
|
||||||
|
$res[$i]["table"] = @mysql_field_table ($id, $i);
|
||||||
|
$res[$i]["name"] = @mysql_field_name ($id, $i);
|
||||||
|
$res[$i]["type"] = @mysql_field_type ($id, $i);
|
||||||
|
$res[$i]["len"] = @mysql_field_len ($id, $i);
|
||||||
|
$res[$i]["flags"] = @mysql_field_flags ($id, $i);
|
||||||
|
}
|
||||||
|
} else { // full
|
||||||
|
$res["num_fields"]= $count;
|
||||||
|
|
||||||
|
for ($i=0; $i<$count; $i++) {
|
||||||
|
$res[$i]["table"] = @mysql_field_table ($id, $i);
|
||||||
|
$res[$i]["name"] = @mysql_field_name ($id, $i);
|
||||||
|
$res[$i]["type"] = @mysql_field_type ($id, $i);
|
||||||
|
$res[$i]["len"] = @mysql_field_len ($id, $i);
|
||||||
|
$res[$i]["flags"] = @mysql_field_flags ($id, $i);
|
||||||
|
$res["meta"][$res[$i]["name"]] = $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// free the result only if we were called on a table
|
||||||
|
if ($table) @mysql_free_result($id);
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* private: error handling */
|
||||||
|
function halt($msg, $line = "", $file = "") {
|
||||||
|
$this->unlock(); // Just in case there is a table currently locked
|
||||||
|
|
||||||
|
$this->Error = @mysql_error($this->Link_ID);
|
||||||
|
$this->Errno = @mysql_errno($this->Link_ID);
|
||||||
|
if ($this->Halt_On_Error == "no")
|
||||||
|
return;
|
||||||
|
|
||||||
|
$this->haltmsg($msg);
|
||||||
|
|
||||||
|
if ($file) {
|
||||||
|
printf("<br><b>File:</b> %s",$file);
|
||||||
|
}
|
||||||
|
if ($line) {
|
||||||
|
printf("<br><b>Line:</b> %s",$line);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->Halt_On_Error != "report")
|
||||||
|
die("<p><b>Session halted.</b>");
|
||||||
|
}
|
||||||
|
|
||||||
|
function haltmsg($msg)
|
||||||
|
{
|
||||||
|
printf("<b>Database error:</b> %s<br>\n", $msg);
|
||||||
|
if ($this->Errno != "0" && $this->Error != "()") {
|
||||||
|
printf("<b>MySQL Error</b>: %s (%s)<br>\n",$this->Errno,$this->Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function table_names() {
|
||||||
|
$this->query("SHOW TABLES");
|
||||||
|
$i=0;
|
||||||
|
while ($info=mysql_fetch_row($this->Query_ID))
|
||||||
|
{
|
||||||
|
$return[$i]["table_name"]= $info[0];
|
||||||
|
$return[$i]["tablespace_name"]=$this->Database;
|
||||||
|
$return[$i]["database"]=$this->Database;
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
}
|
172
phpgwapi/phpgw_db_odbc.inc.php
Normal file
172
phpgwapi/phpgw_db_odbc.inc.php
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Session Management for PHP3
|
||||||
|
*
|
||||||
|
* Copyright (c) 1998,1999 Cameron Taggart (cameront@wolfenet.com)
|
||||||
|
* Modified by Guarneri carmelo (carmelo@melting-soft.com)
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
class db {
|
||||||
|
var $Host = "";
|
||||||
|
var $Database = "";
|
||||||
|
var $User = "";
|
||||||
|
var $Password = "";
|
||||||
|
var $UseODBCCursor = 0;
|
||||||
|
|
||||||
|
var $Link_ID = 0;
|
||||||
|
var $Query_ID = 0;
|
||||||
|
var $Record = array();
|
||||||
|
var $Row = 0;
|
||||||
|
|
||||||
|
var $Errno = 0;
|
||||||
|
var $Error = "";
|
||||||
|
|
||||||
|
var $Auto_Free = 0; ## set this to 1 to automatically free results
|
||||||
|
|
||||||
|
function connect() {
|
||||||
|
if ( 0 == $this->Link_ID ) {
|
||||||
|
$this->Link_ID=odbc_pconnect($this->Database, $this->User, $this->Password, $this->UseODBCCursor);
|
||||||
|
if (!$this->Link_ID) {
|
||||||
|
$this->halt("Link-ID == false, odbc_pconnect failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function query($Query_String) {
|
||||||
|
$this->connect();
|
||||||
|
|
||||||
|
# printf("<br>Debug: query = %s<br>\n", $Query_String);
|
||||||
|
|
||||||
|
# rei@netone.com.br suggested that we use this instead of the odbc_exec().
|
||||||
|
# He is on NT, connecting to a Unix MySQL server with ODBC. -- KK
|
||||||
|
# $this->Query_ID = odbc_prepare($this->Link_ID,$Query_String);
|
||||||
|
# $this->Query_Ok = odbc_execute($this->Query_ID);
|
||||||
|
|
||||||
|
$this->Query_ID = odbc_exec($this->Link_ID,$Query_String);
|
||||||
|
$this->Row = 0;
|
||||||
|
odbc_binmode($this->Query_ID, 1);
|
||||||
|
odbc_longreadlen($this->Query_ID, 4096);
|
||||||
|
|
||||||
|
if (!$this->Query_ID) {
|
||||||
|
$this->Errno = 1;
|
||||||
|
$this->Error = "General Error (The ODBC interface cannot return detailed error messages).";
|
||||||
|
$this->halt("Invalid SQL: ".$Query_String);
|
||||||
|
}
|
||||||
|
return $this->Query_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
function next_record() {
|
||||||
|
$this->Record = array();
|
||||||
|
$stat = odbc_fetch_into($this->Query_ID, ++$this->Row, &$this->Record);
|
||||||
|
if (!$stat) {
|
||||||
|
if ($this->Auto_Free) {
|
||||||
|
odbc_free_result($this->Query_ID);
|
||||||
|
$this->Query_ID = 0;
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
// add to Record[<key>]
|
||||||
|
$count = odbc_num_fields($this->Query_ID);
|
||||||
|
for ($i=1; $i<=$count; $i++)
|
||||||
|
$this->Record[strtolower(odbc_field_name ($this->Query_ID, $i)) ] = $this->Record[ $i - 1 ];
|
||||||
|
}
|
||||||
|
return $stat;
|
||||||
|
}
|
||||||
|
|
||||||
|
function seek($pos) {
|
||||||
|
$this->Row = $pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
function metadata($table) {
|
||||||
|
$count = 0;
|
||||||
|
$id = 0;
|
||||||
|
$res = array();
|
||||||
|
|
||||||
|
$this->connect();
|
||||||
|
$id = odbc_exec($this->Link_ID, "select * from $table");
|
||||||
|
if (!$id) {
|
||||||
|
$this->Errno = 1;
|
||||||
|
$this->Error = "General Error (The ODBC interface cannot return detailed error messages).";
|
||||||
|
$this->halt("Metadata query failed.");
|
||||||
|
}
|
||||||
|
$count = odbc_num_fields($id);
|
||||||
|
|
||||||
|
for ($i=1; $i<=$count; $i++) {
|
||||||
|
$res[$i]["table"] = $table;
|
||||||
|
$name = odbc_field_name ($id, $i);
|
||||||
|
$res[$i]["name"] = $name;
|
||||||
|
$res[$i]["type"] = odbc_field_type ($id, $name);
|
||||||
|
$res[$i]["len"] = 0; // can we determine the width of this column?
|
||||||
|
$res[$i]["flags"] = ""; // any optional flags to report?
|
||||||
|
}
|
||||||
|
|
||||||
|
odbc_free_result($id);
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
function affected_rows() {
|
||||||
|
return odbc_num_rows($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function num_rows() {
|
||||||
|
# Many ODBC drivers don't support odbc_num_rows() on SELECT statements.
|
||||||
|
$num_rows = odbc_num_rows($this->Query_ID);
|
||||||
|
//printf ($num_rows."<br>");
|
||||||
|
|
||||||
|
# This is a workaround. It is intended to be ugly.
|
||||||
|
if ($num_rows < 0) {
|
||||||
|
$i=10;
|
||||||
|
while (odbc_fetch_row($this->Query_ID, $i))
|
||||||
|
$i*=10;
|
||||||
|
|
||||||
|
$j=0;
|
||||||
|
while ($i!=$j) {
|
||||||
|
$k= $j+intval(($i-$j)/2);
|
||||||
|
if (odbc_fetch_row($this->Query_ID, $k))
|
||||||
|
$j=$k;
|
||||||
|
else
|
||||||
|
$i=$k;
|
||||||
|
if (($i-$j)==1) {
|
||||||
|
if (odbc_fetch_row($this->Query_ID, $i))
|
||||||
|
$j=$i;
|
||||||
|
else
|
||||||
|
$i=$j;
|
||||||
|
};
|
||||||
|
//printf("$i $j $k <br>");
|
||||||
|
};
|
||||||
|
$num_rows=$i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $num_rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
function num_fields() {
|
||||||
|
return count($this->Record)/2;
|
||||||
|
}
|
||||||
|
|
||||||
|
function nf() {
|
||||||
|
return $this->num_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
function np() {
|
||||||
|
print $this->num_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
function f($Field_Name) {
|
||||||
|
return $this->Record[strtolower($Field_Name)];
|
||||||
|
}
|
||||||
|
|
||||||
|
function p($Field_Name) {
|
||||||
|
print $this->f($Field_Name);
|
||||||
|
}
|
||||||
|
|
||||||
|
function halt($msg) {
|
||||||
|
printf("<b>Database error:</b> %s<br>\n", $msg);
|
||||||
|
printf("<b>ODBC Error</b>: %s (%s)<br>\n",
|
||||||
|
$this->Errno,
|
||||||
|
$this->Error);
|
||||||
|
die("Session halted.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
432
phpgwapi/phpgw_db_oracle.inc.php
Normal file
432
phpgwapi/phpgw_db_oracle.inc.php
Normal file
@ -0,0 +1,432 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Oracle accessor based on Session Management for PHP3
|
||||||
|
*
|
||||||
|
* Copyright (c) 1998-2000 Luis Francisco Gonzalez Hernandez
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
class db {
|
||||||
|
var $Debug = false;
|
||||||
|
var $Home = "/u01/app/oracle/product/8.0.4";
|
||||||
|
var $Remote = 1;
|
||||||
|
/* Due to a strange error with Oracle 8.0.5, Apache and PHP3.0.6
|
||||||
|
you don't need to set the ENV - on my system Apache
|
||||||
|
will change to a zombie, if I don't set this to FALSE!
|
||||||
|
If unsure try it out, if it works. */
|
||||||
|
var $OraPutEnv = true;
|
||||||
|
|
||||||
|
var $Database = "";
|
||||||
|
var $User = "";
|
||||||
|
var $Password = "";
|
||||||
|
|
||||||
|
var $Link_ID = 0;
|
||||||
|
var $Query_ID = 0;
|
||||||
|
var $Record = array();
|
||||||
|
var $Row;
|
||||||
|
|
||||||
|
var $Errno = 0;
|
||||||
|
var $Error = "";
|
||||||
|
var $ora_no_next_fetch=false;
|
||||||
|
|
||||||
|
|
||||||
|
/* copied from db_mysql for completeness */
|
||||||
|
/* public: identification constant. never change this. */
|
||||||
|
var $type = "oracle";
|
||||||
|
var $revision = "1.2";
|
||||||
|
|
||||||
|
var $Halt_On_Error = "yes"; ## "yes" (halt with message), "no" (ignore errors quietly), "report" (ignore errror, but spit a warning)
|
||||||
|
|
||||||
|
/* public: constructor */
|
||||||
|
function db($query = "") {
|
||||||
|
$this->query($query);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: some trivial reporting */
|
||||||
|
function link_id() {
|
||||||
|
return $this->Link_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
function query_id() {
|
||||||
|
return $this->Query_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
function connect() {
|
||||||
|
## see above why we do this
|
||||||
|
if ($this->OraPutEnv) {
|
||||||
|
PutEnv("ORACLE_SID=$this->Database");
|
||||||
|
PutEnv("ORACLE_HOME=$this->Home");
|
||||||
|
}
|
||||||
|
if ( 0 == $this->Link_ID ) {
|
||||||
|
if($this->Debug) {
|
||||||
|
printf("<br>Connect()ing to $this->Database...<br>\n");
|
||||||
|
}
|
||||||
|
if($this->Remote) {
|
||||||
|
if($this->Debug) {
|
||||||
|
printf("<br>connect() $this->User/******@$this->Database.world<br>\n");
|
||||||
|
}
|
||||||
|
$this->Link_ID=ora_plogon
|
||||||
|
("$this->User/$this->Password@$this->Database","");
|
||||||
|
/************** (comment by SSilk)
|
||||||
|
this dosn't work on my system:
|
||||||
|
$this->Link_ID=ora_plogon
|
||||||
|
("$this->User@$this->Database.world","$this->Password");
|
||||||
|
***************/
|
||||||
|
} else {
|
||||||
|
if($this->Debug) {
|
||||||
|
printf("<br>connect() $this->User, $this->Password <br>\n");
|
||||||
|
}
|
||||||
|
$this->Link_ID=ora_plogon("$this->User","$this->Password");
|
||||||
|
/* (comment by SSilk: don't know how this could work, but I leave this untouched!) */
|
||||||
|
}
|
||||||
|
if($this->Debug) {
|
||||||
|
printf("<br>connect() Link_ID: $this->Link_ID<br>\n");
|
||||||
|
}
|
||||||
|
if (!$this->Link_ID) {
|
||||||
|
$this->halt("connect() Link-ID == false " .
|
||||||
|
"($this->Link_ID), ora_plogon failed");
|
||||||
|
} else {
|
||||||
|
//echo "commit on<p>";
|
||||||
|
ora_commiton($this->Link_ID);
|
||||||
|
}
|
||||||
|
if($this->Debug) {
|
||||||
|
printf("<br>connect() Obtained the Link_ID: $this->Link_ID<br>\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
## In order to increase the # of cursors per system/user go edit the
|
||||||
|
## init.ora file and increase the max_open_cursors parameter. Yours is on
|
||||||
|
## the default value, 100 per user.
|
||||||
|
## We tried to change the behaviour of query() in a way, that it tries
|
||||||
|
## to safe cursors, but on the other side be carefull with this, that you
|
||||||
|
## don't use an old result.
|
||||||
|
##
|
||||||
|
## You can also make extensive use of ->disconnect()!
|
||||||
|
## The unused QueryIDs will be recycled sometimes.
|
||||||
|
|
||||||
|
function query($Query_String) {
|
||||||
|
|
||||||
|
/* No empty queries, please, since PHP4 chokes on them. */
|
||||||
|
if ($Query_String == "")
|
||||||
|
/* The empty query string is passed on from the constructor,
|
||||||
|
* when calling the class without a query, e.g. in situations
|
||||||
|
* like these: '$db = new DB_Sql_Subclass;'
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
$this->connect();
|
||||||
|
$this->lastQuery=$Query_String;
|
||||||
|
|
||||||
|
if (!$this->Query_ID) {
|
||||||
|
$this->Query_ID= ora_open($this->Link_ID);
|
||||||
|
}
|
||||||
|
if($this->Debug) {
|
||||||
|
printf("Debug: query = %s<br>\n", $Query_String);
|
||||||
|
printf("<br>Debug: Query_ID: %d<br>\n", $this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!@ora_parse($this->Query_ID,$Query_String)) {
|
||||||
|
$this->Errno=ora_errorcode($this->Query_ID);
|
||||||
|
$this->Error=ora_error($this->Query_ID);
|
||||||
|
$this->halt("<BR>ora_parse() failed:<BR>$Query_String<BR><small>Snap & paste this to sqlplus!</SMALL>");
|
||||||
|
} elseif (!@ora_exec($this->Query_ID)) {
|
||||||
|
$this->Errno=ora_errorcode($this->Query_ID);
|
||||||
|
$this->Error=ora_error($this->Query_ID);
|
||||||
|
$this->halt("<BR>\n$Query_String\n<BR><small>Snap & paste this to sqlplus!</SMALL>");
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->Row=0;
|
||||||
|
|
||||||
|
if(!$this->Query_ID) {
|
||||||
|
$this->halt("Invalid SQL: ".$Query_String);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->Query_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
function next_record() {
|
||||||
|
if (!$this->no_next_fetch &&
|
||||||
|
0 == ora_fetch($this->Query_ID)) {
|
||||||
|
if ($this->Debug) {
|
||||||
|
printf("<br>next_record(): ID: %d,Rows: %d<br>\n",
|
||||||
|
$this->Query_ID,$this->num_rows());
|
||||||
|
}
|
||||||
|
$this->Row +=1;
|
||||||
|
|
||||||
|
$errno=ora_errorcode($this->Query_ID);
|
||||||
|
if(1403 == $errno) { # 1043 means no more records found
|
||||||
|
$this->Errno=0;
|
||||||
|
$this->Error="";
|
||||||
|
$this->disconnect();
|
||||||
|
$stat=0;
|
||||||
|
} else {
|
||||||
|
$this->Error=ora_error($this->Query_ID);
|
||||||
|
$this->Errno=$errno;
|
||||||
|
if($this->Debug) {
|
||||||
|
printf("<br>%d Error: %s",
|
||||||
|
$this->Errno,
|
||||||
|
$this->Error);
|
||||||
|
}
|
||||||
|
$stat=0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->no_next_fetch=false;
|
||||||
|
for($ix=0;$ix<ora_numcols($this->Query_ID);$ix++) {
|
||||||
|
$col=strtolower(ora_columnname($this->Query_ID,$ix));
|
||||||
|
$value=ora_getcolumn($this->Query_ID,$ix);
|
||||||
|
$this->Record[ "$col" ] = $value;
|
||||||
|
# echo"<b>[$col]</b>: $value <br>\n";
|
||||||
|
}
|
||||||
|
$stat=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $stat;
|
||||||
|
}
|
||||||
|
|
||||||
|
## seek() works only for $pos - 1 and $pos
|
||||||
|
## Perhaps I make a own implementation, but my
|
||||||
|
## opinion is, that this should be done by PHP3
|
||||||
|
function seek($pos) {
|
||||||
|
if ($this->Row - 1 == $pos) {
|
||||||
|
$this->no_next_fetch=true;
|
||||||
|
} elseif ($this->Row == $pos ) {
|
||||||
|
## do nothing
|
||||||
|
} else {
|
||||||
|
$this->halt("Invalid seek(): Position is cannot be handled by API.<BR>".
|
||||||
|
"Difference too big. Wanted: $pos Current pos: $this->Row");
|
||||||
|
}
|
||||||
|
if ($Debug) echo "<BR>Debug: seek = $pos<BR>";
|
||||||
|
$this->Row=$pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
function lock($table, $mode = "write") {
|
||||||
|
if ($mode == "write") {
|
||||||
|
$result = ora_do($this->Link_ID, "lock table $table in row exclusive mode");
|
||||||
|
} else {
|
||||||
|
$result = 1;
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function unlock() {
|
||||||
|
return ora_do($this->Link_ID, "commit");
|
||||||
|
}
|
||||||
|
|
||||||
|
function metadata($table,$full=false) {
|
||||||
|
$count = 0;
|
||||||
|
$id = 0;
|
||||||
|
$res = array();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Due to compatibility problems with Table we changed the behavior
|
||||||
|
* of metadata();
|
||||||
|
* depending on $full, metadata returns the following values:
|
||||||
|
*
|
||||||
|
* - full is false (default):
|
||||||
|
* $result[]:
|
||||||
|
* [0]["table"] table name
|
||||||
|
* [0]["name"] field name
|
||||||
|
* [0]["type"] field type
|
||||||
|
* [0]["len"] field length
|
||||||
|
* [0]["flags"] field flags ("NOT NULL", "INDEX")
|
||||||
|
* [0]["format"] precision and scale of number (eg. "10,2") or empty
|
||||||
|
* [0]["index"] name of index (if has one)
|
||||||
|
* [0]["chars"] number of chars (if any char-type)
|
||||||
|
*
|
||||||
|
* - full is true
|
||||||
|
* $result[]:
|
||||||
|
* ["num_fields"] number of metadata records
|
||||||
|
* [0]["table"] table name
|
||||||
|
* [0]["name"] field name
|
||||||
|
* [0]["type"] field type
|
||||||
|
* [0]["len"] field length
|
||||||
|
* [0]["flags"] field flags ("NOT NULL", "INDEX")
|
||||||
|
* [0]["format"] precision and scale of number (eg. "10,2") or empty
|
||||||
|
* [0]["index"] name of index (if has one)
|
||||||
|
* [0]["chars"] number of chars (if any char-type)
|
||||||
|
* ["meta"][field name] index of field named "field name"
|
||||||
|
* The last one is used, if you have a field name, but no index.
|
||||||
|
* Test: if (isset($result['meta']['myfield'])) {} ...
|
||||||
|
*/
|
||||||
|
|
||||||
|
$this->connect();
|
||||||
|
|
||||||
|
## This is a RIGHT OUTER JOIN: "(+)", if you want to see, what
|
||||||
|
## this query results try the following:
|
||||||
|
## $table = new Table; $db = new my_DB_Sql; # you have to make
|
||||||
|
## # your own class
|
||||||
|
## $table->show_results($db->query(see query vvvvvv))
|
||||||
|
##
|
||||||
|
$this->query("SELECT T.table_name,T.column_name,T.data_type,".
|
||||||
|
"T.data_length,T.data_precision,T.data_scale,T.nullable,".
|
||||||
|
"T.char_col_decl_length,I.index_name".
|
||||||
|
" FROM ALL_TAB_COLUMNS T,ALL_IND_COLUMNS I".
|
||||||
|
" WHERE T.column_name=I.column_name (+)".
|
||||||
|
" AND T.table_name=I.table_name (+)".
|
||||||
|
" AND T.table_name=UPPER('$table') ORDER BY T.column_id");
|
||||||
|
|
||||||
|
$i=0;
|
||||||
|
while ($this->next_record()) {
|
||||||
|
$res[$i]["table"] = $this->Record[table_name];
|
||||||
|
$res[$i]["name"] = strtolower($this->Record[column_name]);
|
||||||
|
$res[$i]["type"] = $this->Record[data_type];
|
||||||
|
$res[$i]["len"] = $this->Record[data_length];
|
||||||
|
if ($this->Record[index_name]) $res[$i]["flags"] = "INDEX ";
|
||||||
|
$res[$i]["flags"] .= ( $this->Record[nullable] == 'N') ? '' : 'NOT NULL';
|
||||||
|
$res[$i]["format"]= (int)$this->Record[data_precision].",".
|
||||||
|
(int)$this->Record[data_scale];
|
||||||
|
if ("0,0"==$res[$i]["format"]) $res[$i]["format"]='';
|
||||||
|
$res[$i]["index"] = $this->Record[index_name];
|
||||||
|
$res[$i]["chars"] = $this->Record[char_col_decl_length];
|
||||||
|
if ($full) {
|
||||||
|
$j=$res[$i]["name"];
|
||||||
|
$res["meta"][$j] = $i;
|
||||||
|
$res["meta"][strtoupper($j)] = $i;
|
||||||
|
}
|
||||||
|
if ($full) $res["meta"][$res[$i]["name"]] = $i;
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
if ($full) $res["num_fields"]=$i;
|
||||||
|
# $this->disconnect();
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
## THIS FUNCTION IS UNSTESTED!
|
||||||
|
function affected_rows() {
|
||||||
|
if ($Debug) echo "<BR>Debug: affected_rows=". ora_numrows($this->Query_ID)."<BR>";
|
||||||
|
return ora_numrows($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
## Known bugs: It will not work for SELECT DISTINCT and any
|
||||||
|
## other constructs which are depending on the resulting rows.
|
||||||
|
## So you *really need* to check every query you make, if it
|
||||||
|
## will work with it.
|
||||||
|
##
|
||||||
|
## Also, for a qualified replacement you need to parse the
|
||||||
|
## selection, cause this will fail: "SELECT id, from FROM ...").
|
||||||
|
## "FROM" is - as far as I know a keyword in Oracle, so it can
|
||||||
|
## only be used in this way. But you have been warned.
|
||||||
|
function num_rows() {
|
||||||
|
$curs=ora_open($this->Link_ID);
|
||||||
|
|
||||||
|
## this is the important part and it is also the HACK!
|
||||||
|
if (eregi("^[[:space:]]*SELECT[[:space:]]",$this->lastQuery) ) {
|
||||||
|
$from_pos = strpos(strtoupper($this->lastQuery),"FROM");
|
||||||
|
$q = "SELECT count(*) ". substr($this->lastQuery, $from_pos);
|
||||||
|
|
||||||
|
ORA_parse($curs,$q);
|
||||||
|
ORA_exec($curs);
|
||||||
|
ORA_fetch($curs);
|
||||||
|
if ($Debug) echo "<BR>Debug: num_rows=". ORA_getcolumn($curs,0)."<BR>";
|
||||||
|
return(ORA_getcolumn($curs,0));
|
||||||
|
} else {
|
||||||
|
$this->halt("Last Query was not a SELECT: $this->lastQuery");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function num_fields() {
|
||||||
|
if ($Debug) echo "<BR>Debug: num_fields=". ora_numcols($this->Query_ID) . "<BR>";
|
||||||
|
return ora_numcols($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function nf() {
|
||||||
|
return $this->num_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
function np() {
|
||||||
|
print $this->num_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
function f($Name) {
|
||||||
|
return $this->Record[$Name];
|
||||||
|
}
|
||||||
|
|
||||||
|
function p($Name) {
|
||||||
|
print $this->Record[$Name];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: sequence number */
|
||||||
|
function nextid($seq_name)
|
||||||
|
{
|
||||||
|
$this->connect();
|
||||||
|
|
||||||
|
/* Independent Query_ID */
|
||||||
|
$Query_ID = ora_open($this->Link_ID);
|
||||||
|
|
||||||
|
if(!@ora_parse($Query_ID,"SELECT $seq_name.NEXTVAL FROM DUAL"))
|
||||||
|
{
|
||||||
|
// There is no such sequence yet, then create it
|
||||||
|
if(!@ora_parse($Query_ID,"CREATE SEQUENCE $seq_name")
|
||||||
|
||
|
||||||
|
!@ora_exec($Query_ID)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
$this->halt("<BR> nextid() function - unable to create sequence");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ora_parse($Query_ID,"SELECT $seq_name.NEXTVAL FROM DUAL");
|
||||||
|
}
|
||||||
|
if (!@ora_exec($Query_ID)) {
|
||||||
|
$this->halt("<BR>ora_exec() failed:<BR>nextID function");
|
||||||
|
}
|
||||||
|
if (@ora_fetch($Query_ID) ) {
|
||||||
|
$next_id = ora_getcolumn($Query_ID, 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$next_id = 0;
|
||||||
|
}
|
||||||
|
if ( Query_ID > 0 ) {
|
||||||
|
ora_close(Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $next_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
function disconnect() {
|
||||||
|
if($this->Debug) {
|
||||||
|
echo "Debug: Disconnecting $this->Query_ID...<br>\n";
|
||||||
|
}
|
||||||
|
if ( $this->Query_ID < 1 ) {
|
||||||
|
echo "<B>Warning</B>: disconnect(): Cannot free ID $this->Query_ID\n";
|
||||||
|
# return();
|
||||||
|
}
|
||||||
|
ora_close($this->Query_ID);
|
||||||
|
$this->Query_ID=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* private: error handling */
|
||||||
|
function halt($msg) {
|
||||||
|
if ($this->Halt_On_Error == "no")
|
||||||
|
return;
|
||||||
|
|
||||||
|
$this->haltmsg($msg);
|
||||||
|
|
||||||
|
if ($this->Halt_On_Error != "report")
|
||||||
|
die("Session halted.");
|
||||||
|
}
|
||||||
|
|
||||||
|
function haltmsg($msg) {
|
||||||
|
printf("<b>Database error:</b> %s<br>\n", $msg);
|
||||||
|
printf("<b>Oracle Error</b>: %s (%s)<br>\n",
|
||||||
|
$this->Errno,
|
||||||
|
$this->Error);
|
||||||
|
}
|
||||||
|
|
||||||
|
function table_names() {
|
||||||
|
$this->connect();
|
||||||
|
$this->query("
|
||||||
|
SELECT table_name,tablespace_name
|
||||||
|
FROM user_tables");
|
||||||
|
$i=0;
|
||||||
|
while ($this->next_record())
|
||||||
|
{
|
||||||
|
$info[$i]["table_name"] =$this->Record["table_name"];
|
||||||
|
$info[$i]["tablespace_name"]=$this->Record["tablespace_name"];
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
return $info;
|
||||||
|
}
|
||||||
|
}
|
259
phpgwapi/phpgw_db_pgsql.inc.php
Normal file
259
phpgwapi/phpgw_db_pgsql.inc.php
Normal file
@ -0,0 +1,259 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Session Management for PHP3
|
||||||
|
*
|
||||||
|
* Copyright (c) 1998-2000 NetUSE AG
|
||||||
|
* Boris Erdmann, Kristian Koehntopp
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
class db {
|
||||||
|
var $Host = "";
|
||||||
|
var $Database = "";
|
||||||
|
var $User = "";
|
||||||
|
var $Password = "";
|
||||||
|
var $Halt_On_Error = "yes"; ## "yes" (halt with message), "no" (ignore errors quietly), "report" (ignore errror, but spit a warning)
|
||||||
|
|
||||||
|
var $Link_ID = 0;
|
||||||
|
var $Query_ID = 0;
|
||||||
|
var $Record = array();
|
||||||
|
var $Row = 0;
|
||||||
|
|
||||||
|
var $Seq_Table = "db_sequence";
|
||||||
|
|
||||||
|
var $Errno = 0;
|
||||||
|
var $Error = "";
|
||||||
|
|
||||||
|
var $Auto_Free = 0; # Set this to 1 for automatic pg_freeresult on
|
||||||
|
# last record.
|
||||||
|
|
||||||
|
function ifadd($add, $me) {
|
||||||
|
if("" != $add) return " ".$me.$add;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: constructor */
|
||||||
|
function db($query = "") {
|
||||||
|
$this->query($query);
|
||||||
|
}
|
||||||
|
|
||||||
|
function connect() {
|
||||||
|
if ( 0 == $this->Link_ID ) {
|
||||||
|
$cstr = "dbname=".$this->Database.
|
||||||
|
$this->ifadd($this->Host, "host=").
|
||||||
|
$this->ifadd($this->Port, "port=").
|
||||||
|
$this->ifadd($this->User, "user=").
|
||||||
|
$this->ifadd($this->Password, "password=");
|
||||||
|
$this->Link_ID=pg_pconnect($cstr);
|
||||||
|
if (!$this->Link_ID) {
|
||||||
|
$this->halt("Link-ID == false, pconnect failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This only affects systems not using persistant connections
|
||||||
|
function disconnect()
|
||||||
|
{
|
||||||
|
return pg_close($this->Link_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
// I added the line and file section so we can have better error reporting. (jengo)
|
||||||
|
function query($Query_String, $line = "", $file = "") {
|
||||||
|
/* No empty queries, please, since PHP4 chokes on them. */
|
||||||
|
if ($Query_String == "")
|
||||||
|
/* The empty query string is passed on from the constructor,
|
||||||
|
* when calling the class without a query, e.g. in situations
|
||||||
|
* like these: '$db = new db_Subclass;'
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
$this->connect();
|
||||||
|
|
||||||
|
# printf("<br>Debug: query = %s<br>\n", $Query_String);
|
||||||
|
|
||||||
|
$this->Query_ID = pg_Exec($this->Link_ID, $Query_String);
|
||||||
|
$this->Row = 0;
|
||||||
|
|
||||||
|
$this->Error = pg_ErrorMessage($this->Link_ID);
|
||||||
|
$this->Errno = ($this->Error == "")?0:1;
|
||||||
|
if (! $this->Query_ID) {
|
||||||
|
$this->halt("Invalid SQL: ".$Query_String, $line, $file);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->Query_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
// public: discard the query result
|
||||||
|
function free() {
|
||||||
|
@pg_freeresult($this->Query_ID);
|
||||||
|
$this->Query_ID = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function next_record() {
|
||||||
|
$this->Record = @pg_fetch_array($this->Query_ID, $this->Row++);
|
||||||
|
|
||||||
|
$this->Error = pg_ErrorMessage($this->Link_ID);
|
||||||
|
$this->Errno = ($this->Error == "")?0:1;
|
||||||
|
|
||||||
|
$stat = is_array($this->Record);
|
||||||
|
if (!$stat && $this->Auto_Free) {
|
||||||
|
pg_freeresult($this->Query_ID);
|
||||||
|
$this->Query_ID = 0;
|
||||||
|
}
|
||||||
|
return $stat;
|
||||||
|
}
|
||||||
|
|
||||||
|
function seek($pos) {
|
||||||
|
$this->Row = $pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
function lock($table, $mode = "write") {
|
||||||
|
$result = pg_Exec($this->Link_ID, "begin work");
|
||||||
|
if ($mode == "write") {
|
||||||
|
if (is_array($table)) {
|
||||||
|
while ($t = each($table)) {
|
||||||
|
$result = pg_Exec($this->Link_ID,"lock table $t[1] in share mode");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$result = pg_Exec($this->Link_ID, "lock table $table in share mode");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$result = 1;
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function unlock() {
|
||||||
|
return pg_Exec($this->Link_ID, "commit work");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* public: sequence numbers */
|
||||||
|
function nextid($seq_name) {
|
||||||
|
$this->connect();
|
||||||
|
|
||||||
|
if ($this->lock($this->Seq_Table)) {
|
||||||
|
/* get sequence number (locked) and increment */
|
||||||
|
$q = sprintf("select nextid from %s where seq_name = '%s'",
|
||||||
|
$this->Seq_Table,
|
||||||
|
$seq_name);
|
||||||
|
$id = @pg_Exec($this->Link_ID, $q);
|
||||||
|
$res = @pg_Fetch_Array($id, 0);
|
||||||
|
|
||||||
|
/* No current value, make one */
|
||||||
|
if (!is_array($res)) {
|
||||||
|
$currentid = 0;
|
||||||
|
$q = sprintf("insert into %s values('%s', %s)",
|
||||||
|
$this->Seq_Table,
|
||||||
|
$seq_name,
|
||||||
|
$currentid);
|
||||||
|
$id = @pg_Exec($this->Link_ID, $q);
|
||||||
|
} else {
|
||||||
|
$currentid = $res["nextid"];
|
||||||
|
}
|
||||||
|
$nextid = $currentid + 1;
|
||||||
|
$q = sprintf("update %s set nextid = '%s' where seq_name = '%s'",
|
||||||
|
$this->Seq_Table,
|
||||||
|
$nextid,
|
||||||
|
$seq_name);
|
||||||
|
$id = @pg_Exec($this->Link_ID, $q);
|
||||||
|
$this->unlock();
|
||||||
|
} else {
|
||||||
|
$this->halt("cannot lock ".$this->Seq_Table." - has it been created?");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return $nextid;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function metadata($table) {
|
||||||
|
$count = 0;
|
||||||
|
$id = 0;
|
||||||
|
$res = array();
|
||||||
|
|
||||||
|
$this->connect();
|
||||||
|
$id = pg_exec($this->Link_ID, "select * from $table");
|
||||||
|
if ($id < 0) {
|
||||||
|
$this->Error = pg_ErrorMessage($id);
|
||||||
|
$this->Errno = 1;
|
||||||
|
$this->halt("Metadata query failed.");
|
||||||
|
}
|
||||||
|
$count = pg_NumFields($id);
|
||||||
|
|
||||||
|
for ($i=0; $i<$count; $i++) {
|
||||||
|
$res[$i]["table"] = $table;
|
||||||
|
$res[$i]["name"] = pg_FieldName ($id, $i);
|
||||||
|
$res[$i]["type"] = pg_FieldType ($id, $i);
|
||||||
|
$res[$i]["len"] = pg_FieldSize ($id, $i);
|
||||||
|
$res[$i]["flags"] = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
pg_FreeResult($id);
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
function affected_rows() {
|
||||||
|
return pg_cmdtuples($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function num_rows() {
|
||||||
|
return pg_numrows($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function num_fields() {
|
||||||
|
return pg_numfields($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function nf() {
|
||||||
|
return $this->num_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
function np() {
|
||||||
|
print $this->num_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
function f($Name) {
|
||||||
|
return $this->Record[$Name];
|
||||||
|
}
|
||||||
|
|
||||||
|
function p($Name) {
|
||||||
|
print $this->Record[$Name];
|
||||||
|
}
|
||||||
|
|
||||||
|
function halt($msg, $line = "", $file = "") {
|
||||||
|
if($this->Halt_On_Error == "no") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$this->unlock(); // Just in case there is a table currently locked
|
||||||
|
|
||||||
|
printf("<b>Database error:</b> %s<br>\n", $msg);
|
||||||
|
printf("<b>PostgreSQL Error</b>: %s (%s)<br>\n",
|
||||||
|
$this->Errno,
|
||||||
|
$this->Error);
|
||||||
|
if ($file) {
|
||||||
|
printf("<br><b>File:</b> %s",$file);
|
||||||
|
}
|
||||||
|
if ($line) {
|
||||||
|
printf("<br><b>Line:</b> %s",$line);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->Halt_On_Error == "yes") {
|
||||||
|
die("<p><b>Session halted.</b>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function table_names() {
|
||||||
|
$this->query("select relname from pg_class where relkind = 'r' and not relname like 'pg_%'");
|
||||||
|
$i=0;
|
||||||
|
while ($this->next_record())
|
||||||
|
{
|
||||||
|
$return[$i]["table_name"]= $this->f(0);
|
||||||
|
$return[$i]["tablespace_name"]=$this->Database;
|
||||||
|
$return[$i]["database"]=$this->Database;
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
}
|
133
phpgwapi/phpgw_db_sybase.inc.php
Normal file
133
phpgwapi/phpgw_db_sybase.inc.php
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Session Management for PHP3
|
||||||
|
*
|
||||||
|
* Copyright (c) 1998,1999 SH Online Dienst GmbH
|
||||||
|
* Boris Erdmann, Kristian Koehntopp
|
||||||
|
*
|
||||||
|
* Adapted from db_mysql.inc by Sascha Schumann <sascha@schumann.cx>
|
||||||
|
*
|
||||||
|
* metadata() contributed by Adelino Monteiro <adelino@infologia.pt>
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
class db {
|
||||||
|
var $Host = "";
|
||||||
|
var $Database = "";
|
||||||
|
var $User = "";
|
||||||
|
var $Password = "";
|
||||||
|
|
||||||
|
var $Link_ID = 0;
|
||||||
|
var $Query_ID = 0;
|
||||||
|
var $Record = array();
|
||||||
|
var $Row;
|
||||||
|
|
||||||
|
var $Auto_Free = 0; ## Set this to 1 for automatic sybase_free_result()
|
||||||
|
|
||||||
|
function connect() {
|
||||||
|
if ( 0 == $this->Link_ID ) {
|
||||||
|
$this->Link_ID=sybase_pconnect($this->Host,$this->User,$this->Password);
|
||||||
|
if (!$this->Link_ID) {
|
||||||
|
$this->halt("Link-ID == false, pconnect failed");
|
||||||
|
}
|
||||||
|
if(!sybase_select_db($this->Database, $this->Link_ID)) {
|
||||||
|
$this->halt("cannot use database ".$this->Database);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function query($Query_String) {
|
||||||
|
$this->connect();
|
||||||
|
|
||||||
|
# printf("Debug: query = %s<br>\n", $Query_String);
|
||||||
|
|
||||||
|
$this->Query_ID = sybase_query($Query_String,$this->Link_ID);
|
||||||
|
$this->Row = 0;
|
||||||
|
if (!$this->Query_ID) {
|
||||||
|
$this->halt("Invalid SQL: ".$Query_String);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->Query_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
function next_record() {
|
||||||
|
$this->Record = sybase_fetch_array($this->Query_ID);
|
||||||
|
$this->Row += 1;
|
||||||
|
|
||||||
|
$stat = is_array($this->Record);
|
||||||
|
if (!$stat && $this->Auto_Free) {
|
||||||
|
sybase_free_result($this->Query_ID);
|
||||||
|
$this->Query_ID = 0;
|
||||||
|
}
|
||||||
|
return $stat;
|
||||||
|
}
|
||||||
|
|
||||||
|
function seek($pos) {
|
||||||
|
$status = sybase_data_seek($this->Query_ID, $pos);
|
||||||
|
if ($status)
|
||||||
|
$this->Row = $pos;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
function metadata($table) {
|
||||||
|
$count = 0;
|
||||||
|
$id = 0;
|
||||||
|
$res = array();
|
||||||
|
|
||||||
|
$this->connect();
|
||||||
|
$result = $this->query("exec sp_columns $table");
|
||||||
|
if ($result < 0) {
|
||||||
|
$this->Errno = 1;
|
||||||
|
$this->Error = "Metadata query failed";
|
||||||
|
$this->halt("Metadata query failed.");
|
||||||
|
}
|
||||||
|
$count = sybase_num_rows($result);
|
||||||
|
|
||||||
|
for ($i=0; $i<$count; $i++) {
|
||||||
|
$res[$i]["table"] = $table ;
|
||||||
|
$res[$i]["name"] = sybase_result ($result, $i, "COLUMN_NAME");
|
||||||
|
$res[$i]["type"] = sybase_result ($result, $i, "TYPE_NAME");
|
||||||
|
$res[$i]["len"] = sybase_result ($result, $i, "LENGTH");
|
||||||
|
$res[$i]["position"] = sybase_result ($result, $i, "ORDINAL_POSITION");
|
||||||
|
$res[$i]["flags"] = sybase_result ($result, $i, "REMARKS");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function affected_rows() {
|
||||||
|
return sybase_affected_rows($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function num_rows() {
|
||||||
|
return sybase_num_rows($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function num_fields() {
|
||||||
|
return sybase_num_fields($this->Query_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function nf() {
|
||||||
|
return $this->num_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
function np() {
|
||||||
|
print $this->num_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
function f($Name) {
|
||||||
|
return $this->Record[$Name];
|
||||||
|
}
|
||||||
|
|
||||||
|
function p($Name) {
|
||||||
|
print $this->Record[$Name];
|
||||||
|
}
|
||||||
|
|
||||||
|
function halt($msg) {
|
||||||
|
printf("<b>Database error:</b> %s<br>\n", $msg);
|
||||||
|
printf("<b>Sybase Error</b><br>\n");
|
||||||
|
die("Session halted.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
120
phpgwapi/phpgw_info.inc.php
Normal file
120
phpgwapi/phpgw_info.inc.php
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* Written by Dan Kuykendall <seek3r@phpgroupware.org> *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
$d1 = strtolower(substr($phpgw_info["server"]["include_root"],0,3));
|
||||||
|
$d2 = strtolower(substr($phpgw_info["server"]["server_root"],0,3));
|
||||||
|
$d3 = strtolower(substr($phpgw_info["server"]["api_dir"],0,3));
|
||||||
|
if($d1 == "htt" || $d1 == "ftp" || $d2 == "htt" || $d2 == "ftp" || $d3 == "htt" || $d3 == "ftp") {
|
||||||
|
echo "Failed attempt to break in via an old Security Hole!<br>\n";
|
||||||
|
exit;
|
||||||
|
} unset($d1);unset($d2);unset($d3);
|
||||||
|
|
||||||
|
magic_quotes_runtime(false);
|
||||||
|
|
||||||
|
/* Make sure the developer is following the rules. */
|
||||||
|
if (!isset($phpgw_info["flags"]["currentapp"])) {
|
||||||
|
echo "!!! YOU DO NOT HAVE YOUR \$phpgw_info[\"flags\"][\"currentapp\"] SET !!!";
|
||||||
|
echo "!!! PLEASE CORRECT THIS SITUATION !!!";
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Additional dirs that are set from exsisting information. */
|
||||||
|
$phpgw_info["server"]["api_dir"] = $phpgw_info["server"]["include_root"] . "/phpgwapi";
|
||||||
|
|
||||||
|
if (empty($phpgw_info["server"]["default_tplset"])){
|
||||||
|
$phpgw_info["server"]["default_tplset"] = "default";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($phpgw_info["server"]["template_dir"])){
|
||||||
|
$phpgw_info["server"]["template_dir"] = $phpgw_info["server"]["include_root"]."/templates/".$phpgw_info["server"]["default_tplset"];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($phpgw_domain)) { // make them fix their header
|
||||||
|
echo "The administration is required to upgrade the header.inc.php file before you can continue.";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
reset($phpgw_domain);
|
||||||
|
$default_domain = each($phpgw_domain);
|
||||||
|
$phpgw_info["server"]["default_domain"] = $default_domain[0];
|
||||||
|
unset ($default_domain); // we kill this for security reasons
|
||||||
|
|
||||||
|
// This code will handle virtdomains so that is a user logins with user@domain.com, it will switch into virtualization mode.
|
||||||
|
if (isset($domain)){
|
||||||
|
$phpgw_info["user"]["domain"] = $domain;
|
||||||
|
}elseif (isset($login) && isset($logindomain)){
|
||||||
|
if (!ereg ("\@", $login)){
|
||||||
|
$login = $login."@".$logindomain;
|
||||||
|
}
|
||||||
|
$phpgw_info["user"]["domain"] = $logindomain;
|
||||||
|
unset ($logindomain);
|
||||||
|
}elseif (isset($login) && !isset($logindomain)){
|
||||||
|
if (ereg ("\@", $login)){
|
||||||
|
$login_array = explode("@", $login);
|
||||||
|
$phpgw_info["user"]["domain"] = $login_array[1];
|
||||||
|
}else{
|
||||||
|
$phpgw_info["user"]["domain"] = $phpgw_info["server"]["default_domain"];
|
||||||
|
$login = $login."@".$phpgw_info["user"]["domain"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($phpgw_domain[$phpgw_info["user"]["domain"]])){
|
||||||
|
$phpgw_info["server"]["db_host"] = $phpgw_domain[$phpgw_info["user"]["domain"]]["db_host"];
|
||||||
|
$phpgw_info["server"]["db_name"] = $phpgw_domain[$phpgw_info["user"]["domain"]]["db_name"];
|
||||||
|
$phpgw_info["server"]["db_user"] = $phpgw_domain[$phpgw_info["user"]["domain"]]["db_user"];
|
||||||
|
$phpgw_info["server"]["db_pass"] = $phpgw_domain[$phpgw_info["user"]["domain"]]["db_pass"];
|
||||||
|
$phpgw_info["server"]["db_type"] = $phpgw_domain[$phpgw_info["user"]["domain"]]["db_type"];
|
||||||
|
}else{
|
||||||
|
$phpgw_info["server"]["db_host"] = $phpgw_domain[$phpgw_info["server"]["default_domain"]]["db_host"];
|
||||||
|
$phpgw_info["server"]["db_name"] = $phpgw_domain[$phpgw_info["server"]["default_domain"]]["db_name"];
|
||||||
|
$phpgw_info["server"]["db_user"] = $phpgw_domain[$phpgw_info["server"]["default_domain"]]["db_user"];
|
||||||
|
$phpgw_info["server"]["db_pass"] = $phpgw_domain[$phpgw_info["server"]["default_domain"]]["db_pass"];
|
||||||
|
$phpgw_info["server"]["db_type"] = $phpgw_domain[$phpgw_info["server"]["default_domain"]]["db_type"];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($phpgw_info["flags"]["currentapp"] != "login" && ! $phpgw_info["server"]["show_domain_selectbox"]) {
|
||||||
|
unset ($phpgw_domain); // we kill this for security reasons
|
||||||
|
}
|
||||||
|
unset ($domain); // we kill this to save memory
|
||||||
|
|
||||||
|
// some constants which can be used in setting user acl rights.
|
||||||
|
define("PHPGW_ACL_READ",1);
|
||||||
|
define("PHPGW_ACL_ADD",2);
|
||||||
|
define("PHPGW_ACL_EDIT",4);
|
||||||
|
define("PHPGW_ACL_DELETE",8);
|
||||||
|
|
||||||
|
// This function needs to be optimized, its reading duplicate information.
|
||||||
|
function phpgw_fillarray()
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info, $cd, $colspan;
|
||||||
|
$phpgw_info["server"]["images_dir"] = $phpgw_info["server"]["webserver_url"] . "/images";
|
||||||
|
$phpgw_info["server"]["template_dir"] = $phpgw_info["server"]["include_root"] . "/templates/"
|
||||||
|
. $phpgw_info["server"]["default_tplset"];
|
||||||
|
|
||||||
|
$phpgw_info["server"]["app_root"] = $phpgw_info["server"]["server_root"]."/".$phpgw_info["flags"]["currentapp"];
|
||||||
|
$phpgw_info["server"]["app_inc"] = $phpgw_info["server"]["app_root"]."/inc";
|
||||||
|
$phpgw_info["server"]["app_images"] = $phpgw_info["server"]["webserver_url"]."/".$phpgw_info["flags"]["currentapp"]."/images";
|
||||||
|
$phpgw_info["server"]["app_tpl"] = $phpgw_info["server"]["app_root"]."/templates/".$phpgw_info["server"]["default_tplset"];
|
||||||
|
|
||||||
|
/* ********This sets the user variables******** */
|
||||||
|
$phpgw_info["user"]["private_dir"] = $phpgw_info["server"]["files_dir"] . "/users/"
|
||||||
|
. $phpgw_info["user"]["userid"];
|
||||||
|
|
||||||
|
$phpgw_info["server"]["my_include_dir"] = $phpgw_info["server"]["app_inc"];
|
||||||
|
|
||||||
|
// This shouldn't happen, but if it does get ride of the warnings it will spit out
|
||||||
|
if (gettype($phpgw_info["user"]["preferences"]) != "array") {
|
||||||
|
$phpgw_info["user"]["preferences"] = array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
77
phpgwapi/phpgw_lang_sql.inc.php
Normal file
77
phpgwapi/phpgw_lang_sql.inc.php
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* This file written by Dan Kuykendall <seek3r@phpgroupware.org> *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
class translation
|
||||||
|
{
|
||||||
|
|
||||||
|
function translate($key, $vars=false )
|
||||||
|
{
|
||||||
|
if ( ! $vars ) $vars = array();
|
||||||
|
global $phpgw, $phpgw_info, $lang;
|
||||||
|
$ret = $key;
|
||||||
|
if (!isset($lang) || !$lang) {
|
||||||
|
if (isset($phpgw_info["user"]["preferences"]["common"]["lang"]) &&
|
||||||
|
$phpgw_info["user"]["preferences"]["common"]["lang"]) {
|
||||||
|
$userlang = $phpgw_info["user"]["preferences"]["common"]["lang"];
|
||||||
|
}else{
|
||||||
|
$userlang = "en";
|
||||||
|
}
|
||||||
|
$sql = "select message_id,content from lang where lang like '".$userlang."' ".
|
||||||
|
"and (app_name like '".$phpgw_info["flags"]["currentapp"]."' or app_name like 'common')";
|
||||||
|
|
||||||
|
if (strcasecmp ($phpgw_info["flags"]["currentapp"], "common")>0){
|
||||||
|
$sql .= " order by app_name asc";
|
||||||
|
}else{
|
||||||
|
$sql .= " order by app_name desc";
|
||||||
|
}
|
||||||
|
|
||||||
|
$phpgw->db->query($sql,__LINE__,__FILE__);
|
||||||
|
$phpgw->db->next_record();
|
||||||
|
$count = $phpgw->db->num_rows();
|
||||||
|
for ($idx = 0; $idx < $count; ++$idx) {
|
||||||
|
$lang[strtolower ($phpgw->db->f("message_id"))] = $phpgw->db->f("content");
|
||||||
|
$phpgw->db->next_record();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isset($lang[strtolower ($key)]) && $lang[strtolower ($key)]){
|
||||||
|
$ret = $lang[strtolower ($key)];
|
||||||
|
}else{
|
||||||
|
$ret = $key."*";
|
||||||
|
}
|
||||||
|
$ndx = 1;
|
||||||
|
while( list($key,$val) = each( $vars ) ) {
|
||||||
|
$ret = preg_replace( "/%$ndx/", $val, $ret );
|
||||||
|
++$ndx;
|
||||||
|
}
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function add_app($app)
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info, $lang;
|
||||||
|
if ($phpgw_info["user"]["preferences"]["common"]["lang"]){
|
||||||
|
$userlang = $phpgw_info["user"]["preferences"]["common"]["lang"];
|
||||||
|
}else{
|
||||||
|
$userlang = "en";
|
||||||
|
}
|
||||||
|
$sql = "select message_id,content from lang where lang like '".$userlang."' and app_name like '".$app."'";
|
||||||
|
$phpgw->db->query($sql,__LINE__,__FILE__);
|
||||||
|
$phpgw->db->next_record();
|
||||||
|
$count = $phpgw->db->num_rows();
|
||||||
|
for ($idx = 0; $idx < $count; ++$idx) {
|
||||||
|
$lang[strtolower ($phpgw->db->f("message_id"))] = $phpgw->db->f("content");
|
||||||
|
$phpgw->db->next_record();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
187
phpgwapi/phpgw_network.inc.php
Normal file
187
phpgwapi/phpgw_network.inc.php
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare Library (Network) *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* Written by Mark Peters <mpeters@satx.rr.com> *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
class network
|
||||||
|
{
|
||||||
|
var $socket;
|
||||||
|
var $addcrlf = TRUE;
|
||||||
|
var $error;
|
||||||
|
var $errorset = 0;
|
||||||
|
|
||||||
|
function network($addcrlf=true)
|
||||||
|
{
|
||||||
|
$this->errorset = 0;
|
||||||
|
$this->set_addcrlf($addcrlf);
|
||||||
|
}
|
||||||
|
|
||||||
|
function set_addcrlf($value)
|
||||||
|
{
|
||||||
|
$this->addcrlf = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
function set_error($code,$msg,$desc)
|
||||||
|
{
|
||||||
|
$this->error = array("code","msg","desc");
|
||||||
|
$this->error["code"] = $code;
|
||||||
|
$this->error["msg"] = $msg;
|
||||||
|
$this->error["desc"] = $desc;
|
||||||
|
// $this->close_port();
|
||||||
|
$this->errorset = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function open_port($server,$port,$timeout=15)
|
||||||
|
{
|
||||||
|
global $phpgw_info;
|
||||||
|
|
||||||
|
switch($port) {
|
||||||
|
case 80:
|
||||||
|
case 443:
|
||||||
|
if((isset($phpgw_info["server"]["httpproxy_server"]) && $phpgw_info["server"]["httpproxy_server"]) &&
|
||||||
|
(isset($phpgw_info["server"]["httpproxy_port"]) && $phpgw_info["server"]["httpproxy_port"])) {
|
||||||
|
$server = $phpgw_info["server"]["httpproxy_server"];
|
||||||
|
$port = (int)$phpgw_info["server"]["httpproxy_port"];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(floor(phpversion()) == 4)
|
||||||
|
$this->socket = fsockopen($server,$port,&$errcode,&$errmsg,$timeout);
|
||||||
|
else
|
||||||
|
$this->socket = fsockopen($server,$port,&$errcode,&$errmsg);
|
||||||
|
if (!$this->socket) {
|
||||||
|
return $this->set_error("Error","$errcode:$errmsg","Connection to $server:$port failed - could not open socket.");
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function close_port()
|
||||||
|
{
|
||||||
|
return fclose($this->socket);
|
||||||
|
}
|
||||||
|
|
||||||
|
function read_port()
|
||||||
|
{
|
||||||
|
return fgets($this->socket, 1024);
|
||||||
|
}
|
||||||
|
|
||||||
|
function bs_read_port($bytes)
|
||||||
|
{
|
||||||
|
return fread($this->socket, $bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
function write_port($str)
|
||||||
|
{
|
||||||
|
if (isset($this->addcrlf) && $this->addcrlf == True) $str .= "\r\n";
|
||||||
|
|
||||||
|
$ok = fputs($this->socket,$str);
|
||||||
|
if (!$ok)
|
||||||
|
{
|
||||||
|
return $this->set_error("Error","Connection Lost","lost connection to server");
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function bs_write_port($str,$bytes=0)
|
||||||
|
{
|
||||||
|
if (isset($this->addcrlf) && $this->addcrlf == True) $str .= "\r\n";
|
||||||
|
|
||||||
|
if ($bytes)
|
||||||
|
$ok = fwrite($this->socket,$str,$bytes);
|
||||||
|
else
|
||||||
|
$ok = fwrite($this->socket,$str);
|
||||||
|
|
||||||
|
if (!$ok)
|
||||||
|
{
|
||||||
|
return $this->set_error("Error","Connection Lost","lost connection to server");
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg2socket($str,$expected_response,$response)
|
||||||
|
{
|
||||||
|
if(!$this->socket && substr($expected_response,1,1) == "+") {
|
||||||
|
return $this->set_error("521",
|
||||||
|
"socket does not exist",
|
||||||
|
"The required socket does not exist. The settings for your mail server may be wrong.");
|
||||||
|
}
|
||||||
|
if (!$this->write_port($str)) {
|
||||||
|
if(substr($expected_response,1,1) == "+") {
|
||||||
|
return $this->set_error("420",
|
||||||
|
"lost connection",
|
||||||
|
"Lost connection to pop server.");
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$response = $this->read_port();
|
||||||
|
if (!ereg(strtoupper($expected_response),strtoupper($response))) {
|
||||||
|
if(substr($expected_response,1,1) == "+") {
|
||||||
|
return $this->set_error("550",
|
||||||
|
"",
|
||||||
|
"");
|
||||||
|
}
|
||||||
|
$pos = strpos(" ",$response);
|
||||||
|
return $this->set_error(substr($response,0,$pos),
|
||||||
|
"invalid response($expected_response)",
|
||||||
|
substr($response,($pos + 1),(strlen($response)-$pos)));
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// return contents of a web url as an array or false if timeout
|
||||||
|
function gethttpsocketfile($file)
|
||||||
|
{
|
||||||
|
global $phpgw_info;
|
||||||
|
|
||||||
|
$server = str_replace("http://","",$file);
|
||||||
|
$file = strstr($server,"/");
|
||||||
|
$server = str_replace("$file","",$server);
|
||||||
|
if ($phpgw_info["server"]["httpproxy_server"]) {
|
||||||
|
if ($this->open_port($server,80, 15)) {
|
||||||
|
if (! $this->write_port("GET http://" . $server . $file . " HTTP/1.0\n\n")) {
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
$i = 0;
|
||||||
|
while ($line = $this->read_port()) {
|
||||||
|
if (feof($this->socket)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$lines[] = $line;
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
$this->close_port();
|
||||||
|
return $lines;
|
||||||
|
} else {
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($this->open_port($server, 80, 15)) {
|
||||||
|
if (!$this->write_port("GET $file HTTP/1.0\nHost: $server\n\n")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
while ($line = $this->read_port()) {
|
||||||
|
$lines[] = $line;
|
||||||
|
}
|
||||||
|
$this->close_port();
|
||||||
|
return $lines;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
341
phpgwapi/phpgw_nextmatchs.inc.php
Normal file
341
phpgwapi/phpgw_nextmatchs.inc.php
Normal file
@ -0,0 +1,341 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* This file written by Joseph Engo <jengo@phpgroupware.org> *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
class nextmatchs
|
||||||
|
{
|
||||||
|
|
||||||
|
// I split this up so it can be used in differant layouts.
|
||||||
|
function show($sn,$start,$total,$extra, $twidth, $bgtheme,
|
||||||
|
$search_obj=0,$filter_obj=1,$showsearch=1)
|
||||||
|
{
|
||||||
|
echo $this->tablestart($sn,$twidth, $bgtheme);
|
||||||
|
echo $this->left($sn,$start,$total,$extra);
|
||||||
|
if ($showsearch == 1)
|
||||||
|
{
|
||||||
|
echo $this->search($search_obj);
|
||||||
|
}
|
||||||
|
echo $this->filter($filter_obj);
|
||||||
|
echo $this->right($sn,$start,$total,$extra);
|
||||||
|
echo $this->tableend();
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// same as show, only without direct output for use within templates
|
||||||
|
// *** the show function can be removed as soon as every program using
|
||||||
|
// nextmatch is converted to use template and show_tpl (loge)
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
function show_tpl($sn,$start,$total,$extra, $twidth, $bgtheme,
|
||||||
|
$search_obj=0,$filter_obj=1,$showsearch=1)
|
||||||
|
{
|
||||||
|
$var = $this->tablestart($sn,$twidth, $bgtheme);
|
||||||
|
$var .= $this->left($sn,$start,$total,$extra);
|
||||||
|
if ($showsearch == 1)
|
||||||
|
{
|
||||||
|
$var .= $this->search($search_obj);
|
||||||
|
}
|
||||||
|
$var .= $this->filter($filter_obj);
|
||||||
|
$var .= $this->right($sn,$start,$total,$extra);
|
||||||
|
$var .= $this->tableend();
|
||||||
|
return $var;
|
||||||
|
}
|
||||||
|
|
||||||
|
function tablestart($scriptname, $twidth="75%", $bgtheme="D3DCE3")
|
||||||
|
{
|
||||||
|
global $filter, $qfield, $start, $order, $sort, $query, $phpgw;
|
||||||
|
|
||||||
|
$str = "<form method=\"POST\" action=\"" . $phpgw->link($scriptname) . "\">
|
||||||
|
<input type=\"hidden\" name=\"filter\" value=\"$filter\">
|
||||||
|
<input type=\"hidden\" name=\"qfield\" value=\"$qfield\">
|
||||||
|
<input type=\"hidden\" name=\"start\" value=\"$start\">
|
||||||
|
<input type=\"hidden\" name=\"order\" value=\"$order\">
|
||||||
|
<input type=\"hidden\" name=\"sort\" value=\"$sort\">
|
||||||
|
<input type=\"hidden\" name=\"query\" value=\"$query\">";
|
||||||
|
|
||||||
|
$str .= "<table width=\"$twidth\" height=\"50\" border=\"0\" bgcolor=\"$bgtheme\" cellspacing=\"0\" cellpadding=\"0\">\n<tr>\n";
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
function tableend()
|
||||||
|
{
|
||||||
|
$str = "</tr>\n</table>\n<br>";
|
||||||
|
$str .= "</form>";
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function left($scriptname,$start,$total,$extradata = "")
|
||||||
|
{
|
||||||
|
global $filter, $qfield, $order, $sort, $query, $phpgw_info, $phpgw;
|
||||||
|
|
||||||
|
$str = "";
|
||||||
|
$maxmatchs = $phpgw_info["user"]["preferences"]["common"]["maxmatchs"];
|
||||||
|
|
||||||
|
if (( $start != 0 ) && ( $start > $maxmatchs ))
|
||||||
|
$str .= "<td width=\"2%\" align=\"left\"> <a href=\""
|
||||||
|
. $phpgw->link($scriptname,"start=0"
|
||||||
|
. "&order=$order&filter=$filter&qfield=$qfield"
|
||||||
|
. "&sort=$sort&query=$query".$extradata)
|
||||||
|
. "\"><img src=\"".$phpgw_info["server"]["images_dir"]
|
||||||
|
. "/first.gif\" border=0 width=\"12\" height=\"12\" alt=\""
|
||||||
|
. lang("First Page") . "\"></a></td>\n";
|
||||||
|
else
|
||||||
|
$str .= "<td width=\"2%\" align=\"left\">"
|
||||||
|
. " <img src=\"".$phpgw_info["server"]["images_dir"]
|
||||||
|
. "/first-grey.gif\" "."width=\"12\" height=\"12\" alt=\""
|
||||||
|
. lang("First Page")."\"></td>\n";
|
||||||
|
|
||||||
|
if ($start != 0) {
|
||||||
|
// Changing the sorting order screaws up the starting number
|
||||||
|
if ( ($start - $maxmatchs) < 0)
|
||||||
|
$t_start = 0;
|
||||||
|
else
|
||||||
|
$t_start = ($start - $maxmatchs);
|
||||||
|
|
||||||
|
$str .= "<td width=\"2%\" align=\"left\"><a href=\""
|
||||||
|
. $phpgw->link($scriptname,"start=$t_start"
|
||||||
|
. "&order=$order&filter=$filter&qfield=$qfield"
|
||||||
|
. "&sort=$sort&query=$query".$extradata)
|
||||||
|
. "\"><img src=\"".$phpgw_info["server"]["images_dir"]
|
||||||
|
. "/left.gif\" border=0 width=\"12\" height=\"12\" alt=\""
|
||||||
|
. lang("Previous Page") . "\"></a></td>\n";
|
||||||
|
} else
|
||||||
|
$str .= "<td width=\"2%\" align=\"left\">"
|
||||||
|
. "<img src=\"" . $phpgw_info["server"]["images_dir"]
|
||||||
|
. "/left-grey.gif\" width=\"12\" height=\"12\" alt=\""
|
||||||
|
. lang("Previous Page") . "\"></td>\n";
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
} /* left() */
|
||||||
|
|
||||||
|
function search($search_obj=0)
|
||||||
|
{
|
||||||
|
global $query;
|
||||||
|
|
||||||
|
$str = "<td width=\"40%\">"
|
||||||
|
. "<div align=\"center\">"
|
||||||
|
. "<input type=\"text\" name=\"query\" value=\"".urldecode($query)."\"> "
|
||||||
|
. $this->searchby($search_obj)
|
||||||
|
. "<input type=\"submit\" name=\"Search\" value=\"" . lang("Search") ."\">"
|
||||||
|
. "</div>"
|
||||||
|
. "</td>";
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
} /* search() */
|
||||||
|
|
||||||
|
function filterobj($filtertable, $idxfieldname, $strfieldname)
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
|
||||||
|
$filter_obj = array(array("none","show all"));
|
||||||
|
$index = 0;
|
||||||
|
|
||||||
|
$phpgw->db->query("SELECT $idxfieldname, $strfieldname from $filtertable",__LINE__,__FILE__);
|
||||||
|
while($phpgw->db->next_record())
|
||||||
|
{
|
||||||
|
$index++;
|
||||||
|
$filter_obj[$index][0] = $phpgw->db->f("$idxfieldname");
|
||||||
|
$filter_obj[$index][1] = $phpgw->db->f("$strfieldname");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $filter_obj;
|
||||||
|
} /* filterobj() */
|
||||||
|
|
||||||
|
function searchby($search_obj)
|
||||||
|
{
|
||||||
|
global $qfield, $phpgw, $phpgw_info;
|
||||||
|
|
||||||
|
$str = "";
|
||||||
|
if (is_array($search_obj))
|
||||||
|
{
|
||||||
|
$str .= "<select name=\"qfield\">";
|
||||||
|
|
||||||
|
$indexlimit = count($search_obj);
|
||||||
|
for ($index=0; $index<$indexlimit; $index++)
|
||||||
|
{
|
||||||
|
if ($qfield == "")
|
||||||
|
{
|
||||||
|
$qfield = $search_obj[$index][0];
|
||||||
|
}
|
||||||
|
|
||||||
|
$str .= "<option value=\"".$search_obj[$index][0]."\"";
|
||||||
|
if ($qfield == $search_obj[$index][0])
|
||||||
|
{
|
||||||
|
$str .= " selected";
|
||||||
|
}
|
||||||
|
$str .= ">" . lang($search_obj[$index][1]) . "</option>";
|
||||||
|
}
|
||||||
|
|
||||||
|
$str .= "</select>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
|
||||||
|
} /* searchby() */
|
||||||
|
|
||||||
|
function filter($filter_obj)
|
||||||
|
{
|
||||||
|
global $filter, $phpgw, $phpgw_info;
|
||||||
|
|
||||||
|
$str = "";
|
||||||
|
if (is_long($filter_obj))
|
||||||
|
{
|
||||||
|
if ($filter_obj == 1)
|
||||||
|
{
|
||||||
|
$user_groups =
|
||||||
|
$phpgw->accounts->read_group_names($phpgw_info["user"]["userid"]);
|
||||||
|
$indexlimit = count($user_groups);
|
||||||
|
|
||||||
|
$filter_obj = array(array("none",lang("show all")),
|
||||||
|
array("private",lang("only yours")));
|
||||||
|
for ($index=0; $index<$indexlimit; $index++)
|
||||||
|
{
|
||||||
|
$filter_obj[2+$index][0] = $user_groups[$index][0];
|
||||||
|
$filter_obj[2+$index][1] = "Group - " . $user_groups[$index][1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($filter_obj))
|
||||||
|
{
|
||||||
|
$str .= "<td width=\"14%\">"
|
||||||
|
. "<select name=\"filter\">";
|
||||||
|
|
||||||
|
$indexlimit = count($filter_obj);
|
||||||
|
for ($index=0; $index<$indexlimit; $index++)
|
||||||
|
{
|
||||||
|
if ($filter == "")
|
||||||
|
{
|
||||||
|
$filter = $filter_obj[$index][0];
|
||||||
|
}
|
||||||
|
|
||||||
|
$str .= "<option value=\"".$filter_obj[$index][0]."\"";
|
||||||
|
if ($filter == $filter_obj[$index][0])
|
||||||
|
{
|
||||||
|
$str .= " selected";
|
||||||
|
}
|
||||||
|
$str .= ">" . $filter_obj[$index][1] . "</option>";
|
||||||
|
}
|
||||||
|
|
||||||
|
$str .= "</select>\n";
|
||||||
|
$str .= "<input type=\"submit\" value=\"" . lang("filter") . "\">\n";
|
||||||
|
$str .= "</td>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
|
||||||
|
} /* filter() */
|
||||||
|
|
||||||
|
function right($scriptname,$start,$total,$extradata = "")
|
||||||
|
{
|
||||||
|
global $filter, $qfield, $order, $sort, $query, $phpgw_info, $phpgw;
|
||||||
|
$maxmatchs = $phpgw_info["user"]["preferences"]["common"]["maxmatchs"];
|
||||||
|
|
||||||
|
$str = "";
|
||||||
|
if (($total > $maxmatchs) && ($total > $start + $maxmatchs))
|
||||||
|
$str .= "<td width=\"2%\" align=\"right\"><a href=\""
|
||||||
|
. $phpgw->link($scriptname,"start=".($start+$maxmatchs)
|
||||||
|
. "&order=$order&filter=$filter&qfield=$qfield"
|
||||||
|
. "&sort=$sort&query=$query".$extradata)
|
||||||
|
. "\"><img src=\"".$phpgw_info["server"]["images_dir"]
|
||||||
|
. "/right.gif\" width=\"12\" height=\"12\" border=\"0\" alt=\""
|
||||||
|
. lang("Next Page")."\"></a></td>\n";
|
||||||
|
else
|
||||||
|
$str .= "<td width=\"2%\" align=\"right\"><img src=\""
|
||||||
|
. $phpgw_info["server"]["images_dir"]."/right-grey.gif\" "
|
||||||
|
. "width=\"12\" height=\"12\" alt=\"".lang("Next Page")
|
||||||
|
. "\"></td>\n";
|
||||||
|
|
||||||
|
if (($start != $total - $maxmatchs)
|
||||||
|
&& ( ($total - $maxmatchs) > ($start + $maxmatchs) ))
|
||||||
|
$str .= "<td width=\"2%\" align=\"right\"><a href=\""
|
||||||
|
. $phpgw->link($scriptname,"start=".($total-$maxmatchs)
|
||||||
|
. "&order=$order&filter=$filter&qfield=$qfield"
|
||||||
|
. "&sort=$sort&query=$query".$extradata)
|
||||||
|
. "\"><img src=\"".$phpgw_info["server"]["images_dir"]
|
||||||
|
. "/last.gif\" border=\"0\" width=\"12\" height=\"12\" alt=\""
|
||||||
|
. lang("Last Page")."\"></a> </td>\n";
|
||||||
|
else
|
||||||
|
$str .= "<td width=\"2%\" align=\"right\"><img src=\""
|
||||||
|
. $phpgw_info["server"]["images_dir"]."/last-grey.gif\" "
|
||||||
|
. "width=\"12\" height=\"12\" alt=\"".lang("Last Page")
|
||||||
|
. "\"> </td>";
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
} /* right() */
|
||||||
|
|
||||||
|
function alternate_row_color($currentcolor = "")
|
||||||
|
{
|
||||||
|
global $phpgw_info;
|
||||||
|
if (! $currentcolor) {
|
||||||
|
global $tr_color;
|
||||||
|
$currentcolor = $tr_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($currentcolor == $phpgw_info["theme"]["row_on"]) {
|
||||||
|
$tr_color = $phpgw_info["theme"]["row_off"];
|
||||||
|
} else {
|
||||||
|
$tr_color = $phpgw_info["theme"]["row_on"];
|
||||||
|
}
|
||||||
|
return $tr_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
function show_sort_order($sort,$var,$order,$program,$text,$extra="")
|
||||||
|
{
|
||||||
|
global $phpgw, $filter, $qfield, $start, $query;
|
||||||
|
if (($order == $var) && ($sort == "ASC"))
|
||||||
|
$sort = "DESC";
|
||||||
|
else if (($order == $var) && ($sort == "DESC"))
|
||||||
|
$sort = "ASC";
|
||||||
|
else
|
||||||
|
$sort = "ASC";
|
||||||
|
|
||||||
|
return "<a href=\"".$phpgw->link($program,"order=$var&sort=$sort"
|
||||||
|
. "&filter=$filter&qfield=$qfield"
|
||||||
|
. "&start=$start&query=$query".$extra)."\">$text</a>";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Postgre and MySQL switch the vars in limit. This will make it easier
|
||||||
|
// if there are any other databases that pull this.
|
||||||
|
function sql_limit($start)
|
||||||
|
{
|
||||||
|
global $phpgw_info;
|
||||||
|
$max = $phpgw_info["user"]["preferences"]["common"]["maxmatchs"];
|
||||||
|
|
||||||
|
switch ($phpgw_info["server"]["db_type"]) {
|
||||||
|
case "pgsql":
|
||||||
|
if ($start == 0)
|
||||||
|
$l = $max;
|
||||||
|
else
|
||||||
|
$l = "$max,$start";
|
||||||
|
return $l;
|
||||||
|
break;
|
||||||
|
case "mysql":
|
||||||
|
if ($start == 0)
|
||||||
|
$l = $max;
|
||||||
|
else
|
||||||
|
$l = "$start,$max";
|
||||||
|
return $l;
|
||||||
|
break;
|
||||||
|
case "oracle":
|
||||||
|
if ($start == 0)
|
||||||
|
$l = "rownum < $max";
|
||||||
|
else
|
||||||
|
$l = "rownum >= $start AND rownum <= $max";
|
||||||
|
// if ($new_where)
|
||||||
|
// return "WHERE $l";
|
||||||
|
// else
|
||||||
|
// return "AND $l";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
248
phpgwapi/phpgw_send.inc.php
Normal file
248
phpgwapi/phpgw_send.inc.php
Normal file
@ -0,0 +1,248 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare - smtp mailer *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* Written by Itzchak Rehberg <izzysoft@qumran.org> *
|
||||||
|
* ------------------------------------------------ *
|
||||||
|
* This module should replace php's mail() function. It is fully syntax *
|
||||||
|
* compatible. In addition, when an error occures, a detailed error info *
|
||||||
|
* is stored in the array $send->err (see ../inc/email/global.inc.php for *
|
||||||
|
* details on this variable). *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
class send {
|
||||||
|
var $err = array("code","msg","desc");
|
||||||
|
var $to_res = array();
|
||||||
|
|
||||||
|
function send() {
|
||||||
|
$this->err["code"] = " ";
|
||||||
|
$this->err["msg"] = " ";
|
||||||
|
$this->err["desc"] = " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg($service, $to, $subject, $body, $msgtype="", $cc="", $bcc="") {
|
||||||
|
global $phpgw_info, $phpgw, $attach_sig;
|
||||||
|
|
||||||
|
if ($service == "email") {
|
||||||
|
$now = getdate();
|
||||||
|
$header = "Date: " . gmdate("D, d M Y H:i:s") . " +0000\n";
|
||||||
|
$header .= "From: ".$phpgw_info["user"]["fullname"]." <".$phpgw_info["user"]["preferences"]["email"]["address"].">\n";
|
||||||
|
$header .= "Reply-To: ".$phpgw_info["user"]["preferences"]["email"]["address"]."\n";
|
||||||
|
$header .= "To: $to\n";
|
||||||
|
if (!empty($cc)) {
|
||||||
|
$header .= "Cc: $cc\n";
|
||||||
|
}
|
||||||
|
if (!empty($bcc)) {
|
||||||
|
$header .= "Bcc: $bcc\n";
|
||||||
|
}
|
||||||
|
if (!empty($msgtype)) {
|
||||||
|
$header .= "X-phpGW-Type: $msgtype\n";
|
||||||
|
}
|
||||||
|
$header .= "X-Mailer: phpGroupWare (http://www.phpgroupware.org)\n";
|
||||||
|
|
||||||
|
if ($phpgw_info["user"]["preferences"]["email"]["email_sig"] && $attach_sig) {
|
||||||
|
$body .= "\n-----\n" . $phpgw_info["user"]["preferences"]["email"]["email_sig"];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ereg("Message-Boundary", $body))
|
||||||
|
{
|
||||||
|
$header .= "Subject: " . stripslashes($subject) . "\n"
|
||||||
|
. "MIME-Version: 1.0\n"
|
||||||
|
. "Content-Type: multipart/mixed;\n"
|
||||||
|
. " boundary=\"Message-Boundary\"\n\n"
|
||||||
|
. "--Message-Boundary\n"
|
||||||
|
. "Content-type: text/plain; charset=US-ASCII\n";
|
||||||
|
// if (!empty($msgtype)) {
|
||||||
|
// $header .= "Content-type: text/plain; phpgw-type=".$msgtype."\n";
|
||||||
|
// }
|
||||||
|
|
||||||
|
$header .= "Content-Disposition: inline\n"
|
||||||
|
. "Content-transfer-encoding: 7BIT\n\n"
|
||||||
|
. $body;
|
||||||
|
$body = "";
|
||||||
|
} else {
|
||||||
|
$header .= "Subject: " . stripslashes($subject) . "\n"
|
||||||
|
. "MIME-version: 1.0\n"
|
||||||
|
. "Content-type: text/plain; charset=\"".lang("charset")."\"\n";
|
||||||
|
if (!empty($msgtype)) {
|
||||||
|
$header .= "Content-type: text/plain; phpgw-type=".$msgtype."\n";
|
||||||
|
}
|
||||||
|
$header .= "Content-Disposition: inline\n"
|
||||||
|
. "Content-description: Mail message body\n";
|
||||||
|
}
|
||||||
|
if ($phpgw_info["user"]["preferences"]["email"]["mail_server_type"] == "imap" && $phpgw_info["user"]["apps"]["email"]){
|
||||||
|
$stream = $phpgw->msg->login("Sent");
|
||||||
|
$phpgw->msg->append($stream, "Sent", $header, $body);
|
||||||
|
$phpgw->msg->close($stream);
|
||||||
|
}
|
||||||
|
if (strlen($cc)>1) $to .= ",".$cc;
|
||||||
|
|
||||||
|
if (strlen($bcc)>1) $to .= ",".$bcc;
|
||||||
|
|
||||||
|
$returnccode = $this->smail($to, "", $body, $header);
|
||||||
|
|
||||||
|
return $returnccode;
|
||||||
|
} elseif ($type == "nntp") {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================================================[ some sub-functions ]===
|
||||||
|
|
||||||
|
function socket2msg($socket) {
|
||||||
|
$followme = "-"; $this->err["msg"] = "";
|
||||||
|
do {
|
||||||
|
$rmsg = fgets($socket,255);
|
||||||
|
// echo "< $rmsg<BR>\n";
|
||||||
|
$this->err["code"] = substr($rmsg,0,3);
|
||||||
|
$followme = substr($rmsg,3,1);
|
||||||
|
$this->err["msg"] = substr($rmsg,4);
|
||||||
|
if (substr($this->err["code"],0,1) != 2 && substr($this->err["code"],0,1) != 3) {
|
||||||
|
$rc = fclose($socket);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ($followme = " ") { break; }
|
||||||
|
} while ($followme = "-");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg2socket($socket,$message) { // send single line\n
|
||||||
|
// echo "raw> $message<BR>\n";
|
||||||
|
// echo "hex> ".bin2hex($message)."<BR>\n";
|
||||||
|
$rc = fputs($socket,"$message");
|
||||||
|
if (!$rc) {
|
||||||
|
$this->err["code"] = "420";
|
||||||
|
$this->err["msg"] = "lost connection";
|
||||||
|
$this->err["desc"] = "Lost connection to smtp server.";
|
||||||
|
$rc = fclose($socket);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function put2socket($socket,$message) { // check for multiple lines 1st
|
||||||
|
$pos = strpos($message,"\n");
|
||||||
|
if (!is_int($pos)) { // no new line found
|
||||||
|
$message .= "\r\n";
|
||||||
|
$this->msg2socket($socket,$message);
|
||||||
|
} else { // multiple lines, we have to split it
|
||||||
|
do {
|
||||||
|
$msglen = $pos + 1;
|
||||||
|
$msg = substr($message,0,$msglen);
|
||||||
|
$message = substr($message,$msglen);
|
||||||
|
$pos = strpos($msg,"\r\n");
|
||||||
|
if (!is_int($pos)) { // line not terminated
|
||||||
|
$msg = chop($msg)."\r\n";
|
||||||
|
}
|
||||||
|
$pos = strpos($msg,"."); // escape leading periods
|
||||||
|
if (is_int($pos) && !$pos) {
|
||||||
|
$msg = "." . $msg;
|
||||||
|
}
|
||||||
|
if (!$this->msg2socket($socket,$msg)) { return false; }
|
||||||
|
$pos = strpos($message,"\n");
|
||||||
|
} while (strlen($message)>0);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_header($subject,$header) { // check if header contains subject
|
||||||
|
// and is correctly terminated
|
||||||
|
$header = chop($header);
|
||||||
|
$header .= "\n";
|
||||||
|
if (is_string($subject) && !$subject) { // no subject specified
|
||||||
|
return $header;
|
||||||
|
}
|
||||||
|
$theader = strtolower($header);
|
||||||
|
$pos = strpos($theader,"\nsubject:");
|
||||||
|
if (is_int($pos)) { // found after a new line
|
||||||
|
return $header;
|
||||||
|
}
|
||||||
|
$pos = strpos($theader,"subject:");
|
||||||
|
if (is_int($pos) && !$pos) { // found at start
|
||||||
|
return $header;
|
||||||
|
}
|
||||||
|
$pos = substr($subject,"\n");
|
||||||
|
if (!is_int($pos)) $subject .= "\n";
|
||||||
|
$subject = "Subject: " .$subject;
|
||||||
|
$header .= $subject;
|
||||||
|
return $header;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==============================================[ main function: smail() ]===
|
||||||
|
|
||||||
|
function smail($to,$subject,$message,$header) {
|
||||||
|
global $phpgw_info;
|
||||||
|
|
||||||
|
$fromuser = $phpgw_info["user"]["preferences"]["email"]["address"];
|
||||||
|
$mymachine = $phpgw_info["server"]["hostname"];
|
||||||
|
$errcode = ""; $errmsg = ""; // error code and message of failed connection
|
||||||
|
$timeout = 5; // timeout in secs
|
||||||
|
|
||||||
|
// now we try to open the socket and check, if any smtp server responds
|
||||||
|
$socket = fsockopen($phpgw_info["server"]["smtp_server"],$phpgw_info["server"]["smtp_port"],$errcode,$errmsg,$timeout);
|
||||||
|
if (!$socket) {
|
||||||
|
$this->err["code"] = "420";
|
||||||
|
$this->err["msg"] = "$errcode:$errmsg";
|
||||||
|
$this->err["desc"] = "Connection to ".$phpgw_info["server"]["smtp_server"].":".$phpgw_info["server"]["smtp_port"]." failed - could not open socket.";
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
$rrc = $this->socket2msg($socket);
|
||||||
|
}
|
||||||
|
|
||||||
|
// now we can send our message. 1st we identify ourselves and the sender
|
||||||
|
$cmds = array (
|
||||||
|
"\$src = \$this->msg2socket(\$socket,\"HELO \$mymachine\r\n\");",
|
||||||
|
"\$rrc = \$this->socket2msg(\$socket);",
|
||||||
|
"\$src = \$this->msg2socket(\$socket,\"MAIL FROM:<\$fromuser>\r\n\");",
|
||||||
|
"\$rrc = \$this->socket2msg(\$socket);"
|
||||||
|
);
|
||||||
|
for ($src=true,$rrc=true,$i=0; $i<count($cmds);$i++) {
|
||||||
|
eval ($cmds[$i]);
|
||||||
|
if (!$src || !$rrc) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// now we've got to evaluate the $to's
|
||||||
|
$toaddr = explode(",",$to);
|
||||||
|
$numaddr = count($toaddr);
|
||||||
|
for ($i=0; $i<$numaddr; $i++) {
|
||||||
|
$src = $this->msg2socket($socket,"RCPT TO:<$toaddr[$i]>\r\n");
|
||||||
|
$rrc = $this->socket2msg($socket);
|
||||||
|
$this->to_res[$i][addr] = $toaddr[$i]; // for lateron validation
|
||||||
|
$this->to_res[$i][code] = $this->err["code"];
|
||||||
|
$this->to_res[$i][msg] = $this->err["msg"];
|
||||||
|
$this->to_res[$i][desc] = $this->err["desc"];
|
||||||
|
}
|
||||||
|
|
||||||
|
//now we have to make sure that at least one $to-address was accepted
|
||||||
|
$stop = 1;
|
||||||
|
for ($i=0;$i<count($this->to_res);$i++) {
|
||||||
|
$rc = substr($this->to_res[$i][code],0,1);
|
||||||
|
if ($rc == 2) { // at least to this address we can deliver
|
||||||
|
$stop = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($stop) return false; // no address found we can deliver to
|
||||||
|
|
||||||
|
// now we can go to deliver the message!
|
||||||
|
if (!$this->msg2socket($socket,"DATA\r\n")) return false;
|
||||||
|
if (!$this->socket2msg($socket)) return false;
|
||||||
|
if ($header != "") {
|
||||||
|
$header = $this->check_header($subject,$header);
|
||||||
|
if (!$this->put2socket($socket,$header)) return false;
|
||||||
|
if (!$this->put2socket($socket,"\r\n")) return false;
|
||||||
|
}
|
||||||
|
$message = chop($message);
|
||||||
|
$message .= "\n";
|
||||||
|
if (!$this->put2socket($socket,$message)) return false;
|
||||||
|
if (!$this->msg2socket($socket,".\r\n")) return false;
|
||||||
|
if (!$this->socket2msg($socket)) return false;
|
||||||
|
if (!$this->msg2socket($socket,"QUIT\r\n")) return false;
|
||||||
|
Do {
|
||||||
|
$closing = $this->socket2msg($socket);
|
||||||
|
} while ($closing);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// end of class
|
||||||
|
}
|
185
phpgwapi/phpgw_session.inc.php
Normal file
185
phpgwapi/phpgw_session.inc.php
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* This file written by Joseph Engo <jengo@phpgroupware.org> *
|
||||||
|
* and Dan Kuykendall <dan@kuykendall.org> *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
class sessions
|
||||||
|
{
|
||||||
|
function getuser_ip()
|
||||||
|
{
|
||||||
|
global $REMOTE_ADDR, $HTTP_X_FORWARDED_FOR;
|
||||||
|
|
||||||
|
if ($HTTP_X_FORWARDED_FOR) {
|
||||||
|
return $HTTP_X_FORWARDED_FOR;
|
||||||
|
} else {
|
||||||
|
return $REMOTE_ADDR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function verify()
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info, $sessionid, $kp3;
|
||||||
|
$db = $phpgw->db;
|
||||||
|
$db2 = $phpgw->db;
|
||||||
|
|
||||||
|
$db->query("select * from phpgw_sessions where session_id='$sessionid'",__LINE__,__FILE__);
|
||||||
|
$db->next_record();
|
||||||
|
|
||||||
|
if ($db->f("session_info") == "" || $db->f("session_info") == "NULL") {
|
||||||
|
$phpgw_info["user"]["account_lid"] = $db->f("session_lid");
|
||||||
|
$phpgw_info["user"]["sessionid"] = $sessionid;
|
||||||
|
$phpgw_info["user"]["session_ip"] = $db->f("session_ip");
|
||||||
|
|
||||||
|
$t = explode("@",$db->f("session_lid"));
|
||||||
|
$phpgw_info["user"]["userid"] = $t[0];
|
||||||
|
|
||||||
|
$phpgw->accounts->sync(__LINE__,__FILE__);
|
||||||
|
|
||||||
|
// Now we need to re-read eveything
|
||||||
|
$db->query("select * from phpgw_sessions where session_id='$sessionid'",__LINE__,__FILE__);
|
||||||
|
$db->next_record();
|
||||||
|
}
|
||||||
|
|
||||||
|
$phpgw_info["user"]["kp3"] = $kp3;
|
||||||
|
|
||||||
|
$phpgw_info_flags = $phpgw_info["flags"];
|
||||||
|
$phpgw_info = unserialize(stripslashes($db->f("session_info")));
|
||||||
|
$phpgw_info["flags"] = $phpgw_info_flags;
|
||||||
|
|
||||||
|
$userid_array = explode("@",$db->f("session_lid"));
|
||||||
|
$phpgw_info["user"]["userid"] = $userid_array[0];
|
||||||
|
|
||||||
|
if ($userid_array[1] != $phpgw_info["user"]["domain"]) {
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PHP_OS != "Windows" && (! $phpgw_info["user"]["session_ip"] || $phpgw_info["user"]["session_ip"] != $this->getuser_ip())){
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->update_dla();
|
||||||
|
|
||||||
|
if (! $phpgw_info["user"]["userid"] ) {
|
||||||
|
return False;
|
||||||
|
} else {
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This will remove stale sessions out of the database
|
||||||
|
function clean_sessions()
|
||||||
|
{
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
|
||||||
|
// Note: I need to add a db->lock() in here
|
||||||
|
|
||||||
|
if (!isset($phpgw_info["server"]["cron_apps"]) || ! $phpgw_info["server"]["cron_apps"]) {
|
||||||
|
$phpgw->db->query("delete from phpgw_sessions where session_dla <= '" . (time() - 7200)
|
||||||
|
. "'",__LINE__,__FILE__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function create($login,$passwd)
|
||||||
|
{
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
|
||||||
|
$this->clean_sessions();
|
||||||
|
|
||||||
|
$login_array = explode("@", $login);
|
||||||
|
$phpgw_info["user"]["userid"] = $login_array[0];
|
||||||
|
|
||||||
|
if ($phpgw_info["server"]["global_denied_users"][$phpgw_info["user"]["userid"]]) {
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$phpgw->auth->authenticate($phpgw_info["user"]["userid"], $passwd)) {
|
||||||
|
return False;
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$phpgw_info["user"]["sessionid"] = md5($phpgw->common->randomstring(10));
|
||||||
|
$phpgw_info["user"]["kp3"] = md5($phpgw->common->randomstring(15));
|
||||||
|
|
||||||
|
$phpgw->common->key = $phpgw_info["server"]["encryptkey"];
|
||||||
|
$phpgw->common->iv = $phpgw_info["server"]["mcrypt_iv"];
|
||||||
|
$phpgw->crypto = new crypto($phpgw->common->key,$phpgw->common->iv);
|
||||||
|
|
||||||
|
$phpgw_info["user"]["passwd"] = $phpgw->common->encrypt($passwd);
|
||||||
|
|
||||||
|
if ($phpgw_info["server"]["usecookies"]) {
|
||||||
|
Setcookie("sessionid",$phpgw_info["user"]["sessionid"]);
|
||||||
|
Setcookie("kp3",$phpgw_info["user"]["kp3"]);
|
||||||
|
Setcookie("domain",$phpgw_info["user"]["domain"]);
|
||||||
|
Setcookie("last_domain",$phpgw_info["user"]["domain"],time()+1209600);
|
||||||
|
if ($phpgw_info["user"]["domain"] ==$phpgw_info["server"]["default_domain"]) {
|
||||||
|
Setcookie("last_loginid",$phpgw_info["user"]["userid"],time()+1209600); // For 2 weeks
|
||||||
|
} else {
|
||||||
|
Setcookie("last_loginid",$loginid,time()+1209600); // For 2 weeks
|
||||||
|
}
|
||||||
|
unset ($phpgw_info["server"]["default_domain"]); // we kill this for security reasons
|
||||||
|
}
|
||||||
|
|
||||||
|
//$phpgw->accounts->accounts_const();
|
||||||
|
|
||||||
|
$phpgw_info["user"]["session_ip"] = $this->getuser_ip();
|
||||||
|
|
||||||
|
$phpgw->db->query("insert into phpgw_sessions values ('" . $phpgw_info["user"]["sessionid"]
|
||||||
|
. "','".$login."','" . $this->getuser_ip() . "','"
|
||||||
|
. time() . "','" . time() . "','')",__LINE__,__FILE__);
|
||||||
|
$phpgw->accounts->sync(__LINE__,__FILE__);
|
||||||
|
|
||||||
|
$phpgw->db->query("insert into phpgw_access_log values ('" . $phpgw_info["user"]["sessionid"] . "','"
|
||||||
|
. "$login','" . $this->getuser_ip() . "','" . time()
|
||||||
|
. "','') ",__LINE__,__FILE__);
|
||||||
|
|
||||||
|
$phpgw->db->query("update accounts set account_lastloginfrom='"
|
||||||
|
. $this->getuser_ip() . "', account_lastlogin='" . time()
|
||||||
|
. "' where account_lid='".$login."'",__LINE__,__FILE__);
|
||||||
|
|
||||||
|
return $phpgw_info["user"]["sessionid"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// This will update the DateLastActive column, so the login does not expire
|
||||||
|
function update_dla()
|
||||||
|
{
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
|
||||||
|
$phpgw->db->query("update phpgw_sessions set session_dla='" . time() . "' where session_id='"
|
||||||
|
. $phpgw_info["user"]["sessionid"]."'",__LINE__,__FILE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
function destroy()
|
||||||
|
{
|
||||||
|
global $phpgw, $phpgw_info, $sessionid, $kp3;
|
||||||
|
$phpgw_info["user"]["sessionid"] = $sessionid;
|
||||||
|
$phpgw_info["user"]["kp3"] = $kp3;
|
||||||
|
|
||||||
|
$phpgw->db->query("delete from phpgw_sessions where session_id='"
|
||||||
|
. $phpgw_info["user"]["sessionid"] . "'",__LINE__,__FILE__);
|
||||||
|
$phpgw->db->query("delete from phpgw_app_sessions where sessionid='"
|
||||||
|
. $phpgw_info["user"]["sessionid"] . "'",__LINE__,__FILE__);
|
||||||
|
$phpgw->db->query("update phpgw_access_log set lo='" . time() . "' where sessionid='"
|
||||||
|
. $phpgw_info["user"]["sessionid"] . "'",__LINE__,__FILE__);
|
||||||
|
if ($phpgw_info["server"]["usecookies"]) {
|
||||||
|
Setcookie("sessionid");
|
||||||
|
Setcookie("kp3");
|
||||||
|
if ($phpgw_info["multiable_domains"]) {
|
||||||
|
Setcookie("domain");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->clean_sessions();
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
346
phpgwapi/phpgw_template.inc.php
Normal file
346
phpgwapi/phpgw_template.inc.php
Normal file
@ -0,0 +1,346 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Session Management for PHP3
|
||||||
|
*
|
||||||
|
* (C) Copyright 1999-2000 NetUSE GmbH
|
||||||
|
* Kristian Koehntopp
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Template {
|
||||||
|
var $classname = "Template";
|
||||||
|
|
||||||
|
/* if set, echo assignments */
|
||||||
|
var $debug = false;
|
||||||
|
|
||||||
|
/* $file[handle] = "filename"; */
|
||||||
|
var $file = array();
|
||||||
|
|
||||||
|
/* relative filenames are relative to this pathname */
|
||||||
|
var $root = "";
|
||||||
|
|
||||||
|
/* $varkeys[key] = "key"; $varvals[key] = "value"; */
|
||||||
|
var $varkeys = array();
|
||||||
|
var $varvals = array();
|
||||||
|
|
||||||
|
/* "remove" => remove undefined variables
|
||||||
|
* "comment" => replace undefined variables with comments
|
||||||
|
* "keep" => keep undefined variables
|
||||||
|
*/
|
||||||
|
var $unknowns = "remove";
|
||||||
|
|
||||||
|
/* "yes" => halt, "report" => report error, continue, "no" => ignore error quietly */
|
||||||
|
var $halt_on_error = "yes";
|
||||||
|
|
||||||
|
/* last error message is retained here */
|
||||||
|
var $last_error = "";
|
||||||
|
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
/* public: Constructor.
|
||||||
|
* root: template directory.
|
||||||
|
* unknowns: how to handle unknown variables.
|
||||||
|
*/
|
||||||
|
function Template($root = ".", $unknowns = "remove") {
|
||||||
|
$this->set_root($root);
|
||||||
|
$this->set_unknowns($unknowns);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: setroot(pathname $root)
|
||||||
|
* root: new template directory.
|
||||||
|
*/
|
||||||
|
function set_root($root) {
|
||||||
|
if (!is_dir($root)) {
|
||||||
|
$this->halt("set_root: $root is not a directory.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->root = $root;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: set_unknowns(enum $unknowns)
|
||||||
|
* unknowns: "remove", "comment", "keep"
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function set_unknowns($unknowns = "keep") {
|
||||||
|
$this->unknowns = $unknowns;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: set_file(array $filelist)
|
||||||
|
* filelist: array of handle, filename pairs.
|
||||||
|
*
|
||||||
|
* public: set_file(string $handle, string $filename)
|
||||||
|
* handle: handle for a filename,
|
||||||
|
* filename: name of template file
|
||||||
|
*/
|
||||||
|
function set_file($handle, $filename = "") {
|
||||||
|
if (!is_array($handle)) {
|
||||||
|
if ($filename == "") {
|
||||||
|
$this->halt("set_file: For handle $handle filename is empty.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$this->file[$handle] = $this->filename($filename);
|
||||||
|
} else {
|
||||||
|
reset($handle);
|
||||||
|
while(list($h, $f) = each($handle)) {
|
||||||
|
$this->file[$h] = $this->filename($f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: set_block(string $parent, string $handle, string $name = "")
|
||||||
|
* extract the template $handle from $parent,
|
||||||
|
* place variable {$name} instead.
|
||||||
|
*/
|
||||||
|
function set_block($parent, $handle, $name = "") {
|
||||||
|
if (!$this->loadfile($parent)) {
|
||||||
|
$this->halt("subst: unable to load $parent.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ($name == "")
|
||||||
|
$name = $handle;
|
||||||
|
|
||||||
|
$str = $this->get_var($parent);
|
||||||
|
$reg = "/<!--\s+BEGIN $handle\s+-->(.*)\n\s*<!--\s+END $handle\s+-->/sm";
|
||||||
|
preg_match_all($reg, $str, $m);
|
||||||
|
$str = preg_replace($reg, "{" . "$name}", $str);
|
||||||
|
$this->set_var($handle, $m[1][0]);
|
||||||
|
$this->set_var($parent, $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: set_var(array $values)
|
||||||
|
* values: array of variable name, value pairs.
|
||||||
|
*
|
||||||
|
* public: set_var(string $varname, string $value)
|
||||||
|
* varname: name of a variable that is to be defined
|
||||||
|
* value: value of that variable
|
||||||
|
*/
|
||||||
|
function set_var($varname, $value = "") {
|
||||||
|
if (!is_array($varname)) {
|
||||||
|
if (!empty($varname))
|
||||||
|
if ($this->debug) print "scalar: set *$varname* to *$value*<br>\n";
|
||||||
|
$this->varkeys[$varname] = "/".$this->varname($varname)."/";
|
||||||
|
$this->varvals[$varname] = $value;
|
||||||
|
} else {
|
||||||
|
reset($varname);
|
||||||
|
while(list($k, $v) = each($varname)) {
|
||||||
|
if (!empty($k))
|
||||||
|
if ($this->debug) print "array: set *$k* to *$v*<br>\n";
|
||||||
|
$this->varkeys[$k] = "/".$this->varname($k)."/";
|
||||||
|
$this->varvals[$k] = $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: subst(string $handle)
|
||||||
|
* handle: handle of template where variables are to be substituted.
|
||||||
|
*/
|
||||||
|
function subst($handle) {
|
||||||
|
if (!$this->loadfile($handle)) {
|
||||||
|
$this->halt("subst: unable to load $handle.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$str = $this->get_var($handle);
|
||||||
|
$str = @preg_replace($this->varkeys, $this->varvals, $str);
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: psubst(string $handle)
|
||||||
|
* handle: handle of template where variables are to be substituted.
|
||||||
|
*/
|
||||||
|
function psubst($handle) {
|
||||||
|
print $this->subst($handle);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: parse(string $target, string $handle, boolean append)
|
||||||
|
* public: parse(string $target, array $handle, boolean append)
|
||||||
|
* target: handle of variable to generate
|
||||||
|
* handle: handle of template to substitute
|
||||||
|
* append: append to target handle
|
||||||
|
*/
|
||||||
|
function parse($target, $handle, $append = false) {
|
||||||
|
if (!is_array($handle)) {
|
||||||
|
$str = $this->subst($handle);
|
||||||
|
if ($append) {
|
||||||
|
$this->set_var($target, $this->get_var($target) . $str);
|
||||||
|
} else {
|
||||||
|
$this->set_var($target, $str);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
reset($handle);
|
||||||
|
while(list($i, $h) = each($handle)) {
|
||||||
|
$str = $this->subst($h);
|
||||||
|
$this->set_var($target, $str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
function pparse($target, $handle, $append = false) {
|
||||||
|
print $this->parse($target, $handle, $append);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: get_vars()
|
||||||
|
*/
|
||||||
|
function get_vars() {
|
||||||
|
reset($this->varkeys);
|
||||||
|
while(list($k, $v) = each($this->varkeys)) {
|
||||||
|
$result[$k] = $this->varvals[$k];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: get_var(string varname)
|
||||||
|
* varname: name of variable.
|
||||||
|
*
|
||||||
|
* public: get_var(array varname)
|
||||||
|
* varname: array of variable names
|
||||||
|
*/
|
||||||
|
function get_var($varname) {
|
||||||
|
if (!is_array($varname)) {
|
||||||
|
return $this->varvals[$varname];
|
||||||
|
} else {
|
||||||
|
reset($varname);
|
||||||
|
while(list($k, $v) = each($varname)) {
|
||||||
|
$result[$k] = $this->varvals[$k];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: get_undefined($handle)
|
||||||
|
* handle: handle of a template.
|
||||||
|
*/
|
||||||
|
function get_undefined($handle) {
|
||||||
|
if (!$this->loadfile($handle)) {
|
||||||
|
$this->halt("get_undefined: unable to load $handle.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
preg_match_all("/\{([^}]+)\}/", $this->get_var($handle), $m);
|
||||||
|
$m = $m[1];
|
||||||
|
if (!is_array($m))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
reset($m);
|
||||||
|
while(list($k, $v) = each($m)) {
|
||||||
|
if (!isset($this->varkeys[$v]))
|
||||||
|
$result[$v] = $v;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($result))
|
||||||
|
return $result;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: finish(string $str)
|
||||||
|
* str: string to finish.
|
||||||
|
*/
|
||||||
|
function finish($str) {
|
||||||
|
switch ($this->unknowns) {
|
||||||
|
case "keep":
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "remove":
|
||||||
|
$str = preg_replace('/{[^ \t\r\n}]+}/', "", $str);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "comment":
|
||||||
|
$str = preg_replace('/{([^ \t\r\n}]+)}/', "<!-- Template $handle: Variable \\1 undefined -->", $str);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public: p(string $varname)
|
||||||
|
* varname: name of variable to print.
|
||||||
|
*/
|
||||||
|
function p($varname) {
|
||||||
|
print $this->finish($this->get_var($varname));
|
||||||
|
}
|
||||||
|
|
||||||
|
function get($varname) {
|
||||||
|
return $this->finish($this->get_var($varname));
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
/* private: filename($filename)
|
||||||
|
* filename: name to be completed.
|
||||||
|
*/
|
||||||
|
function filename($filename) {
|
||||||
|
if (substr($filename, 0, 1) != "/") {
|
||||||
|
$filename = $this->root."/".$filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!file_exists($filename))
|
||||||
|
$this->halt("filename: file $filename does not exist.");
|
||||||
|
|
||||||
|
return $filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* private: varname($varname)
|
||||||
|
* varname: name of a replacement variable to be protected.
|
||||||
|
*/
|
||||||
|
function varname($varname) {
|
||||||
|
return preg_quote("{".$varname."}");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* private: loadfile(string $handle)
|
||||||
|
* handle: load file defined by handle, if it is not loaded yet.
|
||||||
|
*/
|
||||||
|
function loadfile($handle) {
|
||||||
|
if (isset($this->varkeys[$handle]) and !empty($this->varvals[$handle]))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (!isset($this->file[$handle])) {
|
||||||
|
$this->halt("loadfile: $handle is not a valid handle.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$filename = $this->file[$handle];
|
||||||
|
|
||||||
|
$str = implode("", @file($filename));
|
||||||
|
if (empty($str)) {
|
||||||
|
$this->halt("loadfile: While loading $handle, $filename does not exist or is empty.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->set_var($handle, $str);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
/* public: halt(string $msg)
|
||||||
|
* msg: error message to show.
|
||||||
|
*/
|
||||||
|
function halt($msg) {
|
||||||
|
$this->last_error = $msg;
|
||||||
|
|
||||||
|
if ($this->halt_on_error != "no")
|
||||||
|
$this->haltmsg($msg);
|
||||||
|
|
||||||
|
if ($this->halt_on_error == "yes")
|
||||||
|
die("<b>Halted.</b>");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public, override: haltmsg($msg)
|
||||||
|
* msg: error message to show.
|
||||||
|
*/
|
||||||
|
function haltmsg($msg) {
|
||||||
|
printf("<b>Template Error:</b> %s<br>\n", $msg);
|
||||||
|
}
|
||||||
|
}
|
83
phpgwapi/phpgw_todo.inc.php
Normal file
83
phpgwapi/phpgw_todo.inc.php
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* This file written by Marc Logemann <logemann@marc-logemann.de> *
|
||||||
|
* -------------------------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
class todo
|
||||||
|
{
|
||||||
|
var $projectid;
|
||||||
|
var $parent;
|
||||||
|
var $owner;
|
||||||
|
var $access;
|
||||||
|
var $desc;
|
||||||
|
var $priority;
|
||||||
|
var $status;
|
||||||
|
var $createdate;
|
||||||
|
var $customernr;
|
||||||
|
var $hours;
|
||||||
|
var $deadline;
|
||||||
|
// array $participants;
|
||||||
|
|
||||||
|
var $db; // database handle
|
||||||
|
|
||||||
|
//========================================
|
||||||
|
// CONSTRUCTOR
|
||||||
|
//========================================
|
||||||
|
function todo()
|
||||||
|
{
|
||||||
|
// dont know yet
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================
|
||||||
|
// adds a project into database (API)
|
||||||
|
//========================================
|
||||||
|
function addproject()
|
||||||
|
{
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================
|
||||||
|
// view project details (API)
|
||||||
|
//========================================
|
||||||
|
function viewproject()
|
||||||
|
{
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================
|
||||||
|
// delete project (API)
|
||||||
|
//========================================
|
||||||
|
function delproject()
|
||||||
|
{
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================
|
||||||
|
// add participant (API)
|
||||||
|
//========================================
|
||||||
|
function addparticipant()
|
||||||
|
{
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************
|
||||||
|
// here we got helper methods for APIs
|
||||||
|
// ***************************************************
|
||||||
|
|
||||||
|
// ---------------------
|
||||||
|
// helper 1
|
||||||
|
//----------------------
|
||||||
|
function helper1()
|
||||||
|
{
|
||||||
|
global $phpgw_info, $phpgw;
|
||||||
|
}
|
||||||
|
}
|
44
phpgwapi/phpgw_utilities.inc.php
Normal file
44
phpgwapi/phpgw_utilities.inc.php
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* This file written by Dan Kuykendall <seek3r@phpgroupware.org> *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
$d1 = strtolower(substr($phpgw_info["server"]["api_dir"],0,3));
|
||||||
|
if($d1 == "htt" || $d1 == "ftp") {
|
||||||
|
echo "Failed attempt to break in via an old Security Hole!<br>\n";
|
||||||
|
exit;
|
||||||
|
} unset($d1);
|
||||||
|
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_utilities_rssparse.inc.php");
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_utilities_clientsniffer.inc.php");
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_utilities_http.inc.php");
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_utilities_matrixview.inc.php");
|
||||||
|
include($phpgw_info["server"]["api_dir"] . "/phpgw_utilities_menutree.inc.php");
|
||||||
|
|
||||||
|
class utilities
|
||||||
|
{
|
||||||
|
var $rssparser;
|
||||||
|
var $clientsniffer;
|
||||||
|
var $http;
|
||||||
|
var $matrixview;
|
||||||
|
var $menutree;
|
||||||
|
|
||||||
|
function utilities_()
|
||||||
|
{
|
||||||
|
$this->rssparser = new rssparser;
|
||||||
|
$this->clientsniffer = new clientsniffer;
|
||||||
|
$this->http = new http;
|
||||||
|
$this->matrixview = new matrixview;
|
||||||
|
$this->menutree = new menutree;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
329
phpgwapi/phpgw_utilities_clientsniffer.inc.php
Normal file
329
phpgwapi/phpgw_utilities_clientsniffer.inc.php
Normal file
@ -0,0 +1,329 @@
|
|||||||
|
<?php
|
||||||
|
/******************************************
|
||||||
|
** Description : PHPClientSniffer
|
||||||
|
** Version : 1.0.0
|
||||||
|
** File Name : PHPClientSniffer.php3
|
||||||
|
** Author : Roger Raymond for PHyX8 studios
|
||||||
|
** Author Email : roger.raymond@asphyxia.com
|
||||||
|
** Created : Wednesday, August 23, 2000
|
||||||
|
** Last Modified :
|
||||||
|
** Modified By :
|
||||||
|
*'
|
||||||
|
INFO:
|
||||||
|
Returns client information based on HTTP_USER_AGENT
|
||||||
|
|
||||||
|
BASED ON WORKS AND IDEAS BY:
|
||||||
|
Tim Perdue of PHPBuilder.com
|
||||||
|
http://www.phpbuilder.com/columns/tim20000821.php3
|
||||||
|
|
||||||
|
The Ultimate JavaScript Client Sniffer by Netscape.
|
||||||
|
http://developer.netscape.com/docs/examples/javascript/NAME_type.html
|
||||||
|
|
||||||
|
========================================================================
|
||||||
|
USAGE:
|
||||||
|
========================================================================
|
||||||
|
include("PHPClientSniffer.php3");
|
||||||
|
$is = new sniffer;
|
||||||
|
========================================================================
|
||||||
|
VARIABLE NAMES VALUES
|
||||||
|
========================================================================
|
||||||
|
$is->UA The HTTP USER AGENT String
|
||||||
|
$is->NAME Browser Name (Netscape, IE, Opera, iCab, Unknown)
|
||||||
|
$is->VERSION Browser Full Version
|
||||||
|
$is->MAJORVER Browser Major Version
|
||||||
|
$is->MINORVER Browser Minor Version
|
||||||
|
$is->AOL True/False
|
||||||
|
$is->WEBTV True/False
|
||||||
|
$is->JS Assumed JavaScript Version Supported by Browser
|
||||||
|
$is->PLATFORM System Platform (Win16,Win32,Mac,OS2,Unix)
|
||||||
|
$is->OS System OS (Win98,OS2,Mac68k,linux,bsd,etc...) see code
|
||||||
|
$is->IP REMOTE_ADDR
|
||||||
|
|
||||||
|
========================================================================
|
||||||
|
|
||||||
|
'****************************************/
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
class clientsniffer
|
||||||
|
{ var $UA = "";
|
||||||
|
var $NAME = "Unknown";
|
||||||
|
var $VERSION = 0;
|
||||||
|
var $MAJORVER = 0;
|
||||||
|
var $MINORVER = 0;
|
||||||
|
var $AOL = false;
|
||||||
|
var $WEBTV = false;
|
||||||
|
var $JS = 0.0;
|
||||||
|
var $PLATFORM = "Unknown";
|
||||||
|
var $OS = "Unknown";
|
||||||
|
var $IP = "Unknown";
|
||||||
|
|
||||||
|
/* START CONSTRUCTOR */
|
||||||
|
function clientsniffer()
|
||||||
|
{ $this->UA = getenv(HTTP_USER_AGENT);
|
||||||
|
|
||||||
|
// Determine NAME Name and Version
|
||||||
|
if ( eregi( 'MSIE ([0-9].[0-9a-zA-Z]{1,4})',$this->UA,$info) ||
|
||||||
|
eregi( 'Microsoft Internet Explorer ([0-9].[0-9a-zA-Z]{1,4})',$this->UA,$info) )
|
||||||
|
{ $this->VERSION = $info[1];
|
||||||
|
$this->NAME = 'IE';
|
||||||
|
}
|
||||||
|
elseif ( eregi( 'Opera ([0-9].[0-9a-zA-Z]{1,4})',$this->UA,$info) ||
|
||||||
|
eregi( 'Opera/([0-9].[0-9a-zA-Z]{1,4})',$this->UA,$info) )
|
||||||
|
{ $this->VERSION = $info[1];
|
||||||
|
$this->NAME = 'Opera';
|
||||||
|
}
|
||||||
|
elseif ( eregi( 'iCab ([0-9].[0-9a-zA-Z]{1,4})',$this->UA,$info) ||
|
||||||
|
eregi( 'iCab/([0-9].[0-9a-zA-Z]{1,4})',$this->UA,$info) )
|
||||||
|
{ $this->VERSION = $info[1];
|
||||||
|
$this->NAME = 'iCab';
|
||||||
|
}
|
||||||
|
elseif ( eregi( 'Netscape6/([0-9].[0-9a-zA-Z]{1,4})',$this->UA,$info) )
|
||||||
|
{ $this->VERSION = $info[1];
|
||||||
|
$this->NAME = 'Netscape';
|
||||||
|
}
|
||||||
|
elseif ( eregi( 'Mozilla/([0-9].[0-9a-zA-Z]{1,4})',$this->UA,$info) )
|
||||||
|
{ $this->VERSION = $info[1];
|
||||||
|
$this->NAME = 'Netscape';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ $this->VERSION = 0;
|
||||||
|
$this->NAME = 'Unknown';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine if AOL or WEBTV
|
||||||
|
if( eregi( 'aol',$this->UA,$info))
|
||||||
|
{ $this->AOL = true;
|
||||||
|
}
|
||||||
|
elseif( eregi( 'webtv',$this->UA,$info))
|
||||||
|
{ $this->WEBTV = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine Major and Minor Version
|
||||||
|
if($this->VERSION > 0)
|
||||||
|
{ $pos = strpos($this->VERSION,".");
|
||||||
|
if ($pos > 0)
|
||||||
|
{ $this->MAJORVER = substr($this->VERSION,0,$pos);
|
||||||
|
$this->MINORVER = substr($this->VERSION,$pos,strlen($this->VERSION));
|
||||||
|
}
|
||||||
|
else $this->MAJORVER = $this->VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine Platform and OS
|
||||||
|
|
||||||
|
// Check for Windows 16-bit
|
||||||
|
if( eregi('Win16',$this->UA) ||
|
||||||
|
eregi('windows 3.1',$this->UA) ||
|
||||||
|
eregi('windows 16-bit',$this->UA) ||
|
||||||
|
eregi('16bit',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Win16";
|
||||||
|
$this->OS = "Win31";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for Windows 32-bit
|
||||||
|
if(eregi('Win95',$this->UA) || eregi('windows 95',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Win32";
|
||||||
|
$this->OS = "Win95";
|
||||||
|
}
|
||||||
|
elseif(eregi('Win98',$this->UA) || eregi('windows 98',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Win32";
|
||||||
|
$this->OS = "Win98";
|
||||||
|
}
|
||||||
|
elseif(eregi('WinNT',$this->UA) || eregi('windows NT',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Win32";
|
||||||
|
$this->OS = "WinNT";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ $this->PLATFORM = "Win32";
|
||||||
|
$this->OS = "Win9xNT";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for OS/2
|
||||||
|
if( eregi('os/2',$this->UA) ||
|
||||||
|
eregi('ibm-webexplorer',$this->UA))
|
||||||
|
{ $this->PLATFORM = "OS2";
|
||||||
|
$this->OS = "OS2";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for Mac 68000
|
||||||
|
if( eregi('68k',$this->UA) ||
|
||||||
|
eregi('68000',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Mac";
|
||||||
|
$this->OS = "Mac68k";
|
||||||
|
}
|
||||||
|
|
||||||
|
//Check for Mac PowerPC
|
||||||
|
if( eregi('ppc',$this->UA) ||
|
||||||
|
eregi('powerpc',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Mac";
|
||||||
|
$this->OS = "MacPPC";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for Unix Flavor
|
||||||
|
|
||||||
|
//SunOS
|
||||||
|
if(eregi('sunos',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "sun";
|
||||||
|
}
|
||||||
|
if(eregi('sunos 4',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "sun4";
|
||||||
|
}
|
||||||
|
elseif(eregi('sunos 5',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "sun5";
|
||||||
|
}
|
||||||
|
elseif(eregi('i86',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "suni86";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Irix
|
||||||
|
if(eregi('irix',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "irix";
|
||||||
|
}
|
||||||
|
if(eregi('irix 6',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "irix6";
|
||||||
|
}
|
||||||
|
elseif(eregi('irix 5',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "irix5";
|
||||||
|
}
|
||||||
|
|
||||||
|
//HP-UX
|
||||||
|
if(eregi('hp-ux',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "hpux";
|
||||||
|
}
|
||||||
|
if(eregi('hp-ux',$this->UA) && ereg('10.',$this-UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "hpux10";
|
||||||
|
}
|
||||||
|
elseif(eregi('hp-ux',$this->UA) && ereg('09.',$this-UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "hpux9";
|
||||||
|
}
|
||||||
|
|
||||||
|
//AIX
|
||||||
|
if(eregi('aix',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "aix";
|
||||||
|
}
|
||||||
|
if(eregi('aix1',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "aix1";
|
||||||
|
}
|
||||||
|
elseif(eregi('aix2',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "aix2";
|
||||||
|
}
|
||||||
|
elseif(eregi('aix3',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "aix3";
|
||||||
|
}
|
||||||
|
elseif(eregi('aix4',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "aix4";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Linux
|
||||||
|
if(eregi('inux',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "linux";
|
||||||
|
}
|
||||||
|
|
||||||
|
//Unixware
|
||||||
|
if(eregi('unix_system_v',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "unixware";
|
||||||
|
}
|
||||||
|
|
||||||
|
//mpras
|
||||||
|
if(eregi('ncr',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "mpras";
|
||||||
|
}
|
||||||
|
|
||||||
|
//Reliant
|
||||||
|
if(eregi('reliantunix',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "reliant";
|
||||||
|
}
|
||||||
|
|
||||||
|
// DEC
|
||||||
|
if(eregi('dec',$this->UA) ||
|
||||||
|
eregi('osfl',$this->UA) ||
|
||||||
|
eregi('alphaserver',$this->UA) ||
|
||||||
|
eregi('ultrix',$this->UA) ||
|
||||||
|
eregi('alphastation',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "dec";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sinix
|
||||||
|
if(eregi('sinix',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "sinix";
|
||||||
|
}
|
||||||
|
|
||||||
|
// FreeBSD
|
||||||
|
if(eregi('freebsd',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "freebsd";
|
||||||
|
}
|
||||||
|
|
||||||
|
// BSD
|
||||||
|
if(eregi('bsd',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "bsd";
|
||||||
|
}
|
||||||
|
|
||||||
|
// VMS
|
||||||
|
if(eregi('vax',$this->UA) || eregi('openvms',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "vms";
|
||||||
|
}
|
||||||
|
|
||||||
|
// SCO
|
||||||
|
if(eregi('sco',$this->UA) || eregi('unix_sv',$this->UA))
|
||||||
|
{ $this->PLATFORM = "Unix";
|
||||||
|
$this->OS = "sco";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assume JavaScript Version
|
||||||
|
|
||||||
|
// make the code a bit easier to read
|
||||||
|
$ie = eregi("ie",$this->NAME);
|
||||||
|
$ie5 = ( eregi("ie",$this->NAME) && ($this->MAJORVER >= 5) );
|
||||||
|
$ie4 = ( eregi("ie",$this->NAME) && ($this->MAJORVER >= 4) );
|
||||||
|
$ie3 = ( eregi("ie",$this->NAME) && ($this->MAJORVER >= 3) );
|
||||||
|
|
||||||
|
$nav = eregi("netscape",$this->NAME);
|
||||||
|
$nav5 = ( eregi("netscape",$this->NAME) && ($this->MAJORVER >= 5) );
|
||||||
|
$nav4 = ( eregi("netscape",$this->NAME) && ($this->MAJORVER >= 4) );
|
||||||
|
$nav3 = ( eregi("netscape",$this->NAME) && ($this->MAJORVER >= 3) );
|
||||||
|
$nav2 = ( eregi("netscape",$this->NAME) && ($this->MAJORVER >= 2) );
|
||||||
|
|
||||||
|
$opera = eregi("opera",$this->NAME);
|
||||||
|
|
||||||
|
// do the assumption
|
||||||
|
// update as new versions are released
|
||||||
|
|
||||||
|
// Provide upward compatibilty
|
||||||
|
if($nav && ($this->MAJORVER > 5)) $this->JS = 1.4;
|
||||||
|
elseif($ie && ($this->MAJORVER > 5)) $this->JS = 1.3;
|
||||||
|
// check existing versions
|
||||||
|
elseif($nav5) $this->JS = 1.4;
|
||||||
|
elseif(($nav4 && ($this->VERSION > 4.05)) || $ie4) $this->JS = 1.3;
|
||||||
|
elseif(($nav4 && ($this->VERSION <= 4.05)) || $ie4) $this->JS = 1.2;
|
||||||
|
elseif($nav3 || $opera) $this->JS = 1.1;
|
||||||
|
elseif(($nav && ($this->MAJORVER >= 2)) || ($ie && ($this->MAJORVER >=3))) $this->JS = 1.0;
|
||||||
|
//no idea
|
||||||
|
else $this->JS = 0.0;
|
||||||
|
|
||||||
|
// Grab IP Address
|
||||||
|
$this->IP = getenv('REMOTE_ADDR');
|
||||||
|
}
|
||||||
|
}
|
467
phpgwapi/phpgw_utilities_http.inc.php
Normal file
467
phpgwapi/phpgw_utilities_http.inc.php
Normal file
@ -0,0 +1,467 @@
|
|||||||
|
<?
|
||||||
|
/*
|
||||||
|
* http.php
|
||||||
|
*
|
||||||
|
*
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
class http
|
||||||
|
{
|
||||||
|
var $host_name="";
|
||||||
|
var $host_port=80;
|
||||||
|
var $proxy_host_name="";
|
||||||
|
var $proxy_host_port=80;
|
||||||
|
|
||||||
|
var $request_method="GET";
|
||||||
|
var $user_agent="Manuel Lemos HTTP class test script";
|
||||||
|
var $request_uri="";
|
||||||
|
var $protocol_version="1.0";
|
||||||
|
var $debug=0;
|
||||||
|
var $support_cookies=1;
|
||||||
|
var $cookies=array();
|
||||||
|
|
||||||
|
/* private variables - DO NOT ACCESS */
|
||||||
|
|
||||||
|
var $state="Disconnected";
|
||||||
|
var $connection=0;
|
||||||
|
var $content_length=0;
|
||||||
|
var $read_length=0;
|
||||||
|
var $request_host="";
|
||||||
|
var $months=array(
|
||||||
|
"Jan"=>"01",
|
||||||
|
"Feb"=>"02",
|
||||||
|
"Mar"=>"03",
|
||||||
|
"Apr"=>"04",
|
||||||
|
"May"=>"05",
|
||||||
|
"Jun"=>"06",
|
||||||
|
"Jul"=>"07",
|
||||||
|
"Aug"=>"08",
|
||||||
|
"Sep"=>"09",
|
||||||
|
"Oct"=>"10",
|
||||||
|
"Nov"=>"11",
|
||||||
|
"Dec"=>"12");
|
||||||
|
|
||||||
|
/* Private methods - DO NOT CALL */
|
||||||
|
|
||||||
|
Function OutputDebug($message)
|
||||||
|
{
|
||||||
|
echo $message,"\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
Function GetLine()
|
||||||
|
{
|
||||||
|
for($line="";;)
|
||||||
|
{
|
||||||
|
if(feof($this->connection)
|
||||||
|
|| !($part=fgets($this->connection,100)))
|
||||||
|
return(0);
|
||||||
|
$line.=$part;
|
||||||
|
$length=strlen($line);
|
||||||
|
if($length>=2
|
||||||
|
&& substr($line,$length-2,2)=="\r\n")
|
||||||
|
{
|
||||||
|
$line=substr($line,0,$length-2);
|
||||||
|
if($this->debug)
|
||||||
|
$this->OutputDebug("< $line");
|
||||||
|
return($line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Function PutLine($line)
|
||||||
|
{
|
||||||
|
if($this->debug)
|
||||||
|
$this->OutputDebug("> $line");
|
||||||
|
return(fputs($this->connection,"$line\r\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
Function PutData($data)
|
||||||
|
{
|
||||||
|
if($this->debug)
|
||||||
|
$this->OutputDebug("> $data");
|
||||||
|
return(fputs($this->connection,$data));
|
||||||
|
}
|
||||||
|
|
||||||
|
Function Readbytes($length)
|
||||||
|
{
|
||||||
|
if($this->debug)
|
||||||
|
{
|
||||||
|
if(($bytes=fread($this->connection,$length))!="")
|
||||||
|
$this->OutputDebug("< $bytes");
|
||||||
|
return($bytes);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return(fread($this->connection,$length));
|
||||||
|
}
|
||||||
|
|
||||||
|
Function EndOfInput()
|
||||||
|
{
|
||||||
|
return(feof($this->connection));
|
||||||
|
}
|
||||||
|
|
||||||
|
Function Connect($host_name,$host_port)
|
||||||
|
{
|
||||||
|
if($this->debug)
|
||||||
|
$this->OutputDebug("Connecting to $host_name...");
|
||||||
|
if(($this->connection=fsockopen($host_name,$host_port,&$error))==0)
|
||||||
|
{
|
||||||
|
switch($error)
|
||||||
|
{
|
||||||
|
case -3:
|
||||||
|
return("-3 socket could not be created");
|
||||||
|
case -4:
|
||||||
|
return("-4 dns lookup on hostname \"".$host_name."\" failed");
|
||||||
|
case -5:
|
||||||
|
return("-5 connection refused or timed out");
|
||||||
|
case -6:
|
||||||
|
return("-6 fdopen() call failed");
|
||||||
|
case -7:
|
||||||
|
return("-7 setvbuf() call failed");
|
||||||
|
default:
|
||||||
|
return($error." could not connect to the host \"".$host_name."\"");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if($this->debug)
|
||||||
|
$this->OutputDebug("Connected to $host_name");
|
||||||
|
$this->state="Connected";
|
||||||
|
return("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Function Disconnect()
|
||||||
|
{
|
||||||
|
if($this->debug)
|
||||||
|
$this->OutputDebug("Disconnected from ".$this->host_name);
|
||||||
|
fclose($this->connection);
|
||||||
|
return("");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Public methods */
|
||||||
|
|
||||||
|
Function Open($arguments)
|
||||||
|
{
|
||||||
|
if($this->state!="Disconnected")
|
||||||
|
return("1 already connected");
|
||||||
|
if(IsSet($arguments["HostName"]))
|
||||||
|
$this->host_name=$arguments["HostName"];
|
||||||
|
if(IsSet($arguments["HostPort"]))
|
||||||
|
$this->host_port=$arguments["HostPort"];
|
||||||
|
if(IsSet($arguments["ProxyHostName"]))
|
||||||
|
$this->proxy_host_name=$arguments["ProxyHostName"];
|
||||||
|
if(IsSet($arguments["ProxyHostPort"]))
|
||||||
|
$this->proxy_host_port=$arguments["ProxyHostPort"];
|
||||||
|
if(strlen($this->proxy_host_name)==0)
|
||||||
|
{
|
||||||
|
if(strlen($this->host_name)==0)
|
||||||
|
return("2 it was not specified a valid hostname");
|
||||||
|
$host_name=$this->host_name;
|
||||||
|
$host_port=$this->host_port;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$host_name=$this->proxy_host_name;
|
||||||
|
$host_port=$this->proxy_host_port;
|
||||||
|
}
|
||||||
|
$error=$this->Connect($host_name,$host_port);
|
||||||
|
if(strlen($error)==0)
|
||||||
|
$this->state="Connected";
|
||||||
|
return($error);
|
||||||
|
}
|
||||||
|
|
||||||
|
Function Close()
|
||||||
|
{
|
||||||
|
if($this->state=="Disconnected")
|
||||||
|
return("1 already disconnected");
|
||||||
|
$error=$this->Disconnect();
|
||||||
|
if(strlen($error)==0)
|
||||||
|
$this->state="Disconnected";
|
||||||
|
return($error);
|
||||||
|
}
|
||||||
|
|
||||||
|
Function SendRequest($arguments)
|
||||||
|
{
|
||||||
|
switch($this->state)
|
||||||
|
{
|
||||||
|
case "Disconnected":
|
||||||
|
return("1 connection was not yet established");
|
||||||
|
case "Connected":
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return("2 can not send request in the current connection state");
|
||||||
|
}
|
||||||
|
if(IsSet($arguments["RequestMethod"]))
|
||||||
|
$this->request_method=$arguments["RequestMethod"];
|
||||||
|
if(IsSet($arguments["User-Agent"]))
|
||||||
|
$this->user_agent=$arguments["User-Agent"];
|
||||||
|
if(strlen($this->request_method)==0)
|
||||||
|
return("3 it was not specified a valid request method");
|
||||||
|
if(IsSet($arguments["RequestURI"]))
|
||||||
|
$this->request_uri=$arguments["RequestURI"];
|
||||||
|
if(strlen($this->request_uri)==0
|
||||||
|
|| substr($this->request_uri,0,1)!="/")
|
||||||
|
return("4 it was not specified a valid request URI");
|
||||||
|
$request_body="";
|
||||||
|
$headers=(IsSet($arguments["Headers"]) ? $arguments["Headers"] : array());
|
||||||
|
if($this->request_method=="POST")
|
||||||
|
{
|
||||||
|
if(IsSet($arguments["PostValues"]))
|
||||||
|
{
|
||||||
|
$values=$arguments["PostValues"];
|
||||||
|
if(GetType($values)!="array")
|
||||||
|
return("5 it was not specified a valid POST method values array");
|
||||||
|
for($request_body="",Reset($values),$value=0;$value<count($values);Next($values),$value++)
|
||||||
|
{
|
||||||
|
if($value>0)
|
||||||
|
$request_body.="&";
|
||||||
|
$request_body.=Key($values)."=".UrlEncode($values[Key($values)]);
|
||||||
|
}
|
||||||
|
$headers["Content-type"]="application/x-www-form-urlencoded";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(strlen($this->proxy_host_name)==0)
|
||||||
|
$request_uri=$this->request_uri;
|
||||||
|
else
|
||||||
|
$request_uri="http://".$this->host_name.($this->host_port==80 ? "" : ":".$this->host_port).$this->request_uri;
|
||||||
|
if(($success=$this->PutLine($this->request_method." ".$request_uri." HTTP/".$this->protocol_version)))
|
||||||
|
{
|
||||||
|
if(($body_length=strlen($request_body)))
|
||||||
|
$headers["Content-length"]=$body_length;
|
||||||
|
for($host_set=0,Reset($headers),$header=0;$header<count($headers);Next($headers),$header++)
|
||||||
|
{
|
||||||
|
$header_name=Key($headers);
|
||||||
|
$header_value=$headers[$header_name];
|
||||||
|
if(GetType($header_value)=="array")
|
||||||
|
{
|
||||||
|
for(Reset($header_value),$value=0;$value<count($header_value);Next($header_value),$value++)
|
||||||
|
{
|
||||||
|
if(!$success=$this->PutLine("$header_name: ".$header_value[Key($header_value)]))
|
||||||
|
break 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(!$success=$this->PutLine("$header_name: $header_value"))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(strtolower(Key($headers))=="host")
|
||||||
|
{
|
||||||
|
$this->request_host=strtolower($header_value);
|
||||||
|
$host_set=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if($success)
|
||||||
|
{
|
||||||
|
if(!$host_set)
|
||||||
|
{
|
||||||
|
$success=$this->PutLine("Host: ".$this->host_name);
|
||||||
|
$this->request_host=strtolower($this->host_name);
|
||||||
|
}
|
||||||
|
if(count($this->cookies)
|
||||||
|
&& IsSet($this->cookies[0]))
|
||||||
|
{
|
||||||
|
$now=gmdate("Y-m-d H-i-s");
|
||||||
|
for($cookies=array(),$domain=0,Reset($this->cookies[0]);$domain<count($this->cookies[0]);Next($this->cookies[0]),$domain++)
|
||||||
|
{
|
||||||
|
$domain_pattern=Key($this->cookies[0]);
|
||||||
|
$match=strlen($this->request_host)-strlen($domain_pattern);
|
||||||
|
if($match>=0
|
||||||
|
&& !strcmp($domain_pattern,substr($this->request_host,$match))
|
||||||
|
&& ($match==0
|
||||||
|
|| $domain_pattern[0]=="."
|
||||||
|
|| $this->request_host[$match-1]=="."))
|
||||||
|
{
|
||||||
|
for(Reset($this->cookies[0][$domain_pattern]),$path_part=0;$path_part<count($this->cookies[0][$domain_pattern]);Next($this->cookies[0][$domain_pattern]),$path_part++)
|
||||||
|
{
|
||||||
|
$path=Key($this->cookies[0][$domain_pattern]);
|
||||||
|
if(strlen($this->request_uri)>=strlen($path)
|
||||||
|
&& substr($this->request_uri,0,strlen($path))==$path)
|
||||||
|
{
|
||||||
|
for(Reset($this->cookies[0][$domain_pattern][$path]),$cookie=0;$cookie<count($this->cookies[0][$domain_pattern][$path]);Next($this->cookies[0][$domain_pattern][$path]),$cookie++)
|
||||||
|
{
|
||||||
|
$cookie_name=Key($this->cookies[0][$domain_pattern][$path]);
|
||||||
|
$expires=$this->cookies[0][$domain_pattern][$path][$cookie_name]["expires"];
|
||||||
|
if($expires==""
|
||||||
|
|| strcmp($now,$expires)<0)
|
||||||
|
$cookies[$cookie_name]=$this->cookies[0][$domain_pattern][$path][$cookie_name];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(Reset($cookies),$cookie=0;$cookie<count($cookies);Next($cookies),$cookie++)
|
||||||
|
{
|
||||||
|
$cookie_name=Key($cookies);
|
||||||
|
if(!($success=$this->PutLine("Cookie: ".UrlEncode($cookie_name)."=".$cookies[$cookie_name]["value"].";")))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if($success)
|
||||||
|
{
|
||||||
|
if($success)
|
||||||
|
{
|
||||||
|
$success=$this->PutLine("");
|
||||||
|
if($body_length
|
||||||
|
&& $success)
|
||||||
|
$success=$this->PutData($request_body);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!$success)
|
||||||
|
return("5 could not send the HTTP request");
|
||||||
|
$this->state="RequestSent";
|
||||||
|
return("");
|
||||||
|
}
|
||||||
|
|
||||||
|
Function ReadReplyHeaders(&$headers)
|
||||||
|
{
|
||||||
|
switch($this->state)
|
||||||
|
{
|
||||||
|
case "Disconnected":
|
||||||
|
return("1 connection was not yet established");
|
||||||
|
case "Connected":
|
||||||
|
return("2 request was not sent");
|
||||||
|
case "RequestSent":
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return("3 can not get request headers in the current connection state");
|
||||||
|
}
|
||||||
|
$headers=array();
|
||||||
|
$this->content_length=$this->read_length=0;
|
||||||
|
$this->content_length_set=0;
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
$line=$this->GetLine();
|
||||||
|
if(GetType($line)!="string")
|
||||||
|
return("4 could not read request reply");
|
||||||
|
if($line=="")
|
||||||
|
{
|
||||||
|
$this->state="GotReplyHeaders";
|
||||||
|
return("");
|
||||||
|
}
|
||||||
|
$header_name=strtolower(strtok($line,":"));
|
||||||
|
$header_value=Trim(Chop(strtok("\r\n")));
|
||||||
|
if(IsSet($headers[$header_name]))
|
||||||
|
{
|
||||||
|
if(GetType($headers[$header_name])=="string")
|
||||||
|
$headers[$header_name]=array($headers[$header_name]);
|
||||||
|
$headers[$header_name][]=$header_value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
$headers[$header_name]=$header_value;
|
||||||
|
switch($header_name)
|
||||||
|
{
|
||||||
|
case "content-length":
|
||||||
|
$this->content_length=intval($headers[$header_name]);
|
||||||
|
$this->content_length_set=1;
|
||||||
|
break;
|
||||||
|
case "set-cookie":
|
||||||
|
if($this->support_cookies)
|
||||||
|
{
|
||||||
|
$cookie_name=trim(strtok($headers[$header_name],"="));
|
||||||
|
$cookie_value=strtok(";");
|
||||||
|
$domain=$this->request_host;
|
||||||
|
$path="/";
|
||||||
|
$expires="";
|
||||||
|
$secure=0;
|
||||||
|
while(($name=strtolower(trim(strtok("="))))!="")
|
||||||
|
{
|
||||||
|
$value=UrlDecode(strtok(";"));
|
||||||
|
switch($name)
|
||||||
|
{
|
||||||
|
case "domain":
|
||||||
|
if($value==""
|
||||||
|
|| !strpos($value,".",$value[0]=="."))
|
||||||
|
break;
|
||||||
|
$domain=strtolower($value);
|
||||||
|
break;
|
||||||
|
case "path":
|
||||||
|
if($value!=""
|
||||||
|
&& $value[0]=="/")
|
||||||
|
$path=$value;
|
||||||
|
break;
|
||||||
|
case "expires":
|
||||||
|
if(ereg("^((Mon|Monday|Tue|Tuesday|Wed|Wednesday|Thu|Thursday|Fri|Friday|Sat|Saturday|Sun|Sunday), )?([0-9]{2})\\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\-([0-9]{2,4}) ([0-9]{2})\\:([0-9]{2})\\:([0-9]{2}) GMT$",$value,$matches))
|
||||||
|
{
|
||||||
|
$year=intval($matches[5]);
|
||||||
|
if($year<1900)
|
||||||
|
$year+=($year<70 ? 2000 : 1900);
|
||||||
|
$expires="$year-".$this->months[$matches[4]]."-".$matches[3]." ".$matches[6].":".$matches[7].":".$matches[8];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "secure":
|
||||||
|
$secure=1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->cookies[$secure][$domain][$path][$cookie_name]=array(
|
||||||
|
"name"=>$cookie_name,
|
||||||
|
"value"=>$cookie_value,
|
||||||
|
"domain"=>$domain,
|
||||||
|
"path"=>$path,
|
||||||
|
"expires"=>$expires,
|
||||||
|
"secure"=>$secure
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Function ReadReplyBody(&$body,$length)
|
||||||
|
{
|
||||||
|
switch($this->state)
|
||||||
|
{
|
||||||
|
case "Disconnected":
|
||||||
|
return("1 connection was not yet established");
|
||||||
|
case "Connected":
|
||||||
|
return("2 request was not sent");
|
||||||
|
case "RequestSent":
|
||||||
|
if(($error=$this->ReadReplyHeaders(&$headers))!="")
|
||||||
|
return($error);
|
||||||
|
break;
|
||||||
|
case "GotReplyHeaders":
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return("3 can not get request headers in the current connection state");
|
||||||
|
}
|
||||||
|
$body="";
|
||||||
|
if($this->content_length_set)
|
||||||
|
$length=min($this->content_length-$this->read_length,$length);
|
||||||
|
if($length>0
|
||||||
|
&& !$this->EndOfInput()
|
||||||
|
&& ($body=$this->ReadBytes($length))=="")
|
||||||
|
return("4 could not get the request reply body");
|
||||||
|
return("");
|
||||||
|
}
|
||||||
|
|
||||||
|
Function GetPersistentCookies(&$cookies)
|
||||||
|
{
|
||||||
|
$now=gmdate("Y-m-d H-i-s");
|
||||||
|
$cookies=array();
|
||||||
|
for($secure_cookies=0,Reset($this->cookies);$secure_cookies<count($this->cookies);Next($this->cookies),$secure_cookies++)
|
||||||
|
{
|
||||||
|
$secure=Key($this->cookies);
|
||||||
|
for($domain=0,Reset($this->cookies[$secure]);$domain<count($this->cookies[$secure]);Next($this->cookies[$secure]),$domain++)
|
||||||
|
{
|
||||||
|
$domain_pattern=Key($this->cookies[$secure]);
|
||||||
|
for(Reset($this->cookies[$secure][$domain_pattern]),$path_part=0;$path_part<count($this->cookies[$secure][$domain_pattern]);Next($this->cookies[$secure][$domain_pattern]),$path_part++)
|
||||||
|
{
|
||||||
|
$path=Key($this->cookies[$secure][$domain_pattern]);
|
||||||
|
for(Reset($this->cookies[$secure][$domain_pattern][$path]),$cookie=0;$cookie<count($this->cookies[$secure][$domain_pattern][$path]);Next($this->cookies[$secure][$domain_pattern][$path]),$cookie++)
|
||||||
|
{
|
||||||
|
$cookie_name=Key($this->cookies[$secure][$domain_pattern][$path]);
|
||||||
|
$expires=$this->cookies[$secure][$domain_pattern][$path][$cookie_name]["expires"];
|
||||||
|
if($expires!=""
|
||||||
|
&& strcmp($now,$expires)<0)
|
||||||
|
$cookies[$secure][$domain_pattern][$path][$cookie_name]=$this->cookies[$secure][$domain_pattern][$path][$cookie_name];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
304
phpgwapi/phpgw_utilities_matrixview.inc.php
Normal file
304
phpgwapi/phpgw_utilities_matrixview.inc.php
Normal file
@ -0,0 +1,304 @@
|
|||||||
|
<?PHP
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* class for creating matrix like timeframes for items
|
||||||
|
*
|
||||||
|
* this matrix is having the days of actual month in
|
||||||
|
* the x-axis and the items, which could be projects,
|
||||||
|
* in the y-axis.
|
||||||
|
* You will see a top-down view of all items and their
|
||||||
|
* associated timeframes. You probably saw this in
|
||||||
|
* projectmanagement apps
|
||||||
|
*
|
||||||
|
* @author Marc Logemann [loge@mail.com]
|
||||||
|
* @version 0.9
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class matrixview {
|
||||||
|
|
||||||
|
var $sumdays = 0;
|
||||||
|
|
||||||
|
var $month = 0;
|
||||||
|
var $monthname = "";
|
||||||
|
var $year = 0;
|
||||||
|
var $day = 0;
|
||||||
|
|
||||||
|
var $items_content = array();
|
||||||
|
var $items_count = 0;
|
||||||
|
|
||||||
|
var $arr_second_dim = 0;
|
||||||
|
var $image1pix = "images/pix.gif";
|
||||||
|
|
||||||
|
var $color_headerfield = "#FFFF33";
|
||||||
|
var $color_emptyfield = "#CCCCCC";
|
||||||
|
|
||||||
|
var $selection = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* construtor: graphview class
|
||||||
|
*
|
||||||
|
* constructor waits for the desired month in
|
||||||
|
* integer presentation and the desired year also
|
||||||
|
* in integer presentation 4 digits (ex. 2001)
|
||||||
|
*
|
||||||
|
* @param int month (for example: 02)
|
||||||
|
* @param int year (for example: 2001)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function matrixview ($month_int = 0, $year_int = 0)
|
||||||
|
{
|
||||||
|
for($i;$i<32;$i++)
|
||||||
|
{
|
||||||
|
if(checkdate($month_int,$i,$year_int)) $days++;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->month = $month_int;
|
||||||
|
$this->year = $year_int;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* set a Period for a specified item
|
||||||
|
*
|
||||||
|
* setting a period for an element means to define
|
||||||
|
* a fromDate and and a toDate together with the
|
||||||
|
* item itself. This will store a timeframe associated
|
||||||
|
* with an item for later usage
|
||||||
|
*
|
||||||
|
* @param string item for the timeframe
|
||||||
|
* @param date fromdate in format yyyymmdd
|
||||||
|
* @param date todate in format yyyymmdd
|
||||||
|
*
|
||||||
|
* @return boolean false if item cannot be saved
|
||||||
|
* otherwise true
|
||||||
|
*/
|
||||||
|
|
||||||
|
function setPeriod ($item, $fromdate, $todate, $color="#990033")
|
||||||
|
{
|
||||||
|
$fyear = substr($fromdate,0,4);
|
||||||
|
$fmonth = substr($fromdate,4,2);
|
||||||
|
$fday = substr($fromdate,6,2);
|
||||||
|
|
||||||
|
$tyear = substr($todate,0,4);
|
||||||
|
$tmonth = substr($todate,4,2);
|
||||||
|
$tday = substr($todate,6,2);
|
||||||
|
|
||||||
|
if(mktime(0,0,0, $tmonth, $tday, $tyear) < mktime(0,0,0, $this->month+1,0,$this->year))
|
||||||
|
$this->day = $tday;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$dinfo = getdate(mktime(0,0,0, $this->month+1,0,$this->year));
|
||||||
|
$this->day = $dinfo[mday];
|
||||||
|
}
|
||||||
|
|
||||||
|
$go = 1;
|
||||||
|
$i = 0;
|
||||||
|
$z = 0;
|
||||||
|
|
||||||
|
while($go==1)
|
||||||
|
{
|
||||||
|
// calculates fromdate
|
||||||
|
// echo date("d/m/Y", mktime(0,0,0, $fmonth, $fday+$i, $fyear)); echo "<br>";
|
||||||
|
$datinfo = getdate(mktime(0,0,0, $fmonth, $fday+$i, $fyear));
|
||||||
|
|
||||||
|
if($datinfo["mon"]==$this->month
|
||||||
|
&& $datinfo["year"]==$this->year
|
||||||
|
&& $datinfo["mday"]<=$this->day)
|
||||||
|
{
|
||||||
|
$t = $datinfo["mday"];
|
||||||
|
$this->items_content[$this->items_count][$t] = "x";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mktime(0,0,0, $fmonth, $fday+$i, $fyear) >=
|
||||||
|
mktime(0,0,0, $this->month+1, 0, $this->year)
|
||||||
|
||
|
||||||
|
mktime(0,0,0, $fmonth, $fday+$i, $fyear) >=
|
||||||
|
mktime(0,0,0, $tmonth, $tday, $tyear)) $go = 0
|
||||||
|
;
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->items_content[$this->items_count][0] = "$item;$color";
|
||||||
|
// increase number of items in two-dimensional array
|
||||||
|
$this->items_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* sets the color for empty dayfields
|
||||||
|
*
|
||||||
|
* @param string color in hexadecimal (ex. "#336699")
|
||||||
|
*/
|
||||||
|
|
||||||
|
function setEmptyFieldColor ($color)
|
||||||
|
{
|
||||||
|
$this->color_emptyfield=$color;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* sets the color for calendar day fields
|
||||||
|
*
|
||||||
|
* @param string color in hexadecimal (ex. "#336699")
|
||||||
|
*/
|
||||||
|
|
||||||
|
function setHeaderFieldColor ($color)
|
||||||
|
{
|
||||||
|
$this->color_headerfield=$color;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* sets a new path for 1pixel (pix.gif) gif needed for the table
|
||||||
|
* default is set actual script dir + /images
|
||||||
|
*
|
||||||
|
* @param string path and name to 1pixel gif
|
||||||
|
*/
|
||||||
|
|
||||||
|
function set1PixelGif ($filepath)
|
||||||
|
{
|
||||||
|
$this->image1pix=$filepath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* disable selection of new timeframe
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
function diableSelection ()
|
||||||
|
{
|
||||||
|
$this->selection=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* return the html code for the matrix
|
||||||
|
*
|
||||||
|
* will return the complete html code for the matrix.
|
||||||
|
* In the calling program you can do some other
|
||||||
|
* operations on it, because it wont be echoed directly
|
||||||
|
*
|
||||||
|
* @return string html code for the matrix
|
||||||
|
*/
|
||||||
|
|
||||||
|
function out ()
|
||||||
|
{
|
||||||
|
// get days of desired month (month submitted in constructor)
|
||||||
|
$in = getdate(mktime(0,0,0, $this->month+1,0,$this->year));
|
||||||
|
$this->sumdays = $in[mday];
|
||||||
|
$this->monthname = $in[month];
|
||||||
|
|
||||||
|
$this->out_monthyear();
|
||||||
|
|
||||||
|
echo "<div align=\"center\">\n";
|
||||||
|
echo "<table border=0>\n";
|
||||||
|
$this->out_header();
|
||||||
|
|
||||||
|
// loop through number of items
|
||||||
|
for($z=0;$z<$this->items_count;$z++)
|
||||||
|
{
|
||||||
|
// seperate color and name from first array element
|
||||||
|
$itemname = strtok($this->items_content[$z][0],";");
|
||||||
|
$itemcolor = strtok(";");
|
||||||
|
|
||||||
|
echo "<tr>\n";
|
||||||
|
echo "<td>" . $itemname . "</td>\n";
|
||||||
|
// loop through days of desired month
|
||||||
|
for($r=1;$r<$this->sumdays+1;$r++)
|
||||||
|
{
|
||||||
|
if($this->items_content[$z][$r]=="x") $color = $itemcolor; else $color = $this->color_emptyfield;
|
||||||
|
echo "<td bgcolor=\"$color\"> </td>\n";
|
||||||
|
}
|
||||||
|
echo "</tr>\n";
|
||||||
|
$this->out_ruler();
|
||||||
|
}
|
||||||
|
echo "</table>";
|
||||||
|
echo "</div>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* private class for out method
|
||||||
|
*
|
||||||
|
* should not be used from external
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
function out_header ()
|
||||||
|
{
|
||||||
|
echo "<tr>\n";
|
||||||
|
echo "<td height=\"1\" colspan=\""; echo $this->sumdays+1; echo "\" bgcolor=black><img src=\"" . $this->image1pix . "\"></td>\n";
|
||||||
|
echo "</tr>\n";
|
||||||
|
echo "<tr>\n";
|
||||||
|
echo "<td>Projectname</td>\n";
|
||||||
|
for($i=1;$i<$this->sumdays+1;$i++)
|
||||||
|
{
|
||||||
|
echo "<td bgcolor=\""; echo $this->color_headerfield; echo "\">" . sprintf("%02d",$i) . "</td>\n";
|
||||||
|
}
|
||||||
|
echo "</tr>\n";
|
||||||
|
|
||||||
|
echo "<tr>\n";
|
||||||
|
echo "<td height=\"1\" colspan=\""; echo $this->sumdays+1; echo "\" bgcolor=black><img src=\"" . $this->image1pix ."\"></td>\n";
|
||||||
|
echo "</tr>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* private class for out method
|
||||||
|
*
|
||||||
|
* should not be used from external
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
function out_ruler ()
|
||||||
|
{
|
||||||
|
echo "<tr>\n";
|
||||||
|
echo "<td colspan=\""; echo $this->sumdays+1; echo "\" bgcolor=\"#999999\"><img src=\"" . $this->image1pix ."\"></td>\n";
|
||||||
|
echo "</tr>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* private class for out method
|
||||||
|
*
|
||||||
|
* should not be used from external
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
function out_monthyear ()
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
|
||||||
|
echo "<form action=\"" . $phpgw->link() . "\" method=\"post\">\n";
|
||||||
|
echo "<table border=0 width=\"100%\" cellpadding=\"0\" cellspacing=\"0\">";
|
||||||
|
echo "<tr>\n";
|
||||||
|
echo "<td align=\"center\"><h2>"; echo $this->monthname; echo " "; echo $this->year; echo "</h2></td>\n";
|
||||||
|
|
||||||
|
if($this->selection==1)
|
||||||
|
{
|
||||||
|
echo "<td align=\"right\">Month: <select name=\"month\"";
|
||||||
|
for($i=0;$i<13;$i++)
|
||||||
|
{
|
||||||
|
if($this->month==$i) $sel = " selected"; else unset($sel);
|
||||||
|
echo "<option value=\"$i\"$sel>$i</option>"; }
|
||||||
|
echo "</select>";
|
||||||
|
echo "Year: <select name=\"year\"";
|
||||||
|
for($i = date("Y") -2;$i<date("Y")+5;$i++)
|
||||||
|
{
|
||||||
|
if($this->year==$i) $sel = " selected"; else unset($sel);
|
||||||
|
echo "<option value=\"$i\"$sel>$i</option>";
|
||||||
|
}
|
||||||
|
echo "</select>";
|
||||||
|
echo " <input type=\"submit\" name=\"selection\" value=\"Select\"> ";
|
||||||
|
echo "</td>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "</tr>\n";
|
||||||
|
echo "</table>\n";
|
||||||
|
echo "</form>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
310
phpgwapi/phpgw_utilities_menutree.inc.php
Normal file
310
phpgwapi/phpgw_utilities_menutree.inc.php
Normal file
@ -0,0 +1,310 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* This file based on PHP3 TreeMenu *
|
||||||
|
* (c)1999 Bjorge Dijkstra <bjorge@gmx.net> *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/*********************************************/
|
||||||
|
/* Settings */
|
||||||
|
/*********************************************/
|
||||||
|
/* */
|
||||||
|
/* $treefile variable needs to be set in */
|
||||||
|
/* main file */
|
||||||
|
/* */
|
||||||
|
/*********************************************/
|
||||||
|
|
||||||
|
class menutree {
|
||||||
|
function showtree($treefile, $num_menus = 50, $invisible_menus = Null){
|
||||||
|
global $phpgw_info;
|
||||||
|
|
||||||
|
$script = $SCRIPT_NAME;
|
||||||
|
|
||||||
|
$img_expand = "images/tree_expand.gif";
|
||||||
|
$img_collapse = "images/tree_collapse.gif";
|
||||||
|
$img_line = "images/tree_vertline.gif";
|
||||||
|
$img_split = "images/tree_split.gif";
|
||||||
|
$img_end = "images/tree_end.gif";
|
||||||
|
$img_leaf = "images/tree_leaf.gif";
|
||||||
|
$img_spc = "images/tree_space.gif";
|
||||||
|
|
||||||
|
/*********************************************/
|
||||||
|
/* Read text file with tree structure */
|
||||||
|
/*********************************************/
|
||||||
|
|
||||||
|
/*********************************************/
|
||||||
|
/* read file to $tree array */
|
||||||
|
/* tree[x][0] -> tree level */
|
||||||
|
/* tree[x][1] -> item text */
|
||||||
|
/* tree[x][2] -> item link */
|
||||||
|
/* tree[x][3] -> link target */
|
||||||
|
/* tree[x][4] -> last item in subtree */
|
||||||
|
/*********************************************/
|
||||||
|
|
||||||
|
$maxlevel=0;
|
||||||
|
$cnt=0;
|
||||||
|
|
||||||
|
$fd = fopen($treefile, "r");
|
||||||
|
if ($fd==0) die("menutree.inc : Unable to open file ".$treefile);
|
||||||
|
while ($buffer = fgets($fd, 4096))
|
||||||
|
{
|
||||||
|
$tree[$cnt][0]=strspn($buffer,".");
|
||||||
|
$tmp=rtrim(substr($buffer,$tree[$cnt][0]));
|
||||||
|
$node=explode("|",$tmp);
|
||||||
|
$tree[$cnt][1]=$node[0];
|
||||||
|
$tree[$cnt][2]=$node[1];
|
||||||
|
$tree[$cnt][3]=$node[2];
|
||||||
|
$tree[$cnt][4]=0;
|
||||||
|
if ($tree[$cnt][0] > $maxlevel) $maxlevel=$tree[$cnt][0];
|
||||||
|
$cnt++;
|
||||||
|
}
|
||||||
|
fclose($fd);
|
||||||
|
|
||||||
|
for ($i=0; $i<count($tree); $i++) {
|
||||||
|
$expand[$i]=0;
|
||||||
|
$visible[$i]=0;
|
||||||
|
$levels[$i]=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************/
|
||||||
|
/* Get Node numbers to expand */
|
||||||
|
/*********************************************/
|
||||||
|
|
||||||
|
if ($p!="") $explevels = explode("|",$p);
|
||||||
|
|
||||||
|
$i=0;
|
||||||
|
while($i<count($explevels))
|
||||||
|
{
|
||||||
|
$expand[$explevels[$i]]=1;
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************/
|
||||||
|
/* Find last nodes of subtrees */
|
||||||
|
/*********************************************/
|
||||||
|
|
||||||
|
$lastlevel=$maxlevel;
|
||||||
|
for ($i=count($tree)-1; $i>=0; $i--)
|
||||||
|
{
|
||||||
|
if ( $tree[$i][0] < $lastlevel )
|
||||||
|
{
|
||||||
|
for ($j=$tree[$i][0]+1; $j <= $maxlevel; $j++)
|
||||||
|
{
|
||||||
|
$levels[$j]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( $levels[$tree[$i][0]]==0 )
|
||||||
|
{
|
||||||
|
$levels[$tree[$i][0]]=1;
|
||||||
|
$tree[$i][4]=1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
$tree[$i][4]=0;
|
||||||
|
$lastlevel=$tree[$i][0];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*********************************************/
|
||||||
|
/* Determine visible nodes */
|
||||||
|
/*********************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$visible[0]=1; // root is always visible
|
||||||
|
$visible[1]=1; // root is always visible
|
||||||
|
$visible[2]=1; // root is always visible
|
||||||
|
$visible[3]=0; // root is always visible
|
||||||
|
$visible[4]=0; // root is always visible
|
||||||
|
$visible[5]=0; // root is always visible
|
||||||
|
$visible[6]=0; // root is always visible
|
||||||
|
$visible[7]=1; // root is always visible
|
||||||
|
$visible[8]=0; // root is always visible
|
||||||
|
$visible[9]=0; // root is always visible
|
||||||
|
$visible[10]=0; // root is always visible
|
||||||
|
$visible[11]=1; // root is always visible
|
||||||
|
$visible[12]=0; // root is always visible
|
||||||
|
$visible[13]=0; // root is always visible
|
||||||
|
$visible[14]=0; // root is always visible
|
||||||
|
$visible[15]=0; // root is always visible
|
||||||
|
$visible[16]=1; // root is always visible
|
||||||
|
$visible[17]=1; // root is always visible
|
||||||
|
$visible[18]=1; // root is always visible
|
||||||
|
$visible[19]=1; // root is always visible
|
||||||
|
$visible[20]=1; // root is always visible
|
||||||
|
$visible[21]=0; // root is always visible
|
||||||
|
$visible[22]=0; // root is always visible
|
||||||
|
$visible[23]=1; // root is always visible
|
||||||
|
$visible[24]=0; // root is always visible
|
||||||
|
$visible[25]=0; // root is always visible
|
||||||
|
$visible[26]=1; // root is always visible
|
||||||
|
$visible[27]=0; // root is always visible
|
||||||
|
$visible[28]=0; // root is always visible
|
||||||
|
|
||||||
|
|
||||||
|
for ($i=0; $i<count($explevels); $i++)
|
||||||
|
{
|
||||||
|
$n=$explevels[$i];
|
||||||
|
if ( ($visible[$n]==1) && ($expand[$n]==1) )
|
||||||
|
{
|
||||||
|
$j=$n+1;
|
||||||
|
while ( $tree[$j][0] > $tree[$n][0] )
|
||||||
|
{
|
||||||
|
if ($tree[$j][0]==$tree[$n][0]+1) $visible[$j]=1;
|
||||||
|
$j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for ($i=0; $i<count($explevels); $i++)
|
||||||
|
{
|
||||||
|
$n=$explevels[$i];
|
||||||
|
if ( ($visible[$n]==1) && ($expand[$n]==1) )
|
||||||
|
{
|
||||||
|
$j=$n+1;
|
||||||
|
while ( $tree[$j][0] > $tree[$n][0] )
|
||||||
|
{
|
||||||
|
if ($tree[$j][0]==$tree[$n][0]+1) $visible[$j]=1;
|
||||||
|
$j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*********************************************/
|
||||||
|
/* Output nicely formatted tree */
|
||||||
|
/*********************************************/
|
||||||
|
|
||||||
|
for ($i=0; $i<$maxlevel; $i++) $levels[$i]=1;
|
||||||
|
|
||||||
|
$maxlevel++;
|
||||||
|
|
||||||
|
echo "<table cellspacing=0 cellpadding=0 border=0 cols=".($maxlevel+3)." width=".($maxlevel*16+100).">\n";
|
||||||
|
echo"<a href=\"index.php\" target=_parent><img src=images/docs.gif border=\"0\"></a>\n";
|
||||||
|
echo "<tr>";
|
||||||
|
for ($i=0; $i<$maxlevel; $i++) echo "<td width=16></td>";
|
||||||
|
echo "<td width=100></td></tr>\n";
|
||||||
|
$cnt=0;
|
||||||
|
while ($cnt<count($tree))
|
||||||
|
{
|
||||||
|
if ($visible[$cnt])
|
||||||
|
{
|
||||||
|
/****************************************/
|
||||||
|
/* start new row */
|
||||||
|
/****************************************/
|
||||||
|
echo "<tr>";
|
||||||
|
|
||||||
|
/****************************************/
|
||||||
|
/* vertical lines from higher levels */
|
||||||
|
/****************************************/
|
||||||
|
$i=0;
|
||||||
|
while ($i<$tree[$cnt][0]-1)
|
||||||
|
{
|
||||||
|
if ($levels[$i]==1)
|
||||||
|
echo "<td><img src=\"".$img_line."\"></td>";
|
||||||
|
else
|
||||||
|
echo "<td><img src=\"".$img_spc."\"></td>";
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************/
|
||||||
|
/* corner at end of subtree or t-split */
|
||||||
|
/****************************************/
|
||||||
|
if ($tree[$cnt][4]==1)
|
||||||
|
{
|
||||||
|
echo "<td><img src=\"".$img_end."\"></td>";
|
||||||
|
$levels[$tree[$cnt][0]-1]=0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
echo "<td><img src=\"".$img_split."\"></td>";
|
||||||
|
$levels[$tree[$cnt][0]-1]=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************/
|
||||||
|
/* Node (with subtree) or Leaf (no subtree) */
|
||||||
|
/********************************************/
|
||||||
|
if ($tree[$cnt+1][0]>$tree[$cnt][0])
|
||||||
|
{
|
||||||
|
|
||||||
|
/****************************************/
|
||||||
|
/* Create expand/collapse parameters */
|
||||||
|
/****************************************/
|
||||||
|
$i=0; $params="?p=";
|
||||||
|
while($i<count($expand))
|
||||||
|
{
|
||||||
|
if ( ($expand[$i]==1) && ($cnt!=$i) || ($expand[$i]==0 && $cnt==$i))
|
||||||
|
{
|
||||||
|
$params=$params.$i;
|
||||||
|
$params=$params."|";
|
||||||
|
}
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($expand[$cnt]==0)
|
||||||
|
echo "<td><a href=\"".$script.$params."\"><img src=\"".$img_expand."\" border=no></a></td>";
|
||||||
|
else
|
||||||
|
echo "<td><a href=\"".$script.$params."\"><img src=\"".$img_collapse."\" border=no></a></td>";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*************************/
|
||||||
|
/* Tree Leaf */
|
||||||
|
/*************************/
|
||||||
|
|
||||||
|
echo "<td><img src=\"".$img_leaf."\"></td>";
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************/
|
||||||
|
/* output item text */
|
||||||
|
/****************************************/
|
||||||
|
if ($tree[$cnt][2]=="")
|
||||||
|
echo "<td colspan=".($maxlevel-$tree[$cnt][0]).">".$tree[$cnt][1]."<font face\=\"Arial, Helvetica, san-serif\" size=\"2\"></td>";
|
||||||
|
else
|
||||||
|
echo "<td colspan=".($maxlevel-$tree[$cnt][0])."><font face\=\"Arial, Helvetica, san-serif\" size=\"2\"><a href=\"".$tree[$cnt][2]."\" target=\"".$tree[$cnt][3]."\">".$tree[$cnt][1]."</a></td>";
|
||||||
|
|
||||||
|
/****************************************/
|
||||||
|
/* end row */
|
||||||
|
/****************************************/
|
||||||
|
|
||||||
|
echo "</tr>\n";
|
||||||
|
}
|
||||||
|
$cnt++;
|
||||||
|
}
|
||||||
|
echo "</table>\n";
|
||||||
|
|
||||||
|
/***************************************************/
|
||||||
|
/* Tree file format */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* The first line is always of format : */
|
||||||
|
/* .[rootname] */
|
||||||
|
/* */
|
||||||
|
/* each line contains one item, the line starts */
|
||||||
|
/* with a series of dots(.). Each dot is one level */
|
||||||
|
/* deeper. Only one level at a time once is allowed*/
|
||||||
|
/* Next comes the come the item name, link and */
|
||||||
|
/* link target, seperated by a |. */
|
||||||
|
/* */
|
||||||
|
/* example: */
|
||||||
|
/* */
|
||||||
|
/* .top */
|
||||||
|
/* ..category 1 */
|
||||||
|
/* ...item 1.1|item11.htm|main */
|
||||||
|
/* ...item 2.2|item12.htm|main */
|
||||||
|
/* ..category 2|cat2overview.htm|main */
|
||||||
|
/* ...item 2.1|item21.htm|main */
|
||||||
|
/* ...item 2.2|item22.htm|main */
|
||||||
|
/* ...item 2.3|item23.htm|main */
|
||||||
|
/* */
|
||||||
|
/***************************************************/
|
||||||
|
}
|
||||||
|
}
|
237
phpgwapi/phpgw_utilities_rssparse.inc.php
Normal file
237
phpgwapi/phpgw_utilities_rssparse.inc.php
Normal file
@ -0,0 +1,237 @@
|
|||||||
|
<?PHP
|
||||||
|
|
||||||
|
/*
|
||||||
|
* rssparse.php3
|
||||||
|
*
|
||||||
|
* Copyright (C) 2000 Jeremey Barrett
|
||||||
|
* j@nwow.org
|
||||||
|
* http://nwow.org
|
||||||
|
*
|
||||||
|
* Version 0.4
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* rssparse.php3 is a small PHP script for parsing RDF/RSS XML data. It has been
|
||||||
|
* tested with a number of popular web news and information sites such as
|
||||||
|
* slashdot.org, lwn.net, and freshmeat.net. This is not meant to be exhaustive
|
||||||
|
* but merely to provide the basic necessities. It will grow in capabilities with
|
||||||
|
* time, I'm sure.
|
||||||
|
*
|
||||||
|
* This is code I wrote for Nerds WithOut Wires, http://nwow.org.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* USAGE:
|
||||||
|
* In your PHP script, simply do something akin to this:
|
||||||
|
*
|
||||||
|
* include("rssparse.php3");
|
||||||
|
* $fp = fopen("file", "r");
|
||||||
|
* $rss = rssparse($fp);
|
||||||
|
*
|
||||||
|
* if (!$rss) {
|
||||||
|
* ERROR;
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* while (list(,$item) = each($rss->items)) {
|
||||||
|
* printf("Title: %s\n", $item["title"]);
|
||||||
|
* printf("Link: %s\n", $item["link"]);
|
||||||
|
* printf("Description: %s\n", $item["desc"]);
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* printf("Channel Title: %s\n", $rss->title);
|
||||||
|
* printf("Channel Description: %s\n", $rss->desc);
|
||||||
|
* printf("Channel Link: %s\n", $rss->link);
|
||||||
|
*
|
||||||
|
* printf("Image Title: %s\n", $rss->image["title"]);
|
||||||
|
* printf("Image URL: %s\n", $rss->image["url"]);
|
||||||
|
* printf("Image Description: %s\n", $rss->image["desc"]);
|
||||||
|
* printf("Image Link: %s\n", $rss->image["link"]);
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* CHANGES:
|
||||||
|
* 0.4 - rssparse.php3 now supports the channel image tag and correctly supports
|
||||||
|
* RSS-style channels.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* BUGS:
|
||||||
|
* Width and height tags in image not supported, some other tags not supported
|
||||||
|
* yet.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* IMPORTANT NOTE:
|
||||||
|
* This requires PHP's XML routines. You must configure PHP with --with-xml.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
function _rssparse_start_elem ($parser, $elem, $attrs) {
|
||||||
|
global $_rss;
|
||||||
|
|
||||||
|
if ($elem == "CHANNEL") {
|
||||||
|
$_rss->depth++;
|
||||||
|
$_rss->state[$_rss->depth] = "channel";
|
||||||
|
$_rss->tmptitle[$_rss->depth] = "";
|
||||||
|
$_rss->tmplink[$_rss->depth] = "";
|
||||||
|
$_rss->tmpdesc[$_rss->depth] = "";
|
||||||
|
}
|
||||||
|
else if ($elem == "IMAGE") {
|
||||||
|
$_rss->depth++;
|
||||||
|
$_rss->state[$_rss->depth] = "image";
|
||||||
|
$_rss->tmptitle[$_rss->depth] = "";
|
||||||
|
$_rss->tmplink[$_rss->depth] = "";
|
||||||
|
$_rss->tmpdesc[$_rss->depth] = "";
|
||||||
|
$_rss->tmpurl[$_rss->depth] = "";
|
||||||
|
}
|
||||||
|
else if ($elem == "ITEM") {
|
||||||
|
$_rss->depth++;
|
||||||
|
$_rss->state[$_rss->depth] = "item";
|
||||||
|
$_rss->tmptitle[$_rss->depth] = "";
|
||||||
|
$_rss->tmplink[$_rss->depth] = "";
|
||||||
|
$_rss->tmpdesc[$_rss->depth] = "";
|
||||||
|
}
|
||||||
|
else if ($elem == "TITLE") {
|
||||||
|
$_rss->depth++;
|
||||||
|
$_rss->state[$_rss->depth] = "title";
|
||||||
|
}
|
||||||
|
else if ($elem == "LINK") {
|
||||||
|
$_rss->depth++;
|
||||||
|
$_rss->state[$_rss->depth] = "link";
|
||||||
|
}
|
||||||
|
else if ($elem == "DESCRIPTION") {
|
||||||
|
$_rss->depth++;
|
||||||
|
$_rss->state[$_rss->depth] = "desc";
|
||||||
|
}
|
||||||
|
else if ($elem == "URL") {
|
||||||
|
$_rss->depth++;
|
||||||
|
$_rss->state[$_rss->depth] = "url";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _rssparse_end_elem ($parser, $elem) {
|
||||||
|
global $_rss;
|
||||||
|
|
||||||
|
if ($elem == "CHANNEL") {
|
||||||
|
$_rss->set_channel($_rss->tmptitle[$_rss->depth], $_rss->tmplink[$_rss->depth], $_rss->tmpdesc[$_rss->depth]);
|
||||||
|
$_rss->depth--;
|
||||||
|
}
|
||||||
|
else if ($elem == "IMAGE") {
|
||||||
|
$_rss->set_image($_rss->tmptitle[$_rss->depth], $_rss->tmplink[$_rss->depth], $_rss->tmpdesc[$_rss->depth], $_rss->tmpurl[$_rss->depth]);
|
||||||
|
$_rss->depth--;
|
||||||
|
}
|
||||||
|
else if ($elem == "ITEM") {
|
||||||
|
$_rss->add_item($_rss->tmptitle[$_rss->depth], $_rss->tmplink[$_rss->depth], $_rss->tmpdesc[$_rss->depth]);
|
||||||
|
$_rss->depth--;
|
||||||
|
}
|
||||||
|
else if ($elem == "TITLE") {
|
||||||
|
$_rss->depth--;
|
||||||
|
}
|
||||||
|
else if ($elem == "LINK") {
|
||||||
|
$_rss->depth--;
|
||||||
|
}
|
||||||
|
else if ($elem == "DESCRIPTION") {
|
||||||
|
$_rss->depth--;
|
||||||
|
}
|
||||||
|
else if ($elem == "URL") {
|
||||||
|
$_rss->depth--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _rssparse_elem_data ($parser, $data) {
|
||||||
|
global $_rss;
|
||||||
|
|
||||||
|
if ($_rss->state[$_rss->depth] == "title") {
|
||||||
|
$_rss->tmptitle[($_rss->depth - 1)] .= $data;
|
||||||
|
}
|
||||||
|
else if ($_rss->state[$_rss->depth] == "link") {
|
||||||
|
$_rss->tmplink[($_rss->depth - 1)] .= $data;
|
||||||
|
}
|
||||||
|
else if ($_rss->state[$_rss->depth] == "desc") {
|
||||||
|
$_rss->tmpdesc[($_rss->depth - 1)] .= $data;
|
||||||
|
}
|
||||||
|
else if ($_rss->state[$_rss->depth] == "url") {
|
||||||
|
$_rss->tmpurl[($_rss->depth - 1)] .= $data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class rssparser {
|
||||||
|
var $title;
|
||||||
|
var $link;
|
||||||
|
var $desc;
|
||||||
|
var $items = array();
|
||||||
|
var $nitems;
|
||||||
|
var $image = array();
|
||||||
|
var $state = array();
|
||||||
|
var $tmptitle = array();
|
||||||
|
var $tmplink = array();
|
||||||
|
var $tmpdesc = array();
|
||||||
|
var $tmpurl = array();
|
||||||
|
var $depth;
|
||||||
|
|
||||||
|
function rssparser() {
|
||||||
|
$this->nitems = 0;
|
||||||
|
$this->depth = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function set_channel($in_title, $in_link, $in_desc) {
|
||||||
|
$this->title = $in_title;
|
||||||
|
$this->link = $in_link;
|
||||||
|
$this->desc = $in_desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
function set_image($in_title, $in_link, $in_desc, $in_url) {
|
||||||
|
$this->image["title"] = $in_title;
|
||||||
|
$this->image["link"] = $in_link;
|
||||||
|
$this->image["desc"] = $in_desc;
|
||||||
|
$this->image["url"] = $in_url;
|
||||||
|
}
|
||||||
|
|
||||||
|
function add_item($in_title, $in_link, $in_desc) {
|
||||||
|
$this->items[$this->nitems]["title"] = $in_title;
|
||||||
|
$this->items[$this->nitems]["link"] = $in_link;
|
||||||
|
$this->items[$this->nitems]["desc"] = $in_desc;
|
||||||
|
$this->nitems++;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parse($fp) {
|
||||||
|
$xml_parser = xml_parser_create();
|
||||||
|
|
||||||
|
xml_set_element_handler($xml_parser, "_rssparse_start_elem", "_rssparse_end_elem");
|
||||||
|
xml_set_character_data_handler($xml_parser, "_rssparse_elem_data");
|
||||||
|
|
||||||
|
while ($data = fread($fp, 4096)) {
|
||||||
|
if (!xml_parse($xml_parser, $data, feof($fp))) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xml_parser_free($xml_parser);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function rssparse ($fp) {
|
||||||
|
global $_rss;
|
||||||
|
|
||||||
|
$_rss = new rssparser();
|
||||||
|
|
||||||
|
if ($_rss->parse($fp)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $_rss;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
141
phpgwapi/phpgw_utilities_sbox.inc.php
Normal file
141
phpgwapi/phpgw_utilities_sbox.inc.php
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
<?PHP
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* class for creating predefines select boxes
|
||||||
|
*
|
||||||
|
* @author Marc Logemann [loge@mail.com]
|
||||||
|
* @version 0.9
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class sbox {
|
||||||
|
|
||||||
|
var $monthnames = array ("", "january", "February", "March", "April", "May", "June", "July",
|
||||||
|
"August", "September", "October", "November", "December");
|
||||||
|
|
||||||
|
function getMonthText($name, $selected=0)
|
||||||
|
{
|
||||||
|
$out = "<select name=\"$name\">\n";
|
||||||
|
|
||||||
|
for($i=0;$i<count($this->monthnames);$i++)
|
||||||
|
{
|
||||||
|
$out .= "<option value=\"$i\"";
|
||||||
|
if($selected==$i) $out .= " SELECTED";
|
||||||
|
$out .= ">";
|
||||||
|
if($this->monthnames[$i]!="")
|
||||||
|
$out .= lang($this->monthnames[$i]);
|
||||||
|
else
|
||||||
|
$out .= "";
|
||||||
|
$out .= "</option>\n";
|
||||||
|
}
|
||||||
|
$out .= "</select>\n";
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDays($name, $selected=0)
|
||||||
|
{
|
||||||
|
$out = "<select name=\"$name\">\n";
|
||||||
|
|
||||||
|
for($i=0;$i<32;$i++)
|
||||||
|
{
|
||||||
|
if($i==0) $val = ""; else $val = $i;
|
||||||
|
$out .= "<option value=\"$val\"";
|
||||||
|
if($selected==$i) $out .= " SELECTED";
|
||||||
|
$out .= ">$val</option>\n";
|
||||||
|
}
|
||||||
|
$out .= "</select>\n";
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getYears($name, $selected=0)
|
||||||
|
{
|
||||||
|
$out = "<select name=\"$name\">\n";
|
||||||
|
|
||||||
|
$out .= "<option value=\"\"";
|
||||||
|
if($selected == 0 OR $selected == "") $out .= " SELECTED";
|
||||||
|
$out .= "></option>\n";
|
||||||
|
|
||||||
|
for($i=date("Y");$i<date("Y")+5;$i++)
|
||||||
|
{
|
||||||
|
$out .= "<option value=\"$i\"";
|
||||||
|
if($selected==$i) $out .= " SELECTED";
|
||||||
|
$out .= ">$i</option>\n";
|
||||||
|
}
|
||||||
|
$out .= "</select>\n";
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPercentage($name, $selected=0)
|
||||||
|
{
|
||||||
|
$out = "<select name=\"$name\">\n";
|
||||||
|
|
||||||
|
for($i=0;$i<101;$i=$i+10)
|
||||||
|
{
|
||||||
|
$out .= "<option value=\"$i\"";
|
||||||
|
if($selected==$i) $out .= " SELECTED";
|
||||||
|
$out .= ">$i%</option>\n";
|
||||||
|
}
|
||||||
|
$out .= "</select>\n";
|
||||||
|
// echo $out;
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPriority($name, $selected=2)
|
||||||
|
{
|
||||||
|
$arr = array("", "low", "normal", "high");
|
||||||
|
$out = "<select name=\"$name\">\n";
|
||||||
|
|
||||||
|
for($i=1;$i<count($arr);$i++)
|
||||||
|
{
|
||||||
|
$out .= "<option value=\"";
|
||||||
|
$out .= $i;
|
||||||
|
$out .= "\"";
|
||||||
|
if($selected==$i) $out .= " SELECTED";
|
||||||
|
$out .= ">";
|
||||||
|
$out .= lang($arr[$i]);
|
||||||
|
$out .= "</option>\n";
|
||||||
|
}
|
||||||
|
$out .= "</select>\n";
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAccessList($name, $selected="private")
|
||||||
|
{
|
||||||
|
$arr = array("private" => "Private",
|
||||||
|
"public" => "Global public",
|
||||||
|
"group" => "Group public");
|
||||||
|
|
||||||
|
if (ereg(",", $selected))
|
||||||
|
{
|
||||||
|
$selected = "group";
|
||||||
|
}
|
||||||
|
|
||||||
|
$out = "<select name=\"$name\">\n";
|
||||||
|
|
||||||
|
for(reset($arr);current($arr);next($arr))
|
||||||
|
{
|
||||||
|
$out .= '<option value="' . key($arr) . '"';
|
||||||
|
if($selected==key($arr)) $out .= " SELECTED";
|
||||||
|
$out .= ">" . pos($arr) . "</option>\n";
|
||||||
|
}
|
||||||
|
$out .= "</select>\n";
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getGroups($groups, $selected="")
|
||||||
|
{
|
||||||
|
global $phpgw;
|
||||||
|
|
||||||
|
$out = '<select name="n_groups[]" multiple>';
|
||||||
|
while (list($null,$group) = each($groups)) {
|
||||||
|
$out .= '<option value="' . $group[0] . '"';
|
||||||
|
if (ereg("," . $group[0] . ",", $selected))
|
||||||
|
{
|
||||||
|
$out .= " SELECTED";
|
||||||
|
}
|
||||||
|
$out .= ">" . $group[1] . "</option>\n";
|
||||||
|
}
|
||||||
|
$out .= "</select>\n";
|
||||||
|
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
}
|
362
phpgwapi/phpgw_vfs.inc.php
Normal file
362
phpgwapi/phpgw_vfs.inc.php
Normal file
@ -0,0 +1,362 @@
|
|||||||
|
<?php
|
||||||
|
/**************************************************************************\
|
||||||
|
* phpGroupWare *
|
||||||
|
* http://www.phpgroupware.org *
|
||||||
|
* This file written by Dan Kuykendall <seek3r@phpgroupware.org> *
|
||||||
|
* -------------------------------------------- *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms of the GNU General Public License as published by the *
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||||
|
* option) any later version. *
|
||||||
|
\**************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
class vfs
|
||||||
|
{
|
||||||
|
var $basedir;
|
||||||
|
|
||||||
|
function sanitize($string) {
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
$sep = $phpgw_info["server"]["dir_separator"];
|
||||||
|
return(ereg_replace( "^\.+", "",str_replace($sep, "",strrchr($string,$sep))));
|
||||||
|
}
|
||||||
|
|
||||||
|
function securitycheck($string) {
|
||||||
|
if(substr($string,0,1) == "." || substr($string,0,1) == "\\" || strstr($string, "..") || strstr($string, "\\..") || strstr($string, ".\\.")) {
|
||||||
|
return False;
|
||||||
|
}else{
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function rawname2array($string) {
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
$sep = $phpgw_info["server"]["dir_separator"];
|
||||||
|
|
||||||
|
if(substr($string,0,1) == $sep) {
|
||||||
|
// we have a starting slash...
|
||||||
|
$sub = substr($string,1); // take everything past the first slash...
|
||||||
|
$basedir = substr($sub,0,strpos($sub,$sep)); // ...to the second slash
|
||||||
|
if (!$basedir){
|
||||||
|
$basedir = substr($sub,strpos($sub,$sep)); // it becomes the basedir
|
||||||
|
}else{
|
||||||
|
$file = substr($sub,strpos($sub,$sep)); // take everything after the second slash.
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// we have no starting slash...
|
||||||
|
$basedir = $phpgw->common->appsession();
|
||||||
|
$file = $string;
|
||||||
|
}
|
||||||
|
|
||||||
|
// security check (might want to spin this into it's own function...)
|
||||||
|
if(substr($file,0,1) == "." || substr($file,0,1) == "\\" || strstr($file, "..") || strstr($file, "\\..") || strstr($file, ".\\.")) {
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
return(array( "basedir" => $basedir, "file" => $file));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getabsolutepath($target = False) {
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
$sep = $phpgw_info["server"]["dir_separator"];
|
||||||
|
$basedir = $phpgw_info["server"]["files_dir"].$sep."groups";
|
||||||
|
$currentdir = $phpgw->common->appsession();
|
||||||
|
if(!$this->securitycheck($target)) {
|
||||||
|
return False;
|
||||||
|
} else {
|
||||||
|
$dir_array = explode($sep,$target);
|
||||||
|
$dir_count = count($dir_array);
|
||||||
|
if (substr ($target, 0, 1) != $sep){
|
||||||
|
if (!empty($currentdir)){
|
||||||
|
$basedir .= $currentdir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for ($diridx=0;$diridx<$dir_count;++$diridx) {
|
||||||
|
if (!empty($dir_array[$diridx])){
|
||||||
|
$basedir .= $sep.$dir_array[$diridx];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $basedir = ereg_replace ($phpgw_info["server"]["files_dir"].$sep."groups".$sep."home", $phpgw_info["server"]["files_dir"].$sep."users".$sep.$phpgw_info["user"]["userid"], $basedir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ls($target = False, $checksubdirs = "No") {
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
$sep = $phpgw_info["server"]["dir_separator"];
|
||||||
|
if(!$this->securitycheck($target)) {
|
||||||
|
return False;
|
||||||
|
} else {
|
||||||
|
$basedir = $this->getabsolutepath($target);
|
||||||
|
if ($basedir == $phpgw_info["server"]["files_dir"].$sep."groups".$sep || $target == "/"){
|
||||||
|
//if ($basedir == $phpgw_info["server"]["files_dir"].$sep."groups".$sep){
|
||||||
|
if ($checksubdirs == "Yes"){ //if its a dir, does that dir have subdirs?
|
||||||
|
$path = $phpgw_info["server"]["files_dir"].$sep."users".$sep.$phpgw_info["user"]["userid"];
|
||||||
|
$subdir = dir($path);
|
||||||
|
while($subentry=$subdir->read()) {
|
||||||
|
$subpath = $path.$sep.$subentry;
|
||||||
|
$subtype = filetype($subpath);
|
||||||
|
if ($subentry != "." && $subentry != ".." && $subtype == "dir"){
|
||||||
|
$hassubdir = True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$list[] = array("name" => "home", "type" => "dir", "subdirs" => $hassubdir);
|
||||||
|
$hassubdir = False;
|
||||||
|
$groups = $phpgw->accounts->read_group_names();
|
||||||
|
if (!empty ($groups[0][1])) {
|
||||||
|
$group_count = count($groups);
|
||||||
|
for ($groupidx=0;$groupidx<$group_count;++$groupidx) {
|
||||||
|
$this->verifydir("group",$groups[$groupidx][1]);
|
||||||
|
if ($checksubdirs == "Yes"){ //if its a dir, does that dir have subdirs?
|
||||||
|
$path = $phpgw_info["server"]["files_dir"].$sep."groups".$sep.$groups[$groupidx][1];
|
||||||
|
$subdir = dir($path);
|
||||||
|
while($subentry=$subdir->read()) {
|
||||||
|
$subpath = $path.$sep.$subentry;
|
||||||
|
$subtype = filetype($subpath);
|
||||||
|
if ($subentry != "." && $subentry != ".." && $subtype == "dir"){
|
||||||
|
$hassubdir = True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$list[] = array("name" => $groups[$groupidx][1], "type" => "dir", "subdirs" => $hassubdir);
|
||||||
|
$hassubdir = False;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}elseif (is_dir($basedir)){ //if basedir is a directory, then we fill the array
|
||||||
|
$dir = dir($basedir);
|
||||||
|
while($entry=$dir->read()) {
|
||||||
|
if ($entry != "." && $entry != ".." ){ //make sure we filter out . and ..
|
||||||
|
$path = $basedir.$sep.$entry;
|
||||||
|
if (filetype($path) == "dir"){
|
||||||
|
$entrytype = "dir";
|
||||||
|
if ($checksubdirs == "Yes"){ //if its a dir, does that dir have subdirs?
|
||||||
|
$subdir = dir($path);
|
||||||
|
while($subentry=$subdir->read()) {
|
||||||
|
$subpath = "$path$sep$subentry";
|
||||||
|
$subtype = filetype($subpath);
|
||||||
|
if ($subentry != "." && $subentry != ".." && $subtype == "dir"){
|
||||||
|
$hassubdir = True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$list[] = array("name" => $entry, "type" => $entrytype, "subdirs" => $hassubdir);
|
||||||
|
}
|
||||||
|
if (filetype($path) == "file"){
|
||||||
|
$entrytype = "file";
|
||||||
|
$entrysize = filesize($path);
|
||||||
|
$entrymodifiedtime = filemtime($path);
|
||||||
|
$list[] = array("name" => $entry, "type" => $entrytype, "size" => $entrysize, "modified" =>$entrymodifiedtime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$dir->close();
|
||||||
|
return $list;
|
||||||
|
}elseif(is_file($basedir)){
|
||||||
|
$dir_array = explode($sep,$basedir);
|
||||||
|
unset($basedir);
|
||||||
|
$dir_count = count($dir_array);
|
||||||
|
for ($diridx=0;$diridx<($dir_count-1);++$diridx) {
|
||||||
|
if (!empty($dir_array[$diridx])){
|
||||||
|
$basedir .= $sep.$dir_array[$diridx];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!is_dir($basedir) && !is_file($basedir)){
|
||||||
|
return False;
|
||||||
|
}elseif (is_dir($basedir)) {
|
||||||
|
$file = $dir_array[$dir_count];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function dir($target, $checksubdirs) {
|
||||||
|
return $this->ls($target, $checksubdirs);
|
||||||
|
}
|
||||||
|
|
||||||
|
function cd ($target = "/", $targettype = "relative"){
|
||||||
|
global $phpgw, $phpgw_info;
|
||||||
|
$sep = $phpgw_info["server"]["dir_separator"];
|
||||||
|
if ($targettype == "relative"){
|
||||||
|
$basedir = $this->getabsolutepath($target);
|
||||||
|
}else{
|
||||||
|
$basedir = $target;
|
||||||
|
}
|
||||||
|
$currentdir = $phpgw->common->appsession();
|
||||||
|
if (substr ($target, 0, 1) != $sep){
|
||||||
|
if (!empty($currentdir)){
|
||||||
|
$appsession_dir = $currentdir.$sep.$target;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
$appsession_dir = $target;
|
||||||
|
}
|
||||||
|
if (!is_dir($basedir)){
|
||||||
|
return False;
|
||||||
|
}else{
|
||||||
|
$var = chdir ($basedir);
|
||||||
|
if ($var){
|
||||||
|
$phpgw->common->appsession($appsession_dir);
|
||||||
|
return True;
|
||||||
|
}else{
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function pwd() {
|
||||||
|
global $phpgw;
|
||||||
|
$currentdir = $phpgw->common->appsession();
|
||||||
|
if ($currentdir == ""){$currentdir = "/";}
|
||||||
|
return $currentdir;
|
||||||
|
}
|
||||||
|
|
||||||
|
function read($file) {
|
||||||
|
global $phpgw_info;
|
||||||
|
$path = $this->getabsolutepath($file);
|
||||||
|
if ($fp = fopen($path, "r")) {
|
||||||
|
$contents = fread($fp, filesize($path));
|
||||||
|
fclose($fp);
|
||||||
|
return $contents;
|
||||||
|
} else {
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function write($file, $contents) {
|
||||||
|
global $phpgw_info;
|
||||||
|
$path = $this->getabsolutepath($file);
|
||||||
|
umask(000);
|
||||||
|
if ($fp = fopen($path, "w")) {
|
||||||
|
fputs($fp, $contents, strlen($contents));
|
||||||
|
fclose($fp);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function move_uploaded_file($fromfile, $tofile, $from_absolute = "") {
|
||||||
|
global $phpgw_info;
|
||||||
|
if ($from_absolute){
|
||||||
|
$frompath = $fromfile;
|
||||||
|
}else{
|
||||||
|
$frompath = $this->getabsolutepath($fromfile);
|
||||||
|
}
|
||||||
|
$topath = $this->getabsolutepath($tofile);
|
||||||
|
umask(000);
|
||||||
|
if (!$this->move_uploaded_file($fromfile, $topath)) {
|
||||||
|
return False;
|
||||||
|
}else{
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function cp($fromfile, $tofile, $from_absolute = "") {
|
||||||
|
global $phpgw_info;
|
||||||
|
if ($from_absolute){
|
||||||
|
$frompath = $fromfile;
|
||||||
|
}else{
|
||||||
|
$frompath = $this->getabsolutepath($fromfile);
|
||||||
|
}
|
||||||
|
$topath = $this->getabsolutepath($tofile);
|
||||||
|
umask(000);
|
||||||
|
if (!copy($frompath, $topath)) {
|
||||||
|
return False;
|
||||||
|
}else{
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function copy($fromfile, $tofile) {
|
||||||
|
umask(000);
|
||||||
|
return $this->cp($fromfile, $tofile);
|
||||||
|
}
|
||||||
|
|
||||||
|
function mv($fromfile, $tofile) {
|
||||||
|
global $phpgw_info;
|
||||||
|
$frompath = $this->getabsolutepath($fromfile);
|
||||||
|
$topath = $this->getabsolutepath($tofile);
|
||||||
|
if (!copy($frompath, $topath)) {
|
||||||
|
return False;
|
||||||
|
}else{
|
||||||
|
if (!unlink($frompath)) {
|
||||||
|
return False;
|
||||||
|
}else{
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function move($fromfile, $tofile) {
|
||||||
|
umask(000);
|
||||||
|
return $this->mv($fromfile, $tofile);
|
||||||
|
}
|
||||||
|
|
||||||
|
function rm($file) {
|
||||||
|
global $phpgw_info;
|
||||||
|
$path = $this->getabsolutepath($file);
|
||||||
|
if (!unlink($path)) {
|
||||||
|
return False;
|
||||||
|
}else{
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function delete($file) {
|
||||||
|
return $this->rm($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
function rmdir($dir) {
|
||||||
|
global $phpgw_info;
|
||||||
|
$path = $this->getabsolutepath($dir);
|
||||||
|
if (!rmdir($path)) {
|
||||||
|
return False;
|
||||||
|
}else{
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function mkdir($dir) {
|
||||||
|
global $phpgw_info;
|
||||||
|
$path = $this->getabsolutepath($dir);
|
||||||
|
umask(000);
|
||||||
|
if (!mkdir($path, 01707)) {
|
||||||
|
return False;
|
||||||
|
}else{
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function verifydir($type = "user", $account = False) {
|
||||||
|
global $phpgw_info;
|
||||||
|
|
||||||
|
if (!$account){
|
||||||
|
$path = "/home";
|
||||||
|
}else{
|
||||||
|
$path = "/".$account;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_dir ($this->getabsolutepath($path))) {
|
||||||
|
if (!$this->mkdir ($path)) {
|
||||||
|
$msg = "To correct this error you will need to properly set the "
|
||||||
|
. "permissions to the files/users directory.<br> "
|
||||||
|
."On *nix systems please type: chmod 707 ";
|
||||||
|
|
||||||
|
if ($type = "user"){
|
||||||
|
$msg .= $phpgw_info["server"]["files_dir"] . "/users/";
|
||||||
|
}else{
|
||||||
|
$msg .= $phpgw_info["server"]["files_dir"] . "/groups/";
|
||||||
|
}
|
||||||
|
echo $msg;
|
||||||
|
return False;
|
||||||
|
}else{
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
7
phpgwapi/templates/default/frames.tpl
Normal file
7
phpgwapi/templates/default/frames.tpl
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<!-- BEGIN frames -->
|
||||||
|
<html>
|
||||||
|
<frameset rows="{frame_size}" border="0">
|
||||||
|
{frames_}
|
||||||
|
</frameset>
|
||||||
|
</html>
|
||||||
|
<!-- END frames -->
|
3
phpgwapi/templates/default/frames_body.tpl
Normal file
3
phpgwapi/templates/default/frames_body.tpl
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<!-- BEGIN frame_body -->
|
||||||
|
<frame src="{body_link}" name="phpgw_body">
|
||||||
|
<!-- END frame_body -->
|
3
phpgwapi/templates/default/frames_navbar.tpl
Normal file
3
phpgwapi/templates/default/frames_navbar.tpl
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<!-- BEGIN frame_navbar -->
|
||||||
|
<frame src="{navbar_link}" name="phpgw_navbar" scrolling="no">
|
||||||
|
<!-- END frame_navbar -->
|
61
phpgwapi/templates/default/login.tpl
Normal file
61
phpgwapi/templates/default/login.tpl
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
<!-- BEGIN login_form -->
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{website_title} - Login</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body bgcolor="FFFFFF">
|
||||||
|
<a href="http://www.phpgroupware.org"><img src="phpGroupWare.jpg" alt="phpGroupWare" border="0"></a>
|
||||||
|
<p> </p>
|
||||||
|
<center>{lang_message}</center>
|
||||||
|
<p> </p>
|
||||||
|
|
||||||
|
<table bgcolor="000000" border="0" cellpadding="0" cellspacing="0" width="40%" align="center">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<table border="0" width="100%" bgcolor="486591" cellpadding="2" cellspacing="1">
|
||||||
|
<tr bgcolor="486591">
|
||||||
|
<td align="left">
|
||||||
|
<font color="fefefe"> {lang_phpgw_login}</font>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr bgcolor="e6e6e6">
|
||||||
|
<td valign="baselines">
|
||||||
|
|
||||||
|
<form method="post" action="{login_url}">
|
||||||
|
<table border="0" align="center" bgcolor="486591" width="100%" cellpadding="0" cellspacing="0">
|
||||||
|
<tr bgcolor="e6e6e6">
|
||||||
|
<td colspan="2" align="center">
|
||||||
|
{cd}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr bgcolor="e6e6e6">
|
||||||
|
<td align="right"><font color="000000">{lang_username}: </font></td>
|
||||||
|
<td><input name="login" value="{cookie}"></td>
|
||||||
|
</tr>
|
||||||
|
<tr bgcolor="e6e6e6">
|
||||||
|
<td align="right"><font color="000000">{lang_password}: </font></td>
|
||||||
|
<td><input name="passwd" type="password"></td>
|
||||||
|
</tr>
|
||||||
|
<tr bgcolor="e6e6e6">
|
||||||
|
<td colspan="2" align="center">
|
||||||
|
<input type="submit" value="{lang_login}" name="submit">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr bgcolor="e6e6e6">
|
||||||
|
<td colspan="2" align="right">
|
||||||
|
<font color="000000" size="-1">{version}</font>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</html>
|
||||||
|
<!-- END login_form -->
|
14
phpgwapi/templates/default/login_denylogin.tpl
Normal file
14
phpgwapi/templates/default/login_denylogin.tpl
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
<!-- BEGIN form -->
|
||||||
|
<body bgcolor="FFFFFF">
|
||||||
|
<a href="http://www.phpgroupware.org"><img src="phpGroupWare.jpg" alt="phpGroupWare" border="0"></a>
|
||||||
|
|
||||||
|
<table border="0" height="94%" width="100%">
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
Opps! You caught us in the middle of a system upgrade.<br>Please, check back with us shortly.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- END form -->
|
63
phpgwapi/templates/default/login_selectdomain.tpl
Normal file
63
phpgwapi/templates/default/login_selectdomain.tpl
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
<!-- BEGIN login_form -->
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{website_title} - Login</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body bgcolor="FFFFFF">
|
||||||
|
<a href="http://www.phpgroupware.org"><img src="phpGroupWare.jpg" alt="phpGroupWare" border="0"></a>
|
||||||
|
<p> </p>
|
||||||
|
<center>{lang_message}</center>
|
||||||
|
<p> </p>
|
||||||
|
|
||||||
|
<table bgcolor="000000" border="0" cellpadding="0" cellspacing="0" width="60%" align="center">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<table border="0" width="100%" bgcolor="486591" cellpadding="2" cellspacing="1">
|
||||||
|
<tr bgcolor="486591">
|
||||||
|
<td align="left">
|
||||||
|
<font color="fefefe"> {lang_phpgw_login}</font>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr bgcolor="e6e6e6">
|
||||||
|
<td valign="baselines">
|
||||||
|
|
||||||
|
<form method="post" action="{login_url}">
|
||||||
|
<table border="0" align="center" bgcolor="486591" width="100%" cellpadding="0" cellspacing="0">
|
||||||
|
<tr bgcolor="e6e6e6">
|
||||||
|
<td colspan="3" align="center">
|
||||||
|
{cd}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr bgcolor="e6e6e6">
|
||||||
|
<td align="right"><font color="000000">{lang_username}:</font></td>
|
||||||
|
<td align="right"><input name="login" value="{cookie}"></td>
|
||||||
|
<td align="left"> @ <select name="logindomain">{select_domain}</select></td>
|
||||||
|
</tr>
|
||||||
|
<tr bgcolor="e6e6e6">
|
||||||
|
<td align="right"><font color="000000">{lang_password}:</font></td>
|
||||||
|
<td align="right"><input name="passwd" type="password"></td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr bgcolor="e6e6e6">
|
||||||
|
<td colspan="3" align="center">
|
||||||
|
<input type="submit" value="{lang_login}" name="submit">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr bgcolor="e6e6e6">
|
||||||
|
<td colspan="3" align="right">
|
||||||
|
<font color="000000" size="-1">{version}</font>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</html>
|
||||||
|
<!-- END login_form -->
|
6
phpgwapi/templates/default/navbar.tpl
Normal file
6
phpgwapi/templates/default/navbar.tpl
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
<!-- BEGIN navbar -->
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
{navbar_rows}
|
||||||
|
</table><p>
|
||||||
|
<!-- END navbar -->
|
3
phpgwapi/templates/default/navbar_column.tpl
Normal file
3
phpgwapi/templates/default/navbar_column.tpl
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<!-- BEGIN navbar_column -->
|
||||||
|
<td align="{td_align}" width="{td_width}" colspan="{colspan}">{value}</td>
|
||||||
|
<!-- END navbar_column -->
|
6
phpgwapi/templates/default/navbar_row.tpl
Normal file
6
phpgwapi/templates/default/navbar_row.tpl
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
<!-- BEGIN navbar_row -->
|
||||||
|
<tr bgcolor="{tr_color}">
|
||||||
|
{navbar_columns}
|
||||||
|
</tr>
|
||||||
|
<!-- END navbar_row -->
|
34
phpgwapi/themes/blue.theme
Normal file
34
phpgwapi/themes/blue.theme
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
$phpgw_info["theme"]["bg_color"]= "FFFFFF";
|
||||||
|
$phpgw_info["theme"]["bg_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["vlink"]= "blue";
|
||||||
|
$phpgw_info["theme"]["alink"]= "red";
|
||||||
|
$phpgw_info["theme"]["link"]= "blue";
|
||||||
|
$phpgw_info["theme"]["row_on"]= "CCCCFF";
|
||||||
|
$phpgw_info["theme"]["row_off"]= "E4DFFF";
|
||||||
|
$phpgw_info["theme"]["row_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["th_bg"]= "9999FF";
|
||||||
|
$phpgw_info["theme"]["th_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["navbar_bg"]= "967FF4";
|
||||||
|
$phpgw_info["theme"]["navbar_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["table_bg"]= "967FF4";
|
||||||
|
$phpgw_info["theme"]["table_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["font"]= "Arial, Helvetica, san-serif";
|
||||||
|
$phpgw_info["theme"]["bg01"]= "dadada";
|
||||||
|
$phpgw_info["theme"]["bg02"]= "dad0d0";
|
||||||
|
$phpgw_info["theme"]["bg03"]= "dacaca";
|
||||||
|
$phpgw_info["theme"]["bg04"]= "dac0c0";
|
||||||
|
$phpgw_info["theme"]["bg05"]= "dababa";
|
||||||
|
$phpgw_info["theme"]["bg06"]= "dab0b0";
|
||||||
|
$phpgw_info["theme"]["bg07"]= "daaaaa";
|
||||||
|
$phpgw_info["theme"]["bg08"]= "da9090";
|
||||||
|
$phpgw_info["theme"]["bg09"]= "da8a8a";
|
||||||
|
$phpgw_info["theme"]["bg10"]= "da7a7a";
|
||||||
|
|
||||||
|
// This one is for the calendar only
|
||||||
|
$phpgw_info["theme"]["cal_today"]= "FFFFCC";
|
||||||
|
|
||||||
|
// These are for the email only
|
||||||
|
$phpgw_info["theme"]["em_folder"]= "666699";
|
||||||
|
$phpgw_info["theme"]["em_folder_text"]= "FFFFFF";
|
||||||
|
|
40
phpgwapi/themes/default.theme
Normal file
40
phpgwapi/themes/default.theme
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
** This is the default theme for the users
|
||||||
|
** You can use this as a template for new themes.
|
||||||
|
** If you make some good ones, please, send me a copy and I will include it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
$phpgw_info["theme"]["bg_color"]= "FFFFFF";
|
||||||
|
$phpgw_info["theme"]["bg_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["vlink"]= "blue";
|
||||||
|
$phpgw_info["theme"]["alink"]= "red";
|
||||||
|
$phpgw_info["theme"]["link"]= "blue";
|
||||||
|
$phpgw_info["theme"]["row_on"]= "DDDDDD";
|
||||||
|
$phpgw_info["theme"]["row_off"]= "EEEEEE";
|
||||||
|
$phpgw_info["theme"]["row_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["th_bg"]= "D3DCE3";
|
||||||
|
$phpgw_info["theme"]["th_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["navbar_bg"]= "9999FF";
|
||||||
|
$phpgw_info["theme"]["navbar_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["table_bg"]= "9999FF";
|
||||||
|
$phpgw_info["theme"]["table_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["font"]= "Arial, Helvetica, san-serif";
|
||||||
|
$phpgw_info["theme"]["bg01"]= "dadada";
|
||||||
|
$phpgw_info["theme"]["bg02"]= "dad0d0";
|
||||||
|
$phpgw_info["theme"]["bg03"]= "dacaca";
|
||||||
|
$phpgw_info["theme"]["bg04"]= "dac0c0";
|
||||||
|
$phpgw_info["theme"]["bg05"]= "dababa";
|
||||||
|
$phpgw_info["theme"]["bg06"]= "dab0b0";
|
||||||
|
$phpgw_info["theme"]["bg07"]= "daaaaa";
|
||||||
|
$phpgw_info["theme"]["bg08"]= "da9090";
|
||||||
|
$phpgw_info["theme"]["bg09"]= "da8a8a";
|
||||||
|
$phpgw_info["theme"]["bg10"]= "da7a7a";
|
||||||
|
|
||||||
|
// Theses are for the calendar only
|
||||||
|
$phpgw_info["theme"]["cal_today"]= "FFFFCC";
|
||||||
|
$phpgw_info["theme"]["cal_dayview"]= "C0C0C0";
|
||||||
|
|
||||||
|
// These are for the email only
|
||||||
|
$phpgw_info["theme"]["em_folder"]= "666699";
|
||||||
|
$phpgw_info["theme"]["em_folder_text"]= "FFFFFF";
|
40
phpgwapi/themes/fancy.theme
Normal file
40
phpgwapi/themes/fancy.theme
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
** This is the default theme for the users
|
||||||
|
** You can use this as a template for new themes.
|
||||||
|
** If you make some good ones, please, send me a copy and I will include it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
$phpgw_info["theme"]["bg_color"]= "F5F5F5";
|
||||||
|
$phpgw_info["theme"]["bg_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["vlink"]= "EE0000";
|
||||||
|
$phpgw_info["theme"]["alink"]= "EE0000";
|
||||||
|
$phpgw_info["theme"]["link"]= "EE0000";
|
||||||
|
$phpgw_info["theme"]["row_on"]= "EEEEFF";
|
||||||
|
$phpgw_info["theme"]["row_off"]= "FFFFEE";
|
||||||
|
$phpgw_info["theme"]["row_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["th_bg"]= "FFE4C4";
|
||||||
|
$phpgw_info["theme"]["th_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["navbar_bg"]= "AABBCC";
|
||||||
|
$phpgw_info["theme"]["navbar_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["table_bg"]= "F5F5F5";
|
||||||
|
$phpgw_info["theme"]["table_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["font"]= "Arial, Helvetica, san-serif";
|
||||||
|
$phpgw_info["theme"]["bg01"]= "dadada";
|
||||||
|
$phpgw_info["theme"]["bg02"]= "dad0d0";
|
||||||
|
$phpgw_info["theme"]["bg03"]= "dacaca";
|
||||||
|
$phpgw_info["theme"]["bg04"]= "dac0c0";
|
||||||
|
$phpgw_info["theme"]["bg05"]= "dababa";
|
||||||
|
$phpgw_info["theme"]["bg06"]= "dab0b0";
|
||||||
|
$phpgw_info["theme"]["bg07"]= "daaaaa";
|
||||||
|
$phpgw_info["theme"]["bg08"]= "da9090";
|
||||||
|
$phpgw_info["theme"]["bg09"]= "da8a8a";
|
||||||
|
$phpgw_info["theme"]["bg10"]= "da7a7a";
|
||||||
|
|
||||||
|
// Theses are for the calendar only
|
||||||
|
$phpgw_info["theme"]["cal_today"]= "D0DCE0";
|
||||||
|
$phpgw_info["theme"]["cal_dayview"]= "C0C0C0";
|
||||||
|
|
||||||
|
// These are for the email only
|
||||||
|
$phpgw_info["theme"]["em_folder"]= "7090FF";
|
||||||
|
$phpgw_info["theme"]["em_folder_text"]= "FFFFFF";
|
32
phpgwapi/themes/greys.theme
Normal file
32
phpgwapi/themes/greys.theme
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<?
|
||||||
|
# phpGroupWare Theme file
|
||||||
|
$phpgw_info["theme"]["bg_color"]= "dfdfdf";
|
||||||
|
$phpgw_info["theme"]["bg_text"]= "222222";
|
||||||
|
$phpgw_info["theme"]["vlink"]= "5555ff";
|
||||||
|
$phpgw_info["theme"]["alink"]= "black";
|
||||||
|
$phpgw_info["theme"]["link"]= "0000ff";
|
||||||
|
$phpgw_info["theme"]["row_on"]= "eeeeee";
|
||||||
|
$phpgw_info["theme"]["row_off"]= "cccccc";
|
||||||
|
$phpgw_info["theme"]["row_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["th_bg"]= "eeeeee";
|
||||||
|
$phpgw_info["theme"]["th_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["navbar_bg"]= "aaaaaa";
|
||||||
|
$phpgw_info["theme"]["navbar_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["table_bg"]= "eeeeee";
|
||||||
|
$phpgw_info["theme"]["table_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["font"]= "Arial, Helvetica, san-serif";
|
||||||
|
$phpgw_info["theme"]["bg01"]= "eeeeee";
|
||||||
|
$phpgw_info["theme"]["bg02"]= "cccccc";
|
||||||
|
$phpgw_info["theme"]["bg03"]= "bbbbbb";
|
||||||
|
$phpgw_info["theme"]["bg04"]= "aaaaaa";
|
||||||
|
$phpgw_info["theme"]["bg05"]= "999999";
|
||||||
|
$phpgw_info["theme"]["bg06"]= "888888";
|
||||||
|
$phpgw_info["theme"]["bg07"]= "777777";
|
||||||
|
$phpgw_info["theme"]["bg08"]= "666666";
|
||||||
|
$phpgw_info["theme"]["bg09"]= "555555";
|
||||||
|
$phpgw_info["theme"]["bg10"]= "444444";
|
||||||
|
$phpgw_info["theme"]["cal_today"]= "FBF1C5";
|
||||||
|
$phpgw_info["theme"]["cal_dayview"]= "F9E99F";
|
||||||
|
$phpgw_info["theme"]["em_folder"]= "EAD688";
|
||||||
|
$phpgw_info["theme"]["em_folder_text"]= "000000";
|
||||||
|
?>
|
35
phpgwapi/themes/heaven.theme
Normal file
35
phpgwapi/themes/heaven.theme
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
$phpgw_info["theme"]["bg_color"]= "FFFFFF";
|
||||||
|
$phpgw_info["theme"]["bg_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["vlink"]= "blue";
|
||||||
|
$phpgw_info["theme"]["alink"]= "red";
|
||||||
|
$phpgw_info["theme"]["link"]= "blue";
|
||||||
|
$phpgw_info["theme"]["row_on"]= "DDDDDD";
|
||||||
|
$phpgw_info["theme"]["row_off"]= "EEEEEE";
|
||||||
|
$phpgw_info["theme"]["row_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["th_bg"]= "D3DCE3";
|
||||||
|
$phpgw_info["theme"]["th_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["navbar_bg"]= "80BBFF";
|
||||||
|
$phpgw_info["theme"]["navbar_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["table_bg"]= "7090FF";
|
||||||
|
$phpgw_info["theme"]["table_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["font"]= "Arial, Helvetica, san-serif";
|
||||||
|
$phpgw_info["theme"]["bg01"]= "dadada";
|
||||||
|
$phpgw_info["theme"]["bg02"]= "dad0d0";
|
||||||
|
$phpgw_info["theme"]["bg03"]= "dacaca";
|
||||||
|
$phpgw_info["theme"]["bg04"]= "dac0c0";
|
||||||
|
$phpgw_info["theme"]["bg05"]= "dababa";
|
||||||
|
$phpgw_info["theme"]["bg06"]= "dab0b0";
|
||||||
|
$phpgw_info["theme"]["bg07"]= "daaaaa";
|
||||||
|
$phpgw_info["theme"]["bg08"]= "da9090";
|
||||||
|
$phpgw_info["theme"]["bg09"]= "da8a8a";
|
||||||
|
$phpgw_info["theme"]["bg10"]= "da7a7a";
|
||||||
|
|
||||||
|
// Theses are for the calendar only
|
||||||
|
$phpgw_info["theme"]["cal_today"]= "FFFFCC";
|
||||||
|
$phpgw_info["theme"]["cal_dayview"]= "C0C0C0";
|
||||||
|
|
||||||
|
// These are for the email only
|
||||||
|
//$phpgw_info["theme"]["em_folder"]= "666699";
|
||||||
|
$phpgw_info["theme"]["em_folder"]= "7090FF";
|
||||||
|
$phpgw_info["theme"]["em_folder_text"]= "FFFFFF";
|
35
phpgwapi/themes/mojo.theme
Normal file
35
phpgwapi/themes/mojo.theme
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
// mojo theme written by marl <marl@users.sourceforge.net>
|
||||||
|
$phpgw_info["theme"]["bg_color"]= "000000";
|
||||||
|
$phpgw_info["theme"]["bg_text"]= "00FF33";
|
||||||
|
$phpgw_info["theme"]["vlink"]= "0000FF";
|
||||||
|
$phpgw_info["theme"]["alink"]= "999999";
|
||||||
|
$phpgw_info["theme"]["link"]= "0000FF";
|
||||||
|
$phpgw_info["theme"]["row_on"]= "909090";
|
||||||
|
$phpgw_info["theme"]["row_off"]= "808080";
|
||||||
|
$phpgw_info["theme"]["row_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["th_bg"]= "404040";
|
||||||
|
$phpgw_info["theme"]["th_text"]= "00FF33";
|
||||||
|
$phpgw_info["theme"]["navbar_bg"]= "00FF33";
|
||||||
|
$phpgw_info["theme"]["navbar_text"]= "FFFFFF";
|
||||||
|
$phpgw_info["theme"]["table_bg"]= "00FF33";
|
||||||
|
$phpgw_info["theme"]["table_text"]= "FFFFFF";
|
||||||
|
$phpgw_info["theme"]["font"]= "Helvetica";
|
||||||
|
$phpgw_info["theme"]["bg01"]= "dadada";
|
||||||
|
$phpgw_info["theme"]["bg02"]= "dad0d0";
|
||||||
|
$phpgw_info["theme"]["bg03"]= "dacaca";
|
||||||
|
$phpgw_info["theme"]["bg04"]= "dac0c0";
|
||||||
|
$phpgw_info["theme"]["bg05"]= "dababa";
|
||||||
|
$phpgw_info["theme"]["bg06"]= "dab0b0";
|
||||||
|
$phpgw_info["theme"]["bg07"]= "daaaaa";
|
||||||
|
$phpgw_info["theme"]["bg08"]= "da9090";
|
||||||
|
$phpgw_info["theme"]["bg09"]= "da8a8a";
|
||||||
|
$phpgw_info["theme"]["bg10"]= "da7a7a";
|
||||||
|
|
||||||
|
// This one is for the calendar only
|
||||||
|
$phpgw_info["theme"]["cal_today"]= "BFBFBF";
|
||||||
|
|
||||||
|
// These are for the email only
|
||||||
|
$phpgw_info["theme"]["em_folder"]= "808080";
|
||||||
|
$phpgw_info["theme"]["em_folder_text"]= "000000";
|
||||||
|
|
25
phpgwapi/themes/rose.theme
Normal file
25
phpgwapi/themes/rose.theme
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
$phpgw_info["theme"]["bg_color"]= "ce9592";
|
||||||
|
$phpgw_info["theme"]["bg_text"]= "9d1811";
|
||||||
|
$phpgw_info["theme"]["vlink"]= "pink";
|
||||||
|
$phpgw_info["theme"]["alink"]= "red";
|
||||||
|
$phpgw_info["theme"]["link"]= "red";
|
||||||
|
$phpgw_info["theme"]["row_on"]= "DDDDDD";
|
||||||
|
$phpgw_info["theme"]["row_off"]= "EEEEEE";
|
||||||
|
$phpgw_info["theme"]["row_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["th_bg"]= "ce9592";
|
||||||
|
$phpgw_info["theme"]["th_text"]= "9d1811";
|
||||||
|
$phpgw_info["theme"]["navbar_bg"]= "bd524a";
|
||||||
|
$phpgw_info["theme"]["navbar_text"]= "9d1811";
|
||||||
|
$phpgw_info["theme"]["table_bg"]= "ffbab7";
|
||||||
|
$phpgw_info["theme"]["table_text"]= "72022a";
|
||||||
|
$phpgw_info["theme"]["font"]= "Arial, Helvetica, san-serif";
|
||||||
|
|
||||||
|
// Theses are for the calendar only
|
||||||
|
$phpgw_info["theme"]["cal_today"]= "bd524a";
|
||||||
|
$phpgw_info["theme"]["cal_dayview"]= "C0C0C0";
|
||||||
|
|
||||||
|
// These are for the email only
|
||||||
|
$phpgw_info["theme"]["em_folder"]= "bd542a";
|
||||||
|
$phpgw_info["theme"]["em_folder_text"]= "9d1811";
|
||||||
|
|
35
phpgwapi/themes/submarine.theme
Normal file
35
phpgwapi/themes/submarine.theme
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
$phpgw_info["theme"]["bg_color"]= "FFFFFF";
|
||||||
|
$phpgw_info["theme"]["bg_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["vlink"]= "blue";
|
||||||
|
$phpgw_info["theme"]["alink"]= "red";
|
||||||
|
$phpgw_info["theme"]["link"]= "blue";
|
||||||
|
$phpgw_info["theme"]["row_on"]= "CCEEFF";
|
||||||
|
$phpgw_info["theme"]["row_off"]= "DDF0FF";
|
||||||
|
$phpgw_info["theme"]["row_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["th_bg"]= "80BBFF";
|
||||||
|
$phpgw_info["theme"]["th_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["navbar_bg"]= "80CCFF";
|
||||||
|
$phpgw_info["theme"]["navbar_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["table_bg"]= "7090FF";
|
||||||
|
$phpgw_info["theme"]["table_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["font"]= "Arial, Helvetica, san-serif";
|
||||||
|
$phpgw_info["theme"]["bg01"]= "dadada";
|
||||||
|
$phpgw_info["theme"]["bg02"]= "dad0d0";
|
||||||
|
$phpgw_info["theme"]["bg03"]= "dacaca";
|
||||||
|
$phpgw_info["theme"]["bg04"]= "dac0c0";
|
||||||
|
$phpgw_info["theme"]["bg05"]= "dababa";
|
||||||
|
$phpgw_info["theme"]["bg06"]= "dab0b0";
|
||||||
|
$phpgw_info["theme"]["bg07"]= "daaaaa";
|
||||||
|
$phpgw_info["theme"]["bg08"]= "da9090";
|
||||||
|
$phpgw_info["theme"]["bg09"]= "da8a8a";
|
||||||
|
$phpgw_info["theme"]["bg10"]= "da7a7a";
|
||||||
|
|
||||||
|
// Theses are for the calendar only
|
||||||
|
$phpgw_info["theme"]["cal_today"]= "FFFFCC";
|
||||||
|
$phpgw_info["theme"]["cal_dayview"]= "C0C0C0";
|
||||||
|
|
||||||
|
// These are for the email only
|
||||||
|
//$phpgw_info["theme"]["em_folder"]= "666699";
|
||||||
|
$phpgw_info["theme"]["em_folder"]= "7090FF";
|
||||||
|
$phpgw_info["theme"]["em_folder_text"]= "FFFFFF";
|
23
phpgwapi/themes/template2theme.pl
Executable file
23
phpgwapi/themes/template2theme.pl
Executable file
@ -0,0 +1,23 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
# Takes a simple text file of properties and turns them
|
||||||
|
# into a themes files.
|
||||||
|
# Use it like so:
|
||||||
|
# template2theme.pl < infile > outfile
|
||||||
|
# by Stephan
|
||||||
|
# $Id$
|
||||||
|
$wrap='$phpgw_info["theme"]["_KEY_"]= "_VAL_"';
|
||||||
|
print "<?\n";
|
||||||
|
print << "EOF";
|
||||||
|
# phpGroupWare Theme file
|
||||||
|
EOF
|
||||||
|
|
||||||
|
while( $_ = <STDIN> ) {
|
||||||
|
next unless ( $_ =~ /^\s*(\w+)\s*=(.+)/ );
|
||||||
|
$k=$1;
|
||||||
|
$v=$2;
|
||||||
|
my $foo = $wrap;
|
||||||
|
$foo =~ s/_KEY_/$k/;
|
||||||
|
$foo =~ s/_VAL_/$v/;
|
||||||
|
print "$foo;\n";
|
||||||
|
}
|
||||||
|
print "?>";
|
36
phpgwapi/themes/theme.template
Normal file
36
phpgwapi/themes/theme.template
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
# This is a template for making a theme file to run through
|
||||||
|
# template2theme.pl
|
||||||
|
# Any line STARTING with xxx=yyy
|
||||||
|
# will be included in the output. All others are ignored.
|
||||||
|
bg_color=FBF1C5
|
||||||
|
bg_text=000000
|
||||||
|
vlink=blue
|
||||||
|
alink=red
|
||||||
|
link=blue
|
||||||
|
row_on=F7E58F
|
||||||
|
row_off=EAD688
|
||||||
|
row_text=000000
|
||||||
|
th_bg=C8A63B
|
||||||
|
th_text=000000
|
||||||
|
navbar_bg=F7E58F
|
||||||
|
navbar_text=000000
|
||||||
|
table_bg=EAD688
|
||||||
|
table_text=C5AA2B
|
||||||
|
font=Arial, Helvetica, san-serif
|
||||||
|
bg01=FBF4D3
|
||||||
|
bg02=F9EDB3
|
||||||
|
bg03=F5E28B
|
||||||
|
bg04=F0D866
|
||||||
|
bg05=EDCD39
|
||||||
|
bg06=D5B211
|
||||||
|
bg07=CCAB12
|
||||||
|
bg08=C58C13
|
||||||
|
bg09=B69910
|
||||||
|
bg10=AC9010
|
||||||
|
|
||||||
|
cal_today=FBF1C5
|
||||||
|
cal_dayview=F9E99F
|
||||||
|
|
||||||
|
em_folder=EAD688
|
||||||
|
em_folder_text=000000
|
||||||
|
|
18
phpgwapi/themes/theme2template.pl
Executable file
18
phpgwapi/themes/theme2template.pl
Executable file
@ -0,0 +1,18 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
# Takes a theme file and parses out the properties
|
||||||
|
# and makes a template file from it.
|
||||||
|
# Use it like so:
|
||||||
|
# theme2template.pl < infile > outfile
|
||||||
|
# by Stephan
|
||||||
|
# $Id$
|
||||||
|
|
||||||
|
$t=localtime;
|
||||||
|
print << "EOF";
|
||||||
|
# template file for making phpGroupWare themes using template2theme.pl
|
||||||
|
|
||||||
|
EOF
|
||||||
|
while( $_ = <STDIN> ) {
|
||||||
|
chomp($_);
|
||||||
|
next unless ( $_ =~ /\$phpgw_info\[\"theme\"\]\[\"(.*)\"\].*=.*\"(.*)\".*/ );
|
||||||
|
print "$1=$2\n";
|
||||||
|
}
|
35
phpgwapi/themes/yellows.theme
Normal file
35
phpgwapi/themes/yellows.theme
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
$phpgw_info["theme"]["bg_color"]= "FBF1C5";
|
||||||
|
$phpgw_info["theme"]["bg_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["vlink"]= "blue";
|
||||||
|
$phpgw_info["theme"]["alink"]= "red";
|
||||||
|
$phpgw_info["theme"]["link"]= "blue";
|
||||||
|
$phpgw_info["theme"]["row_on"]= "F7E58F";
|
||||||
|
$phpgw_info["theme"]["row_off"]= "EAD688";
|
||||||
|
$phpgw_info["theme"]["row_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["th_bg"]= "C8A63B";
|
||||||
|
$phpgw_info["theme"]["th_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["navbar_bg"]= "F7E58F";
|
||||||
|
$phpgw_info["theme"]["navbar_text"]= "000000";
|
||||||
|
$phpgw_info["theme"]["table_bg"]= "EAD688";
|
||||||
|
$phpgw_info["theme"]["table_text"]= "C5AA2B";
|
||||||
|
$phpgw_info["theme"]["font"]= "Arial, Helvetica, san-serif";
|
||||||
|
$phpgw_info["theme"]["bg01"]= "FBF4D3";
|
||||||
|
$phpgw_info["theme"]["bg02"]= "F9EDB3";
|
||||||
|
$phpgw_info["theme"]["bg03"]= "F5E28B";
|
||||||
|
$phpgw_info["theme"]["bg04"]= "F0D866";
|
||||||
|
$phpgw_info["theme"]["bg05"]= "EDCD39";
|
||||||
|
$phpgw_info["theme"]["bg06"]= "D5B211";
|
||||||
|
$phpgw_info["theme"]["bg07"]= "CCAB12";
|
||||||
|
$phpgw_info["theme"]["bg08"]= "C58C13";
|
||||||
|
$phpgw_info["theme"]["bg09"]= "B69910";
|
||||||
|
$phpgw_info["theme"]["bg10"]= "AC9010";
|
||||||
|
|
||||||
|
// Theses are for the calendar only
|
||||||
|
$phpgw_info["theme"]["cal_today"]= "FBF1C5";
|
||||||
|
$phpgw_info["theme"]["cal_dayview"]= "F9E99F";
|
||||||
|
|
||||||
|
// These are for the email only
|
||||||
|
$phpgw_info["theme"]["em_folder"]= "EAD688";
|
||||||
|
$phpgw_info["theme"]["em_folder_text"]= "000000";
|
||||||
|
|
Loading…
Reference in New Issue
Block a user