Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

import uuid 

 

from keystone.common import controller 

from keystone.common import dependency 

from keystone.common import logging 

from keystone import config 

from keystone import exception 

from keystone import identity 

from keystone.openstack.common import timeutils 

 

 

LOG = logging.getLogger(__name__) 

CONF = config.CONF 

 

 

def _trustor_only(context, trust, user_id): 

18    if user_id != trust.get('trustor_user_id'): 

        raise exception.Forbidden() 

 

 

def _admin_trustor_trustee_only(context, trust, user_id): 

25    if (user_id != trust.get('trustor_user_id') and 

            user_id != trust.get('trustor_user_id') and 

            context['is_admin']): 

                raise exception.Forbidden() 

 

 

def _admin_trustor_only(context, trust, user_id): 

30    if user_id != trust.get('trustor_user_id') and not context['is_admin']: 

        raise exception.Forbidden() 

 

 

@dependency.requires('identity_api', 'trust_api', 'token_api') 

class TrustV3(controller.V3Controller): 

    collection_name = "trusts" 

    member_name = "trust" 

 

    def _get_user_id(self, context): 

44        if 'token_id' in context: 

            token_id = context['token_id'] 

            token = self.token_api.get_token(context, token_id) 

            user_id = token['user']['id'] 

            return user_id 

        return None 

 

    def get_trust(self, context, trust_id): 

        user_id = self._get_user_id(context) 

        trust = self.trust_api.get_trust(context, trust_id) 

        if not trust: 

            raise exception.TrustNotFound(trust_id) 

        _admin_trustor_trustee_only(context, trust, user_id) 

53        if not trust: 

            raise exception.TrustNotFound(trust_id=trust_id) 

56        if (user_id != trust['trustor_user_id'] and 

                user_id != trust['trustee_user_id']): 

            raise exception.Forbidden() 

        self._fill_in_roles(context, trust, 

                            self.identity_api.list_roles(context)) 

        return TrustV3.wrap_member(context, trust) 

 

    def _fill_in_roles(self, context, trust, global_roles): 

        if trust.get('expires_at') is not None: 

            trust['expires_at'] = (timeutils.isotime 

                                   (trust['expires_at'], 

                                    subsecond=True)) 

 

68        if 'roles' not in trust: 

            trust['roles'] = [] 

        trust_full_roles = [] 

        for trust_role in trust['roles']: 

72            if isinstance(trust_role, basestring): 

                trust_role = {'id': trust_role} 

            matching_roles = [x for x in global_roles 

                              if x['id'] == trust_role['id']] 

70            if matching_roles: 

                full_role = identity.controllers.RoleV3.wrap_member( 

                    context, matching_roles[0])['role'] 

                trust_full_roles.append(full_role) 

        trust['roles'] = trust_full_roles 

        trust['roles_links'] = { 

            'self': (CONF.public_endpoint % CONF + 

                     "trusts/%s/roles" % trust['id']), 

            'next': None, 

            'previous': None} 

 

    def _clean_role_list(self, context, trust, global_roles): 

        trust_roles = [] 

        global_role_names = dict((r['name'], r) 

                                 for r in 

                                 global_roles) 

        for role in trust.get('roles', []): 

            if 'id' in role: 

                trust_roles.append({'id': role['id']}) 

103            elif 'name' in role: 

                rolename = role['name'] 

                if rolename in global_role_names: 

                    trust_roles.append({'id': 

                                        global_role_names[rolename]['id']}) 

                else: 

                    raise exception.RoleNotFound("role %s is not defined" % 

                                                 rolename) 

            else: 

                raise exception.ValidationError(attribute='id or name', 

                                                target='roles') 

        return trust_roles 

 

    @controller.protected 

    def create_trust(self, context, trust=None): 

        """Create a new trust. 

 

        The user creating the trust must be the trustor. 

 

        """ 

 

        # TODO(ayoung): instead of raising ValidationError on the first 

        # problem, return a collection of all the problems. 

118        if not trust: 

            raise exception.ValidationError(attribute='trust', 

                                            target='request') 

        try: 

            user_id = self._get_user_id(context) 

            _trustor_only(context, trust, user_id) 

            #confirm that the trustee exists 

            trustee_ref = self.identity_api.get_user(context, 

                                                     trust['trustee_user_id']) 

