Permission updates working
authorPanagiotis Kanavos <pkanavos@gmail.com>
Wed, 16 Nov 2011 18:47:32 +0000 (20:47 +0200)
committerPanagiotis Kanavos <pkanavos@gmail.com>
Wed, 16 Nov 2011 18:47:32 +0000 (20:47 +0200)
Changed to tabbed interface

trunk/Pithos.Client.WPF/FileProperties/FilePropertiesView.xaml
trunk/Pithos.Client.WPF/FileProperties/FilePropertiesViewModel.cs
trunk/Pithos.Client.WPF/FileProperties/Permission.cs
trunk/Pithos.Interfaces/ObjectInfo.cs
trunk/Pithos.Network.Test/ObjectInfoTest.cs
trunk/Pithos.Network/CloudFilesClient.cs

index d56319f..8b2154f 100644 (file)
@@ -5,7 +5,7 @@
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:cal="http://www.caliburnproject.org"
         mc:Ignorable="d" 
              d:DesignHeight="300" d:DesignWidth="300" MaxWidth="900"
-         Height="681" Icon="/Pithos.Client.WPF;component/Images/PithosTaskbar.png"
+         Height="400" Icon="/Pithos.Client.WPF;component/Images/PithosTaskbar.png"
         Background="{StaticResource {x:Static SystemColors.ControlBrushKey}}" 
         >
     <Window.Resources>
@@ -19,9 +19,6 @@
     <Grid>
         <Grid.RowDefinitions>
             <RowDefinition Height="Auto"/>
-            <RowDefinition Height="Auto"/>
-            <RowDefinition Height="*"/>
-            <RowDefinition Height="*"/>
             <RowDefinition Height="*"/>
             <RowDefinition Height="Auto"/>
         </Grid.RowDefinitions>
                     <TextBlock x:Name="Container" Text="Container" />
                 </StackPanel>
             </StackPanel>
-            <TextBlock x:Name="ShortSize" Text="345 KB" FontWeight="Bold" FontSize="14" Grid.Column="2" />
+            <TextBlock x:Name="ShortSize" Text="345 KB" FontWeight="Bold" FontSize="14" Grid.Column="2" HorizontalAlignment="Left" />
         </Grid>
