##// END OF EJS Templates
Merged r3298 to r3302 from trunk....
Jean-Philippe Lang -
r3189:1efb25a4334e
parent child
Show More
@@ -1,70 +1,70
1 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2 2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
3 3 <head>
4 4 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
5 5 <title><%=h html_title %></title>
6 6 <meta name="description" content="<%= Redmine::Info.app_name %>" />
7 7 <meta name="keywords" content="issue,bug,tracker" />
8 8 <%= stylesheet_link_tag 'application', :media => 'all' %>
9 9 <%= javascript_include_tag :defaults %>
10 10 <%= heads_for_wiki_formatter %>
11 11 <!--[if IE]>
12 12 <style type="text/css">
13 13 * html body{ width: expression( document.documentElement.clientWidth < 900 ? '900px' : '100%' ); }
14 14 body {behavior: url(<%= stylesheet_path "csshover.htc" %>);}
15 15 </style>
16 16 <![endif]-->
17 17 <%= call_hook :view_layouts_base_html_head %>
18 18 <!-- page specific tags -->
19 19 <%= yield :header_tags -%>
20 20 </head>
21 21 <body>
22 22 <div id="wrapper">
23 23 <div id="top-menu">
24 24 <div id="account">
25 25 <%= render_menu :account_menu -%>
26 26 </div>
27 27 <%= content_tag('div', "#{l(:label_logged_as)} #{link_to_user(User.current, :format => :username)}", :id => 'loggedas') if User.current.logged? %>
28 28 <%= render_menu :top_menu -%>
29 29 </div>
30 30
31 31 <div id="header">
32 32 <div id="quick-search">
33 33 <% form_tag({:controller => 'search', :action => 'index', :id => @project}, :method => :get ) do %>
34 34 <%= hidden_field_tag(controller.default_search_scope, 1, :id => nil) if controller.default_search_scope %>
35 35 <%= link_to l(:label_search), {:controller => 'search', :action => 'index', :id => @project}, :accesskey => accesskey(:search) %>:
36 36 <%= text_field_tag 'q', @question, :size => 20, :class => 'small', :accesskey => accesskey(:quick_search) %>
37 37 <% end %>
38 38 <%= render_project_jump_box %>
39 39 </div>
40 40
41 41 <h1><%= page_header_title %></h1>
42 42
43 43 <div id="main-menu">
44 44 <%= render_main_menu(@project) %>
45 45 </div>
46 46 </div>
47 47
48 48 <%= tag('div', {:id => 'main', :class => (has_content?(:sidebar) ? '' : 'nosidebar')}, true) %>
49 49 <div id="sidebar">
50 50 <%= yield :sidebar %>
51 51 <%= call_hook :view_layouts_base_sidebar %>
52 52 </div>
53 53
54 54 <div id="content">
55 55 <%= render_flash_messages %>
56 56 <%= yield %>
57 57 <%= call_hook :view_layouts_base_content %>
58 58 <div style="clear:both;"></div>
59 59 </div>
60 60 </div>
61 61
62 62 <div id="ajax-indicator" style="display:none;"><span><%= l(:label_loading) %></span></div>
63 63
64 64 <div id="footer">
65 Powered by <%= link_to Redmine::Info.app_name, Redmine::Info.url %> &copy; 2006-2009 Jean-Philippe Lang
65 Powered by <%= link_to Redmine::Info.app_name, Redmine::Info.url %> &copy; 2006-2010 Jean-Philippe Lang
66 66 </div>
67 67 </div>
68 68 <%= call_hook :view_layouts_base_body_bottom %>
69 69 </body>
70 70 </html>
@@ -1,1064 +1,1071
1 1 == Redmine changelog
2 2
3 3 Redmine - project management software
4 4 Copyright (C) 2006-2010 Jean-Philippe Lang
5 5 http://www.redmine.org/
6 6
7 == 0.9.1
8
9 * Vertical alignment for inline images in formatted text set to 'middle'
10 * Fixed: Redmine.pm error "closing dbh with active statement handles at /usr/lib/perl5/Apache/Redmine.pm"
11 * Fixed: copyright year in footer set to 2010
12
13
7 14 == 2010-01-09 v0.9.0 (Release candidate)
8 15
9 16 * Unlimited subproject nesting
10 17 * Multiple roles per user per project
11 18 * User groups
12 19 * Inheritence of versions
13 20 * OpenID login
14 21 * "Watched by me" issue filter
15 22 * Project copy
16 23 * Project creation by non admin users
17 24 * Accept emails from anyone on a private project
18 25 * Add email notification on Wiki changes
19 26 * Make issue description non-required field
20 27 * Custom fields for Versions
21 28 * Being able to sort the issue list by custom fields
22 29 * Ability to close versions
23 30 * User display/editing of custom fields attached to their user profile
24 31 * Add "follows" issue relation
25 32 * Copy workflows between trackers and roles
26 33 * Defaults enabled modules list for project creation
27 34 * Weighted version completion percentage on the roadmap
28 35 * Autocreate user account when user submits email that creates new issue
29 36 * CSS class on overdue issues on the issue list
30 37 * Enable tracker update on issue edit form
31 38 * Remove issue watchers
32 39 * Ability to move threads between project forums
33 40 * Changed custom field "Possible values" to a textarea
34 41 * Adds projects association on tracker form
35 42 * Set session store to cookie store by default
36 43 * Set a default wiki page on project creation
37 44 * Roadmap for main project should see Roadmaps for sub projects
38 45 * Ticket grouping on the issue list
39 46 * Hierarchical Project links in the page header
40 47 * Allow My Page blocks to be added to from a plugin
41 48 * Sort issues by multiple columns
42 49 * Filters of saved query are now visible and be adjusted without editing the query
43 50 * Saving "sort order" in custom queries
44 51 * Url to fetch changesets for a repository
45 52 * Managers able to create subprojects
46 53 * Issue Totals on My Page Modules
47 54 * Convert Enumerations to single table inheritance (STI)
48 55 * Allow custom my_page blocks to define drop-down names
49 56 * "View Issues" user permission added
50 57 * Ask user what to do with child pages when deleting a parent wiki page
51 58 * Contextual quick search
52 59 * Allow resending of password by email
53 60 * Change reply subject to be a link to the reply itself
54 61 * Include Logged Time as part of the project's Activity history
55 62 * REST API for authentication
56 63 * Browse through Git branches
57 64 * Setup Object Daddy to replace test fixtures
58 65 * Setup shoulda to make it easier to test
59 66 * Custom fields and overrides on Enumerations
60 67 * Add or remove columns from the issue list
61 68 * Ability to add new version from issues screen
62 69 * Setting to choose which day calendars start
63 70 * Asynchronous email delivery method
64 71 * RESTful URLs for (almost) everything
65 72 * Include issue status in search results and activity pages
66 73 * Add email to admin user search filter
67 74 * Proper content type for plain text mails
68 75 * Default value of project jump box
69 76 * Tree based menus
70 77 * Ability to use issue status to update percent done
71 78 * Second set of issue "Action Links" at the bottom of an issue page
72 79 * Proper exist status code for rdm-mailhandler.rb
73 80 * Remove incoming email body via a delimiter
74 81 * Fixed: Custom querry 'Export to PDF' ignores field selection
75 82 * Fixed: Related e-mail notifications aren't threaded
76 83 * Fixed: No warning when the creation of a categories from the issue form fails
77 84 * Fixed: Actually block issues from closing when relation 'blocked by' isn't closed
78 85 * Fixed: Include both first and last name when sorting by users
79 86 * Fixed: Table cell with multiple line text
80 87 * Fixed: Project overview page shows disabled trackers
81 88 * Fixed: Cross project issue relations and user permissions
82 89 * Fixed: My page shows tickets the user doesn't have access to
83 90 * Fixed: TOC does not parse wiki page reference links with description
84 91 * Fixed: Target version-list on bulk edit form is incorrectly sorted
85 92 * Fixed: Cannot modify/delete project named "Documents"
86 93 * Fixed: Email address in brackets breaks html
87 94 * Fixed: Timelog detail loose issue filter passing to report tab
88 95 * Fixed: Inform about custom field's name maximum length
89 96 * Fixed: Activity page and Atom feed links contain project id instead of identifier
90 97 * Fixed: no Atom key for forums with only 1 forum
91 98 * Fixed: When reading RSS feed in MS Outlook, the inline links are broken.
92 99 * Fixed: Sometimes new posts don't show up in the topic list of a forum.
93 100 * Fixed: The all/active filter selection in the project view does not stick.
94 101 * Fixed: Login box has Different width
95 102 * Fixed: User removed from project - still getting project update emails
96 103 * Fixed: Project with the identifier of 'new' cannot be viewed
97 104 * Fixed: Artefacts in search view (Cyrillic)
98 105 * Fixed: Allow [#id] as subject to reply by email
99 106 * Fixed: Wrong language used when closing an issue via a commit message
100 107 * Fixed: email handler drops emails for new issues with no subject
101 108 * Fixed: Calendar misspelled under Roles/Permissions
102 109 * Fixed: Emails from no-reply redmine's address hell cycle
103 110 * Fixed: child_pages macro fails on wiki page history
104 111 * Fixed: Pre-filled time tracking date ignores timezone
105 112 * Fixed: Links on locked users lead to 404 page
106 113 * Fixed: Page changes in issue-list when using context menu
107 114 * Fixed: diff parser removes lines starting with multiple dashes
108 115 * Fixed: Quoting in forums resets message subject
109 116 * Fixed: Editing issue comment removes quote link
110 117 * Fixed: Redmine.pm ignore browse_repository permission
111 118 * Fixed: text formatting breaks on [msg1][msg2]
112 119 * Fixed: Spent Time Default Value of 0.0
113 120 * Fixed: Wiki pages in search results are referenced by project number, not by project identifier.
114 121 * Fixed: When logging in via an autologin cookie the user's last_login_on should be updated
115 122 * Fixed: 50k users cause problems in project->settings->members screen
116 123 * Fixed: Document timestamp needs to show updated timestamps
117 124 * Fixed: Users getting notifications for issues they are no longer allowed to view
118 125 * Fixed: issue summary counts should link to the issue list without subprojects
119 126 * Fixed: 'Delete' link on LDAP list has no effect
120 127
121 128
122 129 == 2009-11-15 v0.8.7
123 130
124 131 * Fixed: Hide paragraph terminator at the end of headings on html export
125 132 * Fixed: pre tags containing "<pre*"
126 133 * Fixed: First date of the date range not included in the time report with SQLite
127 134 * Fixed: Password field not styled correctly on alternative stylesheet
128 135 * Fixed: Error when sumbitting a POST request that requires a login
129 136 * Fixed: CSRF vulnerabilities
130 137
131 138
132 139 == 2009-11-04 v0.8.6
133 140
134 141 * Change links to closed issues to be a grey color
135 142 * Change subversion adapter to not cache authentication and run non interactively
136 143 * Fixed: Custom Values with a nil value cause HTTP error 500
137 144 * Fixed: Failure to convert HTML entities when editing an Issue reply
138 145 * Fixed: Error trying to show repository when there are no comments in a changeset
139 146 * Fixed: account/show/:user_id should not be accessible for other users not in your projects
140 147 * Fixed: XSS vulnerabilities
141 148 * Fixed: IssuesController#destroy should accept POST only
142 149 * Fixed: Inline images in wiki headings
143 150
144 151
145 152 == 2009-09-13 v0.8.5
146 153
147 154 * Incoming mail handler : Allow spaces between keywords and colon
148 155 * Do not require a non-word character after a comma in Redmine links
149 156 * Include issue hyperlinks in reminder emails
150 157 * Prevent nil error when retrieving svn version
151 158 * Various plugin hooks added
152 159 * Add plugins information to script/about
153 160 * Fixed: 500 Internal Server Error is raised if add an empty comment to the news
154 161 * Fixed: Atom links for wiki pages are not correct
155 162 * Fixed: Atom feeds leak email address
156 163 * Fixed: Case sensitivity in Issue filtering
157 164 * Fixed: When reading RSS feed, the inline-embedded images are not properly shown
158 165
159 166
160 167 == 2009-05-17 v0.8.4
161 168
162 169 * Allow textile mailto links
163 170 * Fixed: memory consumption when uploading file
164 171 * Fixed: Mercurial integration doesn't work if Redmine is installed in folder path containing space
165 172 * Fixed: an error is raised when no tab is available on project settings
166 173 * Fixed: insert image macro corrupts urls with excalamation marks
167 174 * Fixed: error on cross-project gantt PNG export
168 175 * Fixed: self and alternate links in atom feeds do not respect Atom specs
169 176 * Fixed: accept any svn tunnel scheme in repository URL
170 177 * Fixed: issues/show should accept user's rss key
171 178 * Fixed: consistency of custom fields display on the issue detail view
172 179 * Fixed: wiki comments length validation is missing
173 180 * Fixed: weak autologin token generation algorithm causes duplicate tokens
174 181
175 182
176 183 == 2009-04-05 v0.8.3
177 184
178 185 * Separate project field and subject in cross-project issue view
179 186 * Ability to set language for redmine:load_default_data task using REDMINE_LANG environment variable
180 187 * Rescue Redmine::DefaultData::DataAlreadyLoaded in redmine:load_default_data task
181 188 * CSS classes to highlight own and assigned issues
182 189 * Hide "New file" link on wiki pages from printing
183 190 * Flush buffer when asking for language in redmine:load_default_data task
184 191 * Minimum project identifier length set to 1
185 192 * Include headers so that emails don't trigger vacation auto-responders
186 193 * Fixed: Time entries csv export links for all projects are malformed
187 194 * Fixed: Files without Version aren't visible in the Activity page
188 195 * Fixed: Commit logs are centered in the repo browser
189 196 * Fixed: News summary field content is not searchable
190 197 * Fixed: Journal#save has a wrong signature
191 198 * Fixed: Email footer signature convention
192 199 * Fixed: Timelog report do not show time for non-versioned issues
193 200
194 201
195 202 == 2009-03-07 v0.8.2
196 203
197 204 * Send an email to the user when an administrator activates a registered user
198 205 * Strip keywords from received email body
199 206 * Footer updated to 2009
200 207 * Show RSS-link even when no issues is found
201 208 * One click filter action in activity view
202 209 * Clickable/linkable line #'s while browsing the repo or viewing a file
203 210 * Links to versions on files list
204 211 * Added request and controller objects to the hooks by default
205 212 * Fixed: exporting an issue with attachments to PDF raises an error
206 213 * Fixed: "too few arguments" error may occur on activerecord error translation
207 214 * Fixed: "Default columns Displayed on the Issues list" setting is not easy to read
208 215 * Fixed: visited links to closed tickets are not striked through with IE6
209 216 * Fixed: MailHandler#plain_text_body returns nil if there was nothing to strip
210 217 * Fixed: MailHandler raises an error when processing an email without From header
211 218
212 219
213 220 == 2009-02-15 v0.8.1
214 221
215 222 * Select watchers on new issue form
216 223 * Issue description is no longer a required field
217 224 * Files module: ability to add files without version
218 225 * Jump to the current tab when using the project quick-jump combo
219 226 * Display a warning if some attachments were not saved
220 227 * Import custom fields values from emails on issue creation
221 228 * Show view/annotate/download links on entry and annotate views
222 229 * Admin Info Screen: Display if plugin assets directory is writable
223 230 * Adds a 'Create and continue' button on the new issue form
224 231 * IMAP: add options to move received emails
225 232 * Do not show Category field when categories are not defined
226 233 * Lower the project identifier limit to a minimum of two characters
227 234 * Add "closed" html class to closed entries in issue list
228 235 * Fixed: broken redirect URL on login failure
229 236 * Fixed: Deleted files are shown when using Darcs
230 237 * Fixed: Darcs adapter works on Win32 only
231 238 * Fixed: syntax highlight doesn't appear in new ticket preview
232 239 * Fixed: email notification for changes I make still occurs when running Repository.fetch_changesets
233 240 * Fixed: no error is raised when entering invalid hours on the issue update form
234 241 * Fixed: Details time log report CSV export doesn't honour date format from settings
235 242 * Fixed: invalid css classes on issue details
236 243 * Fixed: Trac importer creates duplicate custom values
237 244 * Fixed: inline attached image should not match partial filename
238 245
239 246
240 247 == 2008-12-30 v0.8.0
241 248
242 249 * Setting added in order to limit the number of diff lines that should be displayed
243 250 * Makes logged-in username in topbar linking to
244 251 * Mail handler: strip tags when receiving a html-only email
245 252 * Mail handler: add watchers before sending notification
246 253 * Adds a css class (overdue) to overdue issues on issue lists and detail views
247 254 * Fixed: project activity truncated after viewing user's activity
248 255 * Fixed: email address entered for password recovery shouldn't be case-sensitive
249 256 * Fixed: default flag removed when editing a default enumeration
250 257 * Fixed: default category ignored when adding a document
251 258 * Fixed: error on repository user mapping when a repository username is blank
252 259 * Fixed: Firefox cuts off large diffs
253 260 * Fixed: CVS browser should not show dead revisions (deleted files)
254 261 * Fixed: escape double-quotes in image titles
255 262 * Fixed: escape textarea content when editing a issue note
256 263 * Fixed: JS error on context menu with IE
257 264 * Fixed: bold syntax around single character in series doesn't work
258 265 * Fixed several XSS vulnerabilities
259 266 * Fixed a SQL injection vulnerability
260 267
261 268
262 269 == 2008-12-07 v0.8.0-rc1
263 270
264 271 * Wiki page protection
265 272 * Wiki page hierarchy. Parent page can be assigned on the Rename screen
266 273 * Adds support for issue creation via email
267 274 * Adds support for free ticket filtering and custom queries on Gantt chart and calendar
268 275 * Cross-project search
269 276 * Ability to search a project and its subprojects
270 277 * Ability to search the projects the user belongs to
271 278 * Adds custom fields on time entries
272 279 * Adds boolean and list custom fields for time entries as criteria on time report
273 280 * Cross-project time reports
274 281 * Display latest user's activity on account/show view
275 282 * Show last connexion time on user's page
276 283 * Obfuscates email address on user's account page using javascript
277 284 * wiki TOC rendered as an unordered list
278 285 * Adds the ability to search for a user on the administration users list
279 286 * Adds the ability to search for a project name or identifier on the administration projects list
280 287 * Redirect user to the previous page after logging in
281 288 * Adds a permission 'view wiki edits' so that wiki history can be hidden to certain users
282 289 * Adds permissions for viewing the watcher list and adding new watchers on the issue detail view
283 290 * Adds permissions to let users edit and/or delete their messages
284 291 * Link to activity view when displaying dates
285 292 * Hide Redmine version in atom feeds and pdf properties
286 293 * Maps repository users to Redmine users. Users with same username or email are automatically mapped. Mapping can be manually adjusted in repository settings. Multiple usernames can be mapped to the same Redmine user.
287 294 * Sort users by their display names so that user dropdown lists are sorted alphabetically
288 295 * Adds estimated hours to issue filters
289 296 * Switch order of current and previous revisions in side-by-side diff
290 297 * Render the commit changes list as a tree
291 298 * Adds watch/unwatch functionality at forum topic level
292 299 * When moving an issue to another project, reassign it to the category with same name if any
293 300 * Adds child_pages macro for wiki pages
294 301 * Use GET instead of POST on roadmap (#718), gantt and calendar forms
295 302 * Search engine: display total results count and count by result type
296 303 * Email delivery configuration moved to an unversioned YAML file (config/email.yml, see the sample file)
297 304 * Adds icons on search results
298 305 * Adds 'Edit' link on account/show for admin users
299 306 * Adds Lock/Unlock/Activate link on user edit screen
300 307 * Adds user count in status drop down on admin user list
301 308 * Adds multi-levels blockquotes support by using > at the beginning of lines
302 309 * Adds a Reply link to each issue note
303 310 * Adds plain text only option for mail notifications
304 311 * Gravatar support for issue detail, user grid, and activity stream (disabled by default)
305 312 * Adds 'Delete wiki pages attachments' permission
306 313 * Show the most recent file when displaying an inline image
307 314 * Makes permission screens localized
308 315 * AuthSource list: display associated users count and disable 'Delete' buton if any
309 316 * Make the 'duplicates of' relation asymmetric
310 317 * Adds username to the password reminder email
311 318 * Adds links to forum messages using message#id syntax
312 319 * Allow same name for custom fields on different object types
313 320 * One-click bulk edition using the issue list context menu within the same project
314 321 * Adds support for commit logs reencoding to UTF-8 before insertion in the database. Source encoding of commit logs can be selected in Application settings -> Repositories.
315 322 * Adds checkboxes toggle links on permissions report
316 323 * Adds Trac-Like anchors on wiki headings
317 324 * Adds support for wiki links with anchor
318 325 * Adds category to the issue context menu
319 326 * Adds a workflow overview screen
320 327 * Appends the filename to the attachment url so that clients that ignore content-disposition http header get the real filename
321 328 * Dots allowed in custom field name
322 329 * Adds posts quoting functionality
323 330 * Adds an option to generate sequential project identifiers
324 331 * Adds mailto link on the user administration list
325 332 * Ability to remove enumerations (activities, priorities, document categories) that are in use. Associated objects can be reassigned to another value
326 333 * Gantt chart: display issues that don't have a due date if they are assigned to a version with a date
327 334 * Change projects homepage limit to 255 chars
328 335 * Improved on-the-fly account creation. If some attributes are missing (eg. not present in the LDAP) or are invalid, the registration form is displayed so that the user is able to fill or fix these attributes
329 336 * Adds "please select" to activity select box if no activity is set as default
330 337 * Do not silently ignore timelog validation failure on issue edit
331 338 * Adds a rake task to send reminder emails
332 339 * Allow empty cells in wiki tables
333 340 * Makes wiki text formatter pluggable
334 341 * Adds back textile acronyms support
335 342 * Remove pre tag attributes
336 343 * Plugin hooks
337 344 * Pluggable admin menu
338 345 * Plugins can provide activity content
339 346 * Moves plugin list to its own administration menu item
340 347 * Adds url and author_url plugin attributes
341 348 * Adds Plugin#requires_redmine method so that plugin compatibility can be checked against current Redmine version
342 349 * Adds atom feed on time entries details
343 350 * Adds project name to issues feed title
344 351 * Adds a css class on menu items in order to apply item specific styles (eg. icons)
345 352 * Adds a Redmine plugin generators
346 353 * Adds timelog link to the issue context menu
347 354 * Adds links to the user page on various views
348 355 * Turkish translation by Ismail Sezen
349 356 * Catalan translation
350 357 * Vietnamese translation
351 358 * Slovak translation
352 359 * Better naming of activity feed if only one kind of event is displayed
353 360 * Enable syntax highlight on issues, messages and news
354 361 * Add target version to the issue list context menu
355 362 * Hide 'Target version' filter if no version is defined
356 363 * Add filters on cross-project issue list for custom fields marked as 'For all projects'
357 364 * Turn ftp urls into links
358 365 * Hiding the View Differences button when a wiki page's history only has one version
359 366 * Messages on a Board can now be sorted by the number of replies
360 367 * Adds a class ('me') to events of the activity view created by current user
361 368 * Strip pre/code tags content from activity view events
362 369 * Display issue notes in the activity view
363 370 * Adds links to changesets atom feed on repository browser
364 371 * Track project and tracker changes in issue history
365 372 * Adds anchor to atom feed messages links
366 373 * Adds a key in lang files to set the decimal separator (point or comma) in csv exports
367 374 * Makes importer work with Trac 0.8.x
368 375 * Upgraded to Prototype 1.6.0.1
369 376 * File viewer for attached text files
370 377 * Menu mapper: add support for :before, :after and :last options to #push method and add #delete method
371 378 * Removed inconsistent revision numbers on diff view
372 379 * CVS: add support for modules names with spaces
373 380 * Log the user in after registration if account activation is not needed
374 381 * Mercurial adapter improvements
375 382 * Trac importer: read session_attribute table to find user's email and real name
376 383 * Ability to disable unused SCM adapters in application settings
377 384 * Adds Filesystem adapter
378 385 * Clear changesets and changes with raw sql when deleting a repository for performance
379 386 * Redmine.pm now uses the 'commit access' permission defined in Redmine
380 387 * Reposman can create any type of scm (--scm option)
381 388 * Reposman creates a repository if the 'repository' module is enabled at project level only
382 389 * Display svn properties in the browser, svn >= 1.5.0 only
383 390 * Reduces memory usage when importing large git repositories
384 391 * Wider SVG graphs in repository stats
385 392 * SubversionAdapter#entries performance improvement
386 393 * SCM browser: ability to download raw unified diffs
387 394 * More detailed error message in log when scm command fails
388 395 * Adds support for file viewing with Darcs 2.0+
389 396 * Check that git changeset is not in the database before creating it
390 397 * Unified diff viewer for attached files with .patch or .diff extension
391 398 * File size display with Bazaar repositories
392 399 * Git adapter: use commit time instead of author time
393 400 * Prettier url for changesets
394 401 * Makes changes link to entries on the revision view
395 402 * Adds a field on the repository view to browse at specific revision
396 403 * Adds new projects atom feed
397 404 * Added rake tasks to generate rcov code coverage reports
398 405 * Add Redcloth's :block_markdown_rule to allow horizontal rules in wiki
399 406 * Show the project hierarchy in the drop down list for new membership on user administration screen
400 407 * Split user edit screen into tabs
401 408 * Renames bundled RedCloth to RedCloth3 to avoid RedCloth 4 to be loaded instead
402 409 * Fixed: Roadmap crashes when a version has a due date > 2037
403 410 * Fixed: invalid effective date (eg. 99999-01-01) causes an error on version edition screen
404 411 * Fixed: login filter providing incorrect back_url for Redmine installed in sub-directory
405 412 * Fixed: logtime entry duplicated when edited from parent project
406 413 * Fixed: wrong digest for text files under Windows
407 414 * Fixed: associated revisions are displayed in wrong order on issue view
408 415 * Fixed: Git Adapter date parsing ignores timezone
409 416 * Fixed: Printing long roadmap doesn't split across pages
410 417 * Fixes custom fields display order at several places
411 418 * Fixed: urls containing @ are parsed as email adress by the wiki formatter
412 419 * Fixed date filters accuracy with SQLite
413 420 * Fixed: tokens not escaped in highlight_tokens regexp
414 421 * Fixed Bazaar shared repository browsing
415 422 * Fixes platform determination under JRuby
416 423 * Fixed: Estimated time in issue's journal should be rounded to two decimals
417 424 * Fixed: 'search titles only' box ignored after one search is done on titles only
418 425 * Fixed: non-ASCII subversion path can't be displayed
419 426 * Fixed: Inline images don't work if file name has upper case letters or if image is in BMP format
420 427 * Fixed: document listing shows on "my page" when viewing documents is disabled for the role
421 428 * Fixed: Latest news appear on the homepage for projects with the News module disabled
422 429 * Fixed: cross-project issue list should not show issues of projects for which the issue tracking module was disabled
423 430 * Fixed: the default status is lost when reordering issue statuses
424 431 * Fixes error with Postgresql and non-UTF8 commit logs
425 432 * Fixed: textile footnotes no longer work
426 433 * Fixed: http links containing parentheses fail to reder correctly
427 434 * Fixed: GitAdapter#get_rev should use current branch instead of hardwiring master
428 435
429 436
430 437 == 2008-07-06 v0.7.3
431 438
432 439 * Allow dot in firstnames and lastnames
433 440 * Add project name to cross-project Atom feeds
434 441 * Encoding set to utf8 in example database.yml
435 442 * HTML titles on forums related views
436 443 * Fixed: various XSS vulnerabilities
437 444 * Fixed: Entourage (and some old client) fails to correctly render notification styles
438 445 * Fixed: Fixed: timelog redirects inappropriately when :back_url is blank
439 446 * Fixed: wrong relative paths to images in wiki_syntax.html
440 447
441 448
442 449 == 2008-06-15 v0.7.2
443 450
444 451 * "New Project" link on Projects page
445 452 * Links to repository directories on the repo browser
446 453 * Move status to front in Activity View
447 454 * Remove edit step from Status context menu
448 455 * Fixed: No way to do textile horizontal rule
449 456 * Fixed: Repository: View differences doesn't work
450 457 * Fixed: attachement's name maybe invalid.
451 458 * Fixed: Error when creating a new issue
452 459 * Fixed: NoMethodError on @available_filters.has_key?
453 460 * Fixed: Check All / Uncheck All in Email Settings
454 461 * Fixed: "View differences" of one file at /repositories/revision/ fails
455 462 * Fixed: Column width in "my page"
456 463 * Fixed: private subprojects are listed on Issues view
457 464 * Fixed: Textile: bold, italics, underline, etc... not working after parentheses
458 465 * Fixed: Update issue form: comment field from log time end out of screen
459 466 * Fixed: Editing role: "issue can be assigned to this role" out of box
460 467 * Fixed: Unable use angular braces after include word
461 468 * Fixed: Using '*' as keyword for repository referencing keywords doesn't work
462 469 * Fixed: Subversion repository "View differences" on each file rise ERROR
463 470 * Fixed: View differences for individual file of a changeset fails if the repository URL doesn't point to the repository root
464 471 * Fixed: It is possible to lock out the last admin account
465 472 * Fixed: Wikis are viewable for anonymous users on public projects, despite not granting access
466 473 * Fixed: Issue number display clipped on 'my issues'
467 474 * Fixed: Roadmap version list links not carrying state
468 475 * Fixed: Log Time fieldset in IssueController#edit doesn't set default Activity as default
469 476 * Fixed: git's "get_rev" API should use repo's current branch instead of hardwiring "master"
470 477 * Fixed: browser's language subcodes ignored
471 478 * Fixed: Error on project selection with numeric (only) identifier.
472 479 * Fixed: Link to PDF doesn't work after creating new issue
473 480 * Fixed: "Replies" should not be shown on forum threads that are locked
474 481 * Fixed: SVN errors lead to svn username/password being displayed to end users (security issue)
475 482 * Fixed: http links containing hashes don't display correct
476 483 * Fixed: Allow ampersands in Enumeration names
477 484 * Fixed: Atom link on saved query does not include query_id
478 485 * Fixed: Logtime info lost when there's an error updating an issue
479 486 * Fixed: TOC does not parse colorization markups
480 487 * Fixed: CVS: add support for modules names with spaces
481 488 * Fixed: Bad rendering on projects/add
482 489 * Fixed: exception when viewing differences on cvs
483 490 * Fixed: export issue to pdf will messup when use Chinese language
484 491 * Fixed: Redmine::Scm::Adapters::GitAdapter#get_rev ignored GIT_BIN constant
485 492 * Fixed: Adding non-ASCII new issue type in the New Issue page have encoding error using IE
486 493 * Fixed: Importing from trac : some wiki links are messed
487 494 * Fixed: Incorrect weekend definition in Hebrew calendar locale
488 495 * Fixed: Atom feeds don't provide author section for repository revisions
489 496 * Fixed: In Activity views, changesets titles can be multiline while they should not
490 497 * Fixed: Ignore unreadable subversion directories (read disabled using authz)
491 498 * Fixed: lib/SVG/Graph/Graph.rb can't externalize stylesheets
492 499 * Fixed: Close statement handler in Redmine.pm
493 500
494 501
495 502 == 2008-05-04 v0.7.1
496 503
497 504 * Thai translation added (Gampol Thitinilnithi)
498 505 * Translations updates
499 506 * Escape HTML comment tags
500 507 * Prevent "can't convert nil into String" error when :sort_order param is not present
501 508 * Fixed: Updating tickets add a time log with zero hours
502 509 * Fixed: private subprojects names are revealed on the project overview
503 510 * Fixed: Search for target version of "none" fails with postgres 8.3
504 511 * Fixed: Home, Logout, Login links shouldn't be absolute links
505 512 * Fixed: 'Latest projects' box on the welcome screen should be hidden if there are no projects
506 513 * Fixed: error when using upcase language name in coderay
507 514 * Fixed: error on Trac import when :due attribute is nil
508 515
509 516
510 517 == 2008-04-28 v0.7.0
511 518
512 519 * Forces Redmine to use rails 2.0.2 gem when vendor/rails is not present
513 520 * Queries can be marked as 'For all projects'. Such queries will be available on all projects and on the global issue list.
514 521 * Add predefined date ranges to the time report
515 522 * Time report can be done at issue level
516 523 * Various timelog report enhancements
517 524 * Accept the following formats for "hours" field: 1h, 1 h, 1 hour, 2 hours, 30m, 30min, 1h30, 1h30m, 1:30
518 525 * Display the context menu above and/or to the left of the click if needed
519 526 * Make the admin project files list sortable
520 527 * Mercurial: display working directory files sizes unless browsing a specific revision
521 528 * Preserve status filter and page number when using lock/unlock/activate links on the users list
522 529 * Redmine.pm support for LDAP authentication
523 530 * Better error message and AR errors in log for failed LDAP on-the-fly user creation
524 531 * Redirected user to where he is coming from after logging hours
525 532 * Warn user that subprojects are also deleted when deleting a project
526 533 * Include subprojects versions on calendar and gantt
527 534 * Notify project members when a message is posted if they want to receive notifications
528 535 * Fixed: Feed content limit setting has no effect
529 536 * Fixed: Priorities not ordered when displayed as a filter in issue list
530 537 * Fixed: can not display attached images inline in message replies
531 538 * Fixed: Boards are not deleted when project is deleted
532 539 * Fixed: trying to preview a new issue raises an exception with postgresql
533 540 * Fixed: single file 'View difference' links do not work because of duplicate slashes in url
534 541 * Fixed: inline image not displayed when including a wiki page
535 542 * Fixed: CVS duplicate key violation
536 543 * Fixed: ActiveRecord::StaleObjectError exception on closing a set of circular duplicate issues
537 544 * Fixed: custom field filters behaviour
538 545 * Fixed: Postgresql 8.3 compatibility
539 546 * Fixed: Links to repository directories don't work
540 547
541 548
542 549 == 2008-03-29 v0.7.0-rc1
543 550
544 551 * Overall activity view and feed added, link is available on the project list
545 552 * Git VCS support
546 553 * Rails 2.0 sessions cookie store compatibility
547 554 * Use project identifiers in urls instead of ids
548 555 * Default configuration data can now be loaded from the administration screen
549 556 * Administration settings screen split to tabs (email notifications options moved to 'Settings')
550 557 * Project description is now unlimited and optional
551 558 * Wiki annotate view
552 559 * Escape HTML tag in textile content
553 560 * Add Redmine links to documents, versions, attachments and repository files
554 561 * New setting to specify how many objects should be displayed on paginated lists. There are 2 ways to select a set of issues on the issue list:
555 562 * by using checkbox and/or the little pencil that will select/unselect all issues
556 563 * by clicking on the rows (but not on the links), Ctrl and Shift keys can be used to select multiple issues
557 564 * Context menu disabled on links so that the default context menu of the browser is displayed when right-clicking on a link (click anywhere else on the row to display the context menu)
558 565 * User display format is now configurable in administration settings
559 566 * Issue list now supports bulk edit/move/delete (for a set of issues that belong to the same project)
560 567 * Merged 'change status', 'edit issue' and 'add note' actions:
561 568 * Users with 'edit issues' permission can now update any property including custom fields when adding a note or changing the status
562 569 * 'Change issue status' permission removed. To change an issue status, a user just needs to have either 'Edit' or 'Add note' permissions and some workflow transitions allowed
563 570 * Details by assignees on issue summary view
564 571 * 'New issue' link in the main menu (accesskey 7). The drop-down lists to add an issue on the project overview and the issue list are removed
565 572 * Change status select box default to current status
566 573 * Preview for issue notes, news and messages
567 574 * Optional description for attachments
568 575 * 'Fixed version' label changed to 'Target version'
569 576 * Let the user choose when deleting issues with reported hours to:
570 577 * delete the hours
571 578 * assign the hours to the project
572 579 * reassign the hours to another issue
573 580 * Date range filter and pagination on time entries detail view
574 581 * Propagate time tracking to the parent project
575 582 * Switch added on the project activity view to include subprojects
576 583 * Display total estimated and spent hours on the version detail view
577 584 * Weekly time tracking block for 'My page'
578 585 * Permissions to edit time entries
579 586 * Include subprojects on the issue list, calendar, gantt and timelog by default (can be turned off is administration settings)
580 587 * Roadmap enhancements (separate related issues from wiki contents, leading h1 in version wiki pages is hidden, smaller wiki headings)
581 588 * Make versions with same date sorted by name
582 589 * Allow issue list to be sorted by target version
583 590 * Related changesets messages displayed on the issue details view
584 591 * Create a journal and send an email when an issue is closed by commit
585 592 * Add 'Author' to the available columns for the issue list
586 593 * More appropriate default sort order on sortable columns
587 594 * Add issue subject to the time entries view and issue subject, description and tracker to the csv export
588 595 * Permissions to edit issue notes
589 596 * Display date/time instead of date on files list
590 597 * Do not show Roadmap menu item if the project doesn't define any versions
591 598 * Allow longer version names (60 chars)
592 599 * Ability to copy an existing workflow when creating a new role
593 600 * Display custom fields in two columns on the issue form
594 601 * Added 'estimated time' in the csv export of the issue list
595 602 * Display the last 30 days on the activity view rather than the current month (number of days can be configured in the application settings)
596 603 * Setting for whether new projects should be public by default
597 604 * User preference to choose how comments/replies are displayed: in chronological or reverse chronological order
598 605 * Added default value for custom fields
599 606 * Added tabindex property on wiki toolbar buttons (to easily move from field to field using the tab key)
600 607 * Redirect to issue page after creating a new issue
601 608 * Wiki toolbar improvements (mainly for Firefox)
602 609 * Display wiki syntax quick ref link on all wiki textareas
603 610 * Display links to Atom feeds
604 611 * Breadcrumb nav for the forums
605 612 * Show replies when choosing to display messages in the activity
606 613 * Added 'include' macro to include another wiki page
607 614 * RedmineWikiFormatting page available as a static HTML file locally
608 615 * Wrap diff content
609 616 * Strip out email address from authors in repository screens
610 617 * Highlight the current item of the main menu
611 618 * Added simple syntax highlighters for php and java languages
612 619 * Do not show empty diffs
613 620 * Show explicit error message when the scm command failed (eg. when svn binary is not available)
614 621 * Lithuanian translation added (Sergej Jegorov)
615 622 * Ukrainan translation added (Natalia Konovka & Mykhaylo Sorochan)
616 623 * Danish translation added (Mads Vestergaard)
617 624 * Added i18n support to the jstoolbar and various settings screen
618 625 * RedCloth's glyphs no longer user
619 626 * New icons for the wiki toolbar (from http://www.famfamfam.com/lab/icons/silk/)
620 627 * The following menus can now be extended by plugins: top_menu, account_menu, application_menu
621 628 * Added a simple rake task to fetch changesets from the repositories: rake redmine:fetch_changesets
622 629 * Remove hardcoded "Redmine" strings in account related emails and use application title instead
623 630 * Mantis importer preserve bug ids
624 631 * Trac importer: Trac guide wiki pages skipped
625 632 * Trac importer: wiki attachments migration added
626 633 * Trac importer: support database schema for Trac migration
627 634 * Trac importer: support CamelCase links
628 635 * Removes the Redmine version from the footer (can be viewed on admin -> info)
629 636 * Rescue and display an error message when trying to delete a role that is in use
630 637 * Add various 'X-Redmine' headers to email notifications: X-Redmine-Host, X-Redmine-Site, X-Redmine-Project, X-Redmine-Issue-Id, -Author, -Assignee, X-Redmine-Topic-Id
631 638 * Add "--encoding utf8" option to the Mercurial "hg log" command in order to get utf8 encoded commit logs
632 639 * Fixed: Gantt and calendar not properly refreshed (fragment caching removed)
633 640 * Fixed: Textile image with style attribute cause internal server error
634 641 * Fixed: wiki TOC not rendered properly when used in an issue or document description
635 642 * Fixed: 'has already been taken' error message on username and email fields if left empty
636 643 * Fixed: non-ascii attachement filename with IE
637 644 * Fixed: wrong url for wiki syntax pop-up when Redmine urls are prefixed
638 645 * Fixed: search for all words doesn't work
639 646 * Fixed: Do not show sticky and locked checkboxes when replying to a message
640 647 * Fixed: Mantis importer: do not duplicate Mantis username in firstname and lastname if realname is blank
641 648 * Fixed: Date custom fields not displayed as specified in application settings
642 649 * Fixed: titles not escaped in the activity view
643 650 * Fixed: issue queries can not use custom fields marked as 'for all projects' in a project context
644 651 * Fixed: on calendar, gantt and in the tracker filter on the issue list, only active trackers of the project (and its sub projects) should be available
645 652 * Fixed: locked users should not receive email notifications
646 653 * Fixed: custom field selection is not saved when unchecking them all on project settings
647 654 * Fixed: can not lock a topic when creating it
648 655 * Fixed: Incorrect filtering for unset values when using 'is not' filter
649 656 * Fixed: PostgreSQL issues_seq_id not updated when using Trac importer
650 657 * Fixed: ajax pagination does not scroll up
651 658 * Fixed: error when uploading a file with no content-type specified by the browser
652 659 * Fixed: wiki and changeset links not displayed when previewing issue description or notes
653 660 * Fixed: 'LdapError: no bind result' error when authenticating
654 661 * Fixed: 'LdapError: invalid binding information' when no username/password are set on the LDAP account
655 662 * Fixed: CVS repository doesn't work if port is used in the url
656 663 * Fixed: Email notifications: host name is missing in generated links
657 664 * Fixed: Email notifications: referenced changesets, wiki pages, attachments... are not turned into links
658 665 * Fixed: Do not clear issue relations when moving an issue to another project if cross-project issue relations are allowed
659 666 * Fixed: "undefined method 'textilizable'" error on email notification when running Repository#fetch_changesets from the console
660 667 * Fixed: Do not send an email with no recipient, cc or bcc
661 668 * Fixed: fetch_changesets fails on commit comments that close 2 duplicates issues.
662 669 * Fixed: Mercurial browsing under unix-like os and for directory depth > 2
663 670 * Fixed: Wiki links with pipe can not be used in wiki tables
664 671 * Fixed: migrate_from_trac doesn't import timestamps of wiki and tickets
665 672 * Fixed: when bulk editing, setting "Assigned to" to "nobody" causes an sql error with Postgresql
666 673
667 674
668 675 == 2008-03-12 v0.6.4
669 676
670 677 * Fixed: private projects name are displayed on account/show even if the current user doesn't have access to these private projects
671 678 * Fixed: potential LDAP authentication security flaw
672 679 * Fixed: context submenus on the issue list don't show up with IE6.
673 680 * Fixed: Themes are not applied with Rails 2.0
674 681 * Fixed: crash when fetching Mercurial changesets if changeset[:files] is nil
675 682 * Fixed: Mercurial repository browsing
676 683 * Fixed: undefined local variable or method 'log' in CvsAdapter when a cvs command fails
677 684 * Fixed: not null constraints not removed with Postgresql
678 685 * Doctype set to transitional
679 686
680 687
681 688 == 2007-12-18 v0.6.3
682 689
683 690 * Fixed: upload doesn't work in 'Files' section
684 691
685 692
686 693 == 2007-12-16 v0.6.2
687 694
688 695 * Search engine: issue custom fields can now be searched
689 696 * News comments are now textilized
690 697 * Updated Japanese translation (Satoru Kurashiki)
691 698 * Updated Chinese translation (Shortie Lo)
692 699 * Fixed Rails 2.0 compatibility bugs:
693 700 * Unable to create a wiki
694 701 * Gantt and calendar error
695 702 * Trac importer error (readonly? is defined by ActiveRecord)
696 703 * Fixed: 'assigned to me' filter broken
697 704 * Fixed: crash when validation fails on issue edition with no custom fields
698 705 * Fixed: reposman "can't find group" error
699 706 * Fixed: 'LDAP account password is too long' error when leaving the field empty on creation
700 707 * Fixed: empty lines when displaying repository files with Windows style eol
701 708 * Fixed: missing body closing tag in repository annotate and entry views
702 709
703 710
704 711 == 2007-12-10 v0.6.1
705 712
706 713 * Rails 2.0 compatibility
707 714 * Custom fields can now be displayed as columns on the issue list
708 715 * Added version details view (accessible from the roadmap)
709 716 * Roadmap: more accurate completion percentage calculation (done ratio of open issues is now taken into account)
710 717 * Added per-project tracker selection. Trackers can be selected on project settings
711 718 * Anonymous users can now be allowed to create, edit, comment issues, comment news and post messages in the forums
712 719 * Forums: messages can now be edited/deleted (explicit permissions need to be given)
713 720 * Forums: topics can be locked so that no reply can be added
714 721 * Forums: topics can be marked as sticky so that they always appear at the top of the list
715 722 * Forums: attachments can now be added to replies
716 723 * Added time zone support
717 724 * Added a setting to choose the account activation strategy (available in application settings)
718 725 * Added 'Classic' theme (inspired from the v0.51 design)
719 726 * Added an alternate theme which provides issue list colorization based on issues priority
720 727 * Added Bazaar SCM adapter
721 728 * Added Annotate/Blame view in the repository browser (except for Darcs SCM)
722 729 * Diff style (inline or side by side) automatically saved as a user preference
723 730 * Added issues status changes on the activity view (by Cyril Mougel)
724 731 * Added forums topics on the activity view (disabled by default)
725 732 * Added an option on 'My account' for users who don't want to be notified of changes that they make
726 733 * Trac importer now supports mysql and postgresql databases
727 734 * Trac importer improvements (by Mat Trudel)
728 735 * 'fixed version' field can now be displayed on the issue list
729 736 * Added a couple of new formats for the 'date format' setting
730 737 * Added Traditional Chinese translation (by Shortie Lo)
731 738 * Added Russian translation (iGor kMeta)
732 739 * Project name format limitation removed (name can now contain any character)
733 740 * Project identifier maximum length changed from 12 to 20
734 741 * Changed the maximum length of LDAP account to 255 characters
735 742 * Removed the 12 characters limit on passwords
736 743 * Added wiki macros support
737 744 * Performance improvement on workflow setup screen
738 745 * More detailed html title on several views
739 746 * Custom fields can now be reordered
740 747 * Search engine: search can be restricted to an exact phrase by using quotation marks
741 748 * Added custom fields marked as 'For all projects' to the csv export of the cross project issue list
742 749 * Email notifications are now sent as Blind carbon copy by default
743 750 * Fixed: all members (including non active) should be deleted when deleting a project
744 751 * Fixed: Error on wiki syntax link (accessible from wiki/edit)
745 752 * Fixed: 'quick jump to a revision' form on the revisions list
746 753 * Fixed: error on admin/info if there's more than 1 plugin installed
747 754 * Fixed: svn or ldap password can be found in clear text in the html source in editing mode
748 755 * Fixed: 'Assigned to' drop down list is not sorted
749 756 * Fixed: 'View all issues' link doesn't work on issues/show
750 757 * Fixed: error on account/register when validation fails
751 758 * Fixed: Error when displaying the issue list if a float custom field is marked as 'used as filter'
752 759 * Fixed: Mercurial adapter breaks on missing :files entry in changeset hash (James Britt)
753 760 * Fixed: Wrong feed URLs on the home page
754 761 * Fixed: Update of time entry fails when the issue has been moved to an other project
755 762 * Fixed: Error when moving an issue without changing its tracker (Postgresql)
756 763 * Fixed: Changes not recorded when using :pserver string (CVS adapter)
757 764 * Fixed: admin should be able to move issues to any project
758 765 * Fixed: adding an attachment is not possible when changing the status of an issue
759 766 * Fixed: No mime-types in documents/files downloading
760 767 * Fixed: error when sorting the messages if there's only one board for the project
761 768 * Fixed: 'me' doesn't appear in the drop down filters on a project issue list.
762 769
763 770 == 2007-11-04 v0.6.0
764 771
765 772 * Permission model refactoring.
766 773 * Permissions: there are now 2 builtin roles that can be used to specify permissions given to other users than members of projects
767 774 * Permissions: some permissions (eg. browse the repository) can be removed for certain roles
768 775 * Permissions: modules (eg. issue tracking, news, documents...) can be enabled/disabled at project level
769 776 * Added Mantis and Trac importers
770 777 * New application layout
771 778 * Added "Bulk edit" functionality on the issue list
772 779 * More flexible mail notifications settings at user level
773 780 * Added AJAX based context menu on the project issue list that provide shortcuts for editing, re-assigning, changing the status or the priority, moving or deleting an issue
774 781 * Added the hability to copy an issue. It can be done from the "issue/show" view or from the context menu on the issue list
775 782 * Added the ability to customize issue list columns (at application level or for each saved query)
776 783 * Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap
777 784 * Added the ability to rename wiki pages (specific permission required)
778 785 * Search engines now supports pagination. Results are sorted in reverse chronological order
779 786 * Added "Estimated hours" attribute on issues
780 787 * A category with assigned issue can now be deleted. 2 options are proposed: remove assignments or reassign issues to another category
781 788 * Forum notifications are now also sent to the authors of the thread, even if they donοΏ½t watch the board
782 789 * Added an application setting to specify the application protocol (http or https) used to generate urls in emails
783 790 * Gantt chart: now starts at the current month by default
784 791 * Gantt chart: month count and zoom factor are automatically saved as user preferences
785 792 * Wiki links can now refer to other project wikis
786 793 * Added wiki index by date
787 794 * Added preview on add/edit issue form
788 795 * Emails footer can now be customized from the admin interface (Admin -> Email notifications)
789 796 * Default encodings for repository files can now be set in application settings (used to convert files content and diff to UTF-8 so that theyοΏ½re properly displayed)
790 797 * Calendar: first day of week can now be set in lang files
791 798 * Automatic closing of duplicate issues
792 799 * Added a cross-project issue list
793 800 * AJAXified the SCM browser (tree view)
794 801 * Pretty URL for the repository browser (Cyril Mougel)
795 802 * Search engine: added a checkbox to search titles only
796 803 * Added "% done" in the filter list
797 804 * Enumerations: values can now be reordered and a default value can be specified (eg. default issue priority)
798 805 * Added some accesskeys
799 806 * Added "Float" as a custom field format
800 807 * Added basic Theme support
801 808 * Added the ability to set the οΏ½done ratioοΏ½ of issues fixed by commit (Nikolay Solakov)
802 809 * Added custom fields in issue related mail notifications
803 810 * Email notifications are now sent in plain text and html
804 811 * Gantt chart can now be exported to a graphic file (png). This functionality is only available if RMagick is installed.
805 812 * Added syntax highlightment for repository files and wiki
806 813 * Improved automatic Redmine links
807 814 * Added automatic table of content support on wiki pages
808 815 * Added radio buttons on the documents list to sort documents by category, date, title or author
809 816 * Added basic plugin support, with a sample plugin
810 817 * Added a link to add a new category when creating or editing an issue
811 818 * Added a "Assignable" boolean on the Role model. If unchecked, issues can not be assigned to users having this role.
812 819 * Added an option to be able to relate issues in different projects
813 820 * Added the ability to move issues (to another project) without changing their trackers.
814 821 * Atom feeds added on project activity, news and changesets
815 822 * Added the ability to reset its own RSS access key
816 823 * Main project list now displays root projects with their subprojects
817 824 * Added anchor links to issue notes
818 825 * Added reposman Ruby version. This script can now register created repositories in Redmine (Nicolas Chuche)
819 826 * Issue notes are now included in search
820 827 * Added email sending test functionality
821 828 * Added LDAPS support for LDAP authentication
822 829 * Removed hard-coded URLs in mail templates
823 830 * Subprojects are now grouped by projects in the navigation drop-down menu
824 831 * Added a new value for date filters: this week
825 832 * Added cache for application settings
826 833 * Added Polish translation (Tomasz Gawryl)
827 834 * Added Czech translation (Jan Kadlecek)
828 835 * Added Romanian translation (Csongor Bartus)
829 836 * Added Hebrew translation (Bob Builder)
830 837 * Added Serbian translation (Dragan Matic)
831 838 * Added Korean translation (Choi Jong Yoon)
832 839 * Fixed: the link to delete issue relations is displayed even if the user is not authorized to delete relations
833 840 * Performance improvement on calendar and gantt
834 841 * Fixed: wiki preview doesnοΏ½t work on long entries
835 842 * Fixed: queries with multiple custom fields return no result
836 843 * Fixed: Can not authenticate user against LDAP if its DN contains non-ascii characters
837 844 * Fixed: URL with ~ broken in wiki formatting
838 845 * Fixed: some quotation marks are rendered as strange characters in pdf
839 846
840 847
841 848 == 2007-07-15 v0.5.1
842 849
843 850 * per project forums added
844 851 * added the ability to archive projects
845 852 * added οΏ½WatchοΏ½ functionality on issues. It allows users to receive notifications about issue changes
846 853 * custom fields for issues can now be used as filters on issue list
847 854 * added per user custom queries
848 855 * commit messages are now scanned for referenced or fixed issue IDs (keywords defined in Admin -> Settings)
849 856 * projects list now shows the list of public projects and private projects for which the user is a member
850 857 * versions can now be created with no date
851 858 * added issue count details for versions on Reports view
852 859 * added time report, by member/activity/tracker/version and year/month/week for the selected period
853 860 * each category can now be associated to a user, so that new issues in that category are automatically assigned to that user
854 861 * added autologin feature (disabled by default)
855 862 * optimistic locking added for wiki edits
856 863 * added wiki diff
857 864 * added the ability to destroy wiki pages (requires permission)
858 865 * a wiki page can now be attached to each version, and displayed on the roadmap
859 866 * attachments can now be added to wiki pages (original patch by Pavol Murin) and displayed online
860 867 * added an option to see all versions in the roadmap view (including completed ones)
861 868 * added basic issue relations
862 869 * added the ability to log time when changing an issue status
863 870 * account information can now be sent to the user when creating an account
864 871 * author and assignee of an issue always receive notifications (even if they turned of mail notifications)
865 872 * added a quick search form in page header
866 873 * added 'me' value for 'assigned to' and 'author' query filters
867 874 * added a link on revision screen to see the entire diff for the revision
868 875 * added last commit message for each entry in repository browser
869 876 * added the ability to view a file diff with free to/from revision selection.
870 877 * text files can now be viewed online when browsing the repository
871 878 * added basic support for other SCM: CVS (Ralph Vater), Mercurial and Darcs
872 879 * added fragment caching for svn diffs
873 880 * added fragment caching for calendar and gantt views
874 881 * login field automatically focused on login form
875 882 * subproject name displayed on issue list, calendar and gantt
876 883 * added an option to choose the date format: language based or ISO 8601
877 884 * added a simple mail handler. It lets users add notes to an existing issue by replying to the initial notification email.
878 885 * a 403 error page is now displayed (instead of a blank page) when trying to access a protected page
879 886 * added portuguese translation (Joao Carlos Clementoni)
880 887 * added partial online help japanese translation (Ken Date)
881 888 * added bulgarian translation (Nikolay Solakov)
882 889 * added dutch translation (Linda van den Brink)
883 890 * added swedish translation (Thomas Habets)
884 891 * italian translation update (Alessio Spadaro)
885 892 * japanese translation update (Satoru Kurashiki)
886 893 * fixed: error on history atom feed when thereοΏ½s no notes on an issue change
887 894 * fixed: error in journalizing an issue with longtext custom fields (Postgresql)
888 895 * fixed: creation of Oracle schema
889 896 * fixed: last day of the month not included in project activity
890 897 * fixed: files with an apostrophe in their names can't be accessed in SVN repository
891 898 * fixed: performance issue on RepositoriesController#revisions when a changeset has a great number of changes (eg. 100,000)
892 899 * fixed: open/closed issue counts are always 0 on reports view (postgresql)
893 900 * fixed: date query filters (wrong results and sql error with postgresql)
894 901 * fixed: confidentiality issue on account/show (private project names displayed to anyone)
895 902 * fixed: Long text custom fields displayed without line breaks
896 903 * fixed: Error when editing the wokflow after deleting a status
897 904 * fixed: SVN commit dates are now stored as local time
898 905
899 906
900 907 == 2007-04-11 v0.5.0
901 908
902 909 * added per project Wiki
903 910 * added rss/atom feeds at project level (custom queries can be used as feeds)
904 911 * added search engine (search in issues, news, commits, wiki pages, documents)
905 912 * simple time tracking functionality added
906 913 * added version due dates on calendar and gantt
907 914 * added subprojects issue count on project Reports page
908 915 * added the ability to copy an existing workflow when creating a new tracker
909 916 * added the ability to include subprojects on calendar and gantt
910 917 * added the ability to select trackers to display on calendar and gantt (Jeffrey Jones)
911 918 * added side by side svn diff view (Cyril Mougel)
912 919 * added back subproject filter on issue list
913 920 * added permissions report in admin area
914 921 * added a status filter on users list
915 922 * support for password-protected SVN repositories
916 923 * SVN commits are now stored in the database
917 924 * added simple svn statistics SVG graphs
918 925 * progress bars for roadmap versions (Nick Read)
919 926 * issue history now shows file uploads and deletions
920 927 * #id patterns are turned into links to issues in descriptions and commit messages
921 928 * japanese translation added (Satoru Kurashiki)
922 929 * chinese simplified translation added (Andy Wu)
923 930 * italian translation added (Alessio Spadaro)
924 931 * added scripts to manage SVN repositories creation and user access control using ssh+svn (Nicolas Chuche)
925 932 * better calendar rendering time
926 933 * fixed migration scripts to work with mysql 5 running in strict mode
927 934 * fixed: error when clicking "add" with no block selected on my/page_layout
928 935 * fixed: hard coded links in navigation bar
929 936 * fixed: table_name pre/suffix support
930 937
931 938
932 939 == 2007-02-18 v0.4.2
933 940
934 941 * Rails 1.2 is now required
935 942 * settings are now stored in the database and editable through the application in: Admin -> Settings (config_custom.rb is no longer used)
936 943 * added project roadmap view
937 944 * mail notifications added when a document, a file or an attachment is added
938 945 * tooltips added on Gantt chart and calender to view the details of the issues
939 946 * ability to set the sort order for roles, trackers, issue statuses
940 947 * added missing fields to csv export: priority, start date, due date, done ratio
941 948 * added total number of issues per tracker on project overview
942 949 * all icons replaced (new icons are based on GPL icon set: "KDE Crystal Diamond 2.5" -by paolino- and "kNeu! Alpha v0.1" -by Pablo Fabregat-)
943 950 * added back "fixed version" field on issue screen and in filters
944 951 * project settings screen split in 4 tabs
945 952 * custom fields screen split in 3 tabs (one for each kind of custom field)
946 953 * multiple issues pdf export now rendered as a table
947 954 * added a button on users/list to manually activate an account
948 955 * added a setting option to disable "password lost" functionality
949 956 * added a setting option to set max number of issues in csv/pdf exports
950 957 * fixed: subprojects count is always 0 on projects list
951 958 * fixed: locked users are proposed when adding a member to a project
952 959 * fixed: setting an issue status as default status leads to an sql error with SQLite
953 960 * fixed: unable to delete an issue status even if it's not used yet
954 961 * fixed: filters ignored when exporting a predefined query to csv/pdf
955 962 * fixed: crash when french "issue_edit" email notification is sent
956 963 * fixed: hide mail preference not saved (my/account)
957 964 * fixed: crash when a new user try to edit its "my page" layout
958 965
959 966
960 967 == 2007-01-03 v0.4.1
961 968
962 969 * fixed: emails have no recipient when one of the project members has notifications disabled
963 970
964 971
965 972 == 2007-01-02 v0.4.0
966 973
967 974 * simple SVN browser added (just needs svn binaries in PATH)
968 975 * comments can now be added on news
969 976 * "my page" is now customizable
970 977 * more powerfull and savable filters for issues lists
971 978 * improved issues change history
972 979 * new functionality: move an issue to another project or tracker
973 980 * new functionality: add a note to an issue
974 981 * new report: project activity
975 982 * "start date" and "% done" fields added on issues
976 983 * project calendar added
977 984 * gantt chart added (exportable to pdf)
978 985 * single/multiple issues pdf export added
979 986 * issues reports improvements
980 987 * multiple file upload for issues, documents and files
981 988 * option to set maximum size of uploaded files
982 989 * textile formating of issue and news descritions (RedCloth required)
983 990 * integration of DotClear jstoolbar for textile formatting
984 991 * calendar date picker for date fields (LGPL DHTML Calendar http://sourceforge.net/projects/jscalendar)
985 992 * new filter in issues list: Author
986 993 * ajaxified paginators
987 994 * news rss feed added
988 995 * option to set number of results per page on issues list
989 996 * localized csv separator (comma/semicolon)
990 997 * csv output encoded to ISO-8859-1
991 998 * user custom field displayed on account/show
992 999 * default configuration improved (default roles, trackers, status, permissions and workflows)
993 1000 * language for default configuration data can now be chosen when running 'load_default_data' task
994 1001 * javascript added on custom field form to show/hide fields according to the format of custom field
995 1002 * fixed: custom fields not in csv exports
996 1003 * fixed: project settings now displayed according to user's permissions
997 1004 * fixed: application error when no version is selected on projects/add_file
998 1005 * fixed: public actions not authorized for members of non public projects
999 1006 * fixed: non public projects were shown on welcome screen even if current user is not a member
1000 1007
1001 1008
1002 1009 == 2006-10-08 v0.3.0
1003 1010
1004 1011 * user authentication against multiple LDAP (optional)
1005 1012 * token based "lost password" functionality
1006 1013 * user self-registration functionality (optional)
1007 1014 * custom fields now available for issues, users and projects
1008 1015 * new custom field format "text" (displayed as a textarea field)
1009 1016 * project & administration drop down menus in navigation bar for quicker access
1010 1017 * text formatting is preserved for long text fields (issues, projects and news descriptions)
1011 1018 * urls and emails are turned into clickable links in long text fields
1012 1019 * "due date" field added on issues
1013 1020 * tracker selection filter added on change log
1014 1021 * Localization plugin replaced with GLoc 1.1.0 (iconv required)
1015 1022 * error messages internationalization
1016 1023 * german translation added (thanks to Karim Trott)
1017 1024 * data locking for issues to prevent update conflicts (using ActiveRecord builtin optimistic locking)
1018 1025 * new filter in issues list: "Fixed version"
1019 1026 * active filters are displayed with colored background on issues list
1020 1027 * custom configuration is now defined in config/config_custom.rb
1021 1028 * user object no more stored in session (only user_id)
1022 1029 * news summary field is no longer required
1023 1030 * tables and forms redesign
1024 1031 * Fixed: boolean custom field not working
1025 1032 * Fixed: error messages for custom fields are not displayed
1026 1033 * Fixed: invalid custom fields should have a red border
1027 1034 * Fixed: custom fields values are not validated on issue update
1028 1035 * Fixed: unable to choose an empty value for 'List' custom fields
1029 1036 * Fixed: no issue categories sorting
1030 1037 * Fixed: incorrect versions sorting
1031 1038
1032 1039
1033 1040 == 2006-07-12 - v0.2.2
1034 1041
1035 1042 * Fixed: bug in "issues list"
1036 1043
1037 1044
1038 1045 == 2006-07-09 - v0.2.1
1039 1046
1040 1047 * new databases supported: Oracle, PostgreSQL, SQL Server
1041 1048 * projects/subprojects hierarchy (1 level of subprojects only)
1042 1049 * environment information display in admin/info
1043 1050 * more filter options in issues list (rev6)
1044 1051 * default language based on browser settings (Accept-Language HTTP header)
1045 1052 * issues list exportable to CSV (rev6)
1046 1053 * simple_format and auto_link on long text fields
1047 1054 * more data validations
1048 1055 * Fixed: error when all mail notifications are unchecked in admin/mail_options
1049 1056 * Fixed: all project news are displayed on project summary
1050 1057 * Fixed: Can't change user password in users/edit
1051 1058 * Fixed: Error on tables creation with PostgreSQL (rev5)
1052 1059 * Fixed: SQL error in "issue reports" view with PostgreSQL (rev5)
1053 1060
1054 1061
1055 1062 == 2006-06-25 - v0.1.0
1056 1063
1057 1064 * multiple users/multiple projects
1058 1065 * role based access control
1059 1066 * issue tracking system
1060 1067 * fully customizable workflow
1061 1068 * documents/files repository
1062 1069 * email notifications on issue creation and update
1063 1070 * multilanguage support (except for error messages):english, french, spanish
1064 1071 * online manual in french (unfinished)
@@ -1,350 +1,355
1 1 package Apache::Authn::Redmine;
2 2
3 3 =head1 Apache::Authn::Redmine
4 4
5 5 Redmine - a mod_perl module to authenticate webdav subversion users
6 6 against redmine database
7 7
8 8 =head1 SYNOPSIS
9 9
10 10 This module allow anonymous users to browse public project and
11 11 registred users to browse and commit their project. Authentication is
12 12 done against the redmine database or the LDAP configured in redmine.
13 13
14 14 This method is far simpler than the one with pam_* and works with all
15 15 database without an hassle but you need to have apache/mod_perl on the
16 16 svn server.
17 17
18 18 =head1 INSTALLATION
19 19
20 20 For this to automagically work, you need to have a recent reposman.rb
21 21 (after r860) and if you already use reposman, read the last section to
22 22 migrate.
23 23
24 24 Sorry ruby users but you need some perl modules, at least mod_perl2,
25 25 DBI and DBD::mysql (or the DBD driver for you database as it should
26 26 work on allmost all databases).
27 27
28 28 On debian/ubuntu you must do :
29 29
30 30 aptitude install libapache-dbi-perl libapache2-mod-perl2 libdbd-mysql-perl
31 31
32 32 If your Redmine users use LDAP authentication, you will also need
33 33 Authen::Simple::LDAP (and IO::Socket::SSL if LDAPS is used):
34 34
35 35 aptitude install libauthen-simple-ldap-perl libio-socket-ssl-perl
36 36
37 37 =head1 CONFIGURATION
38 38
39 39 ## This module has to be in your perl path
40 40 ## eg: /usr/lib/perl5/Apache/Authn/Redmine.pm
41 41 PerlLoadModule Apache::Authn::Redmine
42 42 <Location /svn>
43 43 DAV svn
44 44 SVNParentPath "/var/svn"
45 45
46 46 AuthType Basic
47 47 AuthName redmine
48 48 Require valid-user
49 49
50 50 PerlAccessHandler Apache::Authn::Redmine::access_handler
51 51 PerlAuthenHandler Apache::Authn::Redmine::authen_handler
52 52
53 53 ## for mysql
54 54 RedmineDSN "DBI:mysql:database=databasename;host=my.db.server"
55 55 ## for postgres
56 56 # RedmineDSN "DBI:Pg:dbname=databasename;host=my.db.server"
57 57
58 58 RedmineDbUser "redmine"
59 59 RedmineDbPass "password"
60 60 ## Optional where clause (fulltext search would be slow and
61 61 ## database dependant).
62 62 # RedmineDbWhereClause "and members.role_id IN (1,2)"
63 63 ## Optional credentials cache size
64 64 # RedmineCacheCredsMax 50
65 65 </Location>
66 66
67 67 To be able to browse repository inside redmine, you must add something
68 68 like that :
69 69
70 70 <Location /svn-private>
71 71 DAV svn
72 72 SVNParentPath "/var/svn"
73 73 Order deny,allow
74 74 Deny from all
75 75 # only allow reading orders
76 76 <Limit GET PROPFIND OPTIONS REPORT>
77 77 Allow from redmine.server.ip
78 78 </Limit>
79 79 </Location>
80 80
81 81 and you will have to use this reposman.rb command line to create repository :
82 82
83 83 reposman.rb --redmine my.redmine.server --svn-dir /var/svn --owner www-data -u http://svn.server/svn-private/
84 84
85 85 =head1 MIGRATION FROM OLDER RELEASES
86 86
87 87 If you use an older reposman.rb (r860 or before), you need to change
88 88 rights on repositories to allow the apache user to read and write
89 89 S<them :>
90 90
91 91 sudo chown -R www-data /var/svn/*
92 92 sudo chmod -R u+w /var/svn/*
93 93
94 94 And you need to upgrade at least reposman.rb (after r860).
95 95
96 96 =cut
97 97
98 98 use strict;
99 99 use warnings FATAL => 'all', NONFATAL => 'redefine';
100 100
101 101 use DBI;
102 102 use Digest::SHA1;
103 103 # optional module for LDAP authentication
104 104 my $CanUseLDAPAuth = eval("use Authen::Simple::LDAP; 1");
105 105
106 106 use Apache2::Module;
107 107 use Apache2::Access;
108 108 use Apache2::ServerRec qw();
109 109 use Apache2::RequestRec qw();
110 110 use Apache2::RequestUtil qw();
111 111 use Apache2::Const qw(:common :override :cmd_how);
112 112 use APR::Pool ();
113 113 use APR::Table ();
114 114
115 115 # use Apache2::Directive qw();
116 116
117 117 my @directives = (
118 118 {
119 119 name => 'RedmineDSN',
120 120 req_override => OR_AUTHCFG,
121 121 args_how => TAKE1,
122 122 errmsg => 'Dsn in format used by Perl DBI. eg: "DBI:Pg:dbname=databasename;host=my.db.server"',
123 123 },
124 124 {
125 125 name => 'RedmineDbUser',
126 126 req_override => OR_AUTHCFG,
127 127 args_how => TAKE1,
128 128 },
129 129 {
130 130 name => 'RedmineDbPass',
131 131 req_override => OR_AUTHCFG,
132 132 args_how => TAKE1,
133 133 },
134 134 {
135 135 name => 'RedmineDbWhereClause',
136 136 req_override => OR_AUTHCFG,
137 137 args_how => TAKE1,
138 138 },
139 139 {
140 140 name => 'RedmineCacheCredsMax',
141 141 req_override => OR_AUTHCFG,
142 142 args_how => TAKE1,
143 143 errmsg => 'RedmineCacheCredsMax must be decimal number',
144 144 },
145 145 );
146 146
147 147 sub RedmineDSN {
148 148 my ($self, $parms, $arg) = @_;
149 149 $self->{RedmineDSN} = $arg;
150 150 my $query = "SELECT
151 151 hashed_password, auth_source_id, permissions
152 152 FROM members, projects, users, roles, member_roles
153 153 WHERE
154 154 projects.id=members.project_id
155 155 AND member_roles.member_id=members.id
156 156 AND users.id=members.user_id
157 157 AND roles.id=member_roles.role_id
158 158 AND users.status=1
159 159 AND login=?
160 160 AND identifier=? ";
161 161 $self->{RedmineQuery} = trim($query);
162 162 }
163 163
164 164 sub RedmineDbUser { set_val('RedmineDbUser', @_); }
165 165 sub RedmineDbPass { set_val('RedmineDbPass', @_); }
166 166 sub RedmineDbWhereClause {
167 167 my ($self, $parms, $arg) = @_;
168 168 $self->{RedmineQuery} = trim($self->{RedmineQuery}.($arg ? $arg : "")." ");
169 169 }
170 170
171 171 sub RedmineCacheCredsMax {
172 172 my ($self, $parms, $arg) = @_;
173 173 if ($arg) {
174 174 $self->{RedmineCachePool} = APR::Pool->new;
175 175 $self->{RedmineCacheCreds} = APR::Table::make($self->{RedmineCachePool}, $arg);
176 176 $self->{RedmineCacheCredsCount} = 0;
177 177 $self->{RedmineCacheCredsMax} = $arg;
178 178 }
179 179 }
180 180
181 181 sub trim {
182 182 my $string = shift;
183 183 $string =~ s/\s{2,}/ /g;
184 184 return $string;
185 185 }
186 186
187 187 sub set_val {
188 188 my ($key, $self, $parms, $arg) = @_;
189 189 $self->{$key} = $arg;
190 190 }
191 191
192 192 Apache2::Module::add(__PACKAGE__, \@directives);
193 193
194 194
195 195 my %read_only_methods = map { $_ => 1 } qw/GET PROPFIND REPORT OPTIONS/;
196 196
197 197 sub access_handler {
198 198 my $r = shift;
199 199
200 200 unless ($r->some_auth_required) {
201 201 $r->log_reason("No authentication has been configured");
202 202 return FORBIDDEN;
203 203 }
204 204
205 205 my $method = $r->method;
206 206 return OK unless defined $read_only_methods{$method};
207 207
208 208 my $project_id = get_project_identifier($r);
209 209
210 210 $r->set_handlers(PerlAuthenHandler => [\&OK])
211 211 if is_public_project($project_id, $r);
212 212
213 213 return OK
214 214 }
215 215
216 216 sub authen_handler {
217 217 my $r = shift;
218 218
219 219 my ($res, $redmine_pass) = $r->get_basic_auth_pw();
220 220 return $res unless $res == OK;
221 221
222 222 if (is_member($r->user, $redmine_pass, $r)) {
223 223 return OK;
224 224 } else {
225 225 $r->note_auth_failure();
226 226 return AUTH_REQUIRED;
227 227 }
228 228 }
229 229
230 230 sub is_public_project {
231 231 my $project_id = shift;
232 232 my $r = shift;
233 233
234 234 my $dbh = connect_database($r);
235 235 my $sth = $dbh->prepare(
236 236 "SELECT is_public FROM projects WHERE projects.identifier = ?;"
237 237 );
238 238
239 239 $sth->execute($project_id);
240 240 my $ret = 0;
241 241 if (my @row = $sth->fetchrow_array) {
242 242 if ($row[0] eq "1" || $row[0] eq "t") {
243 243 $ret = 1;
244 244 }
245 245 }
246 246 $sth->finish();
247 undef $sth;
247 248 $dbh->disconnect();
249 undef $dbh;
248 250
249 251 $ret;
250 252 }
251 253
252 254 # perhaps we should use repository right (other read right) to check public access.
253 255 # it could be faster BUT it doesn't work for the moment.
254 256 # sub is_public_project_by_file {
255 257 # my $project_id = shift;
256 258 # my $r = shift;
257 259
258 260 # my $tree = Apache2::Directive::conftree();
259 261 # my $node = $tree->lookup('Location', $r->location);
260 262 # my $hash = $node->as_hash;
261 263
262 264 # my $svnparentpath = $hash->{SVNParentPath};
263 265 # my $repos_path = $svnparentpath . "/" . $project_id;
264 266 # return 1 if (stat($repos_path))[2] & 00007;
265 267 # }
266 268
267 269 sub is_member {
268 270 my $redmine_user = shift;
269 271 my $redmine_pass = shift;
270 272 my $r = shift;
271 273
272 274 my $dbh = connect_database($r);
273 275 my $project_id = get_project_identifier($r);
274 276
275 277 my $pass_digest = Digest::SHA1::sha1_hex($redmine_pass);
276 278
277 279 my $cfg = Apache2::Module::get_config(__PACKAGE__, $r->server, $r->per_dir_config);
278 280 my $usrprojpass;
279 281 if ($cfg->{RedmineCacheCredsMax}) {
280 282 $usrprojpass = $cfg->{RedmineCacheCreds}->get($redmine_user.":".$project_id);
281 283 return 1 if (defined $usrprojpass and ($usrprojpass eq $pass_digest));
282 284 }
283 285 my $query = $cfg->{RedmineQuery};
284 286 my $sth = $dbh->prepare($query);
285 287 $sth->execute($redmine_user, $project_id);
286 288
287 289 my $ret;
288 290 while (my ($hashed_password, $auth_source_id, $permissions) = $sth->fetchrow_array) {
289 291
290 292 unless ($auth_source_id) {
291 293 my $method = $r->method;
292 294 if ($hashed_password eq $pass_digest && ((defined $read_only_methods{$method} && $permissions =~ /:browse_repository/) || $permissions =~ /:commit_access/) ) {
293 295 $ret = 1;
294 296 last;
295 297 }
296 298 } elsif ($CanUseLDAPAuth) {
297 299 my $sthldap = $dbh->prepare(
298 300 "SELECT host,port,tls,account,account_password,base_dn,attr_login from auth_sources WHERE id = ?;"
299 301 );
300 302 $sthldap->execute($auth_source_id);
301 303 while (my @rowldap = $sthldap->fetchrow_array) {
302 304 my $ldap = Authen::Simple::LDAP->new(
303 305 host => ($rowldap[2] eq "1" || $rowldap[2] eq "t") ? "ldaps://$rowldap[0]" : $rowldap[0],
304 306 port => $rowldap[1],
305 307 basedn => $rowldap[5],
306 308 binddn => $rowldap[3] ? $rowldap[3] : "",
307 309 bindpw => $rowldap[4] ? $rowldap[4] : "",
308 310 filter => "(".$rowldap[6]."=%s)"
309 311 );
310 312 $ret = 1 if ($ldap->authenticate($redmine_user, $redmine_pass));
311 313 }
312 314 $sthldap->finish();
315 undef $sthldap;
313 316 }
314 317 }
315 318 $sth->finish();
319 undef $sth;
316 320 $dbh->disconnect();
321 undef $dbh;
317 322
318 323 if ($cfg->{RedmineCacheCredsMax} and $ret) {
319 324 if (defined $usrprojpass) {
320 325 $cfg->{RedmineCacheCreds}->set($redmine_user.":".$project_id, $pass_digest);
321 326 } else {
322 327 if ($cfg->{RedmineCacheCredsCount} < $cfg->{RedmineCacheCredsMax}) {
323 328 $cfg->{RedmineCacheCreds}->set($redmine_user.":".$project_id, $pass_digest);
324 329 $cfg->{RedmineCacheCredsCount}++;
325 330 } else {
326 331 $cfg->{RedmineCacheCreds}->clear();
327 332 $cfg->{RedmineCacheCredsCount} = 0;
328 333 }
329 334 }
330 335 }
331 336
332 337 $ret;
333 338 }
334 339
335 340 sub get_project_identifier {
336 341 my $r = shift;
337 342
338 343 my $location = $r->location;
339 344 my ($identifier) = $r->uri =~ m{$location/*([^/]+)};
340 345 $identifier;
341 346 }
342 347
343 348 sub connect_database {
344 349 my $r = shift;
345 350
346 351 my $cfg = Apache2::Module::get_config(__PACKAGE__, $r->server, $r->per_dir_config);
347 352 return DBI->connect($cfg->{RedmineDSN}, $cfg->{RedmineDbUser}, $cfg->{RedmineDbPass});
348 353 }
349 354
350 355 1;
@@ -1,850 +1,852
1 1 body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; }
2 2
3 3 h1, h2, h3, h4 { font-family: "Trebuchet MS", Verdana, sans-serif;}
4 4 h1 {margin:0; padding:0; font-size: 24px;}
5 5 h2, .wiki h1 {font-size: 20px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
6 6 h3, .wiki h2 {font-size: 16px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
7 7 h4, .wiki h3 {font-size: 13px;padding: 2px 10px 1px 0px;margin-bottom: 5px; border-bottom: 1px dotted #bbbbbb; color: #444;}
8 8
9 9 /***** Layout *****/
10 10 #wrapper {background: white;}
11 11
12 12 #top-menu {background: #2C4056; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}
13 13 #top-menu ul {margin: 0; padding: 0;}
14 14 #top-menu li {
15 15 float:left;
16 16 list-style-type:none;
17 17 margin: 0px 0px 0px 0px;
18 18 padding: 0px 0px 0px 0px;
19 19 white-space:nowrap;
20 20 }
21 21 #top-menu a {color: #fff; margin-right: 8px; font-weight: bold;}
22 22 #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; }
23 23
24 24 #account {float:right;}
25 25
26 26 #header {height:5.3em;margin:0;background-color:#507AAA;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
27 27 #header a {color:#f8f8f8;}
28 28 #header h1 a.ancestor { font-size: 80%; }
29 29 #quick-search {float:right;}
30 30
31 31 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
32 32 #main-menu ul {margin: 0; padding: 0;}
33 33 #main-menu li {
34 34 float:left;
35 35 list-style-type:none;
36 36 margin: 0px 2px 0px 0px;
37 37 padding: 0px 0px 0px 0px;
38 38 white-space:nowrap;
39 39 }
40 40 #main-menu li a {
41 41 display: block;
42 42 color: #fff;
43 43 text-decoration: none;
44 44 font-weight: bold;
45 45 margin: 0;
46 46 padding: 4px 10px 4px 10px;
47 47 }
48 48 #main-menu li a:hover {background:#759FCF; color:#fff;}
49 49 #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
50 50
51 51 #admin-menu ul {margin: 0; padding: 0;}
52 52 #admin-menu li {margin: 0; padding: 0 0 12px 0; list-style-type:none;}
53 53
54 54 #admin-menu a { background-position: 0% 40%; background-repeat: no-repeat; padding-left: 20px; padding-top: 2px; padding-bottom: 3px;}
55 55 #admin-menu a.projects { background-image: url(../images/projects.png); }
56 56 #admin-menu a.users { background-image: url(../images/user.png); }
57 57 #admin-menu a.groups { background-image: url(../images/group.png); }
58 58 #admin-menu a.roles { background-image: url(../images/database_key.png); }
59 59 #admin-menu a.trackers { background-image: url(../images/ticket.png); }
60 60 #admin-menu a.issue_statuses { background-image: url(../images/ticket_edit.png); }
61 61 #admin-menu a.workflows { background-image: url(../images/ticket_go.png); }
62 62 #admin-menu a.custom_fields { background-image: url(../images/textfield.png); }
63 63 #admin-menu a.enumerations { background-image: url(../images/text_list_bullets.png); }
64 64 #admin-menu a.settings { background-image: url(../images/changeset.png); }
65 65 #admin-menu a.plugins { background-image: url(../images/plugin.png); }
66 66 #admin-menu a.info { background-image: url(../images/help.png); }
67 67
68 68 #main {background-color:#EEEEEE;}
69 69
70 70 #sidebar{ float: right; width: 17%; position: relative; z-index: 9; min-height: 600px; padding: 0; margin: 0;}
71 71 * html #sidebar{ width: 17%; }
72 72 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
73 73 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
74 74 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
75 75
76 76 #content { width: 80%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; }
77 77 * html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
78 78 html>body #content { min-height: 600px; overflow: auto; }
79 79 * html body #content { height: 600px; } /* IE */
80 80
81 81 #main.nosidebar #sidebar{ display: none; }
82 82 #main.nosidebar #content{ width: auto; border-right: 0; }
83 83
84 84 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
85 85
86 86 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
87 87 #login-form table td {padding: 6px;}
88 88 #login-form label {font-weight: bold;}
89 89 #login-form input#username, #login-form input#password { width: 300px; }
90 90
91 91 input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; }
92 92
93 93 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
94 94
95 95 /***** Links *****/
96 96 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
97 97 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
98 98 a img{ border: 0; }
99 99
100 100 a.issue.closed, a.issue.closed:link, a.issue.closed:visited { color: #999; text-decoration: line-through; }
101 101
102 102 /***** Tables *****/
103 103 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
104 104 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
105 105 table.list td { vertical-align: top; }
106 106 table.list td.id { width: 2%; text-align: center;}
107 107 table.list td.checkbox { width: 15px; padding: 0px;}
108 108 table.list td.buttons { width: 15%; white-space:nowrap; text-align: right; }
109 109 table.list td.buttons a { padding-right: 0.6em; }
110 110
111 111 tr.project td.name a { padding-left: 16px; white-space:nowrap; }
112 112 tr.project.parent td.name a { background: url('../images/bullet_toggle_minus.png') no-repeat; }
113 113
114 114 tr.issue { text-align: center; white-space: nowrap; }
115 115 tr.issue td.subject, tr.issue td.category, td.assigned_to { white-space: normal; }
116 116 tr.issue td.subject { text-align: left; }
117 117 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
118 118
119 119 tr.entry { border: 1px solid #f8f8f8; }
120 120 tr.entry td { white-space: nowrap; }
121 121 tr.entry td.filename { width: 30%; }
122 122 tr.entry td.size { text-align: right; font-size: 90%; }
123 123 tr.entry td.revision, tr.entry td.author { text-align: center; }
124 124 tr.entry td.age { text-align: right; }
125 125 tr.entry.file td.filename a { margin-left: 16px; }
126 126
127 127 tr span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;}
128 128 tr.open span.expander {background-image: url(../images/bullet_toggle_minus.png);}
129 129
130 130 tr.changeset td.author { text-align: center; width: 15%; }
131 131 tr.changeset td.committed_on { text-align: center; width: 15%; }
132 132
133 133 table.files tr.file td { text-align: center; }
134 134 table.files tr.file td.filename { text-align: left; padding-left: 24px; }
135 135 table.files tr.file td.digest { font-size: 80%; }
136 136
137 137 table.members td.roles, table.memberships td.roles { width: 45%; }
138 138
139 139 tr.message { height: 2.6em; }
140 140 tr.message td.last_message { font-size: 80%; }
141 141 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
142 142 tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }
143 143
144 144 tr.version.closed, tr.version.closed a { color: #999; }
145 145 tr.version td.name { padding-left: 20px; }
146 146 tr.version.shared td.name { background: url(../images/link.png) no-repeat 0% 70%; }
147 147 tr.version td.date, tr.version td.status, tr.version td.sharing { text-align: center; }
148 148
149 149 tr.user td { width:13%; }
150 150 tr.user td.email { width:18%; }
151 151 tr.user td { white-space: nowrap; }
152 152 tr.user.locked, tr.user.registered { color: #aaa; }
153 153 tr.user.locked a, tr.user.registered a { color: #aaa; }
154 154
155 155 tr.time-entry { text-align: center; white-space: nowrap; }
156 156 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
157 157 td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
158 158 td.hours .hours-dec { font-size: 0.9em; }
159 159
160 160 table.plugins td { vertical-align: middle; }
161 161 table.plugins td.configure { text-align: right; padding-right: 1em; }
162 162 table.plugins span.name { font-weight: bold; display: block; margin-bottom: 6px; }
163 163 table.plugins span.description { display: block; font-size: 0.9em; }
164 164 table.plugins span.url { display: block; font-size: 0.9em; }
165 165
166 166 table.list tbody tr.group td { padding: 0.8em 0 0.5em 0.3em; font-weight: bold; border-bottom: 1px solid #ccc; }
167 167 table.list tbody tr.group span.count { color: #aaa; font-size: 80%; }
168 168
169 169 table.list tbody tr:hover { background-color:#ffffdd; }
170 170 table.list tbody tr.group:hover { background-color:inherit; }
171 171 table td {padding:2px;}
172 172 table p {margin:0;}
173 173 .odd {background-color:#f6f7f8;}
174 174 .even {background-color: #fff;}
175 175
176 176 a.sort { padding-right: 16px; background-position: 100% 50%; background-repeat: no-repeat; }
177 177 a.sort.asc { background-image: url(../images/sort_asc.png); }
178 178 a.sort.desc { background-image: url(../images/sort_desc.png); }
179 179
180 180 table.attributes { width: 100% }
181 181 table.attributes th { vertical-align: top; text-align: left; }
182 182 table.attributes td { vertical-align: top; }
183 183
184 184 table.boards a.board, h3.comments { background: url(../images/comment.png) no-repeat 0% 50%; padding-left: 20px; }
185 185
186 186 td.center {text-align:center;}
187 187
188 188 h3.version { background: url(../images/package.png) no-repeat 0% 50%; padding-left: 20px; }
189 189
190 190 div.issues h3 { background: url(../images/ticket.png) no-repeat 0% 50%; padding-left: 20px; }
191 191 div.members h3 { background: url(../images/group.png) no-repeat 0% 50%; padding-left: 20px; }
192 192 div.news h3 { background: url(../images/news.png) no-repeat 0% 50%; padding-left: 20px; }
193 193 div.projects h3 { background: url(../images/projects.png) no-repeat 0% 50%; padding-left: 20px; }
194 194
195 195 .highlight { background-color: #FCFD8D;}
196 196 .highlight.token-1 { background-color: #faa;}
197 197 .highlight.token-2 { background-color: #afa;}
198 198 .highlight.token-3 { background-color: #aaf;}
199 199
200 200 .box{
201 201 padding:6px;
202 202 margin-bottom: 10px;
203 203 background-color:#f6f6f6;
204 204 color:#505050;
205 205 line-height:1.5em;
206 206 border: 1px solid #e4e4e4;
207 207 }
208 208
209 209 div.square {
210 210 border: 1px solid #999;
211 211 float: left;
212 212 margin: .3em .4em 0 .4em;
213 213 overflow: hidden;
214 214 width: .6em; height: .6em;
215 215 }
216 216 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
217 217 .contextual input, .contextual select {font-size:0.9em;}
218 218 .message .contextual { margin-top: 0; }
219 219
220 220 .splitcontentleft{float:left; width:49%;}
221 221 .splitcontentright{float:right; width:49%;}
222 222 form {display: inline;}
223 223 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
224 224 fieldset {border: 1px solid #e4e4e4; margin:0;}
225 225 legend {color: #484848;}
226 226 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
227 227 blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
228 228 blockquote blockquote { margin-left: 0;}
229 229 acronym { border-bottom: 1px dotted; cursor: help; }
230 230 textarea.wiki-edit { width: 99%; }
231 231 li p {margin-top: 0;}
232 232 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
233 233 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
234 234 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
235 235 p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; }
236 236
237 237 fieldset.collapsible { border-width: 1px 0 0 0; font-size: 0.9em; }
238 238 fieldset.collapsible legend { padding-left: 16px; background: url(../images/arrow_expanded.png) no-repeat 0% 40%; cursor:pointer; }
239 239 fieldset.collapsible.collapsed legend { background-image: url(../images/arrow_collapsed.png); }
240 240
241 241 fieldset#date-range p { margin: 2px 0 2px 0; }
242 242 fieldset#filters table { border-collapse: collapse; }
243 243 fieldset#filters table td { padding: 0; vertical-align: middle; }
244 244 fieldset#filters tr.filter { height: 2em; }
245 245 fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
246 246 .buttons { font-size: 0.9em; margin-bottom: 1.4em; margin-top: 1em; }
247 247
248 248 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
249 249 div#issue-changesets .changeset { padding: 4px;}
250 250 div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
251 251 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
252 252
253 253 div#activity dl, #search-results { margin-left: 2em; }
254 254 div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
255 255 div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
256 256 div#activity dt.me .time { border-bottom: 1px solid #999; }
257 257 div#activity dt .time { color: #777; font-size: 80%; }
258 258 div#activity dd .description, #search-results dd .description { font-style: italic; }
259 259 div#activity span.project:after, #search-results span.project:after { content: " -"; }
260 260 div#activity dd span.description, #search-results dd span.description { display:block; color: #808080; }
261 261
262 262 #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; }
263 263
264 264 div#search-results-counts {float:right;}
265 265 div#search-results-counts ul { margin-top: 0.5em; }
266 266 div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; }
267 267
268 268 dt.issue { background-image: url(../images/ticket.png); }
269 269 dt.issue-edit { background-image: url(../images/ticket_edit.png); }
270 270 dt.issue-closed { background-image: url(../images/ticket_checked.png); }
271 271 dt.issue-note { background-image: url(../images/ticket_note.png); }
272 272 dt.changeset { background-image: url(../images/changeset.png); }
273 273 dt.news { background-image: url(../images/news.png); }
274 274 dt.message { background-image: url(../images/message.png); }
275 275 dt.reply { background-image: url(../images/comments.png); }
276 276 dt.wiki-page { background-image: url(../images/wiki_edit.png); }
277 277 dt.attachment { background-image: url(../images/attachment.png); }
278 278 dt.document { background-image: url(../images/document.png); }
279 279 dt.project { background-image: url(../images/projects.png); }
280 280 dt.time-entry { background-image: url(../images/time.png); }
281 281
282 282 #search-results dt.issue.closed { background-image: url(../images/ticket_checked.png); }
283 283
284 284 div#roadmap fieldset.related-issues { margin-bottom: 1em; }
285 285 div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
286 286 div#roadmap .wiki h1:first-child { display: none; }
287 287 div#roadmap .wiki h1 { font-size: 120%; }
288 288 div#roadmap .wiki h2 { font-size: 110%; }
289 289
290 290 div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
291 291 div#version-summary fieldset { margin-bottom: 1em; }
292 292 div#version-summary .total-hours { text-align: right; }
293 293
294 294 table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
295 295 table#time-report tbody tr { font-style: italic; color: #777; }
296 296 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
297 297 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
298 298 table#time-report .hours-dec { font-size: 0.9em; }
299 299
300 300 form#issue-form .attributes { margin-bottom: 8px; }
301 301 form#issue-form .attributes p { padding-top: 1px; padding-bottom: 2px; }
302 302 form#issue-form .attributes select { min-width: 30%; }
303 303
304 304 ul.projects { margin: 0; padding-left: 1em; }
305 305 ul.projects.root { margin: 0; padding: 0; }
306 306 ul.projects ul { border-left: 3px solid #e0e0e0; }
307 307 ul.projects li { list-style-type:none; }
308 308 ul.projects li.root { margin-bottom: 1em; }
309 309 ul.projects li.child { margin-top: 1em;}
310 310 ul.projects div.root a.project { font-family: "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 16px; margin: 0 0 10px 0; }
311 311 .my-project { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; }
312 312
313 313 #tracker_project_ids ul { margin: 0; padding-left: 1em; }
314 314 #tracker_project_ids li { list-style-type:none; }
315 315
316 316 ul.properties {padding:0; font-size: 0.9em; color: #777;}
317 317 ul.properties li {list-style-type:none;}
318 318 ul.properties li span {font-style:italic;}
319 319
320 320 .total-hours { font-size: 110%; font-weight: bold; }
321 321 .total-hours span.hours-int { font-size: 120%; }
322 322
323 323 .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
324 324 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
325 325
326 326 #workflow_copy_form select { width: 200px; }
327 327
328 328 .pagination {font-size: 90%}
329 329 p.pagination {margin-top:8px;}
330 330
331 331 /***** Tabular forms ******/
332 332 .tabular p{
333 333 margin: 0;
334 334 padding: 5px 0 8px 0;
335 335 padding-left: 180px; /*width of left column containing the label elements*/
336 336 height: 1%;
337 337 clear:left;
338 338 }
339 339
340 340 html>body .tabular p {overflow:hidden;}
341 341
342 342 .tabular label{
343 343 font-weight: bold;
344 344 float: left;
345 345 text-align: right;
346 346 margin-left: -180px; /*width of left column*/
347 347 width: 175px; /*width of labels. Should be smaller than left column to create some right
348 348 margin*/
349 349 }
350 350
351 351 .tabular label.floating{
352 352 font-weight: normal;
353 353 margin-left: 0px;
354 354 text-align: left;
355 355 width: 270px;
356 356 }
357 357
358 358 .tabular label.block{
359 359 font-weight: normal;
360 360 margin-left: 0px !important;
361 361 text-align: left;
362 362 float: none;
363 363 display: block;
364 364 width: auto;
365 365 }
366 366
367 367 input#time_entry_comments { width: 90%;}
368 368
369 369 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
370 370
371 371 .tabular.settings p{ padding-left: 300px; }
372 372 .tabular.settings label{ margin-left: -300px; width: 295px; }
373 373 .tabular.settings textarea { width: 99%; }
374 374
375 375 fieldset.settings label { display: block; }
376 376
377 377 .required {color: #bb0000;}
378 378 .summary {font-style: italic;}
379 379
380 380 #attachments_fields input[type=text] {margin-left: 8px; }
381 381
382 382 div.attachments { margin-top: 12px; }
383 383 div.attachments p { margin:4px 0 2px 0; }
384 384 div.attachments img { vertical-align: middle; }
385 385 div.attachments span.author { font-size: 0.9em; color: #888; }
386 386
387 387 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
388 388 .other-formats span + span:before { content: "| "; }
389 389
390 390 a.atom { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
391 391
392 392 /* Project members tab */
393 393 div#tab-content-members .splitcontentleft, div#tab-content-memberships .splitcontentleft, div#tab-content-users .splitcontentleft { width: 64% }
394 394 div#tab-content-members .splitcontentright, div#tab-content-memberships .splitcontentright, div#tab-content-users .splitcontentright { width: 34% }
395 395 div#tab-content-members fieldset, div#tab-content-memberships fieldset, div#tab-content-users fieldset { padding:1em; margin-bottom: 1em; }
396 396 div#tab-content-members fieldset legend, div#tab-content-memberships fieldset legend, div#tab-content-users fieldset legend { font-weight: bold; }
397 397 div#tab-content-members fieldset label, div#tab-content-memberships fieldset label, div#tab-content-users fieldset label { display: block; }
398 398 div#tab-content-members fieldset div, div#tab-content-users fieldset div { max-height: 400px; overflow:auto; }
399 399
400 400 table.members td.group { padding-left: 20px; background: url(../images/group.png) no-repeat 0% 50%; }
401 401
402 402 * html div#tab-content-members fieldset div { height: 450px; }
403 403
404 404 /***** Flash & error messages ****/
405 405 #errorExplanation, div.flash, .nodata, .warning {
406 406 padding: 4px 4px 4px 30px;
407 407 margin-bottom: 12px;
408 408 font-size: 1.1em;
409 409 border: 2px solid;
410 410 }
411 411
412 412 div.flash {margin-top: 8px;}
413 413
414 414 div.flash.error, #errorExplanation {
415 415 background: url(../images/exclamation.png) 8px 50% no-repeat;
416 416 background-color: #ffe3e3;
417 417 border-color: #dd0000;
418 418 color: #880000;
419 419 }
420 420
421 421 div.flash.notice {
422 422 background: url(../images/true.png) 8px 5px no-repeat;
423 423 background-color: #dfffdf;
424 424 border-color: #9fcf9f;
425 425 color: #005f00;
426 426 }
427 427
428 428 div.flash.warning {
429 429 background: url(../images/warning.png) 8px 5px no-repeat;
430 430 background-color: #FFEBC1;
431 431 border-color: #FDBF3B;
432 432 color: #A6750C;
433 433 text-align: left;
434 434 }
435 435
436 436 .nodata, .warning {
437 437 text-align: center;
438 438 background-color: #FFEBC1;
439 439 border-color: #FDBF3B;
440 440 color: #A6750C;
441 441 }
442 442
443 443 #errorExplanation ul { font-size: 0.9em;}
444 444 #errorExplanation h2, #errorExplanation p { display: none; }
445 445
446 446 /***** Ajax indicator ******/
447 447 #ajax-indicator {
448 448 position: absolute; /* fixed not supported by IE */
449 449 background-color:#eee;
450 450 border: 1px solid #bbb;
451 451 top:35%;
452 452 left:40%;
453 453 width:20%;
454 454 font-weight:bold;
455 455 text-align:center;
456 456 padding:0.6em;
457 457 z-index:100;
458 458 filter:alpha(opacity=50);
459 459 opacity: 0.5;
460 460 }
461 461
462 462 html>body #ajax-indicator { position: fixed; }
463 463
464 464 #ajax-indicator span {
465 465 background-position: 0% 40%;
466 466 background-repeat: no-repeat;
467 467 background-image: url(../images/loading.gif);
468 468 padding-left: 26px;
469 469 vertical-align: bottom;
470 470 }
471 471
472 472 /***** Calendar *****/
473 473 table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;}
474 474 table.cal thead th {width: 14%;}
475 475 table.cal tbody tr {height: 100px;}
476 476 table.cal th { background-color:#EEEEEE; padding: 4px; }
477 477 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
478 478 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
479 479 table.cal td.odd p.day-num {color: #bbb;}
480 480 table.cal td.today {background:#ffffdd;}
481 481 table.cal td.today p.day-num {font-weight: bold;}
482 482
483 483 /***** Tooltips ******/
484 484 .tooltip{position:relative;z-index:24;}
485 485 .tooltip:hover{z-index:25;color:#000;}
486 486 .tooltip span.tip{display: none; text-align:left;}
487 487
488 488 div.tooltip:hover span.tip{
489 489 display:block;
490 490 position:absolute;
491 491 top:12px; left:24px; width:270px;
492 492 border:1px solid #555;
493 493 background-color:#fff;
494 494 padding: 4px;
495 495 font-size: 0.8em;
496 496 color:#505050;
497 497 }
498 498
499 499 /***** Progress bar *****/
500 500 table.progress {
501 501 border: 1px solid #D7D7D7;
502 502 border-collapse: collapse;
503 503 border-spacing: 0pt;
504 504 empty-cells: show;
505 505 text-align: center;
506 506 float:left;
507 507 margin: 1px 6px 1px 0px;
508 508 }
509 509
510 510 table.progress td { height: 0.9em; }
511 511 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
512 512 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
513 513 table.progress td.open { background: #FFF none repeat scroll 0%; }
514 514 p.pourcent {font-size: 80%;}
515 515 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
516 516
517 517 /***** Tabs *****/
518 518 #content .tabs {height: 2.6em; border-bottom: 1px solid #bbbbbb; margin-bottom:1.2em; position:relative; overflow:hidden;}
519 519 #content .tabs ul {margin:0; position:absolute; bottom:-2px; padding-left:1em; width: 2000px;}
520 520 #content .tabs>ul { bottom:-1px; } /* others */
521 521 #content .tabs ul li {
522 522 float:left;
523 523 list-style-type:none;
524 524 white-space:nowrap;
525 525 margin-right:8px;
526 526 background:#fff;
527 527 }
528 528 #content .tabs ul li a{
529 529 display:block;
530 530 font-size: 0.9em;
531 531 text-decoration:none;
532 532 line-height:1.3em;
533 533 padding:4px 6px 4px 6px;
534 534 border: 1px solid #ccc;
535 535 border-bottom: 1px solid #bbbbbb;
536 536 background-color: #eeeeee;
537 537 color:#777;
538 538 font-weight:bold;
539 539 }
540 540
541 541 #content .tabs ul li a:hover {
542 542 background-color: #ffffdd;
543 543 text-decoration:none;
544 544 }
545 545
546 546 #content .tabs ul li a.selected {
547 547 background-color: #fff;
548 548 border: 1px solid #bbbbbb;
549 549 border-bottom: 1px solid #fff;
550 550 }
551 551
552 552 #content .tabs ul li a.selected:hover {
553 553 background-color: #fff;
554 554 }
555 555
556 556 div.tabs-buttons { position:absolute; right: 0; width: 48px; height: 24px; background: white; bottom: -1px; }
557 557
558 558 button.tab-left, button.tab-right {
559 559 font-size: 0.9em;
560 560 cursor: pointer;
561 561 height:24px;
562 562 border: 1px solid #ccc;
563 563 border-bottom: 1px solid #bbbbbb;
564 564 position:absolute;
565 565 padding:4px;
566 566 width: 20px;
567 567 }
568 568
569 569 button.tab-left {
570 570 right: 20px;
571 571 bottom: 0;
572 572 background: #eeeeee url(../images/bullet_arrow_left.png) no-repeat 50% 50%;
573 573 }
574 574
575 575 button.tab-right {
576 576 right: 0;
577 577 bottom: 0;
578 578 background: #eeeeee url(../images/bullet_arrow_right.png) no-repeat 50% 50%;}
579 579 }
580 580
581 581 /***** Auto-complete *****/
582 582 div.autocomplete {
583 583 position:absolute;
584 584 width:250px;
585 585 background-color:white;
586 586 margin:0;
587 587 padding:0;
588 588 }
589 589 div.autocomplete ul {
590 590 list-style-type:none;
591 591 margin:0;
592 592 padding:0;
593 593 }
594 594 div.autocomplete ul li.selected { background-color: #ffb;}
595 595 div.autocomplete ul li {
596 596 list-style-type:none;
597 597 display:block;
598 598 margin:0;
599 599 padding:2px;
600 600 cursor:pointer;
601 601 font-size: 90%;
602 602 border-bottom: 1px solid #ccc;
603 603 border-left: 1px solid #ccc;
604 604 border-right: 1px solid #ccc;
605 605 }
606 606 div.autocomplete ul li span.informal {
607 607 font-size: 80%;
608 608 color: #aaa;
609 609 }
610 610
611 611 /***** Diff *****/
612 612 .diff_out { background: #fcc; }
613 613 .diff_in { background: #cfc; }
614 614
615 615 /***** Wiki *****/
616 616 div.wiki table {
617 617 border: 1px solid #505050;
618 618 border-collapse: collapse;
619 619 margin-bottom: 1em;
620 620 }
621 621
622 622 div.wiki table, div.wiki td, div.wiki th {
623 623 border: 1px solid #bbb;
624 624 padding: 4px;
625 625 }
626 626
627 627 div.wiki .external {
628 628 background-position: 0% 60%;
629 629 background-repeat: no-repeat;
630 630 padding-left: 12px;
631 631 background-image: url(../images/external.png);
632 632 }
633 633
634 634 div.wiki a.new {
635 635 color: #b73535;
636 636 }
637 637
638 638 div.wiki pre {
639 639 margin: 1em 1em 1em 1.6em;
640 640 padding: 2px;
641 641 background-color: #fafafa;
642 642 border: 1px solid #dadada;
643 643 width:95%;
644 644 overflow-x: auto;
645 645 }
646 646
647 647 div.wiki ul.toc {
648 648 background-color: #ffffdd;
649 649 border: 1px solid #e4e4e4;
650 650 padding: 4px;
651 651 line-height: 1.2em;
652 652 margin-bottom: 12px;
653 653 margin-right: 12px;
654 654 margin-left: 0;
655 655 display: table
656 656 }
657 657 * html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */
658 658
659 659 div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
660 660 div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
661 661 div.wiki ul.toc li { list-style-type:none;}
662 662 div.wiki ul.toc li.heading2 { margin-left: 6px; }
663 663 div.wiki ul.toc li.heading3 { margin-left: 12px; font-size: 0.8em; }
664 664
665 665 div.wiki ul.toc a {
666 666 font-size: 0.9em;
667 667 font-weight: normal;
668 668 text-decoration: none;
669 669 color: #606060;
670 670 }
671 671 div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;}
672 672
673 673 a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; }
674 674 a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; }
675 675 h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; }
676 676
677 div.wiki img { vertical-align: middle; }
678
677 679 /***** My page layout *****/
678 680 .block-receiver {
679 681 border:1px dashed #c0c0c0;
680 682 margin-bottom: 20px;
681 683 padding: 15px 0 15px 0;
682 684 }
683 685
684 686 .mypage-box {
685 687 margin:0 0 20px 0;
686 688 color:#505050;
687 689 line-height:1.5em;
688 690 }
689 691
690 692 .handle {
691 693 cursor: move;
692 694 }
693 695
694 696 a.close-icon {
695 697 display:block;
696 698 margin-top:3px;
697 699 overflow:hidden;
698 700 width:12px;
699 701 height:12px;
700 702 background-repeat: no-repeat;
701 703 cursor:pointer;
702 704 background-image:url('../images/close.png');
703 705 }
704 706
705 707 a.close-icon:hover {
706 708 background-image:url('../images/close_hl.png');
707 709 }
708 710
709 711 /***** Gantt chart *****/
710 712 .gantt_hdr {
711 713 position:absolute;
712 714 top:0;
713 715 height:16px;
714 716 border-top: 1px solid #c0c0c0;
715 717 border-bottom: 1px solid #c0c0c0;
716 718 border-right: 1px solid #c0c0c0;
717 719 text-align: center;
718 720 overflow: hidden;
719 721 }
720 722
721 723 .task {
722 724 position: absolute;
723 725 height:8px;
724 726 font-size:0.8em;
725 727 color:#888;
726 728 padding:0;
727 729 margin:0;
728 730 line-height:0.8em;
729 731 }
730 732
731 733 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
732 734 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
733 735 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
734 736 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
735 737
736 738 /***** Icons *****/
737 739 .icon {
738 740 background-position: 0% 50%;
739 741 background-repeat: no-repeat;
740 742 padding-left: 20px;
741 743 padding-top: 2px;
742 744 padding-bottom: 3px;
743 745 }
744 746
745 747 .icon-add { background-image: url(../images/add.png); }
746 748 .icon-edit { background-image: url(../images/edit.png); }
747 749 .icon-copy { background-image: url(../images/copy.png); }
748 750 .icon-duplicate { background-image: url(../images/duplicate.png); }
749 751 .icon-del { background-image: url(../images/delete.png); }
750 752 .icon-move { background-image: url(../images/move.png); }
751 753 .icon-save { background-image: url(../images/save.png); }
752 754 .icon-cancel { background-image: url(../images/cancel.png); }
753 755 .icon-multiple { background-image: url(../images/table_multiple.png); }
754 756 .icon-folder { background-image: url(../images/folder.png); }
755 757 .open .icon-folder { background-image: url(../images/folder_open.png); }
756 758 .icon-package { background-image: url(../images/package.png); }
757 759 .icon-home { background-image: url(../images/home.png); }
758 760 .icon-user { background-image: url(../images/user.png); }
759 761 .icon-projects { background-image: url(../images/projects.png); }
760 762 .icon-help { background-image: url(../images/help.png); }
761 763 .icon-attachment { background-image: url(../images/attachment.png); }
762 764 .icon-history { background-image: url(../images/history.png); }
763 765 .icon-time { background-image: url(../images/time.png); }
764 766 .icon-time-add { background-image: url(../images/time_add.png); }
765 767 .icon-stats { background-image: url(../images/stats.png); }
766 768 .icon-warning { background-image: url(../images/warning.png); }
767 769 .icon-fav { background-image: url(../images/fav.png); }
768 770 .icon-fav-off { background-image: url(../images/fav_off.png); }
769 771 .icon-reload { background-image: url(../images/reload.png); }
770 772 .icon-lock { background-image: url(../images/locked.png); }
771 773 .icon-unlock { background-image: url(../images/unlock.png); }
772 774 .icon-checked { background-image: url(../images/true.png); }
773 775 .icon-details { background-image: url(../images/zoom_in.png); }
774 776 .icon-report { background-image: url(../images/report.png); }
775 777 .icon-comment { background-image: url(../images/comment.png); }
776 778 .icon-summary { background-image: url(../images/lightning.png); }
777 779
778 780 .icon-file { background-image: url(../images/files/default.png); }
779 781 .icon-file.text-plain { background-image: url(../images/files/text.png); }
780 782 .icon-file.text-x-c { background-image: url(../images/files/c.png); }
781 783 .icon-file.text-x-csharp { background-image: url(../images/files/csharp.png); }
782 784 .icon-file.text-x-php { background-image: url(../images/files/php.png); }
783 785 .icon-file.text-x-ruby { background-image: url(../images/files/ruby.png); }
784 786 .icon-file.text-xml { background-image: url(../images/files/xml.png); }
785 787 .icon-file.image-gif { background-image: url(../images/files/image.png); }
786 788 .icon-file.image-jpeg { background-image: url(../images/files/image.png); }
787 789 .icon-file.image-png { background-image: url(../images/files/image.png); }
788 790 .icon-file.image-tiff { background-image: url(../images/files/image.png); }
789 791 .icon-file.application-pdf { background-image: url(../images/files/pdf.png); }
790 792 .icon-file.application-zip { background-image: url(../images/files/zip.png); }
791 793 .icon-file.application-x-gzip { background-image: url(../images/files/zip.png); }
792 794
793 795 img.gravatar {
794 796 padding: 2px;
795 797 border: solid 1px #d5d5d5;
796 798 background: #fff;
797 799 }
798 800
799 801 div.issue img.gravatar {
800 802 float: right;
801 803 margin: 0 0 0 1em;
802 804 padding: 5px;
803 805 }
804 806
805 807 div.issue table img.gravatar {
806 808 height: 14px;
807 809 width: 14px;
808 810 padding: 2px;
809 811 float: left;
810 812 margin: 0 0.5em 0 0;
811 813 }
812 814
813 815 h2 img.gravatar {
814 816 padding: 3px;
815 817 margin: -2px 4px 0 0;
816 818 float: left;
817 819 }
818 820
819 821 h4 img.gravatar {
820 822 padding: 3px;
821 823 margin: -6px 4px 0 0;
822 824 float: left;
823 825 }
824 826
825 827 td.username img.gravatar {
826 828 float: left;
827 829 margin: 0 1em 0 0;
828 830 }
829 831
830 832 #activity dt img.gravatar {
831 833 float: left;
832 834 margin: 0 1em 1em 0;
833 835 }
834 836
835 837 #activity dt,
836 838 .journal {
837 839 clear: left;
838 840 }
839 841
840 842 h2 img { vertical-align:middle; }
841 843
842 844 .hascontextmenu { cursor: context-menu; }
843 845
844 846 /***** Media print specific styles *****/
845 847 @media print {
846 848 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
847 849 #main { background: #fff; }
848 850 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; overflow: visible !important;}
849 851 #wiki_add_attachment { display:none; }
850 852 }
General Comments 0
You need to be logged in to leave comments. Login now