127            if not trustee_ref: 

                raise exception.UserNotFound(user_id=trust['trustee_user_id']) 

            global_roles = self.identity_api.list_roles(context) 

            clean_roles = self._clean_role_list(context, trust, global_roles) 

            if trust.get('project_id'): 

                user_roles = self.identity_api.get_roles_for_user_and_project( 

                    context, user_id, trust['project_id']) 

            else: 

                user_roles = [] 

            for trust_role in clean_roles: 

                matching_roles = [x for x in user_roles 

                                  if x == trust_role['id']] 

                if not matching_roles: 

                    raise exception.RoleNotFound(role_id=trust_role['id']) 

            if trust.get('expires_at') is not None: 

142                if not trust['expires_at'].endswith('Z'): 

                    trust['expires_at'] += 'Z' 

                trust['expires_at'] = (timeutils.parse_isotime 

                                       (trust['expires_at'])) 

            new_trust = self.trust_api.create_trust( 

                context=context, 

                trust_id=uuid.uuid4().hex, 

                trust=trust, 

                roles=clean_roles) 

            self._fill_in_roles(context, 

                                new_trust, 

                                global_roles) 

            return TrustV3.wrap_member(context, new_trust) 

        except KeyError as e: 

            raise exception.ValidationError(attribute=e.args[0], 

                                            target='trust') 

 

    @controller.protected 

    def list_trusts(self, context): 

        query = context['query_string'] 

        trusts = [] 

        if not query: 

            self.assert_admin(context) 

            trusts += self.trust_api.list_trusts(context) 

        if 'trustor_user_id' in query: 

            user_id = query['trustor_user_id'] 

            calling_user_id = self._get_user_id(context) 

169            if user_id != calling_user_id: 

                raise exception.Forbidden() 

            trusts += (self.trust_api. 

                       list_trusts_for_trustor(context, user_id)) 

        if 'trustee_user_id' in query: 

            user_id = query['trustee_user_id'] 

            calling_user_id = self._get_user_id(context) 

176            if user_id != calling_user_id: 

                raise exception.Forbidden() 

            trusts += (self.trust_api. 

                       list_trusts_for_trustee(context, user_id)) 

        global_roles = self.identity_api.list_roles(context) 

        for trust in trusts: 

            self._fill_in_roles(context, trust, global_roles) 

        return TrustV3.wrap_collection(context, trusts) 

 

    @controller.protected 

    def delete_trust(self, context, trust_id): 

        trust = self.trust_api.get_trust(context, trust_id) 

188        if not trust: 

            raise exception.TrustNotFound(trust_id) 

 

        user_id = self._get_user_id(context) 

        _admin_trustor_only(context, trust, user_id) 

        self.trust_api.delete_trust(context, trust_id) 

        userid = trust['trustor_user_id'] 

        token_list = self.token_api.list_tokens(context, 

                                                userid, 

                                                trust_id=trust_id) 

        for token in token_list: 

            self.token_api.delete_token(context, token) 

 

    @controller.protected 

    def list_roles_for_trust(self, context, trust_id): 

        trust = self.get_trust(context, trust_id)['trust'] 

204        if not trust: 

            raise exception.TrustNotFound(trust_id) 

        user_id = self._get_user_id(context) 

        _admin_trustor_trustee_only(context, trust, user_id) 

        return {'roles': trust['roles'], 

                'links': trust['roles_links']} 

 

    @controller.protected 

    def check_role_for_trust(self, context, trust_id, role_id): 

        """Checks if a role has been assigned to a trust.""" 

        trust = self.trust_api.get_trust(context, trust_id) 

215        if not trust: 

            raise exception.TrustNotFound(trust_id) 

        user_id = self._get_user_id(context) 

        _admin_trustor_trustee_only(context, trust, user_id) 

        matching_roles = [x for x in trust['roles'] 

                          if x['id'] == role_id] 

221        if not matching_roles: 

            raise exception.RoleNotFound(role_id=role_id) 

 

    @controller.protected 

    def get_role_for_trust(self, context, trust_id, role_id): 

        """Checks if a role has been assigned to a trust.""" 

        trust = self.trust_api.get_trust(context, trust_id) 

228        if not trust: 

            raise exception.TrustNotFound(trust_id) 

 

        user_id = self._get_user_id(context) 

        _admin_trustor_trustee_only(context, trust, user_id) 

        matching_roles = [x for x in trust['roles'] 

                          if x['id'] == role_id] 

235        if not matching_roles: 

            raise exception.RoleNotFound(role_id=role_id) 

        global_roles = self.identity_api.list_roles(context) 

        matching_roles = [x for x in global_roles 

                          if x['id'] == role_id] 

244        if matching_roles: 

            full_role = (identity.controllers. 

                         RoleV3.wrap_member(context, matching_roles[0])) 

            return full_role 

        else: 

            raise exception.RoleNotFound(role_id=role_id)