-        <GroupBox Header="General" Grid.Row="1">
-            <Grid>
-                <Grid.Resources>
-                    <Style x:Key="NameColumnStyle" TargetType="TextBlock">
-                        <Setter Property="HorizontalAlignment" Value="Right"/>
-                        <Setter Property="Margin" Value="5,2"/>
-                    </Style>
-                    <Style x:Key="ValueColumnStyle" TargetType="TextBlock">
-                        <Setter Property="HorizontalAlignment" Value="Left"/>
-                        <Setter Property="Margin" Value="5,2"/>
-                    </Style>
-                </Grid.Resources>
-                <Grid.ColumnDefinitions>
-                    <ColumnDefinition Width="Auto" />
-                    <ColumnDefinition Width="*"/>
-                </Grid.ColumnDefinitions>
-                <Grid.RowDefinitions>
-                    <RowDefinition/>
-                    <RowDefinition/>
-                    <RowDefinition/>
-                    <RowDefinition/>
-                    <RowDefinition/>
-                    <RowDefinition/>
-                </Grid.RowDefinitions>
-                <TextBlock Text="Kind :" Grid.Row="0" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
-                <TextBlock Text="Size :" Grid.Row="1" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
-                <TextBlock Text="Where :" Grid.Row="2" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
-                <TextBlock Text="Modified :" Grid.Row="3" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
-                <TextBlock Text="Modified By :" Grid.Row="4" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
-                <TextBlock Text="Version :" Grid.Row="5" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
-                <TextBlock x:Name="Kind" Text="application/pdf" Grid.Row="0" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
-                <TextBlock x:Name="Size" Text="345 KB (345,332 bytes)" Grid.Row="1" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
-                <TextBlock x:Name="Where" Text="pithos/somefile.pdf" Grid.Row="2" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
-                <TextBlock x:Name="Modified" Text="28/10/2011 11:34 AM" Grid.Row="3" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
-                <TextBlock x:Name="ModifiedBy" Text="SomeUser" Grid.Row="4" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
-                <TextBlock x:Name="Version" Text="2345456" Grid.Row="5" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
-            </Grid>
-        </GroupBox>
-        <GroupBox Header="Metadata" Grid.Row="2" >
-                <DataGrid ItemsSource="{Binding Tags}" x:Name="Tags"
-                    AutoGenerateColumns="False" CanUserAddRows="True" >
-                    <DataGrid.Columns>                        
-                        <DataGridTemplateColumn >
-                            <DataGridTemplateColumn.CellTemplate>
-                                <DataTemplate>
-                                    <Button Content=" - " Command="DataGrid.DeleteCommand"/>
-                                </DataTemplate>
-                            </DataGridTemplateColumn.CellTemplate>
-                        </DataGridTemplateColumn>
-                        <DataGridTextColumn Binding="{Binding Name}" Header="Key" />
-                        <DataGridTextColumn Binding="{Binding Value}" Header="Value"  />                    
-                    </DataGrid.Columns>
-                </DataGrid>
-        </GroupBox>
-        <GroupBox Header="Public &amp; Permissions" Grid.Row="3" >
-            <StackPanel>
-                <TextBlock Margin="5" Visibility="{Binding Path=IsPublic,FallbackValue=false, Converter={StaticResource BoolToVisible}}">
-                    <Run Text="Public URL:" />
-                    <Run Text="{Binding PublicUrl,FallbackValue='http://someurl'}" />
-                </TextBlock>
-
-                <CheckBox x:Name="IsPublic" Content="Public" Margin="65,5,5,5"/>
-                <DataGrid ItemsSource="{Binding Permissions}" 
-                    AutoGenerateColumns="False" CanUserAddRows="True">
-                    <DataGrid.Columns>
-                        <DataGridTemplateColumn >
-                            <DataGridTemplateColumn.CellTemplate>
-                                <DataTemplate>
-                                    <Button Content=" - " 
-                                cal:Message.Attach="RemoveTag($dataContext)" />
-                                </DataTemplate>
-                            </DataGridTemplateColumn.CellTemplate>
-                        </DataGridTemplateColumn>
-                        <DataGridTextColumn Binding="{Binding UserName}" Header="Name" />
-                        <DataGridCheckBoxColumn Binding="{Binding Read}" Header="Read"/>
-                        <DataGridCheckBoxColumn Binding="{Binding Write}" Header="Write"/>                                           
-                    </DataGrid.Columns>
-                </DataGrid>
-            </StackPanel>
-        </GroupBox>
-        <GroupBox Header="General" Grid.Row="4">
-            <Grid>
-                <Grid.Resources>
-                    <Style x:Key="NameColumnStyle" TargetType="TextBlock">
-                        <Setter Property="HorizontalAlignment" Value="Right"/>
-                        <Setter Property="Margin" Value="5,2"/>
-                    </Style>
-                    <Style x:Key="ValueColumnStyle" TargetType="TextBox">
-                        <Setter Property="HorizontalAlignment" Value="Stretch"/>
-                        <Setter Property="VerticalAlignment" Value="Top"/>
-                        <Setter Property="Margin" Value="5,2"/>
-                    </Style>
-                </Grid.Resources>
-                <Grid.ColumnDefinitions>
-                    <ColumnDefinition Width="Auto" />
-                    <ColumnDefinition Width="*"/>
-                </Grid.ColumnDefinitions>
-                <Grid.RowDefinitions>
-                    <RowDefinition Height="Auto"/>
+        <TabControl Grid.Row="1">
+            <TabItem Header="General">
+                <Grid>
+                    <Grid.Resources>
+                        <Style x:Key="NameColumnStyle" TargetType="TextBlock">
+                            <Setter Property="HorizontalAlignment" Value="Right"/>
+                            <Setter Property="Margin" Value="5,2"/>
+                        </Style>
+                        <Style x:Key="ValueColumnStyle" TargetType="TextBlock">
+                            <Setter Property="HorizontalAlignment" Value="Left"/>
+                            <Setter Property="Margin" Value="5,2"/>
+                        </Style>
+                    </Grid.Resources>
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition Width="Auto" />
+                        <ColumnDefinition Width="*"/>
+                    </Grid.ColumnDefinitions>
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="Auto"/>
+                        <RowDefinition Height="Auto"/>
+                        <RowDefinition Height="Auto"/>
+                        <RowDefinition Height="Auto"/>
                     <RowDefinition Height="Auto"/>
                     <RowDefinition Height="Auto"/>
