Search in sources :

Example 76 with CalFacadeException

use of org.bedework.calfacade.exc.CalFacadeException in project bw-calendar-engine by Bedework.

the class BwUpdates method validateDates.

private UpdateResult validateDates(final EventInfo ei) throws WebdavException {
    DatesState ds = (DatesState) state.get(DatesState.stateName);
    if (ds == null) {
        return UpdateResult.getOkResult();
    }
    BwEvent ev = ei.getEvent();
    boolean task = ev.getEntityType() == IcalDefs.entityTypeTodo;
    PropertyInfoIndex endPi;
    ChangeTable chg = ei.getChangeset(userHref);
    if (task) {
        endPi = PropertyInfoIndex.DUE;
    } else {
        endPi = PropertyInfoIndex.DTEND;
    }
    try {
        boolean scheduleReply = ev.getScheduleMethod() == ScheduleMethods.methodTypeReply;
        if (ds.start == null) {
            if (!scheduleReply && !task) {
                return new UpdateResult("org.bedework.error.nostartdate");
            }
            /* A todo can have no date and time. set start to now, end to
         * many years from now and the noStart flag.
         *
         * Such an entry has to appear only on the current day.
         */
            if (ds.end != null) {
                ds.start = ds.end;
            } else {
                Date now = new Date(new java.util.Date().getTime());
                DtStart dtStart = new DtStart(now);
                dtStart.getParameters().add(Value.DATE);
                ds.start = BwDateTime.makeBwDateTime(dtStart);
            }
            if (!ev.getNoStart() || !CalFacadeUtil.eqObjval(ev.getDtstart(), ds.start)) {
                chg.changed(PropertyInfoIndex.DTSTART, ev.getDtstart(), null);
                ev.setDtstart(ds.start);
                ev.setNoStart(true);
            }
        } else if (ev.getNoStart() || !ds.start.equals(ev.getDtstart())) {
            chg.changed(PropertyInfoIndex.DTSTART, ev.getDtstart(), ds.start);
            ev.setNoStart(false);
            ev.setDtstart(ds.start);
        }
        char endType = StartEndComponent.endTypeNone;
        if (ds.end != null) {
            if ((ev.getEndType() != StartEndComponent.endTypeDate) || !CalFacadeUtil.eqObjval(ev.getDtend(), ds.end)) {
                chg.changed(endPi, ev.getDtend(), ds.end);
                endType = StartEndComponent.endTypeDate;
                ev.setDtend(ds.end);
            }
        } else if (scheduleReply || task) {
            // about 10 years
            Dur years = new Dur(520);
            Date now = new Date(new java.util.Date().getTime());
            DtEnd dtEnd = new DtEnd(new Date(years.getTime(now)));
            dtEnd.getParameters().add(Value.DATE);
            ds.end = BwDateTime.makeBwDateTime(dtEnd);
            if (!CalFacadeUtil.eqObjval(ev.getDtend(), ds.end)) {
                chg.changed(endPi, ev.getDtend(), ds.end);
                ev.setDtend(ds.end);
            }
        }
        /**
         * If we were given a duration store it in the event and calculate
         *          an end to the event - which we should not have been given.
         */
        if (ds.duration != null) {
            if (endType != StartEndComponent.endTypeNone) {
                if (ev.getEntityType() == IcalDefs.entityTypeFreeAndBusy) {
                // Apple is sending both - duration indicates the minimum
                // freebusy duration. Ignore for now.
                } else {
                    return new UpdateResult(CalFacadeException.endAndDuration);
                }
            }
            endType = StartEndComponent.endTypeDuration;
            if (!ds.duration.equals(ev.getDuration())) {
                chg.changed(PropertyInfoIndex.DURATION, ev.getDuration(), ds.duration);
                ev.setDuration(ds.duration);
            }
            ev.setDtend(BwDateTime.makeDateTime(ev.getDtstart().makeDtStart(), ev.getDtstart().getDateType(), new Dur(ds.duration)));
        } else if (!scheduleReply && (endType == StartEndComponent.endTypeNone) && !task) {
            /* No duration and no end specified.
         * Set the end values to the start values + 1 for dates
         */
            boolean dateOnly = ev.getDtstart().getDateType();
            Dur dur;
            if (dateOnly) {
                // 1 day
                dur = new Dur(1, 0, 0, 0);
            } else {
                // No duration
                dur = new Dur(0, 0, 0, 0);
            }
            BwDateTime bwDtEnd = BwDateTime.makeDateTime(ev.getDtstart().makeDtStart(), dateOnly, dur);
            if (!CalFacadeUtil.eqObjval(ev.getDtend(), bwDtEnd)) {
                chg.changed(endPi, ev.getDtend(), bwDtEnd);
                ev.setDtend(bwDtEnd);
            }
        }
        if ((endType != StartEndComponent.endTypeDuration) && (ev.getDtstart() != null) && (ev.getDtend() != null)) {
            // Calculate a duration
            String durVal = BwDateTime.makeDuration(ev.getDtstart(), ev.getDtend()).toString();
            if (!durVal.equals(ev.getDuration())) {
                chg.changed(PropertyInfoIndex.DURATION, ev.getDuration(), durVal);
                ev.setDuration(durVal);
            }
        }
        ev.setEndType(endType);
        return UpdateResult.getOkResult();
    } catch (CalFacadeException cfe) {
        throw new WebdavException(cfe);
    }
}
Also used : Dur(net.fortuna.ical4j.model.Dur) BwDateTime(org.bedework.calfacade.BwDateTime) WebdavException(org.bedework.webdav.servlet.shared.WebdavException) BwEvent(org.bedework.calfacade.BwEvent) Date(net.fortuna.ical4j.model.Date) CalFacadeException(org.bedework.calfacade.exc.CalFacadeException) PropertyInfoIndex(org.bedework.util.calendar.PropertyIndex.PropertyInfoIndex) DtStart(net.fortuna.ical4j.model.property.DtStart) ChangeTable(org.bedework.calfacade.util.ChangeTable) DatesState(org.bedework.caldav.bwserver.stdupdaters.DateDatetimePropUpdater.DatesState) UpdateResult(org.bedework.caldav.server.sysinterface.SysIntf.UpdateResult) DtEnd(net.fortuna.ical4j.model.property.DtEnd)

