package org.karmaexchange.dao.derived; import static org.karmaexchange.util.OfyService.ofy; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; import org.karmaexchange.dao.BaseDao; import org.karmaexchange.dao.IdBaseDao; import org.karmaexchange.dao.Organization; import org.karmaexchange.dao.Permission; import org.karmaexchange.resources.msg.ErrorResponseMsg; import org.karmaexchange.resources.msg.ErrorResponseMsg.ErrorInfo; import org.karmaexchange.util.SalesforceUtil; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.ToString; import com.googlecode.objectify.Key; import com.googlecode.objectify.annotation.Cache; import com.googlecode.objectify.annotation.Entity; @XmlRootElement @Entity @Cache @Data @NoArgsConstructor @EqualsAndHashCode(callSuper=true) @ToString(callSuper=true) public class EventSourceInfo extends IdBaseDao<EventSourceInfo> { private static final long EVENT_SOURCE_ID = 1; private String secret; private String domain; public void init(Key<Organization> orgKey) { owner = orgKey; id = EVENT_SOURCE_ID; } @XmlTransient public Key<Organization> getOrgKey() { return Key.create(owner.getString()); } @XmlTransient public String getRegistrationUrl() { return "https://" + domain + SalesforceUtil.REGISTRATION_API_PATH; } @Override protected Permission evalPermission() { // TODO(avaliani): this is expensive. Need to re-evaluate if this makes sense. BaseDao<?> ownerDao = (BaseDao<?>) ofy().load().key(owner).now(); return ownerDao.getPermission(); } public static Key<EventSourceInfo> createKey(Key<Organization> orgKey) { return Key.<EventSourceInfo>create( orgKey, EventSourceInfo.class, EVENT_SOURCE_ID); } public static EventSourceInfo validateOrgSecret(String orgId, String orgSecret) { if (orgId == null) { throw ErrorResponseMsg.createException( "'orgId' must be specified", ErrorInfo.Type.BAD_REQUEST); } Key<Organization> orgKey = Organization.createKey(orgId); EventSourceInfo sourceInfo = ofy().load().key(EventSourceInfo.createKey(orgKey)).now(); if (sourceInfo == null) { throw ErrorResponseMsg.createException( "organization '" + orgId + "' is not configured to support derived events", ErrorInfo.Type.BAD_REQUEST); } if (!sourceInfo.getSecret().equals(orgSecret)) { throw ErrorResponseMsg.createException( "organization '" + orgId + "' authentication credentials are not valid", ErrorInfo.Type.AUTHENTICATION); } return sourceInfo; } }