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); } }
public void SetAccess(string userId) { using (JiveSdkContext db = new JiveSdkContext()) { try { //Retrieve the current user from the database //Not recommended for production where it would be more efficient //to user a caching mechanism to minimize sql queries var _myUser = db.Users .Include("JiveInstance") .Where(u => u.UserId == userId); User myUser = null; if (_myUser.Count() > 0) { myUser = _myUser.First(); if (myUser.DisplayName != null) { ViewBag.ownerName = myUser.DisplayName; } else { ViewBag.ownerName = "Display name not set in DB"; } ViewBag.ownerId = userId; ViewBag.jiveUrl = myUser.JiveInstance.Url; string culture = Thread.CurrentThread.CurrentCulture.ToString(); } else { //This user is not registered in the database yet string[] jiveInstanceTemp = userId.Split('@'); String userJiveInstance = jiveInstanceTemp[1]; // Find the instance ID for the user var _jiveInstanceForUser = db.JiveInstances .Include("Users") .Include("JiveInstanceSettings") .Where(j => j.JiveInstanceId.Equals(userJiveInstance)); if (_jiveInstanceForUser.Count() == 0) { //The JiveInstance does not exist yet. This is a legacy setting for apps delivered via the Jive Apps market isNewJiveInstance = true; jiveInstanceForUser = null; } else { isNewJiveInstance = false; jiveInstanceForUser = _jiveInstanceForUser.First(); if (jiveInstanceForUser.Users.Count() == 0) { jiveInstanceForUser.Users = new List<User>(); } } //Create a new JiveInstance if no one has installed the app on this system yet //This is a legacy setting for apps delivered via the Jive Apps market if (isNewJiveInstance == true) { JiveInstance jiveInstance = new JiveInstance(); jiveInstance.JiveInstanceId = jiveInstanceTemp[1]; jiveInstance.DateCreated = DateTime.Now; jiveInstance.LastUpdated = DateTime.Now; jiveInstance.IsComplete = false; jiveInstance.Users = new List<User>(); jiveInstance.IsLicensed = true; jiveInstance.IsInstalledViaAddon = true; db.JiveInstances.Add(jiveInstance); db.SaveChanges(); jiveInstanceForUser = jiveInstance; } User user = new User(); user.UserId = userId; user.JiveInstance = jiveInstanceForUser; user.DateCreated = DateTime.Now; user.LastUpdated = DateTime.Now; user.HasInstalledApp = true; db.Users.Add(user); db.SaveChanges(); jiveInstanceForUser.Users.Add(user); db.SaveChanges(); ViewBag.jiveUrl = user.JiveInstance.Url; ViewBag.ownerName = "Display name not set in DB"; ViewBag.ownerId = user.UserId; } //Setting some helper data into the viewbag, so we can efficiently build a page //The baseUrl is the system on which our addon is hosted. We need this to set the base_href for our html pages correctly string baseUrl = System.Configuration.ConfigurationManager.AppSettings["baseUrl"]; ViewBag.baseUrl = baseUrl; //The appPath is the path of our application, e.g. https://myjiveaddon.azurewebsites.net/apps/app_path //We might need this to build deep links to our application string appPath = System.Configuration.ConfigurationManager.AppSettings["appPath"]; ViewBag.appPath = appPath; //Version information for app and included resources. Due to the caching mechanisms in Jive //we recommend to update this when you roll out new versions string jsVersion = System.Configuration.ConfigurationManager.AppSettings["jsVersion"]; ViewBag.jsVersion = jsVersion; string appJsVersion = System.Configuration.ConfigurationManager.AppSettings["appJsVersion"]; ViewBag.appJsVersion = appJsVersion; ViewBag.jiveUrl = myUser.JiveInstance.Url; } catch (Exception ex) { Trace.WriteLine(ex.Message); } } }