Skip to content

Commit

Permalink
Refreshed.
Browse files Browse the repository at this point in the history
  • Loading branch information
jscarle committed Aug 21, 2022
1 parent 997b6d3 commit 3884c96
Show file tree
Hide file tree
Showing 4 changed files with 264 additions and 11 deletions.
119 changes: 108 additions & 11 deletions OnePassword.NET/OnePasswordManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Text;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
Expand Down Expand Up @@ -44,13 +45,35 @@ public void AddUser(User user, Group group, UserRole userRole = UserRole.Member)
Op(command);
}

public void ArchiveDocument(Document document) => ArchiveDocument(document, null);

public void ArchiveDocument(Document document, Vault vault)
{
string command = $"delete document \"{document.Uuid}\"";
if (vault != null)
command += $" --vault \"{vault.Uuid}\"";
command += $" --archive";
Op(command);
}

public void ArchiveItem(Item item) => ArchiveItem(item, null);

public void ArchiveItem(Item item, Vault vault)
{
string command = $"delete item \"{item.Uuid}\"";
if (vault != null)
command += $" --vault \"{vault.Uuid}\"";
command += $" --archive";
Op(command);
}

public void ConfirmUser(User user) => Op($"confirm user \"{user.Uuid}\"");

public void ConfirmAll() => Op($"confirm user --all");

public Document CreateDocument(Template template, string path) => CreateDocument(template, path, null);
public Document CreateDocument(Template template, string path) => CreateDocument(template, null, path);

public Document CreateDocument(Template template, string path, Vault vault)
public Document CreateDocument(Template template, Vault vault, string path)
{
if (template.Uuid != "006") // Document
throw new ArgumentException("Cannot create an Item using this method. Use CreateItem instead.");
Expand Down Expand Up @@ -117,21 +140,39 @@ public User CreateUser(string emailAddress, string name, string language = "en")
return JsonConvert.DeserializeObject<User>(Op(command));
}

public Vault CreateVault(string name, string description = "", bool allowAdminsToManage = true)
public Vault CreateVault(string name, string description = "", bool allowAdminsToManage = true, VaultIcon icon = VaultIcon.Default)
{
string command = $"create vault \"{name}\"";
if (!string.IsNullOrEmpty(description))
command += $" --description \"{description}\"";
if (!allowAdminsToManage)
command += $" --allow-admins-to-manage \"false\"";
if (icon != VaultIcon.Default)
command += $" --icon \"{GetIconName(icon)}\"";
return JsonConvert.DeserializeObject<Vault>(Op(command));
}

public void DeleteDocument(Document document) => Op($"delete document \"{document.Uuid}\"");
public void DeleteDocument(Document document) => DeleteDocument(document, null);

public void DeleteDocument(Document document, Vault vault)
{
string command = $"delete document \"{document.Uuid}\"";
if (vault != null)
command += $" --vault \"{vault.Uuid}\"";
Op(command);
}

public void DeleteGroup(Group group) => Op($"delete group \"{group.Uuid}\"");

public void DeleteItem(Item item) => Op($"delete item \"{item.Uuid}\"");
public void DeleteItem(Item item) => DeleteItem(item, null);

public void DeleteItem(Item item, Vault vault)
{
string command = $"delete item \"{item.Uuid}\"";
if (vault != null)
command += $" --vault \"{vault.Uuid}\"";
Op(command);
}

public void DeleteTrash(Vault vault) => Op($"delete trash \"{vault.Uuid}\"");

Expand All @@ -143,13 +184,28 @@ public Vault CreateVault(string name, string description = "", bool allowAdminsT

public void EditUser(User user, bool travelMode = false) => Op($"edit user \"{user.Uuid}\" --name \"{user.Name}\" --travelmode \"{(travelMode ? "on" : "off")}\"");

public void EditVault(Vault vault) => Op($"edit vault \"{vault.Uuid}\" --name \"{vault.Name}\"");
public void EditVault(Vault vault)
{
string command = $"edit vault \"{vault.Uuid}\" --name \"{vault.Name}\" --description \"{vault.Description}\"";
if (vault.Icon != VaultIcon.Default)
command += $" --icon \"{GetIconName(vault.Icon)}\"";
Op(command);
}

public void Forget(string domain) => Op($"forget {domain}");

public Account GetAccount() => JsonConvert.DeserializeObject<Account>(Op("get account"));

public void GetDocument(Item document, string path) => Op($"get document \"{document.Uuid}\" --output \"{path}\"");
public void GetDocument(Item document, string path) => GetDocument(document, null, path);

public void GetDocument(Item document, Vault vault, string path)
{
string command = $"get document \"{document.Uuid}\"";
if (vault != null)
command += $" --vault \"{vault.Uuid}\"";
command += $" --output \"{path}\"";
Op(command);
}

public Group GetGroup(Group group) => JsonConvert.DeserializeObject<Group>(Op($"get group \"{group.Uuid}\""));

Expand Down Expand Up @@ -282,7 +338,48 @@ public void SignOut(bool forget = false)
Op(command);
}

