1//
2// Copyright 2017, Sander van Harmelen
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17package gitlab
18
19import "time"
20
21// SettingsService handles communication with the application SettingsService
22// related methods of the GitLab API.
23//
24// GitLab API docs: https://docs.gitlab.com/ce/api/settings.html
25type SettingsService struct {
26 client *Client
27}
28
29// Settings represents the GitLab application settings.
30//
31// GitLab API docs: https://docs.gitlab.com/ce/api/settings.html
32type Settings struct {
33 ID int `json:"id"`
34 CreatedAt *time.Time `json:"created_at"`
35 UpdatedAt *time.Time `json:"updated_at"`
36 AdminNotificationEmail string `json:"admin_notification_email"`
37 AfterSignOutPath string `json:"after_sign_out_path"`
38 AfterSignUpText string `json:"after_sign_up_text"`
39 AkismetAPIKey string `json:"akismet_api_key"`
40 AkismetEnabled bool `json:"akismet_enabled"`
41 CircuitbreakerAccessRetries int `json:"circuitbreaker_access_retries"`
42 CircuitbreakerBackoffThreshold int `json:"circuitbreaker_backoff_threshold"`
43 CircuitbreakerFailureCountThreshold int `json:"circuitbreaker_failure_count_threshold"`
44 CircuitbreakerFailureResetTime int `json:"circuitbreaker_failure_reset_time"`
45 CircuitbreakerFailureWaitTime int `json:"circuitbreaker_failure_wait_time"`
46 CircuitbreakerStorageTimeout int `json:"circuitbreaker_storage_timeout"`
47 ClientsideSentryDSN string `json:"clientside_sentry_dsn"`
48 ClientsideSentryEnabled bool `json:"clientside_sentry_enabled"`
49 ContainerRegistryTokenExpireDelay int `json:"container_registry_token_expire_delay"`
50 DefaultArtifactsExpireIn string `json:"default_artifacts_expire_in"`
51 DefaultBranchProtection int `json:"default_branch_protection"`
52 DefaultGroupVisibility string `json:"default_group_visibility"`
53 DefaultProjectVisibility string `json:"default_project_visibility"`
54 DefaultProjectsLimit int `json:"default_projects_limit"`
55 DefaultSnippetVisibility string `json:"default_snippet_visibility"`
56 DisabledOauthSignInSources []string `json:"disabled_oauth_sign_in_sources"`
57 DomainBlacklistEnabled bool `json:"domain_blacklist_enabled"`
58 DomainBlacklist []string `json:"domain_blacklist"`
59 DomainWhitelist []string `json:"domain_whitelist"`
60 DSAKeyRestriction int `json:"dsa_key_restriction"`
61 ECDSAKeyRestriction int `json:"ecdsa_key_restriction"`
62 Ed25519KeyRestriction int `json:"ed25519_key_restriction"`
63 EmailAuthorInBody bool `json:"email_author_in_body"`
64 EnabledGitAccessProtocol string `json:"enabled_git_access_protocol"`
65 GravatarEnabled bool `json:"gravatar_enabled"`
66 HelpPageHideCommercialContent bool `json:"help_page_hide_commercial_content"`
67 HelpPageSupportURL string `json:"help_page_support_url"`
68 HomePageURL string `json:"home_page_url"`
69 HousekeepingBitmapsEnabled bool `json:"housekeeping_bitmaps_enabled"`
70 HousekeepingEnabled bool `json:"housekeeping_enabled"`
71 HousekeepingFullRepackPeriod int `json:"housekeeping_full_repack_period"`
72 HousekeepingGcPeriod int `json:"housekeeping_gc_period"`
73 HousekeepingIncrementalRepackPeriod int `json:"housekeeping_incremental_repack_period"`
74 HTMLEmailsEnabled bool `json:"html_emails_enabled"`
75 ImportSources []string `json:"import_sources"`
76 KodingEnabled bool `json:"koding_enabled"`
77 KodingURL string `json:"koding_url"`
78 LocalMarkdownVersion int `json:"local_markdown_version"`
79 MaxArtifactsSize int `json:"max_artifacts_size"`
80 MaxAttachmentSize int `json:"max_attachment_size"`
81 MaxPagesSize int `json:"max_pages_size"`
82 MetricsEnabled bool `json:"metrics_enabled"`
83 MetricsHost string `json:"metrics_host"`
84 MetricsMethodCallThreshold int `json:"metrics_method_call_threshold"`
85 MetricsPacketSize int `json:"metrics_packet_size"`
86 MetricsPoolSize int `json:"metrics_pool_size"`
87 MetricsPort int `json:"metrics_port"`
88 MetricsSampleInterval int `json:"metrics_sample_interval"`
89 MetricsTimeout int `json:"metrics_timeout"`
90 PasswordAuthenticationEnabledForWeb bool `json:"password_authentication_enabled_for_web"`
91 PasswordAuthenticationEnabledForGit bool `json:"password_authentication_enabled_for_git"`
92 PerformanceBarAllowedGroupID string `json:"performance_bar_allowed_group_id"`
93 PerformanceBarEnabled bool `json:"performance_bar_enabled"`
94 PlantumlEnabled bool `json:"plantuml_enabled"`
95 PlantumlURL string `json:"plantuml_url"`
96 PollingIntervalMultiplier float64 `json:"polling_interval_multiplier,string"`
97 ProjectExportEnabled bool `json:"project_export_enabled"`
98 PrometheusMetricsEnabled bool `json:"prometheus_metrics_enabled"`
99 RecaptchaEnabled bool `json:"recaptcha_enabled"`
100 RecaptchaPrivateKey string `json:"recaptcha_private_key"`
101 RecaptchaSiteKey string `json:"recaptcha_site_key"`
102 RepositoryChecksEnabled bool `json:"repository_checks_enabled"`
103 RepositoryStorages []string `json:"repository_storages"`
104 RequireTwoFactorAuthentication bool `json:"require_two_factor_authentication"`
105 RestrictedVisibilityLevels []VisibilityValue `json:"restricted_visibility_levels"`
106 RsaKeyRestriction int `json:"rsa_key_restriction"`
107 SendUserConfirmationEmail bool `json:"send_user_confirmation_email"`
108 SentryDSN string `json:"sentry_dsn"`
109 SentryEnabled bool `json:"sentry_enabled"`
110 SessionExpireDelay int `json:"session_expire_delay"`
111 SharedRunnersEnabled bool `json:"shared_runners_enabled"`
112 SharedRunnersText string `json:"shared_runners_text"`
113 SidekiqThrottlingEnabled bool `json:"sidekiq_throttling_enabled"`
114 SidekiqThrottlingFactor float64 `json:"sidekiq_throttling_factor"`
115 SidekiqThrottlingQueues []string `json:"sidekiq_throttling_queues"`
116 SignInText string `json:"sign_in_text"`
117 SignupEnabled bool `json:"signup_enabled"`
118 TerminalMaxSessionTime int `json:"terminal_max_session_time"`
119 TwoFactorGracePeriod int `json:"two_factor_grace_period"`
120 UniqueIPsLimitEnabled bool `json:"unique_ips_limit_enabled"`
121 UniqueIPsLimitPerUser int `json:"unique_ips_limit_per_user"`
122 UniqueIPsLimitTimeWindow int `json:"unique_ips_limit_time_window"`
123 UsagePingEnabled bool `json:"usage_ping_enabled"`
124 UserDefaultExternal bool `json:"user_default_external"`
125 UserOauthApplications bool `json:"user_oauth_applications"`
126 VersionCheckEnabled bool `json:"version_check_enabled"`
127}
128
129func (s Settings) String() string {
130 return Stringify(s)
131}
132
133// GetSettings gets the current application settings.
134//
135// GitLab API docs:
136// https://docs.gitlab.com/ce/api/settings.html#get-current-application.settings
137func (s *SettingsService) GetSettings(options ...OptionFunc) (*Settings, *Response, error) {
138 req, err := s.client.NewRequest("GET", "application/settings", nil, options)
139 if err != nil {
140 return nil, nil, err
141 }
142
143 as := new(Settings)
144 resp, err := s.client.Do(req, as)
145 if err != nil {
146 return nil, resp, err
147 }
148
149 return as, resp, err
150}
151
152// UpdateSettingsOptions represents the available UpdateSettings() options.
153//
154// GitLab API docs:
155// https://docs.gitlab.com/ce/api/settings.html#change-application.settings
156type UpdateSettingsOptions struct {
157 AdminNotificationEmail *string `url:"admin_notification_email,omitempty" json:"admin_notification_email,omitempty"`
158 AfterSignOutPath *string `url:"after_sign_out_path,omitempty" json:"after_sign_out_path,omitempty"`
159 AfterSignUpText *string `url:"after_sign_up_text,omitempty" json:"after_sign_up_text,omitempty"`
160 AkismetAPIKey *string `url:"akismet_api_key,omitempty" json:"akismet_api_key,omitempty"`
161 AkismetEnabled *bool `url:"akismet_enabled,omitempty" json:"akismet_enabled,omitempty"`
162 CircuitbreakerAccessRetries *int `url:"circuitbreaker_access_retries,omitempty" json:"circuitbreaker_access_retries,omitempty"`
163 CircuitbreakerBackoffThreshold *int `url:"circuitbreaker_backoff_threshold,omitempty" json:"circuitbreaker_backoff_threshold,omitempty"`
164 CircuitbreakerFailureCountThreshold *int `url:"circuitbreaker_failure_count_threshold,omitempty" json:"circuitbreaker_failure_count_threshold,omitempty"`
165 CircuitbreakerFailureResetTime *int `url:"circuitbreaker_failure_reset_time,omitempty" json:"circuitbreaker_failure_reset_time,omitempty"`
166 CircuitbreakerFailureWaitTime *int `url:"circuitbreaker_failure_wait_time,omitempty" json:"circuitbreaker_failure_wait_time,omitempty"`
167 CircuitbreakerStorageTimeout *int `url:"circuitbreaker_storage_timeout,omitempty" json:"circuitbreaker_storage_timeout,omitempty"`
168 ClientsideSentryDSN *string `url:"clientside_sentry_dsn,omitempty" json:"clientside_sentry_dsn,omitempty"`
169 ClientsideSentryEnabled *bool `url:"clientside_sentry_enabled,omitempty" json:"clientside_sentry_enabled,omitempty"`
170 ContainerRegistryTokenExpireDelay *int `url:"container_registry_token_expire_delay,omitempty" json:"container_registry_token_expire_delay,omitempty"`
171 DefaultArtifactsExpireIn *string `url:"default_artifacts_expire_in,omitempty" json:"default_artifacts_expire_in,omitempty"`
172 DefaultBranchProtection *int `url:"default_branch_protection,omitempty" json:"default_branch_protection,omitempty"`
173 DefaultGroupVisibility *string `url:"default_group_visibility,omitempty" json:"default_group_visibility,omitempty"`
174 DefaultProjectVisibility *string `url:"default_project_visibility,omitempty" json:"default_project_visibility,omitempty"`
175 DefaultProjectsLimit *int `url:"default_projects_limit,omitempty" json:"default_projects_limit,omitempty"`
176 DefaultSnippetVisibility *string `url:"default_snippet_visibility,omitempty" json:"default_snippet_visibility,omitempty"`
177 DisabledOauthSignInSources []string `url:"disabled_oauth_sign_in_sources,omitempty" json:"disabled_oauth_sign_in_sources,omitempty"`
178 DomainBlacklistEnabled *bool `url:"domain_blacklist_enabled,omitempty" json:"domain_blacklist_enabled,omitempty"`
179 DomainBlacklist []string `url:"domain_blacklist,omitempty" json:"domain_blacklist,omitempty"`
180 DomainWhitelist []string `url:"domain_whitelist,omitempty" json:"domain_whitelist,omitempty"`
181 DSAKeyRestriction *int `url:"dsa_key_restriction,omitempty" json:"dsa_key_restriction,omitempty"`
182 ECDSAKeyRestriction *int `url:"ecdsa_key_restriction,omitempty" json:"ecdsa_key_restriction,omitempty"`
183 Ed25519KeyRestriction *int `url:"ed25519_key_restriction,omitempty" json:"ed25519_key_restriction,omitempty"`
184 EmailAuthorInBody *bool `url:"email_author_in_body,omitempty" json:"email_author_in_body,omitempty"`
185 EnabledGitAccessProtocol *string `url:"enabled_git_access_protocol,omitempty" json:"enabled_git_access_protocol,omitempty"`
186 GravatarEnabled *bool `url:"gravatar_enabled,omitempty" json:"gravatar_enabled,omitempty"`
187 HelpPageHideCommercialContent *bool `url:"help_page_hide_commercial_content,omitempty" json:"help_page_hide_commercial_content,omitempty"`
188 HelpPageSupportURL *string `url:"help_page_support_url,omitempty" json:"help_page_support_url,omitempty"`
189 HomePageURL *string `url:"home_page_url,omitempty" json:"home_page_url,omitempty"`
190 HousekeepingBitmapsEnabled *bool `url:"housekeeping_bitmaps_enabled,omitempty" json:"housekeeping_bitmaps_enabled,omitempty"`
191 HousekeepingEnabled *bool `url:"housekeeping_enabled,omitempty" json:"housekeeping_enabled,omitempty"`
192 HousekeepingFullRepackPeriod *int `url:"housekeeping_full_repack_period,omitempty" json:"housekeeping_full_repack_period,omitempty"`
193 HousekeepingGcPeriod *int `url:"housekeeping_gc_period,omitempty" json:"housekeeping_gc_period,omitempty"`
194 HousekeepingIncrementalRepackPeriod *int `url:"housekeeping_incremental_repack_period,omitempty" json:"housekeeping_incremental_repack_period,omitempty"`
195 HTMLEmailsEnabled *bool `url:"html_emails_enabled,omitempty" json:"html_emails_enabled,omitempty"`
196 ImportSources []string `url:"import_sources,omitempty" json:"import_sources,omitempty"`
197 KodingEnabled *bool `url:"koding_enabled,omitempty" json:"koding_enabled,omitempty"`
198 KodingURL *string `url:"koding_url,omitempty" json:"koding_url,omitempty"`
199 LocalMarkdownVersion *int `url:"local_markdown_version,omitempty" json:"local_markdown_version,omitempty"`
200 MaxArtifactsSize *int `url:"max_artifacts_size,omitempty" json:"max_artifacts_size,omitempty"`
201 MaxAttachmentSize *int `url:"max_attachment_size,omitempty" json:"max_attachment_size,omitempty"`
202 MaxPagesSize *int `url:"max_pages_size,omitempty" json:"max_pages_size,omitempty"`
203 MetricsEnabled *bool `url:"metrics_enabled,omitempty" json:"metrics_enabled,omitempty"`
204 MetricsHost *string `url:"metrics_host,omitempty" json:"metrics_host,omitempty"`
205 MetricsMethodCallThreshold *int `url:"metrics_method_call_threshold,omitempty" json:"metrics_method_call_threshold,omitempty"`
206 MetricsPacketSize *int `url:"metrics_packet_size,omitempty" json:"metrics_packet_size,omitempty"`
207 MetricsPoolSize *int `url:"metrics_pool_size,omitempty" json:"metrics_pool_size,omitempty"`
208 MetricsPort *int `url:"metrics_port,omitempty" json:"metrics_port,omitempty"`
209 MetricsSampleInterval *int `url:"metrics_sample_interval,omitempty" json:"metrics_sample_interval,omitempty"`
210 MetricsTimeout *int `url:"metrics_timeout,omitempty" json:"metrics_timeout,omitempty"`
211 PasswordAuthenticationEnabledForWeb *bool `url:"password_authentication_enabled_for_web,omitempty" json:"password_authentication_enabled_for_web,omitempty"`
212 PasswordAuthenticationEnabledForGit *bool `url:"password_authentication_enabled_for_git,omitempty" json:"password_authentication_enabled_for_git,omitempty"`
213 PerformanceBarAllowedGroupID *string `url:"performance_bar_allowed_group_id,omitempty" json:"performance_bar_allowed_group_id,omitempty"`
214 PerformanceBarEnabled *bool `url:"performance_bar_enabled,omitempty" json:"performance_bar_enabled,omitempty"`
215 PlantumlEnabled *bool `url:"plantuml_enabled,omitempty" json:"plantuml_enabled,omitempty"`
216 PlantumlURL *string `url:"plantuml_url,omitempty" json:"plantuml_url,omitempty"`
217 PollingIntervalMultiplier *float64 `url:"polling_interval_multiplier,omitempty" json:"polling_interval_multiplier,omitempty"`
218 ProjectExportEnabled *bool `url:"project_export_enabled,omitempty" json:"project_export_enabled,omitempty"`
219 PrometheusMetricsEnabled *bool `url:"prometheus_metrics_enabled,omitempty" json:"prometheus_metrics_enabled,omitempty"`
220 RecaptchaEnabled *bool `url:"recaptcha_enabled,omitempty" json:"recaptcha_enabled,omitempty"`
221 RecaptchaPrivateKey *string `url:"recaptcha_private_key,omitempty" json:"recaptcha_private_key,omitempty"`
222 RecaptchaSiteKey *string `url:"recaptcha_site_key,omitempty" json:"recaptcha_site_key,omitempty"`
223 RepositoryChecksEnabled *bool `url:"repository_checks_enabled,omitempty" json:"repository_checks_enabled,omitempty"`
224 RepositoryStorages []string `url:"repository_storages,omitempty" json:"repository_storages,omitempty"`
225 RequireTwoFactorAuthentication *bool `url:"require_two_factor_authentication,omitempty" json:"require_two_factor_authentication,omitempty"`
226 RestrictedVisibilityLevels []VisibilityValue `url:"restricted_visibility_levels,omitempty" json:"restricted_visibility_levels,omitempty"`
227 RsaKeyRestriction *int `url:"rsa_key_restriction,omitempty" json:"rsa_key_restriction,omitempty"`
228 SendUserConfirmationEmail *bool `url:"send_user_confirmation_email,omitempty" json:"send_user_confirmation_email,omitempty"`
229 SentryDSN *string `url:"sentry_dsn,omitempty" json:"sentry_dsn,omitempty"`
230 SentryEnabled *bool `url:"sentry_enabled,omitempty" json:"sentry_enabled,omitempty"`
231 SessionExpireDelay *int `url:"session_expire_delay,omitempty" json:"session_expire_delay,omitempty"`
232 SharedRunnersEnabled *bool `url:"shared_runners_enabled,omitempty" json:"shared_runners_enabled,omitempty"`
233 SharedRunnersText *string `url:"shared_runners_text,omitempty" json:"shared_runners_text,omitempty"`
234 SidekiqThrottlingEnabled *bool `url:"sidekiq_throttling_enabled,omitempty" json:"sidekiq_throttling_enabled,omitempty"`
235 SidekiqThrottlingFactor *float64 `url:"sidekiq_throttling_factor,omitempty" json:"sidekiq_throttling_factor,omitempty"`
236 SidekiqThrottlingQueues []string `url:"sidekiq_throttling_queues,omitempty" json:"sidekiq_throttling_queues,omitempty"`
237 SignInText *string `url:"sign_in_text,omitempty" json:"sign_in_text,omitempty"`
238 SignupEnabled *bool `url:"signup_enabled,omitempty" json:"signup_enabled,omitempty"`
239 TerminalMaxSessionTime *int `url:"terminal_max_session_time,omitempty" json:"terminal_max_session_time,omitempty"`
240 TwoFactorGracePeriod *int `url:"two_factor_grace_period,omitempty" json:"two_factor_grace_period,omitempty"`
241 UniqueIPsLimitEnabled *bool `url:"unique_ips_limit_enabled,omitempty" json:"unique_ips_limit_enabled,omitempty"`
242 UniqueIPsLimitPerUser *int `url:"unique_ips_limit_per_user,omitempty" json:"unique_ips_limit_per_user,omitempty"`
243 UniqueIPsLimitTimeWindow *int `url:"unique_ips_limit_time_window,omitempty" json:"unique_ips_limit_time_window,omitempty"`
244 UsagePingEnabled *bool `url:"usage_ping_enabled,omitempty" json:"usage_ping_enabled,omitempty"`
245 UserDefaultExternal *bool `url:"user_default_external,omitempty" json:"user_default_external,omitempty"`
246 UserOauthApplications *bool `url:"user_oauth_applications,omitempty" json:"user_oauth_applications,omitempty"`
247 VersionCheckEnabled *bool `url:"version_check_enabled,omitempty" json:"version_check_enabled,omitempty"`
248}
249
250// UpdateSettings updates the application settings.
251//
252// GitLab API docs:
253// https://docs.gitlab.com/ce/api/settings.html#change-application.settings
254func (s *SettingsService) UpdateSettings(opt *UpdateSettingsOptions, options ...OptionFunc) (*Settings, *Response, error) {
255 req, err := s.client.NewRequest("PUT", "application/settings", opt, options)
256 if err != nil {
257 return nil, nil, err
258 }
259
260 as := new(Settings)
261 resp, err := s.client.Do(req, as)
262 if err != nil {
263 return nil, resp, err
264 }
265
266 return as, resp, err
267}