Dear Zimbra,

Zimra full version info: Release 6.0.8_GA_2661.RHEL5_64_20100824100342 CentOS5_64 NETWORK edition.

We have client application that adds appointments to Zimbra calendar, and tries to keep in sync. This is done with "helper" user account, not Zimbra admin.

This works fine, except when user deletes appointment on their calendar. When that happens, the client application does not know it was deleted, and gets "service.PERM_DENIED" when trying to find the appointment by its ID.

We cannot assume permission denied means appointment does not exist, as permission denied can happen for other reasons. Please let me know of solution, or workaround, for this, or if this is not issue in Zimra 7.


Thank you,
Ray

Login Request with helper user account, not Zimbra administration:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
		xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
		xmlns:zimbra="urn:zimbra"
		xmlns:zaccount="urn:zimbraAccount"
		xmlns:zmail="urn:zimbraMail"
		xmlns:zadmin="urn:zimbraAdmin">
	<soap:Header>
		<context xmlns="urn:zimbraSoap">
			<nonotify/>
			<noqualify/>
		</context>

	</soap:Header>
	<soap:Body>
		<zaccount:AuthRequest>
			<account by="name">advisor-admin</account>
			<password>...</password>
		</zaccount:AuthRequest>

	</soap:Body>
</soap:Envelope>
Login Response:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
    <soap:Header>
        <context xmlns="urn:zimbra">
            <change token="6849"/>
        </context>
    </soap:Header>
    <soap:Body>
        <AuthResponse xmlns="urn:zimbraAccount">
            <authToken>0_52cb...</authToken>
            <lifetime>119999</lifetime>
            <skin>beach</skin>
        </AuthResponse>
    </soap:Body>
</soap:Envelope>
Create Appointment Request:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
		xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
		xmlns:zimbra="urn:zimbra"
		xmlns:zaccount="urn:zimbraAccount"
		xmlns:zmail="urn:zimbraMail"
		xmlns:zadmin="urn:zimbraAdmin">
	<soap:Header>
		<zimbra:context xmlns="urn:zimbraSoap">
			<zaccount:authToken>0_52cb...</zaccount:authToken>
			<nonotify/>
			<noqualify/>
		</zimbra:context>

	</soap:Header>
	<soap:Body>
		<zmail:CreateAppointmentRequest>
			<m l="262">
				<su>SOAP Appointment</su>
				<inv>
					<comp
							name="Test A 04-05 15 min"
							status="CONF"
							fb="B"
							fba="B"
							url="https://www.egr.msu.edu/test/adcalendar/">
						<s d="20110405T140000Z"/>
						<e d="20110405T141500Z"/>
						<desc>Notes that show when appointment is opened.</desc>
					</comp>
				</inv>
			</m>
		</zmail:CreateAppointmentRequest>

	</soap:Body>
</soap:Envelope>
Create Appointment Response:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
    <soap:Header>
        <context xmlns="urn:zimbra">
            <change token="6849"/>
        </context>
    </soap:Header>
    <soap:Body>
        <CreateAppointmentResponse xmlns="urn:zimbraMail" apptId="468" calItemId="468" invId="468-467"/>
    </soap:Body>
</soap:Envelope>
Get Appointment While Alive Request:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
		xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
		xmlns:zimbra="urn:zimbra"
		xmlns:zaccount="urn:zimbraAccount"
		xmlns:zmail="urn:zimbraMail"
		xmlns:zadmin="urn:zimbraAdmin">
	<soap:Header>
		<zimbra:context xmlns="urn:zimbraSoap">
			<zaccount:authToken>0_52cb...</zaccount:authToken>
			<nonotify/>
			<noqualify/>
		</zimbra:context>

	</soap:Header>
	<soap:Body>
		<zmail:GetAppointmentRequest id="e583b35d-c01d-49cd-85eb-d98380d7ca48:468-467"/>

	</soap:Body>
</soap:Envelope>
Get Appointment While Alive Response:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
    <soap:Header>
        <context xmlns="urn:zimbra">
            <change token="6849"/>
        </context>
    </soap:Header>
    <soap:Body>
        <GetAppointmentResponse xmlns="urn:zimbraMail">
            <appt d="1303137671000" id="468" l="10" rev="8159" s="0" uid="a7e9c6b1-c6bd-4bdf-ae08-ea4bd1983302">
                <inv compNum="0" id="467" seq="0" type="appt">
                    <comp apptId="468" calItemId="468" class="PUB" compNum="0" d="1303137671000" fb="B" fba="B" isOrg="1" loc="" method="PUBLISH" name="Test A 04-05 15 min" noBlob="1" rsvp="0" seq="0" status="CONF" transp="O" uid="a7e9c6b1-c6bd-4bdf-ae08-ea4bd1983302" url="https://www.egr.msu.edu/test/adcalendar/" x_uid="a7e9c6b1-c6bd-4bdf-ae08-ea4bd1983302">
                        <desc>Notes that show when appointment is opened.</desc>
                        <s d="20110405T140000Z"/>
                        <e d="20110405T141500Z"/>
                    </comp>
                </inv>
                <replies/>
            </appt>
        </GetAppointmentResponse>
    </soap:Body>
