1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.core.logic;
20
21 import java.util.ArrayList;
22 import java.util.List;
23 import javax.validation.Validator;
24 import org.apache.logging.log4j.Level;
25 import org.apache.logging.log4j.LogManager;
26 import org.apache.logging.log4j.core.LoggerContext;
27 import org.apache.logging.log4j.core.config.LoggerConfig;
28 import org.apache.syncope.common.keymaster.client.api.ConfParamOps;
29 import org.apache.syncope.common.lib.types.AuditLoggerName;
30 import org.apache.syncope.core.logic.audit.AuditAppender;
31 import org.apache.syncope.core.logic.audit.JdbcAuditAppender;
32 import org.apache.syncope.core.logic.init.AuditAccessor;
33 import org.apache.syncope.core.logic.init.AuditLoader;
34 import org.apache.syncope.core.logic.init.ClassPathScanImplementationLookup;
35 import org.apache.syncope.core.logic.init.EntitlementAccessor;
36 import org.apache.syncope.core.logic.init.IdRepoEntitlementLoader;
37 import org.apache.syncope.core.logic.init.IdRepoImplementationTypeLoader;
38 import org.apache.syncope.core.persistence.api.DomainHolder;
39 import org.apache.syncope.core.persistence.api.content.ContentExporter;
40 import org.apache.syncope.core.persistence.api.dao.AccessTokenDAO;
41 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
42 import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
43 import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
44 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
45 import org.apache.syncope.core.persistence.api.dao.ApplicationDAO;
46 import org.apache.syncope.core.persistence.api.dao.AuditConfDAO;
47 import org.apache.syncope.core.persistence.api.dao.CASSPClientAppDAO;
48 import org.apache.syncope.core.persistence.api.dao.DelegationDAO;
49 import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
50 import org.apache.syncope.core.persistence.api.dao.DynRealmDAO;
51 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
52 import org.apache.syncope.core.persistence.api.dao.FIQLQueryDAO;
53 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
54 import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
55 import org.apache.syncope.core.persistence.api.dao.JobStatusDAO;
56 import org.apache.syncope.core.persistence.api.dao.MailTemplateDAO;
57 import org.apache.syncope.core.persistence.api.dao.NotificationDAO;
58 import org.apache.syncope.core.persistence.api.dao.OIDCRPClientAppDAO;
59 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
60 import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
61 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
62 import org.apache.syncope.core.persistence.api.dao.RelationshipTypeDAO;
63 import org.apache.syncope.core.persistence.api.dao.ReportDAO;
64 import org.apache.syncope.core.persistence.api.dao.ReportExecDAO;
65 import org.apache.syncope.core.persistence.api.dao.RoleDAO;
66 import org.apache.syncope.core.persistence.api.dao.SAML2SPClientAppDAO;
67 import org.apache.syncope.core.persistence.api.dao.SecurityQuestionDAO;
68 import org.apache.syncope.core.persistence.api.dao.TaskDAO;
69 import org.apache.syncope.core.persistence.api.dao.TaskExecDAO;
70 import org.apache.syncope.core.persistence.api.dao.UserDAO;
71 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
72 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
73 import org.apache.syncope.core.persistence.api.entity.policy.PolicyUtilsFactory;
74 import org.apache.syncope.core.persistence.api.entity.task.TaskUtilsFactory;
75 import org.apache.syncope.core.provisioning.api.AnyObjectProvisioningManager;
76 import org.apache.syncope.core.provisioning.api.AuditManager;
77 import org.apache.syncope.core.provisioning.api.GroupProvisioningManager;
78 import org.apache.syncope.core.provisioning.api.ImplementationLookup;
79 import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
80 import org.apache.syncope.core.provisioning.api.data.AccessTokenDataBinder;
81 import org.apache.syncope.core.provisioning.api.data.AnyObjectDataBinder;
82 import org.apache.syncope.core.provisioning.api.data.AnyTypeClassDataBinder;
83 import org.apache.syncope.core.provisioning.api.data.AnyTypeDataBinder;
84 import org.apache.syncope.core.provisioning.api.data.ApplicationDataBinder;
85 import org.apache.syncope.core.provisioning.api.data.AuditDataBinder;
86 import org.apache.syncope.core.provisioning.api.data.DelegationDataBinder;
87 import org.apache.syncope.core.provisioning.api.data.DynRealmDataBinder;
88 import org.apache.syncope.core.provisioning.api.data.FIQLQueryDataBinder;
89 import org.apache.syncope.core.provisioning.api.data.GroupDataBinder;
90 import org.apache.syncope.core.provisioning.api.data.ImplementationDataBinder;
91 import org.apache.syncope.core.provisioning.api.data.NotificationDataBinder;
92 import org.apache.syncope.core.provisioning.api.data.PolicyDataBinder;
93 import org.apache.syncope.core.provisioning.api.data.RealmDataBinder;
94 import org.apache.syncope.core.provisioning.api.data.RelationshipTypeDataBinder;
95 import org.apache.syncope.core.provisioning.api.data.ReportDataBinder;
96 import org.apache.syncope.core.provisioning.api.data.RoleDataBinder;
97 import org.apache.syncope.core.provisioning.api.data.SchemaDataBinder;
98 import org.apache.syncope.core.provisioning.api.data.SecurityQuestionDataBinder;
99 import org.apache.syncope.core.provisioning.api.data.TaskDataBinder;
100 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
101 import org.apache.syncope.core.provisioning.api.job.JobManager;
102 import org.apache.syncope.core.provisioning.api.notification.NotificationJobDelegate;
103 import org.apache.syncope.core.provisioning.api.notification.NotificationManager;
104 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
105 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
106 import org.apache.syncope.core.provisioning.api.rules.RuleEnforcer;
107 import org.apache.syncope.core.provisioning.java.utils.TemplateUtils;
108 import org.apache.syncope.core.spring.security.SecurityProperties;
109 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
110 import org.springframework.boot.logging.LoggingSystem;
111 import org.springframework.context.annotation.Bean;
112 import org.springframework.context.annotation.Configuration;
113 import org.springframework.context.annotation.EnableAspectJAutoProxy;
114 import org.springframework.scheduling.quartz.SchedulerFactoryBean;
115
116 @EnableAspectJAutoProxy(proxyTargetClass = false)
117 @Configuration(proxyBeanMethods = false)
118 public class IdRepoLogicContext {
119
120 @ConditionalOnMissingBean
121 @Bean
122 public LogicInvocationHandler logicInvocationHandler(
123 final NotificationManager notificationManager,
124 final AuditManager auditManager) {
125
126 return new LogicInvocationHandler(notificationManager, auditManager);
127 }
128
129 @ConditionalOnMissingBean
130 @Bean
131 public ImplementationLookup implementationLookup() {
132 return new ClassPathScanImplementationLookup();
133 }
134
135 @ConditionalOnMissingBean
136 @Bean
137 public AuditAccessor auditAccessor(final AuditConfDAO auditConfDAO, final LoggingSystem loggingSystem) {
138 return new AuditAccessor(auditConfDAO, loggingSystem);
139 }
140
141 @ConditionalOnMissingBean
142 @Bean
143 public AuditLoader auditLoader(
144 final AuditAccessor auditAccessor,
145 final List<AuditAppender> auditAppenders) {
146
147 return new AuditLoader(auditAccessor, auditAppenders);
148 }
149
150 @ConditionalOnMissingBean(name = "defaultAuditAppenders")
151 @Bean
152 public List<AuditAppender> defaultAuditAppenders(final DomainHolder domainHolder) {
153 List<AuditAppender> auditAppenders = new ArrayList<>();
154
155 LoggerContext logCtx = (LoggerContext) LogManager.getContext(false);
156 domainHolder.getDomains().forEach((domain, dataSource) -> {
157 AuditAppender appender = new JdbcAuditAppender(domain, dataSource);
158
159 LoggerConfig logConf = new LoggerConfig(AuditLoggerName.getAuditLoggerName(domain), null, false);
160 logConf.addAppender(appender.getTargetAppender(), Level.DEBUG, null);
161 logConf.setLevel(Level.DEBUG);
162 logCtx.getConfiguration().addLogger(logConf.getName(), logConf);
163
164 auditAppenders.add(appender);
165 });
166
167 return auditAppenders;
168 }
169
170 @ConditionalOnMissingBean
171 @Bean
172 public EntitlementAccessor entitlementAccessor(final AnyTypeDAO anyTypeDAO) {
173 return new EntitlementAccessor(anyTypeDAO);
174 }
175
176 @ConditionalOnMissingBean
177 @Bean
178 public IdRepoEntitlementLoader idRepoEntitlementLoader(final EntitlementAccessor entitlementAccessor) {
179 return new IdRepoEntitlementLoader(entitlementAccessor);
180 }
181
182 @ConditionalOnMissingBean
183 @Bean
184 public IdRepoImplementationTypeLoader idRepoImplementationTypeLoader() {
185 return new IdRepoImplementationTypeLoader();
186 }
187
188 @ConditionalOnMissingBean
189 @Bean
190 public AccessTokenLogic accessTokenLogic(
191 final AccessTokenDataBinder binder,
192 final AccessTokenDAO accessTokenDAO,
193 final SecurityProperties securityProperties) {
194
195 return new AccessTokenLogic(securityProperties, binder, accessTokenDAO);
196 }
197
198 @ConditionalOnMissingBean
199 @Bean
200 public AnyObjectLogic anyObjectLogic(
201 final AnyObjectDataBinder binder,
202 final TemplateUtils templateUtils,
203 final RealmDAO realmDAO,
204 final AnyTypeDAO anyTypeDAO,
205 final AnyObjectDAO anyObjectDAO,
206 final AnySearchDAO anySearchDAO,
207 final AnyObjectProvisioningManager provisioningManager) {
208
209 return new AnyObjectLogic(
210 realmDAO,
211 anyTypeDAO,
212 templateUtils,
213 anyObjectDAO,
214 anySearchDAO,
215 binder,
216 provisioningManager);
217 }
218
219 @ConditionalOnMissingBean
220 @Bean
221 public AnyTypeClassLogic anyTypeClassLogic(
222 final AnyTypeClassDataBinder binder,
223 final AnyTypeClassDAO anyTypeClassDAO) {
224
225 return new AnyTypeClassLogic(binder, anyTypeClassDAO);
226 }
227
228 @ConditionalOnMissingBean
229 @Bean
230 public AnyTypeLogic anyTypeLogic(
231 final AnyTypeDataBinder binder,
232 final AnyTypeDAO anyTypeDAO,
233 final AnyObjectDAO anyObjectDAO) {
234
235 return new AnyTypeLogic(binder, anyTypeDAO, anyObjectDAO);
236 }
237
238 @ConditionalOnMissingBean
239 @Bean
240 public ApplicationLogic applicationLogic(
241 final ApplicationDataBinder binder,
242 final ApplicationDAO applicationDAO) {
243
244 return new ApplicationLogic(binder, applicationDAO);
245 }
246
247 @ConditionalOnMissingBean
248 @Bean
249 public AuditLogic auditLogic(
250 final AuditConfDAO auditConfDAO,
251 final ExternalResourceDAO externalResourceDAO,
252 final EntityFactory entityFactory,
253 final ImplementationLookup implementationLookup,
254 final AuditDataBinder binder,
255 final AuditManager auditManager,
256 final List<AuditAppender> auditAppenders,
257 final LoggingSystem loggingSystem) {
258
259 return new AuditLogic(
260 auditConfDAO,
261 externalResourceDAO,
262 entityFactory,
263 implementationLookup,
264 binder,
265 auditManager,
266 auditAppenders,
267 loggingSystem);
268 }
269
270 @ConditionalOnMissingBean
271 @Bean
272 public CommandLogic commandLogic(final ImplementationDAO implementationDAO, final Validator validator) {
273 return new CommandLogic(implementationDAO, validator);
274 }
275
276 @ConditionalOnMissingBean
277 @Bean
278 public FIQLQueryLogic fiqlQueryLogic(
279 final FIQLQueryDataBinder binder,
280 final UserDAO userDAO,
281 final FIQLQueryDAO fiqlQueryDAO) {
282
283 return new FIQLQueryLogic(binder, fiqlQueryDAO, userDAO);
284 }
285
286 @ConditionalOnMissingBean
287 @Bean
288 public DelegationLogic delegationLogic(
289 final DelegationDataBinder binder,
290 final UserDAO userDAO,
291 final DelegationDAO delegationDAO) {
292
293 return new DelegationLogic(binder, delegationDAO, userDAO);
294 }
295
296 @ConditionalOnMissingBean
297 @Bean
298 public DynRealmLogic dynRealmLogic(
299 final DynRealmDataBinder binder,
300 final DynRealmDAO dynRealmDAO) {
301
302 return new DynRealmLogic(binder, dynRealmDAO);
303 }
304
305 @ConditionalOnMissingBean
306 @Bean
307 public GroupLogic groupLogic(
308 final GroupProvisioningManager provisioningManager,
309 final JobManager jobManager,
310 final TemplateUtils templateUtils,
311 final EntityFactory entityFactory,
312 final RealmDAO realmDAO,
313 final AnyTypeDAO anyTypeDAO,
314 final UserDAO userDAO,
315 final GroupDAO groupDAO,
316 final AnySearchDAO anySearchDAO,
317 final SchedulerFactoryBean scheduler,
318 final TaskDAO taskDAO,
319 final GroupDataBinder groupDataBinder,
320 final TaskDataBinder taskDataBinder,
321 final ImplementationDAO implementationDAO,
322 final SecurityProperties securityProperties) {
323
324 return new GroupLogic(
325 realmDAO,
326 anyTypeDAO,
327 templateUtils,
328 userDAO,
329 groupDAO,
330 securityProperties,
331 anySearchDAO,
332 implementationDAO,
333 taskDAO,
334 groupDataBinder,
335 provisioningManager,
336 taskDataBinder,
337 jobManager,
338 scheduler,
339 entityFactory);
340 }
341
342 @ConditionalOnMissingBean
343 @Bean
344 public ImplementationLogic implementationLogic(
345 final ImplementationDataBinder binder,
346 final PlainSchemaDAO plainSchemaDAO,
347 final RealmDAO realmDAO,
348 final PolicyDAO policyDAO,
349 final ReportDAO reportDAO,
350 final TaskDAO taskDAO,
351 final ExternalResourceDAO externalResourceDAO,
352 final ImplementationDAO implementationDAO,
353 final NotificationDAO notificationDAO) {
354
355 return new ImplementationLogic(
356 binder,
357 implementationDAO,
358 reportDAO,
359 policyDAO,
360 externalResourceDAO,
361 taskDAO,
362 realmDAO,
363 plainSchemaDAO,
364 notificationDAO);
365 }
366
367 @ConditionalOnMissingBean
368 @Bean
369 public MailTemplateLogic mailTemplateLogic(
370 final MailTemplateDAO mailTemplateDAO,
371 final EntityFactory entityFactory,
372 final NotificationDAO notificationDAO) {
373
374 return new MailTemplateLogic(mailTemplateDAO, notificationDAO, entityFactory);
375 }
376
377 @ConditionalOnMissingBean
378 @Bean
379 public NotificationLogic notificationLogic(
380 final NotificationDataBinder binder,
381 final JobManager jobManager,
382 final JobStatusDAO jobStatusDAO,
383 final SchedulerFactoryBean scheduler,
384 final NotificationDAO notificationDAO) {
385
386 return new NotificationLogic(jobManager, scheduler, jobStatusDAO, notificationDAO, binder);
387 }
388
389 @ConditionalOnMissingBean
390 @Bean
391 public PolicyLogic policyLogic(
392 final PolicyDataBinder binder,
393 final PolicyDAO policyDAO,
394 final PolicyUtilsFactory policyUtilsFactory) {
395
396 return new PolicyLogic(policyDAO, binder, policyUtilsFactory);
397 }
398
399 @ConditionalOnMissingBean
400 @Bean
401 public RealmLogic realmLogic(
402 final RealmDataBinder binder,
403 final RealmDAO realmDAO,
404 final AnySearchDAO anySearchDAO,
405 final TaskDAO taskDAO,
406 final CASSPClientAppDAO casSPClientAppDAO,
407 final OIDCRPClientAppDAO oidcRPClientAppDAO,
408 final SAML2SPClientAppDAO saml2SPClientAppDAO,
409 final PropagationManager propagationManager,
410 final PropagationTaskExecutor taskExecutor) {
411
412 return new RealmLogic(
413 realmDAO,
414 anySearchDAO,
415 taskDAO,
416 casSPClientAppDAO,
417 oidcRPClientAppDAO,
418 saml2SPClientAppDAO,
419 binder,
420 propagationManager,
421 taskExecutor);
422 }
423
424 @ConditionalOnMissingBean
425 @Bean
426 public RelationshipTypeLogic relationshipTypeLogic(
427 final RelationshipTypeDataBinder binder,
428 final RelationshipTypeDAO relationshipTypeDAO) {
429
430 return new RelationshipTypeLogic(binder, relationshipTypeDAO);
431 }
432
433 @ConditionalOnMissingBean
434 @Bean
435 public ReportLogic reportLogic(
436 final JobManager jobManager,
437 final ReportDataBinder binder,
438 final SchedulerFactoryBean scheduler,
439 final JobStatusDAO jobStatusDAO,
440 final ReportDAO reportDAO,
441 final EntityFactory entityFactory,
442 final ReportExecDAO reportExecDAO) {
443
444 return new ReportLogic(
445 jobManager,
446 scheduler,
447 jobStatusDAO,
448 reportDAO,
449 reportExecDAO,
450 binder,
451 entityFactory);
452 }
453
454 @ConditionalOnMissingBean
455 @Bean
456 public RoleLogic roleLogic(
457 final RoleDataBinder binder,
458 final RoleDAO roleDAO) {
459
460 return new RoleLogic(binder, roleDAO);
461 }
462
463 @ConditionalOnMissingBean
464 @Bean
465 public SchemaLogic schemaLogic(
466 final SchemaDataBinder binder,
467 final VirSchemaDAO virSchemaDAO,
468 final AnyTypeClassDAO anyTypeClassDAO,
469 final DerSchemaDAO derSchemaDAO,
470 final PlainSchemaDAO plainSchemaDAO) {
471
472 return new SchemaLogic(plainSchemaDAO, derSchemaDAO, virSchemaDAO, anyTypeClassDAO, binder);
473 }
474
475 @ConditionalOnMissingBean
476 @Bean
477 public SecurityQuestionLogic securityQuestionLogic(
478 final SecurityQuestionDataBinder binder,
479 final UserDAO userDAO,
480 final SecurityQuestionDAO securityQuestionDAO) {
481
482 return new SecurityQuestionLogic(securityQuestionDAO, userDAO, binder);
483 }
484
485 @ConditionalOnMissingBean
486 @Bean
487 public SyncopeLogic syncopeLogic(
488 final RealmDAO realmDAO,
489 final AnyTypeDAO anyTypeDAO,
490 final GroupDAO groupDAO,
491 final AnySearchDAO anySearchDAO,
492 final GroupDataBinder groupDataBinder,
493 final ConfParamOps confParamOps,
494 final ContentExporter exporter) {
495
496 return new SyncopeLogic(
497 realmDAO,
498 anyTypeDAO,
499 groupDAO,
500 anySearchDAO,
501 groupDataBinder,
502 confParamOps,
503 exporter);
504 }
505
506 @ConditionalOnMissingBean
507 @Bean
508 public TaskLogic taskLogic(
509 final JobManager jobManager,
510 final PropagationTaskExecutor taskExecutor,
511 final TaskExecDAO taskExecDAO,
512 final TaskDAO taskDAO,
513 final SchedulerFactoryBean scheduler,
514 final JobStatusDAO jobStatusDAO,
515 final ExternalResourceDAO externalResourceDAO,
516 final NotificationJobDelegate notificationJobDelegate,
517 final TaskDataBinder taskDataBinder,
518 final TaskUtilsFactory taskUtilsFactory,
519 final NotificationDAO notificationDAO) {
520
521 return new TaskLogic(
522 jobManager,
523 scheduler,
524 jobStatusDAO,
525 taskDAO,
526 taskExecDAO,
527 externalResourceDAO,
528 notificationDAO,
529 taskDataBinder,
530 taskExecutor,
531 notificationJobDelegate,
532 taskUtilsFactory);
533 }
534
535 @ConditionalOnMissingBean
536 @Bean
537 public UserLogic userLogic(
538 final UserDataBinder binder,
539 final TemplateUtils templateUtils,
540 final RealmDAO realmDAO,
541 final AnyTypeDAO anyTypeDAO,
542 final UserDAO userDAO,
543 final GroupDAO groupDAO,
544 final AnySearchDAO anySearchDAO,
545 final ExternalResourceDAO resourceDAO,
546 final AccessTokenDAO accessTokenDAO,
547 final DelegationDAO delegationDAO,
548 final ConfParamOps confParamOps,
549 final UserProvisioningManager provisioningManager,
550 final SyncopeLogic syncopeLogic,
551 final RuleEnforcer ruleEnforcer) {
552
553 return new UserLogic(
554 realmDAO,
555 anyTypeDAO,
556 templateUtils,
557 userDAO,
558 groupDAO,
559 anySearchDAO,
560 resourceDAO,
561 accessTokenDAO,
562 delegationDAO,
563 confParamOps,
564 binder,
565 provisioningManager,
566 syncopeLogic,
567 ruleEnforcer);
568 }
569 }