Example 77 with CalFacadeException

use of org.bedework.calfacade.exc.CalFacadeException in project bw-calendar-engine by Bedework.

the class AccessUtil method checkAccess.

@Override
public CurrentAccess checkAccess(final BwShareableDbentity<?> ent, final int desiredAccess, final boolean alwaysReturnResult) throws CalFacadeException {
    if (ent == null) {
        return null;
    }
    if (ent instanceof CalendarWrapper) {
        final CalendarWrapper col = (CalendarWrapper) ent;
        final CurrentAccess ca = col.getCurrentAccess(desiredAccess);
        if (ca != null) {
            if (debug) {
                debug("Access " + desiredAccess + " already checked for " + cb.getPrincipal().getPrincipalRef() + " and allowed=" + ca.getAccessAllowed());
            }
            if (!ca.getAccessAllowed() && !alwaysReturnResult) {
                throw new CalFacadeAccessException();
            }
            return ca;
        }
    }
    if (debug) {
        final String cname = ent.getClass().getName();
        final String ident;
        if (ent instanceof BwCalendar) {
            ident = ((BwCalendar) ent).getPath();
        } else {
            ident = String.valueOf(ent.getId());
        }
        debug("Check access by " + cb.getPrincipal().getPrincipalRef() + " for object " + cname.substring(cname.lastIndexOf(".") + 1) + " ident=" + ident + " desiredAccess = " + desiredAccess);
    }
    try {
        final long startTime = System.currentTimeMillis();
        CurrentAccess ca = null;
        final AccessPrincipal owner = cb.getPrincipal(ent.getOwnerHref());
        if (debug) {
            debug("After getPrincipal - took: " + (System.currentTimeMillis() - startTime));
        }
        if (owner == null) {
            error("Principal(owner) " + ent.getOwnerHref() + " does not exist");
            if (!alwaysReturnResult) {
                throw new CalFacadeAccessException();
            }
            return new CurrentAccess(false);
        }
        PrivilegeSet maxPrivs = null;
        char[] aclChars = null;
        if (ent instanceof BwCalendar) {
            final BwCalendar cal = (BwCalendar) ent;
            final String path = cal.getPath();
            /* I think this was wrong. For superuser we want to see the real
         * access but they are going to be allowed access whatever.
        if (userRootPath.equals(path)) {
          ca = new CurrentAccess();

          if (getSuperUser()) {
            ca.privileges = PrivilegeSet.makeDefaultOwnerPrivileges();
          } else {
            ca.privileges = PrivilegeSet.makeDefaultNonOwnerPrivileges();
          }
        } else if (path.equals(userHomePathPrefix + account)){
          // Accessing user home directory
          if (getSuperUser()) {
            ca = new CurrentAccess();

            ca.privileges = PrivilegeSet.makeDefaultOwnerPrivileges();
          } else {
            // Set the maximumn access
            maxPrivs = PrivilegeSet.userHomeMaxPrivileges;
          }
        }
         */
            if (!cb.getSuperUser()) {
                if (cb.getUserHomePath().equals(path)) {
                    ca = new CurrentAccess();
                    ca = Acl.defaultNonOwnerAccess;
                } else if (path.equals(Util.buildPath(colPathEndsWithSlash, cb.getUserHomePath(), "/", owner.getAccount()))) {
                    // Accessing user home directory
                    // Set the maximumn access
                    maxPrivs = PrivilegeSet.userHomeMaxPrivileges;
                }
            }
        }
        if (maxPrivs == null) {
            maxPrivs = cb.getMaximumAllowedPrivs();
        } else if (cb.getMaximumAllowedPrivs() != null) {
            maxPrivs = PrivilegeSet.filterPrivileges(maxPrivs, cb.getMaximumAllowedPrivs());
        }
        if (ca == null) {
            /* Not special. getAclChars provides merged access for the current
         * entity.
         */
            aclChars = getAclChars(ent);
            if (aclChars == null) {
                error("Unable to fetch aclchars for " + ent);
                if (!alwaysReturnResult) {
                    throw new CalFacadeAccessException();
                }
                return new CurrentAccess(false);
            }
            if (debug) {
                debug("aclChars = " + new String(aclChars));
            }
            if (desiredAccess == privAny) {
                ca = access.checkAny(cb, cb.getPrincipal(), owner, aclChars, maxPrivs);
            } else if (desiredAccess == privRead) {
                ca = access.checkRead(cb, cb.getPrincipal(), owner, aclChars, maxPrivs);
            } else if (desiredAccess == privWrite) {
                ca = access.checkReadWrite(cb, cb.getPrincipal(), owner, aclChars, maxPrivs);
            } else {
                ca = access.evaluateAccess(cb, cb.getPrincipal(), owner, desiredAccess, aclChars, maxPrivs);
            }
        }
        if ((cb.getPrincipal() != null) && cb.getSuperUser()) {
            /* Override rather than just create a readable access as code further
         * up expects a valid filled in object.
         */
            if (debug && !ca.getAccessAllowed()) {
                debug("Override for superuser");
            }
            ca = Acl.forceAccessAllowed(ca);
        }
        if (ent instanceof CalendarWrapper) {
            final CalendarWrapper col = (CalendarWrapper) ent;
            col.setCurrentAccess(ca, desiredAccess);
        }
        if (debug) {
            debug("access allowed: " + ca.getAccessAllowed());
        }
        if (!ca.getAccessAllowed() && !alwaysReturnResult) {
            throw new CalFacadeAccessException();
        }
        return ca;
    } catch (final CalFacadeException cfe) {
        throw cfe;
    } catch (final Throwable t) {
        throw new CalFacadeException(t);
    }
}
Also used : PrivilegeSet(org.bedework.access.PrivilegeSet) CurrentAccess(org.bedework.access.Acl.CurrentAccess) CalendarWrapper(org.bedework.calfacade.wrappers.CalendarWrapper) BwCalendar(org.bedework.calfacade.BwCalendar) CalFacadeAccessException(org.bedework.calfacade.exc.CalFacadeAccessException) AccessPrincipal(org.bedework.access.AccessPrincipal) CalFacadeException(org.bedework.calfacade.exc.CalFacadeException)