-                </Grid.RowDefinitions>
-                <TextBlock Text="Content Encoding :" Grid.Row="0" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
-                <TextBlock Text="Content Disposition :" Grid.Row="1" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
-                <TextBlock Text="Manifest :" Grid.Row="2" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
-                <TextBox x:Name="ContentEncoding" Text="text/utf8" Grid.Row="0" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
-                <TextBox x:Name="ContentDisposition" Grid.Row="1" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
-                <TextBox x:Name="Manifest" Grid.Row="2" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
-            </Grid>
-        </GroupBox>
-        <StackPanel Orientation="Horizontal" Grid.Row="5" HorizontalAlignment="Right">
+                    </Grid.RowDefinitions>
+                    <TextBlock Text="Kind :" Grid.Row="0" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
+                    <TextBlock Text="Size :" Grid.Row="1" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
+                    <TextBlock Text="Where :" Grid.Row="2" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
+                    <TextBlock Text="Modified :" Grid.Row="3" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
+                    <TextBlock Text="Modified By :" Grid.Row="4" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
+                    <TextBlock Text="Version :" Grid.Row="5" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
+                    <TextBlock x:Name="Kind" Text="application/pdf" Grid.Row="0" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
+                    <TextBlock x:Name="Size" Text="345 KB (345,332 bytes)" Grid.Row="1" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
+                    <TextBlock x:Name="Where" Text="pithos/somefile.pdf" Grid.Row="2" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
+                    <TextBlock x:Name="Modified" Text="28/10/2011 11:34 AM" Grid.Row="3" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
+                    <TextBlock x:Name="ModifiedBy" Text="SomeUser" Grid.Row="4" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
+                    <TextBlock x:Name="Version" Text="2345456" Grid.Row="5" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
+                </Grid>
+            </TabItem>
+            <TabItem Header="Metadata">
+                    <DataGrid ItemsSource="{Binding Tags}" x:Name="Tags"
+                    AutoGenerateColumns="False" CanUserAddRows="True" >
+                        <DataGrid.Columns>
+                            <DataGridTemplateColumn >
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <Button Content=" - " Command="DataGrid.DeleteCommand"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+                            <DataGridTextColumn Binding="{Binding Name}" Header="Key" />
+                            <DataGridTextColumn Binding="{Binding Value}" Header="Value"  />
+                        </DataGrid.Columns>
+                    </DataGrid>
+            </TabItem>
+            <TabItem Header="Permissions">
+                <StackPanel>
+                    <TextBlock Margin="5" Visibility="{Binding Path=IsPublic,FallbackValue=false, Converter={StaticResource BoolToVisible}}">
+                <Run Text="Public URL:" />
+                <Run Text="{Binding PublicUrl,FallbackValue='http://someurl'}" />
+                    </TextBlock>
+                    <CheckBox x:Name="IsPublic" Content="Public" Margin="5"/>
+                    <DataGrid ItemsSource="{Binding Permissions}" 
+                AutoGenerateColumns="False" CanUserAddRows="True">
+                        <DataGrid.Columns>
+                            <DataGridTemplateColumn >
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <Button Content=" - " Command="DataGrid.DeleteCommand"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+                            <DataGridTextColumn Binding="{Binding UserName}" Header="Name"  />
+                            <DataGridCheckBoxColumn Binding="{Binding Read}" Header="Read"/>
+                            <DataGridCheckBoxColumn Binding="{Binding Write}" Header="Write"/>
+                        </DataGrid.Columns>
+                    </DataGrid>
+                </StackPanel>
+            </TabItem>
+            <TabItem Header="Other">
+                    <Grid>
+                        <Grid.Resources>
+                            <Style x:Key="NameColumnStyle" TargetType="TextBlock">
+                                <Setter Property="HorizontalAlignment" Value="Right"/>
+                                <Setter Property="Margin" Value="5,2"/>
+                            </Style>
+                            <Style x:Key="ValueColumnStyle" TargetType="TextBox">
+                                <Setter Property="HorizontalAlignment" Value="Stretch"/>
+                                <Setter Property="VerticalAlignment" Value="Top"/>
+                                <Setter Property="Margin" Value="5,2"/>
+                            </Style>
+                        </Grid.Resources>
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition Width="Auto" />
+                            <ColumnDefinition Width="*"/>
+                        </Grid.ColumnDefinitions>
+                        <Grid.RowDefinitions>
+                            <RowDefinition Height="Auto"/>
+                            <RowDefinition Height="Auto"/>
+                            <RowDefinition Height="Auto"/>
+                        </Grid.RowDefinitions>
+                        <TextBlock Text="Content Encoding :" Grid.Row="0" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
+                        <TextBlock Text="Content Disposition :" Grid.Row="1" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
+                        <TextBlock Text="Manifest :" Grid.Row="2" Grid.Column="0" Style="{StaticResource ResourceKey=NameColumnStyle}"/>
+                        <TextBox x:Name="ContentEncoding" Text="text/utf8" Grid.Row="0" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
+                        <TextBox x:Name="ContentDisposition" Grid.Row="1" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
+                        <TextBox x:Name="Manifest" Grid.Row="2" Grid.Column="1" Style="{StaticResource ResourceKey=ValueColumnStyle}"/>
+                    </Grid>
+            </TabItem>
+        </TabControl>
+        <StackPanel Orientation="Horizontal" Grid.Row="2" HorizontalAlignment="Right">
             <Button Name="SaveChanges" Content="OK" Margin="5,5,10,5" Style="{StaticResource ButtonStyle}" IsDefault="False" />
             <Button Name="RejectChanges" Content="Cancel" Margin="5,5,10,5" Style="{StaticResource ButtonStyle}" IsCancel="True" />
             <Button Name="ApplyChanges" Content="Apply" Style="{StaticResource ButtonStyle}" />
