Skip to content

Commit

Permalink
Extend Account Share Expiration
Browse files Browse the repository at this point in the history
  • Loading branch information
sk-keeper committed Mar 28, 2023
1 parent c93e724 commit 6d7dfc5
Show file tree
Hide file tree
Showing 6 changed files with 159 additions and 6 deletions.
2 changes: 1 addition & 1 deletion Commander/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Keeper Security Inc.")]
[assembly: AssemblyProduct(".NET Commander")]
[assembly: AssemblyCopyright("Copyright (c) 2022")]
[assembly: AssemblyCopyright("Copyright (c) 2023")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

Expand Down
133 changes: 133 additions & 0 deletions Commander/enterprise/EnterpriseCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,13 @@ internal static void AppendEnterpriseCommands(this IEnterpriseContext context, C
Action = async options => { await context.TransferUserCommand(options); },
});

cli.Commands.Add("extend-account-share-expiration",
new ParseableCommand<EnterpriseUsersOptions>
{
Order = 67,
Description = "Extend Account Share Expiration",
Action = async options => { await context.ExtendAccountShareExpirationCommand(options); },
});
cli.Commands.Add("audit-report",
new ParseableCommand<AuditReportOptions>
{
Expand Down Expand Up @@ -585,6 +592,126 @@ public static async Task TransferUserCommand(this IEnterpriseContext context, En
tab.Dump();
}

public static async Task ExtendAccountShareExpirationCommand(this IEnterpriseContext context, EnterpriseUsersOptions options)
{
var availabeUsers = new Dictionary<long, KeeperSecurity.Enterprise.EnterpriseUser>();
foreach (var u in context.EnterpriseData.Users)
{
if (u.AccountShareExpiration > 0)
{
availabeUsers[u.Id] = u;
}
}
if (availabeUsers.Count == 0)
{
Console.WriteLine("There are no users with pending Account Share status");
return;
}

if (options.Users == null || !options.Users.Any())
{
var tab = new Tabulate(3)
{
DumpRowNo = true
};
tab.AddHeader("User ID", "Email", "Expiration");
foreach (var u in availabeUsers.Values)
{
var exp = DateTimeOffset.FromUnixTimeMilliseconds(u.AccountShareExpiration).ToLocalTime();
tab.AddRow(u.Id, u.Email, exp.ToString("g"));
}
tab.Sort(1);
tab.Dump();
return;
}

var matchingUsers = new HashSet<long>();
foreach (var user in options.Users)
{
var cnt = matchingUsers.Count;
var allDigits = user.All(x => char.IsDigit(x));
if (allDigits)
{
if (long.TryParse(user, out var userId))
{
if (availabeUsers.ContainsKey(userId))
{
matchingUsers.Add(userId);
}
}
}
else
{
foreach (var t in availabeUsers)
{
var matched = t.Value.Email.StartsWith(user, StringComparison.InvariantCultureIgnoreCase);
if (!matched)
{
var m = Regex.Match(t.Value.Email, user, RegexOptions.IgnoreCase);
matched = m.Success;

}
if (matched)
{
matchingUsers.Add(t.Key);
}
}
}

if (matchingUsers.Count > cnt)
{
foreach (var uid in matchingUsers)
{
if (availabeUsers.ContainsKey(uid))
{
availabeUsers.Remove(uid);
}
}
if (availabeUsers.Count == 0)
{
break;
}
}
}
if (matchingUsers.Count == 0)
{
Console.WriteLine("No users are found");
return;
}

Console.Write($"Do you want to extend Account Share Expiration period for {matchingUsers.Count} account(s) (Yes/No)? > ");
var answer = await Program.GetInputManager().ReadLine();
if (string.Compare("y", answer, StringComparison.InvariantCultureIgnoreCase) == 0)
{
answer = "yes";
}

if (!string.Equals(answer, "yes", StringComparison.InvariantCultureIgnoreCase)) return;

var commands = matchingUsers.Select(x => new ExtendAccountShareExpirationCommand { EnterpriseUserId = x }).Cast<KeeperApiCommand>().ToArray();

var execRq = new ExecuteCommand
{
Requests = commands.Take(99).ToList()
};
var execRs = await context.Enterprise.Auth.ExecuteAuthCommand<ExecuteCommand, ExecuteResponse>(execRq);
if (execRs.Results?.Count > 0)
{
var last = execRs.Results.Last();
var success = execRs.Results.Count + (last.IsSuccess ? 0 : -1);
if (success > 0)
{
Console.WriteLine($"Successfully extended {success} account(s)");
}
if (!last.IsSuccess)
{
Console.WriteLine($"Error: {last.message}");
}
}

await context.Enterprise.Load();
}

private static string[] _privilegeNames = new string[] { "MANAGE_NODES", "MANAGE_USER", "MANAGE_ROLES", "MANAGE_TEAMS", "RUN_REPORTS", "MANAGE_BRIDGE", "APPROVE_DEVICE", "TRANSFER_ACCOUNT" };

public static async Task EnterpriseRoleCommand(this RoleDataManagement roleData, EnterpriseData enterpriseData, EnterpriseRoleOptions arguments)
Expand Down Expand Up @@ -2194,6 +2321,12 @@ class AuditReportOptions
public IEnumerable<string> Columns { get; set; }
}

class EnterpriseUsersOptions : EnterpriseGenericOptions
{
[Value(0, Required = false, HelpText = "Email, User ID, or email pattern")]
public IEnumerable<string> Users { get; set; }
}

class ManagedCompanyLoginOptions : EnterpriseGenericOptions
{
[Value(0, Required = true, HelpText = "mc-login <mc-company-id>")]
Expand Down
6 changes: 3 additions & 3 deletions KeeperSdk/KeeperSdk.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net452</TargetFrameworks>
<LangVersion>7.1</LangVersion>
<Version>1.0.5-beta05</Version>
<Version>1.0.5-beta06</Version>
<Authors>Keeper Security Inc.</Authors>
<Product>.NET Keeper Sdk</Product>
<PackageTags>keeper password manager</PackageTags>
Expand All @@ -13,8 +13,8 @@
<RepositoryType>Github</RepositoryType>
<PackageProjectUrl>https://github.com/Keeper-Security/keeper-sdk-dotnet</PackageProjectUrl>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<AssemblyVersion>1.0.5.25</AssemblyVersion>
<FileVersion>1.0.5.25</FileVersion>
<AssemblyVersion>1.0.5.26</AssemblyVersion>
<FileVersion>1.0.5.26</FileVersion>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
<IncludeSymbols>true</IncludeSymbols>
Expand Down
18 changes: 18 additions & 0 deletions KeeperSdk/enterprise/EnterpriseCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -678,4 +678,22 @@ public EnterpriseRemoveByMspCommand() : base("enterprise_remove_by_msp")
[DataMember(Name = "enterprise_id")]
public int EnterpriseId { get; set; }
}

[DataContract]
public class ExtendAccountShareExpirationCommand : AuthenticatedCommand
{
public ExtendAccountShareExpirationCommand() : base("extend_account_share_expiration")
{
}

[DataMember(Name = "enterprise_user_id")]
public long EnterpriseUserId { get; set; }
}

[DataContract]
public class ExtendAccountShareExpirationResponse : KeeperApiResponse
{
[DataMember(Name = "account_share_expiration")]
public long AccountShareExpiration { get; set; }
}
}
2 changes: 1 addition & 1 deletion KeeperSdk/enterprise/EnterpriseData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ protected override void PopulateSdkFromKeeper(EnterpriseUser sdk, User keeper)
{
sdk.UserStatus = UserStatus.Inactive;
}

sdk.AccountShareExpiration = keeper.AccountShareExpiration;
var enterprise = GetEnterprise?.Invoke();
if (enterprise != null && enterprise.TreeKey != null)
{
Expand Down
4 changes: 3 additions & 1 deletion KeeperSdk/enterprise/EnterpriseTypes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,9 @@ public class EnterpriseUser : IEnterpriseEntity, IParentNodeEntity, IEncryptedDa
/// <exclude />
public string EncryptedData { get; internal set; }

/// <exclude />
/// <summary>
/// Account Share Expiration. Unix epoch time in milliseconds.
/// </summary>
public long AccountShareExpiration { get; internal set; }
}

Expand Down

0 comments on commit 6d7dfc5

Please sign in to comment.