/* * The MIT License (MIT) * * Copyright (c) 2014 Andreas Alanko, Emil Nilsson, Sony Mobile Communications AB. * All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.sonymobile.jenkins.plugins.gitlab.gitlabauth.acl; import java.util.ArrayList; import java.util.List; import com.sonymobile.gitlab.model.GitLabAccessLevel; /** * Used to create a permission identity. * * @author Andreas Alanko */ public class GitLabPermissionIdentity implements Comparable<GitLabPermissionIdentity> { /** The visual name of this identity. */ public final String displayName; /** The identifier of this identity. */ public final String id; /** The type of this identity. */ public final IdentityType type; private GitLabPermissionIdentity(String displayName, String id, IdentityType type) { this.displayName = displayName; this.id = id; this.type = type; } private GitLabPermissionIdentity(GitLabAccessLevel accessLevel) { this(accessLevel.toString(), accessLevel.name(), IdentityType.GITLAB); } private GitLabPermissionIdentity(JenkinsAccessLevel accessLevel) { this(accessLevel.displayName, accessLevel.name(), IdentityType.JENKINS); } /** * Creates a permission identity for a user with the given username. * * @param username the username * @return the permission identity */ public static GitLabPermissionIdentity user(String username) { return new GitLabPermissionIdentity(username, username, IdentityType.USER); } /** * Creates a permission identity for a group with the given group name * * @param groupName the group name * @return the permission identity */ public static GitLabPermissionIdentity group(String groupName) { return new GitLabPermissionIdentity(groupName, groupName, IdentityType.GROUP); } @Override public String toString() { return type + ":" + id; } /** * Checks if this object is equal to the given. * * Will return true if type and id of both objects are equals. * * @return true if this and object is equals */ @Override public boolean equals(Object object) { if (object instanceof GitLabPermissionIdentity) { if (object != null) { if (type.equals(((GitLabPermissionIdentity) object).type)) { if (id.equals(((GitLabPermissionIdentity) object).id)) { return true; } } } } return false; } /** * Compares this permission identity object with the given. * * Return 1 if this is considered greater than the given. * Return 0 if objects are equals. * Return -1 if this is considered lesser than the given. * * @param object the object to be compared * @return an integer with the result (1, 0, -1) */ public int compareTo(GitLabPermissionIdentity object) { int thisValue = type.ordinal(); int objectValue = object.type.ordinal(); if (thisValue < objectValue) { return 1; } else if (thisValue > objectValue) { return -1; } else { if (type == IdentityType.GITLAB) { int thisAccessLevel = GitLabAccessLevel.getAccessLevelWithName(id).ordinal(); int objectAccessLevel = GitLabAccessLevel.getAccessLevelWithName(object.id).ordinal(); if (thisAccessLevel < objectAccessLevel) { return 1; } else if (thisAccessLevel > objectAccessLevel) { return -1; } else { return 0; } } else if (type == IdentityType.JENKINS) { int thisAccessLevel = JenkinsAccessLevel.getAccessLevelWithName(id).ordinal(); int objectAccessLevel = JenkinsAccessLevel.getAccessLevelWithName(object.id).ordinal(); if (thisAccessLevel < objectAccessLevel) { return 1; } else if (thisAccessLevel > objectAccessLevel) { return -1; } else { return 0; } } else { return id.compareTo(object.id); } } } /** * Gets all static identities such as Jenkins:admin and GitLab:Owner. * * The boolean getGitLab specifies if the static GitLab identities should * be included. * * No user or group identities will be included. * * @param getGitLabIdentities if GitLab identities should be included * @return a list with permission identities */ public static List<GitLabPermissionIdentity> getGlobalStaticPermissionIdentities(boolean getGitLabIdentities) { List<GitLabPermissionIdentity> list = new ArrayList<GitLabPermissionIdentity>(); if (getGitLabIdentities) { for (GitLabAccessLevel accessLevel : GitLabAccessLevel.values()) { if (accessLevel != GitLabAccessLevel.NONE) { list.add(0, getGitLabIdentityFromAccessLevel(accessLevel)); } } } for (JenkinsAccessLevel accessLevel : JenkinsAccessLevel.values()) { list.add(0, getJenkinsIdentityFromAccessLevel(accessLevel)); } return list; } /** * Gets the permission identity for the given GitLab access level. * * @param accessLevel the access level * @return the permission identity */ public static GitLabPermissionIdentity getGitLabIdentityFromAccessLevel(GitLabAccessLevel accessLevel) { switch (accessLevel) { case OWNER: return GITLAB_OWNER; case MASTER: return GITLAB_MASTER; case DEVELOPER: return GITLAB_DEVELOPER; case REPORTER: return GITLAB_REPORTER; case GUEST: return GITLAB_GUEST; default: return new GitLabPermissionIdentity(GitLabAccessLevel.NONE); } } /** * Gets the permission identity for the given Jenkins access level. * * @param accessLevel the access level * @return the permission identity */ public static GitLabPermissionIdentity getJenkinsIdentityFromAccessLevel(JenkinsAccessLevel accessLevel) { switch (accessLevel) { case ADMIN: return JENKINS_ADMIN; case LOGGED_IN: return JENKINS_LOGGED_IN; default: return JENKINS_ANONYMOUS; } } public static final GitLabPermissionIdentity JENKINS_ADMIN = new GitLabPermissionIdentity(JenkinsAccessLevel.ADMIN); public static final GitLabPermissionIdentity JENKINS_LOGGED_IN = new GitLabPermissionIdentity(JenkinsAccessLevel.LOGGED_IN); public static final GitLabPermissionIdentity JENKINS_ANONYMOUS = new GitLabPermissionIdentity(JenkinsAccessLevel.ANONYMOUS); public static final GitLabPermissionIdentity GITLAB_OWNER = new GitLabPermissionIdentity(GitLabAccessLevel.OWNER); public static final GitLabPermissionIdentity GITLAB_MASTER = new GitLabPermissionIdentity(GitLabAccessLevel.MASTER); public static final GitLabPermissionIdentity GITLAB_DEVELOPER = new GitLabPermissionIdentity(GitLabAccessLevel.DEVELOPER); public static final GitLabPermissionIdentity GITLAB_REPORTER = new GitLabPermissionIdentity(GitLabAccessLevel.REPORTER); public static final GitLabPermissionIdentity GITLAB_GUEST = new GitLabPermissionIdentity(GitLabAccessLevel.GUEST); /** Enum for different identity types. */ public enum IdentityType { GROUP("Group"), USER("User"), GITLAB("GitLab"), JENKINS("Jenkins"); /** The display name of the enum. */ public final String displayName; private IdentityType(String displayName) { this.displayName = displayName; } } }