index a1c1253..82d99b2 100644 (file)
@@ -167,8 +167,8 @@ namespace Pithos.Client.WPF
                 ContentEncoding = value.ContentEncoding;
                 Manifest = value.Manifest;
                 IsPublic = value.IsPublic;
-                
-                PublicUrl = String.Format("{0}/v1{1}", Settings.Default.PithosSite ,value.PublicUrl);
+                if (IsPublic)
+                    PublicUrl = String.Format("{0}/v1{1}", Settings.Default.PithosSite ,value.PublicUrl);
 
                 using (var icon = Icon.ExtractAssociatedIcon(LocalFileName))
                 {
index a75b603..ebe17d5 100644 (file)
@@ -47,10 +47,22 @@ namespace Pithos.Client.WPF
             UserName = userName;
             Read = (string.Compare(permission, "read", true) == 0);
             Write= (string.Compare(permission, "write", true) == 0);
-            Value = permission;
+            //Value = permission;
         }
 
-        public string Value { get; private set; }
+        
+        public string Value
+        {
+            get
+            {
+                if (Write)
+                    return "write";
+                if (Read)
+                    return "read";
+                return null;
+            }
+            
+        }
 
         public Permission()
         {
index 63793bc..fb320d1 100644 (file)
@@ -94,7 +94,7 @@ namespace Pithos.Interfaces
             set
             {
                 if (!value)
-                    PublicUrl = "false";
+                    PublicUrl = null;
                 else if (String.IsNullOrWhiteSpace(PublicUrl))
                     PublicUrl="true";                
             }
@@ -206,13 +206,30 @@ namespace Pithos.Interfaces
         public string GetPermissionString()
         {
             var permissionBuilder = new StringBuilder();
-            var groupings = Permissions.GroupBy(pair => pair.Value);
+            var groupings = Permissions.GroupBy(pair => pair.Value, pair => pair.Key);
             foreach (var grouping in groupings)
             {
-                permissionBuilder.AppendFormat("{0}={1}", grouping.Key, String.Join(",", grouping));
+                permissionBuilder.AppendFormat("{0}={1};", grouping.Key, String.Join(",", grouping));
             }
-            var permissions = permissionBuilder.ToString();
+            var permissions = permissionBuilder.ToString().Trim(';');
             return permissions;
         }
+
+        public void SetPermissions(string permissions)
+        {
+            var permDict=new Dictionary<string, string>();
+            var perms=permissions.Split(';');
+            foreach (var perm in perms)
+            {
+                var permPairs=perm.Split('=');
+                var right = permPairs[0];
+                var users= permPairs[1].Split(new[]{','},StringSplitOptions.RemoveEmptyEntries);
+                foreach (var user in users)
+                {
+                    permDict[user] = right;
+                }
+            }
+            Permissions = permDict;
+        }
     }
 }
