예제 #1
0
        /// <summary>
        /// Main method of the schedular
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            // Add new line to test Git
            try
            {
                Process   runningProcess = Process.GetCurrentProcess();
                Process[] pname          = Process.GetProcessesByName(runningProcess.ProcessName);
                if (pname.Length > 1)
                {
                    return;
                }

                //Getting the security group of active directory whose users needs to be synced with cloud
                string securityGroup = ConfigurationManager.AppSettings["SecurityGroup"];

                string domainPath = ConfigurationManager.AppSettings["LDAPPath"];

                if (string.IsNullOrEmpty(domainPath))
                {
                    new ExceptionHandler("LDAP path is not configured");
                    return;
                }
                DirectoryEntry searchRoot = null;
                searchRoot = new DirectoryEntry(domainPath);
                if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["ADServerName"]))
                {
                    searchRoot.Username = ConfigurationManager.AppSettings["ADServerUserName"];
                    searchRoot.Password = ConfigurationManager.AppSettings["ADServerPassword"];
                }
                //string domainName = (string)searchRoot.Properties["defaultNamingContext"].Value;
                DirectorySearcher search = new DirectorySearcher(searchRoot, "(&(objectCategory=group)(CN=cloudidsyncusers))");
                SearchResult      result = search.FindOne();
                if (result != null)
                {
                    List <SecurityGroupUser> users = new List <SecurityGroupUser>();
                    string adServerName            = ConfigurationManager.AppSettings["ADServerName"];
                    string domainName = GetDomain(domainPath);
                    foreach (var member in result.Properties["member"])
                    {
                        DirectoryEntry userDe = null;
                        if (!string.IsNullOrEmpty(adServerName))
                        {
                            userDe          = new DirectoryEntry(String.Concat("LDAP://", adServerName, "/", member.ToString()));
                            userDe.Username = ConfigurationManager.AppSettings["ADServerUserName"];
                            userDe.Password = ConfigurationManager.AppSettings["ADServerPassword"];
                        }
                        else
                        {
                            userDe = new DirectoryEntry(String.Concat("LDAP://", member.ToString()));
                        }
                        SecurityGroupUser adUser = new SecurityGroupUser();
                        if (userDe.Properties["objectClass"].Contains("user"))
                        {
                            string passwordHash = GetPasswordHash(member.ToString(), ConfigurationManager.AppSettings["ADServerUserName"], ConfigurationManager.AppSettings["ADServerPassword"], domainName, adServerName);
                            if (string.IsNullOrEmpty(passwordHash))
                            {
                                continue;
                            }
                            else
                            {
                                adUser.PasswordHash = passwordHash;
                            }
                            if ((userDe.Properties.Contains("objectSid")) && (userDe.Properties["objectSid"].Count > 0))
                            {
                                SecurityIdentifier siSid = new SecurityIdentifier((byte[])userDe.Properties["objectSid"][0], 0);
                                adUser.Sid = siSid.ToString();
                            }
                            if ((userDe.Properties.Contains("userPrincipalName")) && (userDe.Properties["userPrincipalName"].Count > 0))
                            {
                                adUser.Upn = Convert.ToString(userDe.Properties["userPrincipalName"][0]);
                            }
                            if ((userDe.Properties.Contains("whenChanged")) && (userDe.Properties["whenChanged"].Count > 0))
                            {
                                adUser.TimeStamp = Convert.ToDateTime(userDe.Properties["whenChanged"][0]);
                            }
                            if ((userDe.Properties.Contains("sAMAccountName")) && (userDe.Properties["sAMAccountName"].Count > 0))
                            {
                                adUser.SamAccountName = Convert.ToString(userDe.Properties["sAMAccountName"][0]);
                            }
                            if ((userDe.Properties.Contains("displayName")) && (userDe.Properties["displayName"].Count > 0))
                            {
                                adUser.DisplayName = Convert.ToString(userDe.Properties["displayName"][0]);
                            }
                            if ((userDe.Properties.Contains("sn")) && (userDe.Properties["sn"].Count > 0))
                            {
                                adUser.LastName = Convert.ToString(userDe.Properties["sn"][0]);
                            }
                            if ((userDe.Properties.Contains("givenName")) && (userDe.Properties["givenName"].Count > 0))
                            {
                                adUser.FirstName = Convert.ToString(userDe.Properties["givenName"][0]);
                            }
                            if ((userDe.Properties.Contains("description")) && (userDe.Properties["description"].Count > 0) &&
                                (string.IsNullOrEmpty(ConfigurationManager.AppSettings["description"]) ? true : Convert.ToBoolean(ConfigurationManager.AppSettings["description"])))
                            {
                                adUser.Description = Convert.ToString(userDe.Properties["description"][0]);
                            }
                            if ((userDe.Properties.Contains("l")) && (userDe.Properties["l"].Count > 0) &&
                                (string.IsNullOrEmpty(ConfigurationManager.AppSettings["l"]) ? true : Convert.ToBoolean(ConfigurationManager.AppSettings["l"])))
                            {
                                adUser.City = Convert.ToString(userDe.Properties["l"][0]);
                            }
                            if ((userDe.Properties.Contains("streetAddress")) && (userDe.Properties["streetAddress"].Count > 0) &&
                                (string.IsNullOrEmpty(ConfigurationManager.AppSettings["streetAddress"]) ? true : Convert.ToBoolean(ConfigurationManager.AppSettings["streetAddress"])))
                            {
                                adUser.Street = Convert.ToString(userDe.Properties["streetAddress"][0]);
                            }
                            if ((userDe.Properties.Contains("postalCode")) && (userDe.Properties["postalCode"].Count > 0) &&
                                (string.IsNullOrEmpty(ConfigurationManager.AppSettings["postalCode"]) ? true : Convert.ToBoolean(ConfigurationManager.AppSettings["postalCode"])))
                            {
                                adUser.ZipCode = Convert.ToString(userDe.Properties["postalCode"][0]);
                            }
                            if ((userDe.Properties.Contains("mail")) && (userDe.Properties["mail"].Count > 0) &&
                                (string.IsNullOrEmpty(ConfigurationManager.AppSettings["mail"]) ? true : Convert.ToBoolean(ConfigurationManager.AppSettings["mail"])))
                            {
                                char[]   specialChars = { ',', '/', ';', ':', '-' };
                                string[] arrEmails    = Convert.ToString(userDe.Properties["mail"][0]).Split(specialChars);
                                if (!Regex.IsMatch(arrEmails[0], @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
                                                   @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$", RegexOptions.IgnoreCase))
                                {
                                    new ExceptionHandler(new Exception("Invalid Email ID"));
                                }
                                EmailDetail email = new EmailDetail();
                                email.Email           = arrEmails[0];
                                email.IsPrimary       = true;
                                adUser.EmailAddresses = new[] { email };
                            }
                            if ((userDe.Properties.Contains("telephoneNumber")) && (userDe.Properties["telephoneNumber"].Count > 0) &&
                                (string.IsNullOrEmpty(ConfigurationManager.AppSettings["telephoneNumber"]) ? true : Convert.ToBoolean(ConfigurationManager.AppSettings["telephoneNumber"])))
                            {
                                adUser.PhoneNumber = Convert.ToString(userDe.Properties["telephoneNumber"][0]);
                            }
                            if ((userDe.Properties.Contains("mobile")) && (userDe.Properties["mobile"].Count > 0) &&
                                (string.IsNullOrEmpty(ConfigurationManager.AppSettings["mobile"]) ? true : Convert.ToBoolean(ConfigurationManager.AppSettings["mobile"])))
                            {
                                adUser.MobileNumber = Convert.ToString(userDe.Properties["mobile"][0]);
                            }
                        }
                        users.Add(adUser);
                    }
                    result = null;
                    StoreDataLocally(users);
                }

                DateTime dt1 = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 12, 30, 0);
                DateTime dt2 = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
                TimeSpan ts  = (dt2 - dt1);
                if (ts.TotalSeconds >= 0 && ts.TotalSeconds < 900)
                {
                    var releaseDetails = new CloudOperation().GetReleaseVersion();
                    if (releaseDetails != null && !string.IsNullOrEmpty(releaseDetails.LatestVersion))
                    {
                        string versionFromApi = releaseDetails.LatestVersion;
                        string appVersion     = ConfigurationManager.AppSettings["Version"];
                        if (versionFromApi.CompareTo(appVersion) > 0)
                        {
                            EmailNotification notification = new EmailNotification()
                            {
                                CustomerShortCode = ConfigurationManager.AppSettings["CustomerShortCode"],
                                NotificationEmail = ConfigurationManager.AppSettings["NotificationEmail"],
                                Release           = ConfigurationManager.AppSettings["Version"]
                            };
                            new CloudOperation().NotifyCustomer(notification);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                new ExceptionHandler(ex);
                return;
            }
        }
예제 #2
0
        /// <summary>
        /// This method is used to store the data into local storage after updating into cloud
        /// </summary>
        /// <param name="users">AD group user</param>
        static void StoreDataLocally(List <SecurityGroupUser> users)
        {
            //Get the local storage data path
            string filePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SecurityGroupUser.xml");

            if (!System.IO.File.Exists(filePath))
            {
                new ExceptionHandler(new Exception("Local Repository XML file not found"));
                return;
            }
            DataSet ds = new DataSet();

            ds.ReadXml(filePath);
            List <CloudData> cloudUserData = new List <CloudData>();
            CloudOperation   operation     = new CloudOperation();

            try
            {
                if (ds.Tables.Count > 0)
                {
                    List <SecurityGroupUser> userToAdd    = new List <SecurityGroupUser>();
                    List <string>            sidToDelete  = new List <string>();
                    List <SecurityGroupUser> userToUpdate = new List <SecurityGroupUser>();

                    DataSet dsTemp = ds.Copy();

                    foreach (DataRow dr in dsTemp.Tables[0].Rows)
                    {
                        //Get the user from local storage who available in active directory
                        SecurityGroupUser user = users.Find(x => x.Sid == dr["sid"].ToString());

                        //If there is no such user in active directory whose information is available in local storage, means that user is deleted in active directory
                        //Hence that needs to be deleted from the cloud and local storage also
                        if (user == null)
                        {
                            //Delete the user from the cloud
                            if (operation.DeleteUserFromCloud(new UserDetail()
                            {
                                Upn = dr["UPN"].ToString(),
                                UserSid = dr["sid"].ToString(),
                                CustomerShortCode = ConfigurationManager.AppSettings["CustomerShortCode"],
                                ApiUserName = ConfigurationManager.AppSettings["UserName"],
                                ApiPassWord = ConfigurationManager.AppSettings["Password"]
                            }))
                            {
                                //Delete the user from the xml file
                                DataRow dRow = ds.Tables[0].Select("sid='" + dr["sid"].ToString() + "'").FirstOrDefault();
                                ds.Tables["User"].Rows.Remove(dRow);
                            }
                        }
                        else
                        {
                            DateTime localStorageTime  = Convert.ToDateTime(dr["timestamp"]);
                            DateTime ADUserChangedTime = Convert.ToDateTime(user.TimeStamp);
                            TimeSpan ts = ADUserChangedTime - localStorageTime;

                            if (ts.TotalMilliseconds > 0)
                            {
                                if (!((string.IsNullOrEmpty(ConfigurationManager.AppSettings["SyncOption"])) || (ConfigurationManager.AppSettings["SyncOption"].ToLower() == "userprincipalname") || (ConfigurationManager.AppSettings["SyncOption"].ToLower() != "mail")))
                                {
                                    user.Upn = user.EmailAddresses[0].Email;
                                }

                                if (operation.AddUpdateUserToCloud(user, "/api/User/update"))
                                {
                                    //Update the user in xml file to be added into cloud
                                    userToUpdate.Add(user);
                                    ds.Tables["User"].Select("sid='" + dr["sid"].ToString() + "'")[0]["upn"]       = user.Upn;
                                    ds.Tables["User"].Select("sid='" + dr["sid"].ToString() + "'")[0]["timestamp"] = user.TimeStamp;
                                }
                            }
                        }
                    }
                    foreach (SecurityGroupUser userFromAD in users)
                    {
                        if (ds.Tables["User"].Select("sid='" + userFromAD.Sid + "'").FirstOrDefault() == null)
                        {
                            if (operation.AddUpdateUserToCloud(userFromAD, "/api/User/create"))
                            {
                                DataRow addNewRow = ds.Tables[0].NewRow();
                                addNewRow["sid"] = userFromAD.Sid;
                                if ((string.IsNullOrEmpty(ConfigurationManager.AppSettings["SyncOption"])) || (ConfigurationManager.AppSettings["SyncOption"].ToLower() == "userprincipalname") || (ConfigurationManager.AppSettings["SyncOption"].ToLower() != "mail"))
                                {
                                    addNewRow["upn"] = userFromAD.Upn;
                                }
                                else if (ConfigurationManager.AppSettings["SyncOption"].ToLower() == "mail")
                                {
                                    addNewRow["upn"] = userFromAD.EmailAddresses[0].Email;
                                }
                                addNewRow["timestamp"] = userFromAD.TimeStamp;
                                ds.Tables["User"].Rows.Add(addNewRow);
                            }
                        }
                    }
                }
                else if (users.Count > 0)
                {
                    DataTable dt = new DataTable("User");
                    dt.Columns.Add("sid");
                    dt.Columns.Add("upn");
                    dt.Columns.Add("timestamp");
                    foreach (SecurityGroupUser userFromAD in users)
                    {
                        //cloudUserData.Add(BuildCloudData(userFromAD));
                        if (operation.AddUpdateUserToCloud(userFromAD, "/api/User/create"))
                        {
                            DataRow dr = dt.NewRow();
                            dr["sid"] = userFromAD.Sid;
                            if ((string.IsNullOrEmpty(ConfigurationManager.AppSettings["SyncOption"])) || (ConfigurationManager.AppSettings["SyncOption"].ToLower() == "userprincipalname") || (ConfigurationManager.AppSettings["SyncOption"].ToLower() != "mail"))
                            {
                                dr["upn"] = userFromAD.Upn;
                            }
                            else if (ConfigurationManager.AppSettings["SyncOption"].ToLower() == "mail")
                            {
                                dr["upn"] = userFromAD.EmailAddresses[0].Email;
                            }
                            dr["timestamp"] = userFromAD.TimeStamp;
                            dt.Rows.Add(dr);
                        }
                    }
                    ds.Tables.Add(dt);
                }
            }
            catch (Exception ex)
            {
                new ExceptionHandler(ex);
            }
            finally
            {
                //Update the local storage
                ds.WriteXml(filePath);
            }
        }