blob: 36de13df1cb63b9148a3a0a18f9814d4814caf4c [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.testacl
import grails.gorm.DetachedCriteria
import grails.plugin.springsecurity.acl.AclClass
import grails.plugin.springsecurity.acl.AclEntry
import grails.plugin.springsecurity.acl.AclObjectIdentity
import grails.plugin.springsecurity.acl.AclService
import grails.plugin.springsecurity.acl.AclSid
import grails.plugin.springsecurity.acl.AclUtilService
import grails.gorm.transactions.Transactional
import groovy.util.logging.Slf4j
import jakarta.annotation.PostConstruct
import org.springframework.security.acls.model.ObjectIdentityRetrievalStrategy
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken
import org.springframework.security.core.authority.SimpleGrantedAuthority
import org.springframework.security.core.context.SecurityContextHolder as SCH
import static org.springframework.security.acls.domain.BasePermission.ADMINISTRATION
import static org.springframework.security.acls.domain.BasePermission.READ
import static org.springframework.security.acls.domain.BasePermission.WRITE
@Slf4j
@Transactional
class TestDataService {
AclService aclService
AclUtilService aclUtilService
ObjectIdentityRetrievalStrategy objectIdentityRetrievalStrategy
@PostConstruct
void init() {
reset()
}
void reset() {
deleteAll()
createData()
}
void deleteAll() {
log.debug 'deleteAll'
[AclEntry, AclObjectIdentity, AclSid, AclClass, UserRole, User, Role, Report].each { clazz ->
if (!clazz.count()) return
log.debug 'deleteAll for {}', clazz.simpleName
DetachedCriteria dc = clazz == UserRole ?
UserRole.where({ user != null }) :
new DetachedCriteria(clazz).build { gt 'id', 0L }
int deleted = dc.deleteAll()
log.debug 'Deleted {} from {}', deleted, clazz.simpleName
clazz.withSession { it.clear() }
int remaining = clazz.count()
assert remaining == 0, "Didn't delete all from $clazz.simpleName - $remaining remaining"
}
}
void createData() {
createUsers()
// Set a user account that will initially own all the created data
SCH.context.authentication = new UsernamePasswordAuthenticationToken(
'admin', 'password', [new SimpleGrantedAuthority('ROLE_IGNORED')])
grantPermissions()
// logout
SCH.clearContext()
}
private void createUsers() {
log.debug 'createData: users'
def roleAdmin = new Role('ROLE_ADMIN').save(failOnError: true)
def roleUser = new Role('ROLE_USER').save(failOnError: true)
3.times {
long id = it + 1
def user = new User(username:"user$id", password: 'password').save(failOnError: true)
UserRole.create user, roleUser
}
def admin = new User(username: 'admin', password:'password').save(failOnError: true)
UserRole.create admin, roleUser
UserRole.create admin, roleAdmin
}
private void grantPermissions() {
log.debug 'createData: reports'
def reports = (1..100).collect { int number ->
def report = new Report("report$number", number).save(failOnError: true)
aclService.createAcl objectIdentityRetrievalStrategy.getObjectIdentity(report)
report
}
log.debug 'createData: permissions'
// grant user 1 admin on 11,12 and read on 1-67
aclUtilService.addPermission reports[10], 'user1', ADMINISTRATION
aclUtilService.addPermission reports[11], 'user1', ADMINISTRATION
67.times {
aclUtilService.addPermission reports[it], 'user1', READ
}
// grant user 2 read on 1-5, write on 5
5.times {
aclUtilService.addPermission reports[it], 'user2', READ
}
aclUtilService.addPermission reports[4], 'user2', WRITE
// user 3 has no grants
// grant admin read and admin on all
for (report in reports) {
aclUtilService.addPermission report, 'admin', READ
aclUtilService.addPermission report, 'admin', ADMINISTRATION
}
// grant user 1 ownership on 1,2 to allow the user to grant
aclUtilService.changeOwner reports[0], 'user1'
aclUtilService.changeOwner reports[1], 'user1'
}
}