\ No newline at end of file
index 9da2d0c..72a0253 100644 (file)
@@ -64,5 +64,37 @@ namespace Pithos.Network.Test
             Assert.IsNotEmpty(info.Tags);
 
         }
+
+        [Test]
+        public void TestGetPermissions()
+        {
+            ObjectInfo objectInfo=new ObjectInfo();
+            objectInfo.Permissions["user1"] = "read";
+            objectInfo.Permissions["user2"] = "write";
+
+            var permissionString = objectInfo.GetPermissionString();
+
+            Assert.IsNotNullOrEmpty(permissionString);
+            Assert.AreEqual("read=user1;write=user2",permissionString);
+        }
+
+        [Test]
+        public void TestSetPermissions()
+        {
+            var objectInfo=new ObjectInfo();
+
+            var permissionString = "read=user1;write=user2,user3@somehost.gr";
+            
+            objectInfo.SetPermissions(permissionString);
+            
+            Assert.AreEqual(3,objectInfo.Permissions.Count);
+            Assert.IsTrue(objectInfo.Permissions.ContainsKey("user1"));
+            Assert.IsTrue(objectInfo.Permissions.ContainsKey("user2"));
+            Assert.IsTrue(objectInfo.Permissions.ContainsKey("user3@somehost.gr"));
+            Assert.IsTrue(objectInfo.Permissions["user1"]=="read");
+            Assert.IsTrue(objectInfo.Permissions["user2"]=="write");
+            Assert.IsTrue(objectInfo.Permissions["user3@somehost.gr"]=="write");
+
+        }
     }
 }
index 69bb5f8..6112caf 100644 (file)
@@ -434,7 +434,8 @@ namespace Pithos.Network
                     client.SetNonEmptyHeaderValue("Content-Disposition",objectInfo.ContendDisposition);
                     client.SetNonEmptyHeaderValue("Content-Encoding",objectInfo.ContentEncoding);
                     client.SetNonEmptyHeaderValue("X-Object-Manifest",objectInfo.Manifest);
-                    client.SetNonEmptyHeaderValue("X-Object-Public", objectInfo.PublicUrl);
+                    var isPublic = objectInfo.IsPublic.ToString().ToLower();
+                    client.Headers.Add("X-Object-Public", isPublic);
 
 
                     var uriBuilder = client.GetAddressBuilder(objectInfo.Container, objectInfo.Name);
@@ -639,6 +640,8 @@ namespace Pithos.Network
                                                   where key.StartsWith("X-Object-") && !key.StartsWith("X-Object-Meta-")
                                                   select new {Name = key, Value = client.ResponseHeaders[key]})
                                     .ToDictionary(t => t.Name, t => t.Value);
+
+                                var permissions=client.GetHeaderValue("X-Object-Sharing", false);
                                 
                                 
                                 var info = new ObjectInfo
@@ -655,8 +658,9 @@ namespace Pithos.Network
                                                    ContentEncoding=client.GetHeaderValue("Content-Encoding",true),
                                                    ContendDisposition = client.GetHeaderValue("Content-Disposition",true),
                                                    Manifest=client.GetHeaderValue("X-Object-Manifest",true),
-                                                   PublicUrl=client.GetHeaderValue("X-Object-Public",true)
+                                                   PublicUrl=client.GetHeaderValue("X-Object-Public",true),                                                   
                                                };
+                                info.SetPermissions(permissions);
                                 return info;
                             case HttpStatusCode.NotFound:
                                 return ObjectInfo.Empty;