use of org.bedework.caldav.util.sharing.InviteNotificationType in project bw-calendar-engine by Bedework.
the class Sharing method deletedNotification.
private InviteNotificationType deletedNotification(final String colPath, final String shareeHref, final String sharerHref, final String summary, final AccessType access) throws CalFacadeException {
final InviteNotificationType in = new InviteNotificationType();
in.setUid(Uid.getUid());
in.setHref(shareeHref);
in.setInviteStatus(removeStatus);
in.setAccess(access);
in.setHostUrl(colPath);
final OrganizerType org = new OrganizerType();
org.setHref(sharerHref);
in.setOrganizer(org);
in.setSummary(summary);
return in;
}
use of org.bedework.caldav.util.sharing.InviteNotificationType in project bw-calendar-engine by Bedework.
the class Sharing method unsubscribe.
@Override
public void unsubscribe(final BwCalendar col) throws CalFacadeException {
if (!col.getInternalAlias()) {
return;
}
final BwCalendar shared = getCols().resolveAlias(col, true, false);
if (shared == null) {
// Gone or no access - nothing to do now.
return;
}
final String sharerHref = shared.getOwnerHref();
final BwPrincipal sharee = getSvc().getPrincipal();
pushPrincipal(sharerHref);
try {
/* Get the invite property and locate and update this sharee */
final InviteType invite = getInviteStatus(shared);
UserType uentry = null;
final String invitee = principalToCaladdr(sharee);
if (invite != null) {
uentry = invite.finduser(invitee);
}
if (uentry == null) {
if (debug) {
trace("Cannot find invitee: " + invitee);
}
return;
}
uentry.setInviteStatus(AppleServerTags.inviteDeclined);
shared.setProperty(NamespaceAbbrevs.prefixed(AppleServerTags.invite), invite.toXml());
getCols().update(shared);
/* At this stage we need a message to notify the sharer -
change notification.
The name of the alias is the uid of the original invite
*/
final NotificationType note = new NotificationType();
note.setDtstamp(new DtStamp(new DateTime(true)).getValue());
// Create a reply object.
final InviteReplyType reply = new InviteReplyType();
reply.setHref(principalToCaladdr(sharee));
reply.setAccepted(false);
reply.setHostUrl(shared.getPath());
reply.setInReplyTo(col.getName());
reply.setSummary(col.getSummary());
note.setNotification(reply);
getSvc().getNotificationsHandler().add(note);
} catch (final CalFacadeException cfe) {
throw cfe;
} catch (final Throwable t) {
throw new CalFacadeException(t);
} finally {
popPrincipal();
}
/*
final BwPrincipal pr = caladdrToPrincipal(getPrincipalHref());
if (pr != null) {
pushPrincipal(shared.getOwnerHref());
NotificationType n = null;
try {
n = findInvite(pr, shared.getPath());
} finally {
popPrincipal();
}
if (n != null) {
InviteNotificationType in = (InviteNotificationType)n.getNotification();
Holder<AccessType> access = new Holder<AccessType>();
// Create a dummy reply object.
InviteReplyType reply = new InviteReplyType();
reply.setHref(getPrincipalHref());
reply.setAccepted(false);
reply.setHostUrl(shared.getPath());
reply.setInReplyTo(in.getUid());
updateSharingStatus(shared.getOwnerHref(), shared.getPath(), reply, access);
}
}
*/
}
use of org.bedework.caldav.util.sharing.InviteNotificationType in project bw-calendar-engine by Bedework.
the class Sharing method doSet.
private InviteNotificationType doSet(final BwCalendar col, final SetType s, final List<AddPrincipal> addPrincipals, final String calAddr, final InviteType invite) throws CalFacadeException {
final Sharee sh = getSharee(s.getHref());
if ((sh.pr != null) && sh.pr.equals(getPrincipal())) {
// Inviting ourself
return null;
}
/*
pr != null means this is potentially one of our users.
If the principal doesn't exist and we handle outbound
notifications then we should drop a notification into the
global notification collection. Eventually the user will log in
we hope - we can then turn that invite into a real local user
invite,
*/
UserType uentry = invite.finduser(sh.href);
if (uentry != null) {
if (uentry.getInviteStatus().equals(Parser.inviteNoresponseTag)) {
// Already an outstanding invitation
final NotificationType n = findInvite(sh.pr, col.getPath());
if (n != null) {
final InviteNotificationType in = (InviteNotificationType) n.getNotification();
if (in.getAccess().equals(s.getAccess())) {
// In their collection - no need to resend.
return null;
}
/* Delete the old notification - we're changing the access */
deleteInvite(sh.pr, n);
}
}
}
final InviteNotificationType in = new InviteNotificationType();
in.setSharedType(InviteNotificationType.sharedTypeCalendar);
in.setUid(Uid.getUid());
in.setHref(sh.href);
in.setInviteStatus(Parser.inviteNoresponseTag);
in.setAccess(s.getAccess());
in.setHostUrl(col.getPath());
in.setSummary(s.getSummary());
final OrganizerType org = new OrganizerType();
org.setHref(calAddr);
in.setOrganizer(org);
in.getSupportedComponents().addAll(col.getSupportedComponents());
// Update the collection sharing status
if (uentry != null) {
uentry.setInviteStatus(in.getInviteStatus());
uentry.setAccess(in.getAccess());
} else {
uentry = new UserType();
uentry.setHref(sh.href);
uentry.setInviteStatus(in.getInviteStatus());
uentry.setCommonName(s.getCommonName());
uentry.setAccess(in.getAccess());
uentry.setSummary(s.getSummary());
invite.getUsers().add(uentry);
}
uentry.setExternalUser(!sh.external);
if (!sh.external) {
addPrincipals.add(new AddPrincipal(sh.pr, s.getAccess().testRead()));
}
return in;
}
use of org.bedework.caldav.util.sharing.InviteNotificationType in project bw-calendar-engine by Bedework.
the class Sharing method doRemove.
/**
* Remove a principal from the list of sharers
*/
private InviteNotificationType doRemove(final BwCalendar col, final RemoveType rem, final String calAddr, final InviteType invite) throws CalFacadeException {
final String href = getSvc().getDirectories().normalizeCua(rem.getHref());
final UserType uentry = invite.finduser(href);
if (uentry == null) {
// Not in list of sharers
return null;
}
invite.getUsers().remove(uentry);
final InviteNotificationType note = deletedNotification(col.getPath(), href, calAddr, col.getSummary(), uentry.getAccess());
note.setPreviousStatus(uentry.getInviteStatus());
removeAlias(col, uentry.getHref(), false);
return note;
}
use of org.bedework.caldav.util.sharing.InviteNotificationType in project bw-calendar-engine by Bedework.
the class Sharing method share.
@Override
public ShareResultType share(final BwCalendar col, final ShareType share) throws CalFacadeException {
if (!col.getCanAlias()) {
throw new CalFacadeForbidden("Cannot share");
}
final ShareResultType sr = new ShareResultType();
final List<String> removePrincipalHrefs = new ArrayList<>();
final List<AddPrincipal> addPrincipals = new ArrayList<>();
final String calAddr = principalToCaladdr(getPrincipal());
final InviteType invite = getInviteStatus(col);
if (invite.getOrganizer() == null) {
final OrganizerType org = new OrganizerType();
org.setHref(calAddr);
invite.setOrganizer(org);
}
final List<InviteNotificationType> notifications = new ArrayList<>();
boolean addedSharee = false;
boolean removedSharee = false;
/* If there are any removal elements in the invite, remove those
* sharees. We'll flag hrefs as bad if they are not actually sharees.
*
* If we do remove a sharee we'll add notifications to the list
* to send later.
*/
for (final RemoveType rem : share.getRemove()) {
final InviteNotificationType n = doRemove(col, rem, calAddr, invite);
if (n != null) {
removedSharee = true;
if ((n.getPreviousStatus() != null) && !n.getPreviousStatus().equals(declineStatus)) {
// We don't notify if the user had declined
notifications.add(n);
}
sr.addGood(rem.getHref());
removePrincipalHrefs.add(rem.getHref());
} else {
sr.addBad(rem.getHref());
}
}
/* Now deal with the added sharees if there are any.
*/
for (final SetType set : share.getSet()) {
final InviteNotificationType n = doSet(col, set, addPrincipals, calAddr, invite);
if (n != null) {
addedSharee = true;
notifications.add(n);
sr.addGood(set.getHref());
} else {
sr.addBad(set.getHref());
}
}
if (!addedSharee && !removedSharee) {
// Nothing changed
return sr;
}
/* Send any invitations and update the sharing status.
* If it's a removal and the current status is not
* accepted then just delete the current invitation
*/
final Notifications notify = (Notifications) getSvc().getNotificationsHandler();
sendNotifications: for (final InviteNotificationType in : notifications) {
final Sharee sh = getSharee(in.getHref());
final boolean remove = in.getInviteStatus().equals(removeStatus);
final List<NotificationType> notes = notify.getMatching(in.getHref(), AppleServerTags.inviteNotification);
if (!Util.isEmpty(notes)) {
for (final NotificationType n : notes) {
final InviteNotificationType nin = (InviteNotificationType) n.getNotification();
if (!nin.getHostUrl().equals(in.getHostUrl())) {
continue;
}
if (remove) {
if (nin.getInviteStatus().equals(noresponseStatus)) {
notify.remove(sh.pr, n);
continue sendNotifications;
}
} else {
notify.remove(sh.pr, n);
}
}
}
final NotificationType note = new NotificationType();
note.setDtstamp(new DtStamp(new DateTime(true)).getValue());
note.setNotification(in);
notify.send(sh.pr, note);
/* Add the invite to the set of properties associated with this collection
* We give it a name consisting of the inviteNotification tag + uid.
*/
final QName qn = new QName(AppleServerTags.inviteNotification.getNamespaceURI(), AppleServerTags.inviteNotification.getLocalPart() + in.getUid());
try {
col.setProperty(NamespaceAbbrevs.prefixed(qn), in.toXml());
} catch (final CalFacadeException cfe) {
throw cfe;
} catch (final Throwable t) {
throw new CalFacadeException(t);
}
}
if (addedSharee && !col.getShared()) {
// Mark the collection as shared
col.setShared(true);
}
try {
col.setQproperty(AppleServerTags.invite, invite.toXml());
getCols().update(col);
for (final String principalHref : removePrincipalHrefs) {
removeAccess(col, principalHref);
}
for (final AddPrincipal ap : addPrincipals) {
setAccess(col, ap);
}
} catch (final CalFacadeException cfe) {
throw cfe;
} catch (final Throwable t) {
throw new CalFacadeException(t);
}
return sr;
}
Aggregations