Example 78 with CalFacadeException

use of org.bedework.calfacade.exc.CalFacadeException in project bw-calendar-engine by Bedework.

the class AccessUtil method getAclChars.

/* ====================================================================
   *                   Private methods
   * ==================================================================== */
/* If the entity is not a collection we merge the access in with the container
   * access then return the merged aces. We do this because we call getPathInfo
   * with a collection entity. That method will recurse up to the root.
   *
   * For a calendar we just use the access for the calendar.
   *
   * The calendar/container access might be cached in the pathInfoTable.
   */
private char[] getAclChars(final BwShareableDbentity<?> ent) throws CalFacadeException {
    if ((!(ent instanceof BwEventProperty)) && (ent instanceof BwShareableContainedDbentity)) {
        BwCalendar container;
        if (ent instanceof BwCalendar) {
            container = (BwCalendar) ent;
        } else {
            container = getParent((BwShareableContainedDbentity<?>) ent);
        }
        if (container == null) {
            return null;
        }
        final String path = container.getPath();
        CalendarWrapper wcol = (CalendarWrapper) container;
        String aclStr;
        char[] aclChars = null;
        /* Get access for the parent first if we have one */
        BwCalendar parent = getParent(wcol);
        if (parent != null) {
            aclStr = new String(merged(getAclChars(parent), parent.getPath(), wcol.getAccess()));
        } else if (wcol.getAccess() != null) {
            aclStr = wcol.getAccess();
        } else {
            // At root
            throw new CalFacadeException("Collections must have default access set at root");
        }
        if (aclStr != null) {
            aclChars = aclStr.toCharArray();
        }
        if (ent instanceof BwCalendar) {
            return aclChars;
        }
        return merged(aclChars, path, ent.getAccess());
    }
    /* This is a way of making other objects sort of shareable.
     * The objects are locations, sponsors and categories.
     * (also calsuite)
     *
     * We store the default access in the owner principal and manipulate that to give
     * us some degree of sharing.
     *
     * In effect, the owner becomes the container for the object.
     */
    String aclString = null;
    String entAccess = ent.getAccess();
    BwPrincipal owner = (BwPrincipal) cb.getPrincipal(ent.getOwnerHref());
    if (ent instanceof BwCategory) {
        aclString = owner.getCategoryAccess();
    } else if (ent instanceof BwLocation) {
        aclString = owner.getLocationAccess();
    } else if (ent instanceof BwContact) {
        aclString = owner.getContactAccess();
    }
    if (aclString == null) {
        if (entAccess == null) {
            if (ent.getPublick()) {
                return Access.getDefaultPublicAccess().toCharArray();
            }
            return Access.getDefaultPersonalAccess().toCharArray();
        }
        return entAccess.toCharArray();
    }
    if (entAccess == null) {
        return aclString.toCharArray();
    }
    try {
        Acl acl = Acl.decode(entAccess.toCharArray());
        acl = acl.merge(aclString.toCharArray(), "/owner");
        return acl.getEncoded();
    } catch (Throwable t) {
        throw new CalFacadeException(t);
    }
}
Also used : BwLocation(org.bedework.calfacade.BwLocation) BwShareableContainedDbentity(org.bedework.calfacade.base.BwShareableContainedDbentity) BwCategory(org.bedework.calfacade.BwCategory) BwEventProperty(org.bedework.calfacade.BwEventProperty) BwCalendar(org.bedework.calfacade.BwCalendar) BwContact(org.bedework.calfacade.BwContact) Acl(org.bedework.access.Acl) CalFacadeException(org.bedework.calfacade.exc.CalFacadeException) BwPrincipal(org.bedework.calfacade.BwPrincipal) CalendarWrapper(org.bedework.calfacade.wrappers.CalendarWrapper)