public void SuspendUser(User user) => Op($"suspend \"{user.Uuid}\"");
public void SuspendUser(User user, bool deauthorizeDevices = false, int deauthorizeDevicesDelay = 0)
{
string command = $"suspend \"{user.Uuid}\"";
if (deauthorizeDevices)
{
command += " --deauthorize-devices";
if (deauthorizeDevicesDelay > 0)
command += $" {deauthorizeDevicesDelay}";
}
Op(command);
}

#if !NET40 && !NET35 && !NET20
public bool Update()
{
bool updated = false;

string tempDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
Directory.CreateDirectory(tempDirectory);

string command = $"update --directory \"{tempDirectory}\"";
string result = Op(command);

if (Regex.Match(result, @"Version ([^\s]+) is now available\.").Success)
foreach (string file in Directory.GetFiles(tempDirectory, "*.zip"))
using (ZipArchive zipArchive = ZipFile.Open(file, ZipArchiveMode.Read))
{
zipArchive.GetEntry("op.exe")?.ExtractToFile(_opPath, true);
updated = true;
}

Directory.Delete(tempDirectory, true);

return updated;
}
#endif

private static string GetIconName(VaultIcon vaultIcon)
{
IconAttribute[] attributes = (IconAttribute[])vaultIcon.GetType().GetField(vaultIcon.ToString()).GetCustomAttributes(typeof(IconAttribute), false);
return attributes.Length > 0 ? attributes[0].Name : string.Empty;
}

private static string GetStandardError(Process process)
{
Expand All @@ -294,10 +391,10 @@ private static string GetStandardError(Process process)

private static string GetStandardOutput(Process process)
{
StringBuilder error = new StringBuilder();
StringBuilder output = new StringBuilder();
while (process.StandardOutput.Peek() > -1)
error.Append((char)process.StandardOutput.Read());
return error.ToString();
output.Append((char)process.StandardOutput.Read());
return output.ToString();
}

private string Op(string command, string input = "", bool returnError = false)
Expand Down
2 changes: 2 additions & 0 deletions OnePassword.NET/Vault.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,7 @@ public class Vault

[JsonProperty("type")]
public VaultType VaultType { get; set; }

public VaultIcon Icon { get; set; } = VaultIcon.Default;
}
}
15 changes: 15 additions & 0 deletions OnePassword.NET/Vaults/IconAttribute.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System;

namespace OnePassword.Vaults
{
[AttributeUsage(AttributeTargets.Field)]
public class IconAttribute : Attribute
{
public string Name { get; }

public IconAttribute(string name)
{
Name = name;
}
}
}
139 changes: 139 additions & 0 deletions OnePassword.NET/Vaults/VaultIcon.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
namespace OnePassword.Vaults
{
public enum VaultIcon
{
[Icon("airplane")]
Airplane,

[Icon("application")]
Application,

[Icon("art-supplies")]
ArtSupplies,

[Icon("bankers-box")]
BankersBox,

[Icon("brown-briefcase")]
BrownBriefcase,

[Icon("brown-gate")]
BrownGate,

[Icon("buildings")]
Buildings,

[Icon("cabin")]
Cabin,

[Icon("castle")]
Castle,

[Icon("circle-of-dots")]
CircleOfDots,

[Icon("coffee")]
Coffee,

[Icon("color-wheel")]
ColorWheel,

[Icon("curtained-window")]
CurtainedWindow,

Default,

[Icon("document")]
Document,

[Icon("doughnut")]
Doughnut,

[Icon("fence")]
Fence,

[Icon("galaxy")]
Galaxy,

[Icon("gears")]
Gears,

[Icon("globe")]
Globe,

[Icon("green-backpack")]
GreenBackpack,

[Icon("green-gem")]
GreenGem,

[Icon("handshake")]
Handshake,

[Icon("heart-with-monitor")]
HeartWithMonitor,

[Icon("house")]
House,

[Icon("id-card")]
IdCard,

[Icon("jet")]
Jet,

[Icon("large-ship")]
LargeShip,

[Icon("luggage")]
Luggage,

[Icon("plant")]
Plant,

[Icon("porthole")]
Porthole,

[Icon("puzzle")]
Puzzle,

[Icon("rainbow")]
Rainbow,

[Icon("record")]
Record,

[Icon("round-door")]
RoundDoor,

[Icon("sandals")]
Sandals,

[Icon("scales")]
Scales,

[Icon("screwdriver")]
Screwdriver,

[Icon("shop")]
Shop,

[Icon("tall-window")]
TallWindow,

[Icon("treasure-chest")]
TreasureChest,

[Icon("vault-door")]
VaultDoor,

[Icon("vehicle")]
Vehicle,

[Icon("wallet")]
Wallet,

[Icon("wrench")]
Wrench
}
}

0 comments on commit 3884c96

Please sign in to comment.