public async Task<HttpResponseMessage> RegisterJiveInstance(JiveAddonRegistrationDto jiveRegistration) { if (ModelState.IsValid) { try { _response = await Request.Content.ReadAsStringAsync(); //Convert our Jive Addon registration from the Data Transfer Object into an internal object //Example of an add-on registration request //{ // "tenantId": "b22e3911-28ef-480c-ae3b-ca791ba86952", // "jiveSignatureURL": "https://market.apps.jivesoftware.com/appsmarket/services/rest/jive/instance/validation/8ce5c231-fab8-46b1-b8b2-fc65ascesb5d", // "timestamp": "2014-02-17T14:07:09.135+0000", // "jiveUrl": "https://sandbox.jiveon.com", // "jiveSignature": "r3gMujBUIWLUyvAp81TK9YasdAdDaRtlsQ6x+Ig=", // "clientSecret": "bmdoprg381uypaffd7xrl123c9znb5fjsb.s", // "clientId": "mrymd1f8oziyamo0yxdasdw9yovigd9t.i" //} Mapper.CreateMap<JiveAddonRegistrationDto, JiveAddonRegistration>(); JiveAddonRegistration myJiveRegistration = Mapper.Map<JiveAddonRegistrationDto, JiveAddonRegistration>(jiveRegistration); db.JiveRegistrations.Add(myJiveRegistration); db.SaveChanges(); if (Convert.ToBoolean(jiveRegistration.uninstalled) != true) { //check if this is a valid Jive environment StringBuilder validationPayload = new StringBuilder(); validationPayload.Append("clientId:"); validationPayload.Append(myJiveRegistration.ClientId + "\n"); validationPayload.Append("clientSecret:"); System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); byte[] secret = encoding.GetBytes(myJiveRegistration.ClientSecret); HMACSHA256 hmacsha256 = new HMACSHA256(); hmacsha256.ComputeHash(secret); foreach (byte b in hmacsha256.Hash) { validationPayload.AppendFormat("{0:x2}", b); } validationPayload.Append("\n" + "jiveSignatureURL:"); validationPayload.Append(myJiveRegistration.JiveSignatureURL + "\n"); validationPayload.Append("jiveUrl:"); validationPayload.Append(myJiveRegistration.JiveUrl + "\n"); validationPayload.Append("tenantId:"); validationPayload.Append(myJiveRegistration.TenantId + "\n"); validationPayload.Append("timestamp:"); validationPayload.Append(myJiveRegistration.Timestamp + "\n"); string validationPayloadString = validationPayload.ToString(); byte[] binaryPayload = encoding.GetBytes(validationPayloadString); //Validate with the Jive webservice that the request orininated from JIve //Alternatively validate with your local environment in some form //This method is not fully implemented in this example using (WebClient wc = new WebClient()) { wc.Headers.Set("X-Jive-MAC", myJiveRegistration.JiveSignature); try { byte[] postResult = wc.UploadData(myJiveRegistration.JiveSignatureURL, binaryPayload); } catch (System.Net.WebException webEx) { Trace.WriteLine(webEx, "Error"); } } } //Check if the Jive instance already exists, otherwise create it JiveInstance myJiveInstance = db.JiveInstances.Find(myJiveRegistration.TenantId); if (myJiveInstance == null) { //Jive instance not created yet. Let's build it myJiveInstance = new JiveInstance(); myJiveInstance.DateCreated = DateTime.Now; myJiveInstance.IsComplete = false; myJiveInstance.JiveInstanceId = myJiveRegistration.TenantId; myJiveInstance.LastUpdated = DateTime.Now; myJiveInstance.Url = myJiveRegistration.JiveUrl; myJiveInstance.IsComplete = false; myJiveInstance.IsLicensed = true; myJiveInstance.IsInstalledViaAddon = true; db.JiveInstances.Add(myJiveInstance); db.SaveChanges(); User newAdmin = new User(); newAdmin.DateCreated = DateTime.Now; } JiveAddon myJiveAddon; if (Convert.ToBoolean(myJiveRegistration.Uninstalled) == true) { //Addon uninstalled myJiveAddon = db.JiveAddons .Include("JiveInstance") .Where(a => a.JiveInstance.JiveInstanceId.Equals(myJiveRegistration.TenantId)).First(); myJiveAddon.Uninstalled = true; db.SaveChanges(); } else { //Addon is being installed //Create a new add-on var _jiveAddons = db.JiveAddons .Include("JiveInstance") .Where(a => a.JiveInstance.JiveInstanceId.Equals(myJiveRegistration.TenantId)); if (_jiveAddons.Count() == 0) { myJiveAddon = new JiveAddon(); myJiveAddon.AddonType = "My wonderful app"; myJiveAddon.ClientId = myJiveRegistration.ClientId; string clientSecret = myJiveRegistration.ClientSecret; if (clientSecret.EndsWith(".s")) { clientSecret = clientSecret.TrimEnd('s'); clientSecret = clientSecret.TrimEnd('.'); } myJiveAddon.ClientSecret = clientSecret; myJiveAddon.DateCreated = DateTime.Now; myJiveAddon.JiveInstance = myJiveInstance; myJiveAddon.Code = myJiveRegistration.Code; myJiveAddon.Scope = myJiveRegistration.Scope; myJiveRegistration.Timestamp = myJiveRegistration.Timestamp; myJiveAddon.Uninstalled = false; db.JiveAddons.Add(myJiveAddon); db.SaveChanges(); } else { //Update existing addon myJiveAddon = _jiveAddons.First(); myJiveAddon.ClientId = myJiveRegistration.ClientId; string clientSecret = myJiveRegistration.ClientSecret; if (clientSecret.EndsWith(".s")) { clientSecret = clientSecret.TrimEnd('s'); clientSecret = clientSecret.TrimEnd('.'); } myJiveAddon.ClientSecret = clientSecret; myJiveAddon.Code = myJiveRegistration.Code; myJiveAddon.Scope = myJiveRegistration.Scope; myJiveRegistration.Timestamp = myJiveRegistration.Timestamp; myJiveAddon.Uninstalled = false; db.SaveChanges(); } } HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, jiveRegistration); return response; } catch (Exception ex) { Trace.WriteLine(ex, "Error"); HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.InternalServerError); return response; } } else { return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); } }