Example 79 with CalFacadeException

use of org.bedework.calfacade.exc.CalFacadeException in project bw-calendar-engine by Bedework.

the class CalintfBase method init.

@Override
public void init(final String logId, final Configurations configs, final PrincipalInfo PrincipalInfo, final String url, final boolean publicAdmin, final boolean publicSubmission, final boolean sessionless, final boolean dontKill) throws CalFacadeException {
    this.logId = logId;
    this.configs = configs;
    this.principalInfo = PrincipalInfo;
    this.url = url;
    this.sessionless = sessionless;
    this.dontKill = dontKill;
    debug = getLogger().isDebugEnabled();
    try {
        access = new AccessUtil();
        access.init(principalInfo);
    } catch (final Throwable t) {
        throw new CalFacadeException(t);
    }
    ac = new CIAccessChecker();
    if (principalInfo.getPrincipal().getUnauthenticated()) {
        currentMode = CalintfDefs.guestMode;
    } else if (publicAdmin) {
        currentMode = CalintfDefs.publicAdminMode;
    } else if (publicSubmission) {
        currentMode = CalintfDefs.publicUserMode;
    } else {
        currentMode = CalintfDefs.userMode;
    }
}
Also used : CalFacadeException(org.bedework.calfacade.exc.CalFacadeException)

