├── test
└── test_helper.rb
├── app
├── views
│ ├── public_settings_api
│ │ └── index.api.rsb
│ ├── workflow_transitions_api
│ │ └── index.api.rsb
│ ├── settings_api
│ │ └── index.api.rsb
│ ├── users_api
│ │ └── index.api.rsb
│ ├── projects_api
│ │ └── index.api.rsb
│ ├── custom_fields_api
│ │ └── index.api.rsb
│ └── workflow_permissions_api
│ │ └── index.api.rsb
├── controllers
│ ├── settings_api_controller.rb
│ ├── custom_fields_api_controller.rb
│ ├── public_settings_api_controller.rb
│ ├── projects_api_controller.rb
│ ├── users_api_controller.rb
│ ├── workflow_transitions_api_controller.rb
│ └── workflow_permissions_api_controller.rb
└── helpers
│ └── users_api_helper.rb
├── init.rb
├── config
└── routes.rb
├── README.md
└── LICENSE
/test/test_helper.rb:
--------------------------------------------------------------------------------
1 | # Load the Redmine helper
2 | require File.expand_path(File.dirname(__FILE__) + '/../../../test/test_helper')
3 |
--------------------------------------------------------------------------------
/app/views/public_settings_api/index.api.rsb:
--------------------------------------------------------------------------------
1 | api.settings do
2 | api.rest_api_enabled @config.rest_api_enabled?
3 | api.plugin_version '0.0.9'
4 | end
5 |
--------------------------------------------------------------------------------
/app/views/workflow_transitions_api/index.api.rsb:
--------------------------------------------------------------------------------
1 | api.array :transitions do
2 | @workflow.each do |wf|
3 | api.transition :old_status_id => wf.old_status_id, :new_status_id => wf.new_status_id
4 | end
5 | end
6 |
--------------------------------------------------------------------------------
/app/views/settings_api/index.api.rsb:
--------------------------------------------------------------------------------
1 | api.settings do
2 | api.text_formatting @config.text_formatting
3 | api.gravatar_enabled @config.gravatar_enabled?
4 | api.gravatar_default @config.gravatar_default
5 | api.version Redmine::Info.versioned_name
6 | api.environment Redmine::Info.environment
7 | end
8 |
--------------------------------------------------------------------------------
/app/controllers/settings_api_controller.rb:
--------------------------------------------------------------------------------
1 | class SettingsApiController < ApplicationController
2 |
3 | before_action :require_login
4 | accept_api_auth :index
5 |
6 | def index
7 | respond_to do |format|
8 | format.api {
9 | @config = Setting
10 | }
11 | end
12 | end
13 | end
14 |
--------------------------------------------------------------------------------
/app/controllers/custom_fields_api_controller.rb:
--------------------------------------------------------------------------------
1 | class CustomFieldsApiController < ApplicationController
2 |
3 | before_action :require_login
4 | accept_api_auth :index
5 |
6 | def index
7 | respond_to do |format|
8 | format.api {
9 | @custom_fields = CustomField.all
10 | }
11 | end
12 | end
13 | end
14 |
--------------------------------------------------------------------------------
/app/controllers/public_settings_api_controller.rb:
--------------------------------------------------------------------------------
1 | class PublicSettingsApiController < ApplicationController
2 |
3 | skip_before_action :check_if_login_required, :check_password_change
4 |
5 | def index
6 | respond_to do |format|
7 | format.api {
8 | @config = Setting
9 | }
10 | end
11 | end
12 | end
13 |
--------------------------------------------------------------------------------
/init.rb:
--------------------------------------------------------------------------------
1 | Redmine::Plugin.register :redmine_shared_api do
2 | name 'Redmine Shared API'
3 | author 'Ahau Software'
4 | description 'This is a plugin share API for Redmine Outlook Add-In, QuickBooks, etc..'
5 | version '0.0.9'
6 | url 'https://github.com/anovitsky/redmine_shared_api'
7 | author_url 'https://www.ahausoftware.com'
8 | requires_redmine :version_or_higher => '2.4.0'
9 | end
10 |
--------------------------------------------------------------------------------
/app/helpers/users_api_helper.rb:
--------------------------------------------------------------------------------
1 | module UsersApiHelper
2 | def api_gavatar_url(user, options = { })
3 | if Setting.gravatar_enabled?
4 | options.merge!(:default => Setting.gravatar_default)
5 | email = nil
6 | if user.respond_to?(:mail)
7 | email = user.mail
8 | elsif user.to_s =~ %r{<(.+?)>}
9 | email = $1
10 | end
11 | return gravatar_url(email.to_s.downcase, options) unless email.blank? rescue nil
12 | else
13 | ''
14 | end
15 | end
16 | end
17 |
--------------------------------------------------------------------------------
/app/controllers/projects_api_controller.rb:
--------------------------------------------------------------------------------
1 | class ProjectsApiController < ApplicationController
2 |
3 | before_action :require_login
4 | accept_api_auth :index
5 |
6 | helper :custom_fields
7 | helper :projects
8 |
9 | def index
10 | scope = Project.visible.sorted
11 |
12 | respond_to do |format|
13 | format.api {
14 | @offset, @limit = api_offset_and_limit
15 | @project_count = scope.count
16 | @projects = scope.offset(@offset).limit(@limit).to_a
17 | }
18 | end
19 | end
20 | end
21 |
--------------------------------------------------------------------------------
/app/views/users_api/index.api.rsb:
--------------------------------------------------------------------------------
1 | api.array :users do
2 | @users.each do |user|
3 | api.user do
4 | api.id user.id
5 | api.login user.login if User.current.admin? || (User.current == user)
6 | api.firstname user.firstname
7 | api.lastname user.lastname
8 | api.mail user.mail if User.current.admin? || !user.pref.hide_mail
9 | api.created_on user.created_on
10 | api.last_login_on user.last_login_on
11 | api.avatar_url api_gavatar_url(user)
12 |
13 | render_api_custom_values user.visible_custom_field_values, api
14 | end
15 | end
16 | end
17 |
--------------------------------------------------------------------------------
/config/routes.rb:
--------------------------------------------------------------------------------
1 | # Plugin's routes
2 | # See: http://guides.rubyonrails.org/routing.html
3 | match 'shared/projects', :controller => 'projects_api', :action => 'index', :via => [:get]
4 | match 'shared/custom_fields', :controller => 'custom_fields_api', :action => 'index', :via => [:get]
5 | match 'shared/users', :controller => 'users_api', :action => 'index', :via => [:get]
6 | match 'shared/settings', :controller => 'settings_api', :action => 'index', :via => [:get]
7 | match 'public/settings', :controller => 'public_settings_api', :action => 'index', :via => [:get]
8 | match 'shared/workflow/transitions', :controller => 'workflow_transitions_api', :action => 'index', :via => [:get]
9 | match 'shared/workflow/permissions', :controller => 'workflow_permissions_api', :action => 'index', :via => [:get]
--------------------------------------------------------------------------------
/app/views/projects_api/index.api.rsb:
--------------------------------------------------------------------------------
1 | api.array :projects, api_meta(:total_count => @project_count, :offset => @offset, :limit => @limit) do
2 | @projects.each do |project|
3 | api.project do
4 | api.id project.id
5 | api.name project.name
6 | api.identifier project.identifier
7 | api.description project.description
8 | api.parent(:id => project.parent.id, :name => project.parent.name) if project.parent && project.parent.visible?
9 | api.status project.status
10 | api.is_public project.is_public?
11 |
12 | render_api_custom_values project.visible_custom_field_values, api
13 | render_api_includes(project, api)
14 |
15 | api.created_on project.created_on
16 | api.updated_on project.updated_on
17 | end
18 | end
19 | end
20 |
--------------------------------------------------------------------------------
/app/controllers/users_api_controller.rb:
--------------------------------------------------------------------------------
1 | class UsersApiController < ApplicationController
2 |
3 | before_action :require_login
4 | accept_api_auth :index
5 |
6 | helper :sort
7 | include SortHelper
8 | helper :custom_fields
9 | include CustomFieldsHelper
10 | helper :principal_memberships
11 |
12 | def index
13 | sort_init 'firstname', 'asc'
14 | sort_update %w(firstname lastname created_on)
15 |
16 | @status = params[:status] || 1
17 |
18 | scope = User.logged.status(@status).preload(:email_address)
19 | scope = scope.like(params[:name]) if params[:name].present?
20 | scope = scope.in_group(params[:group_id]) if params[:group_id].present?
21 |
22 | @users = scope.order(sort_clause).limit(@limit).offset(@offset).to_a
23 |
24 | respond_to do |format|
25 | format.api
26 | end
27 | end
28 |
29 | def text_formatting
30 | respond_to do |format|
31 | Setting.text_formatting
32 | end
33 | end
34 |
35 | end
36 |
--------------------------------------------------------------------------------
/app/controllers/workflow_transitions_api_controller.rb:
--------------------------------------------------------------------------------
1 | class WorkflowTransitionsApiController < ApplicationController
2 |
3 | before_action :require_login
4 | accept_api_auth :index
5 |
6 | def index
7 | find_trackers_roles_and_statuses_for_edit
8 | if @roles && @trackers
9 | @workflow = WorkflowTransition.where(:tracker_id => @trackers, :role_id => @roles)
10 | end
11 | end
12 |
13 | private
14 |
15 | def find_trackers_roles_and_statuses_for_edit
16 | find_roles
17 | find_trackers
18 | end
19 |
20 | def find_roles
21 | ids = Array.wrap(params[:role_id])
22 | if ids == ['all']
23 | @roles = Role.sorted.to_a
24 | elsif ids.present?
25 | @roles = Role.where(:id => ids).to_a
26 | end
27 | @roles = nil if @roles.blank?
28 | end
29 |
30 | def find_trackers
31 | ids = Array.wrap(params[:tracker_id])
32 | if ids == ['all']
33 | @trackers = Tracker.sorted.to_a
34 | elsif ids.present?
35 | @trackers = Tracker.where(:id => ids).to_a
36 | end
37 | @trackers = nil if @trackers.blank?
38 | end
39 |
40 | end
41 |
--------------------------------------------------------------------------------
/app/controllers/workflow_permissions_api_controller.rb:
--------------------------------------------------------------------------------
1 | class WorkflowPermissionsApiController < ApplicationController
2 |
3 | before_action :require_login
4 | accept_api_auth :index
5 |
6 | def index
7 | find_trackers_roles_and_statuses_for_edit
8 | if @roles && @trackers
9 | @fields = (Tracker::CORE_FIELDS_ALL - @trackers.map(&:disabled_core_fields).reduce(:&)).map {|field| [field, l("field_"+field.sub(/_id$/, ''))]}
10 | @custom_fields = @trackers.map(&:custom_fields).flatten.uniq.sort
11 | @permissions = WorkflowPermission.rules_by_status_id(@trackers, @roles)
12 | @statuses.each {|status| @permissions[status.id] ||= {}}
13 | end
14 | end
15 |
16 | private
17 |
18 | def find_trackers_roles_and_statuses_for_edit
19 | find_roles
20 | find_trackers
21 | find_statuses
22 | end
23 |
24 | def find_roles
25 | ids = Array.wrap(params[:role_id])
26 | if ids == ['all']
27 | @roles = Role.sorted.to_a
28 | elsif ids.present?
29 | @roles = Role.where(:id => ids).to_a
30 | end
31 | @roles = nil if @roles.blank?
32 | end
33 |
34 | def find_trackers
35 | ids = Array.wrap(params[:tracker_id])
36 | if ids == ['all']
37 | @trackers = Tracker.sorted.to_a
38 | elsif ids.present?
39 | @trackers = Tracker.where(:id => ids).to_a
40 | end
41 | @trackers = nil if @trackers.blank?
42 | end
43 |
44 | def find_statuses
45 | @used_statuses_only = (params[:used_statuses_only] == '0' ? false : true)
46 | if @trackers && @used_statuses_only
47 | @statuses = @trackers.map(&:issue_statuses).flatten.uniq.sort.presence
48 | end
49 | @statuses ||= IssueStatus.sorted.to_a
50 | end
51 |
52 | end
53 |
--------------------------------------------------------------------------------
/app/views/custom_fields_api/index.api.rsb:
--------------------------------------------------------------------------------
1 | api.array :custom_fields do
2 | @custom_fields.each do |field|
3 | api.custom_field do
4 | api.id field.id
5 | api.name field.name
6 | api.customized_type field.class.customized_class.name.underscore if field.class.customized_class
7 | api.field_format field.field_format
8 | api.regexp field.regexp
9 | api.min_length field.min_length
10 | api.max_length field.max_length
11 | api.is_required field.is_required?
12 | api.is_filter field.is_filter?
13 | api.searchable field.searchable
14 | api.multiple field.multiple?
15 | api.default_value field.default_value
16 | api.visible field.visible?
17 |
18 | values = field.possible_values_options
19 | if values.present?
20 | api.array :possible_values do
21 | values.each do |label, value|
22 | api.possible_value do
23 | api.value value || label
24 | if field.format.class.name.demodulize == 'EnumerationFormat'
25 | api.label label
26 | end
27 | end
28 | end
29 | end
30 | end
31 |
32 | if field.is_a?(IssueCustomField)
33 | api.array :trackers do
34 | field.trackers.each do |tracker|
35 | api.tracker :id => tracker.id, :name => tracker.name
36 | end
37 | end
38 | api.array :roles do
39 | field.roles.each do |role|
40 | api.role :id => role.id, :name => role.name
41 | end
42 | end
43 | api.is_for_all field.is_for_all?
44 | unless field.is_for_all?
45 | api.array :projects do
46 | field.projects.each do |project|
47 | api.project :id => project.id, :name => project.name
48 | end
49 | end
50 | end
51 | end
52 | end
53 | end
54 | end
55 |
--------------------------------------------------------------------------------
/app/views/workflow_permissions_api/index.api.rsb:
--------------------------------------------------------------------------------
1 | api.permissions do
2 | api.array :fields do
3 | @fields.each do |field|
4 | api.field 'id' => field[0], 'name' => field[1]
5 | end
6 | end
7 |
8 | api.array :custom_fields do
9 | @custom_fields.each do |custom_field|
10 | api.custom_field do
11 | api.id custom_field.id
12 | api.type custom_field.type
13 | api.name custom_field.name
14 | api.customized_type custom_field.class.customized_class.name.underscore if custom_field.class.customized_class
15 | api.field_format custom_field.field_format
16 | values = custom_field.possible_values
17 | if values.present?
18 | api.array :possible_values do
19 | values.each do |label, value|
20 | api.possible_value :value => value || label, :label => label
21 | end
22 | end
23 | end
24 | api.regexp custom_field.regexp
25 | api.min_length custom_field.min_length
26 | api.max_length custom_field.max_length
27 | api.is_required custom_field.is_required?
28 | api.is_for_all custom_field.is_for_all
29 | api.is_filter custom_field.is_filter?
30 | api.position custom_field.position
31 | api.searchable custom_field.searchable
32 | api.default_value custom_field.default_value
33 | api.editable custom_field.editable
34 | api.visible custom_field.visible?
35 | api.multiple custom_field.multiple?
36 | api.format_store custom_field.format_store
37 | api.description custom_field.description.squish
38 | end
39 | end
40 | end
41 |
42 | api.array :statuses do
43 | @statuses.each do |status|
44 | api.status do
45 | api.status_id status.id
46 | api.name status.name
47 | api.is_closed status.is_closed
48 | api.position status.position
49 | api.default_done_ratio status.default_done_ratio
50 | api.array :permissions do
51 | @permissions[status.id].each do |perm|
52 | api.permission :field => perm[0], :permission => perm[1][0]
53 | end
54 | end
55 | end
56 | end
57 | end
58 |
59 | end
60 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Redmine Shared API
2 | -------
3 |
4 | This is a plugin share some endpoints of API.
5 |
6 | ### New endpoints for NON-admin users
7 |
8 | #### [GET] /shared/custom_fields.xml | .json
9 | #### [GET] /shared/users.xml | .json
10 |
11 | ##### Response
12 | ```
13 |
14 |
15 | 1
16 | user
17 | Alex
18 | Black
19 | anton@ahausoftware.com
20 | 2015-03-18T00:08:44Z
21 | 2016-03-31T15:18:41Z
22 | http://www.gravatar.com/avatar/f1f7086b63fa35b7588614516fade808?rating=PG&size=50&default=monsterid
23 |
24 |
25 | ```
26 | ##### Comments
27 | login - display only for admin or if the user is current
28 |
29 | mail - display only for admin or if the user swith off 'Hide my email address' in Preferences
30 |
31 | avatar_url - display if option 'Use Gravatar user icons' is enabled in Settings
32 |
33 |
34 | #### [GET] /shared/settings.xml | .json
35 | ##### Response
36 | ```
37 |
38 | textile
39 | false
40 | wavatar
41 | Redmine 3.1.1.stable
42 |
43 |
44 | ```
45 |
46 | #### [GET] /shared/projects.xml | .json
47 |
48 | #### [GET] /shared/workflow/transitions.xml?role_id={id}&tracker_id={id} | .json
49 | #### [GET] /shared/workflow/permissions.xml?role_id={id}&tracker_id={id} | .json
50 |
51 | ### New endpoints for NON authorized (public) users:
52 |
53 | #### [GET] /public/settings.xml | .json
54 | ##### Response
55 | ```
56 |
57 | true
58 | 0.0.6
59 |
60 | ```
61 |
62 | How to use
63 | -------
64 | ```
65 | $ cd /path/to/redmine/plugins
66 | $ git clone git://github.com/ANovitsky/redmine_shared_api.git redmine_shared_api
67 | ```
68 | Then restart redmine.
69 |
70 | Compatible with: Redmine 4.0.x, 3.2.x, 3.1.x, 3.0.x, 2.6.x, 2.5.x
71 |
72 | License
73 | -------
74 |
75 | This plugin is released under the GPL v2 license. See
76 | LICENSE for more information.
77 |
78 | Powered by [www.ahausoftware.com](https://www.ahausoftware.com/redmine-outlook)
79 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 2, June 1991
3 |
4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6 | Everyone is permitted to copy and distribute verbatim copies
7 | of this license document, but changing it is not allowed.
8 |
9 | Preamble
10 |
11 | The licenses for most software are designed to take away your
12 | freedom to share and change it. By contrast, the GNU General Public
13 | License is intended to guarantee your freedom to share and change free
14 | software--to make sure the software is free for all its users. This
15 | General Public License applies to most of the Free Software
16 | Foundation's software and to any other program whose authors commit to
17 | using it. (Some other Free Software Foundation software is covered by
18 | the GNU Lesser General Public License instead.) You can apply it to
19 | your programs, too.
20 |
21 | When we speak of free software, we are referring to freedom, not
22 | price. Our General Public Licenses are designed to make sure that you
23 | have the freedom to distribute copies of free software (and charge for
24 | this service if you wish), that you receive source code or can get it
25 | if you want it, that you can change the software or use pieces of it
26 | in new free programs; and that you know you can do these things.
27 |
28 | To protect your rights, we need to make restrictions that forbid
29 | anyone to deny you these rights or to ask you to surrender the rights.
30 | These restrictions translate to certain responsibilities for you if you
31 | distribute copies of the software, or if you modify it.
32 |
33 | For example, if you distribute copies of such a program, whether
34 | gratis or for a fee, you must give the recipients all the rights that
35 | you have. You must make sure that they, too, receive or can get the
36 | source code. And you must show them these terms so they know their
37 | rights.
38 |
39 | We protect your rights with two steps: (1) copyright the software, and
40 | (2) offer you this license which gives you legal permission to copy,
41 | distribute and/or modify the software.
42 |
43 | Also, for each author's protection and ours, we want to make certain
44 | that everyone understands that there is no warranty for this free
45 | software. If the software is modified by someone else and passed on, we
46 | want its recipients to know that what they have is not the original, so
47 | that any problems introduced by others will not reflect on the original
48 | authors' reputations.
49 |
50 | Finally, any free program is threatened constantly by software
51 | patents. We wish to avoid the danger that redistributors of a free
52 | program will individually obtain patent licenses, in effect making the
53 | program proprietary. To prevent this, we have made it clear that any
54 | patent must be licensed for everyone's free use or not licensed at all.
55 |
56 | The precise terms and conditions for copying, distribution and
57 | modification follow.
58 |
59 | GNU GENERAL PUBLIC LICENSE
60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61 |
62 | 0. This License applies to any program or other work which contains
63 | a notice placed by the copyright holder saying it may be distributed
64 | under the terms of this General Public License. The "Program", below,
65 | refers to any such program or work, and a "work based on the Program"
66 | means either the Program or any derivative work under copyright law:
67 | that is to say, a work containing the Program or a portion of it,
68 | either verbatim or with modifications and/or translated into another
69 | language. (Hereinafter, translation is included without limitation in
70 | the term "modification".) Each licensee is addressed as "you".
71 |
72 | Activities other than copying, distribution and modification are not
73 | covered by this License; they are outside its scope. The act of
74 | running the Program is not restricted, and the output from the Program
75 | is covered only if its contents constitute a work based on the
76 | Program (independent of having been made by running the Program).
77 | Whether that is true depends on what the Program does.
78 |
79 | 1. You may copy and distribute verbatim copies of the Program's
80 | source code as you receive it, in any medium, provided that you
81 | conspicuously and appropriately publish on each copy an appropriate
82 | copyright notice and disclaimer of warranty; keep intact all the
83 | notices that refer to this License and to the absence of any warranty;
84 | and give any other recipients of the Program a copy of this License
85 | along with the Program.
86 |
87 | You may charge a fee for the physical act of transferring a copy, and
88 | you may at your option offer warranty protection in exchange for a fee.
89 |
90 | 2. You may modify your copy or copies of the Program or any portion
91 | of it, thus forming a work based on the Program, and copy and
92 | distribute such modifications or work under the terms of Section 1
93 | above, provided that you also meet all of these conditions:
94 |
95 | a) You must cause the modified files to carry prominent notices
96 | stating that you changed the files and the date of any change.
97 |
98 | b) You must cause any work that you distribute or publish, that in
99 | whole or in part contains or is derived from the Program or any
100 | part thereof, to be licensed as a whole at no charge to all third
101 | parties under the terms of this License.
102 |
103 | c) If the modified program normally reads commands interactively
104 | when run, you must cause it, when started running for such
105 | interactive use in the most ordinary way, to print or display an
106 | announcement including an appropriate copyright notice and a
107 | notice that there is no warranty (or else, saying that you provide
108 | a warranty) and that users may redistribute the program under
109 | these conditions, and telling the user how to view a copy of this
110 | License. (Exception: if the Program itself is interactive but
111 | does not normally print such an announcement, your work based on
112 | the Program is not required to print an announcement.)
113 |
114 | These requirements apply to the modified work as a whole. If
115 | identifiable sections of that work are not derived from the Program,
116 | and can be reasonably considered independent and separate works in
117 | themselves, then this License, and its terms, do not apply to those
118 | sections when you distribute them as separate works. But when you
119 | distribute the same sections as part of a whole which is a work based
120 | on the Program, the distribution of the whole must be on the terms of
121 | this License, whose permissions for other licensees extend to the
122 | entire whole, and thus to each and every part regardless of who wrote it.
123 |
124 | Thus, it is not the intent of this section to claim rights or contest
125 | your rights to work written entirely by you; rather, the intent is to
126 | exercise the right to control the distribution of derivative or
127 | collective works based on the Program.
128 |
129 | In addition, mere aggregation of another work not based on the Program
130 | with the Program (or with a work based on the Program) on a volume of
131 | a storage or distribution medium does not bring the other work under
132 | the scope of this License.
133 |
134 | 3. You may copy and distribute the Program (or a work based on it,
135 | under Section 2) in object code or executable form under the terms of
136 | Sections 1 and 2 above provided that you also do one of the following:
137 |
138 | a) Accompany it with the complete corresponding machine-readable
139 | source code, which must be distributed under the terms of Sections
140 | 1 and 2 above on a medium customarily used for software interchange; or,
141 |
142 | b) Accompany it with a written offer, valid for at least three
143 | years, to give any third party, for a charge no more than your
144 | cost of physically performing source distribution, a complete
145 | machine-readable copy of the corresponding source code, to be
146 | distributed under the terms of Sections 1 and 2 above on a medium
147 | customarily used for software interchange; or,
148 |
149 | c) Accompany it with the information you received as to the offer
150 | to distribute corresponding source code. (This alternative is
151 | allowed only for noncommercial distribution and only if you
152 | received the program in object code or executable form with such
153 | an offer, in accord with Subsection b above.)
154 |
155 | The source code for a work means the preferred form of the work for
156 | making modifications to it. For an executable work, complete source
157 | code means all the source code for all modules it contains, plus any
158 | associated interface definition files, plus the scripts used to
159 | control compilation and installation of the executable. However, as a
160 | special exception, the source code distributed need not include
161 | anything that is normally distributed (in either source or binary
162 | form) with the major components (compiler, kernel, and so on) of the
163 | operating system on which the executable runs, unless that component
164 | itself accompanies the executable.
165 |
166 | If distribution of executable or object code is made by offering
167 | access to copy from a designated place, then offering equivalent
168 | access to copy the source code from the same place counts as
169 | distribution of the source code, even though third parties are not
170 | compelled to copy the source along with the object code.
171 |
172 | 4. You may not copy, modify, sublicense, or distribute the Program
173 | except as expressly provided under this License. Any attempt
174 | otherwise to copy, modify, sublicense or distribute the Program is
175 | void, and will automatically terminate your rights under this License.
176 | However, parties who have received copies, or rights, from you under
177 | this License will not have their licenses terminated so long as such
178 | parties remain in full compliance.
179 |
180 | 5. You are not required to accept this License, since you have not
181 | signed it. However, nothing else grants you permission to modify or
182 | distribute the Program or its derivative works. These actions are
183 | prohibited by law if you do not accept this License. Therefore, by
184 | modifying or distributing the Program (or any work based on the
185 | Program), you indicate your acceptance of this License to do so, and
186 | all its terms and conditions for copying, distributing or modifying
187 | the Program or works based on it.
188 |
189 | 6. Each time you redistribute the Program (or any work based on the
190 | Program), the recipient automatically receives a license from the
191 | original licensor to copy, distribute or modify the Program subject to
192 | these terms and conditions. You may not impose any further
193 | restrictions on the recipients' exercise of the rights granted herein.
194 | You are not responsible for enforcing compliance by third parties to
195 | this License.
196 |
197 | 7. If, as a consequence of a court judgment or allegation of patent
198 | infringement or for any other reason (not limited to patent issues),
199 | conditions are imposed on you (whether by court order, agreement or
200 | otherwise) that contradict the conditions of this License, they do not
201 | excuse you from the conditions of this License. If you cannot
202 | distribute so as to satisfy simultaneously your obligations under this
203 | License and any other pertinent obligations, then as a consequence you
204 | may not distribute the Program at all. For example, if a patent
205 | license would not permit royalty-free redistribution of the Program by
206 | all those who receive copies directly or indirectly through you, then
207 | the only way you could satisfy both it and this License would be to
208 | refrain entirely from distribution of the Program.
209 |
210 | If any portion of this section is held invalid or unenforceable under
211 | any particular circumstance, the balance of the section is intended to
212 | apply and the section as a whole is intended to apply in other
213 | circumstances.
214 |
215 | It is not the purpose of this section to induce you to infringe any
216 | patents or other property right claims or to contest validity of any
217 | such claims; this section has the sole purpose of protecting the
218 | integrity of the free software distribution system, which is
219 | implemented by public license practices. Many people have made
220 | generous contributions to the wide range of software distributed
221 | through that system in reliance on consistent application of that
222 | system; it is up to the author/donor to decide if he or she is willing
223 | to distribute software through any other system and a licensee cannot
224 | impose that choice.
225 |
226 | This section is intended to make thoroughly clear what is believed to
227 | be a consequence of the rest of this License.
228 |
229 | 8. If the distribution and/or use of the Program is restricted in
230 | certain countries either by patents or by copyrighted interfaces, the
231 | original copyright holder who places the Program under this License
232 | may add an explicit geographical distribution limitation excluding
233 | those countries, so that distribution is permitted only in or among
234 | countries not thus excluded. In such case, this License incorporates
235 | the limitation as if written in the body of this License.
236 |
237 | 9. The Free Software Foundation may publish revised and/or new versions
238 | of the General Public License from time to time. Such new versions will
239 | be similar in spirit to the present version, but may differ in detail to
240 | address new problems or concerns.
241 |
242 | Each version is given a distinguishing version number. If the Program
243 | specifies a version number of this License which applies to it and "any
244 | later version", you have the option of following the terms and conditions
245 | either of that version or of any later version published by the Free
246 | Software Foundation. If the Program does not specify a version number of
247 | this License, you may choose any version ever published by the Free Software
248 | Foundation.
249 |
250 | 10. If you wish to incorporate parts of the Program into other free
251 | programs whose distribution conditions are different, write to the author
252 | to ask for permission. For software which is copyrighted by the Free
253 | Software Foundation, write to the Free Software Foundation; we sometimes
254 | make exceptions for this. Our decision will be guided by the two goals
255 | of preserving the free status of all derivatives of our free software and
256 | of promoting the sharing and reuse of software generally.
257 |
258 | NO WARRANTY
259 |
260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268 | REPAIR OR CORRECTION.
269 |
270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278 | POSSIBILITY OF SUCH DAMAGES.
279 |
280 | END OF TERMS AND CONDITIONS
281 |
282 | How to Apply These Terms to Your New Programs
283 |
284 | If you develop a new program, and you want it to be of the greatest
285 | possible use to the public, the best way to achieve this is to make it
286 | free software which everyone can redistribute and change under these terms.
287 |
288 | To do so, attach the following notices to the program. It is safest
289 | to attach them to the start of each source file to most effectively
290 | convey the exclusion of warranty; and each file should have at least
291 | the "copyright" line and a pointer to where the full notice is found.
292 |
293 | {description}
294 | Copyright (C) {year} {fullname}
295 |
296 | This program is free software; you can redistribute it and/or modify
297 | it under the terms of the GNU General Public License as published by
298 | the Free Software Foundation; either version 2 of the License, or
299 | (at your option) any later version.
300 |
301 | This program is distributed in the hope that it will be useful,
302 | but WITHOUT ANY WARRANTY; without even the implied warranty of
303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304 | GNU General Public License for more details.
305 |
306 | You should have received a copy of the GNU General Public License along
307 | with this program; if not, write to the Free Software Foundation, Inc.,
308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309 |
310 | Also add information on how to contact you by electronic and paper mail.
311 |
312 | If the program is interactive, make it output a short notice like this
313 | when it starts in an interactive mode:
314 |
315 | Gnomovision version 69, Copyright (C) year name of author
316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317 | This is free software, and you are welcome to redistribute it
318 | under certain conditions; type `show c' for details.
319 |
320 | The hypothetical commands `show w' and `show c' should show the appropriate
321 | parts of the General Public License. Of course, the commands you use may
322 | be called something other than `show w' and `show c'; they could even be
323 | mouse-clicks or menu items--whatever suits your program.
324 |
325 | You should also get your employer (if you work as a programmer) or your
326 | school, if any, to sign a "copyright disclaimer" for the program, if
327 | necessary. Here is a sample; alter the names:
328 |
329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330 | `Gnomovision' (which makes passes at compilers) written by James Hacker.
331 |
332 | {signature of Ty Coon}, 1 April 1989
333 | Ty Coon, President of Vice
334 |
335 | This General Public License does not permit incorporating your program into
336 | proprietary programs. If your program is a subroutine library, you may
337 | consider it more useful to permit linking proprietary applications with the
338 | library. If this is what you want to do, use the GNU Lesser General
339 | Public License instead of this License.
340 |
341 |
--------------------------------------------------------------------------------