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 MaxArtifactsSize int `json:"max_artifacts_size"`
79 MaxAttachmentSize int `json:"max_attachment_size"`
80 MaxPagesSize int `json:"max_pages_size"`
81 MetricsEnabled bool `json:"metrics_enabled"`
82 MetricsHost string `json:"metrics_host"`
83 MetricsMethodCallThreshold int `json:"metrics_method_call_threshold"`
84 MetricsPacketSize int `json:"metrics_packet_size"`
85 MetricsPoolSize int `json:"metrics_pool_size"`
86 MetricsPort int `json:"metrics_port"`
87 MetricsSampleInterval int `json:"metrics_sample_interval"`
88 MetricsTimeout int `json:"metrics_timeout"`
89 PasswordAuthenticationEnabledForWeb bool `json:"password_authentication_enabled_for_web"`
90 PasswordAuthenticationEnabledForGit bool `json:"password_authentication_enabled_for_git"`
91 PerformanceBarAllowedGroupID string `json:"performance_bar_allowed_group_id"`
92 PerformanceBarEnabled bool `json:"performance_bar_enabled"`
93 PlantumlEnabled bool `json:"plantuml_enabled"`
94 PlantumlURL string `json:"plantuml_url"`
95 PollingIntervalMultiplier float64 `json:"polling_interval_multiplier"`
96 ProjectExportEnabled bool `json:"project_export_enabled"`
97 PrometheusMetricsEnabled bool `json:"prometheus_metrics_enabled"`
98 RecaptchaEnabled bool `json:"recaptcha_enabled"`
99 RecaptchaPrivateKey string `json:"recaptcha_private_key"`
100 RecaptchaSiteKey string `json:"recaptcha_site_key"`
101 RepositoryChecksEnabled bool `json:"repository_checks_enabled"`
102 RepositoryStorages []string `json:"repository_storages"`
103 RequireTwoFactorAuthentication bool `json:"require_two_factor_authentication"`
104 RestrictedVisibilityLevels []VisibilityValue `json:"restricted_visibility_levels"`
105 RsaKeyRestriction int `json:"rsa_key_restriction"`
106 SendUserConfirmationEmail bool `json:"send_user_confirmation_email"`
107 SentryDSN string `json:"sentry_dsn"`
108 SentryEnabled bool `json:"sentry_enabled"`
109 SessionExpireDelay int `json:"session_expire_delay"`
110 SharedRunnersEnabled bool `json:"shared_runners_enabled"`
111 SharedRunnersText string `json:"shared_runners_text"`
112 SidekiqThrottlingEnabled bool `json:"sidekiq_throttling_enabled"`
113 SidekiqThrottlingFactor float64 `json:"sidekiq_throttling_factor"`
114 SidekiqThrottlingQueues []string `json:"sidekiq_throttling_queues"`
115 SignInText string `json:"sign_in_text"`
116 SignupEnabled bool `json:"signup_enabled"`
117 TerminalMaxSessionTime int `json:"terminal_max_session_time"`
118 TwoFactorGracePeriod int `json:"two_factor_grace_period"`
119 UniqueIPsLimitEnabled bool `json:"unique_ips_limit_enabled"`
120 UniqueIPsLimitPerUser int `json:"unique_ips_limit_per_user"`
121 UniqueIPsLimitTimeWindow int `json:"unique_ips_limit_time_window"`
122 UsagePingEnabled bool `json:"usage_ping_enabled"`
123 UserDefaultExternal bool `json:"user_default_external"`
124 UserOauthApplications bool `json:"user_oauth_applications"`
125 VersionCheckEnabled bool `json:"version_check_enabled"`
126}
127
128func (s Settings) String() string {
129 return Stringify(s)
130}
131
132// GetSettings gets the current application settings.
133//
134// GitLab API docs:
135// https://docs.gitlab.com/ce/api/settings.html#get-current-application.settings
136func (s *SettingsService) GetSettings(options ...OptionFunc) (*Settings, *Response, error) {
137 req, err := s.client.NewRequest("GET", "application/settings", nil, options)
138 if err != nil {
139 return nil, nil, err
140 }
141
142 as := new(Settings)
143 resp, err := s.client.Do(req, as)
144 if err != nil {
145 return nil, resp, err
146 }
147
148 return as, resp, err
149}
150
151// UpdateSettingsOptions represents the available UpdateSettings() options.
152//
153// GitLab API docs:
154// https://docs.gitlab.com/ce/api/settings.html#change-application.settings
155type UpdateSettingsOptions struct {
156 AdminNotificationEmail *string `url:"admin_notification_email,omitempty" json:"admin_notification_email,omitempty"`
157 AfterSignOutPath *string `url:"after_sign_out_path,omitempty" json:"after_sign_out_path,omitempty"`
158 AfterSignUpText *string `url:"after_sign_up_text,omitempty" json:"after_sign_up_text,omitempty"`
159 AkismetAPIKey *string `url:"akismet_api_key,omitempty" json:"akismet_api_key,omitempty"`
160 AkismetEnabled *bool `url:"akismet_enabled,omitempty" json:"akismet_enabled,omitempty"`
161 CircuitbreakerAccessRetries *int `url:"circuitbreaker_access_retries,omitempty" json:"circuitbreaker_access_retries,omitempty"`
162 CircuitbreakerBackoffThreshold *int `url:"circuitbreaker_backoff_threshold,omitempty" json:"circuitbreaker_backoff_threshold,omitempty"`
163 CircuitbreakerFailureCountThreshold *int `url:"circuitbreaker_failure_count_threshold,omitempty" json:"circuitbreaker_failure_count_threshold,omitempty"`
164 CircuitbreakerFailureResetTime *int `url:"circuitbreaker_failure_reset_time,omitempty" json:"circuitbreaker_failure_reset_time,omitempty"`
165 CircuitbreakerFailureWaitTime *int `url:"circuitbreaker_failure_wait_time,omitempty" json:"circuitbreaker_failure_wait_time,omitempty"`
166 CircuitbreakerStorageTimeout *int `url:"circuitbreaker_storage_timeout,omitempty" json:"circuitbreaker_storage_timeout,omitempty"`
167 ClientsideSentryDSN *string `url:"clientside_sentry_dsn,omitempty" json:"clientside_sentry_dsn,omitempty"`
168 ClientsideSentryEnabled *bool `url:"clientside_sentry_enabled,omitempty" json:"clientside_sentry_enabled,omitempty"`
169 ContainerRegistryTokenExpireDelay *int `url:"container_registry_token_expire_delay,omitempty" json:"container_registry_token_expire_delay,omitempty"`
170 DefaultArtifactsExpireIn *string `url:"default_artifacts_expire_in,omitempty" json:"default_artifacts_expire_in,omitempty"`
171 DefaultBranchProtection *int `url:"default_branch_protection,omitempty" json:"default_branch_protection,omitempty"`
172 DefaultGroupVisibility *string `url:"default_group_visibility,omitempty" json:"default_group_visibility,omitempty"`
173 DefaultProjectVisibility *string `url:"default_project_visibility,omitempty" json:"default_project_visibility,omitempty"`
174 DefaultProjectsLimit *int `url:"default_projects_limit,omitempty" json:"default_projects_limit,omitempty"`
175 DefaultSnippetVisibility *string `url:"default_snippet_visibility,omitempty" json:"default_snippet_visibility,omitempty"`
176 DisabledOauthSignInSources []string `url:"disabled_oauth_sign_in_sources,omitempty" json:"disabled_oauth_sign_in_sources,omitempty"`
177 DomainBlacklistEnabled *bool `url:"domain_blacklist_enabled,omitempty" json:"domain_blacklist_enabled,omitempty"`
178 DomainBlacklist []string `url:"domain_blacklist,omitempty" json:"domain_blacklist,omitempty"`
179 DomainWhitelist []string `url:"domain_whitelist,omitempty" json:"domain_whitelist,omitempty"`
180 DSAKeyRestriction *int `url:"dsa_key_restriction,omitempty" json:"dsa_key_restriction,omitempty"`
181 ECDSAKeyRestriction *int `url:"ecdsa_key_restriction,omitempty" json:"ecdsa_key_restriction,omitempty"`
182 Ed25519KeyRestriction *int `url:"ed25519_key_restriction,omitempty" json:"ed25519_key_restriction,omitempty"`
183 EmailAuthorInBody *bool `url:"email_author_in_body,omitempty" json:"email_author_in_body,omitempty"`
184 EnabledGitAccessProtocol *string `url:"enabled_git_access_protocol,omitempty" json:"enabled_git_access_protocol,omitempty"`
185 GravatarEnabled *bool `url:"gravatar_enabled,omitempty" json:"gravatar_enabled,omitempty"`
186 HelpPageHideCommercialContent *bool `url:"help_page_hide_commercial_content,omitempty" json:"help_page_hide_commercial_content,omitempty"`
187 HelpPageSupportURL *string `url:"help_page_support_url,omitempty" json:"help_page_support_url,omitempty"`
188 HomePageURL *string `url:"home_page_url,omitempty" json:"home_page_url,omitempty"`
189 HousekeepingBitmapsEnabled *bool `url:"housekeeping_bitmaps_enabled,omitempty" json:"housekeeping_bitmaps_enabled,omitempty"`
190 HousekeepingEnabled *bool `url:"housekeeping_enabled,omitempty" json:"housekeeping_enabled,omitempty"`
191 HousekeepingFullRepackPeriod *int `url:"housekeeping_full_repack_period,omitempty" json:"housekeeping_full_repack_period,omitempty"`
192 HousekeepingGcPeriod *int `url:"housekeeping_gc_period,omitempty" json:"housekeeping_gc_period,omitempty"`
193 HousekeepingIncrementalRepackPeriod *int `url:"housekeeping_incremental_repack_period,omitempty" json:"housekeeping_incremental_repack_period,omitempty"`
194 HTMLEmailsEnabled *bool `url:"html_emails_enabled,omitempty" json:"html_emails_enabled,omitempty"`
195 ImportSources []string `url:"import_sources,omitempty" json:"import_sources,omitempty"`
196 KodingEnabled *bool `url:"koding_enabled,omitempty" json:"koding_enabled,omitempty"`
197 KodingURL *string `url:"koding_url,omitempty" json:"koding_url,omitempty"`
198 MaxArtifactsSize *int `url:"max_artifacts_size,omitempty" json:"max_artifacts_size,omitempty"`
199 MaxAttachmentSize *int `url:"max_attachment_size,omitempty" json:"max_attachment_size,omitempty"`
200 MaxPagesSize *int `url:"max_pages_size,omitempty" json:"max_pages_size,omitempty"`
201 MetricsEnabled *bool `url:"metrics_enabled,omitempty" json:"metrics_enabled,omitempty"`
202 MetricsHost *string `url:"metrics_host,omitempty" json:"metrics_host,omitempty"`
203 MetricsMethodCallThreshold *int `url:"metrics_method_call_threshold,omitempty" json:"metrics_method_call_threshold,omitempty"`
204 MetricsPacketSize *int `url:"metrics_packet_size,omitempty" json:"metrics_packet_size,omitempty"`
205 MetricsPoolSize *int `url:"metrics_pool_size,omitempty" json:"metrics_pool_size,omitempty"`
206 MetricsPort *int `url:"metrics_port,omitempty" json:"metrics_port,omitempty"`
207 MetricsSampleInterval *int `url:"metrics_sample_interval,omitempty" json:"metrics_sample_interval,omitempty"`
208 MetricsTimeout *int `url:"metrics_timeout,omitempty" json:"metrics_timeout,omitempty"`
209 PasswordAuthenticationEnabledForWeb *bool `url:"password_authentication_enabled_for_web,omitempty" json:"password_authentication_enabled_for_web,omitempty"`
210 PasswordAuthenticationEnabledForGit *bool `url:"password_authentication_enabled_for_git,omitempty" json:"password_authentication_enabled_for_git,omitempty"`
211 PerformanceBarAllowedGroupID *string `url:"performance_bar_allowed_group_id,omitempty" json:"performance_bar_allowed_group_id,omitempty"`
212 PerformanceBarEnabled *bool `url:"performance_bar_enabled,omitempty" json:"performance_bar_enabled,omitempty"`
213 PlantumlEnabled *bool `url:"plantuml_enabled,omitempty" json:"plantuml_enabled,omitempty"`
214 PlantumlURL *string `url:"plantuml_url,omitempty" json:"plantuml_url,omitempty"`
215 PollingIntervalMultiplier *float64 `url:"polling_interval_multiplier,omitempty" json:"polling_interval_multiplier,omitempty"`
216 ProjectExportEnabled *bool `url:"project_export_enabled,omitempty" json:"project_export_enabled,omitempty"`
217 PrometheusMetricsEnabled *bool `url:"prometheus_metrics_enabled,omitempty" json:"prometheus_metrics_enabled,omitempty"`
218 RecaptchaEnabled *bool `url:"recaptcha_enabled,omitempty" json:"recaptcha_enabled,omitempty"`
219 RecaptchaPrivateKey *string `url:"recaptcha_private_key,omitempty" json:"recaptcha_private_key,omitempty"`
220 RecaptchaSiteKey *string `url:"recaptcha_site_key,omitempty" json:"recaptcha_site_key,omitempty"`
221 RepositoryChecksEnabled *bool `url:"repository_checks_enabled,omitempty" json:"repository_checks_enabled,omitempty"`
222 RepositoryStorages []string `url:"repository_storages,omitempty" json:"repository_storages,omitempty"`
223 RequireTwoFactorAuthentication *bool `url:"require_two_factor_authentication,omitempty" json:"require_two_factor_authentication,omitempty"`
224 RestrictedVisibilityLevels []VisibilityValue `url:"restricted_visibility_levels,omitempty" json:"restricted_visibility_levels,omitempty"`
225 RsaKeyRestriction *int `url:"rsa_key_restriction,omitempty" json:"rsa_key_restriction,omitempty"`
226 SendUserConfirmationEmail *bool `url:"send_user_confirmation_email,omitempty" json:"send_user_confirmation_email,omitempty"`
227 SentryDSN *string `url:"sentry_dsn,omitempty" json:"sentry_dsn,omitempty"`
228 SentryEnabled *bool `url:"sentry_enabled,omitempty" json:"sentry_enabled,omitempty"`
229 SessionExpireDelay *int `url:"session_expire_delay,omitempty" json:"session_expire_delay,omitempty"`
230 SharedRunnersEnabled *bool `url:"shared_runners_enabled,omitempty" json:"shared_runners_enabled,omitempty"`
231 SharedRunnersText *string `url:"shared_runners_text,omitempty" json:"shared_runners_text,omitempty"`
232 SidekiqThrottlingEnabled *bool `url:"sidekiq_throttling_enabled,omitempty" json:"sidekiq_throttling_enabled,omitempty"`
233 SidekiqThrottlingFactor *float64 `url:"sidekiq_throttling_factor,omitempty" json:"sidekiq_throttling_factor,omitempty"`
234 SidekiqThrottlingQueues []string `url:"sidekiq_throttling_queues,omitempty" json:"sidekiq_throttling_queues,omitempty"`
235 SignInText *string `url:"sign_in_text,omitempty" json:"sign_in_text,omitempty"`
236 SignupEnabled *bool `url:"signup_enabled,omitempty" json:"signup_enabled,omitempty"`
237 TerminalMaxSessionTime *int `url:"terminal_max_session_time,omitempty" json:"terminal_max_session_time,omitempty"`
238 TwoFactorGracePeriod *int `url:"two_factor_grace_period,omitempty" json:"two_factor_grace_period,omitempty"`
239 UniqueIPsLimitEnabled *bool `url:"unique_ips_limit_enabled,omitempty" json:"unique_ips_limit_enabled,omitempty"`
240 UniqueIPsLimitPerUser *int `url:"unique_ips_limit_per_user,omitempty" json:"unique_ips_limit_per_user,omitempty"`
241 UniqueIPsLimitTimeWindow *int `url:"unique_ips_limit_time_window,omitempty" json:"unique_ips_limit_time_window,omitempty"`
242 UsagePingEnabled *bool `url:"usage_ping_enabled,omitempty" json:"usage_ping_enabled,omitempty"`
243 UserDefaultExternal *bool `url:"user_default_external,omitempty" json:"user_default_external,omitempty"`
244 UserOauthApplications *bool `url:"user_oauth_applications,omitempty" json:"user_oauth_applications,omitempty"`
245 VersionCheckEnabled *bool `url:"version_check_enabled,omitempty" json:"version_check_enabled,omitempty"`
246}
247
248// UpdateSettings updates the application settings.
249//
250// GitLab API docs:
251// https://docs.gitlab.com/ce/api/settings.html#change-application.settings
252func (s *SettingsService) UpdateSettings(opt *UpdateSettingsOptions, options ...OptionFunc) (*Settings, *Response, error) {
253 req, err := s.client.NewRequest("PUT", "application/settings", opt, options)
254 if err != nil {
255 return nil, nil, err
256 }
257
258 as := new(Settings)
259 resp, err := s.client.Do(req, as)
260 if err != nil {
261 return nil, resp, err
262 }
263
264 return as, resp, err
265}