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); } } }
protected override bool AuthorizeCore(HttpContextBase httpContext) { try { if (HttpContext.Current.Request.Headers["authorization"] != null) { string authString = HttpContext.Current.Request.Headers["authorization"]; string userId = HttpContext.Current.Request.Headers["x-jive-user-id"]; string[] authStringArray = authString.Split('&'); string tenantId = null; string jiveUrl = null; foreach (string authElement in authStringArray) { string[] keyValue = authElement.Split('='); if (keyValue[0].Equals("tenant_id")) { tenantId = keyValue[1]; } if (keyValue[0].Equals("jive_url")) { jiveUrl = HttpUtility.UrlDecode(keyValue[1]); } } string ownerId = userId + "@" + tenantId; using (JiveSdkContext db = new JiveSdkContext()) { User myUser = null; var _myUser = db.Users .Include("JiveInstance.Users") .Where(u => u.UserId.Equals(ownerId)); if (_myUser.Count() > 0) { myUser = _myUser.First(); } else { if (myUser == null) { string[] jiveInstanceTemp = ownerId.Split('@'); String userJiveInstance = jiveInstanceTemp[1]; JiveInstance jiveInstanceForUser = null; // Find the instance ID for the user var _jiveInstanceForUser = db.JiveInstances .Include("Users") .Where(j => j.JiveInstanceId.Equals(userJiveInstance)); jiveInstanceForUser = _jiveInstanceForUser.First(); if (jiveInstanceForUser.Users == null) { jiveInstanceForUser.Users = new List <User>(); } myUser = new User(); myUser.DateCreated = DateTime.Now; myUser.HasInstalledApp = true; myUser.IsComplete = false; myUser.UserId = ownerId; myUser.LastUpdated = DateTime.Now; // db.Users.Add(myUser); myUser.JiveInstance = jiveInstanceForUser; db.SaveChanges(); jiveInstanceForUser.Users.Add(myUser); db.SaveChanges(); } } GenericIdentity MyIdentity = new GenericIdentity(ownerId); String[] MyStringArray = { "User" }; GenericPrincipal MyPrincipal = new GenericPrincipal(MyIdentity, MyStringArray); Thread.CurrentPrincipal = MyPrincipal; return(true); } } else { return(false); } } catch (Exception ex) { Trace.WriteLine(ex.Message); return(false); } }
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)); } }