SuperX-Kernmodul
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

636 lines
20 KiB

package de.superx.common;
import static de.superx.servlet.SxSQL_Server.DEFAULT_MANDANTEN_ID;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.UUID;
import javax.xml.transform.TransformerException;
import org.apache.commons.lang.StringUtils;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.authority.GrantedAuthoritiesContainer;
import org.springframework.security.core.userdetails.UserDetails;
import com.google.common.base.Predicate;
import com.google.common.collect.Sets;
import de.memtext.baseobjects.User;
import de.memtext.db.NichtAngemeldetException;
import de.memtext.rights.Rights;
import de.memtext.util.CryptUtils;
import de.memtext.util.DateUtils;
import de.superx.servlet.ServletUtils;
import de.superx.servlet.Themenbaum;
import freemarker.template.TemplateBooleanModel;
public class SxUser extends User implements Serializable, UserDetails, GrantedAuthoritiesContainer {
public static final String USER_ROLE_PLACEHOLDER = "UserRole";
public static final String USER_ROLE_ID_PLACEHOLDER = "UserRoleId";
public static final String USER_HISINONE_ORGUNIT_LID_PLACEHOLDER = "UserHISinOneOrgunitLid";
private final UUID uuid = UUID.randomUUID();
private Themenbaum themenbaum = new Themenbaum();
private String mandantenID = DEFAULT_MANDANTEN_ID;
private Sichten sichten = new Sichten();
private List<Integer> erlaubteMaskenTids = new ArrayList<>();
private Collection groups = new LinkedList();
private Collection groupnames = new LinkedList();
private Collection sachgebiete = new LinkedList();
private String[] oldShas = new String[7];
private String currentSha="";
private SxFinRechte finRechte = new SxFinRechte();
private HashMap basicMap = new HashMap();
private SelectionBuffer sb = new SelectionBuffer();
// private Set<String> maskenEditRights = new HashSet<>();
private boolean hasMaskenEditRights = false;
private Collection hiddenFields = new LinkedList();
private Map<String, Map<String, String>> rightsMap = new HashMap<String, Map<String, String>>();
private String role="";
private Integer roleId;
private Integer hisInOneOrgUnitLidOfRole;
private Set<OrgUnit> allowedOrgUnits = new TreeSet<OrgUnit>();
private Set<OrgUnit> implicitlyAllowedOrgUnits = new TreeSet<OrgUnit>();
private SxKontierungsrechte sxKontierungsrechte = new SxKontierungsrechte();
private static final long serialVersionUID = 7;
public SxUser() {
init();
}
/**
* Aufruf aus dem XML-Frontend
*
* @param username
* @param userid
* @throws SQLException
* @throws DBServletException
* @throws TransformerException
*/
public SxUser(String username, Integer userid) throws SQLException, DBServletException, TransformerException {
super(username, userid);
init();
}
public SxUser(String username, Integer userid, String mandantenId) throws SQLException, DBServletException, TransformerException {
super(username, userid);
this.mandantenID = mandantenId;
init();
}
/**
* Nur für Testfälle - bei Echtbetrieb wird ID benötigt!!
*
* @param username
*/
public SxUser(String username) {
super(username);
}
public void init() {
sichten.setUser(this);
basicMap.put("SxFinRechte", finRechte);
basicMap.put("SxKontierungsrechte", sxKontierungsrechte);
basicMap.put("Username", getName());
basicMap.put("today", DateUtils.getTodayString());
basicMap.put("yeartoday", DateUtils.getYear(new java.sql.Date(new java.util.Date().getTime())));
// wird in setDatabaseVersion überschrieben
basicMap.put("databaseMajorVersion", Integer.valueOf(0));
basicMap.put("databaseMinorVersion", Integer.valueOf(0));
basicMap.put("DatenblattTables", new DatenblattTables(getMandantenID()));
basicMap.put("DatenblattFields", new DatenblattFields());
basicMap.put("TableFieldExists", new TableFieldExists(getMandantenID()));
}
public void addImplicitlyAllowedOrgUnit(OrgUnit ou) {
implicitlyAllowedOrgUnits.add(ou);
}
public Set<OrgUnit> getImplicitlyAllowedOrgUnits() {
return implicitlyAllowedOrgUnits;
}
public int getUserIdAsInt() {
return ((Integer) getId()).intValue();
}
public SelectionBuffer getSelectionBuffer() {
return sb;
}
@Override
public void setAdmin(boolean isAdmin) {
super.setAdmin(isAdmin);
basicMap.put("UserIsAdmin", isAdmin() ? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE);
finRechte.setHasAllRights(isAdmin);
sxKontierungsrechte.setHasAllRights(true);
}
/**
* extra FreeMarker-Entries (SxFinRechte)
*
* @return
*/
public HashMap getBasicMap() {
return basicMap;
}
public Themenbaum getThemenbaum()
{
return themenbaum;
}
public Sichten getSichten() {
return sichten;
}
public void setUserid(Integer id) {
super.setId(id);
}
public void setRoleId(Integer id) {
this.roleId = id;
basicMap.put(USER_ROLE_ID_PLACEHOLDER, roleId);
}
public String getRole() {
return role != null ? role : "";
}
public Integer getRoleId() {
return roleId != null ? roleId : Integer.valueOf(-1);
}
/**
* Derzeit noch nicht aufgerufen
*
*/
public void clearCache() {
sichten.clear();
}
public void initErlaubteMasken(List<Integer> maskenTids) {
erlaubteMaskenTids.addAll(maskenTids);
basicMap.put("UserMaskRights", getMaskRights());
basicMap.put("UserHasMaskRight", new UserHasMaskRight(this));
}
public String getMaskRights() {
StringBuffer result = new StringBuffer(",");
for (Iterator it = erlaubteMaskenTids.iterator(); it.hasNext();) {
result.append(it.next() + ",");
}
return result.toString();
}
/**
* Prüft, ob User eine Maske sehen darf, wenn nicht wird
* IllegalArgumentException bzw. bei null parameter IllegalstateException
* geworfen
*/
public void checkAuthentificationForMask(String tidStr) {
if (tidStr == null) throw new IllegalStateException("Kann Maske nicht öffnen DETAILS:tid parameter war null");
if (!isMaskAllowed(tidStr)) throw new IllegalArgumentException("Sie haben keine Berechtigung für Maske mit ID-Nummer " + tidStr);
}
boolean isMaskAllowed(String tidStr) {
boolean result = false;
if (isAdmin())
result = true;
else
try {
result = erlaubteMaskenTids.contains(Integer.valueOf(tidStr));
} catch (Exception e) {
}
return result;
}
public boolean hasRightsOnReport(int tid) {
return erlaubteMaskenTids.contains(Integer.valueOf(tid));
}
public boolean isPWUsedBefore(String check) {
boolean result = false;
String sha1 = CryptUtils.encodeSHA(check);
String sha2 = CryptUtils.encodeSHA(check + CryptUtils.geheimnis1);
for (int i = 0; i < 7; i++) {
if (oldShas[i] != null && (sha1.equals(oldShas[i]) || sha2.equals(oldShas[i]))) result = true;
}
return result;
}
public boolean isPWSHAUsedBefore(String sha) {
boolean result = false;
for (int i = 0; i < 7; i++) {
if (oldShas[i] != null && sha.equals(oldShas[i])) result = true;
}
return result;
}
public void setOldSha(int pos, String oldsha) {
oldShas[pos] = oldsha;
}
/**
* @return Returns the mandantenID.
*/
public String getMandantenID() {
return mandantenID;
}
/**
* @param mandantenID The mandantenID to set.
*/
public void setMandantenID(String mandantenID) {
this.mandantenID = mandantenID;
}
public void rememberOldSHA(String oldsha) {
for (int i = 6; i > 0; i--)
oldShas[i] = oldShas[i - 1];
oldShas[0] = oldsha;
}
public String getUser_PW_Command(int gueltigkeit) {
String gueltig = "'1.1.3000'";
if (gueltigkeit > 0) {
gueltig = "'" + DateUtils.formatGerman(DateUtils.makeFutureDate(new java.sql.Date(new java.util.Date().getTime()), gueltigkeit)) + "'";
}
String result = "delete from user_pw where userinfo_id='" + this.getId()
+ "'; insert into user_pw (userinfo_id,pw_gueltig_bis,old_sha1,old_sha2,old_sha3,old_sha4,old_sha5,old_sha6,old_sha7) values ('" + getId() + "',date_val("
+ gueltig + ")";
for (int i = 0; i < 7; i++)
if (oldShas[i] == null)
result += ",null";
else
result += ",'" + oldShas[i] + "'";
result += ")";
return result;
}
public String getCurrentSha() {
return currentSha;
}
public void setCurrentSha(String sha) {
this.currentSha = sha;
}
public void initFinRechte(SxResultSet rs, int finRightVariant, SxResultSet rsProjToInst, boolean is0FINJoker, HashMap repository) {
finRechte.setVariant(finRightVariant);
finRechte.setRepository(repository);
finRechte.set0FINJoker(is0FINJoker);
if (isAdmin()) finRechte.setHasAllRights(true);
for (Iterator it = rs.iterator(); it.hasNext();) {
SxResultRow row = (SxResultRow) it.next();
finRechte.createAndAddEntry(row);
}
for (Iterator it = rsProjToInst.iterator(); it.hasNext();) {
SxResultRow row = (SxResultRow) it.next();
finRechte.addProj((String) row.get(0));
}
}
public void addGruppe(String groupid, String groupname) {
groups.add(groupid);
groupnames.add(groupname);
updateFreemarkerBasicMap();
}
public void updateFreemarkerBasicMap() {
basicMap.put("UserIsAdmin", isAdmin() ? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE);
basicMap.put("UserGroups", getGroups());
basicMap.put("UserSachgebiete", getSachgebiete());
basicMap.put("UserGroupnames", getGroupnames());
basicMap.put("IsUserInGroup", new IsUserInGroup(this));
basicMap.put("IsUserInGroupWithName", new IsUserInGroupWithName(this));
basicMap.put("IsUserInAtLeastOneGroup", new IsUserInAtLeastOneGroup(this));
}
public String getSachgebiete() {
StringBuffer result = new StringBuffer(",");
for (Iterator it = sachgebiete.iterator(); it.hasNext();) {
result.append(it.next() + ",");
}
return result.toString();
}
public String getSachgebieteIn() {
StringBuffer result = new StringBuffer();
for (Iterator it = sachgebiete.iterator(); it.hasNext();) {
result.append(it.next());
if (it.hasNext()) {
result.append(',');
}
}
return result.toString();
}
public String getGroups() {
StringBuffer result = new StringBuffer(",");
for (Iterator it = groups.iterator(); it.hasNext();) {
result.append(it.next() + ",");
}
return result.toString();
}
public String getGroupnames() {
StringBuffer result = new StringBuffer(",");
for (Iterator it = groupnames.iterator(); it.hasNext();) {
result.append(it.next() + ",");
}
return result.toString();
}
public boolean isInGroup(String group) {
return groups.contains(group);
}
public boolean isInGroupWithName(String group) {
return groupnames.contains(group);
}
public void setDBVersion(int databaseMajorVersion, int databaseMinorVersion) {
basicMap.put("databaseMajorVersion", Integer.valueOf(databaseMajorVersion));
basicMap.put("databaseMinorVersion", Integer.valueOf(databaseMinorVersion));
}
public void setHiddenFields(SxResultSet rs) {
for (Iterator it = rs.iterator(); it.hasNext();) {
SxResultRow row = (SxResultRow) it.next();
hiddenFields.add(row.get(0));
}
}
public void setMaskenEditRights(SxResultSet rs) {
// for (Iterator it = rs.iterator(); it.hasNext();) {
// SxResultRow row = (SxResultRow) it.next();
// maskenEditRights.add((String)row.get(0));
// }
Iterator it = rs.iterator();
if (it.hasNext()) {
SxResultRow row = (SxResultRow) it.next();
Object o = row.get(0);
this.hasMaskenEditRights = ((Number)o).intValue() > 0;
}
}
public boolean isFieldHidingWanted(Object id) {
// System.out.println(id+":"+hiddenFields.contains(id));
return hiddenFields.contains(id);
}
public void setSachgebiete(SxResultSet rs) {
for (Iterator it = rs.iterator(); it.hasNext();) {
SxResultRow row = (SxResultRow) it.next();
sachgebiete.add(row.get(0).toString());
basicMap.put("UserHasSachgebRight", new UserHasSachgebRight(sachgebiete));
}
}
public Map<String, Map<String, String>> getRightsMap() {
return rightsMap;
}
public void setRights(Map<String, Map<String, String>> rightsMap, String role) {
if (role != null) {
this.role = role;
basicMap.put(USER_ROLE_PLACEHOLDER, role);
}
if (rightsMap != null) {
this.rightsMap = rightsMap;
}
}
@Override
public Collection<GrantedAuthority> getAuthorities() {
return getGrantedAuthorities();
}
@Override
public String getPassword() {
return "not_important";
}
@Override
public String getUsername() {
return getName();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
public Set<String> getHis1Rights() {
Set all = rightsMap.keySet();
return Sets.filter(all, new Predicate<String>() {
@Override
public boolean apply(String arg0) {
return arg0.startsWith("RIGHT_");
}
});
}
@Override
public List<GrantedAuthority> getGrantedAuthorities() {
List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(getRoles().toArray(new String[0]));
// add his1 role
authorities.add(new GrantedAuthority() {
@Override
public String getAuthority() {
return SxUser.this.role;
}
});
// add rights
for (String right : rightsMap.keySet()) {
authorities.add(new GrantedAuthority() {
@Override
public String getAuthority() {
return right;
}
});
}
return authorities;
}
private Set<String> getRoles() {
Set all = rightsMap.keySet();
return Sets.filter(all, new Predicate<String>() {
@Override
public boolean apply(String arg0) {
return arg0.startsWith("ROLE_");
}
});
}
private String getRoleString()
{
String rolle="standard"; //ohne HisInOne
if (getRoles().size()>0)
rolle=StringUtils.join(this.getRoles(), ", ");
return rolle;
}
public void initKontierungsrechte() throws SQLException, DBServletException {
if (isAdmin())
sxKontierungsrechte.setHasAllRights(true);
else {
sxKontierungsrechte.clearAll();
SxResultSet rs = ServletUtils
.executeALL_el(null, null, "Einlesen von Kontierungsrechten für Benutzer " + getId(), SxKontierungsrechte.readingSQL + getId(), getMandantenID(), true)
.getResultSet();
for (Iterator it = rs.iterator(); it.hasNext();) {
SxResultRow row = (SxResultRow) it.next();
sxKontierungsrechte.createAndAddEntry(row);
}
}
}
public Integer getHisInOneOrgUnitLidOfRole() {
return hisInOneOrgUnitLidOfRole != null ? hisInOneOrgUnitLidOfRole : Integer.valueOf(-1);
}
public void setHisInOneOrgUnitLidOfRole(Integer lid) {
this.hisInOneOrgUnitLidOfRole = lid;
// remove if 'null': behaves as if 'unset' in Freemarker an homebrew variable replacement
basicMap.remove(USER_HISINONE_ORGUNIT_LID_PLACEHOLDER);
if (lid != null) {
basicMap.put(USER_HISINONE_ORGUNIT_LID_PLACEHOLDER, lid.toString());
}
}
public void addStandardOrgUnitRight(OrgUnit eineOrgUnit) {
allowedOrgUnits.add(eineOrgUnit);
}
/**
* Saiku braucht alle Schlüssel einzeln sowie explizit Unbekannt und Leer falls Berechtigung da
* @return
*/
public Set<String> getAllAllowedOrgUnitsForSaiku() {
Rights orgUnitRights = new Rights();
StringBuffer optionalLogMessages = new StringBuffer();
orgUnitRights.add(getAllowedOrgUnitApnrs());
orgUnitRights.addOrgUnitRights(optionalLogMessages, getImplicitlyAllowedOrgUnits());
orgUnitRights.addLiveMappingRights(optionalLogMessages, mandantenID);
if (hasAllOrgUnitRights()) { // Berechtigung auf alle orgunits -> Leer/Unbekannt hinzufügen siehe #121106
orgUnitRights.add("Unbekannt");
orgUnitRights.add("-999990"); //"Leer"
}
return orgUnitRights.getAllRightKeys();
}
public String getUUID()
{
return uuid.toString();
}
@Override
public int hashCode() {
return uuid.hashCode();
}
@Override
public boolean equals(Object o)
{
return hashCode()==o.hashCode();
}
@Override
public String toString() {
return super.toString() + " (" + getRoleString() + ")";
}
public Set<String> getAllowedOrgUnitApnrs() {
Set<String> orgUnitApnrs = new TreeSet<String>();
for (OrgUnit ou : allowedOrgUnits) {
orgUnitApnrs.add(ou.getApnr());
}
return orgUnitApnrs;
}
public String getAllowedOrgUnitApnrsString() {
StringBuffer liste = new StringBuffer();
for (OrgUnit ou : allowedOrgUnits) {
liste.append(ou.getApnr() + ",");
}
return liste.toString();
}
public Set<OrgUnit> getAllowedOrgUnits() {
return allowedOrgUnits;
}
public boolean hasAllOrgUnitRights() {
boolean result = false;
if (isAdmin())
result = true;
else {
for (OrgUnit ou : allowedOrgUnits) {
if (ou.getApnr().contentEquals("0")) result = true;
}
}
return result;
}
public boolean hasDbFormRight(String dbFormName) {
if (!isAdmin()) {
// return maskenEditRights.contains(dbFormName);
return hasMaskenEditRights;
}
return true;
}
public void initThemenbaum() throws SQLException, DBServletException, TransformerException, NichtAngemeldetException {
themenbaum.init((Integer) getId(), getName(), this.isAdmin(), getMandantenID());
}
}
// Created on 06.12.2004 at 14:48:11