Example 80 with CalFacadeException

use of org.bedework.calfacade.exc.CalFacadeException in project bw-calendar-engine by Bedework.

the class CalintfImpl method save.

/* ====================================================================
   *                       filter defs
   * ==================================================================== */
@Override
public void save(final BwFilterDef val, final BwPrincipal owner) throws CalFacadeException {
    final BwFilterDef fd = filterDefs.fetch(val.getName(), owner);
    if (fd != null) {
        throw new CalFacadeException(CalFacadeException.duplicateFilter, val.getName());
    }
    entityDao.save(val);
}
Also used : BwFilterDef(org.bedework.calfacade.BwFilterDef) CalFacadeException(org.bedework.calfacade.exc.CalFacadeException)

Aggregations

CalFacadeException (org.bedework.calfacade.exc.CalFacadeException)298 BwCalendar (org.bedework.calfacade.BwCalendar)55 BwEvent (org.bedework.calfacade.BwEvent)55 EventInfo (org.bedework.calfacade.svc.EventInfo)37 WebdavException (org.bedework.webdav.servlet.shared.WebdavException)32 ArrayList (java.util.ArrayList)28 BwString (org.bedework.calfacade.BwString)26 BwDateTime (org.bedework.calfacade.BwDateTime)24 IndexException (org.bedework.util.indexing.IndexException)23 BwPrincipal (org.bedework.calfacade.BwPrincipal)22 TreeSet (java.util.TreeSet)19 BwAttendee (org.bedework.calfacade.BwAttendee)18 CalFacadeAccessException (org.bedework.calfacade.exc.CalFacadeAccessException)16 Calendar (net.fortuna.ical4j.model.Calendar)15 DateTime (net.fortuna.ical4j.model.DateTime)15 Period (net.fortuna.ical4j.model.Period)13 BwCategory (org.bedework.calfacade.BwCategory)13 StringReader (java.io.StringReader)12 CoreEventInfo (org.bedework.calcorei.CoreEventInfo)12 BwEventProxy (org.bedework.calfacade.BwEventProxy)12