</soap:Envelope>
Get Appointment after deleted Request (this is same as prior request):
Code:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
		xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
		xmlns:zimbra="urn:zimbra"
		xmlns:zaccount="urn:zimbraAccount"
		xmlns:zmail="urn:zimbraMail"
		xmlns:zadmin="urn:zimbraAdmin">
	<soap:Header>
		<zimbra:context xmlns="urn:zimbraSoap">
			<zaccount:authToken>0_52cb...</zaccount:authToken>
			<nonotify/>
			<noqualify/>
		</zimbra:context>

	</soap:Header>
	<soap:Body>
		<zmail:GetAppointmentRequest id="e583b35d-c01d-49cd-85eb-d98380d7ca48:468-467"/>

	</soap:Body>
</soap:Envelope>
Get Appointment after deleted Response:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
    <soap:Header>
        <context xmlns="urn:zimbra">
            <change token="6849"/>
        </context>
    </soap:Header>
    <soap:Body>
        <soap:Fault>
            <soap:Code>
                <soap:Value>soap:Sender</soap:Value>
            </soap:Code>
            <soap:Reason>
                <soap:Text>permission denied: you do not have sufficient permissions</soap:Text>
            </soap:Reason>
            <soap:Detail>
                <Error xmlns="urn:zimbra">
                    <Code>service.PERM_DENIED</Code>
                    <Trace>com.zimbra.common.service.ServiceException: permission denied: you do not have sufficient permissions
ExceptionId:btpool0-12://carmen.egr.msu.edu/service/soap:1303137671960:86b812c87f8f0cc9
Code:service.PERM_DENIED
	at com.zimbra.common.service.ServiceException.PERM_DENIED(ServiceException.java:278)
	at com.zimbra.cs.mailbox.Mailbox.checkAccess(Mailbox.java:1911)
	at com.zimbra.cs.mailbox.Mailbox.getItemById(Mailbox.java:1923)
	at com.zimbra.cs.mailbox.Mailbox.getCalendarItemById(Mailbox.java:3139)
	at com.zimbra.cs.service.mail.GetCalendarItem.handle(GetCalendarItem.java:64)
	at com.zimbra.soap.SoapEngine.dispatchRequest(SoapEngine.java:420)
	at com.zimbra.soap.DocumentHandler.proxyRequest(DocumentHandler.java:491)
	at com.zimbra.cs.service.mail.MailDocumentHandler.proxyRequest(MailDocumentHandler.java:142)
	at com.zimbra.cs.service.mail.MailDocumentHandler.proxyRequest(MailDocumentHandler.java:124)
	at com.zimbra.cs.service.mail.MailDocumentHandler.proxyIfNecessary(MailDocumentHandler.java:79)
	at com.zimbra.soap.SoapEngine.dispatchRequest(SoapEngine.java:411)
	at com.zimbra.soap.SoapEngine.dispatch(SoapEngine.java:274)
	at com.zimbra.soap.SoapEngine.dispatch(SoapEngine.java:158)
	at com.zimbra.soap.SoapServlet.doWork(SoapServlet.java:291)
	at com.zimbra.soap.SoapServlet.doPost(SoapServlet.java:212)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	at com.zimbra.cs.servlet.ZimbraServlet.service(ZimbraServlet.java:181)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
	at com.zimbra.cs.servlet.SetHeaderFilter.doFilter(SetHeaderFilter.java:79)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at org.mortbay.servlet.UserAgentFilter.doFilter(UserAgentFilter.java:81)
	at org.mortbay.servlet.GzipFilter.doFilter(GzipFilter.java:155)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
	at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
	at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.handler.rewrite.RewriteHandler.handle(RewriteHandler.java:230)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.handler.DebugHandler.handle(DebugHandler.java:77)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.Server.handle(Server.java:326)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:543)
	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:939)
	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:405)
	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:413)
	at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:451)
</Trace>
                </Error>
            </